使用符号减小二进制修补程序大小

对目标和升级映像二进制文件使用公共符号可以将二进制补丁大小减小大约一半。 实际的减少取决于所使用的符号。 请注意,使用符号可能会导致修补程序创建速度变慢,因为处理符号文件需要更长的时间。

要使用符号减小二进制修补程序的大小,必须为目标和升级映像二进制文件提供符号。 在 TargetImages 表的 SymbolPaths 列和 UpgradedImages 表的 SymbolPaths 列中指定符号。 必须使用 Visual C++ 以程序数据库 (PDB) 文件格式生成符号。 较高版本的 Visual C++ 在 PDB 文件中提供了所有必要的信息。 较低版本的 Visual C++ 还会生成调试 (DBG) 文件格式。 在这种情况下,SymbolsPaths 值应指定 PDB 和 DBG 文件的位置。

例如,修补程序的 TargetImage 可能是 Windows 2000 附带的安装包,该安装包安装 1.1.10 29.0 版本的 MSI.DLL。 UpgradedImage 可能是带有 Service Pack 1 (SP1) 的 Windows 2000 附带的更新安装包,此安装包将安装 1.1 1.13 14.0 版本的 MSI.DLL。 然后,必须创建两个修补程序创建属性 (PCP) 文件,其中一个文件须将 TargetImagesUpgradedImages 表的 SymbolPaths 列保留为 NULL(空白),另一个文件须使用二进制文件的符号位置填充的 TargetImages 和 UpgradedImages 表的 SymbolPaths 列。 在这种情况下,不使用符号生成的修补程序的大小大约是使用符号生成的修补程序大小的三倍。

Mpatch.exe 实用工具可用于测试单个文件的二进制修补程序的生成,并检查符号是否有效。 Mpatch.exe 实用工具包含在适用于 Windows Installer 开发人员的 Windows SDK 组件中。 Mpatch.exe 的输出将指示符号是否不匹配。

例如,输入以下命令行以检查符号是否有效。

mpatch.exe -NEWSYMPATH:d:\update -OLDSYMPATH:d:\target d:\target\example.dll d:\update\example.dll example.pat

如果符号不在正确的位置,Mpatch.exe 的输出可能包括以下警告。

WARNING: no debug symbols for d:\update\example.dll