Etapa G: wayland + wayland-protocols CONSTRUIDAS (scanner desbloqueado)
Root cause real del bloqueo de wayland: NO era bug del wayland-scanner ni del XML
(ambos verificados OK). En el sandbox el scanner in-tree se compila ENLAZADO DINÁMICO
contra la musl (zig cc nativo no produce estático acá), y bajo musl-dinámico
`freopen(@OUTPUT@,"w",stdout)` queda roto por la copy-relocation de `stdout`: trunca el
archivo de salida pero manda el header generado a stdout → @OUTPUT@ vacío → `WL_SHM_FORMAT_*`
/ `wl_*` «undeclared» al compilar libwayland.
Fix: wayland-scanner-dup2-output.patch redirige la salida con `dup2(fd, STDOUT_FILENO)`
(nivel descriptor) en vez de `freopen` → robusto al modo de enlace. Verificado byte-a-byte:
salida idéntica a la del scanner estático (217484 B al archivo).
Segundo blocker (libwayland-server.so): libffi.a era no-PIC → `R_X86_64_PC32 ... recompile
with -fPIC` al ligarlo dentro de una .so. libffi ahora con --with-pic (superset; sigue
sirviendo para enlace estático). Mesa necesitará lo mismo en zlib/zstd/expat.
Restaura recipes/samurai.toml (lo necesita el stack adaptado de recipes/: libdrm/seatd/
wayland; las otras build-deps —meson/pkgconf/python3/expat/libffi— ya viven en recipes/).
Sellados: wayland (libwayland-{client,server,cursor,egl}.so + scanner + .pc),
wayland-protocols (XML + .pc). Queda mesa (iris-only).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
Redirige la salida del scanner al @OUTPUT@ a nivel de descriptor (dup2) en vez de freopen(stdout).
|
||||
|
||||
En hammer el wayland-scanner se compila ENLAZADO DINÁMICO contra la musl del sandbox (zig cc
|
||||
nativo no produce estático aquí), y bajo musl-dinámico `freopen(argv[2], "w", stdout)` queda roto
|
||||
por la copy-relocation de `stdout`: trunca/crea el archivo de salida PERO no redirige el fd que usa
|
||||
`printf()`, así que el header generado sale por stdout y el @OUTPUT@ queda VACÍO. Resultado: al
|
||||
compilar libwayland, `WL_SHM_FORMAT_*` / `wl_*_interface` / `wl_callback_*` aparecen «undeclared»
|
||||
(headers de protocolo vacíos). Verificado a fondo: el binario ESTÁTICO escribe bien al archivo; el
|
||||
DINÁMICO no — mismo source, flags y config.h.
|
||||
|
||||
`dup2(outfd, STDOUT_FILENO)` redirige el descriptor 1 a nivel de kernel: TODAS las escrituras a
|
||||
stdout (cualquiera sea el objeto FILE por la copy-reloc) terminan en el archivo. Robusto frente al
|
||||
modo de enlace. La salida queda idéntica byte-a-byte a la del scanner estático.
|
||||
|
||||
--- a/src/scanner.c
|
||||
+++ b/src/scanner.c
|
||||
@@ -36,6 +36,8 @@
|
||||
#include <getopt.h>
|
||||
#include <limits.h>
|
||||
#include <unistd.h>
|
||||
+#include <fcntl.h>
|
||||
+#include <sys/stat.h>
|
||||
|
||||
#if HAVE_LIBXML
|
||||
#include <libxml/parser.h>
|
||||
@@ -2138,11 +2140,14 @@ int main(int argc, char *argv[])
|
||||
strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
- if (freopen(argv[2], "w", stdout) == NULL) {
|
||||
+ int outfd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
|
||||
+ if (outfd < 0 || dup2(outfd, STDOUT_FILENO) < 0) {
|
||||
fprintf(stderr, "Could not open output file: %s\n",
|
||||
strerror(errno));
|
||||
fclose(input);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
+ if (outfd != STDOUT_FILENO)
|
||||
+ close(outfd);
|
||||
}
|
||||
|
||||
/* initialize protocol structure */
|
||||
Reference in New Issue
Block a user