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