告诉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 实现),或者有两个单独的进程(每个进程都使用它是编译)并在它们之间使用某种形式的进程间通信。
我有一个使用 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 实现),或者有两个单独的进程(每个进程都使用它是编译)并在它们之间使用某种形式的进程间通信。