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