1 /* BFD back-end for IBM RS/6000 "XCOFF64" files.
2 Copyright (C) 2000-2021 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 bfd_boolean _bfd_xcoff64_put_symbol_name
90 (struct bfd_link_info
*, struct bfd_strtab_hash
*,
91 struct internal_syment
*, const char *);
92 static bfd_boolean _bfd_xcoff64_put_ldsymbol_name
93 (bfd
*, struct xcoff_loader_info
*, struct internal_ldsym
*, const char *);
94 static void _bfd_xcoff64_swap_sym_in
95 (bfd
*, void *, void *);
96 static unsigned int _bfd_xcoff64_swap_sym_out
97 (bfd
*, void *, void *);
98 static void _bfd_xcoff64_swap_aux_in
99 (bfd
*, void *, int, int, int, int, void *);
100 static unsigned int _bfd_xcoff64_swap_aux_out
101 (bfd
*, void *, int, int, int, int, void *);
102 static void xcoff64_swap_reloc_in
103 (bfd
*, void *, void *);
104 static unsigned int xcoff64_swap_reloc_out
105 (bfd
*, void *, void *);
106 extern bfd_boolean _bfd_xcoff_mkobject
108 extern bfd_boolean _bfd_xcoff_copy_private_bfd_data
110 extern bfd_boolean _bfd_xcoff_is_local_label_name
111 (bfd
*, const char *);
112 extern void xcoff64_rtype2howto
113 (arelent
*, struct internal_reloc
*);
114 extern reloc_howto_type
* xcoff64_reloc_type_lookup
115 (bfd
*, bfd_reloc_code_real_type
);
116 extern bfd_boolean _bfd_xcoff_slurp_armap
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 bfd_boolean _bfd_xcoff_write_armap
125 (bfd
*, unsigned int, struct orl
*, unsigned int, int);
126 extern bfd_boolean _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 bfd_boolean xcoff64_write_object_contents
152 static bfd_boolean xcoff64_ppc_relocate_section
153 (bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
154 struct internal_reloc
*, struct internal_syment
*,
156 static bfd_boolean xcoff64_slurp_armap
158 static bfd_cleanup xcoff64_archive_p
160 static bfd
*xcoff64_openr_next_archived_file
162 static int xcoff64_sizeof_headers
163 (bfd
*, struct bfd_link_info
*);
164 static asection
*xcoff64_create_csect_from_smclas
165 (bfd
*, union internal_auxent
*, const char *);
166 static bfd_boolean xcoff64_is_lineno_count_overflow
168 static bfd_boolean xcoff64_is_reloc_count_overflow
170 static bfd_vma xcoff64_loader_symbol_offset
171 (bfd
*, struct internal_ldhdr
*);
172 static bfd_vma xcoff64_loader_reloc_offset
173 (bfd
*, struct internal_ldhdr
*);
174 static bfd_boolean xcoff64_generate_rtinit
175 (bfd
*, const char *, const char *, bfd_boolean
);
176 static bfd_boolean xcoff64_bad_format_hook
179 /* Relocation functions */
180 static xcoff_reloc_function xcoff64_reloc_type_br
;
182 xcoff_reloc_function
*const
183 xcoff64_calculate_relocation
[XCOFF_MAX_CALCULATE_RELOCATION
] =
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) */
189 xcoff_reloc_type_fail
, /* R_RTB (0x04) */
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) */
195 xcoff64_reloc_type_br
, /* R_BR (0x0a) */
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) */
200 xcoff_reloc_type_noop
, /* R_REF (0x0f) */
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) */
205 xcoff_reloc_type_fail
, /* R_RRTBI (0x14) */
206 xcoff_reloc_type_fail
, /* R_RRTBA (0x15) */
207 xcoff_reloc_type_ba
, /* R_CAI (0x16) */
208 xcoff_reloc_type_crel
, /* R_CREL (0x17) */
209 xcoff_reloc_type_ba
, /* R_RBA (0x18) */
210 xcoff_reloc_type_ba
, /* R_RBAC (0x19) */
211 xcoff64_reloc_type_br
, /* R_RBR (0x1a) */
212 xcoff_reloc_type_ba
, /* R_RBRC (0x1b) */
215 /* coffcode.h needs these to be defined. */
216 /* Internalcoff.h and coffcode.h modify themselves based on these flags. */
218 #define RS6000COFF_C 1
220 #define SELECT_RELOC(internal, howto) \
222 internal.r_type = howto->type; \
224 ((howto->complain_on_overflow == complain_overflow_signed \
227 | (howto->bitsize - 1)); \
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
238 #define coff_bfd_reloc_name_lookup xcoff64_reloc_name_lookup
240 extern bfd_cleanup rs6000coff_core_p
242 extern bfd_boolean rs6000coff_core_file_matches_executable_p
243 (bfd
*cbfd
, bfd
*ebfd
);
244 extern char *rs6000coff_core_file_failing_command
246 extern int rs6000coff_core_file_failing_signal
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
255 #define coff_core_file_pid \
256 _bfd_nocore_core_file_pid
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
265 #define coff_core_file_pid \
266 _bfd_nocore_core_file_pid
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
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
276 #ifndef bfd_pe_print_pdata
277 #define bfd_pe_print_pdata NULL
280 #include "coffcode.h"
282 /* For XCOFF64, the effective width of symndx changes depending on
283 whether we are the first entry. Sigh. */
285 _bfd_xcoff64_swap_lineno_in (bfd
*abfd
, void *ext1
, void *in1
)
287 LINENO
*ext
= (LINENO
*) ext1
;
288 struct internal_lineno
*in
= (struct internal_lineno
*) in1
;
290 in
->l_lnno
= H_GET_32 (abfd
, (ext
->l_lnno
));
292 in
->l_addr
.l_symndx
= H_GET_32 (abfd
, ext
->l_addr
.l_symndx
);
294 in
->l_addr
.l_paddr
= H_GET_64 (abfd
, ext
->l_addr
.l_paddr
);
298 _bfd_xcoff64_swap_lineno_out (bfd
*abfd
, void *inp
, void *outp
)
300 struct internal_lineno
*in
= (struct internal_lineno
*) inp
;
301 struct external_lineno
*ext
= (struct external_lineno
*) outp
;
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
));
307 H_PUT_32 (abfd
, in
->l_addr
.l_symndx
, ext
->l_addr
.l_symndx
);
309 H_PUT_64 (abfd
, in
->l_addr
.l_paddr
, ext
->l_addr
.l_paddr
);
311 return bfd_coff_linesz (abfd
);
315 _bfd_xcoff64_swap_sym_in (bfd
*abfd
, void *ext1
, void *in1
)
317 struct external_syment
*ext
= (struct external_syment
*) ext1
;
318 struct internal_syment
*in
= (struct internal_syment
*) in1
;
320 in
->_n
._n_n
._n_zeroes
= 0;
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
);
323 in
->n_scnum
= (short) H_GET_16 (abfd
, ext
->e_scnum
);
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
);
330 _bfd_xcoff64_swap_sym_out (bfd
*abfd
, void *inp
, void *extp
)
332 struct internal_syment
*in
= (struct internal_syment
*) inp
;
333 struct external_syment
*ext
= (struct external_syment
*) extp
;
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
);
341 return bfd_coff_symesz (abfd
);
345 _bfd_xcoff64_swap_aux_in (bfd
*abfd
, void *ext1
, int type
, int in_class
,
346 int indx
, int numaux
, void *in1
)
348 union external_auxent
*ext
= (union external_auxent
*) ext1
;
349 union internal_auxent
*in
= (union internal_auxent
*) in1
;
354 if (ext
->x_file
.x_n
.x_n
.x_zeroes
[0] == 0)
356 in
->x_file
.x_n
.x_zeroes
= 0;
357 in
->x_file
.x_n
.x_offset
=
358 H_GET_32 (abfd
, ext
->x_file
.x_n
.x_n
.x_offset
);
362 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_n
.x_fname
, FILNMLEN
);
366 /* RS/6000 "csect" auxents */
370 if (indx
+ 1 == numaux
)
372 bfd_signed_vma h
= 0;
375 h
= H_GET_S32 (abfd
, ext
->x_csect
.x_scnlen_hi
);
376 l
= H_GET_32 (abfd
, ext
->x_csect
.x_scnlen_lo
);
378 in
->x_csect
.x_scnlen
.l
= h
<< 32 | (l
& 0xffffffff);
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
);
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
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
);
396 /* PE defines some extra fields; we zero them out for
398 in
->x_scn
.x_checksum
= 0;
399 in
->x_scn
.x_associated
= 0;
400 in
->x_scn
.x_comdat
= 0;
407 if (in_class
== C_BLOCK
|| in_class
== C_FCN
|| ISFCN (type
)
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
);
417 in
->x_sym
.x_misc
.x_fsize
418 = H_GET_32 (abfd
, ext
->x_sym
.x_fcnary
.x_fcn
.x_fsize
);
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
);
432 _bfd_xcoff64_swap_aux_out (bfd
*abfd
, void *inp
, int type
, int in_class
,
433 int indx ATTRIBUTE_UNUSED
,
434 int numaux ATTRIBUTE_UNUSED
,
437 union internal_auxent
*in
= (union internal_auxent
*) inp
;
438 union external_auxent
*ext
= (union external_auxent
*) extp
;
440 memset (ext
, 0, bfd_coff_auxesz (abfd
));
444 if (in
->x_file
.x_n
.x_zeroes
== 0)
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
,
448 ext
->x_file
.x_n
.x_n
.x_offset
);
452 memcpy (ext
->x_file
.x_n
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
454 H_PUT_8 (abfd
, _AUX_FILE
, ext
->x_auxtype
.x_auxtype
);
457 /* RS/6000 "csect" auxents */
461 if (indx
+ 1 == numaux
)
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
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
);
491 if (in_class
== C_BLOCK
|| in_class
== C_FCN
|| ISFCN (type
)
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
);
503 H_PUT_32 (abfd
, in
->x_sym
.x_misc
.x_fsize
,
504 ext
->x_sym
.x_fcnary
.x_fcn
.x_fsize
);
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
);
516 return bfd_coff_auxesz (abfd
);
520 _bfd_xcoff64_put_symbol_name (struct bfd_link_info
*info
,
521 struct bfd_strtab_hash
*strtab
,
522 struct internal_syment
*sym
,
528 hash
= !info
->traditional_format
;
529 indx
= _bfd_stringtab_add (strtab
, name
, hash
, FALSE
);
531 if (indx
== (bfd_size_type
) -1)
534 sym
->_n
._n_n
._n_zeroes
= 0;
535 sym
->_n
._n_n
._n_offset
= STRING_SIZE_SIZE
+ indx
;
541 _bfd_xcoff64_put_ldsymbol_name (bfd
*abfd ATTRIBUTE_UNUSED
,
542 struct xcoff_loader_info
*ldinfo
,
543 struct internal_ldsym
*ldsym
,
549 if (ldinfo
->string_size
+ len
+ 3 > ldinfo
->string_alc
)
551 bfd_size_type newalc
;
554 newalc
= ldinfo
->string_alc
* 2;
557 while (ldinfo
->string_size
+ len
+ 3 > newalc
)
560 newstrings
= bfd_realloc (ldinfo
->strings
, newalc
);
561 if (newstrings
== NULL
)
563 ldinfo
->failed
= TRUE
;
566 ldinfo
->string_alc
= newalc
;
567 ldinfo
->strings
= newstrings
;
570 bfd_put_16 (ldinfo
->output_bfd
, (bfd_vma
) (len
+ 1),
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;
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. */
585 /* Swap in the ldhdr structure. */
588 xcoff64_swap_ldhdr_in (bfd
*abfd
,
590 struct internal_ldhdr
*dst
)
592 const struct external_ldhdr
*src
= (const struct external_ldhdr
*) s
;
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
);
606 /* Swap out the ldhdr structure. */
609 xcoff64_swap_ldhdr_out (bfd
*abfd
, const struct internal_ldhdr
*src
, void *d
)
611 struct external_ldhdr
*dst
= (struct external_ldhdr
*) d
;
613 bfd_put_32 (abfd
, (bfd_vma
) src
->l_version
, dst
->l_version
);
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
);
625 /* Swap in the ldsym structure. */
628 xcoff64_swap_ldsym_in (bfd
*abfd
, const void *s
, struct internal_ldsym
*dst
)
630 const struct external_ldsym
*src
= (const struct external_ldsym
*) s
;
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. */
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
);
644 /* Swap out the ldsym structure. */
647 xcoff64_swap_ldsym_out (bfd
*abfd
, const struct internal_ldsym
*src
, void *d
)
649 struct external_ldsym
*dst
= (struct external_ldsym
*) d
;
651 bfd_put_64 (abfd
, src
->l_value
, dst
->l_value
);
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
);
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
);
661 xcoff64_swap_reloc_in (bfd
*abfd
, void *s
, void *d
)
663 struct external_reloc
*src
= (struct external_reloc
*) s
;
664 struct internal_reloc
*dst
= (struct internal_reloc
*) d
;
666 memset (dst
, 0, sizeof (struct internal_reloc
));
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
);
675 xcoff64_swap_reloc_out (bfd
*abfd
, void *s
, void *d
)
677 struct internal_reloc
*src
= (struct internal_reloc
*) s
;
678 struct external_reloc
*dst
= (struct external_reloc
*) d
;
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
);
685 return bfd_coff_relsz (abfd
);
688 /* Swap in the ldrel structure. */
691 xcoff64_swap_ldrel_in (bfd
*abfd
, const void *s
, struct internal_ldrel
*dst
)
693 const struct external_ldrel
*src
= (const struct external_ldrel
*) s
;
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
);
701 /* Swap out the ldrel structure. */
704 xcoff64_swap_ldrel_out (bfd
*abfd
, const struct internal_ldrel
*src
, void *d
)
706 struct external_ldrel
*dst
= (struct external_ldrel
*) d
;
708 bfd_put_64 (abfd
, src
->l_vaddr
, dst
->l_vaddr
);
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
);
711 bfd_put_32 (abfd
, src
->l_symndx
, dst
->l_symndx
);
715 xcoff64_write_object_contents (bfd
*abfd
)
718 bfd_boolean hasrelocs
= FALSE
;
719 bfd_boolean haslinno
= FALSE
;
722 file_ptr lineno_base
;
724 unsigned long reloc_size
= 0;
725 unsigned long lnno_size
= 0;
726 asection
*text_sec
= NULL
;
727 asection
*data_sec
= NULL
;
728 asection
*bss_sec
= NULL
;
729 struct internal_filehdr internal_f
;
730 struct internal_aouthdr internal_a
;
732 bfd_set_error (bfd_error_system_call
);
734 if (! abfd
->output_has_begun
)
736 if (! bfd_coff_compute_section_file_positions (abfd
))
740 /* Work out the size of the reloc and linno areas. */
741 reloc_base
= obj_relocbase (abfd
);
743 for (current
= abfd
->sections
; current
!= NULL
; current
= current
->next
)
744 reloc_size
+= current
->reloc_count
* bfd_coff_relsz (abfd
);
746 lineno_base
= reloc_base
+ reloc_size
;
748 /* Make a pass through the symbol table to count line number entries and
749 put them into the correct asections. */
750 lnno_size
= coff_count_linenumbers (abfd
) * bfd_coff_linesz (abfd
);
752 sym_base
= lineno_base
+ lnno_size
;
754 /* Indicate in each section->line_filepos its actual file address. */
755 for (current
= abfd
->sections
; current
!= NULL
; current
= current
->next
)
757 if (current
->lineno_count
)
759 current
->line_filepos
= lineno_base
;
760 current
->moving_line_filepos
= lineno_base
;
761 lineno_base
+= current
->lineno_count
* bfd_coff_linesz (abfd
);
765 current
->line_filepos
= 0;
768 if (current
->reloc_count
)
770 current
->rel_filepos
= reloc_base
;
771 reloc_base
+= current
->reloc_count
* bfd_coff_relsz (abfd
);
775 current
->rel_filepos
= 0;
779 if ((abfd
->flags
& EXEC_P
) != 0)
781 scn_base
= bfd_coff_filhsz (abfd
) + bfd_coff_aoutsz (abfd
);
782 internal_f
.f_opthdr
= bfd_coff_aoutsz (abfd
);
786 scn_base
= bfd_coff_filhsz (abfd
);
787 internal_f
.f_opthdr
= 0;
790 internal_f
.f_nscns
= 0;
792 if (bfd_seek (abfd
, scn_base
, SEEK_SET
) != 0)
795 for (current
= abfd
->sections
; current
!= NULL
; current
= current
->next
)
797 struct internal_scnhdr section
;
798 struct external_scnhdr buff
;
799 bfd_size_type amount
;
801 internal_f
.f_nscns
++;
803 strncpy (section
.s_name
, current
->name
, SCNNMLEN
);
805 section
.s_vaddr
= current
->vma
;
806 section
.s_paddr
= current
->lma
;
807 section
.s_size
= current
->size
;
809 /* If this section has no size or is unloadable then the scnptr
811 if (current
->size
== 0
812 || (current
->flags
& (SEC_LOAD
| SEC_HAS_CONTENTS
)) == 0)
814 section
.s_scnptr
= 0;
818 section
.s_scnptr
= current
->filepos
;
821 section
.s_relptr
= current
->rel_filepos
;
822 section
.s_lnnoptr
= current
->line_filepos
;
823 section
.s_nreloc
= current
->reloc_count
;
825 section
.s_nlnno
= current
->lineno_count
;
826 if (current
->reloc_count
!= 0)
828 if (current
->lineno_count
!= 0)
831 section
.s_flags
= sec_to_styp_flags (current
->name
, current
->flags
);
833 if (!strcmp (current
->name
, _TEXT
))
837 else if (!strcmp (current
->name
, _DATA
))
841 else if (!strcmp (current
->name
, _BSS
))
846 amount
= bfd_coff_scnhsz (abfd
);
847 if (bfd_coff_swap_scnhdr_out (abfd
, §ion
, &buff
) == 0
848 || bfd_bwrite (&buff
, amount
, abfd
) != amount
)
852 internal_f
.f_timdat
= 0;
854 internal_f
.f_flags
= 0;
857 internal_f
.f_flags
|= F_RELFLG
;
859 internal_f
.f_flags
|= F_LNNO
;
860 if (abfd
->flags
& EXEC_P
)
861 internal_f
.f_flags
|= F_EXEC
;
863 /* FIXME: this is wrong for PPC_PE! */
864 if (bfd_little_endian (abfd
))
865 internal_f
.f_flags
|= F_AR32WR
;
867 internal_f
.f_flags
|= F_AR32W
;
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
;
874 memset (&internal_a
, 0, sizeof internal_a
);
876 internal_f
.f_magic
= bfd_xcoff_magic_number (abfd
);
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
));
883 /* FIXME: Does anybody ever set this to another value? */
884 internal_a
.vstamp
= 0;
886 /* Now should write relocs, strings, syms. */
887 obj_sym_filepos (abfd
) = sym_base
;
889 internal_f
.f_symptr
= 0;
890 internal_f
.f_nsyms
= 0;
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)
899 if (!coff_renumber_symbols (abfd
, &firstundef
))
901 coff_mangle_symbols (abfd
);
902 if (! coff_write_symbols (abfd
))
904 if (! coff_write_linenumbers (abfd
))
906 if (! coff_write_relocs (abfd
, firstundef
))
909 internal_f
.f_symptr
= sym_base
;
910 internal_f
.f_nsyms
= bfd_get_symcount (abfd
);
912 else if (obj_raw_syment_count (abfd
) != 0)
914 internal_f
.f_symptr
= sym_base
;
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
;
922 internal_f
.f_flags
|= F_LSYMS
;
927 internal_a
.tsize
= text_sec
->size
;
928 internal_a
.text_start
= internal_a
.tsize
? text_sec
->vma
: 0;
933 internal_a
.dsize
= data_sec
->size
;
934 internal_a
.data_start
= internal_a
.dsize
? data_sec
->vma
: 0;
939 internal_a
.bsize
= bss_sec
->size
;
940 if (internal_a
.bsize
&& bss_sec
->vma
< internal_a
.data_start
)
941 internal_a
.data_start
= bss_sec
->vma
;
944 internal_a
.entry
= bfd_get_start_address (abfd
);
945 internal_f
.f_nsyms
= obj_raw_syment_count (abfd
);
947 if (xcoff_data (abfd
)->full_aouthdr
)
950 asection
*loader_sec
;
952 internal_a
.vstamp
= 1;
954 internal_a
.o_snentry
= xcoff_data (abfd
)->snentry
;
955 if (internal_a
.o_snentry
== 0)
956 internal_a
.entry
= (bfd_vma
) -1;
958 if (text_sec
!= NULL
)
960 internal_a
.o_sntext
= text_sec
->target_index
;
961 internal_a
.o_algntext
= bfd_section_alignment (text_sec
);
965 internal_a
.o_sntext
= 0;
966 internal_a
.o_algntext
= 0;
969 if (data_sec
!= NULL
)
971 internal_a
.o_sndata
= data_sec
->target_index
;
972 internal_a
.o_algndata
= bfd_section_alignment (data_sec
);
976 internal_a
.o_sndata
= 0;
977 internal_a
.o_algndata
= 0;
980 loader_sec
= bfd_get_section_by_name (abfd
, ".loader");
981 if (loader_sec
!= NULL
)
982 internal_a
.o_snloader
= loader_sec
->target_index
;
984 internal_a
.o_snloader
= 0;
986 internal_a
.o_snbss
= bss_sec
->target_index
;
988 internal_a
.o_snbss
= 0;
990 toc
= xcoff_data (abfd
)->toc
;
991 internal_a
.o_toc
= toc
;
992 internal_a
.o_sntoc
= xcoff_data (abfd
)->sntoc
;
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
;
999 switch (bfd_get_arch (abfd
))
1001 case bfd_arch_rs6000
:
1002 internal_a
.o_cputype
= 4;
1004 case bfd_arch_powerpc
:
1005 if (bfd_get_mach (abfd
) == bfd_mach_ppc
)
1006 internal_a
.o_cputype
= 3;
1007 else if (bfd_get_mach (abfd
) == bfd_mach_ppc_620
)
1008 internal_a
.o_cputype
= 2;
1010 internal_a
.o_cputype
= 1;
1016 internal_a
.o_maxstack
= xcoff_data (abfd
)->maxstack
;
1017 internal_a
.o_maxdata
= xcoff_data (abfd
)->maxdata
;
1020 if (bfd_seek (abfd
, (file_ptr
) 0, 0) != 0)
1025 bfd_size_type amount
= bfd_coff_filhsz (abfd
);
1027 buff
= bfd_malloc (amount
);
1031 bfd_coff_swap_filehdr_out (abfd
, &internal_f
, buff
);
1032 amount
= bfd_bwrite (buff
, amount
, abfd
);
1036 if (amount
!= bfd_coff_filhsz (abfd
))
1040 if (abfd
->flags
& EXEC_P
)
1043 bfd_size_type amount
= bfd_coff_aoutsz (abfd
);
1045 buff
= bfd_malloc (amount
);
1049 bfd_coff_swap_aouthdr_out (abfd
, &internal_a
, buff
);
1050 amount
= bfd_bwrite (buff
, amount
, abfd
);
1054 if (amount
!= bfd_coff_aoutsz (abfd
))
1062 xcoff64_reloc_type_br (bfd
*input_bfd
,
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
,
1070 bfd_vma
*relocation
,
1073 struct xcoff_link_hash_entry
*h
;
1074 bfd_vma section_offset
;
1076 if (0 > rel
->r_symndx
)
1079 h
= obj_xcoff_sym_hashes (input_bfd
)[rel
->r_symndx
];
1080 section_offset
= rel
->r_vaddr
- input_section
->vma
;
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
1090 && (bfd_link_hash_defined
== h
->root
.type
1091 || bfd_link_hash_defweak
== h
->root
.type
)
1092 && section_offset
+ 8 <= input_section
->size
)
1097 pnext
= contents
+ section_offset
+ 4;
1098 next
= bfd_get_32 (input_bfd
, pnext
);
1100 /* The _ptrgl function is magic. It is used by the AIX compiler to call
1101 a function through a pointer. */
1102 if (h
->smclas
== XMC_GL
|| strcmp (h
->root
.root
.string
, "._ptrgl") == 0)
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) */
1111 if (next
== 0xe8410028) /* ld r2,40(r1) */
1112 bfd_put_32 (input_bfd
, 0x60000000, pnext
); /* ori r0,r0,0 */
1115 else if (NULL
!= h
&& bfd_link_hash_undefined
== h
->root
.type
)
1117 /* Normally, this relocation is against a defined symbol. In the
1118 case where this is a partial link and the output section offset
1119 is greater than 2^25, the linker will return an invalid error
1120 message that the relocation has been truncated. Yes it has been
1121 truncated but no it not important. For this case, disable the
1122 overflow checking. */
1123 howto
->complain_on_overflow
= complain_overflow_dont
;
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
;
1130 howto
->src_mask
&= ~3;
1131 howto
->dst_mask
= howto
->src_mask
;
1134 && (h
->root
.type
== bfd_link_hash_defined
1135 || h
->root
.type
== bfd_link_hash_defweak
)
1136 && bfd_is_abs_section (h
->root
.u
.def
.section
)
1137 && section_offset
+ 4 <= input_section
->size
)
1142 /* Turn the relative branch into an absolute one by setting the
1144 ptr
= contents
+ section_offset
;
1145 insn
= bfd_get_32 (input_bfd
, ptr
);
1147 bfd_put_32 (input_bfd
, insn
, ptr
);
1149 /* Make the howto absolute too. */
1150 howto
->pc_relative
= FALSE
;
1151 howto
->complain_on_overflow
= complain_overflow_bitfield
;
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
1165 /* This is the relocation function for the PowerPC64.
1166 See xcoff_ppc_relocation_section for more information. */
1169 xcoff64_ppc_relocate_section (bfd
*output_bfd
,
1170 struct bfd_link_info
*info
,
1172 asection
*input_section
,
1174 struct internal_reloc
*relocs
,
1175 struct internal_syment
*syms
,
1176 asection
**sections
)
1178 struct internal_reloc
*rel
;
1179 struct internal_reloc
*relend
;
1182 relend
= rel
+ input_section
->reloc_count
;
1183 for (; rel
< relend
; rel
++)
1186 struct xcoff_link_hash_entry
*h
;
1187 struct internal_syment
*sym
;
1190 struct reloc_howto_struct howto
;
1192 bfd_vma value_to_relocate
;
1196 /* Relocation type R_REF is a special relocation type which is
1197 merely used to prevent garbage collection from occurring for
1198 the csect including the symbol which it references. */
1199 if (rel
->r_type
== R_REF
)
1203 howto
.type
= rel
->r_type
;
1204 howto
.rightshift
= 0;
1205 howto
.bitsize
= (rel
->r_size
& 0x3f) + 1;
1206 howto
.size
= howto
.bitsize
> 16 ? (howto
.bitsize
> 32 ? 4 : 2) : 1;
1207 howto
.pc_relative
= FALSE
;
1209 howto
.complain_on_overflow
= (rel
->r_size
& 0x80
1210 ? complain_overflow_signed
1211 : complain_overflow_bitfield
);
1212 howto
.special_function
= NULL
;
1213 howto
.name
= "internal";
1214 howto
.partial_inplace
= TRUE
;
1215 howto
.src_mask
= howto
.dst_mask
= N_ONES (howto
.bitsize
);
1216 howto
.pcrel_offset
= FALSE
;
1223 symndx
= rel
->r_symndx
;
1229 h
= obj_xcoff_sym_hashes (input_bfd
)[symndx
];
1230 sym
= syms
+ symndx
;
1231 addend
= - sym
->n_value
;
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
;
1242 val
= (sec
->output_section
->vma
1243 + sec
->output_offset
1249 if (info
->unresolved_syms_in_objects
!= RM_IGNORE
1250 && (h
->flags
& XCOFF_WAS_UNDEFINED
) != 0)
1251 info
->callbacks
->undefined_symbol
1252 (info
, h
->root
.root
.string
, input_bfd
, input_section
,
1253 rel
->r_vaddr
- input_section
->vma
,
1254 info
->unresolved_syms_in_objects
== RM_DIAGNOSE
1255 && !info
->warn_unresolved_syms
);
1257 if (h
->root
.type
== bfd_link_hash_defined
1258 || h
->root
.type
== bfd_link_hash_defweak
)
1260 sec
= h
->root
.u
.def
.section
;
1261 val
= (h
->root
.u
.def
.value
1262 + sec
->output_section
->vma
1263 + sec
->output_offset
);
1265 else if (h
->root
.type
== bfd_link_hash_common
)
1267 sec
= h
->root
.u
.c
.p
->section
;
1268 val
= (sec
->output_section
->vma
1269 + sec
->output_offset
);
1273 BFD_ASSERT (bfd_link_relocatable (info
)
1274 || (h
->flags
& XCOFF_DEF_DYNAMIC
) != 0
1275 || (h
->flags
& XCOFF_IMPORT
) != 0);
1280 if (rel
->r_type
>= XCOFF_MAX_CALCULATE_RELOCATION
1281 || !((*xcoff64_calculate_relocation
[rel
->r_type
])
1282 (input_bfd
, input_section
, output_bfd
, rel
, sym
, &howto
, val
,
1283 addend
, &relocation
, contents
)))
1287 address
= rel
->r_vaddr
- input_section
->vma
;
1288 location
= contents
+ address
;
1290 if (address
> input_section
->size
)
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
);
1299 value_to_relocate
= bfd_get_64 (input_bfd
, location
);
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. */
1308 if (((*xcoff_complain_overflow
[howto
.complain_on_overflow
])
1309 (input_bfd
, value_to_relocate
, relocation
, &howto
)))
1312 char buf
[SYMNMLEN
+ 1];
1313 char reloc_type_name
[10];
1325 name
= _bfd_coff_internal_syment_name (input_bfd
, sym
, buf
);
1329 sprintf (reloc_type_name
, "0x%02x", rel
->r_type
);
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
);
1337 /* Add RELOCATION to the right bits of VALUE_TO_RELOCATE. */
1338 value_to_relocate
= ((value_to_relocate
& ~howto
.dst_mask
)
1339 | (((value_to_relocate
& howto
.src_mask
)
1340 + relocation
) & howto
.dst_mask
));
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
);
1348 bfd_put_64 (input_bfd
, value_to_relocate
, location
);
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. */
1361 reloc_howto_type xcoff64_howto_table
[] =
1363 /* 0x00: Standard 64 bit relocation. */
1364 HOWTO (R_POS
, /* type */
1366 4, /* size (0 = byte, 1 = short, 2 = long) */
1368 FALSE
, /* pc_relative */
1370 complain_overflow_bitfield
, /* complain_on_overflow */
1371 0, /* special_function */
1372 "R_POS_64", /* name */
1373 TRUE
, /* partial_inplace */
1374 MINUS_ONE
, /* src_mask */
1375 MINUS_ONE
, /* dst_mask */
1376 FALSE
), /* pcrel_offset */
1378 /* 0x01: 64 bit relocation, but store negative value. */
1379 HOWTO (R_NEG
, /* type */
1381 -4, /* size (0 = byte, 1 = short, 2 = long) */
1383 FALSE
, /* pc_relative */
1385 complain_overflow_bitfield
, /* complain_on_overflow */
1386 0, /* special_function */
1388 TRUE
, /* partial_inplace */
1389 MINUS_ONE
, /* src_mask */
1390 MINUS_ONE
, /* dst_mask */
1391 FALSE
), /* pcrel_offset */
1393 /* 0x02: 32 bit PC relative relocation. */
1394 HOWTO (R_REL
, /* type */
1396 2, /* size (0 = byte, 1 = short, 2 = long) */
1398 TRUE
, /* pc_relative */
1400 complain_overflow_signed
, /* complain_on_overflow */
1401 0, /* special_function */
1403 TRUE
, /* partial_inplace */
1404 0xffffffff, /* src_mask */
1405 0xffffffff, /* dst_mask */
1406 FALSE
), /* pcrel_offset */
1408 /* 0x03: 16 bit TOC relative relocation. */
1409 HOWTO (R_TOC
, /* type */
1411 1, /* size (0 = byte, 1 = short, 2 = long) */
1413 FALSE
, /* pc_relative */
1415 complain_overflow_bitfield
, /* complain_on_overflow */
1416 0, /* special_function */
1418 TRUE
, /* partial_inplace */
1419 0xffff, /* src_mask */
1420 0xffff, /* dst_mask */
1421 FALSE
), /* pcrel_offset */
1423 /* 0x04: I don't really know what this is. */
1424 HOWTO (R_RTB
, /* type */
1426 2, /* size (0 = byte, 1 = short, 2 = long) */
1428 FALSE
, /* pc_relative */
1430 complain_overflow_bitfield
, /* complain_on_overflow */
1431 0, /* special_function */
1433 TRUE
, /* partial_inplace */
1434 0xffffffff, /* src_mask */
1435 0xffffffff, /* dst_mask */
1436 FALSE
), /* pcrel_offset */
1438 /* 0x05: External TOC relative symbol. */
1439 HOWTO (R_GL
, /* type */
1441 1, /* size (0 = byte, 1 = short, 2 = long) */
1443 FALSE
, /* pc_relative */
1445 complain_overflow_bitfield
, /* complain_on_overflow */
1446 0, /* special_function */
1448 TRUE
, /* partial_inplace */
1449 0xffff, /* src_mask */
1450 0xffff, /* dst_mask */
1451 FALSE
), /* pcrel_offset */
1453 /* 0x06: Local TOC relative symbol. */
1454 HOWTO (R_TCL
, /* type */
1456 1, /* size (0 = byte, 1 = short, 2 = long) */
1458 FALSE
, /* pc_relative */
1460 complain_overflow_bitfield
, /* complain_on_overflow */
1461 0, /* special_function */
1463 TRUE
, /* partial_inplace */
1464 0xffff, /* src_mask */
1465 0xffff, /* dst_mask */
1466 FALSE
), /* pcrel_offset */
1470 /* 0x08: Non modifiable absolute branch. */
1471 HOWTO (R_BA
, /* type */
1473 2, /* size (0 = byte, 1 = short, 2 = long) */
1475 FALSE
, /* pc_relative */
1477 complain_overflow_bitfield
, /* complain_on_overflow */
1478 0, /* special_function */
1479 "R_BA_26", /* name */
1480 TRUE
, /* partial_inplace */
1481 0x03fffffc, /* src_mask */
1482 0x03fffffc, /* dst_mask */
1483 FALSE
), /* pcrel_offset */
1487 /* 0x0a: Non modifiable relative branch. */
1488 HOWTO (R_BR
, /* type */
1490 2, /* size (0 = byte, 1 = short, 2 = long) */
1492 TRUE
, /* pc_relative */
1494 complain_overflow_signed
, /* complain_on_overflow */
1495 0, /* special_function */
1497 TRUE
, /* partial_inplace */
1498 0x03fffffc, /* src_mask */
1499 0x03fffffc, /* dst_mask */
1500 FALSE
), /* pcrel_offset */
1504 /* 0x0c: Indirect load. */
1505 HOWTO (R_RL
, /* type */
1507 1, /* size (0 = byte, 1 = short, 2 = long) */
1509 FALSE
, /* pc_relative */
1511 complain_overflow_bitfield
, /* complain_on_overflow */
1512 0, /* special_function */
1514 TRUE
, /* partial_inplace */
1515 0xffff, /* src_mask */
1516 0xffff, /* dst_mask */
1517 FALSE
), /* pcrel_offset */
1519 /* 0x0d: Load address. */
1520 HOWTO (R_RLA
, /* type */
1522 1, /* size (0 = byte, 1 = short, 2 = long) */
1524 FALSE
, /* pc_relative */
1526 complain_overflow_bitfield
, /* complain_on_overflow */
1527 0, /* special_function */
1529 TRUE
, /* partial_inplace */
1530 0xffff, /* src_mask */
1531 0xffff, /* dst_mask */
1532 FALSE
), /* pcrel_offset */
1536 /* 0x0f: Non-relocating reference. Bitsize is 1 so that r_rsize is 0. */
1537 HOWTO (R_REF
, /* type */
1539 0, /* size (0 = byte, 1 = short, 2 = long) */
1541 FALSE
, /* pc_relative */
1543 complain_overflow_dont
, /* complain_on_overflow */
1544 0, /* special_function */
1546 FALSE
, /* partial_inplace */
1549 FALSE
), /* pcrel_offset */
1554 /* 0x12: TOC relative indirect load. */
1555 HOWTO (R_TRL
, /* type */
1557 1, /* size (0 = byte, 1 = short, 2 = long) */
1559 FALSE
, /* pc_relative */
1561 complain_overflow_bitfield
, /* complain_on_overflow */
1562 0, /* special_function */
1564 TRUE
, /* partial_inplace */
1565 0xffff, /* src_mask */
1566 0xffff, /* dst_mask */
1567 FALSE
), /* pcrel_offset */
1569 /* 0x13: TOC relative load address. */
1570 HOWTO (R_TRLA
, /* type */
1572 1, /* size (0 = byte, 1 = short, 2 = long) */
1574 FALSE
, /* pc_relative */
1576 complain_overflow_bitfield
, /* complain_on_overflow */
1577 0, /* special_function */
1578 "R_TRLA", /* name */
1579 TRUE
, /* partial_inplace */
1580 0xffff, /* src_mask */
1581 0xffff, /* dst_mask */
1582 FALSE
), /* pcrel_offset */
1584 /* 0x14: Modifiable relative branch. */
1585 HOWTO (R_RRTBI
, /* type */
1587 2, /* size (0 = byte, 1 = short, 2 = long) */
1589 FALSE
, /* pc_relative */
1591 complain_overflow_bitfield
, /* complain_on_overflow */
1592 0, /* special_function */
1593 "R_RRTBI", /* name */
1594 TRUE
, /* partial_inplace */
1595 0xffffffff, /* src_mask */
1596 0xffffffff, /* dst_mask */
1597 FALSE
), /* pcrel_offset */
1599 /* 0x15: Modifiable absolute branch. */
1600 HOWTO (R_RRTBA
, /* type */
1602 2, /* size (0 = byte, 1 = short, 2 = long) */
1604 FALSE
, /* pc_relative */
1606 complain_overflow_bitfield
, /* complain_on_overflow */
1607 0, /* special_function */
1608 "R_RRTBA", /* name */
1609 TRUE
, /* partial_inplace */
1610 0xffffffff, /* src_mask */
1611 0xffffffff, /* dst_mask */
1612 FALSE
), /* pcrel_offset */
1614 /* 0x16: Modifiable call absolute indirect. */
1615 HOWTO (R_CAI
, /* type */
1617 1, /* size (0 = byte, 1 = short, 2 = long) */
1619 FALSE
, /* pc_relative */
1621 complain_overflow_bitfield
, /* complain_on_overflow */
1622 0, /* special_function */
1624 TRUE
, /* partial_inplace */
1625 0xffff, /* src_mask */
1626 0xffff, /* dst_mask */
1627 FALSE
), /* pcrel_offset */
1629 /* 0x17: Modifiable call relative. */
1630 HOWTO (R_CREL
, /* type */
1632 1, /* size (0 = byte, 1 = short, 2 = long) */
1634 FALSE
, /* pc_relative */
1636 complain_overflow_bitfield
, /* complain_on_overflow */
1637 0, /* special_function */
1638 "R_CREL", /* name */
1639 TRUE
, /* partial_inplace */
1640 0xffff, /* src_mask */
1641 0xffff, /* dst_mask */
1642 FALSE
), /* pcrel_offset */
1644 /* 0x18: Modifiable branch absolute. */
1645 HOWTO (R_RBA
, /* type */
1647 2, /* size (0 = byte, 1 = short, 2 = long) */
1649 FALSE
, /* pc_relative */
1651 complain_overflow_bitfield
, /* complain_on_overflow */
1652 0, /* special_function */
1654 TRUE
, /* partial_inplace */
1655 0x03fffffc, /* src_mask */
1656 0x03fffffc, /* dst_mask */
1657 FALSE
), /* pcrel_offset */
1659 /* 0x19: Modifiable branch absolute. */
1660 HOWTO (R_RBAC
, /* type */
1662 2, /* size (0 = byte, 1 = short, 2 = long) */
1664 FALSE
, /* pc_relative */
1666 complain_overflow_bitfield
, /* complain_on_overflow */
1667 0, /* special_function */
1668 "R_RBAC", /* name */
1669 TRUE
, /* partial_inplace */
1670 0xffffffff, /* src_mask */
1671 0xffffffff, /* dst_mask */
1672 FALSE
), /* pcrel_offset */
1674 /* 0x1a: Modifiable branch relative. */
1675 HOWTO (R_RBR
, /* type */
1677 2, /* size (0 = byte, 1 = short, 2 = long) */
1679 FALSE
, /* pc_relative */
1681 complain_overflow_signed
, /* complain_on_overflow */
1682 0, /* special_function */
1683 "R_RBR_26", /* name */
1684 TRUE
, /* partial_inplace */
1685 0x03fffffc, /* src_mask */
1686 0x03fffffc, /* dst_mask */
1687 FALSE
), /* pcrel_offset */
1689 /* 0x1b: Modifiable branch absolute. */
1690 HOWTO (R_RBRC
, /* type */
1692 1, /* size (0 = byte, 1 = short, 2 = long) */
1694 FALSE
, /* pc_relative */
1696 complain_overflow_bitfield
, /* complain_on_overflow */
1697 0, /* special_function */
1698 "R_RBRC", /* name */
1699 TRUE
, /* partial_inplace */
1700 0xffff, /* src_mask */
1701 0xffff, /* dst_mask */
1702 FALSE
), /* pcrel_offset */
1704 /* 0x1c: Standard 32 bit relocation. */
1705 HOWTO (R_POS
, /* type */
1707 2, /* size (0 = byte, 1 = short, 2 = long) */
1709 FALSE
, /* pc_relative */
1711 complain_overflow_bitfield
, /* complain_on_overflow */
1712 0, /* special_function */
1713 "R_POS_32", /* name */
1714 TRUE
, /* partial_inplace */
1715 0xffffffff, /* src_mask */
1716 0xffffffff, /* dst_mask */
1717 FALSE
), /* pcrel_offset */
1719 /* 0x1d: 16 bit Non modifiable absolute branch. */
1720 HOWTO (R_BA
, /* type */
1722 1, /* size (0 = byte, 1 = short, 2 = long) */
1724 FALSE
, /* pc_relative */
1726 complain_overflow_bitfield
, /* complain_on_overflow */
1727 0, /* special_function */
1728 "R_BA_16", /* name */
1729 TRUE
, /* partial_inplace */
1730 0xfffc, /* src_mask */
1731 0xfffc, /* dst_mask */
1732 FALSE
), /* pcrel_offset */
1734 /* 0x1e: Modifiable branch relative. */
1735 HOWTO (R_RBR
, /* type */
1737 1, /* size (0 = byte, 1 = short, 2 = long) */
1739 TRUE
, /* pc_relative */
1741 complain_overflow_signed
, /* complain_on_overflow */
1742 0, /* special_function */
1743 "R_RBR_16", /* name */
1744 TRUE
, /* partial_inplace */
1745 0xfffc, /* src_mask */
1746 0xfffc, /* dst_mask */
1747 FALSE
), /* pcrel_offset */
1749 /* 0x1f: Modifiable branch absolute. */
1750 HOWTO (R_RBA
, /* type */
1752 1, /* size (0 = byte, 1 = short, 2 = long) */
1754 FALSE
, /* pc_relative */
1756 complain_overflow_bitfield
, /* complain_on_overflow */
1757 0, /* special_function */
1758 "R_RBA_16", /* name */
1759 TRUE
, /* partial_inplace */
1760 0xffff, /* src_mask */
1761 0xffff, /* dst_mask */
1762 FALSE
), /* pcrel_offset */
1767 xcoff64_rtype2howto (arelent
*relent
, struct internal_reloc
*internal
)
1769 if (internal
->r_type
> R_RBRC
)
1772 /* Default howto layout works most of the time */
1773 relent
->howto
= &xcoff64_howto_table
[internal
->r_type
];
1775 /* Special case some 16 bit reloc */
1776 if (15 == (internal
->r_size
& 0x3f))
1778 if (R_BA
== internal
->r_type
)
1779 relent
->howto
= &xcoff64_howto_table
[0x1d];
1780 else if (R_RBR
== internal
->r_type
)
1781 relent
->howto
= &xcoff64_howto_table
[0x1e];
1782 else if (R_RBA
== internal
->r_type
)
1783 relent
->howto
= &xcoff64_howto_table
[0x1f];
1785 /* Special case 32 bit */
1786 else if (31 == (internal
->r_size
& 0x3f))
1788 if (R_POS
== internal
->r_type
)
1789 relent
->howto
= &xcoff64_howto_table
[0x1c];
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
1798 && (relent
->howto
->bitsize
1799 != ((unsigned int) internal
->r_size
& 0x3f) + 1))
1804 xcoff64_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1805 bfd_reloc_code_real_type code
)
1809 case BFD_RELOC_PPC_B26
:
1810 return &xcoff64_howto_table
[0xa];
1811 case BFD_RELOC_PPC_BA16
:
1812 return &xcoff64_howto_table
[0x1d];
1813 case BFD_RELOC_PPC_BA26
:
1814 return &xcoff64_howto_table
[8];
1815 case BFD_RELOC_PPC_TOC16
:
1816 return &xcoff64_howto_table
[3];
1817 case BFD_RELOC_PPC_B16
:
1818 return &xcoff64_howto_table
[0x1e];
1820 case BFD_RELOC_CTOR
:
1821 return &xcoff64_howto_table
[0x1c];
1823 return &xcoff64_howto_table
[0];
1824 case BFD_RELOC_NONE
:
1825 return &xcoff64_howto_table
[0xf];
1831 static reloc_howto_type
*
1832 xcoff64_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1838 i
< sizeof (xcoff64_howto_table
) / sizeof (xcoff64_howto_table
[0]);
1840 if (xcoff64_howto_table
[i
].name
!= NULL
1841 && strcasecmp (xcoff64_howto_table
[i
].name
, r_name
) == 0)
1842 return &xcoff64_howto_table
[i
];
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. */
1854 _bfd_strntol (const char * nptr
, int base
, unsigned int maxlen
)
1856 char buf
[24]; /* Should be enough. */
1858 BFD_ASSERT (maxlen
< (sizeof (buf
) - 1));
1860 memcpy (buf
, nptr
, maxlen
);
1862 return strtol (buf
, NULL
, base
);
1866 _bfd_strntoll (const char * nptr
, int base
, unsigned int maxlen
)
1868 char buf
[32]; /* Should be enough. */
1870 BFD_ASSERT (maxlen
< (sizeof (buf
) - 1));
1872 memcpy (buf
, nptr
, maxlen
);
1874 return strtoll (buf
, NULL
, base
);
1877 /* Macro to read an ASCII value stored in an archive header field. */
1878 #define GET_VALUE_IN_FIELD(VAR, FIELD, BASE) \
1881 (VAR) = (sizeof (VAR) > sizeof (long) \
1882 ? _bfd_strntoll (FIELD, BASE, sizeof FIELD) \
1883 : _bfd_strntol (FIELD, BASE, sizeof FIELD)); \
1887 /* Read in the armap of an XCOFF archive. */
1890 xcoff64_slurp_armap (bfd
*abfd
)
1894 bfd_size_type sz
, amt
;
1895 bfd_byte
*contents
, *cend
;
1901 /* This is for the new format. */
1902 struct xcoff_ar_hdr_big hdr
;
1904 if (xcoff_ardata (abfd
) == NULL
)
1906 abfd
->has_armap
= FALSE
;
1910 off
= bfd_scan_vma (xcoff_ardata_big (abfd
)->symoff64
,
1911 (const char **) NULL
, 10);
1914 abfd
->has_armap
= FALSE
;
1918 if (bfd_seek (abfd
, off
, SEEK_SET
) != 0)
1921 /* The symbol table starts with a normal archive header. */
1922 if (bfd_bread (&hdr
, (bfd_size_type
) SIZEOF_AR_HDR_BIG
, abfd
)
1923 != SIZEOF_AR_HDR_BIG
)
1926 /* Skip the name (normally empty). */
1927 GET_VALUE_IN_FIELD (namlen
, hdr
.namlen
, 10);
1928 pos
= ((namlen
+ 1) & ~(size_t) 1) + SXCOFFARFMAG
;
1929 if (bfd_seek (abfd
, pos
, SEEK_CUR
) != 0)
1932 sz
= bfd_scan_vma (hdr
.size
, (const char **) NULL
, 10);
1935 bfd_set_error (bfd_error_bad_value
);
1939 /* Read in the entire symbol table. */
1940 contents
= (bfd_byte
*) _bfd_alloc_and_read (abfd
, sz
+ 1, sz
);
1941 if (contents
== NULL
)
1944 /* Ensure strings are NULL terminated so we don't wander off the end
1948 /* The symbol table starts with an eight byte count. */
1949 c
= H_GET_64 (abfd
, contents
);
1953 bfd_set_error (bfd_error_bad_value
);
1957 amt
*= sizeof (carsym
);
1958 bfd_ardata (abfd
)->symdefs
= (carsym
*) bfd_alloc (abfd
, amt
);
1959 if (bfd_ardata (abfd
)->symdefs
== NULL
)
1962 /* After the count comes a list of eight byte file offsets. */
1963 for (i
= 0, arsym
= bfd_ardata (abfd
)->symdefs
, p
= contents
+ 8;
1965 ++i
, ++arsym
, p
+= 8)
1966 arsym
->file_offset
= H_GET_64 (abfd
, p
);
1968 /* After the file offsets come null terminated symbol names. */
1969 cend
= contents
+ sz
;
1970 for (i
= 0, arsym
= bfd_ardata (abfd
)->symdefs
;
1972 ++i
, ++arsym
, p
+= strlen ((char *) p
) + 1)
1976 bfd_set_error (bfd_error_bad_value
);
1979 arsym
->name
= (char *) p
;
1982 bfd_ardata (abfd
)->symdef_count
= c
;
1983 abfd
->has_armap
= TRUE
;
1989 /* See if this is an NEW XCOFF archive. */
1992 xcoff64_archive_p (bfd
*abfd
)
1994 struct artdata
*tdata_hold
;
1995 char magic
[SXCOFFARMAG
];
1996 /* This is the new format. */
1997 struct xcoff_ar_file_hdr_big hdr
;
1998 size_t amt
= SXCOFFARMAG
;
2000 if (bfd_bread (magic
, amt
, abfd
) != amt
)
2002 if (bfd_get_error () != bfd_error_system_call
)
2003 bfd_set_error (bfd_error_wrong_format
);
2007 if (strncmp (magic
, XCOFFARMAGBIG
, SXCOFFARMAG
) != 0)
2009 bfd_set_error (bfd_error_wrong_format
);
2013 /* Copy over the magic string. */
2014 memcpy (hdr
.magic
, magic
, SXCOFFARMAG
);
2016 /* Now read the rest of the file header. */
2017 amt
= SIZEOF_AR_FILE_HDR_BIG
- SXCOFFARMAG
;
2018 if (bfd_bread (&hdr
.memoff
, amt
, abfd
) != amt
)
2020 if (bfd_get_error () != bfd_error_system_call
)
2021 bfd_set_error (bfd_error_wrong_format
);
2025 tdata_hold
= bfd_ardata (abfd
);
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
;
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; */
2038 bfd_ardata (abfd
)->first_file_filepos
= bfd_scan_vma (hdr
.firstmemoff
,
2039 (const char **) NULL
,
2042 amt
= SIZEOF_AR_FILE_HDR_BIG
;
2043 bfd_ardata (abfd
)->tdata
= bfd_zalloc (abfd
, amt
);
2044 if (bfd_ardata (abfd
)->tdata
== NULL
)
2047 memcpy (bfd_ardata (abfd
)->tdata
, &hdr
, SIZEOF_AR_FILE_HDR_BIG
);
2049 if (! xcoff64_slurp_armap (abfd
))
2052 bfd_release (abfd
, bfd_ardata (abfd
));
2054 bfd_ardata (abfd
) = tdata_hold
;
2058 return _bfd_no_cleanup
;
2062 /* Open the next element in an XCOFF archive. */
2065 xcoff64_openr_next_archived_file (bfd
*archive
, bfd
*last_file
)
2069 if ((xcoff_ardata (archive
) == NULL
)
2070 || ! xcoff_big_format_p (archive
))
2072 bfd_set_error (bfd_error_invalid_operation
);
2076 if (last_file
== NULL
)
2078 filestart
= bfd_ardata (archive
)->first_file_filepos
;
2082 filestart
= bfd_scan_vma (arch_xhdr_big (last_file
)->nextoff
,
2083 (const char **) NULL
, 10);
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))
2092 bfd_set_error (bfd_error_no_more_archived_files
);
2096 return _bfd_get_elt_at_filepos (archive
, (file_ptr
) filestart
);
2099 /* We can't use the usual coff_sizeof_headers routine, because AIX
2100 always uses an a.out header. */
2103 xcoff64_sizeof_headers (bfd
*abfd
,
2104 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
2108 size
= bfd_coff_filhsz (abfd
);
2110 /* Don't think the small aout header can be used since some of the
2111 old elements have been reordered past the end of the old coff
2114 if (xcoff_data (abfd
)->full_aouthdr
)
2115 size
+= bfd_coff_aoutsz (abfd
);
2117 size
+= abfd
->section_count
* bfd_coff_scnhsz (abfd
);
2122 xcoff64_create_csect_from_smclas (bfd
*abfd
, union internal_auxent
*aux
,
2123 const char *symbol_name
)
2125 asection
*return_value
= NULL
;
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] =
2132 ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
2133 NULL
, ".bs", ".ds", ".uc", NULL
, NULL
, NULL
, ".tc0",
2134 ".td", ".sv64", ".sv3264"
2137 if ((19 >= aux
->x_csect
.x_smclas
)
2138 && (NULL
!= names
[aux
->x_csect
.x_smclas
]))
2141 return_value
= bfd_make_section_anyway
2142 (abfd
, names
[aux
->x_csect
.x_smclas
]);
2148 /* xgettext: c-format */
2149 (_("%pB: symbol `%s' has unrecognized smclas %d"),
2150 abfd
, symbol_name
, aux
->x_csect
.x_smclas
);
2151 bfd_set_error (bfd_error_bad_value
);
2154 return return_value
;
2158 xcoff64_is_lineno_count_overflow (bfd
*abfd ATTRIBUTE_UNUSED
,
2159 bfd_vma value ATTRIBUTE_UNUSED
)
2165 xcoff64_is_reloc_count_overflow (bfd
*abfd ATTRIBUTE_UNUSED
,
2166 bfd_vma value ATTRIBUTE_UNUSED
)
2172 xcoff64_loader_symbol_offset (bfd
*abfd ATTRIBUTE_UNUSED
,
2173 struct internal_ldhdr
*ldhdr
)
2175 return (ldhdr
->l_symoff
);
2179 xcoff64_loader_reloc_offset (bfd
*abfd ATTRIBUTE_UNUSED
,
2180 struct internal_ldhdr
*ldhdr
)
2182 return (ldhdr
->l_rldoff
);
2186 xcoff64_bad_format_hook (bfd
* abfd
, void *filehdr
)
2188 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
2190 /* Check flavor first. */
2191 if (bfd_get_flavour (abfd
) != bfd_target_xcoff_flavour
)
2194 if (bfd_xcoff_magic_number (abfd
) != internal_f
->f_magic
)
2201 xcoff64_generate_rtinit (bfd
*abfd
, const char *init
, const char *fini
,
2204 bfd_byte filehdr_ext
[FILHSZ
];
2205 bfd_byte scnhdr_ext
[SCNHSZ
* 3];
2206 bfd_byte syment_ext
[SYMESZ
* 10];
2207 bfd_byte reloc_ext
[RELSZ
* 3];
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
;
2213 size_t initsz
, finisz
;
2214 struct internal_filehdr filehdr
;
2215 struct internal_scnhdr text_scnhdr
;
2216 struct internal_scnhdr data_scnhdr
;
2217 struct internal_scnhdr bss_scnhdr
;
2218 struct internal_syment syment
;
2219 union internal_auxent auxent
;
2220 struct internal_reloc reloc
;
2222 char *text_name
= ".text";
2223 char *data_name
= ".data";
2224 char *bss_name
= ".bss";
2225 char *rtinit_name
= "__rtinit";
2226 char *rtld_name
= "__rtld";
2228 if (! bfd_xcoff_rtinit_size (abfd
))
2231 initsz
= (init
== NULL
? 0 : 1 + strlen (init
));
2232 finisz
= (fini
== NULL
? 0 : 1 + strlen (fini
));
2235 memset (filehdr_ext
, 0, FILHSZ
);
2236 memset (&filehdr
, 0, sizeof (struct internal_filehdr
));
2237 filehdr
.f_magic
= bfd_xcoff_magic_number (abfd
);
2238 filehdr
.f_nscns
= 3;
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;
2245 /* Section headers. */
2246 memset (scnhdr_ext
, 0, 3 * SCNHSZ
);
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
;
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
;
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;
2281 bss_scnhdr
.s_relptr
= 0;
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
;
2288 0x0000 0x00000000 : rtl
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
2296 0x0020 0x00000058 : offset to init name
2297 0x0024 0x00000000 : flags, padded to a word
2298 0x0028 0x00000000 : empty init
2302 0x0038 0x00000000 : fini, needs a reloc
2304 0x0040 0x00000??? : offset to fini name
2305 0x0044 0x00000000 : flags, padded to a word
2306 0x0048 0x00000000 : empty fini
2311 0x0058 + initsz fini name */
2313 data_buffer_size
= 0x0058 + initsz
+ finisz
;
2314 data_buffer_size
= (data_buffer_size
+ 7) &~ (bfd_size_type
) 7;
2316 data_buffer
= (bfd_byte
*) bfd_zmalloc (data_buffer_size
);
2317 if (data_buffer
== NULL
)
2323 bfd_put_32 (abfd
, val
, &data_buffer
[0x08]);
2325 bfd_put_32 (abfd
, val
, &data_buffer
[0x20]);
2326 memcpy (&data_buffer
[val
], init
, initsz
);
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
);
2339 bfd_put_32 (abfd
, val
, &data_buffer
[0x10]);
2340 data_scnhdr
.s_size
= data_buffer_size
;
2341 bss_scnhdr
.s_paddr
= bss_scnhdr
.s_vaddr
= data_scnhdr
.s_size
;
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
;
2350 string_table_size
+= strlen (rtld_name
) + 1;
2352 string_table
= (bfd_byte
*) bfd_zmalloc (string_table_size
);
2353 if (string_table
== NULL
)
2356 val
= string_table_size
;
2357 bfd_put_32 (abfd
, val
, &string_table
[0]);
2358 st_tmp
= string_table
+ 4;
2366 memset (syment_ext
, 0, 10 * SYMESZ
);
2367 memset (reloc_ext
, 0, 3 * RELSZ
);
2370 memset (&syment
, 0, sizeof (struct internal_syment
));
2371 memset (&auxent
, 0, sizeof (union internal_auxent
));
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;
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
;
2383 bfd_coff_swap_sym_out (abfd
, &syment
,
2384 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2385 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2387 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
2388 filehdr
.f_nsyms
+= 2;
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;
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
;
2402 bfd_coff_swap_sym_out (abfd
, &syment
,
2403 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2404 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2406 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
2407 filehdr
.f_nsyms
+= 2;
2412 memset (&syment
, 0, sizeof (struct internal_syment
));
2413 memset (&auxent
, 0, sizeof (union internal_auxent
));
2415 syment
._n
._n_n
._n_offset
= st_tmp
- string_table
;
2416 memcpy (st_tmp
, init
, initsz
);
2419 syment
.n_sclass
= C_EXT
;
2420 syment
.n_numaux
= 1;
2421 bfd_coff_swap_sym_out (abfd
, &syment
,
2422 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2423 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2425 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
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
;
2432 bfd_coff_swap_reloc_out (abfd
, &reloc
, &reloc_ext
[0]);
2434 filehdr
.f_nsyms
+= 2;
2435 data_scnhdr
.s_nreloc
+= 1;
2441 memset (&syment
, 0, sizeof (struct internal_syment
));
2442 memset (&auxent
, 0, sizeof (union internal_auxent
));
2444 syment
._n
._n_n
._n_offset
= st_tmp
- string_table
;
2445 memcpy (st_tmp
, fini
, finisz
);
2448 syment
.n_sclass
= C_EXT
;
2449 syment
.n_numaux
= 1;
2450 bfd_coff_swap_sym_out (abfd
, &syment
,
2451 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2452 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2454 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
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
;
2462 bfd_coff_swap_reloc_out (abfd
, &reloc
,
2463 &reloc_ext
[data_scnhdr
.s_nreloc
* RELSZ
]);
2465 filehdr
.f_nsyms
+= 2;
2466 data_scnhdr
.s_nreloc
+= 1;
2471 memset (&syment
, 0, sizeof (struct internal_syment
));
2472 memset (&auxent
, 0, sizeof (union internal_auxent
));
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;
2478 syment
.n_sclass
= C_EXT
;
2479 syment
.n_numaux
= 1;
2480 bfd_coff_swap_sym_out (abfd
, &syment
,
2481 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2482 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2484 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
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
;
2492 bfd_coff_swap_reloc_out (abfd
, &reloc
,
2493 &reloc_ext
[data_scnhdr
.s_nreloc
* RELSZ
]);
2495 filehdr
.f_nsyms
+= 2;
2496 data_scnhdr
.s_nreloc
+= 1;
2498 bss_scnhdr
.s_size
= 0;
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
;
2504 bfd_coff_swap_filehdr_out (abfd
, &filehdr
, filehdr_ext
);
2505 bfd_bwrite (filehdr_ext
, FILHSZ
, abfd
);
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
);
2510 bfd_bwrite (data_buffer
, data_buffer_size
, abfd
);
2511 bfd_bwrite (reloc_ext
, data_scnhdr
.s_nreloc
* RELSZ
, abfd
);
2512 bfd_bwrite (syment_ext
, filehdr
.f_nsyms
* SYMESZ
, abfd
);
2513 bfd_bwrite (string_table
, string_table_size
, abfd
);
2521 /* The typical dynamic reloc. */
2523 static reloc_howto_type xcoff64_dynamic_reloc
=
2524 HOWTO (0, /* type */
2526 4, /* size (0 = byte, 1 = short, 2 = long) */
2528 FALSE
, /* pc_relative */
2530 complain_overflow_bitfield
, /* complain_on_overflow */
2531 0, /* special_function */
2533 TRUE
, /* partial_inplace */
2534 MINUS_ONE
, /* src_mask */
2535 MINUS_ONE
, /* dst_mask */
2536 FALSE
); /* pcrel_offset */
2538 static const unsigned long xcoff64_glink_code
[10] =
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, /* ??? */
2552 static const struct xcoff_backend_data_rec bfd_xcoff_backend_data
=
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
,
2573 TRUE
, /* _bfd_coff_long_filenames */
2574 XCOFF_NO_LONG_SECTION_NAMES
, /* _bfd_coff_long_section_names */
2575 3, /* _bfd_coff_default_section_alignment_power */
2576 TRUE
, /* _bfd_coff_force_symnames_in_strings */
2577 4, /* _bfd_coff_debug_string_prefix_length */
2578 32768, /* _bfd_coff_max_nscns */
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
,
2587 coff_set_alignment_hook
,
2588 coff_slurp_symbol_table
,
2589 symname_in_debug_hook
,
2590 coff_pointerize_aux_hook
,
2592 dummy_reloc16_extra_cases
,
2593 dummy_reloc16_estimate
,
2594 NULL
, /* bfd_coff_symbol_classification */
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
,
2602 coff_final_link_postscript
,
2603 NULL
/* print_pdata. */
2606 0x01EF, /* magic number */
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
,
2622 24, /* _xcoff_function_descriptor_size */
2623 0, /* _xcoff_small_aout_header_size */
2626 2, /* _xcoff_ldhdr_version */
2628 _bfd_xcoff64_put_symbol_name
,
2629 _bfd_xcoff64_put_ldsymbol_name
,
2630 &xcoff64_dynamic_reloc
,
2631 xcoff64_create_csect_from_smclas
,
2633 /* Lineno and reloc count overflow. */
2634 xcoff64_is_lineno_count_overflow
,
2635 xcoff64_is_reloc_count_overflow
,
2637 xcoff64_loader_symbol_offset
,
2638 xcoff64_loader_reloc_offset
,
2641 &xcoff64_glink_code
[0],
2642 40, /* _xcoff_glink_size */
2645 88, /* _xcoff_rtinit_size */
2646 xcoff64_generate_rtinit
,
2649 /* The transfer vector that leads the outside world to all of the above. */
2650 const bfd_target rs6000_xcoff64_vec
=
2653 bfd_target_xcoff_flavour
,
2654 BFD_ENDIAN_BIG
, /* data byte order is big */
2655 BFD_ENDIAN_BIG
, /* header byte order is big */
2657 (HAS_RELOC
| EXEC_P
| HAS_LINENO
| HAS_DEBUG
| DYNAMIC
2658 | HAS_SYMS
| HAS_LOCALS
| WP_TEXT
),
2660 SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_CODE
| SEC_DATA
,
2661 0, /* leading char */
2662 '/', /* ar_pad_char */
2663 15, /* ar_max_namelen */
2664 0, /* match priority. */
2665 TARGET_KEEP_UNUSED_SECTION_SYMBOLS
, /* keep unused section symbols. */
2689 { /* bfd_check_format */
2696 { /* bfd_set_format */
2697 _bfd_bool_bfd_false_error
,
2699 _bfd_generic_mkarchive
,
2700 _bfd_bool_bfd_false_error
2703 {/* bfd_write_contents */
2704 _bfd_bool_bfd_false_error
,
2705 xcoff64_write_object_contents
,
2706 _bfd_xcoff_write_archive_contents
,
2707 _bfd_bool_bfd_false_error
2711 _bfd_archive_close_and_cleanup
,
2713 coff_new_section_hook
,
2714 _bfd_generic_get_section_contents
,
2715 _bfd_generic_get_section_contents_in_window
,
2718 _bfd_xcoff_copy_private_bfd_data
,
2719 _bfd_generic_bfd_merge_private_bfd_data
,
2720 _bfd_generic_init_private_section_data
,
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
,
2728 BFD_JUMP_TABLE_CORE (coff
),
2731 xcoff64_slurp_armap
,
2732 _bfd_noarchive_slurp_extended_name_table
,
2733 _bfd_noarchive_construct_extended_name_table
,
2734 bfd_dont_truncate_arname
,
2735 _bfd_xcoff_write_armap
,
2736 _bfd_xcoff_read_ar_hdr
,
2737 _bfd_generic_write_ar_hdr
,
2738 xcoff64_openr_next_archived_file
,
2739 _bfd_generic_get_elt_at_index
,
2740 _bfd_xcoff_stat_arch_elt
,
2744 coff_get_symtab_upper_bound
,
2745 coff_canonicalize_symtab
,
2746 coff_make_empty_symbol
,
2748 coff_get_symbol_info
,
2749 coff_get_symbol_version_string
,
2750 _bfd_xcoff_is_local_label_name
,
2751 coff_bfd_is_target_special_symbol
,
2753 coff_find_nearest_line
,
2755 coff_find_inliner_info
,
2756 coff_bfd_make_debug_symbol
,
2757 _bfd_generic_read_minisymbols
,
2758 _bfd_generic_minisymbol_to_symbol
,
2761 coff_get_reloc_upper_bound
,
2762 coff_canonicalize_reloc
,
2763 _bfd_generic_set_reloc
,
2764 xcoff64_reloc_type_lookup
,
2765 xcoff64_reloc_name_lookup
,
2769 coff_set_section_contents
,
2772 xcoff64_sizeof_headers
,
2773 bfd_generic_get_relocated_section_contents
,
2774 bfd_generic_relax_section
,
2775 _bfd_xcoff_bfd_link_hash_table_create
,
2776 _bfd_xcoff_bfd_link_add_symbols
,
2777 _bfd_generic_link_just_syms
,
2778 _bfd_generic_copy_link_hash_symbol_type
,
2779 _bfd_xcoff_bfd_final_link
,
2780 _bfd_generic_link_split_section
,
2781 _bfd_generic_link_check_relocs
,
2782 bfd_generic_gc_sections
,
2783 bfd_generic_lookup_section_flags
,
2784 bfd_generic_merge_sections
,
2785 bfd_generic_is_group_section
,
2786 bfd_generic_group_name
,
2787 bfd_generic_discard_group
,
2788 _bfd_generic_section_already_linked
,
2789 _bfd_xcoff_define_common_symbol
,
2790 _bfd_generic_link_hide_symbol
,
2791 bfd_generic_define_start_stop
,
2794 _bfd_xcoff_get_dynamic_symtab_upper_bound
,
2795 _bfd_xcoff_canonicalize_dynamic_symtab
,
2796 _bfd_nodynamic_get_synthetic_symtab
,
2797 _bfd_xcoff_get_dynamic_reloc_upper_bound
,
2798 _bfd_xcoff_canonicalize_dynamic_reloc
,
2800 /* Opposite endian version, none exists */
2803 &bfd_xcoff_backend_data
,
2806 extern bfd_cleanup xcoff64_core_p
2808 extern bfd_boolean xcoff64_core_file_matches_executable_p
2810 extern char *xcoff64_core_file_failing_command
2812 extern int xcoff64_core_file_failing_signal
2814 #define xcoff64_core_file_pid _bfd_nocore_core_file_pid
2817 static const struct xcoff_backend_data_rec bfd_xcoff_aix5_backend_data
=
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
,
2838 TRUE
, /* _bfd_coff_long_filenames */
2839 XCOFF_NO_LONG_SECTION_NAMES
, /* _bfd_coff_long_section_names */
2840 3, /* _bfd_coff_default_section_alignment_power */
2841 TRUE
, /* _bfd_coff_force_symnames_in_strings */
2842 4, /* _bfd_coff_debug_string_prefix_length */
2843 32768, /* _bfd_coff_max_nscns */
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
,
2852 coff_set_alignment_hook
,
2853 coff_slurp_symbol_table
,
2854 symname_in_debug_hook
,
2855 coff_pointerize_aux_hook
,
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
,
2867 coff_final_link_postscript
,
2868 NULL
/* print_pdata. */
2871 U64_TOCMAGIC
, /* magic number */
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
,
2887 24, /* _xcoff_function_descriptor_size */
2888 0, /* _xcoff_small_aout_header_size */
2890 2, /* _xcoff_ldhdr_version */
2892 _bfd_xcoff64_put_symbol_name
,
2893 _bfd_xcoff64_put_ldsymbol_name
,
2894 &xcoff64_dynamic_reloc
,
2895 xcoff64_create_csect_from_smclas
,
2897 /* Lineno and reloc count overflow. */
2898 xcoff64_is_lineno_count_overflow
,
2899 xcoff64_is_reloc_count_overflow
,
2901 xcoff64_loader_symbol_offset
,
2902 xcoff64_loader_reloc_offset
,
2905 &xcoff64_glink_code
[0],
2906 40, /* _xcoff_glink_size */
2909 88, /* _xcoff_rtinit_size */
2910 xcoff64_generate_rtinit
,
2913 /* The transfer vector that leads the outside world to all of the above. */
2914 const bfd_target rs6000_xcoff64_aix_vec
=
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 */
2921 (HAS_RELOC
| EXEC_P
| HAS_LINENO
| HAS_DEBUG
| DYNAMIC
2922 | HAS_SYMS
| HAS_LOCALS
| WP_TEXT
),
2924 SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_CODE
| SEC_DATA
,
2925 0, /* leading char */
2926 '/', /* ar_pad_char */
2927 15, /* ar_max_namelen */
2928 0, /* match priority. */
2929 TARGET_KEEP_UNUSED_SECTION_SYMBOLS
, /* keep unused section symbols. */
2953 { /* bfd_check_format */
2960 { /* bfd_set_format */
2961 _bfd_bool_bfd_false_error
,
2963 _bfd_generic_mkarchive
,
2964 _bfd_bool_bfd_false_error
2967 {/* bfd_write_contents */
2968 _bfd_bool_bfd_false_error
,
2969 xcoff64_write_object_contents
,
2970 _bfd_xcoff_write_archive_contents
,
2971 _bfd_bool_bfd_false_error
2975 _bfd_archive_close_and_cleanup
,
2977 coff_new_section_hook
,
2978 _bfd_generic_get_section_contents
,
2979 _bfd_generic_get_section_contents_in_window
,
2982 _bfd_xcoff_copy_private_bfd_data
,
2983 _bfd_generic_bfd_merge_private_bfd_data
,
2984 _bfd_generic_init_private_section_data
,
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
,
2992 BFD_JUMP_TABLE_CORE (xcoff64
),
2995 xcoff64_slurp_armap
,
2996 _bfd_noarchive_slurp_extended_name_table
,
2997 _bfd_noarchive_construct_extended_name_table
,
2998 bfd_dont_truncate_arname
,
2999 _bfd_xcoff_write_armap
,
3000 _bfd_xcoff_read_ar_hdr
,
3001 _bfd_generic_write_ar_hdr
,
3002 xcoff64_openr_next_archived_file
,
3003 _bfd_generic_get_elt_at_index
,
3004 _bfd_xcoff_stat_arch_elt
,
3008 coff_get_symtab_upper_bound
,
3009 coff_canonicalize_symtab
,
3010 coff_make_empty_symbol
,
3012 coff_get_symbol_info
,
3013 coff_get_symbol_version_string
,
3014 _bfd_xcoff_is_local_label_name
,
3015 coff_bfd_is_target_special_symbol
,
3017 coff_find_nearest_line
,
3019 coff_find_inliner_info
,
3020 coff_bfd_make_debug_symbol
,
3021 _bfd_generic_read_minisymbols
,
3022 _bfd_generic_minisymbol_to_symbol
,
3025 coff_get_reloc_upper_bound
,
3026 coff_canonicalize_reloc
,
3027 _bfd_generic_set_reloc
,
3028 xcoff64_reloc_type_lookup
,
3029 xcoff64_reloc_name_lookup
,
3033 coff_set_section_contents
,
3036 xcoff64_sizeof_headers
,
3037 bfd_generic_get_relocated_section_contents
,
3038 bfd_generic_relax_section
,
3039 _bfd_xcoff_bfd_link_hash_table_create
,
3040 _bfd_xcoff_bfd_link_add_symbols
,
3041 _bfd_generic_link_just_syms
,
3042 _bfd_generic_copy_link_hash_symbol_type
,
3043 _bfd_xcoff_bfd_final_link
,
3044 _bfd_generic_link_split_section
,
3045 _bfd_generic_link_check_relocs
,
3046 bfd_generic_gc_sections
,
3047 bfd_generic_lookup_section_flags
,
3048 bfd_generic_merge_sections
,
3049 bfd_generic_is_group_section
,
3050 bfd_generic_group_name
,
3051 bfd_generic_discard_group
,
3052 _bfd_generic_section_already_linked
,
3053 _bfd_xcoff_define_common_symbol
,
3054 _bfd_generic_link_hide_symbol
,
3055 bfd_generic_define_start_stop
,
3058 _bfd_xcoff_get_dynamic_symtab_upper_bound
,
3059 _bfd_xcoff_canonicalize_dynamic_symtab
,
3060 _bfd_nodynamic_get_synthetic_symtab
,
3061 _bfd_xcoff_get_dynamic_reloc_upper_bound
,
3062 _bfd_xcoff_canonicalize_dynamic_reloc
,
3064 /* Opposite endian version, none exists. */
3067 & bfd_xcoff_aix5_backend_data
,