1 /* BFD back-end for IBM RS/6000 "XCOFF64" files.
2 Copyright (C) 2000-2022 Free Software Foundation, Inc.
3 Written Clinton Popetz.
4 Contributed by Cygnus Support.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
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.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
27 #include "coff/internal.h"
28 #include "coff/xcoff.h"
29 #include "coff/rs6k64.h"
33 #define GET_FILEHDR_SYMPTR H_GET_64
34 #define PUT_FILEHDR_SYMPTR H_PUT_64
35 #define GET_AOUTHDR_DATA_START H_GET_64
36 #define PUT_AOUTHDR_DATA_START H_PUT_64
37 #define GET_AOUTHDR_TEXT_START H_GET_64
38 #define PUT_AOUTHDR_TEXT_START H_PUT_64
39 #define GET_AOUTHDR_TSIZE H_GET_64
40 #define PUT_AOUTHDR_TSIZE H_PUT_64
41 #define GET_AOUTHDR_DSIZE H_GET_64
42 #define PUT_AOUTHDR_DSIZE H_PUT_64
43 #define GET_AOUTHDR_BSIZE H_GET_64
44 #define PUT_AOUTHDR_BSIZE H_PUT_64
45 #define GET_AOUTHDR_ENTRY H_GET_64
46 #define PUT_AOUTHDR_ENTRY H_PUT_64
47 #define GET_SCNHDR_PADDR H_GET_64
48 #define PUT_SCNHDR_PADDR H_PUT_64
49 #define GET_SCNHDR_VADDR H_GET_64
50 #define PUT_SCNHDR_VADDR H_PUT_64
51 #define GET_SCNHDR_SIZE H_GET_64
52 #define PUT_SCNHDR_SIZE H_PUT_64
53 #define GET_SCNHDR_SCNPTR H_GET_64
54 #define PUT_SCNHDR_SCNPTR H_PUT_64
55 #define GET_SCNHDR_RELPTR H_GET_64
56 #define PUT_SCNHDR_RELPTR H_PUT_64
57 #define GET_SCNHDR_LNNOPTR H_GET_64
58 #define PUT_SCNHDR_LNNOPTR H_PUT_64
59 #define GET_SCNHDR_NRELOC H_GET_32
60 #define MAX_SCNHDR_NRELOC 0xffffffff
61 #define PUT_SCNHDR_NRELOC H_PUT_32
62 #define GET_SCNHDR_NLNNO H_GET_32
63 #define MAX_SCNHDR_NLNNO 0xffffffff
64 #define PUT_SCNHDR_NLNNO H_PUT_32
65 #define GET_RELOC_VADDR H_GET_64
66 #define PUT_RELOC_VADDR H_PUT_64
68 #define COFF_FORCE_SYMBOLS_IN_STRINGS
69 #define COFF_DEBUG_STRING_WIDE_PREFIX
72 #define COFF_ADJUST_SCNHDR_OUT_POST(ABFD, INT, EXT) \
75 memset (((SCNHDR *) EXT)->s_pad, 0, \
76 sizeof (((SCNHDR *) EXT)->s_pad)); \
80 #define NO_COFF_LINENOS
82 #define coff_SWAP_lineno_in _bfd_xcoff64_swap_lineno_in
83 #define coff_SWAP_lineno_out _bfd_xcoff64_swap_lineno_out
85 static void _bfd_xcoff64_swap_lineno_in
86 (bfd
*, void *, void *);
87 static unsigned int _bfd_xcoff64_swap_lineno_out
88 (bfd
*, void *, void *);
89 static bool _bfd_xcoff64_put_symbol_name
90 (struct bfd_link_info
*, struct bfd_strtab_hash
*,
91 struct internal_syment
*, const char *);
92 static bool _bfd_xcoff64_put_ldsymbol_name
93 (bfd
*, struct xcoff_loader_info
*, struct internal_ldsym
*, const char *);
94 static void _bfd_xcoff64_swap_sym_in
95 (bfd
*, void *, void *);
96 static unsigned int _bfd_xcoff64_swap_sym_out
97 (bfd
*, void *, void *);
98 static void _bfd_xcoff64_swap_aux_in
99 (bfd
*, void *, int, int, int, int, void *);
100 static unsigned int _bfd_xcoff64_swap_aux_out
101 (bfd
*, void *, int, int, int, int, void *);
102 static void xcoff64_swap_reloc_in
103 (bfd
*, void *, void *);
104 static unsigned int xcoff64_swap_reloc_out
105 (bfd
*, void *, void *);
106 extern bool _bfd_xcoff_mkobject
108 extern bool _bfd_xcoff_copy_private_bfd_data
110 extern bool _bfd_xcoff_is_local_label_name
111 (bfd
*, const char *);
112 extern void xcoff64_rtype2howto
113 (arelent
*, struct internal_reloc
*);
114 extern reloc_howto_type
* xcoff64_reloc_type_lookup
115 (bfd
*, bfd_reloc_code_real_type
);
116 extern bool _bfd_xcoff_slurp_armap
118 extern void *_bfd_xcoff_read_ar_hdr
120 extern bfd
*_bfd_xcoff_openr_next_archived_file
122 extern int _bfd_xcoff_stat_arch_elt
123 (bfd
*, struct stat
*);
124 extern bool _bfd_xcoff_write_armap
125 (bfd
*, unsigned int, struct orl
*, unsigned int, int);
126 extern bool _bfd_xcoff_write_archive_contents
128 extern int _bfd_xcoff_sizeof_headers
129 (bfd
*, struct bfd_link_info
*);
130 extern void _bfd_xcoff_swap_sym_in
131 (bfd
*, void *, void *);
132 extern unsigned int _bfd_xcoff_swap_sym_out
133 (bfd
*, void *, void *);
134 extern void _bfd_xcoff_swap_aux_in
135 (bfd
*, void *, int, int, int, int, void *);
136 extern unsigned int _bfd_xcoff_swap_aux_out
137 (bfd
*, void *, int, int, int, int, void *);
138 static void xcoff64_swap_ldhdr_in
139 (bfd
*, const void *, struct internal_ldhdr
*);
140 static void xcoff64_swap_ldhdr_out
141 (bfd
*, const struct internal_ldhdr
*, void *d
);
142 static void xcoff64_swap_ldsym_in
143 (bfd
*, const void *, struct internal_ldsym
*);
144 static void xcoff64_swap_ldsym_out
145 (bfd
*, const struct internal_ldsym
*, void *d
);
146 static void xcoff64_swap_ldrel_in
147 (bfd
*, const void *, struct internal_ldrel
*);
148 static void xcoff64_swap_ldrel_out
149 (bfd
*, const struct internal_ldrel
*, void *d
);
150 static bool xcoff64_ppc_relocate_section
151 (bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
152 struct internal_reloc
*, struct internal_syment
*,
154 static bool xcoff64_slurp_armap
156 static bfd_cleanup xcoff64_archive_p
158 static bfd
*xcoff64_openr_next_archived_file
160 static int xcoff64_sizeof_headers
161 (bfd
*, struct bfd_link_info
*);
162 static asection
*xcoff64_create_csect_from_smclas
163 (bfd
*, union internal_auxent
*, const char *);
164 static bool xcoff64_is_lineno_count_overflow
166 static bool xcoff64_is_reloc_count_overflow
168 static bfd_vma xcoff64_loader_symbol_offset
169 (bfd
*, struct internal_ldhdr
*);
170 static bfd_vma xcoff64_loader_reloc_offset
171 (bfd
*, struct internal_ldhdr
*);
172 static bool xcoff64_generate_rtinit
173 (bfd
*, const char *, const char *, bool);
174 static bool xcoff64_bad_format_hook
177 /* Relocation functions */
178 static xcoff_reloc_function xcoff64_reloc_type_br
;
180 xcoff_reloc_function
*const
181 xcoff64_calculate_relocation
[XCOFF_MAX_CALCULATE_RELOCATION
] =
183 xcoff_reloc_type_pos
, /* R_POS (0x00) */
184 xcoff_reloc_type_neg
, /* R_NEG (0x01) */
185 xcoff_reloc_type_rel
, /* R_REL (0x02) */
186 xcoff_reloc_type_toc
, /* R_TOC (0x03) */
187 xcoff_reloc_type_toc
, /* R_TRL (0x04) */
188 xcoff_reloc_type_toc
, /* R_GL (0x05) */
189 xcoff_reloc_type_toc
, /* R_TCL (0x06) */
190 xcoff_reloc_type_fail
, /* (0x07) */
191 xcoff_reloc_type_ba
, /* R_BA (0x08) */
192 xcoff_reloc_type_fail
, /* (0x09) */
193 xcoff64_reloc_type_br
, /* R_BR (0x0a) */
194 xcoff_reloc_type_fail
, /* (0x0b) */
195 xcoff_reloc_type_pos
, /* R_RL (0x0c) */
196 xcoff_reloc_type_pos
, /* R_RLA (0x0d) */
197 xcoff_reloc_type_fail
, /* (0x0e) */
198 xcoff_reloc_type_noop
, /* R_REF (0x0f) */
199 xcoff_reloc_type_fail
, /* (0x10) */
200 xcoff_reloc_type_fail
, /* (0x11) */
201 xcoff_reloc_type_fail
, /* (0x12) */
202 xcoff_reloc_type_toc
, /* R_TRLA (0x13) */
203 xcoff_reloc_type_fail
, /* R_RRTBI (0x14) */
204 xcoff_reloc_type_fail
, /* R_RRTBA (0x15) */
205 xcoff_reloc_type_ba
, /* R_CAI (0x16) */
206 xcoff_reloc_type_crel
, /* R_CREL (0x17) */
207 xcoff_reloc_type_ba
, /* R_RBA (0x18) */
208 xcoff_reloc_type_ba
, /* R_RBAC (0x19) */
209 xcoff64_reloc_type_br
, /* R_RBR (0x1a) */
210 xcoff_reloc_type_ba
, /* R_RBRC (0x1b) */
211 xcoff_reloc_type_fail
, /* (0x1c) */
212 xcoff_reloc_type_fail
, /* (0x1d) */
213 xcoff_reloc_type_fail
, /* (0x1e) */
214 xcoff_reloc_type_fail
, /* (0x1f) */
215 xcoff_reloc_type_tls
, /* R_TLS (0x20) */
216 xcoff_reloc_type_tls
, /* R_TLS_IE (0x21) */
217 xcoff_reloc_type_tls
, /* R_TLS_LD (0x22) */
218 xcoff_reloc_type_tls
, /* R_TLS_LE (0x23) */
219 xcoff_reloc_type_tls
, /* R_TLSM (0x24) */
220 xcoff_reloc_type_tls
, /* R_TLSML (0x25) */
221 xcoff_reloc_type_fail
, /* (0x26) */
222 xcoff_reloc_type_fail
, /* (0x27) */
223 xcoff_reloc_type_fail
, /* (0x28) */
224 xcoff_reloc_type_fail
, /* (0x29) */
225 xcoff_reloc_type_fail
, /* (0x2a) */
226 xcoff_reloc_type_fail
, /* (0x2b) */
227 xcoff_reloc_type_fail
, /* (0x2c) */
228 xcoff_reloc_type_fail
, /* (0x2d) */
229 xcoff_reloc_type_fail
, /* (0x2e) */
230 xcoff_reloc_type_fail
, /* (0x2f) */
231 xcoff_reloc_type_toc
, /* R_TOCU (0x30) */
232 xcoff_reloc_type_toc
, /* R_TOCL (0x31) */
235 /* coffcode.h needs these to be defined. */
236 /* Internalcoff.h and coffcode.h modify themselves based on these flags. */
238 #define RS6000COFF_C 1
240 #define SELECT_RELOC(internal, howto) \
242 internal.r_type = howto->type; \
244 ((howto->complain_on_overflow == complain_overflow_signed \
247 | (howto->bitsize - 1)); \
250 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
251 #define COFF_LONG_FILENAMES
252 #define NO_COFF_SYMBOLS
253 #define RTYPE2HOWTO(cache_ptr, dst) xcoff64_rtype2howto (cache_ptr, dst)
254 #define coff_mkobject _bfd_xcoff_mkobject
255 #define coff_bfd_copy_private_bfd_data _bfd_xcoff_copy_private_bfd_data
256 #define coff_bfd_is_local_label_name _bfd_xcoff_is_local_label_name
257 #define coff_bfd_reloc_type_lookup xcoff64_reloc_type_lookup
258 #define coff_bfd_reloc_name_lookup xcoff64_reloc_name_lookup
260 extern bfd_cleanup rs6000coff_core_p
262 extern bool rs6000coff_core_file_matches_executable_p
263 (bfd
*cbfd
, bfd
*ebfd
);
264 extern char *rs6000coff_core_file_failing_command
266 extern int rs6000coff_core_file_failing_signal
268 #define CORE_FILE_P rs6000coff_core_p
269 #define coff_core_file_failing_command \
270 rs6000coff_core_file_failing_command
271 #define coff_core_file_failing_signal \
272 rs6000coff_core_file_failing_signal
273 #define coff_core_file_matches_executable_p \
274 rs6000coff_core_file_matches_executable_p
275 #define coff_core_file_pid \
276 _bfd_nocore_core_file_pid
278 #define CORE_FILE_P _bfd_dummy_target
279 #define coff_core_file_failing_command \
280 _bfd_nocore_core_file_failing_command
281 #define coff_core_file_failing_signal \
282 _bfd_nocore_core_file_failing_signal
283 #define coff_core_file_matches_executable_p \
284 _bfd_nocore_core_file_matches_executable_p
285 #define coff_core_file_pid \
286 _bfd_nocore_core_file_pid
288 #define coff_SWAP_sym_in _bfd_xcoff64_swap_sym_in
289 #define coff_SWAP_sym_out _bfd_xcoff64_swap_sym_out
290 #define coff_SWAP_aux_in _bfd_xcoff64_swap_aux_in
291 #define coff_SWAP_aux_out _bfd_xcoff64_swap_aux_out
292 #define coff_swap_reloc_in xcoff64_swap_reloc_in
293 #define coff_swap_reloc_out xcoff64_swap_reloc_out
294 #define NO_COFF_RELOCS
296 #ifndef bfd_pe_print_pdata
297 #define bfd_pe_print_pdata NULL
300 #include "coffcode.h"
302 /* For XCOFF64, the effective width of symndx changes depending on
303 whether we are the first entry. Sigh. */
305 _bfd_xcoff64_swap_lineno_in (bfd
*abfd
, void *ext1
, void *in1
)
307 LINENO
*ext
= (LINENO
*) ext1
;
308 struct internal_lineno
*in
= (struct internal_lineno
*) in1
;
310 in
->l_lnno
= H_GET_32 (abfd
, (ext
->l_lnno
));
312 in
->l_addr
.l_symndx
= H_GET_32 (abfd
, ext
->l_addr
.l_symndx
);
314 in
->l_addr
.l_paddr
= H_GET_64 (abfd
, ext
->l_addr
.l_paddr
);
318 _bfd_xcoff64_swap_lineno_out (bfd
*abfd
, void *inp
, void *outp
)
320 struct internal_lineno
*in
= (struct internal_lineno
*) inp
;
321 struct external_lineno
*ext
= (struct external_lineno
*) outp
;
323 H_PUT_32 (abfd
, in
->l_addr
.l_symndx
, ext
->l_addr
.l_symndx
);
324 H_PUT_32 (abfd
, in
->l_lnno
, (ext
->l_lnno
));
327 H_PUT_32 (abfd
, in
->l_addr
.l_symndx
, ext
->l_addr
.l_symndx
);
329 H_PUT_64 (abfd
, in
->l_addr
.l_paddr
, ext
->l_addr
.l_paddr
);
331 return bfd_coff_linesz (abfd
);
335 _bfd_xcoff64_swap_sym_in (bfd
*abfd
, void *ext1
, void *in1
)
337 struct external_syment
*ext
= (struct external_syment
*) ext1
;
338 struct internal_syment
*in
= (struct internal_syment
*) in1
;
340 in
->_n
._n_n
._n_zeroes
= 0;
341 in
->_n
._n_n
._n_offset
= H_GET_32 (abfd
, ext
->e_offset
);
342 in
->n_value
= H_GET_64 (abfd
, ext
->e_value
);
343 in
->n_scnum
= (short) H_GET_16 (abfd
, ext
->e_scnum
);
344 in
->n_type
= H_GET_16 (abfd
, ext
->e_type
);
345 in
->n_sclass
= H_GET_8 (abfd
, ext
->e_sclass
);
346 in
->n_numaux
= H_GET_8 (abfd
, ext
->e_numaux
);
350 _bfd_xcoff64_swap_sym_out (bfd
*abfd
, void *inp
, void *extp
)
352 struct internal_syment
*in
= (struct internal_syment
*) inp
;
353 struct external_syment
*ext
= (struct external_syment
*) extp
;
355 H_PUT_32 (abfd
, in
->_n
._n_n
._n_offset
, ext
->e_offset
);
356 H_PUT_64 (abfd
, in
->n_value
, ext
->e_value
);
357 H_PUT_16 (abfd
, in
->n_scnum
, ext
->e_scnum
);
358 H_PUT_16 (abfd
, in
->n_type
, ext
->e_type
);
359 H_PUT_8 (abfd
, in
->n_sclass
, ext
->e_sclass
);
360 H_PUT_8 (abfd
, in
->n_numaux
, ext
->e_numaux
);
361 return bfd_coff_symesz (abfd
);
365 _bfd_xcoff64_swap_aux_in (bfd
*abfd
, void *ext1
, int type ATTRIBUTE_UNUSED
,
366 int in_class
, int indx
, int numaux
, void *in1
)
368 union external_auxent
*ext
= (union external_auxent
*) ext1
;
369 union internal_auxent
*in
= (union internal_auxent
*) in1
;
370 unsigned char auxtype
;
376 /* xgettext: c-format */
377 (_("%pB: unsupported swap_aux_in for storage class %#x"),
378 abfd
, (unsigned int) in_class
);
379 bfd_set_error (bfd_error_bad_value
);
383 auxtype
= H_GET_8 (abfd
, ext
->x_file
.x_auxtype
);
384 if (auxtype
!= _AUX_FILE
)
387 if (ext
->x_file
.x_n
.x_n
.x_zeroes
[0] == 0)
389 in
->x_file
.x_n
.x_n
.x_zeroes
= 0;
390 in
->x_file
.x_n
.x_n
.x_offset
=
391 H_GET_32 (abfd
, ext
->x_file
.x_n
.x_n
.x_offset
);
394 memcpy (in
->x_file
.x_n
.x_fname
, ext
->x_file
.x_n
.x_fname
, FILNMLEN
);
395 in
->x_file
.x_ftype
= H_GET_8 (abfd
, ext
->x_file
.x_ftype
);
398 /* RS/6000 "csect" auxents.
399 There is always a CSECT auxiliary entry. But functions can
400 have FCN and EXCEPT ones too. In this case, CSECT is always the last
402 For now, we only support FCN types. */
406 if (indx
+ 1 == numaux
)
408 /* C_EXT can have several aux enties. But the _AUX_CSECT is always
410 auxtype
= H_GET_8 (abfd
, ext
->x_csect
.x_auxtype
);
411 if (auxtype
!= _AUX_CSECT
)
414 bfd_vma h
= H_GET_S32 (abfd
, ext
->x_csect
.x_scnlen_hi
);
415 bfd_vma l
= H_GET_32 (abfd
, ext
->x_csect
.x_scnlen_lo
);
417 in
->x_csect
.x_scnlen
.l
= h
<< 32 | (l
& 0xffffffff);
419 in
->x_csect
.x_parmhash
= H_GET_32 (abfd
, ext
->x_csect
.x_parmhash
);
420 in
->x_csect
.x_snhash
= H_GET_16 (abfd
, ext
->x_csect
.x_snhash
);
421 /* We don't have to hack bitfields in x_smtyp because it's
422 defined by shifts-and-ands, which are equivalent on all
424 in
->x_csect
.x_smtyp
= H_GET_8 (abfd
, ext
->x_csect
.x_smtyp
);
425 in
->x_csect
.x_smclas
= H_GET_8 (abfd
, ext
->x_csect
.x_smclas
);
429 /* It can also be a _AUX_EXCEPT entry. But it's not supported
431 auxtype
= H_GET_8 (abfd
, ext
->x_fcn
.x_auxtype
);
432 if (auxtype
!= _AUX_FCN
)
435 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
436 = H_GET_64 (abfd
, ext
->x_fcn
.x_lnnoptr
);
437 in
->x_sym
.x_misc
.x_fsize
438 = H_GET_32 (abfd
, ext
->x_fcn
.x_fsize
);
439 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
440 = H_GET_32 (abfd
, ext
->x_fcn
.x_endndx
);
446 /* xgettext: c-format */
447 (_("%pB: C_STAT isn't supported by XCOFF64"),
449 bfd_set_error (bfd_error_bad_value
);
454 auxtype
= H_GET_8 (abfd
, ext
->x_sym
.x_auxtype
);
455 if (auxtype
!= _AUX_SYM
)
458 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
459 = H_GET_32 (abfd
, ext
->x_sym
.x_lnno
);
463 auxtype
= H_GET_8 (abfd
, ext
->x_sect
.x_auxtype
);
464 if (auxtype
!= _AUX_SECT
)
467 in
->x_sect
.x_scnlen
= H_GET_64 (abfd
, ext
->x_sect
.x_scnlen
);
468 in
->x_sect
.x_nreloc
= H_GET_64 (abfd
, ext
->x_sect
.x_nreloc
);
476 /* xgettext: c-format */
477 (_("%pB: wrong auxtype %#x for storage class %#x"),
478 abfd
, auxtype
, (unsigned int) in_class
);
479 bfd_set_error (bfd_error_bad_value
);
485 _bfd_xcoff64_swap_aux_out (bfd
*abfd
, void *inp
, int type ATTRIBUTE_UNUSED
,
486 int in_class
, int indx
, int numaux
, void *extp
)
488 union internal_auxent
*in
= (union internal_auxent
*) inp
;
489 union external_auxent
*ext
= (union external_auxent
*) extp
;
491 memset (ext
, 0, bfd_coff_auxesz (abfd
));
496 /* xgettext: c-format */
497 (_("%pB: unsupported swap_aux_out for storage class %#x"),
498 abfd
, (unsigned int) in_class
);
499 bfd_set_error (bfd_error_bad_value
);
503 if (in
->x_file
.x_n
.x_n
.x_zeroes
== 0)
505 H_PUT_32 (abfd
, 0, ext
->x_file
.x_n
.x_n
.x_zeroes
);
506 H_PUT_32 (abfd
, in
->x_file
.x_n
.x_n
.x_offset
,
507 ext
->x_file
.x_n
.x_n
.x_offset
);
510 memcpy (ext
->x_file
.x_n
.x_fname
, in
->x_file
.x_n
.x_fname
, FILNMLEN
);
511 H_PUT_8 (abfd
, in
->x_file
.x_ftype
, ext
->x_file
.x_ftype
);
512 H_PUT_8 (abfd
, _AUX_FILE
, ext
->x_file
.x_auxtype
);
515 /* RS/6000 "csect" auxents.
516 There is always a CSECT auxiliary entry. But functions can
517 have FCN and EXCEPT ones too. In this case, CSECT is always the last
519 For now, we only support FCN types. */
523 if (indx
+ 1 == numaux
)
527 temp
= in
->x_csect
.x_scnlen
.l
& 0xffffffff;
528 H_PUT_32 (abfd
, temp
, ext
->x_csect
.x_scnlen_lo
);
529 temp
= in
->x_csect
.x_scnlen
.l
>> 32;
530 H_PUT_32 (abfd
, temp
, ext
->x_csect
.x_scnlen_hi
);
531 H_PUT_32 (abfd
, in
->x_csect
.x_parmhash
, ext
->x_csect
.x_parmhash
);
532 H_PUT_16 (abfd
, in
->x_csect
.x_snhash
, ext
->x_csect
.x_snhash
);
533 /* We don't have to hack bitfields in x_smtyp because it's
534 defined by shifts-and-ands, which are equivalent on all
536 H_PUT_8 (abfd
, in
->x_csect
.x_smtyp
, ext
->x_csect
.x_smtyp
);
537 H_PUT_8 (abfd
, in
->x_csect
.x_smclas
, ext
->x_csect
.x_smclas
);
538 H_PUT_8 (abfd
, _AUX_CSECT
, ext
->x_csect
.x_auxtype
);
542 H_PUT_64 (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
,
543 ext
->x_fcn
.x_lnnoptr
);
544 H_PUT_32 (abfd
, in
->x_sym
.x_misc
.x_fsize
, ext
->x_fcn
.x_fsize
);
545 H_PUT_32 (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
,
546 ext
->x_fcn
.x_endndx
);
547 H_PUT_8 (abfd
, _AUX_FCN
, ext
->x_csect
.x_auxtype
);
553 /* xgettext: c-format */
554 (_("%pB: C_STAT isn't supported by XCOFF64"),
556 bfd_set_error (bfd_error_bad_value
);
561 H_PUT_32 (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
, ext
->x_sym
.x_lnno
);
562 H_PUT_8 (abfd
, _AUX_SYM
, ext
->x_sym
.x_auxtype
);
566 H_PUT_64 (abfd
, in
->x_sect
.x_scnlen
, ext
->x_sect
.x_scnlen
);
567 H_PUT_64 (abfd
, in
->x_sect
.x_nreloc
, ext
->x_sect
.x_nreloc
);
568 H_PUT_8 (abfd
, _AUX_SECT
, ext
->x_sect
.x_auxtype
);
572 return bfd_coff_auxesz (abfd
);
576 _bfd_xcoff64_put_symbol_name (struct bfd_link_info
*info
,
577 struct bfd_strtab_hash
*strtab
,
578 struct internal_syment
*sym
,
584 hash
= !info
->traditional_format
;
585 indx
= _bfd_stringtab_add (strtab
, name
, hash
, false);
587 if (indx
== (bfd_size_type
) -1)
590 sym
->_n
._n_n
._n_zeroes
= 0;
591 sym
->_n
._n_n
._n_offset
= STRING_SIZE_SIZE
+ indx
;
597 _bfd_xcoff64_put_ldsymbol_name (bfd
*abfd ATTRIBUTE_UNUSED
,
598 struct xcoff_loader_info
*ldinfo
,
599 struct internal_ldsym
*ldsym
,
605 if (ldinfo
->string_size
+ len
+ 3 > ldinfo
->string_alc
)
607 bfd_size_type newalc
;
610 newalc
= ldinfo
->string_alc
* 2;
613 while (ldinfo
->string_size
+ len
+ 3 > newalc
)
616 newstrings
= bfd_realloc (ldinfo
->strings
, newalc
);
617 if (newstrings
== NULL
)
619 ldinfo
->failed
= true;
622 ldinfo
->string_alc
= newalc
;
623 ldinfo
->strings
= newstrings
;
626 ldinfo
->strings
[ldinfo
->string_size
] = ((len
+ 1) >> 8) & 0xff;
627 ldinfo
->strings
[ldinfo
->string_size
+ 1] = ((len
+ 1)) & 0xff;
628 strcpy (ldinfo
->strings
+ ldinfo
->string_size
+ 2, name
);
629 ldsym
->_l
._l_l
._l_zeroes
= 0;
630 ldsym
->_l
._l_l
._l_offset
= ldinfo
->string_size
+ 2;
631 ldinfo
->string_size
+= len
+ 3;
636 /* Routines to swap information in the XCOFF .loader section. If we
637 ever need to write an XCOFF loader, this stuff will need to be
638 moved to another file shared by the linker (which XCOFF calls the
639 ``binder'') and the loader. */
641 /* Swap in the ldhdr structure. */
644 xcoff64_swap_ldhdr_in (bfd
*abfd
,
646 struct internal_ldhdr
*dst
)
648 const struct external_ldhdr
*src
= (const struct external_ldhdr
*) s
;
650 dst
->l_version
= bfd_get_32 (abfd
, src
->l_version
);
651 dst
->l_nsyms
= bfd_get_32 (abfd
, src
->l_nsyms
);
652 dst
->l_nreloc
= bfd_get_32 (abfd
, src
->l_nreloc
);
653 dst
->l_istlen
= bfd_get_32 (abfd
, src
->l_istlen
);
654 dst
->l_nimpid
= bfd_get_32 (abfd
, src
->l_nimpid
);
655 dst
->l_stlen
= bfd_get_32 (abfd
, src
->l_stlen
);
656 dst
->l_impoff
= bfd_get_64 (abfd
, src
->l_impoff
);
657 dst
->l_stoff
= bfd_get_64 (abfd
, src
->l_stoff
);
658 dst
->l_symoff
= bfd_get_64 (abfd
, src
->l_symoff
);
659 dst
->l_rldoff
= bfd_get_64 (abfd
, src
->l_rldoff
);
662 /* Swap out the ldhdr structure. */
665 xcoff64_swap_ldhdr_out (bfd
*abfd
, const struct internal_ldhdr
*src
, void *d
)
667 struct external_ldhdr
*dst
= (struct external_ldhdr
*) d
;
669 bfd_put_32 (abfd
, (bfd_vma
) src
->l_version
, dst
->l_version
);
670 bfd_put_32 (abfd
, src
->l_nsyms
, dst
->l_nsyms
);
671 bfd_put_32 (abfd
, src
->l_nreloc
, dst
->l_nreloc
);
672 bfd_put_32 (abfd
, src
->l_istlen
, dst
->l_istlen
);
673 bfd_put_32 (abfd
, src
->l_nimpid
, dst
->l_nimpid
);
674 bfd_put_32 (abfd
, src
->l_stlen
, dst
->l_stlen
);
675 bfd_put_64 (abfd
, src
->l_impoff
, dst
->l_impoff
);
676 bfd_put_64 (abfd
, src
->l_stoff
, dst
->l_stoff
);
677 bfd_put_64 (abfd
, src
->l_symoff
, dst
->l_symoff
);
678 bfd_put_64 (abfd
, src
->l_rldoff
, dst
->l_rldoff
);
681 /* Swap in the ldsym structure. */
684 xcoff64_swap_ldsym_in (bfd
*abfd
, const void *s
, struct internal_ldsym
*dst
)
686 const struct external_ldsym
*src
= (const struct external_ldsym
*) s
;
687 /* XCOFF64 does not use l_zeroes like XCOFF32
688 Set the internal l_zeroes to 0 so the common 32/64 code uses l_value
689 as an offset into the loader symbol table. */
690 dst
->_l
._l_l
._l_zeroes
= 0;
691 dst
->_l
._l_l
._l_offset
= bfd_get_32 (abfd
, src
->l_offset
);
692 dst
->l_value
= bfd_get_64 (abfd
, src
->l_value
);
693 dst
->l_scnum
= bfd_get_16 (abfd
, src
->l_scnum
);
694 dst
->l_smtype
= bfd_get_8 (abfd
, src
->l_smtype
);
695 dst
->l_smclas
= bfd_get_8 (abfd
, src
->l_smclas
);
696 dst
->l_ifile
= bfd_get_32 (abfd
, src
->l_ifile
);
697 dst
->l_parm
= bfd_get_32 (abfd
, src
->l_parm
);
700 /* Swap out the ldsym structure. */
703 xcoff64_swap_ldsym_out (bfd
*abfd
, const struct internal_ldsym
*src
, void *d
)
705 struct external_ldsym
*dst
= (struct external_ldsym
*) d
;
707 bfd_put_64 (abfd
, src
->l_value
, dst
->l_value
);
708 bfd_put_32 (abfd
, (bfd_vma
) src
->_l
._l_l
._l_offset
, dst
->l_offset
);
709 bfd_put_16 (abfd
, (bfd_vma
) src
->l_scnum
, dst
->l_scnum
);
710 bfd_put_8 (abfd
, src
->l_smtype
, dst
->l_smtype
);
711 bfd_put_8 (abfd
, src
->l_smclas
, dst
->l_smclas
);
712 bfd_put_32 (abfd
, src
->l_ifile
, dst
->l_ifile
);
713 bfd_put_32 (abfd
, src
->l_parm
, dst
->l_parm
);
717 xcoff64_swap_reloc_in (bfd
*abfd
, void *s
, void *d
)
719 struct external_reloc
*src
= (struct external_reloc
*) s
;
720 struct internal_reloc
*dst
= (struct internal_reloc
*) d
;
722 memset (dst
, 0, sizeof (struct internal_reloc
));
724 dst
->r_vaddr
= bfd_get_64 (abfd
, src
->r_vaddr
);
725 dst
->r_symndx
= bfd_get_32 (abfd
, src
->r_symndx
);
726 dst
->r_size
= bfd_get_8 (abfd
, src
->r_size
);
727 dst
->r_type
= bfd_get_8 (abfd
, src
->r_type
);
731 xcoff64_swap_reloc_out (bfd
*abfd
, void *s
, void *d
)
733 struct internal_reloc
*src
= (struct internal_reloc
*) s
;
734 struct external_reloc
*dst
= (struct external_reloc
*) d
;
736 bfd_put_64 (abfd
, src
->r_vaddr
, dst
->r_vaddr
);
737 bfd_put_32 (abfd
, src
->r_symndx
, dst
->r_symndx
);
738 bfd_put_8 (abfd
, src
->r_type
, dst
->r_type
);
739 bfd_put_8 (abfd
, src
->r_size
, dst
->r_size
);
741 return bfd_coff_relsz (abfd
);
744 /* Swap in the ldrel structure. */
747 xcoff64_swap_ldrel_in (bfd
*abfd
, const void *s
, struct internal_ldrel
*dst
)
749 const struct external_ldrel
*src
= (const struct external_ldrel
*) s
;
751 dst
->l_vaddr
= bfd_get_64 (abfd
, src
->l_vaddr
);
752 dst
->l_symndx
= bfd_get_32 (abfd
, src
->l_symndx
);
753 dst
->l_rtype
= bfd_get_16 (abfd
, src
->l_rtype
);
754 dst
->l_rsecnm
= bfd_get_16 (abfd
, src
->l_rsecnm
);
757 /* Swap out the ldrel structure. */
760 xcoff64_swap_ldrel_out (bfd
*abfd
, const struct internal_ldrel
*src
, void *d
)
762 struct external_ldrel
*dst
= (struct external_ldrel
*) d
;
764 bfd_put_64 (abfd
, src
->l_vaddr
, dst
->l_vaddr
);
765 bfd_put_16 (abfd
, (bfd_vma
) src
->l_rtype
, dst
->l_rtype
);
766 bfd_put_16 (abfd
, (bfd_vma
) src
->l_rsecnm
, dst
->l_rsecnm
);
767 bfd_put_32 (abfd
, src
->l_symndx
, dst
->l_symndx
);
772 xcoff64_reloc_type_br (bfd
*input_bfd
,
773 asection
*input_section
,
774 bfd
*output_bfd ATTRIBUTE_UNUSED
,
775 struct internal_reloc
*rel
,
776 struct internal_syment
*sym ATTRIBUTE_UNUSED
,
777 struct reloc_howto_struct
*howto
,
782 struct bfd_link_info
*info
)
784 struct xcoff_link_hash_entry
*h
;
785 bfd_vma section_offset
;
786 struct xcoff_stub_hash_entry
*stub_entry
= NULL
;
787 enum xcoff_stub_type stub_type
;
789 if (0 > rel
->r_symndx
)
792 h
= obj_xcoff_sym_hashes (input_bfd
)[rel
->r_symndx
];
793 section_offset
= rel
->r_vaddr
- input_section
->vma
;
795 /* If we see an R_BR or R_RBR reloc which is jumping to global
796 linkage code, and it is followed by an appropriate cror nop
797 instruction, we replace the cror with ld r2,40(r1). This
798 restores the TOC after the glink code. Contrariwise, if the
799 call is followed by a ld r2,40(r1), but the call is not
800 going to global linkage code, we can replace the load with a
803 && (bfd_link_hash_defined
== h
->root
.type
804 || bfd_link_hash_defweak
== h
->root
.type
)
805 && section_offset
+ 8 <= input_section
->size
)
810 pnext
= contents
+ section_offset
+ 4;
811 next
= bfd_get_32 (input_bfd
, pnext
);
813 /* The _ptrgl function is magic. It is used by the AIX compiler to call
814 a function through a pointer. */
815 if (h
->smclas
== XMC_GL
|| strcmp (h
->root
.root
.string
, "._ptrgl") == 0)
817 if (next
== 0x4def7b82 /* cror 15,15,15 */
818 || next
== 0x4ffffb82 /* cror 31,31,31 */
819 || next
== 0x60000000) /* ori r0,r0,0 */
820 bfd_put_32 (input_bfd
, 0xe8410028, pnext
); /* ld r2,40(r1) */
824 if (next
== 0xe8410028) /* ld r2,40(r1) */
825 bfd_put_32 (input_bfd
, 0x60000000, pnext
); /* ori r0,r0,0 */
828 else if (NULL
!= h
&& bfd_link_hash_undefined
== h
->root
.type
)
830 /* Normally, this relocation is against a defined symbol. In the
831 case where this is a partial link and the output section offset
832 is greater than 2^25, the linker will return an invalid error
833 message that the relocation has been truncated. Yes it has been
834 truncated but no it not important. For this case, disable the
835 overflow checking. */
836 howto
->complain_on_overflow
= complain_overflow_dont
;
839 /* Check if a stub is needed. */
840 stub_type
= bfd_xcoff_type_of_stub (input_section
, rel
, val
, h
);
841 if (stub_type
!= xcoff_stub_none
)
843 asection
*stub_csect
;
845 stub_entry
= bfd_xcoff_get_stub_entry (input_section
, h
, info
);
846 if (stub_entry
== NULL
)
848 _bfd_error_handler (_("Unable to find the stub entry targeting %s"),
849 h
->root
.root
.string
);
850 bfd_set_error (bfd_error_bad_value
);
854 stub_csect
= stub_entry
->hcsect
->root
.u
.def
.section
;
855 val
= (stub_entry
->stub_offset
856 + stub_csect
->output_section
->vma
857 + stub_csect
->output_offset
);
860 /* The original PC-relative relocation is biased by -r_vaddr, so adding
861 the value below will give the absolute target address. */
862 *relocation
= val
+ addend
+ rel
->r_vaddr
;
864 howto
->src_mask
&= ~3;
865 howto
->dst_mask
= howto
->src_mask
;
868 && (h
->root
.type
== bfd_link_hash_defined
869 || h
->root
.type
== bfd_link_hash_defweak
)
870 && bfd_is_abs_section (h
->root
.u
.def
.section
)
871 && section_offset
+ 4 <= input_section
->size
)
876 /* Turn the relative branch into an absolute one by setting the
878 ptr
= contents
+ section_offset
;
879 insn
= bfd_get_32 (input_bfd
, ptr
);
881 bfd_put_32 (input_bfd
, insn
, ptr
);
883 /* Make the howto absolute too. */
884 howto
->pc_relative
= false;
885 howto
->complain_on_overflow
= complain_overflow_bitfield
;
889 /* Use a PC-relative howto and subtract the instruction's address
890 from the target address we calculated above. */
891 howto
->pc_relative
= true;
892 *relocation
-= (input_section
->output_section
->vma
893 + input_section
->output_offset
901 /* The XCOFF reloc table.
902 Cf xcoff_howto_table comments. */
904 reloc_howto_type xcoff64_howto_table
[] =
906 /* 0x00: Standard 64 bit relocation. */
907 HOWTO (R_POS
, /* type */
909 4, /* size (0 = byte, 1 = short, 2 = long) */
911 false, /* pc_relative */
913 complain_overflow_bitfield
, /* complain_on_overflow */
914 0, /* special_function */
915 "R_POS_64", /* name */
916 true, /* partial_inplace */
917 MINUS_ONE
, /* src_mask */
918 MINUS_ONE
, /* dst_mask */
919 false), /* pcrel_offset */
921 /* 0x01: 64 bit relocation, but store negative value. */
922 HOWTO (R_NEG
, /* type */
924 -4, /* size (0 = byte, 1 = short, 2 = long) */
926 false, /* pc_relative */
928 complain_overflow_bitfield
, /* complain_on_overflow */
929 0, /* special_function */
931 true, /* partial_inplace */
932 MINUS_ONE
, /* src_mask */
933 MINUS_ONE
, /* dst_mask */
934 false), /* pcrel_offset */
936 /* 0x02: 64 bit PC relative relocation. */
937 HOWTO (R_REL
, /* type */
939 4, /* size (0 = byte, 1 = short, 2 = long) */
941 true, /* pc_relative */
943 complain_overflow_signed
, /* complain_on_overflow */
944 0, /* special_function */
946 true, /* partial_inplace */
947 MINUS_ONE
, /* src_mask */
948 MINUS_ONE
, /* dst_mask */
949 false), /* pcrel_offset */
951 /* 0x03: 16 bit TOC relative relocation. */
952 HOWTO (R_TOC
, /* type */
954 1, /* size (0 = byte, 1 = short, 2 = long) */
956 false, /* pc_relative */
958 complain_overflow_bitfield
, /* complain_on_overflow */
959 0, /* special_function */
961 true, /* partial_inplace */
963 0xffff, /* dst_mask */
964 false), /* pcrel_offset */
966 /* 0x04: Same as R_TOC. */
967 HOWTO (R_TRL
, /* type */
969 1, /* size (0 = byte, 1 = short, 2 = long) */
971 false, /* pc_relative */
973 complain_overflow_bitfield
, /* complain_on_overflow */
974 0, /* special_function */
976 true, /* partial_inplace */
978 0xffff, /* dst_mask */
979 false), /* pcrel_offset */
981 /* 0x05: External TOC relative symbol. */
982 HOWTO (R_GL
, /* type */
984 1, /* size (0 = byte, 1 = short, 2 = long) */
986 false, /* pc_relative */
988 complain_overflow_bitfield
, /* complain_on_overflow */
989 0, /* special_function */
991 true, /* partial_inplace */
993 0xffff, /* dst_mask */
994 false), /* pcrel_offset */
996 /* 0x06: Local TOC relative symbol. */
997 HOWTO (R_TCL
, /* type */
999 1, /* size (0 = byte, 1 = short, 2 = long) */
1001 false, /* pc_relative */
1003 complain_overflow_bitfield
, /* complain_on_overflow */
1004 0, /* special_function */
1006 true, /* partial_inplace */
1008 0xffff, /* dst_mask */
1009 false), /* pcrel_offset */
1013 /* 0x08: Same as R_RBA. */
1014 HOWTO (R_BA
, /* type */
1016 2, /* size (0 = byte, 1 = short, 2 = long) */
1018 false, /* pc_relative */
1020 complain_overflow_bitfield
, /* complain_on_overflow */
1021 0, /* special_function */
1022 "R_BA_26", /* name */
1023 true, /* partial_inplace */
1024 0x03fffffc, /* src_mask */
1025 0x03fffffc, /* dst_mask */
1026 false), /* pcrel_offset */
1030 /* 0x0a: Same as R_RBR. */
1031 HOWTO (R_BR
, /* type */
1033 2, /* size (0 = byte, 1 = short, 2 = long) */
1035 true, /* pc_relative */
1037 complain_overflow_signed
, /* complain_on_overflow */
1038 0, /* special_function */
1040 true, /* partial_inplace */
1041 0x03fffffc, /* src_mask */
1042 0x03fffffc, /* dst_mask */
1043 false), /* pcrel_offset */
1047 /* 0x0c: Same as R_POS. */
1048 HOWTO (R_RL
, /* type */
1050 4, /* size (0 = byte, 1 = short, 2 = long) */
1052 false, /* pc_relative */
1054 complain_overflow_bitfield
, /* complain_on_overflow */
1055 0, /* special_function */
1057 true, /* partial_inplace */
1058 MINUS_ONE
, /* src_mask */
1059 MINUS_ONE
, /* dst_mask */
1060 false), /* pcrel_offset */
1062 /* 0x0d: Same as R_POS. */
1063 HOWTO (R_RLA
, /* type */
1065 4, /* size (0 = byte, 1 = short, 2 = long) */
1067 false, /* pc_relative */
1069 complain_overflow_bitfield
, /* complain_on_overflow */
1070 0, /* special_function */
1072 true, /* partial_inplace */
1073 MINUS_ONE
, /* src_mask */
1074 MINUS_ONE
, /* dst_mask */
1075 false), /* pcrel_offset */
1079 /* 0x0f: Non-relocating reference. Bitsize is 1 so that r_rsize is 0. */
1080 HOWTO (R_REF
, /* type */
1082 0, /* size (0 = byte, 1 = short, 2 = long) */
1084 false, /* pc_relative */
1086 complain_overflow_dont
, /* complain_on_overflow */
1087 0, /* special_function */
1089 false, /* partial_inplace */
1092 false), /* pcrel_offset */
1098 /* 0x13: Same as R_TOC */
1099 HOWTO (R_TRLA
, /* type */
1101 1, /* size (0 = byte, 1 = short, 2 = long) */
1103 false, /* pc_relative */
1105 complain_overflow_bitfield
, /* complain_on_overflow */
1106 0, /* special_function */
1107 "R_TRLA", /* name */
1108 true, /* partial_inplace */
1109 0xffff, /* src_mask */
1110 0xffff, /* dst_mask */
1111 false), /* pcrel_offset */
1113 /* 0x14: Modifiable relative branch. */
1114 HOWTO (R_RRTBI
, /* type */
1116 2, /* size (0 = byte, 1 = short, 2 = long) */
1118 false, /* pc_relative */
1120 complain_overflow_bitfield
, /* complain_on_overflow */
1121 0, /* special_function */
1122 "R_RRTBI", /* name */
1123 true, /* partial_inplace */
1124 0xffffffff, /* src_mask */
1125 0xffffffff, /* dst_mask */
1126 false), /* pcrel_offset */
1128 /* 0x15: Modifiable absolute branch. */
1129 HOWTO (R_RRTBA
, /* type */
1131 2, /* size (0 = byte, 1 = short, 2 = long) */
1133 false, /* pc_relative */
1135 complain_overflow_bitfield
, /* complain_on_overflow */
1136 0, /* special_function */
1137 "R_RRTBA", /* name */
1138 true, /* partial_inplace */
1139 0xffffffff, /* src_mask */
1140 0xffffffff, /* dst_mask */
1141 false), /* pcrel_offset */
1143 /* 0x16: Modifiable call absolute indirect. */
1144 HOWTO (R_CAI
, /* type */
1146 1, /* size (0 = byte, 1 = short, 2 = long) */
1148 false, /* pc_relative */
1150 complain_overflow_bitfield
, /* complain_on_overflow */
1151 0, /* special_function */
1153 true, /* partial_inplace */
1154 0xffff, /* src_mask */
1155 0xffff, /* dst_mask */
1156 false), /* pcrel_offset */
1158 /* 0x17: Modifiable call relative. */
1159 HOWTO (R_CREL
, /* type */
1161 1, /* size (0 = byte, 1 = short, 2 = long) */
1163 false, /* pc_relative */
1165 complain_overflow_bitfield
, /* complain_on_overflow */
1166 0, /* special_function */
1167 "R_CREL", /* name */
1168 true, /* partial_inplace */
1169 0xffff, /* src_mask */
1170 0xffff, /* dst_mask */
1171 false), /* pcrel_offset */
1173 /* 0x18: Modifiable branch absolute. */
1174 HOWTO (R_RBA
, /* type */
1176 2, /* size (0 = byte, 1 = short, 2 = long) */
1178 false, /* pc_relative */
1180 complain_overflow_bitfield
, /* complain_on_overflow */
1181 0, /* special_function */
1183 true, /* partial_inplace */
1184 0x03fffffc, /* src_mask */
1185 0x03fffffc, /* dst_mask */
1186 false), /* pcrel_offset */
1188 /* 0x19: Modifiable branch absolute. */
1189 HOWTO (R_RBAC
, /* type */
1191 2, /* size (0 = byte, 1 = short, 2 = long) */
1193 false, /* pc_relative */
1195 complain_overflow_bitfield
, /* complain_on_overflow */
1196 0, /* special_function */
1197 "R_RBAC", /* name */
1198 true, /* partial_inplace */
1199 0xffffffff, /* src_mask */
1200 0xffffffff, /* dst_mask */
1201 false), /* pcrel_offset */
1203 /* 0x1a: Modifiable branch relative. */
1204 HOWTO (R_RBR
, /* type */
1206 2, /* size (0 = byte, 1 = short, 2 = long) */
1208 false, /* pc_relative */
1210 complain_overflow_signed
, /* complain_on_overflow */
1211 0, /* special_function */
1212 "R_RBR_26", /* name */
1213 true, /* partial_inplace */
1214 0x03fffffc, /* src_mask */
1215 0x03fffffc, /* dst_mask */
1216 false), /* pcrel_offset */
1218 /* 0x1b: Modifiable branch absolute. */
1219 HOWTO (R_RBRC
, /* type */
1221 1, /* size (0 = byte, 1 = short, 2 = long) */
1223 false, /* pc_relative */
1225 complain_overflow_bitfield
, /* complain_on_overflow */
1226 0, /* special_function */
1227 "R_RBRC", /* name */
1228 true, /* partial_inplace */
1229 0xffff, /* src_mask */
1230 0xffff, /* dst_mask */
1231 false), /* pcrel_offset */
1233 /* 0x1c: Standard 32 bit relocation. */
1234 HOWTO (R_POS
, /* type */
1236 2, /* size (0 = byte, 1 = short, 2 = long) */
1238 false, /* pc_relative */
1240 complain_overflow_bitfield
, /* complain_on_overflow */
1241 0, /* special_function */
1242 "R_POS_32", /* name */
1243 true, /* partial_inplace */
1244 0xffffffff, /* src_mask */
1245 0xffffffff, /* dst_mask */
1246 false), /* pcrel_offset */
1248 /* 0x1d: 16 bit Non modifiable absolute branch. */
1249 HOWTO (R_BA
, /* type */
1251 1, /* size (0 = byte, 1 = short, 2 = long) */
1253 false, /* pc_relative */
1255 complain_overflow_bitfield
, /* complain_on_overflow */
1256 0, /* special_function */
1257 "R_BA_16", /* name */
1258 true, /* partial_inplace */
1259 0xfffc, /* src_mask */
1260 0xfffc, /* dst_mask */
1261 false), /* pcrel_offset */
1263 /* 0x1e: Modifiable branch relative. */
1264 HOWTO (R_RBR
, /* type */
1266 1, /* size (0 = byte, 1 = short, 2 = long) */
1268 true, /* pc_relative */
1270 complain_overflow_signed
, /* complain_on_overflow */
1271 0, /* special_function */
1272 "R_RBR_16", /* name */
1273 true, /* partial_inplace */
1274 0xfffc, /* src_mask */
1275 0xfffc, /* dst_mask */
1276 false), /* pcrel_offset */
1278 /* 0x1f: Modifiable branch absolute. */
1279 HOWTO (R_RBA
, /* type */
1281 1, /* size (0 = byte, 1 = short, 2 = long) */
1283 false, /* pc_relative */
1285 complain_overflow_bitfield
, /* complain_on_overflow */
1286 0, /* special_function */
1287 "R_RBA_16", /* name */
1288 true, /* partial_inplace */
1289 0xffff, /* src_mask */
1290 0xffff, /* dst_mask */
1291 false), /* pcrel_offset */
1293 /* 0x20: General-dynamic TLS relocation. */
1294 HOWTO (R_TLS
, /* type */
1296 4, /* size (0 = byte, 1 = short, 2 = long) */
1298 false, /* pc_relative */
1300 complain_overflow_bitfield
, /* complain_on_overflow */
1301 0, /* special_function */
1303 true, /* partial_inplace */
1304 MINUS_ONE
, /* src_mask */
1305 MINUS_ONE
, /* dst_mask */
1306 false), /* pcrel_offset */
1308 /* 0x21: Initial-exec TLS relocation. */
1309 HOWTO (R_TLS_IE
, /* type */
1311 4, /* size (0 = byte, 1 = short, 2 = long) */
1313 false, /* pc_relative */
1315 complain_overflow_bitfield
, /* complain_on_overflow */
1316 0, /* special_function */
1317 "R_TLS_IE", /* name */
1318 true, /* partial_inplace */
1319 MINUS_ONE
, /* src_mask */
1320 MINUS_ONE
, /* dst_mask */
1321 false), /* pcrel_offset */
1323 /* 0x22: Local-dynamic TLS relocation. */
1324 HOWTO (R_TLS_LD
, /* type */
1326 4, /* size (0 = byte, 1 = short, 2 = long) */
1328 false, /* pc_relative */
1330 complain_overflow_bitfield
, /* complain_on_overflow */
1331 0, /* special_function */
1332 "R_TLS_LD", /* name */
1333 true, /* partial_inplace */
1334 MINUS_ONE
, /* src_mask */
1335 MINUS_ONE
, /* dst_mask */
1336 false), /* pcrel_offset */
1338 /* 0x23: Local-exec TLS relocation. */
1339 HOWTO (R_TLS_LE
, /* type */
1341 4, /* size (0 = byte, 1 = short, 2 = long) */
1343 false, /* pc_relative */
1345 complain_overflow_bitfield
, /* complain_on_overflow */
1346 0, /* special_function */
1347 "R_TLS_LE", /* name */
1348 true, /* partial_inplace */
1349 MINUS_ONE
, /* src_mask */
1350 MINUS_ONE
, /* dst_mask */
1351 false), /* pcrel_offset */
1353 /* 0x24: TLS relocation. */
1354 HOWTO (R_TLSM
, /* type */
1356 4, /* size (0 = byte, 1 = short, 2 = long) */
1358 false, /* pc_relative */
1360 complain_overflow_bitfield
, /* complain_on_overflow */
1361 0, /* special_function */
1362 "R_TLSM", /* name */
1363 true, /* partial_inplace */
1364 MINUS_ONE
, /* src_mask */
1365 MINUS_ONE
, /* dst_mask */
1366 false), /* pcrel_offset */
1368 /* 0x25: TLS module relocation. */
1369 HOWTO (R_TLSML
, /* type */
1371 4, /* size (0 = byte, 1 = short, 2 = long) */
1373 false, /* pc_relative */
1375 complain_overflow_bitfield
, /* complain_on_overflow */
1376 0, /* special_function */
1377 "R_TLSML", /* name */
1378 true, /* partial_inplace */
1379 MINUS_ONE
, /* src_mask */
1380 MINUS_ONE
, /* dst_mask */
1381 false), /* pcrel_offset */
1383 /* 0x26: 32 bit relocation, but store negative value. */
1384 HOWTO (R_NEG
, /* type */
1386 -2, /* size (0 = byte, 1 = short, 2 = long) */
1388 false, /* pc_relative */
1390 complain_overflow_bitfield
, /* complain_on_overflow */
1391 0, /* special_function */
1392 "R_NEG_32", /* name */
1393 true, /* partial_inplace */
1394 MINUS_ONE
, /* src_mask */
1395 MINUS_ONE
, /* dst_mask */
1396 false), /* pcrel_offset */
1408 HOWTO (R_TOCU
, /* type */
1409 16, /* rightshift */
1410 1, /* size (0 = byte, 1 = short, 2 = long) */
1412 false, /* pc_relative */
1414 complain_overflow_bitfield
, /* complain_on_overflow */
1415 0, /* special_function */
1416 "R_TOCU", /* name */
1417 true, /* partial_inplace */
1419 0xffff, /* dst_mask */
1420 false), /* pcrel_offset */
1422 /* 0x31: Low-order 16 bit TOC relative relocation. */
1423 HOWTO (R_TOCL
, /* type */
1425 1, /* size (0 = byte, 1 = short, 2 = long) */
1427 false, /* pc_relative */
1429 complain_overflow_dont
, /* complain_on_overflow */
1430 0, /* special_function */
1431 "R_TOCL", /* name */
1432 true, /* partial_inplace */
1434 0xffff, /* dst_mask */
1435 false), /* pcrel_offset */
1440 xcoff64_rtype2howto (arelent
*relent
, struct internal_reloc
*internal
)
1442 if (internal
->r_type
> R_TOCL
)
1445 /* Default howto layout works most of the time */
1446 relent
->howto
= &xcoff64_howto_table
[internal
->r_type
];
1448 /* Special case some 16 bit reloc */
1449 if (15 == (internal
->r_size
& 0x3f))
1451 if (R_BA
== internal
->r_type
)
1452 relent
->howto
= &xcoff64_howto_table
[0x1d];
1453 else if (R_RBR
== internal
->r_type
)
1454 relent
->howto
= &xcoff64_howto_table
[0x1e];
1455 else if (R_RBA
== internal
->r_type
)
1456 relent
->howto
= &xcoff64_howto_table
[0x1f];
1458 /* Special case 32 bit */
1459 else if (31 == (internal
->r_size
& 0x3f))
1461 if (R_POS
== internal
->r_type
)
1462 relent
->howto
= &xcoff64_howto_table
[0x1c];
1464 if (R_NEG
== internal
->r_type
)
1465 relent
->howto
= &xcoff64_howto_table
[0x26];
1468 /* The r_size field of an XCOFF reloc encodes the bitsize of the
1469 relocation, as well as indicating whether it is signed or not.
1470 Doublecheck that the relocation information gathered from the
1471 type matches this information. The bitsize is not significant
1472 for R_REF relocs. */
1473 if (relent
->howto
->dst_mask
!= 0
1474 && (relent
->howto
->bitsize
1475 != ((unsigned int) internal
->r_size
& 0x3f) + 1))
1480 xcoff64_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1481 bfd_reloc_code_real_type code
)
1485 case BFD_RELOC_PPC_B26
:
1486 return &xcoff64_howto_table
[0xa];
1487 case BFD_RELOC_PPC_BA16
:
1488 return &xcoff64_howto_table
[0x1d];
1489 case BFD_RELOC_PPC_BA26
:
1490 return &xcoff64_howto_table
[8];
1491 case BFD_RELOC_PPC_TOC16
:
1492 return &xcoff64_howto_table
[3];
1493 case BFD_RELOC_PPC_TOC16_HI
:
1494 return &xcoff64_howto_table
[0x30];
1495 case BFD_RELOC_PPC_TOC16_LO
:
1496 return &xcoff64_howto_table
[0x31];
1497 case BFD_RELOC_PPC_B16
:
1498 return &xcoff64_howto_table
[0x1e];
1500 case BFD_RELOC_CTOR
:
1501 return &xcoff64_howto_table
[0x1c];
1503 return &xcoff64_howto_table
[0];
1504 case BFD_RELOC_NONE
:
1505 return &xcoff64_howto_table
[0xf];
1506 case BFD_RELOC_PPC_NEG
:
1507 return &xcoff64_howto_table
[0x1];
1508 case BFD_RELOC_PPC64_TLSGD
:
1509 return &xcoff64_howto_table
[0x20];
1510 case BFD_RELOC_PPC64_TLSIE
:
1511 return &xcoff64_howto_table
[0x21];
1512 case BFD_RELOC_PPC64_TLSLD
:
1513 return &xcoff64_howto_table
[0x22];
1514 case BFD_RELOC_PPC64_TLSLE
:
1515 return &xcoff64_howto_table
[0x23];
1516 case BFD_RELOC_PPC64_TLSM
:
1517 return &xcoff64_howto_table
[0x24];
1518 case BFD_RELOC_PPC64_TLSML
:
1519 return &xcoff64_howto_table
[0x25];
1525 static reloc_howto_type
*
1526 xcoff64_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1532 i
< sizeof (xcoff64_howto_table
) / sizeof (xcoff64_howto_table
[0]);
1534 if (xcoff64_howto_table
[i
].name
!= NULL
1535 && strcasecmp (xcoff64_howto_table
[i
].name
, r_name
) == 0)
1536 return &xcoff64_howto_table
[i
];
1541 /* This is the relocation function for the PowerPC64.
1542 See xcoff_ppc_relocation_section for more information. */
1545 xcoff64_ppc_relocate_section (bfd
*output_bfd
,
1546 struct bfd_link_info
*info
,
1548 asection
*input_section
,
1550 struct internal_reloc
*relocs
,
1551 struct internal_syment
*syms
,
1552 asection
**sections
)
1554 struct internal_reloc
*rel
;
1555 struct internal_reloc
*relend
;
1558 relend
= rel
+ input_section
->reloc_count
;
1559 for (; rel
< relend
; rel
++)
1562 struct xcoff_link_hash_entry
*h
;
1563 struct internal_syment
*sym
;
1566 struct reloc_howto_struct howto
;
1568 bfd_vma value_to_relocate
;
1572 /* Relocation type R_REF is a special relocation type which is
1573 merely used to prevent garbage collection from occurring for
1574 the csect including the symbol which it references. */
1575 if (rel
->r_type
== R_REF
)
1578 /* Retrieve default value in HOWTO table and fix up according
1579 to r_size field, if it can be different.
1580 This should be made during relocation reading but the algorithms
1581 are expecting constant howtos. */
1582 memcpy (&howto
, &xcoff64_howto_table
[rel
->r_type
], sizeof (howto
));
1583 if (howto
.bitsize
!= (rel
->r_size
& 0x3f) + 1)
1585 switch (rel
->r_type
)
1589 howto
.bitsize
= (rel
->r_size
& 0x3f) + 1;
1590 howto
.size
= howto
.bitsize
> 16 ? (howto
.bitsize
> 32 ? 4 : 2) : 1;
1591 howto
.src_mask
= howto
.dst_mask
= N_ONES (howto
.bitsize
);
1596 (_("%pB: relocation (%d) at (0x%" BFD_VMA_FMT
"x) has wrong"
1597 " r_rsize (0x%x)\n"),
1598 input_bfd
, rel
->r_type
, rel
->r_vaddr
, rel
->r_size
);
1603 howto
.complain_on_overflow
= (rel
->r_size
& 0x80
1604 ? complain_overflow_signed
1605 : complain_overflow_bitfield
);
1612 symndx
= rel
->r_symndx
;
1618 h
= obj_xcoff_sym_hashes (input_bfd
)[symndx
];
1619 sym
= syms
+ symndx
;
1620 addend
= - sym
->n_value
;
1624 sec
= sections
[symndx
];
1625 /* Hack to make sure we use the right TOC anchor value
1626 if this reloc is against the TOC anchor. */
1627 if (sec
->name
[3] == '0'
1628 && strcmp (sec
->name
, ".tc0") == 0)
1629 val
= xcoff_data (output_bfd
)->toc
;
1631 val
= (sec
->output_section
->vma
1632 + sec
->output_offset
1638 if (info
->unresolved_syms_in_objects
!= RM_IGNORE
1639 && (h
->flags
& XCOFF_WAS_UNDEFINED
) != 0)
1640 info
->callbacks
->undefined_symbol
1641 (info
, h
->root
.root
.string
, input_bfd
, input_section
,
1642 rel
->r_vaddr
- input_section
->vma
,
1643 info
->unresolved_syms_in_objects
== RM_DIAGNOSE
1644 && !info
->warn_unresolved_syms
);
1646 if (h
->root
.type
== bfd_link_hash_defined
1647 || h
->root
.type
== bfd_link_hash_defweak
)
1649 sec
= h
->root
.u
.def
.section
;
1650 val
= (h
->root
.u
.def
.value
1651 + sec
->output_section
->vma
1652 + sec
->output_offset
);
1654 else if (h
->root
.type
== bfd_link_hash_common
)
1656 sec
= h
->root
.u
.c
.p
->section
;
1657 val
= (sec
->output_section
->vma
1658 + sec
->output_offset
);
1662 BFD_ASSERT (bfd_link_relocatable (info
)
1663 || (h
->flags
& XCOFF_DEF_DYNAMIC
) != 0
1664 || (h
->flags
& XCOFF_IMPORT
) != 0);
1669 if (rel
->r_type
>= XCOFF_MAX_CALCULATE_RELOCATION
1670 || !((*xcoff64_calculate_relocation
[rel
->r_type
])
1671 (input_bfd
, input_section
, output_bfd
, rel
, sym
, &howto
, val
,
1672 addend
, &relocation
, contents
, info
)))
1676 address
= rel
->r_vaddr
- input_section
->vma
;
1677 location
= contents
+ address
;
1679 if (address
> input_section
->size
)
1682 /* Get the value we are going to relocate. */
1683 if (1 == howto
.size
)
1684 value_to_relocate
= bfd_get_16 (input_bfd
, location
);
1685 else if (2 == howto
.size
)
1686 value_to_relocate
= bfd_get_32 (input_bfd
, location
);
1688 value_to_relocate
= bfd_get_64 (input_bfd
, location
);
1692 FIXME: We may drop bits during the addition
1693 which we don't check for. We must either check at every single
1694 operation, which would be tedious, or we must do the computations
1695 in a type larger than bfd_vma, which would be inefficient. */
1697 if (((*xcoff_complain_overflow
[howto
.complain_on_overflow
])
1698 (input_bfd
, value_to_relocate
, relocation
, &howto
)))
1701 char buf
[SYMNMLEN
+ 1];
1702 char reloc_type_name
[10];
1714 name
= _bfd_coff_internal_syment_name (input_bfd
, sym
, buf
);
1718 sprintf (reloc_type_name
, "0x%02x", rel
->r_type
);
1720 (*info
->callbacks
->reloc_overflow
)
1721 (info
, (h
? &h
->root
: NULL
), name
, reloc_type_name
,
1722 (bfd_vma
) 0, input_bfd
, input_section
,
1723 rel
->r_vaddr
- input_section
->vma
);
1726 /* Add RELOCATION to the right bits of VALUE_TO_RELOCATE. */
1727 value_to_relocate
= ((value_to_relocate
& ~howto
.dst_mask
)
1728 | (((value_to_relocate
& howto
.src_mask
)
1729 + relocation
) & howto
.dst_mask
));
1731 /* Put the value back in the object file. */
1732 if (1 == howto
.size
)
1733 bfd_put_16 (input_bfd
, value_to_relocate
, location
);
1734 else if (2 == howto
.size
)
1735 bfd_put_32 (input_bfd
, value_to_relocate
, location
);
1737 bfd_put_64 (input_bfd
, value_to_relocate
, location
);
1744 /* PR 21786: The PE/COFF standard does not require NUL termination for any of
1745 the ASCII fields in the archive headers. So in order to be able to extract
1746 numerical values we provide our own versions of strtol and strtoll which
1747 take a maximum length as an additional parameter. Also - just to save space,
1748 we omit the endptr return parameter, since we know that it is never used. */
1751 _bfd_strntol (const char * nptr
, int base
, unsigned int maxlen
)
1753 char buf
[24]; /* Should be enough. */
1755 BFD_ASSERT (maxlen
< (sizeof (buf
) - 1));
1757 memcpy (buf
, nptr
, maxlen
);
1759 return strtol (buf
, NULL
, base
);
1763 _bfd_strntoll (const char * nptr
, int base
, unsigned int maxlen
)
1765 char buf
[32]; /* Should be enough. */
1767 BFD_ASSERT (maxlen
< (sizeof (buf
) - 1));
1769 memcpy (buf
, nptr
, maxlen
);
1771 return strtoll (buf
, NULL
, base
);
1774 /* Macro to read an ASCII value stored in an archive header field. */
1775 #define GET_VALUE_IN_FIELD(VAR, FIELD, BASE) \
1778 (VAR) = (sizeof (VAR) > sizeof (long) \
1779 ? _bfd_strntoll (FIELD, BASE, sizeof FIELD) \
1780 : _bfd_strntol (FIELD, BASE, sizeof FIELD)); \
1784 /* Read in the armap of an XCOFF archive. */
1787 xcoff64_slurp_armap (bfd
*abfd
)
1791 bfd_size_type sz
, amt
;
1792 bfd_byte
*contents
, *cend
;
1798 /* This is for the new format. */
1799 struct xcoff_ar_hdr_big hdr
;
1801 if (xcoff_ardata (abfd
) == NULL
)
1803 abfd
->has_armap
= false;
1807 off
= bfd_scan_vma (xcoff_ardata_big (abfd
)->symoff64
,
1808 (const char **) NULL
, 10);
1811 abfd
->has_armap
= false;
1815 if (bfd_seek (abfd
, off
, SEEK_SET
) != 0)
1818 /* The symbol table starts with a normal archive header. */
1819 if (bfd_bread (&hdr
, (bfd_size_type
) SIZEOF_AR_HDR_BIG
, abfd
)
1820 != SIZEOF_AR_HDR_BIG
)
1823 /* Skip the name (normally empty). */
1824 GET_VALUE_IN_FIELD (namlen
, hdr
.namlen
, 10);
1825 pos
= ((namlen
+ 1) & ~(size_t) 1) + SXCOFFARFMAG
;
1826 if (bfd_seek (abfd
, pos
, SEEK_CUR
) != 0)
1829 sz
= bfd_scan_vma (hdr
.size
, (const char **) NULL
, 10);
1832 bfd_set_error (bfd_error_bad_value
);
1836 /* Read in the entire symbol table. */
1837 contents
= (bfd_byte
*) _bfd_alloc_and_read (abfd
, sz
+ 1, sz
);
1838 if (contents
== NULL
)
1841 /* Ensure strings are NULL terminated so we don't wander off the end
1845 /* The symbol table starts with an eight byte count. */
1846 c
= H_GET_64 (abfd
, contents
);
1850 bfd_set_error (bfd_error_bad_value
);
1854 amt
*= sizeof (carsym
);
1855 bfd_ardata (abfd
)->symdefs
= (carsym
*) bfd_alloc (abfd
, amt
);
1856 if (bfd_ardata (abfd
)->symdefs
== NULL
)
1859 /* After the count comes a list of eight byte file offsets. */
1860 for (i
= 0, arsym
= bfd_ardata (abfd
)->symdefs
, p
= contents
+ 8;
1862 ++i
, ++arsym
, p
+= 8)
1863 arsym
->file_offset
= H_GET_64 (abfd
, p
);
1865 /* After the file offsets come null terminated symbol names. */
1866 cend
= contents
+ sz
;
1867 for (i
= 0, arsym
= bfd_ardata (abfd
)->symdefs
;
1869 ++i
, ++arsym
, p
+= strlen ((char *) p
) + 1)
1873 bfd_set_error (bfd_error_bad_value
);
1876 arsym
->name
= (char *) p
;
1879 bfd_ardata (abfd
)->symdef_count
= c
;
1880 abfd
->has_armap
= true;
1886 /* See if this is an NEW XCOFF archive. */
1889 xcoff64_archive_p (bfd
*abfd
)
1891 struct artdata
*tdata_hold
;
1892 char magic
[SXCOFFARMAG
];
1893 /* This is the new format. */
1894 struct xcoff_ar_file_hdr_big hdr
;
1895 size_t amt
= SXCOFFARMAG
;
1897 if (bfd_bread (magic
, amt
, abfd
) != amt
)
1899 if (bfd_get_error () != bfd_error_system_call
)
1900 bfd_set_error (bfd_error_wrong_format
);
1904 if (strncmp (magic
, XCOFFARMAGBIG
, SXCOFFARMAG
) != 0)
1906 bfd_set_error (bfd_error_wrong_format
);
1910 /* Copy over the magic string. */
1911 memcpy (hdr
.magic
, magic
, SXCOFFARMAG
);
1913 /* Now read the rest of the file header. */
1914 amt
= SIZEOF_AR_FILE_HDR_BIG
- SXCOFFARMAG
;
1915 if (bfd_bread (&hdr
.memoff
, amt
, abfd
) != amt
)
1917 if (bfd_get_error () != bfd_error_system_call
)
1918 bfd_set_error (bfd_error_wrong_format
);
1922 tdata_hold
= bfd_ardata (abfd
);
1924 amt
= sizeof (struct artdata
);
1925 bfd_ardata (abfd
) = (struct artdata
*) bfd_zalloc (abfd
, amt
);
1926 if (bfd_ardata (abfd
) == (struct artdata
*) NULL
)
1927 goto error_ret_restore
;
1929 /* Already cleared by bfd_zalloc above.
1930 bfd_ardata (abfd)->cache = NULL;
1931 bfd_ardata (abfd)->archive_head = NULL;
1932 bfd_ardata (abfd)->symdefs = NULL;
1933 bfd_ardata (abfd)->extended_names = NULL;
1934 bfd_ardata (abfd)->extended_names_size = 0; */
1935 bfd_ardata (abfd
)->first_file_filepos
= bfd_scan_vma (hdr
.firstmemoff
,
1936 (const char **) NULL
,
1939 amt
= SIZEOF_AR_FILE_HDR_BIG
;
1940 bfd_ardata (abfd
)->tdata
= bfd_zalloc (abfd
, amt
);
1941 if (bfd_ardata (abfd
)->tdata
== NULL
)
1944 memcpy (bfd_ardata (abfd
)->tdata
, &hdr
, SIZEOF_AR_FILE_HDR_BIG
);
1946 if (! xcoff64_slurp_armap (abfd
))
1949 bfd_release (abfd
, bfd_ardata (abfd
));
1951 bfd_ardata (abfd
) = tdata_hold
;
1955 return _bfd_no_cleanup
;
1959 /* Open the next element in an XCOFF archive. */
1962 xcoff64_openr_next_archived_file (bfd
*archive
, bfd
*last_file
)
1964 if ((xcoff_ardata (archive
) == NULL
)
1965 || ! xcoff_big_format_p (archive
))
1967 bfd_set_error (bfd_error_invalid_operation
);
1971 return _bfd_xcoff_openr_next_archived_file (archive
, last_file
);
1974 /* We can't use the usual coff_sizeof_headers routine, because AIX
1975 always uses an a.out header. */
1978 xcoff64_sizeof_headers (bfd
*abfd
,
1979 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1983 size
= bfd_coff_filhsz (abfd
);
1985 /* Don't think the small aout header can be used since some of the
1986 old elements have been reordered past the end of the old coff
1989 if (xcoff_data (abfd
)->full_aouthdr
)
1990 size
+= bfd_coff_aoutsz (abfd
);
1992 size
+= abfd
->section_count
* bfd_coff_scnhsz (abfd
);
1997 xcoff64_create_csect_from_smclas (bfd
*abfd
, union internal_auxent
*aux
,
1998 const char *symbol_name
)
2000 asection
*return_value
= NULL
;
2002 /* Changes from 32 :
2003 .sv == 8, is only for 32 bit programs
2004 .ti == 12 and .tb == 13 are now reserved. */
2005 static const char * const names
[] =
2007 ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
2008 NULL
, ".bs", ".ds", ".uc", NULL
, NULL
, NULL
, ".tc0",
2009 ".td", ".sv64", ".sv3264", NULL
, ".tl", ".ul", ".te"
2012 if ((aux
->x_csect
.x_smclas
< ARRAY_SIZE (names
))
2013 && (NULL
!= names
[aux
->x_csect
.x_smclas
]))
2016 return_value
= bfd_make_section_anyway
2017 (abfd
, names
[aux
->x_csect
.x_smclas
]);
2023 /* xgettext: c-format */
2024 (_("%pB: symbol `%s' has unrecognized smclas %d"),
2025 abfd
, symbol_name
, aux
->x_csect
.x_smclas
);
2026 bfd_set_error (bfd_error_bad_value
);
2029 return return_value
;
2033 xcoff64_is_lineno_count_overflow (bfd
*abfd ATTRIBUTE_UNUSED
,
2034 bfd_vma value ATTRIBUTE_UNUSED
)
2040 xcoff64_is_reloc_count_overflow (bfd
*abfd ATTRIBUTE_UNUSED
,
2041 bfd_vma value ATTRIBUTE_UNUSED
)
2047 xcoff64_loader_symbol_offset (bfd
*abfd ATTRIBUTE_UNUSED
,
2048 struct internal_ldhdr
*ldhdr
)
2050 return (ldhdr
->l_symoff
);
2054 xcoff64_loader_reloc_offset (bfd
*abfd ATTRIBUTE_UNUSED
,
2055 struct internal_ldhdr
*ldhdr
)
2057 return (ldhdr
->l_rldoff
);
2061 xcoff64_bad_format_hook (bfd
* abfd
, void *filehdr
)
2063 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
2065 /* Check flavor first. */
2066 if (bfd_get_flavour (abfd
) != bfd_target_xcoff_flavour
)
2069 if (bfd_xcoff_magic_number (abfd
) != internal_f
->f_magic
)
2076 xcoff64_generate_rtinit (bfd
*abfd
, const char *init
, const char *fini
,
2079 bfd_byte filehdr_ext
[FILHSZ
];
2080 bfd_byte scnhdr_ext
[SCNHSZ
* 3];
2081 bfd_byte syment_ext
[SYMESZ
* 10];
2082 bfd_byte reloc_ext
[RELSZ
* 3];
2083 bfd_byte
*data_buffer
;
2084 bfd_size_type data_buffer_size
;
2085 bfd_byte
*string_table
, *st_tmp
;
2086 bfd_size_type string_table_size
;
2088 size_t initsz
, finisz
;
2089 struct internal_filehdr filehdr
;
2090 struct internal_scnhdr text_scnhdr
;
2091 struct internal_scnhdr data_scnhdr
;
2092 struct internal_scnhdr bss_scnhdr
;
2093 struct internal_syment syment
;
2094 union internal_auxent auxent
;
2095 struct internal_reloc reloc
;
2097 char *text_name
= ".text";
2098 char *data_name
= ".data";
2099 char *bss_name
= ".bss";
2100 char *rtinit_name
= "__rtinit";
2101 char *rtld_name
= "__rtld";
2103 if (! bfd_xcoff_rtinit_size (abfd
))
2106 initsz
= (init
== NULL
? 0 : 1 + strlen (init
));
2107 finisz
= (fini
== NULL
? 0 : 1 + strlen (fini
));
2110 memset (filehdr_ext
, 0, FILHSZ
);
2111 memset (&filehdr
, 0, sizeof (struct internal_filehdr
));
2112 filehdr
.f_magic
= bfd_xcoff_magic_number (abfd
);
2113 filehdr
.f_nscns
= 3;
2114 filehdr
.f_timdat
= 0;
2115 filehdr
.f_nsyms
= 0; /* at least 6, no more than 8 */
2116 filehdr
.f_symptr
= 0; /* set below */
2117 filehdr
.f_opthdr
= 0;
2118 filehdr
.f_flags
= 0;
2120 /* Section headers. */
2121 memset (scnhdr_ext
, 0, 3 * SCNHSZ
);
2124 memset (&text_scnhdr
, 0, sizeof (struct internal_scnhdr
));
2125 memcpy (text_scnhdr
.s_name
, text_name
, strlen (text_name
));
2126 text_scnhdr
.s_paddr
= 0;
2127 text_scnhdr
.s_vaddr
= 0;
2128 text_scnhdr
.s_size
= 0;
2129 text_scnhdr
.s_scnptr
= 0;
2130 text_scnhdr
.s_relptr
= 0;
2131 text_scnhdr
.s_lnnoptr
= 0;
2132 text_scnhdr
.s_nreloc
= 0;
2133 text_scnhdr
.s_nlnno
= 0;
2134 text_scnhdr
.s_flags
= STYP_TEXT
;
2137 memset (&data_scnhdr
, 0, sizeof (struct internal_scnhdr
));
2138 memcpy (data_scnhdr
.s_name
, data_name
, strlen (data_name
));
2139 data_scnhdr
.s_paddr
= 0;
2140 data_scnhdr
.s_vaddr
= 0;
2141 data_scnhdr
.s_size
= 0; /* set below */
2142 data_scnhdr
.s_scnptr
= FILHSZ
+ 3 * SCNHSZ
;
2143 data_scnhdr
.s_relptr
= 0; /* set below */
2144 data_scnhdr
.s_lnnoptr
= 0;
2145 data_scnhdr
.s_nreloc
= 0; /* either 1 or 2 */
2146 data_scnhdr
.s_nlnno
= 0;
2147 data_scnhdr
.s_flags
= STYP_DATA
;
2150 memset (&bss_scnhdr
, 0, sizeof (struct internal_scnhdr
));
2151 memcpy (bss_scnhdr
.s_name
, bss_name
, strlen (bss_name
));
2152 bss_scnhdr
.s_paddr
= 0; /* set below */
2153 bss_scnhdr
.s_vaddr
= 0; /* set below */
2154 bss_scnhdr
.s_size
= 0; /* set below */
2155 bss_scnhdr
.s_scnptr
= 0;
2156 bss_scnhdr
.s_relptr
= 0;
2157 bss_scnhdr
.s_lnnoptr
= 0;
2158 bss_scnhdr
.s_nreloc
= 0;
2159 bss_scnhdr
.s_nlnno
= 0;
2160 bss_scnhdr
.s_flags
= STYP_BSS
;
2163 0x0000 0x00000000 : rtl
2165 0x0008 0x00000018 : offset to init, or 0
2166 0x000C 0x00000038 : offset to fini, or 0
2167 0x0010 0x00000010 : size of descriptor
2168 0x0014 0x00000000 : pad
2169 0x0018 0x00000000 : init, needs a reloc
2171 0x0020 0x00000058 : offset to init name
2172 0x0024 0x00000000 : flags, padded to a word
2173 0x0028 0x00000000 : empty init
2177 0x0038 0x00000000 : fini, needs a reloc
2179 0x0040 0x00000??? : offset to fini name
2180 0x0044 0x00000000 : flags, padded to a word
2181 0x0048 0x00000000 : empty fini
2186 0x0058 + initsz fini name */
2188 data_buffer_size
= 0x0058 + initsz
+ finisz
;
2189 data_buffer_size
= (data_buffer_size
+ 7) &~ (bfd_size_type
) 7;
2191 data_buffer
= (bfd_byte
*) bfd_zmalloc (data_buffer_size
);
2192 if (data_buffer
== NULL
)
2198 bfd_put_32 (abfd
, val
, &data_buffer
[0x08]);
2200 bfd_put_32 (abfd
, val
, &data_buffer
[0x20]);
2201 memcpy (&data_buffer
[val
], init
, initsz
);
2207 bfd_put_32 (abfd
, val
, &data_buffer
[0x0C]);
2208 val
= 0x58 + initsz
;
2209 bfd_put_32 (abfd
, val
, &data_buffer
[0x40]);
2210 memcpy (&data_buffer
[val
], fini
, finisz
);
2214 bfd_put_32 (abfd
, val
, &data_buffer
[0x10]);
2215 data_scnhdr
.s_size
= data_buffer_size
;
2216 bss_scnhdr
.s_paddr
= bss_scnhdr
.s_vaddr
= data_scnhdr
.s_size
;
2219 string_table_size
= 4;
2220 string_table_size
+= strlen (data_name
) + 1;
2221 string_table_size
+= strlen (rtinit_name
) + 1;
2222 string_table_size
+= initsz
;
2223 string_table_size
+= finisz
;
2225 string_table_size
+= strlen (rtld_name
) + 1;
2227 string_table
= (bfd_byte
*) bfd_zmalloc (string_table_size
);
2228 if (string_table
== NULL
)
2231 val
= string_table_size
;
2232 bfd_put_32 (abfd
, val
, &string_table
[0]);
2233 st_tmp
= string_table
+ 4;
2241 memset (syment_ext
, 0, 10 * SYMESZ
);
2242 memset (reloc_ext
, 0, 3 * RELSZ
);
2245 memset (&syment
, 0, sizeof (struct internal_syment
));
2246 memset (&auxent
, 0, sizeof (union internal_auxent
));
2248 syment
._n
._n_n
._n_offset
= st_tmp
- string_table
;
2249 memcpy (st_tmp
, data_name
, strlen (data_name
));
2250 st_tmp
+= strlen (data_name
) + 1;
2253 syment
.n_sclass
= C_HIDEXT
;
2254 syment
.n_numaux
= 1;
2255 auxent
.x_csect
.x_scnlen
.l
= data_buffer_size
;
2256 auxent
.x_csect
.x_smtyp
= 3 << 3 | XTY_SD
;
2257 auxent
.x_csect
.x_smclas
= XMC_RW
;
2258 bfd_coff_swap_sym_out (abfd
, &syment
,
2259 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2260 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2262 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
2263 filehdr
.f_nsyms
+= 2;
2266 memset (&syment
, 0, sizeof (struct internal_syment
));
2267 memset (&auxent
, 0, sizeof (union internal_auxent
));
2268 syment
._n
._n_n
._n_offset
= st_tmp
- string_table
;
2269 memcpy (st_tmp
, rtinit_name
, strlen (rtinit_name
));
2270 st_tmp
+= strlen (rtinit_name
) + 1;
2273 syment
.n_sclass
= C_EXT
;
2274 syment
.n_numaux
= 1;
2275 auxent
.x_csect
.x_smtyp
= XTY_LD
;
2276 auxent
.x_csect
.x_smclas
= XMC_RW
;
2277 bfd_coff_swap_sym_out (abfd
, &syment
,
2278 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2279 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2281 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
2282 filehdr
.f_nsyms
+= 2;
2287 memset (&syment
, 0, sizeof (struct internal_syment
));
2288 memset (&auxent
, 0, sizeof (union internal_auxent
));
2290 syment
._n
._n_n
._n_offset
= st_tmp
- string_table
;
2291 memcpy (st_tmp
, init
, initsz
);
2294 syment
.n_sclass
= C_EXT
;
2295 syment
.n_numaux
= 1;
2296 bfd_coff_swap_sym_out (abfd
, &syment
,
2297 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2298 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2300 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
2302 memset (&reloc
, 0, sizeof (struct internal_reloc
));
2303 reloc
.r_vaddr
= 0x0018;
2304 reloc
.r_symndx
= filehdr
.f_nsyms
;
2305 reloc
.r_type
= R_POS
;
2307 bfd_coff_swap_reloc_out (abfd
, &reloc
, &reloc_ext
[0]);
2309 filehdr
.f_nsyms
+= 2;
2310 data_scnhdr
.s_nreloc
+= 1;
2316 memset (&syment
, 0, sizeof (struct internal_syment
));
2317 memset (&auxent
, 0, sizeof (union internal_auxent
));
2319 syment
._n
._n_n
._n_offset
= st_tmp
- string_table
;
2320 memcpy (st_tmp
, fini
, finisz
);
2323 syment
.n_sclass
= C_EXT
;
2324 syment
.n_numaux
= 1;
2325 bfd_coff_swap_sym_out (abfd
, &syment
,
2326 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2327 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2329 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
2332 memset (&reloc
, 0, sizeof (struct internal_reloc
));
2333 reloc
.r_vaddr
= 0x0038;
2334 reloc
.r_symndx
= filehdr
.f_nsyms
;
2335 reloc
.r_type
= R_POS
;
2337 bfd_coff_swap_reloc_out (abfd
, &reloc
,
2338 &reloc_ext
[data_scnhdr
.s_nreloc
* RELSZ
]);
2340 filehdr
.f_nsyms
+= 2;
2341 data_scnhdr
.s_nreloc
+= 1;
2346 memset (&syment
, 0, sizeof (struct internal_syment
));
2347 memset (&auxent
, 0, sizeof (union internal_auxent
));
2349 syment
._n
._n_n
._n_offset
= st_tmp
- string_table
;
2350 memcpy (st_tmp
, rtld_name
, strlen (rtld_name
));
2351 st_tmp
+= strlen (rtld_name
) + 1;
2353 syment
.n_sclass
= C_EXT
;
2354 syment
.n_numaux
= 1;
2355 bfd_coff_swap_sym_out (abfd
, &syment
,
2356 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2357 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2359 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
2362 memset (&reloc
, 0, sizeof (struct internal_reloc
));
2363 reloc
.r_vaddr
= 0x0000;
2364 reloc
.r_symndx
= filehdr
.f_nsyms
;
2365 reloc
.r_type
= R_POS
;
2367 bfd_coff_swap_reloc_out (abfd
, &reloc
,
2368 &reloc_ext
[data_scnhdr
.s_nreloc
* RELSZ
]);
2370 filehdr
.f_nsyms
+= 2;
2371 data_scnhdr
.s_nreloc
+= 1;
2373 bss_scnhdr
.s_size
= 0;
2376 data_scnhdr
.s_relptr
= data_scnhdr
.s_scnptr
+ data_buffer_size
;
2377 filehdr
.f_symptr
= data_scnhdr
.s_relptr
+ data_scnhdr
.s_nreloc
* RELSZ
;
2379 bfd_coff_swap_filehdr_out (abfd
, &filehdr
, filehdr_ext
);
2380 bfd_bwrite (filehdr_ext
, FILHSZ
, abfd
);
2381 bfd_coff_swap_scnhdr_out (abfd
, &text_scnhdr
, &scnhdr_ext
[SCNHSZ
* 0]);
2382 bfd_coff_swap_scnhdr_out (abfd
, &data_scnhdr
, &scnhdr_ext
[SCNHSZ
* 1]);
2383 bfd_coff_swap_scnhdr_out (abfd
, &bss_scnhdr
, &scnhdr_ext
[SCNHSZ
* 2]);
2384 bfd_bwrite (scnhdr_ext
, 3 * SCNHSZ
, abfd
);
2385 bfd_bwrite (data_buffer
, data_buffer_size
, abfd
);
2386 bfd_bwrite (reloc_ext
, data_scnhdr
.s_nreloc
* RELSZ
, abfd
);
2387 bfd_bwrite (syment_ext
, filehdr
.f_nsyms
* SYMESZ
, abfd
);
2388 bfd_bwrite (string_table
, string_table_size
, abfd
);
2396 /* The typical dynamic reloc. */
2398 static reloc_howto_type xcoff64_dynamic_reloc
=
2399 HOWTO (0, /* type */
2401 4, /* size (0 = byte, 1 = short, 2 = long) */
2403 false, /* pc_relative */
2405 complain_overflow_bitfield
, /* complain_on_overflow */
2406 0, /* special_function */
2408 true, /* partial_inplace */
2409 MINUS_ONE
, /* src_mask */
2410 MINUS_ONE
, /* dst_mask */
2411 false); /* pcrel_offset */
2413 /* Indirect call stub */
2414 static const unsigned long xcoff64_stub_indirect_call_code
[4] =
2416 0xe9820000, /* ld r12,0(r2) */
2417 0xe80c0000, /* ld r0,0(r12) */
2418 0x7c0903a6, /* mtctr r0 */
2419 0x4e800420, /* bctr */
2422 /* Shared call stub */
2423 static const unsigned long xcoff64_stub_shared_call_code
[6] =
2425 0xe9820000, /* ld r12,0(r2) */
2426 0xf8410028, /* std r2,40(r1) */
2427 0xe80c0000, /* ld r0,0(r12) */
2428 0xe84c0008, /* ld r2,8(r12) */
2429 0x7c0903a6, /* mtctr r0 */
2430 0x4e800420, /* bctr */
2433 static const unsigned long xcoff64_glink_code
[10] =
2435 0xe9820000, /* ld r12,0(r2) */
2436 0xf8410028, /* std r2,40(r1) */
2437 0xe80c0000, /* ld r0,0(r12) */
2438 0xe84c0008, /* ld r2,8(r12) */
2439 0x7c0903a6, /* mtctr r0 */
2440 0x4e800420, /* bctr */
2441 0x00000000, /* start of traceback table */
2442 0x000ca000, /* traceback table */
2443 0x00000000, /* traceback table */
2444 0x00000018, /* ??? */
2447 static const struct xcoff_backend_data_rec bfd_xcoff_backend_data
=
2449 { /* COFF backend, defined in libcoff.h. */
2450 _bfd_xcoff64_swap_aux_in
,
2451 _bfd_xcoff64_swap_sym_in
,
2452 _bfd_xcoff64_swap_lineno_in
,
2453 _bfd_xcoff64_swap_aux_out
,
2454 _bfd_xcoff64_swap_sym_out
,
2455 _bfd_xcoff64_swap_lineno_out
,
2456 xcoff64_swap_reloc_out
,
2457 coff_swap_filehdr_out
,
2458 coff_swap_aouthdr_out
,
2459 coff_swap_scnhdr_out
,
2468 true, /* _bfd_coff_long_filenames */
2469 XCOFF_NO_LONG_SECTION_NAMES
, /* _bfd_coff_long_section_names */
2470 3, /* _bfd_coff_default_section_alignment_power */
2471 true, /* _bfd_coff_force_symnames_in_strings */
2472 4, /* _bfd_coff_debug_string_prefix_length */
2473 32768, /* _bfd_coff_max_nscns */
2474 coff_swap_filehdr_in
,
2475 coff_swap_aouthdr_in
,
2476 coff_swap_scnhdr_in
,
2477 xcoff64_swap_reloc_in
,
2478 xcoff64_bad_format_hook
,
2479 coff_set_arch_mach_hook
,
2482 coff_set_alignment_hook
,
2483 coff_slurp_symbol_table
,
2484 symname_in_debug_hook
,
2485 coff_pointerize_aux_hook
,
2487 dummy_reloc16_extra_cases
,
2488 dummy_reloc16_estimate
,
2489 NULL
, /* bfd_coff_symbol_classification */
2490 coff_compute_section_file_positions
,
2491 NULL
, /* _bfd_coff_start_final_link */
2492 xcoff64_ppc_relocate_section
,
2493 coff_rtype_to_howto
,
2494 NULL
, /* _bfd_coff_adjust_symndx */
2495 _bfd_generic_link_add_one_symbol
,
2496 coff_link_output_has_begun
,
2497 coff_final_link_postscript
,
2498 NULL
/* print_pdata. */
2501 0x01EF, /* magic number */
2505 /* Function pointers to xcoff specific swap routines. */
2506 xcoff64_swap_ldhdr_in
,
2507 xcoff64_swap_ldhdr_out
,
2508 xcoff64_swap_ldsym_in
,
2509 xcoff64_swap_ldsym_out
,
2510 xcoff64_swap_ldrel_in
,
2511 xcoff64_swap_ldrel_out
,
2517 24, /* _xcoff_function_descriptor_size */
2518 0, /* _xcoff_small_aout_header_size */
2521 2, /* _xcoff_ldhdr_version */
2523 _bfd_xcoff64_put_symbol_name
,
2524 _bfd_xcoff64_put_ldsymbol_name
,
2525 &xcoff64_dynamic_reloc
,
2526 xcoff64_create_csect_from_smclas
,
2528 /* Lineno and reloc count overflow. */
2529 xcoff64_is_lineno_count_overflow
,
2530 xcoff64_is_reloc_count_overflow
,
2532 xcoff64_loader_symbol_offset
,
2533 xcoff64_loader_reloc_offset
,
2536 &xcoff64_glink_code
[0],
2537 40, /* _xcoff_glink_size */
2540 88, /* _xcoff_rtinit_size */
2541 xcoff64_generate_rtinit
,
2543 /* Stub indirect call. */
2544 &xcoff64_stub_indirect_call_code
[0],
2545 16, /* _xcoff_stub_indirect_call_size */
2547 /* Stub shared call. */
2548 &xcoff64_stub_shared_call_code
[0],
2549 24, /* _xcoff_stub_shared_call_size */
2552 /* The transfer vector that leads the outside world to all of the above. */
2553 const bfd_target rs6000_xcoff64_vec
=
2556 bfd_target_xcoff_flavour
,
2557 BFD_ENDIAN_BIG
, /* data byte order is big */
2558 BFD_ENDIAN_BIG
, /* header byte order is big */
2560 (HAS_RELOC
| EXEC_P
| HAS_LINENO
| HAS_DEBUG
| DYNAMIC
2561 | HAS_SYMS
| HAS_LOCALS
| WP_TEXT
),
2563 SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_CODE
| SEC_DATA
,
2564 0, /* leading char */
2565 '/', /* ar_pad_char */
2566 15, /* ar_max_namelen */
2567 0, /* match priority. */
2568 TARGET_KEEP_UNUSED_SECTION_SYMBOLS
, /* keep unused section symbols. */
2592 { /* bfd_check_format */
2599 { /* bfd_set_format */
2600 _bfd_bool_bfd_false_error
,
2602 _bfd_generic_mkarchive
,
2603 _bfd_bool_bfd_false_error
2606 {/* bfd_write_contents */
2607 _bfd_bool_bfd_false_error
,
2608 coff_write_object_contents
,
2609 _bfd_xcoff_write_archive_contents
,
2610 _bfd_bool_bfd_false_error
2614 _bfd_archive_close_and_cleanup
,
2616 coff_new_section_hook
,
2617 _bfd_generic_get_section_contents
,
2618 _bfd_generic_get_section_contents_in_window
,
2621 _bfd_xcoff_copy_private_bfd_data
,
2622 _bfd_generic_bfd_merge_private_bfd_data
,
2623 _bfd_generic_init_private_section_data
,
2624 _bfd_generic_bfd_copy_private_section_data
,
2625 _bfd_generic_bfd_copy_private_symbol_data
,
2626 _bfd_generic_bfd_copy_private_header_data
,
2627 _bfd_generic_bfd_set_private_flags
,
2628 _bfd_generic_bfd_print_private_bfd_data
,
2631 BFD_JUMP_TABLE_CORE (coff
),
2634 xcoff64_slurp_armap
,
2635 _bfd_noarchive_slurp_extended_name_table
,
2636 _bfd_noarchive_construct_extended_name_table
,
2637 bfd_dont_truncate_arname
,
2638 _bfd_xcoff_write_armap
,
2639 _bfd_xcoff_read_ar_hdr
,
2640 _bfd_generic_write_ar_hdr
,
2641 xcoff64_openr_next_archived_file
,
2642 _bfd_generic_get_elt_at_index
,
2643 _bfd_xcoff_stat_arch_elt
,
2647 coff_get_symtab_upper_bound
,
2648 coff_canonicalize_symtab
,
2649 coff_make_empty_symbol
,
2651 coff_get_symbol_info
,
2652 coff_get_symbol_version_string
,
2653 _bfd_xcoff_is_local_label_name
,
2654 coff_bfd_is_target_special_symbol
,
2656 coff_find_nearest_line
,
2658 coff_find_inliner_info
,
2659 coff_bfd_make_debug_symbol
,
2660 _bfd_generic_read_minisymbols
,
2661 _bfd_generic_minisymbol_to_symbol
,
2664 coff_get_reloc_upper_bound
,
2665 coff_canonicalize_reloc
,
2666 _bfd_generic_set_reloc
,
2667 xcoff64_reloc_type_lookup
,
2668 xcoff64_reloc_name_lookup
,
2672 coff_set_section_contents
,
2675 xcoff64_sizeof_headers
,
2676 bfd_generic_get_relocated_section_contents
,
2677 bfd_generic_relax_section
,
2678 _bfd_xcoff_bfd_link_hash_table_create
,
2679 _bfd_xcoff_bfd_link_add_symbols
,
2680 _bfd_generic_link_just_syms
,
2681 _bfd_generic_copy_link_hash_symbol_type
,
2682 _bfd_xcoff_bfd_final_link
,
2683 _bfd_generic_link_split_section
,
2684 _bfd_generic_link_check_relocs
,
2685 bfd_generic_gc_sections
,
2686 bfd_generic_lookup_section_flags
,
2687 bfd_generic_merge_sections
,
2688 bfd_generic_is_group_section
,
2689 bfd_generic_group_name
,
2690 bfd_generic_discard_group
,
2691 _bfd_generic_section_already_linked
,
2692 _bfd_xcoff_define_common_symbol
,
2693 _bfd_generic_link_hide_symbol
,
2694 bfd_generic_define_start_stop
,
2697 _bfd_xcoff_get_dynamic_symtab_upper_bound
,
2698 _bfd_xcoff_canonicalize_dynamic_symtab
,
2699 _bfd_nodynamic_get_synthetic_symtab
,
2700 _bfd_xcoff_get_dynamic_reloc_upper_bound
,
2701 _bfd_xcoff_canonicalize_dynamic_reloc
,
2703 /* Opposite endian version, none exists */
2706 &bfd_xcoff_backend_data
,
2709 extern bfd_cleanup xcoff64_core_p
2711 extern bool xcoff64_core_file_matches_executable_p
2713 extern char *xcoff64_core_file_failing_command
2715 extern int xcoff64_core_file_failing_signal
2717 #define xcoff64_core_file_pid _bfd_nocore_core_file_pid
2720 static const struct xcoff_backend_data_rec bfd_xcoff_aix5_backend_data
=
2722 { /* COFF backend, defined in libcoff.h. */
2723 _bfd_xcoff64_swap_aux_in
,
2724 _bfd_xcoff64_swap_sym_in
,
2725 _bfd_xcoff64_swap_lineno_in
,
2726 _bfd_xcoff64_swap_aux_out
,
2727 _bfd_xcoff64_swap_sym_out
,
2728 _bfd_xcoff64_swap_lineno_out
,
2729 xcoff64_swap_reloc_out
,
2730 coff_swap_filehdr_out
,
2731 coff_swap_aouthdr_out
,
2732 coff_swap_scnhdr_out
,
2741 true, /* _bfd_coff_long_filenames */
2742 XCOFF_NO_LONG_SECTION_NAMES
, /* _bfd_coff_long_section_names */
2743 3, /* _bfd_coff_default_section_alignment_power */
2744 true, /* _bfd_coff_force_symnames_in_strings */
2745 4, /* _bfd_coff_debug_string_prefix_length */
2746 32768, /* _bfd_coff_max_nscns */
2747 coff_swap_filehdr_in
,
2748 coff_swap_aouthdr_in
,
2749 coff_swap_scnhdr_in
,
2750 xcoff64_swap_reloc_in
,
2751 xcoff64_bad_format_hook
,
2752 coff_set_arch_mach_hook
,
2755 coff_set_alignment_hook
,
2756 coff_slurp_symbol_table
,
2757 symname_in_debug_hook
,
2758 coff_pointerize_aux_hook
,
2760 dummy_reloc16_extra_cases
,
2761 dummy_reloc16_estimate
,
2762 NULL
, /* bfd_coff_sym_is_global */
2763 coff_compute_section_file_positions
,
2764 NULL
, /* _bfd_coff_start_final_link */
2765 xcoff64_ppc_relocate_section
,
2766 coff_rtype_to_howto
,
2767 NULL
, /* _bfd_coff_adjust_symndx */
2768 _bfd_generic_link_add_one_symbol
,
2769 coff_link_output_has_begun
,
2770 coff_final_link_postscript
,
2771 NULL
/* print_pdata. */
2774 U64_TOCMAGIC
, /* magic number */
2778 /* Function pointers to xcoff specific swap routines. */
2779 xcoff64_swap_ldhdr_in
,
2780 xcoff64_swap_ldhdr_out
,
2781 xcoff64_swap_ldsym_in
,
2782 xcoff64_swap_ldsym_out
,
2783 xcoff64_swap_ldrel_in
,
2784 xcoff64_swap_ldrel_out
,
2790 24, /* _xcoff_function_descriptor_size */
2791 0, /* _xcoff_small_aout_header_size */
2793 2, /* _xcoff_ldhdr_version */
2795 _bfd_xcoff64_put_symbol_name
,
2796 _bfd_xcoff64_put_ldsymbol_name
,
2797 &xcoff64_dynamic_reloc
,
2798 xcoff64_create_csect_from_smclas
,
2800 /* Lineno and reloc count overflow. */
2801 xcoff64_is_lineno_count_overflow
,
2802 xcoff64_is_reloc_count_overflow
,
2804 xcoff64_loader_symbol_offset
,
2805 xcoff64_loader_reloc_offset
,
2808 &xcoff64_glink_code
[0],
2809 40, /* _xcoff_glink_size */
2812 88, /* _xcoff_rtinit_size */
2813 xcoff64_generate_rtinit
,
2815 /* Stub indirect call. */
2816 &xcoff64_stub_indirect_call_code
[0],
2817 16, /* _xcoff_stub_indirect_call_size */
2819 /* Stub shared call. */
2820 &xcoff64_stub_shared_call_code
[0],
2821 24, /* _xcoff_stub_shared_call_size */
2824 /* The transfer vector that leads the outside world to all of the above. */
2825 const bfd_target rs6000_xcoff64_aix_vec
=
2827 "aix5coff64-rs6000",
2828 bfd_target_xcoff_flavour
,
2829 BFD_ENDIAN_BIG
, /* data byte order is big */
2830 BFD_ENDIAN_BIG
, /* header byte order is big */
2832 (HAS_RELOC
| EXEC_P
| HAS_LINENO
| HAS_DEBUG
| DYNAMIC
2833 | HAS_SYMS
| HAS_LOCALS
| WP_TEXT
),
2835 SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_CODE
| SEC_DATA
,
2836 0, /* leading char */
2837 '/', /* ar_pad_char */
2838 15, /* ar_max_namelen */
2839 0, /* match priority. */
2840 TARGET_KEEP_UNUSED_SECTION_SYMBOLS
, /* keep unused section symbols. */
2864 { /* bfd_check_format */
2871 { /* bfd_set_format */
2872 _bfd_bool_bfd_false_error
,
2874 _bfd_generic_mkarchive
,
2875 _bfd_bool_bfd_false_error
2878 {/* bfd_write_contents */
2879 _bfd_bool_bfd_false_error
,
2880 coff_write_object_contents
,
2881 _bfd_xcoff_write_archive_contents
,
2882 _bfd_bool_bfd_false_error
2886 _bfd_archive_close_and_cleanup
,
2888 coff_new_section_hook
,
2889 _bfd_generic_get_section_contents
,
2890 _bfd_generic_get_section_contents_in_window
,
2893 _bfd_xcoff_copy_private_bfd_data
,
2894 _bfd_generic_bfd_merge_private_bfd_data
,
2895 _bfd_generic_init_private_section_data
,
2896 _bfd_generic_bfd_copy_private_section_data
,
2897 _bfd_generic_bfd_copy_private_symbol_data
,
2898 _bfd_generic_bfd_copy_private_header_data
,
2899 _bfd_generic_bfd_set_private_flags
,
2900 _bfd_generic_bfd_print_private_bfd_data
,
2903 BFD_JUMP_TABLE_CORE (xcoff64
),
2906 xcoff64_slurp_armap
,
2907 _bfd_noarchive_slurp_extended_name_table
,
2908 _bfd_noarchive_construct_extended_name_table
,
2909 bfd_dont_truncate_arname
,
2910 _bfd_xcoff_write_armap
,
2911 _bfd_xcoff_read_ar_hdr
,
2912 _bfd_generic_write_ar_hdr
,
2913 xcoff64_openr_next_archived_file
,
2914 _bfd_generic_get_elt_at_index
,
2915 _bfd_xcoff_stat_arch_elt
,
2919 coff_get_symtab_upper_bound
,
2920 coff_canonicalize_symtab
,
2921 coff_make_empty_symbol
,
2923 coff_get_symbol_info
,
2924 coff_get_symbol_version_string
,
2925 _bfd_xcoff_is_local_label_name
,
2926 coff_bfd_is_target_special_symbol
,
2928 coff_find_nearest_line
,
2930 coff_find_inliner_info
,
2931 coff_bfd_make_debug_symbol
,
2932 _bfd_generic_read_minisymbols
,
2933 _bfd_generic_minisymbol_to_symbol
,
2936 coff_get_reloc_upper_bound
,
2937 coff_canonicalize_reloc
,
2938 _bfd_generic_set_reloc
,
2939 xcoff64_reloc_type_lookup
,
2940 xcoff64_reloc_name_lookup
,
2944 coff_set_section_contents
,
2947 xcoff64_sizeof_headers
,
2948 bfd_generic_get_relocated_section_contents
,
2949 bfd_generic_relax_section
,
2950 _bfd_xcoff_bfd_link_hash_table_create
,
2951 _bfd_xcoff_bfd_link_add_symbols
,
2952 _bfd_generic_link_just_syms
,
2953 _bfd_generic_copy_link_hash_symbol_type
,
2954 _bfd_xcoff_bfd_final_link
,
2955 _bfd_generic_link_split_section
,
2956 _bfd_generic_link_check_relocs
,
2957 bfd_generic_gc_sections
,
2958 bfd_generic_lookup_section_flags
,
2959 bfd_generic_merge_sections
,
2960 bfd_generic_is_group_section
,
2961 bfd_generic_group_name
,
2962 bfd_generic_discard_group
,
2963 _bfd_generic_section_already_linked
,
2964 _bfd_xcoff_define_common_symbol
,
2965 _bfd_generic_link_hide_symbol
,
2966 bfd_generic_define_start_stop
,
2969 _bfd_xcoff_get_dynamic_symtab_upper_bound
,
2970 _bfd_xcoff_canonicalize_dynamic_symtab
,
2971 _bfd_nodynamic_get_synthetic_symtab
,
2972 _bfd_xcoff_get_dynamic_reloc_upper_bound
,
2973 _bfd_xcoff_canonicalize_dynamic_reloc
,
2975 /* Opposite endian version, none exists. */
2978 & bfd_xcoff_aix5_backend_data
,