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