1 /* POWER/PowerPC XCOFF linker support.
2 Copyright 1995 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor <ian@cygnus.com>, Cygnus Support.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
25 #include "coff/internal.h"
28 /* This file holds the XCOFF linker code. */
30 #define STRING_SIZE_SIZE (4)
32 /* In order to support linking different object file formats into an
33 XCOFF format, we need to be able to determine whether a particular
34 bfd_target is an XCOFF vector. FIXME: We need to rethink this
36 #define XCOFF_XVECP(xv) \
37 (strcmp ((xv)->name, "aixcoff-rs6000") == 0 \
38 || strcmp ((xv)->name, "xcoff-powermac") == 0)
40 /* Get the XCOFF hash table entries for a BFD. */
41 #define obj_xcoff_sym_hashes(bfd) \
42 ((struct xcoff_link_hash_entry **) obj_coff_sym_hashes (bfd))
44 /* XCOFF relocation types. These probably belong in a header file
45 somewhere. The relocations are described in the function
46 _bfd_ppc_xcoff_relocate_section in this file. */
62 #define R_RRTBI (0x14)
63 #define R_RRTBA (0x15)
71 /* The first word of global linkage code. This must be modified by
72 filling in the correct TOC offset. */
74 #define XCOFF_GLINK_FIRST (0x81820000) /* lwz r12,0(r2) */
76 /* The remaining words of global linkage code. */
78 static unsigned long xcoff_glink_code[] =
80 0x90410014, /* stw r2,20(r1) */
81 0x800c0000, /* lwz r0,0(r12) */
82 0x804c0004, /* lwz r2,4(r12) */
83 0x7c0903a6, /* mtctr r0 */
84 0x4e800420, /* bctr */
85 0x0, /* start of traceback table */
86 0x000c8000, /* traceback table */
87 0x0 /* traceback table */
90 #define XCOFF_GLINK_SIZE \
91 (((sizeof xcoff_glink_code / sizeof xcoff_glink_code[0]) * 4) + 4)
93 /* We reuse the SEC_ROM flag as a mark flag for garbage collection.
94 This flag will only be used on input sections. */
96 #define SEC_MARK (SEC_ROM)
98 /* The ldhdr structure. This appears at the start of the .loader
101 struct internal_ldhdr
103 /* The version number: currently always 1. */
104 unsigned long l_version;
105 /* The number of symbol table entries. */
106 bfd_size_type l_nsyms;
107 /* The number of relocation table entries. */
108 bfd_size_type l_nreloc;
109 /* The length of the import file string table. */
110 bfd_size_type l_istlen;
111 /* The number of import files. */
112 bfd_size_type l_nimpid;
113 /* The offset from the start of the .loader section to the first
114 entry in the import file table. */
115 bfd_size_type l_impoff;
116 /* The length of the string table. */
117 bfd_size_type l_stlen;
118 /* The offset from the start of the .loader section to the first
119 entry in the string table. */
120 bfd_size_type l_stoff;
123 struct external_ldhdr
125 bfd_byte l_version[4];
127 bfd_byte l_nreloc[4];
128 bfd_byte l_istlen[4];
129 bfd_byte l_nimpid[4];
130 bfd_byte l_impoff[4];
135 #define LDHDRSZ (8 * 4)
137 /* The ldsym structure. This is used to represent a symbol in the
140 struct internal_ldsym
144 /* The symbol name if <= SYMNMLEN characters. */
145 char _l_name[SYMNMLEN];
148 /* Zero if the symbol name is more than SYMNMLEN characters. */
150 /* The offset in the string table if the symbol name is more
151 than SYMNMLEN characters. */
155 /* The symbol value. */
157 /* The symbol section number. */
159 /* The symbol type and flags. */
161 /* The symbol storage class. */
163 /* The import file ID. */
164 bfd_size_type l_ifile;
165 /* Offset to the parameter type check string. */
166 bfd_size_type l_parm;
169 struct external_ldsym
173 bfd_byte _l_name[SYMNMLEN];
176 bfd_byte _l_zeroes[4];
177 bfd_byte _l_offset[4];
182 bfd_byte l_smtype[1];
183 bfd_byte l_smclas[1];
188 #define LDSYMSZ (8 + 3 * 4 + 2 + 2)
190 /* These flags are for the l_smtype field (the lower three bits are an
193 /* Imported symbol. */
194 #define L_IMPORT (0x40)
196 #define L_ENTRY (0x20)
197 /* Exported symbol. */
198 #define L_EXPORT (0x10)
200 /* The ldrel structure. This is used to represent a reloc in the
203 struct internal_ldrel
205 /* The reloc address. */
207 /* The symbol table index in the .loader section symbol table. */
208 bfd_size_type l_symndx;
209 /* The relocation type and size. */
211 /* The section number this relocation applies to. */
215 struct external_ldrel
218 bfd_byte l_symndx[4];
220 bfd_byte l_rsecnm[2];
223 #define LDRELSZ (2 * 4 + 2 * 2)
225 /* The list of import files. */
227 struct xcoff_import_file
229 /* The next entry in the list. */
230 struct xcoff_import_file *next;
235 /* The member name. */
239 /* An entry in the XCOFF linker hash table. */
241 struct xcoff_link_hash_entry
243 struct bfd_link_hash_entry root;
245 /* Symbol index in output file. Set to -1 initially. Set to -2 if
246 there is a reloc against this symbol. */
249 /* If we have created a TOC entry for this symbol, this is the .tc
250 section which holds it. */
251 asection *toc_section;
255 /* If we have created a TOC entry (the XCOFF_SET_TOC flag is
256 set), this is the offset in toc_section. */
258 /* If the TOC entry comes from an input file, this is set to the
259 symbo lindex of the C_HIDEXT XMC_TC symbol. */
263 /* If this symbol is a function entry point which is called, this
264 field holds a pointer to the function descriptor. If this symbol
265 is a function descriptor, this field holds a pointer to the
266 function entry point. */
267 struct xcoff_link_hash_entry *descriptor;
269 /* The .loader symbol table entry, if there is one. */
270 struct internal_ldsym *ldsym;
272 /* The .loader symbol table index. */
275 /* Some linker flags. */
276 unsigned short flags;
277 /* Symbol is referenced by a regular object. */
278 #define XCOFF_REF_REGULAR (01)
279 /* Symbol is defined by a regular object. */
280 #define XCOFF_DEF_REGULAR (02)
281 /* Symbol is defined by a dynamic object. */
282 #define XCOFF_DEF_DYNAMIC (04)
283 /* Symbol is used in a reloc being copied into the .loader section. */
284 #define XCOFF_LDREL (010)
285 /* Symbol is the entry point. */
286 #define XCOFF_ENTRY (020)
287 /* Symbol is called; this is, it appears in a R_BR reloc. */
288 #define XCOFF_CALLED (040)
289 /* Symbol needs the TOC entry filled in. */
290 #define XCOFF_SET_TOC (0100)
291 /* Symbol is explicitly imported. */
292 #define XCOFF_IMPORT (0200)
293 /* Symbol is explicitly exported. */
294 #define XCOFF_EXPORT (0400)
295 /* Symbol has been processed by xcoff_build_ldsyms. */
296 #define XCOFF_BUILT_LDSYM (01000)
297 /* Symbol is mentioned by a section which was not garbage collected. */
298 #define XCOFF_MARK (02000)
299 /* Symbol size is recorded in size_list list from hash table. */
300 #define XCOFF_HAS_SIZE (04000)
301 /* Symbol is a function descriptor. */
302 #define XCOFF_DESCRIPTOR (010000)
304 /* The storage mapping class. */
305 unsigned char smclas;
308 /* The XCOFF linker hash table. */
310 struct xcoff_link_hash_table
312 struct bfd_link_hash_table root;
314 /* The .debug string hash table. We need to compute this while
315 reading the input files, so that we know how large the .debug
316 section will be before we assign section positions. */
317 struct bfd_strtab_hash *debug_strtab;
319 /* The .debug section we will use for the final output. */
320 asection *debug_section;
322 /* The .loader section we will use for the final output. */
323 asection *loader_section;
325 /* A count of non TOC relative relocs which will need to be
326 allocated in the .loader section. */
329 /* The .loader section header. */
330 struct internal_ldhdr ldhdr;
332 /* The .gl section we use to hold global linkage code. */
333 asection *linkage_section;
335 /* The .tc section we use to hold toc entries we build for global
337 asection *toc_section;
339 /* The .ds section we use to hold function descriptors which we
340 create for exported symbols. */
341 asection *descriptor_section;
343 /* The list of import files. */
344 struct xcoff_import_file *imports;
346 /* Required alignment of sections within the output file. */
347 unsigned long file_align;
349 /* Whether the .text section must be read-only. */
352 /* Whether garbage collection was done. */
355 /* A linked list of symbols for which we have size information. */
356 struct xcoff_link_size_list
358 struct xcoff_link_size_list *next;
359 struct xcoff_link_hash_entry *h;
363 /* Magic sections: _text, _etext, _data, _edata, _end, end. */
364 asection *special_sections[6];
367 /* Information we keep for each section in the output file during the
370 struct xcoff_link_section_info
372 /* The relocs to be output. */
373 struct internal_reloc *relocs;
374 /* For each reloc against a global symbol whose index was not known
375 when the reloc was handled, the global hash table entry. */
376 struct xcoff_link_hash_entry **rel_hashes;
377 /* If there is a TOC relative reloc against a global symbol, and the
378 index of the TOC symbol is not known when the reloc was handled,
379 an entry is added to this linked list. This is not an array,
380 like rel_hashes, because this case is quite uncommon. */
381 struct xcoff_toc_rel_hash
383 struct xcoff_toc_rel_hash *next;
384 struct xcoff_link_hash_entry *h;
385 struct internal_reloc *rel;
389 /* Information that we pass around while doing the final link step. */
391 struct xcoff_final_link_info
393 /* General link information. */
394 struct bfd_link_info *info;
397 /* Hash table for long symbol names. */
398 struct bfd_strtab_hash *strtab;
399 /* Array of information kept for each output section, indexed by the
400 target_index field. */
401 struct xcoff_link_section_info *section_info;
402 /* Symbol index of last C_FILE symbol (-1 if none). */
403 long last_file_index;
404 /* Contents of last C_FILE symbol. */
405 struct internal_syment last_file;
406 /* Symbol index of TOC symbol. */
408 /* Start of .loader symbols. */
409 struct external_ldsym *ldsym;
410 /* Next .loader reloc to swap out. */
411 struct external_ldrel *ldrel;
412 /* File position of start of line numbers. */
413 file_ptr line_filepos;
414 /* Buffer large enough to hold swapped symbols of any input file. */
415 struct internal_syment *internal_syms;
416 /* Buffer large enough to hold output indices of symbols of any
419 /* Buffer large enough to hold output symbols for any input file. */
421 /* Buffer large enough to hold external line numbers for any input
424 /* Buffer large enough to hold any input section. */
426 /* Buffer large enough to hold external relocs of any input section. */
427 bfd_byte *external_relocs;
430 static void xcoff_swap_ldhdr_in
431 PARAMS ((bfd *, const struct external_ldhdr *, struct internal_ldhdr *));
432 static void xcoff_swap_ldhdr_out
433 PARAMS ((bfd *, const struct internal_ldhdr *, struct external_ldhdr *));
434 static void xcoff_swap_ldsym_in
435 PARAMS ((bfd *, const struct external_ldsym *, struct internal_ldsym *));
436 static void xcoff_swap_ldsym_out
437 PARAMS ((bfd *, const struct internal_ldsym *, struct external_ldsym *));
438 static void xcoff_swap_ldrel_out
439 PARAMS ((bfd *, const struct internal_ldrel *, struct external_ldrel *));
440 static struct bfd_hash_entry *xcoff_link_hash_newfunc
441 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
442 static struct internal_reloc *xcoff_read_internal_relocs
443 PARAMS ((bfd *, asection *, boolean, bfd_byte *, boolean,
444 struct internal_reloc *));
445 static boolean xcoff_link_add_object_symbols
446 PARAMS ((bfd *, struct bfd_link_info *));
447 static boolean xcoff_link_check_archive_element
448 PARAMS ((bfd *, struct bfd_link_info *, boolean *));
449 static boolean xcoff_link_check_ar_symbols
450 PARAMS ((bfd *, struct bfd_link_info *, boolean *));
451 static bfd_size_type xcoff_find_reloc
452 PARAMS ((struct internal_reloc *, bfd_size_type, bfd_vma));
453 static boolean xcoff_link_add_symbols PARAMS ((bfd *, struct bfd_link_info *));
454 static boolean xcoff_link_add_dynamic_symbols
455 PARAMS ((bfd *, struct bfd_link_info *));
456 static boolean xcoff_mark PARAMS ((struct bfd_link_info *, asection *));
457 static void xcoff_sweep PARAMS ((struct bfd_link_info *));
458 static boolean xcoff_build_ldsyms
459 PARAMS ((struct xcoff_link_hash_entry *, PTR));
460 static boolean xcoff_link_input_bfd
461 PARAMS ((struct xcoff_final_link_info *, bfd *));
462 static boolean xcoff_write_global_symbol
463 PARAMS ((struct xcoff_link_hash_entry *, PTR));
464 static boolean xcoff_reloc_link_order
465 PARAMS ((bfd *, struct xcoff_final_link_info *, asection *,
466 struct bfd_link_order *));
467 static int xcoff_sort_relocs PARAMS ((const PTR, const PTR));
469 /* Routines to swap information in the XCOFF .loader section. If we
470 ever need to write an XCOFF loader, this stuff will need to be
471 moved to another file shared by the linker (which XCOFF calls the
472 ``binder'') and the loader. */
474 /* Swap in the ldhdr structure. */
477 xcoff_swap_ldhdr_in (abfd, src, dst)
479 const struct external_ldhdr *src;
480 struct internal_ldhdr *dst;
482 dst->l_version = bfd_get_32 (abfd, src->l_version);
483 dst->l_nsyms = bfd_get_32 (abfd, src->l_nsyms);
484 dst->l_nreloc = bfd_get_32 (abfd, src->l_nreloc);
485 dst->l_istlen = bfd_get_32 (abfd, src->l_istlen);
486 dst->l_nimpid = bfd_get_32 (abfd, src->l_nimpid);
487 dst->l_impoff = bfd_get_32 (abfd, src->l_impoff);
488 dst->l_stlen = bfd_get_32 (abfd, src->l_stlen);
489 dst->l_stoff = bfd_get_32 (abfd, src->l_stoff);
492 /* Swap out the ldhdr structure. */
495 xcoff_swap_ldhdr_out (abfd, src, dst)
497 const struct internal_ldhdr *src;
498 struct external_ldhdr *dst;
500 bfd_put_32 (abfd, src->l_version, dst->l_version);
501 bfd_put_32 (abfd, src->l_nsyms, dst->l_nsyms);
502 bfd_put_32 (abfd, src->l_nreloc, dst->l_nreloc);
503 bfd_put_32 (abfd, src->l_istlen, dst->l_istlen);
504 bfd_put_32 (abfd, src->l_nimpid, dst->l_nimpid);
505 bfd_put_32 (abfd, src->l_impoff, dst->l_impoff);
506 bfd_put_32 (abfd, src->l_stlen, dst->l_stlen);
507 bfd_put_32 (abfd, src->l_stoff, dst->l_stoff);
510 /* Swap in the ldsym structure. */
513 xcoff_swap_ldsym_in (abfd, src, dst)
515 const struct external_ldsym *src;
516 struct internal_ldsym *dst;
518 if (bfd_get_32 (abfd, src->_l._l_l._l_zeroes) != 0)
519 memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
522 dst->_l._l_l._l_zeroes = 0;
523 dst->_l._l_l._l_offset = bfd_get_32 (abfd, src->_l._l_l._l_offset);
525 dst->l_value = bfd_get_32 (abfd, src->l_value);
526 dst->l_scnum = bfd_get_16 (abfd, src->l_scnum);
527 dst->l_smtype = bfd_get_8 (abfd, src->l_smtype);
528 dst->l_smclas = bfd_get_8 (abfd, src->l_smclas);
529 dst->l_ifile = bfd_get_32 (abfd, src->l_ifile);
530 dst->l_parm = bfd_get_32 (abfd, src->l_parm);
533 /* Swap out the ldsym structure. */
536 xcoff_swap_ldsym_out (abfd, src, dst)
538 const struct internal_ldsym *src;
539 struct external_ldsym *dst;
541 if (src->_l._l_l._l_zeroes != 0)
542 memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
545 bfd_put_32 (abfd, 0, dst->_l._l_l._l_zeroes);
546 bfd_put_32 (abfd, src->_l._l_l._l_offset, dst->_l._l_l._l_offset);
548 bfd_put_32 (abfd, src->l_value, dst->l_value);
549 bfd_put_16 (abfd, src->l_scnum, dst->l_scnum);
550 bfd_put_8 (abfd, src->l_smtype, dst->l_smtype);
551 bfd_put_8 (abfd, src->l_smclas, dst->l_smclas);
552 bfd_put_32 (abfd, src->l_ifile, dst->l_ifile);
553 bfd_put_32 (abfd, src->l_parm, dst->l_parm);
556 /* As it happens, we never need to swap in the ldrel structure. */
558 /* Swap out the ldrel structure. */
561 xcoff_swap_ldrel_out (abfd, src, dst)
563 const struct internal_ldrel *src;
564 struct external_ldrel *dst;
566 bfd_put_32 (abfd, src->l_vaddr, dst->l_vaddr);
567 bfd_put_32 (abfd, src->l_symndx, dst->l_symndx);
568 bfd_put_16 (abfd, src->l_rtype, dst->l_rtype);
569 bfd_put_16 (abfd, src->l_rsecnm, dst->l_rsecnm);
572 /* Routine to create an entry in an XCOFF link hash table. */
574 static struct bfd_hash_entry *
575 xcoff_link_hash_newfunc (entry, table, string)
576 struct bfd_hash_entry *entry;
577 struct bfd_hash_table *table;
580 struct xcoff_link_hash_entry *ret = (struct xcoff_link_hash_entry *) entry;
582 /* Allocate the structure if it has not already been allocated by a
584 if (ret == (struct xcoff_link_hash_entry *) NULL)
585 ret = ((struct xcoff_link_hash_entry *)
586 bfd_hash_allocate (table, sizeof (struct xcoff_link_hash_entry)));
587 if (ret == (struct xcoff_link_hash_entry *) NULL)
588 return (struct bfd_hash_entry *) ret;
590 /* Call the allocation method of the superclass. */
591 ret = ((struct xcoff_link_hash_entry *)
592 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
596 /* Set local fields. */
598 ret->toc_section = NULL;
599 ret->u.toc_indx = -1;
600 ret->descriptor = NULL;
604 ret->smclas = XMC_UA;
607 return (struct bfd_hash_entry *) ret;
610 /* Create a XCOFF link hash table. */
612 struct bfd_link_hash_table *
613 _bfd_xcoff_bfd_link_hash_table_create (abfd)
616 struct xcoff_link_hash_table *ret;
618 ret = ((struct xcoff_link_hash_table *)
619 bfd_alloc (abfd, sizeof (struct xcoff_link_hash_table)));
620 if (ret == (struct xcoff_link_hash_table *) NULL)
621 return (struct bfd_link_hash_table *) NULL;
622 if (! _bfd_link_hash_table_init (&ret->root, abfd, xcoff_link_hash_newfunc))
624 bfd_release (abfd, ret);
625 return (struct bfd_link_hash_table *) NULL;
628 ret->debug_strtab = _bfd_xcoff_stringtab_init ();
629 ret->debug_section = NULL;
630 ret->loader_section = NULL;
631 ret->ldrel_count = 0;
632 memset (&ret->ldhdr, 0, sizeof (struct internal_ldhdr));
633 ret->linkage_section = NULL;
634 ret->toc_section = NULL;
635 ret->descriptor_section = NULL;
640 memset (ret->special_sections, 0, sizeof ret->special_sections);
642 /* The linker will always generate a full a.out header. We need to
643 record that fact now, before the sizeof_headers routine could be
645 xcoff_data (abfd)->full_aouthdr = true;
650 /* Look up an entry in an XCOFF link hash table. */
652 #define xcoff_link_hash_lookup(table, string, create, copy, follow) \
653 ((struct xcoff_link_hash_entry *) \
654 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy),\
657 /* Traverse an XCOFF link hash table. */
659 #define xcoff_link_hash_traverse(table, func, info) \
660 (bfd_link_hash_traverse \
662 (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
665 /* Get the XCOFF link hash table from the info structure. This is
668 #define xcoff_hash_table(p) ((struct xcoff_link_hash_table *) ((p)->hash))
670 /* Read internal relocs for an XCOFF csect. This is a wrapper around
671 _bfd_coff_read_internal_relocs which tries to take advantage of any
672 relocs which may have been cached for the enclosing section. */
674 static struct internal_reloc *
675 xcoff_read_internal_relocs (abfd, sec, cache, external_relocs,
676 require_internal, internal_relocs)
680 bfd_byte *external_relocs;
681 boolean require_internal;
682 struct internal_reloc *internal_relocs;
684 if (coff_section_data (abfd, sec) != NULL
685 && coff_section_data (abfd, sec)->relocs == NULL
686 && xcoff_section_data (abfd, sec) != NULL)
690 enclosing = xcoff_section_data (abfd, sec)->enclosing;
692 if (enclosing != NULL
693 && (coff_section_data (abfd, enclosing) == NULL
694 || coff_section_data (abfd, enclosing)->relocs == NULL)
696 && enclosing->reloc_count > 0)
698 if (_bfd_coff_read_internal_relocs (abfd, enclosing, true,
699 external_relocs, false,
700 (struct internal_reloc *) NULL)
705 if (enclosing != NULL
706 && coff_section_data (abfd, enclosing) != NULL
707 && coff_section_data (abfd, enclosing)->relocs != NULL)
711 off = ((sec->rel_filepos - enclosing->rel_filepos)
712 / bfd_coff_relsz (abfd));
713 if (! require_internal)
714 return coff_section_data (abfd, enclosing)->relocs + off;
715 memcpy (internal_relocs,
716 coff_section_data (abfd, enclosing)->relocs + off,
717 sec->reloc_count * sizeof (struct internal_reloc));
718 return internal_relocs;
722 return _bfd_coff_read_internal_relocs (abfd, sec, cache, external_relocs,
723 require_internal, internal_relocs);
726 /* Given an XCOFF BFD, add symbols to the global hash table as
730 _bfd_xcoff_bfd_link_add_symbols (abfd, info)
732 struct bfd_link_info *info;
734 switch (bfd_get_format (abfd))
737 return xcoff_link_add_object_symbols (abfd, info);
739 return (_bfd_generic_link_add_archive_symbols
740 (abfd, info, xcoff_link_check_archive_element));
742 bfd_set_error (bfd_error_wrong_format);
747 /* Add symbols from an XCOFF object file. */
750 xcoff_link_add_object_symbols (abfd, info)
752 struct bfd_link_info *info;
754 if (! _bfd_coff_get_external_symbols (abfd))
756 if (! xcoff_link_add_symbols (abfd, info))
758 if (! info->keep_memory)
760 if (! _bfd_coff_free_symbols (abfd))
766 /* Check a single archive element to see if we need to include it in
767 the link. *PNEEDED is set according to whether this element is
768 needed in the link or not. This is called via
769 _bfd_generic_link_add_archive_symbols. */
772 xcoff_link_check_archive_element (abfd, info, pneeded)
774 struct bfd_link_info *info;
777 if (! _bfd_coff_get_external_symbols (abfd))
780 if (! xcoff_link_check_ar_symbols (abfd, info, pneeded))
785 if (! xcoff_link_add_symbols (abfd, info))
789 if (! info->keep_memory || ! *pneeded)
791 if (! _bfd_coff_free_symbols (abfd))
798 /* Look through the symbols to see if this object file should be
799 included in the link. */
802 xcoff_link_check_ar_symbols (abfd, info, pneeded)
804 struct bfd_link_info *info;
807 bfd_size_type symesz;
813 symesz = bfd_coff_symesz (abfd);
814 esym = (bfd_byte *) obj_coff_external_syms (abfd);
815 esym_end = esym + obj_raw_syment_count (abfd) * symesz;
816 while (esym < esym_end)
818 struct internal_syment sym;
820 bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym);
822 if (sym.n_sclass == C_EXT && sym.n_scnum != N_UNDEF)
825 char buf[SYMNMLEN + 1];
826 struct bfd_link_hash_entry *h;
828 /* This symbol is externally visible, and is defined by this
831 name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
834 h = bfd_link_hash_lookup (info->hash, name, false, false, true);
836 /* We are only interested in symbols that are currently
837 undefined. If a symbol is currently known to be common,
838 XCOFF linkers do not bring in an object file which
839 defines it. We also don't bring in symbols to satisfy
840 undefined references in shared objects. */
841 if (h != (struct bfd_link_hash_entry *) NULL
842 && h->type == bfd_link_hash_undefined)
844 if (! (*info->callbacks->add_archive_element) (info, abfd, name))
851 esym += (sym.n_numaux + 1) * symesz;
854 /* We do not need this object file. */
858 /* Returns the index of reloc in RELOCS with the least address greater
859 than or equal to ADDRESS. The relocs are sorted by address. */
862 xcoff_find_reloc (relocs, count, address)
863 struct internal_reloc *relocs;
867 bfd_size_type min, max, this;
871 if (count == 1 && relocs[0].r_vaddr < address)
880 /* Do a binary search over (min,max]. */
881 while (min + 1 < max)
885 this = (max + min) / 2;
886 raddr = relocs[this].r_vaddr;
889 else if (raddr < address)
898 if (relocs[min].r_vaddr < address)
902 && relocs[min - 1].r_vaddr == address)
908 /* Add all the symbols from an object file to the hash table.
910 XCOFF is a weird format. A normal XCOFF .o files will have three
911 COFF sections--.text, .data, and .bss--but each COFF section will
912 contain many csects. These csects are described in the symbol
913 table. From the linker's point of view, each csect must be
914 considered a section in its own right. For example, a TOC entry is
915 handled as a small XMC_TC csect. The linker must be able to merge
916 different TOC entries together, which means that it must be able to
917 extract the XMC_TC csects from the .data section of the input .o
920 From the point of view of our linker, this is, of course, a hideous
921 nightmare. We cope by actually creating sections for each csect,
922 and discarding the original sections. We then have to handle the
923 relocation entries carefully, since the only way to tell which
924 csect they belong to is to examine the address. */
927 xcoff_link_add_symbols (abfd, info)
929 struct bfd_link_info *info;
931 unsigned int n_tmask;
932 unsigned int n_btshft;
933 boolean default_copy;
934 bfd_size_type symcount;
935 struct xcoff_link_hash_entry **sym_hash;
936 asection **csect_cache;
937 bfd_size_type linesz;
942 unsigned int csect_index;
943 asection *first_csect;
944 bfd_size_type symesz;
947 struct reloc_info_struct
949 struct internal_reloc *relocs;
952 } *reloc_info = NULL;
954 if ((abfd->flags & DYNAMIC) != 0
955 && ! info->static_link)
956 return xcoff_link_add_dynamic_symbols (abfd, info);
958 n_tmask = coff_data (abfd)->local_n_tmask;
959 n_btshft = coff_data (abfd)->local_n_btshft;
961 /* Define macros so that ISFCN, et. al., macros work correctly. */
962 #define N_TMASK n_tmask
963 #define N_BTSHFT n_btshft
965 /* We need to build a .loader section, so we do it here. This won't
966 work if we're producing an XCOFF output file with no non dynamic
967 XCOFF input files. FIXME. */
968 if (xcoff_hash_table (info)->loader_section == NULL)
972 lsec = bfd_make_section_anyway (abfd, ".loader");
975 xcoff_hash_table (info)->loader_section = lsec;
976 lsec->flags |= SEC_HAS_CONTENTS | SEC_IN_MEMORY;
978 /* Likewise for the linkage section. */
979 if (xcoff_hash_table (info)->linkage_section == NULL)
983 lsec = bfd_make_section_anyway (abfd, ".gl");
986 xcoff_hash_table (info)->linkage_section = lsec;
987 lsec->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
988 lsec->alignment_power = 2;
990 /* Likewise for the TOC section. */
991 if (xcoff_hash_table (info)->toc_section == NULL)
995 tsec = bfd_make_section_anyway (abfd, ".tc");
998 xcoff_hash_table (info)->toc_section = tsec;
999 tsec->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1000 tsec->alignment_power = 2;
1002 /* Likewise for the descriptor section. */
1003 if (xcoff_hash_table (info)->descriptor_section == NULL)
1007 dsec = bfd_make_section_anyway (abfd, ".ds");
1010 xcoff_hash_table (info)->descriptor_section = dsec;
1011 dsec->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1012 dsec->alignment_power = 2;
1014 /* Likewise for the .debug section. */
1015 if (xcoff_hash_table (info)->debug_section == NULL)
1019 dsec = bfd_make_section_anyway (abfd, ".debug");
1022 xcoff_hash_table (info)->debug_section = dsec;
1023 dsec->flags |= SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1026 if (info->keep_memory)
1027 default_copy = false;
1029 default_copy = true;
1031 symcount = obj_raw_syment_count (abfd);
1033 /* We keep a list of the linker hash table entries that correspond
1034 to each external symbol. */
1035 sym_hash = ((struct xcoff_link_hash_entry **)
1038 * sizeof (struct xcoff_link_hash_entry *))));
1039 if (sym_hash == NULL && symcount != 0)
1041 coff_data (abfd)->sym_hashes = (struct coff_link_hash_entry **) sym_hash;
1042 memset (sym_hash, 0,
1043 (size_t) symcount * sizeof (struct xcoff_link_hash_entry *));
1045 /* Because of the weird stuff we are doing with XCOFF csects, we can
1046 not easily determine which section a symbol is in, so we store
1047 the information in the tdata for the input file. */
1048 csect_cache = ((asection **)
1049 bfd_alloc (abfd, symcount * sizeof (asection *)));
1050 if (csect_cache == NULL && symcount != 0)
1052 xcoff_data (abfd)->csects = csect_cache;
1053 memset (csect_cache, 0, (size_t) symcount * sizeof (asection *));
1055 /* While splitting sections into csects, we need to assign the
1056 relocs correctly. The relocs and the csects must both be in
1057 order by VMA within a given section, so we handle this by
1058 scanning along the relocs as we process the csects. We index
1059 into reloc_info using the section target_index. */
1060 reloc_info = ((struct reloc_info_struct *)
1061 malloc ((abfd->section_count + 1)
1062 * sizeof (struct reloc_info_struct)));
1063 if (reloc_info == NULL)
1065 bfd_set_error (bfd_error_no_memory);
1068 memset ((PTR) reloc_info, 0,
1069 (abfd->section_count + 1) * sizeof (struct reloc_info_struct));
1071 /* Read in the relocs and line numbers for each section. */
1072 linesz = bfd_coff_linesz (abfd);
1074 for (o = abfd->sections; o != NULL; o = o->next)
1077 if ((o->flags & SEC_RELOC) != 0)
1079 reloc_info[o->target_index].relocs =
1080 xcoff_read_internal_relocs (abfd, o, true, (bfd_byte *) NULL,
1081 false, (struct internal_reloc *) NULL);
1082 reloc_info[o->target_index].csects =
1083 (asection **) malloc (o->reloc_count * sizeof (asection *));
1084 if (reloc_info[o->target_index].csects == NULL)
1086 bfd_set_error (bfd_error_no_memory);
1089 memset (reloc_info[o->target_index].csects, 0,
1090 o->reloc_count * sizeof (asection *));
1093 if ((info->strip == strip_none || info->strip == strip_some)
1094 && o->lineno_count > 0)
1098 linenos = (bfd_byte *) malloc (o->lineno_count * linesz);
1099 if (linenos == NULL)
1101 bfd_set_error (bfd_error_no_memory);
1104 reloc_info[o->target_index].linenos = linenos;
1105 if (bfd_seek (abfd, o->line_filepos, SEEK_SET) != 0
1106 || (bfd_read (linenos, linesz, o->lineno_count, abfd)
1107 != linesz * o->lineno_count))
1112 /* Don't let the linker relocation routines discard the symbols. */
1113 keep_syms = obj_coff_keep_syms (abfd);
1114 obj_coff_keep_syms (abfd) = true;
1120 symesz = bfd_coff_symesz (abfd);
1121 BFD_ASSERT (symesz == bfd_coff_auxesz (abfd));
1122 esym = (bfd_byte *) obj_coff_external_syms (abfd);
1123 esym_end = esym + symcount * symesz;
1124 while (esym < esym_end)
1126 struct internal_syment sym;
1127 union internal_auxent aux;
1129 char buf[SYMNMLEN + 1];
1134 struct xcoff_link_hash_entry *set_toc;
1136 bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym);
1138 /* In this pass we are only interested in symbols with csect
1140 if (sym.n_sclass != C_EXT && sym.n_sclass != C_HIDEXT)
1142 if (sym.n_sclass == C_FILE && csect != NULL)
1144 xcoff_section_data (abfd, csect)->last_symndx =
1146 - (bfd_byte *) obj_coff_external_syms (abfd))
1152 *csect_cache = csect;
1153 else if (first_csect == NULL || sym.n_sclass == C_FILE)
1154 *csect_cache = coff_section_from_bfd_index (abfd, sym.n_scnum);
1156 *csect_cache = NULL;
1157 esym += (sym.n_numaux + 1) * symesz;
1158 sym_hash += sym.n_numaux + 1;
1159 csect_cache += sym.n_numaux + 1;
1163 name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
1167 /* If this symbol has line number information attached to it,
1168 and we're not stripping it, count the number of entries and
1169 add them to the count for this csect. In the final link pass
1170 we are going to attach line number information by symbol,
1171 rather than by section, in order to more easily handle
1172 garbage collection. */
1173 if ((info->strip == strip_none || info->strip == strip_some)
1176 && ISFCN (sym.n_type))
1178 union internal_auxent auxlin;
1180 bfd_coff_swap_aux_in (abfd, (PTR) (esym + symesz),
1181 sym.n_type, sym.n_sclass,
1182 0, sym.n_numaux, (PTR) &auxlin);
1183 if (auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0)
1185 asection *enclosing;
1186 bfd_size_type linoff;
1188 enclosing = xcoff_section_data (abfd, csect)->enclosing;
1189 if (enclosing == NULL)
1191 (*_bfd_error_handler)
1192 ("%s: `%s' has line numbers but no enclosing section",
1193 bfd_get_filename (abfd), name);
1194 bfd_set_error (bfd_error_bad_value);
1197 linoff = (auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr
1198 - enclosing->line_filepos);
1199 if (linoff < enclosing->lineno_count * linesz)
1201 struct internal_lineno lin;
1202 bfd_byte *linpstart;
1204 linpstart = (reloc_info[enclosing->target_index].linenos
1206 bfd_coff_swap_lineno_in (abfd, (PTR) linpstart, (PTR) &lin);
1208 && ((bfd_size_type) lin.l_addr.l_symndx
1210 - (bfd_byte *) obj_coff_external_syms (abfd))
1213 bfd_byte *linpend, *linp;
1215 linpend = (reloc_info[enclosing->target_index].linenos
1216 + enclosing->lineno_count * linesz);
1217 for (linp = linpstart + linesz;
1221 bfd_coff_swap_lineno_in (abfd, (PTR) linp,
1223 if (lin.l_lnno == 0)
1226 csect->lineno_count += (linp - linpstart) / linesz;
1227 /* The setting of line_filepos will only be
1228 useful if all the line number entries for a
1229 csect are contiguous; this only matters for
1231 if (csect->line_filepos == 0)
1232 csect->line_filepos =
1233 auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr;
1239 /* Pick up the csect auxiliary information. */
1241 if (sym.n_numaux == 0)
1243 (*_bfd_error_handler)
1244 ("%s: class %d symbol `%s' has no aux entries",
1245 bfd_get_filename (abfd), sym.n_sclass, name);
1246 bfd_set_error (bfd_error_bad_value);
1250 bfd_coff_swap_aux_in (abfd,
1251 (PTR) (esym + symesz * sym.n_numaux),
1252 sym.n_type, sym.n_sclass,
1253 sym.n_numaux - 1, sym.n_numaux,
1256 smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp);
1266 (*_bfd_error_handler)
1267 ("%s: symbol `%s' has unrecognized csect type %d",
1268 bfd_get_filename (abfd), name, smtyp);
1269 bfd_set_error (bfd_error_bad_value);
1273 /* This is an external reference. */
1274 if (sym.n_sclass == C_HIDEXT
1275 || sym.n_scnum != N_UNDEF
1276 || aux.x_csect.x_scnlen.l != 0)
1278 (*_bfd_error_handler)
1279 ("%s: bad XTY_ER symbol `%s': class %d scnum %d scnlen %d",
1280 bfd_get_filename (abfd), name, sym.n_sclass, sym.n_scnum,
1281 aux.x_csect.x_scnlen.l);
1282 bfd_set_error (bfd_error_bad_value);
1286 /* An XMC_XO external reference is actually a reference to
1287 an absolute location. */
1288 if (aux.x_csect.x_smclas != XMC_XO)
1289 section = bfd_und_section_ptr;
1292 section = bfd_abs_section_ptr;
1293 value = sym.n_value;
1298 /* This is a csect definition. */
1302 xcoff_section_data (abfd, csect)->last_symndx =
1304 - (bfd_byte *) obj_coff_external_syms (abfd))
1311 /* When we see a TOC anchor, we record the TOC value. */
1312 if (aux.x_csect.x_smclas == XMC_TC0)
1314 if (sym.n_sclass != C_HIDEXT
1315 || aux.x_csect.x_scnlen.l != 0)
1317 (*_bfd_error_handler)
1318 ("%s: XMC_TC0 symbol `%s' is class %d scnlen %d",
1319 bfd_get_filename (abfd), name, sym.n_sclass,
1320 aux.x_csect.x_scnlen.l);
1321 bfd_set_error (bfd_error_bad_value);
1324 xcoff_data (abfd)->toc = sym.n_value;
1327 /* We must merge TOC entries for the same symbol. We can
1328 merge two TOC entries if they are both C_HIDEXT, they
1329 both have the same name, they are both 4 bytes long, and
1330 they both have a relocation table entry for an external
1331 symbol with the same name. Unfortunately, this means
1332 that we must look through the relocations. Ick. */
1333 if (aux.x_csect.x_smclas == XMC_TC
1334 && sym.n_sclass == C_HIDEXT
1335 && aux.x_csect.x_scnlen.l == 4
1336 && info->hash->creator == abfd->xvec)
1338 asection *enclosing;
1339 struct internal_reloc *relocs;
1340 bfd_size_type relindx;
1341 struct internal_reloc *rel;
1343 enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum);
1344 if (enclosing == NULL)
1347 relocs = reloc_info[enclosing->target_index].relocs;
1348 relindx = xcoff_find_reloc (relocs, enclosing->reloc_count,
1350 rel = relocs + relindx;
1351 if (relindx < enclosing->reloc_count
1352 && rel->r_vaddr == (bfd_vma) sym.n_value
1353 && rel->r_size == 31
1354 && rel->r_type == R_POS)
1357 struct internal_syment relsym;
1359 erelsym = ((bfd_byte *) obj_coff_external_syms (abfd)
1360 + rel->r_symndx * symesz);
1361 bfd_coff_swap_sym_in (abfd, (PTR) erelsym, (PTR) &relsym);
1362 if (relsym.n_sclass == C_EXT)
1364 const char *relname;
1365 char relbuf[SYMNMLEN + 1];
1367 struct xcoff_link_hash_entry *h;
1369 /* At this point we know that the TOC entry is
1370 for an externally visible symbol. */
1371 relname = _bfd_coff_internal_syment_name (abfd, &relsym,
1373 if (relname == NULL)
1376 /* We only merge TOC entries if the TC name is
1377 the same as the symbol name. This handles
1378 the normal case, but not common cases like
1379 SYM.P4 which gcc generates to store SYM + 4
1380 in the TOC. FIXME. */
1381 if (strcmp (name, relname) == 0)
1383 copy = (! info->keep_memory
1384 || relsym._n._n_n._n_zeroes != 0
1385 || relsym._n._n_n._n_offset == 0);
1386 h = xcoff_link_hash_lookup (xcoff_hash_table (info),
1387 relname, true, copy,
1392 /* At this point h->root.type could be
1393 bfd_link_hash_new. That should be OK,
1394 since we know for sure that we will come
1395 across this symbol as we step through the
1398 /* We store h in *sym_hash for the
1399 convenience of the relocate_section
1403 if (h->toc_section != NULL)
1405 asection **rel_csects;
1407 /* We already have a TOC entry for this
1408 symbol, so we can just ignore this
1411 reloc_info[enclosing->target_index].csects;
1412 rel_csects[relindx] = bfd_und_section_ptr;
1416 /* We are about to create a TOC entry for
1424 /* We need to create a new section. We get the name from
1425 the csect storage mapping class, so that the linker can
1426 accumulate similar csects together. */
1428 static const char *csect_name_by_class[] =
1430 ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
1431 ".sv", ".bs", ".ds", ".uc", ".ti", ".tb", NULL, ".tc0",
1434 const char *csect_name;
1435 asection *enclosing;
1437 if ((aux.x_csect.x_smclas >=
1438 sizeof csect_name_by_class / sizeof csect_name_by_class[0])
1439 || csect_name_by_class[aux.x_csect.x_smclas] == NULL)
1441 (*_bfd_error_handler)
1442 ("%s: symbol `%s' has unrecognized smclas %d",
1443 bfd_get_filename (abfd), name, aux.x_csect.x_smclas);
1444 bfd_set_error (bfd_error_bad_value);
1448 csect_name = csect_name_by_class[aux.x_csect.x_smclas];
1449 csect = bfd_make_section_anyway (abfd, csect_name);
1452 enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum);
1453 if (enclosing == NULL)
1455 if (! bfd_is_abs_section (enclosing)
1456 && ((bfd_vma) sym.n_value < enclosing->vma
1457 || ((bfd_vma) sym.n_value + aux.x_csect.x_scnlen.l
1458 > enclosing->vma + enclosing->_raw_size)))
1460 (*_bfd_error_handler)
1461 ("%s: csect `%s' not in enclosing section",
1462 bfd_get_filename (abfd), name);
1463 bfd_set_error (bfd_error_bad_value);
1466 csect->vma = sym.n_value;
1467 csect->filepos = (enclosing->filepos
1470 csect->_raw_size = aux.x_csect.x_scnlen.l;
1471 csect->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS;
1472 csect->alignment_power = SMTYP_ALIGN (aux.x_csect.x_smtyp);
1474 /* Record the enclosing section in the tdata for this new
1476 csect->used_by_bfd =
1477 ((struct coff_section_tdata *)
1478 bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
1479 if (csect->used_by_bfd == NULL)
1481 coff_section_data (abfd, csect)->tdata =
1482 bfd_zalloc (abfd, sizeof (struct xcoff_section_tdata));
1483 if (coff_section_data (abfd, csect)->tdata == NULL)
1485 xcoff_section_data (abfd, csect)->enclosing = enclosing;
1486 xcoff_section_data (abfd, csect)->lineno_count =
1487 enclosing->lineno_count;
1489 if (enclosing->owner == abfd)
1491 struct internal_reloc *relocs;
1492 bfd_size_type relindx;
1493 struct internal_reloc *rel;
1494 asection **rel_csect;
1496 relocs = reloc_info[enclosing->target_index].relocs;
1497 relindx = xcoff_find_reloc (relocs, enclosing->reloc_count,
1499 rel = relocs + relindx;
1500 rel_csect = (reloc_info[enclosing->target_index].csects
1502 csect->rel_filepos = (enclosing->rel_filepos
1503 + relindx * bfd_coff_relsz (abfd));
1504 while (relindx < enclosing->reloc_count
1505 && *rel_csect == NULL
1506 && rel->r_vaddr < csect->vma + csect->_raw_size)
1509 csect->flags |= SEC_RELOC;
1510 ++csect->reloc_count;
1517 /* There are a number of other fields and section flags
1518 which we do not bother to set. */
1520 csect_index = ((esym
1521 - (bfd_byte *) obj_coff_external_syms (abfd))
1524 xcoff_section_data (abfd, csect)->first_symndx = csect_index;
1526 if (first_csect == NULL)
1527 first_csect = csect;
1529 /* If this symbol is C_EXT, we treat it as starting at the
1530 beginning of the newly created section. */
1531 if (sym.n_sclass == C_EXT)
1537 /* If this is a TOC section for a symbol, record it. */
1538 if (set_toc != NULL)
1539 set_toc->toc_section = csect;
1544 /* This is a label definition. The x_scnlen field is the
1545 symbol index of the csect. I believe that this must
1546 always follow the appropriate XTY_SD symbol, so I will
1552 if (aux.x_csect.x_scnlen.l < 0
1553 || (aux.x_csect.x_scnlen.l
1554 >= esym - (bfd_byte *) obj_coff_external_syms (abfd)))
1558 section = xcoff_data (abfd)->csects[aux.x_csect.x_scnlen.l];
1560 || (section->flags & SEC_HAS_CONTENTS) == 0)
1565 (*_bfd_error_handler)
1566 ("%s: misplaced XTY_LD `%s'",
1567 bfd_get_filename (abfd), name);
1568 bfd_set_error (bfd_error_bad_value);
1572 value = sym.n_value - csect->vma;
1577 /* This is an unitialized csect. We could base the name on
1578 the storage mapping class, but we don't bother. If this
1579 csect is externally visible, it is a common symbol. */
1583 xcoff_section_data (abfd, csect)->last_symndx =
1585 - (bfd_byte *) obj_coff_external_syms (abfd))
1589 csect = bfd_make_section_anyway (abfd, ".bss");
1592 csect->vma = sym.n_value;
1593 csect->_raw_size = aux.x_csect.x_scnlen.l;
1594 csect->flags |= SEC_ALLOC;
1595 csect->alignment_power = SMTYP_ALIGN (aux.x_csect.x_smtyp);
1596 /* There are a number of other fields and section flags
1597 which we do not bother to set. */
1599 csect_index = ((esym
1600 - (bfd_byte *) obj_coff_external_syms (abfd))
1603 csect->used_by_bfd =
1604 ((struct coff_section_tdata *)
1605 bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
1606 if (csect->used_by_bfd == NULL)
1608 coff_section_data (abfd, csect)->tdata =
1609 bfd_zalloc (abfd, sizeof (struct xcoff_section_tdata));
1610 if (coff_section_data (abfd, csect)->tdata == NULL)
1612 xcoff_section_data (abfd, csect)->first_symndx = csect_index;
1614 if (first_csect == NULL)
1615 first_csect = csect;
1617 if (sym.n_sclass == C_EXT)
1619 csect->flags |= SEC_IS_COMMON;
1620 csect->_raw_size = 0;
1622 value = aux.x_csect.x_scnlen.l;
1628 /* Check for magic symbol names. */
1629 if ((smtyp == XTY_SD || smtyp == XTY_CM)
1630 && aux.x_csect.x_smclas != XMC_TC)
1637 if (strcmp (name, "_text") == 0)
1639 else if (strcmp (name, "_etext") == 0)
1641 else if (strcmp (name, "_data") == 0)
1643 else if (strcmp (name, "_edata") == 0)
1645 else if (strcmp (name, "_end") == 0)
1648 else if (name[0] == 'e' && strcmp (name, "end") == 0)
1652 xcoff_hash_table (info)->special_sections[i] = csect;
1655 /* Now we have enough information to add the symbol to the
1656 linker hash table. */
1658 if (sym.n_sclass == C_EXT)
1662 BFD_ASSERT (section != NULL);
1664 /* We must copy the name into memory if we got it from the
1665 syment itself, rather than the string table. */
1666 copy = default_copy;
1667 if (sym._n._n_n._n_zeroes != 0
1668 || sym._n._n_n._n_offset == 0)
1671 if (info->hash->creator == abfd->xvec)
1673 /* If we are statically linking a shared object, it is
1674 OK for symbol redefinitions to occur. I can't figure
1675 out just what the XCOFF linker is doing, but
1676 something like this is required for -bnso to work. */
1677 *sym_hash = xcoff_link_hash_lookup (xcoff_hash_table (info),
1678 name, true, copy, false);
1679 if (*sym_hash == NULL)
1681 if (((*sym_hash)->root.type == bfd_link_hash_defined
1682 || (*sym_hash)->root.type == bfd_link_hash_defweak)
1683 && ! bfd_is_und_section (section)
1684 && ! bfd_is_com_section (section))
1686 if ((abfd->flags & DYNAMIC) != 0)
1688 section = bfd_und_section_ptr;
1691 else if (((*sym_hash)->root.u.def.section->owner->flags
1694 (*sym_hash)->root.type = bfd_link_hash_undefined;
1695 (*sym_hash)->root.u.undef.abfd =
1696 (*sym_hash)->root.u.def.section->owner;
1701 /* _bfd_generic_link_add_one_symbol may call the linker to
1702 generate an error message, and the linker may try to read
1703 the symbol table to give a good error. Right now, the
1704 line numbers are in an inconsistent state, since they are
1705 counted both in the real sections and in the new csects.
1706 We need to leave the count in the real sections so that
1707 the linker can report the line number of the error
1708 correctly, so temporarily clobber the link to the csects
1709 so that the linker will not try to read the line numbers
1710 a second time from the csects. */
1711 BFD_ASSERT (last_real->next == first_csect);
1712 last_real->next = NULL;
1713 if (! (_bfd_generic_link_add_one_symbol
1714 (info, abfd, name, flags, section, value,
1715 (const char *) NULL, copy, true,
1716 (struct bfd_link_hash_entry **) sym_hash)))
1718 last_real->next = first_csect;
1720 if (smtyp == XTY_CM)
1722 if ((*sym_hash)->root.type != bfd_link_hash_common
1723 || (*sym_hash)->root.u.c.p->section != csect)
1725 /* We don't need the common csect we just created. */
1726 csect->_raw_size = 0;
1730 (*sym_hash)->root.u.c.p->alignment_power
1731 = csect->alignment_power;
1735 if (info->hash->creator == abfd->xvec)
1739 if (smtyp == XTY_ER || smtyp == XTY_CM)
1740 flag = XCOFF_REF_REGULAR;
1742 flag = XCOFF_DEF_REGULAR;
1743 (*sym_hash)->flags |= flag;
1745 if ((*sym_hash)->smclas == XMC_UA
1746 || flag == XCOFF_DEF_REGULAR)
1747 (*sym_hash)->smclas = aux.x_csect.x_smclas;
1751 *csect_cache = csect;
1753 esym += (sym.n_numaux + 1) * symesz;
1754 sym_hash += sym.n_numaux + 1;
1755 csect_cache += sym.n_numaux + 1;
1758 BFD_ASSERT (last_real == NULL || last_real->next == first_csect);
1760 /* Make sure that we have seen all the relocs. */
1761 for (o = abfd->sections; o != first_csect; o = o->next)
1763 /* Reset the section size and the line numebr count, since the
1764 data is now attached to the csects. Don't reset the size of
1765 the .debug section, since we need to read it below in
1766 bfd_xcoff_size_dynamic_sections. */
1767 if (strcmp (bfd_get_section_name (abfd, o), ".debug") != 0)
1769 o->lineno_count = 0;
1771 if ((o->flags & SEC_RELOC) != 0)
1774 struct internal_reloc *rel;
1775 asection **rel_csect;
1777 rel = reloc_info[o->target_index].relocs;
1778 rel_csect = reloc_info[o->target_index].csects;
1779 for (i = 0; i < o->reloc_count; i++, rel++, rel_csect++)
1781 if (*rel_csect == NULL)
1783 (*_bfd_error_handler)
1784 ("%s: reloc %s:%d not in csect",
1785 bfd_get_filename (abfd), o->name, i);
1786 bfd_set_error (bfd_error_bad_value);
1790 /* We identify all symbols which are called, so that we
1791 can create glue code for calls to functions imported
1792 from dynamic objects. */
1793 if (info->hash->creator == abfd->xvec
1794 && *rel_csect != bfd_und_section_ptr
1795 && (rel->r_type == R_BR
1796 || rel->r_type == R_RBR)
1797 && obj_xcoff_sym_hashes (abfd)[rel->r_symndx] != NULL)
1799 struct xcoff_link_hash_entry *h;
1801 h = obj_xcoff_sym_hashes (abfd)[rel->r_symndx];
1802 h->flags |= XCOFF_CALLED;
1803 /* If the symbol name starts with a period, it is
1804 the code of a function. If the symbol is
1805 currently undefined, then add an undefined symbol
1806 for the function descriptor. This should do no
1807 harm, because any regular object that defines the
1808 function should also define the function
1809 descriptor. It helps, because it means that we
1810 will identify the function descriptor with a
1811 dynamic object if a dynamic object defines it. */
1812 if (h->root.root.string[0] == '.'
1813 && h->descriptor == NULL)
1815 struct xcoff_link_hash_entry *hds;
1817 hds = xcoff_link_hash_lookup (xcoff_hash_table (info),
1818 h->root.root.string + 1,
1822 if (hds->root.type == bfd_link_hash_new)
1824 if (! (_bfd_generic_link_add_one_symbol
1825 (info, abfd, hds->root.root.string,
1826 (flagword) 0, bfd_und_section_ptr,
1827 (bfd_vma) 0, (const char *) NULL, false,
1829 (struct bfd_link_hash_entry **) &hds)))
1832 hds->flags |= XCOFF_DESCRIPTOR;
1833 BFD_ASSERT ((hds->flags & XCOFF_CALLED) == 0
1834 && (h->flags & XCOFF_DESCRIPTOR) == 0);
1835 hds->descriptor = h;
1836 h->descriptor = hds;
1841 free (reloc_info[o->target_index].csects);
1842 reloc_info[o->target_index].csects = NULL;
1844 /* Reset SEC_RELOC and the reloc_count, since the reloc
1845 information is now attached to the csects. */
1846 o->flags &=~ SEC_RELOC;
1849 /* If we are not keeping memory, free the reloc information. */
1850 if (! info->keep_memory
1851 && coff_section_data (abfd, o) != NULL
1852 && coff_section_data (abfd, o)->relocs != NULL
1853 && ! coff_section_data (abfd, o)->keep_relocs)
1855 free (coff_section_data (abfd, o)->relocs);
1856 coff_section_data (abfd, o)->relocs = NULL;
1860 /* Free up the line numbers. FIXME: We could cache these
1861 somewhere for the final link, to avoid reading them again. */
1862 if (reloc_info[o->target_index].linenos != NULL)
1864 free (reloc_info[o->target_index].linenos);
1865 reloc_info[o->target_index].linenos = NULL;
1871 obj_coff_keep_syms (abfd) = keep_syms;
1876 if (reloc_info != NULL)
1878 for (o = abfd->sections; o != NULL; o = o->next)
1880 if (reloc_info[o->target_index].csects != NULL)
1881 free (reloc_info[o->target_index].csects);
1882 if (reloc_info[o->target_index].linenos != NULL)
1883 free (reloc_info[o->target_index].linenos);
1887 obj_coff_keep_syms (abfd) = keep_syms;
1894 /* This function is used to add symbols from a dynamic object to the
1895 global symbol table. */
1898 xcoff_link_add_dynamic_symbols (abfd, info)
1900 struct bfd_link_info *info;
1903 bfd_byte *buf = NULL;
1904 struct internal_ldhdr ldhdr;
1905 const char *strings;
1906 struct external_ldsym *elsym, *elsymend;
1907 struct xcoff_import_file *n;
1912 struct xcoff_import_file **pp;
1914 /* We can only handle a dynamic object if we are generating an XCOFF
1916 if (info->hash->creator != abfd->xvec)
1918 (*_bfd_error_handler)
1919 ("%s: XCOFF shared object when not producing XCOFF output",
1920 bfd_get_filename (abfd));
1921 bfd_set_error (bfd_error_invalid_operation);
1925 /* The symbols we use from a dynamic object are not the symbols in
1926 the normal symbol table, but, rather, the symbols in the export
1927 table. If there is a global symbol in a dynamic object which is
1928 not in the export table, the loader will not be able to find it,
1929 so we don't want to find it either. Also, on AIX 4.1.3, shr.o in
1930 libc.a has symbols in the export table which are not in the
1933 /* Read in the .loader section. FIXME: We should really use the
1934 o_snloader field in the a.out header, rather than grabbing the
1936 lsec = bfd_get_section_by_name (abfd, ".loader");
1939 (*_bfd_error_handler)
1940 ("%s: dynamic object with no .loader section",
1941 bfd_get_filename (abfd));
1942 bfd_set_error (bfd_error_no_symbols);
1946 buf = (bfd_byte *) malloc (lsec->_raw_size);
1947 if (buf == NULL && lsec->_raw_size > 0)
1949 bfd_set_error (bfd_error_no_memory);
1953 if (! bfd_get_section_contents (abfd, lsec, (PTR) buf, (file_ptr) 0,
1957 /* Remove the sections from this object, so that they do not get
1958 included in the link. */
1959 abfd->sections = NULL;
1961 xcoff_swap_ldhdr_in (abfd, (struct external_ldhdr *) buf, &ldhdr);
1963 strings = (char *) buf + ldhdr.l_stoff;
1965 elsym = (struct external_ldsym *) (buf + LDHDRSZ);
1966 elsymend = elsym + ldhdr.l_nsyms;
1967 BFD_ASSERT (sizeof (struct external_ldsym) == LDSYMSZ);
1968 for (; elsym < elsymend; elsym++)
1970 struct internal_ldsym ldsym;
1971 char nambuf[SYMNMLEN + 1];
1973 struct xcoff_link_hash_entry *h;
1975 xcoff_swap_ldsym_in (abfd, elsym, &ldsym);
1977 /* We are only interested in exported symbols. */
1978 if ((ldsym.l_smtype & L_EXPORT) == 0)
1981 if (ldsym._l._l_l._l_zeroes == 0)
1982 name = strings + ldsym._l._l_l._l_offset;
1985 memcpy (nambuf, ldsym._l._l_name, SYMNMLEN);
1986 nambuf[SYMNMLEN] = '\0';
1990 /* Normally we could not xcoff_link_hash_lookup in an add
1991 symbols routine, since we might not be using an XCOFF hash
1992 table. However, we verified above that we are using an XCOFF
1995 h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, true,
2000 h->flags |= XCOFF_DEF_DYNAMIC;
2002 /* If the symbol is undefined, and the BFD it was found in is
2003 not a dynamic object, change the BFD to this dynamic object,
2004 so that we can get the correct import file ID. */
2005 if ((h->root.type == bfd_link_hash_undefined
2006 || h->root.type == bfd_link_hash_undefweak)
2007 && (h->root.u.undef.abfd == NULL
2008 || (h->root.u.undef.abfd->flags & DYNAMIC) == 0))
2009 h->root.u.undef.abfd = abfd;
2011 if (h->root.type == bfd_link_hash_new)
2013 h->root.type = bfd_link_hash_undefined;
2014 h->root.u.undef.abfd = abfd;
2015 /* We do not want to add this to the undefined symbol list. */
2018 if (h->smclas == XMC_UA
2019 || h->root.type == bfd_link_hash_undefined
2020 || h->root.type == bfd_link_hash_undefweak)
2021 h->smclas = ldsym.l_smclas;
2023 /* Unless this is an XMC_XO symbol, we don't bother to actually
2024 define it, since we don't have a section to put it in anyhow.
2025 Instead, the relocation routines handle the DEF_DYNAMIC flag
2028 if (h->smclas == XMC_XO
2029 && (h->root.type == bfd_link_hash_undefined
2030 || h->root.type == bfd_link_hash_undefweak))
2032 /* This symbol has an absolute value. */
2033 h->root.type = bfd_link_hash_defined;
2034 h->root.u.def.section = bfd_abs_section_ptr;
2035 h->root.u.def.value = ldsym.l_value;
2045 /* Record this file in the import files. */
2047 n = ((struct xcoff_import_file *)
2048 bfd_alloc (abfd, sizeof (struct xcoff_import_file)));
2053 /* For some reason, the path entry in the import file list for a
2054 shared object appears to always be empty. The file name is the
2057 if (abfd->my_archive == NULL)
2059 bname = bfd_get_filename (abfd);
2064 bname = bfd_get_filename (abfd->my_archive);
2065 mname = bfd_get_filename (abfd);
2067 s = strrchr (bname, '/');
2073 /* We start c at 1 because the first import file number is reserved
2075 for (pp = &xcoff_hash_table (info)->imports, c = 1;
2077 pp = &(*pp)->next, ++c)
2081 xcoff_data (abfd)->import_file_id = c;
2091 /* Routines that are called after all the input files have been
2092 handled, but before the sections are laid out in memory. */
2094 /* Mark a symbol as not being garbage, including the section in which
2097 static INLINE boolean
2098 xcoff_mark_symbol (info, h)
2099 struct bfd_link_info *info;
2100 struct xcoff_link_hash_entry *h;
2102 if ((h->flags & XCOFF_MARK) != 0)
2105 h->flags |= XCOFF_MARK;
2106 if (h->root.type == bfd_link_hash_defined
2107 || h->root.type == bfd_link_hash_defweak)
2111 hsec = h->root.u.def.section;
2112 if ((hsec->flags & SEC_MARK) == 0)
2114 if (! xcoff_mark (info, hsec))
2119 if (h->toc_section != NULL
2120 && (h->toc_section->flags & SEC_MARK) == 0)
2122 if (! xcoff_mark (info, h->toc_section))
2129 /* The mark phase of garbage collection. For a given section, mark
2130 it, and all the sections which define symbols to which it refers.
2131 Because this function needs to look at the relocs, we also count
2132 the number of relocs which need to be copied into the .loader
2136 xcoff_mark (info, sec)
2137 struct bfd_link_info *info;
2140 if ((sec->flags & SEC_MARK) != 0)
2143 sec->flags |= SEC_MARK;
2145 if (sec->owner->xvec == info->hash->creator
2146 && coff_section_data (sec->owner, sec) != NULL
2147 && xcoff_section_data (sec->owner, sec) != NULL)
2149 register struct xcoff_link_hash_entry **hp, **hpend;
2150 struct internal_reloc *rel, *relend;
2152 /* Mark all the symbols in this section. */
2154 hp = (obj_xcoff_sym_hashes (sec->owner)
2155 + xcoff_section_data (sec->owner, sec)->first_symndx);
2156 hpend = (obj_xcoff_sym_hashes (sec->owner)
2157 + xcoff_section_data (sec->owner, sec)->last_symndx);
2158 for (; hp < hpend; hp++)
2160 register struct xcoff_link_hash_entry *h;
2164 && (h->flags & XCOFF_MARK) == 0)
2166 if (! xcoff_mark_symbol (info, h))
2171 /* Look through the section relocs. */
2173 if ((sec->flags & SEC_RELOC) != 0
2174 && sec->reloc_count > 0)
2176 rel = xcoff_read_internal_relocs (sec->owner, sec, true,
2177 (bfd_byte *) NULL, false,
2178 (struct internal_reloc *) NULL);
2181 relend = rel + sec->reloc_count;
2182 for (; rel < relend; rel++)
2185 struct xcoff_link_hash_entry *h;
2187 if ((unsigned int) rel->r_symndx
2188 > obj_raw_syment_count (sec->owner))
2191 h = obj_xcoff_sym_hashes (sec->owner)[rel->r_symndx];
2193 && (h->flags & XCOFF_MARK) == 0)
2195 if (! xcoff_mark_symbol (info, h))
2199 rsec = xcoff_data (sec->owner)->csects[rel->r_symndx];
2201 && (rsec->flags & SEC_MARK) == 0)
2203 if (! xcoff_mark (info, rsec))
2207 /* See if this reloc needs to be copied into the .loader
2209 switch (rel->r_type)
2213 || h->root.type == bfd_link_hash_defined
2214 || h->root.type == bfd_link_hash_defweak
2215 || h->root.type == bfd_link_hash_common
2216 || ((h->flags & XCOFF_CALLED) != 0
2217 && (h->root.type == bfd_link_hash_undefined
2218 || h->root.type == bfd_link_hash_undefweak)
2219 && h->root.root.string[0] == '.'
2220 && h->descriptor != NULL
2221 && ((h->descriptor->flags & XCOFF_DEF_DYNAMIC) != 0
2229 ++xcoff_hash_table (info)->ldrel_count;
2231 h->flags |= XCOFF_LDREL;
2238 /* We should never need a .loader reloc for a TOC
2244 if (! info->keep_memory
2245 && coff_section_data (sec->owner, sec) != NULL
2246 && coff_section_data (sec->owner, sec)->relocs != NULL
2247 && ! coff_section_data (sec->owner, sec)->keep_relocs)
2249 free (coff_section_data (sec->owner, sec)->relocs);
2250 coff_section_data (sec->owner, sec)->relocs = NULL;
2258 /* The sweep phase of garbage collection. Remove all garbage
2263 struct bfd_link_info *info;
2267 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
2271 for (o = sub->sections; o != NULL; o = o->next)
2273 if ((o->flags & SEC_MARK) == 0)
2275 /* Keep all sections from non-XCOFF input files. Keep
2276 special sections. Keep .debug sections for the
2278 if (sub->xvec != info->hash->creator
2279 || o == xcoff_hash_table (info)->debug_section
2280 || o == xcoff_hash_table (info)->loader_section
2281 || o == xcoff_hash_table (info)->linkage_section
2282 || o == xcoff_hash_table (info)->toc_section
2283 || o == xcoff_hash_table (info)->descriptor_section
2284 || strcmp (o->name, ".debug") == 0)
2285 o->flags |= SEC_MARK;
2290 o->lineno_count = 0;
2297 /* Record the number of elements in a set. This is used to output the
2298 correct csect length. */
2301 bfd_xcoff_link_record_set (output_bfd, info, harg, size)
2303 struct bfd_link_info *info;
2304 struct bfd_link_hash_entry *harg;
2307 struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
2308 struct xcoff_link_size_list *n;
2310 if (! XCOFF_XVECP (output_bfd->xvec))
2313 /* This will hardly ever be called. I don't want to burn four bytes
2314 per global symbol, so instead the size is kept on a linked list
2315 attached to the hash table. */
2317 n = ((struct xcoff_link_size_list *)
2318 bfd_alloc (output_bfd, sizeof (struct xcoff_link_size_list)));
2321 n->next = xcoff_hash_table (info)->size_list;
2324 xcoff_hash_table (info)->size_list = n;
2326 h->flags |= XCOFF_HAS_SIZE;
2331 /* Import a symbol. */
2334 bfd_xcoff_import_symbol (output_bfd, info, harg, val, imppath, impfile,
2337 struct bfd_link_info *info;
2338 struct bfd_link_hash_entry *harg;
2340 const char *imppath;
2341 const char *impfile;
2342 const char *impmember;
2344 struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
2346 if (! XCOFF_XVECP (output_bfd->xvec))
2349 h->flags |= XCOFF_IMPORT;
2351 if (val != (bfd_vma) -1)
2353 if (h->root.type == bfd_link_hash_defined
2354 && (! bfd_is_abs_section (h->root.u.def.section)
2355 || h->root.u.def.value != val))
2357 if (! ((*info->callbacks->multiple_definition)
2358 (info, h->root.root.string, h->root.u.def.section->owner,
2359 h->root.u.def.section, h->root.u.def.value,
2360 output_bfd, bfd_abs_section_ptr, val)))
2364 h->root.type = bfd_link_hash_defined;
2365 h->root.u.def.section = bfd_abs_section_ptr;
2366 h->root.u.def.value = val;
2369 if (h->ldsym == NULL)
2371 h->ldsym = ((struct internal_ldsym *)
2372 bfd_zalloc (output_bfd, sizeof (struct internal_ldsym)));
2373 if (h->ldsym == NULL)
2377 if (imppath == NULL)
2378 h->ldsym->l_ifile = (bfd_size_type) -1;
2382 struct xcoff_import_file **pp;
2384 /* We start c at 1 because the first entry in the import list is
2385 reserved for the library search path. */
2386 for (pp = &xcoff_hash_table (info)->imports, c = 1;
2388 pp = &(*pp)->next, ++c)
2390 if (strcmp ((*pp)->path, imppath) == 0
2391 && strcmp ((*pp)->file, impfile) == 0
2392 && strcmp ((*pp)->member, impmember) == 0)
2398 struct xcoff_import_file *n;
2400 n = ((struct xcoff_import_file *)
2401 bfd_alloc (output_bfd, sizeof (struct xcoff_import_file)));
2407 n->member = impmember;
2411 h->ldsym->l_ifile = c;
2417 /* Export a symbol. */
2420 bfd_xcoff_export_symbol (output_bfd, info, harg, syscall)
2422 struct bfd_link_info *info;
2423 struct bfd_link_hash_entry *harg;
2426 struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
2428 if (! XCOFF_XVECP (output_bfd->xvec))
2431 h->flags |= XCOFF_EXPORT;
2433 /* FIXME: I'm not at all sure what syscall is supposed to mean, so
2434 I'm just going to ignore it until somebody explains it. */
2436 /* See if this is a function descriptor. It may be one even though
2437 it is not so marked. */
2438 if ((h->flags & XCOFF_DESCRIPTOR) == 0
2439 && h->root.root.string[0] != '.')
2442 struct xcoff_link_hash_entry *hfn;
2444 fnname = (char *) malloc (strlen (h->root.root.string) + 2);
2447 bfd_set_error (bfd_error_no_memory);
2451 strcpy (fnname + 1, h->root.root.string);
2452 hfn = xcoff_link_hash_lookup (xcoff_hash_table (info),
2453 fnname, false, false, true);
2456 && hfn->smclas == XMC_PR
2457 && (hfn->root.type == bfd_link_hash_defined
2458 || hfn->root.type == bfd_link_hash_defweak))
2460 h->flags |= XCOFF_DESCRIPTOR;
2461 h->descriptor = hfn;
2462 hfn->descriptor = h;
2466 /* Make sure we don't garbage collect this symbol. */
2467 if (! xcoff_mark_symbol (info, h))
2470 /* If this is a function descriptor, make sure we don't garbage
2471 collect the associated function code. We normally don't have to
2472 worry about this, because the descriptor will be attached to a
2473 section with relocs, but if we are creating the descriptor
2474 ourselves those relocs will not be visible to the mark code. */
2475 if ((h->flags & XCOFF_DESCRIPTOR) != 0)
2477 if (! xcoff_mark_symbol (info, h->descriptor))
2484 /* Count a reloc against a symbol. This is called for relocs
2485 generated by the linker script, typically for global constructors
2489 bfd_xcoff_link_count_reloc (output_bfd, info, name)
2491 struct bfd_link_info *info;
2494 struct xcoff_link_hash_entry *h;
2496 if (! XCOFF_XVECP (output_bfd->xvec))
2499 h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, false, false,
2503 (*_bfd_error_handler) ("%s: no such symbol", name);
2504 bfd_set_error (bfd_error_no_symbols);
2508 h->flags |= XCOFF_REF_REGULAR | XCOFF_LDREL;
2509 ++xcoff_hash_table (info)->ldrel_count;
2511 /* Mark the symbol to avoid garbage collection. */
2512 if (! xcoff_mark_symbol (info, h))
2518 /* This function is called for each symbol to which the linker script
2522 bfd_xcoff_record_link_assignment (output_bfd, info, name)
2524 struct bfd_link_info *info;
2527 struct xcoff_link_hash_entry *h;
2529 if (! XCOFF_XVECP (output_bfd->xvec))
2532 h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, true, true,
2537 h->flags |= XCOFF_DEF_REGULAR;
2542 /* This structure is used to pass information through
2543 xcoff_link_hash_traverse. */
2545 struct xcoff_loader_info
2547 /* Set if a problem occurred. */
2551 /* Link information structure. */
2552 struct bfd_link_info *info;
2553 /* Number of ldsym structures. */
2555 /* Size of string table. */
2559 /* Allocated size of string table. */
2563 /* Build the .loader section. This is called by the XCOFF linker
2564 emulation before_allocation routine. We must set the size of the
2565 .loader section before the linker lays out the output file.
2566 LIBPATH is the library path to search for shared objects; this is
2567 normally built from the -L arguments passed to the linker. ENTRY
2568 is the name of the entry point symbol. */
2571 bfd_xcoff_size_dynamic_sections (output_bfd, info, libpath, entry,
2572 file_align, maxstack, maxdata, gc,
2573 modtype, textro, special_sections)
2575 struct bfd_link_info *info;
2576 const char *libpath;
2578 unsigned long file_align;
2579 unsigned long maxstack;
2580 unsigned long maxdata;
2584 asection **special_sections;
2586 struct xcoff_link_hash_entry *hentry;
2588 struct xcoff_loader_info ldinfo;
2590 size_t impsize, impcount;
2591 struct xcoff_import_file *fl;
2592 struct internal_ldhdr *ldhdr;
2593 bfd_size_type stoff;
2597 struct bfd_strtab_hash *debug_strtab;
2598 bfd_byte *debug_contents = NULL;
2600 if (! XCOFF_XVECP (output_bfd->xvec))
2602 for (i = 0; i < 6; i++)
2603 special_sections[i] = NULL;
2607 ldinfo.failed = false;
2608 ldinfo.output_bfd = output_bfd;
2610 ldinfo.ldsym_count = 0;
2611 ldinfo.string_size = 0;
2612 ldinfo.strings = NULL;
2613 ldinfo.string_alc = 0;
2615 xcoff_data (output_bfd)->maxstack = maxstack;
2616 xcoff_data (output_bfd)->maxdata = maxdata;
2617 xcoff_data (output_bfd)->modtype = modtype;
2619 xcoff_hash_table (info)->file_align = file_align;
2620 xcoff_hash_table (info)->textro = textro;
2622 hentry = xcoff_link_hash_lookup (xcoff_hash_table (info), entry,
2623 false, false, true);
2626 hentry->flags |= XCOFF_ENTRY;
2627 if (hentry->root.type == bfd_link_hash_defined
2628 || hentry->root.type == bfd_link_hash_defweak)
2629 xcoff_data (output_bfd)->entry_section =
2630 hentry->root.u.def.section->output_section;
2633 /* Garbage collect unused sections. */
2634 if (info->relocateable
2637 || (hentry->root.type != bfd_link_hash_defined
2638 && hentry->root.type != bfd_link_hash_defweak))
2641 xcoff_hash_table (info)->gc = false;
2643 /* We still need to call xcoff_mark, in order to set ldrel_count
2645 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
2649 for (o = sub->sections; o != NULL; o = o->next)
2651 if ((o->flags & SEC_MARK) == 0)
2653 if (! xcoff_mark (info, o))
2661 if (! xcoff_mark (info, hentry->root.u.def.section))
2664 xcoff_hash_table (info)->gc = true;
2667 /* Return special sections to the caller. */
2668 for (i = 0; i < 6; i++)
2672 sec = xcoff_hash_table (info)->special_sections[i];
2675 && (sec->flags & SEC_MARK) == 0)
2677 special_sections[i] = sec;
2680 if (info->input_bfds == NULL)
2682 /* I'm not sure what to do in this bizarre case. */
2686 xcoff_link_hash_traverse (xcoff_hash_table (info), xcoff_build_ldsyms,
2691 /* Work out the size of the import file names. Each import file ID
2692 consists of three null terminated strings: the path, the file
2693 name, and the archive member name. The first entry in the list
2694 of names is the path to use to find objects, which the linker has
2695 passed in as the libpath argument. For some reason, the path
2696 entry in the other import file names appears to always be empty. */
2697 impsize = strlen (libpath) + 3;
2699 for (fl = xcoff_hash_table (info)->imports; fl != NULL; fl = fl->next)
2702 impsize += (strlen (fl->path)
2704 + strlen (fl->member)
2708 /* Set up the .loader section header. */
2709 ldhdr = &xcoff_hash_table (info)->ldhdr;
2710 ldhdr->l_version = 1;
2711 ldhdr->l_nsyms = ldinfo.ldsym_count;
2712 ldhdr->l_nreloc = xcoff_hash_table (info)->ldrel_count;
2713 ldhdr->l_istlen = impsize;
2714 ldhdr->l_nimpid = impcount;
2715 ldhdr->l_impoff = (LDHDRSZ
2716 + ldhdr->l_nsyms * LDSYMSZ
2717 + ldhdr->l_nreloc * LDRELSZ);
2718 ldhdr->l_stlen = ldinfo.string_size;
2719 stoff = ldhdr->l_impoff + impsize;
2720 if (ldinfo.string_size == 0)
2723 ldhdr->l_stoff = stoff;
2725 /* We now know the final size of the .loader section. Allocate
2727 lsec = xcoff_hash_table (info)->loader_section;
2728 lsec->_raw_size = stoff + ldhdr->l_stlen;
2729 lsec->contents = (bfd_byte *) bfd_zalloc (output_bfd, lsec->_raw_size);
2730 if (lsec->contents == NULL)
2733 /* Set up the header. */
2734 xcoff_swap_ldhdr_out (output_bfd, ldhdr,
2735 (struct external_ldhdr *) lsec->contents);
2737 /* Set up the import file names. */
2738 out = (char *) lsec->contents + ldhdr->l_impoff;
2739 strcpy (out, libpath);
2740 out += strlen (libpath) + 1;
2743 for (fl = xcoff_hash_table (info)->imports; fl != NULL; fl = fl->next)
2745 register const char *s;
2748 while ((*out++ = *s++) != '\0')
2751 while ((*out++ = *s++) != '\0')
2754 while ((*out++ = *s++) != '\0')
2758 BFD_ASSERT ((bfd_size_type) ((bfd_byte *) out - lsec->contents) == stoff);
2760 /* Set up the symbol string table. */
2761 if (ldinfo.string_size > 0)
2763 memcpy (out, ldinfo.strings, ldinfo.string_size);
2764 free (ldinfo.strings);
2765 ldinfo.strings = NULL;
2768 /* We can't set up the symbol table or the relocs yet, because we
2769 don't yet know the final position of the various sections. The
2770 .loader symbols are written out when the corresponding normal
2771 symbols are written out in xcoff_link_input_bfd or
2772 xcoff_write_global_symbol. The .loader relocs are written out
2773 when the corresponding normal relocs are handled in
2774 xcoff_link_input_bfd. */
2776 /* Allocate space for the magic sections. */
2777 sec = xcoff_hash_table (info)->linkage_section;
2778 if (sec->_raw_size > 0)
2780 sec->contents = (bfd_byte *) bfd_zalloc (output_bfd, sec->_raw_size);
2781 if (sec->contents == NULL)
2784 sec = xcoff_hash_table (info)->toc_section;
2785 if (sec->_raw_size > 0)
2787 sec->contents = (bfd_byte *) bfd_zalloc (output_bfd, sec->_raw_size);
2788 if (sec->contents == NULL)
2791 sec = xcoff_hash_table (info)->descriptor_section;
2792 if (sec->_raw_size > 0)
2794 sec->contents = (bfd_byte *) bfd_zalloc (output_bfd, sec->_raw_size);
2795 if (sec->contents == NULL)
2799 /* Now that we've done garbage collection, figure out the contents
2800 of the .debug section. */
2801 debug_strtab = xcoff_hash_table (info)->debug_strtab;
2803 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
2806 bfd_size_type symcount;
2807 unsigned long *debug_index;
2809 bfd_byte *esym, *esymend;
2810 bfd_size_type symesz;
2812 if (sub->xvec != info->hash->creator)
2814 subdeb = bfd_get_section_by_name (sub, ".debug");
2815 if (subdeb == NULL || subdeb->_raw_size == 0)
2818 if (info->strip == strip_all
2819 || info->strip == strip_debugger
2820 || info->discard == discard_all)
2822 subdeb->_raw_size = 0;
2826 if (! _bfd_coff_get_external_symbols (sub))
2829 symcount = obj_raw_syment_count (sub);
2830 debug_index = ((unsigned long *)
2831 bfd_zalloc (sub, symcount * sizeof (unsigned long)));
2832 if (debug_index == NULL)
2834 xcoff_data (sub)->debug_indices = debug_index;
2836 /* Grab the contents of the .debug section. We use malloc and
2837 copy the neams into the debug stringtab, rather than
2838 bfd_alloc, because I expect that, when linking many files
2839 together, many of the strings will be the same. Storing the
2840 strings in the hash table should save space in this case. */
2841 debug_contents = (bfd_byte *) malloc (subdeb->_raw_size);
2842 if (debug_contents == NULL)
2844 bfd_set_error (bfd_error_no_memory);
2847 if (! bfd_get_section_contents (sub, subdeb, (PTR) debug_contents,
2848 (file_ptr) 0, subdeb->_raw_size))
2851 csectpp = xcoff_data (sub)->csects;
2853 symesz = bfd_coff_symesz (sub);
2854 esym = (bfd_byte *) obj_coff_external_syms (sub);
2855 esymend = esym + symcount * symesz;
2856 while (esym < esymend)
2858 struct internal_syment sym;
2860 bfd_coff_swap_sym_in (sub, (PTR) esym, (PTR) &sym);
2862 *debug_index = (unsigned long) -1;
2864 if (sym._n._n_n._n_zeroes == 0
2867 || ((*csectpp)->flags & SEC_MARK) != 0
2868 || *csectpp == bfd_abs_section_ptr)
2869 && bfd_coff_symname_in_debug (sub, &sym))
2874 name = (char *) debug_contents + sym._n._n_n._n_offset;
2875 indx = _bfd_stringtab_add (debug_strtab, name, true, true);
2876 if (indx == (bfd_size_type) -1)
2878 *debug_index = indx;
2881 esym += (sym.n_numaux + 1) * symesz;
2882 csectpp += sym.n_numaux + 1;
2883 debug_index += sym.n_numaux + 1;
2886 free (debug_contents);
2887 debug_contents = NULL;
2889 /* Clear the size of subdeb, so that it is not included directly
2890 in the output file. */
2891 subdeb->_raw_size = 0;
2893 if (! info->keep_memory)
2895 if (! _bfd_coff_free_symbols (sub))
2900 xcoff_hash_table (info)->debug_section->_raw_size =
2901 _bfd_stringtab_size (debug_strtab);
2906 if (ldinfo.strings != NULL)
2907 free (ldinfo.strings);
2908 if (debug_contents != NULL)
2909 free (debug_contents);
2913 /* Add a symbol to the .loader symbols, if necessary. */
2916 xcoff_build_ldsyms (h, p)
2917 struct xcoff_link_hash_entry *h;
2920 struct xcoff_loader_info *ldinfo = (struct xcoff_loader_info *) p;
2923 /* We don't want to garbage collect symbols which are not defined in
2924 XCOFF files. This is a convenient place to mark them. */
2925 if (xcoff_hash_table (ldinfo->info)->gc
2926 && (h->flags & XCOFF_MARK) == 0
2927 && (h->root.type == bfd_link_hash_defined
2928 || h->root.type == bfd_link_hash_defweak)
2929 && (h->root.u.def.section->owner == NULL
2930 || (h->root.u.def.section->owner->xvec
2931 != ldinfo->info->hash->creator)))
2932 h->flags |= XCOFF_MARK;
2934 /* If this symbol is called and defined in a dynamic object, or not
2935 defined at all when building a shared object, then we need to set
2936 up global linkage code for it. (Unless we did garbage collection
2937 and we didn't need this symbol.) */
2938 if ((h->flags & XCOFF_CALLED) != 0
2939 && (h->root.type == bfd_link_hash_undefined
2940 || h->root.type == bfd_link_hash_undefweak)
2941 && h->root.root.string[0] == '.'
2942 && h->descriptor != NULL
2943 && ((h->descriptor->flags & XCOFF_DEF_DYNAMIC) != 0
2944 || ldinfo->info->shared)
2945 && (! xcoff_hash_table (ldinfo->info)->gc
2946 || (h->flags & XCOFF_MARK) != 0))
2949 struct xcoff_link_hash_entry *hds;
2951 sec = xcoff_hash_table (ldinfo->info)->linkage_section;
2952 h->root.type = bfd_link_hash_defined;
2953 h->root.u.def.section = sec;
2954 h->root.u.def.value = sec->_raw_size;
2956 h->flags |= XCOFF_DEF_REGULAR;
2957 sec->_raw_size += XCOFF_GLINK_SIZE;
2959 /* The global linkage code requires a TOC entry for the
2961 hds = h->descriptor;
2962 BFD_ASSERT ((hds->root.type == bfd_link_hash_undefined
2963 || hds->root.type == bfd_link_hash_undefweak)
2964 && (hds->flags & XCOFF_DEF_REGULAR) == 0);
2965 hds->flags |= XCOFF_MARK;
2966 if (hds->toc_section == NULL)
2968 hds->toc_section = xcoff_hash_table (ldinfo->info)->toc_section;
2969 hds->u.toc_offset = hds->toc_section->_raw_size;
2970 hds->toc_section->_raw_size += 4;
2971 ++xcoff_hash_table (ldinfo->info)->ldrel_count;
2972 ++hds->toc_section->reloc_count;
2974 hds->flags |= XCOFF_SET_TOC | XCOFF_LDREL;
2976 /* We need to call xcoff_build_ldsyms recursively here,
2977 because we may already have passed hds on the traversal. */
2978 xcoff_build_ldsyms (hds, p);
2982 /* If this symbol is exported, but not defined, we need to try to
2984 if ((h->flags & XCOFF_EXPORT) != 0
2985 && (h->flags & XCOFF_IMPORT) == 0
2986 && (h->flags & XCOFF_DEF_REGULAR) == 0
2987 && (h->flags & XCOFF_DEF_DYNAMIC) == 0
2988 && (h->root.type == bfd_link_hash_undefined
2989 || h->root.type == bfd_link_hash_undefweak))
2991 if ((h->flags & XCOFF_DESCRIPTOR) != 0
2992 && (h->descriptor->root.type == bfd_link_hash_defined
2993 || h->descriptor->root.type == bfd_link_hash_defweak))
2997 /* This is an undefined function descriptor associated with
2998 a defined entry point. We can build up a function
2999 descriptor ourselves. Believe it or not, the AIX linker
3000 actually does this, and there are cases where we need to
3002 sec = xcoff_hash_table (ldinfo->info)->descriptor_section;
3003 h->root.type = bfd_link_hash_defined;
3004 h->root.u.def.section = sec;
3005 h->root.u.def.value = sec->_raw_size;
3007 h->flags |= XCOFF_DEF_REGULAR;
3008 sec->_raw_size += 12;
3010 /* A function descriptor uses two relocs: one for the
3011 associated code, and one for the TOC address. */
3012 xcoff_hash_table (ldinfo->info)->ldrel_count += 2;
3013 sec->reloc_count += 2;
3015 /* We handle writing out the contents of the descriptor in
3016 xcoff_write_global_symbol. */
3020 (*_bfd_error_handler)
3021 ("attempt to export undefined symbol `%s'",
3022 h->root.root.string);
3023 ldinfo->failed = true;
3024 bfd_set_error (bfd_error_invalid_operation);
3029 /* If this is still a common symbol, and it wasn't garbage
3030 collected, we need to actually allocate space for it in the .bss
3032 if (h->root.type == bfd_link_hash_common
3033 && (! xcoff_hash_table (ldinfo->info)->gc
3034 || (h->flags & XCOFF_MARK) != 0)
3035 && h->root.u.c.p->section->_raw_size == 0)
3037 BFD_ASSERT (bfd_is_com_section (h->root.u.c.p->section));
3038 h->root.u.c.p->section->_raw_size = h->root.u.c.size;
3041 /* We need to add a symbol to the .loader section if it is mentioned
3042 in a reloc which we are copying to the .loader section and it was
3043 not defined or common, or if it is the entry point, or if it is
3046 if (((h->flags & XCOFF_LDREL) == 0
3047 || h->root.type == bfd_link_hash_defined
3048 || h->root.type == bfd_link_hash_defweak
3049 || h->root.type == bfd_link_hash_common)
3050 && (h->flags & XCOFF_ENTRY) == 0
3051 && (h->flags & XCOFF_EXPORT) == 0)
3057 /* We don't need to add this symbol if we did garbage collection and
3058 we did not mark this symbol. */
3059 if (xcoff_hash_table (ldinfo->info)->gc
3060 && (h->flags & XCOFF_MARK) == 0)
3066 /* We may have already processed this symbol due to the recursive
3068 if ((h->flags & XCOFF_BUILT_LDSYM) != 0)
3071 /* We need to add this symbol to the .loader symbols. */
3073 /* h->ldsym will already have been allocated for an explicitly
3075 if (h->ldsym == NULL)
3077 h->ldsym = ((struct internal_ldsym *)
3078 bfd_zalloc (ldinfo->output_bfd,
3079 sizeof (struct internal_ldsym)));
3080 if (h->ldsym == NULL)
3082 ldinfo->failed = true;
3087 /* The first 3 symbol table indices are reserved to indicate the
3089 h->ldindx = ldinfo->ldsym_count + 3;
3091 ++ldinfo->ldsym_count;
3093 len = strlen (h->root.root.string);
3094 if (len <= SYMNMLEN)
3095 strncpy (h->ldsym->_l._l_name, h->root.root.string, SYMNMLEN);
3098 if (ldinfo->string_size + len + 3 > ldinfo->string_alc)
3101 bfd_byte *newstrings;
3103 newalc = ldinfo->string_alc * 2;
3106 while (ldinfo->string_size + len + 3 > newalc)
3109 if (ldinfo->strings == NULL)
3110 newstrings = (bfd_byte *) malloc (newalc);
3112 newstrings = ((bfd_byte *)
3113 realloc ((PTR) ldinfo->strings, newalc));
3114 if (newstrings == NULL)
3116 ldinfo->failed = true;
3117 bfd_set_error (bfd_error_no_memory);
3120 ldinfo->string_alc = newalc;
3121 ldinfo->strings = newstrings;
3124 bfd_put_16 (ldinfo->output_bfd, len + 1,
3125 ldinfo->strings + ldinfo->string_size);
3126 strcpy (ldinfo->strings + ldinfo->string_size + 2, h->root.root.string);
3127 h->ldsym->_l._l_l._l_zeroes = 0;
3128 h->ldsym->_l._l_l._l_offset = ldinfo->string_size + 2;
3129 ldinfo->string_size += len + 3;
3132 h->flags |= XCOFF_BUILT_LDSYM;
3137 /* Do the final link step. */
3140 _bfd_xcoff_bfd_final_link (abfd, info)
3142 struct bfd_link_info *info;
3144 bfd_size_type symesz;
3145 struct xcoff_final_link_info finfo;
3147 struct bfd_link_order *p;
3148 size_t max_contents_size;
3149 size_t max_sym_count;
3150 size_t max_lineno_count;
3151 size_t max_reloc_count;
3152 size_t max_output_reloc_count;
3153 file_ptr rel_filepos;
3155 file_ptr line_filepos;
3156 unsigned int linesz;
3158 bfd_byte *external_relocs = NULL;
3159 char strbuf[STRING_SIZE_SIZE];
3162 abfd->flags |= DYNAMIC;
3164 symesz = bfd_coff_symesz (abfd);
3167 finfo.output_bfd = abfd;
3168 finfo.strtab = NULL;
3169 finfo.section_info = NULL;
3170 finfo.last_file_index = -1;
3171 finfo.toc_symindx = -1;
3172 finfo.internal_syms = NULL;
3173 finfo.sym_indices = NULL;
3174 finfo.outsyms = NULL;
3175 finfo.linenos = NULL;
3176 finfo.contents = NULL;
3177 finfo.external_relocs = NULL;
3179 finfo.ldsym = ((struct external_ldsym *)
3180 (xcoff_hash_table (info)->loader_section->contents
3182 finfo.ldrel = ((struct external_ldrel *)
3183 (xcoff_hash_table (info)->loader_section->contents
3185 + xcoff_hash_table (info)->ldhdr.l_nsyms * LDSYMSZ));
3187 xcoff_data (abfd)->coff.link_info = info;
3189 finfo.strtab = _bfd_stringtab_init ();
3190 if (finfo.strtab == NULL)
3193 /* Count the line number and relocation entries required for the
3194 output file. Determine a few maximum sizes. */
3195 max_contents_size = 0;
3196 max_lineno_count = 0;
3197 max_reloc_count = 0;
3198 for (o = abfd->sections; o != NULL; o = o->next)
3201 o->lineno_count = 0;
3202 for (p = o->link_order_head; p != NULL; p = p->next)
3204 if (p->type == bfd_indirect_link_order)
3208 sec = p->u.indirect.section;
3210 if (info->strip == strip_none
3211 || info->strip == strip_some)
3212 o->lineno_count += sec->lineno_count;
3214 o->reloc_count += sec->reloc_count;
3216 if (sec->_raw_size > max_contents_size)
3217 max_contents_size = sec->_raw_size;
3218 if (sec->lineno_count > max_lineno_count)
3219 max_lineno_count = sec->lineno_count;
3220 if (coff_section_data (sec->owner, sec) != NULL
3221 && xcoff_section_data (sec->owner, sec) != NULL
3222 && (xcoff_section_data (sec->owner, sec)->lineno_count
3223 > max_lineno_count))
3225 xcoff_section_data (sec->owner, sec)->lineno_count;
3226 if (sec->reloc_count > max_reloc_count)
3227 max_reloc_count = sec->reloc_count;
3229 else if (p->type == bfd_section_reloc_link_order
3230 || p->type == bfd_symbol_reloc_link_order)
3235 /* Compute the file positions for all the sections. */
3236 if (abfd->output_has_begun)
3238 if (xcoff_hash_table (info)->file_align != 0)
3245 file_align = xcoff_hash_table (info)->file_align;
3246 if (file_align != 0)
3248 boolean saw_contents;
3253 /* Insert .pad sections before every section which has
3254 contents and is loaded, if it is preceded by some other
3255 section which has contents and is loaded. */
3256 saw_contents = true;
3257 for (op = &abfd->sections; *op != NULL; op = &(*op)->next)
3259 (*op)->target_index = indx;
3260 if (strcmp ((*op)->name, ".pad") == 0)
3261 saw_contents = false;
3262 else if (((*op)->flags & SEC_HAS_CONTENTS) != 0
3263 && ((*op)->flags & SEC_LOAD) != 0)
3266 saw_contents = true;
3273 n = bfd_make_section_anyway (abfd, ".pad");
3274 BFD_ASSERT (*op == n);
3276 n->flags = SEC_HAS_CONTENTS;
3277 n->alignment_power = 0;
3278 saw_contents = false;
3283 /* Reset the section indices after inserting the new
3286 for (o = abfd->sections; o != NULL; o = o->next)
3289 o->target_index = indx;
3291 BFD_ASSERT ((unsigned int) indx == abfd->section_count);
3293 /* Work out appropriate sizes for the .pad sections to force
3294 each section to land on a page boundary. This bit of
3295 code knows what compute_section_file_positions is going
3297 sofar = bfd_coff_filhsz (abfd);
3298 sofar += bfd_coff_aoutsz (abfd);
3299 sofar += abfd->section_count * bfd_coff_scnhsz (abfd);
3300 for (o = abfd->sections; o != NULL; o = o->next)
3301 if (o->reloc_count >= 0xffff || o->lineno_count >= 0xffff)
3302 sofar += bfd_coff_scnhsz (abfd);
3304 for (o = abfd->sections; o != NULL; o = o->next)
3306 if (strcmp (o->name, ".pad") == 0)
3310 BFD_ASSERT (o->_raw_size == 0);
3311 pageoff = sofar & (file_align - 1);
3314 o->_raw_size = file_align - pageoff;
3315 sofar += file_align - pageoff;
3316 o->flags |= SEC_HAS_CONTENTS;
3321 if ((o->flags & SEC_HAS_CONTENTS) != 0)
3322 sofar += BFD_ALIGN (o->_raw_size,
3323 1 << o->alignment_power);
3328 bfd_coff_compute_section_file_positions (abfd);
3331 /* Allocate space for the pointers we need to keep for the relocs. */
3335 /* We use section_count + 1, rather than section_count, because
3336 the target_index fields are 1 based. */
3337 finfo.section_info = ((struct xcoff_link_section_info *)
3338 malloc ((abfd->section_count + 1)
3339 * sizeof (struct xcoff_link_section_info)));
3340 if (finfo.section_info == NULL)
3342 bfd_set_error (bfd_error_no_memory);
3345 for (i = 0; i <= abfd->section_count; i++)
3347 finfo.section_info[i].relocs = NULL;
3348 finfo.section_info[i].rel_hashes = NULL;
3349 finfo.section_info[i].toc_rel_hashes = NULL;
3353 /* Set the file positions for the relocs. */
3354 rel_filepos = obj_relocbase (abfd);
3355 relsz = bfd_coff_relsz (abfd);
3356 max_output_reloc_count = 0;
3357 for (o = abfd->sections; o != NULL; o = o->next)
3359 if (o->reloc_count == 0)
3363 o->flags |= SEC_RELOC;
3364 o->rel_filepos = rel_filepos;
3365 rel_filepos += o->reloc_count * relsz;
3367 /* We don't know the indices of global symbols until we have
3368 written out all the local symbols. For each section in
3369 the output file, we keep an array of pointers to hash
3370 table entries. Each entry in the array corresponds to a
3371 reloc. When we find a reloc against a global symbol, we
3372 set the corresponding entry in this array so that we can
3373 fix up the symbol index after we have written out all the
3376 Because of this problem, we also keep the relocs in
3377 memory until the end of the link. This wastes memory.
3378 We could backpatch the file later, I suppose, although it
3380 finfo.section_info[o->target_index].relocs =
3381 ((struct internal_reloc *)
3382 malloc (o->reloc_count * sizeof (struct internal_reloc)));
3383 finfo.section_info[o->target_index].rel_hashes =
3384 ((struct xcoff_link_hash_entry **)
3385 malloc (o->reloc_count
3386 * sizeof (struct xcoff_link_hash_entry *)));
3387 if (finfo.section_info[o->target_index].relocs == NULL
3388 || finfo.section_info[o->target_index].rel_hashes == NULL)
3390 bfd_set_error (bfd_error_no_memory);
3394 if (o->reloc_count > max_output_reloc_count)
3395 max_output_reloc_count = o->reloc_count;
3399 /* We now know the size of the relocs, so we can determine the file
3400 positions of the line numbers. */
3401 line_filepos = rel_filepos;
3402 finfo.line_filepos = line_filepos;
3403 linesz = bfd_coff_linesz (abfd);
3404 for (o = abfd->sections; o != NULL; o = o->next)
3406 if (o->lineno_count == 0)
3407 o->line_filepos = 0;
3410 o->line_filepos = line_filepos;
3411 line_filepos += o->lineno_count * linesz;
3414 /* Reset the reloc and lineno counts, so that we can use them to
3415 count the number of entries we have output so far. */
3417 o->lineno_count = 0;
3420 obj_sym_filepos (abfd) = line_filepos;
3422 /* Figure out the largest number of symbols in an input BFD. Take
3423 the opportunity to clear the output_has_begun fields of all the
3424 input BFD's. We want at least 4 symbols, since that is the
3425 number which xcoff_write_global_symbol may need. */
3427 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
3431 sub->output_has_begun = false;
3432 sz = obj_raw_syment_count (sub);
3433 if (sz > max_sym_count)
3437 /* Allocate some buffers used while linking. */
3438 finfo.internal_syms = ((struct internal_syment *)
3439 malloc (max_sym_count
3440 * sizeof (struct internal_syment)));
3441 finfo.sym_indices = (long *) malloc (max_sym_count * sizeof (long));
3442 finfo.outsyms = ((bfd_byte *)
3443 malloc ((size_t) ((max_sym_count + 1) * symesz)));
3444 finfo.linenos = (bfd_byte *) malloc (max_lineno_count
3445 * bfd_coff_linesz (abfd));
3446 finfo.contents = (bfd_byte *) malloc (max_contents_size);
3447 finfo.external_relocs = (bfd_byte *) malloc (max_reloc_count * relsz);
3448 if ((finfo.internal_syms == NULL && max_sym_count > 0)
3449 || (finfo.sym_indices == NULL && max_sym_count > 0)
3450 || finfo.outsyms == NULL
3451 || (finfo.linenos == NULL && max_lineno_count > 0)
3452 || (finfo.contents == NULL && max_contents_size > 0)
3453 || (finfo.external_relocs == NULL && max_reloc_count > 0))
3455 bfd_set_error (bfd_error_no_memory);
3459 obj_raw_syment_count (abfd) = 0;
3460 xcoff_data (abfd)->toc = (bfd_vma) -1;
3462 /* We now know the position of everything in the file, except that
3463 we don't know the size of the symbol table and therefore we don't
3464 know where the string table starts. We just build the string
3465 table in memory as we go along. We process all the relocations
3466 for a single input file at once. */
3467 for (o = abfd->sections; o != NULL; o = o->next)
3469 for (p = o->link_order_head; p != NULL; p = p->next)
3471 if (p->type == bfd_indirect_link_order
3472 && p->u.indirect.section->owner->xvec == abfd->xvec)
3474 sub = p->u.indirect.section->owner;
3475 if (! sub->output_has_begun)
3477 if (! xcoff_link_input_bfd (&finfo, sub))
3479 sub->output_has_begun = true;
3482 else if (p->type == bfd_section_reloc_link_order
3483 || p->type == bfd_symbol_reloc_link_order)
3485 if (! xcoff_reloc_link_order (abfd, &finfo, o, p))
3490 if (! _bfd_default_link_order (abfd, info, o, p))
3496 /* Free up the buffers used by xcoff_link_input_bfd. */
3498 if (finfo.internal_syms != NULL)
3500 free (finfo.internal_syms);
3501 finfo.internal_syms = NULL;
3503 if (finfo.sym_indices != NULL)
3505 free (finfo.sym_indices);
3506 finfo.sym_indices = NULL;
3508 if (finfo.linenos != NULL)
3510 free (finfo.linenos);
3511 finfo.linenos = NULL;
3513 if (finfo.contents != NULL)
3515 free (finfo.contents);
3516 finfo.contents = NULL;
3518 if (finfo.external_relocs != NULL)
3520 free (finfo.external_relocs);
3521 finfo.external_relocs = NULL;
3524 /* The value of the last C_FILE symbol is supposed to be -1. Write
3526 if (finfo.last_file_index != -1)
3528 finfo.last_file.n_value = -1;
3529 bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file,
3530 (PTR) finfo.outsyms);
3532 (obj_sym_filepos (abfd)
3533 + finfo.last_file_index * symesz),
3535 || bfd_write (finfo.outsyms, symesz, 1, abfd) != symesz)
3539 /* Write out all the global symbols which do not come from XCOFF
3541 xcoff_link_hash_traverse (xcoff_hash_table (info),
3542 xcoff_write_global_symbol,
3545 if (finfo.outsyms != NULL)
3547 free (finfo.outsyms);
3548 finfo.outsyms = NULL;
3551 /* Now that we have written out all the global symbols, we know the
3552 symbol indices to use for relocs against them, and we can finally
3553 write out the relocs. */
3554 external_relocs = (bfd_byte *) malloc (max_output_reloc_count * relsz);
3555 if (external_relocs == NULL && max_output_reloc_count != 0)
3557 bfd_set_error (bfd_error_no_memory);
3561 for (o = abfd->sections; o != NULL; o = o->next)
3563 struct internal_reloc *irel;
3564 struct internal_reloc *irelend;
3565 struct xcoff_link_hash_entry **rel_hash;
3566 struct xcoff_toc_rel_hash *toc_rel_hash;
3569 if (o->reloc_count == 0)
3572 irel = finfo.section_info[o->target_index].relocs;
3573 irelend = irel + o->reloc_count;
3574 rel_hash = finfo.section_info[o->target_index].rel_hashes;
3575 for (; irel < irelend; irel++, rel_hash++, erel += relsz)
3577 if (*rel_hash != NULL)
3579 if ((*rel_hash)->indx < 0)
3581 if (! ((*info->callbacks->unattached_reloc)
3582 (info, (*rel_hash)->root.root.string,
3583 (bfd *) NULL, o, irel->r_vaddr)))
3585 (*rel_hash)->indx = 0;
3587 irel->r_symndx = (*rel_hash)->indx;
3591 for (toc_rel_hash = finfo.section_info[o->target_index].toc_rel_hashes;
3592 toc_rel_hash != NULL;
3593 toc_rel_hash = toc_rel_hash->next)
3595 if (toc_rel_hash->h->u.toc_indx < 0)
3597 if (! ((*info->callbacks->unattached_reloc)
3598 (info, toc_rel_hash->h->root.root.string,
3599 (bfd *) NULL, o, toc_rel_hash->rel->r_vaddr)))
3601 toc_rel_hash->h->u.toc_indx = 0;
3603 toc_rel_hash->rel->r_symndx = toc_rel_hash->h->u.toc_indx;
3606 /* XCOFF requires that the relocs be sorted by address. We tend
3607 to produce them in the order in which their containing csects
3608 appear in the symbol table, which is not necessarily by
3609 address. So we sort them here. There may be a better way to
3611 qsort ((PTR) finfo.section_info[o->target_index].relocs,
3612 o->reloc_count, sizeof (struct internal_reloc),
3615 irel = finfo.section_info[o->target_index].relocs;
3616 irelend = irel + o->reloc_count;
3617 erel = external_relocs;
3618 for (; irel < irelend; irel++, rel_hash++, erel += relsz)
3619 bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel);
3621 if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
3622 || bfd_write ((PTR) external_relocs, relsz, o->reloc_count,
3623 abfd) != relsz * o->reloc_count)
3627 if (external_relocs != NULL)
3629 free (external_relocs);
3630 external_relocs = NULL;
3633 /* Free up the section information. */
3634 if (finfo.section_info != NULL)
3638 for (i = 0; i < abfd->section_count; i++)
3640 if (finfo.section_info[i].relocs != NULL)
3641 free (finfo.section_info[i].relocs);
3642 if (finfo.section_info[i].rel_hashes != NULL)
3643 free (finfo.section_info[i].rel_hashes);
3645 free (finfo.section_info);
3646 finfo.section_info = NULL;
3649 /* Write out the loader section contents. */
3650 BFD_ASSERT ((bfd_byte *) finfo.ldrel
3651 == (xcoff_hash_table (info)->loader_section->contents
3652 + xcoff_hash_table (info)->ldhdr.l_impoff));
3653 o = xcoff_hash_table (info)->loader_section;
3654 if (! bfd_set_section_contents (abfd, o->output_section,
3655 o->contents, o->output_offset,
3659 /* Write out the magic sections. */
3660 o = xcoff_hash_table (info)->linkage_section;
3661 if (o->_raw_size > 0
3662 && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
3663 o->output_offset, o->_raw_size))
3665 o = xcoff_hash_table (info)->toc_section;
3666 if (o->_raw_size > 0
3667 && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
3668 o->output_offset, o->_raw_size))
3670 o = xcoff_hash_table (info)->descriptor_section;
3671 if (o->_raw_size > 0
3672 && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
3673 o->output_offset, o->_raw_size))
3676 /* Write out the string table. */
3678 (obj_sym_filepos (abfd)
3679 + obj_raw_syment_count (abfd) * symesz),
3683 _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE,
3684 (bfd_byte *) strbuf);
3685 if (bfd_write (strbuf, 1, STRING_SIZE_SIZE, abfd) != STRING_SIZE_SIZE)
3687 if (! _bfd_stringtab_emit (abfd, finfo.strtab))
3690 _bfd_stringtab_free (finfo.strtab);
3692 /* Write out the debugging string table. */
3693 o = xcoff_hash_table (info)->debug_section;
3696 struct bfd_strtab_hash *debug_strtab;
3698 debug_strtab = xcoff_hash_table (info)->debug_strtab;
3699 BFD_ASSERT (o->output_section->_raw_size - o->output_offset
3700 >= _bfd_stringtab_size (debug_strtab));
3702 o->output_section->filepos + o->output_offset,
3705 if (! _bfd_stringtab_emit (abfd, debug_strtab))
3709 /* Setting bfd_get_symcount to 0 will cause write_object_contents to
3710 not try to write out the symbols. */
3711 bfd_get_symcount (abfd) = 0;
3716 if (finfo.strtab != NULL)
3717 _bfd_stringtab_free (finfo.strtab);
3718 if (finfo.section_info != NULL)
3722 for (i = 0; i < abfd->section_count; i++)
3724 if (finfo.section_info[i].relocs != NULL)
3725 free (finfo.section_info[i].relocs);
3726 if (finfo.section_info[i].rel_hashes != NULL)
3727 free (finfo.section_info[i].rel_hashes);
3729 free (finfo.section_info);
3731 if (finfo.internal_syms != NULL)
3732 free (finfo.internal_syms);
3733 if (finfo.sym_indices != NULL)
3734 free (finfo.sym_indices);
3735 if (finfo.outsyms != NULL)
3736 free (finfo.outsyms);
3737 if (finfo.linenos != NULL)
3738 free (finfo.linenos);
3739 if (finfo.contents != NULL)
3740 free (finfo.contents);
3741 if (finfo.external_relocs != NULL)
3742 free (finfo.external_relocs);
3743 if (external_relocs != NULL)
3744 free (external_relocs);
3748 /* Link an input file into the linker output file. This function
3749 handles all the sections and relocations of the input file at once. */
3752 xcoff_link_input_bfd (finfo, input_bfd)
3753 struct xcoff_final_link_info *finfo;
3757 const char *strings;
3758 bfd_size_type syment_base;
3759 unsigned int n_tmask;
3760 unsigned int n_btshft;
3762 bfd_size_type isymesz;
3763 bfd_size_type osymesz;
3764 bfd_size_type linesz;
3767 struct xcoff_link_hash_entry **sym_hash;
3768 struct internal_syment *isymp;
3770 unsigned long *debug_index;
3772 unsigned long output_index;
3779 /* We can just skip DYNAMIC files, unless this is a static link. */
3780 if ((input_bfd->flags & DYNAMIC) != 0
3781 && ! finfo->info->static_link)
3784 /* Move all the symbols to the output file. */
3786 output_bfd = finfo->output_bfd;
3788 syment_base = obj_raw_syment_count (output_bfd);
3789 isymesz = bfd_coff_symesz (input_bfd);
3790 osymesz = bfd_coff_symesz (output_bfd);
3791 linesz = bfd_coff_linesz (input_bfd);
3792 BFD_ASSERT (linesz == bfd_coff_linesz (output_bfd));
3794 n_tmask = coff_data (input_bfd)->local_n_tmask;
3795 n_btshft = coff_data (input_bfd)->local_n_btshft;
3797 /* Define macros so that ISFCN, et. al., macros work correctly. */
3798 #define N_TMASK n_tmask
3799 #define N_BTSHFT n_btshft
3802 if (! finfo->info->keep_memory)
3805 if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
3808 if (! _bfd_coff_get_external_symbols (input_bfd))
3811 esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
3812 esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
3813 sym_hash = obj_xcoff_sym_hashes (input_bfd);
3814 csectpp = xcoff_data (input_bfd)->csects;
3815 debug_index = xcoff_data (input_bfd)->debug_indices;
3816 isymp = finfo->internal_syms;
3817 indexp = finfo->sym_indices;
3818 output_index = syment_base;
3819 outsym = finfo->outsyms;
3823 while (esym < esym_end)
3825 struct internal_syment isym;
3826 union internal_auxent aux;
3832 bfd_coff_swap_sym_in (input_bfd, (PTR) esym, (PTR) isymp);
3834 /* If this is a C_EXT or C_HIDEXT symbol, we need the csect
3836 if (isymp->n_sclass == C_EXT || isymp->n_sclass == C_HIDEXT)
3838 BFD_ASSERT (isymp->n_numaux > 0);
3839 bfd_coff_swap_aux_in (input_bfd,
3840 (PTR) (esym + isymesz * isymp->n_numaux),
3841 isymp->n_type, isymp->n_sclass,
3842 isymp->n_numaux - 1, isymp->n_numaux,
3844 smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp);
3847 /* Make a copy of *isymp so that the relocate_section function
3848 always sees the original values. This is more reliable than
3849 always recomputing the symbol value even if we are stripping
3853 /* If this symbol is in the .loader section, swap out the
3854 .loader symbol information. If this is an external symbol
3855 reference to a defined symbol, though, then wait until we get
3856 to the definition. */
3857 if (isym.n_sclass == C_EXT
3858 && *sym_hash != NULL
3859 && (*sym_hash)->ldsym != NULL
3861 || (*sym_hash)->root.type == bfd_link_hash_undefined))
3863 struct xcoff_link_hash_entry *h;
3864 struct internal_ldsym *ldsym;
3868 if (isym.n_scnum > 0)
3870 ldsym->l_scnum = (*csectpp)->output_section->target_index;
3871 ldsym->l_value = (isym.n_value
3872 + (*csectpp)->output_section->vma
3873 + (*csectpp)->output_offset
3878 ldsym->l_scnum = isym.n_scnum;
3879 ldsym->l_value = isym.n_value;
3882 ldsym->l_smtype = smtyp;
3883 if (((h->flags & XCOFF_DEF_REGULAR) == 0
3884 && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
3885 || (h->flags & XCOFF_IMPORT) != 0)
3886 ldsym->l_smtype |= L_IMPORT;
3887 if (((h->flags & XCOFF_DEF_REGULAR) != 0
3888 && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
3889 || (h->flags & XCOFF_EXPORT) != 0)
3890 ldsym->l_smtype |= L_EXPORT;
3891 if ((h->flags & XCOFF_ENTRY) != 0)
3892 ldsym->l_smtype |= L_ENTRY;
3894 ldsym->l_smclas = aux.x_csect.x_smclas;
3896 if (ldsym->l_ifile == (bfd_size_type) -1)
3898 else if (ldsym->l_ifile == 0)
3900 if ((ldsym->l_smtype & L_IMPORT) == 0)
3906 if (h->root.type == bfd_link_hash_defined
3907 || h->root.type == bfd_link_hash_defweak)
3908 impbfd = h->root.u.def.section->owner;
3909 else if (h->root.type == bfd_link_hash_undefined
3910 || h->root.type == bfd_link_hash_undefweak)
3911 impbfd = h->root.u.undef.abfd;
3919 BFD_ASSERT (impbfd->xvec == finfo->output_bfd->xvec);
3920 ldsym->l_ifile = xcoff_data (impbfd)->import_file_id;
3927 BFD_ASSERT (h->ldindx >= 0);
3928 BFD_ASSERT (LDSYMSZ == sizeof (struct external_ldsym));
3929 xcoff_swap_ldsym_out (finfo->output_bfd, ldsym,
3930 finfo->ldsym + h->ldindx - 3);
3938 add = 1 + isym.n_numaux;
3940 /* If we are skipping this csect, we want to skip this symbol. */
3941 if (*csectpp == NULL)
3944 /* If we garbage collected this csect, we want to skip this
3947 && xcoff_hash_table (finfo->info)->gc
3948 && ((*csectpp)->flags & SEC_MARK) == 0
3949 && *csectpp != bfd_abs_section_ptr)
3952 /* An XCOFF linker always skips C_STAT symbols. */
3954 && isymp->n_sclass == C_STAT)
3957 /* We skip all but the first TOC anchor. */
3959 && isymp->n_sclass == C_HIDEXT
3960 && aux.x_csect.x_smclas == XMC_TC0)
3962 if (finfo->toc_symindx != -1)
3966 bfd_vma tocval, tocend;
3968 tocval = ((*csectpp)->output_section->vma
3969 + (*csectpp)->output_offset
3972 /* We want to find out if tocval is a good value to use
3973 as the TOC anchor--that is, whether we can access all
3974 of the TOC using a 16 bit offset from tocval. This
3975 test assumes that the TOC comes at the end of the
3976 output section, as it does in the default linker
3977 script. If the TOC anchor is too far into the .toc
3978 section, the relocation routine will report
3980 tocend = ((*csectpp)->output_section->vma
3981 + (*csectpp)->output_section->_raw_size);
3982 if (tocval + 0x8000 < tocend)
3986 tocadd = tocend - (tocval + 0x8000);
3988 isym.n_value += tocadd;
3991 finfo->toc_symindx = output_index;
3992 xcoff_data (finfo->output_bfd)->toc = tocval;
3993 xcoff_data (finfo->output_bfd)->toc_section =
3994 (*csectpp)->output_section;
3999 /* If we are stripping all symbols, we want to skip this one. */
4001 && finfo->info->strip == strip_all)
4004 /* We can skip resolved external references. */
4006 && isym.n_sclass == C_EXT
4008 && (*sym_hash)->root.type != bfd_link_hash_undefined)
4011 /* We can skip common symbols if they got defined somewhere
4014 && isym.n_sclass == C_EXT
4016 && ((*sym_hash)->root.type != bfd_link_hash_common
4017 || (*sym_hash)->root.u.c.p->section != *csectpp)
4018 && ((*sym_hash)->root.type != bfd_link_hash_defined
4019 || (*sym_hash)->root.u.def.section != *csectpp))
4022 /* Skip local symbols if we are discarding them. */
4024 && finfo->info->discard == discard_all
4025 && isym.n_sclass != C_EXT
4026 && (isym.n_sclass != C_HIDEXT
4027 || smtyp != XTY_SD))
4030 /* If we stripping debugging symbols, and this is a debugging
4031 symbol, then skip it. */
4033 && finfo->info->strip == strip_debugger
4034 && isym.n_scnum == N_DEBUG)
4037 /* If some symbols are stripped based on the name, work out the
4038 name and decide whether to skip this symbol. We don't handle
4039 this correctly for symbols whose names are in the .debug
4040 section; to get it right we would need a new bfd_strtab_hash
4041 function to return the string given the index. */
4043 && (finfo->info->strip == strip_some
4044 || finfo->info->discard == discard_l)
4045 && (debug_index == NULL || *debug_index == (unsigned long) -1))
4048 char buf[SYMNMLEN + 1];
4050 name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
4054 if ((finfo->info->strip == strip_some
4055 && (bfd_hash_lookup (finfo->info->keep_hash, name, false,
4057 || (finfo->info->discard == discard_l
4058 && (isym.n_sclass != C_EXT
4059 && (isym.n_sclass != C_HIDEXT
4060 || smtyp != XTY_SD))
4061 && strncmp (name, finfo->info->lprefix,
4062 finfo->info->lprefix_len) == 0))
4066 /* We can not skip the first TOC anchor. */
4069 && finfo->info->strip != strip_all)
4072 /* We now know whether we are to skip this symbol or not. */
4075 /* Adjust the symbol in order to output it. */
4077 if (isym._n._n_n._n_zeroes == 0
4078 && isym._n._n_n._n_offset != 0)
4080 /* This symbol has a long name. Enter it in the string
4081 table we are building. If *debug_index != -1, the
4082 name has already been entered in the .debug section. */
4083 if (debug_index != NULL && *debug_index != (unsigned long) -1)
4084 isym._n._n_n._n_offset = *debug_index;
4090 name = _bfd_coff_internal_syment_name (input_bfd, &isym,
4094 indx = _bfd_stringtab_add (finfo->strtab, name, hash, copy);
4095 if (indx == (bfd_size_type) -1)
4097 isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
4101 if (isym.n_sclass != C_BSTAT
4102 && isym.n_sclass != C_ESTAT
4103 && isym.n_sclass != C_DECL
4104 && isym.n_scnum > 0)
4106 isym.n_scnum = (*csectpp)->output_section->target_index;
4107 isym.n_value += ((*csectpp)->output_section->vma
4108 + (*csectpp)->output_offset
4112 /* The value of a C_FILE symbol is the symbol index of the
4113 next C_FILE symbol. The value of the last C_FILE symbol
4114 is -1. We try to get this right, below, just before we
4115 write the symbols out, but in the general case we may
4116 have to write the symbol out twice. */
4117 if (isym.n_sclass == C_FILE)
4119 if (finfo->last_file_index != -1
4120 && finfo->last_file.n_value != (long) output_index)
4122 /* We must correct the value of the last C_FILE entry. */
4123 finfo->last_file.n_value = output_index;
4124 if ((bfd_size_type) finfo->last_file_index >= syment_base)
4126 /* The last C_FILE symbol is in this input file. */
4127 bfd_coff_swap_sym_out (output_bfd,
4128 (PTR) &finfo->last_file,
4129 (PTR) (finfo->outsyms
4130 + ((finfo->last_file_index
4136 /* We have already written out the last C_FILE
4137 symbol. We need to write it out again. We
4138 borrow *outsym temporarily. */
4139 bfd_coff_swap_sym_out (output_bfd,
4140 (PTR) &finfo->last_file,
4142 if (bfd_seek (output_bfd,
4143 (obj_sym_filepos (output_bfd)
4144 + finfo->last_file_index * osymesz),
4146 || (bfd_write (outsym, osymesz, 1, output_bfd)
4152 finfo->last_file_index = output_index;
4153 finfo->last_file = isym;
4156 /* The value of a C_BINCL or C_EINCL symbol is a file offset
4157 into the line numbers. We update the symbol values when
4158 we handle the line numbers. */
4159 if (isym.n_sclass == C_BINCL
4160 || isym.n_sclass == C_EINCL)
4162 isym.n_value = finfo->line_filepos;
4166 /* Output the symbol. */
4168 bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym);
4170 *indexp = output_index;
4172 if (isym.n_sclass == C_EXT)
4175 struct xcoff_link_hash_entry *h;
4177 indx = ((esym - (bfd_byte *) obj_coff_external_syms (input_bfd))
4179 h = obj_xcoff_sym_hashes (input_bfd)[indx];
4180 BFD_ASSERT (h != NULL);
4181 h->indx = output_index;
4184 /* If this is a symbol in the TOC which we may have merged
4185 (class XMC_TC), remember the symbol index of the TOC
4187 if (isym.n_sclass == C_HIDEXT
4188 && aux.x_csect.x_smclas == XMC_TC
4189 && *sym_hash != NULL)
4191 BFD_ASSERT (((*sym_hash)->flags & XCOFF_SET_TOC) == 0);
4192 BFD_ASSERT ((*sym_hash)->toc_section != NULL);
4193 (*sym_hash)->u.toc_indx = output_index;
4196 output_index += add;
4197 outsym += add * osymesz;
4200 esym += add * isymesz;
4204 if (debug_index != NULL)
4207 for (--add; add > 0; --add)
4211 /* Fix up the aux entries and the C_BSTAT symbols. This must be
4212 done in a separate pass, because we don't know the correct symbol
4213 indices until we have already decided which symbols we are going
4216 esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
4217 esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
4218 isymp = finfo->internal_syms;
4219 indexp = finfo->sym_indices;
4220 csectpp = xcoff_data (input_bfd)->csects;
4221 outsym = finfo->outsyms;
4222 while (esym < esym_end)
4226 add = 1 + isymp->n_numaux;
4229 esym += add * isymesz;
4234 if (isymp->n_sclass == C_BSTAT)
4236 struct internal_syment isym;
4239 /* The value of a C_BSTAT symbol is the symbol table
4240 index of the containing csect. */
4241 bfd_coff_swap_sym_in (output_bfd, (PTR) outsym, (PTR) &isym);
4242 indx = isym.n_value;
4243 if (indx < obj_raw_syment_count (input_bfd))
4247 symindx = finfo->sym_indices[indx];
4251 isym.n_value = symindx;
4252 bfd_coff_swap_sym_out (output_bfd, (PTR) &isym,
4260 for (i = 0; i < isymp->n_numaux && esym < esym_end; i++)
4262 union internal_auxent aux;
4264 bfd_coff_swap_aux_in (input_bfd, (PTR) esym, isymp->n_type,
4265 isymp->n_sclass, i, isymp->n_numaux,
4268 if (isymp->n_sclass == C_FILE)
4270 /* This is the file name (or some comment put in by
4271 the compiler). If it is long, we must put it in
4272 the string table. */
4273 if (aux.x_file.x_n.x_zeroes == 0
4274 && aux.x_file.x_n.x_offset != 0)
4276 const char *filename;
4279 BFD_ASSERT (aux.x_file.x_n.x_offset
4280 >= STRING_SIZE_SIZE);
4281 if (strings == NULL)
4283 strings = _bfd_coff_read_string_table (input_bfd);
4284 if (strings == NULL)
4287 filename = strings + aux.x_file.x_n.x_offset;
4288 indx = _bfd_stringtab_add (finfo->strtab, filename,
4290 if (indx == (bfd_size_type) -1)
4292 aux.x_file.x_n.x_offset = STRING_SIZE_SIZE + indx;
4295 else if ((isymp->n_sclass == C_EXT
4296 || isymp->n_sclass == C_HIDEXT)
4297 && i + 1 == isymp->n_numaux)
4299 /* We don't support type checking. I don't know if
4301 aux.x_csect.x_parmhash = 0;
4302 /* I don't think anybody uses these fields, but we'd
4303 better clobber them just in case. */
4304 aux.x_csect.x_stab = 0;
4305 aux.x_csect.x_snstab = 0;
4306 if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_LD)
4310 indx = aux.x_csect.x_scnlen.l;
4311 if (indx < obj_raw_syment_count (input_bfd))
4315 symindx = finfo->sym_indices[indx];
4317 aux.x_sym.x_tagndx.l = 0;
4319 aux.x_sym.x_tagndx.l = symindx;
4323 else if (isymp->n_sclass != C_STAT || isymp->n_type != T_NULL)
4327 if (ISFCN (isymp->n_type)
4328 || ISTAG (isymp->n_sclass)
4329 || isymp->n_sclass == C_BLOCK)
4331 indx = aux.x_sym.x_fcnary.x_fcn.x_endndx.l;
4333 && indx < obj_raw_syment_count (input_bfd))
4335 /* We look forward through the symbol for
4336 the index of the next symbol we are going
4337 to include. I don't know if this is
4339 while (finfo->sym_indices[indx] < 0
4340 && indx < obj_raw_syment_count (input_bfd))
4342 if (indx >= obj_raw_syment_count (input_bfd))
4343 indx = output_index;
4345 indx = finfo->sym_indices[indx];
4346 aux.x_sym.x_fcnary.x_fcn.x_endndx.l = indx;
4350 indx = aux.x_sym.x_tagndx.l;
4351 if (indx > 0 && indx < obj_raw_syment_count (input_bfd))
4355 symindx = finfo->sym_indices[indx];
4357 aux.x_sym.x_tagndx.l = 0;
4359 aux.x_sym.x_tagndx.l = symindx;
4363 /* Copy over the line numbers, unless we are stripping
4364 them. We do this on a symbol by symbol basis in
4365 order to more easily handle garbage collection. */
4366 if ((isymp->n_sclass == C_EXT
4367 || isymp->n_sclass == C_HIDEXT)
4369 && isymp->n_numaux > 1
4370 && ISFCN (isymp->n_type)
4371 && aux.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0)
4373 if (finfo->info->strip != strip_none
4374 && finfo->info->strip != strip_some)
4375 aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0;
4378 asection *enclosing;
4379 unsigned int enc_count;
4380 bfd_size_type linoff;
4381 struct internal_lineno lin;
4384 enclosing = xcoff_section_data (abfd, o)->enclosing;
4385 enc_count = xcoff_section_data (abfd, o)->lineno_count;
4386 if (oline != enclosing)
4388 if (bfd_seek (input_bfd,
4389 enclosing->line_filepos,
4391 || (bfd_read (finfo->linenos, linesz,
4392 enc_count, input_bfd)
4393 != linesz * enc_count))
4398 linoff = (aux.x_sym.x_fcnary.x_fcn.x_lnnoptr
4399 - enclosing->line_filepos);
4401 bfd_coff_swap_lineno_in (input_bfd,
4402 (PTR) (finfo->linenos + linoff),
4405 || ((bfd_size_type) lin.l_addr.l_symndx
4409 obj_coff_external_syms (input_bfd)))
4411 aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0;
4414 bfd_byte *linpend, *linp;
4416 bfd_size_type count;
4418 lin.l_addr.l_symndx = *indexp;
4419 bfd_coff_swap_lineno_out (output_bfd, (PTR) &lin,
4420 (PTR) (finfo->linenos
4423 linpend = (finfo->linenos
4424 + enc_count * linesz);
4425 offset = (o->output_section->vma
4428 for (linp = finfo->linenos + linoff + linesz;
4432 bfd_coff_swap_lineno_in (input_bfd, (PTR) linp,
4434 if (lin.l_lnno == 0)
4436 lin.l_addr.l_paddr += offset;
4437 bfd_coff_swap_lineno_out (output_bfd,
4442 count = (linp - (finfo->linenos + linoff)) / linesz;
4444 aux.x_sym.x_fcnary.x_fcn.x_lnnoptr =
4445 (o->output_section->line_filepos
4446 + o->output_section->lineno_count * linesz);
4448 if (bfd_seek (output_bfd,
4449 aux.x_sym.x_fcnary.x_fcn.x_lnnoptr,
4451 || (bfd_write (finfo->linenos + linoff,
4452 linesz, count, output_bfd)
4456 o->output_section->lineno_count += count;
4460 struct internal_syment *iisp, *iispend;
4464 /* Update any C_BINCL or C_EINCL symbols
4465 that refer to a line number in the
4466 range we just output. */
4467 iisp = finfo->internal_syms;
4469 + obj_raw_syment_count (input_bfd));
4470 iindp = finfo->sym_indices;
4471 oos = finfo->outsyms;
4472 while (iisp < iispend)
4474 if ((iisp->n_sclass == C_BINCL
4475 || iisp->n_sclass == C_EINCL)
4476 && ((bfd_size_type) iisp->n_value
4477 >= enclosing->line_filepos + linoff)
4478 && ((bfd_size_type) iisp->n_value
4479 < (enclosing->line_filepos
4480 + enc_count * linesz)))
4482 struct internal_syment iis;
4484 bfd_coff_swap_sym_in (output_bfd,
4489 - enclosing->line_filepos
4491 + aux.x_sym.x_fcnary.x_fcn.x_lnnoptr);
4492 bfd_coff_swap_sym_out (output_bfd,
4498 iisp += iisp->n_numaux + 1;
4499 iindp += iisp->n_numaux + 1;
4500 oos += (iisp->n_numaux + 1) * osymesz;
4507 bfd_coff_swap_aux_out (output_bfd, (PTR) &aux, isymp->n_type,
4508 isymp->n_sclass, i, isymp->n_numaux,
4520 /* If we swapped out a C_FILE symbol, guess that the next C_FILE
4521 symbol will be the first symbol in the next input file. In the
4522 normal case, this will save us from writing out the C_FILE symbol
4524 if (finfo->last_file_index != -1
4525 && (bfd_size_type) finfo->last_file_index >= syment_base)
4527 finfo->last_file.n_value = output_index;
4528 bfd_coff_swap_sym_out (output_bfd, (PTR) &finfo->last_file,
4529 (PTR) (finfo->outsyms
4530 + ((finfo->last_file_index - syment_base)
4534 /* Write the modified symbols to the output file. */
4535 if (outsym > finfo->outsyms)
4537 if (bfd_seek (output_bfd,
4538 obj_sym_filepos (output_bfd) + syment_base * osymesz,
4540 || (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1,
4542 != (bfd_size_type) (outsym - finfo->outsyms)))
4545 BFD_ASSERT ((obj_raw_syment_count (output_bfd)
4546 + (outsym - finfo->outsyms) / osymesz)
4549 obj_raw_syment_count (output_bfd) = output_index;
4552 /* Don't let the linker relocation routines discard the symbols. */
4553 keep_syms = obj_coff_keep_syms (input_bfd);
4554 obj_coff_keep_syms (input_bfd) = true;
4556 /* Relocate the contents of each section. */
4557 for (o = input_bfd->sections; o != NULL; o = o->next)
4561 if ((o->flags & SEC_HAS_CONTENTS) == 0
4562 || o->_raw_size == 0
4563 || (o->flags & SEC_IN_MEMORY) != 0)
4566 /* We have set filepos correctly for the sections we created to
4567 represent csects, so bfd_get_section_contents should work. */
4568 if (coff_section_data (input_bfd, o) != NULL
4569 && coff_section_data (input_bfd, o)->contents != NULL)
4570 contents = coff_section_data (input_bfd, o)->contents;
4573 if (! bfd_get_section_contents (input_bfd, o, finfo->contents,
4574 (file_ptr) 0, o->_raw_size))
4576 contents = finfo->contents;
4579 if ((o->flags & SEC_RELOC) != 0)
4582 struct internal_reloc *internal_relocs;
4583 struct internal_reloc *irel;
4585 struct internal_reloc *irelend;
4586 struct xcoff_link_hash_entry **rel_hash;
4589 /* Read in the relocs. */
4590 target_index = o->output_section->target_index;
4591 internal_relocs = (xcoff_read_internal_relocs
4592 (input_bfd, o, false, finfo->external_relocs,
4594 (finfo->section_info[target_index].relocs
4595 + o->output_section->reloc_count)));
4596 if (internal_relocs == NULL)
4599 /* Call processor specific code to relocate the section
4601 if (! bfd_coff_relocate_section (output_bfd, finfo->info,
4605 finfo->internal_syms,
4606 xcoff_data (input_bfd)->csects))
4609 offset = o->output_section->vma + o->output_offset - o->vma;
4610 irel = internal_relocs;
4611 irelend = irel + o->reloc_count;
4612 rel_hash = (finfo->section_info[target_index].rel_hashes
4613 + o->output_section->reloc_count);
4614 for (; irel < irelend; irel++, rel_hash++)
4616 struct xcoff_link_hash_entry *h = NULL;
4617 struct internal_ldrel ldrel;
4621 /* Adjust the reloc address and symbol index. */
4623 irel->r_vaddr += offset;
4625 r_symndx = irel->r_symndx;
4629 h = obj_xcoff_sym_hashes (input_bfd)[r_symndx];
4631 && (irel->r_type == R_TOC
4632 || irel->r_type == R_GL
4633 || irel->r_type == R_TCL
4634 || irel->r_type == R_TRL
4635 || irel->r_type == R_TRLA))
4637 /* This is a TOC relative reloc with a symbol
4638 attached. The symbol should be the one which
4639 this reloc is for. We want to make this
4640 reloc against the TOC address of the symbol,
4641 not the symbol itself. */
4642 BFD_ASSERT (h->toc_section != NULL);
4643 BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0);
4644 if (h->u.toc_indx != -1)
4645 irel->r_symndx = h->u.toc_indx;
4648 struct xcoff_toc_rel_hash *n;
4649 struct xcoff_link_section_info *si;
4651 n = ((struct xcoff_toc_rel_hash *)
4652 bfd_alloc (finfo->output_bfd,
4653 sizeof (struct xcoff_toc_rel_hash)));
4656 si = finfo->section_info + target_index;
4657 n->next = si->toc_rel_hashes;
4660 si->toc_rel_hashes = n;
4665 /* This is a global symbol. */
4667 irel->r_symndx = h->indx;
4670 /* This symbol is being written at the end
4671 of the file, and we do not yet know the
4672 symbol index. We save the pointer to the
4673 hash table entry in the rel_hash list.
4674 We set the indx field to -2 to indicate
4675 that this symbol must not be stripped. */
4684 indx = finfo->sym_indices[r_symndx];
4688 struct internal_syment *is;
4690 /* Relocations against a TC0 TOC anchor are
4691 automatically transformed to be against
4692 the TOC anchor in the output file. */
4693 is = finfo->internal_syms + r_symndx;
4694 if (is->n_sclass == C_HIDEXT
4695 && is->n_numaux > 0)
4698 union internal_auxent aux;
4702 obj_coff_external_syms (input_bfd))
4703 + ((r_symndx + is->n_numaux)
4705 bfd_coff_swap_aux_in (input_bfd, auxptr,
4706 is->n_type, is->n_sclass,
4710 if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_SD
4711 && aux.x_csect.x_smclas == XMC_TC0)
4712 indx = finfo->toc_symindx;
4717 irel->r_symndx = indx;
4720 struct internal_syment *is;
4722 char buf[SYMNMLEN + 1];
4724 /* This reloc is against a symbol we are
4725 stripping. It would be possible to handle
4726 this case, but I don't think it's worth it. */
4727 is = finfo->internal_syms + r_symndx;
4729 name = (_bfd_coff_internal_syment_name
4730 (input_bfd, is, buf));
4734 if (! ((*finfo->info->callbacks->unattached_reloc)
4735 (finfo->info, name, input_bfd, o,
4742 switch (irel->r_type)
4746 || h->root.type == bfd_link_hash_defined
4747 || h->root.type == bfd_link_hash_defweak
4748 || h->root.type == bfd_link_hash_common)
4755 /* This reloc needs to be copied into the .loader
4757 ldrel.l_vaddr = irel->r_vaddr;
4759 ldrel.l_symndx = -1;
4761 || (h->root.type == bfd_link_hash_defined
4762 || h->root.type == bfd_link_hash_defweak
4763 || h->root.type == bfd_link_hash_common))
4768 sec = xcoff_data (input_bfd)->csects[r_symndx];
4769 else if (h->root.type == bfd_link_hash_common)
4770 sec = h->root.u.c.p->section;
4772 sec = h->root.u.def.section;
4773 sec = sec->output_section;
4775 if (strcmp (sec->name, ".text") == 0)
4777 else if (strcmp (sec->name, ".data") == 0)
4779 else if (strcmp (sec->name, ".bss") == 0)
4783 (*_bfd_error_handler)
4784 ("%s: loader reloc in unrecognized section `%s'",
4785 bfd_get_filename (input_bfd),
4787 bfd_set_error (bfd_error_nonrepresentable_section);
4795 (*_bfd_error_handler)
4796 ("%s: `%s' in loader reloc but not loader sym",
4797 bfd_get_filename (input_bfd),
4798 h->root.root.string);
4799 bfd_set_error (bfd_error_bad_value);
4802 ldrel.l_symndx = h->ldindx;
4804 ldrel.l_rtype = (irel->r_size << 8) | irel->r_type;
4805 ldrel.l_rsecnm = o->output_section->target_index;
4806 if (xcoff_hash_table (finfo->info)->textro
4807 && strcmp (o->output_section->name, ".text") == 0)
4809 (*_bfd_error_handler)
4810 ("%s: loader reloc in read-only section %s",
4811 bfd_get_filename (input_bfd),
4812 bfd_get_section_name (finfo->output_bfd,
4813 o->output_section));
4814 bfd_set_error (bfd_error_invalid_operation);
4817 xcoff_swap_ldrel_out (output_bfd, &ldrel,
4819 BFD_ASSERT (sizeof (struct external_ldrel) == LDRELSZ);
4828 /* We should never need a .loader reloc for a TOC
4834 o->output_section->reloc_count += o->reloc_count;
4837 /* Write out the modified section contents. */
4838 if (! bfd_set_section_contents (output_bfd, o->output_section,
4839 contents, o->output_offset,
4840 (o->_cooked_size != 0
4846 obj_coff_keep_syms (input_bfd) = keep_syms;
4848 if (! finfo->info->keep_memory)
4850 if (! _bfd_coff_free_symbols (input_bfd))
4860 /* Write out a non-XCOFF global symbol. */
4863 xcoff_write_global_symbol (h, p)
4864 struct xcoff_link_hash_entry *h;
4867 struct xcoff_final_link_info *finfo = (struct xcoff_final_link_info *) p;
4870 struct internal_syment isym;
4871 union internal_auxent aux;
4873 output_bfd = finfo->output_bfd;
4875 /* If this symbol was garbage collected, just skip it. */
4876 if (xcoff_hash_table (finfo->info)->gc
4877 && (h->flags & XCOFF_MARK) == 0)
4880 /* If we need a .loader section entry, write it out. */
4881 if (h->ldsym != NULL)
4883 struct internal_ldsym *ldsym;
4888 if (h->root.type == bfd_link_hash_undefined
4889 || h->root.type == bfd_link_hash_undefweak)
4892 ldsym->l_scnum = N_UNDEF;
4893 ldsym->l_smtype = XTY_ER;
4894 impbfd = h->root.u.undef.abfd;
4896 else if (h->root.type == bfd_link_hash_defined
4897 || h->root.type == bfd_link_hash_defweak)
4901 sec = h->root.u.def.section;
4902 ldsym->l_value = (sec->output_section->vma
4903 + sec->output_offset
4904 + h->root.u.def.value);
4905 ldsym->l_scnum = sec->output_section->target_index;
4906 ldsym->l_smtype = XTY_SD;
4907 impbfd = sec->owner;
4912 if (((h->flags & XCOFF_DEF_REGULAR) == 0
4913 && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
4914 || (h->flags & XCOFF_IMPORT) != 0)
4915 ldsym->l_smtype |= L_IMPORT;
4916 if (((h->flags & XCOFF_DEF_REGULAR) != 0
4917 && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
4918 || (h->flags & XCOFF_EXPORT) != 0)
4919 ldsym->l_smtype |= L_EXPORT;
4920 if ((h->flags & XCOFF_ENTRY) != 0)
4921 ldsym->l_smtype |= L_ENTRY;
4923 ldsym->l_smclas = h->smclas;
4925 if (ldsym->l_ifile == (bfd_size_type) -1)
4927 else if (ldsym->l_ifile == 0)
4929 if ((ldsym->l_smtype & L_IMPORT) == 0)
4931 else if (impbfd == NULL)
4935 BFD_ASSERT (impbfd->xvec == output_bfd->xvec);
4936 ldsym->l_ifile = xcoff_data (impbfd)->import_file_id;
4942 BFD_ASSERT (h->ldindx >= 0);
4943 BFD_ASSERT (LDSYMSZ == sizeof (struct external_ldsym));
4944 xcoff_swap_ldsym_out (output_bfd, ldsym, finfo->ldsym + h->ldindx - 3);
4948 /* If this symbol needs global linkage code, write it out. */
4949 if (h->root.type == bfd_link_hash_defined
4950 && (h->root.u.def.section
4951 == xcoff_hash_table (finfo->info)->linkage_section))
4957 p = h->root.u.def.section->contents + h->root.u.def.value;
4959 /* The first instruction in the global linkage code loads a
4960 specific TOC element. */
4961 tocoff = (h->descriptor->toc_section->output_section->vma
4962 + h->descriptor->toc_section->output_offset
4963 - xcoff_data (output_bfd)->toc);
4964 if ((h->descriptor->flags & XCOFF_SET_TOC) != 0)
4965 tocoff += h->descriptor->u.toc_offset;
4966 bfd_put_32 (output_bfd, XCOFF_GLINK_FIRST | (tocoff & 0xffff), p);
4968 i < sizeof xcoff_glink_code / sizeof xcoff_glink_code[0];
4970 bfd_put_32 (output_bfd, xcoff_glink_code[i], p);
4973 /* If we created a TOC entry for this symbol, write out the required
4975 if ((h->flags & XCOFF_SET_TOC) != 0)
4980 struct internal_reloc *irel;
4981 struct internal_ldrel ldrel;
4983 tocsec = h->toc_section;
4984 osec = tocsec->output_section;
4985 oindx = osec->target_index;
4986 irel = finfo->section_info[oindx].relocs + osec->reloc_count;
4987 irel->r_vaddr = (osec->vma
4988 + tocsec->output_offset
4991 irel->r_symndx = h->indx;
4995 irel->r_symndx = obj_raw_syment_count (output_bfd);
4997 irel->r_type = R_POS;
4999 finfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
5000 ++osec->reloc_count;
5002 BFD_ASSERT (h->ldindx >= 0);
5003 ldrel.l_vaddr = irel->r_vaddr;
5004 ldrel.l_symndx = h->ldindx;
5005 ldrel.l_rtype = (31 << 8) | R_POS;
5006 ldrel.l_rsecnm = oindx;
5007 xcoff_swap_ldrel_out (output_bfd, &ldrel, finfo->ldrel);
5011 /* If this symbol is a specially defined function descriptor, write
5012 it out. The first word is the address of the function code
5013 itself, the second word is the address of the TOC, and the third
5015 if ((h->flags & XCOFF_DESCRIPTOR) != 0
5016 && h->root.type == bfd_link_hash_defined
5017 && (h->root.u.def.section
5018 == xcoff_hash_table (finfo->info)->descriptor_section))
5024 struct xcoff_link_hash_entry *hentry;
5026 struct internal_reloc *irel;
5027 struct internal_ldrel ldrel;
5030 sec = h->root.u.def.section;
5031 osec = sec->output_section;
5032 oindx = osec->target_index;
5033 p = sec->contents + h->root.u.def.value;
5035 hentry = h->descriptor;
5036 BFD_ASSERT (hentry != NULL
5037 && (hentry->root.type == bfd_link_hash_defined
5038 || hentry->root.type == bfd_link_hash_defweak));
5039 esec = hentry->root.u.def.section;
5040 bfd_put_32 (output_bfd,
5041 (esec->output_section->vma
5042 + esec->output_offset
5043 + hentry->root.u.def.value),
5046 irel = finfo->section_info[oindx].relocs + osec->reloc_count;
5047 irel->r_vaddr = (osec->vma
5048 + sec->output_offset
5049 + h->root.u.def.value);
5050 irel->r_symndx = esec->output_section->target_index;
5051 irel->r_type = R_POS;
5053 finfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
5054 ++osec->reloc_count;
5056 ldrel.l_vaddr = irel->r_vaddr;
5057 if (strcmp (esec->output_section->name, ".text") == 0)
5059 else if (strcmp (esec->output_section->name, ".data") == 0)
5061 else if (strcmp (esec->output_section->name, ".bss") == 0)
5065 (*_bfd_error_handler)
5066 ("%s: loader reloc in unrecognized section `%s'",
5067 bfd_get_filename (output_bfd),
5068 esec->output_section->name);
5069 bfd_set_error (bfd_error_nonrepresentable_section);
5072 ldrel.l_rtype = (31 << 8) | R_POS;
5073 ldrel.l_rsecnm = oindx;
5074 xcoff_swap_ldrel_out (output_bfd, &ldrel, finfo->ldrel);
5077 bfd_put_32 (output_bfd, xcoff_data (output_bfd)->toc, p + 4);
5079 tsec = xcoff_data (output_bfd)->toc_section;
5082 irel->r_vaddr = (osec->vma
5083 + sec->output_offset
5084 + h->root.u.def.value
5086 irel->r_symndx = tsec->output_section->target_index;
5087 irel->r_type = R_POS;
5089 finfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
5090 ++osec->reloc_count;
5092 ldrel.l_vaddr = irel->r_vaddr;
5093 if (strcmp (tsec->output_section->name, ".text") == 0)
5095 else if (strcmp (tsec->output_section->name, ".data") == 0)
5097 else if (strcmp (tsec->output_section->name, ".bss") == 0)
5101 (*_bfd_error_handler)
5102 ("%s: loader reloc in unrecognized section `%s'",
5103 bfd_get_filename (output_bfd),
5104 tsec->output_section->name);
5105 bfd_set_error (bfd_error_nonrepresentable_section);
5108 ldrel.l_rtype = (31 << 8) | R_POS;
5109 ldrel.l_rsecnm = oindx;
5110 xcoff_swap_ldrel_out (output_bfd, &ldrel, finfo->ldrel);
5118 && (finfo->info->strip == strip_all
5119 || (finfo->info->strip == strip_some
5120 && (bfd_hash_lookup (finfo->info->keep_hash,
5121 h->root.root.string, false, false)
5126 && (h->flags & (XCOFF_REF_REGULAR | XCOFF_DEF_REGULAR)) == 0)
5129 outsym = finfo->outsyms;
5131 memset (&aux, 0, sizeof aux);
5133 h->indx = obj_raw_syment_count (output_bfd);
5135 if (strlen (h->root.root.string) <= SYMNMLEN)
5136 strncpy (isym._n._n_name, h->root.root.string, SYMNMLEN);
5143 if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
5145 indx = _bfd_stringtab_add (finfo->strtab, h->root.root.string, hash,
5147 if (indx == (bfd_size_type) -1)
5149 isym._n._n_n._n_zeroes = 0;
5150 isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
5153 if (h->root.type == bfd_link_hash_undefined
5154 || h->root.type == bfd_link_hash_undefweak)
5157 isym.n_scnum = N_UNDEF;
5158 isym.n_sclass = C_EXT;
5159 aux.x_csect.x_smtyp = XTY_ER;
5161 else if (h->root.type == bfd_link_hash_defined
5162 || h->root.type == bfd_link_hash_defweak)
5164 struct xcoff_link_size_list *l;
5166 isym.n_value = (h->root.u.def.section->output_section->vma
5167 + h->root.u.def.section->output_offset
5168 + h->root.u.def.value);
5169 isym.n_scnum = h->root.u.def.section->output_section->target_index;
5170 isym.n_sclass = C_HIDEXT;
5171 aux.x_csect.x_smtyp = XTY_SD;
5173 if ((h->flags & XCOFF_HAS_SIZE) != 0)
5175 for (l = xcoff_hash_table (finfo->info)->size_list;
5181 aux.x_csect.x_scnlen.l = l->size;
5187 else if (h->root.type == bfd_link_hash_common)
5189 isym.n_value = (h->root.u.c.p->section->output_section->vma
5190 + h->root.u.c.p->section->output_offset);
5191 isym.n_scnum = h->root.u.c.p->section->output_section->target_index;
5192 isym.n_sclass = C_EXT;
5193 aux.x_csect.x_smtyp = XTY_CM;
5194 aux.x_csect.x_scnlen.l = h->root.u.c.size;
5199 isym.n_type = T_NULL;
5202 bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym);
5203 outsym += bfd_coff_symesz (output_bfd);
5205 aux.x_csect.x_smclas = h->smclas;
5207 bfd_coff_swap_aux_out (output_bfd, (PTR) &aux, T_NULL, isym.n_sclass, 0, 1,
5209 outsym += bfd_coff_auxesz (output_bfd);
5211 if (h->root.type == bfd_link_hash_defined
5212 || h->root.type == bfd_link_hash_defweak)
5214 /* We just output an SD symbol. Now output an LD symbol. */
5218 isym.n_sclass = C_EXT;
5219 bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym);
5220 outsym += bfd_coff_symesz (output_bfd);
5222 aux.x_csect.x_smtyp = XTY_LD;
5223 aux.x_csect.x_scnlen.l = obj_raw_syment_count (output_bfd);
5225 bfd_coff_swap_aux_out (output_bfd, (PTR) &aux, T_NULL, C_EXT, 0, 1,
5227 outsym += bfd_coff_auxesz (output_bfd);
5230 if (bfd_seek (output_bfd,
5231 (obj_sym_filepos (output_bfd)
5232 + (obj_raw_syment_count (output_bfd)
5233 * bfd_coff_symesz (output_bfd))),
5235 || (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1, output_bfd)
5236 != (bfd_size_type) (outsym - finfo->outsyms)))
5238 obj_raw_syment_count (output_bfd) +=
5239 (outsym - finfo->outsyms) / bfd_coff_symesz (output_bfd);
5244 /* Handle a link order which is supposed to generate a reloc. */
5247 xcoff_reloc_link_order (output_bfd, finfo, output_section, link_order)
5249 struct xcoff_final_link_info *finfo;
5250 asection *output_section;
5251 struct bfd_link_order *link_order;
5253 reloc_howto_type *howto;
5254 struct xcoff_link_hash_entry *h;
5258 struct internal_reloc *irel;
5259 struct xcoff_link_hash_entry **rel_hash_ptr;
5260 struct internal_ldrel ldrel;
5262 if (link_order->type == bfd_section_reloc_link_order)
5264 /* We need to somehow locate a symbol in the right section. The
5265 symbol must either have a value of zero, or we must adjust
5266 the addend by the value of the symbol. FIXME: Write this
5267 when we need it. The old linker couldn't handle this anyhow. */
5271 howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
5274 bfd_set_error (bfd_error_bad_value);
5278 h = xcoff_link_hash_lookup (xcoff_hash_table (finfo->info),
5279 link_order->u.reloc.p->u.name,
5280 false, false, true);
5283 if (! ((*finfo->info->callbacks->unattached_reloc)
5284 (finfo->info, link_order->u.reloc.p->u.name, (bfd *) NULL,
5285 (asection *) NULL, (bfd_vma) 0)))
5290 if (h->root.type == bfd_link_hash_common)
5292 hsec = h->root.u.c.p->section;
5295 else if (h->root.type == bfd_link_hash_defined
5296 || h->root.type == bfd_link_hash_defweak)
5298 hsec = h->root.u.def.section;
5299 hval = h->root.u.def.value;
5307 addend = link_order->u.reloc.p->addend;
5309 addend += (hsec->output_section->vma
5310 + hsec->output_offset
5317 bfd_reloc_status_type rstat;
5320 size = bfd_get_reloc_size (howto);
5321 buf = (bfd_byte *) bfd_zmalloc (size);
5325 rstat = _bfd_relocate_contents (howto, output_bfd, addend, buf);
5331 case bfd_reloc_outofrange:
5333 case bfd_reloc_overflow:
5334 if (! ((*finfo->info->callbacks->reloc_overflow)
5335 (finfo->info, link_order->u.reloc.p->u.name,
5336 howto->name, addend, (bfd *) NULL, (asection *) NULL,
5344 ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf,
5345 (file_ptr) link_order->offset, size);
5351 /* Store the reloc information in the right place. It will get
5352 swapped and written out at the end of the final_link routine. */
5354 irel = (finfo->section_info[output_section->target_index].relocs
5355 + output_section->reloc_count);
5356 rel_hash_ptr = (finfo->section_info[output_section->target_index].rel_hashes
5357 + output_section->reloc_count);
5359 memset (irel, 0, sizeof (struct internal_reloc));
5360 *rel_hash_ptr = NULL;
5362 irel->r_vaddr = output_section->vma + link_order->offset;
5365 irel->r_symndx = h->indx;
5368 /* Set the index to -2 to force this symbol to get written out. */
5374 irel->r_type = howto->type;
5375 irel->r_size = howto->bitsize - 1;
5376 if (howto->complain_on_overflow == complain_overflow_signed)
5377 irel->r_size |= 0x80;
5379 ++output_section->reloc_count;
5381 /* Now output the reloc to the .loader section. */
5383 ldrel.l_vaddr = irel->r_vaddr;
5387 const char *secname;
5389 secname = hsec->output_section->name;
5391 if (strcmp (secname, ".text") == 0)
5393 else if (strcmp (secname, ".data") == 0)
5395 else if (strcmp (secname, ".bss") == 0)
5399 (*_bfd_error_handler)
5400 ("%s: loader reloc in unrecognized section `%s'",
5401 bfd_get_filename (output_bfd), secname);
5402 bfd_set_error (bfd_error_nonrepresentable_section);
5410 (*_bfd_error_handler)
5411 ("%s: `%s' in loader reloc but not loader sym",
5412 bfd_get_filename (output_bfd),
5413 h->root.root.string);
5414 bfd_set_error (bfd_error_bad_value);
5417 ldrel.l_symndx = h->ldindx;
5420 ldrel.l_rtype = (irel->r_size << 8) | irel->r_type;
5421 ldrel.l_rsecnm = output_section->target_index;
5422 xcoff_swap_ldrel_out (output_bfd, &ldrel, finfo->ldrel);
5428 /* Sort relocs by VMA. This is called via qsort. */
5431 xcoff_sort_relocs (p1, p2)
5435 const struct internal_reloc *r1 = (const struct internal_reloc *) p1;
5436 const struct internal_reloc *r2 = (const struct internal_reloc *) p2;
5438 if (r1->r_vaddr > r2->r_vaddr)
5440 else if (r1->r_vaddr < r2->r_vaddr)
5446 /* This is the relocation function for the RS/6000/POWER/PowerPC.
5447 This is currently the only processor which uses XCOFF; I hope that
5448 will never change. */
5451 _bfd_ppc_xcoff_relocate_section (output_bfd, info, input_bfd,
5452 input_section, contents, relocs, syms,
5455 struct bfd_link_info *info;
5457 asection *input_section;
5459 struct internal_reloc *relocs;
5460 struct internal_syment *syms;
5461 asection **sections;
5463 struct internal_reloc *rel;
5464 struct internal_reloc *relend;
5467 relend = rel + input_section->reloc_count;
5468 for (; rel < relend; rel++)
5471 struct xcoff_link_hash_entry *h;
5472 struct internal_syment *sym;
5475 struct reloc_howto_struct howto;
5476 bfd_reloc_status_type rstat;
5478 /* Relocation type R_REF is a special relocation type which is
5479 merely used to prevent garbage collection from occurring for
5480 the csect including the symbol which it references. */
5481 if (rel->r_type == R_REF)
5484 symndx = rel->r_symndx;
5494 h = obj_xcoff_sym_hashes (input_bfd)[symndx];
5495 sym = syms + symndx;
5496 addend = - sym->n_value;
5499 /* We build the howto information on the fly. */
5501 howto.type = rel->r_type;
5502 howto.rightshift = 0;
5504 howto.bitsize = (rel->r_size & 0x1f) + 1;
5505 howto.pc_relative = false;
5507 if ((rel->r_size & 0x80) != 0)
5508 howto.complain_on_overflow = complain_overflow_signed;
5510 howto.complain_on_overflow = complain_overflow_bitfield;
5511 howto.special_function = NULL;
5512 howto.name = "internal";
5513 howto.partial_inplace = true;
5514 if (howto.bitsize == 32)
5515 howto.src_mask = howto.dst_mask = 0xffffffff;
5518 howto.src_mask = howto.dst_mask = (1 << howto.bitsize) - 1;
5519 if (howto.bitsize == 16)
5522 howto.pcrel_offset = false;
5532 sec = bfd_abs_section_ptr;
5537 sec = sections[symndx];
5538 /* Hack to make sure we use the right TOC anchor value
5539 if this reloc is against the TOC anchor. */
5540 if (sec->name[3] == '0'
5541 && strcmp (sec->name, ".tc0") == 0)
5542 val = xcoff_data (output_bfd)->toc;
5544 val = (sec->output_section->vma
5545 + sec->output_offset
5552 if (h->root.type == bfd_link_hash_defined
5553 || h->root.type == bfd_link_hash_defweak)
5557 sec = h->root.u.def.section;
5558 val = (h->root.u.def.value
5559 + sec->output_section->vma
5560 + sec->output_offset);
5562 else if (h->root.type == bfd_link_hash_common)
5566 sec = h->root.u.c.p->section;
5567 val = (sec->output_section->vma
5568 + sec->output_offset);
5570 else if ((h->flags & XCOFF_DEF_DYNAMIC) != 0
5571 || (h->flags & XCOFF_IMPORT) != 0)
5573 /* Every symbol in a shared object is defined somewhere. */
5576 else if (! info->relocateable
5579 if (! ((*info->callbacks->undefined_symbol)
5580 (info, h->root.root.string, input_bfd, input_section,
5581 rel->r_vaddr - input_section->vma)))
5586 /* I took the relocation type definitions from two documents:
5587 the PowerPC AIX Version 4 Application Binary Interface, First
5588 Edition (April 1992), and the PowerOpen ABI, Big-Endian
5589 32-Bit Hardware Implementation (June 30, 1994). Differences
5590 between the documents are noted below. */
5592 switch (rel->r_type)
5597 /* These relocs are defined by the PowerPC ABI to be
5598 relative branches which use half of the difference
5599 between the symbol and the program counter. I can't
5600 quite figure out when this is useful. These relocs are
5601 not defined by the PowerOpen ABI. */
5603 (*_bfd_error_handler)
5604 ("%s: unsupported relocation type 0x%02x",
5605 bfd_get_filename (input_bfd), (unsigned int) rel->r_type);
5606 bfd_set_error (bfd_error_bad_value);
5609 /* Simple positive relocation. */
5612 /* Simple negative relocation. */
5616 /* Simple PC relative relocation. */
5617 howto.pc_relative = true;
5620 /* TOC relative relocation. The value in the instruction in
5621 the input file is the offset from the input file TOC to
5622 the desired location. We want the offset from the final
5623 TOC to the desired location. We have:
5628 so we must change insn by on - in.
5631 /* Global linkage relocation. The value of this relocation
5632 is the address of the entry in the TOC section. */
5634 /* Local object TOC address. I can't figure out the
5635 difference between this and case R_GL. */
5637 /* TOC relative relocation. A TOC relative load instruction
5638 which may be changed to a load address instruction.
5639 FIXME: We don't currently implement this optimization. */
5641 /* TOC relative relocation. This is a TOC relative load
5642 address instruction which may be changed to a load
5643 instruction. FIXME: I don't know if this is the correct
5645 if (h != NULL && h->toc_section == NULL)
5647 (*_bfd_error_handler)
5648 ("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry",
5649 bfd_get_filename (input_bfd), rel->r_vaddr,
5650 h->root.root.string);
5651 bfd_set_error (bfd_error_bad_value);
5656 BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0);
5657 val = (h->toc_section->output_section->vma
5658 + h->toc_section->output_offset);
5660 val = ((val - xcoff_data (output_bfd)->toc)
5661 - (sym->n_value - xcoff_data (input_bfd)->toc));
5665 /* Absolute branch. We don't want to mess with the lower
5666 two bits of the instruction. */
5668 /* The PowerPC ABI defines this as an absolute call which
5669 may be modified to become a relative call. The PowerOpen
5670 ABI does not define this relocation type. */
5672 /* Absolute branch which may be modified to become a
5675 /* The PowerPC ABI defines this as an absolute branch to a
5676 fixed address which may be modified to an absolute branch
5677 to a symbol. The PowerOpen ABI does not define this
5680 /* The PowerPC ABI defines this as an absolute branch to a
5681 fixed address which may be modified to a relative branch.
5682 The PowerOpen ABI does not define this relocation type. */
5683 howto.src_mask &= ~3;
5684 howto.dst_mask = howto.src_mask;
5687 /* Relative branch. We don't want to mess with the lower
5688 two bits of the instruction. */
5690 /* The PowerPC ABI defines this as a relative call which may
5691 be modified to become an absolute call. The PowerOpen
5692 ABI does not define this relocation type. */
5694 /* A relative branch which may be modified to become an
5695 absolute branch. FIXME: We don't implement this,
5696 although we should for symbols of storage mapping class
5698 howto.pc_relative = true;
5699 howto.src_mask &= ~3;
5700 howto.dst_mask = howto.src_mask;
5703 /* The PowerPC AIX ABI describes this as a load which may be
5704 changed to a load address. The PowerOpen ABI says this
5705 is the same as case R_POS. */
5708 /* The PowerPC AIX ABI describes this as a load address
5709 which may be changed to a load. The PowerOpen ABI says
5710 this is the same as R_POS. */
5714 /* If we see an R_BR or R_RBR reloc which is jumping to global
5715 linkage code, and it is followed by an appropriate cror nop
5716 instruction, we replace the cror with lwz r2,20(r1). This
5717 restores the TOC after the glink code. Contrariwise, if the
5718 call is followed by a lwz r2,20(r1), but the call is not
5719 going to global linkage code, we can replace the load with a
5721 if ((rel->r_type == R_BR || rel->r_type == R_RBR)
5723 && h->root.type == bfd_link_hash_defined
5724 && (rel->r_vaddr - input_section->vma + 8
5725 <= input_section->_cooked_size))
5730 pnext = contents + (rel->r_vaddr - input_section->vma) + 4;
5731 next = bfd_get_32 (input_bfd, pnext);
5732 if (h->smclas == XMC_GL)
5734 if (next == 0x4def7b82 /* cror 15,15,15 */
5735 || next == 0x4ffffb82) /* cror 31,31,31 */
5736 bfd_put_32 (input_bfd, 0x80410014, pnext); /* lwz r1,20(r1) */
5740 if (next == 0x80410014) /* lwz r1,20(r1) */
5741 bfd_put_32 (input_bfd, 0x4ffffb82, pnext); /* cror 31,31,31 */
5745 /* A PC relative reloc includes the section address. */
5746 if (howto.pc_relative)
5747 addend += input_section->vma;
5749 rstat = _bfd_final_link_relocate (&howto, input_bfd, input_section,
5751 rel->r_vaddr - input_section->vma,
5760 case bfd_reloc_overflow:
5763 char buf[SYMNMLEN + 1];
5764 char howto_name[10];
5769 name = h->root.root.string;
5772 name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
5776 sprintf (howto_name, "0x%02x", rel->r_type);
5778 if (! ((*info->callbacks->reloc_overflow)
5779 (info, name, howto_name, (bfd_vma) 0, input_bfd,
5780 input_section, rel->r_vaddr - input_section->vma)))