* ld.texinfo (Expression Section): Describe treatment of numbers
[platform/upstream/binutils.git] / ld / emultempl / aix.em
1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 if [ -z "$MACHINE" ]; then
4   OUTPUT_ARCH=${ARCH}
5 else
6   OUTPUT_ARCH=${ARCH}:${MACHINE}
7 fi
8 fragment <<EOF
9 /* This file is is generated by a shell script.  DO NOT EDIT! */
10
11 /* AIX emulation code for ${EMULATION_NAME}
12    Copyright 1991, 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
13    2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
14    Free Software Foundation, Inc.
15    Written by Steve Chamberlain <sac@cygnus.com>
16    AIX support by Ian Lance Taylor <ian@cygnus.com>
17    AIX 64 bit support by Tom Rix <trix@redhat.com>
18
19    This file is part of the GNU Binutils.
20
21    This program is free software; you can redistribute it and/or modify
22    it under the terms of the GNU General Public License as published by
23    the Free Software Foundation; either version 3 of the License, or
24    (at your option) any later version.
25
26    This program is distributed in the hope that it will be useful,
27    but WITHOUT ANY WARRANTY; without even the implied warranty of
28    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29    GNU General Public License for more details.
30
31    You should have received a copy of the GNU General Public License
32    along with this program; if not, write to the Free Software
33    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
34    MA 02110-1301, USA.  */
35
36 #define TARGET_IS_${EMULATION_NAME}
37
38 #include "sysdep.h"
39 #include "bfd.h"
40 #include "libiberty.h"
41 #include "safe-ctype.h"
42 #include "getopt.h"
43 #include "obstack.h"
44 #include "bfdlink.h"
45
46 #include "ld.h"
47 #include "ldmain.h"
48 #include "ldmisc.h"
49 #include "ldexp.h"
50 #include "ldlang.h"
51 #include "ldfile.h"
52 #include "ldemul.h"
53 #include "ldctor.h"
54 #include <ldgram.h>
55
56 #include "coff/internal.h"
57 #include "coff/xcoff.h"
58 #include "libcoff.h"
59 #include "libxcoff.h"
60
61 static void gld${EMULATION_NAME}_read_file (const char *, bfd_boolean);
62 static void gld${EMULATION_NAME}_free (void *);
63 static void gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *);
64 static void gld${EMULATION_NAME}_find_exp_assignment (etree_type *);
65
66
67 /* The file alignment required for each section.  */
68 static unsigned long file_align;
69
70 /* The maximum size the stack is permitted to grow.  This is stored in
71    the a.out header.  */
72 static unsigned long maxstack;
73
74 /* The maximum data size.  This is stored in the a.out header.  */
75 static unsigned long maxdata;
76
77 /* Whether to perform garbage collection.  */
78 static int gc = 1;
79
80 /* The module type to use.  */
81 static unsigned short modtype = ('1' << 8) | 'L';
82
83 /* Whether the .text section must be read-only (i.e., no relocs
84    permitted).  */
85 static int textro;
86
87 /* A mask of XCOFF_EXPALL and XCOFF_EXPFULL flags, as set by their
88    associated -b and -bno options.  */
89 static unsigned int auto_export_flags;
90
91 /* A mask of auto_export_flags bits that were explicitly set on the
92    command line.  */
93 static unsigned int explicit_auto_export_flags;
94
95 /* Whether to implement Unix like linker semantics.  */
96 static int unix_ld;
97
98 /* Structure used to hold import file list.  */
99
100 struct filelist
101 {
102   struct filelist *next;
103   const char *name;
104 };
105
106 /* List of import files.  */
107 static struct filelist *import_files;
108
109 /* List of export symbols read from the export files.  */
110
111 struct export_symbol_list
112 {
113   struct export_symbol_list *next;
114   const char *name;
115 };
116
117 static struct export_symbol_list *export_symbols;
118
119 /* Maintains the 32 or 64 bit mode state of import file */
120 static unsigned int symbol_mode = 0x04;
121
122 /* Which symbol modes are valid */
123 static unsigned int symbol_mode_mask = 0x0d;
124
125 /* Whether this is a 64 bit link */
126 static int is_64bit = 0;
127
128 /* Which syscalls from import file are valid */
129 static unsigned int syscall_mask = 0x77;
130
131 /* fake file for -binitfini support */
132 static lang_input_statement_type *initfini_file;
133
134 /* Whether to do run time linking
135    -brtl enables, -bnortl and -bnortllib disable. */
136 static int rtld;
137
138 /* Explicit command line library path, -blibpath */
139 static char *command_line_blibpath = NULL;
140
141 /* This routine is called before anything else is done.  */
142
143 static void
144 gld${EMULATION_NAME}_before_parse (void)
145 {
146   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
147
148   config.dynamic_link = TRUE;
149   config.has_shared = TRUE;
150
151   /* The link_info.[init|fini]_functions are initialized in ld/lexsup.c.
152      Override them here so we can use the link_info.init_function as a
153      state flag that lets the backend know that -binitfini has been done.  */
154
155   link_info.init_function = NULL;
156   link_info.fini_function = NULL;
157 }
158
159 /* Handle AIX specific options.  */
160
161 enum
162   {
163     OPTION_IGNORE = 300,
164     OPTION_AUTOIMP,
165     OPTION_ERNOTOK,
166     OPTION_EROK,
167     OPTION_EXPALL,
168     OPTION_EXPFULL,
169     OPTION_EXPORT,
170     OPTION_IMPORT,
171     OPTION_INITFINI,
172     OPTION_LOADMAP,
173     OPTION_MAXDATA,
174     OPTION_MAXSTACK,
175     OPTION_MODTYPE,
176     OPTION_NOAUTOIMP,
177     OPTION_NOEXPALL,
178     OPTION_NOEXPFULL,
179     OPTION_NOSTRCMPCT,
180     OPTION_PD,
181     OPTION_PT,
182     OPTION_STRCMPCT,
183     OPTION_UNIX,
184     OPTION_32,
185     OPTION_64,
186     OPTION_LIBPATH,
187     OPTION_NOLIBPATH,
188   };
189
190 static void
191 gld${EMULATION_NAME}_add_options
192   (int ns, char **shortopts, int nl, struct option **longopts,
193    int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
194 {
195   static const char xtra_short[] = "D:H:KT:z";
196   static const struct option xtra_long[] = {
197   /* -binitfini has special handling in the linker backend.  The native linker
198      uses the arguemnts to generate a table of init and fini functions for
199      the executable.  The important use for this option is to support aix 4.2+
200      c++ constructors and destructors.  This is tied into gcc via collect2.c.
201
202      The function table is accessed by the runtime linker/loader by checking if
203      the first symbol in the loader symbol table is __rtinit.  The gnu linker
204      generates this symbol and makes it the first loader symbol.  */
205
206     {"basis", no_argument, NULL, OPTION_IGNORE},
207     {"bautoimp", no_argument, NULL, OPTION_AUTOIMP},
208     {"bcomprld", no_argument, NULL, OPTION_IGNORE},
209     {"bcrld", no_argument, NULL, OPTION_IGNORE},
210     {"bcror31", no_argument, NULL, OPTION_IGNORE},
211     {"bD", required_argument, NULL, OPTION_MAXDATA},
212     {"bE", required_argument, NULL, OPTION_EXPORT},
213     {"bernotok", no_argument, NULL, OPTION_ERNOTOK},
214     {"berok", no_argument, NULL, OPTION_EROK},
215     {"berrmsg", no_argument, NULL, OPTION_IGNORE},
216     {"bexpall", no_argument, NULL, OPTION_EXPALL},
217     {"bexpfull", no_argument, NULL, OPTION_EXPFULL},
218     {"bexport", required_argument, NULL, OPTION_EXPORT},
219     {"bf", no_argument, NULL, OPTION_ERNOTOK},
220     {"bgc", no_argument, &gc, 1},
221     {"bh", required_argument, NULL, OPTION_IGNORE},
222     {"bhalt", required_argument, NULL, OPTION_IGNORE},
223     {"bI", required_argument, NULL, OPTION_IMPORT},
224     {"bimport", required_argument, NULL, OPTION_IMPORT},
225     {"binitfini", required_argument, NULL, OPTION_INITFINI},
226     {"bl", required_argument, NULL, OPTION_LOADMAP},
227     {"bloadmap", required_argument, NULL, OPTION_LOADMAP},
228     {"bmaxdata", required_argument, NULL, OPTION_MAXDATA},
229     {"bmaxstack", required_argument, NULL, OPTION_MAXSTACK},
230     {"bM", required_argument, NULL, OPTION_MODTYPE},
231     {"bmodtype", required_argument, NULL, OPTION_MODTYPE},
232     {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP},
233     {"bnoexpall", no_argument, NULL, OPTION_NOEXPALL},
234     {"bnoexpfull", no_argument, NULL, OPTION_NOEXPFULL},
235     {"bnodelcsect", no_argument, NULL, OPTION_IGNORE},
236     {"bnoentry", no_argument, NULL, OPTION_IGNORE},
237     {"bnogc", no_argument, &gc, 0},
238     {"bnso", no_argument, NULL, OPTION_NOAUTOIMP},
239     {"bnostrcmpct", no_argument, NULL, OPTION_NOSTRCMPCT},
240     {"bnotextro", no_argument, &textro, 0},
241     {"bnro", no_argument, &textro, 0},
242     {"bpD", required_argument, NULL, OPTION_PD},
243     {"bpT", required_argument, NULL, OPTION_PT},
244     {"bro", no_argument, &textro, 1},
245     {"brtl", no_argument, &rtld, 1},
246     {"bnortl", no_argument, &rtld, 0},
247     {"bnortllib", no_argument, &rtld, 0},
248     {"bS", required_argument, NULL, OPTION_MAXSTACK},
249     {"bso", no_argument, NULL, OPTION_AUTOIMP},
250     {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT},
251     {"btextro", no_argument, &textro, 1},
252     {"b32", no_argument, NULL, OPTION_32},
253     {"b64", no_argument, NULL, OPTION_64},
254     {"static", no_argument, NULL, OPTION_NOAUTOIMP},
255     {"unix", no_argument, NULL, OPTION_UNIX},
256     {"blibpath", required_argument, NULL, OPTION_LIBPATH},
257     {"bnolibpath", required_argument, NULL, OPTION_NOLIBPATH},
258     {NULL, no_argument, NULL, 0}
259   };
260
261   /* Options supported by the AIX linker which we do not support: -f,
262      -S, -v, -Z, -bbindcmds, -bbinder, -bbindopts, -bcalls, -bcaps,
263      -bcror15, -bdebugopt, -bdbg, -bdelcsect, -bex?, -bfilelist, -bfl,
264      -bgcbypass, -bglink, -binsert, -bi, -bloadmap, -bl, -bmap, -bnl,
265      -bnobind, -bnocomprld, -bnocrld, -bnoerrmsg, -bnoglink,
266      -bnoloadmap, -bnl, -bnoobjreorder, -bnoquiet, -bnoreorder,
267      -bnotypchk, -bnox, -bquiet, -bR, -brename, -breorder, -btypchk,
268      -bx, -bX, -bxref.  */
269
270   *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
271   memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
272   *longopts = xrealloc (*longopts,
273                         nl * sizeof (struct option) + sizeof (xtra_long));
274   memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
275 }
276
277 static bfd_boolean
278 gld${EMULATION_NAME}_parse_args (int argc, char **argv)
279 {
280   int indx;
281
282   /* If the current option starts with -b, change the first : to an =.
283      The AIX linker uses : to separate the option from the argument;
284      changing it to = lets us treat it as a getopt option.  */
285   indx = optind;
286   if (indx == 0)
287     indx = 1;
288
289   if (indx < argc && CONST_STRNEQ (argv[indx], "-b"))
290     {
291       char *s;
292
293       for (s = argv[indx]; *s != '\0'; s++)
294         {
295           if (*s == ':')
296             {
297               *s = '=';
298               break;
299             }
300         }
301     }
302   return FALSE;
303 }
304
305 static bfd_boolean
306 gld${EMULATION_NAME}_handle_option (int optc)
307 {
308   bfd_signed_vma val;
309   const char *end;
310
311   switch (optc)
312     {
313     default:
314       return FALSE;
315
316     case 0:
317       /* Long option which just sets a flag.  */
318       break;
319
320     case 'D':
321       val = bfd_scan_vma (optarg, &end, 0);
322       if (*end != '\0')
323         einfo ("%P: warning: ignoring invalid -D number %s\n", optarg);
324       else if (val != -1)
325         lang_section_start (".data", exp_intop (val), NULL);
326       break;
327
328     case 'H':
329       val = bfd_scan_vma (optarg, &end, 0);
330       if (*end != '\0' || (val & (val - 1)) != 0)
331         einfo ("%P: warning: ignoring invalid -H number %s\n", optarg);
332       else
333         file_align = val;
334       break;
335
336     case 'K':
337     case 'z':
338       /* FIXME: This should use the page size for the target system.  */
339       file_align = 4096;
340       break;
341
342     case 'T':
343       /* On AIX this is the same as GNU ld -Ttext.  When we see -T
344          number, we assume the AIX option is intended.  Otherwise, we
345          assume the usual GNU ld -T option is intended.  We can't just
346          ignore the AIX option, because gcc passes it to the linker.  */
347       val = bfd_scan_vma (optarg, &end, 0);
348       if (*end != '\0')
349         return FALSE;
350       lang_section_start (".text", exp_intop (val), NULL);
351       break;
352
353     case OPTION_IGNORE:
354       break;
355
356     case OPTION_INITFINI:
357       {
358         /*
359          * The aix linker init fini has the format :
360          *
361          * -binitfini:[ Initial][:Termination][:Priority]
362          *
363          * it allows the Termination and Priority to be optional.
364          *
365          * Since we support only one init/fini pair, we ignore the Priority.
366          *
367          * Define the special symbol __rtinit.
368          *
369          * strtok does not correctly handle the case of -binitfini::fini: so
370          * do it by hand
371          */
372         char *t, *i, *f;
373
374         i = t = optarg;
375         while (*t && ':' != *t)
376           t++;
377         if (*t)
378           *t++ = 0;
379
380         if (0 != strlen (i))
381           link_info.init_function = i;
382
383         f = t;
384         while (*t && ':' != *t)
385           t++;
386         *t = 0;
387
388         if (0 != strlen (f))
389           link_info.fini_function = f;
390       }
391       break;
392
393     case OPTION_AUTOIMP:
394       link_info.static_link = FALSE;
395       break;
396
397     case OPTION_ERNOTOK:
398       link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
399       link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
400       break;
401
402     case OPTION_EROK:
403       link_info.unresolved_syms_in_objects = RM_IGNORE;
404       link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
405       break;
406
407     case OPTION_EXPALL:
408       auto_export_flags |= XCOFF_EXPALL;
409       explicit_auto_export_flags |= XCOFF_EXPALL;
410       break;
411
412     case OPTION_EXPFULL:
413       auto_export_flags |= XCOFF_EXPFULL;
414       explicit_auto_export_flags |= XCOFF_EXPFULL;
415       break;
416
417     case OPTION_EXPORT:
418       gld${EMULATION_NAME}_read_file (optarg, FALSE);
419       break;
420
421     case OPTION_IMPORT:
422       {
423         struct filelist *n;
424         struct filelist **flpp;
425
426         n = (struct filelist *) xmalloc (sizeof (struct filelist));
427         n->next = NULL;
428         n->name = optarg;
429         flpp = &import_files;
430         while (*flpp != NULL)
431           flpp = &(*flpp)->next;
432         *flpp = n;
433       }
434       break;
435
436     case OPTION_LOADMAP:
437       config.map_filename = optarg;
438       break;
439
440     case OPTION_MAXDATA:
441       val = bfd_scan_vma (optarg, &end, 0);
442       if (*end != '\0')
443         einfo ("%P: warning: ignoring invalid -bmaxdata number %s\n", optarg);
444       else
445         maxdata = val;
446       break;
447
448     case OPTION_MAXSTACK:
449       val = bfd_scan_vma (optarg, &end, 0);
450       if (*end != '\0')
451         einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n",
452                optarg);
453       else
454         maxstack = val;
455       break;
456
457     case OPTION_MODTYPE:
458       if (*optarg == 'S')
459         {
460           link_info.shared = TRUE;
461           ++optarg;
462         }
463       if (*optarg == '\0' || optarg[1] == '\0')
464         einfo ("%P: warning: ignoring invalid module type %s\n", optarg);
465       else
466         modtype = (*optarg << 8) | optarg[1];
467       break;
468
469     case OPTION_NOAUTOIMP:
470       link_info.static_link = TRUE;
471       break;
472
473     case OPTION_NOEXPALL:
474       auto_export_flags &= ~XCOFF_EXPALL;
475       explicit_auto_export_flags |= XCOFF_EXPALL;
476       break;
477
478     case OPTION_NOEXPFULL:
479       auto_export_flags &= ~XCOFF_EXPFULL;
480       explicit_auto_export_flags |= XCOFF_EXPFULL;
481       break;
482
483     case OPTION_NOSTRCMPCT:
484       link_info.traditional_format = TRUE;
485       break;
486
487     case OPTION_PD:
488       /* This sets the page that the .data section is supposed to
489          start on.  The offset within the page should still be the
490          offset within the file, so we need to build an appropriate
491          expression.  */
492       val = bfd_scan_vma (optarg, &end, 0);
493       if (*end != '\0')
494         einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg);
495       else
496         {
497           etree_type *t;
498
499           t = exp_binop ('+',
500                          exp_intop (val),
501                          exp_binop ('&',
502                                     exp_nameop (NAME, "."),
503                                     exp_intop (0xfff)));
504           t = exp_binop ('&',
505                          exp_binop ('+', t, exp_intop (31)),
506                          exp_intop (~(bfd_vma) 31));
507           lang_section_start (".data", t, NULL);
508         }
509       break;
510
511     case OPTION_PT:
512       /* This set the page that the .text section is supposed to start
513          on.  The offset within the page should still be the offset
514          within the file.  */
515       val = bfd_scan_vma (optarg, &end, 0);
516       if (*end != '\0')
517         einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg);
518       else
519         {
520           etree_type *t;
521
522           t = exp_binop ('+',
523                          exp_intop (val),
524                          exp_nameop (SIZEOF_HEADERS, NULL));
525           t = exp_binop ('&',
526                          exp_binop ('+', t, exp_intop (31)),
527                          exp_intop (~(bfd_vma) 31));
528           lang_section_start (".text", t, NULL);
529         }
530       break;
531
532     case OPTION_STRCMPCT:
533       link_info.traditional_format = FALSE;
534       break;
535
536     case OPTION_UNIX:
537       unix_ld = TRUE;
538       break;
539
540     case OPTION_32:
541       is_64bit = 0;
542       syscall_mask = 0x77;
543       symbol_mode_mask = 0x0d;
544       break;
545
546     case OPTION_64:
547       is_64bit = 1;
548       syscall_mask = 0xcc;
549       symbol_mode_mask = 0x0e;
550       break;
551
552     case OPTION_LIBPATH:
553       command_line_blibpath = optarg;
554       break;
555
556     case OPTION_NOLIBPATH:
557       command_line_blibpath = NULL;
558       break;
559
560     }
561
562   return TRUE;
563 }
564
565 /* This is called when an input file can not be recognized as a BFD
566    object or an archive.  If the file starts with #!, we must treat it
567    as an import file.  This is for AIX compatibility.  */
568
569 static bfd_boolean
570 gld${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry)
571 {
572   FILE *e;
573   bfd_boolean ret;
574
575   e = fopen (entry->filename, FOPEN_RT);
576   if (e == NULL)
577     return FALSE;
578
579   ret = FALSE;
580
581   if (getc (e) == '#' && getc (e) == '!')
582     {
583       struct filelist *n;
584       struct filelist **flpp;
585
586       n = (struct filelist *) xmalloc (sizeof (struct filelist));
587       n->next = NULL;
588       n->name = entry->filename;
589       flpp = &import_files;
590       while (*flpp != NULL)
591         flpp = &(*flpp)->next;
592       *flpp = n;
593
594       ret = TRUE;
595       entry->loaded = TRUE;
596     }
597
598   fclose (e);
599
600   return ret;
601 }
602
603 /* This is called after the input files have been opened.  */
604
605 static void
606 gld${EMULATION_NAME}_after_open (void)
607 {
608   bfd_boolean r;
609   struct set_info *p;
610
611   after_open_default ();
612
613   /* Call ldctor_build_sets, after pretending that this is a
614      relocatable link.  We do this because AIX requires relocation
615      entries for all references to symbols, even in a final
616      executable.  Of course, we only want to do this if we are
617      producing an XCOFF output file.  */
618   r = link_info.relocatable;
619   if (strstr (bfd_get_target (link_info.output_bfd), "xcoff") != NULL)
620     link_info.relocatable = TRUE;
621   ldctor_build_sets ();
622   link_info.relocatable = r;
623
624   /* For each set, record the size, so that the XCOFF backend can
625      output the correct csect length.  */
626   for (p = sets; p != (struct set_info *) NULL; p = p->next)
627     {
628       bfd_size_type size;
629
630       /* If the symbol is defined, we may have been invoked from
631          collect, and the sets may already have been built, so we do
632          not do anything.  */
633       if (p->h->type == bfd_link_hash_defined
634           || p->h->type == bfd_link_hash_defweak)
635         continue;
636
637       if (p->reloc != BFD_RELOC_CTOR)
638         {
639           /* Handle this if we need to.  */
640           abort ();
641         }
642
643       size = (p->count + 2) * 4;
644       if (!bfd_xcoff_link_record_set (link_info.output_bfd, &link_info,
645                                       p->h, size))
646         einfo ("%F%P: bfd_xcoff_link_record_set failed: %E\n");
647     }
648 }
649
650 /* This is called after the sections have been attached to output
651    sections, but before any sizes or addresses have been set.  */
652
653 static void
654 gld${EMULATION_NAME}_before_allocation (void)
655 {
656   struct filelist *fl;
657   struct export_symbol_list *el;
658   char *libpath;
659   asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
660   static const char *const must_keep_sections[] = {
661     ".text",
662     ".data",
663     ".bss"
664   };
665   unsigned int i, flags;
666
667   /* Handle the import and export files, if any.  */
668   for (fl = import_files; fl != NULL; fl = fl->next)
669     gld${EMULATION_NAME}_read_file (fl->name, TRUE);
670   for (el = export_symbols; el != NULL; el = el->next)
671     {
672       struct bfd_link_hash_entry *h;
673
674       h = bfd_link_hash_lookup (link_info.hash, el->name, FALSE, FALSE, FALSE);
675       if (h == NULL)
676         einfo ("%P%F: bfd_link_hash_lookup of export symbol failed: %E\n");
677       if (!bfd_xcoff_export_symbol (link_info.output_bfd, &link_info, h))
678         einfo ("%P%F: bfd_xcoff_export_symbol failed: %E\n");
679     }
680
681   /* Track down all relocations called for by the linker script (these
682      are typically constructor/destructor entries created by
683      CONSTRUCTORS) and let the backend know it will need to create
684      .loader relocs for them.  */
685   lang_for_each_statement (gld${EMULATION_NAME}_find_relocs);
686
687   /* Precedence of LIBPATH
688      -blibpath:  native support always first
689      -rpath:     gnu extension
690      -L          build from command line -L's */
691   if (command_line_blibpath != NULL)
692     libpath = command_line_blibpath;
693   else if (command_line.rpath != NULL)
694     libpath = command_line.rpath;
695   else if (search_head == NULL)
696     libpath = (char *) "";
697   else
698     {
699       size_t len;
700       search_dirs_type *search;
701
702       /* PR ld/4023: Strip sysroot prefix from any paths
703          being inserted into the output binary's DT_RPATH.  */
704       if (ld_sysroot != NULL
705           && * ld_sysroot != 0)
706         {
707           const char * name = search_head->name;
708           size_t ld_sysroot_len = strlen (ld_sysroot);
709
710           if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0)
711             name += ld_sysroot_len;
712
713           len = strlen (name);
714           libpath = xmalloc (len + 1);
715           strcpy (libpath, name);
716
717           for (search = search_head->next; search != NULL; search = search->next)
718             {
719               size_t nlen;
720
721               name = search->name;
722               if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0)
723                 name += ld_sysroot_len;
724
725               nlen = strlen (name);
726               libpath = xrealloc (libpath, len + nlen + 2);
727               libpath[len] = ':';
728               strcpy (libpath + len + 1, name);
729               len += nlen + 1;
730             }
731         }
732       else
733         {
734           len = strlen (search_head->name);
735           libpath = xmalloc (len + 1);
736           strcpy (libpath, search_head->name);
737
738           for (search = search_head->next; search != NULL; search = search->next)
739             {
740               size_t nlen;
741
742               nlen = strlen (search->name);
743               libpath = xrealloc (libpath, len + nlen + 2);
744               libpath[len] = ':';
745               strcpy (libpath + len + 1, search->name);
746               len += nlen + 1;
747             }
748         }
749     }
750
751   /* Default to -bexpfull for SVR4-like semantics.  */
752   flags = (unix_ld ? XCOFF_EXPFULL : 0);
753   flags &= ~explicit_auto_export_flags;
754   flags |= auto_export_flags;
755
756   /* Let the XCOFF backend set up the .loader section.  */
757   if (!bfd_xcoff_size_dynamic_sections
758       (link_info.output_bfd, &link_info, libpath, entry_symbol.name, file_align,
759        maxstack, maxdata, gc && !unix_ld ? TRUE : FALSE,
760        modtype, textro ? TRUE : FALSE, flags, special_sections,
761        rtld ? TRUE : FALSE))
762     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
763
764   /* Look through the special sections, and put them in the right
765      place in the link ordering.  This is especially magic.  */
766   for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
767     {
768       asection *sec;
769       lang_output_section_statement_type *os;
770       lang_statement_union_type **pls;
771       lang_input_section_type *is;
772       const char *oname;
773       bfd_boolean start;
774
775       sec = special_sections[i];
776       if (sec == NULL)
777         continue;
778
779       /* Remove this section from the list of the output section.
780          This assumes we know what the script looks like.  */
781       is = NULL;
782       os = lang_output_section_find (sec->output_section->name);
783       if (os == NULL)
784         einfo ("%P%F: can't find output section %s\n",
785                sec->output_section->name);
786
787       for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->header.next)
788         {
789           if ((*pls)->header.type == lang_input_section_enum
790               && (*pls)->input_section.section == sec)
791             {
792               is = (lang_input_section_type *) * pls;
793               *pls = (*pls)->header.next;
794               break;
795             }
796
797           if ((*pls)->header.type == lang_wild_statement_enum)
798             {
799               lang_statement_union_type **pwls;
800
801               for (pwls = &(*pls)->wild_statement.children.head;
802                    *pwls != NULL; pwls = &(*pwls)->header.next)
803                 {
804
805                   if ((*pwls)->header.type == lang_input_section_enum
806                       && (*pwls)->input_section.section == sec)
807                     {
808                       is = (lang_input_section_type *) * pwls;
809                       *pwls = (*pwls)->header.next;
810                       break;
811                     }
812                 }
813
814               if (is != NULL)
815                 break;
816             }
817         }
818
819       if (is == NULL)
820         {
821           einfo ("%P%F: can't find %s in output section\n",
822                  bfd_get_section_name (sec->owner, sec));
823         }
824
825       /* Now figure out where the section should go.  */
826       switch (i)
827         {
828
829         default:                /* to avoid warnings */
830         case XCOFF_SPECIAL_SECTION_TEXT:
831           /* _text */
832           oname = ".text";
833           start = TRUE;
834           break;
835
836         case XCOFF_SPECIAL_SECTION_ETEXT:
837           /* _etext */
838           oname = ".text";
839           start = FALSE;
840           break;
841
842         case XCOFF_SPECIAL_SECTION_DATA:
843           /* _data */
844           oname = ".data";
845           start = TRUE;
846           break;
847
848         case XCOFF_SPECIAL_SECTION_EDATA:
849           /* _edata */
850           oname = ".data";
851           start = FALSE;
852           break;
853
854         case XCOFF_SPECIAL_SECTION_END:
855         case XCOFF_SPECIAL_SECTION_END2:
856           /* _end and end */
857           oname = ".bss";
858           start = FALSE;
859           break;
860         }
861
862       os = lang_output_section_find (oname);
863
864       if (start)
865         {
866           is->header.next = os->children.head;
867           os->children.head = (lang_statement_union_type *) is;
868         }
869       else
870         {
871           is->header.next = NULL;
872           lang_statement_append (&os->children,
873                                  (lang_statement_union_type *) is,
874                                  &is->header.next);
875         }
876     }
877
878   /* Executables and shared objects must always have .text, .data
879      and .bss output sections, so that the header can refer to them.
880      The kernel refuses to load objects that have missing sections.  */
881   if (!link_info.relocatable)
882     for (i = 0; i < ARRAY_SIZE (must_keep_sections); i++)
883       {
884         asection *sec;
885
886         sec = bfd_get_section_by_name (link_info.output_bfd,
887                                        must_keep_sections[i]);
888         if (sec == NULL)
889           einfo ("%P: can't find required output section %s\n", must_keep_sections[i]);
890         else
891           sec->flags |= SEC_KEEP;
892       }
893
894   before_allocation_default ();
895 }
896
897 static char *
898 gld${EMULATION_NAME}_choose_target (int argc, char **argv)
899 {
900   int i, j, jmax;
901   static char *from_outside;
902   static char *from_inside;
903   static char *argv_to_target[][2] = {
904     {NULL,   "${OUTPUT_FORMAT}"},
905     {"-b32", "${OUTPUT_FORMAT_32BIT}"},
906     {"-b64", "${OUTPUT_FORMAT_64BIT}"},
907   };
908
909   jmax = 3;
910
911   from_outside = getenv (TARGET_ENVIRON);
912   if (from_outside != (char *) NULL)
913     return from_outside;
914
915   /* Set to default. */
916   from_inside = argv_to_target[0][1];
917   for (i = 1; i < argc; i++)
918     {
919       for (j = 1; j < jmax; j++)
920         {
921           if (0 == strcmp (argv[i], argv_to_target[j][0]))
922             from_inside = argv_to_target[j][1];
923         }
924     }
925
926   return from_inside;
927 }
928
929 /* Returns
930    1 : state changed
931    0 : no change */
932 static int
933 change_symbol_mode (char *input)
934 {
935   char *symbol_mode_string[] = {
936     "# 32",                     /* 0x01 */
937     "# 64",                     /* 0x02 */
938     "# no32",                   /* 0x04 */
939     "# no64",                   /* 0x08 */
940     NULL,
941   };
942
943   unsigned int bit;
944   char *string;
945
946   for (bit = 0;; bit++)
947     {
948       string = symbol_mode_string[bit];
949       if (string == NULL)
950         return 0;
951
952       if (0 == strcmp (input, string))
953         {
954           symbol_mode = (1 << bit);
955           return 1;
956         }
957     }
958   /* should not be here */
959   return 0;
960 }
961
962 /* Returns
963    1 : yes
964    0 : ignore
965    -1 : error, try something else */
966 static int
967 is_syscall (char *input, unsigned int *flag)
968 {
969   unsigned int bit;
970   char *string;
971
972   struct sc {
973     char *syscall_string;
974     unsigned int flag;
975   } s [] = {
976     { "svc"         /* 0x01 */, XCOFF_SYSCALL32 },
977     { "svc32"       /* 0x02 */, XCOFF_SYSCALL32 },
978     { "svc3264"     /* 0x04 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
979     { "svc64"       /* 0x08 */, XCOFF_SYSCALL64 },
980     { "syscall"     /* 0x10 */, XCOFF_SYSCALL32 },
981     { "syscall32"   /* 0x20 */, XCOFF_SYSCALL32 },
982     { "syscall3264" /* 0x40 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
983     { "syscall64"   /* 0x80 */, XCOFF_SYSCALL64 },
984     { NULL, 0 },
985   };
986
987   *flag = 0;
988
989   for (bit = 0;; bit++)
990     {
991       string = s[bit].syscall_string;
992       if (string == NULL)
993         return -1;
994
995       if (0 == strcmp (input, string))
996         {
997           if (1 << bit & syscall_mask)
998             {
999               *flag = s[bit].flag;
1000               return 1;
1001             }
1002           else
1003             {
1004               return 0;
1005             }
1006         }
1007     }
1008   /* should not be here */
1009   return -1;
1010 }
1011
1012 /* Read an import or export file.  For an import file, this is called
1013    by the before_allocation emulation routine.  For an export file,
1014    this is called by the handle_option emulation routine.  */
1015
1016 static void
1017 gld${EMULATION_NAME}_read_file (const char *filename, bfd_boolean import)
1018 {
1019   struct obstack *o;
1020   FILE *f;
1021   int lineno;
1022   int c;
1023   bfd_boolean keep;
1024   const char *imppath;
1025   const char *impfile;
1026   const char *impmember;
1027
1028   o = (struct obstack *) xmalloc (sizeof (struct obstack));
1029   obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
1030
1031   f = fopen (filename, FOPEN_RT);
1032   if (f == NULL)
1033     {
1034       bfd_set_error (bfd_error_system_call);
1035       einfo ("%F%s: %E\n", filename);
1036     }
1037
1038   keep = FALSE;
1039
1040   imppath = NULL;
1041   impfile = NULL;
1042   impmember = NULL;
1043
1044   lineno = 0;
1045
1046   /* Default to 32 and 64 bit mode
1047      symbols at top of /lib/syscalls.exp do not have a mode modifier and they
1048      are not repeated, assume 64 bit routines also want to use them.
1049      See the routine change_symbol_mode for more information.  */
1050
1051   symbol_mode = 0x04;
1052
1053   while ((c = getc (f)) != EOF)
1054     {
1055       char *s;
1056       char *symname;
1057       unsigned int syscall_flag = 0;
1058       bfd_vma address;
1059       struct bfd_link_hash_entry *h;
1060
1061       if (c != '\n')
1062         {
1063           obstack_1grow (o, c);
1064           continue;
1065         }
1066
1067       obstack_1grow (o, '\0');
1068       ++lineno;
1069
1070       s = (char *) obstack_base (o);
1071       while (ISSPACE (*s))
1072         ++s;
1073       if (*s == '\0'
1074           || *s == '*'
1075           || change_symbol_mode (s)
1076           || (*s == '#' && s[1] == ' ')
1077           || (!import && *s == '#' && s[1] == '!'))
1078         {
1079           obstack_free (o, obstack_base (o));
1080           continue;
1081         }
1082
1083       if (*s == '#' && s[1] == '!')
1084         {
1085           s += 2;
1086           while (ISSPACE (*s))
1087             ++s;
1088           if (*s == '\0')
1089             {
1090               imppath = NULL;
1091               impfile = NULL;
1092               impmember = NULL;
1093               obstack_free (o, obstack_base (o));
1094             }
1095           else if (*s == '(')
1096             einfo ("%F%s%d: #! ([member]) is not supported in import files\n",
1097                    filename, lineno);
1098           else
1099             {
1100               char cs;
1101               char *start;
1102
1103               (void) obstack_finish (o);
1104               keep = TRUE;
1105               start = s;
1106               while (!ISSPACE (*s) && *s != '(' && *s != '\0')
1107                 ++s;
1108               cs = *s;
1109               *s = '\0';
1110               if (!bfd_xcoff_split_import_path (link_info.output_bfd,
1111                                                 start, &imppath, &impfile))
1112                 einfo ("%F%P: Could not parse import path: %E\n");
1113               while (ISSPACE (cs))
1114                 {
1115                   ++s;
1116                   cs = *s;
1117                 }
1118               if (cs != '(')
1119                 {
1120                   impmember = "";
1121                   if (cs != '\0')
1122                     einfo ("%s:%d: warning: syntax error in import file\n",
1123                            filename, lineno);
1124                 }
1125               else
1126                 {
1127                   ++s;
1128                   impmember = s;
1129                   while (*s != ')' && *s != '\0')
1130                     ++s;
1131                   if (*s == ')')
1132                     *s = '\0';
1133                   else
1134                     einfo ("%s:%d: warning: syntax error in import file\n",
1135                            filename, lineno);
1136                 }
1137             }
1138
1139           continue;
1140         }
1141
1142       if (symbol_mode & symbol_mode_mask)
1143         {
1144           /* This is a symbol to be imported or exported.  */
1145           symname = s;
1146           syscall_flag = 0;
1147           address = (bfd_vma) -1;
1148
1149           while (!ISSPACE (*s) && *s != '\0')
1150             ++s;
1151           if (*s != '\0')
1152             {
1153               char *se;
1154
1155               *s++ = '\0';
1156
1157               while (ISSPACE (*s))
1158                 ++s;
1159
1160               se = s;
1161               while (!ISSPACE (*se) && *se != '\0')
1162                 ++se;
1163               if (*se != '\0')
1164                 {
1165                   *se++ = '\0';
1166                   while (ISSPACE (*se))
1167                     ++se;
1168                   if (*se != '\0')
1169                     einfo ("%s%d: warning: syntax error in import/export file\n",
1170                            filename, lineno);
1171                 }
1172
1173               if (s != se)
1174                 {
1175                   int status;
1176                   const char *end;
1177
1178                   status = is_syscall (s, &syscall_flag);
1179
1180                   if (0 > status)
1181                     {
1182                       /* not a system call, check for address */
1183                       address = bfd_scan_vma (s, &end, 0);
1184                       if (*end != '\0')
1185                         {
1186                           einfo ("%s:%d: warning: syntax error in import/export file\n",
1187                                  filename, lineno);
1188
1189                         }
1190                     }
1191                 }
1192             }
1193
1194           if (!import)
1195             {
1196               struct export_symbol_list *n;
1197
1198               ldlang_add_undef (symname, TRUE);
1199               n = ((struct export_symbol_list *)
1200                    xmalloc (sizeof (struct export_symbol_list)));
1201               n->next = export_symbols;
1202               n->name = xstrdup (symname);
1203               export_symbols = n;
1204             }
1205           else
1206             {
1207               h = bfd_link_hash_lookup (link_info.hash, symname, FALSE, FALSE,
1208                                         TRUE);
1209               if (h == NULL || h->type == bfd_link_hash_new)
1210                 {
1211                   /* We can just ignore attempts to import an unreferenced
1212                      symbol.  */
1213                 }
1214               else
1215                 {
1216                   if (!bfd_xcoff_import_symbol (link_info.output_bfd,
1217                                                 &link_info, h,
1218                                                 address, imppath, impfile,
1219                                                 impmember, syscall_flag))
1220                     einfo ("%X%s:%d: failed to import symbol %s: %E\n",
1221                            filename, lineno, symname);
1222                 }
1223             }
1224         }
1225       obstack_free (o, obstack_base (o));
1226     }
1227
1228   if (obstack_object_size (o) > 0)
1229     {
1230       einfo ("%s:%d: warning: ignoring unterminated last line\n",
1231              filename, lineno);
1232       obstack_free (o, obstack_base (o));
1233     }
1234
1235   if (!keep)
1236     {
1237       obstack_free (o, NULL);
1238       free (o);
1239     }
1240 }
1241
1242 /* This routine saves us from worrying about declaring free.  */
1243
1244 static void
1245 gld${EMULATION_NAME}_free (void *p)
1246 {
1247   free (p);
1248 }
1249
1250 /* This is called by the before_allocation routine via
1251    lang_for_each_statement.  It looks for relocations and assignments
1252    to symbols.  */
1253
1254 static void
1255 gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *s)
1256 {
1257   if (s->header.type == lang_reloc_statement_enum)
1258     {
1259       lang_reloc_statement_type *rs;
1260
1261       rs = &s->reloc_statement;
1262       if (rs->name == NULL)
1263         einfo ("%F%P: only relocations against symbols are permitted\n");
1264       if (!bfd_xcoff_link_count_reloc (link_info.output_bfd, &link_info,
1265                                        rs->name))
1266         einfo ("%F%P: bfd_xcoff_link_count_reloc failed: %E\n");
1267     }
1268
1269   if (s->header.type == lang_assignment_statement_enum)
1270     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1271 }
1272
1273 /* Look through an expression for an assignment statement.  */
1274
1275 static void
1276 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1277 {
1278   struct bfd_link_hash_entry *h;
1279
1280   switch (exp->type.node_class)
1281     {
1282     case etree_provide:
1283       h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
1284                                 FALSE, FALSE, FALSE);
1285       if (h == NULL)
1286         break;
1287       /* Fall through.  */
1288     case etree_assign:
1289       if (strcmp (exp->assign.dst, ".") != 0)
1290         {
1291           if (!bfd_xcoff_record_link_assignment (link_info.output_bfd,
1292                                                  &link_info,
1293                                                  exp->assign.dst))
1294             einfo ("%P%F: failed to record assignment to %s: %E\n",
1295                    exp->assign.dst);
1296         }
1297       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1298       break;
1299
1300     case etree_binary:
1301       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1302       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1303       break;
1304
1305     case etree_trinary:
1306       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1307       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1308       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1309       break;
1310
1311     case etree_unary:
1312       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1313       break;
1314
1315     default:
1316       break;
1317     }
1318 }
1319
1320 static char *
1321 gld${EMULATION_NAME}_get_script (int *isfile)
1322 EOF
1323
1324 if test -n "$COMPILE_IN"
1325 then
1326 # Scripts compiled in.
1327
1328 # sed commands to quote an ld script as a C string.
1329 sc="-f ${srcdir}/emultempl/ostring.sed"
1330
1331 fragment <<EOF
1332 {
1333   *isfile = 0;
1334
1335   if (link_info.relocatable && config.build_constructors)
1336     return
1337 EOF
1338 sed $sc ldscripts/${EMULATION_NAME}.xu                 >> e${EMULATION_NAME}.c
1339 echo '  ; else if (link_info.relocatable) return'     >> e${EMULATION_NAME}.c
1340 sed $sc ldscripts/${EMULATION_NAME}.xr                 >> e${EMULATION_NAME}.c
1341 echo '  ; else if (!config.text_read_only) return'     >> e${EMULATION_NAME}.c
1342 sed $sc ldscripts/${EMULATION_NAME}.xbn                >> e${EMULATION_NAME}.c
1343 echo '  ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1344 sed $sc ldscripts/${EMULATION_NAME}.xn                 >> e${EMULATION_NAME}.c
1345 echo '  ; else return'                                 >> e${EMULATION_NAME}.c
1346 sed $sc ldscripts/${EMULATION_NAME}.x                  >> e${EMULATION_NAME}.c
1347 echo '; }'                                             >> e${EMULATION_NAME}.c
1348
1349 else
1350 # Scripts read from the filesystem.
1351
1352 fragment <<EOF
1353 {
1354   *isfile = 1;
1355
1356   if (link_info.relocatable && config.build_constructors)
1357     return "ldscripts/${EMULATION_NAME}.xu";
1358   else if (link_info.relocatable)
1359     return "ldscripts/${EMULATION_NAME}.xr";
1360   else if (!config.text_read_only)
1361     return "ldscripts/${EMULATION_NAME}.xbn";
1362   else if (!config.magic_demand_paged)
1363     return "ldscripts/${EMULATION_NAME}.xn";
1364   else
1365     return "ldscripts/${EMULATION_NAME}.x";
1366 }
1367 EOF
1368
1369 fi
1370
1371 fragment <<EOF
1372
1373 static void
1374 gld${EMULATION_NAME}_create_output_section_statements (void)
1375 {
1376   /* __rtinit */
1377   if ((bfd_get_flavour (link_info.output_bfd) == bfd_target_xcoff_flavour)
1378       && (link_info.init_function != NULL
1379           || link_info.fini_function != NULL
1380           || rtld))
1381     {
1382       initfini_file = lang_add_input_file ("initfini",
1383                                            lang_input_file_is_file_enum,
1384                                            NULL);
1385
1386       initfini_file->the_bfd = bfd_create ("initfini", link_info.output_bfd);
1387       if (initfini_file->the_bfd == NULL
1388           || ! bfd_set_arch_mach (initfini_file->the_bfd,
1389                                   bfd_get_arch (link_info.output_bfd),
1390                                   bfd_get_mach (link_info.output_bfd)))
1391         {
1392           einfo ("%X%P: can not create BFD %E\n");
1393           return;
1394         }
1395
1396       /* Call backend to fill in the rest */
1397       if (! bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd,
1398                                             link_info.init_function,
1399                                             link_info.fini_function,
1400                                             rtld))
1401         {
1402           einfo ("%X%P: can not create BFD %E\n");
1403           return;
1404         }
1405
1406       /* __rtld defined in /lib/librtl.a */
1407       if (rtld)
1408         lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL);
1409     }
1410 }
1411
1412 static void
1413 gld${EMULATION_NAME}_set_output_arch (void)
1414 {
1415   bfd_set_arch_mach (link_info.output_bfd,
1416                      bfd_xcoff_architecture (link_info.output_bfd),
1417                      bfd_xcoff_machine (link_info.output_bfd));
1418
1419   ldfile_output_architecture = bfd_get_arch (link_info.output_bfd);
1420   ldfile_output_machine = bfd_get_mach (link_info.output_bfd);
1421   ldfile_output_machine_name = bfd_printable_name (link_info.output_bfd);
1422 }
1423
1424 static bfd_boolean
1425 gld${EMULATION_NAME}_open_dynamic_archive (const char *arch,
1426                                            search_dirs_type *search,
1427                                            lang_input_statement_type *entry)
1428 {
1429   char *path;
1430
1431   if (!entry->maybe_archive)
1432     return FALSE;
1433
1434   path = concat (search->name, "/lib", entry->filename, arch, ".a", NULL);
1435   if (!ldfile_try_open_bfd (path, entry))
1436     {
1437       free (path);
1438       return FALSE;
1439     }
1440   /* Don't include the searched directory in the import path.  */
1441   bfd_xcoff_set_archive_import_path (&link_info, entry->the_bfd,
1442                                      path + strlen (search->name) + 1);
1443   entry->filename = path;
1444   return TRUE;
1445 }
1446
1447 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
1448   gld${EMULATION_NAME}_before_parse,
1449   syslib_default,
1450   hll_default,
1451   after_parse_default,
1452   gld${EMULATION_NAME}_after_open,
1453   after_allocation_default,
1454   gld${EMULATION_NAME}_set_output_arch,
1455   gld${EMULATION_NAME}_choose_target,
1456   gld${EMULATION_NAME}_before_allocation,
1457   gld${EMULATION_NAME}_get_script,
1458   "${EMULATION_NAME}",
1459   "${OUTPUT_FORMAT}",
1460   finish_default,
1461   gld${EMULATION_NAME}_create_output_section_statements,
1462   gld${EMULATION_NAME}_open_dynamic_archive,
1463   0,                            /* place_orphan */
1464   0,                            /* set_symbols */
1465   gld${EMULATION_NAME}_parse_args,
1466   gld${EMULATION_NAME}_add_options,
1467   gld${EMULATION_NAME}_handle_option,
1468   gld${EMULATION_NAME}_unrecognized_file,
1469   NULL,                         /* list_options */
1470   NULL,                         /* recognized_file */
1471   NULL,                         /* find potential_libraries */
1472   NULL                          /* new_vers_pattern */
1473 };
1474 EOF