OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [bfd/] [elfn32-mips.c] - Blame information for rev 856

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.