RISCV系统曾经让人神秘到无法接触,交叉编译更是只有耳闻,现在随着RISCV的普及,它们神秘的面纱已经被慢慢揭开。
交叉编译作为RISCV系统中的一个重要环节,也随着RISCV的普及而变得更加容易理解和操作。交叉编译允许开发者在一个平台上编译生成另一个平台上的可执行代码,这对于开发嵌入式系统、操作系统和固件等非常有用。随着RISCV生态系统的完善和工具链的成熟,交叉编译占开发者们日常工作的比重越来越大。
让我们通过交叉编译riscv FreeBSD系统和内核来学习和掌握这项技术吧!
下载FreeBSD源代码
首先下载源代码,可以使用git下载
先pkg安装git
pkg install git
然后git clone 下载FreeBSD源码
git clone https://git.FreeBSD.org/src.git /usr/src
如果git太慢,也可以到网站下载src源码包
比如官方:https://download.freebsd.org/snapshots/riscv/15.0-CURRENT/src.txz
国内镜像一般都没有FreeBSD15 riscv,所以要去官网下。
fetch https://download.freebsd.org/snapshots/riscv/15.0-CURRENT/src.txz
下载后解开到/usr/src目录:
tar -xzvf src.txz
执行交叉编译
FreeBSD默认使用LLVM进行交叉编译,如果没有,使用pkg install llvm14安装。
然后到/usr/src目录执行:
make TARGET_ARCH=riscv64 buildworld
make TARGET_ARCH=riscv64 buildkernel
即可。当然也可以选择
riscv64-gcc 进行交叉编译,比如先pkg install riscv64-gcc13 安装,
然后再用riscv64-gcc13来进行交叉编译:
make CROSS_TOOLCHAIN=riscv64-gcc13 TARGET_ARCH=riscv64 buildworld
make CROSS_TOOLCHAIN=riscv64-gcc13 TARGET_ARCH=riscv64 buildkernel
编译起来显示如下:
make[1]: "/home/skywalk/usr/src/Makefile.inc1" line 337: SYSTEM_COMPILER: Determined that CC=cc matches the source tree. Not bootstrapping a cross-compiler.
make[1]: "/home/skywalk/usr/src/Makefile.inc1" line 342: SYSTEM_LINKER: Determined that LD=ld matches the source tree. Not bootstrapping a cross-linker.
--------------------------------------------------------------
>>> World build started on Tue May 7 17:23:40 CST 2024
--------------------------------------------------------------
--------------------------------------------------------------
>>> Cleaning up the temporary build tree
--------------------------------------------------------------
rm -rf /usr/obj/home/skywalk/usr/src/riscv.riscv64/tmp
--------------------------------------------------------------
>>> Rebuilding the temporary build tree
--------------------------------------------------------------
cd /home/skywalk/usr/src/tools/build; make DIRPRFX=tools/build/ DESTDIR=/usr/obj/home/skywalk/usr/src/riscv.riscv64/tmp/legacy installdirs
[Creating objdir /usr/obj/home/skywalk/usr/src/riscv.riscv64/tools/build...]
mkdir -p /usr/obj/home/skywalk/usr/src/riscv.riscv64/tmp/legacy/bin /usr/obj/home/skywalk/usr/src/riscv.riscv64/tmp/legacy/lib/geom /usr/obj/home/skywalk/usr/src/riscv.riscv64/tmp/legacy/usr/include/casper /
这里显示“Not bootstrapping a cross-compiler.” 不明白为什么不bootstrapping 交叉编译器....
当然,对于大多数人,如果不进行交叉编译(在AMD64编译RISCV),直接在AMD64平台编译AMD64的FreeBSD world和kernel,直接使用
make buildworld
make buildkernel
即可编译出当前系统的FreeBSD系统来。