История изменений
Исправление
MOPKOBKA,
(текущая версия)
:
Разница в том, что нужно собирать отдельный компилятор. Мало какой дистр пакует кросс-компиляторы, потому что все это вертели делать. У GCC с этим слишком много геморроя.
А в чем сложность? Решил посмотреть как это делается, и вот простой скрипт который собирает под любую платформу gcc для кросскомпиляции в /opt, нужно только подложить файлы, причем можно любой версии он сам их распознает по имени: binutils-2.44.tar.zst linux-6.12.34.tar.zst gcc-15.1.0.tar.zst glibc-2.41.tar.zst
#!/usr/bin/env bash
set -e
cd $(dirname $0) ; CWD=$(pwd)
GCC_VERSION=${GCC_VERSION:-$(echo gcc-*.tar.zst | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
BINUTILS_VERSION=${BINUTILS_VERSION:-$(echo binutils-*.tar.zst | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
LINUX_VERSION=${LINUX_VERSION:-$(echo linux-*.tar.zst | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
GLIBC_VERSION=${GLIBC_VERSION:-$(echo glibc-*.tar.zst | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
GCC_LANGUAGES=${GCC_LANGUAGES:-'c,c++'}
GCCX_TARGET=aarch64-generic-linux-gnu
GCCX_HOST=x86_64-generic-linux-gnu
GCCX_HOST_LINUX=arm64
GCCX_PREFIX=opt/gccx-$GCCX_TARGET-$GCC_VERSION
VERSION=$GCC_VERSION
TMP=${TMP:-/tmp}
BUILDDIR=$TMP/gccx-$GCCX_TARGET-$GCC_VERSION
NUMJOBS=${NUMJOBS:-"-j$(expr $(nproc) + 1)"}
rm -rf /$GCCX_PREFIX
cd $TMP
rm -rf $BUILDDIR
mkdir $BUILDDIR
export PATH=/$GCCX_PREFIX/bin:$PATH
#
# binutils
#
cd $BUILDDIR
tar --zstd -xvf $CWD/binutils-$BINUTILS_VERSION.tar.zst
cd binutils-$BINUTILS_VERSION
mkdir build.$GCCX_TARGET
cd build.$GCCX_TARGET
../configure \
--build=$GCCX_HOST \
--host=$GCCX_HOST \
--target=$GCCX_TARGET \
--prefix=/$GCCX_PREFIX \
--disable-multilib \
--disable-nls
make $NUMJOBS
make $NUMJOBS install
#
# gcc-base
#
cd $BUILDDIR
tar --zstd -xvf $CWD/gcc-$GCC_VERSION.tar.zst
cd gcc-$GCC_VERSION
if [[ -e libsanitizer/asan/asan_linux.cpp ]]; then
sed -i '1s/^/#include <linux\/limits.h>/' libsanitizer/asan/asan_linux.cpp
fi
mkdir build.$GCCX_TARGET
cd build.$GCCX_TARGET
../configure \
--build=$GCCX_HOST \
--host=$GCCX_HOST \
--target=$GCCX_TARGET \
--prefix=/$GCCX_PREFIX \
--includedir=/$GCCX_PREFIX/$GCCX_TARGET/include/ \
--disable-multilib \
--disable-nls \
--disable-threads \
--enable-languages='c,c++'
make $NUMJOBS all-gcc
make $NUMJOBS install-gcc
#
# linux headers
#
cd $BUILDDIR
tar --zstd -xvf $CWD/linux-$LINUX_VERSION.tar.zst
cd linux-$LINUX_VERSION
make $NUMJOBS ARCH=$GCCX_HOST_LINUX INSTALL_HDR_PATH=/$GCCX_PREFIX/$GCCX_TARGET headers_install
#
# glibc headers
#
cd $BUILDDIR
tar --zstd -xvf $CWD/glibc-$GLIBC_VERSION.tar.zst
cd glibc-$GLIBC_VERSION
mkdir build.$GCCX_TARGET
cd build.$GCCX_TARGET
AS=$GCCX_TARGET-as \
AS=$GCCX_TARGET-ar \
CC=$GCCX_TARGET-gcc \
CXX=$GCCX_TARGET-g++ \
../configure \
--build=$GCCX_HOST \
--host=$GCCX_TARGET \
--prefix=/$GCCX_PREFIX/$GCCX_TARGET \
--disable-multilib \
--disable-nls \
--with-headers=/$GCCX_PREFIX/$GCCX_TARGET/include \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes
make $NUMJOBS install-bootstrap-headers=yes install-headers
make $NUMJOBS csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o /$GCCX_PREFIX/$GCCX_TARGET/lib/
$GCCX_TARGET-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /$GCCX_PREFIX/$GCCX_TARGET/lib/libc.so
touch /$GCCX_PREFIX/$GCCX_TARGET/include/gnu/stubs.h
#
# libgcc
#
cd $BUILDDIR/gcc-$GCC_VERSION/build.$GCCX_TARGET
make $NUMJOBS all-target-libgcc
make $NUMJOBS install-target-libgcc
#
# glibc
#
cd $BUILDDIR/glibc-$GLIBC_VERSION/build.$GCCX_TARGET
make $NUMJOBS
make $NUMJOBS install
#
# gcc
#
rm -rf $BUILDDIR/gcc-$GCC_VERSION/build.$GCCX_TARGET
mkdir $BUILDDIR/gcc-$GCC_VERSION/build.$GCCX_TARGET
cd $BUILDDIR/gcc-$GCC_VERSION/build.$GCCX_TARGET
../configure \
--build=$GCCX_HOST \
--host=$GCCX_HOST \
--target=$GCCX_TARGET \
--prefix=/$GCCX_PREFIX \
--includedir=/$GCCX_PREFIX/$GCCX_TARGET/include/ \
--disable-multilib \
--disable-nls \
--enable-languages=$GCC_LANGUAGES
make $NUMJOBS
make $NUMJOBS install
#
# cleanup
#
rm -rf $BUILDDIR
Исправление
MOPKOBKA,
:
Разница в том, что нужно собирать отдельный компилятор. Мало какой дистр пакует кросс-компиляторы, потому что все это вертели делать. У GCC с этим слишком много геморроя.
А в чем сложность? Решил посмотреть как это делается, и вот простой скрипт который собирает под любую платформу gcc для кросскомпиляции, нужно только подложить файлы, причем можно любой версии он сам их распознает по имени: binutils-2.44.tar.zst linux-6.12.34.tar.zst gcc-15.1.0.tar.zst glibc-2.41.tar.zst
#!/usr/bin/env bash
set -e
cd $(dirname $0) ; CWD=$(pwd)
GCC_VERSION=${GCC_VERSION:-$(echo gcc-*.tar.zst | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
BINUTILS_VERSION=${BINUTILS_VERSION:-$(echo binutils-*.tar.zst | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
LINUX_VERSION=${LINUX_VERSION:-$(echo linux-*.tar.zst | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
GLIBC_VERSION=${GLIBC_VERSION:-$(echo glibc-*.tar.zst | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
GCC_LANGUAGES=${GCC_LANGUAGES:-'c,c++'}
GCCX_TARGET=aarch64-generic-linux-gnu
GCCX_HOST=x86_64-generic-linux-gnu
GCCX_HOST_LINUX=arm64
GCCX_PREFIX=opt/gccx-$GCCX_TARGET-$GCC_VERSION
VERSION=$GCC_VERSION
TMP=${TMP:-/tmp}
BUILDDIR=$TMP/gccx-$GCCX_TARGET-$GCC_VERSION
NUMJOBS=${NUMJOBS:-"-j$(expr $(nproc) + 1)"}
rm -rf /$GCCX_PREFIX
cd $TMP
rm -rf $BUILDDIR
mkdir $BUILDDIR
export PATH=/$GCCX_PREFIX/bin:$PATH
#
# binutils
#
cd $BUILDDIR
tar --zstd -xvf $CWD/binutils-$BINUTILS_VERSION.tar.zst
cd binutils-$BINUTILS_VERSION
mkdir build.$GCCX_TARGET
cd build.$GCCX_TARGET
../configure \
--build=$GCCX_HOST \
--host=$GCCX_HOST \
--target=$GCCX_TARGET \
--prefix=/$GCCX_PREFIX \
--disable-multilib \
--disable-nls
make $NUMJOBS
make $NUMJOBS install
#
# gcc-base
#
cd $BUILDDIR
tar --zstd -xvf $CWD/gcc-$GCC_VERSION.tar.zst
cd gcc-$GCC_VERSION
if [[ -e libsanitizer/asan/asan_linux.cpp ]]; then
sed -i '1s/^/#include <linux\/limits.h>/' libsanitizer/asan/asan_linux.cpp
fi
mkdir build.$GCCX_TARGET
cd build.$GCCX_TARGET
../configure \
--build=$GCCX_HOST \
--host=$GCCX_HOST \
--target=$GCCX_TARGET \
--prefix=/$GCCX_PREFIX \
--includedir=/$GCCX_PREFIX/$GCCX_TARGET/include/ \
--disable-multilib \
--disable-nls \
--disable-threads \
--enable-languages='c,c++'
make $NUMJOBS all-gcc
make $NUMJOBS install-gcc
#
# linux headers
#
cd $BUILDDIR
tar --zstd -xvf $CWD/linux-$LINUX_VERSION.tar.zst
cd linux-$LINUX_VERSION
make $NUMJOBS ARCH=$GCCX_HOST_LINUX INSTALL_HDR_PATH=/$GCCX_PREFIX/$GCCX_TARGET headers_install
#
# glibc headers
#
cd $BUILDDIR
tar --zstd -xvf $CWD/glibc-$GLIBC_VERSION.tar.zst
cd glibc-$GLIBC_VERSION
mkdir build.$GCCX_TARGET
cd build.$GCCX_TARGET
AS=$GCCX_TARGET-as \
AS=$GCCX_TARGET-ar \
CC=$GCCX_TARGET-gcc \
CXX=$GCCX_TARGET-g++ \
../configure \
--build=$GCCX_HOST \
--host=$GCCX_TARGET \
--prefix=/$GCCX_PREFIX/$GCCX_TARGET \
--disable-multilib \
--disable-nls \
--with-headers=/$GCCX_PREFIX/$GCCX_TARGET/include \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes
make $NUMJOBS install-bootstrap-headers=yes install-headers
make $NUMJOBS csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o /$GCCX_PREFIX/$GCCX_TARGET/lib/
$GCCX_TARGET-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /$GCCX_PREFIX/$GCCX_TARGET/lib/libc.so
touch /$GCCX_PREFIX/$GCCX_TARGET/include/gnu/stubs.h
#
# libgcc
#
cd $BUILDDIR/gcc-$GCC_VERSION/build.$GCCX_TARGET
make $NUMJOBS all-target-libgcc
make $NUMJOBS install-target-libgcc
#
# glibc
#
cd $BUILDDIR/glibc-$GLIBC_VERSION/build.$GCCX_TARGET
make $NUMJOBS
make $NUMJOBS install
#
# gcc
#
rm -rf $BUILDDIR/gcc-$GCC_VERSION/build.$GCCX_TARGET
mkdir $BUILDDIR/gcc-$GCC_VERSION/build.$GCCX_TARGET
cd $BUILDDIR/gcc-$GCC_VERSION/build.$GCCX_TARGET
../configure \
--build=$GCCX_HOST \
--host=$GCCX_HOST \
--target=$GCCX_TARGET \
--prefix=/$GCCX_PREFIX \
--includedir=/$GCCX_PREFIX/$GCCX_TARGET/include/ \
--disable-multilib \
--disable-nls \
--enable-languages=$GCC_LANGUAGES
make $NUMJOBS
make $NUMJOBS install
#
# cleanup
#
rm -rf $BUILDDIR
Исходная версия
MOPKOBKA,
:
Разница в том, что нужно собирать отдельный компилятор. Мало какой дистр пакует кросс-компиляторы, потому что все это вертели делать. У GCC с этим слишком много геморроя.
А в чем сложность? Решил посмотреть как это делается, и вот простой скрипт который собирает под любую платформу gcc, нужно только подложить файлы, причем можно любой версии он сам их распознает по имени: binutils-2.44.tar.zst linux-6.12.34.tar.zst gcc-15.1.0.tar.zst glibc-2.41.tar.zst
#!/usr/bin/env bash
set -e
cd $(dirname $0) ; CWD=$(pwd)
GCC_VERSION=${GCC_VERSION:-$(echo gcc-*.tar.zst | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
BINUTILS_VERSION=${BINUTILS_VERSION:-$(echo binutils-*.tar.zst | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
LINUX_VERSION=${LINUX_VERSION:-$(echo linux-*.tar.zst | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
GLIBC_VERSION=${GLIBC_VERSION:-$(echo glibc-*.tar.zst | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
GCC_LANGUAGES=${GCC_LANGUAGES:-'c,c++'}
GCCX_TARGET=aarch64-generic-linux-gnu
GCCX_HOST=x86_64-generic-linux-gnu
GCCX_HOST_LINUX=arm64
GCCX_PREFIX=opt/gccx-$GCCX_TARGET-$GCC_VERSION
VERSION=$GCC_VERSION
TMP=${TMP:-/tmp}
BUILDDIR=$TMP/gccx-$GCCX_TARGET-$GCC_VERSION
NUMJOBS=${NUMJOBS:-"-j$(expr $(nproc) + 1)"}
rm -rf /$GCCX_PREFIX
cd $TMP
rm -rf $BUILDDIR
mkdir $BUILDDIR
export PATH=/$GCCX_PREFIX/bin:$PATH
#
# binutils
#
cd $BUILDDIR
tar --zstd -xvf $CWD/binutils-$BINUTILS_VERSION.tar.zst
cd binutils-$BINUTILS_VERSION
mkdir build.$GCCX_TARGET
cd build.$GCCX_TARGET
../configure \
--build=$GCCX_HOST \
--host=$GCCX_HOST \
--target=$GCCX_TARGET \
--prefix=/$GCCX_PREFIX \
--disable-multilib \
--disable-nls
make $NUMJOBS
make $NUMJOBS install
#
# gcc-base
#
cd $BUILDDIR
tar --zstd -xvf $CWD/gcc-$GCC_VERSION.tar.zst
cd gcc-$GCC_VERSION
if [[ -e libsanitizer/asan/asan_linux.cpp ]]; then
sed -i '1s/^/#include <linux\/limits.h>/' libsanitizer/asan/asan_linux.cpp
fi
mkdir build.$GCCX_TARGET
cd build.$GCCX_TARGET
../configure \
--build=$GCCX_HOST \
--host=$GCCX_HOST \
--target=$GCCX_TARGET \
--prefix=/$GCCX_PREFIX \
--includedir=/$GCCX_PREFIX/$GCCX_TARGET/include/ \
--disable-multilib \
--disable-nls \
--disable-threads \
--enable-languages='c,c++'
make $NUMJOBS all-gcc
make $NUMJOBS install-gcc
#
# linux headers
#
cd $BUILDDIR
tar --zstd -xvf $CWD/linux-$LINUX_VERSION.tar.zst
cd linux-$LINUX_VERSION
make $NUMJOBS ARCH=$GCCX_HOST_LINUX INSTALL_HDR_PATH=/$GCCX_PREFIX/$GCCX_TARGET headers_install
#
# glibc headers
#
cd $BUILDDIR
tar --zstd -xvf $CWD/glibc-$GLIBC_VERSION.tar.zst
cd glibc-$GLIBC_VERSION
mkdir build.$GCCX_TARGET
cd build.$GCCX_TARGET
AS=$GCCX_TARGET-as \
AS=$GCCX_TARGET-ar \
CC=$GCCX_TARGET-gcc \
CXX=$GCCX_TARGET-g++ \
../configure \
--build=$GCCX_HOST \
--host=$GCCX_TARGET \
--prefix=/$GCCX_PREFIX/$GCCX_TARGET \
--disable-multilib \
--disable-nls \
--with-headers=/$GCCX_PREFIX/$GCCX_TARGET/include \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes
make $NUMJOBS install-bootstrap-headers=yes install-headers
make $NUMJOBS csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o /$GCCX_PREFIX/$GCCX_TARGET/lib/
$GCCX_TARGET-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /$GCCX_PREFIX/$GCCX_TARGET/lib/libc.so
touch /$GCCX_PREFIX/$GCCX_TARGET/include/gnu/stubs.h
#
# libgcc
#
cd $BUILDDIR/gcc-$GCC_VERSION/build.$GCCX_TARGET
make $NUMJOBS all-target-libgcc
make $NUMJOBS install-target-libgcc
#
# glibc
#
cd $BUILDDIR/glibc-$GLIBC_VERSION/build.$GCCX_TARGET
make $NUMJOBS
make $NUMJOBS install
#
# gcc
#
rm -rf $BUILDDIR/gcc-$GCC_VERSION/build.$GCCX_TARGET
mkdir $BUILDDIR/gcc-$GCC_VERSION/build.$GCCX_TARGET
cd $BUILDDIR/gcc-$GCC_VERSION/build.$GCCX_TARGET
../configure \
--build=$GCCX_HOST \
--host=$GCCX_HOST \
--target=$GCCX_TARGET \
--prefix=/$GCCX_PREFIX \
--includedir=/$GCCX_PREFIX/$GCCX_TARGET/include/ \
--disable-multilib \
--disable-nls \
--enable-languages=$GCC_LANGUAGES
make $NUMJOBS
make $NUMJOBS install
#
# cleanup
#
rm -rf $BUILDDIR