1

我用 gcc 编译了一个简单的程序,如果我看到使用 objdump 的部分标题,它不会显示部分.symtab。对于同一个a.out文件,readelf 显示以下部分:

[25] .symtab           SYMTAB          00000000 000ca4 000480 10     26  2c  4
[26] .strtab           STRTAB          00000000 001124 00025c 00      0   0  1

为什么?

在默认链接器脚本中,我没有找到.symtab节的定义。如果我像在链接器脚本中那样自己添加定义:

....
PROVIDE(__start_sym)
.symtab : { *(.symtab)}
PROVIDE(__end_sym)
....

__start_sym和的地址的 b/w 差__end_sym为零,这意味着输出文件中没有添加这样的部分。

但是 readelf 能够读取该部分并转储该部分的内容..如何?为什么 ?

4

1 回答 1

2

当然,该symtab部分存在;这些工具只是以不同的方式提供信息。-x符号表在 objdump (try ) 中以这种形式(或类似形式)列为动态部分

...
  STRTAB 0x08048408
  符号 0x08048178
  STRSZ 0x0000016d
...

Objdump 似乎更关注文件作为“对象”(例如也允许反汇编),而 readelf 更多地关注 ELF 格式可以提供的信息,即文件“结构”本身。

于 2010-06-08T13:20:29.857 回答