OSDN Git Service

GCC properly provides CTOR/DTOR END/LIST symbols already via the normal
[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                 SEDOP=" -e s/^R_RODAT// -e /^W_RODAT/d"
111                 OBJCOPYOP=""
112                 if [ "$MOVDAT" ]
113                 then
114                         $LINKER -r -d -o "$OFILE.elf2flt" $ARG1  || exit $?
115                         if [ "`$OBJDUMP -h "$OFILE.elf2flt" | \
116                                         egrep -A1 '[.]rodata' | grep RELOC`" ]
117                         then
118                                 echo "warning: .rodata section contains relocations"
119                         else
120                                 SEDOP="-e /^R_RODAT/d -e s/^W_RODAT//"
121                         fi
122                 fi
123                 if [ "$SHARED_ID" ]
124                 then
125                         # Massage the linker script into something useful.  These
126                         # regexps are ugly due to some bizzare shell quoting rules.
127                         #    SEDOP="$SEDOP -e \"s/ORIGIN = 0x0,/ORIGIN = 0x${SHARED_ID}000000,/\""
128                         #    SEDOP="$SEDOP -e \"s/.text 0x0 :/.text 0x${SHARED_ID}000000 :/\""                  
129                         SEDOP="$SEDOP -e s/\\(ORIGIN.=.0\\)x0,/\\1x${SHARED_ID}000000,/"
130                         SEDOP="$SEDOP -e s/\\([.]text.0\\)x0[^0-9]:/\\1x${SHARED_ID}000000:/"
131                         
132                         if [ "$SHARED_ID" -gt 0 ]
133                         then
134                                 # Non application modules enter via main not _start
135                                 #    SEDOP="$SEDOP -e 's/ENTRY (_start)/ENTRY (main)/'"
136                                 SEDOP="$SEDOP -e s/\\(ENTRY.\\)(@SYMBOL_PREFIX@_start)/\1(lib_main)/"
137                                 OBJCOPYOP="--localize-hidden --weaken"
138                         fi
139
140                         # Provide the magic parameter that defines the library data segment pointer offset
141                         GOT_ADJ=4
142                         case "@target_cpu@" in
143                             bfin)  GOT_OFFSET="_current_shared_library_p5_offset_" GOT_ADJ=1;;
144                             h8300) GOT_OFFSET="__current_shared_library_er5_offset_";;
145                             *)     GOT_OFFSET="_current_shared_library_a5_offset_";;
146                         esac
147                         ARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -${GOT_ADJ} - ${GOT_ADJ}`"
148                 fi
149                 if [ "@emit_relocs@" = "yes" ]
150                 then
151                         SEDOP="$SEDOP -e s/^SINGLE_LINK://"
152                 else
153                         SEDOP="$SEDOP -e /^SINGLE_LINK:/d"
154                 fi
155                 if [ "@emit_ctor_dtor@" = "yes" ]
156                 then
157                         SEDOP="$SEDOP -e s/^TOR://"
158                 else
159                         SEDOP="$SEDOP -e /^TOR:/d"
160                 fi
161                 
162                 # provide a default linker script, we usually need one
163                 [ -z "$LDSCRIPT" ] && LDSCRIPT="${LDSCRIPTPATH}/elf2flt.ld"
164
165                 # if we can find the linker script we preprocess it,  otherwise
166                 # we assume the user knows what they are doing
167                 if [ -f "$LDSCRIPT" ]; then
168                         sed $SEDOP < "$LDSCRIPT" > "$NEWLDSCRIPT"
169                         LDSCRIPT="$NEWLDSCRIPT"
170                 elif [ -f "${LDSCRIPTPATH}/$LDSCRIPT" ]; then
171                         sed $SEDOP < "${LDSCRIPTPATH}/$LDSCRIPT" > "$NEWLDSCRIPT"
172                         LDSCRIPT="$NEWLDSCRIPT"
173                 elif [ -f "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" ]; then
174                         sed $SEDOP < "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" > "$NEWLDSCRIPT"
175                         LDSCRIPT="$NEWLDSCRIPT"
176                 fi
177
178                 if [ "@emit_relocs@" = "yes" ]
179                 then
180                  $LINKER $EMUL $SDIRS -T $LDSCRIPT -q -o "$OFILE.gdb" $ARG1             ||exit $?
181                  RFILE="$OFILE.gdb"
182                  FLTFLAGS="$FLTFLAGS -a"
183                 else
184                  if [ "@got_check@" = "no" ]
185                  then
186                   $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1         ||exit $?
187                   $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" $ARG1                ||exit $?
188                  else
189                   $LINKER $EMUL -r -d -o "$OFILE.elf2flt" $ARG1                          ||exit $?
190                   $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -o "$OFILE.elf" "$OFILE.elf2flt" ||exit $?
191                   $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" "$OFILE.elf2flt"     ||exit $?
192                   rm -f "$OFILE.elf2flt"
193                  fi
194                  RFILE="$OFILE.elf"
195                 fi
196                 if $NM "$OFILE.gdb" | grep _GLOBAL_OFFSET_TABLE_ > /dev/null 
197                 then
198                         $ELF2FLT $FLTFLAGS -o "$OFILE" -p "$OFILE.gdb" "$RFILE" || exit $?
199                 else
200                         $ELF2FLT $FLTFLAGS -o "$OFILE" -r "$RFILE" || exit $?
201                 fi
202                 if [ "$OBJCOPYOP" ]
203                 then
204                  if $OBJCOPY $OBJCOPYOP --help > /dev/null 2>&1
205                  then
206                   $OBJCOPY $OBJCOPYOP "$OFILE.gdb" ||exit $?
207                  else
208                   case " $OBJCOPYOP " in
209                   *" --localize-hidden "*)
210                     SYMS=`mktemp /tmp/flt-XXXXXX`
211                     $OBJDUMP --syms "$OFILE.gdb" > "$SYMS" ||exit $?
212                     sed -n 's/.*\(\.hidden\|\.internal\) \(.*\)/-L \2/p' < "$SYMS" > "$SYMS.hidden" ||exit $?
213                     if [ -s "$SYMS.hidden" ]
214                     then
215                      xargs ${VERBOSE:+-t} $OBJCOPY "$OFILE.gdb" < "$SYMS.hidden" ||exit $?
216                     fi
217                     rm -f "$SYMS" "$SYMS.hidden"
218                     ;;
219                   esac
220                   case " $OBJCOPYOP " in
221                   *" --weaken "*)
222                     $OBJCOPY --weaken "$OFILE.gdb" ||exit $?
223                     ;;
224                   esac
225                  fi
226                 fi
227                 [ "$RFILE" = "$OFILE.gdb" ] || rm -f "$RFILE"  # not needed for any reason
228                 rm -f "$NEWLDSCRIPT"
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 "$@"