gpt4 book ai didi

c++ - 如何在编译时获取 thread_local 变量的偏移量

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:46:41 27 4
gpt4 key购买 nike

在 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;
}

最佳答案

In my opinion there should be a macro or built_in in order to get it.

这样的宏实现起来并不容易/便宜。首先,您只能在编译可执行文件时确定此类偏移量,因为对于动态库,它将取决于库在加载它的可执行文件的依赖列表中的相对位置(如果通过 动态加载库,则甚至不在静态 TLS block 中) dlopen,因此无法通过 TCB 的常量偏移访问)。

现在,即使您尝试确定可执行文件中的偏移量,您也只能对可执行文件本身中的 thread_local 变量执行此操作,因为库的 thread_local 段的大小(及其偏移量)仅在程序中确定启动(这可能是因为加载库的版本可能比可执行文件链接的版本更新,因此 thread_local 段大小也可能不同)。

最后,即使对于可执行文件的变量,它也取决于链接期间目标文件和静态/动态库的相对顺序,因此您需要静态链接器中的特殊支持来计算偏移量。

您可能会建议 Binutils 开发人员考虑添加一个链接时重定位来计算可执行文件中的 thread_local 偏移量,或者甚至在一般情况下添加一个运行时重定位来计算 thread_local,但他们需要有令人信服的用例来考虑这样的提议。

作为穷人的解决方法,您可以将代码编译两次并从 symtab 中提取偏移量:

$ readelf -sW tmp.o | awk '/TLS/{print $8 " " $2}'
yyy 0000000000000000
xxx 0000000000000004

关于c++ - 如何在编译时获取 thread_local 变量的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36936991/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com