gpt4 book ai didi

gcc - 静态链接 libc 的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 22:01:07 35 4
gpt4 key购买 nike

我在这里和其他论坛上看到了很多问题,建议使用 -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 本身的编译方式有关吗?

最佳答案

对于那些天真地来这里搜索诸如 static link libc 之类的关键字的人,我正在回答我自己的问题。或者其他的东西。

如果这是针对 MSVC,您唯一的选择是 /MT/MTd .但是如果你是来找GCC的,欢迎来到位置无关的代码兔子洞。

有多种 GCC 变体,它们针对特定目标进行了修补,或者仅仅因为它们可以修补而进行修补。所以,如果你有,比如说 GCC 6.0 版,并期望你的命令行参数产生相同的行为,你可能会成为一些糟糕的补丁工作的受害者。

本问题中的某些版本的 GCC 强制执行位置无关的可执行文件( -fPIE -pie )并默默忽略 -static选项,如本例所示。我想知道这是否应该作为错误报告给 Alpine 维护者。要强制它忽略 PIE,请传递 -no-pie到你的海湾合作委员会。

$  gcc -no-pie -static test.c

如果你这样做
$ file ./a.out
/lib/ld-musl-x86_64.so.1: ./a.out: Not a valid dynamic program

详情如何 fPIEstatic阅读这些 slides来自 OpenBSD。

关于gcc - 静态链接 libc 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59462844/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com