考虑到 C 是一种系统编程语言,如何将 C 代码编译为可以在没有操作系统的情况下调用的原始 x86 机器代码? (IE:您可以假设我有一个引导扇区,它将原始机器代码从磁盘加载到内存中,然后直接跳转到第一条指令)。
现在,为了加分:理想情况下,我想使用 Visual Studio 2010 的编译器进行编译,因为我已经有了它。如果做不到这一点,完成任务的最佳方法是什么,而不必安装一堆依赖项或必须在整个系统中进行大规模的彻底配置更改?我将在 Windows 7 上进行编译。
通常情况下,你不会。 相反,您可以正常编译代码,然后(使用链接器或其他工具)从目标文件中提取原始二进制文件。
例如,在 Linux 上,您可以使用
objcopy
工具将目标文件复制到原始二进制文件。
$ objcopy -O binary object.elf object.binary
首先,您不使用任何需要系统调用的库(printf、fopen、read 等)。 然后就可以正常编译C文件了。 主要区别在于链接器步骤,如果您习惯让 C 编译器调用链接器(或让某些 gui 执行此操作),您可能需要以某种形式手动接管该步骤。 具体的解决方案取决于您的工具,您将需要一些引导代码(覆盖 C 编译器和程序员的假设并启动 C 程序中的入口点所需的少量程序集),以及链接器脚本或链接器的正确命令行选项可以控制二进制文件的地址空间以及将对象链接在一起。 然后,根据链接器的输出格式,您可能需要将其转换为其他二进制格式(intel hex、srec、exe、com、coff、elf、原始二进制文件等),以便与要加载的位置兼容或运行。