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

发布于 2024-11-29 11:57:40 字数 186 浏览 1 评论 0原文

看起来甚至一个 hello world 程序也依赖于几个库:

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

如何静态链接所有东西?

It seems even a hello world program depends on several libraries:

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

How can I static link all stuff ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

纸伞微斜 2024-12-06 11:57:40

使用-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 讨论:
来自其他链接单元的垃圾
如何仅包含使用过的符号与 gcc 静态链接?
使用 GCC 查找无法访问的函数(“死代码”)

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

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

#include <unistd.h>

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

使用以下命令编译:gcc -ffreestand -nostartfiles -static -osmallsmall.c &&剥离小。这会在我的系统上生成一个约 5K 的可执行文件(其中仍然有一些应该可剥离的部分)。如果您想进一步了解指南。

Link with -static. "On systems that support dynamic linking, this prevents linking with the shared libraries."

Edit: Yes this will increase the size of your executable. You can go two routes, either do what Marco van de Voort recommends (-nostdlib, bake your own standard library or find a minimal one).

Another route is to try and get GCC to remove as much as it can.

gcc  -Wl,--gc-sections -Os -fdata-sections -ffunction-sections -ffunction-sections -static test.c -o test
strip test

Reduces a small test from ~800K to ~700K on my machine, so the reduction isn't really that big.

Previous SO discussions:
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: If you are content with using just system calls, you can use gcc -ffreestanding -nostartfiles -static to get really small executable files.

Try this file (small.c):

#include <unistd.h>

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

Compile using: gcc -ffreestanding -nostartfiles -static -o small small.c && strip small. This produces a ~5K executable on my system (which still has a few sections that ought to be stripable). If you want to go further look at this guide.

┈┾☆殇 2024-12-06 11:57:40

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

各种“*nix 上的汇编程序”网站可以让您了解如何做到这一点。

如果您只是希望二进制文件较小,请从使用 32 位开始。

Or use -nostdlib and implement your own libraries and startup code.

The various "assembler on *nix" sites can give you an idea how to do it.

If you just want your binary to be small, start by using 32-bit.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文