2012-01-09 21 views
16

Soy consciente de this question, pero no parece funcionar para mí.¿Cómo vincular contra las versiones de depuración de libc y libstdC++ en GCC?

Para la configuración, echar un sencillo programa en C++, hw.cpp, dada por: int main() { }

Al compilar con g++ -o hw hw.cpp -O0 -g en Linux, corriendo ldd ./hw da:

linux-gate.so.1 => (0x003e5000) 
    libstdc++.so.6 => /usr/local/lib/libstdc++.so.6 (0x007c5000) 
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x006a4000) 
    libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 (0x00a40000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00a93000) 
    /lib/ld-linux.so.2 (0x00a0f000) 

Ahora también parecen tener bibliotecas de depuración en /usr/lib/debug/lib/tls/i686/cmov/, que imagino son las compilaciones de depuración correspondientes de las bibliotecas del sistema.

Pregunta: ¿Cómo puedo compilar mi programa para que se vincula en contra de la versiones de depuración de las bibliotecas estándar de C y/o C++, libc/libm/libstdc++, compartido o estática? Para la compilación compartida, quiero que la salida de ldd ./hw apunte al directorio de depuración.

(Antecedentes: Una de las bibliotecas compartidas que se utiliza por mi proyecto se indica como fugas ("todavía alcanzable") por Valgrind, pero los orígenes no están en la biblioteca compartida en sí, sino en el código de tipo dlopen (see here ..) Así que pensé que si yo puedo recorrer el _Start() invocación en el CRT que podría ser capaz de rastrear el culpable)

actualización/corrección: Creo que estaba muy, muy estúpida - la depuración las bibliotecas probablemente siempre se han vinculado como se desea desde el principio. Estaba confundido por el depurador que no muestra nada mientras paso, que es porque no tengo el código fuente para las bibliotecas.

Actualización II: OK, asegure la actualización anterior. Tengo las fuentes de la biblioteca ahora, pero si bien es cierto que la biblioteca estándar se envía con los símbolos de depuración , no parece tener una depuración separada compilación. ¿Está disponible una versión de este tipo, y cómo podría vincularla?

+1

¿Probablemente sepa que algunas implementaciones de bibliotecas estándar usan pools para la asignación rápida? http://valgrind.org/docs/manual/faq.html#faq.undeferrors –

+0

@honk: Estoy completamente feliz de aceptar que esto no es una preocupación genuina. Me molesta que el código de un tercero pueda causar advertencias en el código * my * (tenga en cuenta que solo hay referencias a algunos espurios '.c' archivos que en realidad no tengo, * no * a una biblioteca compartida) que parece que no puedo suprimir ... Al menos con un depurador CRT espero verlo mejor. –

Respuesta

9

En muchas instalaciones de Linux, las bibliotecas de depuración no contienen código real; solo contienen la información de depuración. Los dos están separados para que pueda elegir no instalarlos si no los necesita y le falta espacio en el disco, pero las bibliotecas de depuración no son buenas por sí mismas.

GDB normalmente está preconfigurado para encontrar las bibliotecas de depuración cuando las necesita.

Por supuesto, su sistema puede ser diferente. No dices lo que es.

+0

Tienes razón, de hecho me vinculé con las bibliotecas de depuración desde el principio. Me sorprendió lo más estúpido, es decir, que no tengo el código fuente * de la biblioteca estándar, así que el depurador estaba entrando, ¡pero no podía mostrar nada! –

+0

De hecho, eso no ayuda, después de todo, no solo quiero los símbolos de depuración, sino una depuración * compilación * de la biblioteca. ¿Está disponible en Debian/Ubuntu? –

+0

No suele ser así. Tiene toda la razón en que las bibliotecas optimizadas normales son un problema si quiere acceder al código de la biblioteca. Por supuesto, si solo desea una biblioteca específica, entonces puede reconstruirla usted mismo. 'sudo apt-get build-dep nombre-de-paquete' instalará todo lo que necesite para hacer la compilación, y los paquetes de origen se pueden descargar con' apt-get source package-name'. – ams

0

Su programa se vincula a las bibliotecas de depuración.

Solo el 'ldd ./hw' encuentra el libstdC++ en la ubicación estándar. Para eso necesita cambiar LD_LIBRARY_PATH para que las bibliotecas compartidas de depuración carguen e ldd las encuentren correctamente.

+0

Eso tampoco funciona para mí. He intentado varias variaciones de configuración de esa variable, pero 'ldd' no cambia. Sé que la configuración 'LD_LIBRARY_PATH' funciona de esa manera, ya que funciona bien con otras bibliotecas (que no sean del sistema) ... ¿o está diciendo que' ldd' * nunca * informará la biblioteca de depuración? –

+0

@KerrekSB: ¿Lo intentó (asumiendo bash): 'LD_LIBRARY_PATH =/usr/lib/debug/lib/tls/i686/cmov/ldd./Hw' –

+0

@LokiAstari: Sí, lo intenté también ... en vano . –

Cuestiones relacionadas