3

我正在寻找一种能够生成最小 EXE 文件的编程语言。

除了以下操作系统所共有的 DLL 之外,它还需要没有依赖项:发布 Windows XP、Vista、7 和 8。例如,具有静态链接的 C++ 应用程序、Delphi、VB6、RealBasic 等。

它还应该在 2000 年之后制造的所有 32 位和 64 位 Intel + AMD 处理器上运行,并且只有一个 EXE。

4

3 回答 3

7

汇编!它不能比这更小。

于 2013-04-28T19:24:22.877 回答
3

你不会找到答案。C 和汇编将为您提供一些您能找到的最小的可执行文件,但如果您不小心,它们也可以为您提供巨大的可执行文件。

所有现代编译器都可以生成高效的可执行文件。

别担心。选择对您来说最容易完成工作的语言。

于 2013-04-28T19:25:11.933 回答
2

这取决于您使用的特定构建工具(编译器和链接器)以及配置和内容,而不是语言本身。

如果您使用纯 C 并排除 C 运行时库,Visual C++ 2010 可以生成小型可执行文件。

如果您需要使用 C 运行时库,您可能必须尝试使用​​ Visual C++ 6(缺点:不支持)或 mingw(缺点:生成技术上不受支持的可执行文件),两者都使用 Windows 内置的运行时库XP 及更高版本。

没有运行时库的 Visual C++ 2010 的可执行文件大小为 1K,最多可容纳 512 字节的代码和初始化数据。这与工作 Windows 可执行文件一样小,因为必须至少有一个节,并且最小节偏移量和大小都是 512 字节。

通常,可执行文件大小为 512 字节的开销加上代码和初始化数据的大小,四舍五入为 512 字节的倍数。

要在 Visual Studio 2010 中排除运行时库,请将 Linker->Input 下的“Ignore All Default Libraries”设置为“Yes”,并在 Linker->Advanced 下设置一个入口点(例如,“NoCRTMain”)。此配置中主要功能的签名是

void __stdcall NoCRTMain()

您可能还需要在 C/C++->代码生成下将“缓冲区安全检查”设置为“否”。缓冲区安全检查功能使用运行时库函数。

此时,如果您的代码和常量数据少于 512 字节,则可执行文件的大小将为 3K,如果您已初始化非常量数据,则为 3.5K。

您可以通过不包含清单(链接器->清单文件)再节省 512 个字节。

您可以通过使图像不可重定位来节省另外 512 个字节。在 Linker->Advanced 中将“Randomized Base Address”设置为“No”,将“Fixed Base Address”设置为“Yes”。

要将其降低到 1K,您需要合并代码、常量数据和初始化数据部分。为此,请在 Linker->Command Line 下添加这些额外的命令行选项:

 /SECTION:.text,ERW /MERGE:".rdata=.text" /MERGE:".data=.text" 

出于安全原因,您可能更愿意不合并已初始化的数据部分;这样做会部分禁用数据执行保护 (DEP)。如果是这样,只需使用

 /MERGE:".rdata=.text" 

或在 Linker->Advanced 中设置等效选项。

如果您没有合并所有的部分,您可以通过将默认的 MS-DOS 存根替换为较小的存根来节省另外 512 个字节,从而减小整体标头大小以适应 512 字节的最小对齐大小。这可以通过添加 /STUB 命令行选项 (Linker->Command Line) 并使用此处可用的最小存根来完成。如果您愿意,您可以通过提取任何 Windows 可执行文件的前 64 个字节来创建自己的最小存根。

于 2013-04-29T01:59:35.433 回答