緩慢的進展似乎有了成效。
在修正 musl port的 arch/riscv32/bits/syscall.h.in
中,mmap2
後,我決定花一些時間去確認一下RISC-V 32在 glibc 跟 kernel header中,mman.h
的各式property,包含可能有的平台特殊屬性,但初步看起,僅有RISC-V 64 會有 MAP_32BIT
這個歷史上為了相容32bit的特殊 property外,其他應該32/64之間沒有差異才對。
然而因為我仍未知曉這個修正是不是對的,我決定依舊單獨使用musl
自帶的musl-gcc
wrapper、配合原本riscv-gnu-toolchain
的半套musl cross toolchain混搭使用,而非bootstrap整套toolchain、跟Alpine world,這邊有兩個musl configure時的小選項可以用,分別是 --exec-prefix
跟 --enable-gcc-wrapper
,這樣他在make install時,會正確地透過 tools/musl-gcc.specs.sh
自動把 gcc spec file跟 wrapper 包好。
另外一個考量點是,我發現一般簡單寫的小library,即便有BSS的使用也沒有觸發之前撞到的問題;懷疑是OpenSSL libcrypto本身的特殊狀況;再三考慮後,決定還是在host上cross build一份原本跑在guest裡會壞掉的 apk
。
而apk
它的 dependecy 有 openssl
跟 zlib
兩者,zlib相對來說比較好徒手 cross-build,那就先從他開始吧:
$ mkdir sysroot_tmp
$ git clone https://github.com/madler/zlib
$ pushd zlib
$ CC=musl-gcc CROSS_COMPILE=riscv32-unknown-linux-musl-as ./configure --prefix=/path/to/sysroot_tmp
$ make install
$ popd
事實證明還蠻順利的,但是後面OpenSSL要用這混搭的方式去cross-build,因為OpenSSL會抱怨不可以CROSS_COMPILE
跟CC
混搭使用,還真的花了我一點時間去trial-and-error出一套他吃得進去也可以用的方式:
$ git clone https://github.com/openssl/openssl
$ pushd openssl
$ perl ./Configure linux-generic32 --prefix=/path/to/sysroot_tmp \
--libdir=lib --openssldir=/path/to/sysroot_tmp/etc/ssl \
CC=musl-gcc LD=riscv32-unknown-linux-musl-ld AR=riscv32-unknown-linux-musl-ar \
shared no-async no-comp no-idea no-mdc2 no-rc5 no-ec2m no-sm2 no-sm4 no-ssl3 \
no-seed no-weak-ssl-ciphers no-threads \
CFLAGS=' -I/path/to/riscv-gnu-toolchain/usr/include ' LDFLAGS=' -Wa,--noexecstack'
$ make install
快速檢驗一下這套openssl的狀態:
$ echo foobar | qemu-riscv32 -L /path/to/sysroot_tmp openssl dgst -md5
(stdin)= 14758f1afd44c09b7992073ccf00b43d
看起來是好兆頭啊,來拉看看Alpine的apk-tool
:
$ git clone https://github.com/alpinelinux/apk-tools
$ pushd apk-tools
$ CROSS_COMPILE=riscv32-unknown-linux-musl- \
CFLAGS=" -I/path/to/riscv-gnu-headers/usr/include -I/path/to/sysroot_tmp/include " \
LDFLAGS=" -L/path/to/sysroot_tmp/lib " make LUA=no
東西出來了,立刻跑一下:
LD_LIBRARY_PATH=$PWD qemu-riscv32 -L /path/to/sysroot_tmp ./apk --version
apk-tools 2.12.0-127-g9f07a34, compiled for riscv32.
下一篇就這試試看扔進Alpine的aports中重新bootstrap一次吧,萬一這樣再爆,我就想停刊了,現在已經變成每天黑客松了(掩面)