在 x86-64 上 cross-build RISC-V QEMU
OS 為 Ubuntu 22.04
dpkg 加入 RISC-V 架構:
sudo dpkg --add-architecture riscv64
新增 RISC-V package sources:
sudo vim /etc/apt/sources.list新增以下 RISC-V sources:
並限制以下的 sources 為 amd64 (加上:
[arch=amd64]):
更新套件清單:
sudo apt update
安裝開發套件:
sudo apt install crossbuild-essential-riscv64sudo apt install zlib1g-dev:riscv64 libglib2.0-dev:riscv64 libpixman-1-dev:riscv64 libpcre2-dev:riscv64 libffi-dev:riscv64 libselinux1-dev:riscv64
由於 Ubuntu 沒提供
libmount.a,需手動編譯util-linux並處理crc32c符號衝突:- 下載
util-linuxsource codes:git clone [email protected]:util-linux/util-linux.git
cd util-linux./autogen.sh./configure --host=riscv64-linux-gnu --enable-static --disable-shared --disable-all-programs --enable-libmount --enable-libblkid CFLAGS="-Dcrc32c=util_linux_crc32c"make -j
- 下載
複製
libmount.a及libblkid.a至系統交叉編譯路徑:sudo cp .libs/libmount.a .libs/libblkid.a /usr/lib/riscv64-linux-gnu/
設定環境變數:
export PKG_CONFIG=pkg-configexport PKG_CONFIG_LIBDIR=/usr/lib/riscv64-linux-gnu/pkgconfig:/usr/share/pkgconfigexport PKG_CONFIG_SYSROOT_DIR=/
切到 QEMU 的資料夾並 configure QEMU (with debug info and SLiRP):
./configure --cross-prefix=riscv64-linux-gnu- --cpu=riscv64 --target-list=riscv64-softmmu --static --enable-debug --enable-slirp -Ddefault_library=staticdefault_library是 meson built-in 的參數用來控制當使用library()的時候要怎麼編譯:shared:將 library 編譯成 shared library (e.g.,.so)static:將 library 編譯成 static library (e.g.,.a)both:同時將 library 編譯成 shared 及 static libraries
-Ddefault_library=static可以指定將 subprojects 編譯成 static libraries (e.g.,libslirp.a)
編譯 QEMU:
make -j
最後 QEMU 的執行檔會在:
./build/qemu-system-riscv64