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