【发布时间】:2018-12-17 08:44:01
【问题描述】:
我有一个共享库libmylib.so,它使用libstdc++.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
【问题讨论】:
-
您是否真的试图同时使用两个不同版本的 C++ 运行时库运行一个进程?
-
@AndrewHenle 这可以实现吗?
-
如果您使用
dlopen(filename, mode)和可能的后续dlsym(handle, name)显示代码,问题会更清楚。 -
@Ripi2 我添加了 dlopen 代码
-
@Tyker 但
dlopen和dlsym你应该没问题 不是真的。即使您可以通过使用dlsym以某种方式控制直接调用(您将如何确定链接器使用的错误名称?),您也无法控制这些调用中的代码的作用。在这种情况下,如果您使用dlsym()调用libstdc++.so,那么您调用的代码很可能使用libmystd.so中的符号结束。如果您使用模板,祝您好运...
标签: c++ c shared-libraries dlopen