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