Windows 来自 Visual C++ 编译器调试数据库的 PE

Windows PE from Visual C++ compiler debug database

我编写了一个非常简单的应用程序,它只是将地狱世界打印到 C++ Win32 控制台。我在 HxD 中遇到了对调试数据库文件的引用,之前从未注意到它,我正在为“调试”而不是“发布”构建它。我改变了这个,发布可执行文件也包括这个引用。

有谁知道我是否做错了什么,就好像我要发布这个,我构建它是为了发布,对吗?为发布构建可执行文件的“正确”方法是什么。

我还看到一些项目汇编 XML 更进一步,我对最小化 Windows PE 可执行文件很感兴趣,我认为必须有编译器选项是否正确?也许这一切都与 IDE 有关,而我正在寻找的只是一个文本编辑器和准系统编译器?

即使在发布模式下,Visual C++ 也会生成一个程序数据库(*.PDB;完整路径嵌入在二进制文件中,可以被一些调试器使用)和一个清单文件(XML 你看到的在你的可执行文件中)。

禁用 PDB 生成

  • 在 Visual C++ 中,转到您的项目属性 (Edit > xxx Properties [ALT+F7])。
  • 在您的项目属性中转到 Configuration Properties > Linker > Debugging
  • Generate Debug info设置为No(默认情况下应该是Yes (/DEBUG)

警告:调试时您现在没有任何符号。

禁用清单文件

  • 在 Visual C++ 中,转到您的项目属性 (Edit > xxx Properties [ALT+F7])。
  • 在您的项目属性中转到 Configuration Properties > Linker > Manifest File
  • Generate Manifest设置为No(默认情况下应该是Yes (/MANIFEST)

您可能还想检查 Configuration Properties > Manifest tool 中的属性。

警告:清单主要用于 DLL 并排加载、COM 隔离和用户访问控制。确保您的可执行文件在禁用清单生成时运行良好。

有多种技巧可以减少 PE 文件(除了明显的压缩)以从编译器和链接器通道获得最小文件,这些技巧在演示场景中众所周知,其中一些是 explained here。请记住,它有一些缺点,需要进行全面测试以查看生成的 PE 文件是否正确运行。