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 #include #include +#include +#include #if HAVE_LIBXML #include @@ -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 */