27.1. Интерфейс dl

27.1. Интерфейс dl

Процесс динамической загрузки заключается в открытии библиотеки, поиске любого количества символов, обработке любых возникающих ошибок и закрытии библиотеки. Все функции динамической загрузки объявляются в одном заголовочном файле, <dlfcn.h>, и определяются в libdl (чтобы воспользоваться функциями динамической загрузки скомпонуйте приложение с -ldl).

Функция dlerror() возвращает строку, описывающую самую последнюю ошибку, которая возникла в одной из трех других функций динамической загрузки:

const char * dlerror(void);

Каждый раз при возврате значения она очищает состояние ошибки. Если не будет создано другое состояние ошибки, она продолжит выполнение, чтобы вернуть NULL вместо строки. Объяснение этого необычного поведения можно найти в описании функции dlsym().

Функция dlopen() открывает библиотеку. Этот процесс включает поиск библиотечного файла, открытие файла и выполнение некоторой предварительной обработки. Переменные окружения и параметры, переданные функции dlopen(), определяют детали этого процесса.

void * dlopen(const char * filename, int flag);

Если filename является абсолютным путем (то есть начинается с символа /), то функции dlopen() не нужно производить поиск библиотеки. Это обычный способ применения функции dlopen() в коде приложения. Если filename является простым именем файла, то функция dlopen() произведет поиск библиотеки filename в перечисленных ниже местах.

• Набор каталогов, разделенных двоеточием, который определен в переменной окружения LD_ELF_LIBRARY_PATH, или, если ее не существует, в переменной LD_LIBRARY_PATH.

• Библиотеки, определенные в файле /etc/ld.so.cache. Этот файл генерируется программой ldcoding, регистрирующей каждую библиотеку, которую она находит в каталоге, указанном в /etc/ld.so.conf, во время ее выполнения.

• /usr/lib

• /lib

Если filename равен NULL, то функция dlopen() открывает экземпляр текущего исполняемого файла. Это полезно только в редких случаях. В случае сбоя функция dlopen() возвращает NULL.

Поиск файлов является простой частью работы функции dlopen(); разрешение символов является более сложной задачей. Существует два фундаментально разных типа разрешения символов: немедленный (immediate) и отложенный (lazy). При немедленном разрешении функция dlopen() разрешает все неразрешенные символы до возвращения результата; под отложенным разрешением подразумевается, что разрешение символов будет происходить по требованию.

Если большинство символов будет разрешено в самом конце, то гораздо эффективнее будет выполнить немедленное разрешение. Однако для библиотек со многими неразрешенными символами время, потраченное на разрешение символов, может оказаться продолжительным; если это существенно сказывается на вашем пользовательском интерфейсе, можно отдать предпочтение отложенному разрешению. Разница в общей эффективности будет незначительной.

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

Это особенно относится к тем случаям, когда вам необходимо, чтобы разделяемые объекты, зависящие от других разделяемых объектов, могли передавать некоторые свои символы. Если разделяемый объект А зависит от символа b в разделяемом объекте В, а В загружается после А, то отложенное разрешение b сможет быть выполнено только после загрузки объекта В, а до его загрузки — нет. Если написать код с немедленным разрешением, то вы сможете перехватить эту ошибку еще до того, как она сможет стать причиной возникновения проблем.

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

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

Управление всеми этими действиями осуществляется через аргумент flags. Он должен иметь значение RTLD_LAZY для отложенного разрешения и RTLD_NOW для немедленного разрешения. Любое из этих значений может быть объединено битовым "ИЛИ" с RTLD_GLOBAL, чтобы разрешить экспортирование символов в остальные модули.

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

Функция dlopen() возвращает дескриптор (handle) того разделяемого объекта, который она открыла. Это непрозрачный объектный дескриптор, который следует использовать только как аргумент для последующих вызовов функций dlsym() и dlclose(). Если разделяемый объект открывается несколько раз, функция dlopen() каждый раз будет возвращать один и тот же дескриптор, и с каждым новым вызовом счетчик ссылок будет увеличиваться на единицу.

Функция dlsym() производит поиск символа в библиотеке:

void * dlsym(void * handle, char * symbol);

handle должен представлять собой дескриптор, возвращенный функцией dlopen(), a symbol должен содержать строку с завершающим NULL, которая именует искомый символ. Функция dlsym() возвращает адрес определенного вами символа или NULL в случае возникновения неустранимой ошибки. Если вы будете знать, что NULL не является правильным адресом символа (например, при поиске адреса функции), можно выполнить проверку на наличие ошибок, посмотрев, возвращает ли она NULL. Однако в общем случае некоторые символы могут иметь нулевые значения и быть равными NULL. Тогда вам нужно будет узнать, не возвращает ли функция dlerror() ошибку. Поскольку функция dlerror() возвращает ошибку только один раз, возвращая после этого NULL, вы должны организовать свой код следующим образом.

/* удалить любое состояние ошибки, которое еще не было прочитано */

dlerror();

p = dlsym(handle, "this_symbol");

if ((error = dlerror()) != NULL) {

 /* обработка ошибки */

}

Так как функция dlsym() возвращает void *, вам необходимо использовать приведение типов, чтобы компилятор С не выдавал сообщений об ошибках. Если вы сохраняете указатель, возвращенный функцией dlsym(), сохраните его в переменной того типа, который вы хотите использовать, и выполните приведение типа во время вызова функции dlsym(). Не сохраняйте результат в переменной void *; вам придется выполнять приведение типов каждый раз во время ее использования.

Функция dlclose() закрывает библиотеку.

void * dlclose(void * handle);

Функция dlclose() проверяет счетчик обращений, который увеличивался на единицу при каждом повторном вызове функции dlopen(), и если он равен нулю, она закрывает библиотеку. Этот счетчик обращений позволяет библиотекам применять функции dlopen() и dlclose() для произвольных объектов, не беспокоясь о том, что код, в котором производится вызов, уже открыл какие-либо из этих объектов.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Интерфейс

Из книги Microsoft Office автора Леонтьев Виталий Петрович

Интерфейс На самом деле Word – это не просто текстовый редактор (то есть, программа, предназначенная для создания и обработки текстов), а нечто гораздо большее. С помощью Word вы можете не просто набрать текст, но и оформить его по своему вкусу: включить в него таблицы и


Интерфейс

Из книги Windows Vista автора Леонтьев Виталий Петрович

Интерфейс ИНТЕРФЕЙС, графическая «оболочка», с помощью которой мы, пользователи, обращаемся к операционной системе. Интерфейс – это посредник, переводчик, задача которого преобразовать все внутренние «рычаги управления» Windows в понятную людям графическую


Интерфейс

Из книги Мобильный интернет автора Леонтьев Виталий Петрович

Интерфейс Spb Pocket Plus! Страница программы: http://www.spbsoftwarehouse.comСтатус: Shareware, $15Вам не кажется, что место на стартовом экране Windows Mobile можно было бы использовать куда рациональнее? Во всяком случае, у крупнейшей российской фирмы по производству мобильного софта такое ощущение


Веб-интерфейс

Из книги Работа на ноутбуке автора Садовский Алексей

Веб-интерфейс Существует еще один способ получения и отправки писем – это веб-интерфейс. Он работает через любой браузер. Его главное преимущество заключается в том, что вы сможете забрать свою почту с абсолютно любого компьютера без настройки почтового клиента.Кроме


Интерфейс

Из книги Photoshop. Мультимедийный курс автора Мединов Олег

Интерфейс В категории Интерфейс (рис. 14.8) задают некоторые настройки, касающиеся интерфейса. Например, включить отображение цветовых каналов в их базовых цветах, включить или выключить появление всплывающих подсказок при подведении курсора к инструментам, режим


Интерфейс

Из книги Pinnacle Studio 11 автора Чиртик Александр Анатольевич

Интерфейс Пример внешнего вида Pinnacle Studio в режиме захвата приведен на рис. 2.1. Рис. 2.1. Studio в режиме захватаВ случае, показанном на рисунке, захват осуществляется с цифровой камеры. Поэтому в левой нижней части окна присутствует панель управления камерой (Контроллер


7.2 Интерфейс WMI

Из книги Серверные технологии хранения данных в среде Windows® 2000 Windows® Server 2003 автора Дайлип Наик

7.2 Интерфейс WMI Как уже отмечалось, модель CIM определена в рабочей группе DMTF и принята к использованию ассоциацией SNIA. Интерфейс WMI представляет собой реализацию модели CIM от Microsoft. Другими словами, WMI – это «CIM для Windows».Интерфейс WMI был разработан для режима ядра и


27.1. Интерфейс dl

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

27.1. Интерфейс dl Процесс динамической загрузки заключается в открытии библиотеки, поиске любого количества символов, обработке любых возникающих ошибок и закрытии библиотеки. Все функции динамической загрузки объявляются в одном заголовочном файле, <dlfcn.h>, и


Веб-интерфейс

Из книги Интернет – легко и просто! автора Александров Егор

Веб-интерфейс Работа с почтой непосредственно на том сайте, где вы зарегистрировали свой почтовый ящик, называется работой с помощью веб-интерфейса (рис. 5.2). Рис. 5.2. Работа с помощью веб-интерфейса.Для доступа к почтовому ящику посредством веб-интерфейса достаточно зайти


4.1. Интерфейс с PHP

Из книги MySQL 5.0. Библиотека программиста автора Гольцман Виктор Иосифович

4.1. Интерфейс с PHP В этом разделе мы рассмотрим процесс создания веб-приложения на языке PHP, взаимодействующего с базой данных MySQL. Вначале познакомимся с платформами, на которых возможно создание такого приложения, а затем с функциями языка PHP, обеспечивающими работу с


4.3. Интерфейс с Java

Из книги Операционная система UNIX автора Робачевский Андрей М.

4.3. Интерфейс с Java В этом разделе рассмотрим разработку Java-сервлетов, использующих базу данных MySQL для хранения и поиска информации. Вы узнаете, как создать и настроить среду разработки сервлетов, а также научитесь использовать для взаимодействия с MySQL функции JDBC (Java Database


Интерфейс TPI

Из книги Установка, настройка и восстановление Windows 7 на 100% автора Ватаманюк Александр Иванович

Интерфейс TPI


Интерфейс

Из книги Как приручить компьютер за несколько часов автора Ремнева Ирина

Интерфейс Интерфейс Windows 7 не претерпел каких-либо особых изменений по сравнению с внешним видом Windows Vista. Тем не менее кое-что новое в нем также имеется. Основные изменения коснулись оформления таких элементов и программ, как меню Пуск, Панель задач, область уведомлений,


Интерфейс

Из книги Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода автора Larsson Thomas

Интерфейс Интерфейс (внешний вид) программы очень схож с Microsoft Word. После запуска программы экран Excel содержит пять областей (по порядку сверху вниз): Внешний вид окна программы ExcelКак вы теперь смогли сами убедиться, основным отличием от Word является присутствие вместо