RISC-V GNU编译环境搭建与运行实践

本文介绍了如何搭建RISC-V的GNU编译环境,包括riscv-gnu-toolchain的下载与编译,以及RISC-V运行环境的设置,如Spike+PK和qemu的使用。重点讲解了交叉编译工具链的组件和区别,以及如何在X86主机上运行RISC-V的二进制文件。

riscv-gnu-toolchain交叉编译工具链

riscv-gnu-toolchain是riscv的gcc交叉编译工具链
github地址为:https://github.com/riscv/riscv-gnu-toolchain
gcc交叉编译工具链环境分为下载和编译两步,但是由于外网的原因,许多人在第一步中就被劝退,体验不是很好。下面分两步来介绍:

riscv-gnu-toolchain下载

riscv-gnu-toolchain工具链由以下几个子模块组成:
这些子模块包括:

其中的 riscv-qemu 属于运行的环境,不算是工具链的组成部分,可以先不管。
如果有不错的外网环境的话,可以直接下载:

git clone  git@github.com:riscv/riscv-gnu-toolchain.git
cd riscv-gnu-toolchain
# 下载子模块
git submodule update --init --recursive

但我觉得就算是外网环境,下的也挺慢的。工具链的下载问题可以通过国内的码云(Gitee)镜像来解决,细节可以参考我的另一篇博客:利用码云镜像快速拉取riscv-gnu-toolchain工具链

riscv-gnu-toolchain编译

先下载一下依赖库:

sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev

再设置环境变量路径
比如在/etc/profile文件里,增加

export RISCV=".your.path./riscv-gnu-toolchain"
export PATH=$PATH:$RISCV/bin

使环境变量生效:
(注意使用此方法环境变量的生效期只为当前终端,关闭当前终端或另开一个终端都需要重新source一遍。但是机器重启后该环境变量则不需要每次使其设定生效。)

source /etc/profile

最后编译riscv-gnu-toolchain
riscv-gnu-toolchain 工具链分elf-gcc,linux-gnu-gcc两个版本,以及他们对应的32位和64位版本。两个的主要区别在于:

  • riscv32-unknown-elf-gcc,riscv64-unknown-elf-gcc:使用的riscv-newlib库(面向嵌入式的C库),而且只支持静态链接,不支持动态链接。
  • riscv32-unknown-linux-gnu-gcc,riscv64-unknown-linux-gnu-gcc:使用的是glibc标准库,支持动态链接。

个人认为从名字上便可以区分两者的使用场景,如果是编译简单,较小的elf程序,使用elf-gcc版本即可,如果编译比较大的程序或者需要动态库(比如编译linux,或opencv库等),推荐使用linux-gnu-gcc版本。

# 需要进入root权限:
sudo su

# 最后在source一下,使$RISCV环境变量生效
source /etc/profile

# 创建一个build文件夹安装,更干净一些
mkdir build
cd build

# 默认生成64位的编译工具:riscv64-unknown-elf-***
../configure --prefix=$RISCV
make -j4
# 安装至设定的$RISCV路径
make install 

# 生成32位的编译工具:riscv32-unknown-elf-***
../configure --prefix=$RISCV --with-arch=rv32gc --with-abi=ilp32d
make -j4
make install

# 编译linux-gnu-gcc版本(默认64位):riscv64-unknown-linux-gnu-***
../configure --prefix=$RISCV
make linux -j4
make install

编译成功后可以使用对应的gcc工具验证

riscv64-unknown-elf-gcc helloworld.c -o helloworld

如果你成功编译安装,但是系统提示找不到riscv64-unknown-elf-gcc,可能是因为重新开了新的终端。可以使用前source一下环境变量,使得$RISCV环境变量生效。或者重启之后,一劳永逸。

source /etc/profile
riscv64-unknown-elf-gcc helloworld.c -o helloworld

但是生成的二进制文件不能直接运行,因为主机架构是X86。
在这里插入图片描述

RISC-V运行环境

得到了RISC-V的二进制elf文件后,需要依赖指令模拟器才能在X86架构的主机上运行RISC-V的elf文件,比如Spike, qemu, gem5等。下面介绍两种常用的运行环境(Spike+PK 和 qemu),可自行选择。

Spike + PK

Spike github地址:https://github.com/riscv/riscv-isa-sim
PK github地址:https://github.com/riscv/riscv-pk
Spike是专门的RISC-V指令模拟器,支持RISC-V各种模块的指令(如A,F,D,V等),而且也有debug模式。
RISC-V Proxy Kernel(riscv-pk)是RISC-V的一个轻量级应用程序执行环境,可以托管静态链接的RISC-V ELF二进制文件。
可以把spike理解为模拟硬件,pk理解为操作系统,两个配合来加载运行RISC-V ELF二进制文件。

下载与编译:
spike

apt-get install device-tree-compiler
git clone git@github.com:riscv/riscv-isa-sim.git
cd riscv-isa-sim
mkdir build
cd build
../configure --prefix=$RISCV
make
[sudo] make install

pk

git clone git@github.com:riscv/riscv-pk.git
cd riscv-pk
mkdir build
cd build
../configure --prefix=$RISCV --host=riscv64-unknown-elf
make
make install

测试:

spike pk helloworld

在这里插入图片描述
需要注意的是,PK是不能够加载动态链接的RISCV ELF文件的(正好对应elf-gcc版本只支持静态链接编译)。而linux-gnu-gcc版本的riscv工具链默认是动态链接,直接使用spike + pk无法正常执行。
在这里插入图片描述
调整方式只需要手动指定静态链接即可(加上-static参数):
在这里插入图片描述

qemu

qemu是一个通用的、开源的机器仿真器和虚拟机。qemu支持各种架构的指令模拟,如arm,aarch64,以及RISC-V。具体的架构选择需要在编译的时候通过config文件指定。
qemu官网:https://www.qemu.org
下载与编译:

git clone https://git.qemu.org/git/qemu.git
cd qemu
git submodule init
git submodule update --recursive

或者直接下载zip包

wget https://download.qemu.org/qemu-5.2.0.tar.xz
tar xvJf qemu-5.2.0.tar.xz

riscv的qemu有两种:

  • riscv-64-linux-user为用户模式,可以运行基于riscv指令集编译的程序文件(target-list=riscv64-linux-user)
  • riscv64-softmmu为镜像模拟器,可以运行基于riscv指令集编译的linux镜像(target-list=riscv64-softmmu)

这里运行简单ELF程序我们直接用用户模式:

cd qemu
./configure --target-list=riscv64-linux-user
make -j4

测试:

./riscv64-linux-user/qemu-riscv64 helloworld

在这里插入图片描述
与Spike+PK只支持静态链接程序不同,qemu-riscv是支持静态链接和动态链接的程序的。
在这里插入图片描述

<think>我们被要求使用中文回答,并且按照给定的格式要求处理数学表达式。同时,需要生成相关问题。 用户的问题:如何在Linux系统上配置RISC-V交叉编译环境?具体来说,是如何搭建RISC-V交叉编译工具链。 根据提供的引用,我们可以总结出以下步骤: 引用[1]提到RISC-V GNU编译工具链是一个开源项目,支持两种构建模式:ELF/Newlib工具链和Linux-ELF/glibc工具链。 引用[2]和引用[3]都提到了在Linux(优麒麟或Ubuntu)上搭建交叉编译环境的方法,其中引用[3]给出了具体的路径设置步骤。 因此,我们可以整理出一个通用的步骤: 1. 安装必要的依赖包 2. 获取RISC-V GNU工具链的源代码 3. 构建工具链(选择一种构建模式) 4. 设置环境变量 具体步骤: 步骤1: 安装依赖 在Ubuntu或优麒麟上,打开终端,执行以下命令安装依赖: ```bash sudo apt update sudo apt install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ``` 步骤2: 克隆RISC-V GNU工具链仓库 注意:这个仓库包含多个子模块,所以需要使用`--recursive`选项。 ```bash git clone --recursive https://github.com/riscv/riscv-gnu-toolchain ``` 步骤3: 构建工具链 进入工具链目录,然后选择一种构建模式进行构建。 模式1:构建通用的ELF/Newlib工具链(不依赖操作系统,适用于裸机程序) ```bash cd riscv-gnu-toolchain ./configure --prefix=/opt/riscv make ``` 这里`--prefix`指定了安装目录,你可以根据需要修改。 模式2:构建Linux-ELF/glibc工具链(适用于运行在Linux操作系统上的程序) ```bash cd riscv-gnu-toolchain ./configure --prefix=/opt/riscv make linux ``` 步骤4: 设置环境变量 将工具链的路径添加到环境变量中,以便在终端中使用。 编辑`~/.bashrc`文件,在末尾添加: ```bash export PATH=$PATH:/opt/riscv/bin ``` 然后执行: ```bash source ~/.bashrc ``` 验证安装: 安装完成后,可以通过以下命令检查是否安装成功: ```bash riscv64-unknown-elf-gcc --version ``` 或者对于glibc版本: ```bash riscv64-unknown-linux-gnu-gcc --version ``` 注意:构建过程可能需要较长时间(取决于你的机器性能)。 另外,引用[3]中提到了设置RISCV环境变量,但根据工具链的构建,通常只需要将bin目录加入PATH即可。但是,如果你需要用到其他RISC-V相关的工具(比如QEMU),可能还需要设置RISCV变量指向你的工具链安装目录。例如: ```bash export RISCV=/opt/riscv ``` 因此,你可以在`~/.bashrc`中同时添加: ```bash export RISCV=/opt/riscv export PATH=$PATH:$RISCV/bin ``` 这样设置后,重新加载.bashrc。 以上步骤基于引用[1][2][3]的综合。 生成相关问题: 根据用户的问题,我们生成以下相关问题: 1. 如何验证RISC-V交叉编译工具链是否安装成功? 2. 使用RISC-V交叉编译工具链编译一个简单的C程序并运行的方法是什么? 3. 如何为RISC-V交叉编译工具链添加多目标支持(例如同时支持32位和64位)? 4. 在构建RISC-V工具链时遇到依赖问题如何解决? 5. 如何更新已安装的RISC-V交叉编译工具链? 注意:用户的问题是关于搭建工具链,所以相关问题围绕安装、验证、使用和更新等。 回答结构: 我们将按照步骤清晰地回答,并确保每一步都有明确的命令。</think>### 如何在Linux搭建RISC-V交叉编译工具链 以下是配置RISC-V交叉编译环境的详细步骤(基于Ubuntu/优麒麟系统): #### 1. **安装依赖项** ```bash sudo apt update sudo apt install autoconf automake autotools-dev curl python3 libmpc-dev \ libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf \ libtool patchutils bc zlib1g-dev libexpat-dev ninja-build git cmake ``` #### 2. **获取工具链源码** ```bash git clone --depth 1 --recursive https://github.com/riscv/riscv-gnu-toolchain cd riscv-gnu-toolchain ``` #### 3. **配置构建选项** 选择编译模式: - **裸机环境**(Newlib): ```bash ./configure --prefix=/opt/riscv ``` - **Linux环境**(glibc): ```bash ./configure --prefix=/opt/riscv --enable-multilib ``` #### 4. **编译工具链** ```bash make -j$(nproc) ``` > 注:`-j$(nproc)` 表示使用所有CPU核心加速编译,过程约需1-2小时[^1][^3] #### 5. **配置环境变量** ```bash echo 'export PATH="$PATH:/opt/riscv/bin"' >> ~/.bashrc source ~/.bashrc ``` 验证安装: ```bash riscv64-unknown-elf-gcc --version ``` #### 6. **测试交叉编译** 创建测试文件 `hello.c`: ```c #include <stdio.h> int main() { printf("Hello RISC-V!\n"); return 0; } ``` 编译命令: ```bash riscv64-unknown-elf-gcc hello.c -o hello.elf ``` #### 常见问题解决 - **依赖缺失**:根据错误提示安装缺失的包,如 `libssl-dev` - **权限问题**:使用 `sudo make install` 若安装到系统目录 - **多架构支持**:添加 `--enable-multilib` 支持RV32/RV64[^1] --- ### 验证工具链 通过QEMU运行编译后的程序: ```bash # 安装QEMU模拟器 sudo apt install qemu-user-static # 运行RISC-V程序 qemu-riscv64 hello.elf ``` 输出 `Hello RISC-V!` 即表示成功[^2][^3] ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值