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