如何解释x86-64上的段寄存器访问?

有了这个function:

mov 1069833(%rip),%rax # 0x2b5c1bf9ef90 <_fini+3250648> add %fs:0x0,%rax retq 

我如何解释第二条指令并找出RAX中添加的内容?

Solutions Collecting From Web of "如何解释x86-64上的段寄存器访问?"

此代码:

 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)中查找以获取基地址。

在长模式下,您需要查看相关型号的特定寄存器。 如果您现在处于这种状态,那么不幸的是您已经超出了我的专业水平。