Coverage Report

Created: 2025-06-24 06:45

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