Подробно изучите спецификацию формата DWARF (это формат, используемый для отладки информации в Linux). Таким образом, вы можете извлечь информацию (но это не совсем просто), проанализировав DWARF внутри вашего ELF двоичного файла.
Попробуйте заглянуть внутрь исходного кода libbacktrace Иана Тейлора . Это делает это извлечение имени файла из DWARF внутри ELF.
Возможно, ваша настоящая проблема - получить точную информацию о трассировке, и тогда libbacktrace
- это именно то, что вам нужно!
Вы также можете использовать gdb
: это расширяемый и скриптовый на Python (или Guile), и вы можете написать свой собственный специализированный скрипт.
Возможно, вам лучше решить свою реальную проблему с помощью какого-нибудь плагина GCC , работающего, когда вы компилируете свой код.
Чтение Как писать общие библиотеки от Drepper и читать больше об ELF.
Например, вы можете собрать все неопределенные символы в вашей общей библиотеке, используя nm
(или readelf
). Затем второй скрипт найдет их в вашем исходном коде. Это может быть даже простой скрипт awk (или какой-то цикл оболочки for
с использованием grep
), или что-то более сложное, чем плагин GCC.
Ваш пример показывает (вероятно) искаженное C ++ имя. Вы можете использовать nm -C
, чтобы разобраться с этим. А позже напишите плагин GCC, чтобы найти все инструкции GIMPLE CALL
, используя его.
Написание плагина GCC может занять некоторое время, особенно если вы не знакомы с внутренними компонентами GCC .