【问题标题】:How do I compile C code to a raw os-less binary?如何将 C 代码编译为原始无操作系统二进制文件?
【发布时间】:2013-10-14 17:15:12
【问题描述】:

考虑到 C 是一种系统编程语言,我如何将 C 代码编译成可以在没有操作系统的情况下调用的原始 x86 机器代码? (IE:你可以假设我有一个引导扇区,它将原始机器代码从磁盘加载到内存中,然后直接跳转到第一条指令)。

现在,加分:理想情况下,我想使用 Visual Studio 2010 的编译器进行编译,因为我已经有了它。如果做不到这一点,那么完成任务的最佳方法是什么,而不必安装一堆依赖项或不必对整个系统进行大规模的全面配置更改?我会在 Windows 7 上编译。

【问题讨论】:

  • 编译器实际上并没有添加“操作系统特定的东西”(你不应该计算 DOS、Windows 或 Linux 系统调用——它们在库中)。您应该关注的加载程序由链接器添加。例如,著名的“您需要 Windows 才能运行此程序”“DOS”存根可以轻松更改为另一个存根。 (每个在 Windows 下长大的人都不会知道我在说什么……)所以,检查一下 Visual Studio 中的链接器选项。如果没有,则编译为 .obj 代码并使用外部链接器。

标签: c compiler-construction machine-code


【解决方案1】:

通常情况下,您不会。相反,您可以正常编译代码,然后(使用链接器或其他工具)从目标文件中提取原始二进制文件。

例如,在 Linux 上,您可以使用 objcopy 工具将目标文件复制到原始二进制文件。

$ objcopy -O binary object.elf object.binary

【讨论】:

    【解决方案2】:

    首先,您不要使用任何需要系统调用的库(printf、fopen、read 等)。然后你正常编译C文件。主要区别在于链接器步骤,如果您习惯于让 c 编译器调用链接器(或让一些 gui 来做),您可能需要以某种形式手动接管它。具体的解决方案取决于您的工具,您将需要一些引导代码(覆盖 C 编译器和程序员的假设并在 C 程序中启动入口点所需的少量程序集),以及链接描述文件或链接器的正确命令行选项来控制二进制文件的地址空间以及将对象链接在一起。然后根据链接器的输出格式,您可能必须将其转换为其他二进制格式(intel hex、srec、exe、com、coff、elf、raw binary 等)以与将要加载的任何位置兼容或运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 2017-08-06
      • 2021-04-17
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多