elfutils-libdw: construir también libdwfl (dwarves lo necesita)

dwarves llama a 15 `dwfl_*` distintas desde dwarf_loader.c, así que libdw sola
no alcanza. libdwfl SÍ arrastra argp (argp-std.c) y fts (linux-kernel-modules.c)
⇒ la receta declara `argp-standalone` y `musl-fts`. Esos objetos casi nunca se
enlazan (dwarves no usa dwfl_standard_argp ni dwfl_linux_kernel_*) pero tienen
que COMPILAR.

Dos cosas que costaron:
· libdwfl no se puede construir suelto: su Makefile lee los .manifest de otros
  subdirs. Hay que seguir el orden de SUBDIRS del raíz:
  lib → libelf → libcpu → backends → libebl → libdwelf → libdw → libdwfl.
· `rm -f compat/argp.h`: el shim de la canónica es sólo tipos/decls y no declara
  `argp_failure`, que usa argp-std.c. Como esta variante trae argp de verdad, hay
  que BORRAR el shim para que gane el /usr/include/argp.h real — `-I$PWD/compat`
  va primero y si no lo tapa.
This commit is contained in:
Sergio
2026-08-27 20:41:23 +00:00
parent f147aab90e
commit 84eff79411
+19 -5
View File
@@ -33,8 +33,14 @@
# · `obstack` → en `libdw/` aparece UNA vez y es **dentro de un COMENTARIO** de `libdwP.h`:
# elfutils lleva su propia «simplified thread-local reimplementation of obstacks» y NO incluye
# `<obstack.h>` en ningún sitio de libdw.
# ⇒ construir `libdw` no necesita ni argp ni fts ni obstack de verdad; los stubs de `compat/` que
# ya monta la fase configure siguen bastando.
# ⇒ `libdw` a secas no necesita ni argp ni fts ni obstack de verdad.
#
# ⚠ PERO `dwarves` SÍ necesita `libdwfl` (llama a 15 `dwfl_*` distintas desde `dwarf_loader.c`), y
# libdwfl sí arrastra los dos: `argp-std.c` usa argp y `linux-kernel-modules.c` usa fts. Por eso
# esta receta declara `argp-standalone` y `musl-fts`: no por libdw, por libdwfl.
# En la práctica esos objetos casi nunca se ENLAZAN (dwarves no usa `dwfl_standard_argp` ni
# `dwfl_linux_kernel_*`), pero tienen que COMPILAR, y para eso hacen falta `<argp.h>` y `<fts.h>`
# de verdad — el `compat/` de la canónica trae un argp.h de mentira y NINGÚN fts.h.
#
name = "elfutils-libdw"
version = "0.194"
@@ -50,7 +56,7 @@ link = "dynamic"
zig_version = "0.13.0"
[deps]
build = ["binutils"]
build = ["binutils", "argp-standalone", "musl-fts"]
[build.phases]
configure = """
@@ -137,7 +143,11 @@ CFLAGS="-O2 -g -I$PWD/compat" CPPFLAGS="-I$PWD/compat" LDFLAGS="-L$PWD/compat" \
# El -include del shim de rawmemchr va SÓLO en compile (en configure rompe el test "undeclared builtins"
# de autoconf). CFLAGS aquí reemplaza el de configure (mismo valor + el -include); AM_CFLAGS (warnings/
# -Werror) se preserva.
compile = "make -C lib CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\" && make -C libelf libelf.a libelf.so CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\" && make -C libdw libdw.a CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\""
# ⚠ `rm -f compat/argp.h`: el shim de la canónica es sólo tipos/decls y NO declara
# `argp_failure`, que usa `libdwfl/argp-std.c`. Esta variante SÍ trae argp de verdad
# (`argp-standalone`), así que se borra el shim para que gane el `/usr/include/argp.h` real —
# `-I$PWD/compat` va primero y si no lo taparía.
compile = "rm -f compat/argp.h && make -C lib CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\" && make -C libelf libelf.a libelf.so CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\" && make -C libcpu CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\" && make -C backends CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\" && make -C libebl CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\" && make -C libdwelf CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\" && make -C libdw libdw.a CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\" && make -C libdwfl libdwfl.a CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\""
install = """
mkdir -p /out/usr/lib/pkgconfig /out/usr/include && \
cp -a libelf/libelf.a libelf/libelf.so* /out/usr/lib/ && \
@@ -146,7 +156,11 @@ cp -a config/libelf.pc /out/usr/lib/pkgconfig/ 2>/dev/null || true
mkdir -p /out/usr/include/elfutils
cp -a libdw/libdw.a /out/usr/lib/
cp -a libdw/dwarf.h libdw/libdw.h libdw/known-dwarf.h /out/usr/include/
cp -a libdwfl/libdwfl.h /out/usr/include/
cp -a libdw/libdw.a libdwfl/libdwfl.a /out/usr/lib/
cp -a libdw/libdw.h libdw/known-dwarf.h /out/usr/include/elfutils/
cp -a libdwfl/libdwfl.h /out/usr/include/elfutils/
cp -a version.h /out/usr/include/elfutils/ 2>/dev/null || true
cp -a config/libdw.pc /out/usr/lib/pkgconfig/ 2>/dev/null || true
test -f /out/usr/lib/libdw.a && test -f /out/usr/include/dwarf.h && test -f /out/usr/include/libdw.h
test -f /out/usr/lib/libdw.a && test -f /out/usr/include/dwarf.h && test -f /out/usr/include/libdw.h && test -f /out/usr/lib/libdwfl.a && test -f /out/usr/include/elfutils/libdwfl.h
"""