Как напечатать все неопределенные вызовы функций вместе с именем файла из общего объекта? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь распечатать все вызовы неопределенных функций из общего объектного файла вместе с именем файла.

Я пытался с помощью команды "nm", она печатает все неопределенные вызовы функций. Но не удалось получить имя файла.

Пример:

  bash$ nm -u my_test.so
  :
   U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
  :

Среда: Ubuntu 18.04, X86 Arch (процессор Intel)

1 Ответ

0 голосов
/ 11 января 2019

Подробно изучите спецификацию формата 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 .

...