为什么gcc/clang默认链接到libc库?

5
当我使用clang/gcc编译.c文件时,我不需要显式地链接libc库。但它仍然像libc一样工作,并自动链接了两个附加库。为什么gcc/clang知道自动链接?这种行为在哪里提到?
$ 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)

1
因为它们是C编译器,而C编译器与本地标准C库(加上扩展)链接。在一些(许多)系统上,数学库必须单独链接,但不需要核心C库。 - Jonathan Leffler
1
其他库是“选择加入”的,但libc [和libgcc.a]是“选择退出”的。也就是说,除非您通过(例如)-nostdlib选项明确表示不想要它,否则将自动获取它。有关gcc手册中的-nodefaultlibs-nostartfiles,请参见。 - Craig Estey
1个回答

5
为什么gcc / clang知道自动链接?
GCC开发人员将此功能集成到GCC中,作为一种方便的方式。默认链接哪些库部分取决于正在编译的语言,该语言是从文件名中推断出来的,并且可以使用-x开关进行控制。
这种行为在哪里提到?
GCC文档中的此页面提到了一些默认链接的库,并表示您可以使用-nostdlib和其他开关禁用或修改此行为,但我没有看到默认链接的库的明确列表。它可能因系统/平台而异,也可能因语言而异。您可以使用-v开关要求GCC向您显示它正在执行的命令,链接命令(使用ld)应显示库。

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