Відповіді:
Якщо ви працюєте в Linux, використовуйте objdump --debugging. Для кожного об’єктного файлу в бібліотеці повинен бути запис. Для об’єктних файлів без налагоджувальних символів ви побачите щось на зразок:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
Якщо є налагоджувальні символи, вихід буде набагато більш багатослівним.
objdump -gне дає мені нічого за простий тест.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замість опції 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>- якщо вони різняться, у вашій lib є деякі символи налагодження.
nm -aмає псевдонім, nm --debug-symsякий пояснює себе :-).
diff <(nm <lib>) <(nm -a <lib>)щоб отримати просту
На OSX можна використовувати dsymutil -sі dwarfdump.
Використовуючи, dsymutil -s <lib_file> | moreви побачите шляхи до вихідних файлів у файлах, що мають налагоджувальні символи, але лише імена функцій інакше.
dsymutil -s,? Чи означає наявність висновку, що він був побудований з налагодженими символами, або він повинен бути зафіксований?
Відповіді, які пропонують використовувати 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).