1 /* BFD back-end for IBM RS/6000 "XCOFF64" files.
2 Copyright 2000, 2001, 2002
3 Free Software Foundation, Inc.
4 Written Clinton Popetz.
5 Contributed by Cygnus Support.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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
PARAMS ((bfd
*, PTR
, PTR
));
86 static unsigned int _bfd_xcoff64_swap_lineno_out
PARAMS ((bfd
*, PTR
, PTR
));
87 static boolean _bfd_xcoff64_put_symbol_name
88 PARAMS ((bfd
*, struct bfd_strtab_hash
*, struct internal_syment
*,
90 static boolean _bfd_xcoff64_put_ldsymbol_name
91 PARAMS ((bfd
*, struct xcoff_loader_info
*, struct internal_ldsym
*,
93 static void _bfd_xcoff64_swap_sym_in
PARAMS ((bfd
*, PTR
, PTR
));
94 static unsigned int _bfd_xcoff64_swap_sym_out
PARAMS ((bfd
*, PTR
, PTR
));
95 static void _bfd_xcoff64_swap_aux_in
96 PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
97 static unsigned int _bfd_xcoff64_swap_aux_out
98 PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
99 extern boolean _bfd_xcoff_mkobject
PARAMS ((bfd
*));
100 extern boolean _bfd_xcoff_copy_private_bfd_data
PARAMS ((bfd
*, bfd
*));
101 extern boolean _bfd_xcoff_is_local_label_name
PARAMS ((bfd
*, const char *));
102 extern void xcoff64_rtype2howto
103 PARAMS ((arelent
*, struct internal_reloc
*));
104 extern reloc_howto_type
* xcoff64_reloc_type_lookup
105 PARAMS ((bfd
*, bfd_reloc_code_real_type
));
106 extern boolean _bfd_xcoff_slurp_armap
PARAMS ((bfd
*));
107 extern PTR _bfd_xcoff_read_ar_hdr
PARAMS ((bfd
*));
108 extern bfd
*_bfd_xcoff_openr_next_archived_file
PARAMS ((bfd
*, bfd
*));
109 extern int _bfd_xcoff_stat_arch_elt
PARAMS ((bfd
*, struct stat
*));
110 extern boolean _bfd_xcoff_write_armap
111 PARAMS ((bfd
*, unsigned int, struct orl
*, unsigned int, int));
112 extern boolean _bfd_xcoff_write_archive_contents
PARAMS ((bfd
*));
113 extern int _bfd_xcoff_sizeof_headers
PARAMS ((bfd
*, boolean
));
114 extern void _bfd_xcoff_swap_sym_in
PARAMS ((bfd
*, PTR
, PTR
));
115 extern unsigned int _bfd_xcoff_swap_sym_out
PARAMS ((bfd
*, PTR
, PTR
));
116 extern void _bfd_xcoff_swap_aux_in
117 PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
118 extern unsigned int _bfd_xcoff_swap_aux_out
119 PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
120 static void xcoff64_swap_ldhdr_in
121 PARAMS ((bfd
*, const PTR
, struct internal_ldhdr
*));
122 static void xcoff64_swap_ldhdr_out
123 PARAMS ((bfd
*, const struct internal_ldhdr
*, PTR d
));
124 static void xcoff64_swap_ldsym_in
125 PARAMS ((bfd
*, const PTR
, struct internal_ldsym
*));
126 static void xcoff64_swap_ldsym_out
127 PARAMS ((bfd
*, const struct internal_ldsym
*, PTR d
));
128 static void xcoff64_swap_ldrel_in
129 PARAMS ((bfd
*, const PTR
, struct internal_ldrel
*));
130 static void xcoff64_swap_ldrel_out
131 PARAMS ((bfd
*, const struct internal_ldrel
*, PTR d
));
132 static boolean xcoff64_write_object_contents
PARAMS ((bfd
*));
133 static boolean xcoff64_ppc_relocate_section
134 PARAMS ((bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
135 struct internal_reloc
*, struct internal_syment
*,
137 static boolean xcoff64_slurp_armap
PARAMS ((bfd
*));
138 static const bfd_target
*xcoff64_archive_p
PARAMS ((bfd
*));
139 static bfd
*xcoff64_openr_next_archived_file
PARAMS ((bfd
*, bfd
*));
140 static int xcoff64_sizeof_headers
PARAMS ((bfd
*, boolean
));
141 static asection
*xcoff64_create_csect_from_smclas
142 PARAMS ((bfd
*, union internal_auxent
*, const char *));
143 static boolean xcoff64_is_lineno_count_overflow
PARAMS ((bfd
*, bfd_vma
));
144 static boolean xcoff64_is_reloc_count_overflow
PARAMS ((bfd
*, bfd_vma
));
145 static bfd_vma xcoff64_loader_symbol_offset
146 PARAMS ((bfd
*, struct internal_ldhdr
*));
147 static bfd_vma xcoff64_loader_reloc_offset
148 PARAMS ((bfd
*, struct internal_ldhdr
*));
149 static boolean xcoff64_generate_rtinit
150 PARAMS ((bfd
*, const char *, const char *, boolean
));
151 static boolean xcoff64_bad_format_hook
PARAMS ((bfd
*, PTR
));
153 /* coffcode.h needs these to be defined. */
154 /* Internalcoff.h and coffcode.h modify themselves based on these flags. */
156 #define RS6000COFF_C 1
158 #define SELECT_RELOC(internal, howto) \
160 internal.r_type = howto->type; \
162 ((howto->complain_on_overflow == complain_overflow_signed \
165 | (howto->bitsize - 1)); \
168 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
169 #define COFF_LONG_FILENAMES
170 #define NO_COFF_SYMBOLS
171 #define RTYPE2HOWTO(cache_ptr, dst) xcoff64_rtype2howto (cache_ptr, dst)
172 #define coff_mkobject _bfd_xcoff_mkobject
173 #define coff_bfd_copy_private_bfd_data _bfd_xcoff_copy_private_bfd_data
174 #define coff_bfd_is_local_label_name _bfd_xcoff_is_local_label_name
175 #define coff_bfd_reloc_type_lookup xcoff64_reloc_type_lookup
177 extern const bfd_target
* rs6000coff_core_p
PARAMS ((bfd
*abfd
));
178 extern boolean rs6000coff_core_file_matches_executable_p
179 PARAMS((bfd
*cbfd
, bfd
*ebfd
));
180 extern char *rs6000coff_core_file_failing_command
PARAMS ((bfd
*abfd
));
181 extern int rs6000coff_core_file_failing_signal
PARAMS ((bfd
*abfd
));
182 #define CORE_FILE_P rs6000coff_core_p
183 #define coff_core_file_failing_command \
184 rs6000coff_core_file_failing_command
185 #define coff_core_file_failing_signal \
186 rs6000coff_core_file_failing_signal
187 #define coff_core_file_matches_executable_p \
188 rs6000coff_core_file_matches_executable_p
190 #define CORE_FILE_P _bfd_dummy_target
191 #define coff_core_file_failing_command \
192 _bfd_nocore_core_file_failing_command
193 #define coff_core_file_failing_signal \
194 _bfd_nocore_core_file_failing_signal
195 #define coff_core_file_matches_executable_p \
196 _bfd_nocore_core_file_matches_executable_p
198 #define coff_SWAP_sym_in _bfd_xcoff64_swap_sym_in
199 #define coff_SWAP_sym_out _bfd_xcoff64_swap_sym_out
200 #define coff_SWAP_aux_in _bfd_xcoff64_swap_aux_in
201 #define coff_SWAP_aux_out _bfd_xcoff64_swap_aux_out
204 #include "coffcode.h"
206 /* For XCOFF64, the effective width of symndx changes depending on
207 whether we are the first entry. Sigh. */
209 _bfd_xcoff64_swap_lineno_in (abfd
, ext1
, in1
)
214 LINENO
*ext
= (LINENO
*) ext1
;
215 struct internal_lineno
*in
= (struct internal_lineno
*) in1
;
217 in
->l_lnno
= H_GET_32 (abfd
, (ext
->l_lnno
));
219 in
->l_addr
.l_symndx
= H_GET_32 (abfd
, ext
->l_addr
.l_symndx
);
221 in
->l_addr
.l_paddr
= H_GET_64 (abfd
, ext
->l_addr
.l_paddr
);
225 _bfd_xcoff64_swap_lineno_out (abfd
, inp
, outp
)
230 struct internal_lineno
*in
= (struct internal_lineno
*) inp
;
231 struct external_lineno
*ext
= (struct external_lineno
*) outp
;
233 H_PUT_32 (abfd
, in
->l_addr
.l_symndx
, ext
->l_addr
.l_symndx
);
234 H_PUT_32 (abfd
, in
->l_lnno
, (ext
->l_lnno
));
237 H_PUT_32 (abfd
, in
->l_addr
.l_symndx
, ext
->l_addr
.l_symndx
);
239 H_PUT_64 (abfd
, in
->l_addr
.l_paddr
, ext
->l_addr
.l_paddr
);
241 return bfd_coff_linesz (abfd
);
245 _bfd_xcoff64_swap_sym_in (abfd
, ext1
, in1
)
250 struct external_syment
*ext
= (struct external_syment
*) ext1
;
251 struct internal_syment
*in
= (struct internal_syment
*) in1
;
253 in
->_n
._n_n
._n_zeroes
= 0;
254 in
->_n
._n_n
._n_offset
= H_GET_32 (abfd
, ext
->e_offset
);
255 in
->n_value
= H_GET_64 (abfd
, ext
->e_value
);
256 in
->n_scnum
= H_GET_16 (abfd
, ext
->e_scnum
);
257 in
->n_type
= H_GET_16 (abfd
, ext
->e_type
);
258 in
->n_sclass
= H_GET_8 (abfd
, ext
->e_sclass
);
259 in
->n_numaux
= H_GET_8 (abfd
, ext
->e_numaux
);
263 _bfd_xcoff64_swap_sym_out (abfd
, inp
, extp
)
268 struct internal_syment
*in
= (struct internal_syment
*) inp
;
269 struct external_syment
*ext
= (struct external_syment
*) extp
;
271 H_PUT_32 (abfd
, in
->_n
._n_n
._n_offset
, ext
->e_offset
);
272 H_PUT_64 (abfd
, in
->n_value
, ext
->e_value
);
273 H_PUT_16 (abfd
, in
->n_scnum
, ext
->e_scnum
);
274 H_PUT_16 (abfd
, in
->n_type
, ext
->e_type
);
275 H_PUT_8 (abfd
, in
->n_sclass
, ext
->e_sclass
);
276 H_PUT_8 (abfd
, in
->n_numaux
, ext
->e_numaux
);
277 return bfd_coff_symesz (abfd
);
281 _bfd_xcoff64_swap_aux_in (abfd
, ext1
, type
, class, indx
, numaux
, in1
)
290 union external_auxent
*ext
= (union external_auxent
*) ext1
;
291 union internal_auxent
*in
= (union internal_auxent
*) in1
;
296 if (ext
->x_file
.x_n
.x_zeroes
== 0)
298 in
->x_file
.x_n
.x_zeroes
= 0;
299 in
->x_file
.x_n
.x_offset
= H_GET_32 (abfd
, ext
->x_file
.x_n
.x_offset
);
303 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
307 /* RS/6000 "csect" auxents */
310 if (indx
+ 1 == numaux
)
312 bfd_signed_vma h
= 0;
315 h
= H_GET_S32 (abfd
, ext
->x_csect
.x_scnlen_hi
);
316 l
= H_GET_32 (abfd
, ext
->x_csect
.x_scnlen_lo
);
318 in
->x_csect
.x_scnlen
.l
= h
<< 32 | (l
& 0xffffffff);
320 in
->x_csect
.x_parmhash
= H_GET_32 (abfd
, ext
->x_csect
.x_parmhash
);
321 in
->x_csect
.x_snhash
= H_GET_16 (abfd
, ext
->x_csect
.x_snhash
);
322 /* We don't have to hack bitfields in x_smtyp because it's
323 defined by shifts-and-ands, which are equivalent on all
325 in
->x_csect
.x_smtyp
= H_GET_8 (abfd
, ext
->x_csect
.x_smtyp
);
326 in
->x_csect
.x_smclas
= H_GET_8 (abfd
, ext
->x_csect
.x_smclas
);
336 /* PE defines some extra fields; we zero them out for
338 in
->x_scn
.x_checksum
= 0;
339 in
->x_scn
.x_associated
= 0;
340 in
->x_scn
.x_comdat
= 0;
347 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
349 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
350 = H_GET_64 (abfd
, ext
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
);
351 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
352 = H_GET_32 (abfd
, ext
->x_sym
.x_fcnary
.x_fcn
.x_endndx
);
356 in
->x_sym
.x_misc
.x_fsize
357 = H_GET_32 (abfd
, ext
->x_sym
.x_fcnary
.x_fcn
.x_fsize
);
361 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
362 = H_GET_32 (abfd
, ext
->x_sym
.x_fcnary
.x_lnsz
.x_lnno
);
363 in
->x_sym
.x_misc
.x_lnsz
.x_size
364 = H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_lnsz
.x_size
);
371 _bfd_xcoff64_swap_aux_out (abfd
, inp
, type
, class, indx
, numaux
, extp
)
376 int indx ATTRIBUTE_UNUSED
;
377 int numaux ATTRIBUTE_UNUSED
;
380 union internal_auxent
*in
= (union internal_auxent
*) inp
;
381 union external_auxent
*ext
= (union external_auxent
*) extp
;
383 memset ((PTR
) ext
, 0, bfd_coff_auxesz (abfd
));
387 if (ext
->x_file
.x_n
.x_zeroes
== 0)
389 H_PUT_32 (abfd
, 0, ext
->x_file
.x_n
.x_zeroes
);
390 H_PUT_32 (abfd
, in
->x_file
.x_n
.x_offset
, ext
->x_file
.x_n
.x_offset
);
394 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
396 H_PUT_8 (abfd
, _AUX_FILE
, ext
->x_auxtype
.x_auxtype
);
399 /* RS/6000 "csect" auxents */
402 if (indx
+ 1 == numaux
)
406 temp
= in
->x_csect
.x_scnlen
.l
& 0xffffffff;
407 H_PUT_32 (abfd
, temp
, ext
->x_csect
.x_scnlen_lo
);
408 temp
= in
->x_csect
.x_scnlen
.l
>> 32;
409 H_PUT_32 (abfd
, temp
, ext
->x_csect
.x_scnlen_hi
);
410 H_PUT_32 (abfd
, in
->x_csect
.x_parmhash
, ext
->x_csect
.x_parmhash
);
411 H_PUT_16 (abfd
, in
->x_csect
.x_snhash
, ext
->x_csect
.x_snhash
);
412 /* We don't have to hack bitfields in x_smtyp because it's
413 defined by shifts-and-ands, which are equivalent on all
415 H_PUT_8 (abfd
, in
->x_csect
.x_smtyp
, ext
->x_csect
.x_smtyp
);
416 H_PUT_8 (abfd
, in
->x_csect
.x_smclas
, ext
->x_csect
.x_smclas
);
417 H_PUT_8 (abfd
, _AUX_CSECT
, ext
->x_auxtype
.x_auxtype
);
432 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
434 H_PUT_64 (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
,
435 ext
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
);
436 H_PUT_8 (abfd
, _AUX_FCN
,
437 ext
->x_auxtype
.x_auxtype
);
438 H_PUT_32 (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
,
439 ext
->x_sym
.x_fcnary
.x_fcn
.x_endndx
);
443 H_PUT_32 (abfd
, in
->x_sym
.x_misc
.x_fsize
,
444 ext
->x_sym
.x_fcnary
.x_fcn
.x_fsize
);
448 H_PUT_32 (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
,
449 ext
->x_sym
.x_fcnary
.x_lnsz
.x_lnno
);
450 H_PUT_16 (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
,
451 ext
->x_sym
.x_fcnary
.x_lnsz
.x_size
);
456 return bfd_coff_auxesz (abfd
);
460 _bfd_xcoff64_put_symbol_name (abfd
, strtab
, sym
, name
)
462 struct bfd_strtab_hash
*strtab
;
463 struct internal_syment
*sym
;
471 if ((abfd
->flags
& BFD_TRADITIONAL_FORMAT
) != 0)
474 indx
= _bfd_stringtab_add (strtab
, name
, hash
, false);
476 if (indx
== (bfd_size_type
) -1)
479 sym
->_n
._n_n
._n_zeroes
= 0;
480 sym
->_n
._n_n
._n_offset
= STRING_SIZE_SIZE
+ indx
;
486 _bfd_xcoff64_put_ldsymbol_name (abfd
, ldinfo
, ldsym
, name
)
487 bfd
*abfd ATTRIBUTE_UNUSED
;
488 struct xcoff_loader_info
*ldinfo
;
489 struct internal_ldsym
*ldsym
;
495 if (ldinfo
->string_size
+ len
+ 3 > ldinfo
->string_alc
)
497 bfd_size_type newalc
;
498 bfd_byte
*newstrings
;
500 newalc
= ldinfo
->string_alc
* 2;
503 while (ldinfo
->string_size
+ len
+ 3 > newalc
)
506 newstrings
= ((bfd_byte
*)
507 bfd_realloc ((PTR
) ldinfo
->strings
, newalc
));
508 if (newstrings
== NULL
)
510 ldinfo
->failed
= true;
513 ldinfo
->string_alc
= newalc
;
514 ldinfo
->strings
= newstrings
;
517 bfd_put_16 (ldinfo
->output_bfd
, (bfd_vma
) (len
+ 1),
518 ldinfo
->strings
+ ldinfo
->string_size
);
519 strcpy (ldinfo
->strings
+ ldinfo
->string_size
+ 2, name
);
520 ldsym
->_l
._l_l
._l_zeroes
= 0;
521 ldsym
->_l
._l_l
._l_offset
= ldinfo
->string_size
+ 2;
522 ldinfo
->string_size
+= len
+ 3;
527 /* Routines to swap information in the XCOFF .loader section. If we
528 ever need to write an XCOFF loader, this stuff will need to be
529 moved to another file shared by the linker (which XCOFF calls the
530 ``binder'') and the loader. */
532 /* Swap in the ldhdr structure. */
535 xcoff64_swap_ldhdr_in (abfd
, s
, dst
)
538 struct internal_ldhdr
*dst
;
540 const struct external_ldhdr
*src
= (const struct external_ldhdr
*) s
;
542 dst
->l_version
= bfd_get_32 (abfd
, src
->l_version
);
543 dst
->l_nsyms
= bfd_get_32 (abfd
, src
->l_nsyms
);
544 dst
->l_nreloc
= bfd_get_32 (abfd
, src
->l_nreloc
);
545 dst
->l_istlen
= bfd_get_32 (abfd
, src
->l_istlen
);
546 dst
->l_nimpid
= bfd_get_32 (abfd
, src
->l_nimpid
);
547 dst
->l_stlen
= bfd_get_32 (abfd
, src
->l_stlen
);
548 dst
->l_impoff
= bfd_get_64 (abfd
, src
->l_impoff
);
549 dst
->l_stoff
= bfd_get_64 (abfd
, src
->l_stoff
);
550 dst
->l_symoff
= bfd_get_64 (abfd
, src
->l_symoff
);
551 dst
->l_rldoff
= bfd_get_64 (abfd
, src
->l_rldoff
);
554 /* Swap out the ldhdr structure. */
557 xcoff64_swap_ldhdr_out (abfd
, src
, d
)
559 const struct internal_ldhdr
*src
;
562 struct external_ldhdr
*dst
= (struct external_ldhdr
*) d
;
564 bfd_put_32 (abfd
, (bfd_vma
) src
->l_version
, dst
->l_version
);
565 bfd_put_32 (abfd
, src
->l_nsyms
, dst
->l_nsyms
);
566 bfd_put_32 (abfd
, src
->l_nreloc
, dst
->l_nreloc
);
567 bfd_put_32 (abfd
, src
->l_istlen
, dst
->l_istlen
);
568 bfd_put_32 (abfd
, src
->l_nimpid
, dst
->l_nimpid
);
569 bfd_put_32 (abfd
, src
->l_stlen
, dst
->l_stlen
);
570 bfd_put_64 (abfd
, src
->l_impoff
, dst
->l_impoff
);
571 bfd_put_64 (abfd
, src
->l_stoff
, dst
->l_stoff
);
572 bfd_put_64 (abfd
, src
->l_symoff
, dst
->l_symoff
);
573 bfd_put_64 (abfd
, src
->l_rldoff
, dst
->l_rldoff
);
576 /* Swap in the ldsym structure. */
579 xcoff64_swap_ldsym_in (abfd
, s
, dst
)
582 struct internal_ldsym
*dst
;
584 const struct external_ldsym
*src
= (const struct external_ldsym
*) s
;
585 /* XCOFF64 does not use l_zeroes like XCOFF32
586 Set the internal l_zeroes to 0 so the common 32/64 code uses l_value
587 as an offset into the loader symbol table. */
588 dst
->_l
._l_l
._l_zeroes
= 0;
589 dst
->_l
._l_l
._l_offset
= bfd_get_32 (abfd
, src
->l_offset
);
590 dst
->l_value
= bfd_get_64 (abfd
, src
->l_value
);
591 dst
->l_scnum
= bfd_get_16 (abfd
, src
->l_scnum
);
592 dst
->l_smtype
= bfd_get_8 (abfd
, src
->l_smtype
);
593 dst
->l_smclas
= bfd_get_8 (abfd
, src
->l_smclas
);
594 dst
->l_ifile
= bfd_get_32 (abfd
, src
->l_ifile
);
595 dst
->l_parm
= bfd_get_32 (abfd
, src
->l_parm
);
598 /* Swap out the ldsym structure. */
601 xcoff64_swap_ldsym_out (abfd
, src
, d
)
603 const struct internal_ldsym
*src
;
606 struct external_ldsym
*dst
= (struct external_ldsym
*) d
;
608 bfd_put_64 (abfd
, src
->l_value
, dst
->l_value
);
609 bfd_put_32 (abfd
, (bfd_vma
) src
->_l
._l_l
._l_offset
, dst
->l_offset
);
610 bfd_put_16 (abfd
, (bfd_vma
) src
->l_scnum
, dst
->l_scnum
);
611 bfd_put_8 (abfd
, src
->l_smtype
, dst
->l_smtype
);
612 bfd_put_8 (abfd
, src
->l_smclas
, dst
->l_smclas
);
613 bfd_put_32 (abfd
, src
->l_ifile
, dst
->l_ifile
);
614 bfd_put_32 (abfd
, src
->l_parm
, dst
->l_parm
);
617 /* Swap in the ldrel structure. */
620 xcoff64_swap_ldrel_in (abfd
, s
, dst
)
623 struct internal_ldrel
*dst
;
625 const struct external_ldrel
*src
= (const struct external_ldrel
*) s
;
627 dst
->l_vaddr
= bfd_get_64 (abfd
, src
->l_vaddr
);
628 dst
->l_symndx
= bfd_get_32 (abfd
, src
->l_symndx
);
629 dst
->l_rtype
= bfd_get_16 (abfd
, src
->l_rtype
);
630 dst
->l_rsecnm
= bfd_get_16 (abfd
, src
->l_rsecnm
);
633 /* Swap out the ldrel structure. */
636 xcoff64_swap_ldrel_out (abfd
, src
, d
)
638 const struct internal_ldrel
*src
;
641 struct external_ldrel
*dst
= (struct external_ldrel
*) d
;
643 bfd_put_64 (abfd
, src
->l_vaddr
, dst
->l_vaddr
);
644 bfd_put_16 (abfd
, (bfd_vma
) src
->l_rtype
, dst
->l_rtype
);
645 bfd_put_16 (abfd
, (bfd_vma
) src
->l_rsecnm
, dst
->l_rsecnm
);
646 bfd_put_32 (abfd
, src
->l_symndx
, dst
->l_symndx
);
650 xcoff64_write_object_contents (abfd
)
654 boolean hasrelocs
= false;
655 boolean haslinno
= false;
658 file_ptr lineno_base
;
660 unsigned long reloc_size
= 0;
661 unsigned long lnno_size
= 0;
662 boolean long_section_names
;
663 asection
*text_sec
= ((void *) 0);
664 asection
*data_sec
= ((void *) 0);
665 asection
*bss_sec
= ((void *) 0);
666 struct internal_filehdr internal_f
;
667 struct internal_aouthdr internal_a
;
669 bfd_set_error (bfd_error_system_call
);
671 if (abfd
->output_has_begun
== false)
673 if (! bfd_coff_compute_section_file_positions (abfd
))
677 /* Work out the size of the reloc and linno areas. */
678 reloc_base
= obj_relocbase (abfd
);
680 for (current
= abfd
->sections
; current
!= NULL
; current
= current
->next
)
681 reloc_size
+= current
->reloc_count
* bfd_coff_relsz (abfd
);
683 lineno_base
= reloc_base
+ reloc_size
;
685 /* Make a pass through the symbol table to count line number entries and
686 put them into the correct asections. */
687 lnno_size
= coff_count_linenumbers (abfd
) * bfd_coff_linesz (abfd
);
689 sym_base
= lineno_base
+ lnno_size
;
691 /* Indicate in each section->line_filepos its actual file address. */
692 for (current
= abfd
->sections
; current
!= NULL
; current
= current
->next
)
694 if (current
->lineno_count
)
696 current
->line_filepos
= lineno_base
;
697 current
->moving_line_filepos
= lineno_base
;
698 lineno_base
+= current
->lineno_count
* bfd_coff_linesz (abfd
);
702 current
->line_filepos
= 0;
705 if (current
->reloc_count
)
707 current
->rel_filepos
= reloc_base
;
708 reloc_base
+= current
->reloc_count
* bfd_coff_relsz (abfd
);
712 current
->rel_filepos
= 0;
716 if ((abfd
->flags
& EXEC_P
) != 0)
718 scn_base
= bfd_coff_filhsz (abfd
) + bfd_coff_aoutsz (abfd
);
719 internal_f
.f_opthdr
= bfd_coff_aoutsz (abfd
);
723 scn_base
= bfd_coff_filhsz (abfd
);
724 internal_f
.f_opthdr
= 0;
727 internal_f
.f_nscns
= 0;
729 if (bfd_seek (abfd
, scn_base
, SEEK_SET
) != 0)
732 long_section_names
= false;
733 for (current
= abfd
->sections
; current
!= NULL
; current
= current
->next
)
735 struct internal_scnhdr section
;
736 struct external_scnhdr buff
;
737 bfd_size_type amount
;
739 internal_f
.f_nscns
++;
741 strncpy (section
.s_name
, current
->name
, SCNNMLEN
);
743 section
.s_vaddr
= current
->vma
;
744 section
.s_paddr
= current
->lma
;
745 section
.s_size
= current
->_raw_size
;
747 /* If this section has no size or is unloadable then the scnptr
749 if (current
->_raw_size
== 0
750 || (current
->flags
& (SEC_LOAD
| SEC_HAS_CONTENTS
)) == 0)
752 section
.s_scnptr
= 0;
756 section
.s_scnptr
= current
->filepos
;
759 section
.s_relptr
= current
->rel_filepos
;
760 section
.s_lnnoptr
= current
->line_filepos
;
761 section
.s_nreloc
= current
->reloc_count
;
763 section
.s_nlnno
= current
->lineno_count
;
764 if (current
->reloc_count
!= 0)
766 if (current
->lineno_count
!= 0)
769 section
.s_flags
= sec_to_styp_flags (current
->name
, current
->flags
);
771 if (!strcmp (current
->name
, _TEXT
))
775 else if (!strcmp (current
->name
, _DATA
))
779 else if (!strcmp (current
->name
, _BSS
))
784 amount
= bfd_coff_scnhsz (abfd
);
785 if (bfd_coff_swap_scnhdr_out (abfd
, §ion
, &buff
) == 0
786 || bfd_bwrite ((PTR
) (&buff
), amount
, abfd
) != amount
)
790 internal_f
.f_timdat
= 0;
792 internal_f
.f_flags
= 0;
795 internal_f
.f_flags
|= F_RELFLG
;
797 internal_f
.f_flags
|= F_LNNO
;
798 if (abfd
->flags
& EXEC_P
)
799 internal_f
.f_flags
|= F_EXEC
;
801 /* FIXME: this is wrong for PPC_PE! */
802 if (bfd_little_endian (abfd
))
803 internal_f
.f_flags
|= F_AR32WR
;
805 internal_f
.f_flags
|= F_AR32W
;
807 if ((abfd
->flags
& DYNAMIC
) != 0)
808 internal_f
.f_flags
|= F_SHROBJ
;
809 if (bfd_get_section_by_name (abfd
, _LOADER
) != NULL
)
810 internal_f
.f_flags
|= F_DYNLOAD
;
812 memset (&internal_a
, 0, sizeof internal_a
);
814 internal_f
.f_magic
= bfd_xcoff_magic_number (abfd
);
815 internal_a
.magic
= (abfd
->flags
& D_PAGED
) ? RS6K_AOUTHDR_ZMAGIC
:
816 (abfd
->flags
& WP_TEXT
) ? RS6K_AOUTHDR_NMAGIC
:
819 /* FIXME: Does anybody ever set this to another value? */
820 internal_a
.vstamp
= 0;
822 /* Now should write relocs, strings, syms. */
823 obj_sym_filepos (abfd
) = sym_base
;
825 internal_f
.f_symptr
= 0;
826 internal_f
.f_nsyms
= 0;
828 /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
829 backend linker, and obj_raw_syment_count is not valid until after
830 coff_write_symbols is called. */
831 if (bfd_get_symcount (abfd
) != 0)
835 if (!coff_renumber_symbols (abfd
, &firstundef
))
837 coff_mangle_symbols (abfd
);
838 if (! coff_write_symbols (abfd
))
840 if (! coff_write_linenumbers (abfd
))
842 if (! coff_write_relocs (abfd
, firstundef
))
845 internal_f
.f_symptr
= sym_base
;
846 internal_f
.f_nsyms
= bfd_get_symcount (abfd
);
848 else if (obj_raw_syment_count (abfd
) != 0)
850 internal_f
.f_symptr
= sym_base
;
852 /* AIX appears to require that F_RELFLG not be set if there are
853 local symbols but no relocations. */
854 internal_f
.f_flags
&=~ F_RELFLG
;
858 internal_f
.f_flags
|= F_LSYMS
;
863 internal_a
.tsize
= bfd_get_section_size_before_reloc (text_sec
);
864 internal_a
.text_start
= internal_a
.tsize
? text_sec
->vma
: 0;
869 internal_a
.dsize
= bfd_get_section_size_before_reloc (data_sec
);
870 internal_a
.data_start
= internal_a
.dsize
? data_sec
->vma
: 0;
875 internal_a
.bsize
= bfd_get_section_size_before_reloc (bss_sec
);
876 if (internal_a
.bsize
&& bss_sec
->vma
< internal_a
.data_start
)
877 internal_a
.data_start
= bss_sec
->vma
;
880 internal_a
.entry
= bfd_get_start_address (abfd
);
881 internal_f
.f_nsyms
= obj_raw_syment_count (abfd
);
883 if (xcoff_data (abfd
)->full_aouthdr
)
886 asection
*loader_sec
;
888 internal_a
.vstamp
= 1;
890 internal_a
.o_snentry
= xcoff_data (abfd
)->snentry
;
891 if (internal_a
.o_snentry
== 0)
892 internal_a
.entry
= (bfd_vma
) -1;
894 if (text_sec
!= NULL
)
896 internal_a
.o_sntext
= text_sec
->target_index
;
897 internal_a
.o_algntext
= bfd_get_section_alignment (abfd
, text_sec
);
901 internal_a
.o_sntext
= 0;
902 internal_a
.o_algntext
= 0;
905 if (data_sec
!= NULL
)
907 internal_a
.o_sndata
= data_sec
->target_index
;
908 internal_a
.o_algndata
= bfd_get_section_alignment (abfd
, data_sec
);
912 internal_a
.o_sndata
= 0;
913 internal_a
.o_algndata
= 0;
916 loader_sec
= bfd_get_section_by_name (abfd
, ".loader");
917 if (loader_sec
!= NULL
)
918 internal_a
.o_snloader
= loader_sec
->target_index
;
920 internal_a
.o_snloader
= 0;
922 internal_a
.o_snbss
= bss_sec
->target_index
;
924 internal_a
.o_snbss
= 0;
926 toc
= xcoff_data (abfd
)->toc
;
927 internal_a
.o_toc
= toc
;
928 internal_a
.o_sntoc
= xcoff_data (abfd
)->sntoc
;
930 internal_a
.o_modtype
= xcoff_data (abfd
)->modtype
;
931 if (xcoff_data (abfd
)->cputype
!= -1)
932 internal_a
.o_cputype
= xcoff_data (abfd
)->cputype
;
935 switch (bfd_get_arch (abfd
))
937 case bfd_arch_rs6000
:
938 internal_a
.o_cputype
= 4;
940 case bfd_arch_powerpc
:
941 if (bfd_get_mach (abfd
) == 0)
942 internal_a
.o_cputype
= 3;
944 internal_a
.o_cputype
= 1;
950 internal_a
.o_maxstack
= xcoff_data (abfd
)->maxstack
;
951 internal_a
.o_maxdata
= xcoff_data (abfd
)->maxdata
;
954 if (bfd_seek (abfd
, (file_ptr
) 0, 0) != 0)
959 bfd_size_type amount
= bfd_coff_filhsz (abfd
);
961 buff
= bfd_malloc (amount
);
965 bfd_coff_swap_filehdr_out (abfd
, (PTR
) &internal_f
, (PTR
) buff
);
966 amount
= bfd_bwrite ((PTR
) buff
, amount
, abfd
);
970 if (amount
!= bfd_coff_filhsz (abfd
))
974 if (abfd
->flags
& EXEC_P
)
977 bfd_size_type amount
= bfd_coff_aoutsz (abfd
);
979 buff
= bfd_malloc (amount
);
983 bfd_coff_swap_aouthdr_out (abfd
, (PTR
) & internal_a
, (PTR
) buff
);
984 amount
= bfd_bwrite ((PTR
) buff
, amount
, abfd
);
988 if (amount
!= bfd_coff_aoutsz (abfd
))
995 /* This is the relocation function for the RS/6000/POWER/PowerPC.
996 This is currently the only processor which uses XCOFF; I hope that
997 will never change. */
1000 xcoff64_ppc_relocate_section (output_bfd
, info
, input_bfd
,
1001 input_section
, contents
, relocs
, syms
,
1004 struct bfd_link_info
*info
;
1006 asection
*input_section
;
1008 struct internal_reloc
*relocs
;
1009 struct internal_syment
*syms
;
1010 asection
**sections
;
1012 struct internal_reloc
*rel
;
1013 struct internal_reloc
*relend
;
1016 relend
= rel
+ input_section
->reloc_count
;
1017 for (; rel
< relend
; rel
++)
1020 struct xcoff_link_hash_entry
*h
;
1021 struct internal_syment
*sym
;
1024 struct reloc_howto_struct howto
;
1025 bfd_reloc_status_type rstat
;
1027 /* Relocation type R_REF is a special relocation type which is
1028 merely used to prevent garbage collection from occurring for
1029 the csect including the symbol which it references. */
1030 if (rel
->r_type
== R_REF
)
1033 symndx
= rel
->r_symndx
;
1043 h
= obj_xcoff_sym_hashes (input_bfd
)[symndx
];
1044 sym
= syms
+ symndx
;
1045 addend
= - sym
->n_value
;
1048 /* We build the howto information on the fly. */
1050 howto
.type
= rel
->r_type
;
1051 howto
.rightshift
= 0;
1053 howto
.bitsize
= (rel
->r_size
& 0x3f) + 1;
1054 howto
.pc_relative
= false;
1056 if ((rel
->r_size
& 0x80) != 0)
1057 howto
.complain_on_overflow
= complain_overflow_signed
;
1059 howto
.complain_on_overflow
= complain_overflow_bitfield
;
1060 howto
.special_function
= NULL
;
1061 howto
.name
= "internal";
1062 howto
.partial_inplace
= true;
1064 if (howto
.bitsize
== 64)
1066 howto
.src_mask
= howto
.dst_mask
= MINUS_ONE
;
1068 else if (howto
.bitsize
== 32)
1070 howto
.src_mask
= howto
.dst_mask
= 0xffffffff;
1074 howto
.src_mask
= howto
.dst_mask
= (1 << howto
.bitsize
) - 1;
1075 if (howto
.bitsize
== 16)
1078 howto
.pcrel_offset
= false;
1088 sec
= bfd_abs_section_ptr
;
1093 sec
= sections
[symndx
];
1094 /* Hack to make sure we use the right TOC anchor value
1095 if this reloc is against the TOC anchor. */
1096 if (sec
->name
[3] == '0'
1097 && strcmp (sec
->name
, ".tc0") == 0)
1098 val
= xcoff_data (output_bfd
)->toc
;
1100 val
= (sec
->output_section
->vma
1101 + sec
->output_offset
1110 if (h
->root
.type
== bfd_link_hash_defined
1111 || h
->root
.type
== bfd_link_hash_defweak
)
1115 sec
= h
->root
.u
.def
.section
;
1116 val
= (h
->root
.u
.def
.value
1117 + sec
->output_section
->vma
1118 + sec
->output_offset
);
1121 else if (h
->root
.type
== bfd_link_hash_common
)
1125 sec
= h
->root
.u
.c
.p
->section
;
1126 val
= (sec
->output_section
->vma
1127 + sec
->output_offset
);
1129 else if ((h
->flags
& XCOFF_DEF_DYNAMIC
) != 0
1130 || (h
->flags
& XCOFF_IMPORT
) != 0)
1132 /* Every symbol in a shared object is defined somewhere. */
1135 else if (! info
->relocateable
)
1137 if (! ((*info
->callbacks
->undefined_symbol
)
1138 (info
, h
->root
.root
.string
, input_bfd
, input_section
,
1139 rel
->r_vaddr
- input_section
->vma
, true)))
1142 /* Don't try to process the reloc. It can't help, and
1143 it may generate another error. */
1148 /* I took the relocation type definitions from two documents:
1149 the PowerPC AIX Version 4 Application Binary Interface, First
1150 Edition (April 1992), and the PowerOpen ABI, Big-Endian
1151 32-Bit Hardware Implementation (June 30, 1994). Differences
1152 between the documents are noted below. */
1154 switch (rel
->r_type
)
1159 /* These relocs are defined by the PowerPC ABI to be
1160 relative branches which use half of the difference
1161 between the symbol and the program counter. I can't
1162 quite figure out when this is useful. These relocs are
1163 not defined by the PowerOpen ABI. */
1165 (*_bfd_error_handler
)
1166 (_("%s: unsupported relocation type 0x%02x"),
1167 bfd_archive_filename (input_bfd
), (unsigned int) rel
->r_type
);
1168 bfd_set_error (bfd_error_bad_value
);
1171 /* Simple positive relocation. */
1174 /* Simple negative relocation. */
1178 /* Simple PC relative relocation. */
1179 howto
.pc_relative
= true;
1182 /* TOC relative relocation. The value in the instruction in
1183 the input file is the offset from the input file TOC to
1184 the desired location. We want the offset from the final
1185 TOC to the desired location. We have:
1190 so we must change insn by on - in.
1193 /* Global linkage relocation. The value of this relocation
1194 is the address of the entry in the TOC section. */
1196 /* Local object TOC address. I can't figure out the
1197 difference between this and case R_GL. */
1199 /* TOC relative relocation. A TOC relative load instruction
1200 which may be changed to a load address instruction.
1201 FIXME: We don't currently implement this optimization. */
1203 /* TOC relative relocation. This is a TOC relative load
1204 address instruction which may be changed to a load
1205 instruction. FIXME: I don't know if this is the correct
1207 if (h
!= NULL
&& h
->smclas
!= XMC_TD
)
1209 if (h
->toc_section
== NULL
)
1211 (*_bfd_error_handler
)
1212 (_("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry"),
1213 bfd_archive_filename (input_bfd
), rel
->r_vaddr
,
1214 h
->root
.root
.string
);
1215 bfd_set_error (bfd_error_bad_value
);
1219 BFD_ASSERT ((h
->flags
& XCOFF_SET_TOC
) == 0);
1220 val
= (h
->toc_section
->output_section
->vma
1221 + h
->toc_section
->output_offset
);
1224 val
= ((val
- xcoff_data (output_bfd
)->toc
)
1225 - (sym
->n_value
- xcoff_data (input_bfd
)->toc
));
1230 /* Absolute branch. We don't want to mess with the lower
1231 two bits of the instruction. */
1233 /* The PowerPC ABI defines this as an absolute call which
1234 may be modified to become a relative call. The PowerOpen
1235 ABI does not define this relocation type. */
1237 /* Absolute branch which may be modified to become a
1240 /* The PowerPC ABI defines this as an absolute branch to a
1241 fixed address which may be modified to an absolute branch
1242 to a symbol. The PowerOpen ABI does not define this
1245 /* The PowerPC ABI defines this as an absolute branch to a
1246 fixed address which may be modified to a relative branch.
1247 The PowerOpen ABI does not define this relocation type. */
1248 howto
.src_mask
&= ~3;
1249 howto
.dst_mask
= howto
.src_mask
;
1252 /* Relative branch. We don't want to mess with the lower
1253 two bits of the instruction. */
1255 /* The PowerPC ABI defines this as a relative call which may
1256 be modified to become an absolute call. The PowerOpen
1257 ABI does not define this relocation type. */
1259 /* A relative branch which may be modified to become an
1260 absolute branch. FIXME: We don't implement this,
1261 although we should for symbols of storage mapping class
1263 howto
.pc_relative
= true;
1264 howto
.src_mask
&= ~3;
1265 howto
.dst_mask
= howto
.src_mask
;
1267 howto
.complain_on_overflow
= complain_overflow_bitfield
;
1270 /* The PowerPC AIX ABI describes this as a load which may be
1271 changed to a load address. The PowerOpen ABI says this
1272 is the same as case R_POS. */
1275 /* The PowerPC AIX ABI describes this as a load address
1276 which may be changed to a load. The PowerOpen ABI says
1277 this is the same as R_POS. */
1281 /* If we see an R_BR or R_RBR reloc which is jumping to global
1282 linkage code, and it is followed by an appropriate cror nop
1283 instruction, we replace the cror with ld r2,40(r1). This
1284 restores the TOC after the glink code. Contrariwise, if the
1285 call is followed by a ld r2,40(r1), but the call is not
1286 going to global linkage code, we can replace the load with a
1288 if ((rel
->r_type
== R_BR
|| rel
->r_type
== R_RBR
)
1290 && h
->root
.type
== bfd_link_hash_defined
1291 && (rel
->r_vaddr
- input_section
->vma
+ 8
1292 <= input_section
->_cooked_size
))
1297 pnext
= contents
+ (rel
->r_vaddr
- input_section
->vma
) + 4;
1298 next
= bfd_get_32 (input_bfd
, pnext
);
1301 /* The _ptrgl function is magic. It is used by the AIX
1302 * compiler to call a function through a pointer.
1304 * special case XMC_GL, global linkage
1306 if (h
->smclas
== XMC_GL
1307 || strcmp (h
->root
.root
.string
, "._ptrgl") == 0)
1309 if (next
== 0x4def7b82 /* cror 15,15,15 */
1310 || next
== 0x4ffffb82 /* cror 31,31,31 */
1311 || next
== 0x60000000 /* ori r0,r0,0 */)
1312 bfd_put_32 (input_bfd
, (bfd_vma
) 0xe8410028 /* ld r2,40(r1) */,
1317 if (next
== 0xe8410028 /* ld r2,40(r1) */)
1318 bfd_put_32 (input_bfd
, (bfd_vma
) 0x60000000 /* ori r0,r0,0 */,
1323 /* A PC relative reloc includes the section address. */
1324 if (howto
.pc_relative
)
1325 addend
+= input_section
->vma
;
1327 rstat
= _bfd_final_link_relocate (&howto
, input_bfd
, input_section
,
1329 rel
->r_vaddr
- input_section
->vma
,
1338 case bfd_reloc_overflow
:
1341 char buf
[SYMNMLEN
+ 1];
1342 char howto_name
[10];
1347 name
= h
->root
.root
.string
;
1350 name
= _bfd_coff_internal_syment_name (input_bfd
, sym
, buf
);
1354 sprintf (howto_name
, "0x%02x", rel
->r_type
);
1356 if (! ((*info
->callbacks
->reloc_overflow
)
1357 (info
, name
, howto_name
, (bfd_vma
) 0, input_bfd
,
1358 input_section
, rel
->r_vaddr
- input_section
->vma
)))
1368 /* The XCOFF reloc table. Actually, XCOFF relocations specify the
1369 bitsize and whether they are signed or not, along with a
1370 conventional type. This table is for the types, which are used for
1371 different algorithms for putting in the reloc. Many of these
1372 relocs need special_function entries, which I have not written. */
1374 reloc_howto_type xcoff64_howto_table
[] =
1376 /* Standard 64 bit relocation. */
1377 HOWTO (R_POS
, /* type */
1379 4, /* size (0 = byte, 1 = short, 2 = long) */
1381 false, /* pc_relative */
1383 complain_overflow_bitfield
, /* complain_on_overflow */
1384 0, /* special_function */
1386 true, /* partial_inplace */
1387 MINUS_ONE
, /* src_mask */
1388 MINUS_ONE
, /* dst_mask */
1389 false), /* pcrel_offset */
1391 /* 64 bit relocation, but store negative value. */
1392 HOWTO (R_NEG
, /* type */
1394 -4, /* size (0 = byte, 1 = short, 2 = long) */
1396 false, /* pc_relative */
1398 complain_overflow_bitfield
, /* complain_on_overflow */
1399 0, /* special_function */
1401 true, /* partial_inplace */
1402 MINUS_ONE
, /* src_mask */
1403 MINUS_ONE
, /* dst_mask */
1404 false), /* pcrel_offset */
1406 /* 32 bit PC relative relocation. */
1407 HOWTO (R_REL
, /* type */
1409 2, /* size (0 = byte, 1 = short, 2 = long) */
1411 true, /* pc_relative */
1413 complain_overflow_signed
, /* complain_on_overflow */
1414 0, /* special_function */
1416 true, /* partial_inplace */
1417 0xffffffff, /* src_mask */
1418 0xffffffff, /* dst_mask */
1419 false), /* pcrel_offset */
1421 /* 16 bit TOC relative relocation. */
1422 HOWTO (R_TOC
, /* type */
1424 1, /* size (0 = byte, 1 = short, 2 = long) */
1426 false, /* pc_relative */
1428 complain_overflow_bitfield
, /* complain_on_overflow */
1429 0, /* special_function */
1431 true, /* partial_inplace */
1432 0xffff, /* src_mask */
1433 0xffff, /* dst_mask */
1434 false), /* pcrel_offset */
1436 /* I don't really know what this is. */
1437 HOWTO (R_RTB
, /* type */
1439 2, /* size (0 = byte, 1 = short, 2 = long) */
1441 false, /* pc_relative */
1443 complain_overflow_bitfield
, /* complain_on_overflow */
1444 0, /* special_function */
1446 true, /* partial_inplace */
1447 0xffffffff, /* src_mask */
1448 0xffffffff, /* dst_mask */
1449 false), /* pcrel_offset */
1451 /* External TOC relative symbol. */
1452 HOWTO (R_GL
, /* type */
1454 2, /* size (0 = byte, 1 = short, 2 = long) */
1456 false, /* pc_relative */
1458 complain_overflow_bitfield
, /* complain_on_overflow */
1459 0, /* special_function */
1461 true, /* partial_inplace */
1462 0xffff, /* src_mask */
1463 0xffff, /* dst_mask */
1464 false), /* pcrel_offset */
1466 /* Local TOC relative symbol. */
1467 HOWTO (R_TCL
, /* type */
1469 2, /* size (0 = byte, 1 = short, 2 = long) */
1471 false, /* pc_relative */
1473 complain_overflow_bitfield
, /* complain_on_overflow */
1474 0, /* special_function */
1476 true, /* partial_inplace */
1477 0xffff, /* src_mask */
1478 0xffff, /* dst_mask */
1479 false), /* pcrel_offset */
1483 /* Non modifiable absolute branch. */
1484 HOWTO (R_BA
, /* type */
1486 2, /* size (0 = byte, 1 = short, 2 = long) */
1488 false, /* pc_relative */
1490 complain_overflow_bitfield
, /* complain_on_overflow */
1491 0, /* special_function */
1493 true, /* partial_inplace */
1494 0x3fffffc, /* src_mask */
1495 0x3fffffc, /* dst_mask */
1496 false), /* pcrel_offset */
1500 /* Non modifiable relative branch. */
1501 HOWTO (R_BR
, /* type */
1503 2, /* size (0 = byte, 1 = short, 2 = long) */
1505 true, /* pc_relative */
1507 complain_overflow_signed
, /* complain_on_overflow */
1508 0, /* special_function */
1510 true, /* partial_inplace */
1511 0x3fffffc, /* src_mask */
1512 0x3fffffc, /* dst_mask */
1513 false), /* pcrel_offset */
1517 /* Indirect load. */
1518 HOWTO (R_RL
, /* type */
1520 2, /* size (0 = byte, 1 = short, 2 = long) */
1522 false, /* pc_relative */
1524 complain_overflow_bitfield
, /* complain_on_overflow */
1525 0, /* special_function */
1527 true, /* partial_inplace */
1528 0xffff, /* src_mask */
1529 0xffff, /* dst_mask */
1530 false), /* pcrel_offset */
1533 HOWTO (R_RLA
, /* type */
1535 2, /* size (0 = byte, 1 = short, 2 = long) */
1537 false, /* pc_relative */
1539 complain_overflow_bitfield
, /* complain_on_overflow */
1540 0, /* special_function */
1542 true, /* partial_inplace */
1543 0xffff, /* src_mask */
1544 0xffff, /* dst_mask */
1545 false), /* pcrel_offset */
1549 /* Non-relocating reference. */
1550 HOWTO (R_REF
, /* type */
1552 2, /* size (0 = byte, 1 = short, 2 = long) */
1554 false, /* pc_relative */
1556 complain_overflow_bitfield
, /* complain_on_overflow */
1557 0, /* special_function */
1559 false, /* partial_inplace */
1562 false), /* pcrel_offset */
1567 /* TOC relative indirect load. */
1568 HOWTO (R_TRL
, /* type */
1570 2, /* size (0 = byte, 1 = short, 2 = long) */
1572 false, /* pc_relative */
1574 complain_overflow_bitfield
, /* complain_on_overflow */
1575 0, /* special_function */
1577 true, /* partial_inplace */
1578 0xffff, /* src_mask */
1579 0xffff, /* dst_mask */
1580 false), /* pcrel_offset */
1582 /* TOC relative load address. */
1583 HOWTO (R_TRLA
, /* type */
1585 2, /* size (0 = byte, 1 = short, 2 = long) */
1587 false, /* pc_relative */
1589 complain_overflow_bitfield
, /* complain_on_overflow */
1590 0, /* special_function */
1591 "R_TRLA", /* name */
1592 true, /* partial_inplace */
1593 0xffff, /* src_mask */
1594 0xffff, /* dst_mask */
1595 false), /* pcrel_offset */
1597 /* Modifiable relative branch. */
1598 HOWTO (R_RRTBI
, /* type */
1600 2, /* size (0 = byte, 1 = short, 2 = long) */
1602 false, /* pc_relative */
1604 complain_overflow_bitfield
, /* complain_on_overflow */
1605 0, /* special_function */
1606 "R_RRTBI", /* name */
1607 true, /* partial_inplace */
1608 0xffffffff, /* src_mask */
1609 0xffffffff, /* dst_mask */
1610 false), /* pcrel_offset */
1612 /* Modifiable absolute branch. */
1613 HOWTO (R_RRTBA
, /* type */
1615 2, /* size (0 = byte, 1 = short, 2 = long) */
1617 false, /* pc_relative */
1619 complain_overflow_bitfield
, /* complain_on_overflow */
1620 0, /* special_function */
1621 "R_RRTBA", /* name */
1622 true, /* partial_inplace */
1623 0xffffffff, /* src_mask */
1624 0xffffffff, /* dst_mask */
1625 false), /* pcrel_offset */
1627 /* Modifiable call absolute indirect. */
1628 HOWTO (R_CAI
, /* type */
1630 2, /* size (0 = byte, 1 = short, 2 = long) */
1632 false, /* pc_relative */
1634 complain_overflow_bitfield
, /* complain_on_overflow */
1635 0, /* special_function */
1637 true, /* partial_inplace */
1638 0xffff, /* src_mask */
1639 0xffff, /* dst_mask */
1640 false), /* pcrel_offset */
1642 /* Modifiable call relative. */
1643 HOWTO (R_CREL
, /* type */
1645 2, /* size (0 = byte, 1 = short, 2 = long) */
1647 false, /* pc_relative */
1649 complain_overflow_bitfield
, /* complain_on_overflow */
1650 0, /* special_function */
1651 "R_CREL", /* name */
1652 true, /* partial_inplace */
1653 0xffff, /* src_mask */
1654 0xffff, /* dst_mask */
1655 false), /* pcrel_offset */
1657 /* Modifiable branch absolute. */
1658 HOWTO (R_RBA
, /* type */
1660 2, /* size (0 = byte, 1 = short, 2 = long) */
1662 false, /* pc_relative */
1664 complain_overflow_bitfield
, /* complain_on_overflow */
1665 0, /* special_function */
1667 true, /* partial_inplace */
1668 0xffff, /* src_mask */
1669 0xffff, /* dst_mask */
1670 false), /* pcrel_offset */
1672 /* Modifiable branch absolute. */
1673 HOWTO (R_RBAC
, /* type */
1675 2, /* size (0 = byte, 1 = short, 2 = long) */
1677 false, /* pc_relative */
1679 complain_overflow_bitfield
, /* complain_on_overflow */
1680 0, /* special_function */
1681 "R_RBAC", /* name */
1682 true, /* partial_inplace */
1683 0xffff, /* src_mask */
1684 0xffff, /* dst_mask */
1685 false), /* pcrel_offset */
1687 /* Modifiable branch relative. */
1688 HOWTO (R_RBR
, /* type */
1690 2, /* size (0 = byte, 1 = short, 2 = long) */
1692 false, /* pc_relative */
1694 complain_overflow_signed
, /* complain_on_overflow */
1695 0, /* special_function */
1697 true, /* partial_inplace */
1698 0xffff, /* src_mask */
1699 0xffff, /* dst_mask */
1700 false), /* pcrel_offset */
1702 /* Modifiable branch absolute. */
1703 HOWTO (R_RBRC
, /* type */
1705 2, /* size (0 = byte, 1 = short, 2 = long) */
1707 false, /* pc_relative */
1709 complain_overflow_bitfield
, /* complain_on_overflow */
1710 0, /* special_function */
1711 "R_RBRC", /* name */
1712 true, /* partial_inplace */
1713 0xffff, /* src_mask */
1714 0xffff, /* dst_mask */
1715 false), /* pcrel_offset */
1717 HOWTO (R_POS
, /* type */
1719 4, /* size (0 = byte, 1 = short, 2 = long) */
1721 false, /* pc_relative */
1723 complain_overflow_bitfield
, /* complain_on_overflow */
1724 0, /* special_function */
1726 true, /* partial_inplace */
1727 MINUS_ONE
, /* src_mask */
1728 MINUS_ONE
, /* dst_mask */
1729 false), /* pcrel_offset */
1731 /* 16 bit Non modifiable absolute branch. */
1732 HOWTO (R_BA
, /* type */
1734 2, /* size (0 = byte, 1 = short, 2 = long) */
1736 false, /* pc_relative */
1738 complain_overflow_bitfield
, /* complain_on_overflow */
1739 0, /* special_function */
1741 true, /* partial_inplace */
1742 0xfffc, /* src_mask */
1743 0xfffc, /* dst_mask */
1744 false), /* pcrel_offset */
1748 xcoff64_rtype2howto (relent
, internal
)
1750 struct internal_reloc
*internal
;
1752 relent
->howto
= xcoff64_howto_table
+ internal
->r_type
;
1754 /* Check for relocs we don't know of. */
1755 if (internal
->r_type
1756 >= sizeof (xcoff64_howto_table
) / sizeof (xcoff64_howto_table
[0]))
1758 if (internal
->r_type
!= relent
->howto
->type
)
1761 /* The r_size field of an XCOFF reloc encodes the bitsize of the
1762 relocation, as well as indicating whether it is signed or not.
1763 Doublecheck that the relocation information gathered from the
1764 type matches this information. The bitsize is not significant
1765 for R_REF relocs. */
1766 if (relent
->howto
->dst_mask
!= 0
1767 && (relent
->howto
->bitsize
1768 != ((unsigned int) internal
->r_size
& 0x3f) + 1))
1771 if ((internal
->r_size
& 0x80) != 0
1772 ? (relent
->howto
->complain_on_overflow
!= complain_overflow_signed
)
1773 : (relent
->howto
->complain_on_overflow
!= complain_overflow_bitfield
))
1779 xcoff64_reloc_type_lookup (abfd
, code
)
1780 bfd
*abfd ATTRIBUTE_UNUSED
;
1781 bfd_reloc_code_real_type code
;
1785 case BFD_RELOC_PPC_B26
:
1786 return &xcoff64_howto_table
[0xa];
1787 case BFD_RELOC_PPC_BA16
:
1788 return &xcoff64_howto_table
[0x1d];
1789 case BFD_RELOC_PPC_BA26
:
1790 return &xcoff64_howto_table
[8];
1791 case BFD_RELOC_PPC_TOC16
:
1792 return &xcoff64_howto_table
[3];
1794 case BFD_RELOC_CTOR
:
1795 return &xcoff64_howto_table
[0];
1797 return &xcoff64_howto_table
[0x1c];
1803 /* Read in the armap of an XCOFF archive. */
1806 xcoff64_slurp_armap (abfd
)
1811 bfd_size_type sz
, amt
;
1812 bfd_byte
*contents
, *cend
;
1818 /* This is for the new format. */
1819 struct xcoff_ar_hdr_big hdr
;
1821 if (xcoff_ardata (abfd
) == NULL
)
1823 bfd_has_map (abfd
) = false;
1827 off
= strtol (xcoff_ardata_big (abfd
)->symoff64
, (char **) NULL
, 10);
1830 bfd_has_map (abfd
) = false;
1834 if (bfd_seek (abfd
, off
, SEEK_SET
) != 0)
1837 /* The symbol table starts with a normal archive header. */
1838 if (bfd_bread ((PTR
) &hdr
, (bfd_size_type
) SIZEOF_AR_HDR_BIG
, abfd
)
1839 != SIZEOF_AR_HDR_BIG
)
1842 /* Skip the name (normally empty). */
1843 namlen
= strtol (hdr
.namlen
, (char **) NULL
, 10);
1844 pos
= ((namlen
+ 1) & ~(size_t) 1) + SXCOFFARFMAG
;
1845 if (bfd_seek (abfd
, pos
, SEEK_CUR
) != 0)
1848 /* XXX This actually has to be a call to strtoll (at least on 32-bit
1849 machines) since the field width is 20 and there numbers with more
1850 than 32 bits can be represented. */
1851 sz
= strtol (hdr
.size
, (char **) NULL
, 10);
1853 /* Read in the entire symbol table. */
1854 contents
= (bfd_byte
*) bfd_alloc (abfd
, sz
);
1855 if (contents
== NULL
)
1857 if (bfd_bread ((PTR
) contents
, sz
, abfd
) != sz
)
1860 /* The symbol table starts with an eight byte count. */
1861 c
= H_GET_64 (abfd
, contents
);
1865 bfd_set_error (bfd_error_bad_value
);
1869 amt
*= sizeof (carsym
);
1870 bfd_ardata (abfd
)->symdefs
= (carsym
*) bfd_alloc (abfd
, amt
);
1871 if (bfd_ardata (abfd
)->symdefs
== NULL
)
1874 /* After the count comes a list of eight byte file offsets. */
1875 for (i
= 0, arsym
= bfd_ardata (abfd
)->symdefs
, p
= contents
+ 8;
1877 ++i
, ++arsym
, p
+= 8)
1878 arsym
->file_offset
= H_GET_64 (abfd
, p
);
1880 /* After the file offsets come null terminated symbol names. */
1881 cend
= contents
+ sz
;
1882 for (i
= 0, arsym
= bfd_ardata (abfd
)->symdefs
;
1884 ++i
, ++arsym
, p
+= strlen ((char *) p
) + 1)
1888 bfd_set_error (bfd_error_bad_value
);
1891 arsym
->name
= (char *) p
;
1894 bfd_ardata (abfd
)->symdef_count
= c
;
1895 bfd_has_map (abfd
) = true;
1901 /* See if this is an NEW XCOFF archive. */
1903 static const bfd_target
*
1904 xcoff64_archive_p (abfd
)
1907 char magic
[SXCOFFARMAG
];
1908 /* This is the new format. */
1909 struct xcoff_ar_file_hdr_big hdr
;
1910 bfd_size_type amt
= SXCOFFARMAG
;
1912 if (bfd_bread ((PTR
) magic
, amt
, abfd
) != amt
)
1914 if (bfd_get_error () != bfd_error_system_call
)
1915 bfd_set_error (bfd_error_wrong_format
);
1919 if (strncmp (magic
, XCOFFARMAGBIG
, SXCOFFARMAG
) != 0)
1921 bfd_set_error (bfd_error_wrong_format
);
1925 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
1926 involves a cast, we can't do it as the left operand of
1928 amt
= sizeof (struct artdata
);
1929 abfd
->tdata
.aout_ar_data
= (struct artdata
*) bfd_zalloc (abfd
, amt
);
1931 if (bfd_ardata (abfd
) == (struct artdata
*) NULL
)
1934 bfd_ardata (abfd
)->cache
= NULL
;
1935 bfd_ardata (abfd
)->archive_head
= NULL
;
1936 bfd_ardata (abfd
)->symdefs
= NULL
;
1937 bfd_ardata (abfd
)->extended_names
= NULL
;
1939 /* Copy over the magic string. */
1940 memcpy (hdr
.magic
, magic
, SXCOFFARMAG
);
1942 /* Now read the rest of the file header. */
1943 if (bfd_bread ((PTR
) &hdr
.memoff
,
1944 (bfd_size_type
) (SIZEOF_AR_FILE_HDR_BIG
- SXCOFFARMAG
),
1945 abfd
) != SIZEOF_AR_FILE_HDR_BIG
- SXCOFFARMAG
)
1947 if (bfd_get_error () != bfd_error_system_call
)
1948 bfd_set_error (bfd_error_wrong_format
);
1952 /* XXX This actually has to be a call to strtoll (at least on 32-bit
1953 machines) since the field width is 20 and there numbers with more
1954 than 32 bits can be represented. */
1955 bfd_ardata (abfd
)->first_file_filepos
= strtol (hdr
.firstmemoff
,
1956 (char **) NULL
, 10);
1958 amt
= SIZEOF_AR_FILE_HDR_BIG
;
1959 bfd_ardata (abfd
)->tdata
= bfd_zalloc (abfd
, amt
);
1960 if (bfd_ardata (abfd
)->tdata
== NULL
)
1963 memcpy (bfd_ardata (abfd
)->tdata
, &hdr
, SIZEOF_AR_FILE_HDR_BIG
);
1965 if (! xcoff64_slurp_armap (abfd
))
1967 bfd_release (abfd
, bfd_ardata (abfd
));
1968 abfd
->tdata
.aout_ar_data
= (struct artdata
*) NULL
;
1976 /* Open the next element in an XCOFF archive. */
1979 xcoff64_openr_next_archived_file (archive
, last_file
)
1985 if ((xcoff_ardata (archive
) == NULL
)
1986 || ! xcoff_big_format_p (archive
))
1988 bfd_set_error (bfd_error_invalid_operation
);
1992 if (last_file
== NULL
)
1994 filestart
= bfd_ardata (archive
)->first_file_filepos
;
1998 /* XXX These actually have to be a calls to strtoll (at least
1999 on 32-bit machines) since the fields's width is 20 and
2000 there numbers with more than 32 bits can be represented. */
2001 filestart
= strtol (arch_xhdr_big (last_file
)->nextoff
, (char **) NULL
,
2004 /* XXX These actually have to be calls to strtoll (at least on 32-bit
2005 machines) since the fields's width is 20 and there numbers with more
2006 than 32 bits can be represented. */
2008 || filestart
== strtol (xcoff_ardata_big (archive
)->memoff
,
2010 || filestart
== strtol (xcoff_ardata_big (archive
)->symoff
,
2011 (char **) NULL
, 10))
2013 bfd_set_error (bfd_error_no_more_archived_files
);
2017 return _bfd_get_elt_at_filepos (archive
, filestart
);
2020 /* We can't use the usual coff_sizeof_headers routine, because AIX
2021 always uses an a.out header. */
2025 xcoff64_sizeof_headers (abfd
, reloc
)
2027 boolean reloc ATTRIBUTE_UNUSED
;
2031 size
= bfd_coff_filhsz (abfd
);
2033 /* Don't think the small aout header can be used since some of the
2034 old elements have been reordered past the end of the old coff
2037 if (xcoff_data (abfd
)->full_aouthdr
)
2038 size
+= bfd_coff_aoutsz (abfd
);
2040 size
+= abfd
->section_count
* bfd_coff_scnhsz (abfd
);
2047 xcoff64_create_csect_from_smclas (abfd
, aux
, symbol_name
)
2049 union internal_auxent
*aux
;
2050 const char *symbol_name
;
2052 asection
*return_value
= NULL
;
2054 /* Changes from 32 :
2055 .sv == 8, is only for 32 bit programs
2056 .ti == 12 and .tb == 13 are now reserved. */
2057 static const char *names
[19] =
2059 ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
2060 NULL
, ".bs", ".ds", ".uc", NULL
, NULL
, NULL
, ".tc0",
2061 ".td", ".sv64", ".sv3264"
2064 if ((19 >= aux
->x_csect
.x_smclas
)
2065 && (NULL
!= names
[aux
->x_csect
.x_smclas
]))
2068 return_value
= bfd_make_section_anyway
2069 (abfd
, names
[aux
->x_csect
.x_smclas
]);
2074 (*_bfd_error_handler
)
2075 (_("%s: symbol `%s' has unrecognized smclas %d"),
2076 bfd_archive_filename (abfd
), symbol_name
, aux
->x_csect
.x_smclas
);
2077 bfd_set_error (bfd_error_bad_value
);
2080 return return_value
;
2084 xcoff64_is_lineno_count_overflow (abfd
, value
)
2085 bfd
*abfd ATTRIBUTE_UNUSED
;
2086 bfd_vma value ATTRIBUTE_UNUSED
;
2092 xcoff64_is_reloc_count_overflow (abfd
, value
)
2093 bfd
*abfd ATTRIBUTE_UNUSED
;
2094 bfd_vma value ATTRIBUTE_UNUSED
;
2100 xcoff64_loader_symbol_offset (abfd
, ldhdr
)
2101 bfd
*abfd ATTRIBUTE_UNUSED
;
2102 struct internal_ldhdr
*ldhdr
;
2104 return (ldhdr
->l_symoff
);
2108 xcoff64_loader_reloc_offset (abfd
, ldhdr
)
2109 bfd
*abfd ATTRIBUTE_UNUSED
;
2110 struct internal_ldhdr
*ldhdr
;
2112 return (ldhdr
->l_rldoff
);
2116 xcoff64_bad_format_hook (abfd
, filehdr
)
2120 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
2122 /* Check flavor first. */
2123 if (bfd_get_flavour (abfd
) != bfd_target_xcoff_flavour
)
2126 if (bfd_xcoff_magic_number (abfd
) != internal_f
->f_magic
)
2133 xcoff64_generate_rtinit (abfd
, init
, fini
, rtld
)
2139 bfd_byte filehdr_ext
[FILHSZ
];
2140 bfd_byte scnhdr_ext
[SCNHSZ
* 3];
2141 bfd_byte syment_ext
[SYMESZ
* 10];
2142 bfd_byte reloc_ext
[RELSZ
* 3];
2143 bfd_byte
*data_buffer
;
2144 bfd_size_type data_buffer_size
;
2145 bfd_byte
*string_table
, *st_tmp
;
2146 bfd_size_type string_table_size
;
2148 size_t initsz
, finisz
;
2149 struct internal_filehdr filehdr
;
2150 struct internal_scnhdr text_scnhdr
;
2151 struct internal_scnhdr data_scnhdr
;
2152 struct internal_scnhdr bss_scnhdr
;
2153 struct internal_syment syment
;
2154 union internal_auxent auxent
;
2155 struct internal_reloc reloc
;
2157 char *text_name
= ".text";
2158 char *data_name
= ".data";
2159 char *bss_name
= ".bss";
2160 char *rtinit_name
= "__rtinit";
2161 char *rtld_name
= "__rtld";
2163 if (! bfd_xcoff_rtinit_size (abfd
))
2166 initsz
= (init
== NULL
? 0 : 1 + strlen (init
));
2167 finisz
= (fini
== NULL
? 0 : 1 + strlen (fini
));
2170 memset (filehdr_ext
, 0, FILHSZ
);
2171 memset (&filehdr
, 0, sizeof (struct internal_filehdr
));
2172 filehdr
.f_magic
= bfd_xcoff_magic_number (abfd
);
2173 filehdr
.f_nscns
= 3;
2174 filehdr
.f_timdat
= 0;
2175 filehdr
.f_nsyms
= 0; /* at least 6, no more than 8 */
2176 filehdr
.f_symptr
= 0; /* set below */
2177 filehdr
.f_opthdr
= 0;
2178 filehdr
.f_flags
= 0;
2180 /* Section headers. */
2181 memset (scnhdr_ext
, 0, 3 * SCNHSZ
);
2184 memset (&text_scnhdr
, 0, sizeof (struct internal_scnhdr
));
2185 memcpy (text_scnhdr
.s_name
, text_name
, strlen (text_name
));
2186 text_scnhdr
.s_paddr
= 0;
2187 text_scnhdr
.s_vaddr
= 0;
2188 text_scnhdr
.s_size
= 0;
2189 text_scnhdr
.s_scnptr
= 0;
2190 text_scnhdr
.s_relptr
= 0;
2191 text_scnhdr
.s_lnnoptr
= 0;
2192 text_scnhdr
.s_nreloc
= 0;
2193 text_scnhdr
.s_nlnno
= 0;
2194 text_scnhdr
.s_flags
= STYP_TEXT
;
2197 memset (&data_scnhdr
, 0, sizeof (struct internal_scnhdr
));
2198 memcpy (data_scnhdr
.s_name
, data_name
, strlen (data_name
));
2199 data_scnhdr
.s_paddr
= 0;
2200 data_scnhdr
.s_vaddr
= 0;
2201 data_scnhdr
.s_size
= 0; /* set below */
2202 data_scnhdr
.s_scnptr
= FILHSZ
+ 3 * SCNHSZ
;
2203 data_scnhdr
.s_relptr
= 0; /* set below */
2204 data_scnhdr
.s_lnnoptr
= 0;
2205 data_scnhdr
.s_nreloc
= 0; /* either 1 or 2 */
2206 data_scnhdr
.s_nlnno
= 0;
2207 data_scnhdr
.s_flags
= STYP_DATA
;
2210 memset (&bss_scnhdr
, 0, sizeof (struct internal_scnhdr
));
2211 memcpy (bss_scnhdr
.s_name
, bss_name
, strlen (bss_name
));
2212 bss_scnhdr
.s_paddr
= 0; /* set below */
2213 bss_scnhdr
.s_vaddr
= 0; /* set below */
2214 bss_scnhdr
.s_size
= 0; /* set below */
2215 bss_scnhdr
.s_scnptr
= 0;
2216 bss_scnhdr
.s_relptr
= 0;
2217 bss_scnhdr
.s_lnnoptr
= 0;
2218 bss_scnhdr
.s_nreloc
= 0;
2219 bss_scnhdr
.s_nlnno
= 0;
2220 bss_scnhdr
.s_flags
= STYP_BSS
;
2223 0x0000 0x00000000 : rtl
2225 0x0008 0x00000018 : offset to init, or 0
2226 0x000C 0x00000038 : offset to fini, or 0
2227 0x0010 0x00000010 : size of descriptor
2228 0x0014 0x00000000 : pad
2229 0x0018 0x00000000 : init, needs a reloc
2231 0x0020 0x00000058 : offset to init name
2232 0x0024 0x00000000 : flags, padded to a word
2233 0x0028 0x00000000 : empty init
2237 0x0038 0x00000000 : fini, needs a reloc
2239 0x0040 0x00000??? : offset to fini name
2240 0x0044 0x00000000 : flags, padded to a word
2241 0x0048 0x00000000 : empty fini
2246 0x0058 + initsz fini name */
2248 data_buffer_size
= 0x0058 + initsz
+ finisz
;
2249 data_buffer_size
+= (data_buffer_size
& 7) ? 8 - (data_buffer_size
& 7) : 0;
2251 data_buffer
= (bfd_byte
*)bfd_malloc (data_buffer_size
);
2252 if (data_buffer
== NULL
)
2255 memset (data_buffer
, 0, data_buffer_size
);
2260 bfd_put_32 (abfd
, val
, &data_buffer
[0x08]);
2262 bfd_put_32 (abfd
, val
, &data_buffer
[0x20]);
2263 memcpy (&data_buffer
[val
], init
, initsz
);
2269 bfd_put_32 (abfd
, val
, &data_buffer
[0x0C]);
2270 val
= 0x58 + initsz
;
2271 bfd_put_32 (abfd
, val
, &data_buffer
[0x40]);
2272 memcpy (&data_buffer
[val
], fini
, finisz
);
2276 bfd_put_32 (abfd
, val
, &data_buffer
[0x10]);
2277 data_scnhdr
.s_size
= data_buffer_size
;
2278 bss_scnhdr
.s_paddr
= bss_scnhdr
.s_vaddr
= data_scnhdr
.s_size
;
2281 string_table_size
= 4;
2282 string_table_size
+= strlen (data_name
) + 1;
2283 string_table_size
+= strlen (rtinit_name
) + 1;
2284 string_table_size
+= initsz
;
2285 string_table_size
+= finisz
;
2287 string_table_size
+= strlen (rtld_name
) + 1;
2289 string_table
= (bfd_byte
*)bfd_malloc (string_table_size
);
2290 memset (string_table
, 0, string_table_size
);
2291 val
= string_table_size
;
2292 bfd_put_32 (abfd
, val
, &string_table
[0]);
2293 st_tmp
= string_table
+ 4;
2301 memset (syment_ext
, 0, 10 * SYMESZ
);
2302 memset (reloc_ext
, 0, 3 * RELSZ
);
2305 memset (&syment
, 0, sizeof (struct internal_syment
));
2306 memset (&auxent
, 0, sizeof (union internal_auxent
));
2308 syment
._n
._n_n
._n_offset
= st_tmp
- string_table
;
2309 memcpy (st_tmp
, data_name
, strlen (data_name
));
2310 st_tmp
+= strlen (data_name
) + 1;
2313 syment
.n_sclass
= C_HIDEXT
;
2314 syment
.n_numaux
= 1;
2315 auxent
.x_csect
.x_scnlen
.l
= data_buffer_size
;
2316 auxent
.x_csect
.x_smtyp
= 3 << 3 | XTY_SD
;
2317 auxent
.x_csect
.x_smclas
= XMC_RW
;
2318 bfd_coff_swap_sym_out (abfd
, &syment
,
2319 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2320 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2322 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
2323 filehdr
.f_nsyms
+= 2;
2326 memset (&syment
, 0, sizeof (struct internal_syment
));
2327 memset (&auxent
, 0, sizeof (union internal_auxent
));
2328 syment
._n
._n_n
._n_offset
= st_tmp
- string_table
;
2329 memcpy (st_tmp
, rtinit_name
, strlen (rtinit_name
));
2330 st_tmp
+= strlen (rtinit_name
) + 1;
2333 syment
.n_sclass
= C_EXT
;
2334 syment
.n_numaux
= 1;
2335 auxent
.x_csect
.x_smtyp
= XTY_LD
;
2336 auxent
.x_csect
.x_smclas
= XMC_RW
;
2337 bfd_coff_swap_sym_out (abfd
, &syment
,
2338 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2339 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2341 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
2342 filehdr
.f_nsyms
+= 2;
2347 memset (&syment
, 0, sizeof (struct internal_syment
));
2348 memset (&auxent
, 0, sizeof (union internal_auxent
));
2350 syment
._n
._n_n
._n_offset
= st_tmp
- string_table
;
2351 memcpy (st_tmp
, init
, initsz
);
2354 syment
.n_sclass
= C_EXT
;
2355 syment
.n_numaux
= 1;
2356 bfd_coff_swap_sym_out (abfd
, &syment
,
2357 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2358 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2360 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
2362 memset (&reloc
, 0, sizeof (struct internal_reloc
));
2363 reloc
.r_vaddr
= 0x0018;
2364 reloc
.r_symndx
= filehdr
.f_nsyms
;
2365 reloc
.r_type
= R_POS
;
2367 bfd_coff_swap_reloc_out (abfd
, &reloc
, &reloc_ext
[0]);
2369 filehdr
.f_nsyms
+= 2;
2370 data_scnhdr
.s_nreloc
+= 1;
2376 memset (&syment
, 0, sizeof (struct internal_syment
));
2377 memset (&auxent
, 0, sizeof (union internal_auxent
));
2379 syment
._n
._n_n
._n_offset
= st_tmp
- string_table
;
2380 memcpy (st_tmp
, fini
, finisz
);
2383 syment
.n_sclass
= C_EXT
;
2384 syment
.n_numaux
= 1;
2385 bfd_coff_swap_sym_out (abfd
, &syment
,
2386 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2387 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2389 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
2392 memset (&reloc
, 0, sizeof (struct internal_reloc
));
2393 reloc
.r_vaddr
= 0x0038;
2394 reloc
.r_symndx
= filehdr
.f_nsyms
;
2395 reloc
.r_type
= R_POS
;
2397 bfd_coff_swap_reloc_out (abfd
, &reloc
,
2398 &reloc_ext
[data_scnhdr
.s_nreloc
* RELSZ
]);
2400 filehdr
.f_nsyms
+= 2;
2401 data_scnhdr
.s_nreloc
+= 1;
2406 memset (&syment
, 0, sizeof (struct internal_syment
));
2407 memset (&auxent
, 0, sizeof (union internal_auxent
));
2409 syment
._n
._n_n
._n_offset
= st_tmp
- string_table
;
2410 memcpy (st_tmp
, rtld_name
, strlen (rtld_name
));
2411 st_tmp
+= strlen (rtld_name
) + 1;
2413 syment
.n_sclass
= C_EXT
;
2414 syment
.n_numaux
= 1;
2415 bfd_coff_swap_sym_out (abfd
, &syment
,
2416 &syment_ext
[filehdr
.f_nsyms
* SYMESZ
]);
2417 bfd_coff_swap_aux_out (abfd
, &auxent
, syment
.n_type
, syment
.n_sclass
, 0,
2419 &syment_ext
[(filehdr
.f_nsyms
+ 1) * SYMESZ
]);
2422 memset (&reloc
, 0, sizeof (struct internal_reloc
));
2423 reloc
.r_vaddr
= 0x0000;
2424 reloc
.r_symndx
= filehdr
.f_nsyms
;
2425 reloc
.r_type
= R_POS
;
2427 bfd_coff_swap_reloc_out (abfd
, &reloc
,
2428 &reloc_ext
[data_scnhdr
.s_nreloc
* RELSZ
]);
2430 filehdr
.f_nsyms
+= 2;
2431 data_scnhdr
.s_nreloc
+= 1;
2433 bss_scnhdr
.s_size
= 0;
2436 data_scnhdr
.s_relptr
= data_scnhdr
.s_scnptr
+ data_buffer_size
;
2437 filehdr
.f_symptr
= data_scnhdr
.s_relptr
+ data_scnhdr
.s_nreloc
* RELSZ
;
2439 bfd_coff_swap_filehdr_out (abfd
, &filehdr
, filehdr_ext
);
2440 bfd_bwrite (filehdr_ext
, FILHSZ
, abfd
);
2441 bfd_coff_swap_scnhdr_out (abfd
, &text_scnhdr
, &scnhdr_ext
[SCNHSZ
* 0]);
2442 bfd_coff_swap_scnhdr_out (abfd
, &data_scnhdr
, &scnhdr_ext
[SCNHSZ
* 1]);
2443 bfd_coff_swap_scnhdr_out (abfd
, &bss_scnhdr
, &scnhdr_ext
[SCNHSZ
* 2]);
2444 bfd_bwrite (scnhdr_ext
, 3 * SCNHSZ
, abfd
);
2445 bfd_bwrite (data_buffer
, data_buffer_size
, abfd
);
2446 bfd_bwrite (reloc_ext
, data_scnhdr
.s_nreloc
* RELSZ
, abfd
);
2447 bfd_bwrite (syment_ext
, filehdr
.f_nsyms
* SYMESZ
, abfd
);
2448 bfd_bwrite (string_table
, string_table_size
, abfd
);
2456 /* The typical dynamic reloc. */
2458 static reloc_howto_type xcoff64_dynamic_reloc
=
2459 HOWTO (0, /* type */
2461 4, /* size (0 = byte, 1 = short, 2 = long) */
2463 false, /* pc_relative */
2465 complain_overflow_bitfield
, /* complain_on_overflow */
2466 0, /* special_function */
2468 true, /* partial_inplace */
2469 MINUS_ONE
, /* src_mask */
2470 MINUS_ONE
, /* dst_mask */
2471 false); /* pcrel_offset */
2473 static unsigned long xcoff64_glink_code
[10] =
2475 0xe9820000, /* ld r12,0(r2) */
2476 0xf8410028, /* std r2,40(r1) */
2477 0xe80c0000, /* ld r0,0(r12) */
2478 0xe84c0008, /* ld r0,8(r12) */
2479 0x7c0903a6, /* mtctr r0 */
2480 0x4e800420, /* bctr */
2481 0x00000000, /* start of traceback table */
2482 0x000ca000, /* traceback table */
2483 0x00000000, /* traceback table */
2484 0x00000018, /* ??? */
2487 static const struct xcoff_backend_data_rec bfd_xcoff_backend_data
=
2489 { /* COFF backend, defined in libcoff.h. */
2490 _bfd_xcoff64_swap_aux_in
, /* _bfd_coff_swap_aux_in */
2491 _bfd_xcoff64_swap_sym_in
, /* _bfd_coff_swap_sym_in */
2492 _bfd_xcoff64_swap_lineno_in
, /* _bfd_coff_swap_lineno_in */
2493 _bfd_xcoff64_swap_aux_out
, /* _bfd_swap_aux_out */
2494 _bfd_xcoff64_swap_sym_out
, /* _bfd_swap_sym_out */
2495 _bfd_xcoff64_swap_lineno_out
, /* _bfd_swap_lineno_out */
2496 coff_swap_reloc_out
, /* _bfd_swap_reloc_out */
2497 coff_swap_filehdr_out
, /* _bfd_swap_filehdr_out */
2498 coff_swap_aouthdr_out
, /* _bfd_swap_aouthdr_out */
2499 coff_swap_scnhdr_out
, /* _bfd_swap_scnhdr_out */
2500 FILHSZ
, /* _bfd_filhsz */
2501 AOUTSZ
, /* _bfd_aoutsz */
2502 SCNHSZ
, /* _bfd_scnhsz */
2503 SYMESZ
, /* _bfd_symesz */
2504 AUXESZ
, /* _bfd_auxesz */
2505 RELSZ
, /* _bfd_relsz */
2506 LINESZ
, /* _bfd_linesz */
2507 FILNMLEN
, /* _bfd_filnmlen */
2508 true, /* _bfd_coff_long_filenames */
2509 false, /* _bfd_coff_long_section_names */
2510 (3), /* _bfd_coff_default_section_alignment_power */
2511 true, /* _bfd_coff_force_symnames_in_strings */
2512 4, /* _bfd_coff_debug_string_prefix_length */
2513 coff_swap_filehdr_in
, /* _bfd_coff_swap_filehdr_in */
2514 coff_swap_aouthdr_in
, /* _bfd_swap_aouthdr_in */
2515 coff_swap_scnhdr_in
, /* _bfd_swap_scnhdr_in */
2516 coff_swap_reloc_in
, /* _bfd_reloc_in */
2517 xcoff64_bad_format_hook
, /* _bfd_bad_format_hook */
2518 coff_set_arch_mach_hook
, /* _bfd_set_arch_mach_hook */
2519 coff_mkobject_hook
, /* _bfd_mkobject_hook */
2520 styp_to_sec_flags
, /* _bfd_syp_to_sec_flags */
2521 coff_set_alignment_hook
, /* _bfd_set_alignment_hook */
2522 coff_slurp_symbol_table
, /* _bfd_coff_slurp_symbol_table */
2523 symname_in_debug_hook
, /* _coff_symname_in_debug_hook */
2524 coff_pointerize_aux_hook
, /* _bfd_coff_pointerize_aux_hook */
2525 coff_print_aux
, /* bfd_coff_print_aux */
2526 dummy_reloc16_extra_cases
, /* _bfd_coff_reloc16_extra_cases */
2527 dummy_reloc16_estimate
, /* _bfd_coff_reloc16_estimate */
2528 NULL
, /* bfd_coff_sym_is_global */
2529 /* _bfd_coff_compute_section_file_positions */
2530 coff_compute_section_file_positions
,
2531 NULL
, /* _bfd_coff_start_final_link */
2532 xcoff64_ppc_relocate_section
, /* _bfd_coff_relocate_section */
2533 coff_rtype_to_howto
, /* _bfd_coff_rtype_to_howto */
2534 NULL
, /* _bfd_coff_addust_symndx */
2535 _bfd_generic_link_add_one_symbol
, /* _bfd_coff_add_one_symbol */
2536 coff_link_output_has_begun
, /* _bfd_coff_link_output_has_begun */
2537 coff_final_link_postscript
/* _bfd_coff_final_link_postscript */
2540 0x01EF, /* magic number */
2541 bfd_arch_powerpc
, /* architecture */
2542 bfd_mach_ppc_620
, /* machine */
2544 /* Function pointers to xcoff specific swap routines. */
2545 xcoff64_swap_ldhdr_in
, /* _xcoff_swap_ldhdr_in */
2546 xcoff64_swap_ldhdr_out
, /* _xcoff_swap_ldhdr_out */
2547 xcoff64_swap_ldsym_in
, /* _xcoff_swap_ldsym_in */
2548 xcoff64_swap_ldsym_out
, /* _xcoff_swap_ldsym_out */
2549 xcoff64_swap_ldrel_in
, /* _xcoff_swap_ldrel_in */
2550 xcoff64_swap_ldrel_out
, /* _xcoff_swap_ldrel_out */
2553 LDHDRSZ
, /* _xcoff_ldhdrsz */
2554 LDSYMSZ
, /* _xcoff_ldsymsz */
2555 LDRELSZ
, /* _xcoff_ldrelsz */
2556 24, /* _xcoff_function_descriptor_size */
2557 0, /* _xcoff_small_aout_header_size */
2560 2, /* _xcoff_ldhdr_version */
2562 /* xcoff vs xcoff64 putting symbol names. */
2563 _bfd_xcoff64_put_symbol_name
, /* _xcoff_put_symbol_name */
2564 _bfd_xcoff64_put_ldsymbol_name
, /* _xcoff_put_ldsymbol_name */
2566 /* Dynamic reloc howto. */
2567 &xcoff64_dynamic_reloc
,
2569 xcoff64_create_csect_from_smclas
,
2571 /* Lineno and reloc count overflow. */
2572 xcoff64_is_lineno_count_overflow
,
2573 xcoff64_is_reloc_count_overflow
,
2575 xcoff64_loader_symbol_offset
,
2576 xcoff64_loader_reloc_offset
,
2579 &xcoff64_glink_code
[0],
2580 40, /* _xcoff_glink_size */
2583 88, /* _xcoff_rtinit_size */
2584 xcoff64_generate_rtinit
, /* _xcoff_generate_rtinit */
2587 /* The transfer vector that leads the outside world to all of the above. */
2588 const bfd_target rs6000coff64_vec
=
2591 bfd_target_xcoff_flavour
,
2592 BFD_ENDIAN_BIG
, /* data byte order is big */
2593 BFD_ENDIAN_BIG
, /* header byte order is big */
2595 (HAS_RELOC
| EXEC_P
| /* object flags */
2596 HAS_LINENO
| HAS_DEBUG
| DYNAMIC
|
2597 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
),
2599 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* section flags */
2600 0, /* leading char */
2601 '/', /* ar_pad_char */
2602 15, /* ar_max_namelen??? FIXMEmgo */
2605 bfd_getb64
, /* bfd_getx64 */
2606 bfd_getb_signed_64
, /* bfd_getx_signed_64 */
2607 bfd_putb64
, /* bfd_putx64 */
2608 bfd_getb32
, /* bfd_getx32 */
2609 bfd_getb_signed_32
, /* bfd_getx_signed_32 */
2610 bfd_putb32
, /* bfd_putx32 */
2611 bfd_getb16
, /* bfd_getx16 */
2612 bfd_getb_signed_16
, /* bfd_getx_signed_16 */
2613 bfd_putb16
, /* bfd_putx16 */
2616 bfd_getb64
, /* bfd_h_getx64 */
2617 bfd_getb_signed_64
, /* bfd_h_getx_signed_64 */
2618 bfd_putb64
, /* bfd_h_putx64 */
2619 bfd_getb32
, /* bfd_h_getx32 */
2620 bfd_getb_signed_32
, /* bfd_h_getx_signed_32 */
2621 bfd_putb32
, /* bfd_h_putx32 */
2622 bfd_getb16
, /* bfd_h_getx16 */
2623 bfd_getb_signed_16
, /* bfd_h_getx_signed_16 */
2624 bfd_putb16
, /* bfd_h_putx16 */
2626 { /* bfd_check_format */
2633 { /* bfd_set_format */
2636 _bfd_generic_mkarchive
,
2640 {/* bfd_write_contents */
2642 xcoff64_write_object_contents
,
2643 _bfd_xcoff_write_archive_contents
,
2648 bfd_true
, /* _close_and_cleanup */
2649 bfd_true
, /* _bfd_free_cached_info */
2650 coff_new_section_hook
, /* _new_section_hook */
2651 _bfd_generic_get_section_contents
, /* _bfd_get_section_contents */
2652 /* _bfd_get_section_contents_in_window */
2653 _bfd_generic_get_section_contents_in_window
,
2656 _bfd_xcoff_copy_private_bfd_data
, /* _bfd_copy_private_bfd */
2657 /* _bfd_merge_private_bfd_data */
2658 ((boolean (*) (bfd
*, bfd
*)) bfd_true
),
2659 /* _bfd_copy_pivate_section_data */
2660 ((boolean (*) (bfd
*, asection
*, bfd
*, asection
*)) bfd_true
),
2661 /* _bfd_copy_private_symbol_data */
2662 ((boolean (*) (bfd
*, asymbol
*, bfd
*, asymbol
*)) bfd_true
),
2663 ((boolean (*) (bfd
*, flagword
)) bfd_true
), /* _bfd_set_private_flags */
2664 ((boolean (*) (bfd
*, void * )) bfd_true
), /* _bfd_print_private_bfd_data */
2667 coff_core_file_failing_command
, /* _core_file_failing_command */
2668 coff_core_file_failing_signal
, /* _core_file_failing_signal */
2669 coff_core_file_matches_executable_p
, /* _core_file_matches_executable_p */
2672 xcoff64_slurp_armap
, /* _slurp_armap */
2673 /* XCOFF archives do not have anything which corresponds to an
2674 extended name table. */
2675 bfd_false
, /* _slurp_extended_name_table */
2676 /* _construct_extended_name_table */
2677 ((boolean (*) (bfd
*, char **, bfd_size_type
*, const char **)) bfd_false
),
2678 bfd_dont_truncate_arname
, /* _truncate_arname */
2679 _bfd_xcoff_write_armap
, /* _write_armap */
2680 _bfd_xcoff_read_ar_hdr
, /* _read_ar_hdr */
2681 xcoff64_openr_next_archived_file
, /* _openr_next_archived_file */
2682 _bfd_generic_get_elt_at_index
, /* _get_elt_at_index */
2683 _bfd_xcoff_stat_arch_elt
, /* _generic_stat_arch_elt */
2684 /* XCOFF archives do not have a timestamp. */
2685 bfd_true
, /* _update_armap_timestamp */
2688 coff_get_symtab_upper_bound
, /* _get_symtab_upper_bound */
2689 coff_get_symtab
, /* _get_symtab */
2690 coff_make_empty_symbol
, /* _make_empty_symbol */
2691 coff_print_symbol
, /* _print_symbol */
2692 coff_get_symbol_info
, /* _get_symbol_info */
2693 _bfd_xcoff_is_local_label_name
, /* _bfd_is_local_label_name */
2694 coff_get_lineno
, /* _get_lineno */
2695 coff_find_nearest_line
, /* _find_nearest_line */
2696 coff_bfd_make_debug_symbol
, /* _bfd_make_debug_symbol */
2697 _bfd_generic_read_minisymbols
, /* _read_minisymbols */
2698 _bfd_generic_minisymbol_to_symbol
, /* _minsymbol_to_symbol */
2701 coff_get_reloc_upper_bound
, /* _get_reloc_upper_bound */
2702 coff_canonicalize_reloc
, /* _cononicalize_reloc */
2703 xcoff64_reloc_type_lookup
, /* _bfd_reloc_type_lookup */
2706 coff_set_arch_mach
, /* _set_arch_mach */
2707 coff_set_section_contents
, /* _set_section_contents */
2710 xcoff64_sizeof_headers
, /* _sizeof_headers */
2711 /* _bfd_get_relocated_section_contents */
2712 bfd_generic_get_relocated_section_contents
,
2713 bfd_generic_relax_section
, /* _bfd_relax_section */
2714 _bfd_xcoff_bfd_link_hash_table_create
,/* _bfd_link_hash_table_create */
2715 _bfd_xcoff_bfd_link_add_symbols
, /* _bfd_link_add_symbols */
2716 _bfd_xcoff_bfd_final_link
, /* _bfd_filnal_link */
2717 _bfd_generic_link_split_section
, /* _bfd_link_split_section */
2718 bfd_generic_gc_sections
, /* _bfd_gc_sections */
2719 bfd_generic_merge_sections
, /* _bfd_merge_sections */
2722 /* _get_dynamic_symtab_upper_bound */
2723 _bfd_xcoff_get_dynamic_symtab_upper_bound
,
2724 _bfd_xcoff_canonicalize_dynamic_symtab
, /* _cononicalize_dynamic_symtab */
2725 _bfd_xcoff_get_dynamic_reloc_upper_bound
,/* _get_dynamic_reloc_upper_bound */
2726 _bfd_xcoff_canonicalize_dynamic_reloc
, /* _cononicalize_dynamic_reloc */
2728 /* Opposite endian version, none exists */
2732 (void *) &bfd_xcoff_backend_data
,
2735 extern const bfd_target
*xcoff64_core_p
PARAMS ((bfd
*));
2736 extern boolean xcoff64_core_file_matches_executable_p
PARAMS((bfd
*, bfd
*));
2737 extern char *xcoff64_core_file_failing_command
PARAMS ((bfd
*));
2738 extern int xcoff64_core_file_failing_signal
PARAMS ((bfd
*));
2741 static const struct xcoff_backend_data_rec bfd_xcoff_aix5_backend_data
=
2743 { /* COFF backend, defined in libcoff.h. */
2744 _bfd_xcoff64_swap_aux_in
, /* _bfd_coff_swap_aux_in */
2745 _bfd_xcoff64_swap_sym_in
, /* _bfd_coff_swap_sym_in */
2746 _bfd_xcoff64_swap_lineno_in
, /* _bfd_coff_swap_lineno_in */
2747 _bfd_xcoff64_swap_aux_out
, /* _bfd_swap_aux_out */
2748 _bfd_xcoff64_swap_sym_out
, /* _bfd_swap_sym_out */
2749 _bfd_xcoff64_swap_lineno_out
, /* _bfd_swap_lineno_out */
2750 coff_swap_reloc_out
, /* _bfd_swap_reloc_out */
2751 coff_swap_filehdr_out
, /* _bfd_swap_filehdr_out */
2752 coff_swap_aouthdr_out
, /* _bfd_swap_aouthdr_out */
2753 coff_swap_scnhdr_out
, /* _bfd_swap_scnhdr_out */
2754 FILHSZ
, /* _bfd_filhsz */
2755 AOUTSZ
, /* _bfd_aoutsz */
2756 SCNHSZ
, /* _bfd_scnhsz */
2757 SYMESZ
, /* _bfd_symesz */
2758 AUXESZ
, /* _bfd_auxesz */
2759 RELSZ
, /* _bfd_relsz */
2760 LINESZ
, /* _bfd_linesz */
2761 FILNMLEN
, /* _bfd_filnmlen */
2762 true, /* _bfd_coff_long_filenames */
2763 false, /* _bfd_coff_long_section_names */
2764 (3), /* _bfd_coff_default_section_alignment_power */
2765 true, /* _bfd_coff_force_symnames_in_strings */
2766 4, /* _bfd_coff_debug_string_prefix_length */
2767 coff_swap_filehdr_in
, /* _bfd_coff_swap_filehdr_in */
2768 coff_swap_aouthdr_in
, /* _bfd_swap_aouthdr_in */
2769 coff_swap_scnhdr_in
, /* _bfd_swap_scnhdr_in */
2770 coff_swap_reloc_in
, /* _bfd_reloc_in */
2771 xcoff64_bad_format_hook
, /* _bfd_bad_format_hook */
2772 coff_set_arch_mach_hook
, /* _bfd_set_arch_mach_hook */
2773 coff_mkobject_hook
, /* _bfd_mkobject_hook */
2774 styp_to_sec_flags
, /* _bfd_syp_to_sec_flags */
2775 coff_set_alignment_hook
, /* _bfd_set_alignment_hook */
2776 coff_slurp_symbol_table
, /* _bfd_coff_slurp_symbol_table */
2777 symname_in_debug_hook
, /* _coff_symname_in_debug_hook */
2778 coff_pointerize_aux_hook
, /* _bfd_coff_pointerize_aux_hook */
2779 coff_print_aux
, /* bfd_coff_print_aux */
2780 dummy_reloc16_extra_cases
, /* _bfd_coff_reloc16_extra_cases */
2781 dummy_reloc16_estimate
, /* _bfd_coff_reloc16_estimate */
2782 NULL
, /* bfd_coff_sym_is_global */
2783 /* _bfd_coff_compute_section_file_positions */
2784 coff_compute_section_file_positions
,
2785 NULL
, /* _bfd_coff_start_final_link */
2786 xcoff64_ppc_relocate_section
, /* _bfd_coff_relocate_section */
2787 coff_rtype_to_howto
, /* _bfd_coff_rtype_to_howto */
2788 NULL
, /* _bfd_coff_addust_symndx */
2789 _bfd_generic_link_add_one_symbol
, /* _bfd_coff_add_one_symbol */
2790 coff_link_output_has_begun
, /* _bfd_coff_link_output_has_begun */
2791 coff_final_link_postscript
/* _bfd_coff_final_link_postscript */
2794 U64_TOCMAGIC
, /* magic number */
2795 bfd_arch_powerpc
, /* architecture */
2796 bfd_mach_ppc_620
, /* machine */
2798 /* Function pointers to xcoff specific swap routines. */
2799 xcoff64_swap_ldhdr_in
, /* _xcoff_swap_ldhdr_in */
2800 xcoff64_swap_ldhdr_out
, /* _xcoff_swap_ldhdr_out */
2801 xcoff64_swap_ldsym_in
, /* _xcoff_swap_ldsym_in */
2802 xcoff64_swap_ldsym_out
, /* _xcoff_swap_ldsym_out */
2803 xcoff64_swap_ldrel_in
, /* _xcoff_swap_ldrel_in */
2804 xcoff64_swap_ldrel_out
, /* _xcoff_swap_ldrel_out */
2807 LDHDRSZ
, /* _xcoff_ldhdrsz */
2808 LDSYMSZ
, /* _xcoff_ldsymsz */
2809 LDRELSZ
, /* _xcoff_ldrelsz */
2810 24, /* _xcoff_function_descriptor_size */
2811 0, /* _xcoff_small_aout_header_size */
2813 2, /* _xcoff_ldhdr_version */
2815 _bfd_xcoff64_put_symbol_name
, /* _xcoff_put_symbol_name */
2816 _bfd_xcoff64_put_ldsymbol_name
, /* _xcoff_put_ldsymbol_name */
2818 /* Dynamic reloc howto. */
2819 &xcoff64_dynamic_reloc
,
2820 xcoff64_create_csect_from_smclas
,
2822 /* Lineno and reloc count overflow. */
2823 xcoff64_is_lineno_count_overflow
,
2824 xcoff64_is_reloc_count_overflow
,
2826 xcoff64_loader_symbol_offset
,
2827 xcoff64_loader_reloc_offset
,
2830 &xcoff64_glink_code
[0],
2831 40, /* _xcoff_glink_size */
2834 88, /* _xcoff_rtinit_size */
2835 xcoff64_generate_rtinit
, /* _xcoff_generate_rtinit */
2838 /* The transfer vector that leads the outside world to all of the above. */
2839 const bfd_target aix5coff64_vec
=
2841 "aix5coff64-rs6000",
2842 bfd_target_xcoff_flavour
,
2843 BFD_ENDIAN_BIG
, /* data byte order is big */
2844 BFD_ENDIAN_BIG
, /* header byte order is big */
2846 (HAS_RELOC
| EXEC_P
| /* object flags */
2847 HAS_LINENO
| HAS_DEBUG
| DYNAMIC
|
2848 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
),
2850 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* section flags */
2851 0, /* leading char */
2852 '/', /* ar_pad_char */
2853 15, /* ar_max_namelen??? FIXMEmgo */
2856 bfd_getb64
, /* bfd_getx64 */
2857 bfd_getb_signed_64
, /* bfd_getx_signed_64 */
2858 bfd_putb64
, /* bfd_putx64 */
2859 bfd_getb32
, /* bfd_getx32 */
2860 bfd_getb_signed_32
, /* bfd_getx_signed_32 */
2861 bfd_putb32
, /* bfd_putx32 */
2862 bfd_getb16
, /* bfd_getx16 */
2863 bfd_getb_signed_16
, /* bfd_getx_signed_16 */
2864 bfd_putb16
, /* bfd_putx16 */
2867 bfd_getb64
, /* bfd_h_getx64 */
2868 bfd_getb_signed_64
, /* bfd_h_getx_signed_64 */
2869 bfd_putb64
, /* bfd_h_putx64 */
2870 bfd_getb32
, /* bfd_h_getx32 */
2871 bfd_getb_signed_32
, /* bfd_h_getx_signed_32 */
2872 bfd_putb32
, /* bfd_h_putx32 */
2873 bfd_getb16
, /* bfd_h_getx16 */
2874 bfd_getb_signed_16
, /* bfd_h_getx_signed_16 */
2875 bfd_putb16
, /* bfd_h_putx16 */
2877 { /* bfd_check_format */
2884 { /* bfd_set_format */
2887 _bfd_generic_mkarchive
,
2891 {/* bfd_write_contents */
2893 xcoff64_write_object_contents
,
2894 _bfd_xcoff_write_archive_contents
,
2899 bfd_true
, /* _close_and_cleanup */
2900 bfd_true
, /* _bfd_free_cached_info */
2901 coff_new_section_hook
, /* _new_section_hook */
2902 _bfd_generic_get_section_contents
, /* _bfd_get_section_contents */
2903 /* _bfd_get_section_contents_in_window */
2904 _bfd_generic_get_section_contents_in_window
,
2907 _bfd_xcoff_copy_private_bfd_data
, /* _bfd_copy_private_bfd */
2908 /* _bfd_merge_private_bfd_data */
2909 ((boolean (*) (bfd
*, bfd
*)) bfd_true
),
2910 /* _bfd_copy_pivate_section_data */
2911 ((boolean (*) (bfd
*, asection
*, bfd
*, asection
*)) bfd_true
),
2912 /* _bfd_copy_private_symbol_data */
2913 ((boolean (*) (bfd
*, asymbol
*, bfd
*, asymbol
*)) bfd_true
),
2914 ((boolean (*) (bfd
*, flagword
)) bfd_true
), /* _bfd_set_private_flags */
2915 ((boolean (*) (bfd
*, void * )) bfd_true
), /* _bfd_print_private_bfd_data */
2918 xcoff64_core_file_failing_command
, /* _core_file_failing_command */
2919 xcoff64_core_file_failing_signal
, /* _core_file_failing_signal */
2920 xcoff64_core_file_matches_executable_p
, /* _core_file_matches_executable_p */
2923 xcoff64_slurp_armap
, /* _slurp_armap */
2924 /* XCOFF archives do not have anything which corresponds to an
2925 extended name table. */
2926 bfd_false
, /* _slurp_extended_name_table */
2927 /* _construct_extended_name_table */
2928 ((boolean (*) (bfd
*, char **, bfd_size_type
*, const char **)) bfd_false
),
2929 bfd_dont_truncate_arname
, /* _truncate_arname */
2930 _bfd_xcoff_write_armap
, /* _write_armap */
2931 _bfd_xcoff_read_ar_hdr
, /* _read_ar_hdr */
2932 xcoff64_openr_next_archived_file
, /* _openr_next_archived_file */
2933 _bfd_generic_get_elt_at_index
, /* _get_elt_at_index */
2934 _bfd_xcoff_stat_arch_elt
, /* _generic_stat_arch_elt */
2935 /* XCOFF archives do not have a timestamp. */
2936 bfd_true
, /* _update_armap_timestamp */
2939 coff_get_symtab_upper_bound
, /* _get_symtab_upper_bound */
2940 coff_get_symtab
, /* _get_symtab */
2941 coff_make_empty_symbol
, /* _make_empty_symbol */
2942 coff_print_symbol
, /* _print_symbol */
2943 coff_get_symbol_info
, /* _get_symbol_info */
2944 _bfd_xcoff_is_local_label_name
, /* _bfd_is_local_label_name */
2945 coff_get_lineno
, /* _get_lineno */
2946 coff_find_nearest_line
, /* _find_nearest_line */
2947 coff_bfd_make_debug_symbol
, /* _bfd_make_debug_symbol */
2948 _bfd_generic_read_minisymbols
, /* _read_minisymbols */
2949 _bfd_generic_minisymbol_to_symbol
, /* _minsymbol_to_symbol */
2952 coff_get_reloc_upper_bound
, /* _get_reloc_upper_bound */
2953 coff_canonicalize_reloc
, /* _cononicalize_reloc */
2954 xcoff64_reloc_type_lookup
, /* _bfd_reloc_type_lookup */
2957 coff_set_arch_mach
, /* _set_arch_mach */
2958 coff_set_section_contents
, /* _set_section_contents */
2961 xcoff64_sizeof_headers
, /* _sizeof_headers */
2962 /* _bfd_get_relocated_section_contents */
2963 bfd_generic_get_relocated_section_contents
,
2964 bfd_generic_relax_section
, /* _bfd_relax_section */
2965 _bfd_xcoff_bfd_link_hash_table_create
,/* _bfd_link_hash_table_create */
2966 _bfd_xcoff_bfd_link_add_symbols
, /* _bfd_link_add_symbols */
2967 _bfd_xcoff_bfd_final_link
, /* _bfd_filnal_link */
2968 _bfd_generic_link_split_section
, /* _bfd_link_split_section */
2969 bfd_generic_gc_sections
, /* _bfd_gc_sections */
2970 bfd_generic_merge_sections
, /* _bfd_merge_sections */
2973 /* _get_dynamic_symtab_upper_bound */
2974 _bfd_xcoff_get_dynamic_symtab_upper_bound
,
2975 _bfd_xcoff_canonicalize_dynamic_symtab
, /* _cononicalize_dynamic_symtab */
2976 _bfd_xcoff_get_dynamic_reloc_upper_bound
,/* _get_dynamic_reloc_upper_bound */
2977 _bfd_xcoff_canonicalize_dynamic_reloc
, /* _cononicalize_dynamic_reloc */
2979 /* Opposite endian version, none exists. */
2983 (void *) & bfd_xcoff_aix5_backend_data
,