Ошибка при попытке динамической загрузки клиентской библиотеки Oracle в AIX - PullRequest
0 голосов
/ 14 декабря 2018

Я работаю над проектом, и недавно я изменил статическое связывание клиентской библиотеки oracle с динамической загрузкой библиотеки всякий раз, когда она фактически пытается вызвать функцию из OCI (клиентская библиотека Oracle / libclntsh.so), программа попытается dlopen() с абсолютным путем к libclntsh.so.и это дает мне следующую ошибку

┌────────────────────────────────── Error ──────────────────────────────────┐ │ Could not open Dynamic Library: │ │ /aix64/oracle/client/12.1.0.2/client_1/lib/libclntsh.so (8013) │ │ DLL Error : Could not load module │ │ /aix64/oracle/client/12.1.0.2/client_1/lib/libclntsh.so. (8014) │ │ Unable to load shared library (14945) │ │ ORACLE error -1012 see "ORACLE Error Messages and Codes Manual". (1252) │ │ ** │ │ Failed to connect to ORACLE database lh. (1451) │ │ │ │ ────────────────────────────────────────────────────────────────────────── │ │ <OK> │ └────────────────────────────────────────────────────────────────────────────┘

PATH/LIBPATH не может быть проблемой, так как я даю абсолютный путь для libclntsh.so в dlopen().

Разрешение, владелец и группа исполняемых файлов:
-rwsrwxr-x 1 root frnd 25835393 Dec 13 19:18 /some/other/abc

При поиске решения я узнал, что из-за того, что набор липких битов и файл принадлежат пользователю root, при его выполнении, он не может получить LIBPATH.Указан путь к библиотеке, но две ее зависимости из одного и того же каталога не загружаются, и, следовательно, эта ошибка.

Может кто-нибудь предложить что-нибудь.

PS: При использовании 12.2.0.1.0 oracleбиблиотека (то есть: LIBPATH и ORACLE_HOME указывает на /oracle/client/12.2.0.1.0/), нет проблем с загрузкой.Я не понимаю, как это происходит.

TIA

1 Ответ

0 голосов
/ 14 декабря 2018

Вы должны проверить libclntsh.so, чтобы выяснить, какие у него зависимости: или ldd libclntsh.so, или dump -H -X64 libclntsh.so.

Это может быть libons.so или libclntshcore.so в зависимости от версии / варианта..

Кроме того, клиент oracle также может открывать общие библиотеки с помощью dlopen (для InstantClient это libociei.so.

Подводя итог: вы должны установить LIBPATH в /aix64/oracle/client/12.1.0.2/client_1/lib, затемэто может сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...