如何编译c程序,使其不依赖于任何库?

时间:2011-08-15 12:19:27

标签: c linux gcc static-linking

似乎即使是一个hello world程序依赖于几个库:

libc.so.6 => /lib64/libc.so.6 (0x00000034f4000000)
/lib64/ld-linux-x86-64.so.2 (0x00000034f3c00000)

如何静态链接所有内容?

2 个答案:

答案 0 :(得分:8)

-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

在我的机器上将一个小测试从~800K减少到~700K,所以减少的确不是那么大。

以前的SO讨论:
Garbage from other linking units
How do I include only used symbols when statically linking with gcc?
Using GCC to find unreachable functions ("dead code")

Update2:如果您满足于仅使用系统调用,则可以使用gcc -ffreestanding -nostartfiles -static来获取非常小的可执行文件。

试试这个文件(small.c):

#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的可执行文件(它仍然有一些应该是可剥离的部分)。如果您想进一步了解this指南。

答案 1 :(得分:1)

或者使用-nostdlib并实现自己的库和启动代码。

各种“汇编程序在* nix”网站上可以让您了解如何操作。

如果您只想让二进制文件变小,请先使用32位。