]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/emultempl/aix.em
Add startswith function and use it instead of CONST_STRNEQ.
[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
08dedd66 290 if (indx < argc && startswith (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
1b2cb8e2
CC
972 /* Make sure .tdata is removed if empty, even with -r flag.
973 .tdata is always being generated because its size is needed
974 to cumpute .data address. */
975 if (bfd_link_relocatable (&link_info))
976 {
977 static const char *const thread_sections[] = {
978 ".tdata",
979 ".tbss"
980 };
981
982 /* Run lang_size_sections (if not already done). */
983 if (expld.phase != lang_mark_phase_enum)
984 {
985 expld.phase = lang_mark_phase_enum;
986 expld.dataseg.phase = exp_seg_none;
987 one_lang_size_sections_pass (NULL, FALSE);
988 lang_reset_memory_regions ();
989 }
990
991 for (i = 0; i < ARRAY_SIZE (thread_sections); i++)
992 {
993 asection *sec;
994
995 sec = bfd_get_section_by_name (link_info.output_bfd,
996 thread_sections[i]);
997
998 if (sec != NULL && sec->rawsize == 0
999 && (sec->flags & SEC_KEEP) == 0
1000 && !bfd_section_removed_from_list (link_info.output_bfd,
1001 sec))
1002 {
1003 sec->flags |= SEC_EXCLUDE;
1004 bfd_section_list_remove (link_info.output_bfd, sec);
1005 link_info.output_bfd->section_count--;
1006 }
1007 }
1008 }
1009
1e035701 1010 before_allocation_default ();
3b1b01cf
TR
1011}
1012
742aeb63 1013static char *
0c7a8e5a 1014gld${EMULATION_NAME}_choose_target (int argc, char **argv)
742aeb63
TR
1015{
1016 int i, j, jmax;
1017 static char *from_outside;
1018 static char *from_inside;
7fc44b9c 1019 static char *argv_to_target[][2] = {
249172c3 1020 {NULL, "${OUTPUT_FORMAT}"},
eb1e0e80
NC
1021 {"-b32", "${OUTPUT_FORMAT_32BIT}"},
1022 {"-b64", "${OUTPUT_FORMAT_64BIT}"},
249172c3 1023 };
742aeb63
TR
1024
1025 jmax = 3;
1026
1027 from_outside = getenv (TARGET_ENVIRON);
249172c3 1028 if (from_outside != (char *) NULL)
742aeb63
TR
1029 return from_outside;
1030
1031 /* Set to default. */
1032 from_inside = argv_to_target[0][1];
1033 for (i = 1; i < argc; i++)
1034 {
7fc44b9c 1035 for (j = 1; j < jmax; j++)
742aeb63
TR
1036 {
1037 if (0 == strcmp (argv[i], argv_to_target[j][0]))
1038 from_inside = argv_to_target[j][1];
1039 }
1040 }
249172c3 1041
742aeb63
TR
1042 return from_inside;
1043}
1044
7fc44b9c 1045/* Returns
249172c3
TR
1046 1 : state changed
1047 0 : no change */
7fc44b9c 1048static int
0c7a8e5a 1049change_symbol_mode (char *input)
3b1b01cf 1050{
3b1b01cf 1051 char *symbol_mode_string[] = {
249172c3
TR
1052 "# 32", /* 0x01 */
1053 "# 64", /* 0x02 */
1054 "# no32", /* 0x04 */
1055 "# no64", /* 0x08 */
3b1b01cf
TR
1056 NULL,
1057 };
249172c3 1058
3b1b01cf
TR
1059 unsigned int bit;
1060 char *string;
1061
249172c3 1062 for (bit = 0;; bit++)
fab80407
AM
1063 {
1064 string = symbol_mode_string[bit];
249172c3 1065 if (string == NULL)
fab80407
AM
1066 return 0;
1067
1068 if (0 == strcmp (input, string))
1069 {
1070 symbol_mode = (1 << bit);
1071 return 1;
1072 }
3b1b01cf 1073 }
3b1b01cf
TR
1074 /* should not be here */
1075 return 0;
1076}
1077
7fc44b9c 1078/* Returns
249172c3
TR
1079 1 : yes
1080 0 : ignore
1081 -1 : error, try something else */
7fc44b9c 1082static int
0c7a8e5a 1083is_syscall (char *input, unsigned int *flag)
3b1b01cf 1084{
3b1b01cf
TR
1085 unsigned int bit;
1086 char *string;
7fc44b9c 1087
1fdf0249
TR
1088 struct sc {
1089 char *syscall_string;
1090 unsigned int flag;
1091 } s [] = {
1092 { "svc" /* 0x01 */, XCOFF_SYSCALL32 },
1093 { "svc32" /* 0x02 */, XCOFF_SYSCALL32 },
1094 { "svc3264" /* 0x04 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
1095 { "svc64" /* 0x08 */, XCOFF_SYSCALL64 },
1096 { "syscall" /* 0x10 */, XCOFF_SYSCALL32 },
1097 { "syscall32" /* 0x20 */, XCOFF_SYSCALL32 },
1098 { "syscall3264" /* 0x40 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 },
1099 { "syscall64" /* 0x80 */, XCOFF_SYSCALL64 },
1100 { NULL, 0 },
3b1b01cf
TR
1101 };
1102
1fdf0249 1103 *flag = 0;
3b1b01cf 1104
7fc44b9c 1105 for (bit = 0;; bit++)
249172c3
TR
1106 {
1107 string = s[bit].syscall_string;
7fc44b9c 1108 if (string == NULL)
249172c3 1109 return -1;
fab80407 1110
7fc44b9c 1111 if (0 == strcmp (input, string))
249172c3 1112 {
7fc44b9c 1113 if (1 << bit & syscall_mask)
249172c3
TR
1114 {
1115 *flag = s[bit].flag;
1116 return 1;
7fc44b9c
AM
1117 }
1118 else
249172c3
TR
1119 {
1120 return 0;
1121 }
1122 }
252b5132 1123 }
3b1b01cf
TR
1124 /* should not be here */
1125 return -1;
252b5132
RH
1126}
1127
1128/* Read an import or export file. For an import file, this is called
1129 by the before_allocation emulation routine. For an export file,
3bcf5557 1130 this is called by the handle_option emulation routine. */
252b5132
RH
1131
1132static void
0c7a8e5a 1133gld${EMULATION_NAME}_read_file (const char *filename, bfd_boolean import)
252b5132
RH
1134{
1135 struct obstack *o;
1136 FILE *f;
1137 int lineno;
1138 int c;
b34976b6 1139 bfd_boolean keep;
252b5132
RH
1140 const char *imppath;
1141 const char *impfile;
1142 const char *impmember;
1143
1144 o = (struct obstack *) xmalloc (sizeof (struct obstack));
1145 obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
1146
1147 f = fopen (filename, FOPEN_RT);
1148 if (f == NULL)
1149 {
1150 bfd_set_error (bfd_error_system_call);
df5f2391 1151 einfo ("%F%P: %s: %E\n", filename);
b2e951ec 1152 return;
252b5132
RH
1153 }
1154
b34976b6 1155 keep = FALSE;
252b5132
RH
1156
1157 imppath = NULL;
1158 impfile = NULL;
1159 impmember = NULL;
1160
1161 lineno = 0;
3b1b01cf 1162
69f284c7
TR
1163 /* Default to 32 and 64 bit mode
1164 symbols at top of /lib/syscalls.exp do not have a mode modifier and they
1165 are not repeated, assume 64 bit routines also want to use them.
1166 See the routine change_symbol_mode for more information. */
1167
3b1b01cf
TR
1168 symbol_mode = 0x04;
1169
252b5132
RH
1170 while ((c = getc (f)) != EOF)
1171 {
1172 char *s;
1173 char *symname;
1fdf0249 1174 unsigned int syscall_flag = 0;
252b5132
RH
1175 bfd_vma address;
1176 struct bfd_link_hash_entry *h;
1177
1178 if (c != '\n')
1179 {
1180 obstack_1grow (o, c);
1181 continue;
1182 }
1183
1184 obstack_1grow (o, '\0');
1185 ++lineno;
1186
1187 s = (char *) obstack_base (o);
3882b010 1188 while (ISSPACE (*s))
252b5132 1189 ++s;
fab80407
AM
1190 if (*s == '\0'
1191 || *s == '*'
1192 || change_symbol_mode (s)
1193 || (*s == '#' && s[1] == ' ')
249172c3 1194 || (!import && *s == '#' && s[1] == '!'))
252b5132
RH
1195 {
1196 obstack_free (o, obstack_base (o));
1197 continue;
1198 }
1199
1200 if (*s == '#' && s[1] == '!')
1201 {
1202 s += 2;
3882b010 1203 while (ISSPACE (*s))
252b5132
RH
1204 ++s;
1205 if (*s == '\0')
1206 {
1207 imppath = NULL;
1208 impfile = NULL;
1209 impmember = NULL;
1210 obstack_free (o, obstack_base (o));
1211 }
1212 else if (*s == '(')
df5f2391 1213 einfo (_("%F%P:%s:%d: #! ([member]) is not supported "
d003af55 1214 "in import files\n"),
252b5132
RH
1215 filename, lineno);
1216 else
1217 {
1218 char cs;
24c611d1 1219 char *start;
252b5132
RH
1220
1221 (void) obstack_finish (o);
b34976b6 1222 keep = TRUE;
24c611d1 1223 start = s;
249172c3 1224 while (!ISSPACE (*s) && *s != '(' && *s != '\0')
24c611d1 1225 ++s;
252b5132
RH
1226 cs = *s;
1227 *s = '\0';
24c611d1
RS
1228 if (!bfd_xcoff_split_import_path (link_info.output_bfd,
1229 start, &imppath, &impfile))
df5f2391 1230 einfo (_("%F%P: could not parse import path: %E\n"));
3882b010 1231 while (ISSPACE (cs))
252b5132
RH
1232 {
1233 ++s;
1234 cs = *s;
1235 }
1236 if (cs != '(')
1237 {
1238 impmember = "";
1239 if (cs != '\0')
df5f2391 1240 einfo (_("%P:%s:%d: warning: syntax error in import file\n"),
252b5132
RH
1241 filename, lineno);
1242 }
1243 else
1244 {
1245 ++s;
1246 impmember = s;
1247 while (*s != ')' && *s != '\0')
1248 ++s;
1249 if (*s == ')')
1250 *s = '\0';
1251 else
df5f2391 1252 einfo (_("%P:%s:%d: warning: syntax error in import file\n"),
252b5132
RH
1253 filename, lineno);
1254 }
1255 }
1256
1257 continue;
1258 }
1259
742aeb63 1260 if (symbol_mode & symbol_mode_mask)
fab80407
AM
1261 {
1262 /* This is a symbol to be imported or exported. */
1263 symname = s;
1fdf0249 1264 syscall_flag = 0;
fab80407
AM
1265 address = (bfd_vma) -1;
1266
249172c3 1267 while (!ISSPACE (*s) && *s != '\0')
fab80407
AM
1268 ++s;
1269 if (*s != '\0')
1270 {
1271 char *se;
3b1b01cf 1272
fab80407 1273 *s++ = '\0';
3b1b01cf 1274
3882b010 1275 while (ISSPACE (*s))
fab80407
AM
1276 ++s;
1277
1278 se = s;
249172c3 1279 while (!ISSPACE (*se) && *se != '\0')
fab80407
AM
1280 ++se;
1281 if (*se != '\0')
1282 {
1283 *se++ = '\0';
3882b010 1284 while (ISSPACE (*se))
fab80407
AM
1285 ++se;
1286 if (*se != '\0')
df5f2391 1287 einfo (_("%P:%s%d: warning: syntax error in "
d003af55 1288 "import/export file\n"),
fab80407
AM
1289 filename, lineno);
1290 }
1291
1292 if (s != se)
1293 {
1294 int status;
c89e8944 1295 const char *end;
fab80407 1296
249172c3 1297 status = is_syscall (s, &syscall_flag);
7fc44b9c
AM
1298
1299 if (0 > status)
249172c3
TR
1300 {
1301 /* not a system call, check for address */
c89e8944 1302 address = bfd_scan_vma (s, &end, 0);
249172c3
TR
1303 if (*end != '\0')
1304 {
df5f2391 1305 einfo (_("%P:%s:%d: warning: syntax error in "
d003af55 1306 "import/export file\n"),
249172c3 1307 filename, lineno);
7fc44b9c 1308
249172c3
TR
1309 }
1310 }
3b1b01cf 1311 }
252b5132 1312 }
3b1b01cf 1313
249172c3 1314 if (!import)
fab80407
AM
1315 {
1316 struct export_symbol_list *n;
1317
24898b70 1318 ldlang_add_undef (symname, TRUE);
fab80407
AM
1319 n = ((struct export_symbol_list *)
1320 xmalloc (sizeof (struct export_symbol_list)));
1321 n->next = export_symbols;
1322 n->name = xstrdup (symname);
fab80407
AM
1323 export_symbols = n;
1324 }
1325 else
1326 {
b34976b6
AM
1327 h = bfd_link_hash_lookup (link_info.hash, symname, FALSE, FALSE,
1328 TRUE);
fab80407
AM
1329 if (h == NULL || h->type == bfd_link_hash_new)
1330 {
1331 /* We can just ignore attempts to import an unreferenced
1332 symbol. */
1333 }
1334 else
1335 {
f13a99db
AM
1336 if (!bfd_xcoff_import_symbol (link_info.output_bfd,
1337 &link_info, h,
249172c3
TR
1338 address, imppath, impfile,
1339 impmember, syscall_flag))
df5f2391 1340 einfo (_("%X%P:%s:%d: failed to import symbol %s: %E\n"),
fab80407
AM
1341 filename, lineno, symname);
1342 }
1343 }
1344 }
252b5132
RH
1345 obstack_free (o, obstack_base (o));
1346 }
fab80407 1347
252b5132
RH
1348 if (obstack_object_size (o) > 0)
1349 {
df5f2391 1350 einfo (_("%P:%s:%d: warning: ignoring unterminated last line\n"),
fab80407
AM
1351 filename, lineno);
1352 obstack_free (o, obstack_base (o));
1353 }
252b5132 1354
249172c3 1355 if (!keep)
fab80407
AM
1356 {
1357 obstack_free (o, NULL);
1358 free (o);
252b5132 1359 }
b2e951ec
NC
1360
1361 fclose (f);
fab80407 1362}
252b5132
RH
1363
1364/* This routine saves us from worrying about declaring free. */
1365
1366static void
0c7a8e5a 1367gld${EMULATION_NAME}_free (void *p)
252b5132
RH
1368{
1369 free (p);
1370}
1371
1372/* This is called by the before_allocation routine via
1373 lang_for_each_statement. It looks for relocations and assignments
1374 to symbols. */
1375
1376static void
0c7a8e5a 1377gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *s)
252b5132
RH
1378{
1379 if (s->header.type == lang_reloc_statement_enum)
1380 {
1381 lang_reloc_statement_type *rs;
1382
1383 rs = &s->reloc_statement;
1384 if (rs->name == NULL)
d003af55 1385 einfo (_("%F%P: only relocations against symbols are permitted\n"));
f13a99db
AM
1386 if (!bfd_xcoff_link_count_reloc (link_info.output_bfd, &link_info,
1387 rs->name))
d003af55 1388 einfo (_("%F%P: bfd_xcoff_link_count_reloc failed: %E\n"));
252b5132
RH
1389 }
1390
1391 if (s->header.type == lang_assignment_statement_enum)
1392 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1393}
1394
1395/* Look through an expression for an assignment statement. */
1396
1397static void
0c7a8e5a 1398gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
252b5132
RH
1399{
1400 struct bfd_link_hash_entry *h;
1401
1402 switch (exp->type.node_class)
1403 {
1404 case etree_provide:
fb3dc213 1405 case etree_provided:
252b5132 1406 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
b34976b6 1407 FALSE, FALSE, FALSE);
252b5132
RH
1408 if (h == NULL)
1409 break;
1410 /* Fall through. */
1411 case etree_assign:
1412 if (strcmp (exp->assign.dst, ".") != 0)
1413 {
f13a99db
AM
1414 if (!bfd_xcoff_record_link_assignment (link_info.output_bfd,
1415 &link_info,
249172c3 1416 exp->assign.dst))
df5f2391 1417 einfo (_("%F%P: failed to record assignment to %s: %E\n"),
252b5132
RH
1418 exp->assign.dst);
1419 }
1420 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1421 break;
1422
1423 case etree_binary:
1424 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1425 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1426 break;
1427
1428 case etree_trinary:
1429 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1430 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1431 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1432 break;
1433
1434 case etree_unary:
1435 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1436 break;
1437
1438 default:
1439 break;
1440 }
1441}
1442
1443static char *
0c7a8e5a 1444gld${EMULATION_NAME}_get_script (int *isfile)
252b5132
RH
1445EOF
1446
7225345d 1447if test x"$COMPILE_IN" = xyes
252b5132
RH
1448then
1449# Scripts compiled in.
1450
1451# sed commands to quote an ld script as a C string.
5f642101 1452sc="-f ${srcdir}/emultempl/ostring.sed"
252b5132 1453
92b93329 1454fragment <<EOF
fab80407 1455{
252b5132
RH
1456 *isfile = 0;
1457
0e1862bb 1458 if (bfd_link_relocatable (&link_info) && config.build_constructors)
252b5132
RH
1459 return
1460EOF
b34976b6 1461sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
0e1862bb 1462echo ' ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c
b34976b6
AM
1463sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1464echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1465sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1466echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1467sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1468echo ' ; else return' >> e${EMULATION_NAME}.c
1469sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1470echo '; }' >> e${EMULATION_NAME}.c
252b5132
RH
1471
1472else
1473# Scripts read from the filesystem.
1474
92b93329 1475fragment <<EOF
fab80407 1476{
252b5132
RH
1477 *isfile = 1;
1478
0e1862bb 1479 if (bfd_link_relocatable (&link_info) && config.build_constructors)
252b5132 1480 return "ldscripts/${EMULATION_NAME}.xu";
0e1862bb 1481 else if (bfd_link_relocatable (&link_info))
252b5132
RH
1482 return "ldscripts/${EMULATION_NAME}.xr";
1483 else if (!config.text_read_only)
1484 return "ldscripts/${EMULATION_NAME}.xbn";
1485 else if (!config.magic_demand_paged)
1486 return "ldscripts/${EMULATION_NAME}.xn";
1487 else
1488 return "ldscripts/${EMULATION_NAME}.x";
1489}
1490EOF
1491
1492fi
1493
92b93329 1494fragment <<EOF
252b5132 1495
7fc44b9c 1496static void
0c7a8e5a 1497gld${EMULATION_NAME}_create_output_section_statements (void)
9a4c7f16
TR
1498{
1499 /* __rtinit */
f13a99db 1500 if ((bfd_get_flavour (link_info.output_bfd) == bfd_target_xcoff_flavour)
7fc44b9c 1501 && (link_info.init_function != NULL
69f284c7 1502 || link_info.fini_function != NULL
b34976b6 1503 || rtld))
9a4c7f16 1504 {
9a4c7f16
TR
1505 initfini_file = lang_add_input_file ("initfini",
1506 lang_input_file_is_file_enum,
1507 NULL);
7fc44b9c 1508
f13a99db 1509 initfini_file->the_bfd = bfd_create ("initfini", link_info.output_bfd);
9a4c7f16
TR
1510 if (initfini_file->the_bfd == NULL
1511 || ! bfd_set_arch_mach (initfini_file->the_bfd,
f13a99db
AM
1512 bfd_get_arch (link_info.output_bfd),
1513 bfd_get_mach (link_info.output_bfd)))
9a4c7f16 1514 {
df5f2391 1515 einfo (_("%F%P: can not create BFD: %E\n"));
9a4c7f16
TR
1516 return;
1517 }
7fc44b9c 1518
9a4c7f16 1519 /* Call backend to fill in the rest */
b34976b6
AM
1520 if (! bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd,
1521 link_info.init_function,
1522 link_info.fini_function,
1523 rtld))
9a4c7f16 1524 {
df5f2391 1525 einfo (_("%F%P: can not create BFD: %E\n"));
9a4c7f16
TR
1526 return;
1527 }
69f284c7
TR
1528
1529 /* __rtld defined in /lib/librtl.a */
b34976b6 1530 if (rtld)
69f284c7 1531 lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL);
9a4c7f16
TR
1532 }
1533}
1534
f1f0d9ab 1535static void
0c7a8e5a 1536gld${EMULATION_NAME}_set_output_arch (void)
f1f0d9ab 1537{
f13a99db
AM
1538 bfd_set_arch_mach (link_info.output_bfd,
1539 bfd_xcoff_architecture (link_info.output_bfd),
1540 bfd_xcoff_machine (link_info.output_bfd));
f1f0d9ab 1541
f13a99db
AM
1542 ldfile_output_architecture = bfd_get_arch (link_info.output_bfd);
1543 ldfile_output_machine = bfd_get_mach (link_info.output_bfd);
1544 ldfile_output_machine_name = bfd_printable_name (link_info.output_bfd);
f1f0d9ab
TR
1545}
1546
24c611d1
RS
1547static bfd_boolean
1548gld${EMULATION_NAME}_open_dynamic_archive (const char *arch,
1549 search_dirs_type *search,
1550 lang_input_statement_type *entry)
1551{
24c611d1
RS
1552 char *path;
1553
66be1055 1554 if (!entry->flags.maybe_archive)
24c611d1
RS
1555 return FALSE;
1556
d4ae5fb0
AM
1557 if (entry->flags.full_name_provided)
1558 path = concat (search->name, "/", entry->filename,
1559 (const char *) NULL);
1560 else
1561 path = concat (search->name, "/lib", entry->filename, arch, ".a",
1562 (const char *) NULL);
1563
24c611d1
RS
1564 if (!ldfile_try_open_bfd (path, entry))
1565 {
1566 free (path);
1567 return FALSE;
1568 }
1569 /* Don't include the searched directory in the import path. */
1570 bfd_xcoff_set_archive_import_path (&link_info, entry->the_bfd,
1571 path + strlen (search->name) + 1);
1572 entry->filename = path;
1573 return TRUE;
1574}
1575
3edf7b9f
DR
1576static bfd_boolean
1577gld${EMULATION_NAME}_print_symbol (struct bfd_link_hash_entry *hash_entry,
1578 void *ptr)
1579{
1580 asection *sec = (asection *) ptr;
1581
1582 if ((hash_entry->type == bfd_link_hash_defined
1583 || hash_entry->type == bfd_link_hash_defweak)
1584 && sec == hash_entry->u.def.section)
1585 {
1586 int i;
1587 struct xcoff_link_hash_entry *h;
1588
1589 for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
1590 print_space ();
1591 minfo ("0x%V ",
1592 (hash_entry->u.def.value
1593 + hash_entry->u.def.section->output_offset
1594 + hash_entry->u.def.section->output_section->vma));
1595
1596 /* Flag symbol if it has been garbage collected. */
1597 h = (struct xcoff_link_hash_entry *) hash_entry;
1598 if ((h != NULL) && !(h->flags & XCOFF_MARK))
1599 minfo (" -->gc");
1600 minfo (" %pT\n", hash_entry->root.string);
1601 }
1602
1603 return TRUE;
1604}
1605
249172c3 1606struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
252b5132
RH
1607 gld${EMULATION_NAME}_before_parse,
1608 syslib_default,
1609 hll_default,
1610 after_parse_default,
1611 gld${EMULATION_NAME}_after_open,
5c3261b0 1612 after_check_relocs_default,
9b538ba7 1613 before_place_orphans_default,
252b5132 1614 after_allocation_default,
f1f0d9ab
TR
1615 gld${EMULATION_NAME}_set_output_arch,
1616 gld${EMULATION_NAME}_choose_target,
252b5132
RH
1617 gld${EMULATION_NAME}_before_allocation,
1618 gld${EMULATION_NAME}_get_script,
1619 "${EMULATION_NAME}",
1620 "${OUTPUT_FORMAT}",
1e035701 1621 finish_default,
9a4c7f16 1622 gld${EMULATION_NAME}_create_output_section_statements,
24c611d1 1623 gld${EMULATION_NAME}_open_dynamic_archive,
249172c3
TR
1624 0, /* place_orphan */
1625 0, /* set_symbols */
252b5132 1626 gld${EMULATION_NAME}_parse_args,
3bcf5557
AM
1627 gld${EMULATION_NAME}_add_options,
1628 gld${EMULATION_NAME}_handle_option,
40d109bf 1629 gld${EMULATION_NAME}_unrecognized_file,
249172c3
TR
1630 NULL, /* list_options */
1631 NULL, /* recognized_file */
1632 NULL, /* find potential_libraries */
7a2f2d82 1633 NULL, /* new_vers_pattern */
1ff6de03
NA
1634 NULL, /* extra_map_file_text */
1635 ${LDEMUL_EMIT_CTF_EARLY-NULL},
3d16b64e
NA
1636 ${LDEMUL_ACQUIRE_STRINGS_FOR_CTF-NULL},
1637 ${LDEMUL_NEW_DYNSYM_FOR_CTF-NULL},
3edf7b9f 1638 gld${EMULATION_NAME}_print_symbol
252b5132
RH
1639};
1640EOF