]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elfn32-mips.c
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / bfd / elfn32-mips.c
CommitLineData
8a397dad 1/* MIPS-specific support for 32-bit ELF
219d1afa 2 Copyright (C) 1993-2018 Free Software Foundation, Inc.
8a397dad
TS
3
4 Most of the information added by Ian Lance Taylor, Cygnus Support,
5 <ian@cygnus.com>.
6 N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
7 <mark@codesourcery.com>
8 Traditional MIPS targets support added by Koundinya.K, Dansk Data
9 Elektronik & Operations Research Group. <kk@ddeorg.soft.net>
10
cd123cb7 11 This file is part of BFD, the Binary File Descriptor library.
8a397dad 12
cd123cb7
NC
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 3 of the License, or
16 (at your option) any later version.
8a397dad 17
cd123cb7
NC
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
26 MA 02110-1301, USA. */
8a397dad 27
8a397dad
TS
28
29/* This file handles MIPS ELF targets. SGI Irix 5 uses a slightly
30 different MIPS ELF from other targets. This matters when linking.
31 This file supports both, switching at runtime. */
32
8a397dad 33#include "sysdep.h"
3db64b00 34#include "bfd.h"
8a397dad
TS
35#include "libbfd.h"
36#include "bfdlink.h"
37#include "genlink.h"
38#include "elf-bfd.h"
39#include "elfxx-mips.h"
40#include "elf/mips.h"
41
42/* Get the ECOFF swapping routines. */
43#include "coff/sym.h"
44#include "coff/symconst.h"
45#include "coff/internal.h"
46#include "coff/ecoff.h"
47#include "coff/mips.h"
48#define ECOFF_SIGNED_32
49#include "ecoffswap.h"
50
b34976b6 51static bfd_boolean mips_elf_assign_gp
11a2be4d 52 (bfd *, bfd_vma *);
8a397dad 53static bfd_reloc_status_type mips_elf_final_gp
11a2be4d 54 (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
8a397dad 55static bfd_reloc_status_type mips_elf_gprel16_reloc
11a2be4d 56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
8a397dad 57static bfd_reloc_status_type mips_elf_literal_reloc
11a2be4d 58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
8a397dad 59static bfd_reloc_status_type mips_elf_gprel32_reloc
11a2be4d 60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
8a397dad 61static bfd_reloc_status_type gprel32_with_gp
11a2be4d 62 (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma);
8a397dad 63static bfd_reloc_status_type mips_elf_shift6_reloc
11a2be4d 64 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
8a397dad 65static bfd_reloc_status_type mips16_gprel_reloc
11a2be4d 66 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
8a397dad 67static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
11a2be4d 68 (bfd *, bfd_reloc_code_real_type);
8a397dad 69static reloc_howto_type *mips_elf_n32_rtype_to_howto
11a2be4d 70 (unsigned int, bfd_boolean);
8a397dad 71static void mips_info_to_howto_rel
11a2be4d 72 (bfd *, arelent *, Elf_Internal_Rela *);
8a397dad 73static void mips_info_to_howto_rela
11a2be4d 74 (bfd *, arelent *, Elf_Internal_Rela *);
b34976b6 75static bfd_boolean mips_elf_sym_is_global
11a2be4d 76 (bfd *, asymbol *);
b34976b6 77static bfd_boolean mips_elf_n32_object_p
11a2be4d 78 (bfd *);
b34976b6 79static bfd_boolean elf32_mips_grok_prstatus
11a2be4d 80 (bfd *, Elf_Internal_Note *);
b34976b6 81static bfd_boolean elf32_mips_grok_psinfo
11a2be4d 82 (bfd *, Elf_Internal_Note *);
544c67cd
JB
83static bfd_boolean elf_n32_mips_grok_freebsd_prstatus
84 (bfd *, Elf_Internal_Note *);
8a397dad 85static irix_compat_t elf_n32_mips_irix_compat
11a2be4d 86 (bfd *);
defc8e2b
MR
87static bfd_boolean mips_elf_n32_mkobject
88 (bfd *);
8a397dad 89
6d00b590
AM
90extern const bfd_target mips_elf32_n_be_vec;
91extern const bfd_target mips_elf32_n_le_vec;
8a397dad 92
8a397dad
TS
93/* Nonzero if ABFD is using the N32 ABI. */
94#define ABI_N32_P(abfd) \
95 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
96
97/* Whether we are trying to be compatible with IRIX at all. */
98#define SGI_COMPAT(abfd) \
99 (elf_n32_mips_irix_compat (abfd) != ict_none)
100
101/* The number of local .got entries we reserve. */
102#define MIPS_RESERVED_GOTNO (2)
103
104/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
105 from smaller values. Start with zero, widen, *then* decrement. */
106#define MINUS_ONE (((bfd_vma)0) - 1)
107
108/* The relocation table used for SHT_REL sections. */
109
110static reloc_howto_type elf_mips_howto_table_rel[] =
111{
112 /* No relocation. */
113 HOWTO (R_MIPS_NONE, /* type */
114 0, /* rightshift */
6346d5ca 115 3, /* size (0 = byte, 1 = short, 2 = long) */
8a397dad 116 0, /* bitsize */
b34976b6 117 FALSE, /* pc_relative */
8a397dad
TS
118 0, /* bitpos */
119 complain_overflow_dont, /* complain_on_overflow */
30ac9238 120 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 121 "R_MIPS_NONE", /* name */
b34976b6 122 FALSE, /* partial_inplace */
8a397dad
TS
123 0, /* src_mask */
124 0, /* dst_mask */
b34976b6 125 FALSE), /* pcrel_offset */
8a397dad
TS
126
127 /* 16 bit relocation. */
128 HOWTO (R_MIPS_16, /* type */
129 0, /* rightshift */
130 2, /* size (0 = byte, 1 = short, 2 = long) */
131 16, /* bitsize */
b34976b6 132 FALSE, /* pc_relative */
8a397dad
TS
133 0, /* bitpos */
134 complain_overflow_signed, /* complain_on_overflow */
30ac9238 135 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 136 "R_MIPS_16", /* name */
b34976b6 137 TRUE, /* partial_inplace */
8a397dad
TS
138 0x0000ffff, /* src_mask */
139 0x0000ffff, /* dst_mask */
b34976b6 140 FALSE), /* pcrel_offset */
8a397dad
TS
141
142 /* 32 bit relocation. */
143 HOWTO (R_MIPS_32, /* type */
144 0, /* rightshift */
145 2, /* size (0 = byte, 1 = short, 2 = long) */
146 32, /* bitsize */
b34976b6 147 FALSE, /* pc_relative */
8a397dad
TS
148 0, /* bitpos */
149 complain_overflow_dont, /* complain_on_overflow */
30ac9238 150 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 151 "R_MIPS_32", /* name */
b34976b6 152 TRUE, /* partial_inplace */
8a397dad
TS
153 0xffffffff, /* src_mask */
154 0xffffffff, /* dst_mask */
b34976b6 155 FALSE), /* pcrel_offset */
8a397dad
TS
156
157 /* 32 bit symbol relative relocation. */
158 HOWTO (R_MIPS_REL32, /* type */
159 0, /* rightshift */
160 2, /* size (0 = byte, 1 = short, 2 = long) */
161 32, /* bitsize */
b34976b6 162 FALSE, /* pc_relative */
8a397dad
TS
163 0, /* bitpos */
164 complain_overflow_dont, /* complain_on_overflow */
30ac9238 165 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 166 "R_MIPS_REL32", /* name */
b34976b6 167 TRUE, /* partial_inplace */
8a397dad
TS
168 0xffffffff, /* src_mask */
169 0xffffffff, /* dst_mask */
b34976b6 170 FALSE), /* pcrel_offset */
8a397dad
TS
171
172 /* 26 bit jump address. */
173 HOWTO (R_MIPS_26, /* type */
174 2, /* rightshift */
175 2, /* size (0 = byte, 1 = short, 2 = long) */
176 26, /* bitsize */
b34976b6 177 FALSE, /* pc_relative */
8a397dad
TS
178 0, /* bitpos */
179 complain_overflow_dont, /* complain_on_overflow */
07d6d2b8 180 /* This needs complex overflow
8a397dad
TS
181 detection, because the upper four
182 bits must match the PC + 4. */
30ac9238 183 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 184 "R_MIPS_26", /* name */
b34976b6 185 TRUE, /* partial_inplace */
8a397dad
TS
186 0x03ffffff, /* src_mask */
187 0x03ffffff, /* dst_mask */
b34976b6 188 FALSE), /* pcrel_offset */
8a397dad
TS
189
190 /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
191 However, the native IRIX6 tools use them, so we try our best. */
192
193 /* High 16 bits of symbol value. */
194 HOWTO (R_MIPS_HI16, /* type */
30ac9238 195 16, /* rightshift */
8a397dad
TS
196 2, /* size (0 = byte, 1 = short, 2 = long) */
197 16, /* bitsize */
b34976b6 198 FALSE, /* pc_relative */
8a397dad
TS
199 0, /* bitpos */
200 complain_overflow_dont, /* complain_on_overflow */
30ac9238 201 _bfd_mips_elf_hi16_reloc, /* special_function */
8a397dad 202 "R_MIPS_HI16", /* name */
b34976b6 203 TRUE, /* partial_inplace */
8a397dad
TS
204 0x0000ffff, /* src_mask */
205 0x0000ffff, /* dst_mask */
b34976b6 206 FALSE), /* pcrel_offset */
8a397dad
TS
207
208 /* Low 16 bits of symbol value. */
209 HOWTO (R_MIPS_LO16, /* type */
210 0, /* rightshift */
211 2, /* size (0 = byte, 1 = short, 2 = long) */
212 16, /* bitsize */
b34976b6 213 FALSE, /* pc_relative */
8a397dad
TS
214 0, /* bitpos */
215 complain_overflow_dont, /* complain_on_overflow */
30ac9238 216 _bfd_mips_elf_lo16_reloc, /* special_function */
8a397dad 217 "R_MIPS_LO16", /* name */
b34976b6 218 TRUE, /* partial_inplace */
8a397dad
TS
219 0x0000ffff, /* src_mask */
220 0x0000ffff, /* dst_mask */
b34976b6 221 FALSE), /* pcrel_offset */
8a397dad
TS
222
223 /* GP relative reference. */
224 HOWTO (R_MIPS_GPREL16, /* type */
225 0, /* rightshift */
226 2, /* size (0 = byte, 1 = short, 2 = long) */
227 16, /* bitsize */
b34976b6 228 FALSE, /* pc_relative */
8a397dad
TS
229 0, /* bitpos */
230 complain_overflow_signed, /* complain_on_overflow */
231 mips_elf_gprel16_reloc, /* special_function */
232 "R_MIPS_GPREL16", /* name */
b34976b6 233 TRUE, /* partial_inplace */
8a397dad
TS
234 0x0000ffff, /* src_mask */
235 0x0000ffff, /* dst_mask */
b34976b6 236 FALSE), /* pcrel_offset */
8a397dad
TS
237
238 /* Reference to literal section. */
239 HOWTO (R_MIPS_LITERAL, /* type */
240 0, /* rightshift */
241 2, /* size (0 = byte, 1 = short, 2 = long) */
242 16, /* bitsize */
b34976b6 243 FALSE, /* pc_relative */
8a397dad
TS
244 0, /* bitpos */
245 complain_overflow_signed, /* complain_on_overflow */
246 mips_elf_literal_reloc, /* special_function */
247 "R_MIPS_LITERAL", /* name */
b34976b6 248 TRUE, /* partial_inplace */
8a397dad
TS
249 0x0000ffff, /* src_mask */
250 0x0000ffff, /* dst_mask */
b34976b6 251 FALSE), /* pcrel_offset */
8a397dad
TS
252
253 /* Reference to global offset table. */
254 HOWTO (R_MIPS_GOT16, /* type */
255 0, /* rightshift */
256 2, /* size (0 = byte, 1 = short, 2 = long) */
257 16, /* bitsize */
b34976b6 258 FALSE, /* pc_relative */
8a397dad
TS
259 0, /* bitpos */
260 complain_overflow_signed, /* complain_on_overflow */
30ac9238 261 _bfd_mips_elf_got16_reloc, /* special_function */
8a397dad 262 "R_MIPS_GOT16", /* name */
b34976b6 263 TRUE, /* partial_inplace */
8a397dad
TS
264 0x0000ffff, /* src_mask */
265 0x0000ffff, /* dst_mask */
b34976b6 266 FALSE), /* pcrel_offset */
8a397dad 267
bad36eac
DJ
268 /* 16 bit PC relative reference. Note that the ABI document has a typo
269 and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
270 We do the right thing here. */
8a397dad 271 HOWTO (R_MIPS_PC16, /* type */
bad36eac 272 2, /* rightshift */
8a397dad
TS
273 2, /* size (0 = byte, 1 = short, 2 = long) */
274 16, /* bitsize */
b34976b6 275 TRUE, /* pc_relative */
8a397dad
TS
276 0, /* bitpos */
277 complain_overflow_signed, /* complain_on_overflow */
30ac9238 278 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 279 "R_MIPS_PC16", /* name */
b34976b6 280 TRUE, /* partial_inplace */
8a397dad
TS
281 0x0000ffff, /* src_mask */
282 0x0000ffff, /* dst_mask */
b34976b6 283 TRUE), /* pcrel_offset */
8a397dad
TS
284
285 /* 16 bit call through global offset table. */
286 HOWTO (R_MIPS_CALL16, /* type */
287 0, /* rightshift */
288 2, /* size (0 = byte, 1 = short, 2 = long) */
289 16, /* bitsize */
b34976b6 290 FALSE, /* pc_relative */
8a397dad
TS
291 0, /* bitpos */
292 complain_overflow_signed, /* complain_on_overflow */
30ac9238 293 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 294 "R_MIPS_CALL16", /* name */
b34976b6 295 TRUE, /* partial_inplace */
8a397dad
TS
296 0x0000ffff, /* src_mask */
297 0x0000ffff, /* dst_mask */
b34976b6 298 FALSE), /* pcrel_offset */
8a397dad
TS
299
300 /* 32 bit GP relative reference. */
301 HOWTO (R_MIPS_GPREL32, /* type */
302 0, /* rightshift */
303 2, /* size (0 = byte, 1 = short, 2 = long) */
304 32, /* bitsize */
b34976b6 305 FALSE, /* pc_relative */
8a397dad
TS
306 0, /* bitpos */
307 complain_overflow_dont, /* complain_on_overflow */
308 mips_elf_gprel32_reloc, /* special_function */
309 "R_MIPS_GPREL32", /* name */
b34976b6 310 TRUE, /* partial_inplace */
8a397dad
TS
311 0xffffffff, /* src_mask */
312 0xffffffff, /* dst_mask */
b34976b6 313 FALSE), /* pcrel_offset */
8a397dad
TS
314
315 /* The remaining relocs are defined on Irix 5, although they are
316 not defined by the ABI. */
317 EMPTY_HOWTO (13),
318 EMPTY_HOWTO (14),
319 EMPTY_HOWTO (15),
320
321 /* A 5 bit shift field. */
322 HOWTO (R_MIPS_SHIFT5, /* type */
323 0, /* rightshift */
324 2, /* size (0 = byte, 1 = short, 2 = long) */
325 5, /* bitsize */
b34976b6 326 FALSE, /* pc_relative */
8a397dad
TS
327 6, /* bitpos */
328 complain_overflow_bitfield, /* complain_on_overflow */
30ac9238 329 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 330 "R_MIPS_SHIFT5", /* name */
b34976b6 331 TRUE, /* partial_inplace */
8a397dad
TS
332 0x000007c0, /* src_mask */
333 0x000007c0, /* dst_mask */
b34976b6 334 FALSE), /* pcrel_offset */
8a397dad
TS
335
336 /* A 6 bit shift field. */
337 HOWTO (R_MIPS_SHIFT6, /* type */
338 0, /* rightshift */
339 2, /* size (0 = byte, 1 = short, 2 = long) */
340 6, /* bitsize */
b34976b6 341 FALSE, /* pc_relative */
8a397dad
TS
342 6, /* bitpos */
343 complain_overflow_bitfield, /* complain_on_overflow */
344 mips_elf_shift6_reloc, /* special_function */
345 "R_MIPS_SHIFT6", /* name */
b34976b6 346 TRUE, /* partial_inplace */
8a397dad
TS
347 0x000007c4, /* src_mask */
348 0x000007c4, /* dst_mask */
b34976b6 349 FALSE), /* pcrel_offset */
8a397dad
TS
350
351 /* A 64 bit relocation. */
352 HOWTO (R_MIPS_64, /* type */
353 0, /* rightshift */
354 4, /* size (0 = byte, 1 = short, 2 = long) */
355 64, /* bitsize */
b34976b6 356 FALSE, /* pc_relative */
8a397dad
TS
357 0, /* bitpos */
358 complain_overflow_dont, /* complain_on_overflow */
30ac9238 359 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 360 "R_MIPS_64", /* name */
b34976b6 361 TRUE, /* partial_inplace */
8a397dad
TS
362 MINUS_ONE, /* src_mask */
363 MINUS_ONE, /* dst_mask */
b34976b6 364 FALSE), /* pcrel_offset */
8a397dad
TS
365
366 /* Displacement in the global offset table. */
367 HOWTO (R_MIPS_GOT_DISP, /* type */
368 0, /* rightshift */
369 2, /* size (0 = byte, 1 = short, 2 = long) */
370 16, /* bitsize */
b34976b6 371 FALSE, /* pc_relative */
8a397dad
TS
372 0, /* bitpos */
373 complain_overflow_signed, /* complain_on_overflow */
30ac9238 374 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 375 "R_MIPS_GOT_DISP", /* name */
b34976b6 376 TRUE, /* partial_inplace */
8a397dad
TS
377 0x0000ffff, /* src_mask */
378 0x0000ffff, /* dst_mask */
b34976b6 379 FALSE), /* pcrel_offset */
8a397dad
TS
380
381 /* Displacement to page pointer in the global offset table. */
382 HOWTO (R_MIPS_GOT_PAGE, /* type */
383 0, /* rightshift */
384 2, /* size (0 = byte, 1 = short, 2 = long) */
385 16, /* bitsize */
b34976b6 386 FALSE, /* pc_relative */
8a397dad
TS
387 0, /* bitpos */
388 complain_overflow_signed, /* complain_on_overflow */
30ac9238 389 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 390 "R_MIPS_GOT_PAGE", /* name */
b34976b6 391 TRUE, /* partial_inplace */
8a397dad
TS
392 0x0000ffff, /* src_mask */
393 0x0000ffff, /* dst_mask */
b34976b6 394 FALSE), /* pcrel_offset */
8a397dad
TS
395
396 /* Offset from page pointer in the global offset table. */
397 HOWTO (R_MIPS_GOT_OFST, /* type */
398 0, /* rightshift */
399 2, /* size (0 = byte, 1 = short, 2 = long) */
400 16, /* bitsize */
b34976b6 401 FALSE, /* pc_relative */
8a397dad
TS
402 0, /* bitpos */
403 complain_overflow_signed, /* complain_on_overflow */
30ac9238 404 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 405 "R_MIPS_GOT_OFST", /* name */
b34976b6 406 TRUE, /* partial_inplace */
8a397dad
TS
407 0x0000ffff, /* src_mask */
408 0x0000ffff, /* dst_mask */
b34976b6 409 FALSE), /* pcrel_offset */
8a397dad
TS
410
411 /* High 16 bits of displacement in global offset table. */
412 HOWTO (R_MIPS_GOT_HI16, /* type */
413 0, /* rightshift */
414 2, /* size (0 = byte, 1 = short, 2 = long) */
415 16, /* bitsize */
b34976b6 416 FALSE, /* pc_relative */
8a397dad
TS
417 0, /* bitpos */
418 complain_overflow_dont, /* complain_on_overflow */
30ac9238 419 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 420 "R_MIPS_GOT_HI16", /* name */
b34976b6 421 TRUE, /* partial_inplace */
8a397dad
TS
422 0x0000ffff, /* src_mask */
423 0x0000ffff, /* dst_mask */
b34976b6 424 FALSE), /* pcrel_offset */
8a397dad
TS
425
426 /* Low 16 bits of displacement in global offset table. */
427 HOWTO (R_MIPS_GOT_LO16, /* type */
428 0, /* rightshift */
429 2, /* size (0 = byte, 1 = short, 2 = long) */
430 16, /* bitsize */
b34976b6 431 FALSE, /* pc_relative */
8a397dad
TS
432 0, /* bitpos */
433 complain_overflow_dont, /* complain_on_overflow */
30ac9238 434 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 435 "R_MIPS_GOT_LO16", /* name */
b34976b6 436 TRUE, /* partial_inplace */
8a397dad
TS
437 0x0000ffff, /* src_mask */
438 0x0000ffff, /* dst_mask */
b34976b6 439 FALSE), /* pcrel_offset */
8a397dad
TS
440
441 /* 64 bit subtraction. */
442 HOWTO (R_MIPS_SUB, /* type */
443 0, /* rightshift */
444 4, /* size (0 = byte, 1 = short, 2 = long) */
445 64, /* bitsize */
b34976b6 446 FALSE, /* pc_relative */
8a397dad
TS
447 0, /* bitpos */
448 complain_overflow_dont, /* complain_on_overflow */
30ac9238 449 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 450 "R_MIPS_SUB", /* name */
b34976b6 451 TRUE, /* partial_inplace */
8a397dad
TS
452 MINUS_ONE, /* src_mask */
453 MINUS_ONE, /* dst_mask */
b34976b6 454 FALSE), /* pcrel_offset */
8a397dad
TS
455
456 /* Insert the addend as an instruction. */
457 /* FIXME: Not handled correctly. */
458 HOWTO (R_MIPS_INSERT_A, /* type */
459 0, /* rightshift */
460 2, /* size (0 = byte, 1 = short, 2 = long) */
461 32, /* bitsize */
b34976b6 462 FALSE, /* pc_relative */
8a397dad
TS
463 0, /* bitpos */
464 complain_overflow_dont, /* complain_on_overflow */
30ac9238 465 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 466 "R_MIPS_INSERT_A", /* name */
b34976b6 467 TRUE, /* partial_inplace */
8a397dad
TS
468 0xffffffff, /* src_mask */
469 0xffffffff, /* dst_mask */
b34976b6 470 FALSE), /* pcrel_offset */
8a397dad
TS
471
472 /* Insert the addend as an instruction, and change all relocations
473 to refer to the old instruction at the address. */
474 /* FIXME: Not handled correctly. */
475 HOWTO (R_MIPS_INSERT_B, /* type */
476 0, /* rightshift */
477 2, /* size (0 = byte, 1 = short, 2 = long) */
478 32, /* bitsize */
b34976b6 479 FALSE, /* pc_relative */
8a397dad
TS
480 0, /* bitpos */
481 complain_overflow_dont, /* complain_on_overflow */
30ac9238 482 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 483 "R_MIPS_INSERT_B", /* name */
b34976b6 484 TRUE, /* partial_inplace */
8a397dad
TS
485 0xffffffff, /* src_mask */
486 0xffffffff, /* dst_mask */
b34976b6 487 FALSE), /* pcrel_offset */
8a397dad
TS
488
489 /* Delete a 32 bit instruction. */
490 /* FIXME: Not handled correctly. */
491 HOWTO (R_MIPS_DELETE, /* type */
492 0, /* rightshift */
493 2, /* size (0 = byte, 1 = short, 2 = long) */
494 32, /* bitsize */
b34976b6 495 FALSE, /* pc_relative */
8a397dad
TS
496 0, /* bitpos */
497 complain_overflow_dont, /* complain_on_overflow */
30ac9238 498 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 499 "R_MIPS_DELETE", /* name */
b34976b6 500 TRUE, /* partial_inplace */
8a397dad
TS
501 0xffffffff, /* src_mask */
502 0xffffffff, /* dst_mask */
b34976b6 503 FALSE), /* pcrel_offset */
8a397dad
TS
504
505 /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
506 We don't, because
507 a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
508 R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
509 fallable heuristics.
6422fbef 510 b) No other NewABI toolchain actually emits such relocations. */
8a397dad
TS
511 EMPTY_HOWTO (R_MIPS_HIGHER),
512 EMPTY_HOWTO (R_MIPS_HIGHEST),
513
514 /* High 16 bits of displacement in global offset table. */
515 HOWTO (R_MIPS_CALL_HI16, /* type */
516 0, /* rightshift */
517 2, /* size (0 = byte, 1 = short, 2 = long) */
518 16, /* bitsize */
b34976b6 519 FALSE, /* pc_relative */
8a397dad
TS
520 0, /* bitpos */
521 complain_overflow_dont, /* complain_on_overflow */
30ac9238 522 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 523 "R_MIPS_CALL_HI16", /* name */
b34976b6 524 TRUE, /* partial_inplace */
8a397dad
TS
525 0x0000ffff, /* src_mask */
526 0x0000ffff, /* dst_mask */
b34976b6 527 FALSE), /* pcrel_offset */
8a397dad
TS
528
529 /* Low 16 bits of displacement in global offset table. */
530 HOWTO (R_MIPS_CALL_LO16, /* type */
531 0, /* rightshift */
532 2, /* size (0 = byte, 1 = short, 2 = long) */
533 16, /* bitsize */
b34976b6 534 FALSE, /* pc_relative */
8a397dad
TS
535 0, /* bitpos */
536 complain_overflow_dont, /* complain_on_overflow */
30ac9238 537 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 538 "R_MIPS_CALL_LO16", /* name */
b34976b6 539 TRUE, /* partial_inplace */
8a397dad
TS
540 0x0000ffff, /* src_mask */
541 0x0000ffff, /* dst_mask */
b34976b6 542 FALSE), /* pcrel_offset */
8a397dad
TS
543
544 /* Section displacement. */
545 HOWTO (R_MIPS_SCN_DISP, /* type */
546 0, /* rightshift */
547 2, /* size (0 = byte, 1 = short, 2 = long) */
548 32, /* bitsize */
b34976b6 549 FALSE, /* pc_relative */
8a397dad
TS
550 0, /* bitpos */
551 complain_overflow_dont, /* complain_on_overflow */
30ac9238 552 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 553 "R_MIPS_SCN_DISP", /* name */
b34976b6 554 TRUE, /* partial_inplace */
8a397dad
TS
555 0xffffffff, /* src_mask */
556 0xffffffff, /* dst_mask */
b34976b6 557 FALSE), /* pcrel_offset */
8a397dad
TS
558
559 HOWTO (R_MIPS_REL16, /* type */
560 0, /* rightshift */
561 1, /* size (0 = byte, 1 = short, 2 = long) */
562 16, /* bitsize */
b34976b6 563 FALSE, /* pc_relative */
8a397dad
TS
564 0, /* bitpos */
565 complain_overflow_signed, /* complain_on_overflow */
30ac9238 566 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 567 "R_MIPS_REL16", /* name */
b34976b6 568 TRUE, /* partial_inplace */
8a397dad
TS
569 0xffff, /* src_mask */
570 0xffff, /* dst_mask */
b34976b6 571 FALSE), /* pcrel_offset */
8a397dad
TS
572
573 /* These two are obsolete. */
574 EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
575 EMPTY_HOWTO (R_MIPS_PJUMP),
576
577 /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
578 It must be used for multigot GOT's (and only there). */
579 HOWTO (R_MIPS_RELGOT, /* type */
580 0, /* rightshift */
581 2, /* size (0 = byte, 1 = short, 2 = long) */
582 32, /* bitsize */
b34976b6 583 FALSE, /* pc_relative */
8a397dad
TS
584 0, /* bitpos */
585 complain_overflow_dont, /* complain_on_overflow */
30ac9238 586 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 587 "R_MIPS_RELGOT", /* name */
b34976b6 588 TRUE, /* partial_inplace */
8a397dad
TS
589 0xffffffff, /* src_mask */
590 0xffffffff, /* dst_mask */
b34976b6 591 FALSE), /* pcrel_offset */
8a397dad
TS
592
593 /* Protected jump conversion. This is an optimization hint. No
594 relocation is required for correctness. */
07d6d2b8 595 HOWTO (R_MIPS_JALR, /* type */
8a397dad
TS
596 0, /* rightshift */
597 2, /* size (0 = byte, 1 = short, 2 = long) */
598 32, /* bitsize */
b34976b6 599 FALSE, /* pc_relative */
8a397dad
TS
600 0, /* bitpos */
601 complain_overflow_dont, /* complain_on_overflow */
30ac9238 602 _bfd_mips_elf_generic_reloc, /* special_function */
07d6d2b8 603 "R_MIPS_JALR", /* name */
b34976b6 604 FALSE, /* partial_inplace */
8a397dad
TS
605 0x00000000, /* src_mask */
606 0x00000000, /* dst_mask */
b34976b6 607 FALSE), /* pcrel_offset */
0f20cc35
DJ
608
609 /* TLS GD/LD dynamic relocations. */
610 HOWTO (R_MIPS_TLS_DTPMOD32, /* type */
611 0, /* rightshift */
612 2, /* size (0 = byte, 1 = short, 2 = long) */
613 32, /* bitsize */
614 FALSE, /* pc_relative */
615 0, /* bitpos */
616 complain_overflow_dont, /* complain_on_overflow */
617 _bfd_mips_elf_generic_reloc, /* special_function */
618 "R_MIPS_TLS_DTPMOD32", /* name */
619 TRUE, /* partial_inplace */
620 0xffffffff, /* src_mask */
621 0xffffffff, /* dst_mask */
622 FALSE), /* pcrel_offset */
623
624 HOWTO (R_MIPS_TLS_DTPREL32, /* type */
625 0, /* rightshift */
626 2, /* size (0 = byte, 1 = short, 2 = long) */
627 32, /* bitsize */
628 FALSE, /* pc_relative */
629 0, /* bitpos */
630 complain_overflow_dont, /* complain_on_overflow */
631 _bfd_mips_elf_generic_reloc, /* special_function */
632 "R_MIPS_TLS_DTPREL32", /* name */
633 TRUE, /* partial_inplace */
634 0xffffffff, /* src_mask */
635 0xffffffff, /* dst_mask */
636 FALSE), /* pcrel_offset */
637
638 EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
639 EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
640
641 /* TLS general dynamic variable reference. */
642 HOWTO (R_MIPS_TLS_GD, /* type */
643 0, /* rightshift */
644 2, /* size (0 = byte, 1 = short, 2 = long) */
645 16, /* bitsize */
646 FALSE, /* pc_relative */
647 0, /* bitpos */
648 complain_overflow_signed, /* complain_on_overflow */
649 _bfd_mips_elf_generic_reloc, /* special_function */
650 "R_MIPS_TLS_GD", /* name */
651 TRUE, /* partial_inplace */
652 0x0000ffff, /* src_mask */
653 0x0000ffff, /* dst_mask */
654 FALSE), /* pcrel_offset */
655
656 /* TLS local dynamic variable reference. */
657 HOWTO (R_MIPS_TLS_LDM, /* type */
658 0, /* rightshift */
659 2, /* size (0 = byte, 1 = short, 2 = long) */
660 16, /* bitsize */
661 FALSE, /* pc_relative */
662 0, /* bitpos */
663 complain_overflow_signed, /* complain_on_overflow */
664 _bfd_mips_elf_generic_reloc, /* special_function */
665 "R_MIPS_TLS_LDM", /* name */
666 TRUE, /* partial_inplace */
667 0x0000ffff, /* src_mask */
668 0x0000ffff, /* dst_mask */
669 FALSE), /* pcrel_offset */
670
671 /* TLS local dynamic offset. */
672 HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
673 0, /* rightshift */
674 2, /* size (0 = byte, 1 = short, 2 = long) */
675 16, /* bitsize */
676 FALSE, /* pc_relative */
677 0, /* bitpos */
678 complain_overflow_signed, /* complain_on_overflow */
679 _bfd_mips_elf_generic_reloc, /* special_function */
680 "R_MIPS_TLS_DTPREL_HI16", /* name */
681 TRUE, /* partial_inplace */
682 0x0000ffff, /* src_mask */
683 0x0000ffff, /* dst_mask */
684 FALSE), /* pcrel_offset */
685
686 /* TLS local dynamic offset. */
687 HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
688 0, /* rightshift */
689 2, /* size (0 = byte, 1 = short, 2 = long) */
690 16, /* bitsize */
691 FALSE, /* pc_relative */
692 0, /* bitpos */
693 complain_overflow_signed, /* complain_on_overflow */
694 _bfd_mips_elf_generic_reloc, /* special_function */
695 "R_MIPS_TLS_DTPREL_LO16", /* name */
696 TRUE, /* partial_inplace */
697 0x0000ffff, /* src_mask */
698 0x0000ffff, /* dst_mask */
699 FALSE), /* pcrel_offset */
700
701 /* TLS thread pointer offset. */
702 HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
703 0, /* rightshift */
704 2, /* size (0 = byte, 1 = short, 2 = long) */
705 16, /* bitsize */
706 FALSE, /* pc_relative */
707 0, /* bitpos */
708 complain_overflow_signed, /* complain_on_overflow */
709 _bfd_mips_elf_generic_reloc, /* special_function */
710 "R_MIPS_TLS_GOTTPREL", /* name */
711 TRUE, /* partial_inplace */
712 0x0000ffff, /* src_mask */
713 0x0000ffff, /* dst_mask */
714 FALSE), /* pcrel_offset */
715
716 /* TLS IE dynamic relocations. */
717 HOWTO (R_MIPS_TLS_TPREL32, /* 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_mips_elf_generic_reloc, /* special_function */
725 "R_MIPS_TLS_TPREL32", /* name */
726 TRUE, /* partial_inplace */
727 0xffffffff, /* src_mask */
728 0xffffffff, /* dst_mask */
729 FALSE), /* pcrel_offset */
730
731 EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
732
733 /* TLS thread pointer offset. */
734 HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
735 0, /* rightshift */
736 2, /* size (0 = byte, 1 = short, 2 = long) */
737 16, /* bitsize */
738 FALSE, /* pc_relative */
739 0, /* bitpos */
740 complain_overflow_signed, /* complain_on_overflow */
741 _bfd_mips_elf_generic_reloc, /* special_function */
742 "R_MIPS_TLS_TPREL_HI16", /* name */
743 TRUE, /* partial_inplace */
744 0x0000ffff, /* src_mask */
745 0x0000ffff, /* dst_mask */
746 FALSE), /* pcrel_offset */
747
748 /* TLS thread pointer offset. */
749 HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
750 0, /* rightshift */
751 2, /* size (0 = byte, 1 = short, 2 = long) */
752 16, /* bitsize */
753 FALSE, /* pc_relative */
754 0, /* bitpos */
755 complain_overflow_signed, /* complain_on_overflow */
756 _bfd_mips_elf_generic_reloc, /* special_function */
757 "R_MIPS_TLS_TPREL_LO16", /* name */
758 TRUE, /* partial_inplace */
759 0x0000ffff, /* src_mask */
760 0x0000ffff, /* dst_mask */
761 FALSE), /* pcrel_offset */
165b93e7
RS
762
763 /* 32 bit relocation with no addend. */
764 HOWTO (R_MIPS_GLOB_DAT, /* type */
765 0, /* rightshift */
766 2, /* size (0 = byte, 1 = short, 2 = long) */
767 32, /* bitsize */
768 FALSE, /* pc_relative */
769 0, /* bitpos */
770 complain_overflow_dont, /* complain_on_overflow */
771 _bfd_mips_elf_generic_reloc, /* special_function */
772 "R_MIPS_GLOB_DAT", /* name */
773 FALSE, /* partial_inplace */
774 0x0, /* src_mask */
775 0xffffffff, /* dst_mask */
776 FALSE), /* pcrel_offset */
7361da2c
AB
777
778 EMPTY_HOWTO (52),
779 EMPTY_HOWTO (53),
780 EMPTY_HOWTO (54),
781 EMPTY_HOWTO (55),
782 EMPTY_HOWTO (56),
783 EMPTY_HOWTO (57),
784 EMPTY_HOWTO (58),
785 EMPTY_HOWTO (59),
786
787 HOWTO (R_MIPS_PC21_S2, /* type */
788 2, /* rightshift */
789 2, /* size (0 = byte, 1 = short, 2 = long) */
790 21, /* bitsize */
791 TRUE, /* pc_relative */
792 0, /* bitpos */
793 complain_overflow_signed, /* complain_on_overflow */
794 _bfd_mips_elf_generic_reloc, /* special_function */
795 "R_MIPS_PC21_S2", /* name */
796 TRUE, /* partial_inplace */
797 0x001fffff, /* src_mask */
798 0x001fffff, /* dst_mask */
799 TRUE), /* pcrel_offset */
800
801 HOWTO (R_MIPS_PC26_S2, /* type */
802 2, /* rightshift */
803 2, /* size (0 = byte, 1 = short, 2 = long) */
804 26, /* bitsize */
805 TRUE, /* pc_relative */
806 0, /* bitpos */
807 complain_overflow_signed, /* complain_on_overflow */
808 _bfd_mips_elf_generic_reloc, /* special_function */
809 "R_MIPS_PC26_S2", /* name */
810 TRUE, /* partial_inplace */
811 0x03ffffff, /* src_mask */
812 0x03ffffff, /* dst_mask */
813 TRUE), /* pcrel_offset */
814
815 HOWTO (R_MIPS_PC18_S3, /* type */
816 3, /* rightshift */
817 2, /* size (0 = byte, 1 = short, 2 = long) */
818 18, /* bitsize */
819 TRUE, /* pc_relative */
820 0, /* bitpos */
821 complain_overflow_signed, /* complain_on_overflow */
822 _bfd_mips_elf_generic_reloc, /* special_function */
823 "R_MIPS_PC18_S3", /* name */
824 TRUE, /* partial_inplace */
825 0x0003ffff, /* src_mask */
826 0x0003ffff, /* dst_mask */
827 TRUE), /* pcrel_offset */
828
829 HOWTO (R_MIPS_PC19_S2, /* type */
830 2, /* rightshift */
831 2, /* size (0 = byte, 1 = short, 2 = long) */
832 19, /* bitsize */
833 TRUE, /* pc_relative */
834 0, /* bitpos */
835 complain_overflow_signed, /* complain_on_overflow */
836 _bfd_mips_elf_generic_reloc, /* special_function */
837 "R_MIPS_PC19_S2", /* name */
838 TRUE, /* partial_inplace */
839 0x0007ffff, /* src_mask */
840 0x0007ffff, /* dst_mask */
841 TRUE), /* pcrel_offset */
842
843 HOWTO (R_MIPS_PCHI16, /* type */
844 16, /* rightshift */
845 2, /* size (0 = byte, 1 = short, 2 = long) */
846 16, /* bitsize */
847 TRUE, /* pc_relative */
848 0, /* bitpos */
849 complain_overflow_signed, /* complain_on_overflow */
850 _bfd_mips_elf_generic_reloc, /* special_function */
851 "R_MIPS_PCHI16", /* name */
852 TRUE, /* partial_inplace */
853 0x0000ffff, /* src_mask */
854 0x0000ffff, /* dst_mask */
855 TRUE), /* pcrel_offset */
856
857 HOWTO (R_MIPS_PCLO16, /* type */
858 0, /* rightshift */
859 2, /* size (0 = byte, 1 = short, 2 = long) */
860 16, /* bitsize */
861 TRUE, /* pc_relative */
862 0, /* bitpos */
863 complain_overflow_dont, /* complain_on_overflow */
864 _bfd_mips_elf_generic_reloc, /* special_function */
865 "R_MIPS_PCLO16", /* name */
866 TRUE, /* partial_inplace */
867 0x0000ffff, /* src_mask */
868 0x0000ffff, /* dst_mask */
869 TRUE), /* pcrel_offset */
870
8a397dad
TS
871};
872
873/* The relocation table used for SHT_RELA sections. */
874
875static reloc_howto_type elf_mips_howto_table_rela[] =
876{
877 /* No relocation. */
878 HOWTO (R_MIPS_NONE, /* type */
879 0, /* rightshift */
880 0, /* size (0 = byte, 1 = short, 2 = long) */
881 0, /* bitsize */
b34976b6 882 FALSE, /* pc_relative */
8a397dad
TS
883 0, /* bitpos */
884 complain_overflow_dont, /* complain_on_overflow */
30ac9238 885 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 886 "R_MIPS_NONE", /* name */
b34976b6 887 FALSE, /* partial_inplace */
8a397dad
TS
888 0, /* src_mask */
889 0, /* dst_mask */
b34976b6 890 FALSE), /* pcrel_offset */
8a397dad
TS
891
892 /* 16 bit relocation. */
893 HOWTO (R_MIPS_16, /* type */
894 0, /* rightshift */
895 2, /* size (0 = byte, 1 = short, 2 = long) */
896 16, /* bitsize */
b34976b6 897 FALSE, /* pc_relative */
8a397dad
TS
898 0, /* bitpos */
899 complain_overflow_signed, /* complain_on_overflow */
30ac9238 900 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 901 "R_MIPS_16", /* name */
b34976b6 902 FALSE, /* partial_inplace */
8a397dad
TS
903 0, /* src_mask */
904 0x0000, /* dst_mask */
b34976b6 905 FALSE), /* pcrel_offset */
8a397dad
TS
906
907 /* 32 bit relocation. */
908 HOWTO (R_MIPS_32, /* type */
909 0, /* rightshift */
910 2, /* size (0 = byte, 1 = short, 2 = long) */
911 32, /* bitsize */
b34976b6 912 FALSE, /* pc_relative */
8a397dad
TS
913 0, /* bitpos */
914 complain_overflow_dont, /* complain_on_overflow */
30ac9238 915 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 916 "R_MIPS_32", /* name */
b34976b6 917 FALSE, /* partial_inplace */
8a397dad
TS
918 0, /* src_mask */
919 0xffffffff, /* dst_mask */
b34976b6 920 FALSE), /* pcrel_offset */
8a397dad
TS
921
922 /* 32 bit symbol relative relocation. */
923 HOWTO (R_MIPS_REL32, /* type */
924 0, /* rightshift */
925 2, /* size (0 = byte, 1 = short, 2 = long) */
926 32, /* bitsize */
b34976b6 927 FALSE, /* pc_relative */
8a397dad
TS
928 0, /* bitpos */
929 complain_overflow_dont, /* complain_on_overflow */
30ac9238 930 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 931 "R_MIPS_REL32", /* name */
b34976b6 932 FALSE, /* partial_inplace */
8a397dad
TS
933 0, /* src_mask */
934 0xffffffff, /* dst_mask */
b34976b6 935 FALSE), /* pcrel_offset */
8a397dad
TS
936
937 /* 26 bit jump address. */
938 HOWTO (R_MIPS_26, /* type */
939 2, /* rightshift */
940 2, /* size (0 = byte, 1 = short, 2 = long) */
941 26, /* bitsize */
b34976b6 942 FALSE, /* pc_relative */
8a397dad
TS
943 0, /* bitpos */
944 complain_overflow_dont, /* complain_on_overflow */
945 /* This needs complex overflow
946 detection, because the upper 36
947 bits must match the PC + 4. */
30ac9238 948 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 949 "R_MIPS_26", /* name */
b34976b6 950 FALSE, /* partial_inplace */
8a397dad
TS
951 0, /* src_mask */
952 0x03ffffff, /* dst_mask */
b34976b6 953 FALSE), /* pcrel_offset */
8a397dad
TS
954
955 /* High 16 bits of symbol value. */
956 HOWTO (R_MIPS_HI16, /* type */
957 0, /* rightshift */
958 2, /* size (0 = byte, 1 = short, 2 = long) */
959 16, /* bitsize */
b34976b6 960 FALSE, /* pc_relative */
8a397dad
TS
961 0, /* bitpos */
962 complain_overflow_dont, /* complain_on_overflow */
30ac9238 963 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 964 "R_MIPS_HI16", /* name */
b34976b6 965 FALSE, /* partial_inplace */
8a397dad
TS
966 0, /* src_mask */
967 0x0000ffff, /* dst_mask */
b34976b6 968 FALSE), /* pcrel_offset */
8a397dad
TS
969
970 /* Low 16 bits of symbol value. */
971 HOWTO (R_MIPS_LO16, /* type */
972 0, /* rightshift */
973 2, /* size (0 = byte, 1 = short, 2 = long) */
974 16, /* bitsize */
b34976b6 975 FALSE, /* pc_relative */
8a397dad
TS
976 0, /* bitpos */
977 complain_overflow_dont, /* complain_on_overflow */
30ac9238 978 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 979 "R_MIPS_LO16", /* name */
b34976b6 980 FALSE, /* partial_inplace */
8a397dad
TS
981 0, /* src_mask */
982 0x0000ffff, /* dst_mask */
b34976b6 983 FALSE), /* pcrel_offset */
8a397dad
TS
984
985 /* GP relative reference. */
986 HOWTO (R_MIPS_GPREL16, /* type */
987 0, /* rightshift */
988 2, /* size (0 = byte, 1 = short, 2 = long) */
989 16, /* bitsize */
b34976b6 990 FALSE, /* pc_relative */
8a397dad
TS
991 0, /* bitpos */
992 complain_overflow_signed, /* complain_on_overflow */
993 mips_elf_gprel16_reloc, /* special_function */
994 "R_MIPS_GPREL16", /* name */
b34976b6 995 FALSE, /* partial_inplace */
8a397dad
TS
996 0, /* src_mask */
997 0x0000ffff, /* dst_mask */
b34976b6 998 FALSE), /* pcrel_offset */
8a397dad
TS
999
1000 /* Reference to literal section. */
1001 HOWTO (R_MIPS_LITERAL, /* type */
1002 0, /* rightshift */
1003 2, /* size (0 = byte, 1 = short, 2 = long) */
1004 16, /* bitsize */
b34976b6 1005 FALSE, /* pc_relative */
8a397dad
TS
1006 0, /* bitpos */
1007 complain_overflow_signed, /* complain_on_overflow */
1008 mips_elf_literal_reloc, /* special_function */
1009 "R_MIPS_LITERAL", /* name */
b34976b6 1010 FALSE, /* partial_inplace */
8a397dad
TS
1011 0, /* src_mask */
1012 0x0000ffff, /* dst_mask */
b34976b6 1013 FALSE), /* pcrel_offset */
8a397dad
TS
1014
1015 /* Reference to global offset table. */
1016 HOWTO (R_MIPS_GOT16, /* type */
1017 0, /* rightshift */
1018 2, /* size (0 = byte, 1 = short, 2 = long) */
1019 16, /* bitsize */
b34976b6 1020 FALSE, /* pc_relative */
8a397dad
TS
1021 0, /* bitpos */
1022 complain_overflow_signed, /* complain_on_overflow */
30ac9238 1023 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1024 "R_MIPS_GOT16", /* name */
b34976b6 1025 FALSE, /* partial_inplace */
8a397dad
TS
1026 0, /* src_mask */
1027 0x0000ffff, /* dst_mask */
b34976b6 1028 FALSE), /* pcrel_offset */
8a397dad 1029
bad36eac
DJ
1030 /* 16 bit PC relative reference. Note that the ABI document has a typo
1031 and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
1032 We do the right thing here. */
8a397dad 1033 HOWTO (R_MIPS_PC16, /* type */
bad36eac 1034 2, /* rightshift */
8a397dad
TS
1035 2, /* size (0 = byte, 1 = short, 2 = long) */
1036 16, /* bitsize */
b34976b6 1037 TRUE, /* pc_relative */
8a397dad
TS
1038 0, /* bitpos */
1039 complain_overflow_signed, /* complain_on_overflow */
30ac9238 1040 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1041 "R_MIPS_PC16", /* name */
b34976b6 1042 FALSE, /* partial_inplace */
8a397dad
TS
1043 0, /* src_mask */
1044 0x0000ffff, /* dst_mask */
b34976b6 1045 TRUE), /* pcrel_offset */
8a397dad
TS
1046
1047 /* 16 bit call through global offset table. */
1048 HOWTO (R_MIPS_CALL16, /* type */
1049 0, /* rightshift */
1050 2, /* size (0 = byte, 1 = short, 2 = long) */
1051 16, /* bitsize */
b34976b6 1052 FALSE, /* pc_relative */
8a397dad
TS
1053 0, /* bitpos */
1054 complain_overflow_signed, /* complain_on_overflow */
30ac9238 1055 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1056 "R_MIPS_CALL16", /* name */
b34976b6 1057 FALSE, /* partial_inplace */
8a397dad
TS
1058 0, /* src_mask */
1059 0x0000ffff, /* dst_mask */
b34976b6 1060 FALSE), /* pcrel_offset */
8a397dad
TS
1061
1062 /* 32 bit GP relative reference. */
1063 HOWTO (R_MIPS_GPREL32, /* type */
1064 0, /* rightshift */
1065 2, /* size (0 = byte, 1 = short, 2 = long) */
1066 32, /* bitsize */
b34976b6 1067 FALSE, /* pc_relative */
8a397dad
TS
1068 0, /* bitpos */
1069 complain_overflow_dont, /* complain_on_overflow */
1070 mips_elf_gprel32_reloc, /* special_function */
1071 "R_MIPS_GPREL32", /* name */
b34976b6 1072 FALSE, /* partial_inplace */
8a397dad
TS
1073 0, /* src_mask */
1074 0xffffffff, /* dst_mask */
b34976b6 1075 FALSE), /* pcrel_offset */
8a397dad
TS
1076
1077 EMPTY_HOWTO (13),
1078 EMPTY_HOWTO (14),
1079 EMPTY_HOWTO (15),
1080
1081 /* A 5 bit shift field. */
1082 HOWTO (R_MIPS_SHIFT5, /* type */
1083 0, /* rightshift */
1084 2, /* size (0 = byte, 1 = short, 2 = long) */
1085 5, /* bitsize */
b34976b6 1086 FALSE, /* pc_relative */
8a397dad
TS
1087 6, /* bitpos */
1088 complain_overflow_bitfield, /* complain_on_overflow */
30ac9238 1089 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1090 "R_MIPS_SHIFT5", /* name */
b34976b6 1091 FALSE, /* partial_inplace */
8a397dad
TS
1092 0, /* src_mask */
1093 0x000007c0, /* dst_mask */
b34976b6 1094 FALSE), /* pcrel_offset */
8a397dad
TS
1095
1096 /* A 6 bit shift field. */
1097 HOWTO (R_MIPS_SHIFT6, /* type */
1098 0, /* rightshift */
1099 2, /* size (0 = byte, 1 = short, 2 = long) */
1100 6, /* bitsize */
b34976b6 1101 FALSE, /* pc_relative */
8a397dad
TS
1102 6, /* bitpos */
1103 complain_overflow_bitfield, /* complain_on_overflow */
1104 mips_elf_shift6_reloc, /* special_function */
1105 "R_MIPS_SHIFT6", /* name */
b34976b6 1106 FALSE, /* partial_inplace */
8a397dad
TS
1107 0, /* src_mask */
1108 0x000007c4, /* dst_mask */
b34976b6 1109 FALSE), /* pcrel_offset */
8a397dad
TS
1110
1111 /* 64 bit relocation. */
1112 HOWTO (R_MIPS_64, /* type */
1113 0, /* rightshift */
1114 4, /* size (0 = byte, 1 = short, 2 = long) */
1115 64, /* bitsize */
b34976b6 1116 FALSE, /* pc_relative */
8a397dad
TS
1117 0, /* bitpos */
1118 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1119 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1120 "R_MIPS_64", /* name */
b34976b6 1121 FALSE, /* partial_inplace */
8a397dad
TS
1122 0, /* src_mask */
1123 MINUS_ONE, /* dst_mask */
b34976b6 1124 FALSE), /* pcrel_offset */
8a397dad
TS
1125
1126 /* Displacement in the global offset table. */
1127 HOWTO (R_MIPS_GOT_DISP, /* type */
1128 0, /* rightshift */
1129 2, /* size (0 = byte, 1 = short, 2 = long) */
1130 16, /* bitsize */
b34976b6 1131 FALSE, /* pc_relative */
8a397dad
TS
1132 0, /* bitpos */
1133 complain_overflow_signed, /* complain_on_overflow */
30ac9238 1134 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1135 "R_MIPS_GOT_DISP", /* name */
b34976b6 1136 FALSE, /* partial_inplace */
8a397dad
TS
1137 0, /* src_mask */
1138 0x0000ffff, /* dst_mask */
b34976b6 1139 FALSE), /* pcrel_offset */
8a397dad
TS
1140
1141 /* Displacement to page pointer in the global offset table. */
1142 HOWTO (R_MIPS_GOT_PAGE, /* type */
1143 0, /* rightshift */
1144 2, /* size (0 = byte, 1 = short, 2 = long) */
1145 16, /* bitsize */
b34976b6 1146 FALSE, /* pc_relative */
8a397dad
TS
1147 0, /* bitpos */
1148 complain_overflow_signed, /* complain_on_overflow */
30ac9238 1149 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1150 "R_MIPS_GOT_PAGE", /* name */
b34976b6 1151 FALSE, /* partial_inplace */
8a397dad
TS
1152 0, /* src_mask */
1153 0x0000ffff, /* dst_mask */
b34976b6 1154 FALSE), /* pcrel_offset */
8a397dad
TS
1155
1156 /* Offset from page pointer in the global offset table. */
1157 HOWTO (R_MIPS_GOT_OFST, /* type */
1158 0, /* rightshift */
1159 2, /* size (0 = byte, 1 = short, 2 = long) */
1160 16, /* bitsize */
b34976b6 1161 FALSE, /* pc_relative */
8a397dad
TS
1162 0, /* bitpos */
1163 complain_overflow_signed, /* complain_on_overflow */
30ac9238 1164 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1165 "R_MIPS_GOT_OFST", /* name */
b34976b6 1166 FALSE, /* partial_inplace */
8a397dad
TS
1167 0, /* src_mask */
1168 0x0000ffff, /* dst_mask */
b34976b6 1169 FALSE), /* pcrel_offset */
8a397dad
TS
1170
1171 /* High 16 bits of displacement in global offset table. */
1172 HOWTO (R_MIPS_GOT_HI16, /* type */
1173 0, /* rightshift */
1174 2, /* size (0 = byte, 1 = short, 2 = long) */
1175 16, /* bitsize */
b34976b6 1176 FALSE, /* pc_relative */
8a397dad
TS
1177 0, /* bitpos */
1178 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1179 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1180 "R_MIPS_GOT_HI16", /* name */
b34976b6 1181 FALSE, /* partial_inplace */
8a397dad
TS
1182 0, /* src_mask */
1183 0x0000ffff, /* dst_mask */
b34976b6 1184 FALSE), /* pcrel_offset */
8a397dad
TS
1185
1186 /* Low 16 bits of displacement in global offset table. */
1187 HOWTO (R_MIPS_GOT_LO16, /* type */
1188 0, /* rightshift */
1189 2, /* size (0 = byte, 1 = short, 2 = long) */
1190 16, /* bitsize */
b34976b6 1191 FALSE, /* pc_relative */
8a397dad
TS
1192 0, /* bitpos */
1193 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1194 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1195 "R_MIPS_GOT_LO16", /* name */
b34976b6 1196 FALSE, /* partial_inplace */
8a397dad
TS
1197 0, /* src_mask */
1198 0x0000ffff, /* dst_mask */
b34976b6 1199 FALSE), /* pcrel_offset */
8a397dad 1200
4cc11e76 1201 /* 64 bit subtraction. */
8a397dad
TS
1202 HOWTO (R_MIPS_SUB, /* type */
1203 0, /* rightshift */
1204 4, /* size (0 = byte, 1 = short, 2 = long) */
1205 64, /* bitsize */
b34976b6 1206 FALSE, /* pc_relative */
8a397dad
TS
1207 0, /* bitpos */
1208 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1209 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1210 "R_MIPS_SUB", /* name */
b34976b6 1211 FALSE, /* partial_inplace */
8a397dad
TS
1212 0, /* src_mask */
1213 MINUS_ONE, /* dst_mask */
b34976b6 1214 FALSE), /* pcrel_offset */
8a397dad
TS
1215
1216 /* Insert the addend as an instruction. */
1217 /* FIXME: Not handled correctly. */
1218 HOWTO (R_MIPS_INSERT_A, /* type */
1219 0, /* rightshift */
1220 2, /* size (0 = byte, 1 = short, 2 = long) */
1221 32, /* bitsize */
b34976b6 1222 FALSE, /* pc_relative */
8a397dad
TS
1223 0, /* bitpos */
1224 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1225 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1226 "R_MIPS_INSERT_A", /* name */
b34976b6 1227 FALSE, /* partial_inplace */
8a397dad
TS
1228 0, /* src_mask */
1229 0xffffffff, /* dst_mask */
b34976b6 1230 FALSE), /* pcrel_offset */
8a397dad
TS
1231
1232 /* Insert the addend as an instruction, and change all relocations
1233 to refer to the old instruction at the address. */
1234 /* FIXME: Not handled correctly. */
1235 HOWTO (R_MIPS_INSERT_B, /* type */
1236 0, /* rightshift */
1237 2, /* size (0 = byte, 1 = short, 2 = long) */
1238 32, /* bitsize */
b34976b6 1239 FALSE, /* pc_relative */
8a397dad
TS
1240 0, /* bitpos */
1241 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1242 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1243 "R_MIPS_INSERT_B", /* name */
b34976b6 1244 FALSE, /* partial_inplace */
8a397dad
TS
1245 0, /* src_mask */
1246 0xffffffff, /* dst_mask */
b34976b6 1247 FALSE), /* pcrel_offset */
8a397dad
TS
1248
1249 /* Delete a 32 bit instruction. */
1250 /* FIXME: Not handled correctly. */
1251 HOWTO (R_MIPS_DELETE, /* type */
1252 0, /* rightshift */
1253 2, /* size (0 = byte, 1 = short, 2 = long) */
1254 32, /* bitsize */
b34976b6 1255 FALSE, /* pc_relative */
8a397dad
TS
1256 0, /* bitpos */
1257 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1258 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1259 "R_MIPS_DELETE", /* name */
b34976b6 1260 FALSE, /* partial_inplace */
8a397dad
TS
1261 0, /* src_mask */
1262 0xffffffff, /* dst_mask */
b34976b6 1263 FALSE), /* pcrel_offset */
8a397dad
TS
1264
1265 /* Get the higher value of a 64 bit addend. */
1266 HOWTO (R_MIPS_HIGHER, /* type */
1267 0, /* rightshift */
1268 2, /* size (0 = byte, 1 = short, 2 = long) */
1269 16, /* bitsize */
b34976b6 1270 FALSE, /* pc_relative */
8a397dad
TS
1271 0, /* bitpos */
1272 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1273 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1274 "R_MIPS_HIGHER", /* name */
b34976b6 1275 FALSE, /* partial_inplace */
8a397dad
TS
1276 0, /* src_mask */
1277 0x0000ffff, /* dst_mask */
b34976b6 1278 FALSE), /* pcrel_offset */
8a397dad
TS
1279
1280 /* Get the highest value of a 64 bit addend. */
1281 HOWTO (R_MIPS_HIGHEST, /* type */
1282 0, /* rightshift */
1283 2, /* size (0 = byte, 1 = short, 2 = long) */
1284 16, /* bitsize */
b34976b6 1285 FALSE, /* pc_relative */
8a397dad
TS
1286 0, /* bitpos */
1287 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1288 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1289 "R_MIPS_HIGHEST", /* name */
b34976b6 1290 FALSE, /* partial_inplace */
8a397dad
TS
1291 0, /* src_mask */
1292 0x0000ffff, /* dst_mask */
b34976b6 1293 FALSE), /* pcrel_offset */
8a397dad
TS
1294
1295 /* High 16 bits of displacement in global offset table. */
1296 HOWTO (R_MIPS_CALL_HI16, /* type */
1297 0, /* rightshift */
1298 2, /* size (0 = byte, 1 = short, 2 = long) */
1299 16, /* bitsize */
b34976b6 1300 FALSE, /* pc_relative */
8a397dad
TS
1301 0, /* bitpos */
1302 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1303 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1304 "R_MIPS_CALL_HI16", /* name */
b34976b6 1305 FALSE, /* partial_inplace */
8a397dad
TS
1306 0, /* src_mask */
1307 0x0000ffff, /* dst_mask */
b34976b6 1308 FALSE), /* pcrel_offset */
8a397dad
TS
1309
1310 /* Low 16 bits of displacement in global offset table. */
1311 HOWTO (R_MIPS_CALL_LO16, /* type */
1312 0, /* rightshift */
1313 2, /* size (0 = byte, 1 = short, 2 = long) */
1314 16, /* bitsize */
b34976b6 1315 FALSE, /* pc_relative */
8a397dad
TS
1316 0, /* bitpos */
1317 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1318 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1319 "R_MIPS_CALL_LO16", /* name */
b34976b6 1320 FALSE, /* partial_inplace */
8a397dad
TS
1321 0, /* src_mask */
1322 0x0000ffff, /* dst_mask */
b34976b6 1323 FALSE), /* pcrel_offset */
8a397dad
TS
1324
1325 /* Section displacement, used by an associated event location section. */
1326 HOWTO (R_MIPS_SCN_DISP, /* type */
1327 0, /* rightshift */
1328 2, /* size (0 = byte, 1 = short, 2 = long) */
1329 32, /* bitsize */
b34976b6 1330 FALSE, /* pc_relative */
8a397dad
TS
1331 0, /* bitpos */
1332 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1333 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1334 "R_MIPS_SCN_DISP", /* name */
b34976b6 1335 FALSE, /* partial_inplace */
8a397dad
TS
1336 0, /* src_mask */
1337 0xffffffff, /* dst_mask */
b34976b6 1338 FALSE), /* pcrel_offset */
8a397dad
TS
1339
1340 /* 16 bit relocation. */
1341 HOWTO (R_MIPS_REL16, /* type */
1342 0, /* rightshift */
1343 1, /* size (0 = byte, 1 = short, 2 = long) */
1344 16, /* bitsize */
b34976b6 1345 FALSE, /* pc_relative */
8a397dad
TS
1346 0, /* bitpos */
1347 complain_overflow_signed, /* complain_on_overflow */
30ac9238 1348 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1349 "R_MIPS_REL16", /* name */
b34976b6 1350 FALSE, /* partial_inplace */
8a397dad
TS
1351 0, /* src_mask */
1352 0xffff, /* dst_mask */
b34976b6 1353 FALSE), /* pcrel_offset */
8a397dad
TS
1354
1355 /* These two are obsolete. */
1356 EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
1357 EMPTY_HOWTO (R_MIPS_PJUMP),
1358
1359 /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
1360 It must be used for multigot GOT's (and only there). */
1361 HOWTO (R_MIPS_RELGOT, /* type */
1362 0, /* rightshift */
1363 2, /* size (0 = byte, 1 = short, 2 = long) */
1364 32, /* bitsize */
b34976b6 1365 FALSE, /* pc_relative */
8a397dad
TS
1366 0, /* bitpos */
1367 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1368 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1369 "R_MIPS_RELGOT", /* name */
b34976b6 1370 FALSE, /* partial_inplace */
8a397dad
TS
1371 0, /* src_mask */
1372 0xffffffff, /* dst_mask */
b34976b6 1373 FALSE), /* pcrel_offset */
8a397dad
TS
1374
1375 /* Protected jump conversion. This is an optimization hint. No
1376 relocation is required for correctness. */
07d6d2b8 1377 HOWTO (R_MIPS_JALR, /* type */
8a397dad
TS
1378 0, /* rightshift */
1379 2, /* size (0 = byte, 1 = short, 2 = long) */
1380 32, /* bitsize */
b34976b6 1381 FALSE, /* pc_relative */
8a397dad
TS
1382 0, /* bitpos */
1383 complain_overflow_dont, /* complain_on_overflow */
30ac9238 1384 _bfd_mips_elf_generic_reloc, /* special_function */
07d6d2b8 1385 "R_MIPS_JALR", /* name */
b34976b6 1386 FALSE, /* partial_inplace */
8a397dad 1387 0, /* src_mask */
74f79d8d 1388 0, /* dst_mask */
b34976b6 1389 FALSE), /* pcrel_offset */
0f20cc35
DJ
1390
1391 /* TLS GD/LD dynamic relocations. */
1392 HOWTO (R_MIPS_TLS_DTPMOD32, /* type */
1393 0, /* rightshift */
1394 2, /* size (0 = byte, 1 = short, 2 = long) */
1395 32, /* bitsize */
1396 FALSE, /* pc_relative */
1397 0, /* bitpos */
1398 complain_overflow_dont, /* complain_on_overflow */
1399 _bfd_mips_elf_generic_reloc, /* special_function */
1400 "R_MIPS_TLS_DTPMOD32", /* name */
667bf02a 1401 FALSE, /* partial_inplace */
72c4ab07 1402 0, /* src_mask */
0f20cc35
DJ
1403 0xffffffff, /* dst_mask */
1404 FALSE), /* pcrel_offset */
1405
1406 HOWTO (R_MIPS_TLS_DTPREL32, /* type */
1407 0, /* rightshift */
1408 2, /* size (0 = byte, 1 = short, 2 = long) */
1409 32, /* bitsize */
1410 FALSE, /* pc_relative */
1411 0, /* bitpos */
1412 complain_overflow_dont, /* complain_on_overflow */
1413 _bfd_mips_elf_generic_reloc, /* special_function */
1414 "R_MIPS_TLS_DTPREL32", /* name */
667bf02a 1415 FALSE, /* partial_inplace */
72c4ab07 1416 0, /* src_mask */
0f20cc35
DJ
1417 0xffffffff, /* dst_mask */
1418 FALSE), /* pcrel_offset */
1419
1420 EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
1421 EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
1422
1423 /* TLS general dynamic variable reference. */
1424 HOWTO (R_MIPS_TLS_GD, /* type */
1425 0, /* rightshift */
1426 2, /* size (0 = byte, 1 = short, 2 = long) */
1427 16, /* bitsize */
1428 FALSE, /* pc_relative */
1429 0, /* bitpos */
1430 complain_overflow_signed, /* complain_on_overflow */
1431 _bfd_mips_elf_generic_reloc, /* special_function */
1432 "R_MIPS_TLS_GD", /* name */
667bf02a 1433 FALSE, /* partial_inplace */
72c4ab07 1434 0, /* src_mask */
0f20cc35
DJ
1435 0x0000ffff, /* dst_mask */
1436 FALSE), /* pcrel_offset */
1437
1438 /* TLS local dynamic variable reference. */
1439 HOWTO (R_MIPS_TLS_LDM, /* type */
1440 0, /* rightshift */
1441 2, /* size (0 = byte, 1 = short, 2 = long) */
1442 16, /* bitsize */
1443 FALSE, /* pc_relative */
1444 0, /* bitpos */
1445 complain_overflow_signed, /* complain_on_overflow */
1446 _bfd_mips_elf_generic_reloc, /* special_function */
1447 "R_MIPS_TLS_LDM", /* name */
667bf02a 1448 FALSE, /* partial_inplace */
72c4ab07 1449 0, /* src_mask */
0f20cc35
DJ
1450 0x0000ffff, /* dst_mask */
1451 FALSE), /* pcrel_offset */
1452
1453 /* TLS local dynamic offset. */
1454 HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
1455 0, /* rightshift */
1456 2, /* size (0 = byte, 1 = short, 2 = long) */
1457 16, /* bitsize */
1458 FALSE, /* pc_relative */
1459 0, /* bitpos */
1460 complain_overflow_signed, /* complain_on_overflow */
1461 _bfd_mips_elf_generic_reloc, /* special_function */
1462 "R_MIPS_TLS_DTPREL_HI16", /* name */
667bf02a 1463 FALSE, /* partial_inplace */
72c4ab07 1464 0, /* src_mask */
0f20cc35
DJ
1465 0x0000ffff, /* dst_mask */
1466 FALSE), /* pcrel_offset */
1467
1468 /* TLS local dynamic offset. */
1469 HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
1470 0, /* rightshift */
1471 2, /* size (0 = byte, 1 = short, 2 = long) */
1472 16, /* bitsize */
1473 FALSE, /* pc_relative */
1474 0, /* bitpos */
1475 complain_overflow_signed, /* complain_on_overflow */
1476 _bfd_mips_elf_generic_reloc, /* special_function */
1477 "R_MIPS_TLS_DTPREL_LO16", /* name */
667bf02a 1478 FALSE, /* partial_inplace */
72c4ab07 1479 0, /* src_mask */
0f20cc35
DJ
1480 0x0000ffff, /* dst_mask */
1481 FALSE), /* pcrel_offset */
1482
1483 /* TLS thread pointer offset. */
1484 HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
1485 0, /* rightshift */
1486 2, /* size (0 = byte, 1 = short, 2 = long) */
1487 16, /* bitsize */
1488 FALSE, /* pc_relative */
1489 0, /* bitpos */
1490 complain_overflow_signed, /* complain_on_overflow */
1491 _bfd_mips_elf_generic_reloc, /* special_function */
1492 "R_MIPS_TLS_GOTTPREL", /* name */
667bf02a 1493 FALSE, /* partial_inplace */
72c4ab07 1494 0, /* src_mask */
0f20cc35
DJ
1495 0x0000ffff, /* dst_mask */
1496 FALSE), /* pcrel_offset */
1497
1498 /* TLS IE dynamic relocations. */
1499 HOWTO (R_MIPS_TLS_TPREL32, /* type */
1500 0, /* rightshift */
1501 2, /* size (0 = byte, 1 = short, 2 = long) */
1502 32, /* bitsize */
1503 FALSE, /* pc_relative */
1504 0, /* bitpos */
1505 complain_overflow_dont, /* complain_on_overflow */
1506 _bfd_mips_elf_generic_reloc, /* special_function */
1507 "R_MIPS_TLS_TPREL32", /* name */
667bf02a 1508 FALSE, /* partial_inplace */
72c4ab07 1509 0, /* src_mask */
0f20cc35
DJ
1510 0xffffffff, /* dst_mask */
1511 FALSE), /* pcrel_offset */
1512
1513 EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
1514
1515 /* TLS thread pointer offset. */
1516 HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
1517 0, /* rightshift */
1518 2, /* size (0 = byte, 1 = short, 2 = long) */
1519 16, /* bitsize */
1520 FALSE, /* pc_relative */
1521 0, /* bitpos */
1522 complain_overflow_signed, /* complain_on_overflow */
1523 _bfd_mips_elf_generic_reloc, /* special_function */
1524 "R_MIPS_TLS_TPREL_HI16", /* name */
667bf02a 1525 FALSE, /* partial_inplace */
72c4ab07 1526 0, /* src_mask */
0f20cc35
DJ
1527 0x0000ffff, /* dst_mask */
1528 FALSE), /* pcrel_offset */
1529
1530 /* TLS thread pointer offset. */
1531 HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
1532 0, /* rightshift */
1533 2, /* size (0 = byte, 1 = short, 2 = long) */
1534 16, /* bitsize */
1535 FALSE, /* pc_relative */
1536 0, /* bitpos */
1537 complain_overflow_signed, /* complain_on_overflow */
1538 _bfd_mips_elf_generic_reloc, /* special_function */
1539 "R_MIPS_TLS_TPREL_LO16", /* name */
667bf02a 1540 FALSE, /* partial_inplace */
72c4ab07 1541 0, /* src_mask */
0f20cc35
DJ
1542 0x0000ffff, /* dst_mask */
1543 FALSE), /* pcrel_offset */
165b93e7
RS
1544
1545 /* 32 bit relocation with no addend. */
1546 HOWTO (R_MIPS_GLOB_DAT, /* type */
1547 0, /* rightshift */
1548 2, /* size (0 = byte, 1 = short, 2 = long) */
1549 32, /* bitsize */
1550 FALSE, /* pc_relative */
1551 0, /* bitpos */
1552 complain_overflow_dont, /* complain_on_overflow */
1553 _bfd_mips_elf_generic_reloc, /* special_function */
1554 "R_MIPS_GLOB_DAT", /* name */
1555 FALSE, /* partial_inplace */
1556 0x0, /* src_mask */
1557 0xffffffff, /* dst_mask */
1558 FALSE), /* pcrel_offset */
7361da2c
AB
1559
1560 EMPTY_HOWTO (52),
1561 EMPTY_HOWTO (53),
1562 EMPTY_HOWTO (54),
1563 EMPTY_HOWTO (55),
1564 EMPTY_HOWTO (56),
1565 EMPTY_HOWTO (57),
1566 EMPTY_HOWTO (58),
1567 EMPTY_HOWTO (59),
1568
1569 HOWTO (R_MIPS_PC21_S2, /* type */
1570 2, /* rightshift */
1571 2, /* size (0 = byte, 1 = short, 2 = long) */
1572 21, /* bitsize */
1573 TRUE, /* pc_relative */
1574 0, /* bitpos */
1575 complain_overflow_signed, /* complain_on_overflow */
1576 _bfd_mips_elf_generic_reloc, /* special_function */
1577 "R_MIPS_PC21_S2", /* name */
1578 FALSE, /* partial_inplace */
1579 0, /* src_mask */
1580 0x001fffff, /* dst_mask */
1581 TRUE), /* pcrel_offset */
1582
1583 HOWTO (R_MIPS_PC26_S2, /* type */
1584 2, /* rightshift */
1585 2, /* size (0 = byte, 1 = short, 2 = long) */
1586 26, /* bitsize */
1587 TRUE, /* pc_relative */
1588 0, /* bitpos */
1589 complain_overflow_signed, /* complain_on_overflow */
1590 _bfd_mips_elf_generic_reloc, /* special_function */
1591 "R_MIPS_PC26_S2", /* name */
1592 FALSE, /* partial_inplace */
1593 0, /* src_mask */
1594 0x03ffffff, /* dst_mask */
1595 TRUE), /* pcrel_offset */
1596
1597 HOWTO (R_MIPS_PC18_S3, /* type */
1598 3, /* rightshift */
1599 2, /* size (0 = byte, 1 = short, 2 = long) */
1600 18, /* bitsize */
1601 TRUE, /* pc_relative */
1602 0, /* bitpos */
1603 complain_overflow_signed, /* complain_on_overflow */
1604 _bfd_mips_elf_generic_reloc, /* special_function */
1605 "R_MIPS_PC18_S3", /* name */
1606 FALSE, /* partial_inplace */
1607 0, /* src_mask */
1608 0x0003ffff, /* dst_mask */
1609 TRUE), /* pcrel_offset */
1610
1611 HOWTO (R_MIPS_PC19_S2, /* type */
1612 2, /* rightshift */
1613 2, /* size (0 = byte, 1 = short, 2 = long) */
1614 19, /* bitsize */
1615 TRUE, /* pc_relative */
1616 0, /* bitpos */
1617 complain_overflow_signed, /* complain_on_overflow */
1618 _bfd_mips_elf_generic_reloc, /* special_function */
1619 "R_MIPS_PC19_S2", /* name */
1620 FALSE, /* partial_inplace */
1621 0, /* src_mask */
1622 0x0007ffff, /* dst_mask */
1623 TRUE), /* pcrel_offset */
1624
1625 HOWTO (R_MIPS_PCHI16, /* type */
1626 16, /* rightshift */
1627 2, /* size (0 = byte, 1 = short, 2 = long) */
1628 16, /* bitsize */
1629 TRUE, /* pc_relative */
1630 0, /* bitpos */
1631 complain_overflow_signed, /* complain_on_overflow */
1632 _bfd_mips_elf_generic_reloc, /* special_function */
1633 "R_MIPS_PCHI16", /* name */
1634 FALSE, /* partial_inplace */
1635 0, /* src_mask */
1636 0x0000ffff, /* dst_mask */
1637 TRUE), /* pcrel_offset */
1638
1639 HOWTO (R_MIPS_PCLO16, /* type */
1640 0, /* rightshift */
1641 2, /* size (0 = byte, 1 = short, 2 = long) */
1642 16, /* bitsize */
1643 TRUE, /* pc_relative */
1644 0, /* bitpos */
1645 complain_overflow_dont, /* complain_on_overflow */
1646 _bfd_mips_elf_generic_reloc, /* special_function */
1647 "R_MIPS_PCLO16", /* name */
1648 FALSE, /* partial_inplace */
1649 0, /* src_mask */
1650 0x0000ffff, /* dst_mask */
1651 TRUE), /* pcrel_offset */
1652
8a397dad
TS
1653};
1654
d6f16593
MR
1655static reloc_howto_type elf_mips16_howto_table_rel[] =
1656{
1657 /* The reloc used for the mips16 jump instruction. */
8a397dad
TS
1658 HOWTO (R_MIPS16_26, /* type */
1659 2, /* rightshift */
1660 2, /* size (0 = byte, 1 = short, 2 = long) */
1661 26, /* bitsize */
b34976b6 1662 FALSE, /* pc_relative */
8a397dad
TS
1663 0, /* bitpos */
1664 complain_overflow_dont, /* complain_on_overflow */
07d6d2b8 1665 /* This needs complex overflow
8a397dad
TS
1666 detection, because the upper four
1667 bits must match the PC. */
35d3d567 1668 _bfd_mips_elf_generic_reloc, /* special_function */
8a397dad 1669 "R_MIPS16_26", /* name */
b34976b6 1670 TRUE, /* partial_inplace */
8a397dad
TS
1671 0x3ffffff, /* src_mask */
1672 0x3ffffff, /* dst_mask */
d6f16593 1673 FALSE), /* pcrel_offset */
8a397dad 1674
d6f16593 1675 /* The reloc used for the mips16 gprel instruction. */
8a397dad
TS
1676 HOWTO (R_MIPS16_GPREL, /* type */
1677 0, /* rightshift */
1678 2, /* size (0 = byte, 1 = short, 2 = long) */
1679 16, /* bitsize */
b34976b6 1680 FALSE, /* pc_relative */
8a397dad
TS
1681 0, /* bitpos */
1682 complain_overflow_signed, /* complain_on_overflow */
1683 mips16_gprel_reloc, /* special_function */
1684 "R_MIPS16_GPREL", /* name */
b34976b6 1685 TRUE, /* partial_inplace */
d6f16593 1686 0x0000ffff, /* src_mask */
07d6d2b8 1687 0x0000ffff, /* dst_mask */
d6f16593
MR
1688 FALSE), /* pcrel_offset */
1689
738e5348
RS
1690 /* A MIPS16 reference to the global offset table. */
1691 HOWTO (R_MIPS16_GOT16, /* type */
1692 0, /* rightshift */
1693 2, /* size (0 = byte, 1 = short, 2 = long) */
1694 16, /* bitsize */
1695 FALSE, /* pc_relative */
1696 0, /* bitpos */
1697 complain_overflow_dont, /* complain_on_overflow */
1698 _bfd_mips_elf_got16_reloc, /* special_function */
1699 "R_MIPS16_GOT16", /* name */
1700 TRUE, /* partial_inplace */
1701 0x0000ffff, /* src_mask */
07d6d2b8 1702 0x0000ffff, /* dst_mask */
738e5348 1703 FALSE), /* pcrel_offset */
d6f16593 1704
738e5348
RS
1705 /* A MIPS16 call through the global offset table. */
1706 HOWTO (R_MIPS16_CALL16, /* type */
1707 0, /* rightshift */
1708 2, /* size (0 = byte, 1 = short, 2 = long) */
1709 16, /* bitsize */
1710 FALSE, /* pc_relative */
1711 0, /* bitpos */
1712 complain_overflow_dont, /* complain_on_overflow */
1713 _bfd_mips_elf_generic_reloc, /* special_function */
1714 "R_MIPS16_CALL16", /* name */
1715 TRUE, /* partial_inplace */
1716 0x0000ffff, /* src_mask */
07d6d2b8 1717 0x0000ffff, /* dst_mask */
738e5348 1718 FALSE), /* pcrel_offset */
d6f16593
MR
1719
1720 /* MIPS16 high 16 bits of symbol value. */
1721 HOWTO (R_MIPS16_HI16, /* type */
1722 16, /* rightshift */
1723 2, /* size (0 = byte, 1 = short, 2 = long) */
1724 16, /* bitsize */
1725 FALSE, /* pc_relative */
1726 0, /* bitpos */
1727 complain_overflow_dont, /* complain_on_overflow */
1728 _bfd_mips_elf_hi16_reloc, /* special_function */
1729 "R_MIPS16_HI16", /* name */
1730 TRUE, /* partial_inplace */
1731 0x0000ffff, /* src_mask */
1732 0x0000ffff, /* dst_mask */
1733 FALSE), /* pcrel_offset */
1734
1735 /* MIPS16 low 16 bits of symbol value. */
1736 HOWTO (R_MIPS16_LO16, /* type */
1737 0, /* rightshift */
1738 2, /* size (0 = byte, 1 = short, 2 = long) */
1739 16, /* bitsize */
1740 FALSE, /* pc_relative */
1741 0, /* bitpos */
1742 complain_overflow_dont, /* complain_on_overflow */
1743 _bfd_mips_elf_lo16_reloc, /* special_function */
1744 "R_MIPS16_LO16", /* name */
1745 TRUE, /* partial_inplace */
1746 0x0000ffff, /* src_mask */
1747 0x0000ffff, /* dst_mask */
1748 FALSE), /* pcrel_offset */
d0f13682
CLT
1749
1750 /* MIPS16 TLS general dynamic variable reference. */
1751 HOWTO (R_MIPS16_TLS_GD, /* type */
1752 0, /* rightshift */
1753 2, /* size (0 = byte, 1 = short, 2 = long) */
1754 16, /* bitsize */
1755 FALSE, /* pc_relative */
1756 0, /* bitpos */
1757 complain_overflow_signed, /* complain_on_overflow */
1758 _bfd_mips_elf_generic_reloc, /* special_function */
1759 "R_MIPS16_TLS_GD", /* name */
1760 TRUE, /* partial_inplace */
1761 0x0000ffff, /* src_mask */
1762 0x0000ffff, /* dst_mask */
1763 FALSE), /* pcrel_offset */
1764
1765 /* MIPS16 TLS local dynamic variable reference. */
1766 HOWTO (R_MIPS16_TLS_LDM, /* type */
1767 0, /* rightshift */
1768 2, /* size (0 = byte, 1 = short, 2 = long) */
1769 16, /* bitsize */
1770 FALSE, /* pc_relative */
1771 0, /* bitpos */
1772 complain_overflow_signed, /* complain_on_overflow */
1773 _bfd_mips_elf_generic_reloc, /* special_function */
1774 "R_MIPS16_TLS_LDM", /* name */
1775 TRUE, /* partial_inplace */
1776 0x0000ffff, /* src_mask */
1777 0x0000ffff, /* dst_mask */
1778 FALSE), /* pcrel_offset */
1779
1780 /* MIPS16 TLS local dynamic offset. */
1781 HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
1782 0, /* rightshift */
1783 2, /* size (0 = byte, 1 = short, 2 = long) */
1784 16, /* bitsize */
1785 FALSE, /* pc_relative */
1786 0, /* bitpos */
1787 complain_overflow_signed, /* complain_on_overflow */
1788 _bfd_mips_elf_generic_reloc, /* special_function */
1789 "R_MIPS16_TLS_DTPREL_HI16", /* name */
1790 TRUE, /* partial_inplace */
1791 0x0000ffff, /* src_mask */
1792 0x0000ffff, /* dst_mask */
1793 FALSE), /* pcrel_offset */
1794
1795 /* MIPS16 TLS local dynamic offset. */
1796 HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
1797 0, /* rightshift */
1798 2, /* size (0 = byte, 1 = short, 2 = long) */
1799 16, /* bitsize */
1800 FALSE, /* pc_relative */
1801 0, /* bitpos */
1802 complain_overflow_signed, /* complain_on_overflow */
1803 _bfd_mips_elf_generic_reloc, /* special_function */
1804 "R_MIPS16_TLS_DTPREL_LO16", /* name */
1805 TRUE, /* partial_inplace */
1806 0x0000ffff, /* src_mask */
1807 0x0000ffff, /* dst_mask */
1808 FALSE), /* pcrel_offset */
1809
1810 /* MIPS16 TLS thread pointer offset. */
1811 HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
1812 0, /* rightshift */
1813 2, /* size (0 = byte, 1 = short, 2 = long) */
1814 16, /* bitsize */
1815 FALSE, /* pc_relative */
1816 0, /* bitpos */
1817 complain_overflow_signed, /* complain_on_overflow */
1818 _bfd_mips_elf_generic_reloc, /* special_function */
1819 "R_MIPS16_TLS_GOTTPREL", /* name */
1820 TRUE, /* partial_inplace */
1821 0x0000ffff, /* src_mask */
1822 0x0000ffff, /* dst_mask */
1823 FALSE), /* pcrel_offset */
1824
1825 /* MIPS16 TLS thread pointer offset. */
1826 HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
1827 0, /* rightshift */
1828 2, /* size (0 = byte, 1 = short, 2 = long) */
1829 16, /* bitsize */
1830 FALSE, /* pc_relative */
1831 0, /* bitpos */
1832 complain_overflow_signed, /* complain_on_overflow */
1833 _bfd_mips_elf_generic_reloc, /* special_function */
1834 "R_MIPS16_TLS_TPREL_HI16", /* name */
1835 TRUE, /* partial_inplace */
1836 0x0000ffff, /* src_mask */
1837 0x0000ffff, /* dst_mask */
1838 FALSE), /* pcrel_offset */
1839
1840 /* MIPS16 TLS thread pointer offset. */
1841 HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
1842 0, /* rightshift */
1843 2, /* size (0 = byte, 1 = short, 2 = long) */
1844 16, /* bitsize */
1845 FALSE, /* pc_relative */
1846 0, /* bitpos */
1847 complain_overflow_signed, /* complain_on_overflow */
1848 _bfd_mips_elf_generic_reloc, /* special_function */
1849 "R_MIPS16_TLS_TPREL_LO16", /* name */
1850 TRUE, /* partial_inplace */
1851 0x0000ffff, /* src_mask */
1852 0x0000ffff, /* dst_mask */
1853 FALSE), /* pcrel_offset */
c9775dde
MR
1854
1855 /* MIPS16 16-bit PC-relative branch offset. */
1856 HOWTO (R_MIPS16_PC16_S1, /* type */
1857 1, /* rightshift */
1858 2, /* size (0 = byte, 1 = short, 2 = long) */
1859 16, /* bitsize */
1860 TRUE, /* pc_relative */
1861 0, /* bitpos */
1862 complain_overflow_signed, /* complain_on_overflow */
1863 _bfd_mips_elf_generic_reloc, /* special_function */
1864 "R_MIPS16_PC16_S1", /* name */
1865 TRUE, /* partial_inplace */
1866 0x0000ffff, /* src_mask */
1867 0x0000ffff, /* dst_mask */
1868 TRUE), /* pcrel_offset */
d6f16593
MR
1869};
1870
1871static reloc_howto_type elf_mips16_howto_table_rela[] =
1872{
1873 /* The reloc used for the mips16 jump instruction. */
1874 HOWTO (R_MIPS16_26, /* type */
1875 2, /* rightshift */
1876 2, /* size (0 = byte, 1 = short, 2 = long) */
1877 26, /* bitsize */
1878 FALSE, /* pc_relative */
1879 0, /* bitpos */
1880 complain_overflow_dont, /* complain_on_overflow */
07d6d2b8 1881 /* This needs complex overflow
d6f16593
MR
1882 detection, because the upper four
1883 bits must match the PC. */
35d3d567 1884 _bfd_mips_elf_generic_reloc, /* special_function */
d6f16593
MR
1885 "R_MIPS16_26", /* name */
1886 FALSE, /* partial_inplace */
72c4ab07 1887 0, /* src_mask */
d6f16593
MR
1888 0x3ffffff, /* dst_mask */
1889 FALSE), /* pcrel_offset */
1890
1891 /* The reloc used for the mips16 gprel instruction. */
1892 HOWTO (R_MIPS16_GPREL, /* type */
1893 0, /* rightshift */
1894 2, /* size (0 = byte, 1 = short, 2 = long) */
1895 16, /* bitsize */
1896 FALSE, /* pc_relative */
1897 0, /* bitpos */
1898 complain_overflow_signed, /* complain_on_overflow */
1899 mips16_gprel_reloc, /* special_function */
1900 "R_MIPS16_GPREL", /* name */
1901 FALSE, /* partial_inplace */
72c4ab07 1902 0, /* src_mask */
07d6d2b8 1903 0x0000ffff, /* dst_mask */
d6f16593
MR
1904 FALSE), /* pcrel_offset */
1905
738e5348
RS
1906 /* A MIPS16 reference to the global offset table. */
1907 HOWTO (R_MIPS16_GOT16, /* type */
1908 0, /* rightshift */
1909 2, /* size (0 = byte, 1 = short, 2 = long) */
1910 16, /* bitsize */
1911 FALSE, /* pc_relative */
1912 0, /* bitpos */
1913 complain_overflow_dont, /* complain_on_overflow */
1914 _bfd_mips_elf_got16_reloc, /* special_function */
1915 "R_MIPS16_GOT16", /* name */
1916 FALSE, /* partial_inplace */
72c4ab07 1917 0, /* src_mask */
07d6d2b8 1918 0x0000ffff, /* dst_mask */
738e5348 1919 FALSE), /* pcrel_offset */
d6f16593 1920
738e5348
RS
1921 /* A MIPS16 call through the global offset table. */
1922 HOWTO (R_MIPS16_CALL16, /* type */
1923 0, /* rightshift */
1924 2, /* size (0 = byte, 1 = short, 2 = long) */
1925 16, /* bitsize */
1926 FALSE, /* pc_relative */
1927 0, /* bitpos */
1928 complain_overflow_dont, /* complain_on_overflow */
1929 _bfd_mips_elf_generic_reloc, /* special_function */
1930 "R_MIPS16_CALL16", /* name */
1931 FALSE, /* partial_inplace */
72c4ab07 1932 0, /* src_mask */
07d6d2b8 1933 0x0000ffff, /* dst_mask */
738e5348 1934 FALSE), /* pcrel_offset */
d6f16593
MR
1935
1936 /* MIPS16 high 16 bits of symbol value. */
1937 HOWTO (R_MIPS16_HI16, /* type */
1938 16, /* rightshift */
1939 2, /* size (0 = byte, 1 = short, 2 = long) */
1940 16, /* bitsize */
1941 FALSE, /* pc_relative */
1942 0, /* bitpos */
1943 complain_overflow_dont, /* complain_on_overflow */
1944 _bfd_mips_elf_hi16_reloc, /* special_function */
1945 "R_MIPS16_HI16", /* name */
1946 FALSE, /* partial_inplace */
72c4ab07 1947 0, /* src_mask */
d6f16593
MR
1948 0x0000ffff, /* dst_mask */
1949 FALSE), /* pcrel_offset */
1950
1951 /* MIPS16 low 16 bits of symbol value. */
1952 HOWTO (R_MIPS16_LO16, /* type */
1953 0, /* rightshift */
1954 2, /* size (0 = byte, 1 = short, 2 = long) */
1955 16, /* bitsize */
1956 FALSE, /* pc_relative */
1957 0, /* bitpos */
1958 complain_overflow_dont, /* complain_on_overflow */
1959 _bfd_mips_elf_lo16_reloc, /* special_function */
1960 "R_MIPS16_LO16", /* name */
1961 FALSE, /* partial_inplace */
72c4ab07 1962 0, /* src_mask */
d6f16593
MR
1963 0x0000ffff, /* dst_mask */
1964 FALSE), /* pcrel_offset */
d0f13682
CLT
1965
1966 /* MIPS16 TLS general dynamic variable reference. */
1967 HOWTO (R_MIPS16_TLS_GD, /* type */
1968 0, /* rightshift */
1969 2, /* size (0 = byte, 1 = short, 2 = long) */
1970 16, /* bitsize */
1971 FALSE, /* pc_relative */
1972 0, /* bitpos */
1973 complain_overflow_signed, /* complain_on_overflow */
1974 _bfd_mips_elf_generic_reloc, /* special_function */
1975 "R_MIPS16_TLS_GD", /* name */
1976 FALSE, /* partial_inplace */
1a6c3ca2 1977 0, /* src_mask */
d0f13682
CLT
1978 0x0000ffff, /* dst_mask */
1979 FALSE), /* pcrel_offset */
1980
1981 /* MIPS16 TLS local dynamic variable reference. */
1982 HOWTO (R_MIPS16_TLS_LDM, /* type */
1983 0, /* rightshift */
1984 2, /* size (0 = byte, 1 = short, 2 = long) */
1985 16, /* bitsize */
1986 FALSE, /* pc_relative */
1987 0, /* bitpos */
1988 complain_overflow_signed, /* complain_on_overflow */
1989 _bfd_mips_elf_generic_reloc, /* special_function */
1990 "R_MIPS16_TLS_LDM", /* name */
1991 FALSE, /* partial_inplace */
1a6c3ca2 1992 0, /* src_mask */
d0f13682
CLT
1993 0x0000ffff, /* dst_mask */
1994 FALSE), /* pcrel_offset */
1995
1996 /* MIPS16 TLS local dynamic offset. */
1997 HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
1998 0, /* rightshift */
1999 2, /* size (0 = byte, 1 = short, 2 = long) */
2000 16, /* bitsize */
2001 FALSE, /* pc_relative */
2002 0, /* bitpos */
2003 complain_overflow_signed, /* complain_on_overflow */
2004 _bfd_mips_elf_generic_reloc, /* special_function */
2005 "R_MIPS16_TLS_DTPREL_HI16", /* name */
2006 FALSE, /* partial_inplace */
1a6c3ca2 2007 0, /* src_mask */
d0f13682
CLT
2008 0x0000ffff, /* dst_mask */
2009 FALSE), /* pcrel_offset */
2010
2011 /* MIPS16 TLS local dynamic offset. */
2012 HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
2013 0, /* rightshift */
2014 2, /* size (0 = byte, 1 = short, 2 = long) */
2015 16, /* bitsize */
2016 FALSE, /* pc_relative */
2017 0, /* bitpos */
2018 complain_overflow_signed, /* complain_on_overflow */
2019 _bfd_mips_elf_generic_reloc, /* special_function */
2020 "R_MIPS16_TLS_DTPREL_LO16", /* name */
2021 FALSE, /* partial_inplace */
1a6c3ca2 2022 0, /* src_mask */
d0f13682
CLT
2023 0x0000ffff, /* dst_mask */
2024 FALSE), /* pcrel_offset */
2025
2026 /* MIPS16 TLS thread pointer offset. */
2027 HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
2028 0, /* rightshift */
2029 2, /* size (0 = byte, 1 = short, 2 = long) */
2030 16, /* bitsize */
2031 FALSE, /* pc_relative */
2032 0, /* bitpos */
2033 complain_overflow_signed, /* complain_on_overflow */
2034 _bfd_mips_elf_generic_reloc, /* special_function */
2035 "R_MIPS16_TLS_GOTTPREL", /* name */
2036 FALSE, /* partial_inplace */
1a6c3ca2 2037 0, /* src_mask */
d0f13682
CLT
2038 0x0000ffff, /* dst_mask */
2039 FALSE), /* pcrel_offset */
2040
2041 /* MIPS16 TLS thread pointer offset. */
2042 HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
2043 0, /* rightshift */
2044 2, /* size (0 = byte, 1 = short, 2 = long) */
2045 16, /* bitsize */
2046 FALSE, /* pc_relative */
2047 0, /* bitpos */
2048 complain_overflow_signed, /* complain_on_overflow */
2049 _bfd_mips_elf_generic_reloc, /* special_function */
2050 "R_MIPS16_TLS_TPREL_HI16", /* name */
2051 FALSE, /* partial_inplace */
1a6c3ca2 2052 0, /* src_mask */
d0f13682
CLT
2053 0x0000ffff, /* dst_mask */
2054 FALSE), /* pcrel_offset */
2055
2056 /* MIPS16 TLS thread pointer offset. */
2057 HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
2058 0, /* rightshift */
2059 2, /* size (0 = byte, 1 = short, 2 = long) */
2060 16, /* bitsize */
2061 FALSE, /* pc_relative */
2062 0, /* bitpos */
2063 complain_overflow_signed, /* complain_on_overflow */
2064 _bfd_mips_elf_generic_reloc, /* special_function */
2065 "R_MIPS16_TLS_TPREL_LO16", /* name */
2066 FALSE, /* partial_inplace */
1a6c3ca2 2067 0, /* src_mask */
d0f13682
CLT
2068 0x0000ffff, /* dst_mask */
2069 FALSE), /* pcrel_offset */
c9775dde
MR
2070
2071 /* MIPS16 16-bit PC-relative branch offset. */
2072 HOWTO (R_MIPS16_PC16_S1, /* type */
2073 1, /* rightshift */
2074 2, /* size (0 = byte, 1 = short, 2 = long) */
2075 16, /* bitsize */
2076 TRUE, /* pc_relative */
2077 0, /* bitpos */
2078 complain_overflow_signed, /* complain_on_overflow */
2079 _bfd_mips_elf_generic_reloc, /* special_function */
2080 "R_MIPS16_PC16_S1", /* name */
2081 FALSE, /* partial_inplace */
2082 0, /* src_mask */
2083 0x0000ffff, /* dst_mask */
2084 TRUE), /* pcrel_offset */
d6f16593 2085};
8a397dad 2086
df58fc94
RS
2087static reloc_howto_type elf_micromips_howto_table_rel[] =
2088{
2089 EMPTY_HOWTO (130),
2090 EMPTY_HOWTO (131),
2091 EMPTY_HOWTO (132),
2092
2093 /* 26 bit jump address. */
2094 HOWTO (R_MICROMIPS_26_S1, /* type */
2095 1, /* rightshift */
2096 2, /* size (0 = byte, 1 = short, 2 = long) */
2097 26, /* bitsize */
2098 FALSE, /* pc_relative */
2099 0, /* bitpos */
2100 complain_overflow_dont, /* complain_on_overflow */
07d6d2b8 2101 /* This needs complex overflow
df58fc94
RS
2102 detection, because the upper four
2103 bits must match the PC. */
2104 _bfd_mips_elf_generic_reloc, /* special_function */
2105 "R_MICROMIPS_26_S1", /* name */
2106 TRUE, /* partial_inplace */
2107 0x3ffffff, /* src_mask */
2108 0x3ffffff, /* dst_mask */
2109 FALSE), /* pcrel_offset */
2110
2111 /* High 16 bits of symbol value. */
2112 HOWTO (R_MICROMIPS_HI16, /* type */
2113 16, /* rightshift */
2114 2, /* size (0 = byte, 1 = short, 2 = long) */
2115 16, /* bitsize */
2116 FALSE, /* pc_relative */
2117 0, /* bitpos */
2118 complain_overflow_dont, /* complain_on_overflow */
2119 _bfd_mips_elf_hi16_reloc, /* special_function */
2120 "R_MICROMIPS_HI16", /* name */
2121 TRUE, /* partial_inplace */
2122 0x0000ffff, /* src_mask */
2123 0x0000ffff, /* dst_mask */
2124 FALSE), /* pcrel_offset */
2125
2126 /* Low 16 bits of symbol value. */
2127 HOWTO (R_MICROMIPS_LO16, /* type */
2128 0, /* rightshift */
2129 2, /* size (0 = byte, 1 = short, 2 = long) */
2130 16, /* bitsize */
2131 FALSE, /* pc_relative */
2132 0, /* bitpos */
2133 complain_overflow_dont, /* complain_on_overflow */
2134 _bfd_mips_elf_lo16_reloc, /* special_function */
2135 "R_MICROMIPS_LO16", /* name */
2136 TRUE, /* partial_inplace */
2137 0x0000ffff, /* src_mask */
2138 0x0000ffff, /* dst_mask */
2139 FALSE), /* pcrel_offset */
2140
2141 /* GP relative reference. */
2142 HOWTO (R_MICROMIPS_GPREL16, /* type */
2143 0, /* rightshift */
2144 2, /* size (0 = byte, 1 = short, 2 = long) */
2145 16, /* bitsize */
2146 FALSE, /* pc_relative */
2147 0, /* bitpos */
2148 complain_overflow_signed, /* complain_on_overflow */
2149 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2150 "R_MICROMIPS_GPREL16", /* name */
2151 TRUE, /* partial_inplace */
2152 0x0000ffff, /* src_mask */
2153 0x0000ffff, /* dst_mask */
2154 FALSE), /* pcrel_offset */
2155
2156 /* Reference to literal section. */
2157 HOWTO (R_MICROMIPS_LITERAL, /* type */
2158 0, /* rightshift */
2159 2, /* size (0 = byte, 1 = short, 2 = long) */
2160 16, /* bitsize */
2161 FALSE, /* pc_relative */
2162 0, /* bitpos */
2163 complain_overflow_signed, /* complain_on_overflow */
2164 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2165 "R_MICROMIPS_LITERAL", /* name */
2166 TRUE, /* partial_inplace */
2167 0x0000ffff, /* src_mask */
2168 0x0000ffff, /* dst_mask */
2169 FALSE), /* pcrel_offset */
2170
2171 /* Reference to global offset table. */
2172 HOWTO (R_MICROMIPS_GOT16, /* type */
2173 0, /* rightshift */
2174 2, /* size (0 = byte, 1 = short, 2 = long) */
2175 16, /* bitsize */
2176 FALSE, /* pc_relative */
2177 0, /* bitpos */
2178 complain_overflow_signed, /* complain_on_overflow */
2179 _bfd_mips_elf_got16_reloc, /* special_function */
2180 "R_MICROMIPS_GOT16", /* name */
2181 TRUE, /* partial_inplace */
2182 0x0000ffff, /* src_mask */
2183 0x0000ffff, /* dst_mask */
2184 FALSE), /* pcrel_offset */
2185
2186 /* This is for microMIPS branches. */
2187 HOWTO (R_MICROMIPS_PC7_S1, /* type */
2188 1, /* rightshift */
2189 1, /* size (0 = byte, 1 = short, 2 = long) */
2190 7, /* bitsize */
2191 TRUE, /* pc_relative */
2192 0, /* bitpos */
2193 complain_overflow_signed, /* complain_on_overflow */
2194 _bfd_mips_elf_generic_reloc, /* special_function */
2195 "R_MICROMIPS_PC7_S1", /* name */
2196 TRUE, /* partial_inplace */
2197 0x0000007f, /* src_mask */
2198 0x0000007f, /* dst_mask */
2199 TRUE), /* pcrel_offset */
2200
2201 HOWTO (R_MICROMIPS_PC10_S1, /* type */
2202 1, /* rightshift */
2203 1, /* size (0 = byte, 1 = short, 2 = long) */
2204 10, /* bitsize */
2205 TRUE, /* pc_relative */
2206 0, /* bitpos */
2207 complain_overflow_signed, /* complain_on_overflow */
2208 _bfd_mips_elf_generic_reloc, /* special_function */
2209 "R_MICROMIPS_PC10_S1", /* name */
2210 TRUE, /* partial_inplace */
2211 0x000003ff, /* src_mask */
2212 0x000003ff, /* dst_mask */
2213 TRUE), /* pcrel_offset */
2214
2215 HOWTO (R_MICROMIPS_PC16_S1, /* type */
2216 1, /* rightshift */
2217 2, /* size (0 = byte, 1 = short, 2 = long) */
2218 16, /* bitsize */
2219 TRUE, /* pc_relative */
2220 0, /* bitpos */
2221 complain_overflow_signed, /* complain_on_overflow */
2222 _bfd_mips_elf_generic_reloc, /* special_function */
2223 "R_MICROMIPS_PC16_S1", /* name */
2224 TRUE, /* partial_inplace */
2225 0x0000ffff, /* src_mask */
2226 0x0000ffff, /* dst_mask */
2227 TRUE), /* pcrel_offset */
2228
2229 /* 16 bit call through global offset table. */
2230 HOWTO (R_MICROMIPS_CALL16, /* type */
2231 0, /* rightshift */
2232 2, /* size (0 = byte, 1 = short, 2 = long) */
2233 16, /* bitsize */
2234 FALSE, /* pc_relative */
2235 0, /* bitpos */
2236 complain_overflow_signed, /* complain_on_overflow */
2237 _bfd_mips_elf_generic_reloc, /* special_function */
2238 "R_MICROMIPS_CALL16", /* name */
2239 TRUE, /* partial_inplace */
2240 0x0000ffff, /* src_mask */
2241 0x0000ffff, /* dst_mask */
2242 FALSE), /* pcrel_offset */
2243
2244 EMPTY_HOWTO (143),
2245 EMPTY_HOWTO (144),
2246
2247 /* Displacement in the global offset table. */
2248 HOWTO (R_MICROMIPS_GOT_DISP, /* type */
2249 0, /* rightshift */
2250 2, /* size (0 = byte, 1 = short, 2 = long) */
2251 16, /* bitsize */
2252 FALSE, /* pc_relative */
2253 0, /* bitpos */
2254 complain_overflow_signed, /* complain_on_overflow */
2255 _bfd_mips_elf_generic_reloc, /* special_function */
2256 "R_MICROMIPS_GOT_DISP",/* name */
2257 TRUE, /* partial_inplace */
2258 0x0000ffff, /* src_mask */
2259 0x0000ffff, /* dst_mask */
2260 FALSE), /* pcrel_offset */
2261
2262 /* Displacement to page pointer in the global offset table. */
2263 HOWTO (R_MICROMIPS_GOT_PAGE, /* type */
2264 0, /* rightshift */
2265 2, /* size (0 = byte, 1 = short, 2 = long) */
2266 16, /* bitsize */
2267 FALSE, /* pc_relative */
2268 0, /* bitpos */
2269 complain_overflow_signed, /* complain_on_overflow */
2270 _bfd_mips_elf_generic_reloc, /* special_function */
2271 "R_MICROMIPS_GOT_PAGE",/* name */
2272 TRUE, /* partial_inplace */
2273 0x0000ffff, /* src_mask */
2274 0x0000ffff, /* dst_mask */
2275 FALSE), /* pcrel_offset */
2276
2277 /* Offset from page pointer in the global offset table. */
2278 HOWTO (R_MICROMIPS_GOT_OFST, /* type */
2279 0, /* rightshift */
2280 2, /* size (0 = byte, 1 = short, 2 = long) */
2281 16, /* bitsize */
2282 FALSE, /* pc_relative */
2283 0, /* bitpos */
2284 complain_overflow_signed, /* complain_on_overflow */
2285 _bfd_mips_elf_generic_reloc, /* special_function */
2286 "R_MICROMIPS_GOT_OFST",/* name */
2287 TRUE, /* partial_inplace */
2288 0x0000ffff, /* src_mask */
2289 0x0000ffff, /* dst_mask */
2290 FALSE), /* pcrel_offset */
2291
2292 /* High 16 bits of displacement in global offset table. */
2293 HOWTO (R_MICROMIPS_GOT_HI16, /* type */
2294 0, /* rightshift */
2295 2, /* size (0 = byte, 1 = short, 2 = long) */
2296 16, /* bitsize */
2297 FALSE, /* pc_relative */
2298 0, /* bitpos */
2299 complain_overflow_dont, /* complain_on_overflow */
2300 _bfd_mips_elf_generic_reloc, /* special_function */
2301 "R_MICROMIPS_GOT_HI16",/* name */
2302 TRUE, /* partial_inplace */
2303 0x0000ffff, /* src_mask */
2304 0x0000ffff, /* dst_mask */
2305 FALSE), /* pcrel_offset */
2306
2307 /* Low 16 bits of displacement in global offset table. */
2308 HOWTO (R_MICROMIPS_GOT_LO16, /* type */
2309 0, /* rightshift */
2310 2, /* size (0 = byte, 1 = short, 2 = long) */
2311 16, /* bitsize */
2312 FALSE, /* pc_relative */
2313 0, /* bitpos */
2314 complain_overflow_dont, /* complain_on_overflow */
2315 _bfd_mips_elf_generic_reloc, /* special_function */
2316 "R_MICROMIPS_GOT_LO16",/* name */
2317 TRUE, /* partial_inplace */
2318 0x0000ffff, /* src_mask */
2319 0x0000ffff, /* dst_mask */
2320 FALSE), /* pcrel_offset */
2321
2322 /* 64 bit subtraction. Used in the N32 ABI. */
2323 HOWTO (R_MICROMIPS_SUB, /* type */
2324 0, /* rightshift */
2325 4, /* size (0 = byte, 1 = short, 2 = long) */
2326 64, /* bitsize */
2327 FALSE, /* pc_relative */
2328 0, /* bitpos */
2329 complain_overflow_dont, /* complain_on_overflow */
2330 _bfd_mips_elf_generic_reloc, /* special_function */
2331 "R_MICROMIPS_SUB", /* name */
2332 TRUE, /* partial_inplace */
2333 MINUS_ONE, /* src_mask */
2334 MINUS_ONE, /* dst_mask */
2335 FALSE), /* pcrel_offset */
2336
2337 /* We don't support these for REL relocations, because it means building
2338 the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
2339 R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
2340 using fallable heuristics. */
2341 EMPTY_HOWTO (R_MICROMIPS_HIGHER),
2342 EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
2343
2344 /* High 16 bits of displacement in global offset table. */
2345 HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2346 0, /* rightshift */
2347 2, /* size (0 = byte, 1 = short, 2 = long) */
2348 16, /* bitsize */
2349 FALSE, /* pc_relative */
2350 0, /* bitpos */
2351 complain_overflow_dont, /* complain_on_overflow */
2352 _bfd_mips_elf_generic_reloc, /* special_function */
2353 "R_MICROMIPS_CALL_HI16",/* name */
2354 TRUE, /* partial_inplace */
2355 0x0000ffff, /* src_mask */
2356 0x0000ffff, /* dst_mask */
2357 FALSE), /* pcrel_offset */
2358
2359 /* Low 16 bits of displacement in global offset table. */
2360 HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2361 0, /* rightshift */
2362 2, /* size (0 = byte, 1 = short, 2 = long) */
2363 16, /* bitsize */
2364 FALSE, /* pc_relative */
2365 0, /* bitpos */
2366 complain_overflow_dont, /* complain_on_overflow */
2367 _bfd_mips_elf_generic_reloc, /* special_function */
2368 "R_MICROMIPS_CALL_LO16",/* name */
2369 TRUE, /* partial_inplace */
2370 0x0000ffff, /* src_mask */
2371 0x0000ffff, /* dst_mask */
2372 FALSE), /* pcrel_offset */
5b175e56
MR
2373
2374 /* Section displacement. */
2375 HOWTO (R_MICROMIPS_SCN_DISP, /* type */
2376 0, /* rightshift */
2377 2, /* size (0 = byte, 1 = short, 2 = long) */
2378 32, /* bitsize */
2379 FALSE, /* pc_relative */
2380 0, /* bitpos */
2381 complain_overflow_dont, /* complain_on_overflow */
2382 _bfd_mips_elf_generic_reloc, /* special_function */
2383 "R_MICROMIPS_SCN_DISP", /* name */
2384 TRUE, /* partial_inplace */
2385 0xffffffff, /* src_mask */
2386 0xffffffff, /* dst_mask */
2387 FALSE), /* pcrel_offset */
2388
2389 /* Protected jump conversion. This is an optimization hint. No
2390 relocation is required for correctness. */
2391 HOWTO (R_MICROMIPS_JALR, /* type */
2392 0, /* rightshift */
2393 2, /* size (0 = byte, 1 = short, 2 = long) */
2394 32, /* bitsize */
2395 FALSE, /* pc_relative */
2396 0, /* bitpos */
2397 complain_overflow_dont, /* complain_on_overflow */
2398 _bfd_mips_elf_generic_reloc, /* special_function */
2399 "R_MICROMIPS_JALR", /* name */
2400 FALSE, /* partial_inplace */
2401 0, /* src_mask */
2402 0x00000000, /* dst_mask */
2403 FALSE), /* pcrel_offset */
df58fc94
RS
2404};
2405
2406static reloc_howto_type elf_micromips_howto_table_rela[] =
2407{
2408 EMPTY_HOWTO (130),
2409 EMPTY_HOWTO (131),
2410 EMPTY_HOWTO (132),
2411
2412 /* 26 bit jump address. */
2413 HOWTO (R_MICROMIPS_26_S1, /* type */
2414 1, /* rightshift */
2415 2, /* size (0 = byte, 1 = short, 2 = long) */
2416 26, /* bitsize */
2417 FALSE, /* pc_relative */
2418 0, /* bitpos */
2419 complain_overflow_dont, /* complain_on_overflow */
07d6d2b8 2420 /* This needs complex overflow
df58fc94
RS
2421 detection, because the upper four
2422 bits must match the PC. */
2423 _bfd_mips_elf_generic_reloc, /* special_function */
2424 "R_MICROMIPS_26_S1", /* name */
2425 FALSE, /* partial_inplace */
72c4ab07 2426 0, /* src_mask */
df58fc94
RS
2427 0x3ffffff, /* dst_mask */
2428 FALSE), /* pcrel_offset */
2429
2430 /* High 16 bits of symbol value. */
2431 HOWTO (R_MICROMIPS_HI16, /* type */
2432 16, /* rightshift */
2433 2, /* size (0 = byte, 1 = short, 2 = long) */
2434 16, /* bitsize */
2435 FALSE, /* pc_relative */
2436 0, /* bitpos */
2437 complain_overflow_dont, /* complain_on_overflow */
2438 _bfd_mips_elf_hi16_reloc, /* special_function */
2439 "R_MICROMIPS_HI16", /* name */
2440 FALSE, /* partial_inplace */
72c4ab07 2441 0, /* src_mask */
df58fc94
RS
2442 0x0000ffff, /* dst_mask */
2443 FALSE), /* pcrel_offset */
2444
2445 /* Low 16 bits of symbol value. */
2446 HOWTO (R_MICROMIPS_LO16, /* type */
2447 0, /* rightshift */
2448 2, /* size (0 = byte, 1 = short, 2 = long) */
2449 16, /* bitsize */
2450 FALSE, /* pc_relative */
2451 0, /* bitpos */
2452 complain_overflow_dont, /* complain_on_overflow */
2453 _bfd_mips_elf_lo16_reloc, /* special_function */
2454 "R_MICROMIPS_LO16", /* name */
2455 FALSE, /* partial_inplace */
72c4ab07 2456 0, /* src_mask */
df58fc94
RS
2457 0x0000ffff, /* dst_mask */
2458 FALSE), /* pcrel_offset */
2459
2460 /* GP relative reference. */
2461 HOWTO (R_MICROMIPS_GPREL16, /* type */
2462 0, /* rightshift */
2463 2, /* size (0 = byte, 1 = short, 2 = long) */
2464 16, /* bitsize */
2465 FALSE, /* pc_relative */
2466 0, /* bitpos */
2467 complain_overflow_signed, /* complain_on_overflow */
2468 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2469 "R_MICROMIPS_GPREL16", /* name */
2470 FALSE, /* partial_inplace */
72c4ab07 2471 0, /* src_mask */
df58fc94
RS
2472 0x0000ffff, /* dst_mask */
2473 FALSE), /* pcrel_offset */
2474
2475 /* Reference to literal section. */
2476 HOWTO (R_MICROMIPS_LITERAL, /* type */
2477 0, /* rightshift */
2478 2, /* size (0 = byte, 1 = short, 2 = long) */
2479 16, /* bitsize */
2480 FALSE, /* pc_relative */
2481 0, /* bitpos */
2482 complain_overflow_signed, /* complain_on_overflow */
2483 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2484 "R_MICROMIPS_LITERAL", /* name */
2485 FALSE, /* partial_inplace */
72c4ab07 2486 0, /* src_mask */
df58fc94
RS
2487 0x0000ffff, /* dst_mask */
2488 FALSE), /* pcrel_offset */
2489
2490 /* Reference to global offset table. */
2491 HOWTO (R_MICROMIPS_GOT16, /* type */
2492 0, /* rightshift */
2493 2, /* size (0 = byte, 1 = short, 2 = long) */
2494 16, /* bitsize */
2495 FALSE, /* pc_relative */
2496 0, /* bitpos */
2497 complain_overflow_signed, /* complain_on_overflow */
2498 _bfd_mips_elf_got16_reloc, /* special_function */
2499 "R_MICROMIPS_GOT16", /* name */
2500 FALSE, /* partial_inplace */
72c4ab07 2501 0, /* src_mask */
df58fc94
RS
2502 0x0000ffff, /* dst_mask */
2503 FALSE), /* pcrel_offset */
2504
2505 /* This is for microMIPS branches. */
2506 HOWTO (R_MICROMIPS_PC7_S1, /* type */
2507 1, /* rightshift */
2508 1, /* size (0 = byte, 1 = short, 2 = long) */
2509 7, /* bitsize */
2510 TRUE, /* pc_relative */
2511 0, /* bitpos */
2512 complain_overflow_signed, /* complain_on_overflow */
2513 _bfd_mips_elf_generic_reloc, /* special_function */
2514 "R_MICROMIPS_PC7_S1", /* name */
2515 FALSE, /* partial_inplace */
72c4ab07 2516 0, /* src_mask */
df58fc94
RS
2517 0x0000007f, /* dst_mask */
2518 TRUE), /* pcrel_offset */
2519
2520 HOWTO (R_MICROMIPS_PC10_S1, /* type */
2521 1, /* rightshift */
2522 1, /* size (0 = byte, 1 = short, 2 = long) */
2523 10, /* bitsize */
2524 TRUE, /* pc_relative */
2525 0, /* bitpos */
2526 complain_overflow_signed, /* complain_on_overflow */
2527 _bfd_mips_elf_generic_reloc, /* special_function */
2528 "R_MICROMIPS_PC10_S1", /* name */
2529 FALSE, /* partial_inplace */
72c4ab07 2530 0, /* src_mask */
df58fc94
RS
2531 0x000003ff, /* dst_mask */
2532 TRUE), /* pcrel_offset */
2533
2534 HOWTO (R_MICROMIPS_PC16_S1, /* type */
2535 1, /* rightshift */
2536 2, /* size (0 = byte, 1 = short, 2 = long) */
2537 16, /* bitsize */
2538 TRUE, /* pc_relative */
2539 0, /* bitpos */
2540 complain_overflow_signed, /* complain_on_overflow */
2541 _bfd_mips_elf_generic_reloc, /* special_function */
2542 "R_MICROMIPS_PC16_S1", /* name */
2543 FALSE, /* partial_inplace */
72c4ab07 2544 0, /* src_mask */
df58fc94
RS
2545 0x0000ffff, /* dst_mask */
2546 TRUE), /* pcrel_offset */
2547
2548 /* 16 bit call through global offset table. */
2549 HOWTO (R_MICROMIPS_CALL16, /* type */
2550 0, /* rightshift */
2551 2, /* size (0 = byte, 1 = short, 2 = long) */
2552 16, /* bitsize */
2553 FALSE, /* pc_relative */
2554 0, /* bitpos */
2555 complain_overflow_signed, /* complain_on_overflow */
2556 _bfd_mips_elf_generic_reloc, /* special_function */
2557 "R_MICROMIPS_CALL16", /* name */
2558 FALSE, /* partial_inplace */
72c4ab07 2559 0, /* src_mask */
df58fc94
RS
2560 0x0000ffff, /* dst_mask */
2561 FALSE), /* pcrel_offset */
2562
2563 EMPTY_HOWTO (143),
2564 EMPTY_HOWTO (144),
2565
2566 /* Displacement in the global offset table. */
2567 HOWTO (R_MICROMIPS_GOT_DISP, /* type */
2568 0, /* rightshift */
2569 2, /* size (0 = byte, 1 = short, 2 = long) */
2570 16, /* bitsize */
2571 FALSE, /* pc_relative */
2572 0, /* bitpos */
2573 complain_overflow_signed, /* complain_on_overflow */
2574 _bfd_mips_elf_generic_reloc, /* special_function */
2575 "R_MICROMIPS_GOT_DISP",/* name */
2576 FALSE, /* partial_inplace */
72c4ab07 2577 0, /* src_mask */
df58fc94
RS
2578 0x0000ffff, /* dst_mask */
2579 FALSE), /* pcrel_offset */
2580
2581 /* Displacement to page pointer in the global offset table. */
2582 HOWTO (R_MICROMIPS_GOT_PAGE, /* type */
2583 0, /* rightshift */
2584 2, /* size (0 = byte, 1 = short, 2 = long) */
2585 16, /* bitsize */
2586 FALSE, /* pc_relative */
2587 0, /* bitpos */
2588 complain_overflow_signed, /* complain_on_overflow */
2589 _bfd_mips_elf_generic_reloc, /* special_function */
2590 "R_MICROMIPS_GOT_PAGE",/* name */
2591 FALSE, /* partial_inplace */
72c4ab07 2592 0, /* src_mask */
df58fc94
RS
2593 0x0000ffff, /* dst_mask */
2594 FALSE), /* pcrel_offset */
2595
2596 /* Offset from page pointer in the global offset table. */
2597 HOWTO (R_MICROMIPS_GOT_OFST, /* type */
2598 0, /* rightshift */
2599 2, /* size (0 = byte, 1 = short, 2 = long) */
2600 16, /* bitsize */
2601 FALSE, /* pc_relative */
2602 0, /* bitpos */
2603 complain_overflow_signed, /* complain_on_overflow */
2604 _bfd_mips_elf_generic_reloc, /* special_function */
2605 "R_MICROMIPS_GOT_OFST",/* name */
2606 FALSE, /* partial_inplace */
72c4ab07 2607 0, /* src_mask */
df58fc94
RS
2608 0x0000ffff, /* dst_mask */
2609 FALSE), /* pcrel_offset */
2610
2611 /* High 16 bits of displacement in global offset table. */
2612 HOWTO (R_MICROMIPS_GOT_HI16, /* type */
2613 0, /* rightshift */
2614 2, /* size (0 = byte, 1 = short, 2 = long) */
2615 16, /* bitsize */
2616 FALSE, /* pc_relative */
2617 0, /* bitpos */
2618 complain_overflow_dont, /* complain_on_overflow */
2619 _bfd_mips_elf_generic_reloc, /* special_function */
2620 "R_MICROMIPS_GOT_HI16",/* name */
2621 FALSE, /* partial_inplace */
72c4ab07 2622 0, /* src_mask */
df58fc94
RS
2623 0x0000ffff, /* dst_mask */
2624 FALSE), /* pcrel_offset */
2625
2626 /* Low 16 bits of displacement in global offset table. */
2627 HOWTO (R_MICROMIPS_GOT_LO16, /* type */
2628 0, /* rightshift */
2629 2, /* size (0 = byte, 1 = short, 2 = long) */
2630 16, /* bitsize */
2631 FALSE, /* pc_relative */
2632 0, /* bitpos */
2633 complain_overflow_dont, /* complain_on_overflow */
2634 _bfd_mips_elf_generic_reloc, /* special_function */
2635 "R_MICROMIPS_GOT_LO16",/* name */
2636 FALSE, /* partial_inplace */
72c4ab07 2637 0, /* src_mask */
df58fc94
RS
2638 0x0000ffff, /* dst_mask */
2639 FALSE), /* pcrel_offset */
2640
2641 /* 64 bit subtraction. Used in the N32 ABI. */
2642 HOWTO (R_MICROMIPS_SUB, /* type */
2643 0, /* rightshift */
2644 4, /* size (0 = byte, 1 = short, 2 = long) */
2645 64, /* bitsize */
2646 FALSE, /* pc_relative */
2647 0, /* bitpos */
2648 complain_overflow_dont, /* complain_on_overflow */
2649 _bfd_mips_elf_generic_reloc, /* special_function */
2650 "R_MICROMIPS_SUB", /* name */
2651 FALSE, /* partial_inplace */
72c4ab07 2652 0, /* src_mask */
df58fc94
RS
2653 MINUS_ONE, /* dst_mask */
2654 FALSE), /* pcrel_offset */
2655
2656 /* Get the higher value of a 64 bit addend. */
2657 HOWTO (R_MICROMIPS_HIGHER, /* type */
2658 0, /* rightshift */
2659 2, /* size (0 = byte, 1 = short, 2 = long) */
2660 16, /* bitsize */
2661 FALSE, /* pc_relative */
2662 0, /* bitpos */
2663 complain_overflow_dont, /* complain_on_overflow */
2664 _bfd_mips_elf_generic_reloc, /* special_function */
2665 "R_MICROMIPS_HIGHER", /* name */
2666 FALSE, /* partial_inplace */
72c4ab07 2667 0, /* src_mask */
df58fc94
RS
2668 0x0000ffff, /* dst_mask */
2669 FALSE), /* pcrel_offset */
2670
2671 /* Get the highest value of a 64 bit addend. */
2672 HOWTO (R_MICROMIPS_HIGHEST, /* type */
2673 0, /* rightshift */
2674 2, /* size (0 = byte, 1 = short, 2 = long) */
2675 16, /* bitsize */
2676 FALSE, /* pc_relative */
2677 0, /* bitpos */
2678 complain_overflow_dont, /* complain_on_overflow */
2679 _bfd_mips_elf_generic_reloc, /* special_function */
2680 "R_MICROMIPS_HIGHEST", /* name */
2681 FALSE, /* partial_inplace */
72c4ab07 2682 0, /* src_mask */
df58fc94
RS
2683 0x0000ffff, /* dst_mask */
2684 FALSE), /* pcrel_offset */
2685
2686 /* High 16 bits of displacement in global offset table. */
2687 HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2688 0, /* rightshift */
2689 2, /* size (0 = byte, 1 = short, 2 = long) */
2690 16, /* bitsize */
2691 FALSE, /* pc_relative */
2692 0, /* bitpos */
2693 complain_overflow_dont, /* complain_on_overflow */
2694 _bfd_mips_elf_generic_reloc, /* special_function */
2695 "R_MICROMIPS_CALL_HI16",/* name */
2696 FALSE, /* partial_inplace */
72c4ab07 2697 0, /* src_mask */
df58fc94
RS
2698 0x0000ffff, /* dst_mask */
2699 FALSE), /* pcrel_offset */
2700
2701 /* Low 16 bits of displacement in global offset table. */
2702 HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2703 0, /* rightshift */
2704 2, /* size (0 = byte, 1 = short, 2 = long) */
2705 16, /* bitsize */
2706 FALSE, /* pc_relative */
2707 0, /* bitpos */
2708 complain_overflow_dont, /* complain_on_overflow */
2709 _bfd_mips_elf_generic_reloc, /* special_function */
2710 "R_MICROMIPS_CALL_LO16",/* name */
2711 FALSE, /* partial_inplace */
72c4ab07 2712 0, /* src_mask */
df58fc94
RS
2713 0x0000ffff, /* dst_mask */
2714 FALSE), /* pcrel_offset */
5b175e56
MR
2715
2716 /* Section displacement. */
2717 HOWTO (R_MICROMIPS_SCN_DISP, /* type */
2718 0, /* rightshift */
2719 2, /* size (0 = byte, 1 = short, 2 = long) */
2720 32, /* bitsize */
2721 FALSE, /* pc_relative */
2722 0, /* bitpos */
2723 complain_overflow_dont, /* complain_on_overflow */
2724 _bfd_mips_elf_generic_reloc, /* special_function */
2725 "R_MICROMIPS_SCN_DISP", /* name */
2726 FALSE, /* partial_inplace */
2727 0, /* src_mask */
2728 0xffffffff, /* dst_mask */
2729 FALSE), /* pcrel_offset */
2730
2731 /* Protected jump conversion. This is an optimization hint. No
2732 relocation is required for correctness. */
2733 HOWTO (R_MICROMIPS_JALR, /* type */
2734 0, /* rightshift */
2735 2, /* size (0 = byte, 1 = short, 2 = long) */
2736 32, /* bitsize */
2737 FALSE, /* pc_relative */
2738 0, /* bitpos */
2739 complain_overflow_dont, /* complain_on_overflow */
2740 _bfd_mips_elf_generic_reloc, /* special_function */
2741 "R_MICROMIPS_JALR", /* name */
2742 FALSE, /* partial_inplace */
2743 0, /* src_mask */
2744 0x00000000, /* dst_mask */
2745 FALSE), /* pcrel_offset */
df58fc94
RS
2746};
2747
8a397dad
TS
2748/* GNU extension to record C++ vtable hierarchy */
2749static reloc_howto_type elf_mips_gnu_vtinherit_howto =
2750 HOWTO (R_MIPS_GNU_VTINHERIT, /* type */
2751 0, /* rightshift */
2752 2, /* size (0 = byte, 1 = short, 2 = long) */
2753 0, /* bitsize */
b34976b6 2754 FALSE, /* pc_relative */
8a397dad
TS
2755 0, /* bitpos */
2756 complain_overflow_dont, /* complain_on_overflow */
2757 NULL, /* special_function */
2758 "R_MIPS_GNU_VTINHERIT", /* name */
b34976b6 2759 FALSE, /* partial_inplace */
8a397dad
TS
2760 0, /* src_mask */
2761 0, /* dst_mask */
b34976b6 2762 FALSE); /* pcrel_offset */
8a397dad
TS
2763
2764/* GNU extension to record C++ vtable member usage */
2765static reloc_howto_type elf_mips_gnu_vtentry_howto =
2766 HOWTO (R_MIPS_GNU_VTENTRY, /* type */
2767 0, /* rightshift */
2768 2, /* size (0 = byte, 1 = short, 2 = long) */
2769 0, /* bitsize */
b34976b6 2770 FALSE, /* pc_relative */
8a397dad
TS
2771 0, /* bitpos */
2772 complain_overflow_dont, /* complain_on_overflow */
2773 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
2774 "R_MIPS_GNU_VTENTRY", /* name */
b34976b6 2775 FALSE, /* partial_inplace */
8a397dad
TS
2776 0, /* src_mask */
2777 0, /* dst_mask */
b34976b6 2778 FALSE); /* pcrel_offset */
8a397dad 2779\f
d0c728db
TS
2780/* 16 bit offset for pc-relative branches. */
2781static reloc_howto_type elf_mips_gnu_rel16_s2 =
2782 HOWTO (R_MIPS_GNU_REL16_S2, /* type */
2783 2, /* rightshift */
2784 2, /* size (0 = byte, 1 = short, 2 = long) */
2785 16, /* bitsize */
2786 TRUE, /* pc_relative */
2787 0, /* bitpos */
2788 complain_overflow_signed, /* complain_on_overflow */
30ac9238 2789 _bfd_mips_elf_generic_reloc, /* special_function */
d0c728db
TS
2790 "R_MIPS_GNU_REL16_S2", /* name */
2791 TRUE, /* partial_inplace */
2792 0x0000ffff, /* src_mask */
2793 0x0000ffff, /* dst_mask */
2794 TRUE); /* pcrel_offset */
2795
2796/* 16 bit offset for pc-relative branches. */
2797static reloc_howto_type elf_mips_gnu_rela16_s2 =
2798 HOWTO (R_MIPS_GNU_REL16_S2, /* type */
2799 2, /* rightshift */
2800 2, /* size (0 = byte, 1 = short, 2 = long) */
2801 16, /* bitsize */
2802 TRUE, /* pc_relative */
2803 0, /* bitpos */
2804 complain_overflow_signed, /* complain_on_overflow */
30ac9238 2805 _bfd_mips_elf_generic_reloc, /* special_function */
d0c728db
TS
2806 "R_MIPS_GNU_REL16_S2", /* name */
2807 FALSE, /* partial_inplace */
2808 0, /* src_mask */
2809 0x0000ffff, /* dst_mask */
2810 TRUE); /* pcrel_offset */
b47468a6
CM
2811
2812/* 32 bit pc-relative. Used for compact EH tables. */
2813static reloc_howto_type elf_mips_gnu_pcrel32 =
2814 HOWTO (R_MIPS_PC32, /* type */
2815 0, /* rightshift */
2816 2, /* size (0 = byte, 1 = short, 2 = long) */
2817 32, /* bitsize */
2818 TRUE, /* pc_relative */
2819 0, /* bitpos */
2820 complain_overflow_signed, /* complain_on_overflow */
2821 _bfd_mips_elf_generic_reloc, /* special_function */
2822 "R_MIPS_PC32", /* name */
2823 TRUE, /* partial_inplace */
2824 0xffffffff, /* src_mask */
2825 0xffffffff, /* dst_mask */
2826 TRUE); /* pcrel_offset */
2827
d0c728db 2828\f
861fb55a
DJ
2829/* Originally a VxWorks extension, but now used for other systems too. */
2830static reloc_howto_type elf_mips_copy_howto =
2831 HOWTO (R_MIPS_COPY, /* type */
2832 0, /* rightshift */
2833 0, /* this one is variable size */
2834 0, /* bitsize */
2835 FALSE, /* pc_relative */
2836 0, /* bitpos */
2837 complain_overflow_bitfield, /* complain_on_overflow */
d150b1a2 2838 _bfd_mips_elf_generic_reloc, /* special_function */
861fb55a
DJ
2839 "R_MIPS_COPY", /* name */
2840 FALSE, /* partial_inplace */
07d6d2b8
AM
2841 0x0, /* src_mask */
2842 0x0, /* dst_mask */
861fb55a
DJ
2843 FALSE); /* pcrel_offset */
2844
2845/* Originally a VxWorks extension, but now used for other systems too. */
2846static reloc_howto_type elf_mips_jump_slot_howto =
2847 HOWTO (R_MIPS_JUMP_SLOT, /* type */
2848 0, /* rightshift */
2849 2, /* size (0 = byte, 1 = short, 2 = long) */
2850 32, /* bitsize */
2851 FALSE, /* pc_relative */
2852 0, /* bitpos */
2853 complain_overflow_bitfield, /* complain_on_overflow */
d150b1a2 2854 _bfd_mips_elf_generic_reloc, /* special_function */
861fb55a
DJ
2855 "R_MIPS_JUMP_SLOT", /* name */
2856 FALSE, /* partial_inplace */
07d6d2b8
AM
2857 0x0, /* src_mask */
2858 0x0, /* dst_mask */
861fb55a 2859 FALSE); /* pcrel_offset */
067ec077
CM
2860
2861/* Used in EH tables. */
2862static reloc_howto_type elf_mips_eh_howto =
2863 HOWTO (R_MIPS_EH, /* type */
2864 0, /* rightshift */
2865 2, /* size (0 = byte, 1 = short, 2 = long) */
2866 32, /* bitsize */
2867 FALSE, /* pc_relative */
2868 0, /* bitpos */
2869 complain_overflow_signed, /* complain_on_overflow */
2870 _bfd_mips_elf_generic_reloc, /* special_function */
2871 "R_MIPS_EH", /* name */
2872 TRUE, /* partial_inplace */
2873 0xffffffff, /* src_mask */
07d6d2b8 2874 0xffffffff, /* dst_mask */
067ec077
CM
2875 FALSE); /* pcrel_offset */
2876
861fb55a 2877\f
b34976b6 2878/* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
8a397dad
TS
2879 dangerous relocation. */
2880
b34976b6 2881static bfd_boolean
11a2be4d 2882mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
8a397dad
TS
2883{
2884 unsigned int count;
2885 asymbol **sym;
2886 unsigned int i;
2887
2888 /* If we've already figured out what GP will be, just return it. */
2889 *pgp = _bfd_get_gp_value (output_bfd);
2890 if (*pgp)
b34976b6 2891 return TRUE;
8a397dad
TS
2892
2893 count = bfd_get_symcount (output_bfd);
2894 sym = bfd_get_outsymbols (output_bfd);
2895
2896 /* The linker script will have created a symbol named `_gp' with the
2897 appropriate value. */
11a2be4d 2898 if (sym == NULL)
8a397dad
TS
2899 i = count;
2900 else
2901 {
2902 for (i = 0; i < count; i++, sym++)
2903 {
2904 register const char *name;
2905
2906 name = bfd_asymbol_name (*sym);
2907 if (*name == '_' && strcmp (name, "_gp") == 0)
2908 {
2909 *pgp = bfd_asymbol_value (*sym);
2910 _bfd_set_gp_value (output_bfd, *pgp);
2911 break;
2912 }
2913 }
2914 }
2915
2916 if (i >= count)
2917 {
2918 /* Only get the error once. */
2919 *pgp = 4;
2920 _bfd_set_gp_value (output_bfd, *pgp);
b34976b6 2921 return FALSE;
8a397dad
TS
2922 }
2923
b34976b6 2924 return TRUE;
8a397dad
TS
2925}
2926
2927/* We have to figure out the gp value, so that we can adjust the
2928 symbol value correctly. We look up the symbol _gp in the output
2929 BFD. If we can't find it, we're stuck. We cache it in the ELF
2930 target data. We don't need to adjust the symbol value for an
1049f94e 2931 external symbol if we are producing relocatable output. */
8a397dad
TS
2932
2933static bfd_reloc_status_type
11a2be4d
RS
2934mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
2935 char **error_message, bfd_vma *pgp)
8a397dad
TS
2936{
2937 if (bfd_is_und_section (symbol->section)
1049f94e 2938 && ! relocatable)
8a397dad
TS
2939 {
2940 *pgp = 0;
2941 return bfd_reloc_undefined;
2942 }
2943
2944 *pgp = _bfd_get_gp_value (output_bfd);
2945 if (*pgp == 0
1049f94e 2946 && (! relocatable
8a397dad
TS
2947 || (symbol->flags & BSF_SECTION_SYM) != 0))
2948 {
1049f94e 2949 if (relocatable)
8a397dad
TS
2950 {
2951 /* Make up a value. */
a902ee94 2952 *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
8a397dad
TS
2953 _bfd_set_gp_value (output_bfd, *pgp);
2954 }
2955 else if (!mips_elf_assign_gp (output_bfd, pgp))
2956 {
2957 *error_message =
2958 (char *) _("GP relative relocation when _gp not defined");
2959 return bfd_reloc_dangerous;
2960 }
2961 }
2962
2963 return bfd_reloc_ok;
2964}
2965
2966/* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must
2967 become the offset from the gp register. */
2968
2969static bfd_reloc_status_type
11a2be4d
RS
2970mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2971 asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2972 asection *input_section, bfd *output_bfd,
2973 char **error_message ATTRIBUTE_UNUSED)
8a397dad 2974{
1049f94e 2975 bfd_boolean relocatable;
8a397dad
TS
2976 bfd_reloc_status_type ret;
2977 bfd_vma gp;
2978
11a2be4d 2979 if (output_bfd != NULL)
1049f94e 2980 relocatable = TRUE;
8a397dad
TS
2981 else
2982 {
1049f94e 2983 relocatable = FALSE;
8a397dad
TS
2984 output_bfd = symbol->section->output_section->owner;
2985 }
2986
1049f94e 2987 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
8a397dad
TS
2988 &gp);
2989 if (ret != bfd_reloc_ok)
2990 return ret;
2991
2992 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1049f94e 2993 input_section, relocatable,
8a397dad
TS
2994 data, gp);
2995}
2996
2997/* Do a R_MIPS_LITERAL relocation. */
2998
2999static bfd_reloc_status_type
11a2be4d
RS
3000mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3001 void *data, asection *input_section, bfd *output_bfd,
3002 char **error_message)
8a397dad 3003{
1049f94e 3004 bfd_boolean relocatable;
8a397dad
TS
3005 bfd_reloc_status_type ret;
3006 bfd_vma gp;
3007
254f0426
MR
3008 /* R_MIPS_LITERAL relocations are defined for local symbols only. */
3009 if (output_bfd != NULL
3010 && (symbol->flags & BSF_SECTION_SYM) == 0
3011 && (symbol->flags & BSF_LOCAL) != 0)
3012 {
3013 *error_message = (char *)
3014 _("literal relocation occurs for an external symbol");
3015 return bfd_reloc_outofrange;
3016 }
3017
8a397dad 3018 /* FIXME: The entries in the .lit8 and .lit4 sections should be merged. */
11a2be4d 3019 if (output_bfd != NULL)
1049f94e 3020 relocatable = TRUE;
8a397dad
TS
3021 else
3022 {
1049f94e 3023 relocatable = FALSE;
8a397dad
TS
3024 output_bfd = symbol->section->output_section->owner;
3025 }
3026
1049f94e 3027 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
8a397dad
TS
3028 &gp);
3029 if (ret != bfd_reloc_ok)
3030 return ret;
3031
3032 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1049f94e 3033 input_section, relocatable,
8a397dad
TS
3034 data, gp);
3035}
3036
3037/* Do a R_MIPS_GPREL32 relocation. This is a 32 bit value which must
3038 become the offset from the gp register. */
3039
3040static bfd_reloc_status_type
11a2be4d
RS
3041mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3042 void *data, asection *input_section, bfd *output_bfd,
3043 char **error_message)
8a397dad 3044{
1049f94e 3045 bfd_boolean relocatable;
8a397dad
TS
3046 bfd_reloc_status_type ret;
3047 bfd_vma gp;
3048
a7ebbfdf 3049 /* R_MIPS_GPREL32 relocations are defined for local symbols only. */
11a2be4d 3050 if (output_bfd != NULL
8a397dad 3051 && (symbol->flags & BSF_SECTION_SYM) == 0
a7ebbfdf 3052 && (symbol->flags & BSF_LOCAL) != 0)
8a397dad
TS
3053 {
3054 *error_message = (char *)
3055 _("32bits gp relative relocation occurs for an external symbol");
3056 return bfd_reloc_outofrange;
3057 }
3058
11a2be4d 3059 if (output_bfd != NULL)
8a397dad 3060 {
1049f94e 3061 relocatable = TRUE;
8a397dad
TS
3062 gp = _bfd_get_gp_value (output_bfd);
3063 }
3064 else
3065 {
1049f94e 3066 relocatable = FALSE;
8a397dad
TS
3067 output_bfd = symbol->section->output_section->owner;
3068
1049f94e 3069 ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
8a397dad
TS
3070 error_message, &gp);
3071 if (ret != bfd_reloc_ok)
3072 return ret;
3073 }
3074
3075 return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
1049f94e 3076 relocatable, data, gp);
8a397dad
TS
3077}
3078
3079static bfd_reloc_status_type
11a2be4d
RS
3080gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
3081 asection *input_section, bfd_boolean relocatable,
3082 void *data, bfd_vma gp)
8a397dad
TS
3083{
3084 bfd_vma relocation;
3085 unsigned long val;
3086
3087 if (bfd_is_com_section (symbol->section))
3088 relocation = 0;
3089 else
3090 relocation = symbol->value;
3091
3092 relocation += symbol->section->output_section->vma;
3093 relocation += symbol->section->output_offset;
3094
07515404 3095 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
8a397dad
TS
3096 return bfd_reloc_outofrange;
3097
3098 if (reloc_entry->howto->src_mask == 0)
3099 val = 0;
3100 else
3101 val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
3102
3103 /* Set val to the offset into the section or symbol. */
3104 val += reloc_entry->addend;
3105
3106 /* Adjust val for the final section location and GP value. If we
1049f94e 3107 are producing relocatable output, we don't want to do this for
8a397dad 3108 an external symbol. */
1049f94e 3109 if (! relocatable
8a397dad
TS
3110 || (symbol->flags & BSF_SECTION_SYM) != 0)
3111 val += relocation - gp;
3112
11a2be4d 3113 bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
8a397dad 3114
1049f94e 3115 if (relocatable)
8a397dad
TS
3116 reloc_entry->address += input_section->output_offset;
3117
3118 return bfd_reloc_ok;
3119}
3120
3121/* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
3122 the rest is at bits 6-10. The bitpos already got right by the howto. */
3123
3124static bfd_reloc_status_type
30ac9238
RS
3125mips_elf_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3126 void *data, asection *input_section, bfd *output_bfd,
3127 char **error_message)
8a397dad 3128{
a7ebbfdf
TS
3129 if (reloc_entry->howto->partial_inplace)
3130 {
3131 reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
3132 | (reloc_entry->addend & 0x00000800) >> 9);
3133 }
8a397dad 3134
30ac9238
RS
3135 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
3136 input_section, output_bfd,
3137 error_message);
8a397dad
TS
3138}
3139\f
8a397dad
TS
3140/* Handle a mips16 GP relative reloc. */
3141
3142static bfd_reloc_status_type
11a2be4d
RS
3143mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3144 void *data, asection *input_section, bfd *output_bfd,
3145 char **error_message)
8a397dad 3146{
1049f94e 3147 bfd_boolean relocatable;
8a397dad 3148 bfd_reloc_status_type ret;
d6f16593 3149 bfd_byte *location;
8a397dad 3150 bfd_vma gp;
8a397dad 3151
7f05722e
MR
3152 /* If we're relocating, and this is an external symbol, we don't want
3153 to change anything. */
3154 if (output_bfd != NULL
3155 && (symbol->flags & BSF_SECTION_SYM) == 0
3156 && (symbol->flags & BSF_LOCAL) != 0)
3157 {
3158 reloc_entry->address += input_section->output_offset;
3159 return bfd_reloc_ok;
3160 }
3161
8a397dad 3162 if (output_bfd != NULL)
1049f94e 3163 relocatable = TRUE;
8a397dad
TS
3164 else
3165 {
1049f94e 3166 relocatable = FALSE;
8a397dad
TS
3167 output_bfd = symbol->section->output_section->owner;
3168 }
3169
1049f94e 3170 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
8a397dad
TS
3171 &gp);
3172 if (ret != bfd_reloc_ok)
3173 return ret;
3174
d6f16593 3175 location = (bfd_byte *) data + reloc_entry->address;
df58fc94
RS
3176 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
3177 location);
d6f16593
MR
3178 ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3179 input_section, relocatable,
3180 data, gp);
df58fc94
RS
3181 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
3182 location);
8a397dad 3183
d6f16593 3184 return ret;
8a397dad 3185}
8a397dad
TS
3186\f
3187/* A mapping from BFD reloc types to MIPS ELF reloc types. */
3188
3189struct elf_reloc_map {
3190 bfd_reloc_code_real_type bfd_val;
3191 enum elf_mips_reloc_type elf_val;
3192};
3193
3194static const struct elf_reloc_map mips_reloc_map[] =
3195{
3196 { BFD_RELOC_NONE, R_MIPS_NONE },
3197 { BFD_RELOC_16, R_MIPS_16 },
3198 { BFD_RELOC_32, R_MIPS_32 },
3199 /* There is no BFD reloc for R_MIPS_REL32. */
3200 { BFD_RELOC_CTOR, R_MIPS_32 },
3201 { BFD_RELOC_64, R_MIPS_64 },
bad36eac 3202 { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
8a397dad
TS
3203 { BFD_RELOC_HI16_S, R_MIPS_HI16 },
3204 { BFD_RELOC_LO16, R_MIPS_LO16 },
3205 { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
3206 { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
3207 { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
3208 { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
3209 { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
3210 { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
3211 { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
3212 { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
3213 { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
3214 { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
3215 { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
3216 { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
3217 { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
3218 { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
3219 { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
3220 { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
3221 { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
3222 { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
3223 { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
3224 { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
3225 { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
3226 { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
3227 { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
3228 /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated. */
3229 { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
0f20cc35
DJ
3230 { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
3231 { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
3232 { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
3233 { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
3234 { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
3235 { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
3236 { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
3237 { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
3238 { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
3239 { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
3240 { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
3241 { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
3242 { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
7361da2c
AB
3243 { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 },
3244 { BFD_RELOC_MIPS_21_PCREL_S2, R_MIPS_PC21_S2 },
3245 { BFD_RELOC_MIPS_26_PCREL_S2, R_MIPS_PC26_S2 },
3246 { BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
3247 { BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
3248 { BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
3249 { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
8a397dad
TS
3250};
3251
d6f16593
MR
3252static const struct elf_reloc_map mips16_reloc_map[] =
3253{
3254 { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
3255 { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
738e5348
RS
3256 { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
3257 { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
d6f16593
MR
3258 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
3259 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
d0f13682
CLT
3260 { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
3261 { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
3262 { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
3263 R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
3264 { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
3265 R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
3266 { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
3267 { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
c9775dde
MR
3268 { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min },
3269 { BFD_RELOC_MIPS16_16_PCREL_S1, R_MIPS16_PC16_S1 - R_MIPS16_min }
d6f16593
MR
3270};
3271
df58fc94
RS
3272static const struct elf_reloc_map micromips_reloc_map[] =
3273{
3274 { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
3275 { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
3276 { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
3277 { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
3278 { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
3279 { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
3280 { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
3281 { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
3282 { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
3283 { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
3284 { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
3285 { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
3286 { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
3287 { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
3288 { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
3289 { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
3290 { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
3291 { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
3292 { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
3293 { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
5b175e56
MR
3294 { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
3295 { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
df58fc94
RS
3296};
3297
8a397dad
TS
3298/* Given a BFD reloc type, return a howto structure. */
3299
3300static reloc_howto_type *
11a2be4d
RS
3301bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3302 bfd_reloc_code_real_type code)
8a397dad
TS
3303{
3304 unsigned int i;
3305 /* FIXME: We default to RELA here instead of choosing the right
3306 relocation variant. */
3307 reloc_howto_type *howto_table = elf_mips_howto_table_rela;
d6f16593 3308 reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;
df58fc94 3309 reloc_howto_type *howto_micromips_table = elf_micromips_howto_table_rela;
8a397dad
TS
3310
3311 for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
3312 i++)
3313 {
3314 if (mips_reloc_map[i].bfd_val == code)
3315 return &howto_table[(int) mips_reloc_map[i].elf_val];
3316 }
3317
d6f16593
MR
3318 for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
3319 i++)
3320 {
3321 if (mips16_reloc_map[i].bfd_val == code)
3322 return &howto16_table[(int) mips16_reloc_map[i].elf_val];
3323 }
3324
df58fc94
RS
3325 for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
3326 i++)
3327 {
3328 if (micromips_reloc_map[i].bfd_val == code)
3329 return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
3330 }
3331
8a397dad
TS
3332 switch (code)
3333 {
8a397dad
TS
3334 case BFD_RELOC_VTABLE_INHERIT:
3335 return &elf_mips_gnu_vtinherit_howto;
3336 case BFD_RELOC_VTABLE_ENTRY:
3337 return &elf_mips_gnu_vtentry_howto;
b47468a6
CM
3338 case BFD_RELOC_32_PCREL:
3339 return &elf_mips_gnu_pcrel32;
067ec077
CM
3340 case BFD_RELOC_MIPS_EH:
3341 return &elf_mips_eh_howto;
861fb55a
DJ
3342 case BFD_RELOC_MIPS_COPY:
3343 return &elf_mips_copy_howto;
3344 case BFD_RELOC_MIPS_JUMP_SLOT:
3345 return &elf_mips_jump_slot_howto;
8a397dad
TS
3346 default:
3347 bfd_set_error (bfd_error_bad_value);
3348 return NULL;
3349 }
3350}
3351
157090f7
AM
3352static reloc_howto_type *
3353bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3354 const char *r_name)
3355{
3356 unsigned int i;
3357
3358 for (i = 0;
3359 i < (sizeof (elf_mips_howto_table_rela)
3360 / sizeof (elf_mips_howto_table_rela[0]));
3361 i++)
3362 if (elf_mips_howto_table_rela[i].name != NULL
3363 && strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
3364 return &elf_mips_howto_table_rela[i];
3365
3366 for (i = 0;
3367 i < (sizeof (elf_mips16_howto_table_rela)
3368 / sizeof (elf_mips16_howto_table_rela[0]));
3369 i++)
3370 if (elf_mips16_howto_table_rela[i].name != NULL
3371 && strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
3372 return &elf_mips16_howto_table_rela[i];
3373
df58fc94
RS
3374 for (i = 0;
3375 i < (sizeof (elf_micromips_howto_table_rela)
3376 / sizeof (elf_micromips_howto_table_rela[0]));
3377 i++)
3378 if (elf_micromips_howto_table_rela[i].name != NULL
3379 && strcasecmp (elf_micromips_howto_table_rela[i].name, r_name) == 0)
3380 return &elf_micromips_howto_table_rela[i];
3381
157090f7
AM
3382 if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
3383 return &elf_mips_gnu_vtinherit_howto;
3384 if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
3385 return &elf_mips_gnu_vtentry_howto;
3386 if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
3387 return &elf_mips_gnu_rel16_s2;
3388 if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
3389 return &elf_mips_gnu_rela16_s2;
b47468a6
CM
3390 if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
3391 return &elf_mips_gnu_pcrel32;
067ec077
CM
3392 if (strcasecmp (elf_mips_eh_howto.name, r_name) == 0)
3393 return &elf_mips_eh_howto;
861fb55a
DJ
3394 if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
3395 return &elf_mips_copy_howto;
3396 if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
3397 return &elf_mips_jump_slot_howto;
157090f7
AM
3398
3399 return NULL;
3400}
3401
947216bf 3402/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
8a397dad
TS
3403
3404static reloc_howto_type *
11a2be4d 3405mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
8a397dad
TS
3406{
3407 switch (r_type)
3408 {
8a397dad
TS
3409 case R_MIPS_GNU_VTINHERIT:
3410 return &elf_mips_gnu_vtinherit_howto;
3411 case R_MIPS_GNU_VTENTRY:
3412 return &elf_mips_gnu_vtentry_howto;
d0c728db
TS
3413 case R_MIPS_GNU_REL16_S2:
3414 if (rela_p)
3415 return &elf_mips_gnu_rela16_s2;
3416 else
3417 return &elf_mips_gnu_rel16_s2;
b47468a6
CM
3418 case R_MIPS_PC32:
3419 return &elf_mips_gnu_pcrel32;
067ec077
CM
3420 case R_MIPS_EH:
3421 return &elf_mips_eh_howto;
861fb55a
DJ
3422 case R_MIPS_COPY:
3423 return &elf_mips_copy_howto;
3424 case R_MIPS_JUMP_SLOT:
3425 return &elf_mips_jump_slot_howto;
8a397dad 3426 default:
df58fc94
RS
3427 if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
3428 {
3429 if (rela_p)
3430 return &elf_micromips_howto_table_rela[r_type - R_MICROMIPS_min];
3431 else
3432 return &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min];
3433 }
d6f16593
MR
3434 if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
3435 {
3436 if (rela_p)
3437 return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
3438 else
3439 return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
3440 }
cd21f5da
NC
3441 if (r_type >= R_MIPS_max)
3442 {
4eca0228 3443 _bfd_error_handler (_("unrecognised MIPS reloc number: %d"), r_type);
cd21f5da
NC
3444 bfd_set_error (bfd_error_bad_value);
3445 r_type = R_MIPS_NONE;
3446 }
8a397dad
TS
3447 if (rela_p)
3448 return &elf_mips_howto_table_rela[r_type];
3449 else
3450 return &elf_mips_howto_table_rel[r_type];
3451 break;
3452 }
3453}
3454
947216bf 3455/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
8a397dad
TS
3456
3457static void
11a2be4d 3458mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
8a397dad
TS
3459{
3460 unsigned int r_type;
3461
3462 r_type = ELF32_R_TYPE (dst->r_info);
b34976b6 3463 cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE);
8a397dad
TS
3464
3465 /* The addend for a GPREL16 or LITERAL relocation comes from the GP
3466 value for the object file. We get the addend now, rather than
3467 when we do the relocation, because the symbol manipulations done
3468 by the linker may cause us to lose track of the input BFD. */
3469 if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
9684f078 3470 && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL))
8a397dad
TS
3471 cache_ptr->addend = elf_gp (abfd);
3472}
3473
947216bf 3474/* Given a MIPS Elf_Internal_Rela, fill in an arelent structure. */
8a397dad
TS
3475
3476static void
11a2be4d
RS
3477mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
3478 arelent *cache_ptr, Elf_Internal_Rela *dst)
8a397dad
TS
3479{
3480 unsigned int r_type;
3481
3482 r_type = ELF32_R_TYPE (dst->r_info);
b34976b6 3483 cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
8a397dad
TS
3484 cache_ptr->addend = dst->r_addend;
3485}
3486\f
3487/* Determine whether a symbol is global for the purposes of splitting
3488 the symbol table into global symbols and local symbols. At least
3489 on Irix 5, this split must be between section symbols and all other
3490 symbols. On most ELF targets the split is between static symbols
3491 and externally visible symbols. */
3492
b34976b6 3493static bfd_boolean
11a2be4d 3494mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
8a397dad
TS
3495{
3496 if (SGI_COMPAT (abfd))
3497 return (sym->flags & BSF_SECTION_SYM) == 0;
3498 else
e47bf690 3499 return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
8a397dad
TS
3500 || bfd_is_und_section (bfd_get_section (sym))
3501 || bfd_is_com_section (bfd_get_section (sym)));
3502}
3503\f
3504/* Set the right machine number for a MIPS ELF file. */
3505
b34976b6 3506static bfd_boolean
11a2be4d 3507mips_elf_n32_object_p (bfd *abfd)
8a397dad
TS
3508{
3509 unsigned long mach;
3510
dd2bed3a
MR
3511 if (!ABI_N32_P (abfd))
3512 return FALSE;
3513
8a397dad
TS
3514 /* Irix 5 and 6 are broken. Object file symbol tables are not always
3515 sorted correctly such that local symbols precede global symbols,
3516 and the sh_info field in the symbol table is not always right. */
3517 if (SGI_COMPAT (abfd))
b34976b6 3518 elf_bad_symtab (abfd) = TRUE;
8a397dad
TS
3519
3520 mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
3521 bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
b34976b6 3522 return TRUE;
8a397dad
TS
3523}
3524\f
3525/* Support for core dump NOTE sections. */
b34976b6 3526static bfd_boolean
11a2be4d 3527elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
8a397dad
TS
3528{
3529 int offset;
eea6121a 3530 unsigned int size;
8a397dad
TS
3531
3532 switch (note->descsz)
3533 {
3534 default:
b34976b6 3535 return FALSE;
8a397dad 3536
59a8c196 3537 case 440: /* Linux/MIPS N32 */
8a397dad 3538 /* pr_cursig */
228e534f 3539 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
8a397dad
TS
3540
3541 /* pr_pid */
228e534f 3542 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
8a397dad
TS
3543
3544 /* pr_reg */
3545 offset = 72;
eea6121a 3546 size = 360;
8a397dad
TS
3547
3548 break;
3549 }
3550
3551 /* Make a ".reg/999" section. */
eea6121a 3552 return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
8a397dad
TS
3553 note->descpos + offset);
3554}
3555
b34976b6 3556static bfd_boolean
11a2be4d 3557elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
8a397dad
TS
3558{
3559 switch (note->descsz)
3560 {
3561 default:
b34976b6 3562 return FALSE;
8a397dad
TS
3563
3564 case 128: /* Linux/MIPS elf_prpsinfo */
c9ec0e89
DT
3565 elf_tdata (abfd)->core->pid
3566 = bfd_get_32 (abfd, note->descdata + 16);
228e534f 3567 elf_tdata (abfd)->core->program
8a397dad 3568 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
228e534f 3569 elf_tdata (abfd)->core->command
8a397dad
TS
3570 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
3571 }
3572
3573 /* Note that for some reason, a spurious space is tacked
3574 onto the end of the args in some (at least one anyway)
3575 implementations, so strip it off if it exists. */
3576
3577 {
228e534f 3578 char *command = elf_tdata (abfd)->core->command;
8a397dad
TS
3579 int n = strlen (command);
3580
3581 if (0 < n && command[n - 1] == ' ')
3582 command[n - 1] = '\0';
3583 }
3584
b34976b6 3585 return TRUE;
8a397dad 3586}
544c67cd
JB
3587
3588static bfd_boolean
3589elf_n32_mips_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
3590{
3591 size_t offset;
3592 size_t size;
3593 size_t min_size;
3594
3595 /* Compute offset of pr_getregsz, skipping over pr_statussz.
3596 Also compute minimum size of this note. */
3597 offset = 4 + 4;
3598 min_size = offset + 4 * 2 + 4 + 4 + 4;
3599
3600 if (note->descsz < min_size)
3601 return FALSE;
3602
3603 /* Check for version 1 in pr_version. */
3604 if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
3605 return FALSE;
3606
3607 /* Extract size of pr_reg from pr_gregsetsz. */
3608 /* Skip over pr_gregsetsz and pr_fpregsetsz. */
3609 size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
3610 offset += 4 * 2;
3611
3612 /* Skip over pr_osreldate. */
3613 offset += 4;
3614
3615 /* Read signal from pr_cursig. */
3616 if (elf_tdata (abfd)->core->signal == 0)
3617 elf_tdata (abfd)->core->signal
3618 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
3619 offset += 4;
3620
3621 /* Read TID from pr_pid. */
3622 elf_tdata (abfd)->core->lwpid
3623 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
3624 offset += 4;
3625
3626 /* Padding before pr_reg. */
3627 offset += 4;
3628
3629 /* Make sure that there is enough data remaining in the note. */
3630 if (note->descsz - offset < size)
3631 return FALSE;
3632
3633 /* Make a ".reg/999" section and a ".reg" section. */
3634 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3635 size, note->descpos + offset);
3636}
9031cb4a
DT
3637
3638/* Write Linux core PRSTATUS note into core file. */
3639
3640static char *
3641elf32_mips_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
3642 ...)
3643{
3644 switch (note_type)
3645 {
3646 default:
3647 return NULL;
3648
3649 case NT_PRPSINFO:
3650 BFD_FAIL ();
3651 return NULL;
3652
3653 case NT_PRSTATUS:
3654 {
3655 char data[440];
3656 va_list ap;
3657 long pid;
3658 int cursig;
3659 const void *greg;
3660
3661 va_start (ap, note_type);
3662 memset (data, 0, 72);
3663 pid = va_arg (ap, long);
3664 bfd_put_32 (abfd, pid, data + 24);
3665 cursig = va_arg (ap, int);
3666 bfd_put_16 (abfd, cursig, data + 12);
3667 greg = va_arg (ap, const void *);
3668 memcpy (data + 72, greg, 360);
3669 memset (data + 432, 0, 8);
3670 va_end (ap);
3671 return elfcore_write_note (abfd, buf, bufsiz,
3672 "CORE", note_type, data, sizeof (data));
3673 }
3674 }
3675}
8a397dad
TS
3676\f
3677/* Depending on the target vector we generate some version of Irix
3678 executables or "normal" MIPS ELF ABI executables. */
3679static irix_compat_t
11a2be4d 3680elf_n32_mips_irix_compat (bfd *abfd)
8a397dad 3681{
6d00b590
AM
3682 if ((abfd->xvec == &mips_elf32_n_be_vec)
3683 || (abfd->xvec == &mips_elf32_n_le_vec))
8a397dad
TS
3684 return ict_irix6;
3685 else
3686 return ict_none;
3687}
3688\f
defc8e2b
MR
3689/* Make an n32 MIPS object. We need to set the n32 ABI flag in
3690 `e_flags' to tell the object apart from an o32 object. */
3691
3692static bfd_boolean
3693mips_elf_n32_mkobject (bfd *abfd)
3694{
3695 bfd_boolean ret;
3696
3697 ret = _bfd_mips_elf_mkobject (abfd);
3698 if (ret)
3699 elf_elfheader (abfd)->e_flags |= EF_MIPS_ABI2;
3700
3701 return ret;
3702}
3703\f
8a397dad
TS
3704/* ECOFF swapping routines. These are used when dealing with the
3705 .mdebug section, which is in the ECOFF debugging format. */
3706static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
3707 /* Symbol table magic number. */
3708 magicSym,
3709 /* Alignment of debugging information. E.g., 4. */
3710 4,
3711 /* Sizes of external symbolic information. */
3712 sizeof (struct hdr_ext),
3713 sizeof (struct dnr_ext),
3714 sizeof (struct pdr_ext),
3715 sizeof (struct sym_ext),
3716 sizeof (struct opt_ext),
3717 sizeof (struct fdr_ext),
3718 sizeof (struct rfd_ext),
3719 sizeof (struct ext_ext),
3720 /* Functions to swap in external symbolic data. */
3721 ecoff_swap_hdr_in,
3722 ecoff_swap_dnr_in,
3723 ecoff_swap_pdr_in,
3724 ecoff_swap_sym_in,
3725 ecoff_swap_opt_in,
3726 ecoff_swap_fdr_in,
3727 ecoff_swap_rfd_in,
3728 ecoff_swap_ext_in,
3729 _bfd_ecoff_swap_tir_in,
3730 _bfd_ecoff_swap_rndx_in,
3731 /* Functions to swap out external symbolic data. */
3732 ecoff_swap_hdr_out,
3733 ecoff_swap_dnr_out,
3734 ecoff_swap_pdr_out,
3735 ecoff_swap_sym_out,
3736 ecoff_swap_opt_out,
3737 ecoff_swap_fdr_out,
3738 ecoff_swap_rfd_out,
3739 ecoff_swap_ext_out,
3740 _bfd_ecoff_swap_tir_out,
3741 _bfd_ecoff_swap_rndx_out,
3742 /* Function to read in symbolic data. */
3743 _bfd_mips_elf_read_ecoff_info
3744};
3745\f
3746#define ELF_ARCH bfd_arch_mips
ae95ffa6 3747#define ELF_TARGET_ID MIPS_ELF_DATA
8a397dad
TS
3748#define ELF_MACHINE_CODE EM_MIPS
3749
b34976b6
AM
3750#define elf_backend_collect TRUE
3751#define elf_backend_type_change_ok TRUE
3752#define elf_backend_can_gc_sections TRUE
351cdf24
MF
3753#define elf_backend_gc_mark_extra_sections \
3754 _bfd_mips_elf_gc_mark_extra_sections
8a397dad
TS
3755#define elf_info_to_howto mips_info_to_howto_rela
3756#define elf_info_to_howto_rel mips_info_to_howto_rel
3757#define elf_backend_sym_is_global mips_elf_sym_is_global
3758#define elf_backend_object_p mips_elf_n32_object_p
3759#define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing
3760#define elf_backend_section_processing _bfd_mips_elf_section_processing
3761#define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr
3762#define elf_backend_fake_sections _bfd_mips_elf_fake_sections
3763#define elf_backend_section_from_bfd_section \
3764 _bfd_mips_elf_section_from_bfd_section
3765#define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook
3766#define elf_backend_link_output_symbol_hook \
3767 _bfd_mips_elf_link_output_symbol_hook
3768#define elf_backend_create_dynamic_sections \
3769 _bfd_mips_elf_create_dynamic_sections
3770#define elf_backend_check_relocs _bfd_mips_elf_check_relocs
8992f0d7
TS
3771#define elf_backend_merge_symbol_attribute \
3772 _bfd_mips_elf_merge_symbol_attribute
ad9563d6 3773#define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag
8a397dad
TS
3774#define elf_backend_adjust_dynamic_symbol \
3775 _bfd_mips_elf_adjust_dynamic_symbol
3776#define elf_backend_always_size_sections \
3777 _bfd_mips_elf_always_size_sections
3778#define elf_backend_size_dynamic_sections \
3779 _bfd_mips_elf_size_dynamic_sections
74541ad4 3780#define elf_backend_init_index_section _bfd_elf_init_1_index_section
8a397dad
TS
3781#define elf_backend_relocate_section _bfd_mips_elf_relocate_section
3782#define elf_backend_finish_dynamic_symbol \
3783 _bfd_mips_elf_finish_dynamic_symbol
3784#define elf_backend_finish_dynamic_sections \
3785 _bfd_mips_elf_finish_dynamic_sections
3786#define elf_backend_final_write_processing \
3787 _bfd_mips_elf_final_write_processing
3788#define elf_backend_additional_program_headers \
3789 _bfd_mips_elf_additional_program_headers
3790#define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map
3791#define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook
3792#define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook
3793#define elf_backend_copy_indirect_symbol \
3794 _bfd_mips_elf_copy_indirect_symbol
8a397dad
TS
3795#define elf_backend_grok_prstatus elf32_mips_grok_prstatus
3796#define elf_backend_grok_psinfo elf32_mips_grok_psinfo
544c67cd
JB
3797#define elf_backend_grok_freebsd_prstatus \
3798 elf_n32_mips_grok_freebsd_prstatus
8a397dad
TS
3799#define elf_backend_ecoff_debug_swap &mips_elf32_ecoff_debug_swap
3800
3801#define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO)
b7aba156 3802#define elf_backend_want_dynrelro 1
8a397dad
TS
3803
3804/* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
3805 work better/work only in RELA, so we default to this. */
3806#define elf_backend_may_use_rel_p 1
3807#define elf_backend_may_use_rela_p 1
3808#define elf_backend_default_use_rela_p 1
861fb55a 3809#define elf_backend_rela_plts_and_copies_p 0
b34976b6 3810#define elf_backend_sign_extend_vma TRUE
861fb55a
DJ
3811#define elf_backend_plt_readonly 1
3812#define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val
8a397dad
TS
3813
3814#define elf_backend_discard_info _bfd_mips_elf_discard_info
3815#define elf_backend_ignore_discarded_relocs \
3816 _bfd_mips_elf_ignore_discarded_relocs
3817#define elf_backend_write_section _bfd_mips_elf_write_section
3818#define elf_backend_mips_irix_compat elf_n32_mips_irix_compat
3819#define elf_backend_mips_rtype_to_howto mips_elf_n32_rtype_to_howto
df58fc94
RS
3820#define bfd_elf32_bfd_is_target_special_symbol \
3821 _bfd_mips_elf_is_target_special_symbol
8a397dad 3822#define bfd_elf32_find_nearest_line _bfd_mips_elf_find_nearest_line
4ab527b0 3823#define bfd_elf32_find_inliner_info _bfd_mips_elf_find_inliner_info
f0abc2a1 3824#define bfd_elf32_new_section_hook _bfd_mips_elf_new_section_hook
8a397dad
TS
3825#define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents
3826#define bfd_elf32_bfd_get_relocated_section_contents \
3827 _bfd_elf_mips_get_relocated_section_contents
3828#define bfd_elf32_bfd_link_hash_table_create \
3829 _bfd_mips_elf_link_hash_table_create
3830#define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link
3831#define bfd_elf32_bfd_merge_private_bfd_data \
3832 _bfd_mips_elf_merge_private_bfd_data
3833#define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
3834#define bfd_elf32_bfd_print_private_bfd_data \
3835 _bfd_mips_elf_print_private_bfd_data
defc8e2b 3836#define bfd_elf32_mkobject mips_elf_n32_mkobject
8a397dad
TS
3837
3838/* Support for SGI-ish mips targets using n32 ABI. */
3839
07d6d2b8
AM
3840#define TARGET_LITTLE_SYM mips_elf32_n_le_vec
3841#define TARGET_LITTLE_NAME "elf32-nlittlemips"
3842#define TARGET_BIG_SYM mips_elf32_n_be_vec
3843#define TARGET_BIG_NAME "elf32-nbigmips"
8a397dad 3844
7fd91fe0 3845#define ELF_MAXPAGESIZE 0x10000
24718e3b 3846#define ELF_COMMONPAGESIZE 0x1000
4301eeb1 3847
8a397dad
TS
3848#include "elf32-target.h"
3849
3850/* Support for traditional mips targets using n32 ABI. */
8a397dad
TS
3851#undef TARGET_LITTLE_SYM
3852#undef TARGET_LITTLE_NAME
3853#undef TARGET_BIG_SYM
3854#undef TARGET_BIG_NAME
3855
4301eeb1 3856#undef ELF_MAXPAGESIZE
7fd91fe0 3857#undef ELF_COMMONPAGESIZE
4301eeb1 3858
07d6d2b8
AM
3859#define TARGET_LITTLE_SYM mips_elf32_ntrad_le_vec
3860#define TARGET_LITTLE_NAME "elf32-ntradlittlemips"
3861#define TARGET_BIG_SYM mips_elf32_ntrad_be_vec
3862#define TARGET_BIG_NAME "elf32-ntradbigmips"
8a397dad 3863
4301eeb1 3864#define ELF_MAXPAGESIZE 0x10000
7fd91fe0 3865#define ELF_COMMONPAGESIZE 0x1000
4301eeb1
MR
3866#define elf32_bed elf32_tradbed
3867
9031cb4a
DT
3868#undef elf_backend_write_core_note
3869#define elf_backend_write_core_note elf32_mips_write_core_note
3870
8a397dad
TS
3871/* Include the target file again for this target. */
3872#include "elf32-target.h"
aeffff67
RS
3873
3874
3875/* FreeBSD support. */
3876
3877#undef TARGET_LITTLE_SYM
3878#undef TARGET_LITTLE_NAME
3879#undef TARGET_BIG_SYM
3880#undef TARGET_BIG_NAME
3881
6d00b590 3882#define TARGET_LITTLE_SYM mips_elf32_ntradfbsd_le_vec
aeffff67 3883#define TARGET_LITTLE_NAME "elf32-ntradlittlemips-freebsd"
6d00b590 3884#define TARGET_BIG_SYM mips_elf32_ntradfbsd_be_vec
aeffff67
RS
3885#define TARGET_BIG_NAME "elf32-ntradbigmips-freebsd"
3886
3887#undef ELF_OSABI
3888#define ELF_OSABI ELFOSABI_FREEBSD
3889
aeffff67
RS
3890#undef elf32_bed
3891#define elf32_bed elf32_fbsd_tradbed
3892
9031cb4a
DT
3893#undef elf_backend_write_core_note
3894
aeffff67 3895#include "elf32-target.h"