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

时间:2012-04-23 07:07:08

标签: linux gcc linker

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

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

2 个答案:

答案 0 :(得分:2)

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

ar t /usr/lib/libc.a

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

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

根据@janneb评论,要链接的最小单位是" section",所以它甚至可能不需要链接整个目标文件。

答案 1 :(得分:1)

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

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

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

当您将-static传递给gcc时,它可能与例如/usr/lib/x86_64-linux-gnu/libc.a相关联{{1}}或GNU Libc库的其他静态形式。