2011-10-25 9 views
7

Oh, soy un novato en GCC y MAC y Makefile. Hoy tenía la intención de construir una librería dinámica utilizando Mac OS X y GCC 4.4.2, pero al vincular los archivos .o, el compilador se queja así:¿Qué es el símbolo "___emutls_get_address"?

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

Googled esta información, pero no puede entender Bien, me pregunto qué significa el símbolo y por qué muchos programas tienen este error de vinculación. 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 
+0

No debería necesitar vincular explícitamente '-lstdC++', g ++ debe seleccionar la correcta. Intenta eliminar eso. – Mat

Respuesta

5

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

Uso de hilo de almacenamiento local (por ejemplo, variables de OpenMP threadprivate) en Darwin requiere que une manualmente a emutls TLS, ya sea a través -lgcc_s.so.1 o -lgcc_eh

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

De los hilos de arriba, esto es evidentemente un desastre. Sin embargo, como estaba solo poco por esto, espero que sea ú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.

Por lo tanto, 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.

+0

He intentado estas dos bibliotecas, y la primera no encontrada. Después de usar el segundo, ahora se puede encontrar el símbolo emutls, pero GCC continúa quejándose de que el "direccionamiento absoluto (quizás -dinámico-no-pic) usado en _DescRetire de michael.o no está permitido en la imagen deslizable. Use '-read_only_relocs suprimir 'para habilitar reliquias de texto', todavía no tengo una idea al respecto. – JustQieTry

+1

JustQieTry, creo que esto es de la opción '-fno-pic'. intenta recompilar tu proyecto sin esta opción. Usted intenta compilar la biblioteca .so y cualquier biblioteca dinámica debe compilarse en el modo -fpic. – osgx

+0

Si -fpic está activado, hay otro problema, se queja de que "no se puede encontrar un registro en la clase 'BREG' mientras se recarga 'asm'", busqué en Google y encuentro que para mac, el -fpic está activado por defecto, así que lo apago ....... ¿eso está mal? – JustQieTry

Cuestiones relacionadas