剥离Windows DLL调试信息?

DGe*_*try 6 windows dll

我通常不会在Windows开发上工作,并且完全不熟悉工具链和构建系统.我的嵌入式产品包括来自其文件系统中第三方的一些Windows DLL(由安装文件系统的Windows机器使用).

我有一个问题:与以前的版本相比,这些DLL的最新版本大小增加了三倍,并且它们不再适合文件系统.DLL的功能没有太多变化,所以我怀疑开发人员只是忘了在这个drop中删除调试符号.我会问他们,但由于时区和语言差异,得到答案通常需要几天时间.

有人可以解释一下,对于不熟悉VisualC的人使用简单的步骤,如何确定DLL是否仍然包含调试信息以及如何将其删除?

Gre*_*ill 5

通常,调试信息本身是作为单独的*.pdb文件(Program DataBase)构建的,而不是像在unix中一样附加到二进制文件中.如果开发人员确实构建了库的调试版本,则更严重的问题可能是依赖关系.如果二进制文件的发布版本链接到MSVCRT.DLL,则调试版本将链接到MSVCRTD.DLL(其他运行时库类似地用D后缀命名).要查找特定二进制文件的依赖项,请尝试:

dumpbin /imports whatever.dll
Run Code Online (Sandbox Code Playgroud)

这将显示库的所有运行时依赖项whatever.dll(请注意,列出了这些库中的库名称和符号).如果您没有看到所期望的依赖项列表,则可能只有原始开发人员以正确的构建模式重建库才能解决该问题.


Chr*_*cke 5

Rebase是微软工具集的一部分.除了设置dll的基址之外,它还可以将任何附加的调试信息删除到单独的.dbg文件中.

rebase -i 0x10000000 -a -x.\ -p

理论上,您应该尝试确定dll是否已构建到唯一的基址并使用它.或者,选择一个基址来最小化与应用程序使用的任何其他dll发生冲突的可能性,以便Windows在加载时不必修补dll.在一个加载器通常将模块的加载地址随机化为安全特征的时代,我不确定它是否值得特别设置基址的麻烦.


jef*_*ffm 3

您将希望从开发人员那里获取发布版本,即使这很痛苦,因为调试版本默认情况下是在禁用代码优化的情况下编译的。因此,即使您以某种方式删除了调试信息,您也会留下效率不高的代码。(更不用说其中可能存在任何调试陷阱和消息。)

至于确定您拥有哪种类型的 DLL,您可以使用Dependency Walker来查看您的 DLL 是否链接到 VC 运行时库的调试或发布版本(假设这些库不是静态链接的)。

  • 这是如何被接受的答案?DLL是否有调试信息与它是在调试信息还是发布信息中编译无关。 (2认同)