1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80: srcdir=$1
81: libdir=$2
82: prefix=$3
83: exec_prefix=$4
84: host=$5
85: target=$6
86: target_alias=$7
87: EMULATION_LIBPATH=$8
88: NATIVE_LIB_DIRS=$9
89: shift 9
90: use_sysroot=$1
91: EMULATION_NAME=$2
92: TOOL_LIB=$3
93: CUSTOMIZER_SCRIPT=$4
94:
95:
96: if [ "x${TOOL_LIB}" = "x" ] ; then
97: tool_lib=${exec_prefix}/${target_alias}/lib
98: else
99: tool_lib=${exec_prefix}/${TOOL_LIB}/lib
100: fi
101:
102: if [ "x${CUSTOMIZER_SCRIPT}" = "x" ] ; then
103: CUSTOMIZER_SCRIPT=${EMULATION_NAME}
104: fi
105: CUSTOMIZER_SCRIPT="${srcdir}/emulparams/${CUSTOMIZER_SCRIPT}.sh"
106:
107:
108: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
109:
110: if test -d ldscripts; then
111: true
112: else
113: mkdir ldscripts
114: fi
115:
116:
117:
118:
119:
120:
121:
122: case " $EMULATION_LIBPATH " in
123: *" ${EMULATION_NAME} "*)
124: if [ "x${host}" = "x${target}" ] ; then
125: NATIVE=yes
126: USE_LIBPATH=yes
127: elif [ "x${use_sysroot}" = "xyes" ] ; then
128: USE_LIBPATH=yes
129: fi
130: ;;
131: esac
132:
133:
134: if test "x$NATIVE" = "xyes" ; then
135: USE_LIBPATH=yes
136: fi
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150: if [ "x${LIB_PATH}" = "x" ] && [ "x${USE_LIBPATH}" = xyes ] ; then
151: LIB_PATH2=
152:
153: libs=${NATIVE_LIB_DIRS}
154: if [ "x${use_sysroot}" != "xyes" ] ; then
155: case " ${libs} " in
156: *" ${libdir} "*) ;;
157: *) libs="${libdir} ${libs}" ;;
158: esac
159: case " ${libs} " in
160: *" ${tool_lib} "*) ;;
161: *) libs="${tool_lib} ${libs}" ;;
162: esac
163: fi
164:
165: for lib in ${libs}; do
166:
167: if [ "x${use_sysroot}" = "xyes" ] ; then
168: lib="=${lib}"
169: fi
170: addsuffix=
171: case "${LIBPATH_SUFFIX}:${lib}" in
172: :*) ;;
173: *:*${LIBPATH_SUFFIX}) ;;
174: *) addsuffix=yes ;;
175: esac
176: if test -n "$addsuffix"; then
177: case :${LIB_PATH}: in
178: *:${lib}${LIBPATH_SUFFIX}:*) ;;
179: ::) LIB_PATH=${lib}${LIBPATH_SUFFIX} ;;
180: *) LIB_PATH=${LIB_PATH}:${lib}${LIBPATH_SUFFIX} ;;
181: esac
182: case :${LIB_PATH}:${LIB_PATH2}: in
183: *:${lib}:*) ;;
184: *::) LIB_PATH2=${lib} ;;
185: *) LIB_PATH2=${LIB_PATH2}:${lib} ;;
186: esac
187: else
188: case :${LIB_PATH2}: in
189: *:${lib}:*) ;;
190: ::) LIB_PATH2=${lib} ;;
191: *) LIB_PATH2=${LIB_PATH2}:${lib} ;;
192: esac
193: fi
194: done
195:
196: case :${LIB_PATH}:${LIB_PATH2}: in
197: *:: | ::*) LIB_PATH=${LIB_PATH}${LIB_PATH2} ;;
198: *) LIB_PATH=${LIB_PATH}:${LIB_PATH2} ;;
199: esac
200: fi
201:
202:
203:
204: if [ "x${use_sysroot}" != "xyes" ] ; then
205: case :${LIB_PATH}: in
206: ::: | *:${tool_lib}:*) ;;
207: ::) LIB_PATH=${tool_lib} ;;
208: *) LIB_PATH=${tool_lib}:${LIB_PATH} ;;
209: esac
210:
211: if [ "x${LIBPATH_SUFFIX}" != "x" ] ; then
212: case :${LIB_PATH}: in
213: ::: | *:${tool_lib}${LIBPATH_SUFFIX}:*) ;;
214: ::) LIB_PATH=${tool_lib}${LIBPATH_SUFFIX} ;;
215: *) LIB_PATH=${tool_lib}${LIBPATH_SUFFIX}:${LIB_PATH} ;;
216: esac
217: fi
218: fi
219:
220: LIB_SEARCH_DIRS=`echo ${LIB_PATH} | sed -e 's/:/ /g' -e 's/\([^ ][^ ]*\)/SEARCH_DIR(\\"\1\\");/g'`
221:
222:
223: set $EMULATION_LIBPATH
224: if [ "x$1" = "x$EMULATION_NAME" ]; then
225: test -d tmpdir || mkdir tmpdir
226: rm -f tmpdir/libpath.exp
227: echo "set libpath \"${LIB_PATH}\"" | sed -e 's/:/ /g' > tmpdir/libpath.exp
228: fi
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251: if [ "x$SCRIPT_NAME" = "xelf" ]; then
252: GENERATE_COMBRELOC_SCRIPT=yes
253: fi
254:
255: SEGMENT_SIZE=${SEGMENT_SIZE-${MAXPAGESIZE-${TARGET_PAGE_SIZE}}}
256:
257:
258:
259:
260: DATA_ALIGNMENT_="${DATA_ALIGNMENT_-${DATA_ALIGNMENT-ALIGN(${SEGMENT_SIZE})}}"
261: DATA_ALIGNMENT_n="${DATA_ALIGNMENT_n-${DATA_ALIGNMENT_}}"
262: DATA_ALIGNMENT_N="${DATA_ALIGNMENT_N-${DATA_ALIGNMENT-.}}"
263: DATA_ALIGNMENT_r="${DATA_ALIGNMENT_r-${DATA_ALIGNMENT-}}"
264: DATA_ALIGNMENT_u="${DATA_ALIGNMENT_u-${DATA_ALIGNMENT_r}}"
265:
266: LD_FLAG=r
267: DATA_ALIGNMENT=${DATA_ALIGNMENT_r}
268: DEFAULT_DATA_ALIGNMENT="ALIGN(${SEGMENT_SIZE})"
269: ( echo "/* Script for ld -r: link without relocation */"
270: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
271: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
272: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xr
273:
274: LD_FLAG=u
275: DATA_ALIGNMENT=${DATA_ALIGNMENT_u}
276: CONSTRUCTING=" "
277: ( echo "/* Script for ld -Ur: link w/out relocation, do create constructors */"
278: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
279: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
280: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xu
281:
282: LD_FLAG=
283: DATA_ALIGNMENT=${DATA_ALIGNMENT_}
284: RELOCATING=" "
285: ( echo "/* Default linker script, for normal executables */"
286: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
287: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
288: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.x
289:
290: LD_FLAG=n
291: DATA_ALIGNMENT=${DATA_ALIGNMENT_n}
292: ( echo "/* Script for -n: mix text and data on same page */"
293: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
294: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
295: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xn
296:
297: LD_FLAG=N
298: DATA_ALIGNMENT=${DATA_ALIGNMENT_N}
299: ( echo "/* Script for -N: mix text and data on same page; don't align data */"
300: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
301: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
302: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xbn
303:
304: if test -n "$GENERATE_COMBRELOC_SCRIPT"; then
305: DATA_ALIGNMENT=${DATA_ALIGNMENT_c-${DATA_ALIGNMENT_}}
306: LD_FLAG=c
307: COMBRELOC=ldscripts/${EMULATION_NAME}.xc.tmp
308: ( echo "/* Script for -z combreloc: combine and sort reloc sections */"
309: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
310: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
311: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xc
312: rm -f ${COMBRELOC}
313: LD_FLAG=w
314: RELRO_NOW=" "
315: COMBRELOC=ldscripts/${EMULATION_NAME}.xw.tmp
316: ( echo "/* Script for -z combreloc -z now -z relro: combine and sort reloc sections */"
317: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
318: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
319: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xw
320: rm -f ${COMBRELOC}
321: COMBRELOC=
322: unset RELRO_NOW
323: fi
324:
325: if test -n "$GENERATE_SHLIB_SCRIPT"; then
326: LD_FLAG=shared
327: DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}}
328: CREATE_SHLIB=" "
329: (
330: echo "/* Script for ld --shared: link shared library */"
331: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
332: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
333: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xs
334: if test -n "$GENERATE_COMBRELOC_SCRIPT"; then
335: LD_FLAG=cshared
336: DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}}
337: COMBRELOC=ldscripts/${EMULATION_NAME}.xsc.tmp
338: ( echo "/* Script for --shared -z combreloc: shared library, combine & sort relocs */"
339: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
340: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
341: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsc
342: rm -f ${COMBRELOC}
343: LD_FLAG=wshared
344: RELRO_NOW=" "
345: COMBRELOC=ldscripts/${EMULATION_NAME}.xsw.tmp
346: ( echo "/* Script for --shared -z combreloc -z now -z relro: shared library, combine & sort relocs */"
347: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
348: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
349: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsw
350: rm -f ${COMBRELOC}
351: COMBRELOC=
352: unset RELRO_NOW
353: fi
354: unset CREATE_SHLIB
355: fi
356:
357: if test -n "$GENERATE_PIE_SCRIPT"; then
358: LD_FLAG=pie
359: DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}}
360: CREATE_PIE=" "
361: (
362: echo "/* Script for ld -pie: link position independent executable */"
363: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
364: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
365: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xd
366: if test -n "$GENERATE_COMBRELOC_SCRIPT"; then
367: LD_FLAG=cpie
368: DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}}
369: COMBRELOC=ldscripts/${EMULATION_NAME}.xdc.tmp
370: ( echo "/* Script for -pie -z combreloc: position independent executable, combine & sort relocs */"
371: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
372: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
373: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdc
374: rm -f ${COMBRELOC}
375: LD_FLAG=wpie
376: RELRO_NOW=" "
377: COMBRELOC=ldscripts/${EMULATION_NAME}.xdw.tmp
378: ( echo "/* Script for -pie -z combreloc -z now -z relro: position independent executable, combine & sort relocs */"
379: . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME}
380: . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
381: ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdw
382: rm -f ${COMBRELOC}
383: COMBRELOC=
384: unset RELRO_NOW
385: fi
386: unset CREATE_PIE
387: fi
388:
389: case " $EMULATION_LIBPATH " in
390: *" ${EMULATION_NAME} "*) COMPILE_IN=true;;
391: esac
392:
393: if test -n "${BASH+set}"; then
394: source_em()
395: {
396: local current_script="$em_script"
397: em_script=$1
398: . $em_script
399: em_script=$current_script
400: }
401: fragment()
402: {
403: local lineno=$[${BASH_LINENO[0]} + 1]
404: echo >> e${EMULATION_NAME}.c "#line $lineno \"$em_script\""
405: cat >> e${EMULATION_NAME}.c
406: }
407: else
408: source_em()
409: {
410: . $1
411: }
412: fragment()
413: {
414: cat >> e${EMULATION_NAME}.c
415: }
416: fi
417:
418:
419:
420:
421: > e${EMULATION_NAME}.c
422: source_em ${srcdir}/emultempl/${TEMPLATE_NAME-generic}.em