X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=ld-elf2flt.in;h=b876636007ff38ab701ca2ed2a4b14438b5974ff;hb=611388043de23ea9b5e6fad4843e372961b90b3a;hp=17c77512e706ad7fad4b8aee946c480c645e52bd;hpb=fd884771c3807742e938a9b9e012e325c97f0817;p=uclinux-h8%2Felf2flt.git diff --git a/ld-elf2flt.in b/ld-elf2flt.in index 17c7751..b876636 100644 --- a/ld-elf2flt.in +++ b/ld-elf2flt.in @@ -9,13 +9,23 @@ # Copyright (C) 2002,2003 David McCullough # 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,13 +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 @@ -60,12 +71,19 @@ then -EB) ARG1="$ARG1 $1"; SDIRS="$SDIRS $1";; # arm big endian - -relax) FINAL_ONLY="$FINAL_ONLY $1" ;; + -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 @@ -74,13 +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" @@ -102,50 +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 - if [ "@got_check@" = "no" ] + if [ "@emit_relocs@" = "yes" ] then - $LINKER $SDIRS -T $LDSCRIPT -Ur -d -o $OFILE.elf $ARG1 ||exit $? - $LINKER $SDIRS -T $LDSCRIPT -o $OFILE.gdb $ARG1 ||exit $? + $LINKER $EMUL $SDIRS -T $LDSCRIPT -q -o "$OFILE.gdb" $ARG1 ||exit $? + RFILE="$OFILE.gdb" + FLTFLAGS="$FLTFLAGS -a" else - $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 [ "@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 grep _GLOBAL_OFFSET_TABLE_ $OFILE.gdb > /dev/null + 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 #