Как узнать, скомпилирована ли библиотека с помощью -g?

У меня есть компилируемые библиотеки на x86 Linux, и я хочу быстро определить, были ли они скомпилированы с помощью отладочных символов.

Ответ 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.