]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/emultempl/aix.em
* gas/ppc/altivec_xcoff64.d: Adjust for aix5 target.
[thirdparty/binutils-gdb.git] / ld / emultempl / aix.em
CommitLineData
252b5132
RH
1# This shell script emits a C file. -*- C -*-
2# It does some substitutions.
86af25fe
L
3if [ -z "$MACHINE" ]; then
4 OUTPUT_ARCH=${ARCH}
5else
6 OUTPUT_ARCH=${ARCH}:${MACHINE}
7fi
252b5132
RH
8cat >e${EMULATION_NAME}.c <<EOF
9/* This file is is generated by a shell script. DO NOT EDIT! */
10
11/* AIX emulation code for ${EMULATION_NAME}
e3e942e9 12 Copyright 1991, 1993, 1995, 1996, 1997, 1998, 2000, 2001, 2002
8529105a 13 Free Software Foundation, Inc.
252b5132
RH
14 Written by Steve Chamberlain <sac@cygnus.com>
15 AIX support by Ian Lance Taylor <ian@cygnus.com>
3b1b01cf 16 AIX 64 bit support by Tom Rix <trix@redhat.com>
252b5132
RH
17
18This file is part of GLD, the Gnu Linker.
19
20This program is free software; you can redistribute it and/or modify
21it under the terms of the GNU General Public License as published by
22the Free Software Foundation; either version 2 of the License, or
23(at your option) any later version.
24
25This program is distributed in the hope that it will be useful,
26but WITHOUT ANY WARRANTY; without even the implied warranty of
27MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28GNU General Public License for more details.
29
30You should have received a copy of the GNU General Public License
31along with this program; if not, write to the Free Software
32Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
33
34#define TARGET_IS_${EMULATION_NAME}
35
36#include "bfd.h"
37#include "sysdep.h"
38#include "libiberty.h"
3882b010 39#include "safe-ctype.h"
252b5132
RH
40#include "getopt.h"
41#include "obstack.h"
42#include "bfdlink.h"
43
252b5132
RH
44#include "ld.h"
45#include "ldmain.h"
252b5132
RH
46#include "ldmisc.h"
47#include "ldexp.h"
48#include "ldlang.h"
20713691
AM
49#include "ldfile.h"
50#include "ldemul.h"
252b5132
RH
51#include "ldctor.h"
52#include "ldgram.h"
53
3b1b01cf
TR
54#include "coff/internal.h"
55#include "coff/xcoff.h"
f1f0d9ab
TR
56#include "libcoff.h"
57#include "libxcoff.h"
3b1b01cf 58
252b5132
RH
59static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
60static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
61static void gld${EMULATION_NAME}_after_open PARAMS ((void));
f1f0d9ab 62static char *gld${EMULATION_NAME}_choose_target PARAMS ((int, char **));
252b5132
RH
63static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
64static void gld${EMULATION_NAME}_read_file PARAMS ((const char *, boolean));
65static void gld${EMULATION_NAME}_free PARAMS ((PTR));
249172c3
TR
66static void gld${EMULATION_NAME}_find_relocs
67PARAMS ((lang_statement_union_type *));
252b5132
RH
68static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
69static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
48f6162b
AJ
70static boolean gld${EMULATION_NAME}_unrecognized_file
71 PARAMS ((lang_input_statement_type *));
9a4c7f16 72static void gld${EMULATION_NAME}_create_output_section_statements
f1f0d9ab
TR
73 PARAMS ((void));
74static void gld${EMULATION_NAME}_set_output_arch PARAMS ((void));
75
249172c3
TR
76static int is_syscall PARAMS ((char *, unsigned int *));
77static int change_symbol_mode PARAMS ((char *));
252b5132
RH
78
79/* The file alignment required for each section. */
80static unsigned long file_align;
81
82/* The maximum size the stack is permitted to grow. This is stored in
83 the a.out header. */
84static unsigned long maxstack;
85
86/* The maximum data size. This is stored in the a.out header. */
87static unsigned long maxdata;
88
89/* Whether to perform garbage collection. */
90static int gc = 1;
91
92/* The module type to use. */
93static unsigned short modtype = ('1' << 8) | 'L';
94
95/* Whether the .text section must be read-only (i.e., no relocs
96 permitted). */
97static int textro;
98
99/* Whether to implement Unix like linker semantics. */
100static int unix_ld;
101
102/* Structure used to hold import file list. */
103
104struct filelist
105{
106 struct filelist *next;
107 const char *name;
108};
109
110/* List of import files. */
111static struct filelist *import_files;
112
113/* List of export symbols read from the export files. */
114
115struct export_symbol_list
116{
117 struct export_symbol_list *next;
118 const char *name;
252b5132
RH
119};
120
121static struct export_symbol_list *export_symbols;
122
3b1b01cf
TR
123/* Maintains the 32 or 64 bit mode state of import file */
124static unsigned int symbol_mode = 0x04;
125
742aeb63
TR
126/* Which symbol modes are valid */
127static unsigned int symbol_mode_mask = 0x0d;
128
129/* Whether this is a 64 bit link */
130static int is_64bit = 0;
131
132/* Which syscalls from import file are valid */
133static unsigned int syscall_mask = 0x77;
134
9a4c7f16
TR
135/* fake file for -binitfini support */
136static lang_input_statement_type *initfini_file;
69f284c7 137
ca10c62d
TR
138/* Whether to do run time linking
139 -brtl enables, -bnortl and -bnortllib disable. */
f1f0d9ab 140static int rtld;
69f284c7 141
aa67bccf
TR
142/* Explicit command line library path, -blibpath */
143static char *command_line_blibpath = NULL;
144
252b5132
RH
145/* This routine is called before anything else is done. */
146
147static void
fab80407 148gld${EMULATION_NAME}_before_parse ()
252b5132 149{
f1f0d9ab 150
252b5132 151 config.has_shared = true;
3b1b01cf 152
9a4c7f16
TR
153 /* The link_info.[init|fini]_functions are initialized in ld/lexsup.c.
154 Override them here so we can use the link_info.init_function as a
155 state flag that lets the backend know that -binitfini has been done. */
156
3b1b01cf
TR
157 link_info.init_function = NULL;
158 link_info.fini_function = NULL;
252b5132
RH
159}
160
161/* Handle AIX specific options. */
162
163static int
164gld${EMULATION_NAME}_parse_args (argc, argv)
165 int argc;
166 char **argv;
167{
168 int prevoptind = optind;
169 int prevopterr = opterr;
170 int indx;
171 int longind;
172 int optc;
3b1b01cf 173 bfd_signed_vma val;
252b5132
RH
174 char *end;
175
249172c3
TR
176 enum
177 {
3b1b01cf 178 OPTION_IGNORE = 300,
fab80407
AM
179 OPTION_AUTOIMP,
180 OPTION_ERNOTOK,
181 OPTION_EROK,
182 OPTION_EXPORT,
183 OPTION_IMPORT,
184 OPTION_INITFINI,
185 OPTION_LOADMAP,
186 OPTION_MAXDATA,
187 OPTION_MAXSTACK,
188 OPTION_MODTYPE,
189 OPTION_NOAUTOIMP,
190 OPTION_NOSTRCMPCT,
191 OPTION_PD,
192 OPTION_PT,
193 OPTION_STRCMPCT,
742aeb63
TR
194 OPTION_UNIX,
195 OPTION_32,
196 OPTION_64,
aa67bccf
TR
197 OPTION_LIBPATH,
198 OPTION_NOLIBPATH,
3b1b01cf
TR
199 };
200
9a4c7f16
TR
201 /* -binitfini has special handling in the linker backend. The native linker
202 uses the arguemnts to generate a table of init and fini functions for
203 the executable. The important use for this option is to support aix 4.2+
204 c++ constructors and destructors. This is tied into gcc via collect2.c.
205
206 The function table is accessed by the runtime linker/loader by checking if
207 the first symbol in the loader symbol table is __rtinit. The gnu linker
208 generates this symbol and makes it the first loader symbol. */
3b1b01cf
TR
209
210 static const struct option longopts[] = {
252b5132
RH
211 {"basis", no_argument, NULL, OPTION_IGNORE},
212 {"bautoimp", no_argument, NULL, OPTION_AUTOIMP},
213 {"bcomprld", no_argument, NULL, OPTION_IGNORE},
214 {"bcrld", no_argument, NULL, OPTION_IGNORE},
215 {"bcror31", no_argument, NULL, OPTION_IGNORE},
216 {"bD", required_argument, NULL, OPTION_MAXDATA},
217 {"bE", required_argument, NULL, OPTION_EXPORT},
218 {"bernotok", no_argument, NULL, OPTION_ERNOTOK},
219 {"berok", no_argument, NULL, OPTION_EROK},
220 {"berrmsg", no_argument, NULL, OPTION_IGNORE},
221 {"bexport", required_argument, NULL, OPTION_EXPORT},
222 {"bf", no_argument, NULL, OPTION_ERNOTOK},
223 {"bgc", no_argument, &gc, 1},
224 {"bh", required_argument, NULL, OPTION_IGNORE},
225 {"bhalt", required_argument, NULL, OPTION_IGNORE},
226 {"bI", required_argument, NULL, OPTION_IMPORT},
227 {"bimport", required_argument, NULL, OPTION_IMPORT},
3b1b01cf 228 {"binitfini", required_argument, NULL, OPTION_INITFINI},
252b5132
RH
229 {"bl", required_argument, NULL, OPTION_LOADMAP},
230 {"bloadmap", required_argument, NULL, OPTION_LOADMAP},
231 {"bmaxdata", required_argument, NULL, OPTION_MAXDATA},
232 {"bmaxstack", required_argument, NULL, OPTION_MAXSTACK},
233 {"bM", required_argument, NULL, OPTION_MODTYPE},
234 {"bmodtype", required_argument, NULL, OPTION_MODTYPE},
235 {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP},
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},
69f284c7 246 {"brtl", no_argument, &rtld, 1},
ca10c62d
TR
247 {"bnortl", no_argument, &rtld, 0},
248 {"bnortllib", no_argument, &rtld, 0},
252b5132
RH
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},
742aeb63
TR
253 {"b32", no_argument, NULL, OPTION_32},
254 {"b64", no_argument, NULL, OPTION_64},
252b5132
RH
255 {"static", no_argument, NULL, OPTION_NOAUTOIMP},
256 {"unix", no_argument, NULL, OPTION_UNIX},
aa67bccf
TR
257 {"blibpath", required_argument, NULL, OPTION_LIBPATH},
258 {"bnolibpath", required_argument, NULL, OPTION_NOLIBPATH},
252b5132
RH
259 {NULL, no_argument, NULL, 0}
260 };
261
262 /* Options supported by the AIX linker which we do not support: -f,
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,
269 -bx, -bX, -bxref. */
270
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. */
274 indx = optind;
fab80407 275 if (indx == 0)
249172c3 276 indx = 1;
fab80407
AM
277
278 if (indx < argc && strncmp (argv[indx], "-b", 2) == 0)
279 {
280 char *s;
281
282 for (s = argv[indx]; *s != '\0'; s++)
283 {
284 if (*s == ':')
285 {
286 *s = '=';
287 break;
288 }
289 }
252b5132 290 }
3b1b01cf 291
252b5132
RH
292
293 /* We add s and u so to the short options list so that -s and -u on
294 the command line do not match -static and -unix. */
295
296 opterr = 0;
297 optc = getopt_long_only (argc, argv, "-D:H:KT:zsu", longopts, &longind);
298 opterr = prevopterr;
299
300 switch (optc)
301 {
302 case 's':
303 case 'u':
304 default:
305 optind = prevoptind;
306 return 0;
307
308 case 0:
309 /* Long option which just sets a flag. */
310 break;
311
312 case 'D':
3b1b01cf 313 val = strtoll (optarg, &end, 0);
252b5132
RH
314 if (*end != '\0')
315 einfo ("%P: warning: ignoring invalid -D number %s\n", optarg);
316 else if (val != -1)
317 lang_section_start (".data", exp_intop (val));
318 break;
319
320 case 'H':
321 val = strtoul (optarg, &end, 0);
249172c3 322 if (*end != '\0' || (val & (val - 1)) != 0)
252b5132
RH
323 einfo ("%P: warning: ignoring invalid -H number %s\n", optarg);
324 else
325 file_align = val;
326 break;
327
328 case 'K':
329 case 'z':
330 /* FIXME: This should use the page size for the target system. */
331 file_align = 4096;
332 break;
333
334 case 'T':
335 /* On AIX this is the same as GNU ld -Ttext. When we see -T
336 number, we assume the AIX option is intended. Otherwise, we
337 assume the usual GNU ld -T option is intended. We can't just
338 ignore the AIX option, because gcc passes it to the linker. */
3b1b01cf 339 val = strtoull (optarg, &end, 0);
252b5132
RH
340 if (*end != '\0')
341 {
342 optind = prevoptind;
343 return 0;
344 }
345 lang_section_start (".text", exp_intop (val));
346 break;
347
348 case OPTION_IGNORE:
349 break;
350
fab80407
AM
351 case OPTION_INITFINI:
352 {
353 /*
354 * The aix linker init fini has the format :
355 *
356 * -binitfini:[ Initial][:Termination][:Priority]
357 *
358 * it allows the Termination and Priority to be optional.
359 *
360 * Since we support only one init/fini pair, we ignore the Priority.
361 *
362 * Define the special symbol __rtinit.
363 *
364 * strtok does not correctly handle the case of -binitfini::fini: so
365 * do it by hand
366 */
367 char *t, *i, *f;
368
369 i = t = optarg;
370 while (*t && ':' != *t)
371 t++;
372 if (*t)
373 *t++ = 0;
374
375 if (0 != strlen (i))
249172c3 376 link_info.init_function = i;
3b1b01cf 377
fab80407
AM
378 f = t;
379 while (*t && ':' != *t)
380 t++;
381 *t = 0;
3b1b01cf 382
fab80407 383 if (0 != strlen (f))
249172c3 384 link_info.fini_function = f;
3b1b01cf 385 }
249172c3
TR
386 break;
387
252b5132
RH
388 case OPTION_AUTOIMP:
389 link_info.static_link = false;
390 break;
391
392 case OPTION_ERNOTOK:
393 force_make_executable = false;
394 break;
395
396 case OPTION_EROK:
397 force_make_executable = true;
398 break;
399
400 case OPTION_EXPORT:
401 gld${EMULATION_NAME}_read_file (optarg, false);
402 break;
403
404 case OPTION_IMPORT:
405 {
406 struct filelist *n;
407 struct filelist **flpp;
408
409 n = (struct filelist *) xmalloc (sizeof (struct filelist));
410 n->next = NULL;
411 n->name = optarg;
412 flpp = &import_files;
413 while (*flpp != NULL)
414 flpp = &(*flpp)->next;
415 *flpp = n;
416 }
417 break;
418
419 case OPTION_LOADMAP:
420 config.map_filename = optarg;
421 break;
422
423 case OPTION_MAXDATA:
3b1b01cf 424 val = strtoull (optarg, &end, 0);
252b5132 425 if (*end != '\0')
fab80407 426 einfo ("%P: warning: ignoring invalid -bmaxdata number %s\n", optarg);
252b5132
RH
427 else
428 maxdata = val;
429 break;
430
431 case OPTION_MAXSTACK:
3b1b01cf 432 val = strtoull (optarg, &end, 0);
252b5132 433 if (*end != '\0')
249172c3
TR
434 einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n",
435 optarg);
252b5132
RH
436 else
437 maxstack = val;
438 break;
439
440 case OPTION_MODTYPE:
441 if (*optarg == 'S')
442 {
443 link_info.shared = true;
444 ++optarg;
445 }
446 if (*optarg == '\0' || optarg[1] == '\0')
447 einfo ("%P: warning: ignoring invalid module type %s\n", optarg);
448 else
449 modtype = (*optarg << 8) | optarg[1];
450 break;
451
452 case OPTION_NOAUTOIMP:
453 link_info.static_link = true;
454 break;
455
456 case OPTION_NOSTRCMPCT:
457 link_info.traditional_format = true;
458 break;
459
460 case OPTION_PD:
461 /* This sets the page that the .data section is supposed to
462 start on. The offset within the page should still be the
463 offset within the file, so we need to build an appropriate
464 expression. */
3b1b01cf 465 val = strtoull (optarg, &end, 0);
252b5132
RH
466 if (*end != '\0')
467 einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg);
468 else
469 {
470 etree_type *t;
471
472 t = exp_binop ('+',
473 exp_intop (val),
474 exp_binop ('&',
475 exp_nameop (NAME, "."),
476 exp_intop (0xfff)));
477 t = exp_binop ('&',
478 exp_binop ('+', t, exp_intop (31)),
249172c3 479 exp_intop (~(bfd_vma) 31));
252b5132
RH
480 lang_section_start (".data", t);
481 }
482 break;
483
484 case OPTION_PT:
485 /* This set the page that the .text section is supposed to start
486 on. The offset within the page should still be the offset
487 within the file. */
3b1b01cf 488 val = strtoull (optarg, &end, 0);
252b5132
RH
489 if (*end != '\0')
490 einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg);
491 else
492 {
493 etree_type *t;
494
495 t = exp_binop ('+',
496 exp_intop (val),
497 exp_nameop (SIZEOF_HEADERS, NULL));
498 t = exp_binop ('&',
499 exp_binop ('+', t, exp_intop (31)),
249172c3 500 exp_intop (~(bfd_vma) 31));
252b5132
RH
501 lang_section_start (".text", t);
502 }
503 break;
504
505 case OPTION_STRCMPCT:
506 link_info.traditional_format = false;
507 break;
508
509 case OPTION_UNIX:
510 unix_ld = true;
511 break;
742aeb63
TR
512
513 case OPTION_32:
514 is_64bit = 0;
515 syscall_mask = 0x77;
516 symbol_mode_mask = 0x0d;
517 break;
518
519 case OPTION_64:
520 is_64bit = 1;
521 syscall_mask = 0xcc;
522 symbol_mode_mask = 0x0e;
523 break;
524
aa67bccf 525 case OPTION_LIBPATH:
cc7e59b2 526 command_line_blibpath = optarg;
aa67bccf
TR
527 break;
528
529 case OPTION_NOLIBPATH:
cc7e59b2 530 command_line_blibpath = NULL;
aa67bccf
TR
531 break;
532
252b5132
RH
533 }
534
535 return 1;
536}
537
538/* This is called when an input file can not be recognized as a BFD
539 object or an archive. If the file starts with #!, we must treat it
540 as an import file. This is for AIX compatibility. */
541
542static boolean
543gld${EMULATION_NAME}_unrecognized_file (entry)
544 lang_input_statement_type *entry;
545{
546 FILE *e;
547 boolean ret;
548
549 e = fopen (entry->filename, FOPEN_RT);
550 if (e == NULL)
551 return false;
552
553 ret = false;
554
555 if (getc (e) == '#' && getc (e) == '!')
556 {
557 struct filelist *n;
558 struct filelist **flpp;
559
560 n = (struct filelist *) xmalloc (sizeof (struct filelist));
561 n->next = NULL;
562 n->name = entry->filename;
563 flpp = &import_files;
564 while (*flpp != NULL)
565 flpp = &(*flpp)->next;
566 *flpp = n;
567
568 ret = true;
569 entry->loaded = true;
570 }
571
572 fclose (e);
573
574 return ret;
575}
576
577/* This is called after the input files have been opened. */
578
579static void
580gld${EMULATION_NAME}_after_open ()
581{
582 boolean r;
583 struct set_info *p;
584
585 /* Call ldctor_build_sets, after pretending that this is a
586 relocateable link. We do this because AIX requires relocation
587 entries for all references to symbols, even in a final
588 executable. Of course, we only want to do this if we are
589 producing an XCOFF output file. */
590 r = link_info.relocateable;
591 if (strstr (bfd_get_target (output_bfd), "xcoff") != NULL)
592 link_info.relocateable = true;
593 ldctor_build_sets ();
594 link_info.relocateable = r;
595
596 /* For each set, record the size, so that the XCOFF backend can
597 output the correct csect length. */
598 for (p = sets; p != (struct set_info *) NULL; p = p->next)
599 {
600 bfd_size_type size;
601
602 /* If the symbol is defined, we may have been invoked from
249172c3
TR
603 collect, and the sets may already have been built, so we do
604 not do anything. */
252b5132
RH
605 if (p->h->type == bfd_link_hash_defined
606 || p->h->type == bfd_link_hash_defweak)
607 continue;
608
609 if (p->reloc != BFD_RELOC_CTOR)
610 {
611 /* Handle this if we need to. */
612 abort ();
613 }
614
615 size = (p->count + 2) * 4;
249172c3 616 if (!bfd_xcoff_link_record_set (output_bfd, &link_info, p->h, size))
252b5132
RH
617 einfo ("%F%P: bfd_xcoff_link_record_set failed: %E\n");
618 }
619}
620
621/* This is called after the sections have been attached to output
622 sections, but before any sizes or addresses have been set. */
623
624static void
625gld${EMULATION_NAME}_before_allocation ()
626{
627 struct filelist *fl;
628 struct export_symbol_list *el;
629 char *libpath;
3b1b01cf 630 asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
252b5132
RH
631 int i;
632
633 /* Handle the import and export files, if any. */
634 for (fl = import_files; fl != NULL; fl = fl->next)
635 gld${EMULATION_NAME}_read_file (fl->name, true);
fab80407
AM
636 for (el = export_symbols; el != NULL; el = el->next)
637 {
638 struct bfd_link_hash_entry *h;
639
640 h = bfd_link_hash_lookup (link_info.hash, el->name, false, false, false);
641 if (h == NULL)
642 einfo ("%P%F: bfd_link_hash_lookup of export symbol failed: %E\n");
249172c3 643 if (!bfd_xcoff_export_symbol (output_bfd, &link_info, h))
fab80407
AM
644 einfo ("%P%F: bfd_xcoff_export_symbol failed: %E\n");
645 }
252b5132
RH
646
647 /* Track down all relocations called for by the linker script (these
648 are typically constructor/destructor entries created by
649 CONSTRUCTORS) and let the backend know it will need to create
650 .loader relocs for them. */
651 lang_for_each_statement (gld${EMULATION_NAME}_find_relocs);
652
aa67bccf
TR
653 /* Precedence of LIBPATH
654 -blibpath: native support always first
655 -rpath: gnu extension
656 -L build from command line -L's */
657 if (command_line_blibpath != NULL)
658 libpath = command_line_blibpath;
659 else if (command_line.rpath != NULL)
252b5132
RH
660 libpath = command_line.rpath;
661 else if (search_head == NULL)
662 libpath = (char *) "";
663 else
664 {
665 size_t len;
666 search_dirs_type *search;
667
668 len = strlen (search_head->name);
669 libpath = xmalloc (len + 1);
670 strcpy (libpath, search_head->name);
671 for (search = search_head->next; search != NULL; search = search->next)
672 {
673 size_t nlen;
674
675 nlen = strlen (search->name);
676 libpath = xrealloc (libpath, len + nlen + 2);
677 libpath[len] = ':';
678 strcpy (libpath + len + 1, search->name);
679 len += nlen + 1;
680 }
681 }
682
683 /* Let the XCOFF backend set up the .loader section. */
69f284c7 684 if (!bfd_xcoff_size_dynamic_sections
e3e942e9 685 (output_bfd, &link_info, libpath, entry_symbol.name, file_align,
69f284c7 686 maxstack, maxdata, gc && !unix_ld ? true : false,
f1f0d9ab
TR
687 modtype, textro ? true : false, unix_ld, special_sections,
688 rtld ? true : false))
252b5132
RH
689 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
690
691 /* Look through the special sections, and put them in the right
692 place in the link ordering. This is especially magic. */
fab80407
AM
693 for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
694 {
695 asection *sec;
696 lang_output_section_statement_type *os;
697 lang_statement_union_type **pls;
698 lang_input_section_type *is;
699 const char *oname;
700 boolean start;
701
702 sec = special_sections[i];
703 if (sec == NULL)
704 continue;
3b1b01cf 705
fab80407 706 /* Remove this section from the list of the output section.
249172c3 707 This assumes we know what the script looks like. */
fab80407
AM
708 is = NULL;
709 os = lang_output_section_find (sec->output_section->name);
249172c3 710 if (os == NULL)
fab80407
AM
711 einfo ("%P%F: can't find output section %s\n",
712 sec->output_section->name);
fab80407
AM
713
714 for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->header.next)
715 {
249172c3
TR
716 if ((*pls)->header.type == lang_input_section_enum
717 && (*pls)->input_section.section == sec)
fab80407 718 {
249172c3 719 is = (lang_input_section_type *) * pls;
fab80407 720 *pls = (*pls)->header.next;
252b5132 721 break;
fab80407
AM
722 }
723
724 if ((*pls)->header.type == lang_wild_statement_enum)
725 {
726 lang_statement_union_type **pwls;
727
728 for (pwls = &(*pls)->wild_statement.children.head;
249172c3 729 *pwls != NULL; pwls = &(*pwls)->header.next)
fab80407
AM
730 {
731
249172c3
TR
732 if ((*pwls)->header.type == lang_input_section_enum
733 && (*pwls)->input_section.section == sec)
fab80407 734 {
249172c3 735 is = (lang_input_section_type *) * pwls;
fab80407
AM
736 *pwls = (*pwls)->header.next;
737 break;
738 }
739 }
740
741 if (is != NULL)
742 break;
743 }
744 }
745
746 if (is == NULL)
747 {
748 einfo ("%P%F: can't find %s in output section\n",
749 bfd_get_section_name (sec->owner, sec));
3b1b01cf 750 }
fab80407
AM
751
752 /* Now figure out where the section should go. */
753 switch (i)
754 {
755
249172c3 756 default: /* to avoid warnings */
fab80407
AM
757 case XCOFF_SPECIAL_SECTION_TEXT:
758 /* _text */
759 oname = ".text";
760 start = true;
3b1b01cf 761 break;
252b5132 762
fab80407
AM
763 case XCOFF_SPECIAL_SECTION_ETEXT:
764 /* _etext */
765 oname = ".text";
766 start = false;
767 break;
252b5132 768
fab80407
AM
769 case XCOFF_SPECIAL_SECTION_DATA:
770 /* _data */
771 oname = ".data";
772 start = true;
773 break;
252b5132 774
fab80407
AM
775 case XCOFF_SPECIAL_SECTION_EDATA:
776 /* _edata */
777 oname = ".data";
778 start = false;
779 break;
780
781 case XCOFF_SPECIAL_SECTION_END:
782 case XCOFF_SPECIAL_SECTION_END2:
783 /* _end and end */
784 oname = ".bss";
785 start = false;
786 break;
787 }
252b5132 788
fab80407 789 os = lang_output_section_find (oname);
252b5132 790
fab80407
AM
791 if (start)
792 {
793 is->header.next = os->children.head;
794 os->children.head = (lang_statement_union_type *) is;
795 }
796 else
797 {
798 is->header.next = NULL;
799 lang_statement_append (&os->children,
800 (lang_statement_union_type *) is,
801 &is->header.next);
802 }
3b1b01cf 803 }
3b1b01cf
TR
804}
805
742aeb63 806static char *
f1f0d9ab 807gld${EMULATION_NAME}_choose_target (argc, argv)
742aeb63
TR
808 int argc;
809 char **argv;
810{
811 int i, j, jmax;
812 static char *from_outside;
813 static char *from_inside;
249172c3
TR
814 static char *argv_to_target[][2] = {
815 {NULL, "${OUTPUT_FORMAT}"},
eb1e0e80
NC
816 {"-b32", "${OUTPUT_FORMAT_32BIT}"},
817 {"-b64", "${OUTPUT_FORMAT_64BIT}"},
249172c3 818 };
742aeb63
TR
819
820 jmax = 3;
821
822 from_outside = getenv (TARGET_ENVIRON);
249172c3 823 if (from_outside != (char *) NULL)
742aeb63
TR
824 return from_outside;
825
826 /* Set to default. */
827 from_inside = argv_to_target[0][1];
828 for (i = 1; i < argc; i++)
829 {
830 for (j = 1; j < jmax; j++)
831 {
832 if (0 == strcmp (argv[i], argv_to_target[j][0]))
833 from_inside = argv_to_target[j][1];
834 }
835 }
249172c3 836
742aeb63
TR
837 return from_inside;
838}
839
249172c3
TR
840/* Returns
841 1 : state changed
842 0 : no change */
843static int
844change_symbol_mode (input)
845 char *input;
3b1b01cf 846{
3b1b01cf 847 char *symbol_mode_string[] = {
249172c3
TR
848 "# 32", /* 0x01 */
849 "# 64", /* 0x02 */
850 "# no32", /* 0x04 */
851 "# no64", /* 0x08 */
3b1b01cf
TR
852 NULL,
853 };
249172c3 854
3b1b01cf
TR
855 unsigned int bit;
856 char *string;
857
249172c3 858 for (bit = 0;; bit++)
fab80407
AM
859 {
860 string = symbol_mode_string[bit];
249172c3 861 if (string == NULL)
fab80407
AM
862 return 0;
863
864 if (0 == strcmp (input, string))
865 {
866 symbol_mode = (1 << bit);
867 return 1;
868 }
3b1b01cf 869 }
3b1b01cf
TR
870 /* should not be here */
871 return 0;
872}
873
249172c3
TR
874/* Returns
875 1 : yes
876 0 : ignore
877 -1 : error, try something else */
878static int
879is_syscall (input, flag)
880 char *input;
881 unsigned int *flag;
3b1b01cf 882{
3b1b01cf
TR
883 unsigned int bit;
884 char *string;
1fdf0249
TR
885
886 struct sc {
887 char *syscall_string;
888 unsigned int flag;
889 } s [] = {
890 { "svc" /* 0x01 */, XCOFF_SYSCALL32 },
891 { "svc32" /* 0x02 */, XCOFF_SYSCALL32 },
892 { "svc3264" /* 0x04 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
893 { "svc64" /* 0x08 */, XCOFF_SYSCALL64 },
894 { "syscall" /* 0x10 */, XCOFF_SYSCALL32 },
895 { "syscall32" /* 0x20 */, XCOFF_SYSCALL32 },
896 { "syscall3264" /* 0x40 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
897 { "syscall64" /* 0x80 */, XCOFF_SYSCALL64 },
898 { NULL, 0 },
3b1b01cf
TR
899 };
900
1fdf0249 901 *flag = 0;
3b1b01cf 902
249172c3
TR
903 for (bit = 0;; bit++)
904 {
905 string = s[bit].syscall_string;
906 if (string == NULL)
907 return -1;
fab80407 908
249172c3
TR
909 if (0 == strcmp (input, string))
910 {
911 if (1 << bit & syscall_mask)
912 {
913 *flag = s[bit].flag;
914 return 1;
915 }
916 else
917 {
918 return 0;
919 }
920 }
252b5132 921 }
3b1b01cf
TR
922 /* should not be here */
923 return -1;
252b5132
RH
924}
925
926/* Read an import or export file. For an import file, this is called
927 by the before_allocation emulation routine. For an export file,
928 this is called by the parse_args emulation routine. */
929
930static void
931gld${EMULATION_NAME}_read_file (filename, import)
932 const char *filename;
933 boolean import;
934{
935 struct obstack *o;
936 FILE *f;
937 int lineno;
938 int c;
939 boolean keep;
940 const char *imppath;
941 const char *impfile;
942 const char *impmember;
943
944 o = (struct obstack *) xmalloc (sizeof (struct obstack));
945 obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
946
947 f = fopen (filename, FOPEN_RT);
948 if (f == NULL)
949 {
950 bfd_set_error (bfd_error_system_call);
951 einfo ("%F%s: %E\n", filename);
952 }
953
954 keep = false;
955
956 imppath = NULL;
957 impfile = NULL;
958 impmember = NULL;
959
960 lineno = 0;
3b1b01cf 961
69f284c7
TR
962 /* Default to 32 and 64 bit mode
963 symbols at top of /lib/syscalls.exp do not have a mode modifier and they
964 are not repeated, assume 64 bit routines also want to use them.
965 See the routine change_symbol_mode for more information. */
966
3b1b01cf
TR
967 symbol_mode = 0x04;
968
252b5132
RH
969 while ((c = getc (f)) != EOF)
970 {
971 char *s;
972 char *symname;
1fdf0249 973 unsigned int syscall_flag = 0;
252b5132
RH
974 bfd_vma address;
975 struct bfd_link_hash_entry *h;
976
977 if (c != '\n')
978 {
979 obstack_1grow (o, c);
980 continue;
981 }
982
983 obstack_1grow (o, '\0');
984 ++lineno;
985
986 s = (char *) obstack_base (o);
3882b010 987 while (ISSPACE (*s))
252b5132 988 ++s;
fab80407
AM
989 if (*s == '\0'
990 || *s == '*'
991 || change_symbol_mode (s)
992 || (*s == '#' && s[1] == ' ')
249172c3 993 || (!import && *s == '#' && s[1] == '!'))
252b5132
RH
994 {
995 obstack_free (o, obstack_base (o));
996 continue;
997 }
998
999 if (*s == '#' && s[1] == '!')
1000 {
1001 s += 2;
3882b010 1002 while (ISSPACE (*s))
252b5132
RH
1003 ++s;
1004 if (*s == '\0')
1005 {
1006 imppath = NULL;
1007 impfile = NULL;
1008 impmember = NULL;
1009 obstack_free (o, obstack_base (o));
1010 }
1011 else if (*s == '(')
1012 einfo ("%F%s%d: #! ([member]) is not supported in import files\n",
1013 filename, lineno);
1014 else
1015 {
1016 char cs;
1017 char *file;
1018
1019 (void) obstack_finish (o);
1020 keep = true;
1021 imppath = s;
1022 file = NULL;
249172c3 1023 while (!ISSPACE (*s) && *s != '(' && *s != '\0')
252b5132
RH
1024 {
1025 if (*s == '/')
1026 file = s + 1;
1027 ++s;
1028 }
1029 if (file != NULL)
1030 {
1031 file[-1] = '\0';
1032 impfile = file;
1033 if (imppath == file - 1)
1034 imppath = "/";
1035 }
1036 else
1037 {
1038 impfile = imppath;
1039 imppath = "";
1040 }
1041 cs = *s;
1042 *s = '\0';
3882b010 1043 while (ISSPACE (cs))
252b5132
RH
1044 {
1045 ++s;
1046 cs = *s;
1047 }
1048 if (cs != '(')
1049 {
1050 impmember = "";
1051 if (cs != '\0')
1052 einfo ("%s:%d: warning: syntax error in import file\n",
1053 filename, lineno);
1054 }
1055 else
1056 {
1057 ++s;
1058 impmember = s;
1059 while (*s != ')' && *s != '\0')
1060 ++s;
1061 if (*s == ')')
1062 *s = '\0';
1063 else
1064 einfo ("%s:%d: warning: syntax error in import file\n",
1065 filename, lineno);
1066 }
1067 }
1068
1069 continue;
1070 }
1071
742aeb63 1072 if (symbol_mode & symbol_mode_mask)
fab80407
AM
1073 {
1074 /* This is a symbol to be imported or exported. */
1075 symname = s;
1fdf0249 1076 syscall_flag = 0;
fab80407
AM
1077 address = (bfd_vma) -1;
1078
249172c3 1079 while (!ISSPACE (*s) && *s != '\0')
fab80407
AM
1080 ++s;
1081 if (*s != '\0')
1082 {
1083 char *se;
3b1b01cf 1084
fab80407 1085 *s++ = '\0';
3b1b01cf 1086
3882b010 1087 while (ISSPACE (*s))
fab80407
AM
1088 ++s;
1089
1090 se = s;
249172c3 1091 while (!ISSPACE (*se) && *se != '\0')
fab80407
AM
1092 ++se;
1093 if (*se != '\0')
1094 {
1095 *se++ = '\0';
3882b010 1096 while (ISSPACE (*se))
fab80407
AM
1097 ++se;
1098 if (*se != '\0')
1099 einfo ("%s%d: warning: syntax error in import/export file\n",
1100 filename, lineno);
1101 }
1102
1103 if (s != se)
1104 {
1105 int status;
1106 char *end;
1107
249172c3 1108 status = is_syscall (s, &syscall_flag);
1fdf0249 1109
249172c3
TR
1110 if (0 > status)
1111 {
1112 /* not a system call, check for address */
1113 address = strtoul (s, &end, 0);
1114 if (*end != '\0')
1115 {
1116 einfo ("%s:%d: warning: syntax error in import/export file\n",
1117 filename, lineno);
1118
1119 }
1120 }
3b1b01cf 1121 }
252b5132 1122 }
3b1b01cf 1123
249172c3 1124 if (!import)
fab80407
AM
1125 {
1126 struct export_symbol_list *n;
1127
1128 ldlang_add_undef (symname);
1129 n = ((struct export_symbol_list *)
1130 xmalloc (sizeof (struct export_symbol_list)));
1131 n->next = export_symbols;
1132 n->name = xstrdup (symname);
fab80407
AM
1133 export_symbols = n;
1134 }
1135 else
1136 {
1137 h = bfd_link_hash_lookup (link_info.hash, symname, false, false,
1138 true);
1139 if (h == NULL || h->type == bfd_link_hash_new)
1140 {
1141 /* We can just ignore attempts to import an unreferenced
1142 symbol. */
1143 }
1144 else
1145 {
249172c3
TR
1146 if (!bfd_xcoff_import_symbol (output_bfd, &link_info, h,
1147 address, imppath, impfile,
1148 impmember, syscall_flag))
fab80407
AM
1149 einfo ("%X%s:%d: failed to import symbol %s: %E\n",
1150 filename, lineno, symname);
1151 }
1152 }
1153 }
252b5132
RH
1154 obstack_free (o, obstack_base (o));
1155 }
fab80407 1156
252b5132
RH
1157 if (obstack_object_size (o) > 0)
1158 {
fab80407
AM
1159 einfo ("%s:%d: warning: ignoring unterminated last line\n",
1160 filename, lineno);
1161 obstack_free (o, obstack_base (o));
1162 }
252b5132 1163
249172c3 1164 if (!keep)
fab80407
AM
1165 {
1166 obstack_free (o, NULL);
1167 free (o);
252b5132 1168 }
fab80407 1169}
252b5132
RH
1170
1171/* This routine saves us from worrying about declaring free. */
1172
1173static void
1174gld${EMULATION_NAME}_free (p)
1175 PTR p;
1176{
1177 free (p);
1178}
1179
1180/* This is called by the before_allocation routine via
1181 lang_for_each_statement. It looks for relocations and assignments
1182 to symbols. */
1183
1184static void
1185gld${EMULATION_NAME}_find_relocs (s)
1186 lang_statement_union_type *s;
1187{
1188 if (s->header.type == lang_reloc_statement_enum)
1189 {
1190 lang_reloc_statement_type *rs;
1191
1192 rs = &s->reloc_statement;
1193 if (rs->name == NULL)
1194 einfo ("%F%P: only relocations against symbols are permitted\n");
249172c3 1195 if (!bfd_xcoff_link_count_reloc (output_bfd, &link_info, rs->name))
252b5132
RH
1196 einfo ("%F%P: bfd_xcoff_link_count_reloc failed: %E\n");
1197 }
1198
1199 if (s->header.type == lang_assignment_statement_enum)
1200 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1201}
1202
1203/* Look through an expression for an assignment statement. */
1204
1205static void
1206gld${EMULATION_NAME}_find_exp_assignment (exp)
1207 etree_type *exp;
1208{
1209 struct bfd_link_hash_entry *h;
1210
1211 switch (exp->type.node_class)
1212 {
1213 case etree_provide:
1214 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
1215 false, false, false);
1216 if (h == NULL)
1217 break;
1218 /* Fall through. */
1219 case etree_assign:
1220 if (strcmp (exp->assign.dst, ".") != 0)
1221 {
249172c3
TR
1222 if (!bfd_xcoff_record_link_assignment (output_bfd, &link_info,
1223 exp->assign.dst))
252b5132
RH
1224 einfo ("%P%F: failed to record assignment to %s: %E\n",
1225 exp->assign.dst);
1226 }
1227 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1228 break;
1229
1230 case etree_binary:
1231 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1232 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1233 break;
1234
1235 case etree_trinary:
1236 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1237 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1238 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1239 break;
1240
1241 case etree_unary:
1242 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1243 break;
1244
1245 default:
1246 break;
1247 }
1248}
1249
1250static char *
fab80407 1251gld${EMULATION_NAME}_get_script (isfile)
252b5132
RH
1252 int *isfile;
1253EOF
1254
1255if test -n "$COMPILE_IN"
1256then
1257# Scripts compiled in.
1258
1259# sed commands to quote an ld script as a C string.
5f642101 1260sc="-f ${srcdir}/emultempl/ostring.sed"
252b5132
RH
1261
1262cat >>e${EMULATION_NAME}.c <<EOF
fab80407 1263{
252b5132
RH
1264 *isfile = 0;
1265
1266 if (link_info.relocateable == true && config.build_constructors == true)
1267 return
1268EOF
1269sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1270echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1271sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1272echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1273sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1274echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1275sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1276echo ' ; else return' >> e${EMULATION_NAME}.c
1277sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1278echo '; }' >> e${EMULATION_NAME}.c
1279
1280else
1281# Scripts read from the filesystem.
1282
1283cat >>e${EMULATION_NAME}.c <<EOF
fab80407 1284{
252b5132
RH
1285 *isfile = 1;
1286
1287 if (link_info.relocateable == true && config.build_constructors == true)
1288 return "ldscripts/${EMULATION_NAME}.xu";
1289 else if (link_info.relocateable == true)
1290 return "ldscripts/${EMULATION_NAME}.xr";
1291 else if (!config.text_read_only)
1292 return "ldscripts/${EMULATION_NAME}.xbn";
1293 else if (!config.magic_demand_paged)
1294 return "ldscripts/${EMULATION_NAME}.xn";
1295 else
1296 return "ldscripts/${EMULATION_NAME}.x";
1297}
1298EOF
1299
1300fi
1301
1302cat >>e${EMULATION_NAME}.c <<EOF
1303
9a4c7f16 1304static void
f1f0d9ab 1305gld${EMULATION_NAME}_create_output_section_statements ()
9a4c7f16
TR
1306{
1307 /* __rtinit */
1308 if ((bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour)
69f284c7
TR
1309 && (link_info.init_function != NULL
1310 || link_info.fini_function != NULL
1311 || rtld == true))
9a4c7f16 1312 {
9a4c7f16
TR
1313 initfini_file = lang_add_input_file ("initfini",
1314 lang_input_file_is_file_enum,
1315 NULL);
1316
1317 initfini_file->the_bfd = bfd_create ("initfini", output_bfd);
1318 if (initfini_file->the_bfd == NULL
1319 || ! bfd_set_arch_mach (initfini_file->the_bfd,
1320 bfd_get_arch (output_bfd),
1321 bfd_get_mach (output_bfd)))
1322 {
1323 einfo ("%X%P: can not create BFD %E\n");
1324 return;
1325 }
1326
1327 /* Call backend to fill in the rest */
1328 if (false == bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd,
1329 link_info.init_function,
69f284c7
TR
1330 link_info.fini_function,
1331 rtld))
9a4c7f16
TR
1332 {
1333 einfo ("%X%P: can not create BFD %E\n");
1334 return;
1335 }
69f284c7
TR
1336
1337 /* __rtld defined in /lib/librtl.a */
1338 if (true == rtld)
1339 lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL);
9a4c7f16
TR
1340 }
1341}
1342
f1f0d9ab
TR
1343static void
1344gld${EMULATION_NAME}_set_output_arch ()
1345{
1346 bfd_set_arch_mach (output_bfd,
1347 bfd_xcoff_architecture (output_bfd),
1348 bfd_xcoff_machine (output_bfd));
1349
1350 ldfile_output_architecture = bfd_get_arch (output_bfd);
1351 ldfile_output_machine = bfd_get_mach (output_bfd);
1352 ldfile_output_machine_name = bfd_printable_name (output_bfd);
1353}
1354
249172c3 1355struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
252b5132
RH
1356 gld${EMULATION_NAME}_before_parse,
1357 syslib_default,
1358 hll_default,
1359 after_parse_default,
1360 gld${EMULATION_NAME}_after_open,
1361 after_allocation_default,
f1f0d9ab
TR
1362 gld${EMULATION_NAME}_set_output_arch,
1363 gld${EMULATION_NAME}_choose_target,
252b5132
RH
1364 gld${EMULATION_NAME}_before_allocation,
1365 gld${EMULATION_NAME}_get_script,
1366 "${EMULATION_NAME}",
1367 "${OUTPUT_FORMAT}",
249172c3 1368 0, /* finish */
9a4c7f16 1369 gld${EMULATION_NAME}_create_output_section_statements,
249172c3
TR
1370 0, /* open_dynamic_archive */
1371 0, /* place_orphan */
1372 0, /* set_symbols */
252b5132 1373 gld${EMULATION_NAME}_parse_args,
40d109bf 1374 gld${EMULATION_NAME}_unrecognized_file,
249172c3
TR
1375 NULL, /* list_options */
1376 NULL, /* recognized_file */
1377 NULL, /* find potential_libraries */
fac1652d 1378 NULL /* new_vers_pattern */
252b5132
RH
1379};
1380EOF