Сборка Cross GCC тулчейна под Debian-based ARM Linux со старым ядром

Так случается в жизни, что небходимо собрать С++ код, написанный по самым свежим стандартам, под систему, в которой (или для которой) доступны только компиляторы устаревшей версии.

В моём случае появилась необходимость получить cross компилятор GCC 11+ версии, собранный с glibc версии именно 2.27. И он обязательно должен знать о Debian multiarch для правильной сборки приложений под Ubuntu, RaspberryPi OS и т.п.

Конфиги в мануале собирают тулчейн с такими компонентами:
gcc: 11.2.0 [C/C++]
Linux kernel: 4.9.301
glibc: 2.27
gdb: 11.2

Хост система

Сборку произвожу в Ubuntu 22.10

Установка софта в хост систему

sudo apt update

sudo apt-get install -y gcc g++ gperf bison flex texinfo \
    help2man make libncurses5-dev python3-dev autoconf \
    automake libtool libtool-bin gawk wget bzip2 xz-utils unzip \
    patch libstdc++6 rsync git meson ninja-build

Сборка crosstool-ng

wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.25.0.tar.bz2
tar -xf crosstool-ng-1.25.0.tar.bz2
rm crosstool-ng-1.25.0.tar.bz2
cd crosstool-ng-1.25.0
./configure --enable-local
make

Получение патча поддержки debian multiarch для binutils

# В директории crosstool-ng-1.25.0
mkdir -p patches/binutils/2.31.1/
wget https://sources.debian.org/data/main/b/binutils/2.31.1-11/debian/patches/129_multiarch_libpath.patch -P patches/binutils/2.31.1/

Целевая директория

Мои конфиги установят собранные тулчейны в директорию /crossbuild/toolchain Её необходимо предварительно создать и изменить владельца/разрешения так, чтоб пользователь, от имени которого будет запущен билд, имел доступ на запись и чтение в этой директории. Иначе можно поменять эту директорию в конфиге самостоятельно.

Проблемы во время сборки

После чего можно приступать уже к сборке тулчейнов, однако, она скорее всего не будет успешной конкретно с используемой мной версией crosstool-ng, т.к. он не сможет скачать исходники zlib. Выглядит это примерно так:

Исходники crosstool-ng я не хочу править, поэтому просто скачал требующуюся версию zlib сам и положил в папку кеша. Как видно из скриншота, crosstool-ng хочет zlib-1.2.12, качаем:

# В директории crosstool-ng-1.25.0
wget https://zlib.net/fossils/zlib-1.2.12.tar.gz -P .build/tarballs

Сборка arm-linux-gnueabihf тулчейна

# В директории crosstool-ng-1.25.0
wget https://l-proger.ru/wp-content/uploads/2022/12/config_arm_gcc11.txt
cp config_arm_gcc11.txt .config
export DEB_TARGET_MULTIARCH=arm-linux-gnueabihf
./ct-ng build

Сборка aarch64-linux-gnu тулчейна

# В директории crosstool-ng-1.25.0
wget https://l-proger.ru/wp-content/uploads/2022/12/config_aarch64_gcc11.txt
cp config_aarch64_gcc11.txt .config
export DEB_TARGET_MULTIARCH=aarch64-linux-gnu
./ct-ng build

Запаковка тулчейнов в архив

cd /crossbuild/toolchain
tar -czf gcc11.2.0-aarch64-linux-gnu-kernel4.9.301-glibc2.27-gdb11.2.tar.gz ./gcc11.2.0-aarch64-linux-gnu-kernel4.9.301-glibc2.27-gdb11.2
tar -czf gcc11.2.0-arm-linux-gnueabihf-kernel4.9.301-glibc2.27-gdb11.2.tar.gz ./gcc11.2.0-arm-linux-gnueabihf-kernel4.9.301-glibc2.27-gdb11.2


Позже я расширю описание. Сейчас сохранил мануал для себя, чтоб не потерять результаты трудов )

0
0