Gcc 为什么在添加独立选项后printf函数仍然可用

Gcc 为什么在添加独立选项后printf函数仍然可用,gcc,compilation,freestanding,Gcc,Compilation,Freestanding,一般来说,我已经阅读了以下文章,检查了gcc语言标准中的“独立/托管”定义,但我的疑问尚未得到解决 我在Win7中使用托管的gcc/cygwin。我发现生成的.out、.map或.exe文件对于使用-ffreestanding和不使用-ffreestanding的不同版本是相同的 C文件(test.C): test1.exe和test2.exe都可以通过构建并在运行时打印“test1”。但我曾认为,如果使用-ffrereserving,编译可能会失败,原因是“找不到stdio头”、“未包含

一般来说,我已经阅读了以下文章,检查了gcc语言标准中的“独立/托管”定义,但我的疑问尚未得到解决

我在Win7中使用托管的gcc/cygwin。我发现生成的.out、.map或.exe文件对于使用-ffreestanding和不使用-ffreestanding的不同版本是相同的

C文件(test.C):

test1.exe和test2.exe都可以通过构建并在运行时打印“test1”。但我曾认为,如果使用-ffrereserving,编译可能会失败,原因是“找不到stdio头”、“未包含标准库”或“找不到printf实现”

似乎即使使用-ffreestanding选项,托管的gcc也不能作为独立的gcc工作


有人能帮忙澄清一下吗?为什么在添加独立选项后printf函数仍然可用?

-“选项-ffreestanding指示编译器不要假设标准函数具有其通常的定义。”不假设默认定义并不排除函数在声明和链接时可用。请参阅
-nosdinc
,这可能会引发预期的行为。另请参阅感谢用户2864740。由于我没有要求显式链接std LIB,您的意思是-ffreestanding的行为被gcc默认链接脚本重叠了吗?或者您知道如何显示独立构建和非独立构建之间的区别吗?这样我才能更好地理解这个选项。到目前为止,独立选项看起来毫无用处,因为实际上我必须添加-nosdinc或其他一些选项,以使构建“独立”。
#include <stdio.h>

int main(int ac, char **av)
{
    printf("test1");
    return 0;
}
gcc test.c -o test1.exe -std=gnu99 -O2 -Wall -Wextra -Wl,-Map,test1.map

gcc test.c -o test2.exe -std=gnu99 -ffreestanding -O2 -Wall -Wextra -Wl,-Map,test2.map