C 如何在Linux内核中解决线程本地存储偏移?

C 如何在Linux内核中解决线程本地存储偏移?,c,assembly,linux-kernel,x86-64,thread-local-storage,C,Assembly,Linux Kernel,X86 64,Thread Local Storage,我正在学习线程本地存储及其在Linux内核中的使用。我知道它允许存储每个线程的数据。例如,访问当前任务结构时就是这种情况 我发现在我的x86_64体系结构中,这是通过使用全局段%gs来完成的。我的问题是:GCC如何解析这个全局段的地址,即它如何将.ko中的mov-rax,QWORD-PTR-gs:0转换为编译对象中的mov-rax,QWORD-PTR-gs:0x17d80?该.ko是编译对象。gs前缀是显式发出的,其余的只是普通的符号重定位。例如,从运行objdump-dr amdgpu.ko中

我正在学习线程本地存储及其在Linux内核中的使用。我知道它允许存储每个线程的数据。例如,访问当前任务结构时就是这种情况

我发现在我的x86_64体系结构中,这是通过使用全局段%gs来完成的。我的问题是:GCC如何解析这个全局段的地址,即它如何将.ko中的mov-rax,QWORD-PTR-gs:0转换为编译对象中的mov-rax,QWORD-PTR-gs:0x17d80?

该.ko是编译对象。gs前缀是显式发出的,其余的只是普通的符号重定位。例如,从运行objdump-dr amdgpu.ko中摘录:

R_X86_64_32S只是一个标准符号重定位,它将由内核模块加载程序解决。代码中已经存在gs前缀。

编译对象是.ko。gs前缀是显式发出的,其余的只是普通的符号重定位。例如,从运行objdump-dr amdgpu.ko中摘录:


R_X86_64_32S只是一个标准符号重定位,它将由内核模块加载程序解决。gs前缀已经存在于代码中。

Windows使用gs作为线程信息。Linux是吗?gcc不进行重新定位。这是由链接器完成的。Windows使用gs作为线程信息。Linux是吗?gcc不进行重新定位。这是由链接器完成的。
12b51:       65 48 8b 14 25 00 00    mov    %gs:0x0,%rdx
12b58:       00 00 
                    12b56: R_X86_64_32S     current_task