【问题标题】:What is the shared library name of the current function当前函数的共享库名称是什么
【发布时间】:2019-02-25 12:52:30
【问题描述】:

我正在做一个非常大的项目。我的项目包含很多共享库。一些源文件 (CPP) 用于多个共享库中。

最近我遇到了一个错误,需要在执行时找出函数的 .so 名称。

例如:

  1. Test1.cpp 包含函数 TestMethod()

  2. Test1.cpp 包含在 lib1、lib2 和 lib5 中。大约有 10 个图书馆。

  3. 所以 TestMethod 存在于 lib1、lib2 和 lib5 中。

  4. 我想从 TestMethod() 内部调用一个函数,这样当程序正在执行时,当调用 TestMethod() 时,它应该返回它是 lib1 的版本还是 lib2 的版本或 lib5 的版本。

TestMethod() 正在创建一个 SubType 对象,它是 SuperType 的子类。 SubType 和 SuperType 在 Test1.cpp 中定义。有时 lib6/lib7 正在调用 TestMethod 并获取对象。完成后,lib6/lib7 正在对象指针上调用 delete。但是删除因分段错误而崩溃,回溯顶部显示“typeinfo for class SubType”。

[注 1]:我使用的是 libc++ 库。 RTTI 不能跨共享库工作。所以我怀疑这是导致问题的原因。我怀疑当 delete 被调用时,它(lib6 中的 delete 调用)似乎试图获取 SubType 的类型信息并且未能获取它。

通过获得使用什么库的信息,我可以调试编译,链接用于准备共享库的标志。

任何建议都将不胜感激。谢谢

【问题讨论】:

  • 这应该取决于您实际链接的库,以及如何链接(库是静态库还是动态库?​​)
  • 都是动态库
  • 您的应用程序是否链接到所有库?而且,只要它做同样的事情,使用哪个定义真的很重要吗?您遇到的真正问题是什么?请直接询问(除非这只是出于好奇,在这种情况下,您应该通过编辑您的问题明确说明)。
  • 是的。我的应用程序正在使用所有库。 +添加了更多细节。
  • 这是TestMethod 函数本身的错误吗?还是在它调用的某些支持功能中?您可以在调试构建中复制错误并在调试器中运行/单步执行吗?除非您在不同的库中有不同版本的函数,否则我仍然不明白如果该函数中有错误有什么关系。修复一次函数,重建所有库,处处修复。

标签: c++ shared-libraries


【解决方案1】:

您可以为此使用环境变量LD_DEBUG=bindings。例如。查看函数malloc 的定义位置:

$ LD_DEBUG=bindings ls 2>&1 | grep '\bmalloc\b'
45968:     binding file /lib/x86_64-linux-gnu/libc.so.6 [0] to ls [0]: normal symbol `malloc' [GLIBC_2.2.5]
45968:     binding file /lib/x86_64-linux-gnu/libpcre.so.3 [0] to ls [0]: normal symbol `malloc' [GLIBC_2.2.5]
45968:     binding file /lib64/ld-linux-x86-64.so.2 [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `malloc' [GLIBC_2.2.5]
45968:     binding file /lib/x86_64-linux-gnu/libc.so.6 [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `malloc' [GLIBC_2.2.5]
45968:     binding file ls [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `malloc' [GLIBC_2.2.5]

【讨论】:

  • 谢谢。我想以编程方式获取事物信息。我已经编辑了描述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2014-01-26
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 2014-10-05
相关资源
最近更新 更多