Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

ac-os: standardize on gcc, add boot validation, parallel binary build

- Remove musl-gcc detection — always use gcc for glibc compatibility
- Add initramfs validation before kernel build: checks /init, ac-native,
dynamic linker, all NEEDED shared libs, piece.mjs, WiFi firmware
- Aborts build if validation fails (prevents flashing unbootable kernels)
- Add binary shared lib resolution check after compile

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+77 -12
+77 -12
fedac/native/ac-os
··· 36 36 build_binary() { 37 37 log "Building binary..." 38 38 cd "${SCRIPT_DIR}" 39 - CC_USE="${CC:-}" 40 - if [ -z "${CC_USE}" ]; then 41 - # Only use musl-gcc if shared libs are also musl-linked (Fedora). 42 - # On Ubuntu/Debian, shared libs are glibc — mixing musl binary + glibc libs crashes. 43 - if command -v musl-gcc &>/dev/null \ 44 - && echo '#include <linux/input.h>' | musl-gcc -E -x c - &>/dev/null 2>&1 \ 45 - && ! ldd /usr/lib/*/libasound.so.2 2>/dev/null | grep -q 'libc.so.6'; then 46 - CC_USE=musl-gcc 47 - else 48 - CC_USE=gcc 49 - fi 50 - fi 39 + CC_USE="${CC:-gcc}" 51 40 # Run make and capture exit code — version strings frozen at top of script 52 41 mkdir -p "${BUILD_DIR}" 53 42 local MAKE_LOG="${BUILD_DIR}/.make.log" ··· 66 55 err "Binary does NOT contain git hash ${AC_GIT_HASH} — stale build!" 67 56 exit 1 68 57 fi 58 + 59 + # Telemetry: check binary can resolve all shared libs 60 + local INTERP=$(readelf -l "${BUILD_DIR}/ac-native" 2>/dev/null | grep -oP '(?<=interpreter: ).*(?=\])') 61 + log "Binary interpreter: ${INTERP:-static}" 62 + local MISSING_LIBS="" 63 + for lib in $(readelf -d "${BUILD_DIR}/ac-native" 2>/dev/null | grep -oP '(?<=\[)lib[^\]]+'); do 64 + if ! ldconfig -p 2>/dev/null | grep -q "$lib"; then 65 + MISSING_LIBS="${MISSING_LIBS} ${lib}" 66 + fi 67 + done 68 + if [ -n "${MISSING_LIBS}" ]; then 69 + err "Binary has missing shared libs:${MISSING_LIBS}" 70 + exit 1 71 + fi 72 + log "Binary shared libs: all resolved" 69 73 70 74 # Build BPF trace tools (ftrace fallback — no clang/libbpf required) 71 75 if [ -f "${SCRIPT_DIR}/bpf/Makefile" ]; then ··· 374 378 375 379 # Fix ownership so non-root users (oven) can rebuild next time 376 380 sudo chown -R "$(whoami)" "${INITRAMFS_ROOT}" "${BUILD_DIR}/initramfs.cpio" "${BUILD_DIR}/initramfs.cpio.lz4" 2>/dev/null || true 381 + 382 + # === Validate initramfs will boot === 383 + log "Validating initramfs..." 384 + local BOOT_OK=1 385 + 386 + # 1. init script exists and is executable 387 + if [ ! -x "${INITRAMFS_ROOT}/init" ]; then 388 + err "VALIDATE: /init missing or not executable" 389 + BOOT_OK=0 390 + fi 391 + 392 + # 2. ac-native binary exists 393 + if [ ! -f "${INITRAMFS_ROOT}/ac-native" ]; then 394 + err "VALIDATE: /ac-native missing" 395 + BOOT_OK=0 396 + fi 397 + 398 + # 3. Dynamic linker matches binary's interpreter 399 + local INTERP=$(readelf -l "${INITRAMFS_ROOT}/ac-native" 2>/dev/null | grep -oP '(?<=interpreter: ).*(?=\])') 400 + if [ -n "${INTERP}" ] && [ ! -f "${INITRAMFS_ROOT}${INTERP}" ]; then 401 + err "VALIDATE: binary needs ${INTERP} but it's missing from initramfs" 402 + BOOT_OK=0 403 + else 404 + log " linker: ${INTERP} OK" 405 + fi 406 + 407 + # 4. All NEEDED shared libs exist in initramfs 408 + local MISSING="" 409 + for lib in $(readelf -d "${INITRAMFS_ROOT}/ac-native" 2>/dev/null | grep -oP '(?<=\[)lib[^\]]+'); do 410 + if [ ! -f "${INITRAMFS_ROOT}/lib/${lib}" ] && [ ! -f "${INITRAMFS_ROOT}/lib64/${lib}" ]; then 411 + MISSING="${MISSING} ${lib}" 412 + fi 413 + done 414 + if [ -n "${MISSING}" ]; then 415 + err "VALIDATE: missing shared libs in initramfs:${MISSING}" 416 + BOOT_OK=0 417 + else 418 + log " shared libs: all present" 419 + fi 420 + 421 + # 5. piece.mjs exists 422 + if [ ! -f "${INITRAMFS_ROOT}/piece.mjs" ]; then 423 + err "VALIDATE: /piece.mjs missing" 424 + BOOT_OK=0 425 + fi 426 + 427 + # 6. WiFi firmware exists (non-fatal warning) 428 + if ! ls "${INITRAMFS_ROOT}/lib/firmware/iwlwifi"*.ucode &>/dev/null; then 429 + log " WARNING: no iwlwifi firmware — WiFi will not work" 430 + else 431 + log " firmware: $(ls ${INITRAMFS_ROOT}/lib/firmware/iwlwifi*.ucode | wc -l) iwlwifi blobs" 432 + fi 433 + 434 + local INITRAMFS_SIZE=$(du -sh "${BUILD_DIR}/initramfs.cpio.lz4" | cut -f1) 435 + log " initramfs size: ${INITRAMFS_SIZE}" 436 + 437 + if [ "${BOOT_OK}" -eq 0 ]; then 438 + err "Initramfs validation FAILED — kernel would panic. Aborting." 439 + exit 1 440 + fi 441 + log "Initramfs validated — will boot" 377 442 } 378 443 379 444 build_kernel() {