我在Windows 10上使用MinGW来构建Windows可执行文件(在Rust中编程,但我认为这部分不重要)。我不想手动跟踪我使用的库中有哪些DLL文件需要包含在我的应用程序的发布版本中,因此我希望能够编写一个脚本我可以在构建它之后自动在应用旁边找到并复制它们。为此,我试图找到一个命令行程序,它将列出(向stdout或文件)我传递的Windows可执行文件的DLL依赖项 - 如果它过滤掉我可以假设的DLL,则可获得奖励积分首先包含在Windows中。
我已经了解了Dependency Walker,但它已经很老了,似乎不太喜欢Windows 10(它产生了很多假阴性);我知道dumpbin,但从它的声音我无论如何都不能在Visual Studio上下文之外使用它。 Cygwin显然有一个工作的ldd,但是如果我能帮助它的话,我宁愿不是为了这个目的完全安装Cygwin。
还有其他工具可用于此目的吗?如果没有,我怎么能自己编程呢?我已经看到一个脚本为了这个目的而擦除objdump -p
(MinGW实用程序)的输出;如果没有更好的方法,我总是可以依靠它。
答案 0 :(得分:1)
我解释你的问题如下。给定.exe
如何编写一个程序,列出动态链接库的外部依赖项?鉴于此列表,我如何对未包含在Windows中的dll进行排序?
您必须弄清楚Windows中的动态链接器如何获取此信息。请参阅.exe
或可移植可执行文件格式,特别是导入表。
“PE文件导入早些时候,我描述了函数调用外部的方式 DLL不直接调用DLL。而是,CALL指令去了 到某个地方的JMP DWORD PTR [XXXXXXXX]指令 可执行文件的.text部分(或.icode部分,如果你使用Borland C ++)。 JMP指令查找和传输的地址 控制到是真正的目标地址。 PE文件的.idata部分 包含加载程序确定所需的信息 目标函数的地址并将它们修补到可执行文件中 图片。 .idata部分(或导入表,我更喜欢称之为) 从一组IMAGE_IMPORT_DESCRIPTOR开始。有一个 PE文件隐式链接的每个DLL的IMAGE_IMPORT_DESCRIPTOR 至。没有字段表示此处的结构数量 阵列。相反,数组的最后一个元素由a表示 IMAGE_IMPORT_DESCRIPTOR,其字段填充了NULL。格式 IMAGE_IMPORT_DESCRIPTOR的结果如图10所示。“
“ - Matt Pietrek 1994年3月Matt Pietrek是Windows的作者 内部(Addison-Wesley,1993)。他在Nu-Mega Technologies工作 可以通过CompuServe与本公司联系:71774,362这篇文章是 转载自1994年3月的Microsoft Systems Journal。 版权所有©1994 Miller Freeman,Inc。保留所有权利。没有 本文的部分内容可能以任何形式复制(简要除外) 没有事先的批评文章和评论中使用的引文 米勒弗里曼同意。“ - https://msdn.microsoft.com/en-us/library/ms809762.aspx
.exe
应该有一个导入表,其中WINNT.H中定义的结构包含每个隐式链接的dll的DWORD name
。请注意,您必须了解Windows 10的更改方式以及可执行格式是否有更改。希望这有助于你想要编程来做这件事。
同时获取windows标准用户模式驱动程序和dll的列表应该很容易找到并检查。
我用c ++编写的.exe
片段,我可以找到
_CxxThrowException w _CorExeMain mscoree.dll
8! 0 1 2 3 9 :; < )* +, - 。 / 4 5 6 7 “#$%&'(=>?N O R T V P Q S. U @ B C D E G H I J K M A F L Y Z [] ^ _`a b c d e fÿÿÿÿ±¿DNæ@» Ès@。?AVbad_alloc @ std @@Ès@。?AVexception @ std @@Ès@
。?AVbad_array_new_length @ std @@Ès@。?AVtype_info @@
所以看起来搜索字符串".dll"
会起作用,然后使用windows标准dll列表过滤它。
或者我写了一个非常粗糙的表单应用程序,它最低限度地满足你的要求。它在源代码和可执行文件的github上。我不使用表单应用程序,所以请原谅这些错误。 https://github.com/marshalcraft/CheapoDllDependencyTool