0

我有一个简单的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的信息。

4

2 回答 2

2

备查:

  • .text:代码段(思考函数);启用功能部分或涉及 comdat 时(例如模板)可能有多个
  • .data:数据段(想想全局变量);启用数据部分或涉及 comdat 时(例如模板)可能有多个
  • .bss:初始化为零的数据段(上面不存在);启用数据部分或涉及 comdat 时(例如模板)可能有多个
  • .debug:调试信息;像其他人一样,当涉及功能部分时,可以有多个。
  • .pdata:对于 x86_64,这是方法的“异常信息”,它定义了函数的开始/结束,以及指向展开信息的指针(参见 .xdata);在目标文件中,这是每个函数重复的
  • .drectve:不确定;但从名字我猜是链接器指令。
  • .xdata:用于 x86_64;这是 pdata 指向的展开信息部分。它包含函数的异常处理程序在哪里,以及发生异常时如何展开它:https ://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=vs -2019

“$”后缀用于排序。给定: - .sec$z - .sec$data - .sec$a

这些部分在合并到可执行文件之前进行排序(因此首先是 .sec$a,然后是数据,然后是 z),这可用于为 pe 部分创建开始/结束符号。

于 2020-01-23T08:10:02.257 回答
0

重复的部分用于 c++ 模板之类的东西,编译器将在任何需要它的翻译单元中实例化模板,然后链接器将选择其中一个实例化(通常是第一个遇到的)。

不太常见的是特定于编译器的功能,例如 Microsoft 的 __declspec(selectany),它允许多次定义变量,链接器将简单地选择其中一个定义并丢弃其余定义。

gcc 的 ld 脚本将采用所有 .text* 部分来创建链接可执行文件的最终 .text 。您可以检查这些脚本以了解链接器如何从目标文件中创建可执行文件。

于 2017-12-22T16:41:16.130 回答