You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:10:57