iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0

緩慢的進展似乎有了成效。

在修正 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 有 opensslzlib 兩者,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_COMPILECC混搭使用,還真的花了我一點時間去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一次吧,萬一這樣再爆,我就想停刊了,現在已經變成每天黑客松了(掩面)


上一篇
Alpine Linux Porting (一點六?)
下一篇
Alpine Linux Porting (一點八?)
系列文
Port Alpine Linux to open source RISC-V platform30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
高魁良
iT邦新手 1 級 ‧ 2021-09-28 21:57:22

每天黑客松 。・。 +゚。・.。 ゚ +ぉ大事に☆ヾ(´・ω・`*)ノ゚・。

我要留言

立即登入留言