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 /* Whether to implement Unix like linker semantics. */
90 /* Structure used to hold import file list. */
94 struct filelist *next;
98 /* List of import files. */
99 static struct filelist *import_files;
101 /* List of export symbols read from the export files. */
103 struct export_symbol_list
105 struct export_symbol_list *next;
109 static struct export_symbol_list *export_symbols;
111 /* Maintains the 32 or 64 bit mode state of import file */
112 static unsigned int symbol_mode = 0x04;
114 /* Which symbol modes are valid */
115 static unsigned int symbol_mode_mask = 0x0d;
117 /* Whether this is a 64 bit link */
118 static int is_64bit = 0;
120 /* Which syscalls from import file are valid */
121 static unsigned int syscall_mask = 0x77;
123 /* fake file for -binitfini support */
124 static lang_input_statement_type *initfini_file;
126 /* Whether to do run time linking
127 -brtl enables, -bnortl and -bnortllib disable. */
130 /* Explicit command line library path, -blibpath */
131 static char *command_line_blibpath = NULL;
133 /* This routine is called before anything else is done. */
136 gld${EMULATION_NAME}_before_parse (void)
138 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
140 config.has_shared = TRUE;
142 /* The link_info.[init|fini]_functions are initialized in ld/lexsup.c.
143 Override them here so we can use the link_info.init_function as a
144 state flag that lets the backend know that -binitfini has been done. */
146 link_info.init_function = NULL;
147 link_info.fini_function = NULL;
150 /* Handle AIX specific options. */
178 gld${EMULATION_NAME}_add_options
179 (int ns, char **shortopts, int nl, struct option **longopts,
180 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
182 static const char xtra_short[] = "D:H:KT:z";
183 static const struct option xtra_long[] = {
184 /* -binitfini has special handling in the linker backend. The native linker
185 uses the arguemnts to generate a table of init and fini functions for
186 the executable. The important use for this option is to support aix 4.2+
187 c++ constructors and destructors. This is tied into gcc via collect2.c.
189 The function table is accessed by the runtime linker/loader by checking if
190 the first symbol in the loader symbol table is __rtinit. The gnu linker
191 generates this symbol and makes it the first loader symbol. */
193 {"basis", no_argument, NULL, OPTION_IGNORE},
194 {"bautoimp", no_argument, NULL, OPTION_AUTOIMP},
195 {"bcomprld", no_argument, NULL, OPTION_IGNORE},
196 {"bcrld", no_argument, NULL, OPTION_IGNORE},
197 {"bcror31", no_argument, NULL, OPTION_IGNORE},
198 {"bD", required_argument, NULL, OPTION_MAXDATA},
199 {"bE", required_argument, NULL, OPTION_EXPORT},
200 {"bernotok", no_argument, NULL, OPTION_ERNOTOK},
201 {"berok", no_argument, NULL, OPTION_EROK},
202 {"berrmsg", no_argument, NULL, OPTION_IGNORE},
203 {"bexport", required_argument, NULL, OPTION_EXPORT},
204 {"bf", no_argument, NULL, OPTION_ERNOTOK},
205 {"bgc", no_argument, &gc, 1},
206 {"bh", required_argument, NULL, OPTION_IGNORE},
207 {"bhalt", required_argument, NULL, OPTION_IGNORE},
208 {"bI", required_argument, NULL, OPTION_IMPORT},
209 {"bimport", required_argument, NULL, OPTION_IMPORT},
210 {"binitfini", required_argument, NULL, OPTION_INITFINI},
211 {"bl", required_argument, NULL, OPTION_LOADMAP},
212 {"bloadmap", required_argument, NULL, OPTION_LOADMAP},
213 {"bmaxdata", required_argument, NULL, OPTION_MAXDATA},
214 {"bmaxstack", required_argument, NULL, OPTION_MAXSTACK},
215 {"bM", required_argument, NULL, OPTION_MODTYPE},
216 {"bmodtype", required_argument, NULL, OPTION_MODTYPE},
217 {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP},
218 {"bnodelcsect", no_argument, NULL, OPTION_IGNORE},
219 {"bnoentry", no_argument, NULL, OPTION_IGNORE},
220 {"bnogc", no_argument, &gc, 0},
221 {"bnso", no_argument, NULL, OPTION_NOAUTOIMP},
222 {"bnostrcmpct", no_argument, NULL, OPTION_NOSTRCMPCT},
223 {"bnotextro", no_argument, &textro, 0},
224 {"bnro", no_argument, &textro, 0},
225 {"bpD", required_argument, NULL, OPTION_PD},
226 {"bpT", required_argument, NULL, OPTION_PT},
227 {"bro", no_argument, &textro, 1},
228 {"brtl", no_argument, &rtld, 1},
229 {"bnortl", no_argument, &rtld, 0},
230 {"bnortllib", no_argument, &rtld, 0},
231 {"bS", required_argument, NULL, OPTION_MAXSTACK},
232 {"bso", no_argument, NULL, OPTION_AUTOIMP},
233 {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT},
234 {"btextro", no_argument, &textro, 1},
235 {"b32", no_argument, NULL, OPTION_32},
236 {"b64", no_argument, NULL, OPTION_64},
237 {"static", no_argument, NULL, OPTION_NOAUTOIMP},
238 {"unix", no_argument, NULL, OPTION_UNIX},
239 {"blibpath", required_argument, NULL, OPTION_LIBPATH},
240 {"bnolibpath", required_argument, NULL, OPTION_NOLIBPATH},
241 {NULL, no_argument, NULL, 0}
244 /* Options supported by the AIX linker which we do not support: -f,
245 -S, -v, -Z, -bbindcmds, -bbinder, -bbindopts, -bcalls, -bcaps,
246 -bcror15, -bdebugopt, -bdbg, -bdelcsect, -bex?, -bfilelist, -bfl,
247 -bgcbypass, -bglink, -binsert, -bi, -bloadmap, -bl, -bmap, -bnl,
248 -bnobind, -bnocomprld, -bnocrld, -bnoerrmsg, -bnoglink,
249 -bnoloadmap, -bnl, -bnoobjreorder, -bnoquiet, -bnoreorder,
250 -bnotypchk, -bnox, -bquiet, -bR, -brename, -breorder, -btypchk,
253 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
254 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
255 *longopts = xrealloc (*longopts,
256 nl * sizeof (struct option) + sizeof (xtra_long));
257 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
261 gld${EMULATION_NAME}_parse_args (int argc, char **argv)
265 /* If the current option starts with -b, change the first : to an =.
266 The AIX linker uses : to separate the option from the argument;
267 changing it to = lets us treat it as a getopt option. */
272 if (indx < argc && CONST_STRNEQ (argv[indx], "-b"))
276 for (s = argv[indx]; *s != '\0'; s++)
289 gld${EMULATION_NAME}_handle_option (int optc)
300 /* Long option which just sets a flag. */
304 val = bfd_scan_vma (optarg, &end, 0);
306 einfo ("%P: warning: ignoring invalid -D number %s\n", optarg);
308 lang_section_start (".data", exp_intop (val), NULL);
312 val = bfd_scan_vma (optarg, &end, 0);
313 if (*end != '\0' || (val & (val - 1)) != 0)
314 einfo ("%P: warning: ignoring invalid -H number %s\n", optarg);
321 /* FIXME: This should use the page size for the target system. */
326 /* On AIX this is the same as GNU ld -Ttext. When we see -T
327 number, we assume the AIX option is intended. Otherwise, we
328 assume the usual GNU ld -T option is intended. We can't just
329 ignore the AIX option, because gcc passes it to the linker. */
330 val = bfd_scan_vma (optarg, &end, 0);
333 lang_section_start (".text", exp_intop (val), NULL);
339 case OPTION_INITFINI:
342 * The aix linker init fini has the format :
344 * -binitfini:[ Initial][:Termination][:Priority]
346 * it allows the Termination and Priority to be optional.
348 * Since we support only one init/fini pair, we ignore the Priority.
350 * Define the special symbol __rtinit.
352 * strtok does not correctly handle the case of -binitfini::fini: so
358 while (*t && ':' != *t)
364 link_info.init_function = i;
367 while (*t && ':' != *t)
372 link_info.fini_function = f;
377 link_info.static_link = FALSE;
381 force_make_executable = FALSE;
385 force_make_executable = TRUE;
389 gld${EMULATION_NAME}_read_file (optarg, FALSE);
395 struct filelist **flpp;
397 n = (struct filelist *) xmalloc (sizeof (struct filelist));
400 flpp = &import_files;
401 while (*flpp != NULL)
402 flpp = &(*flpp)->next;
408 config.map_filename = optarg;
412 val = bfd_scan_vma (optarg, &end, 0);
414 einfo ("%P: warning: ignoring invalid -bmaxdata number %s\n", optarg);
419 case OPTION_MAXSTACK:
420 val = bfd_scan_vma (optarg, &end, 0);
422 einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n",
431 link_info.shared = TRUE;
434 if (*optarg == '\0' || optarg[1] == '\0')
435 einfo ("%P: warning: ignoring invalid module type %s\n", optarg);
437 modtype = (*optarg << 8) | optarg[1];
440 case OPTION_NOAUTOIMP:
441 link_info.static_link = TRUE;
444 case OPTION_NOSTRCMPCT:
445 link_info.traditional_format = TRUE;
449 /* This sets the page that the .data section is supposed to
450 start on. The offset within the page should still be the
451 offset within the file, so we need to build an appropriate
453 val = bfd_scan_vma (optarg, &end, 0);
455 einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg);
463 exp_nameop (NAME, "."),
466 exp_binop ('+', t, exp_intop (31)),
467 exp_intop (~(bfd_vma) 31));
468 lang_section_start (".data", t, NULL);
473 /* This set the page that the .text section is supposed to start
474 on. The offset within the page should still be the offset
476 val = bfd_scan_vma (optarg, &end, 0);
478 einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg);
485 exp_nameop (SIZEOF_HEADERS, NULL));
487 exp_binop ('+', t, exp_intop (31)),
488 exp_intop (~(bfd_vma) 31));
489 lang_section_start (".text", t, NULL);
493 case OPTION_STRCMPCT:
494 link_info.traditional_format = FALSE;
504 symbol_mode_mask = 0x0d;
510 symbol_mode_mask = 0x0e;
514 command_line_blibpath = optarg;
517 case OPTION_NOLIBPATH:
518 command_line_blibpath = NULL;
526 /* This is called when an input file can not be recognized as a BFD
527 object or an archive. If the file starts with #!, we must treat it
528 as an import file. This is for AIX compatibility. */
531 gld${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry)
536 e = fopen (entry->filename, FOPEN_RT);
542 if (getc (e) == '#' && getc (e) == '!')
545 struct filelist **flpp;
547 n = (struct filelist *) xmalloc (sizeof (struct filelist));
549 n->name = entry->filename;
550 flpp = &import_files;
551 while (*flpp != NULL)
552 flpp = &(*flpp)->next;
556 entry->loaded = TRUE;
564 /* This is called after the input files have been opened. */
567 gld${EMULATION_NAME}_after_open (void)
572 /* Call ldctor_build_sets, after pretending that this is a
573 relocatable link. We do this because AIX requires relocation
574 entries for all references to symbols, even in a final
575 executable. Of course, we only want to do this if we are
576 producing an XCOFF output file. */
577 r = link_info.relocatable;
578 if (strstr (bfd_get_target (link_info.output_bfd), "xcoff") != NULL)
579 link_info.relocatable = TRUE;
580 ldctor_build_sets ();
581 link_info.relocatable = r;
583 /* For each set, record the size, so that the XCOFF backend can
584 output the correct csect length. */
585 for (p = sets; p != (struct set_info *) NULL; p = p->next)
589 /* If the symbol is defined, we may have been invoked from
590 collect, and the sets may already have been built, so we do
592 if (p->h->type == bfd_link_hash_defined
593 || p->h->type == bfd_link_hash_defweak)
596 if (p->reloc != BFD_RELOC_CTOR)
598 /* Handle this if we need to. */
602 size = (p->count + 2) * 4;
603 if (!bfd_xcoff_link_record_set (link_info.output_bfd, &link_info,
605 einfo ("%F%P: bfd_xcoff_link_record_set failed: %E\n");
609 /* This is called after the sections have been attached to output
610 sections, but before any sizes or addresses have been set. */
613 gld${EMULATION_NAME}_before_allocation (void)
616 struct export_symbol_list *el;
618 asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
619 static const char *const must_keep_sections[] = {
626 /* Handle the import and export files, if any. */
627 for (fl = import_files; fl != NULL; fl = fl->next)
628 gld${EMULATION_NAME}_read_file (fl->name, TRUE);
629 for (el = export_symbols; el != NULL; el = el->next)
631 struct bfd_link_hash_entry *h;
633 h = bfd_link_hash_lookup (link_info.hash, el->name, FALSE, FALSE, FALSE);
635 einfo ("%P%F: bfd_link_hash_lookup of export symbol failed: %E\n");
636 if (!bfd_xcoff_export_symbol (link_info.output_bfd, &link_info, h))
637 einfo ("%P%F: bfd_xcoff_export_symbol failed: %E\n");
640 /* Track down all relocations called for by the linker script (these
641 are typically constructor/destructor entries created by
642 CONSTRUCTORS) and let the backend know it will need to create
643 .loader relocs for them. */
644 lang_for_each_statement (gld${EMULATION_NAME}_find_relocs);
646 /* Precedence of LIBPATH
647 -blibpath: native support always first
648 -rpath: gnu extension
649 -L build from command line -L's */
650 if (command_line_blibpath != NULL)
651 libpath = command_line_blibpath;
652 else if (command_line.rpath != NULL)
653 libpath = command_line.rpath;
654 else if (search_head == NULL)
655 libpath = (char *) "";
659 search_dirs_type *search;
661 /* PR ld/4023: Strip sysroot prefix from any paths
662 being inserted into the output binary's DT_RPATH. */
663 if (ld_sysroot != NULL
664 && * ld_sysroot != 0)
666 const char * name = search_head->name;
667 size_t ld_sysroot_len = strlen (ld_sysroot);
669 if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0)
670 name += ld_sysroot_len;
673 libpath = xmalloc (len + 1);
674 strcpy (libpath, name);
676 for (search = search_head->next; search != NULL; search = search->next)
681 if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0)
682 name += ld_sysroot_len;
684 nlen = strlen (name);
685 libpath = xrealloc (libpath, len + nlen + 2);
687 strcpy (libpath + len + 1, name);
693 len = strlen (search_head->name);
694 libpath = xmalloc (len + 1);
695 strcpy (libpath, search_head->name);
697 for (search = search_head->next; search != NULL; search = search->next)
701 nlen = strlen (search->name);
702 libpath = xrealloc (libpath, len + nlen + 2);
704 strcpy (libpath + len + 1, search->name);
710 /* Let the XCOFF backend set up the .loader section. */
711 if (!bfd_xcoff_size_dynamic_sections
712 (link_info.output_bfd, &link_info, libpath, entry_symbol.name, file_align,
713 maxstack, maxdata, gc && !unix_ld ? TRUE : FALSE,
714 modtype, textro ? TRUE : FALSE, unix_ld, special_sections,
715 rtld ? TRUE : FALSE))
716 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
718 /* Look through the special sections, and put them in the right
719 place in the link ordering. This is especially magic. */
720 for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
723 lang_output_section_statement_type *os;
724 lang_statement_union_type **pls;
725 lang_input_section_type *is;
729 sec = special_sections[i];
733 /* Remove this section from the list of the output section.
734 This assumes we know what the script looks like. */
736 os = lang_output_section_find (sec->output_section->name);
738 einfo ("%P%F: can't find output section %s\n",
739 sec->output_section->name);
741 for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->header.next)
743 if ((*pls)->header.type == lang_input_section_enum
744 && (*pls)->input_section.section == sec)
746 is = (lang_input_section_type *) * pls;
747 *pls = (*pls)->header.next;
751 if ((*pls)->header.type == lang_wild_statement_enum)
753 lang_statement_union_type **pwls;
755 for (pwls = &(*pls)->wild_statement.children.head;
756 *pwls != NULL; pwls = &(*pwls)->header.next)
759 if ((*pwls)->header.type == lang_input_section_enum
760 && (*pwls)->input_section.section == sec)
762 is = (lang_input_section_type *) * pwls;
763 *pwls = (*pwls)->header.next;
775 einfo ("%P%F: can't find %s in output section\n",
776 bfd_get_section_name (sec->owner, sec));
779 /* Now figure out where the section should go. */
783 default: /* to avoid warnings */
784 case XCOFF_SPECIAL_SECTION_TEXT:
790 case XCOFF_SPECIAL_SECTION_ETEXT:
796 case XCOFF_SPECIAL_SECTION_DATA:
802 case XCOFF_SPECIAL_SECTION_EDATA:
808 case XCOFF_SPECIAL_SECTION_END:
809 case XCOFF_SPECIAL_SECTION_END2:
816 os = lang_output_section_find (oname);
820 is->header.next = os->children.head;
821 os->children.head = (lang_statement_union_type *) is;
825 is->header.next = NULL;
826 lang_statement_append (&os->children,
827 (lang_statement_union_type *) is,
832 /* Executables and shared objects must always have .text, .data
833 and .bss output sections, so that the header can refer to them.
834 The kernel refuses to load objects that have missing sections. */
835 if (!link_info.relocatable)
836 for (i = 0; i < ARRAY_SIZE (must_keep_sections); i++)
840 sec = bfd_get_section_by_name (link_info.output_bfd,
841 must_keep_sections[i]);
843 einfo ("%P: can't find required output section %s\n", must_keep_sections[i]);
845 sec->flags |= SEC_KEEP;
848 before_allocation_default ();
852 gld${EMULATION_NAME}_choose_target (int argc, char **argv)
855 static char *from_outside;
856 static char *from_inside;
857 static char *argv_to_target[][2] = {
858 {NULL, "${OUTPUT_FORMAT}"},
859 {"-b32", "${OUTPUT_FORMAT_32BIT}"},
860 {"-b64", "${OUTPUT_FORMAT_64BIT}"},
865 from_outside = getenv (TARGET_ENVIRON);
866 if (from_outside != (char *) NULL)
869 /* Set to default. */
870 from_inside = argv_to_target[0][1];
871 for (i = 1; i < argc; i++)
873 for (j = 1; j < jmax; j++)
875 if (0 == strcmp (argv[i], argv_to_target[j][0]))
876 from_inside = argv_to_target[j][1];
887 change_symbol_mode (char *input)
889 char *symbol_mode_string[] = {
900 for (bit = 0;; bit++)
902 string = symbol_mode_string[bit];
906 if (0 == strcmp (input, string))
908 symbol_mode = (1 << bit);
912 /* should not be here */
919 -1 : error, try something else */
921 is_syscall (char *input, unsigned int *flag)
927 char *syscall_string;
930 { "svc" /* 0x01 */, XCOFF_SYSCALL32 },
931 { "svc32" /* 0x02 */, XCOFF_SYSCALL32 },
932 { "svc3264" /* 0x04 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
933 { "svc64" /* 0x08 */, XCOFF_SYSCALL64 },
934 { "syscall" /* 0x10 */, XCOFF_SYSCALL32 },
935 { "syscall32" /* 0x20 */, XCOFF_SYSCALL32 },
936 { "syscall3264" /* 0x40 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
937 { "syscall64" /* 0x80 */, XCOFF_SYSCALL64 },
943 for (bit = 0;; bit++)
945 string = s[bit].syscall_string;
949 if (0 == strcmp (input, string))
951 if (1 << bit & syscall_mask)
962 /* should not be here */
966 /* Read an import or export file. For an import file, this is called
967 by the before_allocation emulation routine. For an export file,
968 this is called by the handle_option emulation routine. */
971 gld${EMULATION_NAME}_read_file (const char *filename, bfd_boolean import)
980 const char *impmember;
982 o = (struct obstack *) xmalloc (sizeof (struct obstack));
983 obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
985 f = fopen (filename, FOPEN_RT);
988 bfd_set_error (bfd_error_system_call);
989 einfo ("%F%s: %E\n", filename);
1000 /* Default to 32 and 64 bit mode
1001 symbols at top of /lib/syscalls.exp do not have a mode modifier and they
1002 are not repeated, assume 64 bit routines also want to use them.
1003 See the routine change_symbol_mode for more information. */
1007 while ((c = getc (f)) != EOF)
1011 unsigned int syscall_flag = 0;
1013 struct bfd_link_hash_entry *h;
1017 obstack_1grow (o, c);
1021 obstack_1grow (o, '\0');
1024 s = (char *) obstack_base (o);
1025 while (ISSPACE (*s))
1029 || change_symbol_mode (s)
1030 || (*s == '#' && s[1] == ' ')
1031 || (!import && *s == '#' && s[1] == '!'))
1033 obstack_free (o, obstack_base (o));
1037 if (*s == '#' && s[1] == '!')
1040 while (ISSPACE (*s))
1047 obstack_free (o, obstack_base (o));
1050 einfo ("%F%s%d: #! ([member]) is not supported in import files\n",
1057 (void) obstack_finish (o);
1061 while (!ISSPACE (*s) && *s != '(' && *s != '\0')
1071 if (imppath == file - 1)
1081 while (ISSPACE (cs))
1090 einfo ("%s:%d: warning: syntax error in import file\n",
1097 while (*s != ')' && *s != '\0')
1102 einfo ("%s:%d: warning: syntax error in import file\n",
1110 if (symbol_mode & symbol_mode_mask)
1112 /* This is a symbol to be imported or exported. */
1115 address = (bfd_vma) -1;
1117 while (!ISSPACE (*s) && *s != '\0')
1125 while (ISSPACE (*s))
1129 while (!ISSPACE (*se) && *se != '\0')
1134 while (ISSPACE (*se))
1137 einfo ("%s%d: warning: syntax error in import/export file\n",
1146 status = is_syscall (s, &syscall_flag);
1150 /* not a system call, check for address */
1151 address = bfd_scan_vma (s, &end, 0);
1154 einfo ("%s:%d: warning: syntax error in import/export file\n",
1164 struct export_symbol_list *n;
1166 ldlang_add_undef (symname);
1167 n = ((struct export_symbol_list *)
1168 xmalloc (sizeof (struct export_symbol_list)));
1169 n->next = export_symbols;
1170 n->name = xstrdup (symname);
1175 h = bfd_link_hash_lookup (link_info.hash, symname, FALSE, FALSE,
1177 if (h == NULL || h->type == bfd_link_hash_new)
1179 /* We can just ignore attempts to import an unreferenced
1184 if (!bfd_xcoff_import_symbol (link_info.output_bfd,
1186 address, imppath, impfile,
1187 impmember, syscall_flag))
1188 einfo ("%X%s:%d: failed to import symbol %s: %E\n",
1189 filename, lineno, symname);
1193 obstack_free (o, obstack_base (o));
1196 if (obstack_object_size (o) > 0)
1198 einfo ("%s:%d: warning: ignoring unterminated last line\n",
1200 obstack_free (o, obstack_base (o));
1205 obstack_free (o, NULL);
1210 /* This routine saves us from worrying about declaring free. */
1213 gld${EMULATION_NAME}_free (void *p)
1218 /* This is called by the before_allocation routine via
1219 lang_for_each_statement. It looks for relocations and assignments
1223 gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *s)
1225 if (s->header.type == lang_reloc_statement_enum)
1227 lang_reloc_statement_type *rs;
1229 rs = &s->reloc_statement;
1230 if (rs->name == NULL)
1231 einfo ("%F%P: only relocations against symbols are permitted\n");
1232 if (!bfd_xcoff_link_count_reloc (link_info.output_bfd, &link_info,
1234 einfo ("%F%P: bfd_xcoff_link_count_reloc failed: %E\n");
1237 if (s->header.type == lang_assignment_statement_enum)
1238 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1241 /* Look through an expression for an assignment statement. */
1244 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1246 struct bfd_link_hash_entry *h;
1248 switch (exp->type.node_class)
1251 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
1252 FALSE, FALSE, FALSE);
1257 if (strcmp (exp->assign.dst, ".") != 0)
1259 if (!bfd_xcoff_record_link_assignment (link_info.output_bfd,
1262 einfo ("%P%F: failed to record assignment to %s: %E\n",
1265 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1269 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1270 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1274 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1275 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1276 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1280 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1289 gld${EMULATION_NAME}_get_script (int *isfile)
1292 if test -n "$COMPILE_IN"
1294 # Scripts compiled in.
1296 # sed commands to quote an ld script as a C string.
1297 sc="-f ${srcdir}/emultempl/ostring.sed"
1303 if (link_info.relocatable && config.build_constructors)
1306 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1307 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1308 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1309 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1310 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1311 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1312 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1313 echo ' ; else return' >> e${EMULATION_NAME}.c
1314 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1315 echo '; }' >> e${EMULATION_NAME}.c
1318 # Scripts read from the filesystem.
1324 if (link_info.relocatable && config.build_constructors)
1325 return "ldscripts/${EMULATION_NAME}.xu";
1326 else if (link_info.relocatable)
1327 return "ldscripts/${EMULATION_NAME}.xr";
1328 else if (!config.text_read_only)
1329 return "ldscripts/${EMULATION_NAME}.xbn";
1330 else if (!config.magic_demand_paged)
1331 return "ldscripts/${EMULATION_NAME}.xn";
1333 return "ldscripts/${EMULATION_NAME}.x";
1342 gld${EMULATION_NAME}_create_output_section_statements (void)
1345 if ((bfd_get_flavour (link_info.output_bfd) == bfd_target_xcoff_flavour)
1346 && (link_info.init_function != NULL
1347 || link_info.fini_function != NULL
1350 initfini_file = lang_add_input_file ("initfini",
1351 lang_input_file_is_file_enum,
1354 initfini_file->the_bfd = bfd_create ("initfini", link_info.output_bfd);
1355 if (initfini_file->the_bfd == NULL
1356 || ! bfd_set_arch_mach (initfini_file->the_bfd,
1357 bfd_get_arch (link_info.output_bfd),
1358 bfd_get_mach (link_info.output_bfd)))
1360 einfo ("%X%P: can not create BFD %E\n");
1364 /* Call backend to fill in the rest */
1365 if (! bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd,
1366 link_info.init_function,
1367 link_info.fini_function,
1370 einfo ("%X%P: can not create BFD %E\n");
1374 /* __rtld defined in /lib/librtl.a */
1376 lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL);
1381 gld${EMULATION_NAME}_set_output_arch (void)
1383 bfd_set_arch_mach (link_info.output_bfd,
1384 bfd_xcoff_architecture (link_info.output_bfd),
1385 bfd_xcoff_machine (link_info.output_bfd));
1387 ldfile_output_architecture = bfd_get_arch (link_info.output_bfd);
1388 ldfile_output_machine = bfd_get_mach (link_info.output_bfd);
1389 ldfile_output_machine_name = bfd_printable_name (link_info.output_bfd);
1392 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
1393 gld${EMULATION_NAME}_before_parse,
1396 after_parse_default,
1397 gld${EMULATION_NAME}_after_open,
1398 after_allocation_default,
1399 gld${EMULATION_NAME}_set_output_arch,
1400 gld${EMULATION_NAME}_choose_target,
1401 gld${EMULATION_NAME}_before_allocation,
1402 gld${EMULATION_NAME}_get_script,
1403 "${EMULATION_NAME}",
1406 gld${EMULATION_NAME}_create_output_section_statements,
1407 0, /* open_dynamic_archive */
1408 0, /* place_orphan */
1409 0, /* set_symbols */
1410 gld${EMULATION_NAME}_parse_args,
1411 gld${EMULATION_NAME}_add_options,
1412 gld${EMULATION_NAME}_handle_option,
1413 gld${EMULATION_NAME}_unrecognized_file,
1414 NULL, /* list_options */
1415 NULL, /* recognized_file */
1416 NULL, /* find potential_libraries */
1417 NULL /* new_vers_pattern */