1 /* BFD back-end for IBM RS/6000 "XCOFF" files.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
4 FIXME: Can someone provide a transliteration of this name into ASCII?
5 Using the following chars caused a compiler warning on HIUX (so I replaced
6 them with octal escapes), and isn't useful without an understanding of what
8 Written by Metin G. Ozisik, Mimi Ph\373\364ng-Th\345o V\365,
10 Archive support from Damon A. Permezel.
11 Contributed by IBM Corporation and Cygnus Support.
13 This file is part of BFD, the Binary File Descriptor library.
15 This program is free software; you can redistribute it and/or modify
16 it under the terms of the GNU General Public License as published by
17 the Free Software Foundation; either version 2 of the License, or
18 (at your option) any later version.
20 This program is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 GNU General Public License for more details.
25 You should have received a copy of the GNU General Public License
26 along with this program; if not, write to the Free Software
27 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
33 #include "coff/internal.h"
34 #include "coff/rs6000.h"
36 #define TARGET_NAME "aixcoff-rs6000"
37 #define TARGET_SYM rs6000coff_vec
38 #include "xcoff-target.h"
41 /* The main body of code is in coffcode.h. */
43 static const char *normalize_filename
PARAMS ((bfd
*));
45 /* We use our own tdata type. Its first field is the COFF tdata type,
46 so the COFF routines are compatible. */
49 _bfd_xcoff_mkobject (abfd
)
54 abfd
->tdata
.xcoff_obj_data
=
55 ((struct xcoff_tdata
*)
56 bfd_zalloc (abfd
, sizeof (struct xcoff_tdata
)));
57 if (abfd
->tdata
.xcoff_obj_data
== NULL
)
59 coff
= coff_data (abfd
);
60 coff
->symbols
= (coff_symbol_type
*) NULL
;
61 coff
->conversion_table
= (unsigned int *) NULL
;
62 coff
->raw_syments
= (struct coff_ptr_struct
*) NULL
;
65 xcoff_data (abfd
)->modtype
= ('1' << 8) | 'L';
67 /* We set cputype to -1 to indicate that it has not been
69 xcoff_data (abfd
)->cputype
= -1;
71 xcoff_data (abfd
)->csects
= NULL
;
72 xcoff_data (abfd
)->debug_indices
= NULL
;
77 /* Copy XCOFF data from one BFD to another. */
80 _bfd_xcoff_copy_private_bfd_data (ibfd
, obfd
)
84 struct xcoff_tdata
*ix
, *ox
;
87 if (ibfd
->xvec
!= obfd
->xvec
)
89 ix
= xcoff_data (ibfd
);
90 ox
= xcoff_data (obfd
);
91 ox
->full_aouthdr
= ix
->full_aouthdr
;
97 sec
= coff_section_from_bfd_index (ibfd
, ix
->sntoc
);
101 ox
->sntoc
= sec
->output_section
->target_index
;
103 if (ix
->snentry
== 0)
107 sec
= coff_section_from_bfd_index (ibfd
, ix
->snentry
);
111 ox
->snentry
= sec
->output_section
->target_index
;
113 ox
->text_align_power
= ix
->text_align_power
;
114 ox
->data_align_power
= ix
->data_align_power
;
115 ox
->modtype
= ix
->modtype
;
116 ox
->cputype
= ix
->cputype
;
117 ox
->maxdata
= ix
->maxdata
;
118 ox
->maxstack
= ix
->maxstack
;
122 /* I don't think XCOFF really has a notion of local labels based on
123 name. This will mean that ld -X doesn't actually strip anything.
124 The AIX native linker does not have a -X option, and it ignores the
128 _bfd_xcoff_is_local_label_name (abfd
, name
)
129 bfd
*abfd ATTRIBUTE_UNUSED
;
130 const char *name ATTRIBUTE_UNUSED
;
138 _bfd_xcoff_swap_sym_in (abfd
, ext1
, in1
)
143 SYMENT
*ext
= (SYMENT
*)ext1
;
144 struct internal_syment
*in
= (struct internal_syment
*)in1
;
147 if(ext
->e
.e_name
[0] != 0)
149 memcpy(in
->_n
._n_name
, ext
->e
.e_name
, SYMNMLEN
);
153 in
->_n
._n_n
._n_zeroes
= 0;
154 in
->_n
._n_n
._n_offset
=
155 bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e
.e
.e_offset
);
158 in
->n_value
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e_value
);
159 in
->n_scnum
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->e_scnum
);
160 in
->n_type
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->e_type
);
161 in
->n_sclass
= bfd_h_get_8(abfd
, ext
->e_sclass
);
162 in
->n_numaux
= bfd_h_get_8(abfd
, ext
->e_numaux
);
166 _bfd_xcoff_swap_sym_out (abfd
, inp
, extp
)
171 struct internal_syment
*in
= (struct internal_syment
*)inp
;
172 SYMENT
*ext
=(SYMENT
*)extp
;
174 if(in
->_n
._n_name
[0] != 0)
176 memcpy(ext
->e
.e_name
, in
->_n
._n_name
, SYMNMLEN
);
180 bfd_h_put_32(abfd
, 0, (bfd_byte
*) ext
->e
.e
.e_zeroes
);
181 bfd_h_put_32(abfd
, in
->_n
._n_n
._n_offset
,
182 (bfd_byte
*) ext
->e
.e
.e_offset
);
185 bfd_h_put_32(abfd
, in
->n_value
, (bfd_byte
*) ext
->e_value
);
186 bfd_h_put_16(abfd
, in
->n_scnum
, (bfd_byte
*) ext
->e_scnum
);
187 bfd_h_put_16(abfd
, in
->n_type
, (bfd_byte
*) ext
->e_type
);
188 bfd_h_put_8(abfd
, in
->n_sclass
, ext
->e_sclass
);
189 bfd_h_put_8(abfd
, in
->n_numaux
, ext
->e_numaux
);
190 return bfd_coff_symesz (abfd
);
193 #define PUTWORD bfd_h_put_32
194 #define PUTHALF bfd_h_put_16
195 #define PUTBYTE bfd_h_put_8
196 #define GETWORD bfd_h_get_32
197 #define GETHALF bfd_h_get_16
198 #define GETBYTE bfd_h_get_8
201 _bfd_xcoff_swap_aux_in (abfd
, ext1
, type
, class, indx
, numaux
, in1
)
210 AUXENT
*ext
= (AUXENT
*)ext1
;
211 union internal_auxent
*in
= (union internal_auxent
*)in1
;
215 if (ext
->x_file
.x_fname
[0] == 0) {
216 in
->x_file
.x_n
.x_zeroes
= 0;
217 in
->x_file
.x_n
.x_offset
=
218 bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
223 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
,
224 numaux
* sizeof (AUXENT
));
228 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
233 /* RS/6000 "csect" auxents */
236 if (indx
+ 1 == numaux
)
238 in
->x_csect
.x_scnlen
.l
=
239 bfd_h_get_32 (abfd
, ext
->x_csect
.x_scnlen
);
240 in
->x_csect
.x_parmhash
= bfd_h_get_32 (abfd
,
241 ext
->x_csect
.x_parmhash
);
242 in
->x_csect
.x_snhash
= bfd_h_get_16 (abfd
, ext
->x_csect
.x_snhash
);
243 /* We don't have to hack bitfields in x_smtyp because it's
244 defined by shifts-and-ands, which are equivalent on all
246 in
->x_csect
.x_smtyp
= bfd_h_get_8 (abfd
, ext
->x_csect
.x_smtyp
);
247 in
->x_csect
.x_smclas
= bfd_h_get_8 (abfd
, ext
->x_csect
.x_smclas
);
248 in
->x_csect
.x_stab
= bfd_h_get_32 (abfd
, ext
->x_csect
.x_stab
);
249 in
->x_csect
.x_snstab
= bfd_h_get_16 (abfd
, ext
->x_csect
.x_snstab
);
257 if (type
== T_NULL
) {
258 in
->x_scn
.x_scnlen
= bfd_h_get_32(abfd
,
259 (bfd_byte
*) ext
->x_scn
.x_scnlen
);
260 in
->x_scn
.x_nreloc
= bfd_h_get_16(abfd
,
261 (bfd_byte
*) ext
->x_scn
.x_nreloc
);
262 in
->x_scn
.x_nlinno
= bfd_h_get_16(abfd
,
263 (bfd_byte
*) ext
->x_scn
.x_nlinno
);
264 /* PE defines some extra fields; we zero them out for
266 in
->x_scn
.x_checksum
= 0;
267 in
->x_scn
.x_associated
= 0;
268 in
->x_scn
.x_comdat
= 0;
275 in
->x_sym
.x_tagndx
.l
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
276 in
->x_sym
.x_tvndx
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
278 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
280 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= bfd_h_get_32(abfd
, (bfd_byte
*)
281 ext
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
);
282 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= bfd_h_get_32(abfd
, (bfd_byte
*)
283 ext
->x_sym
.x_fcnary
.x_fcn
.x_endndx
);
287 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
288 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
289 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
290 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
291 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
292 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
293 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
294 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
297 in
->x_sym
.x_misc
.x_fsize
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
300 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= bfd_h_get_16(abfd
, (bfd_byte
*)
301 ext
->x_sym
.x_misc
.x_lnsz
.x_lnno
);
302 in
->x_sym
.x_misc
.x_lnsz
.x_size
= bfd_h_get_16(abfd
, (bfd_byte
*)
303 ext
->x_sym
.x_misc
.x_lnsz
.x_size
);
307 /* the semicolon is because MSVC doesn't like labels at
315 _bfd_xcoff_swap_aux_out (abfd
, inp
, type
, class, indx
, numaux
, extp
)
320 int indx ATTRIBUTE_UNUSED
;
321 int numaux ATTRIBUTE_UNUSED
;
324 union internal_auxent
*in
= (union internal_auxent
*)inp
;
325 AUXENT
*ext
= (AUXENT
*)extp
;
327 memset((PTR
)ext
, 0, bfd_coff_auxesz (abfd
));
331 if (in
->x_file
.x_fname
[0] == 0)
333 PUTWORD(abfd
, 0, (bfd_byte
*) ext
->x_file
.x_n
.x_zeroes
);
335 in
->x_file
.x_n
.x_offset
,
336 (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
340 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
344 /* RS/6000 "csect" auxents */
347 if (indx
+ 1 == numaux
)
349 PUTWORD (abfd
, in
->x_csect
.x_scnlen
.l
,ext
->x_csect
.x_scnlen
);
350 PUTWORD (abfd
, in
->x_csect
.x_parmhash
, ext
->x_csect
.x_parmhash
);
351 PUTHALF (abfd
, in
->x_csect
.x_snhash
, ext
->x_csect
.x_snhash
);
352 /* We don't have to hack bitfields in x_smtyp because it's
353 defined by shifts-and-ands, which are equivalent on all
355 PUTBYTE (abfd
, in
->x_csect
.x_smtyp
, ext
->x_csect
.x_smtyp
);
356 PUTBYTE (abfd
, in
->x_csect
.x_smclas
, ext
->x_csect
.x_smclas
);
357 PUTWORD (abfd
, in
->x_csect
.x_stab
, ext
->x_csect
.x_stab
);
358 PUTHALF (abfd
, in
->x_csect
.x_snstab
, ext
->x_csect
.x_snstab
);
366 if (type
== T_NULL
) {
367 bfd_h_put_32(abfd
, in
->x_scn
.x_scnlen
, (bfd_byte
*) ext
->x_scn
.x_scnlen
);
368 bfd_h_put_16(abfd
, in
->x_scn
.x_nreloc
, (bfd_byte
*) ext
->x_scn
.x_nreloc
);
369 bfd_h_put_16(abfd
, in
->x_scn
.x_nlinno
, (bfd_byte
*) ext
->x_scn
.x_nlinno
);
375 PUTWORD(abfd
, in
->x_sym
.x_tagndx
.l
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
376 PUTWORD(abfd
, in
->x_sym
.x_tvndx
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
378 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
380 bfd_h_put_32(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
,
381 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
);
382 PUTWORD(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
,
383 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_fcn
.x_endndx
);
387 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
388 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
389 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
390 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
391 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
392 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
393 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
394 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
398 PUTWORD (abfd
, in
->x_sym
.x_misc
.x_fsize
,
399 (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
402 bfd_h_put_16(abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
,
403 (bfd_byte
*)ext
->x_sym
.x_misc
.x_lnsz
.x_lnno
);
404 bfd_h_put_16(abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
,
405 (bfd_byte
*)ext
->x_sym
.x_misc
.x_lnsz
.x_size
);
409 return bfd_coff_auxesz (abfd
);
414 /* The XCOFF reloc table. Actually, XCOFF relocations specify the
415 bitsize and whether they are signed or not, along with a
416 conventional type. This table is for the types, which are used for
417 different algorithms for putting in the reloc. Many of these
418 relocs need special_function entries, which I have not written. */
420 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
421 from smaller values. Start with zero, widen, *then* decrement. */
422 #define MINUS_ONE (((bfd_vma)0) - 1)
424 reloc_howto_type xcoff_howto_table
[] =
426 /* Standard 32 bit relocation. */
429 2, /* size (0 = byte, 1 = short, 2 = long) */
431 false, /* pc_relative */
433 complain_overflow_bitfield
, /* complain_on_overflow */
434 0, /* special_function */
436 true, /* partial_inplace */
437 0xffffffff, /* src_mask */
438 0xffffffff, /* dst_mask */
439 false), /* pcrel_offset */
441 /* 32 bit relocation, but store negative value. */
444 -2, /* size (0 = byte, 1 = short, 2 = long) */
446 false, /* pc_relative */
448 complain_overflow_bitfield
, /* complain_on_overflow */
449 0, /* special_function */
451 true, /* partial_inplace */
452 0xffffffff, /* src_mask */
453 0xffffffff, /* dst_mask */
454 false), /* pcrel_offset */
456 /* 32 bit PC relative relocation. */
459 2, /* size (0 = byte, 1 = short, 2 = long) */
461 true, /* pc_relative */
463 complain_overflow_signed
, /* complain_on_overflow */
464 0, /* special_function */
466 true, /* partial_inplace */
467 0xffffffff, /* src_mask */
468 0xffffffff, /* dst_mask */
469 false), /* pcrel_offset */
471 /* 16 bit TOC relative relocation. */
474 1, /* size (0 = byte, 1 = short, 2 = long) */
476 false, /* pc_relative */
478 complain_overflow_bitfield
, /* complain_on_overflow */
479 0, /* special_function */
481 true, /* partial_inplace */
482 0xffff, /* src_mask */
483 0xffff, /* dst_mask */
484 false), /* pcrel_offset */
486 /* I don't really know what this is. */
489 2, /* size (0 = byte, 1 = short, 2 = long) */
491 false, /* pc_relative */
493 complain_overflow_bitfield
, /* complain_on_overflow */
494 0, /* special_function */
496 true, /* partial_inplace */
497 0xffffffff, /* src_mask */
498 0xffffffff, /* dst_mask */
499 false), /* pcrel_offset */
501 /* External TOC relative symbol. */
504 2, /* size (0 = byte, 1 = short, 2 = long) */
506 false, /* pc_relative */
508 complain_overflow_bitfield
, /* complain_on_overflow */
509 0, /* special_function */
511 true, /* partial_inplace */
512 0xffff, /* src_mask */
513 0xffff, /* dst_mask */
514 false), /* pcrel_offset */
516 /* Local TOC relative symbol. */
519 2, /* size (0 = byte, 1 = short, 2 = long) */
521 false, /* pc_relative */
523 complain_overflow_bitfield
, /* complain_on_overflow */
524 0, /* special_function */
526 true, /* partial_inplace */
527 0xffff, /* src_mask */
528 0xffff, /* dst_mask */
529 false), /* pcrel_offset */
533 /* Non modifiable absolute branch. */
536 2, /* size (0 = byte, 1 = short, 2 = long) */
538 false, /* pc_relative */
540 complain_overflow_bitfield
, /* complain_on_overflow */
541 0, /* special_function */
543 true, /* partial_inplace */
544 0x3fffffc, /* src_mask */
545 0x3fffffc, /* dst_mask */
546 false), /* pcrel_offset */
550 /* Non modifiable relative branch. */
551 HOWTO (0xa, /* type */
553 2, /* size (0 = byte, 1 = short, 2 = long) */
555 true, /* pc_relative */
557 complain_overflow_signed
, /* complain_on_overflow */
558 0, /* special_function */
560 true, /* partial_inplace */
561 0x3fffffc, /* src_mask */
562 0x3fffffc, /* dst_mask */
563 false), /* pcrel_offset */
568 HOWTO (0xc, /* type */
570 2, /* size (0 = byte, 1 = short, 2 = long) */
572 false, /* pc_relative */
574 complain_overflow_bitfield
, /* complain_on_overflow */
575 0, /* special_function */
577 true, /* partial_inplace */
578 0xffff, /* src_mask */
579 0xffff, /* dst_mask */
580 false), /* pcrel_offset */
583 HOWTO (0xd, /* type */
585 2, /* size (0 = byte, 1 = short, 2 = long) */
587 false, /* pc_relative */
589 complain_overflow_bitfield
, /* complain_on_overflow */
590 0, /* special_function */
592 true, /* partial_inplace */
593 0xffff, /* src_mask */
594 0xffff, /* dst_mask */
595 false), /* pcrel_offset */
599 /* Non-relocating reference. */
600 HOWTO (0xf, /* type */
602 2, /* size (0 = byte, 1 = short, 2 = long) */
604 false, /* pc_relative */
606 complain_overflow_bitfield
, /* complain_on_overflow */
607 0, /* special_function */
609 false, /* partial_inplace */
612 false), /* pcrel_offset */
617 /* TOC relative indirect load. */
618 HOWTO (0x12, /* type */
620 2, /* size (0 = byte, 1 = short, 2 = long) */
622 false, /* pc_relative */
624 complain_overflow_bitfield
, /* complain_on_overflow */
625 0, /* special_function */
627 true, /* partial_inplace */
628 0xffff, /* src_mask */
629 0xffff, /* dst_mask */
630 false), /* pcrel_offset */
632 /* TOC relative load address. */
633 HOWTO (0x13, /* type */
635 2, /* size (0 = byte, 1 = short, 2 = long) */
637 false, /* pc_relative */
639 complain_overflow_bitfield
, /* complain_on_overflow */
640 0, /* special_function */
642 true, /* partial_inplace */
643 0xffff, /* src_mask */
644 0xffff, /* dst_mask */
645 false), /* pcrel_offset */
647 /* Modifiable relative branch. */
648 HOWTO (0x14, /* type */
650 2, /* size (0 = byte, 1 = short, 2 = long) */
652 false, /* pc_relative */
654 complain_overflow_bitfield
, /* complain_on_overflow */
655 0, /* special_function */
656 "R_RRTBI", /* name */
657 true, /* partial_inplace */
658 0xffffffff, /* src_mask */
659 0xffffffff, /* dst_mask */
660 false), /* pcrel_offset */
662 /* Modifiable absolute branch. */
663 HOWTO (0x15, /* type */
665 2, /* size (0 = byte, 1 = short, 2 = long) */
667 false, /* pc_relative */
669 complain_overflow_bitfield
, /* complain_on_overflow */
670 0, /* special_function */
671 "R_RRTBA", /* name */
672 true, /* partial_inplace */
673 0xffffffff, /* src_mask */
674 0xffffffff, /* dst_mask */
675 false), /* pcrel_offset */
677 /* Modifiable call absolute indirect. */
678 HOWTO (0x16, /* type */
680 2, /* size (0 = byte, 1 = short, 2 = long) */
682 false, /* pc_relative */
684 complain_overflow_bitfield
, /* complain_on_overflow */
685 0, /* special_function */
687 true, /* partial_inplace */
688 0xffff, /* src_mask */
689 0xffff, /* dst_mask */
690 false), /* pcrel_offset */
692 /* Modifiable call relative. */
693 HOWTO (0x17, /* type */
695 2, /* size (0 = byte, 1 = short, 2 = long) */
697 false, /* pc_relative */
699 complain_overflow_bitfield
, /* complain_on_overflow */
700 0, /* special_function */
702 true, /* partial_inplace */
703 0xffff, /* src_mask */
704 0xffff, /* dst_mask */
705 false), /* pcrel_offset */
707 /* Modifiable branch absolute. */
708 HOWTO (0x18, /* type */
710 2, /* size (0 = byte, 1 = short, 2 = long) */
712 false, /* pc_relative */
714 complain_overflow_bitfield
, /* complain_on_overflow */
715 0, /* special_function */
717 true, /* partial_inplace */
718 0xffff, /* src_mask */
719 0xffff, /* dst_mask */
720 false), /* pcrel_offset */
722 /* Modifiable branch absolute. */
723 HOWTO (0x19, /* type */
725 2, /* size (0 = byte, 1 = short, 2 = long) */
727 false, /* pc_relative */
729 complain_overflow_bitfield
, /* complain_on_overflow */
730 0, /* special_function */
732 true, /* partial_inplace */
733 0xffff, /* src_mask */
734 0xffff, /* dst_mask */
735 false), /* pcrel_offset */
737 /* Modifiable branch relative. */
738 HOWTO (0x1a, /* type */
740 2, /* size (0 = byte, 1 = short, 2 = long) */
742 false, /* pc_relative */
744 complain_overflow_signed
, /* complain_on_overflow */
745 0, /* special_function */
747 true, /* partial_inplace */
748 0xffff, /* src_mask */
749 0xffff, /* dst_mask */
750 false), /* pcrel_offset */
752 /* Modifiable branch absolute. */
753 HOWTO (0x1b, /* type */
755 2, /* size (0 = byte, 1 = short, 2 = long) */
757 false, /* pc_relative */
759 complain_overflow_bitfield
, /* complain_on_overflow */
760 0, /* special_function */
762 true, /* partial_inplace */
763 0xffff, /* src_mask */
764 0xffff, /* dst_mask */
765 false), /* pcrel_offset */
768 4, /* size (0 = byte, 1 = short, 2 = long) */
770 false, /* pc_relative */
772 complain_overflow_bitfield
, /* complain_on_overflow */
773 0, /* special_function */
775 true, /* partial_inplace */
776 MINUS_ONE
, /* src_mask */
777 MINUS_ONE
, /* dst_mask */
778 false) /* pcrel_offset */
782 /* These are the first two like the above but for 16-bit relocs. */
783 static reloc_howto_type xcoff_howto_table_16
[] =
785 /* Standard 16 bit relocation. */
788 2, /* size (0 = byte, 1 = short, 2 = long) */
790 false, /* pc_relative */
792 complain_overflow_bitfield
, /* complain_on_overflow */
793 0, /* special_function */
794 "R_POS_16", /* name */
795 true, /* partial_inplace */
796 0xffffffff, /* src_mask */
797 0xffffffff, /* dst_mask */
798 false), /* pcrel_offset */
800 /* 16 bit relocation, but store negative value. */
803 -2, /* size (0 = byte, 1 = short, 2 = long) */
805 false, /* pc_relative */
807 complain_overflow_bitfield
, /* complain_on_overflow */
808 0, /* special_function */
809 "R_NEG_16", /* name */
810 true, /* partial_inplace */
811 0xffffffff, /* src_mask */
812 0xffffffff, /* dst_mask */
813 false), /* pcrel_offset */
815 /* 16 bit PC relative relocation. */
818 2, /* size (0 = byte, 1 = short, 2 = long) */
820 true, /* pc_relative */
822 complain_overflow_signed
, /* complain_on_overflow */
823 0, /* special_function */
824 "R_REL_16", /* name */
825 true, /* partial_inplace */
826 0xffffffff, /* src_mask */
827 0xffffffff, /* dst_mask */
828 false) /* pcrel_offset */
832 _bfd_xcoff_rtype2howto (relent
, internal
)
834 struct internal_reloc
*internal
;
836 relent
->howto
= xcoff_howto_table
+ internal
->r_type
;
838 if (relent
->howto
->bitsize
!= ((unsigned int) internal
->r_size
& 0x1f) + 1
840 < sizeof(xcoff_howto_table_16
)/sizeof(xcoff_howto_table_16
[0])))
841 relent
->howto
= xcoff_howto_table_16
+ internal
->r_type
;
843 /* The r_size field of an XCOFF reloc encodes the bitsize of the
844 relocation, as well as indicating whether it is signed or not.
845 Doublecheck that the relocation information gathered from the
846 type matches this information. */
847 if (relent
->howto
->bitsize
!= ((unsigned int) internal
->r_size
& 0x1f) + 1)
850 if ((internal
->r_size
& 0x80) != 0
851 ? (relent
->howto
->complain_on_overflow
!= complain_overflow_signed
)
852 : (relent
->howto
->complain_on_overflow
!= complain_overflow_bitfield
))
858 _bfd_xcoff_reloc_type_lookup (abfd
, code
)
859 bfd
*abfd ATTRIBUTE_UNUSED
;
860 bfd_reloc_code_real_type code
;
864 case BFD_RELOC_PPC_B26
:
865 return &xcoff_howto_table
[0xa];
866 case BFD_RELOC_PPC_BA26
:
867 return &xcoff_howto_table
[8];
868 case BFD_RELOC_PPC_TOC16
:
869 return &xcoff_howto_table
[3];
872 return &xcoff_howto_table
[0];
874 return &xcoff_howto_table
[0x1c];
881 /* XCOFF archive support. The original version of this code was by
882 Damon A. Permezel. It was enhanced to permit cross support, and
883 writing archive files, by Ian Lance Taylor, Cygnus Support.
885 XCOFF uses its own archive format. Everything is hooked together
886 with file offset links, so it is possible to rapidly update an
887 archive in place. Of course, we don't do that. An XCOFF archive
888 has a real file header, not just an ARMAG string. The structure of
889 the file header and of each archive header appear below.
891 An XCOFF archive also has a member table, which is a list of
892 elements in the archive (you can get that by looking through the
893 linked list, but you have to read a lot more of the file). The
894 member table has a normal archive header with an empty name. It is
895 normally (and perhaps must be) the second to last entry in the
896 archive. The member table data is almost printable ASCII. It
897 starts with a 12 character decimal string which is the number of
898 entries in the table. For each entry it has a 12 character decimal
899 string which is the offset in the archive of that member. These
900 entries are followed by a series of null terminated strings which
901 are the member names for each entry.
903 Finally, an XCOFF archive has a global symbol table, which is what
904 we call the armap. The global symbol table has a normal archive
905 header with an empty name. It is normally (and perhaps must be)
906 the last entry in the archive. The contents start with a four byte
907 binary number which is the number of entries. This is followed by
908 a that many four byte binary numbers; each is the file offset of an
909 entry in the archive. These numbers are followed by a series of
910 null terminated strings, which are symbol names.
912 AIX 4.3 introduced a new archive format which can handle larger
913 files and also 32- and 64-bit objects in the same archive. The
914 things said above remain true except that there is now more than
915 one global symbol table. The one is used to index 32-bit objects,
916 the other for 64-bit objects.
918 The new archives (recognizable by the new ARMAG string) has larger
919 field lengths so that we cannot really share any code. Also we have
920 to take care that we are not generating the new form of archives
921 on AIX 4.2 or earlier systems. */
923 /* XCOFF archives use this as a magic string. Note that both strings
924 have the same length. */
926 #define XCOFFARMAG "<aiaff>\012"
927 #define XCOFFARMAGBIG "<bigaf>\012"
928 #define SXCOFFARMAG 8
930 /* This terminates an XCOFF archive member name. */
932 #define XCOFFARFMAG "`\012"
933 #define SXCOFFARFMAG 2
935 /* XCOFF archives start with this (printable) structure. */
937 struct xcoff_ar_file_hdr
940 char magic
[SXCOFFARMAG
];
942 /* Offset of the member table (decimal ASCII string). */
945 /* Offset of the global symbol table (decimal ASCII string). */
948 /* Offset of the first member in the archive (decimal ASCII string). */
949 char firstmemoff
[12];
951 /* Offset of the last member in the archive (decimal ASCII string). */
954 /* Offset of the first member on the free list (decimal ASCII
959 #define SIZEOF_AR_FILE_HDR (5 * 12 + SXCOFFARMAG)
961 /* This is the equivalent data structure for the big archive format. */
963 struct xcoff_ar_file_hdr_big
966 char magic
[SXCOFFARMAG
];
968 /* Offset of the member table (decimal ASCII string). */
971 /* Offset of the global symbol table for 32-bit objects (decimal ASCII
975 /* Offset of the global symbol table for 64-bit objects (decimal ASCII
979 /* Offset of the first member in the archive (decimal ASCII string). */
980 char firstmemoff
[20];
982 /* Offset of the last member in the archive (decimal ASCII string). */
985 /* Offset of the first member on the free list (decimal ASCII
990 #define SIZEOF_AR_FILE_HDR_BIG (6 * 20 + SXCOFFARMAG)
993 /* Each XCOFF archive member starts with this (printable) structure. */
997 /* File size not including the header (decimal ASCII string). */
1000 /* File offset of next archive member (decimal ASCII string). */
1003 /* File offset of previous archive member (decimal ASCII string). */
1006 /* File mtime (decimal ASCII string). */
1009 /* File UID (decimal ASCII string). */
1012 /* File GID (decimal ASCII string). */
1015 /* File mode (octal ASCII string). */
1018 /* Length of file name (decimal ASCII string). */
1021 /* This structure is followed by the file name. The length of the
1022 name is given in the namlen field. If the length of the name is
1023 odd, the name is followed by a null byte. The name and optional
1024 null byte are followed by XCOFFARFMAG, which is not included in
1025 namlen. The contents of the archive member follow; the number of
1026 bytes is given in the size field. */
1029 #define SIZEOF_AR_HDR (7 * 12 + 4)
1031 /* The equivalent for the big archive format. */
1033 struct xcoff_ar_hdr_big
1035 /* File size not including the header (decimal ASCII string). */
1038 /* File offset of next archive member (decimal ASCII string). */
1041 /* File offset of previous archive member (decimal ASCII string). */
1044 /* File mtime (decimal ASCII string). */
1047 /* File UID (decimal ASCII string). */
1050 /* File GID (decimal ASCII string). */
1053 /* File mode (octal ASCII string). */
1056 /* Length of file name (decimal ASCII string). */
1059 /* This structure is followed by the file name. The length of the
1060 name is given in the namlen field. If the length of the name is
1061 odd, the name is followed by a null byte. The name and optional
1062 null byte are followed by XCOFFARFMAG, which is not included in
1063 namlen. The contents of the archive member follow; the number of
1064 bytes is given in the size field. */
1067 #define SIZEOF_AR_HDR_BIG (3 * 20 + 4 * 12 + 4)
1070 /* We often have to distinguish between the old and big file format.
1071 Make it a bit cleaner. We can use `xcoff_ardata' here because the
1072 `hdr' member has the same size and position in both formats. */
1073 #define xcoff_big_format_p(abfd) \
1074 (xcoff_ardata (abfd)->magic[1] == 'b')
1076 /* We store a copy of the xcoff_ar_file_hdr in the tdata field of the
1077 artdata structure. Similar for the big archive. */
1078 #define xcoff_ardata(abfd) \
1079 ((struct xcoff_ar_file_hdr *) bfd_ardata (abfd)->tdata)
1080 #define xcoff_ardata_big(abfd) \
1081 ((struct xcoff_ar_file_hdr_big *) bfd_ardata (abfd)->tdata)
1083 /* We store a copy of the xcoff_ar_hdr in the arelt_data field of an
1084 archive element. Similar for the big archive. */
1085 #define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data))
1086 #define arch_xhdr(bfd) \
1087 ((struct xcoff_ar_hdr *) arch_eltdata (bfd)->arch_header)
1088 #define arch_xhdr_big(bfd) \
1089 ((struct xcoff_ar_hdr_big *) arch_eltdata (bfd)->arch_header)
1091 /* Read in the armap of an XCOFF archive. */
1094 _bfd_xcoff_slurp_armap (abfd
)
1100 bfd_byte
*contents
, *cend
;
1105 if (xcoff_ardata (abfd
) == NULL
)
1107 bfd_has_map (abfd
) = false;
1111 if (! xcoff_big_format_p (abfd
))
1113 /* This is for the old format. */
1114 struct xcoff_ar_hdr hdr
;
1116 off
= strtol (xcoff_ardata (abfd
)->symoff
, (char **) NULL
, 10);
1119 bfd_has_map (abfd
) = false;
1123 if (bfd_seek (abfd
, off
, SEEK_SET
) != 0)
1126 /* The symbol table starts with a normal archive header. */
1127 if (bfd_read ((PTR
) &hdr
, SIZEOF_AR_HDR
, 1, abfd
) != SIZEOF_AR_HDR
)
1130 /* Skip the name (normally empty). */
1131 namlen
= strtol (hdr
.namlen
, (char **) NULL
, 10);
1132 if (bfd_seek (abfd
, ((namlen
+ 1) & ~1) + SXCOFFARFMAG
, SEEK_CUR
) != 0)
1135 sz
= strtol (hdr
.size
, (char **) NULL
, 10);
1139 /* This is for the new format. */
1140 struct xcoff_ar_hdr_big hdr
;
1142 off
= strtol (xcoff_ardata_big (abfd
)->symoff
, (char **) NULL
, 10);
1145 bfd_has_map (abfd
) = false;
1149 if (bfd_seek (abfd
, off
, SEEK_SET
) != 0)
1152 /* The symbol table starts with a normal archive header. */
1153 if (bfd_read ((PTR
) &hdr
, SIZEOF_AR_HDR_BIG
, 1, abfd
)
1154 != SIZEOF_AR_HDR_BIG
)
1157 /* Skip the name (normally empty). */
1158 namlen
= strtol (hdr
.namlen
, (char **) NULL
, 10);
1159 if (bfd_seek (abfd
, ((namlen
+ 1) & ~1) + SXCOFFARFMAG
, SEEK_CUR
) != 0)
1162 /* XXX This actually has to be a call to strtoll (at least on 32-bit
1163 machines) since the field width is 20 and there numbers with more
1164 than 32 bits can be represented. */
1165 sz
= strtol (hdr
.size
, (char **) NULL
, 10);
1168 /* Read in the entire symbol table. */
1169 contents
= (bfd_byte
*) bfd_alloc (abfd
, sz
);
1170 if (contents
== NULL
)
1172 if (bfd_read ((PTR
) contents
, 1, sz
, abfd
) != sz
)
1175 /* The symbol table starts with a four byte count. */
1176 c
= bfd_h_get_32 (abfd
, contents
);
1180 bfd_set_error (bfd_error_bad_value
);
1184 bfd_ardata (abfd
)->symdefs
= ((carsym
*)
1185 bfd_alloc (abfd
, c
* sizeof (carsym
)));
1186 if (bfd_ardata (abfd
)->symdefs
== NULL
)
1189 /* After the count comes a list of four byte file offsets. */
1190 for (i
= 0, arsym
= bfd_ardata (abfd
)->symdefs
, p
= contents
+ 4;
1192 ++i
, ++arsym
, p
+= 4)
1193 arsym
->file_offset
= bfd_h_get_32 (abfd
, p
);
1195 /* After the file offsets come null terminated symbol names. */
1196 cend
= contents
+ sz
;
1197 for (i
= 0, arsym
= bfd_ardata (abfd
)->symdefs
;
1199 ++i
, ++arsym
, p
+= strlen ((char *) p
) + 1)
1203 bfd_set_error (bfd_error_bad_value
);
1206 arsym
->name
= (char *) p
;
1209 bfd_ardata (abfd
)->symdef_count
= c
;
1210 bfd_has_map (abfd
) = true;
1215 /* See if this is an XCOFF archive. */
1218 _bfd_xcoff_archive_p (abfd
)
1221 char magic
[SXCOFFARMAG
];
1223 if (bfd_read ((PTR
) magic
, SXCOFFARMAG
, 1, abfd
) != SXCOFFARMAG
)
1225 if (bfd_get_error () != bfd_error_system_call
)
1226 bfd_set_error (bfd_error_wrong_format
);
1230 if (strncmp (magic
, XCOFFARMAG
, SXCOFFARMAG
) != 0
1231 && strncmp (magic
, XCOFFARMAGBIG
, SXCOFFARMAG
) != 0)
1233 bfd_set_error (bfd_error_wrong_format
);
1237 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
1238 involves a cast, we can't do it as the left operand of
1240 abfd
->tdata
.aout_ar_data
=
1241 (struct artdata
*) bfd_zalloc (abfd
, sizeof (struct artdata
));
1243 if (bfd_ardata (abfd
) == (struct artdata
*) NULL
)
1246 bfd_ardata (abfd
)->cache
= NULL
;
1247 bfd_ardata (abfd
)->archive_head
= NULL
;
1248 bfd_ardata (abfd
)->symdefs
= NULL
;
1249 bfd_ardata (abfd
)->extended_names
= NULL
;
1251 /* Now handle the two formats. */
1252 if (magic
[1] != 'b')
1254 /* This is the old format. */
1255 struct xcoff_ar_file_hdr hdr
;
1257 /* Copy over the magic string. */
1258 memcpy (hdr
.magic
, magic
, SXCOFFARMAG
);
1260 /* Now read the rest of the file header. */
1261 if (bfd_read ((PTR
) &hdr
.memoff
, SIZEOF_AR_FILE_HDR
- SXCOFFARMAG
, 1,
1262 abfd
) != SIZEOF_AR_FILE_HDR
- SXCOFFARMAG
)
1264 if (bfd_get_error () != bfd_error_system_call
)
1265 bfd_set_error (bfd_error_wrong_format
);
1269 bfd_ardata (abfd
)->first_file_filepos
= strtol (hdr
.firstmemoff
,
1270 (char **) NULL
, 10);
1272 bfd_ardata (abfd
)->tdata
= bfd_zalloc (abfd
, SIZEOF_AR_FILE_HDR
);
1273 if (bfd_ardata (abfd
)->tdata
== NULL
)
1276 memcpy (bfd_ardata (abfd
)->tdata
, &hdr
, SIZEOF_AR_FILE_HDR
);
1280 /* This is the new format. */
1281 struct xcoff_ar_file_hdr_big hdr
;
1283 /* Copy over the magic string. */
1284 memcpy (hdr
.magic
, magic
, SXCOFFARMAG
);
1286 /* Now read the rest of the file header. */
1287 if (bfd_read ((PTR
) &hdr
.memoff
, SIZEOF_AR_FILE_HDR_BIG
- SXCOFFARMAG
, 1,
1288 abfd
) != SIZEOF_AR_FILE_HDR_BIG
- SXCOFFARMAG
)
1290 if (bfd_get_error () != bfd_error_system_call
)
1291 bfd_set_error (bfd_error_wrong_format
);
1295 /* XXX This actually has to be a call to strtoll (at least on 32-bit
1296 machines) since the field width is 20 and there numbers with more
1297 than 32 bits can be represented. */
1298 bfd_ardata (abfd
)->first_file_filepos
= strtol (hdr
.firstmemoff
,
1299 (char **) NULL
, 10);
1301 bfd_ardata (abfd
)->tdata
= bfd_zalloc (abfd
, SIZEOF_AR_FILE_HDR_BIG
);
1302 if (bfd_ardata (abfd
)->tdata
== NULL
)
1305 memcpy (bfd_ardata (abfd
)->tdata
, &hdr
, SIZEOF_AR_FILE_HDR_BIG
);
1308 if (! _bfd_xcoff_slurp_armap (abfd
))
1310 bfd_release (abfd
, bfd_ardata (abfd
));
1311 abfd
->tdata
.aout_ar_data
= (struct artdata
*) NULL
;
1318 /* Read the archive header in an XCOFF archive. */
1321 _bfd_xcoff_read_ar_hdr (abfd
)
1325 struct areltdata
*ret
;
1327 ret
= (struct areltdata
*) bfd_alloc (abfd
, sizeof (struct areltdata
));
1331 if (! xcoff_big_format_p (abfd
))
1333 struct xcoff_ar_hdr hdr
;
1334 struct xcoff_ar_hdr
*hdrp
;
1336 if (bfd_read ((PTR
) &hdr
, SIZEOF_AR_HDR
, 1, abfd
) != SIZEOF_AR_HDR
)
1342 namlen
= strtol (hdr
.namlen
, (char **) NULL
, 10);
1343 hdrp
= (struct xcoff_ar_hdr
*) bfd_alloc (abfd
,
1344 SIZEOF_AR_HDR
+ namlen
+ 1);
1350 memcpy (hdrp
, &hdr
, SIZEOF_AR_HDR
);
1351 if (bfd_read ((char *) hdrp
+ SIZEOF_AR_HDR
, 1, namlen
, abfd
) != namlen
)
1356 ((char *) hdrp
)[SIZEOF_AR_HDR
+ namlen
] = '\0';
1358 ret
->arch_header
= (char *) hdrp
;
1359 ret
->parsed_size
= strtol (hdr
.size
, (char **) NULL
, 10);
1360 ret
->filename
= (char *) hdrp
+ SIZEOF_AR_HDR
;
1364 struct xcoff_ar_hdr_big hdr
;
1365 struct xcoff_ar_hdr_big
*hdrp
;
1367 if (bfd_read ((PTR
) &hdr
, SIZEOF_AR_HDR_BIG
, 1, abfd
)
1368 != SIZEOF_AR_HDR_BIG
)
1374 namlen
= strtol (hdr
.namlen
, (char **) NULL
, 10);
1375 hdrp
= (struct xcoff_ar_hdr_big
*) bfd_alloc (abfd
,
1383 memcpy (hdrp
, &hdr
, SIZEOF_AR_HDR_BIG
);
1384 if (bfd_read ((char *) hdrp
+ SIZEOF_AR_HDR_BIG
, 1, namlen
, abfd
) != namlen
)
1389 ((char *) hdrp
)[SIZEOF_AR_HDR_BIG
+ namlen
] = '\0';
1391 ret
->arch_header
= (char *) hdrp
;
1392 /* XXX This actually has to be a call to strtoll (at least on 32-bit
1393 machines) since the field width is 20 and there numbers with more
1394 than 32 bits can be represented. */
1395 ret
->parsed_size
= strtol (hdr
.size
, (char **) NULL
, 10);
1396 ret
->filename
= (char *) hdrp
+ SIZEOF_AR_HDR_BIG
;
1399 /* Skip over the XCOFFARFMAG at the end of the file name. */
1400 if (bfd_seek (abfd
, (namlen
& 1) + SXCOFFARFMAG
, SEEK_CUR
) != 0)
1406 /* Open the next element in an XCOFF archive. */
1409 _bfd_xcoff_openr_next_archived_file (archive
, last_file
)
1415 if (xcoff_ardata (archive
) == NULL
)
1417 bfd_set_error (bfd_error_invalid_operation
);
1421 if (! xcoff_big_format_p (archive
))
1423 if (last_file
== NULL
)
1424 filestart
= bfd_ardata (archive
)->first_file_filepos
;
1426 filestart
= strtol (arch_xhdr (last_file
)->nextoff
, (char **) NULL
,
1430 || filestart
== strtol (xcoff_ardata (archive
)->memoff
,
1432 || filestart
== strtol (xcoff_ardata (archive
)->symoff
,
1433 (char **) NULL
, 10))
1435 bfd_set_error (bfd_error_no_more_archived_files
);
1441 if (last_file
== NULL
)
1442 filestart
= bfd_ardata (archive
)->first_file_filepos
;
1444 /* XXX These actually have to be a calls to strtoll (at least
1445 on 32-bit machines) since the fields's width is 20 and
1446 there numbers with more than 32 bits can be represented. */
1447 filestart
= strtol (arch_xhdr_big (last_file
)->nextoff
, (char **) NULL
,
1450 /* XXX These actually have to be calls to strtoll (at least on 32-bit
1451 machines) since the fields's width is 20 and there numbers with more
1452 than 32 bits can be represented. */
1454 || filestart
== strtol (xcoff_ardata_big (archive
)->memoff
,
1456 || filestart
== strtol (xcoff_ardata_big (archive
)->symoff
,
1457 (char **) NULL
, 10))
1459 bfd_set_error (bfd_error_no_more_archived_files
);
1464 return _bfd_get_elt_at_filepos (archive
, filestart
);
1467 /* Stat an element in an XCOFF archive. */
1470 _bfd_xcoff_generic_stat_arch_elt (abfd
, s
)
1474 if (abfd
->arelt_data
== NULL
)
1476 bfd_set_error (bfd_error_invalid_operation
);
1480 if (! xcoff_big_format_p (abfd
))
1482 struct xcoff_ar_hdr
*hdrp
= arch_xhdr (abfd
);
1484 s
->st_mtime
= strtol (hdrp
->date
, (char **) NULL
, 10);
1485 s
->st_uid
= strtol (hdrp
->uid
, (char **) NULL
, 10);
1486 s
->st_gid
= strtol (hdrp
->gid
, (char **) NULL
, 10);
1487 s
->st_mode
= strtol (hdrp
->mode
, (char **) NULL
, 8);
1488 s
->st_size
= arch_eltdata (abfd
)->parsed_size
;
1492 struct xcoff_ar_hdr_big
*hdrp
= arch_xhdr_big (abfd
);
1494 s
->st_mtime
= strtol (hdrp
->date
, (char **) NULL
, 10);
1495 s
->st_uid
= strtol (hdrp
->uid
, (char **) NULL
, 10);
1496 s
->st_gid
= strtol (hdrp
->gid
, (char **) NULL
, 10);
1497 s
->st_mode
= strtol (hdrp
->mode
, (char **) NULL
, 8);
1498 s
->st_size
= arch_eltdata (abfd
)->parsed_size
;
1504 /* Normalize a file name for inclusion in an archive. */
1507 normalize_filename (abfd
)
1511 const char *filename
;
1513 file
= bfd_get_filename (abfd
);
1514 filename
= strrchr (file
, '/');
1515 if (filename
!= NULL
)
1522 /* Write out an XCOFF armap. */
1526 xcoff_write_armap_old (abfd
, elength
, map
, orl_count
, stridx
)
1528 unsigned int elength ATTRIBUTE_UNUSED
;
1530 unsigned int orl_count
;
1533 struct xcoff_ar_hdr hdr
;
1535 unsigned char buf
[4];
1540 memset (&hdr
, 0, sizeof hdr
);
1541 sprintf (hdr
.size
, "%ld", (long) (4 + orl_count
* 4 + stridx
));
1542 sprintf (hdr
.nextoff
, "%d", 0);
1543 memcpy (hdr
.prevoff
, xcoff_ardata (abfd
)->memoff
, 12);
1544 sprintf (hdr
.date
, "%d", 0);
1545 sprintf (hdr
.uid
, "%d", 0);
1546 sprintf (hdr
.gid
, "%d", 0);
1547 sprintf (hdr
.mode
, "%d", 0);
1548 sprintf (hdr
.namlen
, "%d", 0);
1550 /* We need spaces, not null bytes, in the header. */
1551 for (p
= (char *) &hdr
; p
< (char *) &hdr
+ SIZEOF_AR_HDR
; p
++)
1555 if (bfd_write ((PTR
) &hdr
, SIZEOF_AR_HDR
, 1, abfd
) != SIZEOF_AR_HDR
1556 || bfd_write (XCOFFARFMAG
, 1, SXCOFFARFMAG
, abfd
) != SXCOFFARFMAG
)
1559 bfd_h_put_32 (abfd
, orl_count
, buf
);
1560 if (bfd_write (buf
, 1, 4, abfd
) != 4)
1563 sub
= abfd
->archive_head
;
1564 fileoff
= SIZEOF_AR_FILE_HDR
;
1566 while (sub
!= NULL
&& i
< orl_count
)
1570 while (((bfd
*) (map
[i
]).pos
) == sub
)
1572 bfd_h_put_32 (abfd
, fileoff
, buf
);
1573 if (bfd_write (buf
, 1, 4, abfd
) != 4)
1577 namlen
= strlen (normalize_filename (sub
));
1578 namlen
= (namlen
+ 1) &~ 1;
1579 fileoff
+= (SIZEOF_AR_HDR
1582 + arelt_size (sub
));
1583 fileoff
= (fileoff
+ 1) &~ 1;
1587 for (i
= 0; i
< orl_count
; i
++)
1592 name
= *map
[i
].name
;
1593 namlen
= strlen (name
);
1594 if (bfd_write (name
, 1, namlen
+ 1, abfd
) != namlen
+ 1)
1598 if ((stridx
& 1) != 0)
1603 if (bfd_write (&b
, 1, 1, abfd
) != 1)
1612 xcoff_write_armap_big (abfd
, elength
, map
, orl_count
, stridx
)
1614 unsigned int elength ATTRIBUTE_UNUSED
;
1616 unsigned int orl_count
;
1619 struct xcoff_ar_hdr_big hdr
;
1621 unsigned char buf
[4];
1626 memset (&hdr
, 0, sizeof hdr
);
1627 /* XXX This call actually should use %lld (at least on 32-bit
1628 machines) since the fields's width is 20 and there numbers with
1629 more than 32 bits can be represented. */
1630 sprintf (hdr
.size
, "%ld", (long) (4 + orl_count
* 4 + stridx
));
1631 sprintf (hdr
.nextoff
, "%d", 0);
1632 memcpy (hdr
.prevoff
, xcoff_ardata (abfd
)->memoff
, 12);
1633 sprintf (hdr
.date
, "%d", 0);
1634 sprintf (hdr
.uid
, "%d", 0);
1635 sprintf (hdr
.gid
, "%d", 0);
1636 sprintf (hdr
.mode
, "%d", 0);
1637 sprintf (hdr
.namlen
, "%d", 0);
1639 /* We need spaces, not null bytes, in the header. */
1640 for (p
= (char *) &hdr
; p
< (char *) &hdr
+ SIZEOF_AR_HDR_BIG
; p
++)
1644 if (bfd_write ((PTR
) &hdr
, SIZEOF_AR_HDR_BIG
, 1, abfd
) != SIZEOF_AR_HDR_BIG
1645 || bfd_write (XCOFFARFMAG
, 1, SXCOFFARFMAG
, abfd
) != SXCOFFARFMAG
)
1648 bfd_h_put_32 (abfd
, orl_count
, buf
);
1649 if (bfd_write (buf
, 1, 4, abfd
) != 4)
1652 sub
= abfd
->archive_head
;
1653 fileoff
= SIZEOF_AR_FILE_HDR_BIG
;
1655 while (sub
!= NULL
&& i
< orl_count
)
1659 while (((bfd
*) (map
[i
]).pos
) == sub
)
1661 bfd_h_put_32 (abfd
, fileoff
, buf
);
1662 if (bfd_write (buf
, 1, 4, abfd
) != 4)
1666 namlen
= strlen (normalize_filename (sub
));
1667 namlen
= (namlen
+ 1) &~ 1;
1668 fileoff
+= (SIZEOF_AR_HDR_BIG
1671 + arelt_size (sub
));
1672 fileoff
= (fileoff
+ 1) &~ 1;
1676 for (i
= 0; i
< orl_count
; i
++)
1681 name
= *map
[i
].name
;
1682 namlen
= strlen (name
);
1683 if (bfd_write (name
, 1, namlen
+ 1, abfd
) != namlen
+ 1)
1687 if ((stridx
& 1) != 0)
1692 if (bfd_write (&b
, 1, 1, abfd
) != 1)
1701 _bfd_xcoff_write_armap (abfd
, elength
, map
, orl_count
, stridx
)
1703 unsigned int elength ATTRIBUTE_UNUSED
;
1705 unsigned int orl_count
;
1708 if (! xcoff_big_format_p (abfd
))
1709 return xcoff_write_armap_old (abfd
, elength
, map
, orl_count
, stridx
);
1711 return xcoff_write_armap_big (abfd
, elength
, map
, orl_count
, stridx
);
1714 /* Write out an XCOFF archive. We always write an entire archive,
1715 rather than fussing with the freelist and so forth. */
1718 xcoff_write_archive_contents_old (abfd
)
1721 struct xcoff_ar_file_hdr fhdr
;
1723 size_t total_namlen
;
1727 file_ptr prevoff
, nextoff
;
1730 struct xcoff_ar_hdr ahdr
;
1735 memset (&fhdr
, 0, sizeof fhdr
);
1736 strncpy (fhdr
.magic
, XCOFFARMAG
, SXCOFFARMAG
);
1737 sprintf (fhdr
.firstmemoff
, "%d", SIZEOF_AR_FILE_HDR
);
1738 sprintf (fhdr
.freeoff
, "%d", 0);
1742 for (sub
= abfd
->archive_head
; sub
!= NULL
; sub
= sub
->next
)
1745 total_namlen
+= strlen (normalize_filename (sub
)) + 1;
1747 offsets
= (file_ptr
*) bfd_alloc (abfd
, count
* sizeof (file_ptr
));
1748 if (offsets
== NULL
)
1751 if (bfd_seek (abfd
, SIZEOF_AR_FILE_HDR
, SEEK_SET
) != 0)
1754 makemap
= bfd_has_map (abfd
);
1757 nextoff
= SIZEOF_AR_FILE_HDR
;
1758 for (sub
= abfd
->archive_head
, i
= 0; sub
!= NULL
; sub
= sub
->next
, i
++)
1762 struct xcoff_ar_hdr
*ahdrp
;
1763 bfd_size_type remaining
;
1765 if (makemap
&& ! hasobjects
)
1767 if (bfd_check_format (sub
, bfd_object
))
1771 name
= normalize_filename (sub
);
1772 namlen
= strlen (name
);
1774 if (sub
->arelt_data
!= NULL
)
1775 ahdrp
= arch_xhdr (sub
);
1783 memset (&ahdr
, 0, sizeof ahdr
);
1785 if (stat (bfd_get_filename (sub
), &s
) != 0)
1787 bfd_set_error (bfd_error_system_call
);
1791 sprintf (ahdrp
->size
, "%ld", (long) s
.st_size
);
1792 sprintf (ahdrp
->date
, "%ld", (long) s
.st_mtime
);
1793 sprintf (ahdrp
->uid
, "%ld", (long) s
.st_uid
);
1794 sprintf (ahdrp
->gid
, "%ld", (long) s
.st_gid
);
1795 sprintf (ahdrp
->mode
, "%o", (unsigned int) s
.st_mode
);
1797 if (sub
->arelt_data
== NULL
)
1799 sub
->arelt_data
= bfd_alloc (sub
, sizeof (struct areltdata
));
1800 if (sub
->arelt_data
== NULL
)
1804 arch_eltdata (sub
)->parsed_size
= s
.st_size
;
1807 sprintf (ahdrp
->prevoff
, "%ld", (long) prevoff
);
1808 sprintf (ahdrp
->namlen
, "%ld", (long) namlen
);
1810 /* If the length of the name is odd, we write out the null byte
1811 after the name as well. */
1812 namlen
= (namlen
+ 1) &~ 1;
1814 remaining
= arelt_size (sub
);
1815 size
= (SIZEOF_AR_HDR
1820 BFD_ASSERT (nextoff
== bfd_tell (abfd
));
1822 offsets
[i
] = nextoff
;
1825 nextoff
+= size
+ (size
& 1);
1827 sprintf (ahdrp
->nextoff
, "%ld", (long) nextoff
);
1829 /* We need spaces, not null bytes, in the header. */
1830 for (p
= (char *) ahdrp
; p
< (char *) ahdrp
+ SIZEOF_AR_HDR
; p
++)
1834 if (bfd_write ((PTR
) ahdrp
, 1, SIZEOF_AR_HDR
, abfd
) != SIZEOF_AR_HDR
1835 || bfd_write ((PTR
) name
, 1, namlen
, abfd
) != namlen
1836 || (bfd_write ((PTR
) XCOFFARFMAG
, 1, SXCOFFARFMAG
, abfd
)
1840 if (bfd_seek (sub
, (file_ptr
) 0, SEEK_SET
) != 0)
1842 while (remaining
!= 0)
1845 bfd_byte buffer
[DEFAULT_BUFFERSIZE
];
1847 amt
= sizeof buffer
;
1848 if (amt
> remaining
)
1850 if (bfd_read (buffer
, 1, amt
, sub
) != amt
1851 || bfd_write (buffer
, 1, amt
, abfd
) != amt
)
1856 if ((size
& 1) != 0)
1861 if (bfd_write (&b
, 1, 1, abfd
) != 1)
1866 sprintf (fhdr
.lastmemoff
, "%ld", (long) prevoff
);
1868 /* Write out the member table. */
1870 BFD_ASSERT (nextoff
== bfd_tell (abfd
));
1871 sprintf (fhdr
.memoff
, "%ld", (long) nextoff
);
1873 memset (&ahdr
, 0, sizeof ahdr
);
1874 sprintf (ahdr
.size
, "%ld", (long) (12 + count
* 12 + total_namlen
));
1875 sprintf (ahdr
.prevoff
, "%ld", (long) prevoff
);
1876 sprintf (ahdr
.date
, "%d", 0);
1877 sprintf (ahdr
.uid
, "%d", 0);
1878 sprintf (ahdr
.gid
, "%d", 0);
1879 sprintf (ahdr
.mode
, "%d", 0);
1880 sprintf (ahdr
.namlen
, "%d", 0);
1882 size
= (SIZEOF_AR_HDR
1889 nextoff
+= size
+ (size
& 1);
1891 if (makemap
&& hasobjects
)
1892 sprintf (ahdr
.nextoff
, "%ld", (long) nextoff
);
1894 sprintf (ahdr
.nextoff
, "%d", 0);
1896 /* We need spaces, not null bytes, in the header. */
1897 for (p
= (char *) &ahdr
; p
< (char *) &ahdr
+ SIZEOF_AR_HDR
; p
++)
1901 if (bfd_write ((PTR
) &ahdr
, 1, SIZEOF_AR_HDR
, abfd
) != SIZEOF_AR_HDR
1902 || (bfd_write ((PTR
) XCOFFARFMAG
, 1, SXCOFFARFMAG
, abfd
)
1906 sprintf (decbuf
, "%-12ld", (long) count
);
1907 if (bfd_write ((PTR
) decbuf
, 1, 12, abfd
) != 12)
1909 for (i
= 0; i
< count
; i
++)
1911 sprintf (decbuf
, "%-12ld", (long) offsets
[i
]);
1912 if (bfd_write ((PTR
) decbuf
, 1, 12, abfd
) != 12)
1915 for (sub
= abfd
->archive_head
; sub
!= NULL
; sub
= sub
->next
)
1920 name
= normalize_filename (sub
);
1921 namlen
= strlen (name
);
1922 if (bfd_write ((PTR
) name
, 1, namlen
+ 1, abfd
) != namlen
+ 1)
1925 if ((size
& 1) != 0)
1930 if (bfd_write ((PTR
) &b
, 1, 1, abfd
) != 1)
1934 /* Write out the armap, if appropriate. */
1936 if (! makemap
|| ! hasobjects
)
1937 sprintf (fhdr
.symoff
, "%d", 0);
1940 BFD_ASSERT (nextoff
== bfd_tell (abfd
));
1941 sprintf (fhdr
.symoff
, "%ld", (long) nextoff
);
1942 bfd_ardata (abfd
)->tdata
= (PTR
) &fhdr
;
1943 if (! _bfd_compute_and_write_armap (abfd
, 0))
1947 /* Write out the archive file header. */
1949 /* We need spaces, not null bytes, in the header. */
1950 for (p
= (char *) &fhdr
; p
< (char *) &fhdr
+ SIZEOF_AR_FILE_HDR
; p
++)
1954 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0
1955 || (bfd_write ((PTR
) &fhdr
, SIZEOF_AR_FILE_HDR
, 1, abfd
) !=
1956 SIZEOF_AR_FILE_HDR
))
1963 xcoff_write_archive_contents_big (abfd
)
1966 struct xcoff_ar_file_hdr_big fhdr
;
1968 size_t total_namlen
;
1972 file_ptr prevoff
, nextoff
;
1975 struct xcoff_ar_hdr_big ahdr
;
1980 memset (&fhdr
, 0, sizeof fhdr
);
1981 strncpy (fhdr
.magic
, XCOFFARMAGBIG
, SXCOFFARMAG
);
1982 sprintf (fhdr
.firstmemoff
, "%d", SIZEOF_AR_FILE_HDR_BIG
);
1983 sprintf (fhdr
.freeoff
, "%d", 0);
1987 for (sub
= abfd
->archive_head
; sub
!= NULL
; sub
= sub
->next
)
1990 total_namlen
+= strlen (normalize_filename (sub
)) + 1;
1992 offsets
= (file_ptr
*) bfd_alloc (abfd
, count
* sizeof (file_ptr
));
1993 if (offsets
== NULL
)
1996 if (bfd_seek (abfd
, SIZEOF_AR_FILE_HDR_BIG
, SEEK_SET
) != 0)
1999 makemap
= bfd_has_map (abfd
);
2002 nextoff
= SIZEOF_AR_FILE_HDR_BIG
;
2003 for (sub
= abfd
->archive_head
, i
= 0; sub
!= NULL
; sub
= sub
->next
, i
++)
2007 struct xcoff_ar_hdr_big
*ahdrp
;
2008 bfd_size_type remaining
;
2010 if (makemap
&& ! hasobjects
)
2012 if (bfd_check_format (sub
, bfd_object
))
2016 name
= normalize_filename (sub
);
2017 namlen
= strlen (name
);
2019 if (sub
->arelt_data
!= NULL
)
2020 ahdrp
= arch_xhdr_big (sub
);
2028 memset (&ahdr
, 0, sizeof ahdr
);
2030 /* XXX This should actually be a call to stat64 (at least on
2031 32-bit machines). */
2032 if (stat (bfd_get_filename (sub
), &s
) != 0)
2034 bfd_set_error (bfd_error_system_call
);
2038 /* XXX This call actually should use %lld (at least on 32-bit
2039 machines) since the fields's width is 20 and there numbers with
2040 more than 32 bits can be represented. */
2041 sprintf (ahdrp
->size
, "%ld", (long) s
.st_size
);
2042 sprintf (ahdrp
->date
, "%ld", (long) s
.st_mtime
);
2043 sprintf (ahdrp
->uid
, "%ld", (long) s
.st_uid
);
2044 sprintf (ahdrp
->gid
, "%ld", (long) s
.st_gid
);
2045 sprintf (ahdrp
->mode
, "%o", (unsigned int) s
.st_mode
);
2047 if (sub
->arelt_data
== NULL
)
2049 sub
->arelt_data
= bfd_alloc (sub
, sizeof (struct areltdata
));
2050 if (sub
->arelt_data
== NULL
)
2054 arch_eltdata (sub
)->parsed_size
= s
.st_size
;
2057 /* XXX These calls actually should use %lld (at least on 32-bit
2058 machines) since the fields's width is 20 and there numbers with
2059 more than 32 bits can be represented. */
2060 sprintf (ahdrp
->prevoff
, "%ld", (long) prevoff
);
2061 sprintf (ahdrp
->namlen
, "%ld", (long) namlen
);
2063 /* If the length of the name is odd, we write out the null byte
2064 after the name as well. */
2065 namlen
= (namlen
+ 1) &~ 1;
2067 remaining
= arelt_size (sub
);
2068 size
= (SIZEOF_AR_HDR_BIG
2073 BFD_ASSERT (nextoff
== bfd_tell (abfd
));
2075 offsets
[i
] = nextoff
;
2078 nextoff
+= size
+ (size
& 1);
2080 sprintf (ahdrp
->nextoff
, "%ld", (long) nextoff
);
2082 /* We need spaces, not null bytes, in the header. */
2083 for (p
= (char *) ahdrp
; p
< (char *) ahdrp
+ SIZEOF_AR_HDR_BIG
; p
++)
2087 if (bfd_write ((PTR
) ahdrp
, 1, SIZEOF_AR_HDR_BIG
, abfd
)
2088 != SIZEOF_AR_HDR_BIG
2089 || bfd_write ((PTR
) name
, 1, namlen
, abfd
) != namlen
2090 || (bfd_write ((PTR
) XCOFFARFMAG
, 1, SXCOFFARFMAG
, abfd
)
2094 if (bfd_seek (sub
, (file_ptr
) 0, SEEK_SET
) != 0)
2096 while (remaining
!= 0)
2099 bfd_byte buffer
[DEFAULT_BUFFERSIZE
];
2101 amt
= sizeof buffer
;
2102 if (amt
> remaining
)
2104 if (bfd_read (buffer
, 1, amt
, sub
) != amt
2105 || bfd_write (buffer
, 1, amt
, abfd
) != amt
)
2110 if ((size
& 1) != 0)
2115 if (bfd_write (&b
, 1, 1, abfd
) != 1)
2120 /* XXX This call actually should use %lld (at least on 32-bit
2121 machines) since the fields's width is 20 and there numbers with
2122 more than 32 bits can be represented. */
2123 sprintf (fhdr
.lastmemoff
, "%ld", (long) prevoff
);
2125 /* Write out the member table. */
2127 BFD_ASSERT (nextoff
== bfd_tell (abfd
));
2128 /* XXX This call actually should use %lld (at least on 32-bit
2129 machines) since the fields's width is 20 and there numbers with
2130 more than 32 bits can be represented. */
2131 sprintf (fhdr
.memoff
, "%ld", (long) nextoff
);
2133 memset (&ahdr
, 0, sizeof ahdr
);
2134 /* XXX The next two calls actually should use %lld (at least on 32-bit
2135 machines) since the fields's width is 20 and there numbers with
2136 more than 32 bits can be represented. */
2137 sprintf (ahdr
.size
, "%ld", (long) (12 + count
* 12 + total_namlen
));
2138 sprintf (ahdr
.prevoff
, "%ld", (long) prevoff
);
2139 sprintf (ahdr
.date
, "%d", 0);
2140 sprintf (ahdr
.uid
, "%d", 0);
2141 sprintf (ahdr
.gid
, "%d", 0);
2142 sprintf (ahdr
.mode
, "%d", 0);
2143 sprintf (ahdr
.namlen
, "%d", 0);
2145 size
= (SIZEOF_AR_HDR_BIG
2152 nextoff
+= size
+ (size
& 1);
2154 if (makemap
&& hasobjects
)
2155 /* XXX This call actually should use %lld (at least on 32-bit
2156 machines) since the fields's width is 20 and there numbers with
2157 more than 32 bits can be represented. */
2158 sprintf (ahdr
.nextoff
, "%ld", (long) nextoff
);
2160 sprintf (ahdr
.nextoff
, "%d", 0);
2162 /* We need spaces, not null bytes, in the header. */
2163 for (p
= (char *) &ahdr
; p
< (char *) &ahdr
+ SIZEOF_AR_HDR_BIG
; p
++)
2167 if (bfd_write ((PTR
) &ahdr
, 1, SIZEOF_AR_HDR_BIG
, abfd
) != SIZEOF_AR_HDR_BIG
2168 || (bfd_write ((PTR
) XCOFFARFMAG
, 1, SXCOFFARFMAG
, abfd
)
2172 sprintf (decbuf
, "%-12ld", (long) count
);
2173 if (bfd_write ((PTR
) decbuf
, 1, 12, abfd
) != 12)
2175 for (i
= 0; i
< count
; i
++)
2177 sprintf (decbuf
, "%-12ld", (long) offsets
[i
]);
2178 if (bfd_write ((PTR
) decbuf
, 1, 12, abfd
) != 12)
2181 for (sub
= abfd
->archive_head
; sub
!= NULL
; sub
= sub
->next
)
2186 name
= normalize_filename (sub
);
2187 namlen
= strlen (name
);
2188 if (bfd_write ((PTR
) name
, 1, namlen
+ 1, abfd
) != namlen
+ 1)
2191 if ((size
& 1) != 0)
2196 if (bfd_write ((PTR
) &b
, 1, 1, abfd
) != 1)
2200 /* Write out the armap, if appropriate. */
2202 if (! makemap
|| ! hasobjects
)
2203 sprintf (fhdr
.symoff
, "%d", 0);
2206 BFD_ASSERT (nextoff
== bfd_tell (abfd
));
2207 /* XXX This call actually should use %lld (at least on 32-bit
2208 machines) since the fields's width is 20 and there numbers with
2209 more than 32 bits can be represented. */
2210 sprintf (fhdr
.symoff
, "%ld", (long) nextoff
);
2211 bfd_ardata (abfd
)->tdata
= (PTR
) &fhdr
;
2212 if (! _bfd_compute_and_write_armap (abfd
, 0))
2216 /* Write out the archive file header. */
2218 /* We need spaces, not null bytes, in the header. */
2219 for (p
= (char *) &fhdr
; p
< (char *) &fhdr
+ SIZEOF_AR_FILE_HDR_BIG
; p
++)
2223 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0
2224 || (bfd_write ((PTR
) &fhdr
, SIZEOF_AR_FILE_HDR_BIG
, 1, abfd
) !=
2225 SIZEOF_AR_FILE_HDR_BIG
))
2232 _bfd_xcoff_write_archive_contents (abfd
)
2235 if (! xcoff_big_format_p (abfd
))
2236 return xcoff_write_archive_contents_old (abfd
);
2238 return xcoff_write_archive_contents_big (abfd
);
2241 /* We can't use the usual coff_sizeof_headers routine, because AIX
2242 always uses an a.out header. */
2246 _bfd_xcoff_sizeof_headers (abfd
, reloc
)
2248 boolean reloc ATTRIBUTE_UNUSED
;
2253 if (xcoff_data (abfd
)->full_aouthdr
)
2256 size
+= SMALL_AOUTSZ
;
2257 size
+= abfd
->section_count
* SCNHSZ
;