Тонкости, связанные с кросс-компиляцией, автономные libg cc и т. Д. - PullRequest
0 голосов
/ 29 марта 2020

У меня есть несколько вопросов о https://wiki.osdev.org/Meaty_Skeleton, в которых говорится:

В документации G CC прямо говорится, что libg cc требует автономной среды для поставки функции memcmp, memcpy, memmove и memset, а также abort на некоторых платформах. Мы удовлетворим это требование, создав специальную библиотеку ядра C (libk), которая содержит части пользовательского пространства lib c, которые являются автономными (не требует никаких функций ядра), в отличие к размещенным функциям libc, которые должны выполнять системные вызовы

Хорошо, я понимаю, что libgcc - это «закрытая библиотека», которая используется g cc, то есть имеет значение только во время компиляции процесс, когда g cc используется, вроде как помощник для g cc. Это правильно? Я понимаю, что машина, на которой я запускаю g cc, называется машиной сборки, а хост - моя собственная ОС. Какая отдельно стоящая среда указана здесь? Поскольку g cc работает на сборочной машине, libg cc должна использовать сборочную машину libg cc Я полагаю? Где отдельное место входит в картину?

Кроме того, что такое libk? Я думаю, что я действительно еще не понимаю автономных и размещенных сред: (

1 Ответ

1 голос
/ 29 марта 2020

libg cc

В некоторых случаях эта библиотека должна быть связана при компиляции с G CC. Поскольку G CC производит вызовы функций в этой библиотеке, если целевая архитектура не поддерживает указанную функцию c.

Например, если вы используете 64-битную арифметику c в своем ядре и вы хотите скомпилировать для i386 , затем G CC сделать вызов функции Speci c, которая находится в libgcc:

uint64_t div64(uint64_t dividend, uint64_t divisor)
{
    return (dividend / divisor);
}

Здесь вы получите undefined reference to __udivdi3 ошибка компоновщика при попытке связать ядро ​​без libgcc. С другой стороны, libgcc также выполняет вызовы стандартных функций библиотеки C. Поэтому эти специфические c функции должны быть реализованы.

Вот еще одно хорошее ИМХО объяснение . Это называется «голое железо» для архитектуры ARM, но также и для x86.

...