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

发布于 2024-11-25 11:34:56 字数 139 浏览 2 评论 0原文

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

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

On x86 linux, process A.exe invokes dlopen() to load a shared library B.so. In B.so, there's a constructor, who wants to know which function in process A.exe is interrupted right before dlopen() is invoked.

How can constructor (_init section) in B.so know?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风尘浪孓 2024-12-02 11:34:56

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

首先,这听起来是错误的,因为共享库不应该对谁正在加载它做出任何假设。如果是这样,您可能无法在 Valgrind 中运行您的应用程序,因为在这种情况下,Valgrind 将代替标准动态链接器进行加载,并且您的结果可能会被搞砸。

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

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

If I understand your question correctly (the 'interrupting' might be misleading), your application A has several locations that might call dlopen() and you want to know from which of these locations you were called.

First of all, this smells wrong, because a shared library should not be supposed to make any assumptions about who is loading it. If so, you could for instance not run your application in Valgrind, because in this case Valgrind would do the loading instead of the standard dynamic linker and your results might get screwed.

Second, if you really need to do this (why?), then you might take a backtrace in your constructor function. Then search upwards until you find dlopen() and on the next higher stack frame you will find the function that called dlopen.

EDIT: To map the addresses in the stack trace back to functions, you will need debug info of the involved binaries or any other way to map function addresses to symbol names.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文