相关疑难解决方法(0)

如何在Linux AMD64中使用fs/gs寄存器?

在x86-64架构中,两个寄存器具有特殊用途:FS和GS.在linux 2.6.*中,FS寄存器似乎用于存储线程本地信息.

  • 那是对的吗?
  • 什么存储在fs:0?是否有描述此内容的C结构?
  • 那么GS的用途是什么?

architecture linux x86 assembly x86-64

35
推荐指数
3
解决办法
1万
查看次数

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

(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 函数在哪里。

gdb memory-management

5
推荐指数
1
解决办法
5532
查看次数

如何用GDB打印段:偏移地址?

我正在运行 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 …

x86 assembly gdb

5
推荐指数
0
解决办法
2763
查看次数

使用GDB读取MSR

在使用GDB调试程序时,有什么方法可以读取特定于x86-64模型的寄存器,尤其是IA32_FS_BASE和IA32_GS_BASE?

使用像Intel的Pintool这样的动态工具包的解决方案是不太可取的,但是同样可以理解。

x86 gdb x86-64 msr memory-segmentation

4
推荐指数
3
解决办法
845
查看次数