主要观点:在对象文件中,某些代码模式会在指令内嵌入数据或在指令集之间发生转换,这给反汇编器带来了困难,可能导致误判数据为代码而输出不准确结果,不同架构对此有不同处理方式,如定义映射符号来明确表示状态转换。
关键信息:
- 介绍了 AArch32 代码示例中的各种元素,如跳转表(
.LJTI0_0
)、常量池(.LCPI0_0
)、ISA 转换等。 - 探讨了工具链中映射符号的管理,包括反汇编器(llvm-objdump)、nm 工具以及符号化器(addr2line、llvm-symbolizer)对映射符号的处理。
- 指出映射符号可能导致符号表膨胀的问题,尤其是在 64 位架构中,并提出了一种替代的映射符号方案来解决该问题,但存在合规性和互操作性方面的考虑。
- 说明了映射符号在范围扩展 thunks 中的作用,以及 GNU 汇编器中独特的对齐行为和 AArch32 的
ld --be8
模式。 - 还介绍了 RISC-V ISA 扩展的映射符号以及 Mach-O 的
LC_DATA_IN_CODE
加载命令,并探讨了如何在 ELF 中实现 Mach-O 的效率。
重要细节:
- llvm-objdump 会根据
--show-all-symbols
选项显示或隐藏映射符号,nm 工具通常会隐藏映射符号,除非使用--special-syms
选项。 - 在 64 位架构中,映射符号可能会使符号表膨胀,尤其是在使用
-ffunction-sections -fdata-sections
时。 - 替代的映射符号方案在大多数情况下可以消除大部分映射符号,但存在一些合规性和互操作性问题。
- 范围扩展 thunks 中的
$x
符号用于表示 A64 状态,GNU 汇编器对于对齐有独特的处理方式,AArch32 的ld --be8
模式需要扫描映射符号,Mach-O 的LC_DATA_IN_CODE
加载命令更紧凑。 - 可以利用 ELF 的
SHF_COMPRESSED
特性来实现类似于 Mach-O 的效率。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。