获取部分的符号

时间:2015-08-04 20:31:13

标签: c++ windows coff

SECTION HEADER #5
   .text name
       0 physical address
       0 virtual address
      24 size of raw data
    1B78 file pointer to raw data (00001B78 to 00001B9B)
    1B9C file pointer to relocation table
       0 file pointer to line numbers
       2 number of relocations
       0 number of line numbers
60101020 flags
         Code
         COMDAT; sym= __setdefaultprecision
         1 byte align
         Execute Read

我查看了COFF的文档,无法理解我是如何得到该部分的符号(__setdefaultprecision),我有指向符号表,字符串表和部分数组的指针,但我怎么知道每个部分的符号呢?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

对于COMDAT部分,符号表中的前两个条目以及COMDAT部分的部分编号提供了部分的名称和COMDAT符号。第一个符号给出了该部分的名称,在您的示例中为.text。第二个条目提供COMDAT符号,在您的示例中名为__setdefaultprecision

来自Microsoft Portable Executable and Common Object File Format Specification,修订版8.3:

  

COMDAT部分(仅限对象)

     

具有COMDAT部分的section值的第一个符号必须   是部分符号。 [...]第二个符号称为“COMDAT符号”   并由链接器与Selection字段一起使用。

如果您在.OBJ上使用DUMPBIN /SYMBOLS,那么您应该看到两个类似于以下内容的条目:

00A 00000000 SECT5  notype       Static       | .text
    Section length    C, #relocs    1, #linenums    0, checksum A2F45556, selection    2 (pick any)
...
00E 00000000 SECT5  notype ()    External     | __setdefaultprecision

请注意,它们不一定是连续的,但它们将成为表格中的前两个SECT5符号。