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

Ale*_*x B 8 linux x86 assembly x86-64

有了这个功能:

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

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

nin*_*alj 9

这段代码:

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

返回一个线程局部变量的地址.%fs:0x0是TCB(线程控制块)的地址,并且1069833(%rip)是从那里到变量的偏移量,这是已知的,因为变量驻留在程序中或者在程序加载时加载的某个动态库上(在运行时通过dlopen()需要加载的库)一些不同的代码).

这在Ulrich Drepper的TLS文档中有详细解释,特别是§4.3和§4.3.6.