Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自NASM代码的Linux64线程本地存储(TLS)数据_Linux_Multithreading_Assembly_Nasm_X86 64 - Fatal编程技术网

来自NASM代码的Linux64线程本地存储(TLS)数据

来自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]

我尝试从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]                 ; 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做与线程相关的工作。