bfd/
[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,
157090f7 3 2003, 2004, 2005, 2007 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 */
833};
252b5132 834
c6e90b02
TS
835/* 16 bit offset for pc-relative branches. */
836static reloc_howto_type elf_mips_gnu_rel16_s2 =
837 HOWTO (R_MIPS_GNU_REL16_S2, /* type */
838 2, /* rightshift */
252b5132
RH
839 2, /* size (0 = byte, 1 = short, 2 = long) */
840 16, /* bitsize */
b34976b6 841 TRUE, /* pc_relative */
252b5132
RH
842 0, /* bitpos */
843 complain_overflow_signed, /* complain_on_overflow */
30ac9238 844 _bfd_mips_elf_generic_reloc, /* special_function */
c6e90b02 845 "R_MIPS_GNU_REL16_S2", /* name */
b34976b6 846 TRUE, /* partial_inplace */
c6e90b02
TS
847 0xffff, /* src_mask */
848 0xffff, /* dst_mask */
b34976b6 849 TRUE); /* pcrel_offset */
252b5132 850
092dcd75
CD
851/* 32 bit pc-relative. This was a GNU extension used by embedded-PIC.
852 It was co-opted by mips-linux for exception-handling data. It is no
853 longer used, but should continue to be supported by the linker for
854 backward compatibility. (GCC stopped using it in May, 2004.) */
855static reloc_howto_type elf_mips_gnu_pcrel32 =
856 HOWTO (R_MIPS_PC32, /* type */
857 0, /* rightshift */
858 2, /* size (0 = byte, 1 = short, 2 = long) */
859 32, /* bitsize */
860 TRUE, /* pc_relative */
861 0, /* bitpos */
862 complain_overflow_signed, /* complain_on_overflow */
863 _bfd_mips_elf_generic_reloc, /* special_function */
864 "R_MIPS_PC32", /* name */
865 TRUE, /* partial_inplace */
866 0xffffffff, /* src_mask */
867 0xffffffff, /* dst_mask */
868 TRUE); /* pcrel_offset */
869
c6e90b02
TS
870/* GNU extension to record C++ vtable hierarchy */
871static reloc_howto_type elf_mips_gnu_vtinherit_howto =
872 HOWTO (R_MIPS_GNU_VTINHERIT, /* type */
252b5132
RH
873 0, /* rightshift */
874 2, /* size (0 = byte, 1 = short, 2 = long) */
c6e90b02 875 0, /* bitsize */
b34976b6 876 FALSE, /* pc_relative */
252b5132 877 0, /* bitpos */
c6e90b02
TS
878 complain_overflow_dont, /* complain_on_overflow */
879 NULL, /* special_function */
880 "R_MIPS_GNU_VTINHERIT", /* name */
b34976b6 881 FALSE, /* partial_inplace */
d75bc93d 882 0, /* src_mask */
c6e90b02 883 0, /* dst_mask */
b34976b6 884 FALSE); /* pcrel_offset */
252b5132 885
c6e90b02
TS
886/* GNU extension to record C++ vtable member usage */
887static reloc_howto_type elf_mips_gnu_vtentry_howto =
888 HOWTO (R_MIPS_GNU_VTENTRY, /* type */
252b5132
RH
889 0, /* rightshift */
890 2, /* size (0 = byte, 1 = short, 2 = long) */
c6e90b02 891 0, /* bitsize */
b34976b6 892 FALSE, /* pc_relative */
252b5132
RH
893 0, /* bitpos */
894 complain_overflow_dont, /* complain_on_overflow */
c6e90b02
TS
895 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
896 "R_MIPS_GNU_VTENTRY", /* name */
b34976b6 897 FALSE, /* partial_inplace */
d75bc93d 898 0, /* src_mask */
c6e90b02 899 0, /* dst_mask */
b34976b6 900 FALSE); /* pcrel_offset */
252b5132 901
861fb55a
DJ
902/* Originally a VxWorks extension, but now used for other systems too. */
903static reloc_howto_type elf_mips_copy_howto =
904 HOWTO (R_MIPS_COPY, /* type */
905 0, /* rightshift */
906 0, /* this one is variable size */
907 0, /* bitsize */
908 FALSE, /* pc_relative */
909 0, /* bitpos */
910 complain_overflow_bitfield, /* complain_on_overflow */
911 bfd_elf_generic_reloc, /* special_function */
912 "R_MIPS_COPY", /* name */
913 FALSE, /* partial_inplace */
914 0x0, /* src_mask */
915 0x0, /* dst_mask */
916 FALSE); /* pcrel_offset */
917
918/* Originally a VxWorks extension, but now used for other systems too. */
919static reloc_howto_type elf_mips_jump_slot_howto =
920 HOWTO (R_MIPS_JUMP_SLOT, /* type */
921 0, /* rightshift */
922 2, /* size (0 = byte, 1 = short, 2 = long) */
923 32, /* bitsize */
924 FALSE, /* pc_relative */
925 0, /* bitpos */
926 complain_overflow_bitfield, /* complain_on_overflow */
927 bfd_elf_generic_reloc, /* special_function */
928 "R_MIPS_JUMP_SLOT", /* name */
929 FALSE, /* partial_inplace */
930 0x0, /* src_mask */
931 0x0, /* dst_mask */
932 FALSE); /* pcrel_offset */
933
b34976b6 934/* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
c6e90b02 935 dangerous relocation. */
252b5132 936
b34976b6 937static bfd_boolean
11a2be4d 938mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
252b5132 939{
c6e90b02
TS
940 unsigned int count;
941 asymbol **sym;
942 unsigned int i;
e92d460e 943
c6e90b02
TS
944 /* If we've already figured out what GP will be, just return it. */
945 *pgp = _bfd_get_gp_value (output_bfd);
946 if (*pgp)
b34976b6 947 return TRUE;
c6e90b02
TS
948
949 count = bfd_get_symcount (output_bfd);
950 sym = bfd_get_outsymbols (output_bfd);
252b5132 951
c6e90b02
TS
952 /* The linker script will have created a symbol named `_gp' with the
953 appropriate value. */
11a2be4d 954 if (sym == NULL)
c6e90b02
TS
955 i = count;
956 else
252b5132 957 {
c6e90b02
TS
958 for (i = 0; i < count; i++, sym++)
959 {
960 register const char *name;
961
962 name = bfd_asymbol_name (*sym);
963 if (*name == '_' && strcmp (name, "_gp") == 0)
964 {
965 *pgp = bfd_asymbol_value (*sym);
966 _bfd_set_gp_value (output_bfd, *pgp);
967 break;
968 }
969 }
252b5132
RH
970 }
971
c6e90b02 972 if (i >= count)
252b5132 973 {
c6e90b02
TS
974 /* Only get the error once. */
975 *pgp = 4;
976 _bfd_set_gp_value (output_bfd, *pgp);
b34976b6 977 return FALSE;
252b5132
RH
978 }
979
b34976b6 980 return TRUE;
252b5132
RH
981}
982
c6e90b02
TS
983/* We have to figure out the gp value, so that we can adjust the
984 symbol value correctly. We look up the symbol _gp in the output
985 BFD. If we can't find it, we're stuck. We cache it in the ELF
986 target data. We don't need to adjust the symbol value for an
1049f94e 987 external symbol if we are producing relocatable output. */
252b5132 988
c6e90b02 989static bfd_reloc_status_type
11a2be4d
RS
990mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
991 char **error_message, bfd_vma *pgp)
252b5132 992{
c6e90b02 993 if (bfd_is_und_section (symbol->section)
1049f94e 994 && ! relocatable)
252b5132 995 {
c6e90b02
TS
996 *pgp = 0;
997 return bfd_reloc_undefined;
252b5132
RH
998 }
999
c6e90b02
TS
1000 *pgp = _bfd_get_gp_value (output_bfd);
1001 if (*pgp == 0
1049f94e 1002 && (! relocatable
c6e90b02 1003 || (symbol->flags & BSF_SECTION_SYM) != 0))
252b5132 1004 {
1049f94e 1005 if (relocatable)
252b5132 1006 {
c6e90b02 1007 /* Make up a value. */
453f5985 1008 *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
c6e90b02 1009 _bfd_set_gp_value (output_bfd, *pgp);
252b5132 1010 }
c6e90b02 1011 else if (!mips_elf_assign_gp (output_bfd, pgp))
252b5132 1012 {
c6e90b02
TS
1013 *error_message =
1014 (char *) _("GP relative relocation when _gp not defined");
1015 return bfd_reloc_dangerous;
252b5132 1016 }
252b5132
RH
1017 }
1018
c6e90b02
TS
1019 return bfd_reloc_ok;
1020}
252b5132 1021
c6e90b02
TS
1022/* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must
1023 become the offset from the gp register. This function also handles
1024 R_MIPS_LITERAL relocations, although those can be handled more
1025 cleverly because the entries in the .lit8 and .lit4 sections can be
1026 merged. */
252b5132 1027
c6e90b02 1028bfd_reloc_status_type
11a2be4d
RS
1029_bfd_mips_elf32_gprel16_reloc (bfd *abfd, arelent *reloc_entry,
1030 asymbol *symbol, void *data,
1031 asection *input_section, bfd *output_bfd,
1032 char **error_message)
c6e90b02 1033{
1049f94e 1034 bfd_boolean relocatable;
c6e90b02
TS
1035 bfd_reloc_status_type ret;
1036 bfd_vma gp;
252b5132 1037
254f0426
MR
1038 /* R_MIPS_LITERAL relocations are defined for local symbols only. */
1039 if (reloc_entry->howto->type == R_MIPS_LITERAL
1040 && output_bfd != NULL
1041 && (symbol->flags & BSF_SECTION_SYM) == 0
1042 && (symbol->flags & BSF_LOCAL) != 0)
1043 {
1044 *error_message = (char *)
1045 _("literal relocation occurs for an external symbol");
1046 return bfd_reloc_outofrange;
1047 }
1048
11a2be4d 1049 if (output_bfd != NULL)
1049f94e 1050 relocatable = TRUE;
c6e90b02
TS
1051 else
1052 {
1049f94e 1053 relocatable = FALSE;
c6e90b02
TS
1054 output_bfd = symbol->section->output_section->owner;
1055 }
252b5132 1056
1049f94e 1057 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
c6e90b02
TS
1058 &gp);
1059 if (ret != bfd_reloc_ok)
1060 return ret;
252b5132 1061
c6e90b02 1062 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1049f94e 1063 input_section, relocatable,
c6e90b02
TS
1064 data, gp);
1065}
252b5132 1066
cb7394f2
TS
1067/* Do a R_MIPS_GPREL32 relocation. This is a 32 bit value which must
1068 become the offset from the gp register. */
252b5132 1069
c6e90b02 1070static bfd_reloc_status_type
11a2be4d
RS
1071mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1072 void *data, asection *input_section, bfd *output_bfd,
1073 char **error_message)
c6e90b02 1074{
1049f94e 1075 bfd_boolean relocatable;
c6e90b02
TS
1076 bfd_reloc_status_type ret;
1077 bfd_vma gp;
252b5132 1078
765f2ef6
MR
1079 /* R_MIPS_GPREL32 relocations are defined for local symbols only. */
1080 if (output_bfd != NULL
1081 && (symbol->flags & BSF_SECTION_SYM) == 0
1082 && (symbol->flags & BSF_LOCAL) != 0)
1083 {
1084 *error_message = (char *)
1085 _("32bits gp relative relocation occurs for an external symbol");
1086 return bfd_reloc_outofrange;
1087 }
1088
11a2be4d 1089 if (output_bfd != NULL)
1049f94e 1090 relocatable = TRUE;
c6e90b02
TS
1091 else
1092 {
1049f94e 1093 relocatable = FALSE;
c6e90b02 1094 output_bfd = symbol->section->output_section->owner;
c6e90b02 1095 }
252b5132 1096
1049f94e 1097 ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
a7ebbfdf
TS
1098 error_message, &gp);
1099 if (ret != bfd_reloc_ok)
1100 return ret;
1101
c6e90b02 1102 return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
1049f94e 1103 relocatable, data, gp);
c6e90b02 1104}
252b5132 1105
c6e90b02 1106static bfd_reloc_status_type
11a2be4d
RS
1107gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
1108 asection *input_section, bfd_boolean relocatable,
1109 void *data, bfd_vma gp)
c6e90b02
TS
1110{
1111 bfd_vma relocation;
a7ebbfdf 1112 bfd_vma val;
252b5132 1113
c6e90b02
TS
1114 if (bfd_is_com_section (symbol->section))
1115 relocation = 0;
1116 else
1117 relocation = symbol->value;
252b5132 1118
c6e90b02
TS
1119 relocation += symbol->section->output_section->vma;
1120 relocation += symbol->section->output_offset;
252b5132 1121
07515404 1122 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
c6e90b02 1123 return bfd_reloc_outofrange;
252b5132 1124
c6e90b02 1125 /* Set val to the offset into the section or symbol. */
a7ebbfdf
TS
1126 val = reloc_entry->addend;
1127
1128 if (reloc_entry->howto->partial_inplace)
1129 val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
252b5132 1130
c6e90b02 1131 /* Adjust val for the final section location and GP value. If we
1049f94e 1132 are producing relocatable output, we don't want to do this for
c6e90b02 1133 an external symbol. */
1049f94e 1134 if (! relocatable
c6e90b02
TS
1135 || (symbol->flags & BSF_SECTION_SYM) != 0)
1136 val += relocation - gp;
252b5132 1137
a7ebbfdf
TS
1138 if (reloc_entry->howto->partial_inplace)
1139 bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
1140 else
1141 reloc_entry->addend = val;
c6142e5d 1142
1049f94e 1143 if (relocatable)
c6e90b02 1144 reloc_entry->address += input_section->output_offset;
252b5132 1145
c6e90b02 1146 return bfd_reloc_ok;
252b5132
RH
1147}
1148
c6e90b02
TS
1149/* Handle a 64 bit reloc in a 32 bit MIPS ELF file. These are
1150 generated when addresses are 64 bits. The upper 32 bits are a simple
1151 sign extension. */
7403cb63 1152
c6e90b02 1153static bfd_reloc_status_type
30ac9238
RS
1154mips32_64bit_reloc (bfd *abfd, arelent *reloc_entry,
1155 asymbol *symbol ATTRIBUTE_UNUSED,
1156 void *data, asection *input_section,
1157 bfd *output_bfd, char **error_message)
7403cb63 1158{
c6e90b02
TS
1159 bfd_reloc_status_type r;
1160 arelent reloc32;
1161 unsigned long val;
1162 bfd_size_type addr;
7403cb63 1163
c6e90b02
TS
1164 /* Do a normal 32 bit relocation on the lower 32 bits. */
1165 reloc32 = *reloc_entry;
1166 if (bfd_big_endian (abfd))
1167 reloc32.address += 4;
1168 reloc32.howto = &elf_mips_howto_table_rel[R_MIPS_32];
1169 r = bfd_perform_relocation (abfd, &reloc32, data, input_section,
1170 output_bfd, error_message);
be3ccd9c 1171
c6e90b02
TS
1172 /* Sign extend into the upper 32 bits. */
1173 val = bfd_get_32 (abfd, (bfd_byte *) data + reloc32.address);
1174 if ((val & 0x80000000) != 0)
1175 val = 0xffffffff;
1176 else
1177 val = 0;
1178 addr = reloc_entry->address;
1179 if (bfd_little_endian (abfd))
1180 addr += 4;
11a2be4d 1181 bfd_put_32 (abfd, val, (bfd_byte *) data + addr);
c6e90b02
TS
1182
1183 return r;
7403cb63
MM
1184}
1185
c6e90b02 1186/* Handle a mips16 GP relative reloc. */
252b5132 1187
c6e90b02 1188static bfd_reloc_status_type
11a2be4d
RS
1189mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1190 void *data, asection *input_section, bfd *output_bfd,
1191 char **error_message)
c6e90b02 1192{
1049f94e 1193 bfd_boolean relocatable;
c6e90b02 1194 bfd_reloc_status_type ret;
d6f16593 1195 bfd_byte *location;
c6e90b02 1196 bfd_vma gp;
252b5132 1197
a7ebbfdf
TS
1198 /* If we're relocating, and this is an external symbol, we don't want
1199 to change anything. */
c6e90b02
TS
1200 if (output_bfd != NULL
1201 && (symbol->flags & BSF_SECTION_SYM) == 0
a7ebbfdf 1202 && (symbol->flags & BSF_LOCAL) != 0)
c6e90b02
TS
1203 {
1204 reloc_entry->address += input_section->output_offset;
1205 return bfd_reloc_ok;
1206 }
252b5132 1207
c6e90b02 1208 if (output_bfd != NULL)
1049f94e 1209 relocatable = TRUE;
c6e90b02
TS
1210 else
1211 {
1049f94e 1212 relocatable = FALSE;
c6e90b02 1213 output_bfd = symbol->section->output_section->owner;
252b5132
RH
1214 }
1215
1049f94e 1216 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
c6e90b02
TS
1217 &gp);
1218 if (ret != bfd_reloc_ok)
1219 return ret;
252b5132 1220
d6f16593
MR
1221 location = (bfd_byte *) data + reloc_entry->address;
1222 _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
1223 location);
1224 ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1225 input_section, relocatable,
1226 data, gp);
1227 _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
1228 location);
a7ebbfdf 1229
d6f16593 1230 return ret;
c6e90b02 1231}
7403cb63 1232
c6e90b02 1233/* A mapping from BFD reloc types to MIPS ELF reloc types. */
252b5132 1234
c6e90b02 1235struct elf_reloc_map {
cb7394f2
TS
1236 bfd_reloc_code_real_type bfd_val;
1237 enum elf_mips_reloc_type elf_val;
c6e90b02 1238};
252b5132 1239
c6e90b02
TS
1240static const struct elf_reloc_map mips_reloc_map[] =
1241{
28458e7e 1242 { BFD_RELOC_NONE, R_MIPS_NONE },
c6e90b02
TS
1243 { BFD_RELOC_16, R_MIPS_16 },
1244 { BFD_RELOC_32, R_MIPS_32 },
cb7394f2 1245 /* There is no BFD reloc for R_MIPS_REL32. */
c6e90b02
TS
1246 { BFD_RELOC_64, R_MIPS_64 },
1247 { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
1248 { BFD_RELOC_HI16_S, R_MIPS_HI16 },
1249 { BFD_RELOC_LO16, R_MIPS_LO16 },
1250 { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
1251 { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
1252 { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
bad36eac 1253 { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
c6e90b02
TS
1254 { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
1255 { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
1256 { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
1257 { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
1258 { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
1259 { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
1260 { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
1261 { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
1262 { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
0f20cc35 1263 { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
cd8d5a82 1264 { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
0f20cc35
DJ
1265 { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
1266 { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
1267 { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
1268 { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
1269 { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
1270 { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
1271 { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
1272 { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
1273 { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
1274 { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
1275 { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
1276 { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
1277 { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
c6e90b02 1278};
252b5132 1279
d6f16593
MR
1280static const struct elf_reloc_map mips16_reloc_map[] =
1281{
1282 { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
1283 { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
738e5348
RS
1284 { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
1285 { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
d6f16593
MR
1286 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
1287 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
1288};
1289
c6e90b02 1290/* Given a BFD reloc type, return a howto structure. */
252b5132 1291
c6e90b02 1292static reloc_howto_type *
11a2be4d 1293bfd_elf32_bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
252b5132 1294{
c6e90b02 1295 unsigned int i;
cb7394f2 1296 reloc_howto_type *howto_table = elf_mips_howto_table_rel;
d6f16593 1297 reloc_howto_type *howto16_table = elf_mips16_howto_table_rel;
252b5132 1298
cb7394f2
TS
1299 for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
1300 i++)
252b5132 1301 {
cb7394f2
TS
1302 if (mips_reloc_map[i].bfd_val == code)
1303 return &howto_table[(int) mips_reloc_map[i].elf_val];
252b5132
RH
1304 }
1305
d6f16593
MR
1306 for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
1307 i++)
1308 {
1309 if (mips16_reloc_map[i].bfd_val == code)
1310 return &howto16_table[(int) mips16_reloc_map[i].elf_val];
1311 }
1312
c6e90b02 1313 switch (code)
252b5132 1314 {
c6e90b02
TS
1315 default:
1316 bfd_set_error (bfd_error_bad_value);
1317 return NULL;
252b5132 1318
c6e90b02
TS
1319 case BFD_RELOC_CTOR:
1320 /* We need to handle BFD_RELOC_CTOR specially.
1321 Select the right relocation (R_MIPS_32 or R_MIPS_64) based on the
69931e60
AO
1322 size of addresses of the ABI. */
1323 if ((elf_elfheader (abfd)->e_flags & (E_MIPS_ABI_O64
1324 | E_MIPS_ABI_EABI64)) != 0)
c6e90b02 1325 return &elf_mips_ctor64_howto;
69931e60
AO
1326 else
1327 return &howto_table[(int) R_MIPS_32];
252b5132 1328
c6e90b02
TS
1329 case BFD_RELOC_VTABLE_INHERIT:
1330 return &elf_mips_gnu_vtinherit_howto;
1331 case BFD_RELOC_VTABLE_ENTRY:
1332 return &elf_mips_gnu_vtentry_howto;
092dcd75
CD
1333 case BFD_RELOC_32_PCREL:
1334 return &elf_mips_gnu_pcrel32;
861fb55a
DJ
1335 case BFD_RELOC_MIPS_COPY:
1336 return &elf_mips_copy_howto;
1337 case BFD_RELOC_MIPS_JUMP_SLOT:
1338 return &elf_mips_jump_slot_howto;
c6e90b02
TS
1339 }
1340}
252b5132 1341
157090f7
AM
1342static reloc_howto_type *
1343bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1344 const char *r_name)
1345{
1346 unsigned int i;
1347
1348 for (i = 0;
1349 i < (sizeof (elf_mips_howto_table_rel)
1350 / sizeof (elf_mips_howto_table_rel[0]));
1351 i++)
1352 if (elf_mips_howto_table_rel[i].name != NULL
1353 && strcasecmp (elf_mips_howto_table_rel[i].name, r_name) == 0)
1354 return &elf_mips_howto_table_rel[i];
1355
1356 for (i = 0;
1357 i < (sizeof (elf_mips16_howto_table_rel)
1358 / sizeof (elf_mips16_howto_table_rel[0]));
1359 i++)
1360 if (elf_mips16_howto_table_rel[i].name != NULL
1361 && strcasecmp (elf_mips16_howto_table_rel[i].name, r_name) == 0)
1362 return &elf_mips16_howto_table_rel[i];
1363
1364 if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
1365 return &elf_mips_gnu_pcrel32;
1366 if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
1367 return &elf_mips_gnu_rel16_s2;
1368 if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
1369 return &elf_mips_gnu_vtinherit_howto;
1370 if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
1371 return &elf_mips_gnu_vtentry_howto;
861fb55a
DJ
1372 if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
1373 return &elf_mips_copy_howto;
1374 if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
1375 return &elf_mips_jump_slot_howto;
157090f7
AM
1376
1377 return NULL;
1378}
1379
947216bf 1380/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
252b5132 1381
c6e90b02 1382static reloc_howto_type *
11a2be4d
RS
1383mips_elf32_rtype_to_howto (unsigned int r_type,
1384 bfd_boolean rela_p ATTRIBUTE_UNUSED)
c6e90b02
TS
1385{
1386 switch (r_type)
1387 {
c6e90b02
TS
1388 case R_MIPS_GNU_VTINHERIT:
1389 return &elf_mips_gnu_vtinherit_howto;
c6e90b02
TS
1390 case R_MIPS_GNU_VTENTRY:
1391 return &elf_mips_gnu_vtentry_howto;
c6e90b02
TS
1392 case R_MIPS_GNU_REL16_S2:
1393 return &elf_mips_gnu_rel16_s2;
092dcd75
CD
1394 case R_MIPS_PC32:
1395 return &elf_mips_gnu_pcrel32;
861fb55a
DJ
1396 case R_MIPS_COPY:
1397 return &elf_mips_copy_howto;
1398 case R_MIPS_JUMP_SLOT:
1399 return &elf_mips_jump_slot_howto;
c6e90b02 1400 default:
d6f16593
MR
1401 if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
1402 return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
c6e90b02
TS
1403 BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
1404 return &elf_mips_howto_table_rel[r_type];
1405 }
1406}
252b5132 1407
947216bf 1408/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
252b5132 1409
c6e90b02 1410static void
11a2be4d 1411mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
c6e90b02 1412{
0a44bf69 1413 const struct elf_backend_data *bed;
c6e90b02 1414 unsigned int r_type;
252b5132 1415
c6e90b02 1416 r_type = ELF32_R_TYPE (dst->r_info);
0a44bf69
RS
1417 bed = get_elf_backend_data (abfd);
1418 cache_ptr->howto = bed->elf_backend_mips_rtype_to_howto (r_type, FALSE);
252b5132 1419
c6e90b02
TS
1420 /* The addend for a GPREL16 or LITERAL relocation comes from the GP
1421 value for the object file. We get the addend now, rather than
1422 when we do the relocation, because the symbol manipulations done
1423 by the linker may cause us to lose track of the input BFD. */
1424 if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
1425 && (r_type == (unsigned int) R_MIPS_GPREL16
1426 || r_type == (unsigned int) R_MIPS_LITERAL))
1427 cache_ptr->addend = elf_gp (abfd);
1428}
5499724a 1429
947216bf 1430/* Given a MIPS Elf_Internal_Rela, fill in an arelent structure. */
252b5132 1431
c6e90b02 1432static void
11a2be4d 1433mips_info_to_howto_rela (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
c6e90b02 1434{
947216bf 1435 mips_info_to_howto_rel (abfd, cache_ptr, dst);
252b5132 1436
c6e90b02 1437 /* If we ever need to do any extra processing with dst->r_addend
947216bf 1438 (the field omitted in an Elf_Internal_Rel) we can do it here. */
c6e90b02
TS
1439}
1440\f
1441/* Determine whether a symbol is global for the purposes of splitting
1442 the symbol table into global symbols and local symbols. At least
1443 on Irix 5, this split must be between section symbols and all other
1444 symbols. On most ELF targets the split is between static symbols
1445 and externally visible symbols. */
252b5132 1446
b34976b6 1447static bfd_boolean
11a2be4d 1448mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
c6e90b02
TS
1449{
1450 if (SGI_COMPAT (abfd))
1451 return (sym->flags & BSF_SECTION_SYM) == 0;
1452 else
1453 return ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1454 || bfd_is_und_section (bfd_get_section (sym))
1455 || bfd_is_com_section (bfd_get_section (sym)));
1456}
1457\f
1458/* Set the right machine number for a MIPS ELF file. */
7403cb63 1459
b34976b6 1460static bfd_boolean
11a2be4d 1461mips_elf32_object_p (bfd *abfd)
c6e90b02
TS
1462{
1463 unsigned long mach;
103186c6 1464
c6e90b02
TS
1465 /* Irix 5 and 6 are broken. Object file symbol tables are not always
1466 sorted correctly such that local symbols precede global symbols,
1467 and the sh_info field in the symbol table is not always right. */
1468 if (SGI_COMPAT (abfd))
b34976b6 1469 elf_bad_symtab (abfd) = TRUE;
103186c6 1470
8a397dad 1471 if (ABI_N32_P (abfd))
b34976b6 1472 return FALSE;
8a397dad 1473
c6e90b02
TS
1474 mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
1475 bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
252b5132 1476
b34976b6 1477 return TRUE;
c6e90b02
TS
1478}
1479\f
1480/* MIPS ELF local labels start with '$', not 'L'. */
252b5132 1481
b34976b6 1482static bfd_boolean
11a2be4d 1483mips_elf_is_local_label_name (bfd *abfd, const char *name)
c6e90b02
TS
1484{
1485 if (name[0] == '$')
b34976b6 1486 return TRUE;
252b5132 1487
c6e90b02
TS
1488 /* On Irix 6, the labels go back to starting with '.', so we accept
1489 the generic ELF local label syntax as well. */
1490 return _bfd_elf_is_local_label_name (abfd, name);
252b5132
RH
1491}
1492\f
c6e90b02 1493/* Support for core dump NOTE sections. */
b34976b6 1494static bfd_boolean
11a2be4d 1495elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
bb0082d6
AM
1496{
1497 int offset;
eea6121a 1498 unsigned int size;
bb0082d6
AM
1499
1500 switch (note->descsz)
1501 {
1502 default:
b34976b6 1503 return FALSE;
bb0082d6
AM
1504
1505 case 256: /* Linux/MIPS */
1506 /* pr_cursig */
1507 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1508
1509 /* pr_pid */
1510 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1511
1512 /* pr_reg */
1513 offset = 72;
eea6121a 1514 size = 180;
bb0082d6
AM
1515
1516 break;
1517 }
1518
1519 /* Make a ".reg/999" section. */
936e320b 1520 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 1521 size, note->descpos + offset);
bb0082d6
AM
1522}
1523
b34976b6 1524static bfd_boolean
11a2be4d 1525elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
bb0082d6
AM
1526{
1527 switch (note->descsz)
1528 {
1529 default:
b34976b6 1530 return FALSE;
bb0082d6
AM
1531
1532 case 128: /* Linux/MIPS elf_prpsinfo */
1533 elf_tdata (abfd)->core_program
1534 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
1535 elf_tdata (abfd)->core_command
1536 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
1537 }
1538
1539 /* Note that for some reason, a spurious space is tacked
1540 onto the end of the args in some (at least one anyway)
1541 implementations, so strip it off if it exists. */
1542
1543 {
1544 char *command = elf_tdata (abfd)->core_command;
1545 int n = strlen (command);
1546
1547 if (0 < n && command[n - 1] == ' ')
1548 command[n - 1] = '\0';
1549 }
1550
b34976b6 1551 return TRUE;
bb0082d6
AM
1552}
1553\f
c6e90b02
TS
1554/* Depending on the target vector we generate some version of Irix
1555 executables or "normal" MIPS ELF ABI executables. */
1556static irix_compat_t
11a2be4d 1557elf32_mips_irix_compat (bfd *abfd)
c6e90b02 1558{
cb7394f2
TS
1559 if ((abfd->xvec == &bfd_elf32_bigmips_vec)
1560 || (abfd->xvec == &bfd_elf32_littlemips_vec))
c6e90b02 1561 return ict_irix5;
cb7394f2
TS
1562 else
1563 return ict_none;
c6e90b02 1564}
73d074b4 1565\f
252b5132
RH
1566/* ECOFF swapping routines. These are used when dealing with the
1567 .mdebug section, which is in the ECOFF debugging format. */
be3ccd9c 1568static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
252b5132
RH
1569 /* Symbol table magic number. */
1570 magicSym,
1571 /* Alignment of debugging information. E.g., 4. */
1572 4,
1573 /* Sizes of external symbolic information. */
1574 sizeof (struct hdr_ext),
1575 sizeof (struct dnr_ext),
1576 sizeof (struct pdr_ext),
1577 sizeof (struct sym_ext),
1578 sizeof (struct opt_ext),
1579 sizeof (struct fdr_ext),
1580 sizeof (struct rfd_ext),
1581 sizeof (struct ext_ext),
1582 /* Functions to swap in external symbolic data. */
1583 ecoff_swap_hdr_in,
1584 ecoff_swap_dnr_in,
1585 ecoff_swap_pdr_in,
1586 ecoff_swap_sym_in,
1587 ecoff_swap_opt_in,
1588 ecoff_swap_fdr_in,
1589 ecoff_swap_rfd_in,
1590 ecoff_swap_ext_in,
1591 _bfd_ecoff_swap_tir_in,
1592 _bfd_ecoff_swap_rndx_in,
1593 /* Functions to swap out external symbolic data. */
1594 ecoff_swap_hdr_out,
1595 ecoff_swap_dnr_out,
1596 ecoff_swap_pdr_out,
1597 ecoff_swap_sym_out,
1598 ecoff_swap_opt_out,
1599 ecoff_swap_fdr_out,
1600 ecoff_swap_rfd_out,
1601 ecoff_swap_ext_out,
1602 _bfd_ecoff_swap_tir_out,
1603 _bfd_ecoff_swap_rndx_out,
1604 /* Function to read in symbolic data. */
1605 _bfd_mips_elf_read_ecoff_info
1606};
1607\f
252b5132
RH
1608#define ELF_ARCH bfd_arch_mips
1609#define ELF_MACHINE_CODE EM_MIPS
1610
b34976b6
AM
1611#define elf_backend_collect TRUE
1612#define elf_backend_type_change_ok TRUE
1613#define elf_backend_can_gc_sections TRUE
3f830999 1614#define elf_info_to_howto mips_info_to_howto_rela
252b5132
RH
1615#define elf_info_to_howto_rel mips_info_to_howto_rel
1616#define elf_backend_sym_is_global mips_elf_sym_is_global
c6e90b02 1617#define elf_backend_object_p mips_elf32_object_p
d75bc93d
TS
1618#define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing
1619#define elf_backend_section_processing _bfd_mips_elf_section_processing
103186c6 1620#define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr
252b5132
RH
1621#define elf_backend_fake_sections _bfd_mips_elf_fake_sections
1622#define elf_backend_section_from_bfd_section \
1623 _bfd_mips_elf_section_from_bfd_section
103186c6 1624#define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook
d75bc93d
TS
1625#define elf_backend_link_output_symbol_hook \
1626 _bfd_mips_elf_link_output_symbol_hook
103186c6
MM
1627#define elf_backend_create_dynamic_sections \
1628 _bfd_mips_elf_create_dynamic_sections
1629#define elf_backend_check_relocs _bfd_mips_elf_check_relocs
8992f0d7
TS
1630#define elf_backend_merge_symbol_attribute \
1631 _bfd_mips_elf_merge_symbol_attribute
ad9563d6 1632#define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag
103186c6
MM
1633#define elf_backend_adjust_dynamic_symbol \
1634 _bfd_mips_elf_adjust_dynamic_symbol
1635#define elf_backend_always_size_sections \
1636 _bfd_mips_elf_always_size_sections
1637#define elf_backend_size_dynamic_sections \
1638 _bfd_mips_elf_size_dynamic_sections
74541ad4 1639#define elf_backend_init_index_section _bfd_elf_init_1_index_section
103186c6 1640#define elf_backend_relocate_section _bfd_mips_elf_relocate_section
103186c6
MM
1641#define elf_backend_finish_dynamic_symbol \
1642 _bfd_mips_elf_finish_dynamic_symbol
1643#define elf_backend_finish_dynamic_sections \
1644 _bfd_mips_elf_finish_dynamic_sections
d75bc93d
TS
1645#define elf_backend_final_write_processing \
1646 _bfd_mips_elf_final_write_processing
1647#define elf_backend_additional_program_headers \
1648 _bfd_mips_elf_additional_program_headers
1649#define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map
103186c6
MM
1650#define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook
1651#define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook
8a20f077
UC
1652#define elf_backend_copy_indirect_symbol \
1653 _bfd_mips_elf_copy_indirect_symbol
c6e90b02
TS
1654#define elf_backend_grok_prstatus elf32_mips_grok_prstatus
1655#define elf_backend_grok_psinfo elf32_mips_grok_psinfo
d75bc93d
TS
1656#define elf_backend_ecoff_debug_swap &mips_elf32_ecoff_debug_swap
1657
1658#define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO)
d75bc93d
TS
1659#define elf_backend_may_use_rel_p 1
1660#define elf_backend_may_use_rela_p 0
1661#define elf_backend_default_use_rela_p 0
b34976b6 1662#define elf_backend_sign_extend_vma TRUE
861fb55a
DJ
1663#define elf_backend_plt_readonly 1
1664#define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val
b305ef96 1665
d01414a5 1666#define elf_backend_discard_info _bfd_mips_elf_discard_info
73d074b4 1667#define elf_backend_ignore_discarded_relocs \
53bfd6b4 1668 _bfd_mips_elf_ignore_discarded_relocs
20163277 1669#define elf_backend_write_section _bfd_mips_elf_write_section
c6e90b02
TS
1670#define elf_backend_mips_irix_compat elf32_mips_irix_compat
1671#define elf_backend_mips_rtype_to_howto mips_elf32_rtype_to_howto
252b5132
RH
1672#define bfd_elf32_bfd_is_local_label_name \
1673 mips_elf_is_local_label_name
1674#define bfd_elf32_find_nearest_line _bfd_mips_elf_find_nearest_line
4ab527b0 1675#define bfd_elf32_find_inliner_info _bfd_mips_elf_find_inliner_info
f0abc2a1 1676#define bfd_elf32_new_section_hook _bfd_mips_elf_new_section_hook
252b5132 1677#define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents
c6e90b02
TS
1678#define bfd_elf32_bfd_get_relocated_section_contents \
1679 _bfd_elf_mips_get_relocated_section_contents
d5eaccd7 1680#define bfd_elf32_mkobject _bfd_mips_elf_mkobject
252b5132 1681#define bfd_elf32_bfd_link_hash_table_create \
103186c6
MM
1682 _bfd_mips_elf_link_hash_table_create
1683#define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link
252b5132
RH
1684#define bfd_elf32_bfd_merge_private_bfd_data \
1685 _bfd_mips_elf_merge_private_bfd_data
1686#define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
1687#define bfd_elf32_bfd_print_private_bfd_data \
1688 _bfd_mips_elf_print_private_bfd_data
e364195d 1689
d75bc93d
TS
1690/* Support for SGI-ish mips targets. */
1691#define TARGET_LITTLE_SYM bfd_elf32_littlemips_vec
1692#define TARGET_LITTLE_NAME "elf32-littlemips"
1693#define TARGET_BIG_SYM bfd_elf32_bigmips_vec
1694#define TARGET_BIG_NAME "elf32-bigmips"
1695
4301eeb1
MR
1696/* The SVR4 MIPS ABI says that this should be 0x10000, but Irix 5 uses
1697 a value of 0x1000, and we are compatible. */
1698#define ELF_MAXPAGESIZE 0x1000
24718e3b 1699#define ELF_COMMONPAGESIZE 0x1000
4301eeb1 1700
d75bc93d 1701#include "elf32-target.h"
e364195d 1702
d75bc93d 1703/* Support for traditional mips targets. */
e364195d
UC
1704#undef TARGET_LITTLE_SYM
1705#undef TARGET_LITTLE_NAME
1706#undef TARGET_BIG_SYM
1707#undef TARGET_BIG_NAME
1708
4301eeb1 1709#undef ELF_MAXPAGESIZE
7fd91fe0 1710#undef ELF_COMMONPAGESIZE
4301eeb1 1711
e364195d
UC
1712#define TARGET_LITTLE_SYM bfd_elf32_tradlittlemips_vec
1713#define TARGET_LITTLE_NAME "elf32-tradlittlemips"
1714#define TARGET_BIG_SYM bfd_elf32_tradbigmips_vec
1715#define TARGET_BIG_NAME "elf32-tradbigmips"
1716
7fd91fe0
TS
1717/* The MIPS ABI says at Page 5-1:
1718 Virtual addresses and file offsets for MIPS segments are congruent
1719 modulo 64 KByte (0x10000) or larger powers of 2. Because 64 KBytes
1720 is the maximum page size, the files are suitable for paging
1721 regardless of physical page size. */
4301eeb1 1722#define ELF_MAXPAGESIZE 0x10000
7fd91fe0 1723#define ELF_COMMONPAGESIZE 0x1000
4301eeb1
MR
1724#define elf32_bed elf32_tradbed
1725
c6e90b02 1726/* Include the target file again for this target. */
e364195d 1727#include "elf32-target.h"
0a44bf69 1728
0a44bf69
RS
1729/* Implement elf_backend_final_write_processing for VxWorks. */
1730
1731static void
1732mips_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
1733{
1734 _bfd_mips_elf_final_write_processing (abfd, linker);
1735 elf_vxworks_final_write_processing (abfd, linker);
1736}
1737
1738#undef TARGET_LITTLE_SYM
1739#undef TARGET_LITTLE_NAME
1740#undef TARGET_BIG_SYM
1741#undef TARGET_BIG_NAME
1742
7fd91fe0
TS
1743#undef ELF_MAXPAGESIZE
1744#undef ELF_COMMONPAGESIZE
1745
0a44bf69
RS
1746#define TARGET_LITTLE_SYM bfd_elf32_littlemips_vxworks_vec
1747#define TARGET_LITTLE_NAME "elf32-littlemips-vxworks"
1748#define TARGET_BIG_SYM bfd_elf32_bigmips_vxworks_vec
1749#define TARGET_BIG_NAME "elf32-bigmips-vxworks"
1750
1751#undef elf32_bed
1752#define elf32_bed elf32_mips_vxworks_bed
1753
0a44bf69 1754#define ELF_MAXPAGESIZE 0x1000
7fd91fe0 1755#define ELF_COMMONPAGESIZE 0x1000
0a44bf69
RS
1756
1757#undef elf_backend_want_got_plt
1758#define elf_backend_want_got_plt 1
1759#undef elf_backend_want_plt_sym
1760#define elf_backend_want_plt_sym 1
0a44bf69
RS
1761#undef elf_backend_may_use_rel_p
1762#define elf_backend_may_use_rel_p 0
1763#undef elf_backend_may_use_rela_p
1764#define elf_backend_may_use_rela_p 1
1765#undef elf_backend_default_use_rela_p
1766#define elf_backend_default_use_rela_p 1
1767#undef elf_backend_got_header_size
1768#define elf_backend_got_header_size (4 * 3)
861fb55a
DJ
1769#undef elf_backend_plt_sym_val
1770
0a44bf69
RS
1771#undef elf_backend_finish_dynamic_symbol
1772#define elf_backend_finish_dynamic_symbol \
1773 _bfd_mips_vxworks_finish_dynamic_symbol
1774#undef bfd_elf32_bfd_link_hash_table_create
1775#define bfd_elf32_bfd_link_hash_table_create \
1776 _bfd_mips_vxworks_link_hash_table_create
1777#undef elf_backend_add_symbol_hook
1778#define elf_backend_add_symbol_hook \
1779 elf_vxworks_add_symbol_hook
1780#undef elf_backend_link_output_symbol_hook
1781#define elf_backend_link_output_symbol_hook \
1782 elf_vxworks_link_output_symbol_hook
1783#undef elf_backend_emit_relocs
1784#define elf_backend_emit_relocs \
1785 elf_vxworks_emit_relocs
1786#undef elf_backend_final_write_processing
1787#define elf_backend_final_write_processing \
1788 mips_vxworks_final_write_processing
1789
1790#undef elf_backend_additional_program_headers
1791#undef elf_backend_modify_segment_map
1792#undef elf_backend_symbol_processing
1793/* NOTE: elf_backend_rela_normal is not defined for MIPS. */
1794
1795#include "elf32-target.h"
This page took 0.689886 seconds and 4 git commands to generate.