如何使用GCC编译独立环境?

时间:2010-04-21 08:24:21

标签: gcc c99 c89 freestanding

我正在研究的代码应该可以为托管和独立环境构建,为后一种情况提供某些stdlib函数的私有实现。

我可以在普通的工作站/构建服务器上使用GCC进行可靠的测试吗? Compile for freestanding environment with GCC

  • “-ffreestanding”选项看起来很有希望,但它似乎“只”禁用内置函数并正确设置STDC_HOSTED宏,它仍然提供所有系统头。

  • 选项“-nostdinc”限制性太强;我仍然想使用独立实现所需的头文件(特别是stddef.h和limits.h)。

我在这里缺少什么?

哦,我现在正在使用GCC 4.4.3,很快就会升级到4.5.0。

2 个答案:

答案 0 :(得分:19)

好吧,既然没有给出答案,我也可以描述我是如何完成这项工作的。这很简单,虽然取决于目标系统,它可能很乏味。

使用“-nostdinc”表示将跳过标准系统包含路径;用“-I”给出的其他包含路径当然仍然会搜索标题。

因此,对于独立构建目标,我创建一个文件夹'include-freestanding-c89'并链接相关的系统头文件 - float.h iso646.h limits.h stdarg.h stddef.h - 那里。其他标题可能包含在这些标题中,具体取决于您的平台,因此您可能需要进行一些研究并设置更多链接(因此,如果您需要为多个目标平台执行此操作,则会非常繁琐)。

然后可以将C89目录用作'include-freestanding-c99'的基础,要链接的额外标题是 stdbool.h stdint.h

然后使用命令行

gcc -std=c89 -nostdinc -nostdlib -ffreestanding -I include-freestanding-c89 

gcc -std=c99 -nostdinc -nostdlib -ffreestanding -I include-freestanding-c99

答案 1 :(得分:2)

此Xen Makefile使用gcc -print-search-dirs获取stddef.h类似的目录,将其添加到-isystem,然后使用-nostdinc构建:

https://github.com/mirage/xen/blob/2676bc915157ab474ee478d929b0928cf696b385/stubdom/Makefile#L35