这是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检验来指定通过--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脚本。