Dies ist der RISC-V C- und C ++-Cross-Compiler. Es unterstützt zwei Build-Modi: eine generische ELF/Newlib-Toolchain und eine ausgefeiltere Linux-Felf/GLIBC-Toolchain.
Dieses Repository verwendet Submodules, aber Submodules holt automatisch nach Bedarf ab. Daher ist nicht --recursive
oder git submodule update --init --recursive
erforderlich.
$ git clone https://github.com/riscv/riscv-gnu-toolchain
WARNUNG: Git Clone dauert ungefähr 6,65 GB Festplatte und Download -Größe
Um die Toolchain zu erstellen, werden mehrere Standardpakete benötigt.
Auf Ubuntu sollte die Ausführung des folgenden Befehls ausreichen:
$ 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
Auf Fedora/Centos/Rhel OS sollte die Ausführung des folgenden Befehls ausreichen:
$ 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
Unter Arch Linux sollte die Ausführung des folgenden Befehls ausreichen:
$ sudo pacman -Syyu autoconf automake curl python3 libmpc mpfr gmp gawk base-devel bison flex texinfo gperf libtool patchutils bc zlib expat libslirp
Auch für Erzbenutzer im AUR verfügbar
Bei MacOS können Sie Homebrew verwenden, um die Abhängigkeiten zu installieren:
$ brew install python3 gawk gnu-sed make gmp mpfr libmpc isl zlib expat texinfo flock libslirp
Wenn Sie die Anweisungen in diesem Readme ausführen, verwenden Sie bitte gmake
anstatt die neu installierte Version von make
zu verwenden. Um das GLIBC (Linux) auf macOS zu erstellen, müssen Sie innerhalb eines Fall-sensitiven Dateisystems erstellen. Der einfachste Ansatz besteht darin, ein neues Festplattenbild mit einem fallempfindlichen Format zu erstellen und zu montieren. Stellen Sie sicher, dass der Mountspunkt keine Räume enthält. Dies ist nicht erforderlich, um Newlib oder GCC selbst auf MacOS zu erstellen.
Dieser Vorgang beginnt mit dem Herunterladen von etwa 200 MIB Upstream -Quellen und wird die Toolchain patchen, erstellen und installieren. Wenn ein lokaler Cache der vorgelagerten Quellen in $ (Distir) vorhanden ist, wird er verwendet. Der Standardspeicherort ist/var/cache/distfiles. Ihr Computer benötigt etwa 8 Gib -Speicherplatz, um den Prozess abzuschließen.
Um den Newlib Cross-Compiler zu erstellen, wählen Sie einen Installationsweg (der schriftlich ist). Wenn Sie beispielsweise /opt/riscv
wählen, fügen Sie /opt/riscv/bin
zu Ihrem PATH
hinzu. Führen Sie dann einfach den folgenden Befehl aus:
./configure --prefix=/opt/riscv
make
Sie sollten jetzt in der Lage sein, RISCV64-Unbekannte-Elf-GCC und seine Cousins zu verwenden.
Hinweis: Wenn Sie vorhaben, eine externe Bibliothek zu verwenden, die einen Teil von Newlib (z. B. libgloss-htif
) ersetzt, lesen Sie die FAQ.
Um den Linux-Cross-Compiler zu erstellen, wählen Sie einen Installationsweg (der schriftlich ist). Wenn Sie beispielsweise /opt/riscv
wählen, fügen Sie /opt/riscv/bin
zu Ihrem PATH
hinzu. Führen Sie dann einfach den folgenden Befehl aus:
./configure --prefix=/opt/riscv
make linux
Der Build stand auf RV64GC (64-Bit) mit GLIBC, selbst in einer 32-Bit-Build-Umgebung. Um den 32-Bit-RV32GC-Toolchain zu erstellen, verwenden Sie:
./configure --prefix=/opt/riscv --with-arch=rv32gc --with-abi=ilp32d
make linux
Falls Sie Musl LIBC gegenüber GLIBC bevorzugen, konfigurieren Sie genau wie oben und entscheiden Sie sich für make musl
anstelle von make linux
.
Unterstützte Architekturen sind Rv32i oder Rv64i plus Standardverlängerungen (a) Tomics, (m) Ultiplikation und Abteilung, (f) loat, (d) ober oder (g) für MAFD.
Unterstützte Abis sind ILP32 (32-Bit-Soft-Float), ILP32D (32-Bit-Hard-Float), ILP32F (32-Bit mit Einzelprezision in Registern und Double in Memory, nur Nischengebrauch), LP64 LP64F LP64D (gleich mit 64-Bit lang und Zeiger).
Führen Sie den folgenden Befehl aus:
./configure --prefix=/opt/riscv --enable-multilib
Und dann entweder make linux
make
oder make musl
.
Der Multilib-Compiler verfügt über den Präfix RISCV64-UNKNOWN-FLISC- oder RISCV64-UNKNOWN-LINUX-GNU-, kann jedoch sowohl 32-Bit- als auch 64-Bit-Systeme abzielen. Es wird die häufigsten Optionen -march
/ -mabi
unterstützen, die mit der Flagge --print-multi-lib
auf beiden Cross-Compiler gesehen werden können.
Linux Toolchain verfügt über eine zusätzliche Option --enable-default-pie
um die Standard-PIE-Aktivierung für GCC zu steuern, die standardmäßig deaktiviert ist.
Verwenden Sie Option --with-languages=
, um die aktivierten Sprachen anzupassen. Wenn Sie beispielsweise c,c++,fortran
./configure --with-languages=c,c++,fortran
verwenden möchten. Diese Option wirkt sich nur für die GNU -Toolchain in Kraft.
Builds funktioniert am besten, wenn Sie in ein leeres Verzeichnis installieren. Wenn Sie eine Hardfloat-Toolchain erstellen und dann versuchen, eine Soft-Float-Toolchain mit demselben Verzeichnis zu erstellen Soft Float Code. Das Entfernen der vorhandenen Toolchain zuerst oder die Verwendung eines anderen Präfixes für den zweiten Build vermeidet das Problem. Es ist in Ordnung, einen Newlib und eine Linux -Toolchain mit demselben Präfix zu erstellen. Sie sollten jedoch vermeiden, zwei neue oder zwei Linux -Toolchains mit demselben Präfix zu bauen.
Wenn Sie eine Linux-Toolchain auf einem MacOS-System oder auf einem Windows-System mit dem Linux-Subsystem oder Cygwin erstellen, müssen Sie sicherstellen, dass das Dateisystem Fall sensibel ist. Ein Aufbau auf einem von Fall unempfindlichen Dateisystem schlägt beim Erstellen von GLIBC fehl, da *.OS- und *.OS-Dateien sich während des Builds gegenseitig gegenseitig kuscheln, was schließlich zu verwirrenden Verknüpfungsfehlern führt.
CentOS (und RHEL) bieten alte GNU-Tools-Versionen, die möglicherweise zu alt sind, um eine RISC-V-Toolchain zu erstellen. Es gibt ein alternatives Toolset, das aktuelle Versionen der GNU -Tools enthält. Dies ist der Devtoolset, der im Rahmen des Software -Sammlungsdienstes bereitgestellt wird. Weitere Informationen finden Sie in der URL Devtoolset-7. Es gibt verschiedene Versionen des Devtoolset, die verfügbar sind, sodass Sie auch andere Versionen davon ausprobieren können, aber wir haben mindestens einen Bericht, den DevToolset-7 funktioniert.
Es gibt eine Reihe zusätzlicher Optionen, die zum Konfigurieren übergeben werden können. Weitere Informationen finden Sie unter './Configure --Help'.
Also you can define extra flags to pass to specific projects: 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
. Beispiel: GCC_EXTRA_CONFIGURE_FLAGS=--with-gmp=/opt/gmp make linux
--with-isa-spec=
kann die Standardversion der ISA-Spezifikation der RISC-V-unrivilegierten (ehemals Benutzerebene) angeben.
Mögliche Optionen sind: 2.2
, 20190608
und 20191213
.
Die Standardversion ist 20191213
.
Weitere Details zu dieser Option können Sie diesen Post RISC-V GNU Toolchain-Standard-Standard-ISA-Spezifikation auf 20191213 verweisen.
--with-multilib-generator=
kann angeben, welche Multilibs erstellen sollen. Das Argument ist eine von Semikolon getrennte Liste von Werten, die möglicherweise aus einem einzelnen Wert besteht. Derzeit nur für RISCV* - -elf unterstützt. Die akzeptierten Werte und Bedeutungen sind nachstehend angegeben.
Jede Konfiguration ist mit vier Komponenten konstruiert: Architekturstring, ABI, Wiederverwendungregel mit Architekturstring und Wiederverwendungregel mit Unterausdehnung.
Wiederverwenden Sie den Expansion Operator (*) zur Unterstützung des Teils zur Unterstützung der Kombination verschiedener Sub-Extensions, Beispiel 4 zeigen, wie es verwendet und funktioniert.
Beispiel 1: Fügen Sie Multi-Lib-Unterstützung für RV32I mit ILP32 hinzu.
./configure --with-multilib-generator="rv32i-ilp32--"
Beispiel 2: Fügen Sie Multi-Lib-Unterstützung für RV32I mit ILP32 und RV32IMAFD mit ILP32 hinzu.
./configure --with-multilib-generator="rv32i-ilp32--;rv32imafd-ilp32--"
Beispiel 3: Fügen Sie Multi-Lib-Unterstützung für RV32I mit ILP32 hinzu; RV32IM mit ILP32 und RV32IC mit ILP32 wird diesen Multi-Lib-Set wiederverwenden.
./configure --with-multilib-generator="rv32i-ilp32-rv32im-c"
Beispiel 4: Fügen Sie Multi-Lib-Unterstützung für RV64IMA mit LP64 hinzu; RV64IMAF mit LP64, RV64IMAC mit LP64 und RV64IMAFC mit LP64 wird diesen Multi-Lib-Set wiederverwenden.
./configure --with-multilib-generator="rv64ima-lp64--f*c"
Die Dejagnu-Testsuite wurde auf RISC-V portiert. Dies kann mit einem Simulator für die Elf- und Linux -Toolchains ausgeführt werden. Der Simulator kann durch die SIM-Variable in Makefile, --with-sim=
. Die Testsuite -Zulassungsliste ist jedoch nur für QEMU geprägt. Andere Simulatoren können zusätzliche Fehler erhalten.
Für ein Helfer -Skript zum Einrichten von Testumgebungen sind Pyelftools erforderlich.
Bei neueren Versionen von Ubuntu sollte die Ausführung des folgenden Befehls ausreichen:
$ sudo apt-get install python3-pyelftools
In neueren Versionen von Fedora und CentOS/Rhel OS (9 oder später) sollte die Ausführung des folgenden Befehls ausreichen:
$ sudo yum install python3-pyelftools
Unter Arch Linux sollte die Ausführung des folgenden Befehls ausreichen:
$ sudo pacman -Syyu python-pyelftools
Wenn Ihr Verteiler/Betriebssystem kein Pyelftools -Paket enthält, können Sie es mit PIP installieren.
# Assuming that PIP is installed
$ pip3 install --user pyelftools
Führen Sie die folgenden Befehle aus, um GCC zu testen:
./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
Notiz:
Standardmäßig wird GCC alle Tests seiner Regressionstestsuite ausführen. Während sie parallel ausführen (z. B. make -j$(nproc) report
), beschleunigt die Ausführungszeit für Multi -Processor -Systeme die erforderliche Zeit für die Ausführung aller Tests in der Regel zu hoch für typische Entwicklungszyklen. Daher ermöglicht GCC die Auswahl der Tests, die mithilfe der Umgebungsvariablen RUNTESTFLAGS
ausgeführt werden.
Um einen Testlauf auf nur RISC-V-spezifische Tests einzuschränken, kann der folgende Befehl verwendet werden:
RunTestFlags = "riscv.exp" Make Report
Um einen Testlauf auf nur RISC-V-spezifische Tests mit dem Muster "zb*.c" und "sm*.c" zu beschränken. Der folgende Befehl kann verwendet werden:
RunTestFlags = "riscv.exp = zb*.c sm*.c" Erstellen Sie den Bericht
Das Standard -Makefile -Ziel zum Ausführen von Toolchain -Tests ist report
. Dies wird alle Tests der GCC -Regressionstestsuite durchführen. Alternativ kann der folgende Befehl verwendet werden, um dasselbe zu tun:
make check-gcc
Der folgende Befehl kann verwendet werden, um die Binutils -Tests auszuführen:
make check-binutils
Der folgende Befehl kann verwendet werden, um die GLIBC -Tests auszuführen:
make check-glibc-linux
-Mit rv64gc/lp64d
--with-extra-multilib-test
kann verwendet werden, wenn Sie mehr Kombination aus Arch/ rv64imac/lp64
testen möchten, z. B. eine Linux rv64gcv/lp64d
or rv64gcv_zba/lp64d
, then you can use --with-extra-multilib-test to specify that via --with-extra-multilib-test="rv64gcv-lp64d;rv64gcv_zba-lp64d"
, then the testing will run Für rv64gc/lp64d
, rv64imac/lp64
, rv64gcv/lp64d
und rv64gcv_zba/lp64d
.
--with-extra-multilib-test
unterstützt Bare-Metal- und Linux-Toolchain und unterstützt sogar Multilib, aber der Benutzer muss sicherstellen Wenn Multilib kein RV32 -Multilib hatte.
--with-extra-multilib-test
unterstützt auch komplizierteres Format, um die Anforderungen der Endbenutzer zu erfüllen. Zunächst ist das Argument eine Liste von Testkonfigurationen. Jede Testkonfiguration wird durch getrennt ;
. Zum Beispiel:
rv64gcv-lp64d;rv64_zvl256b_zvfh-lp64d
Für jede Testkonfiguration verfügt es über zwei Teile, auch bekannt als Arch-ABI-Teil und optionale Build-Flags. Wir nutzen :
um sie mit einigen Einschränkungen zu trennen.
:
Sie trennen. Zum Beispiel: rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic:--param=riscv-autovec-preference=fixed-vlmax
wird als eine Zielkarte wie unten betrachtet:
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
wird als zwei Zielplatten wie unten betrachtet:
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
:
(, ( ,
) Operator zusammen haben, aber der OR ( ,
) hat immer die höhere Priorität. Zum Beispiel: rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic:--param=riscv-autovec-preference=fixed-vlmax,--param=riscv-autovec-lmul=m2
wird als Schleppzielschweine wie unten betrachtet:
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 kann in Kombination mit der RISC-V GNU-Compiler-Toolchain verwendet werden, um RISC-V-Anwendungen zu erstellen. Um LLVM mit C und C ++ zu erstellen, unterstützen Sie das Flag --enable-llvm
Konfigurieren.
ZB zum Erstellen von LLVM auf einem RV64 Linux Toolchain Die folgenden Befehle können verwendet werden:
./configure--prefix = $ riscv-enable-llvm-enable-linux machen
Beachten Sie, dass eine Kombination aus Konfigurationsflags von --enable-llvm
und Multilib nicht unterstützt wird.
Im Folgenden finden Sie Beispiele, wie Sie eine RV64GC Linux/Newlib Toolchain mit LLVM -Unterstützung erstellen, wie Sie mithilfe von Clang eine C- und eine C ++ - Anwendung erstellen und die generierten Binärdateien mit QEMU ausführen können.
Bauen Sie Linux Toolchain und führen Sie Beispiele aus:
# 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
Erstellen Sie Newlib Toolchain und führen Sie Beispiele aus (arbeiten Sie nicht mit --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
Dieser Abschnitt ist nur für Entwickler oder erweiterten Benutzer gedacht, oder Sie möchten Toolchain mit Ihrem eigenen Quellbaum erstellen.
riscv-gnu-toolchain
enthalten eine stabile, aber nicht neueste Quelle für jedes Submodul. Wenn Sie den neuesten Entwicklungsbaum verwenden möchten, können Sie den folgenden Befehl verwenden, um das gesamte Submodul zu verbessern.
git submodule update --remote
Oder Sie können nur bestimmte Submodule aktualisieren.
git submodule update --remote <component>
Wenn Sie beispielsweise nur GCC aktualisieren, können Sie den folgenden Befehl verwenden:
git submodule update --remote gcc
Die Filiale Info wurde in der .gitmodules
-Datei aufgezeichnet, die über git submodule add -b
-S git submodule set-branch
festgelegt oder aktualisieren kann.
Die einzige Möglichkeit, zu überprüfen, welche Filiale verwendet werden, besteht darin .gitmodules
Datei zu überprüfen. Hier ist das Beispiel für gcc
. Sie verwendet Releases/GCC-12-Zweig, sodass er einen Abschnitt mit dem Namen gcc
hat und eine branch
ist releases/gcc-12
ist releases/gcc-12
.
[submodule "gcc"]
path = gcc
url = ../gcc.git
branch = releases/gcc-12
riscv-gnu-toolchain
riscv-gnu-toolchain
unterstützt auch die Verwendung von Out-of-Tree-Quellen, um die Toolchain zu erstellen. Es gibt mehrere Konfigurationsoptionen, um den Quellbaum jeder Submodul/Komponente anzugeben.
Wenn Sie beispielsweise GCC-Quellen in $HOME/gcc
haben, verwenden Sie --with-gcc-src
um die Toolchain mit diesen Quellen zu erstellen:
./configure ... --with-gcc-src=$HOME/gcc
Hier finden Sie die Liste der Konfigurationsoptionen zum Angeben alternativer Quellen für die verschiedenen Submoduli/Komponenten:
--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 -Beiträge müssen mehrere Anforderungen erfüllen, um sich für eine vorgelagerte Inklusion zu qualifizieren. Warnfree Compilation mit einem Compiler -Build aus denselben Quellen ist unter ihnen. Die Flagge --enable-host-gcc
verblüfft, dass:
-Werror
erstellt, um Codeprobleme zu identifizierenWenn Teile von Newlib durch eine externe Bibliothek ersetzt werden (z. Weitere Informationen zu RISC-V-Code-Modellen finden Sie in diesem Sifive-Blog-Artikel.
Fehler, die ein Codemodell -Nichtübereinstimmung anzeigen, umfassen "Umzugsüberlauf" oder "Umzug verkürzt" Fehler, da der Linker nicht erfolgreich Symbole in die ausführbare Datei verlagern kann.
Standardmäßig baut riscv-gnu-toolchain
Newlib mit -mcmodel=medlow
auf. Sie können das alternative medany
-Codemodell (wie in libGloss-htif verwendet) verwenden, indem Sie --with-cmodel=medany
an das Konfigurationsskript übergeben.