我有一个简单的hello world
程序,并在我用/ headers标志转储后,我得到这个输出:
FILE HEADER VALUES
8664 machine (x64)
D number of sections
5A3D287F time date stamp Fri Dec 22 18:45:03 2017
48F file pointer to symbol table
2D number of symbols
0 size of optional header
0 characteristics
Summary
F .data
A0 .debug$S
2F .drectve
24 .pdata
B9 .text$mn
18 .xdata
xdata部分到底做了什么以及包含什么?没有关于msdn的信息。
重复的部分用于c ++模板之类的东西,编译器将在需要它的任何翻译单元中实例化模板,然后链接器将选择其中一个实例化(通常是第一次遇到)。
不太常见的是特定于编译器的功能,如Microsoft的__declspec(selectany),它允许多次定义变量,链接器将只选择其中一个定义并丢弃其余的定义。
gcc的ld脚本将采用所有.text *部分来创建链接可执行文件的最终.text。您可以检查这些脚本,以了解链接器如何从目标文件创建可执行文件。