我想编写一个 C 应用程序,它在构建时将创建一个大小为 100 字节或更小的可执行文件。
即使我创建一个只有一个空的简单 C 程序main(),我的输出文件在 Visual Studio 2015 上也会变成 11KB。有没有办法告诉 VS 不要包含任何默认库,这会减少我的可执行文件大小。或者有没有其他方法可以减小可执行文件的大小?
我想编写一个 C 应用程序,它在构建时将创建一个大小为 100 字节或更小的可执行文件。
即使我创建一个只有一个空的简单 C 程序main(),我的输出文件在 Visual Studio 2015 上也会变成 11KB。有没有办法告诉 VS 不要包含任何默认库,这会减少我的可执行文件大小。或者有没有其他方法可以减小可执行文件的大小?
您可以为控制台输出创建一个文本部分(即其中包含可执行代码的部分)小于 100 字节的可执行文件hello world,但 .EXE 文件的大小会更大,因为它需要具有有效的 PE 格式结构,并且该格式需要相当多的填充。/NODEFAULT当然会给你错误。然后,您必须重新实现缺少的任何内容,通常使事情变为无操作,并且您需要使用链接时代码生成,以便删除对空函数的所有调用(以及函数本身)。您还需要找到禁用所有“酷”功能的编译器标志。例如,要使编译器停止发出缓冲区安全检查(__security_check_cookie& al.),请提供/GS-选项。
您可能需要使用自定义工具将 .EXE 文件从 VS 链接器发出的不必要的 PE 垃圾中完全剥离。而且您的可执行文件仍将至少与 KERNEL32.DLL 进行运行时链接,因为没有它您将无法做任何有用的事情。如果你够勇敢,你可以直接使用 NTDLL.DLL(即原生 API),但这可能需要超过 100 字节的代码。
您的可执行文件还需要针对 32 位架构;64 位的将大 25% 左右(以如此小的部分大小开始)。
这是一个很好的挑战。
一个合理的 Win32 可执行文件的大小不能小于几百字节:什么是最小的 Windows (PE) 可执行文件? 但是,您可以编写一个普通的旧 COM 可执行文件,它只能在 x86-Windows 上运行。您将需要适当的工具链:为 x86 寻找 16 位 c 编译器