Coverage Report

Created: 2025-06-24 06:45

/src/binutils-gdb/bfd/elf64-mips.c
Line
Count
Source (jump to first uncovered line)
1
/* MIPS-specific support for 64-bit ELF
2
   Copyright (C) 1996-2025 Free Software Foundation, Inc.
3
   Ian Lance Taylor, Cygnus Support
4
   Linker support added by Mark Mitchell, CodeSourcery, LLC.
5
   <mark@codesourcery.com>
6
7
   This file is part of BFD, the Binary File Descriptor library.
8
9
   This program is free software; you can redistribute it and/or modify
10
   it under the terms of the GNU General Public License as published by
11
   the Free Software Foundation; either version 3 of the License, or
12
   (at your option) any later version.
13
14
   This program is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
   GNU General Public License for more details.
18
19
   You should have received a copy of the GNU General Public License
20
   along with this program; if not, write to the Free Software
21
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22
   MA 02110-1301, USA.  */
23
24
25
/* This file supports the 64-bit MIPS ELF ABI.
26
27
   The MIPS 64-bit ELF ABI uses an unusual reloc format.  This file
28
   overrides the usual ELF reloc handling, and handles reading and
29
   writing the relocations here.  */
30
31
/* TODO: Many things are unsupported, even if there is some code for it
32
 .       (which was mostly stolen from elf32-mips.c and slightly adapted).
33
 .
34
 .   - Relocation handling for REL relocs is wrong in many cases and
35
 .     generally untested.
36
 .   - Relocation handling for RELA relocs related to GOT support are
37
 .     also likely to be wrong.
38
 .   - Support for MIPS16 is untested.
39
 .   - Combined relocs with RSS_* entries are unsupported.
40
 .   - The whole GOT handling for NewABI is missing, some parts of
41
 .     the OldABI version is still lying around and should be removed.
42
 */
43
44
#include "sysdep.h"
45
#include "bfd.h"
46
#include "libbfd.h"
47
#include "aout/ar.h"
48
#include "bfdlink.h"
49
#include "genlink.h"
50
#include "elf-bfd.h"
51
#include "elfxx-mips.h"
52
#include "elf/mips.h"
53
54
/* Get the ECOFF swapping routines.  The 64-bit ABI is not supposed to
55
   use ECOFF.  However, we support it anyhow for an easier changeover.  */
56
#include "coff/sym.h"
57
#include "coff/symconst.h"
58
#include "coff/internal.h"
59
#include "coff/ecoff.h"
60
/* The 64 bit versions of the mdebug data structures are in alpha.h.  */
61
#include "coff/alpha.h"
62
#define ECOFF_SIGNED_64
63
#include "ecoffswap.h"
64
65
static void mips_elf64_swap_reloc_in
66
  (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
67
static void mips_elf64_swap_reloca_in
68
  (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
69
static void mips_elf64_swap_reloc_out
70
  (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
71
static void mips_elf64_swap_reloca_out
72
  (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
73
static void mips_elf64_be_swap_reloc_in
74
  (bfd *, const bfd_byte *, Elf_Internal_Rela *);
75
static void mips_elf64_be_swap_reloc_out
76
  (bfd *, const Elf_Internal_Rela *, bfd_byte *);
77
static void mips_elf64_be_swap_reloca_in
78
  (bfd *, const bfd_byte *, Elf_Internal_Rela *);
79
static void mips_elf64_be_swap_reloca_out
80
  (bfd *, const Elf_Internal_Rela *, bfd_byte *);
81
static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
82
  (bfd *, bfd_reloc_code_real_type);
83
static bool mips_elf64_info_to_howto_rela
84
  (bfd *, arelent *, Elf_Internal_Rela *);
85
static long mips_elf64_get_dynamic_reloc_upper_bound
86
  (bfd *);
87
static bool mips_elf64_slurp_one_reloc_table
88
  (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
89
   asymbol **, bool);
90
static bool mips_elf64_slurp_reloc_table
91
  (bfd *, asection *, asymbol **, bool);
92
static void mips_elf64_write_relocs
93
  (bfd *, asection *, void *);
94
static void mips_elf64_write_rel
95
  (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
96
static void mips_elf64_write_rela
97
  (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
98
static bfd_reloc_status_type mips_elf64_gprel16_reloc
99
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
100
static bfd_reloc_status_type mips_elf64_literal_reloc
101
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
102
static bfd_reloc_status_type mips_elf64_gprel32_reloc
103
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
104
static bfd_reloc_status_type mips_elf64_shift6_reloc
105
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
106
static bfd_reloc_status_type mips16_gprel_reloc
107
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
108
static bool mips_elf64_assign_gp
109
  (bfd *, bfd_vma *);
110
static bfd_reloc_status_type mips_elf64_final_gp
111
  (bfd *, asymbol *, bool, char **, bfd_vma *);
112
static bool mips_elf64_object_p
113
  (bfd *);
114
static irix_compat_t elf64_mips_irix_compat
115
  (bfd *);
116
static bool elf64_mips_grok_prstatus
117
  (bfd *, Elf_Internal_Note *);
118
static bool elf64_mips_grok_psinfo
119
  (bfd *, Elf_Internal_Note *);
120
121
extern const bfd_target mips_elf64_be_vec;
122
extern const bfd_target mips_elf64_le_vec;
123
124
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
125
   from smaller values.  Start with zero, widen, *then* decrement.  */
126
#define MINUS_ONE (((bfd_vma)0) - 1)
127
128
/* The number of local .got entries we reserve.  */
129
#define MIPS_RESERVED_GOTNO (2)
130

131
/* The relocation table used for SHT_REL sections.  */
132
133
static reloc_howto_type mips_elf64_howto_table_rel[] =
134
{
135
  /* No relocation.  */
136
  HOWTO (R_MIPS_NONE,   /* type */
137
   0,     /* rightshift */
138
   0,     /* size */
139
   0,     /* bitsize */
140
   false,     /* pc_relative */
141
   0,     /* bitpos */
142
   complain_overflow_dont, /* complain_on_overflow */
143
   _bfd_mips_elf_generic_reloc, /* special_function */
144
   "R_MIPS_NONE",   /* name */
145
   false,     /* partial_inplace */
146
   0,     /* src_mask */
147
   0,     /* dst_mask */
148
   false),    /* pcrel_offset */
149
150
  /* 16 bit relocation.  */
151
  HOWTO (R_MIPS_16,   /* type */
152
   0,     /* rightshift */
153
   4,     /* size */
154
   16,      /* bitsize */
155
   false,     /* pc_relative */
156
   0,     /* bitpos */
157
   complain_overflow_signed, /* complain_on_overflow */
158
   _bfd_mips_elf_generic_reloc, /* special_function */
159
   "R_MIPS_16",   /* name */
160
   true,      /* partial_inplace */
161
   0x0000ffff,    /* src_mask */
162
   0x0000ffff,    /* dst_mask */
163
   false),    /* pcrel_offset */
164
165
  /* 32 bit relocation.  */
166
  HOWTO (R_MIPS_32,   /* type */
167
   0,     /* rightshift */
168
   4,     /* size */
169
   32,      /* bitsize */
170
   false,     /* pc_relative */
171
   0,     /* bitpos */
172
   complain_overflow_dont, /* complain_on_overflow */
173
   _bfd_mips_elf_generic_reloc, /* special_function */
174
   "R_MIPS_32",   /* name */
175
   true,      /* partial_inplace */
176
   0xffffffff,    /* src_mask */
177
   0xffffffff,    /* dst_mask */
178
   false),    /* pcrel_offset */
179
180
  /* 32 bit symbol relative relocation.  */
181
  HOWTO (R_MIPS_REL32,    /* type */
182
   0,     /* rightshift */
183
   4,     /* size */
184
   32,      /* bitsize */
185
   false,     /* pc_relative */
186
   0,     /* bitpos */
187
   complain_overflow_dont, /* complain_on_overflow */
188
   _bfd_mips_elf_generic_reloc, /* special_function */
189
   "R_MIPS_REL32",  /* name */
190
   true,      /* partial_inplace */
191
   0xffffffff,    /* src_mask */
192
   0xffffffff,    /* dst_mask */
193
   false),    /* pcrel_offset */
194
195
  /* 26 bit jump address.  */
196
  HOWTO (R_MIPS_26,   /* type */
197
   2,     /* rightshift */
198
   4,     /* size */
199
   26,      /* bitsize */
200
   false,     /* pc_relative */
201
   0,     /* bitpos */
202
   complain_overflow_dont, /* complain_on_overflow */
203
        /* This needs complex overflow
204
           detection, because the upper 36
205
           bits must match the PC + 4.  */
206
   _bfd_mips_elf_generic_reloc, /* special_function */
207
   "R_MIPS_26",   /* name */
208
   true,      /* partial_inplace */
209
   0x03ffffff,    /* src_mask */
210
   0x03ffffff,    /* dst_mask */
211
   false),    /* pcrel_offset */
212
213
  /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
214
     However, the native IRIX6 tools use them, so we try our best. */
215
216
  /* High 16 bits of symbol value.  */
217
  HOWTO (R_MIPS_HI16,   /* type */
218
   16,      /* rightshift */
219
   4,     /* size */
220
   16,      /* bitsize */
221
   false,     /* pc_relative */
222
   0,     /* bitpos */
223
   complain_overflow_dont, /* complain_on_overflow */
224
   _bfd_mips_elf_hi16_reloc, /* special_function */
225
   "R_MIPS_HI16",   /* name */
226
   true,      /* partial_inplace */
227
   0x0000ffff,    /* src_mask */
228
   0x0000ffff,    /* dst_mask */
229
   false),    /* pcrel_offset */
230
231
  /* Low 16 bits of symbol value.  */
232
  HOWTO (R_MIPS_LO16,   /* type */
233
   0,     /* rightshift */
234
   4,     /* size */
235
   16,      /* bitsize */
236
   false,     /* pc_relative */
237
   0,     /* bitpos */
238
   complain_overflow_dont, /* complain_on_overflow */
239
   _bfd_mips_elf_lo16_reloc, /* special_function */
240
   "R_MIPS_LO16",   /* name */
241
   true,      /* partial_inplace */
242
   0x0000ffff,    /* src_mask */
243
   0x0000ffff,    /* dst_mask */
244
   false),    /* pcrel_offset */
245
246
  /* GP relative reference.  */
247
  HOWTO (R_MIPS_GPREL16,  /* type */
248
   0,     /* rightshift */
249
   4,     /* size */
250
   16,      /* bitsize */
251
   false,     /* pc_relative */
252
   0,     /* bitpos */
253
   complain_overflow_signed, /* complain_on_overflow */
254
   mips_elf64_gprel16_reloc, /* special_function */
255
   "R_MIPS_GPREL16",  /* name */
256
   true,      /* partial_inplace */
257
   0x0000ffff,    /* src_mask */
258
   0x0000ffff,    /* dst_mask */
259
   false),    /* pcrel_offset */
260
261
  /* Reference to literal section.  */
262
  HOWTO (R_MIPS_LITERAL,  /* type */
263
   0,     /* rightshift */
264
   4,     /* size */
265
   16,      /* bitsize */
266
   false,     /* pc_relative */
267
   0,     /* bitpos */
268
   complain_overflow_signed, /* complain_on_overflow */
269
   mips_elf64_literal_reloc, /* special_function */
270
   "R_MIPS_LITERAL",  /* name */
271
   true,      /* partial_inplace */
272
   0x0000ffff,    /* src_mask */
273
   0x0000ffff,    /* dst_mask */
274
   false),    /* pcrel_offset */
275
276
  /* Reference to global offset table.  */
277
  HOWTO (R_MIPS_GOT16,    /* type */
278
   0,     /* rightshift */
279
   4,     /* size */
280
   16,      /* bitsize */
281
   false,     /* pc_relative */
282
   0,     /* bitpos */
283
   complain_overflow_signed, /* complain_on_overflow */
284
   _bfd_mips_elf_got16_reloc, /* special_function */
285
   "R_MIPS_GOT16",  /* name */
286
   true,      /* partial_inplace */
287
   0x0000ffff,    /* src_mask */
288
   0x0000ffff,    /* dst_mask */
289
   false),    /* pcrel_offset */
290
291
  /* 16 bit PC relative reference.  Note that the ABI document has a typo
292
     and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
293
     We do the right thing here.  */
294
  HOWTO (R_MIPS_PC16,   /* type */
295
   2,     /* rightshift */
296
   4,     /* size */
297
   16,      /* bitsize */
298
   true,      /* pc_relative */
299
   0,     /* bitpos */
300
   complain_overflow_signed, /* complain_on_overflow */
301
   _bfd_mips_elf_generic_reloc, /* special_function */
302
   "R_MIPS_PC16",   /* name */
303
   true,      /* partial_inplace */
304
   0x0000ffff,    /* src_mask */
305
   0x0000ffff,    /* dst_mask */
306
   true),     /* pcrel_offset */
307
308
  /* 16 bit call through global offset table.  */
309
  HOWTO (R_MIPS_CALL16,   /* type */
310
   0,     /* rightshift */
311
   4,     /* size */
312
   16,      /* bitsize */
313
   false,     /* pc_relative */
314
   0,     /* bitpos */
315
   complain_overflow_signed, /* complain_on_overflow */
316
   _bfd_mips_elf_generic_reloc, /* special_function */
317
   "R_MIPS_CALL16", /* name */
318
   true,      /* partial_inplace */
319
   0x0000ffff,    /* src_mask */
320
   0x0000ffff,    /* dst_mask */
321
   false),    /* pcrel_offset */
322
323
  /* 32 bit GP relative reference.  */
324
  HOWTO (R_MIPS_GPREL32,  /* type */
325
   0,     /* rightshift */
326
   4,     /* size */
327
   32,      /* bitsize */
328
   false,     /* pc_relative */
329
   0,     /* bitpos */
330
   complain_overflow_dont, /* complain_on_overflow */
331
   mips_elf64_gprel32_reloc, /* special_function */
332
   "R_MIPS_GPREL32",  /* name */
333
   true,      /* partial_inplace */
334
   0xffffffff,    /* src_mask */
335
   0xffffffff,    /* dst_mask */
336
   false),    /* pcrel_offset */
337
338
  EMPTY_HOWTO (13),
339
  EMPTY_HOWTO (14),
340
  EMPTY_HOWTO (15),
341
342
  /* A 5 bit shift field.  */
343
  HOWTO (R_MIPS_SHIFT5,   /* type */
344
   0,     /* rightshift */
345
   4,     /* size */
346
   5,     /* bitsize */
347
   false,     /* pc_relative */
348
   6,     /* bitpos */
349
   complain_overflow_bitfield, /* complain_on_overflow */
350
   _bfd_mips_elf_generic_reloc, /* special_function */
351
   "R_MIPS_SHIFT5", /* name */
352
   true,      /* partial_inplace */
353
   0x000007c0,    /* src_mask */
354
   0x000007c0,    /* dst_mask */
355
   false),    /* pcrel_offset */
356
357
  /* A 6 bit shift field.  */
358
  HOWTO (R_MIPS_SHIFT6,   /* type */
359
   0,     /* rightshift */
360
   4,     /* size */
361
   6,     /* bitsize */
362
   false,     /* pc_relative */
363
   6,     /* bitpos */
364
   complain_overflow_bitfield, /* complain_on_overflow */
365
   mips_elf64_shift6_reloc, /* special_function */
366
   "R_MIPS_SHIFT6", /* name */
367
   true,      /* partial_inplace */
368
   0x000007c4,    /* src_mask */
369
   0x000007c4,    /* dst_mask */
370
   false),    /* pcrel_offset */
371
372
  /* 64 bit relocation.  */
373
  HOWTO (R_MIPS_64,   /* type */
374
   0,     /* rightshift */
375
   8,     /* size */
376
   64,      /* bitsize */
377
   false,     /* pc_relative */
378
   0,     /* bitpos */
379
   complain_overflow_dont, /* complain_on_overflow */
380
   _bfd_mips_elf_generic_reloc, /* special_function */
381
   "R_MIPS_64",   /* name */
382
   true,      /* partial_inplace */
383
   MINUS_ONE,   /* src_mask */
384
   MINUS_ONE,   /* dst_mask */
385
   false),    /* pcrel_offset */
386
387
  /* Displacement in the global offset table.  */
388
  HOWTO (R_MIPS_GOT_DISP, /* type */
389
   0,     /* rightshift */
390
   4,     /* size */
391
   16,      /* bitsize */
392
   false,     /* pc_relative */
393
   0,     /* bitpos */
394
   complain_overflow_signed, /* complain_on_overflow */
395
   _bfd_mips_elf_generic_reloc, /* special_function */
396
   "R_MIPS_GOT_DISP", /* name */
397
   true,      /* partial_inplace */
398
   0x0000ffff,    /* src_mask */
399
   0x0000ffff,    /* dst_mask */
400
   false),    /* pcrel_offset */
401
402
  /* Displacement to page pointer in the global offset table.  */
403
  HOWTO (R_MIPS_GOT_PAGE, /* type */
404
   0,     /* rightshift */
405
   4,     /* size */
406
   16,      /* bitsize */
407
   false,     /* pc_relative */
408
   0,     /* bitpos */
409
   complain_overflow_signed, /* complain_on_overflow */
410
   _bfd_mips_elf_generic_reloc, /* special_function */
411
   "R_MIPS_GOT_PAGE", /* name */
412
   true,      /* partial_inplace */
413
   0x0000ffff,    /* src_mask */
414
   0x0000ffff,    /* dst_mask */
415
   false),    /* pcrel_offset */
416
417
  /* Offset from page pointer in the global offset table.  */
418
  HOWTO (R_MIPS_GOT_OFST, /* type */
419
   0,     /* rightshift */
420
   4,     /* size */
421
   16,      /* bitsize */
422
   false,     /* pc_relative */
423
   0,     /* bitpos */
424
   complain_overflow_signed, /* complain_on_overflow */
425
   _bfd_mips_elf_generic_reloc, /* special_function */
426
   "R_MIPS_GOT_OFST", /* name */
427
   true,      /* partial_inplace */
428
   0x0000ffff,    /* src_mask */
429
   0x0000ffff,    /* dst_mask */
430
   false),    /* pcrel_offset */
431
432
  /* High 16 bits of displacement in global offset table.  */
433
  HOWTO (R_MIPS_GOT_HI16, /* type */
434
   16,      /* rightshift */
435
   4,     /* size */
436
   16,      /* bitsize */
437
   false,     /* pc_relative */
438
   0,     /* bitpos */
439
   complain_overflow_dont, /* complain_on_overflow */
440
   _bfd_mips_elf_generic_reloc, /* special_function */
441
   "R_MIPS_GOT_HI16", /* name */
442
   true,      /* partial_inplace */
443
   0x0000ffff,    /* src_mask */
444
   0x0000ffff,    /* dst_mask */
445
   false),    /* pcrel_offset */
446
447
  /* Low 16 bits of displacement in global offset table.  */
448
  HOWTO (R_MIPS_GOT_LO16, /* type */
449
   0,     /* rightshift */
450
   4,     /* size */
451
   16,      /* bitsize */
452
   false,     /* pc_relative */
453
   0,     /* bitpos */
454
   complain_overflow_dont, /* complain_on_overflow */
455
   _bfd_mips_elf_generic_reloc, /* special_function */
456
   "R_MIPS_GOT_LO16", /* name */
457
   true,      /* partial_inplace */
458
   0x0000ffff,    /* src_mask */
459
   0x0000ffff,    /* dst_mask */
460
   false),    /* pcrel_offset */
461
462
  /* 64 bit subtraction.  */
463
  HOWTO (R_MIPS_SUB,    /* type */
464
   0,     /* rightshift */
465
   8,     /* size */
466
   64,      /* bitsize */
467
   false,     /* pc_relative */
468
   0,     /* bitpos */
469
   complain_overflow_dont, /* complain_on_overflow */
470
   _bfd_mips_elf_generic_reloc, /* special_function */
471
   "R_MIPS_SUB",    /* name */
472
   true,      /* partial_inplace */
473
   MINUS_ONE,   /* src_mask */
474
   MINUS_ONE,   /* dst_mask */
475
   false),    /* pcrel_offset */
476
477
  /* Insert the addend as an instruction.  */
478
  /* FIXME: Not handled correctly.  */
479
  HOWTO (R_MIPS_INSERT_A, /* type */
480
   0,     /* rightshift */
481
   4,     /* size */
482
   32,      /* bitsize */
483
   false,     /* pc_relative */
484
   0,     /* bitpos */
485
   complain_overflow_dont, /* complain_on_overflow */
486
   _bfd_mips_elf_generic_reloc, /* special_function */
487
   "R_MIPS_INSERT_A", /* name */
488
   true,      /* partial_inplace */
489
   0xffffffff,    /* src_mask */
490
   0xffffffff,    /* dst_mask */
491
   false),    /* pcrel_offset */
492
493
  /* Insert the addend as an instruction, and change all relocations
494
     to refer to the old instruction at the address.  */
495
  /* FIXME: Not handled correctly.  */
496
  HOWTO (R_MIPS_INSERT_B, /* type */
497
   0,     /* rightshift */
498
   4,     /* size */
499
   32,      /* bitsize */
500
   false,     /* pc_relative */
501
   0,     /* bitpos */
502
   complain_overflow_dont, /* complain_on_overflow */
503
   _bfd_mips_elf_generic_reloc, /* special_function */
504
   "R_MIPS_INSERT_B", /* name */
505
   true,      /* partial_inplace */
506
   0xffffffff,    /* src_mask */
507
   0xffffffff,    /* dst_mask */
508
   false),    /* pcrel_offset */
509
510
  /* Delete a 32 bit instruction.  */
511
  /* FIXME: Not handled correctly.  */
512
  HOWTO (R_MIPS_DELETE,   /* type */
513
   0,     /* rightshift */
514
   4,     /* size */
515
   32,      /* bitsize */
516
   false,     /* pc_relative */
517
   0,     /* bitpos */
518
   complain_overflow_dont, /* complain_on_overflow */
519
   _bfd_mips_elf_generic_reloc, /* special_function */
520
   "R_MIPS_DELETE", /* name */
521
   true,      /* partial_inplace */
522
   0xffffffff,    /* src_mask */
523
   0xffffffff,    /* dst_mask */
524
   false),    /* pcrel_offset */
525
526
  /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
527
     We don't, because
528
       a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
529
    R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
530
    fallable heuristics.
531
       b) No other NewABI toolchain actually emits such relocations.  */
532
  EMPTY_HOWTO (R_MIPS_HIGHER),
533
  EMPTY_HOWTO (R_MIPS_HIGHEST),
534
535
  /* High 16 bits of displacement in global offset table.  */
536
  HOWTO (R_MIPS_CALL_HI16,  /* type */
537
   16,      /* rightshift */
538
   4,     /* size */
539
   16,      /* bitsize */
540
   false,     /* pc_relative */
541
   0,     /* bitpos */
542
   complain_overflow_dont, /* complain_on_overflow */
543
   _bfd_mips_elf_generic_reloc, /* special_function */
544
   "R_MIPS_CALL_HI16",  /* name */
545
   true,      /* partial_inplace */
546
   0x0000ffff,    /* src_mask */
547
   0x0000ffff,    /* dst_mask */
548
   false),    /* pcrel_offset */
549
550
  /* Low 16 bits of displacement in global offset table.  */
551
  HOWTO (R_MIPS_CALL_LO16,  /* type */
552
   0,     /* rightshift */
553
   4,     /* size */
554
   16,      /* bitsize */
555
   false,     /* pc_relative */
556
   0,     /* bitpos */
557
   complain_overflow_dont, /* complain_on_overflow */
558
   _bfd_mips_elf_generic_reloc, /* special_function */
559
   "R_MIPS_CALL_LO16",  /* name */
560
   true,      /* partial_inplace */
561
   0x0000ffff,    /* src_mask */
562
   0x0000ffff,    /* dst_mask */
563
   false),    /* pcrel_offset */
564
565
  /* Section displacement, used by an associated event location section.  */
566
  HOWTO (R_MIPS_SCN_DISP, /* type */
567
   0,     /* rightshift */
568
   4,     /* size */
569
   32,      /* bitsize */
570
   false,     /* pc_relative */
571
   0,     /* bitpos */
572
   complain_overflow_dont, /* complain_on_overflow */
573
   _bfd_mips_elf_generic_reloc, /* special_function */
574
   "R_MIPS_SCN_DISP", /* name */
575
   true,      /* partial_inplace */
576
   0xffffffff,    /* src_mask */
577
   0xffffffff,    /* dst_mask */
578
   false),    /* pcrel_offset */
579
580
  HOWTO (R_MIPS_REL16,    /* type */
581
   0,     /* rightshift */
582
   2,     /* size */
583
   16,      /* bitsize */
584
   false,     /* pc_relative */
585
   0,     /* bitpos */
586
   complain_overflow_signed, /* complain_on_overflow */
587
   _bfd_mips_elf_generic_reloc, /* special_function */
588
   "R_MIPS_REL16",  /* name */
589
   true,      /* partial_inplace */
590
   0xffff,    /* src_mask */
591
   0xffff,    /* dst_mask */
592
   false),    /* pcrel_offset */
593
594
  /* These two are obsolete.  */
595
  EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
596
  EMPTY_HOWTO (R_MIPS_PJUMP),
597
598
  /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
599
     It must be used for multigot GOT's (and only there).  */
600
  HOWTO (R_MIPS_RELGOT,   /* type */
601
   0,     /* rightshift */
602
   4,     /* size */
603
   32,      /* bitsize */
604
   false,     /* pc_relative */
605
   0,     /* bitpos */
606
   complain_overflow_dont, /* complain_on_overflow */
607
   _bfd_mips_elf_generic_reloc, /* special_function */
608
   "R_MIPS_RELGOT", /* name */
609
   true,      /* partial_inplace */
610
   0xffffffff,    /* src_mask */
611
   0xffffffff,    /* dst_mask */
612
   false),    /* pcrel_offset */
613
614
  /* Protected jump conversion.  This is an optimization hint.  No
615
     relocation is required for correctness.  */
616
  HOWTO (R_MIPS_JALR,   /* type */
617
   0,     /* rightshift */
618
   4,     /* size */
619
   32,      /* bitsize */
620
   false,     /* pc_relative */
621
   0,     /* bitpos */
622
   complain_overflow_dont, /* complain_on_overflow */
623
   _bfd_mips_elf_generic_reloc, /* special_function */
624
   "R_MIPS_JALR",   /* name */
625
   false,     /* partial_inplace */
626
   0,     /* src_mask */
627
   0x00000000,    /* dst_mask */
628
   false),    /* pcrel_offset */
629
630
  /* TLS relocations.  */
631
  EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
632
  EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
633
634
  HOWTO (R_MIPS_TLS_DTPMOD64, /* type */
635
   0,     /* rightshift */
636
   8,     /* size */
637
   64,      /* bitsize */
638
   false,     /* pc_relative */
639
   0,     /* bitpos */
640
   complain_overflow_dont, /* complain_on_overflow */
641
   _bfd_mips_elf_generic_reloc, /* special_function */
642
   "R_MIPS_TLS_DTPMOD64", /* name */
643
   true,      /* partial_inplace */
644
   MINUS_ONE,   /* src_mask */
645
   MINUS_ONE,   /* dst_mask */
646
   false),    /* pcrel_offset */
647
648
  HOWTO (R_MIPS_TLS_DTPREL64, /* type */
649
   0,     /* rightshift */
650
   8,     /* size */
651
   64,      /* bitsize */
652
   false,     /* pc_relative */
653
   0,     /* bitpos */
654
   complain_overflow_dont, /* complain_on_overflow */
655
   _bfd_mips_elf_generic_reloc, /* special_function */
656
   "R_MIPS_TLS_DTPREL64", /* name */
657
   true,      /* partial_inplace */
658
   MINUS_ONE,   /* src_mask */
659
   MINUS_ONE,   /* dst_mask */
660
   false),    /* pcrel_offset */
661
662
  /* TLS general dynamic variable reference.  */
663
  HOWTO (R_MIPS_TLS_GD,   /* type */
664
   0,     /* rightshift */
665
   4,     /* size */
666
   16,      /* bitsize */
667
   false,     /* pc_relative */
668
   0,     /* bitpos */
669
   complain_overflow_signed, /* complain_on_overflow */
670
   _bfd_mips_elf_generic_reloc, /* special_function */
671
   "R_MIPS_TLS_GD", /* name */
672
   true,      /* partial_inplace */
673
   0x0000ffff,    /* src_mask */
674
   0x0000ffff,    /* dst_mask */
675
   false),    /* pcrel_offset */
676
677
  /* TLS local dynamic variable reference.  */
678
  HOWTO (R_MIPS_TLS_LDM,  /* type */
679
   0,     /* rightshift */
680
   4,     /* size */
681
   16,      /* bitsize */
682
   false,     /* pc_relative */
683
   0,     /* bitpos */
684
   complain_overflow_signed, /* complain_on_overflow */
685
   _bfd_mips_elf_generic_reloc, /* special_function */
686
   "R_MIPS_TLS_LDM",  /* name */
687
   true,      /* partial_inplace */
688
   0x0000ffff,    /* src_mask */
689
   0x0000ffff,    /* dst_mask */
690
   false),    /* pcrel_offset */
691
692
  /* TLS local dynamic offset.  */
693
  HOWTO (R_MIPS_TLS_DTPREL_HI16,  /* type */
694
   16,      /* rightshift */
695
   4,     /* size */
696
   16,      /* bitsize */
697
   false,     /* pc_relative */
698
   0,     /* bitpos */
699
   complain_overflow_signed, /* complain_on_overflow */
700
   _bfd_mips_elf_generic_reloc, /* special_function */
701
   "R_MIPS_TLS_DTPREL_HI16",  /* name */
702
   true,      /* partial_inplace */
703
   0x0000ffff,    /* src_mask */
704
   0x0000ffff,    /* dst_mask */
705
   false),    /* pcrel_offset */
706
707
  /* TLS local dynamic offset.  */
708
  HOWTO (R_MIPS_TLS_DTPREL_LO16,  /* type */
709
   0,     /* rightshift */
710
   4,     /* size */
711
   16,      /* bitsize */
712
   false,     /* pc_relative */
713
   0,     /* bitpos */
714
   complain_overflow_dont, /* complain_on_overflow */
715
   _bfd_mips_elf_generic_reloc, /* special_function */
716
   "R_MIPS_TLS_DTPREL_LO16",  /* name */
717
   true,      /* partial_inplace */
718
   0x0000ffff,    /* src_mask */
719
   0x0000ffff,    /* dst_mask */
720
   false),    /* pcrel_offset */
721
722
  /* TLS thread pointer offset.  */
723
  HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
724
   0,     /* rightshift */
725
   4,     /* size */
726
   16,      /* bitsize */
727
   false,     /* pc_relative */
728
   0,     /* bitpos */
729
   complain_overflow_signed, /* complain_on_overflow */
730
   _bfd_mips_elf_generic_reloc, /* special_function */
731
   "R_MIPS_TLS_GOTTPREL", /* name */
732
   true,      /* partial_inplace */
733
   0x0000ffff,    /* src_mask */
734
   0x0000ffff,    /* dst_mask */
735
   false),    /* pcrel_offset */
736
737
  /* TLS IE dynamic relocations.  */
738
  EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
739
740
  HOWTO (R_MIPS_TLS_TPREL64,  /* type */
741
   0,     /* rightshift */
742
   8,     /* size */
743
   64,      /* bitsize */
744
   false,     /* pc_relative */
745
   0,     /* bitpos */
746
   complain_overflow_dont, /* complain_on_overflow */
747
   _bfd_mips_elf_generic_reloc, /* special_function */
748
   "R_MIPS_TLS_TPREL64",  /* name */
749
   true,      /* partial_inplace */
750
   MINUS_ONE,   /* src_mask */
751
   MINUS_ONE,   /* dst_mask */
752
   false),    /* pcrel_offset */
753
754
  /* TLS thread pointer offset.  */
755
  HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
756
   16,      /* rightshift */
757
   4,     /* size */
758
   16,      /* bitsize */
759
   false,     /* pc_relative */
760
   0,     /* bitpos */
761
   complain_overflow_signed, /* complain_on_overflow */
762
   _bfd_mips_elf_generic_reloc, /* special_function */
763
   "R_MIPS_TLS_TPREL_HI16", /* name */
764
   true,      /* partial_inplace */
765
   0x0000ffff,    /* src_mask */
766
   0x0000ffff,    /* dst_mask */
767
   false),    /* pcrel_offset */
768
769
  /* TLS thread pointer offset.  */
770
  HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
771
   0,     /* rightshift */
772
   4,     /* size */
773
   16,      /* bitsize */
774
   false,     /* pc_relative */
775
   0,     /* bitpos */
776
   complain_overflow_dont, /* complain_on_overflow */
777
   _bfd_mips_elf_generic_reloc, /* special_function */
778
   "R_MIPS_TLS_TPREL_LO16", /* name */
779
   true,      /* partial_inplace */
780
   0x0000ffff,    /* src_mask */
781
   0x0000ffff,    /* dst_mask */
782
   false),    /* pcrel_offset */
783
784
  /* 32 bit relocation with no addend.  */
785
  HOWTO (R_MIPS_GLOB_DAT, /* type */
786
   0,     /* rightshift */
787
   4,     /* size */
788
   32,      /* bitsize */
789
   false,     /* pc_relative */
790
   0,     /* bitpos */
791
   complain_overflow_dont, /* complain_on_overflow */
792
   _bfd_mips_elf_generic_reloc, /* special_function */
793
   "R_MIPS_GLOB_DAT", /* name */
794
   false,     /* partial_inplace */
795
   0x0,     /* src_mask */
796
   0xffffffff,    /* dst_mask */
797
   false),    /* pcrel_offset */
798
799
  EMPTY_HOWTO (52),
800
  EMPTY_HOWTO (53),
801
  EMPTY_HOWTO (54),
802
  EMPTY_HOWTO (55),
803
  EMPTY_HOWTO (56),
804
  EMPTY_HOWTO (57),
805
  EMPTY_HOWTO (58),
806
  EMPTY_HOWTO (59),
807
808
  HOWTO (R_MIPS_PC21_S2,  /* type */
809
   2,     /* rightshift */
810
   4,     /* size */
811
   21,      /* bitsize */
812
   true,      /* pc_relative */
813
   0,     /* bitpos */
814
   complain_overflow_signed, /* complain_on_overflow */
815
   _bfd_mips_elf_generic_reloc, /* special_function */
816
   "R_MIPS_PC21_S2",  /* name */
817
   true,      /* partial_inplace */
818
   0x001fffff,    /* src_mask */
819
   0x001fffff,    /* dst_mask */
820
   true),     /* pcrel_offset */
821
822
  HOWTO (R_MIPS_PC26_S2,  /* type */
823
   2,     /* rightshift */
824
   4,     /* size */
825
   26,      /* bitsize */
826
   true,      /* pc_relative */
827
   0,     /* bitpos */
828
   complain_overflow_signed, /* complain_on_overflow */
829
   _bfd_mips_elf_generic_reloc, /* special_function */
830
   "R_MIPS_PC26_S2",  /* name */
831
   true,      /* partial_inplace */
832
   0x03ffffff,    /* src_mask */
833
   0x03ffffff,    /* dst_mask */
834
   true),     /* pcrel_offset */
835
836
  HOWTO (R_MIPS_PC18_S3,  /* type */
837
   3,     /* rightshift */
838
   4,     /* size */
839
   18,      /* bitsize */
840
   true,      /* pc_relative */
841
   0,     /* bitpos */
842
   complain_overflow_signed, /* complain_on_overflow */
843
   _bfd_mips_elf_generic_reloc,   /* special_function */
844
   "R_MIPS_PC18_S3",  /* name */
845
   true,      /* partial_inplace */
846
   0x0003ffff,    /* src_mask */
847
   0x0003ffff,    /* dst_mask */
848
   true),     /* pcrel_offset */
849
850
  HOWTO (R_MIPS_PC19_S2,  /* type */
851
   2,     /* rightshift */
852
   4,     /* size */
853
   19,      /* bitsize */
854
   true,      /* pc_relative */
855
   0,     /* bitpos */
856
   complain_overflow_signed, /* complain_on_overflow */
857
   _bfd_mips_elf_generic_reloc,   /* special_function */
858
   "R_MIPS_PC19_S2",  /* name */
859
   true,      /* partial_inplace */
860
   0x0007ffff,    /* src_mask */
861
   0x0007ffff,    /* dst_mask */
862
   true),     /* pcrel_offset */
863
864
  HOWTO (R_MIPS_PCHI16,   /* type */
865
   16,      /* rightshift */
866
   4,     /* size */
867
   16,      /* bitsize */
868
   true,      /* pc_relative */
869
   0,     /* bitpos */
870
   complain_overflow_signed, /* complain_on_overflow */
871
   _bfd_mips_elf_generic_reloc,   /* special_function */
872
   "R_MIPS_PCHI16", /* name */
873
   true,      /* partial_inplace */
874
   0x0000ffff,    /* src_mask */
875
   0x0000ffff,    /* dst_mask */
876
   true),     /* pcrel_offset */
877
878
  HOWTO (R_MIPS_PCLO16,   /* type */
879
   0,     /* rightshift */
880
   4,     /* size */
881
   16,      /* bitsize */
882
   true,      /* pc_relative */
883
   0,     /* bitpos */
884
   complain_overflow_dont, /* complain_on_overflow */
885
   _bfd_mips_elf_generic_reloc,   /* special_function */
886
   "R_MIPS_PCLO16", /* name */
887
   true,      /* partial_inplace */
888
   0x0000ffff,    /* src_mask */
889
   0x0000ffff,    /* dst_mask */
890
   true),     /* pcrel_offset */
891
892
};
893
894
/* The relocation table used for SHT_RELA sections.  */
895
896
static reloc_howto_type mips_elf64_howto_table_rela[] =
897
{
898
  /* No relocation.  */
899
  HOWTO (R_MIPS_NONE,   /* type */
900
   0,     /* rightshift */
901
   0,     /* size */
902
   0,     /* bitsize */
903
   false,     /* pc_relative */
904
   0,     /* bitpos */
905
   complain_overflow_dont, /* complain_on_overflow */
906
   _bfd_mips_elf_generic_reloc, /* special_function */
907
   "R_MIPS_NONE",   /* name */
908
   false,     /* partial_inplace */
909
   0,     /* src_mask */
910
   0,     /* dst_mask */
911
   false),    /* pcrel_offset */
912
913
  /* 16 bit relocation.  */
914
  HOWTO (R_MIPS_16,   /* type */
915
   0,     /* rightshift */
916
   4,     /* size */
917
   16,      /* bitsize */
918
   false,     /* pc_relative */
919
   0,     /* bitpos */
920
   complain_overflow_signed, /* complain_on_overflow */
921
   _bfd_mips_elf_generic_reloc, /* special_function */
922
   "R_MIPS_16",   /* name */
923
   false,     /* partial_inplace */
924
   0,     /* src_mask */
925
   0x0000ffff,    /* dst_mask */
926
   false),    /* pcrel_offset */
927
928
  /* 32 bit relocation.  */
929
  HOWTO (R_MIPS_32,   /* type */
930
   0,     /* rightshift */
931
   4,     /* size */
932
   32,      /* bitsize */
933
   false,     /* pc_relative */
934
   0,     /* bitpos */
935
   complain_overflow_dont, /* complain_on_overflow */
936
   _bfd_mips_elf_generic_reloc, /* special_function */
937
   "R_MIPS_32",   /* name */
938
   false,     /* partial_inplace */
939
   0,     /* src_mask */
940
   0xffffffff,    /* dst_mask */
941
   false),    /* pcrel_offset */
942
943
  /* 32 bit symbol relative relocation.  */
944
  HOWTO (R_MIPS_REL32,    /* type */
945
   0,     /* rightshift */
946
   4,     /* size */
947
   32,      /* bitsize */
948
   false,     /* pc_relative */
949
   0,     /* bitpos */
950
   complain_overflow_dont, /* complain_on_overflow */
951
   _bfd_mips_elf_generic_reloc, /* special_function */
952
   "R_MIPS_REL32",  /* name */
953
   false,     /* partial_inplace */
954
   0,     /* src_mask */
955
   0xffffffff,    /* dst_mask */
956
   false),    /* pcrel_offset */
957
958
  /* 26 bit jump address.  */
959
  HOWTO (R_MIPS_26,   /* type */
960
   2,     /* rightshift */
961
   4,     /* size */
962
   26,      /* bitsize */
963
   false,     /* pc_relative */
964
   0,     /* bitpos */
965
   complain_overflow_dont, /* complain_on_overflow */
966
        /* This needs complex overflow
967
           detection, because the upper 36
968
           bits must match the PC + 4.  */
969
   _bfd_mips_elf_generic_reloc, /* special_function */
970
   "R_MIPS_26",   /* name */
971
   false,     /* partial_inplace */
972
   0,     /* src_mask */
973
   0x03ffffff,    /* dst_mask */
974
   false),    /* pcrel_offset */
975
976
  /* High 16 bits of symbol value.  */
977
  HOWTO (R_MIPS_HI16,   /* type */
978
   16,      /* rightshift */
979
   4,     /* size */
980
   16,      /* bitsize */
981
   false,     /* pc_relative */
982
   0,     /* bitpos */
983
   complain_overflow_dont, /* complain_on_overflow */
984
   _bfd_mips_elf_generic_reloc, /* special_function */
985
   "R_MIPS_HI16",   /* name */
986
   false,     /* partial_inplace */
987
   0,     /* src_mask */
988
   0x0000ffff,    /* dst_mask */
989
   false),    /* pcrel_offset */
990
991
  /* Low 16 bits of symbol value.  */
992
  HOWTO (R_MIPS_LO16,   /* type */
993
   0,     /* rightshift */
994
   4,     /* size */
995
   16,      /* bitsize */
996
   false,     /* pc_relative */
997
   0,     /* bitpos */
998
   complain_overflow_dont, /* complain_on_overflow */
999
   _bfd_mips_elf_generic_reloc, /* special_function */
1000
   "R_MIPS_LO16",   /* name */
1001
   false,     /* partial_inplace */
1002
   0,     /* src_mask */
1003
   0x0000ffff,    /* dst_mask */
1004
   false),    /* pcrel_offset */
1005
1006
  /* GP relative reference.  */
1007
  HOWTO (R_MIPS_GPREL16,  /* type */
1008
   0,     /* rightshift */
1009
   4,     /* size */
1010
   16,      /* bitsize */
1011
   false,     /* pc_relative */
1012
   0,     /* bitpos */
1013
   complain_overflow_signed, /* complain_on_overflow */
1014
   mips_elf64_gprel16_reloc, /* special_function */
1015
   "R_MIPS_GPREL16",  /* name */
1016
   false,     /* partial_inplace */
1017
   0,     /* src_mask */
1018
   0x0000ffff,    /* dst_mask */
1019
   false),    /* pcrel_offset */
1020
1021
  /* Reference to literal section.  */
1022
  HOWTO (R_MIPS_LITERAL,  /* type */
1023
   0,     /* rightshift */
1024
   4,     /* size */
1025
   16,      /* bitsize */
1026
   false,     /* pc_relative */
1027
   0,     /* bitpos */
1028
   complain_overflow_signed, /* complain_on_overflow */
1029
   mips_elf64_literal_reloc, /* special_function */
1030
   "R_MIPS_LITERAL",  /* name */
1031
   false,     /* partial_inplace */
1032
   0,     /* src_mask */
1033
   0x0000ffff,    /* dst_mask */
1034
   false),    /* pcrel_offset */
1035
1036
  /* Reference to global offset table.  */
1037
  HOWTO (R_MIPS_GOT16,    /* type */
1038
   0,     /* rightshift */
1039
   4,     /* size */
1040
   16,      /* bitsize */
1041
   false,     /* pc_relative */
1042
   0,     /* bitpos */
1043
   complain_overflow_signed, /* complain_on_overflow */
1044
   _bfd_mips_elf_generic_reloc, /* special_function */
1045
   "R_MIPS_GOT16",  /* name */
1046
   false,     /* partial_inplace */
1047
   0,     /* src_mask */
1048
   0x0000ffff,    /* dst_mask */
1049
   false),    /* pcrel_offset */
1050
1051
  /* 16 bit PC relative reference.  Note that the ABI document has a typo
1052
     and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
1053
     We do the right thing here.  */
1054
  HOWTO (R_MIPS_PC16,   /* type */
1055
   2,     /* rightshift */
1056
   4,     /* size */
1057
   16,      /* 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_MIPS_PC16",   /* name */
1063
   false,     /* partial_inplace */
1064
   0,     /* src_mask */
1065
   0x0000ffff,    /* dst_mask */
1066
   true),     /* pcrel_offset */
1067
1068
  /* 16 bit call through global offset table.  */
1069
  HOWTO (R_MIPS_CALL16,   /* type */
1070
   0,     /* rightshift */
1071
   4,     /* size */
1072
   16,      /* bitsize */
1073
   false,     /* pc_relative */
1074
   0,     /* bitpos */
1075
   complain_overflow_signed, /* complain_on_overflow */
1076
   _bfd_mips_elf_generic_reloc, /* special_function */
1077
   "R_MIPS_CALL16", /* name */
1078
   false,     /* partial_inplace */
1079
   0,     /* src_mask */
1080
   0x0000ffff,    /* dst_mask */
1081
   false),    /* pcrel_offset */
1082
1083
  /* 32 bit GP relative reference.  */
1084
  HOWTO (R_MIPS_GPREL32,  /* type */
1085
   0,     /* rightshift */
1086
   4,     /* size */
1087
   32,      /* bitsize */
1088
   false,     /* pc_relative */
1089
   0,     /* bitpos */
1090
   complain_overflow_dont, /* complain_on_overflow */
1091
   mips_elf64_gprel32_reloc, /* special_function */
1092
   "R_MIPS_GPREL32",  /* name */
1093
   false,     /* partial_inplace */
1094
   0,     /* src_mask */
1095
   0xffffffff,    /* dst_mask */
1096
   false),    /* pcrel_offset */
1097
1098
  EMPTY_HOWTO (13),
1099
  EMPTY_HOWTO (14),
1100
  EMPTY_HOWTO (15),
1101
1102
  /* A 5 bit shift field.  */
1103
  HOWTO (R_MIPS_SHIFT5,   /* type */
1104
   0,     /* rightshift */
1105
   4,     /* size */
1106
   5,     /* bitsize */
1107
   false,     /* pc_relative */
1108
   6,     /* bitpos */
1109
   complain_overflow_bitfield, /* complain_on_overflow */
1110
   _bfd_mips_elf_generic_reloc, /* special_function */
1111
   "R_MIPS_SHIFT5", /* name */
1112
   false,     /* partial_inplace */
1113
   0,     /* src_mask */
1114
   0x000007c0,    /* dst_mask */
1115
   false),    /* pcrel_offset */
1116
1117
  /* A 6 bit shift field.  */
1118
  HOWTO (R_MIPS_SHIFT6,   /* type */
1119
   0,     /* rightshift */
1120
   4,     /* size */
1121
   6,     /* bitsize */
1122
   false,     /* pc_relative */
1123
   6,     /* bitpos */
1124
   complain_overflow_bitfield, /* complain_on_overflow */
1125
   mips_elf64_shift6_reloc, /* special_function */
1126
   "R_MIPS_SHIFT6", /* name */
1127
   false,     /* partial_inplace */
1128
   0,     /* src_mask */
1129
   0x000007c4,    /* dst_mask */
1130
   false),    /* pcrel_offset */
1131
1132
  /* 64 bit relocation.  */
1133
  HOWTO (R_MIPS_64,   /* type */
1134
   0,     /* rightshift */
1135
   8,     /* size */
1136
   64,      /* bitsize */
1137
   false,     /* pc_relative */
1138
   0,     /* bitpos */
1139
   complain_overflow_dont, /* complain_on_overflow */
1140
   _bfd_mips_elf_generic_reloc, /* special_function */
1141
   "R_MIPS_64",   /* name */
1142
   false,     /* partial_inplace */
1143
   0,     /* src_mask */
1144
   MINUS_ONE,   /* dst_mask */
1145
   false),    /* pcrel_offset */
1146
1147
  /* Displacement in the global offset table.  */
1148
  HOWTO (R_MIPS_GOT_DISP, /* type */
1149
   0,     /* rightshift */
1150
   4,     /* size */
1151
   16,      /* bitsize */
1152
   false,     /* pc_relative */
1153
   0,     /* bitpos */
1154
   complain_overflow_signed, /* complain_on_overflow */
1155
   _bfd_mips_elf_generic_reloc, /* special_function */
1156
   "R_MIPS_GOT_DISP", /* name */
1157
   false,     /* partial_inplace */
1158
   0,     /* src_mask */
1159
   0x0000ffff,    /* dst_mask */
1160
   false),    /* pcrel_offset */
1161
1162
  /* Displacement to page pointer in the global offset table.  */
1163
  HOWTO (R_MIPS_GOT_PAGE, /* type */
1164
   0,     /* rightshift */
1165
   4,     /* size */
1166
   16,      /* bitsize */
1167
   false,     /* pc_relative */
1168
   0,     /* bitpos */
1169
   complain_overflow_signed, /* complain_on_overflow */
1170
   _bfd_mips_elf_generic_reloc, /* special_function */
1171
   "R_MIPS_GOT_PAGE", /* name */
1172
   false,     /* partial_inplace */
1173
   0,     /* src_mask */
1174
   0x0000ffff,    /* dst_mask */
1175
   false),    /* pcrel_offset */
1176
1177
  /* Offset from page pointer in the global offset table.  */
1178
  HOWTO (R_MIPS_GOT_OFST, /* type */
1179
   0,     /* rightshift */
1180
   4,     /* size */
1181
   16,      /* bitsize */
1182
   false,     /* pc_relative */
1183
   0,     /* bitpos */
1184
   complain_overflow_signed, /* complain_on_overflow */
1185
   _bfd_mips_elf_generic_reloc, /* special_function */
1186
   "R_MIPS_GOT_OFST", /* name */
1187
   false,     /* partial_inplace */
1188
   0,     /* src_mask */
1189
   0x0000ffff,    /* dst_mask */
1190
   false),    /* pcrel_offset */
1191
1192
  /* High 16 bits of displacement in global offset table.  */
1193
  HOWTO (R_MIPS_GOT_HI16, /* type */
1194
   16,      /* rightshift */
1195
   4,     /* size */
1196
   16,      /* bitsize */
1197
   false,     /* pc_relative */
1198
   0,     /* bitpos */
1199
   complain_overflow_dont, /* complain_on_overflow */
1200
   _bfd_mips_elf_generic_reloc, /* special_function */
1201
   "R_MIPS_GOT_HI16", /* name */
1202
   false,     /* partial_inplace */
1203
   0,     /* src_mask */
1204
   0x0000ffff,    /* dst_mask */
1205
   false),    /* pcrel_offset */
1206
1207
  /* Low 16 bits of displacement in global offset table.  */
1208
  HOWTO (R_MIPS_GOT_LO16, /* type */
1209
   0,     /* rightshift */
1210
   4,     /* size */
1211
   16,      /* bitsize */
1212
   false,     /* pc_relative */
1213
   0,     /* bitpos */
1214
   complain_overflow_dont, /* complain_on_overflow */
1215
   _bfd_mips_elf_generic_reloc, /* special_function */
1216
   "R_MIPS_GOT_LO16", /* name */
1217
   false,     /* partial_inplace */
1218
   0,     /* src_mask */
1219
   0x0000ffff,    /* dst_mask */
1220
   false),    /* pcrel_offset */
1221
1222
  /* 64 bit subtraction.  */
1223
  HOWTO (R_MIPS_SUB,    /* type */
1224
   0,     /* rightshift */
1225
   8,     /* size */
1226
   64,      /* bitsize */
1227
   false,     /* pc_relative */
1228
   0,     /* bitpos */
1229
   complain_overflow_dont, /* complain_on_overflow */
1230
   _bfd_mips_elf_generic_reloc, /* special_function */
1231
   "R_MIPS_SUB",    /* name */
1232
   false,     /* partial_inplace */
1233
   0,     /* src_mask */
1234
   MINUS_ONE,   /* dst_mask */
1235
   false),    /* pcrel_offset */
1236
1237
  /* Insert the addend as an instruction.  */
1238
  /* FIXME: Not handled correctly.  */
1239
  HOWTO (R_MIPS_INSERT_A, /* type */
1240
   0,     /* rightshift */
1241
   4,     /* size */
1242
   32,      /* bitsize */
1243
   false,     /* pc_relative */
1244
   0,     /* bitpos */
1245
   complain_overflow_dont, /* complain_on_overflow */
1246
   _bfd_mips_elf_generic_reloc, /* special_function */
1247
   "R_MIPS_INSERT_A", /* name */
1248
   false,     /* partial_inplace */
1249
   0,     /* src_mask */
1250
   0xffffffff,    /* dst_mask */
1251
   false),    /* pcrel_offset */
1252
1253
  /* Insert the addend as an instruction, and change all relocations
1254
     to refer to the old instruction at the address.  */
1255
  /* FIXME: Not handled correctly.  */
1256
  HOWTO (R_MIPS_INSERT_B, /* type */
1257
   0,     /* rightshift */
1258
   4,     /* size */
1259
   32,      /* bitsize */
1260
   false,     /* pc_relative */
1261
   0,     /* bitpos */
1262
   complain_overflow_dont, /* complain_on_overflow */
1263
   _bfd_mips_elf_generic_reloc, /* special_function */
1264
   "R_MIPS_INSERT_B", /* name */
1265
   false,     /* partial_inplace */
1266
   0,     /* src_mask */
1267
   0xffffffff,    /* dst_mask */
1268
   false),    /* pcrel_offset */
1269
1270
  /* Delete a 32 bit instruction.  */
1271
  /* FIXME: Not handled correctly.  */
1272
  HOWTO (R_MIPS_DELETE,   /* type */
1273
   0,     /* rightshift */
1274
   4,     /* size */
1275
   32,      /* bitsize */
1276
   false,     /* pc_relative */
1277
   0,     /* bitpos */
1278
   complain_overflow_dont, /* complain_on_overflow */
1279
   _bfd_mips_elf_generic_reloc, /* special_function */
1280
   "R_MIPS_DELETE", /* name */
1281
   false,     /* partial_inplace */
1282
   0,     /* src_mask */
1283
   0xffffffff,    /* dst_mask */
1284
   false),    /* pcrel_offset */
1285
1286
  /* Get the higher value of a 64 bit addend.  */
1287
  HOWTO (R_MIPS_HIGHER,   /* type */
1288
   32,      /* rightshift */
1289
   4,     /* size */
1290
   16,      /* bitsize */
1291
   false,     /* pc_relative */
1292
   0,     /* bitpos */
1293
   complain_overflow_dont, /* complain_on_overflow */
1294
   _bfd_mips_elf_generic_reloc, /* special_function */
1295
   "R_MIPS_HIGHER", /* name */
1296
   false,     /* partial_inplace */
1297
   0,     /* src_mask */
1298
   0x0000ffff,    /* dst_mask */
1299
   false),    /* pcrel_offset */
1300
1301
  /* Get the highest value of a 64 bit addend.  */
1302
  HOWTO (R_MIPS_HIGHEST,  /* type */
1303
   48,      /* rightshift */
1304
   4,     /* size */
1305
   16,      /* bitsize */
1306
   false,     /* pc_relative */
1307
   0,     /* bitpos */
1308
   complain_overflow_dont, /* complain_on_overflow */
1309
   _bfd_mips_elf_generic_reloc, /* special_function */
1310
   "R_MIPS_HIGHEST",  /* name */
1311
   false,     /* partial_inplace */
1312
   0,     /* src_mask */
1313
   0x0000ffff,    /* dst_mask */
1314
   false),    /* pcrel_offset */
1315
1316
  /* High 16 bits of displacement in global offset table.  */
1317
  HOWTO (R_MIPS_CALL_HI16,  /* type */
1318
   16,      /* rightshift */
1319
   4,     /* size */
1320
   16,      /* bitsize */
1321
   false,     /* pc_relative */
1322
   0,     /* bitpos */
1323
   complain_overflow_dont, /* complain_on_overflow */
1324
   _bfd_mips_elf_generic_reloc, /* special_function */
1325
   "R_MIPS_CALL_HI16",  /* name */
1326
   false,     /* partial_inplace */
1327
   0,     /* src_mask */
1328
   0x0000ffff,    /* dst_mask */
1329
   false),    /* pcrel_offset */
1330
1331
  /* Low 16 bits of displacement in global offset table.  */
1332
  HOWTO (R_MIPS_CALL_LO16,  /* type */
1333
   0,     /* rightshift */
1334
   4,     /* size */
1335
   16,      /* bitsize */
1336
   false,     /* pc_relative */
1337
   0,     /* bitpos */
1338
   complain_overflow_dont, /* complain_on_overflow */
1339
   _bfd_mips_elf_generic_reloc, /* special_function */
1340
   "R_MIPS_CALL_LO16",  /* name */
1341
   false,     /* partial_inplace */
1342
   0,     /* src_mask */
1343
   0x0000ffff,    /* dst_mask */
1344
   false),    /* pcrel_offset */
1345
1346
  /* Section displacement, used by an associated event location section.  */
1347
  HOWTO (R_MIPS_SCN_DISP, /* type */
1348
   0,     /* rightshift */
1349
   4,     /* size */
1350
   32,      /* bitsize */
1351
   false,     /* pc_relative */
1352
   0,     /* bitpos */
1353
   complain_overflow_dont, /* complain_on_overflow */
1354
   _bfd_mips_elf_generic_reloc, /* special_function */
1355
   "R_MIPS_SCN_DISP", /* name */
1356
   false,     /* partial_inplace */
1357
   0,     /* src_mask */
1358
   0xffffffff,    /* dst_mask */
1359
   false),    /* pcrel_offset */
1360
1361
  HOWTO (R_MIPS_REL16,    /* type */
1362
   0,     /* rightshift */
1363
   2,     /* size */
1364
   16,      /* bitsize */
1365
   false,     /* pc_relative */
1366
   0,     /* bitpos */
1367
   complain_overflow_signed, /* complain_on_overflow */
1368
   _bfd_mips_elf_generic_reloc, /* special_function */
1369
   "R_MIPS_REL16",  /* name */
1370
   false,     /* partial_inplace */
1371
   0,     /* src_mask */
1372
   0xffff,    /* dst_mask */
1373
   false),    /* pcrel_offset */
1374
1375
  /* These two are obsolete.  */
1376
  EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
1377
  EMPTY_HOWTO (R_MIPS_PJUMP),
1378
1379
  /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
1380
     It must be used for multigot GOT's (and only there).  */
1381
  HOWTO (R_MIPS_RELGOT,   /* type */
1382
   0,     /* rightshift */
1383
   4,     /* size */
1384
   32,      /* bitsize */
1385
   false,     /* pc_relative */
1386
   0,     /* bitpos */
1387
   complain_overflow_dont, /* complain_on_overflow */
1388
   _bfd_mips_elf_generic_reloc, /* special_function */
1389
   "R_MIPS_RELGOT", /* name */
1390
   false,     /* partial_inplace */
1391
   0,     /* src_mask */
1392
   0xffffffff,    /* dst_mask */
1393
   false),    /* pcrel_offset */
1394
1395
  /* Protected jump conversion.  This is an optimization hint.  No
1396
     relocation is required for correctness.  */
1397
  HOWTO (R_MIPS_JALR,   /* type */
1398
   0,     /* rightshift */
1399
   4,     /* size */
1400
   32,      /* bitsize */
1401
   false,     /* pc_relative */
1402
   0,     /* bitpos */
1403
   complain_overflow_dont, /* complain_on_overflow */
1404
   _bfd_mips_elf_generic_reloc, /* special_function */
1405
   "R_MIPS_JALR",   /* name */
1406
   false,     /* partial_inplace */
1407
   0,     /* src_mask */
1408
   0x00000000,    /* dst_mask */
1409
   false),    /* pcrel_offset */
1410
1411
  /* TLS relocations.  */
1412
  EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
1413
  EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
1414
1415
  HOWTO (R_MIPS_TLS_DTPMOD64, /* type */
1416
   0,     /* rightshift */
1417
   8,     /* size */
1418
   64,      /* bitsize */
1419
   false,     /* pc_relative */
1420
   0,     /* bitpos */
1421
   complain_overflow_dont, /* complain_on_overflow */
1422
   _bfd_mips_elf_generic_reloc, /* special_function */
1423
   "R_MIPS_TLS_DTPMOD64", /* name */
1424
   false,     /* partial_inplace */
1425
   0,     /* src_mask */
1426
   MINUS_ONE,   /* dst_mask */
1427
   false),    /* pcrel_offset */
1428
1429
  HOWTO (R_MIPS_TLS_DTPREL64, /* type */
1430
   0,     /* rightshift */
1431
   8,     /* size */
1432
   64,      /* bitsize */
1433
   false,     /* pc_relative */
1434
   0,     /* bitpos */
1435
   complain_overflow_dont, /* complain_on_overflow */
1436
   _bfd_mips_elf_generic_reloc, /* special_function */
1437
   "R_MIPS_TLS_DTPREL64", /* name */
1438
   false,     /* partial_inplace */
1439
   0,     /* src_mask */
1440
   MINUS_ONE,   /* dst_mask */
1441
   false),    /* pcrel_offset */
1442
1443
  /* TLS general dynamic variable reference.  */
1444
  HOWTO (R_MIPS_TLS_GD,   /* type */
1445
   0,     /* rightshift */
1446
   4,     /* size */
1447
   16,      /* bitsize */
1448
   false,     /* pc_relative */
1449
   0,     /* bitpos */
1450
   complain_overflow_signed, /* complain_on_overflow */
1451
   _bfd_mips_elf_generic_reloc, /* special_function */
1452
   "R_MIPS_TLS_GD", /* name */
1453
   false,     /* partial_inplace */
1454
   0,     /* src_mask */
1455
   0x0000ffff,    /* dst_mask */
1456
   false),    /* pcrel_offset */
1457
1458
  /* TLS local dynamic variable reference.  */
1459
  HOWTO (R_MIPS_TLS_LDM,  /* type */
1460
   0,     /* rightshift */
1461
   4,     /* size */
1462
   16,      /* bitsize */
1463
   false,     /* pc_relative */
1464
   0,     /* bitpos */
1465
   complain_overflow_signed, /* complain_on_overflow */
1466
   _bfd_mips_elf_generic_reloc, /* special_function */
1467
   "R_MIPS_TLS_LDM",  /* name */
1468
   false,     /* partial_inplace */
1469
   0,     /* src_mask */
1470
   0x0000ffff,    /* dst_mask */
1471
   false),    /* pcrel_offset */
1472
1473
  /* TLS local dynamic offset.  */
1474
  HOWTO (R_MIPS_TLS_DTPREL_HI16,  /* type */
1475
   16,      /* rightshift */
1476
   4,     /* size */
1477
   16,      /* bitsize */
1478
   false,     /* pc_relative */
1479
   0,     /* bitpos */
1480
   complain_overflow_signed, /* complain_on_overflow */
1481
   _bfd_mips_elf_generic_reloc, /* special_function */
1482
   "R_MIPS_TLS_DTPREL_HI16",  /* name */
1483
   false,     /* partial_inplace */
1484
   0,     /* src_mask */
1485
   0x0000ffff,    /* dst_mask */
1486
   false),    /* pcrel_offset */
1487
1488
  /* TLS local dynamic offset.  */
1489
  HOWTO (R_MIPS_TLS_DTPREL_LO16,  /* type */
1490
   0,     /* rightshift */
1491
   4,     /* size */
1492
   16,      /* bitsize */
1493
   false,     /* pc_relative */
1494
   0,     /* bitpos */
1495
   complain_overflow_dont, /* complain_on_overflow */
1496
   _bfd_mips_elf_generic_reloc, /* special_function */
1497
   "R_MIPS_TLS_DTPREL_LO16",  /* name */
1498
   false,     /* partial_inplace */
1499
   0,     /* src_mask */
1500
   0x0000ffff,    /* dst_mask */
1501
   false),    /* pcrel_offset */
1502
1503
  /* TLS thread pointer offset.  */
1504
  HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
1505
   0,     /* rightshift */
1506
   4,     /* size */
1507
   16,      /* bitsize */
1508
   false,     /* pc_relative */
1509
   0,     /* bitpos */
1510
   complain_overflow_signed, /* complain_on_overflow */
1511
   _bfd_mips_elf_generic_reloc, /* special_function */
1512
   "R_MIPS_TLS_GOTTPREL", /* name */
1513
   false,     /* partial_inplace */
1514
   0,     /* src_mask */
1515
   0x0000ffff,    /* dst_mask */
1516
   false),    /* pcrel_offset */
1517
1518
  /* TLS IE dynamic relocations.  */
1519
  EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
1520
1521
  HOWTO (R_MIPS_TLS_TPREL64,  /* type */
1522
   0,     /* rightshift */
1523
   8,     /* size */
1524
   64,      /* bitsize */
1525
   false,     /* pc_relative */
1526
   0,     /* bitpos */
1527
   complain_overflow_dont, /* complain_on_overflow */
1528
   _bfd_mips_elf_generic_reloc, /* special_function */
1529
   "R_MIPS_TLS_TPREL64",  /* name */
1530
   false,     /* partial_inplace */
1531
   0,     /* src_mask */
1532
   MINUS_ONE,   /* dst_mask */
1533
   false),    /* pcrel_offset */
1534
1535
  /* TLS thread pointer offset.  */
1536
  HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
1537
   16,      /* rightshift */
1538
   4,     /* size */
1539
   16,      /* bitsize */
1540
   false,     /* pc_relative */
1541
   0,     /* bitpos */
1542
   complain_overflow_signed, /* complain_on_overflow */
1543
   _bfd_mips_elf_generic_reloc, /* special_function */
1544
   "R_MIPS_TLS_TPREL_HI16", /* name */
1545
   false,     /* partial_inplace */
1546
   0,     /* src_mask */
1547
   0x0000ffff,    /* dst_mask */
1548
   false),    /* pcrel_offset */
1549
1550
  /* TLS thread pointer offset.  */
1551
  HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
1552
   0,     /* rightshift */
1553
   4,     /* size */
1554
   16,      /* bitsize */
1555
   false,     /* pc_relative */
1556
   0,     /* bitpos */
1557
   complain_overflow_dont, /* complain_on_overflow */
1558
   _bfd_mips_elf_generic_reloc, /* special_function */
1559
   "R_MIPS_TLS_TPREL_LO16", /* name */
1560
   false,     /* partial_inplace */
1561
   0,     /* src_mask */
1562
   0x0000ffff,    /* dst_mask */
1563
   false),    /* pcrel_offset */
1564
1565
  /* 32 bit relocation with no addend.  */
1566
  HOWTO (R_MIPS_GLOB_DAT, /* type */
1567
   0,     /* rightshift */
1568
   4,     /* size */
1569
   32,      /* bitsize */
1570
   false,     /* pc_relative */
1571
   0,     /* bitpos */
1572
   complain_overflow_dont, /* complain_on_overflow */
1573
   _bfd_mips_elf_generic_reloc, /* special_function */
1574
   "R_MIPS_GLOB_DAT", /* name */
1575
   false,     /* partial_inplace */
1576
   0x0,     /* src_mask */
1577
   0xffffffff,    /* dst_mask */
1578
   false),    /* pcrel_offset */
1579
1580
  EMPTY_HOWTO (52),
1581
  EMPTY_HOWTO (53),
1582
  EMPTY_HOWTO (54),
1583
  EMPTY_HOWTO (55),
1584
  EMPTY_HOWTO (56),
1585
  EMPTY_HOWTO (57),
1586
  EMPTY_HOWTO (58),
1587
  EMPTY_HOWTO (59),
1588
1589
  HOWTO (R_MIPS_PC21_S2,  /* type */
1590
   2,     /* rightshift */
1591
   4,     /* size */
1592
   21,      /* bitsize */
1593
   true,      /* pc_relative */
1594
   0,     /* bitpos */
1595
   complain_overflow_signed, /* complain_on_overflow */
1596
   _bfd_mips_elf_generic_reloc, /* special_function */
1597
   "R_MIPS_PC21_S2",  /* name */
1598
   false,     /* partial_inplace */
1599
   0,     /* src_mask */
1600
   0x001fffff,    /* dst_mask */
1601
   true),     /* pcrel_offset */
1602
1603
  HOWTO (R_MIPS_PC26_S2,  /* type */
1604
   2,     /* rightshift */
1605
   4,     /* size */
1606
   26,      /* bitsize */
1607
   true,      /* pc_relative */
1608
   0,     /* bitpos */
1609
   complain_overflow_signed, /* complain_on_overflow */
1610
   _bfd_mips_elf_generic_reloc, /* special_function */
1611
   "R_MIPS_PC26_S2",  /* name */
1612
   false,     /* partial_inplace */
1613
   0,     /* src_mask */
1614
   0x03ffffff,    /* dst_mask */
1615
   true),     /* pcrel_offset */
1616
1617
  HOWTO (R_MIPS_PC18_S3,  /* type */
1618
   3,     /* rightshift */
1619
   4,     /* size */
1620
   18,      /* bitsize */
1621
   true,      /* pc_relative */
1622
   0,     /* bitpos */
1623
   complain_overflow_signed, /* complain_on_overflow */
1624
   _bfd_mips_elf_generic_reloc,   /* special_function */
1625
   "R_MIPS_PC18_S3",  /* name */
1626
   false,     /* partial_inplace */
1627
   0,     /* src_mask */
1628
   0x0003ffff,    /* dst_mask */
1629
   true),     /* pcrel_offset */
1630
1631
  HOWTO (R_MIPS_PC19_S2,  /* type */
1632
   2,     /* rightshift */
1633
   4,     /* size */
1634
   19,      /* bitsize */
1635
   true,      /* pc_relative */
1636
   0,     /* bitpos */
1637
   complain_overflow_signed, /* complain_on_overflow */
1638
   _bfd_mips_elf_generic_reloc,   /* special_function */
1639
   "R_MIPS_PC19_S2",  /* name */
1640
   false,     /* partial_inplace */
1641
   0,     /* src_mask */
1642
   0x0007ffff,    /* dst_mask */
1643
   true),     /* pcrel_offset */
1644
1645
  HOWTO (R_MIPS_PCHI16,   /* type */
1646
   16,      /* rightshift */
1647
   4,     /* size */
1648
   16,      /* bitsize */
1649
   true,      /* pc_relative */
1650
   0,     /* bitpos */
1651
   complain_overflow_signed, /* complain_on_overflow */
1652
   _bfd_mips_elf_generic_reloc,   /* special_function */
1653
   "R_MIPS_PCHI16", /* name */
1654
   false,     /* partial_inplace */
1655
   0,     /* src_mask */
1656
   0x0000ffff,    /* dst_mask */
1657
   true),     /* pcrel_offset */
1658
1659
  HOWTO (R_MIPS_PCLO16,   /* type */
1660
   0,     /* rightshift */
1661
   4,     /* size */
1662
   16,      /* bitsize */
1663
   true,      /* pc_relative */
1664
   0,     /* bitpos */
1665
   complain_overflow_dont, /* complain_on_overflow */
1666
   _bfd_mips_elf_generic_reloc,   /* special_function */
1667
   "R_MIPS_PCLO16", /* name */
1668
   false,     /* partial_inplace */
1669
   0,     /* src_mask */
1670
   0x0000ffff,    /* dst_mask */
1671
   true),     /* pcrel_offset */
1672
1673
};
1674
1675
static reloc_howto_type mips16_elf64_howto_table_rel[] =
1676
{
1677
  /* The reloc used for the mips16 jump instruction.  */
1678
  HOWTO (R_MIPS16_26,   /* type */
1679
   2,     /* rightshift */
1680
   4,     /* size */
1681
   26,      /* bitsize */
1682
   false,     /* pc_relative */
1683
   0,     /* bitpos */
1684
   complain_overflow_dont, /* complain_on_overflow */
1685
        /* This needs complex overflow
1686
           detection, because the upper four
1687
           bits must match the PC.  */
1688
   _bfd_mips_elf_generic_reloc, /* special_function */
1689
   "R_MIPS16_26",   /* name */
1690
   true,      /* partial_inplace */
1691
   0x3ffffff,   /* src_mask */
1692
   0x3ffffff,   /* dst_mask */
1693
   false),    /* pcrel_offset */
1694
1695
  /* The reloc used for the mips16 gprel instruction.  */
1696
  HOWTO (R_MIPS16_GPREL,  /* type */
1697
   0,     /* rightshift */
1698
   4,     /* size */
1699
   16,      /* bitsize */
1700
   false,     /* pc_relative */
1701
   0,     /* bitpos */
1702
   complain_overflow_signed, /* complain_on_overflow */
1703
   mips16_gprel_reloc,  /* special_function */
1704
   "R_MIPS16_GPREL",  /* name */
1705
   true,      /* partial_inplace */
1706
   0x0000ffff,    /* src_mask */
1707
   0x0000ffff,    /* dst_mask */
1708
   false),    /* pcrel_offset */
1709
1710
  /* A MIPS16 reference to the global offset table.  */
1711
  HOWTO (R_MIPS16_GOT16,  /* type */
1712
   0,     /* rightshift */
1713
   4,     /* size */
1714
   16,      /* bitsize */
1715
   false,     /* pc_relative */
1716
   0,     /* bitpos */
1717
   complain_overflow_dont, /* complain_on_overflow */
1718
   _bfd_mips_elf_got16_reloc, /* special_function */
1719
   "R_MIPS16_GOT16",  /* name */
1720
   true,      /* partial_inplace */
1721
   0x0000ffff,    /* src_mask */
1722
   0x0000ffff,    /* dst_mask */
1723
   false),    /* pcrel_offset */
1724
1725
  /* A MIPS16 call through the global offset table.  */
1726
  HOWTO (R_MIPS16_CALL16, /* type */
1727
   0,     /* rightshift */
1728
   4,     /* size */
1729
   16,      /* bitsize */
1730
   false,     /* pc_relative */
1731
   0,     /* bitpos */
1732
   complain_overflow_dont, /* complain_on_overflow */
1733
   _bfd_mips_elf_generic_reloc, /* special_function */
1734
   "R_MIPS16_CALL16", /* name */
1735
   true,      /* partial_inplace */
1736
   0x0000ffff,    /* src_mask */
1737
   0x0000ffff,    /* dst_mask */
1738
   false),    /* pcrel_offset */
1739
1740
  /* MIPS16 high 16 bits of symbol value.  */
1741
  HOWTO (R_MIPS16_HI16,   /* type */
1742
   16,      /* rightshift */
1743
   4,     /* size */
1744
   16,      /* bitsize */
1745
   false,     /* pc_relative */
1746
   0,     /* bitpos */
1747
   complain_overflow_dont, /* complain_on_overflow */
1748
   _bfd_mips_elf_hi16_reloc, /* special_function */
1749
   "R_MIPS16_HI16", /* name */
1750
   true,      /* partial_inplace */
1751
   0x0000ffff,    /* src_mask */
1752
   0x0000ffff,    /* dst_mask */
1753
   false),    /* pcrel_offset */
1754
1755
  /* MIPS16 low 16 bits of symbol value.  */
1756
  HOWTO (R_MIPS16_LO16,   /* type */
1757
   0,     /* rightshift */
1758
   4,     /* size */
1759
   16,      /* bitsize */
1760
   false,     /* pc_relative */
1761
   0,     /* bitpos */
1762
   complain_overflow_dont, /* complain_on_overflow */
1763
   _bfd_mips_elf_lo16_reloc, /* special_function */
1764
   "R_MIPS16_LO16", /* name */
1765
   true,      /* partial_inplace */
1766
   0x0000ffff,    /* src_mask */
1767
   0x0000ffff,    /* dst_mask */
1768
   false),    /* pcrel_offset */
1769
1770
  /* MIPS16 TLS general dynamic variable reference.  */
1771
  HOWTO (R_MIPS16_TLS_GD, /* type */
1772
   0,     /* rightshift */
1773
   4,     /* size */
1774
   16,      /* bitsize */
1775
   false,     /* pc_relative */
1776
   0,     /* bitpos */
1777
   complain_overflow_signed, /* complain_on_overflow */
1778
   _bfd_mips_elf_generic_reloc, /* special_function */
1779
   "R_MIPS16_TLS_GD", /* name */
1780
   true,      /* partial_inplace */
1781
   0x0000ffff,    /* src_mask */
1782
   0x0000ffff,    /* dst_mask */
1783
   false),    /* pcrel_offset */
1784
1785
  /* MIPS16 TLS local dynamic variable reference.  */
1786
  HOWTO (R_MIPS16_TLS_LDM,  /* type */
1787
   0,     /* rightshift */
1788
   4,     /* size */
1789
   16,      /* bitsize */
1790
   false,     /* pc_relative */
1791
   0,     /* bitpos */
1792
   complain_overflow_signed, /* complain_on_overflow */
1793
   _bfd_mips_elf_generic_reloc, /* special_function */
1794
   "R_MIPS16_TLS_LDM",  /* name */
1795
   true,      /* partial_inplace */
1796
   0x0000ffff,    /* src_mask */
1797
   0x0000ffff,    /* dst_mask */
1798
   false),    /* pcrel_offset */
1799
1800
  /* MIPS16 TLS local dynamic offset.  */
1801
  HOWTO (R_MIPS16_TLS_DTPREL_HI16,  /* type */
1802
   16,      /* rightshift */
1803
   4,     /* size */
1804
   16,      /* bitsize */
1805
   false,     /* pc_relative */
1806
   0,     /* bitpos */
1807
   complain_overflow_signed, /* complain_on_overflow */
1808
   _bfd_mips_elf_generic_reloc, /* special_function */
1809
   "R_MIPS16_TLS_DTPREL_HI16",  /* name */
1810
   true,      /* partial_inplace */
1811
   0x0000ffff,    /* src_mask */
1812
   0x0000ffff,    /* dst_mask */
1813
   false),    /* pcrel_offset */
1814
1815
  /* MIPS16 TLS local dynamic offset.  */
1816
  HOWTO (R_MIPS16_TLS_DTPREL_LO16,  /* type */
1817
   0,     /* rightshift */
1818
   4,     /* size */
1819
   16,      /* bitsize */
1820
   false,     /* pc_relative */
1821
   0,     /* bitpos */
1822
   complain_overflow_dont, /* complain_on_overflow */
1823
   _bfd_mips_elf_generic_reloc, /* special_function */
1824
   "R_MIPS16_TLS_DTPREL_LO16",  /* name */
1825
   true,      /* partial_inplace */
1826
   0x0000ffff,    /* src_mask */
1827
   0x0000ffff,    /* dst_mask */
1828
   false),    /* pcrel_offset */
1829
1830
  /* MIPS16 TLS thread pointer offset.  */
1831
  HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
1832
   0,     /* rightshift */
1833
   4,     /* size */
1834
   16,      /* bitsize */
1835
   false,     /* pc_relative */
1836
   0,     /* bitpos */
1837
   complain_overflow_signed, /* complain_on_overflow */
1838
   _bfd_mips_elf_generic_reloc, /* special_function */
1839
   "R_MIPS16_TLS_GOTTPREL", /* name */
1840
   true,      /* partial_inplace */
1841
   0x0000ffff,    /* src_mask */
1842
   0x0000ffff,    /* dst_mask */
1843
   false),    /* pcrel_offset */
1844
1845
  /* MIPS16 TLS thread pointer offset.  */
1846
  HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
1847
   16,      /* rightshift */
1848
   4,     /* size */
1849
   16,      /* bitsize */
1850
   false,     /* pc_relative */
1851
   0,     /* bitpos */
1852
   complain_overflow_signed, /* complain_on_overflow */
1853
   _bfd_mips_elf_generic_reloc, /* special_function */
1854
   "R_MIPS16_TLS_TPREL_HI16", /* name */
1855
   true,      /* partial_inplace */
1856
   0x0000ffff,    /* src_mask */
1857
   0x0000ffff,    /* dst_mask */
1858
   false),    /* pcrel_offset */
1859
1860
  /* MIPS16 TLS thread pointer offset.  */
1861
  HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
1862
   0,     /* rightshift */
1863
   4,     /* size */
1864
   16,      /* bitsize */
1865
   false,     /* pc_relative */
1866
   0,     /* bitpos */
1867
   complain_overflow_dont, /* complain_on_overflow */
1868
   _bfd_mips_elf_generic_reloc, /* special_function */
1869
   "R_MIPS16_TLS_TPREL_LO16", /* name */
1870
   true,      /* partial_inplace */
1871
   0x0000ffff,    /* src_mask */
1872
   0x0000ffff,    /* dst_mask */
1873
   false),    /* pcrel_offset */
1874
1875
  /* MIPS16 16-bit PC-relative branch offset.  */
1876
  HOWTO (R_MIPS16_PC16_S1,  /* type */
1877
   1,     /* rightshift */
1878
   4,     /* size */
1879
   16,      /* bitsize */
1880
   true,      /* pc_relative */
1881
   0,     /* bitpos */
1882
   complain_overflow_signed, /* complain_on_overflow */
1883
   _bfd_mips_elf_generic_reloc, /* special_function */
1884
   "R_MIPS16_PC16_S1",  /* name */
1885
   true,      /* partial_inplace */
1886
   0x0000ffff,    /* src_mask */
1887
   0x0000ffff,    /* dst_mask */
1888
   true),     /* pcrel_offset */
1889
};
1890
1891
static reloc_howto_type mips16_elf64_howto_table_rela[] =
1892
{
1893
  /* The reloc used for the mips16 jump instruction.  */
1894
  HOWTO (R_MIPS16_26,   /* type */
1895
   2,     /* rightshift */
1896
   4,     /* size */
1897
   26,      /* bitsize */
1898
   false,     /* pc_relative */
1899
   0,     /* bitpos */
1900
   complain_overflow_dont, /* complain_on_overflow */
1901
        /* This needs complex overflow
1902
           detection, because the upper four
1903
           bits must match the PC.  */
1904
   _bfd_mips_elf_generic_reloc, /* special_function */
1905
   "R_MIPS16_26",   /* name */
1906
   false,     /* partial_inplace */
1907
   0,     /* src_mask */
1908
   0x3ffffff,   /* dst_mask */
1909
   false),    /* pcrel_offset */
1910
1911
  /* The reloc used for the mips16 gprel instruction.  */
1912
  HOWTO (R_MIPS16_GPREL,  /* type */
1913
   0,     /* rightshift */
1914
   4,     /* size */
1915
   16,      /* bitsize */
1916
   false,     /* pc_relative */
1917
   0,     /* bitpos */
1918
   complain_overflow_signed, /* complain_on_overflow */
1919
   mips16_gprel_reloc,  /* special_function */
1920
   "R_MIPS16_GPREL",  /* name */
1921
   false,     /* partial_inplace */
1922
   0,     /* src_mask */
1923
   0x0000ffff,    /* dst_mask */
1924
   false),    /* pcrel_offset */
1925
1926
  /* A MIPS16 reference to the global offset table.  */
1927
  HOWTO (R_MIPS16_GOT16,  /* type */
1928
   0,     /* rightshift */
1929
   4,     /* size */
1930
   16,      /* bitsize */
1931
   false,     /* pc_relative */
1932
   0,     /* bitpos */
1933
   complain_overflow_dont, /* complain_on_overflow */
1934
   _bfd_mips_elf_got16_reloc, /* special_function */
1935
   "R_MIPS16_GOT16",  /* name */
1936
   false,     /* partial_inplace */
1937
   0,     /* src_mask */
1938
   0x0000ffff,    /* dst_mask */
1939
   false),    /* pcrel_offset */
1940
1941
  /* A MIPS16 call through the global offset table.  */
1942
  HOWTO (R_MIPS16_CALL16, /* type */
1943
   0,     /* rightshift */
1944
   4,     /* size */
1945
   16,      /* bitsize */
1946
   false,     /* pc_relative */
1947
   0,     /* bitpos */
1948
   complain_overflow_dont, /* complain_on_overflow */
1949
   _bfd_mips_elf_generic_reloc, /* special_function */
1950
   "R_MIPS16_CALL16", /* name */
1951
   false,     /* partial_inplace */
1952
   0,     /* src_mask */
1953
   0x0000ffff,    /* dst_mask */
1954
   false),    /* pcrel_offset */
1955
1956
  /* MIPS16 high 16 bits of symbol value.  */
1957
  HOWTO (R_MIPS16_HI16,   /* type */
1958
   16,      /* rightshift */
1959
   4,     /* size */
1960
   16,      /* bitsize */
1961
   false,     /* pc_relative */
1962
   0,     /* bitpos */
1963
   complain_overflow_dont, /* complain_on_overflow */
1964
   _bfd_mips_elf_hi16_reloc, /* special_function */
1965
   "R_MIPS16_HI16", /* name */
1966
   false,     /* partial_inplace */
1967
   0,     /* src_mask */
1968
   0x0000ffff,    /* dst_mask */
1969
   false),    /* pcrel_offset */
1970
1971
  /* MIPS16 low 16 bits of symbol value.  */
1972
  HOWTO (R_MIPS16_LO16,   /* type */
1973
   0,     /* rightshift */
1974
   4,     /* size */
1975
   16,      /* bitsize */
1976
   false,     /* pc_relative */
1977
   0,     /* bitpos */
1978
   complain_overflow_dont, /* complain_on_overflow */
1979
   _bfd_mips_elf_lo16_reloc, /* special_function */
1980
   "R_MIPS16_LO16", /* name */
1981
   false,     /* partial_inplace */
1982
   0,     /* src_mask */
1983
   0x0000ffff,    /* dst_mask */
1984
   false),    /* pcrel_offset */
1985
1986
  /* MIPS16 TLS general dynamic variable reference.  */
1987
  HOWTO (R_MIPS16_TLS_GD, /* type */
1988
   0,     /* rightshift */
1989
   4,     /* size */
1990
   16,      /* bitsize */
1991
   false,     /* pc_relative */
1992
   0,     /* bitpos */
1993
   complain_overflow_signed, /* complain_on_overflow */
1994
   _bfd_mips_elf_generic_reloc, /* special_function */
1995
   "R_MIPS16_TLS_GD", /* name */
1996
   false,     /* partial_inplace */
1997
   0,     /* src_mask */
1998
   0x0000ffff,    /* dst_mask */
1999
   false),    /* pcrel_offset */
2000
2001
  /* MIPS16 TLS local dynamic variable reference.  */
2002
  HOWTO (R_MIPS16_TLS_LDM,  /* type */
2003
   0,     /* rightshift */
2004
   4,     /* size */
2005
   16,      /* bitsize */
2006
   false,     /* pc_relative */
2007
   0,     /* bitpos */
2008
   complain_overflow_signed, /* complain_on_overflow */
2009
   _bfd_mips_elf_generic_reloc, /* special_function */
2010
   "R_MIPS16_TLS_LDM",  /* name */
2011
   false,     /* partial_inplace */
2012
   0,     /* src_mask */
2013
   0x0000ffff,    /* dst_mask */
2014
   false),    /* pcrel_offset */
2015
2016
  /* MIPS16 TLS local dynamic offset.  */
2017
  HOWTO (R_MIPS16_TLS_DTPREL_HI16,  /* type */
2018
   16,      /* rightshift */
2019
   4,     /* size */
2020
   16,      /* bitsize */
2021
   false,     /* pc_relative */
2022
   0,     /* bitpos */
2023
   complain_overflow_signed, /* complain_on_overflow */
2024
   _bfd_mips_elf_generic_reloc, /* special_function */
2025
   "R_MIPS16_TLS_DTPREL_HI16",  /* name */
2026
   false,     /* partial_inplace */
2027
   0,     /* src_mask */
2028
   0x0000ffff,    /* dst_mask */
2029
   false),    /* pcrel_offset */
2030
2031
  /* MIPS16 TLS local dynamic offset.  */
2032
  HOWTO (R_MIPS16_TLS_DTPREL_LO16,  /* type */
2033
   0,     /* rightshift */
2034
   4,     /* size */
2035
   16,      /* bitsize */
2036
   false,     /* pc_relative */
2037
   0,     /* bitpos */
2038
   complain_overflow_dont, /* complain_on_overflow */
2039
   _bfd_mips_elf_generic_reloc, /* special_function */
2040
   "R_MIPS16_TLS_DTPREL_LO16",  /* name */
2041
   false,     /* partial_inplace */
2042
   0,     /* src_mask */
2043
   0x0000ffff,    /* dst_mask */
2044
   false),    /* pcrel_offset */
2045
2046
  /* MIPS16 TLS thread pointer offset.  */
2047
  HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
2048
   0,     /* rightshift */
2049
   4,     /* size */
2050
   16,      /* bitsize */
2051
   false,     /* pc_relative */
2052
   0,     /* bitpos */
2053
   complain_overflow_signed, /* complain_on_overflow */
2054
   _bfd_mips_elf_generic_reloc, /* special_function */
2055
   "R_MIPS16_TLS_GOTTPREL", /* name */
2056
   false,     /* partial_inplace */
2057
   0,     /* src_mask */
2058
   0x0000ffff,    /* dst_mask */
2059
   false),    /* pcrel_offset */
2060
2061
  /* MIPS16 TLS thread pointer offset.  */
2062
  HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
2063
   16,      /* rightshift */
2064
   4,     /* size */
2065
   16,      /* bitsize */
2066
   false,     /* pc_relative */
2067
   0,     /* bitpos */
2068
   complain_overflow_signed, /* complain_on_overflow */
2069
   _bfd_mips_elf_generic_reloc, /* special_function */
2070
   "R_MIPS16_TLS_TPREL_HI16", /* name */
2071
   false,     /* partial_inplace */
2072
   0,     /* src_mask */
2073
   0x0000ffff,    /* dst_mask */
2074
   false),    /* pcrel_offset */
2075
2076
  /* MIPS16 TLS thread pointer offset.  */
2077
  HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
2078
   0,     /* rightshift */
2079
   4,     /* size */
2080
   16,      /* bitsize */
2081
   false,     /* pc_relative */
2082
   0,     /* bitpos */
2083
   complain_overflow_dont, /* complain_on_overflow */
2084
   _bfd_mips_elf_generic_reloc, /* special_function */
2085
   "R_MIPS16_TLS_TPREL_LO16", /* name */
2086
   false,     /* partial_inplace */
2087
   0,     /* src_mask */
2088
   0x0000ffff,    /* dst_mask */
2089
   false),    /* pcrel_offset */
2090
2091
  /* MIPS16 16-bit PC-relative branch offset.  */
2092
  HOWTO (R_MIPS16_PC16_S1,  /* type */
2093
   1,     /* rightshift */
2094
   4,     /* size */
2095
   16,      /* bitsize */
2096
   true,      /* pc_relative */
2097
   0,     /* bitpos */
2098
   complain_overflow_signed, /* complain_on_overflow */
2099
   _bfd_mips_elf_generic_reloc, /* special_function */
2100
   "R_MIPS16_PC16_S1",  /* name */
2101
   false,     /* partial_inplace */
2102
   0,     /* src_mask */
2103
   0x0000ffff,    /* dst_mask */
2104
   true),     /* pcrel_offset */
2105
};
2106
2107
static reloc_howto_type micromips_elf64_howto_table_rel[] =
2108
{
2109
  EMPTY_HOWTO (130),
2110
  EMPTY_HOWTO (131),
2111
  EMPTY_HOWTO (132),
2112
2113
  /* 26 bit jump address.  */
2114
  HOWTO (R_MICROMIPS_26_S1, /* type */
2115
   1,     /* rightshift */
2116
   4,     /* size */
2117
   26,      /* bitsize */
2118
   false,     /* pc_relative */
2119
   0,     /* bitpos */
2120
   complain_overflow_dont, /* complain_on_overflow */
2121
        /* This needs complex overflow
2122
           detection, because the upper four
2123
           bits must match the PC.  */
2124
   _bfd_mips_elf_generic_reloc, /* special_function */
2125
   "R_MICROMIPS_26_S1", /* name */
2126
   true,      /* partial_inplace */
2127
   0x3ffffff,   /* src_mask */
2128
   0x3ffffff,   /* dst_mask */
2129
   false),    /* pcrel_offset */
2130
2131
  /* High 16 bits of symbol value.  */
2132
  HOWTO (R_MICROMIPS_HI16,  /* type */
2133
   16,      /* rightshift */
2134
   4,     /* size */
2135
   16,      /* bitsize */
2136
   false,     /* pc_relative */
2137
   0,     /* bitpos */
2138
   complain_overflow_dont, /* complain_on_overflow */
2139
   _bfd_mips_elf_hi16_reloc, /* special_function */
2140
   "R_MICROMIPS_HI16",  /* name */
2141
   true,      /* partial_inplace */
2142
   0x0000ffff,    /* src_mask */
2143
   0x0000ffff,    /* dst_mask */
2144
   false),    /* pcrel_offset */
2145
2146
  /* Low 16 bits of symbol value.  */
2147
  HOWTO (R_MICROMIPS_LO16,  /* type */
2148
   0,     /* rightshift */
2149
   4,     /* size */
2150
   16,      /* bitsize */
2151
   false,     /* pc_relative */
2152
   0,     /* bitpos */
2153
   complain_overflow_dont, /* complain_on_overflow */
2154
   _bfd_mips_elf_lo16_reloc, /* special_function */
2155
   "R_MICROMIPS_LO16",  /* name */
2156
   true,      /* partial_inplace */
2157
   0x0000ffff,    /* src_mask */
2158
   0x0000ffff,    /* dst_mask */
2159
   false),    /* pcrel_offset */
2160
2161
  /* GP relative reference.  */
2162
  HOWTO (R_MICROMIPS_GPREL16, /* type */
2163
   0,     /* rightshift */
2164
   4,     /* size */
2165
   16,      /* bitsize */
2166
   false,     /* pc_relative */
2167
   0,     /* bitpos */
2168
   complain_overflow_signed, /* complain_on_overflow */
2169
   _bfd_mips_elf32_gprel16_reloc, /* special_function */
2170
   "R_MICROMIPS_GPREL16", /* name */
2171
   true,      /* partial_inplace */
2172
   0x0000ffff,    /* src_mask */
2173
   0x0000ffff,    /* dst_mask */
2174
   false),    /* pcrel_offset */
2175
2176
  /* Reference to literal section.  */
2177
  HOWTO (R_MICROMIPS_LITERAL, /* type */
2178
   0,     /* rightshift */
2179
   4,     /* size */
2180
   16,      /* bitsize */
2181
   false,     /* pc_relative */
2182
   0,     /* bitpos */
2183
   complain_overflow_signed, /* complain_on_overflow */
2184
   _bfd_mips_elf32_gprel16_reloc, /* special_function */
2185
   "R_MICROMIPS_LITERAL", /* name */
2186
   true,      /* partial_inplace */
2187
   0x0000ffff,    /* src_mask */
2188
   0x0000ffff,    /* dst_mask */
2189
   false),    /* pcrel_offset */
2190
2191
  /* Reference to global offset table.  */
2192
  HOWTO (R_MICROMIPS_GOT16, /* type */
2193
   0,     /* rightshift */
2194
   4,     /* size */
2195
   16,      /* bitsize */
2196
   false,     /* pc_relative */
2197
   0,     /* bitpos */
2198
   complain_overflow_signed, /* complain_on_overflow */
2199
   _bfd_mips_elf_got16_reloc, /* special_function */
2200
   "R_MICROMIPS_GOT16", /* name */
2201
   true,      /* partial_inplace */
2202
   0x0000ffff,    /* src_mask */
2203
   0x0000ffff,    /* dst_mask */
2204
   false),    /* pcrel_offset */
2205
2206
  /* This is for microMIPS branches.  */
2207
  HOWTO (R_MICROMIPS_PC7_S1,  /* type */
2208
   1,     /* rightshift */
2209
   2,     /* size */
2210
   7,     /* bitsize */
2211
   true,      /* pc_relative */
2212
   0,     /* bitpos */
2213
   complain_overflow_signed, /* complain_on_overflow */
2214
   _bfd_mips_elf_generic_reloc, /* special_function */
2215
   "R_MICROMIPS_PC7_S1",  /* name */
2216
   true,      /* partial_inplace */
2217
   0x0000007f,    /* src_mask */
2218
   0x0000007f,    /* dst_mask */
2219
   true),     /* pcrel_offset */
2220
2221
  HOWTO (R_MICROMIPS_PC10_S1, /* type */
2222
   1,     /* rightshift */
2223
   2,     /* size */
2224
   10,      /* bitsize */
2225
   true,      /* pc_relative */
2226
   0,     /* bitpos */
2227
   complain_overflow_signed, /* complain_on_overflow */
2228
   _bfd_mips_elf_generic_reloc, /* special_function */
2229
   "R_MICROMIPS_PC10_S1", /* name */
2230
   true,      /* partial_inplace */
2231
   0x000003ff,    /* src_mask */
2232
   0x000003ff,    /* dst_mask */
2233
   true),     /* pcrel_offset */
2234
2235
  HOWTO (R_MICROMIPS_PC16_S1, /* type */
2236
   1,     /* rightshift */
2237
   4,     /* size */
2238
   16,      /* bitsize */
2239
   true,      /* pc_relative */
2240
   0,     /* bitpos */
2241
   complain_overflow_signed, /* complain_on_overflow */
2242
   _bfd_mips_elf_generic_reloc, /* special_function */
2243
   "R_MICROMIPS_PC16_S1", /* name */
2244
   true,      /* partial_inplace */
2245
   0x0000ffff,    /* src_mask */
2246
   0x0000ffff,    /* dst_mask */
2247
   true),     /* pcrel_offset */
2248
2249
  /* 16 bit call through global offset table.  */
2250
  HOWTO (R_MICROMIPS_CALL16,  /* type */
2251
   0,     /* rightshift */
2252
   4,     /* size */
2253
   16,      /* bitsize */
2254
   false,     /* pc_relative */
2255
   0,     /* bitpos */
2256
   complain_overflow_signed, /* complain_on_overflow */
2257
   _bfd_mips_elf_generic_reloc, /* special_function */
2258
   "R_MICROMIPS_CALL16",  /* name */
2259
   true,      /* partial_inplace */
2260
   0x0000ffff,    /* src_mask */
2261
   0x0000ffff,    /* dst_mask */
2262
   false),    /* pcrel_offset */
2263
2264
  EMPTY_HOWTO (143),
2265
  EMPTY_HOWTO (144),
2266
2267
  /* Displacement in the global offset table.  */
2268
  HOWTO (R_MICROMIPS_GOT_DISP,  /* type */
2269
   0,     /* rightshift */
2270
   4,     /* size */
2271
   16,      /* bitsize */
2272
   false,     /* pc_relative */
2273
   0,     /* bitpos */
2274
   complain_overflow_signed, /* complain_on_overflow */
2275
   _bfd_mips_elf_generic_reloc, /* special_function */
2276
   "R_MICROMIPS_GOT_DISP",/* name */
2277
   true,      /* partial_inplace */
2278
   0x0000ffff,    /* src_mask */
2279
   0x0000ffff,    /* dst_mask */
2280
   false),    /* pcrel_offset */
2281
2282
  /* Displacement to page pointer in the global offset table.  */
2283
  HOWTO (R_MICROMIPS_GOT_PAGE,  /* type */
2284
   0,     /* rightshift */
2285
   4,     /* size */
2286
   16,      /* bitsize */
2287
   false,     /* pc_relative */
2288
   0,     /* bitpos */
2289
   complain_overflow_signed, /* complain_on_overflow */
2290
   _bfd_mips_elf_generic_reloc, /* special_function */
2291
   "R_MICROMIPS_GOT_PAGE",/* name */
2292
   true,      /* partial_inplace */
2293
   0x0000ffff,    /* src_mask */
2294
   0x0000ffff,    /* dst_mask */
2295
   false),    /* pcrel_offset */
2296
2297
  /* Offset from page pointer in the global offset table.  */
2298
  HOWTO (R_MICROMIPS_GOT_OFST,  /* type */
2299
   0,     /* rightshift */
2300
   4,     /* size */
2301
   16,      /* bitsize */
2302
   false,     /* pc_relative */
2303
   0,     /* bitpos */
2304
   complain_overflow_signed, /* complain_on_overflow */
2305
   _bfd_mips_elf_generic_reloc, /* special_function */
2306
   "R_MICROMIPS_GOT_OFST",/* name */
2307
   true,      /* partial_inplace */
2308
   0x0000ffff,    /* src_mask */
2309
   0x0000ffff,    /* dst_mask */
2310
   false),    /* pcrel_offset */
2311
2312
  /* High 16 bits of displacement in global offset table.  */
2313
  HOWTO (R_MICROMIPS_GOT_HI16,  /* type */
2314
   16,      /* rightshift */
2315
   4,     /* size */
2316
   16,      /* bitsize */
2317
   false,     /* pc_relative */
2318
   0,     /* bitpos */
2319
   complain_overflow_dont, /* complain_on_overflow */
2320
   _bfd_mips_elf_generic_reloc, /* special_function */
2321
   "R_MICROMIPS_GOT_HI16",/* name */
2322
   true,      /* partial_inplace */
2323
   0x0000ffff,    /* src_mask */
2324
   0x0000ffff,    /* dst_mask */
2325
   false),    /* pcrel_offset */
2326
2327
  /* Low 16 bits of displacement in global offset table.  */
2328
  HOWTO (R_MICROMIPS_GOT_LO16,  /* type */
2329
   0,     /* rightshift */
2330
   4,     /* size */
2331
   16,      /* bitsize */
2332
   false,     /* pc_relative */
2333
   0,     /* bitpos */
2334
   complain_overflow_dont, /* complain_on_overflow */
2335
   _bfd_mips_elf_generic_reloc, /* special_function */
2336
   "R_MICROMIPS_GOT_LO16",/* name */
2337
   true,      /* partial_inplace */
2338
   0x0000ffff,    /* src_mask */
2339
   0x0000ffff,    /* dst_mask */
2340
   false),    /* pcrel_offset */
2341
2342
  /* 64 bit subtraction.  Used in the N32 ABI.  */
2343
  HOWTO (R_MICROMIPS_SUB, /* type */
2344
   0,     /* rightshift */
2345
   8,     /* size */
2346
   64,      /* bitsize */
2347
   false,     /* pc_relative */
2348
   0,     /* bitpos */
2349
   complain_overflow_dont, /* complain_on_overflow */
2350
   _bfd_mips_elf_generic_reloc, /* special_function */
2351
   "R_MICROMIPS_SUB", /* name */
2352
   true,      /* partial_inplace */
2353
   MINUS_ONE,   /* src_mask */
2354
   MINUS_ONE,   /* dst_mask */
2355
   false),    /* pcrel_offset */
2356
2357
  /* We don't support these for REL relocations, because it means building
2358
     the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
2359
     R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
2360
     using fallable heuristics.  */
2361
  EMPTY_HOWTO (R_MICROMIPS_HIGHER),
2362
  EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
2363
2364
  /* High 16 bits of displacement in global offset table.  */
2365
  HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2366
   16,      /* rightshift */
2367
   4,     /* size */
2368
   16,      /* bitsize */
2369
   false,     /* pc_relative */
2370
   0,     /* bitpos */
2371
   complain_overflow_dont, /* complain_on_overflow */
2372
   _bfd_mips_elf_generic_reloc, /* special_function */
2373
   "R_MICROMIPS_CALL_HI16",/* name */
2374
   true,      /* partial_inplace */
2375
   0x0000ffff,    /* src_mask */
2376
   0x0000ffff,    /* dst_mask */
2377
   false),    /* pcrel_offset */
2378
2379
  /* Low 16 bits of displacement in global offset table.  */
2380
  HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2381
   0,     /* rightshift */
2382
   4,     /* size */
2383
   16,      /* bitsize */
2384
   false,     /* pc_relative */
2385
   0,     /* bitpos */
2386
   complain_overflow_dont, /* complain_on_overflow */
2387
   _bfd_mips_elf_generic_reloc, /* special_function */
2388
   "R_MICROMIPS_CALL_LO16",/* name */
2389
   true,      /* partial_inplace */
2390
   0x0000ffff,    /* src_mask */
2391
   0x0000ffff,    /* dst_mask */
2392
   false),    /* pcrel_offset */
2393
2394
  /* Section displacement.  */
2395
  HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
2396
   0,     /* rightshift */
2397
   4,     /* size */
2398
   32,      /* bitsize */
2399
   false,     /* pc_relative */
2400
   0,     /* bitpos */
2401
   complain_overflow_dont, /* complain_on_overflow */
2402
   _bfd_mips_elf_generic_reloc, /* special_function */
2403
   "R_MICROMIPS_SCN_DISP", /* name */
2404
   true,      /* partial_inplace */
2405
   0xffffffff,    /* src_mask */
2406
   0xffffffff,    /* dst_mask */
2407
   false),    /* pcrel_offset */
2408
2409
  /* Protected jump conversion.  This is an optimization hint.  No
2410
     relocation is required for correctness.  */
2411
  HOWTO (R_MICROMIPS_JALR,  /* type */
2412
   0,     /* rightshift */
2413
   4,     /* size */
2414
   32,      /* bitsize */
2415
   false,     /* pc_relative */
2416
   0,     /* bitpos */
2417
   complain_overflow_dont, /* complain_on_overflow */
2418
   _bfd_mips_elf_generic_reloc, /* special_function */
2419
   "R_MICROMIPS_JALR",  /* name */
2420
   false,     /* partial_inplace */
2421
   0,     /* src_mask */
2422
   0x00000000,    /* dst_mask */
2423
   false),    /* pcrel_offset */
2424
2425
  /* Low 16 bits of symbol value.  Note that the high 16 bits of symbol values
2426
     must be zero.  This is used for relaxation.  */
2427
  HOWTO (R_MICROMIPS_HI0_LO16,  /* type */
2428
   0,     /* rightshift */
2429
   4,     /* size */
2430
   16,      /* bitsize */
2431
   false,     /* pc_relative */
2432
   0,     /* bitpos */
2433
   complain_overflow_dont, /* complain_on_overflow */
2434
   _bfd_mips_elf_generic_reloc, /* special_function */
2435
   "R_MICROMIPS_HI0_LO16",/* name */
2436
   true,      /* partial_inplace */
2437
   0x0000ffff,    /* src_mask */
2438
   0x0000ffff,    /* dst_mask */
2439
   false),    /* pcrel_offset */
2440
2441
  EMPTY_HOWTO (158),
2442
  EMPTY_HOWTO (159),
2443
  EMPTY_HOWTO (160),
2444
  EMPTY_HOWTO (161),
2445
2446
  /* TLS general dynamic variable reference.  */
2447
  HOWTO (R_MICROMIPS_TLS_GD,    /* type */
2448
   0,     /* rightshift */
2449
   4,     /* size */
2450
   16,      /* bitsize */
2451
   false,     /* pc_relative */
2452
   0,     /* bitpos */
2453
   complain_overflow_signed, /* complain_on_overflow */
2454
   _bfd_mips_elf_generic_reloc, /* special_function */
2455
   "R_MICROMIPS_TLS_GD",  /* name */
2456
   true,      /* partial_inplace */
2457
   0x0000ffff,    /* src_mask */
2458
   0x0000ffff,    /* dst_mask */
2459
   false),    /* pcrel_offset */
2460
2461
  /* TLS local dynamic variable reference.  */
2462
  HOWTO (R_MICROMIPS_TLS_LDM, /* type */
2463
   0,     /* rightshift */
2464
   4,     /* size */
2465
   16,      /* bitsize */
2466
   false,     /* pc_relative */
2467
   0,     /* bitpos */
2468
   complain_overflow_signed, /* complain_on_overflow */
2469
   _bfd_mips_elf_generic_reloc, /* special_function */
2470
   "R_MICROMIPS_TLS_LDM", /* name */
2471
   true,      /* partial_inplace */
2472
   0x0000ffff,    /* src_mask */
2473
   0x0000ffff,    /* dst_mask */
2474
   false),    /* pcrel_offset */
2475
2476
  /* TLS local dynamic offset.  */
2477
  HOWTO (R_MICROMIPS_TLS_DTPREL_HI16, /* type */
2478
   16,      /* rightshift */
2479
   4,     /* size */
2480
   16,      /* bitsize */
2481
   false,     /* pc_relative */
2482
   0,     /* bitpos */
2483
   complain_overflow_signed, /* complain_on_overflow */
2484
   _bfd_mips_elf_generic_reloc, /* special_function */
2485
   "R_MICROMIPS_TLS_DTPREL_HI16", /* name */
2486
   true,      /* partial_inplace */
2487
   0x0000ffff,    /* src_mask */
2488
   0x0000ffff,    /* dst_mask */
2489
   false),    /* pcrel_offset */
2490
2491
  /* TLS local dynamic offset.  */
2492
  HOWTO (R_MICROMIPS_TLS_DTPREL_LO16, /* type */
2493
   0,     /* rightshift */
2494
   4,     /* size */
2495
   16,      /* bitsize */
2496
   false,     /* pc_relative */
2497
   0,     /* bitpos */
2498
   complain_overflow_dont, /* complain_on_overflow */
2499
   _bfd_mips_elf_generic_reloc, /* special_function */
2500
   "R_MICROMIPS_TLS_DTPREL_LO16", /* name */
2501
   true,      /* partial_inplace */
2502
   0x0000ffff,    /* src_mask */
2503
   0x0000ffff,    /* dst_mask */
2504
   false),    /* pcrel_offset */
2505
2506
  /* TLS thread pointer offset.  */
2507
  HOWTO (R_MICROMIPS_TLS_GOTTPREL,  /* type */
2508
   0,     /* rightshift */
2509
   4,     /* size */
2510
   16,      /* bitsize */
2511
   false,     /* pc_relative */
2512
   0,     /* bitpos */
2513
   complain_overflow_signed, /* complain_on_overflow */
2514
   _bfd_mips_elf_generic_reloc, /* special_function */
2515
   "R_MICROMIPS_TLS_GOTTPREL",  /* name */
2516
   true,      /* partial_inplace */
2517
   0x0000ffff,    /* src_mask */
2518
   0x0000ffff,    /* dst_mask */
2519
   false),    /* pcrel_offset */
2520
2521
  EMPTY_HOWTO (167),
2522
  EMPTY_HOWTO (168),
2523
2524
  /* TLS thread pointer offset.  */
2525
  HOWTO (R_MICROMIPS_TLS_TPREL_HI16,  /* type */
2526
   16,      /* rightshift */
2527
   4,     /* size */
2528
   16,      /* bitsize */
2529
   false,     /* pc_relative */
2530
   0,     /* bitpos */
2531
   complain_overflow_signed, /* complain_on_overflow */
2532
   _bfd_mips_elf_generic_reloc, /* special_function */
2533
   "R_MICROMIPS_TLS_TPREL_HI16", /* name */
2534
   true,      /* partial_inplace */
2535
   0x0000ffff,    /* src_mask */
2536
   0x0000ffff,    /* dst_mask */
2537
   false),    /* pcrel_offset */
2538
2539
  /* TLS thread pointer offset.  */
2540
  HOWTO (R_MICROMIPS_TLS_TPREL_LO16,  /* type */
2541
   0,     /* rightshift */
2542
   4,     /* size */
2543
   16,      /* bitsize */
2544
   false,     /* pc_relative */
2545
   0,     /* bitpos */
2546
   complain_overflow_dont, /* complain_on_overflow */
2547
   _bfd_mips_elf_generic_reloc, /* special_function */
2548
   "R_MICROMIPS_TLS_TPREL_LO16", /* name */
2549
   true,      /* partial_inplace */
2550
   0x0000ffff,    /* src_mask */
2551
   0x0000ffff,    /* dst_mask */
2552
   false),    /* pcrel_offset */
2553
2554
  EMPTY_HOWTO (171),
2555
2556
  /* GP- and PC-relative relocations.  */
2557
  HOWTO (R_MICROMIPS_GPREL7_S2, /* type */
2558
   2,     /* rightshift */
2559
   2,     /* size */
2560
   7,     /* bitsize */
2561
   false,     /* pc_relative */
2562
   0,     /* bitpos */
2563
   complain_overflow_signed, /* complain_on_overflow */
2564
   _bfd_mips_elf32_gprel16_reloc, /* special_function */
2565
   "R_MICROMIPS_GPREL7_S2", /* name */
2566
   true,      /* partial_inplace */
2567
   0x0000007f,    /* src_mask */
2568
   0x0000007f,    /* dst_mask */
2569
   false),    /* pcrel_offset */
2570
2571
  HOWTO (R_MICROMIPS_PC23_S2, /* type */
2572
   2,     /* rightshift */
2573
   4,     /* size */
2574
   23,      /* bitsize */
2575
   true,      /* pc_relative */
2576
   0,     /* bitpos */
2577
   complain_overflow_signed, /* complain_on_overflow */
2578
   _bfd_mips_elf_generic_reloc, /* special_function */
2579
   "R_MICROMIPS_PC23_S2", /* name */
2580
   true,      /* partial_inplace */
2581
   0x007fffff,    /* src_mask */
2582
   0x007fffff,    /* dst_mask */
2583
   true),     /* pcrel_offset */
2584
};
2585
2586
static reloc_howto_type micromips_elf64_howto_table_rela[] =
2587
{
2588
  EMPTY_HOWTO (130),
2589
  EMPTY_HOWTO (131),
2590
  EMPTY_HOWTO (132),
2591
2592
  /* 26 bit jump address.  */
2593
  HOWTO (R_MICROMIPS_26_S1, /* type */
2594
   1,     /* rightshift */
2595
   4,     /* size */
2596
   26,      /* bitsize */
2597
   false,     /* pc_relative */
2598
   0,     /* bitpos */
2599
   complain_overflow_dont, /* complain_on_overflow */
2600
        /* This needs complex overflow
2601
           detection, because the upper four
2602
           bits must match the PC.  */
2603
   _bfd_mips_elf_generic_reloc, /* special_function */
2604
   "R_MICROMIPS_26_S1", /* name */
2605
   false,     /* partial_inplace */
2606
   0,     /* src_mask */
2607
   0x3ffffff,   /* dst_mask */
2608
   false),    /* pcrel_offset */
2609
2610
  /* High 16 bits of symbol value.  */
2611
  HOWTO (R_MICROMIPS_HI16,  /* type */
2612
   16,      /* rightshift */
2613
   4,     /* size */
2614
   16,      /* bitsize */
2615
   false,     /* pc_relative */
2616
   0,     /* bitpos */
2617
   complain_overflow_dont, /* complain_on_overflow */
2618
   _bfd_mips_elf_hi16_reloc, /* special_function */
2619
   "R_MICROMIPS_HI16",  /* name */
2620
   false,     /* partial_inplace */
2621
   0,     /* src_mask */
2622
   0x0000ffff,    /* dst_mask */
2623
   false),    /* pcrel_offset */
2624
2625
  /* Low 16 bits of symbol value.  */
2626
  HOWTO (R_MICROMIPS_LO16,  /* type */
2627
   0,     /* rightshift */
2628
   4,     /* size */
2629
   16,      /* bitsize */
2630
   false,     /* pc_relative */
2631
   0,     /* bitpos */
2632
   complain_overflow_dont, /* complain_on_overflow */
2633
   _bfd_mips_elf_lo16_reloc, /* special_function */
2634
   "R_MICROMIPS_LO16",  /* name */
2635
   false,     /* partial_inplace */
2636
   0,     /* src_mask */
2637
   0x0000ffff,    /* dst_mask */
2638
   false),    /* pcrel_offset */
2639
2640
  /* GP relative reference.  */
2641
  HOWTO (R_MICROMIPS_GPREL16, /* type */
2642
   0,     /* rightshift */
2643
   4,     /* size */
2644
   16,      /* bitsize */
2645
   false,     /* pc_relative */
2646
   0,     /* bitpos */
2647
   complain_overflow_signed, /* complain_on_overflow */
2648
   _bfd_mips_elf32_gprel16_reloc, /* special_function */
2649
   "R_MICROMIPS_GPREL16", /* name */
2650
   false,     /* partial_inplace */
2651
   0,     /* src_mask */
2652
   0x0000ffff,    /* dst_mask */
2653
   false),    /* pcrel_offset */
2654
2655
  /* Reference to literal section.  */
2656
  HOWTO (R_MICROMIPS_LITERAL, /* type */
2657
   0,     /* rightshift */
2658
   4,     /* size */
2659
   16,      /* bitsize */
2660
   false,     /* pc_relative */
2661
   0,     /* bitpos */
2662
   complain_overflow_signed, /* complain_on_overflow */
2663
   _bfd_mips_elf32_gprel16_reloc, /* special_function */
2664
   "R_MICROMIPS_LITERAL", /* name */
2665
   false,     /* partial_inplace */
2666
   0,     /* src_mask */
2667
   0x0000ffff,    /* dst_mask */
2668
   false),    /* pcrel_offset */
2669
2670
  /* Reference to global offset table.  */
2671
  HOWTO (R_MICROMIPS_GOT16, /* type */
2672
   0,     /* rightshift */
2673
   4,     /* size */
2674
   16,      /* bitsize */
2675
   false,     /* pc_relative */
2676
   0,     /* bitpos */
2677
   complain_overflow_signed, /* complain_on_overflow */
2678
   _bfd_mips_elf_got16_reloc, /* special_function */
2679
   "R_MICROMIPS_GOT16", /* name */
2680
   false,     /* partial_inplace */
2681
   0,     /* src_mask */
2682
   0x0000ffff,    /* dst_mask */
2683
   false),    /* pcrel_offset */
2684
2685
  /* This is for microMIPS branches.  */
2686
  HOWTO (R_MICROMIPS_PC7_S1,  /* type */
2687
   1,     /* rightshift */
2688
   2,     /* size */
2689
   7,     /* bitsize */
2690
   true,      /* pc_relative */
2691
   0,     /* bitpos */
2692
   complain_overflow_signed, /* complain_on_overflow */
2693
   _bfd_mips_elf_generic_reloc, /* special_function */
2694
   "R_MICROMIPS_PC7_S1",  /* name */
2695
   false,     /* partial_inplace */
2696
   0,     /* src_mask */
2697
   0x0000007f,    /* dst_mask */
2698
   true),     /* pcrel_offset */
2699
2700
  HOWTO (R_MICROMIPS_PC10_S1, /* type */
2701
   1,     /* rightshift */
2702
   2,     /* size */
2703
   10,      /* bitsize */
2704
   true,      /* pc_relative */
2705
   0,     /* bitpos */
2706
   complain_overflow_signed, /* complain_on_overflow */
2707
   _bfd_mips_elf_generic_reloc, /* special_function */
2708
   "R_MICROMIPS_PC10_S1", /* name */
2709
   false,     /* partial_inplace */
2710
   0,     /* src_mask */
2711
   0x000003ff,    /* dst_mask */
2712
   true),     /* pcrel_offset */
2713
2714
  HOWTO (R_MICROMIPS_PC16_S1, /* type */
2715
   1,     /* rightshift */
2716
   4,     /* size */
2717
   16,      /* bitsize */
2718
   true,      /* pc_relative */
2719
   0,     /* bitpos */
2720
   complain_overflow_signed, /* complain_on_overflow */
2721
   _bfd_mips_elf_generic_reloc, /* special_function */
2722
   "R_MICROMIPS_PC16_S1", /* name */
2723
   false,     /* partial_inplace */
2724
   0,     /* src_mask */
2725
   0x0000ffff,    /* dst_mask */
2726
   true),     /* pcrel_offset */
2727
2728
  /* 16 bit call through global offset table.  */
2729
  HOWTO (R_MICROMIPS_CALL16,  /* type */
2730
   0,     /* rightshift */
2731
   4,     /* size */
2732
   16,      /* bitsize */
2733
   false,     /* pc_relative */
2734
   0,     /* bitpos */
2735
   complain_overflow_signed, /* complain_on_overflow */
2736
   _bfd_mips_elf_generic_reloc, /* special_function */
2737
   "R_MICROMIPS_CALL16",  /* name */
2738
   false,     /* partial_inplace */
2739
   0,     /* src_mask */
2740
   0x0000ffff,    /* dst_mask */
2741
   false),    /* pcrel_offset */
2742
2743
  EMPTY_HOWTO (143),
2744
  EMPTY_HOWTO (144),
2745
2746
  /* Displacement in the global offset table.  */
2747
  HOWTO (R_MICROMIPS_GOT_DISP,  /* type */
2748
   0,     /* rightshift */
2749
   4,     /* size */
2750
   16,      /* bitsize */
2751
   false,     /* pc_relative */
2752
   0,     /* bitpos */
2753
   complain_overflow_signed, /* complain_on_overflow */
2754
   _bfd_mips_elf_generic_reloc, /* special_function */
2755
   "R_MICROMIPS_GOT_DISP",/* name */
2756
   false,     /* partial_inplace */
2757
   0,     /* src_mask */
2758
   0x0000ffff,    /* dst_mask */
2759
   false),    /* pcrel_offset */
2760
2761
  /* Displacement to page pointer in the global offset table.  */
2762
  HOWTO (R_MICROMIPS_GOT_PAGE,  /* type */
2763
   0,     /* rightshift */
2764
   4,     /* size */
2765
   16,      /* bitsize */
2766
   false,     /* pc_relative */
2767
   0,     /* bitpos */
2768
   complain_overflow_signed, /* complain_on_overflow */
2769
   _bfd_mips_elf_generic_reloc, /* special_function */
2770
   "R_MICROMIPS_GOT_PAGE",/* name */
2771
   false,     /* partial_inplace */
2772
   0,     /* src_mask */
2773
   0x0000ffff,    /* dst_mask */
2774
   false),    /* pcrel_offset */
2775
2776
  /* Offset from page pointer in the global offset table.  */
2777
  HOWTO (R_MICROMIPS_GOT_OFST,  /* type */
2778
   0,     /* rightshift */
2779
   4,     /* size */
2780
   16,      /* bitsize */
2781
   false,     /* pc_relative */
2782
   0,     /* bitpos */
2783
   complain_overflow_signed, /* complain_on_overflow */
2784
   _bfd_mips_elf_generic_reloc, /* special_function */
2785
   "R_MICROMIPS_GOT_OFST",/* name */
2786
   false,     /* partial_inplace */
2787
   0,     /* src_mask */
2788
   0x0000ffff,    /* dst_mask */
2789
   false),    /* pcrel_offset */
2790
2791
  /* High 16 bits of displacement in global offset table.  */
2792
  HOWTO (R_MICROMIPS_GOT_HI16,  /* type */
2793
   16,      /* rightshift */
2794
   4,     /* size */
2795
   16,      /* bitsize */
2796
   false,     /* pc_relative */
2797
   0,     /* bitpos */
2798
   complain_overflow_dont, /* complain_on_overflow */
2799
   _bfd_mips_elf_generic_reloc, /* special_function */
2800
   "R_MICROMIPS_GOT_HI16",/* name */
2801
   false,     /* partial_inplace */
2802
   0,     /* src_mask */
2803
   0x0000ffff,    /* dst_mask */
2804
   false),    /* pcrel_offset */
2805
2806
  /* Low 16 bits of displacement in global offset table.  */
2807
  HOWTO (R_MICROMIPS_GOT_LO16,  /* type */
2808
   0,     /* rightshift */
2809
   4,     /* size */
2810
   16,      /* bitsize */
2811
   false,     /* pc_relative */
2812
   0,     /* bitpos */
2813
   complain_overflow_dont, /* complain_on_overflow */
2814
   _bfd_mips_elf_generic_reloc, /* special_function */
2815
   "R_MICROMIPS_GOT_LO16",/* name */
2816
   false,     /* partial_inplace */
2817
   0,     /* src_mask */
2818
   0x0000ffff,    /* dst_mask */
2819
   false),    /* pcrel_offset */
2820
2821
  /* 64 bit subtraction.  Used in the N32 ABI.  */
2822
  HOWTO (R_MICROMIPS_SUB, /* type */
2823
   0,     /* rightshift */
2824
   8,     /* size */
2825
   64,      /* bitsize */
2826
   false,     /* pc_relative */
2827
   0,     /* bitpos */
2828
   complain_overflow_dont, /* complain_on_overflow */
2829
   _bfd_mips_elf_generic_reloc, /* special_function */
2830
   "R_MICROMIPS_SUB", /* name */
2831
   false,     /* partial_inplace */
2832
   0,     /* src_mask */
2833
   MINUS_ONE,   /* dst_mask */
2834
   false),    /* pcrel_offset */
2835
2836
  /* Get the higher value of a 64 bit addend.  */
2837
  HOWTO (R_MICROMIPS_HIGHER,  /* type */
2838
   32,      /* rightshift */
2839
   4,     /* size */
2840
   16,      /* bitsize */
2841
   false,     /* pc_relative */
2842
   0,     /* bitpos */
2843
   complain_overflow_dont, /* complain_on_overflow */
2844
   _bfd_mips_elf_generic_reloc, /* special_function */
2845
   "R_MICROMIPS_HIGHER",  /* name */
2846
   false,     /* partial_inplace */
2847
   0,     /* src_mask */
2848
   0x0000ffff,    /* dst_mask */
2849
   false),    /* pcrel_offset */
2850
2851
  /* Get the highest value of a 64 bit addend.  */
2852
  HOWTO (R_MICROMIPS_HIGHEST, /* type */
2853
   48,      /* rightshift */
2854
   4,     /* size */
2855
   16,      /* bitsize */
2856
   false,     /* pc_relative */
2857
   0,     /* bitpos */
2858
   complain_overflow_dont, /* complain_on_overflow */
2859
   _bfd_mips_elf_generic_reloc, /* special_function */
2860
   "R_MICROMIPS_HIGHEST", /* name */
2861
   false,     /* partial_inplace */
2862
   0,     /* src_mask */
2863
   0x0000ffff,    /* dst_mask */
2864
   false),    /* pcrel_offset */
2865
2866
  /* High 16 bits of displacement in global offset table.  */
2867
  HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2868
   16,      /* rightshift */
2869
   4,     /* size */
2870
   16,      /* bitsize */
2871
   false,     /* pc_relative */
2872
   0,     /* bitpos */
2873
   complain_overflow_dont, /* complain_on_overflow */
2874
   _bfd_mips_elf_generic_reloc, /* special_function */
2875
   "R_MICROMIPS_CALL_HI16",/* name */
2876
   false,     /* partial_inplace */
2877
   0,     /* src_mask */
2878
   0x0000ffff,    /* dst_mask */
2879
   false),    /* pcrel_offset */
2880
2881
  /* Low 16 bits of displacement in global offset table.  */
2882
  HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2883
   0,     /* rightshift */
2884
   4,     /* size */
2885
   16,      /* bitsize */
2886
   false,     /* pc_relative */
2887
   0,     /* bitpos */
2888
   complain_overflow_dont, /* complain_on_overflow */
2889
   _bfd_mips_elf_generic_reloc, /* special_function */
2890
   "R_MICROMIPS_CALL_LO16",/* name */
2891
   false,     /* partial_inplace */
2892
   0,     /* src_mask */
2893
   0x0000ffff,    /* dst_mask */
2894
   false),    /* pcrel_offset */
2895
2896
  /* Section displacement.  */
2897
  HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
2898
   0,     /* rightshift */
2899
   4,     /* size */
2900
   32,      /* bitsize */
2901
   false,     /* pc_relative */
2902
   0,     /* bitpos */
2903
   complain_overflow_dont, /* complain_on_overflow */
2904
   _bfd_mips_elf_generic_reloc, /* special_function */
2905
   "R_MICROMIPS_SCN_DISP", /* name */
2906
   false,     /* partial_inplace */
2907
   0,     /* src_mask */
2908
   0xffffffff,    /* dst_mask */
2909
   false),    /* pcrel_offset */
2910
2911
  /* Protected jump conversion.  This is an optimization hint.  No
2912
     relocation is required for correctness.  */
2913
  HOWTO (R_MICROMIPS_JALR,  /* type */
2914
   0,     /* rightshift */
2915
   4,     /* size */
2916
   32,      /* bitsize */
2917
   false,     /* pc_relative */
2918
   0,     /* bitpos */
2919
   complain_overflow_dont, /* complain_on_overflow */
2920
   _bfd_mips_elf_generic_reloc, /* special_function */
2921
   "R_MICROMIPS_JALR",  /* name */
2922
   false,     /* partial_inplace */
2923
   0,     /* src_mask */
2924
   0x00000000,    /* dst_mask */
2925
   false),    /* pcrel_offset */
2926
2927
  /* Low 16 bits of symbol value.  Note that the high 16 bits of symbol values
2928
     must be zero.  This is used for relaxation.  */
2929
  HOWTO (R_MICROMIPS_HI0_LO16,  /* type */
2930
   0,     /* rightshift */
2931
   4,     /* size */
2932
   16,      /* bitsize */
2933
   false,     /* pc_relative */
2934
   0,     /* bitpos */
2935
   complain_overflow_dont, /* complain_on_overflow */
2936
   _bfd_mips_elf_generic_reloc, /* special_function */
2937
   "R_MICROMIPS_HI0_LO16",/* name */
2938
   false,     /* partial_inplace */
2939
   0,     /* src_mask */
2940
   0x0000ffff,    /* dst_mask */
2941
   false),    /* pcrel_offset */
2942
2943
  EMPTY_HOWTO (158),
2944
  EMPTY_HOWTO (159),
2945
  EMPTY_HOWTO (160),
2946
  EMPTY_HOWTO (161),
2947
2948
  /* TLS general dynamic variable reference.  */
2949
  HOWTO (R_MICROMIPS_TLS_GD,    /* type */
2950
   0,     /* rightshift */
2951
   4,     /* size */
2952
   16,      /* bitsize */
2953
   false,     /* pc_relative */
2954
   0,     /* bitpos */
2955
   complain_overflow_signed, /* complain_on_overflow */
2956
   _bfd_mips_elf_generic_reloc, /* special_function */
2957
   "R_MICROMIPS_TLS_GD",  /* name */
2958
   false,     /* partial_inplace */
2959
   0,     /* src_mask */
2960
   0x0000ffff,    /* dst_mask */
2961
   false),    /* pcrel_offset */
2962
2963
  /* TLS local dynamic variable reference.  */
2964
  HOWTO (R_MICROMIPS_TLS_LDM, /* type */
2965
   0,     /* rightshift */
2966
   4,     /* size */
2967
   16,      /* bitsize */
2968
   false,     /* pc_relative */
2969
   0,     /* bitpos */
2970
   complain_overflow_signed, /* complain_on_overflow */
2971
   _bfd_mips_elf_generic_reloc, /* special_function */
2972
   "R_MICROMIPS_TLS_LDM", /* name */
2973
   false,     /* partial_inplace */
2974
   0,     /* src_mask */
2975
   0x0000ffff,    /* dst_mask */
2976
   false),    /* pcrel_offset */
2977
2978
  /* TLS local dynamic offset.  */
2979
  HOWTO (R_MICROMIPS_TLS_DTPREL_HI16, /* type */
2980
   16,      /* rightshift */
2981
   4,     /* size */
2982
   16,      /* bitsize */
2983
   false,     /* pc_relative */
2984
   0,     /* bitpos */
2985
   complain_overflow_signed, /* complain_on_overflow */
2986
   _bfd_mips_elf_generic_reloc, /* special_function */
2987
   "R_MICROMIPS_TLS_DTPREL_HI16", /* name */
2988
   false,     /* partial_inplace */
2989
   0,     /* src_mask */
2990
   0x0000ffff,    /* dst_mask */
2991
   false),    /* pcrel_offset */
2992
2993
  /* TLS local dynamic offset.  */
2994
  HOWTO (R_MICROMIPS_TLS_DTPREL_LO16, /* type */
2995
   0,     /* rightshift */
2996
   4,     /* size */
2997
   16,      /* bitsize */
2998
   false,     /* pc_relative */
2999
   0,     /* bitpos */
3000
   complain_overflow_dont, /* complain_on_overflow */
3001
   _bfd_mips_elf_generic_reloc, /* special_function */
3002
   "R_MICROMIPS_TLS_DTPREL_LO16", /* name */
3003
   false,     /* partial_inplace */
3004
   0,     /* src_mask */
3005
   0x0000ffff,    /* dst_mask */
3006
   false),    /* pcrel_offset */
3007
3008
  /* TLS thread pointer offset.  */
3009
  HOWTO (R_MICROMIPS_TLS_GOTTPREL,  /* type */
3010
   0,     /* rightshift */
3011
   4,     /* size */
3012
   16,      /* bitsize */
3013
   false,     /* pc_relative */
3014
   0,     /* bitpos */
3015
   complain_overflow_signed, /* complain_on_overflow */
3016
   _bfd_mips_elf_generic_reloc, /* special_function */
3017
   "R_MICROMIPS_TLS_GOTTPREL",  /* name */
3018
   false,     /* partial_inplace */
3019
   0,     /* src_mask */
3020
   0x0000ffff,    /* dst_mask */
3021
   false),    /* pcrel_offset */
3022
3023
  EMPTY_HOWTO (167),
3024
  EMPTY_HOWTO (168),
3025
3026
  /* TLS thread pointer offset.  */
3027
  HOWTO (R_MICROMIPS_TLS_TPREL_HI16,  /* type */
3028
   16,      /* rightshift */
3029
   4,     /* size */
3030
   16,      /* bitsize */
3031
   false,     /* pc_relative */
3032
   0,     /* bitpos */
3033
   complain_overflow_signed, /* complain_on_overflow */
3034
   _bfd_mips_elf_generic_reloc, /* special_function */
3035
   "R_MICROMIPS_TLS_TPREL_HI16", /* name */
3036
   false,     /* partial_inplace */
3037
   0,     /* src_mask */
3038
   0x0000ffff,    /* dst_mask */
3039
   false),    /* pcrel_offset */
3040
3041
  /* TLS thread pointer offset.  */
3042
  HOWTO (R_MICROMIPS_TLS_TPREL_LO16,  /* type */
3043
   0,     /* rightshift */
3044
   4,     /* size */
3045
   16,      /* bitsize */
3046
   false,     /* pc_relative */
3047
   0,     /* bitpos */
3048
   complain_overflow_dont, /* complain_on_overflow */
3049
   _bfd_mips_elf_generic_reloc, /* special_function */
3050
   "R_MICROMIPS_TLS_TPREL_LO16", /* name */
3051
   false,     /* partial_inplace */
3052
   0,     /* src_mask */
3053
   0x0000ffff,    /* dst_mask */
3054
   false),    /* pcrel_offset */
3055
3056
  EMPTY_HOWTO (171),
3057
3058
  /* GP- and PC-relative relocations.  */
3059
  HOWTO (R_MICROMIPS_GPREL7_S2, /* type */
3060
   2,     /* rightshift */
3061
   2,     /* size */
3062
   7,     /* bitsize */
3063
   false,     /* pc_relative */
3064
   0,     /* bitpos */
3065
   complain_overflow_signed, /* complain_on_overflow */
3066
   _bfd_mips_elf32_gprel16_reloc, /* special_function */
3067
   "R_MICROMIPS_GPREL7_S2", /* name */
3068
   false,     /* partial_inplace */
3069
   0,     /* src_mask */
3070
   0x0000007f,    /* dst_mask */
3071
   false),    /* pcrel_offset */
3072
3073
  HOWTO (R_MICROMIPS_PC23_S2, /* type */
3074
   2,     /* rightshift */
3075
   4,     /* size */
3076
   23,      /* bitsize */
3077
   true,      /* pc_relative */
3078
   0,     /* bitpos */
3079
   complain_overflow_signed, /* complain_on_overflow */
3080
   _bfd_mips_elf_generic_reloc, /* special_function */
3081
   "R_MICROMIPS_PC23_S2", /* name */
3082
   false,     /* partial_inplace */
3083
   0,     /* src_mask */
3084
   0x007fffff,    /* dst_mask */
3085
   true),     /* pcrel_offset */
3086
};
3087
3088
/* GNU extension to record C++ vtable hierarchy */
3089
static reloc_howto_type elf_mips_gnu_vtinherit_howto =
3090
  HOWTO (R_MIPS_GNU_VTINHERIT,  /* type */
3091
   0,     /* rightshift */
3092
   4,     /* size */
3093
   0,     /* bitsize */
3094
   false,     /* pc_relative */
3095
   0,     /* bitpos */
3096
   complain_overflow_dont, /* complain_on_overflow */
3097
   NULL,      /* special_function */
3098
   "R_MIPS_GNU_VTINHERIT", /* name */
3099
   false,     /* partial_inplace */
3100
   0,     /* src_mask */
3101
   0,     /* dst_mask */
3102
   false);    /* pcrel_offset */
3103
3104
/* GNU extension to record C++ vtable member usage */
3105
static reloc_howto_type elf_mips_gnu_vtentry_howto =
3106
  HOWTO (R_MIPS_GNU_VTENTRY,  /* type */
3107
   0,     /* rightshift */
3108
   4,     /* size */
3109
   0,     /* bitsize */
3110
   false,     /* pc_relative */
3111
   0,     /* bitpos */
3112
   complain_overflow_dont, /* complain_on_overflow */
3113
   _bfd_elf_rel_vtable_reloc_fn, /* special_function */
3114
   "R_MIPS_GNU_VTENTRY",  /* name */
3115
   false,     /* partial_inplace */
3116
   0,     /* src_mask */
3117
   0,     /* dst_mask */
3118
   false);    /* pcrel_offset */
3119

3120
/* 16 bit offset for pc-relative branches.  */
3121
static reloc_howto_type elf_mips_gnu_rel16_s2 =
3122
  HOWTO (R_MIPS_GNU_REL16_S2, /* type */
3123
   2,     /* rightshift */
3124
   4,     /* size */
3125
   16,      /* bitsize */
3126
   true,      /* pc_relative */
3127
   0,     /* bitpos */
3128
   complain_overflow_signed, /* complain_on_overflow */
3129
   _bfd_mips_elf_generic_reloc, /* special_function */
3130
   "R_MIPS_GNU_REL16_S2", /* name */
3131
   true,      /* partial_inplace */
3132
   0x0000ffff,    /* src_mask */
3133
   0x0000ffff,    /* dst_mask */
3134
   true);     /* pcrel_offset */
3135
3136
/* 16 bit offset for pc-relative branches.  */
3137
static reloc_howto_type elf_mips_gnu_rela16_s2 =
3138
  HOWTO (R_MIPS_GNU_REL16_S2, /* type */
3139
   2,     /* rightshift */
3140
   4,     /* size */
3141
   16,      /* bitsize */
3142
   true,      /* pc_relative */
3143
   0,     /* bitpos */
3144
   complain_overflow_signed, /* complain_on_overflow */
3145
   _bfd_mips_elf_generic_reloc, /* special_function */
3146
   "R_MIPS_GNU_REL16_S2", /* name */
3147
   false,     /* partial_inplace */
3148
   0,     /* src_mask */
3149
   0x0000ffff,    /* dst_mask */
3150
   true);     /* pcrel_offset */
3151
3152
/* 32 bit pc-relative.  Used for compact EH tables.  */
3153
static reloc_howto_type elf_mips_gnu_pcrel32 =
3154
  HOWTO (R_MIPS_PC32,   /* type */
3155
   0,     /* rightshift */
3156
   4,     /* size */
3157
   32,      /* bitsize */
3158
   true,      /* pc_relative */
3159
   0,     /* bitpos */
3160
   complain_overflow_signed, /* complain_on_overflow */
3161
   _bfd_mips_elf_generic_reloc, /* special_function */
3162
   "R_MIPS_PC32",   /* name */
3163
   true,      /* partial_inplace */
3164
   0xffffffff,    /* src_mask */
3165
   0xffffffff,    /* dst_mask */
3166
   true);     /* pcrel_offset */
3167
3168

3169
/* Originally a VxWorks extension, but now used for other systems too.  */
3170
static reloc_howto_type elf_mips_copy_howto =
3171
  HOWTO (R_MIPS_COPY,   /* type */
3172
   0,     /* rightshift */
3173
   0,     /* this one is variable size */
3174
   0,     /* bitsize */
3175
   false,     /* pc_relative */
3176
   0,     /* bitpos */
3177
   complain_overflow_bitfield, /* complain_on_overflow */
3178
   _bfd_mips_elf_generic_reloc, /* special_function */
3179
   "R_MIPS_COPY",   /* name */
3180
   false,     /* partial_inplace */
3181
   0x0,     /* src_mask */
3182
   0x0,     /* dst_mask */
3183
   false);    /* pcrel_offset */
3184
3185
/* Originally a VxWorks extension, but now used for other systems too.  */
3186
static reloc_howto_type elf_mips_jump_slot_howto =
3187
  HOWTO (R_MIPS_JUMP_SLOT,  /* type */
3188
   0,     /* rightshift */
3189
   8,     /* size */
3190
   64,      /* bitsize */
3191
   false,     /* pc_relative */
3192
   0,     /* bitpos */
3193
   complain_overflow_bitfield, /* complain_on_overflow */
3194
   _bfd_mips_elf_generic_reloc, /* special_function */
3195
   "R_MIPS_JUMP_SLOT",  /* name */
3196
   false,     /* partial_inplace */
3197
   0x0,     /* src_mask */
3198
   0x0,     /* dst_mask */
3199
   false);    /* pcrel_offset */
3200
3201
/* Used in EH tables.  */
3202
static reloc_howto_type elf_mips_eh_howto =
3203
  HOWTO (R_MIPS_EH,   /* type */
3204
   0,     /* rightshift */
3205
   4,     /* size */
3206
   32,      /* bitsize */
3207
   false,     /* pc_relative */
3208
   0,     /* bitpos */
3209
   complain_overflow_signed, /* complain_on_overflow */
3210
   _bfd_mips_elf_generic_reloc, /* special_function */
3211
   "R_MIPS_EH",   /* name */
3212
   true,      /* partial_inplace */
3213
   0xffffffff,    /* src_mask */
3214
   0xffffffff,    /* dst_mask */
3215
   false);    /* pcrel_offset */
3216
3217

3218
/* Swap in a MIPS 64-bit Rel reloc.  */
3219
3220
static void
3221
mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
3222
        Elf64_Mips_Internal_Rela *dst)
3223
0
{
3224
0
  dst->r_offset = H_GET_64 (abfd, src->r_offset);
3225
0
  dst->r_sym = H_GET_32 (abfd, src->r_sym);
3226
0
  dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
3227
0
  dst->r_type3 = H_GET_8 (abfd, src->r_type3);
3228
0
  dst->r_type2 = H_GET_8 (abfd, src->r_type2);
3229
0
  dst->r_type = H_GET_8 (abfd, src->r_type);
3230
0
  dst->r_addend = 0;
3231
0
}
3232
3233
/* Swap in a MIPS 64-bit Rela reloc.  */
3234
3235
static void
3236
mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
3237
         Elf64_Mips_Internal_Rela *dst)
3238
621
{
3239
621
  dst->r_offset = H_GET_64 (abfd, src->r_offset);
3240
621
  dst->r_sym = H_GET_32 (abfd, src->r_sym);
3241
621
  dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
3242
621
  dst->r_type3 = H_GET_8 (abfd, src->r_type3);
3243
621
  dst->r_type2 = H_GET_8 (abfd, src->r_type2);
3244
621
  dst->r_type = H_GET_8 (abfd, src->r_type);
3245
621
  dst->r_addend = H_GET_S64 (abfd, src->r_addend);
3246
621
}
3247
3248
/* Swap out a MIPS 64-bit Rel reloc.  */
3249
3250
static void
3251
mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
3252
         Elf64_Mips_External_Rel *dst)
3253
0
{
3254
0
  H_PUT_64 (abfd, src->r_offset, dst->r_offset);
3255
0
  H_PUT_32 (abfd, src->r_sym, dst->r_sym);
3256
0
  H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
3257
0
  H_PUT_8 (abfd, src->r_type3, dst->r_type3);
3258
0
  H_PUT_8 (abfd, src->r_type2, dst->r_type2);
3259
0
  H_PUT_8 (abfd, src->r_type, dst->r_type);
3260
0
}
3261
3262
/* Swap out a MIPS 64-bit Rela reloc.  */
3263
3264
static void
3265
mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
3266
          Elf64_Mips_External_Rela *dst)
3267
0
{
3268
0
  H_PUT_64 (abfd, src->r_offset, dst->r_offset);
3269
0
  H_PUT_32 (abfd, src->r_sym, dst->r_sym);
3270
0
  H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
3271
0
  H_PUT_8 (abfd, src->r_type3, dst->r_type3);
3272
0
  H_PUT_8 (abfd, src->r_type2, dst->r_type2);
3273
0
  H_PUT_8 (abfd, src->r_type, dst->r_type);
3274
0
  H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
3275
0
}
3276
3277
/* Swap in a MIPS 64-bit Rel reloc.  */
3278
3279
static void
3280
mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
3281
           Elf_Internal_Rela *dst)
3282
0
{
3283
0
  Elf64_Mips_Internal_Rela mirel;
3284
3285
0
  mips_elf64_swap_reloc_in (abfd,
3286
0
          (const Elf64_Mips_External_Rel *) src,
3287
0
          &mirel);
3288
3289
0
  dst[0].r_offset = mirel.r_offset;
3290
0
  dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
3291
0
  dst[0].r_addend = 0;
3292
0
  dst[1].r_offset = mirel.r_offset;
3293
0
  dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
3294
0
  dst[1].r_addend = 0;
3295
0
  dst[2].r_offset = mirel.r_offset;
3296
0
  dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
3297
0
  dst[2].r_addend = 0;
3298
0
}
3299
3300
/* Swap in a MIPS 64-bit Rela reloc.  */
3301
3302
static void
3303
mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
3304
            Elf_Internal_Rela *dst)
3305
0
{
3306
0
  Elf64_Mips_Internal_Rela mirela;
3307
3308
0
  mips_elf64_swap_reloca_in (abfd,
3309
0
           (const Elf64_Mips_External_Rela *) src,
3310
0
           &mirela);
3311
3312
0
  dst[0].r_offset = mirela.r_offset;
3313
0
  dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type);
3314
0
  dst[0].r_addend = mirela.r_addend;
3315
0
  dst[1].r_offset = mirela.r_offset;
3316
0
  dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2);
3317
0
  dst[1].r_addend = 0;
3318
0
  dst[2].r_offset = mirela.r_offset;
3319
0
  dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3);
3320
0
  dst[2].r_addend = 0;
3321
0
}
3322
3323
/* Swap out a MIPS 64-bit Rel reloc.  */
3324
3325
static void
3326
mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
3327
            bfd_byte *dst)
3328
0
{
3329
0
  Elf64_Mips_Internal_Rela mirel;
3330
3331
0
  mirel.r_offset = src[0].r_offset;
3332
0
  BFD_ASSERT(src[0].r_offset == src[1].r_offset);
3333
0
  BFD_ASSERT(src[0].r_offset == src[2].r_offset);
3334
3335
0
  mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
3336
0
  mirel.r_sym = ELF64_R_SYM (src[0].r_info);
3337
0
  mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
3338
0
  mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
3339
0
  mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
3340
3341
0
  mips_elf64_swap_reloc_out (abfd, &mirel,
3342
0
           (Elf64_Mips_External_Rel *) dst);
3343
0
}
3344
3345
/* Swap out a MIPS 64-bit Rela reloc.  */
3346
3347
static void
3348
mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src,
3349
             bfd_byte *dst)
3350
0
{
3351
0
  Elf64_Mips_Internal_Rela mirela;
3352
3353
0
  mirela.r_offset = src[0].r_offset;
3354
0
  BFD_ASSERT(src[0].r_offset == src[1].r_offset);
3355
0
  BFD_ASSERT(src[0].r_offset == src[2].r_offset);
3356
3357
0
  mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
3358
0
  mirela.r_sym = ELF64_R_SYM (src[0].r_info);
3359
0
  mirela.r_addend = src[0].r_addend;
3360
0
  BFD_ASSERT(src[1].r_addend == 0);
3361
0
  BFD_ASSERT(src[2].r_addend == 0);
3362
3363
0
  mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
3364
0
  mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
3365
0
  mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
3366
3367
0
  mips_elf64_swap_reloca_out (abfd, &mirela,
3368
0
            (Elf64_Mips_External_Rela *) dst);
3369
0
}
3370

3371
/* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
3372
   dangerous relocation.  */
3373
3374
static bool
3375
mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp)
3376
27
{
3377
27
  unsigned int count;
3378
27
  asymbol **sym;
3379
27
  unsigned int i;
3380
3381
  /* If we've already figured out what GP will be, just return it.  */
3382
27
  *pgp = _bfd_get_gp_value (output_bfd);
3383
27
  if (*pgp)
3384
0
    return true;
3385
3386
27
  count = bfd_get_symcount (output_bfd);
3387
27
  sym = bfd_get_outsymbols (output_bfd);
3388
3389
  /* The linker script will have created a symbol named `_gp' with the
3390
     appropriate value.  */
3391
27
  if (sym == NULL)
3392
23
    i = count;
3393
4
  else
3394
4
    {
3395
4
      for (i = 0; i < count; i++, sym++)
3396
0
  {
3397
0
    register const char *name;
3398
3399
0
    name = bfd_asymbol_name (*sym);
3400
0
    if (*name == '_' && strcmp (name, "_gp") == 0)
3401
0
      {
3402
0
        *pgp = bfd_asymbol_value (*sym);
3403
0
        _bfd_set_gp_value (output_bfd, *pgp);
3404
0
        break;
3405
0
      }
3406
0
  }
3407
4
    }
3408
3409
27
  if (i >= count)
3410
27
    {
3411
      /* Only get the error once.  */
3412
27
      *pgp = 4;
3413
27
      _bfd_set_gp_value (output_bfd, *pgp);
3414
27
      return false;
3415
27
    }
3416
3417
0
  return true;
3418
27
}
3419
3420
/* We have to figure out the gp value, so that we can adjust the
3421
   symbol value correctly.  We look up the symbol _gp in the output
3422
   BFD.  If we can't find it, we're stuck.  We cache it in the ELF
3423
   target data.  We don't need to adjust the symbol value for an
3424
   external symbol if we are producing relocatable output.  */
3425
3426
static bfd_reloc_status_type
3427
mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bool relocatable,
3428
         char **error_message, bfd_vma *pgp)
3429
54
{
3430
54
  if (output_bfd == NULL)
3431
0
    {
3432
0
      *pgp = 0;
3433
0
      return bfd_reloc_undefined;
3434
0
    }
3435
3436
54
  *pgp = _bfd_get_gp_value (output_bfd);
3437
54
  if (*pgp == 0
3438
54
      && (! relocatable
3439
27
    || (symbol->flags & BSF_SECTION_SYM) != 0))
3440
27
    {
3441
27
      if (relocatable)
3442
0
  {
3443
    /* Make up a value.  */
3444
0
    *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
3445
0
    _bfd_set_gp_value (output_bfd, *pgp);
3446
0
  }
3447
27
      else if (!mips_elf64_assign_gp (output_bfd, pgp))
3448
27
  {
3449
27
    *error_message =
3450
27
      (char *) _("GP relative relocation when _gp not defined");
3451
27
    return bfd_reloc_dangerous;
3452
27
  }
3453
27
    }
3454
3455
27
  return bfd_reloc_ok;
3456
54
}
3457
3458
/* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
3459
   become the offset from the gp register.  */
3460
3461
static bfd_reloc_status_type
3462
mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3463
        void *data, asection *input_section, bfd *output_bfd,
3464
        char **error_message)
3465
2
{
3466
2
  bool relocatable;
3467
2
  bfd_reloc_status_type ret;
3468
2
  bfd_vma gp;
3469
3470
  /* If we're relocating, and this is an external symbol, we don't want
3471
     to change anything.  */
3472
2
  if (output_bfd != NULL
3473
2
      && (symbol->flags & BSF_SECTION_SYM) == 0
3474
2
      && (symbol->flags & BSF_LOCAL) != 0)
3475
0
    {
3476
0
      reloc_entry->address += input_section->output_offset;
3477
0
      return bfd_reloc_ok;
3478
0
    }
3479
3480
2
  if (output_bfd != NULL)
3481
0
    relocatable = true;
3482
2
  else
3483
2
    {
3484
2
      relocatable = false;
3485
2
      output_bfd = input_section->output_section->owner;
3486
2
    }
3487
3488
2
  ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3489
2
           &gp);
3490
2
  if (ret != bfd_reloc_ok)
3491
1
    return ret;
3492
3493
1
  return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3494
1
          input_section, relocatable,
3495
1
          data, gp);
3496
2
}
3497
3498
/* Do a R_MIPS_LITERAL relocation.  */
3499
3500
static bfd_reloc_status_type
3501
mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3502
        void *data, asection *input_section, bfd *output_bfd,
3503
        char **error_message)
3504
39
{
3505
39
  bool relocatable;
3506
39
  bfd_reloc_status_type ret;
3507
39
  bfd_vma gp;
3508
3509
  /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
3510
39
  if (output_bfd != NULL
3511
39
      && (symbol->flags & BSF_SECTION_SYM) == 0
3512
39
      && (symbol->flags & BSF_LOCAL) != 0)
3513
0
    {
3514
0
      *error_message = (char *)
3515
0
  _("literal relocation occurs for an external symbol");
3516
0
      return bfd_reloc_outofrange;
3517
0
    }
3518
3519
  /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
3520
39
  if (output_bfd != NULL)
3521
0
    relocatable = true;
3522
39
  else
3523
39
    {
3524
39
      relocatable = false;
3525
39
      output_bfd = input_section->output_section->owner;
3526
39
    }
3527
3528
39
  ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3529
39
           &gp);
3530
39
  if (ret != bfd_reloc_ok)
3531
18
    return ret;
3532
3533
21
  return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3534
21
          input_section, relocatable,
3535
21
          data, gp);
3536
39
}
3537
3538
/* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
3539
   become the offset from the gp register.  */
3540
3541
static bfd_reloc_status_type
3542
mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3543
        void *data, asection *input_section, bfd *output_bfd,
3544
        char **error_message)
3545
6
{
3546
6
  bool relocatable;
3547
6
  bfd_reloc_status_type ret;
3548
6
  bfd_vma gp;
3549
6
  bfd_vma relocation;
3550
6
  bfd_vma val;
3551
3552
  /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
3553
6
  if (output_bfd != NULL
3554
6
      && (symbol->flags & BSF_SECTION_SYM) == 0
3555
6
      && (symbol->flags & BSF_LOCAL) != 0)
3556
0
    {
3557
0
      *error_message = (char *)
3558
0
  _("32bits gp relative relocation occurs for an external symbol");
3559
0
      return bfd_reloc_outofrange;
3560
0
    }
3561
3562
6
  if (output_bfd != NULL)
3563
0
    relocatable = true;
3564
6
  else
3565
6
    {
3566
6
      relocatable = false;
3567
6
      output_bfd = input_section->output_section->owner;
3568
6
    }
3569
3570
6
  ret = mips_elf64_final_gp (output_bfd, symbol, relocatable,
3571
6
           error_message, &gp);
3572
6
  if (ret != bfd_reloc_ok)
3573
3
    return ret;
3574
3575
3
  if (bfd_is_com_section (symbol->section))
3576
0
    relocation = 0;
3577
3
  else
3578
3
    relocation = symbol->value;
3579
3580
3
  if (symbol->section->output_section != NULL)
3581
3
    {
3582
3
      relocation += symbol->section->output_section->vma;
3583
3
      relocation += symbol->section->output_offset;
3584
3
    }
3585
3586
3
  if (!_bfd_mips_reloc_offset_in_range (abfd, input_section, reloc_entry,
3587
3
          check_inplace))
3588
0
    return bfd_reloc_outofrange;
3589
3590
  /* Set val to the offset into the section or symbol.  */
3591
3
  val = reloc_entry->addend;
3592
3593
3
  if (reloc_entry->howto->partial_inplace)
3594
0
    val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
3595
3596
  /* Adjust val for the final section location and GP value.  If we
3597
     are producing relocatable output, we don't want to do this for
3598
     an external symbol.  */
3599
3
  if (! relocatable
3600
3
      || (symbol->flags & BSF_SECTION_SYM) != 0)
3601
3
    val += relocation - gp;
3602
3603
3
  if (reloc_entry->howto->partial_inplace)
3604
3
    bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
3605
3
  else
3606
3
    reloc_entry->addend = val;
3607
3608
3
  if (relocatable)
3609
0
    reloc_entry->address += input_section->output_offset;
3610
3611
3
  return bfd_reloc_ok;
3612
3
}
3613
3614
/* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
3615
   the rest is at bits 6-10. The bitpos already got right by the howto.  */
3616
3617
static bfd_reloc_status_type
3618
mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3619
       void *data, asection *input_section, bfd *output_bfd,
3620
       char **error_message)
3621
1
{
3622
1
  if (reloc_entry->howto->partial_inplace)
3623
0
    {
3624
0
      reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
3625
0
           | (reloc_entry->addend & 0x00000800) >> 9);
3626
0
    }
3627
3628
1
  return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
3629
1
              input_section, output_bfd,
3630
1
              error_message);
3631
1
}
3632
3633
/* Handle a mips16 GP relative reloc.  */
3634
3635
static bfd_reloc_status_type
3636
mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3637
        void *data, asection *input_section, bfd *output_bfd,
3638
        char **error_message)
3639
7
{
3640
7
  bool relocatable;
3641
7
  bfd_reloc_status_type ret;
3642
7
  bfd_byte *location;
3643
7
  bfd_vma gp;
3644
3645
  /* If we're relocating, and this is an external symbol, we don't want
3646
     to change anything.  */
3647
7
  if (output_bfd != NULL
3648
7
      && (symbol->flags & BSF_SECTION_SYM) == 0
3649
7
      && (symbol->flags & BSF_LOCAL) != 0)
3650
0
    {
3651
0
      reloc_entry->address += input_section->output_offset;
3652
0
      return bfd_reloc_ok;
3653
0
    }
3654
3655
7
  if (output_bfd != NULL)
3656
0
    relocatable = true;
3657
7
  else
3658
7
    {
3659
7
      relocatable = false;
3660
7
      output_bfd = input_section->output_section->owner;
3661
7
    }
3662
3663
7
  ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3664
7
           &gp);
3665
7
  if (ret != bfd_reloc_ok)
3666
5
    return ret;
3667
3668
2
  if (!_bfd_mips_reloc_offset_in_range (abfd, input_section, reloc_entry,
3669
2
          check_shuffle))
3670
1
    return bfd_reloc_outofrange;
3671
3672
1
  location = (bfd_byte *) data + reloc_entry->address;
3673
1
  _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, false,
3674
1
         location);
3675
1
  ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3676
1
               input_section, relocatable,
3677
1
               data, gp);
3678
1
  _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
3679
1
             location);
3680
3681
1
  return ret;
3682
2
}
3683

3684
/* A mapping from BFD reloc types to MIPS ELF reloc types.  */
3685
3686
struct elf_reloc_map {
3687
  bfd_reloc_code_real_type bfd_val;
3688
  enum elf_mips_reloc_type elf_val;
3689
};
3690
3691
static const struct elf_reloc_map mips_reloc_map[] =
3692
{
3693
  { BFD_RELOC_NONE, R_MIPS_NONE },
3694
  { BFD_RELOC_MIPS_16, R_MIPS_16 },
3695
  { BFD_RELOC_16, R_MIPS_REL16 },
3696
  { BFD_RELOC_32, R_MIPS_32 },
3697
  /* There is no BFD reloc for R_MIPS_REL32.  */
3698
  { BFD_RELOC_64, R_MIPS_64 },
3699
  { BFD_RELOC_CTOR, R_MIPS_64 },
3700
  { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
3701
  { BFD_RELOC_HI16_S, R_MIPS_HI16 },
3702
  { BFD_RELOC_LO16, R_MIPS_LO16 },
3703
  { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
3704
  { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
3705
  { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
3706
  { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
3707
  { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
3708
  { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
3709
  { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
3710
  { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
3711
  { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
3712
  { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
3713
  { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
3714
  { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
3715
  { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
3716
  { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
3717
  { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
3718
  { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
3719
  { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
3720
  { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
3721
  { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
3722
  { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
3723
  { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
3724
  { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
3725
  /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
3726
  { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
3727
  { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
3728
  { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
3729
  { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
3730
  { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
3731
  { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
3732
  { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
3733
  { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
3734
  { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
3735
  { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
3736
  { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
3737
  { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
3738
  { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
3739
  { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
3740
  { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 },
3741
  { BFD_RELOC_MIPS_21_PCREL_S2, R_MIPS_PC21_S2 },
3742
  { BFD_RELOC_MIPS_26_PCREL_S2, R_MIPS_PC26_S2 },
3743
  { BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
3744
  { BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
3745
  { BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
3746
  { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
3747
};
3748
3749
static const struct elf_reloc_map mips16_reloc_map[] =
3750
{
3751
  { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
3752
  { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
3753
  { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
3754
  { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
3755
  { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
3756
  { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
3757
  { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
3758
  { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
3759
  { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
3760
    R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
3761
  { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
3762
    R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
3763
  { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
3764
  { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
3765
  { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min },
3766
  { BFD_RELOC_MIPS16_16_PCREL_S1, R_MIPS16_PC16_S1 - R_MIPS16_min }
3767
};
3768
3769
static const struct elf_reloc_map micromips_reloc_map[] =
3770
{
3771
  { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
3772
  { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
3773
  { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
3774
  { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
3775
  { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
3776
  { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
3777
  { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
3778
  { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
3779
  { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
3780
  { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
3781
  { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
3782
  { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
3783
  { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
3784
  { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
3785
  { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
3786
  { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
3787
  { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
3788
  { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
3789
  { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
3790
  { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
3791
  { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
3792
  { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
3793
  /* There is no BFD reloc for R_MICROMIPS_HI0_LO16.  */
3794
  { BFD_RELOC_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_GD - R_MICROMIPS_min },
3795
  { BFD_RELOC_MICROMIPS_TLS_LDM, R_MICROMIPS_TLS_LDM - R_MICROMIPS_min },
3796
  { BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16,
3797
    R_MICROMIPS_TLS_DTPREL_HI16 - R_MICROMIPS_min },
3798
  { BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16,
3799
    R_MICROMIPS_TLS_DTPREL_LO16 - R_MICROMIPS_min },
3800
  { BFD_RELOC_MICROMIPS_TLS_GOTTPREL,
3801
    R_MICROMIPS_TLS_GOTTPREL - R_MICROMIPS_min },
3802
  { BFD_RELOC_MICROMIPS_TLS_TPREL_HI16,
3803
    R_MICROMIPS_TLS_TPREL_HI16 - R_MICROMIPS_min },
3804
  { BFD_RELOC_MICROMIPS_TLS_TPREL_LO16,
3805
    R_MICROMIPS_TLS_TPREL_LO16 - R_MICROMIPS_min },
3806
  /* There is no BFD reloc for R_MICROMIPS_GPREL7_S2.  */
3807
  /* There is no BFD reloc for R_MICROMIPS_PC23_S2.  */
3808
};
3809
/* Given a BFD reloc type, return a howto structure.  */
3810
3811
static reloc_howto_type *
3812
bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3813
         bfd_reloc_code_real_type code)
3814
0
{
3815
0
  unsigned int i;
3816
  /* FIXME: We default to RELA here instead of choosing the right
3817
     relocation variant.  */
3818
0
  reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
3819
0
  reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
3820
0
  reloc_howto_type *howto_micromips_table = micromips_elf64_howto_table_rela;
3821
3822
0
  for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
3823
0
       i++)
3824
0
    {
3825
0
      if (mips_reloc_map[i].bfd_val == code)
3826
0
  return &howto_table[(int) mips_reloc_map[i].elf_val];
3827
0
    }
3828
3829
0
  for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
3830
0
       i++)
3831
0
    {
3832
0
      if (mips16_reloc_map[i].bfd_val == code)
3833
0
  return &howto16_table[(int) mips16_reloc_map[i].elf_val];
3834
0
    }
3835
3836
0
  for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
3837
0
       i++)
3838
0
    {
3839
0
      if (micromips_reloc_map[i].bfd_val == code)
3840
0
  return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
3841
0
    }
3842
3843
0
  switch (code)
3844
0
    {
3845
0
    case BFD_RELOC_VTABLE_INHERIT:
3846
0
      return &elf_mips_gnu_vtinherit_howto;
3847
0
    case BFD_RELOC_VTABLE_ENTRY:
3848
0
      return &elf_mips_gnu_vtentry_howto;
3849
0
    case BFD_RELOC_32_PCREL:
3850
0
      return &elf_mips_gnu_pcrel32;
3851
0
    case BFD_RELOC_MIPS_EH:
3852
0
      return &elf_mips_eh_howto;
3853
0
    case BFD_RELOC_MIPS_COPY:
3854
0
      return &elf_mips_copy_howto;
3855
0
    case BFD_RELOC_MIPS_JUMP_SLOT:
3856
0
      return &elf_mips_jump_slot_howto;
3857
0
    default:
3858
0
      bfd_set_error (bfd_error_bad_value);
3859
0
      return NULL;
3860
0
    }
3861
0
}
3862
3863
static reloc_howto_type *
3864
bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3865
         const char *r_name)
3866
0
{
3867
0
  unsigned int i;
3868
3869
0
  for (i = 0;
3870
0
       i < (sizeof (mips_elf64_howto_table_rela)
3871
0
      / sizeof (mips_elf64_howto_table_rela[0])); i++)
3872
0
    if (mips_elf64_howto_table_rela[i].name != NULL
3873
0
  && strcasecmp (mips_elf64_howto_table_rela[i].name, r_name) == 0)
3874
0
      return &mips_elf64_howto_table_rela[i];
3875
3876
0
  for (i = 0;
3877
0
       i < (sizeof (mips16_elf64_howto_table_rela)
3878
0
      / sizeof (mips16_elf64_howto_table_rela[0]));
3879
0
       i++)
3880
0
    if (mips16_elf64_howto_table_rela[i].name != NULL
3881
0
  && strcasecmp (mips16_elf64_howto_table_rela[i].name, r_name) == 0)
3882
0
      return &mips16_elf64_howto_table_rela[i];
3883
3884
0
  for (i = 0;
3885
0
       i < (sizeof (micromips_elf64_howto_table_rela)
3886
0
      / sizeof (micromips_elf64_howto_table_rela[0]));
3887
0
       i++)
3888
0
    if (micromips_elf64_howto_table_rela[i].name != NULL
3889
0
  && strcasecmp (micromips_elf64_howto_table_rela[i].name, r_name) == 0)
3890
0
      return &micromips_elf64_howto_table_rela[i];
3891
3892
0
  if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
3893
0
    return &elf_mips_gnu_vtinherit_howto;
3894
0
  if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
3895
0
    return &elf_mips_gnu_vtentry_howto;
3896
0
  if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
3897
0
    return &elf_mips_gnu_rel16_s2;
3898
0
  if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
3899
0
    return &elf_mips_gnu_rela16_s2;
3900
0
  if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
3901
0
    return &elf_mips_gnu_pcrel32;
3902
0
  if (strcasecmp (elf_mips_eh_howto.name, r_name) == 0)
3903
0
    return &elf_mips_eh_howto;
3904
0
  if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
3905
0
    return &elf_mips_copy_howto;
3906
0
  if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
3907
0
    return &elf_mips_jump_slot_howto;
3908
3909
0
  return NULL;
3910
0
}
3911
3912
/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
3913
3914
static reloc_howto_type *
3915
mips_elf64_rtype_to_howto (bfd *abfd, unsigned int r_type, bool rela_p)
3916
1.83k
{
3917
1.83k
  reloc_howto_type *howto = NULL;
3918
3919
1.83k
  switch (r_type)
3920
1.83k
    {
3921
16
    case R_MIPS_GNU_VTINHERIT:
3922
16
      return &elf_mips_gnu_vtinherit_howto;
3923
18
    case R_MIPS_GNU_VTENTRY:
3924
18
      return &elf_mips_gnu_vtentry_howto;
3925
79
    case R_MIPS_GNU_REL16_S2:
3926
79
      if (rela_p)
3927
79
  return &elf_mips_gnu_rela16_s2;
3928
0
      else
3929
0
  return &elf_mips_gnu_rel16_s2;
3930
1
    case R_MIPS_PC32:
3931
1
      return &elf_mips_gnu_pcrel32;
3932
1
    case R_MIPS_EH:
3933
1
      return &elf_mips_eh_howto;
3934
4
    case R_MIPS_COPY:
3935
4
      return &elf_mips_copy_howto;
3936
29
    case R_MIPS_JUMP_SLOT:
3937
29
      return &elf_mips_jump_slot_howto;
3938
1.68k
    default:
3939
1.68k
      if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
3940
182
  {
3941
182
    if (rela_p)
3942
177
      howto
3943
177
        = &micromips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
3944
5
    else
3945
5
      howto
3946
5
        = &micromips_elf64_howto_table_rel[r_type - R_MICROMIPS_min];
3947
182
  }
3948
1.68k
      if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
3949
292
  {
3950
292
    if (rela_p)
3951
284
      howto = &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
3952
8
    else
3953
8
      howto = &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
3954
292
  }
3955
1.68k
      if (r_type < R_MIPS_max)
3956
1.18k
  {
3957
1.18k
    if (rela_p)
3958
1.18k
      howto = &mips_elf64_howto_table_rela[r_type];
3959
0
    else
3960
0
      howto = &mips_elf64_howto_table_rel[r_type];
3961
1.18k
  }
3962
1.68k
      if (howto != NULL && howto->name != NULL)
3963
1.63k
  return howto;
3964
3965
50
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
3966
50
        abfd, r_type);
3967
50
      bfd_set_error (bfd_error_bad_value);
3968
50
      return NULL;
3969
1.83k
    }
3970
1.83k
}
3971
3972
/* Prevent relocation handling by bfd for MIPS ELF64.  */
3973
3974
static bool
3975
mips_elf64_info_to_howto_rela (bfd *abfd,
3976
             arelent *cache_ptr ATTRIBUTE_UNUSED,
3977
             Elf_Internal_Rela *dst)
3978
0
{
3979
0
  unsigned int r_type = ELF32_R_TYPE (dst->r_info);
3980
  /* xgettext:c-format */
3981
0
  _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
3982
0
          abfd, r_type);
3983
0
  bfd_set_error (bfd_error_bad_value);
3984
0
  return false;
3985
0
}
3986
3987
/* Since each entry in an SHT_REL or SHT_RELA section can represent up
3988
   to three relocs, we must tell the user to allocate more space.  */
3989
3990
static long
3991
mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd)
3992
129
{
3993
129
  return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3;
3994
129
}
3995
3996
/* Read the relocations from one reloc section.  This is mostly copied
3997
   from elfcode.h, except for the changes to expand one external
3998
   relocation to 3 internal ones.  To reduce processing effort we
3999
   could discard those R_MIPS_NONE relocations that occupy the second
4000
   and the third entry of a triplet, as `mips_elf64_write_rel' and
4001
   `mips_elf64_write_rela' recreate them in output automagically,
4002
   however that would also remove them from `objdump -r' output,
4003
   breaking a long-established tradition and likely confusing people.  */
4004
4005
static bool
4006
mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
4007
          Elf_Internal_Shdr *rel_hdr,
4008
          bfd_size_type reloc_count,
4009
          arelent *relents, asymbol **symbols,
4010
          bool dynamic)
4011
136
{
4012
136
  void *allocated;
4013
136
  bfd_byte *native_relocs;
4014
136
  unsigned int symcount;
4015
136
  arelent *relent;
4016
136
  bfd_vma i;
4017
136
  int entsize;
4018
136
  bool rela_p;
4019
4020
136
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
4021
10
    return false;
4022
126
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
4023
126
  if (allocated == NULL)
4024
1
    return false;
4025
4026
125
  native_relocs = allocated;
4027
4028
125
  entsize = rel_hdr->sh_entsize;
4029
125
  BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
4030
125
        || entsize == sizeof (Elf64_Mips_External_Rela));
4031
4032
125
  if (entsize == sizeof (Elf64_Mips_External_Rel))
4033
0
    rela_p = false;
4034
125
  else
4035
125
    rela_p = true;
4036
4037
125
  if (dynamic)
4038
3
    symcount = bfd_get_dynamic_symcount (abfd);
4039
122
  else
4040
122
    symcount = bfd_get_symcount (abfd);
4041
4042
125
  for (i = 0, relent = relents;
4043
696
       i < reloc_count;
4044
571
       i++, native_relocs += entsize)
4045
621
    {
4046
621
      Elf64_Mips_Internal_Rela rela;
4047
621
      bool used_sym, used_ssym;
4048
621
      int ir;
4049
4050
621
      if (entsize == sizeof (Elf64_Mips_External_Rela))
4051
621
  mips_elf64_swap_reloca_in (abfd,
4052
621
           (Elf64_Mips_External_Rela *) native_relocs,
4053
621
           &rela);
4054
0
      else
4055
0
  mips_elf64_swap_reloc_in (abfd,
4056
0
          (Elf64_Mips_External_Rel *) native_relocs,
4057
0
          &rela);
4058
4059
      /* Each entry represents exactly three actual relocations.  */
4060
4061
621
      used_sym = false;
4062
621
      used_ssym = false;
4063
2.39k
      for (ir = 0; ir < 3; ir++)
4064
1.82k
  {
4065
1.82k
    enum elf_mips_reloc_type type;
4066
4067
1.82k
    switch (ir)
4068
1.82k
      {
4069
0
      default:
4070
0
        abort ();
4071
621
      case 0:
4072
621
        type = (enum elf_mips_reloc_type) rela.r_type;
4073
621
        break;
4074
604
      case 1:
4075
604
        type = (enum elf_mips_reloc_type) rela.r_type2;
4076
604
        break;
4077
596
      case 2:
4078
596
        type = (enum elf_mips_reloc_type) rela.r_type3;
4079
596
        break;
4080
1.82k
      }
4081
4082
    /* Some types require symbols, whereas some do not.  */
4083
1.82k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
4084
1.82k
    switch (type)
4085
1.82k
      {
4086
721
      case R_MIPS_NONE:
4087
777
      case R_MIPS_LITERAL:
4088
785
      case R_MIPS_INSERT_A:
4089
787
      case R_MIPS_INSERT_B:
4090
790
      case R_MIPS_DELETE:
4091
790
        break;
4092
4093
1.03k
      default:
4094
1.03k
        if (! used_sym)
4095
494
    {
4096
494
      if (rela.r_sym == STN_UNDEF)
4097
40
        ;
4098
454
      else if (rela.r_sym > symcount)
4099
360
        {
4100
360
          _bfd_error_handler
4101
      /* xgettext:c-format */
4102
360
      (_("%pB(%pA): relocation %" PRIu64
4103
360
         " has invalid symbol index %ld"),
4104
360
       abfd, asect, (uint64_t) i, rela.r_sym);
4105
360
          bfd_set_error (bfd_error_bad_value);
4106
360
        }
4107
94
      else
4108
94
        {
4109
94
          asymbol **ps, *s;
4110
4111
94
          ps = symbols + rela.r_sym - 1;
4112
94
          s = *ps;
4113
94
          if ((s->flags & BSF_SECTION_SYM) == 0)
4114
79
      relent->sym_ptr_ptr = ps;
4115
15
          else
4116
15
      relent->sym_ptr_ptr = &s->section->symbol;
4117
94
        }
4118
4119
494
      used_sym = true;
4120
494
    }
4121
537
        else if (! used_ssym)
4122
313
    {
4123
313
      switch (rela.r_ssym)
4124
313
        {
4125
81
        case RSS_UNDEF:
4126
81
          break;
4127
4128
7
        case RSS_GP:
4129
9
        case RSS_GP0:
4130
10
        case RSS_LOC:
4131
          /* FIXME: I think these need to be handled using
4132
       special howto structures.  */
4133
10
          BFD_ASSERT (0);
4134
10
          break;
4135
4136
222
        default:
4137
222
          BFD_ASSERT (0);
4138
222
          break;
4139
313
        }
4140
4141
313
      used_ssym = true;
4142
313
    }
4143
1.03k
        break;
4144
1.82k
      }
4145
4146
    /* The address of an ELF reloc is section relative for an
4147
       object file, and absolute for an executable file or
4148
       shared library.  The address of a BFD reloc is always
4149
       section relative.  */
4150
1.82k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
4151
1.82k
      relent->address = rela.r_offset;
4152
0
    else
4153
0
      relent->address = rela.r_offset - asect->vma;
4154
4155
1.82k
    relent->addend = rela.r_addend;
4156
4157
1.82k
    relent->howto = mips_elf64_rtype_to_howto (abfd, type, rela_p);
4158
1.82k
    if (relent->howto == NULL)
4159
50
      goto error_return;
4160
4161
1.77k
    ++relent;
4162
1.77k
  }
4163
621
    }
4164
4165
75
  free (allocated);
4166
75
  return true;
4167
4168
50
 error_return:
4169
50
  free (allocated);
4170
50
  return false;
4171
125
}
4172
4173
/* Read the relocations.  On Irix 6, there can be two reloc sections
4174
   associated with a single data section.  This is copied from
4175
   elfcode.h as well, with changes as small as accounting for 3
4176
   internal relocs per external reloc.  */
4177
4178
static bool
4179
mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect,
4180
            asymbol **symbols, bool dynamic)
4181
232
{
4182
232
  struct bfd_elf_section_data * const d = elf_section_data (asect);
4183
232
  Elf_Internal_Shdr *rel_hdr;
4184
232
  Elf_Internal_Shdr *rel_hdr2;
4185
232
  bfd_size_type reloc_count;
4186
232
  bfd_size_type reloc_count2;
4187
232
  arelent *relents;
4188
232
  bfd_size_type amt;
4189
4190
232
  if (asect->relocation != NULL)
4191
13
    return true;
4192
4193
219
  if (! dynamic)
4194
216
    {
4195
216
      if ((asect->flags & SEC_RELOC) == 0
4196
216
    || asect->reloc_count == 0)
4197
83
  return true;
4198
4199
133
      rel_hdr = d->rel.hdr;
4200
133
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
4201
133
      rel_hdr2 = d->rela.hdr;
4202
133
      reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
4203
4204
133
      BFD_ASSERT (asect->reloc_count == 3 * (reloc_count + reloc_count2));
4205
133
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
4206
133
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
4207
4208
133
    }
4209
3
  else
4210
3
    {
4211
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
4212
   case because relocations against this section may use the
4213
   dynamic symbol table, and in that case bfd_section_from_shdr
4214
   in elf.c does not update the RELOC_COUNT.  */
4215
3
      if (asect->size == 0)
4216
0
  return true;
4217
4218
3
      rel_hdr = &d->this_hdr;
4219
3
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
4220
3
      rel_hdr2 = NULL;
4221
3
      reloc_count2 = 0;
4222
3
    }
4223
4224
  /* Allocate space for 3 arelent structures for each Rel structure.  */
4225
136
  amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent);
4226
136
  relents = bfd_alloc (abfd, amt);
4227
136
  if (relents == NULL)
4228
0
    return false;
4229
4230
136
  if (rel_hdr != NULL
4231
136
      && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
4232
3
               rel_hdr, reloc_count,
4233
3
               relents,
4234
3
               symbols, dynamic))
4235
0
    return false;
4236
136
  if (rel_hdr2 != NULL
4237
136
      && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
4238
133
               rel_hdr2, reloc_count2,
4239
133
               relents + reloc_count * 3,
4240
133
               symbols, dynamic))
4241
61
    return false;
4242
4243
75
  asect->relocation = relents;
4244
75
  return true;
4245
136
}
4246
4247
/* Write out the relocations.  */
4248
4249
static void
4250
mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
4251
0
{
4252
0
  bool *failedp = data;
4253
0
  int count;
4254
0
  Elf_Internal_Shdr *rel_hdr;
4255
0
  unsigned int idx;
4256
4257
  /* If we have already failed, don't do anything.  */
4258
0
  if (*failedp)
4259
0
    return;
4260
4261
0
  if ((sec->flags & SEC_RELOC) == 0)
4262
0
    return;
4263
4264
  /* The linker backend writes the relocs out itself, and sets the
4265
     reloc_count field to zero to inhibit writing them here.  Also,
4266
     sometimes the SEC_RELOC flag gets set even when there aren't any
4267
     relocs.  */
4268
0
  if (sec->reloc_count == 0)
4269
0
    return;
4270
4271
  /* We can combine up to three relocs that refer to the same address
4272
     if the latter relocs have no associated symbol.  */
4273
0
  count = 0;
4274
0
  for (idx = 0; idx < sec->reloc_count; idx++)
4275
0
    {
4276
0
      bfd_vma addr;
4277
0
      unsigned int i;
4278
4279
0
      ++count;
4280
4281
0
      addr = sec->orelocation[idx]->address;
4282
0
      for (i = 0; i < 2; i++)
4283
0
  {
4284
0
    arelent *r;
4285
4286
0
    if (idx + 1 >= sec->reloc_count)
4287
0
      break;
4288
0
    r = sec->orelocation[idx + 1];
4289
0
    if (r->address != addr
4290
0
        || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
4291
0
        || (*r->sym_ptr_ptr)->value != 0)
4292
0
      break;
4293
4294
    /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
4295
4296
0
    ++idx;
4297
0
  }
4298
0
    }
4299
4300
0
  rel_hdr = _bfd_elf_single_rel_hdr (sec);
4301
4302
  /* Do the actual relocation.  */
4303
4304
0
  if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
4305
0
    mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
4306
0
  else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
4307
0
    mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
4308
0
  else
4309
0
    BFD_ASSERT (0);
4310
0
}
4311
4312
static void
4313
mips_elf64_write_rel (bfd *abfd, asection *sec,
4314
          Elf_Internal_Shdr *rel_hdr,
4315
          int *count, void *data)
4316
0
{
4317
0
  bool *failedp = data;
4318
0
  Elf64_Mips_External_Rel *ext_rel;
4319
0
  unsigned int idx;
4320
0
  asymbol *last_sym = 0;
4321
0
  int last_sym_idx = 0;
4322
4323
0
  rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
4324
0
  rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
4325
0
  if (rel_hdr->contents == NULL)
4326
0
    {
4327
0
      *failedp = true;
4328
0
      return;
4329
0
    }
4330
4331
0
  ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
4332
0
  for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
4333
0
    {
4334
0
      arelent *ptr;
4335
0
      Elf64_Mips_Internal_Rela int_rel;
4336
0
      asymbol *sym;
4337
0
      int n;
4338
0
      unsigned int i;
4339
4340
0
      ptr = sec->orelocation[idx];
4341
4342
      /* The address of an ELF reloc is section relative for an object
4343
   file, and absolute for an executable file or shared library.
4344
   The address of a BFD reloc is always section relative.  */
4345
0
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
4346
0
  int_rel.r_offset = ptr->address;
4347
0
      else
4348
0
  int_rel.r_offset = ptr->address + sec->vma;
4349
4350
0
      sym = *ptr->sym_ptr_ptr;
4351
0
      if (sym == last_sym)
4352
0
  n = last_sym_idx;
4353
0
      else if (bfd_is_abs_section (sym->section) && sym->value == 0)
4354
0
  n = STN_UNDEF;
4355
0
      else
4356
0
  {
4357
0
    last_sym = sym;
4358
0
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
4359
0
    if (n < 0)
4360
0
      {
4361
0
        *failedp = true;
4362
0
        return;
4363
0
      }
4364
0
    last_sym_idx = n;
4365
0
  }
4366
4367
0
      int_rel.r_sym = n;
4368
0
      int_rel.r_ssym = RSS_UNDEF;
4369
4370
0
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
4371
0
    && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
4372
0
    && ! _bfd_elf_validate_reloc (abfd, ptr))
4373
0
  {
4374
0
    *failedp = true;
4375
0
    return;
4376
0
  }
4377
4378
0
      int_rel.r_type = ptr->howto->type;
4379
0
      int_rel.r_type2 = (int) R_MIPS_NONE;
4380
0
      int_rel.r_type3 = (int) R_MIPS_NONE;
4381
4382
0
      for (i = 0; i < 2; i++)
4383
0
  {
4384
0
    arelent *r;
4385
4386
0
    if (idx + 1 >= sec->reloc_count)
4387
0
      break;
4388
0
    r = sec->orelocation[idx + 1];
4389
0
    if (r->address != ptr->address
4390
0
        || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
4391
0
        || (*r->sym_ptr_ptr)->value != 0)
4392
0
      break;
4393
4394
    /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
4395
4396
0
    if (i == 0)
4397
0
      int_rel.r_type2 = r->howto->type;
4398
0
    else
4399
0
      int_rel.r_type3 = r->howto->type;
4400
4401
0
    ++idx;
4402
0
  }
4403
4404
0
      mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
4405
0
    }
4406
4407
0
  BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
4408
0
        == *count);
4409
0
}
4410
4411
static void
4412
mips_elf64_write_rela (bfd *abfd, asection *sec,
4413
           Elf_Internal_Shdr *rela_hdr,
4414
           int *count, void *data)
4415
0
{
4416
0
  bool *failedp = data;
4417
0
  Elf64_Mips_External_Rela *ext_rela;
4418
0
  unsigned int idx;
4419
0
  asymbol *last_sym = 0;
4420
0
  int last_sym_idx = 0;
4421
4422
0
  rela_hdr->sh_size = rela_hdr->sh_entsize * *count;
4423
0
  rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
4424
0
  if (rela_hdr->contents == NULL)
4425
0
    {
4426
0
      *failedp = true;
4427
0
      return;
4428
0
    }
4429
4430
0
  ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
4431
0
  for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
4432
0
    {
4433
0
      arelent *ptr;
4434
0
      Elf64_Mips_Internal_Rela int_rela;
4435
0
      asymbol *sym;
4436
0
      int n;
4437
0
      unsigned int i;
4438
4439
0
      ptr = sec->orelocation[idx];
4440
4441
      /* The address of an ELF reloc is section relative for an object
4442
   file, and absolute for an executable file or shared library.
4443
   The address of a BFD reloc is always section relative.  */
4444
0
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
4445
0
  int_rela.r_offset = ptr->address;
4446
0
      else
4447
0
  int_rela.r_offset = ptr->address + sec->vma;
4448
4449
0
      sym = *ptr->sym_ptr_ptr;
4450
0
      if (sym == last_sym)
4451
0
  n = last_sym_idx;
4452
0
      else if (bfd_is_abs_section (sym->section) && sym->value == 0)
4453
0
  n = STN_UNDEF;
4454
0
      else
4455
0
  {
4456
0
    last_sym = sym;
4457
0
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
4458
0
    if (n < 0)
4459
0
      {
4460
0
        *failedp = true;
4461
0
        return;
4462
0
      }
4463
0
    last_sym_idx = n;
4464
0
  }
4465
4466
0
      int_rela.r_sym = n;
4467
0
      int_rela.r_addend = ptr->addend;
4468
0
      int_rela.r_ssym = RSS_UNDEF;
4469
4470
0
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
4471
0
    && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
4472
0
    && ! _bfd_elf_validate_reloc (abfd, ptr))
4473
0
  {
4474
0
    *failedp = true;
4475
0
    return;
4476
0
  }
4477
4478
0
      int_rela.r_type = ptr->howto->type;
4479
0
      int_rela.r_type2 = (int) R_MIPS_NONE;
4480
0
      int_rela.r_type3 = (int) R_MIPS_NONE;
4481
4482
0
      for (i = 0; i < 2; i++)
4483
0
  {
4484
0
    arelent *r;
4485
4486
0
    if (idx + 1 >= sec->reloc_count)
4487
0
      break;
4488
0
    r = sec->orelocation[idx + 1];
4489
0
    if (r->address != ptr->address
4490
0
        || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
4491
0
        || (*r->sym_ptr_ptr)->value != 0)
4492
0
      break;
4493
4494
    /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
4495
4496
0
    if (i == 0)
4497
0
      int_rela.r_type2 = r->howto->type;
4498
0
    else
4499
0
      int_rela.r_type3 = r->howto->type;
4500
4501
0
    ++idx;
4502
0
  }
4503
4504
0
      mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
4505
0
    }
4506
4507
0
  BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
4508
0
        == *count);
4509
0
}
4510

4511
/* Set the right machine number for a MIPS ELF file.  */
4512
4513
static bool
4514
mips_elf64_object_p (bfd *abfd)
4515
67.2k
{
4516
67.2k
  unsigned long mach;
4517
4518
  /* Irix 6 is broken.  Object file symbol tables are not always
4519
     sorted correctly such that local symbols precede global symbols,
4520
     and the sh_info field in the symbol table is not always right.  */
4521
67.2k
  if (elf64_mips_irix_compat (abfd) != ict_none)
4522
39.3k
    elf_bad_symtab (abfd) = true;
4523
4524
67.2k
  mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
4525
67.2k
  bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
4526
67.2k
  return true;
4527
67.2k
}
4528
4529
/* Depending on the target vector we generate some version of Irix
4530
   executables or "normal" MIPS ELF ABI executables.  */
4531
static irix_compat_t
4532
elf64_mips_irix_compat (bfd *abfd)
4533
67.2k
{
4534
67.2k
  if ((abfd->xvec == &mips_elf64_be_vec)
4535
67.2k
      || (abfd->xvec == &mips_elf64_le_vec))
4536
39.3k
    return ict_irix6;
4537
27.8k
  else
4538
27.8k
    return ict_none;
4539
67.2k
}
4540

4541
/* Support for core dump NOTE sections.  */
4542
static bool
4543
elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
4544
59
{
4545
59
  int offset;
4546
59
  unsigned int size;
4547
4548
59
  switch (note->descsz)
4549
59
    {
4550
53
      default:
4551
53
  return false;
4552
4553
6
      case 480:   /* Linux/MIPS - N64 kernel */
4554
  /* pr_cursig */
4555
6
  elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
4556
4557
  /* pr_pid */
4558
6
  elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
4559
4560
  /* pr_reg */
4561
6
  offset = 112;
4562
6
  size = 360;
4563
4564
6
  break;
4565
59
    }
4566
4567
  /* Make a ".reg/999" section.  */
4568
6
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
4569
6
            size, note->descpos + offset);
4570
59
}
4571
4572
static bool
4573
elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
4574
109
{
4575
109
  switch (note->descsz)
4576
109
    {
4577
109
      default:
4578
109
  return false;
4579
4580
0
      case 136:   /* Linux/MIPS - N64 kernel elf_prpsinfo */
4581
0
  elf_tdata (abfd)->core->pid
4582
0
   = bfd_get_32 (abfd, note->descdata + 24);
4583
0
  elf_tdata (abfd)->core->program
4584
0
   = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
4585
0
  elf_tdata (abfd)->core->command
4586
0
   = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
4587
109
    }
4588
4589
  /* Note that for some reason, a spurious space is tacked
4590
     onto the end of the args in some (at least one anyway)
4591
     implementations, so strip it off if it exists.  */
4592
4593
0
  {
4594
0
    char *command = elf_tdata (abfd)->core->command;
4595
0
    int n = strlen (command);
4596
4597
0
    if (0 < n && command[n - 1] == ' ')
4598
0
      command[n - 1] = '\0';
4599
0
  }
4600
4601
0
  return true;
4602
109
}
4603
4604
/* Write Linux core PRSTATUS note into core file.  */
4605
4606
static char *
4607
elf64_mips_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
4608
           ...)
4609
0
{
4610
0
  switch (note_type)
4611
0
    {
4612
0
    default:
4613
0
      return NULL;
4614
4615
0
    case NT_PRPSINFO:
4616
0
      BFD_FAIL ();
4617
0
      return NULL;
4618
4619
0
    case NT_PRSTATUS:
4620
0
      {
4621
0
  char data[480];
4622
0
  va_list ap;
4623
0
  long pid;
4624
0
  int cursig;
4625
0
  const void *greg;
4626
4627
0
  va_start (ap, note_type);
4628
0
  memset (data, 0, 112);
4629
0
  pid = va_arg (ap, long);
4630
0
  bfd_put_32 (abfd, pid, data + 32);
4631
0
  cursig = va_arg (ap, int);
4632
0
  bfd_put_16 (abfd, cursig, data + 12);
4633
0
  greg = va_arg (ap, const void *);
4634
0
  memcpy (data + 112, greg, 360);
4635
0
  memset (data + 472, 0, 8);
4636
0
  va_end (ap);
4637
0
  return elfcore_write_note (abfd, buf, bufsiz,
4638
0
           "CORE", note_type, data, sizeof (data));
4639
0
      }
4640
0
    }
4641
0
}
4642

4643
/* ECOFF swapping routines.  These are used when dealing with the
4644
   .mdebug section, which is in the ECOFF debugging format.  */
4645
static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
4646
{
4647
  /* Symbol table magic number.  */
4648
  magicSym2,
4649
  /* Alignment of debugging information.  E.g., 4.  */
4650
  8,
4651
  /* Sizes of external symbolic information.  */
4652
  sizeof (struct hdr_ext),
4653
  sizeof (struct dnr_ext),
4654
  sizeof (struct pdr_ext),
4655
  sizeof (struct sym_ext),
4656
  sizeof (struct opt_ext),
4657
  sizeof (struct fdr_ext),
4658
  sizeof (struct rfd_ext),
4659
  sizeof (struct ext_ext),
4660
  /* Functions to swap in external symbolic data.  */
4661
  ecoff_swap_hdr_in,
4662
  ecoff_swap_dnr_in,
4663
  ecoff_swap_pdr_in,
4664
  ecoff_swap_sym_in,
4665
  ecoff_swap_opt_in,
4666
  ecoff_swap_fdr_in,
4667
  ecoff_swap_rfd_in,
4668
  ecoff_swap_ext_in,
4669
  _bfd_ecoff_swap_tir_in,
4670
  _bfd_ecoff_swap_rndx_in,
4671
  /* Functions to swap out external symbolic data.  */
4672
  ecoff_swap_hdr_out,
4673
  ecoff_swap_dnr_out,
4674
  ecoff_swap_pdr_out,
4675
  ecoff_swap_sym_out,
4676
  ecoff_swap_opt_out,
4677
  ecoff_swap_fdr_out,
4678
  ecoff_swap_rfd_out,
4679
  ecoff_swap_ext_out,
4680
  _bfd_ecoff_swap_tir_out,
4681
  _bfd_ecoff_swap_rndx_out,
4682
  /* Function to read in symbolic data.  */
4683
  _bfd_mips_elf_read_ecoff_info
4684
};
4685

4686
/* Relocations in the 64 bit MIPS ELF ABI are more complex than in
4687
   standard ELF.  This structure is used to redirect the relocation
4688
   handling routines.  */
4689
4690
const struct elf_size_info mips_elf64_size_info =
4691
{
4692
  sizeof (Elf64_External_Ehdr),
4693
  sizeof (Elf64_External_Phdr),
4694
  sizeof (Elf64_External_Shdr),
4695
  sizeof (Elf64_Mips_External_Rel),
4696
  sizeof (Elf64_Mips_External_Rela),
4697
  sizeof (Elf64_External_Sym),
4698
  sizeof (Elf64_External_Dyn),
4699
  sizeof (Elf_External_Note),
4700
  4,    /* hash-table entry size */
4701
  3,    /* internal relocations per external relocations */
4702
  64,   /* arch_size */
4703
  3,    /* log_file_align */
4704
  ELFCLASS64,
4705
  EV_CURRENT,
4706
  bfd_elf64_write_out_phdrs,
4707
  bfd_elf64_write_shdrs_and_ehdr,
4708
  bfd_elf64_checksum_contents,
4709
  mips_elf64_write_relocs,
4710
  bfd_elf64_swap_symbol_in,
4711
  bfd_elf64_swap_symbol_out,
4712
  mips_elf64_slurp_reloc_table,
4713
  bfd_elf64_slurp_symbol_table,
4714
  bfd_elf64_swap_dyn_in,
4715
  bfd_elf64_swap_dyn_out,
4716
  mips_elf64_be_swap_reloc_in,
4717
  mips_elf64_be_swap_reloc_out,
4718
  mips_elf64_be_swap_reloca_in,
4719
  mips_elf64_be_swap_reloca_out
4720
};
4721
4722
#define ELF_ARCH      bfd_arch_mips
4723
#define ELF_TARGET_ID     MIPS_ELF_DATA
4724
#define ELF_MACHINE_CODE    EM_MIPS
4725
4726
#define elf_backend_collect   true
4727
#define elf_backend_type_change_ok  true
4728
#define elf_backend_can_gc_sections true
4729
#define elf_backend_gc_mark_extra_sections \
4730
          _bfd_mips_elf_gc_mark_extra_sections
4731
#define elf_info_to_howto   mips_elf64_info_to_howto_rela
4732
#define elf_info_to_howto_rel   mips_elf64_info_to_howto_rela
4733
#define elf_backend_object_p    mips_elf64_object_p
4734
#define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing
4735
#define elf_backend_section_processing  _bfd_mips_elf_section_processing
4736
#define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr
4737
#define elf_backend_fake_sections _bfd_mips_elf_fake_sections
4738
#define elf_backend_section_from_bfd_section \
4739
        _bfd_mips_elf_section_from_bfd_section
4740
#define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook
4741
#define elf_backend_link_output_symbol_hook \
4742
        _bfd_mips_elf_link_output_symbol_hook
4743
#define elf_backend_create_dynamic_sections \
4744
        _bfd_mips_elf_create_dynamic_sections
4745
#define elf_backend_check_relocs  _bfd_mips_elf_check_relocs
4746
#define elf_backend_merge_symbol_attribute \
4747
        _bfd_mips_elf_merge_symbol_attribute
4748
#define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag
4749
#define elf_backend_adjust_dynamic_symbol \
4750
        _bfd_mips_elf_adjust_dynamic_symbol
4751
#define elf_backend_late_size_sections \
4752
        _bfd_mips_elf_late_size_sections
4753
#define elf_backend_init_index_section  _bfd_elf_init_1_index_section
4754
#define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
4755
#define elf_backend_finish_dynamic_symbol \
4756
        _bfd_mips_elf_finish_dynamic_symbol
4757
#define elf_backend_finish_dynamic_sections \
4758
        _bfd_mips_elf_finish_dynamic_sections
4759
#define elf_backend_final_write_processing \
4760
        _bfd_mips_elf_final_write_processing
4761
#define elf_backend_additional_program_headers \
4762
        _bfd_mips_elf_additional_program_headers
4763
#define elf_backend_modify_segment_map  _bfd_mips_elf_modify_segment_map
4764
#define elf_backend_gc_mark_hook  _bfd_mips_elf_gc_mark_hook
4765
#define elf_backend_copy_indirect_symbol \
4766
          _bfd_mips_elf_copy_indirect_symbol
4767
#define elf_backend_hide_symbol   _bfd_mips_elf_hide_symbol
4768
#define elf_backend_ignore_discarded_relocs \
4769
          _bfd_mips_elf_ignore_discarded_relocs
4770
#define elf_backend_mips_irix_compat  elf64_mips_irix_compat
4771
#define elf_backend_mips_rtype_to_howto mips_elf64_rtype_to_howto
4772
#define elf_backend_ecoff_debug_swap  &mips_elf64_ecoff_debug_swap
4773
#define elf_backend_size_info   mips_elf64_size_info
4774
4775
#define elf_backend_grok_prstatus elf64_mips_grok_prstatus
4776
#define elf_backend_grok_psinfo   elf64_mips_grok_psinfo
4777
4778
#define elf_backend_got_header_size (8 * MIPS_RESERVED_GOTNO)
4779
#define elf_backend_want_dynrelro 1
4780
4781
/* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
4782
   work better/work only in RELA, so we default to this.  */
4783
#define elf_backend_may_use_rel_p 1
4784
#define elf_backend_may_use_rela_p  1
4785
#define elf_backend_default_use_rela_p  1
4786
#define elf_backend_rela_plts_and_copies_p 0
4787
#define elf_backend_plt_readonly  1
4788
#define elf_backend_plt_sym_val   _bfd_mips_elf_plt_sym_val
4789
4790
#define elf_backend_sign_extend_vma true
4791
4792
#define elf_backend_write_section _bfd_mips_elf_write_section
4793
#define elf_backend_sort_relocs_p _bfd_mips_elf_sort_relocs_p
4794
4795
/* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit
4796
   MIPS-specific function only applies to IRIX5, which had no 64-bit
4797
   ABI.  */
4798
#define bfd_elf64_bfd_is_target_special_symbol \
4799
          _bfd_mips_elf_is_target_special_symbol
4800
#define bfd_elf64_find_nearest_line _bfd_mips_elf_find_nearest_line
4801
#define bfd_elf64_find_nearest_line_with_alt \
4802
        _bfd_mips_elf_find_nearest_line_with_alt
4803
#define bfd_elf64_find_inliner_info _bfd_mips_elf_find_inliner_info
4804
#define bfd_elf64_new_section_hook  _bfd_mips_elf_new_section_hook
4805
#define bfd_elf64_set_section_contents  _bfd_mips_elf_set_section_contents
4806
#define bfd_elf64_bfd_get_relocated_section_contents \
4807
        _bfd_elf_mips_get_relocated_section_contents
4808
#define bfd_elf64_bfd_link_hash_table_create \
4809
        _bfd_mips_elf_link_hash_table_create
4810
#define bfd_elf64_bfd_final_link  _bfd_mips_elf_final_link
4811
#define bfd_elf64_bfd_merge_private_bfd_data \
4812
        _bfd_mips_elf_merge_private_bfd_data
4813
#define bfd_elf64_bfd_set_private_flags _bfd_mips_elf_set_private_flags
4814
#define bfd_elf64_bfd_print_private_bfd_data \
4815
        _bfd_mips_elf_print_private_bfd_data
4816
4817
#define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
4818
#define bfd_elf64_mkobject    _bfd_mips_elf_mkobject
4819
#define bfd_elf64_bfd_free_cached_info  _bfd_mips_elf_free_cached_info
4820
4821
/* The SGI style (n)64 NewABI.  */
4822
#define TARGET_LITTLE_SYM   mips_elf64_le_vec
4823
#define TARGET_LITTLE_NAME    "elf64-littlemips"
4824
#define TARGET_BIG_SYM      mips_elf64_be_vec
4825
#define TARGET_BIG_NAME     "elf64-bigmips"
4826
4827
#define ELF_MAXPAGESIZE     0x10000
4828
#define ELF_COMMONPAGESIZE    0x1000
4829
4830
#include "elf64-target.h"
4831
4832
/* The SYSV-style 'traditional' (n)64 NewABI.  */
4833
#undef TARGET_LITTLE_SYM
4834
#undef TARGET_LITTLE_NAME
4835
#undef TARGET_BIG_SYM
4836
#undef TARGET_BIG_NAME
4837
4838
#undef ELF_MAXPAGESIZE
4839
#undef ELF_COMMONPAGESIZE
4840
4841
#define TARGET_LITTLE_SYM   mips_elf64_trad_le_vec
4842
#define TARGET_LITTLE_NAME    "elf64-tradlittlemips"
4843
#define TARGET_BIG_SYM      mips_elf64_trad_be_vec
4844
#define TARGET_BIG_NAME     "elf64-tradbigmips"
4845
4846
#define ELF_MAXPAGESIZE     0x10000
4847
#define ELF_COMMONPAGESIZE    0x1000
4848
#define elf64_bed     elf64_tradbed
4849
4850
#undef elf_backend_write_core_note
4851
#define elf_backend_write_core_note elf64_mips_write_core_note
4852
4853
/* Include the target file again for this target.  */
4854
#include "elf64-target.h"
4855
4856
4857
/* FreeBSD support.  */
4858
4859
#undef TARGET_LITTLE_SYM
4860
#undef TARGET_LITTLE_NAME
4861
#undef TARGET_BIG_SYM
4862
#undef TARGET_BIG_NAME
4863
4864
#define TARGET_LITTLE_SYM   mips_elf64_tradfbsd_le_vec
4865
#define TARGET_LITTLE_NAME    "elf64-tradlittlemips-freebsd"
4866
#define TARGET_BIG_SYM      mips_elf64_tradfbsd_be_vec
4867
#define TARGET_BIG_NAME     "elf64-tradbigmips-freebsd"
4868
4869
#undef  ELF_OSABI
4870
#define ELF_OSABI     ELFOSABI_FREEBSD
4871
4872
#undef  elf64_bed
4873
#define elf64_bed       elf64_fbsd_tradbed
4874
4875
#undef elf64_mips_write_core_note
4876
4877
#include "elf64-target.h"