有了这个功能:如何解释x86-64上的段寄存器访问?
mov 1069833(%rip),%rax # 0x2b5c1bf9ef90 <_fini+3250648>
add %fs:0x0,%rax
retq
如何解释的第二个指令,并找出加入RAX?
有了这个功能:如何解释x86-64上的段寄存器访问?
mov 1069833(%rip),%rax # 0x2b5c1bf9ef90 <_fini+3250648>
add %fs:0x0,%rax
retq
如何解释的第二个指令,并找出加入RAX?
此代码:
mov 1069833(%rip),%rax # 0x2b5c1bf9ef90 <_fini+3250648>
add %fs:0x0,%rax
retq
返回一个线程局部变量的地址。 %fs:0x0
是TCB(线程控制块)的地址,并且1069833(%rip)
是从那里到变量的偏移量,这是已知的,因为该变量驻留在程序或加载时的某个动态库中(运行时加载的库通过dlopen()
需要一些不同的代码)。
这是非常详细乌利齐·德雷珀的TLS document解释,特别是第4.3节和§4.3.6。
我不知道,因为分段架构的坏日子,他们一直叫段寄存器。我相信适当的术语是一个选择器(但我可能是错的)。
不过,我认为你只需要在fs
区第一四字(64位)。
的%fs:0x0
位表示存储器的内容在fs:0
。既然您已经使用了通用的add
(而不是addl
),我认为它会从目标%rax
获取数据宽度。
在获取实际价值方面,取决于您是处于传统模式还是长时间模式。
在传统模式下,您必须获取fs
的值并在GDT(或可能是LDT)中查找它以获取基地址。
在长模式下,您需要查看相关型号的特定寄存器。如果您现在处于这种状态,那么您不幸的是已经超出了我的专业水平。
我想通作为很多,但我如何从选择器获取实际地址?我没有一个正在运行的进程,只有一个核心转储。 –
恐怕我处于长时间模式。 –
是的,选择器是索引(包括其他内容,如指定LDT/GDT的标志)。你必须知道GDT/LDT在哪里,而且我并不完全确定你可以从注册信息中获得这些信息。 – paxdiablo
Assming你在linux下运行,[这](http://stackoverflow.com/questions/6611346/amd64-fs-gs-registers-in-linux)的问题可能是相关的。 – user786653
的可能的复制[ “DS:\ [40207A \]”?是什么在组装的意思(http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly) –