蘭雅sRGB 个人笔记 https://262235.xyz
提供编程和电脑应用视频教程,工具和源代码
C, C++, Python Programming, Source Code, Video

旧Hexo博客 | Github | IP定位WebAPI | Docker Hub
编程中文文档 | 网盘分享 | 中文Linux命令

C语言学习: linux系统上 轻量简单的 musl C 标准库学习

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

本原创文章自由转载,转载请注明本博来源及网址 | 当前页面:兰雅sRGB个人笔记 » C语言学习: linux系统上 轻量简单的 musl C 标准库学习