如何解析GDB中的段:偏移地址

use*_*162 5 gdb memory-management

(gdb) info registers ds
   ds             0x7b  123
(gdb) disassemble
   Dump of assembler code for function printf@plt:
   0x0804831c <+0>: jmp    DWORD PTR ds:0x804a008
=> 0x08048322 <+6>: push   0x10
   0x08048327 <+11>:    jmp    0x80482ec
End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我如何将 ds:0x804a008 地址映射到线性地址吗?我可以使用“x/xw 地址”命令吗?如果不清楚,我想知道代码跳转中的第一个 jmp 函数在哪里。

Ale*_*min -3

现代 x86 操作系统不使用分段寻址。实模式分段地址只能表示1Mb的地址空间。出于兼容性原因,此寻址方案仅在引导过程中使用。

操作系统将所有段寄存器设置为代表进程的平面 32 位地址空间的选择器,但您不必担心这一点。

ds:0x804a008 与 0x804a008 相同

  • 这并不完全正确。现代 x86 操作系统确实使用段来进行线程本地存储。虽然段寄存器本身的实际值在 64 位模式下实际上并不相关,但使用 FS 或 GS​​ 前缀操作码会导致 CPU 将 FSBASE 或 GS​​BASE MSR 值添加到线性地址。 (7认同)