在 AIX 中尝试动态加载 Oracle 客户端库时出错

Error while attempting Dynamic load of Oracle client library in AIX

我正在做一个项目,最近我将 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 不是问题,因为我在 dlopen().

中给出了 libclntsh.so 的绝对路径

可执行文件的权限、所有者和组是:
-rwsrwxr-x 1 root frnd 25835393 Dec 13 19:18 /some/other/abc

在寻找解决方案时,我了解到由于设置了粘滞位并且文件归根所有,所以当我执行它时,它无法获取LIBPATH。 给出了库的路径,但未加载来自同一目录的两个依赖项,因此出现此错误。

任何人都可以提出建议。

PS:使用 12.2.0.1.0 oracle 库时(即:LIBPATH 和 ORACLE_HOME 指向 /oracle/client/12.2.0.1.0/),没有问题加载。我不明白这是怎么回事。

TIA

您应该检查 libclntsh.so 以找出它有哪些依赖项:ldd libclntsh.sodump -H -X64 libclntsh.so 都可以。

可能是 libons.solibclntshcore.so,具体取决于 version/variant。

此外,oracle 客户端也可能使用 dlopen 打开共享库(对于 InstantClient,它是 libociei.so

总结一下:您应该将 LIBPATH 设置为 /aix64/oracle/client/12.1.0.2/client_1/lib,然后它可能会起作用。