gpt4 book ai didi

assembly - GNU 作为 jmp 的怪异与全局标签

转载 作者:行者123 更新时间:2023-12-04 05:43:32 25 4
gpt4 key购买 nike

我想了解 GNU 的以下行为。

以下 OS X 测试程序(Apple cctools-822/GNU as 1.38)

    .globl foo
jmp foo
foo:
ret

被编码为
    00000000    e900000000    jmp         0x00000005
foo:
00000005 c3 ret

而 Linux 上的 GNU(GNU 为 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

谁能解释这种行为?

最佳答案

它只是一种不同类型的重定位条目 (R_386_PC32)。

您不必担心,链接器会插入正确的地址。

如果添加 -r,您可以看到重定位条目。 objdump 的选项,例如

objdump -Dr test2.o

请注意,该值为 0xfffffffc = -4因为 x86 是小端。

另见 this question .

关于assembly - GNU 作为 jmp 的怪异与全局标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10979060/

25 4 0