¿Cómo puedo saber si una biblioteca fue compilada con-g?
debugging gdb (7)
El comando sugerido
objdump --debugging libinspected.a
objdump --debugging libinspected.so
me da siempre 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 / la biblioteca compartida se creó con o sin la opción -g
Lo que realmente me ayudó a determinar si se usó -g
es readelf herramienta readelf :
readelf --debug-dump=decodedline libinspected.so
o
readelf --debug-dump=line libinspected.so
Esto imprimirá un conjunto de líneas que consiste en el nombre del archivo fuente, el número de línea y la dirección si dicha información de depuración está incluida en la biblioteca , de lo contrario no imprimirá nada .
Puedes pasar cualquier valor que encuentres necesario para la opción --debug-dump
lugar de decodedline
.
Tengo algunas librerías compiladas en x86 Linux y quiero determinar rápidamente si fueron compiladas con símbolos de depuración.
En OSX puedes usar dsymutil -s
y dwarfdump
.
Las respuestas que sugieren el uso de objdump --debugging
o 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 uno podría llamar a eso un error en readelf
.
El siguiente código debe 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 Separate Debug Files en el manual de GDB para obtener más información.
Lo que ayudó fue:
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 estaba dando resultados significativos para mí: las librerías sin símbolos de depuración daban muchos resultados, etc.
Puedes 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.
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.
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.