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

В этой главе мы сосредоточим свое внимание только на формате ELF (Executable and Linking Format — формат исполняемых и компонуемых файлов), поскольку именно он используется для создания исполняемых файлов и разделяемых библиотек в современных версиях Linux (а также во многих других реализациях UNIX).

ELF заменил собой старые форматы a.out и COFF.

41.4.1. Создание разделяемой библиотеки

Для построения разделяемой версии статической библиотеки, созданной ранее, нужно выполнить следующие шаги:

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

$ gcc — g — shared — o libfoo.so mod1.o mod2.o mod3.o

Первая команда создает три объектных модуля (мы объясним назначение параметра cc — fPIC в следующем разделе). Команда cc — shared создает на основе этих модулей разделяемую библиотеку.

Имена разделяемых библиотек принято обрамлять префиксом lib и суффиксом. so (от англ. shared object — «разделяемый объект»).

Для демонстрации того, что параметры командной строки, которые мы задействуем при создании разделяемых библиотек, не зависят от компилятора, в наших примерах вместо cc указана команда gcc. Другой компилятор в иной UNIX-системе, вероятно, потребует пересмотра этих параметров.

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

$ gcc — g — fPIC — Wall mod1.c mod2.c mod3.c — shared — o libfoo.so

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

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

41.4.2. Адресно-независимый код

Параметр cc — fPIC заставляет компилятор сгенерировать адресно-независимый код. Это влияет на такие операции, как доступ к глобальным, статическим и внешним переменным, строковым константам, а также на то, как определяются адреса функций. Данные изменения позволяют размещать исполняемый код на любом участке виртуальной памяти. Такой механизм является необходимым для разделяемых библиотек, поскольку на этапе компоновки невозможно определить, куда именно будет загружен их код (точное местоположение разделяемой библиотеки в адресном пространстве зависит от различных факторов, таких как количество памяти, которую уже использует программа, загружающая библиотеку, и какие разделяемые библиотеки она успела загрузить).

Платформа Linux/x86-32 позволяет создавать исполняемые библиотеки на основе модулей, скомпилированных без параметра — fPIC. Однако в этом случае теряются некоторые преимущества разделяемых библиотек, так как страницы программного кода, содержащие адресно-независимые ссылки, не могут быть разделены между процессами. В ряде архитектур невозможно собрать разделяемую библиотеку без параметра — fPIC.

Чтобы определить, был ли имеющийся объектный файл скомпилирован с использованием данного параметра, можно проверить наличие имени _GLOBAL_OFFSET_TABLE_ в его таблице символов. Для этого подойдет любая из следующих двух команд:

$ nm mod1.o | grep _GLOBAL_OFFSET_TABLE_

$ readelf — s mod1.o | grep _GLOBAL_OFFSET_TABLE_

С другой стороны, если одна из нижеприведенных команд выведет что-либо на экран, это будет значить следующее: заданная разделяемая библиотека содержит как минимум один объектный модуль, скомпилированный без параметра — fPIC:

$ objdump — all-headers libfoo.so | grep TEXTREL

$ readelf — d libfoo.so | grep TEXTREL

Строка TEXTREL указывает на наличие объектного модуля, чей текстовый сегмент содержит ссылку, требующую перемещения кода на этапе выполнения.

Более подробно команды nm, readelf и objdump будут рассмотрены в разделе 41.5.

41.4.3. Использование статической библиотеки

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

• Поскольку исполняемый файл больше не содержит копии нужных ему объектных модулей, он должен иметь возможность определять, какая разделяемая библиотека требуется для его работы. Для этого на этапе компоновки в исполняемый файл внедряется имя библиотеки (говоря в терминологии формата ELF, библиотечная зависимость записывается в метку DT_NEEDED исполняемого файла). Набор всех разделяемых библиотек, которые нужны программе, называют списком динамических зависимостей.

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

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

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

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

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

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

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

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

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