gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:03:20 25 4
gpt4 key购买 nike

似乎即使是一个 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

在我的机器上将一个小测试从 ~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")

更新 2:如果您满足于只使用系统调用,您可以使用 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指导。

关于c - 如何编译c程序使其不依赖于任何库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7064805/

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