OSDN Git Service

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