链接器是否在静态链接文件中包含 libc.so.6



当我动态链接可执行的elf文件时,它需要libc.so.6共享库。当我静态链接可执行的 elf 文件时,它不需要 libc.so.6 共享库(这并不奇怪)。

这是否意味着,要使用 --static 组装可执行文件,链接器在其中包含 libc.so.6?如果不是 - 链接器包含什么文件?我在哪里可以搜索它?据我所知,链接器在静态组装的文件中包含静态库。

如果链接为静态,链接器将从静态库(.a)链接所有需要的对象(.o)文件。例如,以下命令列出了 libc6 库中包含的对象文件:

ar t /usr/lib/libc.a

(libc.a 的确切路径当然因系统而异)

所以你的问题的答案是否定的,它不会链接整个libc6库,而只会链接所需的对象文件。而且,它对libc.so.6没有任何作用,因为这仅用于动态链接。它适用于库的libc.a静态版本。

根据@janneb评论,要链接的最小单元是"部分",因此它甚至可能不需要链接整个对象文件。

链接

器是ld命令。如果您使用该命令,它将执行您的要求。请注意,GNU ld可以接受脚本

但是,大多数人都在使用 gcc 命令。这是来自 Gnu 编译器集合套件的编译器。实际上,gcc命令只是一个驱动程序,它将运行cc1(正确的C编译器),asld和collect2(处理初始化等,然后调用链接器)。

要了解正在运行的确切命令gcc,请向其传递-v程序标志。

当您将-static传递给gcc时,它可能会链接到例如 /usr/lib/x86_64-linux-gnu/libc.a GNU Libc 库的其他静态形式。

最新更新