На пальцах проблема выглядит примерно так:
Имеются закрытые библиотеки без RPATH: libfoo.so, libbar.so и libaaa.so лежат в /opt/megacorp/lib.
libbar зависит от libaaa которая зависит от libfoo.
/opt/megacorp/lib не в системном LD_LIBRARY_PATH.
Наше приложение использует libaaa.so. Перед этим делает следующее:
- setenv(LD_LIBRARY_PATH += «/opt/megacorp/lib»);
- dlopen(«foo», RTLD_NOW | RTLD_GLOBAL); // Грузит без ошибок
- dlopen(«bar», RTLD_NOW | RTLD_GLOBAL); --> тянет зависимостью libaaa.so --> тянет зависимостью libfoo.so --> здесь ld.so ругается что libfoo.so не найдена.
Если задать LD_LIBRARY_PATH += «/opt/megacorp/lib» в шеле, то в приложении dlopen вообще не нужен, всё отлично работает.
Вопросы:
- Почему линкер ищет libfoo.so в ФС, когда она же уже загружена?
- почему линкер может не находить либу при LD_LIBRARY_PATH заданном через setenv?
Требуется не решить проблему загрузки, а хотябы понять почему так происходит. Пожалуйста пишите любые идеи.