为什么 gcc/clang 默认知道 link 到 libc?

Why does gcc/clang know to link to libc by default?

当我运行clang/gcc编译一个.c文件时,我不需要显式link到libc。但它仍然像 libc 一样工作,并且会自动 linked 两个额外的库。为什么 gcc/clang 会自动知道 link?哪里提到了这种行为?

$ cat main.c 
/* vim: set noexpandtab tabstop=2: */
#include <stdio.h>

int main() {
    puts("Hello World!");
    return 0;
}
$ clang -o main.exe main.c # or gcc
$ ./main.exe 
Hello World!
$ nm -D /lib/x86_64-linux-gnu/libc-2.27.so | grep -w puts
00000000000809c0 W puts
$ ldd main.exe 
    linux-vdso.so.1 (0x00007ffe743ba000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f397ce7b000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f397d26c000)

Why does gcc/clang know to link automatically?

GCC 开发人员为方便起见将其内置到 GCC 中。默认情况下 linked 哪些库部分受编译语言的影响,这是从文件名推导出来的,可以使用 -x 开关控制。

Where is this behavior mentioned?

This page in the GCC documentation 提到默认情况下有一些库 linked 并说您可以使用 -nostdlib 和其他开关禁用或修改此行为,但我没有看到明确的默认情况下 linked 的库列表。它可能因 system/platform 和语言而异。您可以使用 -v 开关让 GCC 向您显示它正在执行的命令,并且 link 命令(使用 ld)应该显示库。