2012-03-08 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
[deliverable/binutils-gdb.git] / bfd / elf32-mips.c
CommitLineData
efcbd82c 1/* MIPS-specific support for 32-bit ELF
f0abc2a1 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.
252b5132
RH
4
5 Most of the information added by Ian Lance Taylor, Cygnus Support,
6 <ian@cygnus.com>.
103186c6
MM
7 N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
8 <mark@codesourcery.com>
f7cb7d68
UC
9 Traditional MIPS targets support added by Koundinya.K, Dansk Data
10 Elektronik & Operations Research Group. <kk@ddeorg.soft.net>
252b5132 11
cd123cb7 12 This file is part of BFD, the Binary File Descriptor library.
252b5132 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.
252b5132 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. */
252b5132 28
252b5132
RH
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
252b5132 34#include "sysdep.h"
3db64b00 35#include "bfd.h"
252b5132
RH
36#include "libbfd.h"
37#include "bfdlink.h"
38#include "genlink.h"
39#include "elf-bfd.h"
c6e90b02 40#include "elfxx-mips.h"
252b5132 41#include "elf/mips.h"
0a44bf69 42#include "elf-vxworks.h"
252b5132
RH
43
44/* Get the ECOFF swapping routines. */
45#include "coff/sym.h"
46#include "coff/symconst.h"
47#include "coff/internal.h"
48#include "coff/ecoff.h"
49#include "coff/mips.h"
23e2c83b 50#define ECOFF_SIGNED_32
252b5132
RH
51#include "ecoffswap.h"
52
a7ebbfdf 53static bfd_reloc_status_type gprel32_with_gp
11a2be4d 54 (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma);
c6e90b02 55static bfd_reloc_status_type mips_elf_gprel32_reloc
11a2be4d 56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
252b5132 57static bfd_reloc_status_type mips32_64bit_reloc
11a2be4d 58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
252b5132 59static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
11a2be4d 60 (bfd *, bfd_reloc_code_real_type);
c6e90b02 61static reloc_howto_type *mips_elf32_rtype_to_howto
11a2be4d 62 (unsigned int, bfd_boolean);
252b5132 63static void mips_info_to_howto_rel
11a2be4d 64 (bfd *, arelent *, Elf_Internal_Rela *);
3f830999 65static void mips_info_to_howto_rela
11a2be4d 66 (bfd *, arelent *, Elf_Internal_Rela *);
b34976b6 67static bfd_boolean mips_elf_sym_is_global
11a2be4d 68 (bfd *, asymbol *);
b34976b6 69static bfd_boolean mips_elf32_object_p
11a2be4d 70 (bfd *);
b34976b6 71static bfd_boolean mips_elf_is_local_label_name
11a2be4d 72 (bfd *, const char *);
252b5132 73static bfd_reloc_status_type mips16_gprel_reloc
11a2be4d 74 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
252b5132 75static bfd_reloc_status_type mips_elf_final_gp
11a2be4d 76 (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
b34976b6 77static bfd_boolean mips_elf_assign_gp
11a2be4d 78 (bfd *, bfd_vma *);
b34976b6 79static bfd_boolean elf32_mips_grok_prstatus
11a2be4d 80 (bfd *, Elf_Internal_Note *);
b34976b6 81static bfd_boolean elf32_mips_grok_psinfo
11a2be4d 82 (bfd *, Elf_Internal_Note *);
c6e90b02 83static irix_compat_t elf32_mips_irix_compat
11a2be4d 84 (bfd *);
252b5132 85
cb7394f2
TS
86extern const bfd_target bfd_elf32_bigmips_vec;
87extern const bfd_target bfd_elf32_littlemips_vec;
adb76a3e 88
a94a7c1c 89/* Nonzero if ABFD is using the N32 ABI. */
a94a7c1c
MM
90#define ABI_N32_P(abfd) \
91 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
92
4e8a9624 93/* Whether we are trying to be compatible with IRIX at all. */
a94a7c1c 94#define SGI_COMPAT(abfd) \
c6e90b02 95 (elf32_mips_irix_compat (abfd) != ict_none)
103186c6 96
252b5132
RH
97/* The number of local .got entries we reserve. */
98#define MIPS_RESERVED_GOTNO (2)
99
3f830999
MM
100/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
101 from smaller values. Start with zero, widen, *then* decrement. */
102#define MINUS_ONE (((bfd_vma)0) - 1)
103
d75bc93d
TS
104/* The relocation table used for SHT_REL sections. */
105
106static reloc_howto_type elf_mips_howto_table_rel[] =
107{
108 /* No relocation. */
109 HOWTO (R_MIPS_NONE, /* type */
110 0, /* rightshift */
111 0, /* size (0 = byte, 1 = short, 2 = long) */
112 0, /* bitsize */
b34976b6 113 FALSE, /* pc_relative */
d75bc93d
TS
114 0, /* bitpos */
115 complain_overflow_dont, /* complain_on_overflow */
30ac9238 116 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 117 "R_MIPS_NONE", /* name */
b34976b6 118 FALSE, /* partial_inplace */
d75bc93d
TS
119 0, /* src_mask */
120 0, /* dst_mask */
b34976b6 121 FALSE), /* pcrel_offset */
d75bc93d
TS
122
123 /* 16 bit relocation. */
124 HOWTO (R_MIPS_16, /* type */
125 0, /* rightshift */
126 2, /* size (0 = byte, 1 = short, 2 = long) */
127 16, /* bitsize */
b34976b6 128 FALSE, /* pc_relative */
d75bc93d
TS
129 0, /* bitpos */
130 complain_overflow_signed, /* complain_on_overflow */
30ac9238 131 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 132 "R_MIPS_16", /* name */
b34976b6 133 TRUE, /* partial_inplace */
d75bc93d
TS
134 0x0000ffff, /* src_mask */
135 0x0000ffff, /* dst_mask */
b34976b6 136 FALSE), /* pcrel_offset */
d75bc93d
TS
137
138 /* 32 bit relocation. */
139 HOWTO (R_MIPS_32, /* type */
140 0, /* rightshift */
141 2, /* size (0 = byte, 1 = short, 2 = long) */
142 32, /* bitsize */
b34976b6 143 FALSE, /* pc_relative */
d75bc93d
TS
144 0, /* bitpos */
145 complain_overflow_dont, /* complain_on_overflow */
30ac9238 146 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 147 "R_MIPS_32", /* name */
b34976b6 148 TRUE, /* partial_inplace */
d75bc93d
TS
149 0xffffffff, /* src_mask */
150 0xffffffff, /* dst_mask */
b34976b6 151 FALSE), /* pcrel_offset */
d75bc93d
TS
152
153 /* 32 bit symbol relative relocation. */
154 HOWTO (R_MIPS_REL32, /* type */
155 0, /* rightshift */
156 2, /* size (0 = byte, 1 = short, 2 = long) */
157 32, /* bitsize */
b34976b6 158 FALSE, /* pc_relative */
d75bc93d
TS
159 0, /* bitpos */
160 complain_overflow_dont, /* complain_on_overflow */
30ac9238 161 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 162 "R_MIPS_REL32", /* name */
b34976b6 163 TRUE, /* partial_inplace */
d75bc93d
TS
164 0xffffffff, /* src_mask */
165 0xffffffff, /* dst_mask */
b34976b6 166 FALSE), /* pcrel_offset */
d75bc93d
TS
167
168 /* 26 bit jump address. */
169 HOWTO (R_MIPS_26, /* type */
170 2, /* rightshift */
171 2, /* size (0 = byte, 1 = short, 2 = long) */
172 26, /* bitsize */
b34976b6 173 FALSE, /* pc_relative */
d75bc93d
TS
174 0, /* bitpos */
175 complain_overflow_dont, /* complain_on_overflow */
176 /* This needs complex overflow
177 detection, because the upper four
178 bits must match the PC + 4. */
30ac9238 179 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 180 "R_MIPS_26", /* name */
b34976b6 181 TRUE, /* partial_inplace */
d75bc93d
TS
182 0x03ffffff, /* src_mask */
183 0x03ffffff, /* dst_mask */
b34976b6 184 FALSE), /* pcrel_offset */
d75bc93d
TS
185
186 /* High 16 bits of symbol value. */
187 HOWTO (R_MIPS_HI16, /* type */
30ac9238 188 16, /* rightshift */
d75bc93d
TS
189 2, /* size (0 = byte, 1 = short, 2 = long) */
190 16, /* bitsize */
b34976b6 191 FALSE, /* pc_relative */
d75bc93d
TS
192 0, /* bitpos */
193 complain_overflow_dont, /* complain_on_overflow */
30ac9238 194 _bfd_mips_elf_hi16_reloc, /* special_function */
d75bc93d 195 "R_MIPS_HI16", /* name */
b34976b6 196 TRUE, /* partial_inplace */
d75bc93d
TS
197 0x0000ffff, /* src_mask */
198 0x0000ffff, /* dst_mask */
b34976b6 199 FALSE), /* pcrel_offset */
d75bc93d
TS
200
201 /* Low 16 bits of symbol value. */
202 HOWTO (R_MIPS_LO16, /* type */
203 0, /* rightshift */
204 2, /* size (0 = byte, 1 = short, 2 = long) */
205 16, /* bitsize */
b34976b6 206 FALSE, /* pc_relative */
d75bc93d
TS
207 0, /* bitpos */
208 complain_overflow_dont, /* complain_on_overflow */
30ac9238 209 _bfd_mips_elf_lo16_reloc, /* special_function */
d75bc93d 210 "R_MIPS_LO16", /* name */
b34976b6 211 TRUE, /* partial_inplace */
d75bc93d
TS
212 0x0000ffff, /* src_mask */
213 0x0000ffff, /* dst_mask */
b34976b6 214 FALSE), /* pcrel_offset */
d75bc93d
TS
215
216 /* GP relative reference. */
217 HOWTO (R_MIPS_GPREL16, /* type */
218 0, /* rightshift */
219 2, /* size (0 = byte, 1 = short, 2 = long) */
220 16, /* bitsize */
b34976b6 221 FALSE, /* pc_relative */
d75bc93d
TS
222 0, /* bitpos */
223 complain_overflow_signed, /* complain_on_overflow */
c6e90b02 224 _bfd_mips_elf32_gprel16_reloc, /* special_function */
d75bc93d 225 "R_MIPS_GPREL16", /* name */
b34976b6 226 TRUE, /* partial_inplace */
d75bc93d
TS
227 0x0000ffff, /* src_mask */
228 0x0000ffff, /* dst_mask */
b34976b6 229 FALSE), /* pcrel_offset */
d75bc93d
TS
230
231 /* Reference to literal section. */
232 HOWTO (R_MIPS_LITERAL, /* type */
233 0, /* rightshift */
234 2, /* size (0 = byte, 1 = short, 2 = long) */
235 16, /* bitsize */
b34976b6 236 FALSE, /* pc_relative */
d75bc93d
TS
237 0, /* bitpos */
238 complain_overflow_signed, /* complain_on_overflow */
c6e90b02 239 _bfd_mips_elf32_gprel16_reloc, /* special_function */
d75bc93d 240 "R_MIPS_LITERAL", /* name */
b34976b6 241 TRUE, /* partial_inplace */
d75bc93d
TS
242 0x0000ffff, /* src_mask */
243 0x0000ffff, /* dst_mask */
b34976b6 244 FALSE), /* pcrel_offset */
d75bc93d
TS
245
246 /* Reference to global offset table. */
247 HOWTO (R_MIPS_GOT16, /* type */
248 0, /* rightshift */
249 2, /* size (0 = byte, 1 = short, 2 = long) */
250 16, /* bitsize */
b34976b6 251 FALSE, /* pc_relative */
d75bc93d
TS
252 0, /* bitpos */
253 complain_overflow_signed, /* complain_on_overflow */
30ac9238 254 _bfd_mips_elf_got16_reloc, /* special_function */
d75bc93d 255 "R_MIPS_GOT16", /* name */
b34976b6 256 TRUE, /* partial_inplace */
d75bc93d
TS
257 0x0000ffff, /* src_mask */
258 0x0000ffff, /* dst_mask */
b34976b6 259 FALSE), /* pcrel_offset */
d75bc93d 260
bad36eac
DJ
261 /* 16 bit PC relative reference. Note that the ABI document has a typo
262 and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
263 We do the right thing here. */
d75bc93d 264 HOWTO (R_MIPS_PC16, /* type */
bad36eac 265 2, /* rightshift */
d75bc93d
TS
266 2, /* size (0 = byte, 1 = short, 2 = long) */
267 16, /* bitsize */
b34976b6 268 TRUE, /* pc_relative */
d75bc93d
TS
269 0, /* bitpos */
270 complain_overflow_signed, /* complain_on_overflow */
30ac9238 271 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 272 "R_MIPS_PC16", /* name */
b34976b6 273 TRUE, /* partial_inplace */
d75bc93d
TS
274 0x0000ffff, /* src_mask */
275 0x0000ffff, /* dst_mask */
b34976b6 276 TRUE), /* pcrel_offset */
d75bc93d
TS
277
278 /* 16 bit call through global offset table. */
279 HOWTO (R_MIPS_CALL16, /* type */
280 0, /* rightshift */
281 2, /* size (0 = byte, 1 = short, 2 = long) */
282 16, /* bitsize */
b34976b6 283 FALSE, /* pc_relative */
d75bc93d
TS
284 0, /* bitpos */
285 complain_overflow_signed, /* complain_on_overflow */
30ac9238 286 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 287 "R_MIPS_CALL16", /* name */
b34976b6 288 TRUE, /* partial_inplace */
d75bc93d
TS
289 0x0000ffff, /* src_mask */
290 0x0000ffff, /* dst_mask */
b34976b6 291 FALSE), /* pcrel_offset */
d75bc93d
TS
292
293 /* 32 bit GP relative reference. */
294 HOWTO (R_MIPS_GPREL32, /* type */
295 0, /* rightshift */
296 2, /* size (0 = byte, 1 = short, 2 = long) */
297 32, /* bitsize */
b34976b6 298 FALSE, /* pc_relative */
d75bc93d
TS
299 0, /* bitpos */
300 complain_overflow_dont, /* complain_on_overflow */
c6e90b02 301 mips_elf_gprel32_reloc, /* special_function */
d75bc93d 302 "R_MIPS_GPREL32", /* name */
b34976b6 303 TRUE, /* partial_inplace */
d75bc93d
TS
304 0xffffffff, /* src_mask */
305 0xffffffff, /* dst_mask */
b34976b6 306 FALSE), /* pcrel_offset */
d75bc93d
TS
307
308 /* The remaining relocs are defined on Irix 5, although they are
309 not defined by the ABI. */
310 EMPTY_HOWTO (13),
311 EMPTY_HOWTO (14),
312 EMPTY_HOWTO (15),
313
314 /* A 5 bit shift field. */
315 HOWTO (R_MIPS_SHIFT5, /* type */
316 0, /* rightshift */
317 2, /* size (0 = byte, 1 = short, 2 = long) */
318 5, /* bitsize */
b34976b6 319 FALSE, /* pc_relative */
d75bc93d
TS
320 6, /* bitpos */
321 complain_overflow_bitfield, /* complain_on_overflow */
30ac9238 322 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 323 "R_MIPS_SHIFT5", /* name */
b34976b6 324 TRUE, /* partial_inplace */
d75bc93d
TS
325 0x000007c0, /* src_mask */
326 0x000007c0, /* dst_mask */
b34976b6 327 FALSE), /* pcrel_offset */
d75bc93d
TS
328
329 /* A 6 bit shift field. */
330 /* FIXME: This is not handled correctly; a special function is
331 needed to put the most significant bit in the right place. */
332 HOWTO (R_MIPS_SHIFT6, /* type */
333 0, /* rightshift */
334 2, /* size (0 = byte, 1 = short, 2 = long) */
335 6, /* bitsize */
b34976b6 336 FALSE, /* pc_relative */
d75bc93d
TS
337 6, /* bitpos */
338 complain_overflow_bitfield, /* complain_on_overflow */
30ac9238 339 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 340 "R_MIPS_SHIFT6", /* name */
b34976b6 341 TRUE, /* partial_inplace */
d75bc93d
TS
342 0x000007c4, /* src_mask */
343 0x000007c4, /* dst_mask */
b34976b6 344 FALSE), /* pcrel_offset */
d75bc93d
TS
345
346 /* A 64 bit relocation. */
347 HOWTO (R_MIPS_64, /* type */
348 0, /* rightshift */
349 4, /* size (0 = byte, 1 = short, 2 = long) */
350 64, /* bitsize */
b34976b6 351 FALSE, /* pc_relative */
d75bc93d
TS
352 0, /* bitpos */
353 complain_overflow_dont, /* complain_on_overflow */
354 mips32_64bit_reloc, /* special_function */
355 "R_MIPS_64", /* name */
b34976b6 356 TRUE, /* partial_inplace */
d75bc93d
TS
357 MINUS_ONE, /* src_mask */
358 MINUS_ONE, /* dst_mask */
b34976b6 359 FALSE), /* pcrel_offset */
d75bc93d
TS
360
361 /* Displacement in the global offset table. */
362 HOWTO (R_MIPS_GOT_DISP, /* type */
363 0, /* rightshift */
364 2, /* size (0 = byte, 1 = short, 2 = long) */
365 16, /* bitsize */
b34976b6 366 FALSE, /* pc_relative */
d75bc93d
TS
367 0, /* bitpos */
368 complain_overflow_signed, /* complain_on_overflow */
30ac9238 369 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 370 "R_MIPS_GOT_DISP", /* name */
b34976b6 371 TRUE, /* partial_inplace */
d75bc93d
TS
372 0x0000ffff, /* src_mask */
373 0x0000ffff, /* dst_mask */
b34976b6 374 FALSE), /* pcrel_offset */
d75bc93d
TS
375
376 /* Displacement to page pointer in the global offset table. */
377 HOWTO (R_MIPS_GOT_PAGE, /* type */
378 0, /* rightshift */
379 2, /* size (0 = byte, 1 = short, 2 = long) */
380 16, /* bitsize */
b34976b6 381 FALSE, /* pc_relative */
d75bc93d
TS
382 0, /* bitpos */
383 complain_overflow_signed, /* complain_on_overflow */
30ac9238 384 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 385 "R_MIPS_GOT_PAGE", /* name */
b34976b6 386 TRUE, /* partial_inplace */
d75bc93d
TS
387 0x0000ffff, /* src_mask */
388 0x0000ffff, /* dst_mask */
b34976b6 389 FALSE), /* pcrel_offset */
d75bc93d
TS
390
391 /* Offset from page pointer in the global offset table. */
392 HOWTO (R_MIPS_GOT_OFST, /* type */
393 0, /* rightshift */
394 2, /* size (0 = byte, 1 = short, 2 = long) */
395 16, /* bitsize */
b34976b6 396 FALSE, /* pc_relative */
d75bc93d
TS
397 0, /* bitpos */
398 complain_overflow_signed, /* complain_on_overflow */
30ac9238 399 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 400 "R_MIPS_GOT_OFST", /* name */
b34976b6 401 TRUE, /* partial_inplace */
d75bc93d
TS
402 0x0000ffff, /* src_mask */
403 0x0000ffff, /* dst_mask */
b34976b6 404 FALSE), /* pcrel_offset */
d75bc93d
TS
405
406 /* High 16 bits of displacement in global offset table. */
407 HOWTO (R_MIPS_GOT_HI16, /* type */
408 0, /* rightshift */
409 2, /* size (0 = byte, 1 = short, 2 = long) */
410 16, /* bitsize */
b34976b6 411 FALSE, /* pc_relative */
d75bc93d
TS
412 0, /* bitpos */
413 complain_overflow_dont, /* complain_on_overflow */
30ac9238 414 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 415 "R_MIPS_GOT_HI16", /* name */
b34976b6 416 TRUE, /* partial_inplace */
d75bc93d
TS
417 0x0000ffff, /* src_mask */
418 0x0000ffff, /* dst_mask */
b34976b6 419 FALSE), /* pcrel_offset */
d75bc93d
TS
420
421 /* Low 16 bits of displacement in global offset table. */
422 HOWTO (R_MIPS_GOT_LO16, /* type */
423 0, /* rightshift */
424 2, /* size (0 = byte, 1 = short, 2 = long) */
425 16, /* bitsize */
b34976b6 426 FALSE, /* pc_relative */
d75bc93d
TS
427 0, /* bitpos */
428 complain_overflow_dont, /* complain_on_overflow */
30ac9238 429 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 430 "R_MIPS_GOT_LO16", /* name */
b34976b6 431 TRUE, /* partial_inplace */
d75bc93d
TS
432 0x0000ffff, /* src_mask */
433 0x0000ffff, /* dst_mask */
b34976b6 434 FALSE), /* pcrel_offset */
d75bc93d
TS
435
436 /* 64 bit subtraction. Used in the N32 ABI. */
437 HOWTO (R_MIPS_SUB, /* type */
438 0, /* rightshift */
439 4, /* size (0 = byte, 1 = short, 2 = long) */
440 64, /* bitsize */
b34976b6 441 FALSE, /* pc_relative */
d75bc93d
TS
442 0, /* bitpos */
443 complain_overflow_dont, /* complain_on_overflow */
30ac9238 444 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 445 "R_MIPS_SUB", /* name */
b34976b6 446 TRUE, /* partial_inplace */
d75bc93d
TS
447 MINUS_ONE, /* src_mask */
448 MINUS_ONE, /* dst_mask */
b34976b6 449 FALSE), /* pcrel_offset */
d75bc93d
TS
450
451 /* Used to cause the linker to insert and delete instructions? */
452 EMPTY_HOWTO (R_MIPS_INSERT_A),
453 EMPTY_HOWTO (R_MIPS_INSERT_B),
454 EMPTY_HOWTO (R_MIPS_DELETE),
455
456 /* Get the higher value of a 64 bit addend. */
457 HOWTO (R_MIPS_HIGHER, /* type */
458 0, /* rightshift */
459 2, /* size (0 = byte, 1 = short, 2 = long) */
460 16, /* bitsize */
b34976b6 461 FALSE, /* pc_relative */
d75bc93d
TS
462 0, /* bitpos */
463 complain_overflow_dont, /* complain_on_overflow */
30ac9238 464 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 465 "R_MIPS_HIGHER", /* name */
b34976b6 466 TRUE, /* partial_inplace */
d75bc93d
TS
467 0x0000ffff, /* src_mask */
468 0x0000ffff, /* dst_mask */
b34976b6 469 FALSE), /* pcrel_offset */
d75bc93d
TS
470
471 /* Get the highest value of a 64 bit addend. */
472 HOWTO (R_MIPS_HIGHEST, /* type */
473 0, /* rightshift */
474 2, /* size (0 = byte, 1 = short, 2 = long) */
475 16, /* bitsize */
b34976b6 476 FALSE, /* pc_relative */
d75bc93d
TS
477 0, /* bitpos */
478 complain_overflow_dont, /* complain_on_overflow */
30ac9238 479 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 480 "R_MIPS_HIGHEST", /* name */
b34976b6 481 TRUE, /* partial_inplace */
d75bc93d
TS
482 0x0000ffff, /* src_mask */
483 0x0000ffff, /* dst_mask */
b34976b6 484 FALSE), /* pcrel_offset */
d75bc93d
TS
485
486 /* High 16 bits of displacement in global offset table. */
487 HOWTO (R_MIPS_CALL_HI16, /* type */
488 0, /* rightshift */
489 2, /* size (0 = byte, 1 = short, 2 = long) */
490 16, /* bitsize */
b34976b6 491 FALSE, /* pc_relative */
d75bc93d
TS
492 0, /* bitpos */
493 complain_overflow_dont, /* complain_on_overflow */
30ac9238 494 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 495 "R_MIPS_CALL_HI16", /* name */
b34976b6 496 TRUE, /* partial_inplace */
d75bc93d
TS
497 0x0000ffff, /* src_mask */
498 0x0000ffff, /* dst_mask */
b34976b6 499 FALSE), /* pcrel_offset */
d75bc93d
TS
500
501 /* Low 16 bits of displacement in global offset table. */
502 HOWTO (R_MIPS_CALL_LO16, /* type */
503 0, /* rightshift */
504 2, /* size (0 = byte, 1 = short, 2 = long) */
505 16, /* bitsize */
b34976b6 506 FALSE, /* pc_relative */
d75bc93d
TS
507 0, /* bitpos */
508 complain_overflow_dont, /* complain_on_overflow */
30ac9238 509 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 510 "R_MIPS_CALL_LO16", /* name */
b34976b6 511 TRUE, /* partial_inplace */
d75bc93d
TS
512 0x0000ffff, /* src_mask */
513 0x0000ffff, /* dst_mask */
b34976b6 514 FALSE), /* pcrel_offset */
d75bc93d
TS
515
516 /* Section displacement. */
517 HOWTO (R_MIPS_SCN_DISP, /* type */
518 0, /* rightshift */
519 2, /* size (0 = byte, 1 = short, 2 = long) */
520 32, /* bitsize */
b34976b6 521 FALSE, /* pc_relative */
d75bc93d
TS
522 0, /* bitpos */
523 complain_overflow_dont, /* complain_on_overflow */
30ac9238 524 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 525 "R_MIPS_SCN_DISP", /* name */
b34976b6 526 TRUE, /* partial_inplace */
d75bc93d
TS
527 0xffffffff, /* src_mask */
528 0xffffffff, /* dst_mask */
b34976b6 529 FALSE), /* pcrel_offset */
d75bc93d
TS
530
531 EMPTY_HOWTO (R_MIPS_REL16),
532 EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
533 EMPTY_HOWTO (R_MIPS_PJUMP),
534 EMPTY_HOWTO (R_MIPS_RELGOT),
535
536 /* Protected jump conversion. This is an optimization hint. No
537 relocation is required for correctness. */
538 HOWTO (R_MIPS_JALR, /* type */
539 0, /* rightshift */
540 2, /* size (0 = byte, 1 = short, 2 = long) */
541 32, /* bitsize */
b34976b6 542 FALSE, /* pc_relative */
d75bc93d
TS
543 0, /* bitpos */
544 complain_overflow_dont, /* complain_on_overflow */
30ac9238 545 _bfd_mips_elf_generic_reloc, /* special_function */
d75bc93d 546 "R_MIPS_JALR", /* name */
b34976b6 547 FALSE, /* partial_inplace */
d75bc93d
TS
548 0x00000000, /* src_mask */
549 0x00000000, /* dst_mask */
b34976b6 550 FALSE), /* pcrel_offset */
0f20cc35
DJ
551
552 /* TLS GD/LD dynamic relocations. */
553 HOWTO (R_MIPS_TLS_DTPMOD32, /* type */
554 0, /* rightshift */
555 2, /* size (0 = byte, 1 = short, 2 = long) */
556 32, /* bitsize */
557 FALSE, /* pc_relative */
558 0, /* bitpos */
559 complain_overflow_dont, /* complain_on_overflow */
560 _bfd_mips_elf_generic_reloc, /* special_function */
561 "R_MIPS_TLS_DTPMOD32", /* name */
562 TRUE, /* partial_inplace */
563 0xffffffff, /* src_mask */
564 0xffffffff, /* dst_mask */
565 FALSE), /* pcrel_offset */
566
567 HOWTO (R_MIPS_TLS_DTPREL32, /* type */
568 0, /* rightshift */
569 2, /* size (0 = byte, 1 = short, 2 = long) */
570 32, /* bitsize */
571 FALSE, /* pc_relative */
572 0, /* bitpos */
573 complain_overflow_dont, /* complain_on_overflow */
574 _bfd_mips_elf_generic_reloc, /* special_function */
575 "R_MIPS_TLS_DTPREL32", /* name */
576 TRUE, /* partial_inplace */
577 0xffffffff, /* src_mask */
578 0xffffffff, /* dst_mask */
579 FALSE), /* pcrel_offset */
580
581 EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
582 EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
583
584 /* TLS general dynamic variable reference. */
585 HOWTO (R_MIPS_TLS_GD, /* type */
586 0, /* rightshift */
587 2, /* size (0 = byte, 1 = short, 2 = long) */
588 16, /* bitsize */
589 FALSE, /* pc_relative */
590 0, /* bitpos */
591 complain_overflow_signed, /* complain_on_overflow */
592 _bfd_mips_elf_generic_reloc, /* special_function */
593 "R_MIPS_TLS_GD", /* name */
594 TRUE, /* partial_inplace */
595 0x0000ffff, /* src_mask */
596 0x0000ffff, /* dst_mask */
597 FALSE), /* pcrel_offset */
598
599 /* TLS local dynamic variable reference. */
600 HOWTO (R_MIPS_TLS_LDM, /* type */
601 0, /* rightshift */
602 2, /* size (0 = byte, 1 = short, 2 = long) */
603 16, /* bitsize */
604 FALSE, /* pc_relative */
605 0, /* bitpos */
606 complain_overflow_signed, /* complain_on_overflow */
607 _bfd_mips_elf_generic_reloc, /* special_function */
608 "R_MIPS_TLS_LDM", /* name */
609 TRUE, /* partial_inplace */
610 0x0000ffff, /* src_mask */
611 0x0000ffff, /* dst_mask */
612 FALSE), /* pcrel_offset */
613
614 /* TLS local dynamic offset. */
615 HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
616 0, /* rightshift */
617 2, /* size (0 = byte, 1 = short, 2 = long) */
618 16, /* bitsize */
619 FALSE, /* pc_relative */
620 0, /* bitpos */
621 complain_overflow_signed, /* complain_on_overflow */
622 _bfd_mips_elf_generic_reloc, /* special_function */
623 "R_MIPS_TLS_DTPREL_HI16", /* name */
624 TRUE, /* partial_inplace */
625 0x0000ffff, /* src_mask */
626 0x0000ffff, /* dst_mask */
627 FALSE), /* pcrel_offset */
628
629 /* TLS local dynamic offset. */
630 HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
631 0, /* rightshift */
632 2, /* size (0 = byte, 1 = short, 2 = long) */
633 16, /* bitsize */
634 FALSE, /* pc_relative */
635 0, /* bitpos */
636 complain_overflow_signed, /* complain_on_overflow */
637 _bfd_mips_elf_generic_reloc, /* special_function */
638 "R_MIPS_TLS_DTPREL_LO16", /* name */
639 TRUE, /* partial_inplace */
640 0x0000ffff, /* src_mask */
641 0x0000ffff, /* dst_mask */
642 FALSE), /* pcrel_offset */
643
644 /* TLS thread pointer offset. */
645 HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
646 0, /* rightshift */
647 2, /* size (0 = byte, 1 = short, 2 = long) */
648 16, /* bitsize */
649 FALSE, /* pc_relative */
650 0, /* bitpos */
651 complain_overflow_signed, /* complain_on_overflow */
652 _bfd_mips_elf_generic_reloc, /* special_function */
653 "R_MIPS_TLS_GOTTPREL", /* name */
654 TRUE, /* partial_inplace */
655 0x0000ffff, /* src_mask */
656 0x0000ffff, /* dst_mask */
657 FALSE), /* pcrel_offset */
658
659 /* TLS IE dynamic relocations. */
660 HOWTO (R_MIPS_TLS_TPREL32, /* type */
661 0, /* rightshift */
662 2, /* size (0 = byte, 1 = short, 2 = long) */
663 32, /* bitsize */
664 FALSE, /* pc_relative */
665 0, /* bitpos */
666 complain_overflow_dont, /* complain_on_overflow */
667 _bfd_mips_elf_generic_reloc, /* special_function */
668 "R_MIPS_TLS_TPREL32", /* name */
669 TRUE, /* partial_inplace */
670 0xffffffff, /* src_mask */
671 0xffffffff, /* dst_mask */
672 FALSE), /* pcrel_offset */
673
674 EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
675
676 /* TLS thread pointer offset. */
677 HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
678 0, /* rightshift */
679 2, /* size (0 = byte, 1 = short, 2 = long) */
680 16, /* bitsize */
681 FALSE, /* pc_relative */
682 0, /* bitpos */
683 complain_overflow_signed, /* complain_on_overflow */
684 _bfd_mips_elf_generic_reloc, /* special_function */
685 "R_MIPS_TLS_TPREL_HI16", /* name */
686 TRUE, /* partial_inplace */
687 0x0000ffff, /* src_mask */
688 0x0000ffff, /* dst_mask */
689 FALSE), /* pcrel_offset */
690
691 /* TLS thread pointer offset. */
692 HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
693 0, /* rightshift */
694 2, /* size (0 = byte, 1 = short, 2 = long) */
695 16, /* bitsize */
696 FALSE, /* pc_relative */
697 0, /* bitpos */
698 complain_overflow_signed, /* complain_on_overflow */
699 _bfd_mips_elf_generic_reloc, /* special_function */
700 "R_MIPS_TLS_TPREL_LO16", /* name */
701 TRUE, /* partial_inplace */
702 0x0000ffff, /* src_mask */
703 0x0000ffff, /* dst_mask */
704 FALSE), /* pcrel_offset */
165b93e7
RS
705
706 /* 32 bit relocation with no addend. */
707 HOWTO (R_MIPS_GLOB_DAT, /* type */
708 0, /* rightshift */
709 2, /* size (0 = byte, 1 = short, 2 = long) */
710 32, /* bitsize */
711 FALSE, /* pc_relative */
712 0, /* bitpos */
713 complain_overflow_dont, /* complain_on_overflow */
714 _bfd_mips_elf_generic_reloc, /* special_function */
715 "R_MIPS_GLOB_DAT", /* name */
716 FALSE, /* partial_inplace */
717 0x0, /* src_mask */
718 0xffffffff, /* dst_mask */
719 FALSE), /* pcrel_offset */
d75bc93d
TS
720};
721
c6e90b02
TS
722/* The reloc used for BFD_RELOC_CTOR when doing a 64 bit link. This
723 is a hack to make the linker think that we need 64 bit values. */
724static reloc_howto_type elf_mips_ctor64_howto =
725 HOWTO (R_MIPS_64, /* type */
252b5132 726 0, /* rightshift */
c6e90b02 727 4, /* size (0 = byte, 1 = short, 2 = long) */
252b5132 728 32, /* bitsize */
b34976b6 729 FALSE, /* pc_relative */
252b5132 730 0, /* bitpos */
c6e90b02
TS
731 complain_overflow_signed, /* complain_on_overflow */
732 mips32_64bit_reloc, /* special_function */
733 "R_MIPS_64", /* name */
b34976b6 734 TRUE, /* partial_inplace */
c6e90b02 735 0xffffffff, /* src_mask */
252b5132 736 0xffffffff, /* dst_mask */
b34976b6 737 FALSE); /* pcrel_offset */
252b5132 738
d6f16593
MR
739static reloc_howto_type elf_mips16_howto_table_rel[] =
740{
741 /* The reloc used for the mips16 jump instruction. */
c6e90b02 742 HOWTO (R_MIPS16_26, /* type */
252b5132
RH
743 2, /* rightshift */
744 2, /* size (0 = byte, 1 = short, 2 = long) */
745 26, /* bitsize */
b34976b6 746 FALSE, /* pc_relative */
252b5132
RH
747 0, /* bitpos */
748 complain_overflow_dont, /* complain_on_overflow */
c6e90b02
TS
749 /* This needs complex overflow
750 detection, because the upper four
751 bits must match the PC. */
35d3d567 752 _bfd_mips_elf_generic_reloc, /* special_function */
c6e90b02 753 "R_MIPS16_26", /* name */
b34976b6 754 TRUE, /* partial_inplace */
c6e90b02
TS
755 0x3ffffff, /* src_mask */
756 0x3ffffff, /* dst_mask */
d6f16593 757 FALSE), /* pcrel_offset */
252b5132 758
d6f16593 759 /* The reloc used for the mips16 gprel instruction. */
c6e90b02 760 HOWTO (R_MIPS16_GPREL, /* type */
252b5132
RH
761 0, /* rightshift */
762 2, /* size (0 = byte, 1 = short, 2 = long) */
763 16, /* bitsize */
b34976b6 764 FALSE, /* pc_relative */
252b5132 765 0, /* bitpos */
c6e90b02
TS
766 complain_overflow_signed, /* complain_on_overflow */
767 mips16_gprel_reloc, /* special_function */
768 "R_MIPS16_GPREL", /* name */
b34976b6 769 TRUE, /* partial_inplace */
d6f16593
MR
770 0x0000ffff, /* src_mask */
771 0x0000ffff, /* dst_mask */
772 FALSE), /* pcrel_offset */
773
738e5348
RS
774 /* A MIPS16 reference to the global offset table. */
775 HOWTO (R_MIPS16_GOT16, /* type */
776 0, /* rightshift */
777 2, /* size (0 = byte, 1 = short, 2 = long) */
778 16, /* bitsize */
779 FALSE, /* pc_relative */
780 0, /* bitpos */
781 complain_overflow_dont, /* complain_on_overflow */
782 _bfd_mips_elf_got16_reloc, /* special_function */
783 "R_MIPS16_GOT16", /* name */
784 TRUE, /* partial_inplace */
785 0x0000ffff, /* src_mask */
786 0x0000ffff, /* dst_mask */
787 FALSE), /* pcrel_offset */
d6f16593 788
738e5348
RS
789 /* A MIPS16 call through the global offset table. */
790 HOWTO (R_MIPS16_CALL16, /* type */
791 0, /* rightshift */
792 2, /* size (0 = byte, 1 = short, 2 = long) */
793 16, /* bitsize */
794 FALSE, /* pc_relative */
795 0, /* bitpos */
796 complain_overflow_dont, /* complain_on_overflow */
797 _bfd_mips_elf_generic_reloc, /* special_function */
798 "R_MIPS16_CALL16", /* name */
799 TRUE, /* partial_inplace */
800 0x0000ffff, /* src_mask */
801 0x0000ffff, /* dst_mask */
802 FALSE), /* pcrel_offset */
d6f16593
MR
803
804 /* MIPS16 high 16 bits of symbol value. */
805 HOWTO (R_MIPS16_HI16, /* type */
806 16, /* rightshift */
807 2, /* size (0 = byte, 1 = short, 2 = long) */
808 16, /* bitsize */
809 FALSE, /* pc_relative */
810 0, /* bitpos */
811 complain_overflow_dont, /* complain_on_overflow */
812 _bfd_mips_elf_hi16_reloc, /* special_function */
813 "R_MIPS16_HI16", /* name */
814 TRUE, /* partial_inplace */
815 0x0000ffff, /* src_mask */
816 0x0000ffff, /* dst_mask */
817 FALSE), /* pcrel_offset */
818
819 /* MIPS16 low 16 bits of symbol value. */
820 HOWTO (R_MIPS16_LO16, /* type */
821 0, /* rightshift */
822 2, /* size (0 = byte, 1 = short, 2 = long) */
823 16, /* bitsize */
824 FALSE, /* pc_relative */
825 0, /* bitpos */
826 complain_overflow_dont, /* complain_on_overflow */
827 _bfd_mips_elf_lo16_reloc, /* special_function */
828 "R_MIPS16_LO16", /* name */
829 TRUE, /* partial_inplace */
830 0x0000ffff, /* src_mask */
831 0x0000ffff, /* dst_mask */
832 FALSE), /* pcrel_offset */
d0f13682
CLT
833
834 /* MIPS16 TLS general dynamic variable reference. */
835 HOWTO (R_MIPS16_TLS_GD, /* type */
836 0, /* rightshift */
837 2, /* size (0 = byte, 1 = short, 2 = long) */
838 16, /* bitsize */
839 FALSE, /* pc_relative */
840 0, /* bitpos */
841 complain_overflow_signed, /* complain_on_overflow */
842 _bfd_mips_elf_generic_reloc, /* special_function */
843 "R_MIPS16_TLS_GD", /* name */
844 TRUE, /* partial_inplace */
845 0x0000ffff, /* src_mask */
846 0x0000ffff, /* dst_mask */
847 FALSE), /* pcrel_offset */
848
849 /* MIPS16 TLS local dynamic variable reference. */
850 HOWTO (R_MIPS16_TLS_LDM, /* type */
851 0, /* rightshift */
852 2, /* size (0 = byte, 1 = short, 2 = long) */
853 16, /* bitsize */
854 FALSE, /* pc_relative */
855 0, /* bitpos */
856 complain_overflow_signed, /* complain_on_overflow */
857 _bfd_mips_elf_generic_reloc, /* special_function */
858 "R_MIPS16_TLS_LDM", /* name */
859 TRUE, /* partial_inplace */
860 0x0000ffff, /* src_mask */
861 0x0000ffff, /* dst_mask */
862 FALSE), /* pcrel_offset */
863
864 /* MIPS16 TLS local dynamic offset. */
865 HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
866 0, /* rightshift */
867 2, /* size (0 = byte, 1 = short, 2 = long) */
868 16, /* bitsize */
869 FALSE, /* pc_relative */
870 0, /* bitpos */
871 complain_overflow_signed, /* complain_on_overflow */
872 _bfd_mips_elf_generic_reloc, /* special_function */
873 "R_MIPS16_TLS_DTPREL_HI16", /* name */
874 TRUE, /* partial_inplace */
875 0x0000ffff, /* src_mask */
876 0x0000ffff, /* dst_mask */
877 FALSE), /* pcrel_offset */
878
879 /* MIPS16 TLS local dynamic offset. */
880 HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
881 0, /* rightshift */
882 2, /* size (0 = byte, 1 = short, 2 = long) */
883 16, /* bitsize */
884 FALSE, /* pc_relative */
885 0, /* bitpos */
886 complain_overflow_signed, /* complain_on_overflow */
887 _bfd_mips_elf_generic_reloc, /* special_function */
888 "R_MIPS16_TLS_DTPREL_LO16", /* name */
889 TRUE, /* partial_inplace */
890 0x0000ffff, /* src_mask */
891 0x0000ffff, /* dst_mask */
892 FALSE), /* pcrel_offset */
893
894 /* MIPS16 TLS thread pointer offset. */
895 HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
896 0, /* rightshift */
897 2, /* size (0 = byte, 1 = short, 2 = long) */
898 16, /* bitsize */
899 FALSE, /* pc_relative */
900 0, /* bitpos */
901 complain_overflow_signed, /* complain_on_overflow */
902 _bfd_mips_elf_generic_reloc, /* special_function */
903 "R_MIPS16_TLS_GOTTPREL", /* name */
904 TRUE, /* partial_inplace */
905 0x0000ffff, /* src_mask */
906 0x0000ffff, /* dst_mask */
907 FALSE), /* pcrel_offset */
908
909 /* MIPS16 TLS thread pointer offset. */
910 HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
911 0, /* rightshift */
912 2, /* size (0 = byte, 1 = short, 2 = long) */
913 16, /* bitsize */
914 FALSE, /* pc_relative */
915 0, /* bitpos */
916 complain_overflow_signed, /* complain_on_overflow */
917 _bfd_mips_elf_generic_reloc, /* special_function */
918 "R_MIPS16_TLS_TPREL_HI16", /* name */
919 TRUE, /* partial_inplace */
920 0x0000ffff, /* src_mask */
921 0x0000ffff, /* dst_mask */
922 FALSE), /* pcrel_offset */
923
924 /* MIPS16 TLS thread pointer offset. */
925 HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
926 0, /* rightshift */
927 2, /* size (0 = byte, 1 = short, 2 = long) */
928 16, /* bitsize */
929 FALSE, /* pc_relative */
930 0, /* bitpos */
931 complain_overflow_signed, /* complain_on_overflow */
932 _bfd_mips_elf_generic_reloc, /* special_function */
933 "R_MIPS16_TLS_TPREL_LO16", /* name */
934 TRUE, /* partial_inplace */
935 0x0000ffff, /* src_mask */
936 0x0000ffff, /* dst_mask */
937 FALSE), /* pcrel_offset */
d6f16593 938};
252b5132 939
df58fc94
RS
940static reloc_howto_type elf_micromips_howto_table_rel[] =
941{
942 EMPTY_HOWTO (130),
943 EMPTY_HOWTO (131),
944 EMPTY_HOWTO (132),
945
946 /* 26 bit jump address. */
947 HOWTO (R_MICROMIPS_26_S1, /* type */
948 1, /* rightshift */
949 2, /* size (0 = byte, 1 = short, 2 = long) */
950 26, /* bitsize */
951 FALSE, /* pc_relative */
952 0, /* bitpos */
953 complain_overflow_dont, /* complain_on_overflow */
954 /* This needs complex overflow
955 detection, because the upper four
956 bits must match the PC. */
957 _bfd_mips_elf_generic_reloc, /* special_function */
958 "R_MICROMIPS_26_S1", /* name */
959 TRUE, /* partial_inplace */
960 0x3ffffff, /* src_mask */
961 0x3ffffff, /* dst_mask */
962 FALSE), /* pcrel_offset */
963
964 /* High 16 bits of symbol value. */
965 HOWTO (R_MICROMIPS_HI16, /* type */
966 16, /* rightshift */
967 2, /* size (0 = byte, 1 = short, 2 = long) */
968 16, /* bitsize */
969 FALSE, /* pc_relative */
970 0, /* bitpos */
971 complain_overflow_dont, /* complain_on_overflow */
972 _bfd_mips_elf_hi16_reloc, /* special_function */
973 "R_MICROMIPS_HI16", /* name */
974 TRUE, /* partial_inplace */
975 0x0000ffff, /* src_mask */
976 0x0000ffff, /* dst_mask */
977 FALSE), /* pcrel_offset */
978
979 /* Low 16 bits of symbol value. */
980 HOWTO (R_MICROMIPS_LO16, /* type */
981 0, /* rightshift */
982 2, /* size (0 = byte, 1 = short, 2 = long) */
983 16, /* bitsize */
984 FALSE, /* pc_relative */
985 0, /* bitpos */
986 complain_overflow_dont, /* complain_on_overflow */
987 _bfd_mips_elf_lo16_reloc, /* special_function */
988 "R_MICROMIPS_LO16", /* name */
989 TRUE, /* partial_inplace */
990 0x0000ffff, /* src_mask */
991 0x0000ffff, /* dst_mask */
992 FALSE), /* pcrel_offset */
993
994 /* GP relative reference. */
995 HOWTO (R_MICROMIPS_GPREL16, /* type */
996 0, /* rightshift */
997 2, /* size (0 = byte, 1 = short, 2 = long) */
998 16, /* bitsize */
999 FALSE, /* pc_relative */
1000 0, /* bitpos */
1001 complain_overflow_signed, /* complain_on_overflow */
1002 _bfd_mips_elf32_gprel16_reloc, /* special_function */
1003 "R_MICROMIPS_GPREL16", /* name */
1004 TRUE, /* partial_inplace */
1005 0x0000ffff, /* src_mask */
1006 0x0000ffff, /* dst_mask */
1007 FALSE), /* pcrel_offset */
1008
1009 /* Reference to literal section. */
1010 HOWTO (R_MICROMIPS_LITERAL, /* type */
1011 0, /* rightshift */
1012 2, /* size (0 = byte, 1 = short, 2 = long) */
1013 16, /* bitsize */
1014 FALSE, /* pc_relative */
1015 0, /* bitpos */
1016 complain_overflow_signed, /* complain_on_overflow */
1017 _bfd_mips_elf32_gprel16_reloc, /* special_function */
1018 "R_MICROMIPS_LITERAL", /* name */
1019 TRUE, /* partial_inplace */
1020 0x0000ffff, /* src_mask */
1021 0x0000ffff, /* dst_mask */
1022 FALSE), /* pcrel_offset */
1023
1024 /* Reference to global offset table. */
1025 HOWTO (R_MICROMIPS_GOT16, /* type */
1026 0, /* rightshift */
1027 2, /* size (0 = byte, 1 = short, 2 = long) */
1028 16, /* bitsize */
1029 FALSE, /* pc_relative */
1030 0, /* bitpos */
1031 complain_overflow_signed, /* complain_on_overflow */
1032 _bfd_mips_elf_got16_reloc, /* special_function */
1033 "R_MICROMIPS_GOT16", /* name */
1034 TRUE, /* partial_inplace */
1035 0x0000ffff, /* src_mask */
1036 0x0000ffff, /* dst_mask */
1037 FALSE), /* pcrel_offset */
1038
1039 /* This is for microMIPS branches. */
1040 HOWTO (R_MICROMIPS_PC7_S1, /* type */
1041 1, /* rightshift */
1042 1, /* size (0 = byte, 1 = short, 2 = long) */
1043 7, /* bitsize */
1044 TRUE, /* pc_relative */
1045 0, /* bitpos */
1046 complain_overflow_signed, /* complain_on_overflow */
1047 _bfd_mips_elf_generic_reloc, /* special_function */
1048 "R_MICROMIPS_PC7_S1", /* name */
1049 TRUE, /* partial_inplace */
1050 0x0000007f, /* src_mask */
1051 0x0000007f, /* dst_mask */
1052 TRUE), /* pcrel_offset */
1053
1054 HOWTO (R_MICROMIPS_PC10_S1, /* type */
1055 1, /* rightshift */
1056 1, /* size (0 = byte, 1 = short, 2 = long) */
1057 10, /* bitsize */
1058 TRUE, /* pc_relative */
1059 0, /* bitpos */
1060 complain_overflow_signed, /* complain_on_overflow */
1061 _bfd_mips_elf_generic_reloc, /* special_function */
1062 "R_MICROMIPS_PC10_S1", /* name */
1063 TRUE, /* partial_inplace */
1064 0x000003ff, /* src_mask */
1065 0x000003ff, /* dst_mask */
1066 TRUE), /* pcrel_offset */
1067
1068 HOWTO (R_MICROMIPS_PC16_S1, /* type */
1069 1, /* rightshift */
1070 2, /* size (0 = byte, 1 = short, 2 = long) */
1071 16, /* bitsize */
1072 TRUE, /* pc_relative */
1073 0, /* bitpos */
1074 complain_overflow_signed, /* complain_on_overflow */
1075 _bfd_mips_elf_generic_reloc, /* special_function */
1076 "R_MICROMIPS_PC16_S1", /* name */
1077 TRUE, /* partial_inplace */
1078 0x0000ffff, /* src_mask */
1079 0x0000ffff, /* dst_mask */
1080 TRUE), /* pcrel_offset */
1081
1082 /* 16 bit call through global offset table. */
1083 HOWTO (R_MICROMIPS_CALL16, /* type */
1084 0, /* rightshift */
1085 2, /* size (0 = byte, 1 = short, 2 = long) */
1086 16, /* bitsize */
1087 FALSE, /* pc_relative */
1088 0, /* bitpos */
1089 complain_overflow_signed, /* complain_on_overflow */
1090 _bfd_mips_elf_generic_reloc, /* special_function */
1091 "R_MICROMIPS_CALL16", /* name */
1092 TRUE, /* partial_inplace */
1093 0x0000ffff, /* src_mask */
1094 0x0000ffff, /* dst_mask */
1095 FALSE), /* pcrel_offset */
1096
1097 EMPTY_HOWTO (143),
1098 EMPTY_HOWTO (144),
1099
1100 /* Displacement in the global offset table. */
1101 HOWTO (R_MICROMIPS_GOT_DISP, /* type */
1102 0, /* rightshift */
1103 2, /* size (0 = byte, 1 = short, 2 = long) */
1104 16, /* bitsize */
1105 FALSE, /* pc_relative */
1106 0, /* bitpos */
1107 complain_overflow_signed, /* complain_on_overflow */
1108 _bfd_mips_elf_generic_reloc, /* special_function */
1109 "R_MICROMIPS_GOT_DISP",/* name */
1110 TRUE, /* partial_inplace */
1111 0x0000ffff, /* src_mask */
1112 0x0000ffff, /* dst_mask */
1113 FALSE), /* pcrel_offset */
1114
1115 /* Displacement to page pointer in the global offset table. */
1116 HOWTO (R_MICROMIPS_GOT_PAGE, /* type */
1117 0, /* rightshift */
1118 2, /* size (0 = byte, 1 = short, 2 = long) */
1119 16, /* bitsize */
1120 FALSE, /* pc_relative */
1121 0, /* bitpos */
1122 complain_overflow_signed, /* complain_on_overflow */
1123 _bfd_mips_elf_generic_reloc, /* special_function */
1124 "R_MICROMIPS_GOT_PAGE",/* name */
1125 TRUE, /* partial_inplace */
1126 0x0000ffff, /* src_mask */
1127 0x0000ffff, /* dst_mask */
1128 FALSE), /* pcrel_offset */
1129
1130 /* Offset from page pointer in the global offset table. */
1131 HOWTO (R_MICROMIPS_GOT_OFST, /* type */
1132 0, /* rightshift */
1133 2, /* size (0 = byte, 1 = short, 2 = long) */
1134 16, /* bitsize */
1135 FALSE, /* pc_relative */
1136 0, /* bitpos */
1137 complain_overflow_signed, /* complain_on_overflow */
1138 _bfd_mips_elf_generic_reloc, /* special_function */
1139 "R_MICROMIPS_GOT_OFST",/* name */
1140 TRUE, /* partial_inplace */
1141 0x0000ffff, /* src_mask */
1142 0x0000ffff, /* dst_mask */
1143 FALSE), /* pcrel_offset */
1144
1145 /* High 16 bits of displacement in global offset table. */
1146 HOWTO (R_MICROMIPS_GOT_HI16, /* type */
1147 0, /* rightshift */
1148 2, /* size (0 = byte, 1 = short, 2 = long) */
1149 16, /* bitsize */
1150 FALSE, /* pc_relative */
1151 0, /* bitpos */
1152 complain_overflow_dont, /* complain_on_overflow */
1153 _bfd_mips_elf_generic_reloc, /* special_function */
1154 "R_MICROMIPS_GOT_HI16",/* name */
1155 TRUE, /* partial_inplace */
1156 0x0000ffff, /* src_mask */
1157 0x0000ffff, /* dst_mask */
1158 FALSE), /* pcrel_offset */
1159
1160 /* Low 16 bits of displacement in global offset table. */
1161 HOWTO (R_MICROMIPS_GOT_LO16, /* type */
1162 0, /* rightshift */
1163 2, /* size (0 = byte, 1 = short, 2 = long) */
1164 16, /* bitsize */
1165 FALSE, /* pc_relative */
1166 0, /* bitpos */
1167 complain_overflow_dont, /* complain_on_overflow */
1168 _bfd_mips_elf_generic_reloc, /* special_function */
1169 "R_MICROMIPS_GOT_LO16",/* name */
1170 TRUE, /* partial_inplace */
1171 0x0000ffff, /* src_mask */
1172 0x0000ffff, /* dst_mask */
1173 FALSE), /* pcrel_offset */
1174
1175 /* 64 bit subtraction. Used in the N32 ABI. */
1176 HOWTO (R_MICROMIPS_SUB, /* type */
1177 0, /* rightshift */
1178 4, /* size (0 = byte, 1 = short, 2 = long) */
1179 64, /* bitsize */
1180 FALSE, /* pc_relative */
1181 0, /* bitpos */
1182 complain_overflow_dont, /* complain_on_overflow */
1183 _bfd_mips_elf_generic_reloc, /* special_function */
1184 "R_MICROMIPS_SUB", /* name */
1185 TRUE, /* partial_inplace */
1186 MINUS_ONE, /* src_mask */
1187 MINUS_ONE, /* dst_mask */
1188 FALSE), /* pcrel_offset */
1189
1190 /* Get the higher value of a 64 bit addend. */
1191 HOWTO (R_MICROMIPS_HIGHER, /* type */
1192 0, /* rightshift */
1193 2, /* size (0 = byte, 1 = short, 2 = long) */
1194 16, /* bitsize */
1195 FALSE, /* pc_relative */
1196 0, /* bitpos */
1197 complain_overflow_dont, /* complain_on_overflow */
1198 _bfd_mips_elf_generic_reloc, /* special_function */
1199 "R_MICROMIPS_HIGHER", /* name */
1200 TRUE, /* partial_inplace */
1201 0x0000ffff, /* src_mask */
1202 0x0000ffff, /* dst_mask */
1203 FALSE), /* pcrel_offset */
1204
1205 /* Get the highest value of a 64 bit addend. */
1206 HOWTO (R_MICROMIPS_HIGHEST, /* type */
1207 0, /* rightshift */
1208 2, /* size (0 = byte, 1 = short, 2 = long) */
1209 16, /* bitsize */
1210 FALSE, /* pc_relative */
1211 0, /* bitpos */
1212 complain_overflow_dont, /* complain_on_overflow */
1213 _bfd_mips_elf_generic_reloc, /* special_function */
1214 "R_MICROMIPS_HIGHEST", /* name */
1215 TRUE, /* partial_inplace */
1216 0x0000ffff, /* src_mask */
1217 0x0000ffff, /* dst_mask */
1218 FALSE), /* pcrel_offset */
1219
1220 /* High 16 bits of displacement in global offset table. */
1221 HOWTO (R_MICROMIPS_CALL_HI16, /* type */
1222 0, /* rightshift */
1223 2, /* size (0 = byte, 1 = short, 2 = long) */
1224 16, /* bitsize */
1225 FALSE, /* pc_relative */
1226 0, /* bitpos */
1227 complain_overflow_dont, /* complain_on_overflow */
1228 _bfd_mips_elf_generic_reloc, /* special_function */
1229 "R_MICROMIPS_CALL_HI16",/* name */
1230 TRUE, /* partial_inplace */
1231 0x0000ffff, /* src_mask */
1232 0x0000ffff, /* dst_mask */
1233 FALSE), /* pcrel_offset */
1234
1235 /* Low 16 bits of displacement in global offset table. */
1236 HOWTO (R_MICROMIPS_CALL_LO16, /* type */
1237 0, /* rightshift */
1238 2, /* size (0 = byte, 1 = short, 2 = long) */
1239 16, /* bitsize */
1240 FALSE, /* pc_relative */
1241 0, /* bitpos */
1242 complain_overflow_dont, /* complain_on_overflow */
1243 _bfd_mips_elf_generic_reloc, /* special_function */
1244 "R_MICROMIPS_CALL_LO16",/* name */
1245 TRUE, /* partial_inplace */
1246 0x0000ffff, /* src_mask */
1247 0x0000ffff, /* dst_mask */
1248 FALSE), /* pcrel_offset */
1249
1250 /* Section displacement. */
1251 HOWTO (R_MICROMIPS_SCN_DISP, /* type */
1252 0, /* rightshift */
1253 2, /* size (0 = byte, 1 = short, 2 = long) */
1254 32, /* bitsize */
1255 FALSE, /* pc_relative */
1256 0, /* bitpos */
1257 complain_overflow_dont, /* complain_on_overflow */
1258 _bfd_mips_elf_generic_reloc, /* special_function */
1259 "R_MICROMIPS_SCN_DISP",/* name */
1260 TRUE, /* partial_inplace */
1261 0xffffffff, /* src_mask */
1262 0xffffffff, /* dst_mask */
1263 FALSE), /* pcrel_offset */
1264
1265 /* Protected jump conversion. This is an optimization hint. No
1266 relocation is required for correctness. */
1267 HOWTO (R_MICROMIPS_JALR, /* type */
1268 0, /* rightshift */
1269 2, /* size (0 = byte, 1 = short, 2 = long) */
1270 32, /* bitsize */
1271 FALSE, /* pc_relative */
1272 0, /* bitpos */
1273 complain_overflow_dont, /* complain_on_overflow */
1274 _bfd_mips_elf_generic_reloc, /* special_function */
1275 "R_MICROMIPS_JALR", /* name */
1276 FALSE, /* partial_inplace */
1277 0x00000000, /* src_mask */
1278 0x00000000, /* dst_mask */
1279 FALSE), /* pcrel_offset */
1280
1281 /* Low 16 bits of symbol value. Note that the high 16 bits of symbol values
1282 must be zero. This is used for relaxation. */
1283 HOWTO (R_MICROMIPS_HI0_LO16, /* type */
1284 0, /* rightshift */
1285 2, /* size (0 = byte, 1 = short, 2 = long) */
1286 16, /* bitsize */
1287 FALSE, /* pc_relative */
1288 0, /* bitpos */
1289 complain_overflow_dont, /* complain_on_overflow */
1290 _bfd_mips_elf_generic_reloc, /* special_function */
1291 "R_MICROMIPS_HI0_LO16",/* name */
1292 TRUE, /* partial_inplace */
1293 0x0000ffff, /* src_mask */
1294 0x0000ffff, /* dst_mask */
1295 FALSE), /* pcrel_offset */
1296
1297 EMPTY_HOWTO (158),
1298 EMPTY_HOWTO (159),
1299 EMPTY_HOWTO (160),
1300 EMPTY_HOWTO (161),
1301
1302 /* TLS general dynamic variable reference. */
1303 HOWTO (R_MICROMIPS_TLS_GD, /* type */
1304 0, /* rightshift */
1305 2, /* size (0 = byte, 1 = short, 2 = long) */
1306 16, /* bitsize */
1307 FALSE, /* pc_relative */
1308 0, /* bitpos */
1309 complain_overflow_signed, /* complain_on_overflow */
1310 _bfd_mips_elf_generic_reloc, /* special_function */
1311 "R_MICROMIPS_TLS_GD", /* name */
1312 TRUE, /* partial_inplace */
1313 0x0000ffff, /* src_mask */
1314 0x0000ffff, /* dst_mask */
1315 FALSE), /* pcrel_offset */
1316
1317 /* TLS local dynamic variable reference. */
1318 HOWTO (R_MICROMIPS_TLS_LDM, /* type */
1319 0, /* rightshift */
1320 2, /* size (0 = byte, 1 = short, 2 = long) */
1321 16, /* bitsize */
1322 FALSE, /* pc_relative */
1323 0, /* bitpos */
1324 complain_overflow_signed, /* complain_on_overflow */
1325 _bfd_mips_elf_generic_reloc, /* special_function */
1326 "R_MICROMIPS_TLS_LDM", /* name */
1327 TRUE, /* partial_inplace */
1328 0x0000ffff, /* src_mask */
1329 0x0000ffff, /* dst_mask */
1330 FALSE), /* pcrel_offset */
1331
1332 /* TLS local dynamic offset. */
1333 HOWTO (R_MICROMIPS_TLS_DTPREL_HI16, /* type */
1334 0, /* rightshift */
1335 2, /* size (0 = byte, 1 = short, 2 = long) */
1336 16, /* bitsize */
1337 FALSE, /* pc_relative */
1338 0, /* bitpos */
1339 complain_overflow_signed, /* complain_on_overflow */
1340 _bfd_mips_elf_generic_reloc, /* special_function */
1341 "R_MICROMIPS_TLS_DTPREL_HI16", /* name */
1342 TRUE, /* partial_inplace */
1343 0x0000ffff, /* src_mask */
1344 0x0000ffff, /* dst_mask */
1345 FALSE), /* pcrel_offset */
1346
1347 /* TLS local dynamic offset. */
1348 HOWTO (R_MICROMIPS_TLS_DTPREL_LO16, /* type */
1349 0, /* rightshift */
1350 2, /* size (0 = byte, 1 = short, 2 = long) */
1351 16, /* bitsize */
1352 FALSE, /* pc_relative */
1353 0, /* bitpos */
1354 complain_overflow_signed, /* complain_on_overflow */
1355 _bfd_mips_elf_generic_reloc, /* special_function */
1356 "R_MICROMIPS_TLS_DTPREL_LO16", /* name */
1357 TRUE, /* partial_inplace */
1358 0x0000ffff, /* src_mask */
1359 0x0000ffff, /* dst_mask */
1360 FALSE), /* pcrel_offset */
1361
1362 /* TLS thread pointer offset. */
1363 HOWTO (R_MICROMIPS_TLS_GOTTPREL, /* type */
1364 0, /* rightshift */
1365 2, /* size (0 = byte, 1 = short, 2 = long) */
1366 16, /* bitsize */
1367 FALSE, /* pc_relative */
1368 0, /* bitpos */
1369 complain_overflow_signed, /* complain_on_overflow */
1370 _bfd_mips_elf_generic_reloc, /* special_function */
1371 "R_MICROMIPS_TLS_GOTTPREL", /* name */
1372 TRUE, /* partial_inplace */
1373 0x0000ffff, /* src_mask */
1374 0x0000ffff, /* dst_mask */
1375 FALSE), /* pcrel_offset */
1376
1377 EMPTY_HOWTO (167),
1378 EMPTY_HOWTO (168),
1379
1380 /* TLS thread pointer offset. */
1381 HOWTO (R_MICROMIPS_TLS_TPREL_HI16, /* type */
1382 0, /* rightshift */
1383 2, /* size (0 = byte, 1 = short, 2 = long) */
1384 16, /* bitsize */
1385 FALSE, /* pc_relative */
1386 0, /* bitpos */
1387 complain_overflow_signed, /* complain_on_overflow */
1388 _bfd_mips_elf_generic_reloc, /* special_function */
1389 "R_MICROMIPS_TLS_TPREL_HI16", /* name */
1390 TRUE, /* partial_inplace */
1391 0x0000ffff, /* src_mask */
1392 0x0000ffff, /* dst_mask */
1393 FALSE), /* pcrel_offset */
1394
1395 /* TLS thread pointer offset. */
1396 HOWTO (R_MICROMIPS_TLS_TPREL_LO16, /* type */
1397 0, /* rightshift */
1398 2, /* size (0 = byte, 1 = short, 2 = long) */
1399 16, /* bitsize */
1400 FALSE, /* pc_relative */
1401 0, /* bitpos */
1402 complain_overflow_signed, /* complain_on_overflow */
1403 _bfd_mips_elf_generic_reloc, /* special_function */
1404 "R_MICROMIPS_TLS_TPREL_LO16", /* name */
1405 TRUE, /* partial_inplace */
1406 0x0000ffff, /* src_mask */
1407 0x0000ffff, /* dst_mask */
1408 FALSE), /* pcrel_offset */
1409
1410 EMPTY_HOWTO (171),
1411
1412 /* GP- and PC-relative relocations. */
1413 HOWTO (R_MICROMIPS_GPREL7_S2, /* type */
1414 2, /* rightshift */
1415 1, /* size (0 = byte, 1 = short, 2 = long) */
1416 7, /* bitsize */
1417 FALSE, /* pc_relative */
1418 0, /* bitpos */
1419 complain_overflow_signed, /* complain_on_overflow */
1420 _bfd_mips_elf32_gprel16_reloc, /* special_function */
1421 "R_MICROMIPS_GPREL7_S2", /* name */
1422 TRUE, /* partial_inplace */
1423 0x0000007f, /* src_mask */
1424 0x0000007f, /* dst_mask */
1425 FALSE), /* pcrel_offset */
1426
1427 HOWTO (R_MICROMIPS_PC23_S2, /* type */
1428 2, /* rightshift */
1429 2, /* size (0 = byte, 1 = short, 2 = long) */
1430 23, /* bitsize */
1431 TRUE, /* pc_relative */
1432 0, /* bitpos */
1433 complain_overflow_signed, /* complain_on_overflow */
1434 _bfd_mips_elf_generic_reloc, /* special_function */
1435 "R_MICROMIPS_PC23_S2", /* name */
1436 TRUE, /* partial_inplace */
1437 0x007fffff, /* src_mask */
1438 0x007fffff, /* dst_mask */
1439 TRUE), /* pcrel_offset */
1440};
1441
c6e90b02
TS
1442/* 16 bit offset for pc-relative branches. */
1443static reloc_howto_type elf_mips_gnu_rel16_s2 =
1444 HOWTO (R_MIPS_GNU_REL16_S2, /* type */
1445 2, /* rightshift */
252b5132
RH
1446 2, /* size (0 = byte, 1 = short, 2 = long) */
1447 16, /* bitsize */
b34976b6 1448 TRUE, /* pc_relative */
252b5132
RH
1449 0, /* bitpos */
1450 complain_overflow_signed, /* complain_on_overflow */
30ac9238 1451 _bfd_mips_elf_generic_reloc, /* special_function */
c6e90b02 1452 "R_MIPS_GNU_REL16_S2", /* name */
b34976b6 1453 TRUE, /* partial_inplace */
c6e90b02
TS
1454 0xffff, /* src_mask */
1455 0xffff, /* dst_mask */
b34976b6 1456 TRUE); /* pcrel_offset */
252b5132 1457
092dcd75
CD
1458/* 32 bit pc-relative. This was a GNU extension used by embedded-PIC.
1459 It was co-opted by mips-linux for exception-handling data. It is no
1460 longer used, but should continue to be supported by the linker for
1461 backward compatibility. (GCC stopped using it in May, 2004.) */
1462static reloc_howto_type elf_mips_gnu_pcrel32 =
1463 HOWTO (R_MIPS_PC32, /* type */
1464 0, /* rightshift */
1465 2, /* size (0 = byte, 1 = short, 2 = long) */
1466 32, /* bitsize */
1467 TRUE, /* pc_relative */
1468 0, /* bitpos */
1469 complain_overflow_signed, /* complain_on_overflow */
1470 _bfd_mips_elf_generic_reloc, /* special_function */
1471 "R_MIPS_PC32", /* name */
1472 TRUE, /* partial_inplace */
1473 0xffffffff, /* src_mask */
1474 0xffffffff, /* dst_mask */
1475 TRUE); /* pcrel_offset */
1476
c6e90b02
TS
1477/* GNU extension to record C++ vtable hierarchy */
1478static reloc_howto_type elf_mips_gnu_vtinherit_howto =
1479 HOWTO (R_MIPS_GNU_VTINHERIT, /* type */
252b5132
RH
1480 0, /* rightshift */
1481 2, /* size (0 = byte, 1 = short, 2 = long) */
c6e90b02 1482 0, /* bitsize */
b34976b6 1483 FALSE, /* pc_relative */
252b5132 1484 0, /* bitpos */
c6e90b02
TS
1485 complain_overflow_dont, /* complain_on_overflow */
1486 NULL, /* special_function */
1487 "R_MIPS_GNU_VTINHERIT", /* name */
b34976b6 1488 FALSE, /* partial_inplace */
d75bc93d 1489 0, /* src_mask */
c6e90b02 1490 0, /* dst_mask */
b34976b6 1491 FALSE); /* pcrel_offset */
252b5132 1492
c6e90b02
TS
1493/* GNU extension to record C++ vtable member usage */
1494static reloc_howto_type elf_mips_gnu_vtentry_howto =
1495 HOWTO (R_MIPS_GNU_VTENTRY, /* type */
252b5132
RH
1496 0, /* rightshift */
1497 2, /* size (0 = byte, 1 = short, 2 = long) */
c6e90b02 1498 0, /* bitsize */
b34976b6 1499 FALSE, /* pc_relative */
252b5132
RH
1500 0, /* bitpos */
1501 complain_overflow_dont, /* complain_on_overflow */
c6e90b02
TS
1502 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1503 "R_MIPS_GNU_VTENTRY", /* name */
b34976b6 1504 FALSE, /* partial_inplace */
d75bc93d 1505 0, /* src_mask */
c6e90b02 1506 0, /* dst_mask */
b34976b6 1507 FALSE); /* pcrel_offset */
252b5132 1508
861fb55a
DJ
1509/* Originally a VxWorks extension, but now used for other systems too. */
1510static reloc_howto_type elf_mips_copy_howto =
1511 HOWTO (R_MIPS_COPY, /* type */
1512 0, /* rightshift */
1513 0, /* this one is variable size */
1514 0, /* bitsize */
1515 FALSE, /* pc_relative */
1516 0, /* bitpos */
1517 complain_overflow_bitfield, /* complain_on_overflow */
1518 bfd_elf_generic_reloc, /* special_function */
1519 "R_MIPS_COPY", /* name */
1520 FALSE, /* partial_inplace */
1521 0x0, /* src_mask */
1522 0x0, /* dst_mask */
1523 FALSE); /* pcrel_offset */
1524
1525/* Originally a VxWorks extension, but now used for other systems too. */
1526static reloc_howto_type elf_mips_jump_slot_howto =
1527 HOWTO (R_MIPS_JUMP_SLOT, /* type */
1528 0, /* rightshift */
1529 2, /* size (0 = byte, 1 = short, 2 = long) */
1530 32, /* bitsize */
1531 FALSE, /* pc_relative */
1532 0, /* bitpos */
1533 complain_overflow_bitfield, /* complain_on_overflow */
1534 bfd_elf_generic_reloc, /* special_function */
1535 "R_MIPS_JUMP_SLOT", /* name */
1536 FALSE, /* partial_inplace */
1537 0x0, /* src_mask */
1538 0x0, /* dst_mask */
1539 FALSE); /* pcrel_offset */
1540
b34976b6 1541/* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
c6e90b02 1542 dangerous relocation. */
252b5132 1543
b34976b6 1544static bfd_boolean
11a2be4d 1545mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
252b5132 1546{
c6e90b02
TS
1547 unsigned int count;
1548 asymbol **sym;
1549 unsigned int i;
e92d460e 1550
c6e90b02
TS
1551 /* If we've already figured out what GP will be, just return it. */
1552 *pgp = _bfd_get_gp_value (output_bfd);
1553 if (*pgp)
b34976b6 1554 return TRUE;
c6e90b02
TS
1555
1556 count = bfd_get_symcount (output_bfd);
1557 sym = bfd_get_outsymbols (output_bfd);
252b5132 1558
c6e90b02
TS
1559 /* The linker script will have created a symbol named `_gp' with the
1560 appropriate value. */
11a2be4d 1561 if (sym == NULL)
c6e90b02
TS
1562 i = count;
1563 else
252b5132 1564 {
c6e90b02
TS
1565 for (i = 0; i < count; i++, sym++)
1566 {
1567 register const char *name;
1568
1569 name = bfd_asymbol_name (*sym);
1570 if (*name == '_' && strcmp (name, "_gp") == 0)
1571 {
1572 *pgp = bfd_asymbol_value (*sym);
1573 _bfd_set_gp_value (output_bfd, *pgp);
1574 break;
1575 }
1576 }
252b5132
RH
1577 }
1578
c6e90b02 1579 if (i >= count)
252b5132 1580 {
c6e90b02
TS
1581 /* Only get the error once. */
1582 *pgp = 4;
1583 _bfd_set_gp_value (output_bfd, *pgp);
b34976b6 1584 return FALSE;
252b5132
RH
1585 }
1586
b34976b6 1587 return TRUE;
252b5132
RH
1588}
1589
c6e90b02
TS
1590/* We have to figure out the gp value, so that we can adjust the
1591 symbol value correctly. We look up the symbol _gp in the output
1592 BFD. If we can't find it, we're stuck. We cache it in the ELF
1593 target data. We don't need to adjust the symbol value for an
1049f94e 1594 external symbol if we are producing relocatable output. */
252b5132 1595
c6e90b02 1596static bfd_reloc_status_type
11a2be4d
RS
1597mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
1598 char **error_message, bfd_vma *pgp)
252b5132 1599{
c6e90b02 1600 if (bfd_is_und_section (symbol->section)
1049f94e 1601 && ! relocatable)
252b5132 1602 {
c6e90b02
TS
1603 *pgp = 0;
1604 return bfd_reloc_undefined;
252b5132
RH
1605 }
1606
c6e90b02
TS
1607 *pgp = _bfd_get_gp_value (output_bfd);
1608 if (*pgp == 0
1049f94e 1609 && (! relocatable
c6e90b02 1610 || (symbol->flags & BSF_SECTION_SYM) != 0))
252b5132 1611 {
1049f94e 1612 if (relocatable)
252b5132 1613 {
c6e90b02 1614 /* Make up a value. */
453f5985 1615 *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
c6e90b02 1616 _bfd_set_gp_value (output_bfd, *pgp);
252b5132 1617 }
c6e90b02 1618 else if (!mips_elf_assign_gp (output_bfd, pgp))
252b5132 1619 {
c6e90b02
TS
1620 *error_message =
1621 (char *) _("GP relative relocation when _gp not defined");
1622 return bfd_reloc_dangerous;
252b5132 1623 }
252b5132
RH
1624 }
1625
c6e90b02
TS
1626 return bfd_reloc_ok;
1627}
252b5132 1628
c6e90b02
TS
1629/* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must
1630 become the offset from the gp register. This function also handles
1631 R_MIPS_LITERAL relocations, although those can be handled more
1632 cleverly because the entries in the .lit8 and .lit4 sections can be
1633 merged. */
252b5132 1634
c6e90b02 1635bfd_reloc_status_type
11a2be4d
RS
1636_bfd_mips_elf32_gprel16_reloc (bfd *abfd, arelent *reloc_entry,
1637 asymbol *symbol, void *data,
1638 asection *input_section, bfd *output_bfd,
1639 char **error_message)
c6e90b02 1640{
1049f94e 1641 bfd_boolean relocatable;
c6e90b02 1642 bfd_reloc_status_type ret;
df58fc94 1643 bfd_byte *location;
c6e90b02 1644 bfd_vma gp;
252b5132 1645
df58fc94
RS
1646 /* R_MIPS_LITERAL/R_MICROMIPS_LITERAL relocations are defined for local
1647 symbols only. */
1648 if (literal_reloc_p (reloc_entry->howto->type)
254f0426
MR
1649 && output_bfd != NULL
1650 && (symbol->flags & BSF_SECTION_SYM) == 0
1651 && (symbol->flags & BSF_LOCAL) != 0)
1652 {
1653 *error_message = (char *)
1654 _("literal relocation occurs for an external symbol");
1655 return bfd_reloc_outofrange;
1656 }
1657
11a2be4d 1658 if (output_bfd != NULL)
1049f94e 1659 relocatable = TRUE;
c6e90b02
TS
1660 else
1661 {
1049f94e 1662 relocatable = FALSE;
c6e90b02
TS
1663 output_bfd = symbol->section->output_section->owner;
1664 }
252b5132 1665
1049f94e 1666 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
c6e90b02
TS
1667 &gp);
1668 if (ret != bfd_reloc_ok)
1669 return ret;
252b5132 1670
df58fc94
RS
1671 location = (bfd_byte *) data + reloc_entry->address;
1672 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
1673 location);
1674 ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1675 input_section, relocatable,
1676 data, gp);
1677 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
1678 location);
1679
1680 return ret;
c6e90b02 1681}
252b5132 1682
cb7394f2
TS
1683/* Do a R_MIPS_GPREL32 relocation. This is a 32 bit value which must
1684 become the offset from the gp register. */
252b5132 1685
c6e90b02 1686static bfd_reloc_status_type
11a2be4d
RS
1687mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1688 void *data, asection *input_section, bfd *output_bfd,
1689 char **error_message)
c6e90b02 1690{
1049f94e 1691 bfd_boolean relocatable;
c6e90b02
TS
1692 bfd_reloc_status_type ret;
1693 bfd_vma gp;
252b5132 1694
765f2ef6
MR
1695 /* R_MIPS_GPREL32 relocations are defined for local symbols only. */
1696 if (output_bfd != NULL
1697 && (symbol->flags & BSF_SECTION_SYM) == 0
1698 && (symbol->flags & BSF_LOCAL) != 0)
1699 {
1700 *error_message = (char *)
1701 _("32bits gp relative relocation occurs for an external symbol");
1702 return bfd_reloc_outofrange;
1703 }
1704
11a2be4d 1705 if (output_bfd != NULL)
1049f94e 1706 relocatable = TRUE;
c6e90b02
TS
1707 else
1708 {
1049f94e 1709 relocatable = FALSE;
c6e90b02 1710 output_bfd = symbol->section->output_section->owner;
c6e90b02 1711 }
252b5132 1712
1049f94e 1713 ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
a7ebbfdf
TS
1714 error_message, &gp);
1715 if (ret != bfd_reloc_ok)
1716 return ret;
1717
c6e90b02 1718 return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
1049f94e 1719 relocatable, data, gp);
c6e90b02 1720}
252b5132 1721
c6e90b02 1722static bfd_reloc_status_type
11a2be4d
RS
1723gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
1724 asection *input_section, bfd_boolean relocatable,
1725 void *data, bfd_vma gp)
c6e90b02
TS
1726{
1727 bfd_vma relocation;
a7ebbfdf 1728 bfd_vma val;
252b5132 1729
c6e90b02
TS
1730 if (bfd_is_com_section (symbol->section))
1731 relocation = 0;
1732 else
1733 relocation = symbol->value;
252b5132 1734
c6e90b02
TS
1735 relocation += symbol->section->output_section->vma;
1736 relocation += symbol->section->output_offset;
252b5132 1737
07515404 1738 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
c6e90b02 1739 return bfd_reloc_outofrange;
252b5132 1740
c6e90b02 1741 /* Set val to the offset into the section or symbol. */
a7ebbfdf
TS
1742 val = reloc_entry->addend;
1743
1744 if (reloc_entry->howto->partial_inplace)
1745 val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
252b5132 1746
c6e90b02 1747 /* Adjust val for the final section location and GP value. If we
1049f94e 1748 are producing relocatable output, we don't want to do this for
c6e90b02 1749 an external symbol. */
1049f94e 1750 if (! relocatable
c6e90b02
TS
1751 || (symbol->flags & BSF_SECTION_SYM) != 0)
1752 val += relocation - gp;
252b5132 1753
a7ebbfdf
TS
1754 if (reloc_entry->howto->partial_inplace)
1755 bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
1756 else
1757 reloc_entry->addend = val;
c6142e5d 1758
1049f94e 1759 if (relocatable)
c6e90b02 1760 reloc_entry->address += input_section->output_offset;
252b5132 1761
c6e90b02 1762 return bfd_reloc_ok;
252b5132
RH
1763}
1764
c6e90b02
TS
1765/* Handle a 64 bit reloc in a 32 bit MIPS ELF file. These are
1766 generated when addresses are 64 bits. The upper 32 bits are a simple
1767 sign extension. */
7403cb63 1768
c6e90b02 1769static bfd_reloc_status_type
30ac9238
RS
1770mips32_64bit_reloc (bfd *abfd, arelent *reloc_entry,
1771 asymbol *symbol ATTRIBUTE_UNUSED,
1772 void *data, asection *input_section,
1773 bfd *output_bfd, char **error_message)
7403cb63 1774{
c6e90b02
TS
1775 bfd_reloc_status_type r;
1776 arelent reloc32;
1777 unsigned long val;
1778 bfd_size_type addr;
7403cb63 1779
c6e90b02
TS
1780 /* Do a normal 32 bit relocation on the lower 32 bits. */
1781 reloc32 = *reloc_entry;
1782 if (bfd_big_endian (abfd))
1783 reloc32.address += 4;
1784 reloc32.howto = &elf_mips_howto_table_rel[R_MIPS_32];
1785 r = bfd_perform_relocation (abfd, &reloc32, data, input_section,
1786 output_bfd, error_message);
be3ccd9c 1787
c6e90b02
TS
1788 /* Sign extend into the upper 32 bits. */
1789 val = bfd_get_32 (abfd, (bfd_byte *) data + reloc32.address);
1790 if ((val & 0x80000000) != 0)
1791 val = 0xffffffff;
1792 else
1793 val = 0;
1794 addr = reloc_entry->address;
1795 if (bfd_little_endian (abfd))
1796 addr += 4;
11a2be4d 1797 bfd_put_32 (abfd, val, (bfd_byte *) data + addr);
c6e90b02
TS
1798
1799 return r;
7403cb63
MM
1800}
1801
c6e90b02 1802/* Handle a mips16 GP relative reloc. */
252b5132 1803
c6e90b02 1804static bfd_reloc_status_type
11a2be4d
RS
1805mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1806 void *data, asection *input_section, bfd *output_bfd,
1807 char **error_message)
c6e90b02 1808{
1049f94e 1809 bfd_boolean relocatable;
c6e90b02 1810 bfd_reloc_status_type ret;
d6f16593 1811 bfd_byte *location;
c6e90b02 1812 bfd_vma gp;
252b5132 1813
a7ebbfdf
TS
1814 /* If we're relocating, and this is an external symbol, we don't want
1815 to change anything. */
c6e90b02
TS
1816 if (output_bfd != NULL
1817 && (symbol->flags & BSF_SECTION_SYM) == 0
a7ebbfdf 1818 && (symbol->flags & BSF_LOCAL) != 0)
c6e90b02
TS
1819 {
1820 reloc_entry->address += input_section->output_offset;
1821 return bfd_reloc_ok;
1822 }
252b5132 1823
c6e90b02 1824 if (output_bfd != NULL)
1049f94e 1825 relocatable = TRUE;
c6e90b02
TS
1826 else
1827 {
1049f94e 1828 relocatable = FALSE;
c6e90b02 1829 output_bfd = symbol->section->output_section->owner;
252b5132
RH
1830 }
1831
1049f94e 1832 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
c6e90b02
TS
1833 &gp);
1834 if (ret != bfd_reloc_ok)
1835 return ret;
252b5132 1836
d6f16593 1837 location = (bfd_byte *) data + reloc_entry->address;
df58fc94
RS
1838 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
1839 location);
d6f16593
MR
1840 ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1841 input_section, relocatable,
1842 data, gp);
df58fc94
RS
1843 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
1844 location);
a7ebbfdf 1845
d6f16593 1846 return ret;
c6e90b02 1847}
7403cb63 1848
c6e90b02 1849/* A mapping from BFD reloc types to MIPS ELF reloc types. */
252b5132 1850
c6e90b02 1851struct elf_reloc_map {
cb7394f2
TS
1852 bfd_reloc_code_real_type bfd_val;
1853 enum elf_mips_reloc_type elf_val;
c6e90b02 1854};
252b5132 1855
c6e90b02
TS
1856static const struct elf_reloc_map mips_reloc_map[] =
1857{
28458e7e 1858 { BFD_RELOC_NONE, R_MIPS_NONE },
c6e90b02
TS
1859 { BFD_RELOC_16, R_MIPS_16 },
1860 { BFD_RELOC_32, R_MIPS_32 },
cb7394f2 1861 /* There is no BFD reloc for R_MIPS_REL32. */
c6e90b02
TS
1862 { BFD_RELOC_64, R_MIPS_64 },
1863 { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
1864 { BFD_RELOC_HI16_S, R_MIPS_HI16 },
1865 { BFD_RELOC_LO16, R_MIPS_LO16 },
1866 { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
1867 { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
1868 { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
bad36eac 1869 { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
c6e90b02
TS
1870 { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
1871 { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
1872 { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
1873 { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
1874 { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
1875 { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
1876 { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
1877 { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
1878 { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
0f20cc35 1879 { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
cd8d5a82 1880 { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
0f20cc35
DJ
1881 { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
1882 { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
1883 { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
1884 { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
1885 { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
1886 { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
1887 { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
1888 { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
1889 { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
1890 { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
1891 { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
1892 { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
1893 { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
c6e90b02 1894};
252b5132 1895
d6f16593
MR
1896static const struct elf_reloc_map mips16_reloc_map[] =
1897{
1898 { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
1899 { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
738e5348
RS
1900 { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
1901 { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
d6f16593
MR
1902 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
1903 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
d0f13682
CLT
1904 { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
1905 { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
1906 { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
1907 R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
1908 { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
1909 R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
1910 { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
1911 { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
1912 { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
d6f16593
MR
1913};
1914
df58fc94
RS
1915static const struct elf_reloc_map micromips_reloc_map[] =
1916{
1917 { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
1918 { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
1919 { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
1920 { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
1921 { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
1922 { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
1923 { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
1924 { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
1925 { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
1926 { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
1927 { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
1928 { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
1929 { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
1930 { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
1931 { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
1932 { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
1933 { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
1934 { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
1935 { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
1936 { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
1937 { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
1938 { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
1939 /* There is no BFD reloc for R_MICROMIPS_HI0_LO16. */
1940 { BFD_RELOC_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_GD - R_MICROMIPS_min },
1941 { BFD_RELOC_MICROMIPS_TLS_LDM, R_MICROMIPS_TLS_LDM - R_MICROMIPS_min },
1942 { BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16,
1943 R_MICROMIPS_TLS_DTPREL_HI16 - R_MICROMIPS_min },
1944 { BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16,
1945 R_MICROMIPS_TLS_DTPREL_LO16 - R_MICROMIPS_min },
1946 { BFD_RELOC_MICROMIPS_TLS_GOTTPREL,
1947 R_MICROMIPS_TLS_GOTTPREL - R_MICROMIPS_min },
1948 { BFD_RELOC_MICROMIPS_TLS_TPREL_HI16,
1949 R_MICROMIPS_TLS_TPREL_HI16 - R_MICROMIPS_min },
1950 { BFD_RELOC_MICROMIPS_TLS_TPREL_LO16,
1951 R_MICROMIPS_TLS_TPREL_LO16 - R_MICROMIPS_min },
1952 /* There is no BFD reloc for R_MICROMIPS_GPREL7_S2. */
1953 /* There is no BFD reloc for R_MICROMIPS_PC23_S2. */
1954};
1955
c6e90b02 1956/* Given a BFD reloc type, return a howto structure. */
252b5132 1957
c6e90b02 1958static reloc_howto_type *
11a2be4d 1959bfd_elf32_bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
252b5132 1960{
c6e90b02 1961 unsigned int i;
cb7394f2 1962 reloc_howto_type *howto_table = elf_mips_howto_table_rel;
d6f16593 1963 reloc_howto_type *howto16_table = elf_mips16_howto_table_rel;
df58fc94 1964 reloc_howto_type *howto_micromips_table = elf_micromips_howto_table_rel;
252b5132 1965
cb7394f2
TS
1966 for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
1967 i++)
252b5132 1968 {
cb7394f2
TS
1969 if (mips_reloc_map[i].bfd_val == code)
1970 return &howto_table[(int) mips_reloc_map[i].elf_val];
252b5132
RH
1971 }
1972
d6f16593
MR
1973 for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
1974 i++)
1975 {
1976 if (mips16_reloc_map[i].bfd_val == code)
1977 return &howto16_table[(int) mips16_reloc_map[i].elf_val];
1978 }
1979
df58fc94
RS
1980 for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
1981 i++)
1982 {
1983 if (micromips_reloc_map[i].bfd_val == code)
1984 return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
1985 }
1986
c6e90b02 1987 switch (code)
252b5132 1988 {
c6e90b02
TS
1989 default:
1990 bfd_set_error (bfd_error_bad_value);
1991 return NULL;
252b5132 1992
c6e90b02
TS
1993 case BFD_RELOC_CTOR:
1994 /* We need to handle BFD_RELOC_CTOR specially.
1995 Select the right relocation (R_MIPS_32 or R_MIPS_64) based on the
69931e60
AO
1996 size of addresses of the ABI. */
1997 if ((elf_elfheader (abfd)->e_flags & (E_MIPS_ABI_O64
1998 | E_MIPS_ABI_EABI64)) != 0)
c6e90b02 1999 return &elf_mips_ctor64_howto;
69931e60
AO
2000 else
2001 return &howto_table[(int) R_MIPS_32];
252b5132 2002
c6e90b02
TS
2003 case BFD_RELOC_VTABLE_INHERIT:
2004 return &elf_mips_gnu_vtinherit_howto;
2005 case BFD_RELOC_VTABLE_ENTRY:
2006 return &elf_mips_gnu_vtentry_howto;
092dcd75
CD
2007 case BFD_RELOC_32_PCREL:
2008 return &elf_mips_gnu_pcrel32;
861fb55a
DJ
2009 case BFD_RELOC_MIPS_COPY:
2010 return &elf_mips_copy_howto;
2011 case BFD_RELOC_MIPS_JUMP_SLOT:
2012 return &elf_mips_jump_slot_howto;
c6e90b02
TS
2013 }
2014}
252b5132 2015
157090f7
AM
2016static reloc_howto_type *
2017bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2018 const char *r_name)
2019{
2020 unsigned int i;
2021
2022 for (i = 0;
2023 i < (sizeof (elf_mips_howto_table_rel)
2024 / sizeof (elf_mips_howto_table_rel[0]));
2025 i++)
2026 if (elf_mips_howto_table_rel[i].name != NULL
2027 && strcasecmp (elf_mips_howto_table_rel[i].name, r_name) == 0)
2028 return &elf_mips_howto_table_rel[i];
2029
2030 for (i = 0;
2031 i < (sizeof (elf_mips16_howto_table_rel)
2032 / sizeof (elf_mips16_howto_table_rel[0]));
2033 i++)
2034 if (elf_mips16_howto_table_rel[i].name != NULL
2035 && strcasecmp (elf_mips16_howto_table_rel[i].name, r_name) == 0)
2036 return &elf_mips16_howto_table_rel[i];
2037
df58fc94
RS
2038 for (i = 0;
2039 i < (sizeof (elf_micromips_howto_table_rel)
2040 / sizeof (elf_micromips_howto_table_rel[0]));
2041 i++)
2042 if (elf_micromips_howto_table_rel[i].name != NULL
2043 && strcasecmp (elf_micromips_howto_table_rel[i].name, r_name) == 0)
2044 return &elf_micromips_howto_table_rel[i];
2045
157090f7
AM
2046 if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
2047 return &elf_mips_gnu_pcrel32;
2048 if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
2049 return &elf_mips_gnu_rel16_s2;
2050 if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
2051 return &elf_mips_gnu_vtinherit_howto;
2052 if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
2053 return &elf_mips_gnu_vtentry_howto;
861fb55a
DJ
2054 if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
2055 return &elf_mips_copy_howto;
2056 if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
2057 return &elf_mips_jump_slot_howto;
157090f7
AM
2058
2059 return NULL;
2060}
2061
947216bf 2062/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
252b5132 2063
c6e90b02 2064static reloc_howto_type *
11a2be4d
RS
2065mips_elf32_rtype_to_howto (unsigned int r_type,
2066 bfd_boolean rela_p ATTRIBUTE_UNUSED)
c6e90b02
TS
2067{
2068 switch (r_type)
2069 {
c6e90b02
TS
2070 case R_MIPS_GNU_VTINHERIT:
2071 return &elf_mips_gnu_vtinherit_howto;
c6e90b02
TS
2072 case R_MIPS_GNU_VTENTRY:
2073 return &elf_mips_gnu_vtentry_howto;
c6e90b02
TS
2074 case R_MIPS_GNU_REL16_S2:
2075 return &elf_mips_gnu_rel16_s2;
092dcd75
CD
2076 case R_MIPS_PC32:
2077 return &elf_mips_gnu_pcrel32;
861fb55a
DJ
2078 case R_MIPS_COPY:
2079 return &elf_mips_copy_howto;
2080 case R_MIPS_JUMP_SLOT:
2081 return &elf_mips_jump_slot_howto;
c6e90b02 2082 default:
df58fc94
RS
2083 if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
2084 return &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min];
d6f16593
MR
2085 if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
2086 return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
c6e90b02
TS
2087 BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
2088 return &elf_mips_howto_table_rel[r_type];
2089 }
2090}
252b5132 2091
947216bf 2092/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
252b5132 2093
c6e90b02 2094static void
11a2be4d 2095mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
c6e90b02 2096{
0a44bf69 2097 const struct elf_backend_data *bed;
c6e90b02 2098 unsigned int r_type;
252b5132 2099
c6e90b02 2100 r_type = ELF32_R_TYPE (dst->r_info);
0a44bf69
RS
2101 bed = get_elf_backend_data (abfd);
2102 cache_ptr->howto = bed->elf_backend_mips_rtype_to_howto (r_type, FALSE);
252b5132 2103
c6e90b02
TS
2104 /* The addend for a GPREL16 or LITERAL relocation comes from the GP
2105 value for the object file. We get the addend now, rather than
2106 when we do the relocation, because the symbol manipulations done
2107 by the linker may cause us to lose track of the input BFD. */
2108 if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
df58fc94 2109 && (gprel16_reloc_p (r_type) || literal_reloc_p (r_type)))
c6e90b02
TS
2110 cache_ptr->addend = elf_gp (abfd);
2111}
5499724a 2112
947216bf 2113/* Given a MIPS Elf_Internal_Rela, fill in an arelent structure. */
252b5132 2114
c6e90b02 2115static void
11a2be4d 2116mips_info_to_howto_rela (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
c6e90b02 2117{
947216bf 2118 mips_info_to_howto_rel (abfd, cache_ptr, dst);
252b5132 2119
c6e90b02 2120 /* If we ever need to do any extra processing with dst->r_addend
947216bf 2121 (the field omitted in an Elf_Internal_Rel) we can do it here. */
c6e90b02
TS
2122}
2123\f
2124/* Determine whether a symbol is global for the purposes of splitting
2125 the symbol table into global symbols and local symbols. At least
2126 on Irix 5, this split must be between section symbols and all other
2127 symbols. On most ELF targets the split is between static symbols
2128 and externally visible symbols. */
252b5132 2129
b34976b6 2130static bfd_boolean
11a2be4d 2131mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
c6e90b02
TS
2132{
2133 if (SGI_COMPAT (abfd))
2134 return (sym->flags & BSF_SECTION_SYM) == 0;
2135 else
e47bf690 2136 return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
c6e90b02
TS
2137 || bfd_is_und_section (bfd_get_section (sym))
2138 || bfd_is_com_section (bfd_get_section (sym)));
2139}
2140\f
2141/* Set the right machine number for a MIPS ELF file. */
7403cb63 2142
b34976b6 2143static bfd_boolean
11a2be4d 2144mips_elf32_object_p (bfd *abfd)
c6e90b02
TS
2145{
2146 unsigned long mach;
103186c6 2147
c6e90b02
TS
2148 /* Irix 5 and 6 are broken. Object file symbol tables are not always
2149 sorted correctly such that local symbols precede global symbols,
2150 and the sh_info field in the symbol table is not always right. */
2151 if (SGI_COMPAT (abfd))
b34976b6 2152 elf_bad_symtab (abfd) = TRUE;
103186c6 2153
8a397dad 2154 if (ABI_N32_P (abfd))
b34976b6 2155 return FALSE;
8a397dad 2156
c6e90b02
TS
2157 mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
2158 bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
252b5132 2159
b34976b6 2160 return TRUE;
c6e90b02
TS
2161}
2162\f
2163/* MIPS ELF local labels start with '$', not 'L'. */
252b5132 2164
b34976b6 2165static bfd_boolean
11a2be4d 2166mips_elf_is_local_label_name (bfd *abfd, const char *name)
c6e90b02
TS
2167{
2168 if (name[0] == '$')
b34976b6 2169 return TRUE;
252b5132 2170
c6e90b02
TS
2171 /* On Irix 6, the labels go back to starting with '.', so we accept
2172 the generic ELF local label syntax as well. */
2173 return _bfd_elf_is_local_label_name (abfd, name);
252b5132
RH
2174}
2175\f
c6e90b02 2176/* Support for core dump NOTE sections. */
b34976b6 2177static bfd_boolean
11a2be4d 2178elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
bb0082d6
AM
2179{
2180 int offset;
eea6121a 2181 unsigned int size;
bb0082d6
AM
2182
2183 switch (note->descsz)
2184 {
2185 default:
b34976b6 2186 return FALSE;
bb0082d6
AM
2187
2188 case 256: /* Linux/MIPS */
2189 /* pr_cursig */
2190 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2191
2192 /* pr_pid */
261b8d08 2193 elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
bb0082d6
AM
2194
2195 /* pr_reg */
2196 offset = 72;
eea6121a 2197 size = 180;
bb0082d6
AM
2198
2199 break;
2200 }
2201
2202 /* Make a ".reg/999" section. */
936e320b 2203 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 2204 size, note->descpos + offset);
bb0082d6
AM
2205}
2206
b34976b6 2207static bfd_boolean
11a2be4d 2208elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
bb0082d6
AM
2209{
2210 switch (note->descsz)
2211 {
2212 default:
b34976b6 2213 return FALSE;
bb0082d6
AM
2214
2215 case 128: /* Linux/MIPS elf_prpsinfo */
2216 elf_tdata (abfd)->core_program
2217 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
2218 elf_tdata (abfd)->core_command
2219 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
2220 }
2221
2222 /* Note that for some reason, a spurious space is tacked
2223 onto the end of the args in some (at least one anyway)
2224 implementations, so strip it off if it exists. */
2225
2226 {
2227 char *command = elf_tdata (abfd)->core_command;
2228 int n = strlen (command);
2229
2230 if (0 < n && command[n - 1] == ' ')
2231 command[n - 1] = '\0';
2232 }
2233
b34976b6 2234 return TRUE;
bb0082d6
AM
2235}
2236\f
c6e90b02
TS
2237/* Depending on the target vector we generate some version of Irix
2238 executables or "normal" MIPS ELF ABI executables. */
2239static irix_compat_t
11a2be4d 2240elf32_mips_irix_compat (bfd *abfd)
c6e90b02 2241{
cb7394f2
TS
2242 if ((abfd->xvec == &bfd_elf32_bigmips_vec)
2243 || (abfd->xvec == &bfd_elf32_littlemips_vec))
c6e90b02 2244 return ict_irix5;
cb7394f2
TS
2245 else
2246 return ict_none;
c6e90b02 2247}
73d074b4 2248\f
252b5132
RH
2249/* ECOFF swapping routines. These are used when dealing with the
2250 .mdebug section, which is in the ECOFF debugging format. */
be3ccd9c 2251static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
252b5132
RH
2252 /* Symbol table magic number. */
2253 magicSym,
2254 /* Alignment of debugging information. E.g., 4. */
2255 4,
2256 /* Sizes of external symbolic information. */
2257 sizeof (struct hdr_ext),
2258 sizeof (struct dnr_ext),
2259 sizeof (struct pdr_ext),
2260 sizeof (struct sym_ext),
2261 sizeof (struct opt_ext),
2262 sizeof (struct fdr_ext),
2263 sizeof (struct rfd_ext),
2264 sizeof (struct ext_ext),
2265 /* Functions to swap in external symbolic data. */
2266 ecoff_swap_hdr_in,
2267 ecoff_swap_dnr_in,
2268 ecoff_swap_pdr_in,
2269 ecoff_swap_sym_in,
2270 ecoff_swap_opt_in,
2271 ecoff_swap_fdr_in,
2272 ecoff_swap_rfd_in,
2273 ecoff_swap_ext_in,
2274 _bfd_ecoff_swap_tir_in,
2275 _bfd_ecoff_swap_rndx_in,
2276 /* Functions to swap out external symbolic data. */
2277 ecoff_swap_hdr_out,
2278 ecoff_swap_dnr_out,
2279 ecoff_swap_pdr_out,
2280 ecoff_swap_sym_out,
2281 ecoff_swap_opt_out,
2282 ecoff_swap_fdr_out,
2283 ecoff_swap_rfd_out,
2284 ecoff_swap_ext_out,
2285 _bfd_ecoff_swap_tir_out,
2286 _bfd_ecoff_swap_rndx_out,
2287 /* Function to read in symbolic data. */
2288 _bfd_mips_elf_read_ecoff_info
2289};
2290\f
252b5132 2291#define ELF_ARCH bfd_arch_mips
ae95ffa6 2292#define ELF_TARGET_ID MIPS_ELF_DATA
252b5132
RH
2293#define ELF_MACHINE_CODE EM_MIPS
2294
b34976b6
AM
2295#define elf_backend_collect TRUE
2296#define elf_backend_type_change_ok TRUE
2297#define elf_backend_can_gc_sections TRUE
3f830999 2298#define elf_info_to_howto mips_info_to_howto_rela
252b5132
RH
2299#define elf_info_to_howto_rel mips_info_to_howto_rel
2300#define elf_backend_sym_is_global mips_elf_sym_is_global
c6e90b02 2301#define elf_backend_object_p mips_elf32_object_p
d75bc93d
TS
2302#define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing
2303#define elf_backend_section_processing _bfd_mips_elf_section_processing
103186c6 2304#define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr
252b5132
RH
2305#define elf_backend_fake_sections _bfd_mips_elf_fake_sections
2306#define elf_backend_section_from_bfd_section \
2307 _bfd_mips_elf_section_from_bfd_section
103186c6 2308#define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook
d75bc93d
TS
2309#define elf_backend_link_output_symbol_hook \
2310 _bfd_mips_elf_link_output_symbol_hook
103186c6
MM
2311#define elf_backend_create_dynamic_sections \
2312 _bfd_mips_elf_create_dynamic_sections
2313#define elf_backend_check_relocs _bfd_mips_elf_check_relocs
8992f0d7
TS
2314#define elf_backend_merge_symbol_attribute \
2315 _bfd_mips_elf_merge_symbol_attribute
ad9563d6 2316#define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag
103186c6
MM
2317#define elf_backend_adjust_dynamic_symbol \
2318 _bfd_mips_elf_adjust_dynamic_symbol
2319#define elf_backend_always_size_sections \
2320 _bfd_mips_elf_always_size_sections
2321#define elf_backend_size_dynamic_sections \
2322 _bfd_mips_elf_size_dynamic_sections
74541ad4 2323#define elf_backend_init_index_section _bfd_elf_init_1_index_section
103186c6 2324#define elf_backend_relocate_section _bfd_mips_elf_relocate_section
103186c6
MM
2325#define elf_backend_finish_dynamic_symbol \
2326 _bfd_mips_elf_finish_dynamic_symbol
2327#define elf_backend_finish_dynamic_sections \
2328 _bfd_mips_elf_finish_dynamic_sections
d75bc93d
TS
2329#define elf_backend_final_write_processing \
2330 _bfd_mips_elf_final_write_processing
2331#define elf_backend_additional_program_headers \
2332 _bfd_mips_elf_additional_program_headers
2333#define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map
103186c6
MM
2334#define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook
2335#define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook
8a20f077
UC
2336#define elf_backend_copy_indirect_symbol \
2337 _bfd_mips_elf_copy_indirect_symbol
c6e90b02
TS
2338#define elf_backend_grok_prstatus elf32_mips_grok_prstatus
2339#define elf_backend_grok_psinfo elf32_mips_grok_psinfo
d75bc93d
TS
2340#define elf_backend_ecoff_debug_swap &mips_elf32_ecoff_debug_swap
2341
2342#define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO)
d75bc93d
TS
2343#define elf_backend_may_use_rel_p 1
2344#define elf_backend_may_use_rela_p 0
2345#define elf_backend_default_use_rela_p 0
b34976b6 2346#define elf_backend_sign_extend_vma TRUE
861fb55a
DJ
2347#define elf_backend_plt_readonly 1
2348#define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val
b305ef96 2349
d01414a5 2350#define elf_backend_discard_info _bfd_mips_elf_discard_info
73d074b4 2351#define elf_backend_ignore_discarded_relocs \
53bfd6b4 2352 _bfd_mips_elf_ignore_discarded_relocs
20163277 2353#define elf_backend_write_section _bfd_mips_elf_write_section
c6e90b02
TS
2354#define elf_backend_mips_irix_compat elf32_mips_irix_compat
2355#define elf_backend_mips_rtype_to_howto mips_elf32_rtype_to_howto
252b5132
RH
2356#define bfd_elf32_bfd_is_local_label_name \
2357 mips_elf_is_local_label_name
df58fc94
RS
2358#define bfd_elf32_bfd_is_target_special_symbol \
2359 _bfd_mips_elf_is_target_special_symbol
252b5132 2360#define bfd_elf32_find_nearest_line _bfd_mips_elf_find_nearest_line
4ab527b0 2361#define bfd_elf32_find_inliner_info _bfd_mips_elf_find_inliner_info
f0abc2a1 2362#define bfd_elf32_new_section_hook _bfd_mips_elf_new_section_hook
252b5132 2363#define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents
c6e90b02
TS
2364#define bfd_elf32_bfd_get_relocated_section_contents \
2365 _bfd_elf_mips_get_relocated_section_contents
252b5132 2366#define bfd_elf32_bfd_link_hash_table_create \
103186c6
MM
2367 _bfd_mips_elf_link_hash_table_create
2368#define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link
252b5132
RH
2369#define bfd_elf32_bfd_merge_private_bfd_data \
2370 _bfd_mips_elf_merge_private_bfd_data
2371#define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
2372#define bfd_elf32_bfd_print_private_bfd_data \
2373 _bfd_mips_elf_print_private_bfd_data
df58fc94 2374#define bfd_elf32_bfd_relax_section _bfd_mips_elf_relax_section
e364195d 2375
d75bc93d
TS
2376/* Support for SGI-ish mips targets. */
2377#define TARGET_LITTLE_SYM bfd_elf32_littlemips_vec
2378#define TARGET_LITTLE_NAME "elf32-littlemips"
2379#define TARGET_BIG_SYM bfd_elf32_bigmips_vec
2380#define TARGET_BIG_NAME "elf32-bigmips"
2381
4301eeb1
MR
2382/* The SVR4 MIPS ABI says that this should be 0x10000, but Irix 5 uses
2383 a value of 0x1000, and we are compatible. */
2384#define ELF_MAXPAGESIZE 0x1000
24718e3b 2385#define ELF_COMMONPAGESIZE 0x1000
4301eeb1 2386
d75bc93d 2387#include "elf32-target.h"
e364195d 2388
d75bc93d 2389/* Support for traditional mips targets. */
e364195d
UC
2390#undef TARGET_LITTLE_SYM
2391#undef TARGET_LITTLE_NAME
2392#undef TARGET_BIG_SYM
2393#undef TARGET_BIG_NAME
2394
4301eeb1 2395#undef ELF_MAXPAGESIZE
7fd91fe0 2396#undef ELF_COMMONPAGESIZE
4301eeb1 2397
e364195d
UC
2398#define TARGET_LITTLE_SYM bfd_elf32_tradlittlemips_vec
2399#define TARGET_LITTLE_NAME "elf32-tradlittlemips"
2400#define TARGET_BIG_SYM bfd_elf32_tradbigmips_vec
2401#define TARGET_BIG_NAME "elf32-tradbigmips"
2402
7fd91fe0
TS
2403/* The MIPS ABI says at Page 5-1:
2404 Virtual addresses and file offsets for MIPS segments are congruent
2405 modulo 64 KByte (0x10000) or larger powers of 2. Because 64 KBytes
2406 is the maximum page size, the files are suitable for paging
2407 regardless of physical page size. */
4301eeb1 2408#define ELF_MAXPAGESIZE 0x10000
7fd91fe0 2409#define ELF_COMMONPAGESIZE 0x1000
4301eeb1
MR
2410#define elf32_bed elf32_tradbed
2411
c6e90b02 2412/* Include the target file again for this target. */
e364195d 2413#include "elf32-target.h"
0a44bf69 2414
aeffff67
RS
2415/* FreeBSD support. */
2416
2417#undef TARGET_LITTLE_SYM
2418#undef TARGET_LITTLE_NAME
2419#undef TARGET_BIG_SYM
2420#undef TARGET_BIG_NAME
2421
2422#define TARGET_LITTLE_SYM bfd_elf32_tradlittlemips_freebsd_vec
2423#define TARGET_LITTLE_NAME "elf32-tradlittlemips-freebsd"
2424#define TARGET_BIG_SYM bfd_elf32_tradbigmips_freebsd_vec
2425#define TARGET_BIG_NAME "elf32-tradbigmips-freebsd"
2426
2427#undef ELF_OSABI
2428#define ELF_OSABI ELFOSABI_FREEBSD
2429
2430/* The kernel recognizes executables as valid only if they carry a
2431 "FreeBSD" label in the ELF header. So we put this label on all
2432 executables and (for simplicity) also all other object files. */
2433
2434static void
2435elf_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
2436{
2437 _bfd_elf_set_osabi (abfd, info);
2438}
2439
2440#undef elf_backend_post_process_headers
2441#define elf_backend_post_process_headers elf_fbsd_post_process_headers
2442#undef elf32_bed
2443#define elf32_bed elf32_fbsd_tradbed
2444
2445#include "elf32-target.h"
0a44bf69
RS
2446/* Implement elf_backend_final_write_processing for VxWorks. */
2447
2448static void
2449mips_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
2450{
2451 _bfd_mips_elf_final_write_processing (abfd, linker);
2452 elf_vxworks_final_write_processing (abfd, linker);
2453}
2454
2455#undef TARGET_LITTLE_SYM
2456#undef TARGET_LITTLE_NAME
2457#undef TARGET_BIG_SYM
2458#undef TARGET_BIG_NAME
2459
7fd91fe0
TS
2460#undef ELF_MAXPAGESIZE
2461#undef ELF_COMMONPAGESIZE
2462
0a44bf69
RS
2463#define TARGET_LITTLE_SYM bfd_elf32_littlemips_vxworks_vec
2464#define TARGET_LITTLE_NAME "elf32-littlemips-vxworks"
2465#define TARGET_BIG_SYM bfd_elf32_bigmips_vxworks_vec
2466#define TARGET_BIG_NAME "elf32-bigmips-vxworks"
2467
2468#undef elf32_bed
2469#define elf32_bed elf32_mips_vxworks_bed
2470
0a44bf69 2471#define ELF_MAXPAGESIZE 0x1000
7fd91fe0 2472#define ELF_COMMONPAGESIZE 0x1000
0a44bf69
RS
2473
2474#undef elf_backend_want_got_plt
2475#define elf_backend_want_got_plt 1
2476#undef elf_backend_want_plt_sym
2477#define elf_backend_want_plt_sym 1
0a44bf69
RS
2478#undef elf_backend_may_use_rel_p
2479#define elf_backend_may_use_rel_p 0
2480#undef elf_backend_may_use_rela_p
2481#define elf_backend_may_use_rela_p 1
2482#undef elf_backend_default_use_rela_p
2483#define elf_backend_default_use_rela_p 1
2484#undef elf_backend_got_header_size
2485#define elf_backend_got_header_size (4 * 3)
861fb55a
DJ
2486#undef elf_backend_plt_sym_val
2487
0a44bf69
RS
2488#undef elf_backend_finish_dynamic_symbol
2489#define elf_backend_finish_dynamic_symbol \
2490 _bfd_mips_vxworks_finish_dynamic_symbol
2491#undef bfd_elf32_bfd_link_hash_table_create
2492#define bfd_elf32_bfd_link_hash_table_create \
2493 _bfd_mips_vxworks_link_hash_table_create
2494#undef elf_backend_add_symbol_hook
2495#define elf_backend_add_symbol_hook \
2496 elf_vxworks_add_symbol_hook
2497#undef elf_backend_link_output_symbol_hook
2498#define elf_backend_link_output_symbol_hook \
2499 elf_vxworks_link_output_symbol_hook
2500#undef elf_backend_emit_relocs
2501#define elf_backend_emit_relocs \
2502 elf_vxworks_emit_relocs
2503#undef elf_backend_final_write_processing
2504#define elf_backend_final_write_processing \
2505 mips_vxworks_final_write_processing
2506
2507#undef elf_backend_additional_program_headers
2508#undef elf_backend_modify_segment_map
2509#undef elf_backend_symbol_processing
2510/* NOTE: elf_backend_rela_normal is not defined for MIPS. */
2511
2512#include "elf32-target.h"
This page took 0.867413 seconds and 4 git commands to generate.