macos gcc linker undefined-symbol

macos - ¿Qué es el símbolo "___emutls_get_address"?



gcc linker (1)

Oh, soy un novato en GCC y MAC y Makefile. Hoy tuve la intención de construir una lib dinámica utilizando MAC OS X y GCC 4.4.2, pero cuando se vinculan los archivos .o, el compilador se queja así:

Undefined symbols: "___emutls_get_address", referenced from: _malloc in michael.o _malloc in michael.o ld: symbol(s) not found

Busqué en Google esta información, pero no puedo entender bien los resultados, me pregunto qué significa el símbolo y por qué muchos programas tienen este error de enlace. También me pregunto cuál es la posible causa de este error, el comando de enlace es:

g++ -Dx86 -D_GNU_SOURCE -D_REENTRANT -Wall -m32 / -fno-strict-aliasing -fno-pic -O3 -ggdb / michael.o malloc_new.o -o libmichael.so / -lpthread -lm -lstdc++ -shared


Este símbolo es parte de la emulación TLS (almacenamiento local de subprocesos) de gcc para Mac Os X. Hay algunos errores en gnc bugzilla al respecto, por ejemplo: http://gcc.gnu.org/bugzilla/show_bug.cgi?id= 39888

El uso de almacenamiento local de subprocesos (por ejemplo, variables OpenMP ThreadPrivate) en Darwin requiere el enlace manual a emutls TLS, a través de -lgcc_s.so.1 o -lgcc_eh

Ver los hilos: http://gcc.gnu.org/ml/gcc/2008-12/msg00145.html http://gcc.gnu.org/ml/gcc/2008-12/msg00107.html

De los hilos anteriores, esto es evidentemente un desastre. Sin embargo, como estaba solo por esto, esperaba que fuera útil tener un error para rastrear el problema.

...

TLS funciona bien si me enlace manualmente a gcc_s.so.1 o gcc_eh como se mencionó anteriormente.

Entonces, una de las posibles soluciones es agregar la opción -lgcc_s.so.1 o -lgcc_eh al paso de enlace. Y otra es actualizar su gcc, porque este es un error de gcc.