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