У меня есть несколько скомпилированных библиотек на x86 Linux, и я хочу быстро определить, были ли они скомпилированы с отладочными символами.
Ответы:
Если вы работаете в Linux, используйте objdump --debugging
. Для каждого объектного файла в библиотеке должна быть запись. Для объектных файлов без символов отладки вы увидите что-то вроде:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
Если есть символы отладки, вывод будет намного более подробным.
objdump -g
ничего не дает для простого test.o, скомпилированного как с, так и без g
, что делает его практически бесполезным. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22. nm -a
кажется более полезным.
Предлагаемая команда
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 :
readelf --debug-dump=decodedline libinspected.so
или
readelf --debug-dump=line libinspected.so
Это распечатает набор строк, состоящий из исходного имени файла, номера строки и адреса, если такая отладочная информация включена в библиотеку , иначе он ничего не напечатает .
Вы можете передать любое значение, которое сочтете необходимым для --debug-dump
option вместо decodedline
.
Что помогло:
gdb mylib.so
Он печатает, когда символы отладки не найдены:
Reading symbols from mylib.so...(no debugging symbols found)...done.
Или при обнаружении:
Reading symbols from mylib.so...done.
Ни один из предыдущих ответов не дал для меня значимых результатов: библиотеки без символов отладки давали много результатов и т. Д.
nm -a <lib>
распечатает все символы из библиотеки, в том числе отладочные.
Таким образом, вы можете сравнить выходные данные nm <lib>
и nm -a <lib>
- если они отличаются, ваша библиотека содержит некоторые символы отладки.
nm -a
имеет псевдоним, nm --debug-syms
который не требует пояснений :-).
diff <(nm <lib>) <(nm -a <lib>)
чтобы получить простую
В OSX вы можете использовать dsymutil -s
и dwarfdump
.
При использовании dsymutil -s <lib_file> | more
вы увидите пути к исходным файлам в файлах, которые имеют символы отладки, но в противном случае только имена функций.
dsymutil -s
? Означает ли существование вывода, что он был построен с использованием символов отладки, или его нужно использовать с помощью grep?
Ответы, предлагающие использовать 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 для получения дополнительной информации.
obdjump -W lib
иreadelf -w lib
. Последний вариант более настраиваемый - см. Справочную страницу readelf (1).