# BUILD — воспроизводимая пересборка Всё ниже собирается из публичных исходников + файлов этого репозитория. Готовые бинарники в репозиторий не кладутся; для сверки даны sha256 наших сборок. Где точная команда в проекте не записывалась — это помечено **(не записано)**: функционально эквивалентный результат получится, побайтовое совпадение не гарантируется. ## 1. lk2nd / lk1st (lk2nd 23.1) - Источник: https://github.com/msm8916-mainline/lk2nd.git, tag **23.1**, commit `e9c8b21735c13dd7ace808b1e35451638f0a0c6d`. - Toolchain: `arm-none-eabi-gcc 14.2.1 20241119` (Debian 15:14.2.rel1-1), GNU Make 4.4.1, DTC 1.7.2. - **lk2nd для `recovery`** (fastboot, для RAM boot): см. `lk2nd-build/BUILD.md` ``` make -j$(nproc) TOOLCHAIN_PREFIX=arm-none-eabi- LK2ND_DTBS="msm8916-512mb-mtp.dtb" LK2ND_FORCE_FASTBOOT=1 lk2nd-msm8916 ``` `LK2ND_DTBS` — относительно `lk2nd/device/dts/msm8916` (префикс `msm8916/` молча даёт образ без QCDT). Наш `out/lk2nd.img` sha256 `555826ea…d782`; с нулями до 16 MiB → `0dfa60a0…11e1`. - **lk1st для `aboot`** (текущий, autoboot = без `LK2ND_FORCE_FASTBOOT`): ``` make -j$(nproc) TOOLCHAIN_PREFIX=arm-none-eabi- LK2ND_BUNDLE_DTB=msm8916-512mb-mtp.dtb lk1st-msm8916 # подписать выход сборки lk1st тестовым ключом: qtestsign (github.com/msm8916-mainline/qtestsign, commit 0eef3b5), режим `-v 3 aboot` # (точный путь входного .mbn в проекте не записан — это emmc_appsboot.mbn из каталога сборки lk1st-msm8916) # затем дополнить нулями до размера раздела aboot (1 MiB) ``` Разница с forced-fastboot вариантом — одна строка config.h (`b5a/config.diff`). Воспроизводимость проверена: FORCE-сборка дала бит-в-бит прошитый ранее образ (`e4addbf8`). Наши autoboot: unsigned `33c452e4`, signed `7b3fb5b3`, pad1M `3b8cd266` (`b5a/SHA256SUMS`, лог `b5a/build-autoboot.log`). ## 2. Ядро Linux 7.2.7 arm64 - Источник: Linux stable **v7.2.7**, commit `f42acb3678424d1e08f6ed27c0d8ba8a125e14d6` (git.kernel.org stable). - Патч: `linux/patches/rpmsg_wwan_ctrl-port-race.patch` (присвоение `wwan_port` до `rpmsg_create_ept`; без него — NULL deref в `wwan_port_rx` при раннем открытии порта). - Toolchain: `aarch64-linux-gnu-gcc (Debian 14.2.0-19) 14.2.0`. Собирать на локальном диске (virtiofs даёт clock skew). - Config: полный итоговый `.config` каждой стадии — `linux/artifacts//kernel.config` (надёжный якорь); история: `defconfig` + `linux/aurora-ramboot1-v2.config`, затем по очереди фрагменты `aurora-usb1/emmc1/modem1/qmi1/bam1.config` (`scripts/kconfig/merge_config.sh` поверх предыдущего `.config`; дельты — `linux/ramboot-*.config.diff`). MODULES=n. ``` git -C linux-stable checkout f42acb3678424d1e08f6ed27c0d8ba8a125e14d6 patch -p1 < linux/patches/rpmsg_wwan_ctrl-port-race.patch mkdir out && cp linux/artifacts/ramboot-mm1/kernel.config out/.config make O=out ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig make O=out ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image.gz ``` Ограничение lk2nd: `image_size` < 30 MiB (DTB кладётся на 0x81E00000). Наш mm1/bam1: `Image.gz` `9c20a372…`, image_size 0x1680000. ## 3. DTB `linux/dts/msm8916-jz08-aurora-*.dts` — наши DTS поверх upstream `msm8916.dtsi`/`msm8916-pm8916.dtsi` из того же дерева 7.2.7. Сборка вне дерева: `linux/build-dtb.sh ` (cpp + dtc, `src` = дерево ядра). Golden mm1 использует `msm8916-jz08-aurora-bam1.dtb` (`a10056c5…`). Отличия стадий — `linux/ramboot-*.dts.diff`. ## 4. initramfs - `busybox`: Debian trixie `busybox-static 1:1.37.0-6+b9 arm64` (deb sha256 `c833be48…`). - Пакеты Alpine **v3.24 aarch64**: точные версии и sha256 — `linux/initramfs-*/dl/APK-SHA256SUMS` (mm1: 36 пакетов: rmtfs 1.3, qrtr, libqmi/qmi-utils 1.38.0_git20260414, ModemManager 1.25.95_git20260527, dbus, polkit, eudev, **modemmanager-udev** обязателен). Замыкание зависимостей — `linux/*-apk-closure*.txt`. - `linebuf.so` (построчная буферизация stdout для логов rmtfs): `linux/initramfs-qmi1/src/linebuf.c`. - Наши файлы: `init`, `root/bin/*` (modem-up, mm-up, nv-check, qmi-b3, …), `root/etc/passwd|group`. - Сборка: распаковать `.apk` (tar.gz) в `root/`, положить busybox и наши файлы, затем `gen_init_cpio linux/initramfs-mm1/initramfs.list | gzip -9 -n > initramfs.cpio.gz` **(точные флаги сжатия не записаны)**. `initramfs.list` перечисляет ровно то, что попадает в образ. Наш mm1: `250bf8ee…` (11 944 942 B). - Принцип init: **первым делом** `blockdev --setro` на все mmcblk* (проверка getro=1), modem FAT монтируется только `ro`, `firmware_class.path=/firmware/image`; никаких mount/fsck/mkfs/trim на eMMC. ## 5. Android boot image (для `fastboot boot` и раздела boot) Формат v0, page 2048, kernel = `Image.gz` + appended DTB (`cat Image.gz > Image.gz-dtb`), ramdisk = `initramfs.cpio.gz`, cmdline `earlycon console=ttyMSM0,115200n8 ignore_loglevel loglevel=8 rdinit=/init` (`linux/artifacts/*/cmdline.txt`). Инструмент сборки **(не записано; любой mkbootimg v0)**. Проверка/распаковка: `tools/bootimg.py`. Наши: golden `aurora-mm1.img` `38c960ef…`, rescue `aurora-emmc1.img` `93f61ce7…` (в `boot` — он же + нули до 16 MiB = `e9579f33…`). ## 6. Образ cache (ext2 + extlinux) — детерминированный `b5b/mkfs-candidate.sh` (mke2fs 1.47.2, фиксированные UUID/hash_seed/время) из `b5b/components/` (`Image.gz-dtb`, `aurora-mm1.dtb`, `initramfs.cpio.gz`, `cmdline.txt`) → `cache-extlinux-mm1.img` **`409bbb11…`**, ровно 134 217 728 B. Ограничения ext2-драйвера lk2nd (rev ≤ 1, без extents/64bit/flex_bg, FDT обязателен, LF + завершающий `\n`) — NOTES сессия 26. Перед записью прогоните эмулятор сканирования lk2nd: `b5b/emu/` (реальный код lk2nd 23.1 + шимы, список исходников `srclist`). ## 7. Бинарники bootchain, которые не собираются здесь DB410c TZ и qhypstub — см. [BLOBS.md](BLOBS.md). qhypstub — open source (github.com/msm8916-mainline/qhypstub), можно собрать самому; наш бинарник взят из того же набора, что на JZ02, его точная upstream-ревизия не установлена — сверяйте sha256.