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