C标准函数库-musl libc


Musl是一种C标准函数库,主要使用于以Linux内核(v2.6+)为主的操作系统上,目标为嵌入式系统与移动设备,于2011年2月中旬首发,采用MIT许可证发布。作者为瑞奇·费尔克(Rich Felker)。开发此库的目的是写一份干净、高效、符合标准的C标准库。

musl is an implementation of the C standard library built on top of the Linux system call API, including interfaces defined in the base language standard, POSIX, and widely agreed-upon extensions. musl is lightweight, fast, simple, free, and strives to be correct in the sense of standards-conformance and safety.
Musl是从零开始设计的。一是希望让静态链接更高效;二是现有的C标准库在一些极端条件下表现很糟糕,竞态条件、资源不足时常常会出问题,而Musl试图避免它们来达到较高的实时强健性。Musl的动态运行时只有一个文件,有稳定的ABI,因此可以实现无竞态的版本升级。对静态链接的支持也让可移植单文件应用部署成为可能,而且不会使文件体积膨胀很多。
Musl声称与POSIX 2008标准和C11标准兼容,还实现了多数广泛使用但非标准的Linux、BSD和glibc函数。
一些Linux发行版可以使用Musl作为标准C库,例如Alpine、Dragora 3、Gentoo、OpenWrt、Sabotage、Morpheus、Void。对于链接到glibc的二进制程序,gcompat能让其在基于Musl的发行版上运行。
对比 glibc 库的部分优点
它是一个专门为嵌入式系统开发的轻量级 libc 库,以简单、轻量和高效为特色;
musl 要小得多,因为 musl libc 专注于尽可能减少代码大小和函数调用开销,以提高性能;
musl 库的源码相对简单,封装性不强,不像 glibc 的代码一样臃肿,复杂;
musl 是 C 语言的一种标准函数库,代码干净且高效,针对静态连接(static linking)设计,适合被用来制作可携的程序,且也很容易进行交叉编译(cross compile),编译出运行在不同系统环境的程序。
对比 glibc 库的部分缺点
POSIX 标准:musl libc 更加严格地遵循 POSIX 标准,而 glibc 则添加了一些扩展,以提供更多的功能和兼容性。
错误处理:musl libc 实现的错误处理更严格和更规范,而 glibc 则有更多的错误处理选项,并且支持不同的语言环境。
如果需要一个小巧且速度较快的 C 标准库在 Linux 系统上使用,则可以考虑使用 musl libc;如果要开发的某个功能的可执行程序需要在不同系统环境下运行,则 musl libc 可满足需求;如果想一次编译出可以在相同 CPU 架构的 Linux 发行版上都运行的程序,musl 库将是最优的选择,因为基于 glibc 库已编译好的函数库和运行档在不同的 Linux 上可能会出现无法共用的情况,。以 musl 为标准库编译的镜像在虚拟内存占用、物理内存占用、系统可回收内存方面都是远优于 glibc。
目前基于 musl 库编译的镜像在性能和功能方面还是有很大的提升空间。在性能方面,musl 库中 malloc 系列函数和 memcpy 系列函数实现较慢,尤其是 malloc 的性能,在多线程环境下会显著造成瓶颈,原因在于 musl 的 malloc 实现在每次 malloc 时都需要对全局变量加锁解锁并导致严重的竞争现象,后续也需要在类似这方面上进行优化以便提高性能等;在功能方面,musl 在字符集/编码方面的支持没有 glibc 全面;在错误处理方面,glibc 有更多的错误处理选项,并且支持不同的语言环境;POSIX 标准方面,glibc 添加了一些扩展,以提供更多的功能和兼容性等等,musl 库在不影响性能等前提下,在这上述能方面进行功能上的填充还是有很大的发掘空间的。
最新版本:1
v1.2.3于2022年4月上旬发布。
项目主页:https://musl.libc.org/

musl is an implementation of the C standard library built on top of the Linux system call API, including interfaces defined in the base language standard, POSIX, and widely agreed-upon extensions. musl is lightweight, fast, simple, free, and strives to be correct in the sense of standards-conformance and safety.
Musl是从零开始设计的。一是希望让静态链接更高效;二是现有的C标准库在一些极端条件下表现很糟糕,竞态条件、资源不足时常常会出问题,而Musl试图避免它们来达到较高的实时强健性。Musl的动态运行时只有一个文件,有稳定的ABI,因此可以实现无竞态的版本升级。对静态链接的支持也让可移植单文件应用部署成为可能,而且不会使文件体积膨胀很多。
Musl声称与POSIX 2008标准和C11标准兼容,还实现了多数广泛使用但非标准的Linux、BSD和glibc函数。
一些Linux发行版可以使用Musl作为标准C库,例如Alpine、Dragora 3、Gentoo、OpenWrt、Sabotage、Morpheus、Void。对于链接到glibc的二进制程序,gcompat能让其在基于Musl的发行版上运行。
对比 glibc 库的部分优点
它是一个专门为嵌入式系统开发的轻量级 libc 库,以简单、轻量和高效为特色;
musl 要小得多,因为 musl libc 专注于尽可能减少代码大小和函数调用开销,以提高性能;
musl 库的源码相对简单,封装性不强,不像 glibc 的代码一样臃肿,复杂;
musl 是 C 语言的一种标准函数库,代码干净且高效,针对静态连接(static linking)设计,适合被用来制作可携的程序,且也很容易进行交叉编译(cross compile),编译出运行在不同系统环境的程序。
对比 glibc 库的部分缺点
POSIX 标准:musl libc 更加严格地遵循 POSIX 标准,而 glibc 则添加了一些扩展,以提供更多的功能和兼容性。
错误处理:musl libc 实现的错误处理更严格和更规范,而 glibc 则有更多的错误处理选项,并且支持不同的语言环境。
如果需要一个小巧且速度较快的 C 标准库在 Linux 系统上使用,则可以考虑使用 musl libc;如果要开发的某个功能的可执行程序需要在不同系统环境下运行,则 musl libc 可满足需求;如果想一次编译出可以在相同 CPU 架构的 Linux 发行版上都运行的程序,musl 库将是最优的选择,因为基于 glibc 库已编译好的函数库和运行档在不同的 Linux 上可能会出现无法共用的情况,。以 musl 为标准库编译的镜像在虚拟内存占用、物理内存占用、系统可回收内存方面都是远优于 glibc。
目前基于 musl 库编译的镜像在性能和功能方面还是有很大的提升空间。在性能方面,musl 库中 malloc 系列函数和 memcpy 系列函数实现较慢,尤其是 malloc 的性能,在多线程环境下会显著造成瓶颈,原因在于 musl 的 malloc 实现在每次 malloc 时都需要对全局变量加锁解锁并导致严重的竞争现象,后续也需要在类似这方面上进行优化以便提高性能等;在功能方面,musl 在字符集/编码方面的支持没有 glibc 全面;在错误处理方面,glibc 有更多的错误处理选项,并且支持不同的语言环境;POSIX 标准方面,glibc 添加了一些扩展,以提供更多的功能和兼容性等等,musl 库在不影响性能等前提下,在这上述能方面进行功能上的填充还是有很大的发掘空间的。
最新版本:1
v1.2.3于2022年4月上旬发布。
项目主页:https://musl.libc.org/