On Wed, Sep 18, 2024 at 12:12:59PM +0200, Lukasz Gut wrote: > Fix dynamic linking on Arch Linux by adding (some of) missing links. > > The ldd reports linker in many ways: > ldd /usr/lib/libreadline.so.8 > /usr/lib64/ld-linux-x86-64.so.2 (0x000071244211c000) > ldd /bin/sh > /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 > (0x000077457d5ec000) > ldd /usr/lib/libc.so.6 > /usr/lib/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 > (0x000075d218b8b000) > > This patch looks at the left side and determines if there is a link > there, then adds it. Again, having this be specific to ld.so looks bogus to me. AFAICT the same considerations could apply in theory to any shared library. > > Signed-off-by: Lukasz Gut > --- > mbuto | 28 +++++++++++++++++++++++++++- > 1 file changed, 27 insertions(+), 1 deletion(-) > > diff --git a/mbuto b/mbuto > index 4f860cd..7d67160 100755 > --- a/mbuto > +++ b/mbuto > @@ -668,6 +668,27 @@ libs_dlopen_copy() { > done > } > > +# libs_add_links() - Rebuild alternate links to ld as they appear on the host > +# $1: String returned by ldd in form 's => d' describing location of ld > +libs_add_links() { > + __ld_path="${1##*=> }" > + __ld_link="${1%%=>*}" > + [ -z "${__ld_link}" ] && return > + [ "${__ld_path}" = "${__ld_link}" ] && return > + while [ "${__ld_link}" != "/" ]; do > + if [ -L "${__ld_link}" ]; then > + __target="$("${READLINK}" -f "${__ld_link}")" > + __link="$("${REALPATH}" -s "${__ld_link}" --relative-to "/")" > + __link="${wd}"/"${__link}" > + [ -L "${__link}" ] && break > + __destdir="$("${DIRNAME}" "${__link}")" > + "${MKDIR}" -p "${__destdir}" > + "${LN}" -s "${__target}" "${__link}" > + fi > + __ld_link="$("${DIRNAME}" "${__ld_link}")" > + done > +} > + > # __libs_copy() - Recursively copy shared dependencies for programs, libraries > # $1: Host path to program or library > __libs_copy() { > @@ -716,8 +737,13 @@ __libs_copy() { > > if [ -n "${__ld_path}" ]; then > libs_copy_ld_so "${__ld_path}" > - libs_path_add "${__ld_path##${wd}}" > + libs_path_add "${__ld_path##"${wd}"}" > fi > + > + # On Arch Linux, to execute /bin/sh, the system expects the linker > + # to be under /lib64. Linker is located in /usr/lib, and there is > + # a link /lib64 => /usr/lib. > + libs_add_links "${__ld_so}" > } > > # libs_copy() - Call __libs_copy with tabs and newlines as IFS -- David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson