lang_input_statement_type next pointers
[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}
82704155 12 Copyright (C) 1991-2019 Free Software Foundation, Inc.
252b5132
RH
13 Written by Steve Chamberlain <sac@cygnus.com>
14 AIX support by Ian Lance Taylor <ian@cygnus.com>
3b1b01cf 15 AIX 64 bit support by Tom Rix <trix@redhat.com>
252b5132 16
f96b4a7b 17 This file is part of the GNU Binutils.
252b5132 18
f96b4a7b
NC
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.
252b5132 23
f96b4a7b
NC
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.
252b5132 28
f96b4a7b
NC
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. */
252b5132
RH
33
34#define TARGET_IS_${EMULATION_NAME}
35
252b5132 36#include "sysdep.h"
3db64b00 37#include "bfd.h"
252b5132 38#include "libiberty.h"
3882b010 39#include "safe-ctype.h"
252b5132
RH
40#include "getopt.h"
41#include "obstack.h"
42#include "bfdlink.h"
43
252b5132
RH
44#include "ld.h"
45#include "ldmain.h"
252b5132
RH
46#include "ldmisc.h"
47#include "ldexp.h"
48#include "ldlang.h"
20713691
AM
49#include "ldfile.h"
50#include "ldemul.h"
252b5132 51#include "ldctor.h"
df2a7313 52#include <ldgram.h>
252b5132 53
3b1b01cf
TR
54#include "coff/internal.h"
55#include "coff/xcoff.h"
f1f0d9ab
TR
56#include "libcoff.h"
57#include "libxcoff.h"
3b1b01cf 58
0c7a8e5a
AM
59static void gld${EMULATION_NAME}_read_file (const char *, bfd_boolean);
60static void gld${EMULATION_NAME}_free (void *);
61static void gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *);
62static void gld${EMULATION_NAME}_find_exp_assignment (etree_type *);
63
252b5132
RH
64
65/* The file alignment required for each section. */
66static unsigned long file_align;
67
68/* The maximum size the stack is permitted to grow. This is stored in
69 the a.out header. */
70static unsigned long maxstack;
71
72/* The maximum data size. This is stored in the a.out header. */
73static unsigned long maxdata;
74
75/* Whether to perform garbage collection. */
76static int gc = 1;
77
78/* The module type to use. */
79static unsigned short modtype = ('1' << 8) | 'L';
80
81/* Whether the .text section must be read-only (i.e., no relocs
82 permitted). */
83static int textro;
84
b64232cc
RS
85/* A mask of XCOFF_EXPALL and XCOFF_EXPFULL flags, as set by their
86 associated -b and -bno options. */
87static unsigned int auto_export_flags;
88
89/* A mask of auto_export_flags bits that were explicitly set on the
90 command line. */
91static unsigned int explicit_auto_export_flags;
92
252b5132
RH
93/* Whether to implement Unix like linker semantics. */
94static int unix_ld;
95
96/* Structure used to hold import file list. */
97
98struct filelist
99{
100 struct filelist *next;
101 const char *name;
102};
103
104/* List of import files. */
105static struct filelist *import_files;
106
107/* List of export symbols read from the export files. */
108
109struct export_symbol_list
110{
111 struct export_symbol_list *next;
112 const char *name;
252b5132
RH
113};
114
115static struct export_symbol_list *export_symbols;
116
3b1b01cf
TR
117/* Maintains the 32 or 64 bit mode state of import file */
118static unsigned int symbol_mode = 0x04;
119
742aeb63
TR
120/* Which symbol modes are valid */
121static unsigned int symbol_mode_mask = 0x0d;
122
123/* Whether this is a 64 bit link */
124static int is_64bit = 0;
125
126/* Which syscalls from import file are valid */
127static unsigned int syscall_mask = 0x77;
128
9a4c7f16
TR
129/* fake file for -binitfini support */
130static lang_input_statement_type *initfini_file;
69f284c7 131
7fc44b9c 132/* Whether to do run time linking
ca10c62d 133 -brtl enables, -bnortl and -bnortllib disable. */
f1f0d9ab 134static int rtld;
69f284c7 135
aa67bccf
TR
136/* Explicit command line library path, -blibpath */
137static char *command_line_blibpath = NULL;
138
252b5132
RH
139/* This routine is called before anything else is done. */
140
141static void
0c7a8e5a 142gld${EMULATION_NAME}_before_parse (void)
252b5132 143{
5e2f1575 144 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
f1f0d9ab 145
66be1055 146 input_flags.dynamic = TRUE;
b34976b6 147 config.has_shared = TRUE;
3b1b01cf 148
9a4c7f16
TR
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
7fc44b9c 151 state flag that lets the backend know that -binitfini has been done. */
9a4c7f16 152
3b1b01cf
TR
153 link_info.init_function = NULL;
154 link_info.fini_function = NULL;
252b5132
RH
155}
156
157/* Handle AIX specific options. */
158
3bcf5557 159enum
249172c3 160 {
3b1b01cf 161 OPTION_IGNORE = 300,
fab80407
AM
162 OPTION_AUTOIMP,
163 OPTION_ERNOTOK,
164 OPTION_EROK,
b64232cc
RS
165 OPTION_EXPALL,
166 OPTION_EXPFULL,
fab80407
AM
167 OPTION_EXPORT,
168 OPTION_IMPORT,
169 OPTION_INITFINI,
170 OPTION_LOADMAP,
171 OPTION_MAXDATA,
172 OPTION_MAXSTACK,
173 OPTION_MODTYPE,
174 OPTION_NOAUTOIMP,
b64232cc
RS
175 OPTION_NOEXPALL,
176 OPTION_NOEXPFULL,
fab80407
AM
177 OPTION_NOSTRCMPCT,
178 OPTION_PD,
179 OPTION_PT,
180 OPTION_STRCMPCT,
742aeb63
TR
181 OPTION_UNIX,
182 OPTION_32,
183 OPTION_64,
aa67bccf
TR
184 OPTION_LIBPATH,
185 OPTION_NOLIBPATH,
3b1b01cf
TR
186 };
187
3bcf5557 188static void
0c7a8e5a
AM
189gld${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)
3bcf5557
AM
192{
193 static const char xtra_short[] = "D:H:KT:z";
194 static const struct option xtra_long[] = {
9a4c7f16
TR
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.
7fc44b9c 199
9a4c7f16
TR
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. */
3b1b01cf 203
252b5132
RH
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},
b64232cc
RS
214 {"bexpall", no_argument, NULL, OPTION_EXPALL},
215 {"bexpfull", no_argument, NULL, OPTION_EXPFULL},
252b5132 216 {"bexport", required_argument, NULL, OPTION_EXPORT},
ced323bd 217 {"bbigtoc", no_argument, NULL, OPTION_IGNORE},
252b5132
RH
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},
3b1b01cf 224 {"binitfini", required_argument, NULL, OPTION_INITFINI},
252b5132
RH
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},
b64232cc
RS
232 {"bnoexpall", no_argument, NULL, OPTION_NOEXPALL},
233 {"bnoexpfull", no_argument, NULL, OPTION_NOEXPFULL},
252b5132
RH
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},
69f284c7 244 {"brtl", no_argument, &rtld, 1},
ca10c62d
TR
245 {"bnortl", no_argument, &rtld, 0},
246 {"bnortllib", no_argument, &rtld, 0},
252b5132
RH
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},
742aeb63
TR
251 {"b32", no_argument, NULL, OPTION_32},
252 {"b64", no_argument, NULL, OPTION_64},
252b5132
RH
253 {"static", no_argument, NULL, OPTION_NOAUTOIMP},
254 {"unix", no_argument, NULL, OPTION_UNIX},
aa67bccf
TR
255 {"blibpath", required_argument, NULL, OPTION_LIBPATH},
256 {"bnolibpath", required_argument, NULL, OPTION_NOLIBPATH},
252b5132
RH
257 {NULL, no_argument, NULL, 0}
258 };
259
a72173de 260 /* Options supported by the AIX linker which we do not support:
252b5132
RH
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
3bcf5557
AM
269 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
270 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
0c7a8e5a
AM
271 *longopts = xrealloc (*longopts,
272 nl * sizeof (struct option) + sizeof (xtra_long));
3bcf5557
AM
273 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
274}
275
276static bfd_boolean
0c7a8e5a 277gld${EMULATION_NAME}_parse_args (int argc, char **argv)
3bcf5557
AM
278{
279 int indx;
280
252b5132
RH
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;
fab80407 285 if (indx == 0)
249172c3 286 indx = 1;
fab80407 287
0112cd26 288 if (indx < argc && CONST_STRNEQ (argv[indx], "-b"))
fab80407
AM
289 {
290 char *s;
291
292 for (s = argv[indx]; *s != '\0'; s++)
293 {
294 if (*s == ':')
295 {
296 *s = '=';
297 break;
298 }
299 }
252b5132 300 }
3bcf5557
AM
301 return FALSE;
302}
3b1b01cf 303
a72173de
TG
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
308static void
309read_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 {
d003af55 323 einfo (_("%F%P: cannot open %s\n"), filename);
a72173de
TG
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')
6c19b93b 348 b++;
a72173de
TG
349
350 /* Stop if end of buffer. */
351 if (b == buffer + len)
6c19b93b 352 break;
a72173de
TG
353
354 /* Eat any byte until end of line. */
355 for (e = b; *e != '\0'; e++)
6c19b93b
AM
356 if (*e == '\n' || *e == '\r')
357 break;
a72173de
TG
358
359 /* Replace end of line by nul. */
360 if (*e != '\0')
6c19b93b 361 *e++ = '\0';
e4492aa0 362
a72173de 363 if (b != e)
6c19b93b 364 lang_add_input_file (b, lang_input_file_is_search_file_enum, NULL);
a72173de
TG
365 b = e;
366 }
367 return;
368
369 error:
d003af55 370 einfo (_("%F%P: cannot read %s\n"), optarg);
a72173de
TG
371 fclose (f);
372}
373
3bcf5557 374static bfd_boolean
0c7a8e5a 375gld${EMULATION_NAME}_handle_option (int optc)
3bcf5557
AM
376{
377 bfd_signed_vma val;
378 const char *end;
252b5132
RH
379
380 switch (optc)
381 {
252b5132 382 default:
3bcf5557 383 return FALSE;
252b5132
RH
384
385 case 0:
386 /* Long option which just sets a flag. */
387 break;
388
a72173de
TG
389 case 'f':
390 /* This overrides --auxiliary. This option specifies a file containing
6c19b93b 391 a list of input files. */
a72173de
TG
392 read_file_list (optarg);
393 break;
394
252b5132 395 case 'D':
c89e8944 396 val = bfd_scan_vma (optarg, &end, 0);
252b5132 397 if (*end != '\0')
d003af55 398 einfo (_("%P: warning: ignoring invalid -D number %s\n"), optarg);
252b5132 399 else if (val != -1)
7a5df8d0 400 lang_section_start (".data", exp_intop (val), NULL);
252b5132
RH
401 break;
402
403 case 'H':
c89e8944 404 val = bfd_scan_vma (optarg, &end, 0);
249172c3 405 if (*end != '\0' || (val & (val - 1)) != 0)
d003af55 406 einfo (_("%P: warning: ignoring invalid -H number %s\n"), optarg);
252b5132
RH
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
7fc44b9c
AM
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. */
c89e8944 422 val = bfd_scan_vma (optarg, &end, 0);
252b5132 423 if (*end != '\0')
3bcf5557 424 return FALSE;
7a5df8d0 425 lang_section_start (".text", exp_intop (val), NULL);
252b5132
RH
426 break;
427
428 case OPTION_IGNORE:
429 break;
430
fab80407
AM
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))
249172c3 456 link_info.init_function = i;
3b1b01cf 457
fab80407
AM
458 f = t;
459 while (*t && ':' != *t)
460 t++;
461 *t = 0;
3b1b01cf 462
fab80407 463 if (0 != strlen (f))
249172c3 464 link_info.fini_function = f;
3b1b01cf 465 }
249172c3 466 break;
7fc44b9c 467
252b5132 468 case OPTION_AUTOIMP:
b34976b6 469 link_info.static_link = FALSE;
252b5132
RH
470 break;
471
472 case OPTION_ERNOTOK:
858ef0ce
RS
473 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
474 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
252b5132
RH
475 break;
476
477 case OPTION_EROK:
858ef0ce
RS
478 link_info.unresolved_syms_in_objects = RM_IGNORE;
479 link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
252b5132
RH
480 break;
481
b64232cc
RS
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
252b5132 492 case OPTION_EXPORT:
b34976b6 493 gld${EMULATION_NAME}_read_file (optarg, FALSE);
252b5132
RH
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:
c89e8944 516 val = bfd_scan_vma (optarg, &end, 0);
252b5132 517 if (*end != '\0')
d003af55
AM
518 einfo (_("%P: warning: ignoring invalid -bmaxdata number %s\n"),
519 optarg);
252b5132
RH
520 else
521 maxdata = val;
522 break;
523
524 case OPTION_MAXSTACK:
c89e8944 525 val = bfd_scan_vma (optarg, &end, 0);
252b5132 526 if (*end != '\0')
d003af55 527 einfo (_("%P: warning: ignoring invalid -bmaxstack number %s\n"),
249172c3 528 optarg);
252b5132
RH
529 else
530 maxstack = val;
531 break;
532
533 case OPTION_MODTYPE:
534 if (*optarg == 'S')
535 {
0e1862bb 536 link_info.type = type_dll;
252b5132
RH
537 ++optarg;
538 }
539 if (*optarg == '\0' || optarg[1] == '\0')
d003af55 540 einfo (_("%P: warning: ignoring invalid module type %s\n"), optarg);
252b5132
RH
541 else
542 modtype = (*optarg << 8) | optarg[1];
543 break;
544
545 case OPTION_NOAUTOIMP:
b34976b6 546 link_info.static_link = TRUE;
252b5132
RH
547 break;
548
b64232cc
RS
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
252b5132 559 case OPTION_NOSTRCMPCT:
b34976b6 560 link_info.traditional_format = TRUE;
252b5132
RH
561 break;
562
563 case OPTION_PD:
564 /* This sets the page that the .data section is supposed to
7fc44b9c
AM
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. */
c89e8944 568 val = bfd_scan_vma (optarg, &end, 0);
252b5132 569 if (*end != '\0')
d003af55 570 einfo (_("%P: warning: ignoring invalid -pD number %s\n"), optarg);
252b5132
RH
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)),
249172c3 582 exp_intop (~(bfd_vma) 31));
7a5df8d0 583 lang_section_start (".data", t, NULL);
252b5132
RH
584 }
585 break;
586
587 case OPTION_PT:
588 /* This set the page that the .text section is supposed to start
7fc44b9c
AM
589 on. The offset within the page should still be the offset
590 within the file. */
c89e8944 591 val = bfd_scan_vma (optarg, &end, 0);
252b5132 592 if (*end != '\0')
d003af55 593 einfo (_("%P: warning: ignoring invalid -pT number %s\n"), optarg);
252b5132
RH
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)),
249172c3 603 exp_intop (~(bfd_vma) 31));
7a5df8d0 604 lang_section_start (".text", t, NULL);
252b5132
RH
605 }
606 break;
607
608 case OPTION_STRCMPCT:
b34976b6 609 link_info.traditional_format = FALSE;
252b5132
RH
610 break;
611
612 case OPTION_UNIX:
b34976b6 613 unix_ld = TRUE;
252b5132 614 break;
742aeb63
TR
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
aa67bccf 628 case OPTION_LIBPATH:
cc7e59b2 629 command_line_blibpath = optarg;
aa67bccf
TR
630 break;
631
632 case OPTION_NOLIBPATH:
cc7e59b2 633 command_line_blibpath = NULL;
aa67bccf
TR
634 break;
635
252b5132
RH
636 }
637
3bcf5557 638 return TRUE;
252b5132
RH
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
b34976b6 645static bfd_boolean
0c7a8e5a 646gld${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry)
252b5132
RH
647{
648 FILE *e;
b34976b6 649 bfd_boolean ret;
252b5132
RH
650
651 e = fopen (entry->filename, FOPEN_RT);
652 if (e == NULL)
b34976b6 653 return FALSE;
252b5132 654
b34976b6 655 ret = FALSE;
252b5132
RH
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
b34976b6 670 ret = TRUE;
66be1055 671 entry->flags.loaded = TRUE;
252b5132
RH
672 }
673
674 fclose (e);
675
676 return ret;
677}
678
679/* This is called after the input files have been opened. */
680
681static void
0c7a8e5a 682gld${EMULATION_NAME}_after_open (void)
252b5132 683{
0e1862bb 684 enum output_type t;
252b5132
RH
685 struct set_info *p;
686
5c3049d2
AM
687 after_open_default ();
688
252b5132 689 /* Call ldctor_build_sets, after pretending that this is a
1049f94e 690 relocatable link. We do this because AIX requires relocation
252b5132
RH
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. */
0e1862bb 694 t = link_info.type;
f13a99db 695 if (strstr (bfd_get_target (link_info.output_bfd), "xcoff") != NULL)
0e1862bb 696 link_info.type = type_relocatable;
252b5132 697 ldctor_build_sets ();
0e1862bb 698 link_info.type = t;
252b5132
RH
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
7fc44b9c
AM
707 collect, and the sets may already have been built, so we do
708 not do anything. */
252b5132
RH
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;
f13a99db
AM
720 if (!bfd_xcoff_link_record_set (link_info.output_bfd, &link_info,
721 p->h, size))
d003af55 722 einfo (_("%F%P: bfd_xcoff_link_record_set failed: %E\n"));
252b5132
RH
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
729static void
0c7a8e5a 730gld${EMULATION_NAME}_before_allocation (void)
252b5132
RH
731{
732 struct filelist *fl;
733 struct export_symbol_list *el;
734 char *libpath;
3b1b01cf 735 asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
9ec59d51
RS
736 static const char *const must_keep_sections[] = {
737 ".text",
738 ".data",
739 ".bss"
740 };
b64232cc 741 unsigned int i, flags;
252b5132
RH
742
743 /* Handle the import and export files, if any. */
744 for (fl = import_files; fl != NULL; fl = fl->next)
b34976b6 745 gld${EMULATION_NAME}_read_file (fl->name, TRUE);
fab80407
AM
746 for (el = export_symbols; el != NULL; el = el->next)
747 {
748 struct bfd_link_hash_entry *h;
749
b34976b6 750 h = bfd_link_hash_lookup (link_info.hash, el->name, FALSE, FALSE, FALSE);
fab80407 751 if (h == NULL)
df5f2391 752 einfo (_("%F%P: bfd_link_hash_lookup of export symbol failed: %E\n"));
f13a99db 753 if (!bfd_xcoff_export_symbol (link_info.output_bfd, &link_info, h))
df5f2391 754 einfo (_("%F%P: bfd_xcoff_export_symbol failed: %E\n"));
fab80407 755 }
252b5132
RH
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
aa67bccf 763 /* Precedence of LIBPATH
7fc44b9c
AM
764 -blibpath: native support always first
765 -rpath: gnu extension
766 -L build from command line -L's */
aa67bccf
TR
767 if (command_line_blibpath != NULL)
768 libpath = command_line_blibpath;
769 else if (command_line.rpath != NULL)
252b5132
RH
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
057cac08
NC
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)
252b5132 782 {
057cac08
NC
783 const char * name = search_head->name;
784 size_t ld_sysroot_len = strlen (ld_sysroot);
252b5132 785
057cac08
NC
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 }
252b5132
RH
824 }
825 }
826
b64232cc
RS
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
252b5132 832 /* Let the XCOFF backend set up the .loader section. */
7fc44b9c 833 if (!bfd_xcoff_size_dynamic_sections
f13a99db 834 (link_info.output_bfd, &link_info, libpath, entry_symbol.name, file_align,
b34976b6 835 maxstack, maxdata, gc && !unix_ld ? TRUE : FALSE,
b64232cc 836 modtype, textro ? TRUE : FALSE, flags, special_sections,
b34976b6 837 rtld ? TRUE : FALSE))
df5f2391 838 einfo (_("%F%P: failed to set dynamic section sizes: %E\n"));
252b5132
RH
839
840 /* Look through the special sections, and put them in the right
841 place in the link ordering. This is especially magic. */
fab80407
AM
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;
b34976b6 849 bfd_boolean start;
fab80407
AM
850
851 sec = special_sections[i];
852 if (sec == NULL)
853 continue;
3b1b01cf 854
fab80407 855 /* Remove this section from the list of the output section.
7fc44b9c 856 This assumes we know what the script looks like. */
fab80407 857 is = NULL;
24ef1aa7 858 os = lang_output_section_get (sec->output_section);
7fc44b9c 859 if (os == NULL)
df5f2391 860 einfo (_("%F%P: can't find output section %s\n"),
fab80407 861 sec->output_section->name);
fab80407
AM
862
863 for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->header.next)
864 {
7fc44b9c 865 if ((*pls)->header.type == lang_input_section_enum
249172c3 866 && (*pls)->input_section.section == sec)
fab80407 867 {
249172c3 868 is = (lang_input_section_type *) * pls;
fab80407 869 *pls = (*pls)->header.next;
252b5132 870 break;
fab80407
AM
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;
249172c3 878 *pwls != NULL; pwls = &(*pwls)->header.next)
fab80407
AM
879 {
880
7fc44b9c 881 if ((*pwls)->header.type == lang_input_section_enum
249172c3 882 && (*pwls)->input_section.section == sec)
fab80407 883 {
249172c3 884 is = (lang_input_section_type *) * pwls;
fab80407
AM
885 *pwls = (*pwls)->header.next;
886 break;
887 }
888 }
889
890 if (is != NULL)
891 break;
892 }
893 }
894
895 if (is == NULL)
896 {
df5f2391 897 einfo (_("%F%P: can't find %s in output section\n"),
fab80407 898 bfd_get_section_name (sec->owner, sec));
3b1b01cf 899 }
fab80407
AM
900
901 /* Now figure out where the section should go. */
902 switch (i)
903 {
904
249172c3 905 default: /* to avoid warnings */
fab80407
AM
906 case XCOFF_SPECIAL_SECTION_TEXT:
907 /* _text */
908 oname = ".text";
b34976b6 909 start = TRUE;
3b1b01cf 910 break;
252b5132 911
fab80407
AM
912 case XCOFF_SPECIAL_SECTION_ETEXT:
913 /* _etext */
914 oname = ".text";
b34976b6 915 start = FALSE;
fab80407 916 break;
252b5132 917
fab80407
AM
918 case XCOFF_SPECIAL_SECTION_DATA:
919 /* _data */
920 oname = ".data";
b34976b6 921 start = TRUE;
fab80407 922 break;
252b5132 923
fab80407
AM
924 case XCOFF_SPECIAL_SECTION_EDATA:
925 /* _edata */
926 oname = ".data";
b34976b6 927 start = FALSE;
fab80407
AM
928 break;
929
930 case XCOFF_SPECIAL_SECTION_END:
931 case XCOFF_SPECIAL_SECTION_END2:
932 /* _end and end */
933 oname = ".bss";
b34976b6 934 start = FALSE;
fab80407
AM
935 break;
936 }
252b5132 937
fab80407 938 os = lang_output_section_find (oname);
252b5132 939
fab80407
AM
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;
36983a93
AM
948 *os->children.tail = (lang_statement_union_type *) is;
949 os->children.tail = &is->header.next;
fab80407 950 }
3b1b01cf 951 }
8423293d 952
9ec59d51
RS
953 /* Executables and shared objects must always have .text, .data
954 and .bss output sections, so that the header can refer to them.
955 The kernel refuses to load objects that have missing sections. */
0e1862bb 956 if (!bfd_link_relocatable (&link_info))
9ec59d51
RS
957 for (i = 0; i < ARRAY_SIZE (must_keep_sections); i++)
958 {
959 asection *sec;
960
961 sec = bfd_get_section_by_name (link_info.output_bfd,
962 must_keep_sections[i]);
963 if (sec == NULL)
d003af55
AM
964 einfo (_("%P: can't find required output section %s\n"),
965 must_keep_sections[i]);
9ec59d51
RS
966 else
967 sec->flags |= SEC_KEEP;
968 }
969
1e035701 970 before_allocation_default ();
3b1b01cf
TR
971}
972
742aeb63 973static char *
0c7a8e5a 974gld${EMULATION_NAME}_choose_target (int argc, char **argv)
742aeb63
TR
975{
976 int i, j, jmax;
977 static char *from_outside;
978 static char *from_inside;
7fc44b9c 979 static char *argv_to_target[][2] = {
249172c3 980 {NULL, "${OUTPUT_FORMAT}"},
eb1e0e80
NC
981 {"-b32", "${OUTPUT_FORMAT_32BIT}"},
982 {"-b64", "${OUTPUT_FORMAT_64BIT}"},
249172c3 983 };
742aeb63
TR
984
985 jmax = 3;
986
987 from_outside = getenv (TARGET_ENVIRON);
249172c3 988 if (from_outside != (char *) NULL)
742aeb63
TR
989 return from_outside;
990
991 /* Set to default. */
992 from_inside = argv_to_target[0][1];
993 for (i = 1; i < argc; i++)
994 {
7fc44b9c 995 for (j = 1; j < jmax; j++)
742aeb63
TR
996 {
997 if (0 == strcmp (argv[i], argv_to_target[j][0]))
998 from_inside = argv_to_target[j][1];
999 }
1000 }
249172c3 1001
742aeb63
TR
1002 return from_inside;
1003}
1004
7fc44b9c 1005/* Returns
249172c3
TR
1006 1 : state changed
1007 0 : no change */
7fc44b9c 1008static int
0c7a8e5a 1009change_symbol_mode (char *input)
3b1b01cf 1010{
3b1b01cf 1011 char *symbol_mode_string[] = {
249172c3
TR
1012 "# 32", /* 0x01 */
1013 "# 64", /* 0x02 */
1014 "# no32", /* 0x04 */
1015 "# no64", /* 0x08 */
3b1b01cf
TR
1016 NULL,
1017 };
249172c3 1018
3b1b01cf
TR
1019 unsigned int bit;
1020 char *string;
1021
249172c3 1022 for (bit = 0;; bit++)
fab80407
AM
1023 {
1024 string = symbol_mode_string[bit];
249172c3 1025 if (string == NULL)
fab80407
AM
1026 return 0;
1027
1028 if (0 == strcmp (input, string))
1029 {
1030 symbol_mode = (1 << bit);
1031 return 1;
1032 }
3b1b01cf 1033 }
3b1b01cf
TR
1034 /* should not be here */
1035 return 0;
1036}
1037
7fc44b9c 1038/* Returns
249172c3
TR
1039 1 : yes
1040 0 : ignore
1041 -1 : error, try something else */
7fc44b9c 1042static int
0c7a8e5a 1043is_syscall (char *input, unsigned int *flag)
3b1b01cf 1044{
3b1b01cf
TR
1045 unsigned int bit;
1046 char *string;
7fc44b9c 1047
1fdf0249
TR
1048 struct sc {
1049 char *syscall_string;
1050 unsigned int flag;
1051 } s [] = {
1052 { "svc" /* 0x01 */, XCOFF_SYSCALL32 },
1053 { "svc32" /* 0x02 */, XCOFF_SYSCALL32 },
1054 { "svc3264" /* 0x04 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
1055 { "svc64" /* 0x08 */, XCOFF_SYSCALL64 },
1056 { "syscall" /* 0x10 */, XCOFF_SYSCALL32 },
1057 { "syscall32" /* 0x20 */, XCOFF_SYSCALL32 },
1058 { "syscall3264" /* 0x40 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
1059 { "syscall64" /* 0x80 */, XCOFF_SYSCALL64 },
1060 { NULL, 0 },
3b1b01cf
TR
1061 };
1062
1fdf0249 1063 *flag = 0;
3b1b01cf 1064
7fc44b9c 1065 for (bit = 0;; bit++)
249172c3
TR
1066 {
1067 string = s[bit].syscall_string;
7fc44b9c 1068 if (string == NULL)
249172c3 1069 return -1;
fab80407 1070
7fc44b9c 1071 if (0 == strcmp (input, string))
249172c3 1072 {
7fc44b9c 1073 if (1 << bit & syscall_mask)
249172c3
TR
1074 {
1075 *flag = s[bit].flag;
1076 return 1;
7fc44b9c
AM
1077 }
1078 else
249172c3
TR
1079 {
1080 return 0;
1081 }
1082 }
252b5132 1083 }
3b1b01cf
TR
1084 /* should not be here */
1085 return -1;
252b5132
RH
1086}
1087
1088/* Read an import or export file. For an import file, this is called
1089 by the before_allocation emulation routine. For an export file,
3bcf5557 1090 this is called by the handle_option emulation routine. */
252b5132
RH
1091
1092static void
0c7a8e5a 1093gld${EMULATION_NAME}_read_file (const char *filename, bfd_boolean import)
252b5132
RH
1094{
1095 struct obstack *o;
1096 FILE *f;
1097 int lineno;
1098 int c;
b34976b6 1099 bfd_boolean keep;
252b5132
RH
1100 const char *imppath;
1101 const char *impfile;
1102 const char *impmember;
1103
1104 o = (struct obstack *) xmalloc (sizeof (struct obstack));
1105 obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
1106
1107 f = fopen (filename, FOPEN_RT);
1108 if (f == NULL)
1109 {
1110 bfd_set_error (bfd_error_system_call);
df5f2391 1111 einfo ("%F%P: %s: %E\n", filename);
b2e951ec 1112 return;
252b5132
RH
1113 }
1114
b34976b6 1115 keep = FALSE;
252b5132
RH
1116
1117 imppath = NULL;
1118 impfile = NULL;
1119 impmember = NULL;
1120
1121 lineno = 0;
3b1b01cf 1122
69f284c7
TR
1123 /* Default to 32 and 64 bit mode
1124 symbols at top of /lib/syscalls.exp do not have a mode modifier and they
1125 are not repeated, assume 64 bit routines also want to use them.
1126 See the routine change_symbol_mode for more information. */
1127
3b1b01cf
TR
1128 symbol_mode = 0x04;
1129
252b5132
RH
1130 while ((c = getc (f)) != EOF)
1131 {
1132 char *s;
1133 char *symname;
1fdf0249 1134 unsigned int syscall_flag = 0;
252b5132
RH
1135 bfd_vma address;
1136 struct bfd_link_hash_entry *h;
1137
1138 if (c != '\n')
1139 {
1140 obstack_1grow (o, c);
1141 continue;
1142 }
1143
1144 obstack_1grow (o, '\0');
1145 ++lineno;
1146
1147 s = (char *) obstack_base (o);
3882b010 1148 while (ISSPACE (*s))
252b5132 1149 ++s;
fab80407
AM
1150 if (*s == '\0'
1151 || *s == '*'
1152 || change_symbol_mode (s)
1153 || (*s == '#' && s[1] == ' ')
249172c3 1154 || (!import && *s == '#' && s[1] == '!'))
252b5132
RH
1155 {
1156 obstack_free (o, obstack_base (o));
1157 continue;
1158 }
1159
1160 if (*s == '#' && s[1] == '!')
1161 {
1162 s += 2;
3882b010 1163 while (ISSPACE (*s))
252b5132
RH
1164 ++s;
1165 if (*s == '\0')
1166 {
1167 imppath = NULL;
1168 impfile = NULL;
1169 impmember = NULL;
1170 obstack_free (o, obstack_base (o));
1171 }
1172 else if (*s == '(')
df5f2391 1173 einfo (_("%F%P:%s:%d: #! ([member]) is not supported "
d003af55 1174 "in import files\n"),
252b5132
RH
1175 filename, lineno);
1176 else
1177 {
1178 char cs;
24c611d1 1179 char *start;
252b5132
RH
1180
1181 (void) obstack_finish (o);
b34976b6 1182 keep = TRUE;
24c611d1 1183 start = s;
249172c3 1184 while (!ISSPACE (*s) && *s != '(' && *s != '\0')
24c611d1 1185 ++s;
252b5132
RH
1186 cs = *s;
1187 *s = '\0';
24c611d1
RS
1188 if (!bfd_xcoff_split_import_path (link_info.output_bfd,
1189 start, &imppath, &impfile))
df5f2391 1190 einfo (_("%F%P: could not parse import path: %E\n"));
3882b010 1191 while (ISSPACE (cs))
252b5132
RH
1192 {
1193 ++s;
1194 cs = *s;
1195 }
1196 if (cs != '(')
1197 {
1198 impmember = "";
1199 if (cs != '\0')
df5f2391 1200 einfo (_("%P:%s:%d: warning: syntax error in import file\n"),
252b5132
RH
1201 filename, lineno);
1202 }
1203 else
1204 {
1205 ++s;
1206 impmember = s;
1207 while (*s != ')' && *s != '\0')
1208 ++s;
1209 if (*s == ')')
1210 *s = '\0';
1211 else
df5f2391 1212 einfo (_("%P:%s:%d: warning: syntax error in import file\n"),
252b5132
RH
1213 filename, lineno);
1214 }
1215 }
1216
1217 continue;
1218 }
1219
742aeb63 1220 if (symbol_mode & symbol_mode_mask)
fab80407
AM
1221 {
1222 /* This is a symbol to be imported or exported. */
1223 symname = s;
1fdf0249 1224 syscall_flag = 0;
fab80407
AM
1225 address = (bfd_vma) -1;
1226
249172c3 1227 while (!ISSPACE (*s) && *s != '\0')
fab80407
AM
1228 ++s;
1229 if (*s != '\0')
1230 {
1231 char *se;
3b1b01cf 1232
fab80407 1233 *s++ = '\0';
3b1b01cf 1234
3882b010 1235 while (ISSPACE (*s))
fab80407
AM
1236 ++s;
1237
1238 se = s;
249172c3 1239 while (!ISSPACE (*se) && *se != '\0')
fab80407
AM
1240 ++se;
1241 if (*se != '\0')
1242 {
1243 *se++ = '\0';
3882b010 1244 while (ISSPACE (*se))
fab80407
AM
1245 ++se;
1246 if (*se != '\0')
df5f2391 1247 einfo (_("%P:%s%d: warning: syntax error in "
d003af55 1248 "import/export file\n"),
fab80407
AM
1249 filename, lineno);
1250 }
1251
1252 if (s != se)
1253 {
1254 int status;
c89e8944 1255 const char *end;
fab80407 1256
249172c3 1257 status = is_syscall (s, &syscall_flag);
7fc44b9c
AM
1258
1259 if (0 > status)
249172c3
TR
1260 {
1261 /* not a system call, check for address */
c89e8944 1262 address = bfd_scan_vma (s, &end, 0);
249172c3
TR
1263 if (*end != '\0')
1264 {
df5f2391 1265 einfo (_("%P:%s:%d: warning: syntax error in "
d003af55 1266 "import/export file\n"),
249172c3 1267 filename, lineno);
7fc44b9c 1268
249172c3
TR
1269 }
1270 }
3b1b01cf 1271 }
252b5132 1272 }
3b1b01cf 1273
249172c3 1274 if (!import)
fab80407
AM
1275 {
1276 struct export_symbol_list *n;
1277
24898b70 1278 ldlang_add_undef (symname, TRUE);
fab80407
AM
1279 n = ((struct export_symbol_list *)
1280 xmalloc (sizeof (struct export_symbol_list)));
1281 n->next = export_symbols;
1282 n->name = xstrdup (symname);
fab80407
AM
1283 export_symbols = n;
1284 }
1285 else
1286 {
b34976b6
AM
1287 h = bfd_link_hash_lookup (link_info.hash, symname, FALSE, FALSE,
1288 TRUE);
fab80407
AM
1289 if (h == NULL || h->type == bfd_link_hash_new)
1290 {
1291 /* We can just ignore attempts to import an unreferenced
1292 symbol. */
1293 }
1294 else
1295 {
f13a99db
AM
1296 if (!bfd_xcoff_import_symbol (link_info.output_bfd,
1297 &link_info, h,
249172c3
TR
1298 address, imppath, impfile,
1299 impmember, syscall_flag))
df5f2391 1300 einfo (_("%X%P:%s:%d: failed to import symbol %s: %E\n"),
fab80407
AM
1301 filename, lineno, symname);
1302 }
1303 }
1304 }
252b5132
RH
1305 obstack_free (o, obstack_base (o));
1306 }
fab80407 1307
252b5132
RH
1308 if (obstack_object_size (o) > 0)
1309 {
df5f2391 1310 einfo (_("%P:%s:%d: warning: ignoring unterminated last line\n"),
fab80407
AM
1311 filename, lineno);
1312 obstack_free (o, obstack_base (o));
1313 }
252b5132 1314
249172c3 1315 if (!keep)
fab80407
AM
1316 {
1317 obstack_free (o, NULL);
1318 free (o);
252b5132 1319 }
b2e951ec
NC
1320
1321 fclose (f);
fab80407 1322}
252b5132
RH
1323
1324/* This routine saves us from worrying about declaring free. */
1325
1326static void
0c7a8e5a 1327gld${EMULATION_NAME}_free (void *p)
252b5132
RH
1328{
1329 free (p);
1330}
1331
1332/* This is called by the before_allocation routine via
1333 lang_for_each_statement. It looks for relocations and assignments
1334 to symbols. */
1335
1336static void
0c7a8e5a 1337gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *s)
252b5132
RH
1338{
1339 if (s->header.type == lang_reloc_statement_enum)
1340 {
1341 lang_reloc_statement_type *rs;
1342
1343 rs = &s->reloc_statement;
1344 if (rs->name == NULL)
d003af55 1345 einfo (_("%F%P: only relocations against symbols are permitted\n"));
f13a99db
AM
1346 if (!bfd_xcoff_link_count_reloc (link_info.output_bfd, &link_info,
1347 rs->name))
d003af55 1348 einfo (_("%F%P: bfd_xcoff_link_count_reloc failed: %E\n"));
252b5132
RH
1349 }
1350
1351 if (s->header.type == lang_assignment_statement_enum)
1352 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1353}
1354
1355/* Look through an expression for an assignment statement. */
1356
1357static void
0c7a8e5a 1358gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
252b5132
RH
1359{
1360 struct bfd_link_hash_entry *h;
1361
1362 switch (exp->type.node_class)
1363 {
1364 case etree_provide:
1365 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
b34976b6 1366 FALSE, FALSE, FALSE);
252b5132
RH
1367 if (h == NULL)
1368 break;
1369 /* Fall through. */
1370 case etree_assign:
1371 if (strcmp (exp->assign.dst, ".") != 0)
1372 {
f13a99db
AM
1373 if (!bfd_xcoff_record_link_assignment (link_info.output_bfd,
1374 &link_info,
249172c3 1375 exp->assign.dst))
df5f2391 1376 einfo (_("%F%P: failed to record assignment to %s: %E\n"),
252b5132
RH
1377 exp->assign.dst);
1378 }
1379 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1380 break;
1381
1382 case etree_binary:
1383 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1384 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1385 break;
1386
1387 case etree_trinary:
1388 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1389 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1390 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1391 break;
1392
1393 case etree_unary:
1394 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1395 break;
1396
1397 default:
1398 break;
1399 }
1400}
1401
1402static char *
0c7a8e5a 1403gld${EMULATION_NAME}_get_script (int *isfile)
252b5132
RH
1404EOF
1405
7225345d 1406if test x"$COMPILE_IN" = xyes
252b5132
RH
1407then
1408# Scripts compiled in.
1409
1410# sed commands to quote an ld script as a C string.
5f642101 1411sc="-f ${srcdir}/emultempl/ostring.sed"
252b5132 1412
92b93329 1413fragment <<EOF
fab80407 1414{
252b5132
RH
1415 *isfile = 0;
1416
0e1862bb 1417 if (bfd_link_relocatable (&link_info) && config.build_constructors)
252b5132
RH
1418 return
1419EOF
b34976b6 1420sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
0e1862bb 1421echo ' ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c
b34976b6
AM
1422sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1423echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1424sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1425echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1426sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1427echo ' ; else return' >> e${EMULATION_NAME}.c
1428sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1429echo '; }' >> e${EMULATION_NAME}.c
252b5132
RH
1430
1431else
1432# Scripts read from the filesystem.
1433
92b93329 1434fragment <<EOF
fab80407 1435{
252b5132
RH
1436 *isfile = 1;
1437
0e1862bb 1438 if (bfd_link_relocatable (&link_info) && config.build_constructors)
252b5132 1439 return "ldscripts/${EMULATION_NAME}.xu";
0e1862bb 1440 else if (bfd_link_relocatable (&link_info))
252b5132
RH
1441 return "ldscripts/${EMULATION_NAME}.xr";
1442 else if (!config.text_read_only)
1443 return "ldscripts/${EMULATION_NAME}.xbn";
1444 else if (!config.magic_demand_paged)
1445 return "ldscripts/${EMULATION_NAME}.xn";
1446 else
1447 return "ldscripts/${EMULATION_NAME}.x";
1448}
1449EOF
1450
1451fi
1452
92b93329 1453fragment <<EOF
252b5132 1454
7fc44b9c 1455static void
0c7a8e5a 1456gld${EMULATION_NAME}_create_output_section_statements (void)
9a4c7f16
TR
1457{
1458 /* __rtinit */
f13a99db 1459 if ((bfd_get_flavour (link_info.output_bfd) == bfd_target_xcoff_flavour)
7fc44b9c 1460 && (link_info.init_function != NULL
69f284c7 1461 || link_info.fini_function != NULL
b34976b6 1462 || rtld))
9a4c7f16 1463 {
9a4c7f16
TR
1464 initfini_file = lang_add_input_file ("initfini",
1465 lang_input_file_is_file_enum,
1466 NULL);
7fc44b9c 1467
f13a99db 1468 initfini_file->the_bfd = bfd_create ("initfini", link_info.output_bfd);
9a4c7f16
TR
1469 if (initfini_file->the_bfd == NULL
1470 || ! bfd_set_arch_mach (initfini_file->the_bfd,
f13a99db
AM
1471 bfd_get_arch (link_info.output_bfd),
1472 bfd_get_mach (link_info.output_bfd)))
9a4c7f16 1473 {
df5f2391 1474 einfo (_("%F%P: can not create BFD: %E\n"));
9a4c7f16
TR
1475 return;
1476 }
7fc44b9c 1477
9a4c7f16 1478 /* Call backend to fill in the rest */
b34976b6
AM
1479 if (! bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd,
1480 link_info.init_function,
1481 link_info.fini_function,
1482 rtld))
9a4c7f16 1483 {
df5f2391 1484 einfo (_("%F%P: can not create BFD: %E\n"));
9a4c7f16
TR
1485 return;
1486 }
69f284c7
TR
1487
1488 /* __rtld defined in /lib/librtl.a */
b34976b6 1489 if (rtld)
69f284c7 1490 lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL);
9a4c7f16
TR
1491 }
1492}
1493
f1f0d9ab 1494static void
0c7a8e5a 1495gld${EMULATION_NAME}_set_output_arch (void)
f1f0d9ab 1496{
f13a99db
AM
1497 bfd_set_arch_mach (link_info.output_bfd,
1498 bfd_xcoff_architecture (link_info.output_bfd),
1499 bfd_xcoff_machine (link_info.output_bfd));
f1f0d9ab 1500
f13a99db
AM
1501 ldfile_output_architecture = bfd_get_arch (link_info.output_bfd);
1502 ldfile_output_machine = bfd_get_mach (link_info.output_bfd);
1503 ldfile_output_machine_name = bfd_printable_name (link_info.output_bfd);
f1f0d9ab
TR
1504}
1505
24c611d1
RS
1506static bfd_boolean
1507gld${EMULATION_NAME}_open_dynamic_archive (const char *arch,
1508 search_dirs_type *search,
1509 lang_input_statement_type *entry)
1510{
24c611d1
RS
1511 char *path;
1512
66be1055 1513 if (!entry->flags.maybe_archive)
24c611d1
RS
1514 return FALSE;
1515
d4ae5fb0
AM
1516 if (entry->flags.full_name_provided)
1517 path = concat (search->name, "/", entry->filename,
1518 (const char *) NULL);
1519 else
1520 path = concat (search->name, "/lib", entry->filename, arch, ".a",
1521 (const char *) NULL);
1522
24c611d1
RS
1523 if (!ldfile_try_open_bfd (path, entry))
1524 {
1525 free (path);
1526 return FALSE;
1527 }
1528 /* Don't include the searched directory in the import path. */
1529 bfd_xcoff_set_archive_import_path (&link_info, entry->the_bfd,
1530 path + strlen (search->name) + 1);
1531 entry->filename = path;
1532 return TRUE;
1533}
1534
249172c3 1535struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
252b5132
RH
1536 gld${EMULATION_NAME}_before_parse,
1537 syslib_default,
1538 hll_default,
1539 after_parse_default,
1540 gld${EMULATION_NAME}_after_open,
5c3261b0 1541 after_check_relocs_default,
252b5132 1542 after_allocation_default,
f1f0d9ab
TR
1543 gld${EMULATION_NAME}_set_output_arch,
1544 gld${EMULATION_NAME}_choose_target,
252b5132
RH
1545 gld${EMULATION_NAME}_before_allocation,
1546 gld${EMULATION_NAME}_get_script,
1547 "${EMULATION_NAME}",
1548 "${OUTPUT_FORMAT}",
1e035701 1549 finish_default,
9a4c7f16 1550 gld${EMULATION_NAME}_create_output_section_statements,
24c611d1 1551 gld${EMULATION_NAME}_open_dynamic_archive,
249172c3
TR
1552 0, /* place_orphan */
1553 0, /* set_symbols */
252b5132 1554 gld${EMULATION_NAME}_parse_args,
3bcf5557
AM
1555 gld${EMULATION_NAME}_add_options,
1556 gld${EMULATION_NAME}_handle_option,
40d109bf 1557 gld${EMULATION_NAME}_unrecognized_file,
249172c3
TR
1558 NULL, /* list_options */
1559 NULL, /* recognized_file */
1560 NULL, /* find potential_libraries */
7a2f2d82
DD
1561 NULL, /* new_vers_pattern */
1562 NULL /* extra_map_file_text */
252b5132
RH
1563};
1564EOF
This page took 0.894345 seconds and 4 git commands to generate.