OSDN Git Service

handle more strip/verbose options.
[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|-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@" = "yes" ]
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@" = "yes" ]
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@" = "yes" ]
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@" = "no" ]
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 "$@"