--with-sysroot=/ linker search path

Alan Modra amodra@gmail.com
Tue Sep 3 15:18:00 GMT 2013


I was looking at some --with-sysroot=/ default linker scripts
recently, and wondered why we don't generate the same search paths as
a non-sysroot linker.  I think we should, so this patch sets about
making them the same.

To do that, both sysroot and non-sysroot linkers must change whether
$tooldir/lib, ie. $prefix/$target/lib, appears in the search path.
When the sysroot support was added, that particular path was removed
from all sysroot linkers.  I think that went a little too far.  It
makes perfect sense to me for a powerpc64-linux linker to search
/usr/powerpc64-linux-gnu/lib when linking powerpc64-linux objects, the
native case, and when the same linker is linking 32-bit powerpc
objects to search /usr/powerpc-linux-gnu/lib.  The latter directory is
derived from tdir vars set by configure.tgt and is generally the
tooldir value you'd get if configuring a native ld for the given
emulation.  However, you don't want a powerpc64-linux ld configured
with --enable-targets=all, searching /usr/powerpc64-linux-gnu/lib when
linking x86_64-linux objects..  (It would be nice if such a linker
searched /usr/x86_64-linux-gnu/lib when linking x86_64 objects, but
that is outside the scope of this patch.)

So this patch chooses a middle-ground for both sysroot and non-sysroot
linkers.  sysroot adds $tooldir/lib when native and when given an
emulation tdir, and non-sysroot loses $tooldir/lib for all other cases.
I also fix one sysroot path that lacked a '=' prefix, and sort the
paths a little more consistently.

Does anyone have violent objections to this change?

	* genscripts.sh (LIB_PATH): Don't exclude libdir or tooldir when
	sysrooted.  Also, don't always add tooldir when non-sysrooted.
	Instead add both when native and tooldir also when TOOL_DIR is
	defined.  Always prepend '=' to paths when sysrooted.  Always
	put paths with LIBPATH_SUFFIX first in search order.

Index: ld/genscripts.sh
===================================================================
RCS file: /cvs/src/src/ld/genscripts.sh,v
retrieving revision 1.32
diff -u -p -r1.32 genscripts.sh
--- ld/genscripts.sh	15 Dec 2010 14:56:37 -0000	1.32
+++ ld/genscripts.sh	3 Sep 2013 04:05:01 -0000
@@ -95,13 +95,6 @@ EMULATION_NAME=$3
 TOOL_LIB=$4
 CUSTOMIZER_SCRIPT=$5
 
-# Can't use ${TOOL_LIB:-$target_alias} here due to an Ultrix shell bug.
-if [ "x${TOOL_LIB}" = "x" ] ; then
-  tool_lib=${exec_prefix}/${target_alias}/lib
-else
-  tool_lib=${exec_prefix}/${TOOL_LIB}/lib
-fi
-
 if [ "x${CUSTOMIZER_SCRIPT}" = "x" ] ; then
   CUSTOMIZER_SCRIPT=${EMULATION_NAME}
 fi
@@ -150,97 +143,87 @@ fi
 # If the emulparams file set LIBPATH_SUFFIX, prepend an extra copy of
 # the library path with the suffix applied.
 
-if [ "x${LIB_PATH}" = "x" ] && [ "x${USE_LIBPATH}" = xyes ] ; then
-  LIB_PATH2=
+# Paths with LIBPATH_SUFFIX
+lib_path1=
+# Paths without LIBPATH_SUFFIX
+lib_path2=
+if [ "${LIB_PATH}" != ":" ] ; then
+  lib_path2=${LIB_PATH}
+fi
 
-  libs=${NATIVE_LIB_DIRS}
-  if [ "x${use_sysroot}" != "xyes" ] ; then
-    case " ${libs} " in
-      *" ${libdir} "*) ;;
-      *) libs="${libdir} ${libs}" ;;
-    esac
-    case " ${libs} " in
-      *" ${tool_lib} "*) ;;
-      *) libs="${tool_lib} ${libs}" ;;
-    esac
+# Add args to lib_path1 and lib_path2, discarding any duplicates
+append_to_lib_path()
+{
+  if [ $# != 0 ]; then
+    for lib in "$@"; do
+      # The "=" is harmless if we aren't using a sysroot, but also needless.
+      if [ "x${use_sysroot}" = "xyes" ] ; then
+	lib="=${lib}"
+      fi
+      if test -n "${LIBPATH_SUFFIX}"; then
+	case "${lib}" in
+	  *${LIBPATH_SUFFIX})
+	    case :${lib_path1}: in
+	      *:${lib}:*) ;;
+	      ::) lib_path1=${lib} ;;
+	      *) lib_path1=${lib_path1}:${lib} ;;
+	    esac ;;
+	  *)
+	    case :${lib_path1}: in
+	      *:${lib}${LIBPATH_SUFFIX}:*) ;;
+	      ::) lib_path1=${lib}${LIBPATH_SUFFIX} ;;
+	      *) lib_path1=${lib_path1}:${lib}${LIBPATH_SUFFIX} ;;
+	    esac ;;
+	esac
+      fi
+      case :${lib_path1}:${lib_path2}: in
+	*:${lib}:*) ;;
+	*::) lib_path2=${lib} ;;
+	*) lib_path2=${lib_path2}:${lib} ;;
+      esac
+    done
   fi
+}
 
-  for lib in ${libs}; do
-    # The "=" is harmless if we aren't using a sysroot, but also needless.
-    if [ "x${use_sysroot}" = "xyes" ] ; then
-      lib="=${lib}"
+# Always search $(tooldir)/lib, aka /usr/local/TARGET/lib when native
+# except when LIBPATH=":".
+if [ "${LIB_PATH}" != ":" ] ; then
+  libs=
+  if [ "x${TOOL_LIB}" = "x" ] ; then
+    if [ "x${NATIVE}" = "xyes" ] ; then
+      libs="${exec_prefix}/${target_alias}/lib"
     fi
-    addsuffix=
-    case "${LIBPATH_SUFFIX}:${lib}" in
-      :*) ;;
-      *:*${LIBPATH_SUFFIX}) ;;
-      *) addsuffix=yes ;;
+  else
+    # For multilib'ed targets, ensure both ${target_alias}/lib${LIBPATH_SUFFIX}
+    # and ${TOOL_LIB}/lib${LIBPATH_SUFFIX} are in the default search path,
+    # because 64bit libraries may be in both places, depending on
+    # cross-development setup method (e.g.: /usr/s390x-linux/lib64
+    # vs. /usr/s390-linux/lib64)
+    case "${NATIVE}:${LIBPATH_SUFFIX}:${TOOL_LIB}" in
+      :* | *::* | *:*:*${LIBPATH_SUFFIX}) ;;
+      *) libs="${exec_prefix}/${target_alias}/lib${LIBPATH_SUFFIX}" ;;
     esac
-    if test -n "$addsuffix"; then
-      case :${LIB_PATH}: in
-	*:${lib}${LIBPATH_SUFFIX}:*) ;;
-	::) LIB_PATH=${lib}${LIBPATH_SUFFIX} ;;
-	*) LIB_PATH=${LIB_PATH}:${lib}${LIBPATH_SUFFIX} ;;
-      esac
-      case :${LIB_PATH}:${LIB_PATH2}: in
-	*:${lib}:*) ;;
-	*::) LIB_PATH2=${lib} ;;
-	*) LIB_PATH2=${LIB_PATH2}:${lib} ;;
-      esac
-    else
-      case :${LIB_PATH2}: in
-	*:${lib}:*) ;;
-	::) LIB_PATH2=${lib} ;;
-	*) LIB_PATH2=${LIB_PATH2}:${lib} ;;
-      esac
-    fi
-  done
-
-  case :${LIB_PATH}:${LIB_PATH2}: in
-    *:: | ::*) LIB_PATH=${LIB_PATH}${LIB_PATH2} ;;
-    *) LIB_PATH=${LIB_PATH}:${LIB_PATH2} ;;
-  esac
-
-  # For multilib'ed targets, ensure both ${target_alias}/lib${LIBPATH_SUFFIX}
-  # and ${TOOL_LIB}/lib${LIBPATH_SUFFIX} are in the default search path, because
-  # 64bit libraries may be in both places, depending on cross-development
-  # setup method (e.g.: /usr/s390x-linux/lib64 vs /usr/s390-linux/lib64)
-  case "${LIBPATH_SUFFIX}:${tool_lib}" in
-    :*) ;;
-    *:*${LIBPATH_SUFFIX}) ;;
-    *)
-      paths="${exec_prefix}/${target_alias}/lib${LIBPATH_SUFFIX}"
-      if [ x"${TOOL_LIB}" != x ]; then
-        paths="${paths} ${exec_prefix}/${TOOL_LIB}/lib${LIBPATH_SUFFIX}"
-      fi
-      for path in $paths; do
-        case :${LIB_PATH}: in
-          ::: | *:${path}:*) ;;
-          *) LIB_PATH=${path}:${LIB_PATH} ;;
-        esac
-      done
-    ;;
-  esac
+    libs="${exec_prefix}/${TOOL_LIB}/lib ${libs}"
+  fi
+  append_to_lib_path ${libs}
 fi
 
-# Always search $(tooldir)/lib, aka /usr/local/TARGET/lib, except for
-# sysrooted configurations and when LIBPATH=":".
-if [ "x${use_sysroot}" != "xyes" ] ; then
-  case :${LIB_PATH}: in
-  ::: | *:${tool_lib}:*) ;;
-  ::) LIB_PATH=${tool_lib} ;;
-  *) LIB_PATH=${tool_lib}:${LIB_PATH} ;;
-  esac
-  # For multilib targets, search both $tool_lib dirs
-  if [ "x${LIBPATH_SUFFIX}" != "x" ] ; then
-    case :${LIB_PATH}: in
-      ::: | *:${tool_lib}${LIBPATH_SUFFIX}:*) ;;
-      ::) LIB_PATH=${tool_lib}${LIBPATH_SUFFIX} ;;
-      *) LIB_PATH=${tool_lib}${LIBPATH_SUFFIX}:${LIB_PATH} ;;
+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_SEARCH_DIRS=`echo ${LIB_PATH} | sed -e 's/:/ /g' -e 's/\([^ ][^ ]*\)/SEARCH_DIR(\\"\1\\");/g'`
 
 # We need it for testsuite.

-- 
Alan Modra
Australia Development Lab, IBM



More information about the Binutils mailing list