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