10 октября 2011 г.

нахождение потенциальных проблем "undefined symbol" в бинарниках

Ранее мной был написан скрипт для нахождения бинарников, к которым нет внешних библиотек. Но есть еще минимум одна неприятность, это устаревшие библиотеки. К примеру, бинарник компилировался с новейшей версией, а в дистрибутиве по недосмотру, или какой другой причине, была установлена старая версия. В этом случае программа может вывалиться с сообщением undefined symbol:
kdevelop: symbol lookup error: /usr/lib/kde4/kdevcmakemanager.so: undefined symbol: _ZN16CMakeParserUtils13includeScriptERK7QStringN8KDevelop22ReferencedTopDUContextEP16CMakeProjectDataS2_
На первый взгляд, не совсем понятно, что за символ такой, и к чему он принадлежит.
Но в Linux есть утилиты binutils, среди которых есть программка c++filt, которая, собственно, и может декодировать такие символьные строки.

c++filt _ZN16CMakeParserUtils13includeScriptERK7QStringN8KDevelop22ReferencedTopDUContextEP16CMakeProjectDataS2_

результат выполнения:
CMakeParserUtils::includeScript(QString const&, KDevelop::ReferencedTopDUContext, CMakeProjectData*, QString const&)

Ранее написанный скрипт здесь можно расширить для поиска таких бинарных файлов.

Применять для фильтрации "undefined symbol" можно командой

ldd -d -r nameOfBinFile

где  nameOfBinFile имя актуального бинарника, который можно использовать как переменную в цикле обработки скрипта.
затем преобразовывать из низкоуровневого представления в более простой для понимания текстовой вид.

ссылка на документ c++filt: link

Комментариев нет:

Отправить комментарий