riscv编译工具链构建说明

构建riscv-gnu-toolchain有几种方式:

  • 第一种是直接下载源码然后本地编译,然后 make install
  • 第二种如果使用的是ubuntu20,可以直接使用 apt 安装
  • 第三种就是下载别人已经编译好的文件,然后解压,配置一下工具链路径

编译器有这几种类型,以64位的编译器为例子,三种不同类型编译器的区别后面会说明

  • riscv64-linux-gnu-gcc
  • riscv64-unknown-elf-gcc
  • riscv64-unknown-linux-gnu-gcc

源码构建

riscv-gnu-toolchain的官方仓库在:riscv-collab/riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCC (github.com),下载上面的源码,然后按照官方提供的编译命令进行编译安装,但是绝大多数时候是编译不过的,因为官方的源码依赖种的第三方文件我们下载不下来,有一个解决办法就是去gittee镜像上去把对应的包下载然后放进源码种,这样编译是能成功。关于如何在gittee上去下载第三方依赖请各位百度。

官网提供的编译方式如下:

image-20230716140122180

这里建议直接使用第三种配置编译方式,可以编译生成32位和64位的编译器:

./configure --prefix=/opt/riscv --enable-multilib

这里使用源码编译太操蛋了,我捣鼓了好久,不推荐

apt 构建

apt构建会比较简单,这里只针对ubuntu20.04

sudo apt install libc6-riscv64-cross
sudo apt install binutils-riscv64-linux-gnu
sudo apt install gcc-riscv64-linux-gnu
sudo apt install binutils-riscv64-unknown-elf
sudo apt install gcc-riscv64-unknown-elf

执行上面的命令会生成两种类型的编译器:

  • riscv64-linux-gnu-gcc
  • riscv64-unknown-elf-gcc

但是riscv64-unknown-elf-gcc这个编译器是不含c库的,比如你的代码种如果包含了stdio.h想使用printf函数就会报错。不推荐使用apt install安装的riscv64-unknown-elf-gcc编译器。

riscv64-linux-gnu-gcc,使用这个编译器就可以使用C库了,例如我有下面这样一段代码:

#include "stdio.h"
int main()
{
printf("hello world!")
}

使用编译器来编译:

riscv64-linux-gnu-gcc hello.c

然后使用qemu来执行

qemu-riscv64 a.out

这里应该会报一个错误:

qemu-riscv64: Could not open '/lib/ld-linux-riscv64-lp64.d.so.1':No such file or direcyory

没找到文件的原因是,因为文件下载的地方,和查找的地方不一样,只要把文件cp一下就可以了。

sudo cp /usr/riscv64-linux-gnu/lib/* /lib/

然后再运行应该就没问题了。

下载二进制文件构建

进入riscv-gnu-toolchaingithub仓库,找到右边的tags

image-20230716143145875

点击进入:

image-20230716143217518

可以看见这里有已经编译好的二进制文件,截至我打开的时候,最新的版本是2023.07.07,点击进入

image-20230716143310196

这里有已经编译好的编译器,分别对应不同的ubuntu版本,有32位和64位两个版本的。

其中riscv64-elf-ubuntu-20.04-gcc-nightly-2023.07.07-nightly.tar.gz解压后的编译器就是:riscv64-unknown-elf-gcc但是官方编译的版本是带C库的

riscv64-glibc-ubuntu-20.04-llvm-nightly-2023.07.07-nightly.tar.gz解压后的编译器是:riscv64-unknown-linux-gnu-gcc,假设你用这个编译器去编译上面的hello.c文件,编译是没问题的,但是如果你使用qemu-riscv64 a.out去执行,同样会报错误:

 qemu-riscv64: Could not open '/lib/ld-linux-riscv64-lp64.d.so.1':No such file or direcyory

同样我们也想到可以将这个编译器的lib文件拷贝过去,但是我在它的lib种却找不到这个动态库,如下:

image-20230716144055264

如果说你拷贝了riscv64-linux-gnu-gcc,那么这里执行应该不会报错。

riscv的编译工具链真的很操蛋!!!!!!!!!!

参考链接