查找全局符号的子插件的 dlmopen 名称空间?

dlmopen namespaces for subplugins that look for global symbols?

我有两个以上符号不兼容的库(libA、libB),所以我将它们加载到 RTLD_LOCAL 命名空间中。但是,每个库都可能加载其他库,这些库似乎在全局命名空间中查找以解决其父级(libA 或 libB)将解析的依赖项(未定义符号)。由于父项不在全局中,因此子库失败并带有未定义的符号。如果我在全局中加载 libA,那么 sublib 可以工作,但由于与 libA 冲突,我无法加载 libB。 dlmopen 进入特定命名空间似乎不会对子库施加命名空间限制。

是否有某种方法可以指定在请求全局时将 libA 的所有子库加载到 libA 的命名空间中?

我唯一的解决办法是每次需要切换库时完全加载和卸载库(并执行任何初始化)。

Is there some way to specify that all sublibraries of libA should load into libA's namespace if asking for global?

GLIBC 中不存在这样的机制。

您没有指定您的目标,但鉴于 dlmopen 是 GLIBC 扩展,我假设您询问的是 Linux / GLIBC 解决方案。

在同一个进程中有两个不兼容/冲突的库是自找麻烦。您应该让您的依赖项就 Python 3.7 或 Python 3.9 达成一致,或者使用多个进程——这是您获得 sane 的唯一方法执行环境。