11
$ printf 'int main(){}' | gcc -static -x c - -o hello
$ scp hello vi-server.org:./
hello                                100%  565KB 565.2KB/s   00:00
$ ssh -t vi-server.org "./hello; uname -r"
FATAL: kernel too old
sh: line 1: 15378 Segmentation fault      ./hello
2.6.18-274....  # can't easily upgrade the kernel
Connection to vi-server.org closed.

如何构建可在旧系统上运行的静态二进制文件?我希望静态二进制文件甚至可以在 2.4 上工作。

4

2 回答 2

13

您需要配置 glibc 以针对较旧的内核版本。根据http://www.gnu.org/software/libc/manual/html_node/Configuring-and-compiling.html glibc 接受配置选项--enable-kernel=versionwhereversion2.4.20针对旧内核版本的形式。

然后,您可以将您的程序与gcc -static -nodefaultlibs [...] /path/to/my/libc.a.

于 2012-06-26T12:18:57.183 回答
1

感谢上面的海报 ecatmur -- 使用配置选项 --enable-kernel=version 重新配置/重建 glibc 确实有效

我将添加以下内容 - 您可以使用 gcc -static -L/path/to/local/lib (目录的大 L 选项),它似乎与链接到库文件本身一样工作。当我以后一种方式链接(到/path/to/local/lib/libc.a)时,它创建了一个不必要的大可执行文件。

于 2012-09-13T05:54:02.900 回答