У меня есть компилируемые библиотеки на x86 Linux, и я хочу быстро определить, были ли они скомпилированы с помощью отладочных символов.
Как узнать, скомпилирована ли библиотека с помощью -g?
Ответ 1
Если вы работаете в Linux, используйте objdump --debugging
. Должна быть запись для каждого объектного файла в библиотеке. Для объектных файлов без отладки символов вы увидите что-то вроде:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
Если есть отладочные символы, вывод будет намного более подробным.
Ответ 2
Предлагаемая команда
objdump --debugging libinspected.a
objdump --debugging libinspected.so
дает мне всегда тот же результат, по крайней мере, на Ubuntu/Linaro 4.5.2:
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
независимо от того, была ли архивная/разделяемая библиотека построена с опцией -g
или без нее
Что действительно помогло мне определить, был ли -g
использован readelf tool:
readelf --debug-dump=decodedline libinspected.so
или
readelf --debug-dump=line libinspected.so
Это приведет к отображению набора строк, состоящих из исходного имени файла, номера строки и адреса, если такая информация об отладке включена в библиотеку, иначе она ничего не напечатает.
Вы можете передать любое значение, которое вы найдете нужным для параметра --debug-dump
вместо decodedline
.
Ответ 3
nm -a <lib>
выведет все символы из библиотеки, включая отладочные.
Итак, вы можете сравнивать выходы nm <lib>
и nm -a <lib>
- если они отличаются, ваша библиотека содержит некоторые символы отладки.
Ответ 4
Что помогло:
gdb mylib.so
Он печатает, когда символы отладки не найдены:
Reading symbols from mylib.so...(no debugging symbols found)...done.
Или если найдено:
Reading symbols from mylib.so...done.
Ни один из более ранних ответов не дал мне значимых результатов: libs без символов отладки выдавали много результатов и т.д.
Ответ 5
В OSX вы можете использовать dsymutil -s
и dwarfdump
.
Использование dsymutil -s <lib_file> | more
dsymutil -s <lib_file> | more
вы увидите пути к исходным файлам в файлах, которые имеют символы отладки, но только имена функций в противном случае.
Ответ 6
Вы можете использовать objdump для этого.
РЕДАКТИРОВАТЬ: С man-страницы:
-W
--dwarf
Displays the contents of the DWARF debug sections in the file, if
any are present.
Ответ 7
Ответы, предлагающие использование objdump --debugging
или readelf --debug-dump=...
, не работают в том случае, если отладочная информация хранится в файле отдельно от двоичного файла, то есть в двоичном файле содержится раздел отладочной ссылки. Возможно, это можно назвать ошибкой в readelf
.
Следующий код должен корректно обрабатывать:
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
Для получения дополнительной информации см. Разделить файлы отладки в руководстве GDB.