Сборка 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
Позже я расширю описание. Сейчас сохранил мануал для себя, чтоб не потерять результаты трудов )