1 /* BFD back-end for IBM RS/6000 "XCOFF" files.
2    Copyright 1990-1999, 2000, 2001, 2002, 2003
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 *, ufile_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
_bfd_xcoff_mkobject(abfd)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
_bfd_xcoff_copy_private_bfd_data(ibfd,obfd)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
_bfd_xcoff_is_local_label_name(abfd,name)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
_bfd_xcoff_swap_sym_in(abfd,ext1,in1)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
_bfd_xcoff_swap_sym_out(abfd,inp,extp)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
_bfd_xcoff_swap_aux_in(abfd,ext1,type,class,indx,numaux,in1)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
_bfd_xcoff_swap_aux_out(abfd,inp,type,class,indx,numaux,extp)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
xcoff_rtype2howto(relent,internal)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 *
_bfd_xcoff_reloc_type_lookup(abfd,code)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
bfd_xcoff_ar_archive_set_magic(abfd,magic)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
_bfd_xcoff_slurp_armap(abfd)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 *
_bfd_xcoff_archive_p(abfd)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   bfd_ardata (abfd)->cache = NULL;
1298   bfd_ardata (abfd)->archive_head = NULL;
1299   bfd_ardata (abfd)->symdefs = NULL;
1300   bfd_ardata (abfd)->extended_names = NULL;
1301 
1302   /* Now handle the two formats.  */
1303   if (magic[1] != 'b')
1304     {
1305       /* This is the old format.  */
1306       struct xcoff_ar_file_hdr hdr;
1307 
1308       /* Copy over the magic string.  */
1309       memcpy (hdr.magic, magic, SXCOFFARMAG);
1310 
1311       /* Now read the rest of the file header.  */
1312       amt = SIZEOF_AR_FILE_HDR - SXCOFFARMAG;
1313       if (bfd_bread ((PTR) &hdr.memoff, amt, abfd) != amt)
1314 	{
1315 	  if (bfd_get_error () != bfd_error_system_call)
1316 	    bfd_set_error (bfd_error_wrong_format);
1317 	  goto error_ret;
1318 	}
1319 
1320       bfd_ardata (abfd)->first_file_filepos = strtol (hdr.firstmemoff,
1321 						      (char **) NULL, 10);
1322 
1323       amt = SIZEOF_AR_FILE_HDR;
1324       bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
1325       if (bfd_ardata (abfd)->tdata == NULL)
1326 	goto error_ret;
1327 
1328       memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR);
1329     }
1330   else
1331     {
1332       /* This is the new format.  */
1333       struct xcoff_ar_file_hdr_big hdr;
1334 
1335       /* Copy over the magic string.  */
1336       memcpy (hdr.magic, magic, SXCOFFARMAG);
1337 
1338       /* Now read the rest of the file header.  */
1339       amt = SIZEOF_AR_FILE_HDR_BIG - SXCOFFARMAG;
1340       if (bfd_bread ((PTR) &hdr.memoff, amt, abfd) != amt)
1341 	{
1342 	  if (bfd_get_error () != bfd_error_system_call)
1343 	    bfd_set_error (bfd_error_wrong_format);
1344 	  goto error_ret;
1345 	}
1346 
1347       bfd_ardata (abfd)->first_file_filepos = bfd_scan_vma (hdr.firstmemoff,
1348 							    (const char **) 0,
1349 							    10);
1350 
1351       amt = SIZEOF_AR_FILE_HDR_BIG;
1352       bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
1353       if (bfd_ardata (abfd)->tdata == NULL)
1354 	goto error_ret;
1355 
1356       memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR_BIG);
1357     }
1358 
1359   if (! _bfd_xcoff_slurp_armap (abfd))
1360     {
1361     error_ret:
1362       bfd_release (abfd, bfd_ardata (abfd));
1363     error_ret_restore:
1364       bfd_ardata (abfd) = tdata_hold;
1365       return NULL;
1366     }
1367 
1368   return abfd->xvec;
1369 }
1370 
1371 /* Read the archive header in an XCOFF archive.  */
1372 
1373 PTR
_bfd_xcoff_read_ar_hdr(abfd)1374 _bfd_xcoff_read_ar_hdr (abfd)
1375      bfd *abfd;
1376 {
1377   bfd_size_type namlen;
1378   struct areltdata *ret;
1379   bfd_size_type amt = sizeof (struct areltdata);
1380 
1381   ret = (struct areltdata *) bfd_alloc (abfd, amt);
1382   if (ret == NULL)
1383     return NULL;
1384 
1385   if (! xcoff_big_format_p (abfd))
1386     {
1387       struct xcoff_ar_hdr hdr;
1388       struct xcoff_ar_hdr *hdrp;
1389 
1390       if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
1391 	  != SIZEOF_AR_HDR)
1392 	{
1393 	  free (ret);
1394 	  return NULL;
1395 	}
1396 
1397       namlen = strtol (hdr.namlen, (char **) NULL, 10);
1398       amt = SIZEOF_AR_HDR + namlen + 1;
1399       hdrp = (struct xcoff_ar_hdr *) bfd_alloc (abfd, amt);
1400       if (hdrp == NULL)
1401 	{
1402 	  free (ret);
1403 	  return NULL;
1404 	}
1405       memcpy (hdrp, &hdr, SIZEOF_AR_HDR);
1406       if (bfd_bread ((char *) hdrp + SIZEOF_AR_HDR, namlen, abfd) != namlen)
1407 	{
1408 	  free (ret);
1409 	  return NULL;
1410 	}
1411       ((char *) hdrp)[SIZEOF_AR_HDR + namlen] = '\0';
1412 
1413       ret->arch_header = (char *) hdrp;
1414       ret->parsed_size = strtol (hdr.size, (char **) NULL, 10);
1415       ret->filename = (char *) hdrp + SIZEOF_AR_HDR;
1416     }
1417   else
1418     {
1419       struct xcoff_ar_hdr_big hdr;
1420       struct xcoff_ar_hdr_big *hdrp;
1421 
1422       if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
1423 	  != SIZEOF_AR_HDR_BIG)
1424 	{
1425 	  free (ret);
1426 	  return NULL;
1427 	}
1428 
1429       namlen = strtol (hdr.namlen, (char **) NULL, 10);
1430       amt = SIZEOF_AR_HDR_BIG + namlen + 1;
1431       hdrp = (struct xcoff_ar_hdr_big *) bfd_alloc (abfd, amt);
1432       if (hdrp == NULL)
1433 	{
1434 	  free (ret);
1435 	  return NULL;
1436 	}
1437       memcpy (hdrp, &hdr, SIZEOF_AR_HDR_BIG);
1438       if (bfd_bread ((char *) hdrp + SIZEOF_AR_HDR_BIG, namlen, abfd) != namlen)
1439 	{
1440 	  free (ret);
1441 	  return NULL;
1442 	}
1443       ((char *) hdrp)[SIZEOF_AR_HDR_BIG + namlen] = '\0';
1444 
1445       ret->arch_header = (char *) hdrp;
1446       /* XXX This actually has to be a call to strtoll (at least on 32-bit
1447 	 machines) since the field width is 20 and there numbers with more
1448 	 than 32 bits can be represented.  */
1449       ret->parsed_size = strtol (hdr.size, (char **) NULL, 10);
1450       ret->filename = (char *) hdrp + SIZEOF_AR_HDR_BIG;
1451     }
1452 
1453   /* Skip over the XCOFFARFMAG at the end of the file name.  */
1454   if (bfd_seek (abfd, (file_ptr) ((namlen & 1) + SXCOFFARFMAG), SEEK_CUR) != 0)
1455     return NULL;
1456 
1457   return (PTR) ret;
1458 }
1459 
1460 /* Open the next element in an XCOFF archive.  */
1461 
1462 bfd *
_bfd_xcoff_openr_next_archived_file(archive,last_file)1463 _bfd_xcoff_openr_next_archived_file (archive, last_file)
1464      bfd *archive;
1465      bfd *last_file;
1466 {
1467   file_ptr filestart;
1468 
1469   if (xcoff_ardata (archive) == NULL)
1470     {
1471       bfd_set_error (bfd_error_invalid_operation);
1472       return NULL;
1473     }
1474 
1475   if (! xcoff_big_format_p (archive))
1476     {
1477       if (last_file == NULL)
1478 	filestart = bfd_ardata (archive)->first_file_filepos;
1479       else
1480 	filestart = strtol (arch_xhdr (last_file)->nextoff, (char **) NULL,
1481 			    10);
1482 
1483       if (filestart == 0
1484 	  || filestart == strtol (xcoff_ardata (archive)->memoff,
1485 				  (char **) NULL, 10)
1486 	  || filestart == strtol (xcoff_ardata (archive)->symoff,
1487 				  (char **) NULL, 10))
1488 	{
1489 	  bfd_set_error (bfd_error_no_more_archived_files);
1490 	  return NULL;
1491 	}
1492     }
1493   else
1494     {
1495       if (last_file == NULL)
1496 	filestart = bfd_ardata (archive)->first_file_filepos;
1497       else
1498 	/* XXX These actually have to be a calls to strtoll (at least
1499 	   on 32-bit machines) since the fields's width is 20 and
1500 	   there numbers with more than 32 bits can be represented.  */
1501 	filestart = strtol (arch_xhdr_big (last_file)->nextoff, (char **) NULL,
1502 			    10);
1503 
1504       /* XXX These actually have to be calls to strtoll (at least on 32-bit
1505 	 machines) since the fields's width is 20 and there numbers with more
1506 	 than 32 bits can be represented.  */
1507       if (filestart == 0
1508 	  || filestart == strtol (xcoff_ardata_big (archive)->memoff,
1509 				  (char **) NULL, 10)
1510 	  || filestart == strtol (xcoff_ardata_big (archive)->symoff,
1511 				  (char **) NULL, 10))
1512 	{
1513 	  bfd_set_error (bfd_error_no_more_archived_files);
1514 	  return NULL;
1515 	}
1516     }
1517 
1518   return _bfd_get_elt_at_filepos (archive, filestart);
1519 }
1520 
1521 /* Stat an element in an XCOFF archive.  */
1522 
1523 int
_bfd_xcoff_stat_arch_elt(abfd,s)1524 _bfd_xcoff_stat_arch_elt (abfd, s)
1525      bfd *abfd;
1526      struct stat *s;
1527 {
1528   if (abfd->arelt_data == NULL)
1529     {
1530       bfd_set_error (bfd_error_invalid_operation);
1531       return -1;
1532     }
1533 
1534   if (! xcoff_big_format_p (abfd->my_archive))
1535     {
1536       struct xcoff_ar_hdr *hdrp = arch_xhdr (abfd);
1537 
1538       s->st_mtime = strtol (hdrp->date, (char **) NULL, 10);
1539       s->st_uid = strtol (hdrp->uid, (char **) NULL, 10);
1540       s->st_gid = strtol (hdrp->gid, (char **) NULL, 10);
1541       s->st_mode = strtol (hdrp->mode, (char **) NULL, 8);
1542       s->st_size = arch_eltdata (abfd)->parsed_size;
1543     }
1544   else
1545     {
1546       struct xcoff_ar_hdr_big *hdrp = arch_xhdr_big (abfd);
1547 
1548       s->st_mtime = strtol (hdrp->date, (char **) NULL, 10);
1549       s->st_uid = strtol (hdrp->uid, (char **) NULL, 10);
1550       s->st_gid = strtol (hdrp->gid, (char **) NULL, 10);
1551       s->st_mode = strtol (hdrp->mode, (char **) NULL, 8);
1552       s->st_size = arch_eltdata (abfd)->parsed_size;
1553     }
1554 
1555   return 0;
1556 }
1557 
1558 /* Normalize a file name for inclusion in an archive.  */
1559 
1560 static const char *
normalize_filename(abfd)1561 normalize_filename (abfd)
1562      bfd *abfd;
1563 {
1564   const char *file;
1565   const char *filename;
1566 
1567   file = bfd_get_filename (abfd);
1568   filename = strrchr (file, '/');
1569   if (filename != NULL)
1570     filename++;
1571   else
1572     filename = file;
1573   return filename;
1574 }
1575 
1576 /* Write out an XCOFF armap.  */
1577 
1578 static bfd_boolean
xcoff_write_armap_old(abfd,elength,map,orl_count,stridx)1579 xcoff_write_armap_old (abfd, elength, map, orl_count, stridx)
1580      bfd *abfd;
1581      unsigned int elength ATTRIBUTE_UNUSED;
1582      struct orl *map;
1583      unsigned int orl_count;
1584      int stridx;
1585 {
1586   struct xcoff_ar_hdr hdr;
1587   char *p;
1588   unsigned char buf[4];
1589   bfd *sub;
1590   file_ptr fileoff;
1591   unsigned int i;
1592 
1593   memset (&hdr, 0, sizeof hdr);
1594   sprintf (hdr.size, "%ld", (long) (4 + orl_count * 4 + stridx));
1595   sprintf (hdr.nextoff, "%d", 0);
1596   memcpy (hdr.prevoff, xcoff_ardata (abfd)->memoff, XCOFFARMAG_ELEMENT_SIZE);
1597   sprintf (hdr.date, "%d", 0);
1598   sprintf (hdr.uid, "%d", 0);
1599   sprintf (hdr.gid, "%d", 0);
1600   sprintf (hdr.mode, "%d", 0);
1601   sprintf (hdr.namlen, "%d", 0);
1602 
1603   /* We need spaces, not null bytes, in the header.  */
1604   for (p = (char *) &hdr; p < (char *) &hdr + SIZEOF_AR_HDR; p++)
1605     if (*p == '\0')
1606       *p = ' ';
1607 
1608   if (bfd_bwrite ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
1609       != SIZEOF_AR_HDR
1610       || (bfd_bwrite (XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG, abfd)
1611 	  != SXCOFFARFMAG))
1612     return FALSE;
1613 
1614   H_PUT_32 (abfd, orl_count, buf);
1615   if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
1616     return FALSE;
1617 
1618   sub = abfd->archive_head;
1619   fileoff = SIZEOF_AR_FILE_HDR;
1620   i = 0;
1621   while (sub != NULL && i < orl_count)
1622     {
1623       size_t namlen;
1624 
1625       while (map[i].u.abfd == sub)
1626 	{
1627 	  H_PUT_32 (abfd, fileoff, buf);
1628 	  if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
1629 	    return FALSE;
1630 	  ++i;
1631 	}
1632       namlen = strlen (normalize_filename (sub));
1633       namlen = (namlen + 1) &~ (size_t) 1;
1634       fileoff += (SIZEOF_AR_HDR
1635 		  + namlen
1636 		  + SXCOFFARFMAG
1637 		  + arelt_size (sub));
1638       fileoff = (fileoff + 1) &~ 1;
1639       sub = sub->next;
1640     }
1641 
1642   for (i = 0; i < orl_count; i++)
1643     {
1644       const char *name;
1645       size_t namlen;
1646 
1647       name = *map[i].name;
1648       namlen = strlen (name);
1649       if (bfd_bwrite (name, (bfd_size_type) (namlen + 1), abfd) != namlen + 1)
1650 	return FALSE;
1651     }
1652 
1653   if ((stridx & 1) != 0)
1654     {
1655       char b;
1656 
1657       b = '\0';
1658       if (bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
1659 	return FALSE;
1660     }
1661 
1662   return TRUE;
1663 }
1664 
1665 static char buff20[XCOFFARMAGBIG_ELEMENT_SIZE + 1];
1666 #define FMT20  "%-20lld"
1667 #define FMT12  "%-12d"
1668 #define FMT12_OCTAL  "%-12o"
1669 #define FMT4  "%-4d"
1670 #define PRINT20(d, v) \
1671   sprintf (buff20, FMT20, (long long)(v)), \
1672   memcpy ((void *) (d), buff20, 20)
1673 
1674 #define PRINT12(d, v) \
1675   sprintf (buff20, FMT12, (int)(v)), \
1676   memcpy ((void *) (d), buff20, 12)
1677 
1678 #define PRINT12_OCTAL(d, v) \
1679   sprintf (buff20, FMT12_OCTAL, (unsigned int)(v)), \
1680   memcpy ((void *) (d), buff20, 12)
1681 
1682 #define PRINT4(d, v) \
1683   sprintf (buff20, FMT4, (int)(v)), \
1684   memcpy ((void *) (d), buff20, 4)
1685 
1686 #define READ20(d, v) \
1687   buff20[20] = 0, \
1688   memcpy (buff20, (d), 20), \
1689   (v) = bfd_scan_vma (buff20, (const char **) NULL, 10)
1690 
1691 static bfd_boolean
do_pad(abfd,number)1692 do_pad (abfd, number)
1693      bfd *abfd;
1694      unsigned int number;
1695 {
1696   bfd_byte b = 0;
1697 
1698   /* Limit pad to <= 4096.  */
1699   if (number > 4096)
1700     return FALSE;
1701 
1702   while (number--)
1703     if (bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
1704       return FALSE;
1705 
1706   return TRUE;
1707 }
1708 
1709 static bfd_boolean
do_copy(out_bfd,in_bfd)1710 do_copy (out_bfd, in_bfd)
1711      bfd *out_bfd;
1712      bfd *in_bfd;
1713 {
1714   bfd_size_type remaining;
1715   bfd_byte buffer[DEFAULT_BUFFERSIZE];
1716 
1717   if (bfd_seek (in_bfd, (file_ptr) 0, SEEK_SET) != 0)
1718     return FALSE;
1719 
1720   remaining = arelt_size (in_bfd);
1721 
1722   while (remaining >= DEFAULT_BUFFERSIZE)
1723     {
1724       if (bfd_bread (buffer, DEFAULT_BUFFERSIZE, in_bfd) != DEFAULT_BUFFERSIZE
1725 	  || bfd_bwrite (buffer, DEFAULT_BUFFERSIZE, out_bfd) != DEFAULT_BUFFERSIZE)
1726 	return FALSE;
1727 
1728       remaining -= DEFAULT_BUFFERSIZE;
1729     }
1730 
1731   if (remaining)
1732     {
1733       if (bfd_bread (buffer, remaining, in_bfd) != remaining
1734 	  || bfd_bwrite (buffer, remaining, out_bfd) != remaining)
1735 	return FALSE;
1736     }
1737 
1738   return TRUE;
1739 }
1740 
1741 static bfd_boolean
do_shared_object_padding(out_bfd,in_bfd,offset,ar_header_size)1742 do_shared_object_padding (out_bfd, in_bfd, offset, ar_header_size)
1743      bfd *out_bfd;
1744      bfd *in_bfd;
1745      ufile_ptr *offset;
1746      int ar_header_size;
1747 {
1748   if (bfd_check_format (in_bfd, bfd_object)
1749       && bfd_get_flavour (in_bfd) == bfd_target_xcoff_flavour
1750       && (in_bfd->flags & DYNAMIC) != 0)
1751     {
1752       bfd_size_type pad = 0;
1753       int text_align_power;
1754 
1755       text_align_power = bfd_xcoff_text_align_power (in_bfd);
1756 
1757       pad = 1 << text_align_power;
1758       pad -= (*offset + ar_header_size) & (pad - 1);
1759 
1760       if (! do_pad (out_bfd, pad))
1761 	return FALSE;
1762 
1763       *offset += pad;
1764     }
1765 
1766   return TRUE;
1767 }
1768 
1769 static bfd_boolean
xcoff_write_armap_big(abfd,elength,map,orl_count,stridx)1770 xcoff_write_armap_big (abfd, elength, map, orl_count, stridx)
1771      bfd *abfd;
1772      unsigned int elength ATTRIBUTE_UNUSED;
1773      struct orl *map;
1774      unsigned int orl_count;
1775      int stridx;
1776 {
1777   struct xcoff_ar_file_hdr_big *fhdr;
1778   bfd_vma i, sym_32, sym_64, str_32, str_64;
1779   const bfd_arch_info_type *arch_info = NULL;
1780   bfd *current_bfd;
1781   size_t string_length;
1782   ufile_ptr nextoff, prevoff;
1783 
1784   /* First, we look through the symbols and work out which are
1785      from 32-bit objects and which from 64-bit ones.  */
1786   sym_32 = sym_64 = str_32 = str_64 = 0;
1787 
1788   current_bfd = abfd->archive_head;
1789   if (current_bfd != NULL)
1790     arch_info = bfd_get_arch_info (current_bfd);
1791     i = 0;
1792     while (current_bfd != NULL && i < orl_count)
1793     {
1794       while (map[i].u.abfd == current_bfd)
1795 	{
1796 	  string_length = strlen (*map[i].name) + 1;
1797 
1798 	  if (arch_info->bits_per_address == 64)
1799 	    {
1800 	      sym_64++;
1801 	      str_64 += string_length;
1802 	    }
1803 	  else
1804 	    {
1805 	      sym_32++;
1806 	      str_32 += string_length;
1807 	    }
1808 	  i++;
1809 	}
1810       current_bfd = current_bfd->next;
1811       if (current_bfd != NULL)
1812 	arch_info = bfd_get_arch_info (current_bfd);
1813     }
1814 
1815   /* A quick sanity check... */
1816   BFD_ASSERT (sym_64 + sym_32 == orl_count);
1817   /* Explicit cast to int for compiler.  */
1818   BFD_ASSERT ((int)(str_64 + str_32) == stridx);
1819 
1820   fhdr = xcoff_ardata_big (abfd);
1821 
1822   /* xcoff_write_archive_contents_big passes nextoff in symoff. */
1823   READ20 (fhdr->memoff, prevoff);
1824   READ20 (fhdr->symoff, nextoff);
1825 
1826   BFD_ASSERT (nextoff == bfd_tell (abfd));
1827 
1828   /* Write out the symbol table.
1829      Layout :
1830 
1831      standard big archive header
1832      0x0000		      ar_size	[0x14]
1833      0x0014		      ar_nxtmem [0x14]
1834      0x0028		      ar_prvmem [0x14]
1835      0x003C		      ar_date	[0x0C]
1836      0x0048		      ar_uid	[0x0C]
1837      0x0054		      ar_gid	[0x0C]
1838      0x0060		      ar_mod	[0x0C]
1839      0x006C		      ar_namelen[0x04]
1840      0x0070		      ar_fmag	[SXCOFFARFMAG]
1841 
1842      Symbol table
1843      0x0072		      num_syms	[0x08], binary
1844      0x0078		      offsets	[0x08 * num_syms], binary
1845      0x0086 + 0x08 * num_syms names	[??]
1846      ??			      pad to even bytes.
1847   */
1848 
1849   if (sym_32)
1850     {
1851       struct xcoff_ar_hdr_big *hdr;
1852       bfd_byte *symbol_table;
1853       bfd_byte *st;
1854       file_ptr fileoff;
1855 
1856       bfd_vma symbol_table_size =
1857 	SIZEOF_AR_HDR_BIG
1858 	+ SXCOFFARFMAG
1859 	+ 8
1860 	+ 8 * sym_32
1861 	+ str_32 + (str_32 & 1);
1862 
1863       symbol_table = NULL;
1864       symbol_table = (bfd_byte *) bfd_zmalloc (symbol_table_size);
1865       if (symbol_table == NULL)
1866 	return FALSE;
1867 
1868       hdr = (struct xcoff_ar_hdr_big *) symbol_table;
1869 
1870       PRINT20 (hdr->size, 8 + 8 * sym_32 + str_32 + (str_32 & 1));
1871 
1872       if (sym_64)
1873 	PRINT20 (hdr->nextoff, nextoff + symbol_table_size);
1874       else
1875 	PRINT20 (hdr->nextoff, 0);
1876 
1877       PRINT20 (hdr->prevoff, prevoff);
1878       PRINT12 (hdr->date, 0);
1879       PRINT12 (hdr->uid, 0);
1880       PRINT12 (hdr->gid, 0);
1881       PRINT12 (hdr->mode, 0);
1882       PRINT4 (hdr->namlen, 0) ;
1883 
1884       st = symbol_table + SIZEOF_AR_HDR_BIG;
1885       memcpy (st, XCOFFARFMAG, SXCOFFARFMAG);
1886       st += SXCOFFARFMAG;
1887 
1888       bfd_h_put_64 (abfd, sym_32, st);
1889       st += 8;
1890 
1891       /* loop over the 32 bit offsets */
1892       current_bfd = abfd->archive_head;
1893       if (current_bfd != NULL)
1894 	arch_info = bfd_get_arch_info (current_bfd);
1895       fileoff = SIZEOF_AR_FILE_HDR_BIG;
1896       i = 0;
1897       while (current_bfd != NULL && i < orl_count)
1898 	{
1899 	  while (map[i].u.abfd == current_bfd)
1900 	    {
1901 	      if (arch_info->bits_per_address == 32)
1902 		{
1903 		  bfd_h_put_64 (abfd, fileoff, st);
1904 		  st += 8;
1905 		}
1906 	      i++;
1907 	    }
1908 	  string_length = strlen (normalize_filename (current_bfd));
1909 	  string_length += string_length & 1;
1910 	  fileoff += (SIZEOF_AR_HDR_BIG
1911 		      + string_length
1912 		      + SXCOFFARFMAG
1913 		      + arelt_size (current_bfd));
1914 	  fileoff += fileoff & 1;
1915 	  current_bfd = current_bfd->next;
1916 	  if (current_bfd != NULL)
1917 	    arch_info = bfd_get_arch_info (current_bfd);
1918 	}
1919 
1920       /* loop over the 32 bit symbol names */
1921       current_bfd = abfd->archive_head;
1922       if (current_bfd != NULL)
1923 	arch_info = bfd_get_arch_info (current_bfd);
1924       i = 0;
1925       while (current_bfd != NULL && i < orl_count)
1926 	{
1927 	  while (map[i].u.abfd == current_bfd)
1928 	    {
1929 	      if (arch_info->bits_per_address == 32)
1930 		{
1931 		  string_length = sprintf (st, "%s", *map[i].name);
1932 		  st += string_length + 1;
1933 		}
1934 	      i++;
1935 	    }
1936 	  current_bfd = current_bfd->next;
1937 	  if (current_bfd != NULL)
1938 	    arch_info = bfd_get_arch_info (current_bfd);
1939 	}
1940 
1941       bfd_bwrite (symbol_table, symbol_table_size, abfd);
1942 
1943       free (symbol_table);
1944       symbol_table = NULL;
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       bfd_byte *symbol_table;
1956       bfd_byte *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 = NULL;
1967       symbol_table = (bfd_byte *) bfd_zmalloc (symbol_table_size);
1968       if (symbol_table == NULL)
1969 	return FALSE;
1970 
1971       hdr = (struct xcoff_ar_hdr_big *) symbol_table;
1972 
1973       PRINT20 (hdr->size, 8 + 8 * sym_64 + str_64 + (str_64 & 1));
1974       PRINT20 (hdr->nextoff, 0);
1975       PRINT20 (hdr->prevoff, prevoff);
1976       PRINT12 (hdr->date, 0);
1977       PRINT12 (hdr->uid, 0);
1978       PRINT12 (hdr->gid, 0);
1979       PRINT12 (hdr->mode, 0);
1980       PRINT4 (hdr->namlen, 0);
1981 
1982       st = symbol_table + SIZEOF_AR_HDR_BIG;
1983       memcpy (st, XCOFFARFMAG, SXCOFFARFMAG);
1984       st += SXCOFFARFMAG;
1985 
1986       bfd_h_put_64 (abfd, sym_64, st);
1987       st += 8;
1988 
1989       /* loop over the 64 bit offsets */
1990       current_bfd = abfd->archive_head;
1991       if (current_bfd != NULL)
1992 	arch_info = bfd_get_arch_info (current_bfd);
1993       fileoff = SIZEOF_AR_FILE_HDR_BIG;
1994       i = 0;
1995       while (current_bfd != NULL && i < orl_count)
1996 	{
1997 	  while (map[i].u.abfd == current_bfd)
1998 	    {
1999 	      if (arch_info->bits_per_address == 64)
2000 		{
2001 		  bfd_h_put_64 (abfd, fileoff, st);
2002 		  st += 8;
2003 		}
2004 	      i++;
2005 	    }
2006 	  string_length = strlen (normalize_filename (current_bfd));
2007 	  string_length += string_length & 1;
2008 	  fileoff += (SIZEOF_AR_HDR_BIG
2009 		      + string_length
2010 		      + SXCOFFARFMAG
2011 		      + arelt_size (current_bfd));
2012 	  fileoff += fileoff & 1;
2013 	  current_bfd = current_bfd->next;
2014 	  if (current_bfd != NULL)
2015 	    arch_info = bfd_get_arch_info (current_bfd);
2016 	}
2017 
2018       /* loop over the 64 bit symbol names */
2019       current_bfd = abfd->archive_head;
2020       if (current_bfd != NULL)
2021 	arch_info = bfd_get_arch_info (current_bfd);
2022       i = 0;
2023       while (current_bfd != NULL && i < orl_count)
2024 	{
2025 	  while (map[i].u.abfd == current_bfd)
2026 	    {
2027 	      if (arch_info->bits_per_address == 64)
2028 		{
2029 		  string_length = sprintf (st, "%s", *map[i].name);
2030 		  st += string_length + 1;
2031 		}
2032 	      i++;
2033 	    }
2034 	  current_bfd = current_bfd->next;
2035 	  if (current_bfd != NULL)
2036 	    arch_info = bfd_get_arch_info (current_bfd);
2037 	}
2038 
2039       bfd_bwrite (symbol_table, symbol_table_size, abfd);
2040 
2041       free (symbol_table);
2042       symbol_table = NULL;
2043 
2044       PRINT20 (fhdr->symoff64, nextoff);
2045     }
2046   else
2047     PRINT20 (fhdr->symoff64, 0);
2048 
2049   return TRUE;
2050 }
2051 
2052 bfd_boolean
_bfd_xcoff_write_armap(abfd,elength,map,orl_count,stridx)2053 _bfd_xcoff_write_armap (abfd, elength, map, orl_count, stridx)
2054      bfd *abfd;
2055      unsigned int elength ATTRIBUTE_UNUSED;
2056      struct orl *map;
2057      unsigned int orl_count;
2058      int stridx;
2059 {
2060   if (! xcoff_big_format_p (abfd))
2061     return xcoff_write_armap_old (abfd, elength, map, orl_count, stridx);
2062   else
2063     return xcoff_write_armap_big (abfd, elength, map, orl_count, stridx);
2064 }
2065 
2066 /* Write out an XCOFF archive.  We always write an entire archive,
2067    rather than fussing with the freelist and so forth.  */
2068 
2069 static bfd_boolean
xcoff_write_archive_contents_old(abfd)2070 xcoff_write_archive_contents_old (abfd)
2071      bfd *abfd;
2072 {
2073   struct xcoff_ar_file_hdr fhdr;
2074   bfd_size_type count;
2075   bfd_size_type total_namlen;
2076   file_ptr *offsets;
2077   bfd_boolean makemap;
2078   bfd_boolean hasobjects;
2079   ufile_ptr prevoff, nextoff;
2080   bfd *sub;
2081   size_t i;
2082   struct xcoff_ar_hdr ahdr;
2083   bfd_size_type size;
2084   char *p;
2085   char decbuf[XCOFFARMAG_ELEMENT_SIZE + 1];
2086 
2087   memset (&fhdr, 0, sizeof fhdr);
2088   strncpy (fhdr.magic, XCOFFARMAG, SXCOFFARMAG);
2089   sprintf (fhdr.firstmemoff, "%d", SIZEOF_AR_FILE_HDR);
2090   sprintf (fhdr.freeoff, "%d", 0);
2091 
2092   count = 0;
2093   total_namlen = 0;
2094   for (sub = abfd->archive_head; sub != NULL; sub = sub->next)
2095     {
2096       ++count;
2097       total_namlen += strlen (normalize_filename (sub)) + 1;
2098     }
2099   offsets = (file_ptr *) bfd_alloc (abfd, count * sizeof (file_ptr));
2100   if (offsets == NULL)
2101     return FALSE;
2102 
2103   if (bfd_seek (abfd, (file_ptr) SIZEOF_AR_FILE_HDR, SEEK_SET) != 0)
2104     return FALSE;
2105 
2106   makemap = bfd_has_map (abfd);
2107   hasobjects = FALSE;
2108   prevoff = 0;
2109   nextoff = SIZEOF_AR_FILE_HDR;
2110   for (sub = abfd->archive_head, i = 0; sub != NULL; sub = sub->next, i++)
2111     {
2112       const char *name;
2113       bfd_size_type namlen;
2114       struct xcoff_ar_hdr *ahdrp;
2115       bfd_size_type remaining;
2116 
2117       if (makemap && ! hasobjects)
2118 	{
2119 	  if (bfd_check_format (sub, bfd_object))
2120 	    hasobjects = TRUE;
2121 	}
2122 
2123       name = normalize_filename (sub);
2124       namlen = strlen (name);
2125 
2126       if (sub->arelt_data != NULL)
2127 	ahdrp = arch_xhdr (sub);
2128       else
2129 	ahdrp = NULL;
2130 
2131       if (ahdrp == NULL)
2132 	{
2133 	  struct stat s;
2134 
2135 	  memset (&ahdr, 0, sizeof ahdr);
2136 	  ahdrp = &ahdr;
2137 	  if (stat (bfd_get_filename (sub), &s) != 0)
2138 	    {
2139 	      bfd_set_error (bfd_error_system_call);
2140 	      return FALSE;
2141 	    }
2142 
2143 	  sprintf (ahdrp->size, "%ld", (long) s.st_size);
2144 	  sprintf (ahdrp->date, "%ld", (long) s.st_mtime);
2145 	  sprintf (ahdrp->uid, "%ld", (long) s.st_uid);
2146 	  sprintf (ahdrp->gid, "%ld", (long) s.st_gid);
2147 	  sprintf (ahdrp->mode, "%o", (unsigned int) s.st_mode);
2148 
2149 	  if (sub->arelt_data == NULL)
2150 	    {
2151 	      size = sizeof (struct areltdata);
2152 	      sub->arelt_data = bfd_alloc (sub, size);
2153 	      if (sub->arelt_data == NULL)
2154 		return FALSE;
2155 	    }
2156 
2157 	  arch_eltdata (sub)->parsed_size = s.st_size;
2158 	}
2159 
2160       sprintf (ahdrp->prevoff, "%ld", (long) prevoff);
2161       sprintf (ahdrp->namlen, "%ld", (long) namlen);
2162 
2163       /* If the length of the name is odd, we write out the null byte
2164 	 after the name as well.  */
2165       namlen = (namlen + 1) &~ (bfd_size_type) 1;
2166 
2167       remaining = arelt_size (sub);
2168       size = (SIZEOF_AR_HDR
2169 	      + namlen
2170 	      + SXCOFFARFMAG
2171 	      + remaining);
2172 
2173       BFD_ASSERT (nextoff == bfd_tell (abfd));
2174 
2175       offsets[i] = nextoff;
2176 
2177       prevoff = nextoff;
2178       nextoff += size + (size & 1);
2179 
2180       sprintf (ahdrp->nextoff, "%ld", (long) nextoff);
2181 
2182       /* We need spaces, not null bytes, in the header.  */
2183       for (p = (char *) ahdrp; p < (char *) ahdrp + SIZEOF_AR_HDR; p++)
2184 	if (*p == '\0')
2185 	  *p = ' ';
2186 
2187       if ((bfd_bwrite ((PTR) ahdrp, (bfd_size_type) SIZEOF_AR_HDR, abfd)
2188 	   != SIZEOF_AR_HDR)
2189 	  || bfd_bwrite ((PTR) name, namlen, abfd) != namlen
2190 	  || bfd_bwrite ((PTR) XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG,
2191 			 abfd) != SXCOFFARFMAG)
2192 	return FALSE;
2193 
2194       if (bfd_seek (sub, (file_ptr) 0, SEEK_SET) != 0)
2195 	return FALSE;
2196 
2197       if (! do_copy (abfd, sub))
2198 	return FALSE;
2199 
2200       if (! do_pad (abfd, size & 1))
2201 	return FALSE;
2202     }
2203 
2204   sprintf (fhdr.lastmemoff, "%ld", (long) prevoff);
2205 
2206   /* Write out the member table.  */
2207 
2208   BFD_ASSERT (nextoff == bfd_tell (abfd));
2209   sprintf (fhdr.memoff, "%ld", (long) nextoff);
2210 
2211   memset (&ahdr, 0, sizeof ahdr);
2212   sprintf (ahdr.size, "%ld", (long) (XCOFFARMAG_ELEMENT_SIZE
2213 				     + count * XCOFFARMAG_ELEMENT_SIZE
2214 				     + total_namlen));
2215   sprintf (ahdr.prevoff, "%ld", (long) prevoff);
2216   sprintf (ahdr.date, "%d", 0);
2217   sprintf (ahdr.uid, "%d", 0);
2218   sprintf (ahdr.gid, "%d", 0);
2219   sprintf (ahdr.mode, "%d", 0);
2220   sprintf (ahdr.namlen, "%d", 0);
2221 
2222   size = (SIZEOF_AR_HDR
2223 	  + XCOFFARMAG_ELEMENT_SIZE
2224 	  + count * XCOFFARMAG_ELEMENT_SIZE
2225 	  + total_namlen
2226 	  + SXCOFFARFMAG);
2227 
2228   prevoff = nextoff;
2229   nextoff += size + (size & 1);
2230 
2231   if (makemap && hasobjects)
2232     sprintf (ahdr.nextoff, "%ld", (long) nextoff);
2233   else
2234     sprintf (ahdr.nextoff, "%d", 0);
2235 
2236   /* We need spaces, not null bytes, in the header.  */
2237   for (p = (char *) &ahdr; p < (char *) &ahdr + SIZEOF_AR_HDR; p++)
2238     if (*p == '\0')
2239       *p = ' ';
2240 
2241   if ((bfd_bwrite ((PTR) &ahdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
2242        != SIZEOF_AR_HDR)
2243       || (bfd_bwrite ((PTR) XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG, abfd)
2244 	  != SXCOFFARFMAG))
2245     return FALSE;
2246 
2247   sprintf (decbuf, "%-12ld", (long) count);
2248   if (bfd_bwrite ((PTR) decbuf, (bfd_size_type) XCOFFARMAG_ELEMENT_SIZE, abfd)
2249       != XCOFFARMAG_ELEMENT_SIZE)
2250     return FALSE;
2251   for (i = 0; i < (size_t) count; i++)
2252     {
2253       sprintf (decbuf, "%-12ld", (long) offsets[i]);
2254       if (bfd_bwrite ((PTR) decbuf, (bfd_size_type) XCOFFARMAG_ELEMENT_SIZE,
2255 		      abfd) != XCOFFARMAG_ELEMENT_SIZE)
2256 	return FALSE;
2257     }
2258   for (sub = abfd->archive_head; sub != NULL; sub = sub->next)
2259     {
2260       const char *name;
2261       bfd_size_type namlen;
2262 
2263       name = normalize_filename (sub);
2264       namlen = strlen (name);
2265       if (bfd_bwrite ((PTR) name, namlen + 1, abfd) != namlen + 1)
2266 	return FALSE;
2267     }
2268 
2269   if (! do_pad (abfd, size & 1))
2270     return FALSE;
2271 
2272   /* Write out the armap, if appropriate.  */
2273   if (! makemap || ! hasobjects)
2274     sprintf (fhdr.symoff, "%d", 0);
2275   else
2276     {
2277       BFD_ASSERT (nextoff == bfd_tell (abfd));
2278       sprintf (fhdr.symoff, "%ld", (long) nextoff);
2279       bfd_ardata (abfd)->tdata = (PTR) &fhdr;
2280       if (! _bfd_compute_and_write_armap (abfd, 0))
2281 	return FALSE;
2282     }
2283 
2284   /* Write out the archive file header.  */
2285 
2286   /* We need spaces, not null bytes, in the header.  */
2287   for (p = (char *) &fhdr; p < (char *) &fhdr + SIZEOF_AR_FILE_HDR; p++)
2288     if (*p == '\0')
2289       *p = ' ';
2290 
2291   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
2292       || (bfd_bwrite ((PTR) &fhdr, (bfd_size_type) SIZEOF_AR_FILE_HDR, abfd)
2293 	  != SIZEOF_AR_FILE_HDR))
2294     return FALSE;
2295 
2296   return TRUE;
2297 }
2298 
2299 static bfd_boolean
xcoff_write_archive_contents_big(abfd)2300 xcoff_write_archive_contents_big (abfd)
2301      bfd *abfd;
2302 {
2303   struct xcoff_ar_file_hdr_big fhdr;
2304   bfd_size_type count;
2305   bfd_size_type total_namlen;
2306   file_ptr *offsets;
2307   bfd_boolean makemap;
2308   bfd_boolean hasobjects;
2309   ufile_ptr prevoff, nextoff;
2310   bfd *current_bfd;
2311   size_t i;
2312   struct xcoff_ar_hdr_big *hdr, ahdr;
2313   bfd_size_type size;
2314   bfd_byte *member_table, *mt;
2315   bfd_vma member_table_size;
2316 
2317   memset (&fhdr, 0, SIZEOF_AR_FILE_HDR_BIG);
2318   memcpy (fhdr.magic, XCOFFARMAGBIG, SXCOFFARMAG);
2319 
2320   if (bfd_seek (abfd, (file_ptr) SIZEOF_AR_FILE_HDR_BIG, SEEK_SET) != 0)
2321     return FALSE;
2322 
2323   /* Calculate count and total_namlen.  */
2324   makemap = bfd_has_map (abfd);
2325   hasobjects = FALSE;
2326   for (current_bfd = abfd->archive_head, count = 0, total_namlen = 0;
2327        current_bfd != NULL;
2328        current_bfd = current_bfd->next, count++)
2329     {
2330       total_namlen += strlen (normalize_filename (current_bfd)) + 1;
2331 
2332       if (makemap
2333 	  && ! hasobjects
2334 	  && bfd_check_format (current_bfd, bfd_object))
2335 	hasobjects = TRUE;
2336     }
2337 
2338   offsets = NULL;
2339   if (count)
2340     {
2341       offsets = (file_ptr *) bfd_malloc (count * sizeof (file_ptr));
2342       if (offsets == NULL)
2343 	return FALSE;
2344     }
2345 
2346   prevoff = 0;
2347   nextoff = SIZEOF_AR_FILE_HDR_BIG;
2348   for (current_bfd = abfd->archive_head, i = 0;
2349        current_bfd != NULL;
2350        current_bfd = current_bfd->next, i++)
2351     {
2352       const char *name;
2353       bfd_size_type namlen;
2354       struct xcoff_ar_hdr_big *ahdrp;
2355       bfd_size_type remaining;
2356 
2357       name = normalize_filename (current_bfd);
2358       namlen = strlen (name);
2359 
2360       if (current_bfd->arelt_data != NULL)
2361 	ahdrp = arch_xhdr_big (current_bfd);
2362       else
2363 	ahdrp = NULL;
2364 
2365       if (ahdrp == NULL)
2366 	{
2367 	  struct stat s;
2368 
2369 	  ahdrp = &ahdr;
2370 	  /* XXX This should actually be a call to stat64 (at least on
2371 	     32-bit machines).
2372 	     XXX This call will fail if the original object is not found.  */
2373 	  if (stat (bfd_get_filename (current_bfd), &s) != 0)
2374 	    {
2375 	      bfd_set_error (bfd_error_system_call);
2376 	      return FALSE;
2377 	    }
2378 
2379 	  PRINT20 (ahdrp->size, s.st_size);
2380 	  PRINT12 (ahdrp->date, s.st_mtime);
2381 	  PRINT12 (ahdrp->uid,  s.st_uid);
2382 	  PRINT12 (ahdrp->gid,  s.st_gid);
2383 	  PRINT12_OCTAL (ahdrp->mode, s.st_mode);
2384 
2385 	  if (current_bfd->arelt_data == NULL)
2386 	    {
2387 	      size = sizeof (struct areltdata);
2388 	      current_bfd->arelt_data = bfd_alloc (current_bfd, size);
2389 	      if (current_bfd->arelt_data == NULL)
2390 		return FALSE;
2391 	    }
2392 
2393 	  arch_eltdata (current_bfd)->parsed_size = s.st_size;
2394 	}
2395 
2396       PRINT20 (ahdrp->prevoff, prevoff);
2397       PRINT4 (ahdrp->namlen, namlen);
2398 
2399       /* If the length of the name is odd, we write out the null byte
2400 	 after the name as well.  */
2401       namlen = (namlen + 1) &~ (bfd_size_type) 1;
2402 
2403       remaining = arelt_size (current_bfd);
2404       size = (SIZEOF_AR_HDR_BIG
2405 	      + namlen
2406 	      + SXCOFFARFMAG
2407 	      + remaining);
2408 
2409       BFD_ASSERT (nextoff == bfd_tell (abfd));
2410 
2411       /* Check for xcoff shared objects.
2412 	 Their text section needs to be aligned wrt the archive file position.
2413 	 This requires extra padding before the archive header.  */
2414       if (! do_shared_object_padding (abfd, current_bfd, & nextoff,
2415 				      SIZEOF_AR_HDR_BIG + namlen
2416 				      + SXCOFFARFMAG))
2417 	return FALSE;
2418 
2419       offsets[i] = nextoff;
2420 
2421       prevoff = nextoff;
2422       nextoff += size + (size & 1);
2423 
2424       PRINT20 (ahdrp->nextoff, nextoff);
2425 
2426       if ((bfd_bwrite ((PTR) ahdrp, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
2427 	   != SIZEOF_AR_HDR_BIG)
2428 	  || bfd_bwrite ((PTR) name, (bfd_size_type) namlen, abfd) != namlen
2429 	  || (bfd_bwrite ((PTR) XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG,
2430 			  abfd) != SXCOFFARFMAG))
2431 	return FALSE;
2432 
2433       if (bfd_seek (current_bfd, (file_ptr) 0, SEEK_SET) != 0)
2434 	return FALSE;
2435 
2436       if (! do_copy (abfd, current_bfd))
2437 	return FALSE;
2438 
2439       if (! do_pad (abfd, size & 1))
2440 	return FALSE;
2441     }
2442 
2443   if (count)
2444     {
2445       PRINT20 (fhdr.firstmemoff, offsets[0]);
2446       PRINT20 (fhdr.lastmemoff, prevoff);
2447     }
2448 
2449   /* Write out the member table.
2450      Layout :
2451 
2452      standard big archive header
2453      0x0000		      ar_size	[0x14]
2454      0x0014		      ar_nxtmem [0x14]
2455      0x0028		      ar_prvmem [0x14]
2456      0x003C		      ar_date	[0x0C]
2457      0x0048		      ar_uid	[0x0C]
2458      0x0054		      ar_gid	[0x0C]
2459      0x0060		      ar_mod	[0x0C]
2460      0x006C		      ar_namelen[0x04]
2461      0x0070		      ar_fmag	[0x02]
2462 
2463      Member table
2464      0x0072		      count	[0x14]
2465      0x0086		      offsets	[0x14 * counts]
2466      0x0086 + 0x14 * counts   names	[??]
2467      ??			      pad to even bytes.
2468    */
2469 
2470   BFD_ASSERT (nextoff == bfd_tell (abfd));
2471 
2472   member_table_size = (SIZEOF_AR_HDR_BIG
2473 		       + SXCOFFARFMAG
2474 		       + XCOFFARMAGBIG_ELEMENT_SIZE
2475 		       + count * XCOFFARMAGBIG_ELEMENT_SIZE
2476 		       + total_namlen);
2477 
2478   member_table_size += member_table_size & 1;
2479   member_table = NULL;
2480   member_table = (bfd_byte *) bfd_zmalloc (member_table_size);
2481   if (member_table == NULL)
2482     return FALSE;
2483 
2484   hdr = (struct xcoff_ar_hdr_big *) member_table;
2485 
2486   PRINT20 (hdr->size, (XCOFFARMAGBIG_ELEMENT_SIZE
2487 		       + count * XCOFFARMAGBIG_ELEMENT_SIZE
2488 		       + total_namlen + (total_namlen & 1)));
2489   if (makemap && hasobjects)
2490     PRINT20 (hdr->nextoff, nextoff + member_table_size);
2491   else
2492     PRINT20 (hdr->nextoff, 0);
2493   PRINT20 (hdr->prevoff, prevoff);
2494   PRINT12 (hdr->date, 0);
2495   PRINT12 (hdr->uid, 0);
2496   PRINT12 (hdr->gid, 0);
2497   PRINT12 (hdr->mode, 0);
2498   PRINT4 (hdr->namlen, 0);
2499 
2500   mt = member_table + SIZEOF_AR_HDR_BIG;
2501   memcpy (mt, XCOFFARFMAG, SXCOFFARFMAG);
2502   mt += SXCOFFARFMAG;
2503 
2504   PRINT20 (mt, count);
2505   mt += XCOFFARMAGBIG_ELEMENT_SIZE;
2506   for (i = 0; i < (size_t) count; i++)
2507     {
2508       PRINT20 (mt, offsets[i]);
2509       mt += XCOFFARMAGBIG_ELEMENT_SIZE;
2510     }
2511 
2512   if (count)
2513     {
2514       free (offsets);
2515       offsets = NULL;
2516     }
2517 
2518   for (current_bfd = abfd->archive_head; current_bfd != NULL;
2519        current_bfd = current_bfd->next)
2520     {
2521       const char *name;
2522       size_t namlen;
2523 
2524       name = normalize_filename (current_bfd);
2525       namlen = sprintf (mt, "%s", name);
2526       mt += namlen + 1;
2527     }
2528 
2529   if (bfd_bwrite (member_table, member_table_size, abfd) != member_table_size)
2530     return FALSE;
2531 
2532   free (member_table);
2533   member_table = NULL;
2534 
2535   PRINT20 (fhdr.memoff, nextoff);
2536 
2537   prevoff = nextoff;
2538   nextoff += member_table_size;
2539 
2540   /* Write out the armap, if appropriate.  */
2541 
2542   if (! makemap || ! hasobjects)
2543     PRINT20 (fhdr.symoff, 0);
2544   else
2545     {
2546       BFD_ASSERT (nextoff == bfd_tell (abfd));
2547 
2548       /* Save nextoff in fhdr.symoff so the armap routine can use it.  */
2549       PRINT20 (fhdr.symoff, nextoff);
2550 
2551       bfd_ardata (abfd)->tdata = (PTR) &fhdr;
2552       if (! _bfd_compute_and_write_armap (abfd, 0))
2553 	return FALSE;
2554     }
2555 
2556   /* Write out the archive file header.  */
2557 
2558   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
2559       || (bfd_bwrite ((PTR) &fhdr, (bfd_size_type) SIZEOF_AR_FILE_HDR_BIG,
2560 		      abfd) != SIZEOF_AR_FILE_HDR_BIG))
2561     return FALSE;
2562 
2563   return TRUE;
2564 }
2565 
2566 bfd_boolean
_bfd_xcoff_write_archive_contents(abfd)2567 _bfd_xcoff_write_archive_contents (abfd)
2568      bfd *abfd;
2569 {
2570   if (! xcoff_big_format_p (abfd))
2571     return xcoff_write_archive_contents_old (abfd);
2572   else
2573     return xcoff_write_archive_contents_big (abfd);
2574 }
2575 
2576 /* We can't use the usual coff_sizeof_headers routine, because AIX
2577    always uses an a.out header.  */
2578 
2579 int
_bfd_xcoff_sizeof_headers(abfd,reloc)2580 _bfd_xcoff_sizeof_headers (abfd, reloc)
2581      bfd *abfd;
2582      bfd_boolean reloc ATTRIBUTE_UNUSED;
2583 {
2584   int size;
2585 
2586   size = FILHSZ;
2587   if (xcoff_data (abfd)->full_aouthdr)
2588     size += AOUTSZ;
2589   else
2590     size += SMALL_AOUTSZ;
2591   size += abfd->section_count * SCNHSZ;
2592   return size;
2593 }
2594 
2595 /* Routines to swap information in the XCOFF .loader section.  If we
2596    ever need to write an XCOFF loader, this stuff will need to be
2597    moved to another file shared by the linker (which XCOFF calls the
2598    ``binder'') and the loader.  */
2599 
2600 /* Swap in the ldhdr structure.  */
2601 
2602 static void
xcoff_swap_ldhdr_in(abfd,s,dst)2603 xcoff_swap_ldhdr_in (abfd, s, dst)
2604      bfd *abfd;
2605      const PTR s;
2606      struct internal_ldhdr *dst;
2607 {
2608   const struct external_ldhdr *src = (const struct external_ldhdr *) s;
2609 
2610   dst->l_version = bfd_get_32 (abfd, src->l_version);
2611   dst->l_nsyms = bfd_get_32 (abfd, src->l_nsyms);
2612   dst->l_nreloc = bfd_get_32 (abfd, src->l_nreloc);
2613   dst->l_istlen = bfd_get_32 (abfd, src->l_istlen);
2614   dst->l_nimpid = bfd_get_32 (abfd, src->l_nimpid);
2615   dst->l_impoff = bfd_get_32 (abfd, src->l_impoff);
2616   dst->l_stlen = bfd_get_32 (abfd, src->l_stlen);
2617   dst->l_stoff = bfd_get_32 (abfd, src->l_stoff);
2618 }
2619 
2620 /* Swap out the ldhdr structure.  */
2621 
2622 static void
xcoff_swap_ldhdr_out(abfd,src,d)2623 xcoff_swap_ldhdr_out (abfd, src, d)
2624      bfd *abfd;
2625      const struct internal_ldhdr *src;
2626      PTR d;
2627 {
2628   struct external_ldhdr *dst = (struct external_ldhdr *) d;
2629 
2630   bfd_put_32 (abfd, (bfd_vma) src->l_version, dst->l_version);
2631   bfd_put_32 (abfd, src->l_nsyms, dst->l_nsyms);
2632   bfd_put_32 (abfd, src->l_nreloc, dst->l_nreloc);
2633   bfd_put_32 (abfd, src->l_istlen, dst->l_istlen);
2634   bfd_put_32 (abfd, src->l_nimpid, dst->l_nimpid);
2635   bfd_put_32 (abfd, src->l_impoff, dst->l_impoff);
2636   bfd_put_32 (abfd, src->l_stlen, dst->l_stlen);
2637   bfd_put_32 (abfd, src->l_stoff, dst->l_stoff);
2638 }
2639 
2640 /* Swap in the ldsym structure.  */
2641 
2642 static void
xcoff_swap_ldsym_in(abfd,s,dst)2643 xcoff_swap_ldsym_in (abfd, s, dst)
2644      bfd *abfd;
2645      const PTR s;
2646      struct internal_ldsym *dst;
2647 {
2648   const struct external_ldsym *src = (const struct external_ldsym *) s;
2649 
2650   if (bfd_get_32 (abfd, src->_l._l_l._l_zeroes) != 0) {
2651     memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
2652   } else {
2653     dst->_l._l_l._l_zeroes = 0;
2654     dst->_l._l_l._l_offset = bfd_get_32 (abfd, src->_l._l_l._l_offset);
2655   }
2656   dst->l_value = bfd_get_32 (abfd, src->l_value);
2657   dst->l_scnum = bfd_get_16 (abfd, src->l_scnum);
2658   dst->l_smtype = bfd_get_8 (abfd, src->l_smtype);
2659   dst->l_smclas = bfd_get_8 (abfd, src->l_smclas);
2660   dst->l_ifile = bfd_get_32 (abfd, src->l_ifile);
2661   dst->l_parm = bfd_get_32 (abfd, src->l_parm);
2662 }
2663 
2664 /* Swap out the ldsym structure.  */
2665 
2666 static void
xcoff_swap_ldsym_out(abfd,src,d)2667 xcoff_swap_ldsym_out (abfd, src, d)
2668      bfd *abfd;
2669      const struct internal_ldsym *src;
2670      PTR d;
2671 {
2672   struct external_ldsym *dst = (struct external_ldsym *) d;
2673 
2674   if (src->_l._l_l._l_zeroes != 0)
2675     memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
2676   else
2677     {
2678       bfd_put_32 (abfd, (bfd_vma) 0, dst->_l._l_l._l_zeroes);
2679       bfd_put_32 (abfd, (bfd_vma) src->_l._l_l._l_offset,
2680 		  dst->_l._l_l._l_offset);
2681     }
2682   bfd_put_32 (abfd, src->l_value, dst->l_value);
2683   bfd_put_16 (abfd, (bfd_vma) src->l_scnum, dst->l_scnum);
2684   bfd_put_8 (abfd, src->l_smtype, dst->l_smtype);
2685   bfd_put_8 (abfd, src->l_smclas, dst->l_smclas);
2686   bfd_put_32 (abfd, src->l_ifile, dst->l_ifile);
2687   bfd_put_32 (abfd, src->l_parm, dst->l_parm);
2688 }
2689 
2690 static void
xcoff_swap_reloc_in(abfd,s,d)2691 xcoff_swap_reloc_in (abfd, s, d)
2692      bfd *abfd;
2693      PTR s;
2694      PTR d;
2695 {
2696   struct external_reloc *src = (struct external_reloc *) s;
2697   struct internal_reloc *dst = (struct internal_reloc *) d;
2698 
2699   memset (dst, 0, sizeof (struct internal_reloc));
2700 
2701   dst->r_vaddr = bfd_get_32 (abfd, src->r_vaddr);
2702   dst->r_symndx = bfd_get_32 (abfd, src->r_symndx);
2703   dst->r_size = bfd_get_8 (abfd, src->r_size);
2704   dst->r_type = bfd_get_8 (abfd, src->r_type);
2705 }
2706 
2707 static unsigned int
xcoff_swap_reloc_out(abfd,s,d)2708 xcoff_swap_reloc_out (abfd, s, d)
2709      bfd *abfd;
2710      PTR s;
2711      PTR d;
2712 {
2713   struct internal_reloc *src = (struct internal_reloc *) s;
2714   struct external_reloc *dst = (struct external_reloc *) d;
2715 
2716   bfd_put_32 (abfd, src->r_vaddr, dst->r_vaddr);
2717   bfd_put_32 (abfd, src->r_symndx, dst->r_symndx);
2718   bfd_put_8 (abfd, src->r_type, dst->r_type);
2719   bfd_put_8 (abfd, src->r_size, dst->r_size);
2720 
2721   return bfd_coff_relsz (abfd);
2722 }
2723 
2724 /* Swap in the ldrel structure.  */
2725 
2726 static void
xcoff_swap_ldrel_in(abfd,s,dst)2727 xcoff_swap_ldrel_in (abfd, s, dst)
2728      bfd *abfd;
2729      const PTR s;
2730      struct internal_ldrel *dst;
2731 {
2732   const struct external_ldrel *src = (const struct external_ldrel *) s;
2733 
2734   dst->l_vaddr = bfd_get_32 (abfd, src->l_vaddr);
2735   dst->l_symndx = bfd_get_32 (abfd, src->l_symndx);
2736   dst->l_rtype = bfd_get_16 (abfd, src->l_rtype);
2737   dst->l_rsecnm = bfd_get_16 (abfd, src->l_rsecnm);
2738 }
2739 
2740 /* Swap out the ldrel structure.  */
2741 
2742 static void
xcoff_swap_ldrel_out(abfd,src,d)2743 xcoff_swap_ldrel_out (abfd, src, d)
2744      bfd *abfd;
2745      const struct internal_ldrel *src;
2746      PTR d;
2747 {
2748   struct external_ldrel *dst = (struct external_ldrel *) d;
2749 
2750   bfd_put_32 (abfd, src->l_vaddr, dst->l_vaddr);
2751   bfd_put_32 (abfd, src->l_symndx, dst->l_symndx);
2752   bfd_put_16 (abfd, (bfd_vma) src->l_rtype, dst->l_rtype);
2753   bfd_put_16 (abfd, (bfd_vma) src->l_rsecnm, dst->l_rsecnm);
2754 }
2755 
2756 
2757 bfd_boolean
xcoff_reloc_type_noop(input_bfd,input_section,output_bfd,rel,sym,howto,val,addend,relocation,contents)2758 xcoff_reloc_type_noop (input_bfd, input_section, output_bfd, rel, sym, howto,
2759 		       val, addend, relocation, contents)
2760      bfd *input_bfd ATTRIBUTE_UNUSED;
2761      asection *input_section ATTRIBUTE_UNUSED;
2762      bfd *output_bfd ATTRIBUTE_UNUSED;
2763      struct internal_reloc *rel ATTRIBUTE_UNUSED;
2764      struct internal_syment *sym ATTRIBUTE_UNUSED;
2765      struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
2766      bfd_vma val ATTRIBUTE_UNUSED;
2767      bfd_vma addend ATTRIBUTE_UNUSED;
2768      bfd_vma *relocation ATTRIBUTE_UNUSED;
2769      bfd_byte *contents ATTRIBUTE_UNUSED;
2770 {
2771   return TRUE;
2772 }
2773 
2774 bfd_boolean
xcoff_reloc_type_fail(input_bfd,input_section,output_bfd,rel,sym,howto,val,addend,relocation,contents)2775 xcoff_reloc_type_fail (input_bfd, input_section, output_bfd, rel, sym, howto,
2776 		       val, addend, relocation, contents)
2777      bfd *input_bfd;
2778      asection *input_section ATTRIBUTE_UNUSED;
2779      bfd *output_bfd ATTRIBUTE_UNUSED;
2780      struct internal_reloc *rel;
2781      struct internal_syment *sym ATTRIBUTE_UNUSED;
2782      struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
2783      bfd_vma val ATTRIBUTE_UNUSED;
2784      bfd_vma addend ATTRIBUTE_UNUSED;
2785      bfd_vma *relocation ATTRIBUTE_UNUSED;
2786      bfd_byte *contents ATTRIBUTE_UNUSED;
2787 {
2788   (*_bfd_error_handler)
2789     (_("%s: unsupported relocation type 0x%02x"),
2790      bfd_get_filename (input_bfd), (unsigned int) rel->r_type);
2791   bfd_set_error (bfd_error_bad_value);
2792   return FALSE;
2793 }
2794 
2795 bfd_boolean
xcoff_reloc_type_pos(input_bfd,input_section,output_bfd,rel,sym,howto,val,addend,relocation,contents)2796 xcoff_reloc_type_pos (input_bfd, input_section, output_bfd, rel, sym, howto,
2797 		      val, addend, relocation, contents)
2798      bfd *input_bfd ATTRIBUTE_UNUSED;
2799      asection *input_section ATTRIBUTE_UNUSED;
2800      bfd *output_bfd ATTRIBUTE_UNUSED;
2801      struct internal_reloc *rel ATTRIBUTE_UNUSED;
2802      struct internal_syment *sym ATTRIBUTE_UNUSED;
2803      struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
2804      bfd_vma val;
2805      bfd_vma addend;
2806      bfd_vma *relocation;
2807      bfd_byte *contents ATTRIBUTE_UNUSED;
2808 {
2809   *relocation = val + addend;
2810   return TRUE;
2811 }
2812 
2813 bfd_boolean
xcoff_reloc_type_neg(input_bfd,input_section,output_bfd,rel,sym,howto,val,addend,relocation,contents)2814 xcoff_reloc_type_neg (input_bfd, input_section, output_bfd, rel, sym, howto,
2815 		      val, addend, relocation, contents)
2816      bfd *input_bfd ATTRIBUTE_UNUSED;
2817      asection *input_section ATTRIBUTE_UNUSED;
2818      bfd *output_bfd ATTRIBUTE_UNUSED;
2819      struct internal_reloc *rel ATTRIBUTE_UNUSED;
2820      struct internal_syment *sym ATTRIBUTE_UNUSED;
2821      struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
2822      bfd_vma val;
2823      bfd_vma addend;
2824      bfd_vma *relocation;
2825      bfd_byte *contents ATTRIBUTE_UNUSED;
2826 {
2827   *relocation = addend - val;
2828   return TRUE;
2829 }
2830 
2831 bfd_boolean
xcoff_reloc_type_rel(input_bfd,input_section,output_bfd,rel,sym,howto,val,addend,relocation,contents)2832 xcoff_reloc_type_rel (input_bfd, input_section, output_bfd, rel, sym, howto,
2833 		      val, addend, relocation, contents)
2834      bfd *input_bfd ATTRIBUTE_UNUSED;
2835      asection *input_section;
2836      bfd *output_bfd ATTRIBUTE_UNUSED;
2837      struct internal_reloc *rel ATTRIBUTE_UNUSED;
2838      struct internal_syment *sym ATTRIBUTE_UNUSED;
2839      struct reloc_howto_struct *howto;
2840      bfd_vma val;
2841      bfd_vma addend;
2842      bfd_vma *relocation;
2843      bfd_byte *contents ATTRIBUTE_UNUSED;
2844 {
2845   howto->pc_relative = TRUE;
2846 
2847   /* A PC relative reloc includes the section address.  */
2848   addend += input_section->vma;
2849 
2850   *relocation = val + addend;
2851   *relocation -= (input_section->output_section->vma
2852 		  + input_section->output_offset);
2853   return TRUE;
2854 }
2855 
2856 bfd_boolean
xcoff_reloc_type_toc(input_bfd,input_section,output_bfd,rel,sym,howto,val,addend,relocation,contents)2857 xcoff_reloc_type_toc (input_bfd, input_section, output_bfd, rel, sym, howto,
2858 		      val, addend, relocation, contents)
2859      bfd *input_bfd;
2860      asection *input_section ATTRIBUTE_UNUSED;
2861      bfd *output_bfd;
2862      struct internal_reloc *rel;
2863      struct internal_syment *sym;
2864      struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
2865      bfd_vma val;
2866      bfd_vma addend ATTRIBUTE_UNUSED;
2867      bfd_vma *relocation;
2868      bfd_byte *contents ATTRIBUTE_UNUSED;
2869 {
2870   struct xcoff_link_hash_entry *h;
2871 
2872   if (0 > rel->r_symndx)
2873     return FALSE;
2874 
2875   h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
2876 
2877   if (h != NULL && h->smclas != XMC_TD)
2878     {
2879       if (h->toc_section == NULL)
2880 	{
2881 	  (*_bfd_error_handler)
2882 	    (_("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry"),
2883 	     bfd_get_filename (input_bfd), rel->r_vaddr,
2884 	     h->root.root.string);
2885 	  bfd_set_error (bfd_error_bad_value);
2886 	  return FALSE;
2887 	}
2888 
2889       BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0);
2890       val = (h->toc_section->output_section->vma
2891 	      + h->toc_section->output_offset);
2892     }
2893 
2894   *relocation = ((val - xcoff_data (output_bfd)->toc)
2895 		 - (sym->n_value - xcoff_data (input_bfd)->toc));
2896   return TRUE;
2897 }
2898 
2899 bfd_boolean
xcoff_reloc_type_ba(input_bfd,input_section,output_bfd,rel,sym,howto,val,addend,relocation,contents)2900 xcoff_reloc_type_ba (input_bfd, input_section, output_bfd, rel, sym, howto,
2901 		     val, addend, relocation, contents)
2902      bfd *input_bfd ATTRIBUTE_UNUSED;
2903      asection *input_section ATTRIBUTE_UNUSED;
2904      bfd *output_bfd ATTRIBUTE_UNUSED;
2905      struct internal_reloc *rel ATTRIBUTE_UNUSED;
2906      struct internal_syment *sym ATTRIBUTE_UNUSED;
2907      struct reloc_howto_struct *howto;
2908      bfd_vma val;
2909      bfd_vma addend;
2910      bfd_vma *relocation;
2911      bfd_byte *contents ATTRIBUTE_UNUSED;
2912 {
2913   howto->src_mask &= ~3;
2914   howto->dst_mask = howto->src_mask;
2915 
2916   *relocation = val + addend;
2917 
2918   return TRUE;
2919 }
2920 
2921 static bfd_boolean
xcoff_reloc_type_br(input_bfd,input_section,output_bfd,rel,sym,howto,val,addend,relocation,contents)2922 xcoff_reloc_type_br (input_bfd, input_section, output_bfd, rel, sym, howto,
2923 		     val, addend, relocation, contents)
2924      bfd *input_bfd;
2925      asection *input_section;
2926      bfd *output_bfd ATTRIBUTE_UNUSED;
2927      struct internal_reloc *rel;
2928      struct internal_syment *sym ATTRIBUTE_UNUSED;
2929      struct reloc_howto_struct *howto;
2930      bfd_vma val;
2931      bfd_vma addend;
2932      bfd_vma *relocation;
2933      bfd_byte *contents;
2934 {
2935   struct xcoff_link_hash_entry *h;
2936 
2937   if (0 > rel->r_symndx)
2938     return FALSE;
2939 
2940   h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
2941 
2942   /* If we see an R_BR or R_RBR reloc which is jumping to global
2943      linkage code, and it is followed by an appropriate cror nop
2944      instruction, we replace the cror with lwz r2,20(r1).  This
2945      restores the TOC after the glink code.  Contrariwise, if the
2946      call is followed by a lwz r2,20(r1), but the call is not
2947      going to global linkage code, we can replace the load with a
2948      cror.  */
2949   if (NULL != h
2950       && bfd_link_hash_defined == h->root.type
2951       && (rel->r_vaddr - input_section->vma + 8
2952 	  <= input_section->_cooked_size))
2953     {
2954       bfd_byte *pnext;
2955       unsigned long next;
2956 
2957       pnext = contents + (rel->r_vaddr - input_section->vma) + 4;
2958       next = bfd_get_32 (input_bfd, pnext);
2959 
2960       /* The _ptrgl function is magic.  It is used by the AIX
2961 	 compiler to call a function through a pointer.  */
2962       if (h->smclas == XMC_GL || strcmp (h->root.root.string, "._ptrgl") == 0)
2963 	{
2964 	  if (next == 0x4def7b82			/* cror 15,15,15 */
2965 	      || next == 0x4ffffb82			/* cror 31,31,31 */
2966 	      || next == 0x60000000)			/* ori r0,r0,0 */
2967 	    bfd_put_32 (input_bfd, 0x80410014, pnext);	/* lwz r1,20(r1) */
2968 
2969 	}
2970       else
2971 	{
2972 	  if (next == 0x80410014)			/* lwz r1,20(r1) */
2973 	    bfd_put_32 (input_bfd, 0x60000000, pnext);	/* ori r0,r0,0 */
2974 	}
2975     }
2976   else if (NULL != h && bfd_link_hash_undefined == h->root.type)
2977     {
2978       /* Normally, this relocation is against a defined symbol.  In the
2979 	 case where this is a partial link and the output section offset
2980 	 is greater than 2^25, the linker will return an invalid error
2981 	 message that the relocation has been truncated.  Yes it has been
2982 	 truncated but no it not important.  For this case, disable the
2983 	 overflow checking. */
2984 
2985       howto->complain_on_overflow = complain_overflow_dont;
2986     }
2987 
2988   howto->pc_relative = TRUE;
2989   howto->src_mask &= ~3;
2990   howto->dst_mask = howto->src_mask;
2991 
2992   /* A PC relative reloc includes the section address.  */
2993   addend += input_section->vma;
2994 
2995   *relocation = val + addend;
2996   *relocation -= (input_section->output_section->vma
2997 		  + input_section->output_offset);
2998   return TRUE;
2999 }
3000 
3001 bfd_boolean
xcoff_reloc_type_crel(input_bfd,input_section,output_bfd,rel,sym,howto,val,addend,relocation,contents)3002 xcoff_reloc_type_crel (input_bfd, input_section, output_bfd, rel, sym, howto,
3003 		       val, addend, relocation, contents)
3004      bfd *input_bfd ATTRIBUTE_UNUSED;
3005      asection *input_section;
3006      bfd *output_bfd ATTRIBUTE_UNUSED;
3007      struct internal_reloc *rel ATTRIBUTE_UNUSED;
3008      struct internal_syment *sym ATTRIBUTE_UNUSED;
3009      struct reloc_howto_struct *howto;
3010      bfd_vma val ATTRIBUTE_UNUSED;
3011      bfd_vma addend;
3012      bfd_vma *relocation;
3013      bfd_byte *contents ATTRIBUTE_UNUSED;
3014 {
3015   howto->pc_relative = TRUE;
3016   howto->src_mask &= ~3;
3017   howto->dst_mask = howto->src_mask;
3018 
3019   /* A PC relative reloc includes the section address.  */
3020   addend += input_section->vma;
3021 
3022   *relocation = val + addend;
3023   *relocation -= (input_section->output_section->vma
3024 		  + input_section->output_offset);
3025   return TRUE;
3026 }
3027 
3028 static bfd_boolean
xcoff_complain_overflow_dont_func(input_bfd,val,relocation,howto)3029 xcoff_complain_overflow_dont_func (input_bfd, val, relocation, howto)
3030      bfd *input_bfd ATTRIBUTE_UNUSED;
3031      bfd_vma val ATTRIBUTE_UNUSED;
3032      bfd_vma relocation ATTRIBUTE_UNUSED;
3033      struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
3034 {
3035   return FALSE;
3036 }
3037 
3038 static bfd_boolean
xcoff_complain_overflow_bitfield_func(input_bfd,val,relocation,howto)3039 xcoff_complain_overflow_bitfield_func (input_bfd, val, relocation, howto)
3040      bfd *input_bfd;
3041      bfd_vma val;
3042      bfd_vma relocation;
3043      struct reloc_howto_struct *howto;
3044 {
3045   bfd_vma addrmask, fieldmask, signmask, ss;
3046   bfd_vma a, b, sum;
3047 
3048   /* Get the values to be added together.  For signed and unsigned
3049      relocations, we assume that all values should be truncated to
3050      the size of an address.  For bitfields, all the bits matter.
3051      See also bfd_check_overflow.  */
3052   fieldmask = N_ONES (howto->bitsize);
3053   addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
3054   a = relocation;
3055   b = val & howto->src_mask;
3056 
3057   /* Much like unsigned, except no trimming with addrmask.  In
3058      addition, the sum overflows if there is a carry out of
3059      the bfd_vma, i.e., the sum is less than either input
3060      operand.  */
3061   a >>= howto->rightshift;
3062   b >>= howto->bitpos;
3063 
3064   /* Bitfields are sometimes used for signed numbers; for
3065      example, a 13-bit field sometimes represents values in
3066      0..8191 and sometimes represents values in -4096..4095.
3067      If the field is signed and a is -4095 (0x1001) and b is
3068      -1 (0x1fff), the sum is -4096 (0x1000), but (0x1001 +
3069      0x1fff is 0x3000).  It's not clear how to handle this
3070      everywhere, since there is not way to know how many bits
3071      are significant in the relocation, but the original code
3072      assumed that it was fully sign extended, and we will keep
3073      that assumption.  */
3074   signmask = (fieldmask >> 1) + 1;
3075 
3076   if ((a & ~ fieldmask) != 0)
3077     {
3078       /* Some bits out of the field are set.  This might not
3079 	 be a problem: if this is a signed bitfield, it is OK
3080 	 iff all the high bits are set, including the sign
3081 	 bit.  We'll try setting all but the most significant
3082 	 bit in the original relocation value: if this is all
3083 	 ones, we are OK, assuming a signed bitfield.  */
3084       ss = (signmask << howto->rightshift) - 1;
3085       if ((ss | relocation) != ~ (bfd_vma) 0)
3086 	return TRUE;
3087       a &= fieldmask;
3088     }
3089 
3090   /* We just assume (b & ~ fieldmask) == 0.  */
3091 
3092   /* We explicitly permit wrap around if this relocation
3093      covers the high bit of an address.  The Linux kernel
3094      relies on it, and it is the only way to write assembler
3095      code which can run when loaded at a location 0x80000000
3096      away from the location at which it is linked.  */
3097   if (howto->bitsize + howto->rightshift
3098       == bfd_arch_bits_per_address (input_bfd))
3099     return FALSE;
3100 
3101   sum = a + b;
3102   if (sum < a || (sum & ~ fieldmask) != 0)
3103     {
3104       /* There was a carry out, or the field overflow.  Test
3105 	 for signed operands again.  Here is the overflow test
3106 	 is as for complain_overflow_signed.  */
3107       if (((~ (a ^ b)) & (a ^ sum)) & signmask)
3108 	return TRUE;
3109     }
3110 
3111   return FALSE;
3112 }
3113 
3114 static bfd_boolean
xcoff_complain_overflow_signed_func(input_bfd,val,relocation,howto)3115 xcoff_complain_overflow_signed_func (input_bfd, val, relocation, howto)
3116      bfd *input_bfd;
3117      bfd_vma val;
3118      bfd_vma relocation;
3119      struct reloc_howto_struct *howto;
3120 {
3121   bfd_vma addrmask, fieldmask, signmask, ss;
3122   bfd_vma a, b, sum;
3123 
3124   /* Get the values to be added together.  For signed and unsigned
3125      relocations, we assume that all values should be truncated to
3126      the size of an address.  For bitfields, all the bits matter.
3127      See also bfd_check_overflow.  */
3128   fieldmask = N_ONES (howto->bitsize);
3129   addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
3130   a = relocation;
3131   b = val & howto->src_mask;
3132 
3133   a = (a & addrmask) >> howto->rightshift;
3134 
3135   /* If any sign bits are set, all sign bits must be set.
3136      That is, A must be a valid negative address after
3137      shifting.  */
3138   signmask = ~ (fieldmask >> 1);
3139   ss = a & signmask;
3140   if (ss != 0 && ss != ((addrmask >> howto->rightshift) & signmask))
3141     return TRUE;
3142 
3143   /* We only need this next bit of code if the sign bit of B
3144      is below the sign bit of A.  This would only happen if
3145      SRC_MASK had fewer bits than BITSIZE.  Note that if
3146      SRC_MASK has more bits than BITSIZE, we can get into
3147      trouble; we would need to verify that B is in range, as
3148      we do for A above.  */
3149   signmask = ((~ howto->src_mask) >> 1) & howto->src_mask;
3150   if ((b & signmask) != 0)
3151     {
3152       /* Set all the bits above the sign bit.  */
3153       b -= signmask <<= 1;
3154     }
3155 
3156   b = (b & addrmask) >> howto->bitpos;
3157 
3158   /* Now we can do the addition.  */
3159   sum = a + b;
3160 
3161   /* See if the result has the correct sign.  Bits above the
3162      sign bit are junk now; ignore them.  If the sum is
3163      positive, make sure we did not have all negative inputs;
3164      if the sum is negative, make sure we did not have all
3165      positive inputs.  The test below looks only at the sign
3166      bits, and it really just
3167      SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
3168   */
3169   signmask = (fieldmask >> 1) + 1;
3170   if (((~ (a ^ b)) & (a ^ sum)) & signmask)
3171     return TRUE;
3172 
3173   return FALSE;
3174 }
3175 
3176 static bfd_boolean
xcoff_complain_overflow_unsigned_func(input_bfd,val,relocation,howto)3177 xcoff_complain_overflow_unsigned_func (input_bfd, val, relocation, howto)
3178      bfd *input_bfd;
3179      bfd_vma val;
3180      bfd_vma relocation;
3181      struct reloc_howto_struct *howto;
3182 {
3183   bfd_vma addrmask, fieldmask;
3184   bfd_vma a, b, sum;
3185 
3186   /* Get the values to be added together.  For signed and unsigned
3187      relocations, we assume that all values should be truncated to
3188      the size of an address.  For bitfields, all the bits matter.
3189      See also bfd_check_overflow.  */
3190   fieldmask = N_ONES (howto->bitsize);
3191   addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
3192   a = relocation;
3193   b = val & howto->src_mask;
3194 
3195   /* Checking for an unsigned overflow is relatively easy:
3196      trim the addresses and add, and trim the result as well.
3197      Overflow is normally indicated when the result does not
3198      fit in the field.  However, we also need to consider the
3199      case when, e.g., fieldmask is 0x7fffffff or smaller, an
3200      input is 0x80000000, and bfd_vma is only 32 bits; then we
3201      will get sum == 0, but there is an overflow, since the
3202      inputs did not fit in the field.  Instead of doing a
3203      separate test, we can check for this by or-ing in the
3204      operands when testing for the sum overflowing its final
3205      field.  */
3206   a = (a & addrmask) >> howto->rightshift;
3207   b = (b & addrmask) >> howto->bitpos;
3208   sum = (a + b) & addrmask;
3209   if ((a | b | sum) & ~ fieldmask)
3210     return TRUE;
3211 
3212   return FALSE;
3213 }
3214 
3215 /* This is the relocation function for the RS/6000/POWER/PowerPC.
3216    This is currently the only processor which uses XCOFF; I hope that
3217    will never change.
3218 
3219    I took the relocation type definitions from two documents:
3220    the PowerPC AIX Version 4 Application Binary Interface, First
3221    Edition (April 1992), and the PowerOpen ABI, Big-Endian
3222    32-Bit Hardware Implementation (June 30, 1994).  Differences
3223    between the documents are noted below.
3224 
3225    Unsupported r_type's
3226 
3227    R_RTB:
3228    R_RRTBI:
3229    R_RRTBA:
3230 
3231    These relocs are defined by the PowerPC ABI to be
3232    relative branches which use half of the difference
3233    between the symbol and the program counter.  I can't
3234    quite figure out when this is useful.  These relocs are
3235    not defined by the PowerOpen ABI.
3236 
3237    Supported r_type's
3238 
3239    R_POS:
3240    Simple positive relocation.
3241 
3242    R_NEG:
3243    Simple negative relocation.
3244 
3245    R_REL:
3246    Simple PC relative relocation.
3247 
3248    R_TOC:
3249    TOC relative relocation.  The value in the instruction in
3250    the input file is the offset from the input file TOC to
3251    the desired location.  We want the offset from the final
3252    TOC to the desired location.  We have:
3253    isym = iTOC + in
3254    iinsn = in + o
3255    osym = oTOC + on
3256    oinsn = on + o
3257    so we must change insn by on - in.
3258 
3259    R_GL:
3260    GL linkage relocation.  The value of this relocation
3261    is the address of the entry in the TOC section.
3262 
3263    R_TCL:
3264    Local object TOC address.  I can't figure out the
3265    difference between this and case R_GL.
3266 
3267    R_TRL:
3268    TOC relative relocation.  A TOC relative load instruction
3269    which may be changed to a load address instruction.
3270    FIXME: We don't currently implement this optimization.
3271 
3272    R_TRLA:
3273    TOC relative relocation.  This is a TOC relative load
3274    address instruction which may be changed to a load
3275    instruction.  FIXME: I don't know if this is the correct
3276    implementation.
3277 
3278    R_BA:
3279    Absolute branch.  We don't want to mess with the lower
3280    two bits of the instruction.
3281 
3282    R_CAI:
3283    The PowerPC ABI defines this as an absolute call which
3284    may be modified to become a relative call.  The PowerOpen
3285    ABI does not define this relocation type.
3286 
3287    R_RBA:
3288    Absolute branch which may be modified to become a
3289    relative branch.
3290 
3291    R_RBAC:
3292    The PowerPC ABI defines this as an absolute branch to a
3293    fixed address which may be modified to an absolute branch
3294    to a symbol.  The PowerOpen ABI does not define this
3295    relocation type.
3296 
3297    R_RBRC:
3298    The PowerPC ABI defines this as an absolute branch to a
3299    fixed address which may be modified to a relative branch.
3300    The PowerOpen ABI does not define this relocation type.
3301 
3302    R_BR:
3303    Relative branch.  We don't want to mess with the lower
3304    two bits of the instruction.
3305 
3306    R_CREL:
3307    The PowerPC ABI defines this as a relative call which may
3308    be modified to become an absolute call.  The PowerOpen
3309    ABI does not define this relocation type.
3310 
3311    R_RBR:
3312    A relative branch which may be modified to become an
3313    absolute branch.  FIXME: We don't implement this,
3314    although we should for symbols of storage mapping class
3315    XMC_XO.
3316 
3317    R_RL:
3318    The PowerPC AIX ABI describes this as a load which may be
3319    changed to a load address.  The PowerOpen ABI says this
3320    is the same as case R_POS.
3321 
3322    R_RLA:
3323    The PowerPC AIX ABI describes this as a load address
3324    which may be changed to a load.  The PowerOpen ABI says
3325    this is the same as R_POS.
3326 */
3327 
3328 bfd_boolean
xcoff_ppc_relocate_section(output_bfd,info,input_bfd,input_section,contents,relocs,syms,sections)3329 xcoff_ppc_relocate_section (output_bfd, info, input_bfd,
3330 			    input_section, contents, relocs, syms,
3331 			    sections)
3332      bfd *output_bfd;
3333      struct bfd_link_info *info;
3334      bfd *input_bfd;
3335      asection *input_section;
3336      bfd_byte *contents;
3337      struct internal_reloc *relocs;
3338      struct internal_syment *syms;
3339      asection **sections;
3340 {
3341   struct internal_reloc *rel;
3342   struct internal_reloc *relend;
3343 
3344   rel = relocs;
3345   relend = rel + input_section->reloc_count;
3346   for (; rel < relend; rel++)
3347     {
3348       long symndx;
3349       struct xcoff_link_hash_entry *h;
3350       struct internal_syment *sym;
3351       bfd_vma addend;
3352       bfd_vma val;
3353       struct reloc_howto_struct howto;
3354       bfd_vma relocation;
3355       bfd_vma value_to_relocate;
3356       bfd_vma address;
3357       bfd_byte *location;
3358 
3359       /* Relocation type R_REF is a special relocation type which is
3360 	 merely used to prevent garbage collection from occurring for
3361 	 the csect including the symbol which it references.  */
3362       if (rel->r_type == R_REF)
3363 	continue;
3364 
3365       /* howto */
3366       howto.type = rel->r_type;
3367       howto.rightshift = 0;
3368       howto.bitsize = (rel->r_size & 0x1f) + 1;
3369       howto.size = howto.bitsize > 16 ? 2 : 1;
3370       howto.pc_relative = FALSE;
3371       howto.bitpos = 0;
3372       howto.complain_on_overflow = (rel->r_size & 0x80
3373 				    ? complain_overflow_signed
3374 				    : complain_overflow_bitfield);
3375       howto.special_function = NULL;
3376       howto.name = "internal";
3377       howto.partial_inplace = TRUE;
3378       howto.src_mask = howto.dst_mask = N_ONES (howto.bitsize);
3379       howto.pcrel_offset = FALSE;
3380 
3381       /* symbol */
3382       val = 0;
3383       addend = 0;
3384       h = NULL;
3385       sym = NULL;
3386       symndx = rel->r_symndx;
3387 
3388       if (-1 != symndx)
3389 	{
3390 	  asection *sec;
3391 
3392 	  h = obj_xcoff_sym_hashes (input_bfd)[symndx];
3393 	  sym = syms + symndx;
3394 	  addend = - sym->n_value;
3395 
3396 	  if (NULL == h)
3397 	    {
3398 	      sec = sections[symndx];
3399 	      /* Hack to make sure we use the right TOC anchor value
3400 		 if this reloc is against the TOC anchor.  */
3401 	      if (sec->name[3] == '0'
3402 		  && strcmp (sec->name, ".tc0") == 0)
3403 		val = xcoff_data (output_bfd)->toc;
3404 	      else
3405 		val = (sec->output_section->vma
3406 		       + sec->output_offset
3407 		       + sym->n_value
3408 		       - sec->vma);
3409 	    }
3410 	  else
3411 	    {
3412 	      if (h->root.type == bfd_link_hash_defined
3413 		  || h->root.type == bfd_link_hash_defweak)
3414 		{
3415 		  sec = h->root.u.def.section;
3416 		  val = (h->root.u.def.value
3417 			 + sec->output_section->vma
3418 			 + sec->output_offset);
3419 		}
3420 	      else if (h->root.type == bfd_link_hash_common)
3421 		{
3422 		  sec = h->root.u.c.p->section;
3423 		  val = (sec->output_section->vma
3424 			 + sec->output_offset);
3425 
3426 		}
3427 	      else if ((0 == (h->flags & (XCOFF_DEF_DYNAMIC | XCOFF_IMPORT)))
3428 		       && ! info->relocatable)
3429 		{
3430 		  if (! ((*info->callbacks->undefined_symbol)
3431 			 (info, h->root.root.string, input_bfd, input_section,
3432 			  rel->r_vaddr - input_section->vma, TRUE)))
3433 		    return FALSE;
3434 
3435 		  /* Don't try to process the reloc.  It can't help, and
3436 		     it may generate another error.  */
3437 		  continue;
3438 		}
3439 	    }
3440 	}
3441 
3442       if (rel->r_type >= XCOFF_MAX_CALCULATE_RELOCATION
3443 	  || !((*xcoff_calculate_relocation[rel->r_type])
3444 	       (input_bfd, input_section, output_bfd, rel, sym, &howto, val,
3445 		addend, &relocation, contents)))
3446 	return FALSE;
3447 
3448       /* address */
3449       address = rel->r_vaddr - input_section->vma;
3450       location = contents + address;
3451 
3452       if (address > input_section->_raw_size)
3453 	abort ();
3454 
3455       /* Get the value we are going to relocate.  */
3456       if (1 == howto.size)
3457 	value_to_relocate = bfd_get_16 (input_bfd, location);
3458       else
3459 	value_to_relocate = bfd_get_32 (input_bfd, location);
3460 
3461       /* overflow.
3462 
3463 	 FIXME: We may drop bits during the addition
3464 	 which we don't check for.  We must either check at every single
3465 	 operation, which would be tedious, or we must do the computations
3466 	 in a type larger than bfd_vma, which would be inefficient.  */
3467 
3468       if ((unsigned int) howto.complain_on_overflow
3469 	  >= XCOFF_MAX_COMPLAIN_OVERFLOW)
3470 	abort ();
3471 
3472       if (((*xcoff_complain_overflow[howto.complain_on_overflow])
3473 	   (input_bfd, value_to_relocate, relocation, &howto)))
3474 	{
3475 	  const char *name;
3476 	  char buf[SYMNMLEN + 1];
3477 	  char reloc_type_name[10];
3478 
3479 	  if (symndx == -1)
3480 	    {
3481 	      name = "*ABS*";
3482 	    }
3483 	  else if (h != NULL)
3484 	    {
3485 	      name = h->root.root.string;
3486 	    }
3487 	  else
3488 	    {
3489 	      name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
3490 	      if (name == NULL)
3491 		name = "UNKNOWN";
3492 	    }
3493 	  sprintf (reloc_type_name, "0x%02x", rel->r_type);
3494 
3495 	  if (! ((*info->callbacks->reloc_overflow)
3496 		 (info, name, reloc_type_name, (bfd_vma) 0, input_bfd,
3497 		  input_section, rel->r_vaddr - input_section->vma)))
3498 	    return FALSE;
3499 	}
3500 
3501       /* Add RELOCATION to the right bits of VALUE_TO_RELOCATE.  */
3502       value_to_relocate = ((value_to_relocate & ~howto.dst_mask)
3503 			   | (((value_to_relocate & howto.src_mask)
3504 			       + relocation) & howto.dst_mask));
3505 
3506       /* Put the value back in the object file.  */
3507       if (1 == howto.size)
3508 	bfd_put_16 (input_bfd, value_to_relocate, location);
3509       else
3510 	bfd_put_32 (input_bfd, value_to_relocate, location);
3511     }
3512 
3513   return TRUE;
3514 }
3515 
3516 static bfd_boolean
_bfd_xcoff_put_ldsymbol_name(abfd,ldinfo,ldsym,name)3517 _bfd_xcoff_put_ldsymbol_name (abfd, ldinfo, ldsym, name)
3518      bfd *abfd ATTRIBUTE_UNUSED;
3519 	 struct xcoff_loader_info *ldinfo;
3520 	 struct internal_ldsym *ldsym;
3521 	 const char *name;
3522 {
3523   size_t len;
3524   len = strlen (name);
3525 
3526   if (len <= SYMNMLEN)
3527     strncpy (ldsym->_l._l_name, name, SYMNMLEN);
3528   else
3529     {
3530       if (ldinfo->string_size + len + 3 > ldinfo->string_alc)
3531 	{
3532 	  bfd_size_type newalc;
3533 	  bfd_byte *newstrings;
3534 
3535 	  newalc = ldinfo->string_alc * 2;
3536 	  if (newalc == 0)
3537 	    newalc = 32;
3538 	  while (ldinfo->string_size + len + 3 > newalc)
3539 	    newalc *= 2;
3540 
3541 	  newstrings = ((bfd_byte *)
3542 			bfd_realloc ((PTR) ldinfo->strings, newalc));
3543 	  if (newstrings == NULL)
3544 	    {
3545 	      ldinfo->failed = TRUE;
3546 	      return FALSE;
3547 	    }
3548 	  ldinfo->string_alc = newalc;
3549 	  ldinfo->strings = newstrings;
3550 	}
3551 
3552       bfd_put_16 (ldinfo->output_bfd, (bfd_vma) (len + 1),
3553 		  ldinfo->strings + ldinfo->string_size);
3554       strcpy (ldinfo->strings + ldinfo->string_size + 2, name);
3555       ldsym->_l._l_l._l_zeroes = 0;
3556       ldsym->_l._l_l._l_offset = ldinfo->string_size + 2;
3557       ldinfo->string_size += len + 3;
3558     }
3559 
3560   return TRUE;
3561 }
3562 
3563 static bfd_boolean
_bfd_xcoff_put_symbol_name(bfd * abfd,struct bfd_strtab_hash * strtab,struct internal_syment * sym,const char * name)3564 _bfd_xcoff_put_symbol_name (bfd *abfd, struct bfd_strtab_hash *strtab,
3565 			    struct internal_syment *sym,
3566 			    const char *name)
3567 {
3568   if (strlen (name) <= SYMNMLEN)
3569     {
3570       strncpy (sym->_n._n_name, name, SYMNMLEN);
3571     }
3572   else
3573     {
3574       bfd_boolean hash;
3575       bfd_size_type indx;
3576 
3577       hash = TRUE;
3578       if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
3579 	hash = FALSE;
3580       indx = _bfd_stringtab_add (strtab, name, hash, FALSE);
3581       if (indx == (bfd_size_type) -1)
3582 	return FALSE;
3583       sym->_n._n_n._n_zeroes = 0;
3584       sym->_n._n_n._n_offset = STRING_SIZE_SIZE + indx;
3585     }
3586   return TRUE;
3587 }
3588 
3589 static asection *
xcoff_create_csect_from_smclas(abfd,aux,symbol_name)3590 xcoff_create_csect_from_smclas (abfd, aux, symbol_name)
3591      bfd *abfd;
3592      union internal_auxent *aux;
3593      const char *symbol_name;
3594 {
3595   asection *return_value = NULL;
3596 
3597   /* .sv64 = x_smclas == 17
3598      This is an invalid csect for 32 bit apps.  */
3599   static const char *names[19] =
3600   {
3601     ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
3602     ".sv", ".bs", ".ds", ".uc", ".ti", ".tb", NULL, ".tc0",
3603     ".td", NULL, ".sv3264"
3604   };
3605 
3606   if ((19 >= aux->x_csect.x_smclas)
3607       && (NULL != names[aux->x_csect.x_smclas]))
3608     {
3609       return_value = bfd_make_section_anyway
3610 	(abfd, names[aux->x_csect.x_smclas]);
3611     }
3612   else
3613     {
3614       (*_bfd_error_handler)
3615 	(_("%s: symbol `%s' has unrecognized smclas %d"),
3616 	 bfd_archive_filename (abfd), symbol_name, aux->x_csect.x_smclas);
3617       bfd_set_error (bfd_error_bad_value);
3618     }
3619 
3620   return return_value;
3621 }
3622 
3623 static bfd_boolean
xcoff_is_lineno_count_overflow(abfd,value)3624 xcoff_is_lineno_count_overflow (abfd, value)
3625     bfd *abfd ATTRIBUTE_UNUSED;
3626 	bfd_vma value;
3627 {
3628   if (0xffff <= value)
3629     return TRUE;
3630 
3631   return FALSE;
3632 }
3633 
3634 static bfd_boolean
xcoff_is_reloc_count_overflow(abfd,value)3635 xcoff_is_reloc_count_overflow (abfd, value)
3636     bfd *abfd ATTRIBUTE_UNUSED;
3637 	bfd_vma value;
3638 {
3639   if (0xffff <= value)
3640     return TRUE;
3641 
3642   return FALSE;
3643 }
3644 
3645 static bfd_vma
xcoff_loader_symbol_offset(abfd,ldhdr)3646 xcoff_loader_symbol_offset (abfd, ldhdr)
3647     bfd *abfd;
3648     struct internal_ldhdr *ldhdr ATTRIBUTE_UNUSED;
3649 {
3650   return bfd_xcoff_ldhdrsz (abfd);
3651 }
3652 
3653 static bfd_vma
xcoff_loader_reloc_offset(abfd,ldhdr)3654 xcoff_loader_reloc_offset (abfd, ldhdr)
3655     bfd *abfd;
3656     struct internal_ldhdr *ldhdr;
3657 {
3658   return bfd_xcoff_ldhdrsz (abfd) + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (abfd);
3659 }
3660 
3661 static bfd_boolean
xcoff_generate_rtinit(abfd,init,fini,rtld)3662 xcoff_generate_rtinit  (abfd, init, fini, rtld)
3663      bfd *abfd;
3664      const char *init;
3665      const char *fini;
3666      bfd_boolean rtld;
3667 {
3668   bfd_byte filehdr_ext[FILHSZ];
3669   bfd_byte scnhdr_ext[SCNHSZ];
3670   bfd_byte syment_ext[SYMESZ * 10];
3671   bfd_byte reloc_ext[RELSZ * 3];
3672   bfd_byte *data_buffer;
3673   bfd_size_type data_buffer_size;
3674   bfd_byte *string_table = NULL, *st_tmp = NULL;
3675   bfd_size_type string_table_size;
3676   bfd_vma val;
3677   size_t initsz, finisz;
3678   struct internal_filehdr filehdr;
3679   struct internal_scnhdr scnhdr;
3680   struct internal_syment syment;
3681   union internal_auxent auxent;
3682   struct internal_reloc reloc;
3683 
3684   char *data_name = ".data";
3685   char *rtinit_name = "__rtinit";
3686   char *rtld_name = "__rtld";
3687 
3688   if (! bfd_xcoff_rtinit_size (abfd))
3689     return FALSE;
3690 
3691   initsz = (init == NULL ? 0 : 1 + strlen (init));
3692   finisz = (fini == NULL ? 0 : 1 + strlen (fini));
3693 
3694   /* file header */
3695   memset (filehdr_ext, 0, FILHSZ);
3696   memset (&filehdr, 0, sizeof (struct internal_filehdr));
3697   filehdr.f_magic = bfd_xcoff_magic_number (abfd);
3698   filehdr.f_nscns = 1;
3699   filehdr.f_timdat = 0;
3700   filehdr.f_nsyms = 0;  /* at least 6, no more than 10 */
3701   filehdr.f_symptr = 0; /* set below */
3702   filehdr.f_opthdr = 0;
3703   filehdr.f_flags = 0;
3704 
3705   /* section header */
3706   memset (scnhdr_ext, 0, SCNHSZ);
3707   memset (&scnhdr, 0, sizeof (struct internal_scnhdr));
3708   memcpy (scnhdr.s_name, data_name, strlen (data_name));
3709   scnhdr.s_paddr = 0;
3710   scnhdr.s_vaddr = 0;
3711   scnhdr.s_size = 0;    /* set below */
3712   scnhdr.s_scnptr = FILHSZ + SCNHSZ;
3713   scnhdr.s_relptr = 0;  /* set below */
3714   scnhdr.s_lnnoptr = 0;
3715   scnhdr.s_nreloc = 0;  /* either 1 or 2 */
3716   scnhdr.s_nlnno = 0;
3717   scnhdr.s_flags = STYP_DATA;
3718 
3719   /* .data
3720      0x0000	      0x00000000 : rtl
3721      0x0004	      0x00000010 : offset to init, or 0
3722      0x0008	      0x00000028 : offset to fini, or 0
3723      0x000C	      0x0000000C : size of descriptor
3724      0x0010	      0x00000000 : init, needs a reloc
3725      0x0014	      0x00000040 : offset to init name
3726      0x0018	      0x00000000 : flags, padded to a word
3727      0x001C	      0x00000000 : empty init
3728      0x0020	      0x00000000 :
3729      0x0024	      0x00000000 :
3730      0x0028	      0x00000000 : fini, needs a reloc
3731      0x002C	      0x00000??? : offset to fini name
3732      0x0030	      0x00000000 : flags, padded to a word
3733      0x0034	      0x00000000 : empty fini
3734      0x0038	      0x00000000 :
3735      0x003C	      0x00000000 :
3736      0x0040	      init name
3737      0x0040 + initsz  fini name */
3738 
3739   data_buffer_size = 0x0040 + initsz + finisz;
3740   data_buffer_size = (data_buffer_size + 7) &~ (bfd_size_type) 7;
3741   data_buffer = NULL;
3742   data_buffer = (bfd_byte *) bfd_zmalloc (data_buffer_size);
3743   if (data_buffer == NULL)
3744     return FALSE;
3745 
3746   if (initsz)
3747     {
3748       val = 0x10;
3749       bfd_h_put_32 (abfd, val, &data_buffer[0x04]);
3750       val = 0x40;
3751       bfd_h_put_32 (abfd, val, &data_buffer[0x14]);
3752       memcpy (&data_buffer[val], init, initsz);
3753     }
3754 
3755   if (finisz)
3756     {
3757       val = 0x28;
3758       bfd_h_put_32 (abfd, val, &data_buffer[0x08]);
3759       val = 0x40 + initsz;
3760       bfd_h_put_32 (abfd, val, &data_buffer[0x2C]);
3761       memcpy (&data_buffer[val], fini, finisz);
3762     }
3763 
3764   val = 0x0C;
3765   bfd_h_put_32 (abfd, val, &data_buffer[0x0C]);
3766 
3767   scnhdr.s_size = data_buffer_size;
3768 
3769   /* string table */
3770   string_table_size = 0;
3771   if (initsz > 9)
3772     string_table_size += initsz;
3773   if (finisz > 9)
3774     string_table_size += finisz;
3775   if (string_table_size)
3776     {
3777       string_table_size += 4;
3778       string_table = (bfd_byte *) bfd_zmalloc (string_table_size);
3779       if (string_table == NULL)
3780 	return FALSE;
3781 
3782       val = string_table_size;
3783       bfd_h_put_32 (abfd, val, &string_table[0]);
3784       st_tmp = string_table + 4;
3785     }
3786 
3787   /* symbols
3788      0. .data csect
3789      2. __rtinit
3790      4. init function
3791      6. fini function
3792      8. __rtld  */
3793   memset (syment_ext, 0, 10 * SYMESZ);
3794   memset (reloc_ext, 0, 3 * RELSZ);
3795 
3796   /* .data csect */
3797   memset (&syment, 0, sizeof (struct internal_syment));
3798   memset (&auxent, 0, sizeof (union internal_auxent));
3799   memcpy (syment._n._n_name, data_name, strlen (data_name));
3800   syment.n_scnum = 1;
3801   syment.n_sclass = C_HIDEXT;
3802   syment.n_numaux = 1;
3803   auxent.x_csect.x_scnlen.l = data_buffer_size;
3804   auxent.x_csect.x_smtyp = 3 << 3 | XTY_SD;
3805   auxent.x_csect.x_smclas = XMC_RW;
3806   bfd_coff_swap_sym_out (abfd, &syment,
3807 			 &syment_ext[filehdr.f_nsyms * SYMESZ]);
3808   bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3809 			 syment.n_numaux,
3810 			 &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3811   filehdr.f_nsyms += 2;
3812 
3813   /* __rtinit */
3814   memset (&syment, 0, sizeof (struct internal_syment));
3815   memset (&auxent, 0, sizeof (union internal_auxent));
3816   memcpy (syment._n._n_name, rtinit_name, strlen (rtinit_name));
3817   syment.n_scnum = 1;
3818   syment.n_sclass = C_EXT;
3819   syment.n_numaux = 1;
3820   auxent.x_csect.x_smtyp = XTY_LD;
3821   auxent.x_csect.x_smclas = XMC_RW;
3822   bfd_coff_swap_sym_out (abfd, &syment,
3823 			 &syment_ext[filehdr.f_nsyms * SYMESZ]);
3824   bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3825 			 syment.n_numaux,
3826 			 &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3827   filehdr.f_nsyms += 2;
3828 
3829   /* init */
3830   if (initsz)
3831     {
3832       memset (&syment, 0, sizeof (struct internal_syment));
3833       memset (&auxent, 0, sizeof (union internal_auxent));
3834 
3835       if (initsz > 9)
3836 	{
3837 	  syment._n._n_n._n_offset = st_tmp - string_table;
3838 	  memcpy (st_tmp, init, initsz);
3839 	  st_tmp += initsz;
3840 	}
3841       else
3842 	memcpy (syment._n._n_name, init, initsz - 1);
3843 
3844       syment.n_sclass = C_EXT;
3845       syment.n_numaux = 1;
3846       bfd_coff_swap_sym_out (abfd, &syment,
3847 			     &syment_ext[filehdr.f_nsyms * SYMESZ]);
3848       bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3849 			     syment.n_numaux,
3850 			     &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3851 
3852       /* reloc */
3853       memset (&reloc, 0, sizeof (struct internal_reloc));
3854       reloc.r_vaddr = 0x0010;
3855       reloc.r_symndx = filehdr.f_nsyms;
3856       reloc.r_type = R_POS;
3857       reloc.r_size = 31;
3858       bfd_coff_swap_reloc_out (abfd, &reloc, &reloc_ext[0]);
3859 
3860       filehdr.f_nsyms += 2;
3861       scnhdr.s_nreloc += 1;
3862     }
3863 
3864   /* fini */
3865   if (finisz)
3866     {
3867       memset (&syment, 0, sizeof (struct internal_syment));
3868       memset (&auxent, 0, sizeof (union internal_auxent));
3869 
3870       if (finisz > 9)
3871 	{
3872 	  syment._n._n_n._n_offset = st_tmp - string_table;
3873 	  memcpy (st_tmp, fini, finisz);
3874 	  st_tmp += finisz;
3875 	}
3876       else
3877 	memcpy (syment._n._n_name, fini, finisz - 1);
3878 
3879       syment.n_sclass = C_EXT;
3880       syment.n_numaux = 1;
3881       bfd_coff_swap_sym_out (abfd, &syment,
3882 			     &syment_ext[filehdr.f_nsyms * SYMESZ]);
3883       bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3884 			     syment.n_numaux,
3885 			     &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3886 
3887       /* reloc */
3888       memset (&reloc, 0, sizeof (struct internal_reloc));
3889       reloc.r_vaddr = 0x0028;
3890       reloc.r_symndx = filehdr.f_nsyms;
3891       reloc.r_type = R_POS;
3892       reloc.r_size = 31;
3893       bfd_coff_swap_reloc_out (abfd, &reloc,
3894 			       &reloc_ext[scnhdr.s_nreloc * RELSZ]);
3895 
3896       filehdr.f_nsyms += 2;
3897       scnhdr.s_nreloc += 1;
3898     }
3899 
3900   if (rtld)
3901     {
3902       memset (&syment, 0, sizeof (struct internal_syment));
3903       memset (&auxent, 0, sizeof (union internal_auxent));
3904       memcpy (syment._n._n_name, rtld_name, strlen (rtld_name));
3905       syment.n_sclass = C_EXT;
3906       syment.n_numaux = 1;
3907       bfd_coff_swap_sym_out (abfd, &syment,
3908 			     &syment_ext[filehdr.f_nsyms * SYMESZ]);
3909       bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3910 			     syment.n_numaux,
3911 			     &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3912 
3913       /* reloc */
3914       memset (&reloc, 0, sizeof (struct internal_reloc));
3915       reloc.r_vaddr = 0x0000;
3916       reloc.r_symndx = filehdr.f_nsyms;
3917       reloc.r_type = R_POS;
3918       reloc.r_size = 31;
3919       bfd_coff_swap_reloc_out (abfd, &reloc,
3920 			       &reloc_ext[scnhdr.s_nreloc * RELSZ]);
3921 
3922       filehdr.f_nsyms += 2;
3923       scnhdr.s_nreloc += 1;
3924     }
3925 
3926   scnhdr.s_relptr = scnhdr.s_scnptr + data_buffer_size;
3927   filehdr.f_symptr = scnhdr.s_relptr + scnhdr.s_nreloc * RELSZ;
3928 
3929   bfd_coff_swap_filehdr_out (abfd, &filehdr, filehdr_ext);
3930   bfd_bwrite (filehdr_ext, FILHSZ, abfd);
3931   bfd_coff_swap_scnhdr_out (abfd, &scnhdr, scnhdr_ext);
3932   bfd_bwrite (scnhdr_ext, SCNHSZ, abfd);
3933   bfd_bwrite (data_buffer, data_buffer_size, abfd);
3934   bfd_bwrite (reloc_ext, scnhdr.s_nreloc * RELSZ, abfd);
3935   bfd_bwrite (syment_ext, filehdr.f_nsyms * SYMESZ, abfd);
3936   bfd_bwrite (string_table, string_table_size, abfd);
3937 
3938   free (data_buffer);
3939   data_buffer = NULL;
3940 
3941   return TRUE;
3942 }
3943 
3944 
3945 static reloc_howto_type xcoff_dynamic_reloc =
3946 HOWTO (0,			/* type */
3947        0,			/* rightshift */
3948        2,			/* size (0 = byte, 1 = short, 2 = long) */
3949        32,			/* bitsize */
3950        FALSE,			/* pc_relative */
3951        0,			/* bitpos */
3952        complain_overflow_bitfield, /* complain_on_overflow */
3953        0,			/* special_function */
3954        "R_POS",			/* name */
3955        TRUE,			/* partial_inplace */
3956        0xffffffff,		/* src_mask */
3957        0xffffffff,		/* dst_mask */
3958        FALSE);			/* pcrel_offset */
3959 
3960 /*  glink
3961 
3962    The first word of global linkage code must be modified by filling in
3963    the correct TOC offset.  */
3964 
3965 static unsigned long xcoff_glink_code[9] =
3966   {
3967     0x81820000,	/* lwz r12,0(r2) */
3968     0x90410014,	/* stw r2,20(r1) */
3969     0x800c0000,	/* lwz r0,0(r12) */
3970     0x804c0004,	/* lwz r2,4(r12) */
3971     0x7c0903a6,	/* mtctr r0 */
3972     0x4e800420,	/* bctr */
3973     0x00000000,	/* start of traceback table */
3974     0x000c8000,	/* traceback table */
3975     0x00000000,	/* traceback table */
3976   };
3977 
3978 
3979 static const struct xcoff_backend_data_rec bfd_xcoff_backend_data =
3980   {
3981     { /* COFF backend, defined in libcoff.h.  */
3982       _bfd_xcoff_swap_aux_in,
3983       _bfd_xcoff_swap_sym_in,
3984       coff_swap_lineno_in,
3985       _bfd_xcoff_swap_aux_out,
3986       _bfd_xcoff_swap_sym_out,
3987       coff_swap_lineno_out,
3988       xcoff_swap_reloc_out,
3989       coff_swap_filehdr_out,
3990       coff_swap_aouthdr_out,
3991       coff_swap_scnhdr_out,
3992       FILHSZ,
3993       AOUTSZ,
3994       SCNHSZ,
3995       SYMESZ,
3996       AUXESZ,
3997       RELSZ,
3998       LINESZ,
3999       FILNMLEN,
4000       TRUE,			/* _bfd_coff_long_filenames */
4001       FALSE,			/* _bfd_coff_long_section_names */
4002       3,			/* _bfd_coff_default_section_alignment_power */
4003       FALSE,			/* _bfd_coff_force_symnames_in_strings */
4004       2,			/* _bfd_coff_debug_string_prefix_length */
4005       coff_swap_filehdr_in,
4006       coff_swap_aouthdr_in,
4007       coff_swap_scnhdr_in,
4008       xcoff_swap_reloc_in,
4009       coff_bad_format_hook,
4010       coff_set_arch_mach_hook,
4011       coff_mkobject_hook,
4012       styp_to_sec_flags,
4013       coff_set_alignment_hook,
4014       coff_slurp_symbol_table,
4015       symname_in_debug_hook,
4016       coff_pointerize_aux_hook,
4017       coff_print_aux,
4018       dummy_reloc16_extra_cases,
4019       dummy_reloc16_estimate,
4020       NULL,			/* bfd_coff_sym_is_global */
4021       coff_compute_section_file_positions,
4022       NULL,			/* _bfd_coff_start_final_link */
4023       xcoff_ppc_relocate_section,
4024       coff_rtype_to_howto,
4025       NULL,			/* _bfd_coff_adjust_symndx */
4026       _bfd_generic_link_add_one_symbol,
4027       coff_link_output_has_begun,
4028       coff_final_link_postscript
4029     },
4030 
4031     0x01DF,			/* magic number */
4032     bfd_arch_rs6000,
4033     bfd_mach_rs6k,
4034 
4035     /* Function pointers to xcoff specific swap routines.  */
4036     xcoff_swap_ldhdr_in,
4037     xcoff_swap_ldhdr_out,
4038     xcoff_swap_ldsym_in,
4039     xcoff_swap_ldsym_out,
4040     xcoff_swap_ldrel_in,
4041     xcoff_swap_ldrel_out,
4042 
4043     /* Sizes.  */
4044     LDHDRSZ,
4045     LDSYMSZ,
4046     LDRELSZ,
4047     12,				/* _xcoff_function_descriptor_size */
4048     SMALL_AOUTSZ,
4049 
4050     /* Versions.  */
4051     1,				/* _xcoff_ldhdr_version */
4052 
4053     _bfd_xcoff_put_symbol_name,
4054     _bfd_xcoff_put_ldsymbol_name,
4055     &xcoff_dynamic_reloc,
4056     xcoff_create_csect_from_smclas,
4057 
4058     /* Lineno and reloc count overflow.  */
4059     xcoff_is_lineno_count_overflow,
4060     xcoff_is_reloc_count_overflow,
4061 
4062     xcoff_loader_symbol_offset,
4063     xcoff_loader_reloc_offset,
4064 
4065     /* glink.  */
4066     &xcoff_glink_code[0],
4067     36,				/* _xcoff_glink_size */
4068 
4069     /* rtinit */
4070     64,				/* _xcoff_rtinit_size */
4071     xcoff_generate_rtinit,
4072   };
4073 
4074 /* The transfer vector that leads the outside world to all of the above.  */
4075 const bfd_target rs6000coff_vec =
4076   {
4077     "aixcoff-rs6000",
4078     bfd_target_xcoff_flavour,
4079     BFD_ENDIAN_BIG,		/* data byte order is big */
4080     BFD_ENDIAN_BIG,		/* header byte order is big */
4081 
4082     (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
4083      | HAS_SYMS | HAS_LOCALS | WP_TEXT),
4084 
4085     SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
4086     0,				/* leading char */
4087     '/',			/* ar_pad_char */
4088     15,				/* ar_max_namelen */
4089 
4090     /* data */
4091     bfd_getb64,
4092     bfd_getb_signed_64,
4093     bfd_putb64,
4094     bfd_getb32,
4095     bfd_getb_signed_32,
4096     bfd_putb32,
4097     bfd_getb16,
4098     bfd_getb_signed_16,
4099     bfd_putb16,
4100 
4101     /* hdrs */
4102     bfd_getb64,
4103     bfd_getb_signed_64,
4104     bfd_putb64,
4105     bfd_getb32,
4106     bfd_getb_signed_32,
4107     bfd_putb32,
4108     bfd_getb16,
4109     bfd_getb_signed_16,
4110     bfd_putb16,
4111 
4112     { /* bfd_check_format */
4113       _bfd_dummy_target,
4114       coff_object_p,
4115       _bfd_xcoff_archive_p,
4116       CORE_FILE_P
4117     },
4118 
4119     { /* bfd_set_format */
4120       bfd_false,
4121       coff_mkobject,
4122       _bfd_generic_mkarchive,
4123       bfd_false
4124     },
4125 
4126     {/* bfd_write_contents */
4127       bfd_false,
4128       coff_write_object_contents,
4129       _bfd_xcoff_write_archive_contents,
4130       bfd_false
4131     },
4132 
4133     /* Generic */
4134     bfd_true,
4135     bfd_true,
4136     coff_new_section_hook,
4137     _bfd_generic_get_section_contents,
4138     _bfd_generic_get_section_contents_in_window,
4139 
4140     /* Copy */
4141     _bfd_xcoff_copy_private_bfd_data,
4142     ((bfd_boolean (*) (bfd *, bfd *)) bfd_true),
4143     ((bfd_boolean (*) (bfd *, asection *, bfd *, asection *)) bfd_true),
4144     ((bfd_boolean (*) (bfd *, asymbol *, bfd *, asymbol *)) bfd_true),
4145     ((bfd_boolean (*) (bfd *, flagword)) bfd_true),
4146     ((bfd_boolean (*) (bfd *, void * )) bfd_true),
4147 
4148     /* Core */
4149     coff_core_file_failing_command,
4150     coff_core_file_failing_signal,
4151     coff_core_file_matches_executable_p,
4152 
4153     /* Archive */
4154     _bfd_xcoff_slurp_armap,
4155     bfd_false,
4156     ((bfd_boolean (*) (bfd *, char **, bfd_size_type *, const char **)) bfd_false),
4157     bfd_dont_truncate_arname,
4158     _bfd_xcoff_write_armap,
4159     _bfd_xcoff_read_ar_hdr,
4160     _bfd_xcoff_openr_next_archived_file,
4161     _bfd_generic_get_elt_at_index,
4162     _bfd_xcoff_stat_arch_elt,
4163     bfd_true,
4164 
4165     /* Symbols */
4166     coff_get_symtab_upper_bound,
4167     coff_canonicalize_symtab,
4168     coff_make_empty_symbol,
4169     coff_print_symbol,
4170     coff_get_symbol_info,
4171     _bfd_xcoff_is_local_label_name,
4172     coff_get_lineno,
4173     coff_find_nearest_line,
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_discard_group,
4200 
4201     /* Dynamic */
4202     _bfd_xcoff_get_dynamic_symtab_upper_bound,
4203     _bfd_xcoff_canonicalize_dynamic_symtab,
4204     _bfd_xcoff_get_dynamic_reloc_upper_bound,
4205     _bfd_xcoff_canonicalize_dynamic_reloc,
4206 
4207     /* Opposite endian version, none exists */
4208     NULL,
4209 
4210     (void *) &bfd_xcoff_backend_data,
4211   };
4212 
4213 /* xcoff-powermac target
4214    Old target.
4215    Only difference between this target and the rs6000 target is the
4216    the default architecture and machine type used in coffcode.h
4217 
4218    PowerPC Macs use the same magic numbers as RS/6000
4219    (because that's how they were bootstrapped originally),
4220    but they are always PowerPC architecture.  */
4221 static const struct xcoff_backend_data_rec bfd_pmac_xcoff_backend_data =
4222   {
4223     { /* COFF backend, defined in libcoff.h.  */
4224       _bfd_xcoff_swap_aux_in,
4225       _bfd_xcoff_swap_sym_in,
4226       coff_swap_lineno_in,
4227       _bfd_xcoff_swap_aux_out,
4228       _bfd_xcoff_swap_sym_out,
4229       coff_swap_lineno_out,
4230       xcoff_swap_reloc_out,
4231       coff_swap_filehdr_out,
4232       coff_swap_aouthdr_out,
4233       coff_swap_scnhdr_out,
4234       FILHSZ,
4235       AOUTSZ,
4236       SCNHSZ,
4237       SYMESZ,
4238       AUXESZ,
4239       RELSZ,
4240       LINESZ,
4241       FILNMLEN,
4242       TRUE,			/* _bfd_coff_long_filenames */
4243       FALSE,			/* _bfd_coff_long_section_names */
4244       3,			/* _bfd_coff_default_section_alignment_power */
4245       FALSE,			/* _bfd_coff_force_symnames_in_strings */
4246       2,			/* _bfd_coff_debug_string_prefix_length */
4247       coff_swap_filehdr_in,
4248       coff_swap_aouthdr_in,
4249       coff_swap_scnhdr_in,
4250       xcoff_swap_reloc_in,
4251       coff_bad_format_hook,
4252       coff_set_arch_mach_hook,
4253       coff_mkobject_hook,
4254       styp_to_sec_flags,
4255       coff_set_alignment_hook,
4256       coff_slurp_symbol_table,
4257       symname_in_debug_hook,
4258       coff_pointerize_aux_hook,
4259       coff_print_aux,
4260       dummy_reloc16_extra_cases,
4261       dummy_reloc16_estimate,
4262       NULL,			/* bfd_coff_sym_is_global */
4263       coff_compute_section_file_positions,
4264       NULL,			/* _bfd_coff_start_final_link */
4265       xcoff_ppc_relocate_section,
4266       coff_rtype_to_howto,
4267       NULL,			/* _bfd_coff_adjust_symndx */
4268       _bfd_generic_link_add_one_symbol,
4269       coff_link_output_has_begun,
4270       coff_final_link_postscript
4271     },
4272 
4273     0x01DF,			/* magic number */
4274     bfd_arch_powerpc,
4275     bfd_mach_ppc,
4276 
4277     /* Function pointers to xcoff specific swap routines.  */
4278     xcoff_swap_ldhdr_in,
4279     xcoff_swap_ldhdr_out,
4280     xcoff_swap_ldsym_in,
4281     xcoff_swap_ldsym_out,
4282     xcoff_swap_ldrel_in,
4283     xcoff_swap_ldrel_out,
4284 
4285     /* Sizes.  */
4286     LDHDRSZ,
4287     LDSYMSZ,
4288     LDRELSZ,
4289     12,				/* _xcoff_function_descriptor_size */
4290     SMALL_AOUTSZ,
4291 
4292     /* Versions.  */
4293     1,				/* _xcoff_ldhdr_version */
4294 
4295     _bfd_xcoff_put_symbol_name,
4296     _bfd_xcoff_put_ldsymbol_name,
4297     &xcoff_dynamic_reloc,
4298     xcoff_create_csect_from_smclas,
4299 
4300     /* Lineno and reloc count overflow.  */
4301     xcoff_is_lineno_count_overflow,
4302     xcoff_is_reloc_count_overflow,
4303 
4304     xcoff_loader_symbol_offset,
4305     xcoff_loader_reloc_offset,
4306 
4307     /* glink.  */
4308     &xcoff_glink_code[0],
4309     36,				/* _xcoff_glink_size */
4310 
4311     /* rtinit */
4312     0,				/* _xcoff_rtinit_size */
4313     xcoff_generate_rtinit,
4314   };
4315 
4316 /* The transfer vector that leads the outside world to all of the above.  */
4317 const bfd_target pmac_xcoff_vec =
4318   {
4319     "xcoff-powermac",
4320     bfd_target_xcoff_flavour,
4321     BFD_ENDIAN_BIG,		/* data byte order is big */
4322     BFD_ENDIAN_BIG,		/* header byte order is big */
4323 
4324     (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
4325      | HAS_SYMS | HAS_LOCALS | WP_TEXT),
4326 
4327     SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
4328     0,				/* leading char */
4329     '/',			/* ar_pad_char */
4330     15,				/* ar_max_namelen */
4331 
4332     /* data */
4333     bfd_getb64,
4334     bfd_getb_signed_64,
4335     bfd_putb64,
4336     bfd_getb32,
4337     bfd_getb_signed_32,
4338     bfd_putb32,
4339     bfd_getb16,
4340     bfd_getb_signed_16,
4341     bfd_putb16,
4342 
4343     /* hdrs */
4344     bfd_getb64,
4345     bfd_getb_signed_64,
4346     bfd_putb64,
4347     bfd_getb32,
4348     bfd_getb_signed_32,
4349     bfd_putb32,
4350     bfd_getb16,
4351     bfd_getb_signed_16,
4352     bfd_putb16,
4353 
4354     { /* bfd_check_format */
4355       _bfd_dummy_target,
4356       coff_object_p,
4357       _bfd_xcoff_archive_p,
4358       CORE_FILE_P
4359     },
4360 
4361     { /* bfd_set_format */
4362       bfd_false,
4363       coff_mkobject,
4364       _bfd_generic_mkarchive,
4365       bfd_false
4366     },
4367 
4368     {/* bfd_write_contents */
4369       bfd_false,
4370       coff_write_object_contents,
4371       _bfd_xcoff_write_archive_contents,
4372       bfd_false
4373     },
4374 
4375     /* Generic */
4376     bfd_true,
4377     bfd_true,
4378     coff_new_section_hook,
4379     _bfd_generic_get_section_contents,
4380     _bfd_generic_get_section_contents_in_window,
4381 
4382     /* Copy */
4383     _bfd_xcoff_copy_private_bfd_data,
4384     ((bfd_boolean (*) (bfd *, bfd *)) bfd_true),
4385     ((bfd_boolean (*) (bfd *, asection *, bfd *, asection *)) bfd_true),
4386     ((bfd_boolean (*) (bfd *, asymbol *, bfd *, asymbol *)) bfd_true),
4387     ((bfd_boolean (*) (bfd *, flagword)) bfd_true),
4388     ((bfd_boolean (*) (bfd *, void * )) bfd_true),
4389 
4390     /* Core */
4391     coff_core_file_failing_command,
4392     coff_core_file_failing_signal,
4393     coff_core_file_matches_executable_p,
4394 
4395     /* Archive */
4396     _bfd_xcoff_slurp_armap,
4397     bfd_false,
4398     ((bfd_boolean (*) (bfd *, char **, bfd_size_type *, const char **)) bfd_false),
4399     bfd_dont_truncate_arname,
4400     _bfd_xcoff_write_armap,
4401     _bfd_xcoff_read_ar_hdr,
4402     _bfd_xcoff_openr_next_archived_file,
4403     _bfd_generic_get_elt_at_index,
4404     _bfd_xcoff_stat_arch_elt,
4405     bfd_true,
4406 
4407     /* Symbols */
4408     coff_get_symtab_upper_bound,
4409     coff_canonicalize_symtab,
4410     coff_make_empty_symbol,
4411     coff_print_symbol,
4412     coff_get_symbol_info,
4413     _bfd_xcoff_is_local_label_name,
4414     coff_get_lineno,
4415     coff_find_nearest_line,
4416     coff_bfd_make_debug_symbol,
4417     _bfd_generic_read_minisymbols,
4418     _bfd_generic_minisymbol_to_symbol,
4419 
4420     /* Reloc */
4421     coff_get_reloc_upper_bound,
4422     coff_canonicalize_reloc,
4423     _bfd_xcoff_reloc_type_lookup,
4424 
4425     /* Write */
4426     coff_set_arch_mach,
4427     coff_set_section_contents,
4428 
4429     /* Link */
4430     _bfd_xcoff_sizeof_headers,
4431     bfd_generic_get_relocated_section_contents,
4432     bfd_generic_relax_section,
4433     _bfd_xcoff_bfd_link_hash_table_create,
4434     _bfd_generic_link_hash_table_free,
4435     _bfd_xcoff_bfd_link_add_symbols,
4436     _bfd_generic_link_just_syms,
4437     _bfd_xcoff_bfd_final_link,
4438     _bfd_generic_link_split_section,
4439     bfd_generic_gc_sections,
4440     bfd_generic_merge_sections,
4441     bfd_generic_discard_group,
4442 
4443     /* Dynamic */
4444     _bfd_xcoff_get_dynamic_symtab_upper_bound,
4445     _bfd_xcoff_canonicalize_dynamic_symtab,
4446     _bfd_xcoff_get_dynamic_reloc_upper_bound,
4447     _bfd_xcoff_canonicalize_dynamic_reloc,
4448 
4449     /* Opposite endian version, none exists */
4450     NULL,
4451 
4452     (void *) &bfd_pmac_xcoff_backend_data,
4453   };
4454