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 (C) 1991-2014 Free Software Foundation, Inc.
13 Written by Steve Chamberlain <sac@cygnus.com>
14 AIX support by Ian Lance Taylor <ian@cygnus.com>
15 AIX 64 bit support by Tom Rix <trix@redhat.com>
17 This file is part of the GNU Binutils.
19 This program is free software; you can redistribute it and/or modify
20 it under the terms of the GNU General Public License as published by
21 the Free Software Foundation; either version 3 of the License, or
22 (at your option) any later version.
24 This program is distributed in the hope that it will be useful,
25 but WITHOUT ANY WARRANTY; without even the implied warranty of
26 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 GNU General Public License for more details.
29 You should have received a copy of the GNU General Public License
30 along with this program; if not, write to the Free Software
31 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
32 MA 02110-1301, 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 /* A mask of XCOFF_EXPALL and XCOFF_EXPFULL flags, as set by their
86 associated -b and -bno options. */
87 static unsigned int auto_export_flags;
89 /* A mask of auto_export_flags bits that were explicitly set on the
91 static unsigned int explicit_auto_export_flags;
93 /* Whether to implement Unix like linker semantics. */
96 /* Structure used to hold import file list. */
100 struct filelist *next;
104 /* List of import files. */
105 static struct filelist *import_files;
107 /* List of export symbols read from the export files. */
109 struct export_symbol_list
111 struct export_symbol_list *next;
115 static struct export_symbol_list *export_symbols;
117 /* Maintains the 32 or 64 bit mode state of import file */
118 static unsigned int symbol_mode = 0x04;
120 /* Which symbol modes are valid */
121 static unsigned int symbol_mode_mask = 0x0d;
123 /* Whether this is a 64 bit link */
124 static int is_64bit = 0;
126 /* Which syscalls from import file are valid */
127 static unsigned int syscall_mask = 0x77;
129 /* fake file for -binitfini support */
130 static lang_input_statement_type *initfini_file;
132 /* Whether to do run time linking
133 -brtl enables, -bnortl and -bnortllib disable. */
136 /* Explicit command line library path, -blibpath */
137 static char *command_line_blibpath = NULL;
139 /* This routine is called before anything else is done. */
142 gld${EMULATION_NAME}_before_parse (void)
144 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
146 input_flags.dynamic = TRUE;
147 config.has_shared = TRUE;
149 /* The link_info.[init|fini]_functions are initialized in ld/lexsup.c.
150 Override them here so we can use the link_info.init_function as a
151 state flag that lets the backend know that -binitfini has been done. */
153 link_info.init_function = NULL;
154 link_info.fini_function = NULL;
157 /* Handle AIX specific options. */
189 gld${EMULATION_NAME}_add_options
190 (int ns, char **shortopts, int nl, struct option **longopts,
191 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
193 static const char xtra_short[] = "D:H:KT:z";
194 static const struct option xtra_long[] = {
195 /* -binitfini has special handling in the linker backend. The native linker
196 uses the arguemnts to generate a table of init and fini functions for
197 the executable. The important use for this option is to support aix 4.2+
198 c++ constructors and destructors. This is tied into gcc via collect2.c.
200 The function table is accessed by the runtime linker/loader by checking if
201 the first symbol in the loader symbol table is __rtinit. The gnu linker
202 generates this symbol and makes it the first loader symbol. */
204 {"basis", no_argument, NULL, OPTION_IGNORE},
205 {"bautoimp", no_argument, NULL, OPTION_AUTOIMP},
206 {"bcomprld", no_argument, NULL, OPTION_IGNORE},
207 {"bcrld", no_argument, NULL, OPTION_IGNORE},
208 {"bcror31", no_argument, NULL, OPTION_IGNORE},
209 {"bD", required_argument, NULL, OPTION_MAXDATA},
210 {"bE", required_argument, NULL, OPTION_EXPORT},
211 {"bernotok", no_argument, NULL, OPTION_ERNOTOK},
212 {"berok", no_argument, NULL, OPTION_EROK},
213 {"berrmsg", no_argument, NULL, OPTION_IGNORE},
214 {"bexpall", no_argument, NULL, OPTION_EXPALL},
215 {"bexpfull", no_argument, NULL, OPTION_EXPFULL},
216 {"bexport", required_argument, NULL, OPTION_EXPORT},
217 {"bbigtoc", no_argument, NULL, OPTION_IGNORE},
218 {"bf", no_argument, NULL, OPTION_ERNOTOK},
219 {"bgc", no_argument, &gc, 1},
220 {"bh", required_argument, NULL, OPTION_IGNORE},
221 {"bhalt", required_argument, NULL, OPTION_IGNORE},
222 {"bI", required_argument, NULL, OPTION_IMPORT},
223 {"bimport", required_argument, NULL, OPTION_IMPORT},
224 {"binitfini", required_argument, NULL, OPTION_INITFINI},
225 {"bl", required_argument, NULL, OPTION_LOADMAP},
226 {"bloadmap", required_argument, NULL, OPTION_LOADMAP},
227 {"bmaxdata", required_argument, NULL, OPTION_MAXDATA},
228 {"bmaxstack", required_argument, NULL, OPTION_MAXSTACK},
229 {"bM", required_argument, NULL, OPTION_MODTYPE},
230 {"bmodtype", required_argument, NULL, OPTION_MODTYPE},
231 {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP},
232 {"bnoexpall", no_argument, NULL, OPTION_NOEXPALL},
233 {"bnoexpfull", no_argument, NULL, OPTION_NOEXPFULL},
234 {"bnodelcsect", no_argument, NULL, OPTION_IGNORE},
235 {"bnoentry", no_argument, NULL, OPTION_IGNORE},
236 {"bnogc", no_argument, &gc, 0},
237 {"bnso", no_argument, NULL, OPTION_NOAUTOIMP},
238 {"bnostrcmpct", no_argument, NULL, OPTION_NOSTRCMPCT},
239 {"bnotextro", no_argument, &textro, 0},
240 {"bnro", no_argument, &textro, 0},
241 {"bpD", required_argument, NULL, OPTION_PD},
242 {"bpT", required_argument, NULL, OPTION_PT},
243 {"bro", no_argument, &textro, 1},
244 {"brtl", no_argument, &rtld, 1},
245 {"bnortl", no_argument, &rtld, 0},
246 {"bnortllib", no_argument, &rtld, 0},
247 {"bS", required_argument, NULL, OPTION_MAXSTACK},
248 {"bso", no_argument, NULL, OPTION_AUTOIMP},
249 {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT},
250 {"btextro", no_argument, &textro, 1},
251 {"b32", no_argument, NULL, OPTION_32},
252 {"b64", no_argument, NULL, OPTION_64},
253 {"static", no_argument, NULL, OPTION_NOAUTOIMP},
254 {"unix", no_argument, NULL, OPTION_UNIX},
255 {"blibpath", required_argument, NULL, OPTION_LIBPATH},
256 {"bnolibpath", required_argument, NULL, OPTION_NOLIBPATH},
257 {NULL, no_argument, NULL, 0}
260 /* Options supported by the AIX linker which we do not support:
261 -S, -v, -Z, -bbindcmds, -bbinder, -bbindopts, -bcalls, -bcaps,
262 -bcror15, -bdebugopt, -bdbg, -bdelcsect, -bex?, -bfilelist, -bfl,
263 -bgcbypass, -bglink, -binsert, -bi, -bloadmap, -bl, -bmap, -bnl,
264 -bnobind, -bnocomprld, -bnocrld, -bnoerrmsg, -bnoglink,
265 -bnoloadmap, -bnl, -bnoobjreorder, -bnoquiet, -bnoreorder,
266 -bnotypchk, -bnox, -bquiet, -bR, -brename, -breorder, -btypchk,
269 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
270 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
271 *longopts = xrealloc (*longopts,
272 nl * sizeof (struct option) + sizeof (xtra_long));
273 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
277 gld${EMULATION_NAME}_parse_args (int argc, char **argv)
281 /* If the current option starts with -b, change the first : to an =.
282 The AIX linker uses : to separate the option from the argument;
283 changing it to = lets us treat it as a getopt option. */
288 if (indx < argc && CONST_STRNEQ (argv[indx], "-b"))
292 for (s = argv[indx]; *s != '\0'; s++)
304 /* Helper for option '-f', which specify a list of input files.
305 Contrary to the native linker, we don't support shell patterns
306 (simply because glob isn't always available). */
309 read_file_list (const char *filename)
312 /* An upper bound on the number of characters in the file. */
314 /* File in memory. */
320 f = fopen (filename, FOPEN_RT);
323 einfo ("%F%P: cannot open %s\n", filename);
326 if (fseek (f, 0L, SEEK_END) == -1)
331 if (fseek (f, 0L, SEEK_SET) == -1)
334 buffer = (char *) xmalloc (pos + 1);
335 len = fread (buffer, sizeof (char), pos, f);
336 if (len != (size_t) pos && ferror (f))
338 /* Add a NUL terminator. */
346 /* Skip empty lines. */
347 while (*b == '\n' || *b == '\r')
350 /* Stop if end of buffer. */
351 if (b == buffer + len)
354 /* Eat any byte until end of line. */
355 for (e = b; *e != '\0'; e++)
356 if (*e == '\n' || *e == '\r')
359 /* Replace end of line by nul. */
364 lang_add_input_file (b, lang_input_file_is_search_file_enum, NULL);
370 einfo ("%F%P: cannot read %s\n", optarg);
375 gld${EMULATION_NAME}_handle_option (int optc)
386 /* Long option which just sets a flag. */
390 /* This overrides --auxiliary. This option specifies a file containing
391 a list of input files. */
392 read_file_list (optarg);
396 val = bfd_scan_vma (optarg, &end, 0);
398 einfo ("%P: warning: ignoring invalid -D number %s\n", optarg);
400 lang_section_start (".data", exp_intop (val), NULL);
404 val = bfd_scan_vma (optarg, &end, 0);
405 if (*end != '\0' || (val & (val - 1)) != 0)
406 einfo ("%P: warning: ignoring invalid -H number %s\n", optarg);
413 /* FIXME: This should use the page size for the target system. */
418 /* On AIX this is the same as GNU ld -Ttext. When we see -T
419 number, we assume the AIX option is intended. Otherwise, we
420 assume the usual GNU ld -T option is intended. We can't just
421 ignore the AIX option, because gcc passes it to the linker. */
422 val = bfd_scan_vma (optarg, &end, 0);
425 lang_section_start (".text", exp_intop (val), NULL);
431 case OPTION_INITFINI:
434 * The aix linker init fini has the format :
436 * -binitfini:[ Initial][:Termination][:Priority]
438 * it allows the Termination and Priority to be optional.
440 * Since we support only one init/fini pair, we ignore the Priority.
442 * Define the special symbol __rtinit.
444 * strtok does not correctly handle the case of -binitfini::fini: so
450 while (*t && ':' != *t)
456 link_info.init_function = i;
459 while (*t && ':' != *t)
464 link_info.fini_function = f;
469 link_info.static_link = FALSE;
473 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
474 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
478 link_info.unresolved_syms_in_objects = RM_IGNORE;
479 link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
483 auto_export_flags |= XCOFF_EXPALL;
484 explicit_auto_export_flags |= XCOFF_EXPALL;
488 auto_export_flags |= XCOFF_EXPFULL;
489 explicit_auto_export_flags |= XCOFF_EXPFULL;
493 gld${EMULATION_NAME}_read_file (optarg, FALSE);
499 struct filelist **flpp;
501 n = (struct filelist *) xmalloc (sizeof (struct filelist));
504 flpp = &import_files;
505 while (*flpp != NULL)
506 flpp = &(*flpp)->next;
512 config.map_filename = optarg;
516 val = bfd_scan_vma (optarg, &end, 0);
518 einfo ("%P: warning: ignoring invalid -bmaxdata number %s\n", optarg);
523 case OPTION_MAXSTACK:
524 val = bfd_scan_vma (optarg, &end, 0);
526 einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n",
535 link_info.shared = TRUE;
538 if (*optarg == '\0' || optarg[1] == '\0')
539 einfo ("%P: warning: ignoring invalid module type %s\n", optarg);
541 modtype = (*optarg << 8) | optarg[1];
544 case OPTION_NOAUTOIMP:
545 link_info.static_link = TRUE;
548 case OPTION_NOEXPALL:
549 auto_export_flags &= ~XCOFF_EXPALL;
550 explicit_auto_export_flags |= XCOFF_EXPALL;
553 case OPTION_NOEXPFULL:
554 auto_export_flags &= ~XCOFF_EXPFULL;
555 explicit_auto_export_flags |= XCOFF_EXPFULL;
558 case OPTION_NOSTRCMPCT:
559 link_info.traditional_format = TRUE;
563 /* This sets the page that the .data section is supposed to
564 start on. The offset within the page should still be the
565 offset within the file, so we need to build an appropriate
567 val = bfd_scan_vma (optarg, &end, 0);
569 einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg);
577 exp_nameop (NAME, "."),
580 exp_binop ('+', t, exp_intop (31)),
581 exp_intop (~(bfd_vma) 31));
582 lang_section_start (".data", t, NULL);
587 /* This set the page that the .text section is supposed to start
588 on. The offset within the page should still be the offset
590 val = bfd_scan_vma (optarg, &end, 0);
592 einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg);
599 exp_nameop (SIZEOF_HEADERS, NULL));
601 exp_binop ('+', t, exp_intop (31)),
602 exp_intop (~(bfd_vma) 31));
603 lang_section_start (".text", t, NULL);
607 case OPTION_STRCMPCT:
608 link_info.traditional_format = FALSE;
618 symbol_mode_mask = 0x0d;
624 symbol_mode_mask = 0x0e;
628 command_line_blibpath = optarg;
631 case OPTION_NOLIBPATH:
632 command_line_blibpath = NULL;
640 /* This is called when an input file can not be recognized as a BFD
641 object or an archive. If the file starts with #!, we must treat it
642 as an import file. This is for AIX compatibility. */
645 gld${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry)
650 e = fopen (entry->filename, FOPEN_RT);
656 if (getc (e) == '#' && getc (e) == '!')
659 struct filelist **flpp;
661 n = (struct filelist *) xmalloc (sizeof (struct filelist));
663 n->name = entry->filename;
664 flpp = &import_files;
665 while (*flpp != NULL)
666 flpp = &(*flpp)->next;
670 entry->flags.loaded = TRUE;
678 /* This is called after the input files have been opened. */
681 gld${EMULATION_NAME}_after_open (void)
686 after_open_default ();
688 /* Call ldctor_build_sets, after pretending that this is a
689 relocatable link. We do this because AIX requires relocation
690 entries for all references to symbols, even in a final
691 executable. Of course, we only want to do this if we are
692 producing an XCOFF output file. */
693 r = link_info.relocatable;
694 if (strstr (bfd_get_target (link_info.output_bfd), "xcoff") != NULL)
695 link_info.relocatable = TRUE;
696 ldctor_build_sets ();
697 link_info.relocatable = r;
699 /* For each set, record the size, so that the XCOFF backend can
700 output the correct csect length. */
701 for (p = sets; p != (struct set_info *) NULL; p = p->next)
705 /* If the symbol is defined, we may have been invoked from
706 collect, and the sets may already have been built, so we do
708 if (p->h->type == bfd_link_hash_defined
709 || p->h->type == bfd_link_hash_defweak)
712 if (p->reloc != BFD_RELOC_CTOR)
714 /* Handle this if we need to. */
718 size = (p->count + 2) * 4;
719 if (!bfd_xcoff_link_record_set (link_info.output_bfd, &link_info,
721 einfo ("%F%P: bfd_xcoff_link_record_set failed: %E\n");
725 /* This is called after the sections have been attached to output
726 sections, but before any sizes or addresses have been set. */
729 gld${EMULATION_NAME}_before_allocation (void)
732 struct export_symbol_list *el;
734 asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
735 static const char *const must_keep_sections[] = {
740 unsigned int i, flags;
742 /* Handle the import and export files, if any. */
743 for (fl = import_files; fl != NULL; fl = fl->next)
744 gld${EMULATION_NAME}_read_file (fl->name, TRUE);
745 for (el = export_symbols; el != NULL; el = el->next)
747 struct bfd_link_hash_entry *h;
749 h = bfd_link_hash_lookup (link_info.hash, el->name, FALSE, FALSE, FALSE);
751 einfo ("%P%F: bfd_link_hash_lookup of export symbol failed: %E\n");
752 if (!bfd_xcoff_export_symbol (link_info.output_bfd, &link_info, h))
753 einfo ("%P%F: bfd_xcoff_export_symbol failed: %E\n");
756 /* Track down all relocations called for by the linker script (these
757 are typically constructor/destructor entries created by
758 CONSTRUCTORS) and let the backend know it will need to create
759 .loader relocs for them. */
760 lang_for_each_statement (gld${EMULATION_NAME}_find_relocs);
762 /* Precedence of LIBPATH
763 -blibpath: native support always first
764 -rpath: gnu extension
765 -L build from command line -L's */
766 if (command_line_blibpath != NULL)
767 libpath = command_line_blibpath;
768 else if (command_line.rpath != NULL)
769 libpath = command_line.rpath;
770 else if (search_head == NULL)
771 libpath = (char *) "";
775 search_dirs_type *search;
777 /* PR ld/4023: Strip sysroot prefix from any paths
778 being inserted into the output binary's DT_RPATH. */
779 if (ld_sysroot != NULL
780 && * ld_sysroot != 0)
782 const char * name = search_head->name;
783 size_t ld_sysroot_len = strlen (ld_sysroot);
785 if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0)
786 name += ld_sysroot_len;
789 libpath = xmalloc (len + 1);
790 strcpy (libpath, name);
792 for (search = search_head->next; search != NULL; search = search->next)
797 if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0)
798 name += ld_sysroot_len;
800 nlen = strlen (name);
801 libpath = xrealloc (libpath, len + nlen + 2);
803 strcpy (libpath + len + 1, name);
809 len = strlen (search_head->name);
810 libpath = xmalloc (len + 1);
811 strcpy (libpath, search_head->name);
813 for (search = search_head->next; search != NULL; search = search->next)
817 nlen = strlen (search->name);
818 libpath = xrealloc (libpath, len + nlen + 2);
820 strcpy (libpath + len + 1, search->name);
826 /* Default to -bexpfull for SVR4-like semantics. */
827 flags = (unix_ld ? XCOFF_EXPFULL : 0);
828 flags &= ~explicit_auto_export_flags;
829 flags |= auto_export_flags;
831 /* Let the XCOFF backend set up the .loader section. */
832 if (!bfd_xcoff_size_dynamic_sections
833 (link_info.output_bfd, &link_info, libpath, entry_symbol.name, file_align,
834 maxstack, maxdata, gc && !unix_ld ? TRUE : FALSE,
835 modtype, textro ? TRUE : FALSE, flags, special_sections,
836 rtld ? TRUE : FALSE))
837 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
839 /* Look through the special sections, and put them in the right
840 place in the link ordering. This is especially magic. */
841 for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
844 lang_output_section_statement_type *os;
845 lang_statement_union_type **pls;
846 lang_input_section_type *is;
850 sec = special_sections[i];
854 /* Remove this section from the list of the output section.
855 This assumes we know what the script looks like. */
857 os = lang_output_section_get (sec->output_section);
859 einfo ("%P%F: can't find output section %s\n",
860 sec->output_section->name);
862 for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->header.next)
864 if ((*pls)->header.type == lang_input_section_enum
865 && (*pls)->input_section.section == sec)
867 is = (lang_input_section_type *) * pls;
868 *pls = (*pls)->header.next;
872 if ((*pls)->header.type == lang_wild_statement_enum)
874 lang_statement_union_type **pwls;
876 for (pwls = &(*pls)->wild_statement.children.head;
877 *pwls != NULL; pwls = &(*pwls)->header.next)
880 if ((*pwls)->header.type == lang_input_section_enum
881 && (*pwls)->input_section.section == sec)
883 is = (lang_input_section_type *) * pwls;
884 *pwls = (*pwls)->header.next;
896 einfo ("%P%F: can't find %s in output section\n",
897 bfd_get_section_name (sec->owner, sec));
900 /* Now figure out where the section should go. */
904 default: /* to avoid warnings */
905 case XCOFF_SPECIAL_SECTION_TEXT:
911 case XCOFF_SPECIAL_SECTION_ETEXT:
917 case XCOFF_SPECIAL_SECTION_DATA:
923 case XCOFF_SPECIAL_SECTION_EDATA:
929 case XCOFF_SPECIAL_SECTION_END:
930 case XCOFF_SPECIAL_SECTION_END2:
937 os = lang_output_section_find (oname);
941 is->header.next = os->children.head;
942 os->children.head = (lang_statement_union_type *) is;
946 is->header.next = NULL;
947 lang_statement_append (&os->children,
948 (lang_statement_union_type *) is,
953 /* Executables and shared objects must always have .text, .data
954 and .bss output sections, so that the header can refer to them.
955 The kernel refuses to load objects that have missing sections. */
956 if (!link_info.relocatable)
957 for (i = 0; i < ARRAY_SIZE (must_keep_sections); i++)
961 sec = bfd_get_section_by_name (link_info.output_bfd,
962 must_keep_sections[i]);
964 einfo ("%P: can't find required output section %s\n", must_keep_sections[i]);
966 sec->flags |= SEC_KEEP;
969 before_allocation_default ();
973 gld${EMULATION_NAME}_choose_target (int argc, char **argv)
976 static char *from_outside;
977 static char *from_inside;
978 static char *argv_to_target[][2] = {
979 {NULL, "${OUTPUT_FORMAT}"},
980 {"-b32", "${OUTPUT_FORMAT_32BIT}"},
981 {"-b64", "${OUTPUT_FORMAT_64BIT}"},
986 from_outside = getenv (TARGET_ENVIRON);
987 if (from_outside != (char *) NULL)
990 /* Set to default. */
991 from_inside = argv_to_target[0][1];
992 for (i = 1; i < argc; i++)
994 for (j = 1; j < jmax; j++)
996 if (0 == strcmp (argv[i], argv_to_target[j][0]))
997 from_inside = argv_to_target[j][1];
1008 change_symbol_mode (char *input)
1010 char *symbol_mode_string[] = {
1013 "# no32", /* 0x04 */
1014 "# no64", /* 0x08 */
1021 for (bit = 0;; bit++)
1023 string = symbol_mode_string[bit];
1027 if (0 == strcmp (input, string))
1029 symbol_mode = (1 << bit);
1033 /* should not be here */
1040 -1 : error, try something else */
1042 is_syscall (char *input, unsigned int *flag)
1048 char *syscall_string;
1051 { "svc" /* 0x01 */, XCOFF_SYSCALL32 },
1052 { "svc32" /* 0x02 */, XCOFF_SYSCALL32 },
1053 { "svc3264" /* 0x04 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
1054 { "svc64" /* 0x08 */, XCOFF_SYSCALL64 },
1055 { "syscall" /* 0x10 */, XCOFF_SYSCALL32 },
1056 { "syscall32" /* 0x20 */, XCOFF_SYSCALL32 },
1057 { "syscall3264" /* 0x40 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
1058 { "syscall64" /* 0x80 */, XCOFF_SYSCALL64 },
1064 for (bit = 0;; bit++)
1066 string = s[bit].syscall_string;
1070 if (0 == strcmp (input, string))
1072 if (1 << bit & syscall_mask)
1074 *flag = s[bit].flag;
1083 /* should not be here */
1087 /* Read an import or export file. For an import file, this is called
1088 by the before_allocation emulation routine. For an export file,
1089 this is called by the handle_option emulation routine. */
1092 gld${EMULATION_NAME}_read_file (const char *filename, bfd_boolean import)
1099 const char *imppath;
1100 const char *impfile;
1101 const char *impmember;
1103 o = (struct obstack *) xmalloc (sizeof (struct obstack));
1104 obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
1106 f = fopen (filename, FOPEN_RT);
1109 bfd_set_error (bfd_error_system_call);
1110 einfo ("%F%s: %E\n", filename);
1122 /* Default to 32 and 64 bit mode
1123 symbols at top of /lib/syscalls.exp do not have a mode modifier and they
1124 are not repeated, assume 64 bit routines also want to use them.
1125 See the routine change_symbol_mode for more information. */
1129 while ((c = getc (f)) != EOF)
1133 unsigned int syscall_flag = 0;
1135 struct bfd_link_hash_entry *h;
1139 obstack_1grow (o, c);
1143 obstack_1grow (o, '\0');
1146 s = (char *) obstack_base (o);
1147 while (ISSPACE (*s))
1151 || change_symbol_mode (s)
1152 || (*s == '#' && s[1] == ' ')
1153 || (!import && *s == '#' && s[1] == '!'))
1155 obstack_free (o, obstack_base (o));
1159 if (*s == '#' && s[1] == '!')
1162 while (ISSPACE (*s))
1169 obstack_free (o, obstack_base (o));
1172 einfo ("%F%s%d: #! ([member]) is not supported in import files\n",
1179 (void) obstack_finish (o);
1182 while (!ISSPACE (*s) && *s != '(' && *s != '\0')
1186 if (!bfd_xcoff_split_import_path (link_info.output_bfd,
1187 start, &imppath, &impfile))
1188 einfo ("%F%P: Could not parse import path: %E\n");
1189 while (ISSPACE (cs))
1198 einfo ("%s:%d: warning: syntax error in import file\n",
1205 while (*s != ')' && *s != '\0')
1210 einfo ("%s:%d: warning: syntax error in import file\n",
1218 if (symbol_mode & symbol_mode_mask)
1220 /* This is a symbol to be imported or exported. */
1223 address = (bfd_vma) -1;
1225 while (!ISSPACE (*s) && *s != '\0')
1233 while (ISSPACE (*s))
1237 while (!ISSPACE (*se) && *se != '\0')
1242 while (ISSPACE (*se))
1245 einfo ("%s%d: warning: syntax error in import/export file\n",
1254 status = is_syscall (s, &syscall_flag);
1258 /* not a system call, check for address */
1259 address = bfd_scan_vma (s, &end, 0);
1262 einfo ("%s:%d: warning: syntax error in import/export file\n",
1272 struct export_symbol_list *n;
1274 ldlang_add_undef (symname, TRUE);
1275 n = ((struct export_symbol_list *)
1276 xmalloc (sizeof (struct export_symbol_list)));
1277 n->next = export_symbols;
1278 n->name = xstrdup (symname);
1283 h = bfd_link_hash_lookup (link_info.hash, symname, FALSE, FALSE,
1285 if (h == NULL || h->type == bfd_link_hash_new)
1287 /* We can just ignore attempts to import an unreferenced
1292 if (!bfd_xcoff_import_symbol (link_info.output_bfd,
1294 address, imppath, impfile,
1295 impmember, syscall_flag))
1296 einfo ("%X%s:%d: failed to import symbol %s: %E\n",
1297 filename, lineno, symname);
1301 obstack_free (o, obstack_base (o));
1304 if (obstack_object_size (o) > 0)
1306 einfo ("%s:%d: warning: ignoring unterminated last line\n",
1308 obstack_free (o, obstack_base (o));
1313 obstack_free (o, NULL);
1320 /* This routine saves us from worrying about declaring free. */
1323 gld${EMULATION_NAME}_free (void *p)
1328 /* This is called by the before_allocation routine via
1329 lang_for_each_statement. It looks for relocations and assignments
1333 gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *s)
1335 if (s->header.type == lang_reloc_statement_enum)
1337 lang_reloc_statement_type *rs;
1339 rs = &s->reloc_statement;
1340 if (rs->name == NULL)
1341 einfo ("%F%P: only relocations against symbols are permitted\n");
1342 if (!bfd_xcoff_link_count_reloc (link_info.output_bfd, &link_info,
1344 einfo ("%F%P: bfd_xcoff_link_count_reloc failed: %E\n");
1347 if (s->header.type == lang_assignment_statement_enum)
1348 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1351 /* Look through an expression for an assignment statement. */
1354 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1356 struct bfd_link_hash_entry *h;
1358 switch (exp->type.node_class)
1361 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
1362 FALSE, FALSE, FALSE);
1367 if (strcmp (exp->assign.dst, ".") != 0)
1369 if (!bfd_xcoff_record_link_assignment (link_info.output_bfd,
1372 einfo ("%P%F: failed to record assignment to %s: %E\n",
1375 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1379 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1380 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1384 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1385 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1386 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1390 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1399 gld${EMULATION_NAME}_get_script (int *isfile)
1402 if test x"$COMPILE_IN" = xyes
1404 # Scripts compiled in.
1406 # sed commands to quote an ld script as a C string.
1407 sc="-f ${srcdir}/emultempl/ostring.sed"
1413 if (link_info.relocatable && config.build_constructors)
1416 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1417 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1418 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1419 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1420 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1421 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1422 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1423 echo ' ; else return' >> e${EMULATION_NAME}.c
1424 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1425 echo '; }' >> e${EMULATION_NAME}.c
1428 # Scripts read from the filesystem.
1434 if (link_info.relocatable && config.build_constructors)
1435 return "ldscripts/${EMULATION_NAME}.xu";
1436 else if (link_info.relocatable)
1437 return "ldscripts/${EMULATION_NAME}.xr";
1438 else if (!config.text_read_only)
1439 return "ldscripts/${EMULATION_NAME}.xbn";
1440 else if (!config.magic_demand_paged)
1441 return "ldscripts/${EMULATION_NAME}.xn";
1443 return "ldscripts/${EMULATION_NAME}.x";
1452 gld${EMULATION_NAME}_create_output_section_statements (void)
1455 if ((bfd_get_flavour (link_info.output_bfd) == bfd_target_xcoff_flavour)
1456 && (link_info.init_function != NULL
1457 || link_info.fini_function != NULL
1460 initfini_file = lang_add_input_file ("initfini",
1461 lang_input_file_is_file_enum,
1464 initfini_file->the_bfd = bfd_create ("initfini", link_info.output_bfd);
1465 if (initfini_file->the_bfd == NULL
1466 || ! bfd_set_arch_mach (initfini_file->the_bfd,
1467 bfd_get_arch (link_info.output_bfd),
1468 bfd_get_mach (link_info.output_bfd)))
1470 einfo ("%X%P: can not create BFD %E\n");
1474 /* Call backend to fill in the rest */
1475 if (! bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd,
1476 link_info.init_function,
1477 link_info.fini_function,
1480 einfo ("%X%P: can not create BFD %E\n");
1484 /* __rtld defined in /lib/librtl.a */
1486 lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL);
1491 gld${EMULATION_NAME}_set_output_arch (void)
1493 bfd_set_arch_mach (link_info.output_bfd,
1494 bfd_xcoff_architecture (link_info.output_bfd),
1495 bfd_xcoff_machine (link_info.output_bfd));
1497 ldfile_output_architecture = bfd_get_arch (link_info.output_bfd);
1498 ldfile_output_machine = bfd_get_mach (link_info.output_bfd);
1499 ldfile_output_machine_name = bfd_printable_name (link_info.output_bfd);
1503 gld${EMULATION_NAME}_open_dynamic_archive (const char *arch,
1504 search_dirs_type *search,
1505 lang_input_statement_type *entry)
1509 if (!entry->flags.maybe_archive)
1512 if (entry->flags.full_name_provided)
1513 path = concat (search->name, "/", entry->filename,
1514 (const char *) NULL);
1516 path = concat (search->name, "/lib", entry->filename, arch, ".a",
1517 (const char *) NULL);
1519 if (!ldfile_try_open_bfd (path, entry))
1524 /* Don't include the searched directory in the import path. */
1525 bfd_xcoff_set_archive_import_path (&link_info, entry->the_bfd,
1526 path + strlen (search->name) + 1);
1527 entry->filename = path;
1531 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
1532 gld${EMULATION_NAME}_before_parse,
1535 after_parse_default,
1536 gld${EMULATION_NAME}_after_open,
1537 after_allocation_default,
1538 gld${EMULATION_NAME}_set_output_arch,
1539 gld${EMULATION_NAME}_choose_target,
1540 gld${EMULATION_NAME}_before_allocation,
1541 gld${EMULATION_NAME}_get_script,
1542 "${EMULATION_NAME}",
1545 gld${EMULATION_NAME}_create_output_section_statements,
1546 gld${EMULATION_NAME}_open_dynamic_archive,
1547 0, /* place_orphan */
1548 0, /* set_symbols */
1549 gld${EMULATION_NAME}_parse_args,
1550 gld${EMULATION_NAME}_add_options,
1551 gld${EMULATION_NAME}_handle_option,
1552 gld${EMULATION_NAME}_unrecognized_file,
1553 NULL, /* list_options */
1554 NULL, /* recognized_file */
1555 NULL, /* find potential_libraries */
1556 NULL /* new_vers_pattern */