为什么 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
)应该显示库。
当我运行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
)应该显示库。