1# This shell script emits a C file. -*- C -*-
2# It does some substitutions.
3test -z "${ELFSIZE}" && ELFSIZE=32
4if [ -z "$MACHINE" ]; then
5  OUTPUT_ARCH=${ARCH}
6else
7  OUTPUT_ARCH=${ARCH}:${MACHINE}
8fi
9fragment <<EOF
10/* This file is is generated by a shell script.  DO NOT EDIT! */
11
12/* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
13   Copyright (C) 1991-2020 Free Software Foundation, Inc.
14   Written by Steve Chamberlain <sac@cygnus.com>
15   ELF support by Ian Lance Taylor <ian@cygnus.com>
16
17   This file is part of the GNU Binutils.
18
19   This program is free software; you can redistribute it and/or modify
20   it under the terms of the GNU General Public License as published by
21   the Free Software Foundation; either version 3 of the License, or
22   (at your option) any later version.
23
24   This program is distributed in the hope that it will be useful,
25   but WITHOUT ANY WARRANTY; without even the implied warranty of
26   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27   GNU General Public License for more details.
28
29   You should have received a copy of the GNU General Public License
30   along with this program; if not, write to the Free Software
31   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
32   MA 02110-1301, USA.  */
33
34#define TARGET_IS_${EMULATION_NAME}
35
36#include "sysdep.h"
37#include "bfd.h"
38#include "libiberty.h"
39#include "getopt.h"
40#include "bfdlink.h"
41#include "ctf-api.h"
42#include "ld.h"
43#include "ldmain.h"
44#include "ldmisc.h"
45#include "ldexp.h"
46#include "ldlang.h"
47#include "ldfile.h"
48#include "ldemul.h"
49#include <ldgram.h>
50#include "elf-bfd.h"
51#include "ldelf.h"
52#include "ldelfgen.h"
53
54/* Declare functions used by various EXTRA_EM_FILEs.  */
55static void gld${EMULATION_NAME}_before_parse (void);
56static void gld${EMULATION_NAME}_after_open (void);
57static void gld${EMULATION_NAME}_before_allocation (void);
58static void gld${EMULATION_NAME}_after_allocation (void);
59EOF
60
61# Import any needed special functions and/or overrides.
62#
63source_em ${srcdir}/emultempl/elf-generic.em
64if test -n "$EXTRA_EM_FILE" ; then
65  source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
66fi
67
68# Functions in this file can be overridden by setting the LDEMUL_* shell
69# variables.  If the name of the overriding function is the same as is
70# defined in this file, then don't output this file's version.
71# If a different overriding name is given then output the standard function
72# as presumably it is called from the overriding function.
73#
74if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
75fragment <<EOF
76
77static void
78gld${EMULATION_NAME}_before_parse (void)
79{
80  ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
81  input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
82  config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
83  config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
84  link_info.check_relocs_after_open_input = TRUE;
85  link_info.relro = DEFAULT_LD_Z_RELRO;
86  link_info.separate_code = DEFAULT_LD_Z_SEPARATE_CODE;
87}
88
89EOF
90fi
91
92fragment <<EOF
93
94/* These variables are used to implement target options */
95
96static char *audit; /* colon (typically) separated list of libs */
97static char *depaudit; /* colon (typically) separated list of libs */
98
99EOF
100
101if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
102
103  IS_LINUX_TARGET=FALSE
104  IS_FREEBSD_TARGET=FALSE
105  case ${target} in
106    *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
107      IS_LINUX_TARGET=TRUE ;;
108    *-*-freebsd* | *-*-dragonfly*)
109      IS_FREEBSD_TARGET=TRUE ;;
110  esac
111  IS_LIBPATH=FALSE
112  if test "x${USE_LIBPATH}" = xyes; then
113    IS_LIBPATH=TRUE
114  fi
115  IS_NATIVE=FALSE
116  if test "x${NATIVE}" = xyes; then
117    IS_NATIVE=TRUE
118  fi
119
120fragment <<EOF
121
122/* This is called after all the input files have been opened.  */
123
124static void
125gld${EMULATION_NAME}_after_open (void)
126{
127  ldelf_after_open ($IS_LIBPATH, $IS_NATIVE,
128		    $IS_LINUX_TARGET, $IS_FREEBSD_TARGET, $ELFSIZE, "$prefix");
129}
130
131EOF
132fi
133
134if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
135  if test x"${ELF_INTERPRETER_NAME}" = x; then
136    ELF_INTERPRETER_NAME=NULL
137  fi
138fragment <<EOF
139
140/* This is called after the sections have been attached to output
141   sections, but before any sizes or addresses have been set.  */
142
143static void
144gld${EMULATION_NAME}_before_allocation (void)
145{
146  ldelf_before_allocation (audit, depaudit, ${ELF_INTERPRETER_NAME});
147}
148
149EOF
150fi
151
152if test x"$LDEMUL_AFTER_ALLOCATION" != xgld"$EMULATION_NAME"_after_allocation; then
153fragment <<EOF
154
155static void
156gld${EMULATION_NAME}_after_allocation (void)
157{
158  int need_layout = bfd_elf_discard_info (link_info.output_bfd, &link_info);
159
160  if (need_layout < 0)
161    einfo (_("%X%P: .eh_frame/.stab edit: %E\n"));
162  else
163    ldelf_map_segments (need_layout);
164}
165EOF
166fi
167
168if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
169fragment <<EOF
170
171static char *
172gld${EMULATION_NAME}_get_script (int *isfile)
173EOF
174
175if test x"$COMPILE_IN" = xyes
176then
177# Scripts compiled in.
178
179# sed commands to quote an ld script as a C string.
180sc="-f stringify.sed"
181
182fragment <<EOF
183{
184  *isfile = 0;
185
186  if (bfd_link_relocatable (&link_info) && config.build_constructors)
187    return
188EOF
189sed $sc ldscripts/${EMULATION_NAME}.xu			>> e${EMULATION_NAME}.c
190echo '  ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c
191sed $sc ldscripts/${EMULATION_NAME}.xr			>> e${EMULATION_NAME}.c
192echo '  ; else if (!config.text_read_only) return'	>> e${EMULATION_NAME}.c
193sed $sc ldscripts/${EMULATION_NAME}.xbn			>> e${EMULATION_NAME}.c
194if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
195echo '  ; else if (!config.magic_demand_paged) return'	>> e${EMULATION_NAME}.c
196sed $sc ldscripts/${EMULATION_NAME}.xn			>> e${EMULATION_NAME}.c
197fi
198if test -n "$GENERATE_PIE_SCRIPT" ; then
199if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
200echo '  ; else if (bfd_link_pie (&link_info)'		>> e${EMULATION_NAME}.c
201echo '             && link_info.combreloc'		>> e${EMULATION_NAME}.c
202echo '             && link_info.separate_code'		>> e${EMULATION_NAME}.c
203echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
204sed $sc ldscripts/${EMULATION_NAME}.xdwe		>> e${EMULATION_NAME}.c
205echo '  ; else if (bfd_link_pie (&link_info)'		>> e${EMULATION_NAME}.c
206echo '             && link_info.combreloc'		>> e${EMULATION_NAME}.c
207echo '             && link_info.relro'			>> e${EMULATION_NAME}.c
208echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
209sed $sc ldscripts/${EMULATION_NAME}.xdw			>> e${EMULATION_NAME}.c
210if test -n "$GENERATE_RELRO_SCRIPT" ; then
211echo '  ; else if (bfd_link_pie (&link_info)'          >> e${EMULATION_NAME}.c
212echo '             && link_info.combreloc'             >> e${EMULATION_NAME}.c
213echo '             && link_info.separate_code'         >> e${EMULATION_NAME}.c
214echo '             && link_info.relro) return'         >> e${EMULATION_NAME}.c
215sed $sc ldscripts/${EMULATION_NAME}.xdceo              >> e${EMULATION_NAME}.c
216fi
217echo '  ; else if (bfd_link_pie (&link_info)'		>> e${EMULATION_NAME}.c
218echo '             && link_info.separate_code'		>> e${EMULATION_NAME}.c
219echo '             && link_info.combreloc) return'	>> e${EMULATION_NAME}.c
220sed $sc ldscripts/${EMULATION_NAME}.xdce		>> e${EMULATION_NAME}.c
221if test -n "$GENERATE_RELRO_SCRIPT" ; then
222echo '  ; else if (bfd_link_pie (&link_info)'          >> e${EMULATION_NAME}.c
223echo '             && link_info.combreloc'             >> e${EMULATION_NAME}.c
224echo '             && link_info.relro) return'         >> e${EMULATION_NAME}.c
225sed $sc ldscripts/${EMULATION_NAME}.xdco               >> e${EMULATION_NAME}.c
226fi
227echo '  ; else if (bfd_link_pie (&link_info)'		>> e${EMULATION_NAME}.c
228echo '             && link_info.combreloc) return'	>> e${EMULATION_NAME}.c
229sed $sc ldscripts/${EMULATION_NAME}.xdc			>> e${EMULATION_NAME}.c
230if test -n "$GENERATE_RELRO_SCRIPT" ; then
231echo '  ; else if (bfd_link_pie (&link_info)'          >> e${EMULATION_NAME}.c
232echo '             && link_info.separate_code'         >> e${EMULATION_NAME}.c
233echo '             && link_info.relro) return'         >> e${EMULATION_NAME}.c
234sed $sc ldscripts/${EMULATION_NAME}.xdeo               >> e${EMULATION_NAME}.c
235fi
236fi
237echo '  ; else if (bfd_link_pie (&link_info)'		>> e${EMULATION_NAME}.c
238echo '             && link_info.separate_code) return'	>> e${EMULATION_NAME}.c
239sed $sc ldscripts/${EMULATION_NAME}.xde			>> e${EMULATION_NAME}.c
240if test -n "$GENERATE_RELRO_SCRIPT" ; then
241echo '  ; else if (bfd_link_pie (&link_info)'          >> e${EMULATION_NAME}.c
242echo '             && link_info.relro) return'         >> e${EMULATION_NAME}.c
243sed $sc ldscripts/${EMULATION_NAME}.xdo                >> e${EMULATION_NAME}.c
244fi
245echo '  ; else if (bfd_link_pie (&link_info)) return'	>> e${EMULATION_NAME}.c
246sed $sc ldscripts/${EMULATION_NAME}.xd			>> e${EMULATION_NAME}.c
247fi
248if test -n "$GENERATE_SHLIB_SCRIPT" ; then
249if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
250echo '  ; else if (bfd_link_dll (&link_info)'		>> e${EMULATION_NAME}.c
251echo '             && link_info.combreloc'		>> e${EMULATION_NAME}.c
252echo '             && link_info.separate_code'		>> e${EMULATION_NAME}.c
253echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
254sed $sc ldscripts/${EMULATION_NAME}.xswe		>> e${EMULATION_NAME}.c
255echo '  ; else if (bfd_link_dll (&link_info)'		>> e${EMULATION_NAME}.c
256echo '             && link_info.combreloc'		>> e${EMULATION_NAME}.c
257echo '             && link_info.relro'			>> e${EMULATION_NAME}.c
258echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
259sed $sc ldscripts/${EMULATION_NAME}.xsw			>> e${EMULATION_NAME}.c
260if test -n "$GENERATE_RELRO_SCRIPT" ; then
261echo '  ; else if (bfd_link_dll (&link_info)'          >> e${EMULATION_NAME}.c
262echo '             && link_info.combreloc'             >> e${EMULATION_NAME}.c
263echo '             && link_info.separate_code'         >> e${EMULATION_NAME}.c
264echo '             && link_info.relro) return'         >> e${EMULATION_NAME}.c
265sed $sc ldscripts/${EMULATION_NAME}.xsceo              >> e${EMULATION_NAME}.c
266fi
267echo '  ; else if (bfd_link_dll (&link_info)'		>> e${EMULATION_NAME}.c
268echo '             && link_info.combreloc'		>> e${EMULATION_NAME}.c
269echo '             && link_info.separate_code) return'	>> e${EMULATION_NAME}.c
270sed $sc ldscripts/${EMULATION_NAME}.xsce			>> e${EMULATION_NAME}.c
271if test -n "$GENERATE_RELRO_SCRIPT" ; then
272echo '  ; else if (bfd_link_dll (&link_info)'          >> e${EMULATION_NAME}.c
273echo '             && link_info.combreloc'             >> e${EMULATION_NAME}.c
274echo '             && link_info.relro) return'         >> e${EMULATION_NAME}.c
275sed $sc ldscripts/${EMULATION_NAME}.xsco               >> e${EMULATION_NAME}.c
276fi
277echo '  ; else if (bfd_link_dll (&link_info)'		>> e${EMULATION_NAME}.c
278echo '             && link_info.combreloc) return'	>> e${EMULATION_NAME}.c
279sed $sc ldscripts/${EMULATION_NAME}.xsc			>> e${EMULATION_NAME}.c
280if test -n "$GENERATE_RELRO_SCRIPT" ; then
281echo '  ; else if (bfd_link_dll (&link_info)'          >> e${EMULATION_NAME}.c
282echo '             && link_info.separate_code'         >> e${EMULATION_NAME}.c
283echo '             && link_info.relro) return'         >> e${EMULATION_NAME}.c
284sed $sc ldscripts/${EMULATION_NAME}.xseo               >> e${EMULATION_NAME}.c
285fi
286fi
287echo '  ; else if (bfd_link_dll (&link_info)'		>> e${EMULATION_NAME}.c
288echo '             && link_info.separate_code) return'	>> e${EMULATION_NAME}.c
289sed $sc ldscripts/${EMULATION_NAME}.xse			>> e${EMULATION_NAME}.c
290if test -n "$GENERATE_RELRO_SCRIPT" ; then
291echo '  ; else if (bfd_link_dll (&link_info)'          >> e${EMULATION_NAME}.c
292echo '             && link_info.relro) return'         >> e${EMULATION_NAME}.c
293sed $sc ldscripts/${EMULATION_NAME}.xso               >> e${EMULATION_NAME}.c
294fi
295echo '  ; else if (bfd_link_dll (&link_info)) return'	>> e${EMULATION_NAME}.c
296sed $sc ldscripts/${EMULATION_NAME}.xs			>> e${EMULATION_NAME}.c
297fi
298if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
299echo '  ; else if (link_info.combreloc'			>> e${EMULATION_NAME}.c
300echo '             && link_info.separate_code'		>> e${EMULATION_NAME}.c
301echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
302sed $sc ldscripts/${EMULATION_NAME}.xwe			>> e${EMULATION_NAME}.c
303echo '  ; else if (link_info.combreloc'			>> e${EMULATION_NAME}.c
304echo '             && link_info.relro'			>> e${EMULATION_NAME}.c
305echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
306sed $sc ldscripts/${EMULATION_NAME}.xw			>> e${EMULATION_NAME}.c
307if test -n "$GENERATE_RELRO_SCRIPT" ; then
308echo '  ; else if (link_info.combreloc'                 >> e${EMULATION_NAME}.c
309echo '             && link_info.separate_code'		>> e${EMULATION_NAME}.c
310echo '             && link_info.relro) return'          >> e${EMULATION_NAME}.c
311sed $sc ldscripts/${EMULATION_NAME}.xceo                >> e${EMULATION_NAME}.c
312fi
313echo '  ; else if (link_info.combreloc'			>> e${EMULATION_NAME}.c
314echo '             && link_info.separate_code) return'	>> e${EMULATION_NAME}.c
315sed $sc ldscripts/${EMULATION_NAME}.xce			>> e${EMULATION_NAME}.c
316if test -n "$GENERATE_RELRO_SCRIPT" ; then
317echo '  ; else if (link_info.combreloc'                 >> e${EMULATION_NAME}.c
318echo '             && link_info.relro) return'          >> e${EMULATION_NAME}.c
319sed $sc ldscripts/${EMULATION_NAME}.xco                 >> e${EMULATION_NAME}.c
320fi
321echo '  ; else if (link_info.combreloc) return'		>> e${EMULATION_NAME}.c
322sed $sc ldscripts/${EMULATION_NAME}.xc			>> e${EMULATION_NAME}.c
323fi
324if test -n "$GENERATE_RELRO_SCRIPT" ; then
325echo '  ; else if (link_info.separate_code'             >> e${EMULATION_NAME}.c
326echo '             && link_info.relro) return'          >> e${EMULATION_NAME}.c
327sed $sc ldscripts/${EMULATION_NAME}.xeo                 >> e${EMULATION_NAME}.c
328fi
329echo '  ; else if (link_info.separate_code) return'     >> e${EMULATION_NAME}.c
330sed $sc ldscripts/${EMULATION_NAME}.xe			>> e${EMULATION_NAME}.c
331if test -n "$GENERATE_RELRO_SCRIPT" ; then
332echo '  ; else if (link_info.relro) return'             >> e${EMULATION_NAME}.c
333sed $sc ldscripts/${EMULATION_NAME}.xo                  >> e${EMULATION_NAME}.c
334fi
335echo '  ; else return'					>> e${EMULATION_NAME}.c
336sed $sc ldscripts/${EMULATION_NAME}.x			>> e${EMULATION_NAME}.c
337echo '; }'						>> e${EMULATION_NAME}.c
338
339else
340# Scripts read from the filesystem.
341
342fragment <<EOF
343{
344  *isfile = 1;
345
346  if (bfd_link_relocatable (&link_info) && config.build_constructors)
347    return "ldscripts/${EMULATION_NAME}.xu";
348  else if (bfd_link_relocatable (&link_info))
349    return "ldscripts/${EMULATION_NAME}.xr";
350  else if (!config.text_read_only)
351    return "ldscripts/${EMULATION_NAME}.xbn";
352EOF
353if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
354else
355fragment <<EOF
356  else if (!config.magic_demand_paged)
357    return "ldscripts/${EMULATION_NAME}.xn";
358EOF
359fi
360if test -n "$GENERATE_PIE_SCRIPT" ; then
361if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
362fragment <<EOF
363  else if (bfd_link_pie (&link_info)
364	   && link_info.combreloc
365	   && link_info.relro
366	   && (link_info.flags & DF_BIND_NOW))
367    {
368      if (link_info.separate_code)
369	return "ldscripts/${EMULATION_NAME}.xdwe";
370      else
371	return "ldscripts/${EMULATION_NAME}.xdw";
372    }
373EOF
374if test -n "$GENERATE_RELRO_SCRIPT" ; then
375fragment <<EOF
376  else if (bfd_link_pie (&link_info)
377	   && link_info.combreloc
378	   && link_info.relro)
379    {
380      if (link_info.separate_code)
381	return "ldscripts/${EMULATION_NAME}.xdceo";
382      else
383	return "ldscripts/${EMULATION_NAME}.xdco";
384    }
385EOF
386fi
387fragment <<EOF
388  else if (bfd_link_pie (&link_info)
389	   && link_info.combreloc)
390    {
391      if (link_info.separate_code)
392	return "ldscripts/${EMULATION_NAME}.xdce";
393      else
394	return "ldscripts/${EMULATION_NAME}.xdc";
395    }
396EOF
397fi
398if test -n "$GENERATE_RELRO_SCRIPT" ; then
399fragment <<EOF
400  else if (bfd_link_pie (&link_info)
401	   && link_info.relro)
402    {
403      if (link_info.separate_code)
404	return "ldscripts/${EMULATION_NAME}.xdeo";
405      else
406	return "ldscripts/${EMULATION_NAME}.xdo";
407    }
408EOF
409fi
410fragment <<EOF
411  else if (bfd_link_pie (&link_info))
412    {
413      if (link_info.separate_code)
414	return "ldscripts/${EMULATION_NAME}.xde";
415      else
416	return "ldscripts/${EMULATION_NAME}.xd";
417    }
418EOF
419fi
420if test -n "$GENERATE_SHLIB_SCRIPT" ; then
421if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
422fragment <<EOF
423  else if (bfd_link_dll (&link_info) && link_info.combreloc
424	   && link_info.relro && (link_info.flags & DF_BIND_NOW))
425    {
426      if (link_info.separate_code)
427	return "ldscripts/${EMULATION_NAME}.xswe";
428      else
429	return "ldscripts/${EMULATION_NAME}.xsw";
430    }
431EOF
432if test -n "$GENERATE_RELRO_SCRIPT" ; then
433fragment <<EOF
434  else if (bfd_link_dll (&link_info)
435	   && link_info.combreloc
436	   && link_info.relro)
437    {
438      if (link_info.separate_code)
439	return "ldscripts/${EMULATION_NAME}.xsceo";
440      else
441	return "ldscripts/${EMULATION_NAME}.xsco";
442    }
443EOF
444fi
445fragment <<EOF
446  else if (bfd_link_dll (&link_info) && link_info.combreloc)
447    {
448      if (link_info.separate_code)
449	return "ldscripts/${EMULATION_NAME}.xsce";
450      else
451	return "ldscripts/${EMULATION_NAME}.xsc";
452    }
453EOF
454fi
455if test -n "$GENERATE_RELRO_SCRIPT" ; then
456fragment <<EOF
457  else if (bfd_link_dll (&link_info)
458	   && link_info.relro)
459    {
460      if (link_info.separate_code)
461	return "ldscripts/${EMULATION_NAME}.xseo";
462      else
463	return "ldscripts/${EMULATION_NAME}.xso";
464    }
465EOF
466fi
467fragment <<EOF
468  else if (bfd_link_dll (&link_info))
469    {
470      if (link_info.separate_code)
471	return "ldscripts/${EMULATION_NAME}.xse";
472      else
473	return "ldscripts/${EMULATION_NAME}.xs";
474    }
475EOF
476fi
477if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
478fragment <<EOF
479  else if (link_info.combreloc && link_info.relro
480	   && (link_info.flags & DF_BIND_NOW))
481    {
482      if (link_info.separate_code)
483	return "ldscripts/${EMULATION_NAME}.xwe";
484      else
485	return "ldscripts/${EMULATION_NAME}.xw";
486    }
487EOF
488if test -n "$GENERATE_RELRO_SCRIPT" ; then
489fragment <<EOF
490  else if (link_info.combreloc
491	   && link_info.relro)
492    {
493      if (link_info.separate_code)
494	return "ldscripts/${EMULATION_NAME}.xceo";
495      else
496	return "ldscripts/${EMULATION_NAME}.xco";
497    }
498EOF
499fi
500fragment <<EOF
501  else if (link_info.combreloc)
502    {
503      if (link_info.separate_code)
504	return "ldscripts/${EMULATION_NAME}.xce";
505      else
506	return "ldscripts/${EMULATION_NAME}.xc";
507    }
508EOF
509fi
510if test -n "$GENERATE_RELRO_SCRIPT" ; then
511fragment <<EOF
512  else if (link_info.relro)
513    {
514      if (link_info.separate_code)
515	return "ldscripts/${EMULATION_NAME}.xeo";
516      else
517	return "ldscripts/${EMULATION_NAME}.xo";
518    }
519EOF
520fi
521fragment <<EOF
522  else
523    {
524      if (link_info.separate_code)
525	return "ldscripts/${EMULATION_NAME}.xe";
526      else
527	return "ldscripts/${EMULATION_NAME}.x";
528    }
529}
530
531EOF
532fi
533fi
534
535if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
536fragment <<EOF
537 $PARSE_AND_LIST_PROLOGUE
538EOF
539fi
540
541fragment <<EOF
542
543enum elf_options
544{
545  OPTION_DISABLE_NEW_DTAGS = 400,
546  OPTION_ENABLE_NEW_DTAGS,
547  OPTION_GROUP,
548  OPTION_EH_FRAME_HDR,
549  OPTION_NO_EH_FRAME_HDR,
550  OPTION_EXCLUDE_LIBS,
551  OPTION_HASH_STYLE,
552  OPTION_BUILD_ID,
553  OPTION_AUDIT,
554  OPTION_COMPRESS_DEBUG
555};
556
557static void
558gld${EMULATION_NAME}_add_options
559  (int ns, char **shortopts, int nl, struct option **longopts,
560   int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
561{
562EOF
563if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
564fragment <<EOF
565  static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:P:";
566EOF
567else
568fragment <<EOF
569  static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
570EOF
571fi
572fragment <<EOF
573  static const struct option xtra_long[] = {
574EOF
575if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
576fragment <<EOF
577    {"audit", required_argument, NULL, OPTION_AUDIT},
578    {"Bgroup", no_argument, NULL, OPTION_GROUP},
579EOF
580fi
581fragment <<EOF
582    {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
583    {"compress-debug-sections", required_argument, NULL, OPTION_COMPRESS_DEBUG},
584EOF
585if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
586fragment <<EOF
587    {"depaudit", required_argument, NULL, 'P'},
588    {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
589    {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
590    {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
591    {"no-eh-frame-hdr", no_argument, NULL, OPTION_NO_EH_FRAME_HDR},
592    {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
593    {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
594EOF
595fi
596if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
597fragment <<EOF
598    $PARSE_AND_LIST_LONGOPTS
599EOF
600fi
601fragment <<EOF
602    {NULL, no_argument, NULL, 0}
603  };
604
605  *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
606  memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
607  *longopts = (struct option *)
608    xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
609  memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
610}
611
612#define DEFAULT_BUILD_ID_STYLE	"sha1"
613
614static bfd_boolean
615gld${EMULATION_NAME}_handle_option (int optc)
616{
617  switch (optc)
618    {
619    default:
620      return FALSE;
621
622    case OPTION_BUILD_ID:
623      if (ldelf_emit_note_gnu_build_id != NULL)
624	{
625	  free ((char *) ldelf_emit_note_gnu_build_id);
626	  ldelf_emit_note_gnu_build_id = NULL;
627	}
628      if (optarg == NULL)
629	optarg = DEFAULT_BUILD_ID_STYLE;
630      if (strcmp (optarg, "none"))
631	ldelf_emit_note_gnu_build_id = xstrdup (optarg);
632      break;
633
634    case OPTION_COMPRESS_DEBUG:
635      if (strcasecmp (optarg, "none") == 0)
636	link_info.compress_debug = COMPRESS_DEBUG_NONE;
637      else if (strcasecmp (optarg, "zlib") == 0)
638	link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
639      else if (strcasecmp (optarg, "zlib-gnu") == 0)
640	link_info.compress_debug = COMPRESS_DEBUG_GNU_ZLIB;
641      else if (strcasecmp (optarg, "zlib-gabi") == 0)
642	link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
643      else
644	einfo (_("%F%P: invalid --compress-debug-sections option: \`%s'\n"),
645	       optarg);
646      break;
647EOF
648
649if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
650fragment <<EOF
651    case OPTION_AUDIT:
652	ldelf_append_to_separated_string (&audit, optarg);
653	break;
654
655    case 'P':
656	ldelf_append_to_separated_string (&depaudit, optarg);
657	break;
658
659    case OPTION_DISABLE_NEW_DTAGS:
660      link_info.new_dtags = FALSE;
661      break;
662
663    case OPTION_ENABLE_NEW_DTAGS:
664      link_info.new_dtags = TRUE;
665      break;
666
667    case OPTION_EH_FRAME_HDR:
668      link_info.eh_frame_hdr_type = DWARF2_EH_HDR;
669      break;
670
671    case OPTION_NO_EH_FRAME_HDR:
672      link_info.eh_frame_hdr_type = 0;
673      break;
674
675    case OPTION_GROUP:
676      link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
677      /* Groups must be self-contained.  */
678      link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
679      link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
680      break;
681
682    case OPTION_EXCLUDE_LIBS:
683      add_excluded_libs (optarg);
684      break;
685
686    case OPTION_HASH_STYLE:
687      link_info.emit_hash = FALSE;
688      link_info.emit_gnu_hash = FALSE;
689      if (strcmp (optarg, "sysv") == 0)
690	link_info.emit_hash = TRUE;
691      else if (strcmp (optarg, "gnu") == 0)
692	link_info.emit_gnu_hash = TRUE;
693      else if (strcmp (optarg, "both") == 0)
694	{
695	  link_info.emit_hash = TRUE;
696	  link_info.emit_gnu_hash = TRUE;
697	}
698      else
699	einfo (_("%F%P: invalid hash style \`%s'\n"), optarg);
700      break;
701
702EOF
703fi
704fragment <<EOF
705    case 'z':
706      if (strcmp (optarg, "defs") == 0)
707	link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
708      else if (strcmp (optarg, "undefs") == 0)
709	link_info.unresolved_syms_in_objects = RM_IGNORE;
710      else if (strcmp (optarg, "muldefs") == 0)
711	link_info.allow_multiple_definition = TRUE;
712      else if (CONST_STRNEQ (optarg, "max-page-size="))
713	{
714	  char *end;
715
716	  config.maxpagesize = strtoul (optarg + 14, &end, 0);
717	  if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
718	    einfo (_("%F%P: invalid maximum page size \`%s'\n"),
719		   optarg + 14);
720	}
721      else if (CONST_STRNEQ (optarg, "common-page-size="))
722	{
723	  char *end;
724	  config.commonpagesize = strtoul (optarg + 17, &end, 0);
725	  if (*end
726	      || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
727	    einfo (_("%F%P: invalid common page size \`%s'\n"),
728		   optarg + 17);
729	}
730      else if (CONST_STRNEQ (optarg, "stack-size="))
731	{
732	  char *end;
733	  link_info.stacksize = strtoul (optarg + 11, &end, 0);
734	  if (*end || link_info.stacksize < 0)
735	    einfo (_("%F%P: invalid stack size \`%s'\n"), optarg + 11);
736	  if (!link_info.stacksize)
737	    /* Use -1 for explicit no-stack, because zero means
738	       'default'.   */
739	    link_info.stacksize = -1;
740	}
741      else if (strcmp (optarg, "execstack") == 0)
742	{
743	  link_info.execstack = TRUE;
744	  link_info.noexecstack = FALSE;
745	}
746      else if (strcmp (optarg, "noexecstack") == 0)
747	{
748	  link_info.noexecstack = TRUE;
749	  link_info.execstack = FALSE;
750	}
751      else if (strcmp (optarg, "globalaudit") == 0)
752	{
753	  link_info.flags_1 |= DF_1_GLOBAUDIT;
754	}
755EOF
756
757if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
758fragment <<EOF
759      else if (strcmp (optarg, "global") == 0)
760	link_info.flags_1 |= (bfd_vma) DF_1_GLOBAL;
761      else if (strcmp (optarg, "initfirst") == 0)
762	link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
763      else if (strcmp (optarg, "interpose") == 0)
764	link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
765      else if (strcmp (optarg, "loadfltr") == 0)
766	link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
767      else if (strcmp (optarg, "nodefaultlib") == 0)
768	link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
769      else if (strcmp (optarg, "nodelete") == 0)
770	link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
771      else if (strcmp (optarg, "nodlopen") == 0)
772	link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
773      else if (strcmp (optarg, "nodump") == 0)
774	link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
775      else if (strcmp (optarg, "now") == 0)
776	{
777	  link_info.flags |= (bfd_vma) DF_BIND_NOW;
778	  link_info.flags_1 |= (bfd_vma) DF_1_NOW;
779	}
780      else if (strcmp (optarg, "lazy") == 0)
781	{
782	  link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
783	  link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
784	}
785      else if (strcmp (optarg, "origin") == 0)
786	{
787	  link_info.flags |= (bfd_vma) DF_ORIGIN;
788	  link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
789	}
790      else if (strcmp (optarg, "combreloc") == 0)
791	link_info.combreloc = TRUE;
792      else if (strcmp (optarg, "nocombreloc") == 0)
793	link_info.combreloc = FALSE;
794      else if (strcmp (optarg, "nocopyreloc") == 0)
795	link_info.nocopyreloc = TRUE;
796      else if (strcmp (optarg, "relro") == 0)
797	link_info.relro = TRUE;
798      else if (strcmp (optarg, "norelro") == 0)
799	link_info.relro = FALSE;
800      else if (strcmp (optarg, "separate-code") == 0)
801	link_info.separate_code = TRUE;
802      else if (strcmp (optarg, "noseparate-code") == 0)
803	link_info.separate_code = FALSE;
804      else if (strcmp (optarg, "common") == 0)
805	link_info.elf_stt_common = elf_stt_common;
806      else if (strcmp (optarg, "nocommon") == 0)
807	link_info.elf_stt_common = no_elf_stt_common;
808      else if (strcmp (optarg, "text") == 0)
809	link_info.error_textrel = TRUE;
810      else if (strcmp (optarg, "notext") == 0)
811	link_info.error_textrel = FALSE;
812      else if (strcmp (optarg, "textoff") == 0)
813	link_info.error_textrel = FALSE;
814EOF
815fi
816
817if test -n "$PARSE_AND_LIST_ARGS_CASE_Z" ; then
818fragment <<EOF
819 $PARSE_AND_LIST_ARGS_CASE_Z
820EOF
821fi
822
823fragment <<EOF
824      else
825	einfo (_("%P: warning: -z %s ignored\n"), optarg);
826      break;
827EOF
828
829if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
830fragment <<EOF
831 $PARSE_AND_LIST_ARGS_CASES
832EOF
833fi
834
835fragment <<EOF
836    }
837
838  return TRUE;
839}
840
841EOF
842
843if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
844gld_list_options="gld${EMULATION_NAME}_list_options"
845if test -n "$PARSE_AND_LIST_OPTIONS"; then
846fragment <<EOF
847
848static void
849gld${EMULATION_NAME}_list_options (FILE * file)
850{
851EOF
852
853if test -n "$PARSE_AND_LIST_OPTIONS" ; then
854fragment <<EOF
855 $PARSE_AND_LIST_OPTIONS
856EOF
857fi
858
859fragment <<EOF
860}
861EOF
862else
863  gld_list_options="NULL"
864fi
865
866if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
867fragment <<EOF
868 $PARSE_AND_LIST_EPILOGUE
869EOF
870fi
871fi
872
873fragment <<EOF
874
875struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
876{
877  ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
878  ${LDEMUL_SYSLIB-syslib_default},
879  ${LDEMUL_HLL-hll_default},
880  ${LDEMUL_AFTER_PARSE-ldelf_after_parse},
881  ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
882  ${LDEMUL_AFTER_CHECK_RELOCS-after_check_relocs_default},
883  ${LDEMUL_AFTER_ALLOCATION-gld${EMULATION_NAME}_after_allocation},
884  ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
885  ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
886  ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
887  ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
888  "${EMULATION_NAME}",
889  "${OUTPUT_FORMAT}",
890  ${LDEMUL_FINISH-finish_default},
891  ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
892  ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-ldelf_open_dynamic_archive},
893  ${LDEMUL_PLACE_ORPHAN-ldelf_place_orphan},
894  ${LDEMUL_SET_SYMBOLS-NULL},
895  ${LDEMUL_PARSE_ARGS-NULL},
896  gld${EMULATION_NAME}_add_options,
897  gld${EMULATION_NAME}_handle_option,
898  ${LDEMUL_UNRECOGNIZED_FILE-NULL},
899  ${LDEMUL_LIST_OPTIONS-${gld_list_options}},
900  ${LDEMUL_RECOGNIZED_FILE-ldelf_load_symbols},
901  ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
902  ${LDEMUL_NEW_VERS_PATTERN-NULL},
903  ${LDEMUL_EXTRA_MAP_FILE_TEXT-NULL},
904  ${LDEMUL_EMIT_CTF_EARLY-NULL},
905  ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}
906};
907EOF
908