2 min read

LLD链接器ARM对齐策略揭秘:'d4d4'指令的真实面目与潜在风险

LLD链接器在ARM架构的Thumb模式下,为了跨目标文件边界进行32位对齐,会插入不可达的`d4d4`指令。该指令在ARMv7-M架构手册中被解释为一种条件分支,而非处理器陷阱(trap)指令,这与x86架构的`0xCC`(INT 3)指令的预期行为不同。

该`d4d4`指令的实际功能是执行一个相对跳转,其偏移量经过计算为`-0x58`字节。LLD选择此指令是因为其在ARM汇编中被用作填充空隙的“陷阱”指令,但其解码结果却是一个条件分支。这一发现源于对LLVM工具链(特别是lld)和ARM指令集架构的深入分析,并与GNU ld的行为进行了对比,后者则使用零字节进行填充。研究表明,`d4d4`指令的插入并非由编译器直接生成,而是链接器在处理对象文件边界时的对齐策略所致。 Theo de Raadt的建议以及Rui Ueyama的实现,将`d4d4`作为ARM/AArch64的填充指令,尽管其在Thumb模式下的实际效果是一个条件跳转,可能导致不可预测的行为,这被作者认为是LLD的一个潜在缺陷。

D4D4 — Nathan’s Musings
订阅情报