告诉dlopen先在哪个库中搜索符号

Tell dlopen in which library to search for symbols first

我有一个使用 libstdc++.so 的共享库 libmylib.so 还有另一个共享库,其中包含与 libstdc++.so 符号同名的符号。库名称是 libmystd.so

libmystd.so先加载,然后我用dlopen打开libmylib.so 问题是符号是从 libmystd.so 而不是 libstdc++.so 加载的。我如何告诉 dlopen 先搜索 libstdc++.so 中的符号而不是 libmystd.so

这就是我使用 dlopen

打开 libmylib.so 的方式
myHandle = dlopen("libmylib.so", RTLD_GLOBAL | RTLD_NOW)

然后我从这个共享库调用一个函数,但它崩溃了,因为 std::vercotr 析构函数是从 libmystd.so 而不是 libstdc++.so

调用的
0xedb4e936 _ZNSt6vectorISsSaISsEED2Ev + 76     libmystd.so
 0xeb9494ff _ZN10MySymbolESs + 1db      libmylib.so

How can I tell dlopen to search for the symbols in libstdc++.so first instead of libmystd.so

您可以先加载libstdc++.so,然后它的符号会"win"。

大概这对您来说是个问题,因为您希望其他代码使用 libmystd.so 代替 of libstdc++.so

确实无法在单个进程中安全地混合两个独立的 C++ 运行时实例。任何看似有效的方法都会隐藏陷阱,并且不会真正起作用(并且调试这将是痛苦的)。

唯一明智的方法是为其中一个实现构建代码(并使用 that 实现),或者有两个单独的进程(每个进程都使用它是编译)并在它们之间使用某种形式的进程间通信。