LINUX.ORG.RU

В каких ситуациях необходимо собрать кросс-тулчейн?

 , , ,


0

1

Пусть у нас есть amd64 и Gentoo со своим GCC.

Пусть я собираю что-то наподобие LFS: ядро, Glibc, Coreutils, dash. Собранное записываю в чистый раздел жесткого диска и запускаю на этом же узле.

Могу ли я собрать вышеперечисленное нативным компилятором Gentoo? Или здесь build != target, необходимо собрать кросс-тулчейн?

Набор инструкций тот же. Но окружение/операционная система - разные. С другой стороны, не это ли решается указанием --sysroot=?

Спасибо.


Ответ на: комментарий от Anoxemian

Я из Gentoo, стандартным GCC, собираю ядро, Glibc, Coreutils, dash. Делаю их make install в соседний, примонтированный раздел. Перезапускаюсь в него.

Всё работает. Но хочу понять, не случайность ли то. Ведь везде пишется, что я должен сначала собрать кросс-тулчейн, минимум один раз, а то и три! Ведь у меня target-система (x86_64, LFS) не совпадает с build (x86_64, Gentoo).

kuraga
() автор топика
Последнее исправление: kuraga (всего исправлений: 1)
Ответ на: комментарий от t184256

Спасибо! А можно, для понимания, когда ответ был бы иным? Очевидно, если другой набор инструкций. Или, если он одинаков, но тут Linux, а там - Android (да?). А менее очевидный вариант?

Off-Topic. Вот тут, например, ДВЕ компиляции GCC. Ради чего - не пойму?? https://www.theseus-os.com/Theseus/book/c/cross_compiler.html

kuraga
() автор топика
Последнее исправление: kuraga (всего исправлений: 1)
Ответ на: комментарий от kuraga

Это будет не совсем точный ответ, но считай триплет (архитектура ЦПУ, ядро, libc), причём libc условно сменный.

Андроид-x86 от твоей генты тоже отличается только libc (bionic), так что статический слинковать hello world ты сможешь без всякой кросс-компиляции. Android на ARM будет отличаться ещё и архитектурой.

Но Андроид — особая боль, там с неродным тулчейном бед не оберешься, инфа сотка.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от kuraga

Чтобы собирать крочстулчейн не абы чем, что у тебя там на дистре XYZ, а тем, что реально работает?

У меня в одном проекте три tcc, три gcc и два clang’a, а сразу за ними тут же сходу ещё два clang’а как раз чтобы отвязаться от того, что именно в первой части. А тут всего два. =)

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Ага. Ну во: https://www.theseus-os.com/Theseus/book/c/cross_compiler.html.

Первая сборка:

export PREFIX="$DEST/gcc-10.2.0"
../binutils-2.35.1/configure --prefix="$PREFIX" --disable-nls --disable-werror
../gcc-10.2.0/configure --prefix="$PREFIX" --disable-nls --enable-languages=c,c++

Вторая:

export PREFIX="$DEST/cross"
export TARGET=x86_64-elf
../binutils-2.35.1/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror
../gcc-10.2.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers

Ради чего это?? Ради --target=x86_64-elf, --with-sysroot, --without-headers? Почему не сказать: разыщите компилятор для target x86_64-elf?

kuraga
() автор топика

В какой-то момент станет тяжеловато подавать ворох нужных ключей в систему сборки так, чтобы оно использовало штуки из лфс, но не воспользовалось случайно чем-нибудь из генты.

PolarFox ★★★★★
()
Ответ на: комментарий от kuraga

Глобально — как раз чтобы ответить на вопрос, как такой компилятор получить.

Второй — чтобы компилировать для x86_64-elf.

Первый — чтобы ты компилировал второй не абы чем? А то будешь потом ныть, что у тебя на ia64-windows-msvc что-то не собралось.

Компилятор вообще принято собирать трижды. Чем-попало, собой и собой контрольный раз.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от t184256

Второй — чтобы компилировать для x86_64-elf.

Согласен. Но дистровый GCC не умеет для x86_64-elf компилировать? Это ж вроде «ELF-файлы для x86_64 без опоры на ядро».

Хотя сейчас погуглил…

kuraga
() автор топика
Ответ на: комментарий от t184256

Кстати вот тут - https://wiki.osdev.org/GCC_Cross-Compiler, откуда перепечатывали Theseus, есть некоторые уточнения:

* This compiler that we build here will have a generic target (i686-elf) what allows you to leave the current operating system behind, meaning that no headers or libraries of your host operating system will be used.
* --with-sysroot tells binutils to enable sysroot support in the cross-compiler by pointing it to a default empty directory. By default, the linker refuses to use sysroots for no good technical reason, while gcc is able to handle both cases at runtime. This will be useful later on.
* --without-headers tells GCC not to rely on any C library (standard or runtime) being present for the target.

Но мне всё равно не очень понятно, почему компилятор с --target=x86_64-pc-linux-gnu не умеет --target=x86_64-elf… Казалось бы, это подмножество. И как тогда ядро компилируют таким компилятором, вот если по этой логике… Ему же надо не x86_64-pc-linux-gnu.

kuraga
() автор топика