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

Subversion Repositories or1k

[/] [or1k/] [tags/] [final_interface/] [gdb-5.0/] [bfd/] [elf64-mips.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* MIPS-specific support for 64-bit ELF
2
   Copyright 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
3
   Ian Lance Taylor, Cygnus Support
4
   Linker support added by Mark Mitchell, CodeSourcery, LLC.
5
   <mark@codesourcery.com>
6
 
7
This file is part of BFD, the Binary File Descriptor library.
8
 
9
This program is free software; you can redistribute it and/or modify
10
it under the terms of the GNU General Public License as published by
11
the Free Software Foundation; either version 2 of the License, or
12
(at your option) any later version.
13
 
14
This program is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
GNU General Public License for more details.
18
 
19
You should have received a copy of the GNU General Public License
20
along with this program; if not, write to the Free Software
21
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22
 
23
/* This file supports the 64-bit MIPS ELF ABI.
24
 
25
   The MIPS 64-bit ELF ABI uses an unusual reloc format.  This file
26
   overrides the usual ELF reloc handling, and handles reading and
27
   writing the relocations here.
28
 
29
   The MIPS 64-bit ELF ABI also uses an unusual archive map format.  */
30
 
31
#include "bfd.h"
32
#include "sysdep.h"
33
#include "libbfd.h"
34
#include "aout/ar.h"
35
#include "bfdlink.h"
36
#include "genlink.h"
37
#include "elf-bfd.h"
38
#include "elf/mips.h"
39
 
40
/* Get the ECOFF swapping routines.  The 64-bit ABI is not supposed to
41
   use ECOFF.  However, we support it anyhow for an easier changeover.  */
42
#include "coff/sym.h"
43
#include "coff/symconst.h"
44
#include "coff/internal.h"
45
#include "coff/ecoff.h"
46
/* The 64 bit versions of the mdebug data structures are in alpha.h.  */
47
#include "coff/alpha.h"
48
#define ECOFF_64
49
#include "ecoffswap.h"
50
 
51
static void mips_elf64_swap_reloc_in
52
  PARAMS ((bfd *, const Elf64_Mips_External_Rel *,
53
           Elf64_Mips_Internal_Rel *));
54
static void mips_elf64_swap_reloca_in
55
  PARAMS ((bfd *, const Elf64_Mips_External_Rela *,
56
           Elf64_Mips_Internal_Rela *));
57
static void mips_elf64_swap_reloc_out
58
  PARAMS ((bfd *, const Elf64_Mips_Internal_Rel *,
59
           Elf64_Mips_External_Rel *));
60
static void mips_elf64_swap_reloca_out
61
  PARAMS ((bfd *, const Elf64_Mips_Internal_Rela *,
62
           Elf64_Mips_External_Rela *));
63
static void mips_elf64_be_swap_reloc_in
64
  PARAMS ((bfd *, const bfd_byte *, Elf_Internal_Rel *));
65
static void mips_elf64_be_swap_reloc_out
66
  PARAMS ((bfd *, const Elf_Internal_Rel *, bfd_byte *));
67
static void mips_elf64_be_swap_reloca_in
68
  PARAMS ((bfd *, const bfd_byte *, Elf_Internal_Rela *));
69
static void mips_elf64_be_swap_reloca_out
70
  PARAMS ((bfd *, const Elf_Internal_Rela *, bfd_byte *));
71
static reloc_howto_type *mips_elf64_reloc_type_lookup
72
  PARAMS ((bfd *, bfd_reloc_code_real_type));
73
static long mips_elf64_get_reloc_upper_bound PARAMS ((bfd *, asection *));
74
static boolean mips_elf64_slurp_one_reloc_table
75
  PARAMS ((bfd *, asection *, asymbol **, const Elf_Internal_Shdr *));
76
static boolean mips_elf64_slurp_reloc_table
77
  PARAMS ((bfd *, asection *, asymbol **, boolean));
78
static void mips_elf64_write_relocs PARAMS ((bfd *, asection *, PTR));
79
static boolean mips_elf64_slurp_armap PARAMS ((bfd *));
80
static boolean mips_elf64_write_armap
81
  PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int));
82
 
83
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
84
   from smaller values.  Start with zero, widen, *then* decrement.  */
85
#define MINUS_ONE       (((bfd_vma)0) - 1)
86
 
87
/* The number of local .got entries we reserve.  */
88
#define MIPS_RESERVED_GOTNO (2)
89
 
90
/* The relocation table used for SHT_REL sections.  */
91
 
92
static reloc_howto_type mips_elf64_howto_table_rel[] =
93
{
94
  /* No relocation.  */
95
  HOWTO (R_MIPS_NONE,           /* type */
96
         0,                      /* rightshift */
97
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
98
         0,                      /* bitsize */
99
         false,                 /* pc_relative */
100
         0,                      /* bitpos */
101
         complain_overflow_dont, /* complain_on_overflow */
102
         bfd_elf_generic_reloc, /* special_function */
103
         "R_MIPS_NONE",         /* name */
104
         false,                 /* partial_inplace */
105
         0,                      /* src_mask */
106
         0,                      /* dst_mask */
107
         false),                /* pcrel_offset */
108
 
109
  /* 16 bit relocation.  */
110
  HOWTO (R_MIPS_16,             /* type */
111
         0,                      /* rightshift */
112
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
113
         16,                    /* bitsize */
114
         false,                 /* pc_relative */
115
         0,                      /* bitpos */
116
         complain_overflow_bitfield, /* complain_on_overflow */
117
         bfd_elf_generic_reloc, /* special_function */
118
         "R_MIPS_16",           /* name */
119
         true,                  /* partial_inplace */
120
         0xffff,                /* src_mask */
121
         0xffff,                /* dst_mask */
122
         false),                /* pcrel_offset */
123
 
124
  /* 32 bit relocation.  */
125
  HOWTO (R_MIPS_32,             /* type */
126
         0,                      /* rightshift */
127
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
128
         32,                    /* bitsize */
129
         false,                 /* pc_relative */
130
         0,                      /* bitpos */
131
         complain_overflow_bitfield, /* complain_on_overflow */
132
         bfd_elf_generic_reloc, /* special_function */
133
         "R_MIPS_32",           /* name */
134
         true,                  /* partial_inplace */
135
         0xffffffff,            /* src_mask */
136
         0xffffffff,            /* dst_mask */
137
         false),                /* pcrel_offset */
138
 
139
  /* 32 bit symbol relative relocation.  */
140
  HOWTO (R_MIPS_REL32,          /* type */
141
         0,                      /* rightshift */
142
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
143
         32,                    /* bitsize */
144
         false,                 /* pc_relative */
145
         0,                      /* bitpos */
146
         complain_overflow_bitfield, /* complain_on_overflow */
147
         bfd_elf_generic_reloc, /* special_function */
148
         "R_MIPS_REL32",        /* name */
149
         true,                  /* partial_inplace */
150
         0xffffffff,            /* src_mask */
151
         0xffffffff,            /* dst_mask */
152
         false),                /* pcrel_offset */
153
 
154
  /* 26 bit branch address.  */
155
  HOWTO (R_MIPS_26,             /* type */
156
         2,                     /* rightshift */
157
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
158
         26,                    /* bitsize */
159
         false,                 /* pc_relative */
160
         0,                      /* bitpos */
161
         complain_overflow_dont, /* complain_on_overflow */
162
                                /* This needs complex overflow
163
                                   detection, because the upper four
164
                                   bits must match the PC.  */
165
         bfd_elf_generic_reloc, /* special_function */
166
         "R_MIPS_26",           /* name */
167
         true,                  /* partial_inplace */
168
         0x3ffffff,             /* src_mask */
169
         0x3ffffff,             /* dst_mask */
170
         false),                /* pcrel_offset */
171
 
172
  /* High 16 bits of symbol value.  */
173
  HOWTO (R_MIPS_HI16,           /* type */
174
         0,                      /* rightshift */
175
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
176
         16,                    /* bitsize */
177
         false,                 /* pc_relative */
178
         0,                      /* bitpos */
179
         complain_overflow_dont, /* complain_on_overflow */
180
         _bfd_mips_elf_hi16_reloc,      /* special_function */
181
         "R_MIPS_HI16",         /* name */
182
         true,                  /* partial_inplace */
183
         0xffff,                /* src_mask */
184
         0xffff,                /* dst_mask */
185
         false),                /* pcrel_offset */
186
 
187
  /* Low 16 bits of symbol value.  */
188
  HOWTO (R_MIPS_LO16,           /* type */
189
         0,                      /* rightshift */
190
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
191
         16,                    /* bitsize */
192
         false,                 /* pc_relative */
193
         0,                      /* bitpos */
194
         complain_overflow_dont, /* complain_on_overflow */
195
         _bfd_mips_elf_lo16_reloc,      /* special_function */
196
         "R_MIPS_LO16",         /* name */
197
         true,                  /* partial_inplace */
198
         0xffff,                /* src_mask */
199
         0xffff,                /* dst_mask */
200
         false),                /* pcrel_offset */
201
 
202
  /* GP relative reference.  */
203
  HOWTO (R_MIPS_GPREL16,        /* type */
204
         0,                      /* rightshift */
205
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
206
         16,                    /* bitsize */
207
         false,                 /* pc_relative */
208
         0,                      /* bitpos */
209
         complain_overflow_signed, /* complain_on_overflow */
210
         _bfd_mips_elf_gprel16_reloc, /* special_function */
211
         "R_MIPS_GPREL16",      /* name */
212
         true,                  /* partial_inplace */
213
         0xffff,                /* src_mask */
214
         0xffff,                /* dst_mask */
215
         false),                /* pcrel_offset */
216
 
217
  /* Reference to literal section.  */
218
  HOWTO (R_MIPS_LITERAL,        /* type */
219
         0,                      /* rightshift */
220
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
221
         16,                    /* bitsize */
222
         false,                 /* pc_relative */
223
         0,                      /* bitpos */
224
         complain_overflow_signed, /* complain_on_overflow */
225
         _bfd_mips_elf_gprel16_reloc, /* special_function */
226
         "R_MIPS_LITERAL",      /* name */
227
         true,                  /* partial_inplace */
228
         0xffff,                /* src_mask */
229
         0xffff,                /* dst_mask */
230
         false),                /* pcrel_offset */
231
 
232
  /* Reference to global offset table.  */
233
  HOWTO (R_MIPS_GOT16,          /* type */
234
         0,                      /* rightshift */
235
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
236
         16,                    /* bitsize */
237
         false,                 /* pc_relative */
238
         0,                      /* bitpos */
239
         complain_overflow_signed, /* complain_on_overflow */
240
         _bfd_mips_elf_got16_reloc,     /* special_function */
241
         "R_MIPS_GOT16",        /* name */
242
         false,                 /* partial_inplace */
243
         0,                      /* src_mask */
244
         0xffff,                /* dst_mask */
245
         false),                /* pcrel_offset */
246
 
247
  /* 16 bit PC relative reference.  */
248
  HOWTO (R_MIPS_PC16,           /* type */
249
         0,                      /* rightshift */
250
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
251
         16,                    /* bitsize */
252
         true,                  /* pc_relative */
253
         0,                      /* bitpos */
254
         complain_overflow_signed, /* complain_on_overflow */
255
         bfd_elf_generic_reloc, /* special_function */
256
         "R_MIPS_PC16",         /* name */
257
         true,                  /* partial_inplace */
258
         0xffff,                /* src_mask */
259
         0xffff,                /* dst_mask */
260
         false),                /* pcrel_offset */
261
 
262
  /* 16 bit call through global offset table.  */
263
  /* FIXME: This is not handled correctly.  */
264
  HOWTO (R_MIPS_CALL16,         /* type */
265
         0,                      /* rightshift */
266
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
267
         16,                    /* bitsize */
268
         false,                 /* pc_relative */
269
         0,                      /* bitpos */
270
         complain_overflow_signed, /* complain_on_overflow */
271
         bfd_elf_generic_reloc, /* special_function */
272
         "R_MIPS_CALL16",       /* name */
273
         false,                 /* partial_inplace */
274
         0,                      /* src_mask */
275
         0xffff,                /* dst_mask */
276
         false),                /* pcrel_offset */
277
 
278
  /* 32 bit GP relative reference.  */
279
  HOWTO (R_MIPS_GPREL32,        /* type */
280
         0,                      /* rightshift */
281
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
282
         32,                    /* bitsize */
283
         false,                 /* pc_relative */
284
         0,                      /* bitpos */
285
         complain_overflow_bitfield, /* complain_on_overflow */
286
         _bfd_mips_elf_gprel32_reloc, /* special_function */
287
         "R_MIPS_GPREL32",      /* name */
288
         true,                  /* partial_inplace */
289
         0xffffffff,            /* src_mask */
290
         0xffffffff,            /* dst_mask */
291
         false),                /* pcrel_offset */
292
 
293
    { 13 },
294
    { 14 },
295
    { 15 },
296
 
297
  /* A 5 bit shift field.  */
298
  HOWTO (R_MIPS_SHIFT5,         /* type */
299
         0,                      /* rightshift */
300
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
301
         5,                     /* bitsize */
302
         false,                 /* pc_relative */
303
         6,                     /* bitpos */
304
         complain_overflow_bitfield, /* complain_on_overflow */
305
         bfd_elf_generic_reloc, /* special_function */
306
         "R_MIPS_SHIFT5",       /* name */
307
         true,                  /* partial_inplace */
308
         0x000007c0,            /* src_mask */
309
         0x000007c0,            /* dst_mask */
310
         false),                /* pcrel_offset */
311
 
312
  /* A 6 bit shift field.  */
313
  /* FIXME: This is not handled correctly; a special function is
314
     needed to put the most significant bit in the right place.  */
315
  HOWTO (R_MIPS_SHIFT6,         /* type */
316
         0,                      /* rightshift */
317
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
318
         6,                     /* bitsize */
319
         false,                 /* pc_relative */
320
         6,                     /* bitpos */
321
         complain_overflow_bitfield, /* complain_on_overflow */
322
         bfd_elf_generic_reloc, /* special_function */
323
         "R_MIPS_SHIFT6",       /* name */
324
         true,                  /* partial_inplace */
325
         0x000007c4,            /* src_mask */
326
         0x000007c4,            /* dst_mask */
327
         false),                /* pcrel_offset */
328
 
329
  /* 64 bit relocation.  */
330
  HOWTO (R_MIPS_64,             /* type */
331
         0,                      /* rightshift */
332
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
333
         64,                    /* bitsize */
334
         false,                 /* pc_relative */
335
         0,                      /* bitpos */
336
         complain_overflow_bitfield, /* complain_on_overflow */
337
         bfd_elf_generic_reloc, /* special_function */
338
         "R_MIPS_64",           /* name */
339
         true,                  /* partial_inplace */
340
         MINUS_ONE,             /* src_mask */
341
         MINUS_ONE,             /* dst_mask */
342
         false),                /* pcrel_offset */
343
 
344
  /* Displacement in the global offset table.  */
345
  /* FIXME: Not handled correctly.  */
346
  HOWTO (R_MIPS_GOT_DISP,       /* type */
347
         0,                      /* rightshift */
348
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
349
         16,                    /* bitsize */
350
         false,                 /* pc_relative */
351
         0,                      /* bitpos */
352
         complain_overflow_bitfield, /* complain_on_overflow */
353
         bfd_elf_generic_reloc, /* special_function */
354
         "R_MIPS_GOT_DISP",     /* name */
355
         true,                  /* partial_inplace */
356
         0x0000ffff,            /* src_mask */
357
         0x0000ffff,            /* dst_mask */
358
         false),                /* pcrel_offset */
359
 
360
  /* Displacement to page pointer in the global offset table.  */
361
  /* FIXME: Not handled correctly.  */
362
  HOWTO (R_MIPS_GOT_PAGE,       /* type */
363
         0,                      /* rightshift */
364
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
365
         16,                    /* bitsize */
366
         false,                 /* pc_relative */
367
         0,                      /* bitpos */
368
         complain_overflow_bitfield, /* complain_on_overflow */
369
         bfd_elf_generic_reloc, /* special_function */
370
         "R_MIPS_GOT_PAGE",     /* name */
371
         true,                  /* partial_inplace */
372
         0x0000ffff,            /* src_mask */
373
         0x0000ffff,            /* dst_mask */
374
         false),                /* pcrel_offset */
375
 
376
  /* Offset from page pointer in the global offset table.  */
377
  /* FIXME: Not handled correctly.  */
378
  HOWTO (R_MIPS_GOT_OFST,       /* type */
379
         0,                      /* rightshift */
380
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
381
         16,                    /* bitsize */
382
         false,                 /* pc_relative */
383
         0,                      /* bitpos */
384
         complain_overflow_bitfield, /* complain_on_overflow */
385
         bfd_elf_generic_reloc, /* special_function */
386
         "R_MIPS_GOT_OFST",     /* name */
387
         true,                  /* partial_inplace */
388
         0x0000ffff,            /* src_mask */
389
         0x0000ffff,            /* dst_mask */
390
         false),                /* pcrel_offset */
391
 
392
  /* High 16 bits of displacement in global offset table.  */
393
  /* FIXME: Not handled correctly.  */
394
  HOWTO (R_MIPS_GOT_HI16,       /* type */
395
         0,                      /* rightshift */
396
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
397
         16,                    /* bitsize */
398
         false,                 /* pc_relative */
399
         0,                      /* bitpos */
400
         complain_overflow_dont, /* complain_on_overflow */
401
         bfd_elf_generic_reloc, /* special_function */
402
         "R_MIPS_GOT_HI16",     /* name */
403
         true,                  /* partial_inplace */
404
         0x0000ffff,            /* src_mask */
405
         0x0000ffff,            /* dst_mask */
406
         false),                /* pcrel_offset */
407
 
408
  /* Low 16 bits of displacement in global offset table.  */
409
  /* FIXME: Not handled correctly.  */
410
  HOWTO (R_MIPS_GOT_LO16,       /* type */
411
         0,                      /* rightshift */
412
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
413
         16,                    /* bitsize */
414
         false,                 /* pc_relative */
415
         0,                      /* bitpos */
416
         complain_overflow_dont, /* complain_on_overflow */
417
         bfd_elf_generic_reloc, /* special_function */
418
         "R_MIPS_GOT_LO16",     /* name */
419
         true,                  /* partial_inplace */
420
         0x0000ffff,            /* src_mask */
421
         0x0000ffff,            /* dst_mask */
422
         false),                /* pcrel_offset */
423
 
424
  /* 64 bit substraction.  */
425
  /* FIXME: Not handled correctly.  */
426
  HOWTO (R_MIPS_SUB,            /* type */
427
         0,                      /* rightshift */
428
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
429
         64,                    /* bitsize */
430
         false,                 /* pc_relative */
431
         0,                      /* bitpos */
432
         complain_overflow_bitfield, /* complain_on_overflow */
433
         bfd_elf_generic_reloc, /* special_function */
434
         "R_MIPS_SUB",          /* name */
435
         true,                  /* partial_inplace */
436
         MINUS_ONE,             /* src_mask */
437
         MINUS_ONE,             /* dst_mask */
438
         false),                /* pcrel_offset */
439
 
440
  /* Insert the addend as an instruction.  */
441
  /* FIXME: Not handled correctly.  */
442
  HOWTO (R_MIPS_INSERT_A,       /* type */
443
         0,                      /* rightshift */
444
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
445
         0,                      /* bitsize */
446
         false,                 /* pc_relative */
447
         0,                      /* bitpos */
448
         complain_overflow_dont, /* complain_on_overflow */
449
         bfd_elf_generic_reloc, /* special_function */
450
         "R_MIPS_INSERT_A",     /* name */
451
         false,                 /* partial_inplace */
452
         0,                      /* src_mask */
453
         0,                      /* dst_mask */
454
         false),                /* pcrel_offset */
455
 
456
  /* Insert the addend as an instruction, and change all relocations
457
     to refer to the old instruction at the address.  */
458
  /* FIXME: Not handled correctly.  */
459
  HOWTO (R_MIPS_INSERT_B,       /* type */
460
         0,                      /* rightshift */
461
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
462
         0,                      /* bitsize */
463
         false,                 /* pc_relative */
464
         0,                      /* bitpos */
465
         complain_overflow_dont, /* complain_on_overflow */
466
         bfd_elf_generic_reloc, /* special_function */
467
         "R_MIPS_INSERT_B",     /* name */
468
         false,                 /* partial_inplace */
469
         0,                      /* src_mask */
470
         0,                      /* dst_mask */
471
         false),                /* pcrel_offset */
472
 
473
  /* Delete a 32 bit instruction.  */
474
  /* FIXME: Not handled correctly.  */
475
  HOWTO (R_MIPS_DELETE,         /* type */
476
         0,                      /* rightshift */
477
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
478
         0,                      /* bitsize */
479
         false,                 /* pc_relative */
480
         0,                      /* bitpos */
481
         complain_overflow_dont, /* complain_on_overflow */
482
         bfd_elf_generic_reloc, /* special_function */
483
         "R_MIPS_DELETE",       /* name */
484
         false,                 /* partial_inplace */
485
         0,                      /* src_mask */
486
         0,                      /* dst_mask */
487
         false),                /* pcrel_offset */
488
 
489
  /* Get the higher value of a 64 bit addend.  */
490
  /* FIXME: Not handled correctly.  */
491
  HOWTO (R_MIPS_HIGHER,         /* type */
492
         0,                      /* rightshift */
493
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
494
         16,                    /* bitsize */
495
         false,                 /* pc_relative */
496
         0,                      /* bitpos */
497
         complain_overflow_dont, /* complain_on_overflow */
498
         bfd_elf_generic_reloc, /* special_function */
499
         "R_MIPS_HIGHER",       /* name */
500
         true,                  /* partial_inplace */
501
         0xffff,                /* src_mask */
502
         0xffff,                /* dst_mask */
503
         false),                /* pcrel_offset */
504
 
505
  /* Get the highest value of a 64 bit addend.  */
506
  /* FIXME: Not handled correctly.  */
507
  HOWTO (R_MIPS_HIGHEST,        /* type */
508
         0,                      /* rightshift */
509
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
510
         16,                    /* bitsize */
511
         false,                 /* pc_relative */
512
         0,                      /* bitpos */
513
         complain_overflow_dont, /* complain_on_overflow */
514
         bfd_elf_generic_reloc, /* special_function */
515
         "R_MIPS_HIGHEST",      /* name */
516
         true,                  /* partial_inplace */
517
         0xffff,                /* src_mask */
518
         0xffff,                /* dst_mask */
519
         false),                /* pcrel_offset */
520
 
521
  /* High 16 bits of displacement in global offset table.  */
522
  /* FIXME: Not handled correctly.  */
523
  HOWTO (R_MIPS_CALL_HI16,      /* type */
524
         0,                      /* rightshift */
525
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
526
         16,                    /* bitsize */
527
         false,                 /* pc_relative */
528
         0,                      /* bitpos */
529
         complain_overflow_dont, /* complain_on_overflow */
530
         bfd_elf_generic_reloc, /* special_function */
531
         "R_MIPS_CALL_HI16",    /* name */
532
         true,                  /* partial_inplace */
533
         0x0000ffff,            /* src_mask */
534
         0x0000ffff,            /* dst_mask */
535
         false),                /* pcrel_offset */
536
 
537
  /* Low 16 bits of displacement in global offset table.  */
538
  /* FIXME: Not handled correctly.  */
539
  HOWTO (R_MIPS_CALL_LO16,      /* type */
540
         0,                      /* rightshift */
541
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
542
         16,                    /* bitsize */
543
         false,                 /* pc_relative */
544
         0,                      /* bitpos */
545
         complain_overflow_dont, /* complain_on_overflow */
546
         bfd_elf_generic_reloc, /* special_function */
547
         "R_MIPS_CALL_LO16",    /* name */
548
         true,                  /* partial_inplace */
549
         0x0000ffff,            /* src_mask */
550
         0x0000ffff,            /* dst_mask */
551
         false),                /* pcrel_offset */
552
 
553
  /* I'm not sure what the remaining relocs are, but they are defined
554
     on Irix 6.  */
555
 
556
  HOWTO (R_MIPS_SCN_DISP,       /* type */
557
         0,                      /* rightshift */
558
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
559
         0,                      /* bitsize */
560
         false,                 /* pc_relative */
561
         0,                      /* bitpos */
562
         complain_overflow_dont, /* complain_on_overflow */
563
         bfd_elf_generic_reloc, /* special_function */
564
         "R_MIPS_SCN_DISP",     /* name */
565
         false,                 /* partial_inplace */
566
         0,                      /* src_mask */
567
         0,                      /* dst_mask */
568
         false),                /* pcrel_offset */
569
 
570
  HOWTO (R_MIPS_REL16,          /* type */
571
         0,                      /* rightshift */
572
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
573
         0,                      /* bitsize */
574
         false,                 /* pc_relative */
575
         0,                      /* bitpos */
576
         complain_overflow_dont, /* complain_on_overflow */
577
         bfd_elf_generic_reloc, /* special_function */
578
         "R_MIPS_REL16",        /* name */
579
         false,                 /* partial_inplace */
580
         0,                      /* src_mask */
581
         0,                      /* dst_mask */
582
         false),                /* pcrel_offset */
583
 
584
  HOWTO (R_MIPS_ADD_IMMEDIATE,  /* type */
585
         0,                      /* rightshift */
586
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
587
         0,                      /* bitsize */
588
         false,                 /* pc_relative */
589
         0,                      /* bitpos */
590
         complain_overflow_dont, /* complain_on_overflow */
591
         bfd_elf_generic_reloc, /* special_function */
592
         "R_MIPS_ADD_IMMEDIATE", /* name */
593
         false,                 /* partial_inplace */
594
         0,                      /* src_mask */
595
         0,                      /* dst_mask */
596
         false),                /* pcrel_offset */
597
 
598
  HOWTO (R_MIPS_PJUMP,          /* type */
599
         0,                      /* rightshift */
600
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
601
         0,                      /* bitsize */
602
         false,                 /* pc_relative */
603
         0,                      /* bitpos */
604
         complain_overflow_dont, /* complain_on_overflow */
605
         bfd_elf_generic_reloc, /* special_function */
606
         "R_MIPS_PJUMP",        /* name */
607
         false,                 /* partial_inplace */
608
         0,                      /* src_mask */
609
         0,                      /* dst_mask */
610
         false),                /* pcrel_offset */
611
 
612
  HOWTO (R_MIPS_RELGOT,         /* type */
613
         0,                      /* rightshift */
614
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
615
         0,                      /* bitsize */
616
         false,                 /* pc_relative */
617
         0,                      /* bitpos */
618
         complain_overflow_dont, /* complain_on_overflow */
619
         bfd_elf_generic_reloc, /* special_function */
620
         "R_MIPS_RELGOT",       /* name */
621
         false,                 /* partial_inplace */
622
         0,                      /* src_mask */
623
         0,                      /* 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
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
631
         0,                      /* bitsize */
632
         false,                 /* pc_relative */
633
         0,                      /* bitpos */
634
         complain_overflow_dont, /* complain_on_overflow */
635
         bfd_elf_generic_reloc, /* special_function */
636
         "R_MIPS_JALR",         /* name */
637
         false,                 /* partial_inplace */
638
         0x00000000,            /* src_mask */
639
         0x00000000,            /* dst_mask */
640
         false),                /* pcrel_offset */
641
};
642
 
643
/* The relocation table used for SHT_RELA sections.  */
644
 
645
static reloc_howto_type mips_elf64_howto_table_rela[] =
646
{
647
  /* No relocation.  */
648
  HOWTO (R_MIPS_NONE,           /* type */
649
         0,                      /* rightshift */
650
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
651
         0,                      /* bitsize */
652
         false,                 /* pc_relative */
653
         0,                      /* bitpos */
654
         complain_overflow_dont, /* complain_on_overflow */
655
         bfd_elf_generic_reloc, /* special_function */
656
         "R_MIPS_NONE",         /* name */
657
         false,                 /* partial_inplace */
658
         0,                      /* src_mask */
659
         0,                      /* dst_mask */
660
         false),                /* pcrel_offset */
661
 
662
  /* 16 bit relocation.  */
663
  HOWTO (R_MIPS_16,             /* type */
664
         0,                      /* rightshift */
665
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
666
         16,                    /* bitsize */
667
         false,                 /* pc_relative */
668
         0,                      /* bitpos */
669
         complain_overflow_bitfield, /* complain_on_overflow */
670
         bfd_elf_generic_reloc, /* special_function */
671
         "R_MIPS_16",           /* name */
672
         true,                  /* partial_inplace */
673
         0,                      /* src_mask */
674
         0xffff,                /* dst_mask */
675
         false),                /* pcrel_offset */
676
 
677
  /* 32 bit relocation.  */
678
  HOWTO (R_MIPS_32,             /* type */
679
         0,                      /* rightshift */
680
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
681
         32,                    /* bitsize */
682
         false,                 /* pc_relative */
683
         0,                      /* bitpos */
684
         complain_overflow_bitfield, /* complain_on_overflow */
685
         bfd_elf_generic_reloc, /* special_function */
686
         "R_MIPS_32",           /* name */
687
         true,                  /* partial_inplace */
688
         0,                      /* src_mask */
689
         0xffffffff,            /* dst_mask */
690
         false),                /* pcrel_offset */
691
 
692
  /* 32 bit symbol relative relocation.  */
693
  HOWTO (R_MIPS_REL32,          /* type */
694
         0,                      /* rightshift */
695
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
696
         32,                    /* bitsize */
697
         false,                 /* pc_relative */
698
         0,                      /* bitpos */
699
         complain_overflow_bitfield, /* complain_on_overflow */
700
         bfd_elf_generic_reloc, /* special_function */
701
         "R_MIPS_REL32",        /* name */
702
         true,                  /* partial_inplace */
703
         0,                      /* src_mask */
704
         0xffffffff,            /* dst_mask */
705
         false),                /* pcrel_offset */
706
 
707
  /* 26 bit branch address.  */
708
  HOWTO (R_MIPS_26,             /* type */
709
         2,                     /* rightshift */
710
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
711
         26,                    /* bitsize */
712
         false,                 /* pc_relative */
713
         0,                      /* bitpos */
714
         complain_overflow_dont, /* complain_on_overflow */
715
                                /* This needs complex overflow
716
                                   detection, because the upper four
717
                                   bits must match the PC.  */
718
         bfd_elf_generic_reloc, /* special_function */
719
         "R_MIPS_26",           /* name */
720
         true,                  /* partial_inplace */
721
         0,                      /* src_mask */
722
         0x3ffffff,             /* dst_mask */
723
         false),                /* pcrel_offset */
724
 
725
  /* High 16 bits of symbol value.  */
726
  HOWTO (R_MIPS_HI16,           /* type */
727
         0,                      /* rightshift */
728
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
729
         16,                    /* bitsize */
730
         false,                 /* pc_relative */
731
         0,                      /* bitpos */
732
         complain_overflow_dont, /* complain_on_overflow */
733
         bfd_elf_generic_reloc, /* special_function */
734
         "R_MIPS_HI16",         /* name */
735
         true,                  /* partial_inplace */
736
         0,                      /* src_mask */
737
         0xffff,                /* dst_mask */
738
         false),                /* pcrel_offset */
739
 
740
  /* Low 16 bits of symbol value.  */
741
  HOWTO (R_MIPS_LO16,           /* type */
742
         0,                      /* rightshift */
743
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
744
         16,                    /* bitsize */
745
         false,                 /* pc_relative */
746
         0,                      /* bitpos */
747
         complain_overflow_dont, /* complain_on_overflow */
748
         bfd_elf_generic_reloc, /* special_function */
749
         "R_MIPS_LO16",         /* name */
750
         true,                  /* partial_inplace */
751
         0,                      /* src_mask */
752
         0xffff,                /* dst_mask */
753
         false),                /* pcrel_offset */
754
 
755
  /* GP relative reference.  */
756
  HOWTO (R_MIPS_GPREL16,        /* type */
757
         0,                      /* rightshift */
758
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
759
         16,                    /* bitsize */
760
         false,                 /* pc_relative */
761
         0,                      /* bitpos */
762
         complain_overflow_signed, /* complain_on_overflow */
763
         _bfd_mips_elf_gprel16_reloc, /* special_function */
764
         "R_MIPS_GPREL16",      /* name */
765
         true,                  /* partial_inplace */
766
         0,                      /* src_mask */
767
         0xffff,                /* dst_mask */
768
         false),                /* pcrel_offset */
769
 
770
  /* Reference to literal section.  */
771
  HOWTO (R_MIPS_LITERAL,        /* type */
772
         0,                      /* rightshift */
773
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
774
         16,                    /* bitsize */
775
         false,                 /* pc_relative */
776
         0,                      /* bitpos */
777
         complain_overflow_signed, /* complain_on_overflow */
778
         _bfd_mips_elf_gprel16_reloc, /* special_function */
779
         "R_MIPS_LITERAL",      /* name */
780
         true,                  /* partial_inplace */
781
         0,                      /* src_mask */
782
         0xffff,                /* dst_mask */
783
         false),                /* pcrel_offset */
784
 
785
  /* Reference to global offset table.  */
786
  /* FIXME: This is not handled correctly.  */
787
  HOWTO (R_MIPS_GOT16,          /* type */
788
         0,                      /* rightshift */
789
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
790
         16,                    /* bitsize */
791
         false,                 /* pc_relative */
792
         0,                      /* bitpos */
793
         complain_overflow_signed, /* complain_on_overflow */
794
         bfd_elf_generic_reloc, /* special_function */
795
         "R_MIPS_GOT16",        /* name */
796
         false,                 /* partial_inplace */
797
         0,                      /* src_mask */
798
         0xffff,                /* dst_mask */
799
         false),                /* pcrel_offset */
800
 
801
  /* 16 bit PC relative reference.  */
802
  HOWTO (R_MIPS_PC16,           /* type */
803
         0,                      /* rightshift */
804
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
805
         16,                    /* bitsize */
806
         true,                  /* pc_relative */
807
         0,                      /* bitpos */
808
         complain_overflow_signed, /* complain_on_overflow */
809
         bfd_elf_generic_reloc, /* special_function */
810
         "R_MIPS_PC16",         /* name */
811
         true,                  /* partial_inplace */
812
         0,                      /* src_mask */
813
         0xffff,                /* dst_mask */
814
         false),                /* pcrel_offset */
815
 
816
  /* 16 bit call through global offset table.  */
817
  /* FIXME: This is not handled correctly.  */
818
  HOWTO (R_MIPS_CALL16,         /* type */
819
         0,                      /* rightshift */
820
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
821
         16,                    /* bitsize */
822
         false,                 /* pc_relative */
823
         0,                      /* bitpos */
824
         complain_overflow_signed, /* complain_on_overflow */
825
         bfd_elf_generic_reloc, /* special_function */
826
         "R_MIPS_CALL16",       /* name */
827
         false,                 /* partial_inplace */
828
         0,                      /* src_mask */
829
         0xffff,                /* dst_mask */
830
         false),                /* pcrel_offset */
831
 
832
  /* 32 bit GP relative reference.  */
833
  HOWTO (R_MIPS_GPREL32,        /* type */
834
         0,                      /* rightshift */
835
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
836
         32,                    /* bitsize */
837
         false,                 /* pc_relative */
838
         0,                      /* bitpos */
839
         complain_overflow_bitfield, /* complain_on_overflow */
840
         _bfd_mips_elf_gprel32_reloc, /* special_function */
841
         "R_MIPS_GPREL32",      /* name */
842
         true,                  /* partial_inplace */
843
         0,                      /* src_mask */
844
         0xffffffff,            /* dst_mask */
845
         false),                /* pcrel_offset */
846
 
847
    { 13 },
848
    { 14 },
849
    { 15 },
850
 
851
  /* A 5 bit shift field.  */
852
  HOWTO (R_MIPS_SHIFT5,         /* type */
853
         0,                      /* rightshift */
854
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
855
         5,                     /* bitsize */
856
         false,                 /* pc_relative */
857
         6,                     /* bitpos */
858
         complain_overflow_bitfield, /* complain_on_overflow */
859
         bfd_elf_generic_reloc, /* special_function */
860
         "R_MIPS_SHIFT5",       /* name */
861
         true,                  /* partial_inplace */
862
         0,                      /* src_mask */
863
         0x000007c0,            /* dst_mask */
864
         false),                /* pcrel_offset */
865
 
866
  /* A 6 bit shift field.  */
867
  /* FIXME: This is not handled correctly; a special function is
868
     needed to put the most significant bit in the right place.  */
869
  HOWTO (R_MIPS_SHIFT6,         /* type */
870
         0,                      /* rightshift */
871
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
872
         6,                     /* bitsize */
873
         false,                 /* pc_relative */
874
         6,                     /* bitpos */
875
         complain_overflow_bitfield, /* complain_on_overflow */
876
         bfd_elf_generic_reloc, /* special_function */
877
         "R_MIPS_SHIFT6",       /* name */
878
         true,                  /* partial_inplace */
879
         0,                      /* src_mask */
880
         0x000007c4,            /* dst_mask */
881
         false),                /* pcrel_offset */
882
 
883
  /* 64 bit relocation.  */
884
  HOWTO (R_MIPS_64,             /* type */
885
         0,                      /* rightshift */
886
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
887
         64,                    /* bitsize */
888
         false,                 /* pc_relative */
889
         0,                      /* bitpos */
890
         complain_overflow_bitfield, /* complain_on_overflow */
891
         bfd_elf_generic_reloc, /* special_function */
892
         "R_MIPS_64",           /* name */
893
         true,                  /* partial_inplace */
894
         0,                      /* src_mask */
895
         MINUS_ONE,             /* dst_mask */
896
         false),                /* pcrel_offset */
897
 
898
  /* Displacement in the global offset table.  */
899
  /* FIXME: Not handled correctly.  */
900
  HOWTO (R_MIPS_GOT_DISP,       /* type */
901
         0,                      /* rightshift */
902
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
903
         16,                    /* bitsize */
904
         false,                 /* pc_relative */
905
         0,                      /* bitpos */
906
         complain_overflow_bitfield, /* complain_on_overflow */
907
         bfd_elf_generic_reloc, /* special_function */
908
         "R_MIPS_GOT_DISP",     /* name */
909
         true,                  /* partial_inplace */
910
         0,                      /* src_mask */
911
         0x0000ffff,            /* dst_mask */
912
         false),                /* pcrel_offset */
913
 
914
  /* Displacement to page pointer in the global offset table.  */
915
  /* FIXME: Not handled correctly.  */
916
  HOWTO (R_MIPS_GOT_PAGE,       /* type */
917
         0,                      /* rightshift */
918
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
919
         16,                    /* bitsize */
920
         false,                 /* pc_relative */
921
         0,                      /* bitpos */
922
         complain_overflow_bitfield, /* complain_on_overflow */
923
         bfd_elf_generic_reloc, /* special_function */
924
         "R_MIPS_GOT_PAGE",     /* name */
925
         true,                  /* partial_inplace */
926
         0,                      /* src_mask */
927
         0x0000ffff,            /* dst_mask */
928
         false),                /* pcrel_offset */
929
 
930
  /* Offset from page pointer in the global offset table.  */
931
  /* FIXME: Not handled correctly.  */
932
  HOWTO (R_MIPS_GOT_OFST,       /* type */
933
         0,                      /* rightshift */
934
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
935
         16,                    /* bitsize */
936
         false,                 /* pc_relative */
937
         0,                      /* bitpos */
938
         complain_overflow_bitfield, /* complain_on_overflow */
939
         bfd_elf_generic_reloc, /* special_function */
940
         "R_MIPS_GOT_OFST",     /* name */
941
         true,                  /* partial_inplace */
942
         0,                      /* src_mask */
943
         0x0000ffff,            /* dst_mask */
944
         false),                /* pcrel_offset */
945
 
946
  /* High 16 bits of displacement in global offset table.  */
947
  /* FIXME: Not handled correctly.  */
948
  HOWTO (R_MIPS_GOT_HI16,       /* type */
949
         0,                      /* rightshift */
950
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
951
         16,                    /* bitsize */
952
         false,                 /* pc_relative */
953
         0,                      /* bitpos */
954
         complain_overflow_dont, /* complain_on_overflow */
955
         bfd_elf_generic_reloc, /* special_function */
956
         "R_MIPS_GOT_HI16",     /* name */
957
         true,                  /* partial_inplace */
958
         0,                      /* src_mask */
959
         0x0000ffff,            /* dst_mask */
960
         false),                /* pcrel_offset */
961
 
962
  /* Low 16 bits of displacement in global offset table.  */
963
  /* FIXME: Not handled correctly.  */
964
  HOWTO (R_MIPS_GOT_LO16,       /* type */
965
         0,                      /* rightshift */
966
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
967
         16,                    /* bitsize */
968
         false,                 /* pc_relative */
969
         0,                      /* bitpos */
970
         complain_overflow_dont, /* complain_on_overflow */
971
         bfd_elf_generic_reloc, /* special_function */
972
         "R_MIPS_GOT_LO16",     /* name */
973
         true,                  /* partial_inplace */
974
         0,                      /* src_mask */
975
         0x0000ffff,            /* dst_mask */
976
         false),                /* pcrel_offset */
977
 
978
  /* 64 bit substraction.  */
979
  /* FIXME: Not handled correctly.  */
980
  HOWTO (R_MIPS_SUB,            /* type */
981
         0,                      /* rightshift */
982
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
983
         64,                    /* bitsize */
984
         false,                 /* pc_relative */
985
         0,                      /* bitpos */
986
         complain_overflow_bitfield, /* complain_on_overflow */
987
         bfd_elf_generic_reloc, /* special_function */
988
         "R_MIPS_SUB",          /* name */
989
         true,                  /* partial_inplace */
990
         0,                      /* src_mask */
991
         MINUS_ONE,             /* dst_mask */
992
         false),                /* pcrel_offset */
993
 
994
  /* Insert the addend as an instruction.  */
995
  /* FIXME: Not handled correctly.  */
996
  HOWTO (R_MIPS_INSERT_A,       /* type */
997
         0,                      /* rightshift */
998
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
999
         0,                      /* bitsize */
1000
         false,                 /* pc_relative */
1001
         0,                      /* bitpos */
1002
         complain_overflow_dont, /* complain_on_overflow */
1003
         bfd_elf_generic_reloc, /* special_function */
1004
         "R_MIPS_INSERT_A",     /* name */
1005
         false,                 /* partial_inplace */
1006
         0,                      /* src_mask */
1007
         0,                      /* dst_mask */
1008
         false),                /* pcrel_offset */
1009
 
1010
  /* Insert the addend as an instruction, and change all relocations
1011
     to refer to the old instruction at the address.  */
1012
  /* FIXME: Not handled correctly.  */
1013
  HOWTO (R_MIPS_INSERT_B,       /* type */
1014
         0,                      /* rightshift */
1015
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1016
         0,                      /* bitsize */
1017
         false,                 /* pc_relative */
1018
         0,                      /* bitpos */
1019
         complain_overflow_dont, /* complain_on_overflow */
1020
         bfd_elf_generic_reloc, /* special_function */
1021
         "R_MIPS_INSERT_B",     /* name */
1022
         false,                 /* partial_inplace */
1023
         0,                      /* src_mask */
1024
         0,                      /* dst_mask */
1025
         false),                /* pcrel_offset */
1026
 
1027
  /* Delete a 32 bit instruction.  */
1028
  /* FIXME: Not handled correctly.  */
1029
  HOWTO (R_MIPS_DELETE,         /* type */
1030
         0,                      /* rightshift */
1031
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1032
         0,                      /* bitsize */
1033
         false,                 /* pc_relative */
1034
         0,                      /* bitpos */
1035
         complain_overflow_dont, /* complain_on_overflow */
1036
         bfd_elf_generic_reloc, /* special_function */
1037
         "R_MIPS_DELETE",       /* name */
1038
         false,                 /* partial_inplace */
1039
         0,                      /* src_mask */
1040
         0,                      /* dst_mask */
1041
         false),                /* pcrel_offset */
1042
 
1043
  /* Get the higher value of a 64 bit addend.  */
1044
  /* FIXME: Not handled correctly.  */
1045
  HOWTO (R_MIPS_HIGHER,         /* type */
1046
         0,                      /* rightshift */
1047
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1048
         16,                    /* bitsize */
1049
         false,                 /* pc_relative */
1050
         0,                      /* bitpos */
1051
         complain_overflow_dont, /* complain_on_overflow */
1052
         bfd_elf_generic_reloc, /* special_function */
1053
         "R_MIPS_HIGHER",       /* name */
1054
         true,                  /* partial_inplace */
1055
         0,                      /* src_mask */
1056
         0xffff,                /* dst_mask */
1057
         false),                /* pcrel_offset */
1058
 
1059
  /* Get the highest value of a 64 bit addend.  */
1060
  /* FIXME: Not handled correctly.  */
1061
  HOWTO (R_MIPS_HIGHEST,        /* type */
1062
         0,                      /* rightshift */
1063
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1064
         16,                    /* bitsize */
1065
         false,                 /* pc_relative */
1066
         0,                      /* bitpos */
1067
         complain_overflow_dont, /* complain_on_overflow */
1068
         bfd_elf_generic_reloc, /* special_function */
1069
         "R_MIPS_HIGHEST",      /* name */
1070
         true,                  /* partial_inplace */
1071
         0,                      /* src_mask */
1072
         0xffff,                /* dst_mask */
1073
         false),                /* pcrel_offset */
1074
 
1075
  /* High 16 bits of displacement in global offset table.  */
1076
  /* FIXME: Not handled correctly.  */
1077
  HOWTO (R_MIPS_CALL_HI16,      /* type */
1078
         0,                      /* rightshift */
1079
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1080
         16,                    /* bitsize */
1081
         false,                 /* pc_relative */
1082
         0,                      /* bitpos */
1083
         complain_overflow_dont, /* complain_on_overflow */
1084
         bfd_elf_generic_reloc, /* special_function */
1085
         "R_MIPS_CALL_HI16",    /* name */
1086
         true,                  /* partial_inplace */
1087
         0,                      /* src_mask */
1088
         0x0000ffff,            /* dst_mask */
1089
         false),                /* pcrel_offset */
1090
 
1091
  /* Low 16 bits of displacement in global offset table.  */
1092
  /* FIXME: Not handled correctly.  */
1093
  HOWTO (R_MIPS_CALL_LO16,      /* type */
1094
         0,                      /* rightshift */
1095
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1096
         16,                    /* bitsize */
1097
         false,                 /* pc_relative */
1098
         0,                      /* bitpos */
1099
         complain_overflow_dont, /* complain_on_overflow */
1100
         bfd_elf_generic_reloc, /* special_function */
1101
         "R_MIPS_CALL_LO16",    /* name */
1102
         true,                  /* partial_inplace */
1103
         0,                      /* src_mask */
1104
         0x0000ffff,            /* dst_mask */
1105
         false),                /* pcrel_offset */
1106
 
1107
  /* I'm not sure what the remaining relocs are, but they are defined
1108
     on Irix 6.  */
1109
 
1110
  HOWTO (R_MIPS_SCN_DISP,       /* type */
1111
         0,                      /* rightshift */
1112
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1113
         0,                      /* bitsize */
1114
         false,                 /* pc_relative */
1115
         0,                      /* bitpos */
1116
         complain_overflow_dont, /* complain_on_overflow */
1117
         bfd_elf_generic_reloc, /* special_function */
1118
         "R_MIPS_SCN_DISP",     /* name */
1119
         false,                 /* partial_inplace */
1120
         0,                      /* src_mask */
1121
         0,                      /* dst_mask */
1122
         false),                /* pcrel_offset */
1123
 
1124
  HOWTO (R_MIPS_REL16,          /* type */
1125
         0,                      /* rightshift */
1126
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1127
         0,                      /* bitsize */
1128
         false,                 /* pc_relative */
1129
         0,                      /* bitpos */
1130
         complain_overflow_dont, /* complain_on_overflow */
1131
         bfd_elf_generic_reloc, /* special_function */
1132
         "R_MIPS_REL16",        /* name */
1133
         false,                 /* partial_inplace */
1134
         0,                      /* src_mask */
1135
         0,                      /* dst_mask */
1136
         false),                /* pcrel_offset */
1137
 
1138
  HOWTO (R_MIPS_ADD_IMMEDIATE,  /* type */
1139
         0,                      /* rightshift */
1140
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1141
         0,                      /* bitsize */
1142
         false,                 /* pc_relative */
1143
         0,                      /* bitpos */
1144
         complain_overflow_dont, /* complain_on_overflow */
1145
         bfd_elf_generic_reloc, /* special_function */
1146
         "R_MIPS_ADD_IMMEDIATE", /* name */
1147
         false,                 /* partial_inplace */
1148
         0,                      /* src_mask */
1149
         0,                      /* dst_mask */
1150
         false),                /* pcrel_offset */
1151
 
1152
  HOWTO (R_MIPS_PJUMP,          /* type */
1153
         0,                      /* rightshift */
1154
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1155
         0,                      /* bitsize */
1156
         false,                 /* pc_relative */
1157
         0,                      /* bitpos */
1158
         complain_overflow_dont, /* complain_on_overflow */
1159
         bfd_elf_generic_reloc, /* special_function */
1160
         "R_MIPS_PJUMP",        /* name */
1161
         false,                 /* partial_inplace */
1162
         0,                      /* src_mask */
1163
         0,                      /* dst_mask */
1164
         false),                /* pcrel_offset */
1165
 
1166
  HOWTO (R_MIPS_RELGOT,         /* type */
1167
         0,                      /* rightshift */
1168
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1169
         0,                      /* bitsize */
1170
         false,                 /* pc_relative */
1171
         0,                      /* bitpos */
1172
         complain_overflow_dont, /* complain_on_overflow */
1173
         bfd_elf_generic_reloc, /* special_function */
1174
         "R_MIPS_RELGOT",       /* name */
1175
         false,                 /* partial_inplace */
1176
         0,                      /* src_mask */
1177
         0,                      /* dst_mask */
1178
         false),                /* pcrel_offset */
1179
 
1180
  /* Protected jump conversion.  This is an optimization hint.  No
1181
     relocation is required for correctness.  */
1182
  HOWTO (R_MIPS_JALR,           /* type */
1183
         0,                      /* rightshift */
1184
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1185
         0,                      /* bitsize */
1186
         false,                 /* pc_relative */
1187
         0,                      /* bitpos */
1188
         complain_overflow_dont, /* complain_on_overflow */
1189
         bfd_elf_generic_reloc, /* special_function */
1190
         "R_MIPS_JALR",         /* name */
1191
         false,                 /* partial_inplace */
1192
         0x00000000,            /* src_mask */
1193
         0x00000000,            /* dst_mask */
1194
         false),                /* pcrel_offset */
1195
};
1196
 
1197
/* Swap in a MIPS 64-bit Rel reloc.  */
1198
 
1199
static void
1200
mips_elf64_swap_reloc_in (abfd, src, dst)
1201
     bfd *abfd;
1202
     const Elf64_Mips_External_Rel *src;
1203
     Elf64_Mips_Internal_Rel *dst;
1204
{
1205
  dst->r_offset = bfd_h_get_64 (abfd, (bfd_byte *) src->r_offset);
1206
  dst->r_sym = bfd_h_get_32 (abfd, (bfd_byte *) src->r_sym);
1207
  dst->r_ssym = bfd_h_get_8 (abfd, (bfd_byte *) src->r_ssym);
1208
  dst->r_type3 = bfd_h_get_8 (abfd, (bfd_byte *) src->r_type3);
1209
  dst->r_type2 = bfd_h_get_8 (abfd, (bfd_byte *) src->r_type2);
1210
  dst->r_type = bfd_h_get_8 (abfd, (bfd_byte *) src->r_type);
1211
}
1212
 
1213
/* Swap in a MIPS 64-bit Rela reloc.  */
1214
 
1215
static void
1216
mips_elf64_swap_reloca_in (abfd, src, dst)
1217
     bfd *abfd;
1218
     const Elf64_Mips_External_Rela *src;
1219
     Elf64_Mips_Internal_Rela *dst;
1220
{
1221
  dst->r_offset = bfd_h_get_64 (abfd, (bfd_byte *) src->r_offset);
1222
  dst->r_sym = bfd_h_get_32 (abfd, (bfd_byte *) src->r_sym);
1223
  dst->r_ssym = bfd_h_get_8 (abfd, (bfd_byte *) src->r_ssym);
1224
  dst->r_type3 = bfd_h_get_8 (abfd, (bfd_byte *) src->r_type3);
1225
  dst->r_type2 = bfd_h_get_8 (abfd, (bfd_byte *) src->r_type2);
1226
  dst->r_type = bfd_h_get_8 (abfd, (bfd_byte *) src->r_type);
1227
  dst->r_addend = bfd_h_get_signed_64 (abfd, (bfd_byte *) src->r_addend);
1228
}
1229
 
1230
/* Swap out a MIPS 64-bit Rel reloc.  */
1231
 
1232
static void
1233
mips_elf64_swap_reloc_out (abfd, src, dst)
1234
     bfd *abfd;
1235
     const Elf64_Mips_Internal_Rel *src;
1236
     Elf64_Mips_External_Rel *dst;
1237
{
1238
  bfd_h_put_64 (abfd, src->r_offset, (bfd_byte *) dst->r_offset);
1239
  bfd_h_put_32 (abfd, src->r_sym, (bfd_byte *) dst->r_sym);
1240
  bfd_h_put_8 (abfd, src->r_ssym, (bfd_byte *) dst->r_ssym);
1241
  bfd_h_put_8 (abfd, src->r_type3, (bfd_byte *) dst->r_type3);
1242
  bfd_h_put_8 (abfd, src->r_type2, (bfd_byte *) dst->r_type2);
1243
  bfd_h_put_8 (abfd, src->r_type, (bfd_byte *) dst->r_type);
1244
}
1245
 
1246
/* Swap out a MIPS 64-bit Rela reloc.  */
1247
 
1248
static void
1249
mips_elf64_swap_reloca_out (abfd, src, dst)
1250
     bfd *abfd;
1251
     const Elf64_Mips_Internal_Rela *src;
1252
     Elf64_Mips_External_Rela *dst;
1253
{
1254
  bfd_h_put_64 (abfd, src->r_offset, (bfd_byte *) dst->r_offset);
1255
  bfd_h_put_32 (abfd, src->r_sym, (bfd_byte *) dst->r_sym);
1256
  bfd_h_put_8 (abfd, src->r_ssym, (bfd_byte *) dst->r_ssym);
1257
  bfd_h_put_8 (abfd, src->r_type3, (bfd_byte *) dst->r_type3);
1258
  bfd_h_put_8 (abfd, src->r_type2, (bfd_byte *) dst->r_type2);
1259
  bfd_h_put_8 (abfd, src->r_type, (bfd_byte *) dst->r_type);
1260
  bfd_h_put_64 (abfd, src->r_addend, (bfd_byte *) dst->r_addend);
1261
}
1262
 
1263
/* Swap in a MIPS 64-bit Rel reloc.  */
1264
 
1265
static void
1266
mips_elf64_be_swap_reloc_in (abfd, src, dst)
1267
     bfd *abfd;
1268
     const bfd_byte *src;
1269
     Elf_Internal_Rel *dst;
1270
{
1271
  Elf64_Mips_Internal_Rel mirel;
1272
 
1273
  mips_elf64_swap_reloc_in (abfd,
1274
                            (const Elf64_Mips_External_Rel *) src,
1275
                            &mirel);
1276
 
1277
  dst[0].r_offset = mirel.r_offset;
1278
  dst[0].r_info = ELF32_R_INFO (mirel.r_sym, mirel.r_type);
1279
  dst[1].r_offset = mirel.r_offset;
1280
  dst[1].r_info = ELF32_R_INFO (mirel.r_ssym, mirel.r_type2);
1281
  dst[2].r_offset = mirel.r_offset;
1282
  dst[2].r_info = ELF32_R_INFO (STN_UNDEF, mirel.r_type3);
1283
}
1284
 
1285
/* Swap in a MIPS 64-bit Rela reloc.  */
1286
 
1287
static void
1288
mips_elf64_be_swap_reloca_in (abfd, src, dst)
1289
     bfd *abfd;
1290
     const bfd_byte *src;
1291
     Elf_Internal_Rela *dst;
1292
{
1293
  Elf64_Mips_Internal_Rela mirela;
1294
 
1295
  mips_elf64_swap_reloca_in (abfd,
1296
                             (const Elf64_Mips_External_Rela *) src,
1297
                             &mirela);
1298
 
1299
  dst[0].r_offset = mirela.r_offset;
1300
  dst[0].r_info = ELF32_R_INFO (mirela.r_sym, mirela.r_type);
1301
  dst[0].r_addend = mirela.r_addend;
1302
  dst[1].r_offset = mirela.r_offset;
1303
  dst[1].r_info = ELF32_R_INFO (mirela.r_ssym, mirela.r_type2);
1304
  dst[1].r_addend = 0;
1305
  dst[2].r_offset = mirela.r_offset;
1306
  dst[2].r_info = ELF32_R_INFO (STN_UNDEF, mirela.r_type3);
1307
  dst[2].r_addend = 0;
1308
}
1309
 
1310
/* Swap out a MIPS 64-bit Rel reloc.  */
1311
 
1312
static void
1313
mips_elf64_be_swap_reloc_out (abfd, src, dst)
1314
     bfd *abfd;
1315
     const Elf_Internal_Rel *src;
1316
     bfd_byte *dst;
1317
{
1318
  Elf64_Mips_Internal_Rel mirel;
1319
 
1320
  mirel.r_offset = src->r_offset;
1321
  mirel.r_type = ELF32_R_TYPE (src->r_info);
1322
  mirel.r_sym = ELF32_R_SYM (src->r_info);
1323
  mirel.r_type2 = R_MIPS_NONE;
1324
  mirel.r_ssym = STN_UNDEF;
1325
  mirel.r_type3 = R_MIPS_NONE;
1326
 
1327
  mips_elf64_swap_reloc_out (abfd, &mirel,
1328
                             (Elf64_Mips_External_Rel *) dst);
1329
}
1330
 
1331
/* Swap out a MIPS 64-bit Rela reloc.  */
1332
 
1333
static void
1334
mips_elf64_be_swap_reloca_out (abfd, src, dst)
1335
     bfd *abfd;
1336
     const Elf_Internal_Rela *src;
1337
     bfd_byte *dst;
1338
{
1339
  Elf64_Mips_Internal_Rela mirela;
1340
 
1341
  mirela.r_offset = src->r_offset;
1342
  mirela.r_type = ELF32_R_TYPE (src->r_info);
1343
  mirela.r_addend = src->r_addend;
1344
  mirela.r_sym = ELF32_R_SYM (src->r_info);
1345
  mirela.r_type2 = R_MIPS_NONE;
1346
  mirela.r_ssym = STN_UNDEF;
1347
  mirela.r_type3 = R_MIPS_NONE;
1348
 
1349
  mips_elf64_swap_reloca_out (abfd, &mirela,
1350
                              (Elf64_Mips_External_Rela *) dst);
1351
}
1352
 
1353
/* A mapping from BFD reloc types to MIPS ELF reloc types.  */
1354
 
1355
struct elf_reloc_map
1356
{
1357
  bfd_reloc_code_real_type bfd_reloc_val;
1358
  enum elf_mips_reloc_type elf_reloc_val;
1359
};
1360
 
1361
static CONST struct elf_reloc_map mips_reloc_map[] =
1362
{
1363
  { BFD_RELOC_NONE, R_MIPS_NONE, },
1364
  { BFD_RELOC_16, R_MIPS_16 },
1365
  { BFD_RELOC_32, R_MIPS_32 },
1366
  { BFD_RELOC_64, R_MIPS_64 },
1367
  { BFD_RELOC_CTOR, R_MIPS_64 },
1368
  { BFD_RELOC_32_PCREL, R_MIPS_REL32 },
1369
  { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
1370
  { BFD_RELOC_HI16_S, R_MIPS_HI16 },
1371
  { BFD_RELOC_LO16, R_MIPS_LO16 },
1372
  { BFD_RELOC_MIPS_GPREL, R_MIPS_GPREL16 },
1373
  { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
1374
  { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
1375
  { BFD_RELOC_16_PCREL, R_MIPS_PC16 },
1376
  { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
1377
  { BFD_RELOC_MIPS_GPREL32, R_MIPS_GPREL32 },
1378
  { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
1379
  { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
1380
  { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
1381
  { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
1382
  { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
1383
  { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
1384
  { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
1385
  { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP }
1386
};
1387
 
1388
/* Given a BFD reloc type, return a howto structure.  */
1389
 
1390
static reloc_howto_type *
1391
mips_elf64_reloc_type_lookup (abfd, code)
1392
     bfd *abfd;
1393
     bfd_reloc_code_real_type code;
1394
{
1395
  unsigned int i;
1396
 
1397
  for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map); i++)
1398
    {
1399
      if (mips_reloc_map[i].bfd_reloc_val == code)
1400
        {
1401
          int v;
1402
 
1403
          v = (int) mips_reloc_map[i].elf_reloc_val;
1404
          return &mips_elf64_howto_table_rel[v];
1405
        }
1406
    }
1407
 
1408
  return NULL;
1409
}
1410
 
1411
/* Since each entry in an SHT_REL or SHT_RELA section can represent up
1412
   to three relocs, we must tell the user to allocate more space.  */
1413
 
1414
static long
1415
mips_elf64_get_reloc_upper_bound (abfd, sec)
1416
     bfd *abfd;
1417
     asection *sec;
1418
{
1419
  return (sec->reloc_count * 3 + 1) * sizeof (arelent *);
1420
}
1421
 
1422
/* Read the relocations from one reloc section.  */
1423
 
1424
static boolean
1425
mips_elf64_slurp_one_reloc_table (abfd, asect, symbols, rel_hdr)
1426
     bfd *abfd;
1427
     asection *asect;
1428
     asymbol **symbols;
1429
     const Elf_Internal_Shdr *rel_hdr;
1430
{
1431
  PTR allocated = NULL;
1432
  bfd_byte *native_relocs;
1433
  arelent *relents;
1434
  arelent *relent;
1435
  unsigned int count;
1436
  unsigned int i;
1437
  int entsize;
1438
  reloc_howto_type *howto_table;
1439
 
1440
  allocated = (PTR) bfd_malloc (rel_hdr->sh_size);
1441
  if (allocated == NULL)
1442
    goto error_return;
1443
 
1444
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
1445
      || (bfd_read (allocated, 1, rel_hdr->sh_size, abfd) != rel_hdr->sh_size))
1446
    goto error_return;
1447
 
1448
  native_relocs = (bfd_byte *) allocated;
1449
 
1450
  relents = asect->relocation + asect->reloc_count;
1451
 
1452
  entsize = rel_hdr->sh_entsize;
1453
  BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
1454
              || entsize == sizeof (Elf64_Mips_External_Rela));
1455
 
1456
  count = rel_hdr->sh_size / entsize;
1457
 
1458
  if (entsize == sizeof (Elf64_Mips_External_Rel))
1459
    howto_table = mips_elf64_howto_table_rel;
1460
  else
1461
    howto_table = mips_elf64_howto_table_rela;
1462
 
1463
  relent = relents;
1464
  for (i = 0; i < count; i++, native_relocs += entsize)
1465
    {
1466
      Elf64_Mips_Internal_Rela rela;
1467
      boolean used_sym, used_ssym;
1468
      int ir;
1469
 
1470
      if (entsize == sizeof (Elf64_Mips_External_Rela))
1471
        mips_elf64_swap_reloca_in (abfd,
1472
                                   (Elf64_Mips_External_Rela *) native_relocs,
1473
                                   &rela);
1474
      else
1475
        {
1476
          Elf64_Mips_Internal_Rel rel;
1477
 
1478
          mips_elf64_swap_reloc_in (abfd,
1479
                                    (Elf64_Mips_External_Rel *) native_relocs,
1480
                                    &rel);
1481
          rela.r_offset = rel.r_offset;
1482
          rela.r_sym = rel.r_sym;
1483
          rela.r_ssym = rel.r_ssym;
1484
          rela.r_type3 = rel.r_type3;
1485
          rela.r_type2 = rel.r_type2;
1486
          rela.r_type = rel.r_type;
1487
          rela.r_addend = 0;
1488
        }
1489
 
1490
      /* Each entry represents up to three actual relocations.  */
1491
 
1492
      used_sym = false;
1493
      used_ssym = false;
1494
      for (ir = 0; ir < 3; ir++)
1495
        {
1496
          enum elf_mips_reloc_type type;
1497
 
1498
          switch (ir)
1499
            {
1500
            default:
1501
              abort ();
1502
            case 0:
1503
              type = (enum elf_mips_reloc_type) rela.r_type;
1504
              break;
1505
            case 1:
1506
              type = (enum elf_mips_reloc_type) rela.r_type2;
1507
              break;
1508
            case 2:
1509
              type = (enum elf_mips_reloc_type) rela.r_type3;
1510
              break;
1511
            }
1512
 
1513
          if (type == R_MIPS_NONE)
1514
            {
1515
              /* There are no more relocations in this entry.  If this
1516
                 is the first entry, we need to generate a dummy
1517
                 relocation so that the generic linker knows that
1518
                 there has been a break in the sequence of relocations
1519
                 applying to a particular address.  */
1520
              if (ir == 0)
1521
                {
1522
                  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1523
                  if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
1524
                    relent->address = rela.r_offset;
1525
                  else
1526
                    relent->address = rela.r_offset - asect->vma;
1527
                  relent->addend = 0;
1528
                  relent->howto = &howto_table[(int) R_MIPS_NONE];
1529
                  ++relent;
1530
                }
1531
              break;
1532
            }
1533
 
1534
          /* Some types require symbols, whereas some do not.  */
1535
          switch (type)
1536
            {
1537
            case R_MIPS_NONE:
1538
            case R_MIPS_LITERAL:
1539
            case R_MIPS_INSERT_A:
1540
            case R_MIPS_INSERT_B:
1541
            case R_MIPS_DELETE:
1542
              relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1543
              break;
1544
 
1545
            default:
1546
              if (! used_sym)
1547
                {
1548
                  if (rela.r_sym == 0)
1549
                    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1550
                  else
1551
                    {
1552
                      asymbol **ps, *s;
1553
 
1554
                      ps = symbols + rela.r_sym - 1;
1555
                      s = *ps;
1556
                      if ((s->flags & BSF_SECTION_SYM) == 0)
1557
                        relent->sym_ptr_ptr = ps;
1558
                      else
1559
                        relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
1560
                    }
1561
 
1562
                  used_sym = true;
1563
                }
1564
              else if (! used_ssym)
1565
                {
1566
                  switch (rela.r_ssym)
1567
                    {
1568
                    case RSS_UNDEF:
1569
                      relent->sym_ptr_ptr =
1570
                        bfd_abs_section_ptr->symbol_ptr_ptr;
1571
                      break;
1572
 
1573
                    case RSS_GP:
1574
                    case RSS_GP0:
1575
                    case RSS_LOC:
1576
                      /* FIXME: I think these need to be handled using
1577
                         special howto structures.  */
1578
                      BFD_ASSERT (0);
1579
                      break;
1580
 
1581
                    default:
1582
                      BFD_ASSERT (0);
1583
                      break;
1584
                    }
1585
 
1586
                  used_ssym = true;
1587
                }
1588
              else
1589
                relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1590
 
1591
              break;
1592
            }
1593
 
1594
          /* The address of an ELF reloc is section relative for an
1595
             object file, and absolute for an executable file or
1596
             shared library.  The address of a BFD reloc is always
1597
             section relative.  */
1598
          if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
1599
            relent->address = rela.r_offset;
1600
          else
1601
            relent->address = rela.r_offset - asect->vma;
1602
 
1603
          relent->addend = rela.r_addend;
1604
 
1605
          relent->howto = &howto_table[(int) type];
1606
 
1607
          ++relent;
1608
        }
1609
    }
1610
 
1611
  asect->reloc_count += relent - relents;
1612
 
1613
  if (allocated != NULL)
1614
    free (allocated);
1615
 
1616
  return true;
1617
 
1618
 error_return:
1619
  if (allocated != NULL)
1620
    free (allocated);
1621
  return false;
1622
}
1623
 
1624
/* Read the relocations.  On Irix 6, there can be two reloc sections
1625
   associated with a single data section.  */
1626
 
1627
static boolean
1628
mips_elf64_slurp_reloc_table (abfd, asect, symbols, dynamic)
1629
     bfd *abfd;
1630
     asection *asect;
1631
     asymbol **symbols;
1632
     boolean dynamic;
1633
{
1634
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1635
 
1636
  if (dynamic)
1637
    {
1638
      bfd_set_error (bfd_error_invalid_operation);
1639
      return false;
1640
    }
1641
 
1642
  if (asect->relocation != NULL
1643
      || (asect->flags & SEC_RELOC) == 0
1644
      || asect->reloc_count == 0)
1645
    return true;
1646
 
1647
  /* Allocate space for 3 arelent structures for each Rel structure.  */
1648
  asect->relocation = ((arelent *)
1649
                       bfd_alloc (abfd,
1650
                                  asect->reloc_count * 3 * sizeof (arelent)));
1651
  if (asect->relocation == NULL)
1652
    return false;
1653
 
1654
  /* The slurp_one_reloc_table routine increments reloc_count.  */
1655
  asect->reloc_count = 0;
1656
 
1657
  if (! mips_elf64_slurp_one_reloc_table (abfd, asect, symbols, &d->rel_hdr))
1658
    return false;
1659
  if (d->rel_hdr2 != NULL)
1660
    {
1661
      if (! mips_elf64_slurp_one_reloc_table (abfd, asect, symbols,
1662
                                              d->rel_hdr2))
1663
        return false;
1664
    }
1665
 
1666
  return true;
1667
}
1668
 
1669
/* Write out the relocations.  */
1670
 
1671
static void
1672
mips_elf64_write_relocs (abfd, sec, data)
1673
     bfd *abfd;
1674
     asection *sec;
1675
     PTR data;
1676
{
1677
  boolean *failedp = (boolean *) data;
1678
  unsigned int count;
1679
  Elf_Internal_Shdr *rela_hdr;
1680
  Elf64_Mips_External_Rela *ext_rela;
1681
  unsigned int idx;
1682
  asymbol *last_sym = 0;
1683
  int last_sym_idx = 0;
1684
 
1685
  /* If we have already failed, don't do anything.  */
1686
  if (*failedp)
1687
    return;
1688
 
1689
  if ((sec->flags & SEC_RELOC) == 0)
1690
    return;
1691
 
1692
  /* The linker backend writes the relocs out itself, and sets the
1693
     reloc_count field to zero to inhibit writing them here.  Also,
1694
     sometimes the SEC_RELOC flag gets set even when there aren't any
1695
     relocs.  */
1696
  if (sec->reloc_count == 0)
1697
    return;
1698
 
1699
  /* We can combine up to three relocs that refer to the same address
1700
     if the latter relocs have no associated symbol.  */
1701
  count = 0;
1702
  for (idx = 0; idx < sec->reloc_count; idx++)
1703
    {
1704
      bfd_vma addr;
1705
      unsigned int i;
1706
 
1707
      ++count;
1708
 
1709
      addr = sec->orelocation[idx]->address;
1710
      for (i = 0; i < 2; i++)
1711
        {
1712
          arelent *r;
1713
 
1714
          if (idx + 1 >= sec->reloc_count)
1715
            break;
1716
          r = sec->orelocation[idx + 1];
1717
          if (r->address != addr
1718
              || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
1719
              || (*r->sym_ptr_ptr)->value != 0)
1720
            break;
1721
 
1722
          /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
1723
 
1724
          ++idx;
1725
        }
1726
    }
1727
 
1728
  rela_hdr = &elf_section_data (sec)->rel_hdr;
1729
 
1730
  rela_hdr->sh_size = rela_hdr->sh_entsize * count;
1731
  rela_hdr->contents = (PTR) bfd_alloc (abfd, rela_hdr->sh_size);
1732
  if (rela_hdr->contents == NULL)
1733
    {
1734
      *failedp = true;
1735
      return;
1736
    }
1737
 
1738
  ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
1739
  for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
1740
    {
1741
      arelent *ptr;
1742
      Elf64_Mips_Internal_Rela int_rela;
1743
      asymbol *sym;
1744
      int n;
1745
      unsigned int i;
1746
 
1747
      ptr = sec->orelocation[idx];
1748
 
1749
      /* The address of an ELF reloc is section relative for an object
1750
         file, and absolute for an executable file or shared library.
1751
         The address of a BFD reloc is always section relative.  */
1752
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
1753
        int_rela.r_offset = ptr->address;
1754
      else
1755
        int_rela.r_offset = ptr->address + sec->vma;
1756
 
1757
      sym = *ptr->sym_ptr_ptr;
1758
      if (sym == last_sym)
1759
        n = last_sym_idx;
1760
      else
1761
        {
1762
          last_sym = sym;
1763
          n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1764
          if (n < 0)
1765
            {
1766
              *failedp = true;
1767
              return;
1768
            }
1769
          last_sym_idx = n;
1770
        }
1771
 
1772
      int_rela.r_sym = n;
1773
 
1774
      int_rela.r_addend = ptr->addend;
1775
 
1776
      int_rela.r_ssym = RSS_UNDEF;
1777
 
1778
      if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
1779
          && ! _bfd_elf_validate_reloc (abfd, ptr))
1780
        {
1781
          *failedp = true;
1782
          return;
1783
        }
1784
 
1785
      int_rela.r_type = ptr->howto->type;
1786
      int_rela.r_type2 = (int) R_MIPS_NONE;
1787
      int_rela.r_type3 = (int) R_MIPS_NONE;
1788
 
1789
      for (i = 0; i < 2; i++)
1790
        {
1791
          arelent *r;
1792
 
1793
          if (idx + 1 >= sec->reloc_count)
1794
            break;
1795
          r = sec->orelocation[idx + 1];
1796
          if (r->address != ptr->address
1797
              || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
1798
              || (*r->sym_ptr_ptr)->value != 0)
1799
            break;
1800
 
1801
          /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
1802
 
1803
          if (i == 0)
1804
            int_rela.r_type2 = r->howto->type;
1805
          else
1806
            int_rela.r_type3 = r->howto->type;
1807
 
1808
          ++idx;
1809
        }
1810
 
1811
      mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
1812
    }
1813
 
1814
  BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
1815
              == count);
1816
}
1817
 
1818
/* Irix 6 defines a brand new archive map format, so that they can
1819
   have archives more than 4 GB in size.  */
1820
 
1821
/* Read an Irix 6 armap.  */
1822
 
1823
static boolean
1824
mips_elf64_slurp_armap (abfd)
1825
     bfd *abfd;
1826
{
1827
  struct artdata *ardata = bfd_ardata (abfd);
1828
  char nextname[17];
1829
  file_ptr arhdrpos;
1830
  bfd_size_type i, parsed_size, nsymz, stringsize, carsym_size, ptrsize;
1831
  struct areltdata *mapdata;
1832
  bfd_byte int_buf[8];
1833
  char *stringbase;
1834
  bfd_byte *raw_armap = NULL;
1835
  carsym *carsyms;
1836
 
1837
  ardata->symdefs = NULL;
1838
 
1839
  /* Get the name of the first element.  */
1840
  arhdrpos = bfd_tell (abfd);
1841
  i = bfd_read ((PTR) nextname, 1, 16, abfd);
1842
  if (i == 0)
1843
    return true;
1844
  if (i != 16)
1845
    return false;
1846
 
1847
  if (bfd_seek (abfd, (file_ptr) - 16, SEEK_CUR) != 0)
1848
    return false;
1849
 
1850
  /* Archives with traditional armaps are still permitted.  */
1851
  if (strncmp (nextname, "/               ", 16) == 0)
1852
    return bfd_slurp_armap (abfd);
1853
 
1854
  if (strncmp (nextname, "/SYM64/         ", 16) != 0)
1855
    {
1856
      bfd_has_map (abfd) = false;
1857
      return true;
1858
    }
1859
 
1860
  mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1861
  if (mapdata == NULL)
1862
    return false;
1863
  parsed_size = mapdata->parsed_size;
1864
  bfd_release (abfd, (PTR) mapdata);
1865
 
1866
  if (bfd_read (int_buf, 1, 8, abfd) != 8)
1867
    {
1868
      if (bfd_get_error () != bfd_error_system_call)
1869
        bfd_set_error (bfd_error_malformed_archive);
1870
      return false;
1871
    }
1872
 
1873
  nsymz = bfd_getb64 (int_buf);
1874
  stringsize = parsed_size - 8 * nsymz - 8;
1875
 
1876
  carsym_size = nsymz * sizeof (carsym);
1877
  ptrsize = 8 * nsymz;
1878
 
1879
  ardata->symdefs = (carsym *) bfd_zalloc (abfd, carsym_size + stringsize + 1);
1880
  if (ardata->symdefs == NULL)
1881
    return false;
1882
  carsyms = ardata->symdefs;
1883
  stringbase = ((char *) ardata->symdefs) + carsym_size;
1884
 
1885
  raw_armap = (bfd_byte *) bfd_alloc (abfd, ptrsize);
1886
  if (raw_armap == NULL)
1887
    goto error_return;
1888
 
1889
  if (bfd_read (raw_armap, 1, ptrsize, abfd) != ptrsize
1890
      || bfd_read (stringbase, 1, stringsize, abfd) != stringsize)
1891
    {
1892
      if (bfd_get_error () != bfd_error_system_call)
1893
        bfd_set_error (bfd_error_malformed_archive);
1894
      goto error_return;
1895
    }
1896
 
1897
  for (i = 0; i < nsymz; i++)
1898
    {
1899
      carsyms->file_offset = bfd_getb64 (raw_armap + i * 8);
1900
      carsyms->name = stringbase;
1901
      stringbase += strlen (stringbase) + 1;
1902
      ++carsyms;
1903
    }
1904
  *stringbase = '\0';
1905
 
1906
  ardata->symdef_count = nsymz;
1907
  ardata->first_file_filepos = arhdrpos + sizeof (struct ar_hdr) + parsed_size;
1908
 
1909
  bfd_has_map (abfd) = true;
1910
  bfd_release (abfd, raw_armap);
1911
 
1912
  return true;
1913
 
1914
 error_return:
1915
  if (raw_armap != NULL)
1916
    bfd_release (abfd, raw_armap);
1917
  if (ardata->symdefs != NULL)
1918
    bfd_release (abfd, ardata->symdefs);
1919
  return false;
1920
}
1921
 
1922
/* Write out an Irix 6 armap.  The Irix 6 tools are supposed to be
1923
   able to handle ordinary ELF armaps, but at least on Irix 6.2 the
1924
   linker crashes.  */
1925
 
1926
static boolean
1927
mips_elf64_write_armap (arch, elength, map, symbol_count, stridx)
1928
     bfd *arch;
1929
     unsigned int elength;
1930
     struct orl *map;
1931
     unsigned int symbol_count;
1932
     int stridx;
1933
{
1934
  unsigned int ranlibsize = (symbol_count * 8) + 8;
1935
  unsigned int stringsize = stridx;
1936
  unsigned int mapsize = stringsize + ranlibsize;
1937
  file_ptr archive_member_file_ptr;
1938
  bfd *current = arch->archive_head;
1939
  unsigned int count;
1940
  struct ar_hdr hdr;
1941
  unsigned int i;
1942
  int padding;
1943
  bfd_byte buf[8];
1944
 
1945
  padding = BFD_ALIGN (mapsize, 8) - mapsize;
1946
  mapsize += padding;
1947
 
1948
  /* work out where the first object file will go in the archive */
1949
  archive_member_file_ptr = (mapsize
1950
                             + elength
1951
                             + sizeof (struct ar_hdr)
1952
                             + SARMAG);
1953
 
1954
  memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
1955
  strcpy (hdr.ar_name, "/SYM64/");
1956
  sprintf (hdr.ar_size, "%-10d", (int) mapsize);
1957
  sprintf (hdr.ar_date, "%ld", (long) time (NULL));
1958
  /* This, at least, is what Intel coff sets the values to.: */
1959
  sprintf ((hdr.ar_uid), "%d", 0);
1960
  sprintf ((hdr.ar_gid), "%d", 0);
1961
  sprintf ((hdr.ar_mode), "%-7o", (unsigned) 0);
1962
  strncpy (hdr.ar_fmag, ARFMAG, 2);
1963
 
1964
  for (i = 0; i < sizeof (struct ar_hdr); i++)
1965
    if (((char *) (&hdr))[i] == '\0')
1966
      (((char *) (&hdr))[i]) = ' ';
1967
 
1968
  /* Write the ar header for this item and the number of symbols */
1969
 
1970
  if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), arch)
1971
      != sizeof (struct ar_hdr))
1972
    return false;
1973
 
1974
  bfd_putb64 (symbol_count, buf);
1975
  if (bfd_write (buf, 1, 8, arch) != 8)
1976
    return false;
1977
 
1978
  /* Two passes, first write the file offsets for each symbol -
1979
     remembering that each offset is on a two byte boundary.  */
1980
 
1981
  /* Write out the file offset for the file associated with each
1982
     symbol, and remember to keep the offsets padded out.  */
1983
 
1984
  current = arch->archive_head;
1985
  count = 0;
1986
  while (current != (bfd *) NULL && count < symbol_count)
1987
    {
1988
      /* For each symbol which is used defined in this object, write out
1989
         the object file's address in the archive */
1990
 
1991
      while (((bfd *) (map[count]).pos) == current)
1992
        {
1993
          bfd_putb64 (archive_member_file_ptr, buf);
1994
          if (bfd_write (buf, 1, 8, arch) != 8)
1995
            return false;
1996
          count++;
1997
        }
1998
      /* Add size of this archive entry */
1999
      archive_member_file_ptr += (arelt_size (current)
2000
                                  + sizeof (struct ar_hdr));
2001
      /* remember about the even alignment */
2002
      archive_member_file_ptr += archive_member_file_ptr % 2;
2003
      current = current->next;
2004
    }
2005
 
2006
  /* now write the strings themselves */
2007
  for (count = 0; count < symbol_count; count++)
2008
    {
2009
      size_t len = strlen (*map[count].name) + 1;
2010
 
2011
      if (bfd_write (*map[count].name, 1, len, arch) != len)
2012
        return false;
2013
    }
2014
 
2015
  /* The spec says that this should be padded to an 8 byte boundary.
2016
     However, the Irix 6.2 tools do not appear to do this.  */
2017
  while (padding != 0)
2018
    {
2019
      if (bfd_write ("", 1, 1, arch) != 1)
2020
        return false;
2021
      --padding;
2022
    }
2023
 
2024
  return true;
2025
}
2026
 
2027
/* ECOFF swapping routines.  These are used when dealing with the
2028
   .mdebug section, which is in the ECOFF debugging format.  */
2029
static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
2030
{
2031
  /* Symbol table magic number.  */
2032
  magicSym2,
2033
  /* Alignment of debugging information.  E.g., 4.  */
2034
  8,
2035
  /* Sizes of external symbolic information.  */
2036
  sizeof (struct hdr_ext),
2037
  sizeof (struct dnr_ext),
2038
  sizeof (struct pdr_ext),
2039
  sizeof (struct sym_ext),
2040
  sizeof (struct opt_ext),
2041
  sizeof (struct fdr_ext),
2042
  sizeof (struct rfd_ext),
2043
  sizeof (struct ext_ext),
2044
  /* Functions to swap in external symbolic data.  */
2045
  ecoff_swap_hdr_in,
2046
  ecoff_swap_dnr_in,
2047
  ecoff_swap_pdr_in,
2048
  ecoff_swap_sym_in,
2049
  ecoff_swap_opt_in,
2050
  ecoff_swap_fdr_in,
2051
  ecoff_swap_rfd_in,
2052
  ecoff_swap_ext_in,
2053
  _bfd_ecoff_swap_tir_in,
2054
  _bfd_ecoff_swap_rndx_in,
2055
  /* Functions to swap out external symbolic data.  */
2056
  ecoff_swap_hdr_out,
2057
  ecoff_swap_dnr_out,
2058
  ecoff_swap_pdr_out,
2059
  ecoff_swap_sym_out,
2060
  ecoff_swap_opt_out,
2061
  ecoff_swap_fdr_out,
2062
  ecoff_swap_rfd_out,
2063
  ecoff_swap_ext_out,
2064
  _bfd_ecoff_swap_tir_out,
2065
  _bfd_ecoff_swap_rndx_out,
2066
  /* Function to read in symbolic data.  */
2067
  _bfd_mips_elf_read_ecoff_info
2068
};
2069
 
2070
/* Relocations in the 64 bit MIPS ELF ABI are more complex than in
2071
   standard ELF.  This structure is used to redirect the relocation
2072
   handling routines.  */
2073
 
2074
const struct elf_size_info mips_elf64_size_info =
2075
{
2076
  sizeof (Elf64_External_Ehdr),
2077
  sizeof (Elf64_External_Phdr),
2078
  sizeof (Elf64_External_Shdr),
2079
  sizeof (Elf64_Mips_External_Rel),
2080
  sizeof (Elf64_Mips_External_Rela),
2081
  sizeof (Elf64_External_Sym),
2082
  sizeof (Elf64_External_Dyn),
2083
  sizeof (Elf_External_Note),
2084
  4,            /* hash-table entry size */
2085
  3,            /* internal relocations per external relocations */
2086
  64,           /* arch_size */
2087
  8,            /* file_align */
2088
  ELFCLASS64,
2089
  EV_CURRENT,
2090
  bfd_elf64_write_out_phdrs,
2091
  bfd_elf64_write_shdrs_and_ehdr,
2092
  mips_elf64_write_relocs,
2093
  bfd_elf64_swap_symbol_out,
2094
  mips_elf64_slurp_reloc_table,
2095
  bfd_elf64_slurp_symbol_table,
2096
  bfd_elf64_swap_dyn_in,
2097
  bfd_elf64_swap_dyn_out,
2098
  mips_elf64_be_swap_reloc_in,
2099
  mips_elf64_be_swap_reloc_out,
2100
  mips_elf64_be_swap_reloca_in,
2101
  mips_elf64_be_swap_reloca_out
2102
};
2103
 
2104
#define TARGET_LITTLE_SYM               bfd_elf64_littlemips_vec
2105
#define TARGET_LITTLE_NAME              "elf64-littlemips"
2106
#define TARGET_BIG_SYM                  bfd_elf64_bigmips_vec
2107
#define TARGET_BIG_NAME                 "elf64-bigmips"
2108
#define ELF_ARCH                        bfd_arch_mips
2109
#define ELF_MACHINE_CODE                EM_MIPS
2110
 
2111
#define ELF_MAXPAGESIZE                 0x1000
2112
 
2113
#define elf_backend_collect             true
2114
#define elf_backend_type_change_ok      true
2115
#define elf_backend_can_gc_sections     true
2116
#define elf_backend_size_info           mips_elf64_size_info
2117
#define elf_backend_object_p            _bfd_mips_elf_object_p
2118
#define elf_backend_section_from_shdr   _bfd_mips_elf_section_from_shdr
2119
#define elf_backend_fake_sections       _bfd_mips_elf_fake_sections
2120
#define elf_backend_section_from_bfd_section \
2121
                                        _bfd_mips_elf_section_from_bfd_section
2122
#define elf_backend_section_processing  _bfd_mips_elf_section_processing
2123
#define elf_backend_symbol_processing   _bfd_mips_elf_symbol_processing
2124
#define elf_backend_additional_program_headers \
2125
                                        _bfd_mips_elf_additional_program_headers
2126
#define elf_backend_modify_segment_map  _bfd_mips_elf_modify_segment_map
2127
#define elf_backend_final_write_processing \
2128
                                        _bfd_mips_elf_final_write_processing
2129
#define elf_backend_ecoff_debug_swap    &mips_elf64_ecoff_debug_swap
2130
#define elf_backend_add_symbol_hook     _bfd_mips_elf_add_symbol_hook
2131
#define elf_backend_create_dynamic_sections \
2132
                                        _bfd_mips_elf_create_dynamic_sections
2133
#define elf_backend_check_relocs        _bfd_mips_elf_check_relocs
2134
#define elf_backend_adjust_dynamic_symbol \
2135
                                        _bfd_mips_elf_adjust_dynamic_symbol
2136
#define elf_backend_always_size_sections \
2137
                                        _bfd_mips_elf_always_size_sections
2138
#define elf_backend_size_dynamic_sections \
2139
                                        _bfd_mips_elf_size_dynamic_sections
2140
#define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
2141
#define elf_backend_link_output_symbol_hook \
2142
                                        _bfd_mips_elf_link_output_symbol_hook
2143
#define elf_backend_finish_dynamic_symbol \
2144
                                        _bfd_mips_elf_finish_dynamic_symbol
2145
#define elf_backend_finish_dynamic_sections \
2146
                                        _bfd_mips_elf_finish_dynamic_sections
2147
#define elf_backend_gc_mark_hook        _bfd_mips_elf_gc_mark_hook
2148
#define elf_backend_gc_sweep_hook       _bfd_mips_elf_gc_sweep_hook
2149
#define elf_backend_got_header_size     (4*MIPS_RESERVED_GOTNO)
2150
#define elf_backend_plt_header_size     0
2151
#define elf_backend_may_use_rel_p       1
2152
 
2153
/* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit
2154
   MIPS-specific function only applies to IRIX5, which had no 64-bit
2155
   ABI.  */
2156
#define bfd_elf64_find_nearest_line     _bfd_mips_elf_find_nearest_line
2157
#define bfd_elf64_set_section_contents  _bfd_mips_elf_set_section_contents
2158
#define bfd_elf64_bfd_link_hash_table_create \
2159
                                        _bfd_mips_elf_link_hash_table_create
2160
#define bfd_elf64_bfd_final_link        _bfd_mips_elf_final_link
2161
#define bfd_elf64_bfd_copy_private_bfd_data \
2162
                                        _bfd_mips_elf_copy_private_bfd_data
2163
#define bfd_elf64_bfd_merge_private_bfd_data \
2164
                                        _bfd_mips_elf_merge_private_bfd_data
2165
#define bfd_elf64_bfd_set_private_flags _bfd_mips_elf_set_private_flags
2166
#define bfd_elf64_bfd_print_private_bfd_data \
2167
                                        _bfd_mips_elf_print_private_bfd_data
2168
 
2169
#define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound
2170
#define bfd_elf64_bfd_reloc_type_lookup mips_elf64_reloc_type_lookup
2171
#define bfd_elf64_archive_functions
2172
#define bfd_elf64_archive_slurp_armap   mips_elf64_slurp_armap
2173
#define bfd_elf64_archive_slurp_extended_name_table \
2174
                                _bfd_archive_coff_slurp_extended_name_table
2175
#define bfd_elf64_archive_construct_extended_name_table \
2176
                                _bfd_archive_coff_construct_extended_name_table
2177
#define bfd_elf64_archive_truncate_arname \
2178
                                        _bfd_archive_coff_truncate_arname
2179
#define bfd_elf64_archive_write_armap   mips_elf64_write_armap
2180
#define bfd_elf64_archive_read_ar_hdr   _bfd_archive_coff_read_ar_hdr
2181
#define bfd_elf64_archive_openr_next_archived_file \
2182
                                _bfd_archive_coff_openr_next_archived_file
2183
#define bfd_elf64_archive_get_elt_at_index \
2184
                                        _bfd_archive_coff_get_elt_at_index
2185
#define bfd_elf64_archive_generic_stat_arch_elt \
2186
                                        _bfd_archive_coff_generic_stat_arch_elt
2187
#define bfd_elf64_archive_update_armap_timestamp \
2188
                                _bfd_archive_coff_update_armap_timestamp
2189
 
2190
#include "elf64-target.h"

powered by: WebSVN 2.1.0

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