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