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.
37 lines
1.2 KiB
Diff
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);
|