即使是一个简单的“Hello World”程序也依赖于多个库:
libc.so.6 => /lib64/libc.so.6 (0x00000034f4000000)
/lib64/ld-linux-x86-64.so.2 (0x00000034f3c00000)
如何进行静态链接所有内容?
即使是一个简单的“Hello World”程序也依赖于多个库:
libc.so.6 => /lib64/libc.so.6 (0x00000034f4000000)
/lib64/ld-linux-x86-64.so.2 (0x00000034f3c00000)
使用-static
参数进行链接。"对于支持动态链接的系统,这可以防止与共享库链接。"
编辑:是的,这会增加可执行文件的大小。你可以选择两种方法,一是像Marco van de Voort建议的那样(-nostdlib
,编写自己的标准库或找到一个最小的标准库)。
另一种方法是尝试让GCC尽可能地删除不需要的内容。
gcc -Wl,--gc-sections -Os -fdata-sections -ffunction-sections -ffunction-sections -static test.c -o test
strip test
gcc -ffreestanding -nostartfiles -static
获得非常小的可执行文件。#include <unistd.h>
void _start() {
char msg[] = "Hello!\n";
write(1, msg, sizeof(msg));
_exit(0);
}
gcc -ffreestanding -nostartfiles -static -o small small.c && strip small
。在我的系统上,这将生成一个大约5K的可执行文件(其中还有一些应该可以剥离的部分)。如果你想更深入地了解,请参考此指南。或者使用 -nostdlib
并实现自己的库和启动代码。
各种“在*nix上汇编”的网站可以给你一个实现的想法。
如果你只是想让你的二进制文件变小,那么从使用32位开始。
libc.so.6
和ld-linux-x86-64.so.2
是其中的一部分。您是否见过没有rootfs的嵌入式Linux? - osgx