X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Fgenscripts.sh;h=eb262e7ef6168c8a88fbae12ec47207d451e6ee3;hb=8f1732fc2a11dc2dbece0800d4ed6f011590d3ad;hp=d78ffce3c2360fb596a864c2986267e7a3e9baa0;hpb=88bba78dc42680f0a6634a6784f6f188b2af2849;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/genscripts.sh b/ld/genscripts.sh index d78ffce3c2..eb262e7ef6 100755 --- a/ld/genscripts.sh +++ b/ld/genscripts.sh @@ -1,6 +1,6 @@ #!/bin/sh # genscripts.sh - generate the ld-emulation-target specific files -# Copyright 2007 Free Software Foundation, Inc. +# Copyright (C) 2004-2016 Free Software Foundation, Inc. # # This file is part of the Gnu Linker. # @@ -30,10 +30,10 @@ # default_emulation \ # native_lib_dirs \ # use_sysroot \ +# enable_initfini_array \ # this_emulation \ # optional: -# tool_dir \ -# customizer_script +# tool_dir # # Sample usage: # @@ -63,6 +63,7 @@ # sun3.xc [used when the linker is invoked with "-z combreloc"] # sun3.xsc [used when the linker is invoked with "--shared"] # sun3.xdc [used when the linker is invoked with "-pie"] +# sun3.xa [used when the linker is invoked with "--enable-auto-import"] # # It also produced the C source file: # @@ -88,24 +89,13 @@ EMULATION_LIBPATH=$8 NATIVE_LIB_DIRS=$9 shift 9 use_sysroot=$1 -EMULATION_NAME=$2 -TOOL_LIB=$3 -CUSTOMIZER_SCRIPT=$4 - -# 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 -CUSTOMIZER_SCRIPT="${srcdir}/emulparams/${CUSTOMIZER_SCRIPT}.sh" +ENABLE_INITFINI_ARRAY=$2 +EMULATION_NAME=$3 +TOOL_LIB=$4 # Include the emulation-specific parameters: -. ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} +CUSTOMIZER_SCRIPT="${srcdir}/emulparams/${EMULATION_NAME}.sh" +. ${CUSTOMIZER_SCRIPT} if test -d ldscripts; then true @@ -147,76 +137,97 @@ 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 + skip_lib=no + 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 ;; + *) + if test -n "${LIBPATH_SUFFIX_SKIP}"; then + case "${lib}" in + *${LIBPATH_SUFFIX_SKIP}) skip_lib=yes ;; + esac + fi + if test "${skip_lib}" = "no"; then + case :${lib_path1}: in + *:${lib}${LIBPATH_SUFFIX}:*) ;; + ::) lib_path1=${lib}${LIBPATH_SUFFIX} ;; + *) lib_path1=${lib_path1}:${lib}${LIBPATH_SUFFIX} ;; + esac + fi ;; + esac + fi + if test "${skip_lib}" = "no"; then + case :${lib_path1}:${lib_path2}: in + *:${lib}:*) ;; + *::) lib_path2=${lib} ;; + *) lib_path2=${lib_path2}:${lib} ;; + esac + fi + 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 + 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. @@ -267,7 +278,7 @@ LD_FLAG=r DATA_ALIGNMENT=${DATA_ALIGNMENT_r} DEFAULT_DATA_ALIGNMENT="ALIGN(${SEGMENT_SIZE})" ( echo "/* Script for ld -r: link without relocation */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xr @@ -275,7 +286,7 @@ LD_FLAG=u DATA_ALIGNMENT=${DATA_ALIGNMENT_u} CONSTRUCTING=" " ( echo "/* Script for ld -Ur: link w/out relocation, do create constructors */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xu @@ -283,21 +294,21 @@ LD_FLAG= DATA_ALIGNMENT=${DATA_ALIGNMENT_} RELOCATING=" " ( echo "/* Default linker script, for normal executables */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.x LD_FLAG=n DATA_ALIGNMENT=${DATA_ALIGNMENT_n} ( echo "/* Script for -n: mix text and data on same page */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xn LD_FLAG=N DATA_ALIGNMENT=${DATA_ALIGNMENT_N} ( echo "/* Script for -N: mix text and data on same page; don't align data */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xbn @@ -306,7 +317,7 @@ if test -n "$GENERATE_COMBRELOC_SCRIPT"; then LD_FLAG=c COMBRELOC=ldscripts/${EMULATION_NAME}.xc.tmp ( echo "/* Script for -z combreloc: combine and sort reloc sections */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xc rm -f ${COMBRELOC} @@ -314,7 +325,7 @@ if test -n "$GENERATE_COMBRELOC_SCRIPT"; then RELRO_NOW=" " COMBRELOC=ldscripts/${EMULATION_NAME}.xw.tmp ( echo "/* Script for -z combreloc -z now -z relro: combine and sort reloc sections */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xw rm -f ${COMBRELOC} @@ -328,7 +339,7 @@ if test -n "$GENERATE_SHLIB_SCRIPT"; then CREATE_SHLIB=" " ( echo "/* Script for ld --shared: link shared library */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xs if test -n "$GENERATE_COMBRELOC_SCRIPT"; then @@ -336,7 +347,7 @@ if test -n "$GENERATE_SHLIB_SCRIPT"; then DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}} COMBRELOC=ldscripts/${EMULATION_NAME}.xsc.tmp ( echo "/* Script for --shared -z combreloc: shared library, combine & sort relocs */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsc rm -f ${COMBRELOC} @@ -344,7 +355,7 @@ if test -n "$GENERATE_SHLIB_SCRIPT"; then RELRO_NOW=" " COMBRELOC=ldscripts/${EMULATION_NAME}.xsw.tmp ( echo "/* Script for --shared -z combreloc -z now -z relro: shared library, combine & sort relocs */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsw rm -f ${COMBRELOC} @@ -360,7 +371,7 @@ if test -n "$GENERATE_PIE_SCRIPT"; then CREATE_PIE=" " ( echo "/* Script for ld -pie: link position independent executable */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xd if test -n "$GENERATE_COMBRELOC_SCRIPT"; then @@ -368,7 +379,7 @@ if test -n "$GENERATE_PIE_SCRIPT"; then DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}} COMBRELOC=ldscripts/${EMULATION_NAME}.xdc.tmp ( echo "/* Script for -pie -z combreloc: position independent executable, combine & sort relocs */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdc rm -f ${COMBRELOC} @@ -376,7 +387,7 @@ if test -n "$GENERATE_PIE_SCRIPT"; then RELRO_NOW=" " COMBRELOC=ldscripts/${EMULATION_NAME}.xdw.tmp ( echo "/* Script for -pie -z combreloc -z now -z relro: position independent executable, combine & sort relocs */" - . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} + . ${CUSTOMIZER_SCRIPT} . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdw rm -f ${COMBRELOC} @@ -386,24 +397,31 @@ if test -n "$GENERATE_PIE_SCRIPT"; then unset CREATE_PIE fi -case " $EMULATION_LIBPATH " in - *" ${EMULATION_NAME} "*) COMPILE_IN=true;; +if test -n "$GENERATE_AUTO_IMPORT_SCRIPT"; then + LD_FLAG=auto_import + DATA_ALIGNMENT=${DATA_ALIGNMENT_} + ( + echo "/* Script for ld --enable-auto-import: Like the default script except read only data is placed into .data */" + . ${CUSTOMIZER_SCRIPT} + . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xa +fi + +case "$COMPILE_IN: $EMULATION_LIBPATH " in + :*" ${EMULATION_NAME} "*) COMPILE_IN=yes;; esac -if test -n "${BASH+set}"; then - source_em() - { - local current_script="$em_script" - em_script=$1 - . $em_script - em_script=$current_script - } - fragment() - { - local lineno=$[${BASH_LINENO[0]} + 1] - echo >> e${EMULATION_NAME}.c "#line $lineno \"$em_script\"" - cat >> e${EMULATION_NAME}.c - } +# PR ld/5652: +# Determine if the shell has support for the variable BASH_LINENO. +# When it is the case, it is only available inside functions. +has_lineno() +{ + test "x$BASH_LINENO" != "x" +} + +# Enable accruate error source in the compiler error messages, if possible. +if has_lineno; then + . ${srcdir}/genscrba.sh else source_em() {