目录
5.3、riscv32-unknown-linux-gnu-gcc
5.4、riscv64-unknown-linux-gnu-gcc
在centos7系统上安装riscv-gnu-toolchain交叉编译环境。
1、首先安装git
sudo apt install git //首先安装git
2、安装软件包
对于Fedora/CentOS/RHEL操作系统:安装构建工具链需要的软件包
$ sudo yum install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk bison flex texinfo patchutils gcc gcc-c++ zlib-devel expat-devel
其它系统见:
github链接:https://github.com/riscv-collab/riscv-gnu-toolchain
gitee链接:riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCC. Tweaked for microcontrollers.
3、下载riscv-gnu-toolchain库
git clone --recursive https://gitee.com/riscv-mcu/riscv-gnu-toolchain.git
4、下载子仓库
(东西太多,一般情况下因为网络不好,需要在克隆了riscv-gnu-toolchain库之后自己再单独克隆每个子库)(https://不行的话试试git://)
cd riscv-gnu-toolchain
git clone --recursive https://git.qemu.org/git/qemu.git
git clone --recursive https://gitee.com/riscv-mcu/riscv-binutils-gdb.git riscv-binutils
git clone --recursive https://gitee.com/riscv-mcu/riscv-dejagnu.git
git clone --recursive https://gitee.com/riscv-mcu/riscv-gcc.git
git clone --recursive https://gitee.com/riscv-mcu/riscv-binutils-gdb.git riscv-gdb
git clone --recursive git://sourceware.org/git/glibc.git
git clone --recursive git://sourceware.org/git/newlib-cygwin.git
5、编译工具链
在riscv-gnu-toolchain根目录下,创建build目录。用于编译riscv gcc。
# mkdir build
# cd build
可以编译成以下几个版本
- 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
我编译都的是riscv64-unknown-elf-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
5.1、riscv32-unknown-elf-gcc
../configure --prefix=/opt/riscv32 --with-arch=rv32imc --with-abi=xxx
make
--with-abi=xxx可以选择如下:
指定ABI调用规则,有效的选项值如下:
-
ilp32/lp32
-
ilp32f/lp32f
-
ilp32d/32d
具体区别
编译完成后,在/opt/riscv/bin目录下,有riscv32-unknown-elf-gcc的所有工具。
5.2、riscv64-unknown-elf-gcc
针对于riscv64架构的编译器,使用的C运行库为newlib:
../configure --prefix=/opt/riscv64 --with-arch=rv64imc --with-abi=xxx
make
--with-abi=xxx可以选择如下:
-
lp64
-
lp64f
-
lp64d
编译完成后,在/opt/riscv64/bin目录下,有riscv64-unknown-elf-gcc的所有工具。
使用 riscv64-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。
在build目录下,有如下的文件夹和文件生成。
其中有newlib和newlib-nano,就表示c运行库,就是用的newlib以及newlib-nano。
5.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=xxx可以选择如下:
-
lp64
-
lp64f
-
lp64d
编译完成后,在/opt/riscv64-linux/bin目录下,有riscv64-unknown-linux-gnu-gcc的所有工具。
5.4、riscv64-unknown-linux-gnu-gcc
../configure --prefix=/opt/riscv64-linux --with-arch=rv64imafdc --with-abi=xxx --enable-linux
make linux
5.5、riscv64-linux-multilib
编译multilib版本的gcc,可以同时支持32位和64位,通过--target指定。
../configure --prefix=/opt/riscv-linux-multilib --enable-multilib --target=riscv32-linux-multilib
make linux
../configure --prefix=/opt/riscv-linux-multilib --enable-multilib --target=riscv64-linux-multilib
make linux
5.6、riscv64-multilib-elf-gcc
在裸机编译riscv工具链的时候,可以编译multilib版本的gcc,可以同时支持32位和64位。
../configure --prefix=/opt/riscv64-multilib-elf --enable-multilib --target=riscv64-multilib-elf
make
6、测试
写一个c程序,然后使用riscv64-unknown-elf-gcc来编译这个.c文件
/opt/riscv64/bin/riscv64-unknown-elf-gcc -o hello.o hello.c
注:gcc命令及作用
/opt/riscv64/bin/riscv64-unknown-elf-gcc --help //查看指令
gcc(GNU Compiler)是GNU推出的多平台编译器,可将C、C++源程序编译连接程可执行文件,支持以下后缀:
1) .c C语言源代码
2).h 程序所包含的头文件
3).i 已经预处理过的C源代码文件
4) .s 汇编语言源代码文件
5) .o 编译后的目标文件
生成.o文件之后可能会用到仿真工具riscv-tools进行仿真。
命令选项的作用:
1. -o <file> Place the output into <file>
如:#gcc -o file file.c
-o 告诉编译器将可执行程序放在何处,如果没有指定文件名称,编译器则会把程序放在一个名为a.out的文件里(a.out的含义是 assembler output,即汇编输出)。
2. -c Compile and assemble, but do not link
如:#gcc -c file.c
-c 告诉编译器仅把源代码编译为目标模块(file.o)而跳过汇编和连接的步骤。在使用-c生成目标模块后,就可以通过-o选项来生成可执行文件。如:#gcc -o file file1.o file2.o 可以是多个目标模块。