X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;ds=sidebyside;f=ld-elf2flt.in;h=91e1ccbea2d084d92faf7582b687c6d1c037fcce;hb=58db8b98127213c0e07099066ea86def52caee48;hp=778ea0d2a2a9323b67fefde370ba52965e173980;hpb=22effd1ea2b2ce421721f6fdf2129ecce94bc08b;p=uclinux-h8%2Felf2flt.git diff --git a/ld-elf2flt.in b/ld-elf2flt.in index 778ea0d..91e1ccb 100644 --- a/ld-elf2flt.in +++ b/ld-elf2flt.in @@ -16,9 +16,13 @@ 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="" +WANT_SHARED="" # check TOOLDIR from prefix/bin/ or prefix/target-alias/bin/ [ -d "${LDSCRIPTPATH}" ] || LDSCRIPTPATH="${TOOLDIR}/../lib" @@ -49,9 +53,12 @@ then -move-rodata) MOVDAT="y";; # Put rodata in ROM if possible - + -s) ;; # Ignore -s (strip) + -shared-lib-id) shift; SHARED_ID="$1";; # Shared library ID + -shared|-G) + WANT_SHARED="y";; # Shared library -o) shift; OFILE="$1";; # the final outfile -o*) OFILE="`expr \"$1\" : '-o\(.*\)'`";; @@ -87,16 +94,26 @@ then shift done + if [ "$WANT_SHARED" = "y" ] + then + if [ -z "$SHARED_ID" ] + then + echo "-shared used without passing a shared library ID" + exit 1 + fi + fi if [ "$FINAL" = "yes" ] then [ "$VERBOSE" = "y" ] && set -x ARG1="$ARG1 $FINAL_ONLY" NEWLDSCRIPT=`mktemp /tmp/flt-XXXXXX` + trap 'rm -f "$NEWLDSCRIPT"' EXIT 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" @@ -117,15 +134,30 @@ then 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)/" + SEDOP="$SEDOP -e s/\\(ENTRY.\\)(@SYMBOL_PREFIX@_start)/\1(lib_main)/" + OBJCOPYOP="--localize-hidden --weaken" fi # Provide the magic parameter that defines the library data segment pointer offset + GOT_ADJ=4 case "@target_cpu@" in + bfin) GOT_OFFSET="_current_shared_library_p5_offset_" GOT_ADJ=1;; 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`" + ARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -${GOT_ADJ} - ${GOT_ADJ}`" + fi + if [ "@emit_relocs@" = "yes" ] + then + SEDOP="$SEDOP -e s/^SINGLE_LINK://" + else + SEDOP="$SEDOP -e /^SINGLE_LINK:/d" + fi + if [ "@emit_ctor_dtor@" = "yes" ] + then + SEDOP="$SEDOP -e s/^TOR://" + else + SEDOP="$SEDOP -e /^TOR:/d" fi # provide a default linker script, we usually need one @@ -144,24 +176,56 @@ then LDSCRIPT="$NEWLDSCRIPT" fi - if [ "@got_check@" = "no" ] + if [ "@emit_relocs@" = "yes" ] then - $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1 ||exit $? - $LINKER $EMUL $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 $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" + 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 - rm -f "$NEWLDSCRIPT" + [ "$RFILE" = "$OFILE.gdb" ] || rm -f "$RFILE" # not needed for any reason exit 0 fi