* ldemul.c (ldemul_new_vers_pattern): New function.
[binutils.git] / ld / emultempl / aix.em
blob3caa0187266c27c393504cf648d27a140fdd7c25
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
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}_before_parse PARAMS ((void));
60 static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
61 static void gld${EMULATION_NAME}_after_open PARAMS ((void));
62 static char *gld${EMULATION_NAME}_choose_target PARAMS ((int, char **));
63 static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
64 static void gld${EMULATION_NAME}_read_file PARAMS ((const char *, boolean));
65 static void gld${EMULATION_NAME}_free PARAMS ((PTR));
66 static void gld${EMULATION_NAME}_find_relocs 
67 PARAMS ((lang_statement_union_type *));
68 static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
69 static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
70 static boolean gld${EMULATION_NAME}_unrecognized_file
71   PARAMS ((lang_input_statement_type *));
72 static void gld${EMULATION_NAME}_create_output_section_statements 
73   PARAMS ((void));
74 static void gld${EMULATION_NAME}_set_output_arch PARAMS ((void));
76 static int is_syscall PARAMS ((char *, unsigned int *));
77 static int change_symbol_mode PARAMS ((char *));
79 /* The file alignment required for each section.  */
80 static unsigned long file_align;
82 /* The maximum size the stack is permitted to grow.  This is stored in
83    the a.out header.  */
84 static unsigned long maxstack;
86 /* The maximum data size.  This is stored in the a.out header.  */
87 static unsigned long maxdata;
89 /* Whether to perform garbage collection.  */
90 static int gc = 1;
92 /* The module type to use.  */
93 static unsigned short modtype = ('1' << 8) | 'L';
95 /* Whether the .text section must be read-only (i.e., no relocs
96    permitted).  */
97 static int textro;
99 /* Whether to implement Unix like linker semantics.  */
100 static int unix_ld;
102 /* Structure used to hold import file list.  */
104 struct filelist
106   struct filelist *next;
107   const char *name;
110 /* List of import files.  */
111 static struct filelist *import_files;
113 /* List of export symbols read from the export files.  */
115 struct export_symbol_list
117   struct export_symbol_list *next;
118   const char *name;
121 static struct export_symbol_list *export_symbols;
123 /* Maintains the 32 or 64 bit mode state of import file */
124 static unsigned int symbol_mode = 0x04;
126 /* Which symbol modes are valid */
127 static unsigned int symbol_mode_mask = 0x0d;
129 /* Whether this is a 64 bit link */
130 static int is_64bit = 0;
132 /* Which syscalls from import file are valid */
133 static unsigned int syscall_mask = 0x77;
135 /* fake file for -binitfini support */
136 static lang_input_statement_type *initfini_file;
138 /* Whether to do run time linking 
139    -brtl enables, -bnortl and -bnortllib disable. */
140 static int rtld;
142 /* Explicit command line library path, -blibpath */
143 static char *command_line_blibpath = NULL;
145 /* This routine is called before anything else is done.  */
147 static void
148 gld${EMULATION_NAME}_before_parse ()
151   config.has_shared = true;
153   /* The link_info.[init|fini]_functions are initialized in ld/lexsup.c.
154      Override them here so we can use the link_info.init_function as a
155      state flag that lets the backend know that -binitfini has been done.  */ 
157   link_info.init_function = NULL;
158   link_info.fini_function = NULL;
161 /* Handle AIX specific options.  */
163 static int
164 gld${EMULATION_NAME}_parse_args (argc, argv)
165      int argc;
166      char **argv;
168   int prevoptind = optind;
169   int prevopterr = opterr;
170   int indx;
171   int longind;
172   int optc;
173   bfd_signed_vma val;
174   char *end;
176   enum 
177   {
178     OPTION_IGNORE = 300,
179     OPTION_AUTOIMP,
180     OPTION_ERNOTOK,
181     OPTION_EROK,
182     OPTION_EXPORT,
183     OPTION_IMPORT,
184     OPTION_INITFINI,
185     OPTION_LOADMAP,
186     OPTION_MAXDATA,
187     OPTION_MAXSTACK,
188     OPTION_MODTYPE,
189     OPTION_NOAUTOIMP,
190     OPTION_NOSTRCMPCT,
191     OPTION_PD,
192     OPTION_PT,
193     OPTION_STRCMPCT,
194     OPTION_UNIX,
195     OPTION_32,
196     OPTION_64,
197     OPTION_LIBPATH,
198     OPTION_NOLIBPATH,
199   };
201   /* -binitfini has special handling in the linker backend.  The native linker
202      uses the arguemnts to generate a table of init and fini functions for
203      the executable.  The important use for this option is to support aix 4.2+
204      c++ constructors and destructors.  This is tied into gcc via collect2.c.
205      
206      The function table is accessed by the runtime linker/loader by checking if
207      the first symbol in the loader symbol table is __rtinit.  The gnu linker
208      generates this symbol and makes it the first loader symbol.  */
210   static const struct option longopts[] = {
211     {"basis", no_argument, NULL, OPTION_IGNORE},
212     {"bautoimp", no_argument, NULL, OPTION_AUTOIMP},
213     {"bcomprld", no_argument, NULL, OPTION_IGNORE},
214     {"bcrld", no_argument, NULL, OPTION_IGNORE},
215     {"bcror31", no_argument, NULL, OPTION_IGNORE},
216     {"bD", required_argument, NULL, OPTION_MAXDATA},
217     {"bE", required_argument, NULL, OPTION_EXPORT},
218     {"bernotok", no_argument, NULL, OPTION_ERNOTOK},
219     {"berok", no_argument, NULL, OPTION_EROK},
220     {"berrmsg", no_argument, NULL, OPTION_IGNORE},
221     {"bexport", required_argument, NULL, OPTION_EXPORT},
222     {"bf", no_argument, NULL, OPTION_ERNOTOK},
223     {"bgc", no_argument, &gc, 1},
224     {"bh", required_argument, NULL, OPTION_IGNORE},
225     {"bhalt", required_argument, NULL, OPTION_IGNORE},
226     {"bI", required_argument, NULL, OPTION_IMPORT},
227     {"bimport", required_argument, NULL, OPTION_IMPORT},
228     {"binitfini", required_argument, NULL, OPTION_INITFINI},
229     {"bl", required_argument, NULL, OPTION_LOADMAP},
230     {"bloadmap", required_argument, NULL, OPTION_LOADMAP},
231     {"bmaxdata", required_argument, NULL, OPTION_MAXDATA},
232     {"bmaxstack", required_argument, NULL, OPTION_MAXSTACK},
233     {"bM", required_argument, NULL, OPTION_MODTYPE},
234     {"bmodtype", required_argument, NULL, OPTION_MODTYPE},
235     {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP},
236     {"bnodelcsect", no_argument, NULL, OPTION_IGNORE},
237     {"bnoentry", no_argument, NULL, OPTION_IGNORE},
238     {"bnogc", no_argument, &gc, 0},
239     {"bnso", no_argument, NULL, OPTION_NOAUTOIMP},
240     {"bnostrcmpct", no_argument, NULL, OPTION_NOSTRCMPCT},
241     {"bnotextro", no_argument, &textro, 0},
242     {"bnro", no_argument, &textro, 0},
243     {"bpD", required_argument, NULL, OPTION_PD},
244     {"bpT", required_argument, NULL, OPTION_PT},
245     {"bro", no_argument, &textro, 1},
246     {"brtl", no_argument, &rtld, 1},
247     {"bnortl", no_argument, &rtld, 0},
248     {"bnortllib", no_argument, &rtld, 0},
249     {"bS", required_argument, NULL, OPTION_MAXSTACK},
250     {"bso", no_argument, NULL, OPTION_AUTOIMP},
251     {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT},
252     {"btextro", no_argument, &textro, 1},
253     {"b32", no_argument, NULL, OPTION_32},
254     {"b64", no_argument, NULL, OPTION_64},
255     {"static", no_argument, NULL, OPTION_NOAUTOIMP},
256     {"unix", no_argument, NULL, OPTION_UNIX},
257     {"blibpath", required_argument, NULL, OPTION_LIBPATH},
258     {"bnolibpath", required_argument, NULL, OPTION_NOLIBPATH},
259     {NULL, no_argument, NULL, 0}
260   };
262   /* Options supported by the AIX linker which we do not support: -f,
263      -S, -v, -Z, -bbindcmds, -bbinder, -bbindopts, -bcalls, -bcaps,
264      -bcror15, -bdebugopt, -bdbg, -bdelcsect, -bex?, -bfilelist, -bfl,
265      -bgcbypass, -bglink, -binsert, -bi, -bloadmap, -bl, -bmap, -bnl,
266      -bnobind, -bnocomprld, -bnocrld, -bnoerrmsg, -bnoglink,
267      -bnoloadmap, -bnl, -bnoobjreorder, -bnoquiet, -bnoreorder,
268      -bnotypchk, -bnox, -bquiet, -bR, -brename, -breorder, -btypchk,
269      -bx, -bX, -bxref.  */
271   /* If the current option starts with -b, change the first : to an =.
272      The AIX linker uses : to separate the option from the argument;
273      changing it to = lets us treat it as a getopt option.  */
274   indx = optind;
275   if (indx == 0)
276     indx = 1;
278   if (indx < argc && strncmp (argv[indx], "-b", 2) == 0)
279     {
280       char *s;
282       for (s = argv[indx]; *s != '\0'; s++)
283         {
284           if (*s == ':')
285             {
286               *s = '=';
287               break;
288             }
289         }
290     }
293   /* We add s and u so to the short options list so that -s and -u on
294      the command line do not match -static and -unix.  */
296   opterr = 0;
297   optc = getopt_long_only (argc, argv, "-D:H:KT:zsu", longopts, &longind);
298   opterr = prevopterr;
300   switch (optc)
301     {
302     case 's':
303     case 'u':
304     default:
305       optind = prevoptind;
306       return 0;
308     case 0:
309       /* Long option which just sets a flag.  */
310       break;
312     case 'D':
313       val = strtoll (optarg, &end, 0);
314       if (*end != '\0')
315         einfo ("%P: warning: ignoring invalid -D number %s\n", optarg);
316       else if (val != -1)
317         lang_section_start (".data", exp_intop (val));
318       break;
320     case 'H':
321       val = strtoul (optarg, &end, 0);
322       if (*end != '\0' || (val & (val - 1)) != 0)
323         einfo ("%P: warning: ignoring invalid -H number %s\n", optarg);
324       else
325         file_align = val;
326       break;
328     case 'K':
329     case 'z':
330       /* FIXME: This should use the page size for the target system.  */
331       file_align = 4096;
332       break;
334     case 'T':
335       /* On AIX this is the same as GNU ld -Ttext.  When we see -T
336          number, we assume the AIX option is intended.  Otherwise, we
337          assume the usual GNU ld -T option is intended.  We can't just
338          ignore the AIX option, because gcc passes it to the linker.  */
339       val = strtoull (optarg, &end, 0);
340       if (*end != '\0')
341         {
342           optind = prevoptind;
343           return 0;
344         }
345       lang_section_start (".text", exp_intop (val));
346       break;
348     case OPTION_IGNORE:
349       break;
351     case OPTION_INITFINI:
352       {
353         /*
354          * The aix linker init fini has the format :
355          *
356          * -binitfini:[ Initial][:Termination][:Priority]
357          *
358          * it allows the Termination and Priority to be optional.
359          *
360          * Since we support only one init/fini pair, we ignore the Priority.
361          *
362          * Define the special symbol __rtinit.
363          *
364          * strtok does not correctly handle the case of -binitfini::fini: so
365          * do it by hand
366          */
367         char *t, *i, *f;
369         i = t = optarg;
370         while (*t && ':' != *t)
371           t++;
372         if (*t)
373           *t++ = 0;
375         if (0 != strlen (i))
376           link_info.init_function = i;
378         f = t;
379         while (*t && ':' != *t)
380           t++;
381         *t = 0;
383         if (0 != strlen (f))
384           link_info.fini_function = f;
385       }
386       break;
387       
388     case OPTION_AUTOIMP:
389       link_info.static_link = false;
390       break;
392     case OPTION_ERNOTOK:
393       force_make_executable = false;
394       break;
396     case OPTION_EROK:
397       force_make_executable = true;
398       break;
400     case OPTION_EXPORT:
401       gld${EMULATION_NAME}_read_file (optarg, false);
402       break;
404     case OPTION_IMPORT:
405       {
406         struct filelist *n;
407         struct filelist **flpp;
409         n = (struct filelist *) xmalloc (sizeof (struct filelist));
410         n->next = NULL;
411         n->name = optarg;
412         flpp = &import_files;
413         while (*flpp != NULL)
414           flpp = &(*flpp)->next;
415         *flpp = n;
416       }
417       break;
419     case OPTION_LOADMAP:
420       config.map_filename = optarg;
421       break;
423     case OPTION_MAXDATA:
424       val = strtoull (optarg, &end, 0);
425       if (*end != '\0')
426         einfo ("%P: warning: ignoring invalid -bmaxdata number %s\n", optarg);
427       else
428         maxdata = val;
429       break;
431     case OPTION_MAXSTACK:
432       val = strtoull (optarg, &end, 0);
433       if (*end != '\0')
434         einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n", 
435                optarg);
436       else
437         maxstack = val;
438       break;
440     case OPTION_MODTYPE:
441       if (*optarg == 'S')
442         {
443           link_info.shared = true;
444           ++optarg;
445         }
446       if (*optarg == '\0' || optarg[1] == '\0')
447         einfo ("%P: warning: ignoring invalid module type %s\n", optarg);
448       else
449         modtype = (*optarg << 8) | optarg[1];
450       break;
452     case OPTION_NOAUTOIMP:
453       link_info.static_link = true;
454       break;
456     case OPTION_NOSTRCMPCT:
457       link_info.traditional_format = true;
458       break;
460     case OPTION_PD:
461       /* This sets the page that the .data section is supposed to
462          start on.  The offset within the page should still be the
463          offset within the file, so we need to build an appropriate
464          expression.  */
465       val = strtoull (optarg, &end, 0);
466       if (*end != '\0')
467         einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg);
468       else
469         {
470           etree_type *t;
472           t = exp_binop ('+',
473                          exp_intop (val),
474                          exp_binop ('&',
475                                     exp_nameop (NAME, "."),
476                                     exp_intop (0xfff)));
477           t = exp_binop ('&',
478                          exp_binop ('+', t, exp_intop (31)),
479                          exp_intop (~(bfd_vma) 31));
480           lang_section_start (".data", t);
481         }
482       break;
484     case OPTION_PT:
485       /* This set the page that the .text section is supposed to start
486          on.  The offset within the page should still be the offset
487          within the file.  */
488       val = strtoull (optarg, &end, 0);
489       if (*end != '\0')
490         einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg);
491       else
492         {
493           etree_type *t;
495           t = exp_binop ('+',
496                          exp_intop (val),
497                          exp_nameop (SIZEOF_HEADERS, NULL));
498           t = exp_binop ('&',
499                          exp_binop ('+', t, exp_intop (31)),
500                          exp_intop (~(bfd_vma) 31));
501           lang_section_start (".text", t);
502         }
503       break;
505     case OPTION_STRCMPCT:
506       link_info.traditional_format = false;
507       break;
509     case OPTION_UNIX:
510       unix_ld = true;
511       break;
513     case OPTION_32:
514       is_64bit = 0;
515       syscall_mask = 0x77;
516       symbol_mode_mask = 0x0d;
517       break;
519     case OPTION_64:
520       is_64bit = 1;
521       syscall_mask = 0xcc;
522       symbol_mode_mask = 0x0e;
523       break;
525     case OPTION_LIBPATH:
526       command_line_blibpath = optarg;
527       break;
529     case OPTION_NOLIBPATH:
530       command_line_blibpath = NULL;
531       break;
533     }
535   return 1;
538 /* This is called when an input file can not be recognized as a BFD
539    object or an archive.  If the file starts with #!, we must treat it
540    as an import file.  This is for AIX compatibility.  */
542 static boolean
543 gld${EMULATION_NAME}_unrecognized_file (entry)
544      lang_input_statement_type *entry;
546   FILE *e;
547   boolean ret;
549   e = fopen (entry->filename, FOPEN_RT);
550   if (e == NULL)
551     return false;
553   ret = false;
555   if (getc (e) == '#' && getc (e) == '!')
556     {
557       struct filelist *n;
558       struct filelist **flpp;
560       n = (struct filelist *) xmalloc (sizeof (struct filelist));
561       n->next = NULL;
562       n->name = entry->filename;
563       flpp = &import_files;
564       while (*flpp != NULL)
565         flpp = &(*flpp)->next;
566       *flpp = n;
568       ret = true;
569       entry->loaded = true;
570     }
572   fclose (e);
574   return ret;
577 /* This is called after the input files have been opened.  */
579 static void
580 gld${EMULATION_NAME}_after_open ()
582   boolean r;
583   struct set_info *p;
585   /* Call ldctor_build_sets, after pretending that this is a
586      relocateable link.  We do this because AIX requires relocation
587      entries for all references to symbols, even in a final
588      executable.  Of course, we only want to do this if we are
589      producing an XCOFF output file.  */
590   r = link_info.relocateable;
591   if (strstr (bfd_get_target (output_bfd), "xcoff") != NULL)
592     link_info.relocateable = true;
593   ldctor_build_sets ();
594   link_info.relocateable = r;
596   /* For each set, record the size, so that the XCOFF backend can
597      output the correct csect length.  */
598   for (p = sets; p != (struct set_info *) NULL; p = p->next)
599     {
600       bfd_size_type size;
602       /* If the symbol is defined, we may have been invoked from
603          collect, and the sets may already have been built, so we do
604          not do anything.  */
605       if (p->h->type == bfd_link_hash_defined
606           || p->h->type == bfd_link_hash_defweak)
607         continue;
609       if (p->reloc != BFD_RELOC_CTOR)
610         {
611           /* Handle this if we need to.  */
612           abort ();
613         }
615       size = (p->count + 2) * 4;
616       if (!bfd_xcoff_link_record_set (output_bfd, &link_info, p->h, size))
617         einfo ("%F%P: bfd_xcoff_link_record_set failed: %E\n");
618     }
621 /* This is called after the sections have been attached to output
622    sections, but before any sizes or addresses have been set.  */
624 static void
625 gld${EMULATION_NAME}_before_allocation ()
627   struct filelist *fl;
628   struct export_symbol_list *el;
629   char *libpath;
630   asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
631   int i;
633   /* Handle the import and export files, if any.  */
634   for (fl = import_files; fl != NULL; fl = fl->next)
635     gld${EMULATION_NAME}_read_file (fl->name, true);
636   for (el = export_symbols; el != NULL; el = el->next)
637     {
638       struct bfd_link_hash_entry *h;
640       h = bfd_link_hash_lookup (link_info.hash, el->name, false, false, false);
641       if (h == NULL)
642         einfo ("%P%F: bfd_link_hash_lookup of export symbol failed: %E\n");
643       if (!bfd_xcoff_export_symbol (output_bfd, &link_info, h))
644         einfo ("%P%F: bfd_xcoff_export_symbol failed: %E\n");
645     }
647   /* Track down all relocations called for by the linker script (these
648      are typically constructor/destructor entries created by
649      CONSTRUCTORS) and let the backend know it will need to create
650      .loader relocs for them.  */
651   lang_for_each_statement (gld${EMULATION_NAME}_find_relocs);
653   /* Precedence of LIBPATH
654      -blibpath:  native support always first
655      -rpath:     gnu extension
656      -L          build from command line -L's */
657   if (command_line_blibpath != NULL)
658     libpath = command_line_blibpath;
659   else if (command_line.rpath != NULL)
660     libpath = command_line.rpath;
661   else if (search_head == NULL)
662     libpath = (char *) "";
663   else
664     {
665       size_t len;
666       search_dirs_type *search;
668       len = strlen (search_head->name);
669       libpath = xmalloc (len + 1);
670       strcpy (libpath, search_head->name);
671       for (search = search_head->next; search != NULL; search = search->next)
672         {
673           size_t nlen;
675           nlen = strlen (search->name);
676           libpath = xrealloc (libpath, len + nlen + 2);
677           libpath[len] = ':';
678           strcpy (libpath + len + 1, search->name);
679           len += nlen + 1;
680         }
681     }
683   /* Let the XCOFF backend set up the .loader section.  */
684   if (!bfd_xcoff_size_dynamic_sections 
685       (output_bfd, &link_info, libpath, entry_symbol, file_align,
686        maxstack, maxdata, gc && !unix_ld ? true : false,
687        modtype, textro ? true : false, unix_ld, special_sections, 
688        rtld ? true : false))
689     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
691   /* Look through the special sections, and put them in the right
692      place in the link ordering.  This is especially magic.  */
693   for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
694     {
695       asection *sec;
696       lang_output_section_statement_type *os;
697       lang_statement_union_type **pls;
698       lang_input_section_type *is;
699       const char *oname;
700       boolean start;
702       sec = special_sections[i];
703       if (sec == NULL)
704         continue;
706       /* Remove this section from the list of the output section.
707          This assumes we know what the script looks like.  */
708       is = NULL;
709       os = lang_output_section_find (sec->output_section->name);
710       if (os == NULL) 
711         einfo ("%P%F: can't find output section %s\n",
712                sec->output_section->name);
714       for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->header.next)
715         {
716           if ((*pls)->header.type == lang_input_section_enum 
717               && (*pls)->input_section.section == sec)
718             {
719               is = (lang_input_section_type *) * pls;
720               *pls = (*pls)->header.next;
721               break;
722             }
724           if ((*pls)->header.type == lang_wild_statement_enum)
725             {
726               lang_statement_union_type **pwls;
728               for (pwls = &(*pls)->wild_statement.children.head;
729                    *pwls != NULL; pwls = &(*pwls)->header.next)
730                 {
732                   if ((*pwls)->header.type == lang_input_section_enum 
733                       && (*pwls)->input_section.section == sec)
734                     {
735                       is = (lang_input_section_type *) * pwls;
736                       *pwls = (*pwls)->header.next;
737                       break;
738                     }
739                 }
741               if (is != NULL)
742                 break;
743             }
744         }
746       if (is == NULL)
747         {
748           einfo ("%P%F: can't find %s in output section\n",
749                  bfd_get_section_name (sec->owner, sec));
750         }
752       /* Now figure out where the section should go.  */
753       switch (i)
754         {
756         default:                /* to avoid warnings */
757         case XCOFF_SPECIAL_SECTION_TEXT:
758           /* _text */
759           oname = ".text";
760           start = true;
761           break;
763         case XCOFF_SPECIAL_SECTION_ETEXT:
764           /* _etext */
765           oname = ".text";
766           start = false;
767           break;
769         case XCOFF_SPECIAL_SECTION_DATA:
770           /* _data */
771           oname = ".data";
772           start = true;
773           break;
775         case XCOFF_SPECIAL_SECTION_EDATA:
776           /* _edata */
777           oname = ".data";
778           start = false;
779           break;
781         case XCOFF_SPECIAL_SECTION_END:
782         case XCOFF_SPECIAL_SECTION_END2:
783           /* _end and end */
784           oname = ".bss";
785           start = false;
786           break;
787         }
789       os = lang_output_section_find (oname);
791       if (start)
792         {
793           is->header.next = os->children.head;
794           os->children.head = (lang_statement_union_type *) is;
795         }
796       else
797         {
798           is->header.next = NULL;
799           lang_statement_append (&os->children,
800                                  (lang_statement_union_type *) is,
801                                  &is->header.next);
802         }
803     }
806 static char *
807 gld${EMULATION_NAME}_choose_target (argc, argv)
808      int argc;
809      char **argv;
811   int i, j, jmax;
812   static char *from_outside;
813   static char *from_inside;
814   static char *argv_to_target[][2] = { 
815     {NULL,   "${OUTPUT_FORMAT}"},
816     {"-b32", "${OUTPUT_FORMAT_32BIT}"},
817     {"-b64", "${OUTPUT_FORMAT_64BIT}"},
818   };
820   jmax = 3;
822   from_outside = getenv (TARGET_ENVIRON);
823   if (from_outside != (char *) NULL)
824     return from_outside;
826   /* Set to default. */
827   from_inside = argv_to_target[0][1];
828   for (i = 1; i < argc; i++)
829     {
830       for (j = 1; j < jmax; j++) 
831         {
832           if (0 == strcmp (argv[i], argv_to_target[j][0]))
833             from_inside = argv_to_target[j][1];
834         }
835     }
837   return from_inside;
840 /* Returns 
841    1 : state changed
842    0 : no change */
843 static int 
844 change_symbol_mode (input)
845      char *input;
847   char *symbol_mode_string[] = {
848     "# 32",                     /* 0x01 */
849     "# 64",                     /* 0x02 */
850     "# no32",                   /* 0x04 */
851     "# no64",                   /* 0x08 */
852     NULL,
853   };
855   unsigned int bit;
856   char *string;
858   for (bit = 0;; bit++)
859     {
860       string = symbol_mode_string[bit];
861       if (string == NULL)
862         return 0;
864       if (0 == strcmp (input, string))
865         {
866           symbol_mode = (1 << bit);
867           return 1;
868         }
869     }
870   /* should not be here */
871   return 0;
874 /* Returns 
875    1 : yes
876    0 : ignore
877    -1 : error, try something else */
878 static int 
879 is_syscall (input, flag)
880      char *input;
881      unsigned int *flag;
883   unsigned int bit;
884   char *string;
885   
886   struct sc {
887     char *syscall_string;
888     unsigned int flag;
889   } s [] = {
890     { "svc"         /* 0x01 */, XCOFF_SYSCALL32 },
891     { "svc32"       /* 0x02 */, XCOFF_SYSCALL32 },
892     { "svc3264"     /* 0x04 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
893     { "svc64"       /* 0x08 */, XCOFF_SYSCALL64 },
894     { "syscall"     /* 0x10 */, XCOFF_SYSCALL32 },
895     { "syscall32"   /* 0x20 */, XCOFF_SYSCALL32 },
896     { "syscall3264" /* 0x40 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
897     { "syscall64"   /* 0x80 */, XCOFF_SYSCALL64 },
898     { NULL, 0 },
899   };
901   *flag = 0;
903   for (bit = 0;; bit++) 
904     {
905       string = s[bit].syscall_string;
906       if (string == NULL) 
907         return -1;
909       if (0 == strcmp (input, string)) 
910         {
911           if (1 << bit & syscall_mask) 
912             {
913               *flag = s[bit].flag;
914               return 1;
915             } 
916           else 
917             {
918               return 0;
919             }
920         }
921     }
922   /* should not be here */
923   return -1;
926 /* Read an import or export file.  For an import file, this is called
927    by the before_allocation emulation routine.  For an export file,
928    this is called by the parse_args emulation routine.  */
930 static void
931 gld${EMULATION_NAME}_read_file (filename, import)
932      const char *filename;
933      boolean import;
935   struct obstack *o;
936   FILE *f;
937   int lineno;
938   int c;
939   boolean keep;
940   const char *imppath;
941   const char *impfile;
942   const char *impmember;
944   o = (struct obstack *) xmalloc (sizeof (struct obstack));
945   obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
947   f = fopen (filename, FOPEN_RT);
948   if (f == NULL)
949     {
950       bfd_set_error (bfd_error_system_call);
951       einfo ("%F%s: %E\n", filename);
952     }
954   keep = false;
956   imppath = NULL;
957   impfile = NULL;
958   impmember = NULL;
960   lineno = 0;
962   /* Default to 32 and 64 bit mode
963      symbols at top of /lib/syscalls.exp do not have a mode modifier and they
964      are not repeated, assume 64 bit routines also want to use them.
965      See the routine change_symbol_mode for more information.  */
967   symbol_mode = 0x04;
969   while ((c = getc (f)) != EOF)
970     {
971       char *s;
972       char *symname;
973       unsigned int syscall_flag = 0;
974       bfd_vma address;
975       struct bfd_link_hash_entry *h;
977       if (c != '\n')
978         {
979           obstack_1grow (o, c);
980           continue;
981         }
983       obstack_1grow (o, '\0');
984       ++lineno;
986       s = (char *) obstack_base (o);
987       while (ISSPACE (*s))
988         ++s;
989       if (*s == '\0'
990           || *s == '*'
991           || change_symbol_mode (s)
992           || (*s == '#' && s[1] == ' ')
993           || (!import && *s == '#' && s[1] == '!'))
994         {
995           obstack_free (o, obstack_base (o));
996           continue;
997         }
999       if (*s == '#' && s[1] == '!')
1000         {
1001           s += 2;
1002           while (ISSPACE (*s))
1003             ++s;
1004           if (*s == '\0')
1005             {
1006               imppath = NULL;
1007               impfile = NULL;
1008               impmember = NULL;
1009               obstack_free (o, obstack_base (o));
1010             }
1011           else if (*s == '(')
1012             einfo ("%F%s%d: #! ([member]) is not supported in import files\n",
1013                    filename, lineno);
1014           else
1015             {
1016               char cs;
1017               char *file;
1019               (void) obstack_finish (o);
1020               keep = true;
1021               imppath = s;
1022               file = NULL;
1023               while (!ISSPACE (*s) && *s != '(' && *s != '\0')
1024                 {
1025                   if (*s == '/')
1026                     file = s + 1;
1027                   ++s;
1028                 }
1029               if (file != NULL)
1030                 {
1031                   file[-1] = '\0';
1032                   impfile = file;
1033                   if (imppath == file - 1)
1034                     imppath = "/";
1035                 }
1036               else
1037                 {
1038                   impfile = imppath;
1039                   imppath = "";
1040                 }
1041               cs = *s;
1042               *s = '\0';
1043               while (ISSPACE (cs))
1044                 {
1045                   ++s;
1046                   cs = *s;
1047                 }
1048               if (cs != '(')
1049                 {
1050                   impmember = "";
1051                   if (cs != '\0')
1052                     einfo ("%s:%d: warning: syntax error in import file\n",
1053                            filename, lineno);
1054                 }
1055               else
1056                 {
1057                   ++s;
1058                   impmember = s;
1059                   while (*s != ')' && *s != '\0')
1060                     ++s;
1061                   if (*s == ')')
1062                     *s = '\0';
1063                   else
1064                     einfo ("%s:%d: warning: syntax error in import file\n",
1065                            filename, lineno);
1066                 }
1067             }
1069           continue;
1070         }
1072       if (symbol_mode & symbol_mode_mask)
1073         {
1074           /* This is a symbol to be imported or exported.  */
1075           symname = s;
1076           syscall_flag = 0;
1077           address = (bfd_vma) -1;
1079           while (!ISSPACE (*s) && *s != '\0')
1080             ++s;
1081           if (*s != '\0')
1082             {
1083               char *se;
1085               *s++ = '\0';
1087               while (ISSPACE (*s))
1088                 ++s;
1090               se = s;
1091               while (!ISSPACE (*se) && *se != '\0')
1092                 ++se;
1093               if (*se != '\0')
1094                 {
1095                   *se++ = '\0';
1096                   while (ISSPACE (*se))
1097                     ++se;
1098                   if (*se != '\0')
1099                     einfo ("%s%d: warning: syntax error in import/export file\n",
1100                            filename, lineno);
1101                 }
1103               if (s != se)
1104                 {
1105                   int status;
1106                   char *end;
1108                   status = is_syscall (s, &syscall_flag);
1109               
1110                   if (0 > status) 
1111                     {
1112                       /* not a system call, check for address */
1113                       address = strtoul (s, &end, 0);
1114                       if (*end != '\0')
1115                         {
1116                           einfo ("%s:%d: warning: syntax error in import/export file\n",
1117                                  filename, lineno);
1118                           
1119                         }
1120                     }
1121                 }
1122             }
1124           if (!import)
1125             {
1126               struct export_symbol_list *n;
1128               ldlang_add_undef (symname);
1129               n = ((struct export_symbol_list *)
1130                    xmalloc (sizeof (struct export_symbol_list)));
1131               n->next = export_symbols;
1132               n->name = xstrdup (symname);
1133               export_symbols = n;
1134             }
1135           else
1136             {
1137               h = bfd_link_hash_lookup (link_info.hash, symname, false, false,
1138                                         true);
1139               if (h == NULL || h->type == bfd_link_hash_new)
1140                 {
1141                   /* We can just ignore attempts to import an unreferenced
1142                      symbol.  */
1143                 }
1144               else
1145                 {
1146                   if (!bfd_xcoff_import_symbol (output_bfd, &link_info, h,
1147                                                 address, imppath, impfile,
1148                                                 impmember, syscall_flag))
1149                     einfo ("%X%s:%d: failed to import symbol %s: %E\n",
1150                            filename, lineno, symname);
1151                 }
1152             }
1153         }
1154       obstack_free (o, obstack_base (o));
1155     }
1157   if (obstack_object_size (o) > 0)
1158     {
1159       einfo ("%s:%d: warning: ignoring unterminated last line\n",
1160              filename, lineno);
1161       obstack_free (o, obstack_base (o));
1162     }
1164   if (!keep)
1165     {
1166       obstack_free (o, NULL);
1167       free (o);
1168     }
1171 /* This routine saves us from worrying about declaring free.  */
1173 static void
1174 gld${EMULATION_NAME}_free (p)
1175      PTR p;
1177   free (p);
1180 /* This is called by the before_allocation routine via
1181    lang_for_each_statement.  It looks for relocations and assignments
1182    to symbols.  */
1184 static void
1185 gld${EMULATION_NAME}_find_relocs (s)
1186      lang_statement_union_type *s;
1188   if (s->header.type == lang_reloc_statement_enum)
1189     {
1190       lang_reloc_statement_type *rs;
1192       rs = &s->reloc_statement;
1193       if (rs->name == NULL)
1194         einfo ("%F%P: only relocations against symbols are permitted\n");
1195       if (!bfd_xcoff_link_count_reloc (output_bfd, &link_info, rs->name))
1196         einfo ("%F%P: bfd_xcoff_link_count_reloc failed: %E\n");
1197     }
1199   if (s->header.type == lang_assignment_statement_enum)
1200     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1203 /* Look through an expression for an assignment statement.  */
1205 static void
1206 gld${EMULATION_NAME}_find_exp_assignment (exp)
1207      etree_type *exp;
1209   struct bfd_link_hash_entry *h;
1211   switch (exp->type.node_class)
1212     {
1213     case etree_provide:
1214       h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
1215                                 false, false, false);
1216       if (h == NULL)
1217         break;
1218       /* Fall through.  */
1219     case etree_assign:
1220       if (strcmp (exp->assign.dst, ".") != 0)
1221         {
1222           if (!bfd_xcoff_record_link_assignment (output_bfd, &link_info,
1223                                                  exp->assign.dst))
1224             einfo ("%P%F: failed to record assignment to %s: %E\n",
1225                    exp->assign.dst);
1226         }
1227       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1228       break;
1230     case etree_binary:
1231       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1232       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1233       break;
1235     case etree_trinary:
1236       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1237       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1238       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1239       break;
1241     case etree_unary:
1242       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1243       break;
1245     default:
1246       break;
1247     }
1250 static char *
1251 gld${EMULATION_NAME}_get_script (isfile)
1252      int *isfile;
1255 if test -n "$COMPILE_IN"
1256 then
1257 # Scripts compiled in.
1259 # sed commands to quote an ld script as a C string.
1260 sc="-f ${srcdir}/emultempl/ostring.sed"
1262 cat >>e${EMULATION_NAME}.c <<EOF
1264   *isfile = 0;
1266   if (link_info.relocateable == true && config.build_constructors == true)
1267     return
1269 sed $sc ldscripts/${EMULATION_NAME}.xu                     >> e${EMULATION_NAME}.c
1270 echo '  ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1271 sed $sc ldscripts/${EMULATION_NAME}.xr                     >> e${EMULATION_NAME}.c
1272 echo '  ; else if (!config.text_read_only) return'         >> e${EMULATION_NAME}.c
1273 sed $sc ldscripts/${EMULATION_NAME}.xbn                    >> e${EMULATION_NAME}.c
1274 echo '  ; else if (!config.magic_demand_paged) return'     >> e${EMULATION_NAME}.c
1275 sed $sc ldscripts/${EMULATION_NAME}.xn                     >> e${EMULATION_NAME}.c
1276 echo '  ; else return'                                     >> e${EMULATION_NAME}.c
1277 sed $sc ldscripts/${EMULATION_NAME}.x                      >> e${EMULATION_NAME}.c
1278 echo '; }'                                                 >> e${EMULATION_NAME}.c
1280 else
1281 # Scripts read from the filesystem.
1283 cat >>e${EMULATION_NAME}.c <<EOF
1285   *isfile = 1;
1287   if (link_info.relocateable == true && config.build_constructors == true)
1288     return "ldscripts/${EMULATION_NAME}.xu";
1289   else if (link_info.relocateable == true)
1290     return "ldscripts/${EMULATION_NAME}.xr";
1291   else if (!config.text_read_only)
1292     return "ldscripts/${EMULATION_NAME}.xbn";
1293   else if (!config.magic_demand_paged)
1294     return "ldscripts/${EMULATION_NAME}.xn";
1295   else
1296     return "ldscripts/${EMULATION_NAME}.x";
1302 cat >>e${EMULATION_NAME}.c <<EOF
1304 static void 
1305 gld${EMULATION_NAME}_create_output_section_statements ()
1307   /* __rtinit */
1308   if ((bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour) 
1309       && (link_info.init_function != NULL  
1310           || link_info.fini_function != NULL
1311           || rtld == true))
1312     {
1313       initfini_file = lang_add_input_file ("initfini",
1314                                            lang_input_file_is_file_enum,
1315                                            NULL);
1316       
1317       initfini_file->the_bfd = bfd_create ("initfini", output_bfd);
1318       if (initfini_file->the_bfd == NULL
1319           || ! bfd_set_arch_mach (initfini_file->the_bfd,
1320                                   bfd_get_arch (output_bfd),
1321                                   bfd_get_mach (output_bfd)))
1322         {
1323           einfo ("%X%P: can not create BFD %E\n");
1324           return;
1325         }
1326       
1327       /* Call backend to fill in the rest */
1328       if (false == bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd, 
1329                                                    link_info.init_function, 
1330                                                    link_info.fini_function,
1331                                                    rtld))
1332         {
1333           einfo ("%X%P: can not create BFD %E\n");
1334           return;
1335         }
1337       /* __rtld defined in /lib/librtl.a */
1338       if (true == rtld) 
1339         lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL);
1340     }
1343 static void
1344 gld${EMULATION_NAME}_set_output_arch ()
1346   bfd_set_arch_mach (output_bfd,
1347                      bfd_xcoff_architecture (output_bfd),
1348                      bfd_xcoff_machine (output_bfd));
1350   ldfile_output_architecture = bfd_get_arch (output_bfd);
1351   ldfile_output_machine = bfd_get_mach (output_bfd);
1352   ldfile_output_machine_name = bfd_printable_name (output_bfd);
1355 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
1356   gld${EMULATION_NAME}_before_parse,
1357   syslib_default,
1358   hll_default,
1359   after_parse_default,
1360   gld${EMULATION_NAME}_after_open,
1361   after_allocation_default,
1362   gld${EMULATION_NAME}_set_output_arch,
1363   gld${EMULATION_NAME}_choose_target,
1364   gld${EMULATION_NAME}_before_allocation,
1365   gld${EMULATION_NAME}_get_script,
1366   "${EMULATION_NAME}",
1367   "${OUTPUT_FORMAT}",
1368   0,                            /* finish */
1369   gld${EMULATION_NAME}_create_output_section_statements,
1370   0,                            /* open_dynamic_archive */
1371   0,                            /* place_orphan */
1372   0,                            /* set_symbols */
1373   gld${EMULATION_NAME}_parse_args,
1374   gld${EMULATION_NAME}_unrecognized_file,
1375   NULL,                         /* list_options */
1376   NULL,                         /* recognized_file */
1377   NULL,                         /* find potential_libraries */
1378   NULL                          /* new_vers_pattern */