OSDN Git Service

We renamed all the Blackfin relocs in the toolchain to match other ports
[uclinux-h8/elf2flt.git] / ld-elf2flt.in
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)       ;;                           # Ignore -s (strip)
57
58                 -shared-lib-id)
59                           shift; SHARED_ID="$1";;      # Shared library ID
60                 -shared|-G)
61                           WANT_SHARED="y";;            # Shared library
62
63                 -o)       shift; OFILE="$1";;          # the final outfile
64                 -o*)      OFILE="`expr \"$1\" : '-o\(.*\)'`";;
65
66                 -T)       shift; LDSCRIPT="$1";;       # they have a linker script
67                 -c)       shift; LDSCRIPT="$1";;
68
69                 -L)       ARG1="$ARG1 $1"              # remember search dirs
70                           shift;
71                                   ARG1="$ARG1 $1"
72                                   SDIRS="$SDIRS -L$1"
73                                   ;;
74                 -L*)      ARG1="$ARG1 $1"; SDIRS="$SDIRS $1";;
75
76                 -EB)      ARG1="$ARG1 $1"; SDIRS="$SDIRS $1";; # arm big endian
77
78                 -relax)   ;;                           # eat this for microblaze
79
80                 -r|-Ur)   FINAL=""                     # this is not a final link
81                           ARG1="$ARG1 $1"
82                                   ;;
83
84                 -v)       ARG1="$ARG1 $1"
85                                   VERBOSE="y"
86                                   ;;
87
88                 -m)       shift; EMUL="-m $1";;        # ld emulations for h8300
89                 -m*)      EMUL=$1;;
90  
91                 *)        ARG1="$ARG1 $1"
92                                   ;;
93                 esac
94                 shift
95         done
96
97         if [ "$WANT_SHARED" = "y" ]
98         then
99                 if [ -z "$SHARED_ID" ]
100                 then
101                         echo "-shared used without passing a shared library ID"
102                         exit 1
103                 fi
104         fi
105         if [ "$FINAL" = "yes" ]
106         then
107                 [ "$VERBOSE" = "y" ] && set -x
108                 ARG1="$ARG1 $FINAL_ONLY"
109                 NEWLDSCRIPT=`mktemp /tmp/flt-XXXXXX`
110                 trap 'rm -f "$NEWLDSCRIPT"' EXIT
111                 SEDOP=" -e s/^R_RODAT// -e /^W_RODAT/d"
112                 OBJCOPYOP=""
113                 if [ "$MOVDAT" ]
114                 then
115                         $LINKER -r -d -o "$OFILE.elf2flt" $ARG1  || exit $?
116                         if [ "`$OBJDUMP -h "$OFILE.elf2flt" | \
117                                         egrep -A1 '[.]rodata' | grep RELOC`" ]
118                         then
119                                 echo "warning: .rodata section contains relocations"
120                         else
121                                 SEDOP="-e /^R_RODAT/d -e s/^W_RODAT//"
122                         fi
123                 fi
124                 if [ "$SHARED_ID" ]
125                 then
126                         # Massage the linker script into something useful.  These
127                         # regexps are ugly due to some bizzare shell quoting rules.
128                         #    SEDOP="$SEDOP -e \"s/ORIGIN = 0x0,/ORIGIN = 0x${SHARED_ID}000000,/\""
129                         #    SEDOP="$SEDOP -e \"s/.text 0x0 :/.text 0x${SHARED_ID}000000 :/\""                  
130                         SEDOP="$SEDOP -e s/\\(ORIGIN.=.0\\)x0,/\\1x${SHARED_ID}000000,/"
131                         SEDOP="$SEDOP -e s/\\([.]text.0\\)x0[^0-9]:/\\1x${SHARED_ID}000000:/"
132                         
133                         if [ "$SHARED_ID" -gt 0 ]
134                         then
135                                 # Non application modules enter via main not _start
136                                 #    SEDOP="$SEDOP -e 's/ENTRY (_start)/ENTRY (main)/'"
137                                 SEDOP="$SEDOP -e s/\\(ENTRY.\\)(@SYMBOL_PREFIX@_start)/\1(lib_main)/"
138                                 OBJCOPYOP="--localize-hidden --weaken"
139                         fi
140
141                         # Provide the magic parameter that defines the library data segment pointer offset
142                         GOT_ADJ=4
143                         case "@target_cpu@" in
144                             bfin)  GOT_OFFSET="_current_shared_library_p5_offset_" GOT_ADJ=1;;
145                             h8300) GOT_OFFSET="__current_shared_library_er5_offset_";;
146                             *)     GOT_OFFSET="_current_shared_library_a5_offset_";;
147                         esac
148                         ARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -${GOT_ADJ} - ${GOT_ADJ}`"
149                 fi
150                 if [ "@emit_relocs@" = "yes" ]
151                 then
152                         SEDOP="$SEDOP -e s/^SINGLE_LINK://"
153                 else
154                         SEDOP="$SEDOP -e /^SINGLE_LINK:/d"
155                 fi
156                 if [ "@emit_ctor_dtor@" = "yes" ]
157                 then
158                         SEDOP="$SEDOP -e s/^TOR://"
159                 else
160                         SEDOP="$SEDOP -e /^TOR:/d"
161                 fi
162                 
163                 # provide a default linker script, we usually need one
164                 [ -z "$LDSCRIPT" ] && LDSCRIPT="${LDSCRIPTPATH}/elf2flt.ld"
165
166                 # if we can find the linker script we preprocess it,  otherwise
167                 # we assume the user knows what they are doing
168                 if [ -f "$LDSCRIPT" ]; then
169                         sed $SEDOP < "$LDSCRIPT" > "$NEWLDSCRIPT"
170                         LDSCRIPT="$NEWLDSCRIPT"
171                 elif [ -f "${LDSCRIPTPATH}/$LDSCRIPT" ]; then
172                         sed $SEDOP < "${LDSCRIPTPATH}/$LDSCRIPT" > "$NEWLDSCRIPT"
173                         LDSCRIPT="$NEWLDSCRIPT"
174                 elif [ -f "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" ]; then
175                         sed $SEDOP < "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" > "$NEWLDSCRIPT"
176                         LDSCRIPT="$NEWLDSCRIPT"
177                 fi
178
179                 if [ "@emit_relocs@" = "yes" ]
180                 then
181                  $LINKER $EMUL $SDIRS -T $LDSCRIPT -q -o "$OFILE.gdb" $ARG1             ||exit $?
182                  RFILE="$OFILE.gdb"
183                  FLTFLAGS="$FLTFLAGS -a"
184                 else
185                  if [ "@got_check@" = "no" ]
186                  then
187                   $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1         ||exit $?
188                   $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" $ARG1                ||exit $?
189                  else
190                   $LINKER $EMUL -r -d -o "$OFILE.elf2flt" $ARG1                          ||exit $?
191                   $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -o "$OFILE.elf" "$OFILE.elf2flt" ||exit $?
192                   $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" "$OFILE.elf2flt"     ||exit $?
193                   rm -f "$OFILE.elf2flt"
194                  fi
195                  RFILE="$OFILE.elf"
196                 fi
197                 if $NM "$OFILE.gdb" | grep _GLOBAL_OFFSET_TABLE_ > /dev/null 
198                 then
199                         $ELF2FLT $FLTFLAGS -o "$OFILE" -p "$OFILE.gdb" "$RFILE" || exit $?
200                 else
201                         $ELF2FLT $FLTFLAGS -o "$OFILE" -r "$RFILE" || exit $?
202                 fi
203                 if [ "$OBJCOPYOP" ]
204                 then
205                  if $OBJCOPY $OBJCOPYOP --help > /dev/null 2>&1
206                  then
207                   $OBJCOPY $OBJCOPYOP "$OFILE.gdb" ||exit $?
208                  else
209                   case " $OBJCOPYOP " in
210                   *" --localize-hidden "*)
211                     SYMS=`mktemp /tmp/flt-XXXXXX`
212                     $OBJDUMP --syms "$OFILE.gdb" > "$SYMS" ||exit $?
213                     sed -n 's/.*\(\.hidden\|\.internal\) \(.*\)/-L \2/p' < "$SYMS" > "$SYMS.hidden" ||exit $?
214                     if [ -s "$SYMS.hidden" ]
215                     then
216                      xargs ${VERBOSE:+-t} $OBJCOPY "$OFILE.gdb" < "$SYMS.hidden" ||exit $?
217                     fi
218                     rm -f "$SYMS" "$SYMS.hidden"
219                     ;;
220                   esac
221                   case " $OBJCOPYOP " in
222                   *" --weaken "*)
223                     $OBJCOPY --weaken "$OFILE.gdb" ||exit $?
224                     ;;
225                   esac
226                  fi
227                 fi
228                 [ "$RFILE" = "$OFILE.gdb" ] || rm -f "$RFILE"  # not needed for any reason
229                 exit 0
230         fi
231
232         exec $LINKER -o "$OFILE" $ARG1
233 fi
234
235 #
236 # otherwise pretend we aren't here
237 #
238
239 exec $LINKER "$@"