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

Subversion Repositories open8_urisc

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

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

Line No. Rev Author Line
1 14 khays
/* MIPS-specific support for 64-bit ELF
2
   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3
   2006, 2007, 2008, 2009, 2010
4
   Free Software Foundation, Inc.
5
   Ian Lance Taylor, Cygnus Support
6
   Linker support added by Mark Mitchell, CodeSourcery, LLC.
7
   <mark@codesourcery.com>
8
 
9
   This file is part of BFD, the Binary File Descriptor library.
10
 
11
   This program is free software; you can redistribute it and/or modify
12
   it under the terms of the GNU General Public License as published by
13
   the Free Software Foundation; either version 3 of the License, or
14
   (at your option) any later version.
15
 
16
   This program is distributed in the hope that it will be useful,
17
   but WITHOUT ANY WARRANTY; without even the implied warranty of
18
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
   GNU General Public License for more details.
20
 
21
   You should have received a copy of the GNU General Public License
22
   along with this program; if not, write to the Free Software
23
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
24
   MA 02110-1301, USA.  */
25
 
26
 
27
/* This file supports the 64-bit MIPS ELF ABI.
28
 
29
   The MIPS 64-bit ELF ABI uses an unusual reloc format.  This file
30
   overrides the usual ELF reloc handling, and handles reading and
31
   writing the relocations here.  */
32
 
33
/* TODO: Many things are unsupported, even if there is some code for it
34
 .       (which was mostly stolen from elf32-mips.c and slightly adapted).
35
 .
36
 .   - Relocation handling for REL relocs is wrong in many cases and
37
 .     generally untested.
38
 .   - Relocation handling for RELA relocs related to GOT support are
39
 .     also likely to be wrong.
40
 .   - Support for MIPS16 is untested.
41
 .   - Combined relocs with RSS_* entries are unsupported.
42
 .   - The whole GOT handling for NewABI is missing, some parts of
43
 .     the OldABI version is still lying around and should be removed.
44
 */
45
 
46
#include "sysdep.h"
47
#include "bfd.h"
48
#include "libbfd.h"
49
#include "aout/ar.h"
50
#include "bfdlink.h"
51
#include "genlink.h"
52
#include "elf-bfd.h"
53
#include "elfxx-mips.h"
54
#include "elf/mips.h"
55
 
56
/* Get the ECOFF swapping routines.  The 64-bit ABI is not supposed to
57
   use ECOFF.  However, we support it anyhow for an easier changeover.  */
58
#include "coff/sym.h"
59
#include "coff/symconst.h"
60
#include "coff/internal.h"
61
#include "coff/ecoff.h"
62
/* The 64 bit versions of the mdebug data structures are in alpha.h.  */
63
#include "coff/alpha.h"
64
#define ECOFF_SIGNED_64
65
#include "ecoffswap.h"
66
 
67
static void mips_elf64_swap_reloc_in
68
  (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
69
static void mips_elf64_swap_reloca_in
70
  (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
71
static void mips_elf64_swap_reloc_out
72
  (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
73
static void mips_elf64_swap_reloca_out
74
  (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
75
static void mips_elf64_be_swap_reloc_in
76
  (bfd *, const bfd_byte *, Elf_Internal_Rela *);
77
static void mips_elf64_be_swap_reloc_out
78
  (bfd *, const Elf_Internal_Rela *, bfd_byte *);
79
static void mips_elf64_be_swap_reloca_in
80
  (bfd *, const bfd_byte *, Elf_Internal_Rela *);
81
static void mips_elf64_be_swap_reloca_out
82
  (bfd *, const Elf_Internal_Rela *, bfd_byte *);
83
static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
84
  (bfd *, bfd_reloc_code_real_type);
85
static reloc_howto_type *mips_elf64_rtype_to_howto
86
  (unsigned int, bfd_boolean);
87
static void mips_elf64_info_to_howto_rel
88
  (bfd *, arelent *, Elf_Internal_Rela *);
89
static void mips_elf64_info_to_howto_rela
90
  (bfd *, arelent *, Elf_Internal_Rela *);
91
static long mips_elf64_get_reloc_upper_bound
92
  (bfd *, asection *);
93
static long mips_elf64_canonicalize_reloc
94
  (bfd *, asection *, arelent **, asymbol **);
95
static long mips_elf64_get_dynamic_reloc_upper_bound
96
  (bfd *);
97
static long mips_elf64_canonicalize_dynamic_reloc
98
  (bfd *, arelent **, asymbol **);
99
static bfd_boolean mips_elf64_slurp_one_reloc_table
100
  (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
101
   asymbol **, bfd_boolean);
102
static bfd_boolean mips_elf64_slurp_reloc_table
103
  (bfd *, asection *, asymbol **, bfd_boolean);
104
static void mips_elf64_write_relocs
105
  (bfd *, asection *, void *);
106
static void mips_elf64_write_rel
107
  (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
108
static void mips_elf64_write_rela
109
  (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
110
static bfd_reloc_status_type mips_elf64_gprel16_reloc
111
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
112
static bfd_reloc_status_type mips_elf64_literal_reloc
113
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
114
static bfd_reloc_status_type mips_elf64_gprel32_reloc
115
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
116
static bfd_reloc_status_type mips_elf64_shift6_reloc
117
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
118
static bfd_reloc_status_type mips16_gprel_reloc
119
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
120
static bfd_boolean mips_elf64_assign_gp
121
  (bfd *, bfd_vma *);
122
static bfd_reloc_status_type mips_elf64_final_gp
123
  (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
124
static bfd_boolean mips_elf64_object_p
125
  (bfd *);
126
static irix_compat_t elf64_mips_irix_compat
127
  (bfd *);
128
static bfd_boolean elf64_mips_grok_prstatus
129
  (bfd *, Elf_Internal_Note *);
130
static bfd_boolean elf64_mips_grok_psinfo
131
  (bfd *, Elf_Internal_Note *);
132
 
133
extern const bfd_target bfd_elf64_bigmips_vec;
134
extern const bfd_target bfd_elf64_littlemips_vec;
135
 
136
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
137
   from smaller values.  Start with zero, widen, *then* decrement.  */
138
#define MINUS_ONE       (((bfd_vma)0) - 1)
139
 
140
/* The number of local .got entries we reserve.  */
141
#define MIPS_RESERVED_GOTNO (2)
142
 
143
/* The relocation table used for SHT_REL sections.  */
144
 
145
static reloc_howto_type mips_elf64_howto_table_rel[] =
146
{
147
  /* No relocation.  */
148
  HOWTO (R_MIPS_NONE,           /* type */
149
         0,                      /* rightshift */
150
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
151
         0,                      /* bitsize */
152
         FALSE,                 /* pc_relative */
153
         0,                      /* bitpos */
154
         complain_overflow_dont, /* complain_on_overflow */
155
         _bfd_mips_elf_generic_reloc,   /* special_function */
156
         "R_MIPS_NONE",         /* name */
157
         FALSE,                 /* partial_inplace */
158
         0,                      /* src_mask */
159
         0,                      /* dst_mask */
160
         FALSE),                /* pcrel_offset */
161
 
162
  /* 16 bit relocation.  */
163
  HOWTO (R_MIPS_16,             /* type */
164
         0,                      /* rightshift */
165
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
166
         16,                    /* bitsize */
167
         FALSE,                 /* pc_relative */
168
         0,                      /* bitpos */
169
         complain_overflow_signed, /* complain_on_overflow */
170
         _bfd_mips_elf_generic_reloc,   /* special_function */
171
         "R_MIPS_16",           /* name */
172
         TRUE,                  /* partial_inplace */
173
         0x0000ffff,            /* src_mask */
174
         0x0000ffff,            /* dst_mask */
175
         FALSE),                /* pcrel_offset */
176
 
177
  /* 32 bit relocation.  */
178
  HOWTO (R_MIPS_32,             /* type */
179
         0,                      /* rightshift */
180
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
181
         32,                    /* bitsize */
182
         FALSE,                 /* pc_relative */
183
         0,                      /* bitpos */
184
         complain_overflow_dont, /* complain_on_overflow */
185
         _bfd_mips_elf_generic_reloc,   /* special_function */
186
         "R_MIPS_32",           /* name */
187
         TRUE,                  /* partial_inplace */
188
         0xffffffff,            /* src_mask */
189
         0xffffffff,            /* dst_mask */
190
         FALSE),                /* pcrel_offset */
191
 
192
  /* 32 bit symbol relative relocation.  */
193
  HOWTO (R_MIPS_REL32,          /* type */
194
         0,                      /* rightshift */
195
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
196
         32,                    /* bitsize */
197
         FALSE,                 /* pc_relative */
198
         0,                      /* bitpos */
199
         complain_overflow_dont, /* complain_on_overflow */
200
         _bfd_mips_elf_generic_reloc,   /* special_function */
201
         "R_MIPS_REL32",        /* name */
202
         TRUE,                  /* partial_inplace */
203
         0xffffffff,            /* src_mask */
204
         0xffffffff,            /* dst_mask */
205
         FALSE),                /* pcrel_offset */
206
 
207
  /* 26 bit jump address.  */
208
  HOWTO (R_MIPS_26,             /* type */
209
         2,                     /* rightshift */
210
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
211
         26,                    /* bitsize */
212
         FALSE,                 /* pc_relative */
213
         0,                      /* bitpos */
214
         complain_overflow_dont, /* complain_on_overflow */
215
                                /* This needs complex overflow
216
                                   detection, because the upper 36
217
                                   bits must match the PC + 4.  */
218
         _bfd_mips_elf_generic_reloc,   /* special_function */
219
         "R_MIPS_26",           /* name */
220
         TRUE,                  /* partial_inplace */
221
         0x03ffffff,            /* src_mask */
222
         0x03ffffff,            /* dst_mask */
223
         FALSE),                /* pcrel_offset */
224
 
225
  /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
226
     However, the native IRIX6 tools use them, so we try our best. */
227
 
228
  /* High 16 bits of symbol value.  */
229
  HOWTO (R_MIPS_HI16,           /* type */
230
         16,                    /* rightshift */
231
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
232
         16,                    /* bitsize */
233
         FALSE,                 /* pc_relative */
234
         0,                      /* bitpos */
235
         complain_overflow_dont, /* complain_on_overflow */
236
         _bfd_mips_elf_hi16_reloc, /* special_function */
237
         "R_MIPS_HI16",         /* name */
238
         TRUE,                  /* partial_inplace */
239
         0x0000ffff,            /* src_mask */
240
         0x0000ffff,            /* dst_mask */
241
         FALSE),                /* pcrel_offset */
242
 
243
  /* Low 16 bits of symbol value.  */
244
  HOWTO (R_MIPS_LO16,           /* type */
245
         0,                      /* rightshift */
246
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
247
         16,                    /* bitsize */
248
         FALSE,                 /* pc_relative */
249
         0,                      /* bitpos */
250
         complain_overflow_dont, /* complain_on_overflow */
251
         _bfd_mips_elf_lo16_reloc, /* special_function */
252
         "R_MIPS_LO16",         /* name */
253
         TRUE,                  /* partial_inplace */
254
         0x0000ffff,            /* src_mask */
255
         0x0000ffff,            /* dst_mask */
256
         FALSE),                /* pcrel_offset */
257
 
258
  /* GP relative reference.  */
259
  HOWTO (R_MIPS_GPREL16,        /* type */
260
         0,                      /* rightshift */
261
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
262
         16,                    /* bitsize */
263
         FALSE,                 /* pc_relative */
264
         0,                      /* bitpos */
265
         complain_overflow_signed, /* complain_on_overflow */
266
         mips_elf64_gprel16_reloc, /* special_function */
267
         "R_MIPS_GPREL16",      /* name */
268
         TRUE,                  /* partial_inplace */
269
         0x0000ffff,            /* src_mask */
270
         0x0000ffff,            /* dst_mask */
271
         FALSE),                /* pcrel_offset */
272
 
273
  /* Reference to literal section.  */
274
  HOWTO (R_MIPS_LITERAL,        /* type */
275
         0,                      /* rightshift */
276
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
277
         16,                    /* bitsize */
278
         FALSE,                 /* pc_relative */
279
         0,                      /* bitpos */
280
         complain_overflow_signed, /* complain_on_overflow */
281
         mips_elf64_literal_reloc, /* special_function */
282
         "R_MIPS_LITERAL",      /* name */
283
         TRUE,                  /* partial_inplace */
284
         0x0000ffff,            /* src_mask */
285
         0x0000ffff,            /* dst_mask */
286
         FALSE),                /* pcrel_offset */
287
 
288
  /* Reference to global offset table.  */
289
  HOWTO (R_MIPS_GOT16,          /* type */
290
         0,                      /* rightshift */
291
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
292
         16,                    /* bitsize */
293
         FALSE,                 /* pc_relative */
294
         0,                      /* bitpos */
295
         complain_overflow_signed, /* complain_on_overflow */
296
         _bfd_mips_elf_got16_reloc, /* special_function */
297
         "R_MIPS_GOT16",        /* name */
298
         TRUE,                  /* partial_inplace */
299
         0x0000ffff,            /* src_mask */
300
         0x0000ffff,            /* dst_mask */
301
         FALSE),                /* pcrel_offset */
302
 
303
  /* 16 bit PC relative reference.  Note that the ABI document has a typo
304
     and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
305
     We do the right thing here.  */
306
  HOWTO (R_MIPS_PC16,           /* type */
307
         2,                     /* rightshift */
308
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
309
         16,                    /* bitsize */
310
         TRUE,                  /* pc_relative */
311
         0,                      /* bitpos */
312
         complain_overflow_signed, /* complain_on_overflow */
313
         _bfd_mips_elf_generic_reloc,   /* special_function */
314
         "R_MIPS_PC16",         /* name */
315
         TRUE,                  /* partial_inplace */
316
         0x0000ffff,            /* src_mask */
317
         0x0000ffff,            /* dst_mask */
318
         TRUE),                 /* pcrel_offset */
319
 
320
  /* 16 bit call through global offset table.  */
321
  HOWTO (R_MIPS_CALL16,         /* type */
322
         0,                      /* rightshift */
323
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
324
         16,                    /* bitsize */
325
         FALSE,                 /* pc_relative */
326
         0,                      /* bitpos */
327
         complain_overflow_signed, /* complain_on_overflow */
328
         _bfd_mips_elf_generic_reloc,   /* special_function */
329
         "R_MIPS_CALL16",       /* name */
330
         TRUE,                  /* partial_inplace */
331
         0x0000ffff,            /* src_mask */
332
         0x0000ffff,            /* dst_mask */
333
         FALSE),                /* pcrel_offset */
334
 
335
  /* 32 bit GP relative reference.  */
336
  HOWTO (R_MIPS_GPREL32,        /* type */
337
         0,                      /* rightshift */
338
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
339
         32,                    /* bitsize */
340
         FALSE,                 /* pc_relative */
341
         0,                      /* bitpos */
342
         complain_overflow_dont, /* complain_on_overflow */
343
         mips_elf64_gprel32_reloc, /* special_function */
344
         "R_MIPS_GPREL32",      /* name */
345
         TRUE,                  /* partial_inplace */
346
         0xffffffff,            /* src_mask */
347
         0xffffffff,            /* dst_mask */
348
         FALSE),                /* pcrel_offset */
349
 
350
  EMPTY_HOWTO (13),
351
  EMPTY_HOWTO (14),
352
  EMPTY_HOWTO (15),
353
 
354
  /* A 5 bit shift field.  */
355
  HOWTO (R_MIPS_SHIFT5,         /* type */
356
         0,                      /* rightshift */
357
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
358
         5,                     /* bitsize */
359
         FALSE,                 /* pc_relative */
360
         6,                     /* bitpos */
361
         complain_overflow_bitfield, /* complain_on_overflow */
362
         _bfd_mips_elf_generic_reloc,   /* special_function */
363
         "R_MIPS_SHIFT5",       /* name */
364
         TRUE,                  /* partial_inplace */
365
         0x000007c0,            /* src_mask */
366
         0x000007c0,            /* dst_mask */
367
         FALSE),                /* pcrel_offset */
368
 
369
  /* A 6 bit shift field.  */
370
  HOWTO (R_MIPS_SHIFT6,         /* type */
371
         0,                      /* rightshift */
372
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
373
         6,                     /* bitsize */
374
         FALSE,                 /* pc_relative */
375
         6,                     /* bitpos */
376
         complain_overflow_bitfield, /* complain_on_overflow */
377
         mips_elf64_shift6_reloc, /* special_function */
378
         "R_MIPS_SHIFT6",       /* name */
379
         TRUE,                  /* partial_inplace */
380
         0x000007c4,            /* src_mask */
381
         0x000007c4,            /* dst_mask */
382
         FALSE),                /* pcrel_offset */
383
 
384
  /* 64 bit relocation.  */
385
  HOWTO (R_MIPS_64,             /* type */
386
         0,                      /* rightshift */
387
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
388
         64,                    /* bitsize */
389
         FALSE,                 /* pc_relative */
390
         0,                      /* bitpos */
391
         complain_overflow_dont, /* complain_on_overflow */
392
         _bfd_mips_elf_generic_reloc,   /* special_function */
393
         "R_MIPS_64",           /* name */
394
         TRUE,                  /* partial_inplace */
395
         MINUS_ONE,             /* src_mask */
396
         MINUS_ONE,             /* dst_mask */
397
         FALSE),                /* pcrel_offset */
398
 
399
  /* Displacement in the global offset table.  */
400
  HOWTO (R_MIPS_GOT_DISP,       /* type */
401
         0,                      /* rightshift */
402
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
403
         16,                    /* bitsize */
404
         FALSE,                 /* pc_relative */
405
         0,                      /* bitpos */
406
         complain_overflow_signed, /* complain_on_overflow */
407
         _bfd_mips_elf_generic_reloc,   /* special_function */
408
         "R_MIPS_GOT_DISP",     /* name */
409
         TRUE,                  /* partial_inplace */
410
         0x0000ffff,            /* src_mask */
411
         0x0000ffff,            /* dst_mask */
412
         FALSE),                /* pcrel_offset */
413
 
414
  /* Displacement to page pointer in the global offset table.  */
415
  HOWTO (R_MIPS_GOT_PAGE,       /* type */
416
         0,                      /* rightshift */
417
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
418
         16,                    /* bitsize */
419
         FALSE,                 /* pc_relative */
420
         0,                      /* bitpos */
421
         complain_overflow_signed, /* complain_on_overflow */
422
         _bfd_mips_elf_generic_reloc,   /* special_function */
423
         "R_MIPS_GOT_PAGE",     /* name */
424
         TRUE,                  /* partial_inplace */
425
         0x0000ffff,            /* src_mask */
426
         0x0000ffff,            /* dst_mask */
427
         FALSE),                /* pcrel_offset */
428
 
429
  /* Offset from page pointer in the global offset table.  */
430
  HOWTO (R_MIPS_GOT_OFST,       /* type */
431
         0,                      /* rightshift */
432
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
433
         16,                    /* bitsize */
434
         FALSE,                 /* pc_relative */
435
         0,                      /* bitpos */
436
         complain_overflow_signed, /* complain_on_overflow */
437
         _bfd_mips_elf_generic_reloc,   /* special_function */
438
         "R_MIPS_GOT_OFST",     /* name */
439
         TRUE,                  /* partial_inplace */
440
         0x0000ffff,            /* src_mask */
441
         0x0000ffff,            /* dst_mask */
442
         FALSE),                /* pcrel_offset */
443
 
444
  /* High 16 bits of displacement in global offset table.  */
445
  HOWTO (R_MIPS_GOT_HI16,       /* type */
446
         0,                      /* rightshift */
447
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
448
         16,                    /* bitsize */
449
         FALSE,                 /* pc_relative */
450
         0,                      /* bitpos */
451
         complain_overflow_dont, /* complain_on_overflow */
452
         _bfd_mips_elf_generic_reloc,   /* special_function */
453
         "R_MIPS_GOT_HI16",     /* name */
454
         TRUE,                  /* partial_inplace */
455
         0x0000ffff,            /* src_mask */
456
         0x0000ffff,            /* dst_mask */
457
         FALSE),                /* pcrel_offset */
458
 
459
  /* Low 16 bits of displacement in global offset table.  */
460
  HOWTO (R_MIPS_GOT_LO16,       /* type */
461
         0,                      /* rightshift */
462
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
463
         16,                    /* bitsize */
464
         FALSE,                 /* pc_relative */
465
         0,                      /* bitpos */
466
         complain_overflow_dont, /* complain_on_overflow */
467
         _bfd_mips_elf_generic_reloc,   /* special_function */
468
         "R_MIPS_GOT_LO16",     /* name */
469
         TRUE,                  /* partial_inplace */
470
         0x0000ffff,            /* src_mask */
471
         0x0000ffff,            /* dst_mask */
472
         FALSE),                /* pcrel_offset */
473
 
474
  /* 64 bit subtraction.  */
475
  HOWTO (R_MIPS_SUB,            /* type */
476
         0,                      /* rightshift */
477
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
478
         64,                    /* bitsize */
479
         FALSE,                 /* pc_relative */
480
         0,                      /* bitpos */
481
         complain_overflow_dont, /* complain_on_overflow */
482
         _bfd_mips_elf_generic_reloc,   /* special_function */
483
         "R_MIPS_SUB",          /* name */
484
         TRUE,                  /* partial_inplace */
485
         MINUS_ONE,             /* src_mask */
486
         MINUS_ONE,             /* dst_mask */
487
         FALSE),                /* pcrel_offset */
488
 
489
  /* Insert the addend as an instruction.  */
490
  /* FIXME: Not handled correctly.  */
491
  HOWTO (R_MIPS_INSERT_A,       /* type */
492
         0,                      /* rightshift */
493
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
494
         32,                    /* bitsize */
495
         FALSE,                 /* pc_relative */
496
         0,                      /* bitpos */
497
         complain_overflow_dont, /* complain_on_overflow */
498
         _bfd_mips_elf_generic_reloc,   /* special_function */
499
         "R_MIPS_INSERT_A",     /* name */
500
         TRUE,                  /* partial_inplace */
501
         0xffffffff,            /* src_mask */
502
         0xffffffff,            /* dst_mask */
503
         FALSE),                /* pcrel_offset */
504
 
505
  /* Insert the addend as an instruction, and change all relocations
506
     to refer to the old instruction at the address.  */
507
  /* FIXME: Not handled correctly.  */
508
  HOWTO (R_MIPS_INSERT_B,       /* type */
509
         0,                      /* rightshift */
510
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
511
         32,                    /* bitsize */
512
         FALSE,                 /* pc_relative */
513
         0,                      /* bitpos */
514
         complain_overflow_dont, /* complain_on_overflow */
515
         _bfd_mips_elf_generic_reloc,   /* special_function */
516
         "R_MIPS_INSERT_B",     /* name */
517
         TRUE,                  /* partial_inplace */
518
         0xffffffff,            /* src_mask */
519
         0xffffffff,            /* dst_mask */
520
         FALSE),                /* pcrel_offset */
521
 
522
  /* Delete a 32 bit instruction.  */
523
  /* FIXME: Not handled correctly.  */
524
  HOWTO (R_MIPS_DELETE,         /* type */
525
         0,                      /* rightshift */
526
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
527
         32,                    /* bitsize */
528
         FALSE,                 /* pc_relative */
529
         0,                      /* bitpos */
530
         complain_overflow_dont, /* complain_on_overflow */
531
         _bfd_mips_elf_generic_reloc,   /* special_function */
532
         "R_MIPS_DELETE",       /* name */
533
         TRUE,                  /* partial_inplace */
534
         0xffffffff,            /* src_mask */
535
         0xffffffff,            /* dst_mask */
536
         FALSE),                /* pcrel_offset */
537
 
538
  /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
539
     We don't, because
540
       a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
541
          R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
542
          fallable heuristics.
543
       b) No other NewABI toolchain actually emits such relocations.  */
544
  EMPTY_HOWTO (R_MIPS_HIGHER),
545
  EMPTY_HOWTO (R_MIPS_HIGHEST),
546
 
547
  /* High 16 bits of displacement in global offset table.  */
548
  HOWTO (R_MIPS_CALL_HI16,      /* type */
549
         0,                      /* rightshift */
550
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
551
         16,                    /* bitsize */
552
         FALSE,                 /* pc_relative */
553
         0,                      /* bitpos */
554
         complain_overflow_dont, /* complain_on_overflow */
555
         _bfd_mips_elf_generic_reloc,   /* special_function */
556
         "R_MIPS_CALL_HI16",    /* name */
557
         TRUE,                  /* partial_inplace */
558
         0x0000ffff,            /* src_mask */
559
         0x0000ffff,            /* dst_mask */
560
         FALSE),                /* pcrel_offset */
561
 
562
  /* Low 16 bits of displacement in global offset table.  */
563
  HOWTO (R_MIPS_CALL_LO16,      /* type */
564
         0,                      /* rightshift */
565
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
566
         16,                    /* bitsize */
567
         FALSE,                 /* pc_relative */
568
         0,                      /* bitpos */
569
         complain_overflow_dont, /* complain_on_overflow */
570
         _bfd_mips_elf_generic_reloc,   /* special_function */
571
         "R_MIPS_CALL_LO16",    /* name */
572
         TRUE,                  /* partial_inplace */
573
         0x0000ffff,            /* src_mask */
574
         0x0000ffff,            /* dst_mask */
575
         FALSE),                /* pcrel_offset */
576
 
577
  /* Section displacement, used by an associated event location section.  */
578
  HOWTO (R_MIPS_SCN_DISP,       /* type */
579
         0,                      /* rightshift */
580
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
581
         32,                    /* bitsize */
582
         FALSE,                 /* pc_relative */
583
         0,                      /* bitpos */
584
         complain_overflow_dont, /* complain_on_overflow */
585
         _bfd_mips_elf_generic_reloc,   /* special_function */
586
         "R_MIPS_SCN_DISP",     /* name */
587
         TRUE,                  /* partial_inplace */
588
         0xffffffff,            /* src_mask */
589
         0xffffffff,            /* dst_mask */
590
         FALSE),                /* pcrel_offset */
591
 
592
  HOWTO (R_MIPS_REL16,          /* type */
593
         0,                      /* rightshift */
594
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
595
         16,                    /* bitsize */
596
         FALSE,                 /* pc_relative */
597
         0,                      /* bitpos */
598
         complain_overflow_signed, /* complain_on_overflow */
599
         _bfd_mips_elf_generic_reloc,   /* special_function */
600
         "R_MIPS_REL16",        /* name */
601
         TRUE,                  /* partial_inplace */
602
         0xffff,                /* src_mask */
603
         0xffff,                /* dst_mask */
604
         FALSE),                /* pcrel_offset */
605
 
606
  /* These two are obsolete.  */
607
  EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
608
  EMPTY_HOWTO (R_MIPS_PJUMP),
609
 
610
  /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
611
     It must be used for multigot GOT's (and only there).  */
612
  HOWTO (R_MIPS_RELGOT,         /* type */
613
         0,                      /* rightshift */
614
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
615
         32,                    /* bitsize */
616
         FALSE,                 /* pc_relative */
617
         0,                      /* bitpos */
618
         complain_overflow_dont, /* complain_on_overflow */
619
         _bfd_mips_elf_generic_reloc,   /* special_function */
620
         "R_MIPS_RELGOT",       /* name */
621
         TRUE,                  /* partial_inplace */
622
         0xffffffff,            /* src_mask */
623
         0xffffffff,            /* dst_mask */
624
         FALSE),                /* pcrel_offset */
625
 
626
  /* Protected jump conversion.  This is an optimization hint.  No
627
     relocation is required for correctness.  */
628
  HOWTO (R_MIPS_JALR,           /* type */
629
         0,                      /* rightshift */
630
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
631
         32,                    /* bitsize */
632
         FALSE,                 /* pc_relative */
633
         0,                      /* bitpos */
634
         complain_overflow_dont, /* complain_on_overflow */
635
         _bfd_mips_elf_generic_reloc,   /* special_function */
636
         "R_MIPS_JALR",         /* name */
637
         FALSE,                 /* partial_inplace */
638
         0,                      /* src_mask */
639
         0x00000000,            /* dst_mask */
640
         FALSE),                /* pcrel_offset */
641
 
642
  /* TLS relocations.  */
643
  EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
644
  EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
645
 
646
  HOWTO (R_MIPS_TLS_DTPMOD64,   /* type */
647
         0,                      /* rightshift */
648
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
649
         64,                    /* bitsize */
650
         FALSE,                 /* pc_relative */
651
         0,                      /* bitpos */
652
         complain_overflow_dont, /* complain_on_overflow */
653
         _bfd_mips_elf_generic_reloc, /* special_function */
654
         "R_MIPS_TLS_DTPMOD64", /* name */
655
         TRUE,                  /* partial_inplace */
656
         MINUS_ONE,             /* src_mask */
657
         MINUS_ONE,             /* dst_mask */
658
         FALSE),                /* pcrel_offset */
659
 
660
  HOWTO (R_MIPS_TLS_DTPREL64,   /* type */
661
         0,                      /* rightshift */
662
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
663
         64,                    /* bitsize */
664
         FALSE,                 /* pc_relative */
665
         0,                      /* bitpos */
666
         complain_overflow_dont, /* complain_on_overflow */
667
         _bfd_mips_elf_generic_reloc, /* special_function */
668
         "R_MIPS_TLS_DTPREL64", /* name */
669
         TRUE,                  /* partial_inplace */
670
         MINUS_ONE,             /* src_mask */
671
         MINUS_ONE,             /* dst_mask */
672
         FALSE),                /* pcrel_offset */
673
 
674
  /* TLS general dynamic variable reference.  */
675
  HOWTO (R_MIPS_TLS_GD,         /* type */
676
         0,                      /* rightshift */
677
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
678
         16,                    /* bitsize */
679
         FALSE,                 /* pc_relative */
680
         0,                      /* bitpos */
681
         complain_overflow_signed, /* complain_on_overflow */
682
         _bfd_mips_elf_generic_reloc, /* special_function */
683
         "R_MIPS_TLS_GD",       /* name */
684
         TRUE,                  /* partial_inplace */
685
         0x0000ffff,            /* src_mask */
686
         0x0000ffff,            /* dst_mask */
687
         FALSE),                /* pcrel_offset */
688
 
689
  /* TLS local dynamic variable reference.  */
690
  HOWTO (R_MIPS_TLS_LDM,        /* type */
691
         0,                      /* rightshift */
692
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
693
         16,                    /* bitsize */
694
         FALSE,                 /* pc_relative */
695
         0,                      /* bitpos */
696
         complain_overflow_signed, /* complain_on_overflow */
697
         _bfd_mips_elf_generic_reloc, /* special_function */
698
         "R_MIPS_TLS_LDM",      /* name */
699
         TRUE,                  /* partial_inplace */
700
         0x0000ffff,            /* src_mask */
701
         0x0000ffff,            /* dst_mask */
702
         FALSE),                /* pcrel_offset */
703
 
704
  /* TLS local dynamic offset.  */
705
  HOWTO (R_MIPS_TLS_DTPREL_HI16,        /* type */
706
         0,                      /* rightshift */
707
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
708
         16,                    /* bitsize */
709
         FALSE,                 /* pc_relative */
710
         0,                      /* bitpos */
711
         complain_overflow_signed, /* complain_on_overflow */
712
         _bfd_mips_elf_generic_reloc, /* special_function */
713
         "R_MIPS_TLS_DTPREL_HI16",      /* name */
714
         TRUE,                  /* partial_inplace */
715
         0x0000ffff,            /* src_mask */
716
         0x0000ffff,            /* dst_mask */
717
         FALSE),                /* pcrel_offset */
718
 
719
  /* TLS local dynamic offset.  */
720
  HOWTO (R_MIPS_TLS_DTPREL_LO16,        /* type */
721
         0,                      /* rightshift */
722
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
723
         16,                    /* bitsize */
724
         FALSE,                 /* pc_relative */
725
         0,                      /* bitpos */
726
         complain_overflow_signed, /* complain_on_overflow */
727
         _bfd_mips_elf_generic_reloc, /* special_function */
728
         "R_MIPS_TLS_DTPREL_LO16",      /* name */
729
         TRUE,                  /* partial_inplace */
730
         0x0000ffff,            /* src_mask */
731
         0x0000ffff,            /* dst_mask */
732
         FALSE),                /* pcrel_offset */
733
 
734
  /* TLS thread pointer offset.  */
735
  HOWTO (R_MIPS_TLS_GOTTPREL,   /* type */
736
         0,                      /* rightshift */
737
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
738
         16,                    /* bitsize */
739
         FALSE,                 /* pc_relative */
740
         0,                      /* bitpos */
741
         complain_overflow_signed, /* complain_on_overflow */
742
         _bfd_mips_elf_generic_reloc, /* special_function */
743
         "R_MIPS_TLS_GOTTPREL", /* name */
744
         TRUE,                  /* partial_inplace */
745
         0x0000ffff,            /* src_mask */
746
         0x0000ffff,            /* dst_mask */
747
         FALSE),                /* pcrel_offset */
748
 
749
  /* TLS IE dynamic relocations.  */
750
  EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
751
 
752
  HOWTO (R_MIPS_TLS_TPREL64,    /* type */
753
         0,                      /* rightshift */
754
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
755
         64,                    /* bitsize */
756
         FALSE,                 /* pc_relative */
757
         0,                      /* bitpos */
758
         complain_overflow_dont, /* complain_on_overflow */
759
         _bfd_mips_elf_generic_reloc, /* special_function */
760
         "R_MIPS_TLS_TPREL64",  /* name */
761
         TRUE,                  /* partial_inplace */
762
         MINUS_ONE,             /* src_mask */
763
         MINUS_ONE,             /* dst_mask */
764
         FALSE),                /* pcrel_offset */
765
 
766
  /* TLS thread pointer offset.  */
767
  HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
768
         0,                      /* rightshift */
769
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
770
         16,                    /* bitsize */
771
         FALSE,                 /* pc_relative */
772
         0,                      /* bitpos */
773
         complain_overflow_signed, /* complain_on_overflow */
774
         _bfd_mips_elf_generic_reloc, /* special_function */
775
         "R_MIPS_TLS_TPREL_HI16", /* name */
776
         TRUE,                  /* partial_inplace */
777
         0x0000ffff,            /* src_mask */
778
         0x0000ffff,            /* dst_mask */
779
         FALSE),                /* pcrel_offset */
780
 
781
  /* TLS thread pointer offset.  */
782
  HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
783
         0,                      /* rightshift */
784
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
785
         16,                    /* bitsize */
786
         FALSE,                 /* pc_relative */
787
         0,                      /* bitpos */
788
         complain_overflow_signed, /* complain_on_overflow */
789
         _bfd_mips_elf_generic_reloc, /* special_function */
790
         "R_MIPS_TLS_TPREL_LO16", /* name */
791
         TRUE,                  /* partial_inplace */
792
         0x0000ffff,            /* src_mask */
793
         0x0000ffff,            /* dst_mask */
794
         FALSE),                /* pcrel_offset */
795
 
796
  /* 32 bit relocation with no addend.  */
797
  HOWTO (R_MIPS_GLOB_DAT,       /* type */
798
         0,                      /* rightshift */
799
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
800
         32,                    /* bitsize */
801
         FALSE,                 /* pc_relative */
802
         0,                      /* bitpos */
803
         complain_overflow_dont, /* complain_on_overflow */
804
         _bfd_mips_elf_generic_reloc, /* special_function */
805
         "R_MIPS_GLOB_DAT",     /* name */
806
         FALSE,                 /* partial_inplace */
807
         0x0,                   /* src_mask */
808
         0xffffffff,            /* dst_mask */
809
         FALSE),                /* pcrel_offset */
810
};
811
 
812
/* The relocation table used for SHT_RELA sections.  */
813
 
814
static reloc_howto_type mips_elf64_howto_table_rela[] =
815
{
816
  /* No relocation.  */
817
  HOWTO (R_MIPS_NONE,           /* type */
818
         0,                      /* rightshift */
819
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
820
         0,                      /* bitsize */
821
         FALSE,                 /* pc_relative */
822
         0,                      /* bitpos */
823
         complain_overflow_dont, /* complain_on_overflow */
824
         _bfd_mips_elf_generic_reloc,   /* special_function */
825
         "R_MIPS_NONE",         /* name */
826
         FALSE,                 /* partial_inplace */
827
         0,                      /* src_mask */
828
         0,                      /* dst_mask */
829
         FALSE),                /* pcrel_offset */
830
 
831
  /* 16 bit relocation.  */
832
  HOWTO (R_MIPS_16,             /* type */
833
         0,                      /* rightshift */
834
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
835
         16,                    /* bitsize */
836
         FALSE,                 /* pc_relative */
837
         0,                      /* bitpos */
838
         complain_overflow_signed, /* complain_on_overflow */
839
         _bfd_mips_elf_generic_reloc,   /* special_function */
840
         "R_MIPS_16",           /* name */
841
         FALSE,                 /* partial_inplace */
842
         0,                      /* src_mask */
843
         0x0000ffff,            /* dst_mask */
844
         FALSE),                /* pcrel_offset */
845
 
846
  /* 32 bit relocation.  */
847
  HOWTO (R_MIPS_32,             /* type */
848
         0,                      /* rightshift */
849
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
850
         32,                    /* bitsize */
851
         FALSE,                 /* pc_relative */
852
         0,                      /* bitpos */
853
         complain_overflow_dont, /* complain_on_overflow */
854
         _bfd_mips_elf_generic_reloc,   /* special_function */
855
         "R_MIPS_32",           /* name */
856
         FALSE,                 /* partial_inplace */
857
         0,                      /* src_mask */
858
         0xffffffff,            /* dst_mask */
859
         FALSE),                /* pcrel_offset */
860
 
861
  /* 32 bit symbol relative relocation.  */
862
  HOWTO (R_MIPS_REL32,          /* type */
863
         0,                      /* rightshift */
864
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
865
         32,                    /* bitsize */
866
         FALSE,                 /* pc_relative */
867
         0,                      /* bitpos */
868
         complain_overflow_dont, /* complain_on_overflow */
869
         _bfd_mips_elf_generic_reloc,   /* special_function */
870
         "R_MIPS_REL32",        /* name */
871
         FALSE,                 /* partial_inplace */
872
         0,                      /* src_mask */
873
         0xffffffff,            /* dst_mask */
874
         FALSE),                /* pcrel_offset */
875
 
876
  /* 26 bit jump address.  */
877
  HOWTO (R_MIPS_26,             /* type */
878
         2,                     /* rightshift */
879
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
880
         26,                    /* bitsize */
881
         FALSE,                 /* pc_relative */
882
         0,                      /* bitpos */
883
         complain_overflow_dont, /* complain_on_overflow */
884
                                /* This needs complex overflow
885
                                   detection, because the upper 36
886
                                   bits must match the PC + 4.  */
887
         _bfd_mips_elf_generic_reloc,   /* special_function */
888
         "R_MIPS_26",           /* name */
889
         FALSE,                 /* partial_inplace */
890
         0,                      /* src_mask */
891
         0x03ffffff,            /* dst_mask */
892
         FALSE),                /* pcrel_offset */
893
 
894
  /* High 16 bits of symbol value.  */
895
  HOWTO (R_MIPS_HI16,           /* type */
896
         0,                      /* rightshift */
897
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
898
         16,                    /* bitsize */
899
         FALSE,                 /* pc_relative */
900
         0,                      /* bitpos */
901
         complain_overflow_dont, /* complain_on_overflow */
902
         _bfd_mips_elf_generic_reloc,   /* special_function */
903
         "R_MIPS_HI16",         /* name */
904
         FALSE,                 /* partial_inplace */
905
         0,                      /* src_mask */
906
         0x0000ffff,            /* dst_mask */
907
         FALSE),                /* pcrel_offset */
908
 
909
  /* Low 16 bits of symbol value.  */
910
  HOWTO (R_MIPS_LO16,           /* type */
911
         0,                      /* rightshift */
912
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
913
         16,                    /* bitsize */
914
         FALSE,                 /* pc_relative */
915
         0,                      /* bitpos */
916
         complain_overflow_dont, /* complain_on_overflow */
917
         _bfd_mips_elf_generic_reloc,   /* special_function */
918
         "R_MIPS_LO16",         /* name */
919
         FALSE,                 /* partial_inplace */
920
         0,                      /* src_mask */
921
         0x0000ffff,            /* dst_mask */
922
         FALSE),                /* pcrel_offset */
923
 
924
  /* GP relative reference.  */
925
  HOWTO (R_MIPS_GPREL16,        /* type */
926
         0,                      /* rightshift */
927
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
928
         16,                    /* bitsize */
929
         FALSE,                 /* pc_relative */
930
         0,                      /* bitpos */
931
         complain_overflow_signed, /* complain_on_overflow */
932
         mips_elf64_gprel16_reloc, /* special_function */
933
         "R_MIPS_GPREL16",      /* name */
934
         FALSE,                 /* partial_inplace */
935
         0,                      /* src_mask */
936
         0x0000ffff,            /* dst_mask */
937
         FALSE),                /* pcrel_offset */
938
 
939
  /* Reference to literal section.  */
940
  HOWTO (R_MIPS_LITERAL,        /* type */
941
         0,                      /* rightshift */
942
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
943
         16,                    /* bitsize */
944
         FALSE,                 /* pc_relative */
945
         0,                      /* bitpos */
946
         complain_overflow_signed, /* complain_on_overflow */
947
         mips_elf64_literal_reloc, /* special_function */
948
         "R_MIPS_LITERAL",      /* name */
949
         FALSE,                 /* partial_inplace */
950
         0,                      /* src_mask */
951
         0x0000ffff,            /* dst_mask */
952
         FALSE),                /* pcrel_offset */
953
 
954
  /* Reference to global offset table.  */
955
  HOWTO (R_MIPS_GOT16,          /* type */
956
         0,                      /* rightshift */
957
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
958
         16,                    /* bitsize */
959
         FALSE,                 /* pc_relative */
960
         0,                      /* bitpos */
961
         complain_overflow_signed, /* complain_on_overflow */
962
         _bfd_mips_elf_generic_reloc, /* special_function */
963
         "R_MIPS_GOT16",        /* name */
964
         FALSE,                 /* partial_inplace */
965
         0,                      /* src_mask */
966
         0x0000ffff,            /* dst_mask */
967
         FALSE),                /* pcrel_offset */
968
 
969
  /* 16 bit PC relative reference.  Note that the ABI document has a typo
970
     and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
971
     We do the right thing here.  */
972
  HOWTO (R_MIPS_PC16,           /* type */
973
         2,                     /* rightshift */
974
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
975
         16,                    /* bitsize */
976
         TRUE,                  /* pc_relative */
977
         0,                      /* bitpos */
978
         complain_overflow_signed, /* complain_on_overflow */
979
         _bfd_mips_elf_generic_reloc,   /* special_function */
980
         "R_MIPS_PC16",         /* name */
981
         FALSE,                 /* partial_inplace */
982
         0,                      /* src_mask */
983
         0x0000ffff,            /* dst_mask */
984
         TRUE),                 /* pcrel_offset */
985
 
986
  /* 16 bit call through global offset table.  */
987
  HOWTO (R_MIPS_CALL16,         /* type */
988
         0,                      /* rightshift */
989
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
990
         16,                    /* bitsize */
991
         FALSE,                 /* pc_relative */
992
         0,                      /* bitpos */
993
         complain_overflow_signed, /* complain_on_overflow */
994
         _bfd_mips_elf_generic_reloc,   /* special_function */
995
         "R_MIPS_CALL16",       /* name */
996
         FALSE,                 /* partial_inplace */
997
         0,                      /* src_mask */
998
         0x0000ffff,            /* dst_mask */
999
         FALSE),                /* pcrel_offset */
1000
 
1001
  /* 32 bit GP relative reference.  */
1002
  HOWTO (R_MIPS_GPREL32,        /* type */
1003
         0,                      /* rightshift */
1004
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1005
         32,                    /* bitsize */
1006
         FALSE,                 /* pc_relative */
1007
         0,                      /* bitpos */
1008
         complain_overflow_dont, /* complain_on_overflow */
1009
         mips_elf64_gprel32_reloc, /* special_function */
1010
         "R_MIPS_GPREL32",      /* name */
1011
         FALSE,                 /* partial_inplace */
1012
         0,                      /* src_mask */
1013
         0xffffffff,            /* dst_mask */
1014
         FALSE),                /* pcrel_offset */
1015
 
1016
  EMPTY_HOWTO (13),
1017
  EMPTY_HOWTO (14),
1018
  EMPTY_HOWTO (15),
1019
 
1020
  /* A 5 bit shift field.  */
1021
  HOWTO (R_MIPS_SHIFT5,         /* type */
1022
         0,                      /* rightshift */
1023
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1024
         5,                     /* bitsize */
1025
         FALSE,                 /* pc_relative */
1026
         6,                     /* bitpos */
1027
         complain_overflow_bitfield, /* complain_on_overflow */
1028
         _bfd_mips_elf_generic_reloc,   /* special_function */
1029
         "R_MIPS_SHIFT5",       /* name */
1030
         FALSE,                 /* partial_inplace */
1031
         0,                      /* src_mask */
1032
         0x000007c0,            /* dst_mask */
1033
         FALSE),                /* pcrel_offset */
1034
 
1035
  /* A 6 bit shift field.  */
1036
  HOWTO (R_MIPS_SHIFT6,         /* type */
1037
         0,                      /* rightshift */
1038
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1039
         6,                     /* bitsize */
1040
         FALSE,                 /* pc_relative */
1041
         6,                     /* bitpos */
1042
         complain_overflow_bitfield, /* complain_on_overflow */
1043
         mips_elf64_shift6_reloc, /* special_function */
1044
         "R_MIPS_SHIFT6",       /* name */
1045
         FALSE,                 /* partial_inplace */
1046
         0,                      /* src_mask */
1047
         0x000007c4,            /* dst_mask */
1048
         FALSE),                /* pcrel_offset */
1049
 
1050
  /* 64 bit relocation.  */
1051
  HOWTO (R_MIPS_64,             /* type */
1052
         0,                      /* rightshift */
1053
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1054
         64,                    /* bitsize */
1055
         FALSE,                 /* pc_relative */
1056
         0,                      /* bitpos */
1057
         complain_overflow_dont, /* complain_on_overflow */
1058
         _bfd_mips_elf_generic_reloc,   /* special_function */
1059
         "R_MIPS_64",           /* name */
1060
         FALSE,                 /* partial_inplace */
1061
         0,                      /* src_mask */
1062
         MINUS_ONE,             /* dst_mask */
1063
         FALSE),                /* pcrel_offset */
1064
 
1065
  /* Displacement in the global offset table.  */
1066
  HOWTO (R_MIPS_GOT_DISP,       /* type */
1067
         0,                      /* rightshift */
1068
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1069
         16,                    /* bitsize */
1070
         FALSE,                 /* pc_relative */
1071
         0,                      /* bitpos */
1072
         complain_overflow_signed, /* complain_on_overflow */
1073
         _bfd_mips_elf_generic_reloc,   /* special_function */
1074
         "R_MIPS_GOT_DISP",     /* name */
1075
         FALSE,                 /* partial_inplace */
1076
         0,                      /* src_mask */
1077
         0x0000ffff,            /* dst_mask */
1078
         FALSE),                /* pcrel_offset */
1079
 
1080
  /* Displacement to page pointer in the global offset table.  */
1081
  HOWTO (R_MIPS_GOT_PAGE,       /* type */
1082
         0,                      /* rightshift */
1083
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1084
         16,                    /* bitsize */
1085
         FALSE,                 /* pc_relative */
1086
         0,                      /* bitpos */
1087
         complain_overflow_signed, /* complain_on_overflow */
1088
         _bfd_mips_elf_generic_reloc,   /* special_function */
1089
         "R_MIPS_GOT_PAGE",     /* name */
1090
         FALSE,                 /* partial_inplace */
1091
         0,                      /* src_mask */
1092
         0x0000ffff,            /* dst_mask */
1093
         FALSE),                /* pcrel_offset */
1094
 
1095
  /* Offset from page pointer in the global offset table.  */
1096
  HOWTO (R_MIPS_GOT_OFST,       /* type */
1097
         0,                      /* rightshift */
1098
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1099
         16,                    /* bitsize */
1100
         FALSE,                 /* pc_relative */
1101
         0,                      /* bitpos */
1102
         complain_overflow_signed, /* complain_on_overflow */
1103
         _bfd_mips_elf_generic_reloc,   /* special_function */
1104
         "R_MIPS_GOT_OFST",     /* name */
1105
         FALSE,                 /* partial_inplace */
1106
         0,                      /* src_mask */
1107
         0x0000ffff,            /* dst_mask */
1108
         FALSE),                /* pcrel_offset */
1109
 
1110
  /* High 16 bits of displacement in global offset table.  */
1111
  HOWTO (R_MIPS_GOT_HI16,       /* type */
1112
         0,                      /* rightshift */
1113
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1114
         16,                    /* bitsize */
1115
         FALSE,                 /* pc_relative */
1116
         0,                      /* bitpos */
1117
         complain_overflow_dont, /* complain_on_overflow */
1118
         _bfd_mips_elf_generic_reloc,   /* special_function */
1119
         "R_MIPS_GOT_HI16",     /* name */
1120
         FALSE,                 /* partial_inplace */
1121
         0,                      /* src_mask */
1122
         0x0000ffff,            /* dst_mask */
1123
         FALSE),                /* pcrel_offset */
1124
 
1125
  /* Low 16 bits of displacement in global offset table.  */
1126
  HOWTO (R_MIPS_GOT_LO16,       /* type */
1127
         0,                      /* rightshift */
1128
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1129
         16,                    /* bitsize */
1130
         FALSE,                 /* pc_relative */
1131
         0,                      /* bitpos */
1132
         complain_overflow_dont, /* complain_on_overflow */
1133
         _bfd_mips_elf_generic_reloc,   /* special_function */
1134
         "R_MIPS_GOT_LO16",     /* name */
1135
         FALSE,                 /* partial_inplace */
1136
         0,                      /* src_mask */
1137
         0x0000ffff,            /* dst_mask */
1138
         FALSE),                /* pcrel_offset */
1139
 
1140
  /* 64 bit subtraction.  */
1141
  HOWTO (R_MIPS_SUB,            /* type */
1142
         0,                      /* rightshift */
1143
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1144
         64,                    /* bitsize */
1145
         FALSE,                 /* pc_relative */
1146
         0,                      /* bitpos */
1147
         complain_overflow_dont, /* complain_on_overflow */
1148
         _bfd_mips_elf_generic_reloc,   /* special_function */
1149
         "R_MIPS_SUB",          /* name */
1150
         FALSE,                 /* partial_inplace */
1151
         0,                      /* src_mask */
1152
         MINUS_ONE,             /* dst_mask */
1153
         FALSE),                /* pcrel_offset */
1154
 
1155
  /* Insert the addend as an instruction.  */
1156
  /* FIXME: Not handled correctly.  */
1157
  HOWTO (R_MIPS_INSERT_A,       /* type */
1158
         0,                      /* rightshift */
1159
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1160
         32,                    /* bitsize */
1161
         FALSE,                 /* pc_relative */
1162
         0,                      /* bitpos */
1163
         complain_overflow_dont, /* complain_on_overflow */
1164
         _bfd_mips_elf_generic_reloc,   /* special_function */
1165
         "R_MIPS_INSERT_A",     /* name */
1166
         FALSE,                 /* partial_inplace */
1167
         0,                      /* src_mask */
1168
         0xffffffff,            /* dst_mask */
1169
         FALSE),                /* pcrel_offset */
1170
 
1171
  /* Insert the addend as an instruction, and change all relocations
1172
     to refer to the old instruction at the address.  */
1173
  /* FIXME: Not handled correctly.  */
1174
  HOWTO (R_MIPS_INSERT_B,       /* type */
1175
         0,                      /* rightshift */
1176
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1177
         32,                    /* bitsize */
1178
         FALSE,                 /* pc_relative */
1179
         0,                      /* bitpos */
1180
         complain_overflow_dont, /* complain_on_overflow */
1181
         _bfd_mips_elf_generic_reloc,   /* special_function */
1182
         "R_MIPS_INSERT_B",     /* name */
1183
         FALSE,                 /* partial_inplace */
1184
         0,                      /* src_mask */
1185
         0xffffffff,            /* dst_mask */
1186
         FALSE),                /* pcrel_offset */
1187
 
1188
  /* Delete a 32 bit instruction.  */
1189
  /* FIXME: Not handled correctly.  */
1190
  HOWTO (R_MIPS_DELETE,         /* type */
1191
         0,                      /* rightshift */
1192
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1193
         32,                    /* bitsize */
1194
         FALSE,                 /* pc_relative */
1195
         0,                      /* bitpos */
1196
         complain_overflow_dont, /* complain_on_overflow */
1197
         _bfd_mips_elf_generic_reloc,   /* special_function */
1198
         "R_MIPS_DELETE",       /* name */
1199
         FALSE,                 /* partial_inplace */
1200
         0,                      /* src_mask */
1201
         0xffffffff,            /* dst_mask */
1202
         FALSE),                /* pcrel_offset */
1203
 
1204
  /* Get the higher value of a 64 bit addend.  */
1205
  HOWTO (R_MIPS_HIGHER,         /* type */
1206
         0,                      /* rightshift */
1207
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1208
         16,                    /* bitsize */
1209
         FALSE,                 /* pc_relative */
1210
         0,                      /* bitpos */
1211
         complain_overflow_dont, /* complain_on_overflow */
1212
         _bfd_mips_elf_generic_reloc, /* special_function */
1213
         "R_MIPS_HIGHER",       /* name */
1214
         FALSE,                 /* partial_inplace */
1215
         0,                      /* src_mask */
1216
         0x0000ffff,            /* dst_mask */
1217
         FALSE),                /* pcrel_offset */
1218
 
1219
  /* Get the highest value of a 64 bit addend.  */
1220
  HOWTO (R_MIPS_HIGHEST,        /* type */
1221
         0,                      /* rightshift */
1222
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1223
         16,                    /* bitsize */
1224
         FALSE,                 /* pc_relative */
1225
         0,                      /* bitpos */
1226
         complain_overflow_dont, /* complain_on_overflow */
1227
         _bfd_mips_elf_generic_reloc, /* special_function */
1228
         "R_MIPS_HIGHEST",      /* name */
1229
         FALSE,                 /* partial_inplace */
1230
         0,                      /* src_mask */
1231
         0x0000ffff,            /* dst_mask */
1232
         FALSE),                /* pcrel_offset */
1233
 
1234
  /* High 16 bits of displacement in global offset table.  */
1235
  HOWTO (R_MIPS_CALL_HI16,      /* type */
1236
         0,                      /* rightshift */
1237
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1238
         16,                    /* bitsize */
1239
         FALSE,                 /* pc_relative */
1240
         0,                      /* bitpos */
1241
         complain_overflow_dont, /* complain_on_overflow */
1242
         _bfd_mips_elf_generic_reloc,   /* special_function */
1243
         "R_MIPS_CALL_HI16",    /* name */
1244
         FALSE,                 /* partial_inplace */
1245
         0,                      /* src_mask */
1246
         0x0000ffff,            /* dst_mask */
1247
         FALSE),                /* pcrel_offset */
1248
 
1249
  /* Low 16 bits of displacement in global offset table.  */
1250
  HOWTO (R_MIPS_CALL_LO16,      /* type */
1251
         0,                      /* rightshift */
1252
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1253
         16,                    /* bitsize */
1254
         FALSE,                 /* pc_relative */
1255
         0,                      /* bitpos */
1256
         complain_overflow_dont, /* complain_on_overflow */
1257
         _bfd_mips_elf_generic_reloc,   /* special_function */
1258
         "R_MIPS_CALL_LO16",    /* name */
1259
         FALSE,                 /* partial_inplace */
1260
         0,                      /* src_mask */
1261
         0x0000ffff,            /* dst_mask */
1262
         FALSE),                /* pcrel_offset */
1263
 
1264
  /* Section displacement, used by an associated event location section.  */
1265
  HOWTO (R_MIPS_SCN_DISP,       /* type */
1266
         0,                      /* rightshift */
1267
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1268
         32,                    /* bitsize */
1269
         FALSE,                 /* pc_relative */
1270
         0,                      /* bitpos */
1271
         complain_overflow_dont, /* complain_on_overflow */
1272
         _bfd_mips_elf_generic_reloc,   /* special_function */
1273
         "R_MIPS_SCN_DISP",     /* name */
1274
         FALSE,                 /* partial_inplace */
1275
         0,                      /* src_mask */
1276
         0xffffffff,            /* dst_mask */
1277
         FALSE),                /* pcrel_offset */
1278
 
1279
  HOWTO (R_MIPS_REL16,          /* type */
1280
         0,                      /* rightshift */
1281
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1282
         16,                    /* bitsize */
1283
         FALSE,                 /* pc_relative */
1284
         0,                      /* bitpos */
1285
         complain_overflow_signed, /* complain_on_overflow */
1286
         _bfd_mips_elf_generic_reloc,   /* special_function */
1287
         "R_MIPS_REL16",        /* name */
1288
         FALSE,                 /* partial_inplace */
1289
         0,                      /* src_mask */
1290
         0xffff,                /* dst_mask */
1291
         FALSE),                /* pcrel_offset */
1292
 
1293
  /* These two are obsolete.  */
1294
  EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
1295
  EMPTY_HOWTO (R_MIPS_PJUMP),
1296
 
1297
  /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
1298
     It must be used for multigot GOT's (and only there).  */
1299
  HOWTO (R_MIPS_RELGOT,         /* type */
1300
         0,                      /* rightshift */
1301
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1302
         32,                    /* bitsize */
1303
         FALSE,                 /* pc_relative */
1304
         0,                      /* bitpos */
1305
         complain_overflow_dont, /* complain_on_overflow */
1306
         _bfd_mips_elf_generic_reloc,   /* special_function */
1307
         "R_MIPS_RELGOT",       /* name */
1308
         FALSE,                 /* partial_inplace */
1309
         0,                      /* src_mask */
1310
         0xffffffff,            /* dst_mask */
1311
         FALSE),                /* pcrel_offset */
1312
 
1313
  /* Protected jump conversion.  This is an optimization hint.  No
1314
     relocation is required for correctness.  */
1315
  HOWTO (R_MIPS_JALR,           /* type */
1316
         0,                      /* rightshift */
1317
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1318
         32,                    /* bitsize */
1319
         FALSE,                 /* pc_relative */
1320
         0,                      /* bitpos */
1321
         complain_overflow_dont, /* complain_on_overflow */
1322
         _bfd_mips_elf_generic_reloc,   /* special_function */
1323
         "R_MIPS_JALR",         /* name */
1324
         FALSE,                 /* partial_inplace */
1325
         0,                      /* src_mask */
1326
         0x00000000,            /* dst_mask */
1327
         FALSE),                /* pcrel_offset */
1328
 
1329
  /* TLS relocations.  */
1330
  EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
1331
  EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
1332
 
1333
  HOWTO (R_MIPS_TLS_DTPMOD64,   /* type */
1334
         0,                      /* rightshift */
1335
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1336
         64,                    /* bitsize */
1337
         FALSE,                 /* pc_relative */
1338
         0,                      /* bitpos */
1339
         complain_overflow_dont, /* complain_on_overflow */
1340
         _bfd_mips_elf_generic_reloc, /* special_function */
1341
         "R_MIPS_TLS_DTPMOD64", /* name */
1342
         FALSE,                 /* partial_inplace */
1343
         MINUS_ONE,             /* src_mask */
1344
         MINUS_ONE,             /* dst_mask */
1345
         FALSE),                /* pcrel_offset */
1346
 
1347
  HOWTO (R_MIPS_TLS_DTPREL64,   /* type */
1348
         0,                      /* rightshift */
1349
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1350
         64,                    /* bitsize */
1351
         FALSE,                 /* pc_relative */
1352
         0,                      /* bitpos */
1353
         complain_overflow_dont, /* complain_on_overflow */
1354
         _bfd_mips_elf_generic_reloc, /* special_function */
1355
         "R_MIPS_TLS_DTPREL64", /* name */
1356
         FALSE,                 /* partial_inplace */
1357
         MINUS_ONE,             /* src_mask */
1358
         MINUS_ONE,             /* dst_mask */
1359
         FALSE),                /* pcrel_offset */
1360
 
1361
  /* TLS general dynamic variable reference.  */
1362
  HOWTO (R_MIPS_TLS_GD,         /* type */
1363
         0,                      /* rightshift */
1364
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1365
         16,                    /* bitsize */
1366
         FALSE,                 /* pc_relative */
1367
         0,                      /* bitpos */
1368
         complain_overflow_signed, /* complain_on_overflow */
1369
         _bfd_mips_elf_generic_reloc, /* special_function */
1370
         "R_MIPS_TLS_GD",       /* name */
1371
         FALSE,                 /* partial_inplace */
1372
         0x0000ffff,            /* src_mask */
1373
         0x0000ffff,            /* dst_mask */
1374
         FALSE),                /* pcrel_offset */
1375
 
1376
  /* TLS local dynamic variable reference.  */
1377
  HOWTO (R_MIPS_TLS_LDM,        /* type */
1378
         0,                      /* rightshift */
1379
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1380
         16,                    /* bitsize */
1381
         FALSE,                 /* pc_relative */
1382
         0,                      /* bitpos */
1383
         complain_overflow_signed, /* complain_on_overflow */
1384
         _bfd_mips_elf_generic_reloc, /* special_function */
1385
         "R_MIPS_TLS_LDM",      /* name */
1386
         FALSE,                 /* partial_inplace */
1387
         0x0000ffff,            /* src_mask */
1388
         0x0000ffff,            /* dst_mask */
1389
         FALSE),                /* pcrel_offset */
1390
 
1391
  /* TLS local dynamic offset.  */
1392
  HOWTO (R_MIPS_TLS_DTPREL_HI16,        /* type */
1393
         0,                      /* rightshift */
1394
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1395
         16,                    /* bitsize */
1396
         FALSE,                 /* pc_relative */
1397
         0,                      /* bitpos */
1398
         complain_overflow_signed, /* complain_on_overflow */
1399
         _bfd_mips_elf_generic_reloc, /* special_function */
1400
         "R_MIPS_TLS_DTPREL_HI16",      /* name */
1401
         FALSE,                 /* partial_inplace */
1402
         0x0000ffff,            /* src_mask */
1403
         0x0000ffff,            /* dst_mask */
1404
         FALSE),                /* pcrel_offset */
1405
 
1406
  /* TLS local dynamic offset.  */
1407
  HOWTO (R_MIPS_TLS_DTPREL_LO16,        /* type */
1408
         0,                      /* rightshift */
1409
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1410
         16,                    /* bitsize */
1411
         FALSE,                 /* pc_relative */
1412
         0,                      /* bitpos */
1413
         complain_overflow_signed, /* complain_on_overflow */
1414
         _bfd_mips_elf_generic_reloc, /* special_function */
1415
         "R_MIPS_TLS_DTPREL_LO16",      /* name */
1416
         FALSE,                 /* partial_inplace */
1417
         0x0000ffff,            /* src_mask */
1418
         0x0000ffff,            /* dst_mask */
1419
         FALSE),                /* pcrel_offset */
1420
 
1421
  /* TLS thread pointer offset.  */
1422
  HOWTO (R_MIPS_TLS_GOTTPREL,   /* type */
1423
         0,                      /* rightshift */
1424
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1425
         16,                    /* bitsize */
1426
         FALSE,                 /* pc_relative */
1427
         0,                      /* bitpos */
1428
         complain_overflow_signed, /* complain_on_overflow */
1429
         _bfd_mips_elf_generic_reloc, /* special_function */
1430
         "R_MIPS_TLS_GOTTPREL", /* name */
1431
         FALSE,                 /* partial_inplace */
1432
         0x0000ffff,            /* src_mask */
1433
         0x0000ffff,            /* dst_mask */
1434
         FALSE),                /* pcrel_offset */
1435
 
1436
  /* TLS IE dynamic relocations.  */
1437
  EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
1438
 
1439
  HOWTO (R_MIPS_TLS_TPREL64,    /* type */
1440
         0,                      /* rightshift */
1441
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1442
         64,                    /* bitsize */
1443
         FALSE,                 /* pc_relative */
1444
         0,                      /* bitpos */
1445
         complain_overflow_dont, /* complain_on_overflow */
1446
         _bfd_mips_elf_generic_reloc, /* special_function */
1447
         "R_MIPS_TLS_TPREL64",  /* name */
1448
         FALSE,                 /* partial_inplace */
1449
         MINUS_ONE,             /* src_mask */
1450
         MINUS_ONE,             /* dst_mask */
1451
         FALSE),                /* pcrel_offset */
1452
 
1453
  /* TLS thread pointer offset.  */
1454
  HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
1455
         0,                      /* rightshift */
1456
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1457
         16,                    /* bitsize */
1458
         FALSE,                 /* pc_relative */
1459
         0,                      /* bitpos */
1460
         complain_overflow_signed, /* complain_on_overflow */
1461
         _bfd_mips_elf_generic_reloc, /* special_function */
1462
         "R_MIPS_TLS_TPREL_HI16", /* name */
1463
         FALSE,                 /* partial_inplace */
1464
         0x0000ffff,            /* src_mask */
1465
         0x0000ffff,            /* dst_mask */
1466
         FALSE),                /* pcrel_offset */
1467
 
1468
  /* TLS thread pointer offset.  */
1469
  HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
1470
         0,                      /* rightshift */
1471
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1472
         16,                    /* bitsize */
1473
         FALSE,                 /* pc_relative */
1474
         0,                      /* bitpos */
1475
         complain_overflow_signed, /* complain_on_overflow */
1476
         _bfd_mips_elf_generic_reloc, /* special_function */
1477
         "R_MIPS_TLS_TPREL_LO16", /* name */
1478
         FALSE,                 /* partial_inplace */
1479
         0x0000ffff,            /* src_mask */
1480
         0x0000ffff,            /* dst_mask */
1481
         FALSE),                /* pcrel_offset */
1482
 
1483
  /* 32 bit relocation with no addend.  */
1484
  HOWTO (R_MIPS_GLOB_DAT,       /* type */
1485
         0,                      /* rightshift */
1486
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1487
         32,                    /* bitsize */
1488
         FALSE,                 /* pc_relative */
1489
         0,                      /* bitpos */
1490
         complain_overflow_dont, /* complain_on_overflow */
1491
         _bfd_mips_elf_generic_reloc, /* special_function */
1492
         "R_MIPS_GLOB_DAT",     /* name */
1493
         FALSE,                 /* partial_inplace */
1494
         0x0,                   /* src_mask */
1495
         0xffffffff,            /* dst_mask */
1496
         FALSE),                /* pcrel_offset */
1497
};
1498
 
1499
static reloc_howto_type mips16_elf64_howto_table_rel[] =
1500
{
1501
  /* The reloc used for the mips16 jump instruction.  */
1502
  HOWTO (R_MIPS16_26,           /* type */
1503
         2,                     /* rightshift */
1504
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1505
         26,                    /* bitsize */
1506
         FALSE,                 /* pc_relative */
1507
         0,                      /* bitpos */
1508
         complain_overflow_dont, /* complain_on_overflow */
1509
                                /* This needs complex overflow
1510
                                   detection, because the upper four
1511
                                   bits must match the PC.  */
1512
         _bfd_mips_elf_generic_reloc, /* special_function */
1513
         "R_MIPS16_26",         /* name */
1514
         TRUE,                  /* partial_inplace */
1515
         0x3ffffff,             /* src_mask */
1516
         0x3ffffff,             /* dst_mask */
1517
         FALSE),                /* pcrel_offset */
1518
 
1519
  /* The reloc used for the mips16 gprel instruction.  */
1520
  HOWTO (R_MIPS16_GPREL,        /* type */
1521
         0,                      /* rightshift */
1522
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1523
         16,                    /* bitsize */
1524
         FALSE,                 /* pc_relative */
1525
         0,                      /* bitpos */
1526
         complain_overflow_signed, /* complain_on_overflow */
1527
         mips16_gprel_reloc,    /* special_function */
1528
         "R_MIPS16_GPREL",      /* name */
1529
         TRUE,                  /* partial_inplace */
1530
         0x0000ffff,            /* src_mask */
1531
         0x0000ffff,            /* dst_mask */
1532
         FALSE),                /* pcrel_offset */
1533
 
1534
  /* A MIPS16 reference to the global offset table.  */
1535
  HOWTO (R_MIPS16_GOT16,        /* type */
1536
         0,                      /* rightshift */
1537
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1538
         16,                    /* bitsize */
1539
         FALSE,                 /* pc_relative */
1540
         0,                      /* bitpos */
1541
         complain_overflow_dont, /* complain_on_overflow */
1542
         _bfd_mips_elf_got16_reloc, /* special_function */
1543
         "R_MIPS16_GOT16",      /* name */
1544
         TRUE,                  /* partial_inplace */
1545
         0x0000ffff,            /* src_mask */
1546
         0x0000ffff,            /* dst_mask */
1547
         FALSE),                /* pcrel_offset */
1548
 
1549
  /* A MIPS16 call through the global offset table.  */
1550
  HOWTO (R_MIPS16_CALL16,       /* type */
1551
         0,                      /* rightshift */
1552
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1553
         16,                    /* bitsize */
1554
         FALSE,                 /* pc_relative */
1555
         0,                      /* bitpos */
1556
         complain_overflow_dont, /* complain_on_overflow */
1557
         _bfd_mips_elf_generic_reloc, /* special_function */
1558
         "R_MIPS16_CALL16",     /* name */
1559
         TRUE,                  /* partial_inplace */
1560
         0x0000ffff,            /* src_mask */
1561
         0x0000ffff,            /* dst_mask */
1562
         FALSE),                /* pcrel_offset */
1563
 
1564
  /* MIPS16 high 16 bits of symbol value.  */
1565
  HOWTO (R_MIPS16_HI16,         /* type */
1566
         16,                    /* rightshift */
1567
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1568
         16,                    /* bitsize */
1569
         FALSE,                 /* pc_relative */
1570
         0,                      /* bitpos */
1571
         complain_overflow_dont, /* complain_on_overflow */
1572
         _bfd_mips_elf_hi16_reloc, /* special_function */
1573
         "R_MIPS16_HI16",       /* name */
1574
         TRUE,                  /* partial_inplace */
1575
         0x0000ffff,            /* src_mask */
1576
         0x0000ffff,            /* dst_mask */
1577
         FALSE),                /* pcrel_offset */
1578
 
1579
  /* MIPS16 low 16 bits of symbol value.  */
1580
  HOWTO (R_MIPS16_LO16,         /* type */
1581
         0,                      /* rightshift */
1582
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1583
         16,                    /* bitsize */
1584
         FALSE,                 /* pc_relative */
1585
         0,                      /* bitpos */
1586
         complain_overflow_dont, /* complain_on_overflow */
1587
         _bfd_mips_elf_lo16_reloc, /* special_function */
1588
         "R_MIPS16_LO16",       /* name */
1589
         TRUE,                  /* partial_inplace */
1590
         0x0000ffff,            /* src_mask */
1591
         0x0000ffff,            /* dst_mask */
1592
         FALSE),                /* pcrel_offset */
1593
};
1594
 
1595
static reloc_howto_type mips16_elf64_howto_table_rela[] =
1596
{
1597
  /* The reloc used for the mips16 jump instruction.  */
1598
  HOWTO (R_MIPS16_26,           /* type */
1599
         2,                     /* rightshift */
1600
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1601
         26,                    /* bitsize */
1602
         FALSE,                 /* pc_relative */
1603
         0,                      /* bitpos */
1604
         complain_overflow_dont, /* complain_on_overflow */
1605
                                /* This needs complex overflow
1606
                                   detection, because the upper four
1607
                                   bits must match the PC.  */
1608
         _bfd_mips_elf_generic_reloc, /* special_function */
1609
         "R_MIPS16_26",         /* name */
1610
         FALSE,                 /* partial_inplace */
1611
         0x3ffffff,             /* src_mask */
1612
         0x3ffffff,             /* dst_mask */
1613
         FALSE),                /* pcrel_offset */
1614
 
1615
  /* The reloc used for the mips16 gprel instruction.  */
1616
  HOWTO (R_MIPS16_GPREL,        /* type */
1617
         0,                      /* rightshift */
1618
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1619
         16,                    /* bitsize */
1620
         FALSE,                 /* pc_relative */
1621
         0,                      /* bitpos */
1622
         complain_overflow_signed, /* complain_on_overflow */
1623
         mips16_gprel_reloc,    /* special_function */
1624
         "R_MIPS16_GPREL",      /* name */
1625
         FALSE,                 /* partial_inplace */
1626
         0x0000ffff,            /* src_mask */
1627
         0x0000ffff,            /* dst_mask */
1628
         FALSE),                /* pcrel_offset */
1629
 
1630
  /* A MIPS16 reference to the global offset table.  */
1631
  HOWTO (R_MIPS16_GOT16,        /* type */
1632
         0,                      /* rightshift */
1633
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1634
         16,                    /* bitsize */
1635
         FALSE,                 /* pc_relative */
1636
         0,                      /* bitpos */
1637
         complain_overflow_dont, /* complain_on_overflow */
1638
         _bfd_mips_elf_got16_reloc, /* special_function */
1639
         "R_MIPS16_GOT16",      /* name */
1640
         FALSE,                 /* partial_inplace */
1641
         0x0000ffff,            /* src_mask */
1642
         0x0000ffff,            /* dst_mask */
1643
         FALSE),                /* pcrel_offset */
1644
 
1645
  /* A MIPS16 call through the global offset table.  */
1646
  HOWTO (R_MIPS16_CALL16,       /* type */
1647
         0,                      /* rightshift */
1648
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1649
         16,                    /* bitsize */
1650
         FALSE,                 /* pc_relative */
1651
         0,                      /* bitpos */
1652
         complain_overflow_dont, /* complain_on_overflow */
1653
         _bfd_mips_elf_generic_reloc, /* special_function */
1654
         "R_MIPS16_CALL16",     /* name */
1655
         FALSE,                 /* partial_inplace */
1656
         0x0000ffff,            /* src_mask */
1657
         0x0000ffff,            /* dst_mask */
1658
         FALSE),                /* pcrel_offset */
1659
 
1660
  /* MIPS16 high 16 bits of symbol value.  */
1661
  HOWTO (R_MIPS16_HI16,         /* type */
1662
         16,                    /* rightshift */
1663
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1664
         16,                    /* bitsize */
1665
         FALSE,                 /* pc_relative */
1666
         0,                      /* bitpos */
1667
         complain_overflow_dont, /* complain_on_overflow */
1668
         _bfd_mips_elf_hi16_reloc, /* special_function */
1669
         "R_MIPS16_HI16",       /* name */
1670
         FALSE,                 /* partial_inplace */
1671
         0x0000ffff,            /* src_mask */
1672
         0x0000ffff,            /* dst_mask */
1673
         FALSE),                /* pcrel_offset */
1674
 
1675
  /* MIPS16 low 16 bits of symbol value.  */
1676
  HOWTO (R_MIPS16_LO16,         /* type */
1677
         0,                      /* rightshift */
1678
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1679
         16,                    /* bitsize */
1680
         FALSE,                 /* pc_relative */
1681
         0,                      /* bitpos */
1682
         complain_overflow_dont, /* complain_on_overflow */
1683
         _bfd_mips_elf_lo16_reloc, /* special_function */
1684
         "R_MIPS16_LO16",       /* name */
1685
         FALSE,                 /* partial_inplace */
1686
         0x0000ffff,            /* src_mask */
1687
         0x0000ffff,            /* dst_mask */
1688
         FALSE),                /* pcrel_offset */
1689
};
1690
 
1691 161 khays
static reloc_howto_type micromips_elf64_howto_table_rel[] =
1692
{
1693
  EMPTY_HOWTO (130),
1694
  EMPTY_HOWTO (131),
1695
  EMPTY_HOWTO (132),
1696
 
1697
  /* 26 bit jump address.  */
1698
  HOWTO (R_MICROMIPS_26_S1,     /* type */
1699
         1,                     /* rightshift */
1700
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1701
         26,                    /* bitsize */
1702
         FALSE,                 /* pc_relative */
1703
         0,                      /* bitpos */
1704
         complain_overflow_dont, /* complain_on_overflow */
1705
                                /* This needs complex overflow
1706
                                   detection, because the upper four
1707
                                   bits must match the PC.  */
1708
         _bfd_mips_elf_generic_reloc, /* special_function */
1709
         "R_MICROMIPS_26_S1",   /* name */
1710
         TRUE,                  /* partial_inplace */
1711
         0x3ffffff,             /* src_mask */
1712
         0x3ffffff,             /* dst_mask */
1713
         FALSE),                /* pcrel_offset */
1714
 
1715
  /* High 16 bits of symbol value.  */
1716
  HOWTO (R_MICROMIPS_HI16,      /* type */
1717
         16,                    /* rightshift */
1718
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1719
         16,                    /* bitsize */
1720
         FALSE,                 /* pc_relative */
1721
         0,                      /* bitpos */
1722
         complain_overflow_dont, /* complain_on_overflow */
1723
         _bfd_mips_elf_hi16_reloc, /* special_function */
1724
         "R_MICROMIPS_HI16",    /* name */
1725
         TRUE,                  /* partial_inplace */
1726
         0x0000ffff,            /* src_mask */
1727
         0x0000ffff,            /* dst_mask */
1728
         FALSE),                /* pcrel_offset */
1729
 
1730
  /* Low 16 bits of symbol value.  */
1731
  HOWTO (R_MICROMIPS_LO16,      /* type */
1732
         0,                      /* rightshift */
1733
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1734
         16,                    /* bitsize */
1735
         FALSE,                 /* pc_relative */
1736
         0,                      /* bitpos */
1737
         complain_overflow_dont, /* complain_on_overflow */
1738
         _bfd_mips_elf_lo16_reloc, /* special_function */
1739
         "R_MICROMIPS_LO16",    /* name */
1740
         TRUE,                  /* partial_inplace */
1741
         0x0000ffff,            /* src_mask */
1742
         0x0000ffff,            /* dst_mask */
1743
         FALSE),                /* pcrel_offset */
1744
 
1745
  /* GP relative reference.  */
1746
  HOWTO (R_MICROMIPS_GPREL16,   /* type */
1747
         0,                      /* rightshift */
1748
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1749
         16,                    /* bitsize */
1750
         FALSE,                 /* pc_relative */
1751
         0,                      /* bitpos */
1752
         complain_overflow_signed, /* complain_on_overflow */
1753
         _bfd_mips_elf32_gprel16_reloc, /* special_function */
1754
         "R_MICROMIPS_GPREL16", /* name */
1755
         TRUE,                  /* partial_inplace */
1756
         0x0000ffff,            /* src_mask */
1757
         0x0000ffff,            /* dst_mask */
1758
         FALSE),                /* pcrel_offset */
1759
 
1760
  /* Reference to literal section.  */
1761
  HOWTO (R_MICROMIPS_LITERAL,   /* type */
1762
         0,                      /* rightshift */
1763
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1764
         16,                    /* bitsize */
1765
         FALSE,                 /* pc_relative */
1766
         0,                      /* bitpos */
1767
         complain_overflow_signed, /* complain_on_overflow */
1768
         _bfd_mips_elf32_gprel16_reloc, /* special_function */
1769
         "R_MICROMIPS_LITERAL", /* name */
1770
         TRUE,                  /* partial_inplace */
1771
         0x0000ffff,            /* src_mask */
1772
         0x0000ffff,            /* dst_mask */
1773
         FALSE),                /* pcrel_offset */
1774
 
1775
  /* Reference to global offset table.  */
1776
  HOWTO (R_MICROMIPS_GOT16,     /* type */
1777
         0,                      /* rightshift */
1778
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1779
         16,                    /* bitsize */
1780
         FALSE,                 /* pc_relative */
1781
         0,                      /* bitpos */
1782
         complain_overflow_signed, /* complain_on_overflow */
1783
         _bfd_mips_elf_got16_reloc, /* special_function */
1784
         "R_MICROMIPS_GOT16",   /* name */
1785
         TRUE,                  /* partial_inplace */
1786
         0x0000ffff,            /* src_mask */
1787
         0x0000ffff,            /* dst_mask */
1788
         FALSE),                /* pcrel_offset */
1789
 
1790
  /* This is for microMIPS branches.  */
1791
  HOWTO (R_MICROMIPS_PC7_S1,    /* type */
1792
         1,                     /* rightshift */
1793
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1794
         7,                     /* bitsize */
1795
         TRUE,                  /* pc_relative */
1796
         0,                      /* bitpos */
1797
         complain_overflow_signed, /* complain_on_overflow */
1798
         _bfd_mips_elf_generic_reloc, /* special_function */
1799
         "R_MICROMIPS_PC7_S1",  /* name */
1800
         TRUE,                  /* partial_inplace */
1801
         0x0000007f,            /* src_mask */
1802
         0x0000007f,            /* dst_mask */
1803
         TRUE),                 /* pcrel_offset */
1804
 
1805
  HOWTO (R_MICROMIPS_PC10_S1,   /* type */
1806
         1,                     /* rightshift */
1807
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1808
         10,                    /* bitsize */
1809
         TRUE,                  /* pc_relative */
1810
         0,                      /* bitpos */
1811
         complain_overflow_signed, /* complain_on_overflow */
1812
         _bfd_mips_elf_generic_reloc, /* special_function */
1813
         "R_MICROMIPS_PC10_S1", /* name */
1814
         TRUE,                  /* partial_inplace */
1815
         0x000003ff,            /* src_mask */
1816
         0x000003ff,            /* dst_mask */
1817
         TRUE),                 /* pcrel_offset */
1818
 
1819
  HOWTO (R_MICROMIPS_PC16_S1,   /* type */
1820
         1,                     /* rightshift */
1821
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1822
         16,                    /* bitsize */
1823
         TRUE,                  /* pc_relative */
1824
         0,                      /* bitpos */
1825
         complain_overflow_signed, /* complain_on_overflow */
1826
         _bfd_mips_elf_generic_reloc, /* special_function */
1827
         "R_MICROMIPS_PC16_S1", /* name */
1828
         TRUE,                  /* partial_inplace */
1829
         0x0000ffff,            /* src_mask */
1830
         0x0000ffff,            /* dst_mask */
1831
         TRUE),                 /* pcrel_offset */
1832
 
1833
  /* 16 bit call through global offset table.  */
1834
  HOWTO (R_MICROMIPS_CALL16,    /* type */
1835
         0,                      /* rightshift */
1836
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1837
         16,                    /* bitsize */
1838
         FALSE,                 /* pc_relative */
1839
         0,                      /* bitpos */
1840
         complain_overflow_signed, /* complain_on_overflow */
1841
         _bfd_mips_elf_generic_reloc, /* special_function */
1842
         "R_MICROMIPS_CALL16",  /* name */
1843
         TRUE,                  /* partial_inplace */
1844
         0x0000ffff,            /* src_mask */
1845
         0x0000ffff,            /* dst_mask */
1846
         FALSE),                /* pcrel_offset */
1847
 
1848
  EMPTY_HOWTO (143),
1849
  EMPTY_HOWTO (144),
1850
 
1851
  /* Displacement in the global offset table.  */
1852
  HOWTO (R_MICROMIPS_GOT_DISP,  /* type */
1853
         0,                      /* rightshift */
1854
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1855
         16,                    /* bitsize */
1856
         FALSE,                 /* pc_relative */
1857
         0,                      /* bitpos */
1858
         complain_overflow_signed, /* complain_on_overflow */
1859
         _bfd_mips_elf_generic_reloc, /* special_function */
1860
         "R_MICROMIPS_GOT_DISP",/* name */
1861
         TRUE,                  /* partial_inplace */
1862
         0x0000ffff,            /* src_mask */
1863
         0x0000ffff,            /* dst_mask */
1864
         FALSE),                /* pcrel_offset */
1865
 
1866
  /* Displacement to page pointer in the global offset table.  */
1867
  HOWTO (R_MICROMIPS_GOT_PAGE,  /* type */
1868
         0,                      /* rightshift */
1869
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1870
         16,                    /* bitsize */
1871
         FALSE,                 /* pc_relative */
1872
         0,                      /* bitpos */
1873
         complain_overflow_signed, /* complain_on_overflow */
1874
         _bfd_mips_elf_generic_reloc, /* special_function */
1875
         "R_MICROMIPS_GOT_PAGE",/* name */
1876
         TRUE,                  /* partial_inplace */
1877
         0x0000ffff,            /* src_mask */
1878
         0x0000ffff,            /* dst_mask */
1879
         FALSE),                /* pcrel_offset */
1880
 
1881
  /* Offset from page pointer in the global offset table.  */
1882
  HOWTO (R_MICROMIPS_GOT_OFST,  /* type */
1883
         0,                      /* rightshift */
1884
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1885
         16,                    /* bitsize */
1886
         FALSE,                 /* pc_relative */
1887
         0,                      /* bitpos */
1888
         complain_overflow_signed, /* complain_on_overflow */
1889
         _bfd_mips_elf_generic_reloc, /* special_function */
1890
         "R_MICROMIPS_GOT_OFST",/* name */
1891
         TRUE,                  /* partial_inplace */
1892
         0x0000ffff,            /* src_mask */
1893
         0x0000ffff,            /* dst_mask */
1894
         FALSE),                /* pcrel_offset */
1895
 
1896
  /* High 16 bits of displacement in global offset table.  */
1897
  HOWTO (R_MICROMIPS_GOT_HI16,  /* type */
1898
         0,                      /* rightshift */
1899
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1900
         16,                    /* bitsize */
1901
         FALSE,                 /* pc_relative */
1902
         0,                      /* bitpos */
1903
         complain_overflow_dont, /* complain_on_overflow */
1904
         _bfd_mips_elf_generic_reloc, /* special_function */
1905
         "R_MICROMIPS_GOT_HI16",/* name */
1906
         TRUE,                  /* partial_inplace */
1907
         0x0000ffff,            /* src_mask */
1908
         0x0000ffff,            /* dst_mask */
1909
         FALSE),                /* pcrel_offset */
1910
 
1911
  /* Low 16 bits of displacement in global offset table.  */
1912
  HOWTO (R_MICROMIPS_GOT_LO16,  /* type */
1913
         0,                      /* rightshift */
1914
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1915
         16,                    /* bitsize */
1916
         FALSE,                 /* pc_relative */
1917
         0,                      /* bitpos */
1918
         complain_overflow_dont, /* complain_on_overflow */
1919
         _bfd_mips_elf_generic_reloc, /* special_function */
1920
         "R_MICROMIPS_GOT_LO16",/* name */
1921
         TRUE,                  /* partial_inplace */
1922
         0x0000ffff,            /* src_mask */
1923
         0x0000ffff,            /* dst_mask */
1924
         FALSE),                /* pcrel_offset */
1925
 
1926
  /* 64 bit subtraction.  Used in the N32 ABI.  */
1927
  HOWTO (R_MICROMIPS_SUB,       /* type */
1928
         0,                      /* rightshift */
1929
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1930
         64,                    /* bitsize */
1931
         FALSE,                 /* pc_relative */
1932
         0,                      /* bitpos */
1933
         complain_overflow_dont, /* complain_on_overflow */
1934
         _bfd_mips_elf_generic_reloc, /* special_function */
1935
         "R_MICROMIPS_SUB",     /* name */
1936
         TRUE,                  /* partial_inplace */
1937
         MINUS_ONE,             /* src_mask */
1938
         MINUS_ONE,             /* dst_mask */
1939
         FALSE),                /* pcrel_offset */
1940
 
1941
  /* We don't support these for REL relocations, because it means building
1942
     the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
1943
     R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
1944
     using fallable heuristics.  */
1945
  EMPTY_HOWTO (R_MICROMIPS_HIGHER),
1946
  EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
1947
 
1948
  /* High 16 bits of displacement in global offset table.  */
1949
  HOWTO (R_MICROMIPS_CALL_HI16, /* type */
1950
         0,                      /* rightshift */
1951
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1952
         16,                    /* bitsize */
1953
         FALSE,                 /* pc_relative */
1954
         0,                      /* bitpos */
1955
         complain_overflow_dont, /* complain_on_overflow */
1956
         _bfd_mips_elf_generic_reloc, /* special_function */
1957
         "R_MICROMIPS_CALL_HI16",/* name */
1958
         TRUE,                  /* partial_inplace */
1959
         0x0000ffff,            /* src_mask */
1960
         0x0000ffff,            /* dst_mask */
1961
         FALSE),                /* pcrel_offset */
1962
 
1963
  /* Low 16 bits of displacement in global offset table.  */
1964
  HOWTO (R_MICROMIPS_CALL_LO16, /* type */
1965
         0,                      /* rightshift */
1966
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1967
         16,                    /* bitsize */
1968
         FALSE,                 /* pc_relative */
1969
         0,                      /* bitpos */
1970
         complain_overflow_dont, /* complain_on_overflow */
1971
         _bfd_mips_elf_generic_reloc, /* special_function */
1972
         "R_MICROMIPS_CALL_LO16",/* name */
1973
         TRUE,                  /* partial_inplace */
1974
         0x0000ffff,            /* src_mask */
1975
         0x0000ffff,            /* dst_mask */
1976
         FALSE),                /* pcrel_offset */
1977
};
1978
 
1979
static reloc_howto_type micromips_elf64_howto_table_rela[] =
1980
{
1981
  EMPTY_HOWTO (130),
1982
  EMPTY_HOWTO (131),
1983
  EMPTY_HOWTO (132),
1984
 
1985
  /* 26 bit jump address.  */
1986
  HOWTO (R_MICROMIPS_26_S1,     /* type */
1987
         1,                     /* rightshift */
1988
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1989
         26,                    /* bitsize */
1990
         FALSE,                 /* pc_relative */
1991
         0,                      /* bitpos */
1992
         complain_overflow_dont, /* complain_on_overflow */
1993
                                /* This needs complex overflow
1994
                                   detection, because the upper four
1995
                                   bits must match the PC.  */
1996
         _bfd_mips_elf_generic_reloc, /* special_function */
1997
         "R_MICROMIPS_26_S1",   /* name */
1998
         FALSE,                 /* partial_inplace */
1999
         0x3ffffff,             /* src_mask */
2000
         0x3ffffff,             /* dst_mask */
2001
         FALSE),                /* pcrel_offset */
2002
 
2003
  /* High 16 bits of symbol value.  */
2004
  HOWTO (R_MICROMIPS_HI16,      /* type */
2005
         16,                    /* rightshift */
2006
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2007
         16,                    /* bitsize */
2008
         FALSE,                 /* pc_relative */
2009
         0,                      /* bitpos */
2010
         complain_overflow_dont, /* complain_on_overflow */
2011
         _bfd_mips_elf_hi16_reloc, /* special_function */
2012
         "R_MICROMIPS_HI16",    /* name */
2013
         FALSE,                 /* partial_inplace */
2014
         0x0000ffff,            /* src_mask */
2015
         0x0000ffff,            /* dst_mask */
2016
         FALSE),                /* pcrel_offset */
2017
 
2018
  /* Low 16 bits of symbol value.  */
2019
  HOWTO (R_MICROMIPS_LO16,      /* type */
2020
         0,                      /* rightshift */
2021
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2022
         16,                    /* bitsize */
2023
         FALSE,                 /* pc_relative */
2024
         0,                      /* bitpos */
2025
         complain_overflow_dont, /* complain_on_overflow */
2026
         _bfd_mips_elf_lo16_reloc, /* special_function */
2027
         "R_MICROMIPS_LO16",    /* name */
2028
         FALSE,                 /* partial_inplace */
2029
         0x0000ffff,            /* src_mask */
2030
         0x0000ffff,            /* dst_mask */
2031
         FALSE),                /* pcrel_offset */
2032
 
2033
  /* GP relative reference.  */
2034
  HOWTO (R_MICROMIPS_GPREL16,   /* type */
2035
         0,                      /* rightshift */
2036
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2037
         16,                    /* bitsize */
2038
         FALSE,                 /* pc_relative */
2039
         0,                      /* bitpos */
2040
         complain_overflow_signed, /* complain_on_overflow */
2041
         _bfd_mips_elf32_gprel16_reloc, /* special_function */
2042
         "R_MICROMIPS_GPREL16", /* name */
2043
         FALSE,                 /* partial_inplace */
2044
         0x0000ffff,            /* src_mask */
2045
         0x0000ffff,            /* dst_mask */
2046
         FALSE),                /* pcrel_offset */
2047
 
2048
  /* Reference to literal section.  */
2049
  HOWTO (R_MICROMIPS_LITERAL,   /* type */
2050
         0,                      /* rightshift */
2051
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2052
         16,                    /* bitsize */
2053
         FALSE,                 /* pc_relative */
2054
         0,                      /* bitpos */
2055
         complain_overflow_signed, /* complain_on_overflow */
2056
         _bfd_mips_elf32_gprel16_reloc, /* special_function */
2057
         "R_MICROMIPS_LITERAL", /* name */
2058
         FALSE,                 /* partial_inplace */
2059
         0x0000ffff,            /* src_mask */
2060
         0x0000ffff,            /* dst_mask */
2061
         FALSE),                /* pcrel_offset */
2062
 
2063
  /* Reference to global offset table.  */
2064
  HOWTO (R_MICROMIPS_GOT16,     /* type */
2065
         0,                      /* rightshift */
2066
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2067
         16,                    /* bitsize */
2068
         FALSE,                 /* pc_relative */
2069
         0,                      /* bitpos */
2070
         complain_overflow_signed, /* complain_on_overflow */
2071
         _bfd_mips_elf_got16_reloc, /* special_function */
2072
         "R_MICROMIPS_GOT16",   /* name */
2073
         FALSE,                 /* partial_inplace */
2074
         0x0000ffff,            /* src_mask */
2075
         0x0000ffff,            /* dst_mask */
2076
         FALSE),                /* pcrel_offset */
2077
 
2078
  /* This is for microMIPS branches.  */
2079
  HOWTO (R_MICROMIPS_PC7_S1,    /* type */
2080
         1,                     /* rightshift */
2081
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
2082
         7,                     /* bitsize */
2083
         TRUE,                  /* pc_relative */
2084
         0,                      /* bitpos */
2085
         complain_overflow_signed, /* complain_on_overflow */
2086
         _bfd_mips_elf_generic_reloc, /* special_function */
2087
         "R_MICROMIPS_PC7_S1",  /* name */
2088
         FALSE,                 /* partial_inplace */
2089
         0x0000007f,            /* src_mask */
2090
         0x0000007f,            /* dst_mask */
2091
         TRUE),                 /* pcrel_offset */
2092
 
2093
  HOWTO (R_MICROMIPS_PC10_S1,   /* type */
2094
         1,                     /* rightshift */
2095
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
2096
         10,                    /* bitsize */
2097
         TRUE,                  /* pc_relative */
2098
         0,                      /* bitpos */
2099
         complain_overflow_signed, /* complain_on_overflow */
2100
         _bfd_mips_elf_generic_reloc, /* special_function */
2101
         "R_MICROMIPS_PC10_S1", /* name */
2102
         FALSE,                 /* partial_inplace */
2103
         0x000003ff,            /* src_mask */
2104
         0x000003ff,            /* dst_mask */
2105
         TRUE),                 /* pcrel_offset */
2106
 
2107
  HOWTO (R_MICROMIPS_PC16_S1,   /* type */
2108
         1,                     /* rightshift */
2109
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2110
         16,                    /* bitsize */
2111
         TRUE,                  /* pc_relative */
2112
         0,                      /* bitpos */
2113
         complain_overflow_signed, /* complain_on_overflow */
2114
         _bfd_mips_elf_generic_reloc, /* special_function */
2115
         "R_MICROMIPS_PC16_S1", /* name */
2116
         FALSE,                 /* partial_inplace */
2117
         0x0000ffff,            /* src_mask */
2118
         0x0000ffff,            /* dst_mask */
2119
         TRUE),                 /* pcrel_offset */
2120
 
2121
  /* 16 bit call through global offset table.  */
2122
  HOWTO (R_MICROMIPS_CALL16,    /* type */
2123
         0,                      /* rightshift */
2124
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2125
         16,                    /* bitsize */
2126
         FALSE,                 /* pc_relative */
2127
         0,                      /* bitpos */
2128
         complain_overflow_signed, /* complain_on_overflow */
2129
         _bfd_mips_elf_generic_reloc, /* special_function */
2130
         "R_MICROMIPS_CALL16",  /* name */
2131
         FALSE,                 /* partial_inplace */
2132
         0x0000ffff,            /* src_mask */
2133
         0x0000ffff,            /* dst_mask */
2134
         FALSE),                /* pcrel_offset */
2135
 
2136
  EMPTY_HOWTO (143),
2137
  EMPTY_HOWTO (144),
2138
 
2139
  /* Displacement in the global offset table.  */
2140
  HOWTO (R_MICROMIPS_GOT_DISP,  /* type */
2141
         0,                      /* rightshift */
2142
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2143
         16,                    /* bitsize */
2144
         FALSE,                 /* pc_relative */
2145
         0,                      /* bitpos */
2146
         complain_overflow_signed, /* complain_on_overflow */
2147
         _bfd_mips_elf_generic_reloc, /* special_function */
2148
         "R_MICROMIPS_GOT_DISP",/* name */
2149
         FALSE,                 /* partial_inplace */
2150
         0x0000ffff,            /* src_mask */
2151
         0x0000ffff,            /* dst_mask */
2152
         FALSE),                /* pcrel_offset */
2153
 
2154
  /* Displacement to page pointer in the global offset table.  */
2155
  HOWTO (R_MICROMIPS_GOT_PAGE,  /* type */
2156
         0,                      /* rightshift */
2157
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2158
         16,                    /* bitsize */
2159
         FALSE,                 /* pc_relative */
2160
         0,                      /* bitpos */
2161
         complain_overflow_signed, /* complain_on_overflow */
2162
         _bfd_mips_elf_generic_reloc, /* special_function */
2163
         "R_MICROMIPS_GOT_PAGE",/* name */
2164
         FALSE,                 /* partial_inplace */
2165
         0x0000ffff,            /* src_mask */
2166
         0x0000ffff,            /* dst_mask */
2167
         FALSE),                /* pcrel_offset */
2168
 
2169
  /* Offset from page pointer in the global offset table.  */
2170
  HOWTO (R_MICROMIPS_GOT_OFST,  /* type */
2171
         0,                      /* rightshift */
2172
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2173
         16,                    /* bitsize */
2174
         FALSE,                 /* pc_relative */
2175
         0,                      /* bitpos */
2176
         complain_overflow_signed, /* complain_on_overflow */
2177
         _bfd_mips_elf_generic_reloc, /* special_function */
2178
         "R_MICROMIPS_GOT_OFST",/* name */
2179
         FALSE,                 /* partial_inplace */
2180
         0x0000ffff,            /* src_mask */
2181
         0x0000ffff,            /* dst_mask */
2182
         FALSE),                /* pcrel_offset */
2183
 
2184
  /* High 16 bits of displacement in global offset table.  */
2185
  HOWTO (R_MICROMIPS_GOT_HI16,  /* type */
2186
         0,                      /* rightshift */
2187
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2188
         16,                    /* bitsize */
2189
         FALSE,                 /* pc_relative */
2190
         0,                      /* bitpos */
2191
         complain_overflow_dont, /* complain_on_overflow */
2192
         _bfd_mips_elf_generic_reloc, /* special_function */
2193
         "R_MICROMIPS_GOT_HI16",/* name */
2194
         FALSE,                 /* partial_inplace */
2195
         0x0000ffff,            /* src_mask */
2196
         0x0000ffff,            /* dst_mask */
2197
         FALSE),                /* pcrel_offset */
2198
 
2199
  /* Low 16 bits of displacement in global offset table.  */
2200
  HOWTO (R_MICROMIPS_GOT_LO16,  /* type */
2201
         0,                      /* rightshift */
2202
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2203
         16,                    /* bitsize */
2204
         FALSE,                 /* pc_relative */
2205
         0,                      /* bitpos */
2206
         complain_overflow_dont, /* complain_on_overflow */
2207
         _bfd_mips_elf_generic_reloc, /* special_function */
2208
         "R_MICROMIPS_GOT_LO16",/* name */
2209
         FALSE,                 /* partial_inplace */
2210
         0x0000ffff,            /* src_mask */
2211
         0x0000ffff,            /* dst_mask */
2212
         FALSE),                /* pcrel_offset */
2213
 
2214
  /* 64 bit subtraction.  Used in the N32 ABI.  */
2215
  HOWTO (R_MICROMIPS_SUB,       /* type */
2216
         0,                      /* rightshift */
2217
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
2218
         64,                    /* bitsize */
2219
         FALSE,                 /* pc_relative */
2220
         0,                      /* bitpos */
2221
         complain_overflow_dont, /* complain_on_overflow */
2222
         _bfd_mips_elf_generic_reloc, /* special_function */
2223
         "R_MICROMIPS_SUB",     /* name */
2224
         FALSE,                 /* partial_inplace */
2225
         MINUS_ONE,             /* src_mask */
2226
         MINUS_ONE,             /* dst_mask */
2227
         FALSE),                /* pcrel_offset */
2228
 
2229
  /* Get the higher value of a 64 bit addend.  */
2230
  HOWTO (R_MICROMIPS_HIGHER,    /* type */
2231
         0,                      /* rightshift */
2232
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2233
         16,                    /* bitsize */
2234
         FALSE,                 /* pc_relative */
2235
         0,                      /* bitpos */
2236
         complain_overflow_dont, /* complain_on_overflow */
2237
         _bfd_mips_elf_generic_reloc, /* special_function */
2238
         "R_MICROMIPS_HIGHER",  /* name */
2239
         FALSE,                 /* partial_inplace */
2240
         0x0000ffff,            /* src_mask */
2241
         0x0000ffff,            /* dst_mask */
2242
         FALSE),                /* pcrel_offset */
2243
 
2244
  /* Get the highest value of a 64 bit addend.  */
2245
  HOWTO (R_MICROMIPS_HIGHEST,   /* type */
2246
         0,                      /* rightshift */
2247
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2248
         16,                    /* bitsize */
2249
         FALSE,                 /* pc_relative */
2250
         0,                      /* bitpos */
2251
         complain_overflow_dont, /* complain_on_overflow */
2252
         _bfd_mips_elf_generic_reloc, /* special_function */
2253
         "R_MICROMIPS_HIGHEST", /* name */
2254
         FALSE,                 /* partial_inplace */
2255
         0x0000ffff,            /* src_mask */
2256
         0x0000ffff,            /* dst_mask */
2257
         FALSE),                /* pcrel_offset */
2258
 
2259
  /* High 16 bits of displacement in global offset table.  */
2260
  HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2261
         0,                      /* rightshift */
2262
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2263
         16,                    /* bitsize */
2264
         FALSE,                 /* pc_relative */
2265
         0,                      /* bitpos */
2266
         complain_overflow_dont, /* complain_on_overflow */
2267
         _bfd_mips_elf_generic_reloc, /* special_function */
2268
         "R_MICROMIPS_CALL_HI16",/* name */
2269
         FALSE,                 /* partial_inplace */
2270
         0x0000ffff,            /* src_mask */
2271
         0x0000ffff,            /* dst_mask */
2272
         FALSE),                /* pcrel_offset */
2273
 
2274
  /* Low 16 bits of displacement in global offset table.  */
2275
  HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2276
         0,                      /* rightshift */
2277
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2278
         16,                    /* bitsize */
2279
         FALSE,                 /* pc_relative */
2280
         0,                      /* bitpos */
2281
         complain_overflow_dont, /* complain_on_overflow */
2282
         _bfd_mips_elf_generic_reloc, /* special_function */
2283
         "R_MICROMIPS_CALL_LO16",/* name */
2284
         FALSE,                 /* partial_inplace */
2285
         0x0000ffff,            /* src_mask */
2286
         0x0000ffff,            /* dst_mask */
2287
         FALSE),                /* pcrel_offset */
2288
};
2289
 
2290 14 khays
/* GNU extension to record C++ vtable hierarchy */
2291
static reloc_howto_type elf_mips_gnu_vtinherit_howto =
2292
  HOWTO (R_MIPS_GNU_VTINHERIT,  /* type */
2293
         0,                      /* rightshift */
2294
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2295
         0,                      /* bitsize */
2296
         FALSE,                 /* pc_relative */
2297
         0,                      /* bitpos */
2298
         complain_overflow_dont, /* complain_on_overflow */
2299
         NULL,                  /* special_function */
2300
         "R_MIPS_GNU_VTINHERIT", /* name */
2301
         FALSE,                 /* partial_inplace */
2302
         0,                      /* src_mask */
2303
         0,                      /* dst_mask */
2304
         FALSE);                /* pcrel_offset */
2305
 
2306
/* GNU extension to record C++ vtable member usage */
2307
static reloc_howto_type elf_mips_gnu_vtentry_howto =
2308
  HOWTO (R_MIPS_GNU_VTENTRY,    /* type */
2309
         0,                      /* rightshift */
2310
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2311
         0,                      /* bitsize */
2312
         FALSE,                 /* pc_relative */
2313
         0,                      /* bitpos */
2314
         complain_overflow_dont, /* complain_on_overflow */
2315
         _bfd_elf_rel_vtable_reloc_fn, /* special_function */
2316
         "R_MIPS_GNU_VTENTRY",  /* name */
2317
         FALSE,                 /* partial_inplace */
2318
         0,                      /* src_mask */
2319
         0,                      /* dst_mask */
2320
         FALSE);                /* pcrel_offset */
2321
 
2322
/* 16 bit offset for pc-relative branches.  */
2323
static reloc_howto_type elf_mips_gnu_rel16_s2 =
2324
  HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
2325
         2,                     /* rightshift */
2326
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2327
         16,                    /* bitsize */
2328
         TRUE,                  /* pc_relative */
2329
         0,                      /* bitpos */
2330
         complain_overflow_signed, /* complain_on_overflow */
2331
         _bfd_mips_elf_generic_reloc,   /* special_function */
2332
         "R_MIPS_GNU_REL16_S2", /* name */
2333
         TRUE,                  /* partial_inplace */
2334
         0x0000ffff,            /* src_mask */
2335
         0x0000ffff,            /* dst_mask */
2336
         TRUE);                 /* pcrel_offset */
2337
 
2338
/* 16 bit offset for pc-relative branches.  */
2339
static reloc_howto_type elf_mips_gnu_rela16_s2 =
2340
  HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
2341
         2,                     /* rightshift */
2342
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
2343
         16,                    /* bitsize */
2344
         TRUE,                  /* pc_relative */
2345
         0,                      /* bitpos */
2346
         complain_overflow_signed, /* complain_on_overflow */
2347
         _bfd_mips_elf_generic_reloc,   /* special_function */
2348
         "R_MIPS_GNU_REL16_S2", /* name */
2349
         FALSE,                 /* partial_inplace */
2350
         0,                      /* src_mask */
2351
         0x0000ffff,            /* dst_mask */
2352
         TRUE);                 /* pcrel_offset */
2353
 
2354
/* Originally a VxWorks extension, but now used for other systems too.  */
2355
static reloc_howto_type elf_mips_copy_howto =
2356
  HOWTO (R_MIPS_COPY,           /* type */
2357
         0,                      /* rightshift */
2358
         0,                      /* this one is variable size */
2359
         0,                      /* bitsize */
2360
         FALSE,                 /* pc_relative */
2361
         0,                      /* bitpos */
2362
         complain_overflow_bitfield, /* complain_on_overflow */
2363
         bfd_elf_generic_reloc, /* special_function */
2364
         "R_MIPS_COPY",         /* name */
2365
         FALSE,                 /* partial_inplace */
2366
         0x0,                   /* src_mask */
2367
         0x0,                   /* dst_mask */
2368
         FALSE);                /* pcrel_offset */
2369
 
2370
/* Originally a VxWorks extension, but now used for other systems too.  */
2371
static reloc_howto_type elf_mips_jump_slot_howto =
2372
  HOWTO (R_MIPS_JUMP_SLOT,      /* type */
2373
         0,                      /* rightshift */
2374
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
2375
         64,                    /* bitsize */
2376
         FALSE,                 /* pc_relative */
2377
         0,                      /* bitpos */
2378
         complain_overflow_bitfield, /* complain_on_overflow */
2379
         bfd_elf_generic_reloc, /* special_function */
2380
         "R_MIPS_JUMP_SLOT",    /* name */
2381
         FALSE,                 /* partial_inplace */
2382
         0x0,                   /* src_mask */
2383
         0x0,                   /* dst_mask */
2384
         FALSE);                /* pcrel_offset */
2385
 
2386
/* Swap in a MIPS 64-bit Rel reloc.  */
2387
 
2388
static void
2389
mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
2390
                          Elf64_Mips_Internal_Rela *dst)
2391
{
2392
  dst->r_offset = H_GET_64 (abfd, src->r_offset);
2393
  dst->r_sym = H_GET_32 (abfd, src->r_sym);
2394
  dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
2395
  dst->r_type3 = H_GET_8 (abfd, src->r_type3);
2396
  dst->r_type2 = H_GET_8 (abfd, src->r_type2);
2397
  dst->r_type = H_GET_8 (abfd, src->r_type);
2398
  dst->r_addend = 0;
2399
}
2400
 
2401
/* Swap in a MIPS 64-bit Rela reloc.  */
2402
 
2403
static void
2404
mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
2405
                           Elf64_Mips_Internal_Rela *dst)
2406
{
2407
  dst->r_offset = H_GET_64 (abfd, src->r_offset);
2408
  dst->r_sym = H_GET_32 (abfd, src->r_sym);
2409
  dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
2410
  dst->r_type3 = H_GET_8 (abfd, src->r_type3);
2411
  dst->r_type2 = H_GET_8 (abfd, src->r_type2);
2412
  dst->r_type = H_GET_8 (abfd, src->r_type);
2413
  dst->r_addend = H_GET_S64 (abfd, src->r_addend);
2414
}
2415
 
2416
/* Swap out a MIPS 64-bit Rel reloc.  */
2417
 
2418
static void
2419
mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
2420
                           Elf64_Mips_External_Rel *dst)
2421
{
2422
  H_PUT_64 (abfd, src->r_offset, dst->r_offset);
2423
  H_PUT_32 (abfd, src->r_sym, dst->r_sym);
2424
  H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
2425
  H_PUT_8 (abfd, src->r_type3, dst->r_type3);
2426
  H_PUT_8 (abfd, src->r_type2, dst->r_type2);
2427
  H_PUT_8 (abfd, src->r_type, dst->r_type);
2428
}
2429
 
2430
/* Swap out a MIPS 64-bit Rela reloc.  */
2431
 
2432
static void
2433
mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
2434
                            Elf64_Mips_External_Rela *dst)
2435
{
2436
  H_PUT_64 (abfd, src->r_offset, dst->r_offset);
2437
  H_PUT_32 (abfd, src->r_sym, dst->r_sym);
2438
  H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
2439
  H_PUT_8 (abfd, src->r_type3, dst->r_type3);
2440
  H_PUT_8 (abfd, src->r_type2, dst->r_type2);
2441
  H_PUT_8 (abfd, src->r_type, dst->r_type);
2442
  H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
2443
}
2444
 
2445
/* Swap in a MIPS 64-bit Rel reloc.  */
2446
 
2447
static void
2448
mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
2449
                             Elf_Internal_Rela *dst)
2450
{
2451
  Elf64_Mips_Internal_Rela mirel;
2452
 
2453
  mips_elf64_swap_reloc_in (abfd,
2454
                            (const Elf64_Mips_External_Rel *) src,
2455
                            &mirel);
2456
 
2457
  dst[0].r_offset = mirel.r_offset;
2458
  dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
2459
  dst[0].r_addend = 0;
2460
  dst[1].r_offset = mirel.r_offset;
2461
  dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
2462
  dst[1].r_addend = 0;
2463
  dst[2].r_offset = mirel.r_offset;
2464
  dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
2465
  dst[2].r_addend = 0;
2466
}
2467
 
2468
/* Swap in a MIPS 64-bit Rela reloc.  */
2469
 
2470
static void
2471
mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
2472
                              Elf_Internal_Rela *dst)
2473
{
2474
  Elf64_Mips_Internal_Rela mirela;
2475
 
2476
  mips_elf64_swap_reloca_in (abfd,
2477
                             (const Elf64_Mips_External_Rela *) src,
2478
                             &mirela);
2479
 
2480
  dst[0].r_offset = mirela.r_offset;
2481
  dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type);
2482
  dst[0].r_addend = mirela.r_addend;
2483
  dst[1].r_offset = mirela.r_offset;
2484
  dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2);
2485
  dst[1].r_addend = 0;
2486
  dst[2].r_offset = mirela.r_offset;
2487
  dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3);
2488
  dst[2].r_addend = 0;
2489
}
2490
 
2491
/* Swap out a MIPS 64-bit Rel reloc.  */
2492
 
2493
static void
2494
mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
2495
                              bfd_byte *dst)
2496
{
2497
  Elf64_Mips_Internal_Rela mirel;
2498
 
2499
  mirel.r_offset = src[0].r_offset;
2500
  BFD_ASSERT(src[0].r_offset == src[1].r_offset);
2501
 
2502
  mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
2503
  mirel.r_sym = ELF64_R_SYM (src[0].r_info);
2504
  mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
2505
  mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
2506
  mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
2507
 
2508
  mips_elf64_swap_reloc_out (abfd, &mirel,
2509
                             (Elf64_Mips_External_Rel *) dst);
2510
}
2511
 
2512
/* Swap out a MIPS 64-bit Rela reloc.  */
2513
 
2514
static void
2515
mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src,
2516
                               bfd_byte *dst)
2517
{
2518
  Elf64_Mips_Internal_Rela mirela;
2519
 
2520
  mirela.r_offset = src[0].r_offset;
2521
  BFD_ASSERT(src[0].r_offset == src[1].r_offset);
2522
  BFD_ASSERT(src[0].r_offset == src[2].r_offset);
2523
 
2524
  mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
2525
  mirela.r_sym = ELF64_R_SYM (src[0].r_info);
2526
  mirela.r_addend = src[0].r_addend;
2527
  BFD_ASSERT(src[1].r_addend == 0);
2528
  BFD_ASSERT(src[2].r_addend == 0);
2529
 
2530
  mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
2531
  mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
2532
  mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
2533
 
2534
  mips_elf64_swap_reloca_out (abfd, &mirela,
2535
                              (Elf64_Mips_External_Rela *) dst);
2536
}
2537
 
2538
/* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
2539
   dangerous relocation.  */
2540
 
2541
static bfd_boolean
2542
mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp)
2543
{
2544
  unsigned int count;
2545
  asymbol **sym;
2546
  unsigned int i;
2547
 
2548
  /* If we've already figured out what GP will be, just return it.  */
2549
  *pgp = _bfd_get_gp_value (output_bfd);
2550
  if (*pgp)
2551
    return TRUE;
2552
 
2553
  count = bfd_get_symcount (output_bfd);
2554
  sym = bfd_get_outsymbols (output_bfd);
2555
 
2556
  /* The linker script will have created a symbol named `_gp' with the
2557
     appropriate value.  */
2558
  if (sym == NULL)
2559
    i = count;
2560
  else
2561
    {
2562
      for (i = 0; i < count; i++, sym++)
2563
        {
2564
          register const char *name;
2565
 
2566
          name = bfd_asymbol_name (*sym);
2567
          if (*name == '_' && strcmp (name, "_gp") == 0)
2568
            {
2569
              *pgp = bfd_asymbol_value (*sym);
2570
              _bfd_set_gp_value (output_bfd, *pgp);
2571
              break;
2572
            }
2573
        }
2574
    }
2575
 
2576
  if (i >= count)
2577
    {
2578
      /* Only get the error once.  */
2579
      *pgp = 4;
2580
      _bfd_set_gp_value (output_bfd, *pgp);
2581
      return FALSE;
2582
    }
2583
 
2584
  return TRUE;
2585
}
2586
 
2587
/* We have to figure out the gp value, so that we can adjust the
2588
   symbol value correctly.  We look up the symbol _gp in the output
2589
   BFD.  If we can't find it, we're stuck.  We cache it in the ELF
2590
   target data.  We don't need to adjust the symbol value for an
2591
   external symbol if we are producing relocatable output.  */
2592
 
2593
static bfd_reloc_status_type
2594
mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
2595
                     char **error_message, bfd_vma *pgp)
2596
{
2597
  if (bfd_is_und_section (symbol->section)
2598
      && ! relocatable)
2599
    {
2600
      *pgp = 0;
2601
      return bfd_reloc_undefined;
2602
    }
2603
 
2604
  *pgp = _bfd_get_gp_value (output_bfd);
2605
  if (*pgp == 0
2606
      && (! relocatable
2607
          || (symbol->flags & BSF_SECTION_SYM) != 0))
2608
    {
2609
      if (relocatable)
2610
        {
2611
          /* Make up a value.  */
2612
          *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
2613
          _bfd_set_gp_value (output_bfd, *pgp);
2614
        }
2615
      else if (!mips_elf64_assign_gp (output_bfd, pgp))
2616
        {
2617
          *error_message =
2618
            (char *) _("GP relative relocation when _gp not defined");
2619
          return bfd_reloc_dangerous;
2620
        }
2621
    }
2622
 
2623
  return bfd_reloc_ok;
2624
}
2625
 
2626
/* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
2627
   become the offset from the gp register.  */
2628
 
2629
static bfd_reloc_status_type
2630
mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2631
                          void *data, asection *input_section, bfd *output_bfd,
2632
                          char **error_message)
2633
{
2634
  bfd_boolean relocatable;
2635
  bfd_reloc_status_type ret;
2636
  bfd_vma gp;
2637
 
2638
  /* If we're relocating, and this is an external symbol, we don't want
2639
     to change anything.  */
2640
  if (output_bfd != NULL
2641
      && (symbol->flags & BSF_SECTION_SYM) == 0
2642
      && (symbol->flags & BSF_LOCAL) != 0)
2643
    {
2644
      reloc_entry->address += input_section->output_offset;
2645
      return bfd_reloc_ok;
2646
    }
2647
 
2648
  if (output_bfd != NULL)
2649
    relocatable = TRUE;
2650
  else
2651
    {
2652
      relocatable = FALSE;
2653
      output_bfd = symbol->section->output_section->owner;
2654
    }
2655
 
2656
  ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
2657
                             &gp);
2658
  if (ret != bfd_reloc_ok)
2659
    return ret;
2660
 
2661
  return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2662
                                        input_section, relocatable,
2663
                                        data, gp);
2664
}
2665
 
2666
/* Do a R_MIPS_LITERAL relocation.  */
2667
 
2668
static bfd_reloc_status_type
2669
mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2670
                          void *data, asection *input_section, bfd *output_bfd,
2671
                          char **error_message)
2672
{
2673
  bfd_boolean relocatable;
2674
  bfd_reloc_status_type ret;
2675
  bfd_vma gp;
2676
 
2677
  /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
2678
  if (output_bfd != NULL
2679
      && (symbol->flags & BSF_SECTION_SYM) == 0
2680
      && (symbol->flags & BSF_LOCAL) != 0)
2681
    {
2682
      *error_message = (char *)
2683
        _("literal relocation occurs for an external symbol");
2684
      return bfd_reloc_outofrange;
2685
    }
2686
 
2687
  /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
2688
  if (output_bfd != NULL)
2689
    relocatable = TRUE;
2690
  else
2691
    {
2692
      relocatable = FALSE;
2693
      output_bfd = symbol->section->output_section->owner;
2694
    }
2695
 
2696
  ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
2697
                             &gp);
2698
  if (ret != bfd_reloc_ok)
2699
    return ret;
2700
 
2701
  return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2702
                                        input_section, relocatable,
2703
                                        data, gp);
2704
}
2705
 
2706
/* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
2707
   become the offset from the gp register.  */
2708
 
2709
static bfd_reloc_status_type
2710
mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2711
                          void *data, asection *input_section, bfd *output_bfd,
2712
                          char **error_message)
2713
{
2714
  bfd_boolean relocatable;
2715
  bfd_reloc_status_type ret;
2716
  bfd_vma gp;
2717
  bfd_vma relocation;
2718
  bfd_vma val;
2719
 
2720
  /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
2721
  if (output_bfd != NULL
2722
      && (symbol->flags & BSF_SECTION_SYM) == 0
2723
      && (symbol->flags & BSF_LOCAL) != 0)
2724
    {
2725
      *error_message = (char *)
2726
        _("32bits gp relative relocation occurs for an external symbol");
2727
      return bfd_reloc_outofrange;
2728
    }
2729
 
2730
  if (output_bfd != NULL)
2731
    relocatable = TRUE;
2732
  else
2733
    {
2734
      relocatable = FALSE;
2735
      output_bfd = symbol->section->output_section->owner;
2736
    }
2737
 
2738
  ret = mips_elf64_final_gp (output_bfd, symbol, relocatable,
2739
                             error_message, &gp);
2740
  if (ret != bfd_reloc_ok)
2741
    return ret;
2742
 
2743
  if (bfd_is_com_section (symbol->section))
2744
    relocation = 0;
2745
  else
2746
    relocation = symbol->value;
2747
 
2748
  relocation += symbol->section->output_section->vma;
2749
  relocation += symbol->section->output_offset;
2750
 
2751
  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2752
    return bfd_reloc_outofrange;
2753
 
2754
  /* Set val to the offset into the section or symbol.  */
2755
  val = reloc_entry->addend;
2756
 
2757
  if (reloc_entry->howto->partial_inplace)
2758
    val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
2759
 
2760
  /* Adjust val for the final section location and GP value.  If we
2761
     are producing relocatable output, we don't want to do this for
2762
     an external symbol.  */
2763
  if (! relocatable
2764
      || (symbol->flags & BSF_SECTION_SYM) != 0)
2765
    val += relocation - gp;
2766
 
2767
  if (reloc_entry->howto->partial_inplace)
2768
    bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
2769
  else
2770
    reloc_entry->addend = val;
2771
 
2772
  if (relocatable)
2773
    reloc_entry->address += input_section->output_offset;
2774
 
2775
  return bfd_reloc_ok;
2776
}
2777
 
2778
/* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
2779
   the rest is at bits 6-10. The bitpos already got right by the howto.  */
2780
 
2781
static bfd_reloc_status_type
2782
mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2783
                         void *data, asection *input_section, bfd *output_bfd,
2784
                         char **error_message)
2785
{
2786
  if (reloc_entry->howto->partial_inplace)
2787
    {
2788
      reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
2789
                             | (reloc_entry->addend & 0x00000800) >> 9);
2790
    }
2791
 
2792
  return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2793
                                      input_section, output_bfd,
2794
                                      error_message);
2795
}
2796
 
2797
/* Handle a mips16 GP relative reloc.  */
2798
 
2799
static bfd_reloc_status_type
2800
mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2801
                    void *data, asection *input_section, bfd *output_bfd,
2802
                    char **error_message)
2803
{
2804
  bfd_boolean relocatable;
2805
  bfd_reloc_status_type ret;
2806
  bfd_byte *location;
2807
  bfd_vma gp;
2808
 
2809
  /* If we're relocating, and this is an external symbol, we don't want
2810
     to change anything.  */
2811
  if (output_bfd != NULL
2812
      && (symbol->flags & BSF_SECTION_SYM) == 0
2813
      && (symbol->flags & BSF_LOCAL) != 0)
2814
    {
2815
      reloc_entry->address += input_section->output_offset;
2816
      return bfd_reloc_ok;
2817
    }
2818
 
2819
  if (output_bfd != NULL)
2820
    relocatable = TRUE;
2821
  else
2822
    {
2823
      relocatable = FALSE;
2824
      output_bfd = symbol->section->output_section->owner;
2825
    }
2826
 
2827
  ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
2828
                             &gp);
2829
  if (ret != bfd_reloc_ok)
2830
    return ret;
2831
 
2832
  location = (bfd_byte *) data + reloc_entry->address;
2833 161 khays
  _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
2834
                                 location);
2835 14 khays
  ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2836
                                       input_section, relocatable,
2837
                                       data, gp);
2838 161 khays
  _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
2839
                               location);
2840 14 khays
 
2841
  return ret;
2842
}
2843
 
2844
/* A mapping from BFD reloc types to MIPS ELF reloc types.  */
2845
 
2846
struct elf_reloc_map {
2847
  bfd_reloc_code_real_type bfd_val;
2848
  enum elf_mips_reloc_type elf_val;
2849
};
2850
 
2851
static const struct elf_reloc_map mips_reloc_map[] =
2852
{
2853
  { BFD_RELOC_NONE, R_MIPS_NONE },
2854
  { BFD_RELOC_16, R_MIPS_16 },
2855
  { BFD_RELOC_32, R_MIPS_32 },
2856
  /* There is no BFD reloc for R_MIPS_REL32.  */
2857
  { BFD_RELOC_64, R_MIPS_64 },
2858
  { BFD_RELOC_CTOR, R_MIPS_64 },
2859
  { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
2860
  { BFD_RELOC_HI16_S, R_MIPS_HI16 },
2861
  { BFD_RELOC_LO16, R_MIPS_LO16 },
2862
  { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
2863
  { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
2864
  { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
2865
  { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
2866
  { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
2867
  { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
2868
  { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
2869
  { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
2870
  { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
2871
  { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
2872
  { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
2873
  { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
2874
  { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
2875
  { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
2876
  { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
2877
  { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
2878
  { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
2879
  { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
2880
  { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
2881
  { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
2882
  { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
2883
  { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
2884
  { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
2885
  /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
2886
  { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
2887
  { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
2888
  { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
2889
  { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
2890
  { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
2891
  { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
2892
  { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
2893
  { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
2894
  { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
2895
  { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
2896
  { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
2897
  { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
2898
  { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
2899
  { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
2900
  { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
2901
};
2902
 
2903
static const struct elf_reloc_map mips16_reloc_map[] =
2904
{
2905
  { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
2906
  { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
2907
  { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
2908
  { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
2909
  { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
2910
  { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
2911
};
2912
 
2913 161 khays
static const struct elf_reloc_map micromips_reloc_map[] =
2914
{
2915
  { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
2916
  { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
2917
  { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
2918
  { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
2919
  { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
2920
  { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
2921
  { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
2922
  { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
2923
  { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
2924
  { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
2925
  { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
2926
  { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
2927
  { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
2928
  { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
2929
  { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
2930
  { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
2931
  { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
2932
  { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
2933
  { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
2934
  { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
2935
};
2936 14 khays
/* Given a BFD reloc type, return a howto structure.  */
2937
 
2938
static reloc_howto_type *
2939
bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2940
                                 bfd_reloc_code_real_type code)
2941
{
2942
  unsigned int i;
2943
  /* FIXME: We default to RELA here instead of choosing the right
2944
     relocation variant.  */
2945
  reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
2946
  reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
2947 161 khays
  reloc_howto_type *howto_micromips_table = micromips_elf64_howto_table_rela;
2948 14 khays
 
2949
  for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
2950
       i++)
2951
    {
2952
      if (mips_reloc_map[i].bfd_val == code)
2953
        return &howto_table[(int) mips_reloc_map[i].elf_val];
2954
    }
2955
 
2956
  for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
2957
       i++)
2958
    {
2959
      if (mips16_reloc_map[i].bfd_val == code)
2960
        return &howto16_table[(int) mips16_reloc_map[i].elf_val];
2961
    }
2962
 
2963 161 khays
  for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
2964
       i++)
2965
    {
2966
      if (micromips_reloc_map[i].bfd_val == code)
2967
        return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
2968
    }
2969
 
2970 14 khays
  switch (code)
2971
    {
2972
    case BFD_RELOC_VTABLE_INHERIT:
2973
      return &elf_mips_gnu_vtinherit_howto;
2974
    case BFD_RELOC_VTABLE_ENTRY:
2975
      return &elf_mips_gnu_vtentry_howto;
2976
    case BFD_RELOC_MIPS_COPY:
2977
      return &elf_mips_copy_howto;
2978
    case BFD_RELOC_MIPS_JUMP_SLOT:
2979
      return &elf_mips_jump_slot_howto;
2980
    default:
2981
      bfd_set_error (bfd_error_bad_value);
2982
      return NULL;
2983
    }
2984
}
2985
 
2986
static reloc_howto_type *
2987
bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2988
                                 const char *r_name)
2989
{
2990
  unsigned int i;
2991
 
2992
  for (i = 0;
2993
       i < (sizeof (mips_elf64_howto_table_rela)
2994
            / sizeof (mips_elf64_howto_table_rela[0])); i++)
2995
    if (mips_elf64_howto_table_rela[i].name != NULL
2996
        && strcasecmp (mips_elf64_howto_table_rela[i].name, r_name) == 0)
2997
      return &mips_elf64_howto_table_rela[i];
2998
 
2999
  for (i = 0;
3000
       i < (sizeof (mips16_elf64_howto_table_rela)
3001
            / sizeof (mips16_elf64_howto_table_rela[0]));
3002
       i++)
3003
    if (mips16_elf64_howto_table_rela[i].name != NULL
3004
        && strcasecmp (mips16_elf64_howto_table_rela[i].name, r_name) == 0)
3005
      return &mips16_elf64_howto_table_rela[i];
3006
 
3007 161 khays
  for (i = 0;
3008
       i < (sizeof (micromips_elf64_howto_table_rela)
3009
            / sizeof (micromips_elf64_howto_table_rela[0]));
3010
       i++)
3011
    if (micromips_elf64_howto_table_rela[i].name != NULL
3012
        && strcasecmp (micromips_elf64_howto_table_rela[i].name, r_name) == 0)
3013
      return &micromips_elf64_howto_table_rela[i];
3014
 
3015 14 khays
  if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
3016
    return &elf_mips_gnu_vtinherit_howto;
3017
  if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
3018
    return &elf_mips_gnu_vtentry_howto;
3019
  if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
3020
    return &elf_mips_gnu_rel16_s2;
3021
  if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
3022
    return &elf_mips_gnu_rela16_s2;
3023
  if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
3024
    return &elf_mips_copy_howto;
3025
  if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
3026
    return &elf_mips_jump_slot_howto;
3027
 
3028
  return NULL;
3029
}
3030
 
3031
/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
3032
 
3033
static reloc_howto_type *
3034
mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
3035
{
3036
  switch (r_type)
3037
    {
3038
    case R_MIPS_GNU_VTINHERIT:
3039
      return &elf_mips_gnu_vtinherit_howto;
3040
    case R_MIPS_GNU_VTENTRY:
3041
      return &elf_mips_gnu_vtentry_howto;
3042
    case R_MIPS_GNU_REL16_S2:
3043
      if (rela_p)
3044
        return &elf_mips_gnu_rela16_s2;
3045
      else
3046
        return &elf_mips_gnu_rel16_s2;
3047
    case R_MIPS_COPY:
3048
      return &elf_mips_copy_howto;
3049
    case R_MIPS_JUMP_SLOT:
3050
      return &elf_mips_jump_slot_howto;
3051
    default:
3052 161 khays
      if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
3053
        {
3054
          if (rela_p)
3055
            return &micromips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
3056
          else
3057
            return &micromips_elf64_howto_table_rel[r_type - R_MICROMIPS_min];
3058
        }
3059 14 khays
      if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
3060
        {
3061
          if (rela_p)
3062
            return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
3063
          else
3064
            return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
3065
        }
3066
      BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
3067
      if (rela_p)
3068
        return &mips_elf64_howto_table_rela[r_type];
3069
      else
3070
        return &mips_elf64_howto_table_rel[r_type];
3071
      break;
3072
    }
3073
}
3074
 
3075
/* Prevent relocation handling by bfd for MIPS ELF64.  */
3076
 
3077
static void
3078
mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
3079
                              arelent *cache_ptr ATTRIBUTE_UNUSED,
3080
                              Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
3081
{
3082
  BFD_ASSERT (0);
3083
}
3084
 
3085
static void
3086
mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
3087
                               arelent *cache_ptr ATTRIBUTE_UNUSED,
3088
                               Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
3089
{
3090
  BFD_ASSERT (0);
3091
}
3092
 
3093
/* Since each entry in an SHT_REL or SHT_RELA section can represent up
3094
   to three relocs, we must tell the user to allocate more space.  */
3095
 
3096
static long
3097
mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
3098
{
3099
  return (sec->reloc_count * 3 + 1) * sizeof (arelent *);
3100
}
3101
 
3102
static long
3103
mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd)
3104
{
3105
  return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3;
3106
}
3107
 
3108
/* We must also copy more relocations than the corresponding functions
3109
   in elf.c would, so the two following functions are slightly
3110
   modified from elf.c, that multiply the external relocation count by
3111
   3 to obtain the internal relocation count.  */
3112
 
3113
static long
3114
mips_elf64_canonicalize_reloc (bfd *abfd, sec_ptr section,
3115
                               arelent **relptr, asymbol **symbols)
3116
{
3117
  arelent *tblptr;
3118
  unsigned int i;
3119
  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3120
 
3121
  if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
3122
    return -1;
3123
 
3124
  tblptr = section->relocation;
3125
  for (i = 0; i < section->reloc_count * 3; i++)
3126
    *relptr++ = tblptr++;
3127
 
3128
  *relptr = NULL;
3129
 
3130
  return section->reloc_count * 3;
3131
}
3132
 
3133
static long
3134
mips_elf64_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage,
3135
                                       asymbol **syms)
3136
{
3137
  bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3138
  asection *s;
3139
  long ret;
3140
 
3141
  if (elf_dynsymtab (abfd) == 0)
3142
    {
3143
      bfd_set_error (bfd_error_invalid_operation);
3144
      return -1;
3145
    }
3146
 
3147
  slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3148
  ret = 0;
3149
  for (s = abfd->sections; s != NULL; s = s->next)
3150
    {
3151
      if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
3152
          && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
3153
              || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
3154
        {
3155
          arelent *p;
3156
          long count, i;
3157
 
3158
          if (! (*slurp_relocs) (abfd, s, syms, TRUE))
3159
            return -1;
3160
          count = s->size / elf_section_data (s)->this_hdr.sh_entsize * 3;
3161
          p = s->relocation;
3162
          for (i = 0; i < count; i++)
3163
            *storage++ = p++;
3164
          ret += count;
3165
        }
3166
    }
3167
 
3168
  *storage = NULL;
3169
 
3170
  return ret;
3171
}
3172
 
3173
/* Read the relocations from one reloc section.  This is mostly copied
3174
   from elfcode.h, except for the changes to expand one external
3175
   relocation to 3 internal ones.  We must unfortunately set
3176
   reloc_count to the number of external relocations, because a lot of
3177
   generic code seems to depend on this.  */
3178
 
3179
static bfd_boolean
3180
mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
3181
                                  Elf_Internal_Shdr *rel_hdr,
3182
                                  bfd_size_type reloc_count,
3183
                                  arelent *relents, asymbol **symbols,
3184
                                  bfd_boolean dynamic)
3185
{
3186
  void *allocated;
3187
  bfd_byte *native_relocs;
3188
  arelent *relent;
3189
  bfd_vma i;
3190
  int entsize;
3191
  bfd_boolean rela_p;
3192
 
3193
  allocated = bfd_malloc (rel_hdr->sh_size);
3194
  if (allocated == NULL)
3195
    return FALSE;
3196
 
3197
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
3198
      || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
3199
          != rel_hdr->sh_size))
3200
    goto error_return;
3201
 
3202
  native_relocs = allocated;
3203
 
3204
  entsize = rel_hdr->sh_entsize;
3205
  BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
3206
              || entsize == sizeof (Elf64_Mips_External_Rela));
3207
 
3208
  if (entsize == sizeof (Elf64_Mips_External_Rel))
3209
    rela_p = FALSE;
3210
  else
3211
    rela_p = TRUE;
3212
 
3213
  for (i = 0, relent = relents;
3214
       i < reloc_count;
3215
       i++, native_relocs += entsize)
3216
    {
3217
      Elf64_Mips_Internal_Rela rela;
3218
      bfd_boolean used_sym, used_ssym;
3219
      int ir;
3220
 
3221
      if (entsize == sizeof (Elf64_Mips_External_Rela))
3222
        mips_elf64_swap_reloca_in (abfd,
3223
                                   (Elf64_Mips_External_Rela *) native_relocs,
3224
                                   &rela);
3225
      else
3226
        mips_elf64_swap_reloc_in (abfd,
3227
                                  (Elf64_Mips_External_Rel *) native_relocs,
3228
                                  &rela);
3229
 
3230
      /* Each entry represents exactly three actual relocations.  */
3231
 
3232
      used_sym = FALSE;
3233
      used_ssym = FALSE;
3234
      for (ir = 0; ir < 3; ir++)
3235
        {
3236
          enum elf_mips_reloc_type type;
3237
 
3238
          switch (ir)
3239
            {
3240
            default:
3241
              abort ();
3242
            case 0:
3243
              type = (enum elf_mips_reloc_type) rela.r_type;
3244
              break;
3245
            case 1:
3246
              type = (enum elf_mips_reloc_type) rela.r_type2;
3247
              break;
3248
            case 2:
3249
              type = (enum elf_mips_reloc_type) rela.r_type3;
3250
              break;
3251
            }
3252
 
3253
          /* Some types require symbols, whereas some do not.  */
3254
          switch (type)
3255
            {
3256
            case R_MIPS_NONE:
3257
            case R_MIPS_LITERAL:
3258
            case R_MIPS_INSERT_A:
3259
            case R_MIPS_INSERT_B:
3260
            case R_MIPS_DELETE:
3261
              relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3262
              break;
3263
 
3264
            default:
3265
              if (! used_sym)
3266
                {
3267
                  if (rela.r_sym == STN_UNDEF)
3268
                    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3269
                  else
3270
                    {
3271
                      asymbol **ps, *s;
3272
 
3273
                      ps = symbols + rela.r_sym - 1;
3274
                      s = *ps;
3275
                      if ((s->flags & BSF_SECTION_SYM) == 0)
3276
                        relent->sym_ptr_ptr = ps;
3277
                      else
3278
                        relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
3279
                    }
3280
 
3281
                  used_sym = TRUE;
3282
                }
3283
              else if (! used_ssym)
3284
                {
3285
                  switch (rela.r_ssym)
3286
                    {
3287
                    case RSS_UNDEF:
3288
                      relent->sym_ptr_ptr =
3289
                        bfd_abs_section_ptr->symbol_ptr_ptr;
3290
                      break;
3291
 
3292
                    case RSS_GP:
3293
                    case RSS_GP0:
3294
                    case RSS_LOC:
3295
                      /* FIXME: I think these need to be handled using
3296
                         special howto structures.  */
3297
                      BFD_ASSERT (0);
3298
                      break;
3299
 
3300
                    default:
3301
                      BFD_ASSERT (0);
3302
                      break;
3303
                    }
3304
 
3305
                  used_ssym = TRUE;
3306
                }
3307
              else
3308
                relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3309
 
3310
              break;
3311
            }
3312
 
3313
          /* The address of an ELF reloc is section relative for an
3314
             object file, and absolute for an executable file or
3315
             shared library.  The address of a BFD reloc is always
3316
             section relative.  */
3317
          if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
3318
            relent->address = rela.r_offset;
3319
          else
3320
            relent->address = rela.r_offset - asect->vma;
3321
 
3322
          relent->addend = rela.r_addend;
3323
 
3324
          relent->howto = mips_elf64_rtype_to_howto (type, rela_p);
3325
 
3326
          ++relent;
3327
        }
3328
    }
3329
 
3330
  asect->reloc_count += (relent - relents) / 3;
3331
 
3332
  if (allocated != NULL)
3333
    free (allocated);
3334
 
3335
  return TRUE;
3336
 
3337
 error_return:
3338
  if (allocated != NULL)
3339
    free (allocated);
3340
  return FALSE;
3341
}
3342
 
3343
/* Read the relocations.  On Irix 6, there can be two reloc sections
3344
   associated with a single data section.  This is copied from
3345
   elfcode.h as well, with changes as small as accounting for 3
3346
   internal relocs per external reloc and resetting reloc_count to
3347
   zero before processing the relocs of a section.  */
3348
 
3349
static bfd_boolean
3350
mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect,
3351
                              asymbol **symbols, bfd_boolean dynamic)
3352
{
3353
  struct bfd_elf_section_data * const d = elf_section_data (asect);
3354
  Elf_Internal_Shdr *rel_hdr;
3355
  Elf_Internal_Shdr *rel_hdr2;
3356
  bfd_size_type reloc_count;
3357
  bfd_size_type reloc_count2;
3358
  arelent *relents;
3359
  bfd_size_type amt;
3360
 
3361
  if (asect->relocation != NULL)
3362
    return TRUE;
3363
 
3364
  if (! dynamic)
3365
    {
3366
      if ((asect->flags & SEC_RELOC) == 0
3367
          || asect->reloc_count == 0)
3368
        return TRUE;
3369
 
3370
      rel_hdr = d->rel.hdr;
3371
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
3372
      rel_hdr2 = d->rela.hdr;
3373
      reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
3374
 
3375
      BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
3376
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
3377
                  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
3378
 
3379
    }
3380
  else
3381
    {
3382
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
3383
         case because relocations against this section may use the
3384
         dynamic symbol table, and in that case bfd_section_from_shdr
3385
         in elf.c does not update the RELOC_COUNT.  */
3386
      if (asect->size == 0)
3387
        return TRUE;
3388
 
3389
      rel_hdr = &d->this_hdr;
3390
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
3391
      rel_hdr2 = NULL;
3392
      reloc_count2 = 0;
3393
    }
3394
 
3395
  /* Allocate space for 3 arelent structures for each Rel structure.  */
3396
  amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent);
3397
  relents = bfd_alloc (abfd, amt);
3398
  if (relents == NULL)
3399
    return FALSE;
3400
 
3401
  /* The slurp_one_reloc_table routine increments reloc_count.  */
3402
  asect->reloc_count = 0;
3403
 
3404
  if (rel_hdr != NULL
3405
      && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
3406
                                             rel_hdr, reloc_count,
3407
                                             relents,
3408
                                             symbols, dynamic))
3409
    return FALSE;
3410
  if (rel_hdr2 != NULL
3411
      && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
3412
                                             rel_hdr2, reloc_count2,
3413
                                             relents + reloc_count * 3,
3414
                                             symbols, dynamic))
3415
    return FALSE;
3416
 
3417
  asect->relocation = relents;
3418
  return TRUE;
3419
}
3420
 
3421
/* Write out the relocations.  */
3422
 
3423
static void
3424
mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
3425
{
3426
  bfd_boolean *failedp = data;
3427
  int count;
3428
  Elf_Internal_Shdr *rel_hdr;
3429
  unsigned int idx;
3430
 
3431
  /* If we have already failed, don't do anything.  */
3432
  if (*failedp)
3433
    return;
3434
 
3435
  if ((sec->flags & SEC_RELOC) == 0)
3436
    return;
3437
 
3438
  /* The linker backend writes the relocs out itself, and sets the
3439
     reloc_count field to zero to inhibit writing them here.  Also,
3440
     sometimes the SEC_RELOC flag gets set even when there aren't any
3441
     relocs.  */
3442
  if (sec->reloc_count == 0)
3443
    return;
3444
 
3445
  /* We can combine up to three relocs that refer to the same address
3446
     if the latter relocs have no associated symbol.  */
3447
  count = 0;
3448
  for (idx = 0; idx < sec->reloc_count; idx++)
3449
    {
3450
      bfd_vma addr;
3451
      unsigned int i;
3452
 
3453
      ++count;
3454
 
3455
      addr = sec->orelocation[idx]->address;
3456
      for (i = 0; i < 2; i++)
3457
        {
3458
          arelent *r;
3459
 
3460
          if (idx + 1 >= sec->reloc_count)
3461
            break;
3462
          r = sec->orelocation[idx + 1];
3463
          if (r->address != addr
3464
              || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
3465
              || (*r->sym_ptr_ptr)->value != 0)
3466
            break;
3467
 
3468
          /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
3469
 
3470
          ++idx;
3471
        }
3472
    }
3473
 
3474
  rel_hdr = _bfd_elf_single_rel_hdr (sec);
3475
 
3476
  /* Do the actual relocation.  */
3477
 
3478
  if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
3479
    mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
3480
  else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
3481
    mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
3482
  else
3483
    BFD_ASSERT (0);
3484
}
3485
 
3486
static void
3487
mips_elf64_write_rel (bfd *abfd, asection *sec,
3488
                      Elf_Internal_Shdr *rel_hdr,
3489
                      int *count, void *data)
3490
{
3491
  bfd_boolean *failedp = data;
3492
  Elf64_Mips_External_Rel *ext_rel;
3493
  unsigned int idx;
3494
  asymbol *last_sym = 0;
3495
  int last_sym_idx = 0;
3496
 
3497
  rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
3498
  rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
3499
  if (rel_hdr->contents == NULL)
3500
    {
3501
      *failedp = TRUE;
3502
      return;
3503
    }
3504
 
3505
  ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
3506
  for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
3507
    {
3508
      arelent *ptr;
3509
      Elf64_Mips_Internal_Rela int_rel;
3510
      asymbol *sym;
3511
      int n;
3512
      unsigned int i;
3513
 
3514
      ptr = sec->orelocation[idx];
3515
 
3516
      /* The address of an ELF reloc is section relative for an object
3517
         file, and absolute for an executable file or shared library.
3518
         The address of a BFD reloc is always section relative.  */
3519
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
3520
        int_rel.r_offset = ptr->address;
3521
      else
3522
        int_rel.r_offset = ptr->address + sec->vma;
3523
 
3524
      sym = *ptr->sym_ptr_ptr;
3525
      if (sym == last_sym)
3526
        n = last_sym_idx;
3527
      else if (bfd_is_abs_section (sym->section) && sym->value == 0)
3528
        n = STN_UNDEF;
3529
      else
3530
        {
3531
          last_sym = sym;
3532
          n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
3533
          if (n < 0)
3534
            {
3535
              *failedp = TRUE;
3536
              return;
3537
            }
3538
          last_sym_idx = n;
3539
        }
3540
 
3541
      int_rel.r_sym = n;
3542
      int_rel.r_ssym = RSS_UNDEF;
3543
 
3544
      if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
3545
          && ! _bfd_elf_validate_reloc (abfd, ptr))
3546
        {
3547
          *failedp = TRUE;
3548
          return;
3549
        }
3550
 
3551
      int_rel.r_type = ptr->howto->type;
3552
      int_rel.r_type2 = (int) R_MIPS_NONE;
3553
      int_rel.r_type3 = (int) R_MIPS_NONE;
3554
 
3555
      for (i = 0; i < 2; i++)
3556
        {
3557
          arelent *r;
3558
 
3559
          if (idx + 1 >= sec->reloc_count)
3560
            break;
3561
          r = sec->orelocation[idx + 1];
3562
          if (r->address != ptr->address
3563
              || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
3564
              || (*r->sym_ptr_ptr)->value != 0)
3565
            break;
3566
 
3567
          /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
3568
 
3569
          if (i == 0)
3570
            int_rel.r_type2 = r->howto->type;
3571
          else
3572
            int_rel.r_type3 = r->howto->type;
3573
 
3574
          ++idx;
3575
        }
3576
 
3577
      mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
3578
    }
3579
 
3580
  BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
3581
              == *count);
3582
}
3583
 
3584
static void
3585
mips_elf64_write_rela (bfd *abfd, asection *sec,
3586
                       Elf_Internal_Shdr *rela_hdr,
3587
                       int *count, void *data)
3588
{
3589
  bfd_boolean *failedp = data;
3590
  Elf64_Mips_External_Rela *ext_rela;
3591
  unsigned int idx;
3592
  asymbol *last_sym = 0;
3593
  int last_sym_idx = 0;
3594
 
3595
  rela_hdr->sh_size = rela_hdr->sh_entsize * *count;
3596
  rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
3597
  if (rela_hdr->contents == NULL)
3598
    {
3599
      *failedp = TRUE;
3600
      return;
3601
    }
3602
 
3603
  ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
3604
  for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
3605
    {
3606
      arelent *ptr;
3607
      Elf64_Mips_Internal_Rela int_rela;
3608
      asymbol *sym;
3609
      int n;
3610
      unsigned int i;
3611
 
3612
      ptr = sec->orelocation[idx];
3613
 
3614
      /* The address of an ELF reloc is section relative for an object
3615
         file, and absolute for an executable file or shared library.
3616
         The address of a BFD reloc is always section relative.  */
3617
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
3618
        int_rela.r_offset = ptr->address;
3619
      else
3620
        int_rela.r_offset = ptr->address + sec->vma;
3621
 
3622
      sym = *ptr->sym_ptr_ptr;
3623
      if (sym == last_sym)
3624
        n = last_sym_idx;
3625
      else if (bfd_is_abs_section (sym->section) && sym->value == 0)
3626
        n = STN_UNDEF;
3627
      else
3628
        {
3629
          last_sym = sym;
3630
          n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
3631
          if (n < 0)
3632
            {
3633
              *failedp = TRUE;
3634
              return;
3635
            }
3636
          last_sym_idx = n;
3637
        }
3638
 
3639
      int_rela.r_sym = n;
3640
      int_rela.r_addend = ptr->addend;
3641
      int_rela.r_ssym = RSS_UNDEF;
3642
 
3643
      if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
3644
          && ! _bfd_elf_validate_reloc (abfd, ptr))
3645
        {
3646
          *failedp = TRUE;
3647
          return;
3648
        }
3649
 
3650
      int_rela.r_type = ptr->howto->type;
3651
      int_rela.r_type2 = (int) R_MIPS_NONE;
3652
      int_rela.r_type3 = (int) R_MIPS_NONE;
3653
 
3654
      for (i = 0; i < 2; i++)
3655
        {
3656
          arelent *r;
3657
 
3658
          if (idx + 1 >= sec->reloc_count)
3659
            break;
3660
          r = sec->orelocation[idx + 1];
3661
          if (r->address != ptr->address
3662
              || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
3663
              || (*r->sym_ptr_ptr)->value != 0)
3664
            break;
3665
 
3666
          /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
3667
 
3668
          if (i == 0)
3669
            int_rela.r_type2 = r->howto->type;
3670
          else
3671
            int_rela.r_type3 = r->howto->type;
3672
 
3673
          ++idx;
3674
        }
3675
 
3676
      mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
3677
    }
3678
 
3679
  BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
3680
              == *count);
3681
}
3682
 
3683
/* Set the right machine number for a MIPS ELF file.  */
3684
 
3685
static bfd_boolean
3686
mips_elf64_object_p (bfd *abfd)
3687
{
3688
  unsigned long mach;
3689
 
3690
  /* Irix 6 is broken.  Object file symbol tables are not always
3691
     sorted correctly such that local symbols precede global symbols,
3692
     and the sh_info field in the symbol table is not always right.  */
3693
  if (elf64_mips_irix_compat (abfd) != ict_none)
3694
    elf_bad_symtab (abfd) = TRUE;
3695
 
3696
  mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
3697
  bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
3698
  return TRUE;
3699
}
3700
 
3701
/* Depending on the target vector we generate some version of Irix
3702
   executables or "normal" MIPS ELF ABI executables.  */
3703
static irix_compat_t
3704
elf64_mips_irix_compat (bfd *abfd)
3705
{
3706
  if ((abfd->xvec == &bfd_elf64_bigmips_vec)
3707
      || (abfd->xvec == &bfd_elf64_littlemips_vec))
3708
    return ict_irix6;
3709
  else
3710
    return ict_none;
3711
}
3712
 
3713
/* Support for core dump NOTE sections.  */
3714
static bfd_boolean
3715
elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3716
{
3717
  int offset;
3718
  unsigned int size;
3719
 
3720
  switch (note->descsz)
3721
    {
3722
      default:
3723
        return FALSE;
3724
 
3725
      case 480:         /* Linux/MIPS - N64 kernel */
3726
        /* pr_cursig */
3727
        elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
3728
 
3729
        /* pr_pid */
3730
        elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32);
3731
 
3732
        /* pr_reg */
3733
        offset = 112;
3734
        size = 360;
3735
 
3736
        break;
3737
    }
3738
 
3739
  /* Make a ".reg/999" section.  */
3740
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3741
                                          size, note->descpos + offset);
3742
}
3743
 
3744
static bfd_boolean
3745
elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3746
{
3747
  switch (note->descsz)
3748
    {
3749
      default:
3750
        return FALSE;
3751
 
3752
      case 136:         /* Linux/MIPS - N64 kernel elf_prpsinfo */
3753
        elf_tdata (abfd)->core_program
3754
         = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
3755
        elf_tdata (abfd)->core_command
3756
         = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
3757
    }
3758
 
3759
  /* Note that for some reason, a spurious space is tacked
3760
     onto the end of the args in some (at least one anyway)
3761
     implementations, so strip it off if it exists.  */
3762
 
3763
  {
3764
    char *command = elf_tdata (abfd)->core_command;
3765
    int n = strlen (command);
3766
 
3767
    if (0 < n && command[n - 1] == ' ')
3768
      command[n - 1] = '\0';
3769
  }
3770
 
3771
  return TRUE;
3772
}
3773
 
3774
/* ECOFF swapping routines.  These are used when dealing with the
3775
   .mdebug section, which is in the ECOFF debugging format.  */
3776
static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
3777
{
3778
  /* Symbol table magic number.  */
3779
  magicSym2,
3780
  /* Alignment of debugging information.  E.g., 4.  */
3781
  8,
3782
  /* Sizes of external symbolic information.  */
3783
  sizeof (struct hdr_ext),
3784
  sizeof (struct dnr_ext),
3785
  sizeof (struct pdr_ext),
3786
  sizeof (struct sym_ext),
3787
  sizeof (struct opt_ext),
3788
  sizeof (struct fdr_ext),
3789
  sizeof (struct rfd_ext),
3790
  sizeof (struct ext_ext),
3791
  /* Functions to swap in external symbolic data.  */
3792
  ecoff_swap_hdr_in,
3793
  ecoff_swap_dnr_in,
3794
  ecoff_swap_pdr_in,
3795
  ecoff_swap_sym_in,
3796
  ecoff_swap_opt_in,
3797
  ecoff_swap_fdr_in,
3798
  ecoff_swap_rfd_in,
3799
  ecoff_swap_ext_in,
3800
  _bfd_ecoff_swap_tir_in,
3801
  _bfd_ecoff_swap_rndx_in,
3802
  /* Functions to swap out external symbolic data.  */
3803
  ecoff_swap_hdr_out,
3804
  ecoff_swap_dnr_out,
3805
  ecoff_swap_pdr_out,
3806
  ecoff_swap_sym_out,
3807
  ecoff_swap_opt_out,
3808
  ecoff_swap_fdr_out,
3809
  ecoff_swap_rfd_out,
3810
  ecoff_swap_ext_out,
3811
  _bfd_ecoff_swap_tir_out,
3812
  _bfd_ecoff_swap_rndx_out,
3813
  /* Function to read in symbolic data.  */
3814
  _bfd_mips_elf_read_ecoff_info
3815
};
3816
 
3817
/* Relocations in the 64 bit MIPS ELF ABI are more complex than in
3818
   standard ELF.  This structure is used to redirect the relocation
3819
   handling routines.  */
3820
 
3821
const struct elf_size_info mips_elf64_size_info =
3822
{
3823
  sizeof (Elf64_External_Ehdr),
3824
  sizeof (Elf64_External_Phdr),
3825
  sizeof (Elf64_External_Shdr),
3826
  sizeof (Elf64_Mips_External_Rel),
3827
  sizeof (Elf64_Mips_External_Rela),
3828
  sizeof (Elf64_External_Sym),
3829
  sizeof (Elf64_External_Dyn),
3830
  sizeof (Elf_External_Note),
3831
  4,            /* hash-table entry size */
3832
  3,            /* internal relocations per external relocations */
3833
  64,           /* arch_size */
3834
  3,            /* log_file_align */
3835
  ELFCLASS64,
3836
  EV_CURRENT,
3837
  bfd_elf64_write_out_phdrs,
3838
  bfd_elf64_write_shdrs_and_ehdr,
3839
  bfd_elf64_checksum_contents,
3840
  mips_elf64_write_relocs,
3841
  bfd_elf64_swap_symbol_in,
3842
  bfd_elf64_swap_symbol_out,
3843
  mips_elf64_slurp_reloc_table,
3844
  bfd_elf64_slurp_symbol_table,
3845
  bfd_elf64_swap_dyn_in,
3846
  bfd_elf64_swap_dyn_out,
3847
  mips_elf64_be_swap_reloc_in,
3848
  mips_elf64_be_swap_reloc_out,
3849
  mips_elf64_be_swap_reloca_in,
3850
  mips_elf64_be_swap_reloca_out
3851
};
3852
 
3853
#define ELF_ARCH                        bfd_arch_mips
3854
#define ELF_TARGET_ID                   MIPS_ELF_DATA
3855
#define ELF_MACHINE_CODE                EM_MIPS
3856
 
3857
#define elf_backend_collect             TRUE
3858
#define elf_backend_type_change_ok      TRUE
3859
#define elf_backend_can_gc_sections     TRUE
3860
#define elf_info_to_howto               mips_elf64_info_to_howto_rela
3861
#define elf_info_to_howto_rel           mips_elf64_info_to_howto_rel
3862
#define elf_backend_object_p            mips_elf64_object_p
3863
#define elf_backend_symbol_processing   _bfd_mips_elf_symbol_processing
3864
#define elf_backend_section_processing  _bfd_mips_elf_section_processing
3865
#define elf_backend_section_from_shdr   _bfd_mips_elf_section_from_shdr
3866
#define elf_backend_fake_sections       _bfd_mips_elf_fake_sections
3867
#define elf_backend_section_from_bfd_section \
3868
                                _bfd_mips_elf_section_from_bfd_section
3869
#define elf_backend_add_symbol_hook     _bfd_mips_elf_add_symbol_hook
3870
#define elf_backend_link_output_symbol_hook \
3871
                                _bfd_mips_elf_link_output_symbol_hook
3872
#define elf_backend_create_dynamic_sections \
3873
                                _bfd_mips_elf_create_dynamic_sections
3874
#define elf_backend_check_relocs        _bfd_mips_elf_check_relocs
3875
#define elf_backend_merge_symbol_attribute \
3876
                                _bfd_mips_elf_merge_symbol_attribute
3877
#define elf_backend_get_target_dtag     _bfd_mips_elf_get_target_dtag
3878
#define elf_backend_adjust_dynamic_symbol \
3879
                                _bfd_mips_elf_adjust_dynamic_symbol
3880
#define elf_backend_always_size_sections \
3881
                                _bfd_mips_elf_always_size_sections
3882
#define elf_backend_size_dynamic_sections \
3883
                                _bfd_mips_elf_size_dynamic_sections
3884
#define elf_backend_init_index_section  _bfd_elf_init_1_index_section
3885
#define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
3886
#define elf_backend_finish_dynamic_symbol \
3887
                                _bfd_mips_elf_finish_dynamic_symbol
3888
#define elf_backend_finish_dynamic_sections \
3889
                                _bfd_mips_elf_finish_dynamic_sections
3890
#define elf_backend_final_write_processing \
3891
                                _bfd_mips_elf_final_write_processing
3892
#define elf_backend_additional_program_headers \
3893
                                _bfd_mips_elf_additional_program_headers
3894
#define elf_backend_modify_segment_map  _bfd_mips_elf_modify_segment_map
3895
#define elf_backend_gc_mark_hook        _bfd_mips_elf_gc_mark_hook
3896
#define elf_backend_gc_sweep_hook       _bfd_mips_elf_gc_sweep_hook
3897
#define elf_backend_copy_indirect_symbol \
3898
                                        _bfd_mips_elf_copy_indirect_symbol
3899
#define elf_backend_ignore_discarded_relocs \
3900
                                        _bfd_mips_elf_ignore_discarded_relocs
3901
#define elf_backend_mips_irix_compat    elf64_mips_irix_compat
3902
#define elf_backend_mips_rtype_to_howto mips_elf64_rtype_to_howto
3903
#define elf_backend_ecoff_debug_swap    &mips_elf64_ecoff_debug_swap
3904
#define elf_backend_size_info           mips_elf64_size_info
3905
 
3906
#define elf_backend_grok_prstatus       elf64_mips_grok_prstatus
3907
#define elf_backend_grok_psinfo         elf64_mips_grok_psinfo
3908
 
3909
#define elf_backend_got_header_size     (4 * MIPS_RESERVED_GOTNO)
3910
 
3911
/* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
3912
   work better/work only in RELA, so we default to this.  */
3913
#define elf_backend_may_use_rel_p       1
3914
#define elf_backend_may_use_rela_p      1
3915
#define elf_backend_default_use_rela_p  1
3916
#define elf_backend_rela_plts_and_copies_p 0
3917
#define elf_backend_plt_readonly        1
3918
#define elf_backend_plt_sym_val         _bfd_mips_elf_plt_sym_val
3919
 
3920
#define elf_backend_sign_extend_vma     TRUE
3921
 
3922
#define elf_backend_write_section       _bfd_mips_elf_write_section
3923
 
3924
/* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit
3925
   MIPS-specific function only applies to IRIX5, which had no 64-bit
3926
   ABI.  */
3927 161 khays
#define bfd_elf64_bfd_is_target_special_symbol \
3928
                                        _bfd_mips_elf_is_target_special_symbol
3929 14 khays
#define bfd_elf64_find_nearest_line     _bfd_mips_elf_find_nearest_line
3930
#define bfd_elf64_find_inliner_info     _bfd_mips_elf_find_inliner_info
3931
#define bfd_elf64_new_section_hook      _bfd_mips_elf_new_section_hook
3932
#define bfd_elf64_set_section_contents  _bfd_mips_elf_set_section_contents
3933
#define bfd_elf64_bfd_get_relocated_section_contents \
3934
                                _bfd_elf_mips_get_relocated_section_contents
3935
#define bfd_elf64_bfd_link_hash_table_create \
3936
                                _bfd_mips_elf_link_hash_table_create
3937
#define bfd_elf64_bfd_final_link        _bfd_mips_elf_final_link
3938
#define bfd_elf64_bfd_merge_private_bfd_data \
3939
                                _bfd_mips_elf_merge_private_bfd_data
3940
#define bfd_elf64_bfd_set_private_flags _bfd_mips_elf_set_private_flags
3941
#define bfd_elf64_bfd_print_private_bfd_data \
3942
                                _bfd_mips_elf_print_private_bfd_data
3943
 
3944
#define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound
3945
#define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc
3946
#define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
3947
#define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc
3948
#define bfd_elf64_bfd_relax_section     _bfd_mips_relax_section
3949
 
3950
/* MIPS ELF64 archive functions.  */
3951
#define bfd_elf64_archive_functions
3952
extern bfd_boolean bfd_elf64_archive_slurp_armap
3953
  (bfd *);
3954
extern bfd_boolean bfd_elf64_archive_write_armap
3955
  (bfd *, unsigned int, struct orl *, unsigned int, int);
3956
#define bfd_elf64_archive_slurp_extended_name_table \
3957
                        _bfd_archive_coff_slurp_extended_name_table
3958
#define bfd_elf64_archive_construct_extended_name_table \
3959
                        _bfd_archive_coff_construct_extended_name_table
3960
#define bfd_elf64_archive_truncate_arname \
3961
                        _bfd_archive_coff_truncate_arname
3962
#define bfd_elf64_archive_read_ar_hdr   _bfd_archive_coff_read_ar_hdr
3963
#define bfd_elf64_archive_write_ar_hdr  _bfd_archive_coff_write_ar_hdr
3964
#define bfd_elf64_archive_openr_next_archived_file \
3965
                        _bfd_archive_coff_openr_next_archived_file
3966
#define bfd_elf64_archive_get_elt_at_index \
3967
                        _bfd_archive_coff_get_elt_at_index
3968
#define bfd_elf64_archive_generic_stat_arch_elt \
3969
                        _bfd_archive_coff_generic_stat_arch_elt
3970
#define bfd_elf64_archive_update_armap_timestamp \
3971
                        _bfd_archive_coff_update_armap_timestamp
3972
 
3973
/* The SGI style (n)64 NewABI.  */
3974
#define TARGET_LITTLE_SYM               bfd_elf64_littlemips_vec
3975
#define TARGET_LITTLE_NAME              "elf64-littlemips"
3976
#define TARGET_BIG_SYM                  bfd_elf64_bigmips_vec
3977
#define TARGET_BIG_NAME                 "elf64-bigmips"
3978
 
3979
#define ELF_MAXPAGESIZE                 0x10000
3980
#define ELF_COMMONPAGESIZE              0x1000
3981
 
3982
#include "elf64-target.h"
3983
 
3984
/* The SYSV-style 'traditional' (n)64 NewABI.  */
3985
#undef TARGET_LITTLE_SYM
3986
#undef TARGET_LITTLE_NAME
3987
#undef TARGET_BIG_SYM
3988
#undef TARGET_BIG_NAME
3989
 
3990
#undef ELF_MAXPAGESIZE
3991
#undef ELF_COMMONPAGESIZE
3992
 
3993
#define TARGET_LITTLE_SYM               bfd_elf64_tradlittlemips_vec
3994
#define TARGET_LITTLE_NAME              "elf64-tradlittlemips"
3995
#define TARGET_BIG_SYM                  bfd_elf64_tradbigmips_vec
3996
#define TARGET_BIG_NAME                 "elf64-tradbigmips"
3997
 
3998
#define ELF_MAXPAGESIZE                 0x10000
3999
#define ELF_COMMONPAGESIZE              0x1000
4000
#define elf64_bed                       elf64_tradbed
4001
 
4002
/* Include the target file again for this target.  */
4003
#include "elf64-target.h"
4004
 
4005
 
4006
/* FreeBSD support.  */
4007
 
4008
#undef TARGET_LITTLE_SYM
4009
#undef TARGET_LITTLE_NAME
4010
#undef TARGET_BIG_SYM
4011
#undef TARGET_BIG_NAME
4012
 
4013
#define TARGET_LITTLE_SYM               bfd_elf64_tradlittlemips_freebsd_vec
4014
#define TARGET_LITTLE_NAME              "elf64-tradlittlemips-freebsd"
4015
#define TARGET_BIG_SYM                  bfd_elf64_tradbigmips_freebsd_vec
4016
#define TARGET_BIG_NAME                 "elf64-tradbigmips-freebsd"
4017
 
4018
#undef  ELF_OSABI
4019
#define ELF_OSABI                       ELFOSABI_FREEBSD
4020
 
4021
/* The kernel recognizes executables as valid only if they carry a
4022
   "FreeBSD" label in the ELF header.  So we put this label on all
4023
   executables and (for simplicity) also all other object files.  */
4024
 
4025
static void
4026
elf_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
4027
{
4028
  _bfd_elf_set_osabi (abfd, info);
4029
}
4030
 
4031
#undef  elf_backend_post_process_headers
4032
#define elf_backend_post_process_headers        elf_fbsd_post_process_headers
4033
#undef  elf64_bed
4034
#define elf64_bed                               elf64_fbsd_tradbed
4035
 
4036
#include "elf64-target.h"

powered by: WebSVN 2.1.0

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