来自NASM代码的Linux64线程本地存储(TLS)数据
我尝试从NASM汇编程序中编写的ELF64二进制文件中访问线程本地存储数据。数据访问上的故障。代码如下:来自NASM代码的Linux64线程本地存储(TLS)数据,linux,multithreading,assembly,nasm,x86-64,Linux,Multithreading,Assembly,Nasm,X86 64,我尝试从NASM汇编程序中编写的ELF64二进制文件中访问线程本地存储数据。数据访问上的故障。代码如下: global _start global a section .tdata a dq 59 section .text _start: mov rax,[rel a wrt ..gottpoff] ; As in NASM documentation mov rcx,[fs:rax]
global _start
global a
section .tdata
a dq 59
section .text
_start:
mov rax,[rel a wrt ..gottpoff] ; As in NASM documentation
mov rcx,[fs:rax] ; This will crash
; Exit process
mov rax,231
syscall
fs:rax访问错误。“rel a wrt..gottoff]转换为0xFFFFFFFFFFF8,与GCC输出进行比较时,它看起来是正确的。NASM将.tdata部分正确标记为THREAD_LOCAL
我不知道这里出了什么问题……在尝试使用TLS数据时,是否有其他“设置”或我必须执行的任何操作?您没有演示如何组装和链接。我的水晶球显示您忘记了链接
pthread
(即使用-lphread
)。如果您不想这样做,您必须自己设置fs
(例如,通过使用arch\u prctl(arch\u set\u fs.tdata)
)并完全自己管理所有与线程相关的内容。谢谢,arch\u prctl()实现了这一点,尽管我尝试了mmap()然后可以在fs:0访问ed页面。也许只是将线程堆栈的高端作为arch_prctl()输入重用——因为我不想浪费整个页面——也可能很好,必须尝试一下。是的,我使用lpthread/libc做与线程相关的工作。