これはRISC-V CおよびC ++クロスコンパイラです。一般的なELF/NewLibツールチェーンと、より洗練されたLinux-Elf/Glibcツールチェーンの2つのビルドモードをサポートしています。
このリポジトリはサブモジュールを使用しますが、サブモジュールはオンデマンドで自動的にフェッチするため、 --recursive
またはgit submodule update --init --recursive
は必要ありません。
$ git clone https://github.com/riscv/riscv-gnu-toolchain
警告:Gitクローンは約6.65 GBのディスクとダウンロードサイズを取得します
ツールチェーンを構築するには、いくつかの標準パッケージが必要です。
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 OSでは、次のコマンドを実行するだけで十分です。
$ 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
また、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で指示を実行する場合は、新しくインストールされたバージョンのmake
を使用する代わりにgmake
使用してください。 MacOSにGLIBC(Linux)を構築するには、ケースに敏感なファイルシステム内で構築する必要があります。最も簡単なアプローチは、ケースに敏感な形式を使用して新しいディスクイメージを作成してマウントすることです。マウントポイントにスペースが含まれていないことを確認してください。これは、newlibまたはGCC自体をmacOSに構築するために必要ではありません。
このプロセスは、約200 MIBのアップストリームソースをダウンロードすることから始まり、ツールチェーンのパッチ、ビルド、インストールを行います。上流のソースのローカルキャッシュが$(Distdir)に存在する場合、使用されます。デフォルトの場所は/var/cache/distfilesです。コンピューターは、プロセスを完了するために約8ギブのディスクスペースが必要です。
NewLibクロスコンパイラを構築するには、インストールパス(書き込み可能)を選択します。 /opt/riscv
選択した場合は、 PATH
に/opt/riscv/bin
を追加します。次に、次のコマンドを実行するだけです。
./configure --prefix=/opt/riscv
make
これで、RISCV64-Unknown-Elf-GCCとそのいとこを使用できるようになりました。
注:Newlibの一部を置き換える外部ライブラリ( libgloss-htif
など)を使用する場合は、FAQをお読みください。
Linuxクロスコンパイラを構築するには、インストールパス(書き込み可能)を選択します。 /opt/riscv
選択した場合は、 PATH
に/opt/riscv/bin
を追加します。次に、次のコマンドを実行するだけです。
./configure --prefix=/opt/riscv
make linux
ビルドは、32ビットビルド環境であっても、GLIBCを使用してRV64GC(64ビット)をターゲットにするデフォルトです。 32ビットRV32GCツールチェーンを構築するには、使用してください。
./configure --prefix=/opt/riscv --with-arch=rv32gc --with-abi=ilp32d
make linux
glibcよりもmusl libcを好む場合は、上記のように構成し、 make linux
ではなくmake musl
を選択します。
サポートされているアーキテクチャは、RV32IまたはRV64Iプラス標準拡張機能(a)Tomics、(M)最終段階と分割、(f)Loat、(d)Ouble、または(g)MAFDの標準です。
サポートされているABIは、ILP32(32ビットソフトフロート)、ILP32D(32ビットハードフロート)、ILP32F(レジスタに単一精度を備えた32ビット、メモリで2倍、ニッチ使用のみ)、LP64 LP64F LP64D(同じが同じ64ビットの長さとポインター)。
32ビットと64ビットの両方をサポートしてクロスコンパイラーを構築するには、次のコマンドを実行します。
./configure --prefix=/opt/riscv --enable-multilib
そして、それぞれmake
、 make linux
か、Linux Glibcベース、またはLinux MUSL LIBCベースのクロスコンパイラーのmake musl
。
Multilibコンパイラには、RISCV64-UNKNOUNT-ELF-またはRISCV64-UNKNOUNT-LINUX-GNU-をプレフィックスに搭載しますが、32ビットシステムと64ビットシステムの両方をターゲットにすることができます。これは、どちらのクロスコンパイラで--print-multi-lib
フラグを使用して見ることができる最も一般的な-march
/ -mabi
オプションをサポートします。
Linux Toolchainには、GCCのデフォルト--enable-default-pie
PIEイネーブルメントを制御するための追加のオプションがあります。デフォルトでは無効になります。
有効な言語をカスタマイズするには、オプション--with-languages=
を使用します。たとえば、 c,c++,fortran
有効にする場合は、 ./configure --with-languages=c,c++,fortran
有効にしたい場合。このオプションは、GNUツールチェーンでのみ有効になります。
空のディレクトリにインストールする場合、構築するのが最適です。ハードフロートツールチェーンを構築してから、同じ-Prefixディレクトリを使用してソフトフロートツールチェーンを構築しようとすると、ビルドスクリプトが混乱し、ハードフロートコードをリンクできないと不平を言うリンカーエラーで終了する場合があります。ソフトフロートコード。最初に既存のツールチェーンを削除するか、2番目のビルドに別のプレフィックスを使用すると、問題が回避されます。同じプレフィックスを使用して1つのNewLibと1つのLinuxツールチェーンを構築しても構いません。ただし、同じプレフィックスで2つのNewLibまたは2つのLinuxツールチェーンの構築を避ける必要があります。
MacOSシステムにLinuxツールチェーンを構築する場合、またはLinuxサブシステムまたはCygwinを使用してWindowsシステムに構築する場合は、ファイルシステムがケースに敏感であることを確認する必要があります。 *.osファイルがビルド中に互いに密集し、最終的にリンクエラーが混乱するため、glibcを構築するときにケースに依存しないファイルシステム上のビルドが失敗します。
Centos(およびRHEL)は、古すぎるGNUツールバージョンを提供しています。 GNUツールの現在のバージョンを含む代替ツールセットが提供されています。これは、ソフトウェアコレクションサービスの一部として提供されるDevToolsetです。詳細については、DevToolset-7 URLを参照してください。利用可能なdevtoolsetにはさまざまなバージョンがありますので、他のバージョンを試すこともできますが、devtoolset-7が機能するという少なくとも1つのレポートがあります。
構成するために渡される可能性のある追加のオプションがいくつかあります。詳細については、 './configure - help'を参照してください。
また、特定のプロジェクトに合格する余分なフラグを定義することができます: 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=
risc-vのデフォルトバージョンを指定することができます。
可能なオプションは、 2.2
および20190608
20191213
。
デフォルトバージョンは20191213
です。
このオプションの詳細この投稿RISC-V GNUツールチェーンは、デフォルトのISA仕様を20191213にバンプすることを参照できます。
--with-multilib-generator=
構築するマルチリブを指定できます。議論は、値のセミコロン分離されたリストであり、おそらく単一の値で構成されるものです。現在、RISCV* -ELFのみサポートされています。受け入れられている値と意味を以下に示します。
すべての構成には、アーキテクチャストリング、ABI、アーキテクチャストリングによる再利用ルール、サブエクステンションによるルールの再利用の4つのコンポーネントで構成されています。
パーツサポート拡張オペレーター(*)を再利用して、さまざまなサブエクステンションの組み合わせを簡素化します。例4は、それがどのように使用および動作するかを示します。
例1:ILP32でRV32iのマルチLIBサポートを追加します。
./configure --with-multilib-generator="rv32i-ilp32--"
例2:ILP32およびILP32にRV32Iを使用してRV32IのマルチLIBサポートを追加します。
./configure --with-multilib-generator="rv32i-ilp32--;rv32imafd-ilp32--"
例3:ILP32でRV32iのマルチLIBサポートを追加します。 ILP32でRV32IMおよびILP32を使用したRV32IMは、このマルチLIBセットを再利用します。
./configure --with-multilib-generator="rv32i-ilp32-rv32im-c"
例4:LP64を使用してRV644IMAのマルチLIBサポートを追加します。 LP64を使用したRV6444、LP64を使用したRV64IMAC、LP64を使用したRV644IMAFCは、このマルチLIBセットを再利用します。
./configure --with-multilib-generator="rv64ima-lp64--f*c"
Dejagnuテストスイートは、RISC-Vに移植されました。これは、ELFおよびLinuxツールチェーンのシミュレータで実行できます。シミュレーターは、MakeFileのSIM変数で選択できます。たとえば、SIM = QEMU、SIM = GDB、またはSIM = Spike(実験)。追加では、シミュレータはConfigure Timeオプション--with-sim=
で選択することもできます。ただし、TestSuite AllowlistはQemu.other Simulatorsが追加の障害を獲得する可能性があるため、Qemu.other Simulationのみがメントされています。
テスト環境をセットアップするヘルパースクリプトには、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
配布/OSに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のより多くの組み合わせをテストするときに使用できます。たとえば、 rv64gc/lp64d
およびrv64imac/lp64
を備えたMultIlibを使用して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 rv64gc/lp64d
、 rv64imac/lp64
、 rv64gcv/lp64d
、およびrv64gcv_zba/lp64d
の場合。
--with-extra-multilib-test
サポートしているBare-MetalおよびLinux ToolchainとサポートMultilibも無効にしますが、ユーザーは既存のLIB/Multilibで動作することを確認する必要があります。 MultilibにRV32 Multilibがなかった場合。
--with-extra-multilib-test
、エンドユーザーの要件に適合するためのより複雑な形式もサポートしています。まず、引数はテスト構成のリストです。各テスト構成は、次のように分離されています;
。例えば:
rv64gcv-lp64d;rv64_zvl256b_zvfh-lp64d
各テスト構成には、2つの部分があります。たとえば、Arch-ABI部品とオプションのビルドフラグが必要です。レバレッジ:
いくつかの制限でそれらを分離します。
:
を使用できます。例えば: rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic:--param=riscv-autovec-preference=fixed-vlmax
以下と同じ1つのターゲットボードと見なされます。
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
以下と同じ2つのターゲットボードと見なされます。
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アプリケーションを構築できます。 CおよびC ++を使用してLLVMを構築するには、flag --enable-llvm
使用することができます。
たとえば、RV64 Linuxツールチェーンの上にLLVMを構築するには、次のコマンドを使用できます。
./CONFIGURE ---PREFIX = $ RISCV -ENABLE-LLVM-ENABLE-LINUX MAKE
--enable-llvm
とmultilib構成フラグの組み合わせはサポートされていないことに注意してください。
以下は、LLVMサポートを備えたRV64GC Linux/NewLibツールチェーンを構築する方法、Clangを使用してCおよびC ++アプリケーションを構築するために使用する方法、および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
は、各サブモジュールの安定性がありますが最新のソースは含まれていません。最新の開発ツリーを使用する場合は、次のコマンドを使用してすべてのサブモジュールをアップグレードできます。
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
の例は次のとおりです。リリース/GCC-12ブランチを使用しているため、 gcc
という名前のセクションがあり、フィールドbranch
releases/gcc-12
です。 releases/gcc-12
。
[submodule "gcc"]
path = gcc
url = ../gcc.git
branch = releases/gcc-12
riscv-gnu-toolchain
以外のソースツリーを使用しますriscv-gnu-toolchain
ツリーのソースを使用してツールチェーンを構築することもサポートしています。各サブモジュール/コンポーネントのソースツリーを指定するためのいくつかの構成オプションがあります。
たとえば、 $HOME/gcc
に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
それをexacltyします:
-Werror
で構築され、コードの問題を識別しますNewlibの一部が外部ライブラリ(Berkeley Host-TargetインターフェイスのLibgloss-Htifなど)に置き換えられる場合は、Newlibと外部ライブラリの両方が同じコードモデルを使用して構築されるように注意する必要があります。 RISC-Vコードモデルの詳細については、このSifiveブログ記事をご覧ください。
コードモデルの不一致を示すエラーには、「再配置オーバーフロー」またはリンカーからの「再配置の切り捨て」エラーが含まれます。
デフォルトでは、 riscv-gnu-toolchain
-mcmodel=medlow
でNewLibを構築します。 configureスクリプトに渡す--with-cmodel=medany
渡すことにより、代替メmedany
コードモデル(libgloss-htifで使用)を使用できます。