簡體   English   中英

LD_PRELOAD和線程局部變量

[英]LD_PRELOAD and thread local variable

我有一個共享庫(libtest.cpp)和一個簡單的程序(test.cpp)。 我希望他們共享一個線程局部變量gVar 共享庫通過LD_PRELOAD鏈接。

這是我的共享庫libtest.cpp的代碼:

#include<stdio.h>

__thread int gVar;

void print_gVar(){
  printf("%d\n", 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(成功)。

如果我將gVar中的extern__attribute__((weak))添加到gVar的聲明中,則會出現分段錯誤。

我想LD_PRELOAD__thread一定有問題。 但我無法弄清楚。

誰能告訴我如何讓它發揮作用? 非常感謝你!

這是不可能的,因為線程本地存儲需要每線程初始化。

LD_PRELOAD甚至會在加載標准庫之前加載庫,這會混淆TLS初始化。

更新:

請閱讀ELF處理線程局部存儲的第2節和第3節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM