Компиляция ядра GNU Triplet, GCC и Linux
Мой родной gcc говорит, что его триплет следующий.
> gcc -dumpmachine
x86_64-suse-linux
Где cpu-vendor-os соответственно x86_64, suse, linux. Последнее означает, что glibs используется (?). Когда я делаю кросс-компиляцию системы на основе busybux, триплет компилятора выглядит как avr32-linux-uclibc, где os это 'linux-uclibc', что означает, что используется uclibc.
Разница между "linux-glibc" и "linux-uclibc" заключается в (AFAIU) в поведении collect2 и содержимом libgcc.a. Либо glibc, либо uclibs молча связаны с целевым двоичным файлом.
Вопрос в том, как ядро linux компилируется теми же компиляторами? Как только ядро работает на голом железе, оно не должно быть связано ни с каким типом пользовательского пространства libc, а должно использовать соответствующий libgcc.a
1 ответ
У gcc есть все возможные варианты управления тем, как это работает. Вот несколько важных:
-nostdlib
не указывать ссылки на стандартные библиотеки и код запуска-nostdinc
исключить поиск заголовочных файлов в стандартных местах.-ffreestanding
скомпилировать для автономной среды (например, ядра)
Вам также не нужно использовать gcc для линковки. Вы можете напрямую вызывать компоновщик, снабжать его собственной картой компоновщика, кодом объекта запуска и всем, что вам нужно.
Сборка ядра Linux, по произвольным причинам, не используется -ffreestanding
Тем не менее, он контролирует стадию компоновки и гарантирует, что ядро связывается без добавления какого-либо пользовательского кода.