.symtab
readelf ( .symtab
)的符号表显示了每个符号相对于该符号所在节的基址的偏移量。
正如您向我们展示的那样,当您列出表格时,您会得到类似的信息:
$ readelf --symbols <filename>
Symbol table '.symtab' contains 471 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 SECTION LOCAL DEFAULT 2
2: 00000000 0 SECTION LOCAL DEFAULT 4
3: 00000000 0 SECTION LOCAL DEFAULT 6
4: 00000000 0 SECTION LOCAL DEFAULT 8
5: 00000000 0 SECTION LOCAL DEFAULT 10
6: 00000000 0 SECTION LOCAL DEFAULT 12
... ... Truncated for readability ... ...
462: 0000d2c8 616 FUNC GLOBAL DEFAULT 2 bcmVlan_setDefaultAction
有一个专栏让我们特别感兴趣,那就是Ndx
专栏。readelf
通过整数索引标识每个部分。这就是 Ndx 所代表的意思。的输出.symtab
显示我们的函数bcmVlan_setDefaultAction
属于 Ndx 编号 2。
节表
要查看哪个部分的索引号为“2”,您应该执行:
$ readelf --sections <filename>
当您执行它时,您可能会看到如下内容:
There are ?? section headers, starting at offset 0x????:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] <section name> <type> 00000000 0000?? 0000?? ?? A 0 0 4
[ 2] .text <type> 00000000 000050 00???? 00 AX 0 0 16
您的函数可能位于.text
其基地址(Off
列)所在的部分0x000050
,即距文件开头的 0x50 字节。
然后,这一切都应该有意义,因为这是从您获得的地址中减去您获得的地址时readelf
得到的radare2
:
0x0d318 - 0x0d2c8 = 0x50.