fix record "run" regression
[external/binutils.git] / bfd / xcofflink.c
1 /* POWER/PowerPC XCOFF linker support.
2    Copyright (C) 1995-2014 Free Software Foundation, Inc.
3    Written by Ian Lance Taylor <ian@cygnus.com>, Cygnus Support.
4
5    This file is part of BFD, the Binary File Descriptor library.
6
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 3 of the License, or
10    (at your option) any later version.
11
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.
16
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., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "bfdlink.h"
25 #include "libbfd.h"
26 #include "coff/internal.h"
27 #include "coff/xcoff.h"
28 #include "libcoff.h"
29 #include "libxcoff.h"
30 #include "libiberty.h"
31
32 /* This file holds the XCOFF linker code.  */
33
34 #undef  STRING_SIZE_SIZE
35 #define STRING_SIZE_SIZE 4
36
37 /* We reuse the SEC_ROM flag as a mark flag for garbage collection.
38    This flag will only be used on input sections.  */
39
40 #define SEC_MARK (SEC_ROM)
41
42 /* The list of import files.  */
43
44 struct xcoff_import_file
45 {
46   /* The next entry in the list.  */
47   struct xcoff_import_file *next;
48   /* The path.  */
49   const char *path;
50   /* The file name.  */
51   const char *file;
52   /* The member name.  */
53   const char *member;
54 };
55
56 /* Information we keep for each section in the output file during the
57    final link phase.  */
58
59 struct xcoff_link_section_info
60 {
61   /* The relocs to be output.  */
62   struct internal_reloc *relocs;
63   /* For each reloc against a global symbol whose index was not known
64      when the reloc was handled, the global hash table entry.  */
65   struct xcoff_link_hash_entry **rel_hashes;
66   /* If there is a TOC relative reloc against a global symbol, and the
67      index of the TOC symbol is not known when the reloc was handled,
68      an entry is added to this linked list.  This is not an array,
69      like rel_hashes, because this case is quite uncommon.  */
70   struct xcoff_toc_rel_hash
71   {
72     struct xcoff_toc_rel_hash *next;
73     struct xcoff_link_hash_entry *h;
74     struct internal_reloc *rel;
75   } *toc_rel_hashes;
76 };
77
78 /* Information that the XCOFF linker collects about an archive.  */
79 struct xcoff_archive_info
80 {
81   /* The archive described by this entry.  */
82   bfd *archive;
83
84   /* The import path and import filename to use when referring to
85      this archive in the .loader section.  */
86   const char *imppath;
87   const char *impfile;
88
89   /* True if the archive contains a dynamic object.  */
90   unsigned int contains_shared_object_p : 1;
91
92   /* True if the previous field is valid.  */
93   unsigned int know_contains_shared_object_p : 1;
94 };
95
96 struct xcoff_link_hash_table
97 {
98   struct bfd_link_hash_table root;
99
100   /* The .debug string hash table.  We need to compute this while
101      reading the input files, so that we know how large the .debug
102      section will be before we assign section positions.  */
103   struct bfd_strtab_hash *debug_strtab;
104
105   /* The .debug section we will use for the final output.  */
106   asection *debug_section;
107
108   /* The .loader section we will use for the final output.  */
109   asection *loader_section;
110
111   /* A count of non TOC relative relocs which will need to be
112      allocated in the .loader section.  */
113   size_t ldrel_count;
114
115   /* The .loader section header.  */
116   struct internal_ldhdr ldhdr;
117
118   /* The .gl section we use to hold global linkage code.  */
119   asection *linkage_section;
120
121   /* The .tc section we use to hold toc entries we build for global
122      linkage code.  */
123   asection *toc_section;
124
125   /* The .ds section we use to hold function descriptors which we
126      create for exported symbols.  */
127   asection *descriptor_section;
128
129   /* The list of import files.  */
130   struct xcoff_import_file *imports;
131
132   /* Required alignment of sections within the output file.  */
133   unsigned long file_align;
134
135   /* Whether the .text section must be read-only.  */
136   bfd_boolean textro;
137
138   /* Whether -brtl was specified.  */
139   bfd_boolean rtld;
140
141   /* Whether garbage collection was done.  */
142   bfd_boolean gc;
143
144   /* A linked list of symbols for which we have size information.  */
145   struct xcoff_link_size_list
146   {
147     struct xcoff_link_size_list *next;
148     struct xcoff_link_hash_entry *h;
149     bfd_size_type size;
150   }
151   *size_list;
152
153   /* Information about archives.  */
154   htab_t archive_info;
155
156   /* Magic sections: _text, _etext, _data, _edata, _end, end. */
157   asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
158 };
159
160 /* Information that we pass around while doing the final link step.  */
161
162 struct xcoff_final_link_info
163 {
164   /* General link information.  */
165   struct bfd_link_info *info;
166   /* Output BFD.  */
167   bfd *output_bfd;
168   /* Hash table for long symbol names.  */
169   struct bfd_strtab_hash *strtab;
170   /* Array of information kept for each output section, indexed by the
171      target_index field.  */
172   struct xcoff_link_section_info *section_info;
173   /* Symbol index of last C_FILE symbol (-1 if none).  */
174   long last_file_index;
175   /* Contents of last C_FILE symbol.  */
176   struct internal_syment last_file;
177   /* Symbol index of TOC symbol.  */
178   long toc_symindx;
179   /* Start of .loader symbols.  */
180   bfd_byte *ldsym;
181   /* Next .loader reloc to swap out.  */
182   bfd_byte *ldrel;
183   /* File position of start of line numbers.  */
184   file_ptr line_filepos;
185   /* Buffer large enough to hold swapped symbols of any input file.  */
186   struct internal_syment *internal_syms;
187   /* Buffer large enough to hold output indices of symbols of any
188      input file.  */
189   long *sym_indices;
190   /* Buffer large enough to hold output symbols for any input file.  */
191   bfd_byte *outsyms;
192   /* Buffer large enough to hold external line numbers for any input
193      section.  */
194   bfd_byte *linenos;
195   /* Buffer large enough to hold any input section.  */
196   bfd_byte *contents;
197   /* Buffer large enough to hold external relocs of any input section.  */
198   bfd_byte *external_relocs;
199 };
200
201 static bfd_boolean xcoff_mark (struct bfd_link_info *, asection *);
202
203 \f
204
205 /* Routines to read XCOFF dynamic information.  This don't really
206    belong here, but we already have the ldsym manipulation routines
207    here.  */
208
209 /* Read the contents of a section.  */
210
211 static bfd_boolean
212 xcoff_get_section_contents (bfd *abfd, asection *sec)
213 {
214   if (coff_section_data (abfd, sec) == NULL)
215     {
216       bfd_size_type amt = sizeof (struct coff_section_tdata);
217
218       sec->used_by_bfd = bfd_zalloc (abfd, amt);
219       if (sec->used_by_bfd == NULL)
220         return FALSE;
221     }
222
223   if (coff_section_data (abfd, sec)->contents == NULL)
224     {
225       bfd_byte *contents;
226
227       if (! bfd_malloc_and_get_section (abfd, sec, &contents))
228         {
229           if (contents != NULL)
230             free (contents);
231           return FALSE;
232         }
233       coff_section_data (abfd, sec)->contents = contents;
234     }
235
236   return TRUE;
237 }
238
239 /* Get the size required to hold the dynamic symbols.  */
240
241 long
242 _bfd_xcoff_get_dynamic_symtab_upper_bound (bfd *abfd)
243 {
244   asection *lsec;
245   bfd_byte *contents;
246   struct internal_ldhdr ldhdr;
247
248   if ((abfd->flags & DYNAMIC) == 0)
249     {
250       bfd_set_error (bfd_error_invalid_operation);
251       return -1;
252     }
253
254   lsec = bfd_get_section_by_name (abfd, ".loader");
255   if (lsec == NULL)
256     {
257       bfd_set_error (bfd_error_no_symbols);
258       return -1;
259     }
260
261   if (! xcoff_get_section_contents (abfd, lsec))
262     return -1;
263   contents = coff_section_data (abfd, lsec)->contents;
264
265   bfd_xcoff_swap_ldhdr_in (abfd, (void *) contents, &ldhdr);
266
267   return (ldhdr.l_nsyms + 1) * sizeof (asymbol *);
268 }
269
270 /* Get the dynamic symbols.  */
271
272 long
273 _bfd_xcoff_canonicalize_dynamic_symtab (bfd *abfd, asymbol **psyms)
274 {
275   asection *lsec;
276   bfd_byte *contents;
277   struct internal_ldhdr ldhdr;
278   const char *strings;
279   bfd_byte *elsym, *elsymend;
280   coff_symbol_type *symbuf;
281
282   if ((abfd->flags & DYNAMIC) == 0)
283     {
284       bfd_set_error (bfd_error_invalid_operation);
285       return -1;
286     }
287
288   lsec = bfd_get_section_by_name (abfd, ".loader");
289   if (lsec == NULL)
290     {
291       bfd_set_error (bfd_error_no_symbols);
292       return -1;
293     }
294
295   if (! xcoff_get_section_contents (abfd, lsec))
296     return -1;
297   contents = coff_section_data (abfd, lsec)->contents;
298
299   coff_section_data (abfd, lsec)->keep_contents = TRUE;
300
301   bfd_xcoff_swap_ldhdr_in (abfd, contents, &ldhdr);
302
303   strings = (char *) contents + ldhdr.l_stoff;
304
305   symbuf = bfd_zalloc (abfd, ldhdr.l_nsyms * sizeof (* symbuf));
306   if (symbuf == NULL)
307     return -1;
308
309   elsym = contents + bfd_xcoff_loader_symbol_offset(abfd, &ldhdr);
310
311   elsymend = elsym + ldhdr.l_nsyms * bfd_xcoff_ldsymsz(abfd);
312   for (; elsym < elsymend; elsym += bfd_xcoff_ldsymsz(abfd), symbuf++, psyms++)
313     {
314       struct internal_ldsym ldsym;
315
316       bfd_xcoff_swap_ldsym_in (abfd, elsym, &ldsym);
317
318       symbuf->symbol.the_bfd = abfd;
319
320       if (ldsym._l._l_l._l_zeroes == 0)
321         symbuf->symbol.name = strings + ldsym._l._l_l._l_offset;
322       else
323         {
324           char *c;
325
326           c = bfd_alloc (abfd, (bfd_size_type) SYMNMLEN + 1);
327           if (c == NULL)
328             return -1;
329           memcpy (c, ldsym._l._l_name, SYMNMLEN);
330           c[SYMNMLEN] = '\0';
331           symbuf->symbol.name = c;
332         }
333
334       if (ldsym.l_smclas == XMC_XO)
335         symbuf->symbol.section = bfd_abs_section_ptr;
336       else
337         symbuf->symbol.section = coff_section_from_bfd_index (abfd,
338                                                               ldsym.l_scnum);
339       symbuf->symbol.value = ldsym.l_value - symbuf->symbol.section->vma;
340
341       symbuf->symbol.flags = BSF_NO_FLAGS;
342       if ((ldsym.l_smtype & L_EXPORT) != 0)
343         {
344           if ((ldsym.l_smtype & L_WEAK) != 0)
345             symbuf->symbol.flags |= BSF_WEAK;
346           else
347             symbuf->symbol.flags |= BSF_GLOBAL;
348         }
349
350       /* FIXME: We have no way to record the other information stored
351          with the loader symbol.  */
352       *psyms = (asymbol *) symbuf;
353     }
354
355   *psyms = NULL;
356
357   return ldhdr.l_nsyms;
358 }
359
360 /* Get the size required to hold the dynamic relocs.  */
361
362 long
363 _bfd_xcoff_get_dynamic_reloc_upper_bound (bfd *abfd)
364 {
365   asection *lsec;
366   bfd_byte *contents;
367   struct internal_ldhdr ldhdr;
368
369   if ((abfd->flags & DYNAMIC) == 0)
370     {
371       bfd_set_error (bfd_error_invalid_operation);
372       return -1;
373     }
374
375   lsec = bfd_get_section_by_name (abfd, ".loader");
376   if (lsec == NULL)
377     {
378       bfd_set_error (bfd_error_no_symbols);
379       return -1;
380     }
381
382   if (! xcoff_get_section_contents (abfd, lsec))
383     return -1;
384   contents = coff_section_data (abfd, lsec)->contents;
385
386   bfd_xcoff_swap_ldhdr_in (abfd, (struct external_ldhdr *) contents, &ldhdr);
387
388   return (ldhdr.l_nreloc + 1) * sizeof (arelent *);
389 }
390
391 /* Get the dynamic relocs.  */
392
393 long
394 _bfd_xcoff_canonicalize_dynamic_reloc (bfd *abfd,
395                                        arelent **prelocs,
396                                        asymbol **syms)
397 {
398   asection *lsec;
399   bfd_byte *contents;
400   struct internal_ldhdr ldhdr;
401   arelent *relbuf;
402   bfd_byte *elrel, *elrelend;
403
404   if ((abfd->flags & DYNAMIC) == 0)
405     {
406       bfd_set_error (bfd_error_invalid_operation);
407       return -1;
408     }
409
410   lsec = bfd_get_section_by_name (abfd, ".loader");
411   if (lsec == NULL)
412     {
413       bfd_set_error (bfd_error_no_symbols);
414       return -1;
415     }
416
417   if (! xcoff_get_section_contents (abfd, lsec))
418     return -1;
419   contents = coff_section_data (abfd, lsec)->contents;
420
421   bfd_xcoff_swap_ldhdr_in (abfd, contents, &ldhdr);
422
423   relbuf = bfd_alloc (abfd, ldhdr.l_nreloc * sizeof (arelent));
424   if (relbuf == NULL)
425     return -1;
426
427   elrel = contents + bfd_xcoff_loader_reloc_offset(abfd, &ldhdr);
428
429   elrelend = elrel + ldhdr.l_nreloc * bfd_xcoff_ldrelsz(abfd);
430   for (; elrel < elrelend; elrel += bfd_xcoff_ldrelsz(abfd), relbuf++,
431          prelocs++)
432     {
433       struct internal_ldrel ldrel;
434
435       bfd_xcoff_swap_ldrel_in (abfd, elrel, &ldrel);
436
437       if (ldrel.l_symndx >= 3)
438         relbuf->sym_ptr_ptr = syms + (ldrel.l_symndx - 3);
439       else
440         {
441           const char *name;
442           asection *sec;
443
444           switch (ldrel.l_symndx)
445             {
446             case 0:
447               name = ".text";
448               break;
449             case 1:
450               name = ".data";
451               break;
452             case 2:
453               name = ".bss";
454               break;
455             default:
456               abort ();
457               break;
458             }
459
460           sec = bfd_get_section_by_name (abfd, name);
461           if (sec == NULL)
462             {
463               bfd_set_error (bfd_error_bad_value);
464               return -1;
465             }
466
467           relbuf->sym_ptr_ptr = sec->symbol_ptr_ptr;
468         }
469
470       relbuf->address = ldrel.l_vaddr;
471       relbuf->addend = 0;
472
473       /* Most dynamic relocs have the same type.  FIXME: This is only
474          correct if ldrel.l_rtype == 0.  In other cases, we should use
475          a different howto.  */
476       relbuf->howto = bfd_xcoff_dynamic_reloc_howto(abfd);
477
478       /* FIXME: We have no way to record the l_rsecnm field.  */
479
480       *prelocs = relbuf;
481     }
482
483   *prelocs = NULL;
484
485   return ldhdr.l_nreloc;
486 }
487 \f
488 /* Hash functions for xcoff_link_hash_table's archive_info.  */
489
490 static hashval_t
491 xcoff_archive_info_hash (const void *data)
492 {
493   const struct xcoff_archive_info *info;
494
495   info = (const struct xcoff_archive_info *) data;
496   return htab_hash_pointer (info->archive);
497 }
498
499 static int
500 xcoff_archive_info_eq (const void *data1, const void *data2)
501 {
502   const struct xcoff_archive_info *info1;
503   const struct xcoff_archive_info *info2;
504
505   info1 = (const struct xcoff_archive_info *) data1;
506   info2 = (const struct xcoff_archive_info *) data2;
507   return info1->archive == info2->archive;
508 }
509
510 /* Return information about archive ARCHIVE.  Return NULL on error.  */
511
512 static struct xcoff_archive_info *
513 xcoff_get_archive_info (struct bfd_link_info *info, bfd *archive)
514 {
515   struct xcoff_link_hash_table *htab;
516   struct xcoff_archive_info *entryp, entry;
517   void **slot;
518
519   htab = xcoff_hash_table (info);
520   entry.archive = archive;
521   slot = htab_find_slot (htab->archive_info, &entry, INSERT);
522   if (!slot)
523     return NULL;
524
525   entryp = *slot;
526   if (!entryp)
527     {
528       entryp = bfd_zalloc (archive, sizeof (entry));
529       if (!entryp)
530         return NULL;
531
532       entryp->archive = archive;
533       *slot = entryp;
534     }
535   return entryp;
536 }
537 \f
538 /* Routine to create an entry in an XCOFF link hash table.  */
539
540 static struct bfd_hash_entry *
541 xcoff_link_hash_newfunc (struct bfd_hash_entry *entry,
542                          struct bfd_hash_table *table,
543                          const char *string)
544 {
545   struct xcoff_link_hash_entry *ret = (struct xcoff_link_hash_entry *) entry;
546
547   /* Allocate the structure if it has not already been allocated by a
548      subclass.  */
549   if (ret == NULL)
550     ret = bfd_hash_allocate (table, sizeof (* ret));
551   if (ret == NULL)
552     return NULL;
553
554   /* Call the allocation method of the superclass.  */
555   ret = ((struct xcoff_link_hash_entry *)
556          _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
557                                  table, string));
558   if (ret != NULL)
559     {
560       /* Set local fields.  */
561       ret->indx = -1;
562       ret->toc_section = NULL;
563       ret->u.toc_indx = -1;
564       ret->descriptor = NULL;
565       ret->ldsym = NULL;
566       ret->ldindx = -1;
567       ret->flags = 0;
568       ret->smclas = XMC_UA;
569     }
570
571   return (struct bfd_hash_entry *) ret;
572 }
573
574 /* Destroy an XCOFF link hash table.  */
575
576 static void
577 _bfd_xcoff_bfd_link_hash_table_free (bfd *obfd)
578 {
579   struct xcoff_link_hash_table *ret;
580
581   ret = (struct xcoff_link_hash_table *) obfd->link.hash;
582   if (ret->archive_info)
583     htab_delete (ret->archive_info);
584   if (ret->debug_strtab)
585     _bfd_stringtab_free (ret->debug_strtab);
586   _bfd_generic_link_hash_table_free (obfd);
587 }
588
589 /* Create an XCOFF link hash table.  */
590
591 struct bfd_link_hash_table *
592 _bfd_xcoff_bfd_link_hash_table_create (bfd *abfd)
593 {
594   struct xcoff_link_hash_table *ret;
595   bfd_size_type amt = sizeof (* ret);
596
597   ret = bfd_zmalloc (amt);
598   if (ret == NULL)
599     return NULL;
600   if (!_bfd_link_hash_table_init (&ret->root, abfd, xcoff_link_hash_newfunc,
601                                   sizeof (struct xcoff_link_hash_entry)))
602     {
603       free (ret);
604       return NULL;
605     }
606
607   ret->debug_strtab = _bfd_xcoff_stringtab_init ();
608   ret->archive_info = htab_create (37, xcoff_archive_info_hash,
609                                    xcoff_archive_info_eq, NULL);
610   if (!ret->debug_strtab || !ret->archive_info)
611     {
612       _bfd_xcoff_bfd_link_hash_table_free (abfd);
613       return NULL;
614     }
615   ret->root.hash_table_free = _bfd_xcoff_bfd_link_hash_table_free;
616
617   /* The linker will always generate a full a.out header.  We need to
618      record that fact now, before the sizeof_headers routine could be
619      called.  */
620   xcoff_data (abfd)->full_aouthdr = TRUE;
621
622   return &ret->root;
623 }
624 \f
625 /* Read internal relocs for an XCOFF csect.  This is a wrapper around
626    _bfd_coff_read_internal_relocs which tries to take advantage of any
627    relocs which may have been cached for the enclosing section.  */
628
629 static struct internal_reloc *
630 xcoff_read_internal_relocs (bfd *abfd,
631                             asection *sec,
632                             bfd_boolean cache,
633                             bfd_byte *external_relocs,
634                             bfd_boolean require_internal,
635                             struct internal_reloc *internal_relocs)
636 {
637   if (coff_section_data (abfd, sec) != NULL
638       && coff_section_data (abfd, sec)->relocs == NULL
639       && xcoff_section_data (abfd, sec) != NULL)
640     {
641       asection *enclosing;
642
643       enclosing = xcoff_section_data (abfd, sec)->enclosing;
644
645       if (enclosing != NULL
646           && (coff_section_data (abfd, enclosing) == NULL
647               || coff_section_data (abfd, enclosing)->relocs == NULL)
648           && cache
649           && enclosing->reloc_count > 0)
650         {
651           if (_bfd_coff_read_internal_relocs (abfd, enclosing, TRUE,
652                                               external_relocs, FALSE, NULL)
653               == NULL)
654             return NULL;
655         }
656
657       if (enclosing != NULL
658           && coff_section_data (abfd, enclosing) != NULL
659           && coff_section_data (abfd, enclosing)->relocs != NULL)
660         {
661           size_t off;
662
663           off = ((sec->rel_filepos - enclosing->rel_filepos)
664                  / bfd_coff_relsz (abfd));
665
666           if (! require_internal)
667             return coff_section_data (abfd, enclosing)->relocs + off;
668           memcpy (internal_relocs,
669                   coff_section_data (abfd, enclosing)->relocs + off,
670                   sec->reloc_count * sizeof (struct internal_reloc));
671           return internal_relocs;
672         }
673     }
674
675   return _bfd_coff_read_internal_relocs (abfd, sec, cache, external_relocs,
676                                          require_internal, internal_relocs);
677 }
678 \f
679 /* Split FILENAME into an import path and an import filename,
680    storing them in *IMPPATH and *IMPFILE respectively.  */
681
682 bfd_boolean
683 bfd_xcoff_split_import_path (bfd *abfd, const char *filename,
684                              const char **imppath, const char **impfile)
685 {
686   const char *base;
687   size_t length;
688   char *path;
689
690   base = lbasename (filename);
691   length = base - filename;
692   if (length == 0)
693     /* The filename has no directory component, so use an empty path.  */
694     *imppath = "";
695   else if (length == 1)
696     /* The filename is in the root directory.  */
697     *imppath = "/";
698   else
699     {
700       /* Extract the (non-empty) directory part.  Note that we don't
701          need to strip duplicate directory separators from any part
702          of the string; the native linker doesn't do that either.  */
703       path = bfd_alloc (abfd, length);
704       if (path == NULL)
705         return FALSE;
706       memcpy (path, filename, length - 1);
707       path[length - 1] = 0;
708       *imppath = path;
709     }
710   *impfile = base;
711   return TRUE;
712 }
713
714 /* Set ARCHIVE's import path as though its filename had been given
715    as FILENAME.  */
716
717 bfd_boolean
718 bfd_xcoff_set_archive_import_path (struct bfd_link_info *info,
719                                    bfd *archive, const char *filename)
720 {
721   struct xcoff_archive_info *archive_info;
722
723   archive_info = xcoff_get_archive_info (info, archive);
724   return (archive_info != NULL
725           && bfd_xcoff_split_import_path (archive, filename,
726                                           &archive_info->imppath,
727                                           &archive_info->impfile));
728 }
729
730 /* H is an imported symbol.  Set the import module's path, file and member
731    to IMPATH, IMPFILE and IMPMEMBER respectively.  All three are null if
732    no specific import module is specified.  */
733
734 static bfd_boolean
735 xcoff_set_import_path (struct bfd_link_info *info,
736                        struct xcoff_link_hash_entry *h,
737                        const char *imppath, const char *impfile,
738                        const char *impmember)
739 {
740   unsigned int c;
741   struct xcoff_import_file **pp;
742
743   /* We overload the ldindx field to hold the l_ifile value for this
744      symbol.  */
745   BFD_ASSERT (h->ldsym == NULL);
746   BFD_ASSERT ((h->flags & XCOFF_BUILT_LDSYM) == 0);
747   if (imppath == NULL)
748     h->ldindx = -1;
749   else
750     {
751       /* We start c at 1 because the first entry in the import list is
752          reserved for the library search path.  */
753       for (pp = &xcoff_hash_table (info)->imports, c = 1;
754            *pp != NULL;
755            pp = &(*pp)->next, ++c)
756         {
757           if (filename_cmp ((*pp)->path, imppath) == 0
758               && filename_cmp ((*pp)->file, impfile) == 0
759               && filename_cmp ((*pp)->member, impmember) == 0)
760             break;
761         }
762
763       if (*pp == NULL)
764         {
765           struct xcoff_import_file *n;
766           bfd_size_type amt = sizeof (* n);
767
768           n = bfd_alloc (info->output_bfd, amt);
769           if (n == NULL)
770             return FALSE;
771           n->next = NULL;
772           n->path = imppath;
773           n->file = impfile;
774           n->member = impmember;
775           *pp = n;
776         }
777       h->ldindx = c;
778     }
779   return TRUE;
780 }
781 \f
782 /* H is the bfd symbol associated with exported .loader symbol LDSYM.
783    Return true if LDSYM defines H.  */
784
785 static bfd_boolean
786 xcoff_dynamic_definition_p (struct xcoff_link_hash_entry *h,
787                             struct internal_ldsym *ldsym)
788 {
789   /* If we didn't know about H before processing LDSYM, LDSYM
790      definitely defines H.  */
791   if (h->root.type == bfd_link_hash_new)
792     return TRUE;
793
794   /* If H is currently a weak dynamic symbol, and if LDSYM is a strong
795      dynamic symbol, LDSYM trumps the current definition of H.  */
796   if ((ldsym->l_smtype & L_WEAK) == 0
797       && (h->flags & XCOFF_DEF_DYNAMIC) != 0
798       && (h->flags & XCOFF_DEF_REGULAR) == 0
799       && (h->root.type == bfd_link_hash_defweak
800           || h->root.type == bfd_link_hash_undefweak))
801     return TRUE;
802
803   /* If H is currently undefined, LDSYM defines it.  */
804   if ((h->flags & XCOFF_DEF_DYNAMIC) == 0
805       && (h->root.type == bfd_link_hash_undefined
806           || h->root.type == bfd_link_hash_undefweak))
807     return TRUE;
808
809   return FALSE;
810 }
811
812 /* This function is used to add symbols from a dynamic object to the
813    global symbol table.  */
814
815 static bfd_boolean
816 xcoff_link_add_dynamic_symbols (bfd *abfd, struct bfd_link_info *info)
817 {
818   asection *lsec;
819   bfd_byte *contents;
820   struct internal_ldhdr ldhdr;
821   const char *strings;
822   bfd_byte *elsym, *elsymend;
823   struct xcoff_import_file *n;
824   unsigned int c;
825   struct xcoff_import_file **pp;
826
827   /* We can only handle a dynamic object if we are generating an XCOFF
828      output file.  */
829    if (info->output_bfd->xvec != abfd->xvec)
830     {
831       (*_bfd_error_handler)
832         (_("%s: XCOFF shared object when not producing XCOFF output"),
833          bfd_get_filename (abfd));
834       bfd_set_error (bfd_error_invalid_operation);
835       return FALSE;
836     }
837
838   /* The symbols we use from a dynamic object are not the symbols in
839      the normal symbol table, but, rather, the symbols in the export
840      table.  If there is a global symbol in a dynamic object which is
841      not in the export table, the loader will not be able to find it,
842      so we don't want to find it either.  Also, on AIX 4.1.3, shr.o in
843      libc.a has symbols in the export table which are not in the
844      symbol table.  */
845
846   /* Read in the .loader section.  FIXME: We should really use the
847      o_snloader field in the a.out header, rather than grabbing the
848      section by name.  */
849   lsec = bfd_get_section_by_name (abfd, ".loader");
850   if (lsec == NULL)
851     {
852       (*_bfd_error_handler)
853         (_("%s: dynamic object with no .loader section"),
854          bfd_get_filename (abfd));
855       bfd_set_error (bfd_error_no_symbols);
856       return FALSE;
857     }
858
859   if (! xcoff_get_section_contents (abfd, lsec))
860     return FALSE;
861   contents = coff_section_data (abfd, lsec)->contents;
862
863   /* Remove the sections from this object, so that they do not get
864      included in the link.  */
865   bfd_section_list_clear (abfd);
866
867   bfd_xcoff_swap_ldhdr_in (abfd, contents, &ldhdr);
868
869   strings = (char *) contents + ldhdr.l_stoff;
870
871   elsym = contents + bfd_xcoff_loader_symbol_offset(abfd, &ldhdr);
872
873   elsymend = elsym + ldhdr.l_nsyms * bfd_xcoff_ldsymsz(abfd);
874
875   for (; elsym < elsymend; elsym += bfd_xcoff_ldsymsz(abfd))
876     {
877       struct internal_ldsym ldsym;
878       char nambuf[SYMNMLEN + 1];
879       const char *name;
880       struct xcoff_link_hash_entry *h;
881
882       bfd_xcoff_swap_ldsym_in (abfd, elsym, &ldsym);
883
884       /* We are only interested in exported symbols.  */
885       if ((ldsym.l_smtype & L_EXPORT) == 0)
886         continue;
887
888       if (ldsym._l._l_l._l_zeroes == 0)
889         name = strings + ldsym._l._l_l._l_offset;
890       else
891         {
892           memcpy (nambuf, ldsym._l._l_name, SYMNMLEN);
893           nambuf[SYMNMLEN] = '\0';
894           name = nambuf;
895         }
896
897       /* Normally we could not call xcoff_link_hash_lookup in an add
898          symbols routine, since we might not be using an XCOFF hash
899          table.  However, we verified above that we are using an XCOFF
900          hash table.  */
901
902       h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, TRUE,
903                                   TRUE, TRUE);
904       if (h == NULL)
905         return FALSE;
906
907       if (!xcoff_dynamic_definition_p (h, &ldsym))
908         continue;
909
910       h->flags |= XCOFF_DEF_DYNAMIC;
911       h->smclas = ldsym.l_smclas;
912       if (h->smclas == XMC_XO)
913         {
914           /* This symbol has an absolute value.  */
915           if ((ldsym.l_smtype & L_WEAK) != 0)
916             h->root.type = bfd_link_hash_defweak;
917           else
918             h->root.type = bfd_link_hash_defined;
919           h->root.u.def.section = bfd_abs_section_ptr;
920           h->root.u.def.value = ldsym.l_value;
921         }
922       else
923         {
924           /* Otherwise, we don't bother to actually define the symbol,
925              since we don't have a section to put it in anyhow.
926              We assume instead that an undefined XCOFF_DEF_DYNAMIC symbol
927              should be imported from the symbol's undef.abfd.  */
928           if ((ldsym.l_smtype & L_WEAK) != 0)
929             h->root.type = bfd_link_hash_undefweak;
930           else
931             h->root.type = bfd_link_hash_undefined;
932           h->root.u.undef.abfd = abfd;
933         }
934
935       /* If this symbol defines a function descriptor, then it
936          implicitly defines the function code as well.  */
937       if (h->smclas == XMC_DS
938           || (h->smclas == XMC_XO && name[0] != '.'))
939         h->flags |= XCOFF_DESCRIPTOR;
940       if ((h->flags & XCOFF_DESCRIPTOR) != 0)
941         {
942           struct xcoff_link_hash_entry *hds;
943
944           hds = h->descriptor;
945           if (hds == NULL)
946             {
947               char *dsnm;
948
949               dsnm = bfd_malloc ((bfd_size_type) strlen (name) + 2);
950               if (dsnm == NULL)
951                 return FALSE;
952               dsnm[0] = '.';
953               strcpy (dsnm + 1, name);
954               hds = xcoff_link_hash_lookup (xcoff_hash_table (info), dsnm,
955                                             TRUE, TRUE, TRUE);
956               free (dsnm);
957               if (hds == NULL)
958                 return FALSE;
959
960               hds->descriptor = h;
961               h->descriptor = hds;
962             }
963
964           if (xcoff_dynamic_definition_p (hds, &ldsym))
965             {
966               hds->root.type = h->root.type;
967               hds->flags |= XCOFF_DEF_DYNAMIC;
968               if (h->smclas == XMC_XO)
969                 {
970                   /* An absolute symbol appears to actually define code, not a
971                      function descriptor.  This is how some math functions are
972                      implemented on AIX 4.1.  */
973                   hds->smclas = XMC_XO;
974                   hds->root.u.def.section = bfd_abs_section_ptr;
975                   hds->root.u.def.value = ldsym.l_value;
976                 }
977               else
978                 {
979                   hds->smclas = XMC_PR;
980                   hds->root.u.undef.abfd = abfd;
981                   /* We do not want to add this to the undefined
982                      symbol list.  */
983                 }
984             }
985         }
986     }
987
988   if (contents != NULL && ! coff_section_data (abfd, lsec)->keep_contents)
989     {
990       free (coff_section_data (abfd, lsec)->contents);
991       coff_section_data (abfd, lsec)->contents = NULL;
992     }
993
994   /* Record this file in the import files.  */
995   n = bfd_alloc (abfd, (bfd_size_type) sizeof (struct xcoff_import_file));
996   if (n == NULL)
997     return FALSE;
998   n->next = NULL;
999
1000   if (abfd->my_archive == NULL)
1001     {
1002       if (!bfd_xcoff_split_import_path (abfd, abfd->filename,
1003                                         &n->path, &n->file))
1004         return FALSE;
1005       n->member = "";
1006     }
1007   else
1008     {
1009       struct xcoff_archive_info *archive_info;
1010
1011       archive_info = xcoff_get_archive_info (info, abfd->my_archive);
1012       if (!archive_info->impfile)
1013         {
1014           if (!bfd_xcoff_split_import_path (archive_info->archive,
1015                                             archive_info->archive->filename,
1016                                             &archive_info->imppath,
1017                                             &archive_info->impfile))
1018             return FALSE;
1019         }
1020       n->path = archive_info->imppath;
1021       n->file = archive_info->impfile;
1022       n->member = bfd_get_filename (abfd);
1023     }
1024
1025   /* We start c at 1 because the first import file number is reserved
1026      for LIBPATH.  */
1027   for (pp = &xcoff_hash_table (info)->imports, c = 1;
1028        *pp != NULL;
1029        pp = &(*pp)->next, ++c)
1030     ;
1031   *pp = n;
1032
1033   xcoff_data (abfd)->import_file_id = c;
1034
1035   return TRUE;
1036 }
1037
1038 /* xcoff_link_create_extra_sections
1039
1040    Takes care of creating the .loader, .gl, .ds, .debug and sections.  */
1041
1042 static bfd_boolean
1043 xcoff_link_create_extra_sections (bfd * abfd, struct bfd_link_info *info)
1044 {
1045   bfd_boolean return_value = FALSE;
1046
1047   if (info->output_bfd->xvec == abfd->xvec)
1048     {
1049       /* We need to build a .loader section, so we do it here.  This
1050          won't work if we're producing an XCOFF output file with no
1051          XCOFF input files.  FIXME.  */
1052
1053       if (!info->relocatable
1054           && xcoff_hash_table (info)->loader_section == NULL)
1055         {
1056           asection *lsec;
1057           flagword flags = SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1058
1059           lsec = bfd_make_section_anyway_with_flags (abfd, ".loader", flags);
1060           if (lsec == NULL)
1061             goto end_return;
1062
1063           xcoff_hash_table (info)->loader_section = lsec;
1064         }
1065
1066       /* Likewise for the linkage section.  */
1067       if (xcoff_hash_table (info)->linkage_section == NULL)
1068         {
1069           asection *lsec;
1070           flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1071                             | SEC_IN_MEMORY);
1072
1073           lsec = bfd_make_section_anyway_with_flags (abfd, ".gl", flags);
1074           if (lsec == NULL)
1075             goto end_return;
1076
1077           xcoff_hash_table (info)->linkage_section = lsec;
1078           lsec->alignment_power = 2;
1079         }
1080
1081       /* Likewise for the TOC section.  */
1082       if (xcoff_hash_table (info)->toc_section == NULL)
1083         {
1084           asection *tsec;
1085           flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1086                             | SEC_IN_MEMORY);
1087
1088           tsec = bfd_make_section_anyway_with_flags (abfd, ".tc", flags);
1089           if (tsec == NULL)
1090             goto end_return;
1091
1092           xcoff_hash_table (info)->toc_section = tsec;
1093           tsec->alignment_power = 2;
1094         }
1095
1096       /* Likewise for the descriptor section.  */
1097       if (xcoff_hash_table (info)->descriptor_section == NULL)
1098         {
1099           asection *dsec;
1100           flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1101                             | SEC_IN_MEMORY);
1102
1103           dsec = bfd_make_section_anyway_with_flags (abfd, ".ds", flags);
1104           if (dsec == NULL)
1105             goto end_return;
1106
1107           xcoff_hash_table (info)->descriptor_section = dsec;
1108           dsec->alignment_power = 2;
1109         }
1110
1111       /* Likewise for the .debug section.  */
1112       if (xcoff_hash_table (info)->debug_section == NULL
1113           && info->strip != strip_all)
1114         {
1115           asection *dsec;
1116           flagword flags = SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1117
1118           dsec = bfd_make_section_anyway_with_flags (abfd, ".debug", flags);
1119           if (dsec == NULL)
1120             goto end_return;
1121
1122           xcoff_hash_table (info)->debug_section = dsec;
1123         }
1124     }
1125
1126   return_value = TRUE;
1127
1128  end_return:
1129
1130   return return_value;
1131 }
1132
1133 /* Returns the index of reloc in RELOCS with the least address greater
1134    than or equal to ADDRESS.  The relocs are sorted by address.  */
1135
1136 static bfd_size_type
1137 xcoff_find_reloc (struct internal_reloc *relocs,
1138                   bfd_size_type count,
1139                   bfd_vma address)
1140 {
1141   bfd_size_type min, max, this;
1142
1143   if (count < 2)
1144     {
1145       if (count == 1 && relocs[0].r_vaddr < address)
1146         return 1;
1147       else
1148         return 0;
1149     }
1150
1151   min = 0;
1152   max = count;
1153
1154   /* Do a binary search over (min,max].  */
1155   while (min + 1 < max)
1156     {
1157       bfd_vma raddr;
1158
1159       this = (max + min) / 2;
1160       raddr = relocs[this].r_vaddr;
1161       if (raddr > address)
1162         max = this;
1163       else if (raddr < address)
1164         min = this;
1165       else
1166         {
1167           min = this;
1168           break;
1169         }
1170     }
1171
1172   if (relocs[min].r_vaddr < address)
1173     return min + 1;
1174
1175   while (min > 0
1176          && relocs[min - 1].r_vaddr == address)
1177     --min;
1178
1179   return min;
1180 }
1181
1182 /* Add all the symbols from an object file to the hash table.
1183
1184    XCOFF is a weird format.  A normal XCOFF .o files will have three
1185    COFF sections--.text, .data, and .bss--but each COFF section will
1186    contain many csects.  These csects are described in the symbol
1187    table.  From the linker's point of view, each csect must be
1188    considered a section in its own right.  For example, a TOC entry is
1189    handled as a small XMC_TC csect.  The linker must be able to merge
1190    different TOC entries together, which means that it must be able to
1191    extract the XMC_TC csects from the .data section of the input .o
1192    file.
1193
1194    From the point of view of our linker, this is, of course, a hideous
1195    nightmare.  We cope by actually creating sections for each csect,
1196    and discarding the original sections.  We then have to handle the
1197    relocation entries carefully, since the only way to tell which
1198    csect they belong to is to examine the address.  */
1199
1200 static bfd_boolean
1201 xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
1202 {
1203   unsigned int n_tmask;
1204   unsigned int n_btshft;
1205   bfd_boolean default_copy;
1206   bfd_size_type symcount;
1207   struct xcoff_link_hash_entry **sym_hash;
1208   asection **csect_cache;
1209   unsigned int *lineno_counts;
1210   bfd_size_type linesz;
1211   asection *o;
1212   asection *last_real;
1213   bfd_boolean keep_syms;
1214   asection *csect;
1215   unsigned int csect_index;
1216   asection *first_csect;
1217   bfd_size_type symesz;
1218   bfd_byte *esym;
1219   bfd_byte *esym_end;
1220   struct reloc_info_struct
1221   {
1222     struct internal_reloc *relocs;
1223     asection **csects;
1224     bfd_byte *linenos;
1225   } *reloc_info = NULL;
1226   bfd_size_type amt;
1227
1228   keep_syms = obj_coff_keep_syms (abfd);
1229
1230   if ((abfd->flags & DYNAMIC) != 0
1231       && ! info->static_link)
1232     {
1233       if (! xcoff_link_add_dynamic_symbols (abfd, info))
1234         return FALSE;
1235     }
1236
1237   /* Create the loader, toc, gl, ds and debug sections, if needed.  */
1238   if (! xcoff_link_create_extra_sections (abfd, info))
1239     goto error_return;
1240
1241   if ((abfd->flags & DYNAMIC) != 0
1242       && ! info->static_link)
1243     return TRUE;
1244
1245   n_tmask = coff_data (abfd)->local_n_tmask;
1246   n_btshft = coff_data (abfd)->local_n_btshft;
1247
1248   /* Define macros so that ISFCN, et. al., macros work correctly.  */
1249 #define N_TMASK n_tmask
1250 #define N_BTSHFT n_btshft
1251
1252   if (info->keep_memory)
1253     default_copy = FALSE;
1254   else
1255     default_copy = TRUE;
1256
1257   symcount = obj_raw_syment_count (abfd);
1258
1259   /* We keep a list of the linker hash table entries that correspond
1260      to each external symbol.  */
1261   amt = symcount * sizeof (struct xcoff_link_hash_entry *);
1262   sym_hash = bfd_zalloc (abfd, amt);
1263   if (sym_hash == NULL && symcount != 0)
1264     goto error_return;
1265   coff_data (abfd)->sym_hashes = (struct coff_link_hash_entry **) sym_hash;
1266
1267   /* Because of the weird stuff we are doing with XCOFF csects, we can
1268      not easily determine which section a symbol is in, so we store
1269      the information in the tdata for the input file.  */
1270   amt = symcount * sizeof (asection *);
1271   csect_cache = bfd_zalloc (abfd, amt);
1272   if (csect_cache == NULL && symcount != 0)
1273     goto error_return;
1274   xcoff_data (abfd)->csects = csect_cache;
1275
1276   /* We garbage-collect line-number information on a symbol-by-symbol
1277      basis, so we need to have quick access to the number of entries
1278      per symbol.  */
1279   amt = symcount * sizeof (unsigned int);
1280   lineno_counts = bfd_zalloc (abfd, amt);
1281   if (lineno_counts == NULL && symcount != 0)
1282     goto error_return;
1283   xcoff_data (abfd)->lineno_counts = lineno_counts;
1284
1285   /* While splitting sections into csects, we need to assign the
1286      relocs correctly.  The relocs and the csects must both be in
1287      order by VMA within a given section, so we handle this by
1288      scanning along the relocs as we process the csects.  We index
1289      into reloc_info using the section target_index.  */
1290   amt = abfd->section_count + 1;
1291   amt *= sizeof (struct reloc_info_struct);
1292   reloc_info = bfd_zmalloc (amt);
1293   if (reloc_info == NULL)
1294     goto error_return;
1295
1296   /* Read in the relocs and line numbers for each section.  */
1297   linesz = bfd_coff_linesz (abfd);
1298   last_real = NULL;
1299   for (o = abfd->sections; o != NULL; o = o->next)
1300     {
1301       last_real = o;
1302
1303       if ((o->flags & SEC_RELOC) != 0)
1304         {
1305           reloc_info[o->target_index].relocs =
1306             xcoff_read_internal_relocs (abfd, o, TRUE, NULL, FALSE, NULL);
1307           amt = o->reloc_count;
1308           amt *= sizeof (asection *);
1309           reloc_info[o->target_index].csects = bfd_zmalloc (amt);
1310           if (reloc_info[o->target_index].csects == NULL)
1311             goto error_return;
1312         }
1313
1314       if ((info->strip == strip_none || info->strip == strip_some)
1315           && o->lineno_count > 0)
1316         {
1317           bfd_byte *linenos;
1318
1319           amt = linesz * o->lineno_count;
1320           linenos = bfd_malloc (amt);
1321           if (linenos == NULL)
1322             goto error_return;
1323           reloc_info[o->target_index].linenos = linenos;
1324           if (bfd_seek (abfd, o->line_filepos, SEEK_SET) != 0
1325               || bfd_bread (linenos, amt, abfd) != amt)
1326             goto error_return;
1327         }
1328     }
1329
1330   /* Don't let the linker relocation routines discard the symbols.  */
1331   obj_coff_keep_syms (abfd) = TRUE;
1332
1333   csect = NULL;
1334   csect_index = 0;
1335   first_csect = NULL;
1336
1337   symesz = bfd_coff_symesz (abfd);
1338   BFD_ASSERT (symesz == bfd_coff_auxesz (abfd));
1339   esym = (bfd_byte *) obj_coff_external_syms (abfd);
1340   esym_end = esym + symcount * symesz;
1341
1342   while (esym < esym_end)
1343     {
1344       struct internal_syment sym;
1345       union internal_auxent aux;
1346       const char *name;
1347       char buf[SYMNMLEN + 1];
1348       int smtyp;
1349       asection *section;
1350       bfd_vma value;
1351       struct xcoff_link_hash_entry *set_toc;
1352
1353       bfd_coff_swap_sym_in (abfd, (void *) esym, (void *) &sym);
1354
1355       /* In this pass we are only interested in symbols with csect
1356          information.  */
1357       if (!CSECT_SYM_P (sym.n_sclass))
1358         {
1359           /* Set csect_cache,
1360              Normally csect is a .pr, .rw  etc. created in the loop
1361              If C_FILE or first time, handle special
1362
1363              Advance esym, sym_hash, csect_hash ptrs.  */
1364           if (sym.n_sclass == C_FILE || sym.n_sclass == C_DWARF)
1365             csect = NULL;
1366           if (csect != NULL)
1367             *csect_cache = csect;
1368           else if (first_csect == NULL
1369                    || sym.n_sclass == C_FILE || sym.n_sclass == C_DWARF)
1370             *csect_cache = coff_section_from_bfd_index (abfd, sym.n_scnum);
1371           else
1372             *csect_cache = NULL;
1373           esym += (sym.n_numaux + 1) * symesz;
1374           sym_hash += sym.n_numaux + 1;
1375           csect_cache += sym.n_numaux + 1;
1376           lineno_counts += sym.n_numaux + 1;
1377
1378           continue;
1379         }
1380
1381       name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
1382
1383       if (name == NULL)
1384         goto error_return;
1385
1386       /* If this symbol has line number information attached to it,
1387          and we're not stripping it, count the number of entries and
1388          add them to the count for this csect.  In the final link pass
1389          we are going to attach line number information by symbol,
1390          rather than by section, in order to more easily handle
1391          garbage collection.  */
1392       if ((info->strip == strip_none || info->strip == strip_some)
1393           && sym.n_numaux > 1
1394           && csect != NULL
1395           && ISFCN (sym.n_type))
1396         {
1397           union internal_auxent auxlin;
1398
1399           bfd_coff_swap_aux_in (abfd, (void *) (esym + symesz),
1400                                 sym.n_type, sym.n_sclass,
1401                                 0, sym.n_numaux, (void *) &auxlin);
1402
1403           if (auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0)
1404             {
1405               asection *enclosing;
1406               bfd_signed_vma linoff;
1407
1408               enclosing = xcoff_section_data (abfd, csect)->enclosing;
1409               if (enclosing == NULL)
1410                 {
1411                   (*_bfd_error_handler)
1412                     (_("%B: `%s' has line numbers but no enclosing section"),
1413                      abfd, name);
1414                   bfd_set_error (bfd_error_bad_value);
1415                   goto error_return;
1416                 }
1417               linoff = (auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr
1418                         - enclosing->line_filepos);
1419               /* Explicit cast to bfd_signed_vma for compiler.  */
1420               if (linoff < (bfd_signed_vma) (enclosing->lineno_count * linesz))
1421                 {
1422                   struct internal_lineno lin;
1423                   bfd_byte *linpstart;
1424
1425                   linpstart = (reloc_info[enclosing->target_index].linenos
1426                                + linoff);
1427                   bfd_coff_swap_lineno_in (abfd, (void *) linpstart, (void *) &lin);
1428                   if (lin.l_lnno == 0
1429                       && ((bfd_size_type) lin.l_addr.l_symndx
1430                           == ((esym
1431                                - (bfd_byte *) obj_coff_external_syms (abfd))
1432                               / symesz)))
1433                     {
1434                       bfd_byte *linpend, *linp;
1435
1436                       linpend = (reloc_info[enclosing->target_index].linenos
1437                                  + enclosing->lineno_count * linesz);
1438                       for (linp = linpstart + linesz;
1439                            linp < linpend;
1440                            linp += linesz)
1441                         {
1442                           bfd_coff_swap_lineno_in (abfd, (void *) linp,
1443                                                    (void *) &lin);
1444                           if (lin.l_lnno == 0)
1445                             break;
1446                         }
1447                       *lineno_counts = (linp - linpstart) / linesz;
1448                       /* The setting of line_filepos will only be
1449                          useful if all the line number entries for a
1450                          csect are contiguous; this only matters for
1451                          error reporting.  */
1452                       if (csect->line_filepos == 0)
1453                         csect->line_filepos =
1454                           auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr;
1455                     }
1456                 }
1457             }
1458         }
1459
1460       /* Pick up the csect auxiliary information.  */
1461       if (sym.n_numaux == 0)
1462         {
1463           (*_bfd_error_handler)
1464             (_("%B: class %d symbol `%s' has no aux entries"),
1465              abfd, sym.n_sclass, name);
1466           bfd_set_error (bfd_error_bad_value);
1467           goto error_return;
1468         }
1469
1470       bfd_coff_swap_aux_in (abfd,
1471                             (void *) (esym + symesz * sym.n_numaux),
1472                             sym.n_type, sym.n_sclass,
1473                             sym.n_numaux - 1, sym.n_numaux,
1474                             (void *) &aux);
1475
1476       smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp);
1477
1478       section = NULL;
1479       value = 0;
1480       set_toc = NULL;
1481
1482       switch (smtyp)
1483         {
1484         default:
1485           (*_bfd_error_handler)
1486             (_("%B: symbol `%s' has unrecognized csect type %d"),
1487              abfd, name, smtyp);
1488           bfd_set_error (bfd_error_bad_value);
1489           goto error_return;
1490
1491         case XTY_ER:
1492           /* This is an external reference.  */
1493           if (sym.n_sclass == C_HIDEXT
1494               || sym.n_scnum != N_UNDEF
1495               || aux.x_csect.x_scnlen.l != 0)
1496             {
1497               (*_bfd_error_handler)
1498                 (_("%B: bad XTY_ER symbol `%s': class %d scnum %d scnlen %d"),
1499                  abfd, name, sym.n_sclass, sym.n_scnum,
1500                  aux.x_csect.x_scnlen.l);
1501               bfd_set_error (bfd_error_bad_value);
1502               goto error_return;
1503             }
1504
1505           /* An XMC_XO external reference is actually a reference to
1506              an absolute location.  */
1507           if (aux.x_csect.x_smclas != XMC_XO)
1508             section = bfd_und_section_ptr;
1509           else
1510             {
1511               section = bfd_abs_section_ptr;
1512               value = sym.n_value;
1513             }
1514           break;
1515
1516         case XTY_SD:
1517           csect = NULL;
1518           csect_index = -(unsigned) 1;
1519
1520           /* When we see a TOC anchor, we record the TOC value.  */
1521           if (aux.x_csect.x_smclas == XMC_TC0)
1522             {
1523               if (sym.n_sclass != C_HIDEXT
1524                   || aux.x_csect.x_scnlen.l != 0)
1525                 {
1526                   (*_bfd_error_handler)
1527                     (_("%B: XMC_TC0 symbol `%s' is class %d scnlen %d"),
1528                      abfd, name, sym.n_sclass, aux.x_csect.x_scnlen.l);
1529                   bfd_set_error (bfd_error_bad_value);
1530                   goto error_return;
1531                 }
1532               xcoff_data (abfd)->toc = sym.n_value;
1533             }
1534
1535           /* We must merge TOC entries for the same symbol.  We can
1536              merge two TOC entries if they are both C_HIDEXT, they
1537              both have the same name, they are both 4 or 8 bytes long, and
1538              they both have a relocation table entry for an external
1539              symbol with the same name.  Unfortunately, this means
1540              that we must look through the relocations.  Ick.
1541
1542              Logic for 32 bit vs 64 bit.
1543              32 bit has a csect length of 4 for TOC
1544              64 bit has a csect length of 8 for TOC
1545
1546              The conditions to get past the if-check are not that bad.
1547              They are what is used to create the TOC csects in the first
1548              place.  */
1549           if (aux.x_csect.x_smclas == XMC_TC
1550               && sym.n_sclass == C_HIDEXT
1551               && info->output_bfd->xvec == abfd->xvec
1552               && ((bfd_xcoff_is_xcoff32 (abfd)
1553                    && aux.x_csect.x_scnlen.l == 4)
1554                   || (bfd_xcoff_is_xcoff64 (abfd)
1555                       && aux.x_csect.x_scnlen.l == 8)))
1556             {
1557               asection *enclosing;
1558               struct internal_reloc *relocs;
1559               bfd_size_type relindx;
1560               struct internal_reloc *rel;
1561
1562               enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum);
1563               if (enclosing == NULL)
1564                 goto error_return;
1565
1566               relocs = reloc_info[enclosing->target_index].relocs;
1567               amt = enclosing->reloc_count;
1568               relindx = xcoff_find_reloc (relocs, amt, sym.n_value);
1569               rel = relocs + relindx;
1570
1571               /* 32 bit R_POS r_size is 31
1572                  64 bit R_POS r_size is 63  */
1573               if (relindx < enclosing->reloc_count
1574                   && rel->r_vaddr == (bfd_vma) sym.n_value
1575                   && rel->r_type == R_POS
1576                   && ((bfd_xcoff_is_xcoff32 (abfd)
1577                        && rel->r_size == 31)
1578                       || (bfd_xcoff_is_xcoff64 (abfd)
1579                           && rel->r_size == 63)))
1580                 {
1581                   bfd_byte *erelsym;
1582
1583                   struct internal_syment relsym;
1584
1585                   erelsym = ((bfd_byte *) obj_coff_external_syms (abfd)
1586                              + rel->r_symndx * symesz);
1587                   bfd_coff_swap_sym_in (abfd, (void *) erelsym, (void *) &relsym);
1588                   if (EXTERN_SYM_P (relsym.n_sclass))
1589                     {
1590                       const char *relname;
1591                       char relbuf[SYMNMLEN + 1];
1592                       bfd_boolean copy;
1593                       struct xcoff_link_hash_entry *h;
1594
1595                       /* At this point we know that the TOC entry is
1596                          for an externally visible symbol.  */
1597                       relname = _bfd_coff_internal_syment_name (abfd, &relsym,
1598                                                                 relbuf);
1599                       if (relname == NULL)
1600                         goto error_return;
1601
1602                       /* We only merge TOC entries if the TC name is
1603                          the same as the symbol name.  This handles
1604                          the normal case, but not common cases like
1605                          SYM.P4 which gcc generates to store SYM + 4
1606                          in the TOC.  FIXME.  */
1607                       if (strcmp (name, relname) == 0)
1608                         {
1609                           copy = (! info->keep_memory
1610                                   || relsym._n._n_n._n_zeroes != 0
1611                                   || relsym._n._n_n._n_offset == 0);
1612                           h = xcoff_link_hash_lookup (xcoff_hash_table (info),
1613                                                       relname, TRUE, copy,
1614                                                       FALSE);
1615                           if (h == NULL)
1616                             goto error_return;
1617
1618                           /* At this point h->root.type could be
1619                              bfd_link_hash_new.  That should be OK,
1620                              since we know for sure that we will come
1621                              across this symbol as we step through the
1622                              file.  */
1623
1624                           /* We store h in *sym_hash for the
1625                              convenience of the relocate_section
1626                              function.  */
1627                           *sym_hash = h;
1628
1629                           if (h->toc_section != NULL)
1630                             {
1631                               asection **rel_csects;
1632
1633                               /* We already have a TOC entry for this
1634                                  symbol, so we can just ignore this
1635                                  one.  */
1636                               rel_csects =
1637                                 reloc_info[enclosing->target_index].csects;
1638                               rel_csects[relindx] = bfd_und_section_ptr;
1639                               break;
1640                             }
1641
1642                           /* We are about to create a TOC entry for
1643                              this symbol.  */
1644                           set_toc = h;
1645                         }
1646                     }
1647                 }
1648             }
1649
1650           {
1651             asection *enclosing;
1652
1653             /* We need to create a new section.  We get the name from
1654                the csect storage mapping class, so that the linker can
1655                accumulate similar csects together.  */
1656
1657             csect = bfd_xcoff_create_csect_from_smclas(abfd, &aux, name);
1658             if (NULL == csect)
1659               goto error_return;
1660
1661             /* The enclosing section is the main section : .data, .text
1662                or .bss that the csect is coming from.  */
1663             enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum);
1664             if (enclosing == NULL)
1665               goto error_return;
1666
1667             if (! bfd_is_abs_section (enclosing)
1668                 && ((bfd_vma) sym.n_value < enclosing->vma
1669                     || ((bfd_vma) sym.n_value + aux.x_csect.x_scnlen.l
1670                         > enclosing->vma + enclosing->size)))
1671               {
1672                 (*_bfd_error_handler)
1673                   (_("%B: csect `%s' not in enclosing section"),
1674                    abfd, name);
1675                 bfd_set_error (bfd_error_bad_value);
1676                 goto error_return;
1677               }
1678             csect->vma = sym.n_value;
1679             csect->filepos = (enclosing->filepos
1680                               + sym.n_value
1681                               - enclosing->vma);
1682             csect->size = aux.x_csect.x_scnlen.l;
1683             csect->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS;
1684             csect->alignment_power = SMTYP_ALIGN (aux.x_csect.x_smtyp);
1685
1686             /* Record the enclosing section in the tdata for this new
1687                section.  */
1688             amt = sizeof (struct coff_section_tdata);
1689             csect->used_by_bfd = bfd_zalloc (abfd, amt);
1690             if (csect->used_by_bfd == NULL)
1691               goto error_return;
1692             amt = sizeof (struct xcoff_section_tdata);
1693             coff_section_data (abfd, csect)->tdata = bfd_zalloc (abfd, amt);
1694             if (coff_section_data (abfd, csect)->tdata == NULL)
1695               goto error_return;
1696             xcoff_section_data (abfd, csect)->enclosing = enclosing;
1697             xcoff_section_data (abfd, csect)->lineno_count =
1698               enclosing->lineno_count;
1699
1700             if (enclosing->owner == abfd)
1701               {
1702                 struct internal_reloc *relocs;
1703                 bfd_size_type relindx;
1704                 struct internal_reloc *rel;
1705                 asection **rel_csect;
1706
1707                 relocs = reloc_info[enclosing->target_index].relocs;
1708                 amt = enclosing->reloc_count;
1709                 relindx = xcoff_find_reloc (relocs, amt, csect->vma);
1710
1711                 rel = relocs + relindx;
1712                 rel_csect = (reloc_info[enclosing->target_index].csects
1713                              + relindx);
1714
1715                 csect->rel_filepos = (enclosing->rel_filepos
1716                                       + relindx * bfd_coff_relsz (abfd));
1717                 while (relindx < enclosing->reloc_count
1718                        && *rel_csect == NULL
1719                        && rel->r_vaddr < csect->vma + csect->size)
1720                   {
1721
1722                     *rel_csect = csect;
1723                     csect->flags |= SEC_RELOC;
1724                     ++csect->reloc_count;
1725                     ++relindx;
1726                     ++rel;
1727                     ++rel_csect;
1728                   }
1729               }
1730
1731             /* There are a number of other fields and section flags
1732                which we do not bother to set.  */
1733
1734             csect_index = ((esym
1735                             - (bfd_byte *) obj_coff_external_syms (abfd))
1736                            / symesz);
1737
1738             xcoff_section_data (abfd, csect)->first_symndx = csect_index;
1739
1740             if (first_csect == NULL)
1741               first_csect = csect;
1742
1743             /* If this symbol is external, we treat it as starting at the
1744                beginning of the newly created section.  */
1745             if (EXTERN_SYM_P (sym.n_sclass))
1746               {
1747                 section = csect;
1748                 value = 0;
1749               }
1750
1751             /* If this is a TOC section for a symbol, record it.  */
1752             if (set_toc != NULL)
1753               set_toc->toc_section = csect;
1754           }
1755           break;
1756
1757         case XTY_LD:
1758           /* This is a label definition.  The x_scnlen field is the
1759              symbol index of the csect.  Usually the XTY_LD symbol will
1760              follow its appropriate XTY_SD symbol.  The .set pseudo op can
1761              cause the XTY_LD to not follow the XTY_SD symbol. */
1762           {
1763             bfd_boolean bad;
1764
1765             bad = FALSE;
1766             if (aux.x_csect.x_scnlen.l < 0
1767                 || (aux.x_csect.x_scnlen.l
1768                     >= esym - (bfd_byte *) obj_coff_external_syms (abfd)))
1769               bad = TRUE;
1770             if (! bad)
1771               {
1772                 section = xcoff_data (abfd)->csects[aux.x_csect.x_scnlen.l];
1773                 if (section == NULL
1774                     || (section->flags & SEC_HAS_CONTENTS) == 0)
1775                   bad = TRUE;
1776               }
1777             if (bad)
1778               {
1779                 (*_bfd_error_handler)
1780                   (_("%B: misplaced XTY_LD `%s'"),
1781                    abfd, name);
1782                 bfd_set_error (bfd_error_bad_value);
1783                 goto error_return;
1784               }
1785             csect = section;
1786             value = sym.n_value - csect->vma;
1787           }
1788           break;
1789
1790         case XTY_CM:
1791           /* This is an unitialized csect.  We could base the name on
1792              the storage mapping class, but we don't bother except for
1793              an XMC_TD symbol.  If this csect is externally visible,
1794              it is a common symbol.  We put XMC_TD symbols in sections
1795              named .tocbss, and rely on the linker script to put that
1796              in the TOC area.  */
1797
1798           if (aux.x_csect.x_smclas == XMC_TD)
1799             {
1800               /* The linker script puts the .td section in the data
1801                  section after the .tc section.  */
1802               csect = bfd_make_section_anyway_with_flags (abfd, ".td",
1803                                                           SEC_ALLOC);
1804             }
1805           else
1806             csect = bfd_make_section_anyway_with_flags (abfd, ".bss",
1807                                                         SEC_ALLOC);
1808
1809           if (csect == NULL)
1810             goto error_return;
1811           csect->vma = sym.n_value;
1812           csect->size = aux.x_csect.x_scnlen.l;
1813           csect->alignment_power = SMTYP_ALIGN (aux.x_csect.x_smtyp);
1814           /* There are a number of other fields and section flags
1815              which we do not bother to set.  */
1816
1817           csect_index = ((esym
1818                           - (bfd_byte *) obj_coff_external_syms (abfd))
1819                          / symesz);
1820
1821           amt = sizeof (struct coff_section_tdata);
1822           csect->used_by_bfd = bfd_zalloc (abfd, amt);
1823           if (csect->used_by_bfd == NULL)
1824             goto error_return;
1825           amt = sizeof (struct xcoff_section_tdata);
1826           coff_section_data (abfd, csect)->tdata = bfd_zalloc (abfd, amt);
1827           if (coff_section_data (abfd, csect)->tdata == NULL)
1828             goto error_return;
1829           xcoff_section_data (abfd, csect)->first_symndx = csect_index;
1830
1831           if (first_csect == NULL)
1832             first_csect = csect;
1833
1834           if (EXTERN_SYM_P (sym.n_sclass))
1835             {
1836               csect->flags |= SEC_IS_COMMON;
1837               csect->size = 0;
1838               section = csect;
1839               value = aux.x_csect.x_scnlen.l;
1840             }
1841
1842           break;
1843         }
1844
1845       /* Check for magic symbol names.  */
1846       if ((smtyp == XTY_SD || smtyp == XTY_CM)
1847           && aux.x_csect.x_smclas != XMC_TC
1848           && aux.x_csect.x_smclas != XMC_TD)
1849         {
1850           int i = -1;
1851
1852           if (name[0] == '_')
1853             {
1854               if (strcmp (name, "_text") == 0)
1855                 i = XCOFF_SPECIAL_SECTION_TEXT;
1856               else if (strcmp (name, "_etext") == 0)
1857                 i = XCOFF_SPECIAL_SECTION_ETEXT;
1858               else if (strcmp (name, "_data") == 0)
1859                 i = XCOFF_SPECIAL_SECTION_DATA;
1860               else if (strcmp (name, "_edata") == 0)
1861                 i = XCOFF_SPECIAL_SECTION_EDATA;
1862               else if (strcmp (name, "_end") == 0)
1863                 i = XCOFF_SPECIAL_SECTION_END;
1864             }
1865           else if (name[0] == 'e' && strcmp (name, "end") == 0)
1866             i = XCOFF_SPECIAL_SECTION_END2;
1867
1868           if (i != -1)
1869             xcoff_hash_table (info)->special_sections[i] = csect;
1870         }
1871
1872       /* Now we have enough information to add the symbol to the
1873          linker hash table.  */
1874
1875       if (EXTERN_SYM_P (sym.n_sclass))
1876         {
1877           bfd_boolean copy;
1878           flagword flags;
1879
1880           BFD_ASSERT (section != NULL);
1881
1882           /* We must copy the name into memory if we got it from the
1883              syment itself, rather than the string table.  */
1884           copy = default_copy;
1885           if (sym._n._n_n._n_zeroes != 0
1886               || sym._n._n_n._n_offset == 0)
1887             copy = TRUE;
1888
1889           /* Ignore global linkage code when linking statically.  */
1890           if (info->static_link
1891               && (smtyp == XTY_SD || smtyp == XTY_LD)
1892               && aux.x_csect.x_smclas == XMC_GL)
1893             {
1894               section = bfd_und_section_ptr;
1895               value = 0;
1896             }
1897
1898           /* The AIX linker appears to only detect multiple symbol
1899              definitions when there is a reference to the symbol.  If
1900              a symbol is defined multiple times, and the only
1901              references are from the same object file, the AIX linker
1902              appears to permit it.  It does not merge the different
1903              definitions, but handles them independently.  On the
1904              other hand, if there is a reference, the linker reports
1905              an error.
1906
1907              This matters because the AIX <net/net_globals.h> header
1908              file actually defines an initialized array, so we have to
1909              actually permit that to work.
1910
1911              Just to make matters even more confusing, the AIX linker
1912              appears to permit multiple symbol definitions whenever
1913              the second definition is in an archive rather than an
1914              object file.  This may be a consequence of the manner in
1915              which it handles archives: I think it may load the entire
1916              archive in as separate csects, and then let garbage
1917              collection discard symbols.
1918
1919              We also have to handle the case of statically linking a
1920              shared object, which will cause symbol redefinitions,
1921              although this is an easier case to detect.  */
1922           else if (info->output_bfd->xvec == abfd->xvec)
1923             {
1924               if (! bfd_is_und_section (section))
1925                 *sym_hash = xcoff_link_hash_lookup (xcoff_hash_table (info),
1926                                                     name, TRUE, copy, FALSE);
1927               else
1928                 /* Make a copy of the symbol name to prevent problems with
1929                    merging symbols.  */
1930                 *sym_hash = ((struct xcoff_link_hash_entry *)
1931                              bfd_wrapped_link_hash_lookup (abfd, info, name,
1932                                                            TRUE, TRUE, FALSE));
1933
1934               if (*sym_hash == NULL)
1935                 goto error_return;
1936               if (((*sym_hash)->root.type == bfd_link_hash_defined
1937                    || (*sym_hash)->root.type == bfd_link_hash_defweak)
1938                   && ! bfd_is_und_section (section)
1939                   && ! bfd_is_com_section (section))
1940                 {
1941                   /* This is a second definition of a defined symbol.  */
1942                   if (((*sym_hash)->flags & XCOFF_DEF_REGULAR) == 0
1943                       && ((*sym_hash)->flags & XCOFF_DEF_DYNAMIC) != 0)
1944                     {
1945                       /* The existing symbol is from a shared library.
1946                          Replace it.  */
1947                       (*sym_hash)->root.type = bfd_link_hash_undefined;
1948                       (*sym_hash)->root.u.undef.abfd =
1949                         (*sym_hash)->root.u.def.section->owner;
1950                     }
1951                   else if (abfd->my_archive != NULL)
1952                     {
1953                       /* This is a redefinition in an object contained
1954                          in an archive.  Just ignore it.  See the
1955                          comment above.  */
1956                       section = bfd_und_section_ptr;
1957                       value = 0;
1958                     }
1959                   else if (sym.n_sclass == C_AIX_WEAKEXT
1960                            || (*sym_hash)->root.type == bfd_link_hash_defweak)
1961                     {
1962                       /* At least one of the definitions is weak.
1963                          Allow the normal rules to take effect.  */
1964                     }
1965                   else if ((*sym_hash)->root.u.undef.next != NULL
1966                            || info->hash->undefs_tail == &(*sym_hash)->root)
1967                     {
1968                       /* This symbol has been referenced.  In this
1969                          case, we just continue and permit the
1970                          multiple definition error.  See the comment
1971                          above about the behaviour of the AIX linker.  */
1972                     }
1973                   else if ((*sym_hash)->smclas == aux.x_csect.x_smclas)
1974                     {
1975                       /* The symbols are both csects of the same
1976                          class.  There is at least a chance that this
1977                          is a semi-legitimate redefinition.  */
1978                       section = bfd_und_section_ptr;
1979                       value = 0;
1980                       (*sym_hash)->flags |= XCOFF_MULTIPLY_DEFINED;
1981                     }
1982                 }
1983               else if (((*sym_hash)->flags & XCOFF_MULTIPLY_DEFINED) != 0
1984                        && (*sym_hash)->root.type == bfd_link_hash_defined
1985                        && (bfd_is_und_section (section)
1986                            || bfd_is_com_section (section)))
1987                 {
1988                   /* This is a reference to a multiply defined symbol.
1989                      Report the error now.  See the comment above
1990                      about the behaviour of the AIX linker.  We could
1991                      also do this with warning symbols, but I'm not
1992                      sure the XCOFF linker is wholly prepared to
1993                      handle them, and that would only be a warning,
1994                      not an error.  */
1995                   if (! ((*info->callbacks->multiple_definition)
1996                          (info, &(*sym_hash)->root, NULL, NULL, (bfd_vma) 0)))
1997                     goto error_return;
1998                   /* Try not to give this error too many times.  */
1999                   (*sym_hash)->flags &= ~XCOFF_MULTIPLY_DEFINED;
2000                 }
2001             }
2002
2003           /* _bfd_generic_link_add_one_symbol may call the linker to
2004              generate an error message, and the linker may try to read
2005              the symbol table to give a good error.  Right now, the
2006              line numbers are in an inconsistent state, since they are
2007              counted both in the real sections and in the new csects.
2008              We need to leave the count in the real sections so that
2009              the linker can report the line number of the error
2010              correctly, so temporarily clobber the link to the csects
2011              so that the linker will not try to read the line numbers
2012              a second time from the csects.  */
2013           BFD_ASSERT (last_real->next == first_csect);
2014           last_real->next = NULL;
2015           flags = (sym.n_sclass == C_EXT ? BSF_GLOBAL : BSF_WEAK);
2016           if (! (_bfd_generic_link_add_one_symbol
2017                  (info, abfd, name, flags, section, value,
2018                   NULL, copy, TRUE,
2019                   (struct bfd_link_hash_entry **) sym_hash)))
2020             goto error_return;
2021           last_real->next = first_csect;
2022
2023           if (smtyp == XTY_CM)
2024             {
2025               if ((*sym_hash)->root.type != bfd_link_hash_common
2026                   || (*sym_hash)->root.u.c.p->section != csect)
2027                 /* We don't need the common csect we just created.  */
2028                 csect->size = 0;
2029               else
2030                 (*sym_hash)->root.u.c.p->alignment_power
2031                   = csect->alignment_power;
2032             }
2033
2034           if (info->output_bfd->xvec == abfd->xvec)
2035             {
2036               int flag;
2037
2038               if (smtyp == XTY_ER
2039                   || smtyp == XTY_CM
2040                   || section == bfd_und_section_ptr)
2041                 flag = XCOFF_REF_REGULAR;
2042               else
2043                 flag = XCOFF_DEF_REGULAR;
2044               (*sym_hash)->flags |= flag;
2045
2046               if ((*sym_hash)->smclas == XMC_UA
2047                   || flag == XCOFF_DEF_REGULAR)
2048                 (*sym_hash)->smclas = aux.x_csect.x_smclas;
2049             }
2050         }
2051
2052       if (smtyp == XTY_ER)
2053         *csect_cache = section;
2054       else
2055         {
2056           *csect_cache = csect;
2057           if (csect != NULL)
2058             xcoff_section_data (abfd, csect)->last_symndx
2059               = (esym - (bfd_byte *) obj_coff_external_syms (abfd)) / symesz;
2060         }
2061
2062       esym += (sym.n_numaux + 1) * symesz;
2063       sym_hash += sym.n_numaux + 1;
2064       csect_cache += sym.n_numaux + 1;
2065       lineno_counts += sym.n_numaux + 1;
2066     }
2067
2068   BFD_ASSERT (last_real == NULL || last_real->next == first_csect);
2069
2070   /* Make sure that we have seen all the relocs.  */
2071   for (o = abfd->sections; o != first_csect; o = o->next)
2072     {
2073       /* Debugging sections have no csects.  */
2074       if (bfd_get_section_flags (abfd, o) & SEC_DEBUGGING)
2075         continue;
2076
2077       /* Reset the section size and the line number count, since the
2078          data is now attached to the csects.  Don't reset the size of
2079          the .debug section, since we need to read it below in
2080          bfd_xcoff_size_dynamic_sections.  */
2081       if (strcmp (bfd_get_section_name (abfd, o), ".debug") != 0)
2082         o->size = 0;
2083       o->lineno_count = 0;
2084
2085       if ((o->flags & SEC_RELOC) != 0)
2086         {
2087           bfd_size_type i;
2088           struct internal_reloc *rel;
2089           asection **rel_csect;
2090
2091           rel = reloc_info[o->target_index].relocs;
2092           rel_csect = reloc_info[o->target_index].csects;
2093
2094           for (i = 0; i < o->reloc_count; i++, rel++, rel_csect++)
2095             {
2096               if (*rel_csect == NULL)
2097                 {
2098                   (*_bfd_error_handler)
2099                     (_("%B: reloc %s:%d not in csect"),
2100                      abfd, o->name, i);
2101                   bfd_set_error (bfd_error_bad_value);
2102                   goto error_return;
2103                 }
2104
2105               /* We identify all function symbols that are the target
2106                  of a relocation, so that we can create glue code for
2107                  functions imported from dynamic objects.  */
2108               if (info->output_bfd->xvec == abfd->xvec
2109                   && *rel_csect != bfd_und_section_ptr
2110                   && obj_xcoff_sym_hashes (abfd)[rel->r_symndx] != NULL)
2111                 {
2112                   struct xcoff_link_hash_entry *h;
2113
2114                   h = obj_xcoff_sym_hashes (abfd)[rel->r_symndx];
2115                   /* If the symbol name starts with a period, it is
2116                      the code of a function.  If the symbol is
2117                      currently undefined, then add an undefined symbol
2118                      for the function descriptor.  This should do no
2119                      harm, because any regular object that defines the
2120                      function should also define the function
2121                      descriptor.  It helps, because it means that we
2122                      will identify the function descriptor with a
2123                      dynamic object if a dynamic object defines it.  */
2124                   if (h->root.root.string[0] == '.'
2125                       && h->descriptor == NULL)
2126                     {
2127                       struct xcoff_link_hash_entry *hds;
2128                       struct bfd_link_hash_entry *bh;
2129
2130                       hds = xcoff_link_hash_lookup (xcoff_hash_table (info),
2131                                                     h->root.root.string + 1,
2132                                                     TRUE, FALSE, TRUE);
2133                       if (hds == NULL)
2134                         goto error_return;
2135                       if (hds->root.type == bfd_link_hash_new)
2136                         {
2137                           bh = &hds->root;
2138                           if (! (_bfd_generic_link_add_one_symbol
2139                                  (info, abfd, hds->root.root.string,
2140                                   (flagword) 0, bfd_und_section_ptr,
2141                                   (bfd_vma) 0, NULL, FALSE,
2142                                   TRUE, &bh)))
2143                             goto error_return;
2144                           hds = (struct xcoff_link_hash_entry *) bh;
2145                         }
2146                       hds->flags |= XCOFF_DESCRIPTOR;
2147                       BFD_ASSERT ((h->flags & XCOFF_DESCRIPTOR) == 0);
2148                       hds->descriptor = h;
2149                       h->descriptor = hds;
2150                     }
2151                   if (h->root.root.string[0] == '.')
2152                     h->flags |= XCOFF_CALLED;
2153                 }
2154             }
2155
2156           free (reloc_info[o->target_index].csects);
2157           reloc_info[o->target_index].csects = NULL;
2158
2159           /* Reset SEC_RELOC and the reloc_count, since the reloc
2160              information is now attached to the csects.  */
2161           o->flags &=~ SEC_RELOC;
2162           o->reloc_count = 0;
2163
2164           /* If we are not keeping memory, free the reloc information.  */
2165           if (! info->keep_memory
2166               && coff_section_data (abfd, o) != NULL
2167               && coff_section_data (abfd, o)->relocs != NULL
2168               && ! coff_section_data (abfd, o)->keep_relocs)
2169             {
2170               free (coff_section_data (abfd, o)->relocs);
2171               coff_section_data (abfd, o)->relocs = NULL;
2172             }
2173         }
2174
2175       /* Free up the line numbers.  FIXME: We could cache these
2176          somewhere for the final link, to avoid reading them again.  */
2177       if (reloc_info[o->target_index].linenos != NULL)
2178         {
2179           free (reloc_info[o->target_index].linenos);
2180           reloc_info[o->target_index].linenos = NULL;
2181         }
2182     }
2183
2184   free (reloc_info);
2185
2186   obj_coff_keep_syms (abfd) = keep_syms;
2187
2188   return TRUE;
2189
2190  error_return:
2191   if (reloc_info != NULL)
2192     {
2193       for (o = abfd->sections; o != NULL; o = o->next)
2194         {
2195           if (reloc_info[o->target_index].csects != NULL)
2196             free (reloc_info[o->target_index].csects);
2197           if (reloc_info[o->target_index].linenos != NULL)
2198             free (reloc_info[o->target_index].linenos);
2199         }
2200       free (reloc_info);
2201     }
2202   obj_coff_keep_syms (abfd) = keep_syms;
2203   return FALSE;
2204 }
2205
2206 #undef N_TMASK
2207 #undef N_BTSHFT
2208
2209 /* Add symbols from an XCOFF object file.  */
2210
2211 static bfd_boolean
2212 xcoff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
2213 {
2214   if (! _bfd_coff_get_external_symbols (abfd))
2215     return FALSE;
2216   if (! xcoff_link_add_symbols (abfd, info))
2217     return FALSE;
2218   if (! info->keep_memory)
2219     {
2220       if (! _bfd_coff_free_symbols (abfd))
2221         return FALSE;
2222     }
2223   return TRUE;
2224 }
2225
2226 /* Look through the loader symbols to see if this dynamic object
2227    should be included in the link.  The native linker uses the loader
2228    symbols, not the normal symbol table, so we do too.  */
2229
2230 static bfd_boolean
2231 xcoff_link_check_dynamic_ar_symbols (bfd *abfd,
2232                                      struct bfd_link_info *info,
2233                                      bfd_boolean *pneeded,
2234                                      bfd **subsbfd)
2235 {
2236   asection *lsec;
2237   bfd_byte *contents;
2238   struct internal_ldhdr ldhdr;
2239   const char *strings;
2240   bfd_byte *elsym, *elsymend;
2241
2242   *pneeded = FALSE;
2243
2244   lsec = bfd_get_section_by_name (abfd, ".loader");
2245   if (lsec == NULL)
2246     /* There are no symbols, so don't try to include it.  */
2247     return TRUE;
2248
2249   if (! xcoff_get_section_contents (abfd, lsec))
2250     return FALSE;
2251   contents = coff_section_data (abfd, lsec)->contents;
2252
2253   bfd_xcoff_swap_ldhdr_in (abfd, contents, &ldhdr);
2254
2255   strings = (char *) contents + ldhdr.l_stoff;
2256
2257   elsym = contents + bfd_xcoff_loader_symbol_offset (abfd, &ldhdr);
2258
2259   elsymend = elsym + ldhdr.l_nsyms * bfd_xcoff_ldsymsz (abfd);
2260   for (; elsym < elsymend; elsym += bfd_xcoff_ldsymsz (abfd))
2261     {
2262       struct internal_ldsym ldsym;
2263       char nambuf[SYMNMLEN + 1];
2264       const char *name;
2265       struct bfd_link_hash_entry *h;
2266
2267       bfd_xcoff_swap_ldsym_in (abfd, elsym, &ldsym);
2268
2269       /* We are only interested in exported symbols.  */
2270       if ((ldsym.l_smtype & L_EXPORT) == 0)
2271         continue;
2272
2273       if (ldsym._l._l_l._l_zeroes == 0)
2274         name = strings + ldsym._l._l_l._l_offset;
2275       else
2276         {
2277           memcpy (nambuf, ldsym._l._l_name, SYMNMLEN);
2278           nambuf[SYMNMLEN] = '\0';
2279           name = nambuf;
2280         }
2281
2282       h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
2283
2284       /* We are only interested in symbols that are currently
2285          undefined.  At this point we know that we are using an XCOFF
2286          hash table.  */
2287       if (h != NULL
2288           && h->type == bfd_link_hash_undefined
2289           && (((struct xcoff_link_hash_entry *) h)->flags
2290               & XCOFF_DEF_DYNAMIC) == 0)
2291         {
2292           if (!(*info->callbacks
2293                 ->add_archive_element) (info, abfd, name, subsbfd))
2294             return FALSE;
2295           *pneeded = TRUE;
2296           return TRUE;
2297         }
2298     }
2299
2300   /* We do not need this shared object.  */
2301   if (contents != NULL && ! coff_section_data (abfd, lsec)->keep_contents)
2302     {
2303       free (coff_section_data (abfd, lsec)->contents);
2304       coff_section_data (abfd, lsec)->contents = NULL;
2305     }
2306
2307   return TRUE;
2308 }
2309
2310 /* Look through the symbols to see if this object file should be
2311    included in the link.  */
2312
2313 static bfd_boolean
2314 xcoff_link_check_ar_symbols (bfd *abfd,
2315                              struct bfd_link_info *info,
2316                              bfd_boolean *pneeded,
2317                              bfd **subsbfd)
2318 {
2319   bfd_size_type symesz;
2320   bfd_byte *esym;
2321   bfd_byte *esym_end;
2322
2323   *pneeded = FALSE;
2324
2325   if ((abfd->flags & DYNAMIC) != 0
2326       && ! info->static_link
2327       && info->output_bfd->xvec == abfd->xvec)
2328     return xcoff_link_check_dynamic_ar_symbols (abfd, info, pneeded, subsbfd);
2329
2330   symesz = bfd_coff_symesz (abfd);
2331   esym = (bfd_byte *) obj_coff_external_syms (abfd);
2332   esym_end = esym + obj_raw_syment_count (abfd) * symesz;
2333   while (esym < esym_end)
2334     {
2335       struct internal_syment sym;
2336
2337       bfd_coff_swap_sym_in (abfd, (void *) esym, (void *) &sym);
2338
2339       if (EXTERN_SYM_P (sym.n_sclass) && sym.n_scnum != N_UNDEF)
2340         {
2341           const char *name;
2342           char buf[SYMNMLEN + 1];
2343           struct bfd_link_hash_entry *h;
2344
2345           /* This symbol is externally visible, and is defined by this
2346              object file.  */
2347           name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
2348
2349           if (name == NULL)
2350             return FALSE;
2351           h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
2352
2353           /* We are only interested in symbols that are currently
2354              undefined.  If a symbol is currently known to be common,
2355              XCOFF linkers do not bring in an object file which
2356              defines it.  We also don't bring in symbols to satisfy
2357              undefined references in shared objects.  */
2358           if (h != NULL
2359               && h->type == bfd_link_hash_undefined
2360               && (info->output_bfd->xvec != abfd->xvec
2361                   || (((struct xcoff_link_hash_entry *) h)->flags
2362                       & XCOFF_DEF_DYNAMIC) == 0))
2363             {
2364               if (!(*info->callbacks
2365                     ->add_archive_element) (info, abfd, name, subsbfd))
2366                 return FALSE;
2367               *pneeded = TRUE;
2368               return TRUE;
2369             }
2370         }
2371
2372       esym += (sym.n_numaux + 1) * symesz;
2373     }
2374
2375   /* We do not need this object file.  */
2376   return TRUE;
2377 }
2378
2379 /* Check a single archive element to see if we need to include it in
2380    the link.  *PNEEDED is set according to whether this element is
2381    needed in the link or not.  This is called via
2382    _bfd_generic_link_add_archive_symbols.  */
2383
2384 static bfd_boolean
2385 xcoff_link_check_archive_element (bfd *abfd,
2386                                   struct bfd_link_info *info,
2387                                   bfd_boolean *pneeded)
2388 {
2389   bfd_boolean keep_syms_p;
2390   bfd *oldbfd;
2391
2392   keep_syms_p = (obj_coff_external_syms (abfd) != NULL);
2393   if (!_bfd_coff_get_external_symbols (abfd))
2394     return FALSE;
2395
2396   oldbfd = abfd;
2397   if (!xcoff_link_check_ar_symbols (abfd, info, pneeded, &abfd))
2398     return FALSE;
2399
2400   if (*pneeded)
2401     {
2402       /* Potentially, the add_archive_element hook may have set a
2403          substitute BFD for us.  */
2404       if (abfd != oldbfd)
2405         {
2406           if (!keep_syms_p
2407               && !_bfd_coff_free_symbols (oldbfd))
2408             return FALSE;
2409           keep_syms_p = (obj_coff_external_syms (abfd) != NULL);
2410           if (!_bfd_coff_get_external_symbols (abfd))
2411             return FALSE;
2412         }
2413       if (!xcoff_link_add_symbols (abfd, info))
2414         return FALSE;
2415       if (info->keep_memory)
2416         keep_syms_p = TRUE;
2417     }
2418
2419   if (!keep_syms_p)
2420     {
2421       if (!_bfd_coff_free_symbols (abfd))
2422         return FALSE;
2423     }
2424
2425   return TRUE;
2426 }
2427
2428 /* Given an XCOFF BFD, add symbols to the global hash table as
2429    appropriate.  */
2430
2431 bfd_boolean
2432 _bfd_xcoff_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
2433 {
2434   switch (bfd_get_format (abfd))
2435     {
2436     case bfd_object:
2437       return xcoff_link_add_object_symbols (abfd, info);
2438
2439     case bfd_archive:
2440       /* If the archive has a map, do the usual search.  We then need
2441          to check the archive for dynamic objects, because they may not
2442          appear in the archive map even though they should, perhaps, be
2443          included.  If the archive has no map, we just consider each object
2444          file in turn, since that apparently is what the AIX native linker
2445          does.  */
2446       if (bfd_has_map (abfd))
2447         {
2448           if (! (_bfd_generic_link_add_archive_symbols
2449                  (abfd, info, xcoff_link_check_archive_element)))
2450             return FALSE;
2451         }
2452
2453       {
2454         bfd *member;
2455
2456         member = bfd_openr_next_archived_file (abfd, NULL);
2457         while (member != NULL)
2458           {
2459             if (bfd_check_format (member, bfd_object)
2460                 && (info->output_bfd->xvec == member->xvec)
2461                 && (! bfd_has_map (abfd) || (member->flags & DYNAMIC) != 0))
2462               {
2463                 bfd_boolean needed;
2464
2465                 if (! xcoff_link_check_archive_element (member, info,
2466                                                         &needed))
2467                   return FALSE;
2468                 if (needed)
2469                   member->archive_pass = -1;
2470               }
2471             member = bfd_openr_next_archived_file (abfd, member);
2472           }
2473       }
2474
2475       return TRUE;
2476
2477     default:
2478       bfd_set_error (bfd_error_wrong_format);
2479       return FALSE;
2480     }
2481 }
2482 \f
2483 bfd_boolean
2484 _bfd_xcoff_define_common_symbol (bfd *output_bfd ATTRIBUTE_UNUSED,
2485                                  struct bfd_link_info *info ATTRIBUTE_UNUSED,
2486                                  struct bfd_link_hash_entry *harg)
2487 {
2488   struct xcoff_link_hash_entry *h;
2489
2490   if (!bfd_generic_define_common_symbol (output_bfd, info, harg))
2491     return FALSE;
2492
2493   h = (struct xcoff_link_hash_entry *) harg;
2494   h->flags |= XCOFF_DEF_REGULAR;
2495   return TRUE;
2496 }
2497 \f
2498 /* If symbol H has not been interpreted as a function descriptor,
2499    see whether it should be.  Set up its descriptor information if so.  */
2500
2501 static bfd_boolean
2502 xcoff_find_function (struct bfd_link_info *info,
2503                      struct xcoff_link_hash_entry *h)
2504 {
2505   if ((h->flags & XCOFF_DESCRIPTOR) == 0
2506       && h->root.root.string[0] != '.')
2507     {
2508       char *fnname;
2509       struct xcoff_link_hash_entry *hfn;
2510       bfd_size_type amt;
2511
2512       amt = strlen (h->root.root.string) + 2;
2513       fnname = bfd_malloc (amt);
2514       if (fnname == NULL)
2515         return FALSE;
2516       fnname[0] = '.';
2517       strcpy (fnname + 1, h->root.root.string);
2518       hfn = xcoff_link_hash_lookup (xcoff_hash_table (info),
2519                                     fnname, FALSE, FALSE, TRUE);
2520       free (fnname);
2521       if (hfn != NULL
2522           && hfn->smclas == XMC_PR
2523           && (hfn->root.type == bfd_link_hash_defined
2524               || hfn->root.type == bfd_link_hash_defweak))
2525         {
2526           h->flags |= XCOFF_DESCRIPTOR;
2527           h->descriptor = hfn;
2528           hfn->descriptor = h;
2529         }
2530     }
2531   return TRUE;
2532 }
2533 \f
2534 /* Return true if the given bfd contains at least one shared object.  */
2535
2536 static bfd_boolean
2537 xcoff_archive_contains_shared_object_p (struct bfd_link_info *info,
2538                                         bfd *archive)
2539 {
2540   struct xcoff_archive_info *archive_info;
2541   bfd *member;
2542
2543   archive_info = xcoff_get_archive_info (info, archive);
2544   if (!archive_info->know_contains_shared_object_p)
2545     {
2546       member = bfd_openr_next_archived_file (archive, NULL);
2547       while (member != NULL && (member->flags & DYNAMIC) == 0)
2548         member = bfd_openr_next_archived_file (archive, member);
2549
2550       archive_info->contains_shared_object_p = (member != NULL);
2551       archive_info->know_contains_shared_object_p = 1;
2552     }
2553   return archive_info->contains_shared_object_p;
2554 }
2555
2556 /* Symbol H qualifies for export by -bexpfull.  Return true if it also
2557    qualifies for export by -bexpall.  */
2558
2559 static bfd_boolean
2560 xcoff_covered_by_expall_p (struct xcoff_link_hash_entry *h)
2561 {
2562   /* Exclude symbols beginning with '_'.  */
2563   if (h->root.root.string[0] == '_')
2564     return FALSE;
2565
2566   /* Exclude archive members that would otherwise be unreferenced.  */
2567   if ((h->flags & XCOFF_MARK) == 0
2568       && (h->root.type == bfd_link_hash_defined
2569           || h->root.type == bfd_link_hash_defweak)
2570       && h->root.u.def.section->owner != NULL
2571       && h->root.u.def.section->owner->my_archive != NULL)
2572     return FALSE;
2573
2574   return TRUE;
2575 }
2576
2577 /* Return true if symbol H qualifies for the forms of automatic export
2578    specified by AUTO_EXPORT_FLAGS.  */
2579
2580 static bfd_boolean
2581 xcoff_auto_export_p (struct bfd_link_info *info,
2582                      struct xcoff_link_hash_entry *h,
2583                      unsigned int auto_export_flags)
2584 {
2585   /* Don't automatically export things that were explicitly exported.  */
2586   if ((h->flags & XCOFF_EXPORT) != 0)
2587     return FALSE;
2588
2589   /* Don't export things that we don't define.  */
2590   if ((h->flags & XCOFF_DEF_REGULAR) == 0)
2591     return FALSE;
2592
2593   /* Don't export functions; export their descriptors instead.  */
2594   if (h->root.root.string[0] == '.')
2595     return FALSE;
2596
2597   /* We don't export a symbol which is being defined by an object
2598      included from an archive which contains a shared object.  The
2599      rationale is that if an archive contains both an unshared and
2600      a shared object, then there must be some reason that the
2601      unshared object is unshared, and we don't want to start
2602      providing a shared version of it.  In particular, this solves
2603      a bug involving the _savefNN set of functions.  gcc will call
2604      those functions without providing a slot to restore the TOC,
2605      so it is essential that these functions be linked in directly
2606      and not from a shared object, which means that a shared
2607      object which also happens to link them in must not export
2608      them.  This is confusing, but I haven't been able to think of
2609      a different approach.  Note that the symbols can, of course,
2610      be exported explicitly.  */
2611   if (h->root.type == bfd_link_hash_defined
2612       || h->root.type == bfd_link_hash_defweak)
2613     {
2614       bfd *owner;
2615
2616       owner = h->root.u.def.section->owner;
2617       if (owner != NULL
2618           && owner->my_archive != NULL
2619           && xcoff_archive_contains_shared_object_p (info, owner->my_archive))
2620         return FALSE;
2621     }
2622
2623   /* Otherwise, all symbols are exported by -bexpfull.  */
2624   if ((auto_export_flags & XCOFF_EXPFULL) != 0)
2625     return TRUE;
2626
2627   /* Despite its name, -bexpall exports most but not all symbols.  */
2628   if ((auto_export_flags & XCOFF_EXPALL) != 0
2629       && xcoff_covered_by_expall_p (h))
2630     return TRUE;
2631
2632   return FALSE;
2633 }
2634 \f
2635 /* Return true if relocation REL needs to be copied to the .loader section.
2636    If REL is against a global symbol, H is that symbol, otherwise it
2637    is null.  */
2638
2639 static bfd_boolean
2640 xcoff_need_ldrel_p (struct bfd_link_info *info, struct internal_reloc *rel,
2641                     struct xcoff_link_hash_entry *h)
2642 {
2643   if (!xcoff_hash_table (info)->loader_section)
2644     return FALSE;
2645
2646   switch (rel->r_type)
2647     {
2648     case R_TOC:
2649     case R_GL:
2650     case R_TCL:
2651     case R_TRL:
2652     case R_TRLA:
2653       /* We should never need a .loader reloc for a TOC-relative reloc.  */
2654       return FALSE;
2655
2656     default:
2657       /* In this case, relocations against defined symbols can be resolved
2658          statically.  */
2659       if (h == NULL
2660           || h->root.type == bfd_link_hash_defined
2661           || h->root.type == bfd_link_hash_defweak
2662           || h->root.type == bfd_link_hash_common)
2663         return FALSE;
2664
2665       /* We will always provide a local definition of function symbols,
2666          even if we don't have one yet.  */
2667       if ((h->flags & XCOFF_CALLED) != 0)
2668         return FALSE;
2669
2670       return TRUE;
2671
2672     case R_POS:
2673     case R_NEG:
2674     case R_RL:
2675     case R_RLA:
2676       /* Absolute relocations against absolute symbols can be
2677          resolved statically.  */
2678       if (h != NULL
2679           && (h->root.type == bfd_link_hash_defined
2680               || h->root.type == bfd_link_hash_defweak)
2681           && bfd_is_abs_section (h->root.u.def.section))
2682         return FALSE;
2683
2684       return TRUE;
2685     }
2686 }
2687 \f
2688 /* Mark a symbol as not being garbage, including the section in which
2689    it is defined.  */
2690
2691 static inline bfd_boolean
2692 xcoff_mark_symbol (struct bfd_link_info *info, struct xcoff_link_hash_entry *h)
2693 {
2694   if ((h->flags & XCOFF_MARK) != 0)
2695     return TRUE;
2696
2697   h->flags |= XCOFF_MARK;
2698
2699   /* If we're marking an undefined symbol, try find some way of
2700      defining it.  */
2701   if (!info->relocatable
2702       && (h->flags & XCOFF_IMPORT) == 0
2703       && (h->flags & XCOFF_DEF_REGULAR) == 0
2704       && (h->root.type == bfd_link_hash_undefined
2705           || h->root.type == bfd_link_hash_undefweak))
2706     {
2707       /* First check whether this symbol can be interpreted as an
2708          undefined function descriptor for a defined function symbol.  */
2709       if (!xcoff_find_function (info, h))
2710         return FALSE;
2711
2712       if ((h->flags & XCOFF_DESCRIPTOR) != 0
2713           && (h->descriptor->root.type == bfd_link_hash_defined
2714               || h->descriptor->root.type == bfd_link_hash_defweak))
2715         {
2716           /* This is a descriptor for a defined symbol, but the input
2717              objects have not defined the descriptor itself.  Fill in
2718              the definition automatically.
2719
2720              Note that we do this even if we found a dynamic definition
2721              of H.  The local function definition logically overrides
2722              the dynamic one.  */
2723           asection *sec;
2724
2725           sec = xcoff_hash_table (info)->descriptor_section;
2726           h->root.type = bfd_link_hash_defined;
2727           h->root.u.def.section = sec;
2728           h->root.u.def.value = sec->size;
2729           h->smclas = XMC_DS;
2730           h->flags |= XCOFF_DEF_REGULAR;
2731
2732           /* The size of the function descriptor depends on whether this
2733              is xcoff32 (12) or xcoff64 (24).  */
2734           sec->size += bfd_xcoff_function_descriptor_size (sec->owner);
2735
2736           /* A function descriptor uses two relocs: one for the
2737              associated code, and one for the TOC address.  */
2738           xcoff_hash_table (info)->ldrel_count += 2;
2739           sec->reloc_count += 2;
2740
2741           /* Mark the function itself.  */
2742           if (!xcoff_mark_symbol (info, h->descriptor))
2743             return FALSE;
2744
2745           /* Mark the TOC section, so that we get an anchor
2746              to relocate against.  */
2747           if (!xcoff_mark (info, xcoff_hash_table (info)->toc_section))
2748             return FALSE;
2749
2750           /* We handle writing out the contents of the descriptor in
2751              xcoff_write_global_symbol.  */
2752         }
2753       else if (info->static_link)
2754         /* We can't get a symbol value dynamically, so just assume
2755            that it's undefined.  */
2756         h->flags |= XCOFF_WAS_UNDEFINED;
2757       else if ((h->flags & XCOFF_CALLED) != 0)
2758         {
2759           /* This is a function symbol for which we need to create
2760              linkage code.  */
2761           asection *sec;
2762           struct xcoff_link_hash_entry *hds;
2763
2764           /* Mark the descriptor (and its TOC section).  */
2765           hds = h->descriptor;
2766           BFD_ASSERT ((hds->root.type == bfd_link_hash_undefined
2767                        || hds->root.type == bfd_link_hash_undefweak)
2768                       && (hds->flags & XCOFF_DEF_REGULAR) == 0);
2769           if (!xcoff_mark_symbol (info, hds))
2770             return FALSE;
2771
2772           /* Treat this symbol as undefined if the descriptor was.  */
2773           if ((hds->flags & XCOFF_WAS_UNDEFINED) != 0)
2774             h->flags |= XCOFF_WAS_UNDEFINED;
2775
2776           /* Allocate room for the global linkage code itself.  */
2777           sec = xcoff_hash_table (info)->linkage_section;
2778           h->root.type = bfd_link_hash_defined;
2779           h->root.u.def.section = sec;
2780           h->root.u.def.value = sec->size;
2781           h->smclas = XMC_GL;
2782           h->flags |= XCOFF_DEF_REGULAR;
2783           sec->size += bfd_xcoff_glink_code_size (info->output_bfd);
2784
2785           /* The global linkage code requires a TOC entry for the
2786              descriptor.  */
2787           if (hds->toc_section == NULL)
2788             {
2789               int byte_size;
2790
2791               /* 32 vs 64
2792                  xcoff32 uses 4 bytes in the toc.
2793                  xcoff64 uses 8 bytes in the toc.  */
2794               if (bfd_xcoff_is_xcoff64 (info->output_bfd))
2795                 byte_size = 8;
2796               else if (bfd_xcoff_is_xcoff32 (info->output_bfd))
2797                 byte_size = 4;
2798               else
2799                 return FALSE;
2800
2801               /* Allocate room in the fallback TOC section.  */
2802               hds->toc_section = xcoff_hash_table (info)->toc_section;
2803               hds->u.toc_offset = hds->toc_section->size;
2804               hds->toc_section->size += byte_size;
2805               if (!xcoff_mark (info, hds->toc_section))
2806                 return FALSE;
2807
2808               /* Allocate room for a static and dynamic R_TOC
2809                  relocation.  */
2810               ++xcoff_hash_table (info)->ldrel_count;
2811               ++hds->toc_section->reloc_count;
2812
2813               /* Set the index to -2 to force this symbol to
2814                  get written out.  */
2815               hds->indx = -2;
2816               hds->flags |= XCOFF_SET_TOC | XCOFF_LDREL;
2817             }
2818         }
2819       else if ((h->flags & XCOFF_DEF_DYNAMIC) == 0)
2820         {
2821           /* Record that the symbol was undefined, then import it.
2822              -brtl links use a special fake import file.  */
2823           h->flags |= XCOFF_WAS_UNDEFINED | XCOFF_IMPORT;
2824           if (xcoff_hash_table (info)->rtld)
2825             {
2826               if (!xcoff_set_import_path (info, h, "", "..", ""))
2827                 return FALSE;
2828             }
2829           else
2830             {
2831               if (!xcoff_set_import_path (info, h, NULL, NULL, NULL))
2832                 return FALSE;
2833             }
2834         }
2835     }
2836
2837   if (h->root.type == bfd_link_hash_defined
2838       || h->root.type == bfd_link_hash_defweak)
2839     {
2840       asection *hsec;
2841
2842       hsec = h->root.u.def.section;
2843       if (! bfd_is_abs_section (hsec)
2844           && (hsec->flags & SEC_MARK) == 0)
2845         {
2846           if (! xcoff_mark (info, hsec))
2847             return FALSE;
2848         }
2849     }
2850
2851   if (h->toc_section != NULL
2852       && (h->toc_section->flags & SEC_MARK) == 0)
2853     {
2854       if (! xcoff_mark (info, h->toc_section))
2855         return FALSE;
2856     }
2857
2858   return TRUE;
2859 }
2860
2861 /* Look for a symbol called NAME.  If the symbol is defined, mark it.
2862    If the symbol exists, set FLAGS.  */
2863
2864 static bfd_boolean
2865 xcoff_mark_symbol_by_name (struct bfd_link_info *info,
2866                            const char *name, unsigned int flags)
2867 {
2868   struct xcoff_link_hash_entry *h;
2869
2870   h = xcoff_link_hash_lookup (xcoff_hash_table (info), name,
2871                               FALSE, FALSE, TRUE);
2872   if (h != NULL)
2873     {
2874       h->flags |= flags;
2875       if (h->root.type == bfd_link_hash_defined
2876           || h->root.type == bfd_link_hash_defweak)
2877         {
2878           if (!xcoff_mark (info, h->root.u.def.section))
2879             return FALSE;
2880         }
2881     }
2882   return TRUE;
2883 }
2884
2885 /* The mark phase of garbage collection.  For a given section, mark
2886    it, and all the sections which define symbols to which it refers.
2887    Because this function needs to look at the relocs, we also count
2888    the number of relocs which need to be copied into the .loader
2889    section.  */
2890
2891 static bfd_boolean
2892 xcoff_mark (struct bfd_link_info *info, asection *sec)
2893 {
2894   if (bfd_is_abs_section (sec)
2895       || (sec->flags & SEC_MARK) != 0)
2896     return TRUE;
2897
2898   sec->flags |= SEC_MARK;
2899
2900   if (sec->owner->xvec == info->output_bfd->xvec
2901       && coff_section_data (sec->owner, sec) != NULL
2902       && xcoff_section_data (sec->owner, sec) != NULL)
2903     {
2904       struct xcoff_link_hash_entry **syms;
2905       struct internal_reloc *rel, *relend;
2906       asection **csects;
2907       unsigned long i, first, last;
2908
2909       /* Mark all the symbols in this section.  */
2910       syms = obj_xcoff_sym_hashes (sec->owner);
2911       csects = xcoff_data (sec->owner)->csects;
2912       first = xcoff_section_data (sec->owner, sec)->first_symndx;
2913       last = xcoff_section_data (sec->owner, sec)->last_symndx;
2914       for (i = first; i <= last; i++)
2915         if (csects[i] == sec
2916             && syms[i] != NULL
2917             && (syms[i]->flags & XCOFF_MARK) == 0)
2918           {
2919             if (!xcoff_mark_symbol (info, syms[i]))
2920               return FALSE;
2921           }
2922
2923       /* Look through the section relocs.  */
2924       if ((sec->flags & SEC_RELOC) != 0
2925           && sec->reloc_count > 0)
2926         {
2927           rel = xcoff_read_internal_relocs (sec->owner, sec, TRUE,
2928                                             NULL, FALSE, NULL);
2929           if (rel == NULL)
2930             return FALSE;
2931           relend = rel + sec->reloc_count;
2932           for (; rel < relend; rel++)
2933             {
2934               struct xcoff_link_hash_entry *h;
2935
2936               if ((unsigned int) rel->r_symndx
2937                   > obj_raw_syment_count (sec->owner))
2938                 continue;
2939
2940               h = obj_xcoff_sym_hashes (sec->owner)[rel->r_symndx];
2941               if (h != NULL)
2942                 {
2943                   if ((h->flags & XCOFF_MARK) == 0)
2944                     {
2945                       if (!xcoff_mark_symbol (info, h))
2946                         return FALSE;
2947                     }
2948                 }
2949               else
2950                 {
2951                   asection *rsec;
2952
2953                   rsec = xcoff_data (sec->owner)->csects[rel->r_symndx];
2954                   if (rsec != NULL
2955                       && (rsec->flags & SEC_MARK) == 0)
2956                     {
2957                       if (!xcoff_mark (info, rsec))
2958                         return FALSE;
2959                     }
2960                 }
2961
2962               /* See if this reloc needs to be copied into the .loader
2963                  section.  */
2964               if (xcoff_need_ldrel_p (info, rel, h))
2965                 {
2966                   ++xcoff_hash_table (info)->ldrel_count;
2967                   if (h != NULL)
2968                     h->flags |= XCOFF_LDREL;
2969                 }
2970             }
2971
2972           if (! info->keep_memory
2973               && coff_section_data (sec->owner, sec) != NULL
2974               && coff_section_data (sec->owner, sec)->relocs != NULL
2975               && ! coff_section_data (sec->owner, sec)->keep_relocs)
2976             {
2977               free (coff_section_data (sec->owner, sec)->relocs);
2978               coff_section_data (sec->owner, sec)->relocs = NULL;
2979             }
2980         }
2981     }
2982
2983   return TRUE;
2984 }
2985
2986 /* Routines that are called after all the input files have been
2987    handled, but before the sections are laid out in memory.  */
2988
2989 /* The sweep phase of garbage collection.  Remove all garbage
2990    sections.  */
2991
2992 static void
2993 xcoff_sweep (struct bfd_link_info *info)
2994 {
2995   bfd *sub;
2996
2997   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
2998     {
2999       asection *o;
3000
3001       for (o = sub->sections; o != NULL; o = o->next)
3002         {
3003           if ((o->flags & SEC_MARK) == 0)
3004             {
3005               /* Keep all sections from non-XCOFF input files.  Keep
3006                  special sections.  Keep .debug sections for the
3007                  moment.  */
3008               if (sub->xvec != info->output_bfd->xvec
3009                   || o == xcoff_hash_table (info)->debug_section
3010                   || o == xcoff_hash_table (info)->loader_section
3011                   || o == xcoff_hash_table (info)->linkage_section
3012                   || o == xcoff_hash_table (info)->descriptor_section
3013                   || (bfd_get_section_flags (sub, o) & SEC_DEBUGGING)
3014                   || strcmp (o->name, ".debug") == 0)
3015                 o->flags |= SEC_MARK;
3016               else
3017                 {
3018                   o->size = 0;
3019                   o->reloc_count = 0;
3020                 }
3021             }
3022         }
3023     }
3024 }
3025
3026 /* Record the number of elements in a set.  This is used to output the
3027    correct csect length.  */
3028
3029 bfd_boolean
3030 bfd_xcoff_link_record_set (bfd *output_bfd,
3031                            struct bfd_link_info *info,
3032                            struct bfd_link_hash_entry *harg,
3033                            bfd_size_type size)
3034 {
3035   struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
3036   struct xcoff_link_size_list *n;
3037   bfd_size_type amt;
3038
3039   if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3040     return TRUE;
3041
3042   /* This will hardly ever be called.  I don't want to burn four bytes
3043      per global symbol, so instead the size is kept on a linked list
3044      attached to the hash table.  */
3045   amt = sizeof (* n);
3046   n = bfd_alloc (output_bfd, amt);
3047   if (n == NULL)
3048     return FALSE;
3049   n->next = xcoff_hash_table (info)->size_list;
3050   n->h = h;
3051   n->size = size;
3052   xcoff_hash_table (info)->size_list = n;
3053
3054   h->flags |= XCOFF_HAS_SIZE;
3055
3056   return TRUE;
3057 }
3058
3059 /* Import a symbol.  */
3060
3061 bfd_boolean
3062 bfd_xcoff_import_symbol (bfd *output_bfd,
3063                          struct bfd_link_info *info,
3064                          struct bfd_link_hash_entry *harg,
3065                          bfd_vma val,
3066                          const char *imppath,
3067                          const char *impfile,
3068                          const char *impmember,
3069                          unsigned int syscall_flag)
3070 {
3071   struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
3072
3073   if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3074     return TRUE;
3075
3076   /* A symbol name which starts with a period is the code for a
3077      function.  If the symbol is undefined, then add an undefined
3078      symbol for the function descriptor, and import that instead.  */
3079   if (h->root.root.string[0] == '.'
3080       && h->root.type == bfd_link_hash_undefined
3081       && val == (bfd_vma) -1)
3082     {
3083       struct xcoff_link_hash_entry *hds;
3084
3085       hds = h->descriptor;
3086       if (hds == NULL)
3087         {
3088           hds = xcoff_link_hash_lookup (xcoff_hash_table (info),
3089                                         h->root.root.string + 1,
3090                                         TRUE, FALSE, TRUE);
3091           if (hds == NULL)
3092             return FALSE;
3093           if (hds->root.type == bfd_link_hash_new)
3094             {
3095               hds->root.type = bfd_link_hash_undefined;
3096               hds->root.u.undef.abfd = h->root.u.undef.abfd;
3097             }
3098           hds->flags |= XCOFF_DESCRIPTOR;
3099           BFD_ASSERT ((h->flags & XCOFF_DESCRIPTOR) == 0);
3100           hds->descriptor = h;
3101           h->descriptor = hds;
3102         }
3103
3104       /* Now, if the descriptor is undefined, import the descriptor
3105          rather than the symbol we were told to import.  FIXME: Is
3106          this correct in all cases?  */
3107       if (hds->root.type == bfd_link_hash_undefined)
3108         h = hds;
3109     }
3110
3111   h->flags |= (XCOFF_IMPORT | syscall_flag);
3112
3113   if (val != (bfd_vma) -1)
3114     {
3115       if (h->root.type == bfd_link_hash_defined
3116           && (! bfd_is_abs_section (h->root.u.def.section)
3117               || h->root.u.def.value != val))
3118         {
3119           if (! ((*info->callbacks->multiple_definition)
3120                  (info, &h->root, output_bfd, bfd_abs_section_ptr, val)))
3121             return FALSE;
3122         }
3123
3124       h->root.type = bfd_link_hash_defined;
3125       h->root.u.def.section = bfd_abs_section_ptr;
3126       h->root.u.def.value = val;
3127       h->smclas = XMC_XO;
3128     }
3129
3130   if (!xcoff_set_import_path (info, h, imppath, impfile, impmember))
3131     return FALSE;
3132
3133   return TRUE;
3134 }
3135
3136 /* Export a symbol.  */
3137
3138 bfd_boolean
3139 bfd_xcoff_export_symbol (bfd *output_bfd,
3140                          struct bfd_link_info *info,
3141                          struct bfd_link_hash_entry *harg)
3142 {
3143   struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
3144
3145   if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3146     return TRUE;
3147
3148   h->flags |= XCOFF_EXPORT;
3149
3150   /* FIXME: I'm not at all sure what syscall is supposed to mean, so
3151      I'm just going to ignore it until somebody explains it.  */
3152
3153   /* Make sure we don't garbage collect this symbol.  */
3154   if (! xcoff_mark_symbol (info, h))
3155     return FALSE;
3156
3157   /* If this is a function descriptor, make sure we don't garbage
3158      collect the associated function code.  We normally don't have to
3159      worry about this, because the descriptor will be attached to a
3160      section with relocs, but if we are creating the descriptor
3161      ourselves those relocs will not be visible to the mark code.  */
3162   if ((h->flags & XCOFF_DESCRIPTOR) != 0)
3163     {
3164       if (! xcoff_mark_symbol (info, h->descriptor))
3165         return FALSE;
3166     }
3167
3168   return TRUE;
3169 }
3170
3171 /* Count a reloc against a symbol.  This is called for relocs
3172    generated by the linker script, typically for global constructors
3173    and destructors.  */
3174
3175 bfd_boolean
3176 bfd_xcoff_link_count_reloc (bfd *output_bfd,
3177                             struct bfd_link_info *info,
3178                             const char *name)
3179 {
3180   struct xcoff_link_hash_entry *h;
3181
3182   if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3183     return TRUE;
3184
3185   h = ((struct xcoff_link_hash_entry *)
3186        bfd_wrapped_link_hash_lookup (output_bfd, info, name, FALSE, FALSE,
3187                                      FALSE));
3188   if (h == NULL)
3189     {
3190       (*_bfd_error_handler) (_("%s: no such symbol"), name);
3191       bfd_set_error (bfd_error_no_symbols);
3192       return FALSE;
3193     }
3194
3195   h->flags |= XCOFF_REF_REGULAR;
3196   if (xcoff_hash_table (info)->loader_section)
3197     {
3198       h->flags |= XCOFF_LDREL;
3199       ++xcoff_hash_table (info)->ldrel_count;
3200     }
3201
3202   /* Mark the symbol to avoid garbage collection.  */
3203   if (! xcoff_mark_symbol (info, h))
3204     return FALSE;
3205
3206   return TRUE;
3207 }
3208
3209 /* This function is called for each symbol to which the linker script
3210    assigns a value.  */
3211
3212 bfd_boolean
3213 bfd_xcoff_record_link_assignment (bfd *output_bfd,
3214                                   struct bfd_link_info *info,
3215                                   const char *name)
3216 {
3217   struct xcoff_link_hash_entry *h;
3218
3219   if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3220     return TRUE;
3221
3222   h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, TRUE, TRUE,
3223                               FALSE);
3224   if (h == NULL)
3225     return FALSE;
3226
3227   h->flags |= XCOFF_DEF_REGULAR;
3228
3229   return TRUE;
3230 }
3231
3232 /* An xcoff_link_hash_traverse callback for which DATA points to an
3233    xcoff_loader_info.  Mark all symbols that should be automatically
3234    exported.  */
3235
3236 static bfd_boolean
3237 xcoff_mark_auto_exports (struct xcoff_link_hash_entry *h, void *data)
3238 {
3239   struct xcoff_loader_info *ldinfo;
3240
3241   ldinfo = (struct xcoff_loader_info *) data;
3242   if (xcoff_auto_export_p (ldinfo->info, h, ldinfo->auto_export_flags))
3243     {
3244       if (!xcoff_mark_symbol (ldinfo->info, h))
3245         ldinfo->failed = TRUE;
3246     }
3247   return TRUE;
3248 }
3249
3250 /* Add a symbol to the .loader symbols, if necessary.  */
3251
3252 /* INPUT_BFD has an external symbol associated with hash table entry H
3253    and csect CSECT.   Return true if INPUT_BFD defines H.  */
3254
3255 static bfd_boolean
3256 xcoff_final_definition_p (bfd *input_bfd, struct xcoff_link_hash_entry *h,
3257                           asection *csect)
3258 {
3259   switch (h->root.type)
3260     {
3261     case bfd_link_hash_defined:
3262     case bfd_link_hash_defweak:
3263       /* No input bfd owns absolute symbols.  They are written by
3264          xcoff_write_global_symbol instead.  */
3265       return (!bfd_is_abs_section (csect)
3266               && h->root.u.def.section == csect);
3267
3268     case bfd_link_hash_common:
3269       return h->root.u.c.p->section->owner == input_bfd;
3270
3271     case bfd_link_hash_undefined:
3272     case bfd_link_hash_undefweak:
3273       /* We can't treat undef.abfd as the owner because that bfd
3274          might be a dynamic object.  Allow any bfd to claim it.  */
3275       return TRUE;
3276
3277     default:
3278       abort ();
3279     }
3280 }
3281
3282 /* See if H should have a loader symbol associated with it.  */
3283
3284 static bfd_boolean
3285 xcoff_build_ldsym (struct xcoff_loader_info *ldinfo,
3286                    struct xcoff_link_hash_entry *h)
3287 {
3288   bfd_size_type amt;
3289
3290   /* Warn if this symbol is exported but not defined.  */
3291   if ((h->flags & XCOFF_EXPORT) != 0
3292       && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
3293     {
3294       (*_bfd_error_handler)
3295         (_("warning: attempt to export undefined symbol `%s'"),
3296          h->root.root.string);
3297       return TRUE;
3298     }
3299
3300   /* We need to add a symbol to the .loader section if it is mentioned
3301      in a reloc which we are copying to the .loader section and it was
3302      not defined or common, or if it is the entry point, or if it is
3303      being exported.  */
3304   if (((h->flags & XCOFF_LDREL) == 0
3305        || h->root.type == bfd_link_hash_defined
3306        || h->root.type == bfd_link_hash_defweak
3307        || h->root.type == bfd_link_hash_common)
3308       && (h->flags & XCOFF_ENTRY) == 0
3309       && (h->flags & XCOFF_EXPORT) == 0)
3310     return TRUE;
3311
3312   /* We need to add this symbol to the .loader symbols.  */
3313
3314   BFD_ASSERT (h->ldsym == NULL);
3315   amt = sizeof (struct internal_ldsym);
3316   h->ldsym = bfd_zalloc (ldinfo->output_bfd, amt);
3317   if (h->ldsym == NULL)
3318     {
3319       ldinfo->failed = TRUE;
3320       return FALSE;
3321     }
3322
3323   if ((h->flags & XCOFF_IMPORT) != 0)
3324     {
3325       /* Give imported descriptors class XMC_DS rather than XMC_UA.  */
3326       if ((h->flags & XCOFF_DESCRIPTOR) != 0)
3327         h->smclas = XMC_DS;
3328       h->ldsym->l_ifile = h->ldindx;
3329     }
3330
3331   /* The first 3 symbol table indices are reserved to indicate the
3332      data, text and bss sections.  */
3333   h->ldindx = ldinfo->ldsym_count + 3;
3334
3335   ++ldinfo->ldsym_count;
3336
3337   if (! bfd_xcoff_put_ldsymbol_name (ldinfo->output_bfd, ldinfo,
3338                                      h->ldsym, h->root.root.string))
3339     return FALSE;
3340
3341   h->flags |= XCOFF_BUILT_LDSYM;
3342   return TRUE;
3343 }
3344
3345 /* An xcoff_htab_traverse callback that is called for each symbol
3346    once garbage collection is complete.  */
3347
3348 static bfd_boolean
3349 xcoff_post_gc_symbol (struct xcoff_link_hash_entry *h, void * p)
3350 {
3351   struct xcoff_loader_info *ldinfo = (struct xcoff_loader_info *) p;
3352
3353   /* __rtinit, this symbol has special handling. */
3354   if (h->flags & XCOFF_RTINIT)
3355     return TRUE;
3356
3357   /* We don't want to garbage collect symbols which are not defined in
3358      XCOFF files.  This is a convenient place to mark them.  */
3359   if (xcoff_hash_table (ldinfo->info)->gc
3360       && (h->flags & XCOFF_MARK) == 0
3361       && (h->root.type == bfd_link_hash_defined
3362           || h->root.type == bfd_link_hash_defweak)
3363       && (h->root.u.def.section->owner == NULL
3364           || (h->root.u.def.section->owner->xvec
3365               != ldinfo->info->output_bfd->xvec)))
3366     h->flags |= XCOFF_MARK;
3367
3368   /* Skip discarded symbols.  */
3369   if (xcoff_hash_table (ldinfo->info)->gc
3370       && (h->flags & XCOFF_MARK) == 0)
3371     return TRUE;
3372
3373   /* If this is still a common symbol, and it wasn't garbage
3374      collected, we need to actually allocate space for it in the .bss
3375      section.  */
3376   if (h->root.type == bfd_link_hash_common
3377       && h->root.u.c.p->section->size == 0)
3378     {
3379       BFD_ASSERT (bfd_is_com_section (h->root.u.c.p->section));
3380       h->root.u.c.p->section->size = h->root.u.c.size;
3381     }
3382
3383   if (xcoff_hash_table (ldinfo->info)->loader_section)
3384     {
3385       if (xcoff_auto_export_p (ldinfo->info, h, ldinfo->auto_export_flags))
3386         h->flags |= XCOFF_EXPORT;
3387
3388       if (!xcoff_build_ldsym (ldinfo, h))
3389         return FALSE;
3390     }
3391
3392   return TRUE;
3393 }
3394
3395 /* INPUT_BFD includes XCOFF symbol ISYM, which is associated with linker
3396    hash table entry H and csect CSECT.  AUX contains ISYM's auxillary
3397    csect information, if any.  NAME is the function's name if the name
3398    is stored in the .debug section, otherwise it is null.
3399
3400    Return 1 if we should include an appropriately-adjusted ISYM
3401    in the output file, 0 if we should discard ISYM, or -1 if an
3402    error occured.  */
3403
3404 static int
3405 xcoff_keep_symbol_p (struct bfd_link_info *info, bfd *input_bfd,
3406                      struct internal_syment *isym,
3407                      union internal_auxent *aux,
3408                      struct xcoff_link_hash_entry *h,
3409                      asection *csect, const char *name)
3410 {
3411   int smtyp;
3412
3413   /* If we are skipping this csect, we want to strip the symbol too.  */
3414   if (csect == NULL)
3415     return 0;
3416
3417   /* Likewise if we garbage-collected the csect.  */
3418   if (xcoff_hash_table (info)->gc
3419       && !bfd_is_abs_section (csect)
3420       && !bfd_is_und_section (csect)
3421       && (csect->flags & SEC_MARK) == 0)
3422     return 0;
3423
3424   /* An XCOFF linker always removes C_STAT symbols.  */
3425   if (isym->n_sclass == C_STAT)
3426     return 0;
3427
3428   /* We generate the TOC anchor separately.  */
3429   if (isym->n_sclass == C_HIDEXT
3430       && aux->x_csect.x_smclas == XMC_TC0)
3431     return 0;
3432
3433   /* If we are stripping all symbols, we want to discard this one.  */
3434   if (info->strip == strip_all)
3435     return 0;
3436
3437   /* Discard symbols that are defined elsewhere.  */
3438   if (EXTERN_SYM_P (isym->n_sclass))
3439     {
3440       if ((h->flags & XCOFF_ALLOCATED) != 0)
3441         return 0;
3442       if (!xcoff_final_definition_p (input_bfd, h, csect))
3443         return 0;
3444     }
3445
3446   /* If we're discarding local symbols, check whether ISYM is local.  */
3447   smtyp = SMTYP_SMTYP (aux->x_csect.x_smtyp);
3448   if (info->discard == discard_all
3449       && !EXTERN_SYM_P (isym->n_sclass)
3450       && (isym->n_sclass != C_HIDEXT || smtyp != XTY_SD))
3451     return 0;
3452
3453   /* If we're stripping debugging symbols, check whether ISYM is one.  */
3454   if (info->strip == strip_debugger
3455       && isym->n_scnum == N_DEBUG)
3456     return 0;
3457
3458   /* If we are stripping symbols based on name, check how ISYM's
3459      name should be handled.  */
3460   if (info->strip == strip_some
3461       || info->discard == discard_l)
3462     {
3463       char buf[SYMNMLEN + 1];
3464
3465       if (name == NULL)
3466         {
3467           name = _bfd_coff_internal_syment_name (input_bfd, isym, buf);
3468           if (name == NULL)
3469             return -1;
3470         }
3471
3472       if (info->strip == strip_some
3473           && bfd_hash_lookup (info->keep_hash, name, FALSE, FALSE) == NULL)
3474         return 0;
3475
3476       if (info->discard == discard_l
3477           && !EXTERN_SYM_P (isym->n_sclass)
3478           && (isym->n_sclass != C_HIDEXT || smtyp != XTY_SD)
3479           && bfd_is_local_label_name (input_bfd, name))
3480         return 0;
3481     }
3482
3483   return 1;
3484 }
3485
3486 /* Lay out the .loader section, filling in the header and the import paths.
3487    LIBPATH is as for bfd_xcoff_size_dynamic_sections.  */
3488
3489 static bfd_boolean
3490 xcoff_build_loader_section (struct xcoff_loader_info *ldinfo,
3491                             const char *libpath)
3492 {
3493   bfd *output_bfd;
3494   struct xcoff_link_hash_table *htab;
3495   struct internal_ldhdr *ldhdr;
3496   struct xcoff_import_file *fl;
3497   bfd_size_type stoff;
3498   size_t impsize, impcount;
3499   asection *lsec;
3500   char *out;
3501
3502   /* Work out the size of the import file names.  Each import file ID
3503      consists of three null terminated strings: the path, the file
3504      name, and the archive member name.  The first entry in the list
3505      of names is the path to use to find objects, which the linker has
3506      passed in as the libpath argument.  For some reason, the path
3507      entry in the other import file names appears to always be empty.  */
3508   output_bfd = ldinfo->output_bfd;
3509   htab = xcoff_hash_table (ldinfo->info);
3510   impsize = strlen (libpath) + 3;
3511   impcount = 1;
3512   for (fl = htab->imports; fl != NULL; fl = fl->next)
3513     {
3514       ++impcount;
3515       impsize += (strlen (fl->path)
3516                   + strlen (fl->file)
3517                   + strlen (fl->member)
3518                   + 3);
3519     }
3520
3521   /* Set up the .loader section header.  */
3522   ldhdr = &htab->ldhdr;
3523   ldhdr->l_version = bfd_xcoff_ldhdr_version(output_bfd);
3524   ldhdr->l_nsyms = ldinfo->ldsym_count;
3525   ldhdr->l_nreloc = htab->ldrel_count;
3526   ldhdr->l_istlen = impsize;
3527   ldhdr->l_nimpid = impcount;
3528   ldhdr->l_impoff = (bfd_xcoff_ldhdrsz (output_bfd)
3529                      + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (output_bfd)
3530                      + ldhdr->l_nreloc * bfd_xcoff_ldrelsz (output_bfd));
3531   ldhdr->l_stlen = ldinfo->string_size;
3532   stoff = ldhdr->l_impoff + impsize;
3533   if (ldinfo->string_size == 0)
3534     ldhdr->l_stoff = 0;
3535   else
3536     ldhdr->l_stoff = stoff;
3537
3538   /* 64 bit elements to ldhdr
3539      The swap out routine for 32 bit will ignore them.
3540      Nothing fancy, symbols come after the header and relocs come
3541      after symbols.  */
3542   ldhdr->l_symoff = bfd_xcoff_ldhdrsz (output_bfd);
3543   ldhdr->l_rldoff = (bfd_xcoff_ldhdrsz (output_bfd)
3544                      + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (output_bfd));
3545
3546   /* We now know the final size of the .loader section.  Allocate
3547      space for it.  */
3548   lsec = htab->loader_section;
3549   lsec->size = stoff + ldhdr->l_stlen;
3550   lsec->contents = bfd_zalloc (output_bfd, lsec->size);
3551   if (lsec->contents == NULL)
3552     return FALSE;
3553
3554   /* Set up the header.  */
3555   bfd_xcoff_swap_ldhdr_out (output_bfd, ldhdr, lsec->contents);
3556
3557   /* Set up the import file names.  */
3558   out = (char *) lsec->contents + ldhdr->l_impoff;
3559   strcpy (out, libpath);
3560   out += strlen (libpath) + 1;
3561   *out++ = '\0';
3562   *out++ = '\0';
3563   for (fl = htab->imports; fl != NULL; fl = fl->next)
3564     {
3565       const char *s;
3566
3567       s = fl->path;
3568       while ((*out++ = *s++) != '\0')
3569         ;
3570       s = fl->file;
3571       while ((*out++ = *s++) != '\0')
3572         ;
3573       s = fl->member;
3574       while ((*out++ = *s++) != '\0')
3575         ;
3576     }
3577
3578   BFD_ASSERT ((bfd_size_type) ((bfd_byte *) out - lsec->contents) == stoff);
3579
3580   /* Set up the symbol string table.  */
3581   if (ldinfo->string_size > 0)
3582     {
3583       memcpy (out, ldinfo->strings, ldinfo->string_size);
3584       free (ldinfo->strings);
3585       ldinfo->strings = NULL;
3586     }
3587
3588   /* We can't set up the symbol table or the relocs yet, because we
3589      don't yet know the final position of the various sections.  The
3590      .loader symbols are written out when the corresponding normal
3591      symbols are written out in xcoff_link_input_bfd or
3592      xcoff_write_global_symbol.  The .loader relocs are written out
3593      when the corresponding normal relocs are handled in
3594      xcoff_link_input_bfd.  */
3595
3596   return TRUE;
3597 }
3598
3599 /* Build the .loader section.  This is called by the XCOFF linker
3600    emulation before_allocation routine.  We must set the size of the
3601    .loader section before the linker lays out the output file.
3602    LIBPATH is the library path to search for shared objects; this is
3603    normally built from the -L arguments passed to the linker.  ENTRY
3604    is the name of the entry point symbol (the -e linker option).
3605    FILE_ALIGN is the alignment to use for sections within the file
3606    (the -H linker option).  MAXSTACK is the maximum stack size (the
3607    -bmaxstack linker option).  MAXDATA is the maximum data size (the
3608    -bmaxdata linker option).  GC is whether to do garbage collection
3609    (the -bgc linker option).  MODTYPE is the module type (the
3610    -bmodtype linker option).  TEXTRO is whether the text section must
3611    be read only (the -btextro linker option).  AUTO_EXPORT_FLAGS
3612    is a mask of XCOFF_EXPALL and XCOFF_EXPFULL.  SPECIAL_SECTIONS
3613    is set by this routine to csects with magic names like _end.  */
3614
3615 bfd_boolean
3616 bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
3617                                  struct bfd_link_info *info,
3618                                  const char *libpath,
3619                                  const char *entry,
3620                                  unsigned long file_align,
3621                                  unsigned long maxstack,
3622                                  unsigned long maxdata,
3623                                  bfd_boolean gc,
3624                                  int modtype,
3625                                  bfd_boolean textro,
3626                                  unsigned int auto_export_flags,
3627                                  asection **special_sections,
3628                                  bfd_boolean rtld)
3629 {
3630   struct xcoff_loader_info ldinfo;
3631   int i;
3632   asection *sec;
3633   bfd *sub;
3634   struct bfd_strtab_hash *debug_strtab;
3635   bfd_byte *debug_contents = NULL;
3636   bfd_size_type amt;
3637
3638   if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3639     {
3640       for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
3641         special_sections[i] = NULL;
3642       return TRUE;
3643     }
3644
3645   ldinfo.failed = FALSE;
3646   ldinfo.output_bfd = output_bfd;
3647   ldinfo.info = info;
3648   ldinfo.auto_export_flags = auto_export_flags;
3649   ldinfo.ldsym_count = 0;
3650   ldinfo.string_size = 0;
3651   ldinfo.strings = NULL;
3652   ldinfo.string_alc = 0;
3653
3654   xcoff_data (output_bfd)->maxstack = maxstack;
3655   xcoff_data (output_bfd)->maxdata = maxdata;
3656   xcoff_data (output_bfd)->modtype = modtype;
3657
3658   xcoff_hash_table (info)->file_align = file_align;
3659   xcoff_hash_table (info)->textro = textro;
3660   xcoff_hash_table (info)->rtld = rtld;
3661
3662   /* __rtinit */
3663   if (xcoff_hash_table (info)->loader_section
3664       && (info->init_function || info->fini_function || rtld))
3665     {
3666       struct xcoff_link_hash_entry *hsym;
3667       struct internal_ldsym *ldsym;
3668
3669       hsym = xcoff_link_hash_lookup (xcoff_hash_table (info),
3670                                      "__rtinit", FALSE, FALSE, TRUE);
3671       if (hsym == NULL)
3672         {
3673           (*_bfd_error_handler)
3674             (_("error: undefined symbol __rtinit"));
3675           return FALSE;
3676         }
3677
3678       xcoff_mark_symbol (info, hsym);
3679       hsym->flags |= (XCOFF_DEF_REGULAR | XCOFF_RTINIT);
3680
3681       /* __rtinit initialized.  */
3682       amt = sizeof (* ldsym);
3683       ldsym = bfd_malloc (amt);
3684
3685       ldsym->l_value = 0;               /* Will be filled in later.  */
3686       ldsym->l_scnum = 2;               /* Data section.  */
3687       ldsym->l_smtype = XTY_SD;         /* Csect section definition.  */
3688       ldsym->l_smclas = 5;              /* .rw.  */
3689       ldsym->l_ifile = 0;               /* Special system loader symbol.  */
3690       ldsym->l_parm = 0;                /* NA.  */
3691
3692       /* Force __rtinit to be the first symbol in the loader symbol table
3693          See xcoff_build_ldsyms
3694
3695          The first 3 symbol table indices are reserved to indicate the data,
3696          text and bss sections.  */
3697       BFD_ASSERT (0 == ldinfo.ldsym_count);
3698
3699       hsym->ldindx = 3;
3700       ldinfo.ldsym_count = 1;
3701       hsym->ldsym = ldsym;
3702
3703       if (! bfd_xcoff_put_ldsymbol_name (ldinfo.output_bfd, &ldinfo,
3704                                          hsym->ldsym, hsym->root.root.string))
3705         return FALSE;
3706
3707       /* This symbol is written out by xcoff_write_global_symbol
3708          Set stuff up so xcoff_write_global_symbol logic works.  */
3709       hsym->flags |= XCOFF_DEF_REGULAR | XCOFF_MARK;
3710       hsym->root.type = bfd_link_hash_defined;
3711       hsym->root.u.def.value = 0;
3712     }
3713
3714   /* Garbage collect unused sections.  */
3715   if (info->relocatable || !gc)
3716     {
3717       gc = FALSE;
3718       xcoff_hash_table (info)->gc = FALSE;
3719
3720       /* We still need to call xcoff_mark, in order to set ldrel_count
3721          correctly.  */
3722       for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3723         {
3724           asection *o;
3725
3726           for (o = sub->sections; o != NULL; o = o->next)
3727             {
3728               /* We shouldn't unconditionaly mark the TOC section.
3729                  The output file should only have a TOC if either
3730                  (a) one of the input files did or (b) we end up
3731                  creating TOC references as part of the link process.  */
3732               if (o != xcoff_hash_table (info)->toc_section
3733                   && (o->flags & SEC_MARK) == 0)
3734                 {
3735                   if (! xcoff_mark (info, o))
3736                     goto error_return;
3737                 }
3738             }
3739         }
3740     }
3741   else
3742     {
3743       if (entry != NULL
3744           && !xcoff_mark_symbol_by_name (info, entry, XCOFF_ENTRY))
3745         goto error_return;
3746       if (info->init_function != NULL
3747           && !xcoff_mark_symbol_by_name (info, info->init_function, 0))
3748         goto error_return;
3749       if (info->fini_function != NULL
3750           && !xcoff_mark_symbol_by_name (info, info->fini_function, 0))
3751         goto error_return;
3752       if (auto_export_flags != 0)
3753         {
3754           xcoff_link_hash_traverse (xcoff_hash_table (info),
3755                                     xcoff_mark_auto_exports, &ldinfo);
3756           if (ldinfo.failed)
3757             goto error_return;
3758         }
3759       xcoff_sweep (info);
3760       xcoff_hash_table (info)->gc = TRUE;
3761     }
3762
3763   /* Return special sections to the caller.  */
3764   for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
3765     {
3766       sec = xcoff_hash_table (info)->special_sections[i];
3767
3768       if (sec != NULL
3769           && gc
3770           && (sec->flags & SEC_MARK) == 0)
3771         sec = NULL;
3772
3773       special_sections[i] = sec;
3774     }
3775
3776   if (info->input_bfds == NULL)
3777     /* I'm not sure what to do in this bizarre case.  */
3778     return TRUE;
3779
3780   xcoff_link_hash_traverse (xcoff_hash_table (info), xcoff_post_gc_symbol,
3781                             (void *) &ldinfo);
3782   if (ldinfo.failed)
3783     goto error_return;
3784
3785   if (xcoff_hash_table (info)->loader_section
3786       && !xcoff_build_loader_section (&ldinfo, libpath))
3787     goto error_return;
3788
3789   /* Allocate space for the magic sections.  */
3790   sec = xcoff_hash_table (info)->linkage_section;
3791   if (sec->size > 0)
3792     {
3793       sec->contents = bfd_zalloc (output_bfd, sec->size);
3794       if (sec->contents == NULL)
3795         goto error_return;
3796     }
3797   sec = xcoff_hash_table (info)->toc_section;
3798   if (sec->size > 0)
3799     {
3800       sec->contents = bfd_zalloc (output_bfd, sec->size);
3801       if (sec->contents == NULL)
3802         goto error_return;
3803     }
3804   sec = xcoff_hash_table (info)->descriptor_section;
3805   if (sec->size > 0)
3806     {
3807       sec->contents = bfd_zalloc (output_bfd, sec->size);
3808       if (sec->contents == NULL)
3809         goto error_return;
3810     }
3811
3812   /* Now that we've done garbage collection, decide which symbols to keep,
3813      and figure out the contents of the .debug section.  */
3814   debug_strtab = xcoff_hash_table (info)->debug_strtab;
3815
3816   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3817     {
3818       asection *subdeb;
3819       bfd_size_type symcount;
3820       long *debug_index;
3821       asection **csectpp;
3822       unsigned int *lineno_counts;
3823       struct xcoff_link_hash_entry **sym_hash;
3824       bfd_byte *esym, *esymend;
3825       bfd_size_type symesz;
3826
3827       if (sub->xvec != info->output_bfd->xvec)
3828         continue;
3829
3830       if ((sub->flags & DYNAMIC) != 0
3831           && !info->static_link)
3832         continue;
3833
3834       if (! _bfd_coff_get_external_symbols (sub))
3835         goto error_return;
3836
3837       symcount = obj_raw_syment_count (sub);
3838       debug_index = bfd_zalloc (sub, symcount * sizeof (long));
3839       if (debug_index == NULL)
3840         goto error_return;
3841       xcoff_data (sub)->debug_indices = debug_index;
3842
3843       if (info->strip == strip_all
3844           || info->strip == strip_debugger
3845           || info->discard == discard_all)
3846         /* We're stripping all debugging information, so there's no need
3847            to read SUB's .debug section.  */
3848         subdeb = NULL;
3849       else
3850         {
3851           /* Grab the contents of SUB's .debug section, if any.  */
3852           subdeb = bfd_get_section_by_name (sub, ".debug");
3853           if (subdeb != NULL && subdeb->size > 0)
3854             {
3855               /* We use malloc and copy the names into the debug
3856                  stringtab, rather than bfd_alloc, because I expect
3857                  that, when linking many files together, many of the
3858                  strings will be the same.  Storing the strings in the
3859                  hash table should save space in this case.  */
3860               if (!bfd_malloc_and_get_section (sub, subdeb, &debug_contents))
3861                 goto error_return;
3862             }
3863         }
3864
3865       csectpp = xcoff_data (sub)->csects;
3866       lineno_counts = xcoff_data (sub)->lineno_counts;
3867       sym_hash = obj_xcoff_sym_hashes (sub);
3868       symesz = bfd_coff_symesz (sub);
3869       esym = (bfd_byte *) obj_coff_external_syms (sub);
3870       esymend = esym + symcount * symesz;
3871
3872       while (esym < esymend)
3873         {
3874           struct internal_syment sym;
3875           union internal_auxent aux;
3876           asection *csect;
3877           const char *name;
3878           int keep_p;
3879
3880           bfd_coff_swap_sym_in (sub, esym, &sym);
3881
3882           /* Read in the csect information, if any.  */
3883           if (CSECT_SYM_P (sym.n_sclass))
3884             {
3885               BFD_ASSERT (sym.n_numaux > 0);
3886               bfd_coff_swap_aux_in (sub, esym + symesz * sym.n_numaux,
3887                                     sym.n_type, sym.n_sclass,
3888                                     sym.n_numaux - 1, sym.n_numaux, &aux);
3889             }
3890
3891           /* If this symbol's name is stored in the debug section,
3892              get a pointer to it.  */
3893           if (debug_contents != NULL
3894               && sym._n._n_n._n_zeroes == 0
3895               && bfd_coff_symname_in_debug (sub, &sym))
3896             name = (const char *) debug_contents + sym._n._n_n._n_offset;
3897           else
3898             name = NULL;
3899
3900           /* Decide whether to copy this symbol to the output file.  */
3901           csect = *csectpp;
3902           keep_p = xcoff_keep_symbol_p (info, sub, &sym, &aux,
3903                                         *sym_hash, csect, name);
3904           if (keep_p < 0)
3905             return FALSE;
3906
3907           if (!keep_p)
3908             /* Use a debug_index of -2 to record that a symbol should
3909                be stripped.  */
3910             *debug_index = -2;
3911           else
3912             {
3913               /* See whether we should store the symbol name in the
3914                  output .debug section.  */
3915               if (name != NULL)
3916                 {
3917                   bfd_size_type indx;
3918
3919                   indx = _bfd_stringtab_add (debug_strtab, name, TRUE, TRUE);
3920                   if (indx == (bfd_size_type) -1)
3921                     goto error_return;
3922                   *debug_index = indx;
3923                 }
3924               else
3925                 *debug_index = -1;
3926               if (*sym_hash != 0)
3927                 (*sym_hash)->flags |= XCOFF_ALLOCATED;
3928               if (*lineno_counts > 0)
3929                 csect->output_section->lineno_count += *lineno_counts;
3930             }
3931
3932           esym += (sym.n_numaux + 1) * symesz;
3933           csectpp += sym.n_numaux + 1;
3934           sym_hash += sym.n_numaux + 1;
3935           lineno_counts += sym.n_numaux + 1;
3936           debug_index += sym.n_numaux + 1;
3937         }
3938
3939       if (debug_contents)
3940         {
3941           free (debug_contents);
3942           debug_contents = NULL;
3943
3944           /* Clear the size of subdeb, so that it is not included directly
3945              in the output file.  */
3946           subdeb->size = 0;
3947         }
3948
3949       if (! info->keep_memory)
3950         {
3951           if (! _bfd_coff_free_symbols (sub))
3952             goto error_return;
3953         }
3954     }
3955
3956   if (info->strip != strip_all)
3957     xcoff_hash_table (info)->debug_section->size =
3958       _bfd_stringtab_size (debug_strtab);
3959
3960   return TRUE;
3961
3962  error_return:
3963   if (ldinfo.strings != NULL)
3964     free (ldinfo.strings);
3965   if (debug_contents != NULL)
3966     free (debug_contents);
3967   return FALSE;
3968 }
3969
3970 bfd_boolean
3971 bfd_xcoff_link_generate_rtinit (bfd *abfd,
3972                                 const char *init,
3973                                 const char *fini,
3974                                 bfd_boolean rtld)
3975 {
3976   struct bfd_in_memory *bim;
3977
3978   bim = bfd_malloc ((bfd_size_type) sizeof (* bim));
3979   if (bim == NULL)
3980     return FALSE;
3981
3982   bim->size = 0;
3983   bim->buffer = 0;
3984
3985   abfd->link.next = 0;
3986   abfd->format = bfd_object;
3987   abfd->iostream = (void *) bim;
3988   abfd->flags = BFD_IN_MEMORY;
3989   abfd->iovec = &_bfd_memory_iovec;
3990   abfd->direction = write_direction;
3991   abfd->origin = 0;
3992   abfd->where = 0;
3993
3994   if (! bfd_xcoff_generate_rtinit (abfd, init, fini, rtld))
3995     return FALSE;
3996
3997   /* need to reset to unknown or it will not be read back in correctly */
3998   abfd->format = bfd_unknown;
3999   abfd->direction = read_direction;
4000   abfd->where = 0;
4001
4002   return TRUE;
4003 }
4004 \f
4005 /* Return the section that defines H.  Return null if no section does.  */
4006
4007 static asection *
4008 xcoff_symbol_section (struct xcoff_link_hash_entry *h)
4009 {
4010   switch (h->root.type)
4011     {
4012     case bfd_link_hash_defined:
4013     case bfd_link_hash_defweak:
4014       return h->root.u.def.section;
4015
4016     case bfd_link_hash_common:
4017       return h->root.u.c.p->section;
4018
4019     default:
4020       return NULL;
4021     }
4022 }
4023
4024 /* Add a .loader relocation for input relocation IREL.  If the loader
4025    relocation should be against an output section, HSEC points to the
4026    input section that IREL is against, otherwise HSEC is null.  H is the
4027    symbol that IREL is against, or null if it isn't against a global symbol.
4028    REFERENCE_BFD is the bfd to use in error messages about the relocation.  */
4029
4030 static bfd_boolean
4031 xcoff_create_ldrel (bfd *output_bfd, struct xcoff_final_link_info *flinfo,
4032                     asection *output_section, bfd *reference_bfd,
4033                     struct internal_reloc *irel, asection *hsec,
4034                     struct xcoff_link_hash_entry *h)
4035 {
4036   struct internal_ldrel ldrel;
4037
4038   ldrel.l_vaddr = irel->r_vaddr;
4039   if (hsec != NULL)
4040     {
4041       const char *secname;
4042
4043       secname = hsec->output_section->name;
4044       if (strcmp (secname, ".text") == 0)
4045         ldrel.l_symndx = 0;
4046       else if (strcmp (secname, ".data") == 0)
4047         ldrel.l_symndx = 1;
4048       else if (strcmp (secname, ".bss") == 0)
4049         ldrel.l_symndx = 2;
4050       else
4051         {
4052           (*_bfd_error_handler)
4053             (_("%B: loader reloc in unrecognized section `%s'"),
4054              reference_bfd, secname);
4055           bfd_set_error (bfd_error_nonrepresentable_section);
4056           return FALSE;
4057         }
4058     }
4059   else if (h != NULL)
4060     {
4061       if (h->ldindx < 0)
4062         {
4063           (*_bfd_error_handler)
4064             (_("%B: `%s' in loader reloc but not loader sym"),
4065              reference_bfd, h->root.root.string);
4066           bfd_set_error (bfd_error_bad_value);
4067           return FALSE;
4068         }
4069       ldrel.l_symndx = h->ldindx;
4070     }
4071   else
4072     ldrel.l_symndx = -(bfd_size_type) 1;
4073
4074   ldrel.l_rtype = (irel->r_size << 8) | irel->r_type;
4075   ldrel.l_rsecnm = output_section->target_index;
4076   if (xcoff_hash_table (flinfo->info)->textro
4077       && strcmp (output_section->name, ".text") == 0)
4078     {
4079       (*_bfd_error_handler)
4080         (_("%B: loader reloc in read-only section %A"),
4081          reference_bfd, output_section);
4082       bfd_set_error (bfd_error_invalid_operation);
4083       return FALSE;
4084     }
4085   bfd_xcoff_swap_ldrel_out (output_bfd, &ldrel, flinfo->ldrel);
4086   flinfo->ldrel += bfd_xcoff_ldrelsz (output_bfd);
4087   return TRUE;
4088 }
4089
4090 /* Link an input file into the linker output file.  This function
4091    handles all the sections and relocations of the input file at once.  */
4092
4093 static bfd_boolean
4094 xcoff_link_input_bfd (struct xcoff_final_link_info *flinfo,
4095                       bfd *input_bfd)
4096 {
4097   bfd *output_bfd;
4098   const char *strings;
4099   bfd_size_type syment_base;
4100   unsigned int n_tmask;
4101   unsigned int n_btshft;
4102   bfd_boolean copy, hash;
4103   bfd_size_type isymesz;
4104   bfd_size_type osymesz;
4105   bfd_size_type linesz;
4106   bfd_byte *esym;
4107   bfd_byte *esym_end;
4108   struct xcoff_link_hash_entry **sym_hash;
4109   struct internal_syment *isymp;
4110   asection **csectpp;
4111   unsigned int *lineno_counts;
4112   long *debug_index;
4113   long *indexp;
4114   unsigned long output_index;
4115   bfd_byte *outsym;
4116   unsigned int incls;
4117   asection *oline;
4118   bfd_boolean keep_syms;
4119   asection *o;
4120
4121   /* We can just skip DYNAMIC files, unless this is a static link.  */
4122   if ((input_bfd->flags & DYNAMIC) != 0
4123       && ! flinfo->info->static_link)
4124     return TRUE;
4125
4126   /* Move all the symbols to the output file.  */
4127   output_bfd = flinfo->output_bfd;
4128   strings = NULL;
4129   syment_base = obj_raw_syment_count (output_bfd);
4130   isymesz = bfd_coff_symesz (input_bfd);
4131   osymesz = bfd_coff_symesz (output_bfd);
4132   linesz = bfd_coff_linesz (input_bfd);
4133   BFD_ASSERT (linesz == bfd_coff_linesz (output_bfd));
4134
4135   n_tmask = coff_data (input_bfd)->local_n_tmask;
4136   n_btshft = coff_data (input_bfd)->local_n_btshft;
4137
4138   /* Define macros so that ISFCN, et. al., macros work correctly.  */
4139 #define N_TMASK n_tmask
4140 #define N_BTSHFT n_btshft
4141
4142   copy = FALSE;
4143   if (! flinfo->info->keep_memory)
4144     copy = TRUE;
4145   hash = TRUE;
4146   if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
4147     hash = FALSE;
4148
4149   if (! _bfd_coff_get_external_symbols (input_bfd))
4150     return FALSE;
4151
4152   /* Make one pass over the symbols and assign indices to symbols that
4153      we have decided to keep.  Also use create .loader symbol information
4154      and update information in hash table entries.  */
4155   esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
4156   esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
4157   sym_hash = obj_xcoff_sym_hashes (input_bfd);
4158   csectpp = xcoff_data (input_bfd)->csects;
4159   debug_index = xcoff_data (input_bfd)->debug_indices;
4160   isymp = flinfo->internal_syms;
4161   indexp = flinfo->sym_indices;
4162   output_index = syment_base;
4163   while (esym < esym_end)
4164     {
4165       union internal_auxent aux;
4166       int smtyp = 0;
4167       int add;
4168
4169       bfd_coff_swap_sym_in (input_bfd, (void *) esym, (void *) isymp);
4170
4171       /* Read in the csect information, if any.  */
4172       if (CSECT_SYM_P (isymp->n_sclass))
4173         {
4174           BFD_ASSERT (isymp->n_numaux > 0);
4175           bfd_coff_swap_aux_in (input_bfd,
4176                                 (void *) (esym + isymesz * isymp->n_numaux),
4177                                 isymp->n_type, isymp->n_sclass,
4178                                 isymp->n_numaux - 1, isymp->n_numaux,
4179                                 (void *) &aux);
4180
4181           smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp);
4182         }
4183
4184       /* If this symbol is in the .loader section, swap out the
4185          .loader symbol information.  If this is an external symbol
4186          reference to a defined symbol, though, then wait until we get
4187          to the definition.  */
4188       if (EXTERN_SYM_P (isymp->n_sclass)
4189           && *sym_hash != NULL
4190           && (*sym_hash)->ldsym != NULL
4191           && xcoff_final_definition_p (input_bfd, *sym_hash, *csectpp))
4192         {
4193           struct xcoff_link_hash_entry *h;
4194           struct internal_ldsym *ldsym;
4195
4196           h = *sym_hash;
4197           ldsym = h->ldsym;
4198           if (isymp->n_scnum > 0)
4199             {
4200               ldsym->l_scnum = (*csectpp)->output_section->target_index;
4201               ldsym->l_value = (isymp->n_value
4202                                 + (*csectpp)->output_section->vma
4203                                 + (*csectpp)->output_offset
4204                                 - (*csectpp)->vma);
4205             }
4206           else
4207             {
4208               ldsym->l_scnum = isymp->n_scnum;
4209               ldsym->l_value = isymp->n_value;
4210             }
4211
4212           ldsym->l_smtype = smtyp;
4213           if (((h->flags & XCOFF_DEF_REGULAR) == 0
4214                && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
4215               || (h->flags & XCOFF_IMPORT) != 0)
4216             ldsym->l_smtype |= L_IMPORT;
4217           if (((h->flags & XCOFF_DEF_REGULAR) != 0
4218                && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
4219               || (h->flags & XCOFF_EXPORT) != 0)
4220             ldsym->l_smtype |= L_EXPORT;
4221           if ((h->flags & XCOFF_ENTRY) != 0)
4222             ldsym->l_smtype |= L_ENTRY;
4223           if (isymp->n_sclass == C_AIX_WEAKEXT)
4224             ldsym->l_smtype |= L_WEAK;
4225
4226           ldsym->l_smclas = aux.x_csect.x_smclas;
4227
4228           if (ldsym->l_ifile == (bfd_size_type) -1)
4229             ldsym->l_ifile = 0;
4230           else if (ldsym->l_ifile == 0)
4231             {
4232               if ((ldsym->l_smtype & L_IMPORT) == 0)
4233                 ldsym->l_ifile = 0;
4234               else
4235                 {
4236                   bfd *impbfd;
4237
4238                   if (h->root.type == bfd_link_hash_defined
4239                       || h->root.type == bfd_link_hash_defweak)
4240                     impbfd = h->root.u.def.section->owner;
4241                   else if (h->root.type == bfd_link_hash_undefined
4242                            || h->root.type == bfd_link_hash_undefweak)
4243                     impbfd = h->root.u.undef.abfd;
4244                   else
4245                     impbfd = NULL;
4246
4247                   if (impbfd == NULL)
4248                     ldsym->l_ifile = 0;
4249                   else
4250                     {
4251                       BFD_ASSERT (impbfd->xvec == flinfo->output_bfd->xvec);
4252                       ldsym->l_ifile = xcoff_data (impbfd)->import_file_id;
4253                     }
4254                 }
4255             }
4256
4257           ldsym->l_parm = 0;
4258
4259           BFD_ASSERT (h->ldindx >= 0);
4260           bfd_xcoff_swap_ldsym_out (flinfo->output_bfd, ldsym,
4261                                     (flinfo->ldsym
4262                                      + ((h->ldindx - 3)
4263                                         * bfd_xcoff_ldsymsz (flinfo->output_bfd))));
4264           h->ldsym = NULL;
4265
4266           /* Fill in snentry now that we know the target_index.  */
4267           if ((h->flags & XCOFF_ENTRY) != 0
4268               && (h->root.type == bfd_link_hash_defined
4269                   || h->root.type == bfd_link_hash_defweak))
4270             {
4271               xcoff_data (output_bfd)->snentry =
4272                 h->root.u.def.section->output_section->target_index;
4273             }
4274         }
4275
4276       add = 1 + isymp->n_numaux;
4277
4278       if (*debug_index == -2)
4279         /* We've decided to strip this symbol.  */
4280         *indexp = -1;
4281       else
4282         {
4283           /* Assign the next unused index to this symbol.  */
4284           *indexp = output_index;
4285
4286           if (EXTERN_SYM_P (isymp->n_sclass))
4287             {
4288               BFD_ASSERT (*sym_hash != NULL);
4289               (*sym_hash)->indx = output_index;
4290             }
4291
4292           /* If this is a symbol in the TOC which we may have merged
4293              (class XMC_TC), remember the symbol index of the TOC
4294              symbol.  */
4295           if (isymp->n_sclass == C_HIDEXT
4296               && aux.x_csect.x_smclas == XMC_TC
4297               && *sym_hash != NULL)
4298             {
4299               BFD_ASSERT (((*sym_hash)->flags & XCOFF_SET_TOC) == 0);
4300               BFD_ASSERT ((*sym_hash)->toc_section != NULL);
4301               (*sym_hash)->u.toc_indx = output_index;
4302             }
4303
4304           output_index += add;
4305         }
4306
4307       esym += add * isymesz;
4308       isymp += add;
4309       csectpp += add;
4310       sym_hash += add;
4311       debug_index += add;
4312       ++indexp;
4313       for (--add; add > 0; --add)
4314         *indexp++ = -1;
4315     }
4316
4317   /* Now write out the symbols that we decided to keep.  */
4318
4319   esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
4320   esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
4321   sym_hash = obj_xcoff_sym_hashes (input_bfd);
4322   isymp = flinfo->internal_syms;
4323   indexp = flinfo->sym_indices;
4324   csectpp = xcoff_data (input_bfd)->csects;
4325   lineno_counts = xcoff_data (input_bfd)->lineno_counts;
4326   debug_index = xcoff_data (input_bfd)->debug_indices;
4327   outsym = flinfo->outsyms;
4328   incls = 0;
4329   oline = NULL;
4330   while (esym < esym_end)
4331     {
4332       int add;
4333
4334       add = 1 + isymp->n_numaux;
4335
4336       if (*indexp < 0)
4337         esym += add * isymesz;
4338       else
4339         {
4340           struct internal_syment isym;
4341           int i;
4342
4343           /* Adjust the symbol in order to output it.  */
4344           isym = *isymp;
4345           if (isym._n._n_n._n_zeroes == 0
4346               && isym._n._n_n._n_offset != 0)
4347             {
4348               /* This symbol has a long name.  Enter it in the string
4349                  table we are building.  If *debug_index != -1, the
4350                  name has already been entered in the .debug section.  */
4351               if (*debug_index >= 0)
4352                 isym._n._n_n._n_offset = *debug_index;
4353               else
4354                 {
4355                   const char *name;
4356                   bfd_size_type indx;
4357
4358                   name = _bfd_coff_internal_syment_name (input_bfd, &isym, NULL);
4359
4360                   if (name == NULL)
4361                     return FALSE;
4362                   indx = _bfd_stringtab_add (flinfo->strtab, name, hash, copy);
4363                   if (indx == (bfd_size_type) -1)
4364                     return FALSE;
4365                   isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
4366                 }
4367             }
4368
4369           /* Make __rtinit C_HIDEXT rather than C_EXT.  This avoids
4370              multiple definition problems when linking a shared object
4371              statically.  (The native linker doesn't enter __rtinit into
4372              the normal table at all, but having a local symbol can make
4373              the objdump output easier to read.)  */
4374           if (isym.n_sclass == C_EXT
4375               && *sym_hash
4376               && ((*sym_hash)->flags & XCOFF_RTINIT) != 0)
4377             isym.n_sclass = C_HIDEXT;
4378
4379           /* The value of a C_FILE symbol is the symbol index of the
4380              next C_FILE symbol.  The value of the last C_FILE symbol
4381              is -1.  We try to get this right, below, just before we
4382              write the symbols out, but in the general case we may
4383              have to write the symbol out twice.  */
4384           if (isym.n_sclass == C_FILE)
4385             {
4386               if (flinfo->last_file_index != -1
4387                   && flinfo->last_file.n_value != (bfd_vma) *indexp)
4388                 {
4389                   /* We must correct the value of the last C_FILE entry.  */
4390                   flinfo->last_file.n_value = *indexp;
4391                   if ((bfd_size_type) flinfo->last_file_index >= syment_base)
4392                     {
4393                       /* The last C_FILE symbol is in this input file.  */
4394                       bfd_coff_swap_sym_out (output_bfd,
4395                                              (void *) &flinfo->last_file,
4396                                              (void *) (flinfo->outsyms
4397                                                     + ((flinfo->last_file_index
4398                                                         - syment_base)
4399                                                        * osymesz)));
4400                     }
4401                   else
4402                     {
4403                       /* We have already written out the last C_FILE
4404                          symbol.  We need to write it out again.  We
4405                          borrow *outsym temporarily.  */
4406                       file_ptr pos;
4407
4408                       bfd_coff_swap_sym_out (output_bfd,
4409                                              (void *) &flinfo->last_file,
4410                                              (void *) outsym);
4411
4412                       pos = obj_sym_filepos (output_bfd);
4413                       pos += flinfo->last_file_index * osymesz;
4414                       if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
4415                           || (bfd_bwrite (outsym, osymesz, output_bfd)
4416                               != osymesz))
4417                         return FALSE;
4418                     }
4419                 }
4420
4421               flinfo->last_file_index = *indexp;
4422               flinfo->last_file = isym;
4423             }
4424
4425           /* The value of a C_BINCL or C_EINCL symbol is a file offset
4426              into the line numbers.  We update the symbol values when
4427              we handle the line numbers.  */
4428           if (isym.n_sclass == C_BINCL
4429               || isym.n_sclass == C_EINCL)
4430             {
4431               isym.n_value = flinfo->line_filepos;
4432               ++incls;
4433             }
4434           /* The value of a C_BSTAT symbol is the symbol table
4435              index of the containing csect.  */
4436           else if (isym.n_sclass == C_BSTAT)
4437             {
4438               bfd_vma indx;
4439
4440               indx = isym.n_value;
4441               if (indx < obj_raw_syment_count (input_bfd))
4442                 {
4443                   long symindx;
4444
4445                   symindx = flinfo->sym_indices[indx];
4446                   if (symindx < 0)
4447                     isym.n_value = 0;
4448                   else
4449                     isym.n_value = symindx;
4450                 }
4451             }
4452           else if (isym.n_sclass != C_ESTAT
4453                    && isym.n_sclass != C_DECL
4454                    && isym.n_scnum > 0)
4455             {
4456               isym.n_scnum = (*csectpp)->output_section->target_index;
4457               isym.n_value += ((*csectpp)->output_section->vma
4458                                + (*csectpp)->output_offset
4459                                - (*csectpp)->vma);
4460             }
4461
4462           /* Output the symbol.  */
4463           bfd_coff_swap_sym_out (output_bfd, (void *) &isym, (void *) outsym);
4464
4465           esym += isymesz;
4466           outsym += osymesz;
4467
4468           for (i = 0; i < isymp->n_numaux && esym < esym_end; i++)
4469             {
4470               union internal_auxent aux;
4471
4472               bfd_coff_swap_aux_in (input_bfd, (void *) esym, isymp->n_type,
4473                                     isymp->n_sclass, i, isymp->n_numaux,
4474                                     (void *) &aux);
4475
4476               if (isymp->n_sclass == C_FILE)
4477                 {
4478                   /* This is the file name (or some comment put in by
4479                      the compiler).  If it is long, we must put it in
4480                      the string table.  */
4481                   if (aux.x_file.x_n.x_zeroes == 0
4482                       && aux.x_file.x_n.x_offset != 0)
4483                     {
4484                       const char *filename;
4485                       bfd_size_type indx;
4486
4487                       BFD_ASSERT (aux.x_file.x_n.x_offset
4488                                   >= STRING_SIZE_SIZE);
4489                       if (strings == NULL)
4490                         {
4491                           strings = _bfd_coff_read_string_table (input_bfd);
4492                           if (strings == NULL)
4493                             return FALSE;
4494                         }
4495                       filename = strings + aux.x_file.x_n.x_offset;
4496                       indx = _bfd_stringtab_add (flinfo->strtab, filename,
4497                                                  hash, copy);
4498                       if (indx == (bfd_size_type) -1)
4499                         return FALSE;
4500                       aux.x_file.x_n.x_offset = STRING_SIZE_SIZE + indx;
4501                     }
4502                 }
4503               else if (CSECT_SYM_P (isymp->n_sclass)
4504                        && i + 1 == isymp->n_numaux)
4505                 {
4506
4507                   /* We don't support type checking.  I don't know if
4508                      anybody does.  */
4509                   aux.x_csect.x_parmhash = 0;
4510                   /* I don't think anybody uses these fields, but we'd
4511                      better clobber them just in case.  */
4512                   aux.x_csect.x_stab = 0;
4513                   aux.x_csect.x_snstab = 0;
4514
4515                   if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_LD)
4516                     {
4517                       unsigned long indx;
4518
4519                       indx = aux.x_csect.x_scnlen.l;
4520                       if (indx < obj_raw_syment_count (input_bfd))
4521                         {
4522                           long symindx;
4523
4524                           symindx = flinfo->sym_indices[indx];
4525                           if (symindx < 0)
4526                             {
4527                               aux.x_csect.x_scnlen.l = 0;
4528                             }
4529                           else
4530                             {
4531                               aux.x_csect.x_scnlen.l = symindx;
4532                             }
4533                         }
4534                     }
4535                 }
4536               else if (isymp->n_sclass != C_STAT || isymp->n_type != T_NULL)
4537                 {
4538                   unsigned long indx;
4539
4540                   if (ISFCN (isymp->n_type)
4541                       || ISTAG (isymp->n_sclass)
4542                       || isymp->n_sclass == C_BLOCK
4543                       || isymp->n_sclass == C_FCN)
4544                     {
4545                       indx = aux.x_sym.x_fcnary.x_fcn.x_endndx.l;
4546                       if (indx > 0
4547                           && indx < obj_raw_syment_count (input_bfd))
4548                         {
4549                           /* We look forward through the symbol for
4550                              the index of the next symbol we are going
4551                              to include.  I don't know if this is
4552                              entirely right.  */
4553                           while (flinfo->sym_indices[indx] < 0
4554                                  && indx < obj_raw_syment_count (input_bfd))
4555                             ++indx;
4556                           if (indx >= obj_raw_syment_count (input_bfd))
4557                             indx = output_index;
4558                           else
4559                             indx = flinfo->sym_indices[indx];
4560                           aux.x_sym.x_fcnary.x_fcn.x_endndx.l = indx;
4561
4562                         }
4563                     }
4564
4565                   indx = aux.x_sym.x_tagndx.l;
4566                   if (indx > 0 && indx < obj_raw_syment_count (input_bfd))
4567                     {
4568                       long symindx;
4569
4570                       symindx = flinfo->sym_indices[indx];
4571                       if (symindx < 0)
4572                         aux.x_sym.x_tagndx.l = 0;
4573                       else
4574                         aux.x_sym.x_tagndx.l = symindx;
4575                     }
4576
4577                 }
4578
4579               /* Copy over the line numbers, unless we are stripping
4580                  them.  We do this on a symbol by symbol basis in
4581                  order to more easily handle garbage collection.  */
4582               if (CSECT_SYM_P (isymp->n_sclass)
4583                   && i == 0
4584                   && isymp->n_numaux > 1
4585                   && ISFCN (isymp->n_type)
4586                   && aux.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0)
4587                 {
4588                   if (*lineno_counts == 0)
4589                     aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0;
4590                   else
4591                     {
4592                       asection *enclosing;
4593                       unsigned int enc_count;
4594                       bfd_signed_vma linoff;
4595                       struct internal_lineno lin;
4596                       bfd_byte *linp;
4597                       bfd_byte *linpend;
4598                       bfd_vma offset;
4599                       file_ptr pos;
4600                       bfd_size_type amt;
4601
4602                       /* Read in the enclosing section's line-number
4603                          information, if we haven't already.  */
4604                       o = *csectpp;
4605                       enclosing = xcoff_section_data (abfd, o)->enclosing;
4606                       enc_count = xcoff_section_data (abfd, o)->lineno_count;
4607                       if (oline != enclosing)
4608                         {
4609                           pos = enclosing->line_filepos;
4610                           amt = linesz * enc_count;
4611                           if (bfd_seek (input_bfd, pos, SEEK_SET) != 0
4612                               || (bfd_bread (flinfo->linenos, amt, input_bfd)
4613                                   != amt))
4614                             return FALSE;
4615                           oline = enclosing;
4616                         }
4617
4618                       /* Copy across the first entry, adjusting its
4619                          symbol index.  */
4620                       linoff = (aux.x_sym.x_fcnary.x_fcn.x_lnnoptr
4621                                 - enclosing->line_filepos);
4622                       linp = flinfo->linenos + linoff;
4623                       bfd_coff_swap_lineno_in (input_bfd, linp, &lin);
4624                       lin.l_addr.l_symndx = *indexp;
4625                       bfd_coff_swap_lineno_out (output_bfd, &lin, linp);
4626
4627                       /* Copy the other entries, adjusting their addresses.  */
4628                       linpend = linp + *lineno_counts * linesz;
4629                       offset = (o->output_section->vma
4630                                 + o->output_offset
4631                                 - o->vma);
4632                       for (linp += linesz; linp < linpend; linp += linesz)
4633                         {
4634                           bfd_coff_swap_lineno_in (input_bfd, linp, &lin);
4635                           lin.l_addr.l_paddr += offset;
4636                           bfd_coff_swap_lineno_out (output_bfd, &lin, linp);
4637                         }
4638
4639                       /* Write out the entries we've just processed.  */
4640                       pos = (o->output_section->line_filepos
4641                              + o->output_section->lineno_count * linesz);
4642                       amt = linesz * *lineno_counts;
4643                       if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
4644                           || bfd_bwrite (flinfo->linenos + linoff,
4645                                          amt, output_bfd) != amt)
4646                         return FALSE;
4647                       o->output_section->lineno_count += *lineno_counts;
4648
4649                       /* Record the offset of the symbol's line numbers
4650                          in the output file.  */
4651                       aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = pos;
4652
4653                       if (incls > 0)
4654                         {
4655                           struct internal_syment *iisp, *iispend;
4656                           long *iindp;
4657                           bfd_byte *oos;
4658                           bfd_vma range_start, range_end;
4659                           int iiadd;
4660
4661                           /* Update any C_BINCL or C_EINCL symbols
4662                              that refer to a line number in the
4663                              range we just output.  */
4664                           iisp = flinfo->internal_syms;
4665                           iispend = iisp + obj_raw_syment_count (input_bfd);
4666                           iindp = flinfo->sym_indices;
4667                           oos = flinfo->outsyms;
4668                           range_start = enclosing->line_filepos + linoff;
4669                           range_end = range_start + *lineno_counts * linesz;
4670                           while (iisp < iispend)
4671                             {
4672                               if (*iindp >= 0
4673                                   && (iisp->n_sclass == C_BINCL
4674                                       || iisp->n_sclass == C_EINCL)
4675                                   && iisp->n_value >= range_start
4676                                   && iisp->n_value < range_end)
4677                                 {
4678                                   struct internal_syment iis;
4679
4680                                   bfd_coff_swap_sym_in (output_bfd, oos, &iis);
4681                                   iis.n_value = (iisp->n_value
4682                                                  - range_start
4683                                                  + pos);
4684                                   bfd_coff_swap_sym_out (output_bfd,
4685                                                          &iis, oos);
4686                                   --incls;
4687                                 }
4688
4689                               iiadd = 1 + iisp->n_numaux;
4690                               if (*iindp >= 0)
4691                                 oos += iiadd * osymesz;
4692                               iisp += iiadd;
4693                               iindp += iiadd;
4694                             }
4695                         }
4696                     }
4697                 }
4698
4699               bfd_coff_swap_aux_out (output_bfd, (void *) &aux, isymp->n_type,
4700                                      isymp->n_sclass, i, isymp->n_numaux,
4701                                      (void *) outsym);
4702               outsym += osymesz;
4703               esym += isymesz;
4704             }
4705         }
4706
4707       sym_hash += add;
4708       indexp += add;
4709       isymp += add;
4710       csectpp += add;
4711       lineno_counts += add;
4712       debug_index += add;
4713     }
4714
4715   /* If we swapped out a C_FILE symbol, guess that the next C_FILE
4716      symbol will be the first symbol in the next input file.  In the
4717      normal case, this will save us from writing out the C_FILE symbol
4718      again.  */
4719   if (flinfo->last_file_index != -1
4720       && (bfd_size_type) flinfo->last_file_index >= syment_base)
4721     {
4722       flinfo->last_file.n_value = output_index;
4723       bfd_coff_swap_sym_out (output_bfd, (void *) &flinfo->last_file,
4724                              (void *) (flinfo->outsyms
4725                                     + ((flinfo->last_file_index - syment_base)
4726                                        * osymesz)));
4727     }
4728
4729   /* Write the modified symbols to the output file.  */
4730   if (outsym > flinfo->outsyms)
4731     {
4732       file_ptr pos = obj_sym_filepos (output_bfd) + syment_base * osymesz;
4733       bfd_size_type amt = outsym - flinfo->outsyms;
4734       if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
4735           || bfd_bwrite (flinfo->outsyms, amt, output_bfd) != amt)
4736         return FALSE;
4737
4738       BFD_ASSERT ((obj_raw_syment_count (output_bfd)
4739                    + (outsym - flinfo->outsyms) / osymesz)
4740                   == output_index);
4741
4742       obj_raw_syment_count (output_bfd) = output_index;
4743     }
4744
4745   /* Don't let the linker relocation routines discard the symbols.  */
4746   keep_syms = obj_coff_keep_syms (input_bfd);
4747   obj_coff_keep_syms (input_bfd) = TRUE;
4748
4749   /* Relocate the contents of each section.  */
4750   for (o = input_bfd->sections; o != NULL; o = o->next)
4751     {
4752       bfd_byte *contents;
4753
4754       if (! o->linker_mark)
4755         /* This section was omitted from the link.  */
4756         continue;
4757
4758       if ((o->flags & SEC_HAS_CONTENTS) == 0
4759           || o->size == 0
4760           || (o->flags & SEC_IN_MEMORY) != 0)
4761         continue;
4762
4763       /* We have set filepos correctly for the sections we created to
4764          represent csects, so bfd_get_section_contents should work.  */
4765       if (coff_section_data (input_bfd, o) != NULL
4766           && coff_section_data (input_bfd, o)->contents != NULL)
4767         contents = coff_section_data (input_bfd, o)->contents;
4768       else
4769         {
4770           bfd_size_type sz = o->rawsize ? o->rawsize : o->size;
4771           if (!bfd_get_section_contents (input_bfd, o, flinfo->contents, 0, sz))
4772             return FALSE;
4773           contents = flinfo->contents;
4774         }
4775
4776       if ((o->flags & SEC_RELOC) != 0)
4777         {
4778           int target_index;
4779           struct internal_reloc *internal_relocs;
4780           struct internal_reloc *irel;
4781           bfd_vma offset;
4782           struct internal_reloc *irelend;
4783           struct xcoff_link_hash_entry **rel_hash;
4784           long r_symndx;
4785
4786           /* Read in the relocs.  */
4787           target_index = o->output_section->target_index;
4788           internal_relocs = (xcoff_read_internal_relocs
4789                              (input_bfd, o, FALSE, flinfo->external_relocs,
4790                               TRUE,
4791                               (flinfo->section_info[target_index].relocs
4792                                + o->output_section->reloc_count)));
4793           if (internal_relocs == NULL)
4794             return FALSE;
4795
4796           /* Call processor specific code to relocate the section
4797              contents.  */
4798           if (! bfd_coff_relocate_section (output_bfd, flinfo->info,
4799                                            input_bfd, o,
4800                                            contents,
4801                                            internal_relocs,
4802                                            flinfo->internal_syms,
4803                                            xcoff_data (input_bfd)->csects))
4804             return FALSE;
4805
4806           offset = o->output_section->vma + o->output_offset - o->vma;
4807           irel = internal_relocs;
4808           irelend = irel + o->reloc_count;
4809           rel_hash = (flinfo->section_info[target_index].rel_hashes
4810                       + o->output_section->reloc_count);
4811           for (; irel < irelend; irel++, rel_hash++)
4812             {
4813               struct xcoff_link_hash_entry *h = NULL;
4814
4815               *rel_hash = NULL;
4816
4817               /* Adjust the reloc address and symbol index.  */
4818
4819               irel->r_vaddr += offset;
4820
4821               r_symndx = irel->r_symndx;
4822
4823               if (r_symndx == -1)
4824                 h = NULL;
4825               else
4826                 h = obj_xcoff_sym_hashes (input_bfd)[r_symndx];
4827
4828               if (r_symndx != -1 && flinfo->info->strip != strip_all)
4829                 {
4830                   if (h != NULL
4831                       && h->smclas != XMC_TD
4832                       && (irel->r_type == R_TOC
4833                           || irel->r_type == R_GL
4834                           || irel->r_type == R_TCL
4835                           || irel->r_type == R_TRL
4836                           || irel->r_type == R_TRLA))
4837                     {
4838                       /* This is a TOC relative reloc with a symbol
4839                          attached.  The symbol should be the one which
4840                          this reloc is for.  We want to make this
4841                          reloc against the TOC address of the symbol,
4842                          not the symbol itself.  */
4843                       BFD_ASSERT (h->toc_section != NULL);
4844                       BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0);
4845                       if (h->u.toc_indx != -1)
4846                         irel->r_symndx = h->u.toc_indx;
4847                       else
4848                         {
4849                           struct xcoff_toc_rel_hash *n;
4850                           struct xcoff_link_section_info *si;
4851                           bfd_size_type amt;
4852
4853                           amt = sizeof (* n);
4854                           n = bfd_alloc (flinfo->output_bfd, amt);
4855                           if (n == NULL)
4856                             return FALSE;
4857                           si = flinfo->section_info + target_index;
4858                           n->next = si->toc_rel_hashes;
4859                           n->h = h;
4860                           n->rel = irel;
4861                           si->toc_rel_hashes = n;
4862                         }
4863                     }
4864                   else if (h != NULL)
4865                     {
4866                       /* This is a global symbol.  */
4867                       if (h->indx >= 0)
4868                         irel->r_symndx = h->indx;
4869                       else
4870                         {
4871                           /* This symbol is being written at the end
4872                              of the file, and we do not yet know the
4873                              symbol index.  We save the pointer to the
4874                              hash table entry in the rel_hash list.
4875                              We set the indx field to -2 to indicate
4876                              that this symbol must not be stripped.  */
4877                           *rel_hash = h;
4878                           h->indx = -2;
4879                         }
4880                     }
4881                   else
4882                     {
4883                       long indx;
4884
4885                       indx = flinfo->sym_indices[r_symndx];
4886
4887                       if (indx == -1)
4888                         {
4889                           struct internal_syment *is;
4890
4891                           /* Relocations against a TC0 TOC anchor are
4892                              automatically transformed to be against
4893                              the TOC anchor in the output file.  */
4894                           is = flinfo->internal_syms + r_symndx;
4895                           if (is->n_sclass == C_HIDEXT
4896                               && is->n_numaux > 0)
4897                             {
4898                               void * auxptr;
4899                               union internal_auxent aux;
4900
4901                               auxptr = ((void *)
4902                                         (((bfd_byte *)
4903                                           obj_coff_external_syms (input_bfd))
4904                                          + ((r_symndx + is->n_numaux)
4905                                             * isymesz)));
4906                               bfd_coff_swap_aux_in (input_bfd, auxptr,
4907                                                     is->n_type, is->n_sclass,
4908                                                     is->n_numaux - 1,
4909                                                     is->n_numaux,
4910                                                     (void *) &aux);
4911                               if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_SD
4912                                   && aux.x_csect.x_smclas == XMC_TC0)
4913                                 indx = flinfo->toc_symindx;
4914                             }
4915                         }
4916
4917                       if (indx != -1)
4918                         irel->r_symndx = indx;
4919                       else
4920                         {
4921
4922                           struct internal_syment *is;
4923
4924                           const char *name;
4925                           char buf[SYMNMLEN + 1];
4926
4927                           /* This reloc is against a symbol we are
4928                              stripping.  It would be possible to handle
4929                              this case, but I don't think it's worth it.  */
4930                           is = flinfo->internal_syms + r_symndx;
4931
4932                           if (is->n_sclass != C_DWARF)
4933                             {
4934                               name = (_bfd_coff_internal_syment_name
4935                                       (input_bfd, is, buf));
4936
4937                               if (name == NULL)
4938                                 return FALSE;
4939
4940                               if (!(*flinfo->info->callbacks->unattached_reloc)
4941                                   (flinfo->info, name, input_bfd, o,
4942                                    irel->r_vaddr))
4943                                 return FALSE;
4944                             }
4945                         }
4946                     }
4947                 }
4948
4949               if ((o->flags & SEC_DEBUGGING) == 0
4950                   && xcoff_need_ldrel_p (flinfo->info, irel, h))
4951                 {
4952                   asection *sec;
4953
4954                   if (r_symndx == -1)
4955                     sec = NULL;
4956                   else if (h == NULL)
4957                     sec = xcoff_data (input_bfd)->csects[r_symndx];
4958                   else
4959                     sec = xcoff_symbol_section (h);
4960                   if (!xcoff_create_ldrel (output_bfd, flinfo,
4961                                            o->output_section, input_bfd,
4962                                            irel, sec, h))
4963                     return FALSE;
4964                 }
4965             }
4966
4967           o->output_section->reloc_count += o->reloc_count;
4968         }
4969
4970       /* Write out the modified section contents.  */
4971       if (! bfd_set_section_contents (output_bfd, o->output_section,
4972                                       contents, (file_ptr) o->output_offset,
4973                                       o->size))
4974         return FALSE;
4975     }
4976
4977   obj_coff_keep_syms (input_bfd) = keep_syms;
4978
4979   if (! flinfo->info->keep_memory)
4980     {
4981       if (! _bfd_coff_free_symbols (input_bfd))
4982         return FALSE;
4983     }
4984
4985   return TRUE;
4986 }
4987
4988 #undef N_TMASK
4989 #undef N_BTSHFT
4990
4991 /* Sort relocs by VMA.  This is called via qsort.  */
4992
4993 static int
4994 xcoff_sort_relocs (const void * p1, const void * p2)
4995 {
4996   const struct internal_reloc *r1 = (const struct internal_reloc *) p1;
4997   const struct internal_reloc *r2 = (const struct internal_reloc *) p2;
4998
4999   if (r1->r_vaddr > r2->r_vaddr)
5000     return 1;
5001   else if (r1->r_vaddr < r2->r_vaddr)
5002     return -1;
5003   else
5004     return 0;
5005 }
5006
5007 /* Return true if section SEC is a TOC section.  */
5008
5009 static inline bfd_boolean
5010 xcoff_toc_section_p (asection *sec)
5011 {
5012   const char *name;
5013
5014   name = sec->name;
5015   if (name[0] == '.' && name[1] == 't')
5016     {
5017       if (name[2] == 'c')
5018         {
5019           if (name[3] == '0' && name[4] == 0)
5020             return TRUE;
5021           if (name[3] == 0)
5022             return TRUE;
5023         }
5024       if (name[2] == 'd' && name[3] == 0)
5025         return TRUE;
5026     }
5027   return FALSE;
5028 }
5029
5030 /* See if the link requires a TOC (it usually does!).  If so, find a
5031    good place to put the TOC anchor csect, and write out the associated
5032    symbol.  */
5033
5034 static bfd_boolean
5035 xcoff_find_tc0 (bfd *output_bfd, struct xcoff_final_link_info *flinfo)
5036 {
5037   bfd_vma toc_start, toc_end, start, end, best_address;
5038   asection *sec;
5039   bfd *input_bfd;
5040   int section_index;
5041   struct internal_syment irsym;
5042   union internal_auxent iraux;
5043   file_ptr pos;
5044   size_t size;
5045
5046   /* Set [TOC_START, TOC_END) to the range of the TOC.  Record the
5047      index of a csect at the beginning of the TOC.  */
5048   toc_start = ~(bfd_vma) 0;
5049   toc_end = 0;
5050   section_index = -1;
5051   for (input_bfd = flinfo->info->input_bfds;
5052        input_bfd != NULL;
5053        input_bfd = input_bfd->link.next)
5054     for (sec = input_bfd->sections; sec != NULL; sec = sec->next)
5055       if ((sec->flags & SEC_MARK) != 0 && xcoff_toc_section_p (sec))
5056         {
5057           start = sec->output_section->vma + sec->output_offset;
5058           if (toc_start > start)
5059             {
5060               toc_start = start;
5061               section_index = sec->output_section->target_index;
5062             }
5063
5064           end = start + sec->size;
5065           if (toc_end < end)
5066             toc_end = end;
5067         }
5068
5069   /* There's no need for a TC0 symbol if we don't have a TOC.  */
5070   if (toc_end < toc_start)
5071     {
5072       xcoff_data (output_bfd)->toc = toc_start;
5073       return TRUE;
5074     }
5075
5076   if (toc_end - toc_start < 0x8000)
5077     /* Every TOC csect can be accessed from TOC_START.  */
5078     best_address = toc_start;
5079   else
5080     {
5081       /* Find the lowest TOC csect that is still within range of TOC_END.  */
5082       best_address = toc_end;
5083       for (input_bfd = flinfo->info->input_bfds;
5084            input_bfd != NULL;
5085            input_bfd = input_bfd->link.next)
5086         for (sec = input_bfd->sections; sec != NULL; sec = sec->next)
5087           if ((sec->flags & SEC_MARK) != 0 && xcoff_toc_section_p (sec))
5088             {
5089               start = sec->output_section->vma + sec->output_offset;
5090               if (start < best_address
5091                   && start + 0x8000 >= toc_end)
5092                 {
5093                   best_address = start;
5094                   section_index = sec->output_section->target_index;
5095                 }
5096             }
5097
5098       /* Make sure that the start of the TOC is also within range.  */
5099       if (best_address > toc_start + 0x8000)
5100         {
5101           (*_bfd_error_handler)
5102             (_("TOC overflow: 0x%lx > 0x10000; try -mminimal-toc "
5103                "when compiling"),
5104              (unsigned long) (toc_end - toc_start));
5105           bfd_set_error (bfd_error_file_too_big);
5106           return FALSE;
5107         }
5108     }
5109
5110   /* Record the chosen TOC value.  */
5111   flinfo->toc_symindx = obj_raw_syment_count (output_bfd);
5112   xcoff_data (output_bfd)->toc = best_address;
5113   xcoff_data (output_bfd)->sntoc = section_index;
5114
5115   /* Fill out the TC0 symbol.  */
5116   if (!bfd_xcoff_put_symbol_name (output_bfd, flinfo->strtab, &irsym, "TOC"))
5117     return FALSE;
5118   irsym.n_value = best_address;
5119   irsym.n_scnum = section_index;
5120   irsym.n_sclass = C_HIDEXT;
5121   irsym.n_type = T_NULL;
5122   irsym.n_numaux = 1;
5123   bfd_coff_swap_sym_out (output_bfd, &irsym, flinfo->outsyms);
5124
5125   /* Fill out the auxillary csect information.  */
5126   memset (&iraux, 0, sizeof iraux);
5127   iraux.x_csect.x_smtyp = XTY_SD;
5128   iraux.x_csect.x_smclas = XMC_TC0;
5129   iraux.x_csect.x_scnlen.l = 0;
5130   bfd_coff_swap_aux_out (output_bfd, &iraux, T_NULL, C_HIDEXT, 0, 1,
5131                          flinfo->outsyms + bfd_coff_symesz (output_bfd));
5132
5133   /* Write the contents to the file.  */
5134   pos = obj_sym_filepos (output_bfd);
5135   pos += obj_raw_syment_count (output_bfd) * bfd_coff_symesz (output_bfd);
5136   size = 2 * bfd_coff_symesz (output_bfd);
5137   if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
5138       || bfd_bwrite (flinfo->outsyms, size, output_bfd) != size)
5139     return FALSE;
5140   obj_raw_syment_count (output_bfd) += 2;
5141
5142   return TRUE;
5143 }
5144
5145 /* Write out a non-XCOFF global symbol.  */
5146
5147 static bfd_boolean
5148 xcoff_write_global_symbol (struct bfd_hash_entry *bh, void * inf)
5149 {
5150   struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) bh;
5151   struct xcoff_final_link_info *flinfo = (struct xcoff_final_link_info *) inf;
5152   bfd *output_bfd;
5153   bfd_byte *outsym;
5154   struct internal_syment isym;
5155   union internal_auxent aux;
5156   bfd_boolean result;
5157   file_ptr pos;
5158   bfd_size_type amt;
5159
5160   output_bfd = flinfo->output_bfd;
5161   outsym = flinfo->outsyms;
5162
5163   if (h->root.type == bfd_link_hash_warning)
5164     {
5165       h = (struct xcoff_link_hash_entry *) h->root.u.i.link;
5166       if (h->root.type == bfd_link_hash_new)
5167         return TRUE;
5168     }
5169
5170   /* If this symbol was garbage collected, just skip it.  */
5171   if (xcoff_hash_table (flinfo->info)->gc
5172       && (h->flags & XCOFF_MARK) == 0)
5173     return TRUE;
5174
5175   /* If we need a .loader section entry, write it out.  */
5176   if (h->ldsym != NULL)
5177     {
5178       struct internal_ldsym *ldsym;
5179       bfd *impbfd;
5180
5181       ldsym = h->ldsym;
5182
5183       if (h->root.type == bfd_link_hash_undefined
5184           || h->root.type == bfd_link_hash_undefweak)
5185         {
5186
5187           ldsym->l_value = 0;
5188           ldsym->l_scnum = N_UNDEF;
5189           ldsym->l_smtype = XTY_ER;
5190           impbfd = h->root.u.undef.abfd;
5191
5192         }
5193       else if (h->root.type == bfd_link_hash_defined
5194                || h->root.type == bfd_link_hash_defweak)
5195         {
5196           asection *sec;
5197
5198           sec = h->root.u.def.section;
5199           ldsym->l_value = (sec->output_section->vma
5200                             + sec->output_offset
5201                             + h->root.u.def.value);
5202           ldsym->l_scnum = sec->output_section->target_index;
5203           ldsym->l_smtype = XTY_SD;
5204           impbfd = sec->owner;
5205
5206         }
5207       else
5208         abort ();
5209
5210       if (((h->flags & XCOFF_DEF_REGULAR) == 0
5211            && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
5212           || (h->flags & XCOFF_IMPORT) != 0)
5213         /* Clear l_smtype
5214            Import symbols are defined so the check above will make
5215            the l_smtype XTY_SD.  But this is not correct, it should
5216            be cleared.  */
5217         ldsym->l_smtype |= L_IMPORT;
5218
5219       if (((h->flags & XCOFF_DEF_REGULAR) != 0
5220            && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
5221           || (h->flags & XCOFF_EXPORT) != 0)
5222         ldsym->l_smtype |= L_EXPORT;
5223
5224       if ((h->flags & XCOFF_ENTRY) != 0)
5225         ldsym->l_smtype |= L_ENTRY;
5226
5227       if ((h->flags & XCOFF_RTINIT) != 0)
5228         ldsym->l_smtype = XTY_SD;
5229
5230       ldsym->l_smclas = h->smclas;
5231
5232       if (ldsym->l_smtype & L_IMPORT)
5233         {
5234           if ((h->root.type == bfd_link_hash_defined
5235                || h->root.type == bfd_link_hash_defweak)
5236               && (h->root.u.def.value != 0))
5237             ldsym->l_smclas = XMC_XO;
5238
5239           else if ((h->flags & (XCOFF_SYSCALL32 | XCOFF_SYSCALL64)) ==
5240                    (XCOFF_SYSCALL32 | XCOFF_SYSCALL64))
5241             ldsym->l_smclas = XMC_SV3264;
5242
5243           else if (h->flags & XCOFF_SYSCALL32)
5244             ldsym->l_smclas = XMC_SV;
5245
5246           else if (h->flags & XCOFF_SYSCALL64)
5247             ldsym->l_smclas = XMC_SV64;
5248         }
5249
5250       if (ldsym->l_ifile == -(bfd_size_type) 1)
5251         {
5252           ldsym->l_ifile = 0;
5253         }
5254       else if (ldsym->l_ifile == 0)
5255         {
5256           if ((ldsym->l_smtype & L_IMPORT) == 0)
5257             ldsym->l_ifile = 0;
5258           else if (impbfd == NULL)
5259             ldsym->l_ifile = 0;
5260           else
5261             {
5262               BFD_ASSERT (impbfd->xvec == output_bfd->xvec);
5263               ldsym->l_ifile = xcoff_data (impbfd)->import_file_id;
5264             }
5265         }
5266
5267       ldsym->l_parm = 0;
5268
5269       BFD_ASSERT (h->ldindx >= 0);
5270
5271       bfd_xcoff_swap_ldsym_out (output_bfd, ldsym,
5272                                 (flinfo->ldsym +
5273                                  (h->ldindx - 3)
5274                                  * bfd_xcoff_ldsymsz(flinfo->output_bfd)));
5275       h->ldsym = NULL;
5276     }
5277
5278   /* If this symbol needs global linkage code, write it out.  */
5279   if (h->root.type == bfd_link_hash_defined
5280       && (h->root.u.def.section
5281           == xcoff_hash_table (flinfo->info)->linkage_section))
5282     {
5283       bfd_byte *p;
5284       bfd_vma tocoff;
5285       unsigned int i;
5286
5287       p = h->root.u.def.section->contents + h->root.u.def.value;
5288
5289       /* The first instruction in the global linkage code loads a
5290          specific TOC element.  */
5291       tocoff = (h->descriptor->toc_section->output_section->vma
5292                 + h->descriptor->toc_section->output_offset
5293                 - xcoff_data (output_bfd)->toc);
5294
5295       if ((h->descriptor->flags & XCOFF_SET_TOC) != 0)
5296         tocoff += h->descriptor->u.toc_offset;
5297
5298       /* The first instruction in the glink code needs to be
5299          cooked to to hold the correct offset in the toc.  The
5300          rest are just output raw.  */
5301       bfd_put_32 (output_bfd,
5302                   bfd_xcoff_glink_code(output_bfd, 0) | (tocoff & 0xffff), p);
5303
5304       /* Start with i == 1 to get past the first instruction done above
5305          The /4 is because the glink code is in bytes and we are going
5306          4 at a pop.  */
5307       for (i = 1; i < bfd_xcoff_glink_code_size(output_bfd) / 4; i++)
5308         bfd_put_32 (output_bfd,
5309                     (bfd_vma) bfd_xcoff_glink_code(output_bfd, i),
5310                     &p[4 * i]);
5311     }
5312
5313   /* If we created a TOC entry for this symbol, write out the required
5314      relocs.  */
5315   if ((h->flags & XCOFF_SET_TOC) != 0)
5316     {
5317       asection *tocsec;
5318       asection *osec;
5319       int oindx;
5320       struct internal_reloc *irel;
5321       struct internal_syment irsym;
5322       union internal_auxent iraux;
5323
5324       tocsec = h->toc_section;
5325       osec = tocsec->output_section;
5326       oindx = osec->target_index;
5327       irel = flinfo->section_info[oindx].relocs + osec->reloc_count;
5328       irel->r_vaddr = (osec->vma
5329                        + tocsec->output_offset
5330                        + h->u.toc_offset);
5331
5332       if (h->indx >= 0)
5333         irel->r_symndx = h->indx;
5334       else
5335         {
5336           h->indx = -2;
5337           irel->r_symndx = obj_raw_syment_count (output_bfd);
5338         }
5339
5340       BFD_ASSERT (h->ldindx >= 0);
5341
5342       /* Initialize the aux union here instead of closer to when it is
5343          written out below because the length of the csect depends on
5344          whether the output is 32 or 64 bit.  */
5345       memset (&iraux, 0, sizeof iraux);
5346       iraux.x_csect.x_smtyp = XTY_SD;
5347       /* iraux.x_csect.x_scnlen.l = 4 or 8, see below.  */
5348       iraux.x_csect.x_smclas = XMC_TC;
5349
5350       /* 32 bit uses a 32 bit R_POS to do the relocations
5351          64 bit uses a 64 bit R_POS to do the relocations
5352
5353          Also needs to change the csect size : 4 for 32 bit, 8 for 64 bit
5354
5355          Which one is determined by the backend.  */
5356       if (bfd_xcoff_is_xcoff64 (output_bfd))
5357         {
5358           irel->r_size = 63;
5359           iraux.x_csect.x_scnlen.l = 8;
5360         }
5361       else if (bfd_xcoff_is_xcoff32 (output_bfd))
5362         {
5363           irel->r_size = 31;
5364           iraux.x_csect.x_scnlen.l = 4;
5365         }
5366       else
5367         return FALSE;
5368
5369       irel->r_type = R_POS;
5370       flinfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
5371       ++osec->reloc_count;
5372
5373       if (!xcoff_create_ldrel (output_bfd, flinfo, osec,
5374                                output_bfd, irel, NULL, h))
5375         return FALSE;
5376
5377       /* We need to emit a symbol to define a csect which holds
5378          the reloc.  */
5379       if (flinfo->info->strip != strip_all)
5380         {
5381           result = bfd_xcoff_put_symbol_name (output_bfd, flinfo->strtab,
5382                                               &irsym, h->root.root.string);
5383           if (!result)
5384             return FALSE;
5385
5386           irsym.n_value = irel->r_vaddr;
5387           irsym.n_scnum = osec->target_index;
5388           irsym.n_sclass = C_HIDEXT;
5389           irsym.n_type = T_NULL;
5390           irsym.n_numaux = 1;
5391
5392           bfd_coff_swap_sym_out (output_bfd, (void *) &irsym, (void *) outsym);
5393           outsym += bfd_coff_symesz (output_bfd);
5394
5395           /* Note : iraux is initialized above.  */
5396           bfd_coff_swap_aux_out (output_bfd, (void *) &iraux, T_NULL, C_HIDEXT,
5397                                  0, 1, (void *) outsym);
5398           outsym += bfd_coff_auxesz (output_bfd);
5399
5400           if (h->indx >= 0)
5401             {
5402               /* We aren't going to write out the symbols below, so we
5403                  need to write them out now.  */
5404               pos = obj_sym_filepos (output_bfd);
5405               pos += (obj_raw_syment_count (output_bfd)
5406                       * bfd_coff_symesz (output_bfd));
5407               amt = outsym - flinfo->outsyms;
5408               if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
5409                   || bfd_bwrite (flinfo->outsyms, amt, output_bfd) != amt)
5410                 return FALSE;
5411               obj_raw_syment_count (output_bfd) +=
5412                 (outsym - flinfo->outsyms) / bfd_coff_symesz (output_bfd);
5413
5414               outsym = flinfo->outsyms;
5415             }
5416         }
5417     }
5418
5419   /* If this symbol is a specially defined function descriptor, write
5420      it out.  The first word is the address of the function code
5421      itself, the second word is the address of the TOC, and the third
5422      word is zero.
5423
5424      32 bit vs 64 bit
5425      The addresses for the 32 bit will take 4 bytes and the addresses
5426      for 64 bit will take 8 bytes.  Similar for the relocs.  This type
5427      of logic was also done above to create a TOC entry in
5428      xcoff_write_global_symbol.  */
5429   if ((h->flags & XCOFF_DESCRIPTOR) != 0
5430       && h->root.type == bfd_link_hash_defined
5431       && (h->root.u.def.section
5432           == xcoff_hash_table (flinfo->info)->descriptor_section))
5433     {
5434       asection *sec;
5435       asection *osec;
5436       int oindx;
5437       bfd_byte *p;
5438       struct xcoff_link_hash_entry *hentry;
5439       asection *esec;
5440       struct internal_reloc *irel;
5441       asection *tsec;
5442       unsigned int reloc_size, byte_size;
5443
5444       if (bfd_xcoff_is_xcoff64 (output_bfd))
5445         {
5446           reloc_size = 63;
5447           byte_size = 8;
5448         }
5449       else if (bfd_xcoff_is_xcoff32 (output_bfd))
5450         {
5451           reloc_size = 31;
5452           byte_size = 4;
5453         }
5454       else
5455         return FALSE;
5456
5457       sec = h->root.u.def.section;
5458       osec = sec->output_section;
5459       oindx = osec->target_index;
5460       p = sec->contents + h->root.u.def.value;
5461
5462       hentry = h->descriptor;
5463       BFD_ASSERT (hentry != NULL
5464                   && (hentry->root.type == bfd_link_hash_defined
5465                       || hentry->root.type == bfd_link_hash_defweak));
5466       esec = hentry->root.u.def.section;
5467
5468       irel = flinfo->section_info[oindx].relocs + osec->reloc_count;
5469       irel->r_vaddr = (osec->vma
5470                        + sec->output_offset
5471                        + h->root.u.def.value);
5472       irel->r_symndx = esec->output_section->target_index;
5473       irel->r_type = R_POS;
5474       irel->r_size = reloc_size;
5475       flinfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
5476       ++osec->reloc_count;
5477
5478       if (!xcoff_create_ldrel (output_bfd, flinfo, osec,
5479                                output_bfd, irel, esec, NULL))
5480         return FALSE;
5481
5482       /* There are three items to write out,
5483          the address of the code
5484          the address of the toc anchor
5485          the environment pointer.
5486          We are ignoring the environment pointer.  So set it to zero.  */
5487       if (bfd_xcoff_is_xcoff64 (output_bfd))
5488         {
5489           bfd_put_64 (output_bfd,
5490                       (esec->output_section->vma + esec->output_offset
5491                        + hentry->root.u.def.value),
5492                       p);
5493           bfd_put_64 (output_bfd, xcoff_data (output_bfd)->toc, p + 8);
5494           bfd_put_64 (output_bfd, (bfd_vma) 0, p + 16);
5495         }
5496       else
5497         {
5498           /* 32 bit backend
5499              This logic was already called above so the error case where
5500              the backend is neither has already been checked.  */
5501           bfd_put_32 (output_bfd,
5502                       (esec->output_section->vma + esec->output_offset
5503                        + hentry->root.u.def.value),
5504                       p);
5505           bfd_put_32 (output_bfd, xcoff_data (output_bfd)->toc, p + 4);
5506           bfd_put_32 (output_bfd, (bfd_vma) 0, p + 8);
5507         }
5508
5509       tsec = coff_section_from_bfd_index (output_bfd,
5510                                           xcoff_data (output_bfd)->sntoc);
5511
5512       ++irel;
5513       irel->r_vaddr = (osec->vma
5514                        + sec->output_offset
5515                        + h->root.u.def.value
5516                        + byte_size);
5517       irel->r_symndx = tsec->output_section->target_index;
5518       irel->r_type = R_POS;
5519       irel->r_size = reloc_size;
5520       flinfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
5521       ++osec->reloc_count;
5522
5523       if (!xcoff_create_ldrel (output_bfd, flinfo, osec,
5524                                output_bfd, irel, tsec, NULL))
5525         return FALSE;
5526     }
5527
5528   if (h->indx >= 0 || flinfo->info->strip == strip_all)
5529     {
5530       BFD_ASSERT (outsym == flinfo->outsyms);
5531       return TRUE;
5532     }
5533
5534   if (h->indx != -2
5535       && (flinfo->info->strip == strip_all
5536           || (flinfo->info->strip == strip_some
5537               && bfd_hash_lookup (flinfo->info->keep_hash, h->root.root.string,
5538                                   FALSE, FALSE) == NULL)))
5539     {
5540       BFD_ASSERT (outsym == flinfo->outsyms);
5541       return TRUE;
5542     }
5543
5544   if (h->indx != -2
5545       && (h->flags & (XCOFF_REF_REGULAR | XCOFF_DEF_REGULAR)) == 0)
5546     {
5547       BFD_ASSERT (outsym == flinfo->outsyms);
5548       return TRUE;
5549     }
5550
5551   memset (&aux, 0, sizeof aux);
5552
5553   h->indx = obj_raw_syment_count (output_bfd);
5554
5555   result = bfd_xcoff_put_symbol_name (output_bfd, flinfo->strtab, &isym,
5556                                       h->root.root.string);
5557   if (!result)
5558     return FALSE;
5559
5560   if (h->root.type == bfd_link_hash_undefined
5561       || h->root.type == bfd_link_hash_undefweak)
5562     {
5563       isym.n_value = 0;
5564       isym.n_scnum = N_UNDEF;
5565       if (h->root.type == bfd_link_hash_undefweak
5566           && C_WEAKEXT == C_AIX_WEAKEXT)
5567         isym.n_sclass = C_WEAKEXT;
5568       else
5569         isym.n_sclass = C_EXT;
5570       aux.x_csect.x_smtyp = XTY_ER;
5571     }
5572   else if ((h->root.type == bfd_link_hash_defined
5573             || h->root.type == bfd_link_hash_defweak)
5574            && h->smclas == XMC_XO)
5575     {
5576       BFD_ASSERT (bfd_is_abs_section (h->root.u.def.section));
5577       isym.n_value = h->root.u.def.value;
5578       isym.n_scnum = N_UNDEF;
5579       if (h->root.type == bfd_link_hash_undefweak
5580           && C_WEAKEXT == C_AIX_WEAKEXT)
5581         isym.n_sclass = C_WEAKEXT;
5582       else
5583         isym.n_sclass = C_EXT;
5584       aux.x_csect.x_smtyp = XTY_ER;
5585     }
5586   else if (h->root.type == bfd_link_hash_defined
5587            || h->root.type == bfd_link_hash_defweak)
5588     {
5589       struct xcoff_link_size_list *l;
5590
5591       isym.n_value = (h->root.u.def.section->output_section->vma
5592                       + h->root.u.def.section->output_offset
5593                       + h->root.u.def.value);
5594       if (bfd_is_abs_section (h->root.u.def.section->output_section))
5595         isym.n_scnum = N_ABS;
5596       else
5597         isym.n_scnum = h->root.u.def.section->output_section->target_index;
5598       isym.n_sclass = C_HIDEXT;
5599       aux.x_csect.x_smtyp = XTY_SD;
5600
5601       if ((h->flags & XCOFF_HAS_SIZE) != 0)
5602         {
5603           for (l = xcoff_hash_table (flinfo->info)->size_list;
5604                l != NULL;
5605                l = l->next)
5606             {
5607               if (l->h == h)
5608                 {
5609                   aux.x_csect.x_scnlen.l = l->size;
5610                   break;
5611                 }
5612             }
5613         }
5614     }
5615   else if (h->root.type == bfd_link_hash_common)
5616     {
5617       isym.n_value = (h->root.u.c.p->section->output_section->vma
5618                       + h->root.u.c.p->section->output_offset);
5619       isym.n_scnum = h->root.u.c.p->section->output_section->target_index;
5620       isym.n_sclass = C_EXT;
5621       aux.x_csect.x_smtyp = XTY_CM;
5622       aux.x_csect.x_scnlen.l = h->root.u.c.size;
5623     }
5624   else
5625     abort ();
5626
5627   isym.n_type = T_NULL;
5628   isym.n_numaux = 1;
5629
5630   bfd_coff_swap_sym_out (output_bfd, (void *) &isym, (void *) outsym);
5631   outsym += bfd_coff_symesz (output_bfd);
5632
5633   aux.x_csect.x_smclas = h->smclas;
5634   bfd_coff_swap_aux_out (output_bfd, (void *) &aux, T_NULL, isym.n_sclass, 0, 1,
5635                          (void *) outsym);
5636   outsym += bfd_coff_auxesz (output_bfd);
5637
5638   if ((h->root.type == bfd_link_hash_defined
5639        || h->root.type == bfd_link_hash_defweak)
5640       && h->smclas != XMC_XO)
5641     {
5642       /* We just output an SD symbol.  Now output an LD symbol.  */
5643       h->indx += 2;
5644
5645       if (h->root.type == bfd_link_hash_undefweak
5646           && C_WEAKEXT == C_AIX_WEAKEXT)
5647         isym.n_sclass = C_WEAKEXT;
5648       else
5649         isym.n_sclass = C_EXT;
5650       bfd_coff_swap_sym_out (output_bfd, (void *) &isym, (void *) outsym);
5651       outsym += bfd_coff_symesz (output_bfd);
5652
5653       aux.x_csect.x_smtyp = XTY_LD;
5654       aux.x_csect.x_scnlen.l = obj_raw_syment_count (output_bfd);
5655       bfd_coff_swap_aux_out (output_bfd, (void *) &aux, T_NULL, C_EXT, 0, 1,
5656                              (void *) outsym);
5657       outsym += bfd_coff_auxesz (output_bfd);
5658     }
5659
5660   pos = obj_sym_filepos (output_bfd);
5661   pos += obj_raw_syment_count (output_bfd) * bfd_coff_symesz (output_bfd);
5662   amt = outsym - flinfo->outsyms;
5663   if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
5664       || bfd_bwrite (flinfo->outsyms, amt, output_bfd) != amt)
5665     return FALSE;
5666   obj_raw_syment_count (output_bfd) +=
5667     (outsym - flinfo->outsyms) / bfd_coff_symesz (output_bfd);
5668
5669   return TRUE;
5670 }
5671
5672 /* Handle a link order which is supposed to generate a reloc.  */
5673
5674 static bfd_boolean
5675 xcoff_reloc_link_order (bfd *output_bfd,
5676                         struct xcoff_final_link_info *flinfo,
5677                         asection *output_section,
5678                         struct bfd_link_order *link_order)
5679 {
5680   reloc_howto_type *howto;
5681   struct xcoff_link_hash_entry *h;
5682   asection *hsec;
5683   bfd_vma hval;
5684   bfd_vma addend;
5685   struct internal_reloc *irel;
5686   struct xcoff_link_hash_entry **rel_hash_ptr;
5687
5688   if (link_order->type == bfd_section_reloc_link_order)
5689     /* We need to somehow locate a symbol in the right section.  The
5690        symbol must either have a value of zero, or we must adjust
5691        the addend by the value of the symbol.  FIXME: Write this
5692        when we need it.  The old linker couldn't handle this anyhow.  */
5693     abort ();
5694
5695   howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
5696   if (howto == NULL)
5697     {
5698       bfd_set_error (bfd_error_bad_value);
5699       return FALSE;
5700     }
5701
5702   h = ((struct xcoff_link_hash_entry *)
5703        bfd_wrapped_link_hash_lookup (output_bfd, flinfo->info,
5704                                      link_order->u.reloc.p->u.name,
5705                                      FALSE, FALSE, TRUE));
5706   if (h == NULL)
5707     {
5708       if (! ((*flinfo->info->callbacks->unattached_reloc)
5709              (flinfo->info, link_order->u.reloc.p->u.name, NULL, NULL, (bfd_vma) 0)))
5710         return FALSE;
5711       return TRUE;
5712     }
5713
5714   hsec = xcoff_symbol_section (h);
5715   if (h->root.type == bfd_link_hash_defined
5716       || h->root.type == bfd_link_hash_defweak)
5717     hval = h->root.u.def.value;
5718   else
5719     hval = 0;
5720
5721   addend = link_order->u.reloc.p->addend;
5722   if (hsec != NULL)
5723     addend += (hsec->output_section->vma
5724                + hsec->output_offset
5725                + hval);
5726
5727   if (addend != 0)
5728     {
5729       bfd_size_type size;
5730       bfd_byte *buf;
5731       bfd_reloc_status_type rstat;
5732       bfd_boolean ok;
5733
5734       size = bfd_get_reloc_size (howto);
5735       buf = bfd_zmalloc (size);
5736       if (buf == NULL)
5737         return FALSE;
5738
5739       rstat = _bfd_relocate_contents (howto, output_bfd, addend, buf);
5740       switch (rstat)
5741         {
5742         case bfd_reloc_ok:
5743           break;
5744         default:
5745         case bfd_reloc_outofrange:
5746           abort ();
5747         case bfd_reloc_overflow:
5748           if (! ((*flinfo->info->callbacks->reloc_overflow)
5749                  (flinfo->info, NULL, link_order->u.reloc.p->u.name,
5750                   howto->name, addend, NULL, NULL, (bfd_vma) 0)))
5751             {
5752               free (buf);
5753               return FALSE;
5754             }
5755           break;
5756         }
5757       ok = bfd_set_section_contents (output_bfd, output_section, (void *) buf,
5758                                      (file_ptr) link_order->offset, size);
5759       free (buf);
5760       if (! ok)
5761         return FALSE;
5762     }
5763
5764   /* Store the reloc information in the right place.  It will get
5765      swapped and written out at the end of the final_link routine.  */
5766   irel = (flinfo->section_info[output_section->target_index].relocs
5767           + output_section->reloc_count);
5768   rel_hash_ptr = (flinfo->section_info[output_section->target_index].rel_hashes
5769                   + output_section->reloc_count);
5770
5771   memset (irel, 0, sizeof (struct internal_reloc));
5772   *rel_hash_ptr = NULL;
5773
5774   irel->r_vaddr = output_section->vma + link_order->offset;
5775
5776   if (h->indx >= 0)
5777     irel->r_symndx = h->indx;
5778   else
5779     {
5780       /* Set the index to -2 to force this symbol to get written out.  */
5781       h->indx = -2;
5782       *rel_hash_ptr = h;
5783       irel->r_symndx = 0;
5784     }
5785
5786   irel->r_type = howto->type;
5787   irel->r_size = howto->bitsize - 1;
5788   if (howto->complain_on_overflow == complain_overflow_signed)
5789     irel->r_size |= 0x80;
5790
5791   ++output_section->reloc_count;
5792
5793   /* Now output the reloc to the .loader section.  */
5794   if (xcoff_hash_table (flinfo->info)->loader_section)
5795     {
5796       if (!xcoff_create_ldrel (output_bfd, flinfo, output_section,
5797                                output_bfd, irel, hsec, h))
5798         return FALSE;
5799     }
5800
5801   return TRUE;
5802 }
5803
5804 /* Do the final link step.  */
5805
5806 bfd_boolean
5807 _bfd_xcoff_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
5808 {
5809   bfd_size_type symesz;
5810   struct xcoff_final_link_info flinfo;
5811   asection *o;
5812   struct bfd_link_order *p;
5813   bfd_size_type max_contents_size;
5814   bfd_size_type max_sym_count;
5815   bfd_size_type max_lineno_count;
5816   bfd_size_type max_reloc_count;
5817   bfd_size_type max_output_reloc_count;
5818   file_ptr rel_filepos;
5819   unsigned int relsz;
5820   file_ptr line_filepos;
5821   unsigned int linesz;
5822   bfd *sub;
5823   bfd_byte *external_relocs = NULL;
5824   char strbuf[STRING_SIZE_SIZE];
5825   file_ptr pos;
5826   bfd_size_type amt;
5827
5828   if (info->shared)
5829     abfd->flags |= DYNAMIC;
5830
5831   symesz = bfd_coff_symesz (abfd);
5832
5833   flinfo.info = info;
5834   flinfo.output_bfd = abfd;
5835   flinfo.strtab = NULL;
5836   flinfo.section_info = NULL;
5837   flinfo.last_file_index = -1;
5838   flinfo.toc_symindx = -1;
5839   flinfo.internal_syms = NULL;
5840   flinfo.sym_indices = NULL;
5841   flinfo.outsyms = NULL;
5842   flinfo.linenos = NULL;
5843   flinfo.contents = NULL;
5844   flinfo.external_relocs = NULL;
5845
5846   if (xcoff_hash_table (info)->loader_section)
5847     {
5848       flinfo.ldsym = (xcoff_hash_table (info)->loader_section->contents
5849                      + bfd_xcoff_ldhdrsz (abfd));
5850       flinfo.ldrel = (xcoff_hash_table (info)->loader_section->contents
5851                      + bfd_xcoff_ldhdrsz (abfd)
5852                      + (xcoff_hash_table (info)->ldhdr.l_nsyms
5853                         * bfd_xcoff_ldsymsz (abfd)));
5854     }
5855   else
5856     {
5857       flinfo.ldsym = NULL;
5858       flinfo.ldrel = NULL;
5859     }
5860
5861   xcoff_data (abfd)->coff.link_info = info;
5862
5863   flinfo.strtab = _bfd_stringtab_init ();
5864   if (flinfo.strtab == NULL)
5865     goto error_return;
5866
5867   /* Count the relocation entries required for the output file.
5868      (We've already counted the line numbers.)  Determine a few
5869      maximum sizes.  */
5870   max_contents_size = 0;
5871   max_lineno_count = 0;
5872   max_reloc_count = 0;
5873   for (o = abfd->sections; o != NULL; o = o->next)
5874     {
5875       o->reloc_count = 0;
5876       for (p = o->map_head.link_order; p != NULL; p = p->next)
5877         {
5878           if (p->type == bfd_indirect_link_order)
5879             {
5880               asection *sec;
5881
5882               sec = p->u.indirect.section;
5883
5884               /* Mark all sections which are to be included in the
5885                  link.  This will normally be every section.  We need
5886                  to do this so that we can identify any sections which
5887                  the linker has decided to not include.  */
5888               sec->linker_mark = TRUE;
5889
5890               o->reloc_count += sec->reloc_count;
5891
5892               if ((sec->flags & SEC_IN_MEMORY) == 0)
5893                 {
5894                   if (sec->rawsize > max_contents_size)
5895                     max_contents_size = sec->rawsize;
5896                   if (sec->size > max_contents_size)
5897                     max_contents_size = sec->size;
5898                 }
5899               if (coff_section_data (sec->owner, sec) != NULL
5900                   && xcoff_section_data (sec->owner, sec) != NULL
5901                   && (xcoff_section_data (sec->owner, sec)->lineno_count
5902                       > max_lineno_count))
5903                 max_lineno_count =
5904                   xcoff_section_data (sec->owner, sec)->lineno_count;
5905               if (sec->reloc_count > max_reloc_count)
5906                 max_reloc_count = sec->reloc_count;
5907             }
5908           else if (p->type == bfd_section_reloc_link_order
5909                    || p->type == bfd_symbol_reloc_link_order)
5910             ++o->reloc_count;
5911         }
5912     }
5913
5914   /* Compute the file positions for all the sections.  */
5915   if (abfd->output_has_begun)
5916     {
5917       if (xcoff_hash_table (info)->file_align != 0)
5918         abort ();
5919     }
5920   else
5921     {
5922       bfd_vma file_align;
5923
5924       file_align = xcoff_hash_table (info)->file_align;
5925       if (file_align != 0)
5926         {
5927           bfd_boolean saw_contents;
5928           int indx;
5929           file_ptr sofar;
5930
5931           /* Insert .pad sections before every section which has
5932              contents and is loaded, if it is preceded by some other
5933              section which has contents and is loaded.  */
5934           saw_contents = TRUE;
5935           for (o = abfd->sections; o != NULL; o = o->next)
5936             {
5937               if (strcmp (o->name, ".pad") == 0)
5938                 saw_contents = FALSE;
5939               else if ((o->flags & SEC_HAS_CONTENTS) != 0
5940                        && (o->flags & SEC_LOAD) != 0)
5941                 {
5942                   if (! saw_contents)
5943                     saw_contents = TRUE;
5944                   else
5945                     {
5946                       asection *n;
5947
5948                       /* Create a pad section and place it before the section
5949                          that needs padding.  This requires unlinking and
5950                          relinking the bfd's section list.  */
5951
5952                       n = bfd_make_section_anyway_with_flags (abfd, ".pad",
5953                                                               SEC_HAS_CONTENTS);
5954                       n->alignment_power = 0;
5955
5956                       bfd_section_list_remove (abfd, n);
5957                       bfd_section_list_insert_before (abfd, o, n);
5958                       saw_contents = FALSE;
5959                     }
5960                 }
5961             }
5962
5963           /* Reset the section indices after inserting the new
5964              sections.  */
5965           indx = 0;
5966           for (o = abfd->sections; o != NULL; o = o->next)
5967             {
5968               ++indx;
5969               o->target_index = indx;
5970             }
5971           BFD_ASSERT ((unsigned int) indx == abfd->section_count);
5972
5973           /* Work out appropriate sizes for the .pad sections to force
5974              each section to land on a page boundary.  This bit of
5975              code knows what compute_section_file_positions is going
5976              to do.  */
5977           sofar = bfd_coff_filhsz (abfd);
5978           sofar += bfd_coff_aoutsz (abfd);
5979           sofar += abfd->section_count * bfd_coff_scnhsz (abfd);
5980           for (o = abfd->sections; o != NULL; o = o->next)
5981             if ((bfd_xcoff_is_reloc_count_overflow
5982                  (abfd, (bfd_vma) o->reloc_count))
5983                 || (bfd_xcoff_is_lineno_count_overflow
5984                     (abfd, (bfd_vma) o->lineno_count)))
5985               /* 64 does not overflow, need to check if 32 does */
5986               sofar += bfd_coff_scnhsz (abfd);
5987
5988           for (o = abfd->sections; o != NULL; o = o->next)
5989             {
5990               if (strcmp (o->name, ".pad") == 0)
5991                 {
5992                   bfd_vma pageoff;
5993
5994                   BFD_ASSERT (o->size == 0);
5995                   pageoff = sofar & (file_align - 1);
5996                   if (pageoff != 0)
5997                     {
5998                       o->size = file_align - pageoff;
5999                       sofar += file_align - pageoff;
6000                       o->flags |= SEC_HAS_CONTENTS;
6001                     }
6002                 }
6003               else
6004                 {
6005                   if ((o->flags & SEC_HAS_CONTENTS) != 0)
6006                     sofar += BFD_ALIGN (o->size,
6007                                         1 << o->alignment_power);
6008                 }
6009             }
6010         }
6011
6012       if (! bfd_coff_compute_section_file_positions (abfd))
6013         goto error_return;
6014     }
6015
6016   /* Allocate space for the pointers we need to keep for the relocs.  */
6017   {
6018     unsigned int i;
6019
6020     /* We use section_count + 1, rather than section_count, because
6021        the target_index fields are 1 based.  */
6022     amt = abfd->section_count + 1;
6023     amt *= sizeof (struct xcoff_link_section_info);
6024     flinfo.section_info = bfd_malloc (amt);
6025     if (flinfo.section_info == NULL)
6026       goto error_return;
6027     for (i = 0; i <= abfd->section_count; i++)
6028       {
6029         flinfo.section_info[i].relocs = NULL;
6030         flinfo.section_info[i].rel_hashes = NULL;
6031         flinfo.section_info[i].toc_rel_hashes = NULL;
6032       }
6033   }
6034
6035   /* Set the file positions for the relocs.  */
6036   rel_filepos = obj_relocbase (abfd);
6037   relsz = bfd_coff_relsz (abfd);
6038   max_output_reloc_count = 0;
6039   for (o = abfd->sections; o != NULL; o = o->next)
6040     {
6041       if (o->reloc_count == 0)
6042         o->rel_filepos = 0;
6043       else
6044         {
6045           /* A stripped file has no relocs.  However, we still
6046              allocate the buffers, so that later code doesn't have to
6047              worry about whether we are stripping or not.  */
6048           if (info->strip == strip_all)
6049             o->rel_filepos = 0;
6050           else
6051             {
6052               o->flags |= SEC_RELOC;
6053               o->rel_filepos = rel_filepos;
6054               rel_filepos += o->reloc_count * relsz;
6055             }
6056
6057           /* We don't know the indices of global symbols until we have
6058              written out all the local symbols.  For each section in
6059              the output file, we keep an array of pointers to hash
6060              table entries.  Each entry in the array corresponds to a
6061              reloc.  When we find a reloc against a global symbol, we
6062              set the corresponding entry in this array so that we can
6063              fix up the symbol index after we have written out all the
6064              local symbols.
6065
6066              Because of this problem, we also keep the relocs in
6067              memory until the end of the link.  This wastes memory.
6068              We could backpatch the file later, I suppose, although it
6069              would be slow.  */
6070           amt = o->reloc_count;
6071           amt *= sizeof (struct internal_reloc);
6072           flinfo.section_info[o->target_index].relocs = bfd_malloc (amt);
6073
6074           amt = o->reloc_count;
6075           amt *= sizeof (struct xcoff_link_hash_entry *);
6076           flinfo.section_info[o->target_index].rel_hashes = bfd_malloc (amt);
6077
6078           if (flinfo.section_info[o->target_index].relocs == NULL
6079               || flinfo.section_info[o->target_index].rel_hashes == NULL)
6080             goto error_return;
6081
6082           if (o->reloc_count > max_output_reloc_count)
6083             max_output_reloc_count = o->reloc_count;
6084         }
6085     }
6086
6087   /* We now know the size of the relocs, so we can determine the file
6088      positions of the line numbers.  */
6089   line_filepos = rel_filepos;
6090   flinfo.line_filepos = line_filepos;
6091   linesz = bfd_coff_linesz (abfd);
6092   for (o = abfd->sections; o != NULL; o = o->next)
6093     {
6094       if (o->lineno_count == 0)
6095         o->line_filepos = 0;
6096       else
6097         {
6098           o->line_filepos = line_filepos;
6099           line_filepos += o->lineno_count * linesz;
6100         }
6101
6102       /* Reset the reloc and lineno counts, so that we can use them to
6103          count the number of entries we have output so far.  */
6104       o->reloc_count = 0;
6105       o->lineno_count = 0;
6106     }
6107
6108   obj_sym_filepos (abfd) = line_filepos;
6109
6110   /* Figure out the largest number of symbols in an input BFD.  Take
6111      the opportunity to clear the output_has_begun fields of all the
6112      input BFD's.  We want at least 6 symbols, since that is the
6113      number which xcoff_write_global_symbol may need.  */
6114   max_sym_count = 6;
6115   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
6116     {
6117       bfd_size_type sz;
6118
6119       sub->output_has_begun = FALSE;
6120       sz = obj_raw_syment_count (sub);
6121       if (sz > max_sym_count)
6122         max_sym_count = sz;
6123     }
6124
6125   /* Allocate some buffers used while linking.  */
6126   amt = max_sym_count * sizeof (struct internal_syment);
6127   flinfo.internal_syms = bfd_malloc (amt);
6128
6129   amt = max_sym_count * sizeof (long);
6130   flinfo.sym_indices = bfd_malloc (amt);
6131
6132   amt = (max_sym_count + 1) * symesz;
6133   flinfo.outsyms = bfd_malloc (amt);
6134
6135   amt = max_lineno_count * bfd_coff_linesz (abfd);
6136   flinfo.linenos = bfd_malloc (amt);
6137
6138   amt = max_contents_size;
6139   flinfo.contents = bfd_malloc (amt);
6140
6141   amt = max_reloc_count * relsz;
6142   flinfo.external_relocs = bfd_malloc (amt);
6143
6144   if ((flinfo.internal_syms == NULL && max_sym_count > 0)
6145       || (flinfo.sym_indices == NULL && max_sym_count > 0)
6146       || flinfo.outsyms == NULL
6147       || (flinfo.linenos == NULL && max_lineno_count > 0)
6148       || (flinfo.contents == NULL && max_contents_size > 0)
6149       || (flinfo.external_relocs == NULL && max_reloc_count > 0))
6150     goto error_return;
6151
6152   obj_raw_syment_count (abfd) = 0;
6153
6154   /* Find a TOC symbol, if we need one.  */
6155   if (!xcoff_find_tc0 (abfd, &flinfo))
6156     goto error_return;
6157
6158   /* We now know the position of everything in the file, except that
6159      we don't know the size of the symbol table and therefore we don't
6160      know where the string table starts.  We just build the string
6161      table in memory as we go along.  We process all the relocations
6162      for a single input file at once.  */
6163   for (o = abfd->sections; o != NULL; o = o->next)
6164     {
6165       for (p = o->map_head.link_order; p != NULL; p = p->next)
6166         {
6167           if (p->type == bfd_indirect_link_order
6168               && p->u.indirect.section->owner->xvec == abfd->xvec)
6169             {
6170               sub = p->u.indirect.section->owner;
6171               if (! sub->output_has_begun)
6172                 {
6173                   if (! xcoff_link_input_bfd (&flinfo, sub))
6174                     goto error_return;
6175                   sub->output_has_begun = TRUE;
6176                 }
6177             }
6178           else if (p->type == bfd_section_reloc_link_order
6179                    || p->type == bfd_symbol_reloc_link_order)
6180             {
6181               if (! xcoff_reloc_link_order (abfd, &flinfo, o, p))
6182                 goto error_return;
6183             }
6184           else
6185             {
6186               if (! _bfd_default_link_order (abfd, info, o, p))
6187                 goto error_return;
6188             }
6189         }
6190     }
6191
6192   /* Free up the buffers used by xcoff_link_input_bfd.  */
6193   if (flinfo.internal_syms != NULL)
6194     {
6195       free (flinfo.internal_syms);
6196       flinfo.internal_syms = NULL;
6197     }
6198   if (flinfo.sym_indices != NULL)
6199     {
6200       free (flinfo.sym_indices);
6201       flinfo.sym_indices = NULL;
6202     }
6203   if (flinfo.linenos != NULL)
6204     {
6205       free (flinfo.linenos);
6206       flinfo.linenos = NULL;
6207     }
6208   if (flinfo.contents != NULL)
6209     {
6210       free (flinfo.contents);
6211       flinfo.contents = NULL;
6212     }
6213   if (flinfo.external_relocs != NULL)
6214     {
6215       free (flinfo.external_relocs);
6216       flinfo.external_relocs = NULL;
6217     }
6218
6219   /* The value of the last C_FILE symbol is supposed to be -1.  Write
6220      it out again.  */
6221   if (flinfo.last_file_index != -1)
6222     {
6223       flinfo.last_file.n_value = -(bfd_vma) 1;
6224       bfd_coff_swap_sym_out (abfd, (void *) &flinfo.last_file,
6225                              (void *) flinfo.outsyms);
6226       pos = obj_sym_filepos (abfd) + flinfo.last_file_index * symesz;
6227       if (bfd_seek (abfd, pos, SEEK_SET) != 0
6228           || bfd_bwrite (flinfo.outsyms, symesz, abfd) != symesz)
6229         goto error_return;
6230     }
6231
6232   /* Write out all the global symbols which do not come from XCOFF
6233      input files.  */
6234   bfd_hash_traverse (&info->hash->table, xcoff_write_global_symbol, &flinfo);
6235
6236   if (flinfo.outsyms != NULL)
6237     {
6238       free (flinfo.outsyms);
6239       flinfo.outsyms = NULL;
6240     }
6241
6242   /* Now that we have written out all the global symbols, we know the
6243      symbol indices to use for relocs against them, and we can finally
6244      write out the relocs.  */
6245   amt = max_output_reloc_count * relsz;
6246   external_relocs = bfd_malloc (amt);
6247   if (external_relocs == NULL && max_output_reloc_count != 0)
6248     goto error_return;
6249
6250   for (o = abfd->sections; o != NULL; o = o->next)
6251     {
6252       struct internal_reloc *irel;
6253       struct internal_reloc *irelend;
6254       struct xcoff_link_hash_entry **rel_hash;
6255       struct xcoff_toc_rel_hash *toc_rel_hash;
6256       bfd_byte *erel;
6257       bfd_size_type rel_size;
6258
6259       /* A stripped file has no relocs.  */
6260       if (info->strip == strip_all)
6261         {
6262           o->reloc_count = 0;
6263           continue;
6264         }
6265
6266       if (o->reloc_count == 0)
6267         continue;
6268
6269       irel = flinfo.section_info[o->target_index].relocs;
6270       irelend = irel + o->reloc_count;
6271       rel_hash = flinfo.section_info[o->target_index].rel_hashes;
6272       for (; irel < irelend; irel++, rel_hash++)
6273         {
6274           if (*rel_hash != NULL)
6275             {
6276               if ((*rel_hash)->indx < 0)
6277                 {
6278                   if (! ((*info->callbacks->unattached_reloc)
6279                          (info, (*rel_hash)->root.root.string,
6280                           NULL, o, irel->r_vaddr)))
6281                     goto error_return;
6282                   (*rel_hash)->indx = 0;
6283                 }
6284               irel->r_symndx = (*rel_hash)->indx;
6285             }
6286         }
6287
6288       for (toc_rel_hash = flinfo.section_info[o->target_index].toc_rel_hashes;
6289            toc_rel_hash != NULL;
6290            toc_rel_hash = toc_rel_hash->next)
6291         {
6292           if (toc_rel_hash->h->u.toc_indx < 0)
6293             {
6294               if (! ((*info->callbacks->unattached_reloc)
6295                      (info, toc_rel_hash->h->root.root.string,
6296                       NULL, o, toc_rel_hash->rel->r_vaddr)))
6297                 goto error_return;
6298               toc_rel_hash->h->u.toc_indx = 0;
6299             }
6300           toc_rel_hash->rel->r_symndx = toc_rel_hash->h->u.toc_indx;
6301         }
6302
6303       /* XCOFF requires that the relocs be sorted by address.  We tend
6304          to produce them in the order in which their containing csects
6305          appear in the symbol table, which is not necessarily by
6306          address.  So we sort them here.  There may be a better way to
6307          do this.  */
6308       qsort ((void *) flinfo.section_info[o->target_index].relocs,
6309              o->reloc_count, sizeof (struct internal_reloc),
6310              xcoff_sort_relocs);
6311
6312       irel = flinfo.section_info[o->target_index].relocs;
6313       irelend = irel + o->reloc_count;
6314       erel = external_relocs;
6315       for (; irel < irelend; irel++, rel_hash++, erel += relsz)
6316         bfd_coff_swap_reloc_out (abfd, (void *) irel, (void *) erel);
6317
6318       rel_size = relsz * o->reloc_count;
6319       if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
6320           || bfd_bwrite ((void *) external_relocs, rel_size, abfd) != rel_size)
6321         goto error_return;
6322     }
6323
6324   if (external_relocs != NULL)
6325     {
6326       free (external_relocs);
6327       external_relocs = NULL;
6328     }
6329
6330   /* Free up the section information.  */
6331   if (flinfo.section_info != NULL)
6332     {
6333       unsigned int i;
6334
6335       for (i = 0; i < abfd->section_count; i++)
6336         {
6337           if (flinfo.section_info[i].relocs != NULL)
6338             free (flinfo.section_info[i].relocs);
6339           if (flinfo.section_info[i].rel_hashes != NULL)
6340             free (flinfo.section_info[i].rel_hashes);
6341         }
6342       free (flinfo.section_info);
6343       flinfo.section_info = NULL;
6344     }
6345
6346   /* Write out the loader section contents.  */
6347   o = xcoff_hash_table (info)->loader_section;
6348   if (o)
6349     {
6350       BFD_ASSERT ((bfd_byte *) flinfo.ldrel
6351                   == (xcoff_hash_table (info)->loader_section->contents
6352                       + xcoff_hash_table (info)->ldhdr.l_impoff));
6353       if (!bfd_set_section_contents (abfd, o->output_section, o->contents,
6354                                      (file_ptr) o->output_offset, o->size))
6355         goto error_return;
6356     }
6357
6358   /* Write out the magic sections.  */
6359   o = xcoff_hash_table (info)->linkage_section;
6360   if (o->size > 0
6361       && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
6362                                      (file_ptr) o->output_offset,
6363                                      o->size))
6364     goto error_return;
6365   o = xcoff_hash_table (info)->toc_section;
6366   if (o->size > 0
6367       && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
6368                                      (file_ptr) o->output_offset,
6369                                      o->size))
6370     goto error_return;
6371   o = xcoff_hash_table (info)->descriptor_section;
6372   if (o->size > 0
6373       && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
6374                                      (file_ptr) o->output_offset,
6375                                      o->size))
6376     goto error_return;
6377
6378   /* Write out the string table.  */
6379   pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd) * symesz;
6380   if (bfd_seek (abfd, pos, SEEK_SET) != 0)
6381     goto error_return;
6382   H_PUT_32 (abfd,
6383             _bfd_stringtab_size (flinfo.strtab) + STRING_SIZE_SIZE,
6384             strbuf);
6385   amt = STRING_SIZE_SIZE;
6386   if (bfd_bwrite (strbuf, amt, abfd) != amt)
6387     goto error_return;
6388   if (! _bfd_stringtab_emit (abfd, flinfo.strtab))
6389     goto error_return;
6390
6391   _bfd_stringtab_free (flinfo.strtab);
6392
6393   /* Write out the debugging string table.  */
6394   o = xcoff_hash_table (info)->debug_section;
6395   if (o != NULL)
6396     {
6397       struct bfd_strtab_hash *debug_strtab;
6398
6399       debug_strtab = xcoff_hash_table (info)->debug_strtab;
6400       BFD_ASSERT (o->output_section->size - o->output_offset
6401                   >= _bfd_stringtab_size (debug_strtab));
6402       pos = o->output_section->filepos + o->output_offset;
6403       if (bfd_seek (abfd, pos, SEEK_SET) != 0)
6404         goto error_return;
6405       if (! _bfd_stringtab_emit (abfd, debug_strtab))
6406         goto error_return;
6407     }
6408
6409   /* Setting bfd_get_symcount to 0 will cause write_object_contents to
6410      not try to write out the symbols.  */
6411   bfd_get_symcount (abfd) = 0;
6412
6413   return TRUE;
6414
6415  error_return:
6416   if (flinfo.strtab != NULL)
6417     _bfd_stringtab_free (flinfo.strtab);
6418
6419   if (flinfo.section_info != NULL)
6420     {
6421       unsigned int i;
6422
6423       for (i = 0; i < abfd->section_count; i++)
6424         {
6425           if (flinfo.section_info[i].relocs != NULL)
6426             free (flinfo.section_info[i].relocs);
6427           if (flinfo.section_info[i].rel_hashes != NULL)
6428             free (flinfo.section_info[i].rel_hashes);
6429         }
6430       free (flinfo.section_info);
6431     }
6432
6433   if (flinfo.internal_syms != NULL)
6434     free (flinfo.internal_syms);
6435   if (flinfo.sym_indices != NULL)
6436     free (flinfo.sym_indices);
6437   if (flinfo.outsyms != NULL)
6438     free (flinfo.outsyms);
6439   if (flinfo.linenos != NULL)
6440     free (flinfo.linenos);
6441   if (flinfo.contents != NULL)
6442     free (flinfo.contents);
6443   if (flinfo.external_relocs != NULL)
6444     free (flinfo.external_relocs);
6445   if (external_relocs != NULL)
6446     free (external_relocs);
6447   return FALSE;
6448 }