ARM Cortex-M4平台REL类型重定位项的加数计算问题
ARM REL类型重定位(R_ARM_ABS32)加数计算问题
问题信息
使用GNU Arm Embedded Toolchain 9-2020-q2-update(9.3.1 20200408)处理REL类型重定位项,已知REL无独立r_addend,加数存储在待重定位段中。
重定位项详情
Relocation section '.rel.text' at offset 0x127fc contains 26 entries: 000004fc 00000302 R_ARM_ABS32 00000000 .data
.text段对应偏移内容
Contents of section .text: 04f0 0df13808 4046f926 b9e700bf fcffffff ..8.@F.&........
相关反汇编片段
00000278 <al0_sorting_algorithm_test>: 278: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 27c: 4d9f ldr r5, [pc, #636] ; (4fc <al0_sorting_algorithm_test+0x284>) 27e: b0ce sub sp, #312 ; 0x138 280: ae04 add r6, sp, #16 282: f105 0424 add.w r4, r5, #36 ; 0x24 286: 462b mov r3, r5 288: 4632 mov r2, r6 28a: f853 1f04 ldr.w r1, [r3, #4]! 28e: f842 1f04 str.w r1, [r2, #4]! 292: 42a3 cmp r3, r4 294: d1f9 bne.n 28a <al0_sorting_algorithm_test+0x12> 296: 4f9a ldr r7, [pc, #616] ; (500 <al0_sorting_algorithm_test+0x288>) 298: f8df 8290 ldr.w r8, [pc, #656] ; 52c <al0_sorting_algorithm_test+0x2b4> 29c: a805 add r0, sp, #20 29e: 2109 movs r1, #9 2a0: f7ff fffe bl 1e0 <al0_SelectionSort>
解答
对于ARM架构的R_ARM_ABS32 REL格式重定位,你读取到的0xFFFFFFFC是32位有符号补码,实际加数为-4。
具体说明:
.text段0x4fc处的字节序列是fc ff ff ff,按小端存储规则拼接成32位值0xFFFFFFFC,这是十进制-4的补码表示。- 重定位的核心计算公式为:
最终目标地址 = .data段加载基地址 + 加数,也就是.data - 4。 - 对应到反汇编逻辑中,
ldr r5, [pc, #636]加载的就是这个待重定位的值,链接完成后r5会被设置为.data -4;后续add.w r4, r5, #36计算得到.data +32,这应该就是你算法中需要访问的数据区域起始地址,完全符合你预期的“小数值定位数据”的场景。
内容的提问来源于stack exchange,提问作者I.Y.A.L
相关产品推荐
相关产品推荐

