Взаимодействие shared library друг с другом

Модератор: Модераторы разделов

Аватара пользователя
Zeus
Сообщения: 694

Взаимодействие shared library друг с другом

Сообщение Zeus »

Всё написано мною, просто разбираюсь в ситуации:

Дано:
1. shared library a.so, которая предоставляет функцию extern "C" void f1 (void)
2. shared library b.so в которой есть вызовы этой функции.
3. С++ софтина скомпилированная g++'ом, динамически (dlopen и т.п.) загружает библиотеку a.so.
Как я понимаю - в результате этого функция f1 оказывается в адресном пространстве процесса?
4. Следующим шагом эта же софтина тоже динамически пытается загрузить b.so - выдаёт ошибку:
undefined symbol f1...

5. Попробовал слинковать вторую библиотеку (b.so) статически с первой (a.so) опцией -la
6. Ошибка пропала, но теперь получается, что грузить динамически a.so нет необходимости - её вытягивает библиотека b.so при своей загрузке. Это несмертельно для моей задачи, хотя и не совсем соответствует "духу" проекта.

Кто может пояснить почему моё предположение в п.3 оказалось неверным?
Спасибо сказали:
Michael
Сообщения: 92

Re: Взаимодействие shared library друг с другом

Сообщение Michael »

Цитата из man dlopen:

Код: Выделить всё

Optionally,  RTLD_GLOBAL  may  be  or'ed  into  flag, in which case the
external symbols defined in the library will be made available for sym-
bol  resolution  of  subsequently  loaded  libraries.  (The converse of
RTLD_GLOBAL is RTLD_LOCAL.  This is the default.)

Похоже на описание твоей проблемы.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Взаимодействие shared library друг с другом

Сообщение serzh-z »

Надо полагать, что b.so слинкована динамически с a.so. Когда вы пытаетесь сделать, скажем, dlopen("b.so", RTLD_NOW), то загрузчик (ld.so), пытается разрешить все зависимости для b.so, т.е. пытается найти a.so в определённых каталогах (/lib, $LD_LIBRARY_PATH, ld.so.cache и т.д.), если там его нет, то dlopen, разумеется, сбоит. И то, что она уже была загружена в процесс кем-то ещё (т.е. самим приложением C++), не играет для ld.so роли.

З.Ы.: и, кстати, как написал Michael, a.so, можно грузить с флагом RTDL_GLOBAL
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Взаимодействие shared library друг с другом

Сообщение Zeus »

Спасибо за ответы - попробую вечерком флаг RTDL_GLOBAL.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Взаимодействие shared library друг с другом

Сообщение Zeus »

Попробовал использовать флаг:

/* If the following bit is set in the MODE argument to `dlopen',
the symbols of the loaded object and its dependencies are made
visible as if the object were linked directly into the program. */
#define RTLD_GLOBAL 0x00100

Не помогло.
Похоже придётся забить и слинковывать библиотеки статически.
Спасибо сказали: