从man gcc
开始:
-nostdlib
Do not use the standard system startup files or libraries when linking.
这里我们看到"when linking",意思是-nostdlib
不阻止GCC生成对C标准库函数的调用。
让我们检查:
$ cat t35.c
#define SIZE 4096
char b[SIZE];
void _start(void)
{
char *p = b;
int i = SIZE;
while(i > 0)
{
*p = 12;
++p;
--i;
}
}
$ arm-none-eabi-gcc t35.c -nostdlib -O2
ld.exe: cco83lvm.o: in function `_start':
t35.c:(.text+0x10): undefined reference to `memset'
这里我们看到ld需要memset
(因为GCC生成了memset
),因此用户需要提供memset
,尽管用户程序中没有memset
,这可能会让用户感到困惑。
同样的故事发生在克朗身上:https://godbolt.org/z/jEz77fnf3.
总的问题很简单:-nostdlib
不阻止GCC/Clang生成对C标准库函数的调用是否正常?
为了防止生成某些C标准库函数,有一个-ffreestanding
选项:
Assert编译的目标是一个独立的环境。这意味着-fno-builtin。一个独立的环境是一个标准库可能不存在,程序启动可能不一定在"main"。最明显的例子是一个操作系统内核。这相当于-fno-hosted。
演示:
$ arm-none-eabi-gcc t35.c -nostdlib -O2 -ffreestanding
<nothing> (expected)
1条答案
按热度按时间xwbd5t1u1#
是的。这个选项是关于链接和启动文件的,而不是优化。当你使用
-nostdlib
时,你通常会提供和链接你自己的memset
实现。