近几个月的 Windows 高空作业让我发现,dumpbin 这个小工具往往能解决一些关键问题。目前发现并且使用过的这个小家伙的功能有:
- 查看 DLL 动态链接库导入导出信息,解决动态链接库导出和可执行程序引用对接问题、程序缺失库问题
- 查看可执行程序的依赖库信息,解决各种程序运行时报错
- 查看程序、库位数信息,找到库引用位数不匹配等尴尬问题
配置 path
首先,DUMPBIN.EXE 程序可以在
右键计算机,属性→高级系统配置→环境变量→双击系统变量中的 Path→ 在变量值后面加上 DUMPBIN.EXE 程序所在全局路径。(注意:添加路径前需要有”;”隔开,因为变量值是通过”;”分隔的)。
查看 DLL/EXE 导入导出信息
接下来我们就可以使用这个工具查看一个 DLL 提供的导出函数,(如下左图)。1
2dumpbin.exe -exports xxx.dll
dumpbin.exe -exports xxx.exe
其中要注意的 “ordinal列” 列出的信息是导出函数的序号;“RVA列” 是一些地址值,也就是导出函数在 DLL 模块中的位置,通过该地址值可以在 DLL 中找到相应的函数;“name列” 是导出函数的名称,使用该 DLL 的程序通过该名称找到所需的 DLL 导出函数。
还可以使用这个工具查看一个 可执行模块依赖的动态链接库信息 以及该 动态链接库中被可执行模块调用的函数
1 | dumpbin.exe -imports xxx.dll |
这里需要注意的是:一个可执行模块依赖的库函数名称必须与该动态链接库导出的函数名字相一致,因为可执行模块使用依赖的库函数名称来调用DLL中的函数,只有在二者相一致的情况下,可执行模块才能找到所需的DLL导出函数。因此客户端程序引用的函数符号名必须与 DLL 中的导出函数名称一致才能成功调用!
查看 DLL/EXE 位数信息
经常犯的一个错误是,构建运行的可执行程序,往往与系统位数保持一致,而现在系统通常都是 64位的;然而该可执行程序运行时需要的动态链接库却错误地绑定成 32位的依赖库了,这其实就是报错 入口不一致… 的主要原因。 我们可以通过 dumpbin 来查看我们生成的可执行程序的是多少位的,同时,使用上面介绍的 dumpbin.exe -imports xxx.exe 查看该可执行程序的依赖库信息,然后检查相关依赖库的位数是否有偏差。1
2dumpbin /headers XXX.exe
dumpbin /headers XXX.dll
执行上述命令会打印出一些信息,在信息的最开始 FILE HEADER VALUES 字段中有 machine 字样,假如 machine 是 x64 或者 Unknown 说明该 dll/exe 是 64位的;i386 字样则通常是 32位的。