|  | 
 
| 本帖最后由 BOB_Sun 于 2020-6-16 19:14 编辑 
 要学习riscv架构,首先第一步,要搞定riscv的gcc交叉编译器。下面就对riscv的gcc交叉编译器,进行详细的介绍。
 
 一、riscv gcc工具下载
 
 该仓库,里面包含了一些子仓库。使用以下这个命令,将所有仓库,都clone下来。
 以下是各个仓库的github地址:复制代码git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
 
 二、编译riscv gcc
 下载完毕后,就要开始编译。首先在riscv-gnu-toolchain根目录下,创建build目录。用于编译riscv gcc。
 riscv gcc可以编译成以下几个版本
 
 riscv32-unknown-elf-gccriscv64-unknown-elf-gccriscv32-unknown-linux-gnu-gccriscv64-unknown-linux-gnu-gccriscv64-multilib-elf-gccriscv64-liunx-multilib-gcc
 以下编译,是基于 riscv架构支持 imc三种指令集,来进行编译的。如果想要支持其他的指令集,只需要修改 —-with-arch选项。
 1、riscv32-unknown-elf-gcc
 执行以下命令:
 —-mabi可以选择如下:复制代码
../configure --prefix=/opt/riscv32 --with-arch=rv32imc --with-abi=xxx
make
 编译完成后,在/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。执行以下命令:
 —-with-abi可以选择如下:复制代码../configure --prefix=/opt/riscv64 --with-arch=rv64imc --with-abi=xxx
make
 编译完成后,在/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。执行以下命令:
 —-with-abi可以选择如下:复制代码../configure --prefix=/opt/riscv32-linux --with-arch=rv32imc --with-abi=xxx --enable-linux
make linux
 编译完成后,在/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。
 
 
 
 | 
 |