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