我使用 objdump
GCC
或 LLVM
对编译的二进制文件进行一些二进制分析。
为了进行此分析,我依赖于编译器在 objdump
生成的输出中保留的标签。
考虑以下来自objdump
的输出:
0000000000400517 <.cend.c181>:
400517: eb 01 jmp 40051a <.end.c180>
0000000000400519 <.cslot.c180>:
...
000000000040051a <.end.c180>:
40051a: ff 45 fc incl -0x4(%rbp)
在这里,由于标签.cend.c181
和.cstart.180
引用相同的位置(0x400517
(,编译器选择擦除.cstart.180
。
生成的程序集的一小部分:
#NO_APP
#APP
.cend.c181:
#NO_APP
#APP
.cstart.c180:
#NO_APP
#APP
jmp .end.c180
#NO_APP
#APP
请注意,.cend.c181
和.cstart.c180
引用同一位置。
如何保留此类标签,以便我的工具正常工作?
似乎 objdump 只打印与汇编代码行对应的单个标签,对此您无能为力(请参阅相关代码(。您能否从 ELF 的符号表中提取所有标签,然后将它们与工具中单独传递中的指令进行匹配?
$ readelf -s tmp.o
Symbol table '.symtab' contains 7 entries:
Num: Value Size Type Bind Vis Ndx Name
...
4: 0000000000000000 0 NOTYPE LOCAL DEFAULT 1 .cend.c181
5: 0000000000000000 0 NOTYPE LOCAL DEFAULT 1 .cstart.c180
6: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND .end.c180