3 # allow us to do flat processing if the flag -Wl,-elf2flt or -elf2flt to
4 # the 'C' compiler or linker respectively
6 # uses the env. var FLTFLAGS as extra parameters to pass to elf2flt
7 # arguments given like -Wl,-elf2flt="-b 10000 -v" are given before FLTFLAGS
9 # Copyright (C) 2002,2003 David McCullough <davidm@snapgear.com>
10 # Copyright (C) 2000, Lineo. davidm@lineo.com
13 LINKER="$0.real" # the original renamed-linker
14 ELF2FLT="`expr $0 : '\(.*\)ld'`elf2flt"
15 TOOLDIR="`dirname $0`" # let gcc find the tools for us
16 LDSCRIPTPATH="${TOOLDIR}/../@target_alias@/lib" # and the scripts
20 # check TOOLDIR from prefix/bin/ or prefix/target-alias/bin/
21 [ -d "${TOOLDIR}/../@target_alias@/lib" ] || LDSCRIPTPATH="${TOOLDIR}/../lib"
24 # if we have the elf2flt options, run it
27 if expr "$*" : ".*-elf2flt.*" > /dev/null
44 -elf2flt) ;; # we already know this
45 -elf2flt*)FLTFLAGS="`expr \"$1\" : '-elf2flt=\(.*\)'` $FLTFLAGS";;
48 MOVDAT="y";; # Put rodata in ROM if possible
51 shift; SHARED_ID="$1";; # Shared library ID
53 -o) shift; OFILE="$1";; # the final outfile
54 -o*) OFILE="`expr \"$1\" : '-o\(.*\)'`";;
56 -T) shift; LDSCRIPT="$1";; # they have a linker script
57 -c) shift; LDSCRIPT="$1";;
59 -L) ARG1="$ARG1 $1" # remember search dirs
64 -L*) ARG1="$ARG1 $1"; SDIRS="$SDIRS $1";;
66 -EB) ARG1="$ARG1 $1"; SDIRS="$SDIRS $1";; # arm big endian
68 -relax) ;; # eat this for microblaze
70 -r|-Ur) FINAL="" # this is not a final link
78 -m) shift; EMUL="-m $1";; # ld emulations for h8300
87 if [ "$FINAL" = "yes" ]
89 [ "$VERBOSE" = "y" ] && set -x
90 ARG1="$ARG1 $FINAL_ONLY"
91 NEWLDSCRIPT=`mktemp /tmp/flt-XXXXXX`
92 SEDOP=" -e s/^R_RODAT// -e /^W_RODAT/d"
95 $LINKER -r -d -o "$OFILE.elf2flt" $ARG1 || exit $?
96 if [ "`@target_alias@-objdump -h "$OFILE.elf2flt" | \
97 egrep -A1 '[.]rodata' | grep RELOC`" ]
99 echo "warning: .rodata section contains relocations"
101 SEDOP="-e /^R_RODAT/d -e s/^W_RODAT//"
106 # Massage the linker script into something useful. These
107 # regexps are ugly due to some bizzare shell quoting rules.
108 # SEDOP="$SEDOP -e \"s/ORIGIN = 0x0,/ORIGIN = 0x${SHARED_ID}000000,/\""
109 # SEDOP="$SEDOP -e \"s/.text 0x0 :/.text 0x${SHARED_ID}000000 :/\""
110 SEDOP="$SEDOP -e s/\\(ORIGIN.=.0\\)x0,/\\1x${SHARED_ID}000000,/"
111 SEDOP="$SEDOP -e s/\\([.]text.0\\)x0[^0-9]:/\\1x${SHARED_ID}000000:/"
113 if [ "$SHARED_ID" -gt 0 ]
115 # Non application modules enter via main not _start
116 # SEDOP="$SEDOP -e 's/ENTRY (_start)/ENTRY (main)/'"
117 SEDOP="$SEDOP -e s/\\(ENTRY.\\)(_start)/\1(lib_main)/"
120 # Provide the magic parameter that defines the library data segment pointer offset
121 case "@target_cpu@" in
122 h8300) GOT_OFFSET="__current_shared_library_er5_offset_";;
123 *) GOT_OFFSET="_current_shared_library_a5_offset_";;
125 ARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -4 - 4`"
128 # provide a default linker script, we usually need one
129 [ -z "$LDSCRIPT" ] && LDSCRIPT="${LDSCRIPTPATH}/elf2flt.ld"
131 # if we can find the linker script we preprocess it, otherwise
132 # we assume the user knows what they are doing
133 if [ -f "$LDSCRIPT" ]; then
134 sed $SEDOP < "$LDSCRIPT" > "$NEWLDSCRIPT"
135 LDSCRIPT="$NEWLDSCRIPT"
136 elif [ -f "${LDSCRIPTPATH}/$LDSCRIPT" ]; then
137 sed $SEDOP < "${LDSCRIPTPATH}/$LDSCRIPT" > "$NEWLDSCRIPT"
138 LDSCRIPT="$NEWLDSCRIPT"
139 elif [ -f "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" ]; then
140 sed $SEDOP < "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" > "$NEWLDSCRIPT"
141 LDSCRIPT="$NEWLDSCRIPT"
144 if [ "@got_check@" = "no" ]
146 $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1 ||exit $?
147 $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" $ARG1 ||exit $?
149 $LINKER $EMUL -r -d -o "$OFILE.elf2flt" $ARG1 ||exit $?
150 $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -o "$OFILE.elf" "$OFILE.elf2flt" ||exit $?
151 $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" "$OFILE.elf2flt" ||exit $?
152 rm -f "$OFILE.elf2flt"
154 if grep _GLOBAL_OFFSET_TABLE_ "$OFILE.gdb" > /dev/null
156 $ELF2FLT $FLTFLAGS -o "$OFILE" -p "$OFILE.gdb" "$OFILE.elf" || exit $?
158 $ELF2FLT $FLTFLAGS -o "$OFILE" -r "$OFILE.elf" || exit $?
160 rm -f "$OFILE.elf" # not needed for any reason
165 exec $LINKER -o "$OFILE" $ARG1
169 # otherwise pretend we aren't here