# README_LGPL_RELINK — 如何替换 libmobi 并重新链接阅读器(LGPL-3.0 relink) `os.meow.reader` 静态链接 **libmobi**(LGPL-3.0)。LGPL-3.0 §4(d) 要求以「允许用户在替换 libmobi 后重链」的方式提供源码(§4(d)(0))。本文件给出完整重链步骤:获取工具链 → 替换 libmobi 源码 → 重链 → 装回设备。**本操作可自行修改 libmobi 并重编,不触犯任何许可证限制;修改 libmobi 部分的衍生成果仍受 LGPL-3.0 约束(但不会被强制整体 GPL)。** ## 0) 相关文件与源码位置 | 内容 | 位置 | |---|---| | 阅读器自有源码 | 主仓:`https://git.yeij.top/AskaEth/MeowOS-For-R3P2.git`(`patch_v2/reader_app/`,Apache-2.0) | | libmobi 源码(锁定 commit) | `https://github.com/bfabiszewski/libmobi`,commit `906274205c11944b628da1c553b255acb1af7c55`(2024-10-29);`build_reader.sh` 的 `LM_URL` 即指向该 SHA | | 重链构建脚本 | `patch_v2/reader_app/build_reader.sh`(可复现构建 + qemu-mipsel 冒烟) | | 合规材料(随 .mpk 分发) | `patch_v2/reader_app/resources/licenses/`(`NOTICE` + `GPL-3.0.txt` + `LGPL-3.0.txt`) | > 主仓公开性:`git ls-remote https://git.yeij.top/AskaEth/MeowOS-For-R3P2.git` 可匿名读到 HEAD,即公开可克隆(见 NOTICE「Source availability」)。若看不到,说明镜像/网络受限,请从维护者获取。 ## 1) 获取 mipsel 交叉工具链(两种方式) 阅读器是 **mipsel / musl 静态软浮点 (sf)** 目标。构建用的是本地 `.tools/`(gitignored,不入仓),接收者需自行准备等价工具链: - **方式 A(推荐,zig 单文件)**:下载 zig(`zig cc` 支持 `-target mipsel-linux-musl`,静态软浮点)。本项目用 `zig-mipsel-cc` 封装,等价于: ```sh # 示例:zig-0.12+;把 zig 解压后设 ZIG 路径 # zig cc -target mipsel-linux-musl -static ... ``` - **方式 B(musl 交叉编译套件)**:安装 `mipsel-linux-muslsf-cross`(如 musl.cc 发布的 `mipsel-linux-muslsf-cross`),得到: ``` $ROOT/.tools/mipsel-linux-muslsf-cross/mipsel-linux-muslsf # sysroot/lib等 ``` `$ROOT = $HOME/Project/R3ProII`(build_reader.sh 内 `ROOT` 变量,可改)。 若本地已有 `.tools/`,重链无需再装。 ## 2) 替换 libmobi 源码 ```sh cd "$HOME/Project/R3ProII/patch_v2/reader_app" # 拉取你想要的 libmobi(或用 build_reader.sh 自动拉锁定 commit) # 用锁定 commit 拉取: curl -fsSL -o /tmp/lm.tgz \ "https://codeload.github.com/bfabiszewski/libmobi/tar.gz/906274205c11944b628da1c553b255acb1af7c55" rm -rf vendor/libmobi && mkdir -p /tmp/lm_m && tar xzf /tmp/lm.tgz -C /tmp/lm_m --strip-components=1 mkdir -p vendor/libmobi && cp -r /tmp/lm_m/src vendor/libmobi/src && cp /tmp/lm_m/COPYING vendor/libmobi/COPYING # 然后在此处对 vendor/libmobi/src/*.c 做你的修改 ``` ## 3) 强制重编 libmobi 目标文件 + 重链 `build_reader.sh` 对 `vendor/libmobi/src/*.c` 有「已存在 .o 跳过」缓存(`vendor/build/lm_*.o`),替换源码后**必须清掉**旧目标文件再重跑,否则不会重编 libmobi: ```sh rm -f vendor/build/lm_*.o ./build_reader.sh # 全量:编 libmobi/miniz/stb/freetype + 链接 reader + qemu-mipsel 冒烟 ``` - 产物:`./reader`(mipsel 静态 ELF)。 - 需要 `qemu-mipsel`(跑冒烟单测);宿主 core/loader 单测用 `gcc`。 - 若只想重链不跑测试,可手动执行 `build_reader.sh` 第 7 步的链接命令(见脚本注释),但建议跑全套以保正确。 ## 4) 装回设备(两种方式) - **方式 A(宽松,最直接;启动路径不验签)**:launcher 重扫 `MeowAPPs/` 后直接运行二进制,故把重链后的 `reader` 直接放到应用目录即可,**不触发安装期签名门**: ```sh scp ./reader root@<设备IP>:/usr/data/mnt/sd_0/MeowAPPs/os.meow.reader/reader ssh root@<设备IP> 'chmod 755 /usr/data/mnt/sd_0/MeowAPPs/os.meow.reader/reader' # 若在跑,重开阅读器;MeowAPPs 热更即生效 ``` - **方式 B(走官方 .mpk + 签名 + nyai 安装)**:`os.meow.*` 包无签会被 `nyai`/launcher 拒装,故需用 `.keys/signing.key` 签名(仅维护者持有私钥)。接收者的本地重链一般走方式 A。 ```sh ./pack_reader_mpk.sh # 产 os.meow.reader.mpk(含 resources/licenses/) ../meow_sign/meow_sign sign os.meow.reader.mpk "$HOME/Project/R3ProII/.keys/signing.key" scp os.meow.reader.mpk root@<设备IP>:/data/ ssh root@<设备IP> 'nyai install /data/os.meow.reader.mpk' ``` ## 5) 修改自由度说明(LGPL 敏感点) - 安装期签名校验只针对**未签名/无有效签**的 `.mpk` 安装;**启动路径**是 launcher 直接运行 `MeowAPPs//` 下的二进制(`README.md:259` 热更语义),对重链后的二进制**不做运行时验签**,改造自由度未被结构性封死。 - 重链产物请**保留 `resources/licenses/` 随包**(含 GPL-3.0 + LGPL-3.0 全文 + NOTICE),并保留 libmobi 版权声明。 - 你对 libmobi 的修改形成衍生作品:其自身仍按 LGPL-3.0 提供;把修改后的 libmobi 重新分发时应随附相应源码(按 LGPL §4 履行,本仓库的重链脚本 + 锁定的 `LM_URL` 即可复现)。 ## 6) 校验 - `file ./reader` 应显示 `ELF 32-bit LSB executable, MIPS, ... statically linked, ... soft-float`。 - `tar tzvf os.meow.reader.mpk` 应含 `resources/licenses/{NOTICE,GPL-3.0.txt,LGPL-3.0.txt}`。 - 真机打开一本 MOBI 确认可读。