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