我正在寻找一种生成最小EXE文件的编程语言。
除了随附的DLL之外,它还需要没有依赖项,并且对于以下操作系统是通用的:发布Windows XP,Vista,7和8.带有静态链接的C ++应用程序,Delphi,VB6,RealBasic等。
它也应该在所有32位& 2000年以后生产的64位英特尔+ AMD处理器只有一个EXE。
答案 0 :(得分:5)
汇编!它不能比那更小。
答案 1 :(得分:2)
你找不到答案。 C和汇编将为您提供一些您可以找到的最小的可执行文件,但如果您不小心,它们也可以为您提供大量的可执行文件。
所有现代编译器都可以生成高效的可执行文件。
不要担心。选择最容易完成工作的语言。答案 2 :(得分: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。
您可以通过不包含清单(Linker-> Manifest File)来保存另外512个字节。
您可以通过使图像不可重定位来保存另外512个字节。在Linker-> Advanced中将“Randomized Base Address”设置为“No”,将“Fixed Base Address”设置为“Yes”。
要将其降低到1K,您需要合并代码,常量数据和初始化数据部分。为此,请在Linker->命令行:
下添加这些额外的命令行选项 /SECTION:.text,ERW /MERGE:".rdata=.text" /MERGE:".data=.text"
出于安全原因,您可能不希望合并初始化的数据部分;这样做会部分禁用数据执行保护(DEP)。如果是这样,请使用
/MERGE:".rdata=.text"
或在Linker-> Advanced中设置等效选项。
如果您没有合并所有部分,则可以通过用较小的部分替换默认的MS-DOS存根来保存另外512个字节,从而减少整个标头大小以适应512字节的最小对齐大小。这可以通过添加/ STUB命令行选项(链接器 - >命令行)并使用minimal stub available here来完成。如果您愿意,可以通过提取任何Windows可执行文件的前64个字节来创建自己的最小存根。