es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Convención de nombres de símbolos en libstdc++

Durante la construcción de una biblioteca recibí el siguiente error de “referencia indefinida”:

libtbb.so.2: referencia indefinida a `__cxa_init_primary_exception@CXXABI_1.3.11′

Cuando revisé los símbolos en mi biblioteca libstdc++, vi lo siguiente:

nm -CD libstdc++.so.6.0.24 | grep “__cxa_init_primary_exception”
000000000008fdd8 T __cxa_init_primary_exception@@CXXABI_1.3.11

Entonces, la única diferencia entre el nombre del símbolo en libstdc++.so y lo que parece requerir libtbb.so es un “@” adicional en el nombre del símbolo. Aún más interesante, si escribo:

nm -C libtbb.so.2 | grep “__cxa_init_primary_exception”
U __cxa_init_primary_exception@@CXXABI_1.3.11

Veo que libtbb requiere un símbolo que en realidad incluye dos “@”. ¿Cuál es el motivo detrás de esta convención de nombres y por qué el enlazador busca un nombre de símbolo con solo un “@”?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El doble @ en el nombre del símbolo __cxa_init_primary_exception@@CXXABI_1.3.11 es resultado de la decoración de nombres, que es un proceso utilizado por los compiladores para codificar los nombres de los símbolos en un ejecutable o biblioteca. Esto se hace para admitir características como la sobrecarga y los espacios de nombres en C++.

    El enlazador está buscando un nombre de símbolo con solo un @ porque está buscando el nombre sin codificar (o “externo”) del símbolo, mientras que el símbolo en libtbb.so.2 está utilizando el nombre codificado (o “interno”).

    Es posible que la versión o implementación de la ABI (Interfaz Binaria de Aplicación) de C++ utilizada por libtbb.so.2 requiera el uso del nombre de símbolo codificado con dos @, mientras que libstdc++.so.6.0.24 utiliza el nombre externo con solo un @.

    Para resolver el error de “referencia no definida”, podrías intentar enlazar con una versión diferente de libstdc++ o encontrar una versión de libtbb compatible con la versión de libstdc++ que estás utilizando. Alternativamente, es posible que necesites ajustar tu sistema de compilación o la configuración del compilador para generar los nombres de símbolos correctos para la versión de ABI utilizada por libtbb.

Comments are closed.