【问题标题】:In shared library's constructor (_init section), how to know what function is interrupted?在共享库构造函数(init 部分)中,如何知道中断了哪个函数?
【发布时间】:2011-07-21 00:19:48
【问题描述】:

在 x86 linux 上,进程 A.exe 调用 dlopen() 来加载共享库 B.so。在 B.so 中,有一个构造函数,他想知道进程 A.exe 中的哪个函数在调用 dlopen() 之前被中断。

B.so 中的构造函数(_init 部分)怎么知道?

【问题讨论】:

  • 你想用这个解决什么问题?

标签: c++ c linker shared-libraries ld


【解决方案1】:

如果我正确理解了您的问题(“中断”可能具有误导性),则您的应用程序 A 有几个可能调用 dlopen() 的位置,并且您想知道从这些位置中的哪个位置调用了您。

首先,这有点不对劲,因为共享库不应该对谁在加载它做出任何假设。如果是这样,例如,您可以不在 Valgrind 中运行您的应用程序,因为在这种情况下,Valgrind 将执行加载而不是标准动态链接器,您的结果可能会出错。

其次,如果您真的需要这样做(为什么?),那么您可以在构造函数中进行回溯。然后向上搜索,直到找到 dlopen(),在下一个更高的堆栈帧上,您将找到调用 dlopen 的函数。

编辑:要将堆栈跟踪中的地址映射回函数,您需要相关二进制文件的调试信息或任何其他将函数地址映射到符号名称的方式。

【讨论】:

  • 这个答案在精神上是正确的,但在细节上是错误的。当您在 Valgrind 中运行程序时,VG 会相当忠实地模拟程序行为。特别是,在过程中执行 backtrace() 会产生类似的结果,无论是否使用 VG。此外,将地址映射到函数不需要调试信息,符号表就足够了。
  • 是的,对不起,我把符号表和调试信息弄混了。
猜你喜欢
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多