【发布时间】:2016-08-24 12:51:02
【问题描述】:
在linux下使用gcc,我正在寻找一种方法来获取线程本地变量相对于线程本地存储区域的偏移量。 该偏移量包含在编译的目标文件中。 在我看来,应该有一个宏或 built_in 来获取它。
在运行时给出的代码如下代码所示。我需要的是在编译时获得该常量。
#include <iostream>
#include <thread>
thread_local int x;
template<typename T>
intptr_t getOffset(T& t){
return (intptr_t)&t-(intptr_t)pthread_self();
}
int main(int argc, char **argv)
{
std::cout<<"offset:"<<getOffset<int>(x)<<std::endl;
}
【问题讨论】:
-
根据the ELF thread-local storage spec,偏移量直到运行时才确定,因为它取决于模块加载的顺序和特定于体系结构的 TCB 的大小(在编译时不知道,因为你可以在不同版本的操作系统上运行二进制文件,每个版本都有不同的 TCB)。
-
@RaymondChen 通过添加一些乘法指令后编译的文件的 objdump ,我从转储中清楚地看到在编译代码中指定了偏移量(在这种情况下是 -4 )。因此,在特定情况下,它在编译时是已知的。因此,在这种情况下,二进制文件只有一个解释 40153d: 64 8b 14 25 fc ff ff mov %fs:0xfffffffffffffffc,%edx 401544: ff 401545: 64 8b 04 25 fc ff ff mov %fs:0xffffffffffffffc,%eax 40154c:
-
@RaymondChen 我怀疑他在某些情况下可能能够依赖这个偏移量(见我的回答)。不过,这并不能证明对编译器的完全支持是合理的。
标签: c++ gcc thread-local