【问题标题】:Tell dlopen in which library to search for symbols first告诉 dlopen 先在哪个库中搜索符号
【发布时间】: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 dlopendlsym 你应该没问题 不是真的。即使您可以通过使用dlsym 以某种方式控制直接调用(您将如何确定链接器使用的错误名称?),您也无法控制这些调用中的代码的作用。在这种情况下,如果您使用dlsym() 调用libstdc++.so,那么您调用的代码很可能使用libmystd.so 中的符号结束。如果您使用模板,祝您好运...

标签: c++ c shared-libraries dlopen


【解决方案1】:

我如何告诉 dlopen 先搜索 libstdc++.so 中的符号而不是 libmystd.so

您可以先加载libstdc++.so,然后其符号将“获胜”。

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

确实没有办法在一个进程中安全地混合两个独立的 C++ 运行时实例。任何看起来可行的方法都会隐藏一些问题,并且不会真正起作用(调试会很痛苦)。

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

【讨论】:

  • 最后我使用了 2 个独立的进程
猜你喜欢
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
相关资源
最近更新 更多