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 146

Go to most recent revision | 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
         0xffffffff,            /* src_mask */
1306
         0xffffffff,            /* dst_mask */
1307
         FALSE),                /* pcrel_offset */
1308
 
1309
  HOWTO (R_MIPS_TLS_DTPREL32,   /* type */
1310
         0,                      /* rightshift */
1311
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1312
         32,                    /* bitsize */
1313
         FALSE,                 /* pc_relative */
1314
         0,                      /* bitpos */
1315
         complain_overflow_dont, /* complain_on_overflow */
1316
         _bfd_mips_elf_generic_reloc, /* special_function */
1317
         "R_MIPS_TLS_DTPREL32", /* name */
1318
         FALSE,                 /* partial_inplace */
1319
         0xffffffff,            /* src_mask */
1320
         0xffffffff,            /* dst_mask */
1321
         FALSE),                /* pcrel_offset */
1322
 
1323
  EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
1324
  EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
1325
 
1326
  /* TLS general dynamic variable reference.  */
1327
  HOWTO (R_MIPS_TLS_GD,         /* type */
1328
         0,                      /* rightshift */
1329
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1330
         16,                    /* bitsize */
1331
         FALSE,                 /* pc_relative */
1332
         0,                      /* bitpos */
1333
         complain_overflow_signed, /* complain_on_overflow */
1334
         _bfd_mips_elf_generic_reloc, /* special_function */
1335
         "R_MIPS_TLS_GD",       /* name */
1336
         FALSE,                 /* partial_inplace */
1337
         0x0000ffff,            /* src_mask */
1338
         0x0000ffff,            /* dst_mask */
1339
         FALSE),                /* pcrel_offset */
1340
 
1341
  /* TLS local dynamic variable reference.  */
1342
  HOWTO (R_MIPS_TLS_LDM,        /* type */
1343
         0,                      /* rightshift */
1344
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1345
         16,                    /* bitsize */
1346
         FALSE,                 /* pc_relative */
1347
         0,                      /* bitpos */
1348
         complain_overflow_signed, /* complain_on_overflow */
1349
         _bfd_mips_elf_generic_reloc, /* special_function */
1350
         "R_MIPS_TLS_LDM",      /* name */
1351
         FALSE,                 /* partial_inplace */
1352
         0x0000ffff,            /* src_mask */
1353
         0x0000ffff,            /* dst_mask */
1354
         FALSE),                /* pcrel_offset */
1355
 
1356
  /* TLS local dynamic offset.  */
1357
  HOWTO (R_MIPS_TLS_DTPREL_HI16,        /* type */
1358
         0,                      /* rightshift */
1359
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1360
         16,                    /* bitsize */
1361
         FALSE,                 /* pc_relative */
1362
         0,                      /* bitpos */
1363
         complain_overflow_signed, /* complain_on_overflow */
1364
         _bfd_mips_elf_generic_reloc, /* special_function */
1365
         "R_MIPS_TLS_DTPREL_HI16",      /* name */
1366
         FALSE,                 /* partial_inplace */
1367
         0x0000ffff,            /* src_mask */
1368
         0x0000ffff,            /* dst_mask */
1369
         FALSE),                /* pcrel_offset */
1370
 
1371
  /* TLS local dynamic offset.  */
1372
  HOWTO (R_MIPS_TLS_DTPREL_LO16,        /* type */
1373
         0,                      /* rightshift */
1374
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1375
         16,                    /* bitsize */
1376
         FALSE,                 /* pc_relative */
1377
         0,                      /* bitpos */
1378
         complain_overflow_signed, /* complain_on_overflow */
1379
         _bfd_mips_elf_generic_reloc, /* special_function */
1380
         "R_MIPS_TLS_DTPREL_LO16",      /* name */
1381
         FALSE,                 /* partial_inplace */
1382
         0x0000ffff,            /* src_mask */
1383
         0x0000ffff,            /* dst_mask */
1384
         FALSE),                /* pcrel_offset */
1385
 
1386
  /* TLS thread pointer offset.  */
1387
  HOWTO (R_MIPS_TLS_GOTTPREL,   /* type */
1388
         0,                      /* rightshift */
1389
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1390
         16,                    /* bitsize */
1391
         FALSE,                 /* pc_relative */
1392
         0,                      /* bitpos */
1393
         complain_overflow_signed, /* complain_on_overflow */
1394
         _bfd_mips_elf_generic_reloc, /* special_function */
1395
         "R_MIPS_TLS_GOTTPREL", /* name */
1396
         FALSE,                 /* partial_inplace */
1397
         0x0000ffff,            /* src_mask */
1398
         0x0000ffff,            /* dst_mask */
1399
         FALSE),                /* pcrel_offset */
1400
 
1401
  /* TLS IE dynamic relocations.  */
1402
  HOWTO (R_MIPS_TLS_TPREL32,    /* type */
1403
         0,                      /* rightshift */
1404
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1405
         32,                    /* bitsize */
1406
         FALSE,                 /* pc_relative */
1407
         0,                      /* bitpos */
1408
         complain_overflow_dont, /* complain_on_overflow */
1409
         _bfd_mips_elf_generic_reloc, /* special_function */
1410
         "R_MIPS_TLS_TPREL32",  /* name */
1411
         FALSE,                 /* partial_inplace */
1412
         0xffffffff,            /* src_mask */
1413
         0xffffffff,            /* dst_mask */
1414
         FALSE),                /* pcrel_offset */
1415
 
1416
  EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
1417
 
1418
  /* TLS thread pointer offset.  */
1419
  HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
1420
         0,                      /* rightshift */
1421
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1422
         16,                    /* bitsize */
1423
         FALSE,                 /* pc_relative */
1424
         0,                      /* bitpos */
1425
         complain_overflow_signed, /* complain_on_overflow */
1426
         _bfd_mips_elf_generic_reloc, /* special_function */
1427
         "R_MIPS_TLS_TPREL_HI16", /* name */
1428
         FALSE,                 /* partial_inplace */
1429
         0x0000ffff,            /* src_mask */
1430
         0x0000ffff,            /* dst_mask */
1431
         FALSE),                /* pcrel_offset */
1432
 
1433
  /* TLS thread pointer offset.  */
1434
  HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
1435
         0,                      /* rightshift */
1436
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1437
         16,                    /* bitsize */
1438
         FALSE,                 /* pc_relative */
1439
         0,                      /* bitpos */
1440
         complain_overflow_signed, /* complain_on_overflow */
1441
         _bfd_mips_elf_generic_reloc, /* special_function */
1442
         "R_MIPS_TLS_TPREL_LO16", /* name */
1443
         FALSE,                 /* partial_inplace */
1444
         0x0000ffff,            /* src_mask */
1445
         0x0000ffff,            /* dst_mask */
1446
         FALSE),                /* pcrel_offset */
1447
 
1448
  /* 32 bit relocation with no addend.  */
1449
  HOWTO (R_MIPS_GLOB_DAT,       /* type */
1450
         0,                      /* rightshift */
1451
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1452
         32,                    /* bitsize */
1453
         FALSE,                 /* pc_relative */
1454
         0,                      /* bitpos */
1455
         complain_overflow_dont, /* complain_on_overflow */
1456
         _bfd_mips_elf_generic_reloc, /* special_function */
1457
         "R_MIPS_GLOB_DAT",     /* name */
1458
         FALSE,                 /* partial_inplace */
1459
         0x0,                   /* src_mask */
1460
         0xffffffff,            /* dst_mask */
1461
         FALSE),                /* pcrel_offset */
1462
};
1463
 
1464
static reloc_howto_type elf_mips16_howto_table_rel[] =
1465
{
1466
  /* The reloc used for the mips16 jump instruction.  */
1467
  HOWTO (R_MIPS16_26,           /* type */
1468
         2,                     /* rightshift */
1469
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1470
         26,                    /* bitsize */
1471
         FALSE,                 /* pc_relative */
1472
         0,                      /* bitpos */
1473
         complain_overflow_dont, /* complain_on_overflow */
1474
                                /* This needs complex overflow
1475
                                   detection, because the upper four
1476
                                   bits must match the PC.  */
1477
         _bfd_mips_elf_generic_reloc, /* special_function */
1478
         "R_MIPS16_26",         /* name */
1479
         TRUE,                  /* partial_inplace */
1480
         0x3ffffff,             /* src_mask */
1481
         0x3ffffff,             /* dst_mask */
1482
         FALSE),                /* pcrel_offset */
1483
 
1484
  /* The reloc used for the mips16 gprel instruction.  */
1485
  HOWTO (R_MIPS16_GPREL,        /* type */
1486
         0,                      /* rightshift */
1487
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1488
         16,                    /* bitsize */
1489
         FALSE,                 /* pc_relative */
1490
         0,                      /* bitpos */
1491
         complain_overflow_signed, /* complain_on_overflow */
1492
         mips16_gprel_reloc,    /* special_function */
1493
         "R_MIPS16_GPREL",      /* name */
1494
         TRUE,                  /* partial_inplace */
1495
         0x0000ffff,            /* src_mask */
1496
         0x0000ffff,            /* dst_mask */
1497
         FALSE),                /* pcrel_offset */
1498
 
1499
  /* A 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
};
1559
 
1560
static reloc_howto_type elf_mips16_howto_table_rela[] =
1561
{
1562
  /* The reloc used for the mips16 jump instruction.  */
1563
  HOWTO (R_MIPS16_26,           /* type */
1564
         2,                     /* rightshift */
1565
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1566
         26,                    /* bitsize */
1567
         FALSE,                 /* pc_relative */
1568
         0,                      /* bitpos */
1569
         complain_overflow_dont, /* complain_on_overflow */
1570
                                /* This needs complex overflow
1571
                                   detection, because the upper four
1572
                                   bits must match the PC.  */
1573
         _bfd_mips_elf_generic_reloc, /* special_function */
1574
         "R_MIPS16_26",         /* name */
1575
         FALSE,                 /* partial_inplace */
1576
         0x3ffffff,             /* src_mask */
1577
         0x3ffffff,             /* dst_mask */
1578
         FALSE),                /* pcrel_offset */
1579
 
1580
  /* The reloc used for the mips16 gprel instruction.  */
1581
  HOWTO (R_MIPS16_GPREL,        /* type */
1582
         0,                      /* rightshift */
1583
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1584
         16,                    /* bitsize */
1585
         FALSE,                 /* pc_relative */
1586
         0,                      /* bitpos */
1587
         complain_overflow_signed, /* complain_on_overflow */
1588
         mips16_gprel_reloc,    /* special_function */
1589
         "R_MIPS16_GPREL",      /* name */
1590
         FALSE,                 /* partial_inplace */
1591
         0x0000ffff,            /* src_mask */
1592
         0x0000ffff,            /* dst_mask */
1593
         FALSE),                /* pcrel_offset */
1594
 
1595
  /* A MIPS16 reference to the global offset table.  */
1596
  HOWTO (R_MIPS16_GOT16,        /* type */
1597
         0,                      /* rightshift */
1598
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1599
         16,                    /* bitsize */
1600
         FALSE,                 /* pc_relative */
1601
         0,                      /* bitpos */
1602
         complain_overflow_dont, /* complain_on_overflow */
1603
         _bfd_mips_elf_got16_reloc, /* special_function */
1604
         "R_MIPS16_GOT16",      /* name */
1605
         FALSE,                 /* partial_inplace */
1606
         0x0000ffff,            /* src_mask */
1607
         0x0000ffff,            /* dst_mask */
1608
         FALSE),                /* pcrel_offset */
1609
 
1610
  /* A MIPS16 call through the global offset table.  */
1611
  HOWTO (R_MIPS16_CALL16,       /* type */
1612
         0,                      /* rightshift */
1613
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1614
         16,                    /* bitsize */
1615
         FALSE,                 /* pc_relative */
1616
         0,                      /* bitpos */
1617
         complain_overflow_dont, /* complain_on_overflow */
1618
         _bfd_mips_elf_generic_reloc, /* special_function */
1619
         "R_MIPS16_CALL16",     /* name */
1620
         FALSE,                 /* partial_inplace */
1621
         0x0000ffff,            /* src_mask */
1622
         0x0000ffff,            /* dst_mask */
1623
         FALSE),                /* pcrel_offset */
1624
 
1625
  /* MIPS16 high 16 bits of symbol value.  */
1626
  HOWTO (R_MIPS16_HI16,         /* type */
1627
         16,                    /* rightshift */
1628
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1629
         16,                    /* bitsize */
1630
         FALSE,                 /* pc_relative */
1631
         0,                      /* bitpos */
1632
         complain_overflow_dont, /* complain_on_overflow */
1633
         _bfd_mips_elf_hi16_reloc, /* special_function */
1634
         "R_MIPS16_HI16",       /* name */
1635
         FALSE,                 /* partial_inplace */
1636
         0x0000ffff,            /* src_mask */
1637
         0x0000ffff,            /* dst_mask */
1638
         FALSE),                /* pcrel_offset */
1639
 
1640
  /* MIPS16 low 16 bits of symbol value.  */
1641
  HOWTO (R_MIPS16_LO16,         /* type */
1642
         0,                      /* rightshift */
1643
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1644
         16,                    /* bitsize */
1645
         FALSE,                 /* pc_relative */
1646
         0,                      /* bitpos */
1647
         complain_overflow_dont, /* complain_on_overflow */
1648
         _bfd_mips_elf_lo16_reloc, /* special_function */
1649
         "R_MIPS16_LO16",       /* name */
1650
         FALSE,                 /* partial_inplace */
1651
         0x0000ffff,            /* src_mask */
1652
         0x0000ffff,            /* dst_mask */
1653
         FALSE),                /* pcrel_offset */
1654
};
1655
 
1656
/* GNU extension to record C++ vtable hierarchy */
1657
static reloc_howto_type elf_mips_gnu_vtinherit_howto =
1658
  HOWTO (R_MIPS_GNU_VTINHERIT,  /* type */
1659
         0,                      /* rightshift */
1660
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1661
         0,                      /* bitsize */
1662
         FALSE,                 /* pc_relative */
1663
         0,                      /* bitpos */
1664
         complain_overflow_dont, /* complain_on_overflow */
1665
         NULL,                  /* special_function */
1666
         "R_MIPS_GNU_VTINHERIT", /* name */
1667
         FALSE,                 /* partial_inplace */
1668
         0,                      /* src_mask */
1669
         0,                      /* dst_mask */
1670
         FALSE);                /* pcrel_offset */
1671
 
1672
/* GNU extension to record C++ vtable member usage */
1673
static reloc_howto_type elf_mips_gnu_vtentry_howto =
1674
  HOWTO (R_MIPS_GNU_VTENTRY,    /* type */
1675
         0,                      /* rightshift */
1676
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1677
         0,                      /* bitsize */
1678
         FALSE,                 /* pc_relative */
1679
         0,                      /* bitpos */
1680
         complain_overflow_dont, /* complain_on_overflow */
1681
         _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1682
         "R_MIPS_GNU_VTENTRY",  /* name */
1683
         FALSE,                 /* partial_inplace */
1684
         0,                      /* src_mask */
1685
         0,                      /* dst_mask */
1686
         FALSE);                /* pcrel_offset */
1687
 
1688
/* 16 bit offset for pc-relative branches.  */
1689
static reloc_howto_type elf_mips_gnu_rel16_s2 =
1690
  HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
1691
         2,                     /* rightshift */
1692
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1693
         16,                    /* bitsize */
1694
         TRUE,                  /* pc_relative */
1695
         0,                      /* bitpos */
1696
         complain_overflow_signed, /* complain_on_overflow */
1697
         _bfd_mips_elf_generic_reloc, /* special_function */
1698
         "R_MIPS_GNU_REL16_S2", /* name */
1699
         TRUE,                  /* partial_inplace */
1700
         0x0000ffff,            /* src_mask */
1701
         0x0000ffff,            /* dst_mask */
1702
         TRUE);                 /* pcrel_offset */
1703
 
1704
/* 16 bit offset for pc-relative branches.  */
1705
static reloc_howto_type elf_mips_gnu_rela16_s2 =
1706
  HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
1707
         2,                     /* rightshift */
1708
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1709
         16,                    /* bitsize */
1710
         TRUE,                  /* pc_relative */
1711
         0,                      /* bitpos */
1712
         complain_overflow_signed, /* complain_on_overflow */
1713
         _bfd_mips_elf_generic_reloc, /* special_function */
1714
         "R_MIPS_GNU_REL16_S2", /* name */
1715
         FALSE,                 /* partial_inplace */
1716
         0,                      /* src_mask */
1717
         0x0000ffff,            /* dst_mask */
1718
         TRUE);                 /* pcrel_offset */
1719
 
1720
/* Originally a VxWorks extension, but now used for other systems too.  */
1721
static reloc_howto_type elf_mips_copy_howto =
1722
  HOWTO (R_MIPS_COPY,           /* type */
1723
         0,                      /* rightshift */
1724
         0,                      /* this one is variable size */
1725
         0,                      /* bitsize */
1726
         FALSE,                 /* pc_relative */
1727
         0,                      /* bitpos */
1728
         complain_overflow_bitfield, /* complain_on_overflow */
1729
         bfd_elf_generic_reloc, /* special_function */
1730
         "R_MIPS_COPY",         /* name */
1731
         FALSE,                 /* partial_inplace */
1732
         0x0,                   /* src_mask */
1733
         0x0,                   /* dst_mask */
1734
         FALSE);                /* pcrel_offset */
1735
 
1736
/* Originally a VxWorks extension, but now used for other systems too.  */
1737
static reloc_howto_type elf_mips_jump_slot_howto =
1738
  HOWTO (R_MIPS_JUMP_SLOT,      /* type */
1739
         0,                      /* rightshift */
1740
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1741
         32,                    /* bitsize */
1742
         FALSE,                 /* pc_relative */
1743
         0,                      /* bitpos */
1744
         complain_overflow_bitfield, /* complain_on_overflow */
1745
         bfd_elf_generic_reloc, /* special_function */
1746
         "R_MIPS_JUMP_SLOT",    /* name */
1747
         FALSE,                 /* partial_inplace */
1748
         0x0,                   /* src_mask */
1749
         0x0,                   /* dst_mask */
1750
         FALSE);                /* pcrel_offset */
1751
 
1752
/* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
1753
   dangerous relocation.  */
1754
 
1755
static bfd_boolean
1756
mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
1757
{
1758
  unsigned int count;
1759
  asymbol **sym;
1760
  unsigned int i;
1761
 
1762
  /* If we've already figured out what GP will be, just return it.  */
1763
  *pgp = _bfd_get_gp_value (output_bfd);
1764
  if (*pgp)
1765
    return TRUE;
1766
 
1767
  count = bfd_get_symcount (output_bfd);
1768
  sym = bfd_get_outsymbols (output_bfd);
1769
 
1770
  /* The linker script will have created a symbol named `_gp' with the
1771
     appropriate value.  */
1772
  if (sym == NULL)
1773
    i = count;
1774
  else
1775
    {
1776
      for (i = 0; i < count; i++, sym++)
1777
        {
1778
          register const char *name;
1779
 
1780
          name = bfd_asymbol_name (*sym);
1781
          if (*name == '_' && strcmp (name, "_gp") == 0)
1782
            {
1783
              *pgp = bfd_asymbol_value (*sym);
1784
              _bfd_set_gp_value (output_bfd, *pgp);
1785
              break;
1786
            }
1787
        }
1788
    }
1789
 
1790
  if (i >= count)
1791
    {
1792
      /* Only get the error once.  */
1793
      *pgp = 4;
1794
      _bfd_set_gp_value (output_bfd, *pgp);
1795
      return FALSE;
1796
    }
1797
 
1798
  return TRUE;
1799
}
1800
 
1801
/* We have to figure out the gp value, so that we can adjust the
1802
   symbol value correctly.  We look up the symbol _gp in the output
1803
   BFD.  If we can't find it, we're stuck.  We cache it in the ELF
1804
   target data.  We don't need to adjust the symbol value for an
1805
   external symbol if we are producing relocatable output.  */
1806
 
1807
static bfd_reloc_status_type
1808
mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
1809
                   char **error_message, bfd_vma *pgp)
1810
{
1811
  if (bfd_is_und_section (symbol->section)
1812
      && ! relocatable)
1813
    {
1814
      *pgp = 0;
1815
      return bfd_reloc_undefined;
1816
    }
1817
 
1818
  *pgp = _bfd_get_gp_value (output_bfd);
1819
  if (*pgp == 0
1820
      && (! relocatable
1821
          || (symbol->flags & BSF_SECTION_SYM) != 0))
1822
    {
1823
      if (relocatable)
1824
        {
1825
          /* Make up a value.  */
1826
          *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
1827
          _bfd_set_gp_value (output_bfd, *pgp);
1828
        }
1829
      else if (!mips_elf_assign_gp (output_bfd, pgp))
1830
        {
1831
          *error_message =
1832
            (char *) _("GP relative relocation when _gp not defined");
1833
          return bfd_reloc_dangerous;
1834
        }
1835
    }
1836
 
1837
  return bfd_reloc_ok;
1838
}
1839
 
1840
/* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
1841
   become the offset from the gp register.  */
1842
 
1843
static bfd_reloc_status_type
1844
mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1845
                        asymbol *symbol, void *data ATTRIBUTE_UNUSED,
1846
                        asection *input_section, bfd *output_bfd,
1847
                        char **error_message ATTRIBUTE_UNUSED)
1848
{
1849
  bfd_boolean relocatable;
1850
  bfd_reloc_status_type ret;
1851
  bfd_vma gp;
1852
 
1853
  if (output_bfd != NULL)
1854
    relocatable = TRUE;
1855
  else
1856
    {
1857
      relocatable = FALSE;
1858
      output_bfd = symbol->section->output_section->owner;
1859
    }
1860
 
1861
  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
1862
                           &gp);
1863
  if (ret != bfd_reloc_ok)
1864
    return ret;
1865
 
1866
  return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1867
                                        input_section, relocatable,
1868
                                        data, gp);
1869
}
1870
 
1871
/* Do a R_MIPS_LITERAL relocation.  */
1872
 
1873
static bfd_reloc_status_type
1874
mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1875
                        void *data, asection *input_section, bfd *output_bfd,
1876
                        char **error_message)
1877
{
1878
  bfd_boolean relocatable;
1879
  bfd_reloc_status_type ret;
1880
  bfd_vma gp;
1881
 
1882
  /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
1883
  if (output_bfd != NULL
1884
      && (symbol->flags & BSF_SECTION_SYM) == 0
1885
      && (symbol->flags & BSF_LOCAL) != 0)
1886
    {
1887
      *error_message = (char *)
1888
        _("literal relocation occurs for an external symbol");
1889
      return bfd_reloc_outofrange;
1890
    }
1891
 
1892
  /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
1893
  if (output_bfd != NULL)
1894
    relocatable = TRUE;
1895
  else
1896
    {
1897
      relocatable = FALSE;
1898
      output_bfd = symbol->section->output_section->owner;
1899
    }
1900
 
1901
  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
1902
                           &gp);
1903
  if (ret != bfd_reloc_ok)
1904
    return ret;
1905
 
1906
  return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1907
                                        input_section, relocatable,
1908
                                        data, gp);
1909
}
1910
 
1911
/* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
1912
   become the offset from the gp register.  */
1913
 
1914
static bfd_reloc_status_type
1915
mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1916
                        void *data, asection *input_section, bfd *output_bfd,
1917
                        char **error_message)
1918
{
1919
  bfd_boolean relocatable;
1920
  bfd_reloc_status_type ret;
1921
  bfd_vma gp;
1922
 
1923
  /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
1924
  if (output_bfd != NULL
1925
      && (symbol->flags & BSF_SECTION_SYM) == 0
1926
      && (symbol->flags & BSF_LOCAL) != 0)
1927
    {
1928
      *error_message = (char *)
1929
        _("32bits gp relative relocation occurs for an external symbol");
1930
      return bfd_reloc_outofrange;
1931
    }
1932
 
1933
  if (output_bfd != NULL)
1934
    {
1935
      relocatable = TRUE;
1936
      gp = _bfd_get_gp_value (output_bfd);
1937
    }
1938
  else
1939
    {
1940
      relocatable = FALSE;
1941
      output_bfd = symbol->section->output_section->owner;
1942
 
1943
      ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
1944
                               error_message, &gp);
1945
      if (ret != bfd_reloc_ok)
1946
        return ret;
1947
    }
1948
 
1949
  return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
1950
                          relocatable, data, gp);
1951
}
1952
 
1953
static bfd_reloc_status_type
1954
gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
1955
                 asection *input_section, bfd_boolean relocatable,
1956
                 void *data, bfd_vma gp)
1957
{
1958
  bfd_vma relocation;
1959
  unsigned long val;
1960
 
1961
  if (bfd_is_com_section (symbol->section))
1962
    relocation = 0;
1963
  else
1964
    relocation = symbol->value;
1965
 
1966
  relocation += symbol->section->output_section->vma;
1967
  relocation += symbol->section->output_offset;
1968
 
1969
  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1970
    return bfd_reloc_outofrange;
1971
 
1972
  if (reloc_entry->howto->src_mask == 0)
1973
    val = 0;
1974
  else
1975
    val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1976
 
1977
  /* Set val to the offset into the section or symbol.  */
1978
  val += reloc_entry->addend;
1979
 
1980
  /* Adjust val for the final section location and GP value.  If we
1981
     are producing relocatable output, we don't want to do this for
1982
     an external symbol.  */
1983
  if (! relocatable
1984
      || (symbol->flags & BSF_SECTION_SYM) != 0)
1985
    val += relocation - gp;
1986
 
1987
  bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
1988
 
1989
  if (relocatable)
1990
    reloc_entry->address += input_section->output_offset;
1991
 
1992
  return bfd_reloc_ok;
1993
}
1994
 
1995
/* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
1996
   the rest is at bits 6-10. The bitpos already got right by the howto.  */
1997
 
1998
static bfd_reloc_status_type
1999
mips_elf_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2000
                       void *data, asection *input_section, bfd *output_bfd,
2001
                       char **error_message)
2002
{
2003
  if (reloc_entry->howto->partial_inplace)
2004
    {
2005
      reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
2006
                             | (reloc_entry->addend & 0x00000800) >> 9);
2007
    }
2008
 
2009
  return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2010
                                      input_section, output_bfd,
2011
                                      error_message);
2012
}
2013
 
2014
/* Handle a mips16 GP relative reloc.  */
2015
 
2016
static bfd_reloc_status_type
2017
mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2018
                    void *data, asection *input_section, bfd *output_bfd,
2019
                    char **error_message)
2020
{
2021
  bfd_boolean relocatable;
2022
  bfd_reloc_status_type ret;
2023
  bfd_byte *location;
2024
  bfd_vma gp;
2025
 
2026
  /* If we're relocating, and this is an external symbol, we don't want
2027
     to change anything.  */
2028
  if (output_bfd != NULL
2029
      && (symbol->flags & BSF_SECTION_SYM) == 0
2030
      && (symbol->flags & BSF_LOCAL) != 0)
2031
    {
2032
      reloc_entry->address += input_section->output_offset;
2033
      return bfd_reloc_ok;
2034
    }
2035
 
2036
  if (output_bfd != NULL)
2037
    relocatable = TRUE;
2038
  else
2039
    {
2040
      relocatable = FALSE;
2041
      output_bfd = symbol->section->output_section->owner;
2042
    }
2043
 
2044
  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
2045
                           &gp);
2046
  if (ret != bfd_reloc_ok)
2047
    return ret;
2048
 
2049
  location = (bfd_byte *) data + reloc_entry->address;
2050
  _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
2051
                                   location);
2052
  ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2053
                                       input_section, relocatable,
2054
                                       data, gp);
2055
  _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
2056
                                 location);
2057
 
2058
  return ret;
2059
}
2060
 
2061
/* A mapping from BFD reloc types to MIPS ELF reloc types.  */
2062
 
2063
struct elf_reloc_map {
2064
  bfd_reloc_code_real_type bfd_val;
2065
  enum elf_mips_reloc_type elf_val;
2066
};
2067
 
2068
static const struct elf_reloc_map mips_reloc_map[] =
2069
{
2070
  { BFD_RELOC_NONE, R_MIPS_NONE },
2071
  { BFD_RELOC_16, R_MIPS_16 },
2072
  { BFD_RELOC_32, R_MIPS_32 },
2073
  /* There is no BFD reloc for R_MIPS_REL32.  */
2074
  { BFD_RELOC_CTOR, R_MIPS_32 },
2075
  { BFD_RELOC_64, R_MIPS_64 },
2076
  { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
2077
  { BFD_RELOC_HI16_S, R_MIPS_HI16 },
2078
  { BFD_RELOC_LO16, R_MIPS_LO16 },
2079
  { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
2080
  { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
2081
  { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
2082
  { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
2083
  { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
2084
  { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
2085
  { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
2086
  { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
2087
  { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
2088
  { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
2089
  { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
2090
  { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
2091
  { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
2092
  { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
2093
  { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
2094
  { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
2095
  { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
2096
  { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
2097
  { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
2098
  { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
2099
  { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
2100
  { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
2101
  { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
2102
  /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
2103
  { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
2104
  { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
2105
  { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
2106
  { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
2107
  { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
2108
  { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
2109
  { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
2110
  { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
2111
  { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
2112
  { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
2113
  { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
2114
  { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
2115
  { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
2116
  { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
2117
  { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
2118
};
2119
 
2120
static const struct elf_reloc_map mips16_reloc_map[] =
2121
{
2122
  { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
2123
  { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
2124
  { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
2125
  { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
2126
  { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
2127
  { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
2128
};
2129
 
2130
/* Given a BFD reloc type, return a howto structure.  */
2131
 
2132
static reloc_howto_type *
2133
bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2134
                                 bfd_reloc_code_real_type code)
2135
{
2136
  unsigned int i;
2137
  /* FIXME: We default to RELA here instead of choosing the right
2138
     relocation variant.  */
2139
  reloc_howto_type *howto_table = elf_mips_howto_table_rela;
2140
  reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;
2141
 
2142
  for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
2143
       i++)
2144
    {
2145
      if (mips_reloc_map[i].bfd_val == code)
2146
        return &howto_table[(int) mips_reloc_map[i].elf_val];
2147
    }
2148
 
2149
  for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
2150
       i++)
2151
    {
2152
      if (mips16_reloc_map[i].bfd_val == code)
2153
        return &howto16_table[(int) mips16_reloc_map[i].elf_val];
2154
    }
2155
 
2156
  switch (code)
2157
    {
2158
    case BFD_RELOC_VTABLE_INHERIT:
2159
      return &elf_mips_gnu_vtinherit_howto;
2160
    case BFD_RELOC_VTABLE_ENTRY:
2161
      return &elf_mips_gnu_vtentry_howto;
2162
    case BFD_RELOC_MIPS_COPY:
2163
      return &elf_mips_copy_howto;
2164
    case BFD_RELOC_MIPS_JUMP_SLOT:
2165
      return &elf_mips_jump_slot_howto;
2166
    default:
2167
      bfd_set_error (bfd_error_bad_value);
2168
      return NULL;
2169
    }
2170
}
2171
 
2172
static reloc_howto_type *
2173
bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2174
                                 const char *r_name)
2175
{
2176
  unsigned int i;
2177
 
2178
  for (i = 0;
2179
       i < (sizeof (elf_mips_howto_table_rela)
2180
            / sizeof (elf_mips_howto_table_rela[0]));
2181
       i++)
2182
    if (elf_mips_howto_table_rela[i].name != NULL
2183
        && strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
2184
      return &elf_mips_howto_table_rela[i];
2185
 
2186
  for (i = 0;
2187
       i < (sizeof (elf_mips16_howto_table_rela)
2188
            / sizeof (elf_mips16_howto_table_rela[0]));
2189
       i++)
2190
    if (elf_mips16_howto_table_rela[i].name != NULL
2191
        && strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
2192
      return &elf_mips16_howto_table_rela[i];
2193
 
2194
  if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
2195
    return &elf_mips_gnu_vtinherit_howto;
2196
  if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
2197
    return &elf_mips_gnu_vtentry_howto;
2198
  if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
2199
    return &elf_mips_gnu_rel16_s2;
2200
  if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
2201
    return &elf_mips_gnu_rela16_s2;
2202
  if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
2203
    return &elf_mips_copy_howto;
2204
  if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
2205
    return &elf_mips_jump_slot_howto;
2206
 
2207
  return NULL;
2208
}
2209
 
2210
/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
2211
 
2212
static reloc_howto_type *
2213
mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
2214
{
2215
  switch (r_type)
2216
    {
2217
    case R_MIPS_GNU_VTINHERIT:
2218
      return &elf_mips_gnu_vtinherit_howto;
2219
    case R_MIPS_GNU_VTENTRY:
2220
      return &elf_mips_gnu_vtentry_howto;
2221
    case R_MIPS_GNU_REL16_S2:
2222
      if (rela_p)
2223
        return &elf_mips_gnu_rela16_s2;
2224
      else
2225
        return &elf_mips_gnu_rel16_s2;
2226
    case R_MIPS_COPY:
2227
      return &elf_mips_copy_howto;
2228
    case R_MIPS_JUMP_SLOT:
2229
      return &elf_mips_jump_slot_howto;
2230
    default:
2231
      if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
2232
        {
2233
          if (rela_p)
2234
            return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
2235
          else
2236
            return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
2237
        }
2238
      BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
2239
      if (rela_p)
2240
        return &elf_mips_howto_table_rela[r_type];
2241
      else
2242
        return &elf_mips_howto_table_rel[r_type];
2243
      break;
2244
    }
2245
}
2246
 
2247
/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
2248
 
2249
static void
2250
mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
2251
{
2252
  unsigned int r_type;
2253
 
2254
  r_type = ELF32_R_TYPE (dst->r_info);
2255
  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE);
2256
 
2257
  /* The addend for a GPREL16 or LITERAL relocation comes from the GP
2258
     value for the object file.  We get the addend now, rather than
2259
     when we do the relocation, because the symbol manipulations done
2260
     by the linker may cause us to lose track of the input BFD.  */
2261
  if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
2262
      && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL))
2263
    cache_ptr->addend = elf_gp (abfd);
2264
}
2265
 
2266
/* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
2267
 
2268
static void
2269
mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
2270
                         arelent *cache_ptr, Elf_Internal_Rela *dst)
2271
{
2272
  unsigned int r_type;
2273
 
2274
  r_type = ELF32_R_TYPE (dst->r_info);
2275
  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
2276
  cache_ptr->addend = dst->r_addend;
2277
}
2278
 
2279
/* Determine whether a symbol is global for the purposes of splitting
2280
   the symbol table into global symbols and local symbols.  At least
2281
   on Irix 5, this split must be between section symbols and all other
2282
   symbols.  On most ELF targets the split is between static symbols
2283
   and externally visible symbols.  */
2284
 
2285
static bfd_boolean
2286
mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
2287
{
2288
  if (SGI_COMPAT (abfd))
2289
    return (sym->flags & BSF_SECTION_SYM) == 0;
2290
  else
2291
    return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
2292
            || bfd_is_und_section (bfd_get_section (sym))
2293
            || bfd_is_com_section (bfd_get_section (sym)));
2294
}
2295
 
2296
/* Set the right machine number for a MIPS ELF file.  */
2297
 
2298
static bfd_boolean
2299
mips_elf_n32_object_p (bfd *abfd)
2300
{
2301
  unsigned long mach;
2302
 
2303
  /* Irix 5 and 6 are broken.  Object file symbol tables are not always
2304
     sorted correctly such that local symbols precede global symbols,
2305
     and the sh_info field in the symbol table is not always right.  */
2306
  if (SGI_COMPAT (abfd))
2307
    elf_bad_symtab (abfd) = TRUE;
2308
 
2309
  mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
2310
  bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
2311
 
2312
  if (! ABI_N32_P(abfd))
2313
    return FALSE;
2314
 
2315
  return TRUE;
2316
}
2317
 
2318
/* Support for core dump NOTE sections.  */
2319
static bfd_boolean
2320
elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2321
{
2322
  int offset;
2323
  unsigned int size;
2324
 
2325
  switch (note->descsz)
2326
    {
2327
      default:
2328
        return FALSE;
2329
 
2330
      case 440:         /* Linux/MIPS N32 */
2331
        /* pr_cursig */
2332
        elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2333
 
2334
        /* pr_pid */
2335
        elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
2336
 
2337
        /* pr_reg */
2338
        offset = 72;
2339
        size = 360;
2340
 
2341
        break;
2342
    }
2343
 
2344
  /* Make a ".reg/999" section.  */
2345
  return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
2346
                                          note->descpos + offset);
2347
}
2348
 
2349
static bfd_boolean
2350
elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2351
{
2352
  switch (note->descsz)
2353
    {
2354
      default:
2355
        return FALSE;
2356
 
2357
      case 128:         /* Linux/MIPS elf_prpsinfo */
2358
        elf_tdata (abfd)->core_program
2359
         = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
2360
        elf_tdata (abfd)->core_command
2361
         = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
2362
    }
2363
 
2364
  /* Note that for some reason, a spurious space is tacked
2365
     onto the end of the args in some (at least one anyway)
2366
     implementations, so strip it off if it exists.  */
2367
 
2368
  {
2369
    char *command = elf_tdata (abfd)->core_command;
2370
    int n = strlen (command);
2371
 
2372
    if (0 < n && command[n - 1] == ' ')
2373
      command[n - 1] = '\0';
2374
  }
2375
 
2376
  return TRUE;
2377
}
2378
 
2379
/* Depending on the target vector we generate some version of Irix
2380
   executables or "normal" MIPS ELF ABI executables.  */
2381
static irix_compat_t
2382
elf_n32_mips_irix_compat (bfd *abfd)
2383
{
2384
  if ((abfd->xvec == &bfd_elf32_nbigmips_vec)
2385
      || (abfd->xvec == &bfd_elf32_nlittlemips_vec))
2386
    return ict_irix6;
2387
  else
2388
    return ict_none;
2389
}
2390
 
2391
/* ECOFF swapping routines.  These are used when dealing with the
2392
   .mdebug section, which is in the ECOFF debugging format.  */
2393
static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
2394
  /* Symbol table magic number.  */
2395
  magicSym,
2396
  /* Alignment of debugging information.  E.g., 4.  */
2397
  4,
2398
  /* Sizes of external symbolic information.  */
2399
  sizeof (struct hdr_ext),
2400
  sizeof (struct dnr_ext),
2401
  sizeof (struct pdr_ext),
2402
  sizeof (struct sym_ext),
2403
  sizeof (struct opt_ext),
2404
  sizeof (struct fdr_ext),
2405
  sizeof (struct rfd_ext),
2406
  sizeof (struct ext_ext),
2407
  /* Functions to swap in external symbolic data.  */
2408
  ecoff_swap_hdr_in,
2409
  ecoff_swap_dnr_in,
2410
  ecoff_swap_pdr_in,
2411
  ecoff_swap_sym_in,
2412
  ecoff_swap_opt_in,
2413
  ecoff_swap_fdr_in,
2414
  ecoff_swap_rfd_in,
2415
  ecoff_swap_ext_in,
2416
  _bfd_ecoff_swap_tir_in,
2417
  _bfd_ecoff_swap_rndx_in,
2418
  /* Functions to swap out external symbolic data.  */
2419
  ecoff_swap_hdr_out,
2420
  ecoff_swap_dnr_out,
2421
  ecoff_swap_pdr_out,
2422
  ecoff_swap_sym_out,
2423
  ecoff_swap_opt_out,
2424
  ecoff_swap_fdr_out,
2425
  ecoff_swap_rfd_out,
2426
  ecoff_swap_ext_out,
2427
  _bfd_ecoff_swap_tir_out,
2428
  _bfd_ecoff_swap_rndx_out,
2429
  /* Function to read in symbolic data.  */
2430
  _bfd_mips_elf_read_ecoff_info
2431
};
2432
 
2433
#define ELF_ARCH                        bfd_arch_mips
2434
#define ELF_TARGET_ID                   MIPS_ELF_DATA
2435
#define ELF_MACHINE_CODE                EM_MIPS
2436
 
2437
#define elf_backend_collect             TRUE
2438
#define elf_backend_type_change_ok      TRUE
2439
#define elf_backend_can_gc_sections     TRUE
2440
#define elf_info_to_howto               mips_info_to_howto_rela
2441
#define elf_info_to_howto_rel           mips_info_to_howto_rel
2442
#define elf_backend_sym_is_global       mips_elf_sym_is_global
2443
#define elf_backend_object_p            mips_elf_n32_object_p
2444
#define elf_backend_symbol_processing   _bfd_mips_elf_symbol_processing
2445
#define elf_backend_section_processing  _bfd_mips_elf_section_processing
2446
#define elf_backend_section_from_shdr   _bfd_mips_elf_section_from_shdr
2447
#define elf_backend_fake_sections       _bfd_mips_elf_fake_sections
2448
#define elf_backend_section_from_bfd_section \
2449
                                        _bfd_mips_elf_section_from_bfd_section
2450
#define elf_backend_add_symbol_hook     _bfd_mips_elf_add_symbol_hook
2451
#define elf_backend_link_output_symbol_hook \
2452
                                        _bfd_mips_elf_link_output_symbol_hook
2453
#define elf_backend_create_dynamic_sections \
2454
                                        _bfd_mips_elf_create_dynamic_sections
2455
#define elf_backend_check_relocs        _bfd_mips_elf_check_relocs
2456
#define elf_backend_merge_symbol_attribute \
2457
                                        _bfd_mips_elf_merge_symbol_attribute
2458
#define elf_backend_get_target_dtag     _bfd_mips_elf_get_target_dtag
2459
#define elf_backend_adjust_dynamic_symbol \
2460
                                        _bfd_mips_elf_adjust_dynamic_symbol
2461
#define elf_backend_always_size_sections \
2462
                                        _bfd_mips_elf_always_size_sections
2463
#define elf_backend_size_dynamic_sections \
2464
                                        _bfd_mips_elf_size_dynamic_sections
2465
#define elf_backend_init_index_section  _bfd_elf_init_1_index_section
2466
#define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
2467
#define elf_backend_finish_dynamic_symbol \
2468
                                        _bfd_mips_elf_finish_dynamic_symbol
2469
#define elf_backend_finish_dynamic_sections \
2470
                                        _bfd_mips_elf_finish_dynamic_sections
2471
#define elf_backend_final_write_processing \
2472
                                        _bfd_mips_elf_final_write_processing
2473
#define elf_backend_additional_program_headers \
2474
                                        _bfd_mips_elf_additional_program_headers
2475
#define elf_backend_modify_segment_map  _bfd_mips_elf_modify_segment_map
2476
#define elf_backend_gc_mark_hook        _bfd_mips_elf_gc_mark_hook
2477
#define elf_backend_gc_sweep_hook       _bfd_mips_elf_gc_sweep_hook
2478
#define elf_backend_copy_indirect_symbol \
2479
                                        _bfd_mips_elf_copy_indirect_symbol
2480
#define elf_backend_grok_prstatus       elf32_mips_grok_prstatus
2481
#define elf_backend_grok_psinfo         elf32_mips_grok_psinfo
2482
#define elf_backend_ecoff_debug_swap    &mips_elf32_ecoff_debug_swap
2483
 
2484
#define elf_backend_got_header_size     (4 * MIPS_RESERVED_GOTNO)
2485
 
2486
/* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
2487
   work better/work only in RELA, so we default to this.  */
2488
#define elf_backend_may_use_rel_p       1
2489
#define elf_backend_may_use_rela_p      1
2490
#define elf_backend_default_use_rela_p  1
2491
#define elf_backend_rela_plts_and_copies_p 0
2492
#define elf_backend_sign_extend_vma     TRUE
2493
#define elf_backend_plt_readonly        1
2494
#define elf_backend_plt_sym_val         _bfd_mips_elf_plt_sym_val
2495
 
2496
#define elf_backend_discard_info        _bfd_mips_elf_discard_info
2497
#define elf_backend_ignore_discarded_relocs \
2498
                                        _bfd_mips_elf_ignore_discarded_relocs
2499
#define elf_backend_write_section       _bfd_mips_elf_write_section
2500
#define elf_backend_mips_irix_compat    elf_n32_mips_irix_compat
2501
#define elf_backend_mips_rtype_to_howto mips_elf_n32_rtype_to_howto
2502
#define bfd_elf32_find_nearest_line     _bfd_mips_elf_find_nearest_line
2503
#define bfd_elf32_find_inliner_info     _bfd_mips_elf_find_inliner_info
2504
#define bfd_elf32_new_section_hook      _bfd_mips_elf_new_section_hook
2505
#define bfd_elf32_set_section_contents  _bfd_mips_elf_set_section_contents
2506
#define bfd_elf32_bfd_get_relocated_section_contents \
2507
                                _bfd_elf_mips_get_relocated_section_contents
2508
#define bfd_elf32_bfd_link_hash_table_create \
2509
                                        _bfd_mips_elf_link_hash_table_create
2510
#define bfd_elf32_bfd_final_link        _bfd_mips_elf_final_link
2511
#define bfd_elf32_bfd_merge_private_bfd_data \
2512
                                        _bfd_mips_elf_merge_private_bfd_data
2513
#define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
2514
#define bfd_elf32_bfd_print_private_bfd_data \
2515
                                        _bfd_mips_elf_print_private_bfd_data
2516
#define bfd_elf32_bfd_relax_section     _bfd_mips_relax_section
2517
 
2518
/* Support for SGI-ish mips targets using n32 ABI.  */
2519
 
2520
#define TARGET_LITTLE_SYM               bfd_elf32_nlittlemips_vec
2521
#define TARGET_LITTLE_NAME              "elf32-nlittlemips"
2522
#define TARGET_BIG_SYM                  bfd_elf32_nbigmips_vec
2523
#define TARGET_BIG_NAME                 "elf32-nbigmips"
2524
 
2525
#define ELF_MAXPAGESIZE                 0x10000
2526
#define ELF_COMMONPAGESIZE              0x1000
2527
 
2528
#include "elf32-target.h"
2529
 
2530
/* Support for traditional mips targets using n32 ABI.  */
2531
#undef TARGET_LITTLE_SYM
2532
#undef TARGET_LITTLE_NAME
2533
#undef TARGET_BIG_SYM
2534
#undef TARGET_BIG_NAME
2535
 
2536
#undef ELF_MAXPAGESIZE
2537
#undef ELF_COMMONPAGESIZE
2538
 
2539
#define TARGET_LITTLE_SYM               bfd_elf32_ntradlittlemips_vec
2540
#define TARGET_LITTLE_NAME              "elf32-ntradlittlemips"
2541
#define TARGET_BIG_SYM                  bfd_elf32_ntradbigmips_vec
2542
#define TARGET_BIG_NAME                 "elf32-ntradbigmips"
2543
 
2544
#define ELF_MAXPAGESIZE                 0x10000
2545
#define ELF_COMMONPAGESIZE              0x1000
2546
#define elf32_bed                       elf32_tradbed
2547
 
2548
/* Include the target file again for this target.  */
2549
#include "elf32-target.h"
2550
 
2551
 
2552
/* FreeBSD support.  */
2553
 
2554
#undef TARGET_LITTLE_SYM
2555
#undef TARGET_LITTLE_NAME
2556
#undef TARGET_BIG_SYM
2557
#undef TARGET_BIG_NAME
2558
 
2559
#define TARGET_LITTLE_SYM               bfd_elf32_ntradlittlemips_freebsd_vec
2560
#define TARGET_LITTLE_NAME              "elf32-ntradlittlemips-freebsd"
2561
#define TARGET_BIG_SYM                  bfd_elf32_ntradbigmips_freebsd_vec
2562
#define TARGET_BIG_NAME                 "elf32-ntradbigmips-freebsd"
2563
 
2564
#undef  ELF_OSABI
2565
#define ELF_OSABI                       ELFOSABI_FREEBSD
2566
 
2567
/* The kernel recognizes executables as valid only if they carry a
2568
   "FreeBSD" label in the ELF header.  So we put this label on all
2569
   executables and (for simplicity) also all other object files.  */
2570
 
2571
static void
2572
elf_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
2573
{
2574
  _bfd_elf_set_osabi (abfd, info);
2575
}
2576
 
2577
#undef  elf_backend_post_process_headers
2578
#define elf_backend_post_process_headers        elf_fbsd_post_process_headers
2579
#undef  elf32_bed
2580
#define elf32_bed                               elf32_fbsd_tradbed
2581
 
2582
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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