如何将C程序编译为有效的ELF格式(或RAW格式),以便可以在没有任何操作系统的情况下直接从RAM执行?假设存在一个能够将代码加载到RAM中的任何位置并开始在该地址执行的引导加载程序.确切地说,编译器(GCC)标志应该是什么?是否需要地图文件?
欢迎使用示例helloworld应用程序:)
为了详细说明我的观点,
让main()方法成为一个空的无限while循环,以确保不使用OS特定的或标准的库调用.期望的o/p是一个悬念.使用通常的GCC选项,引导加载程序肯定无法加载可执行文件,因为它是无效的ELF格式.但是,通过将-dN选项传递给链接器将使其成为有效的ELF.需要更多编译器/链接器选项才能使其挂起而不会崩溃!这些编译器选项究竟是什么?
file.c: int main() { while(1); }
编译
gcc -c -nostdinc -fno-builtin
file.c ld -dN -nostdlib file.o
Bootloader将a.out加载到RAM并执行.
首先,一旦bootloader完成其工作,你可以做什么就有限制.这些限制是由于以下原因:(假设您的引导加载程序(例如:grub),将您带到32位保护模式)1.没有启用分页.你需要启用它.2.在那里你无法与设备交互,因为你必须为IRQ设置处理程序.
这是我用来学习裸机编程艺术的经典链接(http://geezer.osdevbrasil.net/osd/index.htm).此外,页面上还有一个下载链接(http://geezer.osdevbrasil.net/osd/code/osd.tgz).tar文件包含复杂程度越来越高的演示内核.此外,您可以查看make文件(linux.mak),并获取gcc所需的标志.
我打开了一个随机的make文件,发现使用了以下标志:gcc:-nostdinc -fno-builtin ld:-nostdlib
(显式调用链接器,因此ld也需要一个标志).
标志的目的是告诉gcc必须没有与标准库完成链接.