這是RISC-V C和C ++交叉補償器。它支持兩種構建模式:通用精靈/Newlib工具鍊和更複雜的Linux-Elf/Glibc工具鏈。
該存儲庫使用子模型,但是子模塊將根據需求自動獲取,因此--recursive
或git submodule update --init --recursive
不需要。
$ git clone https://github.com/riscv/riscv-gnu-toolchain
警告:Git Clone需要大約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上的Arch用戶:https://aur.archlinux.org/packages/riscv-gnu-toolchain-bin
在MacOS上,您可以使用自製釀製來安裝依賴項:
$ brew install python3 gawk gnu-sed make gmp mpfr libmpc isl zlib expat texinfo flock libslirp
在此讀書中執行指令時,請使用gmake
make
不是使用新安裝的Make版本。要在MACOS上構建GLIBC(Linux),您需要在對案例敏感的文件系統中構建。最簡單的方法是使用案例敏感格式創建和安裝新的磁盤圖像。確保安裝點不包含空間。這不是在MacOS上構建Newlib或GCC本身的必要條件。
此過程將從下載約200個MIB上游來源開始,然後將修補,構建和安裝工具鏈。如果上游來源的本地緩存以$(DISTDIR)存在,則將使用;默認位置是/var/cache/distfiles。您的計算機將需要大約8個GIB磁盤空間才能完成該過程。
要構建Newlib跨編譯器,請選擇一個安裝路徑(可寫的)。如果選擇,請說, /opt/riscv
,請在PATH
中添加/opt/riscv/bin
。然後,只需運行以下命令:
./configure --prefix=/opt/riscv
make
現在,您應該能夠使用Riscv64 Inknown-Felf-GCC及其堂兄。
注意:如果您打算使用替換Newlib一部分的外部庫(例如libgloss-htif
),請閱讀常見問題解答。
要構建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
如果您更喜歡Musl Libc而不是GlibC,則像上面的配置一樣, make musl
而不是make linux
。
支持的體系結構為RV32I或RV64I加標準擴展(a)Tomics,(m)終極和劃分,(f)loat,(d)ouble或(g)MAFD的能量。
受支持的ABIS是ILP32(32位軟質流動),ILP32D(32位硬化),ILP32F(32位(32位)在寄存器中具有單位固定,僅在存儲器中使用雙重,僅使用NIke),LP64 LP64 LP64F LP64D(但相同但相同但相同)有64位長和指針)。
要構建對32位和64位支持的交叉補償器,請運行以下命令:
./configure --prefix=/opt/riscv --enable-multilib
然後分別為Newlib,Linux GLIBC或Linux Musl Libc的跨編譯器make
, make linux
或make musl
。
Multilib編譯器將具有前綴RISCV64-Inning-Eff-或Riscv64-Inninknown-Linux-gnu-,但將能夠針對32位和64位系統。它將支持最常見的-march
/ -mabi
選項,可以通過在任何一個交叉編譯器上使用--print-multi-lib
標誌來看到。
Linux工具鏈有一個附加的選項--enable-default-pie
可以控制GCC的默認PIE啟用,默認情況下是禁用的。
要自定義啟用語言,請使用選項--with-languages=
。例如,如果要啟用c,c++,fortran
,則使用./configure --with-languages=c,c++,fortran
。此選項僅對GNU工具鏈生效。
如果安裝到空目錄中,則構建最有效。如果您構建硬浮動工具鏈,然後嘗試構建具有相同的軟浮動工具鏈-prefix目錄,那麼構建腳本可能會感到困惑並通過鏈接器錯誤,因為抱怨硬浮標代碼無法與之鍊接軟浮子代碼。首先刪除現有的工具鏈,或為第二構建使用不同的前綴避免了問題。可以使用相同前綴構建一個Newlib和一個Linux工具鏈。但是,您應該避免使用相同前綴構建兩個Newlib或兩個Linux工具鏈。
如果使用Linux子系統或Cygwin在MACOS系統或Windows系統上構建Linux工具鏈,則必須確保文件系統對病例敏感。在構建glibc時,基於案例不敏感的文件系統將失敗,因為 *.os和 *.os文件在構建過程中會互相凝固,最終導致鏈接錯誤混淆。
CentOS(和RHEL)提供了舊的GNU工具版本,這些版本可能太老了,無法構建RISC-V工具鏈。提供了一個替代工具集,其中包括當前版本的GNU工具。這是作為軟件收集服務的一部分提供的DevToolset。有關更多信息,請參見DevToolset-7 URL。可用的DevToolSet的各種版本,因此您也可以嘗試其他版本的其他版本,但是我們至少有一個報告DevToolset-7可以使用。
可以傳遞多個其他選項以配置。有關更多詳細信息,請參見'./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無特權(以前是用戶級)ISA規範的默認版本。
可能的選項是: 2.2
20190608
20191213
。
默認版本是20191213
。
有關此選項的更多詳細信息,您可以將此帖子RISC-V GNU工具鏈碰撞默認ISA規格轉移到20191213。
--with-multilib-generator=
可以指定要構建的多利布。該參數是一個半分離的值列表,可能由單個值組成。目前僅支持RISCV* - -ELF 。公認的值和含義如下。
每個配置都是由四個組件構造的:架構字符串,ABI,用架構字符串的重複使用規則,並使用子擴展進行重複使用規則。
重複使用零件支持擴展操作員(*)為了簡化不同的子擴展的組合,示例4演示了它的使用和工作方式。
示例1:用ILP32添加對RV32I的多LIB支持。
./configure --with-multilib-generator="rv32i-ilp32--"
示例2:使用ILP32和RV32IMAFD添加對RV32I的多LIB支持。
./configure --with-multilib-generator="rv32i-ilp32--;rv32imafd-ilp32--"
示例3:用ILP32添加對RV32I的多LIB支持;帶有ILP32和RV32IC的RV32IM帶有ILP32的RV32IM將重複使用此多LIB集。
./configure --with-multilib-generator="rv32i-ilp32-rv32im-c"
示例4:使用LP64添加對RV64IMA的多LIB支持;帶有LP64,RV64IMAC的RV64IMAF,具有LP64和LP64的RV64IMAFC將重複使用此多LIB集。
./configure --with-multilib-generator="rv64ima-lp64--f*c"
Dejagnu測試套件已移植到RISC-V。可以使用用於精靈和Linux工具鏈的模擬器運行。模擬器可以通過makefile中的SIM變量選擇,例如SIM = QEMU,SIM = GDB或SIM = Spike(實驗)。此外,還可以使用配置時間選項選擇模擬器--with-sim=
。
設置測試環境的幫助腳本需要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” make Report
默認的makefile目標運行工具鏈report
。這將運行GCC回歸測試套件的所有測試。或者,以下命令可以使用相同的操作:
make check-gcc
以下命令可用於運行Binutils測試:
make check-binutils
下面的命令可用於運行GLIBC測試:
make check-glibc-linux
--with-extra-multilib-test
,例如:使用Multilib構建具有rv64gc/lp64d
和rv64imac/lp64
的Linux工具鏈,但是您想測試更多的配置,例如測試更多的配置rv64gcv/lp64d
或rv64gcv_zba/lp64d
,然後您可以使用--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測試配置可以與現有的LIB/MULTILIB一起使用,例如RV32GCV/ILP32測試無法正常工作如果Multilib沒有任何RV32 Multilib。
--with-extra-multilib-test
也支持更複雜的格式,以滿足最終用戶的要求。首先,該參數是測試配置列表。每個測試配置都被分開;
。例如:
rv64gcv-lp64d;rv64_zvl256b_zvfh-lp64d
對於每種測試配置,它都有兩個部分,也就是所需的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應用程序。為了構建使用C和C ++的LLVM,可以使用配置標誌--enable-llvm
。
例如,在RV64 Linux工具鏈上構建LLVM可以使用以下命令:
./configure -prefix = $ riscv -eenable-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工具鍊和運行示例(不使用--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樹,則可以使用以下命令來升級所有subpodule。
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
部分,並且具有Field branch
是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
海灣合作委員會的貢獻必須滿足幾種要求,以便有資格獲得上游納入。從同一來源中,通過編譯器構建來警告免費編譯。旗幟--enable-host-gcc
確實很棒:
-Werror
構建以識別代碼問題如果將紐里布的部分替換為外部庫(例如,使用伯克利主機 - 靶標接口的libgloss-htif),您應該注意確保使用相同的代碼模型構建newlib和外部庫。有關RISC-V代碼模型的更多信息,請閱讀此細微的博客文章。
指示代碼模型不匹配的錯誤包括“重新定位溢出”或“重新定位截斷”錯誤,該鏈接器無法成功地將符號重新放置在可執行文件中。
默認情況下, riscv-gnu-toolchain
用-mcmodel=medlow
構建newlib。您可以通過將替代的medany
代碼模型(如libgloss-htif中使用) --with-cmodel=medany
給configure腳本。