【问题标题】:How to find who is calling the shared library functions?如何找到谁在调用共享库函数?
【发布时间】:2015-05-27 14:04:22
【问题描述】:

我有一些 C++ 代码,在内部使用多个第三方库。代码编译良好,但在执行期间无法加载某些共享库(libintbasic.so)。鉴于这种情况,我无法将任何库安装到系统中,唯一的出路是找到哪个函数正在调用该库。我怎么知道谁在调用那个库(我的代码没有直接调用它)。

【问题讨论】:

  • 使用调试器查找导致调用的行。
  • 您可能需要添加“linux”标签

标签: c++ linker shared-libraries


【解决方案1】:

我无法在系统中安装任何库,

这似乎是一个虚假的声明:显然您可以将二进制文件复制到系统上。在同一个目录中安装一个额外的库并不难。

我怎样才能知道是谁在调用那个库

有两种情况需要考虑:

  1. 您的二进制文件或它直接链接到libintbasic.so 的链接的库之一。您的二进制文件根本不会运行,或者
  2. 您的二进制文件,或它与调用 dlopen("libintbasic.so",...) 直接链接的库之一,并在该 dlopen 失败时失败。

设置LD_DEBUG=files,libs 通常最容易调试第一种情况。然后动态加载器会告诉您正在加载哪些库,以及为什么需要它们。

使用gdb 可以轻松调试第二种情况:在dlopen 上设置断点,并在每次遇到断点时执行whereinfo shared 命令。

【讨论】:

    【解决方案2】:

    删除链接选项-lintbasic,您将在错误消息中看到所有需要此库的函数。这不干净,但应该可以正常工作。

    【讨论】:

    • 嗯,这并不是我真正想做的事情。我想摆脱那些调用它的函数。我想找出那些函数。
    【解决方案3】:

    您可以递归地使用 ldd 实用程序来查找共享库之间的所有依赖项。

    以下链接也可能有用:Does ldd also show dependencies of dependencies?

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2016-10-18
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多