gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:59 24 4
gpt4 key购买 nike

我使用 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 只打印与汇编代码行对应的单个标签,您对此无能为力(请参阅 relevant code)。您能否从 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

关于linux - 防止 GCC(或 LLVM)删除引用同一位置的两个标签之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43294282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com