9

'bl' 或带有链接指令的分支几乎总是变成 0xebffffffe

然而,处理器和 GNU binutils objdump 不知何故知道在哪里分支:

00000000 <init_module>:
   0:   e1a0c00d        mov     ip, sp
   4:   e92ddff0        push    {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc}
   8:   e24cb004        sub     fp, ip, #4
   c:   e24dd038        sub     sp, sp, #56     ; 0x38
  10:   ebfffffe        bl      0 <init_module>
  14:   e59f0640        ldr     r0, [pc, #1600] ; 65c <init_module+0x65c>
  18:   ebfffffe        bl      74 <init_module+0x74>

他们怎么知道?

4

1 回答 1

13

该问题是由于您正在查看对象文件的反汇编,而不是最终的可执行文件或共享对象。

当汇编程序生成目标文件时,bl目标的最终地址尚未确定(它取决于将与其链接的其他目标文件)。因此,汇编器将地址设置为 0,但还添加了一个重定位,告诉链接器这bl应该在最终文件中的位置。(您可以objdump通过添加-r开关来查看重定位信息。)

链接时,链接器处理重定位,计算目标函数的最终地址并修补指令以使目标地址对齐。如果您反汇编最终的链接可执行文件,您将看到不同的操作码。

于 2013-02-21T14:14:54.033 回答