Home | History | Annotate | Line # | Download | only in bfd
elf64-mips.c revision 1.6
      1  1.1     skrll /* MIPS-specific support for 64-bit ELF
      2  1.6  christos    Copyright (C) 1996-2015 Free Software Foundation, Inc.
      3  1.1     skrll    Ian Lance Taylor, Cygnus Support
      4  1.1     skrll    Linker support added by Mark Mitchell, CodeSourcery, LLC.
      5  1.1     skrll    <mark (at) codesourcery.com>
      6  1.1     skrll 
      7  1.1     skrll    This file is part of BFD, the Binary File Descriptor library.
      8  1.1     skrll 
      9  1.1     skrll    This program is free software; you can redistribute it and/or modify
     10  1.1     skrll    it under the terms of the GNU General Public License as published by
     11  1.1     skrll    the Free Software Foundation; either version 3 of the License, or
     12  1.1     skrll    (at your option) any later version.
     13  1.1     skrll 
     14  1.1     skrll    This program is distributed in the hope that it will be useful,
     15  1.1     skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     16  1.1     skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17  1.1     skrll    GNU General Public License for more details.
     18  1.1     skrll 
     19  1.1     skrll    You should have received a copy of the GNU General Public License
     20  1.1     skrll    along with this program; if not, write to the Free Software
     21  1.1     skrll    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     22  1.1     skrll    MA 02110-1301, USA.  */
     23  1.1     skrll 
     24  1.1     skrll 
     25  1.1     skrll /* This file supports the 64-bit MIPS ELF ABI.
     26  1.1     skrll 
     27  1.1     skrll    The MIPS 64-bit ELF ABI uses an unusual reloc format.  This file
     28  1.1     skrll    overrides the usual ELF reloc handling, and handles reading and
     29  1.1     skrll    writing the relocations here.  */
     30  1.1     skrll 
     31  1.1     skrll /* TODO: Many things are unsupported, even if there is some code for it
     32  1.1     skrll  .       (which was mostly stolen from elf32-mips.c and slightly adapted).
     33  1.1     skrll  .
     34  1.1     skrll  .   - Relocation handling for REL relocs is wrong in many cases and
     35  1.1     skrll  .     generally untested.
     36  1.1     skrll  .   - Relocation handling for RELA relocs related to GOT support are
     37  1.1     skrll  .     also likely to be wrong.
     38  1.1     skrll  .   - Support for MIPS16 is untested.
     39  1.1     skrll  .   - Combined relocs with RSS_* entries are unsupported.
     40  1.1     skrll  .   - The whole GOT handling for NewABI is missing, some parts of
     41  1.1     skrll  .     the OldABI version is still lying around and should be removed.
     42  1.1     skrll  */
     43  1.1     skrll 
     44  1.1     skrll #include "sysdep.h"
     45  1.1     skrll #include "bfd.h"
     46  1.1     skrll #include "libbfd.h"
     47  1.1     skrll #include "aout/ar.h"
     48  1.1     skrll #include "bfdlink.h"
     49  1.1     skrll #include "genlink.h"
     50  1.1     skrll #include "elf-bfd.h"
     51  1.1     skrll #include "elfxx-mips.h"
     52  1.1     skrll #include "elf/mips.h"
     53  1.1     skrll 
     54  1.1     skrll /* Get the ECOFF swapping routines.  The 64-bit ABI is not supposed to
     55  1.1     skrll    use ECOFF.  However, we support it anyhow for an easier changeover.  */
     56  1.1     skrll #include "coff/sym.h"
     57  1.1     skrll #include "coff/symconst.h"
     58  1.1     skrll #include "coff/internal.h"
     59  1.1     skrll #include "coff/ecoff.h"
     60  1.1     skrll /* The 64 bit versions of the mdebug data structures are in alpha.h.  */
     61  1.1     skrll #include "coff/alpha.h"
     62  1.1     skrll #define ECOFF_SIGNED_64
     63  1.1     skrll #include "ecoffswap.h"
     64  1.1     skrll 
     65  1.1     skrll static void mips_elf64_swap_reloc_in
     66  1.1     skrll   (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
     67  1.1     skrll static void mips_elf64_swap_reloca_in
     68  1.1     skrll   (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
     69  1.1     skrll static void mips_elf64_swap_reloc_out
     70  1.1     skrll   (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
     71  1.1     skrll static void mips_elf64_swap_reloca_out
     72  1.1     skrll   (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
     73  1.1     skrll static void mips_elf64_be_swap_reloc_in
     74  1.1     skrll   (bfd *, const bfd_byte *, Elf_Internal_Rela *);
     75  1.1     skrll static void mips_elf64_be_swap_reloc_out
     76  1.1     skrll   (bfd *, const Elf_Internal_Rela *, bfd_byte *);
     77  1.1     skrll static void mips_elf64_be_swap_reloca_in
     78  1.1     skrll   (bfd *, const bfd_byte *, Elf_Internal_Rela *);
     79  1.1     skrll static void mips_elf64_be_swap_reloca_out
     80  1.1     skrll   (bfd *, const Elf_Internal_Rela *, bfd_byte *);
     81  1.1     skrll static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
     82  1.1     skrll   (bfd *, bfd_reloc_code_real_type);
     83  1.1     skrll static reloc_howto_type *mips_elf64_rtype_to_howto
     84  1.1     skrll   (unsigned int, bfd_boolean);
     85  1.1     skrll static void mips_elf64_info_to_howto_rel
     86  1.1     skrll   (bfd *, arelent *, Elf_Internal_Rela *);
     87  1.1     skrll static void mips_elf64_info_to_howto_rela
     88  1.1     skrll   (bfd *, arelent *, Elf_Internal_Rela *);
     89  1.1     skrll static long mips_elf64_get_reloc_upper_bound
     90  1.1     skrll   (bfd *, asection *);
     91  1.1     skrll static long mips_elf64_canonicalize_reloc
     92  1.1     skrll   (bfd *, asection *, arelent **, asymbol **);
     93  1.1     skrll static long mips_elf64_get_dynamic_reloc_upper_bound
     94  1.1     skrll   (bfd *);
     95  1.1     skrll static long mips_elf64_canonicalize_dynamic_reloc
     96  1.1     skrll   (bfd *, arelent **, asymbol **);
     97  1.1     skrll static bfd_boolean mips_elf64_slurp_one_reloc_table
     98  1.1     skrll   (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
     99  1.1     skrll    asymbol **, bfd_boolean);
    100  1.1     skrll static bfd_boolean mips_elf64_slurp_reloc_table
    101  1.1     skrll   (bfd *, asection *, asymbol **, bfd_boolean);
    102  1.1     skrll static void mips_elf64_write_relocs
    103  1.1     skrll   (bfd *, asection *, void *);
    104  1.1     skrll static void mips_elf64_write_rel
    105  1.1     skrll   (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
    106  1.1     skrll static void mips_elf64_write_rela
    107  1.1     skrll   (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
    108  1.1     skrll static bfd_reloc_status_type mips_elf64_gprel16_reloc
    109  1.1     skrll   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
    110  1.1     skrll static bfd_reloc_status_type mips_elf64_literal_reloc
    111  1.1     skrll   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
    112  1.1     skrll static bfd_reloc_status_type mips_elf64_gprel32_reloc
    113  1.1     skrll   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
    114  1.1     skrll static bfd_reloc_status_type mips_elf64_shift6_reloc
    115  1.1     skrll   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
    116  1.1     skrll static bfd_reloc_status_type mips16_gprel_reloc
    117  1.1     skrll   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
    118  1.1     skrll static bfd_boolean mips_elf64_assign_gp
    119  1.1     skrll   (bfd *, bfd_vma *);
    120  1.1     skrll static bfd_reloc_status_type mips_elf64_final_gp
    121  1.1     skrll   (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
    122  1.1     skrll static bfd_boolean mips_elf64_object_p
    123  1.1     skrll   (bfd *);
    124  1.2     skrll static bfd_boolean mips_elf64_is_local_label_name
    125  1.2     skrll   (bfd *, const char *);
    126  1.1     skrll static irix_compat_t elf64_mips_irix_compat
    127  1.1     skrll   (bfd *);
    128  1.1     skrll static bfd_boolean elf64_mips_grok_prstatus
    129  1.1     skrll   (bfd *, Elf_Internal_Note *);
    130  1.1     skrll static bfd_boolean elf64_mips_grok_psinfo
    131  1.1     skrll   (bfd *, Elf_Internal_Note *);
    132  1.1     skrll 
    133  1.6  christos extern const bfd_target mips_elf64_be_vec;
    134  1.6  christos extern const bfd_target mips_elf64_le_vec;
    135  1.1     skrll 
    136  1.1     skrll /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
    137  1.1     skrll    from smaller values.  Start with zero, widen, *then* decrement.  */
    138  1.1     skrll #define MINUS_ONE	(((bfd_vma)0) - 1)
    139  1.1     skrll 
    140  1.1     skrll /* The number of local .got entries we reserve.  */
    141  1.1     skrll #define MIPS_RESERVED_GOTNO (2)
    142  1.1     skrll 
    143  1.1     skrll /* The relocation table used for SHT_REL sections.  */
    145  1.1     skrll 
    146  1.1     skrll static reloc_howto_type mips_elf64_howto_table_rel[] =
    147  1.1     skrll {
    148  1.1     skrll   /* No relocation.  */
    149  1.1     skrll   HOWTO (R_MIPS_NONE,		/* type */
    150  1.6  christos 	 0,			/* rightshift */
    151  1.1     skrll 	 3,			/* size (0 = byte, 1 = short, 2 = long) */
    152  1.1     skrll 	 0,			/* bitsize */
    153  1.1     skrll 	 FALSE,			/* pc_relative */
    154  1.1     skrll 	 0,			/* bitpos */
    155  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    156  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    157  1.1     skrll 	 "R_MIPS_NONE",		/* name */
    158  1.1     skrll 	 FALSE,			/* partial_inplace */
    159  1.1     skrll 	 0,			/* src_mask */
    160  1.1     skrll 	 0,			/* dst_mask */
    161  1.1     skrll 	 FALSE),		/* pcrel_offset */
    162  1.1     skrll 
    163  1.1     skrll   /* 16 bit relocation.  */
    164  1.1     skrll   HOWTO (R_MIPS_16,		/* type */
    165  1.1     skrll 	 0,			/* rightshift */
    166  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    167  1.1     skrll 	 16,			/* bitsize */
    168  1.1     skrll 	 FALSE,			/* pc_relative */
    169  1.1     skrll 	 0,			/* bitpos */
    170  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    171  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    172  1.1     skrll 	 "R_MIPS_16",		/* name */
    173  1.1     skrll 	 TRUE,			/* partial_inplace */
    174  1.1     skrll 	 0x0000ffff,		/* src_mask */
    175  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    176  1.1     skrll 	 FALSE),		/* pcrel_offset */
    177  1.1     skrll 
    178  1.1     skrll   /* 32 bit relocation.  */
    179  1.1     skrll   HOWTO (R_MIPS_32,		/* type */
    180  1.1     skrll 	 0,			/* rightshift */
    181  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    182  1.1     skrll 	 32,			/* bitsize */
    183  1.1     skrll 	 FALSE,			/* pc_relative */
    184  1.1     skrll 	 0,			/* bitpos */
    185  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    186  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    187  1.1     skrll 	 "R_MIPS_32",		/* name */
    188  1.1     skrll 	 TRUE,			/* partial_inplace */
    189  1.1     skrll 	 0xffffffff,		/* src_mask */
    190  1.1     skrll 	 0xffffffff,		/* dst_mask */
    191  1.1     skrll 	 FALSE),		/* pcrel_offset */
    192  1.1     skrll 
    193  1.1     skrll   /* 32 bit symbol relative relocation.  */
    194  1.1     skrll   HOWTO (R_MIPS_REL32,		/* type */
    195  1.1     skrll 	 0,			/* rightshift */
    196  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    197  1.1     skrll 	 32,			/* bitsize */
    198  1.1     skrll 	 FALSE,			/* pc_relative */
    199  1.1     skrll 	 0,			/* bitpos */
    200  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    201  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    202  1.1     skrll 	 "R_MIPS_REL32",	/* name */
    203  1.1     skrll 	 TRUE,			/* partial_inplace */
    204  1.1     skrll 	 0xffffffff,		/* src_mask */
    205  1.1     skrll 	 0xffffffff,		/* dst_mask */
    206  1.1     skrll 	 FALSE),		/* pcrel_offset */
    207  1.1     skrll 
    208  1.1     skrll   /* 26 bit jump address.  */
    209  1.1     skrll   HOWTO (R_MIPS_26,		/* type */
    210  1.1     skrll 	 2,			/* rightshift */
    211  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    212  1.1     skrll 	 26,			/* bitsize */
    213  1.1     skrll 	 FALSE,			/* pc_relative */
    214  1.1     skrll 	 0,			/* bitpos */
    215  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    216  1.1     skrll 				/* This needs complex overflow
    217  1.1     skrll 				   detection, because the upper 36
    218  1.1     skrll 				   bits must match the PC + 4.  */
    219  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    220  1.1     skrll 	 "R_MIPS_26",		/* name */
    221  1.1     skrll 	 TRUE,			/* partial_inplace */
    222  1.1     skrll 	 0x03ffffff,		/* src_mask */
    223  1.1     skrll 	 0x03ffffff,		/* dst_mask */
    224  1.1     skrll 	 FALSE),		/* pcrel_offset */
    225  1.1     skrll 
    226  1.1     skrll   /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
    227  1.1     skrll      However, the native IRIX6 tools use them, so we try our best. */
    228  1.1     skrll 
    229  1.1     skrll   /* High 16 bits of symbol value.  */
    230  1.1     skrll   HOWTO (R_MIPS_HI16,		/* type */
    231  1.1     skrll 	 16,			/* rightshift */
    232  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    233  1.1     skrll 	 16,			/* bitsize */
    234  1.1     skrll 	 FALSE,			/* pc_relative */
    235  1.1     skrll 	 0,			/* bitpos */
    236  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    237  1.1     skrll 	 _bfd_mips_elf_hi16_reloc, /* special_function */
    238  1.1     skrll 	 "R_MIPS_HI16",		/* name */
    239  1.1     skrll 	 TRUE,			/* partial_inplace */
    240  1.1     skrll 	 0x0000ffff,		/* src_mask */
    241  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    242  1.1     skrll 	 FALSE),		/* pcrel_offset */
    243  1.1     skrll 
    244  1.1     skrll   /* Low 16 bits of symbol value.  */
    245  1.1     skrll   HOWTO (R_MIPS_LO16,		/* type */
    246  1.1     skrll 	 0,			/* rightshift */
    247  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    248  1.1     skrll 	 16,			/* bitsize */
    249  1.1     skrll 	 FALSE,			/* pc_relative */
    250  1.1     skrll 	 0,			/* bitpos */
    251  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    252  1.1     skrll 	 _bfd_mips_elf_lo16_reloc, /* special_function */
    253  1.1     skrll 	 "R_MIPS_LO16",		/* name */
    254  1.1     skrll 	 TRUE,			/* partial_inplace */
    255  1.1     skrll 	 0x0000ffff,		/* src_mask */
    256  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    257  1.1     skrll 	 FALSE),		/* pcrel_offset */
    258  1.1     skrll 
    259  1.1     skrll   /* GP relative reference.  */
    260  1.1     skrll   HOWTO (R_MIPS_GPREL16,	/* type */
    261  1.1     skrll 	 0,			/* rightshift */
    262  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    263  1.1     skrll 	 16,			/* bitsize */
    264  1.1     skrll 	 FALSE,			/* pc_relative */
    265  1.1     skrll 	 0,			/* bitpos */
    266  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    267  1.1     skrll 	 mips_elf64_gprel16_reloc, /* special_function */
    268  1.1     skrll 	 "R_MIPS_GPREL16",	/* name */
    269  1.1     skrll 	 TRUE,			/* partial_inplace */
    270  1.1     skrll 	 0x0000ffff,		/* src_mask */
    271  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    272  1.1     skrll 	 FALSE),		/* pcrel_offset */
    273  1.1     skrll 
    274  1.1     skrll   /* Reference to literal section.  */
    275  1.1     skrll   HOWTO (R_MIPS_LITERAL,	/* type */
    276  1.1     skrll 	 0,			/* rightshift */
    277  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    278  1.1     skrll 	 16,			/* bitsize */
    279  1.1     skrll 	 FALSE,			/* pc_relative */
    280  1.1     skrll 	 0,			/* bitpos */
    281  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    282  1.1     skrll 	 mips_elf64_literal_reloc, /* special_function */
    283  1.1     skrll 	 "R_MIPS_LITERAL",	/* name */
    284  1.1     skrll 	 TRUE,			/* partial_inplace */
    285  1.1     skrll 	 0x0000ffff,		/* src_mask */
    286  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    287  1.1     skrll 	 FALSE),		/* pcrel_offset */
    288  1.1     skrll 
    289  1.1     skrll   /* Reference to global offset table.  */
    290  1.1     skrll   HOWTO (R_MIPS_GOT16,		/* type */
    291  1.1     skrll 	 0,			/* rightshift */
    292  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    293  1.1     skrll 	 16,			/* bitsize */
    294  1.1     skrll 	 FALSE,			/* pc_relative */
    295  1.1     skrll 	 0,			/* bitpos */
    296  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    297  1.1     skrll 	 _bfd_mips_elf_got16_reloc, /* special_function */
    298  1.1     skrll 	 "R_MIPS_GOT16",	/* name */
    299  1.1     skrll 	 TRUE,			/* partial_inplace */
    300  1.1     skrll 	 0x0000ffff,		/* src_mask */
    301  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    302  1.1     skrll 	 FALSE),		/* pcrel_offset */
    303  1.1     skrll 
    304  1.1     skrll   /* 16 bit PC relative reference.  Note that the ABI document has a typo
    305  1.1     skrll      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
    306  1.1     skrll      We do the right thing here.  */
    307  1.1     skrll   HOWTO (R_MIPS_PC16,		/* type */
    308  1.1     skrll 	 2,			/* rightshift */
    309  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    310  1.1     skrll 	 16,			/* bitsize */
    311  1.1     skrll 	 TRUE,			/* pc_relative */
    312  1.1     skrll 	 0,			/* bitpos */
    313  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    314  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    315  1.1     skrll 	 "R_MIPS_PC16",		/* name */
    316  1.1     skrll 	 TRUE,			/* partial_inplace */
    317  1.1     skrll 	 0x0000ffff,		/* src_mask */
    318  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    319  1.1     skrll 	 TRUE),			/* pcrel_offset */
    320  1.1     skrll 
    321  1.1     skrll   /* 16 bit call through global offset table.  */
    322  1.1     skrll   HOWTO (R_MIPS_CALL16,		/* type */
    323  1.1     skrll 	 0,			/* rightshift */
    324  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    325  1.1     skrll 	 16,			/* bitsize */
    326  1.1     skrll 	 FALSE,			/* pc_relative */
    327  1.1     skrll 	 0,			/* bitpos */
    328  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    329  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    330  1.1     skrll 	 "R_MIPS_CALL16",	/* name */
    331  1.1     skrll 	 TRUE,			/* partial_inplace */
    332  1.1     skrll 	 0x0000ffff,		/* src_mask */
    333  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    334  1.1     skrll 	 FALSE),		/* pcrel_offset */
    335  1.1     skrll 
    336  1.1     skrll   /* 32 bit GP relative reference.  */
    337  1.1     skrll   HOWTO (R_MIPS_GPREL32,	/* type */
    338  1.1     skrll 	 0,			/* rightshift */
    339  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    340  1.1     skrll 	 32,			/* bitsize */
    341  1.1     skrll 	 FALSE,			/* pc_relative */
    342  1.1     skrll 	 0,			/* bitpos */
    343  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    344  1.1     skrll 	 mips_elf64_gprel32_reloc, /* special_function */
    345  1.1     skrll 	 "R_MIPS_GPREL32",	/* name */
    346  1.1     skrll 	 TRUE,			/* partial_inplace */
    347  1.1     skrll 	 0xffffffff,		/* src_mask */
    348  1.1     skrll 	 0xffffffff,		/* dst_mask */
    349  1.1     skrll 	 FALSE),		/* pcrel_offset */
    350  1.1     skrll 
    351  1.1     skrll   EMPTY_HOWTO (13),
    352  1.1     skrll   EMPTY_HOWTO (14),
    353  1.1     skrll   EMPTY_HOWTO (15),
    354  1.1     skrll 
    355  1.1     skrll   /* A 5 bit shift field.  */
    356  1.1     skrll   HOWTO (R_MIPS_SHIFT5,		/* type */
    357  1.1     skrll 	 0,			/* rightshift */
    358  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    359  1.1     skrll 	 5,			/* bitsize */
    360  1.1     skrll 	 FALSE,			/* pc_relative */
    361  1.1     skrll 	 6,			/* bitpos */
    362  1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    363  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    364  1.1     skrll 	 "R_MIPS_SHIFT5",	/* name */
    365  1.1     skrll 	 TRUE,			/* partial_inplace */
    366  1.1     skrll 	 0x000007c0,		/* src_mask */
    367  1.1     skrll 	 0x000007c0,		/* dst_mask */
    368  1.1     skrll 	 FALSE),		/* pcrel_offset */
    369  1.1     skrll 
    370  1.1     skrll   /* A 6 bit shift field.  */
    371  1.1     skrll   HOWTO (R_MIPS_SHIFT6,		/* type */
    372  1.1     skrll 	 0,			/* rightshift */
    373  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    374  1.1     skrll 	 6,			/* bitsize */
    375  1.1     skrll 	 FALSE,			/* pc_relative */
    376  1.1     skrll 	 6,			/* bitpos */
    377  1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    378  1.1     skrll 	 mips_elf64_shift6_reloc, /* special_function */
    379  1.1     skrll 	 "R_MIPS_SHIFT6",	/* name */
    380  1.1     skrll 	 TRUE,			/* partial_inplace */
    381  1.1     skrll 	 0x000007c4,		/* src_mask */
    382  1.1     skrll 	 0x000007c4,		/* dst_mask */
    383  1.1     skrll 	 FALSE),		/* pcrel_offset */
    384  1.1     skrll 
    385  1.1     skrll   /* 64 bit relocation.  */
    386  1.1     skrll   HOWTO (R_MIPS_64,		/* type */
    387  1.1     skrll 	 0,			/* rightshift */
    388  1.1     skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    389  1.1     skrll 	 64,			/* bitsize */
    390  1.1     skrll 	 FALSE,			/* pc_relative */
    391  1.1     skrll 	 0,			/* bitpos */
    392  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    393  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    394  1.1     skrll 	 "R_MIPS_64",		/* name */
    395  1.1     skrll 	 TRUE,			/* partial_inplace */
    396  1.1     skrll 	 MINUS_ONE,		/* src_mask */
    397  1.1     skrll 	 MINUS_ONE,		/* dst_mask */
    398  1.1     skrll 	 FALSE),		/* pcrel_offset */
    399  1.1     skrll 
    400  1.1     skrll   /* Displacement in the global offset table.  */
    401  1.1     skrll   HOWTO (R_MIPS_GOT_DISP,	/* type */
    402  1.1     skrll 	 0,			/* rightshift */
    403  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    404  1.1     skrll 	 16,			/* bitsize */
    405  1.1     skrll 	 FALSE,			/* pc_relative */
    406  1.1     skrll 	 0,			/* bitpos */
    407  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    408  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    409  1.1     skrll 	 "R_MIPS_GOT_DISP",	/* name */
    410  1.1     skrll 	 TRUE,			/* partial_inplace */
    411  1.1     skrll 	 0x0000ffff,		/* src_mask */
    412  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    413  1.1     skrll 	 FALSE),		/* pcrel_offset */
    414  1.1     skrll 
    415  1.1     skrll   /* Displacement to page pointer in the global offset table.  */
    416  1.1     skrll   HOWTO (R_MIPS_GOT_PAGE,	/* type */
    417  1.1     skrll 	 0,			/* rightshift */
    418  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    419  1.1     skrll 	 16,			/* bitsize */
    420  1.1     skrll 	 FALSE,			/* pc_relative */
    421  1.1     skrll 	 0,			/* bitpos */
    422  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    423  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    424  1.1     skrll 	 "R_MIPS_GOT_PAGE",	/* name */
    425  1.1     skrll 	 TRUE,			/* partial_inplace */
    426  1.1     skrll 	 0x0000ffff,		/* src_mask */
    427  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    428  1.1     skrll 	 FALSE),		/* pcrel_offset */
    429  1.1     skrll 
    430  1.1     skrll   /* Offset from page pointer in the global offset table.  */
    431  1.1     skrll   HOWTO (R_MIPS_GOT_OFST,	/* type */
    432  1.1     skrll 	 0,			/* rightshift */
    433  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    434  1.1     skrll 	 16,			/* bitsize */
    435  1.1     skrll 	 FALSE,			/* pc_relative */
    436  1.1     skrll 	 0,			/* bitpos */
    437  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    438  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    439  1.1     skrll 	 "R_MIPS_GOT_OFST",	/* name */
    440  1.1     skrll 	 TRUE,			/* partial_inplace */
    441  1.1     skrll 	 0x0000ffff,		/* src_mask */
    442  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    443  1.1     skrll 	 FALSE),		/* pcrel_offset */
    444  1.1     skrll 
    445  1.1     skrll   /* High 16 bits of displacement in global offset table.  */
    446  1.1     skrll   HOWTO (R_MIPS_GOT_HI16,	/* type */
    447  1.1     skrll 	 0,			/* rightshift */
    448  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    449  1.1     skrll 	 16,			/* bitsize */
    450  1.1     skrll 	 FALSE,			/* pc_relative */
    451  1.1     skrll 	 0,			/* bitpos */
    452  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    453  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    454  1.1     skrll 	 "R_MIPS_GOT_HI16",	/* name */
    455  1.1     skrll 	 TRUE,			/* partial_inplace */
    456  1.1     skrll 	 0x0000ffff,		/* src_mask */
    457  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    458  1.1     skrll 	 FALSE),		/* pcrel_offset */
    459  1.1     skrll 
    460  1.1     skrll   /* Low 16 bits of displacement in global offset table.  */
    461  1.1     skrll   HOWTO (R_MIPS_GOT_LO16,	/* type */
    462  1.1     skrll 	 0,			/* rightshift */
    463  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    464  1.1     skrll 	 16,			/* bitsize */
    465  1.1     skrll 	 FALSE,			/* pc_relative */
    466  1.1     skrll 	 0,			/* bitpos */
    467  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    468  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    469  1.1     skrll 	 "R_MIPS_GOT_LO16",	/* name */
    470  1.1     skrll 	 TRUE,			/* partial_inplace */
    471  1.1     skrll 	 0x0000ffff,		/* src_mask */
    472  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    473  1.1     skrll 	 FALSE),		/* pcrel_offset */
    474  1.1     skrll 
    475  1.1     skrll   /* 64 bit subtraction.  */
    476  1.1     skrll   HOWTO (R_MIPS_SUB,		/* type */
    477  1.1     skrll 	 0,			/* rightshift */
    478  1.1     skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    479  1.1     skrll 	 64,			/* bitsize */
    480  1.1     skrll 	 FALSE,			/* pc_relative */
    481  1.1     skrll 	 0,			/* bitpos */
    482  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    483  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    484  1.1     skrll 	 "R_MIPS_SUB",		/* name */
    485  1.1     skrll 	 TRUE,			/* partial_inplace */
    486  1.1     skrll 	 MINUS_ONE,		/* src_mask */
    487  1.1     skrll 	 MINUS_ONE,		/* dst_mask */
    488  1.1     skrll 	 FALSE),		/* pcrel_offset */
    489  1.1     skrll 
    490  1.1     skrll   /* Insert the addend as an instruction.  */
    491  1.1     skrll   /* FIXME: Not handled correctly.  */
    492  1.1     skrll   HOWTO (R_MIPS_INSERT_A,	/* type */
    493  1.1     skrll 	 0,			/* rightshift */
    494  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    495  1.1     skrll 	 32,			/* bitsize */
    496  1.1     skrll 	 FALSE,			/* pc_relative */
    497  1.1     skrll 	 0,			/* bitpos */
    498  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    499  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    500  1.1     skrll 	 "R_MIPS_INSERT_A",	/* name */
    501  1.1     skrll 	 TRUE,			/* partial_inplace */
    502  1.1     skrll 	 0xffffffff,		/* src_mask */
    503  1.1     skrll 	 0xffffffff,		/* dst_mask */
    504  1.1     skrll 	 FALSE),		/* pcrel_offset */
    505  1.1     skrll 
    506  1.1     skrll   /* Insert the addend as an instruction, and change all relocations
    507  1.1     skrll      to refer to the old instruction at the address.  */
    508  1.1     skrll   /* FIXME: Not handled correctly.  */
    509  1.1     skrll   HOWTO (R_MIPS_INSERT_B,	/* type */
    510  1.1     skrll 	 0,			/* rightshift */
    511  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    512  1.1     skrll 	 32,			/* bitsize */
    513  1.1     skrll 	 FALSE,			/* pc_relative */
    514  1.1     skrll 	 0,			/* bitpos */
    515  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    516  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    517  1.1     skrll 	 "R_MIPS_INSERT_B",	/* name */
    518  1.1     skrll 	 TRUE,			/* partial_inplace */
    519  1.1     skrll 	 0xffffffff,		/* src_mask */
    520  1.1     skrll 	 0xffffffff,		/* dst_mask */
    521  1.1     skrll 	 FALSE),		/* pcrel_offset */
    522  1.1     skrll 
    523  1.1     skrll   /* Delete a 32 bit instruction.  */
    524  1.1     skrll   /* FIXME: Not handled correctly.  */
    525  1.1     skrll   HOWTO (R_MIPS_DELETE,		/* type */
    526  1.1     skrll 	 0,			/* rightshift */
    527  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    528  1.1     skrll 	 32,			/* bitsize */
    529  1.1     skrll 	 FALSE,			/* pc_relative */
    530  1.1     skrll 	 0,			/* bitpos */
    531  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    532  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    533  1.1     skrll 	 "R_MIPS_DELETE",	/* name */
    534  1.1     skrll 	 TRUE,			/* partial_inplace */
    535  1.1     skrll 	 0xffffffff,		/* src_mask */
    536  1.1     skrll 	 0xffffffff,		/* dst_mask */
    537  1.1     skrll 	 FALSE),		/* pcrel_offset */
    538  1.1     skrll 
    539  1.1     skrll   /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
    540  1.1     skrll      We don't, because
    541  1.1     skrll        a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
    542  1.1     skrll 	  R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
    543  1.1     skrll 	  fallable heuristics.
    544  1.1     skrll        b) No other NewABI toolchain actually emits such relocations.  */
    545  1.1     skrll   EMPTY_HOWTO (R_MIPS_HIGHER),
    546  1.1     skrll   EMPTY_HOWTO (R_MIPS_HIGHEST),
    547  1.1     skrll 
    548  1.1     skrll   /* High 16 bits of displacement in global offset table.  */
    549  1.1     skrll   HOWTO (R_MIPS_CALL_HI16,	/* type */
    550  1.1     skrll 	 0,			/* rightshift */
    551  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    552  1.1     skrll 	 16,			/* bitsize */
    553  1.1     skrll 	 FALSE,			/* pc_relative */
    554  1.1     skrll 	 0,			/* bitpos */
    555  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    556  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    557  1.1     skrll 	 "R_MIPS_CALL_HI16",	/* name */
    558  1.1     skrll 	 TRUE,			/* partial_inplace */
    559  1.1     skrll 	 0x0000ffff,		/* src_mask */
    560  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    561  1.1     skrll 	 FALSE),		/* pcrel_offset */
    562  1.1     skrll 
    563  1.1     skrll   /* Low 16 bits of displacement in global offset table.  */
    564  1.1     skrll   HOWTO (R_MIPS_CALL_LO16,	/* type */
    565  1.1     skrll 	 0,			/* rightshift */
    566  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    567  1.1     skrll 	 16,			/* bitsize */
    568  1.1     skrll 	 FALSE,			/* pc_relative */
    569  1.1     skrll 	 0,			/* bitpos */
    570  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    571  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    572  1.1     skrll 	 "R_MIPS_CALL_LO16",	/* name */
    573  1.1     skrll 	 TRUE,			/* partial_inplace */
    574  1.1     skrll 	 0x0000ffff,		/* src_mask */
    575  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    576  1.1     skrll 	 FALSE),		/* pcrel_offset */
    577  1.1     skrll 
    578  1.1     skrll   /* Section displacement, used by an associated event location section.  */
    579  1.1     skrll   HOWTO (R_MIPS_SCN_DISP,	/* type */
    580  1.1     skrll 	 0,			/* rightshift */
    581  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    582  1.1     skrll 	 32,			/* bitsize */
    583  1.1     skrll 	 FALSE,			/* pc_relative */
    584  1.1     skrll 	 0,			/* bitpos */
    585  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    586  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    587  1.1     skrll 	 "R_MIPS_SCN_DISP",	/* name */
    588  1.1     skrll 	 TRUE,			/* partial_inplace */
    589  1.1     skrll 	 0xffffffff,		/* src_mask */
    590  1.1     skrll 	 0xffffffff,		/* dst_mask */
    591  1.1     skrll 	 FALSE),		/* pcrel_offset */
    592  1.1     skrll 
    593  1.1     skrll   HOWTO (R_MIPS_REL16,		/* type */
    594  1.1     skrll 	 0,			/* rightshift */
    595  1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    596  1.1     skrll 	 16,			/* bitsize */
    597  1.1     skrll 	 FALSE,			/* pc_relative */
    598  1.1     skrll 	 0,			/* bitpos */
    599  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    600  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    601  1.1     skrll 	 "R_MIPS_REL16",	/* name */
    602  1.1     skrll 	 TRUE,			/* partial_inplace */
    603  1.1     skrll 	 0xffff,		/* src_mask */
    604  1.1     skrll 	 0xffff,		/* dst_mask */
    605  1.1     skrll 	 FALSE),		/* pcrel_offset */
    606  1.1     skrll 
    607  1.1     skrll   /* These two are obsolete.  */
    608  1.1     skrll   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
    609  1.1     skrll   EMPTY_HOWTO (R_MIPS_PJUMP),
    610  1.1     skrll 
    611  1.1     skrll   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
    612  1.1     skrll      It must be used for multigot GOT's (and only there).  */
    613  1.1     skrll   HOWTO (R_MIPS_RELGOT,		/* type */
    614  1.1     skrll 	 0,			/* rightshift */
    615  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    616  1.1     skrll 	 32,			/* bitsize */
    617  1.1     skrll 	 FALSE,			/* pc_relative */
    618  1.1     skrll 	 0,			/* bitpos */
    619  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    620  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    621  1.1     skrll 	 "R_MIPS_RELGOT",	/* name */
    622  1.1     skrll 	 TRUE,			/* partial_inplace */
    623  1.1     skrll 	 0xffffffff,		/* src_mask */
    624  1.1     skrll 	 0xffffffff,		/* dst_mask */
    625  1.1     skrll 	 FALSE),		/* pcrel_offset */
    626  1.1     skrll 
    627  1.1     skrll   /* Protected jump conversion.  This is an optimization hint.  No
    628  1.1     skrll      relocation is required for correctness.  */
    629  1.1     skrll   HOWTO (R_MIPS_JALR,		/* type */
    630  1.1     skrll 	 0,			/* rightshift */
    631  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    632  1.1     skrll 	 32,			/* bitsize */
    633  1.1     skrll 	 FALSE,			/* pc_relative */
    634  1.1     skrll 	 0,			/* bitpos */
    635  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    636  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    637  1.1     skrll 	 "R_MIPS_JALR",		/* name */
    638  1.1     skrll 	 FALSE,			/* partial_inplace */
    639  1.1     skrll 	 0,			/* src_mask */
    640  1.1     skrll 	 0x00000000,		/* dst_mask */
    641  1.1     skrll 	 FALSE),		/* pcrel_offset */
    642  1.1     skrll 
    643  1.1     skrll   /* TLS relocations.  */
    644  1.1     skrll   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
    645  1.1     skrll   EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
    646  1.1     skrll 
    647  1.1     skrll   HOWTO (R_MIPS_TLS_DTPMOD64,	/* type */
    648  1.1     skrll 	 0,			/* rightshift */
    649  1.1     skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    650  1.1     skrll 	 64,			/* bitsize */
    651  1.1     skrll 	 FALSE,			/* pc_relative */
    652  1.1     skrll 	 0,			/* bitpos */
    653  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    654  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    655  1.1     skrll 	 "R_MIPS_TLS_DTPMOD64",	/* name */
    656  1.1     skrll 	 TRUE,			/* partial_inplace */
    657  1.1     skrll 	 MINUS_ONE,		/* src_mask */
    658  1.1     skrll 	 MINUS_ONE,		/* dst_mask */
    659  1.1     skrll 	 FALSE),		/* pcrel_offset */
    660  1.1     skrll 
    661  1.1     skrll   HOWTO (R_MIPS_TLS_DTPREL64,	/* type */
    662  1.1     skrll 	 0,			/* rightshift */
    663  1.1     skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    664  1.1     skrll 	 64,			/* bitsize */
    665  1.1     skrll 	 FALSE,			/* pc_relative */
    666  1.1     skrll 	 0,			/* bitpos */
    667  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    668  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    669  1.1     skrll 	 "R_MIPS_TLS_DTPREL64",	/* name */
    670  1.1     skrll 	 TRUE,			/* partial_inplace */
    671  1.1     skrll 	 MINUS_ONE,		/* src_mask */
    672  1.1     skrll 	 MINUS_ONE,		/* dst_mask */
    673  1.1     skrll 	 FALSE),		/* pcrel_offset */
    674  1.1     skrll 
    675  1.1     skrll   /* TLS general dynamic variable reference.  */
    676  1.1     skrll   HOWTO (R_MIPS_TLS_GD,		/* type */
    677  1.1     skrll 	 0,			/* rightshift */
    678  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    679  1.1     skrll 	 16,			/* bitsize */
    680  1.1     skrll 	 FALSE,			/* pc_relative */
    681  1.1     skrll 	 0,			/* bitpos */
    682  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    683  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    684  1.1     skrll 	 "R_MIPS_TLS_GD",	/* name */
    685  1.1     skrll 	 TRUE,			/* partial_inplace */
    686  1.1     skrll 	 0x0000ffff,		/* src_mask */
    687  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    688  1.1     skrll 	 FALSE),		/* pcrel_offset */
    689  1.1     skrll 
    690  1.1     skrll   /* TLS local dynamic variable reference.  */
    691  1.1     skrll   HOWTO (R_MIPS_TLS_LDM,	/* type */
    692  1.1     skrll 	 0,			/* rightshift */
    693  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    694  1.1     skrll 	 16,			/* bitsize */
    695  1.1     skrll 	 FALSE,			/* pc_relative */
    696  1.1     skrll 	 0,			/* bitpos */
    697  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    698  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    699  1.1     skrll 	 "R_MIPS_TLS_LDM",	/* name */
    700  1.1     skrll 	 TRUE,			/* partial_inplace */
    701  1.1     skrll 	 0x0000ffff,		/* src_mask */
    702  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    703  1.1     skrll 	 FALSE),		/* pcrel_offset */
    704  1.1     skrll 
    705  1.1     skrll   /* TLS local dynamic offset.  */
    706  1.1     skrll   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
    707  1.1     skrll 	 0,			/* rightshift */
    708  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    709  1.1     skrll 	 16,			/* bitsize */
    710  1.1     skrll 	 FALSE,			/* pc_relative */
    711  1.1     skrll 	 0,			/* bitpos */
    712  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    713  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    714  1.1     skrll 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
    715  1.1     skrll 	 TRUE,			/* partial_inplace */
    716  1.1     skrll 	 0x0000ffff,		/* src_mask */
    717  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    718  1.1     skrll 	 FALSE),		/* pcrel_offset */
    719  1.1     skrll 
    720  1.1     skrll   /* TLS local dynamic offset.  */
    721  1.1     skrll   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
    722  1.1     skrll 	 0,			/* rightshift */
    723  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    724  1.1     skrll 	 16,			/* bitsize */
    725  1.1     skrll 	 FALSE,			/* pc_relative */
    726  1.1     skrll 	 0,			/* bitpos */
    727  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    728  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    729  1.1     skrll 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
    730  1.1     skrll 	 TRUE,			/* partial_inplace */
    731  1.1     skrll 	 0x0000ffff,		/* src_mask */
    732  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    733  1.1     skrll 	 FALSE),		/* pcrel_offset */
    734  1.1     skrll 
    735  1.1     skrll   /* TLS thread pointer offset.  */
    736  1.1     skrll   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
    737  1.1     skrll 	 0,			/* rightshift */
    738  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    739  1.1     skrll 	 16,			/* bitsize */
    740  1.1     skrll 	 FALSE,			/* pc_relative */
    741  1.1     skrll 	 0,			/* bitpos */
    742  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    743  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    744  1.1     skrll 	 "R_MIPS_TLS_GOTTPREL",	/* name */
    745  1.1     skrll 	 TRUE,			/* partial_inplace */
    746  1.1     skrll 	 0x0000ffff,		/* src_mask */
    747  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    748  1.1     skrll 	 FALSE),		/* pcrel_offset */
    749  1.1     skrll 
    750  1.1     skrll   /* TLS IE dynamic relocations.  */
    751  1.1     skrll   EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
    752  1.1     skrll 
    753  1.1     skrll   HOWTO (R_MIPS_TLS_TPREL64,	/* type */
    754  1.1     skrll 	 0,			/* rightshift */
    755  1.1     skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    756  1.1     skrll 	 64,			/* bitsize */
    757  1.1     skrll 	 FALSE,			/* pc_relative */
    758  1.1     skrll 	 0,			/* bitpos */
    759  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    760  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    761  1.1     skrll 	 "R_MIPS_TLS_TPREL64",	/* name */
    762  1.1     skrll 	 TRUE,			/* partial_inplace */
    763  1.1     skrll 	 MINUS_ONE,		/* src_mask */
    764  1.1     skrll 	 MINUS_ONE,		/* dst_mask */
    765  1.1     skrll 	 FALSE),		/* pcrel_offset */
    766  1.1     skrll 
    767  1.1     skrll   /* TLS thread pointer offset.  */
    768  1.1     skrll   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
    769  1.1     skrll 	 0,			/* rightshift */
    770  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    771  1.1     skrll 	 16,			/* bitsize */
    772  1.1     skrll 	 FALSE,			/* pc_relative */
    773  1.1     skrll 	 0,			/* bitpos */
    774  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    775  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    776  1.1     skrll 	 "R_MIPS_TLS_TPREL_HI16", /* name */
    777  1.1     skrll 	 TRUE,			/* partial_inplace */
    778  1.1     skrll 	 0x0000ffff,		/* src_mask */
    779  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    780  1.1     skrll 	 FALSE),		/* pcrel_offset */
    781  1.1     skrll 
    782  1.1     skrll   /* TLS thread pointer offset.  */
    783  1.1     skrll   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
    784  1.1     skrll 	 0,			/* rightshift */
    785  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    786  1.1     skrll 	 16,			/* bitsize */
    787  1.1     skrll 	 FALSE,			/* pc_relative */
    788  1.1     skrll 	 0,			/* bitpos */
    789  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    790  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    791  1.1     skrll 	 "R_MIPS_TLS_TPREL_LO16", /* name */
    792  1.1     skrll 	 TRUE,			/* partial_inplace */
    793  1.1     skrll 	 0x0000ffff,		/* src_mask */
    794  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    795  1.1     skrll 	 FALSE),		/* pcrel_offset */
    796  1.1     skrll 
    797  1.1     skrll   /* 32 bit relocation with no addend.  */
    798  1.1     skrll   HOWTO (R_MIPS_GLOB_DAT,	/* type */
    799  1.1     skrll 	 0,			/* rightshift */
    800  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    801  1.1     skrll 	 32,			/* bitsize */
    802  1.1     skrll 	 FALSE,			/* pc_relative */
    803  1.1     skrll 	 0,			/* bitpos */
    804  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    805  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
    806  1.1     skrll 	 "R_MIPS_GLOB_DAT",	/* name */
    807  1.1     skrll 	 FALSE,			/* partial_inplace */
    808  1.1     skrll 	 0x0,			/* src_mask */
    809  1.1     skrll 	 0xffffffff,		/* dst_mask */
    810  1.6  christos 	 FALSE),		/* pcrel_offset */
    811  1.6  christos 
    812  1.6  christos   EMPTY_HOWTO (52),
    813  1.6  christos   EMPTY_HOWTO (53),
    814  1.6  christos   EMPTY_HOWTO (54),
    815  1.6  christos   EMPTY_HOWTO (55),
    816  1.6  christos   EMPTY_HOWTO (56),
    817  1.6  christos   EMPTY_HOWTO (57),
    818  1.6  christos   EMPTY_HOWTO (58),
    819  1.6  christos   EMPTY_HOWTO (59),
    820  1.6  christos 
    821  1.6  christos   HOWTO (R_MIPS_PC21_S2,	/* type */
    822  1.6  christos 	 2,			/* rightshift */
    823  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    824  1.6  christos 	 21,			/* bitsize */
    825  1.6  christos 	 TRUE,			/* pc_relative */
    826  1.6  christos 	 0,			/* bitpos */
    827  1.6  christos 	 complain_overflow_signed, /* complain_on_overflow */
    828  1.6  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
    829  1.6  christos 	 "R_MIPS_PC21_S2",	/* name */
    830  1.6  christos 	 TRUE,			/* partial_inplace */
    831  1.6  christos 	 0x001fffff,		/* src_mask */
    832  1.6  christos 	 0x001fffff,		/* dst_mask */
    833  1.6  christos 	 TRUE),			/* pcrel_offset */
    834  1.6  christos 
    835  1.6  christos   HOWTO (R_MIPS_PC26_S2,	/* type */
    836  1.6  christos 	 2,			/* rightshift */
    837  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    838  1.6  christos 	 26,			/* bitsize */
    839  1.6  christos 	 TRUE,			/* pc_relative */
    840  1.6  christos 	 0,			/* bitpos */
    841  1.6  christos 	 complain_overflow_signed, /* complain_on_overflow */
    842  1.6  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
    843  1.6  christos 	 "R_MIPS_PC26_S2",	/* name */
    844  1.6  christos 	 TRUE,			/* partial_inplace */
    845  1.6  christos 	 0x03ffffff,		/* src_mask */
    846  1.6  christos 	 0x03ffffff,		/* dst_mask */
    847  1.6  christos 	 TRUE),			/* pcrel_offset */
    848  1.6  christos 
    849  1.6  christos   HOWTO (R_MIPS_PC18_S3,	/* type */
    850  1.6  christos 	 3,			/* rightshift */
    851  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    852  1.6  christos 	 18,			/* bitsize */
    853  1.6  christos 	 TRUE,			/* pc_relative */
    854  1.6  christos 	 0,			/* bitpos */
    855  1.6  christos 	 complain_overflow_signed, /* complain_on_overflow */
    856  1.6  christos 	 _bfd_mips_elf_generic_reloc,   /* special_function */
    857  1.6  christos 	 "R_MIPS_PC18_S3",	/* name */
    858  1.6  christos 	 TRUE,			/* partial_inplace */
    859  1.6  christos 	 0x0003ffff,		/* src_mask */
    860  1.6  christos 	 0x0003ffff,		/* dst_mask */
    861  1.6  christos 	 TRUE),			/* pcrel_offset */
    862  1.6  christos 
    863  1.6  christos   HOWTO (R_MIPS_PC19_S2,	/* type */
    864  1.6  christos 	 2,			/* rightshift */
    865  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    866  1.6  christos 	 19,			/* bitsize */
    867  1.6  christos 	 TRUE,			/* pc_relative */
    868  1.6  christos 	 0,			/* bitpos */
    869  1.6  christos 	 complain_overflow_signed, /* complain_on_overflow */
    870  1.6  christos 	 _bfd_mips_elf_generic_reloc,   /* special_function */
    871  1.6  christos 	 "R_MIPS_PC19_S2",	/* name */
    872  1.6  christos 	 TRUE,			/* partial_inplace */
    873  1.6  christos 	 0x0007ffff,		/* src_mask */
    874  1.6  christos 	 0x0007ffff,		/* dst_mask */
    875  1.6  christos 	 TRUE),			/* pcrel_offset */
    876  1.6  christos 
    877  1.6  christos   HOWTO (R_MIPS_PCHI16,		/* type */
    878  1.6  christos 	 16,			/* rightshift */
    879  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    880  1.6  christos 	 16,			/* bitsize */
    881  1.6  christos 	 TRUE,			/* pc_relative */
    882  1.6  christos 	 0,			/* bitpos */
    883  1.6  christos 	 complain_overflow_signed, /* complain_on_overflow */
    884  1.6  christos 	 _bfd_mips_elf_generic_reloc,   /* special_function */
    885  1.6  christos 	 "R_MIPS_PCHI16",	/* name */
    886  1.6  christos 	 TRUE,			/* partial_inplace */
    887  1.6  christos 	 0x0000ffff,		/* src_mask */
    888  1.6  christos 	 0x0000ffff,		/* dst_mask */
    889  1.6  christos 	 TRUE),			/* pcrel_offset */
    890  1.6  christos 
    891  1.6  christos   HOWTO (R_MIPS_PCLO16,		/* type */
    892  1.6  christos 	 0,			/* rightshift */
    893  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    894  1.6  christos 	 16,			/* bitsize */
    895  1.6  christos 	 TRUE,			/* pc_relative */
    896  1.6  christos 	 0,			/* bitpos */
    897  1.6  christos 	 complain_overflow_dont, /* complain_on_overflow */
    898  1.6  christos 	 _bfd_mips_elf_generic_reloc,   /* special_function */
    899  1.6  christos 	 "R_MIPS_PCLO16",	/* name */
    900  1.6  christos 	 TRUE,			/* partial_inplace */
    901  1.6  christos 	 0x0000ffff,		/* src_mask */
    902  1.6  christos 	 0x0000ffff,		/* dst_mask */
    903  1.6  christos 	 TRUE),			/* pcrel_offset */
    904  1.1     skrll 
    905  1.1     skrll };
    906  1.1     skrll 
    907  1.1     skrll /* The relocation table used for SHT_RELA sections.  */
    908  1.1     skrll 
    909  1.1     skrll static reloc_howto_type mips_elf64_howto_table_rela[] =
    910  1.1     skrll {
    911  1.1     skrll   /* No relocation.  */
    912  1.1     skrll   HOWTO (R_MIPS_NONE,		/* type */
    913  1.6  christos 	 0,			/* rightshift */
    914  1.1     skrll 	 3,			/* size (0 = byte, 1 = short, 2 = long) */
    915  1.1     skrll 	 0,			/* bitsize */
    916  1.1     skrll 	 FALSE,			/* pc_relative */
    917  1.1     skrll 	 0,			/* bitpos */
    918  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    919  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    920  1.1     skrll 	 "R_MIPS_NONE",		/* name */
    921  1.1     skrll 	 FALSE,			/* partial_inplace */
    922  1.1     skrll 	 0,			/* src_mask */
    923  1.1     skrll 	 0,			/* dst_mask */
    924  1.1     skrll 	 FALSE),		/* pcrel_offset */
    925  1.1     skrll 
    926  1.1     skrll   /* 16 bit relocation.  */
    927  1.1     skrll   HOWTO (R_MIPS_16,		/* type */
    928  1.1     skrll 	 0,			/* rightshift */
    929  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    930  1.1     skrll 	 16,			/* bitsize */
    931  1.1     skrll 	 FALSE,			/* pc_relative */
    932  1.1     skrll 	 0,			/* bitpos */
    933  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    934  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    935  1.1     skrll 	 "R_MIPS_16",		/* name */
    936  1.1     skrll 	 FALSE,			/* partial_inplace */
    937  1.1     skrll 	 0,			/* src_mask */
    938  1.1     skrll 	 0x0000ffff,		/* dst_mask */
    939  1.1     skrll 	 FALSE),		/* pcrel_offset */
    940  1.1     skrll 
    941  1.1     skrll   /* 32 bit relocation.  */
    942  1.1     skrll   HOWTO (R_MIPS_32,		/* type */
    943  1.1     skrll 	 0,			/* rightshift */
    944  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    945  1.1     skrll 	 32,			/* bitsize */
    946  1.1     skrll 	 FALSE,			/* pc_relative */
    947  1.1     skrll 	 0,			/* bitpos */
    948  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    949  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    950  1.1     skrll 	 "R_MIPS_32",		/* name */
    951  1.1     skrll 	 FALSE,			/* partial_inplace */
    952  1.1     skrll 	 0,			/* src_mask */
    953  1.1     skrll 	 0xffffffff,		/* dst_mask */
    954  1.1     skrll 	 FALSE),		/* pcrel_offset */
    955  1.1     skrll 
    956  1.1     skrll   /* 32 bit symbol relative relocation.  */
    957  1.1     skrll   HOWTO (R_MIPS_REL32,		/* type */
    958  1.1     skrll 	 0,			/* rightshift */
    959  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    960  1.1     skrll 	 32,			/* bitsize */
    961  1.1     skrll 	 FALSE,			/* pc_relative */
    962  1.1     skrll 	 0,			/* bitpos */
    963  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    964  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    965  1.1     skrll 	 "R_MIPS_REL32",	/* name */
    966  1.1     skrll 	 FALSE,			/* partial_inplace */
    967  1.1     skrll 	 0,			/* src_mask */
    968  1.1     skrll 	 0xffffffff,		/* dst_mask */
    969  1.1     skrll 	 FALSE),		/* pcrel_offset */
    970  1.1     skrll 
    971  1.1     skrll   /* 26 bit jump address.  */
    972  1.1     skrll   HOWTO (R_MIPS_26,		/* type */
    973  1.1     skrll 	 2,			/* rightshift */
    974  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    975  1.1     skrll 	 26,			/* bitsize */
    976  1.1     skrll 	 FALSE,			/* pc_relative */
    977  1.1     skrll 	 0,			/* bitpos */
    978  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    979  1.1     skrll 				/* This needs complex overflow
    980  1.1     skrll 				   detection, because the upper 36
    981  1.1     skrll 				   bits must match the PC + 4.  */
    982  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    983  1.1     skrll 	 "R_MIPS_26",		/* name */
    984  1.1     skrll 	 FALSE,			/* partial_inplace */
    985  1.1     skrll 	 0,			/* src_mask */
    986  1.1     skrll 	 0x03ffffff,		/* dst_mask */
    987  1.1     skrll 	 FALSE),		/* pcrel_offset */
    988  1.1     skrll 
    989  1.1     skrll   /* High 16 bits of symbol value.  */
    990  1.1     skrll   HOWTO (R_MIPS_HI16,		/* type */
    991  1.1     skrll 	 0,			/* rightshift */
    992  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    993  1.1     skrll 	 16,			/* bitsize */
    994  1.1     skrll 	 FALSE,			/* pc_relative */
    995  1.1     skrll 	 0,			/* bitpos */
    996  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    997  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
    998  1.1     skrll 	 "R_MIPS_HI16",		/* name */
    999  1.1     skrll 	 FALSE,			/* partial_inplace */
   1000  1.1     skrll 	 0,			/* src_mask */
   1001  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1002  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1003  1.1     skrll 
   1004  1.1     skrll   /* Low 16 bits of symbol value.  */
   1005  1.1     skrll   HOWTO (R_MIPS_LO16,		/* type */
   1006  1.1     skrll 	 0,			/* rightshift */
   1007  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1008  1.1     skrll 	 16,			/* bitsize */
   1009  1.1     skrll 	 FALSE,			/* pc_relative */
   1010  1.1     skrll 	 0,			/* bitpos */
   1011  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1012  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1013  1.1     skrll 	 "R_MIPS_LO16",		/* name */
   1014  1.1     skrll 	 FALSE,			/* partial_inplace */
   1015  1.1     skrll 	 0,			/* src_mask */
   1016  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1017  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1018  1.1     skrll 
   1019  1.1     skrll   /* GP relative reference.  */
   1020  1.1     skrll   HOWTO (R_MIPS_GPREL16,	/* type */
   1021  1.1     skrll 	 0,			/* rightshift */
   1022  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1023  1.1     skrll 	 16,			/* bitsize */
   1024  1.1     skrll 	 FALSE,			/* pc_relative */
   1025  1.1     skrll 	 0,			/* bitpos */
   1026  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1027  1.1     skrll 	 mips_elf64_gprel16_reloc, /* special_function */
   1028  1.1     skrll 	 "R_MIPS_GPREL16",	/* name */
   1029  1.1     skrll 	 FALSE,			/* partial_inplace */
   1030  1.1     skrll 	 0,			/* src_mask */
   1031  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1032  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1033  1.1     skrll 
   1034  1.1     skrll   /* Reference to literal section.  */
   1035  1.1     skrll   HOWTO (R_MIPS_LITERAL,	/* type */
   1036  1.1     skrll 	 0,			/* rightshift */
   1037  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1038  1.1     skrll 	 16,			/* bitsize */
   1039  1.1     skrll 	 FALSE,			/* pc_relative */
   1040  1.1     skrll 	 0,			/* bitpos */
   1041  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1042  1.1     skrll 	 mips_elf64_literal_reloc, /* special_function */
   1043  1.1     skrll 	 "R_MIPS_LITERAL",	/* name */
   1044  1.1     skrll 	 FALSE,			/* partial_inplace */
   1045  1.1     skrll 	 0,			/* src_mask */
   1046  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1047  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1048  1.1     skrll 
   1049  1.1     skrll   /* Reference to global offset table.  */
   1050  1.1     skrll   HOWTO (R_MIPS_GOT16,		/* type */
   1051  1.1     skrll 	 0,			/* rightshift */
   1052  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1053  1.1     skrll 	 16,			/* bitsize */
   1054  1.1     skrll 	 FALSE,			/* pc_relative */
   1055  1.1     skrll 	 0,			/* bitpos */
   1056  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1057  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1058  1.1     skrll 	 "R_MIPS_GOT16",	/* name */
   1059  1.1     skrll 	 FALSE,			/* partial_inplace */
   1060  1.1     skrll 	 0,			/* src_mask */
   1061  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1062  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1063  1.1     skrll 
   1064  1.1     skrll   /* 16 bit PC relative reference.  Note that the ABI document has a typo
   1065  1.1     skrll      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
   1066  1.1     skrll      We do the right thing here.  */
   1067  1.1     skrll   HOWTO (R_MIPS_PC16,		/* type */
   1068  1.1     skrll 	 2,			/* rightshift */
   1069  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1070  1.1     skrll 	 16,			/* bitsize */
   1071  1.1     skrll 	 TRUE,			/* pc_relative */
   1072  1.1     skrll 	 0,			/* bitpos */
   1073  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1074  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1075  1.1     skrll 	 "R_MIPS_PC16",		/* name */
   1076  1.1     skrll 	 FALSE,			/* partial_inplace */
   1077  1.1     skrll 	 0,			/* src_mask */
   1078  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1079  1.1     skrll 	 TRUE),			/* pcrel_offset */
   1080  1.1     skrll 
   1081  1.1     skrll   /* 16 bit call through global offset table.  */
   1082  1.1     skrll   HOWTO (R_MIPS_CALL16,		/* type */
   1083  1.1     skrll 	 0,			/* rightshift */
   1084  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1085  1.1     skrll 	 16,			/* bitsize */
   1086  1.1     skrll 	 FALSE,			/* pc_relative */
   1087  1.1     skrll 	 0,			/* bitpos */
   1088  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1089  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1090  1.1     skrll 	 "R_MIPS_CALL16",	/* name */
   1091  1.1     skrll 	 FALSE,			/* partial_inplace */
   1092  1.1     skrll 	 0,			/* src_mask */
   1093  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1094  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1095  1.1     skrll 
   1096  1.1     skrll   /* 32 bit GP relative reference.  */
   1097  1.1     skrll   HOWTO (R_MIPS_GPREL32,	/* type */
   1098  1.1     skrll 	 0,			/* rightshift */
   1099  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1100  1.1     skrll 	 32,			/* bitsize */
   1101  1.1     skrll 	 FALSE,			/* pc_relative */
   1102  1.1     skrll 	 0,			/* bitpos */
   1103  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1104  1.1     skrll 	 mips_elf64_gprel32_reloc, /* special_function */
   1105  1.1     skrll 	 "R_MIPS_GPREL32",	/* name */
   1106  1.1     skrll 	 FALSE,			/* partial_inplace */
   1107  1.1     skrll 	 0,			/* src_mask */
   1108  1.1     skrll 	 0xffffffff,		/* dst_mask */
   1109  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1110  1.1     skrll 
   1111  1.1     skrll   EMPTY_HOWTO (13),
   1112  1.1     skrll   EMPTY_HOWTO (14),
   1113  1.1     skrll   EMPTY_HOWTO (15),
   1114  1.1     skrll 
   1115  1.1     skrll   /* A 5 bit shift field.  */
   1116  1.1     skrll   HOWTO (R_MIPS_SHIFT5,		/* type */
   1117  1.1     skrll 	 0,			/* rightshift */
   1118  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1119  1.1     skrll 	 5,			/* bitsize */
   1120  1.1     skrll 	 FALSE,			/* pc_relative */
   1121  1.1     skrll 	 6,			/* bitpos */
   1122  1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   1123  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1124  1.1     skrll 	 "R_MIPS_SHIFT5",	/* name */
   1125  1.1     skrll 	 FALSE,			/* partial_inplace */
   1126  1.1     skrll 	 0,			/* src_mask */
   1127  1.1     skrll 	 0x000007c0,		/* dst_mask */
   1128  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1129  1.1     skrll 
   1130  1.1     skrll   /* A 6 bit shift field.  */
   1131  1.1     skrll   HOWTO (R_MIPS_SHIFT6,		/* type */
   1132  1.1     skrll 	 0,			/* rightshift */
   1133  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1134  1.1     skrll 	 6,			/* bitsize */
   1135  1.1     skrll 	 FALSE,			/* pc_relative */
   1136  1.1     skrll 	 6,			/* bitpos */
   1137  1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   1138  1.1     skrll 	 mips_elf64_shift6_reloc, /* special_function */
   1139  1.1     skrll 	 "R_MIPS_SHIFT6",	/* name */
   1140  1.1     skrll 	 FALSE,			/* partial_inplace */
   1141  1.1     skrll 	 0,			/* src_mask */
   1142  1.1     skrll 	 0x000007c4,		/* dst_mask */
   1143  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1144  1.1     skrll 
   1145  1.1     skrll   /* 64 bit relocation.  */
   1146  1.1     skrll   HOWTO (R_MIPS_64,		/* type */
   1147  1.1     skrll 	 0,			/* rightshift */
   1148  1.1     skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1149  1.1     skrll 	 64,			/* bitsize */
   1150  1.1     skrll 	 FALSE,			/* pc_relative */
   1151  1.1     skrll 	 0,			/* bitpos */
   1152  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1153  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1154  1.1     skrll 	 "R_MIPS_64",		/* name */
   1155  1.1     skrll 	 FALSE,			/* partial_inplace */
   1156  1.1     skrll 	 0,			/* src_mask */
   1157  1.1     skrll 	 MINUS_ONE,		/* dst_mask */
   1158  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1159  1.1     skrll 
   1160  1.1     skrll   /* Displacement in the global offset table.  */
   1161  1.1     skrll   HOWTO (R_MIPS_GOT_DISP,	/* type */
   1162  1.1     skrll 	 0,			/* rightshift */
   1163  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1164  1.1     skrll 	 16,			/* bitsize */
   1165  1.1     skrll 	 FALSE,			/* pc_relative */
   1166  1.1     skrll 	 0,			/* bitpos */
   1167  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1168  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1169  1.1     skrll 	 "R_MIPS_GOT_DISP",	/* name */
   1170  1.1     skrll 	 FALSE,			/* partial_inplace */
   1171  1.1     skrll 	 0,			/* src_mask */
   1172  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1173  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1174  1.1     skrll 
   1175  1.1     skrll   /* Displacement to page pointer in the global offset table.  */
   1176  1.1     skrll   HOWTO (R_MIPS_GOT_PAGE,	/* type */
   1177  1.1     skrll 	 0,			/* rightshift */
   1178  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1179  1.1     skrll 	 16,			/* bitsize */
   1180  1.1     skrll 	 FALSE,			/* pc_relative */
   1181  1.1     skrll 	 0,			/* bitpos */
   1182  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1183  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1184  1.1     skrll 	 "R_MIPS_GOT_PAGE",	/* name */
   1185  1.1     skrll 	 FALSE,			/* partial_inplace */
   1186  1.1     skrll 	 0,			/* src_mask */
   1187  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1188  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1189  1.1     skrll 
   1190  1.1     skrll   /* Offset from page pointer in the global offset table.  */
   1191  1.1     skrll   HOWTO (R_MIPS_GOT_OFST,	/* type */
   1192  1.1     skrll 	 0,			/* rightshift */
   1193  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1194  1.1     skrll 	 16,			/* bitsize */
   1195  1.1     skrll 	 FALSE,			/* pc_relative */
   1196  1.1     skrll 	 0,			/* bitpos */
   1197  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1198  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1199  1.1     skrll 	 "R_MIPS_GOT_OFST",	/* name */
   1200  1.1     skrll 	 FALSE,			/* partial_inplace */
   1201  1.1     skrll 	 0,			/* src_mask */
   1202  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1203  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1204  1.1     skrll 
   1205  1.1     skrll   /* High 16 bits of displacement in global offset table.  */
   1206  1.1     skrll   HOWTO (R_MIPS_GOT_HI16,	/* type */
   1207  1.1     skrll 	 0,			/* rightshift */
   1208  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1209  1.1     skrll 	 16,			/* bitsize */
   1210  1.1     skrll 	 FALSE,			/* pc_relative */
   1211  1.1     skrll 	 0,			/* bitpos */
   1212  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1213  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1214  1.1     skrll 	 "R_MIPS_GOT_HI16",	/* name */
   1215  1.1     skrll 	 FALSE,			/* partial_inplace */
   1216  1.1     skrll 	 0,			/* src_mask */
   1217  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1218  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1219  1.1     skrll 
   1220  1.1     skrll   /* Low 16 bits of displacement in global offset table.  */
   1221  1.1     skrll   HOWTO (R_MIPS_GOT_LO16,	/* type */
   1222  1.1     skrll 	 0,			/* rightshift */
   1223  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1224  1.1     skrll 	 16,			/* bitsize */
   1225  1.1     skrll 	 FALSE,			/* pc_relative */
   1226  1.1     skrll 	 0,			/* bitpos */
   1227  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1228  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1229  1.1     skrll 	 "R_MIPS_GOT_LO16",	/* name */
   1230  1.1     skrll 	 FALSE,			/* partial_inplace */
   1231  1.1     skrll 	 0,			/* src_mask */
   1232  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1233  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1234  1.1     skrll 
   1235  1.1     skrll   /* 64 bit subtraction.  */
   1236  1.1     skrll   HOWTO (R_MIPS_SUB,		/* type */
   1237  1.1     skrll 	 0,			/* rightshift */
   1238  1.1     skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1239  1.1     skrll 	 64,			/* bitsize */
   1240  1.1     skrll 	 FALSE,			/* pc_relative */
   1241  1.1     skrll 	 0,			/* bitpos */
   1242  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1243  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1244  1.1     skrll 	 "R_MIPS_SUB",		/* name */
   1245  1.1     skrll 	 FALSE,			/* partial_inplace */
   1246  1.1     skrll 	 0,			/* src_mask */
   1247  1.1     skrll 	 MINUS_ONE,		/* dst_mask */
   1248  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1249  1.1     skrll 
   1250  1.1     skrll   /* Insert the addend as an instruction.  */
   1251  1.1     skrll   /* FIXME: Not handled correctly.  */
   1252  1.1     skrll   HOWTO (R_MIPS_INSERT_A,	/* type */
   1253  1.1     skrll 	 0,			/* rightshift */
   1254  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1255  1.1     skrll 	 32,			/* bitsize */
   1256  1.1     skrll 	 FALSE,			/* pc_relative */
   1257  1.1     skrll 	 0,			/* bitpos */
   1258  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1259  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1260  1.1     skrll 	 "R_MIPS_INSERT_A",	/* name */
   1261  1.1     skrll 	 FALSE,			/* partial_inplace */
   1262  1.1     skrll 	 0,			/* src_mask */
   1263  1.1     skrll 	 0xffffffff,		/* dst_mask */
   1264  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1265  1.1     skrll 
   1266  1.1     skrll   /* Insert the addend as an instruction, and change all relocations
   1267  1.1     skrll      to refer to the old instruction at the address.  */
   1268  1.1     skrll   /* FIXME: Not handled correctly.  */
   1269  1.1     skrll   HOWTO (R_MIPS_INSERT_B,	/* type */
   1270  1.1     skrll 	 0,			/* rightshift */
   1271  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1272  1.1     skrll 	 32,			/* bitsize */
   1273  1.1     skrll 	 FALSE,			/* pc_relative */
   1274  1.1     skrll 	 0,			/* bitpos */
   1275  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1276  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1277  1.1     skrll 	 "R_MIPS_INSERT_B",	/* name */
   1278  1.1     skrll 	 FALSE,			/* partial_inplace */
   1279  1.1     skrll 	 0,			/* src_mask */
   1280  1.1     skrll 	 0xffffffff,		/* dst_mask */
   1281  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1282  1.1     skrll 
   1283  1.1     skrll   /* Delete a 32 bit instruction.  */
   1284  1.1     skrll   /* FIXME: Not handled correctly.  */
   1285  1.1     skrll   HOWTO (R_MIPS_DELETE,		/* type */
   1286  1.1     skrll 	 0,			/* rightshift */
   1287  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1288  1.1     skrll 	 32,			/* bitsize */
   1289  1.1     skrll 	 FALSE,			/* pc_relative */
   1290  1.1     skrll 	 0,			/* bitpos */
   1291  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1292  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1293  1.1     skrll 	 "R_MIPS_DELETE",	/* name */
   1294  1.1     skrll 	 FALSE,			/* partial_inplace */
   1295  1.1     skrll 	 0,			/* src_mask */
   1296  1.1     skrll 	 0xffffffff,		/* dst_mask */
   1297  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1298  1.1     skrll 
   1299  1.1     skrll   /* Get the higher value of a 64 bit addend.  */
   1300  1.1     skrll   HOWTO (R_MIPS_HIGHER,		/* type */
   1301  1.1     skrll 	 0,			/* rightshift */
   1302  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1303  1.1     skrll 	 16,			/* bitsize */
   1304  1.1     skrll 	 FALSE,			/* pc_relative */
   1305  1.1     skrll 	 0,			/* bitpos */
   1306  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1307  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1308  1.1     skrll 	 "R_MIPS_HIGHER",	/* name */
   1309  1.1     skrll 	 FALSE,			/* partial_inplace */
   1310  1.1     skrll 	 0,			/* src_mask */
   1311  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1312  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1313  1.1     skrll 
   1314  1.1     skrll   /* Get the highest value of a 64 bit addend.  */
   1315  1.1     skrll   HOWTO (R_MIPS_HIGHEST,	/* type */
   1316  1.1     skrll 	 0,			/* rightshift */
   1317  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1318  1.1     skrll 	 16,			/* 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_HIGHEST",	/* name */
   1324  1.1     skrll 	 FALSE,			/* partial_inplace */
   1325  1.1     skrll 	 0,			/* src_mask */
   1326  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1327  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1328  1.1     skrll 
   1329  1.1     skrll   /* High 16 bits of displacement in global offset table.  */
   1330  1.1     skrll   HOWTO (R_MIPS_CALL_HI16,	/* type */
   1331  1.1     skrll 	 0,			/* rightshift */
   1332  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1333  1.1     skrll 	 16,			/* bitsize */
   1334  1.1     skrll 	 FALSE,			/* pc_relative */
   1335  1.1     skrll 	 0,			/* bitpos */
   1336  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1337  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1338  1.1     skrll 	 "R_MIPS_CALL_HI16",	/* name */
   1339  1.1     skrll 	 FALSE,			/* partial_inplace */
   1340  1.1     skrll 	 0,			/* src_mask */
   1341  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1342  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1343  1.1     skrll 
   1344  1.1     skrll   /* Low 16 bits of displacement in global offset table.  */
   1345  1.1     skrll   HOWTO (R_MIPS_CALL_LO16,	/* type */
   1346  1.1     skrll 	 0,			/* rightshift */
   1347  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1348  1.1     skrll 	 16,			/* bitsize */
   1349  1.1     skrll 	 FALSE,			/* pc_relative */
   1350  1.1     skrll 	 0,			/* bitpos */
   1351  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1352  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1353  1.1     skrll 	 "R_MIPS_CALL_LO16",	/* name */
   1354  1.1     skrll 	 FALSE,			/* partial_inplace */
   1355  1.1     skrll 	 0,			/* src_mask */
   1356  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1357  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1358  1.1     skrll 
   1359  1.1     skrll   /* Section displacement, used by an associated event location section.  */
   1360  1.1     skrll   HOWTO (R_MIPS_SCN_DISP,	/* type */
   1361  1.1     skrll 	 0,			/* rightshift */
   1362  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1363  1.1     skrll 	 32,			/* bitsize */
   1364  1.1     skrll 	 FALSE,			/* pc_relative */
   1365  1.1     skrll 	 0,			/* bitpos */
   1366  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1367  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1368  1.1     skrll 	 "R_MIPS_SCN_DISP",	/* name */
   1369  1.1     skrll 	 FALSE,			/* partial_inplace */
   1370  1.1     skrll 	 0,			/* src_mask */
   1371  1.1     skrll 	 0xffffffff,		/* dst_mask */
   1372  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1373  1.1     skrll 
   1374  1.1     skrll   HOWTO (R_MIPS_REL16,		/* type */
   1375  1.1     skrll 	 0,			/* rightshift */
   1376  1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1377  1.1     skrll 	 16,			/* bitsize */
   1378  1.1     skrll 	 FALSE,			/* pc_relative */
   1379  1.1     skrll 	 0,			/* bitpos */
   1380  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   1381  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1382  1.1     skrll 	 "R_MIPS_REL16",	/* name */
   1383  1.1     skrll 	 FALSE,			/* partial_inplace */
   1384  1.1     skrll 	 0,			/* src_mask */
   1385  1.1     skrll 	 0xffff,		/* dst_mask */
   1386  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1387  1.1     skrll 
   1388  1.1     skrll   /* These two are obsolete.  */
   1389  1.1     skrll   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
   1390  1.1     skrll   EMPTY_HOWTO (R_MIPS_PJUMP),
   1391  1.1     skrll 
   1392  1.1     skrll   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
   1393  1.1     skrll      It must be used for multigot GOT's (and only there).  */
   1394  1.1     skrll   HOWTO (R_MIPS_RELGOT,		/* type */
   1395  1.1     skrll 	 0,			/* rightshift */
   1396  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1397  1.1     skrll 	 32,			/* bitsize */
   1398  1.1     skrll 	 FALSE,			/* pc_relative */
   1399  1.1     skrll 	 0,			/* bitpos */
   1400  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1401  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1402  1.1     skrll 	 "R_MIPS_RELGOT",	/* name */
   1403  1.1     skrll 	 FALSE,			/* partial_inplace */
   1404  1.1     skrll 	 0,			/* src_mask */
   1405  1.1     skrll 	 0xffffffff,		/* dst_mask */
   1406  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1407  1.1     skrll 
   1408  1.1     skrll   /* Protected jump conversion.  This is an optimization hint.  No
   1409  1.1     skrll      relocation is required for correctness.  */
   1410  1.1     skrll   HOWTO (R_MIPS_JALR,		/* type */
   1411  1.1     skrll 	 0,			/* rightshift */
   1412  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1413  1.1     skrll 	 32,			/* bitsize */
   1414  1.1     skrll 	 FALSE,			/* pc_relative */
   1415  1.1     skrll 	 0,			/* bitpos */
   1416  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1417  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   1418  1.1     skrll 	 "R_MIPS_JALR",		/* name */
   1419  1.1     skrll 	 FALSE,			/* partial_inplace */
   1420  1.1     skrll 	 0,			/* src_mask */
   1421  1.1     skrll 	 0x00000000,		/* dst_mask */
   1422  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1423  1.1     skrll 
   1424  1.1     skrll   /* TLS relocations.  */
   1425  1.1     skrll   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
   1426  1.3  christos   EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
   1427  1.3  christos 
   1428  1.3  christos   HOWTO (R_MIPS_TLS_DTPMOD64,	/* type */
   1429  1.3  christos 	 0,			/* rightshift */
   1430  1.3  christos 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1431  1.3  christos 	 64,			/* bitsize */
   1432  1.3  christos 	 FALSE,			/* pc_relative */
   1433  1.3  christos 	 0,			/* bitpos */
   1434  1.3  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1435  1.3  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1436  1.3  christos 	 "R_MIPS_TLS_DTPMOD64", /* name */
   1437  1.4  christos 	 FALSE,			/* partial_inplace */
   1438  1.3  christos 	 0,			/* src_mask */
   1439  1.3  christos 	 MINUS_ONE,		/* dst_mask */
   1440  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1441  1.1     skrll 
   1442  1.1     skrll   HOWTO (R_MIPS_TLS_DTPREL64,	/* type */
   1443  1.1     skrll 	 0,			/* rightshift */
   1444  1.1     skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1445  1.1     skrll 	 64,			/* bitsize */
   1446  1.1     skrll 	 FALSE,			/* pc_relative */
   1447  1.1     skrll 	 0,			/* bitpos */
   1448  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1449  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1450  1.3  christos 	 "R_MIPS_TLS_DTPREL64",	/* name */
   1451  1.4  christos 	 FALSE,			/* partial_inplace */
   1452  1.1     skrll 	 0,			/* src_mask */
   1453  1.1     skrll 	 MINUS_ONE,		/* dst_mask */
   1454  1.1     skrll 	 FALSE),		/* pcrel_offset */
   1455  1.1     skrll 
   1456  1.1     skrll   /* TLS general dynamic variable reference.  */
   1457  1.4  christos   HOWTO (R_MIPS_TLS_GD,		/* type */
   1458  1.4  christos 	 0,			/* rightshift */
   1459  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1460  1.4  christos 	 16,			/* bitsize */
   1461  1.4  christos 	 FALSE,			/* pc_relative */
   1462  1.4  christos 	 0,			/* bitpos */
   1463  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1464  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1465  1.4  christos 	 "R_MIPS_TLS_GD",	/* name */
   1466  1.4  christos 	 FALSE,			/* partial_inplace */
   1467  1.4  christos 	 0,			/* src_mask */
   1468  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1469  1.4  christos 	 FALSE),		/* pcrel_offset */
   1470  1.4  christos 
   1471  1.4  christos   /* TLS local dynamic variable reference.  */
   1472  1.4  christos   HOWTO (R_MIPS_TLS_LDM,	/* type */
   1473  1.4  christos 	 0,			/* rightshift */
   1474  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1475  1.4  christos 	 16,			/* bitsize */
   1476  1.4  christos 	 FALSE,			/* pc_relative */
   1477  1.4  christos 	 0,			/* bitpos */
   1478  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1479  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1480  1.4  christos 	 "R_MIPS_TLS_LDM",	/* name */
   1481  1.4  christos 	 FALSE,			/* partial_inplace */
   1482  1.4  christos 	 0,			/* src_mask */
   1483  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1484  1.4  christos 	 FALSE),		/* pcrel_offset */
   1485  1.4  christos 
   1486  1.4  christos   /* TLS local dynamic offset.  */
   1487  1.4  christos   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
   1488  1.4  christos 	 0,			/* rightshift */
   1489  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1490  1.4  christos 	 16,			/* bitsize */
   1491  1.4  christos 	 FALSE,			/* pc_relative */
   1492  1.4  christos 	 0,			/* bitpos */
   1493  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1494  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1495  1.4  christos 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
   1496  1.4  christos 	 FALSE,			/* partial_inplace */
   1497  1.4  christos 	 0,			/* src_mask */
   1498  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1499  1.4  christos 	 FALSE),		/* pcrel_offset */
   1500  1.4  christos 
   1501  1.4  christos   /* TLS local dynamic offset.  */
   1502  1.4  christos   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
   1503  1.4  christos 	 0,			/* rightshift */
   1504  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1505  1.4  christos 	 16,			/* bitsize */
   1506  1.4  christos 	 FALSE,			/* pc_relative */
   1507  1.4  christos 	 0,			/* bitpos */
   1508  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1509  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1510  1.4  christos 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
   1511  1.4  christos 	 FALSE,			/* partial_inplace */
   1512  1.4  christos 	 0,			/* src_mask */
   1513  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1514  1.4  christos 	 FALSE),		/* pcrel_offset */
   1515  1.4  christos 
   1516  1.4  christos   /* TLS thread pointer offset.  */
   1517  1.4  christos   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
   1518  1.4  christos 	 0,			/* rightshift */
   1519  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1520  1.4  christos 	 16,			/* bitsize */
   1521  1.4  christos 	 FALSE,			/* pc_relative */
   1522  1.4  christos 	 0,			/* bitpos */
   1523  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1524  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1525  1.4  christos 	 "R_MIPS_TLS_GOTTPREL",	/* name */
   1526  1.4  christos 	 FALSE,			/* partial_inplace */
   1527  1.4  christos 	 0,			/* src_mask */
   1528  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1529  1.4  christos 	 FALSE),		/* pcrel_offset */
   1530  1.4  christos 
   1531  1.4  christos   /* TLS IE dynamic relocations.  */
   1532  1.4  christos   EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
   1533  1.4  christos 
   1534  1.4  christos   HOWTO (R_MIPS_TLS_TPREL64,	/* type */
   1535  1.4  christos 	 0,			/* rightshift */
   1536  1.4  christos 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1537  1.4  christos 	 64,			/* bitsize */
   1538  1.4  christos 	 FALSE,			/* pc_relative */
   1539  1.4  christos 	 0,			/* bitpos */
   1540  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1541  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1542  1.4  christos 	 "R_MIPS_TLS_TPREL64",	/* name */
   1543  1.4  christos 	 FALSE,			/* partial_inplace */
   1544  1.4  christos 	 0,			/* src_mask */
   1545  1.4  christos 	 MINUS_ONE,		/* dst_mask */
   1546  1.4  christos 	 FALSE),		/* pcrel_offset */
   1547  1.4  christos 
   1548  1.4  christos   /* TLS thread pointer offset.  */
   1549  1.4  christos   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
   1550  1.4  christos 	 0,			/* rightshift */
   1551  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1552  1.4  christos 	 16,			/* bitsize */
   1553  1.4  christos 	 FALSE,			/* pc_relative */
   1554  1.4  christos 	 0,			/* bitpos */
   1555  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1556  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1557  1.4  christos 	 "R_MIPS_TLS_TPREL_HI16", /* name */
   1558  1.4  christos 	 FALSE,			/* partial_inplace */
   1559  1.4  christos 	 0,			/* src_mask */
   1560  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1561  1.4  christos 	 FALSE),		/* pcrel_offset */
   1562  1.4  christos 
   1563  1.4  christos   /* TLS thread pointer offset.  */
   1564  1.4  christos   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
   1565  1.4  christos 	 0,			/* rightshift */
   1566  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1567  1.4  christos 	 16,			/* bitsize */
   1568  1.4  christos 	 FALSE,			/* pc_relative */
   1569  1.4  christos 	 0,			/* bitpos */
   1570  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1571  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1572  1.4  christos 	 "R_MIPS_TLS_TPREL_LO16", /* name */
   1573  1.4  christos 	 FALSE,			/* partial_inplace */
   1574  1.4  christos 	 0,			/* src_mask */
   1575  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1576  1.4  christos 	 FALSE),		/* pcrel_offset */
   1577  1.4  christos 
   1578  1.4  christos   /* 32 bit relocation with no addend.  */
   1579  1.4  christos   HOWTO (R_MIPS_GLOB_DAT,	/* type */
   1580  1.4  christos 	 0,			/* rightshift */
   1581  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1582  1.4  christos 	 32,			/* bitsize */
   1583  1.4  christos 	 FALSE,			/* pc_relative */
   1584  1.4  christos 	 0,			/* bitpos */
   1585  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1586  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1587  1.4  christos 	 "R_MIPS_GLOB_DAT",	/* name */
   1588  1.4  christos 	 FALSE,			/* partial_inplace */
   1589  1.4  christos 	 0x0,			/* src_mask */
   1590  1.4  christos 	 0xffffffff,		/* dst_mask */
   1591  1.6  christos 	 FALSE),		/* pcrel_offset */
   1592  1.6  christos 
   1593  1.6  christos   EMPTY_HOWTO (52),
   1594  1.6  christos   EMPTY_HOWTO (53),
   1595  1.6  christos   EMPTY_HOWTO (54),
   1596  1.6  christos   EMPTY_HOWTO (55),
   1597  1.6  christos   EMPTY_HOWTO (56),
   1598  1.6  christos   EMPTY_HOWTO (57),
   1599  1.6  christos   EMPTY_HOWTO (58),
   1600  1.6  christos   EMPTY_HOWTO (59),
   1601  1.6  christos 
   1602  1.6  christos   HOWTO (R_MIPS_PC21_S2,	/* type */
   1603  1.6  christos 	 2,			/* rightshift */
   1604  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1605  1.6  christos 	 21,			/* bitsize */
   1606  1.6  christos 	 TRUE,			/* pc_relative */
   1607  1.6  christos 	 0,			/* bitpos */
   1608  1.6  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1609  1.6  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1610  1.6  christos 	 "R_MIPS_PC21_S2",	/* name */
   1611  1.6  christos 	 FALSE,			/* partial_inplace */
   1612  1.6  christos 	 0,			/* src_mask */
   1613  1.6  christos 	 0x001fffff,		/* dst_mask */
   1614  1.6  christos 	 TRUE),			/* pcrel_offset */
   1615  1.6  christos 
   1616  1.6  christos   HOWTO (R_MIPS_PC26_S2,	/* type */
   1617  1.6  christos 	 2,			/* rightshift */
   1618  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1619  1.6  christos 	 26,			/* bitsize */
   1620  1.6  christos 	 TRUE,			/* pc_relative */
   1621  1.6  christos 	 0,			/* bitpos */
   1622  1.6  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1623  1.6  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1624  1.6  christos 	 "R_MIPS_PC26_S2",	/* name */
   1625  1.6  christos 	 FALSE,			/* partial_inplace */
   1626  1.6  christos 	 0,			/* src_mask */
   1627  1.6  christos 	 0x03ffffff,		/* dst_mask */
   1628  1.6  christos 	 TRUE),			/* pcrel_offset */
   1629  1.6  christos 
   1630  1.6  christos   HOWTO (R_MIPS_PC18_S3,	/* type */
   1631  1.6  christos 	 3,			/* rightshift */
   1632  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1633  1.6  christos 	 18,			/* bitsize */
   1634  1.6  christos 	 TRUE,			/* pc_relative */
   1635  1.6  christos 	 0,			/* bitpos */
   1636  1.6  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1637  1.6  christos 	 _bfd_mips_elf_generic_reloc,   /* special_function */
   1638  1.6  christos 	 "R_MIPS_PC18_S3",	/* name */
   1639  1.6  christos 	 FALSE,			/* partial_inplace */
   1640  1.6  christos 	 0,			/* src_mask */
   1641  1.6  christos 	 0x0003ffff,		/* dst_mask */
   1642  1.6  christos 	 TRUE),			/* pcrel_offset */
   1643  1.6  christos 
   1644  1.6  christos   HOWTO (R_MIPS_PC19_S2,	/* type */
   1645  1.6  christos 	 2,			/* rightshift */
   1646  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1647  1.6  christos 	 19,			/* bitsize */
   1648  1.6  christos 	 TRUE,			/* pc_relative */
   1649  1.6  christos 	 0,			/* bitpos */
   1650  1.6  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1651  1.6  christos 	 _bfd_mips_elf_generic_reloc,   /* special_function */
   1652  1.6  christos 	 "R_MIPS_PC19_S2",	/* name */
   1653  1.6  christos 	 FALSE,			/* partial_inplace */
   1654  1.6  christos 	 0,			/* src_mask */
   1655  1.6  christos 	 0x0007ffff,		/* dst_mask */
   1656  1.6  christos 	 TRUE),			/* pcrel_offset */
   1657  1.6  christos 
   1658  1.6  christos   HOWTO (R_MIPS_PCHI16,		/* type */
   1659  1.6  christos 	 16,			/* rightshift */
   1660  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1661  1.6  christos 	 16,			/* bitsize */
   1662  1.6  christos 	 TRUE,			/* pc_relative */
   1663  1.6  christos 	 0,			/* bitpos */
   1664  1.6  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1665  1.6  christos 	 _bfd_mips_elf_generic_reloc,   /* special_function */
   1666  1.6  christos 	 "R_MIPS_PCHI16",	/* name */
   1667  1.6  christos 	 FALSE,			/* partial_inplace */
   1668  1.6  christos 	 0,			/* src_mask */
   1669  1.6  christos 	 0x0000ffff,		/* dst_mask */
   1670  1.6  christos 	 TRUE),			/* pcrel_offset */
   1671  1.6  christos 
   1672  1.6  christos   HOWTO (R_MIPS_PCLO16,		/* type */
   1673  1.6  christos 	 0,			/* rightshift */
   1674  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1675  1.6  christos 	 16,			/* bitsize */
   1676  1.6  christos 	 TRUE,			/* pc_relative */
   1677  1.6  christos 	 0,			/* bitpos */
   1678  1.6  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1679  1.6  christos 	 _bfd_mips_elf_generic_reloc,   /* special_function */
   1680  1.6  christos 	 "R_MIPS_PCLO16",	/* name */
   1681  1.6  christos 	 FALSE,			/* partial_inplace */
   1682  1.6  christos 	 0,			/* src_mask */
   1683  1.6  christos 	 0x0000ffff,		/* dst_mask */
   1684  1.6  christos 	 TRUE),			/* pcrel_offset */
   1685  1.4  christos 
   1686  1.4  christos };
   1687  1.4  christos 
   1688  1.4  christos static reloc_howto_type mips16_elf64_howto_table_rel[] =
   1689  1.4  christos {
   1690  1.4  christos   /* The reloc used for the mips16 jump instruction.  */
   1691  1.4  christos   HOWTO (R_MIPS16_26,		/* type */
   1692  1.4  christos 	 2,			/* rightshift */
   1693  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1694  1.4  christos 	 26,			/* bitsize */
   1695  1.4  christos 	 FALSE,			/* pc_relative */
   1696  1.4  christos 	 0,			/* bitpos */
   1697  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1698  1.4  christos 	 			/* This needs complex overflow
   1699  1.4  christos 				   detection, because the upper four
   1700  1.4  christos 				   bits must match the PC.  */
   1701  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1702  1.4  christos 	 "R_MIPS16_26",		/* name */
   1703  1.4  christos 	 TRUE,			/* partial_inplace */
   1704  1.4  christos 	 0x3ffffff,		/* src_mask */
   1705  1.4  christos 	 0x3ffffff,		/* dst_mask */
   1706  1.4  christos 	 FALSE),		/* pcrel_offset */
   1707  1.4  christos 
   1708  1.4  christos   /* The reloc used for the mips16 gprel instruction.  */
   1709  1.4  christos   HOWTO (R_MIPS16_GPREL,	/* type */
   1710  1.4  christos 	 0,			/* rightshift */
   1711  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1712  1.4  christos 	 16,			/* bitsize */
   1713  1.4  christos 	 FALSE,			/* pc_relative */
   1714  1.4  christos 	 0,			/* bitpos */
   1715  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1716  1.4  christos 	 mips16_gprel_reloc,	/* special_function */
   1717  1.4  christos 	 "R_MIPS16_GPREL",	/* name */
   1718  1.4  christos 	 TRUE,			/* partial_inplace */
   1719  1.4  christos 	 0x0000ffff,		/* src_mask */
   1720  1.4  christos 	 0x0000ffff,	        /* dst_mask */
   1721  1.4  christos 	 FALSE),		/* pcrel_offset */
   1722  1.4  christos 
   1723  1.4  christos   /* A MIPS16 reference to the global offset table.  */
   1724  1.4  christos   HOWTO (R_MIPS16_GOT16,	/* type */
   1725  1.4  christos 	 0,			/* rightshift */
   1726  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1727  1.4  christos 	 16,			/* bitsize */
   1728  1.4  christos 	 FALSE,			/* pc_relative */
   1729  1.4  christos 	 0,			/* bitpos */
   1730  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1731  1.4  christos 	 _bfd_mips_elf_got16_reloc, /* special_function */
   1732  1.4  christos 	 "R_MIPS16_GOT16",	/* name */
   1733  1.4  christos 	 TRUE,			/* partial_inplace */
   1734  1.4  christos 	 0x0000ffff,		/* src_mask */
   1735  1.4  christos 	 0x0000ffff,	        /* dst_mask */
   1736  1.4  christos 	 FALSE),		/* pcrel_offset */
   1737  1.4  christos 
   1738  1.4  christos   /* A MIPS16 call through the global offset table.  */
   1739  1.4  christos   HOWTO (R_MIPS16_CALL16,	/* type */
   1740  1.4  christos 	 0,			/* rightshift */
   1741  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1742  1.4  christos 	 16,			/* bitsize */
   1743  1.4  christos 	 FALSE,			/* pc_relative */
   1744  1.4  christos 	 0,			/* bitpos */
   1745  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1746  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1747  1.4  christos 	 "R_MIPS16_CALL16",	/* name */
   1748  1.4  christos 	 TRUE,			/* partial_inplace */
   1749  1.4  christos 	 0x0000ffff,		/* src_mask */
   1750  1.4  christos 	 0x0000ffff,	        /* dst_mask */
   1751  1.4  christos 	 FALSE),		/* pcrel_offset */
   1752  1.4  christos 
   1753  1.4  christos   /* MIPS16 high 16 bits of symbol value.  */
   1754  1.4  christos   HOWTO (R_MIPS16_HI16,		/* type */
   1755  1.4  christos 	 16,			/* rightshift */
   1756  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1757  1.4  christos 	 16,			/* bitsize */
   1758  1.4  christos 	 FALSE,			/* pc_relative */
   1759  1.4  christos 	 0,			/* bitpos */
   1760  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1761  1.4  christos 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   1762  1.4  christos 	 "R_MIPS16_HI16",	/* name */
   1763  1.4  christos 	 TRUE,			/* partial_inplace */
   1764  1.4  christos 	 0x0000ffff,		/* src_mask */
   1765  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1766  1.4  christos 	 FALSE),		/* pcrel_offset */
   1767  1.4  christos 
   1768  1.4  christos   /* MIPS16 low 16 bits of symbol value.  */
   1769  1.4  christos   HOWTO (R_MIPS16_LO16,		/* type */
   1770  1.4  christos 	 0,			/* rightshift */
   1771  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1772  1.4  christos 	 16,			/* bitsize */
   1773  1.4  christos 	 FALSE,			/* pc_relative */
   1774  1.4  christos 	 0,			/* bitpos */
   1775  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1776  1.4  christos 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   1777  1.4  christos 	 "R_MIPS16_LO16",	/* name */
   1778  1.4  christos 	 TRUE,			/* partial_inplace */
   1779  1.4  christos 	 0x0000ffff,		/* src_mask */
   1780  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1781  1.4  christos 	 FALSE),		/* pcrel_offset */
   1782  1.4  christos 
   1783  1.4  christos   /* MIPS16 TLS general dynamic variable reference.  */
   1784  1.4  christos   HOWTO (R_MIPS16_TLS_GD,	/* type */
   1785  1.4  christos 	 0,			/* rightshift */
   1786  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1787  1.4  christos 	 16,			/* bitsize */
   1788  1.4  christos 	 FALSE,			/* pc_relative */
   1789  1.4  christos 	 0,			/* bitpos */
   1790  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1791  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1792  1.4  christos 	 "R_MIPS16_TLS_GD",	/* name */
   1793  1.4  christos 	 TRUE,			/* partial_inplace */
   1794  1.4  christos 	 0x0000ffff,		/* src_mask */
   1795  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1796  1.4  christos 	 FALSE),		/* pcrel_offset */
   1797  1.4  christos 
   1798  1.4  christos   /* MIPS16 TLS local dynamic variable reference.  */
   1799  1.4  christos   HOWTO (R_MIPS16_TLS_LDM,	/* type */
   1800  1.4  christos 	 0,			/* rightshift */
   1801  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1802  1.4  christos 	 16,			/* bitsize */
   1803  1.4  christos 	 FALSE,			/* pc_relative */
   1804  1.4  christos 	 0,			/* bitpos */
   1805  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1806  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1807  1.4  christos 	 "R_MIPS16_TLS_LDM",	/* name */
   1808  1.4  christos 	 TRUE,			/* partial_inplace */
   1809  1.4  christos 	 0x0000ffff,		/* src_mask */
   1810  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1811  1.4  christos 	 FALSE),		/* pcrel_offset */
   1812  1.4  christos 
   1813  1.4  christos   /* MIPS16 TLS local dynamic offset.  */
   1814  1.4  christos   HOWTO (R_MIPS16_TLS_DTPREL_HI16,	/* type */
   1815  1.4  christos 	 0,			/* rightshift */
   1816  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1817  1.4  christos 	 16,			/* bitsize */
   1818  1.4  christos 	 FALSE,			/* pc_relative */
   1819  1.4  christos 	 0,			/* bitpos */
   1820  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1821  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1822  1.4  christos 	 "R_MIPS16_TLS_DTPREL_HI16",	/* name */
   1823  1.4  christos 	 TRUE,			/* partial_inplace */
   1824  1.4  christos 	 0x0000ffff,		/* src_mask */
   1825  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1826  1.4  christos 	 FALSE),		/* pcrel_offset */
   1827  1.4  christos 
   1828  1.4  christos   /* MIPS16 TLS local dynamic offset.  */
   1829  1.4  christos   HOWTO (R_MIPS16_TLS_DTPREL_LO16,	/* type */
   1830  1.4  christos 	 0,			/* rightshift */
   1831  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1832  1.4  christos 	 16,			/* bitsize */
   1833  1.4  christos 	 FALSE,			/* pc_relative */
   1834  1.4  christos 	 0,			/* bitpos */
   1835  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1836  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1837  1.4  christos 	 "R_MIPS16_TLS_DTPREL_LO16",	/* name */
   1838  1.4  christos 	 TRUE,			/* partial_inplace */
   1839  1.4  christos 	 0x0000ffff,		/* src_mask */
   1840  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1841  1.4  christos 	 FALSE),		/* pcrel_offset */
   1842  1.4  christos 
   1843  1.4  christos   /* MIPS16 TLS thread pointer offset.  */
   1844  1.4  christos   HOWTO (R_MIPS16_TLS_GOTTPREL,	/* type */
   1845  1.4  christos 	 0,			/* rightshift */
   1846  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1847  1.4  christos 	 16,			/* bitsize */
   1848  1.4  christos 	 FALSE,			/* pc_relative */
   1849  1.4  christos 	 0,			/* bitpos */
   1850  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1851  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1852  1.4  christos 	 "R_MIPS16_TLS_GOTTPREL",	/* name */
   1853  1.4  christos 	 TRUE,			/* partial_inplace */
   1854  1.4  christos 	 0x0000ffff,		/* src_mask */
   1855  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1856  1.4  christos 	 FALSE),		/* pcrel_offset */
   1857  1.4  christos 
   1858  1.4  christos   /* MIPS16 TLS thread pointer offset.  */
   1859  1.4  christos   HOWTO (R_MIPS16_TLS_TPREL_HI16,	/* type */
   1860  1.4  christos 	 0,			/* rightshift */
   1861  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1862  1.4  christos 	 16,			/* bitsize */
   1863  1.4  christos 	 FALSE,			/* pc_relative */
   1864  1.4  christos 	 0,			/* bitpos */
   1865  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1866  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1867  1.4  christos 	 "R_MIPS16_TLS_TPREL_HI16", /* name */
   1868  1.4  christos 	 TRUE,			/* partial_inplace */
   1869  1.4  christos 	 0x0000ffff,		/* src_mask */
   1870  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1871  1.4  christos 	 FALSE),		/* pcrel_offset */
   1872  1.4  christos 
   1873  1.4  christos   /* MIPS16 TLS thread pointer offset.  */
   1874  1.4  christos   HOWTO (R_MIPS16_TLS_TPREL_LO16,	/* type */
   1875  1.4  christos 	 0,			/* rightshift */
   1876  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1877  1.4  christos 	 16,			/* bitsize */
   1878  1.4  christos 	 FALSE,			/* pc_relative */
   1879  1.4  christos 	 0,			/* bitpos */
   1880  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1881  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1882  1.4  christos 	 "R_MIPS16_TLS_TPREL_LO16", /* name */
   1883  1.4  christos 	 TRUE,			/* partial_inplace */
   1884  1.4  christos 	 0x0000ffff,		/* src_mask */
   1885  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1886  1.4  christos 	 FALSE),		/* pcrel_offset */
   1887  1.4  christos };
   1888  1.4  christos 
   1889  1.4  christos static reloc_howto_type mips16_elf64_howto_table_rela[] =
   1890  1.4  christos {
   1891  1.4  christos   /* The reloc used for the mips16 jump instruction.  */
   1892  1.4  christos   HOWTO (R_MIPS16_26,		/* type */
   1893  1.4  christos 	 2,			/* rightshift */
   1894  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1895  1.4  christos 	 26,			/* bitsize */
   1896  1.4  christos 	 FALSE,			/* pc_relative */
   1897  1.4  christos 	 0,			/* bitpos */
   1898  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1899  1.4  christos 	 			/* This needs complex overflow
   1900  1.4  christos 				   detection, because the upper four
   1901  1.4  christos 				   bits must match the PC.  */
   1902  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1903  1.4  christos 	 "R_MIPS16_26",		/* name */
   1904  1.4  christos 	 FALSE,			/* partial_inplace */
   1905  1.4  christos 	 0,			/* src_mask */
   1906  1.4  christos 	 0x3ffffff,		/* dst_mask */
   1907  1.4  christos 	 FALSE),		/* pcrel_offset */
   1908  1.4  christos 
   1909  1.4  christos   /* The reloc used for the mips16 gprel instruction.  */
   1910  1.4  christos   HOWTO (R_MIPS16_GPREL,	/* type */
   1911  1.4  christos 	 0,			/* rightshift */
   1912  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1913  1.4  christos 	 16,			/* bitsize */
   1914  1.4  christos 	 FALSE,			/* pc_relative */
   1915  1.4  christos 	 0,			/* bitpos */
   1916  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1917  1.4  christos 	 mips16_gprel_reloc,	/* special_function */
   1918  1.4  christos 	 "R_MIPS16_GPREL",	/* name */
   1919  1.4  christos 	 FALSE,			/* partial_inplace */
   1920  1.4  christos 	 0,			/* src_mask */
   1921  1.4  christos 	 0x0000ffff,	        /* dst_mask */
   1922  1.4  christos 	 FALSE),		/* pcrel_offset */
   1923  1.4  christos 
   1924  1.4  christos   /* A MIPS16 reference to the global offset table.  */
   1925  1.4  christos   HOWTO (R_MIPS16_GOT16,	/* type */
   1926  1.4  christos 	 0,			/* rightshift */
   1927  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1928  1.4  christos 	 16,			/* bitsize */
   1929  1.4  christos 	 FALSE,			/* pc_relative */
   1930  1.4  christos 	 0,			/* bitpos */
   1931  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1932  1.4  christos 	 _bfd_mips_elf_got16_reloc, /* special_function */
   1933  1.4  christos 	 "R_MIPS16_GOT16",	/* name */
   1934  1.4  christos 	 FALSE,			/* partial_inplace */
   1935  1.4  christos 	 0,			/* src_mask */
   1936  1.4  christos 	 0x0000ffff,	        /* dst_mask */
   1937  1.4  christos 	 FALSE),		/* pcrel_offset */
   1938  1.4  christos 
   1939  1.4  christos   /* A MIPS16 call through the global offset table.  */
   1940  1.4  christos   HOWTO (R_MIPS16_CALL16,	/* type */
   1941  1.4  christos 	 0,			/* rightshift */
   1942  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1943  1.4  christos 	 16,			/* bitsize */
   1944  1.4  christos 	 FALSE,			/* pc_relative */
   1945  1.4  christos 	 0,			/* bitpos */
   1946  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1947  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1948  1.4  christos 	 "R_MIPS16_CALL16",	/* name */
   1949  1.4  christos 	 FALSE,			/* partial_inplace */
   1950  1.4  christos 	 0,			/* src_mask */
   1951  1.4  christos 	 0x0000ffff,	        /* dst_mask */
   1952  1.4  christos 	 FALSE),		/* pcrel_offset */
   1953  1.4  christos 
   1954  1.4  christos   /* MIPS16 high 16 bits of symbol value.  */
   1955  1.4  christos   HOWTO (R_MIPS16_HI16,		/* type */
   1956  1.4  christos 	 16,			/* rightshift */
   1957  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1958  1.4  christos 	 16,			/* bitsize */
   1959  1.4  christos 	 FALSE,			/* pc_relative */
   1960  1.4  christos 	 0,			/* bitpos */
   1961  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1962  1.4  christos 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   1963  1.4  christos 	 "R_MIPS16_HI16",	/* name */
   1964  1.4  christos 	 FALSE,			/* partial_inplace */
   1965  1.4  christos 	 0,			/* src_mask */
   1966  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1967  1.4  christos 	 FALSE),		/* pcrel_offset */
   1968  1.4  christos 
   1969  1.4  christos   /* MIPS16 low 16 bits of symbol value.  */
   1970  1.4  christos   HOWTO (R_MIPS16_LO16,		/* type */
   1971  1.4  christos 	 0,			/* rightshift */
   1972  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1973  1.4  christos 	 16,			/* bitsize */
   1974  1.4  christos 	 FALSE,			/* pc_relative */
   1975  1.4  christos 	 0,			/* bitpos */
   1976  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   1977  1.4  christos 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   1978  1.4  christos 	 "R_MIPS16_LO16",	/* name */
   1979  1.4  christos 	 FALSE,			/* partial_inplace */
   1980  1.4  christos 	 0,			/* src_mask */
   1981  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1982  1.4  christos 	 FALSE),		/* pcrel_offset */
   1983  1.4  christos 
   1984  1.4  christos   /* MIPS16 TLS general dynamic variable reference.  */
   1985  1.4  christos   HOWTO (R_MIPS16_TLS_GD,	/* type */
   1986  1.4  christos 	 0,			/* rightshift */
   1987  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1988  1.4  christos 	 16,			/* bitsize */
   1989  1.4  christos 	 FALSE,			/* pc_relative */
   1990  1.4  christos 	 0,			/* bitpos */
   1991  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   1992  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1993  1.4  christos 	 "R_MIPS16_TLS_GD",	/* name */
   1994  1.4  christos 	 FALSE,			/* partial_inplace */
   1995  1.4  christos 	 0,			/* src_mask */
   1996  1.4  christos 	 0x0000ffff,		/* dst_mask */
   1997  1.4  christos 	 FALSE),		/* pcrel_offset */
   1998  1.4  christos 
   1999  1.4  christos   /* MIPS16 TLS local dynamic variable reference.  */
   2000  1.4  christos   HOWTO (R_MIPS16_TLS_LDM,	/* type */
   2001  1.4  christos 	 0,			/* rightshift */
   2002  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2003  1.4  christos 	 16,			/* bitsize */
   2004  1.4  christos 	 FALSE,			/* pc_relative */
   2005  1.4  christos 	 0,			/* bitpos */
   2006  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2007  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2008  1.4  christos 	 "R_MIPS16_TLS_LDM",	/* name */
   2009  1.4  christos 	 FALSE,			/* partial_inplace */
   2010  1.4  christos 	 0,			/* src_mask */
   2011  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2012  1.4  christos 	 FALSE),		/* pcrel_offset */
   2013  1.4  christos 
   2014  1.4  christos   /* MIPS16 TLS local dynamic offset.  */
   2015  1.4  christos   HOWTO (R_MIPS16_TLS_DTPREL_HI16,	/* type */
   2016  1.4  christos 	 0,			/* rightshift */
   2017  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2018  1.4  christos 	 16,			/* bitsize */
   2019  1.4  christos 	 FALSE,			/* pc_relative */
   2020  1.4  christos 	 0,			/* bitpos */
   2021  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2022  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2023  1.4  christos 	 "R_MIPS16_TLS_DTPREL_HI16",	/* name */
   2024  1.4  christos 	 FALSE,			/* partial_inplace */
   2025  1.4  christos 	 0,			/* src_mask */
   2026  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2027  1.4  christos 	 FALSE),		/* pcrel_offset */
   2028  1.4  christos 
   2029  1.4  christos   /* MIPS16 TLS local dynamic offset.  */
   2030  1.4  christos   HOWTO (R_MIPS16_TLS_DTPREL_LO16,	/* type */
   2031  1.4  christos 	 0,			/* rightshift */
   2032  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2033  1.4  christos 	 16,			/* bitsize */
   2034  1.4  christos 	 FALSE,			/* pc_relative */
   2035  1.4  christos 	 0,			/* bitpos */
   2036  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2037  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2038  1.4  christos 	 "R_MIPS16_TLS_DTPREL_LO16",	/* name */
   2039  1.4  christos 	 FALSE,			/* partial_inplace */
   2040  1.4  christos 	 0,			/* src_mask */
   2041  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2042  1.4  christos 	 FALSE),		/* pcrel_offset */
   2043  1.4  christos 
   2044  1.4  christos   /* MIPS16 TLS thread pointer offset.  */
   2045  1.4  christos   HOWTO (R_MIPS16_TLS_GOTTPREL,	/* type */
   2046  1.4  christos 	 0,			/* rightshift */
   2047  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2048  1.4  christos 	 16,			/* bitsize */
   2049  1.4  christos 	 FALSE,			/* pc_relative */
   2050  1.4  christos 	 0,			/* bitpos */
   2051  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2052  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2053  1.4  christos 	 "R_MIPS16_TLS_GOTTPREL",	/* name */
   2054  1.4  christos 	 FALSE,			/* partial_inplace */
   2055  1.4  christos 	 0,			/* src_mask */
   2056  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2057  1.4  christos 	 FALSE),		/* pcrel_offset */
   2058  1.4  christos 
   2059  1.4  christos   /* MIPS16 TLS thread pointer offset.  */
   2060  1.4  christos   HOWTO (R_MIPS16_TLS_TPREL_HI16,	/* type */
   2061  1.4  christos 	 0,			/* rightshift */
   2062  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2063  1.4  christos 	 16,			/* bitsize */
   2064  1.4  christos 	 FALSE,			/* pc_relative */
   2065  1.4  christos 	 0,			/* bitpos */
   2066  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2067  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2068  1.4  christos 	 "R_MIPS16_TLS_TPREL_HI16", /* name */
   2069  1.4  christos 	 FALSE,			/* partial_inplace */
   2070  1.4  christos 	 0,			/* src_mask */
   2071  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2072  1.4  christos 	 FALSE),		/* pcrel_offset */
   2073  1.4  christos 
   2074  1.4  christos   /* MIPS16 TLS thread pointer offset.  */
   2075  1.4  christos   HOWTO (R_MIPS16_TLS_TPREL_LO16,	/* type */
   2076  1.4  christos 	 0,			/* rightshift */
   2077  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2078  1.4  christos 	 16,			/* bitsize */
   2079  1.4  christos 	 FALSE,			/* pc_relative */
   2080  1.4  christos 	 0,			/* bitpos */
   2081  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2082  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2083  1.4  christos 	 "R_MIPS16_TLS_TPREL_LO16", /* name */
   2084  1.4  christos 	 FALSE,			/* partial_inplace */
   2085  1.4  christos 	 0,			/* src_mask */
   2086  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2087  1.4  christos 	 FALSE),		/* pcrel_offset */
   2088  1.4  christos };
   2089  1.4  christos 
   2090  1.4  christos static reloc_howto_type micromips_elf64_howto_table_rel[] =
   2091  1.4  christos {
   2092  1.4  christos   EMPTY_HOWTO (130),
   2093  1.4  christos   EMPTY_HOWTO (131),
   2094  1.4  christos   EMPTY_HOWTO (132),
   2095  1.4  christos 
   2096  1.4  christos   /* 26 bit jump address.  */
   2097  1.4  christos   HOWTO (R_MICROMIPS_26_S1,	/* type */
   2098  1.4  christos 	 1,			/* rightshift */
   2099  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2100  1.4  christos 	 26,			/* bitsize */
   2101  1.4  christos 	 FALSE,			/* pc_relative */
   2102  1.4  christos 	 0,			/* bitpos */
   2103  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2104  1.4  christos 	 			/* This needs complex overflow
   2105  1.4  christos 				   detection, because the upper four
   2106  1.4  christos 				   bits must match the PC.  */
   2107  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2108  1.4  christos 	 "R_MICROMIPS_26_S1",	/* name */
   2109  1.4  christos 	 TRUE,			/* partial_inplace */
   2110  1.4  christos 	 0x3ffffff,		/* src_mask */
   2111  1.4  christos 	 0x3ffffff,		/* dst_mask */
   2112  1.4  christos 	 FALSE),		/* pcrel_offset */
   2113  1.4  christos 
   2114  1.4  christos   /* High 16 bits of symbol value.  */
   2115  1.4  christos   HOWTO (R_MICROMIPS_HI16,	/* type */
   2116  1.4  christos 	 16,			/* rightshift */
   2117  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2118  1.4  christos 	 16,			/* bitsize */
   2119  1.4  christos 	 FALSE,			/* pc_relative */
   2120  1.4  christos 	 0,			/* bitpos */
   2121  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2122  1.4  christos 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   2123  1.4  christos 	 "R_MICROMIPS_HI16",	/* name */
   2124  1.4  christos 	 TRUE,			/* partial_inplace */
   2125  1.4  christos 	 0x0000ffff,		/* src_mask */
   2126  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2127  1.4  christos 	 FALSE),		/* pcrel_offset */
   2128  1.4  christos 
   2129  1.4  christos   /* Low 16 bits of symbol value.  */
   2130  1.4  christos   HOWTO (R_MICROMIPS_LO16,	/* type */
   2131  1.4  christos 	 0,			/* rightshift */
   2132  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2133  1.4  christos 	 16,			/* bitsize */
   2134  1.4  christos 	 FALSE,			/* pc_relative */
   2135  1.4  christos 	 0,			/* bitpos */
   2136  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2137  1.4  christos 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   2138  1.4  christos 	 "R_MICROMIPS_LO16",	/* name */
   2139  1.4  christos 	 TRUE,			/* partial_inplace */
   2140  1.4  christos 	 0x0000ffff,		/* src_mask */
   2141  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2142  1.4  christos 	 FALSE),		/* pcrel_offset */
   2143  1.4  christos 
   2144  1.4  christos   /* GP relative reference.  */
   2145  1.4  christos   HOWTO (R_MICROMIPS_GPREL16,	/* type */
   2146  1.4  christos 	 0,			/* rightshift */
   2147  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2148  1.4  christos 	 16,			/* bitsize */
   2149  1.4  christos 	 FALSE,			/* pc_relative */
   2150  1.4  christos 	 0,			/* bitpos */
   2151  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2152  1.4  christos 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   2153  1.4  christos 	 "R_MICROMIPS_GPREL16",	/* name */
   2154  1.4  christos 	 TRUE,			/* partial_inplace */
   2155  1.4  christos 	 0x0000ffff,		/* src_mask */
   2156  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2157  1.4  christos 	 FALSE),		/* pcrel_offset */
   2158  1.4  christos 
   2159  1.4  christos   /* Reference to literal section.  */
   2160  1.4  christos   HOWTO (R_MICROMIPS_LITERAL,	/* type */
   2161  1.4  christos 	 0,			/* rightshift */
   2162  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2163  1.4  christos 	 16,			/* bitsize */
   2164  1.4  christos 	 FALSE,			/* pc_relative */
   2165  1.4  christos 	 0,			/* bitpos */
   2166  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2167  1.4  christos 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   2168  1.4  christos 	 "R_MICROMIPS_LITERAL",	/* name */
   2169  1.4  christos 	 TRUE,			/* partial_inplace */
   2170  1.4  christos 	 0x0000ffff,		/* src_mask */
   2171  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2172  1.4  christos 	 FALSE),		/* pcrel_offset */
   2173  1.4  christos 
   2174  1.4  christos   /* Reference to global offset table.  */
   2175  1.4  christos   HOWTO (R_MICROMIPS_GOT16,	/* type */
   2176  1.4  christos 	 0,			/* rightshift */
   2177  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2178  1.4  christos 	 16,			/* bitsize */
   2179  1.4  christos 	 FALSE,			/* pc_relative */
   2180  1.4  christos 	 0,			/* bitpos */
   2181  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2182  1.4  christos 	 _bfd_mips_elf_got16_reloc, /* special_function */
   2183  1.4  christos 	 "R_MICROMIPS_GOT16",	/* name */
   2184  1.4  christos 	 TRUE,			/* partial_inplace */
   2185  1.4  christos 	 0x0000ffff,		/* src_mask */
   2186  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2187  1.4  christos 	 FALSE),		/* pcrel_offset */
   2188  1.4  christos 
   2189  1.4  christos   /* This is for microMIPS branches.  */
   2190  1.4  christos   HOWTO (R_MICROMIPS_PC7_S1,	/* type */
   2191  1.4  christos 	 1,			/* rightshift */
   2192  1.4  christos 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2193  1.4  christos 	 7,			/* bitsize */
   2194  1.4  christos 	 TRUE,			/* pc_relative */
   2195  1.4  christos 	 0,			/* bitpos */
   2196  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2197  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2198  1.4  christos 	 "R_MICROMIPS_PC7_S1",	/* name */
   2199  1.4  christos 	 TRUE,			/* partial_inplace */
   2200  1.4  christos 	 0x0000007f,		/* src_mask */
   2201  1.4  christos 	 0x0000007f,		/* dst_mask */
   2202  1.4  christos 	 TRUE),			/* pcrel_offset */
   2203  1.4  christos 
   2204  1.4  christos   HOWTO (R_MICROMIPS_PC10_S1,	/* type */
   2205  1.4  christos 	 1,			/* rightshift */
   2206  1.4  christos 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2207  1.4  christos 	 10,			/* bitsize */
   2208  1.4  christos 	 TRUE,			/* pc_relative */
   2209  1.4  christos 	 0,			/* bitpos */
   2210  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2211  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2212  1.4  christos 	 "R_MICROMIPS_PC10_S1",	/* name */
   2213  1.4  christos 	 TRUE,			/* partial_inplace */
   2214  1.4  christos 	 0x000003ff,		/* src_mask */
   2215  1.4  christos 	 0x000003ff,		/* dst_mask */
   2216  1.4  christos 	 TRUE),			/* pcrel_offset */
   2217  1.4  christos 
   2218  1.4  christos   HOWTO (R_MICROMIPS_PC16_S1,	/* type */
   2219  1.4  christos 	 1,			/* rightshift */
   2220  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2221  1.4  christos 	 16,			/* bitsize */
   2222  1.4  christos 	 TRUE,			/* pc_relative */
   2223  1.4  christos 	 0,			/* bitpos */
   2224  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2225  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2226  1.4  christos 	 "R_MICROMIPS_PC16_S1",	/* name */
   2227  1.4  christos 	 TRUE,			/* partial_inplace */
   2228  1.4  christos 	 0x0000ffff,		/* src_mask */
   2229  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2230  1.4  christos 	 TRUE),			/* pcrel_offset */
   2231  1.4  christos 
   2232  1.4  christos   /* 16 bit call through global offset table.  */
   2233  1.4  christos   HOWTO (R_MICROMIPS_CALL16,	/* type */
   2234  1.4  christos 	 0,			/* rightshift */
   2235  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2236  1.4  christos 	 16,			/* bitsize */
   2237  1.4  christos 	 FALSE,			/* pc_relative */
   2238  1.4  christos 	 0,			/* bitpos */
   2239  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2240  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2241  1.4  christos 	 "R_MICROMIPS_CALL16",	/* name */
   2242  1.4  christos 	 TRUE,			/* partial_inplace */
   2243  1.4  christos 	 0x0000ffff,		/* src_mask */
   2244  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2245  1.4  christos 	 FALSE),		/* pcrel_offset */
   2246  1.4  christos 
   2247  1.4  christos   EMPTY_HOWTO (143),
   2248  1.4  christos   EMPTY_HOWTO (144),
   2249  1.4  christos 
   2250  1.4  christos   /* Displacement in the global offset table.  */
   2251  1.4  christos   HOWTO (R_MICROMIPS_GOT_DISP,	/* type */
   2252  1.4  christos 	 0,			/* rightshift */
   2253  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2254  1.4  christos 	 16,			/* bitsize */
   2255  1.4  christos 	 FALSE,			/* pc_relative */
   2256  1.4  christos 	 0,			/* bitpos */
   2257  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2258  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2259  1.4  christos 	 "R_MICROMIPS_GOT_DISP",/* name */
   2260  1.4  christos 	 TRUE,			/* partial_inplace */
   2261  1.4  christos 	 0x0000ffff,		/* src_mask */
   2262  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2263  1.4  christos 	 FALSE),		/* pcrel_offset */
   2264  1.4  christos 
   2265  1.4  christos   /* Displacement to page pointer in the global offset table.  */
   2266  1.4  christos   HOWTO (R_MICROMIPS_GOT_PAGE,	/* type */
   2267  1.4  christos 	 0,			/* rightshift */
   2268  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2269  1.4  christos 	 16,			/* bitsize */
   2270  1.4  christos 	 FALSE,			/* pc_relative */
   2271  1.4  christos 	 0,			/* bitpos */
   2272  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2273  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2274  1.4  christos 	 "R_MICROMIPS_GOT_PAGE",/* name */
   2275  1.4  christos 	 TRUE,			/* partial_inplace */
   2276  1.4  christos 	 0x0000ffff,		/* src_mask */
   2277  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2278  1.4  christos 	 FALSE),		/* pcrel_offset */
   2279  1.4  christos 
   2280  1.4  christos   /* Offset from page pointer in the global offset table.  */
   2281  1.4  christos   HOWTO (R_MICROMIPS_GOT_OFST,	/* type */
   2282  1.4  christos 	 0,			/* rightshift */
   2283  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2284  1.4  christos 	 16,			/* bitsize */
   2285  1.4  christos 	 FALSE,			/* pc_relative */
   2286  1.4  christos 	 0,			/* bitpos */
   2287  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2288  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2289  1.4  christos 	 "R_MICROMIPS_GOT_OFST",/* name */
   2290  1.4  christos 	 TRUE,			/* partial_inplace */
   2291  1.4  christos 	 0x0000ffff,		/* src_mask */
   2292  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2293  1.4  christos 	 FALSE),		/* pcrel_offset */
   2294  1.4  christos 
   2295  1.4  christos   /* High 16 bits of displacement in global offset table.  */
   2296  1.4  christos   HOWTO (R_MICROMIPS_GOT_HI16,	/* type */
   2297  1.4  christos 	 0,			/* rightshift */
   2298  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2299  1.4  christos 	 16,			/* bitsize */
   2300  1.4  christos 	 FALSE,			/* pc_relative */
   2301  1.4  christos 	 0,			/* bitpos */
   2302  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2303  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2304  1.4  christos 	 "R_MICROMIPS_GOT_HI16",/* name */
   2305  1.4  christos 	 TRUE,			/* partial_inplace */
   2306  1.4  christos 	 0x0000ffff,		/* src_mask */
   2307  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2308  1.4  christos 	 FALSE),		/* pcrel_offset */
   2309  1.4  christos 
   2310  1.4  christos   /* Low 16 bits of displacement in global offset table.  */
   2311  1.4  christos   HOWTO (R_MICROMIPS_GOT_LO16,	/* type */
   2312  1.4  christos 	 0,			/* rightshift */
   2313  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2314  1.4  christos 	 16,			/* bitsize */
   2315  1.4  christos 	 FALSE,			/* pc_relative */
   2316  1.4  christos 	 0,			/* bitpos */
   2317  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2318  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2319  1.4  christos 	 "R_MICROMIPS_GOT_LO16",/* name */
   2320  1.4  christos 	 TRUE,			/* partial_inplace */
   2321  1.4  christos 	 0x0000ffff,		/* src_mask */
   2322  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2323  1.4  christos 	 FALSE),		/* pcrel_offset */
   2324  1.4  christos 
   2325  1.4  christos   /* 64 bit subtraction.  Used in the N32 ABI.  */
   2326  1.4  christos   HOWTO (R_MICROMIPS_SUB,	/* type */
   2327  1.4  christos 	 0,			/* rightshift */
   2328  1.4  christos 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   2329  1.4  christos 	 64,			/* bitsize */
   2330  1.4  christos 	 FALSE,			/* pc_relative */
   2331  1.4  christos 	 0,			/* bitpos */
   2332  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2333  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2334  1.4  christos 	 "R_MICROMIPS_SUB",	/* name */
   2335  1.4  christos 	 TRUE,			/* partial_inplace */
   2336  1.4  christos 	 MINUS_ONE,		/* src_mask */
   2337  1.4  christos 	 MINUS_ONE,		/* dst_mask */
   2338  1.4  christos 	 FALSE),		/* pcrel_offset */
   2339  1.4  christos 
   2340  1.4  christos   /* We don't support these for REL relocations, because it means building
   2341  1.4  christos      the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
   2342  1.4  christos      R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
   2343  1.4  christos      using fallable heuristics.  */
   2344  1.4  christos   EMPTY_HOWTO (R_MICROMIPS_HIGHER),
   2345  1.4  christos   EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
   2346  1.4  christos 
   2347  1.4  christos   /* High 16 bits of displacement in global offset table.  */
   2348  1.4  christos   HOWTO (R_MICROMIPS_CALL_HI16,	/* type */
   2349  1.4  christos 	 0,			/* rightshift */
   2350  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2351  1.4  christos 	 16,			/* bitsize */
   2352  1.4  christos 	 FALSE,			/* pc_relative */
   2353  1.4  christos 	 0,			/* bitpos */
   2354  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2355  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2356  1.4  christos 	 "R_MICROMIPS_CALL_HI16",/* name */
   2357  1.4  christos 	 TRUE,			/* partial_inplace */
   2358  1.4  christos 	 0x0000ffff,		/* src_mask */
   2359  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2360  1.4  christos 	 FALSE),		/* pcrel_offset */
   2361  1.4  christos 
   2362  1.4  christos   /* Low 16 bits of displacement in global offset table.  */
   2363  1.4  christos   HOWTO (R_MICROMIPS_CALL_LO16,	/* type */
   2364  1.4  christos 	 0,			/* rightshift */
   2365  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2366  1.4  christos 	 16,			/* bitsize */
   2367  1.4  christos 	 FALSE,			/* pc_relative */
   2368  1.4  christos 	 0,			/* bitpos */
   2369  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2370  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2371  1.4  christos 	 "R_MICROMIPS_CALL_LO16",/* name */
   2372  1.4  christos 	 TRUE,			/* partial_inplace */
   2373  1.4  christos 	 0x0000ffff,		/* src_mask */
   2374  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2375  1.6  christos 	 FALSE),		/* pcrel_offset */
   2376  1.6  christos 
   2377  1.6  christos   /* Section displacement.  */
   2378  1.6  christos   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
   2379  1.6  christos 	 0,			/* rightshift */
   2380  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2381  1.6  christos 	 32,			/* bitsize */
   2382  1.6  christos 	 FALSE,			/* pc_relative */
   2383  1.6  christos 	 0,			/* bitpos */
   2384  1.6  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2385  1.6  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2386  1.6  christos 	 "R_MICROMIPS_SCN_DISP", /* name */
   2387  1.6  christos 	 TRUE,			/* partial_inplace */
   2388  1.6  christos 	 0xffffffff,		/* src_mask */
   2389  1.6  christos 	 0xffffffff,		/* dst_mask */
   2390  1.6  christos 	 FALSE),		/* pcrel_offset */
   2391  1.6  christos 
   2392  1.6  christos   /* Protected jump conversion.  This is an optimization hint.  No
   2393  1.6  christos      relocation is required for correctness.  */
   2394  1.6  christos   HOWTO (R_MICROMIPS_JALR,	/* type */
   2395  1.6  christos 	 0,			/* rightshift */
   2396  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2397  1.6  christos 	 32,			/* bitsize */
   2398  1.6  christos 	 FALSE,			/* pc_relative */
   2399  1.6  christos 	 0,			/* bitpos */
   2400  1.6  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2401  1.6  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2402  1.6  christos 	 "R_MICROMIPS_JALR",	/* name */
   2403  1.6  christos 	 FALSE,			/* partial_inplace */
   2404  1.6  christos 	 0,			/* src_mask */
   2405  1.6  christos 	 0x00000000,		/* dst_mask */
   2406  1.4  christos 	 FALSE),		/* pcrel_offset */
   2407  1.4  christos };
   2408  1.4  christos 
   2409  1.4  christos static reloc_howto_type micromips_elf64_howto_table_rela[] =
   2410  1.4  christos {
   2411  1.4  christos   EMPTY_HOWTO (130),
   2412  1.4  christos   EMPTY_HOWTO (131),
   2413  1.4  christos   EMPTY_HOWTO (132),
   2414  1.4  christos 
   2415  1.4  christos   /* 26 bit jump address.  */
   2416  1.4  christos   HOWTO (R_MICROMIPS_26_S1,	/* type */
   2417  1.4  christos 	 1,			/* rightshift */
   2418  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2419  1.4  christos 	 26,			/* bitsize */
   2420  1.4  christos 	 FALSE,			/* pc_relative */
   2421  1.4  christos 	 0,			/* bitpos */
   2422  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2423  1.4  christos 	 			/* This needs complex overflow
   2424  1.4  christos 				   detection, because the upper four
   2425  1.4  christos 				   bits must match the PC.  */
   2426  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2427  1.4  christos 	 "R_MICROMIPS_26_S1",	/* name */
   2428  1.4  christos 	 FALSE,			/* partial_inplace */
   2429  1.4  christos 	 0,			/* src_mask */
   2430  1.4  christos 	 0x3ffffff,		/* dst_mask */
   2431  1.4  christos 	 FALSE),		/* pcrel_offset */
   2432  1.4  christos 
   2433  1.4  christos   /* High 16 bits of symbol value.  */
   2434  1.4  christos   HOWTO (R_MICROMIPS_HI16,	/* type */
   2435  1.1     skrll 	 16,			/* rightshift */
   2436  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2437  1.1     skrll 	 16,			/* bitsize */
   2438  1.1     skrll 	 FALSE,			/* pc_relative */
   2439  1.4  christos 	 0,			/* bitpos */
   2440  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2441  1.4  christos 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   2442  1.3  christos 	 "R_MICROMIPS_HI16",	/* name */
   2443  1.4  christos 	 FALSE,			/* partial_inplace */
   2444  1.1     skrll 	 0,			/* src_mask */
   2445  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2446  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2447  1.4  christos 
   2448  1.4  christos   /* Low 16 bits of symbol value.  */
   2449  1.1     skrll   HOWTO (R_MICROMIPS_LO16,	/* type */
   2450  1.1     skrll 	 0,			/* rightshift */
   2451  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2452  1.1     skrll 	 16,			/* bitsize */
   2453  1.1     skrll 	 FALSE,			/* pc_relative */
   2454  1.4  christos 	 0,			/* bitpos */
   2455  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2456  1.4  christos 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   2457  1.3  christos 	 "R_MICROMIPS_LO16",	/* name */
   2458  1.4  christos 	 FALSE,			/* partial_inplace */
   2459  1.1     skrll 	 0,			/* src_mask */
   2460  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2461  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2462  1.4  christos 
   2463  1.4  christos   /* GP relative reference.  */
   2464  1.1     skrll   HOWTO (R_MICROMIPS_GPREL16,	/* type */
   2465  1.1     skrll 	 0,			/* rightshift */
   2466  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2467  1.1     skrll 	 16,			/* bitsize */
   2468  1.1     skrll 	 FALSE,			/* pc_relative */
   2469  1.1     skrll 	 0,			/* bitpos */
   2470  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2471  1.4  christos 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   2472  1.3  christos 	 "R_MICROMIPS_GPREL16",	/* name */
   2473  1.4  christos 	 FALSE,			/* partial_inplace */
   2474  1.1     skrll 	 0,			/* src_mask */
   2475  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2476  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2477  1.4  christos 
   2478  1.4  christos   /* Reference to literal section.  */
   2479  1.1     skrll   HOWTO (R_MICROMIPS_LITERAL,	/* type */
   2480  1.1     skrll 	 0,			/* rightshift */
   2481  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2482  1.1     skrll 	 16,			/* bitsize */
   2483  1.1     skrll 	 FALSE,			/* pc_relative */
   2484  1.1     skrll 	 0,			/* bitpos */
   2485  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2486  1.4  christos 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   2487  1.3  christos 	 "R_MICROMIPS_LITERAL",	/* name */
   2488  1.4  christos 	 FALSE,			/* partial_inplace */
   2489  1.1     skrll 	 0,			/* src_mask */
   2490  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2491  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2492  1.4  christos 
   2493  1.4  christos   /* Reference to global offset table.  */
   2494  1.1     skrll   HOWTO (R_MICROMIPS_GOT16,	/* type */
   2495  1.1     skrll 	 0,			/* rightshift */
   2496  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2497  1.1     skrll 	 16,			/* bitsize */
   2498  1.1     skrll 	 FALSE,			/* pc_relative */
   2499  1.1     skrll 	 0,			/* bitpos */
   2500  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2501  1.4  christos 	 _bfd_mips_elf_got16_reloc, /* special_function */
   2502  1.3  christos 	 "R_MICROMIPS_GOT16",	/* name */
   2503  1.4  christos 	 FALSE,			/* partial_inplace */
   2504  1.1     skrll 	 0,			/* src_mask */
   2505  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2506  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2507  1.4  christos 
   2508  1.4  christos   /* This is for microMIPS branches.  */
   2509  1.4  christos   HOWTO (R_MICROMIPS_PC7_S1,	/* type */
   2510  1.4  christos 	 1,			/* rightshift */
   2511  1.4  christos 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2512  1.4  christos 	 7,			/* bitsize */
   2513  1.4  christos 	 TRUE,			/* pc_relative */
   2514  1.4  christos 	 0,			/* bitpos */
   2515  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2516  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2517  1.4  christos 	 "R_MICROMIPS_PC7_S1",	/* name */
   2518  1.4  christos 	 FALSE,			/* partial_inplace */
   2519  1.4  christos 	 0,			/* src_mask */
   2520  1.4  christos 	 0x0000007f,		/* dst_mask */
   2521  1.3  christos 	 TRUE),			/* pcrel_offset */
   2522  1.4  christos 
   2523  1.4  christos   HOWTO (R_MICROMIPS_PC10_S1,	/* type */
   2524  1.4  christos 	 1,			/* rightshift */
   2525  1.4  christos 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2526  1.4  christos 	 10,			/* bitsize */
   2527  1.3  christos 	 TRUE,			/* pc_relative */
   2528  1.4  christos 	 0,			/* bitpos */
   2529  1.3  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2530  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2531  1.3  christos 	 "R_MICROMIPS_PC10_S1",	/* name */
   2532  1.4  christos 	 FALSE,			/* partial_inplace */
   2533  1.4  christos 	 0,			/* src_mask */
   2534  1.4  christos 	 0x000003ff,		/* dst_mask */
   2535  1.1     skrll 	 TRUE),			/* pcrel_offset */
   2536  1.4  christos 
   2537  1.4  christos   HOWTO (R_MICROMIPS_PC16_S1,	/* type */
   2538  1.1     skrll 	 1,			/* rightshift */
   2539  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2540  1.4  christos 	 16,			/* bitsize */
   2541  1.1     skrll 	 TRUE,			/* pc_relative */
   2542  1.1     skrll 	 0,			/* bitpos */
   2543  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   2544  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2545  1.3  christos 	 "R_MICROMIPS_PC16_S1",	/* name */
   2546  1.4  christos 	 FALSE,			/* partial_inplace */
   2547  1.1     skrll 	 0,			/* src_mask */
   2548  1.4  christos 	 0x0000ffff,		/* dst_mask */
   2549  1.1     skrll 	 TRUE),			/* pcrel_offset */
   2550  1.4  christos 
   2551  1.4  christos   /* 16 bit call through global offset table.  */
   2552  1.1     skrll   HOWTO (R_MICROMIPS_CALL16,	/* type */
   2553  1.1     skrll 	 0,			/* rightshift */
   2554  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2555  1.1     skrll 	 16,			/* bitsize */
   2556  1.1     skrll 	 FALSE,			/* pc_relative */
   2557  1.1     skrll 	 0,			/* bitpos */
   2558  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   2559  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2560  1.3  christos 	 "R_MICROMIPS_CALL16",	/* name */
   2561  1.4  christos 	 FALSE,			/* partial_inplace */
   2562  1.1     skrll 	 0,			/* src_mask */
   2563  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2564  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2565  1.4  christos 
   2566  1.4  christos   EMPTY_HOWTO (143),
   2567  1.4  christos   EMPTY_HOWTO (144),
   2568  1.4  christos 
   2569  1.4  christos   /* Displacement in the global offset table.  */
   2570  1.1     skrll   HOWTO (R_MICROMIPS_GOT_DISP,	/* type */
   2571  1.1     skrll 	 0,			/* rightshift */
   2572  1.4  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2573  1.1     skrll 	 16,			/* bitsize */
   2574  1.1     skrll 	 FALSE,			/* pc_relative */
   2575  1.4  christos 	 0,			/* bitpos */
   2576  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   2577  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2578  1.1     skrll 	 "R_MICROMIPS_GOT_DISP",/* name */
   2579  1.4  christos 	 FALSE,			/* partial_inplace */
   2580  1.4  christos 	 0,			/* src_mask */
   2581  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2582  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2583  1.4  christos 
   2584  1.4  christos   /* Displacement to page pointer in the global offset table.  */
   2585  1.1     skrll   HOWTO (R_MICROMIPS_GOT_PAGE,	/* type */
   2586  1.1     skrll 	 0,			/* rightshift */
   2587  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2588  1.1     skrll 	 16,			/* bitsize */
   2589  1.1     skrll 	 FALSE,			/* pc_relative */
   2590  1.1     skrll 	 0,			/* bitpos */
   2591  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2592  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2593  1.4  christos 	 "R_MICROMIPS_GOT_PAGE",/* name */
   2594  1.4  christos 	 FALSE,			/* partial_inplace */
   2595  1.4  christos 	 0,			/* src_mask */
   2596  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2597  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2598  1.4  christos 
   2599  1.4  christos   /* Offset from page pointer in the global offset table.  */
   2600  1.1     skrll   HOWTO (R_MICROMIPS_GOT_OFST,	/* type */
   2601  1.1     skrll 	 0,			/* rightshift */
   2602  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2603  1.1     skrll 	 16,			/* bitsize */
   2604  1.1     skrll 	 FALSE,			/* pc_relative */
   2605  1.4  christos 	 0,			/* bitpos */
   2606  1.4  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2607  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2608  1.4  christos 	 "R_MICROMIPS_GOT_OFST",/* name */
   2609  1.4  christos 	 FALSE,			/* partial_inplace */
   2610  1.4  christos 	 0,			/* src_mask */
   2611  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2612  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2613  1.4  christos 
   2614  1.4  christos   /* High 16 bits of displacement in global offset table.  */
   2615  1.1     skrll   HOWTO (R_MICROMIPS_GOT_HI16,	/* type */
   2616  1.1     skrll 	 0,			/* rightshift */
   2617  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2618  1.1     skrll 	 16,			/* bitsize */
   2619  1.1     skrll 	 FALSE,			/* pc_relative */
   2620  1.1     skrll 	 0,			/* bitpos */
   2621  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   2622  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2623  1.4  christos 	 "R_MICROMIPS_GOT_HI16",/* name */
   2624  1.4  christos 	 FALSE,			/* partial_inplace */
   2625  1.1     skrll 	 0,			/* src_mask */
   2626  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2627  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2628  1.4  christos 
   2629  1.4  christos   /* Low 16 bits of displacement in global offset table.  */
   2630  1.1     skrll   HOWTO (R_MICROMIPS_GOT_LO16,	/* type */
   2631  1.1     skrll 	 0,			/* rightshift */
   2632  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2633  1.1     skrll 	 16,			/* bitsize */
   2634  1.1     skrll 	 FALSE,			/* pc_relative */
   2635  1.1     skrll 	 0,			/* bitpos */
   2636  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2637  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2638  1.4  christos 	 "R_MICROMIPS_GOT_LO16",/* name */
   2639  1.4  christos 	 FALSE,			/* partial_inplace */
   2640  1.1     skrll 	 0,			/* src_mask */
   2641  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2642  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2643  1.4  christos 
   2644  1.4  christos   /* 64 bit subtraction.  Used in the N32 ABI.  */
   2645  1.4  christos   HOWTO (R_MICROMIPS_SUB,	/* type */
   2646  1.4  christos 	 0,			/* rightshift */
   2647  1.4  christos 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   2648  1.1     skrll 	 64,			/* bitsize */
   2649  1.1     skrll 	 FALSE,			/* pc_relative */
   2650  1.1     skrll 	 0,			/* bitpos */
   2651  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   2652  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2653  1.1     skrll 	 "R_MICROMIPS_SUB",	/* name */
   2654  1.4  christos 	 FALSE,			/* partial_inplace */
   2655  1.4  christos 	 0,			/* src_mask */
   2656  1.1     skrll 	 MINUS_ONE,		/* dst_mask */
   2657  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2658  1.4  christos 
   2659  1.4  christos   /* Get the higher value of a 64 bit addend.  */
   2660  1.1     skrll   HOWTO (R_MICROMIPS_HIGHER,	/* type */
   2661  1.1     skrll 	 0,			/* rightshift */
   2662  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2663  1.1     skrll 	 16,			/* bitsize */
   2664  1.1     skrll 	 FALSE,			/* pc_relative */
   2665  1.4  christos 	 0,			/* bitpos */
   2666  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2667  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2668  1.1     skrll 	 "R_MICROMIPS_HIGHER",	/* name */
   2669  1.4  christos 	 FALSE,			/* partial_inplace */
   2670  1.4  christos 	 0,			/* src_mask */
   2671  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2672  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2673  1.4  christos 
   2674  1.4  christos   /* Get the highest value of a 64 bit addend.  */
   2675  1.1     skrll   HOWTO (R_MICROMIPS_HIGHEST,	/* type */
   2676  1.1     skrll 	 0,			/* rightshift */
   2677  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2678  1.1     skrll 	 16,			/* bitsize */
   2679  1.1     skrll 	 FALSE,			/* pc_relative */
   2680  1.1     skrll 	 0,			/* bitpos */
   2681  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2682  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2683  1.1     skrll 	 "R_MICROMIPS_HIGHEST",	/* name */
   2684  1.4  christos 	 FALSE,			/* partial_inplace */
   2685  1.4  christos 	 0,			/* src_mask */
   2686  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2687  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2688  1.4  christos 
   2689  1.4  christos   /* High 16 bits of displacement in global offset table.  */
   2690  1.1     skrll   HOWTO (R_MICROMIPS_CALL_HI16,	/* type */
   2691  1.1     skrll 	 0,			/* rightshift */
   2692  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2693  1.1     skrll 	 16,			/* bitsize */
   2694  1.1     skrll 	 FALSE,			/* pc_relative */
   2695  1.1     skrll 	 0,			/* bitpos */
   2696  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   2697  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2698  1.1     skrll 	 "R_MICROMIPS_CALL_HI16",/* name */
   2699  1.4  christos 	 FALSE,			/* partial_inplace */
   2700  1.1     skrll 	 0,			/* src_mask */
   2701  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2702  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2703  1.4  christos 
   2704  1.4  christos   /* Low 16 bits of displacement in global offset table.  */
   2705  1.1     skrll   HOWTO (R_MICROMIPS_CALL_LO16,	/* type */
   2706  1.1     skrll 	 0,			/* rightshift */
   2707  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2708  1.1     skrll 	 16,			/* bitsize */
   2709  1.1     skrll 	 FALSE,			/* pc_relative */
   2710  1.1     skrll 	 0,			/* bitpos */
   2711  1.4  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2712  1.4  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2713  1.1     skrll 	 "R_MICROMIPS_CALL_LO16",/* name */
   2714  1.4  christos 	 FALSE,			/* partial_inplace */
   2715  1.1     skrll 	 0,			/* src_mask */
   2716  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2717  1.6  christos 	 FALSE),		/* pcrel_offset */
   2718  1.6  christos 
   2719  1.6  christos   /* Section displacement.  */
   2720  1.6  christos   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
   2721  1.6  christos 	 0,			/* rightshift */
   2722  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2723  1.6  christos 	 32,			/* bitsize */
   2724  1.6  christos 	 FALSE,			/* pc_relative */
   2725  1.6  christos 	 0,			/* bitpos */
   2726  1.6  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2727  1.6  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2728  1.6  christos 	 "R_MICROMIPS_SCN_DISP", /* name */
   2729  1.6  christos 	 FALSE,			/* partial_inplace */
   2730  1.6  christos 	 0,			/* src_mask */
   2731  1.6  christos 	 0xffffffff,		/* dst_mask */
   2732  1.6  christos 	 FALSE),		/* pcrel_offset */
   2733  1.6  christos 
   2734  1.6  christos   /* Protected jump conversion.  This is an optimization hint.  No
   2735  1.6  christos      relocation is required for correctness.  */
   2736  1.6  christos   HOWTO (R_MICROMIPS_JALR,	/* type */
   2737  1.6  christos 	 0,			/* rightshift */
   2738  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2739  1.6  christos 	 32,			/* bitsize */
   2740  1.6  christos 	 FALSE,			/* pc_relative */
   2741  1.6  christos 	 0,			/* bitpos */
   2742  1.6  christos 	 complain_overflow_dont, /* complain_on_overflow */
   2743  1.6  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2744  1.6  christos 	 "R_MICROMIPS_JALR",	/* name */
   2745  1.6  christos 	 FALSE,			/* partial_inplace */
   2746  1.6  christos 	 0,			/* src_mask */
   2747  1.6  christos 	 0x00000000,		/* dst_mask */
   2748  1.1     skrll 	 FALSE),		/* pcrel_offset */
   2749  1.1     skrll };
   2750  1.1     skrll 
   2751  1.1     skrll /* GNU extension to record C++ vtable hierarchy */
   2752  1.1     skrll static reloc_howto_type elf_mips_gnu_vtinherit_howto =
   2753  1.1     skrll   HOWTO (R_MIPS_GNU_VTINHERIT,	/* type */
   2754  1.1     skrll 	 0,			/* rightshift */
   2755  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2756  1.1     skrll 	 0,			/* bitsize */
   2757  1.1     skrll 	 FALSE,			/* pc_relative */
   2758  1.1     skrll 	 0,			/* bitpos */
   2759  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   2760  1.1     skrll 	 NULL,			/* special_function */
   2761  1.1     skrll 	 "R_MIPS_GNU_VTINHERIT", /* name */
   2762  1.1     skrll 	 FALSE,			/* partial_inplace */
   2763  1.1     skrll 	 0,			/* src_mask */
   2764  1.1     skrll 	 0,			/* dst_mask */
   2765  1.1     skrll 	 FALSE);		/* pcrel_offset */
   2766  1.1     skrll 
   2767  1.1     skrll /* GNU extension to record C++ vtable member usage */
   2768  1.1     skrll static reloc_howto_type elf_mips_gnu_vtentry_howto =
   2769  1.1     skrll   HOWTO (R_MIPS_GNU_VTENTRY,	/* type */
   2770  1.1     skrll 	 0,			/* rightshift */
   2771  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2772  1.1     skrll 	 0,			/* bitsize */
   2773  1.1     skrll 	 FALSE,			/* pc_relative */
   2774  1.1     skrll 	 0,			/* bitpos */
   2775  1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   2776  1.1     skrll 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
   2777  1.1     skrll 	 "R_MIPS_GNU_VTENTRY",	/* name */
   2778  1.1     skrll 	 FALSE,			/* partial_inplace */
   2779  1.1     skrll 	 0,			/* src_mask */
   2780  1.1     skrll 	 0,			/* dst_mask */
   2781  1.1     skrll 	 FALSE);		/* pcrel_offset */
   2782  1.1     skrll 
   2783  1.1     skrll /* 16 bit offset for pc-relative branches.  */
   2785  1.1     skrll static reloc_howto_type elf_mips_gnu_rel16_s2 =
   2786  1.1     skrll   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
   2787  1.1     skrll 	 2,			/* rightshift */
   2788  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2789  1.1     skrll 	 16,			/* bitsize */
   2790  1.1     skrll 	 TRUE,			/* pc_relative */
   2791  1.1     skrll 	 0,			/* bitpos */
   2792  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   2793  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   2794  1.1     skrll 	 "R_MIPS_GNU_REL16_S2",	/* name */
   2795  1.1     skrll 	 TRUE,			/* partial_inplace */
   2796  1.1     skrll 	 0x0000ffff,		/* src_mask */
   2797  1.1     skrll 	 0x0000ffff,		/* dst_mask */
   2798  1.1     skrll 	 TRUE);			/* pcrel_offset */
   2799  1.1     skrll 
   2800  1.1     skrll /* 16 bit offset for pc-relative branches.  */
   2801  1.1     skrll static reloc_howto_type elf_mips_gnu_rela16_s2 =
   2802  1.1     skrll   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
   2803  1.1     skrll 	 2,			/* rightshift */
   2804  1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2805  1.1     skrll 	 16,			/* bitsize */
   2806  1.1     skrll 	 TRUE,			/* pc_relative */
   2807  1.1     skrll 	 0,			/* bitpos */
   2808  1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
   2809  1.1     skrll 	 _bfd_mips_elf_generic_reloc,	/* special_function */
   2810  1.1     skrll 	 "R_MIPS_GNU_REL16_S2",	/* name */
   2811  1.1     skrll 	 FALSE,			/* partial_inplace */
   2812  1.1     skrll 	 0,			/* src_mask */
   2813  1.6  christos 	 0x0000ffff,		/* dst_mask */
   2814  1.6  christos 	 TRUE);			/* pcrel_offset */
   2815  1.6  christos 
   2816  1.6  christos /* 32 bit pc-relative.  Used for compact EH tables.  */
   2817  1.6  christos static reloc_howto_type elf_mips_gnu_pcrel32 =
   2818  1.6  christos   HOWTO (R_MIPS_PC32,		/* type */
   2819  1.6  christos 	 0,			/* rightshift */
   2820  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2821  1.6  christos 	 32,			/* bitsize */
   2822  1.6  christos 	 TRUE,			/* pc_relative */
   2823  1.6  christos 	 0,			/* bitpos */
   2824  1.6  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2825  1.6  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2826  1.6  christos 	 "R_MIPS_PC32",		/* name */
   2827  1.6  christos 	 TRUE,			/* partial_inplace */
   2828  1.6  christos 	 0xffffffff,		/* src_mask */
   2829  1.6  christos 	 0xffffffff,		/* dst_mask */
   2830  1.1     skrll 	 TRUE);			/* pcrel_offset */
   2831  1.1     skrll 
   2832  1.1     skrll 
   2833  1.1     skrll /* Originally a VxWorks extension, but now used for other systems too.  */
   2835  1.1     skrll static reloc_howto_type elf_mips_copy_howto =
   2836  1.1     skrll   HOWTO (R_MIPS_COPY,		/* type */
   2837  1.1     skrll 	 0,			/* rightshift */
   2838  1.1     skrll 	 0,			/* this one is variable size */
   2839  1.1     skrll 	 0,			/* bitsize */
   2840  1.6  christos 	 FALSE,			/* pc_relative */
   2841  1.1     skrll 	 0,			/* bitpos */
   2842  1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   2843  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2844  1.1     skrll 	 "R_MIPS_COPY",		/* name */
   2845  1.1     skrll 	 FALSE,			/* partial_inplace */
   2846  1.1     skrll 	 0x0,         		/* src_mask */
   2847  1.1     skrll 	 0x0,		        /* dst_mask */
   2848  1.1     skrll 	 FALSE);		/* pcrel_offset */
   2849  1.1     skrll 
   2850  1.1     skrll /* Originally a VxWorks extension, but now used for other systems too.  */
   2851  1.1     skrll static reloc_howto_type elf_mips_jump_slot_howto =
   2852  1.1     skrll   HOWTO (R_MIPS_JUMP_SLOT,	/* type */
   2853  1.1     skrll 	 0,			/* rightshift */
   2854  1.1     skrll 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   2855  1.1     skrll 	 64,			/* bitsize */
   2856  1.6  christos 	 FALSE,			/* pc_relative */
   2857  1.1     skrll 	 0,			/* bitpos */
   2858  1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   2859  1.1     skrll 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2860  1.1     skrll 	 "R_MIPS_JUMP_SLOT",	/* name */
   2861  1.1     skrll 	 FALSE,			/* partial_inplace */
   2862  1.6  christos 	 0x0,         		/* src_mask */
   2863  1.6  christos 	 0x0,		        /* dst_mask */
   2864  1.6  christos 	 FALSE);		/* pcrel_offset */
   2865  1.6  christos 
   2866  1.6  christos /* Used in EH tables.  */
   2867  1.6  christos static reloc_howto_type elf_mips_eh_howto =
   2868  1.6  christos   HOWTO (R_MIPS_EH,		/* type */
   2869  1.6  christos 	 0,			/* rightshift */
   2870  1.6  christos 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2871  1.6  christos 	 32,			/* bitsize */
   2872  1.6  christos 	 FALSE,			/* pc_relative */
   2873  1.6  christos 	 0,			/* bitpos */
   2874  1.6  christos 	 complain_overflow_signed, /* complain_on_overflow */
   2875  1.6  christos 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2876  1.6  christos 	 "R_MIPS_EH",		/* name */
   2877  1.6  christos 	 TRUE,			/* partial_inplace */
   2878  1.6  christos 	 0xffffffff,		/* src_mask */
   2879  1.1     skrll 	 0xffffffff,	        /* dst_mask */
   2880  1.1     skrll 	 FALSE);		/* pcrel_offset */
   2881  1.1     skrll 
   2882  1.1     skrll 
   2883  1.1     skrll /* Swap in a MIPS 64-bit Rel reloc.  */
   2885  1.1     skrll 
   2886  1.1     skrll static void
   2887  1.1     skrll mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
   2888  1.1     skrll 			  Elf64_Mips_Internal_Rela *dst)
   2889  1.1     skrll {
   2890  1.1     skrll   dst->r_offset = H_GET_64 (abfd, src->r_offset);
   2891  1.1     skrll   dst->r_sym = H_GET_32 (abfd, src->r_sym);
   2892  1.1     skrll   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
   2893  1.1     skrll   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
   2894  1.1     skrll   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
   2895  1.1     skrll   dst->r_type = H_GET_8 (abfd, src->r_type);
   2896  1.1     skrll   dst->r_addend = 0;
   2897  1.1     skrll }
   2898  1.1     skrll 
   2899  1.1     skrll /* Swap in a MIPS 64-bit Rela reloc.  */
   2900  1.1     skrll 
   2901  1.1     skrll static void
   2902  1.1     skrll mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
   2903  1.1     skrll 			   Elf64_Mips_Internal_Rela *dst)
   2904  1.1     skrll {
   2905  1.1     skrll   dst->r_offset = H_GET_64 (abfd, src->r_offset);
   2906  1.1     skrll   dst->r_sym = H_GET_32 (abfd, src->r_sym);
   2907  1.1     skrll   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
   2908  1.1     skrll   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
   2909  1.1     skrll   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
   2910  1.1     skrll   dst->r_type = H_GET_8 (abfd, src->r_type);
   2911  1.1     skrll   dst->r_addend = H_GET_S64 (abfd, src->r_addend);
   2912  1.1     skrll }
   2913  1.1     skrll 
   2914  1.1     skrll /* Swap out a MIPS 64-bit Rel reloc.  */
   2915  1.1     skrll 
   2916  1.1     skrll static void
   2917  1.1     skrll mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
   2918  1.1     skrll 			   Elf64_Mips_External_Rel *dst)
   2919  1.1     skrll {
   2920  1.1     skrll   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
   2921  1.1     skrll   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
   2922  1.1     skrll   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
   2923  1.1     skrll   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
   2924  1.1     skrll   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
   2925  1.1     skrll   H_PUT_8 (abfd, src->r_type, dst->r_type);
   2926  1.1     skrll }
   2927  1.1     skrll 
   2928  1.1     skrll /* Swap out a MIPS 64-bit Rela reloc.  */
   2929  1.1     skrll 
   2930  1.1     skrll static void
   2931  1.1     skrll mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
   2932  1.1     skrll 			    Elf64_Mips_External_Rela *dst)
   2933  1.1     skrll {
   2934  1.1     skrll   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
   2935  1.1     skrll   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
   2936  1.1     skrll   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
   2937  1.1     skrll   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
   2938  1.1     skrll   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
   2939  1.1     skrll   H_PUT_8 (abfd, src->r_type, dst->r_type);
   2940  1.1     skrll   H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
   2941  1.1     skrll }
   2942  1.1     skrll 
   2943  1.1     skrll /* Swap in a MIPS 64-bit Rel reloc.  */
   2944  1.1     skrll 
   2945  1.1     skrll static void
   2946  1.1     skrll mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
   2947  1.1     skrll 			     Elf_Internal_Rela *dst)
   2948  1.1     skrll {
   2949  1.1     skrll   Elf64_Mips_Internal_Rela mirel;
   2950  1.1     skrll 
   2951  1.1     skrll   mips_elf64_swap_reloc_in (abfd,
   2952  1.1     skrll 			    (const Elf64_Mips_External_Rel *) src,
   2953  1.1     skrll 			    &mirel);
   2954  1.1     skrll 
   2955  1.1     skrll   dst[0].r_offset = mirel.r_offset;
   2956  1.1     skrll   dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
   2957  1.1     skrll   dst[0].r_addend = 0;
   2958  1.1     skrll   dst[1].r_offset = mirel.r_offset;
   2959  1.1     skrll   dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
   2960  1.1     skrll   dst[1].r_addend = 0;
   2961  1.1     skrll   dst[2].r_offset = mirel.r_offset;
   2962  1.1     skrll   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
   2963  1.1     skrll   dst[2].r_addend = 0;
   2964  1.1     skrll }
   2965  1.1     skrll 
   2966  1.1     skrll /* Swap in a MIPS 64-bit Rela reloc.  */
   2967  1.1     skrll 
   2968  1.1     skrll static void
   2969  1.1     skrll mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
   2970  1.1     skrll 			      Elf_Internal_Rela *dst)
   2971  1.1     skrll {
   2972  1.1     skrll   Elf64_Mips_Internal_Rela mirela;
   2973  1.1     skrll 
   2974  1.1     skrll   mips_elf64_swap_reloca_in (abfd,
   2975  1.1     skrll 			     (const Elf64_Mips_External_Rela *) src,
   2976  1.1     skrll 			     &mirela);
   2977  1.1     skrll 
   2978  1.1     skrll   dst[0].r_offset = mirela.r_offset;
   2979  1.1     skrll   dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type);
   2980  1.1     skrll   dst[0].r_addend = mirela.r_addend;
   2981  1.1     skrll   dst[1].r_offset = mirela.r_offset;
   2982  1.1     skrll   dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2);
   2983  1.1     skrll   dst[1].r_addend = 0;
   2984  1.1     skrll   dst[2].r_offset = mirela.r_offset;
   2985  1.1     skrll   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3);
   2986  1.1     skrll   dst[2].r_addend = 0;
   2987  1.1     skrll }
   2988  1.1     skrll 
   2989  1.1     skrll /* Swap out a MIPS 64-bit Rel reloc.  */
   2990  1.1     skrll 
   2991  1.1     skrll static void
   2992  1.1     skrll mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
   2993  1.1     skrll 			      bfd_byte *dst)
   2994  1.1     skrll {
   2995  1.4  christos   Elf64_Mips_Internal_Rela mirel;
   2996  1.1     skrll 
   2997  1.1     skrll   mirel.r_offset = src[0].r_offset;
   2998  1.1     skrll   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
   2999  1.1     skrll   BFD_ASSERT(src[0].r_offset == src[2].r_offset);
   3000  1.1     skrll 
   3001  1.1     skrll   mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
   3002  1.1     skrll   mirel.r_sym = ELF64_R_SYM (src[0].r_info);
   3003  1.1     skrll   mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
   3004  1.1     skrll   mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
   3005  1.1     skrll   mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
   3006  1.1     skrll 
   3007  1.1     skrll   mips_elf64_swap_reloc_out (abfd, &mirel,
   3008  1.1     skrll 			     (Elf64_Mips_External_Rel *) dst);
   3009  1.1     skrll }
   3010  1.1     skrll 
   3011  1.1     skrll /* Swap out a MIPS 64-bit Rela reloc.  */
   3012  1.1     skrll 
   3013  1.1     skrll static void
   3014  1.1     skrll mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src,
   3015  1.1     skrll 			       bfd_byte *dst)
   3016  1.1     skrll {
   3017  1.1     skrll   Elf64_Mips_Internal_Rela mirela;
   3018  1.1     skrll 
   3019  1.1     skrll   mirela.r_offset = src[0].r_offset;
   3020  1.1     skrll   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
   3021  1.1     skrll   BFD_ASSERT(src[0].r_offset == src[2].r_offset);
   3022  1.1     skrll 
   3023  1.1     skrll   mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
   3024  1.1     skrll   mirela.r_sym = ELF64_R_SYM (src[0].r_info);
   3025  1.1     skrll   mirela.r_addend = src[0].r_addend;
   3026  1.1     skrll   BFD_ASSERT(src[1].r_addend == 0);
   3027  1.1     skrll   BFD_ASSERT(src[2].r_addend == 0);
   3028  1.1     skrll 
   3029  1.1     skrll   mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
   3030  1.1     skrll   mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
   3031  1.1     skrll   mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
   3032  1.1     skrll 
   3033  1.1     skrll   mips_elf64_swap_reloca_out (abfd, &mirela,
   3034  1.1     skrll 			      (Elf64_Mips_External_Rela *) dst);
   3035  1.1     skrll }
   3036  1.1     skrll 
   3037  1.1     skrll /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
   3039  1.1     skrll    dangerous relocation.  */
   3040  1.1     skrll 
   3041  1.1     skrll static bfd_boolean
   3042  1.1     skrll mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp)
   3043  1.1     skrll {
   3044  1.1     skrll   unsigned int count;
   3045  1.1     skrll   asymbol **sym;
   3046  1.1     skrll   unsigned int i;
   3047  1.1     skrll 
   3048  1.1     skrll   /* If we've already figured out what GP will be, just return it.  */
   3049  1.1     skrll   *pgp = _bfd_get_gp_value (output_bfd);
   3050  1.1     skrll   if (*pgp)
   3051  1.1     skrll     return TRUE;
   3052  1.1     skrll 
   3053  1.1     skrll   count = bfd_get_symcount (output_bfd);
   3054  1.1     skrll   sym = bfd_get_outsymbols (output_bfd);
   3055  1.1     skrll 
   3056  1.1     skrll   /* The linker script will have created a symbol named `_gp' with the
   3057  1.1     skrll      appropriate value.  */
   3058  1.1     skrll   if (sym == NULL)
   3059  1.1     skrll     i = count;
   3060  1.1     skrll   else
   3061  1.1     skrll     {
   3062  1.1     skrll       for (i = 0; i < count; i++, sym++)
   3063  1.1     skrll 	{
   3064  1.1     skrll 	  register const char *name;
   3065  1.1     skrll 
   3066  1.1     skrll 	  name = bfd_asymbol_name (*sym);
   3067  1.1     skrll 	  if (*name == '_' && strcmp (name, "_gp") == 0)
   3068  1.1     skrll 	    {
   3069  1.1     skrll 	      *pgp = bfd_asymbol_value (*sym);
   3070  1.1     skrll 	      _bfd_set_gp_value (output_bfd, *pgp);
   3071  1.1     skrll 	      break;
   3072  1.1     skrll 	    }
   3073  1.1     skrll 	}
   3074  1.1     skrll     }
   3075  1.1     skrll 
   3076  1.1     skrll   if (i >= count)
   3077  1.1     skrll     {
   3078  1.1     skrll       /* Only get the error once.  */
   3079  1.1     skrll       *pgp = 4;
   3080  1.1     skrll       _bfd_set_gp_value (output_bfd, *pgp);
   3081  1.1     skrll       return FALSE;
   3082  1.1     skrll     }
   3083  1.1     skrll 
   3084  1.1     skrll   return TRUE;
   3085  1.1     skrll }
   3086  1.1     skrll 
   3087  1.1     skrll /* We have to figure out the gp value, so that we can adjust the
   3088  1.1     skrll    symbol value correctly.  We look up the symbol _gp in the output
   3089  1.1     skrll    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
   3090  1.1     skrll    target data.  We don't need to adjust the symbol value for an
   3091  1.1     skrll    external symbol if we are producing relocatable output.  */
   3092  1.1     skrll 
   3093  1.1     skrll static bfd_reloc_status_type
   3094  1.1     skrll mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
   3095  1.1     skrll 		     char **error_message, bfd_vma *pgp)
   3096  1.1     skrll {
   3097  1.1     skrll   if (bfd_is_und_section (symbol->section)
   3098  1.1     skrll       && ! relocatable)
   3099  1.1     skrll     {
   3100  1.1     skrll       *pgp = 0;
   3101  1.1     skrll       return bfd_reloc_undefined;
   3102  1.1     skrll     }
   3103  1.1     skrll 
   3104  1.1     skrll   *pgp = _bfd_get_gp_value (output_bfd);
   3105  1.1     skrll   if (*pgp == 0
   3106  1.1     skrll       && (! relocatable
   3107  1.1     skrll 	  || (symbol->flags & BSF_SECTION_SYM) != 0))
   3108  1.1     skrll     {
   3109  1.1     skrll       if (relocatable)
   3110  1.1     skrll 	{
   3111  1.1     skrll 	  /* Make up a value.  */
   3112  1.1     skrll 	  *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
   3113  1.1     skrll 	  _bfd_set_gp_value (output_bfd, *pgp);
   3114  1.1     skrll 	}
   3115  1.1     skrll       else if (!mips_elf64_assign_gp (output_bfd, pgp))
   3116  1.1     skrll 	{
   3117  1.1     skrll 	  *error_message =
   3118  1.1     skrll 	    (char *) _("GP relative relocation when _gp not defined");
   3119  1.1     skrll 	  return bfd_reloc_dangerous;
   3120  1.1     skrll 	}
   3121  1.1     skrll     }
   3122  1.1     skrll 
   3123  1.1     skrll   return bfd_reloc_ok;
   3124  1.1     skrll }
   3125  1.1     skrll 
   3126  1.1     skrll /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
   3127  1.1     skrll    become the offset from the gp register.  */
   3128  1.1     skrll 
   3129  1.1     skrll static bfd_reloc_status_type
   3130  1.1     skrll mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3131  1.1     skrll 			  void *data, asection *input_section, bfd *output_bfd,
   3132  1.1     skrll 			  char **error_message)
   3133  1.1     skrll {
   3134  1.1     skrll   bfd_boolean relocatable;
   3135  1.1     skrll   bfd_reloc_status_type ret;
   3136  1.1     skrll   bfd_vma gp;
   3137  1.1     skrll 
   3138  1.1     skrll   /* If we're relocating, and this is an external symbol, we don't want
   3139  1.1     skrll      to change anything.  */
   3140  1.1     skrll   if (output_bfd != NULL
   3141  1.1     skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
   3142  1.1     skrll       && (symbol->flags & BSF_LOCAL) != 0)
   3143  1.1     skrll     {
   3144  1.1     skrll       reloc_entry->address += input_section->output_offset;
   3145  1.1     skrll       return bfd_reloc_ok;
   3146  1.1     skrll     }
   3147  1.1     skrll 
   3148  1.1     skrll   if (output_bfd != NULL)
   3149  1.1     skrll     relocatable = TRUE;
   3150  1.1     skrll   else
   3151  1.1     skrll     {
   3152  1.1     skrll       relocatable = FALSE;
   3153  1.1     skrll       output_bfd = symbol->section->output_section->owner;
   3154  1.1     skrll     }
   3155  1.1     skrll 
   3156  1.1     skrll   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
   3157  1.1     skrll 			     &gp);
   3158  1.1     skrll   if (ret != bfd_reloc_ok)
   3159  1.1     skrll     return ret;
   3160  1.1     skrll 
   3161  1.1     skrll   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   3162  1.1     skrll 					input_section, relocatable,
   3163  1.1     skrll 					data, gp);
   3164  1.1     skrll }
   3165  1.1     skrll 
   3166  1.1     skrll /* Do a R_MIPS_LITERAL relocation.  */
   3167  1.1     skrll 
   3168  1.1     skrll static bfd_reloc_status_type
   3169  1.1     skrll mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3170  1.1     skrll 			  void *data, asection *input_section, bfd *output_bfd,
   3171  1.1     skrll 			  char **error_message)
   3172  1.1     skrll {
   3173  1.1     skrll   bfd_boolean relocatable;
   3174  1.1     skrll   bfd_reloc_status_type ret;
   3175  1.1     skrll   bfd_vma gp;
   3176  1.1     skrll 
   3177  1.1     skrll   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
   3178  1.1     skrll   if (output_bfd != NULL
   3179  1.1     skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
   3180  1.1     skrll       && (symbol->flags & BSF_LOCAL) != 0)
   3181  1.1     skrll     {
   3182  1.1     skrll       *error_message = (char *)
   3183  1.1     skrll 	_("literal relocation occurs for an external symbol");
   3184  1.1     skrll       return bfd_reloc_outofrange;
   3185  1.1     skrll     }
   3186  1.1     skrll 
   3187  1.1     skrll   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
   3188  1.1     skrll   if (output_bfd != NULL)
   3189  1.1     skrll     relocatable = TRUE;
   3190  1.1     skrll   else
   3191  1.1     skrll     {
   3192  1.1     skrll       relocatable = FALSE;
   3193  1.1     skrll       output_bfd = symbol->section->output_section->owner;
   3194  1.1     skrll     }
   3195  1.1     skrll 
   3196  1.1     skrll   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
   3197  1.1     skrll 			     &gp);
   3198  1.1     skrll   if (ret != bfd_reloc_ok)
   3199  1.1     skrll     return ret;
   3200  1.1     skrll 
   3201  1.1     skrll   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   3202  1.1     skrll 					input_section, relocatable,
   3203  1.1     skrll 					data, gp);
   3204  1.1     skrll }
   3205  1.1     skrll 
   3206  1.1     skrll /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
   3207  1.1     skrll    become the offset from the gp register.  */
   3208  1.1     skrll 
   3209  1.1     skrll static bfd_reloc_status_type
   3210  1.1     skrll mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3211  1.1     skrll 			  void *data, asection *input_section, bfd *output_bfd,
   3212  1.1     skrll 			  char **error_message)
   3213  1.1     skrll {
   3214  1.1     skrll   bfd_boolean relocatable;
   3215  1.1     skrll   bfd_reloc_status_type ret;
   3216  1.1     skrll   bfd_vma gp;
   3217  1.1     skrll   bfd_vma relocation;
   3218  1.1     skrll   bfd_vma val;
   3219  1.1     skrll 
   3220  1.1     skrll   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
   3221  1.1     skrll   if (output_bfd != NULL
   3222  1.1     skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
   3223  1.1     skrll       && (symbol->flags & BSF_LOCAL) != 0)
   3224  1.1     skrll     {
   3225  1.1     skrll       *error_message = (char *)
   3226  1.1     skrll 	_("32bits gp relative relocation occurs for an external symbol");
   3227  1.1     skrll       return bfd_reloc_outofrange;
   3228  1.1     skrll     }
   3229  1.1     skrll 
   3230  1.1     skrll   if (output_bfd != NULL)
   3231  1.1     skrll     relocatable = TRUE;
   3232  1.1     skrll   else
   3233  1.1     skrll     {
   3234  1.1     skrll       relocatable = FALSE;
   3235  1.1     skrll       output_bfd = symbol->section->output_section->owner;
   3236  1.1     skrll     }
   3237  1.1     skrll 
   3238  1.1     skrll   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable,
   3239  1.1     skrll 			     error_message, &gp);
   3240  1.1     skrll   if (ret != bfd_reloc_ok)
   3241  1.1     skrll     return ret;
   3242  1.1     skrll 
   3243  1.1     skrll   if (bfd_is_com_section (symbol->section))
   3244  1.1     skrll     relocation = 0;
   3245  1.1     skrll   else
   3246  1.1     skrll     relocation = symbol->value;
   3247  1.1     skrll 
   3248  1.1     skrll   relocation += symbol->section->output_section->vma;
   3249  1.1     skrll   relocation += symbol->section->output_offset;
   3250  1.1     skrll 
   3251  1.1     skrll   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
   3252  1.1     skrll     return bfd_reloc_outofrange;
   3253  1.1     skrll 
   3254  1.1     skrll   /* Set val to the offset into the section or symbol.  */
   3255  1.1     skrll   val = reloc_entry->addend;
   3256  1.1     skrll 
   3257  1.1     skrll   if (reloc_entry->howto->partial_inplace)
   3258  1.1     skrll     val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
   3259  1.1     skrll 
   3260  1.1     skrll   /* Adjust val for the final section location and GP value.  If we
   3261  1.1     skrll      are producing relocatable output, we don't want to do this for
   3262  1.1     skrll      an external symbol.  */
   3263  1.1     skrll   if (! relocatable
   3264  1.1     skrll       || (symbol->flags & BSF_SECTION_SYM) != 0)
   3265  1.1     skrll     val += relocation - gp;
   3266  1.1     skrll 
   3267  1.1     skrll   if (reloc_entry->howto->partial_inplace)
   3268  1.1     skrll     bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
   3269  1.1     skrll   else
   3270  1.1     skrll     reloc_entry->addend = val;
   3271  1.1     skrll 
   3272  1.1     skrll   if (relocatable)
   3273  1.1     skrll     reloc_entry->address += input_section->output_offset;
   3274  1.1     skrll 
   3275  1.1     skrll   return bfd_reloc_ok;
   3276  1.1     skrll }
   3277  1.1     skrll 
   3278  1.1     skrll /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
   3279  1.1     skrll    the rest is at bits 6-10. The bitpos already got right by the howto.  */
   3280  1.1     skrll 
   3281  1.1     skrll static bfd_reloc_status_type
   3282  1.1     skrll mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3283  1.1     skrll 			 void *data, asection *input_section, bfd *output_bfd,
   3284  1.1     skrll 			 char **error_message)
   3285  1.1     skrll {
   3286  1.1     skrll   if (reloc_entry->howto->partial_inplace)
   3287  1.1     skrll     {
   3288  1.1     skrll       reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
   3289  1.1     skrll 			     | (reloc_entry->addend & 0x00000800) >> 9);
   3290  1.1     skrll     }
   3291  1.1     skrll 
   3292  1.1     skrll   return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
   3293  1.1     skrll 				      input_section, output_bfd,
   3294  1.1     skrll 				      error_message);
   3295  1.1     skrll }
   3296  1.1     skrll 
   3297  1.1     skrll /* Handle a mips16 GP relative reloc.  */
   3298  1.1     skrll 
   3299  1.1     skrll static bfd_reloc_status_type
   3300  1.1     skrll mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3301  1.1     skrll 		    void *data, asection *input_section, bfd *output_bfd,
   3302  1.1     skrll 		    char **error_message)
   3303  1.1     skrll {
   3304  1.1     skrll   bfd_boolean relocatable;
   3305  1.1     skrll   bfd_reloc_status_type ret;
   3306  1.1     skrll   bfd_byte *location;
   3307  1.1     skrll   bfd_vma gp;
   3308  1.1     skrll 
   3309  1.1     skrll   /* If we're relocating, and this is an external symbol, we don't want
   3310  1.1     skrll      to change anything.  */
   3311  1.1     skrll   if (output_bfd != NULL
   3312  1.1     skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
   3313  1.1     skrll       && (symbol->flags & BSF_LOCAL) != 0)
   3314  1.1     skrll     {
   3315  1.1     skrll       reloc_entry->address += input_section->output_offset;
   3316  1.1     skrll       return bfd_reloc_ok;
   3317  1.1     skrll     }
   3318  1.1     skrll 
   3319  1.1     skrll   if (output_bfd != NULL)
   3320  1.1     skrll     relocatable = TRUE;
   3321  1.1     skrll   else
   3322  1.1     skrll     {
   3323  1.1     skrll       relocatable = FALSE;
   3324  1.1     skrll       output_bfd = symbol->section->output_section->owner;
   3325  1.1     skrll     }
   3326  1.1     skrll 
   3327  1.1     skrll   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
   3328  1.4  christos 			     &gp);
   3329  1.4  christos   if (ret != bfd_reloc_ok)
   3330  1.1     skrll     return ret;
   3331  1.1     skrll 
   3332  1.1     skrll   location = (bfd_byte *) data + reloc_entry->address;
   3333  1.4  christos   _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
   3334  1.4  christos 				 location);
   3335  1.1     skrll   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   3336  1.1     skrll 				       input_section, relocatable,
   3337  1.1     skrll 				       data, gp);
   3338  1.1     skrll   _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
   3339  1.1     skrll 			       location);
   3340  1.1     skrll 
   3341  1.1     skrll   return ret;
   3342  1.1     skrll }
   3343  1.1     skrll 
   3344  1.1     skrll /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
   3346  1.1     skrll 
   3347  1.1     skrll struct elf_reloc_map {
   3348  1.1     skrll   bfd_reloc_code_real_type bfd_val;
   3349  1.1     skrll   enum elf_mips_reloc_type elf_val;
   3350  1.1     skrll };
   3351  1.1     skrll 
   3352  1.1     skrll static const struct elf_reloc_map mips_reloc_map[] =
   3353  1.1     skrll {
   3354  1.1     skrll   { BFD_RELOC_NONE, R_MIPS_NONE },
   3355  1.1     skrll   { BFD_RELOC_16, R_MIPS_16 },
   3356  1.1     skrll   { BFD_RELOC_32, R_MIPS_32 },
   3357  1.1     skrll   /* There is no BFD reloc for R_MIPS_REL32.  */
   3358  1.1     skrll   { BFD_RELOC_64, R_MIPS_64 },
   3359  1.1     skrll   { BFD_RELOC_CTOR, R_MIPS_64 },
   3360  1.1     skrll   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
   3361  1.1     skrll   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
   3362  1.1     skrll   { BFD_RELOC_LO16, R_MIPS_LO16 },
   3363  1.1     skrll   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
   3364  1.1     skrll   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
   3365  1.1     skrll   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
   3366  1.1     skrll   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
   3367  1.1     skrll   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
   3368  1.1     skrll   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
   3369  1.1     skrll   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
   3370  1.1     skrll   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
   3371  1.1     skrll   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
   3372  1.1     skrll   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
   3373  1.1     skrll   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
   3374  1.1     skrll   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
   3375  1.1     skrll   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
   3376  1.1     skrll   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
   3377  1.1     skrll   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
   3378  1.1     skrll   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
   3379  1.1     skrll   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
   3380  1.1     skrll   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
   3381  1.1     skrll   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
   3382  1.1     skrll   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
   3383  1.1     skrll   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
   3384  1.1     skrll   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
   3385  1.1     skrll   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
   3386  1.1     skrll   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
   3387  1.1     skrll   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
   3388  1.1     skrll   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
   3389  1.1     skrll   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
   3390  1.1     skrll   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
   3391  1.1     skrll   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
   3392  1.1     skrll   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
   3393  1.1     skrll   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
   3394  1.1     skrll   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
   3395  1.6  christos   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
   3396  1.6  christos   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
   3397  1.6  christos   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
   3398  1.6  christos   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
   3399  1.6  christos   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
   3400  1.6  christos   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
   3401  1.6  christos   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 },
   3402  1.1     skrll   { BFD_RELOC_MIPS_21_PCREL_S2, R_MIPS_PC21_S2 },
   3403  1.1     skrll   { BFD_RELOC_MIPS_26_PCREL_S2, R_MIPS_PC26_S2 },
   3404  1.1     skrll   { BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
   3405  1.1     skrll   { BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
   3406  1.1     skrll   { BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
   3407  1.1     skrll   { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
   3408  1.1     skrll };
   3409  1.1     skrll 
   3410  1.1     skrll static const struct elf_reloc_map mips16_reloc_map[] =
   3411  1.1     skrll {
   3412  1.4  christos   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
   3413  1.4  christos   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
   3414  1.4  christos   { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
   3415  1.4  christos   { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
   3416  1.4  christos   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
   3417  1.4  christos   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
   3418  1.4  christos   { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
   3419  1.4  christos   { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
   3420  1.4  christos   { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
   3421  1.1     skrll     R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
   3422  1.1     skrll   { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
   3423  1.4  christos     R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
   3424  1.4  christos   { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
   3425  1.4  christos   { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
   3426  1.4  christos   { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
   3427  1.4  christos };
   3428  1.4  christos 
   3429  1.4  christos static const struct elf_reloc_map micromips_reloc_map[] =
   3430  1.4  christos {
   3431  1.4  christos   { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
   3432  1.4  christos   { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
   3433  1.4  christos   { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
   3434  1.4  christos   { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
   3435  1.4  christos   { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
   3436  1.4  christos   { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
   3437  1.4  christos   { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
   3438  1.4  christos   { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
   3439  1.4  christos   { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
   3440  1.4  christos   { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
   3441  1.4  christos   { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
   3442  1.4  christos   { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
   3443  1.4  christos   { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
   3444  1.4  christos   { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
   3445  1.6  christos   { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
   3446  1.6  christos   { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
   3447  1.4  christos   { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
   3448  1.1     skrll   { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
   3449  1.1     skrll   { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
   3450  1.1     skrll   { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
   3451  1.1     skrll   { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
   3452  1.1     skrll   { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
   3453  1.1     skrll };
   3454  1.1     skrll /* Given a BFD reloc type, return a howto structure.  */
   3455  1.1     skrll 
   3456  1.1     skrll static reloc_howto_type *
   3457  1.1     skrll bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   3458  1.1     skrll 				 bfd_reloc_code_real_type code)
   3459  1.4  christos {
   3460  1.1     skrll   unsigned int i;
   3461  1.1     skrll   /* FIXME: We default to RELA here instead of choosing the right
   3462  1.1     skrll      relocation variant.  */
   3463  1.1     skrll   reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
   3464  1.1     skrll   reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
   3465  1.1     skrll   reloc_howto_type *howto_micromips_table = micromips_elf64_howto_table_rela;
   3466  1.1     skrll 
   3467  1.1     skrll   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
   3468  1.1     skrll        i++)
   3469  1.1     skrll     {
   3470  1.1     skrll       if (mips_reloc_map[i].bfd_val == code)
   3471  1.1     skrll 	return &howto_table[(int) mips_reloc_map[i].elf_val];
   3472  1.1     skrll     }
   3473  1.1     skrll 
   3474  1.1     skrll   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
   3475  1.4  christos        i++)
   3476  1.4  christos     {
   3477  1.4  christos       if (mips16_reloc_map[i].bfd_val == code)
   3478  1.4  christos 	return &howto16_table[(int) mips16_reloc_map[i].elf_val];
   3479  1.4  christos     }
   3480  1.4  christos 
   3481  1.4  christos   for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
   3482  1.1     skrll        i++)
   3483  1.1     skrll     {
   3484  1.1     skrll       if (micromips_reloc_map[i].bfd_val == code)
   3485  1.1     skrll 	return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
   3486  1.1     skrll     }
   3487  1.1     skrll 
   3488  1.6  christos   switch (code)
   3489  1.6  christos     {
   3490  1.6  christos     case BFD_RELOC_VTABLE_INHERIT:
   3491  1.6  christos       return &elf_mips_gnu_vtinherit_howto;
   3492  1.1     skrll     case BFD_RELOC_VTABLE_ENTRY:
   3493  1.1     skrll       return &elf_mips_gnu_vtentry_howto;
   3494  1.1     skrll     case BFD_RELOC_32_PCREL:
   3495  1.1     skrll       return &elf_mips_gnu_pcrel32;
   3496  1.1     skrll     case BFD_RELOC_MIPS_EH:
   3497  1.1     skrll       return &elf_mips_eh_howto;
   3498  1.1     skrll     case BFD_RELOC_MIPS_COPY:
   3499  1.1     skrll       return &elf_mips_copy_howto;
   3500  1.1     skrll     case BFD_RELOC_MIPS_JUMP_SLOT:
   3501  1.1     skrll       return &elf_mips_jump_slot_howto;
   3502  1.1     skrll     default:
   3503  1.1     skrll       bfd_set_error (bfd_error_bad_value);
   3504  1.1     skrll       return NULL;
   3505  1.1     skrll     }
   3506  1.1     skrll }
   3507  1.1     skrll 
   3508  1.1     skrll static reloc_howto_type *
   3509  1.1     skrll bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   3510  1.1     skrll 				 const char *r_name)
   3511  1.1     skrll {
   3512  1.1     skrll   unsigned int i;
   3513  1.1     skrll 
   3514  1.1     skrll   for (i = 0;
   3515  1.1     skrll        i < (sizeof (mips_elf64_howto_table_rela)
   3516  1.1     skrll 	    / sizeof (mips_elf64_howto_table_rela[0])); i++)
   3517  1.1     skrll     if (mips_elf64_howto_table_rela[i].name != NULL
   3518  1.1     skrll 	&& strcasecmp (mips_elf64_howto_table_rela[i].name, r_name) == 0)
   3519  1.1     skrll       return &mips_elf64_howto_table_rela[i];
   3520  1.1     skrll 
   3521  1.1     skrll   for (i = 0;
   3522  1.1     skrll        i < (sizeof (mips16_elf64_howto_table_rela)
   3523  1.4  christos 	    / sizeof (mips16_elf64_howto_table_rela[0]));
   3524  1.4  christos        i++)
   3525  1.4  christos     if (mips16_elf64_howto_table_rela[i].name != NULL
   3526  1.4  christos 	&& strcasecmp (mips16_elf64_howto_table_rela[i].name, r_name) == 0)
   3527  1.4  christos       return &mips16_elf64_howto_table_rela[i];
   3528  1.4  christos 
   3529  1.4  christos   for (i = 0;
   3530  1.4  christos        i < (sizeof (micromips_elf64_howto_table_rela)
   3531  1.1     skrll 	    / sizeof (micromips_elf64_howto_table_rela[0]));
   3532  1.1     skrll        i++)
   3533  1.1     skrll     if (micromips_elf64_howto_table_rela[i].name != NULL
   3534  1.1     skrll 	&& strcasecmp (micromips_elf64_howto_table_rela[i].name, r_name) == 0)
   3535  1.1     skrll       return &micromips_elf64_howto_table_rela[i];
   3536  1.1     skrll 
   3537  1.1     skrll   if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
   3538  1.1     skrll     return &elf_mips_gnu_vtinherit_howto;
   3539  1.6  christos   if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
   3540  1.6  christos     return &elf_mips_gnu_vtentry_howto;
   3541  1.6  christos   if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
   3542  1.6  christos     return &elf_mips_gnu_rel16_s2;
   3543  1.1     skrll   if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
   3544  1.1     skrll     return &elf_mips_gnu_rela16_s2;
   3545  1.1     skrll   if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
   3546  1.1     skrll     return &elf_mips_gnu_pcrel32;
   3547  1.1     skrll   if (strcasecmp (elf_mips_eh_howto.name, r_name) == 0)
   3548  1.1     skrll     return &elf_mips_eh_howto;
   3549  1.1     skrll   if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
   3550  1.1     skrll     return &elf_mips_copy_howto;
   3551  1.1     skrll   if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
   3552  1.1     skrll     return &elf_mips_jump_slot_howto;
   3553  1.1     skrll 
   3554  1.1     skrll   return NULL;
   3555  1.1     skrll }
   3556  1.1     skrll 
   3557  1.1     skrll /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
   3558  1.1     skrll 
   3559  1.1     skrll static reloc_howto_type *
   3560  1.1     skrll mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
   3561  1.1     skrll {
   3562  1.1     skrll   switch (r_type)
   3563  1.1     skrll     {
   3564  1.1     skrll     case R_MIPS_GNU_VTINHERIT:
   3565  1.1     skrll       return &elf_mips_gnu_vtinherit_howto;
   3566  1.1     skrll     case R_MIPS_GNU_VTENTRY:
   3567  1.6  christos       return &elf_mips_gnu_vtentry_howto;
   3568  1.6  christos     case R_MIPS_GNU_REL16_S2:
   3569  1.6  christos       if (rela_p)
   3570  1.6  christos 	return &elf_mips_gnu_rela16_s2;
   3571  1.1     skrll       else
   3572  1.1     skrll 	return &elf_mips_gnu_rel16_s2;
   3573  1.1     skrll     case R_MIPS_PC32:
   3574  1.1     skrll       return &elf_mips_gnu_pcrel32;
   3575  1.1     skrll     case R_MIPS_EH:
   3576  1.4  christos       return &elf_mips_eh_howto;
   3577  1.4  christos     case R_MIPS_COPY:
   3578  1.4  christos       return &elf_mips_copy_howto;
   3579  1.4  christos     case R_MIPS_JUMP_SLOT:
   3580  1.4  christos       return &elf_mips_jump_slot_howto;
   3581  1.4  christos     default:
   3582  1.4  christos       if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
   3583  1.1     skrll 	{
   3584  1.1     skrll 	  if (rela_p)
   3585  1.1     skrll 	    return &micromips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
   3586  1.1     skrll 	  else
   3587  1.1     skrll 	    return &micromips_elf64_howto_table_rel[r_type - R_MICROMIPS_min];
   3588  1.1     skrll 	}
   3589  1.1     skrll       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
   3590  1.6  christos 	{
   3591  1.6  christos 	  if (rela_p)
   3592  1.6  christos 	    return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
   3593  1.6  christos 	  else
   3594  1.6  christos 	    return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
   3595  1.6  christos 	}
   3596  1.1     skrll       if (r_type >= R_MIPS_max)
   3597  1.1     skrll 	{
   3598  1.1     skrll 	  (*_bfd_error_handler) (_("unrecognised MIPS reloc number: %d"), r_type);
   3599  1.1     skrll 	  bfd_set_error (bfd_error_bad_value);
   3600  1.1     skrll 	  r_type = R_MIPS_NONE;
   3601  1.1     skrll 	}
   3602  1.1     skrll       if (rela_p)
   3603  1.1     skrll 	return &mips_elf64_howto_table_rela[r_type];
   3604  1.1     skrll       else
   3605  1.1     skrll 	return &mips_elf64_howto_table_rel[r_type];
   3606  1.1     skrll       break;
   3607  1.1     skrll     }
   3608  1.1     skrll }
   3609  1.1     skrll 
   3610  1.1     skrll /* Prevent relocation handling by bfd for MIPS ELF64.  */
   3611  1.1     skrll 
   3612  1.1     skrll static void
   3613  1.1     skrll mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
   3614  1.1     skrll 			      arelent *cache_ptr ATTRIBUTE_UNUSED,
   3615  1.1     skrll 			      Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
   3616  1.1     skrll {
   3617  1.1     skrll   BFD_ASSERT (0);
   3618  1.1     skrll }
   3619  1.1     skrll 
   3620  1.1     skrll static void
   3621  1.1     skrll mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
   3622  1.1     skrll 			       arelent *cache_ptr ATTRIBUTE_UNUSED,
   3623  1.1     skrll 			       Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
   3624  1.1     skrll {
   3625  1.1     skrll   BFD_ASSERT (0);
   3626  1.1     skrll }
   3627  1.1     skrll 
   3628  1.1     skrll /* Since each entry in an SHT_REL or SHT_RELA section can represent up
   3629  1.1     skrll    to three relocs, we must tell the user to allocate more space.  */
   3630  1.1     skrll 
   3631  1.1     skrll static long
   3632  1.1     skrll mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
   3633  1.1     skrll {
   3634  1.1     skrll   return (sec->reloc_count * 3 + 1) * sizeof (arelent *);
   3635  1.1     skrll }
   3636  1.1     skrll 
   3637  1.1     skrll static long
   3638  1.1     skrll mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd)
   3639  1.1     skrll {
   3640  1.1     skrll   return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3;
   3641  1.1     skrll }
   3642  1.1     skrll 
   3643  1.1     skrll /* We must also copy more relocations than the corresponding functions
   3644  1.1     skrll    in elf.c would, so the two following functions are slightly
   3645  1.1     skrll    modified from elf.c, that multiply the external relocation count by
   3646  1.1     skrll    3 to obtain the internal relocation count.  */
   3647  1.1     skrll 
   3648  1.1     skrll static long
   3649  1.1     skrll mips_elf64_canonicalize_reloc (bfd *abfd, sec_ptr section,
   3650  1.1     skrll 			       arelent **relptr, asymbol **symbols)
   3651  1.1     skrll {
   3652  1.1     skrll   arelent *tblptr;
   3653  1.1     skrll   unsigned int i;
   3654  1.1     skrll   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   3655  1.1     skrll 
   3656  1.1     skrll   if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
   3657  1.1     skrll     return -1;
   3658  1.1     skrll 
   3659  1.1     skrll   tblptr = section->relocation;
   3660  1.1     skrll   for (i = 0; i < section->reloc_count * 3; i++)
   3661  1.1     skrll     *relptr++ = tblptr++;
   3662  1.1     skrll 
   3663  1.1     skrll   *relptr = NULL;
   3664  1.1     skrll 
   3665  1.1     skrll   return section->reloc_count * 3;
   3666  1.1     skrll }
   3667  1.1     skrll 
   3668  1.1     skrll static long
   3669  1.1     skrll mips_elf64_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage,
   3670  1.1     skrll 				       asymbol **syms)
   3671  1.1     skrll {
   3672  1.1     skrll   bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
   3673  1.1     skrll   asection *s;
   3674  1.1     skrll   long ret;
   3675  1.1     skrll 
   3676  1.1     skrll   if (elf_dynsymtab (abfd) == 0)
   3677  1.1     skrll     {
   3678  1.1     skrll       bfd_set_error (bfd_error_invalid_operation);
   3679  1.1     skrll       return -1;
   3680  1.1     skrll     }
   3681  1.1     skrll 
   3682  1.1     skrll   slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
   3683  1.1     skrll   ret = 0;
   3684  1.1     skrll   for (s = abfd->sections; s != NULL; s = s->next)
   3685  1.1     skrll     {
   3686  1.1     skrll       if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
   3687  1.1     skrll 	  && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
   3688  1.1     skrll 	      || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
   3689  1.1     skrll 	{
   3690  1.1     skrll 	  arelent *p;
   3691  1.1     skrll 	  long count, i;
   3692  1.1     skrll 
   3693  1.1     skrll 	  if (! (*slurp_relocs) (abfd, s, syms, TRUE))
   3694  1.1     skrll 	    return -1;
   3695  1.1     skrll 	  count = s->size / elf_section_data (s)->this_hdr.sh_entsize * 3;
   3696  1.1     skrll 	  p = s->relocation;
   3697  1.1     skrll 	  for (i = 0; i < count; i++)
   3698  1.1     skrll 	    *storage++ = p++;
   3699  1.1     skrll 	  ret += count;
   3700  1.1     skrll 	}
   3701  1.1     skrll     }
   3702  1.1     skrll 
   3703  1.1     skrll   *storage = NULL;
   3704  1.1     skrll 
   3705  1.1     skrll   return ret;
   3706  1.1     skrll }
   3707  1.1     skrll 
   3708  1.1     skrll /* Read the relocations from one reloc section.  This is mostly copied
   3709  1.1     skrll    from elfcode.h, except for the changes to expand one external
   3710  1.1     skrll    relocation to 3 internal ones.  We must unfortunately set
   3711  1.1     skrll    reloc_count to the number of external relocations, because a lot of
   3712  1.1     skrll    generic code seems to depend on this.  */
   3713  1.1     skrll 
   3714  1.1     skrll static bfd_boolean
   3715  1.1     skrll mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
   3716  1.1     skrll 				  Elf_Internal_Shdr *rel_hdr,
   3717  1.1     skrll 				  bfd_size_type reloc_count,
   3718  1.1     skrll 				  arelent *relents, asymbol **symbols,
   3719  1.1     skrll 				  bfd_boolean dynamic)
   3720  1.1     skrll {
   3721  1.1     skrll   void *allocated;
   3722  1.1     skrll   bfd_byte *native_relocs;
   3723  1.1     skrll   arelent *relent;
   3724  1.1     skrll   bfd_vma i;
   3725  1.1     skrll   int entsize;
   3726  1.1     skrll   bfd_boolean rela_p;
   3727  1.1     skrll 
   3728  1.1     skrll   allocated = bfd_malloc (rel_hdr->sh_size);
   3729  1.1     skrll   if (allocated == NULL)
   3730  1.1     skrll     return FALSE;
   3731  1.1     skrll 
   3732  1.1     skrll   if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
   3733  1.1     skrll       || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
   3734  1.1     skrll 	  != rel_hdr->sh_size))
   3735  1.1     skrll     goto error_return;
   3736  1.1     skrll 
   3737  1.1     skrll   native_relocs = allocated;
   3738  1.1     skrll 
   3739  1.1     skrll   entsize = rel_hdr->sh_entsize;
   3740  1.1     skrll   BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
   3741  1.1     skrll 	      || entsize == sizeof (Elf64_Mips_External_Rela));
   3742  1.1     skrll 
   3743  1.1     skrll   if (entsize == sizeof (Elf64_Mips_External_Rel))
   3744  1.1     skrll     rela_p = FALSE;
   3745  1.1     skrll   else
   3746  1.1     skrll     rela_p = TRUE;
   3747  1.1     skrll 
   3748  1.1     skrll   for (i = 0, relent = relents;
   3749  1.1     skrll        i < reloc_count;
   3750  1.1     skrll        i++, native_relocs += entsize)
   3751  1.1     skrll     {
   3752  1.1     skrll       Elf64_Mips_Internal_Rela rela;
   3753  1.1     skrll       bfd_boolean used_sym, used_ssym;
   3754  1.1     skrll       int ir;
   3755  1.1     skrll 
   3756  1.1     skrll       if (entsize == sizeof (Elf64_Mips_External_Rela))
   3757  1.1     skrll 	mips_elf64_swap_reloca_in (abfd,
   3758  1.1     skrll 				   (Elf64_Mips_External_Rela *) native_relocs,
   3759  1.1     skrll 				   &rela);
   3760  1.1     skrll       else
   3761  1.1     skrll 	mips_elf64_swap_reloc_in (abfd,
   3762  1.1     skrll 				  (Elf64_Mips_External_Rel *) native_relocs,
   3763  1.1     skrll 				  &rela);
   3764  1.1     skrll 
   3765  1.1     skrll       /* Each entry represents exactly three actual relocations.  */
   3766  1.1     skrll 
   3767  1.1     skrll       used_sym = FALSE;
   3768  1.1     skrll       used_ssym = FALSE;
   3769  1.1     skrll       for (ir = 0; ir < 3; ir++)
   3770  1.1     skrll 	{
   3771  1.1     skrll 	  enum elf_mips_reloc_type type;
   3772  1.1     skrll 
   3773  1.1     skrll 	  switch (ir)
   3774  1.1     skrll 	    {
   3775  1.1     skrll 	    default:
   3776  1.1     skrll 	      abort ();
   3777  1.1     skrll 	    case 0:
   3778  1.1     skrll 	      type = (enum elf_mips_reloc_type) rela.r_type;
   3779  1.1     skrll 	      break;
   3780  1.1     skrll 	    case 1:
   3781  1.1     skrll 	      type = (enum elf_mips_reloc_type) rela.r_type2;
   3782  1.1     skrll 	      break;
   3783  1.1     skrll 	    case 2:
   3784  1.1     skrll 	      type = (enum elf_mips_reloc_type) rela.r_type3;
   3785  1.1     skrll 	      break;
   3786  1.1     skrll 	    }
   3787  1.1     skrll 
   3788  1.1     skrll 	  /* Some types require symbols, whereas some do not.  */
   3789  1.1     skrll 	  switch (type)
   3790  1.1     skrll 	    {
   3791  1.1     skrll 	    case R_MIPS_NONE:
   3792  1.1     skrll 	    case R_MIPS_LITERAL:
   3793  1.1     skrll 	    case R_MIPS_INSERT_A:
   3794  1.1     skrll 	    case R_MIPS_INSERT_B:
   3795  1.1     skrll 	    case R_MIPS_DELETE:
   3796  1.3  christos 	      relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
   3797  1.1     skrll 	      break;
   3798  1.1     skrll 
   3799  1.1     skrll 	    default:
   3800  1.1     skrll 	      if (! used_sym)
   3801  1.1     skrll 		{
   3802  1.1     skrll 		  if (rela.r_sym == STN_UNDEF)
   3803  1.1     skrll 		    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
   3804  1.1     skrll 		  else
   3805  1.1     skrll 		    {
   3806  1.1     skrll 		      asymbol **ps, *s;
   3807  1.1     skrll 
   3808  1.1     skrll 		      ps = symbols + rela.r_sym - 1;
   3809  1.1     skrll 		      s = *ps;
   3810  1.1     skrll 		      if ((s->flags & BSF_SECTION_SYM) == 0)
   3811  1.1     skrll 			relent->sym_ptr_ptr = ps;
   3812  1.1     skrll 		      else
   3813  1.1     skrll 			relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
   3814  1.1     skrll 		    }
   3815  1.1     skrll 
   3816  1.1     skrll 		  used_sym = TRUE;
   3817  1.1     skrll 		}
   3818  1.1     skrll 	      else if (! used_ssym)
   3819  1.1     skrll 		{
   3820  1.1     skrll 		  switch (rela.r_ssym)
   3821  1.1     skrll 		    {
   3822  1.1     skrll 		    case RSS_UNDEF:
   3823  1.1     skrll 		      relent->sym_ptr_ptr =
   3824  1.1     skrll 			bfd_abs_section_ptr->symbol_ptr_ptr;
   3825  1.1     skrll 		      break;
   3826  1.1     skrll 
   3827  1.1     skrll 		    case RSS_GP:
   3828  1.1     skrll 		    case RSS_GP0:
   3829  1.1     skrll 		    case RSS_LOC:
   3830  1.1     skrll 		      /* FIXME: I think these need to be handled using
   3831  1.1     skrll 			 special howto structures.  */
   3832  1.1     skrll 		      BFD_ASSERT (0);
   3833  1.1     skrll 		      break;
   3834  1.1     skrll 
   3835  1.1     skrll 		    default:
   3836  1.1     skrll 		      BFD_ASSERT (0);
   3837  1.1     skrll 		      break;
   3838  1.1     skrll 		    }
   3839  1.1     skrll 
   3840  1.1     skrll 		  used_ssym = TRUE;
   3841  1.1     skrll 		}
   3842  1.1     skrll 	      else
   3843  1.1     skrll 		relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
   3844  1.1     skrll 
   3845  1.1     skrll 	      break;
   3846  1.1     skrll 	    }
   3847  1.1     skrll 
   3848  1.1     skrll 	  /* The address of an ELF reloc is section relative for an
   3849  1.1     skrll 	     object file, and absolute for an executable file or
   3850  1.1     skrll 	     shared library.  The address of a BFD reloc is always
   3851  1.1     skrll 	     section relative.  */
   3852  1.1     skrll 	  if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
   3853  1.1     skrll 	    relent->address = rela.r_offset;
   3854  1.1     skrll 	  else
   3855  1.1     skrll 	    relent->address = rela.r_offset - asect->vma;
   3856  1.1     skrll 
   3857  1.1     skrll 	  relent->addend = rela.r_addend;
   3858  1.1     skrll 
   3859  1.1     skrll 	  relent->howto = mips_elf64_rtype_to_howto (type, rela_p);
   3860  1.1     skrll 
   3861  1.1     skrll 	  ++relent;
   3862  1.1     skrll 	}
   3863  1.1     skrll     }
   3864  1.1     skrll 
   3865  1.1     skrll   asect->reloc_count += (relent - relents) / 3;
   3866  1.1     skrll 
   3867  1.1     skrll   if (allocated != NULL)
   3868  1.1     skrll     free (allocated);
   3869  1.1     skrll 
   3870  1.1     skrll   return TRUE;
   3871  1.1     skrll 
   3872  1.1     skrll  error_return:
   3873  1.1     skrll   if (allocated != NULL)
   3874  1.1     skrll     free (allocated);
   3875  1.1     skrll   return FALSE;
   3876  1.1     skrll }
   3877  1.1     skrll 
   3878  1.1     skrll /* Read the relocations.  On Irix 6, there can be two reloc sections
   3879  1.1     skrll    associated with a single data section.  This is copied from
   3880  1.1     skrll    elfcode.h as well, with changes as small as accounting for 3
   3881  1.1     skrll    internal relocs per external reloc and resetting reloc_count to
   3882  1.1     skrll    zero before processing the relocs of a section.  */
   3883  1.1     skrll 
   3884  1.1     skrll static bfd_boolean
   3885  1.1     skrll mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect,
   3886  1.1     skrll 			      asymbol **symbols, bfd_boolean dynamic)
   3887  1.1     skrll {
   3888  1.1     skrll   struct bfd_elf_section_data * const d = elf_section_data (asect);
   3889  1.1     skrll   Elf_Internal_Shdr *rel_hdr;
   3890  1.1     skrll   Elf_Internal_Shdr *rel_hdr2;
   3891  1.1     skrll   bfd_size_type reloc_count;
   3892  1.1     skrll   bfd_size_type reloc_count2;
   3893  1.1     skrll   arelent *relents;
   3894  1.1     skrll   bfd_size_type amt;
   3895  1.1     skrll 
   3896  1.1     skrll   if (asect->relocation != NULL)
   3897  1.1     skrll     return TRUE;
   3898  1.1     skrll 
   3899  1.3  christos   if (! dynamic)
   3900  1.3  christos     {
   3901  1.3  christos       if ((asect->flags & SEC_RELOC) == 0
   3902  1.1     skrll 	  || asect->reloc_count == 0)
   3903  1.1     skrll 	return TRUE;
   3904  1.1     skrll 
   3905  1.3  christos       rel_hdr = d->rel.hdr;
   3906  1.1     skrll       reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
   3907  1.1     skrll       rel_hdr2 = d->rela.hdr;
   3908  1.1     skrll       reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
   3909  1.1     skrll 
   3910  1.1     skrll       BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
   3911  1.1     skrll       BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
   3912  1.1     skrll 		  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
   3913  1.1     skrll 
   3914  1.1     skrll     }
   3915  1.1     skrll   else
   3916  1.1     skrll     {
   3917  1.1     skrll       /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
   3918  1.1     skrll 	 case because relocations against this section may use the
   3919  1.1     skrll 	 dynamic symbol table, and in that case bfd_section_from_shdr
   3920  1.1     skrll 	 in elf.c does not update the RELOC_COUNT.  */
   3921  1.1     skrll       if (asect->size == 0)
   3922  1.1     skrll 	return TRUE;
   3923  1.1     skrll 
   3924  1.1     skrll       rel_hdr = &d->this_hdr;
   3925  1.1     skrll       reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
   3926  1.1     skrll       rel_hdr2 = NULL;
   3927  1.1     skrll       reloc_count2 = 0;
   3928  1.1     skrll     }
   3929  1.1     skrll 
   3930  1.1     skrll   /* Allocate space for 3 arelent structures for each Rel structure.  */
   3931  1.1     skrll   amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent);
   3932  1.1     skrll   relents = bfd_alloc (abfd, amt);
   3933  1.3  christos   if (relents == NULL)
   3934  1.3  christos     return FALSE;
   3935  1.3  christos 
   3936  1.3  christos   /* The slurp_one_reloc_table routine increments reloc_count.  */
   3937  1.3  christos   asect->reloc_count = 0;
   3938  1.3  christos 
   3939  1.3  christos   if (rel_hdr != NULL
   3940  1.3  christos       && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
   3941  1.3  christos 					     rel_hdr, reloc_count,
   3942  1.3  christos 					     relents,
   3943  1.3  christos 					     symbols, dynamic))
   3944  1.1     skrll     return FALSE;
   3945  1.1     skrll   if (rel_hdr2 != NULL
   3946  1.1     skrll       && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
   3947  1.1     skrll 					     rel_hdr2, reloc_count2,
   3948  1.1     skrll 					     relents + reloc_count * 3,
   3949  1.1     skrll 					     symbols, dynamic))
   3950  1.1     skrll     return FALSE;
   3951  1.1     skrll 
   3952  1.1     skrll   asect->relocation = relents;
   3953  1.1     skrll   return TRUE;
   3954  1.1     skrll }
   3955  1.1     skrll 
   3956  1.1     skrll /* Write out the relocations.  */
   3957  1.1     skrll 
   3958  1.1     skrll static void
   3959  1.1     skrll mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
   3960  1.1     skrll {
   3961  1.1     skrll   bfd_boolean *failedp = data;
   3962  1.1     skrll   int count;
   3963  1.1     skrll   Elf_Internal_Shdr *rel_hdr;
   3964  1.1     skrll   unsigned int idx;
   3965  1.1     skrll 
   3966  1.1     skrll   /* If we have already failed, don't do anything.  */
   3967  1.1     skrll   if (*failedp)
   3968  1.1     skrll     return;
   3969  1.1     skrll 
   3970  1.1     skrll   if ((sec->flags & SEC_RELOC) == 0)
   3971  1.1     skrll     return;
   3972  1.1     skrll 
   3973  1.1     skrll   /* The linker backend writes the relocs out itself, and sets the
   3974  1.1     skrll      reloc_count field to zero to inhibit writing them here.  Also,
   3975  1.1     skrll      sometimes the SEC_RELOC flag gets set even when there aren't any
   3976  1.1     skrll      relocs.  */
   3977  1.1     skrll   if (sec->reloc_count == 0)
   3978  1.1     skrll     return;
   3979  1.1     skrll 
   3980  1.1     skrll   /* We can combine up to three relocs that refer to the same address
   3981  1.1     skrll      if the latter relocs have no associated symbol.  */
   3982  1.1     skrll   count = 0;
   3983  1.1     skrll   for (idx = 0; idx < sec->reloc_count; idx++)
   3984  1.1     skrll     {
   3985  1.1     skrll       bfd_vma addr;
   3986  1.1     skrll       unsigned int i;
   3987  1.1     skrll 
   3988  1.1     skrll       ++count;
   3989  1.1     skrll 
   3990  1.1     skrll       addr = sec->orelocation[idx]->address;
   3991  1.1     skrll       for (i = 0; i < 2; i++)
   3992  1.1     skrll 	{
   3993  1.1     skrll 	  arelent *r;
   3994  1.1     skrll 
   3995  1.1     skrll 	  if (idx + 1 >= sec->reloc_count)
   3996  1.1     skrll 	    break;
   3997  1.1     skrll 	  r = sec->orelocation[idx + 1];
   3998  1.1     skrll 	  if (r->address != addr
   3999  1.1     skrll 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
   4000  1.1     skrll 	      || (*r->sym_ptr_ptr)->value != 0)
   4001  1.1     skrll 	    break;
   4002  1.1     skrll 
   4003  1.3  christos 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
   4004  1.1     skrll 
   4005  1.1     skrll 	  ++idx;
   4006  1.1     skrll 	}
   4007  1.1     skrll     }
   4008  1.1     skrll 
   4009  1.1     skrll   rel_hdr = _bfd_elf_single_rel_hdr (sec);
   4010  1.1     skrll 
   4011  1.1     skrll   /* Do the actual relocation.  */
   4012  1.1     skrll 
   4013  1.1     skrll   if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
   4014  1.1     skrll     mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
   4015  1.1     skrll   else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
   4016  1.1     skrll     mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
   4017  1.1     skrll   else
   4018  1.1     skrll     BFD_ASSERT (0);
   4019  1.1     skrll }
   4020  1.1     skrll 
   4021  1.1     skrll static void
   4022  1.1     skrll mips_elf64_write_rel (bfd *abfd, asection *sec,
   4023  1.1     skrll 		      Elf_Internal_Shdr *rel_hdr,
   4024  1.1     skrll 		      int *count, void *data)
   4025  1.1     skrll {
   4026  1.1     skrll   bfd_boolean *failedp = data;
   4027  1.1     skrll   Elf64_Mips_External_Rel *ext_rel;
   4028  1.1     skrll   unsigned int idx;
   4029  1.1     skrll   asymbol *last_sym = 0;
   4030  1.1     skrll   int last_sym_idx = 0;
   4031  1.1     skrll 
   4032  1.1     skrll   rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
   4033  1.1     skrll   rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
   4034  1.1     skrll   if (rel_hdr->contents == NULL)
   4035  1.1     skrll     {
   4036  1.1     skrll       *failedp = TRUE;
   4037  1.1     skrll       return;
   4038  1.1     skrll     }
   4039  1.1     skrll 
   4040  1.1     skrll   ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
   4041  1.1     skrll   for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
   4042  1.1     skrll     {
   4043  1.1     skrll       arelent *ptr;
   4044  1.1     skrll       Elf64_Mips_Internal_Rela int_rel;
   4045  1.1     skrll       asymbol *sym;
   4046  1.1     skrll       int n;
   4047  1.1     skrll       unsigned int i;
   4048  1.1     skrll 
   4049  1.1     skrll       ptr = sec->orelocation[idx];
   4050  1.1     skrll 
   4051  1.1     skrll       /* The address of an ELF reloc is section relative for an object
   4052  1.1     skrll 	 file, and absolute for an executable file or shared library.
   4053  1.1     skrll 	 The address of a BFD reloc is always section relative.  */
   4054  1.1     skrll       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
   4055  1.1     skrll 	int_rel.r_offset = ptr->address;
   4056  1.1     skrll       else
   4057  1.1     skrll 	int_rel.r_offset = ptr->address + sec->vma;
   4058  1.1     skrll 
   4059  1.1     skrll       sym = *ptr->sym_ptr_ptr;
   4060  1.1     skrll       if (sym == last_sym)
   4061  1.1     skrll 	n = last_sym_idx;
   4062  1.1     skrll       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
   4063  1.1     skrll 	n = STN_UNDEF;
   4064  1.1     skrll       else
   4065  1.1     skrll 	{
   4066  1.1     skrll 	  last_sym = sym;
   4067  1.1     skrll 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
   4068  1.1     skrll 	  if (n < 0)
   4069  1.1     skrll 	    {
   4070  1.1     skrll 	      *failedp = TRUE;
   4071  1.1     skrll 	      return;
   4072  1.1     skrll 	    }
   4073  1.1     skrll 	  last_sym_idx = n;
   4074  1.1     skrll 	}
   4075  1.1     skrll 
   4076  1.1     skrll       int_rel.r_sym = n;
   4077  1.1     skrll       int_rel.r_ssym = RSS_UNDEF;
   4078  1.1     skrll 
   4079  1.1     skrll       if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
   4080  1.1     skrll 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
   4081  1.1     skrll 	{
   4082  1.1     skrll 	  *failedp = TRUE;
   4083  1.1     skrll 	  return;
   4084  1.1     skrll 	}
   4085  1.1     skrll 
   4086  1.1     skrll       int_rel.r_type = ptr->howto->type;
   4087  1.1     skrll       int_rel.r_type2 = (int) R_MIPS_NONE;
   4088  1.1     skrll       int_rel.r_type3 = (int) R_MIPS_NONE;
   4089  1.1     skrll 
   4090  1.1     skrll       for (i = 0; i < 2; i++)
   4091  1.1     skrll 	{
   4092  1.1     skrll 	  arelent *r;
   4093  1.1     skrll 
   4094  1.1     skrll 	  if (idx + 1 >= sec->reloc_count)
   4095  1.1     skrll 	    break;
   4096  1.1     skrll 	  r = sec->orelocation[idx + 1];
   4097  1.1     skrll 	  if (r->address != ptr->address
   4098  1.1     skrll 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
   4099  1.1     skrll 	      || (*r->sym_ptr_ptr)->value != 0)
   4100  1.1     skrll 	    break;
   4101  1.1     skrll 
   4102  1.1     skrll 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
   4103  1.1     skrll 
   4104  1.1     skrll 	  if (i == 0)
   4105  1.1     skrll 	    int_rel.r_type2 = r->howto->type;
   4106  1.1     skrll 	  else
   4107  1.1     skrll 	    int_rel.r_type3 = r->howto->type;
   4108  1.1     skrll 
   4109  1.1     skrll 	  ++idx;
   4110  1.1     skrll 	}
   4111  1.1     skrll 
   4112  1.1     skrll       mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
   4113  1.1     skrll     }
   4114  1.1     skrll 
   4115  1.1     skrll   BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
   4116  1.1     skrll 	      == *count);
   4117  1.1     skrll }
   4118  1.1     skrll 
   4119  1.1     skrll static void
   4120  1.1     skrll mips_elf64_write_rela (bfd *abfd, asection *sec,
   4121  1.1     skrll 		       Elf_Internal_Shdr *rela_hdr,
   4122  1.1     skrll 		       int *count, void *data)
   4123  1.1     skrll {
   4124  1.1     skrll   bfd_boolean *failedp = data;
   4125  1.1     skrll   Elf64_Mips_External_Rela *ext_rela;
   4126  1.1     skrll   unsigned int idx;
   4127  1.1     skrll   asymbol *last_sym = 0;
   4128  1.1     skrll   int last_sym_idx = 0;
   4129  1.1     skrll 
   4130  1.1     skrll   rela_hdr->sh_size = rela_hdr->sh_entsize * *count;
   4131  1.1     skrll   rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
   4132  1.1     skrll   if (rela_hdr->contents == NULL)
   4133  1.1     skrll     {
   4134  1.1     skrll       *failedp = TRUE;
   4135  1.1     skrll       return;
   4136  1.1     skrll     }
   4137  1.1     skrll 
   4138  1.1     skrll   ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
   4139  1.1     skrll   for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
   4140  1.1     skrll     {
   4141  1.1     skrll       arelent *ptr;
   4142  1.1     skrll       Elf64_Mips_Internal_Rela int_rela;
   4143  1.1     skrll       asymbol *sym;
   4144  1.1     skrll       int n;
   4145  1.1     skrll       unsigned int i;
   4146  1.1     skrll 
   4147  1.1     skrll       ptr = sec->orelocation[idx];
   4148  1.1     skrll 
   4149  1.1     skrll       /* The address of an ELF reloc is section relative for an object
   4150  1.1     skrll 	 file, and absolute for an executable file or shared library.
   4151  1.1     skrll 	 The address of a BFD reloc is always section relative.  */
   4152  1.1     skrll       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
   4153  1.1     skrll 	int_rela.r_offset = ptr->address;
   4154  1.1     skrll       else
   4155  1.1     skrll 	int_rela.r_offset = ptr->address + sec->vma;
   4156  1.1     skrll 
   4157  1.1     skrll       sym = *ptr->sym_ptr_ptr;
   4158  1.1     skrll       if (sym == last_sym)
   4159  1.1     skrll 	n = last_sym_idx;
   4160  1.1     skrll       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
   4161  1.1     skrll 	n = STN_UNDEF;
   4162  1.1     skrll       else
   4163  1.1     skrll 	{
   4164  1.1     skrll 	  last_sym = sym;
   4165  1.1     skrll 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
   4166  1.1     skrll 	  if (n < 0)
   4167  1.1     skrll 	    {
   4168  1.1     skrll 	      *failedp = TRUE;
   4169  1.1     skrll 	      return;
   4170  1.1     skrll 	    }
   4171  1.1     skrll 	  last_sym_idx = n;
   4172  1.1     skrll 	}
   4173  1.1     skrll 
   4174  1.1     skrll       int_rela.r_sym = n;
   4175  1.1     skrll       int_rela.r_addend = ptr->addend;
   4176  1.1     skrll       int_rela.r_ssym = RSS_UNDEF;
   4177  1.1     skrll 
   4178  1.1     skrll       if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
   4179  1.1     skrll 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
   4180  1.1     skrll 	{
   4181  1.1     skrll 	  *failedp = TRUE;
   4182  1.1     skrll 	  return;
   4183  1.1     skrll 	}
   4184  1.1     skrll 
   4185  1.1     skrll       int_rela.r_type = ptr->howto->type;
   4186  1.1     skrll       int_rela.r_type2 = (int) R_MIPS_NONE;
   4187  1.1     skrll       int_rela.r_type3 = (int) R_MIPS_NONE;
   4188  1.1     skrll 
   4189  1.1     skrll       for (i = 0; i < 2; i++)
   4190  1.1     skrll 	{
   4191  1.1     skrll 	  arelent *r;
   4192  1.1     skrll 
   4193  1.1     skrll 	  if (idx + 1 >= sec->reloc_count)
   4194  1.1     skrll 	    break;
   4195  1.1     skrll 	  r = sec->orelocation[idx + 1];
   4196  1.1     skrll 	  if (r->address != ptr->address
   4197  1.1     skrll 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
   4198  1.1     skrll 	      || (*r->sym_ptr_ptr)->value != 0)
   4199  1.1     skrll 	    break;
   4200  1.1     skrll 
   4201  1.1     skrll 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
   4202  1.1     skrll 
   4203  1.1     skrll 	  if (i == 0)
   4204  1.1     skrll 	    int_rela.r_type2 = r->howto->type;
   4205  1.1     skrll 	  else
   4206  1.1     skrll 	    int_rela.r_type3 = r->howto->type;
   4207  1.1     skrll 
   4208  1.1     skrll 	  ++idx;
   4209  1.1     skrll 	}
   4210  1.1     skrll 
   4211  1.1     skrll       mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
   4212  1.1     skrll     }
   4213  1.1     skrll 
   4214  1.1     skrll   BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
   4215  1.1     skrll 	      == *count);
   4216  1.1     skrll }
   4217  1.1     skrll 
   4218  1.1     skrll /* Set the right machine number for a MIPS ELF file.  */
   4220  1.1     skrll 
   4221  1.1     skrll static bfd_boolean
   4222  1.1     skrll mips_elf64_object_p (bfd *abfd)
   4223  1.1     skrll {
   4224  1.1     skrll   unsigned long mach;
   4225  1.1     skrll 
   4226  1.1     skrll   /* Irix 6 is broken.  Object file symbol tables are not always
   4227  1.1     skrll      sorted correctly such that local symbols precede global symbols,
   4228  1.1     skrll      and the sh_info field in the symbol table is not always right.  */
   4229  1.2     skrll   if (elf64_mips_irix_compat (abfd) != ict_none)
   4230  1.2     skrll     elf_bad_symtab (abfd) = TRUE;
   4231  1.2     skrll 
   4232  1.2     skrll   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
   4233  1.2     skrll   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
   4234  1.2     skrll   return TRUE;
   4235  1.2     skrll }
   4236  1.1     skrll 
   4237  1.2     skrll /* MIPS ELF local labels start with "$L".  */
   4239  1.2     skrll static bfd_boolean
   4240  1.2     skrll mips_elf64_is_local_label_name (bfd *abfd, const char *name)
   4241  1.1     skrll {
   4242  1.1     skrll   if (name[0] == '$' && name[1] == 'L')
   4243  1.1     skrll     return TRUE;
   4244  1.1     skrll 
   4245  1.1     skrll   /* We accept the generic ELF local label syntax as well.  */
   4246  1.6  christos   return _bfd_elf_is_local_label_name (abfd, name);
   4247  1.6  christos }
   4248  1.1     skrll 
   4249  1.1     skrll /* Depending on the target vector we generate some version of Irix
   4251  1.1     skrll    executables or "normal" MIPS ELF ABI executables.  */
   4252  1.1     skrll static irix_compat_t
   4253  1.1     skrll elf64_mips_irix_compat (bfd *abfd)
   4254  1.1     skrll {
   4255  1.1     skrll   if ((abfd->xvec == &mips_elf64_be_vec)
   4256  1.1     skrll       || (abfd->xvec == &mips_elf64_le_vec))
   4257  1.1     skrll     return ict_irix6;
   4258  1.1     skrll   else
   4259  1.1     skrll     return ict_none;
   4260  1.1     skrll }
   4261  1.1     skrll 
   4262  1.1     skrll /* Support for core dump NOTE sections.  */
   4264  1.1     skrll static bfd_boolean
   4265  1.1     skrll elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   4266  1.1     skrll {
   4267  1.6  christos   int offset;
   4268  1.1     skrll   unsigned int size;
   4269  1.1     skrll 
   4270  1.6  christos   switch (note->descsz)
   4271  1.1     skrll     {
   4272  1.1     skrll       default:
   4273  1.1     skrll 	return FALSE;
   4274  1.1     skrll 
   4275  1.1     skrll       case 480:		/* Linux/MIPS - N64 kernel */
   4276  1.1     skrll 	/* pr_cursig */
   4277  1.1     skrll 	elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
   4278  1.1     skrll 
   4279  1.1     skrll 	/* pr_pid */
   4280  1.1     skrll 	elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
   4281  1.1     skrll 
   4282  1.1     skrll 	/* pr_reg */
   4283  1.1     skrll 	offset = 112;
   4284  1.1     skrll 	size = 360;
   4285  1.1     skrll 
   4286  1.1     skrll 	break;
   4287  1.1     skrll     }
   4288  1.1     skrll 
   4289  1.1     skrll   /* Make a ".reg/999" section.  */
   4290  1.1     skrll   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
   4291  1.1     skrll 					  size, note->descpos + offset);
   4292  1.1     skrll }
   4293  1.6  christos 
   4294  1.1     skrll static bfd_boolean
   4295  1.6  christos elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   4296  1.1     skrll {
   4297  1.1     skrll   switch (note->descsz)
   4298  1.1     skrll     {
   4299  1.1     skrll       default:
   4300  1.1     skrll 	return FALSE;
   4301  1.1     skrll 
   4302  1.1     skrll       case 136:		/* Linux/MIPS - N64 kernel elf_prpsinfo */
   4303  1.1     skrll 	elf_tdata (abfd)->core->program
   4304  1.6  christos 	 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
   4305  1.1     skrll 	elf_tdata (abfd)->core->command
   4306  1.1     skrll 	 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
   4307  1.1     skrll     }
   4308  1.1     skrll 
   4309  1.1     skrll   /* Note that for some reason, a spurious space is tacked
   4310  1.1     skrll      onto the end of the args in some (at least one anyway)
   4311  1.1     skrll      implementations, so strip it off if it exists.  */
   4312  1.1     skrll 
   4313  1.1     skrll   {
   4314  1.1     skrll     char *command = elf_tdata (abfd)->core->command;
   4315  1.1     skrll     int n = strlen (command);
   4316  1.1     skrll 
   4317  1.1     skrll     if (0 < n && command[n - 1] == ' ')
   4318  1.1     skrll       command[n - 1] = '\0';
   4319  1.1     skrll   }
   4320  1.1     skrll 
   4321  1.1     skrll   return TRUE;
   4322  1.1     skrll }
   4323  1.1     skrll 
   4324  1.1     skrll /* ECOFF swapping routines.  These are used when dealing with the
   4326  1.1     skrll    .mdebug section, which is in the ECOFF debugging format.  */
   4327  1.1     skrll static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
   4328  1.1     skrll {
   4329  1.1     skrll   /* Symbol table magic number.  */
   4330  1.1     skrll   magicSym2,
   4331  1.1     skrll   /* Alignment of debugging information.  E.g., 4.  */
   4332  1.1     skrll   8,
   4333  1.1     skrll   /* Sizes of external symbolic information.  */
   4334  1.1     skrll   sizeof (struct hdr_ext),
   4335  1.1     skrll   sizeof (struct dnr_ext),
   4336  1.1     skrll   sizeof (struct pdr_ext),
   4337  1.1     skrll   sizeof (struct sym_ext),
   4338  1.1     skrll   sizeof (struct opt_ext),
   4339  1.1     skrll   sizeof (struct fdr_ext),
   4340  1.1     skrll   sizeof (struct rfd_ext),
   4341  1.1     skrll   sizeof (struct ext_ext),
   4342  1.1     skrll   /* Functions to swap in external symbolic data.  */
   4343  1.1     skrll   ecoff_swap_hdr_in,
   4344  1.1     skrll   ecoff_swap_dnr_in,
   4345  1.1     skrll   ecoff_swap_pdr_in,
   4346  1.1     skrll   ecoff_swap_sym_in,
   4347  1.1     skrll   ecoff_swap_opt_in,
   4348  1.1     skrll   ecoff_swap_fdr_in,
   4349  1.1     skrll   ecoff_swap_rfd_in,
   4350  1.1     skrll   ecoff_swap_ext_in,
   4351  1.1     skrll   _bfd_ecoff_swap_tir_in,
   4352  1.1     skrll   _bfd_ecoff_swap_rndx_in,
   4353  1.1     skrll   /* Functions to swap out external symbolic data.  */
   4354  1.1     skrll   ecoff_swap_hdr_out,
   4355  1.1     skrll   ecoff_swap_dnr_out,
   4356  1.1     skrll   ecoff_swap_pdr_out,
   4357  1.1     skrll   ecoff_swap_sym_out,
   4358  1.1     skrll   ecoff_swap_opt_out,
   4359  1.1     skrll   ecoff_swap_fdr_out,
   4360  1.1     skrll   ecoff_swap_rfd_out,
   4361  1.1     skrll   ecoff_swap_ext_out,
   4362  1.1     skrll   _bfd_ecoff_swap_tir_out,
   4363  1.1     skrll   _bfd_ecoff_swap_rndx_out,
   4364  1.1     skrll   /* Function to read in symbolic data.  */
   4365  1.1     skrll   _bfd_mips_elf_read_ecoff_info
   4366  1.1     skrll };
   4367  1.1     skrll 
   4368  1.1     skrll /* Relocations in the 64 bit MIPS ELF ABI are more complex than in
   4370  1.1     skrll    standard ELF.  This structure is used to redirect the relocation
   4371  1.1     skrll    handling routines.  */
   4372  1.1     skrll 
   4373  1.1     skrll const struct elf_size_info mips_elf64_size_info =
   4374  1.1     skrll {
   4375  1.1     skrll   sizeof (Elf64_External_Ehdr),
   4376  1.1     skrll   sizeof (Elf64_External_Phdr),
   4377  1.1     skrll   sizeof (Elf64_External_Shdr),
   4378  1.1     skrll   sizeof (Elf64_Mips_External_Rel),
   4379  1.1     skrll   sizeof (Elf64_Mips_External_Rela),
   4380  1.1     skrll   sizeof (Elf64_External_Sym),
   4381  1.1     skrll   sizeof (Elf64_External_Dyn),
   4382  1.1     skrll   sizeof (Elf_External_Note),
   4383  1.1     skrll   4,		/* hash-table entry size */
   4384  1.1     skrll   3,		/* internal relocations per external relocations */
   4385  1.1     skrll   64,		/* arch_size */
   4386  1.1     skrll   3,		/* log_file_align */
   4387  1.1     skrll   ELFCLASS64,
   4388  1.1     skrll   EV_CURRENT,
   4389  1.1     skrll   bfd_elf64_write_out_phdrs,
   4390  1.1     skrll   bfd_elf64_write_shdrs_and_ehdr,
   4391  1.1     skrll   bfd_elf64_checksum_contents,
   4392  1.1     skrll   mips_elf64_write_relocs,
   4393  1.1     skrll   bfd_elf64_swap_symbol_in,
   4394  1.3  christos   bfd_elf64_swap_symbol_out,
   4395  1.1     skrll   mips_elf64_slurp_reloc_table,
   4396  1.1     skrll   bfd_elf64_slurp_symbol_table,
   4397  1.1     skrll   bfd_elf64_swap_dyn_in,
   4398  1.1     skrll   bfd_elf64_swap_dyn_out,
   4399  1.1     skrll   mips_elf64_be_swap_reloc_in,
   4400  1.6  christos   mips_elf64_be_swap_reloc_out,
   4401  1.6  christos   mips_elf64_be_swap_reloca_in,
   4402  1.1     skrll   mips_elf64_be_swap_reloca_out
   4403  1.1     skrll };
   4404  1.1     skrll 
   4405  1.1     skrll #define ELF_ARCH			bfd_arch_mips
   4406  1.1     skrll #define ELF_TARGET_ID			MIPS_ELF_DATA
   4407  1.1     skrll #define ELF_MACHINE_CODE		EM_MIPS
   4408  1.1     skrll 
   4409  1.1     skrll #define elf_backend_collect		TRUE
   4410  1.1     skrll #define elf_backend_type_change_ok	TRUE
   4411  1.1     skrll #define elf_backend_can_gc_sections	TRUE
   4412  1.1     skrll #define elf_backend_gc_mark_extra_sections \
   4413  1.1     skrll 					_bfd_mips_elf_gc_mark_extra_sections
   4414  1.1     skrll #define elf_info_to_howto		mips_elf64_info_to_howto_rela
   4415  1.1     skrll #define elf_info_to_howto_rel		mips_elf64_info_to_howto_rel
   4416  1.1     skrll #define elf_backend_object_p		mips_elf64_object_p
   4417  1.1     skrll #define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing
   4418  1.1     skrll #define elf_backend_section_processing	_bfd_mips_elf_section_processing
   4419  1.1     skrll #define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr
   4420  1.1     skrll #define elf_backend_fake_sections	_bfd_mips_elf_fake_sections
   4421  1.1     skrll #define elf_backend_section_from_bfd_section \
   4422  1.1     skrll 				_bfd_mips_elf_section_from_bfd_section
   4423  1.1     skrll #define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook
   4424  1.1     skrll #define elf_backend_link_output_symbol_hook \
   4425  1.1     skrll 				_bfd_mips_elf_link_output_symbol_hook
   4426  1.1     skrll #define elf_backend_create_dynamic_sections \
   4427  1.1     skrll 				_bfd_mips_elf_create_dynamic_sections
   4428  1.1     skrll #define elf_backend_check_relocs	_bfd_mips_elf_check_relocs
   4429  1.1     skrll #define elf_backend_merge_symbol_attribute \
   4430  1.1     skrll 				_bfd_mips_elf_merge_symbol_attribute
   4431  1.1     skrll #define elf_backend_get_target_dtag	_bfd_mips_elf_get_target_dtag
   4432  1.1     skrll #define elf_backend_adjust_dynamic_symbol \
   4433  1.1     skrll 				_bfd_mips_elf_adjust_dynamic_symbol
   4434  1.1     skrll #define elf_backend_always_size_sections \
   4435  1.1     skrll 				_bfd_mips_elf_always_size_sections
   4436  1.1     skrll #define elf_backend_size_dynamic_sections \
   4437  1.1     skrll 				_bfd_mips_elf_size_dynamic_sections
   4438  1.1     skrll #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
   4439  1.1     skrll #define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
   4440  1.1     skrll #define elf_backend_finish_dynamic_symbol \
   4441  1.1     skrll 				_bfd_mips_elf_finish_dynamic_symbol
   4442  1.1     skrll #define elf_backend_finish_dynamic_sections \
   4443  1.1     skrll 				_bfd_mips_elf_finish_dynamic_sections
   4444  1.1     skrll #define elf_backend_final_write_processing \
   4445  1.1     skrll 				_bfd_mips_elf_final_write_processing
   4446  1.1     skrll #define elf_backend_additional_program_headers \
   4447  1.1     skrll 				_bfd_mips_elf_additional_program_headers
   4448  1.1     skrll #define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map
   4449  1.1     skrll #define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook
   4450  1.1     skrll #define elf_backend_gc_sweep_hook	_bfd_mips_elf_gc_sweep_hook
   4451  1.4  christos #define elf_backend_copy_indirect_symbol \
   4452  1.1     skrll 					_bfd_mips_elf_copy_indirect_symbol
   4453  1.1     skrll #define elf_backend_ignore_discarded_relocs \
   4454  1.1     skrll 					_bfd_mips_elf_ignore_discarded_relocs
   4455  1.1     skrll #define elf_backend_mips_irix_compat	elf64_mips_irix_compat
   4456  1.1     skrll #define elf_backend_mips_rtype_to_howto	mips_elf64_rtype_to_howto
   4457  1.1     skrll #define elf_backend_ecoff_debug_swap	&mips_elf64_ecoff_debug_swap
   4458  1.1     skrll #define elf_backend_size_info		mips_elf64_size_info
   4459  1.1     skrll 
   4460  1.1     skrll #define elf_backend_grok_prstatus	elf64_mips_grok_prstatus
   4461  1.1     skrll #define elf_backend_grok_psinfo		elf64_mips_grok_psinfo
   4462  1.1     skrll 
   4463  1.1     skrll #define elf_backend_got_header_size	(8 * MIPS_RESERVED_GOTNO)
   4464  1.1     skrll 
   4465  1.6  christos /* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
   4466  1.1     skrll    work better/work only in RELA, so we default to this.  */
   4467  1.5     skrll #define elf_backend_may_use_rel_p	1
   4468  1.5     skrll #define elf_backend_may_use_rela_p	1
   4469  1.4  christos #define elf_backend_default_use_rela_p	1
   4470  1.4  christos #define elf_backend_rela_plts_and_copies_p 0
   4471  1.1     skrll #define elf_backend_plt_readonly	1
   4472  1.1     skrll #define elf_backend_plt_sym_val		_bfd_mips_elf_plt_sym_val
   4473  1.1     skrll 
   4474  1.1     skrll #define elf_backend_sign_extend_vma	TRUE
   4475  1.1     skrll 
   4476  1.1     skrll #define elf_backend_write_section	_bfd_mips_elf_write_section
   4477  1.1     skrll #define elf_backend_sort_relocs_p	_bfd_mips_elf_sort_relocs_p
   4478  1.1     skrll 
   4479  1.1     skrll #define bfd_elf64_bfd_is_local_label_name \
   4480  1.1     skrll 					mips_elf64_is_local_label_name
   4481  1.1     skrll #define bfd_elf64_bfd_is_target_special_symbol \
   4482  1.1     skrll 					_bfd_mips_elf_is_target_special_symbol
   4483  1.1     skrll #define bfd_elf64_find_nearest_line	_bfd_mips_elf_find_nearest_line
   4484  1.1     skrll #define bfd_elf64_find_inliner_info	_bfd_mips_elf_find_inliner_info
   4485  1.1     skrll #define bfd_elf64_new_section_hook	_bfd_mips_elf_new_section_hook
   4486  1.1     skrll #define bfd_elf64_set_section_contents	_bfd_mips_elf_set_section_contents
   4487  1.1     skrll #define bfd_elf64_bfd_get_relocated_section_contents \
   4488  1.1     skrll 				_bfd_elf_mips_get_relocated_section_contents
   4489  1.1     skrll #define bfd_elf64_bfd_link_hash_table_create \
   4490  1.1     skrll 				_bfd_mips_elf_link_hash_table_create
   4491  1.6  christos #define bfd_elf64_bfd_final_link	_bfd_mips_elf_final_link
   4492  1.1     skrll #define bfd_elf64_bfd_merge_private_bfd_data \
   4493  1.1     skrll 				_bfd_mips_elf_merge_private_bfd_data
   4494  1.1     skrll #define bfd_elf64_bfd_set_private_flags	_bfd_mips_elf_set_private_flags
   4495  1.1     skrll #define bfd_elf64_bfd_print_private_bfd_data \
   4496  1.1     skrll 				_bfd_mips_elf_print_private_bfd_data
   4497  1.1     skrll 
   4498  1.1     skrll #define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound
   4499  1.1     skrll #define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc
   4500  1.1     skrll #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
   4501  1.1     skrll #define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc
   4502  1.1     skrll #define bfd_elf64_bfd_relax_section     _bfd_mips_relax_section
   4503  1.1     skrll #define bfd_elf64_mkobject		_bfd_mips_elf_mkobject
   4504  1.1     skrll 
   4505  1.1     skrll /* MIPS ELF64 archive functions.  */
   4506  1.3  christos #define bfd_elf64_archive_functions
   4507  1.1     skrll extern bfd_boolean bfd_elf64_archive_slurp_armap
   4508  1.1     skrll   (bfd *);
   4509  1.1     skrll extern bfd_boolean bfd_elf64_archive_write_armap
   4510  1.1     skrll   (bfd *, unsigned int, struct orl *, unsigned int, int);
   4511  1.1     skrll #define bfd_elf64_archive_slurp_extended_name_table \
   4512  1.1     skrll 			_bfd_archive_coff_slurp_extended_name_table
   4513  1.1     skrll #define bfd_elf64_archive_construct_extended_name_table \
   4514  1.1     skrll 			_bfd_archive_coff_construct_extended_name_table
   4515  1.1     skrll #define bfd_elf64_archive_truncate_arname \
   4516  1.1     skrll 			_bfd_archive_coff_truncate_arname
   4517  1.6  christos #define bfd_elf64_archive_read_ar_hdr	_bfd_archive_coff_read_ar_hdr
   4518  1.1     skrll #define bfd_elf64_archive_write_ar_hdr	_bfd_archive_coff_write_ar_hdr
   4519  1.6  christos #define bfd_elf64_archive_openr_next_archived_file \
   4520  1.1     skrll 			_bfd_archive_coff_openr_next_archived_file
   4521  1.1     skrll #define bfd_elf64_archive_get_elt_at_index \
   4522  1.1     skrll 			_bfd_archive_coff_get_elt_at_index
   4523  1.1     skrll #define bfd_elf64_archive_generic_stat_arch_elt \
   4524  1.1     skrll 			_bfd_archive_coff_generic_stat_arch_elt
   4525  1.1     skrll #define bfd_elf64_archive_update_armap_timestamp \
   4526  1.1     skrll 			_bfd_archive_coff_update_armap_timestamp
   4527  1.1     skrll 
   4528  1.1     skrll /* The SGI style (n)64 NewABI.  */
   4529  1.1     skrll #define TARGET_LITTLE_SYM		mips_elf64_le_vec
   4530  1.1     skrll #define TARGET_LITTLE_NAME		"elf64-littlemips"
   4531  1.1     skrll #define TARGET_BIG_SYM			mips_elf64_be_vec
   4532  1.1     skrll #define TARGET_BIG_NAME			"elf64-bigmips"
   4533  1.1     skrll 
   4534  1.1     skrll #define ELF_MAXPAGESIZE			0x10000
   4535  1.1     skrll #define ELF_COMMONPAGESIZE		0x1000
   4536  1.6  christos 
   4537  1.1     skrll #include "elf64-target.h"
   4538  1.6  christos 
   4539  1.1     skrll /* The SYSV-style 'traditional' (n)64 NewABI.  */
   4540  1.1     skrll #undef TARGET_LITTLE_SYM
   4541  1.1     skrll #undef TARGET_LITTLE_NAME
   4542  1.1     skrll #undef TARGET_BIG_SYM
   4543  1.1     skrll #undef TARGET_BIG_NAME
   4544  1.1     skrll 
   4545  1.1     skrll #undef ELF_MAXPAGESIZE
   4546  1.1     skrll #undef ELF_COMMONPAGESIZE
   4547  1.4  christos 
   4548  1.4  christos #define TARGET_LITTLE_SYM		mips_elf64_trad_le_vec
   4549  1.4  christos #define TARGET_LITTLE_NAME		"elf64-tradlittlemips"
   4550  1.4  christos #define TARGET_BIG_SYM			mips_elf64_trad_be_vec
   4551  1.4  christos #define TARGET_BIG_NAME			"elf64-tradbigmips"
   4552  1.4  christos 
   4553  1.4  christos #define ELF_MAXPAGESIZE			0x10000
   4554  1.4  christos #define ELF_COMMONPAGESIZE		0x1000
   4555  1.4  christos #define elf64_bed			elf64_tradbed
   4556  1.6  christos 
   4557  1.4  christos /* Include the target file again for this target.  */
   4558  1.6  christos #include "elf64-target.h"
   4559  1.4  christos 
   4560  1.4  christos 
   4561  1.4  christos /* FreeBSD support.  */
   4562  1.4  christos 
   4563  1.4  christos #undef TARGET_LITTLE_SYM
   4564  1.4  christos #undef TARGET_LITTLE_NAME
   4565  1.4  christos #undef TARGET_BIG_SYM
   4566  1.4  christos #undef TARGET_BIG_NAME
   4567  1.4  christos 
   4568                #define	TARGET_LITTLE_SYM		mips_elf64_tradfbsd_le_vec
   4569                #define	TARGET_LITTLE_NAME		"elf64-tradlittlemips-freebsd"
   4570                #define	TARGET_BIG_SYM			mips_elf64_tradfbsd_be_vec
   4571                #define	TARGET_BIG_NAME			"elf64-tradbigmips-freebsd"
   4572                
   4573                #undef	ELF_OSABI
   4574                #define	ELF_OSABI			ELFOSABI_FREEBSD
   4575                
   4576                #undef	elf64_bed
   4577                #define elf64_bed				elf64_fbsd_tradbed
   4578                
   4579                #include "elf64-target.h"
   4580