Blame | Last modification | View Log | RSS feed
#!/bin/sh## allow us to do flat processing if the flag -Wl,-elf2flt or -elf2flt to# the 'C' compiler or linker respectively## uses the env. var FLTFLAGS as extra parameters to pass to elf2flt# arguments given like -Wl,-elf2flt="-b 10000 -v" are given before FLTFLAGS## 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-linkerELF2FLT="`expr $0 : '\(.*\)ld'`elf2flt"NM="`expr $0 : '\(.*\)ld'`nm"TOOLDIR="`dirname $0`" # let gcc find the tools for usOBJCOPY="`expr $0 : '\(.*\)ld'`objcopy"[ -f "$OBJCOPY" ] || OBJCOPY="$TOOLDIR/../../bin/@target_alias@-objcopy"OBJDUMP="`expr $OBJCOPY : '\(.*\)objcopy'`objdump"LDSCRIPTPATH="@binutils_ldscript_dir@" # and the scriptsSHARED_ID=""NEWLDSCRIPT=""WANT_SHARED=""# check TOOLDIR from prefix/bin/ or prefix/target-alias/bin/[ -d "${LDSCRIPTPATH}" ] || LDSCRIPTPATH="${TOOLDIR}/../lib"## if we have the elf2flt options, run it#if expr "$*" : ".*-elf2flt.*" > /dev/nullthenARG1=ARG2=OFILE="a.out"PIC=SDIRS=LDSCRIPT=FINAL="yes"FINAL_ONLY=MOVDAT=VERBOSE=while [ $# -ne 0 ]docase "$1" in-elf2flt) ;; # we already know this-elf2flt*)FLTFLAGS="`expr \"$1\" : '-elf2flt=\(.*\)'` $FLTFLAGS";;-move-rodata)MOVDAT="y";; # Put rodata in ROM if possible-s|-S|--strip-all|--strip-debug);; # Ignore strip flags-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\(.*\)'`";;-T) shift; LDSCRIPT="$1";; # they have a linker script-c) shift; LDSCRIPT="$1";;-L) ARG1="$ARG1 $1" # remember search dirsshift;ARG1="$ARG1 $1"SDIRS="$SDIRS -L$1";;-L*) ARG1="$ARG1 $1"; SDIRS="$SDIRS $1";;-EB) ARG1="$ARG1 $1"; SDIRS="$SDIRS $1";; # arm big endian-relax) ;; # eat this for microblaze-r|-Ur) FINAL="" # this is not a final linkARG1="$ARG1 $1";;-v|--verbose)ARG1="$ARG1 $1"VERBOSE="y";;-m) shift; EMUL="-m $1";; # ld emulations for h8300-m*) EMUL=$1;;*) ARG1="$ARG1 $1";;esacshiftdoneif [ "$WANT_SHARED" = "y" ]thenif [ -z "$SHARED_ID" ]thenecho "-shared used without passing a shared library ID"exit 1fifiif [ "$FINAL" = "yes" ]then[ "$VERBOSE" = "y" ] && set -xARG1="$ARG1 $FINAL_ONLY"NEWLDSCRIPT=`mktemp /tmp/flt-XXXXXX`trap 'rm -f "$NEWLDSCRIPT"' EXITSEDOP=" -e s/^R_RODAT// -e /^W_RODAT/d"OBJCOPYOP=""if [ "$MOVDAT" ]then$LINKER -r -d -o "$OFILE.elf2flt" $ARG1 || exit $?if [ "`$OBJDUMP -h "$OFILE.elf2flt" | \egrep -A1 '[.]rodata' | grep RELOC`" ]thenecho "warning: .rodata section contains relocations"elseSEDOP="-e /^R_RODAT/d -e s/^W_RODAT//"fifiif [ "$SHARED_ID" ]then# Massage the linker script into something useful. These# regexps are ugly due to some bizzare shell quoting rules.# SEDOP="$SEDOP -e \"s/ORIGIN = 0x0,/ORIGIN = 0x${SHARED_ID}000000,/\""# SEDOP="$SEDOP -e \"s/.text 0x0 :/.text 0x${SHARED_ID}000000 :/\""SEDOP="$SEDOP -e s/\\(ORIGIN.=.0\\)x0,/\\1x${SHARED_ID}000000,/"SEDOP="$SEDOP -e s/\\([.]text.0\\)x0[^0-9]:/\\1x${SHARED_ID}000000:/"if [ "$SHARED_ID" -gt 0 ]then# Non application modules enter via main not _start# SEDOP="$SEDOP -e 's/ENTRY (_start)/ENTRY (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 offsetGOT_ADJ=4case "@target_cpu@" inbfin) 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_";;esacARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -${GOT_ADJ} - ${GOT_ADJ}`"fiif [ "@emit_relocs@" = "1" ]thenSEDOP="$SEDOP -e s/^SINGLE_LINK://"elseSEDOP="$SEDOP -e /^SINGLE_LINK:/d"fiif [ "@emit_ctor_dtor@" = "1" ]thenSEDOP="$SEDOP -e s/^TOR://"elseSEDOP="$SEDOP -e /^TOR:/d"fi# provide a default linker script, we usually need one[ -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 doingif [ -f "$LDSCRIPT" ]; thensed $SEDOP < "$LDSCRIPT" > "$NEWLDSCRIPT"LDSCRIPT="$NEWLDSCRIPT"elif [ -f "${LDSCRIPTPATH}/$LDSCRIPT" ]; thensed $SEDOP < "${LDSCRIPTPATH}/$LDSCRIPT" > "$NEWLDSCRIPT"LDSCRIPT="$NEWLDSCRIPT"elif [ -f "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" ]; thensed $SEDOP < "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" > "$NEWLDSCRIPT"LDSCRIPT="$NEWLDSCRIPT"fiif [ "@emit_relocs@" = "1" ]then$LINKER $EMUL $SDIRS -T $LDSCRIPT -q -o "$OFILE.gdb" $ARG1 ||exit $?RFILE="$OFILE.gdb"FLTFLAGS="$FLTFLAGS -a"elseif [ "@got_check@" = "0" ]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"fiRFILE="$OFILE.elf"fiif $NM "$OFILE.gdb" | grep _GLOBAL_OFFSET_TABLE_ > /dev/nullthen$ELF2FLT $FLTFLAGS -o "$OFILE" -p "$OFILE.gdb" "$RFILE" || exit $?else$ELF2FLT $FLTFLAGS -o "$OFILE" -r "$RFILE" || exit $?fiif [ "$OBJCOPYOP" ]thenif $OBJCOPY $OBJCOPYOP --help > /dev/null 2>&1then$OBJCOPY $OBJCOPYOP "$OFILE.gdb" ||exit $?elsecase " $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" ]thenxargs ${VERBOSE:+-t} $OBJCOPY "$OFILE.gdb" < "$SYMS.hidden" ||exit $?firm -f "$SYMS" "$SYMS.hidden";;esaccase " $OBJCOPYOP " in*" --weaken "*)$OBJCOPY --weaken "$OFILE.gdb" ||exit $?;;esacfifi[ "$RFILE" = "$OFILE.gdb" ] || rm -f "$RFILE" # not needed for any reasonexit 0fiexec $LINKER -o "$OFILE" $ARG1fi## otherwise pretend we aren't here#exec $LINKER "$@"