23

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

我可以在普通工作站/构建服务器上仅使用 GCC 可靠地测试它吗?使用 GCC 编译为独立环境

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

  • 选项“-nostdinc”过于严格;我仍然想使用独立实现所需的标头(特别是 stddef.h 和 limits.h)。

我在这里想念什么?

哦,我目前正在使用 GCC 4.4.3,将“很快”升级到 4.5.0。

4

2 回答 2

22

好吧,既然还没有给出答案,我不妨描述一下我是如何完成这项工作的。它非常简单,尽管取决于目标系统,它可能很乏味。

使用“-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
于 2010-04-23T08:15:47.367 回答
3

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

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

于 2014-12-17T14:56:47.423 回答