链接器文件中输入和输出部分的区别是什么?

3

虽然在生成的二进制文件或ELF文件中可能很清楚地知道什么是section,但是文档中的许多位置(与使用的编译器无关)将它们称为输入或输出section。

这些之间有什么区别?

1个回答

3
链接器会使用目标文件(以及可能的共享库)并输出可执行文件或共享库。输入的目标文件由命名的节组成 - .text.data.rodata.bss等,输出文件也是如此。
链接器的主要工作之一是将所有同名的输入节从所有输入目标文件中合并为一个同名的输出节,放入输出文件中。例如,所有输入目标文件的.text节都会贡献到输出文件的.text节中。
如果链接器确定某些输入节是冗余的,则可以从输出文件中删除这些输入节。

通常情况下,源代码中用 #pragma 分隔的部分会成为输入部分,而在最终链接文件中被引用的部分则是输出部分吗? - urnenfeld
1
@urnenfeld 在标准的C或C++中,没有语法手段来定义节(section)。通常情况下,节的定义完全是编译器的事情。编译器可能具有非标准扩展,使您可以将对象分配给命名节。对于GCC,请参阅“Common Variable Attributes”和“Common Function Attributes”中__attribute__ ((section ("<section-name>")))的文档。这些扩展是为特定目的而设计的。 - Mike Kinghan
1
@urnenfeld 任何使用源语言扩展定义的部分都将成为编译器生成的目标文件的部分,并成为链接器的输入部分。 - Mike Kinghan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接