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