gpt4 book ai didi

linux - 如何理解 objdump 的输出,关于间接 jmp?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:03 24 4
gpt4 key购买 nike

在objdump -S my_program的时候,通常可以看到下面的间接jmp指令,一般用于switch/case跳转表:

ffffffff802e04d3: ff 24 d5 38 2e 10 81 jmpq *-0x7eefd1c8(,%rdx,8)

如何理解地址-0x7eefd1c8?这意味着表的基地址是 0xffffffff802e04d3 - 0x7eefd1c8

此外,如何从 ff 24 d5 38 2e 10 81 获取 -0x7eefd1c8

最佳答案

decoding issue

比你还得看Intel Development Manuals

  • ff 是 JMP 操作码(Jump near, absolute indirect)[1]
  • 24 是一个 ModR/M<​​/em> 字节 [2],这意味着 SIB 字节紧随其后(JMP 操作码只有一个操作数,所以寄存器字段被忽略)
  • d5 是一个 SIB 字节 [2],这意味着 disp32 紧随其后,Scale = 8Index = %rdx(在 32 位模式下,Index 应该是 %edx)没有基数。
  • 38 2e 10 81 是一个 4 字节的 disp32 操作数。如果将其编码为双字,您将得到 0x81102e38 请注意,最高位设置为 1。它是一个符号位,表示值以 Two's Complement Encoding [3] 编码。

从二进制补码转换为我们预期的数字:

>>> print hex(0x81102e38 - (1 << 32))
-0x7eefd1c8

当处理器在 64 位模式下执行该指令时,它从 0xffffffff81102e38 + (%rdx * 8) 中读取 8 个字节(原始数字经过符号扩展)并将该四字放入 %rip [4]。

引用手册:

  1. 第 2A 卷,3.2 说明 (A-M) 部分,第 3-440 页
  2. 第 2 卷,2.1.5 ModR/M 和 SIB 字节的寻址模式编码部分2-6..2-7 页
  3. 第 1 卷,4.2.1.2 有符号整数部分4-4
  4. 第 2 卷,第 2.2.1.3 节,第 2-11 页

关于linux - 如何理解 objdump 的输出,关于间接 jmp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28872279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com