musl 库 简介
- musl是在 Linux 系统调用 API 之上构建的 C 标准库的实现,包括基础语言标准、POSIX 和广泛认可的扩展中定义的接口。musl轻量、快速、简单、免费,并力求在标准一致性和安全性方面做到正确。
- 提供从微型嵌入式系统到成熟服务器的一致质量和实施行为。最小机器特定代码意味着在少数架构上发生故障的可能性更小,并且“一次编写,随处运行”的 C 开发更成功。
- musl 的效率在 Linux libc 实现中无与伦比。musl 从一开始就为静态链接而设计,小心避免引入应用程序不会使用的大量代码或数据。动态链接也很高效;通过将整个标准库实现(包括线程、数学,甚至动态链接器本身)集成到单个共享对象中,动态链接的大部分启动时间和内存开销已被消除。
- musl 是 Linux 上第一个 POSIX 线程的后 NPTL 实现,也是第一个以完全一致性和稳健性为目标的实现。线程取消功能已重新设计,以避免原始 NPTL 设计中出现严重的竞争条件。至于效率,整个线程实现的重量约为 10-20k,具体取决于目标架构和编译器设置。
- 不仅是线程实现,musl 中的所有代码都经过了实时质量稳健性设计。内存不足或资源耗尽的情况绝不会致命。musl 没有不必要的动态分配,也没有无法恢复的后期故障。所有错误情况都可以由应用程序检测和处理;应用程序无法合理处理故障的接口不会失败。
- 使用 musl 可最大程度地提高应用程序的可部署性。其宽松的 MIT 许可证与所有 FOSS 许可证兼容,支持静态链接,并且商业使用也毫不费力。使用 musl 静态链接的二进制文件没有外部依赖项,即使是使用 glibc 上的动态加载实现的 DNS 查找或字符集转换等功能也是如此。应用程序实际上可以部署为单个二进制文件,并在具有适当指令集架构和 Linux 内核或 Linux 系统调用 ABI 模拟层的任何机器上运行。
- 最后,musl 具有简单的源代码和源树布局,因此可以轻松自定义或追踪意外行为或错误的原因,或者只是了解库的工作原理。
如何使用 musl 库
在已建立的应用程序二进制生态系统中,C 库是最难交换和替换的组件之一。一切都取决于它提供的接口。musl 的设计简单而高效,无论是作为系统范围的 libc 还是用于制作强大的静态链接应用程序的工具。
musl 开发和用户社区致力于支持三种主要的 musl 使用方式:
- 1.使用musl-gcc 包装器,制作易于部署的静态链接或最少动态链接程序。
musl 通过快速、非侵入式的构建过程以及用于重用主机上现有 GCC 工具链的包装脚本使这种使用变得简单。
- 2.作为基于musl 的 Linux 发行版或迷你发行版中的系统范围 libc 。它们大多采用基于Linux From Scratch原则的基于源代码的构建系统的形式,并添加了新的包管理工具。
- 3.作为构建您自己的系统的基础。项目可能性包括:
多媒体设备、路由器/防火墙、VoIP 设备、救援磁盘
移动电话亭、轻型桌面系统
musl-gcc 包装器脚本、具有开发环境的完整基于 musl 的主机系统或musl 交叉编译器可用于引导基于 musl 的新系统。
编译 musl 库和使用实践记录
下载和编译 musl 库
wget https://musl.libc.org/releases/musl-1.2.5.tar.gz tar xf musl-1.2.5.tar.gz cd musl-1.2.5/ ./configure && make install
看到如下文字信息就是编译和安装完成了
printf '#!/bin/sh\nexec "${REALGCC:-gcc}" "$@" -specs "%s/musl-gcc.specs"\n' "/usr/local/musl/lib" > obj/musl-gcc chmod +x obj/musl-gcc ./tools/install.sh -D obj/musl-gcc /usr/local/musl/bin/musl-gcc
- 实际使用前,需要把
musl-gcc
复制到/usr/bin
musl-gcc
编译文件极小,静态编译的 HelloWorld
程序
cp /usr/local/musl/bin/musl-gcc /usr/bin/musl-gcc
cat <<EOF > hello.c
> #include <stdio.h>
int main(int argc, char **argv)
{ printf("hello %d\n", argc); }
EOF
musl-gcc -static -Os hello.c
./a.out
hello 1
size a.out
text data bss dec hex filename
23902 440 1600 25942 6556 a.out