]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/emultempl/aix.em
Force the AArch64 linker backend to refuse to link when it encounters unresoleable...
[thirdparty/binutils-gdb.git] / ld / emultempl / aix.em
CommitLineData
252b5132
RH
1# This shell script emits a C file. -*- C -*-
2# It does some substitutions.
86af25fe
L
3if [ -z "$MACHINE" ]; then
4 OUTPUT_ARCH=${ARCH}
5else
6 OUTPUT_ARCH=${ARCH}:${MACHINE}
7fi
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}
2571583a 12 Copyright (C) 1991-2017 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')
348 b++;
349
350 /* Stop if end of buffer. */
351 if (b == buffer + len)
352 break;
353
354 /* Eat any byte until end of line. */
355 for (e = b; *e != '\0'; e++)
356 if (*e == '\n' || *e == '\r')
357 break;
358
359 /* Replace end of line by nul. */
360 if (*e != '\0')
361 *e++ = '\0';
e4492aa0 362
a72173de
TG
363 if (b != e)
364 lang_add_input_file (b, lang_input_file_is_search_file_enum, NULL);
365 b = e;
366 }
367 return;
368
369 error:
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
391 a list of input files. */
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)
d003af55 752 einfo (_("%P%F: bfd_link_hash_lookup of export symbol failed: %E\n"));
f13a99db 753 if (!bfd_xcoff_export_symbol (link_info.output_bfd, &link_info, h))
d003af55 754 einfo (_("%P%F: 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))
d003af55 838 einfo (_("%P%F: 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)
d003af55 860 einfo (_("%P%F: 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 {
d003af55 897 einfo (_("%P%F: 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;
948 lang_statement_append (&os->children,
949 (lang_statement_union_type *) is,
950 &is->header.next);
951 }
3b1b01cf 952 }
8423293d 953
9ec59d51
RS
954 /* Executables and shared objects must always have .text, .data
955 and .bss output sections, so that the header can refer to them.
956 The kernel refuses to load objects that have missing sections. */
0e1862bb 957 if (!bfd_link_relocatable (&link_info))
9ec59d51
RS
958 for (i = 0; i < ARRAY_SIZE (must_keep_sections); i++)
959 {
960 asection *sec;
961
962 sec = bfd_get_section_by_name (link_info.output_bfd,
963 must_keep_sections[i]);
964 if (sec == NULL)
d003af55
AM
965 einfo (_("%P: can't find required output section %s\n"),
966 must_keep_sections[i]);
9ec59d51
RS
967 else
968 sec->flags |= SEC_KEEP;
969 }
970
1e035701 971 before_allocation_default ();
3b1b01cf
TR
972}
973
742aeb63 974static char *
0c7a8e5a 975gld${EMULATION_NAME}_choose_target (int argc, char **argv)
742aeb63
TR
976{
977 int i, j, jmax;
978 static char *from_outside;
979 static char *from_inside;
7fc44b9c 980 static char *argv_to_target[][2] = {
249172c3 981 {NULL, "${OUTPUT_FORMAT}"},
eb1e0e80
NC
982 {"-b32", "${OUTPUT_FORMAT_32BIT}"},
983 {"-b64", "${OUTPUT_FORMAT_64BIT}"},
249172c3 984 };
742aeb63
TR
985
986 jmax = 3;
987
988 from_outside = getenv (TARGET_ENVIRON);
249172c3 989 if (from_outside != (char *) NULL)
742aeb63
TR
990 return from_outside;
991
992 /* Set to default. */
993 from_inside = argv_to_target[0][1];
994 for (i = 1; i < argc; i++)
995 {
7fc44b9c 996 for (j = 1; j < jmax; j++)
742aeb63
TR
997 {
998 if (0 == strcmp (argv[i], argv_to_target[j][0]))
999 from_inside = argv_to_target[j][1];
1000 }
1001 }
249172c3 1002
742aeb63
TR
1003 return from_inside;
1004}
1005
7fc44b9c 1006/* Returns
249172c3
TR
1007 1 : state changed
1008 0 : no change */
7fc44b9c 1009static int
0c7a8e5a 1010change_symbol_mode (char *input)
3b1b01cf 1011{
3b1b01cf 1012 char *symbol_mode_string[] = {
249172c3
TR
1013 "# 32", /* 0x01 */
1014 "# 64", /* 0x02 */
1015 "# no32", /* 0x04 */
1016 "# no64", /* 0x08 */
3b1b01cf
TR
1017 NULL,
1018 };
249172c3 1019
3b1b01cf
TR
1020 unsigned int bit;
1021 char *string;
1022
249172c3 1023 for (bit = 0;; bit++)
fab80407
AM
1024 {
1025 string = symbol_mode_string[bit];
249172c3 1026 if (string == NULL)
fab80407
AM
1027 return 0;
1028
1029 if (0 == strcmp (input, string))
1030 {
1031 symbol_mode = (1 << bit);
1032 return 1;
1033 }
3b1b01cf 1034 }
3b1b01cf
TR
1035 /* should not be here */
1036 return 0;
1037}
1038
7fc44b9c 1039/* Returns
249172c3
TR
1040 1 : yes
1041 0 : ignore
1042 -1 : error, try something else */
7fc44b9c 1043static int
0c7a8e5a 1044is_syscall (char *input, unsigned int *flag)
3b1b01cf 1045{
3b1b01cf
TR
1046 unsigned int bit;
1047 char *string;
7fc44b9c 1048
1fdf0249
TR
1049 struct sc {
1050 char *syscall_string;
1051 unsigned int flag;
1052 } s [] = {
1053 { "svc" /* 0x01 */, XCOFF_SYSCALL32 },
1054 { "svc32" /* 0x02 */, XCOFF_SYSCALL32 },
1055 { "svc3264" /* 0x04 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
1056 { "svc64" /* 0x08 */, XCOFF_SYSCALL64 },
1057 { "syscall" /* 0x10 */, XCOFF_SYSCALL32 },
1058 { "syscall32" /* 0x20 */, XCOFF_SYSCALL32 },
1059 { "syscall3264" /* 0x40 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
1060 { "syscall64" /* 0x80 */, XCOFF_SYSCALL64 },
1061 { NULL, 0 },
3b1b01cf
TR
1062 };
1063
1fdf0249 1064 *flag = 0;
3b1b01cf 1065
7fc44b9c 1066 for (bit = 0;; bit++)
249172c3
TR
1067 {
1068 string = s[bit].syscall_string;
7fc44b9c 1069 if (string == NULL)
249172c3 1070 return -1;
fab80407 1071
7fc44b9c 1072 if (0 == strcmp (input, string))
249172c3 1073 {
7fc44b9c 1074 if (1 << bit & syscall_mask)
249172c3
TR
1075 {
1076 *flag = s[bit].flag;
1077 return 1;
7fc44b9c
AM
1078 }
1079 else
249172c3
TR
1080 {
1081 return 0;
1082 }
1083 }
252b5132 1084 }
3b1b01cf
TR
1085 /* should not be here */
1086 return -1;
252b5132
RH
1087}
1088
1089/* Read an import or export file. For an import file, this is called
1090 by the before_allocation emulation routine. For an export file,
3bcf5557 1091 this is called by the handle_option emulation routine. */
252b5132
RH
1092
1093static void
0c7a8e5a 1094gld${EMULATION_NAME}_read_file (const char *filename, bfd_boolean import)
252b5132
RH
1095{
1096 struct obstack *o;
1097 FILE *f;
1098 int lineno;
1099 int c;
b34976b6 1100 bfd_boolean keep;
252b5132
RH
1101 const char *imppath;
1102 const char *impfile;
1103 const char *impmember;
1104
1105 o = (struct obstack *) xmalloc (sizeof (struct obstack));
1106 obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
1107
1108 f = fopen (filename, FOPEN_RT);
1109 if (f == NULL)
1110 {
1111 bfd_set_error (bfd_error_system_call);
1112 einfo ("%F%s: %E\n", filename);
b2e951ec 1113 return;
252b5132
RH
1114 }
1115
b34976b6 1116 keep = FALSE;
252b5132
RH
1117
1118 imppath = NULL;
1119 impfile = NULL;
1120 impmember = NULL;
1121
1122 lineno = 0;
3b1b01cf 1123
69f284c7
TR
1124 /* Default to 32 and 64 bit mode
1125 symbols at top of /lib/syscalls.exp do not have a mode modifier and they
1126 are not repeated, assume 64 bit routines also want to use them.
1127 See the routine change_symbol_mode for more information. */
1128
3b1b01cf
TR
1129 symbol_mode = 0x04;
1130
252b5132
RH
1131 while ((c = getc (f)) != EOF)
1132 {
1133 char *s;
1134 char *symname;
1fdf0249 1135 unsigned int syscall_flag = 0;
252b5132
RH
1136 bfd_vma address;
1137 struct bfd_link_hash_entry *h;
1138
1139 if (c != '\n')
1140 {
1141 obstack_1grow (o, c);
1142 continue;
1143 }
1144
1145 obstack_1grow (o, '\0');
1146 ++lineno;
1147
1148 s = (char *) obstack_base (o);
3882b010 1149 while (ISSPACE (*s))
252b5132 1150 ++s;
fab80407
AM
1151 if (*s == '\0'
1152 || *s == '*'
1153 || change_symbol_mode (s)
1154 || (*s == '#' && s[1] == ' ')
249172c3 1155 || (!import && *s == '#' && s[1] == '!'))
252b5132
RH
1156 {
1157 obstack_free (o, obstack_base (o));
1158 continue;
1159 }
1160
1161 if (*s == '#' && s[1] == '!')
1162 {
1163 s += 2;
3882b010 1164 while (ISSPACE (*s))
252b5132
RH
1165 ++s;
1166 if (*s == '\0')
1167 {
1168 imppath = NULL;
1169 impfile = NULL;
1170 impmember = NULL;
1171 obstack_free (o, obstack_base (o));
1172 }
1173 else if (*s == '(')
d003af55
AM
1174 einfo (_("%F%s%d: #! ([member]) is not supported "
1175 "in import files\n"),
252b5132
RH
1176 filename, lineno);
1177 else
1178 {
1179 char cs;
24c611d1 1180 char *start;
252b5132
RH
1181
1182 (void) obstack_finish (o);
b34976b6 1183 keep = TRUE;
24c611d1 1184 start = s;
249172c3 1185 while (!ISSPACE (*s) && *s != '(' && *s != '\0')
24c611d1 1186 ++s;
252b5132
RH
1187 cs = *s;
1188 *s = '\0';
24c611d1
RS
1189 if (!bfd_xcoff_split_import_path (link_info.output_bfd,
1190 start, &imppath, &impfile))
d003af55 1191 einfo (_("%F%P: Could not parse import path: %E\n"));
3882b010 1192 while (ISSPACE (cs))
252b5132
RH
1193 {
1194 ++s;
1195 cs = *s;
1196 }
1197 if (cs != '(')
1198 {
1199 impmember = "";
1200 if (cs != '\0')
d003af55 1201 einfo (_("%s:%d: warning: syntax error in import file\n"),
252b5132
RH
1202 filename, lineno);
1203 }
1204 else
1205 {
1206 ++s;
1207 impmember = s;
1208 while (*s != ')' && *s != '\0')
1209 ++s;
1210 if (*s == ')')
1211 *s = '\0';
1212 else
d003af55 1213 einfo (_("%s:%d: warning: syntax error in import file\n"),
252b5132
RH
1214 filename, lineno);
1215 }
1216 }
1217
1218 continue;
1219 }
1220
742aeb63 1221 if (symbol_mode & symbol_mode_mask)
fab80407
AM
1222 {
1223 /* This is a symbol to be imported or exported. */
1224 symname = s;
1fdf0249 1225 syscall_flag = 0;
fab80407
AM
1226 address = (bfd_vma) -1;
1227
249172c3 1228 while (!ISSPACE (*s) && *s != '\0')
fab80407
AM
1229 ++s;
1230 if (*s != '\0')
1231 {
1232 char *se;
3b1b01cf 1233
fab80407 1234 *s++ = '\0';
3b1b01cf 1235
3882b010 1236 while (ISSPACE (*s))
fab80407
AM
1237 ++s;
1238
1239 se = s;
249172c3 1240 while (!ISSPACE (*se) && *se != '\0')
fab80407
AM
1241 ++se;
1242 if (*se != '\0')
1243 {
1244 *se++ = '\0';
3882b010 1245 while (ISSPACE (*se))
fab80407
AM
1246 ++se;
1247 if (*se != '\0')
d003af55
AM
1248 einfo (_("%s%d: warning: syntax error in "
1249 "import/export file\n"),
fab80407
AM
1250 filename, lineno);
1251 }
1252
1253 if (s != se)
1254 {
1255 int status;
c89e8944 1256 const char *end;
fab80407 1257
249172c3 1258 status = is_syscall (s, &syscall_flag);
7fc44b9c
AM
1259
1260 if (0 > status)
249172c3
TR
1261 {
1262 /* not a system call, check for address */
c89e8944 1263 address = bfd_scan_vma (s, &end, 0);
249172c3
TR
1264 if (*end != '\0')
1265 {
d003af55
AM
1266 einfo (_("%s:%d: warning: syntax error in "
1267 "import/export file\n"),
249172c3 1268 filename, lineno);
7fc44b9c 1269
249172c3
TR
1270 }
1271 }
3b1b01cf 1272 }
252b5132 1273 }
3b1b01cf 1274
249172c3 1275 if (!import)
fab80407
AM
1276 {
1277 struct export_symbol_list *n;
1278
24898b70 1279 ldlang_add_undef (symname, TRUE);
fab80407
AM
1280 n = ((struct export_symbol_list *)
1281 xmalloc (sizeof (struct export_symbol_list)));
1282 n->next = export_symbols;
1283 n->name = xstrdup (symname);
fab80407
AM
1284 export_symbols = n;
1285 }
1286 else
1287 {
b34976b6
AM
1288 h = bfd_link_hash_lookup (link_info.hash, symname, FALSE, FALSE,
1289 TRUE);
fab80407
AM
1290 if (h == NULL || h->type == bfd_link_hash_new)
1291 {
1292 /* We can just ignore attempts to import an unreferenced
1293 symbol. */
1294 }
1295 else
1296 {
f13a99db
AM
1297 if (!bfd_xcoff_import_symbol (link_info.output_bfd,
1298 &link_info, h,
249172c3
TR
1299 address, imppath, impfile,
1300 impmember, syscall_flag))
d003af55 1301 einfo (_("%X%s:%d: failed to import symbol %s: %E\n"),
fab80407
AM
1302 filename, lineno, symname);
1303 }
1304 }
1305 }
252b5132
RH
1306 obstack_free (o, obstack_base (o));
1307 }
fab80407 1308
252b5132
RH
1309 if (obstack_object_size (o) > 0)
1310 {
d003af55 1311 einfo (_("%s:%d: warning: ignoring unterminated last line\n"),
fab80407
AM
1312 filename, lineno);
1313 obstack_free (o, obstack_base (o));
1314 }
252b5132 1315
249172c3 1316 if (!keep)
fab80407
AM
1317 {
1318 obstack_free (o, NULL);
1319 free (o);
252b5132 1320 }
b2e951ec
NC
1321
1322 fclose (f);
fab80407 1323}
252b5132
RH
1324
1325/* This routine saves us from worrying about declaring free. */
1326
1327static void
0c7a8e5a 1328gld${EMULATION_NAME}_free (void *p)
252b5132
RH
1329{
1330 free (p);
1331}
1332
1333/* This is called by the before_allocation routine via
1334 lang_for_each_statement. It looks for relocations and assignments
1335 to symbols. */
1336
1337static void
0c7a8e5a 1338gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *s)
252b5132
RH
1339{
1340 if (s->header.type == lang_reloc_statement_enum)
1341 {
1342 lang_reloc_statement_type *rs;
1343
1344 rs = &s->reloc_statement;
1345 if (rs->name == NULL)
d003af55 1346 einfo (_("%F%P: only relocations against symbols are permitted\n"));
f13a99db
AM
1347 if (!bfd_xcoff_link_count_reloc (link_info.output_bfd, &link_info,
1348 rs->name))
d003af55 1349 einfo (_("%F%P: bfd_xcoff_link_count_reloc failed: %E\n"));
252b5132
RH
1350 }
1351
1352 if (s->header.type == lang_assignment_statement_enum)
1353 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1354}
1355
1356/* Look through an expression for an assignment statement. */
1357
1358static void
0c7a8e5a 1359gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
252b5132
RH
1360{
1361 struct bfd_link_hash_entry *h;
1362
1363 switch (exp->type.node_class)
1364 {
1365 case etree_provide:
1366 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
b34976b6 1367 FALSE, FALSE, FALSE);
252b5132
RH
1368 if (h == NULL)
1369 break;
1370 /* Fall through. */
1371 case etree_assign:
1372 if (strcmp (exp->assign.dst, ".") != 0)
1373 {
f13a99db
AM
1374 if (!bfd_xcoff_record_link_assignment (link_info.output_bfd,
1375 &link_info,
249172c3 1376 exp->assign.dst))
d003af55 1377 einfo (_("%P%F: failed to record assignment to %s: %E\n"),
252b5132
RH
1378 exp->assign.dst);
1379 }
1380 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1381 break;
1382
1383 case etree_binary:
1384 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1385 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1386 break;
1387
1388 case etree_trinary:
1389 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1390 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1391 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1392 break;
1393
1394 case etree_unary:
1395 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1396 break;
1397
1398 default:
1399 break;
1400 }
1401}
1402
1403static char *
0c7a8e5a 1404gld${EMULATION_NAME}_get_script (int *isfile)
252b5132
RH
1405EOF
1406
7225345d 1407if test x"$COMPILE_IN" = xyes
252b5132
RH
1408then
1409# Scripts compiled in.
1410
1411# sed commands to quote an ld script as a C string.
5f642101 1412sc="-f ${srcdir}/emultempl/ostring.sed"
252b5132 1413
92b93329 1414fragment <<EOF
fab80407 1415{
252b5132
RH
1416 *isfile = 0;
1417
0e1862bb 1418 if (bfd_link_relocatable (&link_info) && config.build_constructors)
252b5132
RH
1419 return
1420EOF
b34976b6 1421sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
0e1862bb 1422echo ' ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c
b34976b6
AM
1423sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1424echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1425sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1426echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1427sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1428echo ' ; else return' >> e${EMULATION_NAME}.c
1429sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1430echo '; }' >> e${EMULATION_NAME}.c
252b5132
RH
1431
1432else
1433# Scripts read from the filesystem.
1434
92b93329 1435fragment <<EOF
fab80407 1436{
252b5132
RH
1437 *isfile = 1;
1438
0e1862bb 1439 if (bfd_link_relocatable (&link_info) && config.build_constructors)
252b5132 1440 return "ldscripts/${EMULATION_NAME}.xu";
0e1862bb 1441 else if (bfd_link_relocatable (&link_info))
252b5132
RH
1442 return "ldscripts/${EMULATION_NAME}.xr";
1443 else if (!config.text_read_only)
1444 return "ldscripts/${EMULATION_NAME}.xbn";
1445 else if (!config.magic_demand_paged)
1446 return "ldscripts/${EMULATION_NAME}.xn";
1447 else
1448 return "ldscripts/${EMULATION_NAME}.x";
1449}
1450EOF
1451
1452fi
1453
92b93329 1454fragment <<EOF
252b5132 1455
7fc44b9c 1456static void
0c7a8e5a 1457gld${EMULATION_NAME}_create_output_section_statements (void)
9a4c7f16
TR
1458{
1459 /* __rtinit */
f13a99db 1460 if ((bfd_get_flavour (link_info.output_bfd) == bfd_target_xcoff_flavour)
7fc44b9c 1461 && (link_info.init_function != NULL
69f284c7 1462 || link_info.fini_function != NULL
b34976b6 1463 || rtld))
9a4c7f16 1464 {
9a4c7f16
TR
1465 initfini_file = lang_add_input_file ("initfini",
1466 lang_input_file_is_file_enum,
1467 NULL);
7fc44b9c 1468
f13a99db 1469 initfini_file->the_bfd = bfd_create ("initfini", link_info.output_bfd);
9a4c7f16
TR
1470 if (initfini_file->the_bfd == NULL
1471 || ! bfd_set_arch_mach (initfini_file->the_bfd,
f13a99db
AM
1472 bfd_get_arch (link_info.output_bfd),
1473 bfd_get_mach (link_info.output_bfd)))
9a4c7f16 1474 {
d003af55 1475 einfo (_("%X%P: can not create BFD %E\n"));
9a4c7f16
TR
1476 return;
1477 }
7fc44b9c 1478
9a4c7f16 1479 /* Call backend to fill in the rest */
b34976b6
AM
1480 if (! bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd,
1481 link_info.init_function,
1482 link_info.fini_function,
1483 rtld))
9a4c7f16 1484 {
d003af55 1485 einfo (_("%X%P: can not create BFD %E\n"));
9a4c7f16
TR
1486 return;
1487 }
69f284c7
TR
1488
1489 /* __rtld defined in /lib/librtl.a */
b34976b6 1490 if (rtld)
69f284c7 1491 lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL);
9a4c7f16
TR
1492 }
1493}
1494
f1f0d9ab 1495static void
0c7a8e5a 1496gld${EMULATION_NAME}_set_output_arch (void)
f1f0d9ab 1497{
f13a99db
AM
1498 bfd_set_arch_mach (link_info.output_bfd,
1499 bfd_xcoff_architecture (link_info.output_bfd),
1500 bfd_xcoff_machine (link_info.output_bfd));
f1f0d9ab 1501
f13a99db
AM
1502 ldfile_output_architecture = bfd_get_arch (link_info.output_bfd);
1503 ldfile_output_machine = bfd_get_mach (link_info.output_bfd);
1504 ldfile_output_machine_name = bfd_printable_name (link_info.output_bfd);
f1f0d9ab
TR
1505}
1506
24c611d1
RS
1507static bfd_boolean
1508gld${EMULATION_NAME}_open_dynamic_archive (const char *arch,
1509 search_dirs_type *search,
1510 lang_input_statement_type *entry)
1511{
24c611d1
RS
1512 char *path;
1513
66be1055 1514 if (!entry->flags.maybe_archive)
24c611d1
RS
1515 return FALSE;
1516
d4ae5fb0
AM
1517 if (entry->flags.full_name_provided)
1518 path = concat (search->name, "/", entry->filename,
1519 (const char *) NULL);
1520 else
1521 path = concat (search->name, "/lib", entry->filename, arch, ".a",
1522 (const char *) NULL);
1523
24c611d1
RS
1524 if (!ldfile_try_open_bfd (path, entry))
1525 {
1526 free (path);
1527 return FALSE;
1528 }
1529 /* Don't include the searched directory in the import path. */
1530 bfd_xcoff_set_archive_import_path (&link_info, entry->the_bfd,
1531 path + strlen (search->name) + 1);
1532 entry->filename = path;
1533 return TRUE;
1534}
1535
249172c3 1536struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
252b5132
RH
1537 gld${EMULATION_NAME}_before_parse,
1538 syslib_default,
1539 hll_default,
1540 after_parse_default,
1541 gld${EMULATION_NAME}_after_open,
1542 after_allocation_default,
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