当我动态链接可执行elf文件时,它需要libc.so.6共享库。 当我静态链接可执行的elf文件时,它不需要libc.so.6共享库(这并不奇怪)。
是不是意味着,用--static组装可执行文件,链接器包含libc.so.6吗? 如果不是 - 链接器包含哪个文件?我在哪里可以搜索到它? 据我所知,链接器包含静态汇编文件中的静态库。
答案 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编译器),as
,ld
和collect2(这些交易)使用初始化等,然后调用链接器。)
要了解正在运行的命令[s] gcc
,请将-v
程序标志传递给它。
当您将-static
传递给gcc
时,它可能与例如/usr/lib/x86_64-linux-gnu/libc.a
相关联{{1}}或GNU Libc库的其他静态形式。