5

Considering that C is a systems programming language, how can I compile C code into raw x86 machine code that could be invoked without the presence of an operating system? (IE: You can assume I have a boot sector that loads the raw machine code from disk into memory then jumps directly to the first instruction).

And now, for bonus points: Ideally, I'd like to compile using Visual Studio 2010's compiler because I've already got it. Failing that, what's the best way to accomplish the task, without having to install a bunch of dependencies or having to make large sweeping configuration changes across my entire system? I'd be compiling on Windows 7.

4

2 回答 2

4

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

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

$ objcopy -O binary object.elf object.binary
于 2013-10-14T18:22:33.433 回答
1

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

于 2013-10-16T23:55:42.947 回答