Oops. Clean up changelog entry.
[deliverable/binutils-gdb.git] / ld / emultempl / aix.em
CommitLineData
252b5132
RH
1# This shell script emits a C file. -*- C -*-
2# It does some substitutions.
86af25fe
L
3if [ -z "$MACHINE" ]; then
4 OUTPUT_ARCH=${ARCH}
5else
6 OUTPUT_ARCH=${ARCH}:${MACHINE}
7fi
252b5132
RH
8cat >e${EMULATION_NAME}.c <<EOF
9/* This file is is generated by a shell script. DO NOT EDIT! */
10
11/* AIX emulation code for ${EMULATION_NAME}
8529105a
AM
12 Copyright 1991, 1993, 1995, 1996, 1997, 1998, 2000, 2001
13 Free Software Foundation, Inc.
252b5132
RH
14 Written by Steve Chamberlain <sac@cygnus.com>
15 AIX support by Ian Lance Taylor <ian@cygnus.com>
3b1b01cf 16 AIX 64 bit support by Tom Rix <trix@redhat.com>
252b5132
RH
17
18This file is part of GLD, the Gnu Linker.
19
20This program is free software; you can redistribute it and/or modify
21it under the terms of the GNU General Public License as published by
22the Free Software Foundation; either version 2 of the License, or
23(at your option) any later version.
24
25This program is distributed in the hope that it will be useful,
26but WITHOUT ANY WARRANTY; without even the implied warranty of
27MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28GNU General Public License for more details.
29
30You should have received a copy of the GNU General Public License
31along with this program; if not, write to the Free Software
32Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
33
34#define TARGET_IS_${EMULATION_NAME}
35
36#include "bfd.h"
37#include "sysdep.h"
38#include "libiberty.h"
39#include "getopt.h"
40#include "obstack.h"
41#include "bfdlink.h"
42
43#include <ctype.h>
44
45#include "ld.h"
46#include "ldmain.h"
3b1b01cf
TR
47#include "ldemul.h"
48#include "ldfile.h"
252b5132
RH
49#include "ldmisc.h"
50#include "ldexp.h"
51#include "ldlang.h"
52#include "ldctor.h"
53#include "ldgram.h"
54
3b1b01cf
TR
55#include "coff/internal.h"
56#include "coff/xcoff.h"
57
252b5132
RH
58static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
59static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
60static void gld${EMULATION_NAME}_after_open PARAMS ((void));
61static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
62static void gld${EMULATION_NAME}_read_file PARAMS ((const char *, boolean));
63static void gld${EMULATION_NAME}_free PARAMS ((PTR));
64static void gld${EMULATION_NAME}_find_relocs
65 PARAMS ((lang_statement_union_type *));
66static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
67static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
68
69/* The file alignment required for each section. */
70static unsigned long file_align;
71
72/* The maximum size the stack is permitted to grow. This is stored in
73 the a.out header. */
74static unsigned long maxstack;
75
76/* The maximum data size. This is stored in the a.out header. */
77static unsigned long maxdata;
78
79/* Whether to perform garbage collection. */
80static int gc = 1;
81
82/* The module type to use. */
83static unsigned short modtype = ('1' << 8) | 'L';
84
85/* Whether the .text section must be read-only (i.e., no relocs
86 permitted). */
87static int textro;
88
89/* Whether to implement Unix like linker semantics. */
90static int unix_ld;
91
92/* Structure used to hold import file list. */
93
94struct filelist
95{
96 struct filelist *next;
97 const char *name;
98};
99
100/* List of import files. */
101static struct filelist *import_files;
102
103/* List of export symbols read from the export files. */
104
105struct export_symbol_list
106{
107 struct export_symbol_list *next;
108 const char *name;
109 boolean syscall;
110};
111
112static struct export_symbol_list *export_symbols;
113
3b1b01cf
TR
114/* Maintains the 32 or 64 bit mode state of import file */
115static unsigned int symbol_mode = 0x04;
116
252b5132
RH
117/* This routine is called before anything else is done. */
118
119static void
120gld${EMULATION_NAME}_before_parse()
121{
122#ifndef TARGET_ /* I.e., if not generic. */
86af25fe
L
123 const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
124 if (arch)
125 {
126 ldfile_output_architecture = arch->arch;
127 ldfile_output_machine = arch->mach;
128 ldfile_output_machine_name = arch->printable_name;
129 }
130 else
131 ldfile_output_architecture = bfd_arch_${ARCH};
252b5132
RH
132#endif /* not TARGET_ */
133 config.has_shared = true;
3b1b01cf
TR
134
135 /*
136 * The link_info.[init|fini]_functions are initialized in ld/lexsup.c.
137 * Override them here so we can use the link_info.init_function as a
138 * state flag that lets the backend know that -binitfini has been done.
139 */
140 link_info.init_function = NULL;
141 link_info.fini_function = NULL;
142
252b5132
RH
143}
144
145/* Handle AIX specific options. */
146
147static int
148gld${EMULATION_NAME}_parse_args (argc, argv)
149 int argc;
150 char **argv;
151{
152 int prevoptind = optind;
153 int prevopterr = opterr;
154 int indx;
155 int longind;
156 int optc;
3b1b01cf 157 bfd_signed_vma val;
252b5132
RH
158 char *end;
159
3b1b01cf
TR
160 enum {
161 OPTION_IGNORE = 300,
162 OPTION_AUTOIMP,
163 OPTION_ERNOTOK,
164 OPTION_EROK,
165 OPTION_EXPORT,
166 OPTION_IMPORT,
167 OPTION_INITFINI,
168 OPTION_LOADMAP,
169 OPTION_MAXDATA,
170 OPTION_MAXSTACK,
171 OPTION_MODTYPE,
172 OPTION_NOAUTOIMP,
173 OPTION_NOSTRCMPCT,
174 OPTION_PD,
175 OPTION_PT,
176 OPTION_STRCMPCT,
177 OPTION_UNIX
178 };
179
180 /*
181 b64 is an empty option. The native linker uses -b64 for xcoff64 support
182 Our linker uses -m aixppc64 for xcoff64 support. The choice for the
183 correct emulation is done in collect2.c via the environmental varible
184 LDEMULATION.
185
186 binitfini has special handling in the linker backend. The native linker
187 uses the arguemnts to generate a table of init and fini functions for
188 the executable. The important use for this option is to support aix 4.2+
189 c++ constructors and destructors. This is tied into gcc via collect2.c.
190 The function table is accessed by the runtime linker/loader by checking if
191 the first symbol in the loader symbol table is "__rtinit". The native
192 linker generates this table and the loader symbol. The gnu linker looks
193 for the symbol "__rtinit" and makes it the first loader symbol. It is the
194 responsiblity of the user to define the __rtinit symbol. The format for
195 __rtinit is given by the aix system file /usr/include/rtinit.h. You can
196 look at collect2.c to see an example of how this is done for 32 and 64 bit.
197 Below is an exmaple of a 32 bit assembly file that defines __rtinit.
198
199 .file "my_rtinit.s"
200
201 .csect .data[RW],3
202 .globl __rtinit
203 .extern init_function
204 .extern fini_function
205
206 __rtinit:
207 .long 0
208 .long f1i - __rtinit
209 .long f1f - __rtinit
210 .long f2i - f1i
211 .align 3
212 f1i: .long init_function
213 .long s1i - __rtinit
214 .long 0
215 f2i: .long 0
216 .long 0
217 .long 0
218 f1f: .long fini_function
219 .long s1f - __rtinit
220 .long 0
221 f2f: .long 0
222 .long 0
223 .long 0
224 .align 3
225 s1i: .string "init_function"
226 .align 3
227 s1f: .string "fini_function"
228
229 */
230
231 static const struct option longopts[] = {
252b5132
RH
232 {"basis", no_argument, NULL, OPTION_IGNORE},
233 {"bautoimp", no_argument, NULL, OPTION_AUTOIMP},
234 {"bcomprld", no_argument, NULL, OPTION_IGNORE},
235 {"bcrld", no_argument, NULL, OPTION_IGNORE},
236 {"bcror31", no_argument, NULL, OPTION_IGNORE},
237 {"bD", required_argument, NULL, OPTION_MAXDATA},
238 {"bE", required_argument, NULL, OPTION_EXPORT},
239 {"bernotok", no_argument, NULL, OPTION_ERNOTOK},
240 {"berok", no_argument, NULL, OPTION_EROK},
241 {"berrmsg", no_argument, NULL, OPTION_IGNORE},
242 {"bexport", required_argument, NULL, OPTION_EXPORT},
243 {"bf", no_argument, NULL, OPTION_ERNOTOK},
244 {"bgc", no_argument, &gc, 1},
245 {"bh", required_argument, NULL, OPTION_IGNORE},
246 {"bhalt", required_argument, NULL, OPTION_IGNORE},
247 {"bI", required_argument, NULL, OPTION_IMPORT},
248 {"bimport", required_argument, NULL, OPTION_IMPORT},
3b1b01cf 249 {"binitfini", required_argument, NULL, OPTION_INITFINI},
252b5132
RH
250 {"bl", required_argument, NULL, OPTION_LOADMAP},
251 {"bloadmap", required_argument, NULL, OPTION_LOADMAP},
252 {"bmaxdata", required_argument, NULL, OPTION_MAXDATA},
253 {"bmaxstack", required_argument, NULL, OPTION_MAXSTACK},
254 {"bM", required_argument, NULL, OPTION_MODTYPE},
255 {"bmodtype", required_argument, NULL, OPTION_MODTYPE},
256 {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP},
257 {"bnodelcsect", no_argument, NULL, OPTION_IGNORE},
258 {"bnoentry", no_argument, NULL, OPTION_IGNORE},
259 {"bnogc", no_argument, &gc, 0},
260 {"bnso", no_argument, NULL, OPTION_NOAUTOIMP},
261 {"bnostrcmpct", no_argument, NULL, OPTION_NOSTRCMPCT},
262 {"bnotextro", no_argument, &textro, 0},
263 {"bnro", no_argument, &textro, 0},
264 {"bpD", required_argument, NULL, OPTION_PD},
265 {"bpT", required_argument, NULL, OPTION_PT},
266 {"bro", no_argument, &textro, 1},
267 {"bS", required_argument, NULL, OPTION_MAXSTACK},
268 {"bso", no_argument, NULL, OPTION_AUTOIMP},
269 {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT},
270 {"btextro", no_argument, &textro, 1},
3b1b01cf 271 {"b64", no_argument, NULL, 0},
252b5132
RH
272 {"static", no_argument, NULL, OPTION_NOAUTOIMP},
273 {"unix", no_argument, NULL, OPTION_UNIX},
274 {NULL, no_argument, NULL, 0}
275 };
276
277 /* Options supported by the AIX linker which we do not support: -f,
278 -S, -v, -Z, -bbindcmds, -bbinder, -bbindopts, -bcalls, -bcaps,
279 -bcror15, -bdebugopt, -bdbg, -bdelcsect, -bex?, -bfilelist, -bfl,
280 -bgcbypass, -bglink, -binsert, -bi, -bloadmap, -bl, -bmap, -bnl,
281 -bnobind, -bnocomprld, -bnocrld, -bnoerrmsg, -bnoglink,
282 -bnoloadmap, -bnl, -bnoobjreorder, -bnoquiet, -bnoreorder,
283 -bnotypchk, -bnox, -bquiet, -bR, -brename, -breorder, -btypchk,
284 -bx, -bX, -bxref. */
285
286 /* If the current option starts with -b, change the first : to an =.
287 The AIX linker uses : to separate the option from the argument;
288 changing it to = lets us treat it as a getopt option. */
289 indx = optind;
3b1b01cf 290 if (indx == 0) {
252b5132 291 indx = 1;
3b1b01cf
TR
292 }
293
294 if (indx < argc && strncmp (argv[indx], "-b", 2) == 0) {
295 char *s;
296
297 for (s = argv[indx]; *s != '\0'; s++) {
298 if (*s == ':') {
299 *s = '=';
300 break;
301 }
252b5132 302 }
3b1b01cf
TR
303 }
304
252b5132
RH
305
306 /* We add s and u so to the short options list so that -s and -u on
307 the command line do not match -static and -unix. */
308
309 opterr = 0;
310 optc = getopt_long_only (argc, argv, "-D:H:KT:zsu", longopts, &longind);
311 opterr = prevopterr;
312
313 switch (optc)
314 {
315 case 's':
316 case 'u':
317 default:
318 optind = prevoptind;
319 return 0;
320
321 case 0:
322 /* Long option which just sets a flag. */
323 break;
324
325 case 'D':
3b1b01cf 326 val = strtoll (optarg, &end, 0);
252b5132
RH
327 if (*end != '\0')
328 einfo ("%P: warning: ignoring invalid -D number %s\n", optarg);
329 else if (val != -1)
330 lang_section_start (".data", exp_intop (val));
331 break;
332
333 case 'H':
334 val = strtoul (optarg, &end, 0);
335 if (*end != '\0'
336 || (val & (val - 1)) != 0)
337 einfo ("%P: warning: ignoring invalid -H number %s\n", optarg);
338 else
339 file_align = val;
340 break;
341
342 case 'K':
343 case 'z':
344 /* FIXME: This should use the page size for the target system. */
345 file_align = 4096;
346 break;
347
348 case 'T':
349 /* On AIX this is the same as GNU ld -Ttext. When we see -T
350 number, we assume the AIX option is intended. Otherwise, we
351 assume the usual GNU ld -T option is intended. We can't just
352 ignore the AIX option, because gcc passes it to the linker. */
3b1b01cf 353 val = strtoull (optarg, &end, 0);
252b5132
RH
354 if (*end != '\0')
355 {
356 optind = prevoptind;
357 return 0;
358 }
359 lang_section_start (".text", exp_intop (val));
360 break;
361
362 case OPTION_IGNORE:
363 break;
364
3b1b01cf
TR
365 case OPTION_INITFINI: {
366 /*
367 * The aix linker init fini has the format :
368 *
369 * -binitfini:[ Initial][:Termination][:Priority]
370 *
371 * it allows the Termination and Priority to be optional.
372 *
373 * Since we support only one init/fini pair, we ignore the Priority.
374 *
375 * Define the special symbol __rtinit.
376 *
377 * strtok does not correctly handle the case of -binitfini::fini: so
378 * do it by hand
379 */
380 char *t, *i, *f;
381
382 i = t = optarg;
383 while (*t && ':' != *t) t++;
384 if (*t) *t++ = 0;
385
386 if (0 != strlen(i)) {
387 link_info.init_function = i;
388 }
389
390 f = t;
391 while (*t && ':' != *t) t++;
392 *t = 0;
393
394 if (0 != strlen(f)) {
395 link_info.fini_function = f;
396 }
397 }
398 break;
399
252b5132
RH
400 case OPTION_AUTOIMP:
401 link_info.static_link = false;
402 break;
403
404 case OPTION_ERNOTOK:
405 force_make_executable = false;
406 break;
407
408 case OPTION_EROK:
409 force_make_executable = true;
410 break;
411
412 case OPTION_EXPORT:
413 gld${EMULATION_NAME}_read_file (optarg, false);
414 break;
415
416 case OPTION_IMPORT:
417 {
418 struct filelist *n;
419 struct filelist **flpp;
420
421 n = (struct filelist *) xmalloc (sizeof (struct filelist));
422 n->next = NULL;
423 n->name = optarg;
424 flpp = &import_files;
425 while (*flpp != NULL)
426 flpp = &(*flpp)->next;
427 *flpp = n;
428 }
429 break;
430
431 case OPTION_LOADMAP:
432 config.map_filename = optarg;
433 break;
434
435 case OPTION_MAXDATA:
3b1b01cf 436 val = strtoull (optarg, &end, 0);
252b5132
RH
437 if (*end != '\0')
438 einfo ("%P: warning: ignoring invalid -bmaxdata number %s\n",
439 optarg);
440 else
441 maxdata = val;
442 break;
443
444 case OPTION_MAXSTACK:
3b1b01cf 445 val = strtoull (optarg, &end, 0);
252b5132
RH
446 if (*end != '\0')
447 einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n",
448 optarg);
449 else
450 maxstack = val;
451 break;
452
453 case OPTION_MODTYPE:
454 if (*optarg == 'S')
455 {
456 link_info.shared = true;
457 ++optarg;
458 }
459 if (*optarg == '\0' || optarg[1] == '\0')
460 einfo ("%P: warning: ignoring invalid module type %s\n", optarg);
461 else
462 modtype = (*optarg << 8) | optarg[1];
463 break;
464
465 case OPTION_NOAUTOIMP:
466 link_info.static_link = true;
467 break;
468
469 case OPTION_NOSTRCMPCT:
470 link_info.traditional_format = true;
471 break;
472
473 case OPTION_PD:
474 /* This sets the page that the .data section is supposed to
475 start on. The offset within the page should still be the
476 offset within the file, so we need to build an appropriate
477 expression. */
3b1b01cf 478 val = strtoull (optarg, &end, 0);
252b5132
RH
479 if (*end != '\0')
480 einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg);
481 else
482 {
483 etree_type *t;
484
485 t = exp_binop ('+',
486 exp_intop (val),
487 exp_binop ('&',
488 exp_nameop (NAME, "."),
489 exp_intop (0xfff)));
490 t = exp_binop ('&',
491 exp_binop ('+', t, exp_intop (31)),
492 exp_intop (~ (bfd_vma) 31));
493 lang_section_start (".data", t);
494 }
495 break;
496
497 case OPTION_PT:
498 /* This set the page that the .text section is supposed to start
499 on. The offset within the page should still be the offset
500 within the file. */
3b1b01cf 501 val = strtoull (optarg, &end, 0);
252b5132
RH
502 if (*end != '\0')
503 einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg);
504 else
505 {
506 etree_type *t;
507
508 t = exp_binop ('+',
509 exp_intop (val),
510 exp_nameop (SIZEOF_HEADERS, NULL));
511 t = exp_binop ('&',
512 exp_binop ('+', t, exp_intop (31)),
513 exp_intop (~ (bfd_vma) 31));
514 lang_section_start (".text", t);
515 }
516 break;
517
518 case OPTION_STRCMPCT:
519 link_info.traditional_format = false;
520 break;
521
522 case OPTION_UNIX:
523 unix_ld = true;
524 break;
525 }
526
527 return 1;
528}
529
530/* This is called when an input file can not be recognized as a BFD
531 object or an archive. If the file starts with #!, we must treat it
532 as an import file. This is for AIX compatibility. */
533
534static boolean
535gld${EMULATION_NAME}_unrecognized_file (entry)
536 lang_input_statement_type *entry;
537{
538 FILE *e;
539 boolean ret;
540
541 e = fopen (entry->filename, FOPEN_RT);
542 if (e == NULL)
543 return false;
544
545 ret = false;
546
547 if (getc (e) == '#' && getc (e) == '!')
548 {
549 struct filelist *n;
550 struct filelist **flpp;
551
552 n = (struct filelist *) xmalloc (sizeof (struct filelist));
553 n->next = NULL;
554 n->name = entry->filename;
555 flpp = &import_files;
556 while (*flpp != NULL)
557 flpp = &(*flpp)->next;
558 *flpp = n;
559
560 ret = true;
561 entry->loaded = true;
562 }
563
564 fclose (e);
565
566 return ret;
567}
568
569/* This is called after the input files have been opened. */
570
571static void
572gld${EMULATION_NAME}_after_open ()
573{
574 boolean r;
575 struct set_info *p;
576
577 /* Call ldctor_build_sets, after pretending that this is a
578 relocateable link. We do this because AIX requires relocation
579 entries for all references to symbols, even in a final
580 executable. Of course, we only want to do this if we are
581 producing an XCOFF output file. */
582 r = link_info.relocateable;
583 if (strstr (bfd_get_target (output_bfd), "xcoff") != NULL)
584 link_info.relocateable = true;
585 ldctor_build_sets ();
586 link_info.relocateable = r;
587
588 /* For each set, record the size, so that the XCOFF backend can
589 output the correct csect length. */
590 for (p = sets; p != (struct set_info *) NULL; p = p->next)
591 {
592 bfd_size_type size;
593
594 /* If the symbol is defined, we may have been invoked from
595 collect, and the sets may already have been built, so we do
596 not do anything. */
597 if (p->h->type == bfd_link_hash_defined
598 || p->h->type == bfd_link_hash_defweak)
599 continue;
600
601 if (p->reloc != BFD_RELOC_CTOR)
602 {
603 /* Handle this if we need to. */
604 abort ();
605 }
606
607 size = (p->count + 2) * 4;
608 if (! bfd_xcoff_link_record_set (output_bfd, &link_info, p->h, size))
609 einfo ("%F%P: bfd_xcoff_link_record_set failed: %E\n");
610 }
611}
612
613/* This is called after the sections have been attached to output
614 sections, but before any sizes or addresses have been set. */
615
616static void
617gld${EMULATION_NAME}_before_allocation ()
618{
619 struct filelist *fl;
620 struct export_symbol_list *el;
621 char *libpath;
3b1b01cf 622 asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
252b5132
RH
623 int i;
624
625 /* Handle the import and export files, if any. */
626 for (fl = import_files; fl != NULL; fl = fl->next)
627 gld${EMULATION_NAME}_read_file (fl->name, true);
3b1b01cf
TR
628 for (el = export_symbols; el != NULL; el = el->next) {
629 struct bfd_link_hash_entry *h;
630
631 h = bfd_link_hash_lookup (link_info.hash, el->name, false, false, false);
632 if (h == NULL)
633 einfo ("%P%F: bfd_link_hash_lookup of export symbol failed: %E\n");
634 if (! bfd_xcoff_export_symbol (output_bfd, &link_info, h, el->syscall))
635 einfo ("%P%F: bfd_xcoff_export_symbol failed: %E\n");
636 }
252b5132
RH
637
638 /* Track down all relocations called for by the linker script (these
639 are typically constructor/destructor entries created by
640 CONSTRUCTORS) and let the backend know it will need to create
641 .loader relocs for them. */
642 lang_for_each_statement (gld${EMULATION_NAME}_find_relocs);
643
644 /* We need to build LIBPATH from the -L arguments. If any -rpath
645 arguments were used, though, we use -rpath instead, as a GNU
646 extension. */
647 if (command_line.rpath != NULL)
648 libpath = command_line.rpath;
649 else if (search_head == NULL)
650 libpath = (char *) "";
651 else
652 {
653 size_t len;
654 search_dirs_type *search;
655
656 len = strlen (search_head->name);
657 libpath = xmalloc (len + 1);
658 strcpy (libpath, search_head->name);
659 for (search = search_head->next; search != NULL; search = search->next)
660 {
661 size_t nlen;
662
663 nlen = strlen (search->name);
664 libpath = xrealloc (libpath, len + nlen + 2);
665 libpath[len] = ':';
666 strcpy (libpath + len + 1, search->name);
667 len += nlen + 1;
668 }
669 }
670
671 /* Let the XCOFF backend set up the .loader section. */
672 if (! bfd_xcoff_size_dynamic_sections (output_bfd, &link_info, libpath,
673 entry_symbol, file_align,
674 maxstack, maxdata,
675 gc && ! unix_ld ? true : false,
676 modtype,
677 textro ? true : false,
678 unix_ld,
679 special_sections))
680 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
681
682 /* Look through the special sections, and put them in the right
683 place in the link ordering. This is especially magic. */
3b1b01cf
TR
684 for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++) {
685 asection *sec;
686 lang_output_section_statement_type *os;
687 lang_statement_union_type **pls;
688 lang_input_section_type *is;
689 const char *oname;
690 boolean start;
691
692 sec = special_sections[i];
693 if (sec == NULL)
694 continue;
695
696 /* Remove this section from the list of the output section.
697 This assumes we know what the script looks like. */
698 is = NULL;
699 os = lang_output_section_find (sec->output_section->name);
700 if (os == NULL) {
701 einfo ("%P%F: can't find output section %s\n",
702 sec->output_section->name);
703 }
252b5132 704
3b1b01cf
TR
705 for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->next) {
706
707 if ((*pls)->header.type == lang_input_section_enum &&
708 (*pls)->input_section.section == sec) {
709 is = (lang_input_section_type *) *pls;
710 *pls = (*pls)->next;
711 break;
712 }
713
714 if ((*pls)->header.type == lang_wild_statement_enum) {
715 lang_statement_union_type **pwls;
716
717 for (pwls = &(*pls)->wild_statement.children.head;
718 *pwls != NULL;
719 pwls = &(*pwls)->next) {
720
721 if ((*pwls)->header.type == lang_input_section_enum &&
722 (*pwls)->input_section.section == sec) {
723
724 is = (lang_input_section_type *) *pwls;
725 *pwls = (*pwls)->next;
252b5132 726 break;
3b1b01cf
TR
727 }
728 }
729
730 if (is != NULL)
731 break;
732 }
733 }
252b5132 734
3b1b01cf
TR
735 if (is == NULL) {
736 einfo ("%P%F: can't find %s in output section\n",
737 bfd_get_section_name (sec->owner, sec));
738 }
739
740 /* Now figure out where the section should go. */
741 switch (i) {
742
743 default: /* to avoid warnings */
744 case XCOFF_SPECIAL_SECTION_TEXT:
745 /* _text */
746 oname = ".text";
747 start = true;
748 break;
749
750 case XCOFF_SPECIAL_SECTION_ETEXT:
751 /* _etext */
752 oname = ".text";
753 start = false;
754 break;
252b5132 755
3b1b01cf
TR
756 case XCOFF_SPECIAL_SECTION_DATA:
757 /* _data */
758 oname = ".data";
759 start = true;
760 break;
761
762 case XCOFF_SPECIAL_SECTION_EDATA:
763 /* _edata */
764 oname = ".data";
765 start = false;
766 break;
252b5132 767
3b1b01cf
TR
768 case XCOFF_SPECIAL_SECTION_END:
769 case XCOFF_SPECIAL_SECTION_END2:
770 /* _end and end */
771 oname = ".bss";
772 start = false;
773 break;
774 }
252b5132 775
3b1b01cf 776 os = lang_output_section_find (oname);
252b5132 777
3b1b01cf
TR
778 if (start) {
779 is->header.next = os->children.head;
780 os->children.head = (lang_statement_union_type *) is;
781 } else {
782 is->header.next = NULL;
783 lang_statement_append (&os->children,
784 (lang_statement_union_type *) is,
785 &is->header.next);
786 }
787 }
788}
789
790static int change_symbol_mode (char *input)
791{
792 /*
793 * 1 : state changed
794 * 0 : no change
795 */
796
797 char *symbol_mode_string[] = {
798 "# 32", /* 0x01 */
799 "# 64", /* 0x02 */
800 "# no32", /* 0x04 */
801 "# no64", /* 0x08 */
802 NULL,
803 };
804 unsigned int bit;
805 char *string;
806
807 for (bit = 0; ; bit++) {
808 string = symbol_mode_string[bit];
809 if (NULL == string)
810 return 0;
811
812 if (0 == strcmp(input, string)) {
813 symbol_mode = (1 << bit);
814 return 1;
815 }
816 }
817 /* should not be here */
818 return 0;
819}
820
821
822static int is_syscall(char *input)
823{
824 /*
825 * 1 : yes
826 * 0 : ignore
827 * -1 : error, try something else
828 */
829 unsigned int bit;
830 char *string;
831
832 char *syscall_string[] = {
833 "svc", /* 0x01 */
834 "svc32", /* 0x02 */
835 "svc3264", /* 0x04 */
836 "svc64", /* 0x08 */
837 "syscall", /* 0x10 */
838 "syscall32", /* 0x20 */
839 "syscall3264", /* 0x40 */
840 "syscall64", /* 0x80 */
841 NULL
842 };
843
844 for (bit = 0; ;bit++) {
845
846 string = syscall_string[bit];
847 if (NULL == string) {
848 return -1;
849 }
850
851 if (0 == strcmp(input, string)) {
852 if (1 << bit & ${SYSCALL_MASK}) {
853 return 1;
854 } else {
855 return 0;
856 }
252b5132 857 }
3b1b01cf
TR
858 }
859 /* should not be here */
860 return -1;
252b5132
RH
861}
862
3b1b01cf 863
252b5132
RH
864/* Read an import or export file. For an import file, this is called
865 by the before_allocation emulation routine. For an export file,
866 this is called by the parse_args emulation routine. */
867
868static void
869gld${EMULATION_NAME}_read_file (filename, import)
870 const char *filename;
871 boolean import;
872{
873 struct obstack *o;
874 FILE *f;
875 int lineno;
876 int c;
877 boolean keep;
878 const char *imppath;
879 const char *impfile;
880 const char *impmember;
881
882 o = (struct obstack *) xmalloc (sizeof (struct obstack));
883 obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free);
884
885 f = fopen (filename, FOPEN_RT);
886 if (f == NULL)
887 {
888 bfd_set_error (bfd_error_system_call);
889 einfo ("%F%s: %E\n", filename);
890 }
891
892 keep = false;
893
894 imppath = NULL;
895 impfile = NULL;
896 impmember = NULL;
897
898 lineno = 0;
3b1b01cf
TR
899
900 /*
901 * default to 32 and 64 bit mode
902 * symbols at top of /lib/syscalls.exp do not have a mode modifier and they
903 * are not repeated, assume 64 bit routines also want to use them.
904 * See the routine change_symbol_mode for more information.
905 */
906 symbol_mode = 0x04;
907
252b5132
RH
908 while ((c = getc (f)) != EOF)
909 {
910 char *s;
911 char *symname;
912 boolean syscall;
913 bfd_vma address;
914 struct bfd_link_hash_entry *h;
915
916 if (c != '\n')
917 {
918 obstack_1grow (o, c);
919 continue;
920 }
921
922 obstack_1grow (o, '\0');
923 ++lineno;
924
925 s = (char *) obstack_base (o);
926 while (isspace ((unsigned char) *s))
927 ++s;
3b1b01cf
TR
928 if (*s == '\0' ||
929 *s == '*' ||
930 change_symbol_mode (s) ||
931 (*s == '#' && s[1] == ' ') ||
932 (! import && *s == '#' && s[1] == '!'))
252b5132
RH
933 {
934 obstack_free (o, obstack_base (o));
935 continue;
936 }
937
938 if (*s == '#' && s[1] == '!')
939 {
940 s += 2;
941 while (isspace ((unsigned char) *s))
942 ++s;
943 if (*s == '\0')
944 {
945 imppath = NULL;
946 impfile = NULL;
947 impmember = NULL;
948 obstack_free (o, obstack_base (o));
949 }
950 else if (*s == '(')
951 einfo ("%F%s%d: #! ([member]) is not supported in import files\n",
952 filename, lineno);
953 else
954 {
955 char cs;
956 char *file;
957
958 (void) obstack_finish (o);
959 keep = true;
960 imppath = s;
961 file = NULL;
962 while (! isspace ((unsigned char) *s) && *s != '(' && *s != '\0')
963 {
964 if (*s == '/')
965 file = s + 1;
966 ++s;
967 }
968 if (file != NULL)
969 {
970 file[-1] = '\0';
971 impfile = file;
972 if (imppath == file - 1)
973 imppath = "/";
974 }
975 else
976 {
977 impfile = imppath;
978 imppath = "";
979 }
980 cs = *s;
981 *s = '\0';
982 while (isspace ((unsigned char) cs))
983 {
984 ++s;
985 cs = *s;
986 }
987 if (cs != '(')
988 {
989 impmember = "";
990 if (cs != '\0')
991 einfo ("%s:%d: warning: syntax error in import file\n",
992 filename, lineno);
993 }
994 else
995 {
996 ++s;
997 impmember = s;
998 while (*s != ')' && *s != '\0')
999 ++s;
1000 if (*s == ')')
1001 *s = '\0';
1002 else
1003 einfo ("%s:%d: warning: syntax error in import file\n",
1004 filename, lineno);
1005 }
1006 }
1007
1008 continue;
1009 }
1010
3b1b01cf
TR
1011 if (symbol_mode & ${SYMBOL_MODE_MASK}) {
1012
1013 /* This is a symbol to be imported or exported. */
1014 symname = s;
1015 syscall = false;
1016 address = (bfd_vma) -1;
1017
1018 while (! isspace ((unsigned char) *s) && *s != '\0')
1019 ++s;
1020 if (*s != '\0')
1021 {
1022 char *se;
1023
1024 *s++ = '\0';
1025
1026 while (isspace ((unsigned char) *s))
1027 ++s;
1028
1029 se = s;
1030 while (! isspace ((unsigned char) *se) && *se != '\0')
1031 ++se;
1032 if (*se != '\0')
1033 {
1034 *se++ = '\0';
1035 while (isspace ((unsigned char) *se))
1036 ++se;
1037 if (*se != '\0')
1038 einfo ("%s%d: warning: syntax error in import/export file\n",
1039 filename, lineno);
1040 }
1041
1042 if (s != se) {
1043 int status;
252b5132 1044 char *end;
3b1b01cf
TR
1045
1046 status = is_syscall(s);
1047
1048 switch (status) {
1049 case 1:
1050 /* this is a system call */
1051 syscall = true;
1052 break;
1053
1054 case 0:
1055 /* ignore this system call */
1056 break;
1057
1058 default:
1059 /* not a system call, check for address */
1060 address = strtoul (s, &end, 0);
1061 if (*end != '\0') {
1062 einfo ("%s:%d: warning: syntax error in import/export file\n", filename, lineno);
1063
1064 }
1065 }
252b5132 1066 }
3b1b01cf
TR
1067 }
1068
1069 if (! import)
1070 {
1071 struct export_symbol_list *n;
1072
1073 ldlang_add_undef (symname);
1074 n = ((struct export_symbol_list *)
1075 xmalloc (sizeof (struct export_symbol_list)));
1076 n->next = export_symbols;
1077 n->name = xstrdup (symname);
1078 n->syscall = syscall;
1079 export_symbols = n;
1080 }
1081 else
1082 {
1083 h = bfd_link_hash_lookup (link_info.hash, symname, false, false,
1084 true);
1085 if (h == NULL || h->type == bfd_link_hash_new)
1086 {
1087 /* We can just ignore attempts to import an unreferenced
1088 symbol. */
1089 }
1090 else
1091 {
1092 if (! bfd_xcoff_import_symbol (output_bfd, &link_info, h,
1093 address, imppath, impfile,
1094 impmember))
1095 einfo ("%X%s:%d: failed to import symbol %s: %E\n",
1096 filename, lineno, symname);
1097 }
1098 }
1099 }
252b5132
RH
1100 obstack_free (o, obstack_base (o));
1101 }
3b1b01cf 1102
252b5132
RH
1103 if (obstack_object_size (o) > 0)
1104 {
3b1b01cf
TR
1105 einfo ("%s:%d: warning: ignoring unterminated last line\n",
1106 filename, lineno);
1107 obstack_free (o, obstack_base (o));
1108 }
252b5132 1109
3b1b01cf
TR
1110 if (! keep)
1111 {
1112 obstack_free (o, NULL);
1113 free (o);
1114 }
252b5132 1115 }
252b5132
RH
1116
1117/* This routine saves us from worrying about declaring free. */
1118
1119static void
1120gld${EMULATION_NAME}_free (p)
1121 PTR p;
1122{
1123 free (p);
1124}
1125
1126/* This is called by the before_allocation routine via
1127 lang_for_each_statement. It looks for relocations and assignments
1128 to symbols. */
1129
1130static void
1131gld${EMULATION_NAME}_find_relocs (s)
1132 lang_statement_union_type *s;
1133{
1134 if (s->header.type == lang_reloc_statement_enum)
1135 {
1136 lang_reloc_statement_type *rs;
1137
1138 rs = &s->reloc_statement;
1139 if (rs->name == NULL)
1140 einfo ("%F%P: only relocations against symbols are permitted\n");
1141 if (! bfd_xcoff_link_count_reloc (output_bfd, &link_info, rs->name))
1142 einfo ("%F%P: bfd_xcoff_link_count_reloc failed: %E\n");
1143 }
1144
1145 if (s->header.type == lang_assignment_statement_enum)
1146 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1147}
1148
1149/* Look through an expression for an assignment statement. */
1150
1151static void
1152gld${EMULATION_NAME}_find_exp_assignment (exp)
1153 etree_type *exp;
1154{
1155 struct bfd_link_hash_entry *h;
1156
1157 switch (exp->type.node_class)
1158 {
1159 case etree_provide:
1160 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
1161 false, false, false);
1162 if (h == NULL)
1163 break;
1164 /* Fall through. */
1165 case etree_assign:
1166 if (strcmp (exp->assign.dst, ".") != 0)
1167 {
1168 if (! bfd_xcoff_record_link_assignment (output_bfd, &link_info,
1169 exp->assign.dst))
1170 einfo ("%P%F: failed to record assignment to %s: %E\n",
1171 exp->assign.dst);
1172 }
1173 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1174 break;
1175
1176 case etree_binary:
1177 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1178 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1179 break;
1180
1181 case etree_trinary:
1182 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1183 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1184 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1185 break;
1186
1187 case etree_unary:
1188 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1189 break;
1190
1191 default:
1192 break;
1193 }
1194}
1195
1196static char *
1197gld${EMULATION_NAME}_get_script(isfile)
1198 int *isfile;
1199EOF
1200
1201if test -n "$COMPILE_IN"
1202then
1203# Scripts compiled in.
1204
1205# sed commands to quote an ld script as a C string.
5f642101 1206sc="-f ${srcdir}/emultempl/ostring.sed"
252b5132
RH
1207
1208cat >>e${EMULATION_NAME}.c <<EOF
1209{
1210 *isfile = 0;
1211
1212 if (link_info.relocateable == true && config.build_constructors == true)
1213 return
1214EOF
1215sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1216echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1217sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1218echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1219sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1220echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1221sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1222echo ' ; else return' >> e${EMULATION_NAME}.c
1223sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1224echo '; }' >> e${EMULATION_NAME}.c
1225
1226else
1227# Scripts read from the filesystem.
1228
1229cat >>e${EMULATION_NAME}.c <<EOF
1230{
1231 *isfile = 1;
1232
1233 if (link_info.relocateable == true && config.build_constructors == true)
1234 return "ldscripts/${EMULATION_NAME}.xu";
1235 else if (link_info.relocateable == true)
1236 return "ldscripts/${EMULATION_NAME}.xr";
1237 else if (!config.text_read_only)
1238 return "ldscripts/${EMULATION_NAME}.xbn";
1239 else if (!config.magic_demand_paged)
1240 return "ldscripts/${EMULATION_NAME}.xn";
1241 else
1242 return "ldscripts/${EMULATION_NAME}.x";
1243}
1244EOF
1245
1246fi
1247
1248cat >>e${EMULATION_NAME}.c <<EOF
1249
1250struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1251{
1252 gld${EMULATION_NAME}_before_parse,
1253 syslib_default,
1254 hll_default,
1255 after_parse_default,
1256 gld${EMULATION_NAME}_after_open,
1257 after_allocation_default,
1258 set_output_arch_default,
1259 ldemul_default_target,
1260 gld${EMULATION_NAME}_before_allocation,
1261 gld${EMULATION_NAME}_get_script,
1262 "${EMULATION_NAME}",
1263 "${OUTPUT_FORMAT}",
1264 0, /* finish */
1265 0, /* create_output_section_statements */
1266 0, /* open_dynamic_archive */
1267 0, /* place_orphan */
1268 0, /* set_symbols */
1269 gld${EMULATION_NAME}_parse_args,
40d109bf 1270 gld${EMULATION_NAME}_unrecognized_file,
3b1b01cf
TR
1271 NULL, /* list_options */
1272 NULL, /* recognized_file */
1273 NULL, /* find potential_libraries */
252b5132
RH
1274};
1275EOF
This page took 0.11967 seconds and 4 git commands to generate.