Как использовать логический адрес в gdb?

gdb предоставляет функциональные возможности для чтения или записи на определенный линейный адрес, например:

(gdb) x/1wx 0x080483e4
0x80483e4 <main>:       0x83e58955
(gdb) 

но как вы указываете логический адрес? Я пришел по следующей инструкции:

   0x0804841a <+6>:     mov    %gs:0x14,%eax

как я могу прочитать память в "% gs: 0x14" в gdb или перевести этот логический адрес на линейный адрес, который я мог бы использовать в команде x?

note: я знаю, что я мог просто читать% eax после этой инструкции, но это не мое беспокойство

Ответ 1

как я могу прочитать память в "% gs: 0x14" в gdb

Вы не можете: GDB не знает, как настроен сегмент, к которому относится %gs.

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

Опять же, вы не можете этого сделать вообще. Тем не менее, вы оказались на 32-разрядной x86 Linux, и там вы можете сделать это: %gs настроен для указания дескриптора потока через системный вызов set_thread_area.

Вы можете сделать catch syscall set_thread_area в GDB и изучить параметры (каждый поток будет иметь один такой вызов). Код на самом деле это здесь. Как только вы знаете, как %gs был настроен, просто добавьте 0x14 в base_addr, и вы закончили.