在共享库的构造函数(_init部分)中,如何知道什么函数被中断了?

In shared library's constructor (_init section), how to know what function is interrupted?

本文关键字:什么 何知道 函数 中断 共享 构造函数 部分 init      更新时间:2023-10-16

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

构造函数(_init section)如何在B.so中知道?

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

首先,这听起来不对劲,因为共享库不应该对谁在加载它做出任何假设。如果是这样,你可以不要在Valgrind中运行你的应用程序,因为在这种情况下,Valgrind会做加载而不是标准的动态链接器,你的结果可能会被打乱。

第二,如果你真的需要这样做(为什么?),那么你可能会在构造函数中进行反向跟踪。然后向上搜索,直到找到dlopen(),在下一个更高的堆栈帧上,您将找到调用dlopen的函数。

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