Home | History | Annotate | Line # | Download | only in bfd
elf64-mips.c revision 1.1
      1  1.1  skrll /* MIPS-specific support for 64-bit ELF
      2  1.1  skrll    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
      3  1.1  skrll    2007 Free Software Foundation, Inc.
      4  1.1  skrll    Ian Lance Taylor, Cygnus Support
      5  1.1  skrll    Linker support added by Mark Mitchell, CodeSourcery, LLC.
      6  1.1  skrll    <mark (at) codesourcery.com>
      7  1.1  skrll 
      8  1.1  skrll    This file is part of BFD, the Binary File Descriptor library.
      9  1.1  skrll 
     10  1.1  skrll    This program is free software; you can redistribute it and/or modify
     11  1.1  skrll    it under the terms of the GNU General Public License as published by
     12  1.1  skrll    the Free Software Foundation; either version 3 of the License, or
     13  1.1  skrll    (at your option) any later version.
     14  1.1  skrll 
     15  1.1  skrll    This program is distributed in the hope that it will be useful,
     16  1.1  skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     17  1.1  skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18  1.1  skrll    GNU General Public License for more details.
     19  1.1  skrll 
     20  1.1  skrll    You should have received a copy of the GNU General Public License
     21  1.1  skrll    along with this program; if not, write to the Free Software
     22  1.1  skrll    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     23  1.1  skrll    MA 02110-1301, USA.  */
     24  1.1  skrll 
     25  1.1  skrll 
     26  1.1  skrll /* This file supports the 64-bit MIPS ELF ABI.
     27  1.1  skrll 
     28  1.1  skrll    The MIPS 64-bit ELF ABI uses an unusual reloc format.  This file
     29  1.1  skrll    overrides the usual ELF reloc handling, and handles reading and
     30  1.1  skrll    writing the relocations here.  */
     31  1.1  skrll 
     32  1.1  skrll /* TODO: Many things are unsupported, even if there is some code for it
     33  1.1  skrll  .       (which was mostly stolen from elf32-mips.c and slightly adapted).
     34  1.1  skrll  .
     35  1.1  skrll  .   - Relocation handling for REL relocs is wrong in many cases and
     36  1.1  skrll  .     generally untested.
     37  1.1  skrll  .   - Relocation handling for RELA relocs related to GOT support are
     38  1.1  skrll  .     also likely to be wrong.
     39  1.1  skrll  .   - Support for MIPS16 is untested.
     40  1.1  skrll  .   - Combined relocs with RSS_* entries are unsupported.
     41  1.1  skrll  .   - The whole GOT handling for NewABI is missing, some parts of
     42  1.1  skrll  .     the OldABI version is still lying around and should be removed.
     43  1.1  skrll  */
     44  1.1  skrll 
     45  1.1  skrll #include "sysdep.h"
     46  1.1  skrll #include "bfd.h"
     47  1.1  skrll #include "libbfd.h"
     48  1.1  skrll #include "aout/ar.h"
     49  1.1  skrll #include "bfdlink.h"
     50  1.1  skrll #include "genlink.h"
     51  1.1  skrll #include "elf-bfd.h"
     52  1.1  skrll #include "elfxx-mips.h"
     53  1.1  skrll #include "elf/mips.h"
     54  1.1  skrll 
     55  1.1  skrll /* Get the ECOFF swapping routines.  The 64-bit ABI is not supposed to
     56  1.1  skrll    use ECOFF.  However, we support it anyhow for an easier changeover.  */
     57  1.1  skrll #include "coff/sym.h"
     58  1.1  skrll #include "coff/symconst.h"
     59  1.1  skrll #include "coff/internal.h"
     60  1.1  skrll #include "coff/ecoff.h"
     61  1.1  skrll /* The 64 bit versions of the mdebug data structures are in alpha.h.  */
     62  1.1  skrll #include "coff/alpha.h"
     63  1.1  skrll #define ECOFF_SIGNED_64
     64  1.1  skrll #include "ecoffswap.h"
     65  1.1  skrll 
     66  1.1  skrll static void mips_elf64_swap_reloc_in
     67  1.1  skrll   (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
     68  1.1  skrll static void mips_elf64_swap_reloca_in
     69  1.1  skrll   (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
     70  1.1  skrll static void mips_elf64_swap_reloc_out
     71  1.1  skrll   (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
     72  1.1  skrll static void mips_elf64_swap_reloca_out
     73  1.1  skrll   (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
     74  1.1  skrll static void mips_elf64_be_swap_reloc_in
     75  1.1  skrll   (bfd *, const bfd_byte *, Elf_Internal_Rela *);
     76  1.1  skrll static void mips_elf64_be_swap_reloc_out
     77  1.1  skrll   (bfd *, const Elf_Internal_Rela *, bfd_byte *);
     78  1.1  skrll static void mips_elf64_be_swap_reloca_in
     79  1.1  skrll   (bfd *, const bfd_byte *, Elf_Internal_Rela *);
     80  1.1  skrll static void mips_elf64_be_swap_reloca_out
     81  1.1  skrll   (bfd *, const Elf_Internal_Rela *, bfd_byte *);
     82  1.1  skrll static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
     83  1.1  skrll   (bfd *, bfd_reloc_code_real_type);
     84  1.1  skrll static reloc_howto_type *mips_elf64_rtype_to_howto
     85  1.1  skrll   (unsigned int, bfd_boolean);
     86  1.1  skrll static void mips_elf64_info_to_howto_rel
     87  1.1  skrll   (bfd *, arelent *, Elf_Internal_Rela *);
     88  1.1  skrll static void mips_elf64_info_to_howto_rela
     89  1.1  skrll   (bfd *, arelent *, Elf_Internal_Rela *);
     90  1.1  skrll static long mips_elf64_get_reloc_upper_bound
     91  1.1  skrll   (bfd *, asection *);
     92  1.1  skrll static long mips_elf64_canonicalize_reloc
     93  1.1  skrll   (bfd *, asection *, arelent **, asymbol **);
     94  1.1  skrll static long mips_elf64_get_dynamic_reloc_upper_bound
     95  1.1  skrll   (bfd *);
     96  1.1  skrll static long mips_elf64_canonicalize_dynamic_reloc
     97  1.1  skrll   (bfd *, arelent **, asymbol **);
     98  1.1  skrll static bfd_boolean mips_elf64_slurp_one_reloc_table
     99  1.1  skrll   (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
    100  1.1  skrll    asymbol **, bfd_boolean);
    101  1.1  skrll static bfd_boolean mips_elf64_slurp_reloc_table
    102  1.1  skrll   (bfd *, asection *, asymbol **, bfd_boolean);
    103  1.1  skrll static void mips_elf64_write_relocs
    104  1.1  skrll   (bfd *, asection *, void *);
    105  1.1  skrll static void mips_elf64_write_rel
    106  1.1  skrll   (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
    107  1.1  skrll static void mips_elf64_write_rela
    108  1.1  skrll   (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
    109  1.1  skrll static bfd_reloc_status_type mips_elf64_gprel16_reloc
    110  1.1  skrll   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
    111  1.1  skrll static bfd_reloc_status_type mips_elf64_literal_reloc
    112  1.1  skrll   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
    113  1.1  skrll static bfd_reloc_status_type mips_elf64_gprel32_reloc
    114  1.1  skrll   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
    115  1.1  skrll static bfd_reloc_status_type mips_elf64_shift6_reloc
    116  1.1  skrll   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
    117  1.1  skrll static bfd_reloc_status_type mips16_gprel_reloc
    118  1.1  skrll   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
    119  1.1  skrll static bfd_boolean mips_elf64_assign_gp
    120  1.1  skrll   (bfd *, bfd_vma *);
    121  1.1  skrll static bfd_reloc_status_type mips_elf64_final_gp
    122  1.1  skrll   (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
    123  1.1  skrll static bfd_boolean mips_elf64_object_p
    124  1.1  skrll   (bfd *);
    125  1.1  skrll static irix_compat_t elf64_mips_irix_compat
    126  1.1  skrll   (bfd *);
    127  1.1  skrll static bfd_boolean elf64_mips_grok_prstatus
    128  1.1  skrll   (bfd *, Elf_Internal_Note *);
    129  1.1  skrll static bfd_boolean elf64_mips_grok_psinfo
    130  1.1  skrll   (bfd *, Elf_Internal_Note *);
    131  1.1  skrll 
    132  1.1  skrll extern const bfd_target bfd_elf64_bigmips_vec;
    133  1.1  skrll extern const bfd_target bfd_elf64_littlemips_vec;
    134  1.1  skrll 
    135  1.1  skrll /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
    136  1.1  skrll    from smaller values.  Start with zero, widen, *then* decrement.  */
    137  1.1  skrll #define MINUS_ONE	(((bfd_vma)0) - 1)
    138  1.1  skrll 
    139  1.1  skrll /* The number of local .got entries we reserve.  */
    140  1.1  skrll #define MIPS_RESERVED_GOTNO (2)
    141  1.1  skrll 
    142  1.1  skrll /* The relocation table used for SHT_REL sections.  */
    144  1.1  skrll 
    145  1.1  skrll static reloc_howto_type mips_elf64_howto_table_rel[] =
    146  1.1  skrll {
    147  1.1  skrll   /* No relocation.  */
    148  1.1  skrll   HOWTO (R_MIPS_NONE,		/* type */
    149  1.1  skrll 	 0,			/* rightshift */
    150  1.1  skrll 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    151  1.1  skrll 	 0,			/* bitsize */
    152  1.1  skrll 	 FALSE,			/* pc_relative */
    153  1.1  skrll 	 0,			/* bitpos */
    154  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    155  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    156  1.1  skrll 	 "R_MIPS_NONE",		/* name */
    157  1.1  skrll 	 FALSE,			/* partial_inplace */
    158  1.1  skrll 	 0,			/* src_mask */
    159  1.1  skrll 	 0,			/* dst_mask */
    160  1.1  skrll 	 FALSE),		/* pcrel_offset */
    161  1.1  skrll 
    162  1.1  skrll   /* 16 bit relocation.  */
    163  1.1  skrll   HOWTO (R_MIPS_16,		/* type */
    164  1.1  skrll 	 0,			/* rightshift */
    165  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    166  1.1  skrll 	 16,			/* bitsize */
    167  1.1  skrll 	 FALSE,			/* pc_relative */
    168  1.1  skrll 	 0,			/* bitpos */
    169  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    170  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    171  1.1  skrll 	 "R_MIPS_16",		/* name */
    172  1.1  skrll 	 TRUE,			/* partial_inplace */
    173  1.1  skrll 	 0x0000ffff,		/* src_mask */
    174  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    175  1.1  skrll 	 FALSE),		/* pcrel_offset */
    176  1.1  skrll 
    177  1.1  skrll   /* 32 bit relocation.  */
    178  1.1  skrll   HOWTO (R_MIPS_32,		/* type */
    179  1.1  skrll 	 0,			/* rightshift */
    180  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    181  1.1  skrll 	 32,			/* bitsize */
    182  1.1  skrll 	 FALSE,			/* pc_relative */
    183  1.1  skrll 	 0,			/* bitpos */
    184  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    185  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    186  1.1  skrll 	 "R_MIPS_32",		/* name */
    187  1.1  skrll 	 TRUE,			/* partial_inplace */
    188  1.1  skrll 	 0xffffffff,		/* src_mask */
    189  1.1  skrll 	 0xffffffff,		/* dst_mask */
    190  1.1  skrll 	 FALSE),		/* pcrel_offset */
    191  1.1  skrll 
    192  1.1  skrll   /* 32 bit symbol relative relocation.  */
    193  1.1  skrll   HOWTO (R_MIPS_REL32,		/* type */
    194  1.1  skrll 	 0,			/* rightshift */
    195  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    196  1.1  skrll 	 32,			/* bitsize */
    197  1.1  skrll 	 FALSE,			/* pc_relative */
    198  1.1  skrll 	 0,			/* bitpos */
    199  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    200  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    201  1.1  skrll 	 "R_MIPS_REL32",	/* name */
    202  1.1  skrll 	 TRUE,			/* partial_inplace */
    203  1.1  skrll 	 0xffffffff,		/* src_mask */
    204  1.1  skrll 	 0xffffffff,		/* dst_mask */
    205  1.1  skrll 	 FALSE),		/* pcrel_offset */
    206  1.1  skrll 
    207  1.1  skrll   /* 26 bit jump address.  */
    208  1.1  skrll   HOWTO (R_MIPS_26,		/* type */
    209  1.1  skrll 	 2,			/* rightshift */
    210  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    211  1.1  skrll 	 26,			/* bitsize */
    212  1.1  skrll 	 FALSE,			/* pc_relative */
    213  1.1  skrll 	 0,			/* bitpos */
    214  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    215  1.1  skrll 				/* This needs complex overflow
    216  1.1  skrll 				   detection, because the upper 36
    217  1.1  skrll 				   bits must match the PC + 4.  */
    218  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    219  1.1  skrll 	 "R_MIPS_26",		/* name */
    220  1.1  skrll 	 TRUE,			/* partial_inplace */
    221  1.1  skrll 	 0x03ffffff,		/* src_mask */
    222  1.1  skrll 	 0x03ffffff,		/* dst_mask */
    223  1.1  skrll 	 FALSE),		/* pcrel_offset */
    224  1.1  skrll 
    225  1.1  skrll   /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
    226  1.1  skrll      However, the native IRIX6 tools use them, so we try our best. */
    227  1.1  skrll 
    228  1.1  skrll   /* High 16 bits of symbol value.  */
    229  1.1  skrll   HOWTO (R_MIPS_HI16,		/* type */
    230  1.1  skrll 	 16,			/* rightshift */
    231  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    232  1.1  skrll 	 16,			/* bitsize */
    233  1.1  skrll 	 FALSE,			/* pc_relative */
    234  1.1  skrll 	 0,			/* bitpos */
    235  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    236  1.1  skrll 	 _bfd_mips_elf_hi16_reloc, /* special_function */
    237  1.1  skrll 	 "R_MIPS_HI16",		/* name */
    238  1.1  skrll 	 TRUE,			/* partial_inplace */
    239  1.1  skrll 	 0x0000ffff,		/* src_mask */
    240  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    241  1.1  skrll 	 FALSE),		/* pcrel_offset */
    242  1.1  skrll 
    243  1.1  skrll   /* Low 16 bits of symbol value.  */
    244  1.1  skrll   HOWTO (R_MIPS_LO16,		/* type */
    245  1.1  skrll 	 0,			/* rightshift */
    246  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    247  1.1  skrll 	 16,			/* bitsize */
    248  1.1  skrll 	 FALSE,			/* pc_relative */
    249  1.1  skrll 	 0,			/* bitpos */
    250  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    251  1.1  skrll 	 _bfd_mips_elf_lo16_reloc, /* special_function */
    252  1.1  skrll 	 "R_MIPS_LO16",		/* name */
    253  1.1  skrll 	 TRUE,			/* partial_inplace */
    254  1.1  skrll 	 0x0000ffff,		/* src_mask */
    255  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    256  1.1  skrll 	 FALSE),		/* pcrel_offset */
    257  1.1  skrll 
    258  1.1  skrll   /* GP relative reference.  */
    259  1.1  skrll   HOWTO (R_MIPS_GPREL16,	/* type */
    260  1.1  skrll 	 0,			/* rightshift */
    261  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    262  1.1  skrll 	 16,			/* bitsize */
    263  1.1  skrll 	 FALSE,			/* pc_relative */
    264  1.1  skrll 	 0,			/* bitpos */
    265  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    266  1.1  skrll 	 mips_elf64_gprel16_reloc, /* special_function */
    267  1.1  skrll 	 "R_MIPS_GPREL16",	/* name */
    268  1.1  skrll 	 TRUE,			/* partial_inplace */
    269  1.1  skrll 	 0x0000ffff,		/* src_mask */
    270  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    271  1.1  skrll 	 FALSE),		/* pcrel_offset */
    272  1.1  skrll 
    273  1.1  skrll   /* Reference to literal section.  */
    274  1.1  skrll   HOWTO (R_MIPS_LITERAL,	/* type */
    275  1.1  skrll 	 0,			/* rightshift */
    276  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    277  1.1  skrll 	 16,			/* bitsize */
    278  1.1  skrll 	 FALSE,			/* pc_relative */
    279  1.1  skrll 	 0,			/* bitpos */
    280  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    281  1.1  skrll 	 mips_elf64_literal_reloc, /* special_function */
    282  1.1  skrll 	 "R_MIPS_LITERAL",	/* name */
    283  1.1  skrll 	 TRUE,			/* partial_inplace */
    284  1.1  skrll 	 0x0000ffff,		/* src_mask */
    285  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    286  1.1  skrll 	 FALSE),		/* pcrel_offset */
    287  1.1  skrll 
    288  1.1  skrll   /* Reference to global offset table.  */
    289  1.1  skrll   HOWTO (R_MIPS_GOT16,		/* type */
    290  1.1  skrll 	 0,			/* rightshift */
    291  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    292  1.1  skrll 	 16,			/* bitsize */
    293  1.1  skrll 	 FALSE,			/* pc_relative */
    294  1.1  skrll 	 0,			/* bitpos */
    295  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    296  1.1  skrll 	 _bfd_mips_elf_got16_reloc, /* special_function */
    297  1.1  skrll 	 "R_MIPS_GOT16",	/* name */
    298  1.1  skrll 	 TRUE,			/* partial_inplace */
    299  1.1  skrll 	 0x0000ffff,		/* src_mask */
    300  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    301  1.1  skrll 	 FALSE),		/* pcrel_offset */
    302  1.1  skrll 
    303  1.1  skrll   /* 16 bit PC relative reference.  Note that the ABI document has a typo
    304  1.1  skrll      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
    305  1.1  skrll      We do the right thing here.  */
    306  1.1  skrll   HOWTO (R_MIPS_PC16,		/* type */
    307  1.1  skrll 	 2,			/* rightshift */
    308  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    309  1.1  skrll 	 16,			/* bitsize */
    310  1.1  skrll 	 TRUE,			/* pc_relative */
    311  1.1  skrll 	 0,			/* bitpos */
    312  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    313  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    314  1.1  skrll 	 "R_MIPS_PC16",		/* name */
    315  1.1  skrll 	 TRUE,			/* partial_inplace */
    316  1.1  skrll 	 0x0000ffff,		/* src_mask */
    317  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    318  1.1  skrll 	 TRUE),			/* pcrel_offset */
    319  1.1  skrll 
    320  1.1  skrll   /* 16 bit call through global offset table.  */
    321  1.1  skrll   HOWTO (R_MIPS_CALL16,		/* type */
    322  1.1  skrll 	 0,			/* rightshift */
    323  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    324  1.1  skrll 	 16,			/* bitsize */
    325  1.1  skrll 	 FALSE,			/* pc_relative */
    326  1.1  skrll 	 0,			/* bitpos */
    327  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    328  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    329  1.1  skrll 	 "R_MIPS_CALL16",	/* name */
    330  1.1  skrll 	 TRUE,			/* partial_inplace */
    331  1.1  skrll 	 0x0000ffff,		/* src_mask */
    332  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    333  1.1  skrll 	 FALSE),		/* pcrel_offset */
    334  1.1  skrll 
    335  1.1  skrll   /* 32 bit GP relative reference.  */
    336  1.1  skrll   HOWTO (R_MIPS_GPREL32,	/* type */
    337  1.1  skrll 	 0,			/* rightshift */
    338  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    339  1.1  skrll 	 32,			/* bitsize */
    340  1.1  skrll 	 FALSE,			/* pc_relative */
    341  1.1  skrll 	 0,			/* bitpos */
    342  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    343  1.1  skrll 	 mips_elf64_gprel32_reloc, /* special_function */
    344  1.1  skrll 	 "R_MIPS_GPREL32",	/* name */
    345  1.1  skrll 	 TRUE,			/* partial_inplace */
    346  1.1  skrll 	 0xffffffff,		/* src_mask */
    347  1.1  skrll 	 0xffffffff,		/* dst_mask */
    348  1.1  skrll 	 FALSE),		/* pcrel_offset */
    349  1.1  skrll 
    350  1.1  skrll   EMPTY_HOWTO (13),
    351  1.1  skrll   EMPTY_HOWTO (14),
    352  1.1  skrll   EMPTY_HOWTO (15),
    353  1.1  skrll 
    354  1.1  skrll   /* A 5 bit shift field.  */
    355  1.1  skrll   HOWTO (R_MIPS_SHIFT5,		/* type */
    356  1.1  skrll 	 0,			/* rightshift */
    357  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    358  1.1  skrll 	 5,			/* bitsize */
    359  1.1  skrll 	 FALSE,			/* pc_relative */
    360  1.1  skrll 	 6,			/* bitpos */
    361  1.1  skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    362  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    363  1.1  skrll 	 "R_MIPS_SHIFT5",	/* name */
    364  1.1  skrll 	 TRUE,			/* partial_inplace */
    365  1.1  skrll 	 0x000007c0,		/* src_mask */
    366  1.1  skrll 	 0x000007c0,		/* dst_mask */
    367  1.1  skrll 	 FALSE),		/* pcrel_offset */
    368  1.1  skrll 
    369  1.1  skrll   /* A 6 bit shift field.  */
    370  1.1  skrll   HOWTO (R_MIPS_SHIFT6,		/* type */
    371  1.1  skrll 	 0,			/* rightshift */
    372  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    373  1.1  skrll 	 6,			/* bitsize */
    374  1.1  skrll 	 FALSE,			/* pc_relative */
    375  1.1  skrll 	 6,			/* bitpos */
    376  1.1  skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    377  1.1  skrll 	 mips_elf64_shift6_reloc, /* special_function */
    378  1.1  skrll 	 "R_MIPS_SHIFT6",	/* name */
    379  1.1  skrll 	 TRUE,			/* partial_inplace */
    380  1.1  skrll 	 0x000007c4,		/* src_mask */
    381  1.1  skrll 	 0x000007c4,		/* dst_mask */
    382  1.1  skrll 	 FALSE),		/* pcrel_offset */
    383  1.1  skrll 
    384  1.1  skrll   /* 64 bit relocation.  */
    385  1.1  skrll   HOWTO (R_MIPS_64,		/* type */
    386  1.1  skrll 	 0,			/* rightshift */
    387  1.1  skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    388  1.1  skrll 	 64,			/* bitsize */
    389  1.1  skrll 	 FALSE,			/* pc_relative */
    390  1.1  skrll 	 0,			/* bitpos */
    391  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    392  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    393  1.1  skrll 	 "R_MIPS_64",		/* name */
    394  1.1  skrll 	 TRUE,			/* partial_inplace */
    395  1.1  skrll 	 MINUS_ONE,		/* src_mask */
    396  1.1  skrll 	 MINUS_ONE,		/* dst_mask */
    397  1.1  skrll 	 FALSE),		/* pcrel_offset */
    398  1.1  skrll 
    399  1.1  skrll   /* Displacement in the global offset table.  */
    400  1.1  skrll   HOWTO (R_MIPS_GOT_DISP,	/* type */
    401  1.1  skrll 	 0,			/* rightshift */
    402  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    403  1.1  skrll 	 16,			/* bitsize */
    404  1.1  skrll 	 FALSE,			/* pc_relative */
    405  1.1  skrll 	 0,			/* bitpos */
    406  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    407  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    408  1.1  skrll 	 "R_MIPS_GOT_DISP",	/* name */
    409  1.1  skrll 	 TRUE,			/* partial_inplace */
    410  1.1  skrll 	 0x0000ffff,		/* src_mask */
    411  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    412  1.1  skrll 	 FALSE),		/* pcrel_offset */
    413  1.1  skrll 
    414  1.1  skrll   /* Displacement to page pointer in the global offset table.  */
    415  1.1  skrll   HOWTO (R_MIPS_GOT_PAGE,	/* type */
    416  1.1  skrll 	 0,			/* rightshift */
    417  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    418  1.1  skrll 	 16,			/* bitsize */
    419  1.1  skrll 	 FALSE,			/* pc_relative */
    420  1.1  skrll 	 0,			/* bitpos */
    421  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    422  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    423  1.1  skrll 	 "R_MIPS_GOT_PAGE",	/* name */
    424  1.1  skrll 	 TRUE,			/* partial_inplace */
    425  1.1  skrll 	 0x0000ffff,		/* src_mask */
    426  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    427  1.1  skrll 	 FALSE),		/* pcrel_offset */
    428  1.1  skrll 
    429  1.1  skrll   /* Offset from page pointer in the global offset table.  */
    430  1.1  skrll   HOWTO (R_MIPS_GOT_OFST,	/* type */
    431  1.1  skrll 	 0,			/* rightshift */
    432  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    433  1.1  skrll 	 16,			/* bitsize */
    434  1.1  skrll 	 FALSE,			/* pc_relative */
    435  1.1  skrll 	 0,			/* bitpos */
    436  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    437  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    438  1.1  skrll 	 "R_MIPS_GOT_OFST",	/* name */
    439  1.1  skrll 	 TRUE,			/* partial_inplace */
    440  1.1  skrll 	 0x0000ffff,		/* src_mask */
    441  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    442  1.1  skrll 	 FALSE),		/* pcrel_offset */
    443  1.1  skrll 
    444  1.1  skrll   /* High 16 bits of displacement in global offset table.  */
    445  1.1  skrll   HOWTO (R_MIPS_GOT_HI16,	/* type */
    446  1.1  skrll 	 0,			/* rightshift */
    447  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    448  1.1  skrll 	 16,			/* bitsize */
    449  1.1  skrll 	 FALSE,			/* pc_relative */
    450  1.1  skrll 	 0,			/* bitpos */
    451  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    452  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    453  1.1  skrll 	 "R_MIPS_GOT_HI16",	/* name */
    454  1.1  skrll 	 TRUE,			/* partial_inplace */
    455  1.1  skrll 	 0x0000ffff,		/* src_mask */
    456  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    457  1.1  skrll 	 FALSE),		/* pcrel_offset */
    458  1.1  skrll 
    459  1.1  skrll   /* Low 16 bits of displacement in global offset table.  */
    460  1.1  skrll   HOWTO (R_MIPS_GOT_LO16,	/* type */
    461  1.1  skrll 	 0,			/* rightshift */
    462  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    463  1.1  skrll 	 16,			/* bitsize */
    464  1.1  skrll 	 FALSE,			/* pc_relative */
    465  1.1  skrll 	 0,			/* bitpos */
    466  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    467  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    468  1.1  skrll 	 "R_MIPS_GOT_LO16",	/* name */
    469  1.1  skrll 	 TRUE,			/* partial_inplace */
    470  1.1  skrll 	 0x0000ffff,		/* src_mask */
    471  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    472  1.1  skrll 	 FALSE),		/* pcrel_offset */
    473  1.1  skrll 
    474  1.1  skrll   /* 64 bit subtraction.  */
    475  1.1  skrll   HOWTO (R_MIPS_SUB,		/* type */
    476  1.1  skrll 	 0,			/* rightshift */
    477  1.1  skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    478  1.1  skrll 	 64,			/* bitsize */
    479  1.1  skrll 	 FALSE,			/* pc_relative */
    480  1.1  skrll 	 0,			/* bitpos */
    481  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    482  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    483  1.1  skrll 	 "R_MIPS_SUB",		/* name */
    484  1.1  skrll 	 TRUE,			/* partial_inplace */
    485  1.1  skrll 	 MINUS_ONE,		/* src_mask */
    486  1.1  skrll 	 MINUS_ONE,		/* dst_mask */
    487  1.1  skrll 	 FALSE),		/* pcrel_offset */
    488  1.1  skrll 
    489  1.1  skrll   /* Insert the addend as an instruction.  */
    490  1.1  skrll   /* FIXME: Not handled correctly.  */
    491  1.1  skrll   HOWTO (R_MIPS_INSERT_A,	/* type */
    492  1.1  skrll 	 0,			/* rightshift */
    493  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    494  1.1  skrll 	 32,			/* bitsize */
    495  1.1  skrll 	 FALSE,			/* pc_relative */
    496  1.1  skrll 	 0,			/* bitpos */
    497  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    498  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    499  1.1  skrll 	 "R_MIPS_INSERT_A",	/* name */
    500  1.1  skrll 	 TRUE,			/* partial_inplace */
    501  1.1  skrll 	 0xffffffff,		/* src_mask */
    502  1.1  skrll 	 0xffffffff,		/* dst_mask */
    503  1.1  skrll 	 FALSE),		/* pcrel_offset */
    504  1.1  skrll 
    505  1.1  skrll   /* Insert the addend as an instruction, and change all relocations
    506  1.1  skrll      to refer to the old instruction at the address.  */
    507  1.1  skrll   /* FIXME: Not handled correctly.  */
    508  1.1  skrll   HOWTO (R_MIPS_INSERT_B,	/* type */
    509  1.1  skrll 	 0,			/* rightshift */
    510  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    511  1.1  skrll 	 32,			/* bitsize */
    512  1.1  skrll 	 FALSE,			/* pc_relative */
    513  1.1  skrll 	 0,			/* bitpos */
    514  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    515  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    516  1.1  skrll 	 "R_MIPS_INSERT_B",	/* name */
    517  1.1  skrll 	 TRUE,			/* partial_inplace */
    518  1.1  skrll 	 0xffffffff,		/* src_mask */
    519  1.1  skrll 	 0xffffffff,		/* dst_mask */
    520  1.1  skrll 	 FALSE),		/* pcrel_offset */
    521  1.1  skrll 
    522  1.1  skrll   /* Delete a 32 bit instruction.  */
    523  1.1  skrll   /* FIXME: Not handled correctly.  */
    524  1.1  skrll   HOWTO (R_MIPS_DELETE,		/* type */
    525  1.1  skrll 	 0,			/* rightshift */
    526  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    527  1.1  skrll 	 32,			/* bitsize */
    528  1.1  skrll 	 FALSE,			/* pc_relative */
    529  1.1  skrll 	 0,			/* bitpos */
    530  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    531  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    532  1.1  skrll 	 "R_MIPS_DELETE",	/* name */
    533  1.1  skrll 	 TRUE,			/* partial_inplace */
    534  1.1  skrll 	 0xffffffff,		/* src_mask */
    535  1.1  skrll 	 0xffffffff,		/* dst_mask */
    536  1.1  skrll 	 FALSE),		/* pcrel_offset */
    537  1.1  skrll 
    538  1.1  skrll   /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
    539  1.1  skrll      We don't, because
    540  1.1  skrll        a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
    541  1.1  skrll 	  R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
    542  1.1  skrll 	  fallable heuristics.
    543  1.1  skrll        b) No other NewABI toolchain actually emits such relocations.  */
    544  1.1  skrll   EMPTY_HOWTO (R_MIPS_HIGHER),
    545  1.1  skrll   EMPTY_HOWTO (R_MIPS_HIGHEST),
    546  1.1  skrll 
    547  1.1  skrll   /* High 16 bits of displacement in global offset table.  */
    548  1.1  skrll   HOWTO (R_MIPS_CALL_HI16,	/* type */
    549  1.1  skrll 	 0,			/* rightshift */
    550  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    551  1.1  skrll 	 16,			/* bitsize */
    552  1.1  skrll 	 FALSE,			/* pc_relative */
    553  1.1  skrll 	 0,			/* bitpos */
    554  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    555  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    556  1.1  skrll 	 "R_MIPS_CALL_HI16",	/* name */
    557  1.1  skrll 	 TRUE,			/* partial_inplace */
    558  1.1  skrll 	 0x0000ffff,		/* src_mask */
    559  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    560  1.1  skrll 	 FALSE),		/* pcrel_offset */
    561  1.1  skrll 
    562  1.1  skrll   /* Low 16 bits of displacement in global offset table.  */
    563  1.1  skrll   HOWTO (R_MIPS_CALL_LO16,	/* type */
    564  1.1  skrll 	 0,			/* rightshift */
    565  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    566  1.1  skrll 	 16,			/* bitsize */
    567  1.1  skrll 	 FALSE,			/* pc_relative */
    568  1.1  skrll 	 0,			/* bitpos */
    569  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    570  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    571  1.1  skrll 	 "R_MIPS_CALL_LO16",	/* name */
    572  1.1  skrll 	 TRUE,			/* partial_inplace */
    573  1.1  skrll 	 0x0000ffff,		/* src_mask */
    574  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    575  1.1  skrll 	 FALSE),		/* pcrel_offset */
    576  1.1  skrll 
    577  1.1  skrll   /* Section displacement, used by an associated event location section.  */
    578  1.1  skrll   HOWTO (R_MIPS_SCN_DISP,	/* type */
    579  1.1  skrll 	 0,			/* rightshift */
    580  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    581  1.1  skrll 	 32,			/* bitsize */
    582  1.1  skrll 	 FALSE,			/* pc_relative */
    583  1.1  skrll 	 0,			/* bitpos */
    584  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    585  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    586  1.1  skrll 	 "R_MIPS_SCN_DISP",	/* name */
    587  1.1  skrll 	 TRUE,			/* partial_inplace */
    588  1.1  skrll 	 0xffffffff,		/* src_mask */
    589  1.1  skrll 	 0xffffffff,		/* dst_mask */
    590  1.1  skrll 	 FALSE),		/* pcrel_offset */
    591  1.1  skrll 
    592  1.1  skrll   HOWTO (R_MIPS_REL16,		/* type */
    593  1.1  skrll 	 0,			/* rightshift */
    594  1.1  skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    595  1.1  skrll 	 16,			/* bitsize */
    596  1.1  skrll 	 FALSE,			/* pc_relative */
    597  1.1  skrll 	 0,			/* bitpos */
    598  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    599  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    600  1.1  skrll 	 "R_MIPS_REL16",	/* name */
    601  1.1  skrll 	 TRUE,			/* partial_inplace */
    602  1.1  skrll 	 0xffff,		/* src_mask */
    603  1.1  skrll 	 0xffff,		/* dst_mask */
    604  1.1  skrll 	 FALSE),		/* pcrel_offset */
    605  1.1  skrll 
    606  1.1  skrll   /* These two are obsolete.  */
    607  1.1  skrll   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
    608  1.1  skrll   EMPTY_HOWTO (R_MIPS_PJUMP),
    609  1.1  skrll 
    610  1.1  skrll   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
    611  1.1  skrll      It must be used for multigot GOT's (and only there).  */
    612  1.1  skrll   HOWTO (R_MIPS_RELGOT,		/* type */
    613  1.1  skrll 	 0,			/* rightshift */
    614  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    615  1.1  skrll 	 32,			/* bitsize */
    616  1.1  skrll 	 FALSE,			/* pc_relative */
    617  1.1  skrll 	 0,			/* bitpos */
    618  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    619  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    620  1.1  skrll 	 "R_MIPS_RELGOT",	/* name */
    621  1.1  skrll 	 TRUE,			/* partial_inplace */
    622  1.1  skrll 	 0xffffffff,		/* src_mask */
    623  1.1  skrll 	 0xffffffff,		/* dst_mask */
    624  1.1  skrll 	 FALSE),		/* pcrel_offset */
    625  1.1  skrll 
    626  1.1  skrll   /* Protected jump conversion.  This is an optimization hint.  No
    627  1.1  skrll      relocation is required for correctness.  */
    628  1.1  skrll   HOWTO (R_MIPS_JALR,		/* type */
    629  1.1  skrll 	 0,			/* rightshift */
    630  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    631  1.1  skrll 	 32,			/* bitsize */
    632  1.1  skrll 	 FALSE,			/* pc_relative */
    633  1.1  skrll 	 0,			/* bitpos */
    634  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    635  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    636  1.1  skrll 	 "R_MIPS_JALR",		/* name */
    637  1.1  skrll 	 FALSE,			/* partial_inplace */
    638  1.1  skrll 	 0,			/* src_mask */
    639  1.1  skrll 	 0x00000000,		/* dst_mask */
    640  1.1  skrll 	 FALSE),		/* pcrel_offset */
    641  1.1  skrll 
    642  1.1  skrll   /* TLS relocations.  */
    643  1.1  skrll   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
    644  1.1  skrll   EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
    645  1.1  skrll 
    646  1.1  skrll   HOWTO (R_MIPS_TLS_DTPMOD64,	/* type */
    647  1.1  skrll 	 0,			/* rightshift */
    648  1.1  skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    649  1.1  skrll 	 64,			/* bitsize */
    650  1.1  skrll 	 FALSE,			/* pc_relative */
    651  1.1  skrll 	 0,			/* bitpos */
    652  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    653  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    654  1.1  skrll 	 "R_MIPS_TLS_DTPMOD64",	/* name */
    655  1.1  skrll 	 TRUE,			/* partial_inplace */
    656  1.1  skrll 	 MINUS_ONE,		/* src_mask */
    657  1.1  skrll 	 MINUS_ONE,		/* dst_mask */
    658  1.1  skrll 	 FALSE),		/* pcrel_offset */
    659  1.1  skrll 
    660  1.1  skrll   HOWTO (R_MIPS_TLS_DTPREL64,	/* type */
    661  1.1  skrll 	 0,			/* rightshift */
    662  1.1  skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    663  1.1  skrll 	 64,			/* bitsize */
    664  1.1  skrll 	 FALSE,			/* pc_relative */
    665  1.1  skrll 	 0,			/* bitpos */
    666  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    667  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    668  1.1  skrll 	 "R_MIPS_TLS_DTPREL64",	/* name */
    669  1.1  skrll 	 TRUE,			/* partial_inplace */
    670  1.1  skrll 	 MINUS_ONE,		/* src_mask */
    671  1.1  skrll 	 MINUS_ONE,		/* dst_mask */
    672  1.1  skrll 	 FALSE),		/* pcrel_offset */
    673  1.1  skrll 
    674  1.1  skrll   /* TLS general dynamic variable reference.  */
    675  1.1  skrll   HOWTO (R_MIPS_TLS_GD,		/* type */
    676  1.1  skrll 	 0,			/* rightshift */
    677  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    678  1.1  skrll 	 16,			/* bitsize */
    679  1.1  skrll 	 FALSE,			/* pc_relative */
    680  1.1  skrll 	 0,			/* bitpos */
    681  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    682  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    683  1.1  skrll 	 "R_MIPS_TLS_GD",	/* name */
    684  1.1  skrll 	 TRUE,			/* partial_inplace */
    685  1.1  skrll 	 0x0000ffff,		/* src_mask */
    686  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    687  1.1  skrll 	 FALSE),		/* pcrel_offset */
    688  1.1  skrll 
    689  1.1  skrll   /* TLS local dynamic variable reference.  */
    690  1.1  skrll   HOWTO (R_MIPS_TLS_LDM,	/* type */
    691  1.1  skrll 	 0,			/* rightshift */
    692  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    693  1.1  skrll 	 16,			/* bitsize */
    694  1.1  skrll 	 FALSE,			/* pc_relative */
    695  1.1  skrll 	 0,			/* bitpos */
    696  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    697  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    698  1.1  skrll 	 "R_MIPS_TLS_LDM",	/* name */
    699  1.1  skrll 	 TRUE,			/* partial_inplace */
    700  1.1  skrll 	 0x0000ffff,		/* src_mask */
    701  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    702  1.1  skrll 	 FALSE),		/* pcrel_offset */
    703  1.1  skrll 
    704  1.1  skrll   /* TLS local dynamic offset.  */
    705  1.1  skrll   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
    706  1.1  skrll 	 0,			/* rightshift */
    707  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    708  1.1  skrll 	 16,			/* bitsize */
    709  1.1  skrll 	 FALSE,			/* pc_relative */
    710  1.1  skrll 	 0,			/* bitpos */
    711  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    712  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    713  1.1  skrll 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
    714  1.1  skrll 	 TRUE,			/* partial_inplace */
    715  1.1  skrll 	 0x0000ffff,		/* src_mask */
    716  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    717  1.1  skrll 	 FALSE),		/* pcrel_offset */
    718  1.1  skrll 
    719  1.1  skrll   /* TLS local dynamic offset.  */
    720  1.1  skrll   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
    721  1.1  skrll 	 0,			/* rightshift */
    722  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    723  1.1  skrll 	 16,			/* bitsize */
    724  1.1  skrll 	 FALSE,			/* pc_relative */
    725  1.1  skrll 	 0,			/* bitpos */
    726  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    727  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    728  1.1  skrll 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
    729  1.1  skrll 	 TRUE,			/* partial_inplace */
    730  1.1  skrll 	 0x0000ffff,		/* src_mask */
    731  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    732  1.1  skrll 	 FALSE),		/* pcrel_offset */
    733  1.1  skrll 
    734  1.1  skrll   /* TLS thread pointer offset.  */
    735  1.1  skrll   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
    736  1.1  skrll 	 0,			/* rightshift */
    737  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    738  1.1  skrll 	 16,			/* bitsize */
    739  1.1  skrll 	 FALSE,			/* pc_relative */
    740  1.1  skrll 	 0,			/* bitpos */
    741  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    742  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    743  1.1  skrll 	 "R_MIPS_TLS_GOTTPREL",	/* name */
    744  1.1  skrll 	 TRUE,			/* partial_inplace */
    745  1.1  skrll 	 0x0000ffff,		/* src_mask */
    746  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    747  1.1  skrll 	 FALSE),		/* pcrel_offset */
    748  1.1  skrll 
    749  1.1  skrll   /* TLS IE dynamic relocations.  */
    750  1.1  skrll   EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
    751  1.1  skrll 
    752  1.1  skrll   HOWTO (R_MIPS_TLS_TPREL64,	/* type */
    753  1.1  skrll 	 0,			/* rightshift */
    754  1.1  skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    755  1.1  skrll 	 64,			/* bitsize */
    756  1.1  skrll 	 FALSE,			/* pc_relative */
    757  1.1  skrll 	 0,			/* bitpos */
    758  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    759  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    760  1.1  skrll 	 "R_MIPS_TLS_TPREL64",	/* name */
    761  1.1  skrll 	 TRUE,			/* partial_inplace */
    762  1.1  skrll 	 MINUS_ONE,		/* src_mask */
    763  1.1  skrll 	 MINUS_ONE,		/* dst_mask */
    764  1.1  skrll 	 FALSE),		/* pcrel_offset */
    765  1.1  skrll 
    766  1.1  skrll   /* TLS thread pointer offset.  */
    767  1.1  skrll   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
    768  1.1  skrll 	 0,			/* rightshift */
    769  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    770  1.1  skrll 	 16,			/* bitsize */
    771  1.1  skrll 	 FALSE,			/* pc_relative */
    772  1.1  skrll 	 0,			/* bitpos */
    773  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    774  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    775  1.1  skrll 	 "R_MIPS_TLS_TPREL_HI16", /* name */
    776  1.1  skrll 	 TRUE,			/* partial_inplace */
    777  1.1  skrll 	 0x0000ffff,		/* src_mask */
    778  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    779  1.1  skrll 	 FALSE),		/* pcrel_offset */
    780  1.1  skrll 
    781  1.1  skrll   /* TLS thread pointer offset.  */
    782  1.1  skrll   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
    783  1.1  skrll 	 0,			/* rightshift */
    784  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    785  1.1  skrll 	 16,			/* bitsize */
    786  1.1  skrll 	 FALSE,			/* pc_relative */
    787  1.1  skrll 	 0,			/* bitpos */
    788  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    789  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    790  1.1  skrll 	 "R_MIPS_TLS_TPREL_LO16", /* name */
    791  1.1  skrll 	 TRUE,			/* partial_inplace */
    792  1.1  skrll 	 0x0000ffff,		/* src_mask */
    793  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    794  1.1  skrll 	 FALSE),		/* pcrel_offset */
    795  1.1  skrll 
    796  1.1  skrll   /* 32 bit relocation with no addend.  */
    797  1.1  skrll   HOWTO (R_MIPS_GLOB_DAT,	/* type */
    798  1.1  skrll 	 0,			/* rightshift */
    799  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    800  1.1  skrll 	 32,			/* bitsize */
    801  1.1  skrll 	 FALSE,			/* pc_relative */
    802  1.1  skrll 	 0,			/* bitpos */
    803  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    804  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    805  1.1  skrll 	 "R_MIPS_GLOB_DAT",	/* name */
    806  1.1  skrll 	 FALSE,			/* partial_inplace */
    807  1.1  skrll 	 0x0,			/* src_mask */
    808  1.1  skrll 	 0xffffffff,		/* dst_mask */
    809  1.1  skrll 	 FALSE),		/* pcrel_offset */
    810  1.1  skrll };
    811  1.1  skrll 
    812  1.1  skrll /* The relocation table used for SHT_RELA sections.  */
    813  1.1  skrll 
    814  1.1  skrll static reloc_howto_type mips_elf64_howto_table_rela[] =
    815  1.1  skrll {
    816  1.1  skrll   /* No relocation.  */
    817  1.1  skrll   HOWTO (R_MIPS_NONE,		/* type */
    818  1.1  skrll 	 0,			/* rightshift */
    819  1.1  skrll 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    820  1.1  skrll 	 0,			/* bitsize */
    821  1.1  skrll 	 FALSE,			/* pc_relative */
    822  1.1  skrll 	 0,			/* bitpos */
    823  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    824  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    825  1.1  skrll 	 "R_MIPS_NONE",		/* name */
    826  1.1  skrll 	 FALSE,			/* partial_inplace */
    827  1.1  skrll 	 0,			/* src_mask */
    828  1.1  skrll 	 0,			/* dst_mask */
    829  1.1  skrll 	 FALSE),		/* pcrel_offset */
    830  1.1  skrll 
    831  1.1  skrll   /* 16 bit relocation.  */
    832  1.1  skrll   HOWTO (R_MIPS_16,		/* type */
    833  1.1  skrll 	 0,			/* rightshift */
    834  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    835  1.1  skrll 	 16,			/* bitsize */
    836  1.1  skrll 	 FALSE,			/* pc_relative */
    837  1.1  skrll 	 0,			/* bitpos */
    838  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    839  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    840  1.1  skrll 	 "R_MIPS_16",		/* name */
    841  1.1  skrll 	 FALSE,			/* partial_inplace */
    842  1.1  skrll 	 0,			/* src_mask */
    843  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    844  1.1  skrll 	 FALSE),		/* pcrel_offset */
    845  1.1  skrll 
    846  1.1  skrll   /* 32 bit relocation.  */
    847  1.1  skrll   HOWTO (R_MIPS_32,		/* type */
    848  1.1  skrll 	 0,			/* rightshift */
    849  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    850  1.1  skrll 	 32,			/* bitsize */
    851  1.1  skrll 	 FALSE,			/* pc_relative */
    852  1.1  skrll 	 0,			/* bitpos */
    853  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    854  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    855  1.1  skrll 	 "R_MIPS_32",		/* name */
    856  1.1  skrll 	 FALSE,			/* partial_inplace */
    857  1.1  skrll 	 0,			/* src_mask */
    858  1.1  skrll 	 0xffffffff,		/* dst_mask */
    859  1.1  skrll 	 FALSE),		/* pcrel_offset */
    860  1.1  skrll 
    861  1.1  skrll   /* 32 bit symbol relative relocation.  */
    862  1.1  skrll   HOWTO (R_MIPS_REL32,		/* type */
    863  1.1  skrll 	 0,			/* rightshift */
    864  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    865  1.1  skrll 	 32,			/* bitsize */
    866  1.1  skrll 	 FALSE,			/* pc_relative */
    867  1.1  skrll 	 0,			/* bitpos */
    868  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    869  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    870  1.1  skrll 	 "R_MIPS_REL32",	/* name */
    871  1.1  skrll 	 FALSE,			/* partial_inplace */
    872  1.1  skrll 	 0,			/* src_mask */
    873  1.1  skrll 	 0xffffffff,		/* dst_mask */
    874  1.1  skrll 	 FALSE),		/* pcrel_offset */
    875  1.1  skrll 
    876  1.1  skrll   /* 26 bit jump address.  */
    877  1.1  skrll   HOWTO (R_MIPS_26,		/* type */
    878  1.1  skrll 	 2,			/* rightshift */
    879  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    880  1.1  skrll 	 26,			/* bitsize */
    881  1.1  skrll 	 FALSE,			/* pc_relative */
    882  1.1  skrll 	 0,			/* bitpos */
    883  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    884  1.1  skrll 				/* This needs complex overflow
    885  1.1  skrll 				   detection, because the upper 36
    886  1.1  skrll 				   bits must match the PC + 4.  */
    887  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    888  1.1  skrll 	 "R_MIPS_26",		/* name */
    889  1.1  skrll 	 FALSE,			/* partial_inplace */
    890  1.1  skrll 	 0,			/* src_mask */
    891  1.1  skrll 	 0x03ffffff,		/* dst_mask */
    892  1.1  skrll 	 FALSE),		/* pcrel_offset */
    893  1.1  skrll 
    894  1.1  skrll   /* High 16 bits of symbol value.  */
    895  1.1  skrll   HOWTO (R_MIPS_HI16,		/* type */
    896  1.1  skrll 	 0,			/* rightshift */
    897  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    898  1.1  skrll 	 16,			/* bitsize */
    899  1.1  skrll 	 FALSE,			/* pc_relative */
    900  1.1  skrll 	 0,			/* bitpos */
    901  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    902  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    903  1.1  skrll 	 "R_MIPS_HI16",		/* name */
    904  1.1  skrll 	 FALSE,			/* partial_inplace */
    905  1.1  skrll 	 0,			/* src_mask */
    906  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    907  1.1  skrll 	 FALSE),		/* pcrel_offset */
    908  1.1  skrll 
    909  1.1  skrll   /* Low 16 bits of symbol value.  */
    910  1.1  skrll   HOWTO (R_MIPS_LO16,		/* type */
    911  1.1  skrll 	 0,			/* rightshift */
    912  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    913  1.1  skrll 	 16,			/* bitsize */
    914  1.1  skrll 	 FALSE,			/* pc_relative */
    915  1.1  skrll 	 0,			/* bitpos */
    916  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
    917  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    918  1.1  skrll 	 "R_MIPS_LO16",		/* name */
    919  1.1  skrll 	 FALSE,			/* partial_inplace */
    920  1.1  skrll 	 0,			/* src_mask */
    921  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    922  1.1  skrll 	 FALSE),		/* pcrel_offset */
    923  1.1  skrll 
    924  1.1  skrll   /* GP relative reference.  */
    925  1.1  skrll   HOWTO (R_MIPS_GPREL16,	/* type */
    926  1.1  skrll 	 0,			/* rightshift */
    927  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    928  1.1  skrll 	 16,			/* bitsize */
    929  1.1  skrll 	 FALSE,			/* pc_relative */
    930  1.1  skrll 	 0,			/* bitpos */
    931  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    932  1.1  skrll 	 mips_elf64_gprel16_reloc, /* special_function */
    933  1.1  skrll 	 "R_MIPS_GPREL16",	/* name */
    934  1.1  skrll 	 FALSE,			/* partial_inplace */
    935  1.1  skrll 	 0,			/* src_mask */
    936  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    937  1.1  skrll 	 FALSE),		/* pcrel_offset */
    938  1.1  skrll 
    939  1.1  skrll   /* Reference to literal section.  */
    940  1.1  skrll   HOWTO (R_MIPS_LITERAL,	/* type */
    941  1.1  skrll 	 0,			/* rightshift */
    942  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    943  1.1  skrll 	 16,			/* bitsize */
    944  1.1  skrll 	 FALSE,			/* pc_relative */
    945  1.1  skrll 	 0,			/* bitpos */
    946  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    947  1.1  skrll 	 mips_elf64_literal_reloc, /* special_function */
    948  1.1  skrll 	 "R_MIPS_LITERAL",	/* name */
    949  1.1  skrll 	 FALSE,			/* partial_inplace */
    950  1.1  skrll 	 0,			/* src_mask */
    951  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    952  1.1  skrll 	 FALSE),		/* pcrel_offset */
    953  1.1  skrll 
    954  1.1  skrll   /* Reference to global offset table.  */
    955  1.1  skrll   HOWTO (R_MIPS_GOT16,		/* type */
    956  1.1  skrll 	 0,			/* rightshift */
    957  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    958  1.1  skrll 	 16,			/* bitsize */
    959  1.1  skrll 	 FALSE,			/* pc_relative */
    960  1.1  skrll 	 0,			/* bitpos */
    961  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    962  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    963  1.1  skrll 	 "R_MIPS_GOT16",	/* name */
    964  1.1  skrll 	 FALSE,			/* partial_inplace */
    965  1.1  skrll 	 0,			/* src_mask */
    966  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    967  1.1  skrll 	 FALSE),		/* pcrel_offset */
    968  1.1  skrll 
    969  1.1  skrll   /* 16 bit PC relative reference.  Note that the ABI document has a typo
    970  1.1  skrll      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
    971  1.1  skrll      We do the right thing here.  */
    972  1.1  skrll   HOWTO (R_MIPS_PC16,		/* type */
    973  1.1  skrll 	 2,			/* rightshift */
    974  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    975  1.1  skrll 	 16,			/* bitsize */
    976  1.1  skrll 	 TRUE,			/* pc_relative */
    977  1.1  skrll 	 0,			/* bitpos */
    978  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    979  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    980  1.1  skrll 	 "R_MIPS_PC16",		/* name */
    981  1.1  skrll 	 FALSE,			/* partial_inplace */
    982  1.1  skrll 	 0,			/* src_mask */
    983  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    984  1.1  skrll 	 TRUE),			/* pcrel_offset */
    985  1.1  skrll 
    986  1.1  skrll   /* 16 bit call through global offset table.  */
    987  1.1  skrll   HOWTO (R_MIPS_CALL16,		/* type */
    988  1.1  skrll 	 0,			/* rightshift */
    989  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    990  1.1  skrll 	 16,			/* bitsize */
    991  1.1  skrll 	 FALSE,			/* pc_relative */
    992  1.1  skrll 	 0,			/* bitpos */
    993  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
    994  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    995  1.1  skrll 	 "R_MIPS_CALL16",	/* name */
    996  1.1  skrll 	 FALSE,			/* partial_inplace */
    997  1.1  skrll 	 0,			/* src_mask */
    998  1.1  skrll 	 0x0000ffff,		/* dst_mask */
    999  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1000  1.1  skrll 
   1001  1.1  skrll   /* 32 bit GP relative reference.  */
   1002  1.1  skrll   HOWTO (R_MIPS_GPREL32,	/* type */
   1003  1.1  skrll 	 0,			/* rightshift */
   1004  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1005  1.1  skrll 	 32,			/* bitsize */
   1006  1.1  skrll 	 FALSE,			/* pc_relative */
   1007  1.1  skrll 	 0,			/* bitpos */
   1008  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1009  1.1  skrll 	 mips_elf64_gprel32_reloc, /* special_function */
   1010  1.1  skrll 	 "R_MIPS_GPREL32",	/* name */
   1011  1.1  skrll 	 FALSE,			/* partial_inplace */
   1012  1.1  skrll 	 0,			/* src_mask */
   1013  1.1  skrll 	 0xffffffff,		/* dst_mask */
   1014  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1015  1.1  skrll 
   1016  1.1  skrll   EMPTY_HOWTO (13),
   1017  1.1  skrll   EMPTY_HOWTO (14),
   1018  1.1  skrll   EMPTY_HOWTO (15),
   1019  1.1  skrll 
   1020  1.1  skrll   /* A 5 bit shift field.  */
   1021  1.1  skrll   HOWTO (R_MIPS_SHIFT5,		/* type */
   1022  1.1  skrll 	 0,			/* rightshift */
   1023  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1024  1.1  skrll 	 5,			/* bitsize */
   1025  1.1  skrll 	 FALSE,			/* pc_relative */
   1026  1.1  skrll 	 6,			/* bitpos */
   1027  1.1  skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   1028  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1029  1.1  skrll 	 "R_MIPS_SHIFT5",	/* name */
   1030  1.1  skrll 	 FALSE,			/* partial_inplace */
   1031  1.1  skrll 	 0,			/* src_mask */
   1032  1.1  skrll 	 0x000007c0,		/* dst_mask */
   1033  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1034  1.1  skrll 
   1035  1.1  skrll   /* A 6 bit shift field.  */
   1036  1.1  skrll   HOWTO (R_MIPS_SHIFT6,		/* type */
   1037  1.1  skrll 	 0,			/* rightshift */
   1038  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1039  1.1  skrll 	 6,			/* bitsize */
   1040  1.1  skrll 	 FALSE,			/* pc_relative */
   1041  1.1  skrll 	 6,			/* bitpos */
   1042  1.1  skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   1043  1.1  skrll 	 mips_elf64_shift6_reloc, /* special_function */
   1044  1.1  skrll 	 "R_MIPS_SHIFT6",	/* name */
   1045  1.1  skrll 	 FALSE,			/* partial_inplace */
   1046  1.1  skrll 	 0,			/* src_mask */
   1047  1.1  skrll 	 0x000007c4,		/* dst_mask */
   1048  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1049  1.1  skrll 
   1050  1.1  skrll   /* 64 bit relocation.  */
   1051  1.1  skrll   HOWTO (R_MIPS_64,		/* type */
   1052  1.1  skrll 	 0,			/* rightshift */
   1053  1.1  skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1054  1.1  skrll 	 64,			/* bitsize */
   1055  1.1  skrll 	 FALSE,			/* pc_relative */
   1056  1.1  skrll 	 0,			/* bitpos */
   1057  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1058  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1059  1.1  skrll 	 "R_MIPS_64",		/* name */
   1060  1.1  skrll 	 FALSE,			/* partial_inplace */
   1061  1.1  skrll 	 0,			/* src_mask */
   1062  1.1  skrll 	 MINUS_ONE,		/* dst_mask */
   1063  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1064  1.1  skrll 
   1065  1.1  skrll   /* Displacement in the global offset table.  */
   1066  1.1  skrll   HOWTO (R_MIPS_GOT_DISP,	/* type */
   1067  1.1  skrll 	 0,			/* rightshift */
   1068  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1069  1.1  skrll 	 16,			/* bitsize */
   1070  1.1  skrll 	 FALSE,			/* pc_relative */
   1071  1.1  skrll 	 0,			/* bitpos */
   1072  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1073  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1074  1.1  skrll 	 "R_MIPS_GOT_DISP",	/* name */
   1075  1.1  skrll 	 FALSE,			/* partial_inplace */
   1076  1.1  skrll 	 0,			/* src_mask */
   1077  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1078  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1079  1.1  skrll 
   1080  1.1  skrll   /* Displacement to page pointer in the global offset table.  */
   1081  1.1  skrll   HOWTO (R_MIPS_GOT_PAGE,	/* type */
   1082  1.1  skrll 	 0,			/* rightshift */
   1083  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1084  1.1  skrll 	 16,			/* bitsize */
   1085  1.1  skrll 	 FALSE,			/* pc_relative */
   1086  1.1  skrll 	 0,			/* bitpos */
   1087  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1088  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1089  1.1  skrll 	 "R_MIPS_GOT_PAGE",	/* name */
   1090  1.1  skrll 	 FALSE,			/* partial_inplace */
   1091  1.1  skrll 	 0,			/* src_mask */
   1092  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1093  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1094  1.1  skrll 
   1095  1.1  skrll   /* Offset from page pointer in the global offset table.  */
   1096  1.1  skrll   HOWTO (R_MIPS_GOT_OFST,	/* type */
   1097  1.1  skrll 	 0,			/* rightshift */
   1098  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1099  1.1  skrll 	 16,			/* bitsize */
   1100  1.1  skrll 	 FALSE,			/* pc_relative */
   1101  1.1  skrll 	 0,			/* bitpos */
   1102  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1103  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1104  1.1  skrll 	 "R_MIPS_GOT_OFST",	/* name */
   1105  1.1  skrll 	 FALSE,			/* partial_inplace */
   1106  1.1  skrll 	 0,			/* src_mask */
   1107  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1108  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1109  1.1  skrll 
   1110  1.1  skrll   /* High 16 bits of displacement in global offset table.  */
   1111  1.1  skrll   HOWTO (R_MIPS_GOT_HI16,	/* type */
   1112  1.1  skrll 	 0,			/* rightshift */
   1113  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1114  1.1  skrll 	 16,			/* bitsize */
   1115  1.1  skrll 	 FALSE,			/* pc_relative */
   1116  1.1  skrll 	 0,			/* bitpos */
   1117  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1118  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1119  1.1  skrll 	 "R_MIPS_GOT_HI16",	/* name */
   1120  1.1  skrll 	 FALSE,			/* partial_inplace */
   1121  1.1  skrll 	 0,			/* src_mask */
   1122  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1123  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1124  1.1  skrll 
   1125  1.1  skrll   /* Low 16 bits of displacement in global offset table.  */
   1126  1.1  skrll   HOWTO (R_MIPS_GOT_LO16,	/* type */
   1127  1.1  skrll 	 0,			/* rightshift */
   1128  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1129  1.1  skrll 	 16,			/* bitsize */
   1130  1.1  skrll 	 FALSE,			/* pc_relative */
   1131  1.1  skrll 	 0,			/* bitpos */
   1132  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1133  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1134  1.1  skrll 	 "R_MIPS_GOT_LO16",	/* name */
   1135  1.1  skrll 	 FALSE,			/* partial_inplace */
   1136  1.1  skrll 	 0,			/* src_mask */
   1137  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1138  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1139  1.1  skrll 
   1140  1.1  skrll   /* 64 bit subtraction.  */
   1141  1.1  skrll   HOWTO (R_MIPS_SUB,		/* type */
   1142  1.1  skrll 	 0,			/* rightshift */
   1143  1.1  skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1144  1.1  skrll 	 64,			/* bitsize */
   1145  1.1  skrll 	 FALSE,			/* pc_relative */
   1146  1.1  skrll 	 0,			/* bitpos */
   1147  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1148  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1149  1.1  skrll 	 "R_MIPS_SUB",		/* name */
   1150  1.1  skrll 	 FALSE,			/* partial_inplace */
   1151  1.1  skrll 	 0,			/* src_mask */
   1152  1.1  skrll 	 MINUS_ONE,		/* dst_mask */
   1153  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1154  1.1  skrll 
   1155  1.1  skrll   /* Insert the addend as an instruction.  */
   1156  1.1  skrll   /* FIXME: Not handled correctly.  */
   1157  1.1  skrll   HOWTO (R_MIPS_INSERT_A,	/* type */
   1158  1.1  skrll 	 0,			/* rightshift */
   1159  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1160  1.1  skrll 	 32,			/* bitsize */
   1161  1.1  skrll 	 FALSE,			/* pc_relative */
   1162  1.1  skrll 	 0,			/* bitpos */
   1163  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1164  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1165  1.1  skrll 	 "R_MIPS_INSERT_A",	/* name */
   1166  1.1  skrll 	 FALSE,			/* partial_inplace */
   1167  1.1  skrll 	 0,			/* src_mask */
   1168  1.1  skrll 	 0xffffffff,		/* dst_mask */
   1169  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1170  1.1  skrll 
   1171  1.1  skrll   /* Insert the addend as an instruction, and change all relocations
   1172  1.1  skrll      to refer to the old instruction at the address.  */
   1173  1.1  skrll   /* FIXME: Not handled correctly.  */
   1174  1.1  skrll   HOWTO (R_MIPS_INSERT_B,	/* type */
   1175  1.1  skrll 	 0,			/* rightshift */
   1176  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1177  1.1  skrll 	 32,			/* bitsize */
   1178  1.1  skrll 	 FALSE,			/* pc_relative */
   1179  1.1  skrll 	 0,			/* bitpos */
   1180  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1181  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1182  1.1  skrll 	 "R_MIPS_INSERT_B",	/* name */
   1183  1.1  skrll 	 FALSE,			/* partial_inplace */
   1184  1.1  skrll 	 0,			/* src_mask */
   1185  1.1  skrll 	 0xffffffff,		/* dst_mask */
   1186  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1187  1.1  skrll 
   1188  1.1  skrll   /* Delete a 32 bit instruction.  */
   1189  1.1  skrll   /* FIXME: Not handled correctly.  */
   1190  1.1  skrll   HOWTO (R_MIPS_DELETE,		/* type */
   1191  1.1  skrll 	 0,			/* rightshift */
   1192  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1193  1.1  skrll 	 32,			/* bitsize */
   1194  1.1  skrll 	 FALSE,			/* pc_relative */
   1195  1.1  skrll 	 0,			/* bitpos */
   1196  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1197  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1198  1.1  skrll 	 "R_MIPS_DELETE",	/* name */
   1199  1.1  skrll 	 FALSE,			/* partial_inplace */
   1200  1.1  skrll 	 0,			/* src_mask */
   1201  1.1  skrll 	 0xffffffff,		/* dst_mask */
   1202  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1203  1.1  skrll 
   1204  1.1  skrll   /* Get the higher value of a 64 bit addend.  */
   1205  1.1  skrll   HOWTO (R_MIPS_HIGHER,		/* type */
   1206  1.1  skrll 	 0,			/* rightshift */
   1207  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1208  1.1  skrll 	 16,			/* bitsize */
   1209  1.1  skrll 	 FALSE,			/* pc_relative */
   1210  1.1  skrll 	 0,			/* bitpos */
   1211  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1212  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1213  1.1  skrll 	 "R_MIPS_HIGHER",	/* name */
   1214  1.1  skrll 	 FALSE,			/* partial_inplace */
   1215  1.1  skrll 	 0,			/* src_mask */
   1216  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1217  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1218  1.1  skrll 
   1219  1.1  skrll   /* Get the highest value of a 64 bit addend.  */
   1220  1.1  skrll   HOWTO (R_MIPS_HIGHEST,	/* type */
   1221  1.1  skrll 	 0,			/* rightshift */
   1222  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1223  1.1  skrll 	 16,			/* bitsize */
   1224  1.1  skrll 	 FALSE,			/* pc_relative */
   1225  1.1  skrll 	 0,			/* bitpos */
   1226  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1227  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1228  1.1  skrll 	 "R_MIPS_HIGHEST",	/* name */
   1229  1.1  skrll 	 FALSE,			/* partial_inplace */
   1230  1.1  skrll 	 0,			/* src_mask */
   1231  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1232  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1233  1.1  skrll 
   1234  1.1  skrll   /* High 16 bits of displacement in global offset table.  */
   1235  1.1  skrll   HOWTO (R_MIPS_CALL_HI16,	/* type */
   1236  1.1  skrll 	 0,			/* rightshift */
   1237  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1238  1.1  skrll 	 16,			/* bitsize */
   1239  1.1  skrll 	 FALSE,			/* pc_relative */
   1240  1.1  skrll 	 0,			/* bitpos */
   1241  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1242  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1243  1.1  skrll 	 "R_MIPS_CALL_HI16",	/* name */
   1244  1.1  skrll 	 FALSE,			/* partial_inplace */
   1245  1.1  skrll 	 0,			/* src_mask */
   1246  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1247  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1248  1.1  skrll 
   1249  1.1  skrll   /* Low 16 bits of displacement in global offset table.  */
   1250  1.1  skrll   HOWTO (R_MIPS_CALL_LO16,	/* type */
   1251  1.1  skrll 	 0,			/* rightshift */
   1252  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1253  1.1  skrll 	 16,			/* bitsize */
   1254  1.1  skrll 	 FALSE,			/* pc_relative */
   1255  1.1  skrll 	 0,			/* bitpos */
   1256  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1257  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1258  1.1  skrll 	 "R_MIPS_CALL_LO16",	/* name */
   1259  1.1  skrll 	 FALSE,			/* partial_inplace */
   1260  1.1  skrll 	 0,			/* src_mask */
   1261  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1262  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1263  1.1  skrll 
   1264  1.1  skrll   /* Section displacement, used by an associated event location section.  */
   1265  1.1  skrll   HOWTO (R_MIPS_SCN_DISP,	/* type */
   1266  1.1  skrll 	 0,			/* rightshift */
   1267  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1268  1.1  skrll 	 32,			/* bitsize */
   1269  1.1  skrll 	 FALSE,			/* pc_relative */
   1270  1.1  skrll 	 0,			/* bitpos */
   1271  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1272  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1273  1.1  skrll 	 "R_MIPS_SCN_DISP",	/* name */
   1274  1.1  skrll 	 FALSE,			/* partial_inplace */
   1275  1.1  skrll 	 0,			/* src_mask */
   1276  1.1  skrll 	 0xffffffff,		/* dst_mask */
   1277  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1278  1.1  skrll 
   1279  1.1  skrll   HOWTO (R_MIPS_REL16,		/* type */
   1280  1.1  skrll 	 0,			/* rightshift */
   1281  1.1  skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1282  1.1  skrll 	 16,			/* bitsize */
   1283  1.1  skrll 	 FALSE,			/* pc_relative */
   1284  1.1  skrll 	 0,			/* bitpos */
   1285  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1286  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1287  1.1  skrll 	 "R_MIPS_REL16",	/* name */
   1288  1.1  skrll 	 FALSE,			/* partial_inplace */
   1289  1.1  skrll 	 0,			/* src_mask */
   1290  1.1  skrll 	 0xffff,		/* dst_mask */
   1291  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1292  1.1  skrll 
   1293  1.1  skrll   /* These two are obsolete.  */
   1294  1.1  skrll   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
   1295  1.1  skrll   EMPTY_HOWTO (R_MIPS_PJUMP),
   1296  1.1  skrll 
   1297  1.1  skrll   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
   1298  1.1  skrll      It must be used for multigot GOT's (and only there).  */
   1299  1.1  skrll   HOWTO (R_MIPS_RELGOT,		/* type */
   1300  1.1  skrll 	 0,			/* rightshift */
   1301  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1302  1.1  skrll 	 32,			/* bitsize */
   1303  1.1  skrll 	 FALSE,			/* pc_relative */
   1304  1.1  skrll 	 0,			/* bitpos */
   1305  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1306  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1307  1.1  skrll 	 "R_MIPS_RELGOT",	/* name */
   1308  1.1  skrll 	 FALSE,			/* partial_inplace */
   1309  1.1  skrll 	 0,			/* src_mask */
   1310  1.1  skrll 	 0xffffffff,		/* dst_mask */
   1311  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1312  1.1  skrll 
   1313  1.1  skrll   /* Protected jump conversion.  This is an optimization hint.  No
   1314  1.1  skrll      relocation is required for correctness.  */
   1315  1.1  skrll   HOWTO (R_MIPS_JALR,		/* type */
   1316  1.1  skrll 	 0,			/* rightshift */
   1317  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1318  1.1  skrll 	 32,			/* bitsize */
   1319  1.1  skrll 	 FALSE,			/* pc_relative */
   1320  1.1  skrll 	 0,			/* bitpos */
   1321  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1322  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1323  1.1  skrll 	 "R_MIPS_JALR",		/* name */
   1324  1.1  skrll 	 FALSE,			/* partial_inplace */
   1325  1.1  skrll 	 0,			/* src_mask */
   1326  1.1  skrll 	 0x00000000,		/* dst_mask */
   1327  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1328  1.1  skrll 
   1329  1.1  skrll   /* TLS relocations.  */
   1330  1.1  skrll   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
   1331  1.1  skrll   EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
   1332  1.1  skrll   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
   1333  1.1  skrll 
   1334  1.1  skrll   HOWTO (R_MIPS_TLS_DTPREL64,	/* type */
   1335  1.1  skrll 	 0,			/* rightshift */
   1336  1.1  skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1337  1.1  skrll 	 64,			/* bitsize */
   1338  1.1  skrll 	 FALSE,			/* pc_relative */
   1339  1.1  skrll 	 0,			/* bitpos */
   1340  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1341  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1342  1.1  skrll 	 "R_MIPS_TLS_DTPREL64",	/* name */
   1343  1.1  skrll 	 TRUE,			/* partial_inplace */
   1344  1.1  skrll 	 MINUS_ONE,		/* src_mask */
   1345  1.1  skrll 	 MINUS_ONE,		/* dst_mask */
   1346  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1347  1.1  skrll 
   1348  1.1  skrll   /* TLS general dynamic variable reference.  */
   1349  1.1  skrll   HOWTO (R_MIPS_TLS_GD,		/* type */
   1350  1.1  skrll 	 0,			/* rightshift */
   1351  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1352  1.1  skrll 	 16,			/* bitsize */
   1353  1.1  skrll 	 FALSE,			/* pc_relative */
   1354  1.1  skrll 	 0,			/* bitpos */
   1355  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1356  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1357  1.1  skrll 	 "R_MIPS_TLS_GD",	/* name */
   1358  1.1  skrll 	 TRUE,			/* partial_inplace */
   1359  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1360  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1361  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1362  1.1  skrll 
   1363  1.1  skrll   /* TLS local dynamic variable reference.  */
   1364  1.1  skrll   HOWTO (R_MIPS_TLS_LDM,	/* type */
   1365  1.1  skrll 	 0,			/* rightshift */
   1366  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1367  1.1  skrll 	 16,			/* bitsize */
   1368  1.1  skrll 	 FALSE,			/* pc_relative */
   1369  1.1  skrll 	 0,			/* bitpos */
   1370  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1371  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1372  1.1  skrll 	 "R_MIPS_TLS_LDM",	/* name */
   1373  1.1  skrll 	 TRUE,			/* partial_inplace */
   1374  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1375  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1376  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1377  1.1  skrll 
   1378  1.1  skrll   /* TLS local dynamic offset.  */
   1379  1.1  skrll   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
   1380  1.1  skrll 	 0,			/* rightshift */
   1381  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1382  1.1  skrll 	 16,			/* bitsize */
   1383  1.1  skrll 	 FALSE,			/* pc_relative */
   1384  1.1  skrll 	 0,			/* bitpos */
   1385  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1386  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1387  1.1  skrll 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
   1388  1.1  skrll 	 TRUE,			/* partial_inplace */
   1389  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1390  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1391  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1392  1.1  skrll 
   1393  1.1  skrll   /* TLS local dynamic offset.  */
   1394  1.1  skrll   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
   1395  1.1  skrll 	 0,			/* rightshift */
   1396  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1397  1.1  skrll 	 16,			/* bitsize */
   1398  1.1  skrll 	 FALSE,			/* pc_relative */
   1399  1.1  skrll 	 0,			/* bitpos */
   1400  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1401  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1402  1.1  skrll 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
   1403  1.1  skrll 	 TRUE,			/* partial_inplace */
   1404  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1405  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1406  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1407  1.1  skrll 
   1408  1.1  skrll   /* TLS thread pointer offset.  */
   1409  1.1  skrll   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
   1410  1.1  skrll 	 0,			/* rightshift */
   1411  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1412  1.1  skrll 	 16,			/* bitsize */
   1413  1.1  skrll 	 FALSE,			/* pc_relative */
   1414  1.1  skrll 	 0,			/* bitpos */
   1415  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1416  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1417  1.1  skrll 	 "R_MIPS_TLS_GOTTPREL",	/* name */
   1418  1.1  skrll 	 TRUE,			/* partial_inplace */
   1419  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1420  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1421  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1422  1.1  skrll 
   1423  1.1  skrll   EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
   1424  1.1  skrll   EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
   1425  1.1  skrll 
   1426  1.1  skrll   /* TLS thread pointer offset.  */
   1427  1.1  skrll   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
   1428  1.1  skrll 	 0,			/* rightshift */
   1429  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1430  1.1  skrll 	 16,			/* bitsize */
   1431  1.1  skrll 	 FALSE,			/* pc_relative */
   1432  1.1  skrll 	 0,			/* bitpos */
   1433  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1434  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1435  1.1  skrll 	 "R_MIPS_TLS_TPREL_HI16", /* name */
   1436  1.1  skrll 	 TRUE,			/* partial_inplace */
   1437  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1438  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1439  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1440  1.1  skrll 
   1441  1.1  skrll   /* TLS thread pointer offset.  */
   1442  1.1  skrll   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
   1443  1.1  skrll 	 0,			/* rightshift */
   1444  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1445  1.1  skrll 	 16,			/* bitsize */
   1446  1.1  skrll 	 FALSE,			/* pc_relative */
   1447  1.1  skrll 	 0,			/* bitpos */
   1448  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1449  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1450  1.1  skrll 	 "R_MIPS_TLS_TPREL_LO16", /* name */
   1451  1.1  skrll 	 TRUE,			/* partial_inplace */
   1452  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1453  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1454  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1455  1.1  skrll 
   1456  1.1  skrll   /* 32 bit relocation with no addend.  */
   1457  1.1  skrll   HOWTO (R_MIPS_GLOB_DAT,	/* type */
   1458  1.1  skrll 	 0,			/* rightshift */
   1459  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1460  1.1  skrll 	 32,			/* bitsize */
   1461  1.1  skrll 	 FALSE,			/* pc_relative */
   1462  1.1  skrll 	 0,			/* bitpos */
   1463  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1464  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1465  1.1  skrll 	 "R_MIPS_GLOB_DAT",	/* name */
   1466  1.1  skrll 	 FALSE,			/* partial_inplace */
   1467  1.1  skrll 	 0x0,			/* src_mask */
   1468  1.1  skrll 	 0xffffffff,		/* dst_mask */
   1469  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1470  1.1  skrll };
   1471  1.1  skrll 
   1472  1.1  skrll static reloc_howto_type mips16_elf64_howto_table_rel[] =
   1473  1.1  skrll {
   1474  1.1  skrll   /* The reloc used for the mips16 jump instruction.  */
   1475  1.1  skrll   HOWTO (R_MIPS16_26,		/* type */
   1476  1.1  skrll 	 2,			/* rightshift */
   1477  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1478  1.1  skrll 	 26,			/* bitsize */
   1479  1.1  skrll 	 FALSE,			/* pc_relative */
   1480  1.1  skrll 	 0,			/* bitpos */
   1481  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1482  1.1  skrll 	 			/* This needs complex overflow
   1483  1.1  skrll 				   detection, because the upper four
   1484  1.1  skrll 				   bits must match the PC.  */
   1485  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1486  1.1  skrll 	 "R_MIPS16_26",		/* name */
   1487  1.1  skrll 	 TRUE,			/* partial_inplace */
   1488  1.1  skrll 	 0x3ffffff,		/* src_mask */
   1489  1.1  skrll 	 0x3ffffff,		/* dst_mask */
   1490  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1491  1.1  skrll 
   1492  1.1  skrll   /* The reloc used for the mips16 gprel instruction.  */
   1493  1.1  skrll   HOWTO (R_MIPS16_GPREL,	/* type */
   1494  1.1  skrll 	 0,			/* rightshift */
   1495  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1496  1.1  skrll 	 16,			/* bitsize */
   1497  1.1  skrll 	 FALSE,			/* pc_relative */
   1498  1.1  skrll 	 0,			/* bitpos */
   1499  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1500  1.1  skrll 	 mips16_gprel_reloc,	/* special_function */
   1501  1.1  skrll 	 "R_MIPS16_GPREL",	/* name */
   1502  1.1  skrll 	 TRUE,			/* partial_inplace */
   1503  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1504  1.1  skrll 	 0x0000ffff,	        /* dst_mask */
   1505  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1506  1.1  skrll 
   1507  1.1  skrll   /* A MIPS16 reference to the global offset table.  */
   1508  1.1  skrll   HOWTO (R_MIPS16_GOT16,	/* type */
   1509  1.1  skrll 	 0,			/* rightshift */
   1510  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1511  1.1  skrll 	 16,			/* bitsize */
   1512  1.1  skrll 	 FALSE,			/* pc_relative */
   1513  1.1  skrll 	 0,			/* bitpos */
   1514  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1515  1.1  skrll 	 _bfd_mips_elf_got16_reloc, /* special_function */
   1516  1.1  skrll 	 "R_MIPS16_GOT16",	/* name */
   1517  1.1  skrll 	 TRUE,			/* partial_inplace */
   1518  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1519  1.1  skrll 	 0x0000ffff,	        /* dst_mask */
   1520  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1521  1.1  skrll 
   1522  1.1  skrll   /* A MIPS16 call through the global offset table.  */
   1523  1.1  skrll   HOWTO (R_MIPS16_CALL16,	/* type */
   1524  1.1  skrll 	 0,			/* rightshift */
   1525  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1526  1.1  skrll 	 16,			/* bitsize */
   1527  1.1  skrll 	 FALSE,			/* pc_relative */
   1528  1.1  skrll 	 0,			/* bitpos */
   1529  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1530  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1531  1.1  skrll 	 "R_MIPS16_CALL16",	/* name */
   1532  1.1  skrll 	 TRUE,			/* partial_inplace */
   1533  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1534  1.1  skrll 	 0x0000ffff,	        /* dst_mask */
   1535  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1536  1.1  skrll 
   1537  1.1  skrll   /* MIPS16 high 16 bits of symbol value.  */
   1538  1.1  skrll   HOWTO (R_MIPS16_HI16,		/* type */
   1539  1.1  skrll 	 16,			/* rightshift */
   1540  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1541  1.1  skrll 	 16,			/* bitsize */
   1542  1.1  skrll 	 FALSE,			/* pc_relative */
   1543  1.1  skrll 	 0,			/* bitpos */
   1544  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1545  1.1  skrll 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   1546  1.1  skrll 	 "R_MIPS16_HI16",	/* name */
   1547  1.1  skrll 	 TRUE,			/* partial_inplace */
   1548  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1549  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1550  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1551  1.1  skrll 
   1552  1.1  skrll   /* MIPS16 low 16 bits of symbol value.  */
   1553  1.1  skrll   HOWTO (R_MIPS16_LO16,		/* type */
   1554  1.1  skrll 	 0,			/* rightshift */
   1555  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1556  1.1  skrll 	 16,			/* bitsize */
   1557  1.1  skrll 	 FALSE,			/* pc_relative */
   1558  1.1  skrll 	 0,			/* bitpos */
   1559  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1560  1.1  skrll 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   1561  1.1  skrll 	 "R_MIPS16_LO16",	/* name */
   1562  1.1  skrll 	 TRUE,			/* partial_inplace */
   1563  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1564  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1565  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1566  1.1  skrll };
   1567  1.1  skrll 
   1568  1.1  skrll static reloc_howto_type mips16_elf64_howto_table_rela[] =
   1569  1.1  skrll {
   1570  1.1  skrll   /* The reloc used for the mips16 jump instruction.  */
   1571  1.1  skrll   HOWTO (R_MIPS16_26,		/* type */
   1572  1.1  skrll 	 2,			/* rightshift */
   1573  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1574  1.1  skrll 	 26,			/* bitsize */
   1575  1.1  skrll 	 FALSE,			/* pc_relative */
   1576  1.1  skrll 	 0,			/* bitpos */
   1577  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1578  1.1  skrll 	 			/* This needs complex overflow
   1579  1.1  skrll 				   detection, because the upper four
   1580  1.1  skrll 				   bits must match the PC.  */
   1581  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1582  1.1  skrll 	 "R_MIPS16_26",		/* name */
   1583  1.1  skrll 	 FALSE,			/* partial_inplace */
   1584  1.1  skrll 	 0x3ffffff,		/* src_mask */
   1585  1.1  skrll 	 0x3ffffff,		/* dst_mask */
   1586  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1587  1.1  skrll 
   1588  1.1  skrll   /* The reloc used for the mips16 gprel instruction.  */
   1589  1.1  skrll   HOWTO (R_MIPS16_GPREL,	/* type */
   1590  1.1  skrll 	 0,			/* rightshift */
   1591  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1592  1.1  skrll 	 16,			/* bitsize */
   1593  1.1  skrll 	 FALSE,			/* pc_relative */
   1594  1.1  skrll 	 0,			/* bitpos */
   1595  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1596  1.1  skrll 	 mips16_gprel_reloc,	/* special_function */
   1597  1.1  skrll 	 "R_MIPS16_GPREL",	/* name */
   1598  1.1  skrll 	 FALSE,			/* partial_inplace */
   1599  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1600  1.1  skrll 	 0x0000ffff,	        /* dst_mask */
   1601  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1602  1.1  skrll 
   1603  1.1  skrll   /* A MIPS16 reference to the global offset table.  */
   1604  1.1  skrll   HOWTO (R_MIPS16_GOT16,	/* type */
   1605  1.1  skrll 	 0,			/* rightshift */
   1606  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1607  1.1  skrll 	 16,			/* bitsize */
   1608  1.1  skrll 	 FALSE,			/* pc_relative */
   1609  1.1  skrll 	 0,			/* bitpos */
   1610  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1611  1.1  skrll 	 _bfd_mips_elf_got16_reloc, /* special_function */
   1612  1.1  skrll 	 "R_MIPS16_GOT16",	/* name */
   1613  1.1  skrll 	 FALSE,			/* partial_inplace */
   1614  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1615  1.1  skrll 	 0x0000ffff,	        /* dst_mask */
   1616  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1617  1.1  skrll 
   1618  1.1  skrll   /* A MIPS16 call through the global offset table.  */
   1619  1.1  skrll   HOWTO (R_MIPS16_CALL16,	/* type */
   1620  1.1  skrll 	 0,			/* rightshift */
   1621  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1622  1.1  skrll 	 16,			/* bitsize */
   1623  1.1  skrll 	 FALSE,			/* pc_relative */
   1624  1.1  skrll 	 0,			/* bitpos */
   1625  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1626  1.1  skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1627  1.1  skrll 	 "R_MIPS16_CALL16",	/* name */
   1628  1.1  skrll 	 FALSE,			/* partial_inplace */
   1629  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1630  1.1  skrll 	 0x0000ffff,	        /* dst_mask */
   1631  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1632  1.1  skrll 
   1633  1.1  skrll   /* MIPS16 high 16 bits of symbol value.  */
   1634  1.1  skrll   HOWTO (R_MIPS16_HI16,		/* type */
   1635  1.1  skrll 	 16,			/* rightshift */
   1636  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1637  1.1  skrll 	 16,			/* bitsize */
   1638  1.1  skrll 	 FALSE,			/* pc_relative */
   1639  1.1  skrll 	 0,			/* bitpos */
   1640  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1641  1.1  skrll 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   1642  1.1  skrll 	 "R_MIPS16_HI16",	/* name */
   1643  1.1  skrll 	 FALSE,			/* partial_inplace */
   1644  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1645  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1646  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1647  1.1  skrll 
   1648  1.1  skrll   /* MIPS16 low 16 bits of symbol value.  */
   1649  1.1  skrll   HOWTO (R_MIPS16_LO16,		/* type */
   1650  1.1  skrll 	 0,			/* rightshift */
   1651  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1652  1.1  skrll 	 16,			/* bitsize */
   1653  1.1  skrll 	 FALSE,			/* pc_relative */
   1654  1.1  skrll 	 0,			/* bitpos */
   1655  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1656  1.1  skrll 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   1657  1.1  skrll 	 "R_MIPS16_LO16",	/* name */
   1658  1.1  skrll 	 FALSE,			/* partial_inplace */
   1659  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1660  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1661  1.1  skrll 	 FALSE),		/* pcrel_offset */
   1662  1.1  skrll };
   1663  1.1  skrll 
   1664  1.1  skrll /* GNU extension to record C++ vtable hierarchy */
   1665  1.1  skrll static reloc_howto_type elf_mips_gnu_vtinherit_howto =
   1666  1.1  skrll   HOWTO (R_MIPS_GNU_VTINHERIT,	/* type */
   1667  1.1  skrll 	 0,			/* rightshift */
   1668  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1669  1.1  skrll 	 0,			/* bitsize */
   1670  1.1  skrll 	 FALSE,			/* pc_relative */
   1671  1.1  skrll 	 0,			/* bitpos */
   1672  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1673  1.1  skrll 	 NULL,			/* special_function */
   1674  1.1  skrll 	 "R_MIPS_GNU_VTINHERIT", /* name */
   1675  1.1  skrll 	 FALSE,			/* partial_inplace */
   1676  1.1  skrll 	 0,			/* src_mask */
   1677  1.1  skrll 	 0,			/* dst_mask */
   1678  1.1  skrll 	 FALSE);		/* pcrel_offset */
   1679  1.1  skrll 
   1680  1.1  skrll /* GNU extension to record C++ vtable member usage */
   1681  1.1  skrll static reloc_howto_type elf_mips_gnu_vtentry_howto =
   1682  1.1  skrll   HOWTO (R_MIPS_GNU_VTENTRY,	/* type */
   1683  1.1  skrll 	 0,			/* rightshift */
   1684  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1685  1.1  skrll 	 0,			/* bitsize */
   1686  1.1  skrll 	 FALSE,			/* pc_relative */
   1687  1.1  skrll 	 0,			/* bitpos */
   1688  1.1  skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1689  1.1  skrll 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
   1690  1.1  skrll 	 "R_MIPS_GNU_VTENTRY",	/* name */
   1691  1.1  skrll 	 FALSE,			/* partial_inplace */
   1692  1.1  skrll 	 0,			/* src_mask */
   1693  1.1  skrll 	 0,			/* dst_mask */
   1694  1.1  skrll 	 FALSE);		/* pcrel_offset */
   1695  1.1  skrll 
   1696  1.1  skrll /* 16 bit offset for pc-relative branches.  */
   1698  1.1  skrll static reloc_howto_type elf_mips_gnu_rel16_s2 =
   1699  1.1  skrll   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
   1700  1.1  skrll 	 2,			/* rightshift */
   1701  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1702  1.1  skrll 	 16,			/* bitsize */
   1703  1.1  skrll 	 TRUE,			/* pc_relative */
   1704  1.1  skrll 	 0,			/* bitpos */
   1705  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1706  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1707  1.1  skrll 	 "R_MIPS_GNU_REL16_S2",	/* name */
   1708  1.1  skrll 	 TRUE,			/* partial_inplace */
   1709  1.1  skrll 	 0x0000ffff,		/* src_mask */
   1710  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1711  1.1  skrll 	 TRUE);			/* pcrel_offset */
   1712  1.1  skrll 
   1713  1.1  skrll /* 16 bit offset for pc-relative branches.  */
   1714  1.1  skrll static reloc_howto_type elf_mips_gnu_rela16_s2 =
   1715  1.1  skrll   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
   1716  1.1  skrll 	 2,			/* rightshift */
   1717  1.1  skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1718  1.1  skrll 	 16,			/* bitsize */
   1719  1.1  skrll 	 TRUE,			/* pc_relative */
   1720  1.1  skrll 	 0,			/* bitpos */
   1721  1.1  skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1722  1.1  skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1723  1.1  skrll 	 "R_MIPS_GNU_REL16_S2",	/* name */
   1724  1.1  skrll 	 FALSE,			/* partial_inplace */
   1725  1.1  skrll 	 0,			/* src_mask */
   1726  1.1  skrll 	 0x0000ffff,		/* dst_mask */
   1727  1.1  skrll 	 TRUE);			/* pcrel_offset */
   1728  1.1  skrll 
   1729  1.1  skrll /* Originally a VxWorks extension, but now used for other systems too.  */
   1731  1.1  skrll static reloc_howto_type elf_mips_copy_howto =
   1732  1.1  skrll   HOWTO (R_MIPS_COPY,		/* type */
   1733  1.1  skrll 	 0,			/* rightshift */
   1734  1.1  skrll 	 0,			/* this one is variable size */
   1735  1.1  skrll 	 0,			/* bitsize */
   1736  1.1  skrll 	 FALSE,			/* pc_relative */
   1737  1.1  skrll 	 0,			/* bitpos */
   1738  1.1  skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   1739  1.1  skrll 	 bfd_elf_generic_reloc,	/* special_function */
   1740  1.1  skrll 	 "R_MIPS_COPY",		/* name */
   1741  1.1  skrll 	 FALSE,			/* partial_inplace */
   1742  1.1  skrll 	 0x0,         		/* src_mask */
   1743  1.1  skrll 	 0x0,		        /* dst_mask */
   1744  1.1  skrll 	 FALSE);		/* pcrel_offset */
   1745  1.1  skrll 
   1746  1.1  skrll /* Originally a VxWorks extension, but now used for other systems too.  */
   1747  1.1  skrll static reloc_howto_type elf_mips_jump_slot_howto =
   1748  1.1  skrll   HOWTO (R_MIPS_JUMP_SLOT,	/* type */
   1749  1.1  skrll 	 0,			/* rightshift */
   1750  1.1  skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1751  1.1  skrll 	 64,			/* bitsize */
   1752  1.1  skrll 	 FALSE,			/* pc_relative */
   1753  1.1  skrll 	 0,			/* bitpos */
   1754  1.1  skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   1755  1.1  skrll 	 bfd_elf_generic_reloc,	/* special_function */
   1756  1.1  skrll 	 "R_MIPS_JUMP_SLOT",	/* name */
   1757  1.1  skrll 	 FALSE,			/* partial_inplace */
   1758  1.1  skrll 	 0x0,         		/* src_mask */
   1759  1.1  skrll 	 0x0,		        /* dst_mask */
   1760  1.1  skrll 	 FALSE);		/* pcrel_offset */
   1761  1.1  skrll 
   1762  1.1  skrll /* Swap in a MIPS 64-bit Rel reloc.  */
   1764  1.1  skrll 
   1765  1.1  skrll static void
   1766  1.1  skrll mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
   1767  1.1  skrll 			  Elf64_Mips_Internal_Rela *dst)
   1768  1.1  skrll {
   1769  1.1  skrll   dst->r_offset = H_GET_64 (abfd, src->r_offset);
   1770  1.1  skrll   dst->r_sym = H_GET_32 (abfd, src->r_sym);
   1771  1.1  skrll   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
   1772  1.1  skrll   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
   1773  1.1  skrll   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
   1774  1.1  skrll   dst->r_type = H_GET_8 (abfd, src->r_type);
   1775  1.1  skrll   dst->r_addend = 0;
   1776  1.1  skrll }
   1777  1.1  skrll 
   1778  1.1  skrll /* Swap in a MIPS 64-bit Rela reloc.  */
   1779  1.1  skrll 
   1780  1.1  skrll static void
   1781  1.1  skrll mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
   1782  1.1  skrll 			   Elf64_Mips_Internal_Rela *dst)
   1783  1.1  skrll {
   1784  1.1  skrll   dst->r_offset = H_GET_64 (abfd, src->r_offset);
   1785  1.1  skrll   dst->r_sym = H_GET_32 (abfd, src->r_sym);
   1786  1.1  skrll   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
   1787  1.1  skrll   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
   1788  1.1  skrll   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
   1789  1.1  skrll   dst->r_type = H_GET_8 (abfd, src->r_type);
   1790  1.1  skrll   dst->r_addend = H_GET_S64 (abfd, src->r_addend);
   1791  1.1  skrll }
   1792  1.1  skrll 
   1793  1.1  skrll /* Swap out a MIPS 64-bit Rel reloc.  */
   1794  1.1  skrll 
   1795  1.1  skrll static void
   1796  1.1  skrll mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
   1797  1.1  skrll 			   Elf64_Mips_External_Rel *dst)
   1798  1.1  skrll {
   1799  1.1  skrll   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
   1800  1.1  skrll   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
   1801  1.1  skrll   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
   1802  1.1  skrll   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
   1803  1.1  skrll   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
   1804  1.1  skrll   H_PUT_8 (abfd, src->r_type, dst->r_type);
   1805  1.1  skrll }
   1806  1.1  skrll 
   1807  1.1  skrll /* Swap out a MIPS 64-bit Rela reloc.  */
   1808  1.1  skrll 
   1809  1.1  skrll static void
   1810  1.1  skrll mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
   1811  1.1  skrll 			    Elf64_Mips_External_Rela *dst)
   1812  1.1  skrll {
   1813  1.1  skrll   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
   1814  1.1  skrll   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
   1815  1.1  skrll   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
   1816  1.1  skrll   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
   1817  1.1  skrll   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
   1818  1.1  skrll   H_PUT_8 (abfd, src->r_type, dst->r_type);
   1819  1.1  skrll   H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
   1820  1.1  skrll }
   1821  1.1  skrll 
   1822  1.1  skrll /* Swap in a MIPS 64-bit Rel reloc.  */
   1823  1.1  skrll 
   1824  1.1  skrll static void
   1825  1.1  skrll mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
   1826  1.1  skrll 			     Elf_Internal_Rela *dst)
   1827  1.1  skrll {
   1828  1.1  skrll   Elf64_Mips_Internal_Rela mirel;
   1829  1.1  skrll 
   1830  1.1  skrll   mips_elf64_swap_reloc_in (abfd,
   1831  1.1  skrll 			    (const Elf64_Mips_External_Rel *) src,
   1832  1.1  skrll 			    &mirel);
   1833  1.1  skrll 
   1834  1.1  skrll   dst[0].r_offset = mirel.r_offset;
   1835  1.1  skrll   dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
   1836  1.1  skrll   dst[0].r_addend = 0;
   1837  1.1  skrll   dst[1].r_offset = mirel.r_offset;
   1838  1.1  skrll   dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
   1839  1.1  skrll   dst[1].r_addend = 0;
   1840  1.1  skrll   dst[2].r_offset = mirel.r_offset;
   1841  1.1  skrll   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
   1842  1.1  skrll   dst[2].r_addend = 0;
   1843  1.1  skrll }
   1844  1.1  skrll 
   1845  1.1  skrll /* Swap in a MIPS 64-bit Rela reloc.  */
   1846  1.1  skrll 
   1847  1.1  skrll static void
   1848  1.1  skrll mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
   1849  1.1  skrll 			      Elf_Internal_Rela *dst)
   1850  1.1  skrll {
   1851  1.1  skrll   Elf64_Mips_Internal_Rela mirela;
   1852  1.1  skrll 
   1853  1.1  skrll   mips_elf64_swap_reloca_in (abfd,
   1854  1.1  skrll 			     (const Elf64_Mips_External_Rela *) src,
   1855  1.1  skrll 			     &mirela);
   1856  1.1  skrll 
   1857  1.1  skrll   dst[0].r_offset = mirela.r_offset;
   1858  1.1  skrll   dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type);
   1859  1.1  skrll   dst[0].r_addend = mirela.r_addend;
   1860  1.1  skrll   dst[1].r_offset = mirela.r_offset;
   1861  1.1  skrll   dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2);
   1862  1.1  skrll   dst[1].r_addend = 0;
   1863  1.1  skrll   dst[2].r_offset = mirela.r_offset;
   1864  1.1  skrll   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3);
   1865  1.1  skrll   dst[2].r_addend = 0;
   1866  1.1  skrll }
   1867  1.1  skrll 
   1868  1.1  skrll /* Swap out a MIPS 64-bit Rel reloc.  */
   1869  1.1  skrll 
   1870  1.1  skrll static void
   1871  1.1  skrll mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
   1872  1.1  skrll 			      bfd_byte *dst)
   1873  1.1  skrll {
   1874  1.1  skrll   Elf64_Mips_Internal_Rela mirel;
   1875  1.1  skrll 
   1876  1.1  skrll   mirel.r_offset = src[0].r_offset;
   1877  1.1  skrll   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
   1878  1.1  skrll 
   1879  1.1  skrll   mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
   1880  1.1  skrll   mirel.r_sym = ELF64_R_SYM (src[0].r_info);
   1881  1.1  skrll   mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
   1882  1.1  skrll   mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
   1883  1.1  skrll   mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
   1884  1.1  skrll 
   1885  1.1  skrll   mips_elf64_swap_reloc_out (abfd, &mirel,
   1886  1.1  skrll 			     (Elf64_Mips_External_Rel *) dst);
   1887  1.1  skrll }
   1888  1.1  skrll 
   1889  1.1  skrll /* Swap out a MIPS 64-bit Rela reloc.  */
   1890  1.1  skrll 
   1891  1.1  skrll static void
   1892  1.1  skrll mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src,
   1893  1.1  skrll 			       bfd_byte *dst)
   1894  1.1  skrll {
   1895  1.1  skrll   Elf64_Mips_Internal_Rela mirela;
   1896  1.1  skrll 
   1897  1.1  skrll   mirela.r_offset = src[0].r_offset;
   1898  1.1  skrll   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
   1899  1.1  skrll   BFD_ASSERT(src[0].r_offset == src[2].r_offset);
   1900  1.1  skrll 
   1901  1.1  skrll   mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
   1902  1.1  skrll   mirela.r_sym = ELF64_R_SYM (src[0].r_info);
   1903  1.1  skrll   mirela.r_addend = src[0].r_addend;
   1904  1.1  skrll   BFD_ASSERT(src[1].r_addend == 0);
   1905  1.1  skrll   BFD_ASSERT(src[2].r_addend == 0);
   1906  1.1  skrll 
   1907  1.1  skrll   mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
   1908  1.1  skrll   mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
   1909  1.1  skrll   mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
   1910  1.1  skrll 
   1911  1.1  skrll   mips_elf64_swap_reloca_out (abfd, &mirela,
   1912  1.1  skrll 			      (Elf64_Mips_External_Rela *) dst);
   1913  1.1  skrll }
   1914  1.1  skrll 
   1915  1.1  skrll /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
   1917  1.1  skrll    dangerous relocation.  */
   1918  1.1  skrll 
   1919  1.1  skrll static bfd_boolean
   1920  1.1  skrll mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp)
   1921  1.1  skrll {
   1922  1.1  skrll   unsigned int count;
   1923  1.1  skrll   asymbol **sym;
   1924  1.1  skrll   unsigned int i;
   1925  1.1  skrll 
   1926  1.1  skrll   /* If we've already figured out what GP will be, just return it.  */
   1927  1.1  skrll   *pgp = _bfd_get_gp_value (output_bfd);
   1928  1.1  skrll   if (*pgp)
   1929  1.1  skrll     return TRUE;
   1930  1.1  skrll 
   1931  1.1  skrll   count = bfd_get_symcount (output_bfd);
   1932  1.1  skrll   sym = bfd_get_outsymbols (output_bfd);
   1933  1.1  skrll 
   1934  1.1  skrll   /* The linker script will have created a symbol named `_gp' with the
   1935  1.1  skrll      appropriate value.  */
   1936  1.1  skrll   if (sym == NULL)
   1937  1.1  skrll     i = count;
   1938  1.1  skrll   else
   1939  1.1  skrll     {
   1940  1.1  skrll       for (i = 0; i < count; i++, sym++)
   1941  1.1  skrll 	{
   1942  1.1  skrll 	  register const char *name;
   1943  1.1  skrll 
   1944  1.1  skrll 	  name = bfd_asymbol_name (*sym);
   1945  1.1  skrll 	  if (*name == '_' && strcmp (name, "_gp") == 0)
   1946  1.1  skrll 	    {
   1947  1.1  skrll 	      *pgp = bfd_asymbol_value (*sym);
   1948  1.1  skrll 	      _bfd_set_gp_value (output_bfd, *pgp);
   1949  1.1  skrll 	      break;
   1950  1.1  skrll 	    }
   1951  1.1  skrll 	}
   1952  1.1  skrll     }
   1953  1.1  skrll 
   1954  1.1  skrll   if (i >= count)
   1955  1.1  skrll     {
   1956  1.1  skrll       /* Only get the error once.  */
   1957  1.1  skrll       *pgp = 4;
   1958  1.1  skrll       _bfd_set_gp_value (output_bfd, *pgp);
   1959  1.1  skrll       return FALSE;
   1960  1.1  skrll     }
   1961  1.1  skrll 
   1962  1.1  skrll   return TRUE;
   1963  1.1  skrll }
   1964  1.1  skrll 
   1965  1.1  skrll /* We have to figure out the gp value, so that we can adjust the
   1966  1.1  skrll    symbol value correctly.  We look up the symbol _gp in the output
   1967  1.1  skrll    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
   1968  1.1  skrll    target data.  We don't need to adjust the symbol value for an
   1969  1.1  skrll    external symbol if we are producing relocatable output.  */
   1970  1.1  skrll 
   1971  1.1  skrll static bfd_reloc_status_type
   1972  1.1  skrll mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
   1973  1.1  skrll 		     char **error_message, bfd_vma *pgp)
   1974  1.1  skrll {
   1975  1.1  skrll   if (bfd_is_und_section (symbol->section)
   1976  1.1  skrll       && ! relocatable)
   1977  1.1  skrll     {
   1978  1.1  skrll       *pgp = 0;
   1979  1.1  skrll       return bfd_reloc_undefined;
   1980  1.1  skrll     }
   1981  1.1  skrll 
   1982  1.1  skrll   *pgp = _bfd_get_gp_value (output_bfd);
   1983  1.1  skrll   if (*pgp == 0
   1984  1.1  skrll       && (! relocatable
   1985  1.1  skrll 	  || (symbol->flags & BSF_SECTION_SYM) != 0))
   1986  1.1  skrll     {
   1987  1.1  skrll       if (relocatable)
   1988  1.1  skrll 	{
   1989  1.1  skrll 	  /* Make up a value.  */
   1990  1.1  skrll 	  *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
   1991  1.1  skrll 	  _bfd_set_gp_value (output_bfd, *pgp);
   1992  1.1  skrll 	}
   1993  1.1  skrll       else if (!mips_elf64_assign_gp (output_bfd, pgp))
   1994  1.1  skrll 	{
   1995  1.1  skrll 	  *error_message =
   1996  1.1  skrll 	    (char *) _("GP relative relocation when _gp not defined");
   1997  1.1  skrll 	  return bfd_reloc_dangerous;
   1998  1.1  skrll 	}
   1999  1.1  skrll     }
   2000  1.1  skrll 
   2001  1.1  skrll   return bfd_reloc_ok;
   2002  1.1  skrll }
   2003  1.1  skrll 
   2004  1.1  skrll /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
   2005  1.1  skrll    become the offset from the gp register.  */
   2006  1.1  skrll 
   2007  1.1  skrll static bfd_reloc_status_type
   2008  1.1  skrll mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   2009  1.1  skrll 			  void *data, asection *input_section, bfd *output_bfd,
   2010  1.1  skrll 			  char **error_message)
   2011  1.1  skrll {
   2012  1.1  skrll   bfd_boolean relocatable;
   2013  1.1  skrll   bfd_reloc_status_type ret;
   2014  1.1  skrll   bfd_vma gp;
   2015  1.1  skrll 
   2016  1.1  skrll   /* If we're relocating, and this is an external symbol, we don't want
   2017  1.1  skrll      to change anything.  */
   2018  1.1  skrll   if (output_bfd != NULL
   2019  1.1  skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
   2020  1.1  skrll       && (symbol->flags & BSF_LOCAL) != 0)
   2021  1.1  skrll     {
   2022  1.1  skrll       reloc_entry->address += input_section->output_offset;
   2023  1.1  skrll       return bfd_reloc_ok;
   2024  1.1  skrll     }
   2025  1.1  skrll 
   2026  1.1  skrll   if (output_bfd != NULL)
   2027  1.1  skrll     relocatable = TRUE;
   2028  1.1  skrll   else
   2029  1.1  skrll     {
   2030  1.1  skrll       relocatable = FALSE;
   2031  1.1  skrll       output_bfd = symbol->section->output_section->owner;
   2032  1.1  skrll     }
   2033  1.1  skrll 
   2034  1.1  skrll   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
   2035  1.1  skrll 			     &gp);
   2036  1.1  skrll   if (ret != bfd_reloc_ok)
   2037  1.1  skrll     return ret;
   2038  1.1  skrll 
   2039  1.1  skrll   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   2040  1.1  skrll 					input_section, relocatable,
   2041  1.1  skrll 					data, gp);
   2042  1.1  skrll }
   2043  1.1  skrll 
   2044  1.1  skrll /* Do a R_MIPS_LITERAL relocation.  */
   2045  1.1  skrll 
   2046  1.1  skrll static bfd_reloc_status_type
   2047  1.1  skrll mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   2048  1.1  skrll 			  void *data, asection *input_section, bfd *output_bfd,
   2049  1.1  skrll 			  char **error_message)
   2050  1.1  skrll {
   2051  1.1  skrll   bfd_boolean relocatable;
   2052  1.1  skrll   bfd_reloc_status_type ret;
   2053  1.1  skrll   bfd_vma gp;
   2054  1.1  skrll 
   2055  1.1  skrll   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
   2056  1.1  skrll   if (output_bfd != NULL
   2057  1.1  skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
   2058  1.1  skrll       && (symbol->flags & BSF_LOCAL) != 0)
   2059  1.1  skrll     {
   2060  1.1  skrll       *error_message = (char *)
   2061  1.1  skrll 	_("literal relocation occurs for an external symbol");
   2062  1.1  skrll       return bfd_reloc_outofrange;
   2063  1.1  skrll     }
   2064  1.1  skrll 
   2065  1.1  skrll   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
   2066  1.1  skrll   if (output_bfd != NULL)
   2067  1.1  skrll     relocatable = TRUE;
   2068  1.1  skrll   else
   2069  1.1  skrll     {
   2070  1.1  skrll       relocatable = FALSE;
   2071  1.1  skrll       output_bfd = symbol->section->output_section->owner;
   2072  1.1  skrll     }
   2073  1.1  skrll 
   2074  1.1  skrll   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
   2075  1.1  skrll 			     &gp);
   2076  1.1  skrll   if (ret != bfd_reloc_ok)
   2077  1.1  skrll     return ret;
   2078  1.1  skrll 
   2079  1.1  skrll   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   2080  1.1  skrll 					input_section, relocatable,
   2081  1.1  skrll 					data, gp);
   2082  1.1  skrll }
   2083  1.1  skrll 
   2084  1.1  skrll /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
   2085  1.1  skrll    become the offset from the gp register.  */
   2086  1.1  skrll 
   2087  1.1  skrll static bfd_reloc_status_type
   2088  1.1  skrll mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   2089  1.1  skrll 			  void *data, asection *input_section, bfd *output_bfd,
   2090  1.1  skrll 			  char **error_message)
   2091  1.1  skrll {
   2092  1.1  skrll   bfd_boolean relocatable;
   2093  1.1  skrll   bfd_reloc_status_type ret;
   2094  1.1  skrll   bfd_vma gp;
   2095  1.1  skrll   bfd_vma relocation;
   2096  1.1  skrll   bfd_vma val;
   2097  1.1  skrll 
   2098  1.1  skrll   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
   2099  1.1  skrll   if (output_bfd != NULL
   2100  1.1  skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
   2101  1.1  skrll       && (symbol->flags & BSF_LOCAL) != 0)
   2102  1.1  skrll     {
   2103  1.1  skrll       *error_message = (char *)
   2104  1.1  skrll 	_("32bits gp relative relocation occurs for an external symbol");
   2105  1.1  skrll       return bfd_reloc_outofrange;
   2106  1.1  skrll     }
   2107  1.1  skrll 
   2108  1.1  skrll   if (output_bfd != NULL)
   2109  1.1  skrll     relocatable = TRUE;
   2110  1.1  skrll   else
   2111  1.1  skrll     {
   2112  1.1  skrll       relocatable = FALSE;
   2113  1.1  skrll       output_bfd = symbol->section->output_section->owner;
   2114  1.1  skrll     }
   2115  1.1  skrll 
   2116  1.1  skrll   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable,
   2117  1.1  skrll 			     error_message, &gp);
   2118  1.1  skrll   if (ret != bfd_reloc_ok)
   2119  1.1  skrll     return ret;
   2120  1.1  skrll 
   2121  1.1  skrll   if (bfd_is_com_section (symbol->section))
   2122  1.1  skrll     relocation = 0;
   2123  1.1  skrll   else
   2124  1.1  skrll     relocation = symbol->value;
   2125  1.1  skrll 
   2126  1.1  skrll   relocation += symbol->section->output_section->vma;
   2127  1.1  skrll   relocation += symbol->section->output_offset;
   2128  1.1  skrll 
   2129  1.1  skrll   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
   2130  1.1  skrll     return bfd_reloc_outofrange;
   2131  1.1  skrll 
   2132  1.1  skrll   /* Set val to the offset into the section or symbol.  */
   2133  1.1  skrll   val = reloc_entry->addend;
   2134  1.1  skrll 
   2135  1.1  skrll   if (reloc_entry->howto->partial_inplace)
   2136  1.1  skrll     val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
   2137  1.1  skrll 
   2138  1.1  skrll   /* Adjust val for the final section location and GP value.  If we
   2139  1.1  skrll      are producing relocatable output, we don't want to do this for
   2140  1.1  skrll      an external symbol.  */
   2141  1.1  skrll   if (! relocatable
   2142  1.1  skrll       || (symbol->flags & BSF_SECTION_SYM) != 0)
   2143  1.1  skrll     val += relocation - gp;
   2144  1.1  skrll 
   2145  1.1  skrll   if (reloc_entry->howto->partial_inplace)
   2146  1.1  skrll     bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
   2147  1.1  skrll   else
   2148  1.1  skrll     reloc_entry->addend = val;
   2149  1.1  skrll 
   2150  1.1  skrll   if (relocatable)
   2151  1.1  skrll     reloc_entry->address += input_section->output_offset;
   2152  1.1  skrll 
   2153  1.1  skrll   return bfd_reloc_ok;
   2154  1.1  skrll }
   2155  1.1  skrll 
   2156  1.1  skrll /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
   2157  1.1  skrll    the rest is at bits 6-10. The bitpos already got right by the howto.  */
   2158  1.1  skrll 
   2159  1.1  skrll static bfd_reloc_status_type
   2160  1.1  skrll mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   2161  1.1  skrll 			 void *data, asection *input_section, bfd *output_bfd,
   2162  1.1  skrll 			 char **error_message)
   2163  1.1  skrll {
   2164  1.1  skrll   if (reloc_entry->howto->partial_inplace)
   2165  1.1  skrll     {
   2166  1.1  skrll       reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
   2167  1.1  skrll 			     | (reloc_entry->addend & 0x00000800) >> 9);
   2168  1.1  skrll     }
   2169  1.1  skrll 
   2170  1.1  skrll   return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
   2171  1.1  skrll 				      input_section, output_bfd,
   2172  1.1  skrll 				      error_message);
   2173  1.1  skrll }
   2174  1.1  skrll 
   2175  1.1  skrll /* Handle a mips16 GP relative reloc.  */
   2176  1.1  skrll 
   2177  1.1  skrll static bfd_reloc_status_type
   2178  1.1  skrll mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   2179  1.1  skrll 		    void *data, asection *input_section, bfd *output_bfd,
   2180  1.1  skrll 		    char **error_message)
   2181  1.1  skrll {
   2182  1.1  skrll   bfd_boolean relocatable;
   2183  1.1  skrll   bfd_reloc_status_type ret;
   2184  1.1  skrll   bfd_byte *location;
   2185  1.1  skrll   bfd_vma gp;
   2186  1.1  skrll 
   2187  1.1  skrll   /* If we're relocating, and this is an external symbol, we don't want
   2188  1.1  skrll      to change anything.  */
   2189  1.1  skrll   if (output_bfd != NULL
   2190  1.1  skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
   2191  1.1  skrll       && (symbol->flags & BSF_LOCAL) != 0)
   2192  1.1  skrll     {
   2193  1.1  skrll       reloc_entry->address += input_section->output_offset;
   2194  1.1  skrll       return bfd_reloc_ok;
   2195  1.1  skrll     }
   2196  1.1  skrll 
   2197  1.1  skrll   if (output_bfd != NULL)
   2198  1.1  skrll     relocatable = TRUE;
   2199  1.1  skrll   else
   2200  1.1  skrll     {
   2201  1.1  skrll       relocatable = FALSE;
   2202  1.1  skrll       output_bfd = symbol->section->output_section->owner;
   2203  1.1  skrll     }
   2204  1.1  skrll 
   2205  1.1  skrll   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
   2206  1.1  skrll 			     &gp);
   2207  1.1  skrll   if (ret != bfd_reloc_ok)
   2208  1.1  skrll     return ret;
   2209  1.1  skrll 
   2210  1.1  skrll   location = (bfd_byte *) data + reloc_entry->address;
   2211  1.1  skrll   _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
   2212  1.1  skrll 				   location);
   2213  1.1  skrll   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   2214  1.1  skrll 				       input_section, relocatable,
   2215  1.1  skrll 				       data, gp);
   2216  1.1  skrll   _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
   2217  1.1  skrll 				 location);
   2218  1.1  skrll 
   2219  1.1  skrll   return ret;
   2220  1.1  skrll }
   2221  1.1  skrll 
   2222  1.1  skrll /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
   2224  1.1  skrll 
   2225  1.1  skrll struct elf_reloc_map {
   2226  1.1  skrll   bfd_reloc_code_real_type bfd_val;
   2227  1.1  skrll   enum elf_mips_reloc_type elf_val;
   2228  1.1  skrll };
   2229  1.1  skrll 
   2230  1.1  skrll static const struct elf_reloc_map mips_reloc_map[] =
   2231  1.1  skrll {
   2232  1.1  skrll   { BFD_RELOC_NONE, R_MIPS_NONE },
   2233  1.1  skrll   { BFD_RELOC_16, R_MIPS_16 },
   2234  1.1  skrll   { BFD_RELOC_32, R_MIPS_32 },
   2235  1.1  skrll   /* There is no BFD reloc for R_MIPS_REL32.  */
   2236  1.1  skrll   { BFD_RELOC_64, R_MIPS_64 },
   2237  1.1  skrll   { BFD_RELOC_CTOR, R_MIPS_64 },
   2238  1.1  skrll   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
   2239  1.1  skrll   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
   2240  1.1  skrll   { BFD_RELOC_LO16, R_MIPS_LO16 },
   2241  1.1  skrll   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
   2242  1.1  skrll   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
   2243  1.1  skrll   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
   2244  1.1  skrll   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
   2245  1.1  skrll   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
   2246  1.1  skrll   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
   2247  1.1  skrll   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
   2248  1.1  skrll   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
   2249  1.1  skrll   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
   2250  1.1  skrll   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
   2251  1.1  skrll   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
   2252  1.1  skrll   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
   2253  1.1  skrll   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
   2254  1.1  skrll   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
   2255  1.1  skrll   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
   2256  1.1  skrll   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
   2257  1.1  skrll   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
   2258  1.1  skrll   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
   2259  1.1  skrll   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
   2260  1.1  skrll   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
   2261  1.1  skrll   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
   2262  1.1  skrll   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
   2263  1.1  skrll   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
   2264  1.1  skrll   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
   2265  1.1  skrll   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
   2266  1.1  skrll   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
   2267  1.1  skrll   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
   2268  1.1  skrll   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
   2269  1.1  skrll   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
   2270  1.1  skrll   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
   2271  1.1  skrll   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
   2272  1.1  skrll   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
   2273  1.1  skrll   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
   2274  1.1  skrll   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
   2275  1.1  skrll   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
   2276  1.1  skrll   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
   2277  1.1  skrll   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
   2278  1.1  skrll   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
   2279  1.1  skrll   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
   2280  1.1  skrll };
   2281  1.1  skrll 
   2282  1.1  skrll static const struct elf_reloc_map mips16_reloc_map[] =
   2283  1.1  skrll {
   2284  1.1  skrll   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
   2285  1.1  skrll   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
   2286  1.1  skrll   { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
   2287  1.1  skrll   { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
   2288  1.1  skrll   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
   2289  1.1  skrll   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
   2290  1.1  skrll };
   2291  1.1  skrll 
   2292  1.1  skrll /* Given a BFD reloc type, return a howto structure.  */
   2293  1.1  skrll 
   2294  1.1  skrll static reloc_howto_type *
   2295  1.1  skrll bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   2296  1.1  skrll 				 bfd_reloc_code_real_type code)
   2297  1.1  skrll {
   2298  1.1  skrll   unsigned int i;
   2299  1.1  skrll   /* FIXME: We default to RELA here instead of choosing the right
   2300  1.1  skrll      relocation variant.  */
   2301  1.1  skrll   reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
   2302  1.1  skrll   reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
   2303  1.1  skrll 
   2304  1.1  skrll   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
   2305  1.1  skrll        i++)
   2306  1.1  skrll     {
   2307  1.1  skrll       if (mips_reloc_map[i].bfd_val == code)
   2308  1.1  skrll 	return &howto_table[(int) mips_reloc_map[i].elf_val];
   2309  1.1  skrll     }
   2310  1.1  skrll 
   2311  1.1  skrll   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
   2312  1.1  skrll        i++)
   2313  1.1  skrll     {
   2314  1.1  skrll       if (mips16_reloc_map[i].bfd_val == code)
   2315  1.1  skrll 	return &howto16_table[(int) mips16_reloc_map[i].elf_val];
   2316  1.1  skrll     }
   2317  1.1  skrll 
   2318  1.1  skrll   switch (code)
   2319  1.1  skrll     {
   2320  1.1  skrll     case BFD_RELOC_VTABLE_INHERIT:
   2321  1.1  skrll       return &elf_mips_gnu_vtinherit_howto;
   2322  1.1  skrll     case BFD_RELOC_VTABLE_ENTRY:
   2323  1.1  skrll       return &elf_mips_gnu_vtentry_howto;
   2324  1.1  skrll     case BFD_RELOC_MIPS_COPY:
   2325  1.1  skrll       return &elf_mips_copy_howto;
   2326  1.1  skrll     case BFD_RELOC_MIPS_JUMP_SLOT:
   2327  1.1  skrll       return &elf_mips_jump_slot_howto;
   2328  1.1  skrll     default:
   2329  1.1  skrll       bfd_set_error (bfd_error_bad_value);
   2330  1.1  skrll       return NULL;
   2331  1.1  skrll     }
   2332  1.1  skrll }
   2333  1.1  skrll 
   2334  1.1  skrll static reloc_howto_type *
   2335  1.1  skrll bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   2336  1.1  skrll 				 const char *r_name)
   2337  1.1  skrll {
   2338  1.1  skrll   unsigned int i;
   2339  1.1  skrll 
   2340  1.1  skrll   for (i = 0;
   2341  1.1  skrll        i < (sizeof (mips_elf64_howto_table_rela)
   2342  1.1  skrll 	    / sizeof (mips_elf64_howto_table_rela[0])); i++)
   2343  1.1  skrll     if (mips_elf64_howto_table_rela[i].name != NULL
   2344  1.1  skrll 	&& strcasecmp (mips_elf64_howto_table_rela[i].name, r_name) == 0)
   2345  1.1  skrll       return &mips_elf64_howto_table_rela[i];
   2346  1.1  skrll 
   2347  1.1  skrll   for (i = 0;
   2348  1.1  skrll        i < (sizeof (mips16_elf64_howto_table_rela)
   2349  1.1  skrll 	    / sizeof (mips16_elf64_howto_table_rela[0]));
   2350  1.1  skrll        i++)
   2351  1.1  skrll     if (mips16_elf64_howto_table_rela[i].name != NULL
   2352  1.1  skrll 	&& strcasecmp (mips16_elf64_howto_table_rela[i].name, r_name) == 0)
   2353  1.1  skrll       return &mips16_elf64_howto_table_rela[i];
   2354  1.1  skrll 
   2355  1.1  skrll   if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
   2356  1.1  skrll     return &elf_mips_gnu_vtinherit_howto;
   2357  1.1  skrll   if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
   2358  1.1  skrll     return &elf_mips_gnu_vtentry_howto;
   2359  1.1  skrll   if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
   2360  1.1  skrll     return &elf_mips_gnu_rel16_s2;
   2361  1.1  skrll   if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
   2362  1.1  skrll     return &elf_mips_gnu_rela16_s2;
   2363  1.1  skrll   if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
   2364  1.1  skrll     return &elf_mips_copy_howto;
   2365  1.1  skrll   if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
   2366  1.1  skrll     return &elf_mips_jump_slot_howto;
   2367  1.1  skrll 
   2368  1.1  skrll   return NULL;
   2369  1.1  skrll }
   2370  1.1  skrll 
   2371  1.1  skrll /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
   2372  1.1  skrll 
   2373  1.1  skrll static reloc_howto_type *
   2374  1.1  skrll mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
   2375  1.1  skrll {
   2376  1.1  skrll   switch (r_type)
   2377  1.1  skrll     {
   2378  1.1  skrll     case R_MIPS_GNU_VTINHERIT:
   2379  1.1  skrll       return &elf_mips_gnu_vtinherit_howto;
   2380  1.1  skrll     case R_MIPS_GNU_VTENTRY:
   2381  1.1  skrll       return &elf_mips_gnu_vtentry_howto;
   2382  1.1  skrll     case R_MIPS_GNU_REL16_S2:
   2383  1.1  skrll       if (rela_p)
   2384  1.1  skrll 	return &elf_mips_gnu_rela16_s2;
   2385  1.1  skrll       else
   2386  1.1  skrll 	return &elf_mips_gnu_rel16_s2;
   2387  1.1  skrll     case R_MIPS_COPY:
   2388  1.1  skrll       return &elf_mips_copy_howto;
   2389  1.1  skrll     case R_MIPS_JUMP_SLOT:
   2390  1.1  skrll       return &elf_mips_jump_slot_howto;
   2391  1.1  skrll     default:
   2392  1.1  skrll       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
   2393  1.1  skrll 	{
   2394  1.1  skrll 	  if (rela_p)
   2395  1.1  skrll 	    return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
   2396  1.1  skrll 	  else
   2397  1.1  skrll 	    return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
   2398  1.1  skrll 	}
   2399  1.1  skrll       BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
   2400  1.1  skrll       if (rela_p)
   2401  1.1  skrll 	return &mips_elf64_howto_table_rela[r_type];
   2402  1.1  skrll       else
   2403  1.1  skrll 	return &mips_elf64_howto_table_rel[r_type];
   2404  1.1  skrll       break;
   2405  1.1  skrll     }
   2406  1.1  skrll }
   2407  1.1  skrll 
   2408  1.1  skrll /* Prevent relocation handling by bfd for MIPS ELF64.  */
   2409  1.1  skrll 
   2410  1.1  skrll static void
   2411  1.1  skrll mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
   2412  1.1  skrll 			      arelent *cache_ptr ATTRIBUTE_UNUSED,
   2413  1.1  skrll 			      Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
   2414  1.1  skrll {
   2415  1.1  skrll   BFD_ASSERT (0);
   2416  1.1  skrll }
   2417  1.1  skrll 
   2418  1.1  skrll static void
   2419  1.1  skrll mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
   2420  1.1  skrll 			       arelent *cache_ptr ATTRIBUTE_UNUSED,
   2421  1.1  skrll 			       Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
   2422  1.1  skrll {
   2423  1.1  skrll   BFD_ASSERT (0);
   2424  1.1  skrll }
   2425  1.1  skrll 
   2426  1.1  skrll /* Since each entry in an SHT_REL or SHT_RELA section can represent up
   2427  1.1  skrll    to three relocs, we must tell the user to allocate more space.  */
   2428  1.1  skrll 
   2429  1.1  skrll static long
   2430  1.1  skrll mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
   2431  1.1  skrll {
   2432  1.1  skrll   return (sec->reloc_count * 3 + 1) * sizeof (arelent *);
   2433  1.1  skrll }
   2434  1.1  skrll 
   2435  1.1  skrll static long
   2436  1.1  skrll mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd)
   2437  1.1  skrll {
   2438  1.1  skrll   return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3;
   2439  1.1  skrll }
   2440  1.1  skrll 
   2441  1.1  skrll /* We must also copy more relocations than the corresponding functions
   2442  1.1  skrll    in elf.c would, so the two following functions are slightly
   2443  1.1  skrll    modified from elf.c, that multiply the external relocation count by
   2444  1.1  skrll    3 to obtain the internal relocation count.  */
   2445  1.1  skrll 
   2446  1.1  skrll static long
   2447  1.1  skrll mips_elf64_canonicalize_reloc (bfd *abfd, sec_ptr section,
   2448  1.1  skrll 			       arelent **relptr, asymbol **symbols)
   2449  1.1  skrll {
   2450  1.1  skrll   arelent *tblptr;
   2451  1.1  skrll   unsigned int i;
   2452  1.1  skrll   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   2453  1.1  skrll 
   2454  1.1  skrll   if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
   2455  1.1  skrll     return -1;
   2456  1.1  skrll 
   2457  1.1  skrll   tblptr = section->relocation;
   2458  1.1  skrll   for (i = 0; i < section->reloc_count * 3; i++)
   2459  1.1  skrll     *relptr++ = tblptr++;
   2460  1.1  skrll 
   2461  1.1  skrll   *relptr = NULL;
   2462  1.1  skrll 
   2463  1.1  skrll   return section->reloc_count * 3;
   2464  1.1  skrll }
   2465  1.1  skrll 
   2466  1.1  skrll static long
   2467  1.1  skrll mips_elf64_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage,
   2468  1.1  skrll 				       asymbol **syms)
   2469  1.1  skrll {
   2470  1.1  skrll   bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
   2471  1.1  skrll   asection *s;
   2472  1.1  skrll   long ret;
   2473  1.1  skrll 
   2474  1.1  skrll   if (elf_dynsymtab (abfd) == 0)
   2475  1.1  skrll     {
   2476  1.1  skrll       bfd_set_error (bfd_error_invalid_operation);
   2477  1.1  skrll       return -1;
   2478  1.1  skrll     }
   2479  1.1  skrll 
   2480  1.1  skrll   slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
   2481  1.1  skrll   ret = 0;
   2482  1.1  skrll   for (s = abfd->sections; s != NULL; s = s->next)
   2483  1.1  skrll     {
   2484  1.1  skrll       if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
   2485  1.1  skrll 	  && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
   2486  1.1  skrll 	      || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
   2487  1.1  skrll 	{
   2488  1.1  skrll 	  arelent *p;
   2489  1.1  skrll 	  long count, i;
   2490  1.1  skrll 
   2491  1.1  skrll 	  if (! (*slurp_relocs) (abfd, s, syms, TRUE))
   2492  1.1  skrll 	    return -1;
   2493  1.1  skrll 	  count = s->size / elf_section_data (s)->this_hdr.sh_entsize * 3;
   2494  1.1  skrll 	  p = s->relocation;
   2495  1.1  skrll 	  for (i = 0; i < count; i++)
   2496  1.1  skrll 	    *storage++ = p++;
   2497  1.1  skrll 	  ret += count;
   2498  1.1  skrll 	}
   2499  1.1  skrll     }
   2500  1.1  skrll 
   2501  1.1  skrll   *storage = NULL;
   2502  1.1  skrll 
   2503  1.1  skrll   return ret;
   2504  1.1  skrll }
   2505  1.1  skrll 
   2506  1.1  skrll /* Read the relocations from one reloc section.  This is mostly copied
   2507  1.1  skrll    from elfcode.h, except for the changes to expand one external
   2508  1.1  skrll    relocation to 3 internal ones.  We must unfortunately set
   2509  1.1  skrll    reloc_count to the number of external relocations, because a lot of
   2510  1.1  skrll    generic code seems to depend on this.  */
   2511  1.1  skrll 
   2512  1.1  skrll static bfd_boolean
   2513  1.1  skrll mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
   2514  1.1  skrll 				  Elf_Internal_Shdr *rel_hdr,
   2515  1.1  skrll 				  bfd_size_type reloc_count,
   2516  1.1  skrll 				  arelent *relents, asymbol **symbols,
   2517  1.1  skrll 				  bfd_boolean dynamic)
   2518  1.1  skrll {
   2519  1.1  skrll   void *allocated;
   2520  1.1  skrll   bfd_byte *native_relocs;
   2521  1.1  skrll   arelent *relent;
   2522  1.1  skrll   bfd_vma i;
   2523  1.1  skrll   int entsize;
   2524  1.1  skrll   bfd_boolean rela_p;
   2525  1.1  skrll 
   2526  1.1  skrll   allocated = bfd_malloc (rel_hdr->sh_size);
   2527  1.1  skrll   if (allocated == NULL)
   2528  1.1  skrll     return FALSE;
   2529  1.1  skrll 
   2530  1.1  skrll   if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
   2531  1.1  skrll       || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
   2532  1.1  skrll 	  != rel_hdr->sh_size))
   2533  1.1  skrll     goto error_return;
   2534  1.1  skrll 
   2535  1.1  skrll   native_relocs = allocated;
   2536  1.1  skrll 
   2537  1.1  skrll   entsize = rel_hdr->sh_entsize;
   2538  1.1  skrll   BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
   2539  1.1  skrll 	      || entsize == sizeof (Elf64_Mips_External_Rela));
   2540  1.1  skrll 
   2541  1.1  skrll   if (entsize == sizeof (Elf64_Mips_External_Rel))
   2542  1.1  skrll     rela_p = FALSE;
   2543  1.1  skrll   else
   2544  1.1  skrll     rela_p = TRUE;
   2545  1.1  skrll 
   2546  1.1  skrll   for (i = 0, relent = relents;
   2547  1.1  skrll        i < reloc_count;
   2548  1.1  skrll        i++, native_relocs += entsize)
   2549  1.1  skrll     {
   2550  1.1  skrll       Elf64_Mips_Internal_Rela rela;
   2551  1.1  skrll       bfd_boolean used_sym, used_ssym;
   2552  1.1  skrll       int ir;
   2553  1.1  skrll 
   2554  1.1  skrll       if (entsize == sizeof (Elf64_Mips_External_Rela))
   2555  1.1  skrll 	mips_elf64_swap_reloca_in (abfd,
   2556  1.1  skrll 				   (Elf64_Mips_External_Rela *) native_relocs,
   2557  1.1  skrll 				   &rela);
   2558  1.1  skrll       else
   2559  1.1  skrll 	mips_elf64_swap_reloc_in (abfd,
   2560  1.1  skrll 				  (Elf64_Mips_External_Rel *) native_relocs,
   2561  1.1  skrll 				  &rela);
   2562  1.1  skrll 
   2563  1.1  skrll       /* Each entry represents exactly three actual relocations.  */
   2564  1.1  skrll 
   2565  1.1  skrll       used_sym = FALSE;
   2566  1.1  skrll       used_ssym = FALSE;
   2567  1.1  skrll       for (ir = 0; ir < 3; ir++)
   2568  1.1  skrll 	{
   2569  1.1  skrll 	  enum elf_mips_reloc_type type;
   2570  1.1  skrll 
   2571  1.1  skrll 	  switch (ir)
   2572  1.1  skrll 	    {
   2573  1.1  skrll 	    default:
   2574  1.1  skrll 	      abort ();
   2575  1.1  skrll 	    case 0:
   2576  1.1  skrll 	      type = (enum elf_mips_reloc_type) rela.r_type;
   2577  1.1  skrll 	      break;
   2578  1.1  skrll 	    case 1:
   2579  1.1  skrll 	      type = (enum elf_mips_reloc_type) rela.r_type2;
   2580  1.1  skrll 	      break;
   2581  1.1  skrll 	    case 2:
   2582  1.1  skrll 	      type = (enum elf_mips_reloc_type) rela.r_type3;
   2583  1.1  skrll 	      break;
   2584  1.1  skrll 	    }
   2585  1.1  skrll 
   2586  1.1  skrll 	  /* Some types require symbols, whereas some do not.  */
   2587  1.1  skrll 	  switch (type)
   2588  1.1  skrll 	    {
   2589  1.1  skrll 	    case R_MIPS_NONE:
   2590  1.1  skrll 	    case R_MIPS_LITERAL:
   2591  1.1  skrll 	    case R_MIPS_INSERT_A:
   2592  1.1  skrll 	    case R_MIPS_INSERT_B:
   2593  1.1  skrll 	    case R_MIPS_DELETE:
   2594  1.1  skrll 	      relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
   2595  1.1  skrll 	      break;
   2596  1.1  skrll 
   2597  1.1  skrll 	    default:
   2598  1.1  skrll 	      if (! used_sym)
   2599  1.1  skrll 		{
   2600  1.1  skrll 		  if (rela.r_sym == 0)
   2601  1.1  skrll 		    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
   2602  1.1  skrll 		  else
   2603  1.1  skrll 		    {
   2604  1.1  skrll 		      asymbol **ps, *s;
   2605  1.1  skrll 
   2606  1.1  skrll 		      ps = symbols + rela.r_sym - 1;
   2607  1.1  skrll 		      s = *ps;
   2608  1.1  skrll 		      if ((s->flags & BSF_SECTION_SYM) == 0)
   2609  1.1  skrll 			relent->sym_ptr_ptr = ps;
   2610  1.1  skrll 		      else
   2611  1.1  skrll 			relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
   2612  1.1  skrll 		    }
   2613  1.1  skrll 
   2614  1.1  skrll 		  used_sym = TRUE;
   2615  1.1  skrll 		}
   2616  1.1  skrll 	      else if (! used_ssym)
   2617  1.1  skrll 		{
   2618  1.1  skrll 		  switch (rela.r_ssym)
   2619  1.1  skrll 		    {
   2620  1.1  skrll 		    case RSS_UNDEF:
   2621  1.1  skrll 		      relent->sym_ptr_ptr =
   2622  1.1  skrll 			bfd_abs_section_ptr->symbol_ptr_ptr;
   2623  1.1  skrll 		      break;
   2624  1.1  skrll 
   2625  1.1  skrll 		    case RSS_GP:
   2626  1.1  skrll 		    case RSS_GP0:
   2627  1.1  skrll 		    case RSS_LOC:
   2628  1.1  skrll 		      /* FIXME: I think these need to be handled using
   2629  1.1  skrll 			 special howto structures.  */
   2630  1.1  skrll 		      BFD_ASSERT (0);
   2631  1.1  skrll 		      break;
   2632  1.1  skrll 
   2633  1.1  skrll 		    default:
   2634  1.1  skrll 		      BFD_ASSERT (0);
   2635  1.1  skrll 		      break;
   2636  1.1  skrll 		    }
   2637  1.1  skrll 
   2638  1.1  skrll 		  used_ssym = TRUE;
   2639  1.1  skrll 		}
   2640  1.1  skrll 	      else
   2641  1.1  skrll 		relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
   2642  1.1  skrll 
   2643  1.1  skrll 	      break;
   2644  1.1  skrll 	    }
   2645  1.1  skrll 
   2646  1.1  skrll 	  /* The address of an ELF reloc is section relative for an
   2647  1.1  skrll 	     object file, and absolute for an executable file or
   2648  1.1  skrll 	     shared library.  The address of a BFD reloc is always
   2649  1.1  skrll 	     section relative.  */
   2650  1.1  skrll 	  if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
   2651  1.1  skrll 	    relent->address = rela.r_offset;
   2652  1.1  skrll 	  else
   2653  1.1  skrll 	    relent->address = rela.r_offset - asect->vma;
   2654  1.1  skrll 
   2655  1.1  skrll 	  relent->addend = rela.r_addend;
   2656  1.1  skrll 
   2657  1.1  skrll 	  relent->howto = mips_elf64_rtype_to_howto (type, rela_p);
   2658  1.1  skrll 
   2659  1.1  skrll 	  ++relent;
   2660  1.1  skrll 	}
   2661  1.1  skrll     }
   2662  1.1  skrll 
   2663  1.1  skrll   asect->reloc_count += (relent - relents) / 3;
   2664  1.1  skrll 
   2665  1.1  skrll   if (allocated != NULL)
   2666  1.1  skrll     free (allocated);
   2667  1.1  skrll 
   2668  1.1  skrll   return TRUE;
   2669  1.1  skrll 
   2670  1.1  skrll  error_return:
   2671  1.1  skrll   if (allocated != NULL)
   2672  1.1  skrll     free (allocated);
   2673  1.1  skrll   return FALSE;
   2674  1.1  skrll }
   2675  1.1  skrll 
   2676  1.1  skrll /* Read the relocations.  On Irix 6, there can be two reloc sections
   2677  1.1  skrll    associated with a single data section.  This is copied from
   2678  1.1  skrll    elfcode.h as well, with changes as small as accounting for 3
   2679  1.1  skrll    internal relocs per external reloc and resetting reloc_count to
   2680  1.1  skrll    zero before processing the relocs of a section.  */
   2681  1.1  skrll 
   2682  1.1  skrll static bfd_boolean
   2683  1.1  skrll mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect,
   2684  1.1  skrll 			      asymbol **symbols, bfd_boolean dynamic)
   2685  1.1  skrll {
   2686  1.1  skrll   struct bfd_elf_section_data * const d = elf_section_data (asect);
   2687  1.1  skrll   Elf_Internal_Shdr *rel_hdr;
   2688  1.1  skrll   Elf_Internal_Shdr *rel_hdr2;
   2689  1.1  skrll   bfd_size_type reloc_count;
   2690  1.1  skrll   bfd_size_type reloc_count2;
   2691  1.1  skrll   arelent *relents;
   2692  1.1  skrll   bfd_size_type amt;
   2693  1.1  skrll 
   2694  1.1  skrll   if (asect->relocation != NULL)
   2695  1.1  skrll     return TRUE;
   2696  1.1  skrll 
   2697  1.1  skrll   if (! dynamic)
   2698  1.1  skrll     {
   2699  1.1  skrll       if ((asect->flags & SEC_RELOC) == 0
   2700  1.1  skrll 	  || asect->reloc_count == 0)
   2701  1.1  skrll 	return TRUE;
   2702  1.1  skrll 
   2703  1.1  skrll       rel_hdr = &d->rel_hdr;
   2704  1.1  skrll       reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
   2705  1.1  skrll       rel_hdr2 = d->rel_hdr2;
   2706  1.1  skrll       reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
   2707  1.1  skrll 
   2708  1.1  skrll       BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
   2709  1.1  skrll       BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
   2710  1.1  skrll 		  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
   2711  1.1  skrll 
   2712  1.1  skrll     }
   2713  1.1  skrll   else
   2714  1.1  skrll     {
   2715  1.1  skrll       /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
   2716  1.1  skrll 	 case because relocations against this section may use the
   2717  1.1  skrll 	 dynamic symbol table, and in that case bfd_section_from_shdr
   2718  1.1  skrll 	 in elf.c does not update the RELOC_COUNT.  */
   2719  1.1  skrll       if (asect->size == 0)
   2720  1.1  skrll 	return TRUE;
   2721  1.1  skrll 
   2722  1.1  skrll       rel_hdr = &d->this_hdr;
   2723  1.1  skrll       reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
   2724  1.1  skrll       rel_hdr2 = NULL;
   2725  1.1  skrll       reloc_count2 = 0;
   2726  1.1  skrll     }
   2727  1.1  skrll 
   2728  1.1  skrll   /* Allocate space for 3 arelent structures for each Rel structure.  */
   2729  1.1  skrll   amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent);
   2730  1.1  skrll   relents = bfd_alloc (abfd, amt);
   2731  1.1  skrll   if (relents == NULL)
   2732  1.1  skrll     return FALSE;
   2733  1.1  skrll 
   2734  1.1  skrll   /* The slurp_one_reloc_table routine increments reloc_count.  */
   2735  1.1  skrll   asect->reloc_count = 0;
   2736  1.1  skrll 
   2737  1.1  skrll   if (! mips_elf64_slurp_one_reloc_table (abfd, asect,
   2738  1.1  skrll 					  rel_hdr, reloc_count,
   2739  1.1  skrll 					  relents,
   2740  1.1  skrll 					  symbols, dynamic))
   2741  1.1  skrll     return FALSE;
   2742  1.1  skrll   if (d->rel_hdr2 != NULL)
   2743  1.1  skrll     {
   2744  1.1  skrll       if (! mips_elf64_slurp_one_reloc_table (abfd, asect,
   2745  1.1  skrll 					      rel_hdr2, reloc_count2,
   2746  1.1  skrll 					      relents + reloc_count * 3,
   2747  1.1  skrll 					      symbols, dynamic))
   2748  1.1  skrll 	return FALSE;
   2749  1.1  skrll     }
   2750  1.1  skrll 
   2751  1.1  skrll   asect->relocation = relents;
   2752  1.1  skrll   return TRUE;
   2753  1.1  skrll }
   2754  1.1  skrll 
   2755  1.1  skrll /* Write out the relocations.  */
   2756  1.1  skrll 
   2757  1.1  skrll static void
   2758  1.1  skrll mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
   2759  1.1  skrll {
   2760  1.1  skrll   bfd_boolean *failedp = data;
   2761  1.1  skrll   int count;
   2762  1.1  skrll   Elf_Internal_Shdr *rel_hdr;
   2763  1.1  skrll   unsigned int idx;
   2764  1.1  skrll 
   2765  1.1  skrll   /* If we have already failed, don't do anything.  */
   2766  1.1  skrll   if (*failedp)
   2767  1.1  skrll     return;
   2768  1.1  skrll 
   2769  1.1  skrll   if ((sec->flags & SEC_RELOC) == 0)
   2770  1.1  skrll     return;
   2771  1.1  skrll 
   2772  1.1  skrll   /* The linker backend writes the relocs out itself, and sets the
   2773  1.1  skrll      reloc_count field to zero to inhibit writing them here.  Also,
   2774  1.1  skrll      sometimes the SEC_RELOC flag gets set even when there aren't any
   2775  1.1  skrll      relocs.  */
   2776  1.1  skrll   if (sec->reloc_count == 0)
   2777  1.1  skrll     return;
   2778  1.1  skrll 
   2779  1.1  skrll   /* We can combine up to three relocs that refer to the same address
   2780  1.1  skrll      if the latter relocs have no associated symbol.  */
   2781  1.1  skrll   count = 0;
   2782  1.1  skrll   for (idx = 0; idx < sec->reloc_count; idx++)
   2783  1.1  skrll     {
   2784  1.1  skrll       bfd_vma addr;
   2785  1.1  skrll       unsigned int i;
   2786  1.1  skrll 
   2787  1.1  skrll       ++count;
   2788  1.1  skrll 
   2789  1.1  skrll       addr = sec->orelocation[idx]->address;
   2790  1.1  skrll       for (i = 0; i < 2; i++)
   2791  1.1  skrll 	{
   2792  1.1  skrll 	  arelent *r;
   2793  1.1  skrll 
   2794  1.1  skrll 	  if (idx + 1 >= sec->reloc_count)
   2795  1.1  skrll 	    break;
   2796  1.1  skrll 	  r = sec->orelocation[idx + 1];
   2797  1.1  skrll 	  if (r->address != addr
   2798  1.1  skrll 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
   2799  1.1  skrll 	      || (*r->sym_ptr_ptr)->value != 0)
   2800  1.1  skrll 	    break;
   2801  1.1  skrll 
   2802  1.1  skrll 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
   2803  1.1  skrll 
   2804  1.1  skrll 	  ++idx;
   2805  1.1  skrll 	}
   2806  1.1  skrll     }
   2807  1.1  skrll 
   2808  1.1  skrll   rel_hdr = &elf_section_data (sec)->rel_hdr;
   2809  1.1  skrll 
   2810  1.1  skrll   /* Do the actual relocation.  */
   2811  1.1  skrll 
   2812  1.1  skrll   if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
   2813  1.1  skrll     mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
   2814  1.1  skrll   else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
   2815  1.1  skrll     mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
   2816  1.1  skrll   else
   2817  1.1  skrll     BFD_ASSERT (0);
   2818  1.1  skrll }
   2819  1.1  skrll 
   2820  1.1  skrll static void
   2821  1.1  skrll mips_elf64_write_rel (bfd *abfd, asection *sec,
   2822  1.1  skrll 		      Elf_Internal_Shdr *rel_hdr,
   2823  1.1  skrll 		      int *count, void *data)
   2824  1.1  skrll {
   2825  1.1  skrll   bfd_boolean *failedp = data;
   2826  1.1  skrll   Elf64_Mips_External_Rel *ext_rel;
   2827  1.1  skrll   unsigned int idx;
   2828  1.1  skrll   asymbol *last_sym = 0;
   2829  1.1  skrll   int last_sym_idx = 0;
   2830  1.1  skrll 
   2831  1.1  skrll   rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
   2832  1.1  skrll   rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
   2833  1.1  skrll   if (rel_hdr->contents == NULL)
   2834  1.1  skrll     {
   2835  1.1  skrll       *failedp = TRUE;
   2836  1.1  skrll       return;
   2837  1.1  skrll     }
   2838  1.1  skrll 
   2839  1.1  skrll   ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
   2840  1.1  skrll   for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
   2841  1.1  skrll     {
   2842  1.1  skrll       arelent *ptr;
   2843  1.1  skrll       Elf64_Mips_Internal_Rela int_rel;
   2844  1.1  skrll       asymbol *sym;
   2845  1.1  skrll       int n;
   2846  1.1  skrll       unsigned int i;
   2847  1.1  skrll 
   2848  1.1  skrll       ptr = sec->orelocation[idx];
   2849  1.1  skrll 
   2850  1.1  skrll       /* The address of an ELF reloc is section relative for an object
   2851  1.1  skrll 	 file, and absolute for an executable file or shared library.
   2852  1.1  skrll 	 The address of a BFD reloc is always section relative.  */
   2853  1.1  skrll       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
   2854  1.1  skrll 	int_rel.r_offset = ptr->address;
   2855  1.1  skrll       else
   2856  1.1  skrll 	int_rel.r_offset = ptr->address + sec->vma;
   2857  1.1  skrll 
   2858  1.1  skrll       sym = *ptr->sym_ptr_ptr;
   2859  1.1  skrll       if (sym == last_sym)
   2860  1.1  skrll 	n = last_sym_idx;
   2861  1.1  skrll       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
   2862  1.1  skrll 	n = STN_UNDEF;
   2863  1.1  skrll       else
   2864  1.1  skrll 	{
   2865  1.1  skrll 	  last_sym = sym;
   2866  1.1  skrll 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
   2867  1.1  skrll 	  if (n < 0)
   2868  1.1  skrll 	    {
   2869  1.1  skrll 	      *failedp = TRUE;
   2870  1.1  skrll 	      return;
   2871  1.1  skrll 	    }
   2872  1.1  skrll 	  last_sym_idx = n;
   2873  1.1  skrll 	}
   2874  1.1  skrll 
   2875  1.1  skrll       int_rel.r_sym = n;
   2876  1.1  skrll       int_rel.r_ssym = RSS_UNDEF;
   2877  1.1  skrll 
   2878  1.1  skrll       if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
   2879  1.1  skrll 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
   2880  1.1  skrll 	{
   2881  1.1  skrll 	  *failedp = TRUE;
   2882  1.1  skrll 	  return;
   2883  1.1  skrll 	}
   2884  1.1  skrll 
   2885  1.1  skrll       int_rel.r_type = ptr->howto->type;
   2886  1.1  skrll       int_rel.r_type2 = (int) R_MIPS_NONE;
   2887  1.1  skrll       int_rel.r_type3 = (int) R_MIPS_NONE;
   2888  1.1  skrll 
   2889  1.1  skrll       for (i = 0; i < 2; i++)
   2890  1.1  skrll 	{
   2891  1.1  skrll 	  arelent *r;
   2892  1.1  skrll 
   2893  1.1  skrll 	  if (idx + 1 >= sec->reloc_count)
   2894  1.1  skrll 	    break;
   2895  1.1  skrll 	  r = sec->orelocation[idx + 1];
   2896  1.1  skrll 	  if (r->address != ptr->address
   2897  1.1  skrll 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
   2898  1.1  skrll 	      || (*r->sym_ptr_ptr)->value != 0)
   2899  1.1  skrll 	    break;
   2900  1.1  skrll 
   2901  1.1  skrll 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
   2902  1.1  skrll 
   2903  1.1  skrll 	  if (i == 0)
   2904  1.1  skrll 	    int_rel.r_type2 = r->howto->type;
   2905  1.1  skrll 	  else
   2906  1.1  skrll 	    int_rel.r_type3 = r->howto->type;
   2907  1.1  skrll 
   2908  1.1  skrll 	  ++idx;
   2909  1.1  skrll 	}
   2910  1.1  skrll 
   2911  1.1  skrll       mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
   2912  1.1  skrll     }
   2913  1.1  skrll 
   2914  1.1  skrll   BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
   2915  1.1  skrll 	      == *count);
   2916  1.1  skrll }
   2917  1.1  skrll 
   2918  1.1  skrll static void
   2919  1.1  skrll mips_elf64_write_rela (bfd *abfd, asection *sec,
   2920  1.1  skrll 		       Elf_Internal_Shdr *rela_hdr,
   2921  1.1  skrll 		       int *count, void *data)
   2922  1.1  skrll {
   2923  1.1  skrll   bfd_boolean *failedp = data;
   2924  1.1  skrll   Elf64_Mips_External_Rela *ext_rela;
   2925  1.1  skrll   unsigned int idx;
   2926  1.1  skrll   asymbol *last_sym = 0;
   2927  1.1  skrll   int last_sym_idx = 0;
   2928  1.1  skrll 
   2929  1.1  skrll   rela_hdr->sh_size = rela_hdr->sh_entsize * *count;
   2930  1.1  skrll   rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
   2931  1.1  skrll   if (rela_hdr->contents == NULL)
   2932  1.1  skrll     {
   2933  1.1  skrll       *failedp = TRUE;
   2934  1.1  skrll       return;
   2935  1.1  skrll     }
   2936  1.1  skrll 
   2937  1.1  skrll   ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
   2938  1.1  skrll   for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
   2939  1.1  skrll     {
   2940  1.1  skrll       arelent *ptr;
   2941  1.1  skrll       Elf64_Mips_Internal_Rela int_rela;
   2942  1.1  skrll       asymbol *sym;
   2943  1.1  skrll       int n;
   2944  1.1  skrll       unsigned int i;
   2945  1.1  skrll 
   2946  1.1  skrll       ptr = sec->orelocation[idx];
   2947  1.1  skrll 
   2948  1.1  skrll       /* The address of an ELF reloc is section relative for an object
   2949  1.1  skrll 	 file, and absolute for an executable file or shared library.
   2950  1.1  skrll 	 The address of a BFD reloc is always section relative.  */
   2951  1.1  skrll       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
   2952  1.1  skrll 	int_rela.r_offset = ptr->address;
   2953  1.1  skrll       else
   2954  1.1  skrll 	int_rela.r_offset = ptr->address + sec->vma;
   2955  1.1  skrll 
   2956  1.1  skrll       sym = *ptr->sym_ptr_ptr;
   2957  1.1  skrll       if (sym == last_sym)
   2958  1.1  skrll 	n = last_sym_idx;
   2959  1.1  skrll       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
   2960  1.1  skrll 	n = STN_UNDEF;
   2961  1.1  skrll       else
   2962  1.1  skrll 	{
   2963  1.1  skrll 	  last_sym = sym;
   2964  1.1  skrll 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
   2965  1.1  skrll 	  if (n < 0)
   2966  1.1  skrll 	    {
   2967  1.1  skrll 	      *failedp = TRUE;
   2968  1.1  skrll 	      return;
   2969  1.1  skrll 	    }
   2970  1.1  skrll 	  last_sym_idx = n;
   2971  1.1  skrll 	}
   2972  1.1  skrll 
   2973  1.1  skrll       int_rela.r_sym = n;
   2974  1.1  skrll       int_rela.r_addend = ptr->addend;
   2975  1.1  skrll       int_rela.r_ssym = RSS_UNDEF;
   2976  1.1  skrll 
   2977  1.1  skrll       if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
   2978  1.1  skrll 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
   2979  1.1  skrll 	{
   2980  1.1  skrll 	  *failedp = TRUE;
   2981  1.1  skrll 	  return;
   2982  1.1  skrll 	}
   2983  1.1  skrll 
   2984  1.1  skrll       int_rela.r_type = ptr->howto->type;
   2985  1.1  skrll       int_rela.r_type2 = (int) R_MIPS_NONE;
   2986  1.1  skrll       int_rela.r_type3 = (int) R_MIPS_NONE;
   2987  1.1  skrll 
   2988  1.1  skrll       for (i = 0; i < 2; i++)
   2989  1.1  skrll 	{
   2990  1.1  skrll 	  arelent *r;
   2991  1.1  skrll 
   2992  1.1  skrll 	  if (idx + 1 >= sec->reloc_count)
   2993  1.1  skrll 	    break;
   2994  1.1  skrll 	  r = sec->orelocation[idx + 1];
   2995  1.1  skrll 	  if (r->address != ptr->address
   2996  1.1  skrll 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
   2997  1.1  skrll 	      || (*r->sym_ptr_ptr)->value != 0)
   2998  1.1  skrll 	    break;
   2999  1.1  skrll 
   3000  1.1  skrll 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
   3001  1.1  skrll 
   3002  1.1  skrll 	  if (i == 0)
   3003  1.1  skrll 	    int_rela.r_type2 = r->howto->type;
   3004  1.1  skrll 	  else
   3005  1.1  skrll 	    int_rela.r_type3 = r->howto->type;
   3006  1.1  skrll 
   3007  1.1  skrll 	  ++idx;
   3008  1.1  skrll 	}
   3009  1.1  skrll 
   3010  1.1  skrll       mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
   3011  1.1  skrll     }
   3012  1.1  skrll 
   3013  1.1  skrll   BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
   3014  1.1  skrll 	      == *count);
   3015  1.1  skrll }
   3016  1.1  skrll 
   3017  1.1  skrll /* Set the right machine number for a MIPS ELF file.  */
   3019  1.1  skrll 
   3020  1.1  skrll static bfd_boolean
   3021  1.1  skrll mips_elf64_object_p (bfd *abfd)
   3022  1.1  skrll {
   3023  1.1  skrll   unsigned long mach;
   3024  1.1  skrll 
   3025  1.1  skrll   /* Irix 6 is broken.  Object file symbol tables are not always
   3026  1.1  skrll      sorted correctly such that local symbols precede global symbols,
   3027  1.1  skrll      and the sh_info field in the symbol table is not always right.  */
   3028  1.1  skrll   if (elf64_mips_irix_compat (abfd) != ict_none)
   3029  1.1  skrll     elf_bad_symtab (abfd) = TRUE;
   3030  1.1  skrll 
   3031  1.1  skrll   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
   3032  1.1  skrll   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
   3033  1.1  skrll   return TRUE;
   3034  1.1  skrll }
   3035  1.1  skrll 
   3036  1.1  skrll /* Depending on the target vector we generate some version of Irix
   3037  1.1  skrll    executables or "normal" MIPS ELF ABI executables.  */
   3038  1.1  skrll static irix_compat_t
   3039  1.1  skrll elf64_mips_irix_compat (bfd *abfd)
   3040  1.1  skrll {
   3041  1.1  skrll   if ((abfd->xvec == &bfd_elf64_bigmips_vec)
   3042  1.1  skrll       || (abfd->xvec == &bfd_elf64_littlemips_vec))
   3043  1.1  skrll     return ict_irix6;
   3044  1.1  skrll   else
   3045  1.1  skrll     return ict_none;
   3046  1.1  skrll }
   3047  1.1  skrll 
   3048  1.1  skrll /* Support for core dump NOTE sections.  */
   3050  1.1  skrll static bfd_boolean
   3051  1.1  skrll elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   3052  1.1  skrll {
   3053  1.1  skrll   int offset;
   3054  1.1  skrll   unsigned int size;
   3055  1.1  skrll 
   3056  1.1  skrll   switch (note->descsz)
   3057  1.1  skrll     {
   3058  1.1  skrll       default:
   3059  1.1  skrll 	return FALSE;
   3060  1.1  skrll 
   3061  1.1  skrll       case 480:		/* Linux/MIPS - N64 kernel */
   3062  1.1  skrll 	/* pr_cursig */
   3063  1.1  skrll 	elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
   3064  1.1  skrll 
   3065  1.1  skrll 	/* pr_pid */
   3066  1.1  skrll 	elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32);
   3067  1.1  skrll 
   3068  1.1  skrll 	/* pr_reg */
   3069  1.1  skrll 	offset = 112;
   3070  1.1  skrll 	size = 360;
   3071  1.1  skrll 
   3072  1.1  skrll 	break;
   3073  1.1  skrll     }
   3074  1.1  skrll 
   3075  1.1  skrll   /* Make a ".reg/999" section.  */
   3076  1.1  skrll   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
   3077  1.1  skrll 					  size, note->descpos + offset);
   3078  1.1  skrll }
   3079  1.1  skrll 
   3080  1.1  skrll static bfd_boolean
   3081  1.1  skrll elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   3082  1.1  skrll {
   3083  1.1  skrll   switch (note->descsz)
   3084  1.1  skrll     {
   3085  1.1  skrll       default:
   3086  1.1  skrll 	return FALSE;
   3087  1.1  skrll 
   3088  1.1  skrll       case 136:		/* Linux/MIPS - N64 kernel elf_prpsinfo */
   3089  1.1  skrll 	elf_tdata (abfd)->core_program
   3090  1.1  skrll 	 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
   3091  1.1  skrll 	elf_tdata (abfd)->core_command
   3092  1.1  skrll 	 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
   3093  1.1  skrll     }
   3094  1.1  skrll 
   3095  1.1  skrll   /* Note that for some reason, a spurious space is tacked
   3096  1.1  skrll      onto the end of the args in some (at least one anyway)
   3097  1.1  skrll      implementations, so strip it off if it exists.  */
   3098  1.1  skrll 
   3099  1.1  skrll   {
   3100  1.1  skrll     char *command = elf_tdata (abfd)->core_command;
   3101  1.1  skrll     int n = strlen (command);
   3102  1.1  skrll 
   3103  1.1  skrll     if (0 < n && command[n - 1] == ' ')
   3104  1.1  skrll       command[n - 1] = '\0';
   3105  1.1  skrll   }
   3106  1.1  skrll 
   3107  1.1  skrll   return TRUE;
   3108  1.1  skrll }
   3109  1.1  skrll 
   3110  1.1  skrll /* ECOFF swapping routines.  These are used when dealing with the
   3112  1.1  skrll    .mdebug section, which is in the ECOFF debugging format.  */
   3113  1.1  skrll static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
   3114  1.1  skrll {
   3115  1.1  skrll   /* Symbol table magic number.  */
   3116  1.1  skrll   magicSym2,
   3117  1.1  skrll   /* Alignment of debugging information.  E.g., 4.  */
   3118  1.1  skrll   8,
   3119  1.1  skrll   /* Sizes of external symbolic information.  */
   3120  1.1  skrll   sizeof (struct hdr_ext),
   3121  1.1  skrll   sizeof (struct dnr_ext),
   3122  1.1  skrll   sizeof (struct pdr_ext),
   3123  1.1  skrll   sizeof (struct sym_ext),
   3124  1.1  skrll   sizeof (struct opt_ext),
   3125  1.1  skrll   sizeof (struct fdr_ext),
   3126  1.1  skrll   sizeof (struct rfd_ext),
   3127  1.1  skrll   sizeof (struct ext_ext),
   3128  1.1  skrll   /* Functions to swap in external symbolic data.  */
   3129  1.1  skrll   ecoff_swap_hdr_in,
   3130  1.1  skrll   ecoff_swap_dnr_in,
   3131  1.1  skrll   ecoff_swap_pdr_in,
   3132  1.1  skrll   ecoff_swap_sym_in,
   3133  1.1  skrll   ecoff_swap_opt_in,
   3134  1.1  skrll   ecoff_swap_fdr_in,
   3135  1.1  skrll   ecoff_swap_rfd_in,
   3136  1.1  skrll   ecoff_swap_ext_in,
   3137  1.1  skrll   _bfd_ecoff_swap_tir_in,
   3138  1.1  skrll   _bfd_ecoff_swap_rndx_in,
   3139  1.1  skrll   /* Functions to swap out external symbolic data.  */
   3140  1.1  skrll   ecoff_swap_hdr_out,
   3141  1.1  skrll   ecoff_swap_dnr_out,
   3142  1.1  skrll   ecoff_swap_pdr_out,
   3143  1.1  skrll   ecoff_swap_sym_out,
   3144  1.1  skrll   ecoff_swap_opt_out,
   3145  1.1  skrll   ecoff_swap_fdr_out,
   3146  1.1  skrll   ecoff_swap_rfd_out,
   3147  1.1  skrll   ecoff_swap_ext_out,
   3148  1.1  skrll   _bfd_ecoff_swap_tir_out,
   3149  1.1  skrll   _bfd_ecoff_swap_rndx_out,
   3150  1.1  skrll   /* Function to read in symbolic data.  */
   3151  1.1  skrll   _bfd_mips_elf_read_ecoff_info
   3152  1.1  skrll };
   3153  1.1  skrll 
   3154  1.1  skrll /* Relocations in the 64 bit MIPS ELF ABI are more complex than in
   3156  1.1  skrll    standard ELF.  This structure is used to redirect the relocation
   3157  1.1  skrll    handling routines.  */
   3158  1.1  skrll 
   3159  1.1  skrll const struct elf_size_info mips_elf64_size_info =
   3160  1.1  skrll {
   3161  1.1  skrll   sizeof (Elf64_External_Ehdr),
   3162  1.1  skrll   sizeof (Elf64_External_Phdr),
   3163  1.1  skrll   sizeof (Elf64_External_Shdr),
   3164  1.1  skrll   sizeof (Elf64_Mips_External_Rel),
   3165  1.1  skrll   sizeof (Elf64_Mips_External_Rela),
   3166  1.1  skrll   sizeof (Elf64_External_Sym),
   3167  1.1  skrll   sizeof (Elf64_External_Dyn),
   3168  1.1  skrll   sizeof (Elf_External_Note),
   3169  1.1  skrll   4,		/* hash-table entry size */
   3170  1.1  skrll   3,		/* internal relocations per external relocations */
   3171  1.1  skrll   64,		/* arch_size */
   3172  1.1  skrll   3,		/* log_file_align */
   3173  1.1  skrll   ELFCLASS64,
   3174  1.1  skrll   EV_CURRENT,
   3175  1.1  skrll   bfd_elf64_write_out_phdrs,
   3176  1.1  skrll   bfd_elf64_write_shdrs_and_ehdr,
   3177  1.1  skrll   bfd_elf64_checksum_contents,
   3178  1.1  skrll   mips_elf64_write_relocs,
   3179  1.1  skrll   bfd_elf64_swap_symbol_in,
   3180  1.1  skrll   bfd_elf64_swap_symbol_out,
   3181  1.1  skrll   mips_elf64_slurp_reloc_table,
   3182  1.1  skrll   bfd_elf64_slurp_symbol_table,
   3183  1.1  skrll   bfd_elf64_swap_dyn_in,
   3184  1.1  skrll   bfd_elf64_swap_dyn_out,
   3185  1.1  skrll   mips_elf64_be_swap_reloc_in,
   3186  1.1  skrll   mips_elf64_be_swap_reloc_out,
   3187  1.1  skrll   mips_elf64_be_swap_reloca_in,
   3188  1.1  skrll   mips_elf64_be_swap_reloca_out
   3189  1.1  skrll };
   3190  1.1  skrll 
   3191  1.1  skrll #define ELF_ARCH			bfd_arch_mips
   3192  1.1  skrll #define ELF_MACHINE_CODE		EM_MIPS
   3193  1.1  skrll 
   3194  1.1  skrll #define elf_backend_collect		TRUE
   3195  1.1  skrll #define elf_backend_type_change_ok	TRUE
   3196  1.1  skrll #define elf_backend_can_gc_sections	TRUE
   3197  1.1  skrll #define elf_info_to_howto		mips_elf64_info_to_howto_rela
   3198  1.1  skrll #define elf_info_to_howto_rel		mips_elf64_info_to_howto_rel
   3199  1.1  skrll #define elf_backend_object_p		mips_elf64_object_p
   3200  1.1  skrll #define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing
   3201  1.1  skrll #define elf_backend_section_processing	_bfd_mips_elf_section_processing
   3202  1.1  skrll #define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr
   3203  1.1  skrll #define elf_backend_fake_sections	_bfd_mips_elf_fake_sections
   3204  1.1  skrll #define elf_backend_section_from_bfd_section \
   3205  1.1  skrll 				_bfd_mips_elf_section_from_bfd_section
   3206  1.1  skrll #define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook
   3207  1.1  skrll #define elf_backend_link_output_symbol_hook \
   3208  1.1  skrll 				_bfd_mips_elf_link_output_symbol_hook
   3209  1.1  skrll #define elf_backend_create_dynamic_sections \
   3210  1.1  skrll 				_bfd_mips_elf_create_dynamic_sections
   3211  1.1  skrll #define elf_backend_check_relocs	_bfd_mips_elf_check_relocs
   3212  1.1  skrll #define elf_backend_merge_symbol_attribute \
   3213  1.1  skrll 				_bfd_mips_elf_merge_symbol_attribute
   3214  1.1  skrll #define elf_backend_get_target_dtag	_bfd_mips_elf_get_target_dtag
   3215  1.1  skrll #define elf_backend_adjust_dynamic_symbol \
   3216  1.1  skrll 				_bfd_mips_elf_adjust_dynamic_symbol
   3217  1.1  skrll #define elf_backend_always_size_sections \
   3218  1.1  skrll 				_bfd_mips_elf_always_size_sections
   3219  1.1  skrll #define elf_backend_size_dynamic_sections \
   3220  1.1  skrll 				_bfd_mips_elf_size_dynamic_sections
   3221  1.1  skrll #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
   3222  1.1  skrll #define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
   3223  1.1  skrll #define elf_backend_finish_dynamic_symbol \
   3224  1.1  skrll 				_bfd_mips_elf_finish_dynamic_symbol
   3225  1.1  skrll #define elf_backend_finish_dynamic_sections \
   3226  1.1  skrll 				_bfd_mips_elf_finish_dynamic_sections
   3227  1.1  skrll #define elf_backend_final_write_processing \
   3228  1.1  skrll 				_bfd_mips_elf_final_write_processing
   3229  1.1  skrll #define elf_backend_additional_program_headers \
   3230  1.1  skrll 				_bfd_mips_elf_additional_program_headers
   3231  1.1  skrll #define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map
   3232  1.1  skrll #define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook
   3233  1.1  skrll #define elf_backend_gc_sweep_hook	_bfd_mips_elf_gc_sweep_hook
   3234  1.1  skrll #define elf_backend_copy_indirect_symbol \
   3235  1.1  skrll 					_bfd_mips_elf_copy_indirect_symbol
   3236  1.1  skrll #define elf_backend_ignore_discarded_relocs \
   3237  1.1  skrll 					_bfd_mips_elf_ignore_discarded_relocs
   3238  1.1  skrll #define elf_backend_mips_irix_compat	elf64_mips_irix_compat
   3239  1.1  skrll #define elf_backend_mips_rtype_to_howto	mips_elf64_rtype_to_howto
   3240  1.1  skrll #define elf_backend_ecoff_debug_swap	&mips_elf64_ecoff_debug_swap
   3241  1.1  skrll #define elf_backend_size_info		mips_elf64_size_info
   3242  1.1  skrll 
   3243  1.1  skrll #define elf_backend_grok_prstatus	elf64_mips_grok_prstatus
   3244  1.1  skrll #define elf_backend_grok_psinfo		elf64_mips_grok_psinfo
   3245  1.1  skrll 
   3246  1.1  skrll #define elf_backend_got_header_size	(4 * MIPS_RESERVED_GOTNO)
   3247  1.1  skrll 
   3248  1.1  skrll /* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
   3249  1.1  skrll    work better/work only in RELA, so we default to this.  */
   3250  1.1  skrll #define elf_backend_may_use_rel_p	1
   3251  1.1  skrll #define elf_backend_may_use_rela_p	1
   3252  1.1  skrll #define elf_backend_default_use_rela_p	1
   3253  1.1  skrll #define elf_backend_rela_plts_and_copies_p 0
   3254  1.1  skrll #define elf_backend_plt_readonly	1
   3255  1.1  skrll #define elf_backend_plt_sym_val		_bfd_mips_elf_plt_sym_val
   3256  1.1  skrll 
   3257  1.1  skrll #define elf_backend_sign_extend_vma	TRUE
   3258  1.1  skrll 
   3259  1.1  skrll #define elf_backend_write_section	_bfd_mips_elf_write_section
   3260  1.1  skrll 
   3261  1.1  skrll /* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit
   3262  1.1  skrll    MIPS-specific function only applies to IRIX5, which had no 64-bit
   3263  1.1  skrll    ABI.  */
   3264  1.1  skrll #define bfd_elf64_find_nearest_line	_bfd_mips_elf_find_nearest_line
   3265  1.1  skrll #define bfd_elf64_find_inliner_info	_bfd_mips_elf_find_inliner_info
   3266  1.1  skrll #define bfd_elf64_new_section_hook	_bfd_mips_elf_new_section_hook
   3267  1.1  skrll #define bfd_elf64_set_section_contents	_bfd_mips_elf_set_section_contents
   3268  1.1  skrll #define bfd_elf64_bfd_get_relocated_section_contents \
   3269  1.1  skrll 				_bfd_elf_mips_get_relocated_section_contents
   3270  1.1  skrll #define bfd_elf64_mkobject		_bfd_mips_elf_mkobject
   3271  1.1  skrll #define bfd_elf64_bfd_link_hash_table_create \
   3272  1.1  skrll 				_bfd_mips_elf_link_hash_table_create
   3273  1.1  skrll #define bfd_elf64_bfd_final_link	_bfd_mips_elf_final_link
   3274  1.1  skrll #define bfd_elf64_bfd_merge_private_bfd_data \
   3275  1.1  skrll 				_bfd_mips_elf_merge_private_bfd_data
   3276  1.1  skrll #define bfd_elf64_bfd_set_private_flags	_bfd_mips_elf_set_private_flags
   3277  1.1  skrll #define bfd_elf64_bfd_print_private_bfd_data \
   3278  1.1  skrll 				_bfd_mips_elf_print_private_bfd_data
   3279  1.1  skrll 
   3280  1.1  skrll #define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound
   3281  1.1  skrll #define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc
   3282  1.1  skrll #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
   3283  1.1  skrll #define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc
   3284  1.1  skrll #define bfd_elf64_bfd_relax_section     _bfd_mips_relax_section
   3285  1.1  skrll 
   3286  1.1  skrll /* MIPS ELF64 archive functions.  */
   3287  1.1  skrll #define bfd_elf64_archive_functions
   3288  1.1  skrll extern bfd_boolean bfd_elf64_archive_slurp_armap
   3289  1.1  skrll   (bfd *);
   3290  1.1  skrll extern bfd_boolean bfd_elf64_archive_write_armap
   3291  1.1  skrll   (bfd *, unsigned int, struct orl *, unsigned int, int);
   3292  1.1  skrll #define bfd_elf64_archive_slurp_extended_name_table \
   3293  1.1  skrll 			_bfd_archive_coff_slurp_extended_name_table
   3294  1.1  skrll #define bfd_elf64_archive_construct_extended_name_table \
   3295  1.1  skrll 			_bfd_archive_coff_construct_extended_name_table
   3296  1.1  skrll #define bfd_elf64_archive_truncate_arname \
   3297  1.1  skrll 			_bfd_archive_coff_truncate_arname
   3298  1.1  skrll #define bfd_elf64_archive_read_ar_hdr	_bfd_archive_coff_read_ar_hdr
   3299  1.1  skrll #define bfd_elf64_archive_openr_next_archived_file \
   3300  1.1  skrll 			_bfd_archive_coff_openr_next_archived_file
   3301  1.1  skrll #define bfd_elf64_archive_get_elt_at_index \
   3302  1.1  skrll 			_bfd_archive_coff_get_elt_at_index
   3303  1.1  skrll #define bfd_elf64_archive_generic_stat_arch_elt \
   3304  1.1  skrll 			_bfd_archive_coff_generic_stat_arch_elt
   3305  1.1  skrll #define bfd_elf64_archive_update_armap_timestamp \
   3306  1.1  skrll 			_bfd_archive_coff_update_armap_timestamp
   3307  1.1  skrll 
   3308  1.1  skrll /* The SGI style (n)64 NewABI.  */
   3309  1.1  skrll #define TARGET_LITTLE_SYM		bfd_elf64_littlemips_vec
   3310  1.1  skrll #define TARGET_LITTLE_NAME		"elf64-littlemips"
   3311  1.1  skrll #define TARGET_BIG_SYM			bfd_elf64_bigmips_vec
   3312  1.1  skrll #define TARGET_BIG_NAME			"elf64-bigmips"
   3313  1.1  skrll 
   3314  1.1  skrll #define ELF_MAXPAGESIZE			0x10000
   3315  1.1  skrll #define ELF_COMMONPAGESIZE		0x1000
   3316  1.1  skrll 
   3317  1.1  skrll #include "elf64-target.h"
   3318  1.1  skrll 
   3319  1.1  skrll /* The SYSV-style 'traditional' (n)64 NewABI.  */
   3320  1.1  skrll #undef TARGET_LITTLE_SYM
   3321  1.1  skrll #undef TARGET_LITTLE_NAME
   3322  1.1  skrll #undef TARGET_BIG_SYM
   3323  1.1  skrll #undef TARGET_BIG_NAME
   3324  1.1  skrll 
   3325  1.1  skrll #undef ELF_MAXPAGESIZE
   3326  1.1  skrll #undef ELF_COMMONPAGESIZE
   3327  1.1  skrll 
   3328  1.1  skrll #define TARGET_LITTLE_SYM		bfd_elf64_tradlittlemips_vec
   3329             #define TARGET_LITTLE_NAME		"elf64-tradlittlemips"
   3330             #define TARGET_BIG_SYM			bfd_elf64_tradbigmips_vec
   3331             #define TARGET_BIG_NAME			"elf64-tradbigmips"
   3332             
   3333             #define ELF_MAXPAGESIZE			0x10000
   3334             #define ELF_COMMONPAGESIZE		0x1000
   3335             #define elf64_bed			elf64_tradbed
   3336             
   3337             /* Include the target file again for this target.  */
   3338             #include "elf64-target.h"
   3339