Home | History | Annotate | Line # | Download | only in bfd
coff-rs6000.c revision 1.1.1.2
      1      1.1     skrll /* BFD back-end for IBM RS/6000 "XCOFF" files.
      2      1.1     skrll    Copyright 1990-1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
      3  1.1.1.2  christos    2008, 2009, 2010
      4  1.1.1.2  christos    Free Software Foundation, Inc.
      5      1.1     skrll    Written by Metin G. Ozisik, Mimi Phuong-Thao Vo, and John Gilmore.
      6      1.1     skrll    Archive support from Damon A. Permezel.
      7      1.1     skrll    Contributed by IBM Corporation and Cygnus Support.
      8      1.1     skrll 
      9      1.1     skrll    This file is part of BFD, the Binary File Descriptor library.
     10      1.1     skrll 
     11      1.1     skrll    This program is free software; you can redistribute it and/or modify
     12      1.1     skrll    it under the terms of the GNU General Public License as published by
     13      1.1     skrll    the Free Software Foundation; either version 3 of the License, or
     14      1.1     skrll    (at your option) any later version.
     15      1.1     skrll 
     16      1.1     skrll    This program is distributed in the hope that it will be useful,
     17      1.1     skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     18      1.1     skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     19      1.1     skrll    GNU General Public License for more details.
     20      1.1     skrll 
     21      1.1     skrll    You should have received a copy of the GNU General Public License
     22      1.1     skrll    along with this program; if not, write to the Free Software
     23      1.1     skrll    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     24      1.1     skrll    MA 02110-1301, USA.  */
     25      1.1     skrll 
     26      1.1     skrll #include "sysdep.h"
     27      1.1     skrll #include "bfd.h"
     28      1.1     skrll #include "bfdlink.h"
     29      1.1     skrll #include "libbfd.h"
     30      1.1     skrll #include "coff/internal.h"
     31      1.1     skrll #include "coff/xcoff.h"
     32      1.1     skrll #include "coff/rs6000.h"
     33      1.1     skrll #include "libcoff.h"
     34      1.1     skrll #include "libxcoff.h"
     35      1.1     skrll 
     36      1.1     skrll extern bfd_boolean _bfd_xcoff_mkobject
     37      1.1     skrll   PARAMS ((bfd *));
     38      1.1     skrll extern bfd_boolean _bfd_xcoff_copy_private_bfd_data
     39      1.1     skrll   PARAMS ((bfd *, bfd *));
     40      1.1     skrll extern bfd_boolean _bfd_xcoff_is_local_label_name
     41      1.1     skrll   PARAMS ((bfd *, const char *));
     42      1.1     skrll extern reloc_howto_type *_bfd_xcoff_reloc_type_lookup
     43      1.1     skrll   PARAMS ((bfd *, bfd_reloc_code_real_type));
     44      1.1     skrll extern bfd_boolean _bfd_xcoff_slurp_armap
     45      1.1     skrll   PARAMS ((bfd *));
     46      1.1     skrll extern const bfd_target *_bfd_xcoff_archive_p
     47      1.1     skrll   PARAMS ((bfd *));
     48      1.1     skrll extern PTR _bfd_xcoff_read_ar_hdr
     49      1.1     skrll   PARAMS ((bfd *));
     50      1.1     skrll extern bfd *_bfd_xcoff_openr_next_archived_file
     51      1.1     skrll   PARAMS ((bfd *, bfd *));
     52      1.1     skrll extern int _bfd_xcoff_stat_arch_elt
     53      1.1     skrll   PARAMS ((bfd *, struct stat *));
     54      1.1     skrll extern bfd_boolean _bfd_xcoff_write_armap
     55      1.1     skrll   PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int));
     56      1.1     skrll extern bfd_boolean _bfd_xcoff_write_archive_contents
     57      1.1     skrll   PARAMS ((bfd *));
     58      1.1     skrll extern int _bfd_xcoff_sizeof_headers
     59      1.1     skrll   PARAMS ((bfd *, struct bfd_link_info *));
     60      1.1     skrll extern void _bfd_xcoff_swap_sym_in
     61      1.1     skrll   PARAMS ((bfd *, PTR, PTR));
     62      1.1     skrll extern unsigned int _bfd_xcoff_swap_sym_out
     63      1.1     skrll   PARAMS ((bfd *, PTR, PTR));
     64      1.1     skrll extern void _bfd_xcoff_swap_aux_in
     65      1.1     skrll   PARAMS ((bfd *, PTR, int, int, int, int, PTR));
     66      1.1     skrll extern unsigned int _bfd_xcoff_swap_aux_out
     67      1.1     skrll   PARAMS ((bfd *, PTR, int, int, int, int, PTR));
     68      1.1     skrll static void xcoff_swap_reloc_in
     69      1.1     skrll   PARAMS ((bfd *, PTR, PTR));
     70      1.1     skrll static unsigned int xcoff_swap_reloc_out
     71      1.1     skrll   PARAMS ((bfd *, PTR, PTR));
     72      1.1     skrll 
     73      1.1     skrll /* Forward declare xcoff_rtype2howto for coffcode.h macro.  */
     74      1.1     skrll void xcoff_rtype2howto
     75      1.1     skrll   PARAMS ((arelent *, struct internal_reloc *));
     76      1.1     skrll 
     77      1.1     skrll /* coffcode.h needs these to be defined.  */
     78      1.1     skrll #define RS6000COFF_C 1
     79      1.1     skrll 
     80      1.1     skrll #define SELECT_RELOC(internal, howto)					\
     81      1.1     skrll   {									\
     82      1.1     skrll     internal.r_type = howto->type;					\
     83      1.1     skrll     internal.r_size =							\
     84      1.1     skrll       ((howto->complain_on_overflow == complain_overflow_signed		\
     85      1.1     skrll 	? 0x80								\
     86      1.1     skrll 	: 0)								\
     87      1.1     skrll        | (howto->bitsize - 1));						\
     88      1.1     skrll   }
     89      1.1     skrll 
     90      1.1     skrll #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
     91      1.1     skrll #define COFF_LONG_FILENAMES
     92      1.1     skrll #define NO_COFF_SYMBOLS
     93      1.1     skrll #define RTYPE2HOWTO(cache_ptr, dst) xcoff_rtype2howto (cache_ptr, dst)
     94      1.1     skrll #define coff_mkobject _bfd_xcoff_mkobject
     95      1.1     skrll #define coff_bfd_copy_private_bfd_data _bfd_xcoff_copy_private_bfd_data
     96      1.1     skrll #define coff_bfd_is_local_label_name _bfd_xcoff_is_local_label_name
     97      1.1     skrll #define coff_bfd_reloc_type_lookup _bfd_xcoff_reloc_type_lookup
     98      1.1     skrll #define coff_bfd_reloc_name_lookup _bfd_xcoff_reloc_name_lookup
     99      1.1     skrll #ifdef AIX_CORE
    100      1.1     skrll extern const bfd_target * rs6000coff_core_p
    101      1.1     skrll   PARAMS ((bfd *abfd));
    102      1.1     skrll extern bfd_boolean rs6000coff_core_file_matches_executable_p
    103      1.1     skrll   PARAMS ((bfd *cbfd, bfd *ebfd));
    104      1.1     skrll extern char *rs6000coff_core_file_failing_command
    105      1.1     skrll   PARAMS ((bfd *abfd));
    106      1.1     skrll extern int rs6000coff_core_file_failing_signal
    107      1.1     skrll   PARAMS ((bfd *abfd));
    108      1.1     skrll #define CORE_FILE_P rs6000coff_core_p
    109      1.1     skrll #define coff_core_file_failing_command \
    110      1.1     skrll   rs6000coff_core_file_failing_command
    111      1.1     skrll #define coff_core_file_failing_signal \
    112      1.1     skrll   rs6000coff_core_file_failing_signal
    113      1.1     skrll #define coff_core_file_matches_executable_p \
    114      1.1     skrll   rs6000coff_core_file_matches_executable_p
    115  1.1.1.2  christos #define coff_core_file_pid \
    116  1.1.1.2  christos   _bfd_nocore_core_file_pid
    117      1.1     skrll #else
    118      1.1     skrll #define CORE_FILE_P _bfd_dummy_target
    119      1.1     skrll #define coff_core_file_failing_command \
    120      1.1     skrll   _bfd_nocore_core_file_failing_command
    121      1.1     skrll #define coff_core_file_failing_signal \
    122      1.1     skrll   _bfd_nocore_core_file_failing_signal
    123      1.1     skrll #define coff_core_file_matches_executable_p \
    124      1.1     skrll   _bfd_nocore_core_file_matches_executable_p
    125  1.1.1.2  christos #define coff_core_file_pid \
    126  1.1.1.2  christos   _bfd_nocore_core_file_pid
    127      1.1     skrll #endif
    128      1.1     skrll #define coff_SWAP_sym_in _bfd_xcoff_swap_sym_in
    129      1.1     skrll #define coff_SWAP_sym_out _bfd_xcoff_swap_sym_out
    130      1.1     skrll #define coff_SWAP_aux_in _bfd_xcoff_swap_aux_in
    131      1.1     skrll #define coff_SWAP_aux_out _bfd_xcoff_swap_aux_out
    132      1.1     skrll #define coff_swap_reloc_in xcoff_swap_reloc_in
    133      1.1     skrll #define coff_swap_reloc_out xcoff_swap_reloc_out
    134      1.1     skrll #define NO_COFF_RELOCS
    135      1.1     skrll 
    136      1.1     skrll #ifndef bfd_pe_print_pdata
    137      1.1     skrll #define bfd_pe_print_pdata	NULL
    138      1.1     skrll #endif
    139      1.1     skrll 
    140      1.1     skrll #include "coffcode.h"
    141      1.1     skrll 
    142      1.1     skrll /* The main body of code is in coffcode.h.  */
    143      1.1     skrll 
    144      1.1     skrll static const char *normalize_filename
    145      1.1     skrll   PARAMS ((bfd *));
    146      1.1     skrll static bfd_boolean xcoff_write_armap_old
    147      1.1     skrll   PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int));
    148      1.1     skrll static bfd_boolean xcoff_write_armap_big
    149      1.1     skrll   PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int));
    150      1.1     skrll static bfd_boolean xcoff_write_archive_contents_old
    151      1.1     skrll   PARAMS ((bfd *));
    152      1.1     skrll static bfd_boolean xcoff_write_archive_contents_big
    153      1.1     skrll   PARAMS ((bfd *));
    154      1.1     skrll static void xcoff_swap_ldhdr_in
    155      1.1     skrll   PARAMS ((bfd *, const PTR, struct internal_ldhdr *));
    156      1.1     skrll static void xcoff_swap_ldhdr_out
    157      1.1     skrll   PARAMS ((bfd *, const struct internal_ldhdr *, PTR));
    158      1.1     skrll static void xcoff_swap_ldsym_in
    159      1.1     skrll   PARAMS ((bfd *, const PTR, struct internal_ldsym *));
    160      1.1     skrll static void xcoff_swap_ldsym_out
    161      1.1     skrll   PARAMS ((bfd *, const struct internal_ldsym *, PTR));
    162      1.1     skrll static void xcoff_swap_ldrel_in
    163      1.1     skrll   PARAMS ((bfd *, const PTR, struct internal_ldrel *));
    164      1.1     skrll static void xcoff_swap_ldrel_out
    165      1.1     skrll   PARAMS ((bfd *, const struct internal_ldrel *, PTR));
    166      1.1     skrll static bfd_boolean xcoff_ppc_relocate_section
    167      1.1     skrll   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
    168      1.1     skrll 	   struct internal_reloc *, struct internal_syment *, asection **));
    169      1.1     skrll static bfd_boolean _bfd_xcoff_put_ldsymbol_name
    170      1.1     skrll   PARAMS ((bfd *, struct xcoff_loader_info *, struct internal_ldsym *,
    171      1.1     skrll 	   const char *));
    172      1.1     skrll static asection *xcoff_create_csect_from_smclas
    173      1.1     skrll   PARAMS ((bfd *, union internal_auxent *, const char *));
    174      1.1     skrll static bfd_boolean xcoff_is_lineno_count_overflow
    175      1.1     skrll   PARAMS ((bfd *, bfd_vma));
    176      1.1     skrll static bfd_boolean xcoff_is_reloc_count_overflow
    177      1.1     skrll   PARAMS ((bfd *, bfd_vma));
    178      1.1     skrll static bfd_vma xcoff_loader_symbol_offset
    179      1.1     skrll   PARAMS ((bfd *, struct internal_ldhdr *));
    180      1.1     skrll static bfd_vma xcoff_loader_reloc_offset
    181      1.1     skrll   PARAMS ((bfd *, struct internal_ldhdr *));
    182      1.1     skrll static bfd_boolean xcoff_generate_rtinit
    183      1.1     skrll   PARAMS ((bfd *, const char *, const char *, bfd_boolean));
    184      1.1     skrll static bfd_boolean do_pad
    185      1.1     skrll   PARAMS ((bfd *, unsigned int));
    186      1.1     skrll static bfd_boolean do_copy
    187      1.1     skrll   PARAMS ((bfd *, bfd *));
    188      1.1     skrll 
    189      1.1     skrll /* Relocation functions */
    190      1.1     skrll static bfd_boolean xcoff_reloc_type_br
    191      1.1     skrll   PARAMS ((XCOFF_RELOC_FUNCTION_ARGS));
    192      1.1     skrll 
    193      1.1     skrll static bfd_boolean xcoff_complain_overflow_dont_func
    194      1.1     skrll   PARAMS ((XCOFF_COMPLAIN_FUNCTION_ARGS));
    195      1.1     skrll static bfd_boolean xcoff_complain_overflow_bitfield_func
    196      1.1     skrll   PARAMS ((XCOFF_COMPLAIN_FUNCTION_ARGS));
    197      1.1     skrll static bfd_boolean xcoff_complain_overflow_signed_func
    198      1.1     skrll   PARAMS ((XCOFF_COMPLAIN_FUNCTION_ARGS));
    199      1.1     skrll static bfd_boolean xcoff_complain_overflow_unsigned_func
    200      1.1     skrll   PARAMS ((XCOFF_COMPLAIN_FUNCTION_ARGS));
    201      1.1     skrll 
    202      1.1     skrll bfd_boolean (*xcoff_calculate_relocation[XCOFF_MAX_CALCULATE_RELOCATION])
    203      1.1     skrll   PARAMS ((XCOFF_RELOC_FUNCTION_ARGS)) =
    204      1.1     skrll {
    205      1.1     skrll   xcoff_reloc_type_pos,	 /* R_POS   (0x00) */
    206      1.1     skrll   xcoff_reloc_type_neg,	 /* R_NEG   (0x01) */
    207      1.1     skrll   xcoff_reloc_type_rel,	 /* R_REL   (0x02) */
    208      1.1     skrll   xcoff_reloc_type_toc,	 /* R_TOC   (0x03) */
    209      1.1     skrll   xcoff_reloc_type_fail, /* R_RTB   (0x04) */
    210      1.1     skrll   xcoff_reloc_type_toc,	 /* R_GL    (0x05) */
    211      1.1     skrll   xcoff_reloc_type_toc,	 /* R_TCL   (0x06) */
    212      1.1     skrll   xcoff_reloc_type_fail, /*	    (0x07) */
    213      1.1     skrll   xcoff_reloc_type_ba,	 /* R_BA    (0x08) */
    214      1.1     skrll   xcoff_reloc_type_fail, /*	    (0x09) */
    215      1.1     skrll   xcoff_reloc_type_br,	 /* R_BR    (0x0a) */
    216      1.1     skrll   xcoff_reloc_type_fail, /*	    (0x0b) */
    217      1.1     skrll   xcoff_reloc_type_pos,	 /* R_RL    (0x0c) */
    218      1.1     skrll   xcoff_reloc_type_pos,	 /* R_RLA   (0x0d) */
    219      1.1     skrll   xcoff_reloc_type_fail, /*	    (0x0e) */
    220      1.1     skrll   xcoff_reloc_type_noop, /* R_REF   (0x0f) */
    221      1.1     skrll   xcoff_reloc_type_fail, /*	    (0x10) */
    222      1.1     skrll   xcoff_reloc_type_fail, /*	    (0x11) */
    223      1.1     skrll   xcoff_reloc_type_toc,	 /* R_TRL   (0x12) */
    224      1.1     skrll   xcoff_reloc_type_toc,	 /* R_TRLA  (0x13) */
    225      1.1     skrll   xcoff_reloc_type_fail, /* R_RRTBI (0x14) */
    226      1.1     skrll   xcoff_reloc_type_fail, /* R_RRTBA (0x15) */
    227      1.1     skrll   xcoff_reloc_type_ba,	 /* R_CAI   (0x16) */
    228      1.1     skrll   xcoff_reloc_type_crel, /* R_CREL  (0x17) */
    229      1.1     skrll   xcoff_reloc_type_ba,	 /* R_RBA   (0x18) */
    230      1.1     skrll   xcoff_reloc_type_ba,	 /* R_RBAC  (0x19) */
    231      1.1     skrll   xcoff_reloc_type_br,	 /* R_RBR   (0x1a) */
    232      1.1     skrll   xcoff_reloc_type_ba,	 /* R_RBRC  (0x1b) */
    233      1.1     skrll };
    234      1.1     skrll 
    235      1.1     skrll bfd_boolean (*xcoff_complain_overflow[XCOFF_MAX_COMPLAIN_OVERFLOW])
    236      1.1     skrll   PARAMS ((XCOFF_COMPLAIN_FUNCTION_ARGS)) =
    237      1.1     skrll {
    238      1.1     skrll   xcoff_complain_overflow_dont_func,
    239      1.1     skrll   xcoff_complain_overflow_bitfield_func,
    240      1.1     skrll   xcoff_complain_overflow_signed_func,
    241      1.1     skrll   xcoff_complain_overflow_unsigned_func,
    242      1.1     skrll };
    243      1.1     skrll 
    244  1.1.1.2  christos /* Information about one member of an archive.  */
    245  1.1.1.2  christos struct member_layout {
    246  1.1.1.2  christos   /* The archive member that this structure describes.  */
    247  1.1.1.2  christos   bfd *member;
    248  1.1.1.2  christos 
    249  1.1.1.2  christos   /* The number of bytes of padding that must be inserted before the
    250  1.1.1.2  christos      start of the member in order to ensure that the section contents
    251  1.1.1.2  christos      are correctly aligned.  */
    252  1.1.1.2  christos   unsigned int leading_padding;
    253  1.1.1.2  christos 
    254  1.1.1.2  christos   /* The offset of MEMBER from the start of the archive (i.e. the end
    255  1.1.1.2  christos      of the leading padding).  */
    256  1.1.1.2  christos   file_ptr offset;
    257  1.1.1.2  christos 
    258  1.1.1.2  christos   /* The normalized name of MEMBER.  */
    259  1.1.1.2  christos   const char *name;
    260  1.1.1.2  christos 
    261  1.1.1.2  christos   /* The length of NAME, without padding.  */
    262  1.1.1.2  christos   bfd_size_type namlen;
    263  1.1.1.2  christos 
    264  1.1.1.2  christos   /* The length of NAME, with padding.  */
    265  1.1.1.2  christos   bfd_size_type padded_namlen;
    266  1.1.1.2  christos 
    267  1.1.1.2  christos   /* The size of MEMBER's header, including the name and magic sequence.  */
    268  1.1.1.2  christos   bfd_size_type header_size;
    269  1.1.1.2  christos 
    270  1.1.1.2  christos   /* The size of the MEMBER's contents.  */
    271  1.1.1.2  christos   bfd_size_type contents_size;
    272  1.1.1.2  christos 
    273  1.1.1.2  christos   /* The number of bytes of padding that must be inserted after MEMBER
    274  1.1.1.2  christos      in order to preserve even alignment.  */
    275  1.1.1.2  christos   bfd_size_type trailing_padding;
    276  1.1.1.2  christos };
    277  1.1.1.2  christos 
    278  1.1.1.2  christos /* A structure used for iterating over the members of an archive.  */
    279  1.1.1.2  christos struct archive_iterator {
    280  1.1.1.2  christos   /* The archive itself.  */
    281  1.1.1.2  christos   bfd *archive;
    282  1.1.1.2  christos 
    283  1.1.1.2  christos   /* Information about the current archive member.  */
    284  1.1.1.2  christos   struct member_layout current;
    285  1.1.1.2  christos 
    286  1.1.1.2  christos   /* Information about the next archive member.  MEMBER is null if there
    287  1.1.1.2  christos      are no more archive members, in which case OFFSET is the offset of
    288  1.1.1.2  christos      the first unused byte.  */
    289  1.1.1.2  christos   struct member_layout next;
    290  1.1.1.2  christos };
    291  1.1.1.2  christos 
    292  1.1.1.2  christos /* Initialize INFO so that it describes member MEMBER of archive ARCHIVE.
    293  1.1.1.2  christos    OFFSET is the even-padded offset of MEMBER, not including any leading
    294  1.1.1.2  christos    padding needed for section alignment.  */
    295  1.1.1.2  christos 
    296  1.1.1.2  christos static void
    297  1.1.1.2  christos member_layout_init (struct member_layout *info, bfd *archive,
    298  1.1.1.2  christos 		    bfd *member, file_ptr offset)
    299  1.1.1.2  christos {
    300  1.1.1.2  christos   info->member = member;
    301  1.1.1.2  christos   info->leading_padding = 0;
    302  1.1.1.2  christos   if (member)
    303  1.1.1.2  christos     {
    304  1.1.1.2  christos       info->name = normalize_filename (member);
    305  1.1.1.2  christos       info->namlen = strlen (info->name);
    306  1.1.1.2  christos       info->padded_namlen = info->namlen + (info->namlen & 1);
    307  1.1.1.2  christos       if (xcoff_big_format_p (archive))
    308  1.1.1.2  christos 	info->header_size = SIZEOF_AR_HDR_BIG;
    309  1.1.1.2  christos       else
    310  1.1.1.2  christos 	info->header_size = SIZEOF_AR_HDR;
    311  1.1.1.2  christos       info->header_size += info->padded_namlen + SXCOFFARFMAG;
    312  1.1.1.2  christos       info->contents_size = arelt_size (member);
    313  1.1.1.2  christos       info->trailing_padding = info->contents_size & 1;
    314  1.1.1.2  christos 
    315  1.1.1.2  christos       if (bfd_check_format (member, bfd_object)
    316  1.1.1.2  christos 	  && bfd_get_flavour (member) == bfd_target_xcoff_flavour
    317  1.1.1.2  christos 	  && (member->flags & DYNAMIC) != 0)
    318  1.1.1.2  christos 	info->leading_padding
    319  1.1.1.2  christos 	  = (-(offset + info->header_size)
    320  1.1.1.2  christos 	     & ((1 << bfd_xcoff_text_align_power (member)) - 1));
    321  1.1.1.2  christos     }
    322  1.1.1.2  christos   info->offset = offset + info->leading_padding;
    323  1.1.1.2  christos }
    324  1.1.1.2  christos 
    325  1.1.1.2  christos /* Set up ITERATOR to iterate through archive ARCHIVE.  */
    326  1.1.1.2  christos 
    327  1.1.1.2  christos static void
    328  1.1.1.2  christos archive_iterator_begin (struct archive_iterator *iterator,
    329  1.1.1.2  christos 			bfd *archive)
    330  1.1.1.2  christos {
    331  1.1.1.2  christos   iterator->archive = archive;
    332  1.1.1.2  christos   member_layout_init (&iterator->next, archive, archive->archive_head,
    333  1.1.1.2  christos 		      xcoff_big_format_p (archive)
    334  1.1.1.2  christos 		      ? SIZEOF_AR_FILE_HDR_BIG
    335  1.1.1.2  christos 		      : SIZEOF_AR_FILE_HDR);
    336  1.1.1.2  christos }
    337  1.1.1.2  christos 
    338  1.1.1.2  christos /* Make ITERATOR visit the first unvisited archive member.  Return true
    339  1.1.1.2  christos    on success; return false if all members have been visited.  */
    340  1.1.1.2  christos 
    341  1.1.1.2  christos static bfd_boolean
    342  1.1.1.2  christos archive_iterator_next (struct archive_iterator *iterator)
    343  1.1.1.2  christos {
    344  1.1.1.2  christos   if (!iterator->next.member)
    345  1.1.1.2  christos     return FALSE;
    346  1.1.1.2  christos 
    347  1.1.1.2  christos   iterator->current = iterator->next;
    348  1.1.1.2  christos   member_layout_init (&iterator->next, iterator->archive,
    349  1.1.1.2  christos 		      iterator->current.member->archive_next,
    350  1.1.1.2  christos 		      iterator->current.offset
    351  1.1.1.2  christos 		      + iterator->current.header_size
    352  1.1.1.2  christos 		      + iterator->current.contents_size
    353  1.1.1.2  christos 		      + iterator->current.trailing_padding);
    354  1.1.1.2  christos   return TRUE;
    355  1.1.1.2  christos }
    356  1.1.1.2  christos 
    357      1.1     skrll /* We use our own tdata type.  Its first field is the COFF tdata type,
    358      1.1     skrll    so the COFF routines are compatible.  */
    359      1.1     skrll 
    360      1.1     skrll bfd_boolean
    361      1.1     skrll _bfd_xcoff_mkobject (abfd)
    362      1.1     skrll      bfd *abfd;
    363      1.1     skrll {
    364      1.1     skrll   coff_data_type *coff;
    365      1.1     skrll   bfd_size_type amt = sizeof (struct xcoff_tdata);
    366      1.1     skrll 
    367      1.1     skrll   abfd->tdata.xcoff_obj_data = (struct xcoff_tdata *) bfd_zalloc (abfd, amt);
    368      1.1     skrll   if (abfd->tdata.xcoff_obj_data == NULL)
    369      1.1     skrll     return FALSE;
    370      1.1     skrll   coff = coff_data (abfd);
    371      1.1     skrll   coff->symbols = (coff_symbol_type *) NULL;
    372      1.1     skrll   coff->conversion_table = (unsigned int *) NULL;
    373      1.1     skrll   coff->raw_syments = (struct coff_ptr_struct *) NULL;
    374      1.1     skrll   coff->relocbase = 0;
    375      1.1     skrll 
    376      1.1     skrll   xcoff_data (abfd)->modtype = ('1' << 8) | 'L';
    377      1.1     skrll 
    378      1.1     skrll   /* We set cputype to -1 to indicate that it has not been
    379      1.1     skrll      initialized.  */
    380      1.1     skrll   xcoff_data (abfd)->cputype = -1;
    381      1.1     skrll 
    382      1.1     skrll   xcoff_data (abfd)->csects = NULL;
    383      1.1     skrll   xcoff_data (abfd)->debug_indices = NULL;
    384      1.1     skrll 
    385      1.1     skrll   /* text section alignment is different than the default */
    386      1.1     skrll   bfd_xcoff_text_align_power (abfd) = 2;
    387      1.1     skrll 
    388      1.1     skrll   return TRUE;
    389      1.1     skrll }
    390      1.1     skrll 
    391      1.1     skrll /* Copy XCOFF data from one BFD to another.  */
    392      1.1     skrll 
    393      1.1     skrll bfd_boolean
    394      1.1     skrll _bfd_xcoff_copy_private_bfd_data (ibfd, obfd)
    395      1.1     skrll      bfd *ibfd;
    396      1.1     skrll      bfd *obfd;
    397      1.1     skrll {
    398      1.1     skrll   struct xcoff_tdata *ix, *ox;
    399      1.1     skrll   asection *sec;
    400      1.1     skrll 
    401      1.1     skrll   if (ibfd->xvec != obfd->xvec)
    402      1.1     skrll     return TRUE;
    403      1.1     skrll   ix = xcoff_data (ibfd);
    404      1.1     skrll   ox = xcoff_data (obfd);
    405      1.1     skrll   ox->full_aouthdr = ix->full_aouthdr;
    406      1.1     skrll   ox->toc = ix->toc;
    407      1.1     skrll   if (ix->sntoc == 0)
    408      1.1     skrll     ox->sntoc = 0;
    409      1.1     skrll   else
    410      1.1     skrll     {
    411      1.1     skrll       sec = coff_section_from_bfd_index (ibfd, ix->sntoc);
    412      1.1     skrll       if (sec == NULL)
    413      1.1     skrll 	ox->sntoc = 0;
    414      1.1     skrll       else
    415      1.1     skrll 	ox->sntoc = sec->output_section->target_index;
    416      1.1     skrll     }
    417      1.1     skrll   if (ix->snentry == 0)
    418      1.1     skrll     ox->snentry = 0;
    419      1.1     skrll   else
    420      1.1     skrll     {
    421      1.1     skrll       sec = coff_section_from_bfd_index (ibfd, ix->snentry);
    422      1.1     skrll       if (sec == NULL)
    423      1.1     skrll 	ox->snentry = 0;
    424      1.1     skrll       else
    425      1.1     skrll 	ox->snentry = sec->output_section->target_index;
    426      1.1     skrll     }
    427      1.1     skrll   bfd_xcoff_text_align_power (obfd) = bfd_xcoff_text_align_power (ibfd);
    428      1.1     skrll   bfd_xcoff_data_align_power (obfd) = bfd_xcoff_data_align_power (ibfd);
    429      1.1     skrll   ox->modtype = ix->modtype;
    430      1.1     skrll   ox->cputype = ix->cputype;
    431      1.1     skrll   ox->maxdata = ix->maxdata;
    432      1.1     skrll   ox->maxstack = ix->maxstack;
    433      1.1     skrll   return TRUE;
    434      1.1     skrll }
    435      1.1     skrll 
    436      1.1     skrll /* I don't think XCOFF really has a notion of local labels based on
    437      1.1     skrll    name.  This will mean that ld -X doesn't actually strip anything.
    438      1.1     skrll    The AIX native linker does not have a -X option, and it ignores the
    439      1.1     skrll    -x option.  */
    440      1.1     skrll 
    441      1.1     skrll bfd_boolean
    442      1.1     skrll _bfd_xcoff_is_local_label_name (abfd, name)
    443      1.1     skrll      bfd *abfd ATTRIBUTE_UNUSED;
    444      1.1     skrll      const char *name ATTRIBUTE_UNUSED;
    445      1.1     skrll {
    446      1.1     skrll   return FALSE;
    447      1.1     skrll }
    448      1.1     skrll 
    449      1.1     skrll void
    451      1.1     skrll _bfd_xcoff_swap_sym_in (abfd, ext1, in1)
    452      1.1     skrll      bfd *abfd;
    453      1.1     skrll      PTR ext1;
    454      1.1     skrll      PTR in1;
    455      1.1     skrll {
    456      1.1     skrll   SYMENT *ext = (SYMENT *)ext1;
    457      1.1     skrll   struct internal_syment * in = (struct internal_syment *)in1;
    458      1.1     skrll 
    459      1.1     skrll   if (ext->e.e_name[0] != 0)
    460      1.1     skrll     {
    461      1.1     skrll       memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
    462      1.1     skrll     }
    463      1.1     skrll   else
    464      1.1     skrll     {
    465      1.1     skrll       in->_n._n_n._n_zeroes = 0;
    466      1.1     skrll       in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
    467      1.1     skrll     }
    468      1.1     skrll 
    469      1.1     skrll   in->n_value = H_GET_32 (abfd, ext->e_value);
    470      1.1     skrll   in->n_scnum = H_GET_16 (abfd, ext->e_scnum);
    471      1.1     skrll   in->n_type = H_GET_16 (abfd, ext->e_type);
    472      1.1     skrll   in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
    473      1.1     skrll   in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
    474      1.1     skrll }
    475      1.1     skrll 
    476      1.1     skrll unsigned int
    477      1.1     skrll _bfd_xcoff_swap_sym_out (abfd, inp, extp)
    478      1.1     skrll      bfd *abfd;
    479      1.1     skrll      PTR inp;
    480      1.1     skrll      PTR extp;
    481      1.1     skrll {
    482      1.1     skrll   struct internal_syment *in = (struct internal_syment *)inp;
    483      1.1     skrll   SYMENT *ext =(SYMENT *)extp;
    484      1.1     skrll 
    485      1.1     skrll   if (in->_n._n_name[0] != 0)
    486      1.1     skrll     {
    487      1.1     skrll       memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
    488      1.1     skrll     }
    489      1.1     skrll   else
    490      1.1     skrll     {
    491      1.1     skrll       H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
    492      1.1     skrll       H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
    493      1.1     skrll     }
    494      1.1     skrll 
    495      1.1     skrll   H_PUT_32 (abfd, in->n_value, ext->e_value);
    496      1.1     skrll   H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
    497      1.1     skrll   H_PUT_16 (abfd, in->n_type, ext->e_type);
    498      1.1     skrll   H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
    499      1.1     skrll   H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
    500      1.1     skrll   return bfd_coff_symesz (abfd);
    501      1.1     skrll }
    502      1.1     skrll 
    503  1.1.1.2  christos void
    504      1.1     skrll _bfd_xcoff_swap_aux_in (abfd, ext1, type, in_class, indx, numaux, in1)
    505      1.1     skrll      bfd *abfd;
    506      1.1     skrll      PTR ext1;
    507  1.1.1.2  christos      int type;
    508      1.1     skrll      int in_class;
    509      1.1     skrll      int indx;
    510      1.1     skrll      int numaux;
    511      1.1     skrll      PTR in1;
    512      1.1     skrll {
    513      1.1     skrll   AUXENT * ext = (AUXENT *)ext1;
    514      1.1     skrll   union internal_auxent *in = (union internal_auxent *)in1;
    515  1.1.1.2  christos 
    516      1.1     skrll   switch (in_class)
    517      1.1     skrll     {
    518      1.1     skrll     case C_FILE:
    519      1.1     skrll       if (ext->x_file.x_fname[0] == 0)
    520      1.1     skrll 	{
    521      1.1     skrll 	  in->x_file.x_n.x_zeroes = 0;
    522      1.1     skrll 	  in->x_file.x_n.x_offset =
    523      1.1     skrll 	    H_GET_32 (abfd, ext->x_file.x_n.x_offset);
    524      1.1     skrll 	}
    525      1.1     skrll       else
    526      1.1     skrll 	{
    527      1.1     skrll 	  if (numaux > 1)
    528      1.1     skrll 	    {
    529      1.1     skrll 	      if (indx == 0)
    530      1.1     skrll 		memcpy (in->x_file.x_fname, ext->x_file.x_fname,
    531      1.1     skrll 			numaux * sizeof (AUXENT));
    532      1.1     skrll 	    }
    533      1.1     skrll 	  else
    534      1.1     skrll 	    {
    535      1.1     skrll 	      memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
    536      1.1     skrll 	    }
    537      1.1     skrll 	}
    538      1.1     skrll       goto end;
    539      1.1     skrll 
    540      1.1     skrll       /* RS/6000 "csect" auxents */
    541  1.1.1.2  christos     case C_EXT:
    542      1.1     skrll     case C_AIX_WEAKEXT:
    543      1.1     skrll     case C_HIDEXT:
    544      1.1     skrll       if (indx + 1 == numaux)
    545      1.1     skrll 	{
    546      1.1     skrll 	  in->x_csect.x_scnlen.l = H_GET_32 (abfd, ext->x_csect.x_scnlen);
    547      1.1     skrll 	  in->x_csect.x_parmhash = H_GET_32 (abfd, ext->x_csect.x_parmhash);
    548      1.1     skrll 	  in->x_csect.x_snhash   = H_GET_16 (abfd, ext->x_csect.x_snhash);
    549      1.1     skrll 	  /* We don't have to hack bitfields in x_smtyp because it's
    550      1.1     skrll 	     defined by shifts-and-ands, which are equivalent on all
    551      1.1     skrll 	     byte orders.  */
    552      1.1     skrll 	  in->x_csect.x_smtyp    = H_GET_8 (abfd, ext->x_csect.x_smtyp);
    553      1.1     skrll 	  in->x_csect.x_smclas   = H_GET_8 (abfd, ext->x_csect.x_smclas);
    554      1.1     skrll 	  in->x_csect.x_stab     = H_GET_32 (abfd, ext->x_csect.x_stab);
    555      1.1     skrll 	  in->x_csect.x_snstab   = H_GET_16 (abfd, ext->x_csect.x_snstab);
    556      1.1     skrll 	  goto end;
    557      1.1     skrll 	}
    558      1.1     skrll       break;
    559      1.1     skrll 
    560      1.1     skrll     case C_STAT:
    561      1.1     skrll     case C_LEAFSTAT:
    562      1.1     skrll     case C_HIDDEN:
    563      1.1     skrll       if (type == T_NULL)
    564      1.1     skrll 	{
    565      1.1     skrll 	  in->x_scn.x_scnlen = H_GET_32 (abfd, ext->x_scn.x_scnlen);
    566      1.1     skrll 	  in->x_scn.x_nreloc = H_GET_16 (abfd, ext->x_scn.x_nreloc);
    567      1.1     skrll 	  in->x_scn.x_nlinno = H_GET_16 (abfd, ext->x_scn.x_nlinno);
    568      1.1     skrll 	  /* PE defines some extra fields; we zero them out for
    569      1.1     skrll 	     safety.  */
    570      1.1     skrll 	  in->x_scn.x_checksum = 0;
    571      1.1     skrll 	  in->x_scn.x_associated = 0;
    572      1.1     skrll 	  in->x_scn.x_comdat = 0;
    573      1.1     skrll 
    574      1.1     skrll 	  goto end;
    575      1.1     skrll 	}
    576      1.1     skrll       break;
    577      1.1     skrll     }
    578      1.1     skrll 
    579      1.1     skrll   in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx);
    580      1.1     skrll   in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
    581  1.1.1.2  christos 
    582  1.1.1.2  christos   if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
    583      1.1     skrll       || ISTAG (in_class))
    584      1.1     skrll     {
    585      1.1     skrll       in->x_sym.x_fcnary.x_fcn.x_lnnoptr =
    586      1.1     skrll 	H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
    587      1.1     skrll       in->x_sym.x_fcnary.x_fcn.x_endndx.l =
    588      1.1     skrll 	H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx);
    589      1.1     skrll     }
    590      1.1     skrll   else
    591      1.1     skrll     {
    592      1.1     skrll       in->x_sym.x_fcnary.x_ary.x_dimen[0] =
    593      1.1     skrll 	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
    594      1.1     skrll       in->x_sym.x_fcnary.x_ary.x_dimen[1] =
    595      1.1     skrll 	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
    596      1.1     skrll       in->x_sym.x_fcnary.x_ary.x_dimen[2] =
    597      1.1     skrll 	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
    598      1.1     skrll       in->x_sym.x_fcnary.x_ary.x_dimen[3] =
    599      1.1     skrll 	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
    600      1.1     skrll     }
    601      1.1     skrll 
    602      1.1     skrll   if (ISFCN (type))
    603      1.1     skrll     {
    604      1.1     skrll       in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
    605      1.1     skrll     }
    606      1.1     skrll   else
    607      1.1     skrll     {
    608      1.1     skrll       in->x_sym.x_misc.x_lnsz.x_lnno =
    609      1.1     skrll 	H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno);
    610      1.1     skrll       in->x_sym.x_misc.x_lnsz.x_size =
    611      1.1     skrll 	H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size);
    612      1.1     skrll     }
    613      1.1     skrll 
    614      1.1     skrll  end: ;
    615      1.1     skrll   /* The semicolon is because MSVC doesn't like labels at
    616      1.1     skrll      end of block.  */
    617      1.1     skrll }
    618      1.1     skrll 
    619      1.1     skrll 
    620      1.1     skrll unsigned int _bfd_xcoff_swap_aux_out
    621      1.1     skrll   PARAMS ((bfd *, PTR, int, int, int, int, PTR));
    622      1.1     skrll 
    623  1.1.1.2  christos unsigned int
    624      1.1     skrll _bfd_xcoff_swap_aux_out (abfd, inp, type, in_class, indx, numaux, extp)
    625      1.1     skrll      bfd * abfd;
    626      1.1     skrll      PTR   inp;
    627  1.1.1.2  christos      int   type;
    628      1.1     skrll      int   in_class;
    629      1.1     skrll      int   indx ATTRIBUTE_UNUSED;
    630      1.1     skrll      int   numaux ATTRIBUTE_UNUSED;
    631      1.1     skrll      PTR   extp;
    632      1.1     skrll {
    633      1.1     skrll   union internal_auxent *in = (union internal_auxent *)inp;
    634      1.1     skrll   AUXENT *ext = (AUXENT *)extp;
    635      1.1     skrll 
    636  1.1.1.2  christos   memset ((PTR)ext, 0, bfd_coff_auxesz (abfd));
    637      1.1     skrll   switch (in_class)
    638      1.1     skrll     {
    639      1.1     skrll     case C_FILE:
    640      1.1     skrll       if (in->x_file.x_fname[0] == 0)
    641      1.1     skrll 	{
    642      1.1     skrll 	  H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes);
    643      1.1     skrll 	  H_PUT_32 (abfd, in->x_file.x_n.x_offset, ext->x_file.x_n.x_offset);
    644      1.1     skrll 	}
    645      1.1     skrll       else
    646      1.1     skrll 	{
    647      1.1     skrll 	  memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
    648      1.1     skrll 	}
    649      1.1     skrll       goto end;
    650      1.1     skrll 
    651      1.1     skrll       /* RS/6000 "csect" auxents */
    652  1.1.1.2  christos     case C_EXT:
    653      1.1     skrll     case C_AIX_WEAKEXT:
    654      1.1     skrll     case C_HIDEXT:
    655      1.1     skrll       if (indx + 1 == numaux)
    656      1.1     skrll 	{
    657      1.1     skrll 	  H_PUT_32 (abfd, in->x_csect.x_scnlen.l, ext->x_csect.x_scnlen);
    658      1.1     skrll 	  H_PUT_32 (abfd, in->x_csect.x_parmhash, ext->x_csect.x_parmhash);
    659      1.1     skrll 	  H_PUT_16 (abfd, in->x_csect.x_snhash, ext->x_csect.x_snhash);
    660      1.1     skrll 	  /* We don't have to hack bitfields in x_smtyp because it's
    661      1.1     skrll 	     defined by shifts-and-ands, which are equivalent on all
    662      1.1     skrll 	     byte orders.  */
    663      1.1     skrll 	  H_PUT_8 (abfd, in->x_csect.x_smtyp, ext->x_csect.x_smtyp);
    664      1.1     skrll 	  H_PUT_8 (abfd, in->x_csect.x_smclas, ext->x_csect.x_smclas);
    665      1.1     skrll 	  H_PUT_32 (abfd, in->x_csect.x_stab, ext->x_csect.x_stab);
    666      1.1     skrll 	  H_PUT_16 (abfd, in->x_csect.x_snstab, ext->x_csect.x_snstab);
    667      1.1     skrll 	  goto end;
    668      1.1     skrll 	}
    669      1.1     skrll       break;
    670      1.1     skrll 
    671      1.1     skrll     case C_STAT:
    672      1.1     skrll     case C_LEAFSTAT:
    673      1.1     skrll     case C_HIDDEN:
    674      1.1     skrll       if (type == T_NULL)
    675      1.1     skrll 	{
    676      1.1     skrll 	  H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->x_scn.x_scnlen);
    677      1.1     skrll 	  H_PUT_16 (abfd, in->x_scn.x_nreloc, ext->x_scn.x_nreloc);
    678      1.1     skrll 	  H_PUT_16 (abfd, in->x_scn.x_nlinno, ext->x_scn.x_nlinno);
    679      1.1     skrll 	  goto end;
    680      1.1     skrll 	}
    681      1.1     skrll       break;
    682      1.1     skrll     }
    683      1.1     skrll 
    684      1.1     skrll   H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx);
    685      1.1     skrll   H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
    686  1.1.1.2  christos 
    687  1.1.1.2  christos   if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
    688      1.1     skrll       || ISTAG (in_class))
    689      1.1     skrll     {
    690      1.1     skrll       H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
    691      1.1     skrll 		ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
    692      1.1     skrll       H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l,
    693      1.1     skrll 		ext->x_sym.x_fcnary.x_fcn.x_endndx);
    694      1.1     skrll     }
    695      1.1     skrll   else
    696      1.1     skrll     {
    697      1.1     skrll       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
    698      1.1     skrll 		ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
    699      1.1     skrll       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
    700      1.1     skrll 		ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
    701      1.1     skrll       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
    702      1.1     skrll 		ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
    703      1.1     skrll       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
    704      1.1     skrll 		ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
    705      1.1     skrll     }
    706      1.1     skrll 
    707      1.1     skrll   if (ISFCN (type))
    708      1.1     skrll     H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
    709      1.1     skrll   else
    710      1.1     skrll     {
    711      1.1     skrll       H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno,
    712      1.1     skrll 		ext->x_sym.x_misc.x_lnsz.x_lnno);
    713      1.1     skrll       H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_size,
    714      1.1     skrll 		ext->x_sym.x_misc.x_lnsz.x_size);
    715      1.1     skrll     }
    716      1.1     skrll 
    717      1.1     skrll end:
    718      1.1     skrll   return bfd_coff_auxesz (abfd);
    719      1.1     skrll }
    720      1.1     skrll 
    721      1.1     skrll 
    722      1.1     skrll 
    723      1.1     skrll /* The XCOFF reloc table.  Actually, XCOFF relocations specify the
    725      1.1     skrll    bitsize and whether they are signed or not, along with a
    726      1.1     skrll    conventional type.  This table is for the types, which are used for
    727      1.1     skrll    different algorithms for putting in the reloc.  Many of these
    728      1.1     skrll    relocs need special_function entries, which I have not written.  */
    729      1.1     skrll 
    730      1.1     skrll 
    731      1.1     skrll reloc_howto_type xcoff_howto_table[] =
    732      1.1     skrll {
    733      1.1     skrll   /* Standard 32 bit relocation.  */
    734      1.1     skrll   HOWTO (R_POS,			/* type */
    735      1.1     skrll 	 0,			/* rightshift */
    736      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    737      1.1     skrll 	 32,			/* bitsize */
    738      1.1     skrll 	 FALSE,			/* pc_relative */
    739      1.1     skrll 	 0,			/* bitpos */
    740      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    741      1.1     skrll 	 0,			/* special_function */
    742      1.1     skrll 	 "R_POS",		/* name */
    743      1.1     skrll 	 TRUE,			/* partial_inplace */
    744      1.1     skrll 	 0xffffffff,		/* src_mask */
    745      1.1     skrll 	 0xffffffff,		/* dst_mask */
    746      1.1     skrll 	 FALSE),		/* pcrel_offset */
    747      1.1     skrll 
    748      1.1     skrll   /* 32 bit relocation, but store negative value.  */
    749      1.1     skrll   HOWTO (R_NEG,			/* type */
    750      1.1     skrll 	 0,			/* rightshift */
    751      1.1     skrll 	 -2,			/* size (0 = byte, 1 = short, 2 = long) */
    752      1.1     skrll 	 32,			/* bitsize */
    753      1.1     skrll 	 FALSE,			/* pc_relative */
    754      1.1     skrll 	 0,			/* bitpos */
    755      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    756      1.1     skrll 	 0,			/* special_function */
    757      1.1     skrll 	 "R_NEG",		/* name */
    758      1.1     skrll 	 TRUE,			/* partial_inplace */
    759      1.1     skrll 	 0xffffffff,		/* src_mask */
    760      1.1     skrll 	 0xffffffff,		/* dst_mask */
    761      1.1     skrll 	 FALSE),		/* pcrel_offset */
    762      1.1     skrll 
    763      1.1     skrll   /* 32 bit PC relative relocation.  */
    764      1.1     skrll   HOWTO (R_REL,			/* type */
    765      1.1     skrll 	 0,			/* rightshift */
    766      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    767      1.1     skrll 	 32,			/* bitsize */
    768      1.1     skrll 	 TRUE,			/* pc_relative */
    769      1.1     skrll 	 0,			/* bitpos */
    770      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    771      1.1     skrll 	 0,			/* special_function */
    772      1.1     skrll 	 "R_REL",		/* name */
    773      1.1     skrll 	 TRUE,			/* partial_inplace */
    774      1.1     skrll 	 0xffffffff,		/* src_mask */
    775      1.1     skrll 	 0xffffffff,		/* dst_mask */
    776      1.1     skrll 	 FALSE),		/* pcrel_offset */
    777      1.1     skrll 
    778      1.1     skrll   /* 16 bit TOC relative relocation.  */
    779      1.1     skrll   HOWTO (R_TOC,			/* type */
    780      1.1     skrll 	 0,			/* rightshift */
    781      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    782      1.1     skrll 	 16,			/* bitsize */
    783      1.1     skrll 	 FALSE,			/* pc_relative */
    784      1.1     skrll 	 0,			/* bitpos */
    785      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    786      1.1     skrll 	 0,			/* special_function */
    787      1.1     skrll 	 "R_TOC",		/* name */
    788      1.1     skrll 	 TRUE,			/* partial_inplace */
    789      1.1     skrll 	 0xffff,		/* src_mask */
    790      1.1     skrll 	 0xffff,		/* dst_mask */
    791      1.1     skrll 	 FALSE),		/* pcrel_offset */
    792      1.1     skrll 
    793      1.1     skrll   /* I don't really know what this is.  */
    794      1.1     skrll   HOWTO (R_RTB,			/* type */
    795      1.1     skrll 	 1,			/* rightshift */
    796      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    797      1.1     skrll 	 32,			/* bitsize */
    798      1.1     skrll 	 FALSE,			/* pc_relative */
    799      1.1     skrll 	 0,			/* bitpos */
    800      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    801      1.1     skrll 	 0,			/* special_function */
    802      1.1     skrll 	 "R_RTB",		/* name */
    803      1.1     skrll 	 TRUE,			/* partial_inplace */
    804      1.1     skrll 	 0xffffffff,		/* src_mask */
    805      1.1     skrll 	 0xffffffff,		/* dst_mask */
    806      1.1     skrll 	 FALSE),		/* pcrel_offset */
    807      1.1     skrll 
    808      1.1     skrll   /* External TOC relative symbol.  */
    809      1.1     skrll   HOWTO (R_GL,			/* type */
    810      1.1     skrll 	 0,			/* rightshift */
    811      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    812      1.1     skrll 	 16,			/* bitsize */
    813      1.1     skrll 	 FALSE,			/* pc_relative */
    814      1.1     skrll 	 0,			/* bitpos */
    815      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    816      1.1     skrll 	 0,			/* special_function */
    817      1.1     skrll 	 "R_GL",		/* name */
    818      1.1     skrll 	 TRUE,			/* partial_inplace */
    819      1.1     skrll 	 0xffff,		/* src_mask */
    820      1.1     skrll 	 0xffff,		/* dst_mask */
    821      1.1     skrll 	 FALSE),		/* pcrel_offset */
    822      1.1     skrll 
    823      1.1     skrll   /* Local TOC relative symbol.	 */
    824      1.1     skrll   HOWTO (R_TCL,			/* type */
    825      1.1     skrll 	 0,			/* rightshift */
    826      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    827      1.1     skrll 	 16,			/* bitsize */
    828      1.1     skrll 	 FALSE,			/* pc_relative */
    829      1.1     skrll 	 0,			/* bitpos */
    830      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    831      1.1     skrll 	 0,			/* special_function */
    832      1.1     skrll 	 "R_TCL",		/* name */
    833      1.1     skrll 	 TRUE,			/* partial_inplace */
    834      1.1     skrll 	 0xffff,		/* src_mask */
    835      1.1     skrll 	 0xffff,		/* dst_mask */
    836      1.1     skrll 	 FALSE),		/* pcrel_offset */
    837      1.1     skrll 
    838      1.1     skrll   EMPTY_HOWTO (7),
    839      1.1     skrll 
    840      1.1     skrll   /* Non modifiable absolute branch.  */
    841      1.1     skrll   HOWTO (R_BA,			/* type */
    842      1.1     skrll 	 0,			/* rightshift */
    843      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    844      1.1     skrll 	 26,			/* bitsize */
    845      1.1     skrll 	 FALSE,			/* pc_relative */
    846      1.1     skrll 	 0,			/* bitpos */
    847      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    848      1.1     skrll 	 0,			/* special_function */
    849      1.1     skrll 	 "R_BA_26",		/* name */
    850      1.1     skrll 	 TRUE,			/* partial_inplace */
    851      1.1     skrll 	 0x03fffffc,		/* src_mask */
    852      1.1     skrll 	 0x03fffffc,		/* dst_mask */
    853      1.1     skrll 	 FALSE),		/* pcrel_offset */
    854      1.1     skrll 
    855      1.1     skrll   EMPTY_HOWTO (9),
    856      1.1     skrll 
    857      1.1     skrll   /* Non modifiable relative branch.  */
    858      1.1     skrll   HOWTO (R_BR,			/* type */
    859      1.1     skrll 	 0,			/* rightshift */
    860      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    861      1.1     skrll 	 26,			/* bitsize */
    862      1.1     skrll 	 TRUE,			/* pc_relative */
    863      1.1     skrll 	 0,			/* bitpos */
    864      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    865      1.1     skrll 	 0,			/* special_function */
    866      1.1     skrll 	 "R_BR",		/* name */
    867      1.1     skrll 	 TRUE,			/* partial_inplace */
    868      1.1     skrll 	 0x03fffffc,		/* src_mask */
    869      1.1     skrll 	 0x03fffffc,		/* dst_mask */
    870      1.1     skrll 	 FALSE),		/* pcrel_offset */
    871      1.1     skrll 
    872      1.1     skrll   EMPTY_HOWTO (0xb),
    873      1.1     skrll 
    874      1.1     skrll   /* Indirect load.  */
    875      1.1     skrll   HOWTO (R_RL,			/* type */
    876      1.1     skrll 	 0,			/* rightshift */
    877      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    878      1.1     skrll 	 16,			/* bitsize */
    879      1.1     skrll 	 FALSE,			/* pc_relative */
    880      1.1     skrll 	 0,			/* bitpos */
    881      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    882      1.1     skrll 	 0,			/* special_function */
    883      1.1     skrll 	 "R_RL",		/* name */
    884      1.1     skrll 	 TRUE,			/* partial_inplace */
    885      1.1     skrll 	 0xffff,		/* src_mask */
    886      1.1     skrll 	 0xffff,		/* dst_mask */
    887      1.1     skrll 	 FALSE),		/* pcrel_offset */
    888      1.1     skrll 
    889      1.1     skrll   /* Load address.  */
    890      1.1     skrll   HOWTO (R_RLA,			/* type */
    891      1.1     skrll 	 0,			/* rightshift */
    892      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    893      1.1     skrll 	 16,			/* bitsize */
    894      1.1     skrll 	 FALSE,			/* pc_relative */
    895      1.1     skrll 	 0,			/* bitpos */
    896      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    897      1.1     skrll 	 0,			/* special_function */
    898      1.1     skrll 	 "R_RLA",		/* name */
    899      1.1     skrll 	 TRUE,			/* partial_inplace */
    900      1.1     skrll 	 0xffff,		/* src_mask */
    901      1.1     skrll 	 0xffff,		/* dst_mask */
    902      1.1     skrll 	 FALSE),		/* pcrel_offset */
    903      1.1     skrll 
    904  1.1.1.2  christos   EMPTY_HOWTO (0xe),
    905      1.1     skrll 
    906      1.1     skrll   /* Non-relocating reference.  Bitsize is 1 so that r_rsize is 0.  */
    907  1.1.1.2  christos   HOWTO (R_REF,			/* type */
    908  1.1.1.2  christos 	 0,			/* rightshift */
    909      1.1     skrll 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    910      1.1     skrll 	 1,			/* bitsize */
    911      1.1     skrll 	 FALSE,			/* pc_relative */
    912      1.1     skrll 	 0,			/* bitpos */
    913      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    914      1.1     skrll 	 0,			/* special_function */
    915      1.1     skrll 	 "R_REF",		/* name */
    916      1.1     skrll 	 FALSE,			/* partial_inplace */
    917      1.1     skrll 	 0,			/* src_mask */
    918      1.1     skrll 	 0,			/* dst_mask */
    919      1.1     skrll 	 FALSE),		/* pcrel_offset */
    920      1.1     skrll 
    921      1.1     skrll   EMPTY_HOWTO (0x10),
    922      1.1     skrll   EMPTY_HOWTO (0x11),
    923      1.1     skrll 
    924      1.1     skrll   /* TOC relative indirect load.  */
    925      1.1     skrll   HOWTO (R_TRL,			/* type */
    926      1.1     skrll 	 0,			/* rightshift */
    927      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    928      1.1     skrll 	 16,			/* bitsize */
    929      1.1     skrll 	 FALSE,			/* pc_relative */
    930      1.1     skrll 	 0,			/* bitpos */
    931      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    932      1.1     skrll 	 0,			/* special_function */
    933      1.1     skrll 	 "R_TRL",		/* name */
    934      1.1     skrll 	 TRUE,			/* partial_inplace */
    935      1.1     skrll 	 0xffff,		/* src_mask */
    936      1.1     skrll 	 0xffff,		/* dst_mask */
    937      1.1     skrll 	 FALSE),		/* pcrel_offset */
    938      1.1     skrll 
    939      1.1     skrll   /* TOC relative load address.  */
    940      1.1     skrll   HOWTO (R_TRLA,		/* type */
    941      1.1     skrll 	 0,			/* rightshift */
    942      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    943      1.1     skrll 	 16,			/* bitsize */
    944      1.1     skrll 	 FALSE,			/* pc_relative */
    945      1.1     skrll 	 0,			/* bitpos */
    946      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    947      1.1     skrll 	 0,			/* special_function */
    948      1.1     skrll 	 "R_TRLA",		/* name */
    949      1.1     skrll 	 TRUE,			/* partial_inplace */
    950      1.1     skrll 	 0xffff,		/* src_mask */
    951      1.1     skrll 	 0xffff,		/* dst_mask */
    952      1.1     skrll 	 FALSE),		/* pcrel_offset */
    953      1.1     skrll 
    954      1.1     skrll   /* Modifiable relative branch.  */
    955      1.1     skrll   HOWTO (R_RRTBI,		 /* type */
    956      1.1     skrll 	 1,			/* rightshift */
    957      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    958      1.1     skrll 	 32,			/* bitsize */
    959      1.1     skrll 	 FALSE,			/* pc_relative */
    960      1.1     skrll 	 0,			/* bitpos */
    961      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    962      1.1     skrll 	 0,			/* special_function */
    963      1.1     skrll 	 "R_RRTBI",		/* name */
    964      1.1     skrll 	 TRUE,			/* partial_inplace */
    965      1.1     skrll 	 0xffffffff,		/* src_mask */
    966      1.1     skrll 	 0xffffffff,		/* dst_mask */
    967      1.1     skrll 	 FALSE),		/* pcrel_offset */
    968      1.1     skrll 
    969      1.1     skrll   /* Modifiable absolute branch.  */
    970      1.1     skrll   HOWTO (R_RRTBA,		 /* type */
    971      1.1     skrll 	 1,			/* rightshift */
    972      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    973      1.1     skrll 	 32,			/* bitsize */
    974      1.1     skrll 	 FALSE,			/* pc_relative */
    975      1.1     skrll 	 0,			/* bitpos */
    976      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    977      1.1     skrll 	 0,			/* special_function */
    978      1.1     skrll 	 "R_RRTBA",		/* name */
    979      1.1     skrll 	 TRUE,			/* partial_inplace */
    980      1.1     skrll 	 0xffffffff,		/* src_mask */
    981      1.1     skrll 	 0xffffffff,		/* dst_mask */
    982      1.1     skrll 	 FALSE),		/* pcrel_offset */
    983      1.1     skrll 
    984      1.1     skrll   /* Modifiable call absolute indirect.  */
    985      1.1     skrll   HOWTO (R_CAI,			/* type */
    986      1.1     skrll 	 0,			/* rightshift */
    987      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    988      1.1     skrll 	 16,			/* bitsize */
    989      1.1     skrll 	 FALSE,			/* pc_relative */
    990      1.1     skrll 	 0,			/* bitpos */
    991      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    992      1.1     skrll 	 0,			/* special_function */
    993      1.1     skrll 	 "R_CAI",		/* name */
    994      1.1     skrll 	 TRUE,			/* partial_inplace */
    995      1.1     skrll 	 0xffff,		/* src_mask */
    996      1.1     skrll 	 0xffff,		/* dst_mask */
    997      1.1     skrll 	 FALSE),		/* pcrel_offset */
    998      1.1     skrll 
    999      1.1     skrll   /* Modifiable call relative.  */
   1000      1.1     skrll   HOWTO (R_CREL,		/* type */
   1001      1.1     skrll 	 0,			/* rightshift */
   1002      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1003      1.1     skrll 	 16,			/* bitsize */
   1004      1.1     skrll 	 FALSE,			/* pc_relative */
   1005      1.1     skrll 	 0,			/* bitpos */
   1006      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   1007      1.1     skrll 	 0,			/* special_function */
   1008      1.1     skrll 	 "R_CREL",		/* name */
   1009      1.1     skrll 	 TRUE,			/* partial_inplace */
   1010      1.1     skrll 	 0xffff,		/* src_mask */
   1011      1.1     skrll 	 0xffff,		/* dst_mask */
   1012      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1013      1.1     skrll 
   1014      1.1     skrll   /* Modifiable branch absolute.  */
   1015      1.1     skrll   HOWTO (R_RBA,			/* type */
   1016      1.1     skrll 	 0,			/* rightshift */
   1017      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1018      1.1     skrll 	 26,			/* bitsize */
   1019      1.1     skrll 	 FALSE,			/* pc_relative */
   1020      1.1     skrll 	 0,			/* bitpos */
   1021      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   1022      1.1     skrll 	 0,			/* special_function */
   1023      1.1     skrll 	 "R_RBA",		/* name */
   1024      1.1     skrll 	 TRUE,			/* partial_inplace */
   1025      1.1     skrll 	 0x03fffffc,		/* src_mask */
   1026      1.1     skrll 	 0x03fffffc,		/* dst_mask */
   1027      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1028      1.1     skrll 
   1029      1.1     skrll   /* Modifiable branch absolute.  */
   1030      1.1     skrll   HOWTO (R_RBAC,		/* type */
   1031      1.1     skrll 	 0,			/* rightshift */
   1032      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1033      1.1     skrll 	 32,			/* bitsize */
   1034      1.1     skrll 	 FALSE,			/* pc_relative */
   1035      1.1     skrll 	 0,			/* bitpos */
   1036      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   1037      1.1     skrll 	 0,			/* special_function */
   1038      1.1     skrll 	 "R_RBAC",		/* name */
   1039      1.1     skrll 	 TRUE,			/* partial_inplace */
   1040      1.1     skrll 	 0xffffffff,		/* src_mask */
   1041      1.1     skrll 	 0xffffffff,		/* dst_mask */
   1042      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1043      1.1     skrll 
   1044      1.1     skrll   /* Modifiable branch relative.  */
   1045      1.1     skrll   HOWTO (R_RBR,			/* type */
   1046      1.1     skrll 	 0,			/* rightshift */
   1047      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1048      1.1     skrll 	 26,			/* bitsize */
   1049      1.1     skrll 	 FALSE,			/* pc_relative */
   1050      1.1     skrll 	 0,			/* bitpos */
   1051      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1052      1.1     skrll 	 0,			/* special_function */
   1053      1.1     skrll 	 "R_RBR_26",		/* name */
   1054      1.1     skrll 	 TRUE,			/* partial_inplace */
   1055      1.1     skrll 	 0x03fffffc,		/* src_mask */
   1056      1.1     skrll 	 0x03fffffc,		/* dst_mask */
   1057      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1058      1.1     skrll 
   1059      1.1     skrll   /* Modifiable branch absolute.  */
   1060      1.1     skrll   HOWTO (R_RBRC,		/* type */
   1061      1.1     skrll 	 0,			/* rightshift */
   1062      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1063      1.1     skrll 	 16,			/* bitsize */
   1064      1.1     skrll 	 FALSE,			/* pc_relative */
   1065      1.1     skrll 	 0,			/* bitpos */
   1066      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   1067      1.1     skrll 	 0,			/* special_function */
   1068      1.1     skrll 	 "R_RBRC",		/* name */
   1069      1.1     skrll 	 TRUE,			/* partial_inplace */
   1070      1.1     skrll 	 0xffff,		/* src_mask */
   1071      1.1     skrll 	 0xffff,		/* dst_mask */
   1072      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1073      1.1     skrll 
   1074      1.1     skrll   /* 16 bit Non modifiable absolute branch.  */
   1075      1.1     skrll   HOWTO (R_BA,			/* type */
   1076      1.1     skrll 	 0,			/* rightshift */
   1077      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1078      1.1     skrll 	 16,			/* bitsize */
   1079      1.1     skrll 	 FALSE,			/* pc_relative */
   1080      1.1     skrll 	 0,			/* bitpos */
   1081      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   1082      1.1     skrll 	 0,			/* special_function */
   1083      1.1     skrll 	 "R_BA_16",		/* name */
   1084      1.1     skrll 	 TRUE,			/* partial_inplace */
   1085      1.1     skrll 	 0xfffc,		/* src_mask */
   1086      1.1     skrll 	 0xfffc,		/* dst_mask */
   1087      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1088      1.1     skrll 
   1089      1.1     skrll   /* Modifiable branch relative.  */
   1090      1.1     skrll   HOWTO (R_RBR,			/* type */
   1091      1.1     skrll 	 0,			/* rightshift */
   1092      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1093      1.1     skrll 	 16,			/* bitsize */
   1094      1.1     skrll 	 FALSE,			/* pc_relative */
   1095      1.1     skrll 	 0,			/* bitpos */
   1096      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1097      1.1     skrll 	 0,			/* special_function */
   1098      1.1     skrll 	 "R_RBR_16",		/* name */
   1099      1.1     skrll 	 TRUE,			/* partial_inplace */
   1100      1.1     skrll 	 0xffff,		/* src_mask */
   1101      1.1     skrll 	 0xffff,		/* dst_mask */
   1102      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1103      1.1     skrll 
   1104      1.1     skrll   /* Modifiable branch relative.  */
   1105      1.1     skrll   HOWTO (R_RBA,			/* type */
   1106      1.1     skrll 	 0,			/* rightshift */
   1107      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1108      1.1     skrll 	 16,			/* bitsize */
   1109      1.1     skrll 	 FALSE,			/* pc_relative */
   1110      1.1     skrll 	 0,			/* bitpos */
   1111      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1112      1.1     skrll 	 0,			/* special_function */
   1113      1.1     skrll 	 "R_RBA_16",		/* name */
   1114      1.1     skrll 	 TRUE,			/* partial_inplace */
   1115      1.1     skrll 	 0xffff,		/* src_mask */
   1116      1.1     skrll 	 0xffff,		/* dst_mask */
   1117      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1118      1.1     skrll 
   1119      1.1     skrll };
   1120      1.1     skrll 
   1121      1.1     skrll void
   1122      1.1     skrll xcoff_rtype2howto (relent, internal)
   1123      1.1     skrll      arelent *relent;
   1124      1.1     skrll      struct internal_reloc *internal;
   1125      1.1     skrll {
   1126      1.1     skrll   if (internal->r_type > R_RBRC)
   1127      1.1     skrll     abort ();
   1128      1.1     skrll 
   1129      1.1     skrll   /* Default howto layout works most of the time */
   1130      1.1     skrll   relent->howto = &xcoff_howto_table[internal->r_type];
   1131      1.1     skrll 
   1132      1.1     skrll   /* Special case some 16 bit reloc */
   1133      1.1     skrll   if (15 == (internal->r_size & 0x1f))
   1134      1.1     skrll     {
   1135      1.1     skrll       if (R_BA == internal->r_type)
   1136      1.1     skrll 	relent->howto = &xcoff_howto_table[0x1c];
   1137      1.1     skrll       else if (R_RBR == internal->r_type)
   1138      1.1     skrll 	relent->howto = &xcoff_howto_table[0x1d];
   1139      1.1     skrll       else if (R_RBA == internal->r_type)
   1140      1.1     skrll 	relent->howto = &xcoff_howto_table[0x1e];
   1141      1.1     skrll     }
   1142      1.1     skrll 
   1143      1.1     skrll   /* The r_size field of an XCOFF reloc encodes the bitsize of the
   1144      1.1     skrll      relocation, as well as indicating whether it is signed or not.
   1145      1.1     skrll      Doublecheck that the relocation information gathered from the
   1146      1.1     skrll      type matches this information.  The bitsize is not significant
   1147      1.1     skrll      for R_REF relocs.  */
   1148      1.1     skrll   if (relent->howto->dst_mask != 0
   1149      1.1     skrll       && (relent->howto->bitsize
   1150      1.1     skrll 	  != ((unsigned int) internal->r_size & 0x1f) + 1))
   1151      1.1     skrll     abort ();
   1152      1.1     skrll }
   1153      1.1     skrll 
   1154      1.1     skrll reloc_howto_type *
   1155      1.1     skrll _bfd_xcoff_reloc_type_lookup (abfd, code)
   1156      1.1     skrll      bfd *abfd ATTRIBUTE_UNUSED;
   1157      1.1     skrll      bfd_reloc_code_real_type code;
   1158      1.1     skrll {
   1159      1.1     skrll   switch (code)
   1160      1.1     skrll     {
   1161      1.1     skrll     case BFD_RELOC_PPC_B26:
   1162      1.1     skrll       return &xcoff_howto_table[0xa];
   1163      1.1     skrll     case BFD_RELOC_PPC_BA16:
   1164      1.1     skrll       return &xcoff_howto_table[0x1c];
   1165      1.1     skrll     case BFD_RELOC_PPC_BA26:
   1166      1.1     skrll       return &xcoff_howto_table[8];
   1167      1.1     skrll     case BFD_RELOC_PPC_TOC16:
   1168      1.1     skrll       return &xcoff_howto_table[3];
   1169      1.1     skrll     case BFD_RELOC_32:
   1170  1.1.1.2  christos     case BFD_RELOC_CTOR:
   1171  1.1.1.2  christos       return &xcoff_howto_table[0];
   1172      1.1     skrll     case BFD_RELOC_NONE:
   1173      1.1     skrll       return &xcoff_howto_table[0xf];
   1174      1.1     skrll     default:
   1175      1.1     skrll       return NULL;
   1176      1.1     skrll     }
   1177      1.1     skrll }
   1178      1.1     skrll 
   1179      1.1     skrll static reloc_howto_type *
   1180      1.1     skrll _bfd_xcoff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1181      1.1     skrll 			      const char *r_name)
   1182      1.1     skrll {
   1183      1.1     skrll   unsigned int i;
   1184      1.1     skrll 
   1185      1.1     skrll   for (i = 0;
   1186      1.1     skrll        i < sizeof (xcoff_howto_table) / sizeof (xcoff_howto_table[0]);
   1187      1.1     skrll        i++)
   1188      1.1     skrll     if (xcoff_howto_table[i].name != NULL
   1189      1.1     skrll 	&& strcasecmp (xcoff_howto_table[i].name, r_name) == 0)
   1190      1.1     skrll       return &xcoff_howto_table[i];
   1191      1.1     skrll 
   1192      1.1     skrll   return NULL;
   1193      1.1     skrll }
   1194      1.1     skrll 
   1195      1.1     skrll /* XCOFF archive support.  The original version of this code was by
   1197      1.1     skrll    Damon A. Permezel.  It was enhanced to permit cross support, and
   1198      1.1     skrll    writing archive files, by Ian Lance Taylor, Cygnus Support.
   1199      1.1     skrll 
   1200      1.1     skrll    XCOFF uses its own archive format.  Everything is hooked together
   1201      1.1     skrll    with file offset links, so it is possible to rapidly update an
   1202      1.1     skrll    archive in place.  Of course, we don't do that.  An XCOFF archive
   1203      1.1     skrll    has a real file header, not just an ARMAG string.  The structure of
   1204      1.1     skrll    the file header and of each archive header appear below.
   1205      1.1     skrll 
   1206      1.1     skrll    An XCOFF archive also has a member table, which is a list of
   1207      1.1     skrll    elements in the archive (you can get that by looking through the
   1208      1.1     skrll    linked list, but you have to read a lot more of the file).  The
   1209      1.1     skrll    member table has a normal archive header with an empty name.  It is
   1210      1.1     skrll    normally (and perhaps must be) the second to last entry in the
   1211      1.1     skrll    archive.  The member table data is almost printable ASCII.  It
   1212      1.1     skrll    starts with a 12 character decimal string which is the number of
   1213      1.1     skrll    entries in the table.  For each entry it has a 12 character decimal
   1214      1.1     skrll    string which is the offset in the archive of that member.  These
   1215      1.1     skrll    entries are followed by a series of null terminated strings which
   1216      1.1     skrll    are the member names for each entry.
   1217      1.1     skrll 
   1218      1.1     skrll    Finally, an XCOFF archive has a global symbol table, which is what
   1219      1.1     skrll    we call the armap.  The global symbol table has a normal archive
   1220      1.1     skrll    header with an empty name.  It is normally (and perhaps must be)
   1221      1.1     skrll    the last entry in the archive.  The contents start with a four byte
   1222      1.1     skrll    binary number which is the number of entries.  This is followed by
   1223      1.1     skrll    a that many four byte binary numbers; each is the file offset of an
   1224      1.1     skrll    entry in the archive.  These numbers are followed by a series of
   1225      1.1     skrll    null terminated strings, which are symbol names.
   1226      1.1     skrll 
   1227      1.1     skrll    AIX 4.3 introduced a new archive format which can handle larger
   1228      1.1     skrll    files and also 32- and 64-bit objects in the same archive.  The
   1229      1.1     skrll    things said above remain true except that there is now more than
   1230      1.1     skrll    one global symbol table.  The one is used to index 32-bit objects,
   1231      1.1     skrll    the other for 64-bit objects.
   1232      1.1     skrll 
   1233      1.1     skrll    The new archives (recognizable by the new ARMAG string) has larger
   1234      1.1     skrll    field lengths so that we cannot really share any code.  Also we have
   1235      1.1     skrll    to take care that we are not generating the new form of archives
   1236      1.1     skrll    on AIX 4.2 or earlier systems.  */
   1237      1.1     skrll 
   1238      1.1     skrll /* XCOFF archives use this as a magic string.  Note that both strings
   1239      1.1     skrll    have the same length.  */
   1240      1.1     skrll 
   1241      1.1     skrll /* Set the magic for archive.  */
   1242      1.1     skrll 
   1243      1.1     skrll bfd_boolean
   1244      1.1     skrll bfd_xcoff_ar_archive_set_magic (abfd, magic)
   1245      1.1     skrll      bfd *abfd ATTRIBUTE_UNUSED;
   1246      1.1     skrll      char *magic ATTRIBUTE_UNUSED;
   1247      1.1     skrll {
   1248      1.1     skrll   /* Not supported yet.  */
   1249      1.1     skrll   return FALSE;
   1250      1.1     skrll  /* bfd_xcoff_archive_set_magic (abfd, magic); */
   1251      1.1     skrll }
   1252      1.1     skrll 
   1253      1.1     skrll /* Read in the armap of an XCOFF archive.  */
   1254      1.1     skrll 
   1255      1.1     skrll bfd_boolean
   1256      1.1     skrll _bfd_xcoff_slurp_armap (abfd)
   1257      1.1     skrll      bfd *abfd;
   1258      1.1     skrll {
   1259      1.1     skrll   file_ptr off;
   1260      1.1     skrll   size_t namlen;
   1261      1.1     skrll   bfd_size_type sz;
   1262      1.1     skrll   bfd_byte *contents, *cend;
   1263      1.1     skrll   bfd_vma c, i;
   1264      1.1     skrll   carsym *arsym;
   1265      1.1     skrll   bfd_byte *p;
   1266      1.1     skrll 
   1267      1.1     skrll   if (xcoff_ardata (abfd) == NULL)
   1268      1.1     skrll     {
   1269      1.1     skrll       bfd_has_map (abfd) = FALSE;
   1270      1.1     skrll       return TRUE;
   1271      1.1     skrll     }
   1272      1.1     skrll 
   1273      1.1     skrll   if (! xcoff_big_format_p (abfd))
   1274      1.1     skrll     {
   1275      1.1     skrll       /* This is for the old format.  */
   1276      1.1     skrll       struct xcoff_ar_hdr hdr;
   1277      1.1     skrll 
   1278      1.1     skrll       off = strtol (xcoff_ardata (abfd)->symoff, (char **) NULL, 10);
   1279      1.1     skrll       if (off == 0)
   1280      1.1     skrll 	{
   1281      1.1     skrll 	  bfd_has_map (abfd) = FALSE;
   1282      1.1     skrll 	  return TRUE;
   1283      1.1     skrll 	}
   1284      1.1     skrll 
   1285      1.1     skrll       if (bfd_seek (abfd, off, SEEK_SET) != 0)
   1286      1.1     skrll 	return FALSE;
   1287      1.1     skrll 
   1288      1.1     skrll       /* The symbol table starts with a normal archive header.  */
   1289      1.1     skrll       if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
   1290      1.1     skrll 	  != SIZEOF_AR_HDR)
   1291      1.1     skrll 	return FALSE;
   1292      1.1     skrll 
   1293      1.1     skrll       /* Skip the name (normally empty).  */
   1294      1.1     skrll       namlen = strtol (hdr.namlen, (char **) NULL, 10);
   1295      1.1     skrll       off = ((namlen + 1) & ~ (size_t) 1) + SXCOFFARFMAG;
   1296      1.1     skrll       if (bfd_seek (abfd, off, SEEK_CUR) != 0)
   1297      1.1     skrll 	return FALSE;
   1298      1.1     skrll 
   1299      1.1     skrll       sz = strtol (hdr.size, (char **) NULL, 10);
   1300      1.1     skrll 
   1301      1.1     skrll       /* Read in the entire symbol table.  */
   1302      1.1     skrll       contents = (bfd_byte *) bfd_alloc (abfd, sz);
   1303      1.1     skrll       if (contents == NULL)
   1304      1.1     skrll 	return FALSE;
   1305      1.1     skrll       if (bfd_bread ((PTR) contents, sz, abfd) != sz)
   1306      1.1     skrll 	return FALSE;
   1307      1.1     skrll 
   1308      1.1     skrll       /* The symbol table starts with a four byte count.  */
   1309      1.1     skrll       c = H_GET_32 (abfd, contents);
   1310      1.1     skrll 
   1311      1.1     skrll       if (c * 4 >= sz)
   1312      1.1     skrll 	{
   1313      1.1     skrll 	  bfd_set_error (bfd_error_bad_value);
   1314      1.1     skrll 	  return FALSE;
   1315      1.1     skrll 	}
   1316      1.1     skrll 
   1317      1.1     skrll       bfd_ardata (abfd)->symdefs =
   1318      1.1     skrll 	((carsym *) bfd_alloc (abfd, c * sizeof (carsym)));
   1319      1.1     skrll       if (bfd_ardata (abfd)->symdefs == NULL)
   1320      1.1     skrll 	return FALSE;
   1321      1.1     skrll 
   1322      1.1     skrll       /* After the count comes a list of four byte file offsets.  */
   1323      1.1     skrll       for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 4;
   1324      1.1     skrll 	   i < c;
   1325      1.1     skrll 	   ++i, ++arsym, p += 4)
   1326      1.1     skrll 	arsym->file_offset = H_GET_32 (abfd, p);
   1327      1.1     skrll     }
   1328      1.1     skrll   else
   1329      1.1     skrll     {
   1330      1.1     skrll       /* This is for the new format.  */
   1331      1.1     skrll       struct xcoff_ar_hdr_big hdr;
   1332      1.1     skrll 
   1333      1.1     skrll       off = strtol (xcoff_ardata_big (abfd)->symoff, (char **) NULL, 10);
   1334      1.1     skrll       if (off == 0)
   1335      1.1     skrll 	{
   1336      1.1     skrll 	  bfd_has_map (abfd) = FALSE;
   1337      1.1     skrll 	  return TRUE;
   1338      1.1     skrll 	}
   1339      1.1     skrll 
   1340      1.1     skrll       if (bfd_seek (abfd, off, SEEK_SET) != 0)
   1341      1.1     skrll 	return FALSE;
   1342      1.1     skrll 
   1343      1.1     skrll       /* The symbol table starts with a normal archive header.  */
   1344      1.1     skrll       if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
   1345      1.1     skrll 	  != SIZEOF_AR_HDR_BIG)
   1346      1.1     skrll 	return FALSE;
   1347      1.1     skrll 
   1348      1.1     skrll       /* Skip the name (normally empty).  */
   1349      1.1     skrll       namlen = strtol (hdr.namlen, (char **) NULL, 10);
   1350      1.1     skrll       off = ((namlen + 1) & ~ (size_t) 1) + SXCOFFARFMAG;
   1351      1.1     skrll       if (bfd_seek (abfd, off, SEEK_CUR) != 0)
   1352      1.1     skrll 	return FALSE;
   1353      1.1     skrll 
   1354      1.1     skrll       /* XXX This actually has to be a call to strtoll (at least on 32-bit
   1355      1.1     skrll 	 machines) since the field width is 20 and there numbers with more
   1356      1.1     skrll 	 than 32 bits can be represented.  */
   1357      1.1     skrll       sz = strtol (hdr.size, (char **) NULL, 10);
   1358      1.1     skrll 
   1359      1.1     skrll       /* Read in the entire symbol table.  */
   1360      1.1     skrll       contents = (bfd_byte *) bfd_alloc (abfd, sz);
   1361      1.1     skrll       if (contents == NULL)
   1362      1.1     skrll 	return FALSE;
   1363      1.1     skrll       if (bfd_bread ((PTR) contents, sz, abfd) != sz)
   1364      1.1     skrll 	return FALSE;
   1365      1.1     skrll 
   1366      1.1     skrll       /* The symbol table starts with an eight byte count.  */
   1367      1.1     skrll       c = H_GET_64 (abfd, contents);
   1368      1.1     skrll 
   1369      1.1     skrll       if (c * 8 >= sz)
   1370      1.1     skrll 	{
   1371      1.1     skrll 	  bfd_set_error (bfd_error_bad_value);
   1372      1.1     skrll 	  return FALSE;
   1373      1.1     skrll 	}
   1374      1.1     skrll 
   1375      1.1     skrll       bfd_ardata (abfd)->symdefs =
   1376      1.1     skrll 	((carsym *) bfd_alloc (abfd, c * sizeof (carsym)));
   1377      1.1     skrll       if (bfd_ardata (abfd)->symdefs == NULL)
   1378      1.1     skrll 	return FALSE;
   1379      1.1     skrll 
   1380      1.1     skrll       /* After the count comes a list of eight byte file offsets.  */
   1381      1.1     skrll       for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 8;
   1382      1.1     skrll 	   i < c;
   1383      1.1     skrll 	   ++i, ++arsym, p += 8)
   1384      1.1     skrll 	arsym->file_offset = H_GET_64 (abfd, p);
   1385      1.1     skrll     }
   1386      1.1     skrll 
   1387      1.1     skrll   /* After the file offsets come null terminated symbol names.  */
   1388      1.1     skrll   cend = contents + sz;
   1389      1.1     skrll   for (i = 0, arsym = bfd_ardata (abfd)->symdefs;
   1390      1.1     skrll        i < c;
   1391      1.1     skrll        ++i, ++arsym, p += strlen ((char *) p) + 1)
   1392      1.1     skrll     {
   1393      1.1     skrll       if (p >= cend)
   1394      1.1     skrll 	{
   1395      1.1     skrll 	  bfd_set_error (bfd_error_bad_value);
   1396      1.1     skrll 	  return FALSE;
   1397      1.1     skrll 	}
   1398      1.1     skrll       arsym->name = (char *) p;
   1399      1.1     skrll     }
   1400      1.1     skrll 
   1401      1.1     skrll   bfd_ardata (abfd)->symdef_count = c;
   1402      1.1     skrll   bfd_has_map (abfd) = TRUE;
   1403      1.1     skrll 
   1404      1.1     skrll   return TRUE;
   1405      1.1     skrll }
   1406      1.1     skrll 
   1407      1.1     skrll /* See if this is an XCOFF archive.  */
   1408      1.1     skrll 
   1409      1.1     skrll const bfd_target *
   1410      1.1     skrll _bfd_xcoff_archive_p (abfd)
   1411      1.1     skrll      bfd *abfd;
   1412      1.1     skrll {
   1413      1.1     skrll   struct artdata *tdata_hold;
   1414      1.1     skrll   char magic[SXCOFFARMAG];
   1415      1.1     skrll   bfd_size_type amt = SXCOFFARMAG;
   1416      1.1     skrll 
   1417      1.1     skrll   if (bfd_bread ((PTR) magic, amt, abfd) != amt)
   1418      1.1     skrll     {
   1419      1.1     skrll       if (bfd_get_error () != bfd_error_system_call)
   1420      1.1     skrll 	bfd_set_error (bfd_error_wrong_format);
   1421      1.1     skrll       return NULL;
   1422      1.1     skrll     }
   1423      1.1     skrll 
   1424      1.1     skrll   if (strncmp (magic, XCOFFARMAG, SXCOFFARMAG) != 0
   1425      1.1     skrll       && strncmp (magic, XCOFFARMAGBIG, SXCOFFARMAG) != 0)
   1426      1.1     skrll     {
   1427      1.1     skrll       bfd_set_error (bfd_error_wrong_format);
   1428      1.1     skrll       return NULL;
   1429      1.1     skrll     }
   1430      1.1     skrll 
   1431      1.1     skrll   tdata_hold = bfd_ardata (abfd);
   1432      1.1     skrll 
   1433      1.1     skrll   amt = sizeof (struct artdata);
   1434      1.1     skrll   bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
   1435      1.1     skrll   if (bfd_ardata (abfd) == (struct artdata *) NULL)
   1436      1.1     skrll     goto error_ret_restore;
   1437      1.1     skrll 
   1438      1.1     skrll   /* Cleared by bfd_zalloc above.
   1439      1.1     skrll      bfd_ardata (abfd)->cache = NULL;
   1440      1.1     skrll      bfd_ardata (abfd)->archive_head = NULL;
   1441      1.1     skrll      bfd_ardata (abfd)->symdefs = NULL;
   1442      1.1     skrll      bfd_ardata (abfd)->extended_names = NULL;
   1443      1.1     skrll      bfd_ardata (abfd)->extended_names_size = 0;  */
   1444      1.1     skrll 
   1445      1.1     skrll   /* Now handle the two formats.  */
   1446      1.1     skrll   if (magic[1] != 'b')
   1447      1.1     skrll     {
   1448      1.1     skrll       /* This is the old format.  */
   1449      1.1     skrll       struct xcoff_ar_file_hdr hdr;
   1450      1.1     skrll 
   1451      1.1     skrll       /* Copy over the magic string.  */
   1452      1.1     skrll       memcpy (hdr.magic, magic, SXCOFFARMAG);
   1453      1.1     skrll 
   1454      1.1     skrll       /* Now read the rest of the file header.  */
   1455      1.1     skrll       amt = SIZEOF_AR_FILE_HDR - SXCOFFARMAG;
   1456      1.1     skrll       if (bfd_bread ((PTR) &hdr.memoff, amt, abfd) != amt)
   1457      1.1     skrll 	{
   1458      1.1     skrll 	  if (bfd_get_error () != bfd_error_system_call)
   1459      1.1     skrll 	    bfd_set_error (bfd_error_wrong_format);
   1460      1.1     skrll 	  goto error_ret;
   1461      1.1     skrll 	}
   1462      1.1     skrll 
   1463      1.1     skrll       bfd_ardata (abfd)->first_file_filepos = strtol (hdr.firstmemoff,
   1464      1.1     skrll 						      (char **) NULL, 10);
   1465      1.1     skrll 
   1466      1.1     skrll       amt = SIZEOF_AR_FILE_HDR;
   1467      1.1     skrll       bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
   1468      1.1     skrll       if (bfd_ardata (abfd)->tdata == NULL)
   1469      1.1     skrll 	goto error_ret;
   1470      1.1     skrll 
   1471      1.1     skrll       memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR);
   1472      1.1     skrll     }
   1473      1.1     skrll   else
   1474      1.1     skrll     {
   1475      1.1     skrll       /* This is the new format.  */
   1476      1.1     skrll       struct xcoff_ar_file_hdr_big hdr;
   1477      1.1     skrll 
   1478      1.1     skrll       /* Copy over the magic string.  */
   1479      1.1     skrll       memcpy (hdr.magic, magic, SXCOFFARMAG);
   1480      1.1     skrll 
   1481      1.1     skrll       /* Now read the rest of the file header.  */
   1482      1.1     skrll       amt = SIZEOF_AR_FILE_HDR_BIG - SXCOFFARMAG;
   1483      1.1     skrll       if (bfd_bread ((PTR) &hdr.memoff, amt, abfd) != amt)
   1484      1.1     skrll 	{
   1485      1.1     skrll 	  if (bfd_get_error () != bfd_error_system_call)
   1486      1.1     skrll 	    bfd_set_error (bfd_error_wrong_format);
   1487      1.1     skrll 	  goto error_ret;
   1488      1.1     skrll 	}
   1489      1.1     skrll 
   1490      1.1     skrll       bfd_ardata (abfd)->first_file_filepos = bfd_scan_vma (hdr.firstmemoff,
   1491      1.1     skrll 							    (const char **) 0,
   1492      1.1     skrll 							    10);
   1493      1.1     skrll 
   1494      1.1     skrll       amt = SIZEOF_AR_FILE_HDR_BIG;
   1495      1.1     skrll       bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
   1496      1.1     skrll       if (bfd_ardata (abfd)->tdata == NULL)
   1497      1.1     skrll 	goto error_ret;
   1498      1.1     skrll 
   1499      1.1     skrll       memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR_BIG);
   1500      1.1     skrll     }
   1501      1.1     skrll 
   1502      1.1     skrll   if (! _bfd_xcoff_slurp_armap (abfd))
   1503      1.1     skrll     {
   1504      1.1     skrll     error_ret:
   1505      1.1     skrll       bfd_release (abfd, bfd_ardata (abfd));
   1506      1.1     skrll     error_ret_restore:
   1507      1.1     skrll       bfd_ardata (abfd) = tdata_hold;
   1508      1.1     skrll       return NULL;
   1509      1.1     skrll     }
   1510      1.1     skrll 
   1511      1.1     skrll   return abfd->xvec;
   1512      1.1     skrll }
   1513      1.1     skrll 
   1514      1.1     skrll /* Read the archive header in an XCOFF archive.  */
   1515      1.1     skrll 
   1516      1.1     skrll PTR
   1517      1.1     skrll _bfd_xcoff_read_ar_hdr (abfd)
   1518      1.1     skrll      bfd *abfd;
   1519      1.1     skrll {
   1520      1.1     skrll   bfd_size_type namlen;
   1521      1.1     skrll   struct areltdata *ret;
   1522      1.1     skrll   bfd_size_type amt = sizeof (struct areltdata);
   1523      1.1     skrll 
   1524      1.1     skrll   ret = (struct areltdata *) bfd_alloc (abfd, amt);
   1525      1.1     skrll   if (ret == NULL)
   1526      1.1     skrll     return NULL;
   1527      1.1     skrll 
   1528      1.1     skrll   if (! xcoff_big_format_p (abfd))
   1529      1.1     skrll     {
   1530      1.1     skrll       struct xcoff_ar_hdr hdr;
   1531      1.1     skrll       struct xcoff_ar_hdr *hdrp;
   1532      1.1     skrll 
   1533      1.1     skrll       if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
   1534      1.1     skrll 	  != SIZEOF_AR_HDR)
   1535      1.1     skrll 	{
   1536      1.1     skrll 	  free (ret);
   1537      1.1     skrll 	  return NULL;
   1538      1.1     skrll 	}
   1539      1.1     skrll 
   1540      1.1     skrll       namlen = strtol (hdr.namlen, (char **) NULL, 10);
   1541      1.1     skrll       amt = SIZEOF_AR_HDR + namlen + 1;
   1542      1.1     skrll       hdrp = (struct xcoff_ar_hdr *) bfd_alloc (abfd, amt);
   1543      1.1     skrll       if (hdrp == NULL)
   1544      1.1     skrll 	{
   1545      1.1     skrll 	  free (ret);
   1546      1.1     skrll 	  return NULL;
   1547      1.1     skrll 	}
   1548      1.1     skrll       memcpy (hdrp, &hdr, SIZEOF_AR_HDR);
   1549      1.1     skrll       if (bfd_bread ((char *) hdrp + SIZEOF_AR_HDR, namlen, abfd) != namlen)
   1550      1.1     skrll 	{
   1551      1.1     skrll 	  free (ret);
   1552      1.1     skrll 	  return NULL;
   1553      1.1     skrll 	}
   1554      1.1     skrll       ((char *) hdrp)[SIZEOF_AR_HDR + namlen] = '\0';
   1555      1.1     skrll 
   1556      1.1     skrll       ret->arch_header = (char *) hdrp;
   1557      1.1     skrll       ret->parsed_size = strtol (hdr.size, (char **) NULL, 10);
   1558      1.1     skrll       ret->filename = (char *) hdrp + SIZEOF_AR_HDR;
   1559      1.1     skrll     }
   1560      1.1     skrll   else
   1561      1.1     skrll     {
   1562      1.1     skrll       struct xcoff_ar_hdr_big hdr;
   1563      1.1     skrll       struct xcoff_ar_hdr_big *hdrp;
   1564      1.1     skrll 
   1565      1.1     skrll       if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
   1566      1.1     skrll 	  != SIZEOF_AR_HDR_BIG)
   1567      1.1     skrll 	{
   1568      1.1     skrll 	  free (ret);
   1569      1.1     skrll 	  return NULL;
   1570      1.1     skrll 	}
   1571      1.1     skrll 
   1572      1.1     skrll       namlen = strtol (hdr.namlen, (char **) NULL, 10);
   1573      1.1     skrll       amt = SIZEOF_AR_HDR_BIG + namlen + 1;
   1574      1.1     skrll       hdrp = (struct xcoff_ar_hdr_big *) bfd_alloc (abfd, amt);
   1575      1.1     skrll       if (hdrp == NULL)
   1576      1.1     skrll 	{
   1577      1.1     skrll 	  free (ret);
   1578      1.1     skrll 	  return NULL;
   1579      1.1     skrll 	}
   1580      1.1     skrll       memcpy (hdrp, &hdr, SIZEOF_AR_HDR_BIG);
   1581      1.1     skrll       if (bfd_bread ((char *) hdrp + SIZEOF_AR_HDR_BIG, namlen, abfd) != namlen)
   1582      1.1     skrll 	{
   1583      1.1     skrll 	  free (ret);
   1584      1.1     skrll 	  return NULL;
   1585      1.1     skrll 	}
   1586      1.1     skrll       ((char *) hdrp)[SIZEOF_AR_HDR_BIG + namlen] = '\0';
   1587      1.1     skrll 
   1588      1.1     skrll       ret->arch_header = (char *) hdrp;
   1589      1.1     skrll       /* XXX This actually has to be a call to strtoll (at least on 32-bit
   1590      1.1     skrll 	 machines) since the field width is 20 and there numbers with more
   1591      1.1     skrll 	 than 32 bits can be represented.  */
   1592      1.1     skrll       ret->parsed_size = strtol (hdr.size, (char **) NULL, 10);
   1593      1.1     skrll       ret->filename = (char *) hdrp + SIZEOF_AR_HDR_BIG;
   1594      1.1     skrll     }
   1595      1.1     skrll 
   1596      1.1     skrll   /* Skip over the XCOFFARFMAG at the end of the file name.  */
   1597      1.1     skrll   if (bfd_seek (abfd, (file_ptr) ((namlen & 1) + SXCOFFARFMAG), SEEK_CUR) != 0)
   1598      1.1     skrll     return NULL;
   1599      1.1     skrll 
   1600      1.1     skrll   return (PTR) ret;
   1601      1.1     skrll }
   1602      1.1     skrll 
   1603      1.1     skrll /* Open the next element in an XCOFF archive.  */
   1604      1.1     skrll 
   1605      1.1     skrll bfd *
   1606      1.1     skrll _bfd_xcoff_openr_next_archived_file (archive, last_file)
   1607      1.1     skrll      bfd *archive;
   1608      1.1     skrll      bfd *last_file;
   1609      1.1     skrll {
   1610      1.1     skrll   file_ptr filestart;
   1611      1.1     skrll 
   1612      1.1     skrll   if (xcoff_ardata (archive) == NULL)
   1613      1.1     skrll     {
   1614      1.1     skrll       bfd_set_error (bfd_error_invalid_operation);
   1615      1.1     skrll       return NULL;
   1616      1.1     skrll     }
   1617      1.1     skrll 
   1618      1.1     skrll   if (! xcoff_big_format_p (archive))
   1619      1.1     skrll     {
   1620      1.1     skrll       if (last_file == NULL)
   1621      1.1     skrll 	filestart = bfd_ardata (archive)->first_file_filepos;
   1622      1.1     skrll       else
   1623      1.1     skrll 	filestart = strtol (arch_xhdr (last_file)->nextoff, (char **) NULL,
   1624      1.1     skrll 			    10);
   1625      1.1     skrll 
   1626      1.1     skrll       if (filestart == 0
   1627      1.1     skrll 	  || filestart == strtol (xcoff_ardata (archive)->memoff,
   1628      1.1     skrll 				  (char **) NULL, 10)
   1629      1.1     skrll 	  || filestart == strtol (xcoff_ardata (archive)->symoff,
   1630      1.1     skrll 				  (char **) NULL, 10))
   1631      1.1     skrll 	{
   1632      1.1     skrll 	  bfd_set_error (bfd_error_no_more_archived_files);
   1633      1.1     skrll 	  return NULL;
   1634      1.1     skrll 	}
   1635      1.1     skrll     }
   1636      1.1     skrll   else
   1637      1.1     skrll     {
   1638      1.1     skrll       if (last_file == NULL)
   1639      1.1     skrll 	filestart = bfd_ardata (archive)->first_file_filepos;
   1640      1.1     skrll       else
   1641      1.1     skrll 	/* XXX These actually have to be a calls to strtoll (at least
   1642      1.1     skrll 	   on 32-bit machines) since the fields's width is 20 and
   1643      1.1     skrll 	   there numbers with more than 32 bits can be represented.  */
   1644      1.1     skrll 	filestart = strtol (arch_xhdr_big (last_file)->nextoff, (char **) NULL,
   1645      1.1     skrll 			    10);
   1646      1.1     skrll 
   1647      1.1     skrll       /* XXX These actually have to be calls to strtoll (at least on 32-bit
   1648      1.1     skrll 	 machines) since the fields's width is 20 and there numbers with more
   1649      1.1     skrll 	 than 32 bits can be represented.  */
   1650      1.1     skrll       if (filestart == 0
   1651      1.1     skrll 	  || filestart == strtol (xcoff_ardata_big (archive)->memoff,
   1652      1.1     skrll 				  (char **) NULL, 10)
   1653      1.1     skrll 	  || filestart == strtol (xcoff_ardata_big (archive)->symoff,
   1654      1.1     skrll 				  (char **) NULL, 10))
   1655      1.1     skrll 	{
   1656      1.1     skrll 	  bfd_set_error (bfd_error_no_more_archived_files);
   1657      1.1     skrll 	  return NULL;
   1658      1.1     skrll 	}
   1659      1.1     skrll     }
   1660      1.1     skrll 
   1661      1.1     skrll   return _bfd_get_elt_at_filepos (archive, filestart);
   1662      1.1     skrll }
   1663      1.1     skrll 
   1664      1.1     skrll /* Stat an element in an XCOFF archive.  */
   1665      1.1     skrll 
   1666      1.1     skrll int
   1667      1.1     skrll _bfd_xcoff_stat_arch_elt (abfd, s)
   1668      1.1     skrll      bfd *abfd;
   1669      1.1     skrll      struct stat *s;
   1670      1.1     skrll {
   1671      1.1     skrll   if (abfd->arelt_data == NULL)
   1672      1.1     skrll     {
   1673      1.1     skrll       bfd_set_error (bfd_error_invalid_operation);
   1674      1.1     skrll       return -1;
   1675      1.1     skrll     }
   1676      1.1     skrll 
   1677      1.1     skrll   if (! xcoff_big_format_p (abfd->my_archive))
   1678      1.1     skrll     {
   1679      1.1     skrll       struct xcoff_ar_hdr *hdrp = arch_xhdr (abfd);
   1680      1.1     skrll 
   1681      1.1     skrll       s->st_mtime = strtol (hdrp->date, (char **) NULL, 10);
   1682      1.1     skrll       s->st_uid = strtol (hdrp->uid, (char **) NULL, 10);
   1683      1.1     skrll       s->st_gid = strtol (hdrp->gid, (char **) NULL, 10);
   1684      1.1     skrll       s->st_mode = strtol (hdrp->mode, (char **) NULL, 8);
   1685      1.1     skrll       s->st_size = arch_eltdata (abfd)->parsed_size;
   1686      1.1     skrll     }
   1687      1.1     skrll   else
   1688      1.1     skrll     {
   1689      1.1     skrll       struct xcoff_ar_hdr_big *hdrp = arch_xhdr_big (abfd);
   1690      1.1     skrll 
   1691      1.1     skrll       s->st_mtime = strtol (hdrp->date, (char **) NULL, 10);
   1692      1.1     skrll       s->st_uid = strtol (hdrp->uid, (char **) NULL, 10);
   1693      1.1     skrll       s->st_gid = strtol (hdrp->gid, (char **) NULL, 10);
   1694      1.1     skrll       s->st_mode = strtol (hdrp->mode, (char **) NULL, 8);
   1695      1.1     skrll       s->st_size = arch_eltdata (abfd)->parsed_size;
   1696      1.1     skrll     }
   1697      1.1     skrll 
   1698      1.1     skrll   return 0;
   1699      1.1     skrll }
   1700      1.1     skrll 
   1701      1.1     skrll /* Normalize a file name for inclusion in an archive.  */
   1702      1.1     skrll 
   1703      1.1     skrll static const char *
   1704      1.1     skrll normalize_filename (abfd)
   1705      1.1     skrll      bfd *abfd;
   1706      1.1     skrll {
   1707      1.1     skrll   const char *file;
   1708      1.1     skrll   const char *filename;
   1709      1.1     skrll 
   1710      1.1     skrll   file = bfd_get_filename (abfd);
   1711      1.1     skrll   filename = strrchr (file, '/');
   1712      1.1     skrll   if (filename != NULL)
   1713      1.1     skrll     filename++;
   1714      1.1     skrll   else
   1715      1.1     skrll     filename = file;
   1716      1.1     skrll   return filename;
   1717      1.1     skrll }
   1718      1.1     skrll 
   1719      1.1     skrll /* Write out an XCOFF armap.  */
   1720      1.1     skrll 
   1721      1.1     skrll static bfd_boolean
   1722      1.1     skrll xcoff_write_armap_old (abfd, elength, map, orl_count, stridx)
   1723      1.1     skrll      bfd *abfd;
   1724      1.1     skrll      unsigned int elength ATTRIBUTE_UNUSED;
   1725      1.1     skrll      struct orl *map;
   1726  1.1.1.2  christos      unsigned int orl_count;
   1727      1.1     skrll      int stridx;
   1728      1.1     skrll {
   1729      1.1     skrll   struct archive_iterator iterator;
   1730      1.1     skrll   struct xcoff_ar_hdr hdr;
   1731      1.1     skrll   char *p;
   1732      1.1     skrll   unsigned char buf[4];
   1733      1.1     skrll   unsigned int i;
   1734      1.1     skrll 
   1735      1.1     skrll   memset (&hdr, 0, sizeof hdr);
   1736      1.1     skrll   sprintf (hdr.size, "%ld", (long) (4 + orl_count * 4 + stridx));
   1737      1.1     skrll   sprintf (hdr.nextoff, "%d", 0);
   1738      1.1     skrll   memcpy (hdr.prevoff, xcoff_ardata (abfd)->memoff, XCOFFARMAG_ELEMENT_SIZE);
   1739      1.1     skrll   sprintf (hdr.date, "%d", 0);
   1740      1.1     skrll   sprintf (hdr.uid, "%d", 0);
   1741      1.1     skrll   sprintf (hdr.gid, "%d", 0);
   1742      1.1     skrll   sprintf (hdr.mode, "%d", 0);
   1743      1.1     skrll   sprintf (hdr.namlen, "%d", 0);
   1744      1.1     skrll 
   1745      1.1     skrll   /* We need spaces, not null bytes, in the header.  */
   1746      1.1     skrll   for (p = (char *) &hdr; p < (char *) &hdr + SIZEOF_AR_HDR; p++)
   1747      1.1     skrll     if (*p == '\0')
   1748      1.1     skrll       *p = ' ';
   1749      1.1     skrll 
   1750      1.1     skrll   if (bfd_bwrite ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
   1751      1.1     skrll       != SIZEOF_AR_HDR
   1752      1.1     skrll       || (bfd_bwrite (XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG, abfd)
   1753      1.1     skrll 	  != SXCOFFARFMAG))
   1754      1.1     skrll     return FALSE;
   1755      1.1     skrll 
   1756      1.1     skrll   H_PUT_32 (abfd, orl_count, buf);
   1757      1.1     skrll   if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
   1758  1.1.1.2  christos     return FALSE;
   1759  1.1.1.2  christos 
   1760  1.1.1.2  christos   i = 0;
   1761  1.1.1.2  christos   archive_iterator_begin (&iterator, abfd);
   1762  1.1.1.2  christos   while (i < orl_count && archive_iterator_next (&iterator))
   1763  1.1.1.2  christos     while (map[i].u.abfd == iterator.current.member)
   1764  1.1.1.2  christos       {
   1765  1.1.1.2  christos 	H_PUT_32 (abfd, iterator.current.offset, buf);
   1766  1.1.1.2  christos 	if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
   1767      1.1     skrll 	  return FALSE;
   1768      1.1     skrll 	++i;
   1769      1.1     skrll       }
   1770      1.1     skrll 
   1771      1.1     skrll   for (i = 0; i < orl_count; i++)
   1772      1.1     skrll     {
   1773      1.1     skrll       const char *name;
   1774      1.1     skrll       size_t namlen;
   1775      1.1     skrll 
   1776      1.1     skrll       name = *map[i].name;
   1777      1.1     skrll       namlen = strlen (name);
   1778      1.1     skrll       if (bfd_bwrite (name, (bfd_size_type) (namlen + 1), abfd) != namlen + 1)
   1779      1.1     skrll 	return FALSE;
   1780      1.1     skrll     }
   1781      1.1     skrll 
   1782      1.1     skrll   if ((stridx & 1) != 0)
   1783      1.1     skrll     {
   1784      1.1     skrll       char b;
   1785      1.1     skrll 
   1786      1.1     skrll       b = '\0';
   1787      1.1     skrll       if (bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
   1788      1.1     skrll 	return FALSE;
   1789      1.1     skrll     }
   1790      1.1     skrll 
   1791      1.1     skrll   return TRUE;
   1792      1.1     skrll }
   1793      1.1     skrll 
   1794      1.1     skrll static char buff20[XCOFFARMAGBIG_ELEMENT_SIZE + 1];
   1795      1.1     skrll #define FMT20  "%-20lld"
   1796      1.1     skrll #define FMT12  "%-12d"
   1797      1.1     skrll #define FMT12_OCTAL  "%-12o"
   1798      1.1     skrll #define FMT4  "%-4d"
   1799      1.1     skrll #define PRINT20(d, v) \
   1800      1.1     skrll   sprintf (buff20, FMT20, (long long)(v)), \
   1801      1.1     skrll   memcpy ((void *) (d), buff20, 20)
   1802      1.1     skrll 
   1803      1.1     skrll #define PRINT12(d, v) \
   1804      1.1     skrll   sprintf (buff20, FMT12, (int)(v)), \
   1805      1.1     skrll   memcpy ((void *) (d), buff20, 12)
   1806      1.1     skrll 
   1807      1.1     skrll #define PRINT12_OCTAL(d, v) \
   1808      1.1     skrll   sprintf (buff20, FMT12_OCTAL, (unsigned int)(v)), \
   1809      1.1     skrll   memcpy ((void *) (d), buff20, 12)
   1810      1.1     skrll 
   1811      1.1     skrll #define PRINT4(d, v) \
   1812      1.1     skrll   sprintf (buff20, FMT4, (int)(v)), \
   1813      1.1     skrll   memcpy ((void *) (d), buff20, 4)
   1814      1.1     skrll 
   1815      1.1     skrll #define READ20(d, v) \
   1816      1.1     skrll   buff20[20] = 0, \
   1817      1.1     skrll   memcpy (buff20, (d), 20), \
   1818      1.1     skrll   (v) = bfd_scan_vma (buff20, (const char **) NULL, 10)
   1819      1.1     skrll 
   1820      1.1     skrll static bfd_boolean
   1821      1.1     skrll do_pad (abfd, number)
   1822      1.1     skrll      bfd *abfd;
   1823      1.1     skrll      unsigned int number;
   1824      1.1     skrll {
   1825      1.1     skrll   bfd_byte b = 0;
   1826      1.1     skrll 
   1827      1.1     skrll   /* Limit pad to <= 4096.  */
   1828      1.1     skrll   if (number > 4096)
   1829      1.1     skrll     return FALSE;
   1830      1.1     skrll 
   1831      1.1     skrll   while (number--)
   1832      1.1     skrll     if (bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
   1833      1.1     skrll       return FALSE;
   1834      1.1     skrll 
   1835      1.1     skrll   return TRUE;
   1836      1.1     skrll }
   1837      1.1     skrll 
   1838      1.1     skrll static bfd_boolean
   1839      1.1     skrll do_copy (out_bfd, in_bfd)
   1840      1.1     skrll      bfd *out_bfd;
   1841      1.1     skrll      bfd *in_bfd;
   1842      1.1     skrll {
   1843      1.1     skrll   bfd_size_type remaining;
   1844      1.1     skrll   bfd_byte buffer[DEFAULT_BUFFERSIZE];
   1845      1.1     skrll 
   1846      1.1     skrll   if (bfd_seek (in_bfd, (file_ptr) 0, SEEK_SET) != 0)
   1847      1.1     skrll     return FALSE;
   1848      1.1     skrll 
   1849      1.1     skrll   remaining = arelt_size (in_bfd);
   1850      1.1     skrll 
   1851      1.1     skrll   while (remaining >= DEFAULT_BUFFERSIZE)
   1852      1.1     skrll     {
   1853      1.1     skrll       if (bfd_bread (buffer, DEFAULT_BUFFERSIZE, in_bfd) != DEFAULT_BUFFERSIZE
   1854      1.1     skrll 	  || bfd_bwrite (buffer, DEFAULT_BUFFERSIZE, out_bfd) != DEFAULT_BUFFERSIZE)
   1855      1.1     skrll 	return FALSE;
   1856      1.1     skrll 
   1857      1.1     skrll       remaining -= DEFAULT_BUFFERSIZE;
   1858      1.1     skrll     }
   1859      1.1     skrll 
   1860      1.1     skrll   if (remaining)
   1861      1.1     skrll     {
   1862      1.1     skrll       if (bfd_bread (buffer, remaining, in_bfd) != remaining
   1863      1.1     skrll 	  || bfd_bwrite (buffer, remaining, out_bfd) != remaining)
   1864      1.1     skrll 	return FALSE;
   1865      1.1     skrll     }
   1866      1.1     skrll 
   1867      1.1     skrll   return TRUE;
   1868      1.1     skrll }
   1869      1.1     skrll 
   1870      1.1     skrll static bfd_boolean
   1871      1.1     skrll xcoff_write_armap_big (abfd, elength, map, orl_count, stridx)
   1872      1.1     skrll      bfd *abfd;
   1873      1.1     skrll      unsigned int elength ATTRIBUTE_UNUSED;
   1874      1.1     skrll      struct orl *map;
   1875  1.1.1.2  christos      unsigned int orl_count;
   1876      1.1     skrll      int stridx;
   1877      1.1     skrll {
   1878  1.1.1.2  christos   struct archive_iterator iterator;
   1879      1.1     skrll   struct xcoff_ar_file_hdr_big *fhdr;
   1880      1.1     skrll   bfd_vma i, sym_32, sym_64, str_32, str_64;
   1881      1.1     skrll   const bfd_arch_info_type *arch_info;
   1882      1.1     skrll   bfd *current_bfd;
   1883      1.1     skrll   size_t string_length;
   1884      1.1     skrll   file_ptr nextoff, prevoff;
   1885      1.1     skrll 
   1886      1.1     skrll   /* First, we look through the symbols and work out which are
   1887  1.1.1.2  christos      from 32-bit objects and which from 64-bit ones.  */
   1888  1.1.1.2  christos   sym_32 = sym_64 = str_32 = str_64 = 0;
   1889  1.1.1.2  christos 
   1890  1.1.1.2  christos   i = 0;
   1891      1.1     skrll   for (current_bfd = abfd->archive_head;
   1892  1.1.1.2  christos        current_bfd != NULL && i < orl_count;
   1893      1.1     skrll        current_bfd = current_bfd->archive_next)
   1894      1.1     skrll     {
   1895      1.1     skrll       arch_info = bfd_get_arch_info (current_bfd);
   1896      1.1     skrll       while (map[i].u.abfd == current_bfd)
   1897      1.1     skrll 	{
   1898      1.1     skrll 	  string_length = strlen (*map[i].name) + 1;
   1899      1.1     skrll 	  if (arch_info->bits_per_address == 64)
   1900      1.1     skrll 	    {
   1901      1.1     skrll 	      sym_64++;
   1902      1.1     skrll 	      str_64 += string_length;
   1903      1.1     skrll 	    }
   1904      1.1     skrll 	  else
   1905      1.1     skrll 	    {
   1906      1.1     skrll 	      sym_32++;
   1907      1.1     skrll 	      str_32 += string_length;
   1908      1.1     skrll 	    }
   1909      1.1     skrll 	  i++;
   1910      1.1     skrll 	}
   1911      1.1     skrll     }
   1912      1.1     skrll 
   1913      1.1     skrll   /* A quick sanity check... */
   1914      1.1     skrll   BFD_ASSERT (sym_64 + sym_32 == orl_count);
   1915      1.1     skrll   /* Explicit cast to int for compiler.  */
   1916      1.1     skrll   BFD_ASSERT ((int)(str_64 + str_32) == stridx);
   1917      1.1     skrll 
   1918      1.1     skrll   fhdr = xcoff_ardata_big (abfd);
   1919      1.1     skrll 
   1920      1.1     skrll   /* xcoff_write_archive_contents_big passes nextoff in symoff. */
   1921      1.1     skrll   READ20 (fhdr->memoff, prevoff);
   1922      1.1     skrll   READ20 (fhdr->symoff, nextoff);
   1923      1.1     skrll 
   1924      1.1     skrll   BFD_ASSERT (nextoff == bfd_tell (abfd));
   1925      1.1     skrll 
   1926      1.1     skrll   /* Write out the symbol table.
   1927      1.1     skrll      Layout :
   1928      1.1     skrll 
   1929      1.1     skrll      standard big archive header
   1930      1.1     skrll      0x0000		      ar_size	[0x14]
   1931      1.1     skrll      0x0014		      ar_nxtmem [0x14]
   1932      1.1     skrll      0x0028		      ar_prvmem [0x14]
   1933      1.1     skrll      0x003C		      ar_date	[0x0C]
   1934      1.1     skrll      0x0048		      ar_uid	[0x0C]
   1935      1.1     skrll      0x0054		      ar_gid	[0x0C]
   1936      1.1     skrll      0x0060		      ar_mod	[0x0C]
   1937      1.1     skrll      0x006C		      ar_namelen[0x04]
   1938      1.1     skrll      0x0070		      ar_fmag	[SXCOFFARFMAG]
   1939      1.1     skrll 
   1940      1.1     skrll      Symbol table
   1941      1.1     skrll      0x0072		      num_syms	[0x08], binary
   1942      1.1     skrll      0x0078		      offsets	[0x08 * num_syms], binary
   1943      1.1     skrll      0x0086 + 0x08 * num_syms names	[??]
   1944      1.1     skrll      ??			      pad to even bytes.
   1945      1.1     skrll   */
   1946      1.1     skrll 
   1947      1.1     skrll   if (sym_32)
   1948      1.1     skrll     {
   1949      1.1     skrll       struct xcoff_ar_hdr_big *hdr;
   1950      1.1     skrll       char *symbol_table;
   1951      1.1     skrll       char *st;
   1952      1.1     skrll 
   1953      1.1     skrll       bfd_vma symbol_table_size =
   1954      1.1     skrll 	SIZEOF_AR_HDR_BIG
   1955      1.1     skrll 	+ SXCOFFARFMAG
   1956      1.1     skrll 	+ 8
   1957      1.1     skrll 	+ 8 * sym_32
   1958      1.1     skrll 	+ str_32 + (str_32 & 1);
   1959      1.1     skrll 
   1960      1.1     skrll       symbol_table = bfd_zmalloc (symbol_table_size);
   1961      1.1     skrll       if (symbol_table == NULL)
   1962      1.1     skrll 	return FALSE;
   1963      1.1     skrll 
   1964      1.1     skrll       hdr = (struct xcoff_ar_hdr_big *) symbol_table;
   1965      1.1     skrll 
   1966      1.1     skrll       PRINT20 (hdr->size, 8 + 8 * sym_32 + str_32 + (str_32 & 1));
   1967      1.1     skrll 
   1968      1.1     skrll       if (sym_64)
   1969      1.1     skrll 	PRINT20 (hdr->nextoff, nextoff + symbol_table_size);
   1970      1.1     skrll       else
   1971      1.1     skrll 	PRINT20 (hdr->nextoff, 0);
   1972      1.1     skrll 
   1973      1.1     skrll       PRINT20 (hdr->prevoff, prevoff);
   1974      1.1     skrll       PRINT12 (hdr->date, 0);
   1975      1.1     skrll       PRINT12 (hdr->uid, 0);
   1976      1.1     skrll       PRINT12 (hdr->gid, 0);
   1977      1.1     skrll       PRINT12 (hdr->mode, 0);
   1978      1.1     skrll       PRINT4 (hdr->namlen, 0) ;
   1979      1.1     skrll 
   1980      1.1     skrll       st = symbol_table + SIZEOF_AR_HDR_BIG;
   1981      1.1     skrll       memcpy (st, XCOFFARFMAG, SXCOFFARFMAG);
   1982      1.1     skrll       st += SXCOFFARFMAG;
   1983      1.1     skrll 
   1984      1.1     skrll       bfd_h_put_64 (abfd, sym_32, st);
   1985      1.1     skrll       st += 8;
   1986  1.1.1.2  christos 
   1987  1.1.1.2  christos       /* loop over the 32 bit offsets */
   1988      1.1     skrll       i = 0;
   1989  1.1.1.2  christos       archive_iterator_begin (&iterator, abfd);
   1990  1.1.1.2  christos       while (i < orl_count && archive_iterator_next (&iterator))
   1991      1.1     skrll 	{
   1992      1.1     skrll 	  arch_info = bfd_get_arch_info (iterator.current.member);
   1993      1.1     skrll 	  while (map[i].u.abfd == iterator.current.member)
   1994  1.1.1.2  christos 	    {
   1995      1.1     skrll 	      if (arch_info->bits_per_address == 32)
   1996      1.1     skrll 		{
   1997      1.1     skrll 		  bfd_h_put_64 (abfd, iterator.current.offset, st);
   1998      1.1     skrll 		  st += 8;
   1999      1.1     skrll 		}
   2000      1.1     skrll 	      i++;
   2001      1.1     skrll 	    }
   2002      1.1     skrll 	}
   2003  1.1.1.2  christos 
   2004  1.1.1.2  christos       /* loop over the 32 bit symbol names */
   2005  1.1.1.2  christos       i = 0;
   2006      1.1     skrll       for (current_bfd = abfd->archive_head;
   2007  1.1.1.2  christos 	   current_bfd != NULL && i < orl_count;
   2008      1.1     skrll 	   current_bfd = current_bfd->archive_next)
   2009      1.1     skrll 	{
   2010      1.1     skrll 	  arch_info = bfd_get_arch_info (current_bfd);
   2011      1.1     skrll 	  while (map[i].u.abfd == current_bfd)
   2012      1.1     skrll 	    {
   2013      1.1     skrll 	      if (arch_info->bits_per_address == 32)
   2014      1.1     skrll 		{
   2015      1.1     skrll 		  string_length = sprintf (st, "%s", *map[i].name);
   2016      1.1     skrll 		  st += string_length + 1;
   2017      1.1     skrll 		}
   2018      1.1     skrll 	      i++;
   2019      1.1     skrll 	    }
   2020      1.1     skrll 	}
   2021      1.1     skrll 
   2022      1.1     skrll       bfd_bwrite (symbol_table, symbol_table_size, abfd);
   2023      1.1     skrll 
   2024      1.1     skrll       free (symbol_table);
   2025      1.1     skrll 
   2026      1.1     skrll       prevoff = nextoff;
   2027      1.1     skrll       nextoff = nextoff + symbol_table_size;
   2028      1.1     skrll     }
   2029      1.1     skrll   else
   2030      1.1     skrll     PRINT20 (fhdr->symoff, 0);
   2031      1.1     skrll 
   2032      1.1     skrll   if (sym_64)
   2033      1.1     skrll     {
   2034      1.1     skrll       struct xcoff_ar_hdr_big *hdr;
   2035      1.1     skrll       char *symbol_table;
   2036      1.1     skrll       char *st;
   2037      1.1     skrll 
   2038      1.1     skrll       bfd_vma symbol_table_size =
   2039      1.1     skrll 	SIZEOF_AR_HDR_BIG
   2040      1.1     skrll 	+ SXCOFFARFMAG
   2041      1.1     skrll 	+ 8
   2042      1.1     skrll 	+ 8 * sym_64
   2043      1.1     skrll 	+ str_64 + (str_64 & 1);
   2044      1.1     skrll 
   2045      1.1     skrll       symbol_table = bfd_zmalloc (symbol_table_size);
   2046      1.1     skrll       if (symbol_table == NULL)
   2047      1.1     skrll 	return FALSE;
   2048      1.1     skrll 
   2049      1.1     skrll       hdr = (struct xcoff_ar_hdr_big *) symbol_table;
   2050      1.1     skrll 
   2051      1.1     skrll       PRINT20 (hdr->size, 8 + 8 * sym_64 + str_64 + (str_64 & 1));
   2052      1.1     skrll       PRINT20 (hdr->nextoff, 0);
   2053      1.1     skrll       PRINT20 (hdr->prevoff, prevoff);
   2054      1.1     skrll       PRINT12 (hdr->date, 0);
   2055      1.1     skrll       PRINT12 (hdr->uid, 0);
   2056      1.1     skrll       PRINT12 (hdr->gid, 0);
   2057      1.1     skrll       PRINT12 (hdr->mode, 0);
   2058      1.1     skrll       PRINT4 (hdr->namlen, 0);
   2059      1.1     skrll 
   2060      1.1     skrll       st = symbol_table + SIZEOF_AR_HDR_BIG;
   2061      1.1     skrll       memcpy (st, XCOFFARFMAG, SXCOFFARFMAG);
   2062      1.1     skrll       st += SXCOFFARFMAG;
   2063      1.1     skrll 
   2064      1.1     skrll       bfd_h_put_64 (abfd, sym_64, st);
   2065      1.1     skrll       st += 8;
   2066  1.1.1.2  christos 
   2067  1.1.1.2  christos       /* loop over the 64 bit offsets */
   2068      1.1     skrll       i = 0;
   2069  1.1.1.2  christos       archive_iterator_begin (&iterator, abfd);
   2070  1.1.1.2  christos       while (i < orl_count && archive_iterator_next (&iterator))
   2071      1.1     skrll 	{
   2072      1.1     skrll 	  arch_info = bfd_get_arch_info (iterator.current.member);
   2073      1.1     skrll 	  while (map[i].u.abfd == iterator.current.member)
   2074  1.1.1.2  christos 	    {
   2075      1.1     skrll 	      if (arch_info->bits_per_address == 64)
   2076      1.1     skrll 		{
   2077      1.1     skrll 		  bfd_h_put_64 (abfd, iterator.current.offset, st);
   2078      1.1     skrll 		  st += 8;
   2079      1.1     skrll 		}
   2080      1.1     skrll 	      i++;
   2081      1.1     skrll 	    }
   2082      1.1     skrll 	}
   2083  1.1.1.2  christos 
   2084  1.1.1.2  christos       /* loop over the 64 bit symbol names */
   2085  1.1.1.2  christos       i = 0;
   2086      1.1     skrll       for (current_bfd = abfd->archive_head;
   2087  1.1.1.2  christos 	   current_bfd != NULL && i < orl_count;
   2088      1.1     skrll 	   current_bfd = current_bfd->archive_next)
   2089      1.1     skrll 	{
   2090      1.1     skrll 	  arch_info = bfd_get_arch_info (current_bfd);
   2091      1.1     skrll 	  while (map[i].u.abfd == current_bfd)
   2092      1.1     skrll 	    {
   2093      1.1     skrll 	      if (arch_info->bits_per_address == 64)
   2094      1.1     skrll 		{
   2095      1.1     skrll 		  string_length = sprintf (st, "%s", *map[i].name);
   2096      1.1     skrll 		  st += string_length + 1;
   2097      1.1     skrll 		}
   2098      1.1     skrll 	      i++;
   2099      1.1     skrll 	    }
   2100      1.1     skrll 	}
   2101      1.1     skrll 
   2102      1.1     skrll       bfd_bwrite (symbol_table, symbol_table_size, abfd);
   2103      1.1     skrll 
   2104      1.1     skrll       free (symbol_table);
   2105      1.1     skrll 
   2106      1.1     skrll       PRINT20 (fhdr->symoff64, nextoff);
   2107      1.1     skrll     }
   2108      1.1     skrll   else
   2109      1.1     skrll     PRINT20 (fhdr->symoff64, 0);
   2110      1.1     skrll 
   2111      1.1     skrll   return TRUE;
   2112      1.1     skrll }
   2113      1.1     skrll 
   2114      1.1     skrll bfd_boolean
   2115      1.1     skrll _bfd_xcoff_write_armap (abfd, elength, map, orl_count, stridx)
   2116      1.1     skrll      bfd *abfd;
   2117      1.1     skrll      unsigned int elength ATTRIBUTE_UNUSED;
   2118      1.1     skrll      struct orl *map;
   2119      1.1     skrll      unsigned int orl_count;
   2120      1.1     skrll      int stridx;
   2121      1.1     skrll {
   2122      1.1     skrll   if (! xcoff_big_format_p (abfd))
   2123      1.1     skrll     return xcoff_write_armap_old (abfd, elength, map, orl_count, stridx);
   2124      1.1     skrll   else
   2125      1.1     skrll     return xcoff_write_armap_big (abfd, elength, map, orl_count, stridx);
   2126      1.1     skrll }
   2127      1.1     skrll 
   2128      1.1     skrll /* Write out an XCOFF archive.  We always write an entire archive,
   2129      1.1     skrll    rather than fussing with the freelist and so forth.  */
   2130      1.1     skrll 
   2131      1.1     skrll static bfd_boolean
   2132  1.1.1.2  christos xcoff_write_archive_contents_old (abfd)
   2133      1.1     skrll      bfd *abfd;
   2134      1.1     skrll {
   2135      1.1     skrll   struct archive_iterator iterator;
   2136      1.1     skrll   struct xcoff_ar_file_hdr fhdr;
   2137      1.1     skrll   bfd_size_type count;
   2138      1.1     skrll   bfd_size_type total_namlen;
   2139      1.1     skrll   file_ptr *offsets;
   2140      1.1     skrll   bfd_boolean makemap;
   2141      1.1     skrll   bfd_boolean hasobjects;
   2142      1.1     skrll   file_ptr prevoff, nextoff;
   2143      1.1     skrll   bfd *sub;
   2144      1.1     skrll   size_t i;
   2145      1.1     skrll   struct xcoff_ar_hdr ahdr;
   2146      1.1     skrll   bfd_size_type size;
   2147      1.1     skrll   char *p;
   2148      1.1     skrll   char decbuf[XCOFFARMAG_ELEMENT_SIZE + 1];
   2149      1.1     skrll 
   2150      1.1     skrll   memset (&fhdr, 0, sizeof fhdr);
   2151      1.1     skrll   (void) strncpy (fhdr.magic, XCOFFARMAG, SXCOFFARMAG);
   2152      1.1     skrll   sprintf (fhdr.firstmemoff, "%d", SIZEOF_AR_FILE_HDR);
   2153      1.1     skrll   sprintf (fhdr.freeoff, "%d", 0);
   2154      1.1     skrll 
   2155      1.1     skrll   count = 0;
   2156      1.1     skrll   total_namlen = 0;
   2157      1.1     skrll   for (sub = abfd->archive_head; sub != NULL; sub = sub->archive_next)
   2158  1.1.1.2  christos     {
   2159      1.1     skrll       ++count;
   2160  1.1.1.2  christos       total_namlen += strlen (normalize_filename (sub)) + 1;
   2161  1.1.1.2  christos       if (sub->arelt_data == NULL)
   2162  1.1.1.2  christos 	{
   2163      1.1     skrll 	  sub->arelt_data = bfd_zalloc (sub, sizeof (struct areltdata));
   2164  1.1.1.2  christos 	  if (sub->arelt_data == NULL)
   2165      1.1     skrll 	    return FALSE;
   2166  1.1.1.2  christos 	}
   2167      1.1     skrll       if (arch_xhdr (sub) == NULL)
   2168      1.1     skrll 	{
   2169      1.1     skrll 	  struct xcoff_ar_hdr *ahdrp;
   2170      1.1     skrll 	  struct stat s;
   2171      1.1     skrll 
   2172      1.1     skrll 	  if (stat (bfd_get_filename (sub), &s) != 0)
   2173      1.1     skrll 	    {
   2174      1.1     skrll 	      bfd_set_error (bfd_error_system_call);
   2175  1.1.1.2  christos 	      return FALSE;
   2176  1.1.1.2  christos 	    }
   2177  1.1.1.2  christos 
   2178  1.1.1.2  christos 	  ahdrp = bfd_zalloc (sub, sizeof (*ahdrp));
   2179      1.1     skrll 	  if (ahdrp == NULL)
   2180      1.1     skrll 	    return FALSE;
   2181      1.1     skrll 
   2182      1.1     skrll 	  sprintf (ahdrp->size, "%ld", (long) s.st_size);
   2183      1.1     skrll 	  sprintf (ahdrp->date, "%ld", (long) s.st_mtime);
   2184      1.1     skrll 	  sprintf (ahdrp->uid, "%ld", (long) s.st_uid);
   2185  1.1.1.2  christos 	  sprintf (ahdrp->gid, "%ld", (long) s.st_gid);
   2186      1.1     skrll 	  sprintf (ahdrp->mode, "%o", (unsigned int) s.st_mode);
   2187      1.1     skrll 
   2188  1.1.1.2  christos 	  arch_eltdata (sub)->arch_header = (char *) ahdrp;
   2189  1.1.1.2  christos 	  arch_eltdata (sub)->parsed_size = s.st_size;
   2190  1.1.1.2  christos 	}
   2191  1.1.1.2  christos     }
   2192      1.1     skrll   offsets = (file_ptr *) bfd_alloc (abfd, count * sizeof (file_ptr));
   2193  1.1.1.2  christos   if (offsets == NULL)
   2194  1.1.1.2  christos     return FALSE;
   2195      1.1     skrll 
   2196  1.1.1.2  christos   if (bfd_seek (abfd, (file_ptr) SIZEOF_AR_FILE_HDR, SEEK_SET) != 0)
   2197  1.1.1.2  christos     return FALSE;
   2198  1.1.1.2  christos 
   2199  1.1.1.2  christos   makemap = bfd_has_map (abfd);
   2200  1.1.1.2  christos   hasobjects = FALSE;
   2201  1.1.1.2  christos   prevoff = 0;
   2202  1.1.1.2  christos   for (archive_iterator_begin (&iterator, abfd), i = 0;
   2203  1.1.1.2  christos        archive_iterator_next (&iterator);
   2204  1.1.1.2  christos        i++)
   2205      1.1     skrll     {
   2206  1.1.1.2  christos       bfd_size_type namlen;
   2207  1.1.1.2  christos       struct xcoff_ar_hdr *ahdrp;
   2208  1.1.1.2  christos 
   2209  1.1.1.2  christos       if (makemap && ! hasobjects)
   2210  1.1.1.2  christos 	{
   2211      1.1     skrll 	  if (bfd_check_format (iterator.current.member, bfd_object))
   2212  1.1.1.2  christos 	    hasobjects = TRUE;
   2213  1.1.1.2  christos 	}
   2214  1.1.1.2  christos 
   2215  1.1.1.2  christos       ahdrp = arch_xhdr (iterator.current.member);
   2216      1.1     skrll       sprintf (ahdrp->prevoff, "%ld", (long) prevoff);
   2217      1.1     skrll       sprintf (ahdrp->namlen, "%ld", (long) iterator.current.namlen);
   2218      1.1     skrll       sprintf (ahdrp->nextoff, "%ld", (long) iterator.next.offset);
   2219      1.1     skrll 
   2220      1.1     skrll       /* We need spaces, not null bytes, in the header.  */
   2221      1.1     skrll       for (p = (char *) ahdrp; p < (char *) ahdrp + SIZEOF_AR_HDR; p++)
   2222  1.1.1.2  christos 	if (*p == '\0')
   2223      1.1     skrll 	  *p = ' ';
   2224      1.1     skrll 
   2225  1.1.1.2  christos       if (!do_pad (abfd, iterator.current.leading_padding))
   2226  1.1.1.2  christos 	return FALSE;
   2227  1.1.1.2  christos 
   2228  1.1.1.2  christos       BFD_ASSERT (iterator.current.offset == bfd_tell (abfd));
   2229  1.1.1.2  christos       namlen = iterator.current.padded_namlen;
   2230  1.1.1.2  christos       if (bfd_bwrite (ahdrp, SIZEOF_AR_HDR, abfd) != SIZEOF_AR_HDR
   2231  1.1.1.2  christos 	  || bfd_bwrite (iterator.current.name, namlen, abfd) != namlen
   2232  1.1.1.2  christos 	  || bfd_bwrite (XCOFFARFMAG, SXCOFFARFMAG, abfd) != SXCOFFARFMAG
   2233      1.1     skrll 	  || bfd_seek (iterator.current.member, 0, SEEK_SET) != 0
   2234      1.1     skrll 	  || !do_copy (abfd, iterator.current.member)
   2235  1.1.1.2  christos 	  || !do_pad (abfd, iterator.current.trailing_padding))
   2236  1.1.1.2  christos 	return FALSE;
   2237      1.1     skrll 
   2238      1.1     skrll       offsets[i] = iterator.current.offset;
   2239      1.1     skrll       prevoff = iterator.current.offset;
   2240      1.1     skrll     }
   2241      1.1     skrll 
   2242      1.1     skrll   sprintf (fhdr.lastmemoff, "%ld", (long) prevoff);
   2243  1.1.1.2  christos 
   2244      1.1     skrll   /* Write out the member table.  */
   2245      1.1     skrll 
   2246      1.1     skrll   nextoff = iterator.next.offset;
   2247      1.1     skrll   BFD_ASSERT (nextoff == bfd_tell (abfd));
   2248      1.1     skrll   sprintf (fhdr.memoff, "%ld", (long) nextoff);
   2249      1.1     skrll 
   2250      1.1     skrll   memset (&ahdr, 0, sizeof ahdr);
   2251      1.1     skrll   sprintf (ahdr.size, "%ld", (long) (XCOFFARMAG_ELEMENT_SIZE
   2252      1.1     skrll 				     + count * XCOFFARMAG_ELEMENT_SIZE
   2253      1.1     skrll 				     + total_namlen));
   2254      1.1     skrll   sprintf (ahdr.prevoff, "%ld", (long) prevoff);
   2255      1.1     skrll   sprintf (ahdr.date, "%d", 0);
   2256      1.1     skrll   sprintf (ahdr.uid, "%d", 0);
   2257      1.1     skrll   sprintf (ahdr.gid, "%d", 0);
   2258      1.1     skrll   sprintf (ahdr.mode, "%d", 0);
   2259      1.1     skrll   sprintf (ahdr.namlen, "%d", 0);
   2260      1.1     skrll 
   2261      1.1     skrll   size = (SIZEOF_AR_HDR
   2262      1.1     skrll 	  + XCOFFARMAG_ELEMENT_SIZE
   2263      1.1     skrll 	  + count * XCOFFARMAG_ELEMENT_SIZE
   2264      1.1     skrll 	  + total_namlen
   2265      1.1     skrll 	  + SXCOFFARFMAG);
   2266      1.1     skrll 
   2267      1.1     skrll   prevoff = nextoff;
   2268      1.1     skrll   nextoff += size + (size & 1);
   2269      1.1     skrll 
   2270      1.1     skrll   if (makemap && hasobjects)
   2271      1.1     skrll     sprintf (ahdr.nextoff, "%ld", (long) nextoff);
   2272      1.1     skrll   else
   2273      1.1     skrll     sprintf (ahdr.nextoff, "%d", 0);
   2274      1.1     skrll 
   2275      1.1     skrll   /* We need spaces, not null bytes, in the header.  */
   2276      1.1     skrll   for (p = (char *) &ahdr; p < (char *) &ahdr + SIZEOF_AR_HDR; p++)
   2277      1.1     skrll     if (*p == '\0')
   2278      1.1     skrll       *p = ' ';
   2279      1.1     skrll 
   2280      1.1     skrll   if ((bfd_bwrite ((PTR) &ahdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
   2281      1.1     skrll        != SIZEOF_AR_HDR)
   2282      1.1     skrll       || (bfd_bwrite ((PTR) XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG, abfd)
   2283      1.1     skrll 	  != SXCOFFARFMAG))
   2284      1.1     skrll     return FALSE;
   2285      1.1     skrll 
   2286      1.1     skrll   sprintf (decbuf, "%-12ld", (long) count);
   2287      1.1     skrll   if (bfd_bwrite ((PTR) decbuf, (bfd_size_type) XCOFFARMAG_ELEMENT_SIZE, abfd)
   2288      1.1     skrll       != XCOFFARMAG_ELEMENT_SIZE)
   2289      1.1     skrll     return FALSE;
   2290      1.1     skrll   for (i = 0; i < (size_t) count; i++)
   2291      1.1     skrll     {
   2292      1.1     skrll       sprintf (decbuf, "%-12ld", (long) offsets[i]);
   2293      1.1     skrll       if (bfd_bwrite ((PTR) decbuf, (bfd_size_type) XCOFFARMAG_ELEMENT_SIZE,
   2294      1.1     skrll 		      abfd) != XCOFFARMAG_ELEMENT_SIZE)
   2295      1.1     skrll 	return FALSE;
   2296      1.1     skrll     }
   2297      1.1     skrll   for (sub = abfd->archive_head; sub != NULL; sub = sub->archive_next)
   2298      1.1     skrll     {
   2299      1.1     skrll       const char *name;
   2300      1.1     skrll       bfd_size_type namlen;
   2301      1.1     skrll 
   2302      1.1     skrll       name = normalize_filename (sub);
   2303      1.1     skrll       namlen = strlen (name);
   2304      1.1     skrll       if (bfd_bwrite ((PTR) name, namlen + 1, abfd) != namlen + 1)
   2305      1.1     skrll 	return FALSE;
   2306      1.1     skrll     }
   2307      1.1     skrll 
   2308      1.1     skrll   if (! do_pad (abfd, size & 1))
   2309      1.1     skrll     return FALSE;
   2310      1.1     skrll 
   2311      1.1     skrll   /* Write out the armap, if appropriate.  */
   2312      1.1     skrll   if (! makemap || ! hasobjects)
   2313      1.1     skrll     sprintf (fhdr.symoff, "%d", 0);
   2314      1.1     skrll   else
   2315      1.1     skrll     {
   2316      1.1     skrll       BFD_ASSERT (nextoff == bfd_tell (abfd));
   2317      1.1     skrll       sprintf (fhdr.symoff, "%ld", (long) nextoff);
   2318      1.1     skrll       bfd_ardata (abfd)->tdata = (PTR) &fhdr;
   2319      1.1     skrll       if (! _bfd_compute_and_write_armap (abfd, 0))
   2320      1.1     skrll 	return FALSE;
   2321      1.1     skrll     }
   2322      1.1     skrll 
   2323      1.1     skrll   /* Write out the archive file header.  */
   2324      1.1     skrll 
   2325      1.1     skrll   /* We need spaces, not null bytes, in the header.  */
   2326      1.1     skrll   for (p = (char *) &fhdr; p < (char *) &fhdr + SIZEOF_AR_FILE_HDR; p++)
   2327      1.1     skrll     if (*p == '\0')
   2328      1.1     skrll       *p = ' ';
   2329      1.1     skrll 
   2330      1.1     skrll   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
   2331      1.1     skrll       || (bfd_bwrite ((PTR) &fhdr, (bfd_size_type) SIZEOF_AR_FILE_HDR, abfd)
   2332      1.1     skrll 	  != SIZEOF_AR_FILE_HDR))
   2333      1.1     skrll     return FALSE;
   2334      1.1     skrll 
   2335      1.1     skrll   return TRUE;
   2336      1.1     skrll }
   2337      1.1     skrll 
   2338      1.1     skrll static bfd_boolean
   2339      1.1     skrll xcoff_write_archive_contents_big (abfd)
   2340      1.1     skrll      bfd *abfd;
   2341      1.1     skrll {
   2342      1.1     skrll   struct xcoff_ar_file_hdr_big fhdr;
   2343      1.1     skrll   bfd_size_type count;
   2344      1.1     skrll   bfd_size_type total_namlen;
   2345      1.1     skrll   file_ptr *offsets;
   2346      1.1     skrll   bfd_boolean makemap;
   2347      1.1     skrll   bfd_boolean hasobjects;
   2348  1.1.1.2  christos   file_ptr prevoff, nextoff;
   2349      1.1     skrll   bfd *current_bfd;
   2350      1.1     skrll   size_t i;
   2351      1.1     skrll   struct xcoff_ar_hdr_big *hdr;
   2352  1.1.1.2  christos   bfd_size_type size;
   2353      1.1     skrll   char *member_table, *mt;
   2354      1.1     skrll   bfd_vma member_table_size;
   2355      1.1     skrll   struct archive_iterator iterator;
   2356      1.1     skrll 
   2357      1.1     skrll   memset (&fhdr, 0, SIZEOF_AR_FILE_HDR_BIG);
   2358      1.1     skrll   memcpy (fhdr.magic, XCOFFARMAGBIG, SXCOFFARMAG);
   2359      1.1     skrll 
   2360      1.1     skrll   if (bfd_seek (abfd, (file_ptr) SIZEOF_AR_FILE_HDR_BIG, SEEK_SET) != 0)
   2361      1.1     skrll     return FALSE;
   2362      1.1     skrll 
   2363      1.1     skrll   /* Calculate count and total_namlen.  */
   2364      1.1     skrll   makemap = bfd_has_map (abfd);
   2365      1.1     skrll   hasobjects = FALSE;
   2366      1.1     skrll   for (current_bfd = abfd->archive_head, count = 0, total_namlen = 0;
   2367      1.1     skrll        current_bfd != NULL;
   2368      1.1     skrll        current_bfd = current_bfd->archive_next, count++)
   2369      1.1     skrll     {
   2370      1.1     skrll       total_namlen += strlen (normalize_filename (current_bfd)) + 1;
   2371      1.1     skrll 
   2372      1.1     skrll       if (makemap
   2373      1.1     skrll 	  && ! hasobjects
   2374  1.1.1.2  christos 	  && bfd_check_format (current_bfd, bfd_object))
   2375  1.1.1.2  christos 	hasobjects = TRUE;
   2376  1.1.1.2  christos 
   2377  1.1.1.2  christos       if (current_bfd->arelt_data == NULL)
   2378  1.1.1.2  christos 	{
   2379  1.1.1.2  christos 	  size = sizeof (struct areltdata);
   2380  1.1.1.2  christos 	  current_bfd->arelt_data = bfd_zalloc (current_bfd, size);
   2381      1.1     skrll 	  if (current_bfd->arelt_data == NULL)
   2382  1.1.1.2  christos 	    return FALSE;
   2383      1.1     skrll 	}
   2384  1.1.1.2  christos 
   2385      1.1     skrll       if (arch_xhdr_big (current_bfd) == NULL)
   2386      1.1     skrll 	{
   2387      1.1     skrll 	  struct xcoff_ar_hdr_big *ahdrp;
   2388      1.1     skrll 	  struct stat s;
   2389      1.1     skrll 
   2390      1.1     skrll 	  /* XXX This should actually be a call to stat64 (at least on
   2391      1.1     skrll 	     32-bit machines).
   2392      1.1     skrll 	     XXX This call will fail if the original object is not found.  */
   2393      1.1     skrll 	  if (stat (bfd_get_filename (current_bfd), &s) != 0)
   2394      1.1     skrll 	    {
   2395      1.1     skrll 	      bfd_set_error (bfd_error_system_call);
   2396  1.1.1.2  christos 	      return FALSE;
   2397  1.1.1.2  christos 	    }
   2398  1.1.1.2  christos 
   2399  1.1.1.2  christos 	  ahdrp = bfd_zalloc (current_bfd, sizeof (*ahdrp));
   2400      1.1     skrll 	  if (ahdrp == NULL)
   2401      1.1     skrll 	    return FALSE;
   2402      1.1     skrll 
   2403      1.1     skrll 	  PRINT20 (ahdrp->size, s.st_size);
   2404      1.1     skrll 	  PRINT12 (ahdrp->date, s.st_mtime);
   2405      1.1     skrll 	  PRINT12 (ahdrp->uid,  s.st_uid);
   2406  1.1.1.2  christos 	  PRINT12 (ahdrp->gid,  s.st_gid);
   2407      1.1     skrll 	  PRINT12_OCTAL (ahdrp->mode, s.st_mode);
   2408      1.1     skrll 
   2409  1.1.1.2  christos 	  arch_eltdata (current_bfd)->arch_header = (char *) ahdrp;
   2410      1.1     skrll 	  arch_eltdata (current_bfd)->parsed_size = s.st_size;
   2411  1.1.1.2  christos 	}
   2412  1.1.1.2  christos     }
   2413  1.1.1.2  christos 
   2414  1.1.1.2  christos   offsets = NULL;
   2415  1.1.1.2  christos   if (count)
   2416      1.1     skrll     {
   2417  1.1.1.2  christos       offsets = (file_ptr *) bfd_malloc (count * sizeof (file_ptr));
   2418      1.1     skrll       if (offsets == NULL)
   2419  1.1.1.2  christos 	return FALSE;
   2420  1.1.1.2  christos     }
   2421  1.1.1.2  christos 
   2422  1.1.1.2  christos   prevoff = 0;
   2423  1.1.1.2  christos   for (archive_iterator_begin (&iterator, abfd), i = 0;
   2424  1.1.1.2  christos        archive_iterator_next (&iterator);
   2425  1.1.1.2  christos        i++)
   2426      1.1     skrll     {
   2427  1.1.1.2  christos       bfd_size_type namlen;
   2428  1.1.1.2  christos       struct xcoff_ar_hdr_big *ahdrp;
   2429  1.1.1.2  christos 
   2430  1.1.1.2  christos       ahdrp = arch_xhdr_big (iterator.current.member);
   2431      1.1     skrll       PRINT20 (ahdrp->prevoff, prevoff);
   2432  1.1.1.2  christos       PRINT4 (ahdrp->namlen, iterator.current.namlen);
   2433      1.1     skrll       PRINT20 (ahdrp->nextoff, iterator.next.offset);
   2434      1.1     skrll 
   2435  1.1.1.2  christos       if (!do_pad (abfd, iterator.current.leading_padding))
   2436  1.1.1.2  christos 	return FALSE;
   2437  1.1.1.2  christos 
   2438  1.1.1.2  christos       BFD_ASSERT (iterator.current.offset == bfd_tell (abfd));
   2439  1.1.1.2  christos       namlen = iterator.current.padded_namlen;
   2440  1.1.1.2  christos       if (bfd_bwrite (ahdrp, SIZEOF_AR_HDR_BIG, abfd) != SIZEOF_AR_HDR_BIG
   2441  1.1.1.2  christos 	  || bfd_bwrite (iterator.current.name, namlen, abfd) != namlen
   2442  1.1.1.2  christos 	  || bfd_bwrite (XCOFFARFMAG, SXCOFFARFMAG, abfd) != SXCOFFARFMAG
   2443      1.1     skrll 	  || bfd_seek (iterator.current.member, 0, SEEK_SET) != 0
   2444      1.1     skrll 	  || !do_copy (abfd, iterator.current.member)
   2445  1.1.1.2  christos 	  || !do_pad (abfd, iterator.current.trailing_padding))
   2446  1.1.1.2  christos 	return FALSE;
   2447      1.1     skrll 
   2448      1.1     skrll       offsets[i] = iterator.current.offset;
   2449      1.1     skrll       prevoff = iterator.current.offset;
   2450      1.1     skrll     }
   2451      1.1     skrll 
   2452      1.1     skrll   if (count)
   2453      1.1     skrll     {
   2454      1.1     skrll       PRINT20 (fhdr.firstmemoff, offsets[0]);
   2455      1.1     skrll       PRINT20 (fhdr.lastmemoff, prevoff);
   2456      1.1     skrll     }
   2457      1.1     skrll 
   2458      1.1     skrll   /* Write out the member table.
   2459      1.1     skrll      Layout :
   2460      1.1     skrll 
   2461      1.1     skrll      standard big archive header
   2462      1.1     skrll      0x0000		      ar_size	[0x14]
   2463      1.1     skrll      0x0014		      ar_nxtmem [0x14]
   2464      1.1     skrll      0x0028		      ar_prvmem [0x14]
   2465      1.1     skrll      0x003C		      ar_date	[0x0C]
   2466      1.1     skrll      0x0048		      ar_uid	[0x0C]
   2467      1.1     skrll      0x0054		      ar_gid	[0x0C]
   2468      1.1     skrll      0x0060		      ar_mod	[0x0C]
   2469      1.1     skrll      0x006C		      ar_namelen[0x04]
   2470      1.1     skrll      0x0070		      ar_fmag	[0x02]
   2471      1.1     skrll 
   2472      1.1     skrll      Member table
   2473      1.1     skrll      0x0072		      count	[0x14]
   2474      1.1     skrll      0x0086		      offsets	[0x14 * counts]
   2475      1.1     skrll      0x0086 + 0x14 * counts   names	[??]
   2476  1.1.1.2  christos      ??			      pad to even bytes.
   2477      1.1     skrll    */
   2478      1.1     skrll 
   2479      1.1     skrll   nextoff = iterator.next.offset;
   2480      1.1     skrll   BFD_ASSERT (nextoff == bfd_tell (abfd));
   2481      1.1     skrll 
   2482      1.1     skrll   member_table_size = (SIZEOF_AR_HDR_BIG
   2483      1.1     skrll 		       + SXCOFFARFMAG
   2484      1.1     skrll 		       + XCOFFARMAGBIG_ELEMENT_SIZE
   2485      1.1     skrll 		       + count * XCOFFARMAGBIG_ELEMENT_SIZE
   2486      1.1     skrll 		       + total_namlen);
   2487      1.1     skrll 
   2488      1.1     skrll   member_table_size += member_table_size & 1;
   2489      1.1     skrll   member_table = bfd_zmalloc (member_table_size);
   2490      1.1     skrll   if (member_table == NULL)
   2491      1.1     skrll     return FALSE;
   2492      1.1     skrll 
   2493      1.1     skrll   hdr = (struct xcoff_ar_hdr_big *) member_table;
   2494      1.1     skrll 
   2495      1.1     skrll   PRINT20 (hdr->size, (XCOFFARMAGBIG_ELEMENT_SIZE
   2496      1.1     skrll 		       + count * XCOFFARMAGBIG_ELEMENT_SIZE
   2497      1.1     skrll 		       + total_namlen + (total_namlen & 1)));
   2498      1.1     skrll   if (makemap && hasobjects)
   2499      1.1     skrll     PRINT20 (hdr->nextoff, nextoff + member_table_size);
   2500      1.1     skrll   else
   2501      1.1     skrll     PRINT20 (hdr->nextoff, 0);
   2502      1.1     skrll   PRINT20 (hdr->prevoff, prevoff);
   2503      1.1     skrll   PRINT12 (hdr->date, 0);
   2504      1.1     skrll   PRINT12 (hdr->uid, 0);
   2505      1.1     skrll   PRINT12 (hdr->gid, 0);
   2506      1.1     skrll   PRINT12 (hdr->mode, 0);
   2507      1.1     skrll   PRINT4 (hdr->namlen, 0);
   2508      1.1     skrll 
   2509      1.1     skrll   mt = member_table + SIZEOF_AR_HDR_BIG;
   2510      1.1     skrll   memcpy (mt, XCOFFARFMAG, SXCOFFARFMAG);
   2511      1.1     skrll   mt += SXCOFFARFMAG;
   2512      1.1     skrll 
   2513      1.1     skrll   PRINT20 (mt, count);
   2514      1.1     skrll   mt += XCOFFARMAGBIG_ELEMENT_SIZE;
   2515      1.1     skrll   for (i = 0; i < (size_t) count; i++)
   2516      1.1     skrll     {
   2517      1.1     skrll       PRINT20 (mt, offsets[i]);
   2518      1.1     skrll       mt += XCOFFARMAGBIG_ELEMENT_SIZE;
   2519      1.1     skrll     }
   2520      1.1     skrll 
   2521      1.1     skrll   if (count)
   2522      1.1     skrll     {
   2523      1.1     skrll       free (offsets);
   2524      1.1     skrll       offsets = NULL;
   2525      1.1     skrll     }
   2526      1.1     skrll 
   2527      1.1     skrll   for (current_bfd = abfd->archive_head;
   2528      1.1     skrll        current_bfd != NULL;
   2529      1.1     skrll        current_bfd = current_bfd->archive_next)
   2530      1.1     skrll     {
   2531      1.1     skrll       const char *name;
   2532      1.1     skrll       size_t namlen;
   2533      1.1     skrll 
   2534      1.1     skrll       name = normalize_filename (current_bfd);
   2535      1.1     skrll       namlen = sprintf (mt, "%s", name);
   2536      1.1     skrll       mt += namlen + 1;
   2537      1.1     skrll     }
   2538      1.1     skrll 
   2539      1.1     skrll   if (bfd_bwrite (member_table, member_table_size, abfd) != member_table_size)
   2540      1.1     skrll     return FALSE;
   2541      1.1     skrll 
   2542      1.1     skrll   free (member_table);
   2543      1.1     skrll 
   2544      1.1     skrll   PRINT20 (fhdr.memoff, nextoff);
   2545      1.1     skrll 
   2546      1.1     skrll   prevoff = nextoff;
   2547      1.1     skrll   nextoff += member_table_size;
   2548      1.1     skrll 
   2549      1.1     skrll   /* Write out the armap, if appropriate.  */
   2550      1.1     skrll 
   2551      1.1     skrll   if (! makemap || ! hasobjects)
   2552      1.1     skrll     PRINT20 (fhdr.symoff, 0);
   2553      1.1     skrll   else
   2554      1.1     skrll     {
   2555      1.1     skrll       BFD_ASSERT (nextoff == bfd_tell (abfd));
   2556      1.1     skrll 
   2557      1.1     skrll       /* Save nextoff in fhdr.symoff so the armap routine can use it.  */
   2558      1.1     skrll       PRINT20 (fhdr.symoff, nextoff);
   2559      1.1     skrll 
   2560      1.1     skrll       bfd_ardata (abfd)->tdata = (PTR) &fhdr;
   2561      1.1     skrll       if (! _bfd_compute_and_write_armap (abfd, 0))
   2562      1.1     skrll 	return FALSE;
   2563      1.1     skrll     }
   2564      1.1     skrll 
   2565      1.1     skrll   /* Write out the archive file header.  */
   2566      1.1     skrll 
   2567      1.1     skrll   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
   2568      1.1     skrll       || (bfd_bwrite ((PTR) &fhdr, (bfd_size_type) SIZEOF_AR_FILE_HDR_BIG,
   2569      1.1     skrll 		      abfd) != SIZEOF_AR_FILE_HDR_BIG))
   2570      1.1     skrll     return FALSE;
   2571      1.1     skrll 
   2572      1.1     skrll   return TRUE;
   2573      1.1     skrll }
   2574      1.1     skrll 
   2575      1.1     skrll bfd_boolean
   2576      1.1     skrll _bfd_xcoff_write_archive_contents (abfd)
   2577      1.1     skrll      bfd *abfd;
   2578      1.1     skrll {
   2579      1.1     skrll   if (! xcoff_big_format_p (abfd))
   2580      1.1     skrll     return xcoff_write_archive_contents_old (abfd);
   2581      1.1     skrll   else
   2582      1.1     skrll     return xcoff_write_archive_contents_big (abfd);
   2583      1.1     skrll }
   2584      1.1     skrll 
   2585      1.1     skrll /* We can't use the usual coff_sizeof_headers routine, because AIX
   2587      1.1     skrll    always uses an a.out header.  */
   2588      1.1     skrll 
   2589      1.1     skrll int
   2590      1.1     skrll _bfd_xcoff_sizeof_headers (bfd *abfd,
   2591      1.1     skrll 			   struct bfd_link_info *info ATTRIBUTE_UNUSED)
   2592      1.1     skrll {
   2593      1.1     skrll   int size;
   2594      1.1     skrll 
   2595      1.1     skrll   size = FILHSZ;
   2596      1.1     skrll   if (xcoff_data (abfd)->full_aouthdr)
   2597      1.1     skrll     size += AOUTSZ;
   2598      1.1     skrll   else
   2599      1.1     skrll     size += SMALL_AOUTSZ;
   2600      1.1     skrll   size += abfd->section_count * SCNHSZ;
   2601      1.1     skrll   return size;
   2602      1.1     skrll }
   2603      1.1     skrll 
   2604      1.1     skrll /* Routines to swap information in the XCOFF .loader section.  If we
   2606      1.1     skrll    ever need to write an XCOFF loader, this stuff will need to be
   2607      1.1     skrll    moved to another file shared by the linker (which XCOFF calls the
   2608      1.1     skrll    ``binder'') and the loader.  */
   2609      1.1     skrll 
   2610      1.1     skrll /* Swap in the ldhdr structure.  */
   2611      1.1     skrll 
   2612      1.1     skrll static void
   2613      1.1     skrll xcoff_swap_ldhdr_in (abfd, s, dst)
   2614      1.1     skrll      bfd *abfd;
   2615      1.1     skrll      const PTR s;
   2616      1.1     skrll      struct internal_ldhdr *dst;
   2617      1.1     skrll {
   2618      1.1     skrll   const struct external_ldhdr *src = (const struct external_ldhdr *) s;
   2619      1.1     skrll 
   2620      1.1     skrll   dst->l_version = bfd_get_32 (abfd, src->l_version);
   2621      1.1     skrll   dst->l_nsyms = bfd_get_32 (abfd, src->l_nsyms);
   2622      1.1     skrll   dst->l_nreloc = bfd_get_32 (abfd, src->l_nreloc);
   2623      1.1     skrll   dst->l_istlen = bfd_get_32 (abfd, src->l_istlen);
   2624      1.1     skrll   dst->l_nimpid = bfd_get_32 (abfd, src->l_nimpid);
   2625      1.1     skrll   dst->l_impoff = bfd_get_32 (abfd, src->l_impoff);
   2626      1.1     skrll   dst->l_stlen = bfd_get_32 (abfd, src->l_stlen);
   2627      1.1     skrll   dst->l_stoff = bfd_get_32 (abfd, src->l_stoff);
   2628      1.1     skrll }
   2629      1.1     skrll 
   2630      1.1     skrll /* Swap out the ldhdr structure.  */
   2631      1.1     skrll 
   2632      1.1     skrll static void
   2633      1.1     skrll xcoff_swap_ldhdr_out (abfd, src, d)
   2634      1.1     skrll      bfd *abfd;
   2635      1.1     skrll      const struct internal_ldhdr *src;
   2636      1.1     skrll      PTR d;
   2637      1.1     skrll {
   2638      1.1     skrll   struct external_ldhdr *dst = (struct external_ldhdr *) d;
   2639      1.1     skrll 
   2640      1.1     skrll   bfd_put_32 (abfd, (bfd_vma) src->l_version, dst->l_version);
   2641      1.1     skrll   bfd_put_32 (abfd, src->l_nsyms, dst->l_nsyms);
   2642      1.1     skrll   bfd_put_32 (abfd, src->l_nreloc, dst->l_nreloc);
   2643      1.1     skrll   bfd_put_32 (abfd, src->l_istlen, dst->l_istlen);
   2644      1.1     skrll   bfd_put_32 (abfd, src->l_nimpid, dst->l_nimpid);
   2645      1.1     skrll   bfd_put_32 (abfd, src->l_impoff, dst->l_impoff);
   2646      1.1     skrll   bfd_put_32 (abfd, src->l_stlen, dst->l_stlen);
   2647      1.1     skrll   bfd_put_32 (abfd, src->l_stoff, dst->l_stoff);
   2648      1.1     skrll }
   2649      1.1     skrll 
   2650      1.1     skrll /* Swap in the ldsym structure.  */
   2651      1.1     skrll 
   2652      1.1     skrll static void
   2653      1.1     skrll xcoff_swap_ldsym_in (abfd, s, dst)
   2654      1.1     skrll      bfd *abfd;
   2655      1.1     skrll      const PTR s;
   2656      1.1     skrll      struct internal_ldsym *dst;
   2657      1.1     skrll {
   2658      1.1     skrll   const struct external_ldsym *src = (const struct external_ldsym *) s;
   2659      1.1     skrll 
   2660      1.1     skrll   if (bfd_get_32 (abfd, src->_l._l_l._l_zeroes) != 0) {
   2661      1.1     skrll     memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
   2662      1.1     skrll   } else {
   2663      1.1     skrll     dst->_l._l_l._l_zeroes = 0;
   2664      1.1     skrll     dst->_l._l_l._l_offset = bfd_get_32 (abfd, src->_l._l_l._l_offset);
   2665      1.1     skrll   }
   2666      1.1     skrll   dst->l_value = bfd_get_32 (abfd, src->l_value);
   2667      1.1     skrll   dst->l_scnum = bfd_get_16 (abfd, src->l_scnum);
   2668      1.1     skrll   dst->l_smtype = bfd_get_8 (abfd, src->l_smtype);
   2669      1.1     skrll   dst->l_smclas = bfd_get_8 (abfd, src->l_smclas);
   2670      1.1     skrll   dst->l_ifile = bfd_get_32 (abfd, src->l_ifile);
   2671      1.1     skrll   dst->l_parm = bfd_get_32 (abfd, src->l_parm);
   2672      1.1     skrll }
   2673      1.1     skrll 
   2674      1.1     skrll /* Swap out the ldsym structure.  */
   2675      1.1     skrll 
   2676      1.1     skrll static void
   2677      1.1     skrll xcoff_swap_ldsym_out (abfd, src, d)
   2678      1.1     skrll      bfd *abfd;
   2679      1.1     skrll      const struct internal_ldsym *src;
   2680      1.1     skrll      PTR d;
   2681      1.1     skrll {
   2682      1.1     skrll   struct external_ldsym *dst = (struct external_ldsym *) d;
   2683      1.1     skrll 
   2684      1.1     skrll   if (src->_l._l_l._l_zeroes != 0)
   2685      1.1     skrll     memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
   2686      1.1     skrll   else
   2687      1.1     skrll     {
   2688      1.1     skrll       bfd_put_32 (abfd, (bfd_vma) 0, dst->_l._l_l._l_zeroes);
   2689      1.1     skrll       bfd_put_32 (abfd, (bfd_vma) src->_l._l_l._l_offset,
   2690      1.1     skrll 		  dst->_l._l_l._l_offset);
   2691      1.1     skrll     }
   2692      1.1     skrll   bfd_put_32 (abfd, src->l_value, dst->l_value);
   2693      1.1     skrll   bfd_put_16 (abfd, (bfd_vma) src->l_scnum, dst->l_scnum);
   2694      1.1     skrll   bfd_put_8 (abfd, src->l_smtype, dst->l_smtype);
   2695      1.1     skrll   bfd_put_8 (abfd, src->l_smclas, dst->l_smclas);
   2696      1.1     skrll   bfd_put_32 (abfd, src->l_ifile, dst->l_ifile);
   2697      1.1     skrll   bfd_put_32 (abfd, src->l_parm, dst->l_parm);
   2698      1.1     skrll }
   2699      1.1     skrll 
   2700      1.1     skrll static void
   2701      1.1     skrll xcoff_swap_reloc_in (abfd, s, d)
   2702      1.1     skrll      bfd *abfd;
   2703      1.1     skrll      PTR s;
   2704      1.1     skrll      PTR d;
   2705      1.1     skrll {
   2706      1.1     skrll   struct external_reloc *src = (struct external_reloc *) s;
   2707      1.1     skrll   struct internal_reloc *dst = (struct internal_reloc *) d;
   2708      1.1     skrll 
   2709      1.1     skrll   memset (dst, 0, sizeof (struct internal_reloc));
   2710      1.1     skrll 
   2711      1.1     skrll   dst->r_vaddr = bfd_get_32 (abfd, src->r_vaddr);
   2712      1.1     skrll   dst->r_symndx = bfd_get_32 (abfd, src->r_symndx);
   2713      1.1     skrll   dst->r_size = bfd_get_8 (abfd, src->r_size);
   2714      1.1     skrll   dst->r_type = bfd_get_8 (abfd, src->r_type);
   2715      1.1     skrll }
   2716      1.1     skrll 
   2717      1.1     skrll static unsigned int
   2718      1.1     skrll xcoff_swap_reloc_out (abfd, s, d)
   2719      1.1     skrll      bfd *abfd;
   2720      1.1     skrll      PTR s;
   2721      1.1     skrll      PTR d;
   2722      1.1     skrll {
   2723      1.1     skrll   struct internal_reloc *src = (struct internal_reloc *) s;
   2724      1.1     skrll   struct external_reloc *dst = (struct external_reloc *) d;
   2725      1.1     skrll 
   2726      1.1     skrll   bfd_put_32 (abfd, src->r_vaddr, dst->r_vaddr);
   2727      1.1     skrll   bfd_put_32 (abfd, src->r_symndx, dst->r_symndx);
   2728      1.1     skrll   bfd_put_8 (abfd, src->r_type, dst->r_type);
   2729      1.1     skrll   bfd_put_8 (abfd, src->r_size, dst->r_size);
   2730      1.1     skrll 
   2731      1.1     skrll   return bfd_coff_relsz (abfd);
   2732      1.1     skrll }
   2733      1.1     skrll 
   2734      1.1     skrll /* Swap in the ldrel structure.  */
   2735      1.1     skrll 
   2736      1.1     skrll static void
   2737      1.1     skrll xcoff_swap_ldrel_in (abfd, s, dst)
   2738      1.1     skrll      bfd *abfd;
   2739      1.1     skrll      const PTR s;
   2740      1.1     skrll      struct internal_ldrel *dst;
   2741      1.1     skrll {
   2742      1.1     skrll   const struct external_ldrel *src = (const struct external_ldrel *) s;
   2743      1.1     skrll 
   2744      1.1     skrll   dst->l_vaddr = bfd_get_32 (abfd, src->l_vaddr);
   2745      1.1     skrll   dst->l_symndx = bfd_get_32 (abfd, src->l_symndx);
   2746      1.1     skrll   dst->l_rtype = bfd_get_16 (abfd, src->l_rtype);
   2747      1.1     skrll   dst->l_rsecnm = bfd_get_16 (abfd, src->l_rsecnm);
   2748      1.1     skrll }
   2749      1.1     skrll 
   2750      1.1     skrll /* Swap out the ldrel structure.  */
   2751      1.1     skrll 
   2752      1.1     skrll static void
   2753      1.1     skrll xcoff_swap_ldrel_out (abfd, src, d)
   2754      1.1     skrll      bfd *abfd;
   2755      1.1     skrll      const struct internal_ldrel *src;
   2756      1.1     skrll      PTR d;
   2757      1.1     skrll {
   2758      1.1     skrll   struct external_ldrel *dst = (struct external_ldrel *) d;
   2759      1.1     skrll 
   2760      1.1     skrll   bfd_put_32 (abfd, src->l_vaddr, dst->l_vaddr);
   2761      1.1     skrll   bfd_put_32 (abfd, src->l_symndx, dst->l_symndx);
   2762      1.1     skrll   bfd_put_16 (abfd, (bfd_vma) src->l_rtype, dst->l_rtype);
   2763      1.1     skrll   bfd_put_16 (abfd, (bfd_vma) src->l_rsecnm, dst->l_rsecnm);
   2764      1.1     skrll }
   2765      1.1     skrll 
   2766      1.1     skrll 
   2768      1.1     skrll bfd_boolean
   2769      1.1     skrll xcoff_reloc_type_noop (input_bfd, input_section, output_bfd, rel, sym, howto,
   2770      1.1     skrll 		       val, addend, relocation, contents)
   2771      1.1     skrll      bfd *input_bfd ATTRIBUTE_UNUSED;
   2772      1.1     skrll      asection *input_section ATTRIBUTE_UNUSED;
   2773      1.1     skrll      bfd *output_bfd ATTRIBUTE_UNUSED;
   2774      1.1     skrll      struct internal_reloc *rel ATTRIBUTE_UNUSED;
   2775      1.1     skrll      struct internal_syment *sym ATTRIBUTE_UNUSED;
   2776      1.1     skrll      struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
   2777      1.1     skrll      bfd_vma val ATTRIBUTE_UNUSED;
   2778      1.1     skrll      bfd_vma addend ATTRIBUTE_UNUSED;
   2779      1.1     skrll      bfd_vma *relocation ATTRIBUTE_UNUSED;
   2780      1.1     skrll      bfd_byte *contents ATTRIBUTE_UNUSED;
   2781      1.1     skrll {
   2782      1.1     skrll   return TRUE;
   2783      1.1     skrll }
   2784      1.1     skrll 
   2785      1.1     skrll bfd_boolean
   2786      1.1     skrll xcoff_reloc_type_fail (input_bfd, input_section, output_bfd, rel, sym, howto,
   2787      1.1     skrll 		       val, addend, relocation, contents)
   2788      1.1     skrll      bfd *input_bfd;
   2789      1.1     skrll      asection *input_section ATTRIBUTE_UNUSED;
   2790      1.1     skrll      bfd *output_bfd ATTRIBUTE_UNUSED;
   2791      1.1     skrll      struct internal_reloc *rel;
   2792      1.1     skrll      struct internal_syment *sym ATTRIBUTE_UNUSED;
   2793      1.1     skrll      struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
   2794      1.1     skrll      bfd_vma val ATTRIBUTE_UNUSED;
   2795      1.1     skrll      bfd_vma addend ATTRIBUTE_UNUSED;
   2796      1.1     skrll      bfd_vma *relocation ATTRIBUTE_UNUSED;
   2797      1.1     skrll      bfd_byte *contents ATTRIBUTE_UNUSED;
   2798      1.1     skrll {
   2799      1.1     skrll   (*_bfd_error_handler)
   2800      1.1     skrll     (_("%s: unsupported relocation type 0x%02x"),
   2801      1.1     skrll      bfd_get_filename (input_bfd), (unsigned int) rel->r_type);
   2802      1.1     skrll   bfd_set_error (bfd_error_bad_value);
   2803      1.1     skrll   return FALSE;
   2804      1.1     skrll }
   2805      1.1     skrll 
   2806      1.1     skrll bfd_boolean
   2807      1.1     skrll xcoff_reloc_type_pos (input_bfd, input_section, output_bfd, rel, sym, howto,
   2808      1.1     skrll 		      val, addend, relocation, contents)
   2809      1.1     skrll      bfd *input_bfd ATTRIBUTE_UNUSED;
   2810      1.1     skrll      asection *input_section ATTRIBUTE_UNUSED;
   2811      1.1     skrll      bfd *output_bfd ATTRIBUTE_UNUSED;
   2812      1.1     skrll      struct internal_reloc *rel ATTRIBUTE_UNUSED;
   2813      1.1     skrll      struct internal_syment *sym ATTRIBUTE_UNUSED;
   2814      1.1     skrll      struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
   2815      1.1     skrll      bfd_vma val;
   2816      1.1     skrll      bfd_vma addend;
   2817      1.1     skrll      bfd_vma *relocation;
   2818      1.1     skrll      bfd_byte *contents ATTRIBUTE_UNUSED;
   2819      1.1     skrll {
   2820      1.1     skrll   *relocation = val + addend;
   2821      1.1     skrll   return TRUE;
   2822      1.1     skrll }
   2823      1.1     skrll 
   2824      1.1     skrll bfd_boolean
   2825      1.1     skrll xcoff_reloc_type_neg (input_bfd, input_section, output_bfd, rel, sym, howto,
   2826      1.1     skrll 		      val, addend, relocation, contents)
   2827      1.1     skrll      bfd *input_bfd ATTRIBUTE_UNUSED;
   2828      1.1     skrll      asection *input_section ATTRIBUTE_UNUSED;
   2829      1.1     skrll      bfd *output_bfd ATTRIBUTE_UNUSED;
   2830      1.1     skrll      struct internal_reloc *rel ATTRIBUTE_UNUSED;
   2831      1.1     skrll      struct internal_syment *sym ATTRIBUTE_UNUSED;
   2832      1.1     skrll      struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
   2833      1.1     skrll      bfd_vma val;
   2834      1.1     skrll      bfd_vma addend;
   2835      1.1     skrll      bfd_vma *relocation;
   2836      1.1     skrll      bfd_byte *contents ATTRIBUTE_UNUSED;
   2837      1.1     skrll {
   2838      1.1     skrll   *relocation = addend - val;
   2839      1.1     skrll   return TRUE;
   2840      1.1     skrll }
   2841      1.1     skrll 
   2842      1.1     skrll bfd_boolean
   2843      1.1     skrll xcoff_reloc_type_rel (input_bfd, input_section, output_bfd, rel, sym, howto,
   2844      1.1     skrll 		      val, addend, relocation, contents)
   2845      1.1     skrll      bfd *input_bfd ATTRIBUTE_UNUSED;
   2846      1.1     skrll      asection *input_section;
   2847      1.1     skrll      bfd *output_bfd ATTRIBUTE_UNUSED;
   2848      1.1     skrll      struct internal_reloc *rel ATTRIBUTE_UNUSED;
   2849      1.1     skrll      struct internal_syment *sym ATTRIBUTE_UNUSED;
   2850      1.1     skrll      struct reloc_howto_struct *howto;
   2851      1.1     skrll      bfd_vma val;
   2852      1.1     skrll      bfd_vma addend;
   2853      1.1     skrll      bfd_vma *relocation;
   2854      1.1     skrll      bfd_byte *contents ATTRIBUTE_UNUSED;
   2855      1.1     skrll {
   2856      1.1     skrll   howto->pc_relative = TRUE;
   2857      1.1     skrll 
   2858      1.1     skrll   /* A PC relative reloc includes the section address.  */
   2859      1.1     skrll   addend += input_section->vma;
   2860      1.1     skrll 
   2861      1.1     skrll   *relocation = val + addend;
   2862      1.1     skrll   *relocation -= (input_section->output_section->vma
   2863      1.1     skrll 		  + input_section->output_offset);
   2864      1.1     skrll   return TRUE;
   2865      1.1     skrll }
   2866      1.1     skrll 
   2867      1.1     skrll bfd_boolean
   2868      1.1     skrll xcoff_reloc_type_toc (input_bfd, input_section, output_bfd, rel, sym, howto,
   2869      1.1     skrll 		      val, addend, relocation, contents)
   2870      1.1     skrll      bfd *input_bfd;
   2871      1.1     skrll      asection *input_section ATTRIBUTE_UNUSED;
   2872      1.1     skrll      bfd *output_bfd;
   2873      1.1     skrll      struct internal_reloc *rel;
   2874      1.1     skrll      struct internal_syment *sym;
   2875      1.1     skrll      struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
   2876      1.1     skrll      bfd_vma val;
   2877      1.1     skrll      bfd_vma addend ATTRIBUTE_UNUSED;
   2878      1.1     skrll      bfd_vma *relocation;
   2879      1.1     skrll      bfd_byte *contents ATTRIBUTE_UNUSED;
   2880      1.1     skrll {
   2881      1.1     skrll   struct xcoff_link_hash_entry *h;
   2882      1.1     skrll 
   2883      1.1     skrll   if (0 > rel->r_symndx)
   2884      1.1     skrll     return FALSE;
   2885      1.1     skrll 
   2886      1.1     skrll   h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
   2887      1.1     skrll 
   2888      1.1     skrll   if (h != NULL && h->smclas != XMC_TD)
   2889      1.1     skrll     {
   2890      1.1     skrll       if (h->toc_section == NULL)
   2891      1.1     skrll 	{
   2892      1.1     skrll 	  (*_bfd_error_handler)
   2893      1.1     skrll 	    (_("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry"),
   2894      1.1     skrll 	     bfd_get_filename (input_bfd), rel->r_vaddr,
   2895      1.1     skrll 	     h->root.root.string);
   2896      1.1     skrll 	  bfd_set_error (bfd_error_bad_value);
   2897      1.1     skrll 	  return FALSE;
   2898      1.1     skrll 	}
   2899      1.1     skrll 
   2900      1.1     skrll       BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0);
   2901      1.1     skrll       val = (h->toc_section->output_section->vma
   2902      1.1     skrll 	      + h->toc_section->output_offset);
   2903      1.1     skrll     }
   2904      1.1     skrll 
   2905      1.1     skrll   *relocation = ((val - xcoff_data (output_bfd)->toc)
   2906      1.1     skrll 		 - (sym->n_value - xcoff_data (input_bfd)->toc));
   2907      1.1     skrll   return TRUE;
   2908      1.1     skrll }
   2909      1.1     skrll 
   2910      1.1     skrll bfd_boolean
   2911      1.1     skrll xcoff_reloc_type_ba (input_bfd, input_section, output_bfd, rel, sym, howto,
   2912      1.1     skrll 		     val, addend, relocation, contents)
   2913      1.1     skrll      bfd *input_bfd ATTRIBUTE_UNUSED;
   2914      1.1     skrll      asection *input_section ATTRIBUTE_UNUSED;
   2915      1.1     skrll      bfd *output_bfd ATTRIBUTE_UNUSED;
   2916      1.1     skrll      struct internal_reloc *rel ATTRIBUTE_UNUSED;
   2917      1.1     skrll      struct internal_syment *sym ATTRIBUTE_UNUSED;
   2918      1.1     skrll      struct reloc_howto_struct *howto;
   2919      1.1     skrll      bfd_vma val;
   2920      1.1     skrll      bfd_vma addend;
   2921      1.1     skrll      bfd_vma *relocation;
   2922      1.1     skrll      bfd_byte *contents ATTRIBUTE_UNUSED;
   2923      1.1     skrll {
   2924      1.1     skrll   howto->src_mask &= ~3;
   2925      1.1     skrll   howto->dst_mask = howto->src_mask;
   2926      1.1     skrll 
   2927      1.1     skrll   *relocation = val + addend;
   2928      1.1     skrll 
   2929      1.1     skrll   return TRUE;
   2930      1.1     skrll }
   2931      1.1     skrll 
   2932      1.1     skrll static bfd_boolean
   2933      1.1     skrll xcoff_reloc_type_br (input_bfd, input_section, output_bfd, rel, sym, howto,
   2934      1.1     skrll 		     val, addend, relocation, contents)
   2935      1.1     skrll      bfd *input_bfd;
   2936      1.1     skrll      asection *input_section;
   2937      1.1     skrll      bfd *output_bfd ATTRIBUTE_UNUSED;
   2938      1.1     skrll      struct internal_reloc *rel;
   2939      1.1     skrll      struct internal_syment *sym ATTRIBUTE_UNUSED;
   2940      1.1     skrll      struct reloc_howto_struct *howto;
   2941  1.1.1.2  christos      bfd_vma val;
   2942      1.1     skrll      bfd_vma addend;
   2943      1.1     skrll      bfd_vma *relocation;
   2944      1.1     skrll      bfd_byte *contents;
   2945      1.1     skrll {
   2946      1.1     skrll   struct xcoff_link_hash_entry *h;
   2947  1.1.1.2  christos   bfd_vma section_offset;
   2948      1.1     skrll 
   2949      1.1     skrll   if (0 > rel->r_symndx)
   2950      1.1     skrll     return FALSE;
   2951      1.1     skrll 
   2952      1.1     skrll   h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
   2953      1.1     skrll   section_offset = rel->r_vaddr - input_section->vma;
   2954      1.1     skrll 
   2955      1.1     skrll   /* If we see an R_BR or R_RBR reloc which is jumping to global
   2956      1.1     skrll      linkage code, and it is followed by an appropriate cror nop
   2957  1.1.1.2  christos      instruction, we replace the cror with lwz r2,20(r1).  This
   2958  1.1.1.2  christos      restores the TOC after the glink code.  Contrariwise, if the
   2959  1.1.1.2  christos      call is followed by a lwz r2,20(r1), but the call is not
   2960      1.1     skrll      going to global linkage code, we can replace the load with a
   2961      1.1     skrll      cror.  */
   2962      1.1     skrll   if (NULL != h
   2963      1.1     skrll       && (bfd_link_hash_defined == h->root.type
   2964  1.1.1.2  christos 	  || bfd_link_hash_defweak == h->root.type)
   2965      1.1     skrll       && section_offset + 8 <= input_section->size)
   2966      1.1     skrll     {
   2967      1.1     skrll       bfd_byte *pnext;
   2968      1.1     skrll       unsigned long next;
   2969      1.1     skrll 
   2970      1.1     skrll       pnext = contents + section_offset + 4;
   2971      1.1     skrll       next = bfd_get_32 (input_bfd, pnext);
   2972      1.1     skrll 
   2973      1.1     skrll       /* The _ptrgl function is magic.  It is used by the AIX
   2974  1.1.1.2  christos 	 compiler to call a function through a pointer.  */
   2975      1.1     skrll       if (h->smclas == XMC_GL || strcmp (h->root.root.string, "._ptrgl") == 0)
   2976      1.1     skrll 	{
   2977      1.1     skrll 	  if (next == 0x4def7b82			/* cror 15,15,15 */
   2978      1.1     skrll 	      || next == 0x4ffffb82			/* cror 31,31,31 */
   2979  1.1.1.2  christos 	      || next == 0x60000000)			/* ori r0,r0,0 */
   2980      1.1     skrll 	    bfd_put_32 (input_bfd, 0x80410014, pnext);	/* lwz r2,20(r1) */
   2981      1.1     skrll 
   2982      1.1     skrll 	}
   2983      1.1     skrll       else
   2984      1.1     skrll 	{
   2985      1.1     skrll 	  if (next == 0x80410014)			/* lwz r2,20(r1) */
   2986      1.1     skrll 	    bfd_put_32 (input_bfd, 0x60000000, pnext);	/* ori r0,r0,0 */
   2987      1.1     skrll 	}
   2988      1.1     skrll     }
   2989      1.1     skrll   else if (NULL != h && bfd_link_hash_undefined == h->root.type)
   2990      1.1     skrll     {
   2991      1.1     skrll       /* Normally, this relocation is against a defined symbol.  In the
   2992      1.1     skrll 	 case where this is a partial link and the output section offset
   2993      1.1     skrll 	 is greater than 2^25, the linker will return an invalid error
   2994      1.1     skrll 	 message that the relocation has been truncated.  Yes it has been
   2995  1.1.1.2  christos 	 truncated but no it not important.  For this case, disable the
   2996  1.1.1.2  christos 	 overflow checking. */
   2997  1.1.1.2  christos 
   2998  1.1.1.2  christos       howto->complain_on_overflow = complain_overflow_dont;
   2999      1.1     skrll     }
   3000      1.1     skrll 
   3001      1.1     skrll   /* The original PC-relative relocation is biased by -r_vaddr, so adding
   3002  1.1.1.2  christos      the value below will give the absolute target address.  */
   3003  1.1.1.2  christos   *relocation = val + addend + rel->r_vaddr;
   3004  1.1.1.2  christos 
   3005  1.1.1.2  christos   howto->src_mask &= ~3;
   3006  1.1.1.2  christos   howto->dst_mask = howto->src_mask;
   3007  1.1.1.2  christos 
   3008  1.1.1.2  christos   if (h != NULL
   3009  1.1.1.2  christos       && (h->root.type == bfd_link_hash_defined
   3010  1.1.1.2  christos 	  || h->root.type == bfd_link_hash_defweak)
   3011  1.1.1.2  christos       && bfd_is_abs_section (h->root.u.def.section)
   3012  1.1.1.2  christos       && section_offset + 4 <= input_section->size)
   3013  1.1.1.2  christos     {
   3014  1.1.1.2  christos       bfd_byte *ptr;
   3015  1.1.1.2  christos       bfd_vma insn;
   3016  1.1.1.2  christos 
   3017  1.1.1.2  christos       /* Turn the relative branch into an absolute one by setting the
   3018  1.1.1.2  christos 	 AA bit.  */
   3019  1.1.1.2  christos       ptr = contents + section_offset;
   3020  1.1.1.2  christos       insn = bfd_get_32 (input_bfd, ptr);
   3021  1.1.1.2  christos       insn |= 2;
   3022  1.1.1.2  christos       bfd_put_32 (input_bfd, insn, ptr);
   3023  1.1.1.2  christos 
   3024  1.1.1.2  christos       /* Make the howto absolute too.  */
   3025  1.1.1.2  christos       howto->pc_relative = FALSE;
   3026  1.1.1.2  christos       howto->complain_on_overflow = complain_overflow_bitfield;
   3027  1.1.1.2  christos     }
   3028  1.1.1.2  christos   else
   3029  1.1.1.2  christos     {
   3030  1.1.1.2  christos       /* Use a PC-relative howto and subtract the instruction's address
   3031      1.1     skrll 	 from the target address we calculated above.  */
   3032      1.1     skrll       howto->pc_relative = TRUE;
   3033      1.1     skrll       *relocation -= (input_section->output_section->vma
   3034      1.1     skrll 		      + input_section->output_offset
   3035      1.1     skrll 		      + section_offset);
   3036      1.1     skrll     }
   3037      1.1     skrll   return TRUE;
   3038      1.1     skrll }
   3039      1.1     skrll 
   3040      1.1     skrll bfd_boolean
   3041      1.1     skrll xcoff_reloc_type_crel (input_bfd, input_section, output_bfd, rel, sym, howto,
   3042      1.1     skrll 		       val, addend, relocation, contents)
   3043      1.1     skrll      bfd *input_bfd ATTRIBUTE_UNUSED;
   3044      1.1     skrll      asection *input_section;
   3045      1.1     skrll      bfd *output_bfd ATTRIBUTE_UNUSED;
   3046      1.1     skrll      struct internal_reloc *rel ATTRIBUTE_UNUSED;
   3047      1.1     skrll      struct internal_syment *sym ATTRIBUTE_UNUSED;
   3048      1.1     skrll      struct reloc_howto_struct *howto;
   3049      1.1     skrll      bfd_vma val ATTRIBUTE_UNUSED;
   3050      1.1     skrll      bfd_vma addend;
   3051      1.1     skrll      bfd_vma *relocation;
   3052      1.1     skrll      bfd_byte *contents ATTRIBUTE_UNUSED;
   3053      1.1     skrll {
   3054      1.1     skrll   howto->pc_relative = TRUE;
   3055      1.1     skrll   howto->src_mask &= ~3;
   3056      1.1     skrll   howto->dst_mask = howto->src_mask;
   3057      1.1     skrll 
   3058      1.1     skrll   /* A PC relative reloc includes the section address.  */
   3059      1.1     skrll   addend += input_section->vma;
   3060      1.1     skrll 
   3061      1.1     skrll   *relocation = val + addend;
   3062      1.1     skrll   *relocation -= (input_section->output_section->vma
   3063      1.1     skrll 		  + input_section->output_offset);
   3064      1.1     skrll   return TRUE;
   3065      1.1     skrll }
   3066      1.1     skrll 
   3067      1.1     skrll static bfd_boolean
   3068      1.1     skrll xcoff_complain_overflow_dont_func (input_bfd, val, relocation, howto)
   3069      1.1     skrll      bfd *input_bfd ATTRIBUTE_UNUSED;
   3070      1.1     skrll      bfd_vma val ATTRIBUTE_UNUSED;
   3071      1.1     skrll      bfd_vma relocation ATTRIBUTE_UNUSED;
   3072      1.1     skrll      struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
   3073      1.1     skrll {
   3074      1.1     skrll   return FALSE;
   3075      1.1     skrll }
   3076      1.1     skrll 
   3077      1.1     skrll static bfd_boolean
   3078  1.1.1.2  christos xcoff_complain_overflow_bitfield_func (input_bfd, val, relocation, howto)
   3079      1.1     skrll      bfd *input_bfd;
   3080      1.1     skrll      bfd_vma val;
   3081      1.1     skrll      bfd_vma relocation;
   3082      1.1     skrll      struct reloc_howto_struct *howto;
   3083      1.1     skrll {
   3084      1.1     skrll   bfd_vma fieldmask, signmask, ss;
   3085      1.1     skrll   bfd_vma a, b, sum;
   3086      1.1     skrll 
   3087      1.1     skrll   /* Get the values to be added together.  For signed and unsigned
   3088      1.1     skrll      relocations, we assume that all values should be truncated to
   3089      1.1     skrll      the size of an address.  For bitfields, all the bits matter.
   3090      1.1     skrll      See also bfd_check_overflow.  */
   3091      1.1     skrll   fieldmask = N_ONES (howto->bitsize);
   3092      1.1     skrll   a = relocation;
   3093      1.1     skrll   b = val & howto->src_mask;
   3094      1.1     skrll 
   3095      1.1     skrll   /* Much like unsigned, except no trimming with addrmask.  In
   3096      1.1     skrll      addition, the sum overflows if there is a carry out of
   3097      1.1     skrll      the bfd_vma, i.e., the sum is less than either input
   3098      1.1     skrll      operand.  */
   3099      1.1     skrll   a >>= howto->rightshift;
   3100      1.1     skrll   b >>= howto->bitpos;
   3101      1.1     skrll 
   3102      1.1     skrll   /* Bitfields are sometimes used for signed numbers; for
   3103      1.1     skrll      example, a 13-bit field sometimes represents values in
   3104      1.1     skrll      0..8191 and sometimes represents values in -4096..4095.
   3105      1.1     skrll      If the field is signed and a is -4095 (0x1001) and b is
   3106      1.1     skrll      -1 (0x1fff), the sum is -4096 (0x1000), but (0x1001 +
   3107      1.1     skrll      0x1fff is 0x3000).  It's not clear how to handle this
   3108      1.1     skrll      everywhere, since there is not way to know how many bits
   3109      1.1     skrll      are significant in the relocation, but the original code
   3110      1.1     skrll      assumed that it was fully sign extended, and we will keep
   3111      1.1     skrll      that assumption.  */
   3112      1.1     skrll   signmask = (fieldmask >> 1) + 1;
   3113      1.1     skrll 
   3114      1.1     skrll   if ((a & ~ fieldmask) != 0)
   3115      1.1     skrll     {
   3116      1.1     skrll       /* Some bits out of the field are set.  This might not
   3117      1.1     skrll 	 be a problem: if this is a signed bitfield, it is OK
   3118      1.1     skrll 	 iff all the high bits are set, including the sign
   3119      1.1     skrll 	 bit.  We'll try setting all but the most significant
   3120      1.1     skrll 	 bit in the original relocation value: if this is all
   3121      1.1     skrll 	 ones, we are OK, assuming a signed bitfield.  */
   3122      1.1     skrll       ss = (signmask << howto->rightshift) - 1;
   3123      1.1     skrll       if ((ss | relocation) != ~ (bfd_vma) 0)
   3124      1.1     skrll 	return TRUE;
   3125      1.1     skrll       a &= fieldmask;
   3126      1.1     skrll     }
   3127      1.1     skrll 
   3128      1.1     skrll   /* We just assume (b & ~ fieldmask) == 0.  */
   3129      1.1     skrll 
   3130      1.1     skrll   /* We explicitly permit wrap around if this relocation
   3131      1.1     skrll      covers the high bit of an address.  The Linux kernel
   3132      1.1     skrll      relies on it, and it is the only way to write assembler
   3133      1.1     skrll      code which can run when loaded at a location 0x80000000
   3134      1.1     skrll      away from the location at which it is linked.  */
   3135      1.1     skrll   if (howto->bitsize + howto->rightshift
   3136      1.1     skrll       == bfd_arch_bits_per_address (input_bfd))
   3137      1.1     skrll     return FALSE;
   3138      1.1     skrll 
   3139      1.1     skrll   sum = a + b;
   3140      1.1     skrll   if (sum < a || (sum & ~ fieldmask) != 0)
   3141      1.1     skrll     {
   3142      1.1     skrll       /* There was a carry out, or the field overflow.  Test
   3143      1.1     skrll 	 for signed operands again.  Here is the overflow test
   3144      1.1     skrll 	 is as for complain_overflow_signed.  */
   3145      1.1     skrll       if (((~ (a ^ b)) & (a ^ sum)) & signmask)
   3146      1.1     skrll 	return TRUE;
   3147      1.1     skrll     }
   3148      1.1     skrll 
   3149      1.1     skrll   return FALSE;
   3150      1.1     skrll }
   3151      1.1     skrll 
   3152      1.1     skrll static bfd_boolean
   3153      1.1     skrll xcoff_complain_overflow_signed_func (input_bfd, val, relocation, howto)
   3154      1.1     skrll      bfd *input_bfd;
   3155      1.1     skrll      bfd_vma val;
   3156      1.1     skrll      bfd_vma relocation;
   3157      1.1     skrll      struct reloc_howto_struct *howto;
   3158      1.1     skrll {
   3159      1.1     skrll   bfd_vma addrmask, fieldmask, signmask, ss;
   3160      1.1     skrll   bfd_vma a, b, sum;
   3161      1.1     skrll 
   3162      1.1     skrll   /* Get the values to be added together.  For signed and unsigned
   3163      1.1     skrll      relocations, we assume that all values should be truncated to
   3164      1.1     skrll      the size of an address.  For bitfields, all the bits matter.
   3165      1.1     skrll      See also bfd_check_overflow.  */
   3166      1.1     skrll   fieldmask = N_ONES (howto->bitsize);
   3167      1.1     skrll   addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
   3168      1.1     skrll   a = relocation;
   3169      1.1     skrll   b = val & howto->src_mask;
   3170      1.1     skrll 
   3171      1.1     skrll   a = (a & addrmask) >> howto->rightshift;
   3172      1.1     skrll 
   3173      1.1     skrll   /* If any sign bits are set, all sign bits must be set.
   3174      1.1     skrll      That is, A must be a valid negative address after
   3175      1.1     skrll      shifting.  */
   3176      1.1     skrll   signmask = ~ (fieldmask >> 1);
   3177      1.1     skrll   ss = a & signmask;
   3178      1.1     skrll   if (ss != 0 && ss != ((addrmask >> howto->rightshift) & signmask))
   3179      1.1     skrll     return TRUE;
   3180      1.1     skrll 
   3181      1.1     skrll   /* We only need this next bit of code if the sign bit of B
   3182      1.1     skrll      is below the sign bit of A.  This would only happen if
   3183      1.1     skrll      SRC_MASK had fewer bits than BITSIZE.  Note that if
   3184      1.1     skrll      SRC_MASK has more bits than BITSIZE, we can get into
   3185      1.1     skrll      trouble; we would need to verify that B is in range, as
   3186      1.1     skrll      we do for A above.  */
   3187      1.1     skrll   signmask = ((~ howto->src_mask) >> 1) & howto->src_mask;
   3188      1.1     skrll   if ((b & signmask) != 0)
   3189      1.1     skrll     {
   3190      1.1     skrll       /* Set all the bits above the sign bit.  */
   3191      1.1     skrll       b -= signmask <<= 1;
   3192      1.1     skrll     }
   3193      1.1     skrll 
   3194      1.1     skrll   b = (b & addrmask) >> howto->bitpos;
   3195      1.1     skrll 
   3196      1.1     skrll   /* Now we can do the addition.  */
   3197      1.1     skrll   sum = a + b;
   3198      1.1     skrll 
   3199      1.1     skrll   /* See if the result has the correct sign.  Bits above the
   3200      1.1     skrll      sign bit are junk now; ignore them.  If the sum is
   3201      1.1     skrll      positive, make sure we did not have all negative inputs;
   3202      1.1     skrll      if the sum is negative, make sure we did not have all
   3203      1.1     skrll      positive inputs.  The test below looks only at the sign
   3204      1.1     skrll      bits, and it really just
   3205      1.1     skrll      SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
   3206      1.1     skrll   */
   3207      1.1     skrll   signmask = (fieldmask >> 1) + 1;
   3208      1.1     skrll   if (((~ (a ^ b)) & (a ^ sum)) & signmask)
   3209      1.1     skrll     return TRUE;
   3210      1.1     skrll 
   3211      1.1     skrll   return FALSE;
   3212      1.1     skrll }
   3213      1.1     skrll 
   3214      1.1     skrll static bfd_boolean
   3215      1.1     skrll xcoff_complain_overflow_unsigned_func (input_bfd, val, relocation, howto)
   3216      1.1     skrll      bfd *input_bfd;
   3217      1.1     skrll      bfd_vma val;
   3218      1.1     skrll      bfd_vma relocation;
   3219      1.1     skrll      struct reloc_howto_struct *howto;
   3220      1.1     skrll {
   3221      1.1     skrll   bfd_vma addrmask, fieldmask;
   3222      1.1     skrll   bfd_vma a, b, sum;
   3223      1.1     skrll 
   3224      1.1     skrll   /* Get the values to be added together.  For signed and unsigned
   3225      1.1     skrll      relocations, we assume that all values should be truncated to
   3226      1.1     skrll      the size of an address.  For bitfields, all the bits matter.
   3227      1.1     skrll      See also bfd_check_overflow.  */
   3228      1.1     skrll   fieldmask = N_ONES (howto->bitsize);
   3229      1.1     skrll   addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
   3230      1.1     skrll   a = relocation;
   3231      1.1     skrll   b = val & howto->src_mask;
   3232      1.1     skrll 
   3233      1.1     skrll   /* Checking for an unsigned overflow is relatively easy:
   3234      1.1     skrll      trim the addresses and add, and trim the result as well.
   3235      1.1     skrll      Overflow is normally indicated when the result does not
   3236      1.1     skrll      fit in the field.  However, we also need to consider the
   3237      1.1     skrll      case when, e.g., fieldmask is 0x7fffffff or smaller, an
   3238      1.1     skrll      input is 0x80000000, and bfd_vma is only 32 bits; then we
   3239      1.1     skrll      will get sum == 0, but there is an overflow, since the
   3240      1.1     skrll      inputs did not fit in the field.  Instead of doing a
   3241      1.1     skrll      separate test, we can check for this by or-ing in the
   3242      1.1     skrll      operands when testing for the sum overflowing its final
   3243      1.1     skrll      field.  */
   3244      1.1     skrll   a = (a & addrmask) >> howto->rightshift;
   3245      1.1     skrll   b = (b & addrmask) >> howto->bitpos;
   3246      1.1     skrll   sum = (a + b) & addrmask;
   3247      1.1     skrll   if ((a | b | sum) & ~ fieldmask)
   3248      1.1     skrll     return TRUE;
   3249      1.1     skrll 
   3250      1.1     skrll   return FALSE;
   3251      1.1     skrll }
   3252      1.1     skrll 
   3253      1.1     skrll /* This is the relocation function for the RS/6000/POWER/PowerPC.
   3254      1.1     skrll    This is currently the only processor which uses XCOFF; I hope that
   3255      1.1     skrll    will never change.
   3256      1.1     skrll 
   3257      1.1     skrll    I took the relocation type definitions from two documents:
   3258      1.1     skrll    the PowerPC AIX Version 4 Application Binary Interface, First
   3259      1.1     skrll    Edition (April 1992), and the PowerOpen ABI, Big-Endian
   3260      1.1     skrll    32-Bit Hardware Implementation (June 30, 1994).  Differences
   3261      1.1     skrll    between the documents are noted below.
   3262      1.1     skrll 
   3263      1.1     skrll    Unsupported r_type's
   3264      1.1     skrll 
   3265      1.1     skrll    R_RTB:
   3266      1.1     skrll    R_RRTBI:
   3267      1.1     skrll    R_RRTBA:
   3268      1.1     skrll 
   3269      1.1     skrll    These relocs are defined by the PowerPC ABI to be
   3270      1.1     skrll    relative branches which use half of the difference
   3271      1.1     skrll    between the symbol and the program counter.  I can't
   3272      1.1     skrll    quite figure out when this is useful.  These relocs are
   3273      1.1     skrll    not defined by the PowerOpen ABI.
   3274      1.1     skrll 
   3275      1.1     skrll    Supported r_type's
   3276      1.1     skrll 
   3277      1.1     skrll    R_POS:
   3278      1.1     skrll    Simple positive relocation.
   3279      1.1     skrll 
   3280      1.1     skrll    R_NEG:
   3281      1.1     skrll    Simple negative relocation.
   3282      1.1     skrll 
   3283      1.1     skrll    R_REL:
   3284      1.1     skrll    Simple PC relative relocation.
   3285      1.1     skrll 
   3286      1.1     skrll    R_TOC:
   3287      1.1     skrll    TOC relative relocation.  The value in the instruction in
   3288      1.1     skrll    the input file is the offset from the input file TOC to
   3289      1.1     skrll    the desired location.  We want the offset from the final
   3290      1.1     skrll    TOC to the desired location.  We have:
   3291      1.1     skrll    isym = iTOC + in
   3292      1.1     skrll    iinsn = in + o
   3293      1.1     skrll    osym = oTOC + on
   3294      1.1     skrll    oinsn = on + o
   3295      1.1     skrll    so we must change insn by on - in.
   3296      1.1     skrll 
   3297      1.1     skrll    R_GL:
   3298      1.1     skrll    GL linkage relocation.  The value of this relocation
   3299      1.1     skrll    is the address of the entry in the TOC section.
   3300      1.1     skrll 
   3301      1.1     skrll    R_TCL:
   3302      1.1     skrll    Local object TOC address.  I can't figure out the
   3303      1.1     skrll    difference between this and case R_GL.
   3304      1.1     skrll 
   3305      1.1     skrll    R_TRL:
   3306      1.1     skrll    TOC relative relocation.  A TOC relative load instruction
   3307      1.1     skrll    which may be changed to a load address instruction.
   3308      1.1     skrll    FIXME: We don't currently implement this optimization.
   3309      1.1     skrll 
   3310      1.1     skrll    R_TRLA:
   3311      1.1     skrll    TOC relative relocation.  This is a TOC relative load
   3312      1.1     skrll    address instruction which may be changed to a load
   3313      1.1     skrll    instruction.  FIXME: I don't know if this is the correct
   3314      1.1     skrll    implementation.
   3315      1.1     skrll 
   3316      1.1     skrll    R_BA:
   3317      1.1     skrll    Absolute branch.  We don't want to mess with the lower
   3318      1.1     skrll    two bits of the instruction.
   3319      1.1     skrll 
   3320      1.1     skrll    R_CAI:
   3321      1.1     skrll    The PowerPC ABI defines this as an absolute call which
   3322      1.1     skrll    may be modified to become a relative call.  The PowerOpen
   3323      1.1     skrll    ABI does not define this relocation type.
   3324      1.1     skrll 
   3325      1.1     skrll    R_RBA:
   3326      1.1     skrll    Absolute branch which may be modified to become a
   3327      1.1     skrll    relative branch.
   3328      1.1     skrll 
   3329      1.1     skrll    R_RBAC:
   3330      1.1     skrll    The PowerPC ABI defines this as an absolute branch to a
   3331      1.1     skrll    fixed address which may be modified to an absolute branch
   3332      1.1     skrll    to a symbol.  The PowerOpen ABI does not define this
   3333      1.1     skrll    relocation type.
   3334      1.1     skrll 
   3335      1.1     skrll    R_RBRC:
   3336      1.1     skrll    The PowerPC ABI defines this as an absolute branch to a
   3337      1.1     skrll    fixed address which may be modified to a relative branch.
   3338      1.1     skrll    The PowerOpen ABI does not define this relocation type.
   3339      1.1     skrll 
   3340      1.1     skrll    R_BR:
   3341      1.1     skrll    Relative branch.  We don't want to mess with the lower
   3342      1.1     skrll    two bits of the instruction.
   3343      1.1     skrll 
   3344      1.1     skrll    R_CREL:
   3345  1.1.1.2  christos    The PowerPC ABI defines this as a relative call which may
   3346      1.1     skrll    be modified to become an absolute call.  The PowerOpen
   3347      1.1     skrll    ABI does not define this relocation type.
   3348      1.1     skrll 
   3349      1.1     skrll    R_RBR:
   3350      1.1     skrll    A relative branch which may be modified to become an
   3351      1.1     skrll    absolute branch.
   3352      1.1     skrll 
   3353      1.1     skrll    R_RL:
   3354      1.1     skrll    The PowerPC AIX ABI describes this as a load which may be
   3355      1.1     skrll    changed to a load address.  The PowerOpen ABI says this
   3356      1.1     skrll    is the same as case R_POS.
   3357      1.1     skrll 
   3358      1.1     skrll    R_RLA:
   3359      1.1     skrll    The PowerPC AIX ABI describes this as a load address
   3360      1.1     skrll    which may be changed to a load.  The PowerOpen ABI says
   3361      1.1     skrll    this is the same as R_POS.
   3362      1.1     skrll */
   3363      1.1     skrll 
   3364      1.1     skrll bfd_boolean
   3365      1.1     skrll xcoff_ppc_relocate_section (output_bfd, info, input_bfd,
   3366      1.1     skrll 			    input_section, contents, relocs, syms,
   3367      1.1     skrll 			    sections)
   3368      1.1     skrll      bfd *output_bfd;
   3369      1.1     skrll      struct bfd_link_info *info;
   3370      1.1     skrll      bfd *input_bfd;
   3371      1.1     skrll      asection *input_section;
   3372      1.1     skrll      bfd_byte *contents;
   3373      1.1     skrll      struct internal_reloc *relocs;
   3374      1.1     skrll      struct internal_syment *syms;
   3375      1.1     skrll      asection **sections;
   3376      1.1     skrll {
   3377      1.1     skrll   struct internal_reloc *rel;
   3378      1.1     skrll   struct internal_reloc *relend;
   3379      1.1     skrll 
   3380      1.1     skrll   rel = relocs;
   3381      1.1     skrll   relend = rel + input_section->reloc_count;
   3382      1.1     skrll   for (; rel < relend; rel++)
   3383      1.1     skrll     {
   3384      1.1     skrll       long symndx;
   3385      1.1     skrll       struct xcoff_link_hash_entry *h;
   3386      1.1     skrll       struct internal_syment *sym;
   3387      1.1     skrll       bfd_vma addend;
   3388      1.1     skrll       bfd_vma val;
   3389      1.1     skrll       struct reloc_howto_struct howto;
   3390      1.1     skrll       bfd_vma relocation;
   3391      1.1     skrll       bfd_vma value_to_relocate;
   3392      1.1     skrll       bfd_vma address;
   3393      1.1     skrll       bfd_byte *location;
   3394      1.1     skrll 
   3395      1.1     skrll       /* Relocation type R_REF is a special relocation type which is
   3396      1.1     skrll 	 merely used to prevent garbage collection from occurring for
   3397      1.1     skrll 	 the csect including the symbol which it references.  */
   3398      1.1     skrll       if (rel->r_type == R_REF)
   3399      1.1     skrll 	continue;
   3400      1.1     skrll 
   3401      1.1     skrll       /* howto */
   3402      1.1     skrll       howto.type = rel->r_type;
   3403      1.1     skrll       howto.rightshift = 0;
   3404      1.1     skrll       howto.bitsize = (rel->r_size & 0x1f) + 1;
   3405      1.1     skrll       howto.size = howto.bitsize > 16 ? 2 : 1;
   3406      1.1     skrll       howto.pc_relative = FALSE;
   3407      1.1     skrll       howto.bitpos = 0;
   3408      1.1     skrll       howto.complain_on_overflow = (rel->r_size & 0x80
   3409      1.1     skrll 				    ? complain_overflow_signed
   3410      1.1     skrll 				    : complain_overflow_bitfield);
   3411      1.1     skrll       howto.special_function = NULL;
   3412      1.1     skrll       howto.name = "internal";
   3413      1.1     skrll       howto.partial_inplace = TRUE;
   3414      1.1     skrll       howto.src_mask = howto.dst_mask = N_ONES (howto.bitsize);
   3415      1.1     skrll       howto.pcrel_offset = FALSE;
   3416      1.1     skrll 
   3417      1.1     skrll       /* symbol */
   3418      1.1     skrll       val = 0;
   3419      1.1     skrll       addend = 0;
   3420      1.1     skrll       h = NULL;
   3421      1.1     skrll       sym = NULL;
   3422      1.1     skrll       symndx = rel->r_symndx;
   3423      1.1     skrll 
   3424      1.1     skrll       if (-1 != symndx)
   3425      1.1     skrll 	{
   3426      1.1     skrll 	  asection *sec;
   3427      1.1     skrll 
   3428      1.1     skrll 	  h = obj_xcoff_sym_hashes (input_bfd)[symndx];
   3429      1.1     skrll 	  sym = syms + symndx;
   3430      1.1     skrll 	  addend = - sym->n_value;
   3431      1.1     skrll 
   3432      1.1     skrll 	  if (NULL == h)
   3433      1.1     skrll 	    {
   3434      1.1     skrll 	      sec = sections[symndx];
   3435      1.1     skrll 	      /* Hack to make sure we use the right TOC anchor value
   3436      1.1     skrll 		 if this reloc is against the TOC anchor.  */
   3437      1.1     skrll 	      if (sec->name[3] == '0'
   3438      1.1     skrll 		  && strcmp (sec->name, ".tc0") == 0)
   3439      1.1     skrll 		val = xcoff_data (output_bfd)->toc;
   3440      1.1     skrll 	      else
   3441      1.1     skrll 		val = (sec->output_section->vma
   3442  1.1.1.2  christos 		       + sec->output_offset
   3443  1.1.1.2  christos 		       + sym->n_value
   3444  1.1.1.2  christos 		       - sec->vma);
   3445  1.1.1.2  christos 	    }
   3446  1.1.1.2  christos 	  else
   3447  1.1.1.2  christos 	    {
   3448  1.1.1.2  christos 	      if (info->unresolved_syms_in_objects != RM_IGNORE
   3449  1.1.1.2  christos 		  && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
   3450  1.1.1.2  christos 		{
   3451  1.1.1.2  christos 		  if (! ((*info->callbacks->undefined_symbol)
   3452  1.1.1.2  christos 			 (info, h->root.root.string,
   3453      1.1     skrll 			  input_bfd, input_section,
   3454      1.1     skrll 			  rel->r_vaddr - input_section->vma,
   3455      1.1     skrll 			  (info->unresolved_syms_in_objects
   3456      1.1     skrll 			   == RM_GENERATE_ERROR))))
   3457      1.1     skrll 		    return FALSE;
   3458      1.1     skrll 		}
   3459      1.1     skrll 	      if (h->root.type == bfd_link_hash_defined
   3460      1.1     skrll 		  || h->root.type == bfd_link_hash_defweak)
   3461      1.1     skrll 		{
   3462      1.1     skrll 		  sec = h->root.u.def.section;
   3463      1.1     skrll 		  val = (h->root.u.def.value
   3464      1.1     skrll 			 + sec->output_section->vma
   3465      1.1     skrll 			 + sec->output_offset);
   3466      1.1     skrll 		}
   3467      1.1     skrll 	      else if (h->root.type == bfd_link_hash_common)
   3468  1.1.1.2  christos 		{
   3469      1.1     skrll 		  sec = h->root.u.c.p->section;
   3470  1.1.1.2  christos 		  val = (sec->output_section->vma
   3471  1.1.1.2  christos 			 + sec->output_offset);
   3472  1.1.1.2  christos 
   3473  1.1.1.2  christos 		}
   3474  1.1.1.2  christos 	      else
   3475      1.1     skrll 		{
   3476      1.1     skrll 		  BFD_ASSERT (info->relocatable
   3477      1.1     skrll 			      || (info->static_link
   3478      1.1     skrll 				  && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
   3479      1.1     skrll 			      || (h->flags & XCOFF_DEF_DYNAMIC) != 0
   3480      1.1     skrll 			      || (h->flags & XCOFF_IMPORT) != 0);
   3481      1.1     skrll 		}
   3482      1.1     skrll 	    }
   3483      1.1     skrll 	}
   3484      1.1     skrll 
   3485      1.1     skrll       if (rel->r_type >= XCOFF_MAX_CALCULATE_RELOCATION
   3486      1.1     skrll 	  || !((*xcoff_calculate_relocation[rel->r_type])
   3487      1.1     skrll 	       (input_bfd, input_section, output_bfd, rel, sym, &howto, val,
   3488      1.1     skrll 		addend, &relocation, contents)))
   3489      1.1     skrll 	return FALSE;
   3490      1.1     skrll 
   3491      1.1     skrll       /* address */
   3492      1.1     skrll       address = rel->r_vaddr - input_section->vma;
   3493      1.1     skrll       location = contents + address;
   3494      1.1     skrll 
   3495      1.1     skrll       if (address > input_section->size)
   3496      1.1     skrll 	abort ();
   3497      1.1     skrll 
   3498      1.1     skrll       /* Get the value we are going to relocate.  */
   3499      1.1     skrll       if (1 == howto.size)
   3500      1.1     skrll 	value_to_relocate = bfd_get_16 (input_bfd, location);
   3501      1.1     skrll       else
   3502      1.1     skrll 	value_to_relocate = bfd_get_32 (input_bfd, location);
   3503      1.1     skrll 
   3504      1.1     skrll       /* overflow.
   3505      1.1     skrll 
   3506      1.1     skrll 	 FIXME: We may drop bits during the addition
   3507      1.1     skrll 	 which we don't check for.  We must either check at every single
   3508      1.1     skrll 	 operation, which would be tedious, or we must do the computations
   3509      1.1     skrll 	 in a type larger than bfd_vma, which would be inefficient.  */
   3510      1.1     skrll 
   3511      1.1     skrll       if ((unsigned int) howto.complain_on_overflow
   3512      1.1     skrll 	  >= XCOFF_MAX_COMPLAIN_OVERFLOW)
   3513      1.1     skrll 	abort ();
   3514      1.1     skrll 
   3515      1.1     skrll       if (((*xcoff_complain_overflow[howto.complain_on_overflow])
   3516      1.1     skrll 	   (input_bfd, value_to_relocate, relocation, &howto)))
   3517      1.1     skrll 	{
   3518      1.1     skrll 	  const char *name;
   3519      1.1     skrll 	  char buf[SYMNMLEN + 1];
   3520      1.1     skrll 	  char reloc_type_name[10];
   3521      1.1     skrll 
   3522      1.1     skrll 	  if (symndx == -1)
   3523      1.1     skrll 	    {
   3524      1.1     skrll 	      name = "*ABS*";
   3525      1.1     skrll 	    }
   3526      1.1     skrll 	  else if (h != NULL)
   3527      1.1     skrll 	    {
   3528      1.1     skrll 	      name = NULL;
   3529      1.1     skrll 	    }
   3530      1.1     skrll 	  else
   3531      1.1     skrll 	    {
   3532      1.1     skrll 	      name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
   3533      1.1     skrll 	      if (name == NULL)
   3534      1.1     skrll 		name = "UNKNOWN";
   3535      1.1     skrll 	    }
   3536      1.1     skrll 	  sprintf (reloc_type_name, "0x%02x", rel->r_type);
   3537      1.1     skrll 
   3538      1.1     skrll 	  if (! ((*info->callbacks->reloc_overflow)
   3539      1.1     skrll 		 (info, (h ? &h->root : NULL), name, reloc_type_name,
   3540      1.1     skrll 		  (bfd_vma) 0, input_bfd, input_section,
   3541      1.1     skrll 		  rel->r_vaddr - input_section->vma)))
   3542      1.1     skrll 	    return FALSE;
   3543      1.1     skrll 	}
   3544      1.1     skrll 
   3545      1.1     skrll       /* Add RELOCATION to the right bits of VALUE_TO_RELOCATE.  */
   3546      1.1     skrll       value_to_relocate = ((value_to_relocate & ~howto.dst_mask)
   3547      1.1     skrll 			   | (((value_to_relocate & howto.src_mask)
   3548      1.1     skrll 			       + relocation) & howto.dst_mask));
   3549      1.1     skrll 
   3550      1.1     skrll       /* Put the value back in the object file.  */
   3551      1.1     skrll       if (1 == howto.size)
   3552      1.1     skrll 	bfd_put_16 (input_bfd, value_to_relocate, location);
   3553      1.1     skrll       else
   3554      1.1     skrll 	bfd_put_32 (input_bfd, value_to_relocate, location);
   3555      1.1     skrll     }
   3556      1.1     skrll 
   3557      1.1     skrll   return TRUE;
   3558      1.1     skrll }
   3559      1.1     skrll 
   3560      1.1     skrll static bfd_boolean
   3561      1.1     skrll _bfd_xcoff_put_ldsymbol_name (abfd, ldinfo, ldsym, name)
   3562      1.1     skrll      bfd *abfd ATTRIBUTE_UNUSED;
   3563      1.1     skrll 	 struct xcoff_loader_info *ldinfo;
   3564      1.1     skrll 	 struct internal_ldsym *ldsym;
   3565      1.1     skrll 	 const char *name;
   3566      1.1     skrll {
   3567      1.1     skrll   size_t len;
   3568      1.1     skrll   len = strlen (name);
   3569      1.1     skrll 
   3570      1.1     skrll   if (len <= SYMNMLEN)
   3571      1.1     skrll     strncpy (ldsym->_l._l_name, name, SYMNMLEN);
   3572      1.1     skrll   else
   3573      1.1     skrll     {
   3574      1.1     skrll       if (ldinfo->string_size + len + 3 > ldinfo->string_alc)
   3575      1.1     skrll 	{
   3576      1.1     skrll 	  bfd_size_type newalc;
   3577      1.1     skrll 	  char *newstrings;
   3578      1.1     skrll 
   3579      1.1     skrll 	  newalc = ldinfo->string_alc * 2;
   3580      1.1     skrll 	  if (newalc == 0)
   3581      1.1     skrll 	    newalc = 32;
   3582      1.1     skrll 	  while (ldinfo->string_size + len + 3 > newalc)
   3583      1.1     skrll 	    newalc *= 2;
   3584      1.1     skrll 
   3585      1.1     skrll 	  newstrings = bfd_realloc (ldinfo->strings, newalc);
   3586      1.1     skrll 	  if (newstrings == NULL)
   3587      1.1     skrll 	    {
   3588      1.1     skrll 	      ldinfo->failed = TRUE;
   3589      1.1     skrll 	      return FALSE;
   3590      1.1     skrll 	    }
   3591      1.1     skrll 	  ldinfo->string_alc = newalc;
   3592      1.1     skrll 	  ldinfo->strings = newstrings;
   3593      1.1     skrll 	}
   3594      1.1     skrll 
   3595      1.1     skrll       bfd_put_16 (ldinfo->output_bfd, (bfd_vma) (len + 1),
   3596      1.1     skrll 		  ldinfo->strings + ldinfo->string_size);
   3597      1.1     skrll       strcpy (ldinfo->strings + ldinfo->string_size + 2, name);
   3598      1.1     skrll       ldsym->_l._l_l._l_zeroes = 0;
   3599      1.1     skrll       ldsym->_l._l_l._l_offset = ldinfo->string_size + 2;
   3600      1.1     skrll       ldinfo->string_size += len + 3;
   3601      1.1     skrll     }
   3602      1.1     skrll 
   3603      1.1     skrll   return TRUE;
   3604      1.1     skrll }
   3605      1.1     skrll 
   3606      1.1     skrll static bfd_boolean
   3607      1.1     skrll _bfd_xcoff_put_symbol_name (bfd *abfd, struct bfd_strtab_hash *strtab,
   3608      1.1     skrll 			    struct internal_syment *sym,
   3609      1.1     skrll 			    const char *name)
   3610      1.1     skrll {
   3611      1.1     skrll   if (strlen (name) <= SYMNMLEN)
   3612      1.1     skrll     {
   3613      1.1     skrll       strncpy (sym->_n._n_name, name, SYMNMLEN);
   3614      1.1     skrll     }
   3615      1.1     skrll   else
   3616      1.1     skrll     {
   3617      1.1     skrll       bfd_boolean hash;
   3618      1.1     skrll       bfd_size_type indx;
   3619      1.1     skrll 
   3620      1.1     skrll       hash = TRUE;
   3621      1.1     skrll       if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
   3622      1.1     skrll 	hash = FALSE;
   3623      1.1     skrll       indx = _bfd_stringtab_add (strtab, name, hash, FALSE);
   3624      1.1     skrll       if (indx == (bfd_size_type) -1)
   3625      1.1     skrll 	return FALSE;
   3626      1.1     skrll       sym->_n._n_n._n_zeroes = 0;
   3627      1.1     skrll       sym->_n._n_n._n_offset = STRING_SIZE_SIZE + indx;
   3628      1.1     skrll     }
   3629      1.1     skrll   return TRUE;
   3630      1.1     skrll }
   3631      1.1     skrll 
   3632      1.1     skrll static asection *
   3633      1.1     skrll xcoff_create_csect_from_smclas (abfd, aux, symbol_name)
   3634      1.1     skrll      bfd *abfd;
   3635      1.1     skrll      union internal_auxent *aux;
   3636      1.1     skrll      const char *symbol_name;
   3637      1.1     skrll {
   3638      1.1     skrll   asection *return_value = NULL;
   3639      1.1     skrll 
   3640      1.1     skrll   /* .sv64 = x_smclas == 17
   3641      1.1     skrll      This is an invalid csect for 32 bit apps.  */
   3642      1.1     skrll   static const char *names[19] =
   3643      1.1     skrll   {
   3644      1.1     skrll     ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
   3645      1.1     skrll     ".sv", ".bs", ".ds", ".uc", ".ti", ".tb", NULL, ".tc0",
   3646      1.1     skrll     ".td", NULL, ".sv3264"
   3647      1.1     skrll   };
   3648      1.1     skrll 
   3649      1.1     skrll   if ((19 >= aux->x_csect.x_smclas)
   3650      1.1     skrll       && (NULL != names[aux->x_csect.x_smclas]))
   3651      1.1     skrll     {
   3652      1.1     skrll       return_value = bfd_make_section_anyway
   3653      1.1     skrll 	(abfd, names[aux->x_csect.x_smclas]);
   3654      1.1     skrll     }
   3655      1.1     skrll   else
   3656      1.1     skrll     {
   3657      1.1     skrll       (*_bfd_error_handler)
   3658      1.1     skrll 	(_("%B: symbol `%s' has unrecognized smclas %d"),
   3659      1.1     skrll 	 abfd, symbol_name, aux->x_csect.x_smclas);
   3660      1.1     skrll       bfd_set_error (bfd_error_bad_value);
   3661      1.1     skrll     }
   3662      1.1     skrll 
   3663      1.1     skrll   return return_value;
   3664      1.1     skrll }
   3665      1.1     skrll 
   3666      1.1     skrll static bfd_boolean
   3667      1.1     skrll xcoff_is_lineno_count_overflow (abfd, value)
   3668      1.1     skrll     bfd *abfd ATTRIBUTE_UNUSED;
   3669      1.1     skrll 	bfd_vma value;
   3670      1.1     skrll {
   3671      1.1     skrll   if (0xffff <= value)
   3672      1.1     skrll     return TRUE;
   3673      1.1     skrll 
   3674      1.1     skrll   return FALSE;
   3675      1.1     skrll }
   3676      1.1     skrll 
   3677      1.1     skrll static bfd_boolean
   3678      1.1     skrll xcoff_is_reloc_count_overflow (abfd, value)
   3679      1.1     skrll     bfd *abfd ATTRIBUTE_UNUSED;
   3680      1.1     skrll 	bfd_vma value;
   3681      1.1     skrll {
   3682      1.1     skrll   if (0xffff <= value)
   3683      1.1     skrll     return TRUE;
   3684      1.1     skrll 
   3685      1.1     skrll   return FALSE;
   3686      1.1     skrll }
   3687      1.1     skrll 
   3688      1.1     skrll static bfd_vma
   3689      1.1     skrll xcoff_loader_symbol_offset (abfd, ldhdr)
   3690      1.1     skrll     bfd *abfd;
   3691      1.1     skrll     struct internal_ldhdr *ldhdr ATTRIBUTE_UNUSED;
   3692      1.1     skrll {
   3693      1.1     skrll   return bfd_xcoff_ldhdrsz (abfd);
   3694      1.1     skrll }
   3695      1.1     skrll 
   3696      1.1     skrll static bfd_vma
   3697      1.1     skrll xcoff_loader_reloc_offset (abfd, ldhdr)
   3698      1.1     skrll     bfd *abfd;
   3699      1.1     skrll     struct internal_ldhdr *ldhdr;
   3700      1.1     skrll {
   3701      1.1     skrll   return bfd_xcoff_ldhdrsz (abfd) + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (abfd);
   3702      1.1     skrll }
   3703      1.1     skrll 
   3704      1.1     skrll static bfd_boolean
   3705      1.1     skrll xcoff_generate_rtinit  (abfd, init, fini, rtld)
   3706      1.1     skrll      bfd *abfd;
   3707      1.1     skrll      const char *init;
   3708      1.1     skrll      const char *fini;
   3709      1.1     skrll      bfd_boolean rtld;
   3710      1.1     skrll {
   3711      1.1     skrll   bfd_byte filehdr_ext[FILHSZ];
   3712      1.1     skrll   bfd_byte scnhdr_ext[SCNHSZ];
   3713      1.1     skrll   bfd_byte syment_ext[SYMESZ * 10];
   3714      1.1     skrll   bfd_byte reloc_ext[RELSZ * 3];
   3715      1.1     skrll   bfd_byte *data_buffer;
   3716      1.1     skrll   bfd_size_type data_buffer_size;
   3717      1.1     skrll   bfd_byte *string_table = NULL, *st_tmp = NULL;
   3718      1.1     skrll   bfd_size_type string_table_size;
   3719      1.1     skrll   bfd_vma val;
   3720      1.1     skrll   size_t initsz, finisz;
   3721      1.1     skrll   struct internal_filehdr filehdr;
   3722      1.1     skrll   struct internal_scnhdr scnhdr;
   3723      1.1     skrll   struct internal_syment syment;
   3724      1.1     skrll   union internal_auxent auxent;
   3725      1.1     skrll   struct internal_reloc reloc;
   3726      1.1     skrll 
   3727      1.1     skrll   char *data_name = ".data";
   3728      1.1     skrll   char *rtinit_name = "__rtinit";
   3729      1.1     skrll   char *rtld_name = "__rtld";
   3730      1.1     skrll 
   3731      1.1     skrll   if (! bfd_xcoff_rtinit_size (abfd))
   3732      1.1     skrll     return FALSE;
   3733      1.1     skrll 
   3734      1.1     skrll   initsz = (init == NULL ? 0 : 1 + strlen (init));
   3735      1.1     skrll   finisz = (fini == NULL ? 0 : 1 + strlen (fini));
   3736      1.1     skrll 
   3737      1.1     skrll   /* file header */
   3738      1.1     skrll   memset (filehdr_ext, 0, FILHSZ);
   3739      1.1     skrll   memset (&filehdr, 0, sizeof (struct internal_filehdr));
   3740      1.1     skrll   filehdr.f_magic = bfd_xcoff_magic_number (abfd);
   3741      1.1     skrll   filehdr.f_nscns = 1;
   3742      1.1     skrll   filehdr.f_timdat = 0;
   3743      1.1     skrll   filehdr.f_nsyms = 0;  /* at least 6, no more than 10 */
   3744      1.1     skrll   filehdr.f_symptr = 0; /* set below */
   3745      1.1     skrll   filehdr.f_opthdr = 0;
   3746      1.1     skrll   filehdr.f_flags = 0;
   3747      1.1     skrll 
   3748      1.1     skrll   /* section header */
   3749      1.1     skrll   memset (scnhdr_ext, 0, SCNHSZ);
   3750      1.1     skrll   memset (&scnhdr, 0, sizeof (struct internal_scnhdr));
   3751      1.1     skrll   memcpy (scnhdr.s_name, data_name, strlen (data_name));
   3752      1.1     skrll   scnhdr.s_paddr = 0;
   3753      1.1     skrll   scnhdr.s_vaddr = 0;
   3754      1.1     skrll   scnhdr.s_size = 0;    /* set below */
   3755      1.1     skrll   scnhdr.s_scnptr = FILHSZ + SCNHSZ;
   3756      1.1     skrll   scnhdr.s_relptr = 0;  /* set below */
   3757      1.1     skrll   scnhdr.s_lnnoptr = 0;
   3758      1.1     skrll   scnhdr.s_nreloc = 0;  /* either 1 or 2 */
   3759      1.1     skrll   scnhdr.s_nlnno = 0;
   3760      1.1     skrll   scnhdr.s_flags = STYP_DATA;
   3761      1.1     skrll 
   3762      1.1     skrll   /* .data
   3763      1.1     skrll      0x0000	      0x00000000 : rtl
   3764      1.1     skrll      0x0004	      0x00000010 : offset to init, or 0
   3765      1.1     skrll      0x0008	      0x00000028 : offset to fini, or 0
   3766      1.1     skrll      0x000C	      0x0000000C : size of descriptor
   3767      1.1     skrll      0x0010	      0x00000000 : init, needs a reloc
   3768      1.1     skrll      0x0014	      0x00000040 : offset to init name
   3769      1.1     skrll      0x0018	      0x00000000 : flags, padded to a word
   3770      1.1     skrll      0x001C	      0x00000000 : empty init
   3771      1.1     skrll      0x0020	      0x00000000 :
   3772      1.1     skrll      0x0024	      0x00000000 :
   3773      1.1     skrll      0x0028	      0x00000000 : fini, needs a reloc
   3774      1.1     skrll      0x002C	      0x00000??? : offset to fini name
   3775      1.1     skrll      0x0030	      0x00000000 : flags, padded to a word
   3776      1.1     skrll      0x0034	      0x00000000 : empty fini
   3777      1.1     skrll      0x0038	      0x00000000 :
   3778      1.1     skrll      0x003C	      0x00000000 :
   3779      1.1     skrll      0x0040	      init name
   3780      1.1     skrll      0x0040 + initsz  fini name */
   3781      1.1     skrll 
   3782      1.1     skrll   data_buffer_size = 0x0040 + initsz + finisz;
   3783      1.1     skrll   data_buffer_size = (data_buffer_size + 7) &~ (bfd_size_type) 7;
   3784      1.1     skrll   data_buffer = NULL;
   3785      1.1     skrll   data_buffer = (bfd_byte *) bfd_zmalloc (data_buffer_size);
   3786      1.1     skrll   if (data_buffer == NULL)
   3787      1.1     skrll     return FALSE;
   3788      1.1     skrll 
   3789      1.1     skrll   if (initsz)
   3790      1.1     skrll     {
   3791      1.1     skrll       val = 0x10;
   3792      1.1     skrll       bfd_h_put_32 (abfd, val, &data_buffer[0x04]);
   3793      1.1     skrll       val = 0x40;
   3794      1.1     skrll       bfd_h_put_32 (abfd, val, &data_buffer[0x14]);
   3795      1.1     skrll       memcpy (&data_buffer[val], init, initsz);
   3796      1.1     skrll     }
   3797      1.1     skrll 
   3798      1.1     skrll   if (finisz)
   3799      1.1     skrll     {
   3800      1.1     skrll       val = 0x28;
   3801      1.1     skrll       bfd_h_put_32 (abfd, val, &data_buffer[0x08]);
   3802      1.1     skrll       val = 0x40 + initsz;
   3803      1.1     skrll       bfd_h_put_32 (abfd, val, &data_buffer[0x2C]);
   3804      1.1     skrll       memcpy (&data_buffer[val], fini, finisz);
   3805      1.1     skrll     }
   3806      1.1     skrll 
   3807      1.1     skrll   val = 0x0C;
   3808      1.1     skrll   bfd_h_put_32 (abfd, val, &data_buffer[0x0C]);
   3809      1.1     skrll 
   3810      1.1     skrll   scnhdr.s_size = data_buffer_size;
   3811      1.1     skrll 
   3812      1.1     skrll   /* string table */
   3813      1.1     skrll   string_table_size = 0;
   3814      1.1     skrll   if (initsz > 9)
   3815      1.1     skrll     string_table_size += initsz;
   3816      1.1     skrll   if (finisz > 9)
   3817      1.1     skrll     string_table_size += finisz;
   3818      1.1     skrll   if (string_table_size)
   3819      1.1     skrll     {
   3820      1.1     skrll       string_table_size += 4;
   3821      1.1     skrll       string_table = (bfd_byte *) bfd_zmalloc (string_table_size);
   3822      1.1     skrll       if (string_table == NULL)
   3823      1.1     skrll 	return FALSE;
   3824      1.1     skrll 
   3825      1.1     skrll       val = string_table_size;
   3826      1.1     skrll       bfd_h_put_32 (abfd, val, &string_table[0]);
   3827      1.1     skrll       st_tmp = string_table + 4;
   3828      1.1     skrll     }
   3829      1.1     skrll 
   3830      1.1     skrll   /* symbols
   3831      1.1     skrll      0. .data csect
   3832      1.1     skrll      2. __rtinit
   3833      1.1     skrll      4. init function
   3834      1.1     skrll      6. fini function
   3835      1.1     skrll      8. __rtld  */
   3836      1.1     skrll   memset (syment_ext, 0, 10 * SYMESZ);
   3837      1.1     skrll   memset (reloc_ext, 0, 3 * RELSZ);
   3838      1.1     skrll 
   3839      1.1     skrll   /* .data csect */
   3840      1.1     skrll   memset (&syment, 0, sizeof (struct internal_syment));
   3841      1.1     skrll   memset (&auxent, 0, sizeof (union internal_auxent));
   3842      1.1     skrll   memcpy (syment._n._n_name, data_name, strlen (data_name));
   3843      1.1     skrll   syment.n_scnum = 1;
   3844      1.1     skrll   syment.n_sclass = C_HIDEXT;
   3845      1.1     skrll   syment.n_numaux = 1;
   3846      1.1     skrll   auxent.x_csect.x_scnlen.l = data_buffer_size;
   3847      1.1     skrll   auxent.x_csect.x_smtyp = 3 << 3 | XTY_SD;
   3848      1.1     skrll   auxent.x_csect.x_smclas = XMC_RW;
   3849      1.1     skrll   bfd_coff_swap_sym_out (abfd, &syment,
   3850      1.1     skrll 			 &syment_ext[filehdr.f_nsyms * SYMESZ]);
   3851      1.1     skrll   bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
   3852      1.1     skrll 			 syment.n_numaux,
   3853      1.1     skrll 			 &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
   3854      1.1     skrll   filehdr.f_nsyms += 2;
   3855      1.1     skrll 
   3856      1.1     skrll   /* __rtinit */
   3857      1.1     skrll   memset (&syment, 0, sizeof (struct internal_syment));
   3858      1.1     skrll   memset (&auxent, 0, sizeof (union internal_auxent));
   3859      1.1     skrll   memcpy (syment._n._n_name, rtinit_name, strlen (rtinit_name));
   3860      1.1     skrll   syment.n_scnum = 1;
   3861      1.1     skrll   syment.n_sclass = C_EXT;
   3862      1.1     skrll   syment.n_numaux = 1;
   3863      1.1     skrll   auxent.x_csect.x_smtyp = XTY_LD;
   3864      1.1     skrll   auxent.x_csect.x_smclas = XMC_RW;
   3865      1.1     skrll   bfd_coff_swap_sym_out (abfd, &syment,
   3866      1.1     skrll 			 &syment_ext[filehdr.f_nsyms * SYMESZ]);
   3867      1.1     skrll   bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
   3868      1.1     skrll 			 syment.n_numaux,
   3869      1.1     skrll 			 &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
   3870      1.1     skrll   filehdr.f_nsyms += 2;
   3871      1.1     skrll 
   3872      1.1     skrll   /* init */
   3873      1.1     skrll   if (initsz)
   3874      1.1     skrll     {
   3875      1.1     skrll       memset (&syment, 0, sizeof (struct internal_syment));
   3876      1.1     skrll       memset (&auxent, 0, sizeof (union internal_auxent));
   3877      1.1     skrll 
   3878      1.1     skrll       if (initsz > 9)
   3879      1.1     skrll 	{
   3880      1.1     skrll 	  syment._n._n_n._n_offset = st_tmp - string_table;
   3881      1.1     skrll 	  memcpy (st_tmp, init, initsz);
   3882      1.1     skrll 	  st_tmp += initsz;
   3883      1.1     skrll 	}
   3884      1.1     skrll       else
   3885      1.1     skrll 	memcpy (syment._n._n_name, init, initsz - 1);
   3886      1.1     skrll 
   3887      1.1     skrll       syment.n_sclass = C_EXT;
   3888      1.1     skrll       syment.n_numaux = 1;
   3889      1.1     skrll       bfd_coff_swap_sym_out (abfd, &syment,
   3890      1.1     skrll 			     &syment_ext[filehdr.f_nsyms * SYMESZ]);
   3891      1.1     skrll       bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
   3892      1.1     skrll 			     syment.n_numaux,
   3893      1.1     skrll 			     &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
   3894      1.1     skrll 
   3895      1.1     skrll       /* reloc */
   3896      1.1     skrll       memset (&reloc, 0, sizeof (struct internal_reloc));
   3897      1.1     skrll       reloc.r_vaddr = 0x0010;
   3898      1.1     skrll       reloc.r_symndx = filehdr.f_nsyms;
   3899      1.1     skrll       reloc.r_type = R_POS;
   3900      1.1     skrll       reloc.r_size = 31;
   3901      1.1     skrll       bfd_coff_swap_reloc_out (abfd, &reloc, &reloc_ext[0]);
   3902      1.1     skrll 
   3903      1.1     skrll       filehdr.f_nsyms += 2;
   3904      1.1     skrll       scnhdr.s_nreloc += 1;
   3905      1.1     skrll     }
   3906      1.1     skrll 
   3907      1.1     skrll   /* fini */
   3908      1.1     skrll   if (finisz)
   3909      1.1     skrll     {
   3910      1.1     skrll       memset (&syment, 0, sizeof (struct internal_syment));
   3911      1.1     skrll       memset (&auxent, 0, sizeof (union internal_auxent));
   3912      1.1     skrll 
   3913      1.1     skrll       if (finisz > 9)
   3914      1.1     skrll 	{
   3915      1.1     skrll 	  syment._n._n_n._n_offset = st_tmp - string_table;
   3916      1.1     skrll 	  memcpy (st_tmp, fini, finisz);
   3917      1.1     skrll 	  st_tmp += finisz;
   3918      1.1     skrll 	}
   3919      1.1     skrll       else
   3920      1.1     skrll 	memcpy (syment._n._n_name, fini, finisz - 1);
   3921      1.1     skrll 
   3922      1.1     skrll       syment.n_sclass = C_EXT;
   3923      1.1     skrll       syment.n_numaux = 1;
   3924      1.1     skrll       bfd_coff_swap_sym_out (abfd, &syment,
   3925      1.1     skrll 			     &syment_ext[filehdr.f_nsyms * SYMESZ]);
   3926      1.1     skrll       bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
   3927      1.1     skrll 			     syment.n_numaux,
   3928      1.1     skrll 			     &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
   3929      1.1     skrll 
   3930      1.1     skrll       /* reloc */
   3931      1.1     skrll       memset (&reloc, 0, sizeof (struct internal_reloc));
   3932      1.1     skrll       reloc.r_vaddr = 0x0028;
   3933      1.1     skrll       reloc.r_symndx = filehdr.f_nsyms;
   3934      1.1     skrll       reloc.r_type = R_POS;
   3935      1.1     skrll       reloc.r_size = 31;
   3936      1.1     skrll       bfd_coff_swap_reloc_out (abfd, &reloc,
   3937      1.1     skrll 			       &reloc_ext[scnhdr.s_nreloc * RELSZ]);
   3938      1.1     skrll 
   3939      1.1     skrll       filehdr.f_nsyms += 2;
   3940      1.1     skrll       scnhdr.s_nreloc += 1;
   3941      1.1     skrll     }
   3942      1.1     skrll 
   3943      1.1     skrll   if (rtld)
   3944      1.1     skrll     {
   3945      1.1     skrll       memset (&syment, 0, sizeof (struct internal_syment));
   3946      1.1     skrll       memset (&auxent, 0, sizeof (union internal_auxent));
   3947      1.1     skrll       memcpy (syment._n._n_name, rtld_name, strlen (rtld_name));
   3948      1.1     skrll       syment.n_sclass = C_EXT;
   3949      1.1     skrll       syment.n_numaux = 1;
   3950      1.1     skrll       bfd_coff_swap_sym_out (abfd, &syment,
   3951      1.1     skrll 			     &syment_ext[filehdr.f_nsyms * SYMESZ]);
   3952      1.1     skrll       bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
   3953      1.1     skrll 			     syment.n_numaux,
   3954      1.1     skrll 			     &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
   3955      1.1     skrll 
   3956      1.1     skrll       /* reloc */
   3957      1.1     skrll       memset (&reloc, 0, sizeof (struct internal_reloc));
   3958      1.1     skrll       reloc.r_vaddr = 0x0000;
   3959      1.1     skrll       reloc.r_symndx = filehdr.f_nsyms;
   3960      1.1     skrll       reloc.r_type = R_POS;
   3961      1.1     skrll       reloc.r_size = 31;
   3962      1.1     skrll       bfd_coff_swap_reloc_out (abfd, &reloc,
   3963      1.1     skrll 			       &reloc_ext[scnhdr.s_nreloc * RELSZ]);
   3964      1.1     skrll 
   3965      1.1     skrll       filehdr.f_nsyms += 2;
   3966      1.1     skrll       scnhdr.s_nreloc += 1;
   3967      1.1     skrll     }
   3968      1.1     skrll 
   3969      1.1     skrll   scnhdr.s_relptr = scnhdr.s_scnptr + data_buffer_size;
   3970      1.1     skrll   filehdr.f_symptr = scnhdr.s_relptr + scnhdr.s_nreloc * RELSZ;
   3971      1.1     skrll 
   3972      1.1     skrll   bfd_coff_swap_filehdr_out (abfd, &filehdr, filehdr_ext);
   3973      1.1     skrll   bfd_bwrite (filehdr_ext, FILHSZ, abfd);
   3974      1.1     skrll   bfd_coff_swap_scnhdr_out (abfd, &scnhdr, scnhdr_ext);
   3975      1.1     skrll   bfd_bwrite (scnhdr_ext, SCNHSZ, abfd);
   3976      1.1     skrll   bfd_bwrite (data_buffer, data_buffer_size, abfd);
   3977      1.1     skrll   bfd_bwrite (reloc_ext, scnhdr.s_nreloc * RELSZ, abfd);
   3978      1.1     skrll   bfd_bwrite (syment_ext, filehdr.f_nsyms * SYMESZ, abfd);
   3979      1.1     skrll   bfd_bwrite (string_table, string_table_size, abfd);
   3980      1.1     skrll 
   3981      1.1     skrll   free (data_buffer);
   3982      1.1     skrll   data_buffer = NULL;
   3983      1.1     skrll 
   3984      1.1     skrll   return TRUE;
   3985      1.1     skrll }
   3986      1.1     skrll 
   3987      1.1     skrll 
   3988      1.1     skrll static reloc_howto_type xcoff_dynamic_reloc =
   3989      1.1     skrll HOWTO (0,			/* type */
   3990      1.1     skrll        0,			/* rightshift */
   3991      1.1     skrll        2,			/* size (0 = byte, 1 = short, 2 = long) */
   3992      1.1     skrll        32,			/* bitsize */
   3993      1.1     skrll        FALSE,			/* pc_relative */
   3994      1.1     skrll        0,			/* bitpos */
   3995      1.1     skrll        complain_overflow_bitfield, /* complain_on_overflow */
   3996      1.1     skrll        0,			/* special_function */
   3997      1.1     skrll        "R_POS",			/* name */
   3998      1.1     skrll        TRUE,			/* partial_inplace */
   3999      1.1     skrll        0xffffffff,		/* src_mask */
   4000      1.1     skrll        0xffffffff,		/* dst_mask */
   4001      1.1     skrll        FALSE);			/* pcrel_offset */
   4002      1.1     skrll 
   4003      1.1     skrll /*  glink
   4004      1.1     skrll 
   4005      1.1     skrll    The first word of global linkage code must be modified by filling in
   4006      1.1     skrll    the correct TOC offset.  */
   4007      1.1     skrll 
   4008      1.1     skrll static unsigned long xcoff_glink_code[9] =
   4009      1.1     skrll   {
   4010      1.1     skrll     0x81820000,	/* lwz r12,0(r2) */
   4011      1.1     skrll     0x90410014,	/* stw r2,20(r1) */
   4012      1.1     skrll     0x800c0000,	/* lwz r0,0(r12) */
   4013      1.1     skrll     0x804c0004,	/* lwz r2,4(r12) */
   4014      1.1     skrll     0x7c0903a6,	/* mtctr r0 */
   4015      1.1     skrll     0x4e800420,	/* bctr */
   4016      1.1     skrll     0x00000000,	/* start of traceback table */
   4017      1.1     skrll     0x000c8000,	/* traceback table */
   4018      1.1     skrll     0x00000000,	/* traceback table */
   4019      1.1     skrll   };
   4020      1.1     skrll 
   4021      1.1     skrll 
   4022      1.1     skrll static const struct xcoff_backend_data_rec bfd_xcoff_backend_data =
   4023      1.1     skrll   {
   4024      1.1     skrll     { /* COFF backend, defined in libcoff.h.  */
   4025      1.1     skrll       _bfd_xcoff_swap_aux_in,
   4026      1.1     skrll       _bfd_xcoff_swap_sym_in,
   4027      1.1     skrll       coff_swap_lineno_in,
   4028      1.1     skrll       _bfd_xcoff_swap_aux_out,
   4029      1.1     skrll       _bfd_xcoff_swap_sym_out,
   4030      1.1     skrll       coff_swap_lineno_out,
   4031      1.1     skrll       xcoff_swap_reloc_out,
   4032      1.1     skrll       coff_swap_filehdr_out,
   4033      1.1     skrll       coff_swap_aouthdr_out,
   4034      1.1     skrll       coff_swap_scnhdr_out,
   4035      1.1     skrll       FILHSZ,
   4036      1.1     skrll       AOUTSZ,
   4037      1.1     skrll       SCNHSZ,
   4038  1.1.1.2  christos       SYMESZ,
   4039      1.1     skrll       AUXESZ,
   4040      1.1     skrll       RELSZ,
   4041      1.1     skrll       LINESZ,
   4042      1.1     skrll       FILNMLEN,
   4043      1.1     skrll       TRUE,			/* _bfd_coff_long_filenames */
   4044      1.1     skrll       XCOFF_NO_LONG_SECTION_NAMES,  /* _bfd_coff_long_section_names */
   4045      1.1     skrll       3,			/* _bfd_coff_default_section_alignment_power */
   4046      1.1     skrll       FALSE,			/* _bfd_coff_force_symnames_in_strings */
   4047      1.1     skrll       2,			/* _bfd_coff_debug_string_prefix_length */
   4048      1.1     skrll       coff_swap_filehdr_in,
   4049      1.1     skrll       coff_swap_aouthdr_in,
   4050      1.1     skrll       coff_swap_scnhdr_in,
   4051      1.1     skrll       xcoff_swap_reloc_in,
   4052      1.1     skrll       coff_bad_format_hook,
   4053      1.1     skrll       coff_set_arch_mach_hook,
   4054      1.1     skrll       coff_mkobject_hook,
   4055      1.1     skrll       styp_to_sec_flags,
   4056      1.1     skrll       coff_set_alignment_hook,
   4057      1.1     skrll       coff_slurp_symbol_table,
   4058      1.1     skrll       symname_in_debug_hook,
   4059      1.1     skrll       coff_pointerize_aux_hook,
   4060      1.1     skrll       coff_print_aux,
   4061      1.1     skrll       dummy_reloc16_extra_cases,
   4062      1.1     skrll       dummy_reloc16_estimate,
   4063      1.1     skrll       NULL,			/* bfd_coff_sym_is_global */
   4064      1.1     skrll       coff_compute_section_file_positions,
   4065      1.1     skrll       NULL,			/* _bfd_coff_start_final_link */
   4066      1.1     skrll       xcoff_ppc_relocate_section,
   4067      1.1     skrll       coff_rtype_to_howto,
   4068      1.1     skrll       NULL,			/* _bfd_coff_adjust_symndx */
   4069      1.1     skrll       _bfd_generic_link_add_one_symbol,
   4070      1.1     skrll       coff_link_output_has_begun,
   4071      1.1     skrll       coff_final_link_postscript,
   4072      1.1     skrll       NULL			/* print_pdata.  */
   4073      1.1     skrll     },
   4074      1.1     skrll 
   4075      1.1     skrll     0x01DF,			/* magic number */
   4076      1.1     skrll     bfd_arch_rs6000,
   4077      1.1     skrll     bfd_mach_rs6k,
   4078      1.1     skrll 
   4079      1.1     skrll     /* Function pointers to xcoff specific swap routines.  */
   4080      1.1     skrll     xcoff_swap_ldhdr_in,
   4081      1.1     skrll     xcoff_swap_ldhdr_out,
   4082      1.1     skrll     xcoff_swap_ldsym_in,
   4083      1.1     skrll     xcoff_swap_ldsym_out,
   4084      1.1     skrll     xcoff_swap_ldrel_in,
   4085      1.1     skrll     xcoff_swap_ldrel_out,
   4086      1.1     skrll 
   4087      1.1     skrll     /* Sizes.  */
   4088      1.1     skrll     LDHDRSZ,
   4089      1.1     skrll     LDSYMSZ,
   4090      1.1     skrll     LDRELSZ,
   4091      1.1     skrll     12,				/* _xcoff_function_descriptor_size */
   4092      1.1     skrll     SMALL_AOUTSZ,
   4093      1.1     skrll 
   4094      1.1     skrll     /* Versions.  */
   4095      1.1     skrll     1,				/* _xcoff_ldhdr_version */
   4096      1.1     skrll 
   4097      1.1     skrll     _bfd_xcoff_put_symbol_name,
   4098      1.1     skrll     _bfd_xcoff_put_ldsymbol_name,
   4099      1.1     skrll     &xcoff_dynamic_reloc,
   4100      1.1     skrll     xcoff_create_csect_from_smclas,
   4101      1.1     skrll 
   4102      1.1     skrll     /* Lineno and reloc count overflow.  */
   4103      1.1     skrll     xcoff_is_lineno_count_overflow,
   4104      1.1     skrll     xcoff_is_reloc_count_overflow,
   4105      1.1     skrll 
   4106      1.1     skrll     xcoff_loader_symbol_offset,
   4107      1.1     skrll     xcoff_loader_reloc_offset,
   4108      1.1     skrll 
   4109      1.1     skrll     /* glink.  */
   4110      1.1     skrll     &xcoff_glink_code[0],
   4111      1.1     skrll     36,				/* _xcoff_glink_size */
   4112      1.1     skrll 
   4113      1.1     skrll     /* rtinit */
   4114      1.1     skrll     64,				/* _xcoff_rtinit_size */
   4115      1.1     skrll     xcoff_generate_rtinit,
   4116      1.1     skrll   };
   4117      1.1     skrll 
   4118      1.1     skrll /* The transfer vector that leads the outside world to all of the above.  */
   4119      1.1     skrll const bfd_target rs6000coff_vec =
   4120      1.1     skrll   {
   4121      1.1     skrll     "aixcoff-rs6000",
   4122      1.1     skrll     bfd_target_xcoff_flavour,
   4123      1.1     skrll     BFD_ENDIAN_BIG,		/* data byte order is big */
   4124      1.1     skrll     BFD_ENDIAN_BIG,		/* header byte order is big */
   4125      1.1     skrll 
   4126      1.1     skrll     (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
   4127      1.1     skrll      | HAS_SYMS | HAS_LOCALS | WP_TEXT),
   4128      1.1     skrll 
   4129      1.1     skrll     SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
   4130      1.1     skrll     0,				/* leading char */
   4131      1.1     skrll     '/',			/* ar_pad_char */
   4132      1.1     skrll     15,				/* ar_max_namelen */
   4133      1.1     skrll 
   4134      1.1     skrll     /* data */
   4135      1.1     skrll     bfd_getb64,
   4136      1.1     skrll     bfd_getb_signed_64,
   4137      1.1     skrll     bfd_putb64,
   4138      1.1     skrll     bfd_getb32,
   4139      1.1     skrll     bfd_getb_signed_32,
   4140      1.1     skrll     bfd_putb32,
   4141      1.1     skrll     bfd_getb16,
   4142      1.1     skrll     bfd_getb_signed_16,
   4143      1.1     skrll     bfd_putb16,
   4144      1.1     skrll 
   4145      1.1     skrll     /* hdrs */
   4146      1.1     skrll     bfd_getb64,
   4147      1.1     skrll     bfd_getb_signed_64,
   4148      1.1     skrll     bfd_putb64,
   4149      1.1     skrll     bfd_getb32,
   4150      1.1     skrll     bfd_getb_signed_32,
   4151      1.1     skrll     bfd_putb32,
   4152      1.1     skrll     bfd_getb16,
   4153      1.1     skrll     bfd_getb_signed_16,
   4154      1.1     skrll     bfd_putb16,
   4155      1.1     skrll 
   4156      1.1     skrll     { /* bfd_check_format */
   4157      1.1     skrll       _bfd_dummy_target,
   4158      1.1     skrll       coff_object_p,
   4159      1.1     skrll       _bfd_xcoff_archive_p,
   4160      1.1     skrll       CORE_FILE_P
   4161      1.1     skrll     },
   4162      1.1     skrll 
   4163      1.1     skrll     { /* bfd_set_format */
   4164      1.1     skrll       bfd_false,
   4165      1.1     skrll       coff_mkobject,
   4166      1.1     skrll       _bfd_generic_mkarchive,
   4167      1.1     skrll       bfd_false
   4168      1.1     skrll     },
   4169      1.1     skrll 
   4170      1.1     skrll     {/* bfd_write_contents */
   4171      1.1     skrll       bfd_false,
   4172      1.1     skrll       coff_write_object_contents,
   4173      1.1     skrll       _bfd_xcoff_write_archive_contents,
   4174      1.1     skrll       bfd_false
   4175      1.1     skrll     },
   4176      1.1     skrll 
   4177      1.1     skrll     /* Generic */
   4178      1.1     skrll     bfd_true,
   4179      1.1     skrll     bfd_true,
   4180  1.1.1.2  christos     coff_new_section_hook,
   4181      1.1     skrll     _bfd_generic_get_section_contents,
   4182  1.1.1.2  christos     _bfd_generic_get_section_contents_in_window,
   4183  1.1.1.2  christos 
   4184  1.1.1.2  christos     /* Copy */
   4185  1.1.1.2  christos     _bfd_xcoff_copy_private_bfd_data,
   4186  1.1.1.2  christos     _bfd_generic_bfd_merge_private_bfd_data,
   4187      1.1     skrll     _bfd_generic_init_private_section_data,
   4188      1.1     skrll     _bfd_generic_bfd_copy_private_section_data,
   4189  1.1.1.2  christos     _bfd_generic_bfd_copy_private_symbol_data,
   4190      1.1     skrll     _bfd_generic_bfd_copy_private_header_data,
   4191      1.1     skrll     _bfd_generic_bfd_set_private_flags,
   4192      1.1     skrll     _bfd_generic_bfd_print_private_bfd_data,
   4193  1.1.1.2  christos 
   4194  1.1.1.2  christos     /* Core */
   4195      1.1     skrll     BFD_JUMP_TABLE_CORE (coff),
   4196      1.1     skrll 
   4197      1.1     skrll     /* Archive */
   4198  1.1.1.2  christos     _bfd_xcoff_slurp_armap,
   4199      1.1     skrll     _bfd_noarchive_slurp_extended_name_table,
   4200      1.1     skrll     _bfd_noarchive_construct_extended_name_table,
   4201      1.1     skrll     bfd_dont_truncate_arname,
   4202      1.1     skrll     _bfd_xcoff_write_armap,
   4203      1.1     skrll     _bfd_xcoff_read_ar_hdr,
   4204      1.1     skrll     _bfd_generic_write_ar_hdr,
   4205      1.1     skrll     _bfd_xcoff_openr_next_archived_file,
   4206      1.1     skrll     _bfd_generic_get_elt_at_index,
   4207      1.1     skrll     _bfd_xcoff_stat_arch_elt,
   4208      1.1     skrll     bfd_true,
   4209      1.1     skrll 
   4210      1.1     skrll     /* Symbols */
   4211      1.1     skrll     coff_get_symtab_upper_bound,
   4212      1.1     skrll     coff_canonicalize_symtab,
   4213      1.1     skrll     coff_make_empty_symbol,
   4214      1.1     skrll     coff_print_symbol,
   4215      1.1     skrll     coff_get_symbol_info,
   4216      1.1     skrll     _bfd_xcoff_is_local_label_name,
   4217      1.1     skrll     coff_bfd_is_target_special_symbol,
   4218      1.1     skrll     coff_get_lineno,
   4219      1.1     skrll     coff_find_nearest_line,
   4220      1.1     skrll     _bfd_generic_find_line,
   4221      1.1     skrll     coff_find_inliner_info,
   4222      1.1     skrll     coff_bfd_make_debug_symbol,
   4223      1.1     skrll     _bfd_generic_read_minisymbols,
   4224      1.1     skrll     _bfd_generic_minisymbol_to_symbol,
   4225      1.1     skrll 
   4226      1.1     skrll     /* Reloc */
   4227      1.1     skrll     coff_get_reloc_upper_bound,
   4228      1.1     skrll     coff_canonicalize_reloc,
   4229      1.1     skrll     _bfd_xcoff_reloc_type_lookup,
   4230      1.1     skrll     _bfd_xcoff_reloc_name_lookup,
   4231      1.1     skrll 
   4232      1.1     skrll     /* Write */
   4233      1.1     skrll     coff_set_arch_mach,
   4234      1.1     skrll     coff_set_section_contents,
   4235      1.1     skrll 
   4236      1.1     skrll     /* Link */
   4237      1.1     skrll     _bfd_xcoff_sizeof_headers,
   4238  1.1.1.2  christos     bfd_generic_get_relocated_section_contents,
   4239      1.1     skrll     bfd_generic_relax_section,
   4240      1.1     skrll     _bfd_xcoff_bfd_link_hash_table_create,
   4241      1.1     skrll     _bfd_generic_link_hash_table_free,
   4242      1.1     skrll     _bfd_xcoff_bfd_link_add_symbols,
   4243      1.1     skrll     _bfd_generic_link_just_syms,
   4244      1.1     skrll     _bfd_generic_copy_link_hash_symbol_type,
   4245      1.1     skrll     _bfd_xcoff_bfd_final_link,
   4246  1.1.1.2  christos     _bfd_generic_link_split_section,
   4247      1.1     skrll     bfd_generic_gc_sections,
   4248      1.1     skrll     bfd_generic_merge_sections,
   4249      1.1     skrll     bfd_generic_is_group_section,
   4250      1.1     skrll     bfd_generic_discard_group,
   4251      1.1     skrll     _bfd_generic_section_already_linked,
   4252      1.1     skrll     _bfd_xcoff_define_common_symbol,
   4253      1.1     skrll 
   4254      1.1     skrll     /* Dynamic */
   4255      1.1     skrll     _bfd_xcoff_get_dynamic_symtab_upper_bound,
   4256      1.1     skrll     _bfd_xcoff_canonicalize_dynamic_symtab,
   4257      1.1     skrll     _bfd_nodynamic_get_synthetic_symtab,
   4258      1.1     skrll     _bfd_xcoff_get_dynamic_reloc_upper_bound,
   4259      1.1     skrll     _bfd_xcoff_canonicalize_dynamic_reloc,
   4260      1.1     skrll 
   4261      1.1     skrll     /* Opposite endian version, none exists */
   4262      1.1     skrll     NULL,
   4263      1.1     skrll 
   4264      1.1     skrll     (void *) &bfd_xcoff_backend_data,
   4265      1.1     skrll   };
   4266      1.1     skrll 
   4267      1.1     skrll /* xcoff-powermac target
   4268      1.1     skrll    Old target.
   4269      1.1     skrll    Only difference between this target and the rs6000 target is the
   4270      1.1     skrll    the default architecture and machine type used in coffcode.h
   4271      1.1     skrll 
   4272      1.1     skrll    PowerPC Macs use the same magic numbers as RS/6000
   4273      1.1     skrll    (because that's how they were bootstrapped originally),
   4274      1.1     skrll    but they are always PowerPC architecture.  */
   4275      1.1     skrll static const struct xcoff_backend_data_rec bfd_pmac_xcoff_backend_data =
   4276      1.1     skrll   {
   4277      1.1     skrll     { /* COFF backend, defined in libcoff.h.  */
   4278      1.1     skrll       _bfd_xcoff_swap_aux_in,
   4279      1.1     skrll       _bfd_xcoff_swap_sym_in,
   4280      1.1     skrll       coff_swap_lineno_in,
   4281      1.1     skrll       _bfd_xcoff_swap_aux_out,
   4282      1.1     skrll       _bfd_xcoff_swap_sym_out,
   4283      1.1     skrll       coff_swap_lineno_out,
   4284      1.1     skrll       xcoff_swap_reloc_out,
   4285      1.1     skrll       coff_swap_filehdr_out,
   4286      1.1     skrll       coff_swap_aouthdr_out,
   4287      1.1     skrll       coff_swap_scnhdr_out,
   4288      1.1     skrll       FILHSZ,
   4289      1.1     skrll       AOUTSZ,
   4290      1.1     skrll       SCNHSZ,
   4291  1.1.1.2  christos       SYMESZ,
   4292      1.1     skrll       AUXESZ,
   4293      1.1     skrll       RELSZ,
   4294      1.1     skrll       LINESZ,
   4295      1.1     skrll       FILNMLEN,
   4296      1.1     skrll       TRUE,			/* _bfd_coff_long_filenames */
   4297      1.1     skrll       XCOFF_NO_LONG_SECTION_NAMES,  /* _bfd_coff_long_section_names */
   4298      1.1     skrll       3,			/* _bfd_coff_default_section_alignment_power */
   4299      1.1     skrll       FALSE,			/* _bfd_coff_force_symnames_in_strings */
   4300      1.1     skrll       2,			/* _bfd_coff_debug_string_prefix_length */
   4301      1.1     skrll       coff_swap_filehdr_in,
   4302      1.1     skrll       coff_swap_aouthdr_in,
   4303      1.1     skrll       coff_swap_scnhdr_in,
   4304      1.1     skrll       xcoff_swap_reloc_in,
   4305      1.1     skrll       coff_bad_format_hook,
   4306      1.1     skrll       coff_set_arch_mach_hook,
   4307      1.1     skrll       coff_mkobject_hook,
   4308      1.1     skrll       styp_to_sec_flags,
   4309      1.1     skrll       coff_set_alignment_hook,
   4310      1.1     skrll       coff_slurp_symbol_table,
   4311      1.1     skrll       symname_in_debug_hook,
   4312      1.1     skrll       coff_pointerize_aux_hook,
   4313      1.1     skrll       coff_print_aux,
   4314      1.1     skrll       dummy_reloc16_extra_cases,
   4315      1.1     skrll       dummy_reloc16_estimate,
   4316      1.1     skrll       NULL,			/* bfd_coff_sym_is_global */
   4317      1.1     skrll       coff_compute_section_file_positions,
   4318      1.1     skrll       NULL,			/* _bfd_coff_start_final_link */
   4319      1.1     skrll       xcoff_ppc_relocate_section,
   4320      1.1     skrll       coff_rtype_to_howto,
   4321      1.1     skrll       NULL,			/* _bfd_coff_adjust_symndx */
   4322      1.1     skrll       _bfd_generic_link_add_one_symbol,
   4323      1.1     skrll       coff_link_output_has_begun,
   4324      1.1     skrll       coff_final_link_postscript,
   4325      1.1     skrll       NULL			/* print_pdata.  */
   4326      1.1     skrll     },
   4327      1.1     skrll 
   4328      1.1     skrll     0x01DF,			/* magic number */
   4329      1.1     skrll     bfd_arch_powerpc,
   4330      1.1     skrll     bfd_mach_ppc,
   4331      1.1     skrll 
   4332      1.1     skrll     /* Function pointers to xcoff specific swap routines.  */
   4333      1.1     skrll     xcoff_swap_ldhdr_in,
   4334      1.1     skrll     xcoff_swap_ldhdr_out,
   4335      1.1     skrll     xcoff_swap_ldsym_in,
   4336      1.1     skrll     xcoff_swap_ldsym_out,
   4337      1.1     skrll     xcoff_swap_ldrel_in,
   4338      1.1     skrll     xcoff_swap_ldrel_out,
   4339      1.1     skrll 
   4340      1.1     skrll     /* Sizes.  */
   4341      1.1     skrll     LDHDRSZ,
   4342      1.1     skrll     LDSYMSZ,
   4343      1.1     skrll     LDRELSZ,
   4344      1.1     skrll     12,				/* _xcoff_function_descriptor_size */
   4345      1.1     skrll     SMALL_AOUTSZ,
   4346      1.1     skrll 
   4347      1.1     skrll     /* Versions.  */
   4348      1.1     skrll     1,				/* _xcoff_ldhdr_version */
   4349      1.1     skrll 
   4350      1.1     skrll     _bfd_xcoff_put_symbol_name,
   4351      1.1     skrll     _bfd_xcoff_put_ldsymbol_name,
   4352      1.1     skrll     &xcoff_dynamic_reloc,
   4353      1.1     skrll     xcoff_create_csect_from_smclas,
   4354      1.1     skrll 
   4355      1.1     skrll     /* Lineno and reloc count overflow.  */
   4356      1.1     skrll     xcoff_is_lineno_count_overflow,
   4357      1.1     skrll     xcoff_is_reloc_count_overflow,
   4358      1.1     skrll 
   4359      1.1     skrll     xcoff_loader_symbol_offset,
   4360      1.1     skrll     xcoff_loader_reloc_offset,
   4361      1.1     skrll 
   4362      1.1     skrll     /* glink.  */
   4363      1.1     skrll     &xcoff_glink_code[0],
   4364      1.1     skrll     36,				/* _xcoff_glink_size */
   4365      1.1     skrll 
   4366      1.1     skrll     /* rtinit */
   4367      1.1     skrll     0,				/* _xcoff_rtinit_size */
   4368      1.1     skrll     xcoff_generate_rtinit,
   4369      1.1     skrll   };
   4370      1.1     skrll 
   4371      1.1     skrll /* The transfer vector that leads the outside world to all of the above.  */
   4372      1.1     skrll const bfd_target pmac_xcoff_vec =
   4373      1.1     skrll   {
   4374      1.1     skrll     "xcoff-powermac",
   4375      1.1     skrll     bfd_target_xcoff_flavour,
   4376      1.1     skrll     BFD_ENDIAN_BIG,		/* data byte order is big */
   4377      1.1     skrll     BFD_ENDIAN_BIG,		/* header byte order is big */
   4378      1.1     skrll 
   4379      1.1     skrll     (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
   4380      1.1     skrll      | HAS_SYMS | HAS_LOCALS | WP_TEXT),
   4381      1.1     skrll 
   4382      1.1     skrll     SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
   4383      1.1     skrll     0,				/* leading char */
   4384      1.1     skrll     '/',			/* ar_pad_char */
   4385      1.1     skrll     15,				/* ar_max_namelen */
   4386      1.1     skrll 
   4387      1.1     skrll     /* data */
   4388      1.1     skrll     bfd_getb64,
   4389      1.1     skrll     bfd_getb_signed_64,
   4390      1.1     skrll     bfd_putb64,
   4391      1.1     skrll     bfd_getb32,
   4392      1.1     skrll     bfd_getb_signed_32,
   4393      1.1     skrll     bfd_putb32,
   4394      1.1     skrll     bfd_getb16,
   4395      1.1     skrll     bfd_getb_signed_16,
   4396      1.1     skrll     bfd_putb16,
   4397      1.1     skrll 
   4398      1.1     skrll     /* hdrs */
   4399      1.1     skrll     bfd_getb64,
   4400      1.1     skrll     bfd_getb_signed_64,
   4401      1.1     skrll     bfd_putb64,
   4402      1.1     skrll     bfd_getb32,
   4403      1.1     skrll     bfd_getb_signed_32,
   4404      1.1     skrll     bfd_putb32,
   4405      1.1     skrll     bfd_getb16,
   4406      1.1     skrll     bfd_getb_signed_16,
   4407      1.1     skrll     bfd_putb16,
   4408      1.1     skrll 
   4409      1.1     skrll     { /* bfd_check_format */
   4410      1.1     skrll       _bfd_dummy_target,
   4411      1.1     skrll       coff_object_p,
   4412      1.1     skrll       _bfd_xcoff_archive_p,
   4413      1.1     skrll       CORE_FILE_P
   4414      1.1     skrll     },
   4415      1.1     skrll 
   4416      1.1     skrll     { /* bfd_set_format */
   4417      1.1     skrll       bfd_false,
   4418      1.1     skrll       coff_mkobject,
   4419      1.1     skrll       _bfd_generic_mkarchive,
   4420      1.1     skrll       bfd_false
   4421      1.1     skrll     },
   4422      1.1     skrll 
   4423      1.1     skrll     {/* bfd_write_contents */
   4424      1.1     skrll       bfd_false,
   4425      1.1     skrll       coff_write_object_contents,
   4426      1.1     skrll       _bfd_xcoff_write_archive_contents,
   4427      1.1     skrll       bfd_false
   4428      1.1     skrll     },
   4429      1.1     skrll 
   4430      1.1     skrll     /* Generic */
   4431      1.1     skrll     bfd_true,
   4432      1.1     skrll     bfd_true,
   4433  1.1.1.2  christos     coff_new_section_hook,
   4434      1.1     skrll     _bfd_generic_get_section_contents,
   4435  1.1.1.2  christos     _bfd_generic_get_section_contents_in_window,
   4436  1.1.1.2  christos 
   4437  1.1.1.2  christos     /* Copy */
   4438  1.1.1.2  christos     _bfd_xcoff_copy_private_bfd_data,
   4439  1.1.1.2  christos     _bfd_generic_bfd_merge_private_bfd_data,
   4440      1.1     skrll     _bfd_generic_init_private_section_data,
   4441      1.1     skrll     _bfd_generic_bfd_copy_private_section_data,
   4442  1.1.1.2  christos     _bfd_generic_bfd_copy_private_symbol_data,
   4443      1.1     skrll     _bfd_generic_bfd_copy_private_header_data,
   4444      1.1     skrll     _bfd_generic_bfd_set_private_flags,
   4445      1.1     skrll     _bfd_generic_bfd_print_private_bfd_data,
   4446  1.1.1.2  christos 
   4447  1.1.1.2  christos     /* Core */
   4448      1.1     skrll     BFD_JUMP_TABLE_CORE (coff),
   4449      1.1     skrll 
   4450      1.1     skrll     /* Archive */
   4451  1.1.1.2  christos     _bfd_xcoff_slurp_armap,
   4452      1.1     skrll     _bfd_noarchive_slurp_extended_name_table,
   4453      1.1     skrll     _bfd_noarchive_construct_extended_name_table,
   4454      1.1     skrll     bfd_dont_truncate_arname,
   4455      1.1     skrll     _bfd_xcoff_write_armap,
   4456      1.1     skrll     _bfd_xcoff_read_ar_hdr,
   4457      1.1     skrll     _bfd_generic_write_ar_hdr,
   4458      1.1     skrll     _bfd_xcoff_openr_next_archived_file,
   4459      1.1     skrll     _bfd_generic_get_elt_at_index,
   4460      1.1     skrll     _bfd_xcoff_stat_arch_elt,
   4461      1.1     skrll     bfd_true,
   4462      1.1     skrll 
   4463      1.1     skrll     /* Symbols */
   4464      1.1     skrll     coff_get_symtab_upper_bound,
   4465      1.1     skrll     coff_canonicalize_symtab,
   4466      1.1     skrll     coff_make_empty_symbol,
   4467      1.1     skrll     coff_print_symbol,
   4468      1.1     skrll     coff_get_symbol_info,
   4469      1.1     skrll     _bfd_xcoff_is_local_label_name,
   4470      1.1     skrll     coff_bfd_is_target_special_symbol,
   4471      1.1     skrll     coff_get_lineno,
   4472      1.1     skrll     coff_find_nearest_line,
   4473      1.1     skrll     _bfd_generic_find_line,
   4474      1.1     skrll     coff_find_inliner_info,
   4475      1.1     skrll     coff_bfd_make_debug_symbol,
   4476      1.1     skrll     _bfd_generic_read_minisymbols,
   4477      1.1     skrll     _bfd_generic_minisymbol_to_symbol,
   4478      1.1     skrll 
   4479      1.1     skrll     /* Reloc */
   4480      1.1     skrll     coff_get_reloc_upper_bound,
   4481      1.1     skrll     coff_canonicalize_reloc,
   4482      1.1     skrll     _bfd_xcoff_reloc_type_lookup,
   4483      1.1     skrll     _bfd_xcoff_reloc_name_lookup,
   4484      1.1     skrll 
   4485      1.1     skrll     /* Write */
   4486      1.1     skrll     coff_set_arch_mach,
   4487      1.1     skrll     coff_set_section_contents,
   4488      1.1     skrll 
   4489      1.1     skrll     /* Link */
   4490      1.1     skrll     _bfd_xcoff_sizeof_headers,
   4491  1.1.1.2  christos     bfd_generic_get_relocated_section_contents,
   4492      1.1     skrll     bfd_generic_relax_section,
   4493      1.1     skrll     _bfd_xcoff_bfd_link_hash_table_create,
   4494      1.1     skrll     _bfd_generic_link_hash_table_free,
   4495      1.1     skrll     _bfd_xcoff_bfd_link_add_symbols,
   4496      1.1     skrll     _bfd_generic_link_just_syms,
   4497      1.1     skrll     _bfd_generic_copy_link_hash_symbol_type,
   4498      1.1     skrll     _bfd_xcoff_bfd_final_link,
   4499  1.1.1.2  christos     _bfd_generic_link_split_section,
   4500      1.1     skrll     bfd_generic_gc_sections,
   4501      1.1     skrll     bfd_generic_merge_sections,
   4502      1.1     skrll     bfd_generic_is_group_section,
   4503      1.1     skrll     bfd_generic_discard_group,
   4504      1.1     skrll     _bfd_generic_section_already_linked,
   4505      1.1     skrll     _bfd_xcoff_define_common_symbol,
   4506      1.1     skrll 
   4507      1.1     skrll     /* Dynamic */
   4508      1.1     skrll     _bfd_xcoff_get_dynamic_symtab_upper_bound,
   4509      1.1     skrll     _bfd_xcoff_canonicalize_dynamic_symtab,
   4510      1.1     skrll     _bfd_nodynamic_get_synthetic_symtab,
   4511      1.1     skrll     _bfd_xcoff_get_dynamic_reloc_upper_bound,
   4512      1.1     skrll     _bfd_xcoff_canonicalize_dynamic_reloc,
   4513                    
   4514                        /* Opposite endian version, none exists */
   4515                        NULL,
   4516                    
   4517                        (void *) &bfd_pmac_xcoff_backend_data,
   4518                      };
   4519