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