Upload Tizen:Base source
[external/binutils.git] / bfd / coff64-rs6000.c
1 /* BFD back-end for IBM RS/6000 "XCOFF64" files.
2    Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3    2010
4    Free Software Foundation, Inc.
5    Written Clinton Popetz.
6    Contributed by Cygnus Support.
7
8    This file is part of BFD, the Binary File Descriptor library.
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 3 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23    MA 02110-1301, USA.  */
24
25 #include "sysdep.h"
26 #include "bfd.h"
27 #include "bfdlink.h"
28 #include "libbfd.h"
29 #include "coff/internal.h"
30 #include "coff/xcoff.h"
31 #include "coff/rs6k64.h"
32 #include "libcoff.h"
33 #include "libxcoff.h"
34
35 #define GET_FILEHDR_SYMPTR H_GET_64
36 #define PUT_FILEHDR_SYMPTR H_PUT_64
37 #define GET_AOUTHDR_DATA_START H_GET_64
38 #define PUT_AOUTHDR_DATA_START H_PUT_64
39 #define GET_AOUTHDR_TEXT_START H_GET_64
40 #define PUT_AOUTHDR_TEXT_START H_PUT_64
41 #define GET_AOUTHDR_TSIZE H_GET_64
42 #define PUT_AOUTHDR_TSIZE H_PUT_64
43 #define GET_AOUTHDR_DSIZE H_GET_64
44 #define PUT_AOUTHDR_DSIZE H_PUT_64
45 #define GET_AOUTHDR_BSIZE H_GET_64
46 #define PUT_AOUTHDR_BSIZE H_PUT_64
47 #define GET_AOUTHDR_ENTRY H_GET_64
48 #define PUT_AOUTHDR_ENTRY H_PUT_64
49 #define GET_SCNHDR_PADDR H_GET_64
50 #define PUT_SCNHDR_PADDR H_PUT_64
51 #define GET_SCNHDR_VADDR H_GET_64
52 #define PUT_SCNHDR_VADDR H_PUT_64
53 #define GET_SCNHDR_SIZE H_GET_64
54 #define PUT_SCNHDR_SIZE H_PUT_64
55 #define GET_SCNHDR_SCNPTR H_GET_64
56 #define PUT_SCNHDR_SCNPTR H_PUT_64
57 #define GET_SCNHDR_RELPTR H_GET_64
58 #define PUT_SCNHDR_RELPTR H_PUT_64
59 #define GET_SCNHDR_LNNOPTR H_GET_64
60 #define PUT_SCNHDR_LNNOPTR H_PUT_64
61 #define GET_SCNHDR_NRELOC H_GET_32
62 #define MAX_SCNHDR_NRELOC 0xffffffff
63 #define PUT_SCNHDR_NRELOC H_PUT_32
64 #define GET_SCNHDR_NLNNO H_GET_32
65 #define MAX_SCNHDR_NLNNO 0xffffffff
66 #define PUT_SCNHDR_NLNNO H_PUT_32
67 #define GET_RELOC_VADDR H_GET_64
68 #define PUT_RELOC_VADDR H_PUT_64
69
70 #define COFF_FORCE_SYMBOLS_IN_STRINGS
71 #define COFF_DEBUG_STRING_WIDE_PREFIX
72
73
74 #define COFF_ADJUST_SCNHDR_OUT_POST(ABFD, INT, EXT)                     \
75   do                                                                    \
76     {                                                                   \
77       memset (((SCNHDR *) EXT)->s_pad, 0,                               \
78               sizeof (((SCNHDR *) EXT)->s_pad));                        \
79     }                                                                   \
80   while (0)
81
82 #define NO_COFF_LINENOS
83
84 #define coff_SWAP_lineno_in _bfd_xcoff64_swap_lineno_in
85 #define coff_SWAP_lineno_out _bfd_xcoff64_swap_lineno_out
86
87 static void _bfd_xcoff64_swap_lineno_in
88   PARAMS ((bfd *, PTR, PTR));
89 static unsigned int _bfd_xcoff64_swap_lineno_out
90   PARAMS ((bfd *, PTR, PTR));
91 static bfd_boolean _bfd_xcoff64_put_symbol_name
92   PARAMS ((bfd *, struct bfd_strtab_hash *, struct internal_syment *,
93            const char *));
94 static bfd_boolean _bfd_xcoff64_put_ldsymbol_name
95   PARAMS ((bfd *, struct xcoff_loader_info *, struct internal_ldsym *,
96            const char *));
97 static void _bfd_xcoff64_swap_sym_in
98   PARAMS ((bfd *, PTR, PTR));
99 static unsigned int _bfd_xcoff64_swap_sym_out
100   PARAMS ((bfd *, PTR, PTR));
101 static void _bfd_xcoff64_swap_aux_in
102   PARAMS ((bfd *, PTR, int, int, int, int, PTR));
103 static unsigned int _bfd_xcoff64_swap_aux_out
104   PARAMS ((bfd *, PTR, int, int, int, int, PTR));
105 static void xcoff64_swap_reloc_in
106   PARAMS ((bfd *, PTR, PTR));
107 static unsigned int xcoff64_swap_reloc_out
108   PARAMS ((bfd *, PTR, PTR));
109 extern bfd_boolean _bfd_xcoff_mkobject
110   PARAMS ((bfd *));
111 extern bfd_boolean _bfd_xcoff_copy_private_bfd_data
112   PARAMS ((bfd *, bfd *));
113 extern bfd_boolean _bfd_xcoff_is_local_label_name
114   PARAMS ((bfd *, const char *));
115 extern void xcoff64_rtype2howto
116   PARAMS ((arelent *, struct internal_reloc *));
117 extern reloc_howto_type * xcoff64_reloc_type_lookup
118   PARAMS ((bfd *, bfd_reloc_code_real_type));
119 extern bfd_boolean _bfd_xcoff_slurp_armap
120   PARAMS ((bfd *));
121 extern PTR _bfd_xcoff_read_ar_hdr
122   PARAMS ((bfd *));
123 extern bfd *_bfd_xcoff_openr_next_archived_file
124   PARAMS ((bfd *, bfd *));
125 extern int _bfd_xcoff_stat_arch_elt
126   PARAMS ((bfd *, struct stat *));
127 extern bfd_boolean _bfd_xcoff_write_armap
128   PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int));
129 extern bfd_boolean _bfd_xcoff_write_archive_contents
130   PARAMS ((bfd *));
131 extern int _bfd_xcoff_sizeof_headers
132   PARAMS ((bfd *, struct bfd_link_info *));
133 extern void _bfd_xcoff_swap_sym_in
134   PARAMS ((bfd *, PTR, PTR));
135 extern unsigned int _bfd_xcoff_swap_sym_out
136   PARAMS ((bfd *, PTR, PTR));
137 extern void _bfd_xcoff_swap_aux_in
138   PARAMS ((bfd *, PTR, int, int, int, int, PTR));
139 extern unsigned int _bfd_xcoff_swap_aux_out
140   PARAMS ((bfd *, PTR, int, int, int, int, PTR));
141 static void xcoff64_swap_ldhdr_in
142   PARAMS ((bfd *, const PTR, struct internal_ldhdr *));
143 static void xcoff64_swap_ldhdr_out
144   PARAMS ((bfd *, const struct internal_ldhdr *, PTR d));
145 static void xcoff64_swap_ldsym_in
146   PARAMS ((bfd *, const PTR, struct internal_ldsym *));
147 static void xcoff64_swap_ldsym_out
148   PARAMS ((bfd *, const struct internal_ldsym *, PTR d));
149 static void xcoff64_swap_ldrel_in
150   PARAMS ((bfd *, const PTR, struct internal_ldrel *));
151 static void xcoff64_swap_ldrel_out
152   PARAMS ((bfd *, const struct internal_ldrel *, PTR d));
153 static bfd_boolean xcoff64_write_object_contents
154   PARAMS ((bfd *));
155 static bfd_boolean xcoff64_ppc_relocate_section
156   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
157            struct internal_reloc *, struct internal_syment *,
158            asection **));
159 static bfd_boolean xcoff64_slurp_armap
160   PARAMS ((bfd *));
161 static const bfd_target *xcoff64_archive_p
162   PARAMS ((bfd *));
163 static bfd *xcoff64_openr_next_archived_file
164   PARAMS ((bfd *, bfd *));
165 static int xcoff64_sizeof_headers
166   PARAMS ((bfd *, struct bfd_link_info *));
167 static asection *xcoff64_create_csect_from_smclas
168   PARAMS ((bfd *, union internal_auxent *, const char *));
169 static bfd_boolean xcoff64_is_lineno_count_overflow
170   PARAMS ((bfd *, bfd_vma));
171 static bfd_boolean xcoff64_is_reloc_count_overflow
172   PARAMS ((bfd *, bfd_vma));
173 static bfd_vma xcoff64_loader_symbol_offset
174   PARAMS ((bfd *, struct internal_ldhdr *));
175 static bfd_vma xcoff64_loader_reloc_offset
176   PARAMS ((bfd *, struct internal_ldhdr *));
177 static bfd_boolean xcoff64_generate_rtinit
178   PARAMS ((bfd *, const char *, const char *, bfd_boolean));
179 static bfd_boolean xcoff64_bad_format_hook
180   PARAMS ((bfd *, PTR ));
181
182 /* Relocation functions */
183 static bfd_boolean xcoff64_reloc_type_br
184   PARAMS ((XCOFF_RELOC_FUNCTION_ARGS));
185
186 bfd_boolean (*xcoff64_calculate_relocation[XCOFF_MAX_CALCULATE_RELOCATION])
187   PARAMS ((XCOFF_RELOC_FUNCTION_ARGS)) =
188 {
189   xcoff_reloc_type_pos,  /* R_POS   (0x00) */
190   xcoff_reloc_type_neg,  /* R_NEG   (0x01) */
191   xcoff_reloc_type_rel,  /* R_REL   (0x02) */
192   xcoff_reloc_type_toc,  /* R_TOC   (0x03) */
193   xcoff_reloc_type_fail, /* R_RTB   (0x04) */
194   xcoff_reloc_type_toc,  /* R_GL    (0x05) */
195   xcoff_reloc_type_toc,  /* R_TCL   (0x06) */
196   xcoff_reloc_type_fail, /*         (0x07) */
197   xcoff_reloc_type_ba,   /* R_BA    (0x08) */
198   xcoff_reloc_type_fail, /*         (0x09) */
199   xcoff64_reloc_type_br, /* R_BR    (0x0a) */
200   xcoff_reloc_type_fail, /*         (0x0b) */
201   xcoff_reloc_type_pos,  /* R_RL    (0x0c) */
202   xcoff_reloc_type_pos,  /* R_RLA   (0x0d) */
203   xcoff_reloc_type_fail, /*         (0x0e) */
204   xcoff_reloc_type_noop, /* R_REF   (0x0f) */
205   xcoff_reloc_type_fail, /*         (0x10) */
206   xcoff_reloc_type_fail, /*         (0x11) */
207   xcoff_reloc_type_toc,  /* R_TRL   (0x12) */
208   xcoff_reloc_type_toc,  /* R_TRLA  (0x13) */
209   xcoff_reloc_type_fail, /* R_RRTBI (0x14) */
210   xcoff_reloc_type_fail, /* R_RRTBA (0x15) */
211   xcoff_reloc_type_ba,   /* R_CAI   (0x16) */
212   xcoff_reloc_type_crel, /* R_CREL  (0x17) */
213   xcoff_reloc_type_ba,   /* R_RBA   (0x18) */
214   xcoff_reloc_type_ba,   /* R_RBAC  (0x19) */
215   xcoff64_reloc_type_br, /* R_RBR   (0x1a) */
216   xcoff_reloc_type_ba,   /* R_RBRC  (0x1b) */
217 };
218
219 /* coffcode.h needs these to be defined.  */
220 /* Internalcoff.h and coffcode.h modify themselves based on these flags.  */
221 #define XCOFF64
222 #define RS6000COFF_C 1
223
224 #define SELECT_RELOC(internal, howto)                                   \
225   {                                                                     \
226     internal.r_type = howto->type;                                      \
227     internal.r_size =                                                   \
228       ((howto->complain_on_overflow == complain_overflow_signed         \
229         ? 0x80                                                          \
230         : 0)                                                            \
231        | (howto->bitsize - 1));                                         \
232   }
233
234 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
235 #define COFF_LONG_FILENAMES
236 #define NO_COFF_SYMBOLS
237 #define RTYPE2HOWTO(cache_ptr, dst) xcoff64_rtype2howto (cache_ptr, dst)
238 #define coff_mkobject _bfd_xcoff_mkobject
239 #define coff_bfd_copy_private_bfd_data _bfd_xcoff_copy_private_bfd_data
240 #define coff_bfd_is_local_label_name _bfd_xcoff_is_local_label_name
241 #define coff_bfd_reloc_type_lookup xcoff64_reloc_type_lookup
242 #define coff_bfd_reloc_name_lookup xcoff64_reloc_name_lookup
243 #ifdef AIX_CORE
244 extern const bfd_target * rs6000coff_core_p
245   PARAMS ((bfd *abfd));
246 extern bfd_boolean rs6000coff_core_file_matches_executable_p
247   PARAMS ((bfd *cbfd, bfd *ebfd));
248 extern char *rs6000coff_core_file_failing_command
249   PARAMS ((bfd *abfd));
250 extern int rs6000coff_core_file_failing_signal
251   PARAMS ((bfd *abfd));
252 #define CORE_FILE_P rs6000coff_core_p
253 #define coff_core_file_failing_command \
254   rs6000coff_core_file_failing_command
255 #define coff_core_file_failing_signal \
256   rs6000coff_core_file_failing_signal
257 #define coff_core_file_matches_executable_p \
258   rs6000coff_core_file_matches_executable_p
259 #define coff_core_file_pid \
260   _bfd_nocore_core_file_pid
261 #else
262 #define CORE_FILE_P _bfd_dummy_target
263 #define coff_core_file_failing_command \
264   _bfd_nocore_core_file_failing_command
265 #define coff_core_file_failing_signal \
266   _bfd_nocore_core_file_failing_signal
267 #define coff_core_file_matches_executable_p \
268   _bfd_nocore_core_file_matches_executable_p
269 #define coff_core_file_pid \
270   _bfd_nocore_core_file_pid
271 #endif
272 #define coff_SWAP_sym_in _bfd_xcoff64_swap_sym_in
273 #define coff_SWAP_sym_out _bfd_xcoff64_swap_sym_out
274 #define coff_SWAP_aux_in _bfd_xcoff64_swap_aux_in
275 #define coff_SWAP_aux_out _bfd_xcoff64_swap_aux_out
276 #define coff_swap_reloc_in xcoff64_swap_reloc_in
277 #define coff_swap_reloc_out xcoff64_swap_reloc_out
278 #define NO_COFF_RELOCS
279
280 #ifndef bfd_pe_print_pdata
281 #define bfd_pe_print_pdata      NULL
282 #endif
283
284 #include "coffcode.h"
285
286 /* For XCOFF64, the effective width of symndx changes depending on
287    whether we are the first entry.  Sigh.  */
288 static void
289 _bfd_xcoff64_swap_lineno_in (abfd, ext1, in1)
290      bfd *abfd;
291      PTR ext1;
292      PTR in1;
293 {
294   LINENO *ext = (LINENO *) ext1;
295   struct internal_lineno *in = (struct internal_lineno *) in1;
296
297   in->l_lnno = H_GET_32 (abfd, (ext->l_lnno));
298   if (in->l_lnno == 0)
299     in->l_addr.l_symndx = H_GET_32 (abfd, ext->l_addr.l_symndx);
300   else
301     in->l_addr.l_paddr = H_GET_64 (abfd, ext->l_addr.l_paddr);
302 }
303
304 static unsigned int
305 _bfd_xcoff64_swap_lineno_out (abfd, inp, outp)
306      bfd *abfd;
307      PTR inp;
308      PTR outp;
309 {
310   struct internal_lineno *in = (struct internal_lineno *) inp;
311   struct external_lineno *ext = (struct external_lineno *) outp;
312
313   H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx);
314   H_PUT_32 (abfd, in->l_lnno, (ext->l_lnno));
315
316   if (in->l_lnno == 0)
317     H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx);
318   else
319     H_PUT_64 (abfd, in->l_addr.l_paddr, ext->l_addr.l_paddr);
320
321   return bfd_coff_linesz (abfd);
322 }
323
324 static void
325 _bfd_xcoff64_swap_sym_in (abfd, ext1, in1)
326      bfd *abfd;
327      PTR ext1;
328      PTR in1;
329 {
330   struct external_syment *ext = (struct external_syment *) ext1;
331   struct internal_syment *in = (struct internal_syment *) in1;
332
333   in->_n._n_n._n_zeroes = 0;
334   in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e_offset);
335   in->n_value = H_GET_64 (abfd, ext->e_value);
336   in->n_scnum = H_GET_16 (abfd, ext->e_scnum);
337   in->n_type = H_GET_16 (abfd, ext->e_type);
338   in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
339   in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
340 }
341
342 static unsigned int
343 _bfd_xcoff64_swap_sym_out (abfd, inp, extp)
344      bfd *abfd;
345      PTR inp;
346      PTR extp;
347 {
348   struct internal_syment *in = (struct internal_syment *) inp;
349   struct external_syment *ext = (struct external_syment *) extp;
350
351   H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e_offset);
352   H_PUT_64 (abfd, in->n_value, ext->e_value);
353   H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
354   H_PUT_16 (abfd, in->n_type, ext->e_type);
355   H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
356   H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
357   return bfd_coff_symesz (abfd);
358 }
359
360 static void
361 _bfd_xcoff64_swap_aux_in (abfd, ext1, type, in_class, indx, numaux, in1)
362      bfd *abfd;
363      PTR ext1;
364      int type;
365      int in_class;
366      int indx;
367      int numaux;
368      PTR in1;
369 {
370   union external_auxent *ext = (union external_auxent *) ext1;
371   union internal_auxent *in = (union internal_auxent *) in1;
372
373   switch (in_class)
374     {
375     case C_FILE:
376       if (ext->x_file.x_n.x_zeroes[0] == 0)
377         {
378           in->x_file.x_n.x_zeroes = 0;
379           in->x_file.x_n.x_offset = H_GET_32 (abfd, ext->x_file.x_n.x_offset);
380         }
381       else
382         {
383           memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
384         }
385       goto end;
386
387       /* RS/6000 "csect" auxents */
388     case C_EXT:
389     case C_AIX_WEAKEXT:
390     case C_HIDEXT:
391       if (indx + 1 == numaux)
392         {
393           bfd_signed_vma h = 0;
394           bfd_vma l = 0;
395
396           h = H_GET_S32 (abfd, ext->x_csect.x_scnlen_hi);
397           l = H_GET_32 (abfd, ext->x_csect.x_scnlen_lo);
398
399           in->x_csect.x_scnlen.l = h << 32 | (l & 0xffffffff);
400
401           in->x_csect.x_parmhash = H_GET_32 (abfd, ext->x_csect.x_parmhash);
402           in->x_csect.x_snhash = H_GET_16 (abfd, ext->x_csect.x_snhash);
403           /* We don't have to hack bitfields in x_smtyp because it's
404              defined by shifts-and-ands, which are equivalent on all
405              byte orders.  */
406           in->x_csect.x_smtyp = H_GET_8 (abfd, ext->x_csect.x_smtyp);
407           in->x_csect.x_smclas = H_GET_8 (abfd, ext->x_csect.x_smclas);
408           goto end;
409         }
410       break;
411
412     case C_STAT:
413     case C_LEAFSTAT:
414     case C_HIDDEN:
415       if (type == T_NULL)
416         {
417           /* PE defines some extra fields; we zero them out for
418              safety.  */
419           in->x_scn.x_checksum = 0;
420           in->x_scn.x_associated = 0;
421           in->x_scn.x_comdat = 0;
422
423           goto end;
424         }
425       break;
426     }
427
428   if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
429       || ISTAG (in_class))
430     {
431       in->x_sym.x_fcnary.x_fcn.x_lnnoptr
432         = H_GET_64 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
433       in->x_sym.x_fcnary.x_fcn.x_endndx.l
434         = H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx);
435     }
436   if (ISFCN (type))
437     {
438       in->x_sym.x_misc.x_fsize
439         = H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_fsize);
440     }
441   else
442     {
443       in->x_sym.x_misc.x_lnsz.x_lnno
444         = H_GET_32 (abfd, ext->x_sym.x_fcnary.x_lnsz.x_lnno);
445       in->x_sym.x_misc.x_lnsz.x_size
446         = H_GET_16 (abfd, ext->x_sym.x_fcnary.x_lnsz.x_size);
447     }
448
449  end: ;
450 }
451
452 static unsigned int
453 _bfd_xcoff64_swap_aux_out (abfd, inp, type, in_class, indx, numaux, extp)
454      bfd *abfd;
455      PTR inp;
456      int type;
457      int in_class;
458      int indx ATTRIBUTE_UNUSED;
459      int numaux ATTRIBUTE_UNUSED;
460      PTR extp;
461 {
462   union internal_auxent *in = (union internal_auxent *) inp;
463   union external_auxent *ext = (union external_auxent *) extp;
464
465   memset ((PTR) ext, 0, bfd_coff_auxesz (abfd));
466   switch (in_class)
467     {
468     case C_FILE:
469       if (in->x_file.x_n.x_zeroes == 0)
470         {
471           H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes);
472           H_PUT_32 (abfd, in->x_file.x_n.x_offset, ext->x_file.x_n.x_offset);
473         }
474       else
475         {
476           memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
477         }
478       H_PUT_8 (abfd, _AUX_FILE, ext->x_auxtype.x_auxtype);
479       goto end;
480
481       /* RS/6000 "csect" auxents */
482     case C_EXT:
483     case C_AIX_WEAKEXT:
484     case C_HIDEXT:
485       if (indx + 1 == numaux)
486         {
487           bfd_vma temp;
488
489           temp = in->x_csect.x_scnlen.l & 0xffffffff;
490           H_PUT_32 (abfd, temp, ext->x_csect.x_scnlen_lo);
491           temp = in->x_csect.x_scnlen.l >> 32;
492           H_PUT_32 (abfd, temp, ext->x_csect.x_scnlen_hi);
493           H_PUT_32 (abfd, in->x_csect.x_parmhash, ext->x_csect.x_parmhash);
494           H_PUT_16 (abfd, in->x_csect.x_snhash, ext->x_csect.x_snhash);
495           /* We don't have to hack bitfields in x_smtyp because it's
496              defined by shifts-and-ands, which are equivalent on all
497              byte orders.  */
498           H_PUT_8 (abfd, in->x_csect.x_smtyp, ext->x_csect.x_smtyp);
499           H_PUT_8 (abfd, in->x_csect.x_smclas, ext->x_csect.x_smclas);
500           H_PUT_8 (abfd, _AUX_CSECT, ext->x_auxtype.x_auxtype);
501           goto end;
502         }
503       break;
504
505     case C_STAT:
506     case C_LEAFSTAT:
507     case C_HIDDEN:
508       if (type == T_NULL)
509         {
510           goto end;
511         }
512       break;
513     }
514
515   if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
516       || ISTAG (in_class))
517     {
518       H_PUT_64 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
519                ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
520       H_PUT_8 (abfd, _AUX_FCN,
521                ext->x_auxtype.x_auxtype);
522       H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l,
523                ext->x_sym.x_fcnary.x_fcn.x_endndx);
524     }
525   if (ISFCN (type))
526     {
527       H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize,
528                ext->x_sym.x_fcnary.x_fcn.x_fsize);
529     }
530   else
531     {
532       H_PUT_32 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno,
533                ext->x_sym.x_fcnary.x_lnsz.x_lnno);
534       H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_size,
535                ext->x_sym.x_fcnary.x_lnsz.x_size);
536     }
537
538  end:
539
540   return bfd_coff_auxesz (abfd);
541 }
542
543 static bfd_boolean
544 _bfd_xcoff64_put_symbol_name (abfd, strtab, sym, name)
545      bfd *abfd;
546      struct bfd_strtab_hash *strtab;
547      struct internal_syment *sym;
548      const char *name;
549 {
550   bfd_boolean hash;
551   bfd_size_type indx;
552
553   hash = TRUE;
554
555   if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
556     hash = FALSE;
557
558   indx = _bfd_stringtab_add (strtab, name, hash, FALSE);
559
560   if (indx == (bfd_size_type) -1)
561     return FALSE;
562
563   sym->_n._n_n._n_zeroes = 0;
564   sym->_n._n_n._n_offset = STRING_SIZE_SIZE + indx;
565
566   return TRUE;
567 }
568
569 static bfd_boolean
570 _bfd_xcoff64_put_ldsymbol_name (abfd, ldinfo, ldsym, name)
571      bfd *abfd ATTRIBUTE_UNUSED;
572      struct xcoff_loader_info *ldinfo;
573      struct internal_ldsym *ldsym;
574      const char *name;
575 {
576   size_t len;
577   len = strlen (name);
578
579   if (ldinfo->string_size + len + 3 > ldinfo->string_alc)
580     {
581       bfd_size_type newalc;
582       char *newstrings;
583
584       newalc = ldinfo->string_alc * 2;
585       if (newalc == 0)
586         newalc = 32;
587       while (ldinfo->string_size + len + 3 > newalc)
588         newalc *= 2;
589
590       newstrings = bfd_realloc (ldinfo->strings, newalc);
591       if (newstrings == NULL)
592         {
593           ldinfo->failed = TRUE;
594           return FALSE;
595         }
596       ldinfo->string_alc = newalc;
597       ldinfo->strings = newstrings;
598     }
599
600   bfd_put_16 (ldinfo->output_bfd, (bfd_vma) (len + 1),
601               ldinfo->strings + ldinfo->string_size);
602   strcpy (ldinfo->strings + ldinfo->string_size + 2, name);
603   ldsym->_l._l_l._l_zeroes = 0;
604   ldsym->_l._l_l._l_offset = ldinfo->string_size + 2;
605   ldinfo->string_size += len + 3;
606
607   return TRUE;
608 }
609
610 /* Routines to swap information in the XCOFF .loader section.  If we
611    ever need to write an XCOFF loader, this stuff will need to be
612    moved to another file shared by the linker (which XCOFF calls the
613    ``binder'') and the loader.  */
614
615 /* Swap in the ldhdr structure.  */
616
617 static void
618 xcoff64_swap_ldhdr_in (abfd, s, dst)
619      bfd *abfd;
620      const PTR s;
621      struct internal_ldhdr *dst;
622 {
623   const struct external_ldhdr *src = (const struct external_ldhdr *) s;
624
625   dst->l_version = bfd_get_32 (abfd, src->l_version);
626   dst->l_nsyms = bfd_get_32 (abfd, src->l_nsyms);
627   dst->l_nreloc = bfd_get_32 (abfd, src->l_nreloc);
628   dst->l_istlen = bfd_get_32 (abfd, src->l_istlen);
629   dst->l_nimpid = bfd_get_32 (abfd, src->l_nimpid);
630   dst->l_stlen = bfd_get_32 (abfd, src->l_stlen);
631   dst->l_impoff = bfd_get_64 (abfd, src->l_impoff);
632   dst->l_stoff = bfd_get_64 (abfd, src->l_stoff);
633   dst->l_symoff = bfd_get_64 (abfd, src->l_symoff);
634   dst->l_rldoff = bfd_get_64 (abfd, src->l_rldoff);
635 }
636
637 /* Swap out the ldhdr structure.  */
638
639 static void
640 xcoff64_swap_ldhdr_out (abfd, src, d)
641      bfd *abfd;
642      const struct internal_ldhdr *src;
643      PTR d;
644 {
645   struct external_ldhdr *dst = (struct external_ldhdr *) d;
646
647   bfd_put_32 (abfd, (bfd_vma) src->l_version, dst->l_version);
648   bfd_put_32 (abfd, src->l_nsyms, dst->l_nsyms);
649   bfd_put_32 (abfd, src->l_nreloc, dst->l_nreloc);
650   bfd_put_32 (abfd, src->l_istlen, dst->l_istlen);
651   bfd_put_32 (abfd, src->l_nimpid, dst->l_nimpid);
652   bfd_put_32 (abfd, src->l_stlen, dst->l_stlen);
653   bfd_put_64 (abfd, src->l_impoff, dst->l_impoff);
654   bfd_put_64 (abfd, src->l_stoff, dst->l_stoff);
655   bfd_put_64 (abfd, src->l_symoff, dst->l_symoff);
656   bfd_put_64 (abfd, src->l_rldoff, dst->l_rldoff);
657 }
658
659 /* Swap in the ldsym structure.  */
660
661 static void
662 xcoff64_swap_ldsym_in (abfd, s, dst)
663      bfd *abfd;
664      const PTR s;
665      struct internal_ldsym *dst;
666 {
667   const struct external_ldsym *src = (const struct external_ldsym *) s;
668   /* XCOFF64 does not use l_zeroes like XCOFF32
669      Set the internal l_zeroes to 0 so the common 32/64 code uses l_value
670      as an offset into the loader symbol table.  */
671   dst->_l._l_l._l_zeroes = 0;
672   dst->_l._l_l._l_offset = bfd_get_32 (abfd, src->l_offset);
673   dst->l_value = bfd_get_64 (abfd, src->l_value);
674   dst->l_scnum = bfd_get_16 (abfd, src->l_scnum);
675   dst->l_smtype = bfd_get_8 (abfd, src->l_smtype);
676   dst->l_smclas = bfd_get_8 (abfd, src->l_smclas);
677   dst->l_ifile = bfd_get_32 (abfd, src->l_ifile);
678   dst->l_parm = bfd_get_32 (abfd, src->l_parm);
679 }
680
681 /* Swap out the ldsym structure.  */
682
683 static void
684 xcoff64_swap_ldsym_out (abfd, src, d)
685      bfd *abfd;
686      const struct internal_ldsym *src;
687      PTR d;
688 {
689   struct external_ldsym *dst = (struct external_ldsym *) d;
690
691   bfd_put_64 (abfd, src->l_value, dst->l_value);
692   bfd_put_32 (abfd, (bfd_vma) src->_l._l_l._l_offset, dst->l_offset);
693   bfd_put_16 (abfd, (bfd_vma) src->l_scnum, dst->l_scnum);
694   bfd_put_8 (abfd, src->l_smtype, dst->l_smtype);
695   bfd_put_8 (abfd, src->l_smclas, dst->l_smclas);
696   bfd_put_32 (abfd, src->l_ifile, dst->l_ifile);
697   bfd_put_32 (abfd, src->l_parm, dst->l_parm);
698 }
699
700 static void
701 xcoff64_swap_reloc_in (abfd, s, d)
702      bfd *abfd;
703      PTR s;
704      PTR d;
705 {
706   struct external_reloc *src = (struct external_reloc *) s;
707   struct internal_reloc *dst = (struct internal_reloc *) d;
708
709   memset (dst, 0, sizeof (struct internal_reloc));
710
711   dst->r_vaddr = bfd_get_64 (abfd, src->r_vaddr);
712   dst->r_symndx = bfd_get_32 (abfd, src->r_symndx);
713   dst->r_size = bfd_get_8 (abfd, src->r_size);
714   dst->r_type = bfd_get_8 (abfd, src->r_type);
715 }
716
717 static unsigned int
718 xcoff64_swap_reloc_out (abfd, s, d)
719      bfd *abfd;
720      PTR s;
721      PTR d;
722 {
723   struct internal_reloc *src = (struct internal_reloc *) s;
724   struct external_reloc *dst = (struct external_reloc *) d;
725
726   bfd_put_64 (abfd, src->r_vaddr, dst->r_vaddr);
727   bfd_put_32 (abfd, src->r_symndx, dst->r_symndx);
728   bfd_put_8 (abfd, src->r_type, dst->r_type);
729   bfd_put_8 (abfd, src->r_size, dst->r_size);
730
731   return bfd_coff_relsz (abfd);
732 }
733
734 /* Swap in the ldrel structure.  */
735
736 static void
737 xcoff64_swap_ldrel_in (abfd, s, dst)
738      bfd *abfd;
739      const PTR s;
740      struct internal_ldrel *dst;
741 {
742   const struct external_ldrel *src = (const struct external_ldrel *) s;
743
744   dst->l_vaddr = bfd_get_64 (abfd, src->l_vaddr);
745   dst->l_symndx = bfd_get_32 (abfd, src->l_symndx);
746   dst->l_rtype = bfd_get_16 (abfd, src->l_rtype);
747   dst->l_rsecnm = bfd_get_16 (abfd, src->l_rsecnm);
748 }
749
750 /* Swap out the ldrel structure.  */
751
752 static void
753 xcoff64_swap_ldrel_out (abfd, src, d)
754      bfd *abfd;
755      const struct internal_ldrel *src;
756      PTR d;
757 {
758   struct external_ldrel *dst = (struct external_ldrel *) d;
759
760   bfd_put_64 (abfd, src->l_vaddr, dst->l_vaddr);
761   bfd_put_16 (abfd, (bfd_vma) src->l_rtype, dst->l_rtype);
762   bfd_put_16 (abfd, (bfd_vma) src->l_rsecnm, dst->l_rsecnm);
763   bfd_put_32 (abfd, src->l_symndx, dst->l_symndx);
764 }
765
766 static bfd_boolean
767 xcoff64_write_object_contents (abfd)
768      bfd *abfd;
769 {
770   asection *current;
771   bfd_boolean hasrelocs = FALSE;
772   bfd_boolean haslinno = FALSE;
773   file_ptr scn_base;
774   file_ptr reloc_base;
775   file_ptr lineno_base;
776   file_ptr sym_base;
777   unsigned long reloc_size = 0;
778   unsigned long lnno_size = 0;
779   asection *text_sec = ((void *) 0);
780   asection *data_sec = ((void *) 0);
781   asection *bss_sec = ((void *) 0);
782   struct internal_filehdr internal_f;
783   struct internal_aouthdr internal_a;
784
785   bfd_set_error (bfd_error_system_call);
786
787   if (! abfd->output_has_begun)
788     {
789       if (! bfd_coff_compute_section_file_positions (abfd))
790         return FALSE;
791     }
792
793   /* Work out the size of the reloc and linno areas.  */
794   reloc_base = obj_relocbase (abfd);
795
796   for (current = abfd->sections; current != NULL; current = current->next)
797     reloc_size += current->reloc_count * bfd_coff_relsz (abfd);
798
799   lineno_base = reloc_base + reloc_size;
800
801   /* Make a pass through the symbol table to count line number entries and
802      put them into the correct asections.  */
803   lnno_size = coff_count_linenumbers (abfd) * bfd_coff_linesz (abfd);
804
805   sym_base = lineno_base + lnno_size;
806
807   /* Indicate in each section->line_filepos its actual file address.  */
808   for (current = abfd->sections; current != NULL; current =  current->next)
809     {
810       if (current->lineno_count)
811         {
812           current->line_filepos = lineno_base;
813           current->moving_line_filepos = lineno_base;
814           lineno_base += current->lineno_count * bfd_coff_linesz (abfd);
815         }
816       else
817         {
818           current->line_filepos = 0;
819         }
820
821       if (current->reloc_count)
822         {
823           current->rel_filepos = reloc_base;
824           reloc_base += current->reloc_count * bfd_coff_relsz (abfd);
825         }
826       else
827         {
828           current->rel_filepos = 0;
829         }
830     }
831
832   if ((abfd->flags & EXEC_P) != 0)
833     {
834       scn_base = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
835       internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
836     }
837   else
838     {
839       scn_base = bfd_coff_filhsz (abfd);
840       internal_f.f_opthdr = 0;
841     }
842
843   internal_f.f_nscns = 0;
844
845   if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
846     return FALSE;
847
848   for (current = abfd->sections; current != NULL; current = current->next)
849     {
850       struct internal_scnhdr section;
851       struct external_scnhdr buff;
852       bfd_size_type amount;
853
854       internal_f.f_nscns++;
855
856       strncpy (section.s_name, current->name, SCNNMLEN);
857
858       section.s_vaddr = current->vma;
859       section.s_paddr = current->lma;
860       section.s_size =  current->size;
861
862       /* If this section has no size or is unloadable then the scnptr
863          will be 0 too.  */
864       if (current->size == 0
865           || (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
866         {
867           section.s_scnptr = 0;
868         }
869       else
870         {
871           section.s_scnptr = current->filepos;
872         }
873
874       section.s_relptr = current->rel_filepos;
875       section.s_lnnoptr = current->line_filepos;
876       section.s_nreloc = current->reloc_count;
877
878       section.s_nlnno = current->lineno_count;
879       if (current->reloc_count != 0)
880         hasrelocs = TRUE;
881       if (current->lineno_count != 0)
882         haslinno = TRUE;
883
884       section.s_flags = sec_to_styp_flags (current->name, current->flags);
885
886       if (!strcmp (current->name, _TEXT))
887         {
888           text_sec = current;
889         }
890       else if (!strcmp (current->name, _DATA))
891         {
892           data_sec = current;
893         }
894       else if (!strcmp (current->name, _BSS))
895         {
896           bss_sec = current;
897         }
898
899       amount = bfd_coff_scnhsz (abfd);
900       if (bfd_coff_swap_scnhdr_out (abfd, &section, &buff) == 0
901           || bfd_bwrite ((PTR) (&buff), amount, abfd) != amount)
902         return FALSE;
903     }
904
905   internal_f.f_timdat = 0;
906
907   internal_f.f_flags = 0;
908
909   if (!hasrelocs)
910     internal_f.f_flags |= F_RELFLG;
911   if (!haslinno)
912     internal_f.f_flags |= F_LNNO;
913   if (abfd->flags & EXEC_P)
914     internal_f.f_flags |= F_EXEC;
915
916   /* FIXME: this is wrong for PPC_PE!  */
917   if (bfd_little_endian (abfd))
918     internal_f.f_flags |= F_AR32WR;
919   else
920     internal_f.f_flags |= F_AR32W;
921
922   if ((abfd->flags & DYNAMIC) != 0)
923     internal_f.f_flags |= F_SHROBJ;
924   if (bfd_get_section_by_name (abfd, _LOADER) != NULL)
925     internal_f.f_flags |= F_DYNLOAD;
926
927   memset (&internal_a, 0, sizeof internal_a);
928
929   internal_f.f_magic = bfd_xcoff_magic_number (abfd);
930   internal_a.magic = (abfd->flags & D_PAGED
931                       ? RS6K_AOUTHDR_ZMAGIC
932                       : (abfd->flags & WP_TEXT
933                          ? RS6K_AOUTHDR_NMAGIC
934                          : RS6K_AOUTHDR_OMAGIC));
935
936   /* FIXME: Does anybody ever set this to another value?  */
937   internal_a.vstamp = 0;
938
939   /* Now should write relocs, strings, syms.  */
940   obj_sym_filepos (abfd) = sym_base;
941
942   internal_f.f_symptr = 0;
943   internal_f.f_nsyms = 0;
944
945   /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
946      backend linker, and obj_raw_syment_count is not valid until after
947      coff_write_symbols is called.  */
948   if (bfd_get_symcount (abfd) != 0)
949     {
950       int firstundef;
951
952       if (!coff_renumber_symbols (abfd, &firstundef))
953         return FALSE;
954       coff_mangle_symbols (abfd);
955       if (! coff_write_symbols (abfd))
956         return FALSE;
957       if (! coff_write_linenumbers (abfd))
958         return FALSE;
959       if (! coff_write_relocs (abfd, firstundef))
960         return FALSE;
961
962       internal_f.f_symptr = sym_base;
963       internal_f.f_nsyms = bfd_get_symcount (abfd);
964     }
965   else if (obj_raw_syment_count (abfd) != 0)
966     {
967       internal_f.f_symptr = sym_base;
968
969       /* AIX appears to require that F_RELFLG not be set if there are
970          local symbols but no relocations.  */
971       internal_f.f_flags &=~ F_RELFLG;
972     }
973   else
974     {
975       internal_f.f_flags |= F_LSYMS;
976     }
977
978   if (text_sec)
979     {
980       internal_a.tsize = text_sec->size;
981       internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
982     }
983
984   if (data_sec)
985     {
986       internal_a.dsize = data_sec->size;
987       internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
988     }
989
990   if (bss_sec)
991     {
992       internal_a.bsize = bss_sec->size;
993       if (internal_a.bsize && bss_sec->vma < internal_a.data_start)
994         internal_a.data_start = bss_sec->vma;
995     }
996
997   internal_a.entry = bfd_get_start_address (abfd);
998   internal_f.f_nsyms = obj_raw_syment_count (abfd);
999
1000   if (xcoff_data (abfd)->full_aouthdr)
1001     {
1002       bfd_vma toc;
1003       asection *loader_sec;
1004
1005       internal_a.vstamp = 1;
1006
1007       internal_a.o_snentry = xcoff_data (abfd)->snentry;
1008       if (internal_a.o_snentry == 0)
1009         internal_a.entry = (bfd_vma) -1;
1010
1011       if (text_sec != NULL)
1012         {
1013           internal_a.o_sntext = text_sec->target_index;
1014           internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
1015         }
1016       else
1017         {
1018           internal_a.o_sntext = 0;
1019           internal_a.o_algntext = 0;
1020         }
1021
1022       if (data_sec != NULL)
1023         {
1024           internal_a.o_sndata = data_sec->target_index;
1025           internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
1026         }
1027       else
1028         {
1029           internal_a.o_sndata = 0;
1030           internal_a.o_algndata = 0;
1031         }
1032
1033       loader_sec = bfd_get_section_by_name (abfd, ".loader");
1034       if (loader_sec != NULL)
1035         internal_a.o_snloader = loader_sec->target_index;
1036       else
1037         internal_a.o_snloader = 0;
1038       if (bss_sec != NULL)
1039         internal_a.o_snbss = bss_sec->target_index;
1040       else
1041         internal_a.o_snbss = 0;
1042
1043       toc = xcoff_data (abfd)->toc;
1044       internal_a.o_toc = toc;
1045       internal_a.o_sntoc = xcoff_data (abfd)->sntoc;
1046
1047       internal_a.o_modtype = xcoff_data (abfd)->modtype;
1048       if (xcoff_data (abfd)->cputype != -1)
1049         internal_a.o_cputype = xcoff_data (abfd)->cputype;
1050       else
1051         {
1052           switch (bfd_get_arch (abfd))
1053             {
1054             case bfd_arch_rs6000:
1055               internal_a.o_cputype = 4;
1056               break;
1057             case bfd_arch_powerpc:
1058               if (bfd_get_mach (abfd) == bfd_mach_ppc)
1059                 internal_a.o_cputype = 3;
1060               else if (bfd_get_mach (abfd) == bfd_mach_ppc_620)
1061                 internal_a.o_cputype = 2;
1062               else
1063                 internal_a.o_cputype = 1;
1064               break;
1065             default:
1066               abort ();
1067             }
1068         }
1069       internal_a.o_maxstack = xcoff_data (abfd)->maxstack;
1070       internal_a.o_maxdata = xcoff_data (abfd)->maxdata;
1071     }
1072
1073   if (bfd_seek (abfd, (file_ptr) 0, 0) != 0)
1074     return FALSE;
1075
1076   {
1077     char * buff;
1078     bfd_size_type amount = bfd_coff_filhsz (abfd);
1079
1080     buff = bfd_malloc (amount);
1081     if (buff == NULL)
1082       return FALSE;
1083
1084     bfd_coff_swap_filehdr_out (abfd, (PTR) &internal_f, (PTR) buff);
1085     amount = bfd_bwrite ((PTR) buff, amount, abfd);
1086
1087     free (buff);
1088
1089     if (amount != bfd_coff_filhsz (abfd))
1090       return FALSE;
1091   }
1092
1093   if (abfd->flags & EXEC_P)
1094     {
1095       char * buff;
1096       bfd_size_type amount = bfd_coff_aoutsz (abfd);
1097
1098       buff = bfd_malloc (amount);
1099       if (buff == NULL)
1100         return FALSE;
1101
1102       bfd_coff_swap_aouthdr_out (abfd, (PTR) &internal_a, (PTR) buff);
1103       amount = bfd_bwrite ((PTR) buff, amount, abfd);
1104
1105       free (buff);
1106
1107       if (amount != bfd_coff_aoutsz (abfd))
1108         return FALSE;
1109     }
1110
1111   return TRUE;
1112 }
1113
1114 static bfd_boolean
1115 xcoff64_reloc_type_br (input_bfd, input_section, output_bfd, rel, sym, howto,
1116                        val, addend, relocation, contents)
1117      bfd *input_bfd;
1118      asection *input_section;
1119      bfd *output_bfd ATTRIBUTE_UNUSED;
1120      struct internal_reloc *rel;
1121      struct internal_syment *sym ATTRIBUTE_UNUSED;
1122      struct reloc_howto_struct *howto;
1123      bfd_vma val;
1124      bfd_vma addend;
1125      bfd_vma *relocation;
1126      bfd_byte *contents;
1127 {
1128   struct xcoff_link_hash_entry *h;
1129   bfd_vma section_offset;
1130
1131   if (0 > rel->r_symndx)
1132     return FALSE;
1133
1134   h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
1135   section_offset = rel->r_vaddr - input_section->vma;
1136
1137   /* If we see an R_BR or R_RBR reloc which is jumping to global
1138      linkage code, and it is followed by an appropriate cror nop
1139      instruction, we replace the cror with ld r2,40(r1).  This
1140      restores the TOC after the glink code.  Contrariwise, if the
1141      call is followed by a ld r2,40(r1), but the call is not
1142      going to global linkage code, we can replace the load with a
1143      cror.  */
1144   if (NULL != h
1145       && (bfd_link_hash_defined == h->root.type
1146           || bfd_link_hash_defweak == h->root.type)
1147       && section_offset + 8 <= input_section->size)
1148     {
1149       bfd_byte *pnext;
1150       unsigned long next;
1151
1152       pnext = contents + section_offset + 4;
1153       next = bfd_get_32 (input_bfd, pnext);
1154
1155       /* The _ptrgl function is magic.  It is used by the AIX compiler to call
1156          a function through a pointer.  */
1157       if (h->smclas == XMC_GL || strcmp (h->root.root.string, "._ptrgl") == 0)
1158         {
1159           if (next == 0x4def7b82                        /* cror 15,15,15  */
1160               || next == 0x4ffffb82                     /* cror 31,31,31  */
1161               || next == 0x60000000)                    /* ori  r0,r0,0   */
1162             bfd_put_32 (input_bfd, 0xe8410028, pnext);  /* ld   r2,40(r1) */
1163         }
1164       else
1165         {
1166           if (next == 0xe8410028)                       /* ld r2,40(r1)   */
1167             bfd_put_32 (input_bfd, 0x60000000, pnext);  /* ori r0,r0,0    */
1168         }
1169     }
1170   else if (NULL != h && bfd_link_hash_undefined == h->root.type)
1171     {
1172       /* Normally, this relocation is against a defined symbol.  In the
1173          case where this is a partial link and the output section offset
1174          is greater than 2^25, the linker will return an invalid error
1175          message that the relocation has been truncated.  Yes it has been
1176          truncated but no it not important.  For this case, disable the
1177          overflow checking. */
1178       howto->complain_on_overflow = complain_overflow_dont;
1179     }
1180
1181   /* The original PC-relative relocation is biased by -r_vaddr, so adding
1182      the value below will give the absolute target address.  */
1183   *relocation = val + addend + rel->r_vaddr;
1184
1185   howto->src_mask &= ~3;
1186   howto->dst_mask = howto->src_mask;
1187
1188   if (h != NULL
1189       && (h->root.type == bfd_link_hash_defined
1190           || h->root.type == bfd_link_hash_defweak)
1191       && bfd_is_abs_section (h->root.u.def.section)
1192       && section_offset + 4 <= input_section->size)
1193     {
1194       bfd_byte *ptr;
1195       bfd_vma insn;
1196
1197       /* Turn the relative branch into an absolute one by setting the
1198          AA bit.  */
1199       ptr = contents + section_offset;
1200       insn = bfd_get_32 (input_bfd, ptr);
1201       insn |= 2;
1202       bfd_put_32 (input_bfd, insn, ptr);
1203
1204       /* Make the howto absolute too.  */
1205       howto->pc_relative = FALSE;
1206       howto->complain_on_overflow = complain_overflow_bitfield;
1207     }
1208   else
1209     {
1210       /* Use a PC-relative howto and subtract the instruction's address
1211          from the target address we calculated above.  */
1212       howto->pc_relative = TRUE;
1213       *relocation -= (input_section->output_section->vma
1214                       + input_section->output_offset
1215                       + section_offset);
1216     }
1217   return TRUE;
1218 }
1219
1220 /* This is the relocation function for the PowerPC64.
1221    See xcoff_ppc_relocation_section for more information. */
1222
1223 bfd_boolean
1224 xcoff64_ppc_relocate_section (output_bfd, info, input_bfd,
1225                               input_section, contents, relocs, syms,
1226                               sections)
1227      bfd *output_bfd;
1228      struct bfd_link_info *info;
1229      bfd *input_bfd;
1230      asection *input_section;
1231      bfd_byte *contents;
1232      struct internal_reloc *relocs;
1233      struct internal_syment *syms;
1234      asection **sections;
1235 {
1236   struct internal_reloc *rel;
1237   struct internal_reloc *relend;
1238
1239   rel = relocs;
1240   relend = rel + input_section->reloc_count;
1241   for (; rel < relend; rel++)
1242     {
1243       long symndx;
1244       struct xcoff_link_hash_entry *h;
1245       struct internal_syment *sym;
1246       bfd_vma addend;
1247       bfd_vma val;
1248       struct reloc_howto_struct howto;
1249       bfd_vma relocation;
1250       bfd_vma value_to_relocate;
1251       bfd_vma address;
1252       bfd_byte *location;
1253
1254       /* Relocation type R_REF is a special relocation type which is
1255          merely used to prevent garbage collection from occurring for
1256          the csect including the symbol which it references.  */
1257       if (rel->r_type == R_REF)
1258         continue;
1259
1260       /* howto */
1261       howto.type = rel->r_type;
1262       howto.rightshift = 0;
1263       howto.bitsize = (rel->r_size & 0x3f) + 1;
1264       howto.size = howto.bitsize > 16 ? (howto.bitsize > 32 ? 4 : 2) : 1;
1265       howto.pc_relative = FALSE;
1266       howto.bitpos = 0;
1267       howto.complain_on_overflow = (rel->r_size & 0x80
1268                                     ? complain_overflow_signed
1269                                     : complain_overflow_bitfield);
1270       howto.special_function = NULL;
1271       howto.name = "internal";
1272       howto.partial_inplace = TRUE;
1273       howto.src_mask = howto.dst_mask = N_ONES (howto.bitsize);
1274       howto.pcrel_offset = FALSE;
1275
1276       /* symbol */
1277       val = 0;
1278       addend = 0;
1279       h = NULL;
1280       sym = NULL;
1281       symndx = rel->r_symndx;
1282
1283       if (-1 != symndx)
1284         {
1285           asection *sec;
1286
1287           h = obj_xcoff_sym_hashes (input_bfd)[symndx];
1288           sym = syms + symndx;
1289           addend = - sym->n_value;
1290
1291           if (NULL == h)
1292             {
1293               sec = sections[symndx];
1294               /* Hack to make sure we use the right TOC anchor value
1295                  if this reloc is against the TOC anchor.  */
1296               if (sec->name[3] == '0'
1297                   && strcmp (sec->name, ".tc0") == 0)
1298                 val = xcoff_data (output_bfd)->toc;
1299               else
1300                 val = (sec->output_section->vma
1301                        + sec->output_offset
1302                        + sym->n_value
1303                        - sec->vma);
1304             }
1305           else
1306             {
1307               if (info->unresolved_syms_in_objects != RM_IGNORE
1308                   && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
1309                 {
1310                   if (! ((*info->callbacks->undefined_symbol)
1311                          (info, h->root.root.string,
1312                           input_bfd, input_section,
1313                           rel->r_vaddr - input_section->vma,
1314                           (info->unresolved_syms_in_objects
1315                            == RM_GENERATE_ERROR))))
1316                     return FALSE;
1317                 }
1318               if (h->root.type == bfd_link_hash_defined
1319                   || h->root.type == bfd_link_hash_defweak)
1320                 {
1321                   sec = h->root.u.def.section;
1322                   val = (h->root.u.def.value
1323                          + sec->output_section->vma
1324                          + sec->output_offset);
1325                 }
1326               else if (h->root.type == bfd_link_hash_common)
1327                 {
1328                   sec = h->root.u.c.p->section;
1329                   val = (sec->output_section->vma
1330                          + sec->output_offset);
1331                 }
1332               else
1333                 {
1334                   BFD_ASSERT (info->relocatable
1335                               || (h->flags & XCOFF_DEF_DYNAMIC) != 0
1336                               || (h->flags & XCOFF_IMPORT) != 0);
1337                 }
1338             }
1339         }
1340
1341       if (rel->r_type >= XCOFF_MAX_CALCULATE_RELOCATION
1342           || !((*xcoff64_calculate_relocation[rel->r_type])
1343               (input_bfd, input_section, output_bfd, rel, sym, &howto, val,
1344                addend, &relocation, contents)))
1345         return FALSE;
1346
1347       /* address */
1348       address = rel->r_vaddr - input_section->vma;
1349       location = contents + address;
1350
1351       if (address > input_section->size)
1352         abort ();
1353
1354       /* Get the value we are going to relocate.  */
1355       if (1 == howto.size)
1356         value_to_relocate = bfd_get_16 (input_bfd, location);
1357       else if (2 == howto.size)
1358         value_to_relocate = bfd_get_32 (input_bfd, location);
1359       else
1360         value_to_relocate = bfd_get_64 (input_bfd, location);
1361
1362       /* overflow.
1363
1364          FIXME: We may drop bits during the addition
1365          which we don't check for.  We must either check at every single
1366          operation, which would be tedious, or we must do the computations
1367          in a type larger than bfd_vma, which would be inefficient.  */
1368
1369       if ((unsigned int) howto.complain_on_overflow
1370           >= XCOFF_MAX_COMPLAIN_OVERFLOW)
1371         abort ();
1372
1373       if (((*xcoff_complain_overflow[howto.complain_on_overflow])
1374            (input_bfd, value_to_relocate, relocation, &howto)))
1375         {
1376           const char *name;
1377           char buf[SYMNMLEN + 1];
1378           char reloc_type_name[10];
1379
1380           if (symndx == -1)
1381             {
1382               name = "*ABS*";
1383             }
1384           else if (h != NULL)
1385             {
1386               name = NULL;
1387             }
1388           else
1389             {
1390               name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
1391               if (name == NULL)
1392                 name = "UNKNOWN";
1393             }
1394           sprintf (reloc_type_name, "0x%02x", rel->r_type);
1395
1396           if (! ((*info->callbacks->reloc_overflow)
1397                  (info, (h ? &h->root : NULL), name, reloc_type_name,
1398                   (bfd_vma) 0, input_bfd, input_section,
1399                   rel->r_vaddr - input_section->vma)))
1400             return FALSE;
1401         }
1402
1403       /* Add RELOCATION to the right bits of VALUE_TO_RELOCATE.  */
1404       value_to_relocate = ((value_to_relocate & ~howto.dst_mask)
1405                            | (((value_to_relocate & howto.src_mask)
1406                                + relocation) & howto.dst_mask));
1407
1408       /* Put the value back in the object file.  */
1409       if (1 == howto.size)
1410         bfd_put_16 (input_bfd, value_to_relocate, location);
1411       else if (2 == howto.size)
1412         bfd_put_32 (input_bfd, value_to_relocate, location);
1413       else
1414         bfd_put_64 (input_bfd, value_to_relocate, location);
1415
1416     }
1417   return TRUE;
1418 }
1419
1420 \f
1421 /* The XCOFF reloc table.  Actually, XCOFF relocations specify the
1422    bitsize and whether they are signed or not, along with a
1423    conventional type.  This table is for the types, which are used for
1424    different algorithms for putting in the reloc.  Many of these
1425    relocs need special_function entries, which I have not written.  */
1426
1427 reloc_howto_type xcoff64_howto_table[] =
1428 {
1429   /* Standard 64 bit relocation.  */
1430   HOWTO (R_POS,                 /* type */
1431          0,                     /* rightshift */
1432          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1433          64,                    /* bitsize */
1434          FALSE,                 /* pc_relative */
1435          0,                     /* bitpos */
1436          complain_overflow_bitfield, /* complain_on_overflow */
1437          0,                     /* special_function */
1438          "R_POS_64",            /* name */
1439          TRUE,                  /* partial_inplace */
1440          MINUS_ONE,             /* src_mask */
1441          MINUS_ONE,             /* dst_mask */
1442          FALSE),                /* pcrel_offset */
1443
1444   /* 64 bit relocation, but store negative value.  */
1445   HOWTO (R_NEG,                 /* type */
1446          0,                     /* rightshift */
1447          -4,                    /* size (0 = byte, 1 = short, 2 = long) */
1448          64,                    /* bitsize */
1449          FALSE,                 /* pc_relative */
1450          0,                     /* bitpos */
1451          complain_overflow_bitfield, /* complain_on_overflow */
1452          0,                     /* special_function */
1453          "R_NEG",               /* name */
1454          TRUE,                  /* partial_inplace */
1455          MINUS_ONE,             /* src_mask */
1456          MINUS_ONE,             /* dst_mask */
1457          FALSE),                /* pcrel_offset */
1458
1459   /* 32 bit PC relative relocation.  */
1460   HOWTO (R_REL,                 /* type */
1461          0,                     /* rightshift */
1462          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1463          32,                    /* bitsize */
1464          TRUE,                  /* pc_relative */
1465          0,                     /* bitpos */
1466          complain_overflow_signed, /* complain_on_overflow */
1467          0,                     /* special_function */
1468          "R_REL",               /* name */
1469          TRUE,                  /* partial_inplace */
1470          0xffffffff,            /* src_mask */
1471          0xffffffff,            /* dst_mask */
1472          FALSE),                /* pcrel_offset */
1473
1474   /* 16 bit TOC relative relocation.  */
1475   HOWTO (R_TOC,                 /* type */
1476          0,                     /* rightshift */
1477          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1478          16,                    /* bitsize */
1479          FALSE,                 /* pc_relative */
1480          0,                     /* bitpos */
1481          complain_overflow_bitfield, /* complain_on_overflow */
1482          0,                     /* special_function */
1483          "R_TOC",               /* name */
1484          TRUE,                  /* partial_inplace */
1485          0xffff,                /* src_mask */
1486          0xffff,                /* dst_mask */
1487          FALSE),                /* pcrel_offset */
1488
1489   /* I don't really know what this is.  */
1490   HOWTO (R_RTB,                 /* type */
1491          1,                     /* rightshift */
1492          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1493          32,                    /* bitsize */
1494          FALSE,                 /* pc_relative */
1495          0,                     /* bitpos */
1496          complain_overflow_bitfield, /* complain_on_overflow */
1497          0,                     /* special_function */
1498          "R_RTB",               /* name */
1499          TRUE,                  /* partial_inplace */
1500          0xffffffff,            /* src_mask */
1501          0xffffffff,            /* dst_mask */
1502          FALSE),                /* pcrel_offset */
1503
1504   /* External TOC relative symbol.  */
1505   HOWTO (R_GL,                  /* type */
1506          0,                     /* rightshift */
1507          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1508          16,                    /* bitsize */
1509          FALSE,                 /* pc_relative */
1510          0,                     /* bitpos */
1511          complain_overflow_bitfield, /* complain_on_overflow */
1512          0,                     /* special_function */
1513          "R_GL",                /* name */
1514          TRUE,                  /* partial_inplace */
1515          0xffff,                /* src_mask */
1516          0xffff,                /* dst_mask */
1517          FALSE),                /* pcrel_offset */
1518
1519   /* Local TOC relative symbol.  */
1520   HOWTO (R_TCL,                 /* type */
1521          0,                     /* rightshift */
1522          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1523          16,                    /* bitsize */
1524          FALSE,                 /* pc_relative */
1525          0,                     /* bitpos */
1526          complain_overflow_bitfield, /* complain_on_overflow */
1527          0,                     /* special_function */
1528          "R_TCL",               /* name */
1529          TRUE,                  /* partial_inplace */
1530          0xffff,                /* src_mask */
1531          0xffff,                /* dst_mask */
1532          FALSE),                /* pcrel_offset */
1533
1534   EMPTY_HOWTO (7),
1535
1536   /* Non modifiable absolute branch.  */
1537   HOWTO (R_BA,                  /* type */
1538          0,                     /* rightshift */
1539          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1540          26,                    /* bitsize */
1541          FALSE,                 /* pc_relative */
1542          0,                     /* bitpos */
1543          complain_overflow_bitfield, /* complain_on_overflow */
1544          0,                     /* special_function */
1545          "R_BA_26",             /* name */
1546          TRUE,                  /* partial_inplace */
1547          0x03fffffc,            /* src_mask */
1548          0x03fffffc,            /* dst_mask */
1549          FALSE),                /* pcrel_offset */
1550
1551   EMPTY_HOWTO (9),
1552
1553   /* Non modifiable relative branch.  */
1554   HOWTO (R_BR,                  /* type */
1555          0,                     /* rightshift */
1556          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1557          26,                    /* bitsize */
1558          TRUE,                  /* pc_relative */
1559          0,                     /* bitpos */
1560          complain_overflow_signed, /* complain_on_overflow */
1561          0,                     /* special_function */
1562          "R_BR",                /* name */
1563          TRUE,                  /* partial_inplace */
1564          0x03fffffc,            /* src_mask */
1565          0x03fffffc,            /* dst_mask */
1566          FALSE),                /* pcrel_offset */
1567
1568   EMPTY_HOWTO (0xb),
1569
1570   /* Indirect load.  */
1571   HOWTO (R_RL,                  /* type */
1572          0,                     /* rightshift */
1573          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1574          16,                    /* bitsize */
1575          FALSE,                 /* pc_relative */
1576          0,                     /* bitpos */
1577          complain_overflow_bitfield, /* complain_on_overflow */
1578          0,                     /* special_function */
1579          "R_RL",                /* name */
1580          TRUE,                  /* partial_inplace */
1581          0xffff,                /* src_mask */
1582          0xffff,                /* dst_mask */
1583          FALSE),                /* pcrel_offset */
1584
1585   /* Load address.  */
1586   HOWTO (R_RLA,                 /* type */
1587          0,                     /* rightshift */
1588          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1589          16,                    /* bitsize */
1590          FALSE,                 /* pc_relative */
1591          0,                     /* bitpos */
1592          complain_overflow_bitfield, /* complain_on_overflow */
1593          0,                     /* special_function */
1594          "R_RLA",               /* name */
1595          TRUE,                  /* partial_inplace */
1596          0xffff,                /* src_mask */
1597          0xffff,                /* dst_mask */
1598          FALSE),                /* pcrel_offset */
1599
1600   EMPTY_HOWTO (0xe),
1601
1602   /* Non-relocating reference.  Bitsize is 1 so that r_rsize is 0.  */
1603   HOWTO (R_REF,                 /* type */
1604          0,                     /* rightshift */
1605          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1606          1,                     /* bitsize */
1607          FALSE,                 /* pc_relative */
1608          0,                     /* bitpos */
1609          complain_overflow_dont, /* complain_on_overflow */
1610          0,                     /* special_function */
1611          "R_REF",               /* name */
1612          FALSE,                 /* partial_inplace */
1613          0,                     /* src_mask */
1614          0,                     /* dst_mask */
1615          FALSE),                /* pcrel_offset */
1616
1617   EMPTY_HOWTO (0x10),
1618   EMPTY_HOWTO (0x11),
1619
1620   /* TOC relative indirect load.  */
1621   HOWTO (R_TRL,                 /* type */
1622          0,                     /* rightshift */
1623          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1624          16,                    /* bitsize */
1625          FALSE,                 /* pc_relative */
1626          0,                     /* bitpos */
1627          complain_overflow_bitfield, /* complain_on_overflow */
1628          0,                     /* special_function */
1629          "R_TRL",               /* name */
1630          TRUE,                  /* partial_inplace */
1631          0xffff,                /* src_mask */
1632          0xffff,                /* dst_mask */
1633          FALSE),                /* pcrel_offset */
1634
1635   /* TOC relative load address.  */
1636   HOWTO (R_TRLA,                /* type */
1637          0,                     /* rightshift */
1638          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1639          16,                    /* bitsize */
1640          FALSE,                 /* pc_relative */
1641          0,                     /* bitpos */
1642          complain_overflow_bitfield, /* complain_on_overflow */
1643          0,                     /* special_function */
1644          "R_TRLA",              /* name */
1645          TRUE,                  /* partial_inplace */
1646          0xffff,                /* src_mask */
1647          0xffff,                /* dst_mask */
1648          FALSE),                /* pcrel_offset */
1649
1650   /* Modifiable relative branch.  */
1651   HOWTO (R_RRTBI,               /* type */
1652          1,                     /* rightshift */
1653          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1654          32,                    /* bitsize */
1655          FALSE,                 /* pc_relative */
1656          0,                     /* bitpos */
1657          complain_overflow_bitfield, /* complain_on_overflow */
1658          0,                     /* special_function */
1659          "R_RRTBI",             /* name */
1660          TRUE,                  /* partial_inplace */
1661          0xffffffff,            /* src_mask */
1662          0xffffffff,            /* dst_mask */
1663          FALSE),                /* pcrel_offset */
1664
1665   /* Modifiable absolute branch.  */
1666   HOWTO (R_RRTBA,               /* type */
1667          1,                     /* rightshift */
1668          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1669          32,                    /* bitsize */
1670          FALSE,                 /* pc_relative */
1671          0,                     /* bitpos */
1672          complain_overflow_bitfield, /* complain_on_overflow */
1673          0,                     /* special_function */
1674          "R_RRTBA",             /* name */
1675          TRUE,                  /* partial_inplace */
1676          0xffffffff,            /* src_mask */
1677          0xffffffff,            /* dst_mask */
1678          FALSE),                /* pcrel_offset */
1679
1680   /* Modifiable call absolute indirect.  */
1681   HOWTO (R_CAI,                 /* type */
1682          0,                     /* rightshift */
1683          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1684          16,                    /* bitsize */
1685          FALSE,                 /* pc_relative */
1686          0,                     /* bitpos */
1687          complain_overflow_bitfield, /* complain_on_overflow */
1688          0,                     /* special_function */
1689          "R_CAI",               /* name */
1690          TRUE,                  /* partial_inplace */
1691          0xffff,                /* src_mask */
1692          0xffff,                /* dst_mask */
1693          FALSE),                /* pcrel_offset */
1694
1695   /* Modifiable call relative.  */
1696   HOWTO (R_CREL,                /* type */
1697          0,                     /* rightshift */
1698          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1699          16,                    /* bitsize */
1700          FALSE,                 /* pc_relative */
1701          0,                     /* bitpos */
1702          complain_overflow_bitfield, /* complain_on_overflow */
1703          0,                     /* special_function */
1704          "R_CREL",              /* name */
1705          TRUE,                  /* partial_inplace */
1706          0xffff,                /* src_mask */
1707          0xffff,                /* dst_mask */
1708          FALSE),                /* pcrel_offset */
1709
1710   /* Modifiable branch absolute.  */
1711   HOWTO (R_RBA,                 /* type */
1712          0,                     /* rightshift */
1713          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1714          26,                    /* bitsize */
1715          FALSE,                 /* pc_relative */
1716          0,                     /* bitpos */
1717          complain_overflow_bitfield, /* complain_on_overflow */
1718          0,                     /* special_function */
1719          "R_RBA",               /* name */
1720          TRUE,                  /* partial_inplace */
1721          0x03fffffc,            /* src_mask */
1722          0x03fffffc,            /* dst_mask */
1723          FALSE),                /* pcrel_offset */
1724
1725   /* Modifiable branch absolute.  */
1726   HOWTO (R_RBAC,                /* type */
1727          0,                     /* rightshift */
1728          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1729          32,                    /* bitsize */
1730          FALSE,                 /* pc_relative */
1731          0,                     /* bitpos */
1732          complain_overflow_bitfield, /* complain_on_overflow */
1733          0,                     /* special_function */
1734          "R_RBAC",              /* name */
1735          TRUE,                  /* partial_inplace */
1736          0xffffffff,            /* src_mask */
1737          0xffffffff,            /* dst_mask */
1738          FALSE),                /* pcrel_offset */
1739
1740   /* Modifiable branch relative.  */
1741   HOWTO (R_RBR,                 /* type */
1742          0,                     /* rightshift */
1743          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1744          26,                    /* bitsize */
1745          FALSE,                 /* pc_relative */
1746          0,                     /* bitpos */
1747          complain_overflow_signed, /* complain_on_overflow */
1748          0,                     /* special_function */
1749          "R_RBR_26",            /* name */
1750          TRUE,                  /* partial_inplace */
1751          0x03fffffc,            /* src_mask */
1752          0x03fffffc,            /* dst_mask */
1753          FALSE),                /* pcrel_offset */
1754
1755   /* Modifiable branch absolute.  */
1756   HOWTO (R_RBRC,                /* type */
1757          0,                     /* rightshift */
1758          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1759          16,                    /* bitsize */
1760          FALSE,                 /* pc_relative */
1761          0,                     /* bitpos */
1762          complain_overflow_bitfield, /* complain_on_overflow */
1763          0,                     /* special_function */
1764          "R_RBRC",              /* name */
1765          TRUE,                  /* partial_inplace */
1766          0xffff,                /* src_mask */
1767          0xffff,                /* dst_mask */
1768          FALSE),                /* pcrel_offset */
1769
1770   HOWTO (R_POS,                 /* type */
1771          0,                     /* rightshift */
1772          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1773          32,                    /* bitsize */
1774          FALSE,                 /* pc_relative */
1775          0,                     /* bitpos */
1776          complain_overflow_bitfield, /* complain_on_overflow */
1777          0,                     /* special_function */
1778          "R_POS_32",            /* name */
1779          TRUE,                  /* partial_inplace */
1780          0xffffffff,            /* src_mask */
1781          0xffffffff,            /* dst_mask */
1782          FALSE),                /* pcrel_offset */
1783
1784   /* 16 bit Non modifiable absolute branch.  */
1785   HOWTO (R_BA,                  /* type */
1786          0,                     /* rightshift */
1787          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1788          16,                    /* bitsize */
1789          FALSE,                 /* pc_relative */
1790          0,                     /* bitpos */
1791          complain_overflow_bitfield, /* complain_on_overflow */
1792          0,                     /* special_function */
1793          "R_BA_16",             /* name */
1794          TRUE,                  /* partial_inplace */
1795          0xfffc,                /* src_mask */
1796          0xfffc,                /* dst_mask */
1797          FALSE),                /* pcrel_offset */
1798
1799   /* Modifiable branch relative.  */
1800   HOWTO (R_RBR,                 /* type */
1801          0,                     /* rightshift */
1802          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1803          16,                    /* bitsize */
1804          FALSE,                 /* pc_relative */
1805          0,                     /* bitpos */
1806          complain_overflow_signed, /* complain_on_overflow */
1807          0,                     /* special_function */
1808          "R_RBR_16",            /* name */
1809          TRUE,                  /* partial_inplace */
1810          0xffff,                /* src_mask */
1811          0xffff,                /* dst_mask */
1812          FALSE),                /* pcrel_offset */
1813
1814   /* Modifiable branch absolute.  */
1815   HOWTO (R_RBA,                 /* type */
1816          0,                     /* rightshift */
1817          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1818          16,                    /* bitsize */
1819          FALSE,                 /* pc_relative */
1820          0,                     /* bitpos */
1821          complain_overflow_bitfield, /* complain_on_overflow */
1822          0,                     /* special_function */
1823          "R_RBA_16",            /* name */
1824          TRUE,                  /* partial_inplace */
1825          0xffff,                /* src_mask */
1826          0xffff,                /* dst_mask */
1827          FALSE),                /* pcrel_offset */
1828
1829 };
1830
1831 void
1832 xcoff64_rtype2howto (relent, internal)
1833      arelent *relent;
1834      struct internal_reloc *internal;
1835 {
1836   if (internal->r_type > R_RBRC)
1837     abort ();
1838
1839   /* Default howto layout works most of the time */
1840   relent->howto = &xcoff64_howto_table[internal->r_type];
1841
1842   /* Special case some 16 bit reloc */
1843   if (15 == (internal->r_size & 0x3f))
1844     {
1845       if (R_BA == internal->r_type)
1846         relent->howto = &xcoff64_howto_table[0x1d];
1847       else if (R_RBR == internal->r_type)
1848         relent->howto = &xcoff64_howto_table[0x1e];
1849       else if (R_RBA == internal->r_type)
1850         relent->howto = &xcoff64_howto_table[0x1f];
1851     }
1852   /* Special case 32 bit */
1853   else if (31 == (internal->r_size & 0x3f))
1854     {
1855       if (R_POS == internal->r_type)
1856         relent->howto = &xcoff64_howto_table[0x1c];
1857     }
1858
1859   /* The r_size field of an XCOFF reloc encodes the bitsize of the
1860      relocation, as well as indicating whether it is signed or not.
1861      Doublecheck that the relocation information gathered from the
1862      type matches this information.  The bitsize is not significant
1863      for R_REF relocs.  */
1864   if (relent->howto->dst_mask != 0
1865       && (relent->howto->bitsize
1866           != ((unsigned int) internal->r_size & 0x3f) + 1))
1867     abort ();
1868 }
1869
1870 reloc_howto_type *
1871 xcoff64_reloc_type_lookup (abfd, code)
1872      bfd *abfd ATTRIBUTE_UNUSED;
1873      bfd_reloc_code_real_type code;
1874 {
1875   switch (code)
1876     {
1877     case BFD_RELOC_PPC_B26:
1878       return &xcoff64_howto_table[0xa];
1879     case BFD_RELOC_PPC_BA16:
1880       return &xcoff64_howto_table[0x1d];
1881     case BFD_RELOC_PPC_BA26:
1882       return &xcoff64_howto_table[8];
1883     case BFD_RELOC_PPC_TOC16:
1884       return &xcoff64_howto_table[3];
1885     case BFD_RELOC_32:
1886     case BFD_RELOC_CTOR:
1887       return &xcoff64_howto_table[0x1c];
1888     case BFD_RELOC_64:
1889       return &xcoff64_howto_table[0];
1890     case BFD_RELOC_NONE:
1891       return &xcoff64_howto_table[0xf];
1892     default:
1893       return NULL;
1894     }
1895 }
1896
1897 static reloc_howto_type *
1898 xcoff64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1899                            const char *r_name)
1900 {
1901   unsigned int i;
1902
1903   for (i = 0;
1904        i < sizeof (xcoff64_howto_table) / sizeof (xcoff64_howto_table[0]);
1905        i++)
1906     if (xcoff64_howto_table[i].name != NULL
1907         && strcasecmp (xcoff64_howto_table[i].name, r_name) == 0)
1908       return &xcoff64_howto_table[i];
1909
1910   return NULL;
1911 }
1912
1913 /* Read in the armap of an XCOFF archive.  */
1914
1915 static bfd_boolean
1916 xcoff64_slurp_armap (abfd)
1917      bfd *abfd;
1918 {
1919   file_ptr off;
1920   size_t namlen;
1921   bfd_size_type sz, amt;
1922   bfd_byte *contents, *cend;
1923   bfd_vma c, i;
1924   carsym *arsym;
1925   bfd_byte *p;
1926   file_ptr pos;
1927
1928   /* This is for the new format.  */
1929   struct xcoff_ar_hdr_big hdr;
1930
1931   if (xcoff_ardata (abfd) == NULL)
1932     {
1933       bfd_has_map (abfd) = FALSE;
1934       return TRUE;
1935     }
1936
1937   off = bfd_scan_vma (xcoff_ardata_big (abfd)->symoff64,
1938                       (const char **) NULL, 10);
1939   if (off == 0)
1940     {
1941       bfd_has_map (abfd) = FALSE;
1942       return TRUE;
1943     }
1944
1945   if (bfd_seek (abfd, off, SEEK_SET) != 0)
1946     return FALSE;
1947
1948   /* The symbol table starts with a normal archive header.  */
1949   if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
1950       != SIZEOF_AR_HDR_BIG)
1951     return FALSE;
1952
1953   /* Skip the name (normally empty).  */
1954   namlen = strtol (hdr.namlen, (char **) NULL, 10);
1955   pos = ((namlen + 1) & ~(size_t) 1) + SXCOFFARFMAG;
1956   if (bfd_seek (abfd, pos, SEEK_CUR) != 0)
1957     return FALSE;
1958
1959   sz = bfd_scan_vma (hdr.size, (const char **) NULL, 10);
1960
1961   /* Read in the entire symbol table.  */
1962   contents = (bfd_byte *) bfd_alloc (abfd, sz);
1963   if (contents == NULL)
1964     return FALSE;
1965   if (bfd_bread ((PTR) contents, sz, abfd) != sz)
1966     return FALSE;
1967
1968   /* The symbol table starts with an eight byte count.  */
1969   c = H_GET_64 (abfd, contents);
1970
1971   if (c * 8 >= sz)
1972     {
1973       bfd_set_error (bfd_error_bad_value);
1974       return FALSE;
1975     }
1976   amt = c;
1977   amt *= sizeof (carsym);
1978   bfd_ardata (abfd)->symdefs = (carsym *) bfd_alloc (abfd, amt);
1979   if (bfd_ardata (abfd)->symdefs == NULL)
1980     return FALSE;
1981
1982   /* After the count comes a list of eight byte file offsets.  */
1983   for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 8;
1984        i < c;
1985        ++i, ++arsym, p += 8)
1986     arsym->file_offset = H_GET_64 (abfd, p);
1987
1988   /* After the file offsets come null terminated symbol names.  */
1989   cend = contents + sz;
1990   for (i = 0, arsym = bfd_ardata (abfd)->symdefs;
1991        i < c;
1992        ++i, ++arsym, p += strlen ((char *) p) + 1)
1993     {
1994       if (p >= cend)
1995         {
1996           bfd_set_error (bfd_error_bad_value);
1997           return FALSE;
1998         }
1999       arsym->name = (char *) p;
2000     }
2001
2002   bfd_ardata (abfd)->symdef_count = c;
2003   bfd_has_map (abfd) = TRUE;
2004
2005   return TRUE;
2006 }
2007
2008
2009 /* See if this is an NEW XCOFF archive.  */
2010
2011 static const bfd_target *
2012 xcoff64_archive_p (abfd)
2013      bfd *abfd;
2014 {
2015   struct artdata *tdata_hold;
2016   char magic[SXCOFFARMAG];
2017   /* This is the new format.  */
2018   struct xcoff_ar_file_hdr_big hdr;
2019   bfd_size_type amt = SXCOFFARMAG;
2020
2021   if (bfd_bread ((PTR) magic, amt, abfd) != amt)
2022     {
2023       if (bfd_get_error () != bfd_error_system_call)
2024         bfd_set_error (bfd_error_wrong_format);
2025       return NULL;
2026     }
2027
2028   if (strncmp (magic, XCOFFARMAGBIG, SXCOFFARMAG) != 0)
2029     {
2030       bfd_set_error (bfd_error_wrong_format);
2031       return NULL;
2032     }
2033
2034   /* Copy over the magic string.  */
2035   memcpy (hdr.magic, magic, SXCOFFARMAG);
2036
2037   /* Now read the rest of the file header.  */
2038   amt = SIZEOF_AR_FILE_HDR_BIG - SXCOFFARMAG;
2039   if (bfd_bread ((PTR) &hdr.memoff, amt, abfd) != amt)
2040     {
2041       if (bfd_get_error () != bfd_error_system_call)
2042         bfd_set_error (bfd_error_wrong_format);
2043       return NULL;
2044     }
2045
2046   tdata_hold = bfd_ardata (abfd);
2047
2048   amt = sizeof (struct artdata);
2049   bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
2050   if (bfd_ardata (abfd) == (struct artdata *) NULL)
2051     goto error_ret_restore;
2052
2053   /* Already cleared by bfd_zalloc above.
2054      bfd_ardata (abfd)->cache = NULL;
2055      bfd_ardata (abfd)->archive_head = NULL;
2056      bfd_ardata (abfd)->symdefs = NULL;
2057      bfd_ardata (abfd)->extended_names = NULL;
2058      bfd_ardata (abfd)->extended_names_size = 0;  */
2059   bfd_ardata (abfd)->first_file_filepos = bfd_scan_vma (hdr.firstmemoff,
2060                                                         (const char **) NULL,
2061                                                         10);
2062
2063   amt = SIZEOF_AR_FILE_HDR_BIG;
2064   bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
2065   if (bfd_ardata (abfd)->tdata == NULL)
2066     goto error_ret;
2067
2068   memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR_BIG);
2069
2070   if (! xcoff64_slurp_armap (abfd))
2071     {
2072     error_ret:
2073       bfd_release (abfd, bfd_ardata (abfd));
2074     error_ret_restore:
2075       bfd_ardata (abfd) = tdata_hold;
2076       return NULL;
2077     }
2078
2079   return abfd->xvec;
2080 }
2081
2082
2083 /* Open the next element in an XCOFF archive.  */
2084
2085 static bfd *
2086 xcoff64_openr_next_archived_file (archive, last_file)
2087      bfd *archive;
2088      bfd *last_file;
2089 {
2090   bfd_vma filestart;
2091
2092   if ((xcoff_ardata (archive) == NULL)
2093       || ! xcoff_big_format_p (archive))
2094     {
2095       bfd_set_error (bfd_error_invalid_operation);
2096       return NULL;
2097     }
2098
2099   if (last_file == NULL)
2100     {
2101       filestart = bfd_ardata (archive)->first_file_filepos;
2102     }
2103   else
2104     {
2105       filestart = bfd_scan_vma (arch_xhdr_big (last_file)->nextoff,
2106                                 (const char **) NULL, 10);
2107     }
2108
2109   if (filestart == 0
2110       || filestart == bfd_scan_vma (xcoff_ardata_big (archive)->memoff,
2111                                     (const char **) NULL, 10)
2112       || filestart == bfd_scan_vma (xcoff_ardata_big (archive)->symoff,
2113                                     (const char **) NULL, 10))
2114     {
2115       bfd_set_error (bfd_error_no_more_archived_files);
2116       return NULL;
2117     }
2118
2119   return _bfd_get_elt_at_filepos (archive, (file_ptr) filestart);
2120 }
2121
2122 /* We can't use the usual coff_sizeof_headers routine, because AIX
2123    always uses an a.out header.  */
2124
2125 static int
2126 xcoff64_sizeof_headers (bfd *abfd,
2127                         struct bfd_link_info *info ATTRIBUTE_UNUSED)
2128 {
2129   int size;
2130
2131   size = bfd_coff_filhsz (abfd);
2132
2133   /* Don't think the small aout header can be used since some of the
2134      old elements have been reordered past the end of the old coff
2135      small aout size.  */
2136
2137   if (xcoff_data (abfd)->full_aouthdr)
2138     size += bfd_coff_aoutsz (abfd);
2139
2140   size += abfd->section_count * bfd_coff_scnhsz (abfd);
2141   return size;
2142 }
2143
2144
2145
2146 static asection *
2147 xcoff64_create_csect_from_smclas (abfd, aux, symbol_name)
2148      bfd *abfd;
2149      union internal_auxent *aux;
2150      const char *symbol_name;
2151 {
2152   asection *return_value = NULL;
2153
2154   /* Changes from 32 :
2155      .sv == 8, is only for 32 bit programs
2156      .ti == 12 and .tb == 13 are now reserved.  */
2157   static const char *names[19] =
2158   {
2159     ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
2160     NULL, ".bs", ".ds", ".uc", NULL,  NULL,  NULL,  ".tc0",
2161     ".td", ".sv64", ".sv3264"
2162   };
2163
2164   if ((19 >= aux->x_csect.x_smclas)
2165       && (NULL != names[aux->x_csect.x_smclas]))
2166     {
2167
2168       return_value = bfd_make_section_anyway
2169         (abfd, names[aux->x_csect.x_smclas]);
2170
2171     }
2172   else
2173     {
2174       (*_bfd_error_handler)
2175         (_("%B: symbol `%s' has unrecognized smclas %d"),
2176          abfd, symbol_name, aux->x_csect.x_smclas);
2177       bfd_set_error (bfd_error_bad_value);
2178     }
2179
2180   return return_value;
2181 }
2182
2183 static bfd_boolean
2184 xcoff64_is_lineno_count_overflow (abfd, value)
2185      bfd *abfd ATTRIBUTE_UNUSED;
2186      bfd_vma value ATTRIBUTE_UNUSED;
2187 {
2188   return FALSE;
2189 }
2190
2191 static bfd_boolean
2192 xcoff64_is_reloc_count_overflow (abfd, value)
2193      bfd *abfd ATTRIBUTE_UNUSED;
2194      bfd_vma value ATTRIBUTE_UNUSED;
2195 {
2196   return FALSE;
2197 }
2198
2199 static bfd_vma
2200 xcoff64_loader_symbol_offset (abfd, ldhdr)
2201      bfd *abfd ATTRIBUTE_UNUSED;
2202      struct internal_ldhdr *ldhdr;
2203 {
2204   return (ldhdr->l_symoff);
2205 }
2206
2207 static bfd_vma
2208 xcoff64_loader_reloc_offset (abfd, ldhdr)
2209      bfd *abfd ATTRIBUTE_UNUSED;
2210      struct internal_ldhdr *ldhdr;
2211 {
2212   return (ldhdr->l_rldoff);
2213 }
2214
2215 static bfd_boolean
2216 xcoff64_bad_format_hook (abfd, filehdr)
2217      bfd * abfd;
2218      PTR filehdr;
2219 {
2220   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
2221
2222   /* Check flavor first.  */
2223   if (bfd_get_flavour (abfd) != bfd_target_xcoff_flavour)
2224     return FALSE;
2225
2226   if (bfd_xcoff_magic_number (abfd) != internal_f->f_magic)
2227     return FALSE;
2228
2229   return TRUE;
2230 }
2231
2232 static bfd_boolean
2233 xcoff64_generate_rtinit (abfd, init, fini, rtld)
2234      bfd *abfd;
2235      const char *init;
2236      const char *fini;
2237      bfd_boolean rtld;
2238 {
2239   bfd_byte filehdr_ext[FILHSZ];
2240   bfd_byte scnhdr_ext[SCNHSZ * 3];
2241   bfd_byte syment_ext[SYMESZ * 10];
2242   bfd_byte reloc_ext[RELSZ * 3];
2243   bfd_byte *data_buffer;
2244   bfd_size_type data_buffer_size;
2245   bfd_byte *string_table, *st_tmp;
2246   bfd_size_type string_table_size;
2247   bfd_vma val;
2248   size_t initsz, finisz;
2249   struct internal_filehdr filehdr;
2250   struct internal_scnhdr text_scnhdr;
2251   struct internal_scnhdr data_scnhdr;
2252   struct internal_scnhdr bss_scnhdr;
2253   struct internal_syment syment;
2254   union internal_auxent auxent;
2255   struct internal_reloc reloc;
2256
2257   char *text_name = ".text";
2258   char *data_name = ".data";
2259   char *bss_name = ".bss";
2260   char *rtinit_name = "__rtinit";
2261   char *rtld_name = "__rtld";
2262
2263   if (! bfd_xcoff_rtinit_size (abfd))
2264     return FALSE;
2265
2266   initsz = (init == NULL ? 0 : 1 + strlen (init));
2267   finisz = (fini == NULL ? 0 : 1 + strlen (fini));
2268
2269   /* File header.  */
2270   memset (filehdr_ext, 0, FILHSZ);
2271   memset (&filehdr, 0, sizeof (struct internal_filehdr));
2272   filehdr.f_magic = bfd_xcoff_magic_number (abfd);
2273   filehdr.f_nscns = 3;
2274   filehdr.f_timdat = 0;
2275   filehdr.f_nsyms = 0;  /* at least 6, no more than 8 */
2276   filehdr.f_symptr = 0; /* set below */
2277   filehdr.f_opthdr = 0;
2278   filehdr.f_flags = 0;
2279
2280   /* Section headers.  */
2281   memset (scnhdr_ext, 0, 3 * SCNHSZ);
2282
2283   /* Text.  */
2284   memset (&text_scnhdr, 0, sizeof (struct internal_scnhdr));
2285   memcpy (text_scnhdr.s_name, text_name, strlen (text_name));
2286   text_scnhdr.s_paddr = 0;
2287   text_scnhdr.s_vaddr = 0;
2288   text_scnhdr.s_size = 0;
2289   text_scnhdr.s_scnptr = 0;
2290   text_scnhdr.s_relptr = 0;
2291   text_scnhdr.s_lnnoptr = 0;
2292   text_scnhdr.s_nreloc = 0;
2293   text_scnhdr.s_nlnno = 0;
2294   text_scnhdr.s_flags = STYP_TEXT;
2295
2296   /* Data.  */
2297   memset (&data_scnhdr, 0, sizeof (struct internal_scnhdr));
2298   memcpy (data_scnhdr.s_name, data_name, strlen (data_name));
2299   data_scnhdr.s_paddr = 0;
2300   data_scnhdr.s_vaddr = 0;
2301   data_scnhdr.s_size = 0;    /* set below */
2302   data_scnhdr.s_scnptr = FILHSZ + 3 * SCNHSZ;
2303   data_scnhdr.s_relptr = 0;  /* set below */
2304   data_scnhdr.s_lnnoptr = 0;
2305   data_scnhdr.s_nreloc = 0;  /* either 1 or 2 */
2306   data_scnhdr.s_nlnno = 0;
2307   data_scnhdr.s_flags = STYP_DATA;
2308
2309   /* Bss.  */
2310   memset (&bss_scnhdr, 0, sizeof (struct internal_scnhdr));
2311   memcpy (bss_scnhdr.s_name, bss_name, strlen (bss_name));
2312   bss_scnhdr.s_paddr = 0; /* set below */
2313   bss_scnhdr.s_vaddr = 0; /* set below */
2314   bss_scnhdr.s_size = 0;  /* set below */
2315   bss_scnhdr.s_scnptr = 0;
2316   bss_scnhdr.s_relptr = 0;
2317   bss_scnhdr.s_lnnoptr = 0;
2318   bss_scnhdr.s_nreloc = 0;
2319   bss_scnhdr.s_nlnno = 0;
2320   bss_scnhdr.s_flags = STYP_BSS;
2321
2322   /* .data
2323      0x0000           0x00000000 : rtl
2324      0x0004           0x00000000 :
2325      0x0008           0x00000018 : offset to init, or 0
2326      0x000C           0x00000038 : offset to fini, or 0
2327      0x0010           0x00000010 : size of descriptor
2328      0x0014           0x00000000 : pad
2329      0x0018           0x00000000 : init, needs a reloc
2330      0x001C           0x00000000 :
2331      0x0020           0x00000058 : offset to init name
2332      0x0024           0x00000000 : flags, padded to a word
2333      0x0028           0x00000000 : empty init
2334      0x002C           0x00000000 :
2335      0x0030           0x00000000 :
2336      0x0034           0x00000000 :
2337      0x0038           0x00000000 : fini, needs a reloc
2338      0x003C           0x00000000 :
2339      0x0040           0x00000??? : offset to fini name
2340      0x0044           0x00000000 : flags, padded to a word
2341      0x0048           0x00000000 : empty fini
2342      0x004C           0x00000000 :
2343      0x0050           0x00000000 :
2344      0x0054           0x00000000 :
2345      0x0058           init name
2346      0x0058 + initsz  fini name */
2347
2348   data_buffer_size = 0x0058 + initsz + finisz;
2349   data_buffer_size = (data_buffer_size + 7) &~ (bfd_size_type) 7;
2350   data_buffer = NULL;
2351   data_buffer = (bfd_byte *) bfd_zmalloc (data_buffer_size);
2352   if (data_buffer == NULL)
2353     return FALSE;
2354
2355   if (initsz)
2356     {
2357       val = 0x18;
2358       bfd_put_32 (abfd, val, &data_buffer[0x08]);
2359       val = 0x58;
2360       bfd_put_32 (abfd, val, &data_buffer[0x20]);
2361       memcpy (&data_buffer[val], init, initsz);
2362     }
2363
2364   if (finisz)
2365     {
2366       val = 0x38;
2367       bfd_put_32 (abfd, val, &data_buffer[0x0C]);
2368       val = 0x58 + initsz;
2369       bfd_put_32 (abfd, val, &data_buffer[0x40]);
2370       memcpy (&data_buffer[val], fini, finisz);
2371     }
2372
2373   val = 0x10;
2374   bfd_put_32 (abfd, val, &data_buffer[0x10]);
2375   data_scnhdr.s_size = data_buffer_size;
2376   bss_scnhdr.s_paddr = bss_scnhdr.s_vaddr = data_scnhdr.s_size;
2377
2378   /* String table.  */
2379   string_table_size = 4;
2380   string_table_size += strlen (data_name) + 1;
2381   string_table_size += strlen (rtinit_name) + 1;
2382   string_table_size += initsz;
2383   string_table_size += finisz;
2384   if (rtld)
2385     string_table_size += strlen (rtld_name) + 1;
2386
2387   string_table = (bfd_byte *) bfd_zmalloc (string_table_size);
2388   if (string_table == NULL)
2389     return FALSE;
2390
2391   val = string_table_size;
2392   bfd_put_32 (abfd, val, &string_table[0]);
2393   st_tmp = string_table + 4;
2394
2395   /* symbols
2396      0. .data csect
2397      2. __rtinit
2398      4. init function
2399      6. fini function
2400      8. __rtld  */
2401   memset (syment_ext, 0, 10 * SYMESZ);
2402   memset (reloc_ext, 0, 3 * RELSZ);
2403
2404   /* .data csect */
2405   memset (&syment, 0, sizeof (struct internal_syment));
2406   memset (&auxent, 0, sizeof (union internal_auxent));
2407
2408   syment._n._n_n._n_offset = st_tmp - string_table;
2409   memcpy (st_tmp, data_name, strlen (data_name));
2410   st_tmp += strlen (data_name) + 1;
2411
2412   syment.n_scnum = 2;
2413   syment.n_sclass = C_HIDEXT;
2414   syment.n_numaux = 1;
2415   auxent.x_csect.x_scnlen.l = data_buffer_size;
2416   auxent.x_csect.x_smtyp = 3 << 3 | XTY_SD;
2417   auxent.x_csect.x_smclas = XMC_RW;
2418   bfd_coff_swap_sym_out (abfd, &syment,
2419                          &syment_ext[filehdr.f_nsyms * SYMESZ]);
2420   bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
2421                          syment.n_numaux,
2422                          &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
2423   filehdr.f_nsyms += 2;
2424
2425   /* __rtinit */
2426   memset (&syment, 0, sizeof (struct internal_syment));
2427   memset (&auxent, 0, sizeof (union internal_auxent));
2428   syment._n._n_n._n_offset = st_tmp - string_table;
2429   memcpy (st_tmp, rtinit_name, strlen (rtinit_name));
2430   st_tmp += strlen (rtinit_name) + 1;
2431
2432   syment.n_scnum = 2;
2433   syment.n_sclass = C_EXT;
2434   syment.n_numaux = 1;
2435   auxent.x_csect.x_smtyp = XTY_LD;
2436   auxent.x_csect.x_smclas = XMC_RW;
2437   bfd_coff_swap_sym_out (abfd, &syment,
2438                          &syment_ext[filehdr.f_nsyms * SYMESZ]);
2439   bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
2440                          syment.n_numaux,
2441                          &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
2442   filehdr.f_nsyms += 2;
2443
2444   /* Init.  */
2445   if (initsz)
2446     {
2447       memset (&syment, 0, sizeof (struct internal_syment));
2448       memset (&auxent, 0, sizeof (union internal_auxent));
2449
2450       syment._n._n_n._n_offset = st_tmp - string_table;
2451       memcpy (st_tmp, init, initsz);
2452       st_tmp += initsz;
2453
2454       syment.n_sclass = C_EXT;
2455       syment.n_numaux = 1;
2456       bfd_coff_swap_sym_out (abfd, &syment,
2457                              &syment_ext[filehdr.f_nsyms * SYMESZ]);
2458       bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
2459                              syment.n_numaux,
2460                              &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
2461       /* Reloc.  */
2462       memset (&reloc, 0, sizeof (struct internal_reloc));
2463       reloc.r_vaddr = 0x0018;
2464       reloc.r_symndx = filehdr.f_nsyms;
2465       reloc.r_type = R_POS;
2466       reloc.r_size = 63;
2467       bfd_coff_swap_reloc_out (abfd, &reloc, &reloc_ext[0]);
2468
2469       filehdr.f_nsyms += 2;
2470       data_scnhdr.s_nreloc += 1;
2471     }
2472
2473   /* Finit.  */
2474   if (finisz)
2475     {
2476       memset (&syment, 0, sizeof (struct internal_syment));
2477       memset (&auxent, 0, sizeof (union internal_auxent));
2478
2479       syment._n._n_n._n_offset = st_tmp - string_table;
2480       memcpy (st_tmp, fini, finisz);
2481       st_tmp += finisz;
2482
2483       syment.n_sclass = C_EXT;
2484       syment.n_numaux = 1;
2485       bfd_coff_swap_sym_out (abfd, &syment,
2486                              &syment_ext[filehdr.f_nsyms * SYMESZ]);
2487       bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
2488                              syment.n_numaux,
2489                              &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
2490
2491       /* Reloc.  */
2492       memset (&reloc, 0, sizeof (struct internal_reloc));
2493       reloc.r_vaddr = 0x0038;
2494       reloc.r_symndx = filehdr.f_nsyms;
2495       reloc.r_type = R_POS;
2496       reloc.r_size = 63;
2497       bfd_coff_swap_reloc_out (abfd, &reloc,
2498                                &reloc_ext[data_scnhdr.s_nreloc * RELSZ]);
2499
2500       filehdr.f_nsyms += 2;
2501       data_scnhdr.s_nreloc += 1;
2502     }
2503
2504   if (rtld)
2505     {
2506       memset (&syment, 0, sizeof (struct internal_syment));
2507       memset (&auxent, 0, sizeof (union internal_auxent));
2508
2509       syment._n._n_n._n_offset = st_tmp - string_table;
2510       memcpy (st_tmp, rtld_name, strlen (rtld_name));
2511       st_tmp += strlen (rtld_name) + 1;
2512
2513       syment.n_sclass = C_EXT;
2514       syment.n_numaux = 1;
2515       bfd_coff_swap_sym_out (abfd, &syment,
2516                              &syment_ext[filehdr.f_nsyms * SYMESZ]);
2517       bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
2518                              syment.n_numaux,
2519                              &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
2520
2521       /* Reloc.  */
2522       memset (&reloc, 0, sizeof (struct internal_reloc));
2523       reloc.r_vaddr = 0x0000;
2524       reloc.r_symndx = filehdr.f_nsyms;
2525       reloc.r_type = R_POS;
2526       reloc.r_size = 63;
2527       bfd_coff_swap_reloc_out (abfd, &reloc,
2528                                &reloc_ext[data_scnhdr.s_nreloc * RELSZ]);
2529
2530       filehdr.f_nsyms += 2;
2531       data_scnhdr.s_nreloc += 1;
2532
2533       bss_scnhdr.s_size = 0;
2534     }
2535
2536   data_scnhdr.s_relptr = data_scnhdr.s_scnptr + data_buffer_size;
2537   filehdr.f_symptr = data_scnhdr.s_relptr + data_scnhdr.s_nreloc * RELSZ;
2538
2539   bfd_coff_swap_filehdr_out (abfd, &filehdr, filehdr_ext);
2540   bfd_bwrite (filehdr_ext, FILHSZ, abfd);
2541   bfd_coff_swap_scnhdr_out (abfd, &text_scnhdr, &scnhdr_ext[SCNHSZ * 0]);
2542   bfd_coff_swap_scnhdr_out (abfd, &data_scnhdr, &scnhdr_ext[SCNHSZ * 1]);
2543   bfd_coff_swap_scnhdr_out (abfd, &bss_scnhdr, &scnhdr_ext[SCNHSZ * 2]);
2544   bfd_bwrite (scnhdr_ext, 3 * SCNHSZ, abfd);
2545   bfd_bwrite (data_buffer, data_buffer_size, abfd);
2546   bfd_bwrite (reloc_ext, data_scnhdr.s_nreloc * RELSZ, abfd);
2547   bfd_bwrite (syment_ext, filehdr.f_nsyms * SYMESZ, abfd);
2548   bfd_bwrite (string_table, string_table_size, abfd);
2549
2550   free (data_buffer);
2551   data_buffer = NULL;
2552
2553   return TRUE;
2554 }
2555
2556 /* The typical dynamic reloc.  */
2557
2558 static reloc_howto_type xcoff64_dynamic_reloc =
2559 HOWTO (0,                       /* type */
2560        0,                       /* rightshift */
2561        4,                       /* size (0 = byte, 1 = short, 2 = long) */
2562        64,                      /* bitsize */
2563        FALSE,                   /* pc_relative */
2564        0,                       /* bitpos */
2565        complain_overflow_bitfield, /* complain_on_overflow */
2566        0,                       /* special_function */
2567        "R_POS",                 /* name */
2568        TRUE,                    /* partial_inplace */
2569        MINUS_ONE,               /* src_mask */
2570        MINUS_ONE,               /* dst_mask */
2571        FALSE);                  /* pcrel_offset */
2572
2573 static unsigned long xcoff64_glink_code[10] =
2574 {
2575   0xe9820000,   /* ld r12,0(r2) */
2576   0xf8410028,   /* std r2,40(r1) */
2577   0xe80c0000,   /* ld r0,0(r12) */
2578   0xe84c0008,   /* ld r0,8(r12) */
2579   0x7c0903a6,   /* mtctr r0 */
2580   0x4e800420,   /* bctr */
2581   0x00000000,   /* start of traceback table */
2582   0x000ca000,   /* traceback table */
2583   0x00000000,   /* traceback table */
2584   0x00000018,   /* ??? */
2585 };
2586
2587 static const struct xcoff_backend_data_rec bfd_xcoff_backend_data =
2588   {
2589     { /* COFF backend, defined in libcoff.h.  */
2590       _bfd_xcoff64_swap_aux_in,
2591       _bfd_xcoff64_swap_sym_in,
2592       _bfd_xcoff64_swap_lineno_in,
2593       _bfd_xcoff64_swap_aux_out,
2594       _bfd_xcoff64_swap_sym_out,
2595       _bfd_xcoff64_swap_lineno_out,
2596       xcoff64_swap_reloc_out,
2597       coff_swap_filehdr_out,
2598       coff_swap_aouthdr_out,
2599       coff_swap_scnhdr_out,
2600       FILHSZ,
2601       AOUTSZ,
2602       SCNHSZ,
2603       SYMESZ,
2604       AUXESZ,
2605       RELSZ,
2606       LINESZ,
2607       FILNMLEN,
2608       TRUE,                     /* _bfd_coff_long_filenames */
2609       XCOFF_NO_LONG_SECTION_NAMES,  /* _bfd_coff_long_section_names */
2610       3,                        /* _bfd_coff_default_section_alignment_power */
2611       TRUE,                     /* _bfd_coff_force_symnames_in_strings */
2612       4,                        /* _bfd_coff_debug_string_prefix_length */
2613       coff_swap_filehdr_in,
2614       coff_swap_aouthdr_in,
2615       coff_swap_scnhdr_in,
2616       xcoff64_swap_reloc_in,
2617       xcoff64_bad_format_hook,
2618       coff_set_arch_mach_hook,
2619       coff_mkobject_hook,
2620       styp_to_sec_flags,
2621       coff_set_alignment_hook,
2622       coff_slurp_symbol_table,
2623       symname_in_debug_hook,
2624       coff_pointerize_aux_hook,
2625       coff_print_aux,
2626       dummy_reloc16_extra_cases,
2627       dummy_reloc16_estimate,
2628       NULL,                     /* bfd_coff_symbol_classification */
2629       coff_compute_section_file_positions,
2630       NULL,                     /* _bfd_coff_start_final_link */
2631       xcoff64_ppc_relocate_section,
2632       coff_rtype_to_howto,
2633       NULL,                     /* _bfd_coff_adjust_symndx */
2634       _bfd_generic_link_add_one_symbol,
2635       coff_link_output_has_begun,
2636       coff_final_link_postscript,
2637       NULL                      /* print_pdata.  */
2638     },
2639
2640     0x01EF,                     /* magic number */
2641     bfd_arch_powerpc,
2642     bfd_mach_ppc_620,
2643
2644     /* Function pointers to xcoff specific swap routines.  */
2645     xcoff64_swap_ldhdr_in,
2646     xcoff64_swap_ldhdr_out,
2647     xcoff64_swap_ldsym_in,
2648     xcoff64_swap_ldsym_out,
2649     xcoff64_swap_ldrel_in,
2650     xcoff64_swap_ldrel_out,
2651
2652     /* Sizes.  */
2653     LDHDRSZ,
2654     LDSYMSZ,
2655     LDRELSZ,
2656     24,                         /* _xcoff_function_descriptor_size */
2657     0,                          /* _xcoff_small_aout_header_size */
2658
2659     /* Versions.  */
2660     2,                          /* _xcoff_ldhdr_version */
2661
2662     _bfd_xcoff64_put_symbol_name,
2663     _bfd_xcoff64_put_ldsymbol_name,
2664     &xcoff64_dynamic_reloc,
2665     xcoff64_create_csect_from_smclas,
2666
2667     /* Lineno and reloc count overflow.  */
2668     xcoff64_is_lineno_count_overflow,
2669     xcoff64_is_reloc_count_overflow,
2670
2671     xcoff64_loader_symbol_offset,
2672     xcoff64_loader_reloc_offset,
2673
2674     /* glink.  */
2675     &xcoff64_glink_code[0],
2676     40,                         /* _xcoff_glink_size */
2677
2678     /* rtinit.  */
2679     88,                         /* _xcoff_rtinit_size */
2680     xcoff64_generate_rtinit,
2681   };
2682
2683 /* The transfer vector that leads the outside world to all of the above.  */
2684 const bfd_target rs6000coff64_vec =
2685   {
2686     "aixcoff64-rs6000",
2687     bfd_target_xcoff_flavour,
2688     BFD_ENDIAN_BIG,             /* data byte order is big */
2689     BFD_ENDIAN_BIG,             /* header byte order is big */
2690
2691     (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
2692      | HAS_SYMS | HAS_LOCALS | WP_TEXT),
2693
2694     SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
2695     0,                          /* leading char */
2696     '/',                        /* ar_pad_char */
2697     15,                         /* ar_max_namelen */
2698
2699     /* data */
2700     bfd_getb64,
2701     bfd_getb_signed_64,
2702     bfd_putb64,
2703     bfd_getb32,
2704     bfd_getb_signed_32,
2705     bfd_putb32,
2706     bfd_getb16,
2707     bfd_getb_signed_16,
2708     bfd_putb16,
2709
2710     /* hdrs */
2711     bfd_getb64,
2712     bfd_getb_signed_64,
2713     bfd_putb64,
2714     bfd_getb32,
2715     bfd_getb_signed_32,
2716     bfd_putb32,
2717     bfd_getb16,
2718     bfd_getb_signed_16,
2719     bfd_putb16,
2720
2721     { /* bfd_check_format */
2722       _bfd_dummy_target,
2723       coff_object_p,
2724       xcoff64_archive_p,
2725       CORE_FILE_P
2726     },
2727
2728     { /* bfd_set_format */
2729       bfd_false,
2730       coff_mkobject,
2731       _bfd_generic_mkarchive,
2732       bfd_false
2733     },
2734
2735     {/* bfd_write_contents */
2736       bfd_false,
2737       xcoff64_write_object_contents,
2738       _bfd_xcoff_write_archive_contents,
2739       bfd_false
2740     },
2741
2742     /* Generic */
2743     bfd_true,
2744     bfd_true,
2745     coff_new_section_hook,
2746     _bfd_generic_get_section_contents,
2747     _bfd_generic_get_section_contents_in_window,
2748
2749     /* Copy */
2750     _bfd_xcoff_copy_private_bfd_data,
2751     _bfd_generic_bfd_merge_private_bfd_data,
2752     _bfd_generic_init_private_section_data,
2753     _bfd_generic_bfd_copy_private_section_data,
2754     _bfd_generic_bfd_copy_private_symbol_data,
2755     _bfd_generic_bfd_copy_private_header_data,
2756     _bfd_generic_bfd_set_private_flags,
2757     _bfd_generic_bfd_print_private_bfd_data,
2758
2759     /* Core */
2760     BFD_JUMP_TABLE_CORE (coff),
2761
2762     /* Archive */
2763     xcoff64_slurp_armap,
2764     _bfd_noarchive_slurp_extended_name_table,
2765     _bfd_noarchive_construct_extended_name_table,
2766     bfd_dont_truncate_arname,
2767     _bfd_xcoff_write_armap,
2768     _bfd_xcoff_read_ar_hdr,
2769     _bfd_generic_write_ar_hdr,
2770     xcoff64_openr_next_archived_file,
2771     _bfd_generic_get_elt_at_index,
2772     _bfd_xcoff_stat_arch_elt,
2773     bfd_true,
2774
2775     /* Symbols */
2776     coff_get_symtab_upper_bound,
2777     coff_canonicalize_symtab,
2778     coff_make_empty_symbol,
2779     coff_print_symbol,
2780     coff_get_symbol_info,
2781     _bfd_xcoff_is_local_label_name,
2782     coff_bfd_is_target_special_symbol,
2783     coff_get_lineno,
2784     coff_find_nearest_line,
2785     _bfd_generic_find_line,
2786     coff_find_inliner_info,
2787     coff_bfd_make_debug_symbol,
2788     _bfd_generic_read_minisymbols,
2789     _bfd_generic_minisymbol_to_symbol,
2790
2791     /* Reloc */
2792     coff_get_reloc_upper_bound,
2793     coff_canonicalize_reloc,
2794     xcoff64_reloc_type_lookup,
2795     xcoff64_reloc_name_lookup,
2796
2797     /* Write */
2798     coff_set_arch_mach,
2799     coff_set_section_contents,
2800
2801     /* Link */
2802     xcoff64_sizeof_headers,
2803     bfd_generic_get_relocated_section_contents,
2804     bfd_generic_relax_section,
2805     _bfd_xcoff_bfd_link_hash_table_create,
2806     _bfd_generic_link_hash_table_free,
2807     _bfd_xcoff_bfd_link_add_symbols,
2808     _bfd_generic_link_just_syms,
2809     _bfd_generic_copy_link_hash_symbol_type,
2810     _bfd_xcoff_bfd_final_link,
2811     _bfd_generic_link_split_section,
2812     bfd_generic_gc_sections,
2813     bfd_generic_merge_sections,
2814     bfd_generic_is_group_section,
2815     bfd_generic_discard_group,
2816     _bfd_generic_section_already_linked,
2817     _bfd_xcoff_define_common_symbol,
2818
2819     /* Dynamic */
2820     _bfd_xcoff_get_dynamic_symtab_upper_bound,
2821     _bfd_xcoff_canonicalize_dynamic_symtab,
2822     _bfd_nodynamic_get_synthetic_symtab,
2823     _bfd_xcoff_get_dynamic_reloc_upper_bound,
2824     _bfd_xcoff_canonicalize_dynamic_reloc,
2825
2826     /* Opposite endian version, none exists */
2827     NULL,
2828
2829     (void *) &bfd_xcoff_backend_data,
2830   };
2831
2832 extern const bfd_target *xcoff64_core_p
2833   PARAMS ((bfd *));
2834 extern bfd_boolean xcoff64_core_file_matches_executable_p
2835   PARAMS ((bfd *, bfd *));
2836 extern char *xcoff64_core_file_failing_command
2837   PARAMS ((bfd *));
2838 extern int xcoff64_core_file_failing_signal
2839   PARAMS ((bfd *));
2840 #define xcoff64_core_file_pid \
2841   _bfd_nocore_core_file_pid
2842
2843 /* AIX 5 */
2844 static const struct xcoff_backend_data_rec bfd_xcoff_aix5_backend_data =
2845   {
2846     { /* COFF backend, defined in libcoff.h.  */
2847       _bfd_xcoff64_swap_aux_in,
2848       _bfd_xcoff64_swap_sym_in,
2849       _bfd_xcoff64_swap_lineno_in,
2850       _bfd_xcoff64_swap_aux_out,
2851       _bfd_xcoff64_swap_sym_out,
2852       _bfd_xcoff64_swap_lineno_out,
2853       xcoff64_swap_reloc_out,
2854       coff_swap_filehdr_out,
2855       coff_swap_aouthdr_out,
2856       coff_swap_scnhdr_out,
2857       FILHSZ,
2858       AOUTSZ,
2859       SCNHSZ,
2860       SYMESZ,
2861       AUXESZ,
2862       RELSZ,
2863       LINESZ,
2864       FILNMLEN,
2865       TRUE,                     /* _bfd_coff_long_filenames */
2866       XCOFF_NO_LONG_SECTION_NAMES,  /* _bfd_coff_long_section_names */
2867       3,                        /* _bfd_coff_default_section_alignment_power */
2868       TRUE,                     /* _bfd_coff_force_symnames_in_strings */
2869       4,                        /* _bfd_coff_debug_string_prefix_length */
2870       coff_swap_filehdr_in,
2871       coff_swap_aouthdr_in,
2872       coff_swap_scnhdr_in,
2873       xcoff64_swap_reloc_in,
2874       xcoff64_bad_format_hook,
2875       coff_set_arch_mach_hook,
2876       coff_mkobject_hook,
2877       styp_to_sec_flags,
2878       coff_set_alignment_hook,
2879       coff_slurp_symbol_table,
2880       symname_in_debug_hook,
2881       coff_pointerize_aux_hook,
2882       coff_print_aux,
2883       dummy_reloc16_extra_cases,
2884       dummy_reloc16_estimate,
2885       NULL,                     /* bfd_coff_sym_is_global */
2886       coff_compute_section_file_positions,
2887       NULL,                     /* _bfd_coff_start_final_link */
2888       xcoff64_ppc_relocate_section,
2889       coff_rtype_to_howto,
2890       NULL,                     /* _bfd_coff_adjust_symndx */
2891       _bfd_generic_link_add_one_symbol,
2892       coff_link_output_has_begun,
2893       coff_final_link_postscript,
2894       NULL                      /* print_pdata.  */
2895     },
2896
2897     U64_TOCMAGIC,               /* magic number */
2898     bfd_arch_powerpc,
2899     bfd_mach_ppc_620,
2900
2901     /* Function pointers to xcoff specific swap routines.  */
2902     xcoff64_swap_ldhdr_in,
2903     xcoff64_swap_ldhdr_out,
2904     xcoff64_swap_ldsym_in,
2905     xcoff64_swap_ldsym_out,
2906     xcoff64_swap_ldrel_in,
2907     xcoff64_swap_ldrel_out,
2908
2909     /* Sizes.  */
2910     LDHDRSZ,
2911     LDSYMSZ,
2912     LDRELSZ,
2913     24,                         /* _xcoff_function_descriptor_size */
2914     0,                          /* _xcoff_small_aout_header_size */
2915     /* Versions.  */
2916     2,                          /* _xcoff_ldhdr_version */
2917
2918     _bfd_xcoff64_put_symbol_name,
2919     _bfd_xcoff64_put_ldsymbol_name,
2920     &xcoff64_dynamic_reloc,
2921     xcoff64_create_csect_from_smclas,
2922
2923     /* Lineno and reloc count overflow.  */
2924     xcoff64_is_lineno_count_overflow,
2925     xcoff64_is_reloc_count_overflow,
2926
2927     xcoff64_loader_symbol_offset,
2928     xcoff64_loader_reloc_offset,
2929
2930     /* glink.  */
2931     &xcoff64_glink_code[0],
2932     40,                         /* _xcoff_glink_size */
2933
2934     /* rtinit.  */
2935     88,                         /* _xcoff_rtinit_size */
2936     xcoff64_generate_rtinit,
2937   };
2938
2939 /* The transfer vector that leads the outside world to all of the above.  */
2940 const bfd_target aix5coff64_vec =
2941   {
2942     "aix5coff64-rs6000",
2943     bfd_target_xcoff_flavour,
2944     BFD_ENDIAN_BIG,             /* data byte order is big */
2945     BFD_ENDIAN_BIG,             /* header byte order is big */
2946
2947     (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
2948      | HAS_SYMS | HAS_LOCALS | WP_TEXT),
2949
2950     SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
2951     0,                          /* leading char */
2952     '/',                        /* ar_pad_char */
2953     15,                         /* ar_max_namelen */
2954
2955     /* data */
2956     bfd_getb64,
2957     bfd_getb_signed_64,
2958     bfd_putb64,
2959     bfd_getb32,
2960     bfd_getb_signed_32,
2961     bfd_putb32,
2962     bfd_getb16,
2963     bfd_getb_signed_16,
2964     bfd_putb16,
2965
2966     /* hdrs */
2967     bfd_getb64,
2968     bfd_getb_signed_64,
2969     bfd_putb64,
2970     bfd_getb32,
2971     bfd_getb_signed_32,
2972     bfd_putb32,
2973     bfd_getb16,
2974     bfd_getb_signed_16,
2975     bfd_putb16,
2976
2977     { /* bfd_check_format */
2978       _bfd_dummy_target,
2979       coff_object_p,
2980       xcoff64_archive_p,
2981       xcoff64_core_p
2982     },
2983
2984     { /* bfd_set_format */
2985       bfd_false,
2986       coff_mkobject,
2987       _bfd_generic_mkarchive,
2988       bfd_false
2989     },
2990
2991     {/* bfd_write_contents */
2992       bfd_false,
2993       xcoff64_write_object_contents,
2994       _bfd_xcoff_write_archive_contents,
2995       bfd_false
2996     },
2997
2998     /* Generic */
2999     bfd_true,
3000     bfd_true,
3001     coff_new_section_hook,
3002     _bfd_generic_get_section_contents,
3003     _bfd_generic_get_section_contents_in_window,
3004
3005     /* Copy */
3006     _bfd_xcoff_copy_private_bfd_data,
3007     _bfd_generic_bfd_merge_private_bfd_data,
3008     _bfd_generic_init_private_section_data,
3009     _bfd_generic_bfd_copy_private_section_data,
3010     _bfd_generic_bfd_copy_private_symbol_data,
3011     _bfd_generic_bfd_copy_private_header_data,
3012     _bfd_generic_bfd_set_private_flags,
3013     _bfd_generic_bfd_print_private_bfd_data,
3014
3015     /* Core */
3016     BFD_JUMP_TABLE_CORE (xcoff64),
3017
3018     /* Archive */
3019     xcoff64_slurp_armap,
3020     _bfd_noarchive_slurp_extended_name_table,
3021     _bfd_noarchive_construct_extended_name_table,
3022     bfd_dont_truncate_arname,
3023     _bfd_xcoff_write_armap,
3024     _bfd_xcoff_read_ar_hdr,
3025     _bfd_generic_write_ar_hdr,
3026     xcoff64_openr_next_archived_file,
3027     _bfd_generic_get_elt_at_index,
3028     _bfd_xcoff_stat_arch_elt,
3029     bfd_true,
3030
3031     /* Symbols */
3032     coff_get_symtab_upper_bound,
3033     coff_canonicalize_symtab,
3034     coff_make_empty_symbol,
3035     coff_print_symbol,
3036     coff_get_symbol_info,
3037     _bfd_xcoff_is_local_label_name,
3038     coff_bfd_is_target_special_symbol,
3039     coff_get_lineno,
3040     coff_find_nearest_line,
3041     _bfd_generic_find_line,
3042     coff_find_inliner_info,
3043     coff_bfd_make_debug_symbol,
3044     _bfd_generic_read_minisymbols,
3045     _bfd_generic_minisymbol_to_symbol,
3046
3047     /* Reloc */
3048     coff_get_reloc_upper_bound,
3049     coff_canonicalize_reloc,
3050     xcoff64_reloc_type_lookup,
3051     xcoff64_reloc_name_lookup,
3052
3053     /* Write */
3054     coff_set_arch_mach,
3055     coff_set_section_contents,
3056
3057     /* Link */
3058     xcoff64_sizeof_headers,
3059     bfd_generic_get_relocated_section_contents,
3060     bfd_generic_relax_section,
3061     _bfd_xcoff_bfd_link_hash_table_create,
3062     _bfd_generic_link_hash_table_free,
3063     _bfd_xcoff_bfd_link_add_symbols,
3064     _bfd_generic_link_just_syms,
3065     _bfd_generic_copy_link_hash_symbol_type,
3066     _bfd_xcoff_bfd_final_link,
3067     _bfd_generic_link_split_section,
3068     bfd_generic_gc_sections,
3069     bfd_generic_merge_sections,
3070     bfd_generic_is_group_section,
3071     bfd_generic_discard_group,
3072     _bfd_generic_section_already_linked,
3073     _bfd_xcoff_define_common_symbol,
3074
3075     /* Dynamic */
3076     _bfd_xcoff_get_dynamic_symtab_upper_bound,
3077     _bfd_xcoff_canonicalize_dynamic_symtab,
3078     _bfd_nodynamic_get_synthetic_symtab,
3079     _bfd_xcoff_get_dynamic_reloc_upper_bound,
3080     _bfd_xcoff_canonicalize_dynamic_reloc,
3081
3082     /* Opposite endian version, none exists.  */
3083     NULL,
3084
3085     (void *) & bfd_xcoff_aix5_backend_data,
3086   };