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