【发布时间】: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
在 x86 linux 上,进程 A.exe 调用 dlopen() 来加载共享库 B.so。在 B.so 中,有一个构造函数,他想知道进程 A.exe 中的哪个函数在调用 dlopen() 之前被中断。
B.so 中的构造函数(_init 部分)怎么知道?
【问题讨论】:
标签: c++ c linker shared-libraries ld
如果我正确理解了您的问题(“中断”可能具有误导性),则您的应用程序 A 有几个可能调用 dlopen() 的位置,并且您想知道从这些位置中的哪个位置调用了您。
首先,这有点不对劲,因为共享库不应该对谁在加载它做出任何假设。如果是这样,例如,您可以不在 Valgrind 中运行您的应用程序,因为在这种情况下,Valgrind 将执行加载而不是标准动态链接器,您的结果可能会出错。
其次,如果您真的需要这样做(为什么?),那么您可以在构造函数中进行回溯。然后向上搜索,直到找到 dlopen(),在下一个更高的堆栈帧上,您将找到调用 dlopen 的函数。
编辑:要将堆栈跟踪中的地址映射回函数,您需要相关二进制文件的调试信息或任何其他将函数地址映射到符号名称的方式。
【讨论】: