【问题标题】:linux/gcc: ldd functionality from inside a C/C++ programlinux/gcc:来自 C/C++ 程序内部的 ldd 功能
【发布时间】:2009-10-05 12:04:55
【问题描述】:

是否有一种简单有效的方法可以知道给定的动态链接 ELF 缺少运行所需的 .so,所有这些都来自 C/C++ 程序的内部

我需要一个功能与ldd 有点相似的程序,而不是尝试执行ELF 来找出系统中的(满足/未满足)依赖关系。也许通过某个库询问 ld-linux.so 实用程序? (我是linux这部分的新手=)

注意:阅读ldd 的源代码对我的意图没有多大帮助:似乎ldd 实际上是在分叉另一个进程并执行程序。

如果不执行程序就无法知道程序具有未满足的依赖关系,是否有某种方法至少可以从我的程序中快速列出 ELF 所需的所有 .so 文件?

提前致谢 =)

【问题讨论】:

  • 您是否有充分的理由不直接调用 ldd 实用程序并解析其输出?在linux下,这种技术被广泛使用。
  • 我不希望调用 shell 来执行我自己的程序以外的任何东西。此外,fork、启动 shell 等只是为了尝试是否可以运行可执行文件并不是很有效反复试验.. 但是是的,我怀疑调用 ldd 是一个不错的标准选择。
  • 对不起,这是一个神话。 Fork 现在一点也不贵,而且大多数 exec*() 调用不使用 shell 来运行二进制文件。与所有未来调用的 fork()/exec() 开销相比,你很容易通过深入研究 ld-linux 内部来浪费更多时间。

标签: linux gcc linker dependencies ldd


【解决方案1】:

根据ld.so(8),将环境变量LD_TRACE_LOADED_OBJECTS 设置为非空字符串将给出类似ldd 的结果(而不是正常执行二进制文件或库)。

setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
FILE *ldd = popen("/lib/libz.so");

【讨论】:

  • 是的,这将提供与 ldd 完全相同的输出(好吧,可能会设置更多的额外环境)实际上 ldd 只不过是您的代码。但当然,这个解决方案是就像调用 ldd 反过来会调用你的代码一样。我正在寻找另一种解决方案,也许以另一种更直接的方式查询 ld-linux.so ..
  • .. 并且不调用 shell =)
  • 不调用shell很容易——只需forkexec(如果你想要输出,首先pipe,如果你真的想要fdopen,如果你真的想要FILE *)而不是@ 987654330@。这基本上是查询ld-linux.so,而无需硬编码which ld-linux.so
【解决方案2】:

你试过dlopen函数吗?您可以使用它来加载动态库(或者,对于您的情况,检查是否可以加载库)。

拥有所需库的列表比较困难,请查看readelf source 上的handle_dynamic 函数

【讨论】:

  • 这个函数很有趣,我可以看到rpath和其他参数。我会进一步调查,谢谢
【解决方案3】:

如何使用 ptrace() 来跟踪所有 open() 调用以查找程序所依赖的所有内容(但是,输出包括文件,而不仅仅是库)。或者可能通过文件名中的前缀过滤输出“/ lib" 有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2019-02-24
    相关资源
    最近更新 更多