-nostdlib不阻止GCC/Clang生成对C标准库函数的调用,这被认为是正常的吗?

0vvn1miw  于 2023-01-30  发布在  其他
关注(0)|答案(1)|浏览(402)

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)
xwbd5t1u

xwbd5t1u1#

  • nostdlib不阻止GCC/Clang生成对C标准库函数的调用,这被认为是正常的吗?
    是的。这个选项是关于链接和启动文件的,而不是优化。当你使用-nostdlib时,你通常会提供和链接你自己的memset实现。

相关问题