LD_PRELOAD et variable locale de thread

J’ai une bibliothèque partagée (libtest.cpp) et un programme simple (test.cpp). Je veux qu’ils partagent une variable locale de thread gVar . La bibliothèque partagée est liée via LD_PRELOAD.

Voici mon code pour la bibliothèque partagée libtest.cpp:

#include __thread int gVar; void print_gVar(){ printf("%d\n", gVar); } 

Voici le code pour test.cpp.

 #include __thread int gVar; void __atsortingbute__((weak)) print_gVar(); int main(){ gVar = 10; print_gVar(); return 0; } 

Et j’utilise le script suivant pour les comstackr et les exécuter.

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

Le résultat attendu est 10 car l’atsortingbution dans test.cpp affectera la gVar dans libtest.cpp. Cependant, je n’ai que 0. Il semble que le gVar dans libtest.cpp et le gVar dans test.cpp ne sont pas liés.

J’ai fait des tests supplémentaires:

Si j’ajoute __atsortingbute__((weak)) à la déclaration de gVar dans l’un des fichiers, la sortie est toujours 0.

Si je supprime __thread des deux fichiers, le résultat est 10 (réussi).

Si j’ajoute extern et __atsortingbute__((weak)) à la déclaration de gVar dans libtest.cpp, il y aura une erreur de segmentation.

Je suppose que quelque chose ne va pas avec LD_PRELOAD et __thread . Mais je ne peux pas comprendre.

Quelqu’un pourrait-il me dire comment je peux le faire fonctionner? Merci beaucoup!

Ce n’est pas possible, car le stockage local de thread nécessite une initialisation par thread.

LD_PRELOAD chargera la bibliothèque avant même que la bibliothèque standard ne soit chargée, ce qui perturbe l’initialisation de TLS.

Mettre à jour:

Veuillez lire les sections 2 et 3 de ELF Handling For Thread-Local Storage