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