0%

Gentoo 下搭建交叉编译环境——以 riscv64 为例

虽然过程很简单但还是记录一下.

安装crossdev

1
# emerge -av sys-devel/crossdev

创建 overlay

然后先来建立一个 overlay,让crossdev自动把生成的 ebuild 放在里面[1]

1
2
3
4
# mkdir -p /var/db/repos/cross-riscv64-linux-gnu/{profiles,metadata}
# echo 'cross-riscv64-linux-gnu' > /var/db/repos/cross-riscv64-linux-gnu/profiles/repo_name
# echo 'masters = gentoo' > /var/db/repos/cross-riscv64-linux-gnu/metadata/layout.conf
# chown -R portage:portage /var/db/repos/cross-riscv64-linux-gnu

这里的riscv64-linux-gnuTarget Triple,后面还会用到.

注意如果用 Git 方式同步gentoo源(或者其他Manifest文件不含 ebuild 的校验码的方式),需要在layout.conf里添加一行:

1
echo 'thin-manifests = true' >> /var/db/repos/cross-riscv64-linux-gnu/metadata/layout.conf

最后启用这个 overlay.在/etc/portage/repos.conf/crossdev.conf中写入:

1
2
3
4
5
[cross-riscv64-linux-gnu]
location = /var/db/repos/cross-riscv64-linux-gnu
priority = 10
masters = gentoo
auto-sync = no

构建工具链

执行以下命令安装工具链:

1
# crossdev --stable --ex-gdb -t riscv64-linux-gnu -oS gentoo

此处各个参数的含义如下:

  • --stable表示安装稳定 keyword 的版本,不带--stable会安装最新版(~*);
  • --ex-gdb表示除了 GCC 等基本工具外还要安装 GDB;
  • -t指定 target triple,可以用crossdev -t help列出合法的值;
  • -oS表示从哪些 overlay 里找 ebuild,这里指定gentoo是因为crossdev不知为什么默认会使用gentoo-zh里的gdb

可能会因为/etc/portage/package.mask等配置文件存在但不是目录而失败,这时只要把它们转换成目录即可(创建同名目录,把原来的配置文件变成目录下的一个普通文件).

执行完该命令后会得到/usr/riscv64-linux-gnu这个目录.

可以试着编译一个简单的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ cd /tmp
$ cat > hello.c
#include <stdio.h>

int main()
{
printf("hello, world\n");
}
$ riscv64-linux-gnu-gcc -o hello hello.c
$ file hello
hello: ELF 64-bit LSB pie executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, for GNU/Linux 4.15.0, not stripped
$ ./hello
bash: ./hello: cannot execute binary file: Exec format error

安装 QEMU

可以用 QEMU 来直接运行 riscv64 程序.首先要启用 QEMU 模拟 riscv64 架构的功能,比如在/etc/portage/package.use中添加

1
app-emulation/qemu qemu_softmmu_targets_riscv64 qemu_user_targets_riscv64

然后重新安装 QEMU:

1
# emerge -av qemu

现在可以试着运行上面编译的hello程序:

1
2
$ qemu-riscv64 -L /usr/riscv64-linux-gnu /tmp/hello
hello, world

  1. https://wiki.gentoo.org/wiki/Custom_ebuild_repository#Crossdev ↩︎