Почему gcc / clang знает, что по умолчанию ссылается на libc?

Когда я запускаю 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)

person user1424739    schedule 28.01.2019    source источник
comment
Потому что это компиляторы C, а компиляторы C связаны с локальной стандартной библиотекой C (плюс расширения). В некоторых (многих) системах математическая библиотека должна быть связана отдельно, но не основная библиотека C.   -  person Jonathan Leffler    schedule 28.01.2019
comment
Другие библиотеки включены, но libclibgcc.a] отключены. То есть вы получаете его автоматически , если вы специально не говорите, что не этого хотите, с помощью (например) опции -nostdlib. См. Также -nodefaultlibs и -nostartfiles на странице руководства для gcc   -  person Craig Estey    schedule 28.01.2019


Ответы (1)


Почему gcc / clang умеет автоматически создавать ссылки?

Разработчики GCC встроили это в GCC для удобства. Какие библиотеки связаны по умолчанию, частично зависит от компилируемого языка, который выводится из имен файлов и может управляться переключателем -x.

Где упоминается такое поведение?

Эта страница в документации GCC упоминает, что некоторые библиотеки связаны по умолчанию, и говорит, что вы можете отключить или изменить это поведение с помощью -nostdlib и других переключателей, но я не вижу явного списка библиотек, которые связаны по умолчанию. Это может варьироваться в зависимости от системы / платформы, а также от языка. Вы можете использовать переключатель -v, чтобы попросить GCC показать вам команды, которые он выполняет, а команда связывания (с использованием ld) должна открывать библиотеки.

person Eric Postpischil    schedule 28.01.2019