我使用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)
....
{/ 1}}和__start_sym
的地址差异为零,这意味着输出文件中不会添加此类部分。
但是readelf能够读取该部分并转储本节的内容..怎么样?为什么?
答案 0 :(得分:1)
当然symtab
部分存在;这些工具只是以不同的方式提供信息。 symtab在objdump(try -x
)中以此形式(或类似)列出为动态部分
... STRTAB 0x08048408 SYMTAB 0x08048178 STRSZ 0x0000016d ...
Objdump似乎更关注文件作为“对象”(允许例如反汇编),而readelf更多关于ELF格式的信息可以提供,即文件“结构”本身。