Компиляция ядра 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 Тем не менее, он контролирует стадию компоновки и гарантирует, что ядро ​​связывается без добавления какого-либо пользовательского кода.

Другие вопросы по тегам