我正在研究的代码应该可以为托管和独立环境构建,为后一种情况提供某些stdlib函数的私有实现。
我可以在普通的工作站/构建服务器上使用GCC进行可靠的测试吗? Compile for freestanding environment with GCC
“-ffreestanding”选项看起来很有希望,但它似乎“只”禁用内置函数并正确设置STDC_HOSTED宏,它仍然提供所有系统头。
选项“-nostdinc”限制性太强;我仍然想使用独立实现所需的头文件(特别是stddef.h和limits.h)。
我在这里缺少什么?
哦,我现在正在使用GCC 4.4.3,很快就会升级到4.5.0。
答案 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