Hi Stefano, This set of patches makes mbuto work also on Arch Linux. I have changed PATCH 4/4 based on your comments. Thank you for pointing out the correct recepient list. Cheers, Lukasz
On Arch Linux ldd /bin/sh reports: /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 Use a regex to pick only right side and use it for path processing. Signed-off-by: Lukasz Gut <lgut(a)lgut.eu> --- mbuto | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mbuto b/mbuto index b80ea78..1c3b347 100755 --- a/mbuto +++ b/mbuto @@ -704,9 +704,14 @@ __libs_copy() { for __l in $("${LDD}" "${1}" 2>/dev/null); do case ${__l} in "/"*" "*) __ld_so="${__l% *}" ;; *) ;; esac done - if [ -n "${__ld_so}" ]; then - libs_copy_ld_so "${__ld_so}" - libs_path_add "${__ld_so##${wd}}" + # On Arch Linux ld is reported by ldd in form: + # /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 + # Make sure to take only right part in this case. + __ld_path="${__ld_so##*=> }" + + if [ -n "${__ld_path}" ]; then + libs_copy_ld_so "${__ld_path}" + libs_path_add "${__ld_path##${wd}}" fi } -- 2.46.1
Place ld in exact physical location as on host, not being confused by links. Use realpath, that was already on the list of default PROGS. Signed-off-by: Lukasz Gut <lgut(a)lgut.eu> --- mbuto | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mbuto b/mbuto index 1c3b347..1f92bd9 100755 --- a/mbuto +++ b/mbuto @@ -644,12 +644,13 @@ libs_path_add() { # libs_copy_ld_so() - Copy run-time linker program, mimic location from host # $1: Path to run-time linker libs_copy_ld_so() { - [ -f "${wd}/${1}" ] && return + __srcfile="$("${REALPATH}" "${1}")" + __destfile="${wd}""${__srcfile}" + [ -f "${__destfile}" ] && return - __destdir="$("${DIRNAME}" "${wd}/${1}")" + __destdir="$("${DIRNAME}" "${__destfile}")" "${MKDIR}" -p "${__destdir}" - - "${CP}" --parents --preserve=all "${1}" "${wd}" + "${CP}" --parents --preserve=all "${__srcfile}" "${wd}" } # libs_dlopen_copy() - Recursively copy matching libraries from LIBS_DLOPEN -- 2.46.1
There is a function to add linker, but it was also added while copying other librares (as dep of libc). Now it is explicitely skipped. Signed-off-by: Lukasz Gut <lgut(a)lgut.eu> --- mbuto | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mbuto b/mbuto index 1f92bd9..4f860cd 100755 --- a/mbuto +++ b/mbuto @@ -685,6 +685,10 @@ __libs_copy() { [ "$("${BASENAME}" "${__path}")" = "libfakeroot-sysv.so" ] && \ continue + # ld is handled below, skip one reported by libc + [ "$("${BASENAME}" "${__path}")" = "ld-linux-x86-64.so.2" ] && \ + continue + __destpath="${wd}${__path}" [ -f "${__destpath}" ] && continue -- 2.46.1
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. Signed-off-by: Lukasz Gut <lgut(a)lgut.eu> --- 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 -- 2.46.1