尝试用 clang 静态链接 libc,ldd 显示动态链接?

问题描述 投票:0回答:1

我想编译一个带有静态链接的系统库(例如 libc)和动态链接的所有其他自定义库(例如 openssl)的 C 程序。当我在 Ubuntu 20.04 上使用 clang 10.0.0-4ubuntu1 用 C 语言编译“Hello World”程序时,我希望看到 libc 静态链接,但它是动态链接的,并且链接器也添加了 libgcc_s:

$ clang /lib/x86_64-linux-gnu/libc.a main.c -o main
$ ldd main
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
    /lib64/ld-linux-x86-64-so.2

尝试不同的建议会产生相同的结果:

$ clang -Wl,-Bstatic -lc -Wl,-Bdynamic main.c -o main
$ ldd main
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
    /lib64/ld-linux-x86-64-so.2

在不尝试静态链接 libc 的情况下进行编译会产生相同的结果,只是没有链接 libgcc_s.so.1 :

$ clang main.c -o main
$ ldd main
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
    /lib64/ld-linux-x86-64-so.2

现在,研究表明我正在使用的 glibc 不应该静态链接——显然 musl 更适合这一点。但是上述行为是否符合预期,静态链接 libc 但显示动态链接,同时还添加了 libgcc_s?事实上,无论推荐如何,都可以静态链接 glibc 吗?

c clang static-linking dynamic-linking libc
1个回答
0
投票

因为

glibc
严重依赖动态链接和其他动态链接组件,所以它是为动态链接而设计的。当您静态链接
glibc
时,并不意味着整个
libc
都嵌入到您的二进制文件中。我建议您可以研究其他方法,例如使用另一种 libc 实现,如 musl,将共享库与您的应用程序捆绑在一起,或者使用 Docker 和其他容器技术来确保一致的运行时环境。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.