gcc detecta símbolos/funciones duplicados en bibliotecas estáticas

2 minutos de lectura

¿Hay alguna forma en que podamos hacer que gcc detecte un símbolo duplicado en bibliotecas estáticas frente al código principal (¿u otra biblioteca estática?)

Aquí está la situación:

main.c contenía erróneamente una definición de función, por ejemplo, con la firma uint foohash(const char*)

foo.c también contiene una definición de función con la firma uint foohash(const char*)

foo.c y otros archivos fuente se compilan en una biblioteca de utilidad estática, a la que se vincula el programa principal, es decir, algo como:

 gcc -o main main.o util.o -L ./libs -lfooutils

Entonces, ahora main.o y libs/libfooutils.a contienen una función foohash. Presumiblemente, el enlazador encontró ese símbolo en main.o y no se molesta en buscarlo en otro lugar.

¿Hay alguna manera de que podamos hacer que gcc detecte tal situación?

  • @Joachim Pileborg, el “Presumiblemente” tenía la intención de transmitir el motivo por el cual gcc tomó el símbolo de main.o, ya sé cuál de los dos está vinculado. Pero de todos modos, de eso no se trata la pregunta.

    usuario964970

    1 de febrero de 2012 a las 12:25

gcc detecta simbolosfunciones duplicados en bibliotecas estaticas
asesino de pollos

De hecho, como dijo Simon Richter, --whole-archive La opción puede ser útil. Intente cambiar su línea de comando a:

 gcc -o main main.o util.o -L ./libs -Wl,--whole-archive -lfooutils -Wl,--no-whole-archive

y verá un error de definición múltiple.

  • ¿Hay un equivalente con sonido metálico? ld: opción desconocida: –whole-archive (Apple LLVM versión 8.1.0)

    – moof2k

    5 de mayo de 2017 a las 1:40

  • @moof2k Prueba -all_load

    – vmonteco

    12 de junio de 2017 a las 11:21

gcc llama al ld programa para enlazar. Lo relevante ld las opciones son:

--no-define-common
--traditional-format
--warn-common

Vea la página del manual para ld. Esto debería ser con lo que necesita experimentar para obtener las advertencias buscadas.

  • En línea con esta respuesta, agregué -Wl,--warn-common -Wl,--fatal-warnings a mis argumentos de GCC. Funcionó de maravilla.

    – Boinst

    25 de enero de 2013 a las 0:00

Respuesta corta: no.

GCC en realidad no hace nada con las bibliotecas. es tarea de ldel enlazador (llamado automáticamente por GCC) para extraer símbolos de las bibliotecas, y esa es realmente una herramienta bastante tonta.

El enlazador tiene muchos trucos complejos para combinar diferentes tipos de datos de diferentes fuentes y admitir diferentes formatos de archivo, y todos los pequeños detalles malvados de los ejecutables binarios, pero al final, todo lo que realmente hace es buscar símbolos indefinidos y encontrar las definiciones

Lo que puede hacer es rastrear un enlace (pasar -t a gcc) para ver qué viene de dónde. O bien corre nm en todos los archivos de objetos y bibliotecas en su sistema, y ​​escriba un script para detectar duplicados.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad