This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
--with-sysroot=/ linker search path
- From: Alan Modra <amodra at gmail dot com>
- To: binutils at sourceware dot org
- Date: Wed, 4 Sep 2013 00:47:53 +0930
- Subject: --with-sysroot=/ linker search path
- Authentication-results: sourceware.org; auth=none
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