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
12 # This is Free Software, under the GNU Public Licence v2 or greater.
15 LINKER="$0.real" # the original renamed-linker
16 ELF2FLT="`expr $0 : '\(.*\)ld'`elf2flt"
17 NM="`expr $0 : '\(.*\)ld'`nm"
18 TOOLDIR="`dirname $0`" # let gcc find the tools for us
19 OBJCOPY="`expr $0 : '\(.*\)ld'`objcopy"
20 [ -f "$OBJCOPY" ] || OBJCOPY="$TOOLDIR/../../bin/@target_alias@-objcopy"
21 OBJDUMP="`expr $OBJCOPY : '\(.*\)objcopy'`objdump"
22 LDSCRIPTPATH="@binutils_ldscript_dir@" # and the scripts
27 # check TOOLDIR from prefix/bin/ or prefix/target-alias/bin/
28 [ -d "${LDSCRIPTPATH}" ] || LDSCRIPTPATH="${TOOLDIR}/../lib"
31 # if we have the elf2flt options, run it
34 if expr "$*" : ".*-elf2flt.*" > /dev/null
51 -elf2flt) ;; # we already know this
52 -elf2flt*)FLTFLAGS="`expr \"$1\" : '-elf2flt=\(.*\)'` $FLTFLAGS";;
55 MOVDAT="y";; # Put rodata in ROM if possible
56 -s|-S|--strip-all|--strip-debug)
57 ;; # Ignore strip flags
60 shift; SHARED_ID="$1";; # Shared library ID
62 WANT_SHARED="y";; # Shared library
64 -o) shift; OFILE="$1";; # the final outfile
65 -o*) OFILE="`expr \"$1\" : '-o\(.*\)'`";;
67 -T) shift; LDSCRIPT="$1";; # they have a linker script
68 -c) shift; LDSCRIPT="$1";;
70 -L) ARG1="$ARG1 $1" # remember search dirs
75 -L*) ARG1="$ARG1 $1"; SDIRS="$SDIRS $1";;
77 -EB) ARG1="$ARG1 $1"; SDIRS="$SDIRS $1";; # arm big endian
79 -relax) ;; # eat this for microblaze
81 -r|-Ur) FINAL="" # this is not a final link
90 -m) shift; EMUL="-m $1";; # ld emulations for h8300
99 if [ "$WANT_SHARED" = "y" ]
101 if [ -z "$SHARED_ID" ]
103 echo "-shared used without passing a shared library ID"
107 if [ "$FINAL" = "yes" ]
109 [ "$VERBOSE" = "y" ] && set -x
110 ARG1="$ARG1 $FINAL_ONLY"
111 NEWLDSCRIPT=`mktemp /tmp/flt-XXXXXX`
112 trap 'rm -f "$NEWLDSCRIPT"' EXIT
113 SEDOP=" -e s/^R_RODAT// -e /^W_RODAT/d"
117 $LINKER -r -d -o "$OFILE.elf2flt" $ARG1 || exit $?
118 if [ "`$OBJDUMP -h "$OFILE.elf2flt" | \
119 egrep -A1 '[.]rodata' | grep RELOC`" ]
121 echo "warning: .rodata section contains relocations"
123 SEDOP="-e /^R_RODAT/d -e s/^W_RODAT//"
128 # Massage the linker script into something useful. These
129 # regexps are ugly due to some bizzare shell quoting rules.
130 # SEDOP="$SEDOP -e \"s/ORIGIN = 0x0,/ORIGIN = 0x${SHARED_ID}000000,/\""
131 # SEDOP="$SEDOP -e \"s/.text 0x0 :/.text 0x${SHARED_ID}000000 :/\""
132 SEDOP="$SEDOP -e s/\\(ORIGIN.=.0\\)x0,/\\1x${SHARED_ID}000000,/"
133 SEDOP="$SEDOP -e s/\\([.]text.0\\)x0[^0-9]:/\\1x${SHARED_ID}000000:/"
135 if [ "$SHARED_ID" -gt 0 ]
137 # Non application modules enter via main not _start
138 # SEDOP="$SEDOP -e 's/ENTRY (_start)/ENTRY (main)/'"
139 SEDOP="$SEDOP -e s/\\(ENTRY.\\)(@SYMBOL_PREFIX@_start)/\1(lib_main)/"
140 OBJCOPYOP="--localize-hidden --weaken"
143 # Provide the magic parameter that defines the library data segment pointer offset
145 case "@target_cpu@" in
146 bfin) GOT_OFFSET="_current_shared_library_p5_offset_" GOT_ADJ=1;;
147 h8300) GOT_OFFSET="__current_shared_library_er5_offset_";;
148 *) GOT_OFFSET="_current_shared_library_a5_offset_";;
150 ARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -${GOT_ADJ} - ${GOT_ADJ}`"
152 if [ "@emit_relocs@" = "1" ]
154 SEDOP="$SEDOP -e s/^SINGLE_LINK://"
156 SEDOP="$SEDOP -e /^SINGLE_LINK:/d"
158 if [ "@emit_ctor_dtor@" = "1" ]
160 SEDOP="$SEDOP -e s/^TOR://"
162 SEDOP="$SEDOP -e /^TOR:/d"
165 # provide a default linker script, we usually need one
166 [ -z "$LDSCRIPT" ] && LDSCRIPT="${LDSCRIPTPATH}/elf2flt.ld"
168 # if we can find the linker script we preprocess it, otherwise
169 # we assume the user knows what they are doing
170 if [ -f "$LDSCRIPT" ]; then
171 sed $SEDOP < "$LDSCRIPT" > "$NEWLDSCRIPT"
172 LDSCRIPT="$NEWLDSCRIPT"
173 elif [ -f "${LDSCRIPTPATH}/$LDSCRIPT" ]; then
174 sed $SEDOP < "${LDSCRIPTPATH}/$LDSCRIPT" > "$NEWLDSCRIPT"
175 LDSCRIPT="$NEWLDSCRIPT"
176 elif [ -f "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" ]; then
177 sed $SEDOP < "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" > "$NEWLDSCRIPT"
178 LDSCRIPT="$NEWLDSCRIPT"
181 if [ "@emit_relocs@" = "1" ]
183 $LINKER $EMUL $SDIRS -T $LDSCRIPT -q -o "$OFILE.gdb" $ARG1 ||exit $?
185 FLTFLAGS="$FLTFLAGS -a"
187 if [ "@got_check@" = "0" ]
189 $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1 ||exit $?
190 $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" $ARG1 ||exit $?
192 $LINKER $EMUL -r -d -o "$OFILE.elf2flt" $ARG1 ||exit $?
193 $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -o "$OFILE.elf" "$OFILE.elf2flt" ||exit $?
194 $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" "$OFILE.elf2flt" ||exit $?
195 rm -f "$OFILE.elf2flt"
199 if $NM "$OFILE.gdb" | grep _GLOBAL_OFFSET_TABLE_ > /dev/null
201 $ELF2FLT $FLTFLAGS -o "$OFILE" -p "$OFILE.gdb" "$RFILE" || exit $?
203 $ELF2FLT $FLTFLAGS -o "$OFILE" -r "$RFILE" || exit $?
207 if $OBJCOPY $OBJCOPYOP --help > /dev/null 2>&1
209 $OBJCOPY $OBJCOPYOP "$OFILE.gdb" ||exit $?
211 case " $OBJCOPYOP " in
212 *" --localize-hidden "*)
213 SYMS=`mktemp /tmp/flt-XXXXXX`
214 $OBJDUMP --syms "$OFILE.gdb" > "$SYMS" ||exit $?
215 sed -n 's/.*\(\.hidden\|\.internal\) \(.*\)/-L \2/p' < "$SYMS" > "$SYMS.hidden" ||exit $?
216 if [ -s "$SYMS.hidden" ]
218 xargs ${VERBOSE:+-t} $OBJCOPY "$OFILE.gdb" < "$SYMS.hidden" ||exit $?
220 rm -f "$SYMS" "$SYMS.hidden"
223 case " $OBJCOPYOP " in
225 $OBJCOPY --weaken "$OFILE.gdb" ||exit $?
230 [ "$RFILE" = "$OFILE.gdb" ] || rm -f "$RFILE" # not needed for any reason
234 exec $LINKER -o "$OFILE" $ARG1
238 # otherwise pretend we aren't here