OSDN Git Service

Re-autconf configure script after Mike Frysinger's recent AC_ERROR
[uclinux-h8/elf2flt.git] / ld-elf2flt.in
index 2c91ec7..b876636 100644 (file)
@@ -9,13 +9,23 @@
 # Copyright (C) 2002,2003 David McCullough <davidm@snapgear.com>
 # Copyright (C) 2000, Lineo. davidm@lineo.com
 #
+# This is Free Software, under the GNU Public Licence v2 or greater.
+#
 
 LINKER="$0.real"            # the original renamed-linker
 ELF2FLT="`expr $0 : '\(.*\)ld'`elf2flt"
+NM="`expr $0 : '\(.*\)ld'`nm"
 TOOLDIR="`dirname $0`"      # let gcc find the tools for us
+OBJCOPY="`expr $0 : '\(.*\)ld'`objcopy"
+[ -f "$OBJCOPY" ] || OBJCOPY="$TOOLDIR/../../bin/@target_alias@-objcopy"
+OBJDUMP="`expr $OBJCOPY : '\(.*\)objcopy'`objdump"
+LDSCRIPTPATH="@binutils_ldscript_dir@" # and the scripts
 SHARED_ID=""
 NEWLDSCRIPT=""
 
+# check TOOLDIR from prefix/bin/ or prefix/target-alias/bin/
+[ -d "${LDSCRIPTPATH}" ] || LDSCRIPTPATH="${TOOLDIR}/../lib"
+
 #
 # if we have the elf2flt options, run it
 #
@@ -24,12 +34,14 @@ if expr "$*" : ".*-elf2flt.*" > /dev/null
 then
        ARG1=
        ARG2=
-       OFILE=
+       OFILE="a.out"
        PIC=
        SDIRS=
        LDSCRIPT=
        FINAL="yes"
+       FINAL_ONLY=
        MOVDAT=
+       VERBOSE=
 
        while [ $# -ne 0 ]
        do
@@ -59,10 +71,19 @@ then
 
                -EB)      ARG1="$ARG1 $1"; SDIRS="$SDIRS $1";; # arm big endian
 
+               -relax)   ;;                           # eat this for microblaze
+
                -r|-Ur)   FINAL=""                     # this is not a final link
                          ARG1="$ARG1 $1"
                                  ;;
 
+               -v)       ARG1="$ARG1 $1"
+                                 VERBOSE="y"
+                                 ;;
+
+               -m)       shift; EMUL="-m $1";;        # ld emulations for h8300
+               -m*)      EMUL=$1;;
                *)        ARG1="$ARG1 $1"
                                  ;;
                esac
@@ -71,12 +92,15 @@ then
 
        if [ "$FINAL" = "yes" ]
        then
+               [ "$VERBOSE" = "y" ] && set -x
+               ARG1="$ARG1 $FINAL_ONLY"
                NEWLDSCRIPT=`mktemp /tmp/flt-XXXXXX`
                SEDOP=" -e s/^R_RODAT// -e /^W_RODAT/d"
+               OBJCOPYOP=""
                if [ "$MOVDAT" ]
                then
-                       $LINKER -r -d -o $OFILE.elf2flt $ARG1  || exit $?
-                       if [ "`@target_alias@-objdump -h $OFILE.elf2flt | \
+                       $LINKER -r -d -o "$OFILE.elf2flt" $ARG1  || exit $?
+                       if [ "`$OBJDUMP -h "$OFILE.elf2flt" | \
                                        egrep -A1 '[.]rodata' | grep RELOC`" ]
                        then
                                echo "warning: .rodata section contains relocations"
@@ -98,44 +122,94 @@ then
                                # Non application modules enter via main not _start
                                #    SEDOP="$SEDOP -e 's/ENTRY (_start)/ENTRY (main)/'"
                                SEDOP="$SEDOP -e s/\\(ENTRY.\\)(_start)/\1(lib_main)/"
+                               OBJCOPYOP="--localize-hidden --weaken"
                        fi
 
                        # Provide the magic parameter that defines the library data segment pointer offset
-                       ARG1="$ARG1 -defsym _current_shared_library_a5_offset_=`expr ${SHARED_ID} '*' -4 - 4`"
+                       case "@target_cpu@" in
+                           h8300) GOT_OFFSET="__current_shared_library_er5_offset_";;
+                           *)     GOT_OFFSET="_current_shared_library_a5_offset_";;
+                       esac
+                       ARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -4 - 4`"
+               fi
+               if [ "@emit_relocs@" = "yes" ]
+               then
+                       SEDOP="$SEDOP -e s/^SINGLE_LINK://"
+               else
+                       SEDOP="$SEDOP -e /^SINGLE_LINK:/d"
                fi
                
                # provide a default linker script, we usually need one
-               [ -z "$LDSCRIPT" ] && LDSCRIPT="@prefix@/@target_alias@/lib/elf2flt.ld"
+               [ -z "$LDSCRIPT" ] && LDSCRIPT="${LDSCRIPTPATH}/elf2flt.ld"
 
                # if we can find the linker script we preprocess it,  otherwise
                # we assume the user knows what they are doing
                if [ -f "$LDSCRIPT" ]; then
                        sed $SEDOP < "$LDSCRIPT" > "$NEWLDSCRIPT"
                        LDSCRIPT="$NEWLDSCRIPT"
-               elif [ -f "@prefix@/@target_alias@/lib/$LDSCRIPT" ]; then
-                       sed $SEDOP < "@prefix@/@target_alias@/lib/$LDSCRIPT" > "$NEWLDSCRIPT"
+               elif [ -f "${LDSCRIPTPATH}/$LDSCRIPT" ]; then
+                       sed $SEDOP < "${LDSCRIPTPATH}/$LDSCRIPT" > "$NEWLDSCRIPT"
                        LDSCRIPT="$NEWLDSCRIPT"
-               elif [ -f "@prefix@/@target_alias@/lib/ldscripts/$LDSCRIPT" ]; then
-                       sed $SEDOP < "@prefix@/@target_alias@/lib/ldscripts/$LDSCRIPT" > "$NEWLDSCRIPT"
+               elif [ -f "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" ]; then
+                       sed $SEDOP < "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" > "$NEWLDSCRIPT"
                        LDSCRIPT="$NEWLDSCRIPT"
                fi
 
-               $LINKER -r -d -o $OFILE.elf2flt $ARG1                        || exit $?
-               $LINKER $SDIRS -T $LDSCRIPT -Ur -o $OFILE.elf $OFILE.elf2flt || exit $?
-               $LINKER $SDIRS -T $LDSCRIPT -o $OFILE.gdb $OFILE.elf2flt     || exit $?
-               rm -f $OFILE.elf2flt
-               if grep _GLOBAL_OFFSET_TABLE_ $OFILE.gdb > /dev/null 
+               if [ "@emit_relocs@" = "yes" ]
+               then
+                $LINKER $EMUL $SDIRS -T $LDSCRIPT -q -o "$OFILE.gdb" $ARG1             ||exit $?
+                RFILE="$OFILE.gdb"
+                FLTFLAGS="$FLTFLAGS -a"
+               else
+                if [ "@got_check@" = "no" ]
+                then
+                 $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1         ||exit $?
+                 $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" $ARG1                ||exit $?
+                else
+                 $LINKER $EMUL -r -d -o "$OFILE.elf2flt" $ARG1                          ||exit $?
+                 $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -o "$OFILE.elf" "$OFILE.elf2flt" ||exit $?
+                 $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" "$OFILE.elf2flt"     ||exit $?
+                 rm -f "$OFILE.elf2flt"
+                fi
+                RFILE="$OFILE.elf"
+               fi
+               if $NM "$OFILE.gdb" | grep _GLOBAL_OFFSET_TABLE_ > /dev/null 
                then
-                       $ELF2FLT $FLTFLAGS -o $OFILE -p $OFILE.gdb $OFILE.elf || exit $?
+                       $ELF2FLT $FLTFLAGS -o "$OFILE" -p "$OFILE.gdb" "$RFILE" || exit $?
                else
-                       $ELF2FLT $FLTFLAGS -o $OFILE -r $OFILE.elf || exit $?
+                       $ELF2FLT $FLTFLAGS -o "$OFILE" -r "$RFILE" || exit $?
+               fi
+               if [ "$OBJCOPYOP" ]
+               then
+                if $OBJCOPY $OBJCOPYOP --help > /dev/null 2>&1
+                then
+                 $OBJCOPY $OBJCOPYOP "$OFILE.gdb" ||exit $?
+                else
+                 case " $OBJCOPYOP " in
+                 *" --localize-hidden "*)
+                   SYMS=`mktemp /tmp/flt-XXXXXX`
+                   $OBJDUMP --syms "$OFILE.gdb" > "$SYMS" ||exit $?
+                   sed -n 's/.*\(\.hidden\|\.internal\) \(.*\)/-L \2/p' < "$SYMS" > "$SYMS.hidden" ||exit $?
+                   if [ -s "$SYMS.hidden" ]
+                   then
+                    xargs ${VERBOSE:+-t} $OBJCOPY "$OFILE.gdb" < "$SYMS.hidden" ||exit $?
+                   fi
+                   rm -f "$SYMS" "$SYMS.hidden"
+                   ;;
+                 esac
+                 case " $OBJCOPYOP " in
+                 *" --weaken "*)
+                   $OBJCOPY --weaken "$OFILE.gdb" ||exit $?
+                   ;;
+                 esac
+                fi
                fi
-               rm -f $OFILE.elf  # not needed for any reason
+               [ "$RFILE" = "$OFILE.gdb" ] || rm -f "$RFILE"  # not needed for any reason
                rm -f "$NEWLDSCRIPT"
                exit 0
        fi
 
-       exec $LINKER -o $OFILE $ARG1
+       exec $LINKER -o "$OFILE" $ARG1
 fi
 
 #