【CentOS7】riscv-gnu-toolchain交叉编译器的构建

目录

1、首先安装git

2、安装软件包

3、下载riscv-gnu-toolchain库

4、下载子仓库

5、编译工具链

5.1、riscv32-unknown-elf-gcc

5.2、riscv64-unknown-elf-gcc

5.3、riscv32-unknown-linux-gnu-gcc

5.4、riscv64-unknown-linux-gnu-gcc

5.5、riscv64-linux-multilib

5.6、riscv64-multilib-elf-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 可以是多个目标模块。


 

  • 0
    点赞
  • 6
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

Like_ai

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值