tweak line number and gc handling
[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       rel = xcoff_read_internal_relocs (sec->owner, sec, true,
2332                                         (bfd_byte *) NULL, false,
2333                                         (struct internal_reloc *) NULL);
2334       if (rel == NULL)
2335         return false;
2336       relend = rel + sec->reloc_count;
2337       for (; rel < relend; rel++)
2338         {
2339           asection *rsec;
2340           struct xcoff_link_hash_entry *h;
2341
2342           if ((unsigned int) rel->r_symndx
2343               > obj_raw_syment_count (sec->owner))
2344             continue;
2345
2346           h = obj_xcoff_sym_hashes (sec->owner)[rel->r_symndx];
2347           if (h != NULL
2348               && (h->flags & XCOFF_MARK) == 0)
2349             {
2350               h->flags |= XCOFF_MARK;
2351               if (h->root.type == bfd_link_hash_defined
2352                   || h->root.type == bfd_link_hash_defweak)
2353                 {
2354                   asection *hsec;
2355
2356                   hsec = h->root.u.def.section;
2357                   if ((hsec->flags & SEC_MARK) == 0)
2358                     {
2359                       if (! xcoff_mark (info, hsec))
2360                         return false;
2361                     }
2362                 }
2363
2364               if (h->toc_section != NULL
2365                   && (h->toc_section->flags & SEC_MARK) == 0)
2366                 {
2367                   if (! xcoff_mark (info, h->toc_section))
2368                     return false;
2369                 }
2370             }
2371
2372           rsec = xcoff_data (sec->owner)->csects[rel->r_symndx];
2373           if (rsec != NULL
2374               && (rsec->flags & SEC_MARK) == 0)
2375             {
2376               if (! xcoff_mark (info, rsec))
2377                 return false;
2378             }
2379         }
2380
2381       if (! info->keep_memory
2382           && coff_section_data (sec->owner, sec) != NULL
2383           && coff_section_data (sec->owner, sec)->relocs != NULL
2384           && ! coff_section_data (sec->owner, sec)->keep_relocs)
2385         {
2386           free (coff_section_data (sec->owner, sec)->relocs);
2387           coff_section_data (sec->owner, sec)->relocs = NULL;
2388         }
2389     }
2390
2391   return true;
2392 }
2393
2394 /* The sweep phase of garbage collection.  Remove all garbage
2395    sections.  */
2396
2397 static void
2398 xcoff_sweep (info)
2399      struct bfd_link_info *info;
2400 {
2401   bfd *sub;
2402
2403   for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
2404     {
2405       asection *o;
2406
2407       for (o = sub->sections; o != NULL; o = o->next)
2408         {
2409           if ((o->flags & SEC_MARK) == 0)
2410             {
2411               /* Keep all sections from non-XCOFF input files.  Keep
2412                  special sections.  Keep .debug sections for the
2413                  moment.  */
2414               if (sub->xvec != info->hash->creator
2415                   || o == xcoff_hash_table (info)->debug_section
2416                   || o == xcoff_hash_table (info)->loader_section
2417                   || o == xcoff_hash_table (info)->linkage_section
2418                   || o == xcoff_hash_table (info)->toc_section
2419                   || strcmp (o->name, ".debug") == 0)
2420                 o->flags |= SEC_MARK;
2421               else
2422                 {
2423                   o->_raw_size = 0;
2424                   o->reloc_count = 0;
2425                   o->lineno_count = 0;
2426                   if (coff_section_data (sub, o) != NULL
2427                       && xcoff_section_data (sub, o) != NULL)
2428                     xcoff_hash_table (info)->ldrel_count -=
2429                       xcoff_section_data (sub, o)->ldrel_count;
2430                 }
2431             }
2432         }
2433     }
2434 }
2435
2436 /* Add a symbol to the .loader symbols, if necessary.  */
2437
2438 static boolean
2439 xcoff_build_ldsyms (h, p)
2440      struct xcoff_link_hash_entry *h;
2441      PTR p;
2442 {
2443   struct xcoff_loader_info *ldinfo = (struct xcoff_loader_info *) p;
2444   size_t len;
2445
2446   /* We don't want to garbage collect symbols which are not defined in
2447      XCOFF files.  This is a convenient place to mark them.  */
2448   if (xcoff_hash_table (ldinfo->info)->gc
2449       && (h->flags & XCOFF_MARK) == 0
2450       && (h->root.type == bfd_link_hash_defined
2451           || h->root.type == bfd_link_hash_defweak)
2452       && (h->root.u.def.section->owner == NULL
2453           || (h->root.u.def.section->owner->xvec
2454               != ldinfo->info->hash->creator)))
2455     h->flags |= XCOFF_MARK;
2456
2457   /* If this symbol is called, and it is defined in a dynamic object,
2458      then we need to set up global linkage code for it.  (Unless we
2459      did garbage collection and we didn't need this symbol.)  */
2460   if ((h->flags & XCOFF_CALLED) != 0
2461       && (h->flags & XCOFF_DEF_REGULAR) == 0
2462       && (h->flags & XCOFF_REF_DYNAMIC) != 0
2463       && (h->root.type == bfd_link_hash_undefined
2464           || h->root.type == bfd_link_hash_undefweak)
2465       && h->root.root.string[0] == '.'
2466       && (! xcoff_hash_table (ldinfo->info)->gc
2467           || (h->flags & XCOFF_MARK) != 0))
2468     {
2469       asection *sec;
2470       struct xcoff_link_hash_entry *hds;
2471
2472       sec = xcoff_hash_table (ldinfo->info)->linkage_section;
2473       h->root.type = bfd_link_hash_defined;
2474       h->root.u.def.section = sec;
2475       h->root.u.def.value = sec->_raw_size;
2476       h->smclas = XMC_GL;
2477       sec->_raw_size += XCOFF_GLINK_SIZE;
2478
2479       /* The global linkage code requires a TOC entry for the
2480          descriptor.  */
2481       hds = h->descriptor;
2482       BFD_ASSERT ((hds->root.type == bfd_link_hash_undefined
2483                    || hds->root.type == bfd_link_hash_undefweak)
2484                   && (hds->flags & XCOFF_DEF_REGULAR) == 0
2485                   && (hds->flags & XCOFF_REF_DYNAMIC) != 0);
2486       hds->flags |= XCOFF_MARK;
2487       if (hds->toc_section == NULL)
2488         {
2489           hds->toc_section = xcoff_hash_table (ldinfo->info)->toc_section;
2490           hds->toc_offset = hds->toc_section->_raw_size;
2491           hds->toc_section->_raw_size += 4;
2492           ++xcoff_hash_table (ldinfo->info)->ldrel_count;
2493           ++hds->toc_section->reloc_count;
2494           hds->indx = -2;
2495           hds->flags |= XCOFF_SET_TOC | XCOFF_LDREL;
2496
2497           /* We need to call xcoff_build_ldsyms recursively here,
2498              because we may already have passed hds on the traversal.  */
2499           xcoff_build_ldsyms (hds, p);
2500         }
2501     }
2502
2503   /* We need to add a symbol to the .loader section if it is mentioned
2504      in a reloc which we are copying to the .loader section and it was
2505      not defined, or if it is the entry point.  */
2506
2507   if (((h->flags & XCOFF_LDREL) == 0
2508        || h->root.type == bfd_link_hash_defined
2509        || h->root.type == bfd_link_hash_defweak)
2510       && (h->flags & XCOFF_ENTRY) == 0)
2511     {
2512       h->ldsym = NULL;
2513       return true;
2514     }
2515
2516   /* We don't need to add this symbol if we did garbage collection and
2517      we did not mark this symbol.  */
2518   if (xcoff_hash_table (ldinfo->info)->gc
2519       && (h->flags & XCOFF_MARK) == 0)
2520     {
2521       h->ldsym = NULL;
2522       return true;
2523     }
2524
2525   /* We may have already processed this symbol due to the recursive
2526      call above.  */
2527   if ((h->flags & XCOFF_BUILT_LDSYM) != 0)
2528     return true;
2529
2530   /* We need to add this symbol to the .loader symbols.  */
2531
2532   /* h->ldsym will already have been allocated for an explicitly
2533      imported symbol.  */
2534   if (h->ldsym == NULL)
2535     {
2536       h->ldsym = ((struct internal_ldsym *)
2537                   bfd_zalloc (ldinfo->output_bfd,
2538                               sizeof (struct internal_ldsym)));
2539       if (h->ldsym == NULL)
2540         {
2541           ldinfo->failed = true;
2542           bfd_set_error (bfd_error_no_memory);
2543           return false;
2544         }
2545     }
2546
2547   /* The first 3 symbol table indices are reserved to indicate the
2548      sections.  */
2549   h->ldindx = ldinfo->ldsym_count + 3;
2550
2551   ++ldinfo->ldsym_count;
2552
2553   len = strlen (h->root.root.string);
2554   if (len <= SYMNMLEN)
2555     strncpy (h->ldsym->_l._l_name, h->root.root.string, SYMNMLEN);
2556   else
2557     {
2558       if (ldinfo->string_size + len + 3 > ldinfo->string_alc)
2559         {
2560           size_t newalc;
2561           bfd_byte *newstrings;
2562
2563           newalc = ldinfo->string_alc * 2;
2564           if (newalc == 0)
2565             newalc = 32;
2566           while (ldinfo->string_size + len + 3 > newalc)
2567             newalc *= 2;
2568
2569           if (ldinfo->strings == NULL)
2570             newstrings = (bfd_byte *) malloc (newalc);
2571           else
2572             newstrings = ((bfd_byte *)
2573                           realloc ((PTR) ldinfo->strings, newalc));
2574           if (newstrings == NULL)
2575             {
2576               ldinfo->failed = true;
2577               bfd_set_error (bfd_error_no_memory);
2578               return false;
2579             }
2580           ldinfo->string_alc = newalc;
2581           ldinfo->strings = newstrings;
2582         }
2583
2584       bfd_put_16 (ldinfo->output_bfd, len + 1,
2585                   ldinfo->strings + ldinfo->string_size);
2586       strcpy (ldinfo->strings + ldinfo->string_size + 2, h->root.root.string);
2587       h->ldsym->_l._l_l._l_zeroes = 0;
2588       h->ldsym->_l._l_l._l_offset = ldinfo->string_size + 2;
2589       ldinfo->string_size += len + 3;
2590     }
2591
2592   h->flags |= XCOFF_BUILT_LDSYM;
2593
2594   return true;
2595 }
2596 \f
2597 /* Do the final link step.  */
2598
2599 boolean
2600 _bfd_xcoff_bfd_final_link (abfd, info)
2601      bfd *abfd;
2602      struct bfd_link_info *info;
2603 {
2604   bfd_size_type symesz;
2605   struct xcoff_final_link_info finfo;
2606   asection *o;
2607   struct bfd_link_order *p;
2608   size_t max_contents_size;
2609   size_t max_sym_count;
2610   size_t max_lineno_count;
2611   size_t max_reloc_count;
2612   size_t max_output_reloc_count;
2613   file_ptr rel_filepos;
2614   unsigned int relsz;
2615   file_ptr line_filepos;
2616   unsigned int linesz;
2617   bfd *sub;
2618   bfd_byte *external_relocs = NULL;
2619   char strbuf[STRING_SIZE_SIZE];
2620
2621   symesz = bfd_coff_symesz (abfd);
2622
2623   finfo.info = info;
2624   finfo.output_bfd = abfd;
2625   finfo.strtab = NULL;
2626   finfo.section_info = NULL;
2627   finfo.last_file_index = -1;
2628   finfo.toc_symindx = -1;
2629   finfo.internal_syms = NULL;
2630   finfo.sym_indices = NULL;
2631   finfo.outsyms = NULL;
2632   finfo.linenos = NULL;
2633   finfo.contents = NULL;
2634   finfo.external_relocs = NULL;
2635
2636   finfo.ldsym = ((struct external_ldsym *)
2637                  (xcoff_hash_table (info)->loader_section->contents
2638                   + LDHDRSZ));
2639   finfo.ldrel = ((struct external_ldrel *)
2640                  (xcoff_hash_table (info)->loader_section->contents
2641                   + LDHDRSZ
2642                   + xcoff_hash_table (info)->ldhdr.l_nsyms * LDSYMSZ));
2643
2644   xcoff_data (abfd)->coff.link_info = info;
2645
2646   finfo.strtab = _bfd_stringtab_init ();
2647   if (finfo.strtab == NULL)
2648     goto error_return;
2649
2650   /* Compute the file positions for all the sections.  */
2651   if (abfd->output_has_begun)
2652     {
2653       if (xcoff_hash_table (info)->file_align != 0)
2654         abort ();
2655     }
2656   else
2657     {
2658       bfd_vma file_align;
2659
2660       file_align = xcoff_hash_table (info)->file_align;
2661       if (file_align != 0)
2662         {
2663           boolean saw_contents;
2664           int indx;
2665           asection **op;
2666           file_ptr sofar;
2667
2668           /* Insert .pad sections before every section which has
2669              contents and is loaded, if it is preceded by some other
2670              section which has contents and is loaded.  */
2671           saw_contents = true;
2672           for (op = &abfd->sections; *op != NULL; op = &(*op)->next)
2673             {
2674               (*op)->target_index = indx;
2675               if (strcmp ((*op)->name, ".pad") == 0)
2676                 saw_contents = false;
2677               else if (((*op)->flags & SEC_HAS_CONTENTS) != 0
2678                        && ((*op)->flags & SEC_LOAD) != 0)
2679                 {
2680                   if (! saw_contents)
2681                     saw_contents = true;
2682                   else
2683                     {
2684                       asection *n, *hold;
2685
2686                       hold = *op;
2687                       *op = NULL;
2688                       n = bfd_make_section_anyway (abfd, ".pad");
2689                       BFD_ASSERT (*op == n);
2690                       n->next = hold;
2691                       n->flags = SEC_HAS_CONTENTS;
2692                       n->alignment_power = 0;
2693                       saw_contents = false;
2694                     }
2695                 }
2696             }
2697
2698           /* Reset the section indices after inserting the new
2699              sections.  */
2700           indx = 0;
2701           for (o = abfd->sections; o != NULL; o = o->next)
2702             {
2703               ++indx;
2704               o->target_index = indx;
2705             }
2706           BFD_ASSERT ((unsigned int) indx == abfd->section_count);
2707
2708           /* Work out appropriate sizes for the .pad sections to force
2709              each section to land on a page boundary.  This bit of
2710              code knows what compute_section_file_positions is going
2711              to do.  */
2712           sofar = bfd_coff_filhsz (abfd);
2713           if ((abfd->flags & EXEC_P) != 0)
2714             sofar += bfd_coff_aoutsz (abfd);
2715           else
2716             {
2717               /* FIXME.  */
2718               sofar += 28;
2719             }
2720           sofar += abfd->section_count * bfd_coff_scnhsz (abfd);
2721
2722           for (o = abfd->sections; o != NULL; o = o->next)
2723             {
2724               if (strcmp (o->name, ".pad") == 0)
2725                 {
2726                   bfd_vma pageoff;
2727
2728                   BFD_ASSERT (o->_raw_size == 0);
2729                   pageoff = sofar & (file_align - 1);
2730                   if (pageoff != 0)
2731                     {
2732                       o->_raw_size = file_align - pageoff;
2733                       sofar += file_align - pageoff;
2734                       o->flags |= SEC_HAS_CONTENTS;
2735                     }
2736                 }
2737               else
2738                 {
2739                   if ((o->flags & SEC_HAS_CONTENTS) != 0)
2740                     sofar += BFD_ALIGN (o->_raw_size,
2741                                         1 << o->alignment_power);
2742                 }
2743             }
2744         }
2745
2746       bfd_coff_compute_section_file_positions (abfd);
2747     }
2748
2749   /* Count the line numbers and relocation entries required for the
2750      output file.  Set the file positions for the relocs.  */
2751   rel_filepos = obj_relocbase (abfd);
2752   relsz = bfd_coff_relsz (abfd);
2753   max_contents_size = 0;
2754   max_lineno_count = 0;
2755   max_reloc_count = 0;
2756   for (o = abfd->sections; o != NULL; o = o->next)
2757     {
2758       o->reloc_count = 0;
2759       o->lineno_count = 0;
2760       for (p = o->link_order_head; p != NULL; p = p->next)
2761         {
2762           if (p->type == bfd_indirect_link_order)
2763             {
2764               asection *sec;
2765
2766               sec = p->u.indirect.section;
2767
2768               if (info->strip == strip_none
2769                   || info->strip == strip_some)
2770                 o->lineno_count += sec->lineno_count;
2771
2772               o->reloc_count += sec->reloc_count;
2773
2774               if (sec->_raw_size > max_contents_size)
2775                 max_contents_size = sec->_raw_size;
2776               if (sec->lineno_count > max_lineno_count)
2777                 max_lineno_count = sec->lineno_count;
2778               if (sec->reloc_count > max_reloc_count)
2779                 max_reloc_count = sec->reloc_count;
2780             }
2781           else if (p->type == bfd_section_reloc_link_order
2782                    || p->type == bfd_symbol_reloc_link_order)
2783             ++o->reloc_count;
2784         }
2785       if (o->reloc_count == 0)
2786         o->rel_filepos = 0;
2787       else
2788         {
2789           o->flags |= SEC_RELOC;
2790           o->rel_filepos = rel_filepos;
2791           rel_filepos += o->reloc_count * relsz;
2792         }
2793     }
2794
2795   /* Allocate space for the pointers we need to keep for the relocs.  */
2796   {
2797     unsigned int i;
2798
2799     /* We use section_count + 1, rather than section_count, because
2800        the target_index fields are 1 based.  */
2801     finfo.section_info = ((struct xcoff_link_section_info *)
2802                           malloc ((abfd->section_count + 1)
2803                                   * sizeof (struct xcoff_link_section_info)));
2804     if (finfo.section_info == NULL)
2805       {
2806         bfd_set_error (bfd_error_no_memory);
2807         goto error_return;
2808       }
2809     for (i = 0; i <= abfd->section_count; i++)
2810       {
2811         finfo.section_info[i].relocs = NULL;
2812         finfo.section_info[i].rel_hashes = NULL;
2813       }
2814   }
2815
2816   /* We now know the size of the relocs, so we can determine the file
2817      positions of the line numbers.  */
2818   line_filepos = rel_filepos;
2819   linesz = bfd_coff_linesz (abfd);
2820   max_output_reloc_count = 0;
2821   for (o = abfd->sections; o != NULL; o = o->next)
2822     {
2823       if (o->lineno_count == 0)
2824         o->line_filepos = 0;
2825       else
2826         {
2827           o->line_filepos = line_filepos;
2828           line_filepos += o->lineno_count * linesz;
2829         }
2830
2831       if (o->reloc_count != 0)
2832         {
2833           /* We don't know the indices of global symbols until we have
2834              written out all the local symbols.  For each section in
2835              the output file, we keep an array of pointers to hash
2836              table entries.  Each entry in the array corresponds to a
2837              reloc.  When we find a reloc against a global symbol, we
2838              set the corresponding entry in this array so that we can
2839              fix up the symbol index after we have written out all the
2840              local symbols.
2841
2842              Because of this problem, we also keep the relocs in
2843              memory until the end of the link.  This wastes memory.
2844              We could backpatch the file later, I suppose, although it
2845              would be slow.  */
2846           finfo.section_info[o->target_index].relocs =
2847             ((struct internal_reloc *)
2848              malloc (o->reloc_count * sizeof (struct internal_reloc)));
2849           finfo.section_info[o->target_index].rel_hashes =
2850             ((struct xcoff_link_hash_entry **)
2851              malloc (o->reloc_count
2852                      * sizeof (struct xcoff_link_hash_entry *)));
2853           if (finfo.section_info[o->target_index].relocs == NULL
2854               || finfo.section_info[o->target_index].rel_hashes == NULL)
2855             {
2856               bfd_set_error (bfd_error_no_memory);
2857               goto error_return;
2858             }
2859
2860           if (o->reloc_count > max_output_reloc_count)
2861             max_output_reloc_count = o->reloc_count;
2862         }
2863
2864       /* Reset the reloc and lineno counts, so that we can use them to
2865          count the number of entries we have output so far.  */
2866       o->reloc_count = 0;
2867       o->lineno_count = 0;
2868     }
2869
2870   obj_sym_filepos (abfd) = line_filepos;
2871
2872   /* Figure out the largest number of symbols in an input BFD.  Take
2873      the opportunity to clear the output_has_begun fields of all the
2874      input BFD's.  We want at least 4 symbols, since that is the
2875      number which xcoff_write_global_symbol may need.  */
2876   max_sym_count = 4;
2877   for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
2878     {
2879       size_t sz;
2880
2881       sub->output_has_begun = false;
2882       sz = obj_raw_syment_count (sub);
2883       if (sz > max_sym_count)
2884         max_sym_count = sz;
2885     }
2886
2887   /* Allocate some buffers used while linking.  */
2888   finfo.internal_syms = ((struct internal_syment *)
2889                          malloc (max_sym_count
2890                                  * sizeof (struct internal_syment)));
2891   finfo.sym_indices = (long *) malloc (max_sym_count * sizeof (long));
2892   finfo.outsyms = ((bfd_byte *)
2893                    malloc ((size_t) ((max_sym_count + 1) * symesz)));
2894   finfo.linenos = (bfd_byte *) malloc (max_lineno_count
2895                                        * bfd_coff_linesz (abfd));
2896   finfo.contents = (bfd_byte *) malloc (max_contents_size);
2897   finfo.external_relocs = (bfd_byte *) malloc (max_reloc_count * relsz);
2898   if ((finfo.internal_syms == NULL && max_sym_count > 0)
2899       || (finfo.sym_indices == NULL && max_sym_count > 0)
2900       || finfo.outsyms == NULL
2901       || (finfo.linenos == NULL && max_lineno_count > 0)
2902       || (finfo.contents == NULL && max_contents_size > 0)
2903       || (finfo.external_relocs == NULL && max_reloc_count > 0))
2904     {
2905       bfd_set_error (bfd_error_no_memory);
2906       goto error_return;
2907     }
2908
2909   obj_raw_syment_count (abfd) = 0;
2910   xcoff_data (abfd)->toc = (bfd_vma) -1;
2911
2912   /* We now know the position of everything in the file, except that
2913      we don't know the size of the symbol table and therefore we don't
2914      know where the string table starts.  We just build the string
2915      table in memory as we go along.  We process all the relocations
2916      for a single input file at once.  */
2917   for (o = abfd->sections; o != NULL; o = o->next)
2918     {
2919       for (p = o->link_order_head; p != NULL; p = p->next)
2920         {
2921           if (p->type == bfd_indirect_link_order
2922               && p->u.indirect.section->owner->xvec == abfd->xvec)
2923             {
2924               sub = p->u.indirect.section->owner;
2925               if (! sub->output_has_begun)
2926                 {
2927                   if (! xcoff_link_input_bfd (&finfo, sub))
2928                     goto error_return;
2929                   sub->output_has_begun = true;
2930                 }
2931             }
2932           else if (p->type == bfd_section_reloc_link_order
2933                    || p->type == bfd_symbol_reloc_link_order)
2934             {
2935               if (! xcoff_reloc_link_order (abfd, &finfo, o, p))
2936                 goto error_return;
2937             }
2938           else
2939             {
2940               if (! _bfd_default_link_order (abfd, info, o, p))
2941                 goto error_return;
2942             }
2943         }
2944     }
2945
2946   /* Free up the buffers used by xcoff_link_input_bfd.  */
2947
2948   if (finfo.internal_syms != NULL)
2949     {
2950       free (finfo.internal_syms);
2951       finfo.internal_syms = NULL;
2952     }
2953   if (finfo.sym_indices != NULL)
2954     {
2955       free (finfo.sym_indices);
2956       finfo.sym_indices = NULL;
2957     }
2958   if (finfo.linenos != NULL)
2959     {
2960       free (finfo.linenos);
2961       finfo.linenos = NULL;
2962     }
2963   if (finfo.contents != NULL)
2964     {
2965       free (finfo.contents);
2966       finfo.contents = NULL;
2967     }
2968   if (finfo.external_relocs != NULL)
2969     {
2970       free (finfo.external_relocs);
2971       finfo.external_relocs = NULL;
2972     }
2973
2974   /* The value of the last C_FILE symbol is supposed to be -1.  Write
2975      it out again.  */
2976   if (finfo.last_file_index != -1)
2977     {
2978       finfo.last_file.n_value = -1;
2979       bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file,
2980                              (PTR) finfo.outsyms);
2981       if (bfd_seek (abfd,
2982                     (obj_sym_filepos (abfd)
2983                      + finfo.last_file_index * symesz),
2984                     SEEK_SET) != 0
2985           || bfd_write (finfo.outsyms, symesz, 1, abfd) != symesz)
2986         goto error_return;
2987     }
2988
2989   /* Write out all the global symbols which do not come from XCOFF
2990      input files.  */
2991   xcoff_link_hash_traverse (xcoff_hash_table (info),
2992                             xcoff_write_global_symbol,
2993                             (PTR) &finfo);
2994
2995   if (finfo.outsyms != NULL)
2996     {
2997       free (finfo.outsyms);
2998       finfo.outsyms = NULL;
2999     }
3000
3001   /* Now that we have written out all the global symbols, we know the
3002      symbol indices to use for relocs against them, and we can finally
3003      write out the relocs.  */
3004   external_relocs = (bfd_byte *) malloc (max_output_reloc_count * relsz);
3005   if (external_relocs == NULL && max_output_reloc_count != 0)
3006     {
3007       bfd_set_error (bfd_error_no_memory);
3008       goto error_return;
3009     }
3010
3011   for (o = abfd->sections; o != NULL; o = o->next)
3012     {
3013       struct internal_reloc *irel;
3014       struct internal_reloc *irelend;
3015       struct xcoff_link_hash_entry **rel_hash;
3016       bfd_byte *erel;
3017
3018       if (o->reloc_count == 0)
3019         continue;
3020
3021       irel = finfo.section_info[o->target_index].relocs;
3022       irelend = irel + o->reloc_count;
3023       rel_hash = finfo.section_info[o->target_index].rel_hashes;
3024       for (; irel < irelend; irel++, rel_hash++, erel += relsz)
3025         {
3026           if (*rel_hash != NULL)
3027             {
3028               if ((*rel_hash)->indx < 0)
3029                 {
3030                   if (! ((*info->callbacks->unattached_reloc)
3031                          (info, (*rel_hash)->root.root.string,
3032                           (bfd *) NULL, o, irel->r_vaddr)))
3033                     goto error_return;
3034                   (*rel_hash)->indx = 0;
3035                 }
3036               irel->r_symndx = (*rel_hash)->indx;
3037             }
3038         }
3039
3040       /* XCOFF requires that the relocs be sorted by address.  We tend
3041          to produce them in the order in which their containing csects
3042          appear in the symbol table, which is not necessarily by
3043          address.  So we sort them here.  There may be a better way to
3044          do this.  */
3045       qsort ((PTR) finfo.section_info[o->target_index].relocs,
3046              o->reloc_count, sizeof (struct internal_reloc),
3047              xcoff_sort_relocs);
3048
3049       irel = finfo.section_info[o->target_index].relocs;
3050       irelend = irel + o->reloc_count;
3051       erel = external_relocs;
3052       for (; irel < irelend; irel++, rel_hash++, erel += relsz)
3053         bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel);
3054
3055       if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
3056           || bfd_write ((PTR) external_relocs, relsz, o->reloc_count,
3057                         abfd) != relsz * o->reloc_count)
3058         goto error_return;
3059     }
3060
3061   if (external_relocs != NULL)
3062     {
3063       free (external_relocs);
3064       external_relocs = NULL;
3065     }
3066
3067   /* Free up the section information.  */
3068   if (finfo.section_info != NULL)
3069     {
3070       unsigned int i;
3071
3072       for (i = 0; i < abfd->section_count; i++)
3073         {
3074           if (finfo.section_info[i].relocs != NULL)
3075             free (finfo.section_info[i].relocs);
3076           if (finfo.section_info[i].rel_hashes != NULL)
3077             free (finfo.section_info[i].rel_hashes);
3078         }
3079       free (finfo.section_info);
3080       finfo.section_info = NULL;
3081     }
3082
3083   /* Write out the loader section contents.  */
3084   BFD_ASSERT ((bfd_byte *) finfo.ldrel
3085               == (xcoff_hash_table (info)->loader_section->contents
3086                   + xcoff_hash_table (info)->ldhdr.l_impoff));
3087   o = xcoff_hash_table (info)->loader_section;
3088   if (! bfd_set_section_contents (abfd, o->output_section,
3089                                   o->contents, o->output_offset,
3090                                   o->_raw_size))
3091     goto error_return;
3092
3093   /* Write out the global linkage section and the toc section.  */
3094   o = xcoff_hash_table (info)->linkage_section;
3095   if (o->_raw_size > 0
3096       && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
3097                                      o->output_offset, o->_raw_size))
3098     goto error_return;
3099   o = xcoff_hash_table (info)->toc_section;
3100   if (o->_raw_size > 0
3101       && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
3102                                      o->output_offset, o->_raw_size))
3103     goto error_return;
3104
3105   /* Write out the string table.  */
3106   if (bfd_seek (abfd,
3107                 (obj_sym_filepos (abfd)
3108                  + obj_raw_syment_count (abfd) * symesz),
3109                 SEEK_SET) != 0)
3110     goto error_return;
3111   bfd_h_put_32 (abfd,
3112                 _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE,
3113                 (bfd_byte *) strbuf);
3114   if (bfd_write (strbuf, 1, STRING_SIZE_SIZE, abfd) != STRING_SIZE_SIZE)
3115     goto error_return;
3116   if (! _bfd_stringtab_emit (abfd, finfo.strtab))
3117     goto error_return;
3118
3119   _bfd_stringtab_free (finfo.strtab);
3120
3121   /* Write out the debugging string table.  */
3122   o = xcoff_hash_table (info)->debug_section;
3123   if (o != NULL)
3124     {
3125       struct bfd_strtab_hash *debug_strtab;
3126
3127       debug_strtab = xcoff_hash_table (info)->debug_strtab;
3128       BFD_ASSERT (o->output_section->_raw_size - o->output_offset
3129                   >= _bfd_stringtab_size (debug_strtab));
3130       if (bfd_seek (abfd,
3131                     o->output_section->filepos + o->output_offset,
3132                     SEEK_SET) != 0)
3133         goto error_return;
3134       if (! _bfd_stringtab_emit (abfd, debug_strtab))
3135         goto error_return;
3136     }
3137
3138   /* Setting bfd_get_symcount to 0 will cause write_object_contents to
3139      not try to write out the symbols.  */
3140   bfd_get_symcount (abfd) = 0;
3141
3142   return true;
3143
3144  error_return:
3145   if (finfo.strtab != NULL)
3146     _bfd_stringtab_free (finfo.strtab);
3147   if (finfo.section_info != NULL)
3148     {
3149       unsigned int i;
3150
3151       for (i = 0; i < abfd->section_count; i++)
3152         {
3153           if (finfo.section_info[i].relocs != NULL)
3154             free (finfo.section_info[i].relocs);
3155           if (finfo.section_info[i].rel_hashes != NULL)
3156             free (finfo.section_info[i].rel_hashes);
3157         }
3158       free (finfo.section_info);
3159     }
3160   if (finfo.internal_syms != NULL)
3161     free (finfo.internal_syms);
3162   if (finfo.sym_indices != NULL)
3163     free (finfo.sym_indices);
3164   if (finfo.outsyms != NULL)
3165     free (finfo.outsyms);
3166   if (finfo.linenos != NULL)
3167     free (finfo.linenos);
3168   if (finfo.contents != NULL)
3169     free (finfo.contents);
3170   if (finfo.external_relocs != NULL)
3171     free (finfo.external_relocs);
3172   if (external_relocs != NULL)
3173     free (external_relocs);
3174   return false;
3175 }
3176
3177 /* Link an input file into the linker output file.  This function
3178    handles all the sections and relocations of the input file at once.  */
3179
3180 static boolean
3181 xcoff_link_input_bfd (finfo, input_bfd)
3182      struct xcoff_final_link_info *finfo;
3183      bfd *input_bfd;
3184 {
3185   bfd *output_bfd;
3186   const char *strings;
3187   bfd_size_type syment_base;
3188   unsigned int n_tmask;
3189   unsigned int n_btshft;
3190   boolean copy, hash;
3191   bfd_size_type isymesz;
3192   bfd_size_type osymesz;
3193   bfd_size_type linesz;
3194   bfd_byte *esym;
3195   bfd_byte *esym_end;
3196   struct internal_syment *isymp;
3197   asection **csectpp;
3198   unsigned long *debug_index;
3199   long *indexp;
3200   unsigned long output_index;
3201   bfd_byte *outsym;
3202   struct xcoff_link_hash_entry **sym_hash;
3203   boolean keep_syms;
3204   asection *o;
3205
3206   /* We can just skip DYNAMIC files, unless this is a static link.  */
3207   if ((input_bfd->flags & DYNAMIC) != 0
3208       && ! finfo->info->static_link)
3209     return true;
3210
3211   /* Move all the symbols to the output file.  */
3212
3213   output_bfd = finfo->output_bfd;
3214   strings = NULL;
3215   syment_base = obj_raw_syment_count (output_bfd);
3216   isymesz = bfd_coff_symesz (input_bfd);
3217   osymesz = bfd_coff_symesz (output_bfd);
3218   linesz = bfd_coff_linesz (input_bfd);
3219   BFD_ASSERT (linesz == bfd_coff_linesz (output_bfd));
3220
3221   n_tmask = coff_data (input_bfd)->local_n_tmask;
3222   n_btshft = coff_data (input_bfd)->local_n_btshft;
3223
3224   /* Define macros so that ISFCN, et. al., macros work correctly.  */
3225 #define N_TMASK n_tmask
3226 #define N_BTSHFT n_btshft
3227
3228   copy = false;
3229   if (! finfo->info->keep_memory)
3230     copy = true;
3231   hash = true;
3232   if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
3233     hash = false;
3234
3235   if (! _bfd_coff_get_external_symbols (input_bfd))
3236     return false;
3237
3238   esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
3239   esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
3240   sym_hash = obj_xcoff_sym_hashes (input_bfd);
3241   csectpp = xcoff_data (input_bfd)->csects;
3242   debug_index = xcoff_data (input_bfd)->debug_indices;
3243   isymp = finfo->internal_syms;
3244   indexp = finfo->sym_indices;
3245   output_index = syment_base;
3246   outsym = finfo->outsyms;
3247
3248   while (esym < esym_end)
3249     {
3250       struct internal_syment isym;
3251       union internal_auxent aux;
3252       int smtyp = 0;
3253       boolean skip;
3254       boolean require;
3255       int add;
3256
3257       bfd_coff_swap_sym_in (input_bfd, (PTR) esym, (PTR) isymp);
3258
3259       /* If this is a C_EXT or C_HIDEXT symbol, we need the csect
3260          information.  */
3261       if (isymp->n_sclass == C_EXT || isymp->n_sclass == C_HIDEXT)
3262         {
3263           BFD_ASSERT (isymp->n_numaux > 0);
3264           bfd_coff_swap_aux_in (input_bfd,
3265                                 (PTR) (esym + isymesz * isymp->n_numaux),
3266                                 isymp->n_type, isymp->n_sclass,
3267                                 isymp->n_numaux - 1, isymp->n_numaux,
3268                                 (PTR) &aux);
3269           smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp);
3270         }
3271
3272       /* Make a copy of *isymp so that the relocate_section function
3273          always sees the original values.  This is more reliable than
3274          always recomputing the symbol value even if we are stripping
3275          the symbol.  */
3276       isym = *isymp;
3277
3278       /* If this symbol is in the .loader section, swap out the
3279          .loader symbol information.  If this is an external symbol
3280          reference to a defined symbol, though, then wait until we get
3281          to the definition.  */
3282       if (isym.n_sclass == C_EXT
3283           && *sym_hash != NULL
3284           && (*sym_hash)->ldsym != NULL
3285           && (smtyp != XTY_ER
3286               || (*sym_hash)->root.type == bfd_link_hash_undefined))
3287         {
3288           struct xcoff_link_hash_entry *h;
3289           struct internal_ldsym *ldsym;
3290
3291           h = *sym_hash;
3292           ldsym = h->ldsym;
3293           if (isym.n_scnum > 0)
3294             {
3295               ldsym->l_scnum = (*csectpp)->output_section->target_index;
3296               ldsym->l_value = (isym.n_value
3297                                 + (*csectpp)->output_section->vma
3298                                 + (*csectpp)->output_offset
3299                                 - (*csectpp)->vma);
3300             }
3301           else
3302             {
3303               ldsym->l_scnum = isym.n_scnum;
3304               ldsym->l_value = isym.n_value;
3305             }
3306
3307           ldsym->l_smtype = smtyp;
3308           if (((h->flags & XCOFF_DEF_REGULAR) == 0
3309                && (h->flags & XCOFF_REF_DYNAMIC) != 0)
3310               || (h->flags & XCOFF_IMPORT) != 0)
3311             ldsym->l_smtype |= L_IMPORT;
3312           if (((h->flags & XCOFF_DEF_REGULAR) != 0
3313                && (h->flags & XCOFF_REF_DYNAMIC) != 0)
3314               || (h->flags & XCOFF_EXPORT) != 0)
3315             ldsym->l_smtype |= L_EXPORT;
3316           if ((h->flags & XCOFF_ENTRY) != 0)
3317             ldsym->l_smtype |= L_ENTRY;
3318
3319           ldsym->l_smclas = aux.x_csect.x_smclas;
3320
3321           if (ldsym->l_ifile == (bfd_size_type) -1)
3322             ldsym->l_ifile = 0;
3323           else if (ldsym->l_ifile == 0)
3324             {
3325               if ((ldsym->l_smtype & L_IMPORT) == 0)
3326                 ldsym->l_ifile = 0;
3327               else
3328                 {
3329                   bfd *impbfd;
3330
3331                   if (h->root.type == bfd_link_hash_defined
3332                       || h->root.type == bfd_link_hash_defweak)
3333                     impbfd = h->root.u.def.section->owner;
3334                   else if (h->root.type == bfd_link_hash_undefined
3335                            || h->root.type == bfd_link_hash_undefweak)
3336                     impbfd = h->root.u.undef.abfd;
3337                   else
3338                     impbfd = NULL;
3339
3340                   if (impbfd == NULL)
3341                     ldsym->l_ifile = 0;
3342                   else
3343                     {
3344                       BFD_ASSERT (impbfd->xvec == finfo->output_bfd->xvec);
3345                       ldsym->l_ifile = xcoff_data (impbfd)->import_file_id;
3346                     }
3347                 }
3348             }
3349
3350           ldsym->l_parm = 0;
3351
3352           BFD_ASSERT (h->ldindx >= 0);
3353           BFD_ASSERT (LDSYMSZ == sizeof (struct external_ldsym));
3354           xcoff_swap_ldsym_out (finfo->output_bfd, ldsym,
3355                                 finfo->ldsym + h->ldindx - 3);
3356           h->ldsym = NULL;
3357         }
3358
3359       *indexp = -1;
3360
3361       skip = false;
3362       require = false;
3363       add = 1 + isym.n_numaux;
3364
3365       /* If we are skipping this csect, we want to skip this symbol.  */
3366       if (*csectpp == NULL)
3367         skip = true;
3368
3369       /* If we garbage collected this csect, we want to skip this
3370          symbol.  */
3371       if (! skip
3372           && xcoff_hash_table (finfo->info)->gc
3373           && ((*csectpp)->flags & SEC_MARK) == 0
3374           && *csectpp != bfd_abs_section_ptr)
3375         skip = true;
3376
3377       /* An XCOFF linker always skips C_STAT symbols.  */
3378       if (! skip
3379           && isymp->n_sclass == C_STAT)
3380         skip = true;
3381
3382       /* We skip all but the first TOC anchor.  */
3383       if (! skip
3384           && isymp->n_sclass == C_HIDEXT
3385           && aux.x_csect.x_smclas == XMC_TC0)
3386         {
3387           if (finfo->toc_symindx != -1)
3388             skip = true;
3389           else
3390             {
3391               finfo->toc_symindx = output_index;
3392               xcoff_data (finfo->output_bfd)->toc =
3393                 ((*csectpp)->output_section->vma
3394                  + (*csectpp)->output_offset
3395                  + isym.n_value
3396                  - (*csectpp)->vma);
3397               require = true;
3398             }
3399         }
3400
3401       /* If we are stripping all symbols, we want to skip this one.  */
3402       if (! skip
3403           && finfo->info->strip == strip_all)
3404         skip = true;
3405
3406       /* We can skip resolved external references.  */
3407       if (! skip
3408           && isym.n_sclass == C_EXT
3409           && smtyp == XTY_ER
3410           && (*sym_hash)->root.type != bfd_link_hash_undefined)
3411         skip = true;
3412
3413       /* We can skip common symbols if they got defined somewhere
3414          else.  */
3415       if (! skip
3416           && isym.n_sclass == C_EXT
3417           && smtyp == XTY_CM
3418           && ((*sym_hash)->flags & XCOFF_DEF_REGULAR) != 0)
3419         skip = true;
3420
3421       /* Skip local symbols if we are discarding them.  */
3422       if (! skip
3423           && finfo->info->discard == discard_all
3424           && isym.n_sclass != C_EXT
3425           && (isym.n_sclass != C_HIDEXT
3426               || smtyp != XTY_SD))
3427         skip = true;
3428
3429       /* If we stripping debugging symbols, and this is a debugging
3430          symbol, then skip it.  */
3431       if (! skip
3432           && finfo->info->strip == strip_debugger
3433           && isym.n_scnum == N_DEBUG)
3434         skip = true;
3435
3436       /* If some symbols are stripped based on the name, work out the
3437          name and decide whether to skip this symbol.  We don't handle
3438          this correctly for symbols whose names are in the .debug
3439          section; to get it right we would need a new bfd_strtab_hash
3440          function to return the string given the index.  */
3441       if (! skip
3442           && (finfo->info->strip == strip_some
3443               || finfo->info->discard == discard_l)
3444           && (debug_index == NULL || *debug_index == (unsigned long) -1))
3445         {
3446           const char *name;
3447           char buf[SYMNMLEN + 1];
3448
3449           name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
3450           if (name == NULL)
3451             return false;
3452
3453           if ((finfo->info->strip == strip_some
3454                && (bfd_hash_lookup (finfo->info->keep_hash, name, false,
3455                                     false) == NULL))
3456               || (finfo->info->discard == discard_l
3457                   && (isym.n_sclass != C_EXT
3458                       && (isym.n_sclass != C_HIDEXT
3459                           || smtyp != XTY_SD))
3460                   && strncmp (name, finfo->info->lprefix,
3461                               finfo->info->lprefix_len) == 0))
3462             skip = true;
3463         }
3464
3465       /* On the other hand, we can't skip global symbols which have
3466          relocs against them.  */
3467       if (skip
3468           && isym.n_sclass == C_EXT
3469           && (*sym_hash)->indx == -2
3470           && finfo->info->strip != strip_all)
3471         skip = false;
3472
3473       /* We can not skip the first TOC anchor.  */
3474       if (skip
3475           && require
3476           && finfo->info->strip != strip_all)
3477         skip = false;
3478
3479       /* We now know whether we are to skip this symbol or not.  */
3480       if (! skip)
3481         {
3482           /* Adjust the symbol in order to output it.  */
3483
3484           if (isym._n._n_n._n_zeroes == 0
3485               && isym._n._n_n._n_offset != 0)
3486             {
3487               /* This symbol has a long name.  Enter it in the string
3488                  table we are building.  If *debug_index != -1, the
3489                  name has already been entered in the .debug section.  */
3490               if (debug_index != NULL && *debug_index != (unsigned long) -1)
3491                 isym._n._n_n._n_offset = *debug_index;
3492               else
3493                 {
3494                   const char *name;
3495                   bfd_size_type indx;
3496
3497                   name = _bfd_coff_internal_syment_name (input_bfd, &isym,
3498                                                          (char *) NULL);
3499                   if (name == NULL)
3500                     return false;
3501                   indx = _bfd_stringtab_add (finfo->strtab, name, hash, copy);
3502                   if (indx == (bfd_size_type) -1)
3503                     return false;
3504                   isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
3505                 }
3506             }
3507
3508           if (isym.n_sclass == C_BSTAT)
3509             {
3510               unsigned long indx;
3511
3512               /* The value of a C_BSTAT symbol is the symbol table
3513                  index of the containing csect.  */
3514
3515               indx = isym.n_value;
3516               if (indx < obj_raw_syment_count (input_bfd))
3517                 {
3518                   long symindx;
3519
3520                   symindx = finfo->sym_indices[indx];
3521                   if (symindx < 0)
3522                     isym.n_value = 0;
3523                   else
3524                     isym.n_value = symindx;
3525                 }
3526             }
3527           else if (isym.n_scnum > 0)
3528             {
3529               isym.n_scnum = (*csectpp)->output_section->target_index;
3530               isym.n_value += ((*csectpp)->output_section->vma
3531                                + (*csectpp)->output_offset
3532                                - (*csectpp)->vma);
3533             }
3534
3535           /* The value of a C_FILE symbol is the symbol index of the
3536              next C_FILE symbol.  The value of the last C_FILE symbol
3537              is -1.  We try to get this right, below, just before we
3538              write the symbols out, but in the general case we may
3539              have to write the symbol out twice.  */
3540           if (isym.n_sclass == C_FILE)
3541             {
3542               if (finfo->last_file_index != -1
3543                   && finfo->last_file.n_value != (long) output_index)
3544                 {
3545                   /* We must correct the value of the last C_FILE entry.  */
3546                   finfo->last_file.n_value = output_index;
3547                   if ((bfd_size_type) finfo->last_file_index >= syment_base)
3548                     {
3549                       /* The last C_FILE symbol is in this input file.  */
3550                       bfd_coff_swap_sym_out (output_bfd,
3551                                              (PTR) &finfo->last_file,
3552                                              (PTR) (finfo->outsyms
3553                                                     + ((finfo->last_file_index
3554                                                         - syment_base)
3555                                                        * osymesz)));
3556                     }
3557                   else
3558                     {
3559                       /* We have already written out the last C_FILE
3560                          symbol.  We need to write it out again.  We
3561                          borrow *outsym temporarily.  */
3562                       bfd_coff_swap_sym_out (output_bfd,
3563                                              (PTR) &finfo->last_file,
3564                                              (PTR) outsym);
3565                       if (bfd_seek (output_bfd,
3566                                     (obj_sym_filepos (output_bfd)
3567                                      + finfo->last_file_index * osymesz),
3568                                     SEEK_SET) != 0
3569                           || (bfd_write (outsym, osymesz, 1, output_bfd)
3570                               != osymesz))
3571                         return false;
3572                     }
3573                 }
3574
3575               finfo->last_file_index = output_index;
3576               finfo->last_file = isym;
3577             }
3578
3579           /* Output the symbol.  */
3580
3581           bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym);
3582
3583           *indexp = output_index;
3584
3585           if (isym.n_sclass == C_EXT)
3586             {
3587               long indx;
3588               struct xcoff_link_hash_entry *h;
3589
3590               indx = ((esym - (bfd_byte *) obj_coff_external_syms (input_bfd))
3591                       / isymesz);
3592               h = obj_xcoff_sym_hashes (input_bfd)[indx];
3593               BFD_ASSERT (h != NULL);
3594               h->indx = output_index;
3595             }
3596
3597           output_index += add;
3598           outsym += add * osymesz;
3599         }
3600
3601       esym += add * isymesz;
3602       isymp += add;
3603       csectpp += add;
3604       sym_hash += add;
3605       if (debug_index != NULL)
3606         debug_index += add;
3607       ++indexp;
3608       for (--add; add > 0; --add)
3609         *indexp++ = -1;
3610     }
3611
3612   /* Fix up the aux entries.  This must be done in a separate pass,
3613      because we don't know the correct symbol indices until we have
3614      already decided which symbols we are going to keep.  */
3615
3616   esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
3617   esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
3618   isymp = finfo->internal_syms;
3619   indexp = finfo->sym_indices;
3620   csectpp = xcoff_data (input_bfd)->csects;
3621   outsym = finfo->outsyms;
3622   while (esym < esym_end)
3623     {
3624       int add;
3625
3626       add = 1 + isymp->n_numaux;
3627
3628       if (*indexp < 0)
3629         esym += add * isymesz;
3630       else
3631         {
3632           int i;
3633
3634           esym += isymesz;
3635           outsym += osymesz;
3636
3637           for (i = 0; i < isymp->n_numaux && esym < esym_end; i++)
3638             {
3639               union internal_auxent aux;
3640
3641               bfd_coff_swap_aux_in (input_bfd, (PTR) esym, isymp->n_type,
3642                                     isymp->n_sclass, i, isymp->n_numaux,
3643                                     (PTR) &aux);
3644
3645               if (isymp->n_sclass == C_FILE)
3646                 {
3647                   /* This is the file name (or some comment put in by
3648                      the compiler).  If it is long, we must put it in
3649                      the string table.  */
3650                   if (aux.x_file.x_n.x_zeroes == 0
3651                       && aux.x_file.x_n.x_offset != 0)
3652                     {
3653                       const char *filename;
3654                       bfd_size_type indx;
3655
3656                       BFD_ASSERT (aux.x_file.x_n.x_offset
3657                                   >= STRING_SIZE_SIZE);
3658                       if (strings == NULL)
3659                         {
3660                           strings = _bfd_coff_read_string_table (input_bfd);
3661                           if (strings == NULL)
3662                             return false;
3663                         }
3664                       filename = strings + aux.x_file.x_n.x_offset;
3665                       indx = _bfd_stringtab_add (finfo->strtab, filename,
3666                                                  hash, copy);
3667                       if (indx == (bfd_size_type) -1)
3668                         return false;
3669                       aux.x_file.x_n.x_offset = STRING_SIZE_SIZE + indx;
3670                     }
3671                 }
3672               else if ((isymp->n_sclass == C_EXT
3673                         || isymp->n_sclass == C_HIDEXT)
3674                        && i + 1 == isymp->n_numaux)
3675                 {
3676                   /* We don't support type checking.  I don't know if
3677                      anybody does.  */
3678                   aux.x_csect.x_parmhash = 0;
3679                   /* I don't think anybody uses these fields, but we'd
3680                      better clobber them just in case.  */
3681                   aux.x_csect.x_stab = 0;
3682                   aux.x_csect.x_snstab = 0;
3683                   if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_LD)
3684                     {
3685                       unsigned long indx;
3686
3687                       indx = aux.x_csect.x_scnlen.l;
3688                       if (indx < obj_raw_syment_count (input_bfd))
3689                         {
3690                           long symindx;
3691
3692                           symindx = finfo->sym_indices[indx];
3693                           if (symindx < 0)
3694                             aux.x_sym.x_tagndx.l = 0;
3695                           else
3696                             aux.x_sym.x_tagndx.l = symindx;
3697                         }
3698                     }
3699                 }
3700               else if (isymp->n_sclass != C_STAT || isymp->n_type != T_NULL)
3701                 {
3702                   unsigned long indx;
3703
3704                   if (ISFCN (isymp->n_type)
3705                       || ISTAG (isymp->n_sclass)
3706                       || isymp->n_sclass == C_BLOCK)
3707                     {
3708                       indx = aux.x_sym.x_fcnary.x_fcn.x_endndx.l;
3709                       if (indx > 0
3710                           && indx < obj_raw_syment_count (input_bfd))
3711                         {
3712                           /* We look forward through the symbol for
3713                              the index of the next symbol we are going
3714                              to include.  I don't know if this is
3715                              entirely right.  */
3716                           while (finfo->sym_indices[indx] < 0
3717                                  && indx < obj_raw_syment_count (input_bfd))
3718                             ++indx;
3719                           if (indx >= obj_raw_syment_count (input_bfd))
3720                             indx = output_index;
3721                           else
3722                             indx = finfo->sym_indices[indx];
3723                           aux.x_sym.x_fcnary.x_fcn.x_endndx.l = indx;
3724                         }
3725                     }
3726
3727                   indx = aux.x_sym.x_tagndx.l;
3728                   if (indx > 0 && indx < obj_raw_syment_count (input_bfd))
3729                     {
3730                       long symindx;
3731
3732                       symindx = finfo->sym_indices[indx];
3733                       if (symindx < 0)
3734                         aux.x_sym.x_tagndx.l = 0;
3735                       else
3736                         aux.x_sym.x_tagndx.l = symindx;
3737                     }
3738                 }
3739
3740               /* Copy over the line numbers, unless we are stripping
3741                  them.  We do this on a symbol by symbol basis in
3742                  order to more easily handle garbage collection.  */
3743               if ((isymp->n_sclass == C_EXT
3744                    || isymp->n_sclass == C_HIDEXT)
3745                   && i == 0
3746                   && isymp->n_numaux > 1
3747                   && ISFCN (isymp->n_type)
3748                   && aux.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0)
3749                 {
3750                   if (finfo->info->strip != strip_none
3751                       && finfo->info->strip != strip_some)
3752                     aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0;
3753                   else
3754                     {
3755                       asection *enclosing;
3756                       bfd_size_type linoff;
3757                       struct internal_lineno lin;
3758
3759                       o = *csectpp;
3760                       enclosing = xcoff_section_data (abfd, o)->enclosing;
3761                       linoff = (aux.x_sym.x_fcnary.x_fcn.x_lnnoptr
3762                                 - enclosing->line_filepos);
3763
3764                       if (bfd_seek (input_bfd,
3765                                     enclosing->line_filepos + linoff,
3766                                     SEEK_SET != 0)
3767                           || (bfd_read (finfo->linenos, linesz,
3768                                         o->lineno_count, input_bfd)
3769                               != linesz * o->lineno_count))
3770                         return false;
3771
3772                       bfd_coff_swap_lineno_in (input_bfd,
3773                                                (PTR) finfo->linenos,
3774                                                (PTR) &lin);
3775                       if (lin.l_lnno != 0
3776                           || ((bfd_size_type) lin.l_addr.l_symndx
3777                               != ((esym
3778                                    - isymesz
3779                                    - ((bfd_byte *)
3780                                       obj_coff_external_syms (input_bfd)))
3781                                   / isymesz)))
3782                         aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0;
3783                       else
3784                         {
3785                           bfd_byte *linpend, *linp;
3786                           bfd_vma offset;
3787                           bfd_size_type count;
3788
3789                           lin.l_addr.l_symndx = *indexp;
3790                           bfd_coff_swap_lineno_out (output_bfd, (PTR) &lin,
3791                                                     (PTR) finfo->linenos);
3792
3793                           linpend = (finfo->linenos
3794                                      + o->lineno_count * linesz);
3795                           offset = (o->output_section->vma
3796                                     + o->output_offset
3797                                     - o->vma);
3798                           for (linp = finfo->linenos + linesz;
3799                                linp < linpend;
3800                                linp += linesz)
3801                             {
3802                               bfd_coff_swap_lineno_in (input_bfd, (PTR) linp,
3803                                                        (PTR) &lin);
3804                               if (lin.l_lnno == 0)
3805                                 break;
3806                               lin.l_addr.l_paddr += offset;
3807                               bfd_coff_swap_lineno_out (output_bfd,
3808                                                         (PTR) &lin,
3809                                                         (PTR) linp);
3810                             }
3811
3812                           count = (linp - finfo->linenos) / linesz;
3813
3814                           aux.x_sym.x_fcnary.x_fcn.x_lnnoptr =
3815                             (o->output_section->line_filepos
3816                              + o->output_section->lineno_count * linesz);
3817
3818                           if (bfd_seek (output_bfd,
3819                                         aux.x_sym.x_fcnary.x_fcn.x_lnnoptr,
3820                                         SEEK_SET) != 0
3821                               || (bfd_write (finfo->linenos, linesz, count,
3822                                              output_bfd)
3823                                   != linesz * count))
3824                             return false;
3825
3826                           o->output_section->lineno_count += count;
3827                         }
3828                     }
3829                 }
3830
3831               bfd_coff_swap_aux_out (output_bfd, (PTR) &aux, isymp->n_type,
3832                                      isymp->n_sclass, i, isymp->n_numaux,
3833                                      (PTR) outsym);
3834               outsym += osymesz;
3835               esym += isymesz;
3836             }
3837         }
3838
3839       indexp += add;
3840       isymp += add;
3841       csectpp += add;
3842     }
3843
3844   /* If we swapped out a C_FILE symbol, guess that the next C_FILE
3845      symbol will be the first symbol in the next input file.  In the
3846      normal case, this will save us from writing out the C_FILE symbol
3847      again.  */
3848   if (finfo->last_file_index != -1
3849       && (bfd_size_type) finfo->last_file_index >= syment_base)
3850     {
3851       finfo->last_file.n_value = output_index;
3852       bfd_coff_swap_sym_out (output_bfd, (PTR) &finfo->last_file,
3853                              (PTR) (finfo->outsyms
3854                                     + ((finfo->last_file_index - syment_base)
3855                                        * osymesz)));
3856     }
3857
3858   /* Write the modified symbols to the output file.  */
3859   if (outsym > finfo->outsyms)
3860     {
3861       if (bfd_seek (output_bfd,
3862                     obj_sym_filepos (output_bfd) + syment_base * osymesz,
3863                     SEEK_SET) != 0
3864           || (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1,
3865                         output_bfd)
3866               != (bfd_size_type) (outsym - finfo->outsyms)))
3867         return false;
3868
3869       BFD_ASSERT ((obj_raw_syment_count (output_bfd)
3870                    + (outsym - finfo->outsyms) / osymesz)
3871                   == output_index);
3872
3873       obj_raw_syment_count (output_bfd) = output_index;
3874     }
3875
3876   /* Don't let the linker relocation routines discard the symbols.  */
3877   keep_syms = obj_coff_keep_syms (input_bfd);
3878   obj_coff_keep_syms (input_bfd) = true;
3879
3880   /* Relocate the contents of each section.  */
3881   for (o = input_bfd->sections; o != NULL; o = o->next)
3882     {
3883       bfd_byte *contents;
3884
3885       if ((o->flags & SEC_HAS_CONTENTS) == 0
3886           || o->_raw_size == 0
3887           || (o->flags & SEC_IN_MEMORY) != 0)
3888         continue;
3889
3890       /* We have set filepos correctly for the sections we created to
3891          represent csects, so bfd_get_section_contents should work.  */
3892       if (coff_section_data (input_bfd, o) != NULL
3893           && coff_section_data (input_bfd, o)->contents != NULL)
3894         contents = coff_section_data (input_bfd, o)->contents;
3895       else
3896         {
3897           if (! bfd_get_section_contents (input_bfd, o, finfo->contents,
3898                                           (file_ptr) 0, o->_raw_size))
3899             return false;
3900           contents = finfo->contents;
3901         }
3902
3903       if ((o->flags & SEC_RELOC) != 0)
3904         {
3905           int target_index;
3906           struct internal_reloc *internal_relocs;
3907           struct internal_reloc *irel;
3908           bfd_vma offset;
3909           struct internal_reloc *irelend;
3910           struct xcoff_link_hash_entry **rel_hash;
3911           long r_symndx;
3912
3913           /* Read in the relocs.  */
3914           target_index = o->output_section->target_index;
3915           internal_relocs = (xcoff_read_internal_relocs
3916                              (input_bfd, o, false, finfo->external_relocs,
3917                               true,
3918                               (finfo->section_info[target_index].relocs
3919                                + o->output_section->reloc_count)));
3920           if (internal_relocs == NULL)
3921             return false;
3922
3923           /* Call processor specific code to relocate the section
3924              contents.  */
3925           if (! bfd_coff_relocate_section (output_bfd, finfo->info,
3926                                            input_bfd, o,
3927                                            contents,
3928                                            internal_relocs,
3929                                            finfo->internal_syms,
3930                                            xcoff_data (input_bfd)->csects))
3931             return false;
3932
3933           offset = o->output_section->vma + o->output_offset - o->vma;
3934           irel = internal_relocs;
3935           irelend = irel + o->reloc_count;
3936           rel_hash = (finfo->section_info[target_index].rel_hashes
3937                       + o->output_section->reloc_count);
3938           for (; irel < irelend; irel++, rel_hash++)
3939             {
3940               struct xcoff_link_hash_entry *h = NULL;
3941               struct internal_ldrel ldrel;
3942
3943               *rel_hash = NULL;
3944
3945               /* Adjust the reloc address and symbol index.  */
3946
3947               irel->r_vaddr += offset;
3948
3949               r_symndx = irel->r_symndx;
3950
3951               if (r_symndx != -1)
3952                 {
3953                   h = obj_xcoff_sym_hashes (input_bfd)[r_symndx];
3954                   if (h != NULL)
3955                     {
3956                       /* This is a global symbol.  */
3957                       if (h->indx >= 0)
3958                         irel->r_symndx = h->indx;
3959                       else
3960                         {
3961                           /* This symbol is being written at the end
3962                              of the file, and we do not yet know the
3963                              symbol index.  We save the pointer to the
3964                              hash table entry in the rel_hash list.
3965                              We set the indx field to -2 to indicate
3966                              that this symbol must not be stripped.  */
3967                           *rel_hash = h;
3968                           h->indx = -2;
3969                         }
3970                     }
3971                   else
3972                     {
3973                       long indx;
3974
3975                       indx = finfo->sym_indices[r_symndx];
3976
3977                       if (indx == -1)
3978                         {
3979                           struct internal_syment *is;
3980
3981                           /* Relocations against a TC0 TOC anchor are
3982                              automatically transformed to be against
3983                              the TOC anchor in the output file.  */
3984                           is = finfo->internal_syms + r_symndx;
3985                           if (is->n_sclass == C_HIDEXT
3986                               && is->n_numaux > 0)
3987                             {
3988                               PTR auxptr;
3989                               union internal_auxent aux;
3990
3991                               auxptr = ((PTR)
3992                                         (((bfd_byte *)
3993                                           obj_coff_external_syms (input_bfd))
3994                                          + ((r_symndx + is->n_numaux)
3995                                             * isymesz)));
3996                               bfd_coff_swap_aux_in (input_bfd, auxptr,
3997                                                     is->n_type, is->n_sclass,
3998                                                     is->n_numaux - 1,
3999                                                     is->n_numaux,
4000                                                     (PTR) &aux);
4001                               if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_SD
4002                                   && aux.x_csect.x_smclas == XMC_TC0)
4003                                 indx = finfo->toc_symindx;
4004                             }
4005                         }
4006
4007                       if (indx != -1)
4008                         irel->r_symndx = indx;
4009                       else
4010                         {
4011                           struct internal_syment *is;
4012                           const char *name;
4013                           char buf[SYMNMLEN + 1];
4014
4015                           /* This reloc is against a symbol we are
4016                              stripping.  It would be possible to handle
4017                              this case, but I don't think it's worth it.  */
4018                           is = finfo->internal_syms + r_symndx;
4019
4020                           name = (_bfd_coff_internal_syment_name
4021                                   (input_bfd, is, buf));
4022                           if (name == NULL)
4023                             return false;
4024
4025                           if (! ((*finfo->info->callbacks->unattached_reloc)
4026                                  (finfo->info, name, input_bfd, o,
4027                                   irel->r_vaddr)))
4028                             return false;
4029                         }
4030                     }
4031                 }
4032
4033               switch (irel->r_type)
4034                 {
4035                 default:
4036                   break;
4037                 case R_POS:
4038                 case R_NEG:
4039                 case R_RL:
4040                 case R_RLA:
4041                   /* This reloc needs to be copied into the .loader
4042                      section.  */
4043                   ldrel.l_vaddr = irel->r_vaddr;
4044                   if (r_symndx == -1)
4045                     ldrel.l_symndx = -1;
4046                   else if (h == NULL)
4047                     {
4048                       asection *sec;
4049
4050                       sec = xcoff_data (input_bfd)->csects[r_symndx];
4051                       if ((sec->flags & SEC_CODE) != 0)
4052                         ldrel.l_symndx = 0;
4053                       else if ((sec->flags & SEC_HAS_CONTENTS) != 0)
4054                         ldrel.l_symndx = 1;
4055                       else
4056                         ldrel.l_symndx = 2;
4057                     }
4058                   else if (h->root.type == bfd_link_hash_defined
4059                            || h->root.type == bfd_link_hash_defweak)
4060                     {
4061                       asection *sec;
4062
4063                       sec = h->root.u.def.section->output_section;
4064                       if ((sec->flags & SEC_CODE) != 0)
4065                         ldrel.l_symndx = 0;
4066                       else if ((sec->flags & SEC_HAS_CONTENTS) != 0)
4067                         ldrel.l_symndx = 1;
4068                       else
4069                         ldrel.l_symndx = 2;
4070                     }
4071                   else
4072                     {
4073                       if (h->ldindx < 0)
4074                         {
4075                           (*_bfd_error_handler)
4076                             ("%s: `%s' in loader reloc but not loader sym",
4077                              bfd_get_filename (input_bfd),
4078                              h->root.root.string);
4079                           bfd_set_error (bfd_error_bad_value);
4080                           return false;
4081                         }
4082                       ldrel.l_symndx = h->ldindx;
4083                     }
4084                   ldrel.l_rtype = (irel->r_size << 8) | irel->r_type;
4085                   ldrel.l_rsecnm = o->output_section->target_index;
4086                   if (xcoff_hash_table (finfo->info)->textro
4087                       && (o->output_section->flags & SEC_CODE) != 0)
4088                     {
4089                       (*_bfd_error_handler)
4090                         ("%s: loader reloc in read-only section %s",
4091                          bfd_get_filename (input_bfd),
4092                          bfd_get_section_name (finfo->output_bfd,
4093                                                o->output_section));
4094                       bfd_set_error (bfd_error_invalid_operation);
4095                       return false;
4096                     }
4097                   xcoff_swap_ldrel_out (output_bfd, &ldrel,
4098                                         finfo->ldrel);
4099                   BFD_ASSERT (sizeof (struct external_ldrel) == LDRELSZ);
4100                   ++finfo->ldrel;
4101                 }
4102             }
4103
4104           o->output_section->reloc_count += o->reloc_count;
4105         }
4106
4107       /* Write out the modified section contents.  */
4108       if (! bfd_set_section_contents (output_bfd, o->output_section,
4109                                       contents, o->output_offset,
4110                                       (o->_cooked_size != 0
4111                                        ? o->_cooked_size
4112                                        : o->_raw_size)))
4113         return false;
4114     }
4115
4116   obj_coff_keep_syms (input_bfd) = keep_syms;
4117
4118   if (! finfo->info->keep_memory)
4119     {
4120       if (! _bfd_coff_free_symbols (input_bfd))
4121         return false;
4122     }
4123
4124   return true;
4125 }
4126
4127 #undef N_TMASK
4128 #undef N_BTSHFT
4129
4130 /* Write out a non-XCOFF global symbol.  */
4131
4132 static boolean
4133 xcoff_write_global_symbol (h, p)
4134      struct xcoff_link_hash_entry *h;
4135      PTR p;
4136 {
4137   struct xcoff_final_link_info *finfo = (struct xcoff_final_link_info *) p;
4138   bfd *output_bfd;
4139   bfd_byte *outsym;
4140   struct internal_syment isym;
4141   union internal_auxent aux;
4142
4143   output_bfd = finfo->output_bfd;
4144
4145   /* If this symbol was garbage collected, just skip it.  */
4146   if (xcoff_hash_table (finfo->info)->gc
4147       && (h->flags & XCOFF_MARK) == 0)
4148     return true;
4149
4150   /* If we need a .loader section entry, write it out.  */
4151   if (h->ldsym != NULL)
4152     {
4153       struct internal_ldsym *ldsym;
4154       bfd *impbfd;
4155
4156       ldsym = h->ldsym;
4157
4158       if (h->root.type == bfd_link_hash_undefined
4159           || h->root.type == bfd_link_hash_undefweak)
4160         {
4161           ldsym->l_value = 0;
4162           ldsym->l_scnum = N_UNDEF;
4163           ldsym->l_smtype = XTY_ER;
4164           impbfd = h->root.u.undef.abfd;
4165         }
4166       else if (h->root.type == bfd_link_hash_defined
4167                || h->root.type == bfd_link_hash_defweak)
4168         {
4169           asection *sec;
4170
4171           sec = h->root.u.def.section;
4172           ldsym->l_value = (sec->output_section->vma
4173                             + sec->output_offset
4174                             + h->root.u.def.value);
4175           ldsym->l_scnum = sec->output_section->target_index;
4176           ldsym->l_smtype = XTY_SD;
4177           impbfd = sec->owner;
4178         }
4179       else
4180         abort ();
4181
4182       if (((h->flags & XCOFF_DEF_REGULAR) == 0
4183            && (h->flags & XCOFF_REF_DYNAMIC) != 0)
4184           || (h->flags & XCOFF_IMPORT) != 0)
4185         ldsym->l_smtype |= L_IMPORT;
4186       if (((h->flags & XCOFF_DEF_REGULAR) != 0
4187            && (h->flags & XCOFF_REF_DYNAMIC) != 0)
4188           || (h->flags & XCOFF_EXPORT) != 0)
4189         ldsym->l_smtype |= L_EXPORT;
4190       if ((h->flags & XCOFF_ENTRY) != 0)
4191         ldsym->l_smtype |= L_ENTRY;
4192
4193       ldsym->l_smclas = h->smclas;
4194
4195       if (ldsym->l_ifile == (bfd_size_type) -1)
4196         ldsym->l_ifile = 0;
4197       else if (ldsym->l_ifile == 0)
4198         {
4199           if ((ldsym->l_smtype & L_IMPORT) == 0)
4200             ldsym->l_ifile = 0;
4201           else if (impbfd == NULL)
4202             ldsym->l_ifile = 0;
4203           else
4204             {
4205               BFD_ASSERT (impbfd->xvec == output_bfd->xvec);
4206               ldsym->l_ifile = xcoff_data (impbfd)->import_file_id;
4207             }
4208         }
4209
4210       ldsym->l_parm = 0;
4211
4212       BFD_ASSERT (h->ldindx >= 0);
4213       BFD_ASSERT (LDSYMSZ == sizeof (struct external_ldsym));
4214       xcoff_swap_ldsym_out (output_bfd, ldsym, finfo->ldsym + h->ldindx - 3);
4215       h->ldsym = NULL;
4216     }
4217
4218   /* If this symbol needs global linkage code, write it out.  */
4219   if (h->root.type == bfd_link_hash_defined
4220       && (h->root.u.def.section
4221           == xcoff_hash_table (finfo->info)->linkage_section))
4222     {
4223       bfd_byte *p;
4224       bfd_vma tocoff;
4225       unsigned int i;
4226
4227       p = h->root.u.def.section->contents + h->root.u.def.value;
4228
4229       /* The first instruction in the global linkage code loads a
4230          specific TOC element.  */
4231       tocoff = (h->descriptor->toc_section->output_section->vma
4232                 + h->descriptor->toc_section->output_offset
4233                 + h->descriptor->toc_offset
4234                 - xcoff_data (output_bfd)->toc);
4235       bfd_put_32 (output_bfd, XCOFF_GLINK_FIRST | tocoff, p);
4236       for (i = 0, p += 4;
4237            i < sizeof xcoff_glink_code / sizeof xcoff_glink_code[0];
4238            i++, p += 4)
4239         bfd_put_32 (output_bfd, xcoff_glink_code[i], p);
4240     }
4241
4242   /* If we created a TOC entry for this symbol, write out the required
4243      relocs.  */
4244   if ((h->flags & XCOFF_SET_TOC) != 0)
4245     {
4246       asection *tocsec;
4247       asection *osec;
4248       int oindx;
4249       struct internal_reloc *irel;
4250       struct internal_ldrel ldrel;
4251
4252       tocsec = h->toc_section;
4253       osec = tocsec->output_section;
4254       oindx = osec->target_index;
4255       irel = finfo->section_info[oindx].relocs + osec->reloc_count;
4256       irel->r_vaddr = (osec->vma
4257                        + tocsec->output_offset
4258                        + h->toc_offset);
4259       if (h->indx >= 0)
4260         irel->r_symndx = h->indx;
4261       else
4262         {
4263           h->indx = -2;
4264           irel->r_symndx = obj_raw_syment_count (output_bfd);
4265         }
4266       irel->r_type = R_POS;
4267       irel->r_size = 31;
4268       finfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
4269       ++osec->reloc_count;
4270
4271       BFD_ASSERT (h->ldindx >= 0);
4272       ldrel.l_vaddr = irel->r_vaddr;
4273       ldrel.l_symndx = h->ldindx;
4274       ldrel.l_rtype = (31 << 8) | R_POS;
4275       ldrel.l_rsecnm = oindx;
4276       xcoff_swap_ldrel_out (output_bfd, &ldrel, finfo->ldrel);
4277       ++finfo->ldrel;
4278     }
4279
4280   if (h->indx >= 0)
4281     return true;
4282
4283   if (h->indx != -2
4284       && (finfo->info->strip == strip_all
4285           || (finfo->info->strip == strip_some
4286               && (bfd_hash_lookup (finfo->info->keep_hash,
4287                                    h->root.root.string, false, false)
4288                   == NULL))))
4289     return true;
4290
4291   if (h->indx != -2
4292       && (h->flags & (XCOFF_REF_REGULAR | XCOFF_DEF_REGULAR)) == 0)
4293     return true;
4294
4295   outsym = finfo->outsyms;
4296
4297   memset (&aux, 0, sizeof aux);
4298
4299   h->indx = obj_raw_syment_count (output_bfd);
4300
4301   if (strlen (h->root.root.string) <= SYMNMLEN)
4302     strncpy (isym._n._n_name, h->root.root.string, SYMNMLEN);
4303   else
4304     {
4305       boolean hash;
4306       bfd_size_type indx;
4307
4308       hash = true;
4309       if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
4310         hash = false;
4311       indx = _bfd_stringtab_add (finfo->strtab, h->root.root.string, hash,
4312                                  false);
4313       if (indx == (bfd_size_type) -1)
4314         return false;
4315       isym._n._n_n._n_zeroes = 0;
4316       isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
4317     }
4318
4319   if (h->root.type == bfd_link_hash_undefined
4320       || h->root.type == bfd_link_hash_undefweak)
4321     {
4322       isym.n_value = 0;
4323       isym.n_scnum = N_UNDEF;
4324       isym.n_sclass = C_EXT;
4325       aux.x_csect.x_smtyp = XTY_ER;
4326     }
4327   else if (h->root.type == bfd_link_hash_defined
4328            || h->root.type == bfd_link_hash_defweak)
4329     {
4330       isym.n_value = (h->root.u.def.section->output_section->vma
4331                       + h->root.u.def.section->output_offset
4332                       + h->root.u.def.value);
4333       isym.n_scnum = h->root.u.def.section->output_section->target_index;
4334       isym.n_sclass = C_HIDEXT;
4335       aux.x_csect.x_smtyp = XTY_SD;
4336       /* I don't know what the csect length should be in this case.  */
4337     }
4338   else
4339     abort ();
4340
4341   isym.n_type = T_NULL;
4342   isym.n_numaux = 1;
4343
4344   bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym);
4345   outsym += bfd_coff_symesz (output_bfd);
4346
4347   aux.x_csect.x_smclas = h->smclas;
4348
4349   bfd_coff_swap_aux_out (output_bfd, (PTR) &aux, T_NULL, isym.n_sclass, 0, 1,
4350                          (PTR) outsym);
4351   outsym += bfd_coff_auxesz (output_bfd);
4352
4353   if (h->root.type == bfd_link_hash_defined
4354       || h->root.type == bfd_link_hash_defweak)
4355     {
4356       /* We just output an SD symbol.  Now output an LD symbol.  */
4357
4358       h->indx += 2;
4359
4360       isym.n_sclass = C_EXT;
4361       bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym);
4362       outsym += bfd_coff_symesz (output_bfd);
4363
4364       aux.x_csect.x_smtyp = XTY_LD;
4365       aux.x_csect.x_scnlen.l = obj_raw_syment_count (output_bfd);
4366
4367       bfd_coff_swap_aux_out (output_bfd, (PTR) &aux, T_NULL, C_EXT, 0, 1,
4368                              (PTR) outsym);
4369       outsym += bfd_coff_auxesz (output_bfd);
4370     }
4371
4372   if (bfd_seek (output_bfd,
4373                 (obj_sym_filepos (output_bfd)
4374                  + (obj_raw_syment_count (output_bfd)
4375                     * bfd_coff_symesz (output_bfd))),
4376                 SEEK_SET) != 0
4377       || (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1, output_bfd)
4378           != (bfd_size_type) (outsym - finfo->outsyms)))
4379     return false;
4380   obj_raw_syment_count (output_bfd) +=
4381     (outsym - finfo->outsyms) / bfd_coff_symesz (output_bfd);
4382
4383   return true;
4384 }
4385
4386 /* Handle a link order which is supposed to generate a reloc.  */
4387
4388 static boolean
4389 xcoff_reloc_link_order (output_bfd, finfo, output_section, link_order)
4390      bfd *output_bfd;
4391      struct xcoff_final_link_info *finfo;
4392      asection *output_section;
4393      struct bfd_link_order *link_order;
4394 {
4395   reloc_howto_type *howto;
4396   struct internal_reloc *irel;
4397   struct xcoff_link_hash_entry **rel_hash_ptr;
4398
4399   howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
4400   if (howto == NULL)
4401     {
4402       bfd_set_error (bfd_error_bad_value);
4403       return false;
4404     }
4405
4406   if (link_order->u.reloc.p->addend != 0)
4407     {
4408       bfd_size_type size;
4409       bfd_byte *buf;
4410       bfd_reloc_status_type rstat;
4411       boolean ok;
4412
4413       size = bfd_get_reloc_size (howto);
4414       buf = (bfd_byte *) bfd_zmalloc (size);
4415       if (buf == NULL)
4416         {
4417           bfd_set_error (bfd_error_no_memory);
4418           return false;
4419         }
4420
4421       rstat = _bfd_relocate_contents (howto, output_bfd,
4422                                       link_order->u.reloc.p->addend, buf);
4423       switch (rstat)
4424         {
4425         case bfd_reloc_ok:
4426           break;
4427         default:
4428         case bfd_reloc_outofrange:
4429           abort ();
4430         case bfd_reloc_overflow:
4431           if (! ((*finfo->info->callbacks->reloc_overflow)
4432                  (finfo->info,
4433                   (link_order->type == bfd_section_reloc_link_order
4434                    ? bfd_section_name (output_bfd,
4435                                        link_order->u.reloc.p->u.section)
4436                    : link_order->u.reloc.p->u.name),
4437                   howto->name, link_order->u.reloc.p->addend,
4438                   (bfd *) NULL, (asection *) NULL, (bfd_vma) 0)))
4439             {
4440               free (buf);
4441               return false;
4442             }
4443           break;
4444         }
4445       ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf,
4446                                      (file_ptr) link_order->offset, size);
4447       free (buf);
4448       if (! ok)
4449         return false;
4450     }
4451
4452   /* Store the reloc information in the right place.  It will get
4453      swapped and written out at the end of the final_link routine.  */
4454
4455   irel = (finfo->section_info[output_section->target_index].relocs
4456           + output_section->reloc_count);
4457   rel_hash_ptr = (finfo->section_info[output_section->target_index].rel_hashes
4458                   + output_section->reloc_count);
4459
4460   memset (irel, 0, sizeof (struct internal_reloc));
4461   *rel_hash_ptr = NULL;
4462
4463   irel->r_vaddr = output_section->vma + link_order->offset;
4464
4465   if (link_order->type == bfd_section_reloc_link_order)
4466     {
4467       /* We need to somehow locate a symbol in the right section.  The
4468          symbol must either have a value of zero, or we must adjust
4469          the addend by the value of the symbol.  FIXME: Write this
4470          when we need it.  The old linker couldn't handle this anyhow.  */
4471       abort ();
4472       *rel_hash_ptr = NULL;
4473       irel->r_symndx = 0;
4474     }
4475   else
4476     {
4477       struct xcoff_link_hash_entry *h;
4478
4479       h = xcoff_link_hash_lookup (xcoff_hash_table (finfo->info),
4480                                   link_order->u.reloc.p->u.name,
4481                                   false, false, true);
4482       if (h != NULL)
4483         {
4484           if (h->indx >= 0)
4485             irel->r_symndx = h->indx;
4486           else
4487             {
4488               /* Set the index to -2 to force this symbol to get
4489                  written out.  */
4490               h->indx = -2;
4491               *rel_hash_ptr = h;
4492               irel->r_symndx = 0;
4493             }
4494         }
4495       else
4496         {
4497           if (! ((*finfo->info->callbacks->unattached_reloc)
4498                  (finfo->info, link_order->u.reloc.p->u.name, (bfd *) NULL,
4499                   (asection *) NULL, (bfd_vma) 0)))
4500             return false;
4501           irel->r_symndx = 0;
4502         }
4503     }
4504
4505   irel->r_type = howto->type;
4506   irel->r_size = howto->bitsize - 1;
4507   if (howto->complain_on_overflow == complain_overflow_signed)
4508     irel->r_size |= 0x80;
4509
4510   ++output_section->reloc_count;
4511
4512   return true;
4513 }
4514
4515 /* Sort relocs by VMA.  This is called via qsort.  */
4516
4517 static int
4518 xcoff_sort_relocs (p1, p2)
4519      const PTR p1;
4520      const PTR p2;
4521 {
4522   const struct internal_reloc *r1 = (const struct internal_reloc *) p1;
4523   const struct internal_reloc *r2 = (const struct internal_reloc *) p2;
4524
4525   if (r1->r_vaddr > r2->r_vaddr)
4526     return 1;
4527   else if (r1->r_vaddr < r2->r_vaddr)
4528     return -1;
4529   else
4530     return 0;
4531 }
4532
4533 /* This is the relocation function for the RS/6000/POWER/PowerPC.
4534    This is currently the only processor which uses XCOFF; I hope that
4535    will never change.  */
4536
4537 boolean
4538 _bfd_ppc_xcoff_relocate_section (output_bfd, info, input_bfd,
4539                                  input_section, contents, relocs, syms,
4540                                  sections)
4541      bfd *output_bfd;
4542      struct bfd_link_info *info;
4543      bfd *input_bfd;
4544      asection *input_section;
4545      bfd_byte *contents;
4546      struct internal_reloc *relocs;
4547      struct internal_syment *syms;
4548      asection **sections;
4549 {
4550   struct internal_reloc *rel;
4551   struct internal_reloc *relend;
4552
4553   rel = relocs;
4554   relend = rel + input_section->reloc_count;
4555   for (; rel < relend; rel++)
4556     {
4557       long symndx;
4558       struct xcoff_link_hash_entry *h;
4559       struct internal_syment *sym;
4560       bfd_vma addend;
4561       bfd_vma val;
4562       struct reloc_howto_struct howto;
4563       bfd_reloc_status_type rstat;
4564
4565       /* Relocation type R_REF is a special relocation type which is
4566          merely used to prevent garbage collection from occurring for
4567          the csect including the symbol which it references.  */
4568       if (rel->r_type == R_REF)
4569         continue;
4570
4571       symndx = rel->r_symndx;
4572
4573       if (symndx == -1)
4574         {
4575           h = NULL;
4576           sym = NULL;
4577           addend = 0;
4578         }
4579       else
4580         {    
4581           h = obj_xcoff_sym_hashes (input_bfd)[symndx];
4582           sym = syms + symndx;
4583           addend = - sym->n_value;
4584         }
4585
4586       /* We build the howto information on the fly.  */
4587
4588       howto.type = rel->r_type;
4589       howto.rightshift = 0;
4590       howto.size = 2;
4591       howto.bitsize = (rel->r_size & 0x1f) + 1;
4592       howto.pc_relative = false;
4593       howto.bitpos = 0;
4594       if ((rel->r_size & 0x80) != 0)
4595         howto.complain_on_overflow = complain_overflow_signed;
4596       else
4597         howto.complain_on_overflow = complain_overflow_bitfield;
4598       howto.special_function = NULL;
4599       howto.name = "internal";
4600       howto.partial_inplace = true;
4601       if (howto.bitsize == 32)
4602         howto.src_mask = howto.dst_mask = 0xffffffff;
4603       else
4604         {
4605           howto.src_mask = howto.dst_mask = (1 << howto.bitsize) - 1;
4606           if (howto.bitsize == 16)
4607             howto.size = 1;
4608         }
4609       howto.pcrel_offset = false;
4610
4611       val = 0;
4612
4613       if (h == NULL)
4614         {
4615           asection *sec;
4616
4617           if (symndx == -1)
4618             {
4619               sec = bfd_abs_section_ptr;
4620               val = 0;
4621             }
4622           else
4623             {
4624               sec = sections[symndx];
4625               val = (sec->output_section->vma
4626                      + sec->output_offset
4627                      + sym->n_value
4628                      - sec->vma);
4629             }
4630         }
4631       else
4632         {
4633           if (h->root.type == bfd_link_hash_defined
4634               || h->root.type == bfd_link_hash_defweak)
4635             {
4636               asection *sec;
4637
4638               sec = h->root.u.def.section;
4639               val = (h->root.u.def.value
4640                      + sec->output_section->vma
4641                      + sec->output_offset);
4642             }
4643           else if ((h->flags & XCOFF_REF_DYNAMIC) != 0
4644                    || (h->flags & XCOFF_IMPORT) != 0)
4645             {
4646               /* Every symbol in a shared object is defined somewhere.  */
4647               val = 0;
4648             }
4649           else if (! info->relocateable)
4650             {
4651               if (! ((*info->callbacks->undefined_symbol)
4652                      (info, h->root.root.string, input_bfd, input_section,
4653                       rel->r_vaddr - input_section->vma)))
4654                 return false;
4655             }
4656         }
4657
4658       /* I took the relocation type definitions from two documents:
4659          the PowerPC AIX Version 4 Application Binary Interface, First
4660          Edition (April 1992), and the PowerOpen ABI, Big-Endian
4661          32-Bit Hardware Implementation (June 30, 1994).  Differences
4662          between the documents are noted below.  */
4663
4664       switch (rel->r_type)
4665         {
4666         case R_RTB:
4667         case R_RRTBI:
4668         case R_RRTBA:
4669           /* These relocs are defined by the PowerPC ABI to be
4670              relative branches which use half of the difference
4671              between the symbol and the program counter.  I can't
4672              quite figure out when this is useful.  These relocs are
4673              not defined by the PowerOpen ABI.  */
4674         default:
4675           (*_bfd_error_handler)
4676             ("%s: unsupported relocation type 0x%02x",
4677              bfd_get_filename (input_bfd), (unsigned int) rel->r_type);
4678           bfd_set_error (bfd_error_bad_value);
4679           return false;
4680         case R_POS:
4681           /* Simple positive relocation.  */
4682           break;
4683         case R_NEG:
4684           /* Simple negative relocation.  */
4685           val = - val;
4686           break;
4687         case R_REL:
4688           /* Simple PC relative relocation.  */
4689           howto.pc_relative = true;
4690           break;
4691         case R_TOC:
4692           /* TOC relative relocation.  The value in the instruction in
4693              the input file is the offset from the input file TOC to
4694              the desired location.  We want the offset from the final
4695              TOC to the desired location.  We have:
4696                  isym = iTOC + in
4697                  iinsn = in + o
4698                  osym = oTOC + on
4699                  oinsn = on + o
4700              so we must change insn by on - in.
4701              */
4702         case R_GL:
4703           /* Global linkage relocation.  The value of this relocation
4704              is the address of the entry in the TOC section.  */
4705         case R_TCL:
4706           /* Local object TOC address.  I can't figure out the
4707              difference between this and case R_GL.  */
4708         case R_TRL:
4709           /* TOC relative relocation.  A TOC relative load instruction
4710              which may be changed to a load address instruction.
4711              FIXME: We don't currently implement this optimization.  */
4712         case R_TRLA:
4713           /* TOC relative relocation.  This is a TOC relative load
4714              address instruction which may be changed to a load
4715              instruction.  FIXME: I don't know if this is the correct
4716              implementation.  */
4717           if (h != NULL && h->toc_section == NULL)
4718             {
4719               (*_bfd_error_handler)
4720                 ("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry",
4721                  bfd_get_filename (input_bfd), rel->r_vaddr,
4722                  h->root.root.string);
4723               bfd_set_error (bfd_error_bad_value);
4724               return false;
4725             }
4726           if (h != NULL)
4727             val = (h->toc_section->output_section->vma
4728                    + h->toc_section->output_offset
4729                    + h->toc_offset);
4730           val = ((val - xcoff_data (output_bfd)->toc)
4731                  - (sym->n_value - xcoff_data (input_bfd)->toc));
4732           addend = 0;
4733           break;
4734         case R_BA:
4735           /* Absolute branch.  We don't want to mess with the lower
4736              two bits of the instruction.  */
4737         case R_CAI:
4738           /* The PowerPC ABI defines this as an absolute call which
4739              may be modified to become a relative call.  The PowerOpen
4740              ABI does not define this relocation type.  */
4741         case R_RBA:
4742           /* Absolute branch which may be modified to become a
4743              relative branch.  */
4744         case R_RBAC:
4745           /* The PowerPC ABI defines this as an absolute branch to a
4746              fixed address which may be modified to an absolute branch
4747              to a symbol.  The PowerOpen ABI does not define this
4748              relocation type.  */
4749         case R_RBRC:
4750           /* The PowerPC ABI defines this as an absolute branch to a
4751              fixed address which may be modified to a relative branch.
4752              The PowerOpen ABI does not define this relocation type.  */
4753           howto.src_mask &= ~3;
4754           howto.dst_mask = howto.src_mask;
4755           break;
4756         case R_BR:
4757           /* Relative branch.  We don't want to mess with the lower
4758              two bits of the instruction.  */
4759         case R_CREL:
4760           /* The PowerPC ABI defines this as a relative call which may
4761              be modified to become an absolute call.  The PowerOpen
4762              ABI does not define this relocation type.  */
4763         case R_RBR:
4764           /* A relative branch which may be modified to become an
4765              absolute branch.  FIXME: We don't implement this,
4766              although we should for symbols of storage mapping class
4767              XMC_XO.  */
4768           howto.pc_relative = true;
4769           howto.src_mask &= ~3;
4770           howto.dst_mask = howto.src_mask;
4771           break;
4772         case R_RL:
4773           /* The PowerPC AIX ABI describes this as a load which may be
4774              changed to a load address.  The PowerOpen ABI says this
4775              is the same as case R_POS.  */
4776           break;
4777         case R_RLA:
4778           /* The PowerPC AIX ABI describes this as a load address
4779              which may be changed to a load.  The PowerOpen ABI says
4780              this is the same as R_POS.  */
4781           break;
4782         }
4783
4784       /* If we see an R_BR or R_RBR reloc which is jumping to global
4785          linkage code, and it is followed by an appropriate cror nop
4786          instruction, we replace the cror with lwz r2,20(r1).  This
4787          restores the TOC after the glink code.  Contrariwise, if the
4788          call is followed by a lwz r2,20(r1), but the call is not
4789          going to global linkage code, we can replace the load with a
4790          cror.  */
4791       if ((rel->r_type == R_BR || rel->r_type == R_RBR)
4792           && h != NULL
4793           && h->root.type == bfd_link_hash_defined
4794           && (rel->r_vaddr - input_section->vma + 8
4795               <= input_section->_cooked_size))
4796         {
4797           bfd_byte *pnext;
4798           unsigned long next;
4799
4800           pnext = contents + (rel->r_vaddr - input_section->vma) + 4;
4801           next = bfd_get_32 (input_bfd, pnext);
4802           if (h->smclas == XMC_GL)
4803             {
4804               if (next == 0x4def7b82            /* cror 15,15,15 */
4805                   || next == 0x4ffffb82)        /* cror 31,31,31 */
4806                 bfd_put_32 (input_bfd, 0x80410014, pnext); /* lwz r1,20(r1) */
4807             }
4808           else
4809             {
4810               if (next == 0x80410014)           /* lwz r1,20(r1) */
4811                 bfd_put_32 (input_bfd, 0x4ffffb82, pnext); /* cror 31,31,31 */
4812             }
4813         }
4814
4815       /* A PC relative reloc includes the section address.  */
4816       if (howto.pc_relative)
4817         addend += input_section->vma;
4818
4819       rstat = _bfd_final_link_relocate (&howto, input_bfd, input_section,
4820                                         contents,
4821                                         rel->r_vaddr - input_section->vma,
4822                                         val, addend);
4823
4824       switch (rstat)
4825         {
4826         default:
4827           abort ();
4828         case bfd_reloc_ok:
4829           break;
4830         case bfd_reloc_overflow:
4831           {
4832             const char *name;
4833             char buf[SYMNMLEN + 1];
4834             char howto_name[10];
4835
4836             if (symndx == -1)
4837               name = "*ABS*";
4838             else if (h != NULL)
4839               name = h->root.root.string;
4840             else
4841               {
4842                 name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
4843                 if (name == NULL)
4844                   return false;
4845               }
4846             sprintf (howto_name, "0x%02x", rel->r_type);
4847
4848             if (! ((*info->callbacks->reloc_overflow)
4849                    (info, name, howto_name, (bfd_vma) 0, input_bfd,
4850                     input_section, rel->r_vaddr - input_section->vma)))
4851               return false;
4852           }
4853         }
4854     }
4855
4856   return true;
4857 }