gcc ld只包含可执行文件中使用的相关函数的.text吗?

时间:2011-09-19 04:12:47

标签: gcc ld

我已将各种.c源代码编译到各自的.o目标文件中,并将其存档为.a存档文件。在main()函数中说我使用函数foo()。在编译和链接之后,可执行文件1)是否只包含foo()函数的.text以及foo()递归调用的所有其他函数,或2)它是否包含foo()所在的整个.o in,或3)整个.a文件中的.text?

最好选择1),因为它只包含空间受限环境中的最少量指令。我该如何完成这项工作?

1 个答案:

答案 0 :(得分:1)

通常,加载器将包含链接行中列出的所有目标文件(Unix / Linux上的.o文件)中的所有材料。如果它处理任何静态库(Unix / Linux上的.a文件),那么库中需要的目标文件包含在toto中(但是任何没有定义程序所需符号的目标文件都会被保留)从可执行文件中删除)。如果它处理任何共享库(通常是Unix / Linux上的.so文件),那么它不会将任何材料加载到二进制文件中,但它会记录共享库提供的所有符号,这样它就不会试图满足后来文件或库中的任何符号。

加载程序按从左到右的顺序处理参数列表。这意味着您应该在目标文件之后列出静态库。在目标文件之后列出共享库并不是那么重要,尽管最好还是这样做,以防程序与静态库而不是共享库链接。

如果您最终使用明确列出的目标文件中的双重定义符号或从静态库中提取的目标文件,则加载程序将失败。如果在某些共享库中最终得到双重定义的符号,则实际上会忽略共享库中的重复项。

我认为这是一个高速写的合理的摘要,并没有在细节上迷失。有许多if和s可以添加到讨论中;整本书都是关于如何从目标文件和库创建可执行文件的主题。