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

use*_*739 5 c gcc shared-libraries libc clang

当我运行 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)
Run Code Online (Sandbox Code Playgroud)

Eri*_*hil 5

为什么 gcc/clang 知道自动链接?

GCC 开发人员将其内置到 GCC 中以方便使用。默认链接哪些库部分受到正在编译的语言的影响,该语言是从文件名中推断出来的,并且可以通过开关进行控制-x

哪里提到了这种行为?

GCC 文档中的此页面提到默认情况下链接了一些库,并表示您可以使用 和-nostdlib其他开关禁用或修改此行为,但我没有看到默认情况下链接的库的明确列表。它可能因系统/平台以及语言而异。您可以使用-v开关要求 GCC 显示它正在执行的命令,并且链接命令(使用ld)应该显示库。