我尝试从用 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 ..gottpoff] 转换为 0xfffffffffffffff8,与 GCC 输出比较时看起来是正确的。NASM 正确地将 .tdata 部分标记为 THREAD_LOCAL。
我不知道这里出了什么问题......是否有任何额外的“设置”或我在尝试使用 TLS 数据时必须做的任何事情?
最佳答案
您没有说明如何组装和链接。我的 Crystal 球说你忘记链接 pthread
(即使用 -lpthread
)。如果你不想这样做,你必须自己设置 fs
(例如通过使用 arch_prctl(ARCH_SET_FS, .tdata)
)并完全管理所有线程相关的东西靠自己。
关于来自 NASM 代码的 Linux64 线程本地存储 (TLS) 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27206691/