【问题标题】:Programming language that makes the smallest executables? [closed]生成最小可执行文件的编程语言? [关闭]
【发布时间】:2013-04-28 19:22:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: windows programming-languages exe


    【解决方案1】:

    汇编程序!它不能再小了。

    【讨论】:

    • 取决于编码器。现代 c 编译器可能会击败 99% 的程序员。
    • 汇编器不依赖于它运行的处理器吗?我忘了包括它应该在 2000 年之后生产的所有 Intel + AMD 处理器上运行。
    • @CaptainSkyhawk:如果我使用 MSVC C++ 编译器来编译 C 代码,它是否需要除 XP 后任何操作系统通用的 DLL 之外的任何 DLL?
    • 这是一个开放式问题。您是否计划动态链接到任何文件?如果是这样,那么是的,您将不得不使用外部 DLL。如果你是静态链接,那么你应该没问题。
    • @CaptainSkyhawk:假设它所做的只是创建一个文件夹。这是否意味着它需要链接(静态或动态)到 C++ 库?
    【解决方案2】:

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

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

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

    【讨论】:

    • 这是一个概念验证,所以并不是真正完成工作。
    • 我真的希望人们不要以为他们知道为什么要问这个问题。诸如“别担心。选择最容易完成工作的语言。”我觉得没有生产力。你不能决定别人应该或不应该“担心”什么。如果有问题,请回答,否则请不要回答。
    【解决方案3】:

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

    如果您使用纯 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) 并使用 minimal stub available here 来完成。如果您愿意,您可以通过提取任何 Windows 可执行文件的前 64 个字节来创建自己的最小存根。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      相关资源
      最近更新 更多