как разрешить сегмент: адрес смещения в GDB - PullRequest
2 голосов
/ 24 октября 2010
(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.

Может кто-нибудь описать мне, как сопоставить адрес ds: 0x804a008 в линейный адрес? Я могу использовать команду "x / xw address"? Если неясно, я хотел бы знать, куда эта первая функция jmp в коде переходит.

Ответы [ 2 ]

1 голос
/ 24 октября 2010

0x804a008 - это адрес в линейном адресном пространстве процессов - DWORD в этой ячейке памяти - это адрес, по которому будет выполняться переход (т. Е. 0x804a008 - указатель) `

So

x/xw 0x804a008

сбросит содержимое указателя, а

disasm *0x804a008

дизассемблирует код, который будет выполняться через этот указатель.

0 голосов
/ 24 октября 2010

Современные ОС x86 не используют сегментированную адресацию. Сегментированный адрес реального режима может представлять только 1 МБ адресного пространства. Эта схема адресации используется только в процессе загрузки в целях совместимости.

ОС установила все регистры сегментов на селектор , который представляет собой плоское 32-битное адресное пространство вашего процесса, но вам не нужно об этом беспокоиться.

ds: 0x804a008 - это то же самое, что 0x804a008

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...