По умолчанию G ++ в Linux будет ссылаться на стандартную библиотеку C и стандартную библиотеку C++. Иногда он также автоматически вводит математическую библиотеку, хотя исторически вам нужно задать это с помощью -lm
.
На моем окне Ubuntu, я скомпилирован и связан следующий простой «Hello World» приложение:
#include <iostream>
int main()
{
std::cout << "Hello world!" << std::endl;
}
Я скомпилированный его следующим образом: g++ hello.cpp
Утилита ldd
перечисляет библиотеки g++
связаны это против :
$ ldd a.out
linux-vdso.so.1 => (0x00007fff1d344000)
libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007fd7fb031000)
libm.so.6 => /lib/libm.so.6 (0x00007fd7fadae000)
libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007fd7fab97000)
libc.so.6 => /lib/libc.so.6 (0x00007fd7fa813000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd7fb365000)
Первая строка, linux-vdso.so.1
на самом деле не является библиотекой. Google, если вы хотите узнать о каком-то волшебном хаке. Остальная довольно пешеход:
libstdc++
является C++ стандартной библиотеки
libm
является вышеупомянутой математической библиотекой. Я не знаю, добавляет ли C++ по умолчанию, но исторически компилятор C не включал его, если вы не указали -lm
во время соединения.
libgcc_s
является GCC конкретной библиотеки поддержки, содержащим различные процедуры поддержки (то есть. Для странных вещей, как чудные делит, структуру-копий и т.д.)
libc
является стандартной библиотекой С. Он также содержит много функций POSIX.
ld-linux-x86-64
является загрузчиком динамической библиотеки. Это фактически исполняемый файл.
Итак, это набор компонентов по умолчанию.
Pieces, такие как malloc
, new
, printf
и т. Д. Все там, вместе с полной стандартной библиотекой C++ (что некоторые называют «STL»).
Если вы спрашиваете, какая поддержка предоставляется по умолчанию, это она. Если вы пытаетесь реализовать свои собственные версии этих вещей, флаг -nodefaultlibs
позволит вам. Вам также может понадобиться -ffreestanding
и, возможно, даже -fno-builtins
.
Если вы хотите увидеть, как эти части построены (в том числе, как Glibc называет mmap
и/или sbrk
, чтобы получить память для заполнения malloc
кучи), вы можете загрузить исходный код для Glibc и посмотрим. Существует не уровень ниже glibc
, на который вы можете настроить таргетинг напрямую, кроме системных вызовов напрямую.
Предполагая, что вы создаете свой код с помощью GCC/G ++, вам может потребоваться включить некоторые из этих библиотек, такие как libgcc_s
и libstdc++
. Возможно, вы сможете ограничить/устранить свою зависимость от libstdc++
, если вы воздерживаетесь от использования стандартных библиотечных функций и создаете с помощью -ffreestanding
. Но, я буду честен: я знаю только флаг, я никогда не использовал его.
Насколько я знаю, libc автоматически связан gcc (и я думаю, что связь является динамической, на самом деле, поэтому она не должна занимать гораздо больше двоичного пространства). Таким образом, вы должны иметь доступ к malloc() и т. Д., Просто включив соответствующие заголовки. Какой компилятор вы собираетесь использовать? –
Вы действительно спрашиваете, какие библиотеки по умолчанию, или вам просто нужен кто-то, чтобы указать вам на «-nostdlib»? – kfsone
AFAIK Linux просто реагирует на системные вызовы, а libc почти напрямую использует эти системные вызовы, и единственное, что связано с этим, - это то, что вы используете или вещи, которые вам нужны. – cHao