linux 怎么编译.v,学习第一步:RISC-V GCC工具链编译安装~

原标题:学习第一步:RISC-V GCC工具链编译安装~

RISC-V GCC工具链编译安装

要学习riscv架构,首先第一步,要搞定riscv的gcc交叉编译器。下面就对riscv的gcc交叉编译器,进行详细的介绍。

riscv gcc工具下载

Riscv的gcc交叉编译器,以开源的方式托管在github上。链接如下:

https://github.com/riscv/riscv-gnu-toolchain

linux 怎么编译.v,学习第一步:RISC-V GCC工具链编译安装~_第1张图片

该仓库,里面包含了一些子仓库。

使用以下这个命令,将所有仓库,都clone下来。

git clone --recursive https://github.com/riscv/riscv-gnu-toolchain

以下是各个仓库的github地址:

riscv-gcc

https://github.com/riscv/riscv-gcc

riscv-glibc

https://github.com/riscv/riscv-glibc

riscv-newlib

https://github.com/riscv/riscv-newlib

riscv-dejagnu

https://github.com/riscv/riscv-dejagnu

riscv-gdb

https://github.com/riscv/riscv-binutils-gdb.git

riscv-binutils

https://github.com/riscv/riscv-binutils-gdb.git

riscv-qemu

https://github.com/riscv/riscv-qemu.git

编译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

执行以下命令:

../configure --prefix=/opt/riscv32 --with-arch=rv32imc --with-abi=xxx

make

—-mabi可以选择如下:

ilp32

ilp32f

ilp32d

编译完成后,在/opt/riscv/bin目录下,有riscv32-unknown-elf-gcc的所有工具。

linux 怎么编译.v,学习第一步:RISC-V GCC工具链编译安装~_第2张图片

通过 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目录下,有如下的文件夹和文件生成。

4e18f019a81e85f5819c83d4468cb02b.png

其中有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的所有工具。

linux 怎么编译.v,学习第一步:RISC-V GCC工具链编译安装~_第3张图片

使用 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的所有工具。

linux 怎么编译.v,学习第一步:RISC-V GCC工具链编译安装~_第4张图片

使用 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的所有工具。

linux 怎么编译.v,学习第一步:RISC-V GCC工具链编译安装~_第5张图片

使用 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目录下,有如下文件以及文件夹:

linux 怎么编译.v,学习第一步:RISC-V GCC工具链编译安装~_第6张图片

可以看出,用的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

linux 怎么编译.v,学习第一步:RISC-V GCC工具链编译安装~_第7张图片

编译完成后,在/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的所有工具。使用make命令,就可以生成了。

linux 怎么编译.v,学习第一步:RISC-V GCC工具链编译安装~_第8张图片

虽然有使用–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

除了non-embed编译器,对于每一类,如果禁用multilib,那么又分为32位版本和64位版本。如果使能multilib,那么就只有一个版本,但是这个版本工具,可以同时支持32位和64位。

RISC-V中文社区 致力于RISC-V技术的推广,为广大RISC-V爱好者提供一个交流学习的开放平台。社区长期欢迎您以各种方式来与我们互动。

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。返回搜狐,查看更多

责任编辑:

你可能感兴趣的:(linux,怎么编译.v)