fix more risc-v compiler bugs
[akaros.git] / tools / compilers / gcc-glibc / binutils-2.21.1-riscv.patch
1 diff --git a/binutils-2.21.1/bfd/archures.c b/binutils-2.21.1/bfd/archures.c
2 index 1867154..ae47b0c 100644
3 --- a/binutils-2.21.1/bfd/archures.c
4 +++ binutils-2.21.1/bfd/archures.c
5 @@ -515,6 +515,7 @@ extern const bfd_arch_info_type bfd_pj_arch;
6  extern const bfd_arch_info_type bfd_plugin_arch;
7  extern const bfd_arch_info_type bfd_powerpc_archs[];
8  #define bfd_powerpc_arch bfd_powerpc_archs[0]
9 +extern const bfd_arch_info_type bfd_riscv_arch;
10  extern const bfd_arch_info_type bfd_rs6000_arch;
11  extern const bfd_arch_info_type bfd_rx_arch;
12  extern const bfd_arch_info_type bfd_s390_arch;
13 @@ -589,6 +590,7 @@ static const bfd_arch_info_type * const bfd_archures_list[] =
14      &bfd_or32_arch,
15      &bfd_pdp11_arch,
16      &bfd_powerpc_arch,
17 +    &bfd_riscv_arch,
18      &bfd_rs6000_arch,
19      &bfd_rx_arch,
20      &bfd_s390_arch,
21 diff --git a/binutils-2.21.1/bfd/bfd-in2.h b/binutils-2.21.1/bfd/bfd-in2.h
22 index 59b1b8f..f7b7c3a 100644
23 --- a/binutils-2.21.1/bfd/bfd-in2.h
24 +++ binutils-2.21.1/bfd/bfd-in2.h
25 @@ -1919,6 +1919,9 @@ enum bfd_architecture
26  #define bfd_mach_ppc_e500mc    5001
27  #define bfd_mach_ppc_e500mc64  5005
28  #define bfd_mach_ppc_titan     83
29 +  bfd_arch_riscv, /* RISC-V */
30 +#define bfd_mach_riscv_rocket32 132
31 +#define bfd_mach_riscv_rocket64 164
32    bfd_arch_rs6000,    /* IBM RS/6000 */
33  #define bfd_mach_rs6k          6000
34  #define bfd_mach_rs6k_rs1      6001
35 @@ -4761,6 +4764,14 @@ relative offset from _GLOBAL_OFFSET_TABLE_  */
36  value in a word.  The relocation is relative offset from  */
37    BFD_RELOC_MICROBLAZE_32_GOTOFF,
38  
39 +  /* RISC-V relocations */
40 +  BFD_RELOC_RISCV_TLS_GOT_HI16,
41 +  BFD_RELOC_RISCV_TLS_GOT_LO16,
42 +  BFD_RELOC_RISCV_TLS_GD_HI16,
43 +  BFD_RELOC_RISCV_TLS_GD_LO16,
44 +  BFD_RELOC_RISCV_TLS_LDM_HI16,
45 +  BFD_RELOC_RISCV_TLS_LDM_LO16,
46 +
47  /* This is used to tell the dynamic linker to copy the value out of
48  the dynamic object into the runtime process image.  */
49    BFD_RELOC_MICROBLAZE_COPY,
50 diff --git a/binutils-2.21.1/bfd/config.bfd b/binutils-2.21.1/bfd/config.bfd
51 index fbf77ad..5c5535e 100644
52 --- a/binutils-2.21.1/bfd/config.bfd
53 +++ binutils-2.21.1/bfd/config.bfd
54 @@ -96,6 +96,7 @@ or32*)                 targ_archs=bfd_or32_arch ;;
55  pdp11*)                 targ_archs=bfd_pdp11_arch ;;
56  pj*)            targ_archs="bfd_pj_arch bfd_i386_arch";;
57  powerpc*)       targ_archs="bfd_rs6000_arch bfd_powerpc_arch" ;;
58 +riscv*)                 targ_archs=bfd_riscv_arch ;;
59  rs6000)                 targ_archs="bfd_rs6000_arch bfd_powerpc_arch" ;;
60  s390*)          targ_archs=bfd_s390_arch ;;
61  sh*)            targ_archs=bfd_sh_arch ;;
62 @@ -1193,6 +1194,14 @@ case "${targ}" in
63      targ_selvecs="bfd_powerpcle_pei_vec bfd_powerpc_pei_vec bfd_powerpcle_pe_vec bfd_powerpc_pe_vec"
64      ;;
65  
66 +#ifdef BFD64
67 +  riscv*-*-*)
68 +    targ_defvec=bfd_elf64_littleriscv_vec
69 +    targ_selvecs="bfd_elf32_littleriscv_vec bfd_elf64_littleriscv_vec"
70 +    want64=true
71 +    ;;
72 +#endif
73 +
74    rx-*-elf)
75      targ_defvec=bfd_elf32_rx_le_vec
76      targ_selvecs="bfd_elf32_rx_be_vec bfd_elf32_rx_le_vec"
77 diff --git a/binutils-2.21.1/bfd/configure b/binutils-2.21.1/bfd/configure
78 index 4675ad2..e882968 100755
79 --- a/binutils-2.21.1/bfd/configure
80 +++ binutils-2.21.1/bfd/configure
81 @@ -15239,6 +15239,7 @@ do
82      bfd_elf32_littlemips_vec)  tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
83      bfd_elf32_littlemips_vxworks_vec)
84                                 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
85 +    bfd_elf32_littleriscv_vec)         tb="$tb elf32-riscv.lo elfxx-riscv.lo elf32.lo $elf ecofflink.lo" ;;
86      bfd_elf32_m32c_vec)         tb="$tb elf32-m32c.lo elf32.lo $elf" ;;
87      bfd_elf32_m32r_vec)                tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
88      bfd_elf32_m32rle_vec)       tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
89 @@ -15320,6 +15321,7 @@ do
90      bfd_elf64_ia64_vms_vec)    tb="$tb elf64-ia64.lo elf64.lo vms-lib.lo vms-misc.lo $elf"; target_size=64 ;;
91      bfd_elf64_little_generic_vec) tb="$tb elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
92      bfd_elf64_littlemips_vec)  tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
93 +    bfd_elf64_littleriscv_vec)         tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
94      bfd_elf64_mmix_vec)        tb="$tb elf64-mmix.lo elf64.lo $elf" target_size=64 ;;
95      bfd_elf64_powerpc_vec)     tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
96      bfd_elf64_powerpcle_vec)   tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
97 diff --git a/binutils-2.21.1/bfd/configure.in b/binutils-2.21.1/bfd/configure.in
98 index 9f6d7a9..617b5df 100644
99 --- a/binutils-2.21.1/bfd/configure.in
100 +++ binutils-2.21.1/bfd/configure.in
101 @@ -730,6 +730,7 @@ do
102      bfd_elf32_littlemips_vec)  tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
103      bfd_elf32_littlemips_vxworks_vec)
104                                 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
105 +    bfd_elf32_littleriscv_vec)         tb="$tb elf32-riscv.lo elfxx-riscv.lo elf32.lo $elf ecofflink.lo" ;;
106      bfd_elf32_m32c_vec)         tb="$tb elf32-m32c.lo elf32.lo $elf" ;;
107      bfd_elf32_m32r_vec)                tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
108      bfd_elf32_m32rle_vec)       tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
109 @@ -811,6 +812,7 @@ do
110      bfd_elf64_ia64_vms_vec)    tb="$tb elf64-ia64.lo elf64.lo vms-lib.lo vms-misc.lo $elf"; target_size=64 ;;
111      bfd_elf64_little_generic_vec) tb="$tb elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
112      bfd_elf64_littlemips_vec)  tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
113 +    bfd_elf64_littleriscv_vec)         tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
114      bfd_elf64_mmix_vec)        tb="$tb elf64-mmix.lo elf64.lo $elf" target_size=64 ;;
115      bfd_elf64_powerpc_vec)     tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
116      bfd_elf64_powerpcle_vec)   tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
117 diff --git a/binutils-2.21.1/bfd/cpu-riscv.c b/binutils-2.21.1/bfd/cpu-riscv.c
118 new file mode 100644
119 index 0000000..22edee7
120 --- /dev/null
121 +++ binutils-2.21.1/bfd/cpu-riscv.c
122 @@ -0,0 +1,78 @@
123 +/* bfd back-end for mips support
124 +   Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001,
125 +   2002, 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
126 +   Written by Steve Chamberlain of Cygnus Support.
127 +
128 +   This file is part of BFD, the Binary File Descriptor library.
129 +
130 +   This program is free software; you can redistribute it and/or modify
131 +   it under the terms of the GNU General Public License as published by
132 +   the Free Software Foundation; either version 3 of the License, or
133 +   (at your option) any later version.
134 +
135 +   This program is distributed in the hope that it will be useful,
136 +   but WITHOUT ANY WARRANTY; without even the implied warranty of
137 +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
138 +   GNU General Public License for more details.
139 +
140 +   You should have received a copy of the GNU General Public License
141 +   along with this program; if not, write to the Free Software
142 +   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
143 +   MA 02110-1301, USA.  */
144 +
145 +#include "sysdep.h"
146 +#include "bfd.h"
147 +#include "libbfd.h"
148 +
149 +static const bfd_arch_info_type *mips_compatible
150 +  (const bfd_arch_info_type *, const bfd_arch_info_type *);
151 +
152 +/* The default routine tests bits_per_word, which is wrong on mips as
153 +   mips word size doesn't correlate with reloc size.  */
154 +
155 +static const bfd_arch_info_type *
156 +mips_compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b)
157 +{
158 +  if (a->arch != b->arch)
159 +    return NULL;
160 +
161 +  /* Machine compatibility is checked in
162 +     _bfd_mips_elf_merge_private_bfd_data.  */
163 +
164 +  return a;
165 +}
166 +
167 +#define N(BITS_WORD, BITS_ADDR, NUMBER, PRINT, DEFAULT, NEXT)          \
168 +  {                                                    \
169 +    BITS_WORD, /*  bits in a word */                   \
170 +    BITS_ADDR, /* bits in an address */                        \
171 +    8, /* 8 bits in a byte */                          \
172 +    bfd_arch_riscv,                                    \
173 +    NUMBER,                                            \
174 +    "riscv",                                           \
175 +    PRINT,                                             \
176 +    3,                                                 \
177 +    DEFAULT,                                           \
178 +    mips_compatible,                                   \
179 +    bfd_default_scan,                                  \
180 +    NEXT,                                              \
181 +  }
182 +
183 +enum
184 +{
185 +  I_riscv_rocket64,
186 +  I_riscv_rocket32
187 +};
188 +
189 +#define NN(index) (&arch_info_struct[(index) + 1])
190 +
191 +static const bfd_arch_info_type arch_info_struct[] =
192 +{
193 +  N (64, 64, bfd_mach_riscv_rocket64, "riscv:rocket64", FALSE, NN(I_riscv_rocket64)),
194 +  N (32, 32, bfd_mach_riscv_rocket32, "riscv:rocket32", FALSE, 0)
195 +};
196 +
197 +/* The default architecture is riscv:rocket64. */
198 +
199 +const bfd_arch_info_type bfd_riscv_arch =
200 +N (64, 64, 0, "riscv", TRUE, &arch_info_struct[0]);
201 diff --git a/binutils-2.21.1/bfd/elf32-riscv.c b/binutils-2.21.1/bfd/elf32-riscv.c
202 new file mode 100644
203 index 0000000..7188663
204 --- /dev/null
205 +++ binutils-2.21.1/bfd/elf32-riscv.c
206 @@ -0,0 +1,2298 @@
207 +/* MIPS-specific support for 32-bit ELF
208 +   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
209 +   2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
210 +
211 +   Most of the information added by Ian Lance Taylor, Cygnus Support,
212 +   <ian@cygnus.com>.
213 +   N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
214 +   <mark@codesourcery.com>
215 +   Traditional MIPS targets support added by Koundinya.K, Dansk Data
216 +   Elektronik & Operations Research Group. <kk@ddeorg.soft.net>
217 +
218 +   This file is part of BFD, the Binary File Descriptor library.
219 +
220 +   This program is free software; you can redistribute it and/or modify
221 +   it under the terms of the GNU General Public License as published by
222 +   the Free Software Foundation; either version 3 of the License, or
223 +   (at your option) any later version.
224 +
225 +   This program is distributed in the hope that it will be useful,
226 +   but WITHOUT ANY WARRANTY; without even the implied warranty of
227 +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
228 +   GNU General Public License for more details.
229 +
230 +   You should have received a copy of the GNU General Public License
231 +   along with this program; if not, write to the Free Software
232 +   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
233 +   MA 02110-1301, USA.  */
234 +
235 +
236 +/* This file handles MIPS ELF targets.  SGI Irix 5 uses a slightly
237 +   different MIPS ELF from other targets.  This matters when linking.
238 +   This file supports both, switching at runtime.  */
239 +
240 +#include "sysdep.h"
241 +#include "bfd.h"
242 +#include "libbfd.h"
243 +#include "bfdlink.h"
244 +#include "genlink.h"
245 +#include "elf-bfd.h"
246 +#include "elfxx-riscv.h"
247 +#include "elf/riscv.h"
248 +#include "opcode/riscv.h"
249 +
250 +/* Get the ECOFF swapping routines.  */
251 +#include "coff/sym.h"
252 +#include "coff/symconst.h"
253 +#include "coff/internal.h"
254 +#include "coff/ecoff.h"
255 +#include "coff/mips.h"
256 +#define ECOFF_SIGNED_32
257 +#include "ecoffswap.h"
258 +
259 +#include "opcode/riscv.h"
260 +
261 +static bfd_boolean mips_elf_assign_gp
262 +  (bfd *, bfd_vma *);
263 +static bfd_reloc_status_type mips_elf_final_gp
264 +  (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
265 +static bfd_reloc_status_type mips_elf_gprel16_reloc
266 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
267 +static bfd_reloc_status_type mips_elf_literal_reloc
268 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
269 +static bfd_reloc_status_type mips_elf_gprel32_reloc
270 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
271 +static bfd_reloc_status_type gprel32_with_gp
272 +  (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma);
273 +static bfd_reloc_status_type mips16_gprel_reloc
274 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
275 +static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
276 +  (bfd *, bfd_reloc_code_real_type);
277 +static reloc_howto_type *mips_elf_n32_rtype_to_howto
278 +  (unsigned int, bfd_boolean);
279 +static void mips_info_to_howto_rel
280 +  (bfd *, arelent *, Elf_Internal_Rela *);
281 +static void mips_info_to_howto_rela
282 +  (bfd *, arelent *, Elf_Internal_Rela *);
283 +static bfd_boolean mips_elf_sym_is_global
284 +  (bfd *, asymbol *);
285 +static bfd_boolean mips_elf_n32_object_p
286 +  (bfd *);
287 +static bfd_boolean elf32_mips_grok_prstatus
288 +  (bfd *, Elf_Internal_Note *);
289 +static bfd_boolean elf32_mips_grok_psinfo
290 +  (bfd *, Elf_Internal_Note *);
291 +
292 +extern const bfd_target bfd_elf32_nbigmips_vec;
293 +extern const bfd_target bfd_elf32_nlittlemips_vec;
294 +
295 +/* Nonzero if ABFD is using the N32 ABI.  */
296 +#define ABI_N32_P(abfd) \
297 +  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
298 +
299 +/* The number of local .got entries we reserve.  */
300 +#define MIPS_RESERVED_GOTNO (2)
301 +
302 +/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
303 +   from smaller values.  Start with zero, widen, *then* decrement.  */
304 +#define MINUS_ONE      (((bfd_vma)0) - 1)
305 +
306 +/* The relocation table used for SHT_REL sections.  */
307 +
308 +static reloc_howto_type elf_mips_howto_table_rel[] =
309 +{
310 +  /* No relocation.  */
311 +  HOWTO (R_RISCV_NONE,         /* type */
312 +        0,                     /* rightshift */
313 +        0,                     /* size (0 = byte, 1 = short, 2 = long) */
314 +        0,                     /* bitsize */
315 +        FALSE,                 /* pc_relative */
316 +        0,                     /* bitpos */
317 +        complain_overflow_dont, /* complain_on_overflow */
318 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
319 +        "R_RISCV_NONE",                /* name */
320 +        FALSE,                 /* partial_inplace */
321 +        0,                     /* src_mask */
322 +        0,                     /* dst_mask */
323 +        FALSE),                /* pcrel_offset */
324 +
325 +  EMPTY_HOWTO (1),
326 +
327 +  /* 32 bit relocation.  */
328 +  HOWTO (R_RISCV_32,           /* type */
329 +        0,                     /* rightshift */
330 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
331 +        32,                    /* bitsize */
332 +        FALSE,                 /* pc_relative */
333 +        0,                     /* bitpos */
334 +        complain_overflow_dont, /* complain_on_overflow */
335 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
336 +        "R_RISCV_32",          /* name */
337 +        TRUE,                  /* partial_inplace */
338 +        0xffffffff,            /* src_mask */
339 +        0xffffffff,            /* dst_mask */
340 +        FALSE),                /* pcrel_offset */
341 +
342 +  /* 32 bit symbol relative relocation.  */
343 +  HOWTO (R_RISCV_REL32,                /* type */
344 +        0,                     /* rightshift */
345 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
346 +        32,                    /* bitsize */
347 +        FALSE,                 /* pc_relative */
348 +        0,                     /* bitpos */
349 +        complain_overflow_dont, /* complain_on_overflow */
350 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
351 +        "R_RISCV_REL32",       /* name */
352 +        TRUE,                  /* partial_inplace */
353 +        0xffffffff,            /* src_mask */
354 +        0xffffffff,            /* dst_mask */
355 +        FALSE),                /* pcrel_offset */
356 +
357 +  /* 26 bit jump address.  */
358 +  HOWTO (R_RISCV_26,           /* type */
359 +        RISCV_JUMP_ALIGN_BITS,                 /* rightshift */
360 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
361 +        RISCV_JUMP_BITS,                       /* bitsize */
362 +        TRUE,                  /* pc_relative */
363 +        OP_SH_TARGET,                  /* bitpos */
364 +        complain_overflow_dont, /* complain_on_overflow */
365 +                               /* This needs complex overflow
366 +                                  detection, because the upper 36
367 +                                  bits must match the PC + 4.  */
368 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
369 +        "R_RISCV_26",          /* name */
370 +        TRUE,                  /* partial_inplace */
371 +        ((1<<RISCV_JUMP_BITS)-1) << OP_SH_TARGET,              /* src_mask */
372 +        ((1<<RISCV_JUMP_BITS)-1) << OP_SH_TARGET,              /* dst_mask */
373 +        TRUE),         /* pcrel_offset */
374 +
375 +  /* R_RISCV_HI16 and R_RISCV_LO16 are unsupported for NewABI REL.
376 +     However, the native IRIX6 tools use them, so we try our best. */
377 +
378 +  /* High 16 bits of symbol value.  */
379 +  HOWTO (R_RISCV_HI16,         /* type */
380 +        RISCV_IMM_BITS,                        /* rightshift */
381 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
382 +        32-RISCV_IMM_BITS,                     /* bitsize */
383 +        FALSE,                 /* pc_relative */
384 +        OP_SH_BIGIMMEDIATE,                    /* bitpos */
385 +        complain_overflow_dont, /* complain_on_overflow */
386 +        _bfd_riscv_elf_hi16_reloc, /* special_function */
387 +        "R_RISCV_HI16",                /* name */
388 +        TRUE,                  /* partial_inplace */
389 +        ((1<<(32-RISCV_IMM_BITS))-1) << OP_SH_BIGIMMEDIATE,            /* src_mask */
390 +        ((1<<(32-RISCV_IMM_BITS))-1) << OP_SH_BIGIMMEDIATE,            /* dst_mask */
391 +        FALSE),                /* pcrel_offset */
392 +
393 +  /* Low 16 bits of symbol value.  */
394 +  HOWTO (R_RISCV_LO16,         /* type */
395 +        0,                     /* rightshift */
396 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
397 +        RISCV_IMM_BITS,                        /* bitsize */
398 +        FALSE,                 /* pc_relative */
399 +        OP_SH_IMMEDIATE,                       /* bitpos */
400 +        complain_overflow_dont, /* complain_on_overflow */
401 +        _bfd_riscv_elf_lo16_reloc, /* special_function */
402 +        "R_RISCV_LO16",                /* name */
403 +        TRUE,                  /* partial_inplace */
404 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* src_mask */
405 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* dst_mask */
406 +        FALSE),                /* pcrel_offset */
407 +
408 +  /* GP relative reference.  */
409 +  HOWTO (R_RISCV_GPREL16,      /* type */
410 +        0,                     /* rightshift */
411 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
412 +        RISCV_IMM_BITS,                        /* bitsize */
413 +        FALSE,                 /* pc_relative */
414 +        0,                     /* bitpos */
415 +        complain_overflow_signed, /* complain_on_overflow */
416 +        mips_elf_gprel16_reloc, /* special_function */
417 +        "R_RISCV_GPREL16",     /* name */
418 +        TRUE,                  /* partial_inplace */
419 +        RISCV_IMM_REACH-1,             /* src_mask */
420 +        RISCV_IMM_REACH-1,             /* dst_mask */
421 +        FALSE),                /* pcrel_offset */
422 +
423 +  /* Reference to literal section.  */
424 +  HOWTO (R_RISCV_LITERAL,      /* type */
425 +        0,                     /* rightshift */
426 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
427 +        RISCV_IMM_BITS,                        /* bitsize */
428 +        FALSE,                 /* pc_relative */
429 +        0,                     /* bitpos */
430 +        complain_overflow_signed, /* complain_on_overflow */
431 +        mips_elf_literal_reloc, /* special_function */
432 +        "R_RISCV_LITERAL",     /* name */
433 +        TRUE,                  /* partial_inplace */
434 +        RISCV_IMM_REACH-1,             /* src_mask */
435 +        RISCV_IMM_REACH-1,             /* dst_mask */
436 +        FALSE),                /* pcrel_offset */
437 +
438 +  /* Reference to global offset table.  */
439 +  HOWTO (R_RISCV_GOT16,                /* type */
440 +        0,                     /* rightshift */
441 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
442 +        RISCV_IMM_BITS,                        /* bitsize */
443 +        FALSE,                 /* pc_relative */
444 +        0,                     /* bitpos */
445 +        complain_overflow_signed, /* complain_on_overflow */
446 +        _bfd_riscv_elf_got16_reloc, /* special_function */
447 +        "R_RISCV_GOT16",       /* name */
448 +        TRUE,                  /* partial_inplace */
449 +        RISCV_IMM_REACH-1,             /* src_mask */
450 +        RISCV_IMM_REACH-1,             /* dst_mask */
451 +        FALSE),                /* pcrel_offset */
452 +
453 +  /* 16 bit PC relative reference.  Note that the ABI document has a typo
454 +     and claims R_RISCV_PC16 to be not rightshifted, rendering it useless.
455 +     We do the right thing here.  */
456 +  HOWTO (R_RISCV_PC16,         /* type */
457 +        RISCV_BRANCH_ALIGN_BITS,                       /* rightshift */
458 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
459 +        RISCV_IMM_BITS,                        /* bitsize */
460 +        TRUE,                  /* pc_relative */
461 +        0,                     /* bitpos */
462 +        complain_overflow_signed, /* complain_on_overflow */
463 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
464 +        "R_RISCV_PC16",                /* name */
465 +        TRUE,                  /* partial_inplace */
466 +        RISCV_IMM_REACH-1,             /* src_mask */
467 +        RISCV_IMM_REACH-1,             /* dst_mask */
468 +        TRUE),                 /* pcrel_offset */
469 +
470 +  /* 16 bit call through global offset table.  */
471 +  HOWTO (R_RISCV_CALL16,               /* type */
472 +        0,                     /* rightshift */
473 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
474 +        RISCV_IMM_BITS,                        /* bitsize */
475 +        FALSE,                 /* pc_relative */
476 +        0,                     /* bitpos */
477 +        complain_overflow_signed, /* complain_on_overflow */
478 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
479 +        "R_RISCV_CALL16",      /* name */
480 +        TRUE,                  /* partial_inplace */
481 +        RISCV_IMM_REACH-1,             /* src_mask */
482 +        RISCV_IMM_REACH-1,             /* dst_mask */
483 +        FALSE),                /* pcrel_offset */
484 +
485 +  /* 32 bit GP relative reference.  */
486 +  HOWTO (R_RISCV_GPREL32,      /* type */
487 +        0,                     /* rightshift */
488 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
489 +        32,                    /* bitsize */
490 +        FALSE,                 /* pc_relative */
491 +        0,                     /* bitpos */
492 +        complain_overflow_dont, /* complain_on_overflow */
493 +        mips_elf_gprel32_reloc, /* special_function */
494 +        "R_RISCV_GPREL32",     /* name */
495 +        TRUE,                  /* partial_inplace */
496 +        0xffffffff,            /* src_mask */
497 +        0xffffffff,            /* dst_mask */
498 +        FALSE),                /* pcrel_offset */
499 +
500 +  EMPTY_HOWTO (13),
501 +  EMPTY_HOWTO (14),
502 +  EMPTY_HOWTO (15),
503 +  EMPTY_HOWTO (16),
504 +  EMPTY_HOWTO (17),
505 +
506 +  /* 64 bit relocation.  */
507 +  HOWTO (R_RISCV_64,           /* type */
508 +        0,                     /* rightshift */
509 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
510 +        64,                    /* bitsize */
511 +        FALSE,                 /* pc_relative */
512 +        0,                     /* bitpos */
513 +        complain_overflow_dont, /* complain_on_overflow */
514 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
515 +        "R_RISCV_64",          /* name */
516 +        TRUE,                  /* partial_inplace */
517 +        MINUS_ONE,             /* src_mask */
518 +        MINUS_ONE,             /* dst_mask */
519 +        FALSE),                /* pcrel_offset */
520 +
521 +  /* Displacement in the global offset table.  */
522 +  HOWTO (R_RISCV_GOT_DISP,     /* type */
523 +        0,                     /* rightshift */
524 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
525 +        RISCV_IMM_BITS,                        /* bitsize */
526 +        FALSE,                 /* pc_relative */
527 +        0,                     /* bitpos */
528 +        complain_overflow_signed, /* complain_on_overflow */
529 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
530 +        "R_RISCV_GOT_DISP",    /* name */
531 +        TRUE,                  /* partial_inplace */
532 +        RISCV_IMM_REACH-1,             /* src_mask */
533 +        RISCV_IMM_REACH-1,             /* dst_mask */
534 +        FALSE),                /* pcrel_offset */
535 +
536 +  EMPTY_HOWTO (20),
537 +  EMPTY_HOWTO (21),
538 +
539 +  /* High 16 bits of displacement in global offset table.  */
540 +  HOWTO (R_RISCV_GOT_HI16,     /* type */
541 +        0,                     /* rightshift */
542 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
543 +        32-RISCV_IMM_BITS,                     /* bitsize */
544 +        FALSE,                 /* pc_relative */
545 +        0,                     /* bitpos */
546 +        complain_overflow_dont, /* complain_on_overflow */
547 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
548 +        "R_RISCV_GOT_HI16",    /* name */
549 +        TRUE,                  /* partial_inplace */
550 +        (1<<(RISCV_IMM_BITS))-1,               /* src_mask */
551 +        (1<<(RISCV_IMM_BITS))-1,               /* dst_mask */
552 +        FALSE),                /* pcrel_offset */
553 +
554 +  /* Low 16 bits of displacement in global offset table.  */
555 +  HOWTO (R_RISCV_GOT_LO16,     /* type */
556 +        0,                     /* rightshift */
557 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
558 +        RISCV_IMM_BITS,                        /* bitsize */
559 +        FALSE,                 /* pc_relative */
560 +        0,                     /* bitpos */
561 +        complain_overflow_dont, /* complain_on_overflow */
562 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
563 +        "R_RISCV_GOT_LO16",    /* name */
564 +        TRUE,                  /* partial_inplace */
565 +        RISCV_IMM_REACH-1,             /* src_mask */
566 +        RISCV_IMM_REACH-1,             /* dst_mask */
567 +        FALSE),                /* pcrel_offset */
568 +
569 +  /* 64 bit subtraction.  */
570 +  HOWTO (R_RISCV_SUB,          /* type */
571 +        0,                     /* rightshift */
572 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
573 +        64,                    /* bitsize */
574 +        FALSE,                 /* pc_relative */
575 +        0,                     /* bitpos */
576 +        complain_overflow_dont, /* complain_on_overflow */
577 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
578 +        "R_RISCV_SUB",         /* name */
579 +        TRUE,                  /* partial_inplace */
580 +        MINUS_ONE,             /* src_mask */
581 +        MINUS_ONE,             /* dst_mask */
582 +        FALSE),                /* pcrel_offset */
583 +
584 +  /* Insert the addend as an instruction.  */
585 +  /* FIXME: Not handled correctly.  */
586 +  HOWTO (R_RISCV_INSERT_A,     /* type */
587 +        0,                     /* rightshift */
588 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
589 +        32,                    /* bitsize */
590 +        FALSE,                 /* pc_relative */
591 +        0,                     /* bitpos */
592 +        complain_overflow_dont, /* complain_on_overflow */
593 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
594 +        "R_RISCV_INSERT_A",    /* name */
595 +        TRUE,                  /* partial_inplace */
596 +        0xffffffff,            /* src_mask */
597 +        0xffffffff,            /* dst_mask */
598 +        FALSE),                /* pcrel_offset */
599 +
600 +  /* Insert the addend as an instruction, and change all relocations
601 +     to refer to the old instruction at the address.  */
602 +  /* FIXME: Not handled correctly.  */
603 +  HOWTO (R_RISCV_INSERT_B,     /* type */
604 +        0,                     /* rightshift */
605 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
606 +        32,                    /* bitsize */
607 +        FALSE,                 /* pc_relative */
608 +        0,                     /* bitpos */
609 +        complain_overflow_dont, /* complain_on_overflow */
610 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
611 +        "R_RISCV_INSERT_B",    /* name */
612 +        TRUE,                  /* partial_inplace */
613 +        0xffffffff,            /* src_mask */
614 +        0xffffffff,            /* dst_mask */
615 +        FALSE),                /* pcrel_offset */
616 +
617 +  /* Delete a 32 bit instruction.  */
618 +  /* FIXME: Not handled correctly.  */
619 +  HOWTO (R_RISCV_DELETE,               /* type */
620 +        0,                     /* rightshift */
621 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
622 +        32,                    /* bitsize */
623 +        FALSE,                 /* pc_relative */
624 +        0,                     /* bitpos */
625 +        complain_overflow_dont, /* complain_on_overflow */
626 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
627 +        "R_RISCV_DELETE",      /* name */
628 +        TRUE,                  /* partial_inplace */
629 +        0xffffffff,            /* src_mask */
630 +        0xffffffff,            /* dst_mask */
631 +        FALSE),                /* pcrel_offset */
632 +
633 +  EMPTY_HOWTO (28),
634 +  EMPTY_HOWTO (29),
635 +
636 +  /* High 16 bits of displacement in global offset table.  */
637 +  HOWTO (R_RISCV_CALL_HI16,    /* type */
638 +        0,                     /* rightshift */
639 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
640 +        32-RISCV_IMM_BITS,                     /* bitsize */
641 +        FALSE,                 /* pc_relative */
642 +        0,                     /* bitpos */
643 +        complain_overflow_dont, /* complain_on_overflow */
644 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
645 +        "R_RISCV_CALL_HI16",   /* name */
646 +        TRUE,                  /* partial_inplace */
647 +        (1<<(32-RISCV_IMM_BITS))-1,            /* src_mask */
648 +        (1<<(32-RISCV_IMM_BITS))-1,            /* dst_mask */
649 +        FALSE),                /* pcrel_offset */
650 +
651 +  /* Low 16 bits of displacement in global offset table.  */
652 +  HOWTO (R_RISCV_CALL_LO16,    /* type */
653 +        0,                     /* rightshift */
654 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
655 +        RISCV_IMM_BITS,                        /* bitsize */
656 +        FALSE,                 /* pc_relative */
657 +        0,                     /* bitpos */
658 +        complain_overflow_dont, /* complain_on_overflow */
659 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
660 +        "R_RISCV_CALL_LO16",   /* name */
661 +        TRUE,                  /* partial_inplace */
662 +        RISCV_IMM_REACH-1,             /* src_mask */
663 +        RISCV_IMM_REACH-1,             /* dst_mask */
664 +        FALSE),                /* pcrel_offset */
665 +
666 +  /* Section displacement, used by an associated event location section.  */
667 +  HOWTO (R_RISCV_SCN_DISP,     /* type */
668 +        0,                     /* rightshift */
669 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
670 +        32,                    /* bitsize */
671 +        FALSE,                 /* pc_relative */
672 +        0,                     /* bitpos */
673 +        complain_overflow_dont, /* complain_on_overflow */
674 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
675 +        "R_RISCV_SCN_DISP",    /* name */
676 +        TRUE,                  /* partial_inplace */
677 +        0xffffffff,            /* src_mask */
678 +        0xffffffff,            /* dst_mask */
679 +        FALSE),                /* pcrel_offset */
680 +
681 +  HOWTO (R_RISCV_REL16,                /* type */
682 +        0,                     /* rightshift */
683 +        1,                     /* size (0 = byte, 1 = short, 2 = long) */
684 +        RISCV_IMM_BITS,                        /* bitsize */
685 +        FALSE,                 /* pc_relative */
686 +        0,                     /* bitpos */
687 +        complain_overflow_signed, /* complain_on_overflow */
688 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
689 +        "R_RISCV_REL16",       /* name */
690 +        TRUE,                  /* partial_inplace */
691 +        RISCV_IMM_REACH-1,             /* src_mask */
692 +        RISCV_IMM_REACH-1,             /* dst_mask */
693 +        FALSE),                /* pcrel_offset */
694 +
695 +  /* These two are obsolete.  */
696 +  EMPTY_HOWTO (R_RISCV_ADD_IMMEDIATE),
697 +  EMPTY_HOWTO (R_RISCV_PJUMP),
698 +
699 +  /* Similiar to R_RISCV_REL32, but used for relocations in a GOT section.
700 +     It must be used for multigot GOT's (and only there).  */
701 +  HOWTO (R_RISCV_RELGOT,               /* type */
702 +        0,                     /* rightshift */
703 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
704 +        32,                    /* bitsize */
705 +        FALSE,                 /* pc_relative */
706 +        0,                     /* bitpos */
707 +        complain_overflow_dont, /* complain_on_overflow */
708 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
709 +        "R_RISCV_RELGOT",      /* name */
710 +        TRUE,                  /* partial_inplace */
711 +        0xffffffff,            /* src_mask */
712 +        0xffffffff,            /* dst_mask */
713 +        FALSE),                /* pcrel_offset */
714 +
715 +  /* Protected jump conversion.  This is an optimization hint.  No
716 +     relocation is required for correctness.  */
717 +  HOWTO (R_RISCV_JALR,         /* type */
718 +        0,                     /* rightshift */
719 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
720 +        32,                    /* bitsize */
721 +        FALSE,                 /* pc_relative */
722 +        0,                     /* bitpos */
723 +        complain_overflow_dont, /* complain_on_overflow */
724 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
725 +        "R_RISCV_JALR",                /* name */
726 +        FALSE,                 /* partial_inplace */
727 +        0,                     /* src_mask */
728 +        0x00000000,            /* dst_mask */
729 +        FALSE),                /* pcrel_offset */
730 +
731 +  /* TLS relocations.  */
732 +  EMPTY_HOWTO (R_RISCV_TLS_DTPMOD32),
733 +  EMPTY_HOWTO (R_RISCV_TLS_DTPREL32),
734 +
735 +  HOWTO (R_RISCV_TLS_DTPMOD64, /* type */
736 +        0,                     /* rightshift */
737 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
738 +        64,                    /* bitsize */
739 +        FALSE,                 /* pc_relative */
740 +        0,                     /* bitpos */
741 +        complain_overflow_dont, /* complain_on_overflow */
742 +        _bfd_riscv_elf_generic_reloc, /* special_function */
743 +        "R_RISCV_TLS_DTPMOD64",        /* name */
744 +        TRUE,                  /* partial_inplace */
745 +        MINUS_ONE,             /* src_mask */
746 +        MINUS_ONE,             /* dst_mask */
747 +        FALSE),                /* pcrel_offset */
748 +
749 +  HOWTO (R_RISCV_TLS_DTPREL64, /* type */
750 +        0,                     /* rightshift */
751 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
752 +        64,                    /* bitsize */
753 +        FALSE,                 /* pc_relative */
754 +        0,                     /* bitpos */
755 +        complain_overflow_dont, /* complain_on_overflow */
756 +        _bfd_riscv_elf_generic_reloc, /* special_function */
757 +        "R_RISCV_TLS_DTPREL64",        /* name */
758 +        TRUE,                  /* partial_inplace */
759 +        MINUS_ONE,             /* src_mask */
760 +        MINUS_ONE,             /* dst_mask */
761 +        FALSE),                /* pcrel_offset */
762 +
763 +  /* TLS general dynamic variable reference.  */
764 +  HOWTO (R_RISCV_TLS_GD,               /* type */
765 +        0,                     /* rightshift */
766 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
767 +        RISCV_IMM_BITS,                        /* bitsize */
768 +        FALSE,                 /* pc_relative */
769 +        0,                     /* bitpos */
770 +        complain_overflow_signed, /* complain_on_overflow */
771 +        _bfd_riscv_elf_generic_reloc, /* special_function */
772 +        "R_RISCV_TLS_GD",      /* name */
773 +        TRUE,                  /* partial_inplace */
774 +        RISCV_IMM_REACH-1,             /* src_mask */
775 +        RISCV_IMM_REACH-1,             /* dst_mask */
776 +        FALSE),                /* pcrel_offset */
777 +
778 +  /* TLS local dynamic variable reference.  */
779 +  HOWTO (R_RISCV_TLS_LDM,      /* type */
780 +        0,                     /* rightshift */
781 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
782 +        RISCV_IMM_BITS,                        /* bitsize */
783 +        FALSE,                 /* pc_relative */
784 +        0,                     /* bitpos */
785 +        complain_overflow_signed, /* complain_on_overflow */
786 +        _bfd_riscv_elf_generic_reloc, /* special_function */
787 +        "R_RISCV_TLS_LDM",     /* name */
788 +        TRUE,                  /* partial_inplace */
789 +        RISCV_IMM_REACH-1,             /* src_mask */
790 +        RISCV_IMM_REACH-1,             /* dst_mask */
791 +        FALSE),                /* pcrel_offset */
792 +
793 +  /* TLS local dynamic offset.  */
794 +  HOWTO (R_RISCV_TLS_DTPREL_HI16,      /* type */
795 +        0,                     /* rightshift */
796 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
797 +        32-RISCV_IMM_BITS,                     /* bitsize */
798 +        FALSE,                 /* pc_relative */
799 +        0,                     /* bitpos */
800 +        complain_overflow_signed, /* complain_on_overflow */
801 +        _bfd_riscv_elf_generic_reloc, /* special_function */
802 +        "R_RISCV_TLS_DTPREL_HI16",     /* name */
803 +        TRUE,                  /* partial_inplace */
804 +        (1<<(32-RISCV_IMM_BITS))-1,            /* src_mask */
805 +        (1<<(32-RISCV_IMM_BITS))-1,            /* dst_mask */
806 +        FALSE),                /* pcrel_offset */
807 +
808 +  /* TLS local dynamic offset.  */
809 +  HOWTO (R_RISCV_TLS_DTPREL_LO16,      /* type */
810 +        0,                     /* rightshift */
811 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
812 +        RISCV_IMM_BITS,                        /* bitsize */
813 +        FALSE,                 /* pc_relative */
814 +        0,                     /* bitpos */
815 +        complain_overflow_signed, /* complain_on_overflow */
816 +        _bfd_riscv_elf_generic_reloc, /* special_function */
817 +        "R_RISCV_TLS_DTPREL_LO16",     /* name */
818 +        TRUE,                  /* partial_inplace */
819 +        RISCV_IMM_REACH-1,             /* src_mask */
820 +        RISCV_IMM_REACH-1,             /* dst_mask */
821 +        FALSE),                /* pcrel_offset */
822 +
823 +  /* TLS thread pointer offset.  */
824 +  HOWTO (R_RISCV_TLS_GOTTPREL, /* type */
825 +        0,                     /* rightshift */
826 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
827 +        RISCV_IMM_BITS,                        /* bitsize */
828 +        FALSE,                 /* pc_relative */
829 +        0,                     /* bitpos */
830 +        complain_overflow_signed, /* complain_on_overflow */
831 +        _bfd_riscv_elf_generic_reloc, /* special_function */
832 +        "R_RISCV_TLS_GOTTPREL",        /* name */
833 +        TRUE,                  /* partial_inplace */
834 +        RISCV_IMM_REACH-1,             /* src_mask */
835 +        RISCV_IMM_REACH-1,             /* dst_mask */
836 +        FALSE),                /* pcrel_offset */
837 +
838 +  /* TLS IE dynamic relocations.  */
839 +  EMPTY_HOWTO (R_RISCV_TLS_TPREL32),
840 +
841 +  HOWTO (R_RISCV_TLS_TPREL64,  /* type */
842 +        0,                     /* rightshift */
843 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
844 +        64,                    /* bitsize */
845 +        FALSE,                 /* pc_relative */
846 +        0,                     /* bitpos */
847 +        complain_overflow_dont, /* complain_on_overflow */
848 +        _bfd_riscv_elf_generic_reloc, /* special_function */
849 +        "R_RISCV_TLS_TPREL64", /* name */
850 +        TRUE,                  /* partial_inplace */
851 +        MINUS_ONE,             /* src_mask */
852 +        MINUS_ONE,             /* dst_mask */
853 +        FALSE),                /* pcrel_offset */
854 +
855 +  /* TLS thread pointer offset.  */
856 +  HOWTO (R_RISCV_TLS_TPREL_HI16,       /* type */
857 +        0,                     /* rightshift */
858 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
859 +        32-RISCV_IMM_BITS,                     /* bitsize */
860 +        FALSE,                 /* pc_relative */
861 +        0,                     /* bitpos */
862 +        complain_overflow_signed, /* complain_on_overflow */
863 +        _bfd_riscv_elf_generic_reloc, /* special_function */
864 +        "R_RISCV_TLS_TPREL_HI16", /* name */
865 +        TRUE,                  /* partial_inplace */
866 +        (1<<(32-RISCV_IMM_BITS))-1,            /* src_mask */
867 +        (1<<(32-RISCV_IMM_BITS))-1,            /* dst_mask */
868 +        FALSE),                /* pcrel_offset */
869 +
870 +  /* TLS thread pointer offset.  */
871 +  HOWTO (R_RISCV_TLS_TPREL_LO16,       /* type */
872 +        0,                     /* rightshift */
873 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
874 +        RISCV_IMM_BITS,                        /* bitsize */
875 +        FALSE,                 /* pc_relative */
876 +        0,                     /* bitpos */
877 +        complain_overflow_signed, /* complain_on_overflow */
878 +        _bfd_riscv_elf_generic_reloc, /* special_function */
879 +        "R_RISCV_TLS_TPREL_LO16", /* name */
880 +        TRUE,                  /* partial_inplace */
881 +        RISCV_IMM_REACH-1,             /* src_mask */
882 +        RISCV_IMM_REACH-1,             /* dst_mask */
883 +        FALSE),                /* pcrel_offset */
884 +
885 +  /* 32 bit relocation with no addend.  */
886 +  HOWTO (R_RISCV_GLOB_DAT,     /* type */
887 +        0,                     /* rightshift */
888 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
889 +        32,                    /* bitsize */
890 +        FALSE,                 /* pc_relative */
891 +        0,                     /* bitpos */
892 +        complain_overflow_dont, /* complain_on_overflow */
893 +        _bfd_riscv_elf_generic_reloc, /* special_function */
894 +        "R_RISCV_GLOB_DAT",    /* name */
895 +        FALSE,                 /* partial_inplace */
896 +        0x0,                   /* src_mask */
897 +        0xffffffff,            /* dst_mask */
898 +        FALSE),                /* pcrel_offset */
899 +};
900 +
901 +/* The relocation table used for SHT_RELA sections.  */
902 +
903 +static reloc_howto_type elf_mips_howto_table_rela[] =
904 +{
905 +  /* No relocation.  */
906 +  HOWTO (R_RISCV_NONE,         /* type */
907 +        0,                     /* rightshift */
908 +        0,                     /* size (0 = byte, 1 = short, 2 = long) */
909 +        0,                     /* bitsize */
910 +        FALSE,                 /* pc_relative */
911 +        0,                     /* bitpos */
912 +        complain_overflow_dont, /* complain_on_overflow */
913 +        _bfd_riscv_elf_generic_reloc, /* special_function */
914 +        "R_RISCV_NONE",                /* name */
915 +        FALSE,                 /* partial_inplace */
916 +        0,                     /* src_mask */
917 +        0,                     /* dst_mask */
918 +        FALSE),                /* pcrel_offset */
919 +
920 +  EMPTY_HOWTO (1),
921 +
922 +  /* 32 bit relocation.  */
923 +  HOWTO (R_RISCV_32,           /* type */
924 +        0,                     /* rightshift */
925 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
926 +        32,                    /* bitsize */
927 +        FALSE,                 /* pc_relative */
928 +        0,                     /* bitpos */
929 +        complain_overflow_dont, /* complain_on_overflow */
930 +        _bfd_riscv_elf_generic_reloc, /* special_function */
931 +        "R_RISCV_32",          /* name */
932 +        FALSE,                 /* partial_inplace */
933 +        0,                     /* src_mask */
934 +        0xffffffff,            /* dst_mask */
935 +        FALSE),                /* pcrel_offset */
936 +
937 +  /* 32 bit symbol relative relocation.  */
938 +  HOWTO (R_RISCV_REL32,                /* type */
939 +        0,                     /* rightshift */
940 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
941 +        32,                    /* bitsize */
942 +        FALSE,                 /* pc_relative */
943 +        0,                     /* bitpos */
944 +        complain_overflow_dont, /* complain_on_overflow */
945 +        _bfd_riscv_elf_generic_reloc, /* special_function */
946 +        "R_RISCV_REL32",       /* name */
947 +        FALSE,                 /* partial_inplace */
948 +        0,                     /* src_mask */
949 +        0xffffffff,            /* dst_mask */
950 +        FALSE),                /* pcrel_offset */
951 +
952 +  /* 26 bit jump address.  */
953 +  HOWTO (R_RISCV_26,           /* type */
954 +        2,                     /* rightshift */
955 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
956 +        26,                    /* bitsize */
957 +        FALSE,                 /* pc_relative */
958 +        0,                     /* bitpos */
959 +        complain_overflow_dont, /* complain_on_overflow */
960 +                               /* This needs complex overflow
961 +                                  detection, because the upper 36
962 +                                  bits must match the PC + 4.  */
963 +        _bfd_riscv_elf_generic_reloc, /* special_function */
964 +        "R_RISCV_26",          /* name */
965 +        FALSE,                 /* partial_inplace */
966 +        0,                     /* src_mask */
967 +        0x03ffffff,            /* dst_mask */
968 +        FALSE),                /* pcrel_offset */
969 +
970 +  /* High 16 bits of symbol value.  */
971 +  HOWTO (R_RISCV_HI16,         /* type */
972 +        0,                     /* rightshift */
973 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
974 +        16,                    /* bitsize */
975 +        FALSE,                 /* pc_relative */
976 +        0,                     /* bitpos */
977 +        complain_overflow_dont, /* complain_on_overflow */
978 +        _bfd_riscv_elf_generic_reloc, /* special_function */
979 +        "R_RISCV_HI16",                /* name */
980 +        FALSE,                 /* partial_inplace */
981 +        0,                     /* src_mask */
982 +        0x0000ffff,            /* dst_mask */
983 +        FALSE),                /* pcrel_offset */
984 +
985 +  /* Low 16 bits of symbol value.  */
986 +  HOWTO (R_RISCV_LO16,         /* type */
987 +        0,                     /* rightshift */
988 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
989 +        16,                    /* bitsize */
990 +        FALSE,                 /* pc_relative */
991 +        0,                     /* bitpos */
992 +        complain_overflow_dont, /* complain_on_overflow */
993 +        _bfd_riscv_elf_generic_reloc, /* special_function */
994 +        "R_RISCV_LO16",                /* name */
995 +        FALSE,                 /* partial_inplace */
996 +        0,                     /* src_mask */
997 +        0x0000ffff,            /* dst_mask */
998 +        FALSE),                /* pcrel_offset */
999 +
1000 +  /* GP relative reference.  */
1001 +  HOWTO (R_RISCV_GPREL16,      /* type */
1002 +        0,                     /* rightshift */
1003 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1004 +        16,                    /* bitsize */
1005 +        FALSE,                 /* pc_relative */
1006 +        0,                     /* bitpos */
1007 +        complain_overflow_signed, /* complain_on_overflow */
1008 +        mips_elf_gprel16_reloc, /* special_function */
1009 +        "R_RISCV_GPREL16",     /* name */
1010 +        FALSE,                 /* partial_inplace */
1011 +        0,                     /* src_mask */
1012 +        0x0000ffff,            /* dst_mask */
1013 +        FALSE),                /* pcrel_offset */
1014 +
1015 +  /* Reference to literal section.  */
1016 +  HOWTO (R_RISCV_LITERAL,      /* type */
1017 +        0,                     /* rightshift */
1018 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1019 +        16,                    /* bitsize */
1020 +        FALSE,                 /* pc_relative */
1021 +        0,                     /* bitpos */
1022 +        complain_overflow_signed, /* complain_on_overflow */
1023 +        mips_elf_literal_reloc, /* special_function */
1024 +        "R_RISCV_LITERAL",     /* name */
1025 +        FALSE,                 /* partial_inplace */
1026 +        0,                     /* src_mask */
1027 +        0x0000ffff,            /* dst_mask */
1028 +        FALSE),                /* pcrel_offset */
1029 +
1030 +  /* Reference to global offset table.  */
1031 +  HOWTO (R_RISCV_GOT16,                /* type */
1032 +        0,                     /* rightshift */
1033 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1034 +        16,                    /* bitsize */
1035 +        FALSE,                 /* pc_relative */
1036 +        0,                     /* bitpos */
1037 +        complain_overflow_signed, /* complain_on_overflow */
1038 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1039 +        "R_RISCV_GOT16",       /* name */
1040 +        FALSE,                 /* partial_inplace */
1041 +        0,                     /* src_mask */
1042 +        0x0000ffff,            /* dst_mask */
1043 +        FALSE),                /* pcrel_offset */
1044 +
1045 +  /* 16 bit PC relative reference.  Note that the ABI document has a typo
1046 +     and claims R_RISCV_PC16 to be not rightshifted, rendering it useless.
1047 +     We do the right thing here.  */
1048 +  HOWTO (R_RISCV_PC16,         /* type */
1049 +        2,                     /* rightshift */
1050 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1051 +        16,                    /* bitsize */
1052 +        TRUE,                  /* pc_relative */
1053 +        0,                     /* bitpos */
1054 +        complain_overflow_signed, /* complain_on_overflow */
1055 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1056 +        "R_RISCV_PC16",                /* name */
1057 +        FALSE,                 /* partial_inplace */
1058 +        0,                     /* src_mask */
1059 +        0x0000ffff,            /* dst_mask */
1060 +        TRUE),                 /* pcrel_offset */
1061 +
1062 +  /* 16 bit call through global offset table.  */
1063 +  HOWTO (R_RISCV_CALL16,               /* type */
1064 +        0,                     /* rightshift */
1065 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1066 +        16,                    /* bitsize */
1067 +        FALSE,                 /* pc_relative */
1068 +        0,                     /* bitpos */
1069 +        complain_overflow_signed, /* complain_on_overflow */
1070 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1071 +        "R_RISCV_CALL16",      /* name */
1072 +        FALSE,                 /* partial_inplace */
1073 +        0,                     /* src_mask */
1074 +        0x0000ffff,            /* dst_mask */
1075 +        FALSE),                /* pcrel_offset */
1076 +
1077 +  /* 32 bit GP relative reference.  */
1078 +  HOWTO (R_RISCV_GPREL32,      /* type */
1079 +        0,                     /* rightshift */
1080 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1081 +        32,                    /* bitsize */
1082 +        FALSE,                 /* pc_relative */
1083 +        0,                     /* bitpos */
1084 +        complain_overflow_dont, /* complain_on_overflow */
1085 +        mips_elf_gprel32_reloc, /* special_function */
1086 +        "R_RISCV_GPREL32",     /* name */
1087 +        FALSE,                 /* partial_inplace */
1088 +        0,                     /* src_mask */
1089 +        0xffffffff,            /* dst_mask */
1090 +        FALSE),                /* pcrel_offset */
1091 +
1092 +  EMPTY_HOWTO (13),
1093 +  EMPTY_HOWTO (14),
1094 +  EMPTY_HOWTO (15),
1095 +  EMPTY_HOWTO (16),
1096 +  EMPTY_HOWTO (17),
1097 +
1098 +  /* 64 bit relocation.  */
1099 +  HOWTO (R_RISCV_64,           /* type */
1100 +        0,                     /* rightshift */
1101 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
1102 +        64,                    /* bitsize */
1103 +        FALSE,                 /* pc_relative */
1104 +        0,                     /* bitpos */
1105 +        complain_overflow_dont, /* complain_on_overflow */
1106 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1107 +        "R_RISCV_64",          /* name */
1108 +        FALSE,                 /* partial_inplace */
1109 +        0,                     /* src_mask */
1110 +        MINUS_ONE,             /* dst_mask */
1111 +        FALSE),                /* pcrel_offset */
1112 +
1113 +  /* Displacement in the global offset table.  */
1114 +  HOWTO (R_RISCV_GOT_DISP,     /* type */
1115 +        0,                     /* rightshift */
1116 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1117 +        16,                    /* bitsize */
1118 +        FALSE,                 /* pc_relative */
1119 +        0,                     /* bitpos */
1120 +        complain_overflow_signed, /* complain_on_overflow */
1121 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1122 +        "R_RISCV_GOT_DISP",    /* name */
1123 +        FALSE,                 /* partial_inplace */
1124 +        0,                     /* src_mask */
1125 +        0x0000ffff,            /* dst_mask */
1126 +        FALSE),                /* pcrel_offset */
1127 +
1128 +  EMPTY_HOWTO (20),
1129 +  EMPTY_HOWTO (21),
1130 +
1131 +  /* High 16 bits of displacement in global offset table.  */
1132 +  HOWTO (R_RISCV_GOT_HI16,     /* type */
1133 +        0,                     /* rightshift */
1134 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1135 +        16,                    /* bitsize */
1136 +        FALSE,                 /* pc_relative */
1137 +        0,                     /* bitpos */
1138 +        complain_overflow_dont, /* complain_on_overflow */
1139 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1140 +        "R_RISCV_GOT_HI16",    /* name */
1141 +        FALSE,                 /* partial_inplace */
1142 +        0,                     /* src_mask */
1143 +        0x0000ffff,            /* dst_mask */
1144 +        FALSE),                /* pcrel_offset */
1145 +
1146 +  /* Low 16 bits of displacement in global offset table.  */
1147 +  HOWTO (R_RISCV_GOT_LO16,     /* type */
1148 +        0,                     /* rightshift */
1149 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1150 +        16,                    /* bitsize */
1151 +        FALSE,                 /* pc_relative */
1152 +        0,                     /* bitpos */
1153 +        complain_overflow_dont, /* complain_on_overflow */
1154 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1155 +        "R_RISCV_GOT_LO16",    /* name */
1156 +        FALSE,                 /* partial_inplace */
1157 +        0,                     /* src_mask */
1158 +        0x0000ffff,            /* dst_mask */
1159 +        FALSE),                /* pcrel_offset */
1160 +
1161 +  /* 64 bit subtraction.  */
1162 +  HOWTO (R_RISCV_SUB,          /* type */
1163 +        0,                     /* rightshift */
1164 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
1165 +        64,                    /* bitsize */
1166 +        FALSE,                 /* pc_relative */
1167 +        0,                     /* bitpos */
1168 +        complain_overflow_dont, /* complain_on_overflow */
1169 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1170 +        "R_RISCV_SUB",         /* name */
1171 +        FALSE,                 /* partial_inplace */
1172 +        0,                     /* src_mask */
1173 +        MINUS_ONE,             /* dst_mask */
1174 +        FALSE),                /* pcrel_offset */
1175 +
1176 +  /* Insert the addend as an instruction.  */
1177 +  /* FIXME: Not handled correctly.  */
1178 +  HOWTO (R_RISCV_INSERT_A,     /* type */
1179 +        0,                     /* rightshift */
1180 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1181 +        32,                    /* bitsize */
1182 +        FALSE,                 /* pc_relative */
1183 +        0,                     /* bitpos */
1184 +        complain_overflow_dont, /* complain_on_overflow */
1185 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1186 +        "R_RISCV_INSERT_A",    /* name */
1187 +        FALSE,                 /* partial_inplace */
1188 +        0,                     /* src_mask */
1189 +        0xffffffff,            /* dst_mask */
1190 +        FALSE),                /* pcrel_offset */
1191 +
1192 +  /* Insert the addend as an instruction, and change all relocations
1193 +     to refer to the old instruction at the address.  */
1194 +  /* FIXME: Not handled correctly.  */
1195 +  HOWTO (R_RISCV_INSERT_B,     /* type */
1196 +        0,                     /* rightshift */
1197 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1198 +        32,                    /* bitsize */
1199 +        FALSE,                 /* pc_relative */
1200 +        0,                     /* bitpos */
1201 +        complain_overflow_dont, /* complain_on_overflow */
1202 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1203 +        "R_RISCV_INSERT_B",    /* name */
1204 +        FALSE,                 /* partial_inplace */
1205 +        0,                     /* src_mask */
1206 +        0xffffffff,            /* dst_mask */
1207 +        FALSE),                /* pcrel_offset */
1208 +
1209 +  /* Delete a 32 bit instruction.  */
1210 +  /* FIXME: Not handled correctly.  */
1211 +  HOWTO (R_RISCV_DELETE,               /* type */
1212 +        0,                     /* rightshift */
1213 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1214 +        32,                    /* bitsize */
1215 +        FALSE,                 /* pc_relative */
1216 +        0,                     /* bitpos */
1217 +        complain_overflow_dont, /* complain_on_overflow */
1218 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1219 +        "R_RISCV_DELETE",      /* name */
1220 +        FALSE,                 /* partial_inplace */
1221 +        0,                     /* src_mask */
1222 +        0xffffffff,            /* dst_mask */
1223 +        FALSE),                /* pcrel_offset */
1224 +
1225 +  EMPTY_HOWTO (28),
1226 +  EMPTY_HOWTO (29),
1227 +
1228 +  /* High 16 bits of displacement in global offset table.  */
1229 +  HOWTO (R_RISCV_CALL_HI16,    /* type */
1230 +        0,                     /* rightshift */
1231 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1232 +        16,                    /* bitsize */
1233 +        FALSE,                 /* pc_relative */
1234 +        0,                     /* bitpos */
1235 +        complain_overflow_dont, /* complain_on_overflow */
1236 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1237 +        "R_RISCV_CALL_HI16",   /* name */
1238 +        FALSE,                 /* partial_inplace */
1239 +        0,                     /* src_mask */
1240 +        0x0000ffff,            /* dst_mask */
1241 +        FALSE),                /* pcrel_offset */
1242 +
1243 +  /* Low 16 bits of displacement in global offset table.  */
1244 +  HOWTO (R_RISCV_CALL_LO16,    /* type */
1245 +        0,                     /* rightshift */
1246 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1247 +        16,                    /* bitsize */
1248 +        FALSE,                 /* pc_relative */
1249 +        0,                     /* bitpos */
1250 +        complain_overflow_dont, /* complain_on_overflow */
1251 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1252 +        "R_RISCV_CALL_LO16",   /* name */
1253 +        FALSE,                 /* partial_inplace */
1254 +        0,                     /* src_mask */
1255 +        0x0000ffff,            /* dst_mask */
1256 +        FALSE),                /* pcrel_offset */
1257 +
1258 +  /* Section displacement, used by an associated event location section.  */
1259 +  HOWTO (R_RISCV_SCN_DISP,     /* type */
1260 +        0,                     /* rightshift */
1261 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1262 +        32,                    /* bitsize */
1263 +        FALSE,                 /* pc_relative */
1264 +        0,                     /* bitpos */
1265 +        complain_overflow_dont, /* complain_on_overflow */
1266 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1267 +        "R_RISCV_SCN_DISP",    /* name */
1268 +        FALSE,                 /* partial_inplace */
1269 +        0,                     /* src_mask */
1270 +        0xffffffff,            /* dst_mask */
1271 +        FALSE),                /* pcrel_offset */
1272 +
1273 +  /* 16 bit relocation.  */
1274 +  HOWTO (R_RISCV_REL16,                /* type */
1275 +        0,                     /* rightshift */
1276 +        1,                     /* size (0 = byte, 1 = short, 2 = long) */
1277 +        16,                    /* bitsize */
1278 +        FALSE,                 /* pc_relative */
1279 +        0,                     /* bitpos */
1280 +        complain_overflow_signed, /* complain_on_overflow */
1281 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1282 +        "R_RISCV_REL16",       /* name */
1283 +        FALSE,                 /* partial_inplace */
1284 +        0,                     /* src_mask */
1285 +        0xffff,                /* dst_mask */
1286 +        FALSE),                /* pcrel_offset */
1287 +
1288 +  /* These two are obsolete.  */
1289 +  EMPTY_HOWTO (R_RISCV_ADD_IMMEDIATE),
1290 +  EMPTY_HOWTO (R_RISCV_PJUMP),
1291 +
1292 +  /* Similiar to R_RISCV_REL32, but used for relocations in a GOT section.
1293 +     It must be used for multigot GOT's (and only there).  */
1294 +  HOWTO (R_RISCV_RELGOT,               /* type */
1295 +        0,                     /* rightshift */
1296 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1297 +        32,                    /* bitsize */
1298 +        FALSE,                 /* pc_relative */
1299 +        0,                     /* bitpos */
1300 +        complain_overflow_dont, /* complain_on_overflow */
1301 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1302 +        "R_RISCV_RELGOT",      /* name */
1303 +        FALSE,                 /* partial_inplace */
1304 +        0,                     /* src_mask */
1305 +        0xffffffff,            /* dst_mask */
1306 +        FALSE),                /* pcrel_offset */
1307 +
1308 +  /* Protected jump conversion.  This is an optimization hint.  No
1309 +     relocation is required for correctness.  */
1310 +  HOWTO (R_RISCV_JALR,         /* type */
1311 +        0,                     /* rightshift */
1312 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1313 +        32,                    /* bitsize */
1314 +        FALSE,                 /* pc_relative */
1315 +        0,                     /* bitpos */
1316 +        complain_overflow_dont, /* complain_on_overflow */
1317 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1318 +        "R_RISCV_JALR",                /* name */
1319 +        FALSE,                 /* partial_inplace */
1320 +        0,                     /* src_mask */
1321 +        0,                     /* dst_mask */
1322 +        FALSE),                /* pcrel_offset */
1323 +
1324 +  /* TLS GD/LD dynamic relocations.  */
1325 +  HOWTO (R_RISCV_TLS_DTPMOD32, /* type */
1326 +        0,                     /* rightshift */
1327 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1328 +        32,                    /* bitsize */
1329 +        FALSE,                 /* pc_relative */
1330 +        0,                     /* bitpos */
1331 +        complain_overflow_dont, /* complain_on_overflow */
1332 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1333 +        "R_RISCV_TLS_DTPMOD32",        /* name */
1334 +        FALSE,                 /* partial_inplace */
1335 +        0xffffffff,            /* src_mask */
1336 +        0xffffffff,            /* dst_mask */
1337 +        FALSE),                /* pcrel_offset */
1338 +
1339 +  HOWTO (R_RISCV_TLS_DTPREL32, /* type */
1340 +        0,                     /* rightshift */
1341 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1342 +        32,                    /* bitsize */
1343 +        FALSE,                 /* pc_relative */
1344 +        0,                     /* bitpos */
1345 +        complain_overflow_dont, /* complain_on_overflow */
1346 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1347 +        "R_RISCV_TLS_DTPREL32",        /* name */
1348 +        FALSE,                 /* partial_inplace */
1349 +        0xffffffff,            /* src_mask */
1350 +        0xffffffff,            /* dst_mask */
1351 +        FALSE),                /* pcrel_offset */
1352 +
1353 +  EMPTY_HOWTO (R_RISCV_TLS_DTPMOD64),
1354 +  EMPTY_HOWTO (R_RISCV_TLS_DTPREL64),
1355 +
1356 +  /* TLS general dynamic variable reference.  */
1357 +  HOWTO (R_RISCV_TLS_GD,               /* type */
1358 +        0,                     /* rightshift */
1359 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1360 +        16,                    /* bitsize */
1361 +        FALSE,                 /* pc_relative */
1362 +        0,                     /* bitpos */
1363 +        complain_overflow_signed, /* complain_on_overflow */
1364 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1365 +        "R_RISCV_TLS_GD",      /* name */
1366 +        FALSE,                 /* partial_inplace */
1367 +        0x0000ffff,            /* src_mask */
1368 +        0x0000ffff,            /* dst_mask */
1369 +        FALSE),                /* pcrel_offset */
1370 +
1371 +  /* TLS local dynamic variable reference.  */
1372 +  HOWTO (R_RISCV_TLS_LDM,      /* type */
1373 +        0,                     /* rightshift */
1374 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1375 +        16,                    /* bitsize */
1376 +        FALSE,                 /* pc_relative */
1377 +        0,                     /* bitpos */
1378 +        complain_overflow_signed, /* complain_on_overflow */
1379 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1380 +        "R_RISCV_TLS_LDM",     /* name */
1381 +        FALSE,                 /* partial_inplace */
1382 +        0x0000ffff,            /* src_mask */
1383 +        0x0000ffff,            /* dst_mask */
1384 +        FALSE),                /* pcrel_offset */
1385 +
1386 +  /* TLS local dynamic offset.  */
1387 +  HOWTO (R_RISCV_TLS_DTPREL_HI16,      /* type */
1388 +        0,                     /* rightshift */
1389 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1390 +        16,                    /* bitsize */
1391 +        FALSE,                 /* pc_relative */
1392 +        0,                     /* bitpos */
1393 +        complain_overflow_signed, /* complain_on_overflow */
1394 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1395 +        "R_RISCV_TLS_DTPREL_HI16",     /* name */
1396 +        FALSE,                 /* partial_inplace */
1397 +        0x0000ffff,            /* src_mask */
1398 +        0x0000ffff,            /* dst_mask */
1399 +        FALSE),                /* pcrel_offset */
1400 +
1401 +  /* TLS local dynamic offset.  */
1402 +  HOWTO (R_RISCV_TLS_DTPREL_LO16,      /* type */
1403 +        0,                     /* rightshift */
1404 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1405 +        16,                    /* bitsize */
1406 +        FALSE,                 /* pc_relative */
1407 +        0,                     /* bitpos */
1408 +        complain_overflow_signed, /* complain_on_overflow */
1409 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1410 +        "R_RISCV_TLS_DTPREL_LO16",     /* name */
1411 +        FALSE,                 /* partial_inplace */
1412 +        0x0000ffff,            /* src_mask */
1413 +        0x0000ffff,            /* dst_mask */
1414 +        FALSE),                /* pcrel_offset */
1415 +
1416 +  /* TLS thread pointer offset.  */
1417 +  HOWTO (R_RISCV_TLS_GOTTPREL, /* type */
1418 +        0,                     /* rightshift */
1419 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1420 +        16,                    /* bitsize */
1421 +        FALSE,                 /* pc_relative */
1422 +        0,                     /* bitpos */
1423 +        complain_overflow_signed, /* complain_on_overflow */
1424 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1425 +        "R_RISCV_TLS_GOTTPREL",        /* name */
1426 +        FALSE,                 /* partial_inplace */
1427 +        0x0000ffff,            /* src_mask */
1428 +        0x0000ffff,            /* dst_mask */
1429 +        FALSE),                /* pcrel_offset */
1430 +
1431 +  /* TLS IE dynamic relocations.  */
1432 +  HOWTO (R_RISCV_TLS_TPREL32,  /* type */
1433 +        0,                     /* rightshift */
1434 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1435 +        32,                    /* bitsize */
1436 +        FALSE,                 /* pc_relative */
1437 +        0,                     /* bitpos */
1438 +        complain_overflow_dont, /* complain_on_overflow */
1439 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1440 +        "R_RISCV_TLS_TPREL32", /* name */
1441 +        FALSE,                 /* partial_inplace */
1442 +        0xffffffff,            /* src_mask */
1443 +        0xffffffff,            /* dst_mask */
1444 +        FALSE),                /* pcrel_offset */
1445 +
1446 +  EMPTY_HOWTO (R_RISCV_TLS_TPREL64),
1447 +
1448 +  /* TLS thread pointer offset.  */
1449 +  HOWTO (R_RISCV_TLS_TPREL_HI16,       /* type */
1450 +        0,                     /* rightshift */
1451 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1452 +        16,                    /* bitsize */
1453 +        FALSE,                 /* pc_relative */
1454 +        0,                     /* bitpos */
1455 +        complain_overflow_signed, /* complain_on_overflow */
1456 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1457 +        "R_RISCV_TLS_TPREL_HI16", /* name */
1458 +        FALSE,                 /* partial_inplace */
1459 +        0x0000ffff,            /* src_mask */
1460 +        0x0000ffff,            /* dst_mask */
1461 +        FALSE),                /* pcrel_offset */
1462 +
1463 +  /* TLS thread pointer offset.  */
1464 +  HOWTO (R_RISCV_TLS_TPREL_LO16,       /* type */
1465 +        0,                     /* rightshift */
1466 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1467 +        16,                    /* bitsize */
1468 +        FALSE,                 /* pc_relative */
1469 +        0,                     /* bitpos */
1470 +        complain_overflow_signed, /* complain_on_overflow */
1471 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1472 +        "R_RISCV_TLS_TPREL_LO16", /* name */
1473 +        FALSE,                 /* partial_inplace */
1474 +        0x0000ffff,            /* src_mask */
1475 +        0x0000ffff,            /* dst_mask */
1476 +        FALSE),                /* pcrel_offset */
1477 +
1478 +  /* 32 bit relocation with no addend.  */
1479 +  HOWTO (R_RISCV_GLOB_DAT,     /* type */
1480 +        0,                     /* rightshift */
1481 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1482 +        32,                    /* bitsize */
1483 +        FALSE,                 /* pc_relative */
1484 +        0,                     /* bitpos */
1485 +        complain_overflow_dont, /* complain_on_overflow */
1486 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1487 +        "R_RISCV_GLOB_DAT",    /* name */
1488 +        FALSE,                 /* partial_inplace */
1489 +        0x0,                   /* src_mask */
1490 +        0xffffffff,            /* dst_mask */
1491 +        FALSE),                /* pcrel_offset */
1492 +};
1493 +
1494 +static reloc_howto_type elf_mips16_howto_table_rel[] =
1495 +{
1496 +  /* The reloc used for the mips16 jump instruction.  */
1497 +  HOWTO (R_MIPS16_26,          /* type */
1498 +        2,                     /* rightshift */
1499 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1500 +        26,                    /* bitsize */
1501 +        FALSE,                 /* pc_relative */
1502 +        0,                     /* bitpos */
1503 +        complain_overflow_dont, /* complain_on_overflow */
1504 +                               /* This needs complex overflow
1505 +                                  detection, because the upper four
1506 +                                  bits must match the PC.  */
1507 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1508 +        "R_MIPS16_26",         /* name */
1509 +        TRUE,                  /* partial_inplace */
1510 +        0x3ffffff,             /* src_mask */
1511 +        0x3ffffff,             /* dst_mask */
1512 +        FALSE),                /* pcrel_offset */
1513 +
1514 +  /* The reloc used for the mips16 gprel instruction.  */
1515 +  HOWTO (R_MIPS16_GPREL,       /* type */
1516 +        0,                     /* rightshift */
1517 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1518 +        16,                    /* bitsize */
1519 +        FALSE,                 /* pc_relative */
1520 +        0,                     /* bitpos */
1521 +        complain_overflow_signed, /* complain_on_overflow */
1522 +        mips16_gprel_reloc,    /* special_function */
1523 +        "R_MIPS16_GPREL",      /* name */
1524 +        TRUE,                  /* partial_inplace */
1525 +        0x0000ffff,            /* src_mask */
1526 +        0x0000ffff,            /* dst_mask */
1527 +        FALSE),                /* pcrel_offset */
1528 +
1529 +  /* A MIPS16 reference to the global offset table.  */
1530 +  HOWTO (R_MIPS16_GOT16,       /* type */
1531 +        0,                     /* rightshift */
1532 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1533 +        16,                    /* bitsize */
1534 +        FALSE,                 /* pc_relative */
1535 +        0,                     /* bitpos */
1536 +        complain_overflow_dont, /* complain_on_overflow */
1537 +        _bfd_riscv_elf_got16_reloc, /* special_function */
1538 +        "R_MIPS16_GOT16",      /* name */
1539 +        TRUE,                  /* partial_inplace */
1540 +        0x0000ffff,            /* src_mask */
1541 +        0x0000ffff,            /* dst_mask */
1542 +        FALSE),                /* pcrel_offset */
1543 +
1544 +  /* A MIPS16 call through the global offset table.  */
1545 +  HOWTO (R_MIPS16_CALL16,      /* type */
1546 +        0,                     /* rightshift */
1547 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1548 +        16,                    /* bitsize */
1549 +        FALSE,                 /* pc_relative */
1550 +        0,                     /* bitpos */
1551 +        complain_overflow_dont, /* complain_on_overflow */
1552 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1553 +        "R_MIPS16_CALL16",     /* name */
1554 +        TRUE,                  /* partial_inplace */
1555 +        0x0000ffff,            /* src_mask */
1556 +        0x0000ffff,            /* dst_mask */
1557 +        FALSE),                /* pcrel_offset */
1558 +
1559 +  /* MIPS16 high 16 bits of symbol value.  */
1560 +  HOWTO (R_MIPS16_HI16,                /* type */
1561 +        16,                    /* rightshift */
1562 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1563 +        16,                    /* bitsize */
1564 +        FALSE,                 /* pc_relative */
1565 +        0,                     /* bitpos */
1566 +        complain_overflow_dont, /* complain_on_overflow */
1567 +        _bfd_riscv_elf_hi16_reloc, /* special_function */
1568 +        "R_MIPS16_HI16",       /* name */
1569 +        TRUE,                  /* partial_inplace */
1570 +        0x0000ffff,            /* src_mask */
1571 +        0x0000ffff,            /* dst_mask */
1572 +        FALSE),                /* pcrel_offset */
1573 +
1574 +  /* MIPS16 low 16 bits of symbol value.  */
1575 +  HOWTO (R_MIPS16_LO16,                /* type */
1576 +        0,                     /* rightshift */
1577 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1578 +        16,                    /* bitsize */
1579 +        FALSE,                 /* pc_relative */
1580 +        0,                     /* bitpos */
1581 +        complain_overflow_dont, /* complain_on_overflow */
1582 +        _bfd_riscv_elf_lo16_reloc, /* special_function */
1583 +        "R_MIPS16_LO16",       /* name */
1584 +        TRUE,                  /* partial_inplace */
1585 +        0x0000ffff,            /* src_mask */
1586 +        0x0000ffff,            /* dst_mask */
1587 +        FALSE),                /* pcrel_offset */
1588 +};
1589 +
1590 +static reloc_howto_type elf_mips16_howto_table_rela[] =
1591 +{
1592 +  /* The reloc used for the mips16 jump instruction.  */
1593 +  HOWTO (R_MIPS16_26,          /* type */
1594 +        2,                     /* rightshift */
1595 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1596 +        26,                    /* bitsize */
1597 +        FALSE,                 /* pc_relative */
1598 +        0,                     /* bitpos */
1599 +        complain_overflow_dont, /* complain_on_overflow */
1600 +                               /* This needs complex overflow
1601 +                                  detection, because the upper four
1602 +                                  bits must match the PC.  */
1603 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1604 +        "R_MIPS16_26",         /* name */
1605 +        FALSE,                 /* partial_inplace */
1606 +        0x3ffffff,             /* src_mask */
1607 +        0x3ffffff,             /* dst_mask */
1608 +        FALSE),                /* pcrel_offset */
1609 +
1610 +  /* The reloc used for the mips16 gprel instruction.  */
1611 +  HOWTO (R_MIPS16_GPREL,       /* type */
1612 +        0,                     /* rightshift */
1613 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1614 +        16,                    /* bitsize */
1615 +        FALSE,                 /* pc_relative */
1616 +        0,                     /* bitpos */
1617 +        complain_overflow_signed, /* complain_on_overflow */
1618 +        mips16_gprel_reloc,    /* special_function */
1619 +        "R_MIPS16_GPREL",      /* name */
1620 +        FALSE,                 /* partial_inplace */
1621 +        0x0000ffff,            /* src_mask */
1622 +        0x0000ffff,            /* dst_mask */
1623 +        FALSE),                /* pcrel_offset */
1624 +
1625 +  /* A MIPS16 reference to the global offset table.  */
1626 +  HOWTO (R_MIPS16_GOT16,       /* type */
1627 +        0,                     /* rightshift */
1628 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1629 +        16,                    /* bitsize */
1630 +        FALSE,                 /* pc_relative */
1631 +        0,                     /* bitpos */
1632 +        complain_overflow_dont, /* complain_on_overflow */
1633 +        _bfd_riscv_elf_got16_reloc, /* special_function */
1634 +        "R_MIPS16_GOT16",      /* name */
1635 +        FALSE,                 /* partial_inplace */
1636 +        0x0000ffff,            /* src_mask */
1637 +        0x0000ffff,            /* dst_mask */
1638 +        FALSE),                /* pcrel_offset */
1639 +
1640 +  /* A MIPS16 call through the global offset table.  */
1641 +  HOWTO (R_MIPS16_CALL16,      /* type */
1642 +        0,                     /* rightshift */
1643 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1644 +        16,                    /* bitsize */
1645 +        FALSE,                 /* pc_relative */
1646 +        0,                     /* bitpos */
1647 +        complain_overflow_dont, /* complain_on_overflow */
1648 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1649 +        "R_MIPS16_CALL16",     /* name */
1650 +        FALSE,                 /* partial_inplace */
1651 +        0x0000ffff,            /* src_mask */
1652 +        0x0000ffff,            /* dst_mask */
1653 +        FALSE),                /* pcrel_offset */
1654 +
1655 +  /* MIPS16 high 16 bits of symbol value.  */
1656 +  HOWTO (R_MIPS16_HI16,                /* type */
1657 +        16,                    /* rightshift */
1658 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1659 +        16,                    /* bitsize */
1660 +        FALSE,                 /* pc_relative */
1661 +        0,                     /* bitpos */
1662 +        complain_overflow_dont, /* complain_on_overflow */
1663 +        _bfd_riscv_elf_hi16_reloc, /* special_function */
1664 +        "R_MIPS16_HI16",       /* name */
1665 +        FALSE,                 /* partial_inplace */
1666 +        0x0000ffff,            /* src_mask */
1667 +        0x0000ffff,            /* dst_mask */
1668 +        FALSE),                /* pcrel_offset */
1669 +
1670 +  /* MIPS16 low 16 bits of symbol value.  */
1671 +  HOWTO (R_MIPS16_LO16,                /* type */
1672 +        0,                     /* rightshift */
1673 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1674 +        16,                    /* bitsize */
1675 +        FALSE,                 /* pc_relative */
1676 +        0,                     /* bitpos */
1677 +        complain_overflow_dont, /* complain_on_overflow */
1678 +        _bfd_riscv_elf_lo16_reloc, /* special_function */
1679 +        "R_MIPS16_LO16",       /* name */
1680 +        FALSE,                 /* partial_inplace */
1681 +        0x0000ffff,            /* src_mask */
1682 +        0x0000ffff,            /* dst_mask */
1683 +        FALSE),                /* pcrel_offset */
1684 +};
1685 +
1686 +/* GNU extension to record C++ vtable hierarchy */
1687 +static reloc_howto_type elf_mips_gnu_vtinherit_howto =
1688 +  HOWTO (R_RISCV_GNU_VTINHERIT,        /* type */
1689 +        0,                     /* rightshift */
1690 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1691 +        0,                     /* bitsize */
1692 +        FALSE,                 /* pc_relative */
1693 +        0,                     /* bitpos */
1694 +        complain_overflow_dont, /* complain_on_overflow */
1695 +        NULL,                  /* special_function */
1696 +        "R_RISCV_GNU_VTINHERIT", /* name */
1697 +        FALSE,                 /* partial_inplace */
1698 +        0,                     /* src_mask */
1699 +        0,                     /* dst_mask */
1700 +        FALSE);                /* pcrel_offset */
1701 +
1702 +/* GNU extension to record C++ vtable member usage */
1703 +static reloc_howto_type elf_mips_gnu_vtentry_howto =
1704 +  HOWTO (R_RISCV_GNU_VTENTRY,  /* type */
1705 +        0,                     /* rightshift */
1706 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1707 +        0,                     /* bitsize */
1708 +        FALSE,                 /* pc_relative */
1709 +        0,                     /* bitpos */
1710 +        complain_overflow_dont, /* complain_on_overflow */
1711 +        _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1712 +        "R_RISCV_GNU_VTENTRY", /* name */
1713 +        FALSE,                 /* partial_inplace */
1714 +        0,                     /* src_mask */
1715 +        0,                     /* dst_mask */
1716 +        FALSE);                /* pcrel_offset */
1717 +\f
1718 +/* 16 bit offset for pc-relative branches.  */
1719 +static reloc_howto_type elf_mips_gnu_rel16_s2 =
1720 +  HOWTO (R_RISCV_GNU_REL16_S2, /* type */
1721 +        2,                     /* rightshift */
1722 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1723 +        16,                    /* bitsize */
1724 +        TRUE,                  /* pc_relative */
1725 +        0,                     /* bitpos */
1726 +        complain_overflow_signed, /* complain_on_overflow */
1727 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1728 +        "R_RISCV_GNU_REL16_S2",        /* name */
1729 +        TRUE,                  /* partial_inplace */
1730 +        0x0000ffff,            /* src_mask */
1731 +        0x0000ffff,            /* dst_mask */
1732 +        TRUE);                 /* pcrel_offset */
1733 +
1734 +/* 16 bit offset for pc-relative branches.  */
1735 +static reloc_howto_type elf_mips_gnu_rela16_s2 =
1736 +  HOWTO (R_RISCV_GNU_REL16_S2, /* type */
1737 +        2,                     /* rightshift */
1738 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1739 +        16,                    /* bitsize */
1740 +        TRUE,                  /* pc_relative */
1741 +        0,                     /* bitpos */
1742 +        complain_overflow_signed, /* complain_on_overflow */
1743 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1744 +        "R_RISCV_GNU_REL16_S2",        /* name */
1745 +        FALSE,                 /* partial_inplace */
1746 +        0,                     /* src_mask */
1747 +        0x0000ffff,            /* dst_mask */
1748 +        TRUE);                 /* pcrel_offset */
1749 +\f
1750 +/* Originally a VxWorks extension, but now used for other systems too.  */
1751 +static reloc_howto_type elf_mips_copy_howto =
1752 +  HOWTO (R_RISCV_COPY,         /* type */
1753 +        0,                     /* rightshift */
1754 +        0,                     /* this one is variable size */
1755 +        0,                     /* bitsize */
1756 +        FALSE,                 /* pc_relative */
1757 +        0,                     /* bitpos */
1758 +        complain_overflow_bitfield, /* complain_on_overflow */
1759 +        bfd_elf_generic_reloc, /* special_function */
1760 +        "R_RISCV_COPY",                /* name */
1761 +        FALSE,                 /* partial_inplace */
1762 +        0x0,                   /* src_mask */
1763 +        0x0,                   /* dst_mask */
1764 +        FALSE);                /* pcrel_offset */
1765 +
1766 +/* Originally a VxWorks extension, but now used for other systems too.  */
1767 +static reloc_howto_type elf_mips_jump_slot_howto =
1768 +  HOWTO (R_RISCV_JUMP_SLOT,    /* type */
1769 +        0,                     /* rightshift */
1770 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1771 +        32,                    /* bitsize */
1772 +        FALSE,                 /* pc_relative */
1773 +        0,                     /* bitpos */
1774 +        complain_overflow_bitfield, /* complain_on_overflow */
1775 +        bfd_elf_generic_reloc, /* special_function */
1776 +        "R_RISCV_JUMP_SLOT",   /* name */
1777 +        FALSE,                 /* partial_inplace */
1778 +        0x0,                   /* src_mask */
1779 +        0x0,                   /* dst_mask */
1780 +        FALSE);                /* pcrel_offset */
1781 +\f
1782 +/* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
1783 +   dangerous relocation.  */
1784 +
1785 +static bfd_boolean
1786 +mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
1787 +{
1788 +  unsigned int count;
1789 +  asymbol **sym;
1790 +  unsigned int i;
1791 +
1792 +  /* If we've already figured out what GP will be, just return it.  */
1793 +  *pgp = _bfd_get_gp_value (output_bfd);
1794 +  if (*pgp)
1795 +    return TRUE;
1796 +
1797 +  count = bfd_get_symcount (output_bfd);
1798 +  sym = bfd_get_outsymbols (output_bfd);
1799 +
1800 +  /* The linker script will have created a symbol named `_gp' with the
1801 +     appropriate value.  */
1802 +  if (sym == NULL)
1803 +    i = count;
1804 +  else
1805 +    {
1806 +      for (i = 0; i < count; i++, sym++)
1807 +       {
1808 +         register const char *name;
1809 +
1810 +         name = bfd_asymbol_name (*sym);
1811 +         if (*name == '_' && strcmp (name, "_gp") == 0)
1812 +           {
1813 +             *pgp = bfd_asymbol_value (*sym);
1814 +             _bfd_set_gp_value (output_bfd, *pgp);
1815 +             break;
1816 +           }
1817 +       }
1818 +    }
1819 +
1820 +  if (i >= count)
1821 +    {
1822 +      /* Only get the error once.  */
1823 +      *pgp = 4;
1824 +      _bfd_set_gp_value (output_bfd, *pgp);
1825 +      return FALSE;
1826 +    }
1827 +
1828 +  return TRUE;
1829 +}
1830 +
1831 +/* We have to figure out the gp value, so that we can adjust the
1832 +   symbol value correctly.  We look up the symbol _gp in the output
1833 +   BFD.  If we can't find it, we're stuck.  We cache it in the ELF
1834 +   target data.  We don't need to adjust the symbol value for an
1835 +   external symbol if we are producing relocatable output.  */
1836 +
1837 +static bfd_reloc_status_type
1838 +mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
1839 +                  char **error_message, bfd_vma *pgp)
1840 +{
1841 +  if (bfd_is_und_section (symbol->section)
1842 +      && ! relocatable)
1843 +    {
1844 +      *pgp = 0;
1845 +      return bfd_reloc_undefined;
1846 +    }
1847 +
1848 +  *pgp = _bfd_get_gp_value (output_bfd);
1849 +  if (*pgp == 0
1850 +      && (! relocatable
1851 +         || (symbol->flags & BSF_SECTION_SYM) != 0))
1852 +    {
1853 +      if (relocatable)
1854 +       {
1855 +         /* Make up a value.  */
1856 +         *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
1857 +         _bfd_set_gp_value (output_bfd, *pgp);
1858 +       }
1859 +      else if (!mips_elf_assign_gp (output_bfd, pgp))
1860 +       {
1861 +         *error_message =
1862 +           (char *) _("GP relative relocation when _gp not defined");
1863 +         return bfd_reloc_dangerous;
1864 +       }
1865 +    }
1866 +
1867 +  return bfd_reloc_ok;
1868 +}
1869 +
1870 +/* Do a R_RISCV_GPREL16 relocation.  This is a 16 bit value which must
1871 +   become the offset from the gp register.  */
1872 +
1873 +static bfd_reloc_status_type
1874 +mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1875 +                       asymbol *symbol, void *data ATTRIBUTE_UNUSED,
1876 +                       asection *input_section, bfd *output_bfd,
1877 +                       char **error_message ATTRIBUTE_UNUSED)
1878 +{
1879 +  bfd_boolean relocatable;
1880 +  bfd_reloc_status_type ret;
1881 +  bfd_vma gp;
1882 +
1883 +  if (output_bfd != NULL)
1884 +    relocatable = TRUE;
1885 +  else
1886 +    {
1887 +      relocatable = FALSE;
1888 +      output_bfd = symbol->section->output_section->owner;
1889 +    }
1890 +
1891 +  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
1892 +                          &gp);
1893 +  if (ret != bfd_reloc_ok)
1894 +    return ret;
1895 +
1896 +  return _bfd_riscv_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1897 +                                       input_section, relocatable,
1898 +                                       data, gp);
1899 +}
1900 +
1901 +/* Do a R_RISCV_LITERAL relocation.  */
1902 +
1903 +static bfd_reloc_status_type
1904 +mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1905 +                       void *data, asection *input_section, bfd *output_bfd,
1906 +                       char **error_message)
1907 +{
1908 +  bfd_boolean relocatable;
1909 +  bfd_reloc_status_type ret;
1910 +  bfd_vma gp;
1911 +
1912 +  /* R_RISCV_LITERAL relocations are defined for local symbols only.  */
1913 +  if (output_bfd != NULL
1914 +      && (symbol->flags & BSF_SECTION_SYM) == 0
1915 +      && (symbol->flags & BSF_LOCAL) != 0)
1916 +    {
1917 +      *error_message = (char *)
1918 +       _("literal relocation occurs for an external symbol");
1919 +      return bfd_reloc_outofrange;
1920 +    }
1921 +
1922 +  /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
1923 +  if (output_bfd != NULL)
1924 +    relocatable = TRUE;
1925 +  else
1926 +    {
1927 +      relocatable = FALSE;
1928 +      output_bfd = symbol->section->output_section->owner;
1929 +    }
1930 +
1931 +  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
1932 +                          &gp);
1933 +  if (ret != bfd_reloc_ok)
1934 +    return ret;
1935 +
1936 +  return _bfd_riscv_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1937 +                                       input_section, relocatable,
1938 +                                       data, gp);
1939 +}
1940 +
1941 +/* Do a R_RISCV_GPREL32 relocation.  This is a 32 bit value which must
1942 +   become the offset from the gp register.  */
1943 +
1944 +static bfd_reloc_status_type
1945 +mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1946 +                       void *data, asection *input_section, bfd *output_bfd,
1947 +                       char **error_message)
1948 +{
1949 +  bfd_boolean relocatable;
1950 +  bfd_reloc_status_type ret;
1951 +  bfd_vma gp;
1952 +
1953 +  /* R_RISCV_GPREL32 relocations are defined for local symbols only.  */
1954 +  if (output_bfd != NULL
1955 +      && (symbol->flags & BSF_SECTION_SYM) == 0
1956 +      && (symbol->flags & BSF_LOCAL) != 0)
1957 +    {
1958 +      *error_message = (char *)
1959 +       _("32bits gp relative relocation occurs for an external symbol");
1960 +      return bfd_reloc_outofrange;
1961 +    }
1962 +
1963 +  if (output_bfd != NULL)
1964 +    {
1965 +      relocatable = TRUE;
1966 +      gp = _bfd_get_gp_value (output_bfd);
1967 +    }
1968 +  else
1969 +    {
1970 +      relocatable = FALSE;
1971 +      output_bfd = symbol->section->output_section->owner;
1972 +
1973 +      ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
1974 +                              error_message, &gp);
1975 +      if (ret != bfd_reloc_ok)
1976 +       return ret;
1977 +    }
1978 +
1979 +  return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
1980 +                         relocatable, data, gp);
1981 +}
1982 +
1983 +static bfd_reloc_status_type
1984 +gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
1985 +                asection *input_section, bfd_boolean relocatable,
1986 +                void *data, bfd_vma gp)
1987 +{
1988 +  bfd_vma relocation;
1989 +  unsigned long val;
1990 +
1991 +  if (bfd_is_com_section (symbol->section))
1992 +    relocation = 0;
1993 +  else
1994 +    relocation = symbol->value;
1995 +
1996 +  relocation += symbol->section->output_section->vma;
1997 +  relocation += symbol->section->output_offset;
1998 +
1999 +  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2000 +    return bfd_reloc_outofrange;
2001 +
2002 +  if (reloc_entry->howto->src_mask == 0)
2003 +    val = 0;
2004 +  else
2005 +    val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
2006 +
2007 +  /* Set val to the offset into the section or symbol.  */
2008 +  val += reloc_entry->addend;
2009 +
2010 +  /* Adjust val for the final section location and GP value.  If we
2011 +     are producing relocatable output, we don't want to do this for
2012 +     an external symbol.  */
2013 +  if (! relocatable
2014 +      || (symbol->flags & BSF_SECTION_SYM) != 0)
2015 +    val += relocation - gp;
2016 +
2017 +  bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
2018 +
2019 +  if (relocatable)
2020 +    reloc_entry->address += input_section->output_offset;
2021 +
2022 +  return bfd_reloc_ok;
2023 +}
2024 +
2025 +/* Handle a mips16 GP relative reloc.  */
2026 +
2027 +static bfd_reloc_status_type
2028 +mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2029 +                   void *data, asection *input_section, bfd *output_bfd,
2030 +                   char **error_message)
2031 +{
2032 +  bfd_boolean relocatable;
2033 +  bfd_reloc_status_type ret;
2034 +  bfd_vma gp;
2035 +
2036 +  /* If we're relocating, and this is an external symbol, we don't want
2037 +     to change anything.  */
2038 +  if (output_bfd != NULL
2039 +      && (symbol->flags & BSF_SECTION_SYM) == 0
2040 +      && (symbol->flags & BSF_LOCAL) != 0)
2041 +    {
2042 +      reloc_entry->address += input_section->output_offset;
2043 +      return bfd_reloc_ok;
2044 +    }
2045 +
2046 +  if (output_bfd != NULL)
2047 +    relocatable = TRUE;
2048 +  else
2049 +    {
2050 +      relocatable = FALSE;
2051 +      output_bfd = symbol->section->output_section->owner;
2052 +    }
2053 +
2054 +  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
2055 +                          &gp);
2056 +  if (ret != bfd_reloc_ok)
2057 +    return ret;
2058 +
2059 +  ret = _bfd_riscv_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2060 +                                      input_section, relocatable,
2061 +                                      data, gp);
2062 +
2063 +  return ret;
2064 +}
2065 +\f
2066 +/* A mapping from BFD reloc types to MIPS ELF reloc types.  */
2067 +
2068 +struct elf_reloc_map {
2069 +  bfd_reloc_code_real_type bfd_val;
2070 +  enum elf_riscv_reloc_type elf_val;
2071 +};
2072 +
2073 +static const struct elf_reloc_map mips_reloc_map[] =
2074 +{
2075 +  { BFD_RELOC_NONE, R_RISCV_NONE },
2076 +  { BFD_RELOC_32, R_RISCV_32 },
2077 +  /* There is no BFD reloc for R_RISCV_REL32.  */
2078 +  { BFD_RELOC_CTOR, R_RISCV_32 },
2079 +  { BFD_RELOC_64, R_RISCV_64 },
2080 +  { BFD_RELOC_16_PCREL_S2, R_RISCV_PC16 },
2081 +  { BFD_RELOC_HI16_S, R_RISCV_HI16 },
2082 +  { BFD_RELOC_LO16, R_RISCV_LO16 },
2083 +  { BFD_RELOC_GPREL16, R_RISCV_GPREL16 },
2084 +  { BFD_RELOC_GPREL32, R_RISCV_GPREL32 },
2085 +  { BFD_RELOC_MIPS_JMP, R_RISCV_26 },
2086 +  { BFD_RELOC_MIPS_LITERAL, R_RISCV_LITERAL },
2087 +  { BFD_RELOC_MIPS_GOT16, R_RISCV_GOT16 },
2088 +  { BFD_RELOC_MIPS_CALL16, R_RISCV_CALL16 },
2089 +  { BFD_RELOC_MIPS_GOT_DISP, R_RISCV_GOT_DISP },
2090 +  { BFD_RELOC_MIPS_GOT_HI16, R_RISCV_GOT_HI16 },
2091 +  { BFD_RELOC_MIPS_GOT_LO16, R_RISCV_GOT_LO16 },
2092 +  { BFD_RELOC_MIPS_SUB, R_RISCV_SUB },
2093 +  { BFD_RELOC_MIPS_INSERT_A, R_RISCV_INSERT_A },
2094 +  { BFD_RELOC_MIPS_INSERT_B, R_RISCV_INSERT_B },
2095 +  { BFD_RELOC_MIPS_DELETE, R_RISCV_DELETE },
2096 +  { BFD_RELOC_MIPS_CALL_HI16, R_RISCV_CALL_HI16 },
2097 +  { BFD_RELOC_MIPS_CALL_LO16, R_RISCV_CALL_LO16 },
2098 +  { BFD_RELOC_MIPS_SCN_DISP, R_RISCV_SCN_DISP },
2099 +  { BFD_RELOC_MIPS_REL16, R_RISCV_REL16 },
2100 +  /* Use of R_RISCV_ADD_IMMEDIATE and R_RISCV_PJUMP is deprecated.  */
2101 +  { BFD_RELOC_MIPS_RELGOT, R_RISCV_RELGOT },
2102 +  { BFD_RELOC_MIPS_JALR, R_RISCV_JALR },
2103 +  { BFD_RELOC_MIPS_TLS_DTPMOD32, R_RISCV_TLS_DTPMOD32 },
2104 +  { BFD_RELOC_MIPS_TLS_DTPREL32, R_RISCV_TLS_DTPREL32 },
2105 +  { BFD_RELOC_MIPS_TLS_DTPMOD64, R_RISCV_TLS_DTPMOD64 },
2106 +  { BFD_RELOC_MIPS_TLS_DTPREL64, R_RISCV_TLS_DTPREL64 },
2107 +  { BFD_RELOC_MIPS_TLS_GD, R_RISCV_TLS_GD },
2108 +  { BFD_RELOC_MIPS_TLS_LDM, R_RISCV_TLS_LDM },
2109 +  { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_RISCV_TLS_DTPREL_HI16 },
2110 +  { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_RISCV_TLS_DTPREL_LO16 },
2111 +  { BFD_RELOC_MIPS_TLS_GOTTPREL, R_RISCV_TLS_GOTTPREL },
2112 +  { BFD_RELOC_MIPS_TLS_TPREL32, R_RISCV_TLS_TPREL32 },
2113 +  { BFD_RELOC_MIPS_TLS_TPREL64, R_RISCV_TLS_TPREL64 },
2114 +  { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_RISCV_TLS_TPREL_HI16 },
2115 +  { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_RISCV_TLS_TPREL_LO16 }
2116 +};
2117 +
2118 +static const struct elf_reloc_map mips16_reloc_map[] =
2119 +{
2120 +  { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
2121 +  { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
2122 +  { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
2123 +  { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
2124 +  { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
2125 +  { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
2126 +};
2127 +
2128 +/* Given a BFD reloc type, return a howto structure.  */
2129 +
2130 +static reloc_howto_type *
2131 +bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2132 +                                bfd_reloc_code_real_type code)
2133 +{
2134 +  unsigned int i;
2135 +  /* FIXME: We default to RELA here instead of choosing the right
2136 +     relocation variant.  */
2137 +  reloc_howto_type *howto_table = elf_mips_howto_table_rela;
2138 +  reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;
2139 +
2140 +  for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
2141 +       i++)
2142 +    {
2143 +      if (mips_reloc_map[i].bfd_val == code)
2144 +       return &howto_table[(int) mips_reloc_map[i].elf_val];
2145 +    }
2146 +
2147 +  for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
2148 +       i++)
2149 +    {
2150 +      if (mips16_reloc_map[i].bfd_val == code)
2151 +       return &howto16_table[(int) mips16_reloc_map[i].elf_val];
2152 +    }
2153 +
2154 +  switch (code)
2155 +    {
2156 +    case BFD_RELOC_VTABLE_INHERIT:
2157 +      return &elf_mips_gnu_vtinherit_howto;
2158 +    case BFD_RELOC_VTABLE_ENTRY:
2159 +      return &elf_mips_gnu_vtentry_howto;
2160 +    case BFD_RELOC_MIPS_COPY:
2161 +      return &elf_mips_copy_howto;
2162 +    case BFD_RELOC_MIPS_JUMP_SLOT:
2163 +      return &elf_mips_jump_slot_howto;
2164 +    default:
2165 +      bfd_set_error (bfd_error_bad_value);
2166 +      return NULL;
2167 +    }
2168 +}
2169 +
2170 +static reloc_howto_type *
2171 +bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2172 +                                const char *r_name)
2173 +{
2174 +  unsigned int i;
2175 +
2176 +  for (i = 0;
2177 +       i < (sizeof (elf_mips_howto_table_rela)
2178 +           / sizeof (elf_mips_howto_table_rela[0]));
2179 +       i++)
2180 +    if (elf_mips_howto_table_rela[i].name != NULL
2181 +       && strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
2182 +      return &elf_mips_howto_table_rela[i];
2183 +
2184 +  for (i = 0;
2185 +       i < (sizeof (elf_mips16_howto_table_rela)
2186 +           / sizeof (elf_mips16_howto_table_rela[0]));
2187 +       i++)
2188 +    if (elf_mips16_howto_table_rela[i].name != NULL
2189 +       && strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
2190 +      return &elf_mips16_howto_table_rela[i];
2191 +
2192 +  if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
2193 +    return &elf_mips_gnu_vtinherit_howto;
2194 +  if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
2195 +    return &elf_mips_gnu_vtentry_howto;
2196 +  if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
2197 +    return &elf_mips_gnu_rel16_s2;
2198 +  if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
2199 +    return &elf_mips_gnu_rela16_s2;
2200 +  if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
2201 +    return &elf_mips_copy_howto;
2202 +  if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
2203 +    return &elf_mips_jump_slot_howto;
2204 +
2205 +  return NULL;
2206 +}
2207 +
2208 +/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
2209 +
2210 +static reloc_howto_type *
2211 +mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
2212 +{
2213 +  switch (r_type)
2214 +    {
2215 +    case R_RISCV_GNU_VTINHERIT:
2216 +      return &elf_mips_gnu_vtinherit_howto;
2217 +    case R_RISCV_GNU_VTENTRY:
2218 +      return &elf_mips_gnu_vtentry_howto;
2219 +    case R_RISCV_GNU_REL16_S2:
2220 +      if (rela_p)
2221 +       return &elf_mips_gnu_rela16_s2;
2222 +      else
2223 +       return &elf_mips_gnu_rel16_s2;
2224 +    case R_RISCV_COPY:
2225 +      return &elf_mips_copy_howto;
2226 +    case R_RISCV_JUMP_SLOT:
2227 +      return &elf_mips_jump_slot_howto;
2228 +    default:
2229 +      if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
2230 +       {
2231 +         if (rela_p)
2232 +           return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
2233 +         else
2234 +           return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
2235 +       }
2236 +      BFD_ASSERT (r_type < (unsigned int) R_RISCV_max);
2237 +      if (rela_p)
2238 +       return &elf_mips_howto_table_rela[r_type];
2239 +      else
2240 +       return &elf_mips_howto_table_rel[r_type];
2241 +      break;
2242 +    }
2243 +}
2244 +
2245 +/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
2246 +
2247 +static void
2248 +mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
2249 +{
2250 +  unsigned int r_type;
2251 +
2252 +  r_type = ELF32_R_TYPE (dst->r_info);
2253 +  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE);
2254 +
2255 +  /* The addend for a GPREL16 or LITERAL relocation comes from the GP
2256 +     value for the object file.  We get the addend now, rather than
2257 +     when we do the relocation, because the symbol manipulations done
2258 +     by the linker may cause us to lose track of the input BFD.  */
2259 +  if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
2260 +      && (r_type == R_RISCV_GPREL16 || r_type == (unsigned int) R_RISCV_LITERAL))
2261 +    cache_ptr->addend = elf_gp (abfd);
2262 +}
2263 +
2264 +/* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
2265 +
2266 +static void
2267 +mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
2268 +                        arelent *cache_ptr, Elf_Internal_Rela *dst)
2269 +{
2270 +  unsigned int r_type;
2271 +
2272 +  r_type = ELF32_R_TYPE (dst->r_info);
2273 +  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
2274 +  cache_ptr->addend = dst->r_addend;
2275 +}
2276 +\f
2277 +/* Determine whether a symbol is global for the purposes of splitting
2278 +   the symbol table into global symbols and local symbols.  At least
2279 +   on Irix 5, this split must be between section symbols and all other
2280 +   symbols.  On most ELF targets the split is between static symbols
2281 +   and externally visible symbols.  */
2282 +
2283 +static bfd_boolean
2284 +mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
2285 +{
2286 +  return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
2287 +         || bfd_is_und_section (bfd_get_section (sym))
2288 +         || bfd_is_com_section (bfd_get_section (sym)));
2289 +}
2290 +\f
2291 +/* Set the right machine number for a MIPS ELF file.  */
2292 +
2293 +static bfd_boolean
2294 +mips_elf_n32_object_p (bfd *abfd)
2295 +{
2296 +  unsigned long mach;
2297 +
2298 +  mach = _bfd_elf_riscv_mach (elf_elfheader (abfd)->e_flags);
2299 +  bfd_default_set_arch_mach (abfd, bfd_arch_riscv, mach);
2300 +
2301 +  if (! ABI_N32_P(abfd))
2302 +    return FALSE;
2303 +
2304 +  return TRUE;
2305 +}
2306 +\f
2307 +/* Support for core dump NOTE sections.  */
2308 +static bfd_boolean
2309 +elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2310 +{
2311 +  int offset;
2312 +  unsigned int size;
2313 +
2314 +  switch (note->descsz)
2315 +    {
2316 +      default:
2317 +       return FALSE;
2318 +
2319 +      case 440:                /* Linux/MIPS N32 */
2320 +       /* pr_cursig */
2321 +       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2322 +
2323 +       /* pr_pid */
2324 +       elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
2325 +
2326 +       /* pr_reg */
2327 +       offset = 72;
2328 +       size = 360;
2329 +
2330 +       break;
2331 +    }
2332 +
2333 +  /* Make a ".reg/999" section.  */
2334 +  return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
2335 +                                         note->descpos + offset);
2336 +}
2337 +
2338 +static bfd_boolean
2339 +elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2340 +{
2341 +  switch (note->descsz)
2342 +    {
2343 +      default:
2344 +       return FALSE;
2345 +
2346 +      case 128:                /* Linux/MIPS elf_prpsinfo */
2347 +       elf_tdata (abfd)->core_program
2348 +        = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
2349 +       elf_tdata (abfd)->core_command
2350 +        = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
2351 +    }
2352 +
2353 +  /* Note that for some reason, a spurious space is tacked
2354 +     onto the end of the args in some (at least one anyway)
2355 +     implementations, so strip it off if it exists.  */
2356 +
2357 +  {
2358 +    char *command = elf_tdata (abfd)->core_command;
2359 +    int n = strlen (command);
2360 +
2361 +    if (0 < n && command[n - 1] == ' ')
2362 +      command[n - 1] = '\0';
2363 +  }
2364 +
2365 +  return TRUE;
2366 +}
2367 +
2368 +/* ECOFF swapping routines.  These are used when dealing with the
2369 +   .mdebug section, which is in the ECOFF debugging format.  */
2370 +static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
2371 +  /* Symbol table magic number.  */
2372 +  magicSym,
2373 +  /* Alignment of debugging information.  E.g., 4.  */
2374 +  4,
2375 +  /* Sizes of external symbolic information.  */
2376 +  sizeof (struct hdr_ext),
2377 +  sizeof (struct dnr_ext),
2378 +  sizeof (struct pdr_ext),
2379 +  sizeof (struct sym_ext),
2380 +  sizeof (struct opt_ext),
2381 +  sizeof (struct fdr_ext),
2382 +  sizeof (struct rfd_ext),
2383 +  sizeof (struct ext_ext),
2384 +  /* Functions to swap in external symbolic data.  */
2385 +  ecoff_swap_hdr_in,
2386 +  ecoff_swap_dnr_in,
2387 +  ecoff_swap_pdr_in,
2388 +  ecoff_swap_sym_in,
2389 +  ecoff_swap_opt_in,
2390 +  ecoff_swap_fdr_in,
2391 +  ecoff_swap_rfd_in,
2392 +  ecoff_swap_ext_in,
2393 +  _bfd_ecoff_swap_tir_in,
2394 +  _bfd_ecoff_swap_rndx_in,
2395 +  /* Functions to swap out external symbolic data.  */
2396 +  ecoff_swap_hdr_out,
2397 +  ecoff_swap_dnr_out,
2398 +  ecoff_swap_pdr_out,
2399 +  ecoff_swap_sym_out,
2400 +  ecoff_swap_opt_out,
2401 +  ecoff_swap_fdr_out,
2402 +  ecoff_swap_rfd_out,
2403 +  ecoff_swap_ext_out,
2404 +  _bfd_ecoff_swap_tir_out,
2405 +  _bfd_ecoff_swap_rndx_out,
2406 +  /* Function to read in symbolic data.  */
2407 +  _bfd_riscv_elf_read_ecoff_info
2408 +};
2409 +\f
2410 +#define ELF_ARCH                       bfd_arch_riscv
2411 +#define ELF_TARGET_ID                  MIPS_ELF_DATA
2412 +#define ELF_MACHINE_CODE               EM_RISCV
2413 +
2414 +#define elf_backend_collect            TRUE
2415 +#define elf_backend_type_change_ok     TRUE
2416 +#define elf_backend_can_gc_sections    TRUE
2417 +#define elf_info_to_howto              mips_info_to_howto_rela
2418 +#define elf_info_to_howto_rel          mips_info_to_howto_rel
2419 +#define elf_backend_sym_is_global      mips_elf_sym_is_global
2420 +#define elf_backend_object_p           mips_elf_n32_object_p
2421 +#define elf_backend_symbol_processing  _bfd_riscv_elf_symbol_processing
2422 +#define elf_backend_section_processing _bfd_riscv_elf_section_processing
2423 +#define elf_backend_section_from_shdr  _bfd_riscv_elf_section_from_shdr
2424 +#define elf_backend_fake_sections      _bfd_riscv_elf_fake_sections
2425 +#define elf_backend_section_from_bfd_section \
2426 +                                       _bfd_riscv_elf_section_from_bfd_section
2427 +#define elf_backend_add_symbol_hook    _bfd_riscv_elf_add_symbol_hook
2428 +#define elf_backend_link_output_symbol_hook \
2429 +                                       _bfd_riscv_elf_link_output_symbol_hook
2430 +#define elf_backend_create_dynamic_sections \
2431 +                                       _bfd_riscv_elf_create_dynamic_sections
2432 +#define elf_backend_check_relocs       _bfd_riscv_elf_check_relocs
2433 +#define elf_backend_merge_symbol_attribute \
2434 +                                       _bfd_riscv_elf_merge_symbol_attribute
2435 +#define elf_backend_get_target_dtag    _bfd_riscv_elf_get_target_dtag
2436 +#define elf_backend_adjust_dynamic_symbol \
2437 +                                       _bfd_riscv_elf_adjust_dynamic_symbol
2438 +#define elf_backend_always_size_sections \
2439 +                                       _bfd_riscv_elf_always_size_sections
2440 +#define elf_backend_size_dynamic_sections \
2441 +                                       _bfd_riscv_elf_size_dynamic_sections
2442 +#define elf_backend_init_index_section _bfd_elf_init_1_index_section
2443 +#define elf_backend_relocate_section   _bfd_riscv_elf_relocate_section
2444 +#define elf_backend_finish_dynamic_symbol \
2445 +                                       _bfd_riscv_elf_finish_dynamic_symbol
2446 +#define elf_backend_finish_dynamic_sections \
2447 +                                       _bfd_riscv_elf_finish_dynamic_sections
2448 +#define elf_backend_final_write_processing \
2449 +                                       _bfd_riscv_elf_final_write_processing
2450 +#define elf_backend_additional_program_headers \
2451 +                                       _bfd_riscv_elf_additional_program_headers
2452 +#define elf_backend_modify_segment_map _bfd_riscv_elf_modify_segment_map
2453 +#define elf_backend_gc_mark_hook       _bfd_riscv_elf_gc_mark_hook
2454 +#define elf_backend_gc_sweep_hook      _bfd_riscv_elf_gc_sweep_hook
2455 +#define elf_backend_copy_indirect_symbol \
2456 +                                       _bfd_riscv_elf_copy_indirect_symbol
2457 +#define elf_backend_grok_prstatus      elf32_mips_grok_prstatus
2458 +#define elf_backend_grok_psinfo                elf32_mips_grok_psinfo
2459 +#define elf_backend_ecoff_debug_swap   &mips_elf32_ecoff_debug_swap
2460 +
2461 +#define elf_backend_got_header_size    (4 * MIPS_RESERVED_GOTNO)
2462 +
2463 +/* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
2464 +   work better/work only in RELA, so we default to this.  */
2465 +#define elf_backend_may_use_rel_p      1
2466 +#define elf_backend_may_use_rela_p     1
2467 +#define elf_backend_default_use_rela_p 1
2468 +#define elf_backend_rela_plts_and_copies_p 0
2469 +#define elf_backend_sign_extend_vma    TRUE
2470 +#define elf_backend_plt_readonly       1
2471 +#define elf_backend_plt_sym_val                _bfd_riscv_elf_plt_sym_val
2472 +
2473 +#define elf_backend_discard_info       _bfd_riscv_elf_discard_info
2474 +#define elf_backend_ignore_discarded_relocs \
2475 +                                       _bfd_riscv_elf_ignore_discarded_relocs
2476 +#define elf_backend_write_section      _bfd_riscv_elf_write_section
2477 +#define elf_backend_mips_rtype_to_howto        mips_elf_n32_rtype_to_howto
2478 +#define bfd_elf32_find_nearest_line    _bfd_riscv_elf_find_nearest_line
2479 +#define bfd_elf32_find_inliner_info    _bfd_riscv_elf_find_inliner_info
2480 +#define bfd_elf32_new_section_hook     _bfd_riscv_elf_new_section_hook
2481 +#define bfd_elf32_set_section_contents _bfd_riscv_elf_set_section_contents
2482 +#define bfd_elf32_bfd_get_relocated_section_contents \
2483 +                               _bfd_elf_riscv_get_relocated_section_contents
2484 +#define bfd_elf32_bfd_link_hash_table_create \
2485 +                                       _bfd_riscv_elf_link_hash_table_create
2486 +#define bfd_elf32_bfd_final_link       _bfd_riscv_elf_final_link
2487 +#define bfd_elf32_bfd_merge_private_bfd_data \
2488 +                                       _bfd_riscv_elf_merge_private_bfd_data
2489 +#define bfd_elf32_bfd_set_private_flags        _bfd_riscv_elf_set_private_flags
2490 +#define bfd_elf32_bfd_print_private_bfd_data \
2491 +                                       _bfd_riscv_elf_print_private_bfd_data
2492 +#define bfd_elf32_bfd_relax_section     _bfd_riscv_relax_section
2493 +
2494 +/* Support for SGI-ish mips targets using n32 ABI.  */
2495 +
2496 +#define TARGET_LITTLE_SYM               bfd_elf32_littleriscv_vec
2497 +#define TARGET_LITTLE_NAME              "elf32-littleriscv"
2498 +#define TARGET_BIG_SYM                  bfd_elf32_bigriscv_vec
2499 +#define TARGET_BIG_NAME                 "elf32-bigriscv"
2500 +
2501 +#define ELF_MAXPAGESIZE                        0x10000
2502 +#define ELF_COMMONPAGESIZE             0x1000
2503 +
2504 +#include "elf32-target.h"
2505 diff --git a/binutils-2.21.1/bfd/elf64-riscv.c b/binutils-2.21.1/bfd/elf64-riscv.c
2506 new file mode 100644
2507 index 0000000..aa3dca1
2508 --- /dev/null
2509 +++ binutils-2.21.1/bfd/elf64-riscv.c
2510 @@ -0,0 +1,3296 @@
2511 +/* MIPS-specific support for 64-bit ELF
2512 +   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2513 +   2006, 2007, 2008, 2009, 2010
2514 +   Free Software Foundation, Inc.
2515 +   Ian Lance Taylor, Cygnus Support
2516 +   Linker support added by Mark Mitchell, CodeSourcery, LLC.
2517 +   <mark@codesourcery.com>
2518 +
2519 +   This file is part of BFD, the Binary File Descriptor library.
2520 +
2521 +   This program is free software; you can redistribute it and/or modify
2522 +   it under the terms of the GNU General Public License as published by
2523 +   the Free Software Foundation; either version 3 of the License, or
2524 +   (at your option) any later version.
2525 +
2526 +   This program is distributed in the hope that it will be useful,
2527 +   but WITHOUT ANY WARRANTY; without even the implied warranty of
2528 +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2529 +   GNU General Public License for more details.
2530 +
2531 +   You should have received a copy of the GNU General Public License
2532 +   along with this program; if not, write to the Free Software
2533 +   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
2534 +   MA 02110-1301, USA.  */
2535 +
2536 +
2537 +/* This file supports the 64-bit MIPS ELF ABI.
2538 +
2539 +   The MIPS 64-bit ELF ABI uses an unusual reloc format.  This file
2540 +   overrides the usual ELF reloc handling, and handles reading and
2541 +   writing the relocations here.  */
2542 +
2543 +/* TODO: Many things are unsupported, even if there is some code for it
2544 + .       (which was mostly stolen from elf32-mips.c and slightly adapted).
2545 + .
2546 + .   - Relocation handling for REL relocs is wrong in many cases and
2547 + .     generally untested.
2548 + .   - Relocation handling for RELA relocs related to GOT support are
2549 + .     also likely to be wrong.
2550 + .   - Support for MIPS16 is untested.
2551 + .   - Combined relocs with RSS_* entries are unsupported.
2552 + .   - The whole GOT handling for NewABI is missing, some parts of
2553 + .     the OldABI version is still lying around and should be removed.
2554 + */
2555 +
2556 +#include "sysdep.h"
2557 +#include "bfd.h"
2558 +#include "libbfd.h"
2559 +#include "aout/ar.h"
2560 +#include "bfdlink.h"
2561 +#include "genlink.h"
2562 +#include "elf-bfd.h"
2563 +#include "elfxx-riscv.h"
2564 +#include "elf/riscv.h"
2565 +#include "opcode/riscv.h"
2566 +
2567 +/* Get the ECOFF swapping routines.  The 64-bit ABI is not supposed to
2568 +   use ECOFF.  However, we support it anyhow for an easier changeover.  */
2569 +#include "coff/sym.h"
2570 +#include "coff/symconst.h"
2571 +#include "coff/internal.h"
2572 +#include "coff/ecoff.h"
2573 +/* The 64 bit versions of the mdebug data structures are in alpha.h.  */
2574 +#include "coff/alpha.h"
2575 +#define ECOFF_SIGNED_64
2576 +#include "ecoffswap.h"
2577 +
2578 +#include "opcode/riscv.h"
2579 +
2580 +static void mips_elf64_swap_reloc_in
2581 +  (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
2582 +static void mips_elf64_swap_reloca_in
2583 +  (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
2584 +static void mips_elf64_swap_reloc_out
2585 +  (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
2586 +static void mips_elf64_swap_reloca_out
2587 +  (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
2588 +static void mips_elf64_be_swap_reloc_in
2589 +  (bfd *, const bfd_byte *, Elf_Internal_Rela *);
2590 +static void mips_elf64_be_swap_reloc_out
2591 +  (bfd *, const Elf_Internal_Rela *, bfd_byte *);
2592 +static void mips_elf64_be_swap_reloca_in
2593 +  (bfd *, const bfd_byte *, Elf_Internal_Rela *);
2594 +static void mips_elf64_be_swap_reloca_out
2595 +  (bfd *, const Elf_Internal_Rela *, bfd_byte *);
2596 +static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
2597 +  (bfd *, bfd_reloc_code_real_type);
2598 +static reloc_howto_type *mips_elf64_rtype_to_howto
2599 +  (unsigned int, bfd_boolean);
2600 +static void mips_elf64_info_to_howto_rel
2601 +  (bfd *, arelent *, Elf_Internal_Rela *);
2602 +static void mips_elf64_info_to_howto_rela
2603 +  (bfd *, arelent *, Elf_Internal_Rela *);
2604 +static long mips_elf64_get_reloc_upper_bound
2605 +  (bfd *, asection *);
2606 +static long mips_elf64_canonicalize_reloc
2607 +  (bfd *, asection *, arelent **, asymbol **);
2608 +static long mips_elf64_get_dynamic_reloc_upper_bound
2609 +  (bfd *);
2610 +static long mips_elf64_canonicalize_dynamic_reloc
2611 +  (bfd *, arelent **, asymbol **);
2612 +static bfd_boolean mips_elf64_slurp_one_reloc_table
2613 +  (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
2614 +   asymbol **, bfd_boolean);
2615 +static bfd_boolean mips_elf64_slurp_reloc_table
2616 +  (bfd *, asection *, asymbol **, bfd_boolean);
2617 +static void mips_elf64_write_relocs
2618 +  (bfd *, asection *, void *);
2619 +static void mips_elf64_write_rel
2620 +  (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
2621 +static void mips_elf64_write_rela
2622 +  (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
2623 +static bfd_reloc_status_type mips_elf64_gprel16_reloc
2624 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2625 +static bfd_reloc_status_type mips_elf64_literal_reloc
2626 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2627 +static bfd_reloc_status_type mips_elf64_gprel32_reloc
2628 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2629 +static bfd_reloc_status_type mips16_gprel_reloc
2630 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2631 +static bfd_boolean mips_elf64_assign_gp
2632 +  (bfd *, bfd_vma *);
2633 +static bfd_reloc_status_type mips_elf64_final_gp
2634 +  (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
2635 +static bfd_boolean mips_elf64_object_p
2636 +  (bfd *);
2637 +static bfd_boolean elf64_mips_grok_prstatus
2638 +  (bfd *, Elf_Internal_Note *);
2639 +static bfd_boolean elf64_mips_grok_psinfo
2640 +  (bfd *, Elf_Internal_Note *);
2641 +
2642 +/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
2643 +   from smaller values.  Start with zero, widen, *then* decrement.  */
2644 +#define MINUS_ONE      (((bfd_vma)0) - 1)
2645 +
2646 +/* The number of local .got entries we reserve.  */
2647 +#define MIPS_RESERVED_GOTNO (2)
2648 +\f
2649 +/* The relocation table used for SHT_REL sections.  */
2650 +
2651 +static reloc_howto_type mips_elf64_howto_table_rel[] =
2652 +{
2653 +  /* No relocation.  */
2654 +  HOWTO (R_RISCV_NONE,         /* type */
2655 +        0,                     /* rightshift */
2656 +        0,                     /* size (0 = byte, 1 = short, 2 = long) */
2657 +        0,                     /* bitsize */
2658 +        FALSE,                 /* pc_relative */
2659 +        0,                     /* bitpos */
2660 +        complain_overflow_dont, /* complain_on_overflow */
2661 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2662 +        "R_RISCV_NONE",                /* name */
2663 +        FALSE,                 /* partial_inplace */
2664 +        0,                     /* src_mask */
2665 +        0,                     /* dst_mask */
2666 +        FALSE),                /* pcrel_offset */
2667 +
2668 +  EMPTY_HOWTO (1),
2669 +
2670 +  /* 32 bit relocation.  */
2671 +  HOWTO (R_RISCV_32,           /* type */
2672 +        0,                     /* rightshift */
2673 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2674 +        32,                    /* bitsize */
2675 +        FALSE,                 /* pc_relative */
2676 +        0,                     /* bitpos */
2677 +        complain_overflow_dont, /* complain_on_overflow */
2678 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2679 +        "R_RISCV_32",          /* name */
2680 +        TRUE,                  /* partial_inplace */
2681 +        0xffffffff,            /* src_mask */
2682 +        0xffffffff,            /* dst_mask */
2683 +        FALSE),                /* pcrel_offset */
2684 +
2685 +  /* 32 bit symbol relative relocation.  */
2686 +  HOWTO (R_RISCV_REL32,                /* type */
2687 +        0,                     /* rightshift */
2688 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2689 +        32,                    /* bitsize */
2690 +        FALSE,                 /* pc_relative */
2691 +        0,                     /* bitpos */
2692 +        complain_overflow_dont, /* complain_on_overflow */
2693 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2694 +        "R_RISCV_REL32",       /* name */
2695 +        TRUE,                  /* partial_inplace */
2696 +        0xffffffff,            /* src_mask */
2697 +        0xffffffff,            /* dst_mask */
2698 +        FALSE),                /* pcrel_offset */
2699 +
2700 +  /* 26 bit jump address.  */
2701 +  HOWTO (R_RISCV_26,           /* type */
2702 +        RISCV_JUMP_ALIGN_BITS,                 /* rightshift */
2703 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2704 +        RISCV_JUMP_BITS,                       /* bitsize */
2705 +        TRUE,                  /* pc_relative */
2706 +        OP_SH_TARGET,                  /* bitpos */
2707 +        complain_overflow_dont, /* complain_on_overflow */
2708 +                               /* This needs complex overflow
2709 +                                  detection, because the upper 36
2710 +                                  bits must match the PC + 4.  */
2711 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2712 +        "R_RISCV_26",          /* name */
2713 +        TRUE,                  /* partial_inplace */
2714 +        ((1<<RISCV_JUMP_BITS)-1) << OP_SH_TARGET,              /* src_mask */
2715 +        ((1<<RISCV_JUMP_BITS)-1) << OP_SH_TARGET,              /* dst_mask */
2716 +        TRUE),         /* pcrel_offset */
2717 +
2718 +  /* R_RISCV_HI16 and R_RISCV_LO16 are unsupported for NewABI REL.
2719 +     However, the native IRIX6 tools use them, so we try our best. */
2720 +
2721 +  /* High 16 bits of symbol value.  */
2722 +  HOWTO (R_RISCV_HI16,         /* type */
2723 +        RISCV_IMM_BITS,                        /* rightshift */
2724 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2725 +        RISCV_BIGIMM_BITS,                     /* bitsize */
2726 +        FALSE,                 /* pc_relative */
2727 +        OP_SH_BIGIMMEDIATE,                    /* bitpos */
2728 +        complain_overflow_dont, /* complain_on_overflow */
2729 +        _bfd_riscv_elf_hi16_reloc, /* special_function */
2730 +        "R_RISCV_HI16",                /* name */
2731 +        TRUE,                  /* partial_inplace */
2732 +        ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,              /* src_mask */
2733 +        ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,              /* dst_mask */
2734 +        FALSE),                /* pcrel_offset */
2735 +
2736 +  /* Low 16 bits of symbol value.  */
2737 +  HOWTO (R_RISCV_LO16,         /* type */
2738 +        0,                     /* rightshift */
2739 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2740 +        RISCV_IMM_BITS,                        /* bitsize */
2741 +        FALSE,                 /* pc_relative */
2742 +        OP_SH_IMMEDIATE,                       /* bitpos */
2743 +        complain_overflow_dont, /* complain_on_overflow */
2744 +        _bfd_riscv_elf_lo16_reloc, /* special_function */
2745 +        "R_RISCV_LO16",                /* name */
2746 +        TRUE,                  /* partial_inplace */
2747 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* src_mask */
2748 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* dst_mask */
2749 +        FALSE),                /* pcrel_offset */
2750 +
2751 +  /* GP relative reference.  */
2752 +  HOWTO (R_RISCV_GPREL16,      /* type */
2753 +        0,                     /* rightshift */
2754 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2755 +        RISCV_IMM_BITS,                        /* bitsize */
2756 +        FALSE,                 /* pc_relative */
2757 +        OP_SH_IMMEDIATE,       /* bitpos */
2758 +        complain_overflow_signed, /* complain_on_overflow */
2759 +        mips_elf64_gprel16_reloc, /* special_function */
2760 +        "R_RISCV_GPREL16",     /* name */
2761 +        TRUE,                  /* partial_inplace */
2762 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
2763 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
2764 +        FALSE),                /* pcrel_offset */
2765 +
2766 +  /* Reference to literal section.  */
2767 +  HOWTO (R_RISCV_LITERAL,      /* type */
2768 +        0,                     /* rightshift */
2769 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2770 +        RISCV_IMM_BITS,                        /* bitsize */
2771 +        FALSE,                 /* pc_relative */
2772 +        OP_SH_IMMEDIATE,       /* bitpos */
2773 +        complain_overflow_signed, /* complain_on_overflow */
2774 +        mips_elf64_literal_reloc, /* special_function */
2775 +        "R_RISCV_LITERAL",     /* name */
2776 +        TRUE,                  /* partial_inplace */
2777 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
2778 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
2779 +        FALSE),                /* pcrel_offset */
2780 +
2781 +  /* Reference to global offset table.  */
2782 +  HOWTO (R_RISCV_GOT16,                /* type */
2783 +        0,                     /* rightshift */
2784 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2785 +        RISCV_IMM_BITS,        /* bitsize */
2786 +        FALSE,                 /* pc_relative */
2787 +        OP_SH_IMMEDIATE,       /* bitpos */
2788 +        complain_overflow_signed, /* complain_on_overflow */
2789 +        _bfd_riscv_elf_got16_reloc, /* special_function */
2790 +        "R_RISCV_GOT16",       /* name */
2791 +        TRUE,                  /* partial_inplace */
2792 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* src_mask */
2793 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* dst_mask */
2794 +        FALSE),                /* pcrel_offset */
2795 +
2796 +  /* 16 bit PC relative reference.  Note that the ABI document has a typo
2797 +     and claims R_RISCV_PC16 to be not rightshifted, rendering it useless.
2798 +     We do the right thing here.  */
2799 +  HOWTO (R_RISCV_PC16,         /* type */
2800 +        RISCV_BRANCH_ALIGN_BITS,                       /* rightshift */
2801 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2802 +        RISCV_IMM_BITS,                        /* bitsize */
2803 +        TRUE,                  /* pc_relative */
2804 +        OP_SH_IMMEDIATE,       /* bitpos */
2805 +        complain_overflow_signed, /* complain_on_overflow */
2806 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2807 +        "R_RISCV_PC16",                /* name */
2808 +        TRUE,                  /* partial_inplace */
2809 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
2810 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
2811 +        TRUE),                 /* pcrel_offset */
2812 +
2813 +  /* 16 bit call through global offset table.  */
2814 +  HOWTO (R_RISCV_CALL16,               /* type */
2815 +        0,                     /* rightshift */
2816 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2817 +        RISCV_IMM_BITS,                        /* bitsize */
2818 +        FALSE,                 /* pc_relative */
2819 +        OP_SH_IMMEDIATE,       /* bitpos */
2820 +        complain_overflow_signed, /* complain_on_overflow */
2821 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2822 +        "R_RISCV_CALL16",      /* name */
2823 +        TRUE,                  /* partial_inplace */
2824 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
2825 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
2826 +        FALSE),                /* pcrel_offset */
2827 +
2828 +  /* 32 bit GP relative reference.  */
2829 +  HOWTO (R_RISCV_GPREL32,      /* type */
2830 +        0,                     /* rightshift */
2831 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2832 +        32,                    /* bitsize */
2833 +        FALSE,                 /* pc_relative */
2834 +        0,                     /* bitpos */
2835 +        complain_overflow_dont, /* complain_on_overflow */
2836 +        mips_elf64_gprel32_reloc, /* special_function */
2837 +        "R_RISCV_GPREL32",     /* name */
2838 +        TRUE,                  /* partial_inplace */
2839 +        0xffffffff,            /* src_mask */
2840 +        0xffffffff,            /* dst_mask */
2841 +        FALSE),                /* pcrel_offset */
2842 +
2843 +  EMPTY_HOWTO (13),
2844 +  EMPTY_HOWTO (14),
2845 +  EMPTY_HOWTO (15),
2846 +  EMPTY_HOWTO (16),
2847 +  EMPTY_HOWTO (17),
2848 +
2849 +  /* 64 bit relocation.  */
2850 +  HOWTO (R_RISCV_64,           /* type */
2851 +        0,                     /* rightshift */
2852 +        4,            &n