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