1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 if [ -z "$MACHINE" ]; then
6 OUTPUT_ARCH=${ARCH}:${MACHINE}
8 cat >e${EMULATION_NAME}.c <<EOF
9 /* This file is is generated by a shell script. DO NOT EDIT! */
11 /* AIX emulation code for ${EMULATION_NAME}
12 Copyright 1991, 1993, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003
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}
38 #include "libiberty.h"
39 #include "safe-ctype.h"
54 #include "coff/internal.h"
55 #include "coff/xcoff.h"
59 static void gld${EMULATION_NAME}_read_file (const char *, bfd_boolean);
60 static void gld${EMULATION_NAME}_free (void *);
61 static void gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *);
62 static void gld${EMULATION_NAME}_find_exp_assignment (etree_type *);
65 /* The file alignment required for each section. */
66 static unsigned long file_align;
68 /* The maximum size the stack is permitted to grow. This is stored in
70 static unsigned long maxstack;
72 /* The maximum data size. This is stored in the a.out header. */
73 static unsigned long maxdata;
75 /* Whether to perform garbage collection. */
78 /* The module type to use. */
79 static unsigned short modtype = ('1' << 8) | 'L';
81 /* Whether the .text section must be read-only (i.e., no relocs
85 /* Whether to implement Unix like linker semantics. */
88 /* Structure used to hold import file list. */
92 struct filelist *next;
96 /* List of import files. */
97 static struct filelist *import_files;
99 /* List of export symbols read from the export files. */
101 struct export_symbol_list
103 struct export_symbol_list *next;
107 static struct export_symbol_list *export_symbols;
109 /* Maintains the 32 or 64 bit mode state of import file */
110 static unsigned int symbol_mode = 0x04;
112 /* Which symbol modes are valid */
113 static unsigned int symbol_mode_mask = 0x0d;
115 /* Whether this is a 64 bit link */
116 static int is_64bit = 0;
118 /* Which syscalls from import file are valid */
119 static unsigned int syscall_mask = 0x77;
121 /* fake file for -binitfini support */
122 static lang_input_statement_type *initfini_file;
124 /* Whether to do run time linking
125 -brtl enables, -bnortl and -bnortllib disable. */
128 /* Explicit command line library path, -blibpath */
129 static char *command_line_blibpath = NULL;
131 /* This routine is called before anything else is done. */
134 gld${EMULATION_NAME}_before_parse (void)
136 const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
139 ldfile_output_architecture = arch->arch;
140 ldfile_output_machine = arch->mach;
141 ldfile_output_machine_name = arch->printable_name;
144 ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
146 config.has_shared = TRUE;
148 /* The link_info.[init|fini]_functions are initialized in ld/lexsup.c.
149 Override them here so we can use the link_info.init_function as a
150 state flag that lets the backend know that -binitfini has been done. */
152 link_info.init_function = NULL;
153 link_info.fini_function = NULL;
156 /* Handle AIX specific options. */
184 gld${EMULATION_NAME}_add_options
185 (int ns, char **shortopts, int nl, struct option **longopts,
186 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
188 static const char xtra_short[] = "D:H:KT:z";
189 static const struct option xtra_long[] = {
190 /* -binitfini has special handling in the linker backend. The native linker
191 uses the arguemnts to generate a table of init and fini functions for
192 the executable. The important use for this option is to support aix 4.2+
193 c++ constructors and destructors. This is tied into gcc via collect2.c.
195 The function table is accessed by the runtime linker/loader by checking if
196 the first symbol in the loader symbol table is __rtinit. The gnu linker
197 generates this symbol and makes it the first loader symbol. */
199 {"basis", no_argument, NULL, OPTION_IGNORE},
200 {"bautoimp", no_argument, NULL, OPTION_AUTOIMP},
201 {"bcomprld", no_argument, NULL, OPTION_IGNORE},
202 {"bcrld", no_argument, NULL, OPTION_IGNORE},
203 {"bcror31", no_argument, NULL, OPTION_IGNORE},
204 {"bD", required_argument, NULL, OPTION_MAXDATA},
205 {"bE", required_argument, NULL, OPTION_EXPORT},
206 {"bernotok", no_argument, NULL, OPTION_ERNOTOK},
207 {"berok", no_argument, NULL, OPTION_EROK},
208 {"berrmsg", no_argument, NULL, OPTION_IGNORE},
209 {"bexport", required_argument, NULL, OPTION_EXPORT},
210 {"bf", no_argument, NULL, OPTION_ERNOTOK},
211 {"bgc", no_argument, &gc, 1},
212 {"bh", required_argument, NULL, OPTION_IGNORE},
213 {"bhalt", required_argument, NULL, OPTION_IGNORE},
214 {"bI", required_argument, NULL, OPTION_IMPORT},
215 {"bimport", required_argument, NULL, OPTION_IMPORT},
216 {"binitfini", required_argument, NULL, OPTION_INITFINI},
217 {"bl", required_argument, NULL, OPTION_LOADMAP},
218 {"bloadmap", required_argument, NULL, OPTION_LOADMAP},
219 {"bmaxdata", required_argument, NULL, OPTION_MAXDATA},
220 {"bmaxstack", required_argument, NULL, OPTION_MAXSTACK},
221 {"bM", required_argument, NULL, OPTION_MODTYPE},
222 {"bmodtype", required_argument, NULL, OPTION_MODTYPE},
223 {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP},
224 {"bnodelcsect", no_argument, NULL, OPTION_IGNORE},
225 {"bnoentry", no_argument, NULL, OPTION_IGNORE},
226 {"bnogc", no_argument, &gc, 0},
227 {"bnso", no_argument, NULL, OPTION_NOAUTOIMP},
228 {"bnostrcmpct", no_argument, NULL, OPTION_NOSTRCMPCT},
229 {"bnotextro", no_argument, &textro, 0},
230 {"bnro", no_argument, &textro, 0},
231 {"bpD", required_argument, NULL, OPTION_PD},
232 {"bpT", required_argument, NULL, OPTION_PT},
233 {"bro", no_argument, &textro, 1},
234 {"brtl", no_argument, &rtld, 1},
235 {"bnortl", no_argument, &rtld, 0},
236 {"bnortllib", no_argument, &rtld, 0},
237 {"bS", required_argument, NULL, OPTION_MAXSTACK},
238 {"bso", no_argument, NULL, OPTION_AUTOIMP},
239 {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT},
240 {"btextro", no_argument, &textro, 1},
241 {"b32", no_argument, NULL, OPTION_32},
242 {"b64", no_argument, NULL, OPTION_64},
243 {"static", no_argument, NULL, OPTION_NOAUTOIMP},
244 {"unix", no_argument, NULL, OPTION_UNIX},
245 {"blibpath", required_argument, NULL, OPTION_LIBPATH},
246 {"bnolibpath", required_argument, NULL, OPTION_NOLIBPATH},
247 {NULL, no_argument, NULL, 0}
250 /* Options supported by the AIX linker which we do not support: -f,
251 -S, -v, -Z, -bbindcmds, -bbinder, -bbindopts, -bcalls, -bcaps,
252 -bcror15, -bdebugopt, -bdbg, -bdelcsect, -bex?, -bfilelist, -bfl,
253 -bgcbypass, -bglink, -binsert, -bi, -bloadmap, -bl, -bmap, -bnl,
254 -bnobind, -bnocomprld, -bnocrld, -bnoerrmsg, -bnoglink,
255 -bnoloadmap, -bnl, -bnoobjreorder, -bnoquiet, -bnoreorder,
256 -bnotypchk, -bnox, -bquiet, -bR, -brename, -breorder, -btypchk,
259 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
260 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
261 *longopts = xrealloc (*longopts,
262 nl * sizeof (struct option) + sizeof (xtra_long));
263 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
267 gld${EMULATION_NAME}_parse_args (int argc, char **argv)
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. */
278 if (indx < argc && strncmp (argv[indx], "-b", 2) == 0)
282 for (s = argv[indx]; *s != '\0'; s++)
295 gld${EMULATION_NAME}_handle_option (int optc)
306 /* Long option which just sets a flag. */
310 val = bfd_scan_vma (optarg, &end, 0);
312 einfo ("%P: warning: ignoring invalid -D number %s\n", optarg);
314 lang_section_start (".data", exp_intop (val));
318 val = bfd_scan_vma (optarg, &end, 0);
319 if (*end != '\0' || (val & (val - 1)) != 0)
320 einfo ("%P: warning: ignoring invalid -H number %s\n", optarg);
327 /* FIXME: This should use the page size for the target system. */
332 /* On AIX this is the same as GNU ld -Ttext. When we see -T
333 number, we assume the AIX option is intended. Otherwise, we
334 assume the usual GNU ld -T option is intended. We can't just
335 ignore the AIX option, because gcc passes it to the linker. */
336 val = bfd_scan_vma (optarg, &end, 0);
339 lang_section_start (".text", exp_intop (val));
345 case OPTION_INITFINI:
348 * The aix linker init fini has the format :
350 * -binitfini:[ Initial][:Termination][:Priority]
352 * it allows the Termination and Priority to be optional.
354 * Since we support only one init/fini pair, we ignore the Priority.
356 * Define the special symbol __rtinit.
358 * strtok does not correctly handle the case of -binitfini::fini: so
364 while (*t && ':' != *t)
370 link_info.init_function = i;
373 while (*t && ':' != *t)
378 link_info.fini_function = f;
383 link_info.static_link = FALSE;
387 force_make_executable = FALSE;
391 force_make_executable = TRUE;
395 gld${EMULATION_NAME}_read_file (optarg, FALSE);
401 struct filelist **flpp;
403 n = (struct filelist *) xmalloc (sizeof (struct filelist));
406 flpp = &import_files;
407 while (*flpp != NULL)
408 flpp = &(*flpp)->next;
414 config.map_filename = optarg;
418 val = bfd_scan_vma (optarg, &end, 0);
420 einfo ("%P: warning: ignoring invalid -bmaxdata number %s\n", optarg);
425 case OPTION_MAXSTACK:
426 val = bfd_scan_vma (optarg, &end, 0);
428 einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n",
437 link_info.shared = TRUE;
440 if (*optarg == '\0' || optarg[1] == '\0')
441 einfo ("%P: warning: ignoring invalid module type %s\n", optarg);
443 modtype = (*optarg << 8) | optarg[1];
446 case OPTION_NOAUTOIMP:
447 link_info.static_link = TRUE;
450 case OPTION_NOSTRCMPCT:
451 link_info.traditional_format = TRUE;
455 /* This sets the page that the .data section is supposed to
456 start on. The offset within the page should still be the
457 offset within the file, so we need to build an appropriate
459 val = bfd_scan_vma (optarg, &end, 0);
461 einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg);
469 exp_nameop (NAME, "."),
472 exp_binop ('+', t, exp_intop (31)),
473 exp_intop (~(bfd_vma) 31));
474 lang_section_start (".data", t);
479 /* This set the page that the .text section is supposed to start
480 on. The offset within the page should still be the offset
482 val = bfd_scan_vma (optarg, &end, 0);
484 einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg);
491 exp_nameop (SIZEOF_HEADERS, NULL));
493 exp_binop ('+', t, exp_intop (31)),
494 exp_intop (~(bfd_vma) 31));
495 lang_section_start (".text", t);
499 case OPTION_STRCMPCT:
500 link_info.traditional_format = FALSE;
510 symbol_mode_mask = 0x0d;
516 symbol_mode_mask = 0x0e;
520 command_line_blibpath = optarg;
523 case OPTION_NOLIBPATH:
524 command_line_blibpath = NULL;
532 /* This is called when an input file can not be recognized as a BFD
533 object or an archive. If the file starts with #!, we must treat it
534 as an import file. This is for AIX compatibility. */
537 gld${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry)
542 e = fopen (entry->filename, FOPEN_RT);
548 if (getc (e) == '#' && getc (e) == '!')
551 struct filelist **flpp;
553 n = (struct filelist *) xmalloc (sizeof (struct filelist));
555 n->name = entry->filename;
556 flpp = &import_files;
557 while (*flpp != NULL)
558 flpp = &(*flpp)->next;
562 entry->loaded = TRUE;
570 /* This is called after the input files have been opened. */
573 gld${EMULATION_NAME}_after_open (void)
578 /* Call ldctor_build_sets, after pretending that this is a
579 relocatable link. We do this because AIX requires relocation
580 entries for all references to symbols, even in a final
581 executable. Of course, we only want to do this if we are
582 producing an XCOFF output file. */
583 r = link_info.relocatable;
584 if (strstr (bfd_get_target (output_bfd), "xcoff") != NULL)
585 link_info.relocatable = TRUE;
586 ldctor_build_sets ();
587 link_info.relocatable = r;
589 /* For each set, record the size, so that the XCOFF backend can
590 output the correct csect length. */
591 for (p = sets; p != (struct set_info *) NULL; p = p->next)
595 /* If the symbol is defined, we may have been invoked from
596 collect, and the sets may already have been built, so we do
598 if (p->h->type == bfd_link_hash_defined
599 || p->h->type == bfd_link_hash_defweak)
602 if (p->reloc != BFD_RELOC_CTOR)
604 /* Handle this if we need to. */
608 size = (p->count + 2) * 4;
609 if (!bfd_xcoff_link_record_set (output_bfd, &link_info, p->h, size))
610 einfo ("%F%P: bfd_xcoff_link_record_set failed: %E\n");
614 /* This is called after the sections have been attached to output
615 sections, but before any sizes or addresses have been set. */
618 gld${EMULATION_NAME}_before_allocation (void)
621 struct export_symbol_list *el;
623 asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_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 (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 len = strlen (search_head->name);
662 libpath = xmalloc (len + 1);
663 strcpy (libpath, search_head->name);
664 for (search = search_head->next; search != NULL; search = search->next)
668 nlen = strlen (search->name);
669 libpath = xrealloc (libpath, len + nlen + 2);
671 strcpy (libpath + len + 1, search->name);
676 /* Let the XCOFF backend set up the .loader section. */
677 if (!bfd_xcoff_size_dynamic_sections
678 (output_bfd, &link_info, libpath, entry_symbol.name, file_align,
679 maxstack, maxdata, gc && !unix_ld ? TRUE : FALSE,
680 modtype, textro ? TRUE : FALSE, unix_ld, special_sections,
681 rtld ? TRUE : FALSE))
682 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
684 /* Look through the special sections, and put them in the right
685 place in the link ordering. This is especially magic. */
686 for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
689 lang_output_section_statement_type *os;
690 lang_statement_union_type **pls;
691 lang_input_section_type *is;
695 sec = special_sections[i];
699 /* Remove this section from the list of the output section.
700 This assumes we know what the script looks like. */
702 os = lang_output_section_find (sec->output_section->name);
704 einfo ("%P%F: can't find output section %s\n",
705 sec->output_section->name);
707 for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->header.next)
709 if ((*pls)->header.type == lang_input_section_enum
710 && (*pls)->input_section.section == sec)
712 is = (lang_input_section_type *) * pls;
713 *pls = (*pls)->header.next;
717 if ((*pls)->header.type == lang_wild_statement_enum)
719 lang_statement_union_type **pwls;
721 for (pwls = &(*pls)->wild_statement.children.head;
722 *pwls != NULL; pwls = &(*pwls)->header.next)
725 if ((*pwls)->header.type == lang_input_section_enum
726 && (*pwls)->input_section.section == sec)
728 is = (lang_input_section_type *) * pwls;
729 *pwls = (*pwls)->header.next;
741 einfo ("%P%F: can't find %s in output section\n",
742 bfd_get_section_name (sec->owner, sec));
745 /* Now figure out where the section should go. */
749 default: /* to avoid warnings */
750 case XCOFF_SPECIAL_SECTION_TEXT:
756 case XCOFF_SPECIAL_SECTION_ETEXT:
762 case XCOFF_SPECIAL_SECTION_DATA:
768 case XCOFF_SPECIAL_SECTION_EDATA:
774 case XCOFF_SPECIAL_SECTION_END:
775 case XCOFF_SPECIAL_SECTION_END2:
782 os = lang_output_section_find (oname);
786 is->header.next = os->children.head;
787 os->children.head = (lang_statement_union_type *) is;
791 is->header.next = NULL;
792 lang_statement_append (&os->children,
793 (lang_statement_union_type *) is,
800 gld${EMULATION_NAME}_choose_target (int argc, char **argv)
803 static char *from_outside;
804 static char *from_inside;
805 static char *argv_to_target[][2] = {
806 {NULL, "${OUTPUT_FORMAT}"},
807 {"-b32", "${OUTPUT_FORMAT_32BIT}"},
808 {"-b64", "${OUTPUT_FORMAT_64BIT}"},
813 from_outside = getenv (TARGET_ENVIRON);
814 if (from_outside != (char *) NULL)
817 /* Set to default. */
818 from_inside = argv_to_target[0][1];
819 for (i = 1; i < argc; i++)
821 for (j = 1; j < jmax; j++)
823 if (0 == strcmp (argv[i], argv_to_target[j][0]))
824 from_inside = argv_to_target[j][1];
835 change_symbol_mode (char *input)
837 char *symbol_mode_string[] = {
848 for (bit = 0;; bit++)
850 string = symbol_mode_string[bit];
854 if (0 == strcmp (input, string))
856 symbol_mode = (1 << bit);
860 /* should not be here */
867 -1 : error, try something else */
869 is_syscall (char *input, unsigned int *flag)
875 char *syscall_string;
878 { "svc" /* 0x01 */, XCOFF_SYSCALL32 },
879 { "svc32" /* 0x02 */, XCOFF_SYSCALL32 },
880 { "svc3264" /* 0x04 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
881 { "svc64" /* 0x08 */, XCOFF_SYSCALL64 },
882 { "syscall" /* 0x10 */, XCOFF_SYSCALL32 },
883 { "syscall32" /* 0x20 */, XCOFF_SYSCALL32 },
884 { "syscall3264" /* 0x40 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
885 { "syscall64" /* 0x80 */, XCOFF_SYSCALL64 },
891 for (bit = 0;; bit++)
893 string = s[bit].syscall_string;
897 if (0 == strcmp (input, string))
899 if (1 << bit & syscall_mask)
910 /* should not be here */
914 /* Read an import or export file. For an import file, this is called
915 by the before_allocation emulation routine. For an export file,
916 this is called by the handle_option emulation routine. */
919 gld${EMULATION_NAME}_read_file (const char *filename, bfd_boolean import)
928 const char *impmember;
930 o = (struct obstack *) xmalloc (sizeof (struct obstack));
931 obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
933 f = fopen (filename, FOPEN_RT);
936 bfd_set_error (bfd_error_system_call);
937 einfo ("%F%s: %E\n", filename);
948 /* Default to 32 and 64 bit mode
949 symbols at top of /lib/syscalls.exp do not have a mode modifier and they
950 are not repeated, assume 64 bit routines also want to use them.
951 See the routine change_symbol_mode for more information. */
955 while ((c = getc (f)) != EOF)
959 unsigned int syscall_flag = 0;
961 struct bfd_link_hash_entry *h;
965 obstack_1grow (o, c);
969 obstack_1grow (o, '\0');
972 s = (char *) obstack_base (o);
977 || change_symbol_mode (s)
978 || (*s == '#' && s[1] == ' ')
979 || (!import && *s == '#' && s[1] == '!'))
981 obstack_free (o, obstack_base (o));
985 if (*s == '#' && s[1] == '!')
995 obstack_free (o, obstack_base (o));
998 einfo ("%F%s%d: #! ([member]) is not supported in import files\n",
1005 (void) obstack_finish (o);
1009 while (!ISSPACE (*s) && *s != '(' && *s != '\0')
1019 if (imppath == file - 1)
1029 while (ISSPACE (cs))
1038 einfo ("%s:%d: warning: syntax error in import file\n",
1045 while (*s != ')' && *s != '\0')
1050 einfo ("%s:%d: warning: syntax error in import file\n",
1058 if (symbol_mode & symbol_mode_mask)
1060 /* This is a symbol to be imported or exported. */
1063 address = (bfd_vma) -1;
1065 while (!ISSPACE (*s) && *s != '\0')
1073 while (ISSPACE (*s))
1077 while (!ISSPACE (*se) && *se != '\0')
1082 while (ISSPACE (*se))
1085 einfo ("%s%d: warning: syntax error in import/export file\n",
1094 status = is_syscall (s, &syscall_flag);
1098 /* not a system call, check for address */
1099 address = bfd_scan_vma (s, &end, 0);
1102 einfo ("%s:%d: warning: syntax error in import/export file\n",
1112 struct export_symbol_list *n;
1114 ldlang_add_undef (symname);
1115 n = ((struct export_symbol_list *)
1116 xmalloc (sizeof (struct export_symbol_list)));
1117 n->next = export_symbols;
1118 n->name = xstrdup (symname);
1123 h = bfd_link_hash_lookup (link_info.hash, symname, FALSE, FALSE,
1125 if (h == NULL || h->type == bfd_link_hash_new)
1127 /* We can just ignore attempts to import an unreferenced
1132 if (!bfd_xcoff_import_symbol (output_bfd, &link_info, h,
1133 address, imppath, impfile,
1134 impmember, syscall_flag))
1135 einfo ("%X%s:%d: failed to import symbol %s: %E\n",
1136 filename, lineno, symname);
1140 obstack_free (o, obstack_base (o));
1143 if (obstack_object_size (o) > 0)
1145 einfo ("%s:%d: warning: ignoring unterminated last line\n",
1147 obstack_free (o, obstack_base (o));
1152 obstack_free (o, NULL);
1157 /* This routine saves us from worrying about declaring free. */
1160 gld${EMULATION_NAME}_free (void *p)
1165 /* This is called by the before_allocation routine via
1166 lang_for_each_statement. It looks for relocations and assignments
1170 gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *s)
1172 if (s->header.type == lang_reloc_statement_enum)
1174 lang_reloc_statement_type *rs;
1176 rs = &s->reloc_statement;
1177 if (rs->name == NULL)
1178 einfo ("%F%P: only relocations against symbols are permitted\n");
1179 if (!bfd_xcoff_link_count_reloc (output_bfd, &link_info, rs->name))
1180 einfo ("%F%P: bfd_xcoff_link_count_reloc failed: %E\n");
1183 if (s->header.type == lang_assignment_statement_enum)
1184 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1187 /* Look through an expression for an assignment statement. */
1190 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1192 struct bfd_link_hash_entry *h;
1194 switch (exp->type.node_class)
1197 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
1198 FALSE, FALSE, FALSE);
1203 if (strcmp (exp->assign.dst, ".") != 0)
1205 if (!bfd_xcoff_record_link_assignment (output_bfd, &link_info,
1207 einfo ("%P%F: failed to record assignment to %s: %E\n",
1210 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1214 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1215 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1219 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1220 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1221 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1225 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1234 gld${EMULATION_NAME}_get_script (int *isfile)
1237 if test -n "$COMPILE_IN"
1239 # Scripts compiled in.
1241 # sed commands to quote an ld script as a C string.
1242 sc="-f ${srcdir}/emultempl/ostring.sed"
1244 cat >>e${EMULATION_NAME}.c <<EOF
1248 if (link_info.relocatable && config.build_constructors)
1251 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1252 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1253 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1254 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1255 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1256 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1257 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1258 echo ' ; else return' >> e${EMULATION_NAME}.c
1259 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1260 echo '; }' >> e${EMULATION_NAME}.c
1263 # Scripts read from the filesystem.
1265 cat >>e${EMULATION_NAME}.c <<EOF
1269 if (link_info.relocatable && config.build_constructors)
1270 return "ldscripts/${EMULATION_NAME}.xu";
1271 else if (link_info.relocatable)
1272 return "ldscripts/${EMULATION_NAME}.xr";
1273 else if (!config.text_read_only)
1274 return "ldscripts/${EMULATION_NAME}.xbn";
1275 else if (!config.magic_demand_paged)
1276 return "ldscripts/${EMULATION_NAME}.xn";
1278 return "ldscripts/${EMULATION_NAME}.x";
1284 cat >>e${EMULATION_NAME}.c <<EOF
1287 gld${EMULATION_NAME}_create_output_section_statements (void)
1290 if ((bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour)
1291 && (link_info.init_function != NULL
1292 || link_info.fini_function != NULL
1295 initfini_file = lang_add_input_file ("initfini",
1296 lang_input_file_is_file_enum,
1299 initfini_file->the_bfd = bfd_create ("initfini", output_bfd);
1300 if (initfini_file->the_bfd == NULL
1301 || ! bfd_set_arch_mach (initfini_file->the_bfd,
1302 bfd_get_arch (output_bfd),
1303 bfd_get_mach (output_bfd)))
1305 einfo ("%X%P: can not create BFD %E\n");
1309 /* Call backend to fill in the rest */
1310 if (! bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd,
1311 link_info.init_function,
1312 link_info.fini_function,
1315 einfo ("%X%P: can not create BFD %E\n");
1319 /* __rtld defined in /lib/librtl.a */
1321 lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL);
1326 gld${EMULATION_NAME}_set_output_arch (void)
1328 bfd_set_arch_mach (output_bfd,
1329 bfd_xcoff_architecture (output_bfd),
1330 bfd_xcoff_machine (output_bfd));
1332 ldfile_output_architecture = bfd_get_arch (output_bfd);
1333 ldfile_output_machine = bfd_get_mach (output_bfd);
1334 ldfile_output_machine_name = bfd_printable_name (output_bfd);
1337 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
1338 gld${EMULATION_NAME}_before_parse,
1341 after_parse_default,
1342 gld${EMULATION_NAME}_after_open,
1343 after_allocation_default,
1344 gld${EMULATION_NAME}_set_output_arch,
1345 gld${EMULATION_NAME}_choose_target,
1346 gld${EMULATION_NAME}_before_allocation,
1347 gld${EMULATION_NAME}_get_script,
1348 "${EMULATION_NAME}",
1351 gld${EMULATION_NAME}_create_output_section_statements,
1352 0, /* open_dynamic_archive */
1353 0, /* place_orphan */
1354 0, /* set_symbols */
1355 gld${EMULATION_NAME}_parse_args,
1356 gld${EMULATION_NAME}_add_options,
1357 gld${EMULATION_NAME}_handle_option,
1358 gld${EMULATION_NAME}_unrecognized_file,
1359 NULL, /* list_options */
1360 NULL, /* recognized_file */
1361 NULL, /* find potential_libraries */
1362 NULL /* new_vers_pattern */