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

Posted

技术标签:

【中文标题】尝试在 AIX 中动态加载 Oracle 客户端库时出错【英文标题】:Error while attempting Dynamic load of Oracle client library in AIX 【发布时间】:2019-05-15 14:47:37 【问题描述】:

我正在做一个项目,最近我将 oracle 客户端库的静态链接更改为库的动态加载,只要它实际尝试从 OCI 调用函数(Oracle 客户端库/libclntsh.so),程序将尝试@987654322 @ 带有到 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

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

谁能给点建议。

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

TIA

【问题讨论】:

【参考方案1】:

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

可能是libons.solibclntshcore.so,具体取决于版本/变体。

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

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

【讨论】:

谢谢洛林奇。是的,你是对的。这两个是 libclnthsh.so 的依赖项,我将 LIBPATH 设置为客户端位置。如果可执行文件具有此权限,则加载成功。 IE。 -rwxrwxr-x 但是当权限设置了 SUID 时它会失败。即-rwsrwxr-x。从this问题的回答可以看出它会继承root的权限和环境。因此它不会设置 LIBPATH。我的一种解决方法是在 /usr/lib 中为依赖项设置软链接。但会很乱。 是的,LIBPATH 可能不适用于 set-uid。您可以改用˙sudo˙。或者,在链接时,您可以将选项 -L/aix64/oracle/client/12.1.0.2/client_1/lib 添加到命令行,因此编译器应该将此目录添加到 libpath(检查 dump -H -X64 的输出) 嗨@Lorinczy,对不起,我第一次忘记检查转储-H -X64。我现在已经检查过了,我很惊讶在 `/aix64/oracle/client/12.1.0.2/client_1/lib/libclntsh.so` 的输出中看到一些不存在的路径。路径:/usr1/oracle/app/12102/product/12.1.0/client_1/lib:/usr/lib:/lib:/usr/lib:/lib,对于 12.2 客户端安装,dump -H -X64 中的相同路径是 /aix64/oracle/client/12.2.0.1.0/client_2/lib:/usr/lib:/lib:/usr/lib:/lib。我认为正确的路径可以成功加载 12.2 客户端。你能告诉我这条路径是什么意思,以及如何改变它吗? 此 libpath 可能包含在创建共享对象的计算机上存在的元素,但在您的计算机上不存在。他们不会造成麻烦,也不会提供帮助。我不认为您可以更改此路径,除非您重新链接共享对象,但这并不容易。 (另一方面,作为快速破解,您可以创建一些目录/符号链接以(ab)使用内置的 libpath。) 非常感谢 Lorinczy,实际上重新链接是个好主意。完成后我会更新。再次感谢:)

以上是关于尝试在 AIX 中动态加载 Oracle 客户端库时出错的主要内容,如果未能解决你的问题,请参考以下文章

尝试加载 Oracle 客户端库时引发 BadImageFormatException

尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。

报错:尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。

尝试加载 Oracle 客户端库时引发 BadImageFormatException。问题记录

再次解决 尝试加载 Oracle 客户端库时引发 BadImageFormatException

尝试加载Oracle客户端库时引发BadImageFormatException