在x86-64架构中,两个寄存器具有特殊用途:FS和GS.在linux 2.6.*中,FS寄存器似乎用于存储线程本地信息.
(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 函数在哪里。
我正在运行 POK,而 POK 又在分区内运行 RTEMS。系统积极使用 x86 段,但我不知道如何告诉 GDB 考虑这一点。
如果我执行以下内联 asm 代码,EIP(请参阅注释)将位于正确的位置。当我加载正确的 SS (0x23) 并使用 gdb 检查此位置时,它将显示 0x00000000。如果我将其加载回 EAX 并使用“info reg”检查 EAX,它将显示正确的 EIP 地址。
"movl 56(%1), %%ebx \t\n" //move user esp address to register
"movl 60(%1), %%eax \t\n"
"movl %%eax , %%gs \t\n" // move user's SS to gs register
"movl 44(%1), %%eax \t\n" //move eip to register
"movl %%eax , %%gs:(%%ebx) \t\n" // move eip to user esp
Run Code Online (Sandbox Code Playgroud)
%GS 是 GDT 的偏移量,所以我尝试找到 GDT,然后自己重建内存段的基地址,但 GDB 也没有帮助。
如果我省略 %%gs: 并让 GDB …
在使用GDB调试程序时,有什么方法可以读取特定于x86-64模型的寄存器,尤其是IA32_FS_BASE和IA32_GS_BASE?
使用像Intel的Pintool这样的动态工具包的解决方案是不太可取的,但是同样可以理解。