Имя библиотеки языка C может отличаться в зависимости от архитектуры. Например, на платформах IA-64 и Alpha она называется libc.so.6.1.
Команда objdump позволяет получить из исполняемого файла, скомпилированного объекта или разделяемой библиотеки различную информацию, включая дизассемблированный машинный код в двоичном формате. С ее помощью также можно вывести содержимое заголовков разных ELF-разделов упомянутых файлов; в этом контексте она напоминает команду readelf, которая выводит похожие данные, но в другом формате. Источники с подробным описанием команд objdump и readelf перечислены в конце настоящей главы.
Выводит список всех символов, определенных внутри объектной библиотеки или исполняемой программы. С ее помощью можно узнать, какой именно библиотеке принадлежит тот или иной символ. Например, чтобы понять, где определена функция crypt(), можно сделать следующее:
$ nm — A /usr/lib/lib*.so 2> /dev/null | grep ' crypt$'
/usr/lib/libcrypt.so:00007080 W crypt
Параметр — A говорит о том, что перед каждым символом должно быть указано имя библиотеки. Он нужен, поскольку команда nm по умолчанию сначала выводит имя библиотеки, а потом перечисляет все символы, которые ей принадлежат; это не подходит для выполнения фильтрации, как в нашем примере. Кроме того, мы отключили стандартный вывод ошибок, чтобы скрыть сообщения о файлах, формат которых данная команда не поддерживает. На основе результата, полученного выше, можно сказать, что функция crypt() определена в библиотеке libcrypt.
Теперь посмотрим, что собой представляет версионирование разделяемых библиотек. Обычно «соседние» версии совместимы друг с другом; то есть функции в каждом модуле предоставляют один и тот же интерфейс и являются семантически тожественными (то естьпроизводят идентичные результаты). Такие совместимые версии разделяемой библиотеки называют
Для решения данной задачи используется стандартное соглашение об именовании разделяемых библиотек, относящееся как к реальным именам, так и к soname.
Каждая несовместимая версия разделяемой библиотеки имеет уникальный
В качестве идентификаторов минорных (как и мажорных) версий могут выступать любые строки, но, если следовать соглашению об именовании, это должны быть либо число, либо два числа, разделенных точкой; первое число обозначает минорную версию, а второе — номер патча или ревизии в рамках данной минорной версии. Ниже приведены некоторые примеры реальных имен разделяемых библиотек:
libdemo.so.1.0.1
libdemo.so.1.0.2
libdemo.so.2.0.0
libreadline.so.5.0
Имя soname разделяемой библиотеки включает в себя тот же идентификатор мажорной версии, что и ее реальное имя, но не содержит минорной. Таким образом, имя soname имеет вид имя_библиотеки. so.мажорный_идентификатор.
Обычно soname создается в качестве относительной символьной ссылки в каталоге, содержащем реальное имя. Ниже показаны примеры отдельных имен soname и реальных имен, на которые они могут ссылаться.
libdemo.so.1 — > libdemo.so.1.0.2
libdemo.so.2 — > libdemo.so.2.0.0
libreadline.so.5 — > libreadline.so.5.0