gcc中的-ffreestanding选项是什么?

61

ffreestanding 在 gcc 中是什么?它的用途是什么?我遇到了以下内容:

gcc -ffreestanding -m32 -c kernel.c -o kernel.o

但是我不理解,它确切的意义是什么。


相关:https://dev59.com/unE85IYBdhLWcg3wpFEa - Ciro Santilli OurBigBook.com
1个回答

93
一个“freestanding”环境是指标准库可能不存在,并且程序启动时可能不一定在“main”函数中。选项“-ffreestanding”指示编译器假定标准函数具有其通常定义。
默认情况下,GCC将作为托管实现的编译器,将__STDC_HOSTED__定义为1,并假定当使用ISO C函数的名称时,它们具有标准中定义的语义。要使其作为遵循自由站点环境的符合实现的编译器,请使用选项-ffreestanding。然后它将把__STDC_HOSTED__定义为0,并且不会对标准库中的函数名的含义进行任何假设。
更多信息, 可参考此链接。

1
@Dayalrai 我在使用 arm-non-eabi-gcc 编译器时,加入了 -ffreestanding 选项:arm-non-eabi-gcc -g -O0 -ffreestanding ......,但是我仍然可以通过调用 nm 命令来获取 U main 主符号,这会导致在使用 gdb 进行调试时出现错误:Function "main" not defined。请问我该如何避免生成这个 main 符号? - user2948075
1
通常,-ffreestanding 用于编译内核。此外,它很少用于编译直接与内核交互而不使用库的应用程序。普通应用程序不会使用 -ffreestanding - Christian Hujer
我正在Cortex-M7上运行Dhrystone基准测试,并且将-ffreestanding包含作为编译器选项会导致每兆赫兹DMIPS数值下降。因此,在这种情况下最好避免使用它。 - Nee
1
正如@Nee所指出的那样,使用-ffreestanding编译可能会导致编译代码的性能降低。原因是**-ffreestanding选项隐式启用了-fno-builtin**,这意味着您无法从任何标准库函数调用中受益于GCC内置函数的自动替换,例如将memcpy直接编译成内联复制循环。除了这种设计决策的优点之外,在评估使用-ffreestanding时,这绝对是应该注意的事情。 - Cody Gray

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