我想了解 GNU 的以下行为。
OS X 上的以下测试程序(Apple cctools-822/GNU as 1.38)
.globl foo
jmp foo
foo:
ret
被编码为
00000000 e900000000 jmp 0x00000005
foo:
00000005 c3 ret
而 GNU as on Linux (GNU as 2.22) 编码为
.global foo
0000 E9FCFFFF jmp 0x35 # foo
FF
foo:
0005 C3 ret
为什么后者会(对我)奇怪的跳跃?
此外,显然这个魔术0xfcffffff
地址用于每次跳转到全局标签:
测试2.s
.globl foo
jmp foo
.globl bar
jmp bar
.globl baz
jmp baz
foo:
push $1
ret
bar:
push $2
ret
baz:
push $3
ret
在 linux 上使用 GNU 生成(GNU 为 2.22)
.globl foo
0000 E9FCFFFF jmp foo
FF
.globl bar
0005 E9FCFFFF jmp bar
FF
.globl baz
000a E9FCFFFF jmp baz
FF
foo:
000f 6A01 push $1
0011 C3 ret
bar:
0012 6A02 push $2
0014 C3 ret
baz:
0015 6A03 push $3
0017 C3 ret
谁能解释这种行为?