1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 cat >e${EMULATION_NAME}.c <<EOF
4 /* This file is is generated by a shell script. DO NOT EDIT! */
6 /* AIX emulation code for ${EMULATION_NAME}
7 Copyright (C) 1991, 93, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
8 Written by Steve Chamberlain <sac@cygnus.com>
9 AIX support by Ian Lance Taylor <ian@cygnus.com>
11 This file is part of GLD, the Gnu Linker.
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
27 #define TARGET_IS_${EMULATION_NAME}
31 #include "libiberty.h"
48 static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
49 static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
50 static void gld${EMULATION_NAME}_after_open PARAMS ((void));
51 static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
52 static void gld${EMULATION_NAME}_read_file PARAMS ((const char *, boolean));
53 static void gld${EMULATION_NAME}_free PARAMS ((PTR));
54 static void gld${EMULATION_NAME}_find_relocs
55 PARAMS ((lang_statement_union_type *));
56 static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
57 static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
59 /* The file alignment required for each section. */
60 static unsigned long file_align;
62 /* The maximum size the stack is permitted to grow. This is stored in
64 static unsigned long maxstack;
66 /* The maximum data size. This is stored in the a.out header. */
67 static unsigned long maxdata;
69 /* Whether to perform garbage collection. */
72 /* The module type to use. */
73 static unsigned short modtype = ('1' << 8) | 'L';
75 /* Whether the .text section must be read-only (i.e., no relocs
79 /* Whether to implement Unix like linker semantics. */
82 /* Structure used to hold import file list. */
86 struct filelist *next;
90 /* List of import files. */
91 static struct filelist *import_files;
93 /* List of export symbols read from the export files. */
95 struct export_symbol_list
97 struct export_symbol_list *next;
102 static struct export_symbol_list *export_symbols;
104 /* This routine is called before anything else is done. */
107 gld${EMULATION_NAME}_before_parse()
109 #ifndef TARGET_ /* I.e., if not generic. */
110 ldfile_output_architecture = bfd_arch_${ARCH};
111 #endif /* not TARGET_ */
112 config.has_shared = true;
115 /* Handle AIX specific options. */
118 gld${EMULATION_NAME}_parse_args (argc, argv)
122 int prevoptind = optind;
123 int prevopterr = opterr;
130 #define OPTION_IGNORE (300)
131 #define OPTION_AUTOIMP (OPTION_IGNORE + 1)
132 #define OPTION_ERNOTOK (OPTION_AUTOIMP + 1)
133 #define OPTION_EROK (OPTION_ERNOTOK + 1)
134 #define OPTION_EXPORT (OPTION_EROK + 1)
135 #define OPTION_IMPORT (OPTION_EXPORT + 1)
136 #define OPTION_LOADMAP (OPTION_IMPORT + 1)
137 #define OPTION_MAXDATA (OPTION_LOADMAP + 1)
138 #define OPTION_MAXSTACK (OPTION_MAXDATA + 1)
139 #define OPTION_MODTYPE (OPTION_MAXSTACK + 1)
140 #define OPTION_NOAUTOIMP (OPTION_MODTYPE + 1)
141 #define OPTION_NOSTRCMPCT (OPTION_NOAUTOIMP + 1)
142 #define OPTION_PD (OPTION_NOSTRCMPCT + 1)
143 #define OPTION_PT (OPTION_PD + 1)
144 #define OPTION_STRCMPCT (OPTION_PT + 1)
145 #define OPTION_UNIX (OPTION_STRCMPCT + 1)
147 static struct option longopts[] = {
148 {"basis", no_argument, NULL, OPTION_IGNORE},
149 {"bautoimp", no_argument, NULL, OPTION_AUTOIMP},
150 {"bcomprld", no_argument, NULL, OPTION_IGNORE},
151 {"bcrld", no_argument, NULL, OPTION_IGNORE},
152 {"bcror31", no_argument, NULL, OPTION_IGNORE},
153 {"bD", required_argument, NULL, OPTION_MAXDATA},
154 {"bE", required_argument, NULL, OPTION_EXPORT},
155 {"bernotok", no_argument, NULL, OPTION_ERNOTOK},
156 {"berok", no_argument, NULL, OPTION_EROK},
157 {"berrmsg", no_argument, NULL, OPTION_IGNORE},
158 {"bexport", required_argument, NULL, OPTION_EXPORT},
159 {"bf", no_argument, NULL, OPTION_ERNOTOK},
160 {"bgc", no_argument, &gc, 1},
161 {"bh", required_argument, NULL, OPTION_IGNORE},
162 {"bhalt", required_argument, NULL, OPTION_IGNORE},
163 {"bI", required_argument, NULL, OPTION_IMPORT},
164 {"bimport", required_argument, NULL, OPTION_IMPORT},
165 {"bl", required_argument, NULL, OPTION_LOADMAP},
166 {"bloadmap", required_argument, NULL, OPTION_LOADMAP},
167 {"bmaxdata", required_argument, NULL, OPTION_MAXDATA},
168 {"bmaxstack", required_argument, NULL, OPTION_MAXSTACK},
169 {"bM", required_argument, NULL, OPTION_MODTYPE},
170 {"bmodtype", required_argument, NULL, OPTION_MODTYPE},
171 {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP},
172 {"bnodelcsect", no_argument, NULL, OPTION_IGNORE},
173 {"bnoentry", no_argument, NULL, OPTION_IGNORE},
174 {"bnogc", no_argument, &gc, 0},
175 {"bnso", no_argument, NULL, OPTION_NOAUTOIMP},
176 {"bnostrcmpct", no_argument, NULL, OPTION_NOSTRCMPCT},
177 {"bnotextro", no_argument, &textro, 0},
178 {"bnro", no_argument, &textro, 0},
179 {"bpD", required_argument, NULL, OPTION_PD},
180 {"bpT", required_argument, NULL, OPTION_PT},
181 {"bro", no_argument, &textro, 1},
182 {"bS", required_argument, NULL, OPTION_MAXSTACK},
183 {"bso", no_argument, NULL, OPTION_AUTOIMP},
184 {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT},
185 {"btextro", no_argument, &textro, 1},
186 {"static", no_argument, NULL, OPTION_NOAUTOIMP},
187 {"unix", no_argument, NULL, OPTION_UNIX},
188 {NULL, no_argument, NULL, 0}
191 /* Options supported by the AIX linker which we do not support: -f,
192 -S, -v, -Z, -bbindcmds, -bbinder, -bbindopts, -bcalls, -bcaps,
193 -bcror15, -bdebugopt, -bdbg, -bdelcsect, -bex?, -bfilelist, -bfl,
194 -bgcbypass, -bglink, -binsert, -bi, -bloadmap, -bl, -bmap, -bnl,
195 -bnobind, -bnocomprld, -bnocrld, -bnoerrmsg, -bnoglink,
196 -bnoloadmap, -bnl, -bnoobjreorder, -bnoquiet, -bnoreorder,
197 -bnotypchk, -bnox, -bquiet, -bR, -brename, -breorder, -btypchk,
200 /* If the current option starts with -b, change the first : to an =.
201 The AIX linker uses : to separate the option from the argument;
202 changing it to = lets us treat it as a getopt option. */
206 if (indx < argc && strncmp (argv[indx], "-b", 2) == 0)
210 for (s = argv[indx]; *s != '\0'; s++)
220 /* We add s and u so to the short options list so that -s and -u on
221 the command line do not match -static and -unix. */
224 optc = getopt_long_only (argc, argv, "-D:H:KT:zsu", longopts, &longind);
236 /* Long option which just sets a flag. */
240 val = strtol (optarg, &end, 0);
242 einfo ("%P: warning: ignoring invalid -D number %s\n", optarg);
244 lang_section_start (".data", exp_intop (val));
248 val = strtoul (optarg, &end, 0);
250 || (val & (val - 1)) != 0)
251 einfo ("%P: warning: ignoring invalid -H number %s\n", optarg);
258 /* FIXME: This should use the page size for the target system. */
263 /* On AIX this is the same as GNU ld -Ttext. When we see -T
264 number, we assume the AIX option is intended. Otherwise, we
265 assume the usual GNU ld -T option is intended. We can't just
266 ignore the AIX option, because gcc passes it to the linker. */
267 val = strtoul (optarg, &end, 0);
273 lang_section_start (".text", exp_intop (val));
280 link_info.static_link = false;
284 force_make_executable = false;
288 force_make_executable = true;
292 gld${EMULATION_NAME}_read_file (optarg, false);
298 struct filelist **flpp;
300 n = (struct filelist *) xmalloc (sizeof (struct filelist));
303 flpp = &import_files;
304 while (*flpp != NULL)
305 flpp = &(*flpp)->next;
311 config.map_filename = optarg;
315 val = strtoul (optarg, &end, 0);
317 einfo ("%P: warning: ignoring invalid -bmaxdata number %s\n",
323 case OPTION_MAXSTACK:
324 val = strtoul (optarg, &end, 0);
326 einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n",
335 link_info.shared = true;
338 if (*optarg == '\0' || optarg[1] == '\0')
339 einfo ("%P: warning: ignoring invalid module type %s\n", optarg);
341 modtype = (*optarg << 8) | optarg[1];
344 case OPTION_NOAUTOIMP:
345 link_info.static_link = true;
348 case OPTION_NOSTRCMPCT:
349 link_info.traditional_format = true;
353 /* This sets the page that the .data section is supposed to
354 start on. The offset within the page should still be the
355 offset within the file, so we need to build an appropriate
357 val = strtoul (optarg, &end, 0);
359 einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg);
367 exp_nameop (NAME, "."),
370 exp_binop ('+', t, exp_intop (31)),
371 exp_intop (~ (bfd_vma) 31));
372 lang_section_start (".data", t);
377 /* This set the page that the .text section is supposed to start
378 on. The offset within the page should still be the offset
380 val = strtoul (optarg, &end, 0);
382 einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg);
389 exp_nameop (SIZEOF_HEADERS, NULL));
391 exp_binop ('+', t, exp_intop (31)),
392 exp_intop (~ (bfd_vma) 31));
393 lang_section_start (".text", t);
397 case OPTION_STRCMPCT:
398 link_info.traditional_format = false;
409 /* This is called when an input file can not be recognized as a BFD
410 object or an archive. If the file starts with #!, we must treat it
411 as an import file. This is for AIX compatibility. */
414 gld${EMULATION_NAME}_unrecognized_file (entry)
415 lang_input_statement_type *entry;
420 e = fopen (entry->filename, FOPEN_RT);
426 if (getc (e) == '#' && getc (e) == '!')
429 struct filelist **flpp;
431 n = (struct filelist *) xmalloc (sizeof (struct filelist));
433 n->name = entry->filename;
434 flpp = &import_files;
435 while (*flpp != NULL)
436 flpp = &(*flpp)->next;
440 entry->loaded = true;
448 /* This is called after the input files have been opened. */
451 gld${EMULATION_NAME}_after_open ()
456 /* Call ldctor_build_sets, after pretending that this is a
457 relocateable link. We do this because AIX requires relocation
458 entries for all references to symbols, even in a final
459 executable. Of course, we only want to do this if we are
460 producing an XCOFF output file. */
461 r = link_info.relocateable;
462 if (strstr (bfd_get_target (output_bfd), "xcoff") != NULL)
463 link_info.relocateable = true;
464 ldctor_build_sets ();
465 link_info.relocateable = r;
467 /* For each set, record the size, so that the XCOFF backend can
468 output the correct csect length. */
469 for (p = sets; p != (struct set_info *) NULL; p = p->next)
473 /* If the symbol is defined, we may have been invoked from
474 collect, and the sets may already have been built, so we do
476 if (p->h->type == bfd_link_hash_defined
477 || p->h->type == bfd_link_hash_defweak)
480 if (p->reloc != BFD_RELOC_CTOR)
482 /* Handle this if we need to. */
486 size = (p->count + 2) * 4;
487 if (! bfd_xcoff_link_record_set (output_bfd, &link_info, p->h, size))
488 einfo ("%F%P: bfd_xcoff_link_record_set failed: %E\n");
492 /* This is called after the sections have been attached to output
493 sections, but before any sizes or addresses have been set. */
496 gld${EMULATION_NAME}_before_allocation ()
499 struct export_symbol_list *el;
501 asection *special_sections[6];
504 /* Handle the import and export files, if any. */
505 for (fl = import_files; fl != NULL; fl = fl->next)
506 gld${EMULATION_NAME}_read_file (fl->name, true);
507 for (el = export_symbols; el != NULL; el = el->next)
509 struct bfd_link_hash_entry *h;
511 h = bfd_link_hash_lookup (link_info.hash, el->name, false, false, false);
513 einfo ("%P%F: bfd_link_hash_lookup of export symbol failed: %E\n");
514 if (! bfd_xcoff_export_symbol (output_bfd, &link_info, h, el->syscall))
515 einfo ("%P%F: bfd_xcoff_export_symbol failed: %E\n");
518 /* Track down all relocations called for by the linker script (these
519 are typically constructor/destructor entries created by
520 CONSTRUCTORS) and let the backend know it will need to create
521 .loader relocs for them. */
522 lang_for_each_statement (gld${EMULATION_NAME}_find_relocs);
524 /* We need to build LIBPATH from the -L arguments. If any -rpath
525 arguments were used, though, we use -rpath instead, as a GNU
527 if (command_line.rpath != NULL)
528 libpath = command_line.rpath;
529 else if (search_head == NULL)
530 libpath = (char *) "";
534 search_dirs_type *search;
536 len = strlen (search_head->name);
537 libpath = xmalloc (len + 1);
538 strcpy (libpath, search_head->name);
539 for (search = search_head->next; search != NULL; search = search->next)
543 nlen = strlen (search->name);
544 libpath = xrealloc (libpath, len + nlen + 2);
546 strcpy (libpath + len + 1, search->name);
551 /* Let the XCOFF backend set up the .loader section. */
552 if (! bfd_xcoff_size_dynamic_sections (output_bfd, &link_info, libpath,
553 entry_symbol, file_align,
555 gc && ! unix_ld ? true : false,
557 textro ? true : false,
560 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
562 /* Look through the special sections, and put them in the right
563 place in the link ordering. This is especially magic. */
564 for (i = 0; i < 6; i++)
567 lang_output_section_statement_type *os;
568 lang_statement_union_type **pls;
569 lang_input_section_type *is;
573 sec = special_sections[i];
577 /* Remove this section from the list of the output section.
578 This assumes we know what the script looks like. */
580 os = lang_output_section_find (sec->output_section->name);
582 einfo ("%P%F: can't find output section %s\n",
583 sec->output_section->name);
584 for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->next)
586 if ((*pls)->header.type == lang_input_section_enum
587 && (*pls)->input_section.section == sec)
589 is = (lang_input_section_type *) *pls;
593 if ((*pls)->header.type == lang_wild_statement_enum)
595 lang_statement_union_type **pwls;
597 for (pwls = &(*pls)->wild_statement.children.head;
599 pwls = &(*pwls)->next)
601 if ((*pwls)->header.type == lang_input_section_enum
602 && (*pwls)->input_section.section == sec)
604 is = (lang_input_section_type *) *pwls;
605 *pwls = (*pwls)->next;
615 einfo ("%P%F: can't find %s in output section\n",
616 bfd_get_section_name (sec->owner, sec));
618 /* Now figure out where the section should go. */
621 default: /* to avoid warnings */
650 os = lang_output_section_find (oname);
654 is->header.next = os->children.head;
655 os->children.head = (lang_statement_union_type *) is;
659 is->header.next = NULL;
660 lang_statement_append (&os->children,
661 (lang_statement_union_type *) is,
667 /* Read an import or export file. For an import file, this is called
668 by the before_allocation emulation routine. For an export file,
669 this is called by the parse_args emulation routine. */
672 gld${EMULATION_NAME}_read_file (filename, import)
673 const char *filename;
683 const char *impmember;
685 o = (struct obstack *) xmalloc (sizeof (struct obstack));
686 obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
688 f = fopen (filename, FOPEN_RT);
691 bfd_set_error (bfd_error_system_call);
692 einfo ("%F%s: %E\n", filename);
702 while ((c = getc (f)) != EOF)
708 struct bfd_link_hash_entry *h;
712 obstack_1grow (o, c);
716 obstack_1grow (o, '\0');
719 s = (char *) obstack_base (o);
720 while (isspace ((unsigned char) *s))
724 || (*s == '#' && s[1] == ' ')
725 || (! import && *s == '#' && s[1] == '!'))
727 obstack_free (o, obstack_base (o));
731 if (*s == '#' && s[1] == '!')
734 while (isspace ((unsigned char) *s))
741 obstack_free (o, obstack_base (o));
744 einfo ("%F%s%d: #! ([member]) is not supported in import files\n",
751 (void) obstack_finish (o);
755 while (! isspace ((unsigned char) *s) && *s != '(' && *s != '\0')
765 if (imppath == file - 1)
775 while (isspace ((unsigned char) cs))
784 einfo ("%s:%d: warning: syntax error in import file\n",
791 while (*s != ')' && *s != '\0')
796 einfo ("%s:%d: warning: syntax error in import file\n",
804 /* This is a symbol to be imported or exported. */
807 address = (bfd_vma) -1;
809 while (! isspace ((unsigned char) *s) && *s != '\0')
817 while (isspace ((unsigned char) *s))
821 while (! isspace ((unsigned char) *se) && *se != '\0')
826 while (isspace ((unsigned char) *se))
829 einfo ("%s%d: warning: syntax error in import/export file\n",
835 /* There was no address after all. */
837 else if (strcasecmp (s, "svc") == 0
838 || strcasecmp (s, "syscall") == 0)
844 address = strtoul (s, &end, 0);
846 einfo ("%s:%d: warning: syntax error in import/export file\n",
853 struct export_symbol_list *n;
855 ldlang_add_undef (symname);
856 n = ((struct export_symbol_list *)
857 xmalloc (sizeof (struct export_symbol_list)));
858 n->next = export_symbols;
859 n->name = buystring (symname);
860 n->syscall = syscall;
865 h = bfd_link_hash_lookup (link_info.hash, symname, false, false,
867 if (h == NULL || h->type == bfd_link_hash_new)
869 /* We can just ignore attempts to import an unreferenced
874 if (! bfd_xcoff_import_symbol (output_bfd, &link_info, h,
875 address, imppath, impfile,
877 einfo ("%X%s:%d: failed to import symbol %s: %E\n",
878 filename, lineno, symname);
882 obstack_free (o, obstack_base (o));
885 if (obstack_object_size (o) > 0)
887 einfo ("%s:%d: warning: ignoring unterminated last line\n",
889 obstack_free (o, obstack_base (o));
894 obstack_free (o, NULL);
899 /* This routine saves us from worrying about declaring free. */
902 gld${EMULATION_NAME}_free (p)
908 /* This is called by the before_allocation routine via
909 lang_for_each_statement. It looks for relocations and assignments
913 gld${EMULATION_NAME}_find_relocs (s)
914 lang_statement_union_type *s;
916 if (s->header.type == lang_reloc_statement_enum)
918 lang_reloc_statement_type *rs;
920 rs = &s->reloc_statement;
921 if (rs->name == NULL)
922 einfo ("%F%P: only relocations against symbols are permitted\n");
923 if (! bfd_xcoff_link_count_reloc (output_bfd, &link_info, rs->name))
924 einfo ("%F%P: bfd_xcoff_link_count_reloc failed: %E\n");
927 if (s->header.type == lang_assignment_statement_enum)
928 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
931 /* Look through an expression for an assignment statement. */
934 gld${EMULATION_NAME}_find_exp_assignment (exp)
937 struct bfd_link_hash_entry *h;
939 switch (exp->type.node_class)
942 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
943 false, false, false);
948 if (strcmp (exp->assign.dst, ".") != 0)
950 if (! bfd_xcoff_record_link_assignment (output_bfd, &link_info,
952 einfo ("%P%F: failed to record assignment to %s: %E\n",
955 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
959 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
960 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
964 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
965 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
966 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
970 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
979 gld${EMULATION_NAME}_get_script(isfile)
983 if test -n "$COMPILE_IN"
985 # Scripts compiled in.
987 # sed commands to quote an ld script as a C string.
988 sc="-f stringify.sed"
990 cat >>e${EMULATION_NAME}.c <<EOF
994 if (link_info.relocateable == true && config.build_constructors == true)
997 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
998 echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
999 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1000 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1001 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1002 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1003 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1004 echo ' ; else return' >> e${EMULATION_NAME}.c
1005 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1006 echo '; }' >> e${EMULATION_NAME}.c
1009 # Scripts read from the filesystem.
1011 cat >>e${EMULATION_NAME}.c <<EOF
1015 if (link_info.relocateable == true && config.build_constructors == true)
1016 return "ldscripts/${EMULATION_NAME}.xu";
1017 else if (link_info.relocateable == true)
1018 return "ldscripts/${EMULATION_NAME}.xr";
1019 else if (!config.text_read_only)
1020 return "ldscripts/${EMULATION_NAME}.xbn";
1021 else if (!config.magic_demand_paged)
1022 return "ldscripts/${EMULATION_NAME}.xn";
1024 return "ldscripts/${EMULATION_NAME}.x";
1030 cat >>e${EMULATION_NAME}.c <<EOF
1032 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1034 gld${EMULATION_NAME}_before_parse,
1037 after_parse_default,
1038 gld${EMULATION_NAME}_after_open,
1039 after_allocation_default,
1040 set_output_arch_default,
1041 ldemul_default_target,
1042 gld${EMULATION_NAME}_before_allocation,
1043 gld${EMULATION_NAME}_get_script,
1044 "${EMULATION_NAME}",
1047 0, /* create_output_section_statements */
1048 0, /* open_dynamic_archive */
1049 0, /* place_orphan */
1050 0, /* set_symbols */
1051 gld${EMULATION_NAME}_parse_args,
1052 gld${EMULATION_NAME}_unrecognized_file,
1053 NULL /* find_potential_libraries */