1 /* BFD back-end for IBM RS/6000 "XCOFF" files.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 Free Software Foundation, Inc.
5 FIXME: Can someone provide a transliteration of this name into ASCII?
6 Using the following chars caused a compiler warning on HIUX (so I replaced
7 them with octal escapes), and isn't useful without an understanding of what
9 Written by Metin G. Ozisik, Mimi Ph\373\364ng-Th\345o V\365,
11 Archive support from Damon A. Permezel.
12 Contributed by IBM Corporation and Cygnus Support.
14 This file is part of BFD, the Binary File Descriptor library.
16 This program is free software; you can redistribute it and/or modify
17 it under the terms of the GNU General Public License as published by
18 the Free Software Foundation; either version 2 of the License, or
19 (at your option) any later version.
21 This program is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 GNU General Public License for more details.
26 You should have received a copy of the GNU General Public License
27 along with this program; if not, write to the Free Software
28 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
34 #include "coff/internal.h"
35 #include "coff/xcoff.h"
36 #include "coff/rs6000.h"
40 extern boolean _bfd_xcoff_mkobject
PARAMS ((bfd
*));
41 extern boolean _bfd_xcoff_copy_private_bfd_data
PARAMS ((bfd
*, bfd
*));
42 extern boolean _bfd_xcoff_is_local_label_name
PARAMS ((bfd
*, const char *));
43 extern reloc_howto_type
*_bfd_xcoff_reloc_type_lookup
44 PARAMS ((bfd
*, bfd_reloc_code_real_type
));
45 extern boolean _bfd_xcoff_slurp_armap
PARAMS ((bfd
*));
46 extern const bfd_target
*_bfd_xcoff_archive_p
PARAMS ((bfd
*));
47 extern PTR _bfd_xcoff_read_ar_hdr
PARAMS ((bfd
*));
48 extern bfd
*_bfd_xcoff_openr_next_archived_file
PARAMS ((bfd
*, bfd
*));
49 extern int _bfd_xcoff_generic_stat_arch_elt
PARAMS ((bfd
*, struct stat
*));
50 extern boolean _bfd_xcoff_write_armap
51 PARAMS ((bfd
*, unsigned int, struct orl
*, unsigned int, int));
52 extern boolean _bfd_xcoff_write_archive_contents
PARAMS ((bfd
*));
53 extern int _bfd_xcoff_sizeof_headers
PARAMS ((bfd
*, boolean
));
54 extern void _bfd_xcoff_swap_sym_in
PARAMS ((bfd
*, PTR
, PTR
));
55 extern unsigned int _bfd_xcoff_swap_sym_out
PARAMS ((bfd
*, PTR
, PTR
));
56 extern void _bfd_xcoff_swap_aux_in
PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
57 extern unsigned int _bfd_xcoff_swap_aux_out
PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
59 /* Forward declare _bfd_xcoff_rtype2howto for coffcode.h macro. */
60 void _bfd_xcoff_rtype2howto
PARAMS ((arelent
*, struct internal_reloc
*));
62 /* coffcode.h needs these to be defined. */
63 #define RS6000COFF_C 1
65 #define SELECT_RELOC(internal, howto) \
67 internal.r_type = howto->type; \
69 ((howto->complain_on_overflow == complain_overflow_signed \
72 | (howto->bitsize - 1)); \
75 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
76 #define COFF_LONG_FILENAMES
77 #define NO_COFF_SYMBOLS
78 #define RTYPE2HOWTO(cache_ptr, dst) _bfd_xcoff_rtype2howto (cache_ptr, dst)
79 #define coff_mkobject _bfd_xcoff_mkobject
80 #define coff_bfd_copy_private_bfd_data _bfd_xcoff_copy_private_bfd_data
81 #define coff_bfd_is_local_label_name _bfd_xcoff_is_local_label_name
82 #define coff_bfd_reloc_type_lookup _bfd_xcoff_reloc_type_lookup
84 extern const bfd_target
* rs6000coff_core_p ();
85 extern boolean
rs6000coff_core_file_matches_executable_p ();
86 extern char *rs6000coff_core_file_failing_command
PARAMS ((bfd
*abfd
));
87 extern int rs6000coff_core_file_failing_signal
PARAMS ((bfd
*abfd
));
88 #define CORE_FILE_P rs6000coff_core_p
89 #define coff_core_file_failing_command \
90 rs6000coff_core_file_failing_command
91 #define coff_core_file_failing_signal \
92 rs6000coff_core_file_failing_signal
93 #define coff_core_file_matches_executable_p \
94 rs6000coff_core_file_matches_executable_p
96 #define CORE_FILE_P _bfd_dummy_target
97 #define coff_core_file_failing_command \
98 _bfd_nocore_core_file_failing_command
99 #define coff_core_file_failing_signal \
100 _bfd_nocore_core_file_failing_signal
101 #define coff_core_file_matches_executable_p \
102 _bfd_nocore_core_file_matches_executable_p
104 #define coff_SWAP_sym_in _bfd_xcoff_swap_sym_in
105 #define coff_SWAP_sym_out _bfd_xcoff_swap_sym_out
106 #define coff_SWAP_aux_in _bfd_xcoff_swap_aux_in
107 #define coff_SWAP_aux_out _bfd_xcoff_swap_aux_out
109 #include "coffcode.h"
111 /* The main body of code is in coffcode.h. */
113 static const char *normalize_filename
PARAMS ((bfd
*));
114 static boolean xcoff_write_armap_old
115 PARAMS ((bfd
*, unsigned int, struct orl
*, unsigned int, int));
116 static boolean xcoff_write_one_armap_big
117 PARAMS ((bfd
*, struct orl
*, unsigned int, unsigned int, unsigned int,
118 int, const char *, char *));
119 static boolean xcoff_write_armap_big
120 PARAMS ((bfd
*, unsigned int, struct orl
*, unsigned int, int));
121 static boolean xcoff_write_archive_contents_old
PARAMS ((bfd
*));
122 static boolean xcoff_write_archive_contents_big
PARAMS ((bfd
*));
123 static void xcoff_swap_ldhdr_in
124 PARAMS ((bfd
*, const PTR
, struct internal_ldhdr
*));
125 static void xcoff_swap_ldhdr_out
126 PARAMS ((bfd
*, const struct internal_ldhdr
*, PTR
));
127 static void xcoff_swap_ldsym_in
128 PARAMS ((bfd
*, const PTR
, struct internal_ldsym
*));
129 static void xcoff_swap_ldsym_out
130 PARAMS ((bfd
*, const struct internal_ldsym
*, PTR
));
131 static void xcoff_swap_ldrel_in
132 PARAMS ((bfd
*, const PTR
, struct internal_ldrel
*));
133 static void xcoff_swap_ldrel_out
134 PARAMS ((bfd
*, const struct internal_ldrel
*, PTR
));
135 static boolean xcoff_ppc_relocate_section
136 PARAMS ((bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
137 struct internal_reloc
*, struct internal_syment
*, asection
**));
138 static boolean _bfd_xcoff_put_ldsymbol_name
139 PARAMS ((bfd
*, struct xcoff_loader_info
*, struct internal_ldsym
*,
141 static asection
*xcoff_create_csect_from_smclas
142 PARAMS ((bfd
*, union internal_auxent
*, const char *));
143 static boolean xcoff_is_lineno_count_overflow
PARAMS ((bfd
*, bfd_vma
));
144 static boolean xcoff_is_reloc_count_overflow
PARAMS ((bfd
*, bfd_vma
));
145 static bfd_vma xcoff_loader_symbol_offset
146 PARAMS ((bfd
*, struct internal_ldhdr
*));
147 static bfd_vma xcoff_loader_reloc_offset
148 PARAMS ((bfd
*, struct internal_ldhdr
*));
150 /* We use our own tdata type. Its first field is the COFF tdata type,
151 so the COFF routines are compatible. */
154 _bfd_xcoff_mkobject (abfd
)
157 coff_data_type
*coff
;
159 abfd
->tdata
.xcoff_obj_data
=
160 ((struct xcoff_tdata
*)
161 bfd_zalloc (abfd
, sizeof (struct xcoff_tdata
)));
162 if (abfd
->tdata
.xcoff_obj_data
== NULL
)
164 coff
= coff_data (abfd
);
165 coff
->symbols
= (coff_symbol_type
*) NULL
;
166 coff
->conversion_table
= (unsigned int *) NULL
;
167 coff
->raw_syments
= (struct coff_ptr_struct
*) NULL
;
170 xcoff_data (abfd
)->modtype
= ('1' << 8) | 'L';
172 /* We set cputype to -1 to indicate that it has not been
174 xcoff_data (abfd
)->cputype
= -1;
176 xcoff_data (abfd
)->csects
= NULL
;
177 xcoff_data (abfd
)->debug_indices
= NULL
;
179 /* text section alignment is different than the default */
180 /* xcoff_data (abfd)->text_align_power = 5; */
185 /* Copy XCOFF data from one BFD to another. */
188 _bfd_xcoff_copy_private_bfd_data (ibfd
, obfd
)
192 struct xcoff_tdata
*ix
, *ox
;
195 if (ibfd
->xvec
!= obfd
->xvec
)
197 ix
= xcoff_data (ibfd
);
198 ox
= xcoff_data (obfd
);
199 ox
->full_aouthdr
= ix
->full_aouthdr
;
205 sec
= coff_section_from_bfd_index (ibfd
, ix
->sntoc
);
209 ox
->sntoc
= sec
->output_section
->target_index
;
211 if (ix
->snentry
== 0)
215 sec
= coff_section_from_bfd_index (ibfd
, ix
->snentry
);
219 ox
->snentry
= sec
->output_section
->target_index
;
221 ox
->text_align_power
= ix
->text_align_power
;
222 ox
->data_align_power
= ix
->data_align_power
;
223 ox
->modtype
= ix
->modtype
;
224 ox
->cputype
= ix
->cputype
;
225 ox
->maxdata
= ix
->maxdata
;
226 ox
->maxstack
= ix
->maxstack
;
230 /* I don't think XCOFF really has a notion of local labels based on
231 name. This will mean that ld -X doesn't actually strip anything.
232 The AIX native linker does not have a -X option, and it ignores the
236 _bfd_xcoff_is_local_label_name (abfd
, name
)
237 bfd
*abfd ATTRIBUTE_UNUSED
;
238 const char *name ATTRIBUTE_UNUSED
;
246 _bfd_xcoff_swap_sym_in (abfd
, ext1
, in1
)
251 SYMENT
*ext
= (SYMENT
*)ext1
;
252 struct internal_syment
* in
= (struct internal_syment
*)in1
;
254 if (ext
->e
.e_name
[0] != 0)
256 memcpy(in
->_n
._n_name
, ext
->e
.e_name
, SYMNMLEN
);
260 in
->_n
._n_n
._n_zeroes
= 0;
261 in
->_n
._n_n
._n_offset
=
262 bfd_h_get_32 (abfd
, (bfd_byte
*) ext
->e
.e
.e_offset
);
265 in
->n_value
= bfd_h_get_32 (abfd
, (bfd_byte
*) ext
->e_value
);
266 in
->n_scnum
= bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->e_scnum
);
267 in
->n_type
= bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->e_type
);
268 in
->n_sclass
= bfd_h_get_8 (abfd
, ext
->e_sclass
);
269 in
->n_numaux
= bfd_h_get_8 (abfd
, ext
->e_numaux
);
273 _bfd_xcoff_swap_sym_out (abfd
, inp
, extp
)
278 struct internal_syment
*in
= (struct internal_syment
*)inp
;
279 SYMENT
*ext
=(SYMENT
*)extp
;
281 if (in
->_n
._n_name
[0] != 0)
283 memcpy(ext
->e
.e_name
, in
->_n
._n_name
, SYMNMLEN
);
287 bfd_h_put_32 (abfd
, 0, (bfd_byte
*) ext
->e
.e
.e_zeroes
);
288 bfd_h_put_32 (abfd
, in
->_n
._n_n
._n_offset
,
289 (bfd_byte
*) ext
->e
.e
.e_offset
);
292 bfd_h_put_32 (abfd
, in
->n_value
, (bfd_byte
*) ext
->e_value
);
293 bfd_h_put_16 (abfd
, in
->n_scnum
, (bfd_byte
*) ext
->e_scnum
);
294 bfd_h_put_16 (abfd
, in
->n_type
, (bfd_byte
*) ext
->e_type
);
295 bfd_h_put_8 (abfd
, in
->n_sclass
, ext
->e_sclass
);
296 bfd_h_put_8 (abfd
, in
->n_numaux
, ext
->e_numaux
);
297 return bfd_coff_symesz (abfd
);
300 #define PUTWORD bfd_h_put_32
301 #define PUTHALF bfd_h_put_16
302 #define PUTBYTE bfd_h_put_8
303 #define GETWORD bfd_h_get_32
304 #define GETHALF bfd_h_get_16
305 #define GETBYTE bfd_h_get_8
308 _bfd_xcoff_swap_aux_in (abfd
, ext1
, type
, class, indx
, numaux
, in1
)
317 AUXENT
* ext
= (AUXENT
*)ext1
;
318 union internal_auxent
*in
= (union internal_auxent
*)in1
;
323 if (ext
->x_file
.x_fname
[0] == 0)
325 in
->x_file
.x_n
.x_zeroes
= 0;
326 in
->x_file
.x_n
.x_offset
=
327 bfd_h_get_32 (abfd
, (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
334 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
,
335 numaux
* sizeof (AUXENT
));
339 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
344 /* RS/6000 "csect" auxents */
347 if (indx
+ 1 == numaux
)
349 in
->x_csect
.x_scnlen
.l
=
350 bfd_h_get_32 (abfd
, ext
->x_csect
.x_scnlen
);
351 in
->x_csect
.x_parmhash
= bfd_h_get_32 (abfd
,
352 ext
->x_csect
.x_parmhash
);
353 in
->x_csect
.x_snhash
= bfd_h_get_16 (abfd
, ext
->x_csect
.x_snhash
);
354 /* We don't have to hack bitfields in x_smtyp because it's
355 defined by shifts-and-ands, which are equivalent on all
357 in
->x_csect
.x_smtyp
= bfd_h_get_8 (abfd
, ext
->x_csect
.x_smtyp
);
358 in
->x_csect
.x_smclas
= bfd_h_get_8 (abfd
, ext
->x_csect
.x_smclas
);
359 in
->x_csect
.x_stab
= bfd_h_get_32 (abfd
, ext
->x_csect
.x_stab
);
360 in
->x_csect
.x_snstab
= bfd_h_get_16 (abfd
, ext
->x_csect
.x_snstab
);
370 in
->x_scn
.x_scnlen
= bfd_h_get_32(abfd
,
371 (bfd_byte
*) ext
->x_scn
.x_scnlen
);
372 in
->x_scn
.x_nreloc
= bfd_h_get_16(abfd
,
373 (bfd_byte
*) ext
->x_scn
.x_nreloc
);
374 in
->x_scn
.x_nlinno
= bfd_h_get_16(abfd
,
375 (bfd_byte
*) ext
->x_scn
.x_nlinno
);
376 /* PE defines some extra fields; we zero them out for
378 in
->x_scn
.x_checksum
= 0;
379 in
->x_scn
.x_associated
= 0;
380 in
->x_scn
.x_comdat
= 0;
387 in
->x_sym
.x_tagndx
.l
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
388 in
->x_sym
.x_tvndx
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
390 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
392 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= bfd_h_get_32(abfd
, (bfd_byte
*)
393 ext
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
);
394 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= bfd_h_get_32(abfd
, (bfd_byte
*)
395 ext
->x_sym
.x_fcnary
.x_fcn
.x_endndx
);
399 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
400 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
401 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
402 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
403 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
404 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
405 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
406 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
411 in
->x_sym
.x_misc
.x_fsize
= bfd_h_get_32 (abfd
, (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
415 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= bfd_h_get_16 (abfd
, (bfd_byte
*)
416 ext
->x_sym
.x_misc
.x_lnsz
.x_lnno
);
417 in
->x_sym
.x_misc
.x_lnsz
.x_size
= bfd_h_get_16 (abfd
, (bfd_byte
*)
418 ext
->x_sym
.x_misc
.x_lnsz
.x_size
);
422 /* The semicolon is because MSVC doesn't like labels at
429 _bfd_xcoff_swap_aux_out (abfd
, inp
, type
, class, indx
, numaux
, extp
)
434 int indx ATTRIBUTE_UNUSED
;
435 int numaux ATTRIBUTE_UNUSED
;
438 union internal_auxent
*in
= (union internal_auxent
*)inp
;
439 AUXENT
*ext
= (AUXENT
*)extp
;
441 memset((PTR
)ext
, 0, bfd_coff_auxesz (abfd
));
445 if (in
->x_file
.x_fname
[0] == 0)
447 PUTWORD (abfd
, 0, (bfd_byte
*) ext
->x_file
.x_n
.x_zeroes
);
449 in
->x_file
.x_n
.x_offset
,
450 (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
454 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
458 /* RS/6000 "csect" auxents */
461 if (indx
+ 1 == numaux
)
463 PUTWORD (abfd
, in
->x_csect
.x_scnlen
.l
,ext
->x_csect
.x_scnlen
);
464 PUTWORD (abfd
, in
->x_csect
.x_parmhash
, ext
->x_csect
.x_parmhash
);
465 PUTHALF (abfd
, in
->x_csect
.x_snhash
, ext
->x_csect
.x_snhash
);
466 /* We don't have to hack bitfields in x_smtyp because it's
467 defined by shifts-and-ands, which are equivalent on all
469 PUTBYTE (abfd
, in
->x_csect
.x_smtyp
, ext
->x_csect
.x_smtyp
);
470 PUTBYTE (abfd
, in
->x_csect
.x_smclas
, ext
->x_csect
.x_smclas
);
471 PUTWORD (abfd
, in
->x_csect
.x_stab
, ext
->x_csect
.x_stab
);
472 PUTHALF (abfd
, in
->x_csect
.x_snstab
, ext
->x_csect
.x_snstab
);
482 bfd_h_put_32(abfd
, in
->x_scn
.x_scnlen
, (bfd_byte
*) ext
->x_scn
.x_scnlen
);
483 bfd_h_put_16(abfd
, in
->x_scn
.x_nreloc
, (bfd_byte
*) ext
->x_scn
.x_nreloc
);
484 bfd_h_put_16(abfd
, in
->x_scn
.x_nlinno
, (bfd_byte
*) ext
->x_scn
.x_nlinno
);
490 PUTWORD (abfd
, in
->x_sym
.x_tagndx
.l
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
491 bfd_h_put_16 (abfd
, in
->x_sym
.x_tvndx
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
493 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
495 bfd_h_put_32 (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
,
496 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
);
497 PUTWORD (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
,
498 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_fcn
.x_endndx
);
502 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
503 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
504 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
505 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
506 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
507 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
508 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
509 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
513 PUTWORD (abfd
, in
->x_sym
.x_misc
.x_fsize
,
514 (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
517 bfd_h_put_16 (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
,
518 (bfd_byte
*)ext
->x_sym
.x_misc
.x_lnsz
.x_lnno
);
519 bfd_h_put_16 (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
,
520 (bfd_byte
*)ext
->x_sym
.x_misc
.x_lnsz
.x_size
);
524 return bfd_coff_auxesz (abfd
);
529 /* The XCOFF reloc table. Actually, XCOFF relocations specify the
530 bitsize and whether they are signed or not, along with a
531 conventional type. This table is for the types, which are used for
532 different algorithms for putting in the reloc. Many of these
533 relocs need special_function entries, which I have not written. */
536 reloc_howto_type xcoff_howto_table
[] =
538 /* Standard 32 bit relocation. */
541 2, /* size (0 = byte, 1 = short, 2 = long) */
543 false, /* pc_relative */
545 complain_overflow_bitfield
, /* complain_on_overflow */
546 0, /* special_function */
548 true, /* partial_inplace */
549 0xffffffff, /* src_mask */
550 0xffffffff, /* dst_mask */
551 false), /* pcrel_offset */
553 /* 32 bit relocation, but store negative value. */
556 -2, /* size (0 = byte, 1 = short, 2 = long) */
558 false, /* pc_relative */
560 complain_overflow_bitfield
, /* complain_on_overflow */
561 0, /* special_function */
563 true, /* partial_inplace */
564 0xffffffff, /* src_mask */
565 0xffffffff, /* dst_mask */
566 false), /* pcrel_offset */
568 /* 32 bit PC relative relocation. */
571 2, /* size (0 = byte, 1 = short, 2 = long) */
573 true, /* pc_relative */
575 complain_overflow_signed
, /* complain_on_overflow */
576 0, /* special_function */
578 true, /* partial_inplace */
579 0xffffffff, /* src_mask */
580 0xffffffff, /* dst_mask */
581 false), /* pcrel_offset */
583 /* 16 bit TOC relative relocation. */
586 1, /* size (0 = byte, 1 = short, 2 = long) */
588 false, /* pc_relative */
590 complain_overflow_bitfield
, /* complain_on_overflow */
591 0, /* special_function */
593 true, /* partial_inplace */
594 0xffff, /* src_mask */
595 0xffff, /* dst_mask */
596 false), /* pcrel_offset */
598 /* I don't really know what this is. */
601 2, /* size (0 = byte, 1 = short, 2 = long) */
603 false, /* pc_relative */
605 complain_overflow_bitfield
, /* complain_on_overflow */
606 0, /* special_function */
608 true, /* partial_inplace */
609 0xffffffff, /* src_mask */
610 0xffffffff, /* dst_mask */
611 false), /* pcrel_offset */
613 /* External TOC relative symbol. */
616 2, /* size (0 = byte, 1 = short, 2 = long) */
618 false, /* pc_relative */
620 complain_overflow_bitfield
, /* complain_on_overflow */
621 0, /* special_function */
623 true, /* partial_inplace */
624 0xffff, /* src_mask */
625 0xffff, /* dst_mask */
626 false), /* pcrel_offset */
628 /* Local TOC relative symbol. */
631 2, /* size (0 = byte, 1 = short, 2 = long) */
633 false, /* pc_relative */
635 complain_overflow_bitfield
, /* complain_on_overflow */
636 0, /* special_function */
638 true, /* partial_inplace */
639 0xffff, /* src_mask */
640 0xffff, /* dst_mask */
641 false), /* pcrel_offset */
645 /* Non modifiable absolute branch. */
648 2, /* size (0 = byte, 1 = short, 2 = long) */
650 false, /* pc_relative */
652 complain_overflow_bitfield
, /* complain_on_overflow */
653 0, /* special_function */
655 true, /* partial_inplace */
656 0x3fffffc, /* src_mask */
657 0x3fffffc, /* dst_mask */
658 false), /* pcrel_offset */
662 /* Non modifiable relative branch. */
663 HOWTO (0xa, /* type */
665 2, /* size (0 = byte, 1 = short, 2 = long) */
667 true, /* pc_relative */
669 complain_overflow_signed
, /* complain_on_overflow */
670 0, /* special_function */
672 true, /* partial_inplace */
673 0x3fffffc, /* src_mask */
674 0x3fffffc, /* dst_mask */
675 false), /* pcrel_offset */
680 HOWTO (0xc, /* type */
682 2, /* size (0 = byte, 1 = short, 2 = long) */
684 false, /* pc_relative */
686 complain_overflow_bitfield
, /* complain_on_overflow */
687 0, /* special_function */
689 true, /* partial_inplace */
690 0xffff, /* src_mask */
691 0xffff, /* dst_mask */
692 false), /* pcrel_offset */
695 HOWTO (0xd, /* type */
697 2, /* size (0 = byte, 1 = short, 2 = long) */
699 false, /* pc_relative */
701 complain_overflow_bitfield
, /* complain_on_overflow */
702 0, /* special_function */
704 true, /* partial_inplace */
705 0xffff, /* src_mask */
706 0xffff, /* dst_mask */
707 false), /* pcrel_offset */
711 /* Non-relocating reference. */
712 HOWTO (0xf, /* type */
714 2, /* size (0 = byte, 1 = short, 2 = long) */
716 false, /* pc_relative */
718 complain_overflow_bitfield
, /* complain_on_overflow */
719 0, /* special_function */
721 false, /* partial_inplace */
724 false), /* pcrel_offset */
729 /* TOC relative indirect load. */
730 HOWTO (0x12, /* type */
732 2, /* size (0 = byte, 1 = short, 2 = long) */
734 false, /* pc_relative */
736 complain_overflow_bitfield
, /* complain_on_overflow */
737 0, /* special_function */
739 true, /* partial_inplace */
740 0xffff, /* src_mask */
741 0xffff, /* dst_mask */
742 false), /* pcrel_offset */
744 /* TOC relative load address. */
745 HOWTO (0x13, /* type */
747 2, /* size (0 = byte, 1 = short, 2 = long) */
749 false, /* pc_relative */
751 complain_overflow_bitfield
, /* complain_on_overflow */
752 0, /* special_function */
754 true, /* partial_inplace */
755 0xffff, /* src_mask */
756 0xffff, /* dst_mask */
757 false), /* pcrel_offset */
759 /* Modifiable relative branch. */
760 HOWTO (0x14, /* type */
762 2, /* size (0 = byte, 1 = short, 2 = long) */
764 false, /* pc_relative */
766 complain_overflow_bitfield
, /* complain_on_overflow */
767 0, /* special_function */
768 "R_RRTBI", /* name */
769 true, /* partial_inplace */
770 0xffffffff, /* src_mask */
771 0xffffffff, /* dst_mask */
772 false), /* pcrel_offset */
774 /* Modifiable absolute branch. */
775 HOWTO (0x15, /* type */
777 2, /* size (0 = byte, 1 = short, 2 = long) */
779 false, /* pc_relative */
781 complain_overflow_bitfield
, /* complain_on_overflow */
782 0, /* special_function */
783 "R_RRTBA", /* name */
784 true, /* partial_inplace */
785 0xffffffff, /* src_mask */
786 0xffffffff, /* dst_mask */
787 false), /* pcrel_offset */
789 /* Modifiable call absolute indirect. */
790 HOWTO (0x16, /* type */
792 2, /* size (0 = byte, 1 = short, 2 = long) */
794 false, /* pc_relative */
796 complain_overflow_bitfield
, /* complain_on_overflow */
797 0, /* special_function */
799 true, /* partial_inplace */
800 0xffff, /* src_mask */
801 0xffff, /* dst_mask */
802 false), /* pcrel_offset */
804 /* Modifiable call relative. */
805 HOWTO (0x17, /* type */
807 2, /* size (0 = byte, 1 = short, 2 = long) */
809 false, /* pc_relative */
811 complain_overflow_bitfield
, /* complain_on_overflow */
812 0, /* special_function */
814 true, /* partial_inplace */
815 0xffff, /* src_mask */
816 0xffff, /* dst_mask */
817 false), /* pcrel_offset */
819 /* Modifiable branch absolute. */
820 HOWTO (0x18, /* type */
822 2, /* size (0 = byte, 1 = short, 2 = long) */
824 false, /* pc_relative */
826 complain_overflow_bitfield
, /* complain_on_overflow */
827 0, /* special_function */
829 true, /* partial_inplace */
830 0xffff, /* src_mask */
831 0xffff, /* dst_mask */
832 false), /* pcrel_offset */
834 /* Modifiable branch absolute. */
835 HOWTO (0x19, /* type */
837 2, /* size (0 = byte, 1 = short, 2 = long) */
839 false, /* pc_relative */
841 complain_overflow_bitfield
, /* complain_on_overflow */
842 0, /* special_function */
844 true, /* partial_inplace */
845 0xffff, /* src_mask */
846 0xffff, /* dst_mask */
847 false), /* pcrel_offset */
849 /* Modifiable branch relative. */
850 HOWTO (0x1a, /* type */
852 2, /* size (0 = byte, 1 = short, 2 = long) */
854 false, /* pc_relative */
856 complain_overflow_signed
, /* complain_on_overflow */
857 0, /* special_function */
859 true, /* partial_inplace */
860 0xffff, /* src_mask */
861 0xffff, /* dst_mask */
862 false), /* pcrel_offset */
864 /* Modifiable branch absolute. */
865 HOWTO (0x1b, /* type */
867 2, /* size (0 = byte, 1 = short, 2 = long) */
869 false, /* pc_relative */
871 complain_overflow_bitfield
, /* complain_on_overflow */
872 0, /* special_function */
874 true, /* partial_inplace */
875 0xffff, /* src_mask */
876 0xffff, /* dst_mask */
877 false), /* pcrel_offset */
881 4, /* size (0 = byte, 1 = short, 2 = long) */
883 false, /* pc_relative */
885 complain_overflow_bitfield
, /* complain_on_overflow */
886 0, /* special_function */
888 true, /* partial_inplace */
889 MINUS_ONE
, /* src_mask */
890 MINUS_ONE
, /* dst_mask */
891 false) /* pcrel_offset */
896 _bfd_xcoff_rtype2howto (relent
, internal
)
898 struct internal_reloc
*internal
;
900 relent
->howto
= xcoff_howto_table
+ internal
->r_type
;
902 /* Check for relocs we don't know of. */
904 >= sizeof (xcoff_howto_table
) / sizeof (xcoff_howto_table
[0]))
906 if (internal
->r_type
!= relent
->howto
->type
)
909 /* The r_size field of an XCOFF reloc encodes the bitsize of the
910 relocation, as well as indicating whether it is signed or not.
911 Doublecheck that the relocation information gathered from the
912 type matches this information. The bitsize is not significant
914 if (relent
->howto
->dst_mask
!= 0
915 && (relent
->howto
->bitsize
916 != ((unsigned int) internal
->r_size
& 0x3f) + 1))
919 if ((internal
->r_size
& 0x80) != 0
920 ? (relent
->howto
->complain_on_overflow
!= complain_overflow_signed
)
921 : (relent
->howto
->complain_on_overflow
!= complain_overflow_bitfield
))
927 _bfd_xcoff_reloc_type_lookup (abfd
, code
)
928 bfd
*abfd ATTRIBUTE_UNUSED
;
929 bfd_reloc_code_real_type code
;
933 case BFD_RELOC_PPC_B26
:
934 return &xcoff_howto_table
[0xa];
935 case BFD_RELOC_PPC_BA26
:
936 return &xcoff_howto_table
[8];
937 case BFD_RELOC_PPC_TOC16
:
938 return &xcoff_howto_table
[3];
941 return &xcoff_howto_table
[0];
943 return &xcoff_howto_table
[0x1c];
950 /* XCOFF archive support. The original version of this code was by
951 Damon A. Permezel. It was enhanced to permit cross support, and
952 writing archive files, by Ian Lance Taylor, Cygnus Support.
954 XCOFF uses its own archive format. Everything is hooked together
955 with file offset links, so it is possible to rapidly update an
956 archive in place. Of course, we don't do that. An XCOFF archive
957 has a real file header, not just an ARMAG string. The structure of
958 the file header and of each archive header appear below.
960 An XCOFF archive also has a member table, which is a list of
961 elements in the archive (you can get that by looking through the
962 linked list, but you have to read a lot more of the file). The
963 member table has a normal archive header with an empty name. It is
964 normally (and perhaps must be) the second to last entry in the
965 archive. The member table data is almost printable ASCII. It
966 starts with a 12 character decimal string which is the number of
967 entries in the table. For each entry it has a 12 character decimal
968 string which is the offset in the archive of that member. These
969 entries are followed by a series of null terminated strings which
970 are the member names for each entry.
972 Finally, an XCOFF archive has a global symbol table, which is what
973 we call the armap. The global symbol table has a normal archive
974 header with an empty name. It is normally (and perhaps must be)
975 the last entry in the archive. The contents start with a four byte
976 binary number which is the number of entries. This is followed by
977 a that many four byte binary numbers; each is the file offset of an
978 entry in the archive. These numbers are followed by a series of
979 null terminated strings, which are symbol names.
981 AIX 4.3 introduced a new archive format which can handle larger
982 files and also 32- and 64-bit objects in the same archive. The
983 things said above remain true except that there is now more than
984 one global symbol table. The one is used to index 32-bit objects,
985 the other for 64-bit objects.
987 The new archives (recognizable by the new ARMAG string) has larger
988 field lengths so that we cannot really share any code. Also we have
989 to take care that we are not generating the new form of archives
990 on AIX 4.2 or earlier systems. */
992 /* XCOFF archives use this as a magic string. Note that both strings
993 have the same length. */
997 /* Read in the armap of an XCOFF archive. */
1000 _bfd_xcoff_slurp_armap (abfd
)
1006 bfd_byte
*contents
, *cend
;
1011 if (xcoff_ardata (abfd
) == NULL
)
1013 bfd_has_map (abfd
) = false;
1017 if (! xcoff_big_format_p (abfd
))
1019 /* This is for the old format. */
1020 struct xcoff_ar_hdr hdr
;
1022 off
= strtol (xcoff_ardata (abfd
)->symoff
, (char **) NULL
, 10);
1025 bfd_has_map (abfd
) = false;
1029 if (bfd_seek (abfd
, off
, SEEK_SET
) != 0)
1032 /* The symbol table starts with a normal archive header. */
1033 if (bfd_read ((PTR
) &hdr
, SIZEOF_AR_HDR
, 1, abfd
) != SIZEOF_AR_HDR
)
1036 /* Skip the name (normally empty). */
1037 namlen
= strtol (hdr
.namlen
, (char **) NULL
, 10);
1038 if (bfd_seek (abfd
, ((namlen
+ 1) & ~1) + SXCOFFARFMAG
, SEEK_CUR
) != 0)
1041 sz
= strtol (hdr
.size
, (char **) NULL
, 10);
1043 /* Read in the entire symbol table. */
1044 contents
= (bfd_byte
*) bfd_alloc (abfd
, sz
);
1045 if (contents
== NULL
)
1047 if (bfd_read ((PTR
) contents
, 1, sz
, abfd
) != sz
)
1050 /* The symbol table starts with a four byte count. */
1051 c
= bfd_h_get_32 (abfd
, contents
);
1055 bfd_set_error (bfd_error_bad_value
);
1059 bfd_ardata (abfd
)->symdefs
= ((carsym
*)
1060 bfd_alloc (abfd
, c
* sizeof (carsym
)));
1061 if (bfd_ardata (abfd
)->symdefs
== NULL
)
1064 /* After the count comes a list of four byte file offsets. */
1065 for (i
= 0, arsym
= bfd_ardata (abfd
)->symdefs
, p
= contents
+ 4;
1067 ++i
, ++arsym
, p
+= 4)
1068 arsym
->file_offset
= bfd_h_get_32 (abfd
, p
);
1072 /* This is for the new format. */
1073 struct xcoff_ar_hdr_big hdr
;
1075 off
= strtol (xcoff_ardata_big (abfd
)->symoff
, (char **) NULL
, 10);
1078 bfd_has_map (abfd
) = false;
1082 if (bfd_seek (abfd
, off
, SEEK_SET
) != 0)
1085 /* The symbol table starts with a normal archive header. */
1086 if (bfd_read ((PTR
) &hdr
, SIZEOF_AR_HDR_BIG
, 1, abfd
)
1087 != SIZEOF_AR_HDR_BIG
)
1090 /* Skip the name (normally empty). */
1091 namlen
= strtol (hdr
.namlen
, (char **) NULL
, 10);
1092 if (bfd_seek (abfd
, ((namlen
+ 1) & ~1) + SXCOFFARFMAG
, SEEK_CUR
) != 0)
1095 /* XXX This actually has to be a call to strtoll (at least on 32-bit
1096 machines) since the field width is 20 and there numbers with more
1097 than 32 bits can be represented. */
1098 sz
= strtol (hdr
.size
, (char **) NULL
, 10);
1100 /* Read in the entire symbol table. */
1101 contents
= (bfd_byte
*) bfd_alloc (abfd
, sz
);
1102 if (contents
== NULL
)
1104 if (bfd_read ((PTR
) contents
, 1, sz
, abfd
) != sz
)
1107 /* The symbol table starts with an eight byte count. */
1108 c
= bfd_h_get_64 (abfd
, contents
);
1112 bfd_set_error (bfd_error_bad_value
);
1116 bfd_ardata (abfd
)->symdefs
= ((carsym
*)
1117 bfd_alloc (abfd
, c
* sizeof (carsym
)));
1118 if (bfd_ardata (abfd
)->symdefs
== NULL
)
1121 /* After the count comes a list of eight byte file offsets. */
1122 for (i
= 0, arsym
= bfd_ardata (abfd
)->symdefs
, p
= contents
+ 8;
1124 ++i
, ++arsym
, p
+= 8)
1125 arsym
->file_offset
= bfd_h_get_64 (abfd
, p
);
1128 /* After the file offsets come null terminated symbol names. */
1129 cend
= contents
+ sz
;
1130 for (i
= 0, arsym
= bfd_ardata (abfd
)->symdefs
;
1132 ++i
, ++arsym
, p
+= strlen ((char *) p
) + 1)
1136 bfd_set_error (bfd_error_bad_value
);
1139 arsym
->name
= (char *) p
;
1142 bfd_ardata (abfd
)->symdef_count
= c
;
1143 bfd_has_map (abfd
) = true;
1148 /* See if this is an XCOFF archive. */
1151 _bfd_xcoff_archive_p (abfd
)
1154 char magic
[SXCOFFARMAG
];
1156 if (bfd_read ((PTR
) magic
, SXCOFFARMAG
, 1, abfd
) != SXCOFFARMAG
)
1158 if (bfd_get_error () != bfd_error_system_call
)
1159 bfd_set_error (bfd_error_wrong_format
);
1163 if (strncmp (magic
, XCOFFARMAG
, SXCOFFARMAG
) != 0
1164 && strncmp (magic
, XCOFFARMAGBIG
, SXCOFFARMAG
) != 0)
1166 bfd_set_error (bfd_error_wrong_format
);
1170 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
1171 involves a cast, we can't do it as the left operand of
1173 abfd
->tdata
.aout_ar_data
=
1174 (struct artdata
*) bfd_zalloc (abfd
, sizeof (struct artdata
));
1176 if (bfd_ardata (abfd
) == (struct artdata
*) NULL
)
1179 bfd_ardata (abfd
)->cache
= NULL
;
1180 bfd_ardata (abfd
)->archive_head
= NULL
;
1181 bfd_ardata (abfd
)->symdefs
= NULL
;
1182 bfd_ardata (abfd
)->extended_names
= NULL
;
1184 /* Now handle the two formats. */
1185 if (magic
[1] != 'b')
1187 /* This is the old format. */
1188 struct xcoff_ar_file_hdr hdr
;
1190 /* Copy over the magic string. */
1191 memcpy (hdr
.magic
, magic
, SXCOFFARMAG
);
1193 /* Now read the rest of the file header. */
1194 if (bfd_read ((PTR
) &hdr
.memoff
, SIZEOF_AR_FILE_HDR
- SXCOFFARMAG
, 1,
1195 abfd
) != SIZEOF_AR_FILE_HDR
- SXCOFFARMAG
)
1197 if (bfd_get_error () != bfd_error_system_call
)
1198 bfd_set_error (bfd_error_wrong_format
);
1202 bfd_ardata (abfd
)->first_file_filepos
= strtol (hdr
.firstmemoff
,
1203 (char **) NULL
, 10);
1205 bfd_ardata (abfd
)->tdata
= bfd_zalloc (abfd
, SIZEOF_AR_FILE_HDR
);
1206 if (bfd_ardata (abfd
)->tdata
== NULL
)
1209 memcpy (bfd_ardata (abfd
)->tdata
, &hdr
, SIZEOF_AR_FILE_HDR
);
1213 /* This is the new format. */
1214 struct xcoff_ar_file_hdr_big hdr
;
1216 /* Copy over the magic string. */
1217 memcpy (hdr
.magic
, magic
, SXCOFFARMAG
);
1219 /* Now read the rest of the file header. */
1220 if (bfd_read ((PTR
) &hdr
.memoff
, SIZEOF_AR_FILE_HDR_BIG
- SXCOFFARMAG
, 1,
1221 abfd
) != SIZEOF_AR_FILE_HDR_BIG
- SXCOFFARMAG
)
1223 if (bfd_get_error () != bfd_error_system_call
)
1224 bfd_set_error (bfd_error_wrong_format
);
1228 /* XXX This actually has to be a call to strtoll (at least on 32-bit
1229 machines) since the field width is 20 and there numbers with more
1230 than 32 bits can be represented. */
1231 bfd_ardata (abfd
)->first_file_filepos
= strtol (hdr
.firstmemoff
,
1232 (char **) NULL
, 10);
1234 bfd_ardata (abfd
)->tdata
= bfd_zalloc (abfd
, SIZEOF_AR_FILE_HDR_BIG
);
1235 if (bfd_ardata (abfd
)->tdata
== NULL
)
1238 memcpy (bfd_ardata (abfd
)->tdata
, &hdr
, SIZEOF_AR_FILE_HDR_BIG
);
1241 if (! _bfd_xcoff_slurp_armap (abfd
))
1243 bfd_release (abfd
, bfd_ardata (abfd
));
1244 abfd
->tdata
.aout_ar_data
= (struct artdata
*) NULL
;
1251 /* Read the archive header in an XCOFF archive. */
1254 _bfd_xcoff_read_ar_hdr (abfd
)
1258 struct areltdata
*ret
;
1260 ret
= (struct areltdata
*) bfd_alloc (abfd
, sizeof (struct areltdata
));
1264 if (! xcoff_big_format_p (abfd
))
1266 struct xcoff_ar_hdr hdr
;
1267 struct xcoff_ar_hdr
*hdrp
;
1269 if (bfd_read ((PTR
) &hdr
, SIZEOF_AR_HDR
, 1, abfd
) != SIZEOF_AR_HDR
)
1275 namlen
= strtol (hdr
.namlen
, (char **) NULL
, 10);
1276 hdrp
= (struct xcoff_ar_hdr
*) bfd_alloc (abfd
,
1277 SIZEOF_AR_HDR
+ namlen
+ 1);
1283 memcpy (hdrp
, &hdr
, SIZEOF_AR_HDR
);
1284 if (bfd_read ((char *) hdrp
+ SIZEOF_AR_HDR
, 1, namlen
, abfd
) != namlen
)
1289 ((char *) hdrp
)[SIZEOF_AR_HDR
+ namlen
] = '\0';
1291 ret
->arch_header
= (char *) hdrp
;
1292 ret
->parsed_size
= strtol (hdr
.size
, (char **) NULL
, 10);
1293 ret
->filename
= (char *) hdrp
+ SIZEOF_AR_HDR
;
1297 struct xcoff_ar_hdr_big hdr
;
1298 struct xcoff_ar_hdr_big
*hdrp
;
1300 if (bfd_read ((PTR
) &hdr
, SIZEOF_AR_HDR_BIG
, 1, abfd
)
1301 != SIZEOF_AR_HDR_BIG
)
1307 namlen
= strtol (hdr
.namlen
, (char **) NULL
, 10);
1308 hdrp
= (struct xcoff_ar_hdr_big
*) bfd_alloc (abfd
,
1316 memcpy (hdrp
, &hdr
, SIZEOF_AR_HDR_BIG
);
1317 if (bfd_read ((char *) hdrp
+ SIZEOF_AR_HDR_BIG
, 1, namlen
, abfd
) != namlen
)
1322 ((char *) hdrp
)[SIZEOF_AR_HDR_BIG
+ namlen
] = '\0';
1324 ret
->arch_header
= (char *) hdrp
;
1325 /* XXX This actually has to be a call to strtoll (at least on 32-bit
1326 machines) since the field width is 20 and there numbers with more
1327 than 32 bits can be represented. */
1328 ret
->parsed_size
= strtol (hdr
.size
, (char **) NULL
, 10);
1329 ret
->filename
= (char *) hdrp
+ SIZEOF_AR_HDR_BIG
;
1332 /* Skip over the XCOFFARFMAG at the end of the file name. */
1333 if (bfd_seek (abfd
, (namlen
& 1) + SXCOFFARFMAG
, SEEK_CUR
) != 0)
1339 /* Open the next element in an XCOFF archive. */
1342 _bfd_xcoff_openr_next_archived_file (archive
, last_file
)
1348 if (xcoff_ardata (archive
) == NULL
)
1350 bfd_set_error (bfd_error_invalid_operation
);
1354 if (! xcoff_big_format_p (archive
))
1356 if (last_file
== NULL
)
1357 filestart
= bfd_ardata (archive
)->first_file_filepos
;
1359 filestart
= strtol (arch_xhdr (last_file
)->nextoff
, (char **) NULL
,
1363 || filestart
== strtol (xcoff_ardata (archive
)->memoff
,
1365 || filestart
== strtol (xcoff_ardata (archive
)->symoff
,
1366 (char **) NULL
, 10))
1368 bfd_set_error (bfd_error_no_more_archived_files
);
1374 if (last_file
== NULL
)
1375 filestart
= bfd_ardata (archive
)->first_file_filepos
;
1377 /* XXX These actually have to be a calls to strtoll (at least
1378 on 32-bit machines) since the fields's width is 20 and
1379 there numbers with more than 32 bits can be represented. */
1380 filestart
= strtol (arch_xhdr_big (last_file
)->nextoff
, (char **) NULL
,
1383 /* XXX These actually have to be calls to strtoll (at least on 32-bit
1384 machines) since the fields's width is 20 and there numbers with more
1385 than 32 bits can be represented. */
1387 || filestart
== strtol (xcoff_ardata_big (archive
)->memoff
,
1389 || filestart
== strtol (xcoff_ardata_big (archive
)->symoff
,
1390 (char **) NULL
, 10))
1392 bfd_set_error (bfd_error_no_more_archived_files
);
1397 return _bfd_get_elt_at_filepos (archive
, filestart
);
1400 /* Stat an element in an XCOFF archive. */
1403 _bfd_xcoff_generic_stat_arch_elt (abfd
, s
)
1407 if (abfd
->arelt_data
== NULL
)
1409 bfd_set_error (bfd_error_invalid_operation
);
1413 if (! xcoff_big_format_p (abfd
))
1415 struct xcoff_ar_hdr
*hdrp
= arch_xhdr (abfd
);
1417 s
->st_mtime
= strtol (hdrp
->date
, (char **) NULL
, 10);
1418 s
->st_uid
= strtol (hdrp
->uid
, (char **) NULL
, 10);
1419 s
->st_gid
= strtol (hdrp
->gid
, (char **) NULL
, 10);
1420 s
->st_mode
= strtol (hdrp
->mode
, (char **) NULL
, 8);
1421 s
->st_size
= arch_eltdata (abfd
)->parsed_size
;
1425 struct xcoff_ar_hdr_big
*hdrp
= arch_xhdr_big (abfd
);
1427 s
->st_mtime
= strtol (hdrp
->date
, (char **) NULL
, 10);
1428 s
->st_uid
= strtol (hdrp
->uid
, (char **) NULL
, 10);
1429 s
->st_gid
= strtol (hdrp
->gid
, (char **) NULL
, 10);
1430 s
->st_mode
= strtol (hdrp
->mode
, (char **) NULL
, 8);
1431 s
->st_size
= arch_eltdata (abfd
)->parsed_size
;
1437 /* Normalize a file name for inclusion in an archive. */
1440 normalize_filename (abfd
)
1444 const char *filename
;
1446 file
= bfd_get_filename (abfd
);
1447 filename
= strrchr (file
, '/');
1448 if (filename
!= NULL
)
1455 /* Write out an XCOFF armap. */
1459 xcoff_write_armap_old (abfd
, elength
, map
, orl_count
, stridx
)
1461 unsigned int elength ATTRIBUTE_UNUSED
;
1463 unsigned int orl_count
;
1466 struct xcoff_ar_hdr hdr
;
1468 unsigned char buf
[4];
1473 memset (&hdr
, 0, sizeof hdr
);
1474 sprintf (hdr
.size
, "%ld", (long) (4 + orl_count
* 4 + stridx
));
1475 sprintf (hdr
.nextoff
, "%d", 0);
1476 memcpy (hdr
.prevoff
, xcoff_ardata (abfd
)->memoff
, 12);
1477 sprintf (hdr
.date
, "%d", 0);
1478 sprintf (hdr
.uid
, "%d", 0);
1479 sprintf (hdr
.gid
, "%d", 0);
1480 sprintf (hdr
.mode
, "%d", 0);
1481 sprintf (hdr
.namlen
, "%d", 0);
1483 /* We need spaces, not null bytes, in the header. */
1484 for (p
= (char *) &hdr
; p
< (char *) &hdr
+ SIZEOF_AR_HDR
; p
++)
1488 if (bfd_write ((PTR
) &hdr
, SIZEOF_AR_HDR
, 1, abfd
) != SIZEOF_AR_HDR
1489 || bfd_write (XCOFFARFMAG
, 1, SXCOFFARFMAG
, abfd
) != SXCOFFARFMAG
)
1492 bfd_h_put_32 (abfd
, orl_count
, buf
);
1493 if (bfd_write (buf
, 1, 4, abfd
) != 4)
1496 sub
= abfd
->archive_head
;
1497 fileoff
= SIZEOF_AR_FILE_HDR
;
1499 while (sub
!= NULL
&& i
< orl_count
)
1503 while (((bfd
*) (map
[i
]).pos
) == sub
)
1505 bfd_h_put_32 (abfd
, fileoff
, buf
);
1506 if (bfd_write (buf
, 1, 4, abfd
) != 4)
1510 namlen
= strlen (normalize_filename (sub
));
1511 namlen
= (namlen
+ 1) &~ 1;
1512 fileoff
+= (SIZEOF_AR_HDR
1515 + arelt_size (sub
));
1516 fileoff
= (fileoff
+ 1) &~ 1;
1520 for (i
= 0; i
< orl_count
; i
++)
1525 name
= *map
[i
].name
;
1526 namlen
= strlen (name
);
1527 if (bfd_write (name
, 1, namlen
+ 1, abfd
) != namlen
+ 1)
1531 if ((stridx
& 1) != 0)
1536 if (bfd_write (&b
, 1, 1, abfd
) != 1)
1543 /* Write a single armap in the big format. */
1546 xcoff_write_one_armap_big (abfd
, map
, orl_count
, orl_ccount
, stridx
, bits64
,
1550 unsigned int orl_count
;
1551 unsigned int orl_ccount
;
1552 unsigned int stridx
;
1554 const char *prevoff
;
1557 struct xcoff_ar_hdr_big hdr
;
1559 unsigned char buf
[4];
1562 const bfd_arch_info_type
*arch_info
= NULL
;
1566 memset (&hdr
, 0, sizeof hdr
);
1567 /* XXX This call actually should use %lld (at least on 32-bit
1568 machines) since the fields's width is 20 and there numbers with
1569 more than 32 bits can be represented. */
1570 sprintf (hdr
.size
, "%ld", (long) (4 + orl_ccount
* 4 + stridx
));
1573 sprintf (hdr
.nextoff
, "%d", 0);
1577 /* Do explict cast to long to remove compiler warning. */
1578 sprintf (hdr
.nextoff
, "%ld", (strtol (prevoff
, (char **) NULL
, 10)
1579 + (long) (4 + orl_ccount
* 4 + stridx
)));
1582 memcpy (hdr
.prevoff
, prevoff
, sizeof (hdr
.prevoff
));
1583 sprintf (hdr
.date
, "%d", 0);
1584 sprintf (hdr
.uid
, "%d", 0);
1585 sprintf (hdr
.gid
, "%d", 0);
1586 sprintf (hdr
.mode
, "%d", 0);
1587 sprintf (hdr
.namlen
, "%d", 0);
1589 /* We need spaces, not null bytes, in the header. */
1590 for (p
= (char *) &hdr
; p
< (char *) &hdr
+ SIZEOF_AR_HDR_BIG
; p
++)
1594 memcpy (nextoff
, hdr
.nextoff
, sizeof (hdr
.nextoff
));
1596 if (bfd_write ((PTR
) &hdr
, SIZEOF_AR_HDR_BIG
, 1, abfd
) != SIZEOF_AR_HDR_BIG
1597 || bfd_write (XCOFFARFMAG
, 1, SXCOFFARFMAG
, abfd
) != SXCOFFARFMAG
)
1600 bfd_h_put_32 (abfd
, orl_ccount
, buf
);
1601 if (bfd_write (buf
, 1, 4, abfd
) != 4)
1604 sub
= abfd
->archive_head
;
1605 fileoff
= SIZEOF_AR_FILE_HDR_BIG
;
1607 while (sub
!= NULL
&& i
< orl_count
)
1611 if ((bfd_arch_bits_per_address ((bfd
*) map
[i
].pos
) == 64) == bits64
)
1612 while (((bfd
*) (map
[i
]).pos
) == sub
)
1614 bfd_h_put_32 (abfd
, fileoff
, buf
);
1615 if (bfd_write (buf
, 1, 4, abfd
) != 4)
1620 while (((bfd
*) (map
[i
]).pos
) == sub
)
1623 namlen
= strlen (normalize_filename (sub
));
1624 namlen
= (namlen
+ 1) &~ 1;
1625 fileoff
+= (SIZEOF_AR_HDR_BIG
1628 + arelt_size (sub
));
1629 fileoff
= (fileoff
+ 1) &~ 1;
1634 for (i
= 0; i
< orl_count
; i
++)
1638 bfd
*ob
= (bfd
*)map
[i
].pos
;
1640 if (ob
!= object_bfd
)
1641 arch_info
= bfd_get_arch_info (ob
);
1642 if ((arch_info
->bits_per_address
== 64) != bits64
)
1645 name
= *map
[i
].name
;
1646 namlen
= strlen (name
);
1647 if (bfd_write (name
, 1, namlen
+ 1, abfd
) != namlen
+ 1)
1651 if ((stridx
& 1) != 0)
1656 if (bfd_write (&b
, 1, 1, abfd
) != 1)
1664 xcoff_write_armap_big (abfd
, elength
, map
, orl_count
, stridx
)
1666 unsigned int elength ATTRIBUTE_UNUSED
;
1668 unsigned int orl_count
;
1672 unsigned int orl_count_32
, orl_count_64
;
1673 unsigned int stridx_32
, stridx_64
;
1674 const bfd_arch_info_type
*arch_info
= NULL
;
1677 /* First, we look through the symbols and work out which are
1678 from 32-bit objects and which from 64-bit ones. */
1684 for (i
= 0; i
< orl_count
; i
++)
1686 bfd
*ob
= (bfd
*)map
[i
].pos
;
1688 if (ob
!= object_bfd
)
1689 arch_info
= bfd_get_arch_info (ob
);
1690 len
= strlen (*map
[i
].name
) + 1;
1691 if (arch_info
->bits_per_address
== 64)
1703 /* A quick sanity check... */
1704 BFD_ASSERT (orl_count_64
+ orl_count_32
== orl_count
);
1705 /* Explicit cast to int for compiler. */
1706 BFD_ASSERT ((int)(stridx_64
+ stridx_32
) == stridx
);
1708 /* Now write out each map. */
1709 if (! xcoff_write_one_armap_big (abfd
, map
, orl_count
, orl_count_32
,
1711 xcoff_ardata_big (abfd
)->memoff
,
1712 xcoff_ardata_big (abfd
)->symoff
))
1714 if (! xcoff_write_one_armap_big (abfd
, map
, orl_count
, orl_count_64
,
1716 xcoff_ardata_big (abfd
)->symoff
,
1717 xcoff_ardata_big (abfd
)->symoff64
))
1724 _bfd_xcoff_write_armap (abfd
, elength
, map
, orl_count
, stridx
)
1726 unsigned int elength ATTRIBUTE_UNUSED
;
1728 unsigned int orl_count
;
1731 if (! xcoff_big_format_p (abfd
))
1732 return xcoff_write_armap_old (abfd
, elength
, map
, orl_count
, stridx
);
1734 return xcoff_write_armap_big (abfd
, elength
, map
, orl_count
, stridx
);
1737 /* Write out an XCOFF archive. We always write an entire archive,
1738 rather than fussing with the freelist and so forth. */
1741 xcoff_write_archive_contents_old (abfd
)
1744 struct xcoff_ar_file_hdr fhdr
;
1746 size_t total_namlen
;
1750 file_ptr prevoff
, nextoff
;
1753 struct xcoff_ar_hdr ahdr
;
1758 memset (&fhdr
, 0, sizeof fhdr
);
1759 strncpy (fhdr
.magic
, XCOFFARMAG
, SXCOFFARMAG
);
1760 sprintf (fhdr
.firstmemoff
, "%d", SIZEOF_AR_FILE_HDR
);
1761 sprintf (fhdr
.freeoff
, "%d", 0);
1765 for (sub
= abfd
->archive_head
; sub
!= NULL
; sub
= sub
->next
)
1768 total_namlen
+= strlen (normalize_filename (sub
)) + 1;
1770 offsets
= (file_ptr
*) bfd_alloc (abfd
, count
* sizeof (file_ptr
));
1771 if (offsets
== NULL
)
1774 if (bfd_seek (abfd
, SIZEOF_AR_FILE_HDR
, SEEK_SET
) != 0)
1777 makemap
= bfd_has_map (abfd
);
1780 nextoff
= SIZEOF_AR_FILE_HDR
;
1781 for (sub
= abfd
->archive_head
, i
= 0; sub
!= NULL
; sub
= sub
->next
, i
++)
1785 struct xcoff_ar_hdr
*ahdrp
;
1786 bfd_size_type remaining
;
1788 if (makemap
&& ! hasobjects
)
1790 if (bfd_check_format (sub
, bfd_object
))
1794 name
= normalize_filename (sub
);
1795 namlen
= strlen (name
);
1797 if (sub
->arelt_data
!= NULL
)
1798 ahdrp
= arch_xhdr (sub
);
1806 memset (&ahdr
, 0, sizeof ahdr
);
1808 if (stat (bfd_get_filename (sub
), &s
) != 0)
1810 bfd_set_error (bfd_error_system_call
);
1814 sprintf (ahdrp
->size
, "%ld", (long) s
.st_size
);
1815 sprintf (ahdrp
->date
, "%ld", (long) s
.st_mtime
);
1816 sprintf (ahdrp
->uid
, "%ld", (long) s
.st_uid
);
1817 sprintf (ahdrp
->gid
, "%ld", (long) s
.st_gid
);
1818 sprintf (ahdrp
->mode
, "%o", (unsigned int) s
.st_mode
);
1820 if (sub
->arelt_data
== NULL
)
1822 sub
->arelt_data
= bfd_alloc (sub
, sizeof (struct areltdata
));
1823 if (sub
->arelt_data
== NULL
)
1827 arch_eltdata (sub
)->parsed_size
= s
.st_size
;
1830 sprintf (ahdrp
->prevoff
, "%ld", (long) prevoff
);
1831 sprintf (ahdrp
->namlen
, "%ld", (long) namlen
);
1833 /* If the length of the name is odd, we write out the null byte
1834 after the name as well. */
1835 namlen
= (namlen
+ 1) &~ 1;
1837 remaining
= arelt_size (sub
);
1838 size
= (SIZEOF_AR_HDR
1843 BFD_ASSERT (nextoff
== bfd_tell (abfd
));
1845 offsets
[i
] = nextoff
;
1848 nextoff
+= size
+ (size
& 1);
1850 sprintf (ahdrp
->nextoff
, "%ld", (long) nextoff
);
1852 /* We need spaces, not null bytes, in the header. */
1853 for (p
= (char *) ahdrp
; p
< (char *) ahdrp
+ SIZEOF_AR_HDR
; p
++)
1857 if (bfd_write ((PTR
) ahdrp
, 1, SIZEOF_AR_HDR
, abfd
) != SIZEOF_AR_HDR
1858 || bfd_write ((PTR
) name
, 1, namlen
, abfd
) != namlen
1859 || (bfd_write ((PTR
) XCOFFARFMAG
, 1, SXCOFFARFMAG
, abfd
)
1863 if (bfd_seek (sub
, (file_ptr
) 0, SEEK_SET
) != 0)
1865 while (remaining
!= 0)
1868 bfd_byte buffer
[DEFAULT_BUFFERSIZE
];
1870 amt
= sizeof buffer
;
1871 if (amt
> remaining
)
1873 if (bfd_read (buffer
, 1, amt
, sub
) != amt
1874 || bfd_write (buffer
, 1, amt
, abfd
) != amt
)
1879 if ((size
& 1) != 0)
1884 if (bfd_write (&b
, 1, 1, abfd
) != 1)
1889 sprintf (fhdr
.lastmemoff
, "%ld", (long) prevoff
);
1891 /* Write out the member table. */
1893 BFD_ASSERT (nextoff
== bfd_tell (abfd
));
1894 sprintf (fhdr
.memoff
, "%ld", (long) nextoff
);
1896 memset (&ahdr
, 0, sizeof ahdr
);
1897 sprintf (ahdr
.size
, "%ld", (long) (12 + count
* 12 + total_namlen
));
1898 sprintf (ahdr
.prevoff
, "%ld", (long) prevoff
);
1899 sprintf (ahdr
.date
, "%d", 0);
1900 sprintf (ahdr
.uid
, "%d", 0);
1901 sprintf (ahdr
.gid
, "%d", 0);
1902 sprintf (ahdr
.mode
, "%d", 0);
1903 sprintf (ahdr
.namlen
, "%d", 0);
1905 size
= (SIZEOF_AR_HDR
1912 nextoff
+= size
+ (size
& 1);
1914 if (makemap
&& hasobjects
)
1915 sprintf (ahdr
.nextoff
, "%ld", (long) nextoff
);
1917 sprintf (ahdr
.nextoff
, "%d", 0);
1919 /* We need spaces, not null bytes, in the header. */
1920 for (p
= (char *) &ahdr
; p
< (char *) &ahdr
+ SIZEOF_AR_HDR
; p
++)
1924 if (bfd_write ((PTR
) &ahdr
, 1, SIZEOF_AR_HDR
, abfd
) != SIZEOF_AR_HDR
1925 || (bfd_write ((PTR
) XCOFFARFMAG
, 1, SXCOFFARFMAG
, abfd
)
1929 sprintf (decbuf
, "%-12ld", (long) count
);
1930 if (bfd_write ((PTR
) decbuf
, 1, 12, abfd
) != 12)
1932 for (i
= 0; i
< count
; i
++)
1934 sprintf (decbuf
, "%-12ld", (long) offsets
[i
]);
1935 if (bfd_write ((PTR
) decbuf
, 1, 12, abfd
) != 12)
1938 for (sub
= abfd
->archive_head
; sub
!= NULL
; sub
= sub
->next
)
1943 name
= normalize_filename (sub
);
1944 namlen
= strlen (name
);
1945 if (bfd_write ((PTR
) name
, 1, namlen
+ 1, abfd
) != namlen
+ 1)
1948 if ((size
& 1) != 0)
1953 if (bfd_write ((PTR
) &b
, 1, 1, abfd
) != 1)
1957 /* Write out the armap, if appropriate. */
1959 if (! makemap
|| ! hasobjects
)
1960 sprintf (fhdr
.symoff
, "%d", 0);
1963 BFD_ASSERT (nextoff
== bfd_tell (abfd
));
1964 sprintf (fhdr
.symoff
, "%ld", (long) nextoff
);
1965 bfd_ardata (abfd
)->tdata
= (PTR
) &fhdr
;
1966 if (! _bfd_compute_and_write_armap (abfd
, 0))
1970 /* Write out the archive file header. */
1972 /* We need spaces, not null bytes, in the header. */
1973 for (p
= (char *) &fhdr
; p
< (char *) &fhdr
+ SIZEOF_AR_FILE_HDR
; p
++)
1977 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0
1978 || (bfd_write ((PTR
) &fhdr
, SIZEOF_AR_FILE_HDR
, 1, abfd
) !=
1979 SIZEOF_AR_FILE_HDR
))
1986 xcoff_write_archive_contents_big (abfd
)
1989 struct xcoff_ar_file_hdr_big fhdr
;
1991 size_t total_namlen
;
1995 file_ptr prevoff
, nextoff
;
1998 struct xcoff_ar_hdr_big ahdr
;
2003 memset (&fhdr
, 0, sizeof fhdr
);
2004 strncpy (fhdr
.magic
, XCOFFARMAGBIG
, SXCOFFARMAG
);
2005 sprintf (fhdr
.firstmemoff
, "%d", SIZEOF_AR_FILE_HDR_BIG
);
2006 sprintf (fhdr
.freeoff
, "%d", 0);
2010 for (sub
= abfd
->archive_head
; sub
!= NULL
; sub
= sub
->next
)
2013 total_namlen
+= strlen (normalize_filename (sub
)) + 1;
2015 offsets
= (file_ptr
*) bfd_alloc (abfd
, count
* sizeof (file_ptr
));
2016 if (offsets
== NULL
)
2019 if (bfd_seek (abfd
, SIZEOF_AR_FILE_HDR_BIG
, SEEK_SET
) != 0)
2022 makemap
= bfd_has_map (abfd
);
2025 nextoff
= SIZEOF_AR_FILE_HDR_BIG
;
2026 for (sub
= abfd
->archive_head
, i
= 0; sub
!= NULL
; sub
= sub
->next
, i
++)
2030 struct xcoff_ar_hdr_big
*ahdrp
;
2031 bfd_size_type remaining
;
2033 if (makemap
&& ! hasobjects
)
2035 if (bfd_check_format (sub
, bfd_object
))
2039 name
= normalize_filename (sub
);
2040 namlen
= strlen (name
);
2042 if (sub
->arelt_data
!= NULL
)
2043 ahdrp
= arch_xhdr_big (sub
);
2051 memset (&ahdr
, 0, sizeof ahdr
);
2053 /* XXX This should actually be a call to stat64 (at least on
2054 32-bit machines). */
2055 if (stat (bfd_get_filename (sub
), &s
) != 0)
2057 bfd_set_error (bfd_error_system_call
);
2061 /* XXX This call actually should use %lld (at least on 32-bit
2062 machines) since the fields's width is 20 and there numbers with
2063 more than 32 bits can be represented. */
2064 sprintf (ahdrp
->size
, "%ld", (long) s
.st_size
);
2065 sprintf (ahdrp
->date
, "%ld", (long) s
.st_mtime
);
2066 sprintf (ahdrp
->uid
, "%ld", (long) s
.st_uid
);
2067 sprintf (ahdrp
->gid
, "%ld", (long) s
.st_gid
);
2068 sprintf (ahdrp
->mode
, "%o", (unsigned int) s
.st_mode
);
2070 if (sub
->arelt_data
== NULL
)
2072 sub
->arelt_data
= bfd_alloc (sub
, sizeof (struct areltdata
));
2073 if (sub
->arelt_data
== NULL
)
2077 arch_eltdata (sub
)->parsed_size
= s
.st_size
;
2080 /* XXX These calls actually should use %lld (at least on 32-bit
2081 machines) since the fields's width is 20 and there numbers with
2082 more than 32 bits can be represented. */
2083 sprintf (ahdrp
->prevoff
, "%ld", (long) prevoff
);
2084 sprintf (ahdrp
->namlen
, "%ld", (long) namlen
);
2086 /* If the length of the name is odd, we write out the null byte
2087 after the name as well. */
2088 namlen
= (namlen
+ 1) &~ 1;
2090 remaining
= arelt_size (sub
);
2091 size
= (SIZEOF_AR_HDR_BIG
2096 BFD_ASSERT (nextoff
== bfd_tell (abfd
));
2098 offsets
[i
] = nextoff
;
2101 nextoff
+= size
+ (size
& 1);
2103 sprintf (ahdrp
->nextoff
, "%ld", (long) nextoff
);
2105 /* We need spaces, not null bytes, in the header. */
2106 for (p
= (char *) ahdrp
; p
< (char *) ahdrp
+ SIZEOF_AR_HDR_BIG
; p
++)
2110 if (bfd_write ((PTR
) ahdrp
, 1, SIZEOF_AR_HDR_BIG
, abfd
)
2111 != SIZEOF_AR_HDR_BIG
2112 || bfd_write ((PTR
) name
, 1, namlen
, abfd
) != namlen
2113 || (bfd_write ((PTR
) XCOFFARFMAG
, 1, SXCOFFARFMAG
, abfd
)
2117 if (bfd_seek (sub
, (file_ptr
) 0, SEEK_SET
) != 0)
2119 while (remaining
!= 0)
2122 bfd_byte buffer
[DEFAULT_BUFFERSIZE
];
2124 amt
= sizeof buffer
;
2125 if (amt
> remaining
)
2127 if (bfd_read (buffer
, 1, amt
, sub
) != amt
2128 || bfd_write (buffer
, 1, amt
, abfd
) != amt
)
2133 if ((size
& 1) != 0)
2138 if (bfd_write (&b
, 1, 1, abfd
) != 1)
2143 /* XXX This call actually should use %lld (at least on 32-bit
2144 machines) since the fields's width is 20 and there numbers with
2145 more than 32 bits can be represented. */
2146 sprintf (fhdr
.lastmemoff
, "%ld", (long) prevoff
);
2148 /* Write out the member table. */
2150 BFD_ASSERT (nextoff
== bfd_tell (abfd
));
2151 /* XXX This call actually should use %lld (at least on 32-bit
2152 machines) since the fields's width is 20 and there numbers with
2153 more than 32 bits can be represented. */
2154 sprintf (fhdr
.memoff
, "%ld", (long) nextoff
);
2156 memset (&ahdr
, 0, sizeof ahdr
);
2157 /* XXX The next two calls actually should use %lld (at least on 32-bit
2158 machines) since the fields's width is 20 and there numbers with
2159 more than 32 bits can be represented. */
2160 sprintf (ahdr
.size
, "%ld", (long) (12 + count
* 12 + total_namlen
));
2161 sprintf (ahdr
.prevoff
, "%ld", (long) prevoff
);
2162 sprintf (ahdr
.date
, "%d", 0);
2163 sprintf (ahdr
.uid
, "%d", 0);
2164 sprintf (ahdr
.gid
, "%d", 0);
2165 sprintf (ahdr
.mode
, "%d", 0);
2166 sprintf (ahdr
.namlen
, "%d", 0);
2168 size
= (SIZEOF_AR_HDR_BIG
2175 nextoff
+= size
+ (size
& 1);
2177 if (makemap
&& hasobjects
)
2178 /* XXX This call actually should use %lld (at least on 32-bit
2179 machines) since the fields's width is 20 and there numbers with
2180 more than 32 bits can be represented. */
2181 sprintf (ahdr
.nextoff
, "%ld", (long) nextoff
);
2183 sprintf (ahdr
.nextoff
, "%d", 0);
2185 /* We need spaces, not null bytes, in the header. */
2186 for (p
= (char *) &ahdr
; p
< (char *) &ahdr
+ SIZEOF_AR_HDR_BIG
; p
++)
2190 if (bfd_write ((PTR
) &ahdr
, 1, SIZEOF_AR_HDR_BIG
, abfd
) != SIZEOF_AR_HDR_BIG
2191 || (bfd_write ((PTR
) XCOFFARFMAG
, 1, SXCOFFARFMAG
, abfd
)
2195 sprintf (decbuf
, "%-12ld", (long) count
);
2196 if (bfd_write ((PTR
) decbuf
, 1, 12, abfd
) != 12)
2198 for (i
= 0; i
< count
; i
++)
2200 sprintf (decbuf
, "%-12ld", (long) offsets
[i
]);
2201 if (bfd_write ((PTR
) decbuf
, 1, 12, abfd
) != 12)
2204 for (sub
= abfd
->archive_head
; sub
!= NULL
; sub
= sub
->next
)
2209 name
= normalize_filename (sub
);
2210 namlen
= strlen (name
);
2211 if (bfd_write ((PTR
) name
, 1, namlen
+ 1, abfd
) != namlen
+ 1)
2214 if ((size
& 1) != 0)
2219 if (bfd_write ((PTR
) &b
, 1, 1, abfd
) != 1)
2223 /* Write out the armap, if appropriate. */
2225 if (! makemap
|| ! hasobjects
)
2226 sprintf (fhdr
.symoff
, "%d", 0);
2229 BFD_ASSERT (nextoff
== bfd_tell (abfd
));
2230 /* XXX This call actually should use %lld (at least on 32-bit
2231 machines) since the fields's width is 20 and there numbers with
2232 more than 32 bits can be represented. */
2233 bfd_ardata (abfd
)->tdata
= (PTR
) &fhdr
;
2234 if (! _bfd_compute_and_write_armap (abfd
, 0))
2238 /* Write out the archive file header. */
2240 /* We need spaces, not null bytes, in the header. */
2241 for (p
= (char *) &fhdr
; p
< (char *) &fhdr
+ SIZEOF_AR_FILE_HDR_BIG
; p
++)
2245 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0
2246 || (bfd_write ((PTR
) &fhdr
, SIZEOF_AR_FILE_HDR_BIG
, 1, abfd
) !=
2247 SIZEOF_AR_FILE_HDR_BIG
))
2254 _bfd_xcoff_write_archive_contents (abfd
)
2257 if (! xcoff_big_format_p (abfd
))
2258 return xcoff_write_archive_contents_old (abfd
);
2260 return xcoff_write_archive_contents_big (abfd
);
2263 /* We can't use the usual coff_sizeof_headers routine, because AIX
2264 always uses an a.out header. */
2267 _bfd_xcoff_sizeof_headers (abfd
, reloc
)
2269 boolean reloc ATTRIBUTE_UNUSED
;
2274 if (xcoff_data (abfd
)->full_aouthdr
)
2277 size
+= SMALL_AOUTSZ
;
2278 size
+= abfd
->section_count
* SCNHSZ
;
2282 /* Routines to swap information in the XCOFF .loader section. If we
2283 ever need to write an XCOFF loader, this stuff will need to be
2284 moved to another file shared by the linker (which XCOFF calls the
2285 ``binder'') and the loader. */
2287 /* Swap in the ldhdr structure. */
2290 xcoff_swap_ldhdr_in (abfd
, s
, dst
)
2293 struct internal_ldhdr
*dst
;
2295 const struct external_ldhdr
*src
= (const struct external_ldhdr
*) s
;
2297 dst
->l_version
= bfd_get_32 (abfd
, src
->l_version
);
2298 dst
->l_nsyms
= bfd_get_32 (abfd
, src
->l_nsyms
);
2299 dst
->l_nreloc
= bfd_get_32 (abfd
, src
->l_nreloc
);
2300 dst
->l_istlen
= bfd_get_32 (abfd
, src
->l_istlen
);
2301 dst
->l_nimpid
= bfd_get_32 (abfd
, src
->l_nimpid
);
2302 dst
->l_impoff
= bfd_get_32 (abfd
, src
->l_impoff
);
2303 dst
->l_stlen
= bfd_get_32 (abfd
, src
->l_stlen
);
2304 dst
->l_stoff
= bfd_get_32 (abfd
, src
->l_stoff
);
2307 /* Swap out the ldhdr structure. */
2310 xcoff_swap_ldhdr_out (abfd
, src
, d
)
2312 const struct internal_ldhdr
*src
;
2315 struct external_ldhdr
*dst
= (struct external_ldhdr
*) d
;
2317 bfd_put_32 (abfd
, src
->l_version
, dst
->l_version
);
2318 bfd_put_32 (abfd
, src
->l_nsyms
, dst
->l_nsyms
);
2319 bfd_put_32 (abfd
, src
->l_nreloc
, dst
->l_nreloc
);
2320 bfd_put_32 (abfd
, src
->l_istlen
, dst
->l_istlen
);
2321 bfd_put_32 (abfd
, src
->l_nimpid
, dst
->l_nimpid
);
2322 bfd_put_32 (abfd
, src
->l_impoff
, dst
->l_impoff
);
2323 bfd_put_32 (abfd
, src
->l_stlen
, dst
->l_stlen
);
2324 bfd_put_32 (abfd
, src
->l_stoff
, dst
->l_stoff
);
2327 /* Swap in the ldsym structure. */
2330 xcoff_swap_ldsym_in (abfd
, s
, dst
)
2333 struct internal_ldsym
*dst
;
2335 const struct external_ldsym
*src
= (const struct external_ldsym
*) s
;
2337 if (bfd_get_32 (abfd
, src
->_l
._l_l
._l_zeroes
) != 0) {
2338 memcpy (dst
->_l
._l_name
, src
->_l
._l_name
, SYMNMLEN
);
2340 dst
->_l
._l_l
._l_zeroes
= 0;
2341 dst
->_l
._l_l
._l_offset
= bfd_get_32 (abfd
, src
->_l
._l_l
._l_offset
);
2343 dst
->l_value
= bfd_get_32 (abfd
, src
->l_value
);
2344 dst
->l_scnum
= bfd_get_16 (abfd
, src
->l_scnum
);
2345 dst
->l_smtype
= bfd_get_8 (abfd
, src
->l_smtype
);
2346 dst
->l_smclas
= bfd_get_8 (abfd
, src
->l_smclas
);
2347 dst
->l_ifile
= bfd_get_32 (abfd
, src
->l_ifile
);
2348 dst
->l_parm
= bfd_get_32 (abfd
, src
->l_parm
);
2351 /* Swap out the ldsym structure. */
2354 xcoff_swap_ldsym_out (abfd
, src
, d
)
2356 const struct internal_ldsym
*src
;
2359 struct external_ldsym
*dst
= (struct external_ldsym
*) d
;
2361 if (src
->_l
._l_l
._l_zeroes
!= 0)
2362 memcpy (dst
->_l
._l_name
, src
->_l
._l_name
, SYMNMLEN
);
2365 bfd_put_32 (abfd
, 0, dst
->_l
._l_l
._l_zeroes
);
2366 bfd_put_32 (abfd
, src
->_l
._l_l
._l_offset
, dst
->_l
._l_l
._l_offset
);
2368 bfd_put_32 (abfd
, src
->l_value
, dst
->l_value
);
2369 bfd_put_16 (abfd
, src
->l_scnum
, dst
->l_scnum
);
2370 bfd_put_8 (abfd
, src
->l_smtype
, dst
->l_smtype
);
2371 bfd_put_8 (abfd
, src
->l_smclas
, dst
->l_smclas
);
2372 bfd_put_32 (abfd
, src
->l_ifile
, dst
->l_ifile
);
2373 bfd_put_32 (abfd
, src
->l_parm
, dst
->l_parm
);
2376 /* Swap in the ldrel structure. */
2379 xcoff_swap_ldrel_in (abfd
, s
, dst
)
2382 struct internal_ldrel
*dst
;
2384 const struct external_ldrel
*src
= (const struct external_ldrel
*) s
;
2386 dst
->l_vaddr
= bfd_get_32 (abfd
, src
->l_vaddr
);
2387 dst
->l_symndx
= bfd_get_32 (abfd
, src
->l_symndx
);
2388 dst
->l_rtype
= bfd_get_16 (abfd
, src
->l_rtype
);
2389 dst
->l_rsecnm
= bfd_get_16 (abfd
, src
->l_rsecnm
);
2392 /* Swap out the ldrel structure. */
2395 xcoff_swap_ldrel_out (abfd
, src
, d
)
2397 const struct internal_ldrel
*src
;
2400 struct external_ldrel
*dst
= (struct external_ldrel
*) d
;
2402 bfd_put_32 (abfd
, src
->l_vaddr
, dst
->l_vaddr
);
2403 bfd_put_32 (abfd
, src
->l_symndx
, dst
->l_symndx
);
2404 bfd_put_16 (abfd
, src
->l_rtype
, dst
->l_rtype
);
2405 bfd_put_16 (abfd
, src
->l_rsecnm
, dst
->l_rsecnm
);
2410 /* This is the relocation function for the RS/6000/POWER/PowerPC.
2411 This is currently the only processor which uses XCOFF; I hope that
2412 will never change. */
2415 xcoff_ppc_relocate_section (output_bfd
, info
, input_bfd
,
2416 input_section
, contents
, relocs
, syms
,
2419 struct bfd_link_info
*info
;
2421 asection
*input_section
;
2423 struct internal_reloc
*relocs
;
2424 struct internal_syment
*syms
;
2425 asection
**sections
;
2427 struct internal_reloc
*rel
;
2428 struct internal_reloc
*relend
;
2431 relend
= rel
+ input_section
->reloc_count
;
2433 for (; rel
< relend
; rel
++)
2436 struct xcoff_link_hash_entry
*h
;
2437 struct internal_syment
*sym
;
2440 struct reloc_howto_struct howto
;
2441 bfd_reloc_status_type rstat
;
2443 /* Relocation type R_REF is a special relocation type which is
2444 merely used to prevent garbage collection from occurring for
2445 the csect including the symbol which it references. */
2446 if (rel
->r_type
== R_REF
)
2449 symndx
= rel
->r_symndx
;
2459 h
= obj_xcoff_sym_hashes (input_bfd
)[symndx
];
2460 sym
= syms
+ symndx
;
2461 addend
= - sym
->n_value
;
2465 /* We build the howto information on the fly. */
2467 howto
.type
= rel
->r_type
;
2468 howto
.rightshift
= 0;
2470 howto
.bitsize
= (rel
->r_size
& 0x1f) + 1;
2471 howto
.pc_relative
= false;
2473 if ((rel
->r_size
& 0x80) != 0)
2474 howto
.complain_on_overflow
= complain_overflow_signed
;
2476 howto
.complain_on_overflow
= complain_overflow_bitfield
;
2477 howto
.special_function
= NULL
;
2478 howto
.name
= "internal";
2479 howto
.partial_inplace
= true;
2480 if (howto
.bitsize
== 32)
2481 howto
.src_mask
= howto
.dst_mask
= 0xffffffff;
2484 howto
.src_mask
= howto
.dst_mask
= (1 << howto
.bitsize
) - 1;
2485 if (howto
.bitsize
== 16)
2488 howto
.pcrel_offset
= false;
2498 sec
= bfd_abs_section_ptr
;
2503 sec
= sections
[symndx
];
2504 /* Hack to make sure we use the right TOC anchor value
2505 if this reloc is against the TOC anchor. */
2507 if (sec
->name
[3] == '0'
2508 && strcmp (sec
->name
, ".tc0") == 0)
2510 val
= xcoff_data (output_bfd
)->toc
;
2514 val
= (sec
->output_section
->vma
2515 + sec
->output_offset
2523 if (h
->root
.type
== bfd_link_hash_defined
2524 || h
->root
.type
== bfd_link_hash_defweak
)
2528 sec
= h
->root
.u
.def
.section
;
2529 val
= (h
->root
.u
.def
.value
2530 + sec
->output_section
->vma
2531 + sec
->output_offset
);
2533 else if (h
->root
.type
== bfd_link_hash_common
)
2537 sec
= h
->root
.u
.c
.p
->section
;
2538 val
= (sec
->output_section
->vma
2539 + sec
->output_offset
);
2541 else if ((h
->flags
& XCOFF_DEF_DYNAMIC
) != 0
2542 || (h
->flags
& XCOFF_IMPORT
) != 0)
2544 /* Every symbol in a shared object is defined somewhere. */
2547 else if (! info
->relocateable
)
2549 if (! ((*info
->callbacks
->undefined_symbol
)
2550 (info
, h
->root
.root
.string
, input_bfd
, input_section
,
2551 rel
->r_vaddr
- input_section
->vma
, true)))
2554 /* Don't try to process the reloc. It can't help, and
2555 it may generate another error. */
2560 /* I took the relocation type definitions from two documents:
2561 the PowerPC AIX Version 4 Application Binary Interface, First
2562 Edition (April 1992), and the PowerOpen ABI, Big-Endian
2563 32-Bit Hardware Implementation (June 30, 1994). Differences
2564 between the documents are noted below. */
2566 switch (rel
->r_type
)
2571 /* These relocs are defined by the PowerPC ABI to be
2572 relative branches which use half of the difference
2573 between the symbol and the program counter. I can't
2574 quite figure out when this is useful. These relocs are
2575 not defined by the PowerOpen ABI. */
2577 (*_bfd_error_handler
)
2578 (_("%s: unsupported relocation type 0x%02x"),
2579 bfd_get_filename (input_bfd
), (unsigned int) rel
->r_type
);
2580 bfd_set_error (bfd_error_bad_value
);
2583 /* Simple positive relocation. */
2586 /* Simple negative relocation. */
2590 /* Simple PC relative relocation. */
2591 howto
.pc_relative
= true;
2594 /* TOC relative relocation. The value in the instruction in
2595 the input file is the offset from the input file TOC to
2596 the desired location. We want the offset from the final
2597 TOC to the desired location. We have:
2602 so we must change insn by on - in.
2605 /* Global linkage relocation. The value of this relocation
2606 is the address of the entry in the TOC section. */
2608 /* Local object TOC address. I can't figure out the
2609 difference between this and case R_GL. */
2611 /* TOC relative relocation. A TOC relative load instruction
2612 which may be changed to a load address instruction.
2613 FIXME: We don't currently implement this optimization. */
2615 /* TOC relative relocation. This is a TOC relative load
2616 address instruction which may be changed to a load
2617 instruction. FIXME: I don't know if this is the correct
2619 if (h
!= NULL
&& h
->smclas
!= XMC_TD
)
2621 if (h
->toc_section
== NULL
)
2623 (*_bfd_error_handler
)
2624 (_("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry"),
2625 bfd_get_filename (input_bfd
), rel
->r_vaddr
,
2626 h
->root
.root
.string
);
2627 bfd_set_error (bfd_error_bad_value
);
2631 BFD_ASSERT ((h
->flags
& XCOFF_SET_TOC
) == 0);
2632 val
= (h
->toc_section
->output_section
->vma
2633 + h
->toc_section
->output_offset
);
2636 val
= ((val
- xcoff_data (output_bfd
)->toc
)
2637 - (sym
->n_value
- xcoff_data (input_bfd
)->toc
));
2641 /* Absolute branch. We don't want to mess with the lower
2642 two bits of the instruction. */
2644 /* The PowerPC ABI defines this as an absolute call which
2645 may be modified to become a relative call. The PowerOpen
2646 ABI does not define this relocation type. */
2648 /* Absolute branch which may be modified to become a
2651 /* The PowerPC ABI defines this as an absolute branch to a
2652 fixed address which may be modified to an absolute branch
2653 to a symbol. The PowerOpen ABI does not define this
2656 /* The PowerPC ABI defines this as an absolute branch to a
2657 fixed address which may be modified to a relative branch.
2658 The PowerOpen ABI does not define this relocation type. */
2659 howto
.src_mask
&= ~3;
2660 howto
.dst_mask
= howto
.src_mask
;
2663 /* Relative branch. We don't want to mess with the lower
2664 two bits of the instruction. */
2666 /* The PowerPC ABI defines this as a relative call which may
2667 be modified to become an absolute call. The PowerOpen
2668 ABI does not define this relocation type. */
2670 /* A relative branch which may be modified to become an
2671 absolute branch. FIXME: We don't implement this,
2672 although we should for symbols of storage mapping class
2674 howto
.pc_relative
= true;
2675 howto
.src_mask
&= ~3;
2676 howto
.dst_mask
= howto
.src_mask
;
2679 /* The PowerPC AIX ABI describes this as a load which may be
2680 changed to a load address. The PowerOpen ABI says this
2681 is the same as case R_POS. */
2684 /* The PowerPC AIX ABI describes this as a load address
2685 which may be changed to a load. The PowerOpen ABI says
2686 this is the same as R_POS. */
2690 /* If we see an R_BR or R_RBR reloc which is jumping to global
2691 linkage code, and it is followed by an appropriate cror nop
2692 instruction, we replace the cror with lwz r2,20(r1). This
2693 restores the TOC after the glink code. Contrariwise, if the
2694 call is followed by a lwz r2,20(r1), but the call is not
2695 going to global linkage code, we can replace the load with a
2697 if ((rel
->r_type
== R_BR
|| rel
->r_type
== R_RBR
)
2699 && h
->root
.type
== bfd_link_hash_defined
2700 && (rel
->r_vaddr
- input_section
->vma
+ 8
2701 <= input_section
->_cooked_size
))
2706 pnext
= contents
+ (rel
->r_vaddr
- input_section
->vma
) + 4;
2707 next
= bfd_get_32 (input_bfd
, pnext
);
2709 /* The _ptrgl function is magic. It is used by the AIX
2710 compiler to call a function through a pointer. */
2711 if (h
->smclas
== XMC_GL
2712 || strcmp (h
->root
.root
.string
, "._ptrgl") == 0)
2714 if (next
== 0x4def7b82 /* cror 15,15,15 */
2715 || next
== 0x4ffffb82 /* cror 31,31,31 */
2716 || next
== 0x60000000) /* ori r0,r0,0 */
2717 bfd_put_32 (input_bfd
, 0x80410014, pnext
); /* lwz r1,20(r1) */
2721 if (next
== 0x80410014) /* lwz r1,20(r1) */
2722 bfd_put_32 (input_bfd
, 0x60000000, pnext
); /* ori r0,r0,0 */
2726 /* A PC relative reloc includes the section address. */
2727 if (howto
.pc_relative
)
2728 addend
+= input_section
->vma
;
2730 rstat
= _bfd_final_link_relocate (&howto
, input_bfd
, input_section
,
2732 rel
->r_vaddr
- input_section
->vma
,
2741 case bfd_reloc_overflow
:
2744 char buf
[SYMNMLEN
+ 1];
2745 char howto_name
[10];
2750 name
= h
->root
.root
.string
;
2753 name
= _bfd_coff_internal_syment_name (input_bfd
, sym
, buf
);
2758 sprintf (howto_name
, "0x%02x", rel
->r_type
);
2760 if (! ((*info
->callbacks
->reloc_overflow
)
2761 (info
, name
, howto_name
, (bfd_vma
) 0, input_bfd
,
2762 input_section
, rel
->r_vaddr
- input_section
->vma
)))
2772 _bfd_xcoff_put_ldsymbol_name (abfd
, ldinfo
, ldsym
, name
)
2773 bfd
*abfd ATTRIBUTE_UNUSED
;
2774 struct xcoff_loader_info
*ldinfo
;
2775 struct internal_ldsym
*ldsym
;
2779 len
= strlen (name
);
2781 if (len
<= SYMNMLEN
)
2782 strncpy (ldsym
->_l
._l_name
, name
, SYMNMLEN
);
2785 if (ldinfo
->string_size
+ len
+ 3 > ldinfo
->string_alc
)
2788 bfd_byte
*newstrings
;
2790 newalc
= ldinfo
->string_alc
* 2;
2793 while (ldinfo
->string_size
+ len
+ 3 > newalc
)
2796 newstrings
= ((bfd_byte
*)
2797 bfd_realloc ((PTR
) ldinfo
->strings
, newalc
));
2798 if (newstrings
== NULL
)
2800 ldinfo
->failed
= true;
2803 ldinfo
->string_alc
= newalc
;
2804 ldinfo
->strings
= newstrings
;
2807 bfd_put_16 (ldinfo
->output_bfd
, len
+ 1,
2808 ldinfo
->strings
+ ldinfo
->string_size
);
2809 strcpy (ldinfo
->strings
+ ldinfo
->string_size
+ 2, name
);
2810 ldsym
->_l
._l_l
._l_zeroes
= 0;
2811 ldsym
->_l
._l_l
._l_offset
= ldinfo
->string_size
+ 2;
2812 ldinfo
->string_size
+= len
+ 3;
2819 _bfd_xcoff_put_symbol_name (bfd
*abfd
, struct bfd_strtab_hash
*strtab
,
2820 struct internal_syment
*sym
,
2823 if (strlen (name
) <= SYMNMLEN
)
2825 strncpy (sym
->_n
._n_name
, name
, SYMNMLEN
);
2833 if ((abfd
->flags
& BFD_TRADITIONAL_FORMAT
) != 0)
2835 indx
= _bfd_stringtab_add (strtab
, name
, hash
, false);
2836 if (indx
== (bfd_size_type
) -1)
2838 sym
->_n
._n_n
._n_zeroes
= 0;
2839 sym
->_n
._n_n
._n_offset
= STRING_SIZE_SIZE
+ indx
;
2845 xcoff_create_csect_from_smclas (abfd
, aux
, symbol_name
)
2847 union internal_auxent
*aux
;
2848 const char *symbol_name
;
2850 asection
*return_value
= NULL
;
2852 /* .sv64 = x_smclas == 17
2853 This is an invalid csect for 32 bit apps. */
2854 static const char *names
[19] =
2856 ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
2857 ".sv", ".bs", ".ds", ".uc", ".ti", ".tb", NULL
, ".tc0",
2858 ".td", NULL
, ".sv3264"
2861 if ((19 >= aux
->x_csect
.x_smclas
) &&
2862 (NULL
!= names
[aux
->x_csect
.x_smclas
]))
2864 return_value
= bfd_make_section_anyway
2865 (abfd
, names
[aux
->x_csect
.x_smclas
]);
2869 (*_bfd_error_handler
)
2870 (_("%s: symbol `%s' has unrecognized smclas %d"),
2871 bfd_get_filename (abfd
), symbol_name
, aux
->x_csect
.x_smclas
);
2872 bfd_set_error (bfd_error_bad_value
);
2875 return return_value
;
2879 xcoff_is_lineno_count_overflow (abfd
, value
)
2880 bfd
*abfd ATTRIBUTE_UNUSED
;
2883 if (0xffff <= value
)
2890 xcoff_is_reloc_count_overflow (abfd
, value
)
2891 bfd
*abfd ATTRIBUTE_UNUSED
;
2894 if (0xffff <= value
)
2901 xcoff_loader_symbol_offset (abfd
, ldhdr
)
2903 struct internal_ldhdr
*ldhdr ATTRIBUTE_UNUSED
;
2905 return bfd_xcoff_ldhdrsz(abfd
);
2909 xcoff_loader_reloc_offset (abfd
, ldhdr
)
2911 struct internal_ldhdr
*ldhdr
;
2913 return bfd_xcoff_ldhdrsz(abfd
) +
2914 (ldhdr
->l_nsyms
* bfd_xcoff_ldsymsz(abfd
));
2918 static reloc_howto_type xcoff_dynamic_reloc
=
2919 HOWTO (0, /* type */
2921 2, /* size (0 = byte, 1 = short, 2 = long) */
2923 false, /* pc_relative */
2925 complain_overflow_bitfield
, /* complain_on_overflow */
2926 0, /* special_function */
2928 true, /* partial_inplace */
2929 0xffffffff, /* src_mask */
2930 0xffffffff, /* dst_mask */
2931 false); /* pcrel_offset */
2935 The first word of global linkage code must be modified by filling in
2936 the correct TOC offset. */
2938 static unsigned long xcoff_glink_code
[9] =
2940 0x81820000, /* lwz r12,0(r2) */
2941 0x90410014, /* stw r2,20(r1) */
2942 0x800c0000, /* lwz r0,0(r12) */
2943 0x804c0004, /* lwz r2,4(r12) */
2944 0x7c0903a6, /* mtctr r0 */
2945 0x4e800420, /* bctr */
2946 0x00000000, /* start of traceback table */
2947 0x000c8000, /* traceback table */
2948 0x00000000, /* traceback table */
2952 static const struct xcoff_backend_data_rec bfd_xcoff_backend_data
=
2954 { /* COFF backend, defined in libcoff.h. */
2955 _bfd_xcoff_swap_aux_in
, /* _bfd_coff_swap_aux_in */
2956 _bfd_xcoff_swap_sym_in
, /* _bfd_coff_swap_sym_in */
2957 coff_swap_lineno_in
, /* _bfd_coff_swap_lineno_in */
2958 _bfd_xcoff_swap_aux_out
, /* _bfd_swap_aux_out */
2959 _bfd_xcoff_swap_sym_out
, /* _bfd_swap_sym_out */
2960 coff_swap_lineno_out
, /* _bfd_swap_lineno_out */
2961 coff_swap_reloc_out
, /* _bfd_swap_reloc_out */
2962 coff_swap_filehdr_out
, /* _bfd_swap_filehdr_out */
2963 coff_swap_aouthdr_out
, /* _bfd_swap_aouthdr_out */
2964 coff_swap_scnhdr_out
, /* _bfd_swap_scnhdr_out */
2965 FILHSZ
, /* _bfd_filhsz */
2966 AOUTSZ
, /* _bfd_aoutsz */
2967 SCNHSZ
, /* _bfd_scnhsz */
2968 SYMESZ
, /* _bfd_symesz */
2969 AUXESZ
, /* _bfd_auxesz */
2970 RELSZ
, /* _bfd_relsz */
2971 LINESZ
, /* _bfd_linesz */
2972 FILNMLEN
, /* _bfd_filnmlen */
2973 true, /* _bfd_coff_long_filenames */
2974 false, /* _bfd_coff_long_section_names */
2975 (3), /* _bfd_coff_default_section_alignment_power */
2976 false, /* _bfd_coff_force_symnames_in_strings */
2977 2, /* _bfd_coff_debug_string_prefix_length */
2978 coff_swap_filehdr_in
, /* _bfd_coff_swap_filehdr_in */
2979 coff_swap_aouthdr_in
, /* _bfd_swap_aouthdr_in */
2980 coff_swap_scnhdr_in
, /* _bfd_swap_scnhdr_in */
2981 coff_swap_reloc_in
, /* _bfd_reloc_in */
2982 coff_bad_format_hook
, /* _bfd_bad_format_hook */
2983 coff_set_arch_mach_hook
, /* _bfd_set_arch_mach_hook */
2984 coff_mkobject_hook
, /* _bfd_mkobject_hook */
2985 styp_to_sec_flags
, /* _bfd_syp_to_sec_flags */
2986 coff_set_alignment_hook
, /* _bfd_set_alignment_hook */
2987 coff_slurp_symbol_table
, /* _bfd_coff_slurp_symbol_table */
2988 symname_in_debug_hook
, /* _coff_symname_in_debug_hook */
2989 coff_pointerize_aux_hook
, /* _bfd_coff_pointerize_aux_hook */
2990 coff_print_aux
, /* bfd_coff_print_aux */
2991 dummy_reloc16_extra_cases
, /* _bfd_coff_reloc16_extra_cases */
2992 dummy_reloc16_estimate
, /* _bfd_coff_reloc16_estimate */
2993 NULL
, /* bfd_coff_sym_is_global */
2994 coff_compute_section_file_positions
, /* _bfd_coff_compute_section_file_positions */
2995 NULL
, /* _bfd_coff_start_final_link */
2996 xcoff_ppc_relocate_section
, /* _bfd_coff_relocate_section */
2997 coff_rtype_to_howto
, /* _bfd_coff_rtype_to_howto */
2998 NULL
, /* _bfd_coff_addust_symndx */
2999 _bfd_generic_link_add_one_symbol
, /* _bfd_coff_add_one_symbol */
3000 coff_link_output_has_begun
, /* _bfd_coff_link_output_has_begun */
3001 coff_final_link_postscript
/* _bfd_coff_final_link_postscript */
3004 0x01DF, /* magic number */
3005 bfd_arch_rs6000
, /* architecture */
3006 bfd_mach_rs6k
, /* machine */
3008 /* Function pointers to xcoff specific swap routines. */
3009 xcoff_swap_ldhdr_in
, /* _xcoff_swap_ldhdr_in */
3010 xcoff_swap_ldhdr_out
, /* _xcoff_swap_ldhdr_out */
3011 xcoff_swap_ldsym_in
, /* _xcoff_swap_ldsym_in */
3012 xcoff_swap_ldsym_out
, /* _xcoff_swap_ldsym_out */
3013 xcoff_swap_ldrel_in
, /* _xcoff_swap_ldrel_in */
3014 xcoff_swap_ldrel_out
, /* _xcoff_swap_ldrel_out */
3017 LDHDRSZ
, /* _xcoff_ldhdrsz */
3018 LDSYMSZ
, /* _xcoff_ldsymsz */
3019 LDRELSZ
, /* _xcoff_ldrelsz */
3020 12, /* _xcoff_function_descriptor_size */
3021 SMALL_AOUTSZ
, /* _xcoff_small_aout_header_size */
3024 1, /* _xcoff_ldhdr_version */
3026 /* Xcoff vs xcoff64 putting symbol names. */
3027 _bfd_xcoff_put_symbol_name
, /* _xcoff_put_symbol_name */
3028 _bfd_xcoff_put_ldsymbol_name
, /* _xcoff_put_ldsymbol_name */
3030 & xcoff_dynamic_reloc
, /* dynamic reloc howto */
3032 xcoff_create_csect_from_smclas
, /* _xcoff_create_csect_from_smclas */
3034 /* Lineno and reloc count overflow. */
3035 xcoff_is_lineno_count_overflow
,
3036 xcoff_is_reloc_count_overflow
,
3038 xcoff_loader_symbol_offset
,
3039 xcoff_loader_reloc_offset
,
3042 & xcoff_glink_code
[0],
3043 (36), /* _xcoff_glink_size */
3046 /* The transfer vector that leads the outside world to all of the above. */
3047 const bfd_target rs6000coff_vec
=
3050 bfd_target_xcoff_flavour
,
3051 BFD_ENDIAN_BIG
, /* data byte order is big */
3052 BFD_ENDIAN_BIG
, /* header byte order is big */
3054 (HAS_RELOC
| EXEC_P
| /* object flags */
3055 HAS_LINENO
| HAS_DEBUG
| DYNAMIC
|
3056 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
),
3058 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* section flags */
3059 0, /* leading char */
3060 '/', /* ar_pad_char */
3061 15, /* ar_max_namelen??? FIXMEmgo */
3064 bfd_getb64
, /* bfd_getx64 */
3065 bfd_getb_signed_64
, /* bfd_getx_signed_64 */
3066 bfd_putb64
, /* bfd_putx64 */
3067 bfd_getb32
, /* bfd_getx32 */
3068 bfd_getb_signed_32
, /* bfd_getx_signed_32 */
3069 bfd_putb32
, /* bfd_putx32 */
3070 bfd_getb16
, /* bfd_getx16 */
3071 bfd_getb_signed_16
, /* bfd_getx_signed_16 */
3072 bfd_putb16
, /* bfd_putx16 */
3075 bfd_getb64
, /* bfd_h_getx64 */
3076 bfd_getb_signed_64
, /* bfd_h_getx_signed_64 */
3077 bfd_putb64
, /* bfd_h_putx64 */
3078 bfd_getb32
, /* bfd_h_getx32 */
3079 bfd_getb_signed_32
, /* bfd_h_getx_signed_32 */
3080 bfd_putb32
, /* bfd_h_putx32 */
3081 bfd_getb16
, /* bfd_h_getx16 */
3082 bfd_getb_signed_16
, /* bfd_h_getx_signed_16 */
3083 bfd_putb16
, /* bfd_h_putx16 */
3085 { /* bfd_check_format */
3088 _bfd_xcoff_archive_p
,
3092 { /* bfd_set_format */
3095 _bfd_generic_mkarchive
,
3099 {/* bfd_write_contents */
3101 coff_write_object_contents
,
3102 _bfd_xcoff_write_archive_contents
,
3107 bfd_true
, /* _close_and_cleanup */
3108 bfd_true
, /* _bfd_free_cached_info */
3109 coff_new_section_hook
, /* _new_section_hook */
3110 _bfd_generic_get_section_contents
, /* _bfd_get_section_contents */
3111 /* _bfd_get_section_contents_in_window */
3112 _bfd_generic_get_section_contents_in_window
,
3115 _bfd_xcoff_copy_private_bfd_data
, /* _bfd_copy_private_bfd */
3116 /* _bfd_merge_private_bfd_data */
3117 ((boolean (*) (bfd
*, bfd
*)) bfd_true
),
3118 /* _bfd_copy_pivate_section_data */
3119 ((boolean (*) (bfd
*, asection
*, bfd
*, asection
*)) bfd_true
),
3120 /* _bfd_copy_private_symbol_data */
3121 ((boolean (*) (bfd
*, asymbol
*, bfd
*, asymbol
*)) bfd_true
),
3122 ((boolean (*) (bfd
*, flagword
)) bfd_true
), /* _bfd_set_private_flags */
3123 ((boolean (*) (bfd
*, void * )) bfd_true
), /* _bfd_print_private_bfd_data */
3126 coff_core_file_failing_command
, /* _core_file_failing_command */
3127 coff_core_file_failing_signal
, /* _core_file_failing_signal */
3128 /* _core_file_matches_executable_p */
3129 coff_core_file_matches_executable_p
,
3132 _bfd_xcoff_slurp_armap
, /* _slurp_armap */
3133 /* XCOFF archives do not have
3134 anything which corresponds to
3135 an extended name table. */
3136 bfd_false
, /* _slurp_extended_name_table */
3137 /* _construct_extended_name_table */
3138 ((boolean (*) (bfd
*, char **, bfd_size_type
*, const char **)) bfd_false
),
3139 bfd_dont_truncate_arname
, /* _truncate_arname */
3140 _bfd_xcoff_write_armap
, /* _write_armap */
3141 _bfd_xcoff_read_ar_hdr
, /* _read_ar_hdr */
3142 _bfd_xcoff_openr_next_archived_file
, /* _openr_next_archived_file */
3143 _bfd_generic_get_elt_at_index
, /* _get_elt_at_index */
3144 _bfd_xcoff_generic_stat_arch_elt
, /* _generic_dtat_arch_elt */
3145 /* XCOFF archives do not have
3147 bfd_true
, /* _update_armap_timestamp */
3150 coff_get_symtab_upper_bound
, /* _get_symtab_upper_bound */
3151 coff_get_symtab
, /* _get_symtab */
3152 coff_make_empty_symbol
, /* _make_empty_symbol */
3153 coff_print_symbol
, /* _print_symbol */
3154 coff_get_symbol_info
, /* _get_symbol_info */
3155 _bfd_xcoff_is_local_label_name
, /* _bfd_is_local_label_name */
3156 coff_get_lineno
, /* _get_lineno */
3157 coff_find_nearest_line
, /* _find_nearest_line */
3158 coff_bfd_make_debug_symbol
, /* _bfd_make_debug_symbol */
3159 _bfd_generic_read_minisymbols
, /* _read_minisymbols */
3160 _bfd_generic_minisymbol_to_symbol
, /* _minsymbol_to_symbol */
3163 coff_get_reloc_upper_bound
, /* _get_reloc_upper_bound */
3164 coff_canonicalize_reloc
, /* _cononicalize_reloc */
3165 _bfd_xcoff_reloc_type_lookup
, /* _bfd_reloc_type_lookup */
3168 coff_set_arch_mach
, /* _set_arch_mach */
3169 coff_set_section_contents
, /* _set_section_contents */
3172 _bfd_xcoff_sizeof_headers
, /* _sizeof_headers */
3173 /* _bfd_get_relocated_section_contents */
3174 bfd_generic_get_relocated_section_contents
,
3175 bfd_generic_relax_section
, /* _bfd_relax_section */
3176 _bfd_xcoff_bfd_link_hash_table_create
, /* _bfd_link_hash_table_create */
3177 _bfd_xcoff_bfd_link_add_symbols
, /* _bfd_link_add_symbols */
3178 _bfd_xcoff_bfd_final_link
, /* _bfd_filnal_link */
3179 _bfd_generic_link_split_section
, /* _bfd_link_split_section */
3180 bfd_generic_gc_sections
, /* _bfd_gc_sections */
3181 bfd_generic_merge_sections
, /* _bfd_merge_sections */
3184 /* _get_dynamic_symtab_upper_bound */
3185 _bfd_xcoff_get_dynamic_symtab_upper_bound
,
3186 _bfd_xcoff_canonicalize_dynamic_symtab
, /* _cononicalize_dynamic_symtab */
3187 _bfd_xcoff_get_dynamic_reloc_upper_bound
,/* _get_dynamic_reloc_upper_bound */
3188 _bfd_xcoff_canonicalize_dynamic_reloc
, /* _cononicalize_dynamic_reloc */
3190 /* Opposite endian version, none exists */
3194 (void *) &bfd_xcoff_backend_data
,
3198 * xcoff-powermac target
3200 * Only difference between this target and the rs6000 target is the
3201 * the default architecture and machine type used in coffcode.h
3203 * PowerPC Macs use the same magic numbers as RS/6000
3204 * (because that's how they were bootstrapped originally),
3205 * but they are always PowerPC architecture.
3207 static const struct xcoff_backend_data_rec bfd_pmac_xcoff_backend_data
=
3209 { /* COFF backend, defined in libcoff.h */
3210 _bfd_xcoff_swap_aux_in
, /* _bfd_coff_swap_aux_in */
3211 _bfd_xcoff_swap_sym_in
, /* _bfd_coff_swap_sym_in */
3212 coff_swap_lineno_in
, /* _bfd_coff_swap_lineno_in */
3213 _bfd_xcoff_swap_aux_out
, /* _bfd_swap_aux_out */
3214 _bfd_xcoff_swap_sym_out
, /* _bfd_swap_sym_out */
3215 coff_swap_lineno_out
, /* _bfd_swap_lineno_out */
3216 coff_swap_reloc_out
, /* _bfd_swap_reloc_out */
3217 coff_swap_filehdr_out
, /* _bfd_swap_filehdr_out */
3218 coff_swap_aouthdr_out
, /* _bfd_swap_aouthdr_out */
3219 coff_swap_scnhdr_out
, /* _bfd_swap_scnhdr_out */
3220 FILHSZ
, /* _bfd_filhsz */
3221 AOUTSZ
, /* _bfd_aoutsz */
3222 SCNHSZ
, /* _bfd_scnhsz */
3223 SYMESZ
, /* _bfd_symesz */
3224 AUXESZ
, /* _bfd_auxesz */
3225 RELSZ
, /* _bfd_relsz */
3226 LINESZ
, /* _bfd_linesz */
3227 FILNMLEN
, /* _bfd_filnmlen */
3228 true, /* _bfd_coff_long_filenames */
3229 false, /* _bfd_coff_long_section_names */
3230 (3), /* _bfd_coff_default_section_alignment_power */
3231 false, /* _bfd_coff_force_symnames_in_strings */
3232 2, /* _bfd_coff_debug_string_prefix_length */
3233 coff_swap_filehdr_in
, /* _bfd_coff_swap_filehdr_in */
3234 coff_swap_aouthdr_in
, /* _bfd_swap_aouthdr_in */
3235 coff_swap_scnhdr_in
, /* _bfd_swap_scnhdr_in */
3236 coff_swap_reloc_in
, /* _bfd_reloc_in */
3237 coff_bad_format_hook
, /* _bfd_bad_format_hook */
3238 coff_set_arch_mach_hook
, /* _bfd_set_arch_mach_hook */
3239 coff_mkobject_hook
, /* _bfd_mkobject_hook */
3240 styp_to_sec_flags
, /* _bfd_syp_to_sec_flags */
3241 coff_set_alignment_hook
, /* _bfd_set_alignment_hook */
3242 coff_slurp_symbol_table
, /* _bfd_coff_slurp_symbol_table */
3243 symname_in_debug_hook
, /* _coff_symname_in_debug_hook */
3244 coff_pointerize_aux_hook
, /* _bfd_coff_pointerize_aux_hook */
3245 coff_print_aux
, /* bfd_coff_print_aux */
3246 dummy_reloc16_extra_cases
, /* _bfd_coff_reloc16_extra_cases */
3247 dummy_reloc16_estimate
, /* _bfd_coff_reloc16_estimate */
3248 NULL
, /* bfd_coff_sym_is_global */
3249 /* _bfd_coff_compute_section_file_positions */
3250 coff_compute_section_file_positions
,
3251 NULL
, /* _bfd_coff_start_final_link */
3252 xcoff_ppc_relocate_section
, /* _bfd_coff_relocate_section */
3253 coff_rtype_to_howto
, /* _bfd_coff_rtype_to_howto */
3254 NULL
, /* _bfd_coff_addust_symndx */
3255 _bfd_generic_link_add_one_symbol
, /* _bfd_coff_add_one_symbol */
3256 coff_link_output_has_begun
, /* _bfd_coff_link_output_has_begun */
3257 coff_final_link_postscript
/* _bfd_coff_final_link_postscript */
3260 0x01DF, /* magic number */
3261 bfd_arch_powerpc
, /* architecture */
3262 bfd_mach_ppc
, /* machine */
3264 /* function pointers to xcoff specific swap routines */
3265 xcoff_swap_ldhdr_in
, /* _xcoff_swap_ldhdr_in */
3266 xcoff_swap_ldhdr_out
, /* _xcoff_swap_ldhdr_out */
3267 xcoff_swap_ldsym_in
, /* _xcoff_swap_ldsym_in */
3268 xcoff_swap_ldsym_out
, /* _xcoff_swap_ldsym_out */
3269 xcoff_swap_ldrel_in
, /* _xcoff_swap_ldrel_in */
3270 xcoff_swap_ldrel_out
, /* _xcoff_swap_ldrel_out */
3273 LDHDRSZ
, /* _xcoff_ldhdrsz */
3274 LDSYMSZ
, /* _xcoff_ldsymsz */
3275 LDRELSZ
, /* _xcoff_ldrelsz */
3276 12, /* _xcoff_function_descriptor_size */
3277 SMALL_AOUTSZ
, /* _xcoff_small_aout_header_size */
3280 1, /* _xcoff_ldhdr_version */
3282 /* xcoff vs xcoff64 putting symbol names */
3283 _bfd_xcoff_put_symbol_name
, /* _xcoff_put_symbol_name */
3284 _bfd_xcoff_put_ldsymbol_name
, /* _xcoff_put_ldsymbol_name */
3286 &xcoff_dynamic_reloc
, /* dynamic reloc howto */
3288 xcoff_create_csect_from_smclas
, /* _xcoff_create_csect_from_smclas */
3290 /* lineno and reloc count overflow */
3291 xcoff_is_lineno_count_overflow
,
3292 xcoff_is_reloc_count_overflow
,
3294 xcoff_loader_symbol_offset
,
3295 xcoff_loader_reloc_offset
,
3298 &xcoff_glink_code
[0],
3299 (36), /* _xcoff_glink_size */
3303 /* The transfer vector that leads the outside world to all of the above. */
3304 const bfd_target pmac_xcoff_vec
=
3307 bfd_target_xcoff_flavour
,
3308 BFD_ENDIAN_BIG
, /* data byte order is big */
3309 BFD_ENDIAN_BIG
, /* header byte order is big */
3311 (HAS_RELOC
| EXEC_P
| /* object flags */
3312 HAS_LINENO
| HAS_DEBUG
| DYNAMIC
|
3313 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
),
3315 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* section flags */
3316 0, /* leading char */
3317 '/', /* ar_pad_char */
3318 15, /* ar_max_namelen??? FIXMEmgo */
3321 bfd_getb64
, /* bfd_getx64 */
3322 bfd_getb_signed_64
, /* bfd_getx_signed_64 */
3323 bfd_putb64
, /* bfd_putx64 */
3324 bfd_getb32
, /* bfd_getx32 */
3325 bfd_getb_signed_32
, /* bfd_getx_signed_32 */
3326 bfd_putb32
, /* bfd_putx32 */
3327 bfd_getb16
, /* bfd_getx16 */
3328 bfd_getb_signed_16
, /* bfd_getx_signed_16 */
3329 bfd_putb16
, /* bfd_putx16 */
3332 bfd_getb64
, /* bfd_h_getx64 */
3333 bfd_getb_signed_64
, /* bfd_h_getx_signed_64 */
3334 bfd_putb64
, /* bfd_h_putx64 */
3335 bfd_getb32
, /* bfd_h_getx32 */
3336 bfd_getb_signed_32
, /* bfd_h_getx_signed_32 */
3337 bfd_putb32
, /* bfd_h_putx32 */
3338 bfd_getb16
, /* bfd_h_getx16 */
3339 bfd_getb_signed_16
, /* bfd_h_getx_signed_16 */
3340 bfd_putb16
, /* bfd_h_putx16 */
3342 { /* bfd_check_format */
3345 _bfd_xcoff_archive_p
,
3349 { /* bfd_set_format */
3352 _bfd_generic_mkarchive
,
3356 {/* bfd_write_contents */
3358 coff_write_object_contents
,
3359 _bfd_xcoff_write_archive_contents
,
3364 bfd_true
, /* _close_and_cleanup */
3365 bfd_true
, /* _bfd_free_cached_info */
3366 coff_new_section_hook
, /* _new_section_hook */
3367 _bfd_generic_get_section_contents
, /* _bfd_get_section_contents */
3368 /* _bfd_get_section_contents_in_window */
3369 _bfd_generic_get_section_contents_in_window
,
3372 _bfd_xcoff_copy_private_bfd_data
, /* _bfd_copy_private_bfd */
3373 /* _bfd_merge_private_bfd_data */
3374 ((boolean (*) (bfd
*, bfd
*)) bfd_true
),
3375 /* _bfd_copy_pivate_section_data */
3376 ((boolean (*) (bfd
*, asection
*, bfd
*, asection
*)) bfd_true
),
3377 /* _bfd_copy_private_symbol_data */
3378 ((boolean (*) (bfd
*, asymbol
*, bfd
*, asymbol
*)) bfd_true
),
3379 ((boolean (*) (bfd
*, flagword
)) bfd_true
), /* _bfd_set_private_flags */
3380 ((boolean (*) (bfd
*, void * )) bfd_true
), /* _bfd_print_private_bfd_data */
3383 coff_core_file_failing_command
, /* _core_file_failing_command */
3384 coff_core_file_failing_signal
, /* _core_file_failing_signal */
3385 /* _core_file_matches_executable_p */
3386 coff_core_file_matches_executable_p
,
3389 _bfd_xcoff_slurp_armap
, /* _slurp_armap */
3390 /* XCOFF archives do not have
3391 anything which corresponds to
3392 an extended name table. */
3393 bfd_false
, /* _slurp_extended_name_table */
3394 /* _construct_extended_name_table */
3395 ((boolean (*) (bfd
*, char **, bfd_size_type
*, const char **)) bfd_false
),
3396 bfd_dont_truncate_arname
, /* _truncate_arname */
3397 _bfd_xcoff_write_armap
, /* _write_armap */
3398 _bfd_xcoff_read_ar_hdr
, /* _read_ar_hdr */
3399 _bfd_xcoff_openr_next_archived_file
, /* _openr_next_archived_file */
3400 _bfd_generic_get_elt_at_index
, /* _get_elt_at_index */
3401 _bfd_xcoff_generic_stat_arch_elt
, /* _generic_dtat_arch_elt */
3402 /* XCOFF archives do not have
3404 bfd_true
, /* _update_armap_timestamp */
3407 coff_get_symtab_upper_bound
, /* _get_symtab_upper_bound */
3408 coff_get_symtab
, /* _get_symtab */
3409 coff_make_empty_symbol
, /* _make_empty_symbol */
3410 coff_print_symbol
, /* _print_symbol */
3411 coff_get_symbol_info
, /* _get_symbol_info */
3412 _bfd_xcoff_is_local_label_name
, /* _bfd_is_local_label_name */
3413 coff_get_lineno
, /* _get_lineno */
3414 coff_find_nearest_line
, /* _find_nearest_line */
3415 coff_bfd_make_debug_symbol
, /* _bfd_make_debug_symbol */
3416 _bfd_generic_read_minisymbols
, /* _read_minisymbols */
3417 _bfd_generic_minisymbol_to_symbol
, /* _minsymbol_to_symbol */
3420 coff_get_reloc_upper_bound
, /* _get_reloc_upper_bound */
3421 coff_canonicalize_reloc
, /* _cononicalize_reloc */
3422 _bfd_xcoff_reloc_type_lookup
, /* _bfd_reloc_type_lookup */
3425 coff_set_arch_mach
, /* _set_arch_mach */
3426 coff_set_section_contents
, /* _set_section_contents */
3429 _bfd_xcoff_sizeof_headers
, /* _sizeof_headers */
3430 /* _bfd_get_relocated_section_contents */
3431 bfd_generic_get_relocated_section_contents
,
3432 bfd_generic_relax_section
, /* _bfd_relax_section */
3433 _bfd_xcoff_bfd_link_hash_table_create
, /* _bfd_link_hash_table_create */
3434 _bfd_xcoff_bfd_link_add_symbols
, /* _bfd_link_add_symbols */
3435 _bfd_xcoff_bfd_final_link
, /* _bfd_filnal_link */
3436 _bfd_generic_link_split_section
, /* _bfd_link_split_section */
3437 bfd_generic_gc_sections
, /* _bfd_gc_sections */
3438 bfd_generic_merge_sections
, /* _bfd_merge_sections */
3441 /* _get_dynamic_symtab_upper_bound */
3442 _bfd_xcoff_get_dynamic_symtab_upper_bound
,
3443 _bfd_xcoff_canonicalize_dynamic_symtab
, /* _cononicalize_dynamic_symtab */
3444 _bfd_xcoff_get_dynamic_reloc_upper_bound
,/* _get_dynamic_reloc_upper_bound */
3445 _bfd_xcoff_canonicalize_dynamic_reloc
, /* _cononicalize_dynamic_reloc */
3447 /* Opposite endian version, none exists */
3451 (void *) &bfd_pmac_xcoff_backend_data
,