如何将C代码编译为原始的无操作二进制文件?

时间:2013-10-14 17:15:13

标签: c compiler-construction machine-code

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

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

2 个答案:

答案 0 :(得分:1)

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

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

$ objcopy -O binary object.elf object.binary

答案 1 :(得分:1)

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