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, 2009, 2010
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 {"bbigtoc", no_argument, NULL, OPTION_IGNORE},
220 {"bf", no_argument, NULL, OPTION_ERNOTOK},
221 {"bgc", no_argument, &gc, 1},
222 {"bh", required_argument, NULL, OPTION_IGNORE},
223 {"bhalt", required_argument, NULL, OPTION_IGNORE},
224 {"bI", required_argument, NULL, OPTION_IMPORT},
225 {"bimport", required_argument, NULL, OPTION_IMPORT},
226 {"binitfini", required_argument, NULL, OPTION_INITFINI},
227 {"bl", required_argument, NULL, OPTION_LOADMAP},
228 {"bloadmap", required_argument, NULL, OPTION_LOADMAP},
229 {"bmaxdata", required_argument, NULL, OPTION_MAXDATA},
230 {"bmaxstack", required_argument, NULL, OPTION_MAXSTACK},
231 {"bM", required_argument, NULL, OPTION_MODTYPE},
232 {"bmodtype", required_argument, NULL, OPTION_MODTYPE},
233 {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP},
234 {"bnoexpall", no_argument, NULL, OPTION_NOEXPALL},
235 {"bnoexpfull", no_argument, NULL, OPTION_NOEXPFULL},
236 {"bnodelcsect", no_argument, NULL, OPTION_IGNORE},
237 {"bnoentry", no_argument, NULL, OPTION_IGNORE},
238 {"bnogc", no_argument, &gc, 0},
239 {"bnso", no_argument, NULL, OPTION_NOAUTOIMP},
240 {"bnostrcmpct", no_argument, NULL, OPTION_NOSTRCMPCT},
241 {"bnotextro", no_argument, &textro, 0},
242 {"bnro", no_argument, &textro, 0},
243 {"bpD", required_argument, NULL, OPTION_PD},
244 {"bpT", required_argument, NULL, OPTION_PT},
245 {"bro", no_argument, &textro, 1},
246 {"brtl", no_argument, &rtld, 1},
247 {"bnortl", no_argument, &rtld, 0},
248 {"bnortllib", no_argument, &rtld, 0},
249 {"bS", required_argument, NULL, OPTION_MAXSTACK},
250 {"bso", no_argument, NULL, OPTION_AUTOIMP},
251 {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT},
252 {"btextro", no_argument, &textro, 1},
253 {"b32", no_argument, NULL, OPTION_32},
254 {"b64", no_argument, NULL, OPTION_64},
255 {"static", no_argument, NULL, OPTION_NOAUTOIMP},
256 {"unix", no_argument, NULL, OPTION_UNIX},
257 {"blibpath", required_argument, NULL, OPTION_LIBPATH},
258 {"bnolibpath", required_argument, NULL, OPTION_NOLIBPATH},
259 {NULL, no_argument, NULL, 0}
262 /* Options supported by the AIX linker which we do not support:
263 -S, -v, -Z, -bbindcmds, -bbinder, -bbindopts, -bcalls, -bcaps,
264 -bcror15, -bdebugopt, -bdbg, -bdelcsect, -bex?, -bfilelist, -bfl,
265 -bgcbypass, -bglink, -binsert, -bi, -bloadmap, -bl, -bmap, -bnl,
266 -bnobind, -bnocomprld, -bnocrld, -bnoerrmsg, -bnoglink,
267 -bnoloadmap, -bnl, -bnoobjreorder, -bnoquiet, -bnoreorder,
268 -bnotypchk, -bnox, -bquiet, -bR, -brename, -breorder, -btypchk,
271 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
272 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
273 *longopts = xrealloc (*longopts,
274 nl * sizeof (struct option) + sizeof (xtra_long));
275 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
279 gld${EMULATION_NAME}_parse_args (int argc, char **argv)
283 /* If the current option starts with -b, change the first : to an =.
284 The AIX linker uses : to separate the option from the argument;
285 changing it to = lets us treat it as a getopt option. */
290 if (indx < argc && CONST_STRNEQ (argv[indx], "-b"))
294 for (s = argv[indx]; *s != '\0'; s++)
306 /* Helper for option '-f', which specify a list of input files.
307 Contrary to the native linker, we don't support shell patterns
308 (simply because glob isn't always available). */
311 read_file_list (const char *filename)
314 /* An upper bound on the number of characters in the file. */
316 /* File in memory. */
322 f = fopen (filename, FOPEN_RT);
325 einfo ("%F%P: cannot open %s\n", filename);
328 if (fseek (f, 0L, SEEK_END) == -1)
333 if (fseek (f, 0L, SEEK_SET) == -1)
336 buffer = (char *) xmalloc (pos + 1);
337 len = fread (buffer, sizeof (char), pos, f);
338 if (len != (size_t) pos && ferror (f))
340 /* Add a NUL terminator. */
348 /* Skip empty lines. */
349 while (*b == '\n' || *b == '\r')
352 /* Stop if end of buffer. */
353 if (b == buffer + len)
356 /* Eat any byte until end of line. */
357 for (e = b; *e != '\0'; e++)
358 if (*e == '\n' || *e == '\r')
361 /* Replace end of line by nul. */
366 lang_add_input_file (b, lang_input_file_is_search_file_enum, NULL);
372 einfo ("%F%P: cannot read %s\n", optarg);
377 gld${EMULATION_NAME}_handle_option (int optc)
388 /* Long option which just sets a flag. */
392 /* This overrides --auxiliary. This option specifies a file containing
393 a list of input files. */
394 read_file_list (optarg);
398 val = bfd_scan_vma (optarg, &end, 0);
400 einfo ("%P: warning: ignoring invalid -D number %s\n", optarg);
402 lang_section_start (".data", exp_intop (val), NULL);
406 val = bfd_scan_vma (optarg, &end, 0);
407 if (*end != '\0' || (val & (val - 1)) != 0)
408 einfo ("%P: warning: ignoring invalid -H number %s\n", optarg);
415 /* FIXME: This should use the page size for the target system. */
420 /* On AIX this is the same as GNU ld -Ttext. When we see -T
421 number, we assume the AIX option is intended. Otherwise, we
422 assume the usual GNU ld -T option is intended. We can't just
423 ignore the AIX option, because gcc passes it to the linker. */
424 val = bfd_scan_vma (optarg, &end, 0);
427 lang_section_start (".text", exp_intop (val), NULL);
433 case OPTION_INITFINI:
436 * The aix linker init fini has the format :
438 * -binitfini:[ Initial][:Termination][:Priority]
440 * it allows the Termination and Priority to be optional.
442 * Since we support only one init/fini pair, we ignore the Priority.
444 * Define the special symbol __rtinit.
446 * strtok does not correctly handle the case of -binitfini::fini: so
452 while (*t && ':' != *t)
458 link_info.init_function = i;
461 while (*t && ':' != *t)
466 link_info.fini_function = f;
471 link_info.static_link = FALSE;
475 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
476 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
480 link_info.unresolved_syms_in_objects = RM_IGNORE;
481 link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
485 auto_export_flags |= XCOFF_EXPALL;
486 explicit_auto_export_flags |= XCOFF_EXPALL;
490 auto_export_flags |= XCOFF_EXPFULL;
491 explicit_auto_export_flags |= XCOFF_EXPFULL;
495 gld${EMULATION_NAME}_read_file (optarg, FALSE);
501 struct filelist **flpp;
503 n = (struct filelist *) xmalloc (sizeof (struct filelist));
506 flpp = &import_files;
507 while (*flpp != NULL)
508 flpp = &(*flpp)->next;
514 config.map_filename = optarg;
518 val = bfd_scan_vma (optarg, &end, 0);
520 einfo ("%P: warning: ignoring invalid -bmaxdata number %s\n", optarg);
525 case OPTION_MAXSTACK:
526 val = bfd_scan_vma (optarg, &end, 0);
528 einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n",
537 link_info.shared = TRUE;
540 if (*optarg == '\0' || optarg[1] == '\0')
541 einfo ("%P: warning: ignoring invalid module type %s\n", optarg);
543 modtype = (*optarg << 8) | optarg[1];
546 case OPTION_NOAUTOIMP:
547 link_info.static_link = TRUE;
550 case OPTION_NOEXPALL:
551 auto_export_flags &= ~XCOFF_EXPALL;
552 explicit_auto_export_flags |= XCOFF_EXPALL;
555 case OPTION_NOEXPFULL:
556 auto_export_flags &= ~XCOFF_EXPFULL;
557 explicit_auto_export_flags |= XCOFF_EXPFULL;
560 case OPTION_NOSTRCMPCT:
561 link_info.traditional_format = TRUE;
565 /* This sets the page that the .data section is supposed to
566 start on. The offset within the page should still be the
567 offset within the file, so we need to build an appropriate
569 val = bfd_scan_vma (optarg, &end, 0);
571 einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg);
579 exp_nameop (NAME, "."),
582 exp_binop ('+', t, exp_intop (31)),
583 exp_intop (~(bfd_vma) 31));
584 lang_section_start (".data", t, NULL);
589 /* This set the page that the .text section is supposed to start
590 on. The offset within the page should still be the offset
592 val = bfd_scan_vma (optarg, &end, 0);
594 einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg);
601 exp_nameop (SIZEOF_HEADERS, NULL));
603 exp_binop ('+', t, exp_intop (31)),
604 exp_intop (~(bfd_vma) 31));
605 lang_section_start (".text", t, NULL);
609 case OPTION_STRCMPCT:
610 link_info.traditional_format = FALSE;
620 symbol_mode_mask = 0x0d;
626 symbol_mode_mask = 0x0e;
630 command_line_blibpath = optarg;
633 case OPTION_NOLIBPATH:
634 command_line_blibpath = NULL;
642 /* This is called when an input file can not be recognized as a BFD
643 object or an archive. If the file starts with #!, we must treat it
644 as an import file. This is for AIX compatibility. */
647 gld${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry)
652 e = fopen (entry->filename, FOPEN_RT);
658 if (getc (e) == '#' && getc (e) == '!')
661 struct filelist **flpp;
663 n = (struct filelist *) xmalloc (sizeof (struct filelist));
665 n->name = entry->filename;
666 flpp = &import_files;
667 while (*flpp != NULL)
668 flpp = &(*flpp)->next;
672 entry->loaded = TRUE;
680 /* This is called after the input files have been opened. */
683 gld${EMULATION_NAME}_after_open (void)
688 after_open_default ();
690 /* Call ldctor_build_sets, after pretending that this is a
691 relocatable link. We do this because AIX requires relocation
692 entries for all references to symbols, even in a final
693 executable. Of course, we only want to do this if we are
694 producing an XCOFF output file. */
695 r = link_info.relocatable;
696 if (strstr (bfd_get_target (link_info.output_bfd), "xcoff") != NULL)
697 link_info.relocatable = TRUE;
698 ldctor_build_sets ();
699 link_info.relocatable = r;
701 /* For each set, record the size, so that the XCOFF backend can
702 output the correct csect length. */
703 for (p = sets; p != (struct set_info *) NULL; p = p->next)
707 /* If the symbol is defined, we may have been invoked from
708 collect, and the sets may already have been built, so we do
710 if (p->h->type == bfd_link_hash_defined
711 || p->h->type == bfd_link_hash_defweak)
714 if (p->reloc != BFD_RELOC_CTOR)
716 /* Handle this if we need to. */
720 size = (p->count + 2) * 4;
721 if (!bfd_xcoff_link_record_set (link_info.output_bfd, &link_info,
723 einfo ("%F%P: bfd_xcoff_link_record_set failed: %E\n");
727 /* This is called after the sections have been attached to output
728 sections, but before any sizes or addresses have been set. */
731 gld${EMULATION_NAME}_before_allocation (void)
734 struct export_symbol_list *el;
736 asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
737 static const char *const must_keep_sections[] = {
742 unsigned int i, flags;
744 /* Handle the import and export files, if any. */
745 for (fl = import_files; fl != NULL; fl = fl->next)
746 gld${EMULATION_NAME}_read_file (fl->name, TRUE);
747 for (el = export_symbols; el != NULL; el = el->next)
749 struct bfd_link_hash_entry *h;
751 h = bfd_link_hash_lookup (link_info.hash, el->name, FALSE, FALSE, FALSE);
753 einfo ("%P%F: bfd_link_hash_lookup of export symbol failed: %E\n");
754 if (!bfd_xcoff_export_symbol (link_info.output_bfd, &link_info, h))
755 einfo ("%P%F: bfd_xcoff_export_symbol failed: %E\n");
758 /* Track down all relocations called for by the linker script (these
759 are typically constructor/destructor entries created by
760 CONSTRUCTORS) and let the backend know it will need to create
761 .loader relocs for them. */
762 lang_for_each_statement (gld${EMULATION_NAME}_find_relocs);
764 /* Precedence of LIBPATH
765 -blibpath: native support always first
766 -rpath: gnu extension
767 -L build from command line -L's */
768 if (command_line_blibpath != NULL)
769 libpath = command_line_blibpath;
770 else if (command_line.rpath != NULL)
771 libpath = command_line.rpath;
772 else if (search_head == NULL)
773 libpath = (char *) "";
777 search_dirs_type *search;
779 /* PR ld/4023: Strip sysroot prefix from any paths
780 being inserted into the output binary's DT_RPATH. */
781 if (ld_sysroot != NULL
782 && * ld_sysroot != 0)
784 const char * name = search_head->name;
785 size_t ld_sysroot_len = strlen (ld_sysroot);
787 if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0)
788 name += ld_sysroot_len;
791 libpath = xmalloc (len + 1);
792 strcpy (libpath, name);
794 for (search = search_head->next; search != NULL; search = search->next)
799 if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0)
800 name += ld_sysroot_len;
802 nlen = strlen (name);
803 libpath = xrealloc (libpath, len + nlen + 2);
805 strcpy (libpath + len + 1, name);
811 len = strlen (search_head->name);
812 libpath = xmalloc (len + 1);
813 strcpy (libpath, search_head->name);
815 for (search = search_head->next; search != NULL; search = search->next)
819 nlen = strlen (search->name);
820 libpath = xrealloc (libpath, len + nlen + 2);
822 strcpy (libpath + len + 1, search->name);
828 /* Default to -bexpfull for SVR4-like semantics. */
829 flags = (unix_ld ? XCOFF_EXPFULL : 0);
830 flags &= ~explicit_auto_export_flags;
831 flags |= auto_export_flags;
833 /* Let the XCOFF backend set up the .loader section. */
834 if (!bfd_xcoff_size_dynamic_sections
835 (link_info.output_bfd, &link_info, libpath, entry_symbol.name, file_align,
836 maxstack, maxdata, gc && !unix_ld ? TRUE : FALSE,
837 modtype, textro ? TRUE : FALSE, flags, special_sections,
838 rtld ? TRUE : FALSE))
839 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
841 /* Look through the special sections, and put them in the right
842 place in the link ordering. This is especially magic. */
843 for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
846 lang_output_section_statement_type *os;
847 lang_statement_union_type **pls;
848 lang_input_section_type *is;
852 sec = special_sections[i];
856 /* Remove this section from the list of the output section.
857 This assumes we know what the script looks like. */
859 os = lang_output_section_find (sec->output_section->name);
861 einfo ("%P%F: can't find output section %s\n",
862 sec->output_section->name);
864 for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->header.next)
866 if ((*pls)->header.type == lang_input_section_enum
867 && (*pls)->input_section.section == sec)
869 is = (lang_input_section_type *) * pls;
870 *pls = (*pls)->header.next;
874 if ((*pls)->header.type == lang_wild_statement_enum)
876 lang_statement_union_type **pwls;
878 for (pwls = &(*pls)->wild_statement.children.head;
879 *pwls != NULL; pwls = &(*pwls)->header.next)
882 if ((*pwls)->header.type == lang_input_section_enum
883 && (*pwls)->input_section.section == sec)
885 is = (lang_input_section_type *) * pwls;
886 *pwls = (*pwls)->header.next;
898 einfo ("%P%F: can't find %s in output section\n",
899 bfd_get_section_name (sec->owner, sec));
902 /* Now figure out where the section should go. */
906 default: /* to avoid warnings */
907 case XCOFF_SPECIAL_SECTION_TEXT:
913 case XCOFF_SPECIAL_SECTION_ETEXT:
919 case XCOFF_SPECIAL_SECTION_DATA:
925 case XCOFF_SPECIAL_SECTION_EDATA:
931 case XCOFF_SPECIAL_SECTION_END:
932 case XCOFF_SPECIAL_SECTION_END2:
939 os = lang_output_section_find (oname);
943 is->header.next = os->children.head;
944 os->children.head = (lang_statement_union_type *) is;
948 is->header.next = NULL;
949 lang_statement_append (&os->children,
950 (lang_statement_union_type *) is,
955 /* Executables and shared objects must always have .text, .data
956 and .bss output sections, so that the header can refer to them.
957 The kernel refuses to load objects that have missing sections. */
958 if (!link_info.relocatable)
959 for (i = 0; i < ARRAY_SIZE (must_keep_sections); i++)
963 sec = bfd_get_section_by_name (link_info.output_bfd,
964 must_keep_sections[i]);
966 einfo ("%P: can't find required output section %s\n", must_keep_sections[i]);
968 sec->flags |= SEC_KEEP;
971 before_allocation_default ();
975 gld${EMULATION_NAME}_choose_target (int argc, char **argv)
978 static char *from_outside;
979 static char *from_inside;
980 static char *argv_to_target[][2] = {
981 {NULL, "${OUTPUT_FORMAT}"},
982 {"-b32", "${OUTPUT_FORMAT_32BIT}"},
983 {"-b64", "${OUTPUT_FORMAT_64BIT}"},
988 from_outside = getenv (TARGET_ENVIRON);
989 if (from_outside != (char *) NULL)
992 /* Set to default. */
993 from_inside = argv_to_target[0][1];
994 for (i = 1; i < argc; i++)
996 for (j = 1; j < jmax; j++)
998 if (0 == strcmp (argv[i], argv_to_target[j][0]))
999 from_inside = argv_to_target[j][1];
1010 change_symbol_mode (char *input)
1012 char *symbol_mode_string[] = {
1015 "# no32", /* 0x04 */
1016 "# no64", /* 0x08 */
1023 for (bit = 0;; bit++)
1025 string = symbol_mode_string[bit];
1029 if (0 == strcmp (input, string))
1031 symbol_mode = (1 << bit);
1035 /* should not be here */
1042 -1 : error, try something else */
1044 is_syscall (char *input, unsigned int *flag)
1050 char *syscall_string;
1053 { "svc" /* 0x01 */, XCOFF_SYSCALL32 },
1054 { "svc32" /* 0x02 */, XCOFF_SYSCALL32 },
1055 { "svc3264" /* 0x04 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
1056 { "svc64" /* 0x08 */, XCOFF_SYSCALL64 },
1057 { "syscall" /* 0x10 */, XCOFF_SYSCALL32 },
1058 { "syscall32" /* 0x20 */, XCOFF_SYSCALL32 },
1059 { "syscall3264" /* 0x40 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
1060 { "syscall64" /* 0x80 */, XCOFF_SYSCALL64 },
1066 for (bit = 0;; bit++)
1068 string = s[bit].syscall_string;
1072 if (0 == strcmp (input, string))
1074 if (1 << bit & syscall_mask)
1076 *flag = s[bit].flag;
1085 /* should not be here */
1089 /* Read an import or export file. For an import file, this is called
1090 by the before_allocation emulation routine. For an export file,
1091 this is called by the handle_option emulation routine. */
1094 gld${EMULATION_NAME}_read_file (const char *filename, bfd_boolean import)
1101 const char *imppath;
1102 const char *impfile;
1103 const char *impmember;
1105 o = (struct obstack *) xmalloc (sizeof (struct obstack));
1106 obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
1108 f = fopen (filename, FOPEN_RT);
1111 bfd_set_error (bfd_error_system_call);
1112 einfo ("%F%s: %E\n", filename);
1123 /* Default to 32 and 64 bit mode
1124 symbols at top of /lib/syscalls.exp do not have a mode modifier and they
1125 are not repeated, assume 64 bit routines also want to use them.
1126 See the routine change_symbol_mode for more information. */
1130 while ((c = getc (f)) != EOF)
1134 unsigned int syscall_flag = 0;
1136 struct bfd_link_hash_entry *h;
1140 obstack_1grow (o, c);
1144 obstack_1grow (o, '\0');
1147 s = (char *) obstack_base (o);
1148 while (ISSPACE (*s))
1152 || change_symbol_mode (s)
1153 || (*s == '#' && s[1] == ' ')
1154 || (!import && *s == '#' && s[1] == '!'))
1156 obstack_free (o, obstack_base (o));
1160 if (*s == '#' && s[1] == '!')
1163 while (ISSPACE (*s))
1170 obstack_free (o, obstack_base (o));
1173 einfo ("%F%s%d: #! ([member]) is not supported in import files\n",
1180 (void) obstack_finish (o);
1183 while (!ISSPACE (*s) && *s != '(' && *s != '\0')
1187 if (!bfd_xcoff_split_import_path (link_info.output_bfd,
1188 start, &imppath, &impfile))
1189 einfo ("%F%P: Could not parse import path: %E\n");
1190 while (ISSPACE (cs))
1199 einfo ("%s:%d: warning: syntax error in import file\n",
1206 while (*s != ')' && *s != '\0')
1211 einfo ("%s:%d: warning: syntax error in import file\n",
1219 if (symbol_mode & symbol_mode_mask)
1221 /* This is a symbol to be imported or exported. */
1224 address = (bfd_vma) -1;
1226 while (!ISSPACE (*s) && *s != '\0')
1234 while (ISSPACE (*s))
1238 while (!ISSPACE (*se) && *se != '\0')
1243 while (ISSPACE (*se))
1246 einfo ("%s%d: warning: syntax error in import/export file\n",
1255 status = is_syscall (s, &syscall_flag);
1259 /* not a system call, check for address */
1260 address = bfd_scan_vma (s, &end, 0);
1263 einfo ("%s:%d: warning: syntax error in import/export file\n",
1273 struct export_symbol_list *n;
1275 ldlang_add_undef (symname, TRUE);
1276 n = ((struct export_symbol_list *)
1277 xmalloc (sizeof (struct export_symbol_list)));
1278 n->next = export_symbols;
1279 n->name = xstrdup (symname);
1284 h = bfd_link_hash_lookup (link_info.hash, symname, FALSE, FALSE,
1286 if (h == NULL || h->type == bfd_link_hash_new)
1288 /* We can just ignore attempts to import an unreferenced
1293 if (!bfd_xcoff_import_symbol (link_info.output_bfd,
1295 address, imppath, impfile,
1296 impmember, syscall_flag))
1297 einfo ("%X%s:%d: failed to import symbol %s: %E\n",
1298 filename, lineno, symname);
1302 obstack_free (o, obstack_base (o));
1305 if (obstack_object_size (o) > 0)
1307 einfo ("%s:%d: warning: ignoring unterminated last line\n",
1309 obstack_free (o, obstack_base (o));
1314 obstack_free (o, NULL);
1319 /* This routine saves us from worrying about declaring free. */
1322 gld${EMULATION_NAME}_free (void *p)
1327 /* This is called by the before_allocation routine via
1328 lang_for_each_statement. It looks for relocations and assignments
1332 gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *s)
1334 if (s->header.type == lang_reloc_statement_enum)
1336 lang_reloc_statement_type *rs;
1338 rs = &s->reloc_statement;
1339 if (rs->name == NULL)
1340 einfo ("%F%P: only relocations against symbols are permitted\n");
1341 if (!bfd_xcoff_link_count_reloc (link_info.output_bfd, &link_info,
1343 einfo ("%F%P: bfd_xcoff_link_count_reloc failed: %E\n");
1346 if (s->header.type == lang_assignment_statement_enum)
1347 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1350 /* Look through an expression for an assignment statement. */
1353 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1355 struct bfd_link_hash_entry *h;
1357 switch (exp->type.node_class)
1360 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
1361 FALSE, FALSE, FALSE);
1366 if (strcmp (exp->assign.dst, ".") != 0)
1368 if (!bfd_xcoff_record_link_assignment (link_info.output_bfd,
1371 einfo ("%P%F: failed to record assignment to %s: %E\n",
1374 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1378 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1379 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1383 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1384 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1385 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1389 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1398 gld${EMULATION_NAME}_get_script (int *isfile)
1401 if test -n "$COMPILE_IN"
1403 # Scripts compiled in.
1405 # sed commands to quote an ld script as a C string.
1406 sc="-f ${srcdir}/emultempl/ostring.sed"
1412 if (link_info.relocatable && config.build_constructors)
1415 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1416 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1417 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1418 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1419 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1420 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1421 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1422 echo ' ; else return' >> e${EMULATION_NAME}.c
1423 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1424 echo '; }' >> e${EMULATION_NAME}.c
1427 # Scripts read from the filesystem.
1433 if (link_info.relocatable && config.build_constructors)
1434 return "ldscripts/${EMULATION_NAME}.xu";
1435 else if (link_info.relocatable)
1436 return "ldscripts/${EMULATION_NAME}.xr";
1437 else if (!config.text_read_only)
1438 return "ldscripts/${EMULATION_NAME}.xbn";
1439 else if (!config.magic_demand_paged)
1440 return "ldscripts/${EMULATION_NAME}.xn";
1442 return "ldscripts/${EMULATION_NAME}.x";
1451 gld${EMULATION_NAME}_create_output_section_statements (void)
1454 if ((bfd_get_flavour (link_info.output_bfd) == bfd_target_xcoff_flavour)
1455 && (link_info.init_function != NULL
1456 || link_info.fini_function != NULL
1459 initfini_file = lang_add_input_file ("initfini",
1460 lang_input_file_is_file_enum,
1463 initfini_file->the_bfd = bfd_create ("initfini", link_info.output_bfd);
1464 if (initfini_file->the_bfd == NULL
1465 || ! bfd_set_arch_mach (initfini_file->the_bfd,
1466 bfd_get_arch (link_info.output_bfd),
1467 bfd_get_mach (link_info.output_bfd)))
1469 einfo ("%X%P: can not create BFD %E\n");
1473 /* Call backend to fill in the rest */
1474 if (! bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd,
1475 link_info.init_function,
1476 link_info.fini_function,
1479 einfo ("%X%P: can not create BFD %E\n");
1483 /* __rtld defined in /lib/librtl.a */
1485 lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL);
1490 gld${EMULATION_NAME}_set_output_arch (void)
1492 bfd_set_arch_mach (link_info.output_bfd,
1493 bfd_xcoff_architecture (link_info.output_bfd),
1494 bfd_xcoff_machine (link_info.output_bfd));
1496 ldfile_output_architecture = bfd_get_arch (link_info.output_bfd);
1497 ldfile_output_machine = bfd_get_mach (link_info.output_bfd);
1498 ldfile_output_machine_name = bfd_printable_name (link_info.output_bfd);
1502 gld${EMULATION_NAME}_open_dynamic_archive (const char *arch,
1503 search_dirs_type *search,
1504 lang_input_statement_type *entry)
1508 if (!entry->maybe_archive)
1511 path = concat (search->name, "/lib", entry->filename, arch, ".a", NULL);
1512 if (!ldfile_try_open_bfd (path, entry))
1517 /* Don't include the searched directory in the import path. */
1518 bfd_xcoff_set_archive_import_path (&link_info, entry->the_bfd,
1519 path + strlen (search->name) + 1);
1520 entry->filename = path;
1524 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
1525 gld${EMULATION_NAME}_before_parse,
1528 after_parse_default,
1529 gld${EMULATION_NAME}_after_open,
1530 after_allocation_default,
1531 gld${EMULATION_NAME}_set_output_arch,
1532 gld${EMULATION_NAME}_choose_target,
1533 gld${EMULATION_NAME}_before_allocation,
1534 gld${EMULATION_NAME}_get_script,
1535 "${EMULATION_NAME}",
1538 gld${EMULATION_NAME}_create_output_section_statements,
1539 gld${EMULATION_NAME}_open_dynamic_archive,
1540 0, /* place_orphan */
1541 0, /* set_symbols */
1542 gld${EMULATION_NAME}_parse_args,
1543 gld${EMULATION_NAME}_add_options,
1544 gld${EMULATION_NAME}_handle_option,
1545 gld${EMULATION_NAME}_unrecognized_file,
1546 NULL, /* list_options */
1547 NULL, /* recognized_file */
1548 NULL, /* find potential_libraries */
1549 NULL /* new_vers_pattern */