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