在使用ARM编译器(如GNU Arm Embedded Toolchain 9-2020-q2-update)进行嵌入式系统开发时,重定位(relocation)是非常重要的一环。重定位处理在链接阶段解决符号地址引用,确保程序在内存中正确运行。今天,我们将深入探讨如何正确读取和理解REL类型的重定位条目。
什么是REL和RELA?
- REL: 在REL格式的重定位中,
r_addend
是不存在的。相反,addend直接嵌入在被重定位的代码或数据段中。 - RELA: RELA格式则明确包含一个
r_addend
字段,简化了重定位计算。
案例分析
考虑以下一个REL类型的重定位条目:
Relocation section ‘.rel.text’ at offset 0x127fc contains 26 entries:
000004fc 00000302 R_ARM_ABS32 00000000 .data
这里,我们看到一个`R_ARM_ABS32`类型的重定位,其偏移量位于`.text`段的`0x4fc`,目标是`.data`段。
#### 读