如何使用GCC编译适用于独立环境的代码?

25
我正在处理的代码应该可以在托管和独立环境下构建,对于后者,需要为某些stdlib函数提供私有实现。
只使用普通的工作站/构建服务器上的GCC,我能否可靠地测试这一点?使用GCC编译自由环境 - "-ffreestanding"选项看起来很有前途,但似乎它只禁用了内置函数并正确设置了STDC_HOSTED宏,它仍然提供所有系统头文件。 - "-nostdinc"选项过于严格;我仍然想使用所需的自由实现头文件(特别是stddef.h和limits.h)。
我错过了什么吗?
哦,我目前正在使用GCC 4.4.3,很快就会升级到4.5.0。

好奇...你为什么要构建自由站点?你是在制作那种强硬的"/sbin"程序吗?你是在编写内核吗?我只看到"-ffreestanding"在自定义Linux的上下文中提到过。 - Michael Aaron Safyan
简短的回答是市场需求。我们嵌入式/移动端的一些客户希望我们的产品完全自包含。 - Christoffer
2个回答

24

既然还没有答案,那我就来描述一下我是如何让这个工作的。它相当简单,但取决于目标系统,可能会很繁琐。

使用“-nostdinc”意味着将跳过标准系统包含路径;用“-I”给出的其他包含路径仍然会被搜索头文件。

因此,对于自由建立目标,我创建一个名为“include-freestanding-c89”的文件夹,并链接相关的系统头文件——float.hiso646.hlimits.hstdarg.hstddef.h。根据你的平台,其他头文件可能包含在其中,因此你可能需要进行一些研究并设置更多链接(如果你需要为多个目标平台完成这个过程,这就变得非常繁琐)。

然后,C89目录可以用作“include-freestanding-c99”的基础,要链接的额外头文件为stdbool.hstdint.h

要使用的命令行是:

gcc -std=c89 -nostdinc -nostdlib -ffreestanding -I include-freestanding-c89 
或者
gcc -std=c99 -nostdinc -nostdlib -ffreestanding -I include-freestanding-c99

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接