当我动态链接可执行 elf 文件时,它需要 libc.so.6 共享库。当我静态链接可执行 elf 文件时,它不需要 libc.so.6 共享库(这并不奇怪)。
这是否意味着用--static 组装可执行文件,链接器在其中包含libc.so.6?如果不是 - 链接器包含什么文件?我在哪里可以搜索它?据我所知,链接器在静态汇编文件中包含静态库。
如果您以静态方式链接,则链接器将从.o
静态库 ( .a
) 链接所有需要的对象 ( ) 文件。例如,以下命令列出了 libc6 库中包含的目标文件:
ar t /usr/lib/libc.a
(libc.a 的确切路径当然因系统而异)
所以对你的问题的回答是否定的,它不会链接整个libc6 库,而只会链接所需的目标文件。而且,它对 没有任何作用libc.so.6
,因为这仅用于动态链接。它适用于libc.a
库的 - 静态版本。
根据@janneb 评论,要链接的最小单元是“部分”,因此它甚至可能不需要链接整个目标文件。
链接器是ld
命令。如果您使用该命令,它会按照您的要求执行。注意 GNUld
可以接受脚本
但是,大多数人都在使用该gcc
命令。这是来自Gnu Compiler Collection套件的编译器。实际上,该gcc
命令只是一个驱动程序,它将运行cc1
(适当的 C 编译器)as
、ld
和collect2(处理初始化等,然后调用链接器)。
要了解正在运行的确切命令[s] ,请将程序标志gcc
传递给它。-v
当您传递-static
给gcc
它时,它可能会与例如/usr/lib/x86_64-linux-gnu/libc.a
或其他一些静态形式的 GNU Libc 库链接。