提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
背景
最近在ubuntu的虚拟机里编译RiscV的项目,需要使用RiscV的交叉编译工具,所以去网上搜索了一些具体的使用方法,编译的具体步骤是很简单的,但是由于github上的源都在国外,所以在更新submodule的时候往往会卡死,或者超时错误等等,在这里耗费了几个小时,还是更新不了submodule。所以在gitee上找了一些可替换的代码源,总体来说也还是能编译生成工具链的。
1、先下载源码
git clone https://github.com/riscv/riscv-gnu-toolchain
cd riscv-gnu-toolchain
sudo apt-get 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
先下载源码并切换到该项目的根目录下,执行install指令,安装编译环境所需要的库。
2、更新submodule
在执行配置选项前需更改submodule的源,这样不必在此等待过长的时间,由于工具编译选项中集成了自动更新submodule的指令,无需用户再执行该指令了,但是这样也引入了新的问题,当用户手动去更新submodule后,执行make指令后,会提示操作错误,文件not empty错误,所以,这个本来方便用户使用的功能,在国内这种情况下,反而造成了更大的麻烦,下着下着就超时了。f**k。
所以在执行make前要将submodule的源更新为国内的替换源,请将以下内容替换掉原来的跟目录下的“.gitmodules”文件。
[submodule "riscv-binutils"]
path = riscv-binutils
url = https://gitee.com/mirrors/riscv-binutils-gdb.git
branch = riscv-binutils-2.35
[submodule "riscv-gcc"]
path = riscv-gcc
url = https://gitee.com/mirrors/riscv-gcc.git
branch = riscv-gcc-10.2.0
[submodule "glibc"]
path = glibc
url = https://gitee.com/mirrors/riscv-glibc.git
branch = riscv-glibc-2.29
[submodule "riscv-dejagnu"]
path = riscv-dejagnu
url = https://gitee.com/mirrors/riscv-dejagnu.git
branch = master
[submodule "newlib"]
path = newlib
url = https://gitee.com/mirrors/riscv-newlib.git
branch = master
[submodule "riscv-gdb"]
path = riscv-gdb
url = https://gitee.com/mirrors/riscv-binutils-gdb.git
branch = fsf-gdb-10.1-with-sim
[submodule "qemu"]
path = qemu
url = https://git.qemu.org/git/qemu.git
[submodule "musl"]
path = musl
url = git://git.musl-libc.org/musl
branch = master
[submodule "spike"]
path = spike
url = https://github.com/riscv-software-src/riscv-isa-sim.git
branch = master
[submodule "pk"]
path = pk
url = https://github.com/riscv-software-src/riscv-pk.git
branch = master
3. 执行编译选项
./configure --prefix=${toolchain-output-path}
make
make linux
./configure 是配置toolchain的输出路径,这个可以根据自己的喜好更改路径。
make指令执行后是生成类似于riscv64-unknown-elf-gcc的bin文件,这个编译环境是裸编的,不引用linux内的库。
make linux执行后生成类似于riscv64-unknown-linux-gnu-gcc的bin文件,这个是编译linux内核用的,会调用linux内的库。
具体的使用方法,我后面会一点点更新,暂时先写个简单的流程吧。
总结
简短的做个总结,希望对一些像我这样的新手来说有帮助,不必在电脑前苦等多时,也希望感兴趣的同学一起讨论研究。