Читаем Linux API. Исчерпывающее руководство полностью

В примерах, продемонстрированных ранее, имя, которое встраивалось в исполняемый файл и затем искалось динамическим компоновщиком на этапе выполнения, являлось также именем самой разделяемой библиотеки. Это имя называют реальным (или настоящим). Однако такую библиотеку можно (а обычно так и делается) создать с использованием некоего псевдонима, который называется soname (от англ. shared object name — «имя разделяемого объекта»; метка DT_SONAME в терминологии формата ELF).

Если у разделяемой библиотеки есть имя soname, то во время статической компоновки оно встраивается в исполняемый файл вместо реального имени и, как следствие, используется динамическим компоновщиком для поиска библиотеки на этапе выполнения. Имя soname — это уровень абстракции, позволяющий выполняющейся программе задействовать версию библиотеки, отличную от той, с которой она была скомпонована (но совместимую с ней).

В разделе 41.6 будет показано, какими правилами принято руководствоваться при создании имени разделяемой библиотеки (реального и soname). Теперь же рассмотрим упрощенный пример, чтобы усвоить основные принципы.

Изначально soname указывается при создании разделяемой библиотеки:

$ gcc — g — c — fPIC — Wall mod1.c mod2.c mod3.c

$ gcc — g — shared — Wl, — soname,libbar.so — o libfoo.so mod1.o mod2.o mod3.o

Параметр — Wl, — soname,libbar.so заставляет компоновщик пометить разделяемую библиотеку libfoo.so именем soname libbar.so.

Чтобы определить soname существующей разделяемой библиотеки, можно воспользоваться любой из следующих команд:

$ objdump — p libfoo.so | grep SONAME

SONAME libbar.so

$ readelf — d libfoo.so | grep SONAME

0x0000000e (SONAME) Library soname: [libbar.so]

Теперь, когда у нас есть разделяемая библиотека с именем soname, можно создать исполняемый файл с помощью уже знакомой команды:

$ gcc — g — Wall — o prog prog.c libfoo.so

Но на этот раз компоновщик обнаруживает, что библиотека libfoo.so содержит имя soname libbar.so и встраивает его в исполняемый файл.

Теперь, попытавшись запустить программу, мы увидим следующее:

$ LD_LIBRARY_PATH=. /prog

prog: error in loading shared libraries: libbar.so: cannot open shared object file: No such file or directory

Проблема заключается вот в чем: динамический компоновщик не может найти ничего, что имело бы имя libbar.so. Необходимо выполнить еще один шаг: создать символьную ссылку, связывающую soname с реальным именем библиотеки. Эта ссылка должна находиться в одном из тех каталогов, по которым выполняет поиск динамический компоновщик. Следовательно, можно запустить программу следующим образом:

$ ln — s libfoo.so libbar.so Создаем в текущем каталоге символьную ссылку на soname

$ LD_LIBRARY_PATH=. /prog

Called mod1-x1

Called mod2-x2

На рис. 41.1 показаны этапы компиляции и компоновки, используемые в ходе создания разделяемой библиотеки с именем soname, а также процедура компоновки программы с этой библиотекой и создание символьной ссылки на имя soname, необходимой для запуска программы.

Рис. 41.1. Создание разделяемой библиотеки и компоновка с ней программы

На рис. 41.2 показано, через какие этапы проходит вышеприведенная программа при загрузке в память и подготовке к выполнению.

Чтобы выяснить, какую разделяемую библиотеку использует процесс, можно просмотреть содержимое /proc/PID/maps (поддерживается только в Linux; см. раздел 48.5).

Рис. 41.2. Выполнение программы, загружающей разделяемую библиотеку

41.5. Полезные инструменты для работы с разделяемыми библиотеками

В этом разделе мы кратко рассмотрим несколько инструментов, которые могут пригодиться при анализе разделяемых библиотек, исполняемых файлов и скомпилированных объектов (файлов. o).

Команда ldd

Команда ldd(1) (от англ. list dynamic dependencies — «вывести динамические зависимости») выводит разделяемые библиотеки, необходимые для работы программы (или другой разделяемой библиотеки). Например:

$ ldd prog

libdemo.so.1 => /usr/lib/libdemo.so.1 (0x40019000)

libc.so.6 => /lib/tls/libc.so.6 (0x4017b000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Команда ldd находит все модули, на которые ссылается библиотека (по тому же принципу, что и динамический компоновщик), и выводит результат в следующем виде:

имя_библиотеки => ссылается_на_путь

Для большинства исполняемых файлов в формате ELF команда ldd выведет как минимум ld-linux.so.2 (динамический компоновщик) и libc.so.6 (стандартную библиотеку языка C).

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных