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