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

Subversion Repositories openrisc

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

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

Line No. Rev Author Line
1 24 jeremybenn
/* MIPS-specific support for 32-bit ELF
2
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 225 jeremybenn
   2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
4 24 jeremybenn
 
5
   Most of the information added by Ian Lance Taylor, Cygnus Support,
6
   <ian@cygnus.com>.
7
   N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
8
   <mark@codesourcery.com>
9
   Traditional MIPS targets support added by Koundinya.K, Dansk Data
10
   Elektronik & Operations Research Group. <kk@ddeorg.soft.net>
11
 
12
   This file is part of BFD, the Binary File Descriptor library.
13
 
14
   This program is free software; you can redistribute it and/or modify
15
   it under the terms of the GNU General Public License as published by
16
   the Free Software Foundation; either version 3 of the License, or
17
   (at your option) any later version.
18
 
19
   This program is distributed in the hope that it will be useful,
20
   but WITHOUT ANY WARRANTY; without even the implied warranty of
21
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22
   GNU General Public License for more details.
23
 
24
   You should have received a copy of the GNU General Public License
25
   along with this program; if not, write to the Free Software
26
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
27
   MA 02110-1301, USA.  */
28
 
29
 
30
/* This file handles MIPS ELF targets.  SGI Irix 5 uses a slightly
31
   different MIPS ELF from other targets.  This matters when linking.
32
   This file supports both, switching at runtime.  */
33
 
34
#include "sysdep.h"
35
#include "bfd.h"
36
#include "libbfd.h"
37
#include "bfdlink.h"
38
#include "genlink.h"
39
#include "elf-bfd.h"
40
#include "elfxx-mips.h"
41
#include "elf/mips.h"
42
 
43
/* Get the ECOFF swapping routines.  */
44
#include "coff/sym.h"
45
#include "coff/symconst.h"
46
#include "coff/internal.h"
47
#include "coff/ecoff.h"
48
#include "coff/mips.h"
49
#define ECOFF_SIGNED_32
50
#include "ecoffswap.h"
51
 
52
static bfd_boolean mips_elf_assign_gp
53
  (bfd *, bfd_vma *);
54
static bfd_reloc_status_type mips_elf_final_gp
55
  (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
56
static bfd_reloc_status_type mips_elf_gprel16_reloc
57
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
58
static bfd_reloc_status_type mips_elf_literal_reloc
59
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
60
static bfd_reloc_status_type mips_elf_gprel32_reloc
61
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
62
static bfd_reloc_status_type gprel32_with_gp
63
  (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma);
64
static bfd_reloc_status_type mips_elf_shift6_reloc
65
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
66
static bfd_reloc_status_type mips16_gprel_reloc
67
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
68
static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
69
  (bfd *, bfd_reloc_code_real_type);
70
static reloc_howto_type *mips_elf_n32_rtype_to_howto
71
  (unsigned int, bfd_boolean);
72
static void mips_info_to_howto_rel
73
  (bfd *, arelent *, Elf_Internal_Rela *);
74
static void mips_info_to_howto_rela
75
  (bfd *, arelent *, Elf_Internal_Rela *);
76
static bfd_boolean mips_elf_sym_is_global
77
  (bfd *, asymbol *);
78
static bfd_boolean mips_elf_n32_object_p
79
  (bfd *);
80
static bfd_boolean elf32_mips_grok_prstatus
81
  (bfd *, Elf_Internal_Note *);
82
static bfd_boolean elf32_mips_grok_psinfo
83
  (bfd *, Elf_Internal_Note *);
84
static irix_compat_t elf_n32_mips_irix_compat
85
  (bfd *);
86
 
87
extern const bfd_target bfd_elf32_nbigmips_vec;
88
extern const bfd_target bfd_elf32_nlittlemips_vec;
89
 
90
/* Nonzero if ABFD is using the N32 ABI.  */
91
#define ABI_N32_P(abfd) \
92
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
93
 
94
/* Whether we are trying to be compatible with IRIX at all.  */
95
#define SGI_COMPAT(abfd) \
96
  (elf_n32_mips_irix_compat (abfd) != ict_none)
97
 
98
/* The number of local .got entries we reserve.  */
99
#define MIPS_RESERVED_GOTNO (2)
100
 
101
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
102
   from smaller values.  Start with zero, widen, *then* decrement.  */
103
#define MINUS_ONE       (((bfd_vma)0) - 1)
104
 
105
/* The relocation table used for SHT_REL sections.  */
106
 
107
static reloc_howto_type elf_mips_howto_table_rel[] =
108
{
109
  /* No relocation.  */
110
  HOWTO (R_MIPS_NONE,           /* type */
111
         0,                      /* rightshift */
112
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
113
         0,                      /* bitsize */
114
         FALSE,                 /* pc_relative */
115
         0,                      /* bitpos */
116
         complain_overflow_dont, /* complain_on_overflow */
117
         _bfd_mips_elf_generic_reloc, /* special_function */
118
         "R_MIPS_NONE",         /* name */
119
         FALSE,                 /* partial_inplace */
120
         0,                      /* src_mask */
121
         0,                      /* dst_mask */
122
         FALSE),                /* pcrel_offset */
123
 
124
  /* 16 bit relocation.  */
125
  HOWTO (R_MIPS_16,             /* type */
126
         0,                      /* rightshift */
127
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
128
         16,                    /* bitsize */
129
         FALSE,                 /* pc_relative */
130
         0,                      /* bitpos */
131
         complain_overflow_signed, /* complain_on_overflow */
132
         _bfd_mips_elf_generic_reloc, /* special_function */
133
         "R_MIPS_16",           /* name */
134
         TRUE,                  /* partial_inplace */
135
         0x0000ffff,            /* src_mask */
136
         0x0000ffff,            /* dst_mask */
137
         FALSE),                /* pcrel_offset */
138
 
139
  /* 32 bit relocation.  */
140
  HOWTO (R_MIPS_32,             /* type */
141
         0,                      /* rightshift */
142
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
143
         32,                    /* bitsize */
144
         FALSE,                 /* pc_relative */
145
         0,                      /* bitpos */
146
         complain_overflow_dont, /* complain_on_overflow */
147
         _bfd_mips_elf_generic_reloc, /* special_function */
148
         "R_MIPS_32",           /* name */
149
         TRUE,                  /* partial_inplace */
150
         0xffffffff,            /* src_mask */
151
         0xffffffff,            /* dst_mask */
152
         FALSE),                /* pcrel_offset */
153
 
154
  /* 32 bit symbol relative relocation.  */
155
  HOWTO (R_MIPS_REL32,          /* type */
156
         0,                      /* rightshift */
157
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
158
         32,                    /* bitsize */
159
         FALSE,                 /* pc_relative */
160
         0,                      /* bitpos */
161
         complain_overflow_dont, /* complain_on_overflow */
162
         _bfd_mips_elf_generic_reloc, /* special_function */
163
         "R_MIPS_REL32",        /* name */
164
         TRUE,                  /* partial_inplace */
165
         0xffffffff,            /* src_mask */
166
         0xffffffff,            /* dst_mask */
167
         FALSE),                /* pcrel_offset */
168
 
169
  /* 26 bit jump address.  */
170
  HOWTO (R_MIPS_26,             /* type */
171
         2,                     /* rightshift */
172
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
173
         26,                    /* bitsize */
174
         FALSE,                 /* pc_relative */
175
         0,                      /* bitpos */
176
         complain_overflow_dont, /* complain_on_overflow */
177
                                /* This needs complex overflow
178
                                   detection, because the upper four
179
                                   bits must match the PC + 4.  */
180
         _bfd_mips_elf_generic_reloc, /* special_function */
181
         "R_MIPS_26",           /* name */
182
         TRUE,                  /* partial_inplace */
183
         0x03ffffff,            /* src_mask */
184
         0x03ffffff,            /* dst_mask */
185
         FALSE),                /* pcrel_offset */
186
 
187
  /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
188
     However, the native IRIX6 tools use them, so we try our best. */
189
 
190
  /* High 16 bits of symbol value.  */
191
  HOWTO (R_MIPS_HI16,           /* type */
192
         16,                    /* rightshift */
193
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
194
         16,                    /* bitsize */
195
         FALSE,                 /* pc_relative */
196
         0,                      /* bitpos */
197
         complain_overflow_dont, /* complain_on_overflow */
198
         _bfd_mips_elf_hi16_reloc, /* special_function */
199
         "R_MIPS_HI16",         /* name */
200
         TRUE,                  /* partial_inplace */
201
         0x0000ffff,            /* src_mask */
202
         0x0000ffff,            /* dst_mask */
203
         FALSE),                /* pcrel_offset */
204
 
205
  /* Low 16 bits of symbol value.  */
206
  HOWTO (R_MIPS_LO16,           /* type */
207
         0,                      /* rightshift */
208
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
209
         16,                    /* bitsize */
210
         FALSE,                 /* pc_relative */
211
         0,                      /* bitpos */
212
         complain_overflow_dont, /* complain_on_overflow */
213
         _bfd_mips_elf_lo16_reloc, /* special_function */
214
         "R_MIPS_LO16",         /* name */
215
         TRUE,                  /* partial_inplace */
216
         0x0000ffff,            /* src_mask */
217
         0x0000ffff,            /* dst_mask */
218
         FALSE),                /* pcrel_offset */
219
 
220
  /* GP relative reference.  */
221
  HOWTO (R_MIPS_GPREL16,        /* type */
222
         0,                      /* rightshift */
223
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
224
         16,                    /* bitsize */
225
         FALSE,                 /* pc_relative */
226
         0,                      /* bitpos */
227
         complain_overflow_signed, /* complain_on_overflow */
228
         mips_elf_gprel16_reloc, /* special_function */
229
         "R_MIPS_GPREL16",      /* name */
230
         TRUE,                  /* partial_inplace */
231
         0x0000ffff,            /* src_mask */
232
         0x0000ffff,            /* dst_mask */
233
         FALSE),                /* pcrel_offset */
234
 
235
  /* Reference to literal section.  */
236
  HOWTO (R_MIPS_LITERAL,        /* type */
237
         0,                      /* rightshift */
238
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
239
         16,                    /* bitsize */
240
         FALSE,                 /* pc_relative */
241
         0,                      /* bitpos */
242
         complain_overflow_signed, /* complain_on_overflow */
243
         mips_elf_literal_reloc, /* special_function */
244
         "R_MIPS_LITERAL",      /* name */
245
         TRUE,                  /* partial_inplace */
246
         0x0000ffff,            /* src_mask */
247
         0x0000ffff,            /* dst_mask */
248
         FALSE),                /* pcrel_offset */
249
 
250
  /* Reference to global offset table.  */
251
  HOWTO (R_MIPS_GOT16,          /* type */
252
         0,                      /* rightshift */
253
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
254
         16,                    /* bitsize */
255
         FALSE,                 /* pc_relative */
256
         0,                      /* bitpos */
257
         complain_overflow_signed, /* complain_on_overflow */
258
         _bfd_mips_elf_got16_reloc, /* special_function */
259
         "R_MIPS_GOT16",        /* name */
260
         TRUE,                  /* partial_inplace */
261
         0x0000ffff,            /* src_mask */
262
         0x0000ffff,            /* dst_mask */
263
         FALSE),                /* pcrel_offset */
264
 
265
  /* 16 bit PC relative reference.  Note that the ABI document has a typo
266
     and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
267
     We do the right thing here.  */
268
  HOWTO (R_MIPS_PC16,           /* type */
269
         2,                     /* rightshift */
270
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
271
         16,                    /* bitsize */
272
         TRUE,                  /* pc_relative */
273
         0,                      /* bitpos */
274
         complain_overflow_signed, /* complain_on_overflow */
275
         _bfd_mips_elf_generic_reloc, /* special_function */
276
         "R_MIPS_PC16",         /* name */
277
         TRUE,                  /* partial_inplace */
278
         0x0000ffff,            /* src_mask */
279
         0x0000ffff,            /* dst_mask */
280
         TRUE),                 /* pcrel_offset */
281
 
282
  /* 16 bit call through global offset table.  */
283
  HOWTO (R_MIPS_CALL16,         /* type */
284
         0,                      /* rightshift */
285
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
286
         16,                    /* bitsize */
287
         FALSE,                 /* pc_relative */
288
         0,                      /* bitpos */
289
         complain_overflow_signed, /* complain_on_overflow */
290
         _bfd_mips_elf_generic_reloc, /* special_function */
291
         "R_MIPS_CALL16",       /* name */
292
         TRUE,                  /* partial_inplace */
293
         0x0000ffff,            /* src_mask */
294
         0x0000ffff,            /* dst_mask */
295
         FALSE),                /* pcrel_offset */
296
 
297
  /* 32 bit GP relative reference.  */
298
  HOWTO (R_MIPS_GPREL32,        /* type */
299
         0,                      /* rightshift */
300
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
301
         32,                    /* bitsize */
302
         FALSE,                 /* pc_relative */
303
         0,                      /* bitpos */
304
         complain_overflow_dont, /* complain_on_overflow */
305
         mips_elf_gprel32_reloc, /* special_function */
306
         "R_MIPS_GPREL32",      /* name */
307
         TRUE,                  /* partial_inplace */
308
         0xffffffff,            /* src_mask */
309
         0xffffffff,            /* dst_mask */
310
         FALSE),                /* pcrel_offset */
311
 
312
  /* The remaining relocs are defined on Irix 5, although they are
313
     not defined by the ABI.  */
314
  EMPTY_HOWTO (13),
315
  EMPTY_HOWTO (14),
316
  EMPTY_HOWTO (15),
317
 
318
  /* A 5 bit shift field.  */
319
  HOWTO (R_MIPS_SHIFT5,         /* type */
320
         0,                      /* rightshift */
321
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
322
         5,                     /* bitsize */
323
         FALSE,                 /* pc_relative */
324
         6,                     /* bitpos */
325
         complain_overflow_bitfield, /* complain_on_overflow */
326
         _bfd_mips_elf_generic_reloc, /* special_function */
327
         "R_MIPS_SHIFT5",       /* name */
328
         TRUE,                  /* partial_inplace */
329
         0x000007c0,            /* src_mask */
330
         0x000007c0,            /* dst_mask */
331
         FALSE),                /* pcrel_offset */
332
 
333
  /* A 6 bit shift field.  */
334
  HOWTO (R_MIPS_SHIFT6,         /* type */
335
         0,                      /* rightshift */
336
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
337
         6,                     /* bitsize */
338
         FALSE,                 /* pc_relative */
339
         6,                     /* bitpos */
340
         complain_overflow_bitfield, /* complain_on_overflow */
341
         mips_elf_shift6_reloc, /* special_function */
342
         "R_MIPS_SHIFT6",       /* name */
343
         TRUE,                  /* partial_inplace */
344
         0x000007c4,            /* src_mask */
345
         0x000007c4,            /* dst_mask */
346
         FALSE),                /* pcrel_offset */
347
 
348
  /* A 64 bit relocation.  */
349
  HOWTO (R_MIPS_64,             /* type */
350
         0,                      /* rightshift */
351
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
352
         64,                    /* bitsize */
353
         FALSE,                 /* pc_relative */
354
         0,                      /* bitpos */
355
         complain_overflow_dont, /* complain_on_overflow */
356
         _bfd_mips_elf_generic_reloc, /* special_function */
357
         "R_MIPS_64",           /* name */
358
         TRUE,                  /* partial_inplace */
359
         MINUS_ONE,             /* src_mask */
360
         MINUS_ONE,             /* dst_mask */
361
         FALSE),                /* pcrel_offset */
362
 
363
  /* Displacement in the global offset table.  */
364
  HOWTO (R_MIPS_GOT_DISP,       /* type */
365
         0,                      /* rightshift */
366
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
367
         16,                    /* bitsize */
368
         FALSE,                 /* pc_relative */
369
         0,                      /* bitpos */
370
         complain_overflow_signed, /* complain_on_overflow */
371
         _bfd_mips_elf_generic_reloc, /* special_function */
372
         "R_MIPS_GOT_DISP",     /* name */
373
         TRUE,                  /* partial_inplace */
374
         0x0000ffff,            /* src_mask */
375
         0x0000ffff,            /* dst_mask */
376
         FALSE),                /* pcrel_offset */
377
 
378
  /* Displacement to page pointer in the global offset table.  */
379
  HOWTO (R_MIPS_GOT_PAGE,       /* type */
380
         0,                      /* rightshift */
381
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
382
         16,                    /* bitsize */
383
         FALSE,                 /* pc_relative */
384
         0,                      /* bitpos */
385
         complain_overflow_signed, /* complain_on_overflow */
386
         _bfd_mips_elf_generic_reloc, /* special_function */
387
         "R_MIPS_GOT_PAGE",     /* name */
388
         TRUE,                  /* partial_inplace */
389
         0x0000ffff,            /* src_mask */
390
         0x0000ffff,            /* dst_mask */
391
         FALSE),                /* pcrel_offset */
392
 
393
  /* Offset from page pointer in the global offset table.  */
394
  HOWTO (R_MIPS_GOT_OFST,       /* type */
395
         0,                      /* rightshift */
396
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
397
         16,                    /* bitsize */
398
         FALSE,                 /* pc_relative */
399
         0,                      /* bitpos */
400
         complain_overflow_signed, /* complain_on_overflow */
401
         _bfd_mips_elf_generic_reloc, /* special_function */
402
         "R_MIPS_GOT_OFST",     /* name */
403
         TRUE,                  /* partial_inplace */
404
         0x0000ffff,            /* src_mask */
405
         0x0000ffff,            /* dst_mask */
406
         FALSE),                /* pcrel_offset */
407
 
408
  /* High 16 bits of displacement in global offset table.  */
409
  HOWTO (R_MIPS_GOT_HI16,       /* type */
410
         0,                      /* rightshift */
411
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
412
         16,                    /* bitsize */
413
         FALSE,                 /* pc_relative */
414
         0,                      /* bitpos */
415
         complain_overflow_dont, /* complain_on_overflow */
416
         _bfd_mips_elf_generic_reloc, /* special_function */
417
         "R_MIPS_GOT_HI16",     /* name */
418
         TRUE,                  /* partial_inplace */
419
         0x0000ffff,            /* src_mask */
420
         0x0000ffff,            /* dst_mask */
421
         FALSE),                /* pcrel_offset */
422
 
423
  /* Low 16 bits of displacement in global offset table.  */
424
  HOWTO (R_MIPS_GOT_LO16,       /* type */
425
         0,                      /* rightshift */
426
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
427
         16,                    /* bitsize */
428
         FALSE,                 /* pc_relative */
429
         0,                      /* bitpos */
430
         complain_overflow_dont, /* complain_on_overflow */
431
         _bfd_mips_elf_generic_reloc, /* special_function */
432
         "R_MIPS_GOT_LO16",     /* name */
433
         TRUE,                  /* partial_inplace */
434
         0x0000ffff,            /* src_mask */
435
         0x0000ffff,            /* dst_mask */
436
         FALSE),                /* pcrel_offset */
437
 
438
  /* 64 bit subtraction.  */
439
  HOWTO (R_MIPS_SUB,            /* type */
440
         0,                      /* rightshift */
441
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
442
         64,                    /* bitsize */
443
         FALSE,                 /* pc_relative */
444
         0,                      /* bitpos */
445
         complain_overflow_dont, /* complain_on_overflow */
446
         _bfd_mips_elf_generic_reloc, /* special_function */
447
         "R_MIPS_SUB",          /* name */
448
         TRUE,                  /* partial_inplace */
449
         MINUS_ONE,             /* src_mask */
450
         MINUS_ONE,             /* dst_mask */
451
         FALSE),                /* pcrel_offset */
452
 
453
  /* Insert the addend as an instruction.  */
454
  /* FIXME: Not handled correctly.  */
455
  HOWTO (R_MIPS_INSERT_A,       /* type */
456
         0,                      /* rightshift */
457
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
458
         32,                    /* bitsize */
459
         FALSE,                 /* pc_relative */
460
         0,                      /* bitpos */
461
         complain_overflow_dont, /* complain_on_overflow */
462
         _bfd_mips_elf_generic_reloc, /* special_function */
463
         "R_MIPS_INSERT_A",     /* name */
464
         TRUE,                  /* partial_inplace */
465
         0xffffffff,            /* src_mask */
466
         0xffffffff,            /* dst_mask */
467
         FALSE),                /* pcrel_offset */
468
 
469
  /* Insert the addend as an instruction, and change all relocations
470
     to refer to the old instruction at the address.  */
471
  /* FIXME: Not handled correctly.  */
472
  HOWTO (R_MIPS_INSERT_B,       /* type */
473
         0,                      /* rightshift */
474
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
475
         32,                    /* bitsize */
476
         FALSE,                 /* pc_relative */
477
         0,                      /* bitpos */
478
         complain_overflow_dont, /* complain_on_overflow */
479
         _bfd_mips_elf_generic_reloc, /* special_function */
480
         "R_MIPS_INSERT_B",     /* name */
481
         TRUE,                  /* partial_inplace */
482
         0xffffffff,            /* src_mask */
483
         0xffffffff,            /* dst_mask */
484
         FALSE),                /* pcrel_offset */
485
 
486
  /* Delete a 32 bit instruction.  */
487
  /* FIXME: Not handled correctly.  */
488
  HOWTO (R_MIPS_DELETE,         /* type */
489
         0,                      /* rightshift */
490
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
491
         32,                    /* bitsize */
492
         FALSE,                 /* pc_relative */
493
         0,                      /* bitpos */
494
         complain_overflow_dont, /* complain_on_overflow */
495
         _bfd_mips_elf_generic_reloc, /* special_function */
496
         "R_MIPS_DELETE",       /* name */
497
         TRUE,                  /* partial_inplace */
498
         0xffffffff,            /* src_mask */
499
         0xffffffff,            /* dst_mask */
500
         FALSE),                /* pcrel_offset */
501
 
502
  /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
503
     We don't, because
504
       a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
505
          R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
506
          fallable heuristics.
507
       b) No other NewABI toolchain actually emits such relocations.  */
508
  EMPTY_HOWTO (R_MIPS_HIGHER),
509
  EMPTY_HOWTO (R_MIPS_HIGHEST),
510
 
511
  /* High 16 bits of displacement in global offset table.  */
512
  HOWTO (R_MIPS_CALL_HI16,      /* type */
513
         0,                      /* rightshift */
514
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
515
         16,                    /* bitsize */
516
         FALSE,                 /* pc_relative */
517
         0,                      /* bitpos */
518
         complain_overflow_dont, /* complain_on_overflow */
519
         _bfd_mips_elf_generic_reloc, /* special_function */
520
         "R_MIPS_CALL_HI16",    /* name */
521
         TRUE,                  /* partial_inplace */
522
         0x0000ffff,            /* src_mask */
523
         0x0000ffff,            /* dst_mask */
524
         FALSE),                /* pcrel_offset */
525
 
526
  /* Low 16 bits of displacement in global offset table.  */
527
  HOWTO (R_MIPS_CALL_LO16,      /* type */
528
         0,                      /* rightshift */
529
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
530
         16,                    /* bitsize */
531
         FALSE,                 /* pc_relative */
532
         0,                      /* bitpos */
533
         complain_overflow_dont, /* complain_on_overflow */
534
         _bfd_mips_elf_generic_reloc, /* special_function */
535
         "R_MIPS_CALL_LO16",    /* name */
536
         TRUE,                  /* partial_inplace */
537
         0x0000ffff,            /* src_mask */
538
         0x0000ffff,            /* dst_mask */
539
         FALSE),                /* pcrel_offset */
540
 
541
  /* Section displacement.  */
542
  HOWTO (R_MIPS_SCN_DISP,       /* type */
543
         0,                      /* rightshift */
544
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
545
         32,                    /* bitsize */
546
         FALSE,                 /* pc_relative */
547
         0,                      /* bitpos */
548
         complain_overflow_dont, /* complain_on_overflow */
549
         _bfd_mips_elf_generic_reloc, /* special_function */
550
         "R_MIPS_SCN_DISP",     /* name */
551
         TRUE,                  /* partial_inplace */
552
         0xffffffff,            /* src_mask */
553
         0xffffffff,            /* dst_mask */
554
         FALSE),                /* pcrel_offset */
555
 
556
  HOWTO (R_MIPS_REL16,          /* type */
557
         0,                      /* rightshift */
558
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
559
         16,                    /* bitsize */
560
         FALSE,                 /* pc_relative */
561
         0,                      /* bitpos */
562
         complain_overflow_signed, /* complain_on_overflow */
563
         _bfd_mips_elf_generic_reloc, /* special_function */
564
         "R_MIPS_REL16",        /* name */
565
         TRUE,                  /* partial_inplace */
566
         0xffff,                /* src_mask */
567
         0xffff,                /* dst_mask */
568
         FALSE),                /* pcrel_offset */
569
 
570
  /* These two are obsolete.  */
571
  EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
572
  EMPTY_HOWTO (R_MIPS_PJUMP),
573
 
574
  /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
575
     It must be used for multigot GOT's (and only there).  */
576
  HOWTO (R_MIPS_RELGOT,         /* type */
577
         0,                      /* rightshift */
578
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
579
         32,                    /* bitsize */
580
         FALSE,                 /* pc_relative */
581
         0,                      /* bitpos */
582
         complain_overflow_dont, /* complain_on_overflow */
583
         _bfd_mips_elf_generic_reloc, /* special_function */
584
         "R_MIPS_RELGOT",       /* name */
585
         TRUE,                  /* partial_inplace */
586
         0xffffffff,            /* src_mask */
587
         0xffffffff,            /* dst_mask */
588
         FALSE),                /* pcrel_offset */
589
 
590
  /* Protected jump conversion.  This is an optimization hint.  No
591
     relocation is required for correctness.  */
592
  HOWTO (R_MIPS_JALR,           /* type */
593
         0,                      /* rightshift */
594
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
595
         32,                    /* bitsize */
596
         FALSE,                 /* pc_relative */
597
         0,                      /* bitpos */
598
         complain_overflow_dont, /* complain_on_overflow */
599
         _bfd_mips_elf_generic_reloc, /* special_function */
600
         "R_MIPS_JALR",         /* name */
601
         FALSE,                 /* partial_inplace */
602
         0x00000000,            /* src_mask */
603
         0x00000000,            /* dst_mask */
604
         FALSE),                /* pcrel_offset */
605
 
606
  /* TLS GD/LD dynamic relocations.  */
607
  HOWTO (R_MIPS_TLS_DTPMOD32,   /* type */
608
         0,                      /* rightshift */
609
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
610
         32,                    /* bitsize */
611
         FALSE,                 /* pc_relative */
612
         0,                      /* bitpos */
613
         complain_overflow_dont, /* complain_on_overflow */
614
         _bfd_mips_elf_generic_reloc, /* special_function */
615
         "R_MIPS_TLS_DTPMOD32", /* name */
616
         TRUE,                  /* partial_inplace */
617
         0xffffffff,            /* src_mask */
618
         0xffffffff,            /* dst_mask */
619
         FALSE),                /* pcrel_offset */
620
 
621
  HOWTO (R_MIPS_TLS_DTPREL32,   /* type */
622
         0,                      /* rightshift */
623
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
624
         32,                    /* bitsize */
625
         FALSE,                 /* pc_relative */
626
         0,                      /* bitpos */
627
         complain_overflow_dont, /* complain_on_overflow */
628
         _bfd_mips_elf_generic_reloc, /* special_function */
629
         "R_MIPS_TLS_DTPREL32", /* name */
630
         TRUE,                  /* partial_inplace */
631
         0xffffffff,            /* src_mask */
632
         0xffffffff,            /* dst_mask */
633
         FALSE),                /* pcrel_offset */
634
 
635
  EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
636
  EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
637
 
638
  /* TLS general dynamic variable reference.  */
639
  HOWTO (R_MIPS_TLS_GD,         /* type */
640
         0,                      /* rightshift */
641
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
642
         16,                    /* bitsize */
643
         FALSE,                 /* pc_relative */
644
         0,                      /* bitpos */
645
         complain_overflow_signed, /* complain_on_overflow */
646
         _bfd_mips_elf_generic_reloc, /* special_function */
647
         "R_MIPS_TLS_GD",       /* name */
648
         TRUE,                  /* partial_inplace */
649
         0x0000ffff,            /* src_mask */
650
         0x0000ffff,            /* dst_mask */
651
         FALSE),                /* pcrel_offset */
652
 
653
  /* TLS local dynamic variable reference.  */
654
  HOWTO (R_MIPS_TLS_LDM,        /* type */
655
         0,                      /* rightshift */
656
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
657
         16,                    /* bitsize */
658
         FALSE,                 /* pc_relative */
659
         0,                      /* bitpos */
660
         complain_overflow_signed, /* complain_on_overflow */
661
         _bfd_mips_elf_generic_reloc, /* special_function */
662
         "R_MIPS_TLS_LDM",      /* name */
663
         TRUE,                  /* partial_inplace */
664
         0x0000ffff,            /* src_mask */
665
         0x0000ffff,            /* dst_mask */
666
         FALSE),                /* pcrel_offset */
667
 
668
  /* TLS local dynamic offset.  */
669
  HOWTO (R_MIPS_TLS_DTPREL_HI16,        /* type */
670
         0,                      /* rightshift */
671
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
672
         16,                    /* bitsize */
673
         FALSE,                 /* pc_relative */
674
         0,                      /* bitpos */
675
         complain_overflow_signed, /* complain_on_overflow */
676
         _bfd_mips_elf_generic_reloc, /* special_function */
677
         "R_MIPS_TLS_DTPREL_HI16",      /* name */
678
         TRUE,                  /* partial_inplace */
679
         0x0000ffff,            /* src_mask */
680
         0x0000ffff,            /* dst_mask */
681
         FALSE),                /* pcrel_offset */
682
 
683
  /* TLS local dynamic offset.  */
684
  HOWTO (R_MIPS_TLS_DTPREL_LO16,        /* type */
685
         0,                      /* rightshift */
686
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
687
         16,                    /* bitsize */
688
         FALSE,                 /* pc_relative */
689
         0,                      /* bitpos */
690
         complain_overflow_signed, /* complain_on_overflow */
691
         _bfd_mips_elf_generic_reloc, /* special_function */
692
         "R_MIPS_TLS_DTPREL_LO16",      /* name */
693
         TRUE,                  /* partial_inplace */
694
         0x0000ffff,            /* src_mask */
695
         0x0000ffff,            /* dst_mask */
696
         FALSE),                /* pcrel_offset */
697
 
698
  /* TLS thread pointer offset.  */
699
  HOWTO (R_MIPS_TLS_GOTTPREL,   /* type */
700
         0,                      /* rightshift */
701
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
702
         16,                    /* bitsize */
703
         FALSE,                 /* pc_relative */
704
         0,                      /* bitpos */
705
         complain_overflow_signed, /* complain_on_overflow */
706
         _bfd_mips_elf_generic_reloc, /* special_function */
707
         "R_MIPS_TLS_GOTTPREL", /* name */
708
         TRUE,                  /* partial_inplace */
709
         0x0000ffff,            /* src_mask */
710
         0x0000ffff,            /* dst_mask */
711
         FALSE),                /* pcrel_offset */
712
 
713
  /* TLS IE dynamic relocations.  */
714
  HOWTO (R_MIPS_TLS_TPREL32,    /* type */
715
         0,                      /* rightshift */
716
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
717
         32,                    /* bitsize */
718
         FALSE,                 /* pc_relative */
719
         0,                      /* bitpos */
720
         complain_overflow_dont, /* complain_on_overflow */
721
         _bfd_mips_elf_generic_reloc, /* special_function */
722
         "R_MIPS_TLS_TPREL32",  /* name */
723
         TRUE,                  /* partial_inplace */
724
         0xffffffff,            /* src_mask */
725
         0xffffffff,            /* dst_mask */
726
         FALSE),                /* pcrel_offset */
727
 
728
  EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
729
 
730
  /* TLS thread pointer offset.  */
731
  HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
732
         0,                      /* rightshift */
733
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
734
         16,                    /* bitsize */
735
         FALSE,                 /* pc_relative */
736
         0,                      /* bitpos */
737
         complain_overflow_signed, /* complain_on_overflow */
738
         _bfd_mips_elf_generic_reloc, /* special_function */
739
         "R_MIPS_TLS_TPREL_HI16", /* name */
740
         TRUE,                  /* partial_inplace */
741
         0x0000ffff,            /* src_mask */
742
         0x0000ffff,            /* dst_mask */
743
         FALSE),                /* pcrel_offset */
744
 
745
  /* TLS thread pointer offset.  */
746
  HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
747
         0,                      /* rightshift */
748
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
749
         16,                    /* bitsize */
750
         FALSE,                 /* pc_relative */
751
         0,                      /* bitpos */
752
         complain_overflow_signed, /* complain_on_overflow */
753
         _bfd_mips_elf_generic_reloc, /* special_function */
754
         "R_MIPS_TLS_TPREL_LO16", /* name */
755
         TRUE,                  /* partial_inplace */
756
         0x0000ffff,            /* src_mask */
757
         0x0000ffff,            /* dst_mask */
758
         FALSE),                /* pcrel_offset */
759
 
760
  /* 32 bit relocation with no addend.  */
761
  HOWTO (R_MIPS_GLOB_DAT,       /* type */
762
         0,                      /* rightshift */
763
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
764
         32,                    /* bitsize */
765
         FALSE,                 /* pc_relative */
766
         0,                      /* bitpos */
767
         complain_overflow_dont, /* complain_on_overflow */
768
         _bfd_mips_elf_generic_reloc, /* special_function */
769
         "R_MIPS_GLOB_DAT",     /* name */
770
         FALSE,                 /* partial_inplace */
771
         0x0,                   /* src_mask */
772
         0xffffffff,            /* dst_mask */
773
         FALSE),                /* pcrel_offset */
774
};
775
 
776
/* The relocation table used for SHT_RELA sections.  */
777
 
778
static reloc_howto_type elf_mips_howto_table_rela[] =
779
{
780
  /* No relocation.  */
781
  HOWTO (R_MIPS_NONE,           /* type */
782
         0,                      /* rightshift */
783
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
784
         0,                      /* bitsize */
785
         FALSE,                 /* pc_relative */
786
         0,                      /* bitpos */
787
         complain_overflow_dont, /* complain_on_overflow */
788
         _bfd_mips_elf_generic_reloc, /* special_function */
789
         "R_MIPS_NONE",         /* name */
790
         FALSE,                 /* partial_inplace */
791
         0,                      /* src_mask */
792
         0,                      /* dst_mask */
793
         FALSE),                /* pcrel_offset */
794
 
795
  /* 16 bit relocation.  */
796
  HOWTO (R_MIPS_16,             /* type */
797
         0,                      /* rightshift */
798
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
799
         16,                    /* bitsize */
800
         FALSE,                 /* pc_relative */
801
         0,                      /* bitpos */
802
         complain_overflow_signed, /* complain_on_overflow */
803
         _bfd_mips_elf_generic_reloc, /* special_function */
804
         "R_MIPS_16",           /* name */
805
         FALSE,                 /* partial_inplace */
806
         0,                      /* src_mask */
807
         0x0000,                /* dst_mask */
808
         FALSE),                /* pcrel_offset */
809
 
810
  /* 32 bit relocation.  */
811
  HOWTO (R_MIPS_32,             /* type */
812
         0,                      /* rightshift */
813
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
814
         32,                    /* bitsize */
815
         FALSE,                 /* pc_relative */
816
         0,                      /* bitpos */
817
         complain_overflow_dont, /* complain_on_overflow */
818
         _bfd_mips_elf_generic_reloc, /* special_function */
819
         "R_MIPS_32",           /* name */
820
         FALSE,                 /* partial_inplace */
821
         0,                      /* src_mask */
822
         0xffffffff,            /* dst_mask */
823
         FALSE),                /* pcrel_offset */
824
 
825
  /* 32 bit symbol relative relocation.  */
826
  HOWTO (R_MIPS_REL32,          /* type */
827
         0,                      /* rightshift */
828
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
829
         32,                    /* bitsize */
830
         FALSE,                 /* pc_relative */
831
         0,                      /* bitpos */
832
         complain_overflow_dont, /* complain_on_overflow */
833
         _bfd_mips_elf_generic_reloc, /* special_function */
834
         "R_MIPS_REL32",        /* name */
835
         FALSE,                 /* partial_inplace */
836
         0,                      /* src_mask */
837
         0xffffffff,            /* dst_mask */
838
         FALSE),                /* pcrel_offset */
839
 
840
  /* 26 bit jump address.  */
841
  HOWTO (R_MIPS_26,             /* type */
842
         2,                     /* rightshift */
843
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
844
         26,                    /* bitsize */
845
         FALSE,                 /* pc_relative */
846
         0,                      /* bitpos */
847
         complain_overflow_dont, /* complain_on_overflow */
848
                                /* This needs complex overflow
849
                                   detection, because the upper 36
850
                                   bits must match the PC + 4.  */
851
         _bfd_mips_elf_generic_reloc, /* special_function */
852
         "R_MIPS_26",           /* name */
853
         FALSE,                 /* partial_inplace */
854
         0,                      /* src_mask */
855
         0x03ffffff,            /* dst_mask */
856
         FALSE),                /* pcrel_offset */
857
 
858
  /* High 16 bits of symbol value.  */
859
  HOWTO (R_MIPS_HI16,           /* type */
860
         0,                      /* rightshift */
861
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
862
         16,                    /* bitsize */
863
         FALSE,                 /* pc_relative */
864
         0,                      /* bitpos */
865
         complain_overflow_dont, /* complain_on_overflow */
866
         _bfd_mips_elf_generic_reloc, /* special_function */
867
         "R_MIPS_HI16",         /* name */
868
         FALSE,                 /* partial_inplace */
869
         0,                      /* src_mask */
870
         0x0000ffff,            /* dst_mask */
871
         FALSE),                /* pcrel_offset */
872
 
873
  /* Low 16 bits of symbol value.  */
874
  HOWTO (R_MIPS_LO16,           /* type */
875
         0,                      /* rightshift */
876
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
877
         16,                    /* bitsize */
878
         FALSE,                 /* pc_relative */
879
         0,                      /* bitpos */
880
         complain_overflow_dont, /* complain_on_overflow */
881
         _bfd_mips_elf_generic_reloc, /* special_function */
882
         "R_MIPS_LO16",         /* name */
883
         FALSE,                 /* partial_inplace */
884
         0,                      /* src_mask */
885
         0x0000ffff,            /* dst_mask */
886
         FALSE),                /* pcrel_offset */
887
 
888
  /* GP relative reference.  */
889
  HOWTO (R_MIPS_GPREL16,        /* type */
890
         0,                      /* rightshift */
891
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
892
         16,                    /* bitsize */
893
         FALSE,                 /* pc_relative */
894
         0,                      /* bitpos */
895
         complain_overflow_signed, /* complain_on_overflow */
896
         mips_elf_gprel16_reloc, /* special_function */
897
         "R_MIPS_GPREL16",      /* name */
898
         FALSE,                 /* partial_inplace */
899
         0,                      /* src_mask */
900
         0x0000ffff,            /* dst_mask */
901
         FALSE),                /* pcrel_offset */
902
 
903
  /* Reference to literal section.  */
904
  HOWTO (R_MIPS_LITERAL,        /* type */
905
         0,                      /* rightshift */
906
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
907
         16,                    /* bitsize */
908
         FALSE,                 /* pc_relative */
909
         0,                      /* bitpos */
910
         complain_overflow_signed, /* complain_on_overflow */
911
         mips_elf_literal_reloc, /* special_function */
912
         "R_MIPS_LITERAL",      /* name */
913
         FALSE,                 /* partial_inplace */
914
         0,                      /* src_mask */
915
         0x0000ffff,            /* dst_mask */
916
         FALSE),                /* pcrel_offset */
917
 
918
  /* Reference to global offset table.  */
919
  HOWTO (R_MIPS_GOT16,          /* type */
920
         0,                      /* rightshift */
921
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
922
         16,                    /* bitsize */
923
         FALSE,                 /* pc_relative */
924
         0,                      /* bitpos */
925
         complain_overflow_signed, /* complain_on_overflow */
926
         _bfd_mips_elf_generic_reloc, /* special_function */
927
         "R_MIPS_GOT16",        /* name */
928
         FALSE,                 /* partial_inplace */
929
         0,                      /* src_mask */
930
         0x0000ffff,            /* dst_mask */
931
         FALSE),                /* pcrel_offset */
932
 
933
  /* 16 bit PC relative reference.  Note that the ABI document has a typo
934
     and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
935
     We do the right thing here.  */
936
  HOWTO (R_MIPS_PC16,           /* type */
937
         2,                     /* rightshift */
938
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
939
         16,                    /* bitsize */
940
         TRUE,                  /* pc_relative */
941
         0,                      /* bitpos */
942
         complain_overflow_signed, /* complain_on_overflow */
943
         _bfd_mips_elf_generic_reloc, /* special_function */
944
         "R_MIPS_PC16",         /* name */
945
         FALSE,                 /* partial_inplace */
946
         0,                      /* src_mask */
947
         0x0000ffff,            /* dst_mask */
948
         TRUE),                 /* pcrel_offset */
949
 
950
  /* 16 bit call through global offset table.  */
951
  HOWTO (R_MIPS_CALL16,         /* type */
952
         0,                      /* rightshift */
953
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
954
         16,                    /* bitsize */
955
         FALSE,                 /* pc_relative */
956
         0,                      /* bitpos */
957
         complain_overflow_signed, /* complain_on_overflow */
958
         _bfd_mips_elf_generic_reloc, /* special_function */
959
         "R_MIPS_CALL16",       /* name */
960
         FALSE,                 /* partial_inplace */
961
         0,                      /* src_mask */
962
         0x0000ffff,            /* dst_mask */
963
         FALSE),                /* pcrel_offset */
964
 
965
  /* 32 bit GP relative reference.  */
966
  HOWTO (R_MIPS_GPREL32,        /* type */
967
         0,                      /* rightshift */
968
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
969
         32,                    /* bitsize */
970
         FALSE,                 /* pc_relative */
971
         0,                      /* bitpos */
972
         complain_overflow_dont, /* complain_on_overflow */
973
         mips_elf_gprel32_reloc, /* special_function */
974
         "R_MIPS_GPREL32",      /* name */
975
         FALSE,                 /* partial_inplace */
976
         0,                      /* src_mask */
977
         0xffffffff,            /* dst_mask */
978
         FALSE),                /* pcrel_offset */
979
 
980
  EMPTY_HOWTO (13),
981
  EMPTY_HOWTO (14),
982
  EMPTY_HOWTO (15),
983
 
984
  /* A 5 bit shift field.  */
985
  HOWTO (R_MIPS_SHIFT5,         /* type */
986
         0,                      /* rightshift */
987
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
988
         5,                     /* bitsize */
989
         FALSE,                 /* pc_relative */
990
         6,                     /* bitpos */
991
         complain_overflow_bitfield, /* complain_on_overflow */
992
         _bfd_mips_elf_generic_reloc, /* special_function */
993
         "R_MIPS_SHIFT5",       /* name */
994
         FALSE,                 /* partial_inplace */
995
         0,                      /* src_mask */
996
         0x000007c0,            /* dst_mask */
997
         FALSE),                /* pcrel_offset */
998
 
999
  /* A 6 bit shift field.  */
1000
  HOWTO (R_MIPS_SHIFT6,         /* type */
1001
         0,                      /* rightshift */
1002
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1003
         6,                     /* bitsize */
1004
         FALSE,                 /* pc_relative */
1005
         6,                     /* bitpos */
1006
         complain_overflow_bitfield, /* complain_on_overflow */
1007
         mips_elf_shift6_reloc, /* special_function */
1008
         "R_MIPS_SHIFT6",       /* name */
1009
         FALSE,                 /* partial_inplace */
1010
         0,                      /* src_mask */
1011
         0x000007c4,            /* dst_mask */
1012
         FALSE),                /* pcrel_offset */
1013
 
1014
  /* 64 bit relocation.  */
1015
  HOWTO (R_MIPS_64,             /* type */
1016
         0,                      /* rightshift */
1017
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1018
         64,                    /* bitsize */
1019
         FALSE,                 /* pc_relative */
1020
         0,                      /* bitpos */
1021
         complain_overflow_dont, /* complain_on_overflow */
1022
         _bfd_mips_elf_generic_reloc, /* special_function */
1023
         "R_MIPS_64",           /* name */
1024
         FALSE,                 /* partial_inplace */
1025
         0,                      /* src_mask */
1026
         MINUS_ONE,             /* dst_mask */
1027
         FALSE),                /* pcrel_offset */
1028
 
1029
  /* Displacement in the global offset table.  */
1030
  HOWTO (R_MIPS_GOT_DISP,       /* type */
1031
         0,                      /* rightshift */
1032
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1033
         16,                    /* bitsize */
1034
         FALSE,                 /* pc_relative */
1035
         0,                      /* bitpos */
1036
         complain_overflow_signed, /* complain_on_overflow */
1037
         _bfd_mips_elf_generic_reloc, /* special_function */
1038
         "R_MIPS_GOT_DISP",     /* name */
1039
         FALSE,                 /* partial_inplace */
1040
         0,                      /* src_mask */
1041
         0x0000ffff,            /* dst_mask */
1042
         FALSE),                /* pcrel_offset */
1043
 
1044
  /* Displacement to page pointer in the global offset table.  */
1045
  HOWTO (R_MIPS_GOT_PAGE,       /* type */
1046
         0,                      /* rightshift */
1047
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1048
         16,                    /* bitsize */
1049
         FALSE,                 /* pc_relative */
1050
         0,                      /* bitpos */
1051
         complain_overflow_signed, /* complain_on_overflow */
1052
         _bfd_mips_elf_generic_reloc, /* special_function */
1053
         "R_MIPS_GOT_PAGE",     /* name */
1054
         FALSE,                 /* partial_inplace */
1055
         0,                      /* src_mask */
1056
         0x0000ffff,            /* dst_mask */
1057
         FALSE),                /* pcrel_offset */
1058
 
1059
  /* Offset from page pointer in the global offset table.  */
1060
  HOWTO (R_MIPS_GOT_OFST,       /* type */
1061
         0,                      /* rightshift */
1062
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1063
         16,                    /* bitsize */
1064
         FALSE,                 /* pc_relative */
1065
         0,                      /* bitpos */
1066
         complain_overflow_signed, /* complain_on_overflow */
1067
         _bfd_mips_elf_generic_reloc, /* special_function */
1068
         "R_MIPS_GOT_OFST",     /* name */
1069
         FALSE,                 /* partial_inplace */
1070
         0,                      /* src_mask */
1071
         0x0000ffff,            /* dst_mask */
1072
         FALSE),                /* pcrel_offset */
1073
 
1074
  /* High 16 bits of displacement in global offset table.  */
1075
  HOWTO (R_MIPS_GOT_HI16,       /* type */
1076
         0,                      /* rightshift */
1077
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1078
         16,                    /* bitsize */
1079
         FALSE,                 /* pc_relative */
1080
         0,                      /* bitpos */
1081
         complain_overflow_dont, /* complain_on_overflow */
1082
         _bfd_mips_elf_generic_reloc, /* special_function */
1083
         "R_MIPS_GOT_HI16",     /* name */
1084
         FALSE,                 /* partial_inplace */
1085
         0,                      /* src_mask */
1086
         0x0000ffff,            /* dst_mask */
1087
         FALSE),                /* pcrel_offset */
1088
 
1089
  /* Low 16 bits of displacement in global offset table.  */
1090
  HOWTO (R_MIPS_GOT_LO16,       /* type */
1091
         0,                      /* rightshift */
1092
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1093
         16,                    /* bitsize */
1094
         FALSE,                 /* pc_relative */
1095
         0,                      /* bitpos */
1096
         complain_overflow_dont, /* complain_on_overflow */
1097
         _bfd_mips_elf_generic_reloc, /* special_function */
1098
         "R_MIPS_GOT_LO16",     /* name */
1099
         FALSE,                 /* partial_inplace */
1100
         0,                      /* src_mask */
1101
         0x0000ffff,            /* dst_mask */
1102
         FALSE),                /* pcrel_offset */
1103
 
1104
  /* 64 bit subtraction.  */
1105
  HOWTO (R_MIPS_SUB,            /* type */
1106
         0,                      /* rightshift */
1107
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1108
         64,                    /* bitsize */
1109
         FALSE,                 /* pc_relative */
1110
         0,                      /* bitpos */
1111
         complain_overflow_dont, /* complain_on_overflow */
1112
         _bfd_mips_elf_generic_reloc, /* special_function */
1113
         "R_MIPS_SUB",          /* name */
1114
         FALSE,                 /* partial_inplace */
1115
         0,                      /* src_mask */
1116
         MINUS_ONE,             /* dst_mask */
1117
         FALSE),                /* pcrel_offset */
1118
 
1119
  /* Insert the addend as an instruction.  */
1120
  /* FIXME: Not handled correctly.  */
1121
  HOWTO (R_MIPS_INSERT_A,       /* type */
1122
         0,                      /* rightshift */
1123
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1124
         32,                    /* bitsize */
1125
         FALSE,                 /* pc_relative */
1126
         0,                      /* bitpos */
1127
         complain_overflow_dont, /* complain_on_overflow */
1128
         _bfd_mips_elf_generic_reloc, /* special_function */
1129
         "R_MIPS_INSERT_A",     /* name */
1130
         FALSE,                 /* partial_inplace */
1131
         0,                      /* src_mask */
1132
         0xffffffff,            /* dst_mask */
1133
         FALSE),                /* pcrel_offset */
1134
 
1135
  /* Insert the addend as an instruction, and change all relocations
1136
     to refer to the old instruction at the address.  */
1137
  /* FIXME: Not handled correctly.  */
1138
  HOWTO (R_MIPS_INSERT_B,       /* type */
1139
         0,                      /* rightshift */
1140
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1141
         32,                    /* bitsize */
1142
         FALSE,                 /* pc_relative */
1143
         0,                      /* bitpos */
1144
         complain_overflow_dont, /* complain_on_overflow */
1145
         _bfd_mips_elf_generic_reloc, /* special_function */
1146
         "R_MIPS_INSERT_B",     /* name */
1147
         FALSE,                 /* partial_inplace */
1148
         0,                      /* src_mask */
1149
         0xffffffff,            /* dst_mask */
1150
         FALSE),                /* pcrel_offset */
1151
 
1152
  /* Delete a 32 bit instruction.  */
1153
  /* FIXME: Not handled correctly.  */
1154
  HOWTO (R_MIPS_DELETE,         /* type */
1155
         0,                      /* rightshift */
1156
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1157
         32,                    /* bitsize */
1158
         FALSE,                 /* pc_relative */
1159
         0,                      /* bitpos */
1160
         complain_overflow_dont, /* complain_on_overflow */
1161
         _bfd_mips_elf_generic_reloc, /* special_function */
1162
         "R_MIPS_DELETE",       /* name */
1163
         FALSE,                 /* partial_inplace */
1164
         0,                      /* src_mask */
1165
         0xffffffff,            /* dst_mask */
1166
         FALSE),                /* pcrel_offset */
1167
 
1168
  /* Get the higher value of a 64 bit addend.  */
1169
  HOWTO (R_MIPS_HIGHER,         /* type */
1170
         0,                      /* rightshift */
1171
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1172
         16,                    /* bitsize */
1173
         FALSE,                 /* pc_relative */
1174
         0,                      /* bitpos */
1175
         complain_overflow_dont, /* complain_on_overflow */
1176
         _bfd_mips_elf_generic_reloc, /* special_function */
1177
         "R_MIPS_HIGHER",       /* name */
1178
         FALSE,                 /* partial_inplace */
1179
         0,                      /* src_mask */
1180
         0x0000ffff,            /* dst_mask */
1181
         FALSE),                /* pcrel_offset */
1182
 
1183
  /* Get the highest value of a 64 bit addend.  */
1184
  HOWTO (R_MIPS_HIGHEST,        /* type */
1185
         0,                      /* rightshift */
1186
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1187
         16,                    /* bitsize */
1188
         FALSE,                 /* pc_relative */
1189
         0,                      /* bitpos */
1190
         complain_overflow_dont, /* complain_on_overflow */
1191
         _bfd_mips_elf_generic_reloc, /* special_function */
1192
         "R_MIPS_HIGHEST",      /* name */
1193
         FALSE,                 /* partial_inplace */
1194
         0,                      /* src_mask */
1195
         0x0000ffff,            /* dst_mask */
1196
         FALSE),                /* pcrel_offset */
1197
 
1198
  /* High 16 bits of displacement in global offset table.  */
1199
  HOWTO (R_MIPS_CALL_HI16,      /* type */
1200
         0,                      /* rightshift */
1201
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1202
         16,                    /* bitsize */
1203
         FALSE,                 /* pc_relative */
1204
         0,                      /* bitpos */
1205
         complain_overflow_dont, /* complain_on_overflow */
1206
         _bfd_mips_elf_generic_reloc, /* special_function */
1207
         "R_MIPS_CALL_HI16",    /* name */
1208
         FALSE,                 /* partial_inplace */
1209
         0,                      /* src_mask */
1210
         0x0000ffff,            /* dst_mask */
1211
         FALSE),                /* pcrel_offset */
1212
 
1213
  /* Low 16 bits of displacement in global offset table.  */
1214
  HOWTO (R_MIPS_CALL_LO16,      /* type */
1215
         0,                      /* rightshift */
1216
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1217
         16,                    /* bitsize */
1218
         FALSE,                 /* pc_relative */
1219
         0,                      /* bitpos */
1220
         complain_overflow_dont, /* complain_on_overflow */
1221
         _bfd_mips_elf_generic_reloc, /* special_function */
1222
         "R_MIPS_CALL_LO16",    /* name */
1223
         FALSE,                 /* partial_inplace */
1224
         0,                      /* src_mask */
1225
         0x0000ffff,            /* dst_mask */
1226
         FALSE),                /* pcrel_offset */
1227
 
1228
  /* Section displacement, used by an associated event location section.  */
1229
  HOWTO (R_MIPS_SCN_DISP,       /* type */
1230
         0,                      /* rightshift */
1231
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1232
         32,                    /* bitsize */
1233
         FALSE,                 /* pc_relative */
1234
         0,                      /* bitpos */
1235
         complain_overflow_dont, /* complain_on_overflow */
1236
         _bfd_mips_elf_generic_reloc, /* special_function */
1237
         "R_MIPS_SCN_DISP",     /* name */
1238
         FALSE,                 /* partial_inplace */
1239
         0,                      /* src_mask */
1240
         0xffffffff,            /* dst_mask */
1241
         FALSE),                /* pcrel_offset */
1242
 
1243
  /* 16 bit relocation.  */
1244
  HOWTO (R_MIPS_REL16,          /* type */
1245
         0,                      /* rightshift */
1246
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1247
         16,                    /* bitsize */
1248
         FALSE,                 /* pc_relative */
1249
         0,                      /* bitpos */
1250
         complain_overflow_signed, /* complain_on_overflow */
1251
         _bfd_mips_elf_generic_reloc, /* special_function */
1252
         "R_MIPS_REL16",        /* name */
1253
         FALSE,                 /* partial_inplace */
1254
         0,                      /* src_mask */
1255
         0xffff,                /* dst_mask */
1256
         FALSE),                /* pcrel_offset */
1257
 
1258
  /* These two are obsolete.  */
1259
  EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
1260
  EMPTY_HOWTO (R_MIPS_PJUMP),
1261
 
1262
  /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
1263
     It must be used for multigot GOT's (and only there).  */
1264
  HOWTO (R_MIPS_RELGOT,         /* type */
1265
         0,                      /* rightshift */
1266
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1267
         32,                    /* bitsize */
1268
         FALSE,                 /* pc_relative */
1269
         0,                      /* bitpos */
1270
         complain_overflow_dont, /* complain_on_overflow */
1271
         _bfd_mips_elf_generic_reloc, /* special_function */
1272
         "R_MIPS_RELGOT",       /* name */
1273
         FALSE,                 /* partial_inplace */
1274
         0,                      /* src_mask */
1275
         0xffffffff,            /* dst_mask */
1276
         FALSE),                /* pcrel_offset */
1277
 
1278
  /* Protected jump conversion.  This is an optimization hint.  No
1279
     relocation is required for correctness.  */
1280
  HOWTO (R_MIPS_JALR,           /* type */
1281
         0,                      /* rightshift */
1282
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1283
         32,                    /* bitsize */
1284
         FALSE,                 /* pc_relative */
1285
         0,                      /* bitpos */
1286
         complain_overflow_dont, /* complain_on_overflow */
1287
         _bfd_mips_elf_generic_reloc, /* special_function */
1288
         "R_MIPS_JALR",         /* name */
1289
         FALSE,                 /* partial_inplace */
1290
         0,                      /* src_mask */
1291
         0,                      /* dst_mask */
1292
         FALSE),                /* pcrel_offset */
1293
 
1294
  /* TLS GD/LD dynamic relocations.  */
1295
  HOWTO (R_MIPS_TLS_DTPMOD32,   /* type */
1296
         0,                      /* rightshift */
1297
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1298
         32,                    /* bitsize */
1299
         FALSE,                 /* pc_relative */
1300
         0,                      /* bitpos */
1301
         complain_overflow_dont, /* complain_on_overflow */
1302
         _bfd_mips_elf_generic_reloc, /* special_function */
1303
         "R_MIPS_TLS_DTPMOD32", /* name */
1304
         TRUE,                  /* partial_inplace */
1305
         0xffffffff,            /* src_mask */
1306
         0xffffffff,            /* dst_mask */
1307
         FALSE),                /* pcrel_offset */
1308
 
1309
  HOWTO (R_MIPS_TLS_DTPREL32,   /* type */
1310
         0,                      /* rightshift */
1311
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1312
         32,                    /* bitsize */
1313
         FALSE,                 /* pc_relative */
1314
         0,                      /* bitpos */
1315
         complain_overflow_dont, /* complain_on_overflow */
1316
         _bfd_mips_elf_generic_reloc, /* special_function */
1317
         "R_MIPS_TLS_DTPREL32", /* name */
1318
         TRUE,                  /* partial_inplace */
1319
         0xffffffff,            /* src_mask */
1320
         0xffffffff,            /* dst_mask */
1321
         FALSE),                /* pcrel_offset */
1322
 
1323
  EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
1324
  EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
1325
 
1326
  /* TLS general dynamic variable reference.  */
1327
  HOWTO (R_MIPS_TLS_GD,         /* type */
1328
         0,                      /* rightshift */
1329
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1330
         16,                    /* bitsize */
1331
         FALSE,                 /* pc_relative */
1332
         0,                      /* bitpos */
1333
         complain_overflow_signed, /* complain_on_overflow */
1334
         _bfd_mips_elf_generic_reloc, /* special_function */
1335
         "R_MIPS_TLS_GD",       /* name */
1336
         TRUE,                  /* partial_inplace */
1337
         0x0000ffff,            /* src_mask */
1338
         0x0000ffff,            /* dst_mask */
1339
         FALSE),                /* pcrel_offset */
1340
 
1341
  /* TLS local dynamic variable reference.  */
1342
  HOWTO (R_MIPS_TLS_LDM,        /* type */
1343
         0,                      /* rightshift */
1344
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1345
         16,                    /* bitsize */
1346
         FALSE,                 /* pc_relative */
1347
         0,                      /* bitpos */
1348
         complain_overflow_signed, /* complain_on_overflow */
1349
         _bfd_mips_elf_generic_reloc, /* special_function */
1350
         "R_MIPS_TLS_LDM",      /* name */
1351
         TRUE,                  /* partial_inplace */
1352
         0x0000ffff,            /* src_mask */
1353
         0x0000ffff,            /* dst_mask */
1354
         FALSE),                /* pcrel_offset */
1355
 
1356
  /* TLS local dynamic offset.  */
1357
  HOWTO (R_MIPS_TLS_DTPREL_HI16,        /* type */
1358
         0,                      /* rightshift */
1359
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1360
         16,                    /* bitsize */
1361
         FALSE,                 /* pc_relative */
1362
         0,                      /* bitpos */
1363
         complain_overflow_signed, /* complain_on_overflow */
1364
         _bfd_mips_elf_generic_reloc, /* special_function */
1365
         "R_MIPS_TLS_DTPREL_HI16",      /* name */
1366
         TRUE,                  /* partial_inplace */
1367
         0x0000ffff,            /* src_mask */
1368
         0x0000ffff,            /* dst_mask */
1369
         FALSE),                /* pcrel_offset */
1370
 
1371
  /* TLS local dynamic offset.  */
1372
  HOWTO (R_MIPS_TLS_DTPREL_LO16,        /* type */
1373
         0,                      /* rightshift */
1374
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1375
         16,                    /* bitsize */
1376
         FALSE,                 /* pc_relative */
1377
         0,                      /* bitpos */
1378
         complain_overflow_signed, /* complain_on_overflow */
1379
         _bfd_mips_elf_generic_reloc, /* special_function */
1380
         "R_MIPS_TLS_DTPREL_LO16",      /* name */
1381
         TRUE,                  /* partial_inplace */
1382
         0x0000ffff,            /* src_mask */
1383
         0x0000ffff,            /* dst_mask */
1384
         FALSE),                /* pcrel_offset */
1385
 
1386
  /* TLS thread pointer offset.  */
1387
  HOWTO (R_MIPS_TLS_GOTTPREL,   /* type */
1388
         0,                      /* rightshift */
1389
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1390
         16,                    /* bitsize */
1391
         FALSE,                 /* pc_relative */
1392
         0,                      /* bitpos */
1393
         complain_overflow_signed, /* complain_on_overflow */
1394
         _bfd_mips_elf_generic_reloc, /* special_function */
1395
         "R_MIPS_TLS_GOTTPREL", /* name */
1396
         TRUE,                  /* partial_inplace */
1397
         0x0000ffff,            /* src_mask */
1398
         0x0000ffff,            /* dst_mask */
1399
         FALSE),                /* pcrel_offset */
1400
 
1401
  /* TLS IE dynamic relocations.  */
1402
  HOWTO (R_MIPS_TLS_TPREL32,    /* type */
1403
         0,                      /* rightshift */
1404
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1405
         32,                    /* bitsize */
1406
         FALSE,                 /* pc_relative */
1407
         0,                      /* bitpos */
1408
         complain_overflow_dont, /* complain_on_overflow */
1409
         _bfd_mips_elf_generic_reloc, /* special_function */
1410
         "R_MIPS_TLS_TPREL32",  /* name */
1411
         TRUE,                  /* partial_inplace */
1412
         0xffffffff,            /* src_mask */
1413
         0xffffffff,            /* dst_mask */
1414
         FALSE),                /* pcrel_offset */
1415
 
1416
  EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
1417
 
1418
  /* TLS thread pointer offset.  */
1419
  HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
1420
         0,                      /* rightshift */
1421
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1422
         16,                    /* bitsize */
1423
         FALSE,                 /* pc_relative */
1424
         0,                      /* bitpos */
1425
         complain_overflow_signed, /* complain_on_overflow */
1426
         _bfd_mips_elf_generic_reloc, /* special_function */
1427
         "R_MIPS_TLS_TPREL_HI16", /* name */
1428
         TRUE,                  /* partial_inplace */
1429
         0x0000ffff,            /* src_mask */
1430
         0x0000ffff,            /* dst_mask */
1431
         FALSE),                /* pcrel_offset */
1432
 
1433
  /* TLS thread pointer offset.  */
1434
  HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
1435
         0,                      /* rightshift */
1436
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1437
         16,                    /* bitsize */
1438
         FALSE,                 /* pc_relative */
1439
         0,                      /* bitpos */
1440
         complain_overflow_signed, /* complain_on_overflow */
1441
         _bfd_mips_elf_generic_reloc, /* special_function */
1442
         "R_MIPS_TLS_TPREL_LO16", /* name */
1443
         TRUE,                  /* partial_inplace */
1444
         0x0000ffff,            /* src_mask */
1445
         0x0000ffff,            /* dst_mask */
1446
         FALSE),                /* pcrel_offset */
1447
 
1448
  /* 32 bit relocation with no addend.  */
1449
  HOWTO (R_MIPS_GLOB_DAT,       /* type */
1450
         0,                      /* rightshift */
1451
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1452
         32,                    /* bitsize */
1453
         FALSE,                 /* pc_relative */
1454
         0,                      /* bitpos */
1455
         complain_overflow_dont, /* complain_on_overflow */
1456
         _bfd_mips_elf_generic_reloc, /* special_function */
1457
         "R_MIPS_GLOB_DAT",     /* name */
1458
         FALSE,                 /* partial_inplace */
1459
         0x0,                   /* src_mask */
1460
         0xffffffff,            /* dst_mask */
1461
         FALSE),                /* pcrel_offset */
1462
};
1463
 
1464
static reloc_howto_type elf_mips16_howto_table_rel[] =
1465
{
1466
  /* The reloc used for the mips16 jump instruction.  */
1467
  HOWTO (R_MIPS16_26,           /* type */
1468
         2,                     /* rightshift */
1469
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1470
         26,                    /* bitsize */
1471
         FALSE,                 /* pc_relative */
1472
         0,                      /* bitpos */
1473
         complain_overflow_dont, /* complain_on_overflow */
1474
                                /* This needs complex overflow
1475
                                   detection, because the upper four
1476
                                   bits must match the PC.  */
1477
         _bfd_mips_elf_generic_reloc, /* special_function */
1478
         "R_MIPS16_26",         /* name */
1479
         TRUE,                  /* partial_inplace */
1480
         0x3ffffff,             /* src_mask */
1481
         0x3ffffff,             /* dst_mask */
1482
         FALSE),                /* pcrel_offset */
1483
 
1484
  /* The reloc used for the mips16 gprel instruction.  */
1485
  HOWTO (R_MIPS16_GPREL,        /* type */
1486
         0,                      /* rightshift */
1487
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1488
         16,                    /* bitsize */
1489
         FALSE,                 /* pc_relative */
1490
         0,                      /* bitpos */
1491
         complain_overflow_signed, /* complain_on_overflow */
1492
         mips16_gprel_reloc,    /* special_function */
1493
         "R_MIPS16_GPREL",      /* name */
1494
         TRUE,                  /* partial_inplace */
1495
         0x0000ffff,            /* src_mask */
1496
         0x0000ffff,            /* dst_mask */
1497
         FALSE),                /* pcrel_offset */
1498
 
1499 225 jeremybenn
  /* 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 24 jeremybenn
 
1514 225 jeremybenn
  /* 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 24 jeremybenn
 
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 225 jeremybenn
  /* 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 24 jeremybenn
 
1610 225 jeremybenn
  /* 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 24 jeremybenn
 
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 225 jeremybenn
/* 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 24 jeremybenn
/* 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 225 jeremybenn
  { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
2125
  { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
2126 24 jeremybenn
  { 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 225 jeremybenn
    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 24 jeremybenn
    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 225 jeremybenn
  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 24 jeremybenn
 
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 225 jeremybenn
    case R_MIPS_COPY:
2227
      return &elf_mips_copy_howto;
2228
    case R_MIPS_JUMP_SLOT:
2229
      return &elf_mips_jump_slot_howto;
2230 24 jeremybenn
    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
      && (r_type == (unsigned int) R_MIPS_GPREL16
2263
          || r_type == (unsigned int) R_MIPS_LITERAL))
2264
    cache_ptr->addend = elf_gp (abfd);
2265
}
2266
 
2267
/* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
2268
 
2269
static void
2270
mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
2271
                         arelent *cache_ptr, Elf_Internal_Rela *dst)
2272
{
2273
  unsigned int r_type;
2274
 
2275
  r_type = ELF32_R_TYPE (dst->r_info);
2276
  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
2277
  cache_ptr->addend = dst->r_addend;
2278
}
2279
 
2280
/* Determine whether a symbol is global for the purposes of splitting
2281
   the symbol table into global symbols and local symbols.  At least
2282
   on Irix 5, this split must be between section symbols and all other
2283
   symbols.  On most ELF targets the split is between static symbols
2284
   and externally visible symbols.  */
2285
 
2286
static bfd_boolean
2287
mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
2288
{
2289
  if (SGI_COMPAT (abfd))
2290
    return (sym->flags & BSF_SECTION_SYM) == 0;
2291
  else
2292 225 jeremybenn
    return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
2293 24 jeremybenn
            || bfd_is_und_section (bfd_get_section (sym))
2294
            || bfd_is_com_section (bfd_get_section (sym)));
2295
}
2296
 
2297
/* Set the right machine number for a MIPS ELF file.  */
2298
 
2299
static bfd_boolean
2300
mips_elf_n32_object_p (bfd *abfd)
2301
{
2302
  unsigned long mach;
2303
 
2304
  /* Irix 5 and 6 are broken.  Object file symbol tables are not always
2305
     sorted correctly such that local symbols precede global symbols,
2306
     and the sh_info field in the symbol table is not always right.  */
2307
  if (SGI_COMPAT (abfd))
2308
    elf_bad_symtab (abfd) = TRUE;
2309
 
2310
  mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
2311
  bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
2312
 
2313
  if (! ABI_N32_P(abfd))
2314
    return FALSE;
2315
 
2316
  return TRUE;
2317
}
2318
 
2319
/* Support for core dump NOTE sections.  */
2320
static bfd_boolean
2321
elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2322
{
2323
  int offset;
2324
  unsigned int size;
2325
 
2326
  switch (note->descsz)
2327
    {
2328
      default:
2329
        return FALSE;
2330
 
2331
      case 440:         /* Linux/MIPS N32 */
2332
        /* pr_cursig */
2333
        elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2334
 
2335
        /* pr_pid */
2336
        elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
2337
 
2338
        /* pr_reg */
2339
        offset = 72;
2340
        size = 360;
2341
 
2342
        break;
2343
    }
2344
 
2345
  /* Make a ".reg/999" section.  */
2346
  return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
2347
                                          note->descpos + offset);
2348
}
2349
 
2350
static bfd_boolean
2351
elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2352
{
2353
  switch (note->descsz)
2354
    {
2355
      default:
2356
        return FALSE;
2357
 
2358
      case 128:         /* Linux/MIPS elf_prpsinfo */
2359
        elf_tdata (abfd)->core_program
2360
         = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
2361
        elf_tdata (abfd)->core_command
2362
         = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
2363
    }
2364
 
2365
  /* Note that for some reason, a spurious space is tacked
2366
     onto the end of the args in some (at least one anyway)
2367
     implementations, so strip it off if it exists.  */
2368
 
2369
  {
2370
    char *command = elf_tdata (abfd)->core_command;
2371
    int n = strlen (command);
2372
 
2373
    if (0 < n && command[n - 1] == ' ')
2374
      command[n - 1] = '\0';
2375
  }
2376
 
2377
  return TRUE;
2378
}
2379
 
2380
/* Depending on the target vector we generate some version of Irix
2381
   executables or "normal" MIPS ELF ABI executables.  */
2382
static irix_compat_t
2383
elf_n32_mips_irix_compat (bfd *abfd)
2384
{
2385
  if ((abfd->xvec == &bfd_elf32_nbigmips_vec)
2386
      || (abfd->xvec == &bfd_elf32_nlittlemips_vec))
2387
    return ict_irix6;
2388
  else
2389
    return ict_none;
2390
}
2391
 
2392
/* ECOFF swapping routines.  These are used when dealing with the
2393
   .mdebug section, which is in the ECOFF debugging format.  */
2394
static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
2395
  /* Symbol table magic number.  */
2396
  magicSym,
2397
  /* Alignment of debugging information.  E.g., 4.  */
2398
  4,
2399
  /* Sizes of external symbolic information.  */
2400
  sizeof (struct hdr_ext),
2401
  sizeof (struct dnr_ext),
2402
  sizeof (struct pdr_ext),
2403
  sizeof (struct sym_ext),
2404
  sizeof (struct opt_ext),
2405
  sizeof (struct fdr_ext),
2406
  sizeof (struct rfd_ext),
2407
  sizeof (struct ext_ext),
2408
  /* Functions to swap in external symbolic data.  */
2409
  ecoff_swap_hdr_in,
2410
  ecoff_swap_dnr_in,
2411
  ecoff_swap_pdr_in,
2412
  ecoff_swap_sym_in,
2413
  ecoff_swap_opt_in,
2414
  ecoff_swap_fdr_in,
2415
  ecoff_swap_rfd_in,
2416
  ecoff_swap_ext_in,
2417
  _bfd_ecoff_swap_tir_in,
2418
  _bfd_ecoff_swap_rndx_in,
2419
  /* Functions to swap out external symbolic data.  */
2420
  ecoff_swap_hdr_out,
2421
  ecoff_swap_dnr_out,
2422
  ecoff_swap_pdr_out,
2423
  ecoff_swap_sym_out,
2424
  ecoff_swap_opt_out,
2425
  ecoff_swap_fdr_out,
2426
  ecoff_swap_rfd_out,
2427
  ecoff_swap_ext_out,
2428
  _bfd_ecoff_swap_tir_out,
2429
  _bfd_ecoff_swap_rndx_out,
2430
  /* Function to read in symbolic data.  */
2431
  _bfd_mips_elf_read_ecoff_info
2432
};
2433
 
2434
#define ELF_ARCH                        bfd_arch_mips
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 225 jeremybenn
#define elf_backend_get_target_dtag     _bfd_mips_elf_get_target_dtag
2459 24 jeremybenn
#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 225 jeremybenn
#define elf_backend_rela_plts_and_copies_p 0
2492 24 jeremybenn
#define elf_backend_sign_extend_vma     TRUE
2493 225 jeremybenn
#define elf_backend_plt_readonly        1
2494
#define elf_backend_plt_sym_val         _bfd_mips_elf_plt_sym_val
2495 24 jeremybenn
 
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 225 jeremybenn
#define bfd_elf32_mkobject              _bfd_mips_elf_mkobject
2509 24 jeremybenn
#define bfd_elf32_bfd_link_hash_table_create \
2510
                                        _bfd_mips_elf_link_hash_table_create
2511
#define bfd_elf32_bfd_final_link        _bfd_mips_elf_final_link
2512
#define bfd_elf32_bfd_merge_private_bfd_data \
2513
                                        _bfd_mips_elf_merge_private_bfd_data
2514
#define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
2515
#define bfd_elf32_bfd_print_private_bfd_data \
2516
                                        _bfd_mips_elf_print_private_bfd_data
2517
#define bfd_elf32_bfd_relax_section     _bfd_mips_relax_section
2518
 
2519
/* Support for SGI-ish mips targets using n32 ABI.  */
2520
 
2521
#define TARGET_LITTLE_SYM               bfd_elf32_nlittlemips_vec
2522
#define TARGET_LITTLE_NAME              "elf32-nlittlemips"
2523
#define TARGET_BIG_SYM                  bfd_elf32_nbigmips_vec
2524
#define TARGET_BIG_NAME                 "elf32-nbigmips"
2525
 
2526
#define ELF_MAXPAGESIZE                 0x10000
2527
#define ELF_COMMONPAGESIZE              0x1000
2528
 
2529
#include "elf32-target.h"
2530
 
2531
/* Support for traditional mips targets using n32 ABI.  */
2532
#undef TARGET_LITTLE_SYM
2533
#undef TARGET_LITTLE_NAME
2534
#undef TARGET_BIG_SYM
2535
#undef TARGET_BIG_NAME
2536
 
2537
#undef ELF_MAXPAGESIZE
2538
#undef ELF_COMMONPAGESIZE
2539
 
2540
#define TARGET_LITTLE_SYM               bfd_elf32_ntradlittlemips_vec
2541
#define TARGET_LITTLE_NAME              "elf32-ntradlittlemips"
2542
#define TARGET_BIG_SYM                  bfd_elf32_ntradbigmips_vec
2543
#define TARGET_BIG_NAME                 "elf32-ntradbigmips"
2544
 
2545
#define ELF_MAXPAGESIZE                 0x10000
2546
#define ELF_COMMONPAGESIZE              0x1000
2547
#define elf32_bed                       elf32_tradbed
2548
 
2549
/* Include the target file again for this target.  */
2550
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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