如何在没有所有臃肿的情况下编译c程序?

时间:2011-10-23 19:05:13

标签: c x86 reverse-engineering

我正在尝试学习x86。我认为这很容易入手 - 我只是编译一个非常小的程序,基本上什么都没有,看看编译器给了我什么。问题是它给我带来了大量的臃肿。 (此程序不能在dos模式下运行等)25KB文件包含一个空的main()调用一个空函数。

如何在没有这些臃肿的情况下编译我的代码? (为什么它首先出现在那里?)

3 个答案:

答案 0 :(得分:4)

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

无论如何,Windows使用的PE格式包含一些特别列出的内容:

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

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

尽管如此,有an article out there努力创建最小的PE文件。

答案 1 :(得分:2)

通过挖掘旧编译器可能会获得更好的结果。如果你想要非常简单的二进制文件COM文件就是那样,那么如果你掌握了一个支持生成COM二进制文件而不是EXE的旧编译器,你应该设置它。在http://www.thefreecountry.com/compilers/cpp.shtml有一长串免费编译器,我认为Borland的Turbo C将是一个很好的起点。

答案 2 :(得分:0)

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

void foo(){}

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