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