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