postgresql - Oracle 和 Postgres 客户端代码在同一个任务中?
问题描述
我遇到了一个意想不到的问题:我需要一个通过 Oracle 的共享库 libclnt 与 Postgres(通过 libpq)和 Oracle 对话的任务。但是,将两个库链接到核心的任务。也就是说,一个连接到 oracle 并连接到 PG 的 C/C++ 程序 --- 没有其他东西 --- 将在 OCIServerAttach 方法中连接到 Oracle 时成为核心。问题似乎是在运行时加载的 libclnt 内的 ssh/ldap/crypto 库和 libpq 所依赖的链接的 ssh/ldap/crypto 库之间存在显着重叠。有人做过这项工作吗?
解决方案
我知道这样做的唯一方法是在dlopen(3)
使用RTLD_DEEPBIND
标志时在运行时加载共享库。这是特定于 GNU C 库的,因此它只适用于使用该库的系统。
根据文档:
RTLD_DEEPBIND
(从 glibc 2.3.4 开始)将此共享对象中符号的查找范围置于全局范围之前。这意味着自包含对象将优先使用其自己的符号,而不是已加载的对象中包含的具有相同名称的全局符号。
然后每个库将使用与其链接的库中的符号。
推荐阅读
- android - 找不到类 javax.xml.crypto.dsig.dom.DOMSignContext
- vue.js - 与 vuejs 一起使用时无法更新 prismjs 的属性行号?
- java - 如何修复 java.lang.InstantiationException?
- java - 从 gradle 实现中删除 ActionBarSharelock 后出现“ActionBarSherlock”错误
- laravel - 在 laravel 6.0 中未定义命令“ui”
- typescript - typescript: create a function accepting IncomingHttpHeaders as parameter
- angular - TypeScript declare var error for object.property - what to do?
- entity-framework - 有没有办法自动对我的整个 EDMX 设计器进行排序?
- mongodb - Mongo 仅更新子文档中的一项并在同一子文档中添加一项
- ios - What is the standard method for implementing navigation menus in swift?