nm - Полезная утилита исследования библиотек

На модерации Отложенный

По долгу службы пришлось искать правды в одном старом проекте нашей конторы. Проблема была в том, что проект собирался только при наличии продуктового исходного кода, но его было не собрать в проектном окружении. Продуктовый код - это исходные тексты ядра и библиотек системы, а проектное окружение - это когда у вас в наличии только собранные библиотеки.

В общем дело двигалось медленно, пока я не открыл прокладки с крылышками утилиту, которая может получить список составных частей динамической библиотеки (shared object). Зовут утилиту - nm. Она может разбирать следующие запчасти:

  • "A" - Значение символа является абсолютным и не будет изменено путем дальнейшего связывания;
  • "B","b" - Неинициализированные данные, BSS;
  • "C" - Общие неинициализированные данные. Если символ не определяется внутри модуля, то он представлен в виде ссылки;
  • "D", "d" - инициализированные данные;
  • "G", "g" - секция для инициализированных объектов небольшого размера;
  • "i" - GNU расширение для ELF файлов. Используется при перемещении объектов во время исполнения;
  • "N" - отладочный символ;
  • "p" - символы в распаковывающейся части стека;
  • "R", "r" - неизменяемый символ (только для чтения);
  • "S", "s" - секция для неинициализированных объектов небольшого размера;
  • "T", "t" - секция кода;
  • "U" - неопределённый (undefined) символ;
  • "u" - GNU расширение для ELF файлов. Уникальный глобальный (в пределах процесса) символ;
  • "V", "v" - Слабо связанный объект, отмеченный как таковой;
  • "W", "w" - Слабо связанный объект, который не отмечен как таковой;
  • "-" - отладочные запчасти;
  • "?" - неизвестный символ;
  • "a" - имя объектного файла, который использован при сборке библиотеки

Подробнее об утилите лучше смотреть в man.

 

Я использовал утилиту nm для поиска объектных файлов, содержащих нужные мне функции и потратил на поиск необходимого один рабочий день. Если бы её не было, то мне пришлось бы разбираться с процессом построения системы из исходных текстов, что было бы существенно дольше.

Выводы: годная утилита для разбора библиотек, исходного кода которых у вас нет или библиотек, в исходном коде которых вам не охота разбираться.