映射符号:为效率而重新思考

主要观点:在对象文件中,某些代码模式会在指令内嵌入数据或在指令集之间发生转换,这给反汇编器带来了困难,可能导致误判数据为代码而输出不准确结果,不同架构对此有不同处理方式,如定义映射符号来明确表示状态转换。

关键信息

  • 介绍了 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 的效率。
阅读 15
0 条评论