Subversion Repositories freemyipod

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
445 theseven 1
#!/bin/sh
2
#
3
# allow us to do flat processing if the flag -Wl,-elf2flt or -elf2flt to
4
# the 'C' compiler or linker respectively
5
#
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
8
#
9
# Copyright (C) 2002,2003 David McCullough <davidm@snapgear.com>
10
# Copyright (C) 2000, Lineo. davidm@lineo.com
11
#
12
# This is Free Software, under the GNU Public Licence v2 or greater.
13
#
14
 
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
23
SHARED_ID=""
24
NEWLDSCRIPT=""
25
WANT_SHARED=""
26
 
27
# check TOOLDIR from prefix/bin/ or prefix/target-alias/bin/
28
[ -d "${LDSCRIPTPATH}" ] || LDSCRIPTPATH="${TOOLDIR}/../lib"
29
 
30
#
31
# if we have the elf2flt options, run it
32
#
33
 
34
if expr "$*" : ".*-elf2flt.*" > /dev/null
35
then
36
	ARG1=
37
	ARG2=
38
	OFILE="a.out"
39
	PIC=
40
	SDIRS=
41
	LDSCRIPT=
42
	FINAL="yes"
43
	FINAL_ONLY=
44
	MOVDAT=
45
	VERBOSE=
46
 
47
	while [ $# -ne 0 ]
48
	do
49
		case "$1" in
50
 
51
		-elf2flt) ;;                           # we already know this
52
		-elf2flt*)FLTFLAGS="`expr \"$1\" : '-elf2flt=\(.*\)'` $FLTFLAGS";; 
53
 
54
		-move-rodata)
55
		          MOVDAT="y";;                 # Put rodata in ROM if possible
56
		-s|-S|--strip-all|--strip-debug)
57
		          ;;                           # Ignore strip flags
58
 
59
		-shared-lib-id)
60
		          shift; SHARED_ID="$1";;      # Shared library ID
61
		-shared|-G)
62
		          WANT_SHARED="y";;            # Shared library
63
 
64
		-o)       shift; OFILE="$1";;          # the final outfile
65
		-o*)      OFILE="`expr \"$1\" : '-o\(.*\)'`";;
66
 
67
		-T)       shift; LDSCRIPT="$1";;       # they have a linker script
68
		-c)       shift; LDSCRIPT="$1";;
69
 
70
		-L)       ARG1="$ARG1 $1"              # remember search dirs
71
		          shift;
72
				  ARG1="$ARG1 $1"
73
				  SDIRS="$SDIRS -L$1"
74
				  ;;
75
		-L*)      ARG1="$ARG1 $1"; SDIRS="$SDIRS $1";;
76
 
77
		-EB)      ARG1="$ARG1 $1"; SDIRS="$SDIRS $1";; # arm big endian
78
 
79
		-relax)   ;;                           # eat this for microblaze
80
 
81
		-r|-Ur)   FINAL=""                     # this is not a final link
82
		          ARG1="$ARG1 $1"
83
				  ;;
84
 
85
		-v|--verbose)
86
				  ARG1="$ARG1 $1"
87
				  VERBOSE="y"
88
				  ;;
89
 
90
		-m)       shift; EMUL="-m $1";;        # ld emulations for h8300
91
		-m*)      EMUL=$1;;
92
 
93
		*)        ARG1="$ARG1 $1"
94
				  ;;
95
		esac
96
		shift
97
	done
98
 
99
	if [ "$WANT_SHARED" = "y" ]
100
	then
101
		if [ -z "$SHARED_ID" ]
102
		then
103
			echo "-shared used without passing a shared library ID"
104
			exit 1
105
		fi
106
	fi
107
	if [ "$FINAL" = "yes" ]
108
	then
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"
114
		OBJCOPYOP=""
115
		if [ "$MOVDAT" ]
116
		then
117
			$LINKER -r -d -o "$OFILE.elf2flt" $ARG1  || exit $?
118
			if [ "`$OBJDUMP -h "$OFILE.elf2flt" | \
119
					egrep -A1 '[.]rodata' | grep RELOC`" ]
120
			then
121
				echo "warning: .rodata section contains relocations"
122
			else
123
				SEDOP="-e /^R_RODAT/d -e s/^W_RODAT//"
124
			fi
125
		fi
126
		if [ "$SHARED_ID" ]
127
		then
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:/"
134
 
135
			if [ "$SHARED_ID" -gt 0 ]
136
			then
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"
141
			fi
142
 
143
			# Provide the magic parameter that defines the library data segment pointer offset
144
			GOT_ADJ=4
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_";;
149
			esac
150
			ARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -${GOT_ADJ} - ${GOT_ADJ}`"
151
		fi
152
		if [ "@emit_relocs@" = "1" ]
153
		then
154
			SEDOP="$SEDOP -e s/^SINGLE_LINK://"
155
		else
156
			SEDOP="$SEDOP -e /^SINGLE_LINK:/d"
157
		fi
158
		if [ "@emit_ctor_dtor@" = "1" ]
159
		then
160
			SEDOP="$SEDOP -e s/^TOR://"
161
		else
162
			SEDOP="$SEDOP -e /^TOR:/d"
163
		fi
164
 
165
		# provide a default linker script, we usually need one
166
		[ -z "$LDSCRIPT" ] && LDSCRIPT="${LDSCRIPTPATH}/elf2flt.ld"
167
 
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"
179
		fi
180
 
181
		if [ "@emit_relocs@" = "1" ]
182
		then
183
		 $LINKER $EMUL $SDIRS -T $LDSCRIPT -q -o "$OFILE.gdb" $ARG1             ||exit $?
184
		 RFILE="$OFILE.gdb"
185
		 FLTFLAGS="$FLTFLAGS -a"
186
		else
187
		 if [ "@got_check@" = "0" ]
188
		 then
189
		  $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1         ||exit $?
190
		  $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" $ARG1                ||exit $?
191
		 else
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"
196
		 fi
197
		 RFILE="$OFILE.elf"
198
		fi
199
		if $NM "$OFILE.gdb" | grep _GLOBAL_OFFSET_TABLE_ > /dev/null 
200
		then
201
			$ELF2FLT $FLTFLAGS -o "$OFILE" -p "$OFILE.gdb" "$RFILE" || exit $?
202
		else
203
			$ELF2FLT $FLTFLAGS -o "$OFILE" -r "$RFILE" || exit $?
204
		fi
205
		if [ "$OBJCOPYOP" ]
206
		then
207
		 if $OBJCOPY $OBJCOPYOP --help > /dev/null 2>&1
208
		 then
209
		  $OBJCOPY $OBJCOPYOP "$OFILE.gdb" ||exit $?
210
		 else
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" ]
217
		    then
218
		     xargs ${VERBOSE:+-t} $OBJCOPY "$OFILE.gdb" < "$SYMS.hidden" ||exit $?
219
		    fi
220
		    rm -f "$SYMS" "$SYMS.hidden"
221
		    ;;
222
		  esac
223
		  case " $OBJCOPYOP " in
224
		  *" --weaken "*)
225
		    $OBJCOPY --weaken "$OFILE.gdb" ||exit $?
226
		    ;;
227
		  esac
228
		 fi
229
		fi
230
		[ "$RFILE" = "$OFILE.gdb" ] || rm -f "$RFILE"  # not needed for any reason
231
		exit 0
232
	fi
233
 
234
	exec $LINKER -o "$OFILE" $ARG1
235
fi
236
 
237
#
238
# otherwise pretend we aren't here
239
#
240
 
241
exec $LINKER "$@"