buildroot/package/dracut/dracut_wrapper
Romain Naour 82afcacb62 package/dracut: fix dracut_wrapper
As reported by Thierry Bultel [1], dracut doesn't work since the
version bump to version 059.

Further investigation by Andreas Naumann [2] reported that the issue
come from this commit d010fa0 refactor(dracut-install): fork() instead
of popen(), sanitise line reading [3].

The issue come from our dracut_wrapper and how DRACUT_LDD is defined.
Indeed dracut expect DRACUT_LDD=ldd or a single binary (without
arguments) but we are using "prelink-rtld --root='${sysroot}'".

With the change introduced by [3], our DRACUT_LDD is used
directly by execlp() leading to an error:

  execlp(ldd, ldd, fullsrcpath, (char *)NULL);

Use mktemp to generate a temporary dracut-ldd script using
prelink-rtld --root='${sysroot}' ${1}

execute dracut.real in a subshell to cleanup the temporary file
at the end of the dracut wrapper script.

Fixes:
https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243423 [tests.fs.test_cpio.TestCpioDracutGlibcMergedUsr]
https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243434 [tests.fs.test_cpio.TestCpioDracutMuslMergedUsr]
https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243567 [tests.fs.test_cpio.TestCpioDracutUclibcMergedUsr]
https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243559 [tests.fs.test_cpio.TestCpioDracutGlibc]
https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243504 [tests.fs.test_cpio.TestCpioDracutUclibc]
https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243498 [tests.fs.test_cpio.TestCpioDracutMusl]

[1] http://lists.busybox.net/pipermail/buildroot/2024-February/684145.html
[2] http://lists.busybox.net/pipermail/buildroot/2024-February/684503.html
[3] d010fa0d7f

Fixes: 145f01ded5 ("package/dracut: bump to version 059")
Reported-by: Thierry Bultel <thierry.bultel@linatsea.fr>
Signed-off-by: Romain Naour <romain.naour@smile.fr>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2024-03-01 19:22:56 +01:00

49 lines
1.0 KiB
Bash

#!/bin/bash
set -e
# Find the --sysroot argument
sysroot=
next_arg=false
for arg; do
if ${next_arg}; then
next_arg=false
sysroot="${arg}"
continue # not break, in case there are more than one
fi
case "${arg}" in
(--sysroot|-r)
next_arg=true
continue
;;
(--sysroot=*)
sysroot="${arg#*=}"
continue # not break, in case there are more than one
;;
(-r?*)
sysroot="${arg#-r}"
continue # not break, in case there are more than one
;;
esac
done
if [ -z "${sysroot}" ]; then
echo "${0}: --sysroot argument must be given." 1>&2
exit 1
fi
topdir="$(dirname "$(realpath "$(dirname "${0}")")")"
DRACUT_LDD="$(mktemp /tmp/dracut-ldd.XXXXXX)"
cat >"${DRACUT_LDD}" <<EOL
#!/bin/bash
${topdir}/sbin/prelink-rtld --root='${sysroot}' \${1}
EOL
chmod +x "${DRACUT_LDD}"
export DRACUT_LDD
export DRACUT_INSTALL="${topdir}/lib/dracut/dracut-install"
export DRACUT_LDCONFIG=/bin/true
export dracutbasedir="${topdir}/lib/dracut"
(exec "${topdir}/bin/dracut.real" "${@}")
if [ -n "${DRACUT_LDD}" ]; then
rm -f "${DRACUT_LDD}"
fi