tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1353Shell 122Rust 77Markdown 692253 Definiciones

⎇ 84e3737e10e17927380ed3e232e50cebfdd39123 recipes/atuq/bin/atuq 44 líneas · 2.9 KB Historia crudo

atuq: AV1 no reproducía, y la causa era UN elemento de LD_LIBRARY_PATH a44fc4f06 · Sergio ·

1#!/bin/sh
2# Lanzador de atuq. Va a /usr/bin/atuq.
3#
4# ── POR QUÉ NO ES UN SYMLINK (que es lo que era en la v0.1) ────────────────────────────────────
5# El motor carga sus propias librerías —libnspr4, libnss3, libmozsandbox…— desde `/usr/lib/atuq`, y
6# ni el binario ni esas `.so` traen `RPATH`/`RUNPATH`: se comprobó con `readelf -d` y no hay
7# ninguno. Con el symlink, el navegador moría antes de pintar nada:
8#
9#     XPCOMGlueLoad error for file /usr/lib/atuq/libmozsandbox.so:
10#     Error loading shared library libnspr4.so: No such file or directory
11#
12# El `LD_LIBRARY_PATH` es además lo que necesitan los procesos HIJOS: Firefox lanza un proceso por
13# pestaña y todos cargan las mismas librerías, así que tiene que heredarse.
14#
15# La alternativa más limpia sería grabar `RPATH=$ORIGIN` en los ELF —es lo que hace el APKBUILD de
16# Alpine, que trae `patchelf` en sus makedepends—, pero `patchelf` no existe todavía como receta del
17# corpus. Cuando exista, esto se puede simplificar a un symlink otra vez.
18#
19# `exec` y no una llamada normal: así el proceso que queda es el motor, `/proc/self/exe` apunta a
20# `/usr/lib/atuq/atuq` y Gecko resuelve su appdir correctamente. Con un `sh` de por medio quedaría
21# un proceso zombi de más y el nombre en `ps` sería el del script.
22# ── ⚠ EL DIRECTORIO VA DOS VECES, Y NO ES UN DEDAZO (2026-09-07) ──────────────────────────────
23# Gecko SE COME EL PRIMER ELEMENTO de `LD_LIBRARY_PATH` al lanzar el proceso RDD (el que decodifica
24# vídeo). Con el appdir una sola vez —o sea, primero— el RDD arranca SIN él, no encuentra
25# `libmozavcodec.so`/`libmozavutil.so` (el ffvpx bundleado, que es donde vive dav1d) y registra
26#
27#     PlatformDecoderModule  FFVPX: Link result: NoProvidedLib
28#
29# El navegador NO falla: se cae al ffmpeg del sistema, que cubre H.264/AAC/VP8/VP9/MP3/FLAC/Opus…
30# pero **NO AV1 por software** —el decodificador `av1` de ffmpeg es sólo hwaccel y nuestra receta va
31# sin dav1d—, así que un vídeo AV1 se queda en `readyState=1` para siempre. Es la forma de fallo de
32# esta casa: media función apagada, cero mensajes de error.
33#
34# Medido con tres corridas que sólo cambian esta variable (matriz en `scripts/test-atuq-codecs.sh`):
35#
36#     LD=/usr/lib/atuq:/usr/lib:/lib             → RDD NoProvidedLib   AV1 ✗
37#     LD=/usr/lib/atuq:/usr/lib/atuq:/usr/lib    → RDD Success         AV1 ✓
38#     LD=/relleno:/usr/lib/atuq:/usr/lib         → RDD Success         AV1 ✓   (el relleno se lo come)
39#
40# Repetirlo es la mitigación correcta mientras no haya `patchelf` en el corpus para grabar
41# `RUNPATH=$ORIGIN` en los ELF, que es lo que hace Alpine y lo que borraría esta variable entera.
42LD_LIBRARY_PATH="/usr/lib/atuq:/usr/lib/atuq${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
43export LD_LIBRARY_PATH
44exec /usr/lib/atuq/atuq "$@"