Открыть главное меню

Dlopen: различия между версиями

м (Объявление: Ошибка в оформлении)
 
(не показано 39 промежуточных версий 6 участников)
Строка 1:Строка 1:
 +
<metadesc>Функция ElfPack2, загружает динамическую библиотеку (*.so) во время выполнения.</metadesc>
 +
 
== Объявление ==
 
== Объявление ==
 
'''<tt>DLHANDLE dlopen( const WCHAR * file, int mode );</tt>
 
'''<tt>DLHANDLE dlopen( const WCHAR * file, int mode );</tt>
  
 
== Описание ==
 
== Описание ==
Функция [[ElfPack2]], загружает динамическую библиотеку (*.so)
+
Функция [[ElfPack2]], загружает динамическую библиотеку (*.so) во время выполнения.
 +
 
 +
Обычно требуемая библиотека указывается еще на этапе линковки эльфа и она автоматически загружается вместе с эльфом. Это не всегда удобно, т.к. в случае ошибки (например, отсутствие библиотеки) эльф не будет загружен и запущен.
 +
 
 +
Загрузка во время выполнения дает больший контроль над этим процессом - можно загружать библиотеку только при необходимости и можно обрабатывать ошибки.
  
В эльфе, требующем динамическую библиотеку как на этапе загрузки, так и во время выполнения (dlopen), хранится ссылка на каждую связанную с ним библиотеку. Когда количество эльфов, требующее определённую библиотеку становится равным нулю, она выгружается из памяти.
+
Как минус - обращаться к объектам библиотеки напрямую нельзя, только через [[dlsym]].
  
 
== Параметры ==
 
== Параметры ==
Строка 11:Строка 17:
 
#:Либо полный путь к библиотеке, либо просто имя библиотеки.
 
#:Либо полный путь к библиотеке, либо просто имя библиотеки.
 
#:В последнем случае, библиотека будет искаться в стандартных путях для библиотек (прописаны в elfpack.cfg) и в папке с эльфом.
 
#:В последнем случае, библиотека будет искаться в стандартных путях для библиотек (прописаны в elfpack.cfg) и в папке с эльфом.
#:Если библиотека уже была загружена ранее, функция просто вернёт DLHANDLE на неё.
+
#:''Замечание.'' В папке эльфа ищется только после завершения вызова __start().
 
#'''int mode
 
#'''int mode
 
#:Параметры загрузки библиотеки.
 
#:Параметры загрузки библиотеки.

Текущая версия на 04:52, 8 апреля 2019


Объявление

DLHANDLE dlopen( const WCHAR * file, int mode );

Описание

Функция ElfPack2, загружает динамическую библиотеку (*.so) во время выполнения.

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

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

Как минус - обращаться к объектам библиотеки напрямую нельзя, только через dlsym.

Параметры

  1. const WCHAR * file
    Либо полный путь к библиотеке, либо просто имя библиотеки.
    В последнем случае, библиотека будет искаться в стандартных путях для библиотек (прописаны в elfpack.cfg) и в папке с эльфом.
    Замечание. В папке эльфа ищется только после завершения вызова __start().
  2. int mode
    Параметры загрузки библиотеки.
    На данный момент поддерживаются только RTLD_NOW|RTLD_LOCAL = 0 - библиотека загружается немедленно и доступ к её функциям можно получить только через dlsym.

Результат

  1. DLHANDLE
    Идентификатор (хендлер) библиотеки, который используется в функциях dlsym и dlclose.
    В случае неудачи возвращается 0, и код ошибки можно узнать с помощью функции dlerror.

Пример

DLHANDLE solib;
// Загружаем библиотеку из папки с эльфом
solib = dlopen( L"library.so", 0 );
if(solib == 0)
{	cprintf("library.so not found, error = %d\n", dlerror());
}

См. также

dlsym

dlclose

dlerror