Memory management 如何解析GDB中的段:偏移地址 (gdb)信息寄存器ds ds 0x7b 123 (gdb)拆卸 函数的汇编代码转储printf@plt: 0x0804831c:jmp DWORD PTR ds:0x804a008 =>0x08048322:按0x10 0x08048327:jmp 0x80482ec 汇编程序转储结束。

Memory management 如何解析GDB中的段:偏移地址 (gdb)信息寄存器ds ds 0x7b 123 (gdb)拆卸 函数的汇编代码转储printf@plt: 0x0804831c:jmp DWORD PTR ds:0x804a008 =>0x08048322:按0x10 0x08048327:jmp 0x80482ec 汇编程序转储结束。,memory-management,gdb,Memory Management,Gdb,有人能描述一下如何将ds:0x804a008地址映射成线性地址吗?我可以使用“x/xw地址”命令吗?如果不清楚,我想知道在代码跳转中第一个jmp函数的位置。现代x86操作系统不使用分段寻址。实模式分段地址只能表示1Mb的地址空间。出于兼容性原因,此寻址方案仅在引导过程中使用 操作系统将所有段寄存器设置为一个选择器,该选择器表示进程的平坦32位地址空间,但您不必担心这一点 ds:0x804a008与0x804a008完全相同,0x804a008是进程线性地址空间中的地址-该内存位置中的DWORD是

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

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

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


ds:0x804a008与0x804a008完全相同,0x804a008是进程线性地址空间中的地址-该内存位置中的DWORD是将跳转到的地址(即,
0x804a008
是指针)。 `

所以

将转储指针的内容,并且

x/xw 0x804a008

将反汇编跳过该指针将执行的代码。

这是否适用于不使用平面地址空间的平台?
ds:
是默认数据段,在指令中未指示其他段寄存器时使用。虽然可以为段设置偏移量,但所有x86体系结构都将其保留为零,因此可以忽略段前缀。(gdb)x/xw 0x804a008 0x804a008:0x08048322@user480162当前位置阅读一篇位于的文章,了解这里发生的事情。基本上是第一次,它在
0x08048322
执行代码,解析
printf()的实际位置并将其放入指针中。因此,下次调用它时,它将直接跳转到
printf()
,这仅在ds段的基址为0x0时回答这个问题。对于现代操作系统来说,情况就是这样,但如果有人试图获取与TLS段(如gs或fs)的偏移量处的地址,其中基是任意的,那么这个答案没有帮助。这并不完全正确。现代x86操作系统确实使用段作为线程本地存储。虽然段寄存器本身的实际值在64位模式下实际上并不相关,但使用FS或GS前缀操作码会导致CPU将FSBASE或GSBASE MSR值添加到线性地址。
x/xw 0x804a008
disasm *0x804a008