Это кросс-компилятор RISC-V C и C ++. Он поддерживает два режима сборки: общий инструмент Elf/Newlib и более сложный инструмент Linux-Elf/Glibc.
В этом репозитории используются подмодули, но подмодули будут автоматически приносить по требованию, поэтому --recursive
или git submodule update --init --recursive
не требуется.
$ git clone https://github.com/riscv/riscv-gnu-toolchain
Предупреждение: Git Clone занимает около 6,65 ГБ диска и размер загрузки
Для построения инструментов необходимы несколько стандартных пакетов.
На Ubuntu должно быть достаточно выполнения следующей команды:
$ sudo apt-get install autoconf automake autotools-dev curl python3 python3-pip libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build git cmake libglib2.0-dev libslirp-dev
На ОС Fedora/Centos/Rhel, выполнить следующую команду должно быть достаточно:
$ sudo yum install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk bison flex texinfo patchutils gcc gcc-c++ zlib-devel expat-devel libslirp-devel
На Arch Linux выполнить следующую команду должно быть достаточно:
$ sudo pacman -Syyu autoconf automake curl python3 libmpc mpfr gmp gawk base-devel bison flex texinfo gperf libtool patchutils bc zlib expat libslirp
Также доступно для пользователей Arch на AUR: https://aur.archlinux.org/packages/riscv-gnu-toolchain-bin
На MacOS вы можете использовать Homebrew для установки зависимостей:
$ brew install python3 gawk gnu-sed make gmp mpfr libmpc isl zlib expat texinfo flock libslirp
При выполнении инструкций в этом Readme, пожалуйста, используйте gmake
вместо того, чтобы использовать недавно установленную версию make
. Чтобы построить GLIBC (Linux) на MacOS, вам нужно будет построить в пределах чувствительной к случаям файловой системы. Самый простой подход - создать и установить новое изображение диска с чувствительным к корпусом форматом. Убедитесь, что точка крепления не содержит пространств. Это не обязательно для строительства Newlib или GCC на macOS.
Этот процесс начнется с загрузки около 200 мибов вверх по течению источников, затем будет исправлять, строить и установить инструмент. Если локальный кэш восходящих источников существует в $ (distdir), он будет использоваться; Расположение по умолчанию/var/cache/distfile. Вашему компьютеру потребуется около 8 гиб дискового пространства для завершения процесса.
Чтобы построить кросс-компилятор Newlib, выберите путь установки (который можно записать). Если вы выберете, скажем, /opt/riscv
, то добавьте /opt/riscv/bin
на свой PATH
. Затем просто запустите следующую команду:
./configure --prefix=/opt/riscv
make
Теперь вы должны иметь возможность использовать RISCV64-unknown-elf-gcc и его двоюродных братьев.
Примечание. Если вы планируете использовать внешнюю библиотеку, которая заменяет часть Newlib (например, libgloss-htif
), прочитайте часто задаваемые вопросы.
Чтобы построить кросс-компилятор Linux, выберите путь установки (который можно записать). Если вы выберете, скажем, /opt/riscv
, то добавьте /opt/riscv/bin
на свой PATH
. Затем просто запустите следующую команду:
./configure --prefix=/opt/riscv
make linux
Сборка по умолчанию нацеливается на RV64GC (64-бит) с помощью GLIBC, даже в 32-разрядной среде сборки. Чтобы построить 32-битный инструмент инструментов RV32GC, используйте:
./configure --prefix=/opt/riscv --with-arch=rv32gc --with-abi=ilp32d
make linux
Если вы предпочитаете Musl Libc, а не Glibc, настройте, как выше, и выбирайте make musl
а не make linux
.
Поддерживаемыми архитектурами являются RV32I или RV64I плюс стандартные расширения (A) Tomics, (M) Ultiplication and Division, (f) Loat, (d) OUBLE, или (G) Eneral для MAFD.
Поддерживаемые ABI-это ILP32 (32-битный мягкий плаща), ILP32D (32-битный твердый флоат), ILP32F (32-разрядная с одноприменением в регистрах и двойной в памяти, только нишевое использование), LP64 LP64F LP64D (то же с 64-битными длиной и указателями).
Чтобы построить любого кросс-компилятора с поддержкой 32-битной и 64-битной, запустите следующую команду:
./configure --prefix=/opt/riscv --enable-multilib
А затем либо make
, make linux
или make musl
для кросс-компилятора на основе Newlib, Linux Glibc или Linux Musl Libc, соответственно.
Multilib Compiler будет иметь префикс RISCV64-unknown-elf или riScv64-unknown-linux-gnu-, но сможет нацелиться на 32-битные и 64-битные системы. Он будет поддерживать наиболее распространенные варианты -march
/ -mabi
, которые можно увидеть, используя флаг --print-multi-lib
на любом кросс-компиляторе.
Linux Toolchain имеет дополнительную опцию --enable-default-pie
для управления пирогом по умолчанию для GCC, который отключается по умолчанию.
Чтобы настроить включенные языки, используйте опцию --with-languages=
. Например, если вы хотите включить c,c++,fortran
, используйте ./configure --with-languages=c,c++,fortran
. Эта опция вступает в силу только для инструментального оборудования GNU.
Строивает работу лучше всего при установке в пустой каталог. Если вы создаете инструментальный набор жесткости, а затем попытаетесь построить инструментальный побор для мягкого флоата с тем же каталогом-Prefix, то сценарии сборки могут запутаться и выйти с ошибкой линкера, жалуясь, что жесткий код поплавки не может быть связан с мягкий код поплавок. Сначала удаление существующего набора инструментов или использование другого префикса для второй сборки позволяет избежать проблемы. Можно создать один Newlib и один инструмент Linux с одним и тем же префиксом. Но вы должны избегать создания двух или двух инструментов Linux с одним и тем же префиксом.
Если построить инструментальный щип Linux в системе MacOS или в системе Windows с использованием подсистемы Linux или Cygwin, вы должны убедиться, что файловая система чувствительна к случаям. Строительство нечувствительной к случаю файловой системы пройдет при строительстве GLIBC, потому что *.OS и *.OS-файлы будут заглушить друг друга во время сборки в конечном итоге, что приведет к запутанным ошибкам ссылки.
CentOS (и RHEL) предоставляют старые версии инструментов GNU, которые могут быть слишком старыми, чтобы построить инструмент RISC-V. Существует альтернативный набор инструментов, который включает в себя текущие версии инструментов GNU. Это Devtoolset, предоставляемый в рамках службы сбора программного обеспечения. Для получения дополнительной информации см. URL DevtoolSet-7. Существуют различные версии Devtoolset, которые можно попробовать другие версии, но у нас есть хотя бы один отчет, который работает DevtoolSet-7.
Существует ряд дополнительных вариантов, которые могут быть переданы для настройки. См.
Также вы можете определить дополнительные флаги для передачи в конкретные проекты: BINUTILS_NATIVE_FLAGS_EXTRA, BINUTILS_TARGET_FLAGS_EXTRA, GCC_EXTRA_CONFIGURE_FLAGS, GDB_NATIVE_FLAGS_EXTRA, GDB_TARGET_FLAGS_EXTRA, GLIBC_TARGET_FLAGS_EXTRA, NEWLIB_TARGET_FLAGS_EXTRA
. Пример: GCC_EXTRA_CONFIGURE_FLAGS=--with-gmp=/opt/gmp make linux
--with-isa-spec=
может указать версию по умолчанию нежелюбной (ранее пользовательский) ISA-спецификация.
Возможные варианты: 2.2
, 20190608
и 20191213
.
Версия по умолчанию - 20191213
.
Более подробная информация об этой опции вы можете направить этот пост RISC-V GNU Toolchain, ставящий по умолчанию ISA Spect в 20191213.
--with-multilib-generator=
может указать, какие мультилисины строить. Аргумент представляет собой полуколон, разделенный списком значений, возможно, состоящий из одного значения. В настоящее время поддерживается только для RISCV* - -Фе . Принятые значения и значения приведены ниже.
Каждая конфигурация построена с четырьмя компонентами: архитектурная строка, ABI, правило повторного использования со строкой архитектуры и правилом повторного использования с подразделением.
Оператор расширения поддержки повторного использования (*) для упрощения комбинации различных подэкстра, пример 4 демонстрирует, как он использует и работает.
Пример 1: Добавьте поддержку с несколькими LIB для RV32I с ILP32.
./configure --with-multilib-generator="rv32i-ilp32--"
Пример 2: Добавьте поддержку с несколькими LIB для RV32I с ILP32 и RV32IMAFD с ILP32.
./configure --with-multilib-generator="rv32i-ilp32--;rv32imafd-ilp32--"
Пример 3: Добавьте поддержку с несколькими LIB для RV32I с ILP32; RV32im с ILP32 и RV32IC с ILP32 повторно использует этот набор с несколькими LIB.
./configure --with-multilib-generator="rv32i-ilp32-rv32im-c"
Пример 4: Добавьте поддержку с несколькими LIB для RV64IMA с LP64; RV64IMAF с LP64, RV64IMAC с LP64 и RV64IMAFC с LP64 повторно использует этот набор с несколькими LIB.
./configure --with-multilib-generator="rv64ima-lp64--f*c"
Набор испытаний Dejagnu был перенесен в RISC-V. Это можно запустить с симулятором для инструментов ELF и Linux. Симулятор может быть выбран переменной SIM в Makefile, например, SIM = QEMU, SIM = GDB или --with-sim=
= SPIKE (экспериментальный). . Однако, testSuite AlluctList проникают только для QEMU.other Simulators могут получить дополнительные сбои.
Получительный скрипт для настройки среды тестирования требует Pyelftools.
На более новых версиях Ubuntu выполнить следующую команду.
$ sudo apt-get install python3-pyelftools
На более новых версиях Fedora и Centos/Rhel OS (9 или более позднего года), выполнение следующей команды должно быть достаточно:
$ sudo yum install python3-pyelftools
На Arch Linux выполнить следующую команду должно быть достаточно:
$ sudo pacman -Syyu python-pyelftools
Если у вашей дистрибуции/ОС нет пакета Pyelftools, вы можете установить его с помощью PIP.
# Assuming that PIP is installed
$ pip3 install --user pyelftools
Чтобы проверить GCC, запустите следующие команды:
./configure --prefix=$RISCV --disable-linux --with-arch=rv64ima # or --with-arch=rv32ima
make newlib
make report-newlib SIM=gdb # Run with gdb simulator
./configure --prefix=$RISCV
make linux
make report-linux SIM=qemu # Run with qemu
./configure --prefix=$RISCV --with-sim=spike
make linux
make report # Run with spike
Примечание:
По умолчанию GCC выполнит все тесты своего регрессионного набора тестов. В то время как запуск их параллельно (например, make -j$(nproc) report
) будет значительно ускорить время выполнения в многопрофильных системах, необходимое время для выполнения всех тестов обычно слишком высока для типичных циклов разработки. Поэтому GCC позволяет выбрать тесты, которые выполняются с использованием переменной среды RUNTESTFLAGS
.
Чтобы ограничить тестовый прогон только для конкретных тестов RISC-V, можно использовать следующую команду:
Runtestflags = "riscv.exp" Сделать отчет
Чтобы ограничить тестовый прогон только для конкретных тестов RISC-V с соответствием шаблона «zb*.c» и «sm*.c». Можно использовать следующую команду:
Runtestflags = "riscv.exp = zb*.c sm*.c"
Цель Makefile по умолчанию для запуска тестирования инструментов - это report
. Это запустит все тесты регрессионного набора GCC. В качестве альтернативы, следующая команда может быть использована, чтобы сделать то же самое:
make check-gcc
Следующая команда может использоваться для запуска тестов Binutils:
make check-binutils
Приведенная ниже команда может использоваться для запуска тестов Glibc:
make check-glibc-linux
--with-extra-multilib-test
может использоваться, когда вы хотите проверить больше комбинации Arch/ABI, например: построить инструмент Linux с Multilib с rv64gc/lp64d
и rv64imac/lp64
, но вы хотите проверить больше конфигурации, как rv64gcv/lp64d
или rv64gcv_zba/lp64d
, затем вы можете использовать-with-extra-multilib-test, чтобы указать, что через --with-extra-multilib-test="rv64gcv-lp64d;rv64gcv_zba-lp64d"
Для rv64gc/lp64d
, rv64imac/lp64
, rv64gcv/lp64d
и rv64gcv_zba/lp64d
.
--with-extra-multilib-test
поддержки с голой-металлом и набором инструментов Linux и поддержка даже Multilib отключена, но пользователь должен обеспечить дополнительную конфигурацию тестирования MultiLib Configuration Если у Multilib не было никакого RV32 Multilib.
--with-extra-multilib-test
также поддерживает более сложный формат в соответствии с требованиями конечных пользователей. Прежде всего, аргумент представляет собой список тестовых конфигураций. Каждая тестовая конфигурация разделена ;
Полем Например:
rv64gcv-lp64d;rv64_zvl256b_zvfh-lp64d
Для каждой тестовой конфигурации он имеет две части: AKA, требуемая часть Arch-ABI и дополнительные флаги сборки. Мы используем :
разделить их с некоторыми ограничениями.
:
для их разделения. Например: rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic:--param=riscv-autovec-preference=fixed-vlmax
Будет рассматриваться как одна целевая доска так же, как ниже:
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=dynamic/--param=riscv-autovec-preference=fixed-vlmax
rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic,--param=riscv-autovec-preference=fixed-vlmax
будет рассматриваться как две целевые платы, так же, как ниже:
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-preference=fixed-vlmax
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=dynamic
:
:) или ( ,
) оператор вместе, но OR ( ,
) всегда будет иметь более высокий приоритет. Например: rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic:--param=riscv-autovec-preference=fixed-vlmax,--param=riscv-autovec-lmul=m2
Будет рассматриваться как бассейно -целевые бои, так же, как ниже:
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=dynamic/--param=riscv-autovec-preference=fixed-vlmax
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=m2
LLVM может использоваться в сочетании с инструментом компилятора RISC-V GNU для создания приложений RISC-V. Для создания LLVM с помощью C и C ++ поддерживает флаг Configure --enable-llvm
.
Например, чтобы построить LLVM поверх инструментального оборудования RV64 Linux. Можно использовать следующие команды:
./configure-prefix = $ riscv -enable-lvm -enable-linux make
Обратите внимание, что комбинация флагов конфигурации --enable-llvm
и мультилисий не поддерживается.
Ниже приведены примеры, как построить RV64GC Linux/Newlib Toolchain с поддержкой LLVM, как использовать его для создания приложения C и C ++ с использованием Clang, и как выполнить сгенерированные двоичные файлы с помощью QEMU.
Создайте инструментальный поход Linux и запустите примеры:
# Build rv64gc toolchain with LLVM
./configure --prefix=$RISCV --enable-llvm --enable-linux --with-arch=rv64gc --with-abi=lp64d
make -j$(nproc) all build-sim SIM=qemu
# Build C application with clang
$RISCV/bin/clang -march=rv64imafdc -o hello_world hello_world.c
$RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./hello_world
# Build C++ application with clang
$RISCV/bin/clang++ -march=rv64imafdc -stdlib=libc++ -o hello_world_cpp hello_world_cpp.cxx
$RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./hello_world_cpp
Создайте Newlib Toolchain и запустите примеры (не работайте с --with-multilib-generator=
):
# Build rv64gc bare-metal toolchain with LLVM
./configure --prefix=$RISCV --enable-llvm --disable-linux --with-arch=rv64gc --with-abi=lp64d
make -j$(nproc) all build-sim SIM=qemu
# Build C application with clang
$RISCV/bin/clang -march=rv64imafdc -o hello_world hello_world.c
$RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./hello_world
# Build C++ application with clang using static link
$RISCV/bin/clang++ -march=rv64imafdc -static -o hello_world_cpp hello_world_cpp.cxx
$RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./hello_world_cpp
Этот раздел предназначен только для разработчика или продвинутого пользователя, или вы хотите создать инструмент с вашим собственным источником.
riscv-gnu-toolchain
содержит стабильный, но не последний источник для каждого подмодуля, если вы хотите использовать новейшее дерево Develoment, вы можете использовать следующую команду для обновления всех подмодулей.
git submodule update --remote
Или вы можете обновить только конкретный подмодуль.
git submodule update --remote <component>
Например, обновите только GCC, вы можете использовать следующую команду:
git submodule update --remote gcc
Информация о филиале записана в файле .gitmodules
, который может устанавливать или обновлять через git submodule add -b
или git submodule set-branch
.
Однако единственный способ проверить, какая ветвь использует,-это проверить файл .gitmodules
, вот пример для gcc
, он использует ветку Releseses/GCC-12, поэтому он будет иметь раздел с именем gcc
и имеет branch
поля releases/gcc-12
.
[submodule "gcc"]
path = gcc
url = ../gcc.git
branch = releases/gcc-12
riscv-gnu-toolchain
riscv-gnu-toolchain
также поддерживает использование источника вне дерева для построения инструментов. Существует несколько параметров настройки для определения дерева источника каждого подмодуля/компонента.
Например, если у вас есть источники GCC в $HOME/gcc
, используйте --with-gcc-src
, чтобы построить набор инструментов с помощью этих источников:
./configure ... --with-gcc-src=$HOME/gcc
Вот список параметров настройки для определения альтернативных источников для различных подмодулей/компонентов:
--with-binutils-src
--with-dejagnu-src
--with-gcc-src
--with-gdb-src
--with-glibc-src
--with-linux-headers-src
--with-llvm-src
--with-musl-src
--with-newlib-src
--with-pk-src
--with-qemu-src
--with-spike-src
--with-uclibc-src
Взносы GCC должны соответствовать нескольким требованиям, чтобы претендовать на включение вверх по течению. Предупреждение бесплатно компиляция с компилятором из тех же источников является среди них. Флаг- --enable-host-gcc
делает невыразительное:
-Werror
для определения проблем с кодомЕсли части Newlib будут заменены на внешнюю библиотеку (например, с LibGloss-HTIF для интерфейса Host-Target Berkeley), вы должны позаботиться о том, чтобы как Newlib, так и внешняя библиотека созданы с использованием одной и той же кодовой модели. Для получения дополнительной информации о моделях кода RISC-V прочитайте эту статью в блоге.
Ошибки, которые указывают на несоответствие кодовой модели, включают в себя ошибки «переполнение переезда» или «усеченные» перемещения »от линкера, который не может успешно перемещать символы в исполняемом файле.
По умолчанию riscv-gnu-toolchain
строит NEWLIB с -mcmodel=medlow
. Вы можете использовать альтернативную модель кода medany
(как используется в LibGloss-HTIF), передавая --with-cmodel=medany
в сценарий настройки.