首页 > 解决方案 > Oracle 和 Postgres 客户端代码在同一个任务中?

问题描述

我遇到了一个意想不到的问题:我需要一个通过 Oracle 的共享库 libclnt 与 Postgres(通过 libpq)和 Oracle 对话的任务。但是,将两个库链接到核心的任务。也就是说,一个连接到 oracle 并连接到 PG 的 C/C++ 程序 --- 没有其他东西 --- 将在 OCIServerAttach 方法中连接到 Oracle 时成为核心。问题似乎是在运行时加载的 libclnt 内的 ssh/ldap/crypto 库和 libpq 所依赖的链接的 ssh/ldap/crypto 库之间存在显着重叠。有人做过这项工作吗?

标签: postgresqloracle

解决方案


我知道这样做的唯一方法是在dlopen(3)使用RTLD_DEEPBIND标志时在运行时加载共享库。这是特定于 GNU C 库的,因此它只适用于使用该库的系统。

根据文档

RTLD_DEEPBIND(从 glibc 2.3.4 开始)

将此共享对象中符号的查找范围置于全局范围之前。这意味着自包含对象将优先使用其自己的符号,而不是已加载的对象中包含的具有相同名称的全局符号。

然后每个库将使用与其链接的库中的符号。


推荐阅读