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