riscv编译工具链构建说明
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
上去下载第三方依赖请各位百度。
官网提供的编译方式如下:
这里建议直接使用第三种配置编译方式,可以编译生成32位和64位的编译器:
./configure --prefix=/opt/riscv --enable-multilib |
这里使用源码编译太操蛋了,我捣鼓了好久,不推荐
apt 构建
apt
构建会比较简单,这里只针对ubuntu20.04
sudo apt install libc6-riscv64-cross |
执行上面的命令会生成两种类型的编译器:
- 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库了,例如我有下面这样一段代码:
|
使用编译器来编译:
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-toolchain
的github
仓库,找到右边的tags
点击进入:
可以看见这里有已经编译好的二进制文件,截至我打开的时候,最新的版本是2023.07.07,点击进入
这里有已经编译好的编译器,分别对应不同的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
种却找不到这个动态库,如下:
如果说你拷贝了riscv64-linux-gnu-gcc
,那么这里执行应该不会报错。
riscv的编译工具链真的很操蛋!!!!!!!!!!