riscv各种版本gcc工具链编译与安装
riscv各种版本gcc工具链编译与安装
riscv gcc工具下载
Riscv 的 gcc 交叉编译器,以开源的方式托管在 github 上。链接如下:
https://github.com/riscv/riscv-gnu-toolchain
该仓库,里面包含了一些子仓库。
使用以下这个命令,将所有仓库,都 clone 下来。
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
以下是各个仓库的 github 地址(这里给出 riscv-gnu-toolchain 工具链中的最新版本):
名称 | 链接 (分支) |
---|---|
binutils | https://sourceware.org/git/binutils-gdb.git (binutils-2_42-branch) |
gdb | https://sourceware.org/git/binutils-gdb.git (gdb-14-branch) |
gcc | https://gcc.gnu.org/git/gcc.git (releases/gcc-13) |
glibc | https://sourceware.org/git/glibc.git |
dejagnu | https://git.savannah.gnu.org/git/dejagnu.git (master) |
newlib | https://sourceware.org/git/newlib-cygwin.git (master) |
qemu | https://gitlab.com/qemu-project/qemu.git |
musl | https://git.musl-libc.org/git/musl (master) |
spike | https://github.com/riscv-software-src/riscv-isa-sim.git (master) |
pk | https://github.com/riscv-software-src/riscv-pk.git (master) |
llvm | https://github.com/llvm/llvm-project.git (release/17.x) |
下面是官方版本的 github 地址(非 riscv-gnu-toolchain 中的最新版本):
riscv-gcc | |
riscv-glibc | |
riscv-newlib | |
riscv-dejagnu | |
riscv-gdb | |
riscv-binutils | |
riscv-qemu |
这里推荐使用 riscv-gnu-toolchain 工具链中的最新版
编译riscv gcc
下载完毕后,就要开始编译。首先在 riscv-gnu-toolchain 根目录下,创建 build 目录。用于编译 riscv gcc。
riscv gcc 可以编译成以下几个版本
-
riscv32-unknown-elf-gcc
-
riscv64-unknown-elf-gcc
-
riscv32-unknown-linux-gnu-gcc
-
riscv64-unknown-linux-gnu-gcc
-
riscv64-multilib-elf-gcc
-
riscv64-liunx-multilib-gcc
以下编译,是基于 riscv架构支持 imc三种指令集,来进行编译的。如果想要支持其他的指令集,只需要修改 --with-arch选项。
1、riscv32-unknown-elf-gcc
该工具,针对于 riscv32 架构的编译器,使用的 C 运行库为 newlib。
执行以下命令:
../configure --prefix=/opt/riscv32 --with-arch=rv32imc --with-abi=xxx
make
--mabi可以选择如下:
-
ilp32
-
ilp32f
-
ilp32d
编译完成后,在 /opt/riscv/bin 目录下,有 riscv32-unknown-elf-gcc 的所有工具。
通过 riscv32-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。
Using built-in specs.
COLLECT_GCC=./riscv32-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv32-unknown-elf/8.2.0/lto-wrapper
Target: riscv32-unknown-elf
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv32-unknown-elf --prefix=/opt/riscv --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --with-newlib --with-sysroot=/opt/riscv/riscv32-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=ilp32 --with-arch=rv32imc 'CFLAGS_FOR_TARGET=-Os -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)
可以看出:
--target=riscv32-unknown-elf: 指定工具为riscv32-unknow-elf
--prefix=/opt/riscv32: 指定工具生成的目录
--enable-languages=c,c++: 支持c,c++语言
--with-newlib: c运行库使用newlib
--with-abi=ilp32: 工具链支持的abi方式是ilp64
--with-arch=rv32imc: 工具链支持的riscv架构是 rv64imc
在build目录下,有如下的文件夹和文件生成。
其中有 newlib 和 newlib-nano,就表示 C 运行库,就是用的 newlib 以及 newlib-nano。
2、riscv64-unknown-elf-gcc
该工具,针对于 riscv64 架构的编译器,使用的 C 运行库为 newlib。
执行以下命令:
../configure --prefix=/opt/riscv64 --with-arch=rv64imc --with-abi=xxx
make
--with-abi可以选择如下:
-
lp64
-
lp64f
-
lp64d
编译完成后,在 /opt/riscv64/bin 目录下,有 riscv64-unknown-elf-gcc 的所有工具。
使用 riscv64-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。
Using built-in specs.
COLLECT_GCC=./riscv64-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/opt/riscv64/libexec/gcc/riscv64-unknown-elf/8.2.0/lto-wrapper
Target: riscv64-unknown-elf
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-unknown-elf --prefix=/opt/riscv64 --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --with-newlib --with-sysroot=/opt/riscv64/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=lp64 --with-arch=rv64imc 'CFLAGS_FOR_TARGET=-Os -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)
可以看出:
--target=riscv64-unknown-elf: 指定工具为riscv64-unknow-elf
--prefix=/opt/riscv64: 指定工具生成的目录
--enable-languages=c,c++: 支持c,c++语言
--with-newlib: c运行库使用newlib
--with-abi=lp64: 工具链支持的abi方式是lp64
--with-arch=rv64imc: 工具链支持的riscv架构是 rv64imc
在 build 目录下,有如下的文件夹和文件生成。
其中有 newlib 和 newlib-nano,就表示 C 运行库,就是用的 newlib 以及 newlib-nano。
3、riscv32-unknown-linux-gnu-gcc
该工具,针对于 riscv32 架构的编译器,使用的 C 运行库为 linux 中的标准 glibc。
执行以下命令:
../configure --prefix=/opt/riscv32-linux --with-arch=rv32imc --with-abi=xxx --enable-linux
make linux
--with-abi可以选择如下:
-
lp64
-
lp64f
-
lp64d
编译完成后,在 /opt/riscv32-linux/bin 目录下,有 riscv32-unknown-linux-gnu-gcc 的所有工具。
使用 riscv32-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。
Using built-in specs.
COLLECT_GCC=./riscv32-unknown-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/riscv-linux/libexec/gcc/riscv32-unknown-linux-gnu/8.2.0/lto-wrapper
Target: riscv32-unknown-linux-gnu
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv32-unknown-linux-gnu --prefix=/opt/riscv-linux --with-sysroot=/opt/riscv-linux/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=ilp32 --with-arch=rv32imc 'CFLAGS_FOR_TARGET=-O2 -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)
可以看出:
--target=riscv32-unknown-linux-gnu: 指定工具为riscv32-unknow-linux-gnu
--prefix=/opt/riscv-linux: 指定工具生成的目录
--enable-languages=c,c++: 支持c,c++语言
--with-abi=ilp32: 工具链支持的abi方式是ilp32
--with-arch=rv32imc: 工具链支持的riscv架构是 rv32imc
虽然有 --with-newlib 配置选项,但是编译却不会有 newlib 编译,而有 glibc 编译。因为使用的是 make linux 进行编译。也可以在 configure 阶段,加上 --enable-linux 选项。
在 build 目录下,有如下文件以及文件夹:
可以看出,用的c运行库是glibc。
4、riscv64-unknown-linux-gnu-gcc
该工具,针对于 riscv64 架构的编译器,使用的C运行库为linux中的标准glibc。
执行以下命令:
../configure --prefix=/opt/riscv64-linux --with-arch=rv64imafdc --with-abi=xxx --enable-linux
make linux
--with-abi可以选择如下:
-
lp64
-
lp64f
-
lp64d
编译完成后,在 /opt/riscv64-linux/bin 目录下,有 riscv64-unknown-linux-gnu-gcc 的所有工具。
使用 riscv64-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。
Using built-in specs.
COLLECT_GCC=./riscv64-unknown-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/riscv64-linux/libexec/gcc/riscv64-unknown-linux-gnu/8.2.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/opt/riscv64-linux --with-sysroot=/opt/riscv64-linux/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-O2 -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)
可以看出:
--target=riscv64-unknown-linux-gnu: 指定工具为riscv64-unknow-linux-gnu
--prefix=/opt/riscv64: 指定工具生成的目录
--enable-languages=c,c++: 支持c,c++语言
--with-abi=lp64d: 工具链支持的abi方式是lp64d
--with-arch=rv64imafdc: 工具链支持的riscv架构是 rv64imafdc
虽然有 --with-newlib 配置选项,但是编译却不会有 newlib 编译,而是有 glibc 编译。因为使用的是 make linux 进行编译。也可以在 configure 阶段,加上 --enable-linux 选项。
在build目录下,有如下文件以及文件夹:
可以看出,用的c运行库是glibc。
5、riscv64-linux-multilib
在编译 riscv 工具链的时候,可以编译 multilib 版本的 gcc,这样这个工具,可以同时支持 32 位和 64 位。
执行以下命令:
../configure --prefix=/opt/riscv-linux-multilib --enable-multilib --target=riscv64-linux-multilib
make linux
编译完成后,在 /opt/riscv64-linux/bin 目录下,有 riscv64-linux-multilib -gcc 的所有工具。
虽然有通过--target指定,但是生成的工具链名字还是 riscv64-unknow-linu-gnu-gcc。
使用 riscv64-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。
Using built-in specs.
COLLECT_GCC=./riscv64-unknown-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/riscv-multilib/libexec/gcc/riscv64-unknown-linux-gnu/8.2.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target= riscv64-linux-multilib --prefix=/opt/riscv-linux-multilib --with-sysroot=/opt/riscv-linux-multilib/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-O2 -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
Thread model: single
可以看出:
--target= riscv64-linux-multilib: 指定工具为riscv64-linux-multilib
--prefix=/opt/riscv-linux-multilib: 指定工具生成的目录
--enable-languages=c,c++: 支持c,c++语言
--with-abi=lp64d: 工具链支持的abi方式是lp64d
--with-arch=rv64imafdc: 工具链支持的riscv架构是 rv64imafdc
--enabl-multilib: 启动 multilib
对于 riscv64-linux-multilib-gcc 编译器,可以通过以下选项,来决定生成的程序是 32 位版本还是 64 位版本:
- -march=rv32: 32 位版本
- -march=rv64: 64 位版本
6、riscv64-multilib-elf-gcc
在裸机编译 riscv 工具链的时候,可以编译 multilib 版本的 gcc,这样这个工具,可以同时支持32位和64位。
执行以下命令:
../configure --prefix=/opt/riscv64-multilib-elf --enable-multilib --target=riscv64-multilib-elf
make
编译完成后,在 /opt/ riscv64-multilib-elf /bin 目录下,有 riscv64-multilib-elf-gcc 的所有工具。
虽然有使用--target指定,但是生成的编译器还是 riscv64-unknown-elf-gcc。
使用 riscv64-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。
Using built-in specs.
COLLECT_GCC=./riscv64-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/opt/riscv64-multilib-elf/libexec/gcc/riscv64-unknown-elf/8.2.0/lto-wrapper
Target: riscv64-unknown-elf
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-multilib-elf --prefix=/opt/riscv64-multilib-elf --disable-shared --disable-threads --disable-tls --enable-languages=c,c++ --with-system-zlib --with-newlib --with-sysroot=/opt/riscv64-multilib-elf/riscv64-unknown-elf --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-Os -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)
可以看出:
--target=riscv64-multilib-elf: 指定工具为riscv64-multilib-elf
--prefix=/opt/riscv64-multilib-elf: 指定工具生成的目录
--enable-languages=c,c++: 支持c,c++语言
--with-abi=lp64d: 工具链支持的abi方式是lp64d
--with-arch=rv64imafdc: 工具链支持的riscv架构是 rv64imafdc
--enable-multilib: 启用multilib
对于 riscv64-multilib-elf-gcc 编译器,可以通过以下选项,来决定生成的程序是 32 位版本还是 64 位版本:
- -march=rv32: 32 位版本
- -march=rv64: 64 位版本
riscv-none-embed-gcc
专门为嵌入式使用的gcc交叉编译工具链。官方网站:
https://gnu-mcu-eclipse.github.io/toolchain/riscv/
可以直接下载 linux 的二进制执行程序,以及 windows 的安装包。这个一般要搭配 GNU MCU eclipse 工具一起使用。
因为这个工具,直接提供执行程序,因此就不介绍了。
总结
riscv的gcc编译器,分为2大类:
-
裸机: unknown-elf,none-embed
-
linux: linux
除了 none-embed 编译器,对于每一类,如果禁用 multilib,那么又分为 32 位版本和 64 位版本。如果使能 multilib,那么就只有一个版本,但是这个版本工具,可以同时支持 32 位和 64 位。