使用此功能:
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()
在运行时加载的库需要一些不同的代码),所以已知。
Ulrich Drepper的TLS文档中详细解释了这一点,特别是§4.3和§4.3.6。
我不确定自从分段式架构的不良旧日以来是否还称它们为段寄存器。我认为正确的术语应该是选择器(但我可能是错的)。
然而,我认为你只需要在fs
区域的第一个四元组(64位)。
%fs:0x0
位表示fs:0
处内存的内容。由于你使用了通用的add
(而不是例如addl
),我认为它将从目标%rax
中获取数据宽度。
关于获取实际值,这取决于您是在传统模式还是长模式下。
在传统模式下,您需要获取fs
值并在GDT(或可能是LDT)中查找以获取基地址。
在长模式下,您需要查看相关的模型特定寄存器。如果您到达了这个点,恐怕已经超出了我的专业水平。