1
0
Files
binutils/debian/patches/129_multiarch_libpath.patch
Konstantin Demin 8c29d0a2c2 initial import from Debian
version: 2.45-4 (UNRELEASED)
commit: bf4f75f17a4f370adc9bf9feca09710ce76ecc63
2025-08-11 12:46:32 +03:00

262 lines
7.4 KiB
Diff

# DP: Add multiarch directories to linker search path for ld and gold.
--- a/ld/genscripts.sh
+++ b/ld/genscripts.sh
@@ -244,6 +244,104 @@ append_to_lib_path()
fi
}
+# set the multiarch tuples
+multiarch_name=
+multiarch_name_32=
+multiarch_name_64=
+multiarch_name_n32=
+multiarch_name_x32=
+
+if true; then
+ # based on TOOL_LIB
+ multiarch_name=$DEB_TARGET_MULTIARCH
+ multiarch_name_32=$DEB_TARGET_MULTIARCH32
+ multiarch_name_64=$DEB_TARGET_MULTIARCH64
+ multiarch_name_n32=$DEB_TARGET_MULTIARCHN32
+ multiarch_name_x32=$DEB_TARGET_MULTIARCHX32
+else
+ # based on the emulation name; using TOOL_LIB seems to unreliable, when
+ # configuring with --enable-targets=powerpc-linux-gnu,powerpc64-linux-gnu
+ # only the first one (?) wins.
+ # FIXME: should this go into ld/emulparams/*.sh ?
+ case "$EMULATION_NAME" in
+ aarch64linux)
+ multiarch_name=aarch64-linux-gnu
+ ;;
+ aarch64linux32)
+ multiarch_name=aarch64_ilp32-linux-gnu
+ ;;
+ aarch64linux32b)
+ multiarch_name=aarch64_be_ilp32-linux-gnu
+ ;;
+ aarch64linuxb)
+ multiarch_name=aarch64_be-linux-gnu
+ ;;
+ armelf_linux_eabi)
+ # FIXME: TOOL_LIB can be arm-linux-gnueabi, arm-linux-gnueabihf, aarch64-linux-gnu
+ multiarch_name=arm-linux-gnueabi
+ ;;
+ armelfb_linux_eabi)
+ # FIXME: TOOL_LIB can be arm-linux-gnueabi, arm-linux-gnueabihf, aarch64-linux-gnu
+ multiarch_name=armeb-linux-gnueabi
+ ;;
+ elf32_sparc)
+ multiarch_name=sparc-linux-gnu
+ multiarch_name_64=sparc64-linux-gnu
+ ;;
+ elf32_x86_64)
+ multiarch_name=x86_64-linux-gnux32
+ multiarch_name_32=i386-linux-gnu
+ multiarch_name_64=x86_64-linux-gnu
+ ;;
+ elf32btsmip)
+ ;;
+ elf32btsmipn32)
+ ;;
+ elf32ltsmip)
+ ;;
+ elf32ltsmipn32)
+ ;;
+ elf32elflppc) # necessary?
+ multiarch_name=powerpcle-linux-gnu
+ multiarch_name_64=powerpc64le-linux-gnu
+ ;;
+ elf32elflppclinux)
+ multiarch_name=powerpcle-linux-gnu
+ multiarch_name_64=powerpc64le-linux-gnu
+ ;;
+ elf32ppc) # necessary?
+ multiarch_name=powerpc-linux-gnu
+ multiarch_name_64=powerpc64-linux-gnu
+ ;;
+ elf32ppclinux)
+ multiarch_name=powerpc-linux-gnu
+ multiarch_name_64=powerpc64-linux-gnu
+ ;;
+ elf64ppc)
+ multiarch_name=powerpc64-linux-gnu
+ multiarch_name_32=powerpc-linux-gnu
+ ;;
+ esac
+fi
+
+if [ "x${LIB_PATH}" = "x" ] && [ "x${USE_LIBPATH}" = xyes ] ; then
+ libs=${NATIVE_LIB_DIRS}
+ if [ "x${NATIVE}" = "xyes" ] ; then
+ case " ${libs} " in
+ *" ${libdir} "*) ;;
+ *) libs="${libdir} ${libs}" ;;
+ esac
+ fi
+ append_to_lib_path ${libs}
+fi
+
+case :${lib_path1}:${lib_path2}: in
+ *:: | ::*) LIB_PATH=${lib_path1}${lib_path2} ;;
+ *) LIB_PATH=${lib_path1}:${lib_path2} ;;
+esac
+lib_path1=
+lib_path2=
+
# Always search $(tooldir)/lib, aka /usr/local/TARGET/lib when native
# except when LIBPATH=":".
if [ "${LIB_PATH}" != ":" ] ; then
@@ -262,6 +360,13 @@ if [ "${LIB_PATH}" != ":" ] ; then
case "${NATIVE}:${libpath_suffix}:${TOOL_LIB}" in
:* | *::* | *:*:*${libpath_suffix}) ;;
*) libs="${exec_prefix}/${target_alias}/lib${libpath_suffix}" ;;
+ *)
+ # FIXME:
+ # For the binutils-multiarch build on x86_64-linux-gnu configured
+ # with --enable-targets=powerpc-linux-gnu, /usr/x86_64-linux-gnu/lib64
+ # is added instead of /usr/powerpc64-linux-gnu/lib64. However this
+ # probably wanted for the "default" emulation. How to detect that?
+ libs="${exec_prefix}/${target_alias}/lib${libpath_suffix}" ;;
esac
done
libs="${exec_prefix}/${TOOL_LIB}/lib ${libs}"
@@ -269,24 +374,124 @@ if [ "${LIB_PATH}" != ":" ] ; then
append_to_lib_path ${libs}
fi
-if [ "x${LIB_PATH}" = "x" ] && [ "x${USE_LIBPATH}" = xyes ] ; then
- libs=${NATIVE_LIB_DIRS}
- if [ "x${NATIVE}" = "xyes" ] ; then
- case " ${libs} " in
- *" ${libdir} "*) ;;
- *) libs="${libdir} ${libs}" ;;
- esac
- fi
- append_to_lib_path ${libs}
-fi
-
case :${lib_path1}:${lib_path2}: in
- *:: | ::*) LIB_PATH=${lib_path1}${lib_path2} ;;
- *) LIB_PATH=${lib_path1}:${lib_path2} ;;
+ *:: | ::*) LIB_PATH=${LIB_PATH}:${lib_path1}${lib_path2} ;;
+ *) LIB_PATH=${LIB_PATH}:${lib_path1}:${lib_path2} ;;
esac
+# We use the $tool_lib variable in our multiarch mangling:
+if [ "x${TOOL_LIB}" = "x" ] ; then
+ tool_lib=${exec_prefix}/${target_alias}/lib
+else
+ tool_lib=${exec_prefix}/${TOOL_LIB}/lib
+fi
+
+# FIXME: why again? These already should be in LIBPATH
+if [ "x${APPEND_TOOLLIBDIR}" = "xyes" ] ; then
+ LIB_PATH=${LIB_PATH}:${tool_lib}
+ # For multilib targets, search both $tool_lib dirs
+ if [ "x${LIBPATH_SUFFIX}" != "x" ] ; then
+ LIB_PATH=${LIB_PATH}:${tool_lib}${LIBPATH_SUFFIX}
+ fi
+fi
+
LIB_SEARCH_DIRS=`echo ${LIB_PATH} | sed -e 's/:/ /g' -e 's/\([^ ][^ ]*\)/SEARCH_DIR(\\"\1\\");/g'`
+if [ -n "$multiarch_name" ]; then
+ temp_dirs=' '
+ ma_dirs=' '
+ for dir in `echo ${LIB_PATH} | sed -e 's/:/ /g'`; do
+ case "$dir" in
+ *${tool_lib}*|*/${target_alias}/*)
+ ;;
+ */lib)
+ if [ -n "$multiarch_name_32" ]; then
+ case $EMULATION_NAME in
+ elf_i386|elf32*)
+ ma_dirs="${ma_dirs}${dir}/$multiarch_name_32 ";;
+ *)
+ ma_dirs="${ma_dirs}${dir}/$multiarch_name "
+ esac
+ elif [ -n "$multiarch_name_64" ]; then
+ case $EMULATION_NAME in
+ elf*_64|elf64*)
+ ma_dirs="${ma_dirs}${dir}/$multiarch_name_64 ";;
+ *)
+ ma_dirs="${ma_dirs}${dir}/$multiarch_name "
+ esac
+ else
+ ma_dirs="${ma_dirs}${dir}/$multiarch_name "
+ fi
+ ;;
+ */lib32)
+ if [ -n "$multiarch_name_32" ]; then
+ dir2=$(echo $dir | sed "s,32$,,")
+ ma_dirs="${ma_dirs}${dir2}/$multiarch_name_32 "
+ fi
+ ;;
+ */lib64)
+ case "${target}" in
+ aarch64*-*-*|powerpc64-*-*|s390x-*-*|sparc64-*-*|x86_64-*-linux-gnu|mips64-*-gnuabi64)
+ #dir=$(echo $dir | sed "s,64$,,")
+ dir2=$(echo $dir | sed "s,64$,,")
+ ma_dirs="${ma_dirs}${dir2}/$multiarch_name "
+ ;;
+ *)
+ if [ -n "$multiarch_name_64" ]; then
+ dir2=$(echo $dir | sed "s,64$,,")
+ ma_dirs="${ma_dirs}${dir2}/$multiarch_name_64 "
+ fi
+ ;;
+ esac
+ ;;
+ */libx32)
+ case "${target}" in
+ x86_64-*-linux-gnux32)
+ dir2=$(echo $dir | sed "s,x32$,,")
+ ma_dirs="${ma_dirs}${dir2}/$multiarch_name "
+ ;;
+ *)
+ if [ -n "$multiarch_name_x32" ]; then
+ dir2=$(echo $dir | sed "s,x32$,,")
+ ma_dirs="${ma_dirs}${dir2}/$multiarch_name_x32 "
+ fi
+ ;;
+ esac
+ ;;
+ */libn32)
+ case "${target}" in
+ mips64*-*-linux-gnuabin32)
+ dir2=$(echo $dir | sed "s,n32$,,")
+ ma_dirs="${ma_dirs}${dir2}/$multiarch_name "
+ ;;
+ *)
+ if [ -n "$multiarch_name_n32" ]; then
+ dir2=$(echo $dir | sed "s,n32$,,")
+ ma_dirs="${ma_dirs}${dir2}/$multiarch_name_n32 "
+ fi
+ ;;
+ esac
+ ;;
+ */libilp32)
+ if [ -n "$multiarch_name_32" ]; then
+ dir2=$(echo $dir | sed "s,ilp32$,,")
+ ma_dirs="${ma_dirs}${dir2}/$multiarch_name_32 "
+ fi
+ ;;
+ *)
+ ;;
+ esac
+ temp_dirs="${temp_dirs}${dir} "
+ done
+ LIB_SEARCH_DIRS=
+ for dir in $ma_dirs $temp_dirs; do
+ if echo "$LIB_SEARCH_DIRS" | fgrep -q "\"$dir\""; then
+ continue
+ fi
+ LIB_SEARCH_DIRS="${LIB_SEARCH_DIRS}SEARCH_DIR(\"$dir\"); "
+ done
+fi
+
# We need it for testsuite.
set $EMULATION_LIBPATH
if [ "x$1" = "x$EMULATION_NAME" ]; then