Coverage Report

Created: 2025-06-24 06:45

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