是什么 ? | : | 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. |
官方主页 | : | http://musl.libc.org |
源码仓库 | : | https://git.musl-libc.org/cgit/musl |
支持系统 | : | Linux-based system |
used by | : | AlpineLinux |
操作系统 | 包管理器 | 安装命令 |
---|---|---|
apt | sudo apt-get install -y musl musl-dev | |
Alpine Linux | apk | sudo apk add musl musl-dev |
pacman | sudo pacman -Syyu --noconfirm | |
Gentoo Linux | Portage | sudo emerge musl |
step1、安装依赖
所有时 | Terminal + Shell + GNU CoreUtils |
下载时 | cURL |
解压时 | tar + gzip |
编译时 | gmake、gcc / GCC | Clang / LLVM |
运行时 | linux-vdso.so |
step2、使用curl命令下载glibc
源码包 ()
curl -LO http://musl.libc.org/releases/musl-1.2.0.tar.gz
step3、使用tar解压musl libc
源码包
tar vxf musl-1.2.0.tar.gz
step4、进入musl-1.2.0
目录
cd musl-1.2.0
step5、查看musl-1.2.0
目录中的内容
step7、使用./configure
配置编译参数
./configure
是一个可执行的POSIX sh脚本,用它 配置后会产生config.mak
配置文件,该文件会被Makefile
调用。
./configure
的使用格式如下:
../configure [option]... [VAR=VALUE]...
option | 说明 | |
---|---|---|
--help | 查看../configure 的使用帮助 | |
--prefix=DIR | 指定安装目录。默认为/usr/local/musl | |
--host=HOST | 设置目标程序运行的CPU平台 一般不需要设置,除非你想要 交叉编译 默认与宿主机一样 | |
--enable-FEATURE[=yes|no] | yes: 开启FEATURE no: 关闭FEATURE | |
--enable-static[=yes|no] | 是否生成静态库 | |
--enable-shared[=yes|no] | 是否生成动态库 | |
--enable-warnings[=yes|no] | 是否开启编译器警告 | |
--enable-debug[=yes|no] | 是否带上debug 符号 |
与enable-FEATURE
对应的选项,还有disable-FEATURE
,disable-FEATURE
相当于enable-FEATURE=no
VAR | VALUE示例 | 说明 |
---|---|---|
CC | gcc | clang | 指定C编译器 |
CFLAGS | -O2 -v | 指定C编译器的参数 |
CPP | cpp | 指定C预处理器 |
CPPFLAGS | -I<includeDIR> | 指定C预处理器的参数 |
LDFLAGS | -L<libDIR> | 指定C链接器的参数 |
LIBS | -l<libName> | 指定C链接器要链接的库的名称 |
示例:
./configure --prefix=/usr/local/musl CFLAGS='-O2 -v'
step8、使用make进行编译、安装
make && sudo make install
step1、安装musl libc
step2、编写C源代码main.c
#include <stdio.h>
int main() {
printf("Hello musl libc\n");
return 0;
}
step3、使用clang命令编译
clang main.c \
-static -nostdinc -nostdlib \
-I/usr/include/x86_64-linux-musl \
-L/usr/lib/x86_64-linux-musl \
/usr/lib/x86_64-linux-musl/crt1.o \
/usr/lib/x86_64-linux-musl/crti.o \
/usr/lib/x86_64-linux-musl/crtn.o \
-lc
说明 :
-static
表示链接的库是静态库
,这里要链接libc.a
。
-nostdlib
表示不链接系统的标准库文件,因为他要链接musl-libc
自己实现的标准库文件。/usr/lib/x86_64-linux-musl/crt1.o
、/usr/lib/x86_64-linux-musl/crti.o
、/usr/lib/x86_64-linux-musl/crtn.o
就是musl-libc
自己实现的标准库文件。