OSDN Git Service

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