¿Cómo puedo saber si una biblioteca se compiló con -g?

103

Tengo algunas bibliotecas compiladas en x86 Linux y quiero determinar rápidamente si se compilaron con símbolos de depuración.

Dan Hook
fuente

Respuestas:

85

Si está ejecutando en Linux, use objdump --debugging. Debe haber una entrada para cada archivo de objeto en la biblioteca. Para archivos de objeto sin símbolos de depuración, verá algo como:

objdump --debugging libvoidincr.a
In archive libvoidincr.a:

voidincr.o:     file format elf64-x86-64

Si hay símbolos de depuración, la salida será mucho más detallada.

Matt McClellan
fuente
5
También hay obdjump -W liby readelf -w lib. El último es más configurable: consulte la página de manual de readelf (1).
przemoc
3
Para cualquier binario, (incluidos los compilados con -g) objdump me da la respuesta de "no hay información de depuración reconocida" a menos que lo compile con -gstabs. Este parece ser un error reconocido.
Dan Hook
Dan, ¿en qué plataforma probaste esto?
Swegi
Ruso empleado: de man objdump (1), el indicador --debugging "intenta analizar la información del formato de depuración STABS e IEEE almacenada en el archivo e imprimirla usando una sintaxis similar a C. Si no se encuentra ninguno de estos formatos, esta opción retrocede en la opción -W para imprimir cualquier información DWARF en el archivo ".
Matt McClellan
5
objdump -gno me da nada para una prueba simple. o compilado con y sin g, lo que lo hace efectivamente inútil. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22. nm -aparece ser más útil.
jw013
89

El comando sugerido

objdump --debugging libinspected.a
objdump --debugging libinspected.so

siempre me da el mismo resultado al menos en Ubuntu / Linaro 4.5.2:

libinspected.a:     file format elf64-x86-64
libinspected.so:     file format elf64-x86-64

no importa si el archivo / biblioteca compartida se creó con o sin -gopción

Lo que realmente me ayudó a determinar si -gse usó es la herramienta readelf :

readelf --debug-dump=decodedline libinspected.so

o

readelf --debug-dump=line libinspected.so

Esto imprimirá un conjunto de líneas que consta de nombre de archivo de origen, número de línea y dirección si dicha información de depuración se incluye en la biblioteca ; de lo contrario, no imprimirá nada .

Puede pasar cualquier valor que considere necesario para la --debug-dumpopción en lugar de decodedline.

Alex InTechno
fuente
1
funciona perfectamente. Probé este comando en mi ejecutable con el primer CMAKE_BUILD_TYPE RELEASE y el comando regresó vacío. Luego probé con CMAKE_BUILD_TYPE DEBUG y luego hubo bastante salida.
infoclogged
32

Lo que ayudó es:

gdb mylib.so

Se imprime cuando no se encuentran los símbolos de depuración:

Reading symbols from mylib.so...(no debugging symbols found)...done.

O cuando se encuentra:

Reading symbols from mylib.so...done.

Ninguna de las respuestas anteriores me dio resultados significativos: las bibliotecas sin símbolos de depuración estaban dando muchos resultados, etc.

Velkan
fuente
¡Gracias! Esto funcionó para mí, usando el compilador clang en Android con cmake :)
Pär Nils Amsen
super genial para una comprobación rápida! también funciona en archivos de objeto * .o.
Stephane Rolland
28

nm -a <lib> imprimirá todos los símbolos de la biblioteca, incluidos los de depuración.

Entonces puede comparar las salidas de nm <lib>y nm -a <lib>, si difieren, su lib contiene algunos símbolos de depuración.

qrdl
fuente
3
@Empleado ruso ¿Podría dar más detalles sobre esto? ¿Por qué cree que es una herramienta incorrecta? Hace el trabajo y también lo hace en Linux.
qrdl
Incluso para Linux embebido basado en el kernel 2.6.35, xxx-objdump, xxx-nm funciona bien.
agfe2
nm -atiene un alias nm --debug-symsque se explica por sí mismo :-).
pevik
3
Simplemente escriba diff <(nm <lib>) <(nm -a <lib>)para obtener una diferencia fácil
Aᴄʜᴇʀᴏɴғᴀɪʟ
17

En OSX puede usar dsymutil -sy dwarfdump.

Al usar dsymutil -s <lib_file> | more, verá las rutas de los archivos de origen en los archivos que tienen símbolos de depuración, pero solo los nombres de las funciones.

Glennr
fuente
11
¿Puede proporcionar una descripción detallada sobre qué buscar en la salida de, por ejemplo dsymutil -s,? ¿La existencia de la salida significa que se construyó con símbolos de depuración o debería ser grepped?
Mitch
12

Puede usar objdump para esto.

EDITAR: Desde la página de manual:

-W
--dwarf
Displays  the  contents of the DWARF debug sections in the file, if
any are present.
swegi
fuente
6

Las respuestas que sugieren el uso de objdump --debuggingo readelf --debug-dump=...no funcionan en el caso de que la información de depuración se almacene en un archivo separado del binario, es decir, el binario contiene una sección de enlace de depuración . Quizás se podría llamar a eso un error readelf.

El siguiente código debería manejar esto correctamente:

# Test whether debug information is available for a given binary
has_debug_info() {
  readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}

Consulte Archivos de depuración separados en el manual de GDB para obtener más información.

ack
fuente