汇编器中的重定位生成

主要观点:探讨 GNU Assembler 和 LLVM 集成汇编器生成重定位的过程,重定位是生成可重定位文件的重要步骤,涉及符号引用、表达式解析等方面。
关键信息

  • 符号引用是重定位的主要候选,如 x86-64 指令中的 movl sym(%rip), %eax
  • 汇编过程分解析、节布局、重定位决策等阶段,各阶段有特定任务。
  • 重定位有多种类型,如 PC 相对修正、绝对地址等,不同目标架构有所差异。
  • 重定位规范指导汇编器如何解析和编码表达式,有多种语法风格。
  • TLS 符号有特定处理方式,一些指令会生成复合重定位。
  • GNU Assembler 和 LLVM 内部对重定位的实现细节不同。
    重要细节
  • 解析阶段构建节片段,识别寄存器、立即数和表达式,将无法解析的部分转为“修正”。
  • 节布局阶段确定节的偏移和大小,为链接器留下外部符号。
  • 重定位决策阶段评估修正,确定是否需要重定位条目,有错误、已解析和未解析三种结果。
  • 不同目标架构的重定位细节不同,如 AArch64、PowerPC、RISC-V 等。
  • GNU Assembler 用 struct fixup 表示修正和可重定位表达式,LLVM 分别编码。
  • LLVM 内部表达式结构存在一些问题,如 MCSymbolRefExpr 的设计不佳。
  • 在 LLVM 的 AsmParser 中,@specifier 的解析存在挑战,需要一些工作来优化。
  • AsmPrinter 中 lowerConstant 函数处理全局变量初始化时的复杂情况。
阅读 16
0 条评论