only read the section relocs if there are some
[external/binutils.git] / bfd / xcofflink.c
1 /* POWER/PowerPC XCOFF linker support.
2    Copyright 1995 Free Software Foundation, Inc.
3    Written by Ian Lance Taylor <ian@cygnus.com>, Cygnus Support.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "bfdlink.h"
24 #include "libbfd.h"
25 #include "coff/internal.h"
26 #include "libcoff.h"
27
28 /* This file holds the XCOFF linker code.  A lot of it is very similar
29    to the COFF linker code.  However, it is different enough that I
30    chose to avoid trying to hack up the COFF code to support XCOFF.
31    That leads to a certain amount of duplicated code, alas.  */
32
33 #define STRING_SIZE_SIZE (4)
34
35 /* Get the XCOFF hash table entries for a BFD.  */
36 #define obj_xcoff_sym_hashes(bfd) \
37   ((struct xcoff_link_hash_entry **) obj_coff_sym_hashes (bfd))
38
39 /* XCOFF relocation types.  These probably belong in a header file
40    somewhere.  The relocations are described in the function
41    _bfd_ppc_xcoff_relocate_section in this file.  */
42
43 #define R_POS   (0x00)
44 #define R_NEG   (0x01)
45 #define R_REL   (0x02)
46 #define R_TOC   (0x03)
47 #define R_RTB   (0x04)
48 #define R_GL    (0x05)
49 #define R_TCL   (0x06)
50 #define R_BA    (0x08)
51 #define R_BR    (0x0a)
52 #define R_RL    (0x0c)
53 #define R_RLA   (0x0d)
54 #define R_REF   (0x0f)
55 #define R_TRL   (0x12)
56 #define R_TRLA  (0x13)
57 #define R_RRTBI (0x14)
58 #define R_RRTBA (0x15)
59 #define R_CAI   (0x16)
60 #define R_CREL  (0x17)
61 #define R_RBA   (0x18)
62 #define R_RBAC  (0x19)
63 #define R_RBR   (0x1a)
64 #define R_RBRC  (0x1b)
65
66 /* The first word of global linkage code.  This must be modified by
67    filling in the correct TOC offset.  */
68
69 #define XCOFF_GLINK_FIRST (0x81820000)  /* lwz r12,0(r2) */
70
71 /* The remaining words of global linkage code.  */
72
73 static unsigned long xcoff_glink_code[] =
74 {
75   0x90410014,   /* stw r2,20(r1) */
76   0x800c0000,   /* lwz r0,0(r12) */
77   0x804c0004,   /* lwz r2,4(r12) */
78   0x7c0903a6,   /* mtctr r0 */
79   0x4e800420,   /* bctr */
80   0x0,          /* start of traceback table */
81   0x000c8000,   /* traceback table */
82   0x0           /* traceback table */
83 };
84
85 #define XCOFF_GLINK_SIZE \
86   (((sizeof xcoff_glink_code / sizeof xcoff_glink_code[0]) * 4) + 4)
87
88 /* We reuse the SEC_ROM flag as a mark flag for garbage collection.
89    This flag will only be used on input sections.  */
90
91 #define SEC_MARK (SEC_ROM)
92
93 /* The ldhdr structure.  This appears at the start of the .loader
94    section.  */
95
96 struct internal_ldhdr
97 {
98   /* The version number: currently always 1.  */
99   unsigned long l_version;
100   /* The number of symbol table entries.  */
101   bfd_size_type l_nsyms;
102   /* The number of relocation table entries.  */
103   bfd_size_type l_nreloc;
104   /* The length of the import file string table.  */
105   bfd_size_type l_istlen;
106   /* The number of import files.  */
107   bfd_size_type l_nimpid;
108   /* The offset from the start of the .loader section to the first
109      entry in the import file table.  */
110   bfd_size_type l_impoff;
111   /* The length of the string table.  */
112   bfd_size_type l_stlen;
113   /* The offset from the start of the .loader section to the first
114      entry in the string table.  */
115   bfd_size_type l_stoff;
116 };
117
118 struct external_ldhdr
119 {
120   bfd_byte l_version[4];
121   bfd_byte l_nsyms[4];
122   bfd_byte l_nreloc[4];
123   bfd_byte l_istlen[4];
124   bfd_byte l_nimpid[4];
125   bfd_byte l_impoff[4];
126   bfd_byte l_stlen[4];
127   bfd_byte l_stoff[4];
128 };
129
130 #define LDHDRSZ (8 * 4)
131
132 /* The ldsym structure.  This is used to represent a symbol in the
133    .loader section.  */
134
135 struct internal_ldsym
136 {
137   union
138     {
139       /* The symbol name if <= SYMNMLEN characters.  */
140       char _l_name[SYMNMLEN];
141       struct
142         {
143           /* Zero if the symbol name is more than SYMNMLEN characters.  */
144           long _l_zeroes;
145           /* The offset in the string table if the symbol name is more
146              than SYMNMLEN characters.  */
147           long _l_offset;
148         } _l_l;
149     } _l;
150   /* The symbol value.  */
151   bfd_vma l_value;
152   /* The symbol section number.  */
153   short l_scnum;
154   /* The symbol type and flags.  */
155   char l_smtype;
156   /* The symbol storage class.  */
157   char l_smclas;
158   /* The import file ID.  */
159   bfd_size_type l_ifile;
160   /* Offset to the parameter type check string.  */
161   bfd_size_type l_parm;
162 };
163
164 struct external_ldsym
165 {
166   union
167     {
168       bfd_byte _l_name[SYMNMLEN];
169       struct
170         {
171           bfd_byte _l_zeroes[4];
172           bfd_byte _l_offset[4];
173         } _l_l;
174     } _l;
175   bfd_byte l_value[4];
176   bfd_byte l_scnum[2];
177   bfd_byte l_smtype[1];
178   bfd_byte l_smclas[1];
179   bfd_byte l_ifile[4];
180   bfd_byte l_parm[4];
181 };
182
183 #define LDSYMSZ (8 + 3 * 4 + 2 + 2)
184
185 /* These flags are for the l_smtype field (the lower three bits are an
186    XTY_* value).  */
187
188 /* Imported symbol.  */
189 #define L_IMPORT (0x40)
190 /* Entry point.  */
191 #define L_ENTRY (0x20)
192 /* Exported symbol.  */
193 #define L_EXPORT (0x10)
194
195 /* The ldrel structure.  This is used to represent a reloc in the
196    .loader section.  */
197
198 struct internal_ldrel
199 {
200   /* The reloc address.  */
201   bfd_vma l_vaddr;
202   /* The symbol table index in the .loader section symbol table.  */
203   bfd_size_type l_symndx;
204   /* The relocation type and size.  */
205   short l_rtype;
206   /* The section number this relocation applies to.  */
207   short l_rsecnm;
208 };
209
210 struct external_ldrel
211 {
212   bfd_byte l_vaddr[4];
213   bfd_byte l_symndx[4];
214   bfd_byte l_rtype[2];
215   bfd_byte l_rsecnm[2];
216 };
217
218 #define LDRELSZ (2 * 4 + 2 * 2)
219
220 /* The list of import files.  */
221
222 struct xcoff_import_file
223 {
224   /* The next entry in the list.  */
225   struct xcoff_import_file *next;
226   /* The path.  */
227   const char *path;
228   /* The file name.  */
229   const char *file;
230   /* The member name.  */
231   const char *member;
232 };
233
234 /* An entry in the XCOFF linker hash table.  */
235
236 struct xcoff_link_hash_entry
237 {
238   struct bfd_link_hash_entry root;
239
240   /* Symbol index in output file.  Set to -1 initially.  Set to -2 if
241      there is a reloc against this symbol.  */
242   long indx;
243
244   /* If we have created a TOC entry for this symbol, this is the .tc
245      section which holds it.  */
246   asection *toc_section;
247
248   /* If we have created a TOC entry, this is the offset in
249      toc_section.  */
250   bfd_vma toc_offset;
251
252   /* If this symbol is a function entry point which is called, this
253      field holds a pointer to the function descriptor.  */
254   struct xcoff_link_hash_entry *descriptor;
255
256   /* The .loader symbol table entry, if there is one.  */
257   struct internal_ldsym *ldsym;
258
259   /* The .loader symbol table index.  */
260   long ldindx;
261
262   /* Some linker flags.  */
263   unsigned short flags;
264   /* Symbol is referenced by a regular object.  */
265 #define XCOFF_REF_REGULAR (01)
266   /* Symbol is defined by a regular object.  */
267 #define XCOFF_DEF_REGULAR (02)
268   /* Symbol is referenced by a dynamic object.  */
269 #define XCOFF_REF_DYNAMIC (04)
270   /* Symbol is used in a reloc being copied into the .loader section.  */
271 #define XCOFF_LDREL (010)
272   /* Symbol is the entry point.  */
273 #define XCOFF_ENTRY (020)
274   /* Symbol is called; this is, it appears in a R_BR reloc.  */
275 #define XCOFF_CALLED (040)
276   /* Symbol needs the TOC entry filled in.  */
277 #define XCOFF_SET_TOC (0100)
278   /* Symbol is explicitly imported.  */
279 #define XCOFF_IMPORT (0200)
280   /* Symbol is explicitly exported.  */
281 #define XCOFF_EXPORT (0400)
282   /* Symbol has been processed by xcoff_build_ldsyms.  */
283 #define XCOFF_BUILT_LDSYM (01000)
284   /* Symbol is mentioned by a section which was not garbage collected.  */
285 #define XCOFF_MARK (02000)
286
287   /* The storage mapping class.  */
288   unsigned char smclas;
289 };
290
291 /* The XCOFF linker hash table.  */
292
293 struct xcoff_link_hash_table
294 {
295   struct bfd_link_hash_table root;
296
297   /* The .debug string hash table.  We need to compute this while
298      reading the input files, so that we know how large the .debug
299      section will be before we assign section positions.  */
300   struct bfd_strtab_hash *debug_strtab;
301
302   /* The .debug section we will use for the final output.  */
303   asection *debug_section;
304
305   /* The .loader section we will use for the final output.  */
306   asection *loader_section;
307
308   /* A count of non TOC relative relocs which will need to be
309      allocated in the .loader section.  */
310   size_t ldrel_count;
311
312   /* The .loader section header.  */
313   struct internal_ldhdr ldhdr;
314
315   /* The .gl section we use to hold global linkage code.  */
316   asection *linkage_section;
317
318   /* The .tc section we use to hold toc entries we build for global
319      linkage code.  */
320   asection *toc_section;
321
322   /* The list of import files.  */
323   struct xcoff_import_file *imports;
324
325   /* Required alignment of sections within the output file.  */
326   unsigned long file_align;
327
328   /* Whether the .text section must be read-only.  */
329   boolean textro;
330
331   /* Whether garbage collection was done.  */
332   boolean gc;
333 };
334
335 /* Information we keep for each section in the output file during the
336    final link phase.  */
337
338 struct xcoff_link_section_info
339 {
340   /* The relocs to be output.  */
341   struct internal_reloc *relocs;
342   /* For each reloc against a global symbol whose index was not known
343      when the reloc was handled, the global hash table entry.  */
344   struct xcoff_link_hash_entry **rel_hashes;
345 };
346
347 /* Information that we pass around while doing the final link step.  */
348
349 struct xcoff_final_link_info
350 {
351   /* General link information.  */
352   struct bfd_link_info *info;
353   /* Output BFD.  */
354   bfd *output_bfd;
355   /* Hash table for long symbol names.  */
356   struct bfd_strtab_hash *strtab;
357   /* Array of information kept for each output section, indexed by the
358      target_index field.  */
359   struct xcoff_link_section_info *section_info;
360   /* Symbol index of last C_FILE symbol (-1 if none).  */
361   long last_file_index;
362   /* Contents of last C_FILE symbol.  */
363   struct internal_syment last_file;
364   /* Symbol index of TOC symbol.  */
365   long toc_symindx;
366   /* Start of .loader symbols.  */
367   struct external_ldsym *ldsym;
368   /* Next .loader reloc to swap out.  */
369   struct external_ldrel *ldrel;
370   /* Buffer large enough to hold swapped symbols of any input file.  */
371   struct internal_syment *internal_syms;
372   /* Buffer large enough to hold output indices of symbols of any
373      input file.  */
374   long *sym_indices;
375   /* Buffer large enough to hold output symbols for any input file.  */
376   bfd_byte *outsyms;
377   /* Buffer large enough to hold external line numbers for any input
378      section.  */
379   bfd_byte *linenos;
380   /* Buffer large enough to hold any input section.  */
381   bfd_byte *contents;
382   /* Buffer large enough to hold external relocs of any input section.  */
383   bfd_byte *external_relocs;
384 };
385
386 static void xcoff_swap_ldhdr_out
387   PARAMS ((bfd *, const struct internal_ldhdr *, struct external_ldhdr *));
388 static void xcoff_swap_ldsym_out
389   PARAMS ((bfd *, const struct internal_ldsym *, struct external_ldsym *));
390 static void xcoff_swap_ldrel_out
391   PARAMS ((bfd *, const struct internal_ldrel *, struct external_ldrel *));
392 static struct bfd_hash_entry *xcoff_link_hash_newfunc
393   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
394 static struct internal_reloc *xcoff_read_internal_relocs
395   PARAMS ((bfd *, asection *, boolean, bfd_byte *, boolean,
396            struct internal_reloc *));
397 static boolean xcoff_link_add_object_symbols
398   PARAMS ((bfd *, struct bfd_link_info *));
399 static boolean xcoff_link_check_archive_element
400   PARAMS ((bfd *, struct bfd_link_info *, boolean *));
401 static boolean xcoff_link_check_ar_symbols
402   PARAMS ((bfd *, struct bfd_link_info *, boolean *));
403 static boolean xcoff_link_add_symbols PARAMS ((bfd *, struct bfd_link_info *));
404 static boolean xcoff_link_add_dynamic_symbols
405   PARAMS ((bfd *, struct bfd_link_info *));
406 static boolean xcoff_mark PARAMS ((struct bfd_link_info *, asection *));
407 static void xcoff_sweep PARAMS ((struct bfd_link_info *));
408 static boolean xcoff_build_ldsyms
409   PARAMS ((struct xcoff_link_hash_entry *, PTR));
410 static boolean xcoff_link_input_bfd
411   PARAMS ((struct xcoff_final_link_info *, bfd *));
412 static boolean xcoff_write_global_symbol
413   PARAMS ((struct xcoff_link_hash_entry *, PTR));
414 static boolean xcoff_reloc_link_order
415   PARAMS ((bfd *, struct xcoff_final_link_info *, asection *,
416            struct bfd_link_order *));
417 static int xcoff_sort_relocs PARAMS ((const PTR, const PTR));
418 \f
419 /* Routines to swap information in the XCOFF .loader section.  We only
420    need to swap this information out, not in.  I believe that only the
421    loader needs to swap this information in.  If we ever need to write
422    an XCOFF loader, this stuff will need to be moved to another file
423    shared by the linker (which XCOFF calls the ``binder'') and the
424    loader.  */
425
426 /* Swap out the ldhdr structure.  */
427
428 static void
429 xcoff_swap_ldhdr_out (abfd, src, dst)
430      bfd *abfd;
431      const struct internal_ldhdr *src;
432      struct external_ldhdr *dst;
433 {
434   bfd_put_32 (abfd, src->l_version, dst->l_version);
435   bfd_put_32 (abfd, src->l_nsyms, dst->l_nsyms);
436   bfd_put_32 (abfd, src->l_nreloc, dst->l_nreloc);
437   bfd_put_32 (abfd, src->l_istlen, dst->l_istlen);
438   bfd_put_32 (abfd, src->l_nimpid, dst->l_nimpid);
439   bfd_put_32 (abfd, src->l_impoff, dst->l_impoff);
440   bfd_put_32 (abfd, src->l_stlen, dst->l_stlen);
441   bfd_put_32 (abfd, src->l_stoff, dst->l_stoff);
442 }
443
444 /* Swap out the ldsym structure.  */
445
446 static void
447 xcoff_swap_ldsym_out (abfd, src, dst)
448      bfd *abfd;
449      const struct internal_ldsym *src;
450      struct external_ldsym *dst;
451 {
452   if (src->_l._l_l._l_zeroes != 0)
453     memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
454   else
455     {
456       bfd_put_32 (abfd, 0, dst->_l._l_l._l_zeroes);
457       bfd_put_32 (abfd, src->_l._l_l._l_offset, dst->_l._l_l._l_offset);
458     }
459   bfd_put_32 (abfd, src->l_value, dst->l_value);
460   bfd_put_16 (abfd, src->l_scnum, dst->l_scnum);
461   bfd_put_8 (abfd, src->l_smtype, dst->l_smtype);
462   bfd_put_8 (abfd, src->l_smclas, dst->l_smclas);
463   bfd_put_32 (abfd, src->l_ifile, dst->l_ifile);
464   bfd_put_32 (abfd, src->l_parm, dst->l_parm);
465 }
466
467 /* Swap out the ldrel structure.  */
468
469 static void
470 xcoff_swap_ldrel_out (abfd, src, dst)
471      bfd *abfd;
472      const struct internal_ldrel *src;
473      struct external_ldrel *dst;
474 {
475   bfd_put_32 (abfd, src->l_vaddr, dst->l_vaddr);
476   bfd_put_32 (abfd, src->l_symndx, dst->l_symndx);
477   bfd_put_16 (abfd, src->l_rtype, dst->l_rtype);
478   bfd_put_16 (abfd, src->l_rsecnm, dst->l_rsecnm);
479 }
480 \f
481 /* Routine to create an entry in an XCOFF link hash table.  */
482
483 static struct bfd_hash_entry *
484 xcoff_link_hash_newfunc (entry, table, string)
485      struct bfd_hash_entry *entry;
486      struct bfd_hash_table *table;
487      const char *string;
488 {
489   struct xcoff_link_hash_entry *ret = (struct xcoff_link_hash_entry *) entry;
490
491   /* Allocate the structure if it has not already been allocated by a
492      subclass.  */
493   if (ret == (struct xcoff_link_hash_entry *) NULL)
494     ret = ((struct xcoff_link_hash_entry *)
495            bfd_hash_allocate (table, sizeof (struct xcoff_link_hash_entry)));
496   if (ret == (struct xcoff_link_hash_entry *) NULL)
497     {
498       bfd_set_error (bfd_error_no_memory);
499       return (struct bfd_hash_entry *) ret;
500     }
501
502   /* Call the allocation method of the superclass.  */
503   ret = ((struct xcoff_link_hash_entry *)
504          _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
505                                  table, string));
506   if (ret != NULL)
507     {
508       /* Set local fields.  */
509       ret->indx = -1;
510       ret->toc_section = NULL;
511       ret->toc_offset = 0;
512       ret->descriptor = NULL;
513       ret->ldsym = NULL;
514       ret->ldindx = -1;
515       ret->flags = 0;
516       ret->smclas = XMC_UA;
517     }
518
519   return (struct bfd_hash_entry *) ret;
520 }
521
522 /* Create a XCOFF link hash table.  */
523
524 struct bfd_link_hash_table *
525 _bfd_xcoff_bfd_link_hash_table_create (abfd)
526      bfd *abfd;
527 {
528   struct xcoff_link_hash_table *ret;
529
530   ret = ((struct xcoff_link_hash_table *)
531          bfd_alloc (abfd, sizeof (struct xcoff_link_hash_table)));
532   if (ret == (struct xcoff_link_hash_table *) NULL)
533     {
534       bfd_set_error (bfd_error_no_memory);
535       return (struct bfd_link_hash_table *) NULL;
536     }
537   if (! _bfd_link_hash_table_init (&ret->root, abfd, xcoff_link_hash_newfunc))
538     {
539       bfd_release (abfd, ret);
540       return (struct bfd_link_hash_table *) NULL;
541     }
542
543   ret->debug_strtab = _bfd_xcoff_stringtab_init ();
544   ret->debug_section = NULL;
545   ret->loader_section = NULL;
546   ret->ldrel_count = 0;
547   memset (&ret->ldhdr, 0, sizeof (struct internal_ldhdr));
548   ret->linkage_section = NULL;
549   ret->toc_section = NULL;
550   ret->imports = NULL;
551   ret->file_align = 0;
552   ret->textro = false;
553   ret->gc = false;
554
555   return &ret->root;
556 }
557
558 /* Look up an entry in an XCOFF link hash table.  */
559
560 #define xcoff_link_hash_lookup(table, string, create, copy, follow) \
561   ((struct xcoff_link_hash_entry *) \
562    bfd_link_hash_lookup (&(table)->root, (string), (create), (copy),\
563                          (follow)))
564
565 /* Traverse an XCOFF link hash table.  */
566
567 #define xcoff_link_hash_traverse(table, func, info)                     \
568   (bfd_link_hash_traverse                                               \
569    (&(table)->root,                                                     \
570     (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func),  \
571     (info)))
572
573 /* Get the XCOFF link hash table from the info structure.  This is
574    just a cast.  */
575
576 #define xcoff_hash_table(p) ((struct xcoff_link_hash_table *) ((p)->hash))
577 \f
578 /* Read internal relocs for an XCOFF csect.  This is a wrapper around
579    _bfd_coff_read_internal_relocs which tries to take advantage of any
580    relocs which may have been cached for the enclosing section.  */
581
582 static struct internal_reloc *
583 xcoff_read_internal_relocs (abfd, sec, cache, external_relocs,
584                             require_internal, internal_relocs)
585      bfd *abfd;
586      asection *sec;
587      boolean cache;
588      bfd_byte *external_relocs;
589      boolean require_internal;
590      struct internal_reloc *internal_relocs;
591 {
592   if (coff_section_data (abfd, sec) != NULL
593       && coff_section_data (abfd, sec)->relocs == NULL
594       && xcoff_section_data (abfd, sec) != NULL)
595     {
596       asection *enclosing;
597
598       enclosing = xcoff_section_data (abfd, sec)->enclosing;
599
600       if (enclosing != NULL
601           && (coff_section_data (abfd, enclosing) == NULL
602               || coff_section_data (abfd, enclosing)->relocs == NULL)
603           && cache)
604         {
605           if (_bfd_coff_read_internal_relocs (abfd, enclosing, true,
606                                               external_relocs, false,
607                                               (struct internal_reloc *) NULL)
608               == NULL)
609             return NULL;
610         }
611
612       if (enclosing != NULL
613           && coff_section_data (abfd, enclosing) != NULL
614           && coff_section_data (abfd, enclosing)->relocs != NULL)
615         {
616           size_t off;
617
618           off = ((sec->rel_filepos - enclosing->rel_filepos)
619                  / bfd_coff_relsz (abfd));
620           if (! require_internal)
621             return coff_section_data (abfd, enclosing)->relocs + off;
622           memcpy (internal_relocs,
623                   coff_section_data (abfd, enclosing)->relocs + off,
624                   sec->reloc_count * sizeof (struct internal_reloc));
625           return internal_relocs;
626         }
627     }
628
629   return _bfd_coff_read_internal_relocs (abfd, sec, cache, external_relocs,
630                                          require_internal, internal_relocs);
631 }
632 \f
633 /* Given an XCOFF BFD, add symbols to the global hash table as
634    appropriate.  */
635
636 boolean
637 _bfd_xcoff_bfd_link_add_symbols (abfd, info)
638      bfd *abfd;
639      struct bfd_link_info *info;
640 {
641   switch (bfd_get_format (abfd))
642     {
643     case bfd_object:
644       return xcoff_link_add_object_symbols (abfd, info);
645     case bfd_archive:
646       return (_bfd_generic_link_add_archive_symbols
647               (abfd, info, xcoff_link_check_archive_element));
648     default:
649       bfd_set_error (bfd_error_wrong_format);
650       return false;
651     }
652 }
653
654 /* Add symbols from an XCOFF object file.  */
655
656 static boolean
657 xcoff_link_add_object_symbols (abfd, info)
658      bfd *abfd;
659      struct bfd_link_info *info;
660 {
661   if (! _bfd_coff_get_external_symbols (abfd))
662     return false;
663   if (! xcoff_link_add_symbols (abfd, info))
664     return false;
665   if (! info->keep_memory)
666     {
667       if (! _bfd_coff_free_symbols (abfd))
668         return false;
669     }
670   return true;
671 }
672
673 /* Check a single archive element to see if we need to include it in
674    the link.  *PNEEDED is set according to whether this element is
675    needed in the link or not.  This is called via
676    _bfd_generic_link_add_archive_symbols.  */
677
678 static boolean
679 xcoff_link_check_archive_element (abfd, info, pneeded)
680      bfd *abfd;
681      struct bfd_link_info *info;
682      boolean *pneeded;
683 {
684   if (! _bfd_coff_get_external_symbols (abfd))
685     return false;
686
687   if (! xcoff_link_check_ar_symbols (abfd, info, pneeded))
688     return false;
689
690   if (*pneeded)
691     {
692       if (! xcoff_link_add_symbols (abfd, info))
693         return false;
694     }
695
696   if (! info->keep_memory || ! *pneeded)
697     {
698       if (! _bfd_coff_free_symbols (abfd))
699         return false;
700     }
701
702   return true;
703 }
704
705 /* Look through the symbols to see if this object file should be
706    included in the link.  */
707
708 static boolean
709 xcoff_link_check_ar_symbols (abfd, info, pneeded)
710      bfd *abfd;
711      struct bfd_link_info *info;
712      boolean *pneeded;
713 {
714   bfd_size_type symesz;
715   bfd_byte *esym;
716   bfd_byte *esym_end;
717
718   *pneeded = false;
719
720   symesz = bfd_coff_symesz (abfd);
721   esym = (bfd_byte *) obj_coff_external_syms (abfd);
722   esym_end = esym + obj_raw_syment_count (abfd) * symesz;
723   while (esym < esym_end)
724     {
725       struct internal_syment sym;
726
727       bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym);
728
729       if (sym.n_sclass == C_EXT && sym.n_scnum != N_UNDEF)
730         {
731           const char *name;
732           char buf[SYMNMLEN + 1];
733           struct bfd_link_hash_entry *h;
734
735           /* This symbol is externally visible, and is defined by this
736              object file.  */
737
738           name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
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             {
751               if (! (*info->callbacks->add_archive_element) (info, abfd, name))
752                 return false;
753               *pneeded = true;
754               return true;
755             }
756         }
757
758       esym += (sym.n_numaux + 1) * symesz;
759     }
760
761   /* We do not need this object file.  */
762   return true;
763 }
764
765 /* Add all the symbols from an object file to the hash table.
766
767    XCOFF is a weird format.  A normal XCOFF .o files will have three
768    COFF sections--.text, .data, and .bss--but each COFF section will
769    contain many csects.  These csects are described in the symbol
770    table.  From the linker's point of view, each csect must be
771    considered a section in its own right.  For example, a TOC entry is
772    handled as a small XMC_TC csect.  The linker must be able to merge
773    different TOC entries together, which means that it must be able to
774    extract the XMC_TC csects from the .data section of the input .o
775    file.
776
777    From the point of view of our linker, this is, of course, a hideous
778    nightmare.  We cope by actually creating sections for each csect,
779    and discarding the original sections.  We then have to handle the
780    relocation entries carefully, since the only way to tell which
781    csect they belong to is to examine the address.  */
782
783 static boolean
784 xcoff_link_add_symbols (abfd, info)
785      bfd *abfd;
786      struct bfd_link_info *info;
787 {
788   unsigned int n_tmask;
789   unsigned int n_btshft;
790   boolean default_copy;
791   bfd_size_type symcount;
792   struct xcoff_link_hash_entry **sym_hash;
793   asection **csect_cache;
794   bfd_size_type linesz;
795   asection *sub;
796   boolean keep_syms;
797   asection *csect;
798   unsigned int csect_index;
799   asection *first_csect;
800   bfd_size_type symesz;
801   bfd_byte *esym;
802   bfd_byte *esym_end;
803   struct reloc_info_struct
804     {
805       struct internal_reloc *relocs;
806       asection **csects;
807       bfd_byte *linenos;
808     } *reloc_info = NULL;
809
810   if ((abfd->flags & DYNAMIC) != 0
811       && ! info->static_link)
812     return xcoff_link_add_dynamic_symbols (abfd, info);
813
814   n_tmask = coff_data (abfd)->local_n_tmask;
815   n_btshft = coff_data (abfd)->local_n_btshft;
816
817   /* Define macros so that ISFCN, et. al., macros work correctly.  */
818 #define N_TMASK n_tmask
819 #define N_BTSHFT n_btshft
820
821   /* We need to build a .loader section, so we do it here.  This won't
822      work if we're producing an XCOFF output file with no non dynamic
823      XCOFF input files.  FIXME.  */
824   if (xcoff_hash_table (info)->loader_section == NULL)
825     {
826       asection *lsec;
827
828       lsec = bfd_make_section_anyway (abfd, ".loader");
829       if (lsec == NULL)
830         goto error_return;
831       xcoff_hash_table (info)->loader_section = lsec;
832       lsec->flags |= SEC_HAS_CONTENTS | SEC_IN_MEMORY;
833     }
834   /* Likewise for the linkage section.  */
835   if (xcoff_hash_table (info)->linkage_section == NULL)
836     {
837       asection *lsec;
838
839       lsec = bfd_make_section_anyway (abfd, ".gl");
840       if (lsec == NULL)
841         goto error_return;
842       xcoff_hash_table (info)->linkage_section = lsec;
843       lsec->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
844     }
845   /* Likewise for the TOC section.  */
846   if (xcoff_hash_table (info)->toc_section == NULL)
847     {
848       asection *tsec;
849
850       tsec = bfd_make_section_anyway (abfd, ".tc");
851       if (tsec == NULL)
852         goto error_return;
853       xcoff_hash_table (info)->toc_section = tsec;
854       tsec->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
855     }
856   /* Likewise for the .debug section.  */
857   if (xcoff_hash_table (info)->debug_section == NULL)
858     {
859       asection *dsec;
860
861       dsec = bfd_make_section_anyway (abfd, ".debug");
862       if (dsec == NULL)
863         goto error_return;
864       xcoff_hash_table (info)->debug_section = dsec;
865       dsec->flags |= SEC_HAS_CONTENTS | SEC_IN_MEMORY;
866     }
867
868   if (info->keep_memory)
869     default_copy = false;
870   else
871     default_copy = true;
872
873   symcount = obj_raw_syment_count (abfd);
874
875   /* We keep a list of the linker hash table entries that correspond
876      to each external symbol.  */
877   sym_hash = ((struct xcoff_link_hash_entry **)
878               bfd_alloc (abfd,
879                          (symcount
880                           * sizeof (struct xcoff_link_hash_entry *))));
881   if (sym_hash == NULL && symcount != 0)
882     {
883       bfd_set_error (bfd_error_no_memory);
884       goto error_return;
885     }
886   coff_data (abfd)->sym_hashes = (struct coff_link_hash_entry **) sym_hash;
887   memset (sym_hash, 0,
888           (size_t) symcount * sizeof (struct xcoff_link_hash_entry *));
889
890   /* Because of the weird stuff we are doing with XCOFF csects, we can
891      not easily determine which section a symbol is in, so we store
892      the information in the tdata for the input file.  */
893   csect_cache = ((asection **)
894                  bfd_alloc (abfd, symcount * sizeof (asection *)));
895   if (csect_cache == NULL && symcount != 0)
896     {
897       bfd_set_error (bfd_error_no_memory);
898       goto error_return;
899     }
900   xcoff_data (abfd)->csects = csect_cache;
901   memset (csect_cache, 0, (size_t) symcount * sizeof (asection *));
902
903   /* While splitting sections into csects, we need to assign the
904      relocs correctly.  The relocs and the csects must both be in
905      order by VMA within a given section, so we handle this by
906      scanning along the relocs as we process the csects.  We index
907      into reloc_info using the section target_index.  */
908   reloc_info = ((struct reloc_info_struct *)
909                 malloc ((abfd->section_count + 1)
910                         * sizeof (struct reloc_info_struct)));
911   if (reloc_info == NULL)
912     {
913       bfd_set_error (bfd_error_no_memory);
914       goto error_return;
915     }
916   memset ((PTR) reloc_info, 0,
917           (abfd->section_count + 1) * sizeof (struct reloc_info_struct));
918
919   /* Read in the relocs and line numbers for each section.  */
920   linesz = bfd_coff_linesz (abfd);
921   for (sub = abfd->sections; sub != NULL; sub = sub->next)
922     {
923       if ((sub->flags & SEC_RELOC) != 0)
924         {
925           reloc_info[sub->target_index].relocs =
926             xcoff_read_internal_relocs (abfd, sub, true, (bfd_byte *) NULL,
927                                         false, (struct internal_reloc *) NULL);
928           reloc_info[sub->target_index].csects =
929             (asection **) malloc (sub->reloc_count * sizeof (asection *));
930           if (reloc_info[sub->target_index].csects == NULL)
931             {
932               bfd_set_error (bfd_error_no_memory);
933               goto error_return;
934             }
935           memset (reloc_info[sub->target_index].csects, 0,
936                   sub->reloc_count * sizeof (asection *));
937         }
938
939       if ((info->strip == strip_none || info->strip == strip_some)
940           && sub->lineno_count > 0)
941         {
942           bfd_byte *linenos;
943
944           linenos = (bfd_byte *) malloc (sub->lineno_count * linesz);
945           if (linenos == NULL)
946             {
947               bfd_set_error (bfd_error_no_memory);
948               goto error_return;
949             }
950           reloc_info[sub->target_index].linenos = linenos;
951           if (bfd_seek (abfd, sub->line_filepos, SEEK_SET) != 0
952               || (bfd_read (linenos, linesz, sub->lineno_count, abfd)
953                   != linesz * sub->lineno_count))
954             goto error_return;
955         }
956     }
957
958   /* Don't let the linker relocation routines discard the symbols.  */
959   keep_syms = obj_coff_keep_syms (abfd);
960   obj_coff_keep_syms (abfd) = true;
961
962   csect = NULL;
963   csect_index = 0;
964   first_csect = NULL;
965
966   symesz = bfd_coff_symesz (abfd);
967   BFD_ASSERT (symesz == bfd_coff_auxesz (abfd));
968   esym = (bfd_byte *) obj_coff_external_syms (abfd);
969   esym_end = esym + symcount * symesz;
970   while (esym < esym_end)
971     {
972       struct internal_syment sym;
973       union internal_auxent aux;
974       const char *name;
975       char buf[SYMNMLEN + 1];
976       int smtyp;
977       flagword flags;
978       asection *section;
979       bfd_vma value;
980       struct xcoff_link_hash_entry *set_toc;
981
982       bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym);
983
984       /* In this pass we are only interested in symbols with csect
985          information.  */
986       if (sym.n_sclass != C_EXT && sym.n_sclass != C_HIDEXT)
987         {
988           if (sym.n_sclass == C_FILE && csect != NULL)
989             {
990               xcoff_section_data (abfd, csect)->last_symndx =
991                 ((esym
992                   - (bfd_byte *) obj_coff_external_syms (abfd))
993                  / symesz);
994               csect = NULL;
995             }
996
997           if (csect != NULL)
998             *csect_cache = csect;
999           else if (first_csect == NULL || sym.n_sclass == C_FILE)
1000             *csect_cache = coff_section_from_bfd_index (abfd, sym.n_scnum);
1001           else
1002             *csect_cache = NULL;
1003           esym += (sym.n_numaux + 1) * symesz;
1004           sym_hash += sym.n_numaux + 1;
1005           csect_cache += sym.n_numaux + 1;
1006           continue;
1007         }
1008
1009       name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
1010       if (name == NULL)
1011         goto error_return;
1012
1013       /* If this symbol has line number information attached to it,
1014          and we're not stripping it, count the number of entries and
1015          add them to the count for this csect.  In the final link pass
1016          we are going to attach line number information by symbol,
1017          rather than by section, in order to more easily handle
1018          garbage collection.  */
1019       if ((info->strip == strip_none || info->strip == strip_some)
1020           && sym.n_numaux > 1
1021           && csect != NULL
1022           && ISFCN (sym.n_type))
1023         {
1024           union internal_auxent auxlin;
1025
1026           bfd_coff_swap_aux_in (abfd, (PTR) (esym + symesz),
1027                                 sym.n_type, sym.n_sclass,
1028                                 0, sym.n_numaux, (PTR) &auxlin);
1029           if (auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0)
1030             {
1031               asection *enclosing;
1032               bfd_size_type linoff;
1033
1034               enclosing = xcoff_section_data (abfd, csect)->enclosing;
1035               linoff = (auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr
1036                         - enclosing->line_filepos);
1037               if (linoff < enclosing->lineno_count * linesz)
1038                 {
1039                   struct internal_lineno lin;
1040                   bfd_byte *linpstart;
1041
1042                   linpstart = (reloc_info[enclosing->target_index].linenos
1043                                + linoff);
1044                   bfd_coff_swap_lineno_in (abfd, (PTR) linpstart, (PTR) &lin);
1045                   if (lin.l_lnno == 0
1046                       && ((bfd_size_type) lin.l_addr.l_symndx
1047                           == ((esym
1048                                - (bfd_byte *) obj_coff_external_syms (abfd))
1049                               / symesz)))
1050                     {
1051                       bfd_byte *linpend, *linp;
1052
1053                       linpend = (reloc_info[enclosing->target_index].linenos
1054                                  + enclosing->lineno_count * linesz);
1055                       for (linp = linpstart + linesz;
1056                            linp < linpend;
1057                            linp += linesz)
1058                         {
1059                           bfd_coff_swap_lineno_in (abfd, (PTR) linp,
1060                                                    (PTR) &lin);
1061                           if (lin.l_lnno == 0)
1062                             break;
1063                         }
1064                       csect->lineno_count += (linp - linpstart) / linesz;
1065                       /* The setting of line_filepos will only be
1066                          useful if all the line number entries for a
1067                          csect are contiguous; this only matters for
1068                          error reporting.  */
1069                       if (csect->line_filepos == 0)
1070                         csect->line_filepos =
1071                           auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr;
1072                     }
1073                 }
1074             }
1075         }
1076
1077       /* Pick up the csect auxiliary information.  */
1078
1079       if (sym.n_numaux == 0)
1080         {
1081           (*_bfd_error_handler)
1082             ("%s: class %d symbol `%s' has no aux entries",
1083              bfd_get_filename (abfd), sym.n_sclass, name);
1084           bfd_set_error (bfd_error_bad_value);
1085           goto error_return;
1086         }
1087
1088       bfd_coff_swap_aux_in (abfd,
1089                             (PTR) (esym + symesz * sym.n_numaux),
1090                             sym.n_type, sym.n_sclass,
1091                             sym.n_numaux - 1, sym.n_numaux,
1092                             (PTR) &aux);
1093
1094       smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp);
1095
1096       flags = BSF_GLOBAL;
1097       section = NULL;
1098       value = 0;
1099       set_toc = NULL;
1100
1101       switch (smtyp)
1102         {
1103         default:
1104           (*_bfd_error_handler)
1105             ("%s: symbol `%s' has unrecognized csect type %d",
1106              bfd_get_filename (abfd), name, smtyp);
1107           bfd_set_error (bfd_error_bad_value);
1108           goto error_return;
1109
1110         case XTY_ER:
1111           /* This is an external reference.  */
1112           if (sym.n_sclass == C_HIDEXT
1113               || sym.n_scnum != N_UNDEF
1114               || aux.x_csect.x_scnlen.l != 0)
1115             {
1116               (*_bfd_error_handler)
1117                 ("%s: bad XTY_ER symbol `%s': class %d scnum %d scnlen %d",
1118                  bfd_get_filename (abfd), name, sym.n_sclass, sym.n_scnum,
1119                  aux.x_csect.x_scnlen.l);
1120               bfd_set_error (bfd_error_bad_value);
1121               goto error_return;
1122             }
1123           section = bfd_und_section_ptr;
1124           break;
1125
1126         case XTY_SD:
1127           /* This is a csect definition.  */
1128
1129           if (csect != NULL)
1130             {
1131               xcoff_section_data (abfd, csect)->last_symndx =
1132                 ((esym
1133                   - (bfd_byte *) obj_coff_external_syms (abfd))
1134                  / symesz);
1135             }
1136
1137           csect = NULL;
1138           csect_index = -1;
1139
1140           /* When we see a TOC anchor, we record the TOC value.  */
1141           if (aux.x_csect.x_smclas == XMC_TC0)
1142             {
1143               if (sym.n_sclass != C_HIDEXT
1144                   || aux.x_csect.x_scnlen.l != 0)
1145                 {
1146                   (*_bfd_error_handler)
1147                     ("%s: XMC_TC0 symbol `%s' is class %d scnlen %d",
1148                      bfd_get_filename (abfd), name, sym.n_sclass,
1149                      aux.x_csect.x_scnlen.l);
1150                   bfd_set_error (bfd_error_bad_value);
1151                   goto error_return;
1152                 }
1153               xcoff_data (abfd)->toc = sym.n_value;
1154             }
1155
1156           /* We must merge TOC entries for the same symbol.  We can
1157              merge two TOC entries if they are both C_HIDEXT, they
1158              both have the same name, they are both 4 bytes long, and
1159              they both have a relocation table entry for an external
1160              symbol with the same name.  Unfortunately, this means
1161              that we must look through the relocations.  Ick.  */
1162           if (aux.x_csect.x_smclas == XMC_TC
1163               && sym.n_sclass == C_HIDEXT
1164               && aux.x_csect.x_scnlen.l == 4
1165               && info->hash->creator == abfd->xvec)
1166             {
1167               asection *enclosing;
1168               bfd_size_type relindx;
1169               struct internal_reloc *rel;
1170               asection **rel_csect;
1171
1172               enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum);
1173               if (enclosing == NULL)
1174                 goto error_return;
1175
1176               /* XCOFF requires that relocs be sorted by address, so
1177                  we could do a binary search here.  FIXME.  */
1178               rel = reloc_info[enclosing->target_index].relocs;
1179               rel_csect = reloc_info[enclosing->target_index].csects;
1180               for (relindx = 0;
1181                    relindx < enclosing->reloc_count;
1182                    relindx++, rel++, rel_csect++)
1183                 {
1184                   if (*rel_csect == NULL
1185                       && rel->r_vaddr == (bfd_vma) sym.n_value
1186                       && rel->r_size == 31
1187                       && rel->r_type == R_POS)
1188                     break;
1189                 }
1190               if (relindx < enclosing->reloc_count)
1191                 {
1192                   bfd_byte *erelsym;
1193                   struct internal_syment relsym;
1194
1195                   erelsym = ((bfd_byte *) obj_coff_external_syms (abfd)
1196                              + rel->r_symndx * symesz);
1197                   bfd_coff_swap_sym_in (abfd, (PTR) erelsym, (PTR) &relsym);
1198                   if (relsym.n_sclass == C_EXT)
1199                     {
1200                       const char *relname;
1201                       char relbuf[SYMNMLEN + 1];
1202                       boolean copy;
1203                       struct xcoff_link_hash_entry *h;
1204
1205                       /* At this point we know that the TOC entry is
1206                          for an externally visible symbol.  */
1207                       relname = _bfd_coff_internal_syment_name (abfd, &relsym,
1208                                                                 relbuf);
1209                       if (relname == NULL)
1210                         goto error_return;
1211                       copy = (! info->keep_memory
1212                               || relsym._n._n_n._n_zeroes != 0
1213                               || relsym._n._n_n._n_offset == 0);
1214                       h = xcoff_link_hash_lookup (xcoff_hash_table (info),
1215                                                   relname, true, copy, false);
1216                       if (h == NULL)
1217                         goto error_return;
1218
1219                       /* At this point h->root.type could be
1220                          bfd_link_hash_new.  That should be OK, since
1221                          we know for sure that we will come across
1222                          this symbol as we step through the file.  */
1223
1224                       /* We store h in *sym_hash for the convenience
1225                          of the relocate_section function.  */
1226                       *sym_hash = h;
1227
1228                       if (h->toc_section != NULL)
1229                         {
1230                           /* We already have a TOC entry for this
1231                              symbol, so we can just ignore this one.  */
1232                           *rel_csect = bfd_und_section_ptr;
1233                           break;
1234                         }
1235
1236                       /* We are about to create a TOC entry for this
1237                          symbol.  */
1238                       set_toc = h;
1239                     }
1240                 }
1241             }
1242
1243           /* We need to create a new section.  We get the name from
1244              the csect storage mapping class, so that the linker can
1245              accumulate similar csects together.  */
1246           {
1247             static const char *csect_name_by_class[] =
1248               {
1249                 ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
1250                 ".sv", ".bs", ".ds", ".uc", ".ti", ".tb", NULL, ".tc0",
1251                 ".td"
1252               };
1253             const char *csect_name;
1254             asection *enclosing;
1255             struct internal_reloc *rel;
1256             bfd_size_type relindx;
1257             asection **rel_csect;
1258
1259             if ((aux.x_csect.x_smclas >=
1260                  sizeof csect_name_by_class / sizeof csect_name_by_class[0])
1261                 || csect_name_by_class[aux.x_csect.x_smclas] == NULL)
1262               {
1263                 (*_bfd_error_handler)
1264                   ("%s: symbol `%s' has unrecognized smclas %d",
1265                    bfd_get_filename (abfd), name, aux.x_csect.x_smclas);
1266                 bfd_set_error (bfd_error_bad_value);
1267                 goto error_return;
1268               }
1269
1270             csect_name = csect_name_by_class[aux.x_csect.x_smclas];
1271             csect = bfd_make_section_anyway (abfd, csect_name);
1272             if (csect == NULL)
1273               goto error_return;
1274             enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum);
1275             if (enclosing == NULL)
1276               goto error_return;
1277             if ((bfd_vma) sym.n_value < enclosing->vma
1278                 || ((bfd_vma) sym.n_value + aux.x_csect.x_scnlen.l
1279                     > enclosing->vma + enclosing->_raw_size))
1280               {
1281                 (*_bfd_error_handler)
1282                   ("%s: csect `%s' not in enclosing section",
1283                    bfd_get_filename (abfd), name);
1284                 bfd_set_error (bfd_error_bad_value);
1285                 goto error_return;
1286               }
1287             csect->vma = sym.n_value;
1288             csect->filepos = (enclosing->filepos
1289                               + sym.n_value
1290                               - enclosing->vma);
1291             csect->_raw_size = aux.x_csect.x_scnlen.l;
1292             csect->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS;
1293             csect->alignment_power = SMTYP_ALIGN (aux.x_csect.x_smtyp);
1294
1295             /* Record the enclosing section in the tdata for this new
1296                section.  */
1297             csect->used_by_bfd =
1298               ((struct coff_section_tdata *)
1299                bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
1300             if (csect->used_by_bfd == NULL)
1301               {
1302                 bfd_set_error (bfd_error_no_memory);
1303                 goto error_return;
1304               }
1305             coff_section_data (abfd, csect)->tdata =
1306               bfd_zalloc (abfd, sizeof (struct xcoff_section_tdata));
1307             if (coff_section_data (abfd, csect)->tdata == NULL)
1308               {
1309                 bfd_set_error (bfd_error_no_memory);
1310                 goto error_return;
1311               }
1312             xcoff_section_data (abfd, csect)->enclosing = enclosing;
1313
1314             /* XCOFF requires that relocs be sorted by address, so we
1315                could do a binary search here.  FIXME.  (XCOFF
1316                unfortunately does not require that symbols be sorted
1317                by address, or this would be a simple merge).  */
1318             rel = reloc_info[enclosing->target_index].relocs;
1319             rel_csect = reloc_info[enclosing->target_index].csects;
1320             for (relindx = 0;
1321                  relindx < enclosing->reloc_count;
1322                  relindx++, rel++, rel_csect++)
1323               {
1324                 if (*rel_csect == NULL
1325                     && rel->r_vaddr >= csect->vma
1326                     && rel->r_vaddr < csect->vma + csect->_raw_size)
1327                   {
1328                     csect->rel_filepos = (enclosing->rel_filepos
1329                                           + relindx * bfd_coff_relsz (abfd));
1330                     break;
1331                   }
1332               }
1333             while (relindx < enclosing->reloc_count
1334                    && *rel_csect == NULL
1335                    && rel->r_vaddr >= csect->vma
1336                    && rel->r_vaddr < csect->vma + csect->_raw_size)
1337               {
1338                 *rel_csect = csect;
1339                 csect->flags |= SEC_RELOC;
1340                 ++csect->reloc_count;
1341                 ++relindx;
1342                 ++rel;
1343                 ++rel_csect;
1344               }
1345
1346             /* There are a number of other fields and section flags
1347                which we do not bother to set.  */
1348
1349             csect_index = ((esym
1350                             - (bfd_byte *) obj_coff_external_syms (abfd))
1351                            / symesz);
1352
1353             xcoff_section_data (abfd, csect)->first_symndx = csect_index;
1354
1355             if (first_csect == NULL)
1356               first_csect = csect;
1357
1358             /* If this symbol is C_EXT, we treat it as starting at the
1359                beginning of the newly created section.  */
1360             if (sym.n_sclass == C_EXT)
1361               {
1362                 section = csect;
1363                 value = 0;
1364               }
1365
1366             /* If this is a TOC section for a symbol, record it.  */
1367             if (set_toc != NULL)
1368               {
1369                 set_toc->toc_section = csect;
1370                 set_toc->toc_offset = 0;
1371               }
1372           }
1373           break;
1374
1375         case XTY_LD:
1376           /* This is a label definition.  The x_scnlen field is the
1377              symbol index of the csect.  I believe that this must
1378              always follow the appropriate XTY_SD symbol, so I will
1379              insist on it.  */
1380           {
1381             boolean bad;
1382
1383             bad = false;
1384             if (aux.x_csect.x_scnlen.l < 0
1385                 || (aux.x_csect.x_scnlen.l
1386                     >= esym - (bfd_byte *) obj_coff_external_syms (abfd)))
1387               bad = true;
1388             if (! bad)
1389               {
1390                 section = xcoff_data (abfd)->csects[aux.x_csect.x_scnlen.l];
1391                 if (section == NULL
1392                     || (section->flags & SEC_HAS_CONTENTS) == 0)
1393                   bad = true;
1394               }
1395             if (bad)
1396               {
1397                 (*_bfd_error_handler)
1398                   ("%s: misplaced XTY_LD `%s'",
1399                    bfd_get_filename (abfd), name);
1400                 bfd_set_error (bfd_error_bad_value);
1401                 goto error_return;
1402               }
1403
1404             value = sym.n_value - csect->vma;
1405           }
1406           break;
1407
1408         case XTY_CM:
1409           /* This is an unitialized csect.  We could base the name on
1410              the storage mapping class, but we don't bother.  If this
1411              csect is externally visible, it is a common symbol.  */
1412
1413           if (csect != NULL)
1414             {
1415               xcoff_section_data (abfd, csect)->last_symndx =
1416                 ((esym
1417                   - (bfd_byte *) obj_coff_external_syms (abfd))
1418                  / symesz);
1419             }
1420
1421           csect = bfd_make_section_anyway (abfd, ".bss");
1422           if (csect == NULL)
1423             goto error_return;
1424           csect->vma = 0;
1425           csect->_raw_size = aux.x_csect.x_scnlen.l;
1426           csect->flags |= SEC_ALLOC;
1427           csect->alignment_power = SMTYP_ALIGN (aux.x_csect.x_smtyp);
1428           /* There are a number of other fields and section flags
1429              which we do not bother to set.  */
1430
1431           csect_index = ((esym
1432                           - (bfd_byte *) obj_coff_external_syms (abfd))
1433                          / symesz);
1434
1435           csect->used_by_bfd =
1436             ((struct coff_section_tdata *)
1437              bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
1438           if (csect->used_by_bfd == NULL)
1439             {
1440               bfd_set_error (bfd_error_no_memory);
1441               goto error_return;
1442             }
1443           coff_section_data (abfd, csect)->tdata =
1444             bfd_zalloc (abfd, sizeof (struct xcoff_section_tdata));
1445           if (coff_section_data (abfd, csect)->tdata == NULL)
1446             {
1447               bfd_set_error (bfd_error_no_memory);
1448               goto error_return;
1449             }
1450           xcoff_section_data (abfd, csect)->first_symndx = csect_index;
1451
1452           if (first_csect == NULL)
1453             first_csect = csect;
1454
1455           if (sym.n_sclass == C_EXT)
1456             {
1457               csect->flags |= SEC_IS_COMMON;
1458               section = csect;
1459               value = aux.x_csect.x_scnlen.l;
1460             }
1461
1462           break;
1463         }
1464
1465       /* Now we have enough information to add the symbol to the
1466          linker hash table.  */
1467
1468       if (sym.n_sclass == C_EXT)
1469         {
1470           boolean copy;
1471
1472           BFD_ASSERT (section != NULL);
1473
1474           /* We must copy the name into memory if we got it from the
1475              syment itself, rather than the string table.  */
1476           copy = default_copy;
1477           if (sym._n._n_n._n_zeroes != 0
1478               || sym._n._n_n._n_offset == 0)
1479             copy = true;
1480
1481           if (info->hash->creator == abfd->xvec)
1482             {
1483               /* If we are statically linking a shared object, it is
1484                  OK for symbol redefinitions to occur.  I can't figure
1485                  out just what the XCOFF linker is doing, but
1486                  something like this is required for -bnso to work.  */
1487               *sym_hash = xcoff_link_hash_lookup (xcoff_hash_table (info),
1488                                                   name, true, copy, false);
1489               if (*sym_hash == NULL)
1490                 goto error_return;
1491               if (((*sym_hash)->root.type == bfd_link_hash_defined
1492                    || (*sym_hash)->root.type == bfd_link_hash_defweak)
1493                   && ! bfd_is_und_section (section)
1494                   && ! bfd_is_com_section (section))
1495                 {
1496                   if ((abfd->flags & DYNAMIC) != 0)
1497                     {
1498                       section = bfd_und_section_ptr;
1499                       value = 0;
1500                     }
1501                   else if (((*sym_hash)->root.u.def.section->owner->flags
1502                             & DYNAMIC) != 0)
1503                     {
1504                       (*sym_hash)->root.type = bfd_link_hash_undefined;
1505                       (*sym_hash)->root.u.undef.abfd =
1506                         (*sym_hash)->root.u.def.section->owner;
1507                     }
1508                 }
1509             }
1510
1511           if (! (_bfd_generic_link_add_one_symbol
1512                  (info, abfd, name, flags, section, value,
1513                   (const char *) NULL, copy, false,
1514                   (struct bfd_link_hash_entry **) sym_hash)))
1515             goto error_return;
1516
1517           if (info->hash->creator == abfd->xvec)
1518             {
1519               int flag;
1520
1521               if (smtyp == XTY_ER || smtyp == XTY_CM)
1522                 flag = XCOFF_REF_REGULAR;
1523               else
1524                 flag = XCOFF_DEF_REGULAR;
1525               (*sym_hash)->flags |= flag;
1526
1527               if ((*sym_hash)->smclas == XMC_UA)
1528                 (*sym_hash)->smclas = aux.x_csect.x_smclas;
1529             }
1530         }
1531
1532       *csect_cache = csect;
1533
1534       esym += (sym.n_numaux + 1) * symesz;
1535       sym_hash += sym.n_numaux + 1;
1536       csect_cache += sym.n_numaux + 1;
1537     }
1538
1539   /* Make sure that we have seen all the relocs.  */
1540   for (sub = abfd->sections; sub != first_csect; sub = sub->next)
1541     {
1542       /* Reset the section size, since the data is now attached to the
1543          csects.  Don't reset the size of the .debug section, since we
1544          need to read it below in bfd_xcoff_size_dynamic_sections.  */
1545       if (strcmp (bfd_get_section_name (abfd, sub), ".debug") != 0)
1546         sub->_raw_size = 0;
1547
1548       if ((sub->flags & SEC_RELOC) != 0)
1549         {
1550           bfd_size_type i;
1551           struct internal_reloc *rel;
1552           asection **rel_csect;
1553
1554           rel = reloc_info[sub->target_index].relocs;
1555           rel_csect = reloc_info[sub->target_index].csects;
1556           for (i = 0; i < sub->reloc_count; i++, rel++, rel_csect++)
1557             {
1558               if (*rel_csect == NULL)
1559                 {
1560                   (*_bfd_error_handler)
1561                     ("%s: reloc %s:%d not in csect",
1562                      bfd_get_filename (abfd), sub->name, i);
1563                   bfd_set_error (bfd_error_bad_value);
1564                   goto error_return;
1565                 }
1566
1567               /* We need to copy all relocs which are not PC relative
1568                  and not TOC relative into the .loader section.
1569
1570                  We also identify all symbols which are called, so
1571                  that we can create glue code for calls to functions
1572                  imported from dynamic objects.  */
1573
1574               if (info->hash->creator == abfd->xvec
1575                   && *rel_csect != bfd_und_section_ptr)
1576                 {
1577                   struct xcoff_link_hash_entry *h;
1578
1579                   switch (rel->r_type)
1580                     {
1581                     default:
1582                       break;
1583                     case R_POS:
1584                     case R_NEG:
1585                     case R_RL:
1586                     case R_RLA:
1587                       ++xcoff_hash_table (info)->ldrel_count;
1588                       ++xcoff_section_data (abfd, *rel_csect)->ldrel_count;
1589                       h = obj_xcoff_sym_hashes (abfd)[rel->r_symndx];
1590                       if (h != NULL)
1591                         h->flags |= XCOFF_LDREL;
1592                       break;
1593                     case R_BR:
1594                     case R_RBR:
1595                       h = obj_xcoff_sym_hashes (abfd)[rel->r_symndx];
1596                       if (h != NULL)
1597                         {
1598                           h->flags |= XCOFF_CALLED;
1599                           /* If the symbol name starts with a period,
1600                              it is the code of a function.  If the
1601                              symbol is currently undefined, then add
1602                              an undefined symbol for the function
1603                              descriptor.  This should do no harm,
1604                              because any regular object that defines
1605                              the function should also define the
1606                              function descriptor.  It helps, because
1607                              it means that we will identify the
1608                              function descriptor with a dynamic object
1609                              if a dynamic object defines it.  */
1610                           if (h->root.root.string[0] == '.'
1611                               && h->descriptor == NULL)
1612                             {
1613                               struct xcoff_link_hash_entry *hds;
1614
1615                               hds = (xcoff_link_hash_lookup
1616                                      (xcoff_hash_table (info),
1617                                       h->root.root.string + 1, true, false,
1618                                       true));
1619                               if (hds == NULL)
1620                                 goto error_return;
1621                               if (hds->root.type == bfd_link_hash_new)
1622                                 {
1623                                   if (! (_bfd_generic_link_add_one_symbol
1624                                          (info, abfd, hds->root.root.string,
1625                                           (flagword) 0, bfd_und_section_ptr,
1626                                           (bfd_vma) 0, (const char *) NULL,
1627                                           false, false,
1628                                           ((struct bfd_link_hash_entry **)
1629                                            NULL))))
1630                                     goto error_return;
1631                                 }
1632                               h->descriptor = hds;
1633                             }
1634                         }
1635                       break;
1636                     }
1637                 }
1638             }
1639
1640           free (reloc_info[sub->target_index].csects);
1641           reloc_info[sub->target_index].csects = NULL;
1642
1643           /* Reset SEC_RELOC, the reloc_count, and the lineno_count,
1644              since the reloc and lineno information is now attached to
1645              the csects.  */
1646           sub->flags &=~ SEC_RELOC;
1647           sub->reloc_count = 0;
1648           sub->lineno_count = 0;
1649
1650           /* If we are not keeping memory, free the reloc information.  */
1651           if (! info->keep_memory
1652               && coff_section_data (abfd, sub) != NULL
1653               && coff_section_data (abfd, sub)->relocs != NULL
1654               && ! coff_section_data (abfd, sub)->keep_relocs)
1655             {
1656               free (coff_section_data (abfd, sub)->relocs);
1657               coff_section_data (abfd, sub)->relocs = NULL;
1658             }
1659         }
1660
1661       /* Free up the line numbers.  FIXME: We could cache these
1662          somewhere for the final link, to avoid reading them again.  */
1663       if (reloc_info[sub->target_index].linenos != NULL)
1664         {
1665           free (reloc_info[sub->target_index].linenos);
1666           reloc_info[sub->target_index].linenos = NULL;
1667         }
1668     }
1669
1670   free (reloc_info);
1671
1672   obj_coff_keep_syms (abfd) = keep_syms;
1673
1674   return true;
1675
1676  error_return:
1677   if (reloc_info != NULL)
1678     {
1679       for (sub = abfd->sections; sub != NULL; sub = sub->next)
1680         {
1681           if (reloc_info[sub->target_index].csects != NULL)
1682             free (reloc_info[sub->target_index].csects);
1683           if (reloc_info[sub->target_index].linenos != NULL)
1684             free (reloc_info[sub->target_index].linenos);
1685         }
1686     free (reloc_info);
1687     }
1688   obj_coff_keep_syms (abfd) = keep_syms;
1689   return false;
1690 }
1691
1692 #undef N_TMASK
1693 #undef N_BTSHFT
1694
1695 /* This function is used to add symbols from a dynamic object to the
1696    global symbol table.  */
1697
1698 static boolean
1699 xcoff_link_add_dynamic_symbols (abfd, info)
1700      bfd *abfd;
1701      struct bfd_link_info *info;
1702 {
1703   bfd_size_type symesz;
1704   bfd_byte *esym;
1705   bfd_byte *esym_end;
1706   struct xcoff_import_file *n;
1707   const char *bname;
1708   const char *mname;
1709   const char *s;
1710   unsigned int c;
1711   struct xcoff_import_file **pp;
1712
1713   /* We can only handle a dynamic object if we are generating an XCOFF
1714      output file.  */
1715   if (info->hash->creator != abfd->xvec)
1716     {
1717       (*_bfd_error_handler)
1718         ("%s: XCOFF shared object when not producing XCOFF output",
1719          bfd_get_filename (abfd));
1720       bfd_set_error (bfd_error_invalid_operation);
1721       return false;
1722     }
1723
1724   /* Remove the sections from this object, so that they do not get
1725      included in the link.  */
1726   abfd->sections = NULL;
1727
1728   symesz = bfd_coff_symesz (abfd);
1729   esym = (bfd_byte *) obj_coff_external_syms (abfd);
1730   esym_end = esym + obj_raw_syment_count (abfd) * symesz;
1731   while (esym < esym_end)
1732     {
1733       struct internal_syment sym;
1734
1735       bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym);
1736
1737       /* I think that every symbol mentioned in a dynamic object must
1738          be defined by that object, perhaps by importing it from
1739          another dynamic object.  All we have to do is look up each
1740          external symbol.  If we have already put it in the hash
1741          table, we simply set a flag indicating that it appears in a
1742          dynamic object.  */
1743
1744       if (sym.n_sclass == C_EXT)
1745         {
1746           const char *name;
1747           char buf[SYMNMLEN + 1];
1748           struct xcoff_link_hash_entry *h;
1749
1750           name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
1751           if (name == NULL)
1752             return false;
1753
1754           /* Normally we could not xcoff_link_hash_lookup in an add
1755              symbols routine, since we might not be using an XCOFF
1756              hash table.  However, we verified above that we are using
1757              an XCOFF hash table.  */
1758           h = xcoff_link_hash_lookup (xcoff_hash_table (info), name,
1759                                       false, false, true);
1760           if (h != NULL)
1761             {
1762               h->flags |= XCOFF_REF_DYNAMIC;
1763
1764               /* If the symbol is undefined, and the current BFD is
1765                  not a dynamic object, change the BFD to this dynamic
1766                  object, so that we can get the import file ID
1767                  correctly.  */
1768               if (h->root.u.undef.abfd == NULL
1769                   || (h->root.u.undef.abfd->flags & DYNAMIC) == 0)
1770                 h->root.u.undef.abfd = abfd;
1771
1772               if (h->smclas == XMC_UA
1773                   && sym.n_numaux > 0)
1774                 {
1775                   union internal_auxent aux;
1776
1777                   bfd_coff_swap_aux_in (abfd,
1778                                         (PTR) (esym + symesz * sym.n_numaux),
1779                                         sym.n_type, sym.n_sclass,
1780                                         sym.n_numaux - 1, sym.n_numaux,
1781                                         (PTR) &aux);
1782                   h->smclas = aux.x_csect.x_smclas;
1783                 }
1784             }
1785         }
1786
1787       esym += (sym.n_numaux + 1) * symesz;
1788     }
1789
1790   /* Record this file in the import files.  */
1791
1792   n = ((struct xcoff_import_file *)
1793        bfd_alloc (abfd, sizeof (struct xcoff_import_file)));
1794   if (n == NULL)
1795     {
1796       bfd_set_error (bfd_error_no_memory);
1797       return false;
1798     }
1799   n->next = NULL;
1800
1801   /* For some reason, the path entry in the import file list for a
1802      shared object appears to always be empty.  The file name is the
1803      base name.  */
1804   n->path = "";
1805   if (abfd->my_archive == NULL)
1806     {
1807       bname = bfd_get_filename (abfd);
1808       mname = "";
1809     }
1810   else
1811     {
1812       bname = bfd_get_filename (abfd->my_archive);
1813       mname = bfd_get_filename (abfd);
1814     }
1815   s = strrchr (bname, '/');
1816   if (s != NULL)
1817     bname = s + 1;
1818   n->file = bname;
1819   n->member = mname;
1820
1821   /* We start c at 1 because the first import file number is reserved
1822      for LIBPATH.  */
1823   for (pp = &xcoff_hash_table (info)->imports, c = 1;
1824        *pp != NULL;
1825        pp = &(*pp)->next, ++c)
1826     ;
1827   *pp = n;
1828
1829   xcoff_data (abfd)->import_file_id = c;
1830
1831   return true;
1832 }
1833 \f
1834 /* Routines that are called after all the input files have been
1835    handled, but before the sections are laid out in memory.  */
1836
1837 /* Import a symbol.  */
1838
1839 boolean
1840 bfd_xcoff_import_symbol (output_bfd, info, harg, val, imppath, impfile,
1841                          impmember)
1842      bfd *output_bfd;
1843      struct bfd_link_info *info;
1844      struct bfd_link_hash_entry *harg;
1845      bfd_vma val;
1846      const char *imppath;
1847      const char *impfile;
1848      const char *impmember;
1849 {
1850   struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
1851
1852   h->flags |= XCOFF_IMPORT;
1853
1854   if (val != (bfd_vma) -1)
1855     {
1856       if (h->root.type == bfd_link_hash_defined)
1857         {
1858           if (! ((*info->callbacks->multiple_definition)
1859                  (info, h->root.root.string, h->root.u.def.section->owner,
1860                   h->root.u.def.section, h->root.u.def.value,
1861                   output_bfd, bfd_abs_section_ptr, val)))
1862             return false;
1863         }
1864
1865       h->root.type = bfd_link_hash_defined;
1866       h->root.u.def.section = bfd_abs_section_ptr;
1867       h->root.u.def.value = val;
1868     }
1869
1870   if (h->ldsym == NULL)
1871     {
1872       h->ldsym = ((struct internal_ldsym *)
1873                   bfd_zalloc (output_bfd, sizeof (struct internal_ldsym)));
1874       if (h->ldsym == NULL)
1875         {
1876           bfd_set_error (bfd_error_no_memory);
1877           return false;
1878         }
1879     }
1880
1881   if (imppath == NULL)
1882     h->ldsym->l_ifile = (bfd_size_type) -1;
1883   else
1884     {
1885       unsigned int c;
1886       struct xcoff_import_file **pp;
1887
1888       /* We start c at 1 because the first entry in the import list is
1889          reserved for the library search path.  */
1890       for (pp = &xcoff_hash_table (info)->imports, c = 1;
1891            *pp != NULL;
1892            pp = &(*pp)->next, ++c)
1893         {
1894           if (strcmp ((*pp)->path, imppath) == 0
1895               && strcmp ((*pp)->file, impfile) == 0
1896               && strcmp ((*pp)->member, impmember) == 0)
1897             break;
1898         }
1899
1900       if (*pp == NULL)
1901         {
1902           struct xcoff_import_file *n;
1903
1904           n = ((struct xcoff_import_file *)
1905                bfd_alloc (output_bfd, sizeof (struct xcoff_import_file)));
1906           if (n == NULL)
1907             {
1908               bfd_set_error (bfd_error_no_memory);
1909               return false;
1910             }
1911           n->next = NULL;
1912           n->path = imppath;
1913           n->file = impfile;
1914           n->member = impmember;
1915           *pp = n;
1916         }
1917
1918       h->ldsym->l_ifile = c;
1919     }
1920
1921   return true;
1922 }
1923
1924 /* Export a symbol.  */
1925
1926 boolean
1927 bfd_xcoff_export_symbol (output_bfd, info, harg, syscall)
1928      bfd *output_bfd;
1929      struct bfd_link_info *info;
1930      struct bfd_link_hash_entry *harg;
1931      boolean syscall;
1932 {
1933   struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
1934
1935   h->flags |= XCOFF_EXPORT;
1936
1937   /* FIXME: I'm not at all sure what syscall is supposed to mean, so
1938      I'm just going to ignore it until somebody explains it.  */
1939
1940   return true;
1941 }
1942
1943 /* This structure is used to pass information through
1944    xcoff_link_hash_traverse.  */
1945
1946 struct xcoff_loader_info
1947 {
1948   /* Set if a problem occurred.  */
1949   boolean failed;
1950   /* Output BFD.  */
1951   bfd *output_bfd;
1952   /* Link information structure.  */
1953   struct bfd_link_info *info;
1954   /* Number of ldsym structures.  */
1955   size_t ldsym_count;
1956   /* Size of string table.  */
1957   size_t string_size;
1958   /* String table.  */
1959   bfd_byte *strings;
1960   /* Allocated size of string table.  */
1961   size_t string_alc;
1962 };
1963
1964 /* Build the .loader section.  This is called by the XCOFF linker
1965    emulation before_allocation routine.  We must set the size of the
1966    .loader section before the linker lays out the output file.
1967    LIBPATH is the library path to search for shared objects; this is
1968    normally built from the -L arguments passed to the linker.  ENTRY
1969    is the name of the entry point symbol.  */
1970
1971 boolean
1972 bfd_xcoff_size_dynamic_sections (output_bfd, info, libpath, entry,
1973                                  file_align, maxstack, maxdata, gc,
1974                                  modtype, textro)
1975      bfd *output_bfd;
1976      struct bfd_link_info *info;
1977      const char *libpath;
1978      const char *entry;
1979      unsigned long file_align;
1980      unsigned long maxstack;
1981      unsigned long maxdata;
1982      boolean gc;
1983      int modtype;
1984      boolean textro;
1985 {
1986   struct xcoff_link_hash_entry *hentry;
1987   asection *lsec;
1988   struct xcoff_loader_info ldinfo;
1989   size_t impsize, impcount;
1990   struct xcoff_import_file *fl;
1991   struct internal_ldhdr *ldhdr;
1992   register char *out;
1993   asection *sec;
1994   bfd *sub;
1995   struct bfd_strtab_hash *debug_strtab;
1996   bfd_byte *debug_contents = NULL;
1997
1998   ldinfo.failed = false;
1999   ldinfo.output_bfd = output_bfd;
2000   ldinfo.info = info;
2001   ldinfo.ldsym_count = 0;
2002   ldinfo.string_size = 0;
2003   ldinfo.strings = NULL;
2004   ldinfo.string_alc = 0;
2005
2006   xcoff_data (output_bfd)->maxstack = maxstack;
2007   xcoff_data (output_bfd)->maxdata = maxdata;
2008   xcoff_data (output_bfd)->modtype = modtype;
2009
2010   xcoff_hash_table (info)->file_align = file_align;
2011   xcoff_hash_table (info)->textro = textro;
2012
2013   hentry = xcoff_link_hash_lookup (xcoff_hash_table (info), entry,
2014                                    false, false, true);
2015   if (hentry != NULL)
2016     hentry->flags |= XCOFF_ENTRY;
2017
2018   /* Garbage collect unused sections.  */
2019   if (info->relocateable
2020       || ! gc
2021       || hentry == NULL
2022       || (hentry->root.type != bfd_link_hash_defined
2023           && hentry->root.type != bfd_link_hash_defweak))
2024     {
2025       gc = false;
2026       xcoff_hash_table (info)->gc = false;
2027     }
2028   else
2029     {
2030       if (! xcoff_mark (info, hentry->root.u.def.section))
2031         goto error_return;
2032       xcoff_sweep (info);
2033       xcoff_hash_table (info)->gc = true;
2034     }
2035
2036   if (info->input_bfds == NULL)
2037     {
2038       /* I'm not sure what to do in this bizarre case.  */
2039       return true;
2040     }
2041
2042   xcoff_link_hash_traverse (xcoff_hash_table (info), xcoff_build_ldsyms,
2043                             (PTR) &ldinfo);
2044   if (ldinfo.failed)
2045     goto error_return;
2046
2047   /* Work out the size of the import file names.  Each import file ID
2048      consists of three null terminated strings: the path, the file
2049      name, and the archive member name.  The first entry in the list
2050      of names is the path to use to find objects, which the linker has
2051      passed in as the libpath argument.  For some reason, the path
2052      entry in the other import file names appears to always be empty.  */
2053   impsize = strlen (libpath) + 3;
2054   impcount = 1;
2055   for (fl = xcoff_hash_table (info)->imports; fl != NULL; fl = fl->next)
2056     {
2057       ++impcount;
2058       impsize += (strlen (fl->path)
2059                   + strlen (fl->file)
2060                   + strlen (fl->member)
2061                   + 3);
2062     }
2063
2064   /* Set up the .loader section header.  */
2065   ldhdr = &xcoff_hash_table (info)->ldhdr;
2066   ldhdr->l_version = 1;
2067   ldhdr->l_nsyms = ldinfo.ldsym_count;
2068   ldhdr->l_nreloc = xcoff_hash_table (info)->ldrel_count;
2069   ldhdr->l_istlen = impsize;
2070   ldhdr->l_nimpid = impcount;
2071   ldhdr->l_impoff = (LDHDRSZ
2072                      + ldhdr->l_nsyms * LDSYMSZ
2073                      + ldhdr->l_nreloc * LDRELSZ);
2074   ldhdr->l_stlen = ldinfo.string_size;
2075   ldhdr->l_stoff = ldhdr->l_impoff + impsize;
2076
2077   /* We now know the final size of the .loader section.  Allocate
2078      space for it.  */
2079   lsec = xcoff_hash_table (info)->loader_section;
2080   lsec->_raw_size = ldhdr->l_stoff + ldhdr->l_stlen;
2081   lsec->contents = (bfd_byte *) bfd_zalloc (output_bfd, lsec->_raw_size);
2082   if (lsec->contents == NULL)
2083     {
2084       bfd_set_error (bfd_error_no_memory);
2085       goto error_return;
2086     }
2087
2088   /* Set up the header.  */
2089   xcoff_swap_ldhdr_out (output_bfd, ldhdr,
2090                         (struct external_ldhdr *) lsec->contents);
2091
2092   /* Set up the import file names.  */
2093   out = (char *) lsec->contents + ldhdr->l_impoff;
2094   strcpy (out, libpath);
2095   out += strlen (libpath) + 1;
2096   *out++ = '\0';
2097   *out++ = '\0';
2098   for (fl = xcoff_hash_table (info)->imports; fl != NULL; fl = fl->next)
2099     {
2100       register const char *s;
2101
2102       s = fl->path;
2103       while ((*out++ = *s++) != '\0')
2104         ;
2105       s = fl->file;
2106       while ((*out++ = *s++) != '\0')
2107         ;
2108       s = fl->member;
2109       while ((*out++ = *s++) != '\0')
2110         ;
2111     }
2112
2113   BFD_ASSERT ((bfd_size_type) ((bfd_byte *) out - lsec->contents)
2114               == ldhdr->l_stoff);
2115
2116   /* Set up the symbol string table.  */
2117   if (ldinfo.string_size > 0)
2118     {
2119       memcpy (out, ldinfo.strings, ldinfo.string_size);
2120       free (ldinfo.strings);
2121       ldinfo.strings = NULL;
2122     }
2123
2124   /* We can't set up the symbol table or the relocs yet, because we
2125      don't yet know the final position of the various sections.  The
2126      .loader symbols are written out when the corresponding normal
2127      symbols are written out in xcoff_link_input_bfd or
2128      xcoff_write_global_symbol.  The .loader relocs are written out
2129      when the corresponding normal relocs are handled in
2130      xcoff_link_input_bfd.  */
2131
2132   /* Allocate space for the global linkage section and the global toc
2133      section.  */
2134   sec = xcoff_hash_table (info)->linkage_section;
2135   if (sec->_raw_size > 0)
2136     {
2137       sec->contents = (bfd_byte *) bfd_zalloc (output_bfd, sec->_raw_size);
2138       if (sec->contents == NULL)
2139         {
2140           bfd_set_error (bfd_error_no_memory);
2141           goto error_return;
2142         }
2143     }
2144   sec = xcoff_hash_table (info)->toc_section;
2145   if (sec->_raw_size > 0)
2146     {
2147       sec->contents = (bfd_byte *) bfd_zalloc (output_bfd, sec->_raw_size);
2148       if (sec->contents == NULL)
2149         {
2150           bfd_set_error (bfd_error_no_memory);
2151           goto error_return;
2152         }
2153     }
2154
2155   /* Now that we've done garbage collection, figure out the contents
2156      of the .debug section.  */
2157   debug_strtab = xcoff_hash_table (info)->debug_strtab;
2158
2159   for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
2160     {
2161       asection *subdeb;
2162       bfd_size_type symcount;
2163       unsigned long *debug_index;
2164       asection **csectpp;
2165       bfd_byte *esym, *esymend;
2166       bfd_size_type symesz;
2167
2168       if (sub->xvec != info->hash->creator)
2169         continue;
2170       subdeb = bfd_get_section_by_name (sub, ".debug");
2171       if (subdeb == NULL || subdeb->_raw_size == 0)
2172         continue;
2173
2174       if (info->strip == strip_all
2175           || info->strip == strip_debugger
2176           || info->discard == discard_all)
2177         {
2178           subdeb->_raw_size = 0;
2179           continue;
2180         }
2181
2182       if (! _bfd_coff_get_external_symbols (sub))
2183         goto error_return;
2184
2185       symcount = obj_raw_syment_count (sub);
2186       debug_index = ((unsigned long *)
2187                      bfd_zalloc (sub, symcount * sizeof (unsigned long)));
2188       if (debug_index == NULL)
2189         {
2190           bfd_set_error (bfd_error_no_memory);
2191           goto error_return;
2192         }
2193       xcoff_data (sub)->debug_indices = debug_index;
2194
2195       /* Grab the contents of the .debug section.  We use malloc and
2196          copy the neams into the debug stringtab, rather than
2197          bfd_alloc, because I expect that, when linking many files
2198          together, many of the strings will be the same.  Storing the
2199          strings in the hash table should save space in this case.  */
2200       debug_contents = (bfd_byte *) malloc (subdeb->_raw_size);
2201       if (debug_contents == NULL)
2202         {
2203           bfd_set_error (bfd_error_no_memory);
2204           goto error_return;
2205         }
2206       if (! bfd_get_section_contents (sub, subdeb, (PTR) debug_contents,
2207                                       (file_ptr) 0, subdeb->_raw_size))
2208         goto error_return;
2209
2210       csectpp = xcoff_data (sub)->csects;
2211
2212       symesz = bfd_coff_symesz (sub);
2213       esym = (bfd_byte *) obj_coff_external_syms (sub);
2214       esymend = esym + symcount * symesz;
2215       while (esym < esymend)
2216         {
2217           struct internal_syment sym;
2218
2219           bfd_coff_swap_sym_in (sub, (PTR) esym, (PTR) &sym);
2220
2221           *debug_index = (unsigned long) -1;
2222
2223           if (sym._n._n_n._n_zeroes == 0
2224               && *csectpp != NULL
2225               && (! gc
2226                   || ((*csectpp)->flags & SEC_MARK) != 0
2227                   || *csectpp == bfd_abs_section_ptr)
2228               && bfd_coff_symname_in_debug (sub, &sym))
2229             {
2230               char *name;
2231               bfd_size_type indx;
2232
2233               name = (char *) debug_contents + sym._n._n_n._n_offset;
2234               indx = _bfd_stringtab_add (debug_strtab, name, true, true);
2235               if (indx == (bfd_size_type) -1)
2236                 goto error_return;
2237               *debug_index = indx;
2238             }
2239
2240           esym += (sym.n_numaux + 1) * symesz;
2241           csectpp += sym.n_numaux + 1;
2242           debug_index += sym.n_numaux + 1;
2243         }
2244
2245       free (debug_contents);
2246       debug_contents = NULL;
2247
2248       /* Clear the size of subdeb, so that it is not included directly
2249          in the output file.  */
2250       subdeb->_raw_size = 0;
2251
2252       if (! info->keep_memory)
2253         {
2254           if (! _bfd_coff_free_symbols (sub))
2255             goto error_return;
2256         }
2257     }
2258
2259   xcoff_hash_table (info)->debug_section->_raw_size =
2260     _bfd_stringtab_size (debug_strtab);
2261
2262   return true;
2263
2264  error_return:
2265   if (ldinfo.strings != NULL)
2266     free (ldinfo.strings);
2267   if (debug_contents != NULL)
2268     free (debug_contents);
2269   return false;
2270 }
2271
2272 /* The mark phase of garbage collection.  For a given section, mark
2273    it, and all the sections which define symbols to which it refers.  */
2274
2275 static boolean
2276 xcoff_mark (info, sec)
2277      struct bfd_link_info *info;
2278      asection *sec;
2279 {
2280   if ((sec->flags & SEC_MARK) != 0)
2281     return true;
2282
2283   sec->flags |= SEC_MARK;
2284
2285   if (sec->owner->xvec == info->hash->creator
2286       && coff_section_data (sec->owner, sec) != NULL
2287       && xcoff_section_data (sec->owner, sec) != NULL)
2288     {
2289       register struct xcoff_link_hash_entry **hp, **hpend;
2290       struct internal_reloc *rel, *relend;
2291
2292       /* Mark all the symbols in this section.  */
2293
2294       hp = (obj_xcoff_sym_hashes (sec->owner)
2295             + xcoff_section_data (sec->owner, sec)->first_symndx);
2296       hpend = (obj_xcoff_sym_hashes (sec->owner)
2297                + xcoff_section_data (sec->owner, sec)->last_symndx);
2298       for (; hp < hpend; hp++)
2299         {
2300           register struct xcoff_link_hash_entry *h;
2301
2302           h = *hp;
2303           if (h != NULL
2304               && (h->flags & XCOFF_MARK) == 0)
2305             {
2306               h->flags |= XCOFF_MARK;
2307               if (h->root.type == bfd_link_hash_defined
2308                   || h->root.type == bfd_link_hash_defweak)
2309                 {
2310                   asection *hsec;
2311
2312                   hsec = h->root.u.def.section;
2313                   if ((hsec->flags & SEC_MARK) == 0)
2314                     {
2315                       if (! xcoff_mark (info, hsec))
2316                         return false;
2317                     }
2318                 }
2319
2320               if (h->toc_section != NULL
2321                   && (h->toc_section->flags & SEC_MARK) == 0)
2322                 {
2323                   if (! xcoff_mark (info, h->toc_section))
2324                     return false;
2325                 }
2326             }
2327         }
2328
2329       /* Look through the section relocs.  */
2330
2331       if ((sec->flags & SEC_RELOC) != 0
2332           && sec->reloc_count > 0)
2333         {
2334           rel = xcoff_read_internal_relocs (sec->owner, sec, true,
2335                                             (bfd_byte *) NULL, false,
2336                                             (struct internal_reloc *) NULL);
2337           if (rel == NULL)
2338             return false;
2339           relend = rel + sec->reloc_count;
2340           for (; rel < relend; rel++)
2341             {
2342               asection *rsec;
2343               struct xcoff_link_hash_entry *h;
2344
2345               if ((unsigned int) rel->r_symndx
2346                   > obj_raw_syment_count (sec->owner))
2347                 continue;
2348
2349               h = obj_xcoff_sym_hashes (sec->owner)[rel->r_symndx];
2350               if (h != NULL
2351                   && (h->flags & XCOFF_MARK) == 0)
2352                 {
2353                   h->flags |= XCOFF_MARK;
2354                   if (h->root.type == bfd_link_hash_defined
2355                       || h->root.type == bfd_link_hash_defweak)
2356                     {
2357                       asection *hsec;
2358
2359                       hsec = h->root.u.def.section;
2360                       if ((hsec->flags & SEC_MARK) == 0)
2361                         {
2362                           if (! xcoff_mark (info, hsec))
2363                             return false;
2364                         }
2365                     }
2366
2367                   if (h->toc_section != NULL
2368                       && (h->toc_section->flags & SEC_MARK) == 0)
2369                     {
2370                       if (! xcoff_mark (info, h->toc_section))
2371                         return false;
2372                     }
2373                 }
2374
2375               rsec = xcoff_data (sec->owner)->csects[rel->r_symndx];
2376               if (rsec != NULL
2377                   && (rsec->flags & SEC_MARK) == 0)
2378                 {
2379                   if (! xcoff_mark (info, rsec))
2380                     return false;
2381                 }
2382             }
2383
2384           if (! info->keep_memory
2385               && coff_section_data (sec->owner, sec) != NULL
2386               && coff_section_data (sec->owner, sec)->relocs != NULL
2387               && ! coff_section_data (sec->owner, sec)->keep_relocs)
2388             {
2389               free (coff_section_data (sec->owner, sec)->relocs);
2390               coff_section_data (sec->owner, sec)->relocs = NULL;
2391             }
2392         }
2393     }
2394
2395   return true;
2396 }
2397
2398 /* The sweep phase of garbage collection.  Remove all garbage
2399    sections.  */
2400
2401 static void
2402 xcoff_sweep (info)
2403      struct bfd_link_info *info;
2404 {
2405   bfd *sub;
2406
2407   for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
2408     {
2409       asection *o;
2410
2411       for (o = sub->sections; o != NULL; o = o->next)
2412         {
2413           if ((o->flags & SEC_MARK) == 0)
2414             {
2415               /* Keep all sections from non-XCOFF input files.  Keep
2416                  special sections.  Keep .debug sections for the
2417                  moment.  */
2418               if (sub->xvec != info->hash->creator
2419                   || o == xcoff_hash_table (info)->debug_section
2420                   || o == xcoff_hash_table (info)->loader_section
2421                   || o == xcoff_hash_table (info)->linkage_section
2422                   || o == xcoff_hash_table (info)->toc_section
2423                   || strcmp (o->name, ".debug") == 0)
2424                 o->flags |= SEC_MARK;
2425               else
2426                 {
2427                   o->_raw_size = 0;
2428                   o->reloc_count = 0;
2429                   o->lineno_count = 0;
2430                   if (coff_section_data (sub, o) != NULL
2431                       && xcoff_section_data (sub, o) != NULL)
2432                     xcoff_hash_table (info)->ldrel_count -=
2433                       xcoff_section_data (sub, o)->ldrel_count;
2434                 }
2435             }
2436         }
2437     }
2438 }
2439
2440 /* Add a symbol to the .loader symbols, if necessary.  */
2441
2442 static boolean
2443 xcoff_build_ldsyms (h, p)
2444      struct xcoff_link_hash_entry *h;
2445      PTR p;
2446 {
2447   struct xcoff_loader_info *ldinfo = (struct xcoff_loader_info *) p;
2448   size_t len;
2449
2450   /* We don't want to garbage collect symbols which are not defined in
2451      XCOFF files.  This is a convenient place to mark them.  */
2452   if (xcoff_hash_table (ldinfo->info)->gc
2453       && (h->flags & XCOFF_MARK) == 0
2454       && (h->root.type == bfd_link_hash_defined
2455           || h->root.type == bfd_link_hash_defweak)
2456       && (h->root.u.def.section->owner == NULL
2457           || (h->root.u.def.section->owner->xvec
2458               != ldinfo->info->hash->creator)))
2459     h->flags |= XCOFF_MARK;
2460
2461   /* If this symbol is called, and it is defined in a dynamic object,
2462      then we need to set up global linkage code for it.  (Unless we
2463      did garbage collection and we didn't need this symbol.)  */
2464   if ((h->flags & XCOFF_CALLED) != 0
2465       && (h->flags & XCOFF_DEF_REGULAR) == 0
2466       && (h->flags & XCOFF_REF_DYNAMIC) != 0
2467       && (h->root.type == bfd_link_hash_undefined
2468           || h->root.type == bfd_link_hash_undefweak)
2469       && h->root.root.string[0] == '.'
2470       && (! xcoff_hash_table (ldinfo->info)->gc
2471           || (h->flags & XCOFF_MARK) != 0))
2472     {
2473       asection *sec;
2474       struct xcoff_link_hash_entry *hds;
2475
2476       sec = xcoff_hash_table (ldinfo->info)->linkage_section;
2477       h->root.type = bfd_link_hash_defined;
2478       h->root.u.def.section = sec;
2479       h->root.u.def.value = sec->_raw_size;
2480       h->smclas = XMC_GL;
2481       sec->_raw_size += XCOFF_GLINK_SIZE;
2482
2483       /* The global linkage code requires a TOC entry for the
2484          descriptor.  */
2485       hds = h->descriptor;
2486       BFD_ASSERT ((hds->root.type == bfd_link_hash_undefined
2487                    || hds->root.type == bfd_link_hash_undefweak)
2488                   && (hds->flags & XCOFF_DEF_REGULAR) == 0
2489                   && (hds->flags & XCOFF_REF_DYNAMIC) != 0);
2490       hds->flags |= XCOFF_MARK;
2491       if (hds->toc_section == NULL)
2492         {
2493           hds->toc_section = xcoff_hash_table (ldinfo->info)->toc_section;
2494           hds->toc_offset = hds->toc_section->_raw_size;
2495           hds->toc_section->_raw_size += 4;
2496           ++xcoff_hash_table (ldinfo->info)->ldrel_count;
2497           ++hds->toc_section->reloc_count;
2498           hds->indx = -2;
2499           hds->flags |= XCOFF_SET_TOC | XCOFF_LDREL;
2500
2501           /* We need to call xcoff_build_ldsyms recursively here,
2502              because we may already have passed hds on the traversal.  */
2503           xcoff_build_ldsyms (hds, p);
2504         }
2505     }
2506
2507   /* We need to add a symbol to the .loader section if it is mentioned
2508      in a reloc which we are copying to the .loader section and it was
2509      not defined, or if it is the entry point.  */
2510
2511   if (((h->flags & XCOFF_LDREL) == 0
2512        || h->root.type == bfd_link_hash_defined
2513        || h->root.type == bfd_link_hash_defweak)
2514       && (h->flags & XCOFF_ENTRY) == 0)
2515     {
2516       h->ldsym = NULL;
2517       return true;
2518     }
2519
2520   /* We don't need to add this symbol if we did garbage collection and
2521      we did not mark this symbol.  */
2522   if (xcoff_hash_table (ldinfo->info)->gc
2523       && (h->flags & XCOFF_MARK) == 0)
2524     {
2525       h->ldsym = NULL;
2526       return true;
2527     }
2528
2529   /* We may have already processed this symbol due to the recursive
2530      call above.  */
2531   if ((h->flags & XCOFF_BUILT_LDSYM) != 0)
2532     return true;
2533
2534   /* We need to add this symbol to the .loader symbols.  */
2535
2536   /* h->ldsym will already have been allocated for an explicitly
2537      imported symbol.  */
2538   if (h->ldsym == NULL)
2539     {
2540       h->ldsym = ((struct internal_ldsym *)
2541                   bfd_zalloc (ldinfo->output_bfd,
2542                               sizeof (struct internal_ldsym)));
2543       if (h->ldsym == NULL)
2544         {
2545           ldinfo->failed = true;
2546           bfd_set_error (bfd_error_no_memory);
2547           return false;
2548         }
2549     }
2550
2551   /* The first 3 symbol table indices are reserved to indicate the
2552      sections.  */
2553   h->ldindx = ldinfo->ldsym_count + 3;
2554
2555   ++ldinfo->ldsym_count;
2556
2557   len = strlen (h->root.root.string);
2558   if (len <= SYMNMLEN)
2559     strncpy (h->ldsym->_l._l_name, h->root.root.string, SYMNMLEN);
2560   else
2561     {
2562       if (ldinfo->string_size + len + 3 > ldinfo->string_alc)
2563         {
2564           size_t newalc;
2565           bfd_byte *newstrings;
2566
2567           newalc = ldinfo->string_alc * 2;
2568           if (newalc == 0)
2569             newalc = 32;
2570           while (ldinfo->string_size + len + 3 > newalc)
2571             newalc *= 2;
2572
2573           if (ldinfo->strings == NULL)
2574             newstrings = (bfd_byte *) malloc (newalc);
2575           else
2576             newstrings = ((bfd_byte *)
2577                           realloc ((PTR) ldinfo->strings, newalc));
2578           if (newstrings == NULL)
2579             {
2580               ldinfo->failed = true;
2581               bfd_set_error (bfd_error_no_memory);
2582               return false;
2583             }
2584           ldinfo->string_alc = newalc;
2585           ldinfo->strings = newstrings;
2586         }
2587
2588       bfd_put_16 (ldinfo->output_bfd, len + 1,
2589                   ldinfo->strings + ldinfo->string_size);
2590       strcpy (ldinfo->strings + ldinfo->string_size + 2, h->root.root.string);
2591       h->ldsym->_l._l_l._l_zeroes = 0;
2592       h->ldsym->_l._l_l._l_offset = ldinfo->string_size + 2;
2593       ldinfo->string_size += len + 3;
2594     }
2595
2596   h->flags |= XCOFF_BUILT_LDSYM;
2597
2598   return true;
2599 }
2600 \f
2601 /* Do the final link step.  */
2602
2603 boolean
2604 _bfd_xcoff_bfd_final_link (abfd, info)
2605      bfd *abfd;
2606      struct bfd_link_info *info;
2607 {
2608   bfd_size_type symesz;
2609   struct xcoff_final_link_info finfo;
2610   asection *o;
2611   struct bfd_link_order *p;
2612   size_t max_contents_size;
2613   size_t max_sym_count;
2614   size_t max_lineno_count;
2615   size_t max_reloc_count;
2616   size_t max_output_reloc_count;
2617   file_ptr rel_filepos;
2618   unsigned int relsz;
2619   file_ptr line_filepos;
2620   unsigned int linesz;
2621   bfd *sub;
2622   bfd_byte *external_relocs = NULL;
2623   char strbuf[STRING_SIZE_SIZE];
2624
2625   symesz = bfd_coff_symesz (abfd);
2626
2627   finfo.info = info;
2628   finfo.output_bfd = abfd;
2629   finfo.strtab = NULL;
2630   finfo.section_info = NULL;
2631   finfo.last_file_index = -1;
2632   finfo.toc_symindx = -1;
2633   finfo.internal_syms = NULL;
2634   finfo.sym_indices = NULL;
2635   finfo.outsyms = NULL;
2636   finfo.linenos = NULL;
2637   finfo.contents = NULL;
2638   finfo.external_relocs = NULL;
2639
2640   finfo.ldsym = ((struct external_ldsym *)
2641                  (xcoff_hash_table (info)->loader_section->contents
2642                   + LDHDRSZ));
2643   finfo.ldrel = ((struct external_ldrel *)
2644                  (xcoff_hash_table (info)->loader_section->contents
2645                   + LDHDRSZ
2646                   + xcoff_hash_table (info)->ldhdr.l_nsyms * LDSYMSZ));
2647
2648   xcoff_data (abfd)->coff.link_info = info;
2649
2650   finfo.strtab = _bfd_stringtab_init ();
2651   if (finfo.strtab == NULL)
2652     goto error_return;
2653
2654   /* Compute the file positions for all the sections.  */
2655   if (abfd->output_has_begun)
2656     {
2657       if (xcoff_hash_table (info)->file_align != 0)
2658         abort ();
2659     }
2660   else
2661     {
2662       bfd_vma file_align;
2663
2664       file_align = xcoff_hash_table (info)->file_align;
2665       if (file_align != 0)
2666         {
2667           boolean saw_contents;
2668           int indx;
2669           asection **op;
2670           file_ptr sofar;
2671
2672           /* Insert .pad sections before every section which has
2673              contents and is loaded, if it is preceded by some other
2674              section which has contents and is loaded.  */
2675           saw_contents = true;
2676           for (op = &abfd->sections; *op != NULL; op = &(*op)->next)
2677             {
2678               (*op)->target_index = indx;
2679               if (strcmp ((*op)->name, ".pad") == 0)
2680                 saw_contents = false;
2681               else if (((*op)->flags & SEC_HAS_CONTENTS) != 0
2682                        && ((*op)->flags & SEC_LOAD) != 0)
2683                 {
2684                   if (! saw_contents)
2685                     saw_contents = true;
2686                   else
2687                     {
2688                       asection *n, *hold;
2689
2690                       hold = *op;
2691                       *op = NULL;
2692                       n = bfd_make_section_anyway (abfd, ".pad");
2693                       BFD_ASSERT (*op == n);
2694                       n->next = hold;
2695                       n->flags = SEC_HAS_CONTENTS;
2696                       n->alignment_power = 0;
2697                       saw_contents = false;
2698                     }
2699                 }
2700             }
2701
2702           /* Reset the section indices after inserting the new
2703              sections.  */
2704           indx = 0;
2705           for (o = abfd->sections; o != NULL; o = o->next)
2706             {
2707               ++indx;
2708               o->target_index = indx;
2709             }
2710           BFD_ASSERT ((unsigned int) indx == abfd->section_count);
2711
2712           /* Work out appropriate sizes for the .pad sections to force
2713              each section to land on a page boundary.  This bit of
2714              code knows what compute_section_file_positions is going
2715              to do.  */
2716           sofar = bfd_coff_filhsz (abfd);
2717           if ((abfd->flags & EXEC_P) != 0)
2718             sofar += bfd_coff_aoutsz (abfd);
2719           else
2720             {
2721               /* FIXME.  */
2722               sofar += 28;
2723             }
2724           sofar += abfd->section_count * bfd_coff_scnhsz (abfd);
2725
2726           for (o = abfd->sections; o != NULL; o = o->next)
2727             {
2728               if (strcmp (o->name, ".pad") == 0)
2729                 {
2730                   bfd_vma pageoff;
2731
2732                   BFD_ASSERT (o->_raw_size == 0);
2733                   pageoff = sofar & (file_align - 1);
2734                   if (pageoff != 0)
2735                     {
2736                       o->_raw_size = file_align - pageoff;
2737                       sofar += file_align - pageoff;
2738                       o->flags |= SEC_HAS_CONTENTS;
2739                     }
2740                 }
2741               else
2742                 {
2743                   if ((o->flags & SEC_HAS_CONTENTS) != 0)
2744                     sofar += BFD_ALIGN (o->_raw_size,
2745                                         1 << o->alignment_power);
2746                 }
2747             }
2748         }
2749
2750       bfd_coff_compute_section_file_positions (abfd);
2751     }
2752
2753   /* Count the line numbers and relocation entries required for the
2754      output file.  Set the file positions for the relocs.  */
2755   rel_filepos = obj_relocbase (abfd);
2756   relsz = bfd_coff_relsz (abfd);
2757   max_contents_size = 0;
2758   max_lineno_count = 0;
2759   max_reloc_count = 0;
2760   for (o = abfd->sections; o != NULL; o = o->next)
2761     {
2762       o->reloc_count = 0;
2763       o->lineno_count = 0;
2764       for (p = o->link_order_head; p != NULL; p = p->next)
2765         {
2766           if (p->type == bfd_indirect_link_order)
2767             {
2768               asection *sec;
2769
2770               sec = p->u.indirect.section;
2771
2772               if (info->strip == strip_none
2773                   || info->strip == strip_some)
2774                 o->lineno_count += sec->lineno_count;
2775
2776               o->reloc_count += sec->reloc_count;
2777
2778               if (sec->_raw_size > max_contents_size)
2779                 max_contents_size = sec->_raw_size;
2780               if (sec->lineno_count > max_lineno_count)
2781                 max_lineno_count = sec->lineno_count;
2782               if (sec->reloc_count > max_reloc_count)
2783                 max_reloc_count = sec->reloc_count;
2784             }
2785           else if (p->type == bfd_section_reloc_link_order
2786                    || p->type == bfd_symbol_reloc_link_order)
2787             ++o->reloc_count;
2788         }
2789       if (o->reloc_count == 0)
2790         o->rel_filepos = 0;
2791       else
2792         {
2793           o->flags |= SEC_RELOC;
2794           o->rel_filepos = rel_filepos;
2795           rel_filepos += o->reloc_count * relsz;
2796         }
2797     }
2798
2799   /* Allocate space for the pointers we need to keep for the relocs.  */
2800   {
2801     unsigned int i;
2802
2803     /* We use section_count + 1, rather than section_count, because
2804        the target_index fields are 1 based.  */
2805     finfo.section_info = ((struct xcoff_link_section_info *)
2806                           malloc ((abfd->section_count + 1)
2807                                   * sizeof (struct xcoff_link_section_info)));
2808     if (finfo.section_info == NULL)
2809       {
2810         bfd_set_error (bfd_error_no_memory);
2811         goto error_return;
2812       }
2813     for (i = 0; i <= abfd->section_count; i++)
2814       {
2815         finfo.section_info[i].relocs = NULL;
2816         finfo.section_info[i].rel_hashes = NULL;
2817       }
2818   }
2819
2820   /* We now know the size of the relocs, so we can determine the file
2821      positions of the line numbers.  */
2822   line_filepos = rel_filepos;
2823   linesz = bfd_coff_linesz (abfd);
2824   max_output_reloc_count = 0;
2825   for (o = abfd->sections; o != NULL; o = o->next)
2826     {
2827       if (o->lineno_count == 0)
2828         o->line_filepos = 0;
2829       else
2830         {
2831           o->line_filepos = line_filepos;
2832           line_filepos += o->lineno_count * linesz;
2833         }
2834
2835       if (o->reloc_count != 0)
2836         {
2837           /* We don't know the indices of global symbols until we have
2838              written out all the local symbols.  For each section in
2839              the output file, we keep an array of pointers to hash
2840              table entries.  Each entry in the array corresponds to a
2841              reloc.  When we find a reloc against a global symbol, we
2842              set the corresponding entry in this array so that we can
2843              fix up the symbol index after we have written out all the
2844              local symbols.
2845
2846              Because of this problem, we also keep the relocs in
2847              memory until the end of the link.  This wastes memory.
2848              We could backpatch the file later, I suppose, although it
2849              would be slow.  */
2850           finfo.section_info[o->target_index].relocs =
2851             ((struct internal_reloc *)
2852              malloc (o->reloc_count * sizeof (struct internal_reloc)));
2853           finfo.section_info[o->target_index].rel_hashes =
2854             ((struct xcoff_link_hash_entry **)
2855              malloc (o->reloc_count
2856                      * sizeof (struct xcoff_link_hash_entry *)));
2857           if (finfo.section_info[o->target_index].relocs == NULL
2858               || finfo.section_info[o->target_index].rel_hashes == NULL)
2859             {
2860               bfd_set_error (bfd_error_no_memory);
2861               goto error_return;
2862             }
2863
2864           if (o->reloc_count > max_output_reloc_count)
2865             max_output_reloc_count = o->reloc_count;
2866         }
2867
2868       /* Reset the reloc and lineno counts, so that we can use them to
2869          count the number of entries we have output so far.  */
2870       o->reloc_count = 0;
2871       o->lineno_count = 0;
2872     }
2873
2874   obj_sym_filepos (abfd) = line_filepos;
2875
2876   /* Figure out the largest number of symbols in an input BFD.  Take
2877      the opportunity to clear the output_has_begun fields of all the
2878      input BFD's.  We want at least 4 symbols, since that is the
2879      number which xcoff_write_global_symbol may need.  */
2880   max_sym_count = 4;
2881   for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
2882     {
2883       size_t sz;
2884
2885       sub->output_has_begun = false;
2886       sz = obj_raw_syment_count (sub);
2887       if (sz > max_sym_count)
2888         max_sym_count = sz;
2889     }
2890
2891   /* Allocate some buffers used while linking.  */
2892   finfo.internal_syms = ((struct internal_syment *)
2893                          malloc (max_sym_count
2894                                  * sizeof (struct internal_syment)));
2895   finfo.sym_indices = (long *) malloc (max_sym_count * sizeof (long));
2896   finfo.outsyms = ((bfd_byte *)
2897                    malloc ((size_t) ((max_sym_count + 1) * symesz)));
2898   finfo.linenos = (bfd_byte *) malloc (max_lineno_count
2899                                        * bfd_coff_linesz (abfd));
2900   finfo.contents = (bfd_byte *) malloc (max_contents_size);
2901   finfo.external_relocs = (bfd_byte *) malloc (max_reloc_count * relsz);
2902   if ((finfo.internal_syms == NULL && max_sym_count > 0)
2903       || (finfo.sym_indices == NULL && max_sym_count > 0)
2904       || finfo.outsyms == NULL
2905       || (finfo.linenos == NULL && max_lineno_count > 0)
2906       || (finfo.contents == NULL && max_contents_size > 0)
2907       || (finfo.external_relocs == NULL && max_reloc_count > 0))
2908     {
2909       bfd_set_error (bfd_error_no_memory);
2910       goto error_return;
2911     }
2912
2913   obj_raw_syment_count (abfd) = 0;
2914   xcoff_data (abfd)->toc = (bfd_vma) -1;
2915
2916   /* We now know the position of everything in the file, except that
2917      we don't know the size of the symbol table and therefore we don't
2918      know where the string table starts.  We just build the string
2919      table in memory as we go along.  We process all the relocations
2920      for a single input file at once.  */
2921   for (o = abfd->sections; o != NULL; o = o->next)
2922     {
2923       for (p = o->link_order_head; p != NULL; p = p->next)
2924         {
2925           if (p->type == bfd_indirect_link_order
2926               && p->u.indirect.section->owner->xvec == abfd->xvec)
2927             {
2928               sub = p->u.indirect.section->owner;
2929               if (! sub->output_has_begun)
2930                 {
2931                   if (! xcoff_link_input_bfd (&finfo, sub))
2932                     goto error_return;
2933                   sub->output_has_begun = true;
2934                 }
2935             }
2936           else if (p->type == bfd_section_reloc_link_order
2937                    || p->type == bfd_symbol_reloc_link_order)
2938             {
2939               if (! xcoff_reloc_link_order (abfd, &finfo, o, p))
2940                 goto error_return;
2941             }
2942           else
2943             {
2944               if (! _bfd_default_link_order (abfd, info, o, p))
2945                 goto error_return;
2946             }
2947         }
2948     }
2949
2950   /* Free up the buffers used by xcoff_link_input_bfd.  */
2951
2952   if (finfo.internal_syms != NULL)
2953     {
2954       free (finfo.internal_syms);
2955       finfo.internal_syms = NULL;
2956     }
2957   if (finfo.sym_indices != NULL)
2958     {
2959       free (finfo.sym_indices);
2960       finfo.sym_indices = NULL;
2961     }
2962   if (finfo.linenos != NULL)
2963     {
2964       free (finfo.linenos);
2965       finfo.linenos = NULL;
2966     }
2967   if (finfo.contents != NULL)
2968     {
2969       free (finfo.contents);
2970       finfo.contents = NULL;
2971     }
2972   if (finfo.external_relocs != NULL)
2973     {
2974       free (finfo.external_relocs);
2975       finfo.external_relocs = NULL;
2976     }
2977
2978   /* The value of the last C_FILE symbol is supposed to be -1.  Write
2979      it out again.  */
2980   if (finfo.last_file_index != -1)
2981     {
2982       finfo.last_file.n_value = -1;
2983       bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file,
2984                              (PTR) finfo.outsyms);
2985       if (bfd_seek (abfd,
2986                     (obj_sym_filepos (abfd)
2987                      + finfo.last_file_index * symesz),
2988                     SEEK_SET) != 0
2989           || bfd_write (finfo.outsyms, symesz, 1, abfd) != symesz)
2990         goto error_return;
2991     }
2992
2993   /* Write out all the global symbols which do not come from XCOFF
2994      input files.  */
2995   xcoff_link_hash_traverse (xcoff_hash_table (info),
2996                             xcoff_write_global_symbol,
2997                             (PTR) &finfo);
2998
2999   if (finfo.outsyms != NULL)
3000     {
3001       free (finfo.outsyms);
3002       finfo.outsyms = NULL;
3003     }
3004
3005   /* Now that we have written out all the global symbols, we know the
3006      symbol indices to use for relocs against them, and we can finally
3007      write out the relocs.  */
3008   external_relocs = (bfd_byte *) malloc (max_output_reloc_count * relsz);
3009   if (external_relocs == NULL && max_output_reloc_count != 0)
3010     {
3011       bfd_set_error (bfd_error_no_memory);
3012       goto error_return;
3013     }
3014
3015   for (o = abfd->sections; o != NULL; o = o->next)
3016     {
3017       struct internal_reloc *irel;
3018       struct internal_reloc *irelend;
3019       struct xcoff_link_hash_entry **rel_hash;
3020       bfd_byte *erel;
3021
3022       if (o->reloc_count == 0)
3023         continue;
3024
3025       irel = finfo.section_info[o->target_index].relocs;
3026       irelend = irel + o->reloc_count;
3027       rel_hash = finfo.section_info[o->target_index].rel_hashes;
3028       for (; irel < irelend; irel++, rel_hash++, erel += relsz)
3029         {
3030           if (*rel_hash != NULL)
3031             {
3032               if ((*rel_hash)->indx < 0)
3033                 {
3034                   if (! ((*info->callbacks->unattached_reloc)
3035                          (info, (*rel_hash)->root.root.string,
3036                           (bfd *) NULL, o, irel->r_vaddr)))
3037                     goto error_return;
3038                   (*rel_hash)->indx = 0;
3039                 }
3040               irel->r_symndx = (*rel_hash)->indx;
3041             }
3042         }
3043
3044       /* XCOFF requires that the relocs be sorted by address.  We tend
3045          to produce them in the order in which their containing csects
3046          appear in the symbol table, which is not necessarily by
3047          address.  So we sort them here.  There may be a better way to
3048          do this.  */
3049       qsort ((PTR) finfo.section_info[o->target_index].relocs,
3050              o->reloc_count, sizeof (struct internal_reloc),
3051              xcoff_sort_relocs);
3052
3053       irel = finfo.section_info[o->target_index].relocs;
3054       irelend = irel + o->reloc_count;
3055       erel = external_relocs;
3056       for (; irel < irelend; irel++, rel_hash++, erel += relsz)
3057         bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel);
3058
3059       if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
3060           || bfd_write ((PTR) external_relocs, relsz, o->reloc_count,
3061                         abfd) != relsz * o->reloc_count)
3062         goto error_return;
3063     }
3064
3065   if (external_relocs != NULL)
3066     {
3067       free (external_relocs);
3068       external_relocs = NULL;
3069     }
3070
3071   /* Free up the section information.  */
3072   if (finfo.section_info != NULL)
3073     {
3074       unsigned int i;
3075
3076       for (i = 0; i < abfd->section_count; i++)
3077         {
3078           if (finfo.section_info[i].relocs != NULL)
3079             free (finfo.section_info[i].relocs);
3080           if (finfo.section_info[i].rel_hashes != NULL)
3081             free (finfo.section_info[i].rel_hashes);
3082         }
3083       free (finfo.section_info);
3084       finfo.section_info = NULL;
3085     }
3086
3087   /* Write out the loader section contents.  */
3088   BFD_ASSERT ((bfd_byte *) finfo.ldrel
3089               == (xcoff_hash_table (info)->loader_section->contents
3090                   + xcoff_hash_table (info)->ldhdr.l_impoff));
3091   o = xcoff_hash_table (info)->loader_section;
3092   if (! bfd_set_section_contents (abfd, o->output_section,
3093                                   o->contents, o->output_offset,
3094                                   o->_raw_size))
3095     goto error_return;
3096
3097   /* Write out the global linkage section and the toc section.  */
3098   o = xcoff_hash_table (info)->linkage_section;
3099   if (o->_raw_size > 0
3100       && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
3101                                      o->output_offset, o->_raw_size))
3102     goto error_return;
3103   o = xcoff_hash_table (info)->toc_section;
3104   if (o->_raw_size > 0
3105       && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
3106                                      o->output_offset, o->_raw_size))
3107     goto error_return;
3108
3109   /* Write out the string table.  */
3110   if (bfd_seek (abfd,
3111                 (obj_sym_filepos (abfd)
3112                  + obj_raw_syment_count (abfd) * symesz),
3113                 SEEK_SET) != 0)
3114     goto error_return;
3115   bfd_h_put_32 (abfd,
3116                 _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE,
3117                 (bfd_byte *) strbuf);
3118   if (bfd_write (strbuf, 1, STRING_SIZE_SIZE, abfd) != STRING_SIZE_SIZE)
3119     goto error_return;
3120   if (! _bfd_stringtab_emit (abfd, finfo.strtab))
3121     goto error_return;
3122
3123   _bfd_stringtab_free (finfo.strtab);
3124
3125   /* Write out the debugging string table.  */
3126   o = xcoff_hash_table (info)->debug_section;
3127   if (o != NULL)
3128     {
3129       struct bfd_strtab_hash *debug_strtab;
3130
3131       debug_strtab = xcoff_hash_table (info)->debug_strtab;
3132       BFD_ASSERT (o->output_section->_raw_size - o->output_offset
3133                   >= _bfd_stringtab_size (debug_strtab));
3134       if (bfd_seek (abfd,
3135                     o->output_section->filepos + o->output_offset,
3136                     SEEK_SET) != 0)
3137         goto error_return;
3138       if (! _bfd_stringtab_emit (abfd, debug_strtab))
3139         goto error_return;
3140     }
3141
3142   /* Setting bfd_get_symcount to 0 will cause write_object_contents to
3143      not try to write out the symbols.  */
3144   bfd_get_symcount (abfd) = 0;
3145
3146   return true;
3147
3148  error_return:
3149   if (finfo.strtab != NULL)
3150     _bfd_stringtab_free (finfo.strtab);
3151   if (finfo.section_info != NULL)
3152     {
3153       unsigned int i;
3154
3155       for (i = 0; i < abfd->section_count; i++)
3156         {
3157           if (finfo.section_info[i].relocs != NULL)
3158             free (finfo.section_info[i].relocs);
3159           if (finfo.section_info[i].rel_hashes != NULL)
3160             free (finfo.section_info[i].rel_hashes);
3161         }
3162       free (finfo.section_info);
3163     }
3164   if (finfo.internal_syms != NULL)
3165     free (finfo.internal_syms);
3166   if (finfo.sym_indices != NULL)
3167     free (finfo.sym_indices);
3168   if (finfo.outsyms != NULL)
3169     free (finfo.outsyms);
3170   if (finfo.linenos != NULL)
3171     free (finfo.linenos);
3172   if (finfo.contents != NULL)
3173     free (finfo.contents);
3174   if (finfo.external_relocs != NULL)
3175     free (finfo.external_relocs);
3176   if (external_relocs != NULL)
3177     free (external_relocs);
3178   return false;
3179 }
3180
3181 /* Link an input file into the linker output file.  This function
3182    handles all the sections and relocations of the input file at once.  */
3183
3184 static boolean
3185 xcoff_link_input_bfd (finfo, input_bfd)
3186      struct xcoff_final_link_info *finfo;
3187      bfd *input_bfd;
3188 {
3189   bfd *output_bfd;
3190   const char *strings;
3191   bfd_size_type syment_base;
3192   unsigned int n_tmask;
3193   unsigned int n_btshft;
3194   boolean copy, hash;
3195   bfd_size_type isymesz;
3196   bfd_size_type osymesz;
3197   bfd_size_type linesz;
3198   bfd_byte *esym;
3199   bfd_byte *esym_end;
3200   struct internal_syment *isymp;
3201   asection **csectpp;
3202   unsigned long *debug_index;
3203   long *indexp;
3204   unsigned long output_index;
3205   bfd_byte *outsym;
3206   struct xcoff_link_hash_entry **sym_hash;
3207   boolean keep_syms;
3208   asection *o;
3209
3210   /* We can just skip DYNAMIC files, unless this is a static link.  */
3211   if ((input_bfd->flags & DYNAMIC) != 0
3212       && ! finfo->info->static_link)
3213     return true;
3214
3215   /* Move all the symbols to the output file.  */
3216
3217   output_bfd = finfo->output_bfd;
3218   strings = NULL;
3219   syment_base = obj_raw_syment_count (output_bfd);
3220   isymesz = bfd_coff_symesz (input_bfd);
3221   osymesz = bfd_coff_symesz (output_bfd);
3222   linesz = bfd_coff_linesz (input_bfd);
3223   BFD_ASSERT (linesz == bfd_coff_linesz (output_bfd));
3224
3225   n_tmask = coff_data (input_bfd)->local_n_tmask;
3226   n_btshft = coff_data (input_bfd)->local_n_btshft;
3227
3228   /* Define macros so that ISFCN, et. al., macros work correctly.  */
3229 #define N_TMASK n_tmask
3230 #define N_BTSHFT n_btshft
3231
3232   copy = false;
3233   if (! finfo->info->keep_memory)
3234     copy = true;
3235   hash = true;
3236   if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
3237     hash = false;
3238
3239   if (! _bfd_coff_get_external_symbols (input_bfd))
3240     return false;
3241
3242   esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
3243   esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
3244   sym_hash = obj_xcoff_sym_hashes (input_bfd);
3245   csectpp = xcoff_data (input_bfd)->csects;
3246   debug_index = xcoff_data (input_bfd)->debug_indices;
3247   isymp = finfo->internal_syms;
3248   indexp = finfo->sym_indices;
3249   output_index = syment_base;
3250   outsym = finfo->outsyms;
3251
3252   while (esym < esym_end)
3253     {
3254       struct internal_syment isym;
3255       union internal_auxent aux;
3256       int smtyp = 0;
3257       boolean skip;
3258       boolean require;
3259       int add;
3260
3261       bfd_coff_swap_sym_in (input_bfd, (PTR) esym, (PTR) isymp);
3262
3263       /* If this is a C_EXT or C_HIDEXT symbol, we need the csect
3264          information.  */
3265       if (isymp->n_sclass == C_EXT || isymp->n_sclass == C_HIDEXT)
3266         {
3267           BFD_ASSERT (isymp->n_numaux > 0);
3268           bfd_coff_swap_aux_in (input_bfd,
3269                                 (PTR) (esym + isymesz * isymp->n_numaux),
3270                                 isymp->n_type, isymp->n_sclass,
3271                                 isymp->n_numaux - 1, isymp->n_numaux,
3272                                 (PTR) &aux);
3273           smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp);
3274         }
3275
3276       /* Make a copy of *isymp so that the relocate_section function
3277          always sees the original values.  This is more reliable than
3278          always recomputing the symbol value even if we are stripping
3279          the symbol.  */
3280       isym = *isymp;
3281
3282       /* If this symbol is in the .loader section, swap out the
3283          .loader symbol information.  If this is an external symbol
3284          reference to a defined symbol, though, then wait until we get
3285          to the definition.  */
3286       if (isym.n_sclass == C_EXT
3287           && *sym_hash != NULL
3288           && (*sym_hash)->ldsym != NULL
3289           && (smtyp != XTY_ER
3290               || (*sym_hash)->root.type == bfd_link_hash_undefined))
3291         {
3292           struct xcoff_link_hash_entry *h;
3293           struct internal_ldsym *ldsym;
3294
3295           h = *sym_hash;
3296           ldsym = h->ldsym;
3297           if (isym.n_scnum > 0)
3298             {
3299               ldsym->l_scnum = (*csectpp)->output_section->target_index;
3300               ldsym->l_value = (isym.n_value
3301                                 + (*csectpp)->output_section->vma
3302                                 + (*csectpp)->output_offset
3303                                 - (*csectpp)->vma);
3304             }
3305           else
3306             {
3307               ldsym->l_scnum = isym.n_scnum;
3308               ldsym->l_value = isym.n_value;
3309             }
3310
3311           ldsym->l_smtype = smtyp;
3312           if (((h->flags & XCOFF_DEF_REGULAR) == 0
3313                && (h->flags & XCOFF_REF_DYNAMIC) != 0)
3314               || (h->flags & XCOFF_IMPORT) != 0)
3315             ldsym->l_smtype |= L_IMPORT;
3316           if (((h->flags & XCOFF_DEF_REGULAR) != 0
3317                && (h->flags & XCOFF_REF_DYNAMIC) != 0)
3318               || (h->flags & XCOFF_EXPORT) != 0)
3319             ldsym->l_smtype |= L_EXPORT;
3320           if ((h->flags & XCOFF_ENTRY) != 0)
3321             ldsym->l_smtype |= L_ENTRY;
3322
3323           ldsym->l_smclas = aux.x_csect.x_smclas;
3324
3325           if (ldsym->l_ifile == (bfd_size_type) -1)
3326             ldsym->l_ifile = 0;
3327           else if (ldsym->l_ifile == 0)
3328             {
3329               if ((ldsym->l_smtype & L_IMPORT) == 0)
3330                 ldsym->l_ifile = 0;
3331               else
3332                 {
3333                   bfd *impbfd;
3334
3335                   if (h->root.type == bfd_link_hash_defined
3336                       || h->root.type == bfd_link_hash_defweak)
3337                     impbfd = h->root.u.def.section->owner;
3338                   else if (h->root.type == bfd_link_hash_undefined
3339                            || h->root.type == bfd_link_hash_undefweak)
3340                     impbfd = h->root.u.undef.abfd;
3341                   else
3342                     impbfd = NULL;
3343
3344                   if (impbfd == NULL)
3345                     ldsym->l_ifile = 0;
3346                   else
3347                     {
3348                       BFD_ASSERT (impbfd->xvec == finfo->output_bfd->xvec);
3349                       ldsym->l_ifile = xcoff_data (impbfd)->import_file_id;
3350                     }
3351                 }
3352             }
3353
3354           ldsym->l_parm = 0;
3355
3356           BFD_ASSERT (h->ldindx >= 0);
3357           BFD_ASSERT (LDSYMSZ == sizeof (struct external_ldsym));
3358           xcoff_swap_ldsym_out (finfo->output_bfd, ldsym,
3359                                 finfo->ldsym + h->ldindx - 3);
3360           h->ldsym = NULL;
3361         }
3362
3363       *indexp = -1;
3364
3365       skip = false;
3366       require = false;
3367       add = 1 + isym.n_numaux;
3368
3369       /* If we are skipping this csect, we want to skip this symbol.  */
3370       if (*csectpp == NULL)
3371         skip = true;
3372
3373       /* If we garbage collected this csect, we want to skip this
3374          symbol.  */
3375       if (! skip
3376           && xcoff_hash_table (finfo->info)->gc
3377           && ((*csectpp)->flags & SEC_MARK) == 0
3378           && *csectpp != bfd_abs_section_ptr)
3379         skip = true;
3380
3381       /* An XCOFF linker always skips C_STAT symbols.  */
3382       if (! skip
3383           && isymp->n_sclass == C_STAT)
3384         skip = true;
3385
3386       /* We skip all but the first TOC anchor.  */
3387       if (! skip
3388           && isymp->n_sclass == C_HIDEXT
3389           && aux.x_csect.x_smclas == XMC_TC0)
3390         {
3391           if (finfo->toc_symindx != -1)
3392             skip = true;
3393           else
3394             {
3395               finfo->toc_symindx = output_index;
3396               xcoff_data (finfo->output_bfd)->toc =
3397                 ((*csectpp)->output_section->vma
3398                  + (*csectpp)->output_offset
3399                  + isym.n_value
3400                  - (*csectpp)->vma);
3401               require = true;
3402             }
3403         }
3404
3405       /* If we are stripping all symbols, we want to skip this one.  */
3406       if (! skip
3407           && finfo->info->strip == strip_all)
3408         skip = true;
3409
3410       /* We can skip resolved external references.  */
3411       if (! skip
3412           && isym.n_sclass == C_EXT
3413           && smtyp == XTY_ER
3414           && (*sym_hash)->root.type != bfd_link_hash_undefined)
3415         skip = true;
3416
3417       /* We can skip common symbols if they got defined somewhere
3418          else.  */
3419       if (! skip
3420           && isym.n_sclass == C_EXT
3421           && smtyp == XTY_CM
3422           && ((*sym_hash)->flags & XCOFF_DEF_REGULAR) != 0)
3423         skip = true;
3424
3425       /* Skip local symbols if we are discarding them.  */
3426       if (! skip
3427           && finfo->info->discard == discard_all
3428           && isym.n_sclass != C_EXT
3429           && (isym.n_sclass != C_HIDEXT
3430               || smtyp != XTY_SD))
3431         skip = true;
3432
3433       /* If we stripping debugging symbols, and this is a debugging
3434          symbol, then skip it.  */
3435       if (! skip
3436           && finfo->info->strip == strip_debugger
3437           && isym.n_scnum == N_DEBUG)
3438         skip = true;
3439
3440       /* If some symbols are stripped based on the name, work out the
3441          name and decide whether to skip this symbol.  We don't handle
3442          this correctly for symbols whose names are in the .debug
3443          section; to get it right we would need a new bfd_strtab_hash
3444          function to return the string given the index.  */
3445       if (! skip
3446           && (finfo->info->strip == strip_some
3447               || finfo->info->discard == discard_l)
3448           && (debug_index == NULL || *debug_index == (unsigned long) -1))
3449         {
3450           const char *name;
3451           char buf[SYMNMLEN + 1];
3452
3453           name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
3454           if (name == NULL)
3455             return false;
3456
3457           if ((finfo->info->strip == strip_some
3458                && (bfd_hash_lookup (finfo->info->keep_hash, name, false,
3459                                     false) == NULL))
3460               || (finfo->info->discard == discard_l
3461                   && (isym.n_sclass != C_EXT
3462                       && (isym.n_sclass != C_HIDEXT
3463                           || smtyp != XTY_SD))
3464                   && strncmp (name, finfo->info->lprefix,
3465                               finfo->info->lprefix_len) == 0))
3466             skip = true;
3467         }
3468
3469       /* On the other hand, we can't skip global symbols which have
3470          relocs against them.  */
3471       if (skip
3472           && isym.n_sclass == C_EXT
3473           && (*sym_hash)->indx == -2
3474           && finfo->info->strip != strip_all)
3475         skip = false;
3476
3477       /* We can not skip the first TOC anchor.  */
3478       if (skip
3479           && require
3480           && finfo->info->strip != strip_all)
3481         skip = false;
3482
3483       /* We now know whether we are to skip this symbol or not.  */
3484       if (! skip)
3485         {
3486           /* Adjust the symbol in order to output it.  */
3487
3488           if (isym._n._n_n._n_zeroes == 0
3489               && isym._n._n_n._n_offset != 0)
3490             {
3491               /* This symbol has a long name.  Enter it in the string
3492                  table we are building.  If *debug_index != -1, the
3493                  name has already been entered in the .debug section.  */
3494               if (debug_index != NULL && *debug_index != (unsigned long) -1)
3495                 isym._n._n_n._n_offset = *debug_index;
3496               else
3497                 {
3498                   const char *name;
3499                   bfd_size_type indx;
3500
3501                   name = _bfd_coff_internal_syment_name (input_bfd, &isym,
3502                                                          (char *) NULL);
3503                   if (name == NULL)
3504                     return false;
3505                   indx = _bfd_stringtab_add (finfo->strtab, name, hash, copy);
3506                   if (indx == (bfd_size_type) -1)
3507                     return false;
3508                   isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
3509                 }
3510             }
3511
3512           if (isym.n_sclass == C_BSTAT)
3513             {
3514               unsigned long indx;
3515
3516               /* The value of a C_BSTAT symbol is the symbol table
3517                  index of the containing csect.  */
3518
3519               indx = isym.n_value;
3520               if (indx < obj_raw_syment_count (input_bfd))
3521                 {
3522                   long symindx;
3523
3524                   symindx = finfo->sym_indices[indx];
3525                   if (symindx < 0)
3526                     isym.n_value = 0;
3527                   else
3528                     isym.n_value = symindx;
3529                 }
3530             }
3531           else if (isym.n_scnum > 0)
3532             {
3533               isym.n_scnum = (*csectpp)->output_section->target_index;
3534               isym.n_value += ((*csectpp)->output_section->vma
3535                                + (*csectpp)->output_offset
3536                                - (*csectpp)->vma);
3537             }
3538
3539           /* The value of a C_FILE symbol is the symbol index of the
3540              next C_FILE symbol.  The value of the last C_FILE symbol
3541              is -1.  We try to get this right, below, just before we
3542              write the symbols out, but in the general case we may
3543              have to write the symbol out twice.  */
3544           if (isym.n_sclass == C_FILE)
3545             {
3546               if (finfo->last_file_index != -1
3547                   && finfo->last_file.n_value != (long) output_index)
3548                 {
3549                   /* We must correct the value of the last C_FILE entry.  */
3550                   finfo->last_file.n_value = output_index;
3551                   if ((bfd_size_type) finfo->last_file_index >= syment_base)
3552                     {
3553                       /* The last C_FILE symbol is in this input file.  */
3554                       bfd_coff_swap_sym_out (output_bfd,
3555                                              (PTR) &finfo->last_file,
3556                                              (PTR) (finfo->outsyms
3557                                                     + ((finfo->last_file_index
3558                                                         - syment_base)
3559                                                        * osymesz)));
3560                     }
3561                   else
3562                     {
3563                       /* We have already written out the last C_FILE
3564                          symbol.  We need to write it out again.  We
3565                          borrow *outsym temporarily.  */
3566                       bfd_coff_swap_sym_out (output_bfd,
3567                                              (PTR) &finfo->last_file,
3568                                              (PTR) outsym);
3569                       if (bfd_seek (output_bfd,
3570                                     (obj_sym_filepos (output_bfd)
3571                                      + finfo->last_file_index * osymesz),
3572                                     SEEK_SET) != 0
3573                           || (bfd_write (outsym, osymesz, 1, output_bfd)
3574                               != osymesz))
3575                         return false;
3576                     }
3577                 }
3578
3579               finfo->last_file_index = output_index;
3580               finfo->last_file = isym;
3581             }
3582
3583           /* Output the symbol.  */
3584
3585           bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym);
3586
3587           *indexp = output_index;
3588
3589           if (isym.n_sclass == C_EXT)
3590             {
3591               long indx;
3592               struct xcoff_link_hash_entry *h;
3593
3594               indx = ((esym - (bfd_byte *) obj_coff_external_syms (input_bfd))
3595                       / isymesz);
3596               h = obj_xcoff_sym_hashes (input_bfd)[indx];
3597               BFD_ASSERT (h != NULL);
3598               h->indx = output_index;
3599             }
3600
3601           output_index += add;
3602           outsym += add * osymesz;
3603         }
3604
3605       esym += add * isymesz;
3606       isymp += add;
3607       csectpp += add;
3608       sym_hash += add;
3609       if (debug_index != NULL)
3610         debug_index += add;
3611       ++indexp;
3612       for (--add; add > 0; --add)
3613         *indexp++ = -1;
3614     }
3615
3616   /* Fix up the aux entries.  This must be done in a separate pass,
3617      because we don't know the correct symbol indices until we have
3618      already decided which symbols we are going to keep.  */
3619
3620   esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
3621   esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
3622   isymp = finfo->internal_syms;
3623   indexp = finfo->sym_indices;
3624   csectpp = xcoff_data (input_bfd)->csects;
3625   outsym = finfo->outsyms;
3626   while (esym < esym_end)
3627     {
3628       int add;
3629
3630       add = 1 + isymp->n_numaux;
3631
3632       if (*indexp < 0)
3633         esym += add * isymesz;
3634       else
3635         {
3636           int i;
3637
3638           esym += isymesz;
3639           outsym += osymesz;
3640
3641           for (i = 0; i < isymp->n_numaux && esym < esym_end; i++)
3642             {
3643               union internal_auxent aux;
3644
3645               bfd_coff_swap_aux_in (input_bfd, (PTR) esym, isymp->n_type,
3646                                     isymp->n_sclass, i, isymp->n_numaux,
3647                                     (PTR) &aux);
3648
3649               if (isymp->n_sclass == C_FILE)
3650                 {
3651                   /* This is the file name (or some comment put in by
3652                      the compiler).  If it is long, we must put it in
3653                      the string table.  */
3654                   if (aux.x_file.x_n.x_zeroes == 0
3655                       && aux.x_file.x_n.x_offset != 0)
3656                     {
3657                       const char *filename;
3658                       bfd_size_type indx;
3659
3660                       BFD_ASSERT (aux.x_file.x_n.x_offset
3661                                   >= STRING_SIZE_SIZE);
3662                       if (strings == NULL)
3663                         {
3664                           strings = _bfd_coff_read_string_table (input_bfd);
3665                           if (strings == NULL)
3666                             return false;
3667                         }
3668                       filename = strings + aux.x_file.x_n.x_offset;
3669                       indx = _bfd_stringtab_add (finfo->strtab, filename,
3670                                                  hash, copy);
3671                       if (indx == (bfd_size_type) -1)
3672                         return false;
3673                       aux.x_file.x_n.x_offset = STRING_SIZE_SIZE + indx;
3674                     }
3675                 }
3676               else if ((isymp->n_sclass == C_EXT
3677                         || isymp->n_sclass == C_HIDEXT)
3678                        && i + 1 == isymp->n_numaux)
3679                 {
3680                   /* We don't support type checking.  I don't know if
3681                      anybody does.  */
3682                   aux.x_csect.x_parmhash = 0;
3683                   /* I don't think anybody uses these fields, but we'd
3684                      better clobber them just in case.  */
3685                   aux.x_csect.x_stab = 0;
3686                   aux.x_csect.x_snstab = 0;
3687                   if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_LD)
3688                     {
3689                       unsigned long indx;
3690
3691                       indx = aux.x_csect.x_scnlen.l;
3692                       if (indx < obj_raw_syment_count (input_bfd))
3693                         {
3694                           long symindx;
3695
3696                           symindx = finfo->sym_indices[indx];
3697                           if (symindx < 0)
3698                             aux.x_sym.x_tagndx.l = 0;
3699                           else
3700                             aux.x_sym.x_tagndx.l = symindx;
3701                         }
3702                     }
3703                 }
3704               else if (isymp->n_sclass != C_STAT || isymp->n_type != T_NULL)
3705                 {
3706                   unsigned long indx;
3707
3708                   if (ISFCN (isymp->n_type)
3709                       || ISTAG (isymp->n_sclass)
3710                       || isymp->n_sclass == C_BLOCK)
3711                     {
3712                       indx = aux.x_sym.x_fcnary.x_fcn.x_endndx.l;
3713                       if (indx > 0
3714                           && indx < obj_raw_syment_count (input_bfd))
3715                         {
3716                           /* We look forward through the symbol for
3717                              the index of the next symbol we are going
3718                              to include.  I don't know if this is
3719                              entirely right.  */
3720                           while (finfo->sym_indices[indx] < 0
3721                                  && indx < obj_raw_syment_count (input_bfd))
3722                             ++indx;
3723                           if (indx >= obj_raw_syment_count (input_bfd))
3724                             indx = output_index;
3725                           else
3726                             indx = finfo->sym_indices[indx];
3727                           aux.x_sym.x_fcnary.x_fcn.x_endndx.l = indx;
3728                         }
3729                     }
3730
3731                   indx = aux.x_sym.x_tagndx.l;
3732                   if (indx > 0 && indx < obj_raw_syment_count (input_bfd))
3733                     {
3734                       long symindx;
3735
3736                       symindx = finfo->sym_indices[indx];
3737                       if (symindx < 0)
3738                         aux.x_sym.x_tagndx.l = 0;
3739                       else
3740                         aux.x_sym.x_tagndx.l = symindx;
3741                     }
3742                 }
3743
3744               /* Copy over the line numbers, unless we are stripping
3745                  them.  We do this on a symbol by symbol basis in
3746                  order to more easily handle garbage collection.  */
3747               if ((isymp->n_sclass == C_EXT
3748                    || isymp->n_sclass == C_HIDEXT)
3749                   && i == 0
3750                   && isymp->n_numaux > 1
3751                   && ISFCN (isymp->n_type)
3752                   && aux.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0)
3753                 {
3754                   if (finfo->info->strip != strip_none
3755                       && finfo->info->strip != strip_some)
3756                     aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0;
3757                   else
3758                     {
3759                       asection *enclosing;
3760                       bfd_size_type linoff;
3761                       struct internal_lineno lin;
3762
3763                       o = *csectpp;
3764                       enclosing = xcoff_section_data (abfd, o)->enclosing;
3765                       linoff = (aux.x_sym.x_fcnary.x_fcn.x_lnnoptr
3766                                 - enclosing->line_filepos);
3767
3768                       if (bfd_seek (input_bfd,
3769                                     enclosing->line_filepos + linoff,
3770                                     SEEK_SET != 0)
3771                           || (bfd_read (finfo->linenos, linesz,
3772                                         o->lineno_count, input_bfd)
3773                               != linesz * o->lineno_count))
3774                         return false;
3775
3776                       bfd_coff_swap_lineno_in (input_bfd,
3777                                                (PTR) finfo->linenos,
3778                                                (PTR) &lin);
3779                       if (lin.l_lnno != 0
3780                           || ((bfd_size_type) lin.l_addr.l_symndx
3781                               != ((esym
3782                                    - isymesz
3783                                    - ((bfd_byte *)
3784                                       obj_coff_external_syms (input_bfd)))
3785                                   / isymesz)))
3786                         aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0;
3787                       else
3788                         {
3789                           bfd_byte *linpend, *linp;
3790                           bfd_vma offset;
3791                           bfd_size_type count;
3792
3793                           lin.l_addr.l_symndx = *indexp;
3794                           bfd_coff_swap_lineno_out (output_bfd, (PTR) &lin,
3795                                                     (PTR) finfo->linenos);
3796
3797                           linpend = (finfo->linenos
3798                                      + o->lineno_count * linesz);
3799                           offset = (o->output_section->vma
3800                                     + o->output_offset
3801                                     - o->vma);
3802                           for (linp = finfo->linenos + linesz;
3803                                linp < linpend;
3804                                linp += linesz)
3805                             {
3806                               bfd_coff_swap_lineno_in (input_bfd, (PTR) linp,
3807                                                        (PTR) &lin);
3808                               if (lin.l_lnno == 0)
3809                                 break;
3810                               lin.l_addr.l_paddr += offset;
3811                               bfd_coff_swap_lineno_out (output_bfd,
3812                                                         (PTR) &lin,
3813                                                         (PTR) linp);
3814                             }
3815
3816                           count = (linp - finfo->linenos) / linesz;
3817
3818                           aux.x_sym.x_fcnary.x_fcn.x_lnnoptr =
3819                             (o->output_section->line_filepos
3820                              + o->output_section->lineno_count * linesz);
3821
3822                           if (bfd_seek (output_bfd,
3823                                         aux.x_sym.x_fcnary.x_fcn.x_lnnoptr,
3824                                         SEEK_SET) != 0
3825                               || (bfd_write (finfo->linenos, linesz, count,
3826                                              output_bfd)
3827                                   != linesz * count))
3828                             return false;
3829
3830                           o->output_section->lineno_count += count;
3831                         }
3832                     }
3833                 }
3834
3835               bfd_coff_swap_aux_out (output_bfd, (PTR) &aux, isymp->n_type,
3836                                      isymp->n_sclass, i, isymp->n_numaux,
3837                                      (PTR) outsym);
3838               outsym += osymesz;
3839               esym += isymesz;
3840             }
3841         }
3842
3843       indexp += add;
3844       isymp += add;
3845       csectpp += add;
3846     }
3847
3848   /* If we swapped out a C_FILE symbol, guess that the next C_FILE
3849      symbol will be the first symbol in the next input file.  In the
3850      normal case, this will save us from writing out the C_FILE symbol
3851      again.  */
3852   if (finfo->last_file_index != -1
3853       && (bfd_size_type) finfo->last_file_index >= syment_base)
3854     {
3855       finfo->last_file.n_value = output_index;
3856       bfd_coff_swap_sym_out (output_bfd, (PTR) &finfo->last_file,
3857                              (PTR) (finfo->outsyms
3858                                     + ((finfo->last_file_index - syment_base)
3859                                        * osymesz)));
3860     }
3861
3862   /* Write the modified symbols to the output file.  */
3863   if (outsym > finfo->outsyms)
3864     {
3865       if (bfd_seek (output_bfd,
3866                     obj_sym_filepos (output_bfd) + syment_base * osymesz,
3867                     SEEK_SET) != 0
3868           || (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1,
3869                         output_bfd)
3870               != (bfd_size_type) (outsym - finfo->outsyms)))
3871         return false;
3872
3873       BFD_ASSERT ((obj_raw_syment_count (output_bfd)
3874                    + (outsym - finfo->outsyms) / osymesz)
3875                   == output_index);
3876
3877       obj_raw_syment_count (output_bfd) = output_index;
3878     }
3879
3880   /* Don't let the linker relocation routines discard the symbols.  */
3881   keep_syms = obj_coff_keep_syms (input_bfd);
3882   obj_coff_keep_syms (input_bfd) = true;
3883
3884   /* Relocate the contents of each section.  */
3885   for (o = input_bfd->sections; o != NULL; o = o->next)
3886     {
3887       bfd_byte *contents;
3888
3889       if ((o->flags & SEC_HAS_CONTENTS) == 0
3890           || o->_raw_size == 0
3891           || (o->flags & SEC_IN_MEMORY) != 0)
3892         continue;
3893
3894       /* We have set filepos correctly for the sections we created to
3895          represent csects, so bfd_get_section_contents should work.  */
3896       if (coff_section_data (input_bfd, o) != NULL
3897           && coff_section_data (input_bfd, o)->contents != NULL)
3898         contents = coff_section_data (input_bfd, o)->contents;
3899       else
3900         {
3901           if (! bfd_get_section_contents (input_bfd, o, finfo->contents,
3902                                           (file_ptr) 0, o->_raw_size))
3903             return false;
3904           contents = finfo->contents;
3905         }
3906
3907       if ((o->flags & SEC_RELOC) != 0)
3908         {
3909           int target_index;
3910           struct internal_reloc *internal_relocs;
3911           struct internal_reloc *irel;
3912           bfd_vma offset;
3913           struct internal_reloc *irelend;
3914           struct xcoff_link_hash_entry **rel_hash;
3915           long r_symndx;
3916
3917           /* Read in the relocs.  */
3918           target_index = o->output_section->target_index;
3919           internal_relocs = (xcoff_read_internal_relocs
3920                              (input_bfd, o, false, finfo->external_relocs,
3921                               true,
3922                               (finfo->section_info[target_index].relocs
3923                                + o->output_section->reloc_count)));
3924           if (internal_relocs == NULL)
3925             return false;
3926
3927           /* Call processor specific code to relocate the section
3928              contents.  */
3929           if (! bfd_coff_relocate_section (output_bfd, finfo->info,
3930                                            input_bfd, o,
3931                                            contents,
3932                                            internal_relocs,
3933                                            finfo->internal_syms,
3934                                            xcoff_data (input_bfd)->csects))
3935             return false;
3936
3937           offset = o->output_section->vma + o->output_offset - o->vma;
3938           irel = internal_relocs;
3939           irelend = irel + o->reloc_count;
3940           rel_hash = (finfo->section_info[target_index].rel_hashes
3941                       + o->output_section->reloc_count);
3942           for (; irel < irelend; irel++, rel_hash++)
3943             {
3944               struct xcoff_link_hash_entry *h = NULL;
3945               struct internal_ldrel ldrel;
3946
3947               *rel_hash = NULL;
3948
3949               /* Adjust the reloc address and symbol index.  */
3950
3951               irel->r_vaddr += offset;
3952
3953               r_symndx = irel->r_symndx;
3954
3955               if (r_symndx != -1)
3956                 {
3957                   h = obj_xcoff_sym_hashes (input_bfd)[r_symndx];
3958                   if (h != NULL)
3959                     {
3960                       /* This is a global symbol.  */
3961                       if (h->indx >= 0)
3962                         irel->r_symndx = h->indx;
3963                       else
3964                         {
3965                           /* This symbol is being written at the end
3966                              of the file, and we do not yet know the
3967                              symbol index.  We save the pointer to the
3968                              hash table entry in the rel_hash list.
3969                              We set the indx field to -2 to indicate
3970                              that this symbol must not be stripped.  */
3971                           *rel_hash = h;
3972                           h->indx = -2;
3973                         }
3974                     }
3975                   else
3976                     {
3977                       long indx;
3978
3979                       indx = finfo->sym_indices[r_symndx];
3980
3981                       if (indx == -1)
3982                         {
3983                           struct internal_syment *is;
3984
3985                           /* Relocations against a TC0 TOC anchor are
3986                              automatically transformed to be against
3987                              the TOC anchor in the output file.  */
3988                           is = finfo->internal_syms + r_symndx;
3989                           if (is->n_sclass == C_HIDEXT
3990                               && is->n_numaux > 0)
3991                             {
3992                               PTR auxptr;
3993                               union internal_auxent aux;
3994
3995                               auxptr = ((PTR)
3996                                         (((bfd_byte *)
3997                                           obj_coff_external_syms (input_bfd))
3998                                          + ((r_symndx + is->n_numaux)
3999                                             * isymesz)));
4000                               bfd_coff_swap_aux_in (input_bfd, auxptr,
4001                                                     is->n_type, is->n_sclass,
4002                                                     is->n_numaux - 1,
4003                                                     is->n_numaux,
4004                                                     (PTR) &aux);
4005                               if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_SD
4006                                   && aux.x_csect.x_smclas == XMC_TC0)
4007                                 indx = finfo->toc_symindx;
4008                             }
4009                         }
4010
4011                       if (indx != -1)
4012                         irel->r_symndx = indx;
4013                       else
4014                         {
4015                           struct internal_syment *is;
4016                           const char *name;
4017                           char buf[SYMNMLEN + 1];
4018
4019                           /* This reloc is against a symbol we are
4020                              stripping.  It would be possible to handle
4021                              this case, but I don't think it's worth it.  */
4022                           is = finfo->internal_syms + r_symndx;
4023
4024                           name = (_bfd_coff_internal_syment_name
4025                                   (input_bfd, is, buf));
4026                           if (name == NULL)
4027                             return false;
4028
4029                           if (! ((*finfo->info->callbacks->unattached_reloc)
4030                                  (finfo->info, name, input_bfd, o,
4031                                   irel->r_vaddr)))
4032                             return false;
4033                         }
4034                     }
4035                 }
4036
4037               switch (irel->r_type)
4038                 {
4039                 default:
4040                   break;
4041                 case R_POS:
4042                 case R_NEG:
4043                 case R_RL:
4044                 case R_RLA:
4045                   /* This reloc needs to be copied into the .loader
4046                      section.  */
4047                   ldrel.l_vaddr = irel->r_vaddr;
4048                   if (r_symndx == -1)
4049                     ldrel.l_symndx = -1;
4050                   else if (h == NULL)
4051                     {
4052                       asection *sec;
4053
4054                       sec = xcoff_data (input_bfd)->csects[r_symndx];
4055                       if ((sec->flags & SEC_CODE) != 0)
4056                         ldrel.l_symndx = 0;
4057                       else if ((sec->flags & SEC_HAS_CONTENTS) != 0)
4058                         ldrel.l_symndx = 1;
4059                       else
4060                         ldrel.l_symndx = 2;
4061                     }
4062                   else if (h->root.type == bfd_link_hash_defined
4063                            || h->root.type == bfd_link_hash_defweak)
4064                     {
4065                       asection *sec;
4066
4067                       sec = h->root.u.def.section->output_section;
4068                       if ((sec->flags & SEC_CODE) != 0)
4069                         ldrel.l_symndx = 0;
4070                       else if ((sec->flags & SEC_HAS_CONTENTS) != 0)
4071                         ldrel.l_symndx = 1;
4072                       else
4073                         ldrel.l_symndx = 2;
4074                     }
4075                   else
4076                     {
4077                       if (h->ldindx < 0)
4078                         {
4079                           (*_bfd_error_handler)
4080                             ("%s: `%s' in loader reloc but not loader sym",
4081                              bfd_get_filename (input_bfd),
4082                              h->root.root.string);
4083                           bfd_set_error (bfd_error_bad_value);
4084                           return false;
4085                         }
4086                       ldrel.l_symndx = h->ldindx;
4087                     }
4088                   ldrel.l_rtype = (irel->r_size << 8) | irel->r_type;
4089                   ldrel.l_rsecnm = o->output_section->target_index;
4090                   if (xcoff_hash_table (finfo->info)->textro
4091                       && (o->output_section->flags & SEC_CODE) != 0)
4092                     {
4093                       (*_bfd_error_handler)
4094                         ("%s: loader reloc in read-only section %s",
4095                          bfd_get_filename (input_bfd),
4096                          bfd_get_section_name (finfo->output_bfd,
4097                                                o->output_section));
4098                       bfd_set_error (bfd_error_invalid_operation);
4099                       return false;
4100                     }
4101                   xcoff_swap_ldrel_out (output_bfd, &ldrel,
4102                                         finfo->ldrel);
4103                   BFD_ASSERT (sizeof (struct external_ldrel) == LDRELSZ);
4104                   ++finfo->ldrel;
4105                 }
4106             }
4107
4108           o->output_section->reloc_count += o->reloc_count;
4109         }
4110
4111       /* Write out the modified section contents.  */
4112       if (! bfd_set_section_contents (output_bfd, o->output_section,
4113                                       contents, o->output_offset,
4114                                       (o->_cooked_size != 0
4115                                        ? o->_cooked_size
4116                                        : o->_raw_size)))
4117         return false;
4118     }
4119
4120   obj_coff_keep_syms (input_bfd) = keep_syms;
4121
4122   if (! finfo->info->keep_memory)
4123     {
4124       if (! _bfd_coff_free_symbols (input_bfd))
4125         return false;
4126     }
4127
4128   return true;
4129 }
4130
4131 #undef N_TMASK
4132 #undef N_BTSHFT
4133
4134 /* Write out a non-XCOFF global symbol.  */
4135
4136 static boolean
4137 xcoff_write_global_symbol (h, p)
4138      struct xcoff_link_hash_entry *h;
4139      PTR p;
4140 {
4141   struct xcoff_final_link_info *finfo = (struct xcoff_final_link_info *) p;
4142   bfd *output_bfd;
4143   bfd_byte *outsym;
4144   struct internal_syment isym;
4145   union internal_auxent aux;
4146
4147   output_bfd = finfo->output_bfd;
4148
4149   /* If this symbol was garbage collected, just skip it.  */
4150   if (xcoff_hash_table (finfo->info)->gc
4151       && (h->flags & XCOFF_MARK) == 0)
4152     return true;
4153
4154   /* If we need a .loader section entry, write it out.  */
4155   if (h->ldsym != NULL)
4156     {
4157       struct internal_ldsym *ldsym;
4158       bfd *impbfd;
4159
4160       ldsym = h->ldsym;
4161
4162       if (h->root.type == bfd_link_hash_undefined
4163           || h->root.type == bfd_link_hash_undefweak)
4164         {
4165           ldsym->l_value = 0;
4166           ldsym->l_scnum = N_UNDEF;
4167           ldsym->l_smtype = XTY_ER;
4168           impbfd = h->root.u.undef.abfd;
4169         }
4170       else if (h->root.type == bfd_link_hash_defined
4171                || h->root.type == bfd_link_hash_defweak)
4172         {
4173           asection *sec;
4174
4175           sec = h->root.u.def.section;
4176           ldsym->l_value = (sec->output_section->vma
4177                             + sec->output_offset
4178                             + h->root.u.def.value);
4179           ldsym->l_scnum = sec->output_section->target_index;
4180           ldsym->l_smtype = XTY_SD;
4181           impbfd = sec->owner;
4182         }
4183       else
4184         abort ();
4185
4186       if (((h->flags & XCOFF_DEF_REGULAR) == 0
4187            && (h->flags & XCOFF_REF_DYNAMIC) != 0)
4188           || (h->flags & XCOFF_IMPORT) != 0)
4189         ldsym->l_smtype |= L_IMPORT;
4190       if (((h->flags & XCOFF_DEF_REGULAR) != 0
4191            && (h->flags & XCOFF_REF_DYNAMIC) != 0)
4192           || (h->flags & XCOFF_EXPORT) != 0)
4193         ldsym->l_smtype |= L_EXPORT;
4194       if ((h->flags & XCOFF_ENTRY) != 0)
4195         ldsym->l_smtype |= L_ENTRY;
4196
4197       ldsym->l_smclas = h->smclas;
4198
4199       if (ldsym->l_ifile == (bfd_size_type) -1)
4200         ldsym->l_ifile = 0;
4201       else if (ldsym->l_ifile == 0)
4202         {
4203           if ((ldsym->l_smtype & L_IMPORT) == 0)
4204             ldsym->l_ifile = 0;
4205           else if (impbfd == NULL)
4206             ldsym->l_ifile = 0;
4207           else
4208             {
4209               BFD_ASSERT (impbfd->xvec == output_bfd->xvec);
4210               ldsym->l_ifile = xcoff_data (impbfd)->import_file_id;
4211             }
4212         }
4213
4214       ldsym->l_parm = 0;
4215
4216       BFD_ASSERT (h->ldindx >= 0);
4217       BFD_ASSERT (LDSYMSZ == sizeof (struct external_ldsym));
4218       xcoff_swap_ldsym_out (output_bfd, ldsym, finfo->ldsym + h->ldindx - 3);
4219       h->ldsym = NULL;
4220     }
4221
4222   /* If this symbol needs global linkage code, write it out.  */
4223   if (h->root.type == bfd_link_hash_defined
4224       && (h->root.u.def.section
4225           == xcoff_hash_table (finfo->info)->linkage_section))
4226     {
4227       bfd_byte *p;
4228       bfd_vma tocoff;
4229       unsigned int i;
4230
4231       p = h->root.u.def.section->contents + h->root.u.def.value;
4232
4233       /* The first instruction in the global linkage code loads a
4234          specific TOC element.  */
4235       tocoff = (h->descriptor->toc_section->output_section->vma
4236                 + h->descriptor->toc_section->output_offset
4237                 + h->descriptor->toc_offset
4238                 - xcoff_data (output_bfd)->toc);
4239       bfd_put_32 (output_bfd, XCOFF_GLINK_FIRST | tocoff, p);
4240       for (i = 0, p += 4;
4241            i < sizeof xcoff_glink_code / sizeof xcoff_glink_code[0];
4242            i++, p += 4)
4243         bfd_put_32 (output_bfd, xcoff_glink_code[i], p);
4244     }
4245
4246   /* If we created a TOC entry for this symbol, write out the required
4247      relocs.  */
4248   if ((h->flags & XCOFF_SET_TOC) != 0)
4249     {
4250       asection *tocsec;
4251       asection *osec;
4252       int oindx;
4253       struct internal_reloc *irel;
4254       struct internal_ldrel ldrel;
4255
4256       tocsec = h->toc_section;
4257       osec = tocsec->output_section;
4258       oindx = osec->target_index;
4259       irel = finfo->section_info[oindx].relocs + osec->reloc_count;
4260       irel->r_vaddr = (osec->vma
4261                        + tocsec->output_offset
4262                        + h->toc_offset);
4263       if (h->indx >= 0)
4264         irel->r_symndx = h->indx;
4265       else
4266         {
4267           h->indx = -2;
4268           irel->r_symndx = obj_raw_syment_count (output_bfd);
4269         }
4270       irel->r_type = R_POS;
4271       irel->r_size = 31;
4272       finfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
4273       ++osec->reloc_count;
4274
4275       BFD_ASSERT (h->ldindx >= 0);
4276       ldrel.l_vaddr = irel->r_vaddr;
4277       ldrel.l_symndx = h->ldindx;
4278       ldrel.l_rtype = (31 << 8) | R_POS;
4279       ldrel.l_rsecnm = oindx;
4280       xcoff_swap_ldrel_out (output_bfd, &ldrel, finfo->ldrel);
4281       ++finfo->ldrel;
4282     }
4283
4284   if (h->indx >= 0)
4285     return true;
4286
4287   if (h->indx != -2
4288       && (finfo->info->strip == strip_all
4289           || (finfo->info->strip == strip_some
4290               && (bfd_hash_lookup (finfo->info->keep_hash,
4291                                    h->root.root.string, false, false)
4292                   == NULL))))
4293     return true;
4294
4295   if (h->indx != -2
4296       && (h->flags & (XCOFF_REF_REGULAR | XCOFF_DEF_REGULAR)) == 0)
4297     return true;
4298
4299   outsym = finfo->outsyms;
4300
4301   memset (&aux, 0, sizeof aux);
4302
4303   h->indx = obj_raw_syment_count (output_bfd);
4304
4305   if (strlen (h->root.root.string) <= SYMNMLEN)
4306     strncpy (isym._n._n_name, h->root.root.string, SYMNMLEN);
4307   else
4308     {
4309       boolean hash;
4310       bfd_size_type indx;
4311
4312       hash = true;
4313       if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
4314         hash = false;
4315       indx = _bfd_stringtab_add (finfo->strtab, h->root.root.string, hash,
4316                                  false);
4317       if (indx == (bfd_size_type) -1)
4318         return false;
4319       isym._n._n_n._n_zeroes = 0;
4320       isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
4321     }
4322
4323   if (h->root.type == bfd_link_hash_undefined
4324       || h->root.type == bfd_link_hash_undefweak)
4325     {
4326       isym.n_value = 0;
4327       isym.n_scnum = N_UNDEF;
4328       isym.n_sclass = C_EXT;
4329       aux.x_csect.x_smtyp = XTY_ER;
4330     }
4331   else if (h->root.type == bfd_link_hash_defined
4332            || h->root.type == bfd_link_hash_defweak)
4333     {
4334       isym.n_value = (h->root.u.def.section->output_section->vma
4335                       + h->root.u.def.section->output_offset
4336                       + h->root.u.def.value);
4337       isym.n_scnum = h->root.u.def.section->output_section->target_index;
4338       isym.n_sclass = C_HIDEXT;
4339       aux.x_csect.x_smtyp = XTY_SD;
4340       /* I don't know what the csect length should be in this case.  */
4341     }
4342   else
4343     abort ();
4344
4345   isym.n_type = T_NULL;
4346   isym.n_numaux = 1;
4347
4348   bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym);
4349   outsym += bfd_coff_symesz (output_bfd);
4350
4351   aux.x_csect.x_smclas = h->smclas;
4352
4353   bfd_coff_swap_aux_out (output_bfd, (PTR) &aux, T_NULL, isym.n_sclass, 0, 1,
4354                          (PTR) outsym);
4355   outsym += bfd_coff_auxesz (output_bfd);
4356
4357   if (h->root.type == bfd_link_hash_defined
4358       || h->root.type == bfd_link_hash_defweak)
4359     {
4360       /* We just output an SD symbol.  Now output an LD symbol.  */
4361
4362       h->indx += 2;
4363
4364       isym.n_sclass = C_EXT;
4365       bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym);
4366       outsym += bfd_coff_symesz (output_bfd);
4367
4368       aux.x_csect.x_smtyp = XTY_LD;
4369       aux.x_csect.x_scnlen.l = obj_raw_syment_count (output_bfd);
4370
4371       bfd_coff_swap_aux_out (output_bfd, (PTR) &aux, T_NULL, C_EXT, 0, 1,
4372                              (PTR) outsym);
4373       outsym += bfd_coff_auxesz (output_bfd);
4374     }
4375
4376   if (bfd_seek (output_bfd,
4377                 (obj_sym_filepos (output_bfd)
4378                  + (obj_raw_syment_count (output_bfd)
4379                     * bfd_coff_symesz (output_bfd))),
4380                 SEEK_SET) != 0
4381       || (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1, output_bfd)
4382           != (bfd_size_type) (outsym - finfo->outsyms)))
4383     return false;
4384   obj_raw_syment_count (output_bfd) +=
4385     (outsym - finfo->outsyms) / bfd_coff_symesz (output_bfd);
4386
4387   return true;
4388 }
4389
4390 /* Handle a link order which is supposed to generate a reloc.  */
4391
4392 static boolean
4393 xcoff_reloc_link_order (output_bfd, finfo, output_section, link_order)
4394      bfd *output_bfd;
4395      struct xcoff_final_link_info *finfo;
4396      asection *output_section;
4397      struct bfd_link_order *link_order;
4398 {
4399   reloc_howto_type *howto;
4400   struct internal_reloc *irel;
4401   struct xcoff_link_hash_entry **rel_hash_ptr;
4402
4403   howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
4404   if (howto == NULL)
4405     {
4406       bfd_set_error (bfd_error_bad_value);
4407       return false;
4408     }
4409
4410   if (link_order->u.reloc.p->addend != 0)
4411     {
4412       bfd_size_type size;
4413       bfd_byte *buf;
4414       bfd_reloc_status_type rstat;
4415       boolean ok;
4416
4417       size = bfd_get_reloc_size (howto);
4418       buf = (bfd_byte *) bfd_zmalloc (size);
4419       if (buf == NULL)
4420         {
4421           bfd_set_error (bfd_error_no_memory);
4422           return false;
4423         }
4424
4425       rstat = _bfd_relocate_contents (howto, output_bfd,
4426                                       link_order->u.reloc.p->addend, buf);
4427       switch (rstat)
4428         {
4429         case bfd_reloc_ok:
4430           break;
4431         default:
4432         case bfd_reloc_outofrange:
4433           abort ();
4434         case bfd_reloc_overflow:
4435           if (! ((*finfo->info->callbacks->reloc_overflow)
4436                  (finfo->info,
4437                   (link_order->type == bfd_section_reloc_link_order
4438                    ? bfd_section_name (output_bfd,
4439                                        link_order->u.reloc.p->u.section)
4440                    : link_order->u.reloc.p->u.name),
4441                   howto->name, link_order->u.reloc.p->addend,
4442                   (bfd *) NULL, (asection *) NULL, (bfd_vma) 0)))
4443             {
4444               free (buf);
4445               return false;
4446             }
4447           break;
4448         }
4449       ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf,
4450                                      (file_ptr) link_order->offset, size);
4451       free (buf);
4452       if (! ok)
4453         return false;
4454     }
4455
4456   /* Store the reloc information in the right place.  It will get
4457      swapped and written out at the end of the final_link routine.  */
4458
4459   irel = (finfo->section_info[output_section->target_index].relocs
4460           + output_section->reloc_count);
4461   rel_hash_ptr = (finfo->section_info[output_section->target_index].rel_hashes
4462                   + output_section->reloc_count);
4463
4464   memset (irel, 0, sizeof (struct internal_reloc));
4465   *rel_hash_ptr = NULL;
4466
4467   irel->r_vaddr = output_section->vma + link_order->offset;
4468
4469   if (link_order->type == bfd_section_reloc_link_order)
4470     {
4471       /* We need to somehow locate a symbol in the right section.  The
4472          symbol must either have a value of zero, or we must adjust
4473          the addend by the value of the symbol.  FIXME: Write this
4474          when we need it.  The old linker couldn't handle this anyhow.  */
4475       abort ();
4476       *rel_hash_ptr = NULL;
4477       irel->r_symndx = 0;
4478     }
4479   else
4480     {
4481       struct xcoff_link_hash_entry *h;
4482
4483       h = xcoff_link_hash_lookup (xcoff_hash_table (finfo->info),
4484                                   link_order->u.reloc.p->u.name,
4485                                   false, false, true);
4486       if (h != NULL)
4487         {
4488           if (h->indx >= 0)
4489             irel->r_symndx = h->indx;
4490           else
4491             {
4492               /* Set the index to -2 to force this symbol to get
4493                  written out.  */
4494               h->indx = -2;
4495               *rel_hash_ptr = h;
4496               irel->r_symndx = 0;
4497             }
4498         }
4499       else
4500         {
4501           if (! ((*finfo->info->callbacks->unattached_reloc)
4502                  (finfo->info, link_order->u.reloc.p->u.name, (bfd *) NULL,
4503                   (asection *) NULL, (bfd_vma) 0)))
4504             return false;
4505           irel->r_symndx = 0;
4506         }
4507     }
4508
4509   irel->r_type = howto->type;
4510   irel->r_size = howto->bitsize - 1;
4511   if (howto->complain_on_overflow == complain_overflow_signed)
4512     irel->r_size |= 0x80;
4513
4514   ++output_section->reloc_count;
4515
4516   return true;
4517 }
4518
4519 /* Sort relocs by VMA.  This is called via qsort.  */
4520
4521 static int
4522 xcoff_sort_relocs (p1, p2)
4523      const PTR p1;
4524      const PTR p2;
4525 {
4526   const struct internal_reloc *r1 = (const struct internal_reloc *) p1;
4527   const struct internal_reloc *r2 = (const struct internal_reloc *) p2;
4528
4529   if (r1->r_vaddr > r2->r_vaddr)
4530     return 1;
4531   else if (r1->r_vaddr < r2->r_vaddr)
4532     return -1;
4533   else
4534     return 0;
4535 }
4536
4537 /* This is the relocation function for the RS/6000/POWER/PowerPC.
4538    This is currently the only processor which uses XCOFF; I hope that
4539    will never change.  */
4540
4541 boolean
4542 _bfd_ppc_xcoff_relocate_section (output_bfd, info, input_bfd,
4543                                  input_section, contents, relocs, syms,
4544                                  sections)
4545      bfd *output_bfd;
4546      struct bfd_link_info *info;
4547      bfd *input_bfd;
4548      asection *input_section;
4549      bfd_byte *contents;
4550      struct internal_reloc *relocs;
4551      struct internal_syment *syms;
4552      asection **sections;
4553 {
4554   struct internal_reloc *rel;
4555   struct internal_reloc *relend;
4556
4557   rel = relocs;
4558   relend = rel + input_section->reloc_count;
4559   for (; rel < relend; rel++)
4560     {
4561       long symndx;
4562       struct xcoff_link_hash_entry *h;
4563       struct internal_syment *sym;
4564       bfd_vma addend;
4565       bfd_vma val;
4566       struct reloc_howto_struct howto;
4567       bfd_reloc_status_type rstat;
4568
4569       /* Relocation type R_REF is a special relocation type which is
4570          merely used to prevent garbage collection from occurring for
4571          the csect including the symbol which it references.  */
4572       if (rel->r_type == R_REF)
4573         continue;
4574
4575       symndx = rel->r_symndx;
4576
4577       if (symndx == -1)
4578         {
4579           h = NULL;
4580           sym = NULL;
4581           addend = 0;
4582         }
4583       else
4584         {    
4585           h = obj_xcoff_sym_hashes (input_bfd)[symndx];
4586           sym = syms + symndx;
4587           addend = - sym->n_value;
4588         }
4589
4590       /* We build the howto information on the fly.  */
4591
4592       howto.type = rel->r_type;
4593       howto.rightshift = 0;
4594       howto.size = 2;
4595       howto.bitsize = (rel->r_size & 0x1f) + 1;
4596       howto.pc_relative = false;
4597       howto.bitpos = 0;
4598       if ((rel->r_size & 0x80) != 0)
4599         howto.complain_on_overflow = complain_overflow_signed;
4600       else
4601         howto.complain_on_overflow = complain_overflow_bitfield;
4602       howto.special_function = NULL;
4603       howto.name = "internal";
4604       howto.partial_inplace = true;
4605       if (howto.bitsize == 32)
4606         howto.src_mask = howto.dst_mask = 0xffffffff;
4607       else
4608         {
4609           howto.src_mask = howto.dst_mask = (1 << howto.bitsize) - 1;
4610           if (howto.bitsize == 16)
4611             howto.size = 1;
4612         }
4613       howto.pcrel_offset = false;
4614
4615       val = 0;
4616
4617       if (h == NULL)
4618         {
4619           asection *sec;
4620
4621           if (symndx == -1)
4622             {
4623               sec = bfd_abs_section_ptr;
4624               val = 0;
4625             }
4626           else
4627             {
4628               sec = sections[symndx];
4629               val = (sec->output_section->vma
4630                      + sec->output_offset
4631                      + sym->n_value
4632                      - sec->vma);
4633             }
4634         }
4635       else
4636         {
4637           if (h->root.type == bfd_link_hash_defined
4638               || h->root.type == bfd_link_hash_defweak)
4639             {
4640               asection *sec;
4641
4642               sec = h->root.u.def.section;
4643               val = (h->root.u.def.value
4644                      + sec->output_section->vma
4645                      + sec->output_offset);
4646             }
4647           else if ((h->flags & XCOFF_REF_DYNAMIC) != 0
4648                    || (h->flags & XCOFF_IMPORT) != 0)
4649             {
4650               /* Every symbol in a shared object is defined somewhere.  */
4651               val = 0;
4652             }
4653           else if (! info->relocateable)
4654             {
4655               if (! ((*info->callbacks->undefined_symbol)
4656                      (info, h->root.root.string, input_bfd, input_section,
4657                       rel->r_vaddr - input_section->vma)))
4658                 return false;
4659             }
4660         }
4661
4662       /* I took the relocation type definitions from two documents:
4663          the PowerPC AIX Version 4 Application Binary Interface, First
4664          Edition (April 1992), and the PowerOpen ABI, Big-Endian
4665          32-Bit Hardware Implementation (June 30, 1994).  Differences
4666          between the documents are noted below.  */
4667
4668       switch (rel->r_type)
4669         {
4670         case R_RTB:
4671         case R_RRTBI:
4672         case R_RRTBA:
4673           /* These relocs are defined by the PowerPC ABI to be
4674              relative branches which use half of the difference
4675              between the symbol and the program counter.  I can't
4676              quite figure out when this is useful.  These relocs are
4677              not defined by the PowerOpen ABI.  */
4678         default:
4679           (*_bfd_error_handler)
4680             ("%s: unsupported relocation type 0x%02x",
4681              bfd_get_filename (input_bfd), (unsigned int) rel->r_type);
4682           bfd_set_error (bfd_error_bad_value);
4683           return false;
4684         case R_POS:
4685           /* Simple positive relocation.  */
4686           break;
4687         case R_NEG:
4688           /* Simple negative relocation.  */
4689           val = - val;
4690           break;
4691         case R_REL:
4692           /* Simple PC relative relocation.  */
4693           howto.pc_relative = true;
4694           break;
4695         case R_TOC:
4696           /* TOC relative relocation.  The value in the instruction in
4697              the input file is the offset from the input file TOC to
4698              the desired location.  We want the offset from the final
4699              TOC to the desired location.  We have:
4700                  isym = iTOC + in
4701                  iinsn = in + o
4702                  osym = oTOC + on
4703                  oinsn = on + o
4704              so we must change insn by on - in.
4705              */
4706         case R_GL:
4707           /* Global linkage relocation.  The value of this relocation
4708              is the address of the entry in the TOC section.  */
4709         case R_TCL:
4710           /* Local object TOC address.  I can't figure out the
4711              difference between this and case R_GL.  */
4712         case R_TRL:
4713           /* TOC relative relocation.  A TOC relative load instruction
4714              which may be changed to a load address instruction.
4715              FIXME: We don't currently implement this optimization.  */
4716         case R_TRLA:
4717           /* TOC relative relocation.  This is a TOC relative load
4718              address instruction which may be changed to a load
4719              instruction.  FIXME: I don't know if this is the correct
4720              implementation.  */
4721           if (h != NULL && h->toc_section == NULL)
4722             {
4723               (*_bfd_error_handler)
4724                 ("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry",
4725                  bfd_get_filename (input_bfd), rel->r_vaddr,
4726                  h->root.root.string);
4727               bfd_set_error (bfd_error_bad_value);
4728               return false;
4729             }
4730           if (h != NULL)
4731             val = (h->toc_section->output_section->vma
4732                    + h->toc_section->output_offset
4733                    + h->toc_offset);
4734           val = ((val - xcoff_data (output_bfd)->toc)
4735                  - (sym->n_value - xcoff_data (input_bfd)->toc));
4736           addend = 0;
4737           break;
4738         case R_BA:
4739           /* Absolute branch.  We don't want to mess with the lower
4740              two bits of the instruction.  */
4741         case R_CAI:
4742           /* The PowerPC ABI defines this as an absolute call which
4743              may be modified to become a relative call.  The PowerOpen
4744              ABI does not define this relocation type.  */
4745         case R_RBA:
4746           /* Absolute branch which may be modified to become a
4747              relative branch.  */
4748         case R_RBAC:
4749           /* The PowerPC ABI defines this as an absolute branch to a
4750              fixed address which may be modified to an absolute branch
4751              to a symbol.  The PowerOpen ABI does not define this
4752              relocation type.  */
4753         case R_RBRC:
4754           /* The PowerPC ABI defines this as an absolute branch to a
4755              fixed address which may be modified to a relative branch.
4756              The PowerOpen ABI does not define this relocation type.  */
4757           howto.src_mask &= ~3;
4758           howto.dst_mask = howto.src_mask;
4759           break;
4760         case R_BR:
4761           /* Relative branch.  We don't want to mess with the lower
4762              two bits of the instruction.  */
4763         case R_CREL:
4764           /* The PowerPC ABI defines this as a relative call which may
4765              be modified to become an absolute call.  The PowerOpen
4766              ABI does not define this relocation type.  */
4767         case R_RBR:
4768           /* A relative branch which may be modified to become an
4769              absolute branch.  FIXME: We don't implement this,
4770              although we should for symbols of storage mapping class
4771              XMC_XO.  */
4772           howto.pc_relative = true;
4773           howto.src_mask &= ~3;
4774           howto.dst_mask = howto.src_mask;
4775           break;
4776         case R_RL:
4777           /* The PowerPC AIX ABI describes this as a load which may be
4778              changed to a load address.  The PowerOpen ABI says this
4779              is the same as case R_POS.  */
4780           break;
4781         case R_RLA:
4782           /* The PowerPC AIX ABI describes this as a load address
4783              which may be changed to a load.  The PowerOpen ABI says
4784              this is the same as R_POS.  */
4785           break;
4786         }
4787
4788       /* If we see an R_BR or R_RBR reloc which is jumping to global
4789          linkage code, and it is followed by an appropriate cror nop
4790          instruction, we replace the cror with lwz r2,20(r1).  This
4791          restores the TOC after the glink code.  Contrariwise, if the
4792          call is followed by a lwz r2,20(r1), but the call is not
4793          going to global linkage code, we can replace the load with a
4794          cror.  */
4795       if ((rel->r_type == R_BR || rel->r_type == R_RBR)
4796           && h != NULL
4797           && h->root.type == bfd_link_hash_defined
4798           && (rel->r_vaddr - input_section->vma + 8
4799               <= input_section->_cooked_size))
4800         {
4801           bfd_byte *pnext;
4802           unsigned long next;
4803
4804           pnext = contents + (rel->r_vaddr - input_section->vma) + 4;
4805           next = bfd_get_32 (input_bfd, pnext);
4806           if (h->smclas == XMC_GL)
4807             {
4808               if (next == 0x4def7b82            /* cror 15,15,15 */
4809                   || next == 0x4ffffb82)        /* cror 31,31,31 */
4810                 bfd_put_32 (input_bfd, 0x80410014, pnext); /* lwz r1,20(r1) */
4811             }
4812           else
4813             {
4814               if (next == 0x80410014)           /* lwz r1,20(r1) */
4815                 bfd_put_32 (input_bfd, 0x4ffffb82, pnext); /* cror 31,31,31 */
4816             }
4817         }
4818
4819       /* A PC relative reloc includes the section address.  */
4820       if (howto.pc_relative)
4821         addend += input_section->vma;
4822
4823       rstat = _bfd_final_link_relocate (&howto, input_bfd, input_section,
4824                                         contents,
4825                                         rel->r_vaddr - input_section->vma,
4826                                         val, addend);
4827
4828       switch (rstat)
4829         {
4830         default:
4831           abort ();
4832         case bfd_reloc_ok:
4833           break;
4834         case bfd_reloc_overflow:
4835           {
4836             const char *name;
4837             char buf[SYMNMLEN + 1];
4838             char howto_name[10];
4839
4840             if (symndx == -1)
4841               name = "*ABS*";
4842             else if (h != NULL)
4843               name = h->root.root.string;
4844             else
4845               {
4846                 name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
4847                 if (name == NULL)
4848                   return false;
4849               }
4850             sprintf (howto_name, "0x%02x", rel->r_type);
4851
4852             if (! ((*info->callbacks->reloc_overflow)
4853                    (info, name, howto_name, (bfd_vma) 0, input_bfd,
4854                     input_section, rel->r_vaddr - input_section->vma)))
4855               return false;
4856           }
4857         }
4858     }
4859
4860   return true;
4861 }