构建依赖树

8

我如何使用C++构建依赖树?所谓的依赖树是指检查某个程序运行所需的文件。通过检查,我可以找出是否有缺少或损坏的文件。

我该怎么做呢?

编辑:

我不是在寻找一个能替我完成任务的程序!


谢谢,我知道那个工具,但我想自己学习如何做。当然,我不需要像那个工具一样复杂的东西。我只想建立一个非常基本的依赖列表。 - Lockhead
1
假设您想针对可执行文件而不是源代码执行此操作,您需要指定平台(编译后您关心的是可执行文件格式,而不是源代码语言)。 - Jerry Coffin
我需要它跨平台。 - Lockhead
1
我猜你所说的需要文件是dll和库文件?由于不同平台的二进制格式不兼容,你可能会发现在每个平台上寻找一个工具会更容易(对于Windows来说,“Dependeny Walker”是一个很好的工具)。 - MacGucky
2个回答

2
没有跨平台的方法来计算依赖关系,因为这实际上不是一个C++问题。这与编译器输出的可执行文件格式有关,而每个平台都不同。
在Linux(和可能其他Unix系统)中,ldd 命令是您想要的。它会打印出可执行文件需要的(递归)模块,并告诉您它们当前在系统上的位置。
在Windows上,Dependency Walker 是一个优秀的图形化工具,可以让您探索可执行文件(或另一个DLL)所依赖的所有DLL。

当然,这只能检测到程序依赖的其他库。如果您正在寻找程序运行所需的所有文件(例如图像文件等以及在运行时动态加载的库),则没有简单的方法可以做到这一点,因为这些文件在编译时不确定。在Linux上,strace(在输出中搜索open)告诉您进程在运行时打开的所有文件,但是当然它只告诉您有关该程序的特定运行,而不是它将尝试打开的所有可能文件。 - mgiuca
但这仍然没有告诉我如何在Windows上构建依赖树(暂时忘记Linux,因为我的大多数用户都在Windows上)。我可以使用工具来完成它,但我正在寻找如何编写一个C++程序来完成它,可能使用一个库。 - Lockhead
我不知道在Windows上该怎么做。在Linux上,这很容易,因为ldd是一个命令行工具。你只需要打开一个到ldd的套接字并读取输出的文本即可。在Windows上,人们通常构建GUI工具,这些工具无法以编程方式访问。 - mgiuca

0

关于Windows的建议:您可以编写一个模块,捕获应用程序中打开、读取、写入文件的所有调用,并生成请求文件列表,可能过滤掉标准输入/输出、端口、设备等文件。

您也可以在Linux上执行此操作(这甚至比在Windows上更容易)。

无论如何,我不知道如何构建层次结构(树形结构)。 以防万一:您可以与另一个解决方案(例如ldd、dep walker等)配合使用此解决方案。


如果您需要有关此问题的一般信息,请使用谷歌搜索“Windows API hook”。MS-Rem在wasm.ru上有出色的文章,但不幸的是是俄语。此外,我发现了专门为此目的编写的特殊库hook-api,但我从未使用过。如果您需要更具体的答案(如何编写它,可以使用哪些API函数等),请创建一个新问题或给我发送电子邮件 :) - maverik
如果您能使用该模块构建依赖树,我真的需要知道如何编写它。我想我会给您发邮件。您的电子邮件是什么?谢谢! - Lockhead
请注意,我们有两个根本不同的建议:小心不要混淆它们。静态方法(ldd、dep walker等)仅获取库,但始终有效。动态方法(捕获对open的调用)获取所有文件,但仅获取在该测试运行中打开的文件,因此并不总是有效。 - mgiuca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接