【问题标题】:How do i compile a c program without all the bloat?我如何编译一个没有臃肿的c程序?
【发布时间】:2011-12-13 16:24:07
【问题描述】:

我正在尝试学习 x86。我认为这很容易开始 - 我将编译一个非常小的程序,基本上不包含任何内容,然后看看编译器给了我什么。问题是它给了我很多膨胀。 (此程序不能在 dos 模式等下运行) 25KB 文件包含一个空的 main() 调用一个空函数。

如何编译我的代码而不会出现这些臃肿? (为什么它首先存在?)

【问题讨论】:

  • (这个页面可能对这个话题很有趣,虽然它是针对 Linux 而不是 Windows:muppetlabs.com/~breadbox/software/tiny/teensy.html
  • 你使用什么标志?优化带来了巨大的不同。一般来说,C 编译器的输出不仅简洁高效,而且聪明到让人眼前一亮。
  • 膨胀是因为操作系统以及它们可以处理的可执行文件很复杂。您可以尝试使用 Linux 并编译为 a.out 格式,这可能比 ELF 或 PE 更简单。
  • 我目前在 windows 7 上运行默认的代码块。下周我将在 linux 中试一试。
  • delnan: a.out 既是古老的文件格式,也是编译器在 Unix 上为编译输出赋予的默认名称。不过,文件名不再暗示文件格式。

标签: c x86 reverse-engineering


【解决方案1】:

挖掘旧的编译器可能会得到更好的结果。如果您想要非常简单的二进制文件,COM 文件确实如此,所以如果您拥有一个支持生成 COM 二进制文件而不是 EXE 的旧编译器,您应该进行设置。 http://www.thefreecountry.com/compilers/cpp.shtml 有一长串免费编译器,我认为 Borland 的 Turbo C 会是一个很好的起点。

【讨论】:

    【解决方案2】:

    膨胀的模块可能是链接器附加的加载程序(操作系统所需的接口)。尝试添加一个仅包含以下内容的模块:

    void foo(){}

    并查看反汇编(我假设这是编译器“给你”的格式)。当然,细节因操作系统和编译器而异。有这么多!

    【讨论】:

      【解决方案3】:

      可执行格式不仅仅包含供 CPU 执行的原始机器代码。如果你想要,那么唯一的选择是(我认为)一个 DOS .com 文件,它本质上只是一堆代码加载到页面中然后跳转到。一些软件(例如 Volkov 指挥官)巧妙地利用了这种格式,以非常少的可执行代码提供了相当多的内容。

      无论如何,Windows 使用的 PE 格式包含一些特别布局的东西:

      • 一个 DOS 存根说“这个程序不能在 DOS 模式下运行”,这是你偶然发现的
      • 包含程序代码、全局变量等内容的多个部分分别由操作系统中的可执行加载程序以不同方式处理
      • 其他一些东西,比如导入表

      您可能不需要其中的一些,但编译器通常不知道您正在尝试创建一个微小的可执行文件。现在通常开销可以忽略不计。

      不过,an article out there 致力于创建尽可能小的 PE 文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-17
        • 1970-01-01
        • 2011-03-18
        • 2010-10-08
        • 2011-03-01
        • 1970-01-01
        相关资源
        最近更新 更多