【发布时间】:2019-12-24 01:18:57
【问题描述】:
我在这里和其他论坛上看到了很多问题,建议使用 -static 或有时甚至是 -static -static-libgcc 以及编译参数。这在 Alpine 上永远无法运行,但在 Ubuntu 和 Fedora 上运行良好。
我用 C 写了一个简单的 hello-world 程序,然后编译为gcc -static test.c。生成的二进制文件仍然亮着ldd。看,
$ gcc -s test.c -static
$ ldd ./a.out
/lib/ld-musl-x86_64.so.1 (0x7f043eae8000)
$ file ./a.out
./a.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, stripped
在 Ubuntu 上运行同样的节目:
$ gcc -s test.c -static
$ file ./a.out
./a.out: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=bf6bfa1c78c541ae4e81586bcd050923bca9e34a, stripped
在任何平台上静态链接 libc 本身的正确且一致的方法是什么?这是否与 GCC 本身的编译方式有关?
【问题讨论】:
-
看来这个问题是 musl-libc 特有的,你同意吗?也许标题应该相应地修改。
-
@JonathonReinhart 看了答案后,我认为这个问题似乎比 Alpine 或 Ubuntu 更复杂一些。所以我猜标题是正确的。我已经通过示例和解释添加了正确的答案。