ld_preload和线程本地变量

LD_PRELOAD and thread local variable

本文关键字:变量 线程 preload ld      更新时间:2023-10-16

我有一个共享库(libtest.cpp)和一个简单的程序(test.cpp)。我希望他们共享线程本地变量 gvar 。共享库通过ld_preload链接。

这是我共享库libtest.cpp的代码:

#include<stdio.h>
__thread int gVar;
void print_gVar(){
  printf("%dn", gVar);
}

以下是test.cpp的代码

#include<stdio.h>
__thread int gVar;
void __attribute__((weak)) print_gVar();
int main(){
  gVar = 10;
  print_gVar(); 
  return 0;
}

我使用以下脚本来编译和运行它们。

g++ -g -shared -fPIC -olibtest.so libtest.cpp
g++ -g -fPIC -o test test.cpp
LD_PRELOAD=./libtest.so ./test

预期的结果为10,因为test.cpp中的分配会影响libtest.cpp中的gvar。但是,我只得到0。似乎libtest.cpp中的gvar和test.cpp中的gvar中没有链接。

我做了一些其他测试:

如果我将__attribute__((weak))添加到任何文件中的gVar声明中,则输出仍然为0。

如果我从两个文件中删除__thread,则结果为10(成功)。

如果我将 extern__attribute__((weak))添加到libtest.cpp中的 gVar声明中,则会有分段故障。

我猜LD_PRELOAD__thread必须有问题。但是我不知道。

有人可以告诉我如何使它起作用吗?非常感谢!

这是不可能的,因为线程 - 本地存储需要人均初始化。

LD_PRELOAD甚至在加载标准库之前加载库,这使TLS初始化混乱。

更新:

请阅读Elf处理的第2节和第3节以进行线程 - 本地存储