0
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) 的符号,我有指向符号表、字符串表和节数组的指针,但我怎么知道每个部分?任何帮助表示赞赏。

4

1 回答 1

0

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

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

COMDAT 部分(仅限对象)

具有 COMDAT 节的节值的第一个符号必须是节符号。[...] 第二个符号称为“COMDAT 符号”,由链接器与选择字段一起使用。

如果您DUMPBIN /SYMBOLS在正在检查的 .OBJ 上使用,您应该会看到两个条目,如下所示:

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表中的前两个符号。

于 2015-08-04T22:48:46.747 回答