X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=ld-elf2flt.in;h=b876636007ff38ab701ca2ed2a4b14438b5974ff;hb=611388043de23ea9b5e6fad4843e372961b90b3a;hp=ab5d44868beac51d87a9eccf228e3618b23bc98b;hpb=4514b68c7cc742b3c4a5c001cfcf2e9286a1aec6;p=uclinux-h8%2Felf2flt.git diff --git a/ld-elf2flt.in b/ld-elf2flt.in index ab5d448..b876636 100644 --- a/ld-elf2flt.in +++ b/ld-elf2flt.in @@ -9,14 +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 -LDSCRIPTPATH="${TOOLDIR}/../@target_alias@/lib" # and the scripts +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 # @@ -72,6 +81,9 @@ then VERBOSE="y" ;; + -m) shift; EMUL="-m $1";; # ld emulations for h8300 + -m*) EMUL=$1;; + *) ARG1="$ARG1 $1" ;; esac @@ -84,10 +96,11 @@ then 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" | \ + if [ "`$OBJDUMP -h "$OFILE.elf2flt" | \ egrep -A1 '[.]rodata' | grep RELOC`" ] then echo "warning: .rodata section contains relocations" @@ -109,10 +122,21 @@ 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 @@ -131,23 +155,56 @@ then 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