Tengo una biblioteca compartida (libtest.cpp) y un programa simple (test.cpp). Quiero que compartan una variable local de hilo gVar . La biblioteca compartida está vinculada a través de LD_PRELOAD.
Aquí está mi código para la biblioteca compartida libtest.cpp:
#include<stdio.h> __thread int gVar; void print_gVar(){ printf("%d\n", gVar); }A continuación se muestra el código para test.cpp.
#include<stdio.h> __thread int gVar; void __attribute__((weak)) print_gVar(); int main(){ gVar = 10; print_gVar(); return 0; }Y uso el siguiente script para compilarlos y ejecutarlos.
g++ -g -shared -fPIC -olibtest.so libtest.cpp g++ -g -fPIC -o test test.cpp LD_PRELOAD=./libtest.so ./testEl resultado esperado es 10 porque la asignación en test.cpp afectará el gVar en libtest.cpp. Sin embargo, solo obtuve 0. Parece que gVar en libtest.cpp y gVar en test.cpp no están vinculados.
Hice algunas pruebas adicionales:
Si agrego __attribute__((weak)) a la declaración de gVar en cualquiera de los archivos, el resultado sigue siendo 0.
Si __thread de ambos archivos, el resultado es 10 (correcto).
Si agrego extern y __attribute__((weak)) a la declaración de gVar en libtest.cpp, habrá una falla de segmentación.
Supongo que debe haber algo mal con LD_PRELOAD y __thread . Pero no puedo descifrarlo.
¿Alguien podría decirme cómo puedo hacer que funcione? ¡Muchos gracias!
Esto no es posible, ya que el almacenamiento local de subprocesos requiere una inicialización por subproceso.
LD_PRELOAD cargará la biblioteca incluso antes de que se cargue la biblioteca estándar, lo que arruina la inicialización de TLS.
Actualizar:
Lea las secciones 2 y 3 de Manejo de ELF para almacenamiento local de subprocesos