Como posso saber se uma biblioteca foi compilada com -g?

103

Tenho algumas bibliotecas compiladas em x86 Linux e quero determinar rapidamente se elas foram compiladas com símbolos de depuração.

Dan Hook
fonte

Respostas:

85

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.

Matt McClellan
fonte
5
Existem também obdjump -W libe readelf -w lib. O último é mais configurável - consulte a página de manual readelf (1).
przemoc
3
Para qualquer binário, (incluindo aqueles compilados com -g) objdump me dá a resposta de "nenhuma informação de depuração reconhecida" a menos que eu o compile com -gstabs. Este parece ser um bug reconhecido.
Dan Hook
Dan, em qual plataforma você tentou isso?
swegi de
Russo empregado: do man objdump (1), o sinalizador --debugging "tenta analisar as informações do formato de depuração STABS e IEEE armazenadas no arquivo e imprimi-lo usando uma sintaxe semelhante ao C. Se nenhum desses formatos for encontrado, esta opção retrocede na opção -W para imprimir qualquer informação DWARF no arquivo. "
Matt McClellan
5
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.
jw013 de
89

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.

Alex InTechno
fonte
1
funciona perfeitamente. Tentei este comando no meu executável primeiro com CMAKE_BUILD_TYPE RELEASE e o comando retornou vazio. Então eu tentei com CMAKE_BUILD_TYPE DEBUG e então houve uma grande quantidade de saída.
infocalizado em
32

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.

Velkan
fonte
THX! Isso funcionou para mim, usando o compilador clang no Android com cmake :)
Pär Nils Amsen
super ótimo para uma verificação rápida! também funciona em arquivos de objeto * .o.
Stephane Rolland
28

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.

qrdl
fonte
3
@Employed Russian Você pode explicar melhor sobre isso? Por que você acha que é uma ferramenta errada? Ele faz o trabalho e também no Linux.
qrdl
Mesmo para Linux embutido baseado no kernel 2.6.35, xxx-objdump, xxx-nm funciona bem.
agfe2 de
nm -atem alias nm --debug-symsque é autoexplicativo :-).
pevik,
3
Basta digitar diff <(nm <lib>) <(nm -a <lib>)para obter uma diferença fácil
Aᴄʜᴇʀᴏɴғᴀɪʟ
17

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.

Glennr
fonte
11
Você pode fornecer uma explicação sobre o que procurar na saída de, por exemplo dsymutil -s,? A existência de saída significa que foi construída com símbolos de depuração ou deve ser grepped?
Mitch
12

Você pode usar objdump para isso.

EDIT: Da página man:

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

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.

ack
fonte