Jak mogę sprawdzić, czy biblioteka została skompilowana za pomocą opcji-g?

Mam kilka skompilowanych bibliotek na Linuksie x86 i chcę szybko ustalić, czy były one skompilowane z symbolami debugowania.

Author: Vadim Kotov, 2010-01-04

7 answers

Jeśli używasz Linuksa, użyj objdump --debugging. Dla każdego pliku Obiektowego w bibliotece powinien znajdować się wpis. Dla plików obiektowych bez debugowania symboli, zobaczysz coś w stylu:

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

voidincr.o:     file format elf64-x86-64

Jeśli istnieją symbole debugowania, wyjście będzie znacznie bardziej wyraziste.

 62
Author: Matt McClellan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 11:09:45

Sugerowane polecenie

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

Daje mi zawsze taki sam wynik przynajmniej na Ubuntu / Linaro 4.5.2:

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

Bez względu na to, czy archiwum/biblioteka współdzielona została zbudowana z opcją -g

To, co naprawdę pomogło mi ustalić, czy -g zostało użyte, to readelf Narzędzie:

readelf --debug-dump=decodedline libinspected.so

Lub

readelf --debug-dump=line libinspected.so

To wyświetli zestaw wierszy składający się z nazwy pliku źródłowego, numeru linii i adresu , jeśli takie informacje o debugowaniu są dołączone do biblioteki , w przeciwnym razie wydrukuje nic .

Możesz przekazać dowolną wartość dla --debug-dump zamiast decodedline.

 64
Author: Alex InTechno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-09 14:04:22

nm -a <lib> wyświetli wszystkie symbole z biblioteki, włącznie z symbolami debugującymi.

Możesz więc porównać wyjścia nm <lib> i nm -a <lib> - jeśli różnią się, lib zawiera pewne symbole debugowania.

 24
Author: qrdl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-04 13:56:24

Co pomogło:

gdb mylib.so

Wyświetla, gdy nie znaleziono symboli debugowania:

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

Lub gdy znaleziono:

Reading symbols from mylib.so...done.

Żadna z wcześniejszych odpowiedzi nie dawała mi znaczących rezultatów: biblioteki bez symboli debugowania dawały dużo wyników, itp.

 19
Author: Velkan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-06 10:02:29

Na OSX można używać dsymutil -s i dwarfdump.

 13
Author: glennr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-28 20:41:57

Możesz użyć objdump do tego.

EDIT: From the man-page:

-W
--dwarf
Displays  the  contents of the DWARF debug sections in the file, if
any are present.
 11
Author: swegi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-05 08:09:45

Odpowiedzi sugerujące użycie objdump --debugging lub readelf --debug-dump=... nie działają w przypadku, gdy informacje debugowania są przechowywane w pliku oddzielonym od pliku binarnego, tzn. plik binarny zawiera sekcję debug link . Być może można nazwać to błędem w readelf.

Poniższy kod powinien obsługiwać to poprawnie:

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

Zobacz oddzielne pliki debugowania w podręczniku GDB, aby uzyskać więcej informacji.

 3
Author: ack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 00:48:59