Archives December 2022

mipsel-none-elf GCC toolchain for Sony PlayStation1

Иногда хочется просто так пописать код под что-то экзотичное, ограниченное в ресурсах для расширения сознания. А в случае с PlayStation1 можно программировать и 3D графику, что вдвойне более весело.

Официальный PS1 SDK Psy-Q не удаётся удобно использовать, т.к. многие из утилит в тулчейне собраны под DOS, который был удалён из Windows 10+. Писать код в виртуальной машине не очень здорово, поэтому собрал себе GCC тулчейн для удобного программирования.

GCC: 12.2
Binutils: 2.39
Newlib: 4.2.0.20211231
Target: mipsel-none-elf

Собирал с Ubuntu 22.10

Собрал тулчейн на основе newlib со стандартной библиотекой C++. Изначально я так же собирал с поддержкой компилятора С++, но без стандартной библиотеки, что не очень удобно, т.к. многие стандартные файлы здорово иметь под рукой. Например, <new>, для использования placement new, или <type_traits>, <array> и т.п.

Скачать

Windows x64

mipsel-none-elf-gcc-12.2.0-binutils-2.39-libstdc-windows.tar.gz

Linux x64

mipsel-none-elf-gcc-12.2.0-binutils-2.39-libstdc-linux.tar.gz

Удалось написать простой проект, собрать и запустить в эмуляторе:

0
0

Сборка 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