Alpine Linux Porting (一点七?)

缓慢的进展似乎有了成效。

在修正 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一次吧,万一这样再爆,我就想停刊了,现在已经变成每天黑客松了(掩面)


<<:  [DAY13] 在 Azure Machine Learning 里 Label data(中)

>>:  Anthos attach cluster

前端工程学习日记第10天

<!DOCTYPE html> <html lang="en"...

[Day01]我要成为稽核大师

「谢谢长官前辈们的照顾,我下个月转稽核罗~」 朋友表示: 长辈表示: 同事表示: 同业表示: 老公表...

Day23 - 有了 CI/CD Pipeline ,还需要合适的 Git Workflow

前言 从 Day16 - Day22 我们花了不少时间建立了 CI/CD 流水线,有了这些工具後,交...

Day-14 传值与传址

综合本系列此前的汇整,构成JavaScript资料的基本型别(primitives)是指字串、数字、...

[Day7] 词性标注(二)-方法介绍

一. 马可夫模型(Markov Model) 以下会简称为MM。MM是一种具有状态的随机过程,从目前...