防止 GCC(或 LLVM)擦除引用同一位置的两个标签之一



我使用 objdump GCCLLVM 对编译的二进制文件进行一些二进制分析。

为了进行此分析,我依赖于编译器在 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

相关内容

  • 没有找到相关文章

最新更新