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

标签 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]                 ; 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/

相关文章:

c++ - 奇怪 - mysql 的 sql::SQLException 未被其类型捕获,而是被捕获为 std::exception 并成功投回

c - 执行 fork() 时在某些内存页上禁用写时复制(COW)

java - 找出每个线程中 hibernate 的确切时间

go - 如何使用汇编优化这个 8 位位置 popcount?

iphone - 在 iPhone 上编写 ARM 汇编代码的工作流程

linux - 无法连接到多线程 CURL 中的主机(错误 7)mipsel-linux mipsel 多核架构师

linux - 为系统文件创建和使用 Mercurial 存储库

swift 调度队列 : Serial or parallel

c++ - std::condition_variable 多次调用 notify_all

c - 程序集编号的正则表达式