PR binutils/13897
[platform/upstream/binutils.git] / bfd / coff-rs6000.c
1 /* BFD back-end for IBM RS/6000 "XCOFF" files.
2    Copyright 1990-1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3    2008, 2009, 2010, 2011
4    Free Software Foundation, Inc.
5    Written by Metin G. Ozisik, Mimi Phuong-Thao Vo, and John Gilmore.
6    Archive support from Damon A. Permezel.
7    Contributed by IBM Corporation and Cygnus Support.
8
9    This file is part of BFD, the Binary File Descriptor library.
10
11    This program is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 3 of the License, or
14    (at your option) any later version.
15
16    This program is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with this program; if not, write to the Free Software
23    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
24    MA 02110-1301, USA.  */
25
26 #include "sysdep.h"
27 #include "bfd.h"
28 #include "bfdlink.h"
29 #include "libbfd.h"
30 #include "coff/internal.h"
31 #include "coff/xcoff.h"
32 #include "coff/rs6000.h"
33 #include "libcoff.h"
34 #include "libxcoff.h"
35
36 extern bfd_boolean _bfd_xcoff_mkobject (bfd *);
37 extern bfd_boolean _bfd_xcoff_copy_private_bfd_data (bfd *, bfd *);
38 extern bfd_boolean _bfd_xcoff_is_local_label_name (bfd *, const char *);
39 extern reloc_howto_type *_bfd_xcoff_reloc_type_lookup
40   (bfd *, bfd_reloc_code_real_type);
41 extern bfd_boolean _bfd_xcoff_slurp_armap (bfd *);
42 extern const bfd_target *_bfd_xcoff_archive_p (bfd *);
43 extern PTR _bfd_xcoff_read_ar_hdr (bfd *);
44 extern bfd *_bfd_xcoff_openr_next_archived_file (bfd *, bfd *);
45 extern int _bfd_xcoff_stat_arch_elt (bfd *, struct stat *);
46 extern bfd_boolean _bfd_xcoff_write_armap
47   (bfd *, unsigned int, struct orl *, unsigned int, int);
48 extern bfd_boolean _bfd_xcoff_write_archive_contents (bfd *);
49 extern int _bfd_xcoff_sizeof_headers (bfd *, struct bfd_link_info *);
50 extern void _bfd_xcoff_swap_sym_in (bfd *, PTR, PTR);
51 extern unsigned int _bfd_xcoff_swap_sym_out (bfd *, PTR, PTR);
52 extern void _bfd_xcoff_swap_aux_in (bfd *, PTR, int, int, int, int, PTR);
53 extern unsigned int _bfd_xcoff_swap_aux_out
54   (bfd *, PTR, int, int, int, int, PTR);
55 static void xcoff_swap_reloc_in (bfd *, PTR, PTR);
56 static unsigned int xcoff_swap_reloc_out (bfd *, PTR, PTR);
57
58 /* Forward declare xcoff_rtype2howto for coffcode.h macro.  */
59 void xcoff_rtype2howto (arelent *, struct internal_reloc *);
60
61 /* coffcode.h needs these to be defined.  */
62 #define RS6000COFF_C 1
63
64 #define SELECT_RELOC(internal, howto)                                   \
65   {                                                                     \
66     internal.r_type = howto->type;                                      \
67     internal.r_size =                                                   \
68       ((howto->complain_on_overflow == complain_overflow_signed         \
69         ? 0x80                                                          \
70         : 0)                                                            \
71        | (howto->bitsize - 1));                                         \
72   }
73
74 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
75 #define COFF_LONG_FILENAMES
76 #define NO_COFF_SYMBOLS
77 #define RTYPE2HOWTO(cache_ptr, dst) xcoff_rtype2howto (cache_ptr, dst)
78 #define coff_mkobject _bfd_xcoff_mkobject
79 #define coff_bfd_copy_private_bfd_data _bfd_xcoff_copy_private_bfd_data
80 #define coff_bfd_is_local_label_name _bfd_xcoff_is_local_label_name
81 #define coff_bfd_reloc_type_lookup _bfd_xcoff_reloc_type_lookup
82 #define coff_bfd_reloc_name_lookup _bfd_xcoff_reloc_name_lookup
83 #ifdef AIX_CORE
84 extern const bfd_target * rs6000coff_core_p (bfd *abfd);
85 extern bfd_boolean rs6000coff_core_file_matches_executable_p
86   (bfd *cbfd, bfd *ebfd);
87 extern char *rs6000coff_core_file_failing_command (bfd *abfd);
88 extern int rs6000coff_core_file_failing_signal (bfd *abfd);
89 #define CORE_FILE_P rs6000coff_core_p
90 #define coff_core_file_failing_command \
91   rs6000coff_core_file_failing_command
92 #define coff_core_file_failing_signal \
93   rs6000coff_core_file_failing_signal
94 #define coff_core_file_matches_executable_p \
95   rs6000coff_core_file_matches_executable_p
96 #define coff_core_file_pid \
97   _bfd_nocore_core_file_pid
98 #else
99 #define CORE_FILE_P _bfd_dummy_target
100 #define coff_core_file_failing_command \
101   _bfd_nocore_core_file_failing_command
102 #define coff_core_file_failing_signal \
103   _bfd_nocore_core_file_failing_signal
104 #define coff_core_file_matches_executable_p \
105   _bfd_nocore_core_file_matches_executable_p
106 #define coff_core_file_pid \
107   _bfd_nocore_core_file_pid
108 #endif
109 #define coff_SWAP_sym_in _bfd_xcoff_swap_sym_in
110 #define coff_SWAP_sym_out _bfd_xcoff_swap_sym_out
111 #define coff_SWAP_aux_in _bfd_xcoff_swap_aux_in
112 #define coff_SWAP_aux_out _bfd_xcoff_swap_aux_out
113 #define coff_swap_reloc_in xcoff_swap_reloc_in
114 #define coff_swap_reloc_out xcoff_swap_reloc_out
115 #define NO_COFF_RELOCS
116
117 #ifndef bfd_pe_print_pdata
118 #define bfd_pe_print_pdata      NULL
119 #endif
120
121 #include "coffcode.h"
122
123 /* The main body of code is in coffcode.h.  */
124
125 static const char *normalize_filename (bfd *);
126 static bfd_boolean xcoff_write_armap_old
127   (bfd *, unsigned int, struct orl *, unsigned int, int);
128 static bfd_boolean xcoff_write_armap_big
129   (bfd *, unsigned int, struct orl *, unsigned int, int);
130 static bfd_boolean xcoff_write_archive_contents_old (bfd *);
131 static bfd_boolean xcoff_write_archive_contents_big (bfd *);
132 static void xcoff_swap_ldhdr_in (bfd *, const PTR, struct internal_ldhdr *);
133 static void xcoff_swap_ldhdr_out (bfd *, const struct internal_ldhdr *, PTR);
134 static void xcoff_swap_ldsym_in (bfd *, const PTR, struct internal_ldsym *);
135 static void xcoff_swap_ldsym_out (bfd *, const struct internal_ldsym *, PTR);
136 static void xcoff_swap_ldrel_in (bfd *, const PTR, struct internal_ldrel *);
137 static void xcoff_swap_ldrel_out (bfd *, const struct internal_ldrel *, PTR);
138 static bfd_boolean xcoff_ppc_relocate_section
139   (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
140    struct internal_reloc *, struct internal_syment *, asection **);
141 static bfd_boolean _bfd_xcoff_put_ldsymbol_name
142   (bfd *, struct xcoff_loader_info *, struct internal_ldsym *, const char *);
143 static asection *xcoff_create_csect_from_smclas
144   (bfd *, union internal_auxent *, const char *);
145 static bfd_boolean xcoff_is_lineno_count_overflow (bfd *, bfd_vma);
146 static bfd_boolean xcoff_is_reloc_count_overflow (bfd *, bfd_vma);
147 static bfd_vma xcoff_loader_symbol_offset (bfd *, struct internal_ldhdr *);
148 static bfd_vma xcoff_loader_reloc_offset (bfd *, struct internal_ldhdr *);
149 static bfd_boolean xcoff_generate_rtinit
150   (bfd *, const char *, const char *, bfd_boolean);
151 static bfd_boolean do_pad (bfd *, unsigned int);
152 static bfd_boolean do_copy (bfd *, bfd *);
153
154 /* Relocation functions */
155 static bfd_boolean xcoff_reloc_type_br (XCOFF_RELOC_FUNCTION_ARGS);
156
157 static bfd_boolean xcoff_complain_overflow_dont_func
158   (XCOFF_COMPLAIN_FUNCTION_ARGS);
159 static bfd_boolean xcoff_complain_overflow_bitfield_func
160   (XCOFF_COMPLAIN_FUNCTION_ARGS);
161 static bfd_boolean xcoff_complain_overflow_signed_func
162   (XCOFF_COMPLAIN_FUNCTION_ARGS);
163 static bfd_boolean xcoff_complain_overflow_unsigned_func
164   (XCOFF_COMPLAIN_FUNCTION_ARGS);
165
166 bfd_boolean (*xcoff_calculate_relocation[XCOFF_MAX_CALCULATE_RELOCATION])
167   (XCOFF_RELOC_FUNCTION_ARGS) =
168 {
169   xcoff_reloc_type_pos,  /* R_POS   (0x00) */
170   xcoff_reloc_type_neg,  /* R_NEG   (0x01) */
171   xcoff_reloc_type_rel,  /* R_REL   (0x02) */
172   xcoff_reloc_type_toc,  /* R_TOC   (0x03) */
173   xcoff_reloc_type_fail, /* R_RTB   (0x04) */
174   xcoff_reloc_type_toc,  /* R_GL    (0x05) */
175   xcoff_reloc_type_toc,  /* R_TCL   (0x06) */
176   xcoff_reloc_type_fail, /*         (0x07) */
177   xcoff_reloc_type_ba,   /* R_BA    (0x08) */
178   xcoff_reloc_type_fail, /*         (0x09) */
179   xcoff_reloc_type_br,   /* R_BR    (0x0a) */
180   xcoff_reloc_type_fail, /*         (0x0b) */
181   xcoff_reloc_type_pos,  /* R_RL    (0x0c) */
182   xcoff_reloc_type_pos,  /* R_RLA   (0x0d) */
183   xcoff_reloc_type_fail, /*         (0x0e) */
184   xcoff_reloc_type_noop, /* R_REF   (0x0f) */
185   xcoff_reloc_type_fail, /*         (0x10) */
186   xcoff_reloc_type_fail, /*         (0x11) */
187   xcoff_reloc_type_toc,  /* R_TRL   (0x12) */
188   xcoff_reloc_type_toc,  /* R_TRLA  (0x13) */
189   xcoff_reloc_type_fail, /* R_RRTBI (0x14) */
190   xcoff_reloc_type_fail, /* R_RRTBA (0x15) */
191   xcoff_reloc_type_ba,   /* R_CAI   (0x16) */
192   xcoff_reloc_type_crel, /* R_CREL  (0x17) */
193   xcoff_reloc_type_ba,   /* R_RBA   (0x18) */
194   xcoff_reloc_type_ba,   /* R_RBAC  (0x19) */
195   xcoff_reloc_type_br,   /* R_RBR   (0x1a) */
196   xcoff_reloc_type_ba,   /* R_RBRC  (0x1b) */
197 };
198
199 bfd_boolean (*xcoff_complain_overflow[XCOFF_MAX_COMPLAIN_OVERFLOW])
200   (XCOFF_COMPLAIN_FUNCTION_ARGS) =
201 {
202   xcoff_complain_overflow_dont_func,
203   xcoff_complain_overflow_bitfield_func,
204   xcoff_complain_overflow_signed_func,
205   xcoff_complain_overflow_unsigned_func,
206 };
207
208 /* Information about one member of an archive.  */
209 struct member_layout {
210   /* The archive member that this structure describes.  */
211   bfd *member;
212
213   /* The number of bytes of padding that must be inserted before the
214      start of the member in order to ensure that the section contents
215      are correctly aligned.  */
216   unsigned int leading_padding;
217
218   /* The offset of MEMBER from the start of the archive (i.e. the end
219      of the leading padding).  */
220   file_ptr offset;
221
222   /* The normalized name of MEMBER.  */
223   const char *name;
224
225   /* The length of NAME, without padding.  */
226   bfd_size_type namlen;
227
228   /* The length of NAME, with padding.  */
229   bfd_size_type padded_namlen;
230
231   /* The size of MEMBER's header, including the name and magic sequence.  */
232   bfd_size_type header_size;
233
234   /* The size of the MEMBER's contents.  */
235   bfd_size_type contents_size;
236
237   /* The number of bytes of padding that must be inserted after MEMBER
238      in order to preserve even alignment.  */
239   bfd_size_type trailing_padding;
240 };
241
242 /* A structure used for iterating over the members of an archive.  */
243 struct archive_iterator {
244   /* The archive itself.  */
245   bfd *archive;
246
247   /* Information about the current archive member.  */
248   struct member_layout current;
249
250   /* Information about the next archive member.  MEMBER is null if there
251      are no more archive members, in which case OFFSET is the offset of
252      the first unused byte.  */
253   struct member_layout next;
254 };
255
256 /* Initialize INFO so that it describes member MEMBER of archive ARCHIVE.
257    OFFSET is the even-padded offset of MEMBER, not including any leading
258    padding needed for section alignment.  */
259
260 static void
261 member_layout_init (struct member_layout *info, bfd *archive,
262                     bfd *member, file_ptr offset)
263 {
264   info->member = member;
265   info->leading_padding = 0;
266   if (member)
267     {
268       info->name = normalize_filename (member);
269       info->namlen = strlen (info->name);
270       info->padded_namlen = info->namlen + (info->namlen & 1);
271       if (xcoff_big_format_p (archive))
272         info->header_size = SIZEOF_AR_HDR_BIG;
273       else
274         info->header_size = SIZEOF_AR_HDR;
275       info->header_size += info->padded_namlen + SXCOFFARFMAG;
276       info->contents_size = arelt_size (member);
277       info->trailing_padding = info->contents_size & 1;
278
279       if (bfd_check_format (member, bfd_object)
280           && bfd_get_flavour (member) == bfd_target_xcoff_flavour
281           && (member->flags & DYNAMIC) != 0)
282         info->leading_padding
283           = (-(offset + info->header_size)
284              & ((1 << bfd_xcoff_text_align_power (member)) - 1));
285     }
286   info->offset = offset + info->leading_padding;
287 }
288
289 /* Set up ITERATOR to iterate through archive ARCHIVE.  */
290
291 static void
292 archive_iterator_begin (struct archive_iterator *iterator,
293                         bfd *archive)
294 {
295   iterator->archive = archive;
296   member_layout_init (&iterator->next, archive, archive->archive_head,
297                       xcoff_big_format_p (archive)
298                       ? SIZEOF_AR_FILE_HDR_BIG
299                       : SIZEOF_AR_FILE_HDR);
300 }
301
302 /* Make ITERATOR visit the first unvisited archive member.  Return true
303    on success; return false if all members have been visited.  */
304
305 static bfd_boolean
306 archive_iterator_next (struct archive_iterator *iterator)
307 {
308   if (!iterator->next.member)
309     return FALSE;
310
311   iterator->current = iterator->next;
312   member_layout_init (&iterator->next, iterator->archive,
313                       iterator->current.member->archive_next,
314                       iterator->current.offset
315                       + iterator->current.header_size
316                       + iterator->current.contents_size
317                       + iterator->current.trailing_padding);
318   return TRUE;
319 }
320
321 /* We use our own tdata type.  Its first field is the COFF tdata type,
322    so the COFF routines are compatible.  */
323
324 bfd_boolean
325 _bfd_xcoff_mkobject (bfd *abfd)
326 {
327   coff_data_type *coff;
328   bfd_size_type amt = sizeof (struct xcoff_tdata);
329
330   abfd->tdata.xcoff_obj_data = (struct xcoff_tdata *) bfd_zalloc (abfd, amt);
331   if (abfd->tdata.xcoff_obj_data == NULL)
332     return FALSE;
333   coff = coff_data (abfd);
334   coff->symbols = (coff_symbol_type *) NULL;
335   coff->conversion_table = (unsigned int *) NULL;
336   coff->raw_syments = (struct coff_ptr_struct *) NULL;
337   coff->relocbase = 0;
338
339   xcoff_data (abfd)->modtype = ('1' << 8) | 'L';
340
341   /* We set cputype to -1 to indicate that it has not been
342      initialized.  */
343   xcoff_data (abfd)->cputype = -1;
344
345   xcoff_data (abfd)->csects = NULL;
346   xcoff_data (abfd)->debug_indices = NULL;
347
348   /* text section alignment is different than the default */
349   bfd_xcoff_text_align_power (abfd) = 2;
350
351   return TRUE;
352 }
353
354 /* Copy XCOFF data from one BFD to another.  */
355
356 bfd_boolean
357 _bfd_xcoff_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
358 {
359   struct xcoff_tdata *ix, *ox;
360   asection *sec;
361
362   if (ibfd->xvec != obfd->xvec)
363     return TRUE;
364   ix = xcoff_data (ibfd);
365   ox = xcoff_data (obfd);
366   ox->full_aouthdr = ix->full_aouthdr;
367   ox->toc = ix->toc;
368   if (ix->sntoc == 0)
369     ox->sntoc = 0;
370   else
371     {
372       sec = coff_section_from_bfd_index (ibfd, ix->sntoc);
373       if (sec == NULL)
374         ox->sntoc = 0;
375       else
376         ox->sntoc = sec->output_section->target_index;
377     }
378   if (ix->snentry == 0)
379     ox->snentry = 0;
380   else
381     {
382       sec = coff_section_from_bfd_index (ibfd, ix->snentry);
383       if (sec == NULL)
384         ox->snentry = 0;
385       else
386         ox->snentry = sec->output_section->target_index;
387     }
388   bfd_xcoff_text_align_power (obfd) = bfd_xcoff_text_align_power (ibfd);
389   bfd_xcoff_data_align_power (obfd) = bfd_xcoff_data_align_power (ibfd);
390   ox->modtype = ix->modtype;
391   ox->cputype = ix->cputype;
392   ox->maxdata = ix->maxdata;
393   ox->maxstack = ix->maxstack;
394   return TRUE;
395 }
396
397 /* I don't think XCOFF really has a notion of local labels based on
398    name.  This will mean that ld -X doesn't actually strip anything.
399    The AIX native linker does not have a -X option, and it ignores the
400    -x option.  */
401
402 bfd_boolean
403 _bfd_xcoff_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
404                                 const char *name ATTRIBUTE_UNUSED)
405 {
406   return FALSE;
407 }
408
409 static const struct dwarf_debug_section xcoff_debug_sections[] =
410 {
411   { ".dwabrev",         NULL },
412   { ".dwarnge",         NULL },
413   { NULL,       NULL }, /* .debug_frame */
414   { ".dwinfo",          NULL },
415   { ".dwline",          NULL },
416   { NULL,       NULL }, /* .debug_loc */
417   { NULL,       NULL }, /* .debug_macinfo */
418   { NULL,       NULL }, /* .debug_macro */
419   { ".dwpbnms",         NULL },
420   { ".dwpbtyp",         NULL },
421   { ".dwrnges",         NULL },
422   { NULL,       NULL }, /* .debug_static_func */
423   { NULL,       NULL }, /* .debug_static_vars */
424   { ".dwstr",   NULL },
425   { NULL,       NULL }, /* .debug_types */
426   /* GNU DWARF 1 extensions */
427   { NULL,       NULL }, /* .debug_sfnames */
428   { NULL,       NULL }, /* .debug_srcinfo */
429   /* SGI/MIPS DWARF 2 extensions */
430   { NULL,       NULL }, /* .debug_funcnames */
431   { NULL,       NULL }, /* .debug_typenames */
432   { NULL,       NULL }, /* .debug_varnames */
433   { NULL,       NULL }, /* .debug_weaknames */
434   { NULL,       NULL },
435 };
436
437 static bfd_boolean
438 xcoff_find_nearest_line (bfd *abfd,
439                          asection *section,
440                          asymbol **symbols,
441                          bfd_vma offset,
442                          const char **filename_ptr,
443                          const char **functionname_ptr,
444                          unsigned int *line_ptr)
445 {
446   return coff_find_nearest_line_with_names (abfd, xcoff_debug_sections,
447                                             section, symbols, offset,
448                                             filename_ptr, functionname_ptr,
449                                             line_ptr);
450 }
451
452 \f
453 void
454 _bfd_xcoff_swap_sym_in (bfd *abfd, PTR ext1, PTR in1)
455 {
456   SYMENT *ext = (SYMENT *)ext1;
457   struct internal_syment * in = (struct internal_syment *)in1;
458
459   if (ext->e.e_name[0] != 0)
460     {
461       memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
462     }
463   else
464     {
465       in->_n._n_n._n_zeroes = 0;
466       in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
467     }
468
469   in->n_value = H_GET_32 (abfd, ext->e_value);
470   in->n_scnum = H_GET_16 (abfd, ext->e_scnum);
471   in->n_type = H_GET_16 (abfd, ext->e_type);
472   in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
473   in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
474 }
475
476 unsigned int
477 _bfd_xcoff_swap_sym_out (bfd *abfd, PTR inp, PTR extp)
478 {
479   struct internal_syment *in = (struct internal_syment *)inp;
480   SYMENT *ext =(SYMENT *)extp;
481
482   if (in->_n._n_name[0] != 0)
483     {
484       memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
485     }
486   else
487     {
488       H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
489       H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
490     }
491
492   H_PUT_32 (abfd, in->n_value, ext->e_value);
493   H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
494   H_PUT_16 (abfd, in->n_type, ext->e_type);
495   H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
496   H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
497   return bfd_coff_symesz (abfd);
498 }
499
500 void
501 _bfd_xcoff_swap_aux_in (bfd *abfd, PTR ext1, int type, int in_class,
502                         int indx, int numaux, PTR in1)
503 {
504   AUXENT * ext = (AUXENT *)ext1;
505   union internal_auxent *in = (union internal_auxent *)in1;
506
507   switch (in_class)
508     {
509     case C_FILE:
510       if (ext->x_file.x_n.x_fname[0] == 0)
511         {
512           in->x_file.x_n.x_zeroes = 0;
513           in->x_file.x_n.x_offset =
514             H_GET_32 (abfd, ext->x_file.x_n.x_n.x_offset);
515         }
516       else
517         {
518           if (numaux > 1)
519             {
520               if (indx == 0)
521                 memcpy (in->x_file.x_fname, ext->x_file.x_n.x_fname,
522                         numaux * sizeof (AUXENT));
523             }
524           else
525             {
526               memcpy (in->x_file.x_fname, ext->x_file.x_n.x_fname, FILNMLEN);
527             }
528         }
529       goto end;
530
531       /* RS/6000 "csect" auxents */
532     case C_EXT:
533     case C_AIX_WEAKEXT:
534     case C_HIDEXT:
535       if (indx + 1 == numaux)
536         {
537           in->x_csect.x_scnlen.l = H_GET_32 (abfd, ext->x_csect.x_scnlen);
538           in->x_csect.x_parmhash = H_GET_32 (abfd, ext->x_csect.x_parmhash);
539           in->x_csect.x_snhash   = H_GET_16 (abfd, ext->x_csect.x_snhash);
540           /* We don't have to hack bitfields in x_smtyp because it's
541              defined by shifts-and-ands, which are equivalent on all
542              byte orders.  */
543           in->x_csect.x_smtyp    = H_GET_8 (abfd, ext->x_csect.x_smtyp);
544           in->x_csect.x_smclas   = H_GET_8 (abfd, ext->x_csect.x_smclas);
545           in->x_csect.x_stab     = H_GET_32 (abfd, ext->x_csect.x_stab);
546           in->x_csect.x_snstab   = H_GET_16 (abfd, ext->x_csect.x_snstab);
547           goto end;
548         }
549       break;
550
551     case C_STAT:
552     case C_LEAFSTAT:
553     case C_HIDDEN:
554       if (type == T_NULL)
555         {
556           in->x_scn.x_scnlen = H_GET_32 (abfd, ext->x_scn.x_scnlen);
557           in->x_scn.x_nreloc = H_GET_16 (abfd, ext->x_scn.x_nreloc);
558           in->x_scn.x_nlinno = H_GET_16 (abfd, ext->x_scn.x_nlinno);
559           /* PE defines some extra fields; we zero them out for
560              safety.  */
561           in->x_scn.x_checksum = 0;
562           in->x_scn.x_associated = 0;
563           in->x_scn.x_comdat = 0;
564
565           goto end;
566         }
567       break;
568     }
569
570   in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx);
571   in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
572
573   if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
574       || ISTAG (in_class))
575     {
576       in->x_sym.x_fcnary.x_fcn.x_lnnoptr =
577         H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
578       in->x_sym.x_fcnary.x_fcn.x_endndx.l =
579         H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx);
580     }
581   else
582     {
583       in->x_sym.x_fcnary.x_ary.x_dimen[0] =
584         H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
585       in->x_sym.x_fcnary.x_ary.x_dimen[1] =
586         H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
587       in->x_sym.x_fcnary.x_ary.x_dimen[2] =
588         H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
589       in->x_sym.x_fcnary.x_ary.x_dimen[3] =
590         H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
591     }
592
593   if (ISFCN (type))
594     {
595       in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
596     }
597   else
598     {
599       in->x_sym.x_misc.x_lnsz.x_lnno =
600         H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno);
601       in->x_sym.x_misc.x_lnsz.x_size =
602         H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size);
603     }
604
605  end: ;
606   /* The semicolon is because MSVC doesn't like labels at
607      end of block.  */
608 }
609
610 unsigned int
611 _bfd_xcoff_swap_aux_out (bfd *abfd, PTR inp, int type, int in_class,
612                          int indx ATTRIBUTE_UNUSED,
613                          int numaux ATTRIBUTE_UNUSED,
614                          PTR extp)
615 {
616   union internal_auxent *in = (union internal_auxent *)inp;
617   AUXENT *ext = (AUXENT *)extp;
618
619   memset ((PTR)ext, 0, bfd_coff_auxesz (abfd));
620   switch (in_class)
621     {
622     case C_FILE:
623       if (in->x_file.x_fname[0] == 0)
624         {
625           H_PUT_32 (abfd, 0, ext->x_file.x_n.x_n.x_zeroes);
626           H_PUT_32 (abfd, in->x_file.x_n.x_offset,
627                     ext->x_file.x_n.x_n.x_offset);
628         }
629       else
630         {
631           memcpy (ext->x_file.x_n.x_fname, in->x_file.x_fname, FILNMLEN);
632         }
633       goto end;
634
635       /* RS/6000 "csect" auxents */
636     case C_EXT:
637     case C_AIX_WEAKEXT:
638     case C_HIDEXT:
639       if (indx + 1 == numaux)
640         {
641           H_PUT_32 (abfd, in->x_csect.x_scnlen.l, ext->x_csect.x_scnlen);
642           H_PUT_32 (abfd, in->x_csect.x_parmhash, ext->x_csect.x_parmhash);
643           H_PUT_16 (abfd, in->x_csect.x_snhash, ext->x_csect.x_snhash);
644           /* We don't have to hack bitfields in x_smtyp because it's
645              defined by shifts-and-ands, which are equivalent on all
646              byte orders.  */
647           H_PUT_8 (abfd, in->x_csect.x_smtyp, ext->x_csect.x_smtyp);
648           H_PUT_8 (abfd, in->x_csect.x_smclas, ext->x_csect.x_smclas);
649           H_PUT_32 (abfd, in->x_csect.x_stab, ext->x_csect.x_stab);
650           H_PUT_16 (abfd, in->x_csect.x_snstab, ext->x_csect.x_snstab);
651           goto end;
652         }
653       break;
654
655     case C_STAT:
656     case C_LEAFSTAT:
657     case C_HIDDEN:
658       if (type == T_NULL)
659         {
660           H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->x_scn.x_scnlen);
661           H_PUT_16 (abfd, in->x_scn.x_nreloc, ext->x_scn.x_nreloc);
662           H_PUT_16 (abfd, in->x_scn.x_nlinno, ext->x_scn.x_nlinno);
663           goto end;
664         }
665       break;
666     }
667
668   H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx);
669   H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
670
671   if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
672       || ISTAG (in_class))
673     {
674       H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
675                 ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
676       H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l,
677                 ext->x_sym.x_fcnary.x_fcn.x_endndx);
678     }
679   else
680     {
681       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
682                 ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
683       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
684                 ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
685       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
686                 ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
687       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
688                 ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
689     }
690
691   if (ISFCN (type))
692     H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
693   else
694     {
695       H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno,
696                 ext->x_sym.x_misc.x_lnsz.x_lnno);
697       H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_size,
698                 ext->x_sym.x_misc.x_lnsz.x_size);
699     }
700
701 end:
702   return bfd_coff_auxesz (abfd);
703 }
704
705
706 \f
707 /* The XCOFF reloc table.  Actually, XCOFF relocations specify the
708    bitsize and whether they are signed or not, along with a
709    conventional type.  This table is for the types, which are used for
710    different algorithms for putting in the reloc.  Many of these
711    relocs need special_function entries, which I have not written.  */
712
713
714 reloc_howto_type xcoff_howto_table[] =
715 {
716   /* Standard 32 bit relocation.  */
717   HOWTO (R_POS,                 /* type */
718          0,                     /* rightshift */
719          2,                     /* size (0 = byte, 1 = short, 2 = long) */
720          32,                    /* bitsize */
721          FALSE,                 /* pc_relative */
722          0,                     /* bitpos */
723          complain_overflow_bitfield, /* complain_on_overflow */
724          0,                     /* special_function */
725          "R_POS",               /* name */
726          TRUE,                  /* partial_inplace */
727          0xffffffff,            /* src_mask */
728          0xffffffff,            /* dst_mask */
729          FALSE),                /* pcrel_offset */
730
731   /* 32 bit relocation, but store negative value.  */
732   HOWTO (R_NEG,                 /* type */
733          0,                     /* rightshift */
734          -2,                    /* size (0 = byte, 1 = short, 2 = long) */
735          32,                    /* bitsize */
736          FALSE,                 /* pc_relative */
737          0,                     /* bitpos */
738          complain_overflow_bitfield, /* complain_on_overflow */
739          0,                     /* special_function */
740          "R_NEG",               /* name */
741          TRUE,                  /* partial_inplace */
742          0xffffffff,            /* src_mask */
743          0xffffffff,            /* dst_mask */
744          FALSE),                /* pcrel_offset */
745
746   /* 32 bit PC relative relocation.  */
747   HOWTO (R_REL,                 /* type */
748          0,                     /* rightshift */
749          2,                     /* size (0 = byte, 1 = short, 2 = long) */
750          32,                    /* bitsize */
751          TRUE,                  /* pc_relative */
752          0,                     /* bitpos */
753          complain_overflow_signed, /* complain_on_overflow */
754          0,                     /* special_function */
755          "R_REL",               /* name */
756          TRUE,                  /* partial_inplace */
757          0xffffffff,            /* src_mask */
758          0xffffffff,            /* dst_mask */
759          FALSE),                /* pcrel_offset */
760
761   /* 16 bit TOC relative relocation.  */
762   HOWTO (R_TOC,                 /* type */
763          0,                     /* rightshift */
764          1,                     /* size (0 = byte, 1 = short, 2 = long) */
765          16,                    /* bitsize */
766          FALSE,                 /* pc_relative */
767          0,                     /* bitpos */
768          complain_overflow_bitfield, /* complain_on_overflow */
769          0,                     /* special_function */
770          "R_TOC",               /* name */
771          TRUE,                  /* partial_inplace */
772          0xffff,                /* src_mask */
773          0xffff,                /* dst_mask */
774          FALSE),                /* pcrel_offset */
775
776   /* I don't really know what this is.  */
777   HOWTO (R_RTB,                 /* type */
778          1,                     /* rightshift */
779          2,                     /* size (0 = byte, 1 = short, 2 = long) */
780          32,                    /* bitsize */
781          FALSE,                 /* pc_relative */
782          0,                     /* bitpos */
783          complain_overflow_bitfield, /* complain_on_overflow */
784          0,                     /* special_function */
785          "R_RTB",               /* name */
786          TRUE,                  /* partial_inplace */
787          0xffffffff,            /* src_mask */
788          0xffffffff,            /* dst_mask */
789          FALSE),                /* pcrel_offset */
790
791   /* External TOC relative symbol.  */
792   HOWTO (R_GL,                  /* type */
793          0,                     /* rightshift */
794          1,                     /* size (0 = byte, 1 = short, 2 = long) */
795          16,                    /* bitsize */
796          FALSE,                 /* pc_relative */
797          0,                     /* bitpos */
798          complain_overflow_bitfield, /* complain_on_overflow */
799          0,                     /* special_function */
800          "R_GL",                /* name */
801          TRUE,                  /* partial_inplace */
802          0xffff,                /* src_mask */
803          0xffff,                /* dst_mask */
804          FALSE),                /* pcrel_offset */
805
806   /* Local TOC relative symbol.  */
807   HOWTO (R_TCL,                 /* type */
808          0,                     /* rightshift */
809          1,                     /* size (0 = byte, 1 = short, 2 = long) */
810          16,                    /* bitsize */
811          FALSE,                 /* pc_relative */
812          0,                     /* bitpos */
813          complain_overflow_bitfield, /* complain_on_overflow */
814          0,                     /* special_function */
815          "R_TCL",               /* name */
816          TRUE,                  /* partial_inplace */
817          0xffff,                /* src_mask */
818          0xffff,                /* dst_mask */
819          FALSE),                /* pcrel_offset */
820
821   EMPTY_HOWTO (7),
822
823   /* Non modifiable absolute branch.  */
824   HOWTO (R_BA,                  /* type */
825          0,                     /* rightshift */
826          2,                     /* size (0 = byte, 1 = short, 2 = long) */
827          26,                    /* bitsize */
828          FALSE,                 /* pc_relative */
829          0,                     /* bitpos */
830          complain_overflow_bitfield, /* complain_on_overflow */
831          0,                     /* special_function */
832          "R_BA_26",             /* name */
833          TRUE,                  /* partial_inplace */
834          0x03fffffc,            /* src_mask */
835          0x03fffffc,            /* dst_mask */
836          FALSE),                /* pcrel_offset */
837
838   EMPTY_HOWTO (9),
839
840   /* Non modifiable relative branch.  */
841   HOWTO (R_BR,                  /* type */
842          0,                     /* rightshift */
843          2,                     /* size (0 = byte, 1 = short, 2 = long) */
844          26,                    /* bitsize */
845          TRUE,                  /* pc_relative */
846          0,                     /* bitpos */
847          complain_overflow_signed, /* complain_on_overflow */
848          0,                     /* special_function */
849          "R_BR",                /* name */
850          TRUE,                  /* partial_inplace */
851          0x03fffffc,            /* src_mask */
852          0x03fffffc,            /* dst_mask */
853          FALSE),                /* pcrel_offset */
854
855   EMPTY_HOWTO (0xb),
856
857   /* Indirect load.  */
858   HOWTO (R_RL,                  /* type */
859          0,                     /* rightshift */
860          1,                     /* size (0 = byte, 1 = short, 2 = long) */
861          16,                    /* bitsize */
862          FALSE,                 /* pc_relative */
863          0,                     /* bitpos */
864          complain_overflow_bitfield, /* complain_on_overflow */
865          0,                     /* special_function */
866          "R_RL",                /* name */
867          TRUE,                  /* partial_inplace */
868          0xffff,                /* src_mask */
869          0xffff,                /* dst_mask */
870          FALSE),                /* pcrel_offset */
871
872   /* Load address.  */
873   HOWTO (R_RLA,                 /* type */
874          0,                     /* rightshift */
875          1,                     /* size (0 = byte, 1 = short, 2 = long) */
876          16,                    /* bitsize */
877          FALSE,                 /* pc_relative */
878          0,                     /* bitpos */
879          complain_overflow_bitfield, /* complain_on_overflow */
880          0,                     /* special_function */
881          "R_RLA",               /* name */
882          TRUE,                  /* partial_inplace */
883          0xffff,                /* src_mask */
884          0xffff,                /* dst_mask */
885          FALSE),                /* pcrel_offset */
886
887   EMPTY_HOWTO (0xe),
888
889   /* Non-relocating reference.  Bitsize is 1 so that r_rsize is 0.  */
890   HOWTO (R_REF,                 /* type */
891          0,                     /* rightshift */
892          0,                     /* size (0 = byte, 1 = short, 2 = long) */
893          1,                     /* bitsize */
894          FALSE,                 /* pc_relative */
895          0,                     /* bitpos */
896          complain_overflow_dont, /* complain_on_overflow */
897          0,                     /* special_function */
898          "R_REF",               /* name */
899          FALSE,                 /* partial_inplace */
900          0,                     /* src_mask */
901          0,                     /* dst_mask */
902          FALSE),                /* pcrel_offset */
903
904   EMPTY_HOWTO (0x10),
905   EMPTY_HOWTO (0x11),
906
907   /* TOC relative indirect load.  */
908   HOWTO (R_TRL,                 /* type */
909          0,                     /* rightshift */
910          1,                     /* size (0 = byte, 1 = short, 2 = long) */
911          16,                    /* bitsize */
912          FALSE,                 /* pc_relative */
913          0,                     /* bitpos */
914          complain_overflow_bitfield, /* complain_on_overflow */
915          0,                     /* special_function */
916          "R_TRL",               /* name */
917          TRUE,                  /* partial_inplace */
918          0xffff,                /* src_mask */
919          0xffff,                /* dst_mask */
920          FALSE),                /* pcrel_offset */
921
922   /* TOC relative load address.  */
923   HOWTO (R_TRLA,                /* type */
924          0,                     /* rightshift */
925          1,                     /* size (0 = byte, 1 = short, 2 = long) */
926          16,                    /* bitsize */
927          FALSE,                 /* pc_relative */
928          0,                     /* bitpos */
929          complain_overflow_bitfield, /* complain_on_overflow */
930          0,                     /* special_function */
931          "R_TRLA",              /* name */
932          TRUE,                  /* partial_inplace */
933          0xffff,                /* src_mask */
934          0xffff,                /* dst_mask */
935          FALSE),                /* pcrel_offset */
936
937   /* Modifiable relative branch.  */
938   HOWTO (R_RRTBI,                /* type */
939          1,                     /* rightshift */
940          2,                     /* size (0 = byte, 1 = short, 2 = long) */
941          32,                    /* bitsize */
942          FALSE,                 /* pc_relative */
943          0,                     /* bitpos */
944          complain_overflow_bitfield, /* complain_on_overflow */
945          0,                     /* special_function */
946          "R_RRTBI",             /* name */
947          TRUE,                  /* partial_inplace */
948          0xffffffff,            /* src_mask */
949          0xffffffff,            /* dst_mask */
950          FALSE),                /* pcrel_offset */
951
952   /* Modifiable absolute branch.  */
953   HOWTO (R_RRTBA,                /* type */
954          1,                     /* rightshift */
955          2,                     /* size (0 = byte, 1 = short, 2 = long) */
956          32,                    /* bitsize */
957          FALSE,                 /* pc_relative */
958          0,                     /* bitpos */
959          complain_overflow_bitfield, /* complain_on_overflow */
960          0,                     /* special_function */
961          "R_RRTBA",             /* name */
962          TRUE,                  /* partial_inplace */
963          0xffffffff,            /* src_mask */
964          0xffffffff,            /* dst_mask */
965          FALSE),                /* pcrel_offset */
966
967   /* Modifiable call absolute indirect.  */
968   HOWTO (R_CAI,                 /* type */
969          0,                     /* rightshift */
970          1,                     /* size (0 = byte, 1 = short, 2 = long) */
971          16,                    /* bitsize */
972          FALSE,                 /* pc_relative */
973          0,                     /* bitpos */
974          complain_overflow_bitfield, /* complain_on_overflow */
975          0,                     /* special_function */
976          "R_CAI",               /* name */
977          TRUE,                  /* partial_inplace */
978          0xffff,                /* src_mask */
979          0xffff,                /* dst_mask */
980          FALSE),                /* pcrel_offset */
981
982   /* Modifiable call relative.  */
983   HOWTO (R_CREL,                /* type */
984          0,                     /* rightshift */
985          1,                     /* size (0 = byte, 1 = short, 2 = long) */
986          16,                    /* bitsize */
987          FALSE,                 /* pc_relative */
988          0,                     /* bitpos */
989          complain_overflow_bitfield, /* complain_on_overflow */
990          0,                     /* special_function */
991          "R_CREL",              /* name */
992          TRUE,                  /* partial_inplace */
993          0xffff,                /* src_mask */
994          0xffff,                /* dst_mask */
995          FALSE),                /* pcrel_offset */
996
997   /* Modifiable branch absolute.  */
998   HOWTO (R_RBA,                 /* type */
999          0,                     /* rightshift */
1000          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1001          26,                    /* bitsize */
1002          FALSE,                 /* pc_relative */
1003          0,                     /* bitpos */
1004          complain_overflow_bitfield, /* complain_on_overflow */
1005          0,                     /* special_function */
1006          "R_RBA",               /* name */
1007          TRUE,                  /* partial_inplace */
1008          0x03fffffc,            /* src_mask */
1009          0x03fffffc,            /* dst_mask */
1010          FALSE),                /* pcrel_offset */
1011
1012   /* Modifiable branch absolute.  */
1013   HOWTO (R_RBAC,                /* type */
1014          0,                     /* rightshift */
1015          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1016          32,                    /* bitsize */
1017          FALSE,                 /* pc_relative */
1018          0,                     /* bitpos */
1019          complain_overflow_bitfield, /* complain_on_overflow */
1020          0,                     /* special_function */
1021          "R_RBAC",              /* name */
1022          TRUE,                  /* partial_inplace */
1023          0xffffffff,            /* src_mask */
1024          0xffffffff,            /* dst_mask */
1025          FALSE),                /* pcrel_offset */
1026
1027   /* Modifiable branch relative.  */
1028   HOWTO (R_RBR,                 /* type */
1029          0,                     /* rightshift */
1030          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1031          26,                    /* bitsize */
1032          FALSE,                 /* pc_relative */
1033          0,                     /* bitpos */
1034          complain_overflow_signed, /* complain_on_overflow */
1035          0,                     /* special_function */
1036          "R_RBR_26",            /* name */
1037          TRUE,                  /* partial_inplace */
1038          0x03fffffc,            /* src_mask */
1039          0x03fffffc,            /* dst_mask */
1040          FALSE),                /* pcrel_offset */
1041
1042   /* Modifiable branch absolute.  */
1043   HOWTO (R_RBRC,                /* type */
1044          0,                     /* rightshift */
1045          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1046          16,                    /* bitsize */
1047          FALSE,                 /* pc_relative */
1048          0,                     /* bitpos */
1049          complain_overflow_bitfield, /* complain_on_overflow */
1050          0,                     /* special_function */
1051          "R_RBRC",              /* name */
1052          TRUE,                  /* partial_inplace */
1053          0xffff,                /* src_mask */
1054          0xffff,                /* dst_mask */
1055          FALSE),                /* pcrel_offset */
1056
1057   /* 16 bit Non modifiable absolute branch.  */
1058   HOWTO (R_BA,                  /* type */
1059          0,                     /* rightshift */
1060          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1061          16,                    /* bitsize */
1062          FALSE,                 /* pc_relative */
1063          0,                     /* bitpos */
1064          complain_overflow_bitfield, /* complain_on_overflow */
1065          0,                     /* special_function */
1066          "R_BA_16",             /* name */
1067          TRUE,                  /* partial_inplace */
1068          0xfffc,                /* src_mask */
1069          0xfffc,                /* dst_mask */
1070          FALSE),                /* pcrel_offset */
1071
1072   /* Modifiable branch relative.  */
1073   HOWTO (R_RBR,                 /* type */
1074          0,                     /* rightshift */
1075          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1076          16,                    /* bitsize */
1077          FALSE,                 /* pc_relative */
1078          0,                     /* bitpos */
1079          complain_overflow_signed, /* complain_on_overflow */
1080          0,                     /* special_function */
1081          "R_RBR_16",            /* name */
1082          TRUE,                  /* partial_inplace */
1083          0xffff,                /* src_mask */
1084          0xffff,                /* dst_mask */
1085          FALSE),                /* pcrel_offset */
1086
1087   /* Modifiable branch relative.  */
1088   HOWTO (R_RBA,                 /* type */
1089          0,                     /* rightshift */
1090          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1091          16,                    /* bitsize */
1092          FALSE,                 /* pc_relative */
1093          0,                     /* bitpos */
1094          complain_overflow_signed, /* complain_on_overflow */
1095          0,                     /* special_function */
1096          "R_RBA_16",            /* name */
1097          TRUE,                  /* partial_inplace */
1098          0xffff,                /* src_mask */
1099          0xffff,                /* dst_mask */
1100          FALSE),                /* pcrel_offset */
1101
1102 };
1103
1104 void
1105 xcoff_rtype2howto (arelent *relent, struct internal_reloc *internal)
1106 {
1107   if (internal->r_type > R_RBRC)
1108     abort ();
1109
1110   /* Default howto layout works most of the time */
1111   relent->howto = &xcoff_howto_table[internal->r_type];
1112
1113   /* Special case some 16 bit reloc */
1114   if (15 == (internal->r_size & 0x1f))
1115     {
1116       if (R_BA == internal->r_type)
1117         relent->howto = &xcoff_howto_table[0x1c];
1118       else if (R_RBR == internal->r_type)
1119         relent->howto = &xcoff_howto_table[0x1d];
1120       else if (R_RBA == internal->r_type)
1121         relent->howto = &xcoff_howto_table[0x1e];
1122     }
1123
1124   /* The r_size field of an XCOFF reloc encodes the bitsize of the
1125      relocation, as well as indicating whether it is signed or not.
1126      Doublecheck that the relocation information gathered from the
1127      type matches this information.  The bitsize is not significant
1128      for R_REF relocs.  */
1129   if (relent->howto->dst_mask != 0
1130       && (relent->howto->bitsize
1131           != ((unsigned int) internal->r_size & 0x1f) + 1))
1132     abort ();
1133 }
1134
1135 reloc_howto_type *
1136 _bfd_xcoff_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1137                               bfd_reloc_code_real_type code)
1138 {
1139   switch (code)
1140     {
1141     case BFD_RELOC_PPC_B26:
1142       return &xcoff_howto_table[0xa];
1143     case BFD_RELOC_PPC_BA16:
1144       return &xcoff_howto_table[0x1c];
1145     case BFD_RELOC_PPC_BA26:
1146       return &xcoff_howto_table[8];
1147     case BFD_RELOC_PPC_TOC16:
1148       return &xcoff_howto_table[3];
1149     case BFD_RELOC_32:
1150     case BFD_RELOC_CTOR:
1151       return &xcoff_howto_table[0];
1152     case BFD_RELOC_NONE:
1153       return &xcoff_howto_table[0xf];
1154     default:
1155       return NULL;
1156     }
1157 }
1158
1159 static reloc_howto_type *
1160 _bfd_xcoff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1161                               const char *r_name)
1162 {
1163   unsigned int i;
1164
1165   for (i = 0;
1166        i < sizeof (xcoff_howto_table) / sizeof (xcoff_howto_table[0]);
1167        i++)
1168     if (xcoff_howto_table[i].name != NULL
1169         && strcasecmp (xcoff_howto_table[i].name, r_name) == 0)
1170       return &xcoff_howto_table[i];
1171
1172   return NULL;
1173 }
1174 \f
1175 /* XCOFF archive support.  The original version of this code was by
1176    Damon A. Permezel.  It was enhanced to permit cross support, and
1177    writing archive files, by Ian Lance Taylor, Cygnus Support.
1178
1179    XCOFF uses its own archive format.  Everything is hooked together
1180    with file offset links, so it is possible to rapidly update an
1181    archive in place.  Of course, we don't do that.  An XCOFF archive
1182    has a real file header, not just an ARMAG string.  The structure of
1183    the file header and of each archive header appear below.
1184
1185    An XCOFF archive also has a member table, which is a list of
1186    elements in the archive (you can get that by looking through the
1187    linked list, but you have to read a lot more of the file).  The
1188    member table has a normal archive header with an empty name.  It is
1189    normally (and perhaps must be) the second to last entry in the
1190    archive.  The member table data is almost printable ASCII.  It
1191    starts with a 12 character decimal string which is the number of
1192    entries in the table.  For each entry it has a 12 character decimal
1193    string which is the offset in the archive of that member.  These
1194    entries are followed by a series of null terminated strings which
1195    are the member names for each entry.
1196
1197    Finally, an XCOFF archive has a global symbol table, which is what
1198    we call the armap.  The global symbol table has a normal archive
1199    header with an empty name.  It is normally (and perhaps must be)
1200    the last entry in the archive.  The contents start with a four byte
1201    binary number which is the number of entries.  This is followed by
1202    a that many four byte binary numbers; each is the file offset of an
1203    entry in the archive.  These numbers are followed by a series of
1204    null terminated strings, which are symbol names.
1205
1206    AIX 4.3 introduced a new archive format which can handle larger
1207    files and also 32- and 64-bit objects in the same archive.  The
1208    things said above remain true except that there is now more than
1209    one global symbol table.  The one is used to index 32-bit objects,
1210    the other for 64-bit objects.
1211
1212    The new archives (recognizable by the new ARMAG string) has larger
1213    field lengths so that we cannot really share any code.  Also we have
1214    to take care that we are not generating the new form of archives
1215    on AIX 4.2 or earlier systems.  */
1216
1217 /* XCOFF archives use this as a magic string.  Note that both strings
1218    have the same length.  */
1219
1220 /* Set the magic for archive.  */
1221
1222 bfd_boolean
1223 bfd_xcoff_ar_archive_set_magic (bfd *abfd ATTRIBUTE_UNUSED,
1224                                 char *magic ATTRIBUTE_UNUSED)
1225 {
1226   /* Not supported yet.  */
1227   return FALSE;
1228  /* bfd_xcoff_archive_set_magic (abfd, magic); */
1229 }
1230
1231 /* Read in the armap of an XCOFF archive.  */
1232
1233 bfd_boolean
1234 _bfd_xcoff_slurp_armap (bfd *abfd)
1235 {
1236   file_ptr off;
1237   size_t namlen;
1238   bfd_size_type sz;
1239   bfd_byte *contents, *cend;
1240   bfd_vma c, i;
1241   carsym *arsym;
1242   bfd_byte *p;
1243
1244   if (xcoff_ardata (abfd) == NULL)
1245     {
1246       bfd_has_map (abfd) = FALSE;
1247       return TRUE;
1248     }
1249
1250   if (! xcoff_big_format_p (abfd))
1251     {
1252       /* This is for the old format.  */
1253       struct xcoff_ar_hdr hdr;
1254
1255       off = strtol (xcoff_ardata (abfd)->symoff, (char **) NULL, 10);
1256       if (off == 0)
1257         {
1258           bfd_has_map (abfd) = FALSE;
1259           return TRUE;
1260         }
1261
1262       if (bfd_seek (abfd, off, SEEK_SET) != 0)
1263         return FALSE;
1264
1265       /* The symbol table starts with a normal archive header.  */
1266       if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
1267           != SIZEOF_AR_HDR)
1268         return FALSE;
1269
1270       /* Skip the name (normally empty).  */
1271       namlen = strtol (hdr.namlen, (char **) NULL, 10);
1272       off = ((namlen + 1) & ~ (size_t) 1) + SXCOFFARFMAG;
1273       if (bfd_seek (abfd, off, SEEK_CUR) != 0)
1274         return FALSE;
1275
1276       sz = strtol (hdr.size, (char **) NULL, 10);
1277
1278       /* Read in the entire symbol table.  */
1279       contents = (bfd_byte *) bfd_alloc (abfd, sz);
1280       if (contents == NULL)
1281         return FALSE;
1282       if (bfd_bread ((PTR) contents, sz, abfd) != sz)
1283         return FALSE;
1284
1285       /* The symbol table starts with a four byte count.  */
1286       c = H_GET_32 (abfd, contents);
1287
1288       if (c * 4 >= sz)
1289         {
1290           bfd_set_error (bfd_error_bad_value);
1291           return FALSE;
1292         }
1293
1294       bfd_ardata (abfd)->symdefs =
1295         ((carsym *) bfd_alloc (abfd, c * sizeof (carsym)));
1296       if (bfd_ardata (abfd)->symdefs == NULL)
1297         return FALSE;
1298
1299       /* After the count comes a list of four byte file offsets.  */
1300       for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 4;
1301            i < c;
1302            ++i, ++arsym, p += 4)
1303         arsym->file_offset = H_GET_32 (abfd, p);
1304     }
1305   else
1306     {
1307       /* This is for the new format.  */
1308       struct xcoff_ar_hdr_big hdr;
1309
1310       off = strtol (xcoff_ardata_big (abfd)->symoff, (char **) NULL, 10);
1311       if (off == 0)
1312         {
1313           bfd_has_map (abfd) = FALSE;
1314           return TRUE;
1315         }
1316
1317       if (bfd_seek (abfd, off, SEEK_SET) != 0)
1318         return FALSE;
1319
1320       /* The symbol table starts with a normal archive header.  */
1321       if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
1322           != SIZEOF_AR_HDR_BIG)
1323         return FALSE;
1324
1325       /* Skip the name (normally empty).  */
1326       namlen = strtol (hdr.namlen, (char **) NULL, 10);
1327       off = ((namlen + 1) & ~ (size_t) 1) + SXCOFFARFMAG;
1328       if (bfd_seek (abfd, off, SEEK_CUR) != 0)
1329         return FALSE;
1330
1331       /* XXX This actually has to be a call to strtoll (at least on 32-bit
1332          machines) since the field width is 20 and there numbers with more
1333          than 32 bits can be represented.  */
1334       sz = strtol (hdr.size, (char **) NULL, 10);
1335
1336       /* Read in the entire symbol table.  */
1337       contents = (bfd_byte *) bfd_alloc (abfd, sz);
1338       if (contents == NULL)
1339         return FALSE;
1340       if (bfd_bread ((PTR) contents, sz, abfd) != sz)
1341         return FALSE;
1342
1343       /* The symbol table starts with an eight byte count.  */
1344       c = H_GET_64 (abfd, contents);
1345
1346       if (c * 8 >= sz)
1347         {
1348           bfd_set_error (bfd_error_bad_value);
1349           return FALSE;
1350         }
1351
1352       bfd_ardata (abfd)->symdefs =
1353         ((carsym *) bfd_alloc (abfd, c * sizeof (carsym)));
1354       if (bfd_ardata (abfd)->symdefs == NULL)
1355         return FALSE;
1356
1357       /* After the count comes a list of eight byte file offsets.  */
1358       for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 8;
1359            i < c;
1360            ++i, ++arsym, p += 8)
1361         arsym->file_offset = H_GET_64 (abfd, p);
1362     }
1363
1364   /* After the file offsets come null terminated symbol names.  */
1365   cend = contents + sz;
1366   for (i = 0, arsym = bfd_ardata (abfd)->symdefs;
1367        i < c;
1368        ++i, ++arsym, p += strlen ((char *) p) + 1)
1369     {
1370       if (p >= cend)
1371         {
1372           bfd_set_error (bfd_error_bad_value);
1373           return FALSE;
1374         }
1375       arsym->name = (char *) p;
1376     }
1377
1378   bfd_ardata (abfd)->symdef_count = c;
1379   bfd_has_map (abfd) = TRUE;
1380
1381   return TRUE;
1382 }
1383
1384 /* See if this is an XCOFF archive.  */
1385
1386 const bfd_target *
1387 _bfd_xcoff_archive_p (bfd *abfd)
1388 {
1389   struct artdata *tdata_hold;
1390   char magic[SXCOFFARMAG];
1391   bfd_size_type amt = SXCOFFARMAG;
1392
1393   if (bfd_bread ((PTR) magic, amt, abfd) != amt)
1394     {
1395       if (bfd_get_error () != bfd_error_system_call)
1396         bfd_set_error (bfd_error_wrong_format);
1397       return NULL;
1398     }
1399
1400   if (strncmp (magic, XCOFFARMAG, SXCOFFARMAG) != 0
1401       && strncmp (magic, XCOFFARMAGBIG, SXCOFFARMAG) != 0)
1402     {
1403       bfd_set_error (bfd_error_wrong_format);
1404       return NULL;
1405     }
1406
1407   tdata_hold = bfd_ardata (abfd);
1408
1409   amt = sizeof (struct artdata);
1410   bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
1411   if (bfd_ardata (abfd) == (struct artdata *) NULL)
1412     goto error_ret_restore;
1413
1414   /* Cleared by bfd_zalloc above.
1415      bfd_ardata (abfd)->cache = NULL;
1416      bfd_ardata (abfd)->archive_head = NULL;
1417      bfd_ardata (abfd)->symdefs = NULL;
1418      bfd_ardata (abfd)->extended_names = NULL;
1419      bfd_ardata (abfd)->extended_names_size = 0;  */
1420
1421   /* Now handle the two formats.  */
1422   if (magic[1] != 'b')
1423     {
1424       /* This is the old format.  */
1425       struct xcoff_ar_file_hdr hdr;
1426
1427       /* Copy over the magic string.  */
1428       memcpy (hdr.magic, magic, SXCOFFARMAG);
1429
1430       /* Now read the rest of the file header.  */
1431       amt = SIZEOF_AR_FILE_HDR - SXCOFFARMAG;
1432       if (bfd_bread ((PTR) &hdr.memoff, amt, abfd) != amt)
1433         {
1434           if (bfd_get_error () != bfd_error_system_call)
1435             bfd_set_error (bfd_error_wrong_format);
1436           goto error_ret;
1437         }
1438
1439       bfd_ardata (abfd)->first_file_filepos = strtol (hdr.firstmemoff,
1440                                                       (char **) NULL, 10);
1441
1442       amt = SIZEOF_AR_FILE_HDR;
1443       bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
1444       if (bfd_ardata (abfd)->tdata == NULL)
1445         goto error_ret;
1446
1447       memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR);
1448     }
1449   else
1450     {
1451       /* This is the new format.  */
1452       struct xcoff_ar_file_hdr_big hdr;
1453
1454       /* Copy over the magic string.  */
1455       memcpy (hdr.magic, magic, SXCOFFARMAG);
1456
1457       /* Now read the rest of the file header.  */
1458       amt = SIZEOF_AR_FILE_HDR_BIG - SXCOFFARMAG;
1459       if (bfd_bread ((PTR) &hdr.memoff, amt, abfd) != amt)
1460         {
1461           if (bfd_get_error () != bfd_error_system_call)
1462             bfd_set_error (bfd_error_wrong_format);
1463           goto error_ret;
1464         }
1465
1466       bfd_ardata (abfd)->first_file_filepos = bfd_scan_vma (hdr.firstmemoff,
1467                                                             (const char **) 0,
1468                                                             10);
1469
1470       amt = SIZEOF_AR_FILE_HDR_BIG;
1471       bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
1472       if (bfd_ardata (abfd)->tdata == NULL)
1473         goto error_ret;
1474
1475       memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR_BIG);
1476     }
1477
1478   if (! _bfd_xcoff_slurp_armap (abfd))
1479     {
1480     error_ret:
1481       bfd_release (abfd, bfd_ardata (abfd));
1482     error_ret_restore:
1483       bfd_ardata (abfd) = tdata_hold;
1484       return NULL;
1485     }
1486
1487   return abfd->xvec;
1488 }
1489
1490 /* Read the archive header in an XCOFF archive.  */
1491
1492 PTR
1493 _bfd_xcoff_read_ar_hdr (bfd *abfd)
1494 {
1495   bfd_size_type namlen;
1496   struct areltdata *ret;
1497   bfd_size_type amt = sizeof (struct areltdata);
1498
1499   ret = (struct areltdata *) bfd_alloc (abfd, amt);
1500   if (ret == NULL)
1501     return NULL;
1502
1503   if (! xcoff_big_format_p (abfd))
1504     {
1505       struct xcoff_ar_hdr hdr;
1506       struct xcoff_ar_hdr *hdrp;
1507
1508       if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
1509           != SIZEOF_AR_HDR)
1510         {
1511           free (ret);
1512           return NULL;
1513         }
1514
1515       namlen = strtol (hdr.namlen, (char **) NULL, 10);
1516       amt = SIZEOF_AR_HDR + namlen + 1;
1517       hdrp = (struct xcoff_ar_hdr *) bfd_alloc (abfd, amt);
1518       if (hdrp == NULL)
1519         {
1520           free (ret);
1521           return NULL;
1522         }
1523       memcpy (hdrp, &hdr, SIZEOF_AR_HDR);
1524       if (bfd_bread ((char *) hdrp + SIZEOF_AR_HDR, namlen, abfd) != namlen)
1525         {
1526           free (ret);
1527           return NULL;
1528         }
1529       ((char *) hdrp)[SIZEOF_AR_HDR + namlen] = '\0';
1530
1531       ret->arch_header = (char *) hdrp;
1532       ret->parsed_size = strtol (hdr.size, (char **) NULL, 10);
1533       ret->filename = (char *) hdrp + SIZEOF_AR_HDR;
1534     }
1535   else
1536     {
1537       struct xcoff_ar_hdr_big hdr;
1538       struct xcoff_ar_hdr_big *hdrp;
1539
1540       if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
1541           != SIZEOF_AR_HDR_BIG)
1542         {
1543           free (ret);
1544           return NULL;
1545         }
1546
1547       namlen = strtol (hdr.namlen, (char **) NULL, 10);
1548       amt = SIZEOF_AR_HDR_BIG + namlen + 1;
1549       hdrp = (struct xcoff_ar_hdr_big *) bfd_alloc (abfd, amt);
1550       if (hdrp == NULL)
1551         {
1552           free (ret);
1553           return NULL;
1554         }
1555       memcpy (hdrp, &hdr, SIZEOF_AR_HDR_BIG);
1556       if (bfd_bread ((char *) hdrp + SIZEOF_AR_HDR_BIG, namlen, abfd) != namlen)
1557         {
1558           free (ret);
1559           return NULL;
1560         }
1561       ((char *) hdrp)[SIZEOF_AR_HDR_BIG + namlen] = '\0';
1562
1563       ret->arch_header = (char *) hdrp;
1564       /* XXX This actually has to be a call to strtoll (at least on 32-bit
1565          machines) since the field width is 20 and there numbers with more
1566          than 32 bits can be represented.  */
1567       ret->parsed_size = strtol (hdr.size, (char **) NULL, 10);
1568       ret->filename = (char *) hdrp + SIZEOF_AR_HDR_BIG;
1569     }
1570
1571   /* Skip over the XCOFFARFMAG at the end of the file name.  */
1572   if (bfd_seek (abfd, (file_ptr) ((namlen & 1) + SXCOFFARFMAG), SEEK_CUR) != 0)
1573     return NULL;
1574
1575   return (PTR) ret;
1576 }
1577
1578 /* Open the next element in an XCOFF archive.  */
1579
1580 bfd *
1581 _bfd_xcoff_openr_next_archived_file (bfd *archive, bfd *last_file)
1582 {
1583   file_ptr filestart;
1584
1585   if (xcoff_ardata (archive) == NULL)
1586     {
1587       bfd_set_error (bfd_error_invalid_operation);
1588       return NULL;
1589     }
1590
1591   if (! xcoff_big_format_p (archive))
1592     {
1593       if (last_file == NULL)
1594         filestart = bfd_ardata (archive)->first_file_filepos;
1595       else
1596         filestart = strtol (arch_xhdr (last_file)->nextoff, (char **) NULL,
1597                             10);
1598
1599       if (filestart == 0
1600           || filestart == strtol (xcoff_ardata (archive)->memoff,
1601                                   (char **) NULL, 10)
1602           || filestart == strtol (xcoff_ardata (archive)->symoff,
1603                                   (char **) NULL, 10))
1604         {
1605           bfd_set_error (bfd_error_no_more_archived_files);
1606           return NULL;
1607         }
1608     }
1609   else
1610     {
1611       if (last_file == NULL)
1612         filestart = bfd_ardata (archive)->first_file_filepos;
1613       else
1614         /* XXX These actually have to be a calls to strtoll (at least
1615            on 32-bit machines) since the fields's width is 20 and
1616            there numbers with more than 32 bits can be represented.  */
1617         filestart = strtol (arch_xhdr_big (last_file)->nextoff, (char **) NULL,
1618                             10);
1619
1620       /* XXX These actually have to be calls to strtoll (at least on 32-bit
1621          machines) since the fields's width is 20 and there numbers with more
1622          than 32 bits can be represented.  */
1623       if (filestart == 0
1624           || filestart == strtol (xcoff_ardata_big (archive)->memoff,
1625                                   (char **) NULL, 10)
1626           || filestart == strtol (xcoff_ardata_big (archive)->symoff,
1627                                   (char **) NULL, 10))
1628         {
1629           bfd_set_error (bfd_error_no_more_archived_files);
1630           return NULL;
1631         }
1632     }
1633
1634   return _bfd_get_elt_at_filepos (archive, filestart);
1635 }
1636
1637 /* Stat an element in an XCOFF archive.  */
1638
1639 int
1640 _bfd_xcoff_stat_arch_elt (bfd *abfd, struct stat *s)
1641 {
1642   if (abfd->arelt_data == NULL)
1643     {
1644       bfd_set_error (bfd_error_invalid_operation);
1645       return -1;
1646     }
1647
1648   if (! xcoff_big_format_p (abfd->my_archive))
1649     {
1650       struct xcoff_ar_hdr *hdrp = arch_xhdr (abfd);
1651
1652       s->st_mtime = strtol (hdrp->date, (char **) NULL, 10);
1653       s->st_uid = strtol (hdrp->uid, (char **) NULL, 10);
1654       s->st_gid = strtol (hdrp->gid, (char **) NULL, 10);
1655       s->st_mode = strtol (hdrp->mode, (char **) NULL, 8);
1656       s->st_size = arch_eltdata (abfd)->parsed_size;
1657     }
1658   else
1659     {
1660       struct xcoff_ar_hdr_big *hdrp = arch_xhdr_big (abfd);
1661
1662       s->st_mtime = strtol (hdrp->date, (char **) NULL, 10);
1663       s->st_uid = strtol (hdrp->uid, (char **) NULL, 10);
1664       s->st_gid = strtol (hdrp->gid, (char **) NULL, 10);
1665       s->st_mode = strtol (hdrp->mode, (char **) NULL, 8);
1666       s->st_size = arch_eltdata (abfd)->parsed_size;
1667     }
1668
1669   return 0;
1670 }
1671
1672 /* Normalize a file name for inclusion in an archive.  */
1673
1674 static const char *
1675 normalize_filename (bfd *abfd)
1676 {
1677   const char *file;
1678   const char *filename;
1679
1680   file = bfd_get_filename (abfd);
1681   filename = strrchr (file, '/');
1682   if (filename != NULL)
1683     filename++;
1684   else
1685     filename = file;
1686   return filename;
1687 }
1688
1689 /* Write out an XCOFF armap.  */
1690
1691 static bfd_boolean
1692 xcoff_write_armap_old (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
1693                        struct orl *map, unsigned int orl_count, int stridx)
1694 {
1695   struct archive_iterator iterator;
1696   struct xcoff_ar_hdr hdr;
1697   char *p;
1698   unsigned char buf[4];
1699   unsigned int i;
1700
1701   memset (&hdr, 0, sizeof hdr);
1702   sprintf (hdr.size, "%ld", (long) (4 + orl_count * 4 + stridx));
1703   sprintf (hdr.nextoff, "%d", 0);
1704   memcpy (hdr.prevoff, xcoff_ardata (abfd)->memoff, XCOFFARMAG_ELEMENT_SIZE);
1705   sprintf (hdr.date, "%d", 0);
1706   sprintf (hdr.uid, "%d", 0);
1707   sprintf (hdr.gid, "%d", 0);
1708   sprintf (hdr.mode, "%d", 0);
1709   sprintf (hdr.namlen, "%d", 0);
1710
1711   /* We need spaces, not null bytes, in the header.  */
1712   for (p = (char *) &hdr; p < (char *) &hdr + SIZEOF_AR_HDR; p++)
1713     if (*p == '\0')
1714       *p = ' ';
1715
1716   if (bfd_bwrite ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
1717       != SIZEOF_AR_HDR
1718       || (bfd_bwrite (XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG, abfd)
1719           != SXCOFFARFMAG))
1720     return FALSE;
1721
1722   H_PUT_32 (abfd, orl_count, buf);
1723   if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
1724     return FALSE;
1725
1726   i = 0;
1727   archive_iterator_begin (&iterator, abfd);
1728   while (i < orl_count && archive_iterator_next (&iterator))
1729     while (map[i].u.abfd == iterator.current.member)
1730       {
1731         H_PUT_32 (abfd, iterator.current.offset, buf);
1732         if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
1733           return FALSE;
1734         ++i;
1735       }
1736
1737   for (i = 0; i < orl_count; i++)
1738     {
1739       const char *name;
1740       size_t namlen;
1741
1742       name = *map[i].name;
1743       namlen = strlen (name);
1744       if (bfd_bwrite (name, (bfd_size_type) (namlen + 1), abfd) != namlen + 1)
1745         return FALSE;
1746     }
1747
1748   if ((stridx & 1) != 0)
1749     {
1750       char b;
1751
1752       b = '\0';
1753       if (bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
1754         return FALSE;
1755     }
1756
1757   return TRUE;
1758 }
1759
1760 static char buff20[XCOFFARMAGBIG_ELEMENT_SIZE + 1];
1761 #define FMT20  "%-20lld"
1762 #define FMT12  "%-12d"
1763 #define FMT12_OCTAL  "%-12o"
1764 #define FMT4  "%-4d"
1765 #define PRINT20(d, v) \
1766   sprintf (buff20, FMT20, (long long)(v)), \
1767   memcpy ((void *) (d), buff20, 20)
1768
1769 #define PRINT12(d, v) \
1770   sprintf (buff20, FMT12, (int)(v)), \
1771   memcpy ((void *) (d), buff20, 12)
1772
1773 #define PRINT12_OCTAL(d, v) \
1774   sprintf (buff20, FMT12_OCTAL, (unsigned int)(v)), \
1775   memcpy ((void *) (d), buff20, 12)
1776
1777 #define PRINT4(d, v) \
1778   sprintf (buff20, FMT4, (int)(v)), \
1779   memcpy ((void *) (d), buff20, 4)
1780
1781 #define READ20(d, v) \
1782   buff20[20] = 0, \
1783   memcpy (buff20, (d), 20), \
1784   (v) = bfd_scan_vma (buff20, (const char **) NULL, 10)
1785
1786 static bfd_boolean
1787 do_pad (bfd *abfd, unsigned int number)
1788 {
1789   bfd_byte b = 0;
1790
1791   /* Limit pad to <= 4096.  */
1792   if (number > 4096)
1793     return FALSE;
1794
1795   while (number--)
1796     if (bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
1797       return FALSE;
1798
1799   return TRUE;
1800 }
1801
1802 static bfd_boolean
1803 do_copy (bfd *out_bfd, bfd *in_bfd)
1804 {
1805   bfd_size_type remaining;
1806   bfd_byte buffer[DEFAULT_BUFFERSIZE];
1807
1808   if (bfd_seek (in_bfd, (file_ptr) 0, SEEK_SET) != 0)
1809     return FALSE;
1810
1811   remaining = arelt_size (in_bfd);
1812
1813   while (remaining >= DEFAULT_BUFFERSIZE)
1814     {
1815       if (bfd_bread (buffer, DEFAULT_BUFFERSIZE, in_bfd) != DEFAULT_BUFFERSIZE
1816           || bfd_bwrite (buffer, DEFAULT_BUFFERSIZE, out_bfd) != DEFAULT_BUFFERSIZE)
1817         return FALSE;
1818
1819       remaining -= DEFAULT_BUFFERSIZE;
1820     }
1821
1822   if (remaining)
1823     {
1824       if (bfd_bread (buffer, remaining, in_bfd) != remaining
1825           || bfd_bwrite (buffer, remaining, out_bfd) != remaining)
1826         return FALSE;
1827     }
1828
1829   return TRUE;
1830 }
1831
1832 static bfd_boolean
1833 xcoff_write_armap_big (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
1834                        struct orl *map, unsigned int orl_count, int stridx)
1835 {
1836   struct archive_iterator iterator;
1837   struct xcoff_ar_file_hdr_big *fhdr;
1838   bfd_vma i, sym_32, sym_64, str_32, str_64;
1839   const bfd_arch_info_type *arch_info;
1840   bfd *current_bfd;
1841   size_t string_length;
1842   file_ptr nextoff, prevoff;
1843
1844   /* First, we look through the symbols and work out which are
1845      from 32-bit objects and which from 64-bit ones.  */
1846   sym_32 = sym_64 = str_32 = str_64 = 0;
1847
1848   i = 0;
1849   for (current_bfd = abfd->archive_head;
1850        current_bfd != NULL && i < orl_count;
1851        current_bfd = current_bfd->archive_next)
1852     {
1853       arch_info = bfd_get_arch_info (current_bfd);
1854       while (map[i].u.abfd == current_bfd)
1855         {
1856           string_length = strlen (*map[i].name) + 1;
1857           if (arch_info->bits_per_address == 64)
1858             {
1859               sym_64++;
1860               str_64 += string_length;
1861             }
1862           else
1863             {
1864               sym_32++;
1865               str_32 += string_length;
1866             }
1867           i++;
1868         }
1869     }
1870
1871   /* A quick sanity check... */
1872   BFD_ASSERT (sym_64 + sym_32 == orl_count);
1873   /* Explicit cast to int for compiler.  */
1874   BFD_ASSERT ((int)(str_64 + str_32) == stridx);
1875
1876   fhdr = xcoff_ardata_big (abfd);
1877
1878   /* xcoff_write_archive_contents_big passes nextoff in symoff. */
1879   READ20 (fhdr->memoff, prevoff);
1880   READ20 (fhdr->symoff, nextoff);
1881
1882   BFD_ASSERT (nextoff == bfd_tell (abfd));
1883
1884   /* Write out the symbol table.
1885      Layout :
1886
1887      standard big archive header
1888      0x0000                   ar_size   [0x14]
1889      0x0014                   ar_nxtmem [0x14]
1890      0x0028                   ar_prvmem [0x14]
1891      0x003C                   ar_date   [0x0C]
1892      0x0048                   ar_uid    [0x0C]
1893      0x0054                   ar_gid    [0x0C]
1894      0x0060                   ar_mod    [0x0C]
1895      0x006C                   ar_namelen[0x04]
1896      0x0070                   ar_fmag   [SXCOFFARFMAG]
1897
1898      Symbol table
1899      0x0072                   num_syms  [0x08], binary
1900      0x0078                   offsets   [0x08 * num_syms], binary
1901      0x0086 + 0x08 * num_syms names     [??]
1902      ??                       pad to even bytes.
1903   */
1904
1905   if (sym_32)
1906     {
1907       struct xcoff_ar_hdr_big *hdr;
1908       char *symbol_table;
1909       char *st;
1910
1911       bfd_vma symbol_table_size =
1912         SIZEOF_AR_HDR_BIG
1913         + SXCOFFARFMAG
1914         + 8
1915         + 8 * sym_32
1916         + str_32 + (str_32 & 1);
1917
1918       symbol_table = bfd_zmalloc (symbol_table_size);
1919       if (symbol_table == NULL)
1920         return FALSE;
1921
1922       hdr = (struct xcoff_ar_hdr_big *) symbol_table;
1923
1924       PRINT20 (hdr->size, 8 + 8 * sym_32 + str_32 + (str_32 & 1));
1925
1926       if (sym_64)
1927         PRINT20 (hdr->nextoff, nextoff + symbol_table_size);
1928       else
1929         PRINT20 (hdr->nextoff, 0);
1930
1931       PRINT20 (hdr->prevoff, prevoff);
1932       PRINT12 (hdr->date, 0);
1933       PRINT12 (hdr->uid, 0);
1934       PRINT12 (hdr->gid, 0);
1935       PRINT12 (hdr->mode, 0);
1936       PRINT4 (hdr->namlen, 0) ;
1937
1938       st = symbol_table + SIZEOF_AR_HDR_BIG;
1939       memcpy (st, XCOFFARFMAG, SXCOFFARFMAG);
1940       st += SXCOFFARFMAG;
1941
1942       bfd_h_put_64 (abfd, sym_32, st);
1943       st += 8;
1944
1945       /* loop over the 32 bit offsets */
1946       i = 0;
1947       archive_iterator_begin (&iterator, abfd);
1948       while (i < orl_count && archive_iterator_next (&iterator))
1949         {
1950           arch_info = bfd_get_arch_info (iterator.current.member);
1951           while (map[i].u.abfd == iterator.current.member)
1952             {
1953               if (arch_info->bits_per_address == 32)
1954                 {
1955                   bfd_h_put_64 (abfd, iterator.current.offset, st);
1956                   st += 8;
1957                 }
1958               i++;
1959             }
1960         }
1961
1962       /* loop over the 32 bit symbol names */
1963       i = 0;
1964       for (current_bfd = abfd->archive_head;
1965            current_bfd != NULL && i < orl_count;
1966            current_bfd = current_bfd->archive_next)
1967         {
1968           arch_info = bfd_get_arch_info (current_bfd);
1969           while (map[i].u.abfd == current_bfd)
1970             {
1971               if (arch_info->bits_per_address == 32)
1972                 {
1973                   string_length = sprintf (st, "%s", *map[i].name);
1974                   st += string_length + 1;
1975                 }
1976               i++;
1977             }
1978         }
1979
1980       bfd_bwrite (symbol_table, symbol_table_size, abfd);
1981
1982       free (symbol_table);
1983
1984       prevoff = nextoff;
1985       nextoff = nextoff + symbol_table_size;
1986     }
1987   else
1988     PRINT20 (fhdr->symoff, 0);
1989
1990   if (sym_64)
1991     {
1992       struct xcoff_ar_hdr_big *hdr;
1993       char *symbol_table;
1994       char *st;
1995
1996       bfd_vma symbol_table_size =
1997         SIZEOF_AR_HDR_BIG
1998         + SXCOFFARFMAG
1999         + 8
2000         + 8 * sym_64
2001         + str_64 + (str_64 & 1);
2002
2003       symbol_table = bfd_zmalloc (symbol_table_size);
2004       if (symbol_table == NULL)
2005         return FALSE;
2006
2007       hdr = (struct xcoff_ar_hdr_big *) symbol_table;
2008
2009       PRINT20 (hdr->size, 8 + 8 * sym_64 + str_64 + (str_64 & 1));
2010       PRINT20 (hdr->nextoff, 0);
2011       PRINT20 (hdr->prevoff, prevoff);
2012       PRINT12 (hdr->date, 0);
2013       PRINT12 (hdr->uid, 0);
2014       PRINT12 (hdr->gid, 0);
2015       PRINT12 (hdr->mode, 0);
2016       PRINT4 (hdr->namlen, 0);
2017
2018       st = symbol_table + SIZEOF_AR_HDR_BIG;
2019       memcpy (st, XCOFFARFMAG, SXCOFFARFMAG);
2020       st += SXCOFFARFMAG;
2021
2022       bfd_h_put_64 (abfd, sym_64, st);
2023       st += 8;
2024
2025       /* loop over the 64 bit offsets */
2026       i = 0;
2027       archive_iterator_begin (&iterator, abfd);
2028       while (i < orl_count && archive_iterator_next (&iterator))
2029         {
2030           arch_info = bfd_get_arch_info (iterator.current.member);
2031           while (map[i].u.abfd == iterator.current.member)
2032             {
2033               if (arch_info->bits_per_address == 64)
2034                 {
2035                   bfd_h_put_64 (abfd, iterator.current.offset, st);
2036                   st += 8;
2037                 }
2038               i++;
2039             }
2040         }
2041
2042       /* loop over the 64 bit symbol names */
2043       i = 0;
2044       for (current_bfd = abfd->archive_head;
2045            current_bfd != NULL && i < orl_count;
2046            current_bfd = current_bfd->archive_next)
2047         {
2048           arch_info = bfd_get_arch_info (current_bfd);
2049           while (map[i].u.abfd == current_bfd)
2050             {
2051               if (arch_info->bits_per_address == 64)
2052                 {
2053                   string_length = sprintf (st, "%s", *map[i].name);
2054                   st += string_length + 1;
2055                 }
2056               i++;
2057             }
2058         }
2059
2060       bfd_bwrite (symbol_table, symbol_table_size, abfd);
2061
2062       free (symbol_table);
2063
2064       PRINT20 (fhdr->symoff64, nextoff);
2065     }
2066   else
2067     PRINT20 (fhdr->symoff64, 0);
2068
2069   return TRUE;
2070 }
2071
2072 bfd_boolean
2073 _bfd_xcoff_write_armap (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
2074                         struct orl *map, unsigned int orl_count, int stridx)
2075 {
2076   if (! xcoff_big_format_p (abfd))
2077     return xcoff_write_armap_old (abfd, elength, map, orl_count, stridx);
2078   else
2079     return xcoff_write_armap_big (abfd, elength, map, orl_count, stridx);
2080 }
2081
2082 /* Write out an XCOFF archive.  We always write an entire archive,
2083    rather than fussing with the freelist and so forth.  */
2084
2085 static bfd_boolean
2086 xcoff_write_archive_contents_old (bfd *abfd)
2087 {
2088   struct archive_iterator iterator;
2089   struct xcoff_ar_file_hdr fhdr;
2090   bfd_size_type count;
2091   bfd_size_type total_namlen;
2092   file_ptr *offsets;
2093   bfd_boolean makemap;
2094   bfd_boolean hasobjects;
2095   file_ptr prevoff, nextoff;
2096   bfd *sub;
2097   size_t i;
2098   struct xcoff_ar_hdr ahdr;
2099   bfd_size_type size;
2100   char *p;
2101   char decbuf[XCOFFARMAG_ELEMENT_SIZE + 1];
2102
2103   memset (&fhdr, 0, sizeof fhdr);
2104   (void) strncpy (fhdr.magic, XCOFFARMAG, SXCOFFARMAG);
2105   sprintf (fhdr.firstmemoff, "%d", SIZEOF_AR_FILE_HDR);
2106   sprintf (fhdr.freeoff, "%d", 0);
2107
2108   count = 0;
2109   total_namlen = 0;
2110   for (sub = abfd->archive_head; sub != NULL; sub = sub->archive_next)
2111     {
2112       ++count;
2113       total_namlen += strlen (normalize_filename (sub)) + 1;
2114       if (sub->arelt_data == NULL)
2115         {
2116           sub->arelt_data = bfd_zalloc (sub, sizeof (struct areltdata));
2117           if (sub->arelt_data == NULL)
2118             return FALSE;
2119         }
2120       if (arch_xhdr (sub) == NULL)
2121         {
2122           struct xcoff_ar_hdr *ahdrp;
2123           struct stat s;
2124
2125           if (stat (bfd_get_filename (sub), &s) != 0)
2126             {
2127               bfd_set_error (bfd_error_system_call);
2128               return FALSE;
2129             }
2130
2131           ahdrp = bfd_zalloc (sub, sizeof (*ahdrp));
2132           if (ahdrp == NULL)
2133             return FALSE;
2134
2135           sprintf (ahdrp->size, "%ld", (long) s.st_size);
2136           sprintf (ahdrp->date, "%ld", (long) s.st_mtime);
2137           sprintf (ahdrp->uid, "%ld", (long) s.st_uid);
2138           sprintf (ahdrp->gid, "%ld", (long) s.st_gid);
2139           sprintf (ahdrp->mode, "%o", (unsigned int) s.st_mode);
2140
2141           arch_eltdata (sub)->arch_header = (char *) ahdrp;
2142           arch_eltdata (sub)->parsed_size = s.st_size;
2143         }
2144     }
2145   offsets = (file_ptr *) bfd_alloc (abfd, count * sizeof (file_ptr));
2146   if (offsets == NULL)
2147     return FALSE;
2148
2149   if (bfd_seek (abfd, (file_ptr) SIZEOF_AR_FILE_HDR, SEEK_SET) != 0)
2150     return FALSE;
2151
2152   makemap = bfd_has_map (abfd);
2153   hasobjects = FALSE;
2154   prevoff = 0;
2155   for (archive_iterator_begin (&iterator, abfd), i = 0;
2156        archive_iterator_next (&iterator);
2157        i++)
2158     {
2159       bfd_size_type namlen;
2160       struct xcoff_ar_hdr *ahdrp;
2161
2162       if (makemap && ! hasobjects)
2163         {
2164           if (bfd_check_format (iterator.current.member, bfd_object))
2165             hasobjects = TRUE;
2166         }
2167
2168       ahdrp = arch_xhdr (iterator.current.member);
2169       sprintf (ahdrp->prevoff, "%ld", (long) prevoff);
2170       sprintf (ahdrp->namlen, "%ld", (long) iterator.current.namlen);
2171       sprintf (ahdrp->nextoff, "%ld", (long) iterator.next.offset);
2172
2173       /* We need spaces, not null bytes, in the header.  */
2174       for (p = (char *) ahdrp; p < (char *) ahdrp + SIZEOF_AR_HDR; p++)
2175         if (*p == '\0')
2176           *p = ' ';
2177
2178       if (!do_pad (abfd, iterator.current.leading_padding))
2179         return FALSE;
2180
2181       BFD_ASSERT (iterator.current.offset == bfd_tell (abfd));
2182       namlen = iterator.current.padded_namlen;
2183       if (bfd_bwrite (ahdrp, SIZEOF_AR_HDR, abfd) != SIZEOF_AR_HDR
2184           || bfd_bwrite (iterator.current.name, namlen, abfd) != namlen
2185           || bfd_bwrite (XCOFFARFMAG, SXCOFFARFMAG, abfd) != SXCOFFARFMAG
2186           || bfd_seek (iterator.current.member, 0, SEEK_SET) != 0
2187           || !do_copy (abfd, iterator.current.member)
2188           || !do_pad (abfd, iterator.current.trailing_padding))
2189         return FALSE;
2190
2191       offsets[i] = iterator.current.offset;
2192       prevoff = iterator.current.offset;
2193     }
2194
2195   sprintf (fhdr.lastmemoff, "%ld", (long) prevoff);
2196
2197   /* Write out the member table.  */
2198
2199   nextoff = iterator.next.offset;
2200   BFD_ASSERT (nextoff == bfd_tell (abfd));
2201   sprintf (fhdr.memoff, "%ld", (long) nextoff);
2202
2203   memset (&ahdr, 0, sizeof ahdr);
2204   sprintf (ahdr.size, "%ld", (long) (XCOFFARMAG_ELEMENT_SIZE
2205                                      + count * XCOFFARMAG_ELEMENT_SIZE
2206                                      + total_namlen));
2207   sprintf (ahdr.prevoff, "%ld", (long) prevoff);
2208   sprintf (ahdr.date, "%d", 0);
2209   sprintf (ahdr.uid, "%d", 0);
2210   sprintf (ahdr.gid, "%d", 0);
2211   sprintf (ahdr.mode, "%d", 0);
2212   sprintf (ahdr.namlen, "%d", 0);
2213
2214   size = (SIZEOF_AR_HDR
2215           + XCOFFARMAG_ELEMENT_SIZE
2216           + count * XCOFFARMAG_ELEMENT_SIZE
2217           + total_namlen
2218           + SXCOFFARFMAG);
2219
2220   prevoff = nextoff;
2221   nextoff += size + (size & 1);
2222
2223   if (makemap && hasobjects)
2224     sprintf (ahdr.nextoff, "%ld", (long) nextoff);
2225   else
2226     sprintf (ahdr.nextoff, "%d", 0);
2227
2228   /* We need spaces, not null bytes, in the header.  */
2229   for (p = (char *) &ahdr; p < (char *) &ahdr + SIZEOF_AR_HDR; p++)
2230     if (*p == '\0')
2231       *p = ' ';
2232
2233   if ((bfd_bwrite ((PTR) &ahdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
2234        != SIZEOF_AR_HDR)
2235       || (bfd_bwrite ((PTR) XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG, abfd)
2236           != SXCOFFARFMAG))
2237     return FALSE;
2238
2239   sprintf (decbuf, "%-12ld", (long) count);
2240   if (bfd_bwrite ((PTR) decbuf, (bfd_size_type) XCOFFARMAG_ELEMENT_SIZE, abfd)
2241       != XCOFFARMAG_ELEMENT_SIZE)
2242     return FALSE;
2243   for (i = 0; i < (size_t) count; i++)
2244     {
2245       sprintf (decbuf, "%-12ld", (long) offsets[i]);
2246       if (bfd_bwrite ((PTR) decbuf, (bfd_size_type) XCOFFARMAG_ELEMENT_SIZE,
2247                       abfd) != XCOFFARMAG_ELEMENT_SIZE)
2248         return FALSE;
2249     }
2250   for (sub = abfd->archive_head; sub != NULL; sub = sub->archive_next)
2251     {
2252       const char *name;
2253       bfd_size_type namlen;
2254
2255       name = normalize_filename (sub);
2256       namlen = strlen (name);
2257       if (bfd_bwrite ((PTR) name, namlen + 1, abfd) != namlen + 1)
2258         return FALSE;
2259     }
2260
2261   if (! do_pad (abfd, size & 1))
2262     return FALSE;
2263
2264   /* Write out the armap, if appropriate.  */
2265   if (! makemap || ! hasobjects)
2266     sprintf (fhdr.symoff, "%d", 0);
2267   else
2268     {
2269       BFD_ASSERT (nextoff == bfd_tell (abfd));
2270       sprintf (fhdr.symoff, "%ld", (long) nextoff);
2271       bfd_ardata (abfd)->tdata = (PTR) &fhdr;
2272       if (! _bfd_compute_and_write_armap (abfd, 0))
2273         return FALSE;
2274     }
2275
2276   /* Write out the archive file header.  */
2277
2278   /* We need spaces, not null bytes, in the header.  */
2279   for (p = (char *) &fhdr; p < (char *) &fhdr + SIZEOF_AR_FILE_HDR; p++)
2280     if (*p == '\0')
2281       *p = ' ';
2282
2283   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
2284       || (bfd_bwrite ((PTR) &fhdr, (bfd_size_type) SIZEOF_AR_FILE_HDR, abfd)
2285           != SIZEOF_AR_FILE_HDR))
2286     return FALSE;
2287
2288   return TRUE;
2289 }
2290
2291 static bfd_boolean
2292 xcoff_write_archive_contents_big (bfd *abfd)
2293 {
2294   struct xcoff_ar_file_hdr_big fhdr;
2295   bfd_size_type count;
2296   bfd_size_type total_namlen;
2297   file_ptr *offsets;
2298   bfd_boolean makemap;
2299   bfd_boolean hasobjects;
2300   file_ptr prevoff, nextoff;
2301   bfd *current_bfd;
2302   size_t i;
2303   struct xcoff_ar_hdr_big *hdr;
2304   bfd_size_type size;
2305   char *member_table, *mt;
2306   bfd_vma member_table_size;
2307   struct archive_iterator iterator;
2308
2309   memset (&fhdr, 0, SIZEOF_AR_FILE_HDR_BIG);
2310   memcpy (fhdr.magic, XCOFFARMAGBIG, SXCOFFARMAG);
2311
2312   if (bfd_seek (abfd, (file_ptr) SIZEOF_AR_FILE_HDR_BIG, SEEK_SET) != 0)
2313     return FALSE;
2314
2315   /* Calculate count and total_namlen.  */
2316   makemap = bfd_has_map (abfd);
2317   hasobjects = FALSE;
2318   for (current_bfd = abfd->archive_head, count = 0, total_namlen = 0;
2319        current_bfd != NULL;
2320        current_bfd = current_bfd->archive_next, count++)
2321     {
2322       total_namlen += strlen (normalize_filename (current_bfd)) + 1;
2323
2324       if (makemap
2325           && ! hasobjects
2326           && bfd_check_format (current_bfd, bfd_object))
2327         hasobjects = TRUE;
2328
2329       if (current_bfd->arelt_data == NULL)
2330         {
2331           size = sizeof (struct areltdata);
2332           current_bfd->arelt_data = bfd_zalloc (current_bfd, size);
2333           if (current_bfd->arelt_data == NULL)
2334             return FALSE;
2335         }
2336
2337       if (arch_xhdr_big (current_bfd) == NULL)
2338         {
2339           struct xcoff_ar_hdr_big *ahdrp;
2340           struct stat s;
2341
2342           /* XXX This should actually be a call to stat64 (at least on
2343              32-bit machines).
2344              XXX This call will fail if the original object is not found.  */
2345           if (stat (bfd_get_filename (current_bfd), &s) != 0)
2346             {
2347               bfd_set_error (bfd_error_system_call);
2348               return FALSE;
2349             }
2350
2351           ahdrp = bfd_zalloc (current_bfd, sizeof (*ahdrp));
2352           if (ahdrp == NULL)
2353             return FALSE;
2354
2355           PRINT20 (ahdrp->size, s.st_size);
2356           PRINT12 (ahdrp->date, s.st_mtime);
2357           PRINT12 (ahdrp->uid,  s.st_uid);
2358           PRINT12 (ahdrp->gid,  s.st_gid);
2359           PRINT12_OCTAL (ahdrp->mode, s.st_mode);
2360
2361           arch_eltdata (current_bfd)->arch_header = (char *) ahdrp;
2362           arch_eltdata (current_bfd)->parsed_size = s.st_size;
2363         }
2364     }
2365
2366   offsets = NULL;
2367   if (count)
2368     {
2369       offsets = (file_ptr *) bfd_malloc (count * sizeof (file_ptr));
2370       if (offsets == NULL)
2371         return FALSE;
2372     }
2373
2374   prevoff = 0;
2375   for (archive_iterator_begin (&iterator, abfd), i = 0;
2376        archive_iterator_next (&iterator);
2377        i++)
2378     {
2379       bfd_size_type namlen;
2380       struct xcoff_ar_hdr_big *ahdrp;
2381
2382       ahdrp = arch_xhdr_big (iterator.current.member);
2383       PRINT20 (ahdrp->prevoff, prevoff);
2384       PRINT4 (ahdrp->namlen, iterator.current.namlen);
2385       PRINT20 (ahdrp->nextoff, iterator.next.offset);
2386
2387       if (!do_pad (abfd, iterator.current.leading_padding))
2388         return FALSE;
2389
2390       BFD_ASSERT (iterator.current.offset == bfd_tell (abfd));
2391       namlen = iterator.current.padded_namlen;
2392       if (bfd_bwrite (ahdrp, SIZEOF_AR_HDR_BIG, abfd) != SIZEOF_AR_HDR_BIG
2393           || bfd_bwrite (iterator.current.name, namlen, abfd) != namlen
2394           || bfd_bwrite (XCOFFARFMAG, SXCOFFARFMAG, abfd) != SXCOFFARFMAG
2395           || bfd_seek (iterator.current.member, 0, SEEK_SET) != 0
2396           || !do_copy (abfd, iterator.current.member)
2397           || !do_pad (abfd, iterator.current.trailing_padding))
2398         return FALSE;
2399
2400       offsets[i] = iterator.current.offset;
2401       prevoff = iterator.current.offset;
2402     }
2403
2404   if (count)
2405     {
2406       PRINT20 (fhdr.firstmemoff, offsets[0]);
2407       PRINT20 (fhdr.lastmemoff, prevoff);
2408     }
2409
2410   /* Write out the member table.
2411      Layout :
2412
2413      standard big archive header
2414      0x0000                   ar_size   [0x14]
2415      0x0014                   ar_nxtmem [0x14]
2416      0x0028                   ar_prvmem [0x14]
2417      0x003C                   ar_date   [0x0C]
2418      0x0048                   ar_uid    [0x0C]
2419      0x0054                   ar_gid    [0x0C]
2420      0x0060                   ar_mod    [0x0C]
2421      0x006C                   ar_namelen[0x04]
2422      0x0070                   ar_fmag   [0x02]
2423
2424      Member table
2425      0x0072                   count     [0x14]
2426      0x0086                   offsets   [0x14 * counts]
2427      0x0086 + 0x14 * counts   names     [??]
2428      ??                       pad to even bytes.
2429    */
2430
2431   nextoff = iterator.next.offset;
2432   BFD_ASSERT (nextoff == bfd_tell (abfd));
2433
2434   member_table_size = (SIZEOF_AR_HDR_BIG
2435                        + SXCOFFARFMAG
2436                        + XCOFFARMAGBIG_ELEMENT_SIZE
2437                        + count * XCOFFARMAGBIG_ELEMENT_SIZE
2438                        + total_namlen);
2439
2440   member_table_size += member_table_size & 1;
2441   member_table = bfd_zmalloc (member_table_size);
2442   if (member_table == NULL)
2443     return FALSE;
2444
2445   hdr = (struct xcoff_ar_hdr_big *) member_table;
2446
2447   PRINT20 (hdr->size, (XCOFFARMAGBIG_ELEMENT_SIZE
2448                        + count * XCOFFARMAGBIG_ELEMENT_SIZE
2449                        + total_namlen + (total_namlen & 1)));
2450   if (makemap && hasobjects)
2451     PRINT20 (hdr->nextoff, nextoff + member_table_size);
2452   else
2453     PRINT20 (hdr->nextoff, 0);
2454   PRINT20 (hdr->prevoff, prevoff);
2455   PRINT12 (hdr->date, 0);
2456   PRINT12 (hdr->uid, 0);
2457   PRINT12 (hdr->gid, 0);
2458   PRINT12 (hdr->mode, 0);
2459   PRINT4 (hdr->namlen, 0);
2460
2461   mt = member_table + SIZEOF_AR_HDR_BIG;
2462   memcpy (mt, XCOFFARFMAG, SXCOFFARFMAG);
2463   mt += SXCOFFARFMAG;
2464
2465   PRINT20 (mt, count);
2466   mt += XCOFFARMAGBIG_ELEMENT_SIZE;
2467   for (i = 0; i < (size_t) count; i++)
2468     {
2469       PRINT20 (mt, offsets[i]);
2470       mt += XCOFFARMAGBIG_ELEMENT_SIZE;
2471     }
2472
2473   if (count)
2474     {
2475       free (offsets);
2476       offsets = NULL;
2477     }
2478
2479   for (current_bfd = abfd->archive_head;
2480        current_bfd != NULL;
2481        current_bfd = current_bfd->archive_next)
2482     {
2483       const char *name;
2484       size_t namlen;
2485
2486       name = normalize_filename (current_bfd);
2487       namlen = sprintf (mt, "%s", name);
2488       mt += namlen + 1;
2489     }
2490
2491   if (bfd_bwrite (member_table, member_table_size, abfd) != member_table_size)
2492     return FALSE;
2493
2494   free (member_table);
2495
2496   PRINT20 (fhdr.memoff, nextoff);
2497
2498   prevoff = nextoff;
2499   nextoff += member_table_size;
2500
2501   /* Write out the armap, if appropriate.  */
2502
2503   if (! makemap || ! hasobjects)
2504     PRINT20 (fhdr.symoff, 0);
2505   else
2506     {
2507       BFD_ASSERT (nextoff == bfd_tell (abfd));
2508
2509       /* Save nextoff in fhdr.symoff so the armap routine can use it.  */
2510       PRINT20 (fhdr.symoff, nextoff);
2511
2512       bfd_ardata (abfd)->tdata = (PTR) &fhdr;
2513       if (! _bfd_compute_and_write_armap (abfd, 0))
2514         return FALSE;
2515     }
2516
2517   /* Write out the archive file header.  */
2518
2519   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
2520       || (bfd_bwrite ((PTR) &fhdr, (bfd_size_type) SIZEOF_AR_FILE_HDR_BIG,
2521                       abfd) != SIZEOF_AR_FILE_HDR_BIG))
2522     return FALSE;
2523
2524   return TRUE;
2525 }
2526
2527 bfd_boolean
2528 _bfd_xcoff_write_archive_contents (bfd *abfd)
2529 {
2530   if (! xcoff_big_format_p (abfd))
2531     return xcoff_write_archive_contents_old (abfd);
2532   else
2533     return xcoff_write_archive_contents_big (abfd);
2534 }
2535 \f
2536 /* We can't use the usual coff_sizeof_headers routine, because AIX
2537    always uses an a.out header.  */
2538
2539 int
2540 _bfd_xcoff_sizeof_headers (bfd *abfd,
2541                            struct bfd_link_info *info ATTRIBUTE_UNUSED)
2542 {
2543   int size;
2544
2545   size = FILHSZ;
2546   if (xcoff_data (abfd)->full_aouthdr)
2547     size += AOUTSZ;
2548   else
2549     size += SMALL_AOUTSZ;
2550   size += abfd->section_count * SCNHSZ;
2551   return size;
2552 }
2553 \f
2554 /* Routines to swap information in the XCOFF .loader section.  If we
2555    ever need to write an XCOFF loader, this stuff will need to be
2556    moved to another file shared by the linker (which XCOFF calls the
2557    ``binder'') and the loader.  */
2558
2559 /* Swap in the ldhdr structure.  */
2560
2561 static void
2562 xcoff_swap_ldhdr_in (bfd *abfd, const PTR s, struct internal_ldhdr *dst)
2563 {
2564   const struct external_ldhdr *src = (const struct external_ldhdr *) s;
2565
2566   dst->l_version = bfd_get_32 (abfd, src->l_version);
2567   dst->l_nsyms = bfd_get_32 (abfd, src->l_nsyms);
2568   dst->l_nreloc = bfd_get_32 (abfd, src->l_nreloc);
2569   dst->l_istlen = bfd_get_32 (abfd, src->l_istlen);
2570   dst->l_nimpid = bfd_get_32 (abfd, src->l_nimpid);
2571   dst->l_impoff = bfd_get_32 (abfd, src->l_impoff);
2572   dst->l_stlen = bfd_get_32 (abfd, src->l_stlen);
2573   dst->l_stoff = bfd_get_32 (abfd, src->l_stoff);
2574 }
2575
2576 /* Swap out the ldhdr structure.  */
2577
2578 static void
2579 xcoff_swap_ldhdr_out (bfd *abfd, const struct internal_ldhdr *src, PTR d)
2580 {
2581   struct external_ldhdr *dst = (struct external_ldhdr *) d;
2582
2583   bfd_put_32 (abfd, (bfd_vma) src->l_version, dst->l_version);
2584   bfd_put_32 (abfd, src->l_nsyms, dst->l_nsyms);
2585   bfd_put_32 (abfd, src->l_nreloc, dst->l_nreloc);
2586   bfd_put_32 (abfd, src->l_istlen, dst->l_istlen);
2587   bfd_put_32 (abfd, src->l_nimpid, dst->l_nimpid);
2588   bfd_put_32 (abfd, src->l_impoff, dst->l_impoff);
2589   bfd_put_32 (abfd, src->l_stlen, dst->l_stlen);
2590   bfd_put_32 (abfd, src->l_stoff, dst->l_stoff);
2591 }
2592
2593 /* Swap in the ldsym structure.  */
2594
2595 static void
2596 xcoff_swap_ldsym_in (bfd *abfd, const PTR s, struct internal_ldsym *dst)
2597 {
2598   const struct external_ldsym *src = (const struct external_ldsym *) s;
2599
2600   if (bfd_get_32 (abfd, src->_l._l_l._l_zeroes) != 0) {
2601     memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
2602   } else {
2603     dst->_l._l_l._l_zeroes = 0;
2604     dst->_l._l_l._l_offset = bfd_get_32 (abfd, src->_l._l_l._l_offset);
2605   }
2606   dst->l_value = bfd_get_32 (abfd, src->l_value);
2607   dst->l_scnum = bfd_get_16 (abfd, src->l_scnum);
2608   dst->l_smtype = bfd_get_8 (abfd, src->l_smtype);
2609   dst->l_smclas = bfd_get_8 (abfd, src->l_smclas);
2610   dst->l_ifile = bfd_get_32 (abfd, src->l_ifile);
2611   dst->l_parm = bfd_get_32 (abfd, src->l_parm);
2612 }
2613
2614 /* Swap out the ldsym structure.  */
2615
2616 static void
2617 xcoff_swap_ldsym_out (bfd *abfd, const struct internal_ldsym *src, PTR d)
2618 {
2619   struct external_ldsym *dst = (struct external_ldsym *) d;
2620
2621   if (src->_l._l_l._l_zeroes != 0)
2622     memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
2623   else
2624     {
2625       bfd_put_32 (abfd, (bfd_vma) 0, dst->_l._l_l._l_zeroes);
2626       bfd_put_32 (abfd, (bfd_vma) src->_l._l_l._l_offset,
2627                   dst->_l._l_l._l_offset);
2628     }
2629   bfd_put_32 (abfd, src->l_value, dst->l_value);
2630   bfd_put_16 (abfd, (bfd_vma) src->l_scnum, dst->l_scnum);
2631   bfd_put_8 (abfd, src->l_smtype, dst->l_smtype);
2632   bfd_put_8 (abfd, src->l_smclas, dst->l_smclas);
2633   bfd_put_32 (abfd, src->l_ifile, dst->l_ifile);
2634   bfd_put_32 (abfd, src->l_parm, dst->l_parm);
2635 }
2636
2637 static void
2638 xcoff_swap_reloc_in (bfd *abfd, PTR s, PTR d)
2639 {
2640   struct external_reloc *src = (struct external_reloc *) s;
2641   struct internal_reloc *dst = (struct internal_reloc *) d;
2642
2643   memset (dst, 0, sizeof (struct internal_reloc));
2644
2645   dst->r_vaddr = bfd_get_32 (abfd, src->r_vaddr);
2646   dst->r_symndx = bfd_get_32 (abfd, src->r_symndx);
2647   dst->r_size = bfd_get_8 (abfd, src->r_size);
2648   dst->r_type = bfd_get_8 (abfd, src->r_type);
2649 }
2650
2651 static unsigned int
2652 xcoff_swap_reloc_out (bfd *abfd, PTR s, PTR d)
2653 {
2654   struct internal_reloc *src = (struct internal_reloc *) s;
2655   struct external_reloc *dst = (struct external_reloc *) d;
2656
2657   bfd_put_32 (abfd, src->r_vaddr, dst->r_vaddr);
2658   bfd_put_32 (abfd, src->r_symndx, dst->r_symndx);
2659   bfd_put_8 (abfd, src->r_type, dst->r_type);
2660   bfd_put_8 (abfd, src->r_size, dst->r_size);
2661
2662   return bfd_coff_relsz (abfd);
2663 }
2664
2665 /* Swap in the ldrel structure.  */
2666
2667 static void
2668 xcoff_swap_ldrel_in (bfd *abfd, const PTR s, struct internal_ldrel *dst)
2669 {
2670   const struct external_ldrel *src = (const struct external_ldrel *) s;
2671
2672   dst->l_vaddr = bfd_get_32 (abfd, src->l_vaddr);
2673   dst->l_symndx = bfd_get_32 (abfd, src->l_symndx);
2674   dst->l_rtype = bfd_get_16 (abfd, src->l_rtype);
2675   dst->l_rsecnm = bfd_get_16 (abfd, src->l_rsecnm);
2676 }
2677
2678 /* Swap out the ldrel structure.  */
2679
2680 static void
2681 xcoff_swap_ldrel_out (bfd *abfd, const struct internal_ldrel *src, PTR d)
2682 {
2683   struct external_ldrel *dst = (struct external_ldrel *) d;
2684
2685   bfd_put_32 (abfd, src->l_vaddr, dst->l_vaddr);
2686   bfd_put_32 (abfd, src->l_symndx, dst->l_symndx);
2687   bfd_put_16 (abfd, (bfd_vma) src->l_rtype, dst->l_rtype);
2688   bfd_put_16 (abfd, (bfd_vma) src->l_rsecnm, dst->l_rsecnm);
2689 }
2690 \f
2691
2692 bfd_boolean
2693 xcoff_reloc_type_noop (bfd *input_bfd ATTRIBUTE_UNUSED,
2694                        asection *input_section ATTRIBUTE_UNUSED,
2695                        bfd *output_bfd ATTRIBUTE_UNUSED,
2696                        struct internal_reloc *rel ATTRIBUTE_UNUSED,
2697                        struct internal_syment *sym ATTRIBUTE_UNUSED,
2698                        struct reloc_howto_struct *howto ATTRIBUTE_UNUSED,
2699                        bfd_vma val ATTRIBUTE_UNUSED,
2700                        bfd_vma addend ATTRIBUTE_UNUSED,
2701                        bfd_vma *relocation ATTRIBUTE_UNUSED,
2702                        bfd_byte *contents ATTRIBUTE_UNUSED)
2703 {
2704   return TRUE;
2705 }
2706
2707 bfd_boolean
2708 xcoff_reloc_type_fail (bfd *input_bfd,
2709                        asection *input_section ATTRIBUTE_UNUSED,
2710                        bfd *output_bfd ATTRIBUTE_UNUSED,
2711                        struct internal_reloc *rel,
2712                        struct internal_syment *sym ATTRIBUTE_UNUSED,
2713                        struct reloc_howto_struct *howto ATTRIBUTE_UNUSED,
2714                        bfd_vma val ATTRIBUTE_UNUSED,
2715                        bfd_vma addend ATTRIBUTE_UNUSED,
2716                        bfd_vma *relocation ATTRIBUTE_UNUSED,
2717                        bfd_byte *contents ATTRIBUTE_UNUSED)
2718 {
2719   (*_bfd_error_handler)
2720     (_("%s: unsupported relocation type 0x%02x"),
2721      bfd_get_filename (input_bfd), (unsigned int) rel->r_type);
2722   bfd_set_error (bfd_error_bad_value);
2723   return FALSE;
2724 }
2725
2726 bfd_boolean
2727 xcoff_reloc_type_pos (bfd *input_bfd ATTRIBUTE_UNUSED,
2728                       asection *input_section ATTRIBUTE_UNUSED,
2729                       bfd *output_bfd ATTRIBUTE_UNUSED,
2730                       struct internal_reloc *rel ATTRIBUTE_UNUSED,
2731                       struct internal_syment *sym ATTRIBUTE_UNUSED,
2732                       struct reloc_howto_struct *howto ATTRIBUTE_UNUSED,
2733                       bfd_vma val,
2734                       bfd_vma addend,
2735                       bfd_vma *relocation,
2736                       bfd_byte *contents ATTRIBUTE_UNUSED)
2737 {
2738   *relocation = val + addend;
2739   return TRUE;
2740 }
2741
2742 bfd_boolean
2743 xcoff_reloc_type_neg (bfd *input_bfd ATTRIBUTE_UNUSED,
2744                       asection *input_section ATTRIBUTE_UNUSED,
2745                       bfd *output_bfd ATTRIBUTE_UNUSED,
2746                       struct internal_reloc *rel ATTRIBUTE_UNUSED,
2747                       struct internal_syment *sym ATTRIBUTE_UNUSED,
2748                       struct reloc_howto_struct *howto ATTRIBUTE_UNUSED,
2749                       bfd_vma val,
2750                       bfd_vma addend,
2751                       bfd_vma *relocation,
2752                       bfd_byte *contents ATTRIBUTE_UNUSED)
2753 {
2754   *relocation = addend - val;
2755   return TRUE;
2756 }
2757
2758 bfd_boolean
2759 xcoff_reloc_type_rel (bfd *input_bfd ATTRIBUTE_UNUSED,
2760                       asection *input_section,
2761                       bfd *output_bfd ATTRIBUTE_UNUSED,
2762                       struct internal_reloc *rel ATTRIBUTE_UNUSED,
2763                       struct internal_syment *sym ATTRIBUTE_UNUSED,
2764                       struct reloc_howto_struct *howto,
2765                       bfd_vma val,
2766                       bfd_vma addend,
2767                       bfd_vma *relocation,
2768                       bfd_byte *contents ATTRIBUTE_UNUSED)
2769 {
2770   howto->pc_relative = TRUE;
2771
2772   /* A PC relative reloc includes the section address.  */
2773   addend += input_section->vma;
2774
2775   *relocation = val + addend;
2776   *relocation -= (input_section->output_section->vma
2777                   + input_section->output_offset);
2778   return TRUE;
2779 }
2780
2781 bfd_boolean
2782 xcoff_reloc_type_toc (bfd *input_bfd,
2783                       asection *input_section ATTRIBUTE_UNUSED,
2784                       bfd *output_bfd,
2785                       struct internal_reloc *rel,
2786                       struct internal_syment *sym,
2787                       struct reloc_howto_struct *howto ATTRIBUTE_UNUSED,
2788                       bfd_vma val,
2789                       bfd_vma addend ATTRIBUTE_UNUSED,
2790                       bfd_vma *relocation,
2791                       bfd_byte *contents ATTRIBUTE_UNUSED)
2792 {
2793   struct xcoff_link_hash_entry *h;
2794
2795   if (0 > rel->r_symndx)
2796     return FALSE;
2797
2798   h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
2799
2800   if (h != NULL && h->smclas != XMC_TD)
2801     {
2802       if (h->toc_section == NULL)
2803         {
2804           (*_bfd_error_handler)
2805             (_("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry"),
2806              bfd_get_filename (input_bfd), rel->r_vaddr,
2807              h->root.root.string);
2808           bfd_set_error (bfd_error_bad_value);
2809           return FALSE;
2810         }
2811
2812       BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0);
2813       val = (h->toc_section->output_section->vma
2814               + h->toc_section->output_offset);
2815     }
2816
2817   *relocation = ((val - xcoff_data (output_bfd)->toc)
2818                  - (sym->n_value - xcoff_data (input_bfd)->toc));
2819   return TRUE;
2820 }
2821
2822 bfd_boolean
2823 xcoff_reloc_type_ba (bfd *input_bfd ATTRIBUTE_UNUSED,
2824                      asection *input_section ATTRIBUTE_UNUSED,
2825                      bfd *output_bfd ATTRIBUTE_UNUSED,
2826                      struct internal_reloc *rel ATTRIBUTE_UNUSED,
2827                      struct internal_syment *sym ATTRIBUTE_UNUSED,
2828                      struct reloc_howto_struct *howto,
2829                      bfd_vma val,
2830                      bfd_vma addend,
2831                      bfd_vma *relocation,
2832                      bfd_byte *contents ATTRIBUTE_UNUSED)
2833 {
2834   howto->src_mask &= ~3;
2835   howto->dst_mask = howto->src_mask;
2836
2837   *relocation = val + addend;
2838
2839   return TRUE;
2840 }
2841
2842 static bfd_boolean
2843 xcoff_reloc_type_br (bfd *input_bfd,
2844                      asection *input_section,
2845                      bfd *output_bfd ATTRIBUTE_UNUSED,
2846                      struct internal_reloc *rel,
2847                      struct internal_syment *sym ATTRIBUTE_UNUSED,
2848                      struct reloc_howto_struct *howto,
2849                      bfd_vma val,
2850                      bfd_vma addend,
2851                      bfd_vma *relocation,
2852                      bfd_byte *contents)
2853 {
2854   struct xcoff_link_hash_entry *h;
2855   bfd_vma section_offset;
2856
2857   if (0 > rel->r_symndx)
2858     return FALSE;
2859
2860   h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
2861   section_offset = rel->r_vaddr - input_section->vma;
2862
2863   /* If we see an R_BR or R_RBR reloc which is jumping to global
2864      linkage code, and it is followed by an appropriate cror nop
2865      instruction, we replace the cror with lwz r2,20(r1).  This
2866      restores the TOC after the glink code.  Contrariwise, if the
2867      call is followed by a lwz r2,20(r1), but the call is not
2868      going to global linkage code, we can replace the load with a
2869      cror.  */
2870   if (NULL != h
2871       && (bfd_link_hash_defined == h->root.type
2872           || bfd_link_hash_defweak == h->root.type)
2873       && section_offset + 8 <= input_section->size)
2874     {
2875       bfd_byte *pnext;
2876       unsigned long next;
2877
2878       pnext = contents + section_offset + 4;
2879       next = bfd_get_32 (input_bfd, pnext);
2880
2881       /* The _ptrgl function is magic.  It is used by the AIX
2882          compiler to call a function through a pointer.  */
2883       if (h->smclas == XMC_GL || strcmp (h->root.root.string, "._ptrgl") == 0)
2884         {
2885           if (next == 0x4def7b82                        /* cror 15,15,15 */
2886               || next == 0x4ffffb82                     /* cror 31,31,31 */
2887               || next == 0x60000000)                    /* ori r0,r0,0 */
2888             bfd_put_32 (input_bfd, 0x80410014, pnext);  /* lwz r2,20(r1) */
2889
2890         }
2891       else
2892         {
2893           if (next == 0x80410014)                       /* lwz r2,20(r1) */
2894             bfd_put_32 (input_bfd, 0x60000000, pnext);  /* ori r0,r0,0 */
2895         }
2896     }
2897   else if (NULL != h && bfd_link_hash_undefined == h->root.type)
2898     {
2899       /* Normally, this relocation is against a defined symbol.  In the
2900          case where this is a partial link and the output section offset
2901          is greater than 2^25, the linker will return an invalid error
2902          message that the relocation has been truncated.  Yes it has been
2903          truncated but no it not important.  For this case, disable the
2904          overflow checking. */
2905
2906       howto->complain_on_overflow = complain_overflow_dont;
2907     }
2908
2909   /* The original PC-relative relocation is biased by -r_vaddr, so adding
2910      the value below will give the absolute target address.  */
2911   *relocation = val + addend + rel->r_vaddr;
2912
2913   howto->src_mask &= ~3;
2914   howto->dst_mask = howto->src_mask;
2915
2916   if (h != NULL
2917       && (h->root.type == bfd_link_hash_defined
2918           || h->root.type == bfd_link_hash_defweak)
2919       && bfd_is_abs_section (h->root.u.def.section)
2920       && section_offset + 4 <= input_section->size)
2921     {
2922       bfd_byte *ptr;
2923       bfd_vma insn;
2924
2925       /* Turn the relative branch into an absolute one by setting the
2926          AA bit.  */
2927       ptr = contents + section_offset;
2928       insn = bfd_get_32 (input_bfd, ptr);
2929       insn |= 2;
2930       bfd_put_32 (input_bfd, insn, ptr);
2931
2932       /* Make the howto absolute too.  */
2933       howto->pc_relative = FALSE;
2934       howto->complain_on_overflow = complain_overflow_bitfield;
2935     }
2936   else
2937     {
2938       /* Use a PC-relative howto and subtract the instruction's address
2939          from the target address we calculated above.  */
2940       howto->pc_relative = TRUE;
2941       *relocation -= (input_section->output_section->vma
2942                       + input_section->output_offset
2943                       + section_offset);
2944     }
2945   return TRUE;
2946 }
2947
2948 bfd_boolean
2949 xcoff_reloc_type_crel (bfd *input_bfd ATTRIBUTE_UNUSED,
2950                        asection *input_section,
2951                        bfd *output_bfd ATTRIBUTE_UNUSED,
2952                        struct internal_reloc *rel ATTRIBUTE_UNUSED,
2953                        struct internal_syment *sym ATTRIBUTE_UNUSED,
2954                        struct reloc_howto_struct *howto,
2955                        bfd_vma val ATTRIBUTE_UNUSED,
2956                        bfd_vma addend,
2957                        bfd_vma *relocation,
2958                        bfd_byte *contents ATTRIBUTE_UNUSED)
2959 {
2960   howto->pc_relative = TRUE;
2961   howto->src_mask &= ~3;
2962   howto->dst_mask = howto->src_mask;
2963
2964   /* A PC relative reloc includes the section address.  */
2965   addend += input_section->vma;
2966
2967   *relocation = val + addend;
2968   *relocation -= (input_section->output_section->vma
2969                   + input_section->output_offset);
2970   return TRUE;
2971 }
2972
2973 static bfd_boolean
2974 xcoff_complain_overflow_dont_func (bfd *input_bfd ATTRIBUTE_UNUSED,
2975                                    bfd_vma val ATTRIBUTE_UNUSED,
2976                                    bfd_vma relocation ATTRIBUTE_UNUSED,
2977                                    struct reloc_howto_struct *
2978                                       howto ATTRIBUTE_UNUSED)
2979 {
2980   return FALSE;
2981 }
2982
2983 static bfd_boolean
2984 xcoff_complain_overflow_bitfield_func (bfd *input_bfd,
2985                                        bfd_vma val,
2986                                        bfd_vma relocation,
2987                                        struct reloc_howto_struct *howto)
2988 {
2989   bfd_vma fieldmask, signmask, ss;
2990   bfd_vma a, b, sum;
2991
2992   /* Get the values to be added together.  For signed and unsigned
2993      relocations, we assume that all values should be truncated to
2994      the size of an address.  For bitfields, all the bits matter.
2995      See also bfd_check_overflow.  */
2996   fieldmask = N_ONES (howto->bitsize);
2997   a = relocation;
2998   b = val & howto->src_mask;
2999
3000   /* Much like unsigned, except no trimming with addrmask.  In
3001      addition, the sum overflows if there is a carry out of
3002      the bfd_vma, i.e., the sum is less than either input
3003      operand.  */
3004   a >>= howto->rightshift;
3005   b >>= howto->bitpos;
3006
3007   /* Bitfields are sometimes used for signed numbers; for
3008      example, a 13-bit field sometimes represents values in
3009      0..8191 and sometimes represents values in -4096..4095.
3010      If the field is signed and a is -4095 (0x1001) and b is
3011      -1 (0x1fff), the sum is -4096 (0x1000), but (0x1001 +
3012      0x1fff is 0x3000).  It's not clear how to handle this
3013      everywhere, since there is not way to know how many bits
3014      are significant in the relocation, but the original code
3015      assumed that it was fully sign extended, and we will keep
3016      that assumption.  */
3017   signmask = (fieldmask >> 1) + 1;
3018
3019   if ((a & ~ fieldmask) != 0)
3020     {
3021       /* Some bits out of the field are set.  This might not
3022          be a problem: if this is a signed bitfield, it is OK
3023          iff all the high bits are set, including the sign
3024          bit.  We'll try setting all but the most significant
3025          bit in the original relocation value: if this is all
3026          ones, we are OK, assuming a signed bitfield.  */
3027       ss = (signmask << howto->rightshift) - 1;
3028       if ((ss | relocation) != ~ (bfd_vma) 0)
3029         return TRUE;
3030       a &= fieldmask;
3031     }
3032
3033   /* We just assume (b & ~ fieldmask) == 0.  */
3034
3035   /* We explicitly permit wrap around if this relocation
3036      covers the high bit of an address.  The Linux kernel
3037      relies on it, and it is the only way to write assembler
3038      code which can run when loaded at a location 0x80000000
3039      away from the location at which it is linked.  */
3040   if (howto->bitsize + howto->rightshift
3041       == bfd_arch_bits_per_address (input_bfd))
3042     return FALSE;
3043
3044   sum = a + b;
3045   if (sum < a || (sum & ~ fieldmask) != 0)
3046     {
3047       /* There was a carry out, or the field overflow.  Test
3048          for signed operands again.  Here is the overflow test
3049          is as for complain_overflow_signed.  */
3050       if (((~ (a ^ b)) & (a ^ sum)) & signmask)
3051         return TRUE;
3052     }
3053
3054   return FALSE;
3055 }
3056
3057 static bfd_boolean
3058 xcoff_complain_overflow_signed_func (bfd *input_bfd,
3059                                      bfd_vma val,
3060                                      bfd_vma relocation,
3061                                      struct reloc_howto_struct *howto)
3062 {
3063   bfd_vma addrmask, fieldmask, signmask, ss;
3064   bfd_vma a, b, sum;
3065
3066   /* Get the values to be added together.  For signed and unsigned
3067      relocations, we assume that all values should be truncated to
3068      the size of an address.  For bitfields, all the bits matter.
3069      See also bfd_check_overflow.  */
3070   fieldmask = N_ONES (howto->bitsize);
3071   addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
3072   a = relocation;
3073   b = val & howto->src_mask;
3074
3075   a = (a & addrmask) >> howto->rightshift;
3076
3077   /* If any sign bits are set, all sign bits must be set.
3078      That is, A must be a valid negative address after
3079      shifting.  */
3080   signmask = ~ (fieldmask >> 1);
3081   ss = a & signmask;
3082   if (ss != 0 && ss != ((addrmask >> howto->rightshift) & signmask))
3083     return TRUE;
3084
3085   /* We only need this next bit of code if the sign bit of B
3086      is below the sign bit of A.  This would only happen if
3087      SRC_MASK had fewer bits than BITSIZE.  Note that if
3088      SRC_MASK has more bits than BITSIZE, we can get into
3089      trouble; we would need to verify that B is in range, as
3090      we do for A above.  */
3091   signmask = ((~ howto->src_mask) >> 1) & howto->src_mask;
3092   if ((b & signmask) != 0)
3093     {
3094       /* Set all the bits above the sign bit.  */
3095       b -= signmask <<= 1;
3096     }
3097
3098   b = (b & addrmask) >> howto->bitpos;
3099
3100   /* Now we can do the addition.  */
3101   sum = a + b;
3102
3103   /* See if the result has the correct sign.  Bits above the
3104      sign bit are junk now; ignore them.  If the sum is
3105      positive, make sure we did not have all negative inputs;
3106      if the sum is negative, make sure we did not have all
3107      positive inputs.  The test below looks only at the sign
3108      bits, and it really just
3109      SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
3110   */
3111   signmask = (fieldmask >> 1) + 1;
3112   if (((~ (a ^ b)) & (a ^ sum)) & signmask)
3113     return TRUE;
3114
3115   return FALSE;
3116 }
3117
3118 static bfd_boolean
3119 xcoff_complain_overflow_unsigned_func (bfd *input_bfd,
3120                                        bfd_vma val,
3121                                        bfd_vma relocation,
3122                                        struct reloc_howto_struct *howto)
3123 {
3124   bfd_vma addrmask, fieldmask;
3125   bfd_vma a, b, sum;
3126
3127   /* Get the values to be added together.  For signed and unsigned
3128      relocations, we assume that all values should be truncated to
3129      the size of an address.  For bitfields, all the bits matter.
3130      See also bfd_check_overflow.  */
3131   fieldmask = N_ONES (howto->bitsize);
3132   addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
3133   a = relocation;
3134   b = val & howto->src_mask;
3135
3136   /* Checking for an unsigned overflow is relatively easy:
3137      trim the addresses and add, and trim the result as well.
3138      Overflow is normally indicated when the result does not
3139      fit in the field.  However, we also need to consider the
3140      case when, e.g., fieldmask is 0x7fffffff or smaller, an
3141      input is 0x80000000, and bfd_vma is only 32 bits; then we
3142      will get sum == 0, but there is an overflow, since the
3143      inputs did not fit in the field.  Instead of doing a
3144      separate test, we can check for this by or-ing in the
3145      operands when testing for the sum overflowing its final
3146      field.  */
3147   a = (a & addrmask) >> howto->rightshift;
3148   b = (b & addrmask) >> howto->bitpos;
3149   sum = (a + b) & addrmask;
3150   if ((a | b | sum) & ~ fieldmask)
3151     return TRUE;
3152
3153   return FALSE;
3154 }
3155
3156 /* This is the relocation function for the RS/6000/POWER/PowerPC.
3157    This is currently the only processor which uses XCOFF; I hope that
3158    will never change.
3159
3160    I took the relocation type definitions from two documents:
3161    the PowerPC AIX Version 4 Application Binary Interface, First
3162    Edition (April 1992), and the PowerOpen ABI, Big-Endian
3163    32-Bit Hardware Implementation (June 30, 1994).  Differences
3164    between the documents are noted below.
3165
3166    Unsupported r_type's
3167
3168    R_RTB:
3169    R_RRTBI:
3170    R_RRTBA:
3171
3172    These relocs are defined by the PowerPC ABI to be
3173    relative branches which use half of the difference
3174    between the symbol and the program counter.  I can't
3175    quite figure out when this is useful.  These relocs are
3176    not defined by the PowerOpen ABI.
3177
3178    Supported r_type's
3179
3180    R_POS:
3181    Simple positive relocation.
3182
3183    R_NEG:
3184    Simple negative relocation.
3185
3186    R_REL:
3187    Simple PC relative relocation.
3188
3189    R_TOC:
3190    TOC relative relocation.  The value in the instruction in
3191    the input file is the offset from the input file TOC to
3192    the desired location.  We want the offset from the final
3193    TOC to the desired location.  We have:
3194    isym = iTOC + in
3195    iinsn = in + o
3196    osym = oTOC + on
3197    oinsn = on + o
3198    so we must change insn by on - in.
3199
3200    R_GL:
3201    GL linkage relocation.  The value of this relocation
3202    is the address of the entry in the TOC section.
3203
3204    R_TCL:
3205    Local object TOC address.  I can't figure out the
3206    difference between this and case R_GL.
3207
3208    R_TRL:
3209    TOC relative relocation.  A TOC relative load instruction
3210    which may be changed to a load address instruction.
3211    FIXME: We don't currently implement this optimization.
3212
3213    R_TRLA:
3214    TOC relative relocation.  This is a TOC relative load
3215    address instruction which may be changed to a load
3216    instruction.  FIXME: I don't know if this is the correct
3217    implementation.
3218
3219    R_BA:
3220    Absolute branch.  We don't want to mess with the lower
3221    two bits of the instruction.
3222
3223    R_CAI:
3224    The PowerPC ABI defines this as an absolute call which
3225    may be modified to become a relative call.  The PowerOpen
3226    ABI does not define this relocation type.
3227
3228    R_RBA:
3229    Absolute branch which may be modified to become a
3230    relative branch.
3231
3232    R_RBAC:
3233    The PowerPC ABI defines this as an absolute branch to a
3234    fixed address which may be modified to an absolute branch
3235    to a symbol.  The PowerOpen ABI does not define this
3236    relocation type.
3237
3238    R_RBRC:
3239    The PowerPC ABI defines this as an absolute branch to a
3240    fixed address which may be modified to a relative branch.
3241    The PowerOpen ABI does not define this relocation type.
3242
3243    R_BR:
3244    Relative branch.  We don't want to mess with the lower
3245    two bits of the instruction.
3246
3247    R_CREL:
3248    The PowerPC ABI defines this as a relative call which may
3249    be modified to become an absolute call.  The PowerOpen
3250    ABI does not define this relocation type.
3251
3252    R_RBR:
3253    A relative branch which may be modified to become an
3254    absolute branch.
3255
3256    R_RL:
3257    The PowerPC AIX ABI describes this as a load which may be
3258    changed to a load address.  The PowerOpen ABI says this
3259    is the same as case R_POS.
3260
3261    R_RLA:
3262    The PowerPC AIX ABI describes this as a load address
3263    which may be changed to a load.  The PowerOpen ABI says
3264    this is the same as R_POS.
3265 */
3266
3267 bfd_boolean
3268 xcoff_ppc_relocate_section (bfd *output_bfd,
3269                             struct bfd_link_info *info,
3270                             bfd *input_bfd,
3271                             asection *input_section,
3272                             bfd_byte *contents,
3273                             struct internal_reloc *relocs,
3274                             struct internal_syment *syms,
3275                             asection **sections)
3276 {
3277   struct internal_reloc *rel;
3278   struct internal_reloc *relend;
3279
3280   rel = relocs;
3281   relend = rel + input_section->reloc_count;
3282   for (; rel < relend; rel++)
3283     {
3284       long symndx;
3285       struct xcoff_link_hash_entry *h;
3286       struct internal_syment *sym;
3287       bfd_vma addend;
3288       bfd_vma val;
3289       struct reloc_howto_struct howto;
3290       bfd_vma relocation;
3291       bfd_vma value_to_relocate;
3292       bfd_vma address;
3293       bfd_byte *location;
3294
3295       /* Relocation type R_REF is a special relocation type which is
3296          merely used to prevent garbage collection from occurring for
3297          the csect including the symbol which it references.  */
3298       if (rel->r_type == R_REF)
3299         continue;
3300
3301       /* howto */
3302       howto.type = rel->r_type;
3303       howto.rightshift = 0;
3304       howto.bitsize = (rel->r_size & 0x1f) + 1;
3305       howto.size = howto.bitsize > 16 ? 2 : 1;
3306       howto.pc_relative = FALSE;
3307       howto.bitpos = 0;
3308       howto.complain_on_overflow = (rel->r_size & 0x80
3309                                     ? complain_overflow_signed
3310                                     : complain_overflow_bitfield);
3311       howto.special_function = NULL;
3312       howto.name = "internal";
3313       howto.partial_inplace = TRUE;
3314       howto.src_mask = howto.dst_mask = N_ONES (howto.bitsize);
3315       howto.pcrel_offset = FALSE;
3316
3317       /* symbol */
3318       val = 0;
3319       addend = 0;
3320       h = NULL;
3321       sym = NULL;
3322       symndx = rel->r_symndx;
3323
3324       if (-1 != symndx)
3325         {
3326           asection *sec;
3327
3328           h = obj_xcoff_sym_hashes (input_bfd)[symndx];
3329           sym = syms + symndx;
3330           addend = - sym->n_value;
3331
3332           if (NULL == h)
3333             {
3334               sec = sections[symndx];
3335               /* Hack to make sure we use the right TOC anchor value
3336                  if this reloc is against the TOC anchor.  */
3337               if (sec->name[3] == '0'
3338                   && strcmp (sec->name, ".tc0") == 0)
3339                 val = xcoff_data (output_bfd)->toc;
3340               else
3341                 val = (sec->output_section->vma
3342                        + sec->output_offset
3343                        + sym->n_value
3344                        - sec->vma);
3345             }
3346           else
3347             {
3348               if (info->unresolved_syms_in_objects != RM_IGNORE
3349                   && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
3350                 {
3351                   if (! ((*info->callbacks->undefined_symbol)
3352                          (info, h->root.root.string,
3353                           input_bfd, input_section,
3354                           rel->r_vaddr - input_section->vma,
3355                           (info->unresolved_syms_in_objects
3356                            == RM_GENERATE_ERROR))))
3357                     return FALSE;
3358                 }
3359               if (h->root.type == bfd_link_hash_defined
3360                   || h->root.type == bfd_link_hash_defweak)
3361                 {
3362                   sec = h->root.u.def.section;
3363                   val = (h->root.u.def.value
3364                          + sec->output_section->vma
3365                          + sec->output_offset);
3366                 }
3367               else if (h->root.type == bfd_link_hash_common)
3368                 {
3369                   sec = h->root.u.c.p->section;
3370                   val = (sec->output_section->vma
3371                          + sec->output_offset);
3372
3373                 }
3374               else
3375                 {
3376                   BFD_ASSERT (info->relocatable
3377                               || (info->static_link
3378                                   && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
3379                               || (h->flags & XCOFF_DEF_DYNAMIC) != 0
3380                               || (h->flags & XCOFF_IMPORT) != 0);
3381                 }
3382             }
3383         }
3384
3385       if (rel->r_type >= XCOFF_MAX_CALCULATE_RELOCATION
3386           || !((*xcoff_calculate_relocation[rel->r_type])
3387                (input_bfd, input_section, output_bfd, rel, sym, &howto, val,
3388                 addend, &relocation, contents)))
3389         return FALSE;
3390
3391       /* address */
3392       address = rel->r_vaddr - input_section->vma;
3393       location = contents + address;
3394
3395       if (address > input_section->size)
3396         abort ();
3397
3398       /* Get the value we are going to relocate.  */
3399       if (1 == howto.size)
3400         value_to_relocate = bfd_get_16 (input_bfd, location);
3401       else
3402         value_to_relocate = bfd_get_32 (input_bfd, location);
3403
3404       /* overflow.
3405
3406          FIXME: We may drop bits during the addition
3407          which we don't check for.  We must either check at every single
3408          operation, which would be tedious, or we must do the computations
3409          in a type larger than bfd_vma, which would be inefficient.  */
3410
3411       if ((unsigned int) howto.complain_on_overflow
3412           >= XCOFF_MAX_COMPLAIN_OVERFLOW)
3413         abort ();
3414
3415       if (((*xcoff_complain_overflow[howto.complain_on_overflow])
3416            (input_bfd, value_to_relocate, relocation, &howto)))
3417         {
3418           const char *name;
3419           char buf[SYMNMLEN + 1];
3420           char reloc_type_name[10];
3421
3422           if (symndx == -1)
3423             {
3424               name = "*ABS*";
3425             }
3426           else if (h != NULL)
3427             {
3428               name = NULL;
3429             }
3430           else
3431             {
3432               name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
3433               if (name == NULL)
3434                 name = "UNKNOWN";
3435             }
3436           sprintf (reloc_type_name, "0x%02x", rel->r_type);
3437
3438           if (! ((*info->callbacks->reloc_overflow)
3439                  (info, (h ? &h->root : NULL), name, reloc_type_name,
3440                   (bfd_vma) 0, input_bfd, input_section,
3441                   rel->r_vaddr - input_section->vma)))
3442             return FALSE;
3443         }
3444
3445       /* Add RELOCATION to the right bits of VALUE_TO_RELOCATE.  */
3446       value_to_relocate = ((value_to_relocate & ~howto.dst_mask)
3447                            | (((value_to_relocate & howto.src_mask)
3448                                + relocation) & howto.dst_mask));
3449
3450       /* Put the value back in the object file.  */
3451       if (1 == howto.size)
3452         bfd_put_16 (input_bfd, value_to_relocate, location);
3453       else
3454         bfd_put_32 (input_bfd, value_to_relocate, location);
3455     }
3456
3457   return TRUE;
3458 }
3459
3460 static bfd_boolean
3461 _bfd_xcoff_put_ldsymbol_name (bfd *abfd ATTRIBUTE_UNUSED,
3462                               struct xcoff_loader_info *ldinfo,
3463                               struct internal_ldsym *ldsym,
3464                               const char *name)
3465 {
3466   size_t len;
3467   len = strlen (name);
3468
3469   if (len <= SYMNMLEN)
3470     strncpy (ldsym->_l._l_name, name, SYMNMLEN);
3471   else
3472     {
3473       if (ldinfo->string_size + len + 3 > ldinfo->string_alc)
3474         {
3475           bfd_size_type newalc;
3476           char *newstrings;
3477
3478           newalc = ldinfo->string_alc * 2;
3479           if (newalc == 0)
3480             newalc = 32;
3481           while (ldinfo->string_size + len + 3 > newalc)
3482             newalc *= 2;
3483
3484           newstrings = bfd_realloc (ldinfo->strings, newalc);
3485           if (newstrings == NULL)
3486             {
3487               ldinfo->failed = TRUE;
3488               return FALSE;
3489             }
3490           ldinfo->string_alc = newalc;
3491           ldinfo->strings = newstrings;
3492         }
3493
3494       bfd_put_16 (ldinfo->output_bfd, (bfd_vma) (len + 1),
3495                   ldinfo->strings + ldinfo->string_size);
3496       strcpy (ldinfo->strings + ldinfo->string_size + 2, name);
3497       ldsym->_l._l_l._l_zeroes = 0;
3498       ldsym->_l._l_l._l_offset = ldinfo->string_size + 2;
3499       ldinfo->string_size += len + 3;
3500     }
3501
3502   return TRUE;
3503 }
3504
3505 static bfd_boolean
3506 _bfd_xcoff_put_symbol_name (bfd *abfd, struct bfd_strtab_hash *strtab,
3507                             struct internal_syment *sym,
3508                             const char *name)
3509 {
3510   if (strlen (name) <= SYMNMLEN)
3511     {
3512       strncpy (sym->_n._n_name, name, SYMNMLEN);
3513     }
3514   else
3515     {
3516       bfd_boolean hash;
3517       bfd_size_type indx;
3518
3519       hash = TRUE;
3520       if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
3521         hash = FALSE;
3522       indx = _bfd_stringtab_add (strtab, name, hash, FALSE);
3523       if (indx == (bfd_size_type) -1)
3524         return FALSE;
3525       sym->_n._n_n._n_zeroes = 0;
3526       sym->_n._n_n._n_offset = STRING_SIZE_SIZE + indx;
3527     }
3528   return TRUE;
3529 }
3530
3531 static asection *
3532 xcoff_create_csect_from_smclas (bfd *abfd,
3533                                 union internal_auxent *aux,
3534                                 const char *symbol_name)
3535 {
3536   asection *return_value = NULL;
3537
3538   /* .sv64 = x_smclas == 17
3539      This is an invalid csect for 32 bit apps.  */
3540   static const char *names[19] =
3541   {
3542     ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
3543     ".sv", ".bs", ".ds", ".uc", ".ti", ".tb", NULL, ".tc0",
3544     ".td", NULL, ".sv3264"
3545   };
3546
3547   if ((19 >= aux->x_csect.x_smclas)
3548       && (NULL != names[aux->x_csect.x_smclas]))
3549     {
3550       return_value = bfd_make_section_anyway
3551         (abfd, names[aux->x_csect.x_smclas]);
3552     }
3553   else
3554     {
3555       (*_bfd_error_handler)
3556         (_("%B: symbol `%s' has unrecognized smclas %d"),
3557          abfd, symbol_name, aux->x_csect.x_smclas);
3558       bfd_set_error (bfd_error_bad_value);
3559     }
3560
3561   return return_value;
3562 }
3563
3564 static bfd_boolean
3565 xcoff_is_lineno_count_overflow (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma value)
3566 {
3567   if (0xffff <= value)
3568     return TRUE;
3569
3570   return FALSE;
3571 }
3572
3573 static bfd_boolean
3574 xcoff_is_reloc_count_overflow (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma value)
3575 {
3576   if (0xffff <= value)
3577     return TRUE;
3578
3579   return FALSE;
3580 }
3581
3582 static bfd_vma
3583 xcoff_loader_symbol_offset (bfd *abfd,
3584                             struct internal_ldhdr *ldhdr ATTRIBUTE_UNUSED)
3585 {
3586   return bfd_xcoff_ldhdrsz (abfd);
3587 }
3588
3589 static bfd_vma
3590 xcoff_loader_reloc_offset (bfd *abfd, struct internal_ldhdr *ldhdr)
3591 {
3592   return bfd_xcoff_ldhdrsz (abfd) + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (abfd);
3593 }
3594
3595 static bfd_boolean
3596 xcoff_generate_rtinit  (bfd *abfd, const char *init, const char *fini,
3597                         bfd_boolean rtld)
3598 {
3599   bfd_byte filehdr_ext[FILHSZ];
3600   bfd_byte scnhdr_ext[SCNHSZ];
3601   bfd_byte syment_ext[SYMESZ * 10];
3602   bfd_byte reloc_ext[RELSZ * 3];
3603   bfd_byte *data_buffer;
3604   bfd_size_type data_buffer_size;
3605   bfd_byte *string_table = NULL, *st_tmp = NULL;
3606   bfd_size_type string_table_size;
3607   bfd_vma val;
3608   size_t initsz, finisz;
3609   struct internal_filehdr filehdr;
3610   struct internal_scnhdr scnhdr;
3611   struct internal_syment syment;
3612   union internal_auxent auxent;
3613   struct internal_reloc reloc;
3614
3615   char *data_name = ".data";
3616   char *rtinit_name = "__rtinit";
3617   char *rtld_name = "__rtld";
3618
3619   if (! bfd_xcoff_rtinit_size (abfd))
3620     return FALSE;
3621
3622   initsz = (init == NULL ? 0 : 1 + strlen (init));
3623   finisz = (fini == NULL ? 0 : 1 + strlen (fini));
3624
3625   /* file header */
3626   memset (filehdr_ext, 0, FILHSZ);
3627   memset (&filehdr, 0, sizeof (struct internal_filehdr));
3628   filehdr.f_magic = bfd_xcoff_magic_number (abfd);
3629   filehdr.f_nscns = 1;
3630   filehdr.f_timdat = 0;
3631   filehdr.f_nsyms = 0;  /* at least 6, no more than 10 */
3632   filehdr.f_symptr = 0; /* set below */
3633   filehdr.f_opthdr = 0;
3634   filehdr.f_flags = 0;
3635
3636   /* section header */
3637   memset (scnhdr_ext, 0, SCNHSZ);
3638   memset (&scnhdr, 0, sizeof (struct internal_scnhdr));
3639   memcpy (scnhdr.s_name, data_name, strlen (data_name));
3640   scnhdr.s_paddr = 0;
3641   scnhdr.s_vaddr = 0;
3642   scnhdr.s_size = 0;    /* set below */
3643   scnhdr.s_scnptr = FILHSZ + SCNHSZ;
3644   scnhdr.s_relptr = 0;  /* set below */
3645   scnhdr.s_lnnoptr = 0;
3646   scnhdr.s_nreloc = 0;  /* either 1 or 2 */
3647   scnhdr.s_nlnno = 0;
3648   scnhdr.s_flags = STYP_DATA;
3649
3650   /* .data
3651      0x0000           0x00000000 : rtl
3652      0x0004           0x00000010 : offset to init, or 0
3653      0x0008           0x00000028 : offset to fini, or 0
3654      0x000C           0x0000000C : size of descriptor
3655      0x0010           0x00000000 : init, needs a reloc
3656      0x0014           0x00000040 : offset to init name
3657      0x0018           0x00000000 : flags, padded to a word
3658      0x001C           0x00000000 : empty init
3659      0x0020           0x00000000 :
3660      0x0024           0x00000000 :
3661      0x0028           0x00000000 : fini, needs a reloc
3662      0x002C           0x00000??? : offset to fini name
3663      0x0030           0x00000000 : flags, padded to a word
3664      0x0034           0x00000000 : empty fini
3665      0x0038           0x00000000 :
3666      0x003C           0x00000000 :
3667      0x0040           init name
3668      0x0040 + initsz  fini name */
3669
3670   data_buffer_size = 0x0040 + initsz + finisz;
3671   data_buffer_size = (data_buffer_size + 7) &~ (bfd_size_type) 7;
3672   data_buffer = NULL;
3673   data_buffer = (bfd_byte *) bfd_zmalloc (data_buffer_size);
3674   if (data_buffer == NULL)
3675     return FALSE;
3676
3677   if (initsz)
3678     {
3679       val = 0x10;
3680       bfd_h_put_32 (abfd, val, &data_buffer[0x04]);
3681       val = 0x40;
3682       bfd_h_put_32 (abfd, val, &data_buffer[0x14]);
3683       memcpy (&data_buffer[val], init, initsz);
3684     }
3685
3686   if (finisz)
3687     {
3688       val = 0x28;
3689       bfd_h_put_32 (abfd, val, &data_buffer[0x08]);
3690       val = 0x40 + initsz;
3691       bfd_h_put_32 (abfd, val, &data_buffer[0x2C]);
3692       memcpy (&data_buffer[val], fini, finisz);
3693     }
3694
3695   val = 0x0C;
3696   bfd_h_put_32 (abfd, val, &data_buffer[0x0C]);
3697
3698   scnhdr.s_size = data_buffer_size;
3699
3700   /* string table */
3701   string_table_size = 0;
3702   if (initsz > 9)
3703     string_table_size += initsz;
3704   if (finisz > 9)
3705     string_table_size += finisz;
3706   if (string_table_size)
3707     {
3708       string_table_size += 4;
3709       string_table = (bfd_byte *) bfd_zmalloc (string_table_size);
3710       if (string_table == NULL)
3711         return FALSE;
3712
3713       val = string_table_size;
3714       bfd_h_put_32 (abfd, val, &string_table[0]);
3715       st_tmp = string_table + 4;
3716     }
3717
3718   /* symbols
3719      0. .data csect
3720      2. __rtinit
3721      4. init function
3722      6. fini function
3723      8. __rtld  */
3724   memset (syment_ext, 0, 10 * SYMESZ);
3725   memset (reloc_ext, 0, 3 * RELSZ);
3726
3727   /* .data csect */
3728   memset (&syment, 0, sizeof (struct internal_syment));
3729   memset (&auxent, 0, sizeof (union internal_auxent));
3730   memcpy (syment._n._n_name, data_name, strlen (data_name));
3731   syment.n_scnum = 1;
3732   syment.n_sclass = C_HIDEXT;
3733   syment.n_numaux = 1;
3734   auxent.x_csect.x_scnlen.l = data_buffer_size;
3735   auxent.x_csect.x_smtyp = 3 << 3 | XTY_SD;
3736   auxent.x_csect.x_smclas = XMC_RW;
3737   bfd_coff_swap_sym_out (abfd, &syment,
3738                          &syment_ext[filehdr.f_nsyms * SYMESZ]);
3739   bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3740                          syment.n_numaux,
3741                          &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3742   filehdr.f_nsyms += 2;
3743
3744   /* __rtinit */
3745   memset (&syment, 0, sizeof (struct internal_syment));
3746   memset (&auxent, 0, sizeof (union internal_auxent));
3747   memcpy (syment._n._n_name, rtinit_name, strlen (rtinit_name));
3748   syment.n_scnum = 1;
3749   syment.n_sclass = C_EXT;
3750   syment.n_numaux = 1;
3751   auxent.x_csect.x_smtyp = XTY_LD;
3752   auxent.x_csect.x_smclas = XMC_RW;
3753   bfd_coff_swap_sym_out (abfd, &syment,
3754                          &syment_ext[filehdr.f_nsyms * SYMESZ]);
3755   bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3756                          syment.n_numaux,
3757                          &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3758   filehdr.f_nsyms += 2;
3759
3760   /* init */
3761   if (initsz)
3762     {
3763       memset (&syment, 0, sizeof (struct internal_syment));
3764       memset (&auxent, 0, sizeof (union internal_auxent));
3765
3766       if (initsz > 9)
3767         {
3768           syment._n._n_n._n_offset = st_tmp - string_table;
3769           memcpy (st_tmp, init, initsz);
3770           st_tmp += initsz;
3771         }
3772       else
3773         memcpy (syment._n._n_name, init, initsz - 1);
3774
3775       syment.n_sclass = C_EXT;
3776       syment.n_numaux = 1;
3777       bfd_coff_swap_sym_out (abfd, &syment,
3778                              &syment_ext[filehdr.f_nsyms * SYMESZ]);
3779       bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3780                              syment.n_numaux,
3781                              &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3782
3783       /* reloc */
3784       memset (&reloc, 0, sizeof (struct internal_reloc));
3785       reloc.r_vaddr = 0x0010;
3786       reloc.r_symndx = filehdr.f_nsyms;
3787       reloc.r_type = R_POS;
3788       reloc.r_size = 31;
3789       bfd_coff_swap_reloc_out (abfd, &reloc, &reloc_ext[0]);
3790
3791       filehdr.f_nsyms += 2;
3792       scnhdr.s_nreloc += 1;
3793     }
3794
3795   /* fini */
3796   if (finisz)
3797     {
3798       memset (&syment, 0, sizeof (struct internal_syment));
3799       memset (&auxent, 0, sizeof (union internal_auxent));
3800
3801       if (finisz > 9)
3802         {
3803           syment._n._n_n._n_offset = st_tmp - string_table;
3804           memcpy (st_tmp, fini, finisz);
3805           st_tmp += finisz;
3806         }
3807       else
3808         memcpy (syment._n._n_name, fini, finisz - 1);
3809
3810       syment.n_sclass = C_EXT;
3811       syment.n_numaux = 1;
3812       bfd_coff_swap_sym_out (abfd, &syment,
3813                              &syment_ext[filehdr.f_nsyms * SYMESZ]);
3814       bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3815                              syment.n_numaux,
3816                              &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3817
3818       /* reloc */
3819       memset (&reloc, 0, sizeof (struct internal_reloc));
3820       reloc.r_vaddr = 0x0028;
3821       reloc.r_symndx = filehdr.f_nsyms;
3822       reloc.r_type = R_POS;
3823       reloc.r_size = 31;
3824       bfd_coff_swap_reloc_out (abfd, &reloc,
3825                                &reloc_ext[scnhdr.s_nreloc * RELSZ]);
3826
3827       filehdr.f_nsyms += 2;
3828       scnhdr.s_nreloc += 1;
3829     }
3830
3831   if (rtld)
3832     {
3833       memset (&syment, 0, sizeof (struct internal_syment));
3834       memset (&auxent, 0, sizeof (union internal_auxent));
3835       memcpy (syment._n._n_name, rtld_name, strlen (rtld_name));
3836       syment.n_sclass = C_EXT;
3837       syment.n_numaux = 1;
3838       bfd_coff_swap_sym_out (abfd, &syment,
3839                              &syment_ext[filehdr.f_nsyms * SYMESZ]);
3840       bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3841                              syment.n_numaux,
3842                              &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3843
3844       /* reloc */
3845       memset (&reloc, 0, sizeof (struct internal_reloc));
3846       reloc.r_vaddr = 0x0000;
3847       reloc.r_symndx = filehdr.f_nsyms;
3848       reloc.r_type = R_POS;
3849       reloc.r_size = 31;
3850       bfd_coff_swap_reloc_out (abfd, &reloc,
3851                                &reloc_ext[scnhdr.s_nreloc * RELSZ]);
3852
3853       filehdr.f_nsyms += 2;
3854       scnhdr.s_nreloc += 1;
3855     }
3856
3857   scnhdr.s_relptr = scnhdr.s_scnptr + data_buffer_size;
3858   filehdr.f_symptr = scnhdr.s_relptr + scnhdr.s_nreloc * RELSZ;
3859
3860   bfd_coff_swap_filehdr_out (abfd, &filehdr, filehdr_ext);
3861   bfd_bwrite (filehdr_ext, FILHSZ, abfd);
3862   bfd_coff_swap_scnhdr_out (abfd, &scnhdr, scnhdr_ext);
3863   bfd_bwrite (scnhdr_ext, SCNHSZ, abfd);
3864   bfd_bwrite (data_buffer, data_buffer_size, abfd);
3865   bfd_bwrite (reloc_ext, scnhdr.s_nreloc * RELSZ, abfd);
3866   bfd_bwrite (syment_ext, filehdr.f_nsyms * SYMESZ, abfd);
3867   bfd_bwrite (string_table, string_table_size, abfd);
3868
3869   free (data_buffer);
3870   data_buffer = NULL;
3871
3872   return TRUE;
3873 }
3874
3875
3876 static reloc_howto_type xcoff_dynamic_reloc =
3877 HOWTO (0,                       /* type */
3878        0,                       /* rightshift */
3879        2,                       /* size (0 = byte, 1 = short, 2 = long) */
3880        32,                      /* bitsize */
3881        FALSE,                   /* pc_relative */
3882        0,                       /* bitpos */
3883        complain_overflow_bitfield, /* complain_on_overflow */
3884        0,                       /* special_function */
3885        "R_POS",                 /* name */
3886        TRUE,                    /* partial_inplace */
3887        0xffffffff,              /* src_mask */
3888        0xffffffff,              /* dst_mask */
3889        FALSE);                  /* pcrel_offset */
3890
3891 /*  glink
3892
3893    The first word of global linkage code must be modified by filling in
3894    the correct TOC offset.  */
3895
3896 static unsigned long xcoff_glink_code[9] =
3897   {
3898     0x81820000, /* lwz r12,0(r2) */
3899     0x90410014, /* stw r2,20(r1) */
3900     0x800c0000, /* lwz r0,0(r12) */
3901     0x804c0004, /* lwz r2,4(r12) */
3902     0x7c0903a6, /* mtctr r0 */
3903     0x4e800420, /* bctr */
3904     0x00000000, /* start of traceback table */
3905     0x000c8000, /* traceback table */
3906     0x00000000, /* traceback table */
3907   };
3908
3909 /* Table to convert DWARF flags to section names.  */
3910
3911 const struct xcoff_dwsect_name xcoff_dwsect_names[] = {
3912   { SSUBTYP_DWINFO,  ".dwinfo",   TRUE },
3913   { SSUBTYP_DWLINE,  ".dwline",   TRUE },
3914   { SSUBTYP_DWPBNMS, ".dwpbnms",  TRUE },
3915   { SSUBTYP_DWPBTYP, ".dwpbtyp",  TRUE },
3916   { SSUBTYP_DWARNGE, ".dwarnge",  TRUE },
3917   { SSUBTYP_DWABREV, ".dwabrev",  FALSE },
3918   { SSUBTYP_DWSTR,   ".dwstr",    TRUE },
3919   { SSUBTYP_DWRNGES, ".dwrnges",  TRUE }
3920 };
3921
3922 static const struct xcoff_backend_data_rec bfd_xcoff_backend_data =
3923   {
3924     { /* COFF backend, defined in libcoff.h.  */
3925       _bfd_xcoff_swap_aux_in,
3926       _bfd_xcoff_swap_sym_in,
3927       coff_swap_lineno_in,
3928       _bfd_xcoff_swap_aux_out,
3929       _bfd_xcoff_swap_sym_out,
3930       coff_swap_lineno_out,
3931       xcoff_swap_reloc_out,
3932       coff_swap_filehdr_out,
3933       coff_swap_aouthdr_out,
3934       coff_swap_scnhdr_out,
3935       FILHSZ,
3936       AOUTSZ,
3937       SCNHSZ,
3938       SYMESZ,
3939       AUXESZ,
3940       RELSZ,
3941       LINESZ,
3942       FILNMLEN,
3943       TRUE,                     /* _bfd_coff_long_filenames */
3944       XCOFF_NO_LONG_SECTION_NAMES,  /* _bfd_coff_long_section_names */
3945       3,                        /* _bfd_coff_default_section_alignment_power */
3946       FALSE,                    /* _bfd_coff_force_symnames_in_strings */
3947       2,                        /* _bfd_coff_debug_string_prefix_length */
3948       coff_swap_filehdr_in,
3949       coff_swap_aouthdr_in,
3950       coff_swap_scnhdr_in,
3951       xcoff_swap_reloc_in,
3952       coff_bad_format_hook,
3953       coff_set_arch_mach_hook,
3954       coff_mkobject_hook,
3955       styp_to_sec_flags,
3956       coff_set_alignment_hook,
3957       coff_slurp_symbol_table,
3958       symname_in_debug_hook,
3959       coff_pointerize_aux_hook,
3960       coff_print_aux,
3961       dummy_reloc16_extra_cases,
3962       dummy_reloc16_estimate,
3963       NULL,                     /* bfd_coff_sym_is_global */
3964       coff_compute_section_file_positions,
3965       NULL,                     /* _bfd_coff_start_final_link */
3966       xcoff_ppc_relocate_section,
3967       coff_rtype_to_howto,
3968       NULL,                     /* _bfd_coff_adjust_symndx */
3969       _bfd_generic_link_add_one_symbol,
3970       coff_link_output_has_begun,
3971       coff_final_link_postscript,
3972       NULL                      /* print_pdata.  */
3973     },
3974
3975     0x01DF,                     /* magic number */
3976     bfd_arch_rs6000,
3977     bfd_mach_rs6k,
3978
3979     /* Function pointers to xcoff specific swap routines.  */
3980     xcoff_swap_ldhdr_in,
3981     xcoff_swap_ldhdr_out,
3982     xcoff_swap_ldsym_in,
3983     xcoff_swap_ldsym_out,
3984     xcoff_swap_ldrel_in,
3985     xcoff_swap_ldrel_out,
3986
3987     /* Sizes.  */
3988     LDHDRSZ,
3989     LDSYMSZ,
3990     LDRELSZ,
3991     12,                         /* _xcoff_function_descriptor_size */
3992     SMALL_AOUTSZ,
3993
3994     /* Versions.  */
3995     1,                          /* _xcoff_ldhdr_version */
3996
3997     _bfd_xcoff_put_symbol_name,
3998     _bfd_xcoff_put_ldsymbol_name,
3999     &xcoff_dynamic_reloc,
4000     xcoff_create_csect_from_smclas,
4001
4002     /* Lineno and reloc count overflow.  */
4003     xcoff_is_lineno_count_overflow,
4004     xcoff_is_reloc_count_overflow,
4005
4006     xcoff_loader_symbol_offset,
4007     xcoff_loader_reloc_offset,
4008
4009     /* glink.  */
4010     &xcoff_glink_code[0],
4011     36,                         /* _xcoff_glink_size */
4012
4013     /* rtinit */
4014     64,                         /* _xcoff_rtinit_size */
4015     xcoff_generate_rtinit,
4016   };
4017
4018 /* The transfer vector that leads the outside world to all of the above.  */
4019 const bfd_target rs6000coff_vec =
4020   {
4021     "aixcoff-rs6000",
4022     bfd_target_xcoff_flavour,
4023     BFD_ENDIAN_BIG,             /* data byte order is big */
4024     BFD_ENDIAN_BIG,             /* header byte order is big */
4025
4026     (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
4027      | HAS_SYMS | HAS_LOCALS | WP_TEXT),
4028
4029     SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
4030     0,                          /* leading char */
4031     '/',                        /* ar_pad_char */
4032     15,                         /* ar_max_namelen */
4033     0,                          /* match priority.  */
4034
4035     /* data */
4036     bfd_getb64,
4037     bfd_getb_signed_64,
4038     bfd_putb64,
4039     bfd_getb32,
4040     bfd_getb_signed_32,
4041     bfd_putb32,
4042     bfd_getb16,
4043     bfd_getb_signed_16,
4044     bfd_putb16,
4045
4046     /* hdrs */
4047     bfd_getb64,
4048     bfd_getb_signed_64,
4049     bfd_putb64,
4050     bfd_getb32,
4051     bfd_getb_signed_32,
4052     bfd_putb32,
4053     bfd_getb16,
4054     bfd_getb_signed_16,
4055     bfd_putb16,
4056
4057     { /* bfd_check_format */
4058       _bfd_dummy_target,
4059       coff_object_p,
4060       _bfd_xcoff_archive_p,
4061       CORE_FILE_P
4062     },
4063
4064     { /* bfd_set_format */
4065       bfd_false,
4066       coff_mkobject,
4067       _bfd_generic_mkarchive,
4068       bfd_false
4069     },
4070
4071     {/* bfd_write_contents */
4072       bfd_false,
4073       coff_write_object_contents,
4074       _bfd_xcoff_write_archive_contents,
4075       bfd_false
4076     },
4077
4078     /* Generic */
4079     bfd_true,
4080     bfd_true,
4081     coff_new_section_hook,
4082     _bfd_generic_get_section_contents,
4083     _bfd_generic_get_section_contents_in_window,
4084
4085     /* Copy */
4086     _bfd_xcoff_copy_private_bfd_data,
4087     _bfd_generic_bfd_merge_private_bfd_data,
4088     _bfd_generic_init_private_section_data,
4089     _bfd_generic_bfd_copy_private_section_data,
4090     _bfd_generic_bfd_copy_private_symbol_data,
4091     _bfd_generic_bfd_copy_private_header_data,
4092     _bfd_generic_bfd_set_private_flags,
4093     _bfd_generic_bfd_print_private_bfd_data,
4094
4095     /* Core */
4096     BFD_JUMP_TABLE_CORE (coff),
4097
4098     /* Archive */
4099     _bfd_xcoff_slurp_armap,
4100     _bfd_noarchive_slurp_extended_name_table,
4101     _bfd_noarchive_construct_extended_name_table,
4102     bfd_dont_truncate_arname,
4103     _bfd_xcoff_write_armap,
4104     _bfd_xcoff_read_ar_hdr,
4105     _bfd_generic_write_ar_hdr,
4106     _bfd_xcoff_openr_next_archived_file,
4107     _bfd_generic_get_elt_at_index,
4108     _bfd_xcoff_stat_arch_elt,
4109     bfd_true,
4110
4111     /* Symbols */
4112     coff_get_symtab_upper_bound,
4113     coff_canonicalize_symtab,
4114     coff_make_empty_symbol,
4115     coff_print_symbol,
4116     coff_get_symbol_info,
4117     _bfd_xcoff_is_local_label_name,
4118     coff_bfd_is_target_special_symbol,
4119     coff_get_lineno,
4120     xcoff_find_nearest_line,
4121     _bfd_generic_find_line,
4122     coff_find_inliner_info,
4123     coff_bfd_make_debug_symbol,
4124     _bfd_generic_read_minisymbols,
4125     _bfd_generic_minisymbol_to_symbol,
4126
4127     /* Reloc */
4128     coff_get_reloc_upper_bound,
4129     coff_canonicalize_reloc,
4130     _bfd_xcoff_reloc_type_lookup,
4131     _bfd_xcoff_reloc_name_lookup,
4132
4133     /* Write */
4134     coff_set_arch_mach,
4135     coff_set_section_contents,
4136
4137     /* Link */
4138     _bfd_xcoff_sizeof_headers,
4139     bfd_generic_get_relocated_section_contents,
4140     bfd_generic_relax_section,
4141     _bfd_xcoff_bfd_link_hash_table_create,
4142     _bfd_generic_link_hash_table_free,
4143     _bfd_xcoff_bfd_link_add_symbols,
4144     _bfd_generic_link_just_syms,
4145     _bfd_generic_copy_link_hash_symbol_type,
4146     _bfd_xcoff_bfd_final_link,
4147     _bfd_generic_link_split_section,
4148     bfd_generic_gc_sections,
4149     bfd_generic_lookup_section_flags,
4150     bfd_generic_merge_sections,
4151     bfd_generic_is_group_section,
4152     bfd_generic_discard_group,
4153     _bfd_generic_section_already_linked,
4154     _bfd_xcoff_define_common_symbol,
4155
4156     /* Dynamic */
4157     _bfd_xcoff_get_dynamic_symtab_upper_bound,
4158     _bfd_xcoff_canonicalize_dynamic_symtab,
4159     _bfd_nodynamic_get_synthetic_symtab,
4160     _bfd_xcoff_get_dynamic_reloc_upper_bound,
4161     _bfd_xcoff_canonicalize_dynamic_reloc,
4162
4163     /* Opposite endian version, none exists */
4164     NULL,
4165
4166     (void *) &bfd_xcoff_backend_data,
4167   };
4168
4169 /* xcoff-powermac target
4170    Old target.
4171    Only difference between this target and the rs6000 target is the
4172    the default architecture and machine type used in coffcode.h
4173
4174    PowerPC Macs use the same magic numbers as RS/6000
4175    (because that's how they were bootstrapped originally),
4176    but they are always PowerPC architecture.  */
4177 static const struct xcoff_backend_data_rec bfd_pmac_xcoff_backend_data =
4178   {
4179     { /* COFF backend, defined in libcoff.h.  */
4180       _bfd_xcoff_swap_aux_in,
4181       _bfd_xcoff_swap_sym_in,
4182       coff_swap_lineno_in,
4183       _bfd_xcoff_swap_aux_out,
4184       _bfd_xcoff_swap_sym_out,
4185       coff_swap_lineno_out,
4186       xcoff_swap_reloc_out,
4187       coff_swap_filehdr_out,
4188       coff_swap_aouthdr_out,
4189       coff_swap_scnhdr_out,
4190       FILHSZ,
4191       AOUTSZ,
4192       SCNHSZ,
4193       SYMESZ,
4194       AUXESZ,
4195       RELSZ,
4196       LINESZ,
4197       FILNMLEN,
4198       TRUE,                     /* _bfd_coff_long_filenames */
4199       XCOFF_NO_LONG_SECTION_NAMES,  /* _bfd_coff_long_section_names */
4200       3,                        /* _bfd_coff_default_section_alignment_power */
4201       FALSE,                    /* _bfd_coff_force_symnames_in_strings */
4202       2,                        /* _bfd_coff_debug_string_prefix_length */
4203       coff_swap_filehdr_in,
4204       coff_swap_aouthdr_in,
4205       coff_swap_scnhdr_in,
4206       xcoff_swap_reloc_in,
4207       coff_bad_format_hook,
4208       coff_set_arch_mach_hook,
4209       coff_mkobject_hook,
4210       styp_to_sec_flags,
4211       coff_set_alignment_hook,
4212       coff_slurp_symbol_table,
4213       symname_in_debug_hook,
4214       coff_pointerize_aux_hook,
4215       coff_print_aux,
4216       dummy_reloc16_extra_cases,
4217       dummy_reloc16_estimate,
4218       NULL,                     /* bfd_coff_sym_is_global */
4219       coff_compute_section_file_positions,
4220       NULL,                     /* _bfd_coff_start_final_link */
4221       xcoff_ppc_relocate_section,
4222       coff_rtype_to_howto,
4223       NULL,                     /* _bfd_coff_adjust_symndx */
4224       _bfd_generic_link_add_one_symbol,
4225       coff_link_output_has_begun,
4226       coff_final_link_postscript,
4227       NULL                      /* print_pdata.  */
4228     },
4229
4230     0x01DF,                     /* magic number */
4231     bfd_arch_powerpc,
4232     bfd_mach_ppc,
4233
4234     /* Function pointers to xcoff specific swap routines.  */
4235     xcoff_swap_ldhdr_in,
4236     xcoff_swap_ldhdr_out,
4237     xcoff_swap_ldsym_in,
4238     xcoff_swap_ldsym_out,
4239     xcoff_swap_ldrel_in,
4240     xcoff_swap_ldrel_out,
4241
4242     /* Sizes.  */
4243     LDHDRSZ,
4244     LDSYMSZ,
4245     LDRELSZ,
4246     12,                         /* _xcoff_function_descriptor_size */
4247     SMALL_AOUTSZ,
4248
4249     /* Versions.  */
4250     1,                          /* _xcoff_ldhdr_version */
4251
4252     _bfd_xcoff_put_symbol_name,
4253     _bfd_xcoff_put_ldsymbol_name,
4254     &xcoff_dynamic_reloc,
4255     xcoff_create_csect_from_smclas,
4256
4257     /* Lineno and reloc count overflow.  */
4258     xcoff_is_lineno_count_overflow,
4259     xcoff_is_reloc_count_overflow,
4260
4261     xcoff_loader_symbol_offset,
4262     xcoff_loader_reloc_offset,
4263
4264     /* glink.  */
4265     &xcoff_glink_code[0],
4266     36,                         /* _xcoff_glink_size */
4267
4268     /* rtinit */
4269     0,                          /* _xcoff_rtinit_size */
4270     xcoff_generate_rtinit,
4271   };
4272
4273 /* The transfer vector that leads the outside world to all of the above.  */
4274 const bfd_target pmac_xcoff_vec =
4275   {
4276     "xcoff-powermac",
4277     bfd_target_xcoff_flavour,
4278     BFD_ENDIAN_BIG,             /* data byte order is big */
4279     BFD_ENDIAN_BIG,             /* header byte order is big */
4280
4281     (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
4282      | HAS_SYMS | HAS_LOCALS | WP_TEXT),
4283
4284     SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
4285     0,                          /* leading char */
4286     '/',                        /* ar_pad_char */
4287     15,                         /* ar_max_namelen */
4288     0,                          /* match priority.  */
4289
4290     /* data */
4291     bfd_getb64,
4292     bfd_getb_signed_64,
4293     bfd_putb64,
4294     bfd_getb32,
4295     bfd_getb_signed_32,
4296     bfd_putb32,
4297     bfd_getb16,
4298     bfd_getb_signed_16,
4299     bfd_putb16,
4300
4301     /* hdrs */
4302     bfd_getb64,
4303     bfd_getb_signed_64,
4304     bfd_putb64,
4305     bfd_getb32,
4306     bfd_getb_signed_32,
4307     bfd_putb32,
4308     bfd_getb16,
4309     bfd_getb_signed_16,
4310     bfd_putb16,
4311
4312     { /* bfd_check_format */
4313       _bfd_dummy_target,
4314       coff_object_p,
4315       _bfd_xcoff_archive_p,
4316       CORE_FILE_P
4317     },
4318
4319     { /* bfd_set_format */
4320       bfd_false,
4321       coff_mkobject,
4322       _bfd_generic_mkarchive,
4323       bfd_false
4324     },
4325
4326     {/* bfd_write_contents */
4327       bfd_false,
4328       coff_write_object_contents,
4329       _bfd_xcoff_write_archive_contents,
4330       bfd_false
4331     },
4332
4333     /* Generic */
4334     bfd_true,
4335     bfd_true,
4336     coff_new_section_hook,
4337     _bfd_generic_get_section_contents,
4338     _bfd_generic_get_section_contents_in_window,
4339
4340     /* Copy */
4341     _bfd_xcoff_copy_private_bfd_data,
4342     _bfd_generic_bfd_merge_private_bfd_data,
4343     _bfd_generic_init_private_section_data,
4344     _bfd_generic_bfd_copy_private_section_data,
4345     _bfd_generic_bfd_copy_private_symbol_data,
4346     _bfd_generic_bfd_copy_private_header_data,
4347     _bfd_generic_bfd_set_private_flags,
4348     _bfd_generic_bfd_print_private_bfd_data,
4349
4350     /* Core */
4351     BFD_JUMP_TABLE_CORE (coff),
4352
4353     /* Archive */
4354     _bfd_xcoff_slurp_armap,
4355     _bfd_noarchive_slurp_extended_name_table,
4356     _bfd_noarchive_construct_extended_name_table,
4357     bfd_dont_truncate_arname,
4358     _bfd_xcoff_write_armap,
4359     _bfd_xcoff_read_ar_hdr,
4360     _bfd_generic_write_ar_hdr,
4361     _bfd_xcoff_openr_next_archived_file,
4362     _bfd_generic_get_elt_at_index,
4363     _bfd_xcoff_stat_arch_elt,
4364     bfd_true,
4365
4366     /* Symbols */
4367     coff_get_symtab_upper_bound,
4368     coff_canonicalize_symtab,
4369     coff_make_empty_symbol,
4370     coff_print_symbol,
4371     coff_get_symbol_info,
4372     _bfd_xcoff_is_local_label_name,
4373     coff_bfd_is_target_special_symbol,
4374     coff_get_lineno,
4375     xcoff_find_nearest_line,
4376     _bfd_generic_find_line,
4377     coff_find_inliner_info,
4378     coff_bfd_make_debug_symbol,
4379     _bfd_generic_read_minisymbols,
4380     _bfd_generic_minisymbol_to_symbol,
4381
4382     /* Reloc */
4383     coff_get_reloc_upper_bound,
4384     coff_canonicalize_reloc,
4385     _bfd_xcoff_reloc_type_lookup,
4386     _bfd_xcoff_reloc_name_lookup,
4387
4388     /* Write */
4389     coff_set_arch_mach,
4390     coff_set_section_contents,
4391
4392     /* Link */
4393     _bfd_xcoff_sizeof_headers,
4394     bfd_generic_get_relocated_section_contents,
4395     bfd_generic_relax_section,
4396     _bfd_xcoff_bfd_link_hash_table_create,
4397     _bfd_generic_link_hash_table_free,
4398     _bfd_xcoff_bfd_link_add_symbols,
4399     _bfd_generic_link_just_syms,
4400     _bfd_generic_copy_link_hash_symbol_type,
4401     _bfd_xcoff_bfd_final_link,
4402     _bfd_generic_link_split_section,
4403     bfd_generic_gc_sections,
4404     bfd_generic_lookup_section_flags,
4405     bfd_generic_merge_sections,
4406     bfd_generic_is_group_section,
4407     bfd_generic_discard_group,
4408     _bfd_generic_section_already_linked,
4409     _bfd_xcoff_define_common_symbol,
4410
4411     /* Dynamic */
4412     _bfd_xcoff_get_dynamic_symtab_upper_bound,
4413     _bfd_xcoff_canonicalize_dynamic_symtab,
4414     _bfd_nodynamic_get_synthetic_symtab,
4415     _bfd_xcoff_get_dynamic_reloc_upper_bound,
4416     _bfd_xcoff_canonicalize_dynamic_reloc,
4417
4418     /* Opposite endian version, none exists */
4419     NULL,
4420
4421     (void *) &bfd_pmac_xcoff_backend_data,
4422   };