Всё написано мною, просто разбираюсь в ситуации:
Дано:
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 оказалось неверным?
Взаимодействие shared library друг с другом
Модератор: Модераторы разделов
-
Michael
- Сообщения: 92
Re: Взаимодействие shared library друг с другом
Цитата из 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 друг с другом
Надо полагать, что 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
З.Ы.: и, кстати, как написал Michael, a.so, можно грузить с флагом RTDL_GLOBAL
-
Zeus
- Сообщения: 694
Re: Взаимодействие shared library друг с другом
Спасибо за ответы - попробую вечерком флаг RTDL_GLOBAL.
-
Zeus
- Сообщения: 694
Re: Взаимодействие shared library друг с другом
Попробовал использовать флаг:
/* 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
Не помогло.
Похоже придётся забить и слинковывать библиотеки статически.
/* 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
Не помогло.
Похоже придётся забить и слинковывать библиотеки статически.