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.

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.


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.


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.


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.


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.


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.

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.