2

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

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

4

2 回答 2

2

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

ar t /usr/lib/libc.a

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

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

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

于 2012-04-23T07:35:20.663 回答
1

链接器是ld命令。如果您使用该命令,它会按照您的要求执行。注意 GNUld可以接受脚本

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

要了解正在运行的确切命令[s] ,请将程序标志gcc传递给它。-v

当您传递-staticgcc它时,它可能会与例如/usr/lib/x86_64-linux-gnu/libc.a或其他一些静态形式的 GNU Libc 库链接。

于 2012-04-23T07:29:38.830 回答