主要观点:探讨 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
函数处理全局变量初始化时的复杂情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。