如何编译c程序,使其不';你不依赖任何图书馆吗?

如何编译c程序,使其不';你不依赖任何图书馆吗?,c,linux,gcc,static-linking,C,Linux,Gcc,Static Linking,甚至hello world程序似乎也依赖于几个库: libc.so.6 => /lib64/libc.so.6 (0x00000034f4000000) /lib64/ld-linux-x86-64.so.2 (0x00000034f3c00000) 如何静态链接所有内容?使用-static链接。在支持动态链接的系统上,这会阻止与共享库的链接 编辑:是,这将增加可执行文件的大小。你可以走两条路,或者按照Marco van de Voort的建议(-nostlib),烘焙你自己的标准库,或

甚至hello world程序似乎也依赖于几个库:

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

如何静态链接所有内容?

使用
-static
链接。在支持动态链接的系统上,这会阻止与共享库的链接

编辑:是,这将增加可执行文件的大小。你可以走两条路,或者按照Marco van de Voort的建议(
-nostlib
),烘焙你自己的标准库,或者找到一个最小的标准库

另一种方法是尝试让GCC尽可能多地删除

gcc  -Wl,--gc-sections -Os -fdata-sections -ffunction-sections -ffunction-sections -static test.c -o test
strip test
在我的机器上,将小测试从~800K减少到~700K,因此减少的幅度并不是很大

先前的SO讨论:


更新2:如果您满足于只使用系统调用,那么可以使用
gcc-ffreestanding-nostartfiles-static
来获取非常小的可执行文件

请尝试此文件(small.c):

#包括
void_start(){
char msg[]=“你好!\n”;
写入(1,msg,sizeof(msg));
_出口(0);
}

编译时使用:
gcc-ffreestanding-nostartfiles-static-o small.c&&strip small
。这将在我的系统上生成一个~5K可执行文件(它仍然有一些应该是可剥离的部分)。如果您想进一步了解指南。

或使用
-nostlib
实现您自己的库和启动代码

各种各样的“汇编程序在*nix上”网站可以给你一个方法


如果您只想让二进制文件变小,那么从使用32位开始。

为什么这对您很重要?任何地方的Linux系统都有一个工作的C库和动态链接器。它们是ABI的一部分。@Henning Makholm,“linux ABI”是在哪里描述的?我指的是ABI,它说
libc.so.6
ld-linux-x86-64.so.2
是它的一部分。你见过没有rootfs的嵌入式linux吗?@osgx:它基本上是非正式的(非正式的ABI仍然是ABI,只是更难确定它是什么),但我认为它是写在FHS中的某个地方。它的大小如此之大,因为它不仅仅包括对共享库中的函数和代码的引用,静态链接的程序实际上包含库及其代码的副本。@James O'Doherty,我如何指示编译器只包含必需的符号?答案中的--gc节和其他节命令应该可以做到这一点。@lexer(1),请尝试阅读(可能还有中的其他内容)。
#include <unistd.h>

void _start() {
    char msg[] = "Hello!\n";
    write(1, msg, sizeof(msg));
    _exit(0);
}