1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 if [ -z "$MACHINE" ]; then
6 OUTPUT_ARCH=${ARCH}:${MACHINE}
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, 1999, 2000, 2001, 2002,
13 2003, 2004, 2005, 2006, 2007, 2008
14 Free Software Foundation, Inc.
15 Written by Steve Chamberlain <sac@cygnus.com>
16 AIX support by Ian Lance Taylor <ian@cygnus.com>
17 AIX 64 bit support by Tom Rix <trix@redhat.com>
19 This file is part of the GNU Binutils.
21 This program is free software; you can redistribute it and/or modify
22 it under the terms of the GNU General Public License as published by
23 the Free Software Foundation; either version 3 of the License, or
24 (at your option) any later version.
26 This program is distributed in the hope that it will be useful,
27 but WITHOUT ANY WARRANTY; without even the implied warranty of
28 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29 GNU General Public License for more details.
31 You should have received a copy of the GNU General Public License
32 along with this program; if not, write to the Free Software
33 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
34 MA 02110-1301, USA. */
36 #define TARGET_IS_${EMULATION_NAME}
40 #include "libiberty.h"
41 #include "safe-ctype.h"
56 #include "coff/internal.h"
57 #include "coff/xcoff.h"
61 static void gld${EMULATION_NAME}_read_file (const char *, bfd_boolean);
62 static void gld${EMULATION_NAME}_free (void *);
63 static void gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *);
64 static void gld${EMULATION_NAME}_find_exp_assignment (etree_type *);
67 /* The file alignment required for each section. */
68 static unsigned long file_align;
70 /* The maximum size the stack is permitted to grow. This is stored in
72 static unsigned long maxstack;
74 /* The maximum data size. This is stored in the a.out header. */
75 static unsigned long maxdata;
77 /* Whether to perform garbage collection. */
80 /* The module type to use. */
81 static unsigned short modtype = ('1' << 8) | 'L';
83 /* Whether the .text section must be read-only (i.e., no relocs
87 /* A mask of XCOFF_EXPALL and XCOFF_EXPFULL flags, as set by their
88 associated -b and -bno options. */
89 static unsigned int auto_export_flags;
91 /* A mask of auto_export_flags bits that were explicitly set on the
93 static unsigned int explicit_auto_export_flags;
95 /* Whether to implement Unix like linker semantics. */
98 /* Structure used to hold import file list. */
102 struct filelist *next;
106 /* List of import files. */
107 static struct filelist *import_files;
109 /* List of export symbols read from the export files. */
111 struct export_symbol_list
113 struct export_symbol_list *next;
117 static struct export_symbol_list *export_symbols;
119 /* Maintains the 32 or 64 bit mode state of import file */
120 static unsigned int symbol_mode = 0x04;
122 /* Which symbol modes are valid */
123 static unsigned int symbol_mode_mask = 0x0d;
125 /* Whether this is a 64 bit link */
126 static int is_64bit = 0;
128 /* Which syscalls from import file are valid */
129 static unsigned int syscall_mask = 0x77;
131 /* fake file for -binitfini support */
132 static lang_input_statement_type *initfini_file;
134 /* Whether to do run time linking
135 -brtl enables, -bnortl and -bnortllib disable. */
138 /* Explicit command line library path, -blibpath */
139 static char *command_line_blibpath = NULL;
141 /* This routine is called before anything else is done. */
144 gld${EMULATION_NAME}_before_parse (void)
146 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
148 config.dynamic_link = TRUE;
149 config.has_shared = TRUE;
151 /* The link_info.[init|fini]_functions are initialized in ld/lexsup.c.
152 Override them here so we can use the link_info.init_function as a
153 state flag that lets the backend know that -binitfini has been done. */
155 link_info.init_function = NULL;
156 link_info.fini_function = NULL;
159 /* Handle AIX specific options. */
191 gld${EMULATION_NAME}_add_options
192 (int ns, char **shortopts, int nl, struct option **longopts,
193 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
195 static const char xtra_short[] = "D:H:KT:z";
196 static const struct option xtra_long[] = {
197 /* -binitfini has special handling in the linker backend. The native linker
198 uses the arguemnts to generate a table of init and fini functions for
199 the executable. The important use for this option is to support aix 4.2+
200 c++ constructors and destructors. This is tied into gcc via collect2.c.
202 The function table is accessed by the runtime linker/loader by checking if
203 the first symbol in the loader symbol table is __rtinit. The gnu linker
204 generates this symbol and makes it the first loader symbol. */
206 {"basis", no_argument, NULL, OPTION_IGNORE},
207 {"bautoimp", no_argument, NULL, OPTION_AUTOIMP},
208 {"bcomprld", no_argument, NULL, OPTION_IGNORE},
209 {"bcrld", no_argument, NULL, OPTION_IGNORE},
210 {"bcror31", no_argument, NULL, OPTION_IGNORE},
211 {"bD", required_argument, NULL, OPTION_MAXDATA},
212 {"bE", required_argument, NULL, OPTION_EXPORT},
213 {"bernotok", no_argument, NULL, OPTION_ERNOTOK},
214 {"berok", no_argument, NULL, OPTION_EROK},
215 {"berrmsg", no_argument, NULL, OPTION_IGNORE},
216 {"bexpall", no_argument, NULL, OPTION_EXPALL},
217 {"bexpfull", no_argument, NULL, OPTION_EXPFULL},
218 {"bexport", required_argument, NULL, OPTION_EXPORT},
219 {"bf", no_argument, NULL, OPTION_ERNOTOK},
220 {"bgc", no_argument, &gc, 1},
221 {"bh", required_argument, NULL, OPTION_IGNORE},
222 {"bhalt", required_argument, NULL, OPTION_IGNORE},
223 {"bI", required_argument, NULL, OPTION_IMPORT},
224 {"bimport", required_argument, NULL, OPTION_IMPORT},
225 {"binitfini", required_argument, NULL, OPTION_INITFINI},
226 {"bl", required_argument, NULL, OPTION_LOADMAP},
227 {"bloadmap", required_argument, NULL, OPTION_LOADMAP},
228 {"bmaxdata", required_argument, NULL, OPTION_MAXDATA},
229 {"bmaxstack", required_argument, NULL, OPTION_MAXSTACK},
230 {"bM", required_argument, NULL, OPTION_MODTYPE},
231 {"bmodtype", required_argument, NULL, OPTION_MODTYPE},
232 {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP},
233 {"bnoexpall", no_argument, NULL, OPTION_NOEXPALL},
234 {"bnoexpfull", no_argument, NULL, OPTION_NOEXPFULL},
235 {"bnodelcsect", no_argument, NULL, OPTION_IGNORE},
236 {"bnoentry", no_argument, NULL, OPTION_IGNORE},
237 {"bnogc", no_argument, &gc, 0},
238 {"bnso", no_argument, NULL, OPTION_NOAUTOIMP},
239 {"bnostrcmpct", no_argument, NULL, OPTION_NOSTRCMPCT},
240 {"bnotextro", no_argument, &textro, 0},
241 {"bnro", no_argument, &textro, 0},
242 {"bpD", required_argument, NULL, OPTION_PD},
243 {"bpT", required_argument, NULL, OPTION_PT},
244 {"bro", no_argument, &textro, 1},
245 {"brtl", no_argument, &rtld, 1},
246 {"bnortl", no_argument, &rtld, 0},
247 {"bnortllib", no_argument, &rtld, 0},
248 {"bS", required_argument, NULL, OPTION_MAXSTACK},
249 {"bso", no_argument, NULL, OPTION_AUTOIMP},
250 {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT},
251 {"btextro", no_argument, &textro, 1},
252 {"b32", no_argument, NULL, OPTION_32},
253 {"b64", no_argument, NULL, OPTION_64},
254 {"static", no_argument, NULL, OPTION_NOAUTOIMP},
255 {"unix", no_argument, NULL, OPTION_UNIX},
256 {"blibpath", required_argument, NULL, OPTION_LIBPATH},
257 {"bnolibpath", required_argument, NULL, OPTION_NOLIBPATH},
258 {NULL, no_argument, NULL, 0}
261 /* Options supported by the AIX linker which we do not support: -f,
262 -S, -v, -Z, -bbindcmds, -bbinder, -bbindopts, -bcalls, -bcaps,
263 -bcror15, -bdebugopt, -bdbg, -bdelcsect, -bex?, -bfilelist, -bfl,
264 -bgcbypass, -bglink, -binsert, -bi, -bloadmap, -bl, -bmap, -bnl,
265 -bnobind, -bnocomprld, -bnocrld, -bnoerrmsg, -bnoglink,
266 -bnoloadmap, -bnl, -bnoobjreorder, -bnoquiet, -bnoreorder,
267 -bnotypchk, -bnox, -bquiet, -bR, -brename, -breorder, -btypchk,
270 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
271 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
272 *longopts = xrealloc (*longopts,
273 nl * sizeof (struct option) + sizeof (xtra_long));
274 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
278 gld${EMULATION_NAME}_parse_args (int argc, char **argv)
282 /* If the current option starts with -b, change the first : to an =.
283 The AIX linker uses : to separate the option from the argument;
284 changing it to = lets us treat it as a getopt option. */
289 if (indx < argc && CONST_STRNEQ (argv[indx], "-b"))
293 for (s = argv[indx]; *s != '\0'; s++)
306 gld${EMULATION_NAME}_handle_option (int optc)
317 /* Long option which just sets a flag. */
321 val = bfd_scan_vma (optarg, &end, 0);
323 einfo ("%P: warning: ignoring invalid -D number %s\n", optarg);
325 lang_section_start (".data", exp_intop (val), NULL);
329 val = bfd_scan_vma (optarg, &end, 0);
330 if (*end != '\0' || (val & (val - 1)) != 0)
331 einfo ("%P: warning: ignoring invalid -H number %s\n", optarg);
338 /* FIXME: This should use the page size for the target system. */
343 /* On AIX this is the same as GNU ld -Ttext. When we see -T
344 number, we assume the AIX option is intended. Otherwise, we
345 assume the usual GNU ld -T option is intended. We can't just
346 ignore the AIX option, because gcc passes it to the linker. */
347 val = bfd_scan_vma (optarg, &end, 0);
350 lang_section_start (".text", exp_intop (val), NULL);
356 case OPTION_INITFINI:
359 * The aix linker init fini has the format :
361 * -binitfini:[ Initial][:Termination][:Priority]
363 * it allows the Termination and Priority to be optional.
365 * Since we support only one init/fini pair, we ignore the Priority.
367 * Define the special symbol __rtinit.
369 * strtok does not correctly handle the case of -binitfini::fini: so
375 while (*t && ':' != *t)
381 link_info.init_function = i;
384 while (*t && ':' != *t)
389 link_info.fini_function = f;
394 link_info.static_link = FALSE;
398 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
399 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
403 link_info.unresolved_syms_in_objects = RM_IGNORE;
404 link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
408 auto_export_flags |= XCOFF_EXPALL;
409 explicit_auto_export_flags |= XCOFF_EXPALL;
413 auto_export_flags |= XCOFF_EXPFULL;
414 explicit_auto_export_flags |= XCOFF_EXPFULL;
418 gld${EMULATION_NAME}_read_file (optarg, FALSE);
424 struct filelist **flpp;
426 n = (struct filelist *) xmalloc (sizeof (struct filelist));
429 flpp = &import_files;
430 while (*flpp != NULL)
431 flpp = &(*flpp)->next;
437 config.map_filename = optarg;
441 val = bfd_scan_vma (optarg, &end, 0);
443 einfo ("%P: warning: ignoring invalid -bmaxdata number %s\n", optarg);
448 case OPTION_MAXSTACK:
449 val = bfd_scan_vma (optarg, &end, 0);
451 einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n",
460 link_info.shared = TRUE;
463 if (*optarg == '\0' || optarg[1] == '\0')
464 einfo ("%P: warning: ignoring invalid module type %s\n", optarg);
466 modtype = (*optarg << 8) | optarg[1];
469 case OPTION_NOAUTOIMP:
470 link_info.static_link = TRUE;
473 case OPTION_NOEXPALL:
474 auto_export_flags &= ~XCOFF_EXPALL;
475 explicit_auto_export_flags |= XCOFF_EXPALL;
478 case OPTION_NOEXPFULL:
479 auto_export_flags &= ~XCOFF_EXPFULL;
480 explicit_auto_export_flags |= XCOFF_EXPFULL;
483 case OPTION_NOSTRCMPCT:
484 link_info.traditional_format = TRUE;
488 /* This sets the page that the .data section is supposed to
489 start on. The offset within the page should still be the
490 offset within the file, so we need to build an appropriate
492 val = bfd_scan_vma (optarg, &end, 0);
494 einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg);
502 exp_nameop (NAME, "."),
505 exp_binop ('+', t, exp_intop (31)),
506 exp_intop (~(bfd_vma) 31));
507 lang_section_start (".data", t, NULL);
512 /* This set the page that the .text section is supposed to start
513 on. The offset within the page should still be the offset
515 val = bfd_scan_vma (optarg, &end, 0);
517 einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg);
524 exp_nameop (SIZEOF_HEADERS, NULL));
526 exp_binop ('+', t, exp_intop (31)),
527 exp_intop (~(bfd_vma) 31));
528 lang_section_start (".text", t, NULL);
532 case OPTION_STRCMPCT:
533 link_info.traditional_format = FALSE;
543 symbol_mode_mask = 0x0d;
549 symbol_mode_mask = 0x0e;
553 command_line_blibpath = optarg;
556 case OPTION_NOLIBPATH:
557 command_line_blibpath = NULL;
565 /* This is called when an input file can not be recognized as a BFD
566 object or an archive. If the file starts with #!, we must treat it
567 as an import file. This is for AIX compatibility. */
570 gld${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry)
575 e = fopen (entry->filename, FOPEN_RT);
581 if (getc (e) == '#' && getc (e) == '!')
584 struct filelist **flpp;
586 n = (struct filelist *) xmalloc (sizeof (struct filelist));
588 n->name = entry->filename;
589 flpp = &import_files;
590 while (*flpp != NULL)
591 flpp = &(*flpp)->next;
595 entry->loaded = TRUE;
603 /* This is called after the input files have been opened. */
606 gld${EMULATION_NAME}_after_open (void)
611 /* Call ldctor_build_sets, after pretending that this is a
612 relocatable link. We do this because AIX requires relocation
613 entries for all references to symbols, even in a final
614 executable. Of course, we only want to do this if we are
615 producing an XCOFF output file. */
616 r = link_info.relocatable;
617 if (strstr (bfd_get_target (link_info.output_bfd), "xcoff") != NULL)
618 link_info.relocatable = TRUE;
619 ldctor_build_sets ();
620 link_info.relocatable = r;
622 /* For each set, record the size, so that the XCOFF backend can
623 output the correct csect length. */
624 for (p = sets; p != (struct set_info *) NULL; p = p->next)
628 /* If the symbol is defined, we may have been invoked from
629 collect, and the sets may already have been built, so we do
631 if (p->h->type == bfd_link_hash_defined
632 || p->h->type == bfd_link_hash_defweak)
635 if (p->reloc != BFD_RELOC_CTOR)
637 /* Handle this if we need to. */
641 size = (p->count + 2) * 4;
642 if (!bfd_xcoff_link_record_set (link_info.output_bfd, &link_info,
644 einfo ("%F%P: bfd_xcoff_link_record_set failed: %E\n");
648 /* This is called after the sections have been attached to output
649 sections, but before any sizes or addresses have been set. */
652 gld${EMULATION_NAME}_before_allocation (void)
655 struct export_symbol_list *el;
657 asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
658 static const char *const must_keep_sections[] = {
663 unsigned int i, flags;
665 /* Handle the import and export files, if any. */
666 for (fl = import_files; fl != NULL; fl = fl->next)
667 gld${EMULATION_NAME}_read_file (fl->name, TRUE);
668 for (el = export_symbols; el != NULL; el = el->next)
670 struct bfd_link_hash_entry *h;
672 h = bfd_link_hash_lookup (link_info.hash, el->name, FALSE, FALSE, FALSE);
674 einfo ("%P%F: bfd_link_hash_lookup of export symbol failed: %E\n");
675 if (!bfd_xcoff_export_symbol (link_info.output_bfd, &link_info, h))
676 einfo ("%P%F: bfd_xcoff_export_symbol failed: %E\n");
679 /* Track down all relocations called for by the linker script (these
680 are typically constructor/destructor entries created by
681 CONSTRUCTORS) and let the backend know it will need to create
682 .loader relocs for them. */
683 lang_for_each_statement (gld${EMULATION_NAME}_find_relocs);
685 /* Precedence of LIBPATH
686 -blibpath: native support always first
687 -rpath: gnu extension
688 -L build from command line -L's */
689 if (command_line_blibpath != NULL)
690 libpath = command_line_blibpath;
691 else if (command_line.rpath != NULL)
692 libpath = command_line.rpath;
693 else if (search_head == NULL)
694 libpath = (char *) "";
698 search_dirs_type *search;
700 /* PR ld/4023: Strip sysroot prefix from any paths
701 being inserted into the output binary's DT_RPATH. */
702 if (ld_sysroot != NULL
703 && * ld_sysroot != 0)
705 const char * name = search_head->name;
706 size_t ld_sysroot_len = strlen (ld_sysroot);
708 if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0)
709 name += ld_sysroot_len;
712 libpath = xmalloc (len + 1);
713 strcpy (libpath, name);
715 for (search = search_head->next; search != NULL; search = search->next)
720 if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0)
721 name += ld_sysroot_len;
723 nlen = strlen (name);
724 libpath = xrealloc (libpath, len + nlen + 2);
726 strcpy (libpath + len + 1, name);
732 len = strlen (search_head->name);
733 libpath = xmalloc (len + 1);
734 strcpy (libpath, search_head->name);
736 for (search = search_head->next; search != NULL; search = search->next)
740 nlen = strlen (search->name);
741 libpath = xrealloc (libpath, len + nlen + 2);
743 strcpy (libpath + len + 1, search->name);
749 /* Default to -bexpfull for SVR4-like semantics. */
750 flags = (unix_ld ? XCOFF_EXPFULL : 0);
751 flags &= ~explicit_auto_export_flags;
752 flags |= auto_export_flags;
754 /* Let the XCOFF backend set up the .loader section. */
755 if (!bfd_xcoff_size_dynamic_sections
756 (link_info.output_bfd, &link_info, libpath, entry_symbol.name, file_align,
757 maxstack, maxdata, gc && !unix_ld ? TRUE : FALSE,
758 modtype, textro ? TRUE : FALSE, flags, special_sections,
759 rtld ? TRUE : FALSE))
760 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
762 /* Look through the special sections, and put them in the right
763 place in the link ordering. This is especially magic. */
764 for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
767 lang_output_section_statement_type *os;
768 lang_statement_union_type **pls;
769 lang_input_section_type *is;
773 sec = special_sections[i];
777 /* Remove this section from the list of the output section.
778 This assumes we know what the script looks like. */
780 os = lang_output_section_find (sec->output_section->name);
782 einfo ("%P%F: can't find output section %s\n",
783 sec->output_section->name);
785 for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->header.next)
787 if ((*pls)->header.type == lang_input_section_enum
788 && (*pls)->input_section.section == sec)
790 is = (lang_input_section_type *) * pls;
791 *pls = (*pls)->header.next;
795 if ((*pls)->header.type == lang_wild_statement_enum)
797 lang_statement_union_type **pwls;
799 for (pwls = &(*pls)->wild_statement.children.head;
800 *pwls != NULL; pwls = &(*pwls)->header.next)
803 if ((*pwls)->header.type == lang_input_section_enum
804 && (*pwls)->input_section.section == sec)
806 is = (lang_input_section_type *) * pwls;
807 *pwls = (*pwls)->header.next;
819 einfo ("%P%F: can't find %s in output section\n",
820 bfd_get_section_name (sec->owner, sec));
823 /* Now figure out where the section should go. */
827 default: /* to avoid warnings */
828 case XCOFF_SPECIAL_SECTION_TEXT:
834 case XCOFF_SPECIAL_SECTION_ETEXT:
840 case XCOFF_SPECIAL_SECTION_DATA:
846 case XCOFF_SPECIAL_SECTION_EDATA:
852 case XCOFF_SPECIAL_SECTION_END:
853 case XCOFF_SPECIAL_SECTION_END2:
860 os = lang_output_section_find (oname);
864 is->header.next = os->children.head;
865 os->children.head = (lang_statement_union_type *) is;
869 is->header.next = NULL;
870 lang_statement_append (&os->children,
871 (lang_statement_union_type *) is,
876 /* Executables and shared objects must always have .text, .data
877 and .bss output sections, so that the header can refer to them.
878 The kernel refuses to load objects that have missing sections. */
879 if (!link_info.relocatable)
880 for (i = 0; i < ARRAY_SIZE (must_keep_sections); i++)
884 sec = bfd_get_section_by_name (link_info.output_bfd,
885 must_keep_sections[i]);
887 einfo ("%P: can't find required output section %s\n", must_keep_sections[i]);
889 sec->flags |= SEC_KEEP;
892 before_allocation_default ();
896 gld${EMULATION_NAME}_choose_target (int argc, char **argv)
899 static char *from_outside;
900 static char *from_inside;
901 static char *argv_to_target[][2] = {
902 {NULL, "${OUTPUT_FORMAT}"},
903 {"-b32", "${OUTPUT_FORMAT_32BIT}"},
904 {"-b64", "${OUTPUT_FORMAT_64BIT}"},
909 from_outside = getenv (TARGET_ENVIRON);
910 if (from_outside != (char *) NULL)
913 /* Set to default. */
914 from_inside = argv_to_target[0][1];
915 for (i = 1; i < argc; i++)
917 for (j = 1; j < jmax; j++)
919 if (0 == strcmp (argv[i], argv_to_target[j][0]))
920 from_inside = argv_to_target[j][1];
931 change_symbol_mode (char *input)
933 char *symbol_mode_string[] = {
944 for (bit = 0;; bit++)
946 string = symbol_mode_string[bit];
950 if (0 == strcmp (input, string))
952 symbol_mode = (1 << bit);
956 /* should not be here */
963 -1 : error, try something else */
965 is_syscall (char *input, unsigned int *flag)
971 char *syscall_string;
974 { "svc" /* 0x01 */, XCOFF_SYSCALL32 },
975 { "svc32" /* 0x02 */, XCOFF_SYSCALL32 },
976 { "svc3264" /* 0x04 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
977 { "svc64" /* 0x08 */, XCOFF_SYSCALL64 },
978 { "syscall" /* 0x10 */, XCOFF_SYSCALL32 },
979 { "syscall32" /* 0x20 */, XCOFF_SYSCALL32 },
980 { "syscall3264" /* 0x40 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
981 { "syscall64" /* 0x80 */, XCOFF_SYSCALL64 },
987 for (bit = 0;; bit++)
989 string = s[bit].syscall_string;
993 if (0 == strcmp (input, string))
995 if (1 << bit & syscall_mask)
1006 /* should not be here */
1010 /* Read an import or export file. For an import file, this is called
1011 by the before_allocation emulation routine. For an export file,
1012 this is called by the handle_option emulation routine. */
1015 gld${EMULATION_NAME}_read_file (const char *filename, bfd_boolean import)
1022 const char *imppath;
1023 const char *impfile;
1024 const char *impmember;
1026 o = (struct obstack *) xmalloc (sizeof (struct obstack));
1027 obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
1029 f = fopen (filename, FOPEN_RT);
1032 bfd_set_error (bfd_error_system_call);
1033 einfo ("%F%s: %E\n", filename);
1044 /* Default to 32 and 64 bit mode
1045 symbols at top of /lib/syscalls.exp do not have a mode modifier and they
1046 are not repeated, assume 64 bit routines also want to use them.
1047 See the routine change_symbol_mode for more information. */
1051 while ((c = getc (f)) != EOF)
1055 unsigned int syscall_flag = 0;
1057 struct bfd_link_hash_entry *h;
1061 obstack_1grow (o, c);
1065 obstack_1grow (o, '\0');
1068 s = (char *) obstack_base (o);
1069 while (ISSPACE (*s))
1073 || change_symbol_mode (s)
1074 || (*s == '#' && s[1] == ' ')
1075 || (!import && *s == '#' && s[1] == '!'))
1077 obstack_free (o, obstack_base (o));
1081 if (*s == '#' && s[1] == '!')
1084 while (ISSPACE (*s))
1091 obstack_free (o, obstack_base (o));
1094 einfo ("%F%s%d: #! ([member]) is not supported in import files\n",
1101 (void) obstack_finish (o);
1104 while (!ISSPACE (*s) && *s != '(' && *s != '\0')
1108 if (!bfd_xcoff_split_import_path (link_info.output_bfd,
1109 start, &imppath, &impfile))
1110 einfo ("%F%P: Could not parse import path: %E\n");
1111 while (ISSPACE (cs))
1120 einfo ("%s:%d: warning: syntax error in import file\n",
1127 while (*s != ')' && *s != '\0')
1132 einfo ("%s:%d: warning: syntax error in import file\n",
1140 if (symbol_mode & symbol_mode_mask)
1142 /* This is a symbol to be imported or exported. */
1145 address = (bfd_vma) -1;
1147 while (!ISSPACE (*s) && *s != '\0')
1155 while (ISSPACE (*s))
1159 while (!ISSPACE (*se) && *se != '\0')
1164 while (ISSPACE (*se))
1167 einfo ("%s%d: warning: syntax error in import/export file\n",
1176 status = is_syscall (s, &syscall_flag);
1180 /* not a system call, check for address */
1181 address = bfd_scan_vma (s, &end, 0);
1184 einfo ("%s:%d: warning: syntax error in import/export file\n",
1194 struct export_symbol_list *n;
1196 ldlang_add_undef (symname);
1197 n = ((struct export_symbol_list *)
1198 xmalloc (sizeof (struct export_symbol_list)));
1199 n->next = export_symbols;
1200 n->name = xstrdup (symname);
1205 h = bfd_link_hash_lookup (link_info.hash, symname, FALSE, FALSE,
1207 if (h == NULL || h->type == bfd_link_hash_new)
1209 /* We can just ignore attempts to import an unreferenced
1214 if (!bfd_xcoff_import_symbol (link_info.output_bfd,
1216 address, imppath, impfile,
1217 impmember, syscall_flag))
1218 einfo ("%X%s:%d: failed to import symbol %s: %E\n",
1219 filename, lineno, symname);
1223 obstack_free (o, obstack_base (o));
1226 if (obstack_object_size (o) > 0)
1228 einfo ("%s:%d: warning: ignoring unterminated last line\n",
1230 obstack_free (o, obstack_base (o));
1235 obstack_free (o, NULL);
1240 /* This routine saves us from worrying about declaring free. */
1243 gld${EMULATION_NAME}_free (void *p)
1248 /* This is called by the before_allocation routine via
1249 lang_for_each_statement. It looks for relocations and assignments
1253 gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *s)
1255 if (s->header.type == lang_reloc_statement_enum)
1257 lang_reloc_statement_type *rs;
1259 rs = &s->reloc_statement;
1260 if (rs->name == NULL)
1261 einfo ("%F%P: only relocations against symbols are permitted\n");
1262 if (!bfd_xcoff_link_count_reloc (link_info.output_bfd, &link_info,
1264 einfo ("%F%P: bfd_xcoff_link_count_reloc failed: %E\n");
1267 if (s->header.type == lang_assignment_statement_enum)
1268 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1271 /* Look through an expression for an assignment statement. */
1274 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1276 struct bfd_link_hash_entry *h;
1278 switch (exp->type.node_class)
1281 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
1282 FALSE, FALSE, FALSE);
1287 if (strcmp (exp->assign.dst, ".") != 0)
1289 if (!bfd_xcoff_record_link_assignment (link_info.output_bfd,
1292 einfo ("%P%F: failed to record assignment to %s: %E\n",
1295 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1299 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1300 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1304 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1305 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1306 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1310 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1319 gld${EMULATION_NAME}_get_script (int *isfile)
1322 if test -n "$COMPILE_IN"
1324 # Scripts compiled in.
1326 # sed commands to quote an ld script as a C string.
1327 sc="-f ${srcdir}/emultempl/ostring.sed"
1333 if (link_info.relocatable && config.build_constructors)
1336 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1337 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1338 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1339 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1340 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1341 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1342 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1343 echo ' ; else return' >> e${EMULATION_NAME}.c
1344 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1345 echo '; }' >> e${EMULATION_NAME}.c
1348 # Scripts read from the filesystem.
1354 if (link_info.relocatable && config.build_constructors)
1355 return "ldscripts/${EMULATION_NAME}.xu";
1356 else if (link_info.relocatable)
1357 return "ldscripts/${EMULATION_NAME}.xr";
1358 else if (!config.text_read_only)
1359 return "ldscripts/${EMULATION_NAME}.xbn";
1360 else if (!config.magic_demand_paged)
1361 return "ldscripts/${EMULATION_NAME}.xn";
1363 return "ldscripts/${EMULATION_NAME}.x";
1372 gld${EMULATION_NAME}_create_output_section_statements (void)
1375 if ((bfd_get_flavour (link_info.output_bfd) == bfd_target_xcoff_flavour)
1376 && (link_info.init_function != NULL
1377 || link_info.fini_function != NULL
1380 initfini_file = lang_add_input_file ("initfini",
1381 lang_input_file_is_file_enum,
1384 initfini_file->the_bfd = bfd_create ("initfini", link_info.output_bfd);
1385 if (initfini_file->the_bfd == NULL
1386 || ! bfd_set_arch_mach (initfini_file->the_bfd,
1387 bfd_get_arch (link_info.output_bfd),
1388 bfd_get_mach (link_info.output_bfd)))
1390 einfo ("%X%P: can not create BFD %E\n");
1394 /* Call backend to fill in the rest */
1395 if (! bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd,
1396 link_info.init_function,
1397 link_info.fini_function,
1400 einfo ("%X%P: can not create BFD %E\n");
1404 /* __rtld defined in /lib/librtl.a */
1406 lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL);
1411 gld${EMULATION_NAME}_set_output_arch (void)
1413 bfd_set_arch_mach (link_info.output_bfd,
1414 bfd_xcoff_architecture (link_info.output_bfd),
1415 bfd_xcoff_machine (link_info.output_bfd));
1417 ldfile_output_architecture = bfd_get_arch (link_info.output_bfd);
1418 ldfile_output_machine = bfd_get_mach (link_info.output_bfd);
1419 ldfile_output_machine_name = bfd_printable_name (link_info.output_bfd);
1423 gld${EMULATION_NAME}_open_dynamic_archive (const char *arch,
1424 search_dirs_type *search,
1425 lang_input_statement_type *entry)
1427 const char *filename;
1430 if (!entry->is_archive)
1433 filename = entry->filename;
1434 path = concat (search->name, "/lib", entry->filename, arch, ".a", NULL);
1435 if (!ldfile_try_open_bfd (path, entry))
1440 /* Don't include the searched directory in the import path. */
1441 bfd_xcoff_set_archive_import_path (&link_info, entry->the_bfd,
1442 path + strlen (search->name) + 1);
1443 entry->filename = path;
1447 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
1448 gld${EMULATION_NAME}_before_parse,
1451 after_parse_default,
1452 gld${EMULATION_NAME}_after_open,
1453 after_allocation_default,
1454 gld${EMULATION_NAME}_set_output_arch,
1455 gld${EMULATION_NAME}_choose_target,
1456 gld${EMULATION_NAME}_before_allocation,
1457 gld${EMULATION_NAME}_get_script,
1458 "${EMULATION_NAME}",
1461 gld${EMULATION_NAME}_create_output_section_statements,
1462 gld${EMULATION_NAME}_open_dynamic_archive,
1463 0, /* place_orphan */
1464 0, /* set_symbols */
1465 gld${EMULATION_NAME}_parse_args,
1466 gld${EMULATION_NAME}_add_options,
1467 gld${EMULATION_NAME}_handle_option,
1468 gld${EMULATION_NAME}_unrecognized_file,
1469 NULL, /* list_options */
1470 NULL, /* recognized_file */
1471 NULL, /* find potential_libraries */
1472 NULL /* new_vers_pattern */