diff options
Diffstat (limited to 'main/lddtree/0001-use-musl-ldso-conf.patch')
-rw-r--r-- | main/lddtree/0001-use-musl-ldso-conf.patch | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/main/lddtree/0001-use-musl-ldso-conf.patch b/main/lddtree/0001-use-musl-ldso-conf.patch new file mode 100644 index 0000000000..a0f2b32186 --- /dev/null +++ b/main/lddtree/0001-use-musl-ldso-conf.patch @@ -0,0 +1,79 @@ +Author: Ain <41307858+nero@users.noreply.github.com> + + Fix ldso configuration parsing for musl binaries + + Previously, lddtree always checked for the glibc library paths, even + when ran on a musl binary. This resulted in incorrect results on + multiarch systems with both musl and glibc. + +diff --git a/lddtree.sh b/lddtree.sh +index 5f06813..74ca830 100755 +--- a/lddtree.sh ++++ b/lddtree.sh +@@ -107,7 +107,7 @@ c_ldso_paths_loaded='false' + find_elf() { + _find_elf='' + +- local elf=$1 needed_by=$2 ++ local interp elf=$1 needed_by=$2 + if [ "${elf}" != "${elf##*/}" ] && [ -e "${elf}" ] ; then + _find_elf=${elf} + return 0 +@@ -151,28 +151,36 @@ find_elf() { + if ! ${c_ldso_paths_loaded} ; then + c_ldso_paths_loaded='true' + c_ldso_paths= +- if [ -r ${ROOT}etc/ld.so.conf ] ; then +- read_ldso_conf() { +- local line p +- for p ; do +- # if the glob didnt match anything #360041, +- # or the files arent readable, skip it +- [ -r "${p}" ] || continue +- while read line ; do +- case ${line} in +- "#"*) ;; +- "include "*) read_ldso_conf ${line#* } ;; +- *) c_ldso_paths="$c_ldso_paths:${ROOT}${line#/}";; +- esac +- done <"${p}" +- done +- } +- # the 'include' command is relative +- local _oldpwd="$PWD" +- cd "$ROOT"etc >/dev/null ++ read_ldso_conf() { ++ local line p ++ for p ; do ++ # if the glob didnt match anything #360041, ++ # or the files arent readable, skip it ++ [ -r "${p}" ] || continue ++ while read line ; do ++ case ${line} in ++ "#"*) ;; ++ "include "*) read_ldso_conf ${line#* } ;; ++ *) c_ldso_paths="$c_ldso_paths:${ROOT}${line#/}";; ++ esac ++ done <"${p}" ++ done ++ } ++ # the 'include' command is relative ++ local _oldpwd="$PWD" ++ cd "$ROOT"etc >/dev/null ++ interp=$(elf_interp "${needed_by}") ++ case "$interp" in ++ */ld-musl-*) ++ musl_arch=${interp%.so*} ++ musl_arch=${musl_arch##*-} ++ read_ldso_conf "${ROOT}"etc/ld-musl-${musl_arch}.path ++ ;; ++ */ld-linux*|*/ld.so*) # glibc + read_ldso_conf "${ROOT}"etc/ld.so.conf +- cd "$_oldpwd" +- fi ++ ;; ++ esac ++ cd "$_oldpwd" + fi + if [ -n "${c_ldso_paths}" ] ; then + check_paths "${elf}" "${c_ldso_paths}" && return 0 |