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