我通常不会在Windows开发上工作,并且完全不熟悉工具链和构建系统.我的嵌入式产品包括来自其文件系统中第三方的一些Windows DLL(由安装文件系统的Windows机器使用).
我有一个问题:与以前的版本相比,这些DLL的最新版本大小增加了三倍,并且它们不再适合文件系统.DLL的功能没有太多变化,所以我怀疑开发人员只是忘了在这个drop中删除调试符号.我会问他们,但由于时区和语言差异,得到答案通常需要几天时间.
有人可以解释一下,对于不熟悉VisualC的人使用简单的步骤,如何确定DLL是否仍然包含调试信息以及如何将其删除?
通常,调试信息本身是作为单独的*.pdb
文件(Program DataBase)构建的,而不是像在unix中一样附加到二进制文件中.如果开发人员确实构建了库的调试版本,则更严重的问题可能是依赖关系.如果二进制文件的发布版本链接到MSVCRT.DLL
,则调试版本将链接到MSVCRTD.DLL
(其他运行时库类似地用D后缀命名).要查找特定二进制文件的依赖项,请尝试:
dumpbin /imports whatever.dll
这将显示库的所有运行时依赖项whatever.dll
(请注意,列出了这些库中的库名称和符号).如果您没有看到所期望的依赖项列表,则可能只有原始开发人员以正确的构建模式重建库才能解决该问题.
Rebase是微软工具集的一部分.除了设置dll的基址之外,它还可以将任何附加的调试信息删除到单独的.dbg文件中.
rebase -i 0x10000000 -a -x.\ -p
理论上,您应该尝试确定dll是否已构建到唯一的基址并使用它.或者,选择一个基址来最小化与应用程序使用的任何其他dll发生冲突的可能性,以便Windows在加载时不必修补dll.在一个加载器通常将模块的加载地址随机化为安全特征的时代,我不确定它是否值得特别设置基址的麻烦.