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

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elfn32-mips.c] - Blame information for rev 166

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 14 khays
/* MIPS-specific support for 32-bit ELF
2
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3
   2003, 2004, 2005, 2006, 2007, 2008, 2009 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
         FALSE,                 /* partial_inplace */
1305 166 khays
         0,                      /* src_mask */
1306 14 khays
         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
         FALSE,                 /* partial_inplace */
1319 166 khays
         0,                      /* src_mask */
1320 14 khays
         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
         FALSE,                 /* partial_inplace */
1337 166 khays
         0,                      /* src_mask */
1338 14 khays
         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
         FALSE,                 /* partial_inplace */
1352 166 khays
         0,                      /* src_mask */
1353 14 khays
         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
         FALSE,                 /* partial_inplace */
1367 166 khays
         0,                      /* src_mask */
1368 14 khays
         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
         FALSE,                 /* partial_inplace */
1382 166 khays
         0,                      /* src_mask */
1383 14 khays
         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
         FALSE,                 /* partial_inplace */
1397 166 khays
         0,                      /* src_mask */
1398 14 khays
         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
         FALSE,                 /* partial_inplace */
1412 166 khays
         0,                      /* src_mask */
1413 14 khays
         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
         FALSE,                 /* partial_inplace */
1429 166 khays
         0,                      /* src_mask */
1430 14 khays
         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
         FALSE,                 /* partial_inplace */
1444 166 khays
         0,                      /* src_mask */
1445 14 khays
         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 MIPS16 reference to the global offset table.  */
1500
  HOWTO (R_MIPS16_GOT16,        /* type */
1501
         0,                      /* rightshift */
1502
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1503
         16,                    /* bitsize */
1504
         FALSE,                 /* pc_relative */
1505
         0,                      /* bitpos */
1506
         complain_overflow_dont, /* complain_on_overflow */
1507
         _bfd_mips_elf_got16_reloc, /* special_function */
1508
         "R_MIPS16_GOT16",      /* name */
1509
         TRUE,                  /* partial_inplace */
1510
         0x0000ffff,            /* src_mask */
1511
         0x0000ffff,            /* dst_mask */
1512
         FALSE),                /* pcrel_offset */
1513
 
1514
  /* A MIPS16 call through the global offset table.  */
1515
  HOWTO (R_MIPS16_CALL16,       /* type */
1516
         0,                      /* rightshift */
1517
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1518
         16,                    /* bitsize */
1519
         FALSE,                 /* pc_relative */
1520
         0,                      /* bitpos */
1521
         complain_overflow_dont, /* complain_on_overflow */
1522
         _bfd_mips_elf_generic_reloc, /* special_function */
1523
         "R_MIPS16_CALL16",     /* name */
1524
         TRUE,                  /* partial_inplace */
1525
         0x0000ffff,            /* src_mask */
1526
         0x0000ffff,            /* dst_mask */
1527
         FALSE),                /* pcrel_offset */
1528
 
1529
  /* MIPS16 high 16 bits of symbol value.  */
1530
  HOWTO (R_MIPS16_HI16,         /* type */
1531
         16,                    /* rightshift */
1532
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1533
         16,                    /* bitsize */
1534
         FALSE,                 /* pc_relative */
1535
         0,                      /* bitpos */
1536
         complain_overflow_dont, /* complain_on_overflow */
1537
         _bfd_mips_elf_hi16_reloc, /* special_function */
1538
         "R_MIPS16_HI16",       /* name */
1539
         TRUE,                  /* partial_inplace */
1540
         0x0000ffff,            /* src_mask */
1541
         0x0000ffff,            /* dst_mask */
1542
         FALSE),                /* pcrel_offset */
1543
 
1544
  /* MIPS16 low 16 bits of symbol value.  */
1545
  HOWTO (R_MIPS16_LO16,         /* type */
1546
         0,                      /* rightshift */
1547
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1548
         16,                    /* bitsize */
1549
         FALSE,                 /* pc_relative */
1550
         0,                      /* bitpos */
1551
         complain_overflow_dont, /* complain_on_overflow */
1552
         _bfd_mips_elf_lo16_reloc, /* special_function */
1553
         "R_MIPS16_LO16",       /* name */
1554
         TRUE,                  /* partial_inplace */
1555
         0x0000ffff,            /* src_mask */
1556
         0x0000ffff,            /* dst_mask */
1557
         FALSE),                /* pcrel_offset */
1558 166 khays
 
1559
  /* MIPS16 TLS general dynamic variable reference.  */
1560
  HOWTO (R_MIPS16_TLS_GD,       /* type */
1561
         0,                      /* rightshift */
1562
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1563
         16,                    /* bitsize */
1564
         FALSE,                 /* pc_relative */
1565
         0,                      /* bitpos */
1566
         complain_overflow_signed, /* complain_on_overflow */
1567
         _bfd_mips_elf_generic_reloc, /* special_function */
1568
         "R_MIPS16_TLS_GD",     /* name */
1569
         TRUE,                  /* partial_inplace */
1570
         0x0000ffff,            /* src_mask */
1571
         0x0000ffff,            /* dst_mask */
1572
         FALSE),                /* pcrel_offset */
1573
 
1574
  /* MIPS16 TLS local dynamic variable reference.  */
1575
  HOWTO (R_MIPS16_TLS_LDM,      /* type */
1576
         0,                      /* rightshift */
1577
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1578
         16,                    /* bitsize */
1579
         FALSE,                 /* pc_relative */
1580
         0,                      /* bitpos */
1581
         complain_overflow_signed, /* complain_on_overflow */
1582
         _bfd_mips_elf_generic_reloc, /* special_function */
1583
         "R_MIPS16_TLS_LDM",    /* name */
1584
         TRUE,                  /* partial_inplace */
1585
         0x0000ffff,            /* src_mask */
1586
         0x0000ffff,            /* dst_mask */
1587
         FALSE),                /* pcrel_offset */
1588
 
1589
  /* MIPS16 TLS local dynamic offset.  */
1590
  HOWTO (R_MIPS16_TLS_DTPREL_HI16,      /* type */
1591
         0,                      /* rightshift */
1592
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1593
         16,                    /* bitsize */
1594
         FALSE,                 /* pc_relative */
1595
         0,                      /* bitpos */
1596
         complain_overflow_signed, /* complain_on_overflow */
1597
         _bfd_mips_elf_generic_reloc, /* special_function */
1598
         "R_MIPS16_TLS_DTPREL_HI16",    /* name */
1599
         TRUE,                  /* partial_inplace */
1600
         0x0000ffff,            /* src_mask */
1601
         0x0000ffff,            /* dst_mask */
1602
         FALSE),                /* pcrel_offset */
1603
 
1604
  /* MIPS16 TLS local dynamic offset.  */
1605
  HOWTO (R_MIPS16_TLS_DTPREL_LO16,      /* type */
1606
         0,                      /* rightshift */
1607
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1608
         16,                    /* bitsize */
1609
         FALSE,                 /* pc_relative */
1610
         0,                      /* bitpos */
1611
         complain_overflow_signed, /* complain_on_overflow */
1612
         _bfd_mips_elf_generic_reloc, /* special_function */
1613
         "R_MIPS16_TLS_DTPREL_LO16",    /* name */
1614
         TRUE,                  /* partial_inplace */
1615
         0x0000ffff,            /* src_mask */
1616
         0x0000ffff,            /* dst_mask */
1617
         FALSE),                /* pcrel_offset */
1618
 
1619
  /* MIPS16 TLS thread pointer offset.  */
1620
  HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
1621
         0,                      /* rightshift */
1622
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1623
         16,                    /* bitsize */
1624
         FALSE,                 /* pc_relative */
1625
         0,                      /* bitpos */
1626
         complain_overflow_signed, /* complain_on_overflow */
1627
         _bfd_mips_elf_generic_reloc, /* special_function */
1628
         "R_MIPS16_TLS_GOTTPREL",       /* name */
1629
         TRUE,                  /* partial_inplace */
1630
         0x0000ffff,            /* src_mask */
1631
         0x0000ffff,            /* dst_mask */
1632
         FALSE),                /* pcrel_offset */
1633
 
1634
  /* MIPS16 TLS thread pointer offset.  */
1635
  HOWTO (R_MIPS16_TLS_TPREL_HI16,       /* type */
1636
         0,                      /* rightshift */
1637
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1638
         16,                    /* bitsize */
1639
         FALSE,                 /* pc_relative */
1640
         0,                      /* bitpos */
1641
         complain_overflow_signed, /* complain_on_overflow */
1642
         _bfd_mips_elf_generic_reloc, /* special_function */
1643
         "R_MIPS16_TLS_TPREL_HI16", /* name */
1644
         TRUE,                  /* partial_inplace */
1645
         0x0000ffff,            /* src_mask */
1646
         0x0000ffff,            /* dst_mask */
1647
         FALSE),                /* pcrel_offset */
1648
 
1649
  /* MIPS16 TLS thread pointer offset.  */
1650
  HOWTO (R_MIPS16_TLS_TPREL_LO16,       /* type */
1651
         0,                      /* rightshift */
1652
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1653
         16,                    /* bitsize */
1654
         FALSE,                 /* pc_relative */
1655
         0,                      /* bitpos */
1656
         complain_overflow_signed, /* complain_on_overflow */
1657
         _bfd_mips_elf_generic_reloc, /* special_function */
1658
         "R_MIPS16_TLS_TPREL_LO16", /* name */
1659
         TRUE,                  /* partial_inplace */
1660
         0x0000ffff,            /* src_mask */
1661
         0x0000ffff,            /* dst_mask */
1662
         FALSE),                /* pcrel_offset */
1663 14 khays
};
1664
 
1665
static reloc_howto_type elf_mips16_howto_table_rela[] =
1666
{
1667
  /* The reloc used for the mips16 jump instruction.  */
1668
  HOWTO (R_MIPS16_26,           /* type */
1669
         2,                     /* rightshift */
1670
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1671
         26,                    /* bitsize */
1672
         FALSE,                 /* pc_relative */
1673
         0,                      /* bitpos */
1674
         complain_overflow_dont, /* complain_on_overflow */
1675
                                /* This needs complex overflow
1676
                                   detection, because the upper four
1677
                                   bits must match the PC.  */
1678
         _bfd_mips_elf_generic_reloc, /* special_function */
1679
         "R_MIPS16_26",         /* name */
1680
         FALSE,                 /* partial_inplace */
1681 166 khays
         0,                      /* src_mask */
1682 14 khays
         0x3ffffff,             /* dst_mask */
1683
         FALSE),                /* pcrel_offset */
1684
 
1685
  /* The reloc used for the mips16 gprel instruction.  */
1686
  HOWTO (R_MIPS16_GPREL,        /* type */
1687
         0,                      /* rightshift */
1688
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1689
         16,                    /* bitsize */
1690
         FALSE,                 /* pc_relative */
1691
         0,                      /* bitpos */
1692
         complain_overflow_signed, /* complain_on_overflow */
1693
         mips16_gprel_reloc,    /* special_function */
1694
         "R_MIPS16_GPREL",      /* name */
1695
         FALSE,                 /* partial_inplace */
1696 166 khays
         0,                      /* src_mask */
1697 14 khays
         0x0000ffff,            /* dst_mask */
1698
         FALSE),                /* pcrel_offset */
1699
 
1700
  /* A MIPS16 reference to the global offset table.  */
1701
  HOWTO (R_MIPS16_GOT16,        /* type */
1702
         0,                      /* rightshift */
1703
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1704
         16,                    /* bitsize */
1705
         FALSE,                 /* pc_relative */
1706
         0,                      /* bitpos */
1707
         complain_overflow_dont, /* complain_on_overflow */
1708
         _bfd_mips_elf_got16_reloc, /* special_function */
1709
         "R_MIPS16_GOT16",      /* name */
1710
         FALSE,                 /* partial_inplace */
1711 166 khays
         0,                      /* src_mask */
1712 14 khays
         0x0000ffff,            /* dst_mask */
1713
         FALSE),                /* pcrel_offset */
1714
 
1715
  /* A MIPS16 call through the global offset table.  */
1716
  HOWTO (R_MIPS16_CALL16,       /* type */
1717
         0,                      /* rightshift */
1718
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1719
         16,                    /* bitsize */
1720
         FALSE,                 /* pc_relative */
1721
         0,                      /* bitpos */
1722
         complain_overflow_dont, /* complain_on_overflow */
1723
         _bfd_mips_elf_generic_reloc, /* special_function */
1724
         "R_MIPS16_CALL16",     /* name */
1725
         FALSE,                 /* partial_inplace */
1726 166 khays
         0,                      /* src_mask */
1727 14 khays
         0x0000ffff,            /* dst_mask */
1728
         FALSE),                /* pcrel_offset */
1729
 
1730
  /* MIPS16 high 16 bits of symbol value.  */
1731
  HOWTO (R_MIPS16_HI16,         /* type */
1732
         16,                    /* rightshift */
1733
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1734
         16,                    /* bitsize */
1735
         FALSE,                 /* pc_relative */
1736
         0,                      /* bitpos */
1737
         complain_overflow_dont, /* complain_on_overflow */
1738
         _bfd_mips_elf_hi16_reloc, /* special_function */
1739
         "R_MIPS16_HI16",       /* name */
1740
         FALSE,                 /* partial_inplace */
1741 166 khays
         0,                      /* src_mask */
1742 14 khays
         0x0000ffff,            /* dst_mask */
1743
         FALSE),                /* pcrel_offset */
1744
 
1745
  /* MIPS16 low 16 bits of symbol value.  */
1746
  HOWTO (R_MIPS16_LO16,         /* type */
1747
         0,                      /* rightshift */
1748
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1749
         16,                    /* bitsize */
1750
         FALSE,                 /* pc_relative */
1751
         0,                      /* bitpos */
1752
         complain_overflow_dont, /* complain_on_overflow */
1753
         _bfd_mips_elf_lo16_reloc, /* special_function */
1754
         "R_MIPS16_LO16",       /* name */
1755
         FALSE,                 /* partial_inplace */
1756 166 khays
         0,                      /* src_mask */
1757
         0x0000ffff,            /* dst_mask */
1758
         FALSE),                /* pcrel_offset */
1759
 
1760
  /* MIPS16 TLS general dynamic variable reference.  */
1761
  HOWTO (R_MIPS16_TLS_GD,       /* type */
1762
         0,                      /* rightshift */
1763
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1764
         16,                    /* bitsize */
1765
         FALSE,                 /* pc_relative */
1766
         0,                      /* bitpos */
1767
         complain_overflow_signed, /* complain_on_overflow */
1768
         _bfd_mips_elf_generic_reloc, /* special_function */
1769
         "R_MIPS16_TLS_GD",     /* name */
1770
         FALSE,                 /* partial_inplace */
1771 14 khays
         0x0000ffff,            /* src_mask */
1772
         0x0000ffff,            /* dst_mask */
1773
         FALSE),                /* pcrel_offset */
1774 166 khays
 
1775
  /* MIPS16 TLS local dynamic variable reference.  */
1776
  HOWTO (R_MIPS16_TLS_LDM,      /* type */
1777
         0,                      /* rightshift */
1778
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1779
         16,                    /* bitsize */
1780
         FALSE,                 /* pc_relative */
1781
         0,                      /* bitpos */
1782
         complain_overflow_signed, /* complain_on_overflow */
1783
         _bfd_mips_elf_generic_reloc, /* special_function */
1784
         "R_MIPS16_TLS_LDM",    /* name */
1785
         FALSE,                 /* partial_inplace */
1786
         0x0000ffff,            /* src_mask */
1787
         0x0000ffff,            /* dst_mask */
1788
         FALSE),                /* pcrel_offset */
1789
 
1790
  /* MIPS16 TLS local dynamic offset.  */
1791
  HOWTO (R_MIPS16_TLS_DTPREL_HI16,      /* type */
1792
         0,                      /* rightshift */
1793
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1794
         16,                    /* bitsize */
1795
         FALSE,                 /* pc_relative */
1796
         0,                      /* bitpos */
1797
         complain_overflow_signed, /* complain_on_overflow */
1798
         _bfd_mips_elf_generic_reloc, /* special_function */
1799
         "R_MIPS16_TLS_DTPREL_HI16",    /* name */
1800
         FALSE,                 /* partial_inplace */
1801
         0x0000ffff,            /* src_mask */
1802
         0x0000ffff,            /* dst_mask */
1803
         FALSE),                /* pcrel_offset */
1804
 
1805
  /* MIPS16 TLS local dynamic offset.  */
1806
  HOWTO (R_MIPS16_TLS_DTPREL_LO16,      /* type */
1807
         0,                      /* rightshift */
1808
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1809
         16,                    /* bitsize */
1810
         FALSE,                 /* pc_relative */
1811
         0,                      /* bitpos */
1812
         complain_overflow_signed, /* complain_on_overflow */
1813
         _bfd_mips_elf_generic_reloc, /* special_function */
1814
         "R_MIPS16_TLS_DTPREL_LO16",    /* name */
1815
         FALSE,                 /* partial_inplace */
1816
         0x0000ffff,            /* src_mask */
1817
         0x0000ffff,            /* dst_mask */
1818
         FALSE),                /* pcrel_offset */
1819
 
1820
  /* MIPS16 TLS thread pointer offset.  */
1821
  HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
1822
         0,                      /* rightshift */
1823
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1824
         16,                    /* bitsize */
1825
         FALSE,                 /* pc_relative */
1826
         0,                      /* bitpos */
1827
         complain_overflow_signed, /* complain_on_overflow */
1828
         _bfd_mips_elf_generic_reloc, /* special_function */
1829
         "R_MIPS16_TLS_GOTTPREL",       /* name */
1830
         FALSE,                 /* partial_inplace */
1831
         0x0000ffff,            /* src_mask */
1832
         0x0000ffff,            /* dst_mask */
1833
         FALSE),                /* pcrel_offset */
1834
 
1835
  /* MIPS16 TLS thread pointer offset.  */
1836
  HOWTO (R_MIPS16_TLS_TPREL_HI16,       /* type */
1837
         0,                      /* rightshift */
1838
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1839
         16,                    /* bitsize */
1840
         FALSE,                 /* pc_relative */
1841
         0,                      /* bitpos */
1842
         complain_overflow_signed, /* complain_on_overflow */
1843
         _bfd_mips_elf_generic_reloc, /* special_function */
1844
         "R_MIPS16_TLS_TPREL_HI16", /* name */
1845
         FALSE,                 /* partial_inplace */
1846
         0x0000ffff,            /* src_mask */
1847
         0x0000ffff,            /* dst_mask */
1848
         FALSE),                /* pcrel_offset */
1849
 
1850
  /* MIPS16 TLS thread pointer offset.  */
1851
  HOWTO (R_MIPS16_TLS_TPREL_LO16,       /* type */
1852
         0,                      /* rightshift */
1853
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1854
         16,                    /* bitsize */
1855
         FALSE,                 /* pc_relative */
1856
         0,                      /* bitpos */
1857
         complain_overflow_signed, /* complain_on_overflow */
1858
         _bfd_mips_elf_generic_reloc, /* special_function */
1859
         "R_MIPS16_TLS_TPREL_LO16", /* name */
1860
         FALSE,                 /* partial_inplace */
1861
         0x0000ffff,            /* src_mask */
1862
         0x0000ffff,            /* dst_mask */
1863
         FALSE),                /* pcrel_offset */
1864 14 khays
};
1865
 
1866 161 khays
static reloc_howto_type elf_micromips_howto_table_rel[] =
1867
{
1868
  EMPTY_HOWTO (130),
1869
  EMPTY_HOWTO (131),
1870
  EMPTY_HOWTO (132),
1871
 
1872
  /* 26 bit jump address.  */
1873
  HOWTO (R_MICROMIPS_26_S1,     /* type */
1874
         1,                     /* rightshift */
1875
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1876
         26,                    /* bitsize */
1877
         FALSE,                 /* pc_relative */
1878
         0,                      /* bitpos */
1879
         complain_overflow_dont, /* complain_on_overflow */
1880
                                /* This needs complex overflow
1881
                                   detection, because the upper four
1882
                                   bits must match the PC.  */
1883
         _bfd_mips_elf_generic_reloc, /* special_function */
1884
         "R_MICROMIPS_26_S1",   /* name */
1885
         TRUE,                  /* partial_inplace */
1886
         0x3ffffff,             /* src_mask */
1887
         0x3ffffff,             /* dst_mask */
1888
         FALSE),                /* pcrel_offset */
1889
 
1890
  /* High 16 bits of symbol value.  */
1891
  HOWTO (R_MICROMIPS_HI16,      /* type */
1892
         16,                    /* rightshift */
1893
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1894
         16,                    /* bitsize */
1895
         FALSE,                 /* pc_relative */
1896
         0,                      /* bitpos */
1897
         complain_overflow_dont, /* complain_on_overflow */
1898
         _bfd_mips_elf_hi16_reloc, /* special_function */
1899
         "R_MICROMIPS_HI16",    /* name */
1900
         TRUE,                  /* partial_inplace */
1901
         0x0000ffff,            /* src_mask */
1902
         0x0000ffff,            /* dst_mask */
1903
         FALSE),                /* pcrel_offset */
1904
 
1905
  /* Low 16 bits of symbol value.  */
1906
  HOWTO (R_MICROMIPS_LO16,      /* type */
1907
         0,                      /* rightshift */
1908
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1909
         16,                    /* bitsize */
1910
         FALSE,                 /* pc_relative */
1911
         0,                      /* bitpos */
1912
         complain_overflow_dont, /* complain_on_overflow */
1913
         _bfd_mips_elf_lo16_reloc, /* special_function */
1914
         "R_MICROMIPS_LO16",    /* name */
1915
         TRUE,                  /* partial_inplace */
1916
         0x0000ffff,            /* src_mask */
1917
         0x0000ffff,            /* dst_mask */
1918
         FALSE),                /* pcrel_offset */
1919
 
1920
  /* GP relative reference.  */
1921
  HOWTO (R_MICROMIPS_GPREL16,   /* type */
1922
         0,                      /* rightshift */
1923
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1924
         16,                    /* bitsize */
1925
         FALSE,                 /* pc_relative */
1926
         0,                      /* bitpos */
1927
         complain_overflow_signed, /* complain_on_overflow */
1928
         _bfd_mips_elf32_gprel16_reloc, /* special_function */
1929
         "R_MICROMIPS_GPREL16", /* name */
1930
         TRUE,                  /* partial_inplace */
1931
         0x0000ffff,            /* src_mask */
1932
         0x0000ffff,            /* dst_mask */
1933
         FALSE),                /* pcrel_offset */
1934
 
1935
  /* Reference to literal section.  */
1936
  HOWTO (R_MICROMIPS_LITERAL,   /* type */
1937
         0,                      /* rightshift */
1938
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1939
         16,                    /* bitsize */
1940
         FALSE,                 /* pc_relative */
1941
         0,                      /* bitpos */
1942
         complain_overflow_signed, /* complain_on_overflow */
1943
         _bfd_mips_elf32_gprel16_reloc, /* special_function */
1944
         "R_MICROMIPS_LITERAL", /* name */
1945
         TRUE,                  /* partial_inplace */
1946
         0x0000ffff,            /* src_mask */
1947
         0x0000ffff,            /* dst_mask */
1948
         FALSE),                /* pcrel_offset */
1949
 
1950
  /* Reference to global offset table.  */
1951
  HOWTO (R_MICROMIPS_GOT16,     /* type */
1952
         0,                      /* rightshift */
1953
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1954
         16,                    /* bitsize */
1955
         FALSE,                 /* pc_relative */
1956
         0,                      /* bitpos */
1957
         complain_overflow_signed, /* complain_on_overflow */
1958
         _bfd_mips_elf_got16_reloc, /* special_function */
1959
         "R_MICROMIPS_GOT16",   /* name */
1960
         TRUE,                  /* partial_inplace */
1961
         0x0000ffff,            /* src_mask */
1962
         0x0000ffff,            /* dst_mask */
1963
         FALSE),                /* pcrel_offset */
1964
 
1965
  /* This is for microMIPS branches.  */
1966
  HOWTO (R_MICROMIPS_PC7_S1,    /* type */
1967
         1,                     /* rightshift */
1968
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1969
         7,                     /* bitsize */
1970
         TRUE,                  /* pc_relative */
1971
         0,                      /* bitpos */
1972
         complain_overflow_signed, /* complain_on_overflow */
1973
         _bfd_mips_elf_generic_reloc, /* special_function */
1974
         "R_MICROMIPS_PC7_S1",  /* name */
1975
         TRUE,                  /* partial_inplace */
1976
         0x0000007f,            /* src_mask */
1977
         0x0000007f,            /* dst_mask */
1978
         TRUE),                 /* pcrel_offset */
1979
 
1980
  HOWTO (R_MICROMIPS_PC10_S1,   /* type */
1981
         1,                     /* rightshift */
1982
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1983
         10,                    /* bitsize */
1984
         TRUE,                  /* pc_relative */
1985
         0,                      /* bitpos */
1986
         complain_overflow_signed, /* complain_on_overflow */
1987
         _bfd_mips_elf_generic_reloc, /* special_function */
1988
         "R_MICROMIPS_PC10_S1", /* name */
1989
         TRUE,                  /* partial_inplace */
1990
         0x000003ff,            /* src_mask */
1991
         0x000003ff,            /* dst_mask */
1992
         TRUE),                 /* pcrel_offset */
1993
 
1994
  HOWTO (R_MICROMIPS_PC16_S1,   /* type */
1995
         1,                     /* rightshift */
1996
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1997
         16,                    /* bitsize */
1998
         TRUE,                  /* pc_relative */
1999
         0,                      /* bitpos */
2000
         complain_overflow_signed, /* complain_on_overflow */
2001
         _bfd_mips_elf_generic_reloc, /* special_function */
2002
         "R_MICROMIPS_PC16_S1", /* name */
2003
         TRUE,                  /* partial_inplace */
2004
         0x0000ffff,            /* src_mask */
2005
         0x0000ffff,            /* dst_mask */
2006
         TRUE),                 /* pcrel_offset */
2007
 
2008
  /* 16 bit call through global offset table.  */
2009
  HOWTO (R_MICROMIPS_CALL16,    /* type */
2010
         0,                      /* rightshift */
2011
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2012
         16,                    /* bitsize */
2013
         FALSE,                 /* pc_relative */
2014
         0,                      /* bitpos */
2015
         complain_overflow_signed, /* complain_on_overflow */
2016
         _bfd_mips_elf_generic_reloc, /* special_function */
2017
         "R_MICROMIPS_CALL16",  /* name */
2018
         TRUE,                  /* partial_inplace */
2019
         0x0000ffff,            /* src_mask */
2020
         0x0000ffff,            /* dst_mask */
2021
         FALSE),                /* pcrel_offset */
2022
 
2023
  EMPTY_HOWTO (143),
2024
  EMPTY_HOWTO (144),
2025
 
2026
  /* Displacement in the global offset table.  */
2027
  HOWTO (R_MICROMIPS_GOT_DISP,  /* type */
2028
         0,                      /* rightshift */
2029
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2030
         16,                    /* bitsize */
2031
         FALSE,                 /* pc_relative */
2032
         0,                      /* bitpos */
2033
         complain_overflow_signed, /* complain_on_overflow */
2034
         _bfd_mips_elf_generic_reloc, /* special_function */
2035
         "R_MICROMIPS_GOT_DISP",/* name */
2036
         TRUE,                  /* partial_inplace */
2037
         0x0000ffff,            /* src_mask */
2038
         0x0000ffff,            /* dst_mask */
2039
         FALSE),                /* pcrel_offset */
2040
 
2041
  /* Displacement to page pointer in the global offset table.  */
2042
  HOWTO (R_MICROMIPS_GOT_PAGE,  /* type */
2043
         0,                      /* rightshift */
2044
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2045
         16,                    /* bitsize */
2046
         FALSE,                 /* pc_relative */
2047
         0,                      /* bitpos */
2048
         complain_overflow_signed, /* complain_on_overflow */
2049
         _bfd_mips_elf_generic_reloc, /* special_function */
2050
         "R_MICROMIPS_GOT_PAGE",/* name */
2051
         TRUE,                  /* partial_inplace */
2052
         0x0000ffff,            /* src_mask */
2053
         0x0000ffff,            /* dst_mask */
2054
         FALSE),                /* pcrel_offset */
2055
 
2056
  /* Offset from page pointer in the global offset table.  */
2057
  HOWTO (R_MICROMIPS_GOT_OFST,  /* type */
2058
         0,                      /* rightshift */
2059
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2060
         16,                    /* bitsize */
2061
         FALSE,                 /* pc_relative */
2062
         0,                      /* bitpos */
2063
         complain_overflow_signed, /* complain_on_overflow */
2064
         _bfd_mips_elf_generic_reloc, /* special_function */
2065
         "R_MICROMIPS_GOT_OFST",/* name */
2066
         TRUE,                  /* partial_inplace */
2067
         0x0000ffff,            /* src_mask */
2068
         0x0000ffff,            /* dst_mask */
2069
         FALSE),                /* pcrel_offset */
2070
 
2071
  /* High 16 bits of displacement in global offset table.  */
2072
  HOWTO (R_MICROMIPS_GOT_HI16,  /* type */
2073
         0,                      /* rightshift */
2074
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2075
         16,                    /* bitsize */
2076
         FALSE,                 /* pc_relative */
2077
         0,                      /* bitpos */
2078
         complain_overflow_dont, /* complain_on_overflow */
2079
         _bfd_mips_elf_generic_reloc, /* special_function */
2080
         "R_MICROMIPS_GOT_HI16",/* name */
2081
         TRUE,                  /* partial_inplace */
2082
         0x0000ffff,            /* src_mask */
2083
         0x0000ffff,            /* dst_mask */
2084
         FALSE),                /* pcrel_offset */
2085
 
2086
  /* Low 16 bits of displacement in global offset table.  */
2087
  HOWTO (R_MICROMIPS_GOT_LO16,  /* type */
2088
         0,                      /* rightshift */
2089
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2090
         16,                    /* bitsize */
2091
         FALSE,                 /* pc_relative */
2092
         0,                      /* bitpos */
2093
         complain_overflow_dont, /* complain_on_overflow */
2094
         _bfd_mips_elf_generic_reloc, /* special_function */
2095
         "R_MICROMIPS_GOT_LO16",/* name */
2096
         TRUE,                  /* partial_inplace */
2097
         0x0000ffff,            /* src_mask */
2098
         0x0000ffff,            /* dst_mask */
2099
         FALSE),                /* pcrel_offset */
2100
 
2101
  /* 64 bit subtraction.  Used in the N32 ABI.  */
2102
  HOWTO (R_MICROMIPS_SUB,       /* type */
2103
         0,                      /* rightshift */
2104
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
2105
         64,                    /* bitsize */
2106
         FALSE,                 /* pc_relative */
2107
         0,                      /* bitpos */
2108
         complain_overflow_dont, /* complain_on_overflow */
2109
         _bfd_mips_elf_generic_reloc, /* special_function */
2110
         "R_MICROMIPS_SUB",     /* name */
2111
         TRUE,                  /* partial_inplace */
2112
         MINUS_ONE,             /* src_mask */
2113
         MINUS_ONE,             /* dst_mask */
2114
         FALSE),                /* pcrel_offset */
2115
 
2116
  /* We don't support these for REL relocations, because it means building
2117
     the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
2118
     R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
2119
     using fallable heuristics.  */
2120
  EMPTY_HOWTO (R_MICROMIPS_HIGHER),
2121
  EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
2122
 
2123
  /* High 16 bits of displacement in global offset table.  */
2124
  HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2125
         0,                      /* rightshift */
2126
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2127
         16,                    /* bitsize */
2128
         FALSE,                 /* pc_relative */
2129
         0,                      /* bitpos */
2130
         complain_overflow_dont, /* complain_on_overflow */
2131
         _bfd_mips_elf_generic_reloc, /* special_function */
2132
         "R_MICROMIPS_CALL_HI16",/* name */
2133
         TRUE,                  /* partial_inplace */
2134
         0x0000ffff,            /* src_mask */
2135
         0x0000ffff,            /* dst_mask */
2136
         FALSE),                /* pcrel_offset */
2137
 
2138
  /* Low 16 bits of displacement in global offset table.  */
2139
  HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2140
         0,                      /* rightshift */
2141
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2142
         16,                    /* bitsize */
2143
         FALSE,                 /* pc_relative */
2144
         0,                      /* bitpos */
2145
         complain_overflow_dont, /* complain_on_overflow */
2146
         _bfd_mips_elf_generic_reloc, /* special_function */
2147
         "R_MICROMIPS_CALL_LO16",/* name */
2148
         TRUE,                  /* partial_inplace */
2149
         0x0000ffff,            /* src_mask */
2150
         0x0000ffff,            /* dst_mask */
2151
         FALSE),                /* pcrel_offset */
2152
};
2153
 
2154
static reloc_howto_type elf_micromips_howto_table_rela[] =
2155
{
2156
  EMPTY_HOWTO (130),
2157
  EMPTY_HOWTO (131),
2158
  EMPTY_HOWTO (132),
2159
 
2160
  /* 26 bit jump address.  */
2161
  HOWTO (R_MICROMIPS_26_S1,     /* type */
2162
         1,                     /* rightshift */
2163
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2164
         26,                    /* bitsize */
2165
         FALSE,                 /* pc_relative */
2166
         0,                      /* bitpos */
2167
         complain_overflow_dont, /* complain_on_overflow */
2168
                                /* This needs complex overflow
2169
                                   detection, because the upper four
2170
                                   bits must match the PC.  */
2171
         _bfd_mips_elf_generic_reloc, /* special_function */
2172
         "R_MICROMIPS_26_S1",   /* name */
2173
         FALSE,                 /* partial_inplace */
2174 166 khays
         0,                      /* src_mask */
2175 161 khays
         0x3ffffff,             /* dst_mask */
2176
         FALSE),                /* pcrel_offset */
2177
 
2178
  /* High 16 bits of symbol value.  */
2179
  HOWTO (R_MICROMIPS_HI16,      /* type */
2180
         16,                    /* rightshift */
2181
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2182
         16,                    /* bitsize */
2183
         FALSE,                 /* pc_relative */
2184
         0,                      /* bitpos */
2185
         complain_overflow_dont, /* complain_on_overflow */
2186
         _bfd_mips_elf_hi16_reloc, /* special_function */
2187
         "R_MICROMIPS_HI16",    /* name */
2188
         FALSE,                 /* partial_inplace */
2189 166 khays
         0,                      /* src_mask */
2190 161 khays
         0x0000ffff,            /* dst_mask */
2191
         FALSE),                /* pcrel_offset */
2192
 
2193
  /* Low 16 bits of symbol value.  */
2194
  HOWTO (R_MICROMIPS_LO16,      /* type */
2195
         0,                      /* rightshift */
2196
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2197
         16,                    /* bitsize */
2198
         FALSE,                 /* pc_relative */
2199
         0,                      /* bitpos */
2200
         complain_overflow_dont, /* complain_on_overflow */
2201
         _bfd_mips_elf_lo16_reloc, /* special_function */
2202
         "R_MICROMIPS_LO16",    /* name */
2203
         FALSE,                 /* partial_inplace */
2204 166 khays
         0,                      /* src_mask */
2205 161 khays
         0x0000ffff,            /* dst_mask */
2206
         FALSE),                /* pcrel_offset */
2207
 
2208
  /* GP relative reference.  */
2209
  HOWTO (R_MICROMIPS_GPREL16,   /* type */
2210
         0,                      /* rightshift */
2211
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2212
         16,                    /* bitsize */
2213
         FALSE,                 /* pc_relative */
2214
         0,                      /* bitpos */
2215
         complain_overflow_signed, /* complain_on_overflow */
2216
         _bfd_mips_elf32_gprel16_reloc, /* special_function */
2217
         "R_MICROMIPS_GPREL16", /* name */
2218
         FALSE,                 /* partial_inplace */
2219 166 khays
         0,                      /* src_mask */
2220 161 khays
         0x0000ffff,            /* dst_mask */
2221
         FALSE),                /* pcrel_offset */
2222
 
2223
  /* Reference to literal section.  */
2224
  HOWTO (R_MICROMIPS_LITERAL,   /* type */
2225
         0,                      /* rightshift */
2226
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2227
         16,                    /* bitsize */
2228
         FALSE,                 /* pc_relative */
2229
         0,                      /* bitpos */
2230
         complain_overflow_signed, /* complain_on_overflow */
2231
         _bfd_mips_elf32_gprel16_reloc, /* special_function */
2232
         "R_MICROMIPS_LITERAL", /* name */
2233
         FALSE,                 /* partial_inplace */
2234 166 khays
         0,                      /* src_mask */
2235 161 khays
         0x0000ffff,            /* dst_mask */
2236
         FALSE),                /* pcrel_offset */
2237
 
2238
  /* Reference to global offset table.  */
2239
  HOWTO (R_MICROMIPS_GOT16,     /* type */
2240
         0,                      /* rightshift */
2241
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2242
         16,                    /* bitsize */
2243
         FALSE,                 /* pc_relative */
2244
         0,                      /* bitpos */
2245
         complain_overflow_signed, /* complain_on_overflow */
2246
         _bfd_mips_elf_got16_reloc, /* special_function */
2247
         "R_MICROMIPS_GOT16",   /* name */
2248
         FALSE,                 /* partial_inplace */
2249 166 khays
         0,                      /* src_mask */
2250 161 khays
         0x0000ffff,            /* dst_mask */
2251
         FALSE),                /* pcrel_offset */
2252
 
2253
  /* This is for microMIPS branches.  */
2254
  HOWTO (R_MICROMIPS_PC7_S1,    /* type */
2255
         1,                     /* rightshift */
2256
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
2257
         7,                     /* bitsize */
2258
         TRUE,                  /* pc_relative */
2259
         0,                      /* bitpos */
2260
         complain_overflow_signed, /* complain_on_overflow */
2261
         _bfd_mips_elf_generic_reloc, /* special_function */
2262
         "R_MICROMIPS_PC7_S1",  /* name */
2263
         FALSE,                 /* partial_inplace */
2264 166 khays
         0,                      /* src_mask */
2265 161 khays
         0x0000007f,            /* dst_mask */
2266
         TRUE),                 /* pcrel_offset */
2267
 
2268
  HOWTO (R_MICROMIPS_PC10_S1,   /* type */
2269
         1,                     /* rightshift */
2270
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
2271
         10,                    /* bitsize */
2272
         TRUE,                  /* pc_relative */
2273
         0,                      /* bitpos */
2274
         complain_overflow_signed, /* complain_on_overflow */
2275
         _bfd_mips_elf_generic_reloc, /* special_function */
2276
         "R_MICROMIPS_PC10_S1", /* name */
2277
         FALSE,                 /* partial_inplace */
2278 166 khays
         0,                      /* src_mask */
2279 161 khays
         0x000003ff,            /* dst_mask */
2280
         TRUE),                 /* pcrel_offset */
2281
 
2282
  HOWTO (R_MICROMIPS_PC16_S1,   /* type */
2283
         1,                     /* rightshift */
2284
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2285
         16,                    /* bitsize */
2286
         TRUE,                  /* pc_relative */
2287
         0,                      /* bitpos */
2288
         complain_overflow_signed, /* complain_on_overflow */
2289
         _bfd_mips_elf_generic_reloc, /* special_function */
2290
         "R_MICROMIPS_PC16_S1", /* name */
2291
         FALSE,                 /* partial_inplace */
2292 166 khays
         0,                      /* src_mask */
2293 161 khays
         0x0000ffff,            /* dst_mask */
2294
         TRUE),                 /* pcrel_offset */
2295
 
2296
  /* 16 bit call through global offset table.  */
2297
  HOWTO (R_MICROMIPS_CALL16,    /* type */
2298
         0,                      /* rightshift */
2299
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2300
         16,                    /* bitsize */
2301
         FALSE,                 /* pc_relative */
2302
         0,                      /* bitpos */
2303
         complain_overflow_signed, /* complain_on_overflow */
2304
         _bfd_mips_elf_generic_reloc, /* special_function */
2305
         "R_MICROMIPS_CALL16",  /* name */
2306
         FALSE,                 /* partial_inplace */
2307 166 khays
         0,                      /* src_mask */
2308 161 khays
         0x0000ffff,            /* dst_mask */
2309
         FALSE),                /* pcrel_offset */
2310
 
2311
  EMPTY_HOWTO (143),
2312
  EMPTY_HOWTO (144),
2313
 
2314
  /* Displacement in the global offset table.  */
2315
  HOWTO (R_MICROMIPS_GOT_DISP,  /* type */
2316
         0,                      /* rightshift */
2317
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2318
         16,                    /* bitsize */
2319
         FALSE,                 /* pc_relative */
2320
         0,                      /* bitpos */
2321
         complain_overflow_signed, /* complain_on_overflow */
2322
         _bfd_mips_elf_generic_reloc, /* special_function */
2323
         "R_MICROMIPS_GOT_DISP",/* name */
2324
         FALSE,                 /* partial_inplace */
2325 166 khays
         0,                      /* src_mask */
2326 161 khays
         0x0000ffff,            /* dst_mask */
2327
         FALSE),                /* pcrel_offset */
2328
 
2329
  /* Displacement to page pointer in the global offset table.  */
2330
  HOWTO (R_MICROMIPS_GOT_PAGE,  /* type */
2331
         0,                      /* rightshift */
2332
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2333
         16,                    /* bitsize */
2334
         FALSE,                 /* pc_relative */
2335
         0,                      /* bitpos */
2336
         complain_overflow_signed, /* complain_on_overflow */
2337
         _bfd_mips_elf_generic_reloc, /* special_function */
2338
         "R_MICROMIPS_GOT_PAGE",/* name */
2339
         FALSE,                 /* partial_inplace */
2340 166 khays
         0,                      /* src_mask */
2341 161 khays
         0x0000ffff,            /* dst_mask */
2342
         FALSE),                /* pcrel_offset */
2343
 
2344
  /* Offset from page pointer in the global offset table.  */
2345
  HOWTO (R_MICROMIPS_GOT_OFST,  /* type */
2346
         0,                      /* rightshift */
2347
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2348
         16,                    /* bitsize */
2349
         FALSE,                 /* pc_relative */
2350
         0,                      /* bitpos */
2351
         complain_overflow_signed, /* complain_on_overflow */
2352
         _bfd_mips_elf_generic_reloc, /* special_function */
2353
         "R_MICROMIPS_GOT_OFST",/* name */
2354
         FALSE,                 /* partial_inplace */
2355 166 khays
         0,                      /* src_mask */
2356 161 khays
         0x0000ffff,            /* dst_mask */
2357
         FALSE),                /* pcrel_offset */
2358
 
2359
  /* High 16 bits of displacement in global offset table.  */
2360
  HOWTO (R_MICROMIPS_GOT_HI16,  /* type */
2361
         0,                      /* rightshift */
2362
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2363
         16,                    /* bitsize */
2364
         FALSE,                 /* pc_relative */
2365
         0,                      /* bitpos */
2366
         complain_overflow_dont, /* complain_on_overflow */
2367
         _bfd_mips_elf_generic_reloc, /* special_function */
2368
         "R_MICROMIPS_GOT_HI16",/* name */
2369
         FALSE,                 /* partial_inplace */
2370 166 khays
         0,                      /* src_mask */
2371 161 khays
         0x0000ffff,            /* dst_mask */
2372
         FALSE),                /* pcrel_offset */
2373
 
2374
  /* Low 16 bits of displacement in global offset table.  */
2375
  HOWTO (R_MICROMIPS_GOT_LO16,  /* type */
2376
         0,                      /* rightshift */
2377
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2378
         16,                    /* bitsize */
2379
         FALSE,                 /* pc_relative */
2380
         0,                      /* bitpos */
2381
         complain_overflow_dont, /* complain_on_overflow */
2382
         _bfd_mips_elf_generic_reloc, /* special_function */
2383
         "R_MICROMIPS_GOT_LO16",/* name */
2384
         FALSE,                 /* partial_inplace */
2385 166 khays
         0,                      /* src_mask */
2386 161 khays
         0x0000ffff,            /* dst_mask */
2387
         FALSE),                /* pcrel_offset */
2388
 
2389
  /* 64 bit subtraction.  Used in the N32 ABI.  */
2390
  HOWTO (R_MICROMIPS_SUB,       /* type */
2391
         0,                      /* rightshift */
2392
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
2393
         64,                    /* bitsize */
2394
         FALSE,                 /* pc_relative */
2395
         0,                      /* bitpos */
2396
         complain_overflow_dont, /* complain_on_overflow */
2397
         _bfd_mips_elf_generic_reloc, /* special_function */
2398
         "R_MICROMIPS_SUB",     /* name */
2399
         FALSE,                 /* partial_inplace */
2400 166 khays
         0,                      /* src_mask */
2401 161 khays
         MINUS_ONE,             /* dst_mask */
2402
         FALSE),                /* pcrel_offset */
2403
 
2404
  /* Get the higher value of a 64 bit addend.  */
2405
  HOWTO (R_MICROMIPS_HIGHER,    /* type */
2406
         0,                      /* rightshift */
2407
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2408
         16,                    /* bitsize */
2409
         FALSE,                 /* pc_relative */
2410
         0,                      /* bitpos */
2411
         complain_overflow_dont, /* complain_on_overflow */
2412
         _bfd_mips_elf_generic_reloc, /* special_function */
2413
         "R_MICROMIPS_HIGHER",  /* name */
2414
         FALSE,                 /* partial_inplace */
2415 166 khays
         0,                      /* src_mask */
2416 161 khays
         0x0000ffff,            /* dst_mask */
2417
         FALSE),                /* pcrel_offset */
2418
 
2419
  /* Get the highest value of a 64 bit addend.  */
2420
  HOWTO (R_MICROMIPS_HIGHEST,   /* type */
2421
         0,                      /* rightshift */
2422
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2423
         16,                    /* bitsize */
2424
         FALSE,                 /* pc_relative */
2425
         0,                      /* bitpos */
2426
         complain_overflow_dont, /* complain_on_overflow */
2427
         _bfd_mips_elf_generic_reloc, /* special_function */
2428
         "R_MICROMIPS_HIGHEST", /* name */
2429
         FALSE,                 /* partial_inplace */
2430 166 khays
         0,                      /* src_mask */
2431 161 khays
         0x0000ffff,            /* dst_mask */
2432
         FALSE),                /* pcrel_offset */
2433
 
2434
  /* High 16 bits of displacement in global offset table.  */
2435
  HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2436
         0,                      /* rightshift */
2437
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2438
         16,                    /* bitsize */
2439
         FALSE,                 /* pc_relative */
2440
         0,                      /* bitpos */
2441
         complain_overflow_dont, /* complain_on_overflow */
2442
         _bfd_mips_elf_generic_reloc, /* special_function */
2443
         "R_MICROMIPS_CALL_HI16",/* name */
2444
         FALSE,                 /* partial_inplace */
2445 166 khays
         0,                      /* src_mask */
2446 161 khays
         0x0000ffff,            /* dst_mask */
2447
         FALSE),                /* pcrel_offset */
2448
 
2449
  /* Low 16 bits of displacement in global offset table.  */
2450
  HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2451
         0,                      /* rightshift */
2452
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2453
         16,                    /* bitsize */
2454
         FALSE,                 /* pc_relative */
2455
         0,                      /* bitpos */
2456
         complain_overflow_dont, /* complain_on_overflow */
2457
         _bfd_mips_elf_generic_reloc, /* special_function */
2458
         "R_MICROMIPS_CALL_LO16",/* name */
2459
         FALSE,                 /* partial_inplace */
2460 166 khays
         0,                      /* src_mask */
2461 161 khays
         0x0000ffff,            /* dst_mask */
2462
         FALSE),                /* pcrel_offset */
2463
};
2464
 
2465 14 khays
/* GNU extension to record C++ vtable hierarchy */
2466
static reloc_howto_type elf_mips_gnu_vtinherit_howto =
2467
  HOWTO (R_MIPS_GNU_VTINHERIT,  /* type */
2468
         0,                      /* rightshift */
2469
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2470
         0,                      /* bitsize */
2471
         FALSE,                 /* pc_relative */
2472
         0,                      /* bitpos */
2473
         complain_overflow_dont, /* complain_on_overflow */
2474
         NULL,                  /* special_function */
2475
         "R_MIPS_GNU_VTINHERIT", /* name */
2476
         FALSE,                 /* partial_inplace */
2477
         0,                      /* src_mask */
2478
         0,                      /* dst_mask */
2479
         FALSE);                /* pcrel_offset */
2480
 
2481
/* GNU extension to record C++ vtable member usage */
2482
static reloc_howto_type elf_mips_gnu_vtentry_howto =
2483
  HOWTO (R_MIPS_GNU_VTENTRY,    /* type */
2484
         0,                      /* rightshift */
2485
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2486
         0,                      /* bitsize */
2487
         FALSE,                 /* pc_relative */
2488
         0,                      /* bitpos */
2489
         complain_overflow_dont, /* complain_on_overflow */
2490
         _bfd_elf_rel_vtable_reloc_fn, /* special_function */
2491
         "R_MIPS_GNU_VTENTRY",  /* name */
2492
         FALSE,                 /* partial_inplace */
2493
         0,                      /* src_mask */
2494
         0,                      /* dst_mask */
2495
         FALSE);                /* pcrel_offset */
2496
 
2497
/* 16 bit offset for pc-relative branches.  */
2498
static reloc_howto_type elf_mips_gnu_rel16_s2 =
2499
  HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
2500
         2,                     /* rightshift */
2501
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2502
         16,                    /* bitsize */
2503
         TRUE,                  /* pc_relative */
2504
         0,                      /* bitpos */
2505
         complain_overflow_signed, /* complain_on_overflow */
2506
         _bfd_mips_elf_generic_reloc, /* special_function */
2507
         "R_MIPS_GNU_REL16_S2", /* name */
2508
         TRUE,                  /* partial_inplace */
2509
         0x0000ffff,            /* src_mask */
2510
         0x0000ffff,            /* dst_mask */
2511
         TRUE);                 /* pcrel_offset */
2512
 
2513
/* 16 bit offset for pc-relative branches.  */
2514
static reloc_howto_type elf_mips_gnu_rela16_s2 =
2515
  HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
2516
         2,                     /* rightshift */
2517
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2518
         16,                    /* bitsize */
2519
         TRUE,                  /* pc_relative */
2520
         0,                      /* bitpos */
2521
         complain_overflow_signed, /* complain_on_overflow */
2522
         _bfd_mips_elf_generic_reloc, /* special_function */
2523
         "R_MIPS_GNU_REL16_S2", /* name */
2524
         FALSE,                 /* partial_inplace */
2525
         0,                      /* src_mask */
2526
         0x0000ffff,            /* dst_mask */
2527
         TRUE);                 /* pcrel_offset */
2528
 
2529
/* Originally a VxWorks extension, but now used for other systems too.  */
2530
static reloc_howto_type elf_mips_copy_howto =
2531
  HOWTO (R_MIPS_COPY,           /* type */
2532
         0,                      /* rightshift */
2533
         0,                      /* this one is variable size */
2534
         0,                      /* bitsize */
2535
         FALSE,                 /* pc_relative */
2536
         0,                      /* bitpos */
2537
         complain_overflow_bitfield, /* complain_on_overflow */
2538
         bfd_elf_generic_reloc, /* special_function */
2539
         "R_MIPS_COPY",         /* name */
2540
         FALSE,                 /* partial_inplace */
2541
         0x0,                   /* src_mask */
2542
         0x0,                   /* dst_mask */
2543
         FALSE);                /* pcrel_offset */
2544
 
2545
/* Originally a VxWorks extension, but now used for other systems too.  */
2546
static reloc_howto_type elf_mips_jump_slot_howto =
2547
  HOWTO (R_MIPS_JUMP_SLOT,      /* type */
2548
         0,                      /* rightshift */
2549
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2550
         32,                    /* bitsize */
2551
         FALSE,                 /* pc_relative */
2552
         0,                      /* bitpos */
2553
         complain_overflow_bitfield, /* complain_on_overflow */
2554
         bfd_elf_generic_reloc, /* special_function */
2555
         "R_MIPS_JUMP_SLOT",    /* name */
2556
         FALSE,                 /* partial_inplace */
2557
         0x0,                   /* src_mask */
2558
         0x0,                   /* dst_mask */
2559
         FALSE);                /* pcrel_offset */
2560
 
2561
/* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
2562
   dangerous relocation.  */
2563
 
2564
static bfd_boolean
2565
mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
2566
{
2567
  unsigned int count;
2568
  asymbol **sym;
2569
  unsigned int i;
2570
 
2571
  /* If we've already figured out what GP will be, just return it.  */
2572
  *pgp = _bfd_get_gp_value (output_bfd);
2573
  if (*pgp)
2574
    return TRUE;
2575
 
2576
  count = bfd_get_symcount (output_bfd);
2577
  sym = bfd_get_outsymbols (output_bfd);
2578
 
2579
  /* The linker script will have created a symbol named `_gp' with the
2580
     appropriate value.  */
2581
  if (sym == NULL)
2582
    i = count;
2583
  else
2584
    {
2585
      for (i = 0; i < count; i++, sym++)
2586
        {
2587
          register const char *name;
2588
 
2589
          name = bfd_asymbol_name (*sym);
2590
          if (*name == '_' && strcmp (name, "_gp") == 0)
2591
            {
2592
              *pgp = bfd_asymbol_value (*sym);
2593
              _bfd_set_gp_value (output_bfd, *pgp);
2594
              break;
2595
            }
2596
        }
2597
    }
2598
 
2599
  if (i >= count)
2600
    {
2601
      /* Only get the error once.  */
2602
      *pgp = 4;
2603
      _bfd_set_gp_value (output_bfd, *pgp);
2604
      return FALSE;
2605
    }
2606
 
2607
  return TRUE;
2608
}
2609
 
2610
/* We have to figure out the gp value, so that we can adjust the
2611
   symbol value correctly.  We look up the symbol _gp in the output
2612
   BFD.  If we can't find it, we're stuck.  We cache it in the ELF
2613
   target data.  We don't need to adjust the symbol value for an
2614
   external symbol if we are producing relocatable output.  */
2615
 
2616
static bfd_reloc_status_type
2617
mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
2618
                   char **error_message, bfd_vma *pgp)
2619
{
2620
  if (bfd_is_und_section (symbol->section)
2621
      && ! relocatable)
2622
    {
2623
      *pgp = 0;
2624
      return bfd_reloc_undefined;
2625
    }
2626
 
2627
  *pgp = _bfd_get_gp_value (output_bfd);
2628
  if (*pgp == 0
2629
      && (! relocatable
2630
          || (symbol->flags & BSF_SECTION_SYM) != 0))
2631
    {
2632
      if (relocatable)
2633
        {
2634
          /* Make up a value.  */
2635
          *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
2636
          _bfd_set_gp_value (output_bfd, *pgp);
2637
        }
2638
      else if (!mips_elf_assign_gp (output_bfd, pgp))
2639
        {
2640
          *error_message =
2641
            (char *) _("GP relative relocation when _gp not defined");
2642
          return bfd_reloc_dangerous;
2643
        }
2644
    }
2645
 
2646
  return bfd_reloc_ok;
2647
}
2648
 
2649
/* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
2650
   become the offset from the gp register.  */
2651
 
2652
static bfd_reloc_status_type
2653
mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2654
                        asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2655
                        asection *input_section, bfd *output_bfd,
2656
                        char **error_message ATTRIBUTE_UNUSED)
2657
{
2658
  bfd_boolean relocatable;
2659
  bfd_reloc_status_type ret;
2660
  bfd_vma gp;
2661
 
2662
  if (output_bfd != NULL)
2663
    relocatable = TRUE;
2664
  else
2665
    {
2666
      relocatable = FALSE;
2667
      output_bfd = symbol->section->output_section->owner;
2668
    }
2669
 
2670
  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
2671
                           &gp);
2672
  if (ret != bfd_reloc_ok)
2673
    return ret;
2674
 
2675
  return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2676
                                        input_section, relocatable,
2677
                                        data, gp);
2678
}
2679
 
2680
/* Do a R_MIPS_LITERAL relocation.  */
2681
 
2682
static bfd_reloc_status_type
2683
mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2684
                        void *data, asection *input_section, bfd *output_bfd,
2685
                        char **error_message)
2686
{
2687
  bfd_boolean relocatable;
2688
  bfd_reloc_status_type ret;
2689
  bfd_vma gp;
2690
 
2691
  /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
2692
  if (output_bfd != NULL
2693
      && (symbol->flags & BSF_SECTION_SYM) == 0
2694
      && (symbol->flags & BSF_LOCAL) != 0)
2695
    {
2696
      *error_message = (char *)
2697
        _("literal relocation occurs for an external symbol");
2698
      return bfd_reloc_outofrange;
2699
    }
2700
 
2701
  /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
2702
  if (output_bfd != NULL)
2703
    relocatable = TRUE;
2704
  else
2705
    {
2706
      relocatable = FALSE;
2707
      output_bfd = symbol->section->output_section->owner;
2708
    }
2709
 
2710
  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
2711
                           &gp);
2712
  if (ret != bfd_reloc_ok)
2713
    return ret;
2714
 
2715
  return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2716
                                        input_section, relocatable,
2717
                                        data, gp);
2718
}
2719
 
2720
/* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
2721
   become the offset from the gp register.  */
2722
 
2723
static bfd_reloc_status_type
2724
mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2725
                        void *data, asection *input_section, bfd *output_bfd,
2726
                        char **error_message)
2727
{
2728
  bfd_boolean relocatable;
2729
  bfd_reloc_status_type ret;
2730
  bfd_vma gp;
2731
 
2732
  /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
2733
  if (output_bfd != NULL
2734
      && (symbol->flags & BSF_SECTION_SYM) == 0
2735
      && (symbol->flags & BSF_LOCAL) != 0)
2736
    {
2737
      *error_message = (char *)
2738
        _("32bits gp relative relocation occurs for an external symbol");
2739
      return bfd_reloc_outofrange;
2740
    }
2741
 
2742
  if (output_bfd != NULL)
2743
    {
2744
      relocatable = TRUE;
2745
      gp = _bfd_get_gp_value (output_bfd);
2746
    }
2747
  else
2748
    {
2749
      relocatable = FALSE;
2750
      output_bfd = symbol->section->output_section->owner;
2751
 
2752
      ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
2753
                               error_message, &gp);
2754
      if (ret != bfd_reloc_ok)
2755
        return ret;
2756
    }
2757
 
2758
  return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
2759
                          relocatable, data, gp);
2760
}
2761
 
2762
static bfd_reloc_status_type
2763
gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
2764
                 asection *input_section, bfd_boolean relocatable,
2765
                 void *data, bfd_vma gp)
2766
{
2767
  bfd_vma relocation;
2768
  unsigned long val;
2769
 
2770
  if (bfd_is_com_section (symbol->section))
2771
    relocation = 0;
2772
  else
2773
    relocation = symbol->value;
2774
 
2775
  relocation += symbol->section->output_section->vma;
2776
  relocation += symbol->section->output_offset;
2777
 
2778
  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2779
    return bfd_reloc_outofrange;
2780
 
2781
  if (reloc_entry->howto->src_mask == 0)
2782
    val = 0;
2783
  else
2784
    val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
2785
 
2786
  /* Set val to the offset into the section or symbol.  */
2787
  val += reloc_entry->addend;
2788
 
2789
  /* Adjust val for the final section location and GP value.  If we
2790
     are producing relocatable output, we don't want to do this for
2791
     an external symbol.  */
2792
  if (! relocatable
2793
      || (symbol->flags & BSF_SECTION_SYM) != 0)
2794
    val += relocation - gp;
2795
 
2796
  bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
2797
 
2798
  if (relocatable)
2799
    reloc_entry->address += input_section->output_offset;
2800
 
2801
  return bfd_reloc_ok;
2802
}
2803
 
2804
/* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
2805
   the rest is at bits 6-10. The bitpos already got right by the howto.  */
2806
 
2807
static bfd_reloc_status_type
2808
mips_elf_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2809
                       void *data, asection *input_section, bfd *output_bfd,
2810
                       char **error_message)
2811
{
2812
  if (reloc_entry->howto->partial_inplace)
2813
    {
2814
      reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
2815
                             | (reloc_entry->addend & 0x00000800) >> 9);
2816
    }
2817
 
2818
  return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2819
                                      input_section, output_bfd,
2820
                                      error_message);
2821
}
2822
 
2823
/* Handle a mips16 GP relative reloc.  */
2824
 
2825
static bfd_reloc_status_type
2826
mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2827
                    void *data, asection *input_section, bfd *output_bfd,
2828
                    char **error_message)
2829
{
2830
  bfd_boolean relocatable;
2831
  bfd_reloc_status_type ret;
2832
  bfd_byte *location;
2833
  bfd_vma gp;
2834
 
2835
  /* If we're relocating, and this is an external symbol, we don't want
2836
     to change anything.  */
2837
  if (output_bfd != NULL
2838
      && (symbol->flags & BSF_SECTION_SYM) == 0
2839
      && (symbol->flags & BSF_LOCAL) != 0)
2840
    {
2841
      reloc_entry->address += input_section->output_offset;
2842
      return bfd_reloc_ok;
2843
    }
2844
 
2845
  if (output_bfd != NULL)
2846
    relocatable = TRUE;
2847
  else
2848
    {
2849
      relocatable = FALSE;
2850
      output_bfd = symbol->section->output_section->owner;
2851
    }
2852
 
2853
  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
2854
                           &gp);
2855
  if (ret != bfd_reloc_ok)
2856
    return ret;
2857
 
2858
  location = (bfd_byte *) data + reloc_entry->address;
2859 161 khays
  _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
2860
                                 location);
2861 14 khays
  ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2862
                                       input_section, relocatable,
2863
                                       data, gp);
2864 161 khays
  _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
2865
                               location);
2866 14 khays
 
2867
  return ret;
2868
}
2869
 
2870
/* A mapping from BFD reloc types to MIPS ELF reloc types.  */
2871
 
2872
struct elf_reloc_map {
2873
  bfd_reloc_code_real_type bfd_val;
2874
  enum elf_mips_reloc_type elf_val;
2875
};
2876
 
2877
static const struct elf_reloc_map mips_reloc_map[] =
2878
{
2879
  { BFD_RELOC_NONE, R_MIPS_NONE },
2880
  { BFD_RELOC_16, R_MIPS_16 },
2881
  { BFD_RELOC_32, R_MIPS_32 },
2882
  /* There is no BFD reloc for R_MIPS_REL32.  */
2883
  { BFD_RELOC_CTOR, R_MIPS_32 },
2884
  { BFD_RELOC_64, R_MIPS_64 },
2885
  { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
2886
  { BFD_RELOC_HI16_S, R_MIPS_HI16 },
2887
  { BFD_RELOC_LO16, R_MIPS_LO16 },
2888
  { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
2889
  { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
2890
  { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
2891
  { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
2892
  { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
2893
  { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
2894
  { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
2895
  { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
2896
  { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
2897
  { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
2898
  { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
2899
  { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
2900
  { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
2901
  { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
2902
  { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
2903
  { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
2904
  { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
2905
  { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
2906
  { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
2907
  { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
2908
  { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
2909
  { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
2910
  { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
2911
  /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
2912
  { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
2913
  { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
2914
  { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
2915
  { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
2916
  { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
2917
  { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
2918
  { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
2919
  { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
2920
  { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
2921
  { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
2922
  { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
2923
  { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
2924
  { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
2925
  { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
2926
  { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
2927
};
2928
 
2929
static const struct elf_reloc_map mips16_reloc_map[] =
2930
{
2931
  { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
2932
  { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
2933
  { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
2934
  { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
2935
  { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
2936
  { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
2937 166 khays
  { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
2938
  { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
2939
  { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
2940
    R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
2941
  { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
2942
    R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
2943
  { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
2944
  { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
2945
  { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
2946 14 khays
};
2947
 
2948 161 khays
static const struct elf_reloc_map micromips_reloc_map[] =
2949
{
2950
  { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
2951
  { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
2952
  { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
2953
  { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
2954
  { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
2955
  { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
2956
  { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
2957
  { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
2958
  { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
2959
  { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
2960
  { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
2961
  { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
2962
  { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
2963
  { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
2964
  { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
2965
  { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
2966
  { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
2967
  { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
2968
  { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
2969
  { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
2970
};
2971
 
2972 14 khays
/* Given a BFD reloc type, return a howto structure.  */
2973
 
2974
static reloc_howto_type *
2975
bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2976
                                 bfd_reloc_code_real_type code)
2977
{
2978
  unsigned int i;
2979
  /* FIXME: We default to RELA here instead of choosing the right
2980
     relocation variant.  */
2981
  reloc_howto_type *howto_table = elf_mips_howto_table_rela;
2982
  reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;
2983 161 khays
  reloc_howto_type *howto_micromips_table = elf_micromips_howto_table_rela;
2984 14 khays
 
2985
  for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
2986
       i++)
2987
    {
2988
      if (mips_reloc_map[i].bfd_val == code)
2989
        return &howto_table[(int) mips_reloc_map[i].elf_val];
2990
    }
2991
 
2992
  for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
2993
       i++)
2994
    {
2995
      if (mips16_reloc_map[i].bfd_val == code)
2996
        return &howto16_table[(int) mips16_reloc_map[i].elf_val];
2997
    }
2998
 
2999 161 khays
  for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
3000
       i++)
3001
    {
3002
      if (micromips_reloc_map[i].bfd_val == code)
3003
        return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
3004
    }
3005
 
3006 14 khays
  switch (code)
3007
    {
3008
    case BFD_RELOC_VTABLE_INHERIT:
3009
      return &elf_mips_gnu_vtinherit_howto;
3010
    case BFD_RELOC_VTABLE_ENTRY:
3011
      return &elf_mips_gnu_vtentry_howto;
3012
    case BFD_RELOC_MIPS_COPY:
3013
      return &elf_mips_copy_howto;
3014
    case BFD_RELOC_MIPS_JUMP_SLOT:
3015
      return &elf_mips_jump_slot_howto;
3016
    default:
3017
      bfd_set_error (bfd_error_bad_value);
3018
      return NULL;
3019
    }
3020
}
3021
 
3022
static reloc_howto_type *
3023
bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3024
                                 const char *r_name)
3025
{
3026
  unsigned int i;
3027
 
3028
  for (i = 0;
3029
       i < (sizeof (elf_mips_howto_table_rela)
3030
            / sizeof (elf_mips_howto_table_rela[0]));
3031
       i++)
3032
    if (elf_mips_howto_table_rela[i].name != NULL
3033
        && strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
3034
      return &elf_mips_howto_table_rela[i];
3035
 
3036
  for (i = 0;
3037
       i < (sizeof (elf_mips16_howto_table_rela)
3038
            / sizeof (elf_mips16_howto_table_rela[0]));
3039
       i++)
3040
    if (elf_mips16_howto_table_rela[i].name != NULL
3041
        && strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
3042
      return &elf_mips16_howto_table_rela[i];
3043
 
3044 161 khays
  for (i = 0;
3045
       i < (sizeof (elf_micromips_howto_table_rela)
3046
            / sizeof (elf_micromips_howto_table_rela[0]));
3047
       i++)
3048
    if (elf_micromips_howto_table_rela[i].name != NULL
3049
        && strcasecmp (elf_micromips_howto_table_rela[i].name, r_name) == 0)
3050
      return &elf_micromips_howto_table_rela[i];
3051
 
3052 14 khays
  if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
3053
    return &elf_mips_gnu_vtinherit_howto;
3054
  if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
3055
    return &elf_mips_gnu_vtentry_howto;
3056
  if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
3057
    return &elf_mips_gnu_rel16_s2;
3058
  if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
3059
    return &elf_mips_gnu_rela16_s2;
3060
  if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
3061
    return &elf_mips_copy_howto;
3062
  if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
3063
    return &elf_mips_jump_slot_howto;
3064
 
3065
  return NULL;
3066
}
3067
 
3068
/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
3069
 
3070
static reloc_howto_type *
3071
mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
3072
{
3073
  switch (r_type)
3074
    {
3075
    case R_MIPS_GNU_VTINHERIT:
3076
      return &elf_mips_gnu_vtinherit_howto;
3077
    case R_MIPS_GNU_VTENTRY:
3078
      return &elf_mips_gnu_vtentry_howto;
3079
    case R_MIPS_GNU_REL16_S2:
3080
      if (rela_p)
3081
        return &elf_mips_gnu_rela16_s2;
3082
      else
3083
        return &elf_mips_gnu_rel16_s2;
3084
    case R_MIPS_COPY:
3085
      return &elf_mips_copy_howto;
3086
    case R_MIPS_JUMP_SLOT:
3087
      return &elf_mips_jump_slot_howto;
3088
    default:
3089 161 khays
      if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
3090
        {
3091
          if (rela_p)
3092
            return &elf_micromips_howto_table_rela[r_type - R_MICROMIPS_min];
3093
          else
3094
            return &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min];
3095
        }
3096 14 khays
      if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
3097
        {
3098
          if (rela_p)
3099
            return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
3100
          else
3101
            return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
3102
        }
3103
      BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
3104
      if (rela_p)
3105
        return &elf_mips_howto_table_rela[r_type];
3106
      else
3107
        return &elf_mips_howto_table_rel[r_type];
3108
      break;
3109
    }
3110
}
3111
 
3112
/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
3113
 
3114
static void
3115
mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
3116
{
3117
  unsigned int r_type;
3118
 
3119
  r_type = ELF32_R_TYPE (dst->r_info);
3120
  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE);
3121
 
3122
  /* The addend for a GPREL16 or LITERAL relocation comes from the GP
3123
     value for the object file.  We get the addend now, rather than
3124
     when we do the relocation, because the symbol manipulations done
3125
     by the linker may cause us to lose track of the input BFD.  */
3126
  if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
3127
      && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL))
3128
    cache_ptr->addend = elf_gp (abfd);
3129
}
3130
 
3131
/* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
3132
 
3133
static void
3134
mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
3135
                         arelent *cache_ptr, Elf_Internal_Rela *dst)
3136
{
3137
  unsigned int r_type;
3138
 
3139
  r_type = ELF32_R_TYPE (dst->r_info);
3140
  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
3141
  cache_ptr->addend = dst->r_addend;
3142
}
3143
 
3144
/* Determine whether a symbol is global for the purposes of splitting
3145
   the symbol table into global symbols and local symbols.  At least
3146
   on Irix 5, this split must be between section symbols and all other
3147
   symbols.  On most ELF targets the split is between static symbols
3148
   and externally visible symbols.  */
3149
 
3150
static bfd_boolean
3151
mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
3152
{
3153
  if (SGI_COMPAT (abfd))
3154
    return (sym->flags & BSF_SECTION_SYM) == 0;
3155
  else
3156
    return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
3157
            || bfd_is_und_section (bfd_get_section (sym))
3158
            || bfd_is_com_section (bfd_get_section (sym)));
3159
}
3160
 
3161
/* Set the right machine number for a MIPS ELF file.  */
3162
 
3163
static bfd_boolean
3164
mips_elf_n32_object_p (bfd *abfd)
3165
{
3166
  unsigned long mach;
3167
 
3168
  /* Irix 5 and 6 are broken.  Object file symbol tables are not always
3169
     sorted correctly such that local symbols precede global symbols,
3170
     and the sh_info field in the symbol table is not always right.  */
3171
  if (SGI_COMPAT (abfd))
3172
    elf_bad_symtab (abfd) = TRUE;
3173
 
3174
  mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
3175
  bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
3176
 
3177
  if (! ABI_N32_P(abfd))
3178
    return FALSE;
3179
 
3180
  return TRUE;
3181
}
3182
 
3183
/* Support for core dump NOTE sections.  */
3184
static bfd_boolean
3185
elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3186
{
3187
  int offset;
3188
  unsigned int size;
3189
 
3190
  switch (note->descsz)
3191
    {
3192
      default:
3193
        return FALSE;
3194
 
3195
      case 440:         /* Linux/MIPS N32 */
3196
        /* pr_cursig */
3197
        elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
3198
 
3199
        /* pr_pid */
3200
        elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
3201
 
3202
        /* pr_reg */
3203
        offset = 72;
3204
        size = 360;
3205
 
3206
        break;
3207
    }
3208
 
3209
  /* Make a ".reg/999" section.  */
3210
  return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
3211
                                          note->descpos + offset);
3212
}
3213
 
3214
static bfd_boolean
3215
elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3216
{
3217
  switch (note->descsz)
3218
    {
3219
      default:
3220
        return FALSE;
3221
 
3222
      case 128:         /* Linux/MIPS elf_prpsinfo */
3223
        elf_tdata (abfd)->core_program
3224
         = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
3225
        elf_tdata (abfd)->core_command
3226
         = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
3227
    }
3228
 
3229
  /* Note that for some reason, a spurious space is tacked
3230
     onto the end of the args in some (at least one anyway)
3231
     implementations, so strip it off if it exists.  */
3232
 
3233
  {
3234
    char *command = elf_tdata (abfd)->core_command;
3235
    int n = strlen (command);
3236
 
3237
    if (0 < n && command[n - 1] == ' ')
3238
      command[n - 1] = '\0';
3239
  }
3240
 
3241
  return TRUE;
3242
}
3243
 
3244
/* Depending on the target vector we generate some version of Irix
3245
   executables or "normal" MIPS ELF ABI executables.  */
3246
static irix_compat_t
3247
elf_n32_mips_irix_compat (bfd *abfd)
3248
{
3249
  if ((abfd->xvec == &bfd_elf32_nbigmips_vec)
3250
      || (abfd->xvec == &bfd_elf32_nlittlemips_vec))
3251
    return ict_irix6;
3252
  else
3253
    return ict_none;
3254
}
3255
 
3256
/* ECOFF swapping routines.  These are used when dealing with the
3257
   .mdebug section, which is in the ECOFF debugging format.  */
3258
static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
3259
  /* Symbol table magic number.  */
3260
  magicSym,
3261
  /* Alignment of debugging information.  E.g., 4.  */
3262
  4,
3263
  /* Sizes of external symbolic information.  */
3264
  sizeof (struct hdr_ext),
3265
  sizeof (struct dnr_ext),
3266
  sizeof (struct pdr_ext),
3267
  sizeof (struct sym_ext),
3268
  sizeof (struct opt_ext),
3269
  sizeof (struct fdr_ext),
3270
  sizeof (struct rfd_ext),
3271
  sizeof (struct ext_ext),
3272
  /* Functions to swap in external symbolic data.  */
3273
  ecoff_swap_hdr_in,
3274
  ecoff_swap_dnr_in,
3275
  ecoff_swap_pdr_in,
3276
  ecoff_swap_sym_in,
3277
  ecoff_swap_opt_in,
3278
  ecoff_swap_fdr_in,
3279
  ecoff_swap_rfd_in,
3280
  ecoff_swap_ext_in,
3281
  _bfd_ecoff_swap_tir_in,
3282
  _bfd_ecoff_swap_rndx_in,
3283
  /* Functions to swap out external symbolic data.  */
3284
  ecoff_swap_hdr_out,
3285
  ecoff_swap_dnr_out,
3286
  ecoff_swap_pdr_out,
3287
  ecoff_swap_sym_out,
3288
  ecoff_swap_opt_out,
3289
  ecoff_swap_fdr_out,
3290
  ecoff_swap_rfd_out,
3291
  ecoff_swap_ext_out,
3292
  _bfd_ecoff_swap_tir_out,
3293
  _bfd_ecoff_swap_rndx_out,
3294
  /* Function to read in symbolic data.  */
3295
  _bfd_mips_elf_read_ecoff_info
3296
};
3297
 
3298
#define ELF_ARCH                        bfd_arch_mips
3299
#define ELF_TARGET_ID                   MIPS_ELF_DATA
3300
#define ELF_MACHINE_CODE                EM_MIPS
3301
 
3302
#define elf_backend_collect             TRUE
3303
#define elf_backend_type_change_ok      TRUE
3304
#define elf_backend_can_gc_sections     TRUE
3305
#define elf_info_to_howto               mips_info_to_howto_rela
3306
#define elf_info_to_howto_rel           mips_info_to_howto_rel
3307
#define elf_backend_sym_is_global       mips_elf_sym_is_global
3308
#define elf_backend_object_p            mips_elf_n32_object_p
3309
#define elf_backend_symbol_processing   _bfd_mips_elf_symbol_processing
3310
#define elf_backend_section_processing  _bfd_mips_elf_section_processing
3311
#define elf_backend_section_from_shdr   _bfd_mips_elf_section_from_shdr
3312
#define elf_backend_fake_sections       _bfd_mips_elf_fake_sections
3313
#define elf_backend_section_from_bfd_section \
3314
                                        _bfd_mips_elf_section_from_bfd_section
3315
#define elf_backend_add_symbol_hook     _bfd_mips_elf_add_symbol_hook
3316
#define elf_backend_link_output_symbol_hook \
3317
                                        _bfd_mips_elf_link_output_symbol_hook
3318
#define elf_backend_create_dynamic_sections \
3319
                                        _bfd_mips_elf_create_dynamic_sections
3320
#define elf_backend_check_relocs        _bfd_mips_elf_check_relocs
3321
#define elf_backend_merge_symbol_attribute \
3322
                                        _bfd_mips_elf_merge_symbol_attribute
3323
#define elf_backend_get_target_dtag     _bfd_mips_elf_get_target_dtag
3324
#define elf_backend_adjust_dynamic_symbol \
3325
                                        _bfd_mips_elf_adjust_dynamic_symbol
3326
#define elf_backend_always_size_sections \
3327
                                        _bfd_mips_elf_always_size_sections
3328
#define elf_backend_size_dynamic_sections \
3329
                                        _bfd_mips_elf_size_dynamic_sections
3330
#define elf_backend_init_index_section  _bfd_elf_init_1_index_section
3331
#define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
3332
#define elf_backend_finish_dynamic_symbol \
3333
                                        _bfd_mips_elf_finish_dynamic_symbol
3334
#define elf_backend_finish_dynamic_sections \
3335
                                        _bfd_mips_elf_finish_dynamic_sections
3336
#define elf_backend_final_write_processing \
3337
                                        _bfd_mips_elf_final_write_processing
3338
#define elf_backend_additional_program_headers \
3339
                                        _bfd_mips_elf_additional_program_headers
3340
#define elf_backend_modify_segment_map  _bfd_mips_elf_modify_segment_map
3341
#define elf_backend_gc_mark_hook        _bfd_mips_elf_gc_mark_hook
3342
#define elf_backend_gc_sweep_hook       _bfd_mips_elf_gc_sweep_hook
3343
#define elf_backend_copy_indirect_symbol \
3344
                                        _bfd_mips_elf_copy_indirect_symbol
3345
#define elf_backend_grok_prstatus       elf32_mips_grok_prstatus
3346
#define elf_backend_grok_psinfo         elf32_mips_grok_psinfo
3347
#define elf_backend_ecoff_debug_swap    &mips_elf32_ecoff_debug_swap
3348
 
3349
#define elf_backend_got_header_size     (4 * MIPS_RESERVED_GOTNO)
3350
 
3351
/* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
3352
   work better/work only in RELA, so we default to this.  */
3353
#define elf_backend_may_use_rel_p       1
3354
#define elf_backend_may_use_rela_p      1
3355
#define elf_backend_default_use_rela_p  1
3356
#define elf_backend_rela_plts_and_copies_p 0
3357
#define elf_backend_sign_extend_vma     TRUE
3358
#define elf_backend_plt_readonly        1
3359
#define elf_backend_plt_sym_val         _bfd_mips_elf_plt_sym_val
3360
 
3361
#define elf_backend_discard_info        _bfd_mips_elf_discard_info
3362
#define elf_backend_ignore_discarded_relocs \
3363
                                        _bfd_mips_elf_ignore_discarded_relocs
3364
#define elf_backend_write_section       _bfd_mips_elf_write_section
3365
#define elf_backend_mips_irix_compat    elf_n32_mips_irix_compat
3366
#define elf_backend_mips_rtype_to_howto mips_elf_n32_rtype_to_howto
3367 161 khays
#define bfd_elf32_bfd_is_target_special_symbol \
3368
                                        _bfd_mips_elf_is_target_special_symbol
3369 14 khays
#define bfd_elf32_find_nearest_line     _bfd_mips_elf_find_nearest_line
3370
#define bfd_elf32_find_inliner_info     _bfd_mips_elf_find_inliner_info
3371
#define bfd_elf32_new_section_hook      _bfd_mips_elf_new_section_hook
3372
#define bfd_elf32_set_section_contents  _bfd_mips_elf_set_section_contents
3373
#define bfd_elf32_bfd_get_relocated_section_contents \
3374
                                _bfd_elf_mips_get_relocated_section_contents
3375
#define bfd_elf32_bfd_link_hash_table_create \
3376
                                        _bfd_mips_elf_link_hash_table_create
3377
#define bfd_elf32_bfd_final_link        _bfd_mips_elf_final_link
3378
#define bfd_elf32_bfd_merge_private_bfd_data \
3379
                                        _bfd_mips_elf_merge_private_bfd_data
3380
#define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
3381
#define bfd_elf32_bfd_print_private_bfd_data \
3382
                                        _bfd_mips_elf_print_private_bfd_data
3383
#define bfd_elf32_bfd_relax_section     _bfd_mips_relax_section
3384
 
3385
/* Support for SGI-ish mips targets using n32 ABI.  */
3386
 
3387
#define TARGET_LITTLE_SYM               bfd_elf32_nlittlemips_vec
3388
#define TARGET_LITTLE_NAME              "elf32-nlittlemips"
3389
#define TARGET_BIG_SYM                  bfd_elf32_nbigmips_vec
3390
#define TARGET_BIG_NAME                 "elf32-nbigmips"
3391
 
3392
#define ELF_MAXPAGESIZE                 0x10000
3393
#define ELF_COMMONPAGESIZE              0x1000
3394
 
3395
#include "elf32-target.h"
3396
 
3397
/* Support for traditional mips targets using n32 ABI.  */
3398
#undef TARGET_LITTLE_SYM
3399
#undef TARGET_LITTLE_NAME
3400
#undef TARGET_BIG_SYM
3401
#undef TARGET_BIG_NAME
3402
 
3403
#undef ELF_MAXPAGESIZE
3404
#undef ELF_COMMONPAGESIZE
3405
 
3406
#define TARGET_LITTLE_SYM               bfd_elf32_ntradlittlemips_vec
3407
#define TARGET_LITTLE_NAME              "elf32-ntradlittlemips"
3408
#define TARGET_BIG_SYM                  bfd_elf32_ntradbigmips_vec
3409
#define TARGET_BIG_NAME                 "elf32-ntradbigmips"
3410
 
3411
#define ELF_MAXPAGESIZE                 0x10000
3412
#define ELF_COMMONPAGESIZE              0x1000
3413
#define elf32_bed                       elf32_tradbed
3414
 
3415
/* Include the target file again for this target.  */
3416
#include "elf32-target.h"
3417
 
3418
 
3419
/* FreeBSD support.  */
3420
 
3421
#undef TARGET_LITTLE_SYM
3422
#undef TARGET_LITTLE_NAME
3423
#undef TARGET_BIG_SYM
3424
#undef TARGET_BIG_NAME
3425
 
3426
#define TARGET_LITTLE_SYM               bfd_elf32_ntradlittlemips_freebsd_vec
3427
#define TARGET_LITTLE_NAME              "elf32-ntradlittlemips-freebsd"
3428
#define TARGET_BIG_SYM                  bfd_elf32_ntradbigmips_freebsd_vec
3429
#define TARGET_BIG_NAME                 "elf32-ntradbigmips-freebsd"
3430
 
3431
#undef  ELF_OSABI
3432
#define ELF_OSABI                       ELFOSABI_FREEBSD
3433
 
3434
/* The kernel recognizes executables as valid only if they carry a
3435
   "FreeBSD" label in the ELF header.  So we put this label on all
3436
   executables and (for simplicity) also all other object files.  */
3437
 
3438
static void
3439
elf_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
3440
{
3441
  _bfd_elf_set_osabi (abfd, info);
3442
}
3443
 
3444
#undef  elf_backend_post_process_headers
3445
#define elf_backend_post_process_headers        elf_fbsd_post_process_headers
3446
#undef  elf32_bed
3447
#define elf32_bed                               elf32_fbsd_tradbed
3448
 
3449
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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