Respostas:
Se você estiver executando no Linux, use objdump --debugging. Deve haver uma entrada para cada arquivo de objeto na biblioteca. Para arquivos de objeto sem símbolos de depuração, você verá algo como:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
Se houver símbolos de depuração, a saída será muito mais detalhada.
objdump -gnão me dá nada para um simples test.o compilado com e sem g, tornando-o efetivamente inútil. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22. nm -aparece ser mais útil.
O comando sugerido
objdump --debugging libinspected.a
objdump --debugging libinspected.so
me dá sempre o mesmo resultado pelo menos no Ubuntu / Linaro 4.5.2:
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
não importa se o arquivo / biblioteca compartilhada foi construído com ou sem -gopção
O que realmente me ajudou a determinar se -gfoi usada foi a ferramenta readelf :
readelf --debug-dump=decodedline libinspected.so
ou
readelf --debug-dump=line libinspected.so
Isso imprimirá um conjunto de linhas que consiste no nome do arquivo de origem, número da linha e endereço se tais informações de depuração estiverem incluídas na biblioteca , caso contrário, não imprimirá nada .
Você pode passar qualquer valor que achar necessário para a --debug-dumpopção em vez de decodedline.
O que ajudou é:
gdb mylib.so
Ele é impresso quando os símbolos de depuração não são encontrados:
Reading symbols from mylib.so...(no debugging symbols found)...done.
Ou quando encontrado:
Reading symbols from mylib.so...done.
Nenhuma das respostas anteriores estava dando resultados significativos para mim: libs sem símbolos de depuração estavam fornecendo muitos resultados, etc.
nm -a <lib> irá imprimir todos os símbolos da biblioteca, incluindo os de depuração.
Assim, você pode comparar as saídas de nm <lib>e nm -a <lib>- se forem diferentes, seu lib contém alguns símbolos de depuração.
nm -atem alias nm --debug-symsque é autoexplicativo :-).
diff <(nm <lib>) <(nm -a <lib>)para obter uma diferença fácil
No OSX você pode usar dsymutil -sedwarfdump .
Usando, dsymutil -s <lib_file> | morevocê verá os caminhos dos arquivos de origem em arquivos que possuem símbolos de depuração, mas apenas os nomes das funções.
dsymutil -s,? A existência de saída significa que foi construída com símbolos de depuração ou deve ser grepped?
Respostas sugerindo o uso de objdump --debuggingou readelf --debug-dump=...não funcionam no caso de as informações de depuração serem armazenadas em um arquivo separado do binário, ou seja, o binário contém uma seção de link de depuração . Talvez alguém possa chamar isso de bug emreadelf .
O código a seguir deve lidar com isso corretamente:
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
Consulte Arquivos de depuração separados no manual do GDB para obter mais informações.
obdjump -W libereadelf -w lib. O último é mais configurável - consulte a página de manual readelf (1).