Files
takana/recipes/strace-io-uring-7.1.patch
Sergio 1cbcac6600 strace: construye — headers del rootfs (Linux 7.1) contra strace 6.19
Dos cambios, una causa: el sandbox sirve headers UAPI MÁS NUEVOS de lo que
strace 6.19 espera, y la receta traía una dep que los ensombrecía con otros
más VIEJOS.

1) Fuera `linux-headers` de [deps]. Esa receta instala Linux 6.16 en
   /usr/include y TAPA los headers del rootfs (7.1). Con ella faltaban 35
   constantes —18 de btrfs.h, 17 de input-event-codes.h— y como los xlat de
   strace son `#unconditional` (sin guardas #ifdef), una constante ausente NO
   degrada la traza: rompe la compilación. Comprobado que no aporta NI UN
   header que el rootfs/zig no traigan ya (0 ficheros exclusivos).

2) `strace-io-uring-7.1.patch`: Linux 7.1 añadió `min_left` a
   `struct io_uring_buf_reg` y cambió `__u64 resv[3]` por `__u32 resv[5]`, así
   que `CHECK_TYPE_SIZE(arg.resv, sizeof(uint64_t)*3)` saltaba como
   `static assertion failed`. El cambio es el de UPSTREAM (strace master ya lo
   trae), mismo criterio que `linux-headers-7.0.patch`, que también es un
   cherry-pick.

⚠ El fallo se destapa POR CAPAS: make abortaba en btrfs.o, así que las 17
constantes de evdev ni se compilaban, y al arreglar btrfs "aparecían" las de
evdev como si el arreglo no hubiera servido. Y sólo tras resolver las 35 se
llegó a compilar io_uring.c y salió el static_assert. Una causa, tres caras.

⚠ `--enable-bundled=yes` NO sirve acá aunque el compilador lo sugiera: zig-cc
impone sus headers por delante de cualquier `-isystem`, así que los bundled de
strace no pueden ganar. Se probó: la opción se aplica (`checking whether to use
bundled linux kernel headers... yes`) y el assert sigue.

Verificado: sella, 0 undeclared, 0 asserts, y el binario TRAZA de verdad —
`strace -c /bin/true` cuenta 30 syscalls.
2026-08-27 19:10:54 +00:00

37 lines
1.2 KiB
Diff

strace 6.19 espera `struct io_uring_buf_reg` de Linux ~6.x (`__u64 resv[3]`), pero
los headers UAPI que MANDAN en el sandbox son los del rootfs del lab, que ya son
**Linux 7.1** y traen el campo nuevo `min_left` con `__u32 resv[5]`:
__u32 min_left;
__u32 resv[5];
=> `CHECK_TYPE_SIZE(arg.resv, sizeof(uint64_t) * 3)` salta como
`static assertion failed ... Unexpected size of arg.resv`.
Este cambio es el de UPSTREAM (strace master ya lo trae; ver src/io_uring.c en
strace/strace): comprueba min_left y resv[5], e imprime min_left. Mismo criterio
que `linux-headers-7.0.patch`, que tambien es un cherry-pick de upstream.
--- a/src/io_uring.c
+++ b/src/io_uring.c
@@ -640,7 +640,8 @@
struct io_uring_buf_reg arg;
CHECK_TYPE_SIZE(arg, 40);
CHECK_TYPE_SIZE(arg.flags, sizeof(uint16_t));
- CHECK_TYPE_SIZE(arg.resv, sizeof(uint64_t) * 3);
+ CHECK_TYPE_SIZE(arg.min_left, sizeof(uint32_t));
+ CHECK_TYPE_SIZE(arg.resv, sizeof(uint32_t) * 5);
if (nargs != 1) {
printaddr(addr);
@@ -662,6 +663,9 @@
tprint_struct_next();
PRINT_FIELD_X(arg, flags);
+ tprint_struct_next();
+ PRINT_FIELD_U(arg, min_left);
+
if (!IS_ARRAY_ZERO(arg.resv)) {
tprint_struct_next();
PRINT_FIELD_ARRAY(arg, resv, tcp, print_xint_array_member);