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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [bfd/] [elf64-x86-64.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* X86-64 specific support for 64-bit ELF
2
   Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
3
   Contributed by Jan Hubicka <jh@suse.cz>.
4
 
5
This file is part of BFD, the Binary File Descriptor library.
6
 
7
This program is free software; you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 2 of the License, or
10
(at your option) any later version.
11
 
12
This program is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
GNU General Public License for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
 
21
#include "bfd.h"
22
#include "sysdep.h"
23
#include "bfdlink.h"
24
#include "libbfd.h"
25
#include "elf-bfd.h"
26
 
27
#include "elf/x86-64.h"
28
 
29
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value.  */
30
#define MINUS_ONE (~ (bfd_vma) 0)
31
 
32
/* The relocation "howto" table.  Order of fields:
33
   type, size, bitsize, pc_relative, complain_on_overflow,
34
   special_function, name, partial_inplace, src_mask, dst_pack, pcrel_offset.  */
35
static reloc_howto_type x86_64_elf_howto_table[] =
36
{
37
  HOWTO(R_X86_64_NONE, 0, 0, 0, false, 0, complain_overflow_dont,
38
        bfd_elf_generic_reloc, "R_X86_64_NONE", false, 0x00000000, 0x00000000,
39
        false),
40
  HOWTO(R_X86_64_64, 0, 4, 64, false, 0, complain_overflow_bitfield,
41
        bfd_elf_generic_reloc, "R_X86_64_64", false, MINUS_ONE, MINUS_ONE,
42
        false),
43
  HOWTO(R_X86_64_PC32, 0, 4, 32, true, 0, complain_overflow_signed,
44
        bfd_elf_generic_reloc, "R_X86_64_PC32", false, 0xffffffff, 0xffffffff,
45
        true),
46
  HOWTO(R_X86_64_GOT32, 0, 4, 32, false, 0, complain_overflow_signed,
47
        bfd_elf_generic_reloc, "R_X86_64_GOT32", false, 0xffffffff, 0xffffffff,
48
        false),
49
  HOWTO(R_X86_64_PLT32, 0, 4, 32, true, 0, complain_overflow_signed,
50
        bfd_elf_generic_reloc, "R_X86_64_PLT32", false, 0xffffffff, 0xffffffff,
51
        true),
52
  HOWTO(R_X86_64_COPY, 0, 4, 32, false, 0, complain_overflow_bitfield,
53
        bfd_elf_generic_reloc, "R_X86_64_COPY", false, 0xffffffff, 0xffffffff,
54
        false),
55
  HOWTO(R_X86_64_GLOB_DAT, 0, 4, 64, false, 0, complain_overflow_bitfield,
56
        bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", false, MINUS_ONE,
57
        MINUS_ONE, false),
58
  HOWTO(R_X86_64_JUMP_SLOT, 0, 4, 64, false, 0, complain_overflow_bitfield,
59
        bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", false, MINUS_ONE,
60
        MINUS_ONE, false),
61
  HOWTO(R_X86_64_RELATIVE, 0, 4, 64, false, 0, complain_overflow_bitfield,
62
        bfd_elf_generic_reloc, "R_X86_64_RELATIVE", false, MINUS_ONE,
63
        MINUS_ONE, false),
64
  HOWTO(R_X86_64_GOTPCREL, 0, 4, 32, true,0 , complain_overflow_signed,
65
        bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", false, 0xffffffff,
66
        0xffffffff, true),
67
  HOWTO(R_X86_64_32, 0, 4, 32, false, 0, complain_overflow_unsigned,
68
        bfd_elf_generic_reloc, "R_X86_64_32", false, 0xffffffff, 0xffffffff,
69
        false),
70
  HOWTO(R_X86_64_32S, 0, 4, 32, false, 0, complain_overflow_signed,
71
        bfd_elf_generic_reloc, "R_X86_64_32S", false, 0xffffffff, 0xffffffff,
72
        false),
73
  HOWTO(R_X86_64_16, 0, 1, 16, false, 0, complain_overflow_bitfield,
74
        bfd_elf_generic_reloc, "R_X86_64_16", false, 0xffff, 0xffff, false),
75
  HOWTO(R_X86_64_PC16,0, 1, 16, true, 0, complain_overflow_bitfield,
76
        bfd_elf_generic_reloc, "R_X86_64_PC16", false, 0xffff, 0xffff, true),
77
  HOWTO(R_X86_64_8, 0, 0, 8, false, 0, complain_overflow_signed,
78
        bfd_elf_generic_reloc, "R_X86_64_8", false, 0xff, 0xff, false),
79
  HOWTO(R_X86_64_PC8, 0, 0, 8, true, 0, complain_overflow_signed,
80
        bfd_elf_generic_reloc, "R_X86_64_PC8", false, 0xff, 0xff, true),
81
 
82
/* GNU extension to record C++ vtable hierarchy.  */
83
  HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, false, 0, complain_overflow_dont,
84
         NULL, "R_X86_64_GNU_VTINHERIT", false, 0, 0, false),
85
 
86
/* GNU extension to record C++ vtable member usage.  */
87
  HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, false, 0, complain_overflow_dont,
88
         _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", false, 0, 0,
89
         false)
90
};
91
 
92
/* Map BFD relocs to the x86_64 elf relocs.  */
93
struct elf_reloc_map
94
{
95
  bfd_reloc_code_real_type bfd_reloc_val;
96
  unsigned char elf_reloc_val;
97
};
98
 
99
static const struct elf_reloc_map x86_64_reloc_map[] =
100
{
101
  { BFD_RELOC_NONE,             R_X86_64_NONE, },
102
  { BFD_RELOC_64,               R_X86_64_64,   },
103
  { BFD_RELOC_32_PCREL,         R_X86_64_PC32, },
104
  { BFD_RELOC_X86_64_GOT32,     R_X86_64_GOT32,},
105
  { BFD_RELOC_X86_64_PLT32,     R_X86_64_PLT32,},
106
  { BFD_RELOC_X86_64_COPY,      R_X86_64_COPY, },
107
  { BFD_RELOC_X86_64_GLOB_DAT,  R_X86_64_GLOB_DAT, },
108
  { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, },
109
  { BFD_RELOC_X86_64_RELATIVE,  R_X86_64_RELATIVE, },
110
  { BFD_RELOC_X86_64_GOTPCREL,  R_X86_64_GOTPCREL, },
111
  { BFD_RELOC_32,               R_X86_64_32, },
112
  { BFD_RELOC_X86_64_32S,       R_X86_64_32S, },
113
  { BFD_RELOC_16,               R_X86_64_16, },
114
  { BFD_RELOC_16_PCREL,         R_X86_64_PC16, },
115
  { BFD_RELOC_8,                R_X86_64_8, },
116
  { BFD_RELOC_8_PCREL,          R_X86_64_PC8, },
117
  { BFD_RELOC_VTABLE_INHERIT,   R_X86_64_GNU_VTINHERIT, },
118
  { BFD_RELOC_VTABLE_ENTRY,     R_X86_64_GNU_VTENTRY, },
119
};
120
 
121
static reloc_howto_type *elf64_x86_64_reloc_type_lookup
122
  PARAMS ((bfd *, bfd_reloc_code_real_type));
123
static void elf64_x86_64_info_to_howto
124
  PARAMS ((bfd *, arelent *, Elf64_Internal_Rela *));
125
static boolean elf64_x86_64_grok_prstatus
126
  PARAMS ((bfd *, Elf_Internal_Note *));
127
static boolean elf64_x86_64_grok_psinfo
128
  PARAMS ((bfd *, Elf_Internal_Note *));
129
static struct bfd_link_hash_table *elf64_x86_64_link_hash_table_create
130
  PARAMS ((bfd *));
131
static boolean elf64_x86_64_elf_object_p PARAMS ((bfd *abfd));
132
static boolean create_got_section
133
  PARAMS((bfd *, struct bfd_link_info *));
134
static boolean elf64_x86_64_create_dynamic_sections
135
  PARAMS((bfd *, struct bfd_link_info *));
136
static void elf64_x86_64_copy_indirect_symbol
137
  PARAMS ((struct elf_backend_data *, struct elf_link_hash_entry *,
138
           struct elf_link_hash_entry *));
139
static boolean elf64_x86_64_check_relocs
140
  PARAMS ((bfd *, struct bfd_link_info *, asection *sec,
141
           const Elf_Internal_Rela *));
142
static asection *elf64_x86_64_gc_mark_hook
143
  PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
144
           struct elf_link_hash_entry *, Elf_Internal_Sym *));
145
 
146
static boolean elf64_x86_64_gc_sweep_hook
147
  PARAMS ((bfd *, struct bfd_link_info *, asection *,
148
           const Elf_Internal_Rela *));
149
 
150
static struct bfd_hash_entry *link_hash_newfunc
151
  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
152
static boolean elf64_x86_64_adjust_dynamic_symbol
153
  PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
154
 
155
static boolean allocate_dynrelocs
156
  PARAMS ((struct elf_link_hash_entry *, PTR));
157
static boolean readonly_dynrelocs
158
  PARAMS ((struct elf_link_hash_entry *, PTR));
159
static boolean elf64_x86_64_size_dynamic_sections
160
  PARAMS ((bfd *, struct bfd_link_info *));
161
static boolean elf64_x86_64_relocate_section
162
  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
163
         Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
164
static boolean elf64_x86_64_finish_dynamic_symbol
165
  PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
166
           Elf_Internal_Sym *sym));
167
static boolean elf64_x86_64_finish_dynamic_sections
168
  PARAMS ((bfd *, struct bfd_link_info *));
169
static enum elf_reloc_type_class elf64_x86_64_reloc_type_class
170
  PARAMS ((const Elf_Internal_Rela *));
171
 
172
/* Given a BFD reloc type, return a HOWTO structure.  */
173
static reloc_howto_type *
174
elf64_x86_64_reloc_type_lookup (abfd, code)
175
     bfd *abfd ATTRIBUTE_UNUSED;
176
     bfd_reloc_code_real_type code;
177
{
178
  unsigned int i;
179
  for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
180
       i++)
181
    {
182
      if (x86_64_reloc_map[i].bfd_reloc_val == code)
183
        return &x86_64_elf_howto_table[i];
184
    }
185
  return 0;
186
}
187
 
188
/* Given an x86_64 ELF reloc type, fill in an arelent structure.  */
189
 
190
static void
191
elf64_x86_64_info_to_howto (abfd, cache_ptr, dst)
192
     bfd *abfd ATTRIBUTE_UNUSED;
193
     arelent *cache_ptr;
194
     Elf64_Internal_Rela *dst;
195
{
196
  unsigned r_type, i;
197
 
198
  r_type = ELF64_R_TYPE (dst->r_info);
199
  if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT)
200
    {
201
      BFD_ASSERT (r_type <= (unsigned int) R_X86_64_PC8);
202
      i = r_type;
203
    }
204
  else
205
    {
206
      BFD_ASSERT (r_type < (unsigned int) R_X86_64_max);
207
      i = r_type - ((unsigned int) R_X86_64_GNU_VTINHERIT - R_X86_64_PC8 - 1);
208
    }
209
  cache_ptr->howto = &x86_64_elf_howto_table[i];
210
  BFD_ASSERT (r_type == cache_ptr->howto->type);
211
}
212
 
213
/* Support for core dump NOTE sections.  */
214
static boolean
215
elf64_x86_64_grok_prstatus (abfd, note)
216
     bfd *abfd;
217
     Elf_Internal_Note *note;
218
{
219
  int offset;
220
  size_t raw_size;
221
 
222
  switch (note->descsz)
223
    {
224
      default:
225
        return false;
226
 
227
      case 336:         /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
228
        /* pr_cursig */
229
        elf_tdata (abfd)->core_signal
230
          = bfd_get_16 (abfd, note->descdata + 12);
231
 
232
        /* pr_pid */
233
        elf_tdata (abfd)->core_pid
234
          = bfd_get_32 (abfd, note->descdata + 32);
235
 
236
        /* pr_reg */
237
        offset = 112;
238
        raw_size = 216;
239
 
240
        break;
241
    }
242
 
243
  /* Make a ".reg/999" section.  */
244
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
245
                                          raw_size, note->descpos + offset);
246
}
247
 
248
static boolean
249
elf64_x86_64_grok_psinfo (abfd, note)
250
     bfd *abfd;
251
     Elf_Internal_Note *note;
252
{
253
  switch (note->descsz)
254
    {
255
      default:
256
        return false;
257
 
258
      case 136:         /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
259
        elf_tdata (abfd)->core_program
260
         = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
261
        elf_tdata (abfd)->core_command
262
         = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
263
    }
264
 
265
  /* Note that for some reason, a spurious space is tacked
266
     onto the end of the args in some (at least one anyway)
267
     implementations, so strip it off if it exists.  */
268
 
269
  {
270
    char *command = elf_tdata (abfd)->core_command;
271
    int n = strlen (command);
272
 
273
    if (0 < n && command[n - 1] == ' ')
274
      command[n - 1] = '\0';
275
  }
276
 
277
  return true;
278
}
279
 
280
/* Functions for the x86-64 ELF linker.  */
281
 
282
/* The name of the dynamic interpreter.  This is put in the .interp
283
   section.  */
284
 
285
#define ELF_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
286
 
287
/* The size in bytes of an entry in the global offset table.  */
288
 
289
#define GOT_ENTRY_SIZE 8
290
 
291
/* The size in bytes of an entry in the procedure linkage table.  */
292
 
293
#define PLT_ENTRY_SIZE 16
294
 
295
/* The first entry in a procedure linkage table looks like this.  See the
296
   SVR4 ABI i386 supplement and the x86-64 ABI to see how this works.  */
297
 
298
static const bfd_byte elf64_x86_64_plt0_entry[PLT_ENTRY_SIZE] =
299
{
300
  0xff, 0x35, 8, 0, 0, 0,  /* pushq GOT+8(%rip)  */
301
  0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */
302
  0x90, 0x90, 0x90, 0x90        /* pad out to 16 bytes with nops.  */
303
};
304
 
305
/* Subsequent entries in a procedure linkage table look like this.  */
306
 
307
static const bfd_byte elf64_x86_64_plt_entry[PLT_ENTRY_SIZE] =
308
{
309
  0xff, 0x25,   /* jmpq *name@GOTPC(%rip) */
310
  0, 0, 0, 0,       /* replaced with offset to this symbol in .got.  */
311
  0x68,         /* pushq immediate */
312
  0, 0, 0, 0,       /* replaced with index into relocation table.  */
313
  0xe9,         /* jmp relative */
314
  0, 0, 0, 0        /* replaced with offset to start of .plt0.  */
315
};
316
 
317
/* The x86-64 linker needs to keep track of the number of relocs that
318
   it decides to copy as dynamic relocs in check_relocs for each symbol.
319
   This is so that it can later discard them if they are found to be
320
   unnecessary.  We store the information in a field extending the
321
   regular ELF linker hash table.  */
322
 
323
struct elf64_x86_64_dyn_relocs
324
{
325
  /* Next section.  */
326
  struct elf64_x86_64_dyn_relocs *next;
327
 
328
  /* The input section of the reloc.  */
329
  asection *sec;
330
 
331
  /* Total number of relocs copied for the input section.  */
332
  bfd_size_type count;
333
 
334
  /* Number of pc-relative relocs copied for the input section.  */
335
  bfd_size_type pc_count;
336
};
337
 
338
/* x86-64 ELF linker hash entry.  */
339
 
340
struct elf64_x86_64_link_hash_entry
341
{
342
  struct elf_link_hash_entry elf;
343
 
344
  /* Track dynamic relocs copied for this symbol.  */
345
  struct elf64_x86_64_dyn_relocs *dyn_relocs;
346
};
347
 
348
/* x86-64 ELF linker hash table.  */
349
 
350
struct elf64_x86_64_link_hash_table
351
{
352
  struct elf_link_hash_table elf;
353
 
354
  /* Short-cuts to get to dynamic linker sections.  */
355
  asection *sgot;
356
  asection *sgotplt;
357
  asection *srelgot;
358
  asection *splt;
359
  asection *srelplt;
360
  asection *sdynbss;
361
  asection *srelbss;
362
 
363
  /* Small local sym to section mapping cache.  */
364
  struct sym_sec_cache sym_sec;
365
};
366
 
367
/* Get the x86-64 ELF linker hash table from a link_info structure.  */
368
 
369
#define elf64_x86_64_hash_table(p) \
370
  ((struct elf64_x86_64_link_hash_table *) ((p)->hash))
371
 
372
/* Create an entry in an x86-64 ELF linker hash table.  */
373
 
374
static struct bfd_hash_entry *
375
link_hash_newfunc (entry, table, string)
376
     struct bfd_hash_entry *entry;
377
     struct bfd_hash_table *table;
378
     const char *string;
379
{
380
  /* Allocate the structure if it has not already been allocated by a
381
     subclass.  */
382
  if (entry == NULL)
383
    {
384
      entry = bfd_hash_allocate (table,
385
                                 sizeof (struct elf64_x86_64_link_hash_entry));
386
      if (entry == NULL)
387
        return entry;
388
    }
389
 
390
  /* Call the allocation method of the superclass.  */
391
  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
392
  if (entry != NULL)
393
    {
394
      struct elf64_x86_64_link_hash_entry *eh;
395
 
396
      eh = (struct elf64_x86_64_link_hash_entry *) entry;
397
      eh->dyn_relocs = NULL;
398
    }
399
 
400
  return entry;
401
}
402
 
403
/* Create an X86-64 ELF linker hash table.  */
404
 
405
static struct bfd_link_hash_table *
406
elf64_x86_64_link_hash_table_create (abfd)
407
     bfd *abfd;
408
{
409
  struct elf64_x86_64_link_hash_table *ret;
410
  bfd_size_type amt = sizeof (struct elf64_x86_64_link_hash_table);
411
 
412
  ret = (struct elf64_x86_64_link_hash_table *) bfd_malloc (amt);
413
  if (ret == NULL)
414
    return NULL;
415
 
416
  if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
417
    {
418
      free (ret);
419
      return NULL;
420
    }
421
 
422
  ret->sgot = NULL;
423
  ret->sgotplt = NULL;
424
  ret->srelgot = NULL;
425
  ret->splt = NULL;
426
  ret->srelplt = NULL;
427
  ret->sdynbss = NULL;
428
  ret->srelbss = NULL;
429
  ret->sym_sec.abfd = NULL;
430
 
431
  return &ret->elf.root;
432
}
433
 
434
/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
435
   shortcuts to them in our hash table.  */
436
 
437
static boolean
438
create_got_section (dynobj, info)
439
     bfd *dynobj;
440
     struct bfd_link_info *info;
441
{
442
  struct elf64_x86_64_link_hash_table *htab;
443
 
444
  if (! _bfd_elf_create_got_section (dynobj, info))
445
    return false;
446
 
447
  htab = elf64_x86_64_hash_table (info);
448
  htab->sgot = bfd_get_section_by_name (dynobj, ".got");
449
  htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
450
  if (!htab->sgot || !htab->sgotplt)
451
    abort ();
452
 
453
  htab->srelgot = bfd_make_section (dynobj, ".rela.got");
454
  if (htab->srelgot == NULL
455
      || ! bfd_set_section_flags (dynobj, htab->srelgot,
456
                                  (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
457
                                   | SEC_IN_MEMORY | SEC_LINKER_CREATED
458
                                   | SEC_READONLY))
459
      || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3))
460
    return false;
461
  return true;
462
}
463
 
464
/* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
465
   .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
466
   hash table.  */
467
 
468
static boolean
469
elf64_x86_64_create_dynamic_sections (dynobj, info)
470
     bfd *dynobj;
471
     struct bfd_link_info *info;
472
{
473
  struct elf64_x86_64_link_hash_table *htab;
474
 
475
  htab = elf64_x86_64_hash_table (info);
476
  if (!htab->sgot && !create_got_section (dynobj, info))
477
    return false;
478
 
479
  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
480
    return false;
481
 
482
  htab->splt = bfd_get_section_by_name (dynobj, ".plt");
483
  htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
484
  htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
485
  if (!info->shared)
486
    htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
487
 
488
  if (!htab->splt || !htab->srelplt || !htab->sdynbss
489
      || (!info->shared && !htab->srelbss))
490
    abort ();
491
 
492
  return true;
493
}
494
 
495
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
496
 
497
static void
498
elf64_x86_64_copy_indirect_symbol (bed, dir, ind)
499
     struct elf_backend_data *bed;
500
     struct elf_link_hash_entry *dir, *ind;
501
{
502
  struct elf64_x86_64_link_hash_entry *edir, *eind;
503
 
504
  edir = (struct elf64_x86_64_link_hash_entry *) dir;
505
  eind = (struct elf64_x86_64_link_hash_entry *) ind;
506
 
507
  if (eind->dyn_relocs != NULL)
508
    {
509
      if (edir->dyn_relocs != NULL)
510
        {
511
          struct elf64_x86_64_dyn_relocs **pp;
512
          struct elf64_x86_64_dyn_relocs *p;
513
 
514
          if (ind->root.type == bfd_link_hash_indirect)
515
            abort ();
516
 
517
          /* Add reloc counts against the weak sym to the strong sym
518
             list.  Merge any entries against the same section.  */
519
          for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
520
            {
521
              struct elf64_x86_64_dyn_relocs *q;
522
 
523
              for (q = edir->dyn_relocs; q != NULL; q = q->next)
524
                if (q->sec == p->sec)
525
                  {
526
                    q->pc_count += p->pc_count;
527
                    q->count += p->count;
528
                    *pp = p->next;
529
                    break;
530
                  }
531
              if (q == NULL)
532
                pp = &p->next;
533
            }
534
          *pp = edir->dyn_relocs;
535
        }
536
 
537
      edir->dyn_relocs = eind->dyn_relocs;
538
      eind->dyn_relocs = NULL;
539
    }
540
 
541
  _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
542
}
543
 
544
static boolean
545
elf64_x86_64_elf_object_p (abfd)
546
     bfd *abfd;
547
{
548
  /* Set the right machine number for an x86-64 elf64 file.  */
549
  bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
550
  return true;
551
}
552
 
553
/* Look through the relocs for a section during the first phase, and
554
   calculate needed space in the global offset table, procedure
555
   linkage table, and dynamic reloc sections.  */
556
 
557
static boolean
558
elf64_x86_64_check_relocs (abfd, info, sec, relocs)
559
     bfd *abfd;
560
     struct bfd_link_info *info;
561
     asection *sec;
562
     const Elf_Internal_Rela *relocs;
563
{
564
  struct elf64_x86_64_link_hash_table *htab;
565
  Elf_Internal_Shdr *symtab_hdr;
566
  struct elf_link_hash_entry **sym_hashes;
567
  const Elf_Internal_Rela *rel;
568
  const Elf_Internal_Rela *rel_end;
569
  asection *sreloc;
570
 
571
  if (info->relocateable)
572
    return true;
573
 
574
  htab = elf64_x86_64_hash_table (info);
575
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
576
  sym_hashes = elf_sym_hashes (abfd);
577
 
578
  sreloc = NULL;
579
 
580
  rel_end = relocs + sec->reloc_count;
581
  for (rel = relocs; rel < rel_end; rel++)
582
    {
583
      unsigned long r_symndx;
584
      struct elf_link_hash_entry *h;
585
 
586
      r_symndx = ELF64_R_SYM (rel->r_info);
587
 
588
      if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
589
        {
590
          (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
591
                                 bfd_archive_filename (abfd),
592
                                 r_symndx);
593
          return false;
594
        }
595
 
596
      if (r_symndx < symtab_hdr->sh_info)
597
        h = NULL;
598
      else
599
        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
600
 
601
      switch (ELF64_R_TYPE (rel->r_info))
602
        {
603
        case R_X86_64_GOT32:
604
        case R_X86_64_GOTPCREL:
605
          /* This symbol requires a global offset table entry.  */
606
          if (h != NULL)
607
            {
608
              h->got.refcount += 1;
609
            }
610
          else
611
            {
612
              bfd_signed_vma *local_got_refcounts;
613
 
614
              /* This is a global offset table entry for a local symbol.  */
615
              local_got_refcounts = elf_local_got_refcounts (abfd);
616
              if (local_got_refcounts == NULL)
617
                {
618
                  bfd_size_type size;
619
 
620
                  size = symtab_hdr->sh_info;
621
                  size *= sizeof (bfd_signed_vma);
622
                  local_got_refcounts = ((bfd_signed_vma *)
623
                                         bfd_zalloc (abfd, size));
624
                  if (local_got_refcounts == NULL)
625
                    return false;
626
                  elf_local_got_refcounts (abfd) = local_got_refcounts;
627
                }
628
              local_got_refcounts[r_symndx] += 1;
629
            }
630
          /* Fall through */
631
 
632
          //case R_X86_64_GOTPCREL:
633
          if (htab->sgot == NULL)
634
            {
635
              if (htab->elf.dynobj == NULL)
636
                htab->elf.dynobj = abfd;
637
              if (!create_got_section (htab->elf.dynobj, info))
638
                return false;
639
            }
640
          break;
641
 
642
        case R_X86_64_PLT32:
643
          /* This symbol requires a procedure linkage table entry.  We
644
             actually build the entry in adjust_dynamic_symbol,
645
             because this might be a case of linking PIC code which is
646
             never referenced by a dynamic object, in which case we
647
             don't need to generate a procedure linkage table entry
648
             after all.  */
649
 
650
          /* If this is a local symbol, we resolve it directly without
651
             creating a procedure linkage table entry.  */
652
          if (h == NULL)
653
            continue;
654
 
655
          h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
656
          h->plt.refcount += 1;
657
          break;
658
 
659
        case R_X86_64_8:
660
        case R_X86_64_16:
661
        case R_X86_64_32:
662
        case R_X86_64_32S:
663
          /* Let's help debug shared library creation.  These relocs
664
             cannot be used in shared libs.  Don't error out for
665
             sections we don't care about, such as debug sections or
666
             non-constant sections.  */
667
          if (info->shared
668
              && (sec->flags & SEC_ALLOC) != 0
669
              && (sec->flags & SEC_READONLY) != 0)
670
            {
671
              (*_bfd_error_handler)
672
                (_("%s: relocation %s can not be used when making a shared object; recompile with -fPIC"),
673
                 bfd_archive_filename (abfd),
674
                 x86_64_elf_howto_table[ELF64_R_TYPE (rel->r_info)].name);
675
              bfd_set_error (bfd_error_bad_value);
676
              return false;
677
            }
678
          /* Fall through.  */
679
 
680
        case R_X86_64_PC8:
681
        case R_X86_64_PC16:
682
        case R_X86_64_PC32:
683
        case R_X86_64_64:
684
          if (h != NULL && !info->shared)
685
            {
686
              /* If this reloc is in a read-only section, we might
687
                 need a copy reloc.  We can't check reliably at this
688
                 stage whether the section is read-only, as input
689
                 sections have not yet been mapped to output sections.
690
                 Tentatively set the flag for now, and correct in
691
                 adjust_dynamic_symbol.  */
692
              h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
693
 
694
              /* We may need a .plt entry if the function this reloc
695
                 refers to is in a shared lib.  */
696
              h->plt.refcount += 1;
697
            }
698
 
699
          /* If we are creating a shared library, and this is a reloc
700
             against a global symbol, or a non PC relative reloc
701
             against a local symbol, then we need to copy the reloc
702
             into the shared library.  However, if we are linking with
703
             -Bsymbolic, we do not need to copy a reloc against a
704
             global symbol which is defined in an object we are
705
             including in the link (i.e., DEF_REGULAR is set).  At
706
             this point we have not seen all the input files, so it is
707
             possible that DEF_REGULAR is not set now but will be set
708
             later (it is never cleared).  In case of a weak definition,
709
             DEF_REGULAR may be cleared later by a strong definition in
710
             a shared library.  We account for that possibility below by
711
             storing information in the relocs_copied field of the hash
712
             table entry.  A similar situation occurs when creating
713
             shared libraries and symbol visibility changes render the
714
             symbol local.
715
 
716
             If on the other hand, we are creating an executable, we
717
             may need to keep relocations for symbols satisfied by a
718
             dynamic library if we manage to avoid copy relocs for the
719
             symbol.  */
720
          if ((info->shared
721
               && (sec->flags & SEC_ALLOC) != 0
722
               && (((ELF64_R_TYPE (rel->r_info) != R_X86_64_PC8)
723
                    && (ELF64_R_TYPE (rel->r_info) != R_X86_64_PC16)
724
                    && (ELF64_R_TYPE (rel->r_info) != R_X86_64_PC32))
725
                   || (h != NULL
726
                       && (! info->symbolic
727
                           || h->root.type == bfd_link_hash_defweak
728
                           || (h->elf_link_hash_flags
729
                               & ELF_LINK_HASH_DEF_REGULAR) == 0))))
730
              || (!info->shared
731
                  && (sec->flags & SEC_ALLOC) != 0
732
                  && h != NULL
733
                  && (h->root.type == bfd_link_hash_defweak
734
                      || (h->elf_link_hash_flags
735
                          & ELF_LINK_HASH_DEF_REGULAR) == 0)))
736
            {
737
              struct elf64_x86_64_dyn_relocs *p;
738
              struct elf64_x86_64_dyn_relocs **head;
739
 
740
              /* We must copy these reloc types into the output file.
741
                 Create a reloc section in dynobj and make room for
742
                 this reloc.  */
743
              if (sreloc == NULL)
744
                {
745
                  const char *name;
746
                  bfd *dynobj;
747
 
748
                  name = (bfd_elf_string_from_elf_section
749
                          (abfd,
750
                           elf_elfheader (abfd)->e_shstrndx,
751
                           elf_section_data (sec)->rel_hdr.sh_name));
752
                  if (name == NULL)
753
                    return false;
754
 
755
                  if (strncmp (name, ".rela", 5) != 0
756
                      || strcmp (bfd_get_section_name (abfd, sec),
757
                                 name + 5) != 0)
758
                    {
759
                      (*_bfd_error_handler)
760
                        (_("%s: bad relocation section name `%s\'"),
761
                         bfd_archive_filename (abfd), name);
762
                    }
763
 
764
                  if (htab->elf.dynobj == NULL)
765
                    htab->elf.dynobj = abfd;
766
 
767
                  dynobj = htab->elf.dynobj;
768
 
769
                  sreloc = bfd_get_section_by_name (dynobj, name);
770
                  if (sreloc == NULL)
771
                    {
772
                      flagword flags;
773
 
774
                      sreloc = bfd_make_section (dynobj, name);
775
                      flags = (SEC_HAS_CONTENTS | SEC_READONLY
776
                               | SEC_IN_MEMORY | SEC_LINKER_CREATED);
777
                      if ((sec->flags & SEC_ALLOC) != 0)
778
                        flags |= SEC_ALLOC | SEC_LOAD;
779
                      if (sreloc == NULL
780
                          || ! bfd_set_section_flags (dynobj, sreloc, flags)
781
                          || ! bfd_set_section_alignment (dynobj, sreloc, 3))
782
                        return false;
783
                    }
784
                  elf_section_data (sec)->sreloc = sreloc;
785
                }
786
 
787
              /* If this is a global symbol, we count the number of
788
                 relocations we need for this symbol.  */
789
              if (h != NULL)
790
                {
791
                  head = &((struct elf64_x86_64_link_hash_entry *) h)->dyn_relocs;
792
                }
793
              else
794
                {
795
                  /* Track dynamic relocs needed for local syms too.
796
                     We really need local syms available to do this
797
                     easily.  Oh well.  */
798
 
799
                  asection *s;
800
                  s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
801
                                                 sec, r_symndx);
802
                  if (s == NULL)
803
                    return false;
804
 
805
                  head = ((struct elf64_x86_64_dyn_relocs **)
806
                          &elf_section_data (s)->local_dynrel);
807
                }
808
 
809
              p = *head;
810
              if (p == NULL || p->sec != sec)
811
                {
812
                  bfd_size_type amt = sizeof *p;
813
                  p = ((struct elf64_x86_64_dyn_relocs *)
814
                       bfd_alloc (htab->elf.dynobj, amt));
815
                  if (p == NULL)
816
                    return false;
817
                  p->next = *head;
818
                  *head = p;
819
                  p->sec = sec;
820
                  p->count = 0;
821
                  p->pc_count = 0;
822
                }
823
 
824
              p->count += 1;
825
              if (ELF64_R_TYPE (rel->r_info) == R_X86_64_PC8
826
                  || ELF64_R_TYPE (rel->r_info) == R_X86_64_PC16
827
                  || ELF64_R_TYPE (rel->r_info) == R_X86_64_PC32)
828
                p->pc_count += 1;
829
            }
830
          break;
831
 
832
          /* This relocation describes the C++ object vtable hierarchy.
833
             Reconstruct it for later use during GC.  */
834
        case R_X86_64_GNU_VTINHERIT:
835
          if (!_bfd_elf64_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
836
            return false;
837
          break;
838
 
839
          /* This relocation describes which C++ vtable entries are actually
840
             used.  Record for later use during GC.  */
841
        case R_X86_64_GNU_VTENTRY:
842
          if (!_bfd_elf64_gc_record_vtentry (abfd, sec, h, rel->r_addend))
843
            return false;
844
          break;
845
 
846
        default:
847
          break;
848
        }
849
    }
850
 
851
  return true;
852
}
853
 
854
/* Return the section that should be marked against GC for a given
855
   relocation.  */
856
 
857
static asection *
858
elf64_x86_64_gc_mark_hook (sec, info, rel, h, sym)
859
     asection *sec;
860
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
861
     Elf_Internal_Rela *rel;
862
     struct elf_link_hash_entry *h;
863
     Elf_Internal_Sym *sym;
864
{
865
  if (h != NULL)
866
    {
867
      switch (ELF64_R_TYPE (rel->r_info))
868
        {
869
        case R_X86_64_GNU_VTINHERIT:
870
        case R_X86_64_GNU_VTENTRY:
871
          break;
872
 
873
        default:
874
          switch (h->root.type)
875
            {
876
            case bfd_link_hash_defined:
877
            case bfd_link_hash_defweak:
878
              return h->root.u.def.section;
879
 
880
            case bfd_link_hash_common:
881
              return h->root.u.c.p->section;
882
 
883
            default:
884
              break;
885
            }
886
        }
887
    }
888
  else
889
    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
890
 
891
  return NULL;
892
}
893
 
894
/* Update the got entry reference counts for the section being removed.  */
895
 
896
static boolean
897
elf64_x86_64_gc_sweep_hook (abfd, info, sec, relocs)
898
     bfd *abfd;
899
     struct bfd_link_info *info;
900
     asection *sec;
901
     const Elf_Internal_Rela *relocs;
902
{
903
  Elf_Internal_Shdr *symtab_hdr;
904
  struct elf_link_hash_entry **sym_hashes;
905
  bfd_signed_vma *local_got_refcounts;
906
  const Elf_Internal_Rela *rel, *relend;
907
  unsigned long r_symndx;
908
  struct elf_link_hash_entry *h;
909
 
910
  elf_section_data (sec)->local_dynrel = NULL;
911
 
912
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
913
  sym_hashes = elf_sym_hashes (abfd);
914
  local_got_refcounts = elf_local_got_refcounts (abfd);
915
 
916
  relend = relocs + sec->reloc_count;
917
  for (rel = relocs; rel < relend; rel++)
918
    switch (ELF64_R_TYPE (rel->r_info))
919
      {
920
      case R_X86_64_GOT32:
921
      case R_X86_64_GOTPCREL:
922
        r_symndx = ELF64_R_SYM (rel->r_info);
923
        if (r_symndx >= symtab_hdr->sh_info)
924
          {
925
            h = sym_hashes[r_symndx - symtab_hdr->sh_info];
926
            if (h->got.refcount > 0)
927
              h->got.refcount -= 1;
928
          }
929
        else if (local_got_refcounts != NULL)
930
          {
931
            if (local_got_refcounts[r_symndx] > 0)
932
              local_got_refcounts[r_symndx] -= 1;
933
          }
934
        break;
935
 
936
      case R_X86_64_8:
937
      case R_X86_64_16:
938
      case R_X86_64_32:
939
      case R_X86_64_64:
940
      case R_X86_64_32S:
941
      case R_X86_64_PC8:
942
      case R_X86_64_PC16:
943
      case R_X86_64_PC32:
944
        r_symndx = ELF64_R_SYM (rel->r_info);
945
        if (r_symndx >= symtab_hdr->sh_info)
946
          {
947
            struct elf64_x86_64_link_hash_entry *eh;
948
            struct elf64_x86_64_dyn_relocs **pp;
949
            struct elf64_x86_64_dyn_relocs *p;
950
 
951
            h = sym_hashes[r_symndx - symtab_hdr->sh_info];
952
 
953
            if (!info->shared && h->plt.refcount > 0)
954
              h->plt.refcount -= 1;
955
 
956
            eh = (struct elf64_x86_64_link_hash_entry *) h;
957
 
958
            for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
959
              if (p->sec == sec)
960
                {
961
                  if (ELF64_R_TYPE (rel->r_info) == R_X86_64_PC8
962
                      || ELF64_R_TYPE (rel->r_info) == R_X86_64_PC16
963
                      || ELF64_R_TYPE (rel->r_info) == R_X86_64_PC32)
964
                    p->pc_count -= 1;
965
                  p->count -= 1;
966
                  if (p->count == 0)
967
                    *pp = p->next;
968
                  break;
969
                }
970
          }
971
        break;
972
 
973
 
974
      case R_X86_64_PLT32:
975
        r_symndx = ELF64_R_SYM (rel->r_info);
976
        if (r_symndx >= symtab_hdr->sh_info)
977
          {
978
            h = sym_hashes[r_symndx - symtab_hdr->sh_info];
979
            if (h->plt.refcount > 0)
980
              h->plt.refcount -= 1;
981
          }
982
        break;
983
 
984
      default:
985
        break;
986
      }
987
 
988
  return true;
989
}
990
 
991
/* Adjust a symbol defined by a dynamic object and referenced by a
992
   regular object.  The current definition is in some section of the
993
   dynamic object, but we're not including those sections.  We have to
994
   change the definition to something the rest of the link can
995
   understand.  */
996
 
997
static boolean
998
elf64_x86_64_adjust_dynamic_symbol (info, h)
999
     struct bfd_link_info *info;
1000
     struct elf_link_hash_entry *h;
1001
{
1002
  struct elf64_x86_64_link_hash_table *htab;
1003
  struct elf64_x86_64_link_hash_entry * eh;
1004
  struct elf64_x86_64_dyn_relocs *p;
1005
  asection *s;
1006
  unsigned int power_of_two;
1007
 
1008
  /* If this is a function, put it in the procedure linkage table.  We
1009
     will fill in the contents of the procedure linkage table later,
1010
     when we know the address of the .got section.  */
1011
  if (h->type == STT_FUNC
1012
      || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
1013
    {
1014
      if (h->plt.refcount <= 0
1015
          || (! info->shared
1016
              && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
1017
              && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
1018
              && h->root.type != bfd_link_hash_undefweak
1019
              && h->root.type != bfd_link_hash_undefined))
1020
        {
1021
          /* This case can occur if we saw a PLT32 reloc in an input
1022
             file, but the symbol was never referred to by a dynamic
1023
             object, or if all references were garbage collected.  In
1024
             such a case, we don't actually need to build a procedure
1025
             linkage table, and we can just do a PC32 reloc instead.  */
1026
          h->plt.offset = (bfd_vma) -1;
1027
          h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1028
        }
1029
 
1030
      return true;
1031
    }
1032
  else
1033
    /* It's possible that we incorrectly decided a .plt reloc was
1034
       needed for an R_X86_64_PC32 reloc to a non-function sym in
1035
       check_relocs.  We can't decide accurately between function and
1036
       non-function syms in check-relocs;  Objects loaded later in
1037
       the link may change h->type.  So fix it now.  */
1038
    h->plt.offset = (bfd_vma) -1;
1039
 
1040
  /* If this is a weak symbol, and there is a real definition, the
1041
     processor independent code will have arranged for us to see the
1042
     real definition first, and we can just use the same value.  */
1043
  if (h->weakdef != NULL)
1044
    {
1045
      BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1046
                  || h->weakdef->root.type == bfd_link_hash_defweak);
1047
      h->root.u.def.section = h->weakdef->root.u.def.section;
1048
      h->root.u.def.value = h->weakdef->root.u.def.value;
1049
      return true;
1050
    }
1051
 
1052
  /* This is a reference to a symbol defined by a dynamic object which
1053
     is not a function.  */
1054
 
1055
  /* If we are creating a shared library, we must presume that the
1056
     only references to the symbol are via the global offset table.
1057
     For such cases we need not do anything here; the relocations will
1058
     be handled correctly by relocate_section.  */
1059
  if (info->shared)
1060
    return true;
1061
 
1062
  /* If there are no references to this symbol that do not use the
1063
     GOT, we don't need to generate a copy reloc.  */
1064
  if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1065
    return true;
1066
 
1067
  /* If -z nocopyreloc was given, we won't generate them either.  */
1068
  if (info->nocopyreloc)
1069
    {
1070
      h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1071
      return true;
1072
    }
1073
 
1074
  eh = (struct elf64_x86_64_link_hash_entry *) h;
1075
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
1076
    {
1077
      s = p->sec->output_section;
1078
      if (s != NULL && (s->flags & SEC_READONLY) != 0)
1079
        break;
1080
    }
1081
 
1082
  /* If we didn't find any dynamic relocs in read-only sections, then
1083
     we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1084
  if (p == NULL)
1085
    {
1086
      h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1087
      return true;
1088
    }
1089
 
1090
  /* We must allocate the symbol in our .dynbss section, which will
1091
     become part of the .bss section of the executable.  There will be
1092
     an entry for this symbol in the .dynsym section.  The dynamic
1093
     object will contain position independent code, so all references
1094
     from the dynamic object to this symbol will go through the global
1095
     offset table.  The dynamic linker will use the .dynsym entry to
1096
     determine the address it must put in the global offset table, so
1097
     both the dynamic object and the regular object will refer to the
1098
     same memory location for the variable.  */
1099
 
1100
  htab = elf64_x86_64_hash_table (info);
1101
 
1102
  /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
1103
     to copy the initial value out of the dynamic object and into the
1104
     runtime process image.  */
1105
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1106
    {
1107
      htab->srelbss->_raw_size += sizeof (Elf64_External_Rela);
1108
      h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1109
    }
1110
 
1111
  /* We need to figure out the alignment required for this symbol.  I
1112
     have no idea how ELF linkers handle this.  16-bytes is the size
1113
     of the largest type that requires hard alignment -- long double.  */
1114
  /* FIXME: This is VERY ugly. Should be fixed for all architectures using
1115
     this construct.  */
1116
  power_of_two = bfd_log2 (h->size);
1117
  if (power_of_two > 4)
1118
    power_of_two = 4;
1119
 
1120
  /* Apply the required alignment.  */
1121
  s = htab->sdynbss;
1122
  s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two));
1123
  if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
1124
    {
1125
      if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
1126
        return false;
1127
    }
1128
 
1129
  /* Define the symbol as being at this point in the section.  */
1130
  h->root.u.def.section = s;
1131
  h->root.u.def.value = s->_raw_size;
1132
 
1133
  /* Increment the section size to make room for the symbol.  */
1134
  s->_raw_size += h->size;
1135
 
1136
  return true;
1137
}
1138
 
1139
/* This is the condition under which elf64_x86_64_finish_dynamic_symbol
1140
   will be called from elflink.h.  If elflink.h doesn't call our
1141
   finish_dynamic_symbol routine, we'll need to do something about
1142
   initializing any .plt and .got entries in elf64_x86_64_relocate_section.  */
1143
#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
1144
  ((DYN)                                                                \
1145
   && ((INFO)->shared                                                   \
1146
       || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)       \
1147
   && ((H)->dynindx != -1                                               \
1148
       || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
1149
 
1150
/* Allocate space in .plt, .got and associated reloc sections for
1151
   dynamic relocs.  */
1152
 
1153
static boolean
1154
allocate_dynrelocs (h, inf)
1155
     struct elf_link_hash_entry *h;
1156
     PTR inf;
1157
{
1158
  struct bfd_link_info *info;
1159
  struct elf64_x86_64_link_hash_table *htab;
1160
  struct elf64_x86_64_link_hash_entry *eh;
1161
  struct elf64_x86_64_dyn_relocs *p;
1162
 
1163
  if (h->root.type == bfd_link_hash_indirect)
1164
    return true;
1165
 
1166
  if (h->root.type == bfd_link_hash_warning)
1167
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1168
 
1169
  info = (struct bfd_link_info *) inf;
1170
  htab = elf64_x86_64_hash_table (info);
1171
 
1172
  if (htab->elf.dynamic_sections_created
1173
      && h->plt.refcount > 0)
1174
    {
1175
      /* Make sure this symbol is output as a dynamic symbol.
1176
         Undefined weak syms won't yet be marked as dynamic.  */
1177
      if (h->dynindx == -1
1178
          && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1179
        {
1180
          if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1181
            return false;
1182
        }
1183
 
1184
      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
1185
        {
1186
          asection *s = htab->splt;
1187
 
1188
          /* If this is the first .plt entry, make room for the special
1189
             first entry.  */
1190
          if (s->_raw_size == 0)
1191
            s->_raw_size += PLT_ENTRY_SIZE;
1192
 
1193
          h->plt.offset = s->_raw_size;
1194
 
1195
          /* If this symbol is not defined in a regular file, and we are
1196
             not generating a shared library, then set the symbol to this
1197
             location in the .plt.  This is required to make function
1198
             pointers compare as equal between the normal executable and
1199
             the shared library.  */
1200
          if (! info->shared
1201
              && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1202
            {
1203
              h->root.u.def.section = s;
1204
              h->root.u.def.value = h->plt.offset;
1205
            }
1206
 
1207
          /* Make room for this entry.  */
1208
          s->_raw_size += PLT_ENTRY_SIZE;
1209
 
1210
          /* We also need to make an entry in the .got.plt section, which
1211
             will be placed in the .got section by the linker script.  */
1212
          htab->sgotplt->_raw_size += GOT_ENTRY_SIZE;
1213
 
1214
          /* We also need to make an entry in the .rela.plt section.  */
1215
          htab->srelplt->_raw_size += sizeof (Elf64_External_Rela);
1216
        }
1217
      else
1218
        {
1219
          h->plt.offset = (bfd_vma) -1;
1220
          h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1221
        }
1222
    }
1223
  else
1224
    {
1225
      h->plt.offset = (bfd_vma) -1;
1226
      h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1227
    }
1228
 
1229
  if (h->got.refcount > 0)
1230
    {
1231
      asection *s;
1232
      boolean dyn;
1233
 
1234
      /* Make sure this symbol is output as a dynamic symbol.
1235
         Undefined weak syms won't yet be marked as dynamic.  */
1236
      if (h->dynindx == -1
1237
          && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1238
        {
1239
          if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1240
            return false;
1241
        }
1242
 
1243
      s = htab->sgot;
1244
      h->got.offset = s->_raw_size;
1245
      s->_raw_size += GOT_ENTRY_SIZE;
1246
      dyn = htab->elf.dynamic_sections_created;
1247
      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
1248
        htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
1249
    }
1250
  else
1251
    h->got.offset = (bfd_vma) -1;
1252
 
1253
  eh = (struct elf64_x86_64_link_hash_entry *) h;
1254
  if (eh->dyn_relocs == NULL)
1255
    return true;
1256
 
1257
  /* In the shared -Bsymbolic case, discard space allocated for
1258
     dynamic pc-relative relocs against symbols which turn out to be
1259
     defined in regular objects.  For the normal shared case, discard
1260
     space for pc-relative relocs that have become local due to symbol
1261
     visibility changes.  */
1262
 
1263
  if (info->shared)
1264
    {
1265
      if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1266
          && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1267
              || info->symbolic))
1268
        {
1269
          struct elf64_x86_64_dyn_relocs **pp;
1270
 
1271
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1272
            {
1273
              p->count -= p->pc_count;
1274
              p->pc_count = 0;
1275
              if (p->count == 0)
1276
                *pp = p->next;
1277
              else
1278
                pp = &p->next;
1279
            }
1280
        }
1281
    }
1282
  else
1283
    {
1284
      /* For the non-shared case, discard space for relocs against
1285
         symbols which turn out to need copy relocs or are not
1286
         dynamic.  */
1287
 
1288
      if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1289
          && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1290
               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1291
              || (htab->elf.dynamic_sections_created
1292
                  && (h->root.type == bfd_link_hash_undefweak
1293
                      || h->root.type == bfd_link_hash_undefined))))
1294
        {
1295
          /* Make sure this symbol is output as a dynamic symbol.
1296
             Undefined weak syms won't yet be marked as dynamic.  */
1297
          if (h->dynindx == -1
1298
              && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1299
            {
1300
              if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1301
                return false;
1302
            }
1303
 
1304
          /* If that succeeded, we know we'll be keeping all the
1305
             relocs.  */
1306
          if (h->dynindx != -1)
1307
            goto keep;
1308
        }
1309
 
1310
      eh->dyn_relocs = NULL;
1311
 
1312
    keep: ;
1313
    }
1314
 
1315
  /* Finally, allocate space.  */
1316
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
1317
    {
1318
      asection *sreloc = elf_section_data (p->sec)->sreloc;
1319
      sreloc->_raw_size += p->count * sizeof (Elf64_External_Rela);
1320
    }
1321
 
1322
  return true;
1323
}
1324
 
1325
/* Find any dynamic relocs that apply to read-only sections.  */
1326
 
1327
static boolean
1328
readonly_dynrelocs (h, inf)
1329
     struct elf_link_hash_entry *h;
1330
     PTR inf;
1331
{
1332
  struct elf64_x86_64_link_hash_entry *eh;
1333
  struct elf64_x86_64_dyn_relocs *p;
1334
 
1335
  if (h->root.type == bfd_link_hash_warning)
1336
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1337
 
1338
  eh = (struct elf64_x86_64_link_hash_entry *) h;
1339
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
1340
    {
1341
      asection *s = p->sec->output_section;
1342
 
1343
      if (s != NULL && (s->flags & SEC_READONLY) != 0)
1344
        {
1345
          struct bfd_link_info *info = (struct bfd_link_info *) inf;
1346
 
1347
          info->flags |= DF_TEXTREL;
1348
 
1349
          /* Not an error, just cut short the traversal.  */
1350
          return false;
1351
        }
1352
    }
1353
  return true;
1354
}
1355
 
1356
/* Set the sizes of the dynamic sections.  */
1357
 
1358
static boolean
1359
elf64_x86_64_size_dynamic_sections (output_bfd, info)
1360
     bfd *output_bfd ATTRIBUTE_UNUSED;
1361
     struct bfd_link_info *info;
1362
{
1363
  struct elf64_x86_64_link_hash_table *htab;
1364
  bfd *dynobj;
1365
  asection *s;
1366
  boolean relocs;
1367
  bfd *ibfd;
1368
 
1369
  htab = elf64_x86_64_hash_table (info);
1370
  dynobj = htab->elf.dynobj;
1371
  if (dynobj == NULL)
1372
    abort ();
1373
 
1374
  if (htab->elf.dynamic_sections_created)
1375
    {
1376
      /* Set the contents of the .interp section to the interpreter.  */
1377
      if (! info->shared)
1378
        {
1379
          s = bfd_get_section_by_name (dynobj, ".interp");
1380
          if (s == NULL)
1381
            abort ();
1382
          s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1383
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1384
        }
1385
    }
1386
 
1387
  /* Set up .got offsets for local syms, and space for local dynamic
1388
     relocs.  */
1389
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1390
    {
1391
      bfd_signed_vma *local_got;
1392
      bfd_signed_vma *end_local_got;
1393
      bfd_size_type locsymcount;
1394
      Elf_Internal_Shdr *symtab_hdr;
1395
      asection *srel;
1396
 
1397
      if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1398
        continue;
1399
 
1400
      for (s = ibfd->sections; s != NULL; s = s->next)
1401
        {
1402
          struct elf64_x86_64_dyn_relocs *p;
1403
 
1404
          for (p = *((struct elf64_x86_64_dyn_relocs **)
1405
                     &elf_section_data (s)->local_dynrel);
1406
               p != NULL;
1407
               p = p->next)
1408
            {
1409
              if (!bfd_is_abs_section (p->sec)
1410
                  && bfd_is_abs_section (p->sec->output_section))
1411
                {
1412
                  /* Input section has been discarded, either because
1413
                     it is a copy of a linkonce section or due to
1414
                     linker script /DISCARD/, so we'll be discarding
1415
                     the relocs too.  */
1416
                }
1417
              else if (p->count != 0)
1418
                {
1419
                  srel = elf_section_data (p->sec)->sreloc;
1420
                  srel->_raw_size += p->count * sizeof (Elf64_External_Rela);
1421
                  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1422
                    info->flags |= DF_TEXTREL;
1423
 
1424
                }
1425
            }
1426
        }
1427
 
1428
      local_got = elf_local_got_refcounts (ibfd);
1429
      if (!local_got)
1430
        continue;
1431
 
1432
      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1433
      locsymcount = symtab_hdr->sh_info;
1434
      end_local_got = local_got + locsymcount;
1435
      s = htab->sgot;
1436
      srel = htab->srelgot;
1437
      for (; local_got < end_local_got; ++local_got)
1438
        {
1439
          if (*local_got > 0)
1440
            {
1441
              *local_got = s->_raw_size;
1442
              s->_raw_size += GOT_ENTRY_SIZE;
1443
              if (info->shared)
1444
                srel->_raw_size += sizeof (Elf64_External_Rela);
1445
            }
1446
          else
1447
            *local_got = (bfd_vma) -1;
1448
        }
1449
    }
1450
 
1451
  /* Allocate global sym .plt and .got entries, and space for global
1452
     sym dynamic relocs.  */
1453
  elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
1454
 
1455
  /* We now have determined the sizes of the various dynamic sections.
1456
     Allocate memory for them.  */
1457
  relocs = false;
1458
  for (s = dynobj->sections; s != NULL; s = s->next)
1459
    {
1460
      if ((s->flags & SEC_LINKER_CREATED) == 0)
1461
        continue;
1462
 
1463
      if (s == htab->splt
1464
          || s == htab->sgot
1465
          || s == htab->sgotplt)
1466
        {
1467
          /* Strip this section if we don't need it; see the
1468
             comment below.  */
1469
        }
1470
      else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
1471
        {
1472
          if (s->_raw_size != 0 && s != htab->srelplt)
1473
            relocs = true;
1474
 
1475
          /* We use the reloc_count field as a counter if we need
1476
             to copy relocs into the output file.  */
1477
          s->reloc_count = 0;
1478
        }
1479
      else
1480
        {
1481
          /* It's not one of our sections, so don't allocate space.  */
1482
          continue;
1483
        }
1484
 
1485
      if (s->_raw_size == 0)
1486
        {
1487
          /* If we don't need this section, strip it from the
1488
             output file.  This is mostly to handle .rela.bss and
1489
             .rela.plt.  We must create both sections in
1490
             create_dynamic_sections, because they must be created
1491
             before the linker maps input sections to output
1492
             sections.  The linker does that before
1493
             adjust_dynamic_symbol is called, and it is that
1494
             function which decides whether anything needs to go
1495
             into these sections.  */
1496
 
1497
          _bfd_strip_section_from_output (info, s);
1498
          continue;
1499
        }
1500
 
1501
      /* Allocate memory for the section contents.  We use bfd_zalloc
1502
         here in case unused entries are not reclaimed before the
1503
         section's contents are written out.  This should not happen,
1504
         but this way if it does, we get a R_X86_64_NONE reloc instead
1505
         of garbage.  */
1506
      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1507
      if (s->contents == NULL)
1508
        return false;
1509
    }
1510
 
1511
  if (htab->elf.dynamic_sections_created)
1512
    {
1513
      /* Add some entries to the .dynamic section.  We fill in the
1514
         values later, in elf64_x86_64_finish_dynamic_sections, but we
1515
         must add the entries now so that we get the correct size for
1516
         the .dynamic section.  The DT_DEBUG entry is filled in by the
1517
         dynamic linker and used by the debugger.  */
1518
#define add_dynamic_entry(TAG, VAL) \
1519
  bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
1520
 
1521
      if (! info->shared)
1522
        {
1523
          if (!add_dynamic_entry (DT_DEBUG, 0))
1524
            return false;
1525
        }
1526
 
1527
      if (htab->splt->_raw_size != 0)
1528
        {
1529
          if (!add_dynamic_entry (DT_PLTGOT, 0)
1530
              || !add_dynamic_entry (DT_PLTRELSZ, 0)
1531
              || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1532
              || !add_dynamic_entry (DT_JMPREL, 0))
1533
            return false;
1534
        }
1535
 
1536
      if (relocs)
1537
        {
1538
          if (!add_dynamic_entry (DT_RELA, 0)
1539
              || !add_dynamic_entry (DT_RELASZ, 0)
1540
              || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
1541
            return false;
1542
 
1543
          /* If any dynamic relocs apply to a read-only section,
1544
             then we need a DT_TEXTREL entry.  */
1545
          if ((info->flags & DF_TEXTREL) == 0)
1546
            elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
1547
                                    (PTR) info);
1548
 
1549
          if ((info->flags & DF_TEXTREL) != 0)
1550
            {
1551
              if (!add_dynamic_entry (DT_TEXTREL, 0))
1552
                return false;
1553
            }
1554
        }
1555
    }
1556
#undef add_dynamic_entry
1557
 
1558
  return true;
1559
}
1560
 
1561
/* Relocate an x86_64 ELF section.  */
1562
 
1563
static boolean
1564
elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
1565
                               contents, relocs, local_syms, local_sections)
1566
     bfd *output_bfd;
1567
     struct bfd_link_info *info;
1568
     bfd *input_bfd;
1569
     asection *input_section;
1570
     bfd_byte *contents;
1571
     Elf_Internal_Rela *relocs;
1572
     Elf_Internal_Sym *local_syms;
1573
     asection **local_sections;
1574
{
1575
  struct elf64_x86_64_link_hash_table *htab;
1576
  Elf_Internal_Shdr *symtab_hdr;
1577
  struct elf_link_hash_entry **sym_hashes;
1578
  bfd_vma *local_got_offsets;
1579
  Elf_Internal_Rela *rel;
1580
  Elf_Internal_Rela *relend;
1581
 
1582
  if (info->relocateable)
1583
    return true;
1584
 
1585
  htab = elf64_x86_64_hash_table (info);
1586
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1587
  sym_hashes = elf_sym_hashes (input_bfd);
1588
  local_got_offsets = elf_local_got_offsets (input_bfd);
1589
 
1590
  rel = relocs;
1591
  relend = relocs + input_section->reloc_count;
1592
  for (; rel < relend; rel++)
1593
    {
1594
      int r_type;
1595
      reloc_howto_type *howto;
1596
      unsigned long r_symndx;
1597
      struct elf_link_hash_entry *h;
1598
      Elf_Internal_Sym *sym;
1599
      asection *sec;
1600
      bfd_vma off;
1601
      bfd_vma relocation;
1602
      boolean unresolved_reloc;
1603
      bfd_reloc_status_type r;
1604
 
1605
      r_type = ELF64_R_TYPE (rel->r_info);
1606
      if (r_type == (int) R_X86_64_GNU_VTINHERIT
1607
          || r_type == (int) R_X86_64_GNU_VTENTRY)
1608
        continue;
1609
 
1610
      if (r_type < 0 || r_type >= R_X86_64_max)
1611
        {
1612
          bfd_set_error (bfd_error_bad_value);
1613
          return false;
1614
        }
1615
 
1616
      howto = x86_64_elf_howto_table + r_type;
1617
      r_symndx = ELF64_R_SYM (rel->r_info);
1618
      h = NULL;
1619
      sym = NULL;
1620
      sec = NULL;
1621
      unresolved_reloc = false;
1622
      if (r_symndx < symtab_hdr->sh_info)
1623
        {
1624
          sym = local_syms + r_symndx;
1625
          sec = local_sections[r_symndx];
1626
 
1627
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
1628
        }
1629
      else
1630
        {
1631
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1632
          while (h->root.type == bfd_link_hash_indirect
1633
                 || h->root.type == bfd_link_hash_warning)
1634
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
1635
 
1636
          if (h->root.type == bfd_link_hash_defined
1637
              || h->root.type == bfd_link_hash_defweak)
1638
            {
1639
              sec = h->root.u.def.section;
1640
              if (sec->output_section == NULL)
1641
                {
1642
                  /* Set a flag that will be cleared later if we find a
1643
                     relocation value for this symbol.  output_section
1644
                     is typically NULL for symbols satisfied by a shared
1645
                     library.  */
1646
                  unresolved_reloc = true;
1647
                  relocation = 0;
1648
                }
1649
              else
1650
                relocation = (h->root.u.def.value
1651
                              + sec->output_section->vma
1652
                              + sec->output_offset);
1653
            }
1654
          else if (h->root.type == bfd_link_hash_undefweak)
1655
            relocation = 0;
1656
          else if (info->shared
1657
                   && (!info->symbolic || info->allow_shlib_undefined)
1658
                   && !info->no_undefined
1659
                   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1660
            relocation = 0;
1661
          else
1662
            {
1663
              if (! ((*info->callbacks->undefined_symbol)
1664
                     (info, h->root.root.string, input_bfd,
1665
                      input_section, rel->r_offset,
1666
                      (!info->shared || info->no_undefined
1667
                       || ELF_ST_VISIBILITY (h->other)))))
1668
                return false;
1669
              relocation = 0;
1670
            }
1671
        }
1672
      /* When generating a shared object, the relocations handled here are
1673
         copied into the output file to be resolved at run time.  */
1674
      switch (r_type)
1675
        {
1676
        case R_X86_64_GOT32:
1677
          /* Relocation is to the entry for this symbol in the global
1678
             offset table.  */
1679
        case R_X86_64_GOTPCREL:
1680
          /* Use global offset table as symbol value.  */
1681
          if (htab->sgot == NULL)
1682
            abort ();
1683
 
1684
          if (h != NULL)
1685
            {
1686
              boolean dyn;
1687
 
1688
              off = h->got.offset;
1689
              dyn = htab->elf.dynamic_sections_created;
1690
 
1691
              if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
1692
                  || (info->shared
1693
                      && (info->symbolic
1694
                          || h->dynindx == -1
1695
                          || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
1696
                      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1697
                {
1698
                  /* This is actually a static link, or it is a -Bsymbolic
1699
                     link and the symbol is defined locally, or the symbol
1700
                     was forced to be local because of a version file.  We
1701
                     must initialize this entry in the global offset table.
1702
                     Since the offset must always be a multiple of 8, we
1703
                     use the least significant bit to record whether we
1704
                     have initialized it already.
1705
 
1706
                     When doing a dynamic link, we create a .rela.got
1707
                     relocation entry to initialize the value.  This is
1708
                     done in the finish_dynamic_symbol routine.  */
1709
                  if ((off & 1) != 0)
1710
                    off &= ~1;
1711
                  else
1712
                    {
1713
                      bfd_put_64 (output_bfd, relocation,
1714
                                  htab->sgot->contents + off);
1715
                      h->got.offset |= 1;
1716
                    }
1717
                }
1718
              else
1719
                unresolved_reloc = false;
1720
            }
1721
          else
1722
            {
1723
              if (local_got_offsets == NULL)
1724
                abort ();
1725
 
1726
              off = local_got_offsets[r_symndx];
1727
 
1728
              /* The offset must always be a multiple of 8.  We use
1729
                 the least significant bit to record whether we have
1730
                 already generated the necessary reloc.  */
1731
              if ((off & 1) != 0)
1732
                off &= ~1;
1733
              else
1734
                {
1735
                  bfd_put_64 (output_bfd, relocation,
1736
                              htab->sgot->contents + off);
1737
 
1738
                  if (info->shared)
1739
                    {
1740
                      asection *srelgot;
1741
                      Elf_Internal_Rela outrel;
1742
                      Elf64_External_Rela *loc;
1743
 
1744
                      /* We need to generate a R_X86_64_RELATIVE reloc
1745
                         for the dynamic linker.  */
1746
                      srelgot = htab->srelgot;
1747
                      if (srelgot == NULL)
1748
                        abort ();
1749
 
1750
                      outrel.r_offset = (htab->sgot->output_section->vma
1751
                                         + htab->sgot->output_offset
1752
                                         + off);
1753
                      outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
1754
                      outrel.r_addend = relocation;
1755
                      loc = (Elf64_External_Rela *) srelgot->contents;
1756
                      loc += srelgot->reloc_count++;
1757
                      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
1758
                    }
1759
 
1760
                  local_got_offsets[r_symndx] |= 1;
1761
                }
1762
            }
1763
 
1764
          if (off >= (bfd_vma) -2)
1765
            abort ();
1766
 
1767
          relocation = htab->sgot->output_offset + off;
1768
          if (r_type == R_X86_64_GOTPCREL)
1769
            relocation += htab->sgot->output_section->vma;
1770
 
1771
          break;
1772
 
1773
        case R_X86_64_PLT32:
1774
          /* Relocation is to the entry for this symbol in the
1775
             procedure linkage table.  */
1776
 
1777
          /* Resolve a PLT32 reloc against a local symbol directly,
1778
             without using the procedure linkage table.  */
1779
          if (h == NULL)
1780
            break;
1781
 
1782
          if (h->plt.offset == (bfd_vma) -1
1783
              || htab->splt == NULL)
1784
            {
1785
              /* We didn't make a PLT entry for this symbol.  This
1786
                 happens when statically linking PIC code, or when
1787
                 using -Bsymbolic.  */
1788
              break;
1789
            }
1790
 
1791
          relocation = (htab->splt->output_section->vma
1792
                        + htab->splt->output_offset
1793
                        + h->plt.offset);
1794
          unresolved_reloc = false;
1795
          break;
1796
 
1797
        case R_X86_64_PC8:
1798
        case R_X86_64_PC16:
1799
        case R_X86_64_PC32:
1800
        case R_X86_64_8:
1801
        case R_X86_64_16:
1802
        case R_X86_64_32:
1803
        case R_X86_64_64:
1804
          /* FIXME: The ABI says the linker should make sure the value is
1805
             the same when it's zeroextended to 64 bit.  */
1806
 
1807
          /* r_symndx will be zero only for relocs against symbols
1808
             from removed linkonce sections, or sections discarded by
1809
             a linker script.  */
1810
          if (r_symndx == 0
1811
              || (input_section->flags & SEC_ALLOC) == 0)
1812
            break;
1813
 
1814
          if ((info->shared
1815
               && ((r_type != R_X86_64_PC8
1816
                    && r_type != R_X86_64_PC16
1817
                    && r_type != R_X86_64_PC32)
1818
                   || (h != NULL
1819
                       && h->dynindx != -1
1820
                       && (! info->symbolic
1821
                           || (h->elf_link_hash_flags
1822
                               & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1823
              || (!info->shared
1824
                  && h != NULL
1825
                  && h->dynindx != -1
1826
                  && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1827
                  && (((h->elf_link_hash_flags
1828
                        & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1829
                       && (h->elf_link_hash_flags
1830
                           & ELF_LINK_HASH_DEF_REGULAR) == 0)
1831
                      || h->root.type == bfd_link_hash_undefweak
1832
                      || h->root.type == bfd_link_hash_undefined)))
1833
            {
1834
              Elf_Internal_Rela outrel;
1835
              boolean skip, relocate;
1836
              asection *sreloc;
1837
              Elf64_External_Rela *loc;
1838
 
1839
              /* When generating a shared object, these relocations
1840
                 are copied into the output file to be resolved at run
1841
                 time.  */
1842
 
1843
              skip = false;
1844
              relocate = false;
1845
 
1846
              outrel.r_offset =
1847
                _bfd_elf_section_offset (output_bfd, info, input_section,
1848
                                         rel->r_offset);
1849
              if (outrel.r_offset == (bfd_vma) -1)
1850
                skip = true;
1851
              else if (outrel.r_offset == (bfd_vma) -2)
1852
                skip = true, relocate = true;
1853
 
1854
              outrel.r_offset += (input_section->output_section->vma
1855
                                  + input_section->output_offset);
1856
 
1857
              if (skip)
1858
                memset (&outrel, 0, sizeof outrel);
1859
 
1860
              /* h->dynindx may be -1 if this symbol was marked to
1861
                 become local.  */
1862
              else if (h != NULL
1863
                       && h->dynindx != -1
1864
                       && (r_type == R_X86_64_PC8
1865
                           || r_type == R_X86_64_PC16
1866
                           || r_type == R_X86_64_PC32
1867
                           || !info->shared
1868
                           || !info->symbolic
1869
                           || (h->elf_link_hash_flags
1870
                               & ELF_LINK_HASH_DEF_REGULAR) == 0))
1871
                {
1872
                  outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
1873
                  outrel.r_addend = rel->r_addend;
1874
                }
1875
              else
1876
                {
1877
                  /* This symbol is local, or marked to become local.  */
1878
                  if (r_type == R_X86_64_64)
1879
                    {
1880
                      relocate = true;
1881
                      outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
1882
                      outrel.r_addend = relocation + rel->r_addend;
1883
                    }
1884
                  else
1885
                    {
1886
                      long sindx;
1887
 
1888
                      if (h == NULL)
1889
                        sec = local_sections[r_symndx];
1890
                      else
1891
                        {
1892
                          BFD_ASSERT (h->root.type == bfd_link_hash_defined
1893
                                      || (h->root.type
1894
                                          == bfd_link_hash_defweak));
1895
                          sec = h->root.u.def.section;
1896
                        }
1897
                      if (sec != NULL && bfd_is_abs_section (sec))
1898
                        sindx = 0;
1899
                      else if (sec == NULL || sec->owner == NULL)
1900
                        {
1901
                          bfd_set_error (bfd_error_bad_value);
1902
                          return false;
1903
                        }
1904
                      else
1905
                        {
1906
                          asection *osec;
1907
 
1908
                          osec = sec->output_section;
1909
                          sindx = elf_section_data (osec)->dynindx;
1910
                          BFD_ASSERT (sindx > 0);
1911
                        }
1912
 
1913
                      outrel.r_info = ELF64_R_INFO (sindx, r_type);
1914
                      outrel.r_addend = relocation + rel->r_addend;
1915
                    }
1916
                }
1917
 
1918
              sreloc = elf_section_data (input_section)->sreloc;
1919
              if (sreloc == NULL)
1920
                abort ();
1921
 
1922
              loc = (Elf64_External_Rela *) sreloc->contents;
1923
              loc += sreloc->reloc_count++;
1924
              bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
1925
 
1926
              /* If this reloc is against an external symbol, we do
1927
                 not want to fiddle with the addend.  Otherwise, we
1928
                 need to include the symbol value so that it becomes
1929
                 an addend for the dynamic reloc.  */
1930
              if (! relocate)
1931
                continue;
1932
            }
1933
 
1934
          break;
1935
 
1936
        default:
1937
          break;
1938
        }
1939
 
1940
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
1941
         because such sections are not SEC_ALLOC and thus ld.so will
1942
         not process them.  */
1943
      if (unresolved_reloc
1944
          && !((input_section->flags & SEC_DEBUGGING) != 0
1945
               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
1946
        (*_bfd_error_handler)
1947
          (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
1948
           bfd_archive_filename (input_bfd),
1949
           bfd_get_section_name (input_bfd, input_section),
1950
           (long) rel->r_offset,
1951
           h->root.root.string);
1952
 
1953
      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1954
                                    contents, rel->r_offset,
1955
                                    relocation, rel->r_addend);
1956
 
1957
      if (r != bfd_reloc_ok)
1958
        {
1959
          const char *name;
1960
 
1961
          if (h != NULL)
1962
            name = h->root.root.string;
1963
          else
1964
            {
1965
              name = bfd_elf_string_from_elf_section (input_bfd,
1966
                                                      symtab_hdr->sh_link,
1967
                                                      sym->st_name);
1968
              if (name == NULL)
1969
                return false;
1970
              if (*name == '\0')
1971
                name = bfd_section_name (input_bfd, sec);
1972
            }
1973
 
1974
          if (r == bfd_reloc_overflow)
1975
            {
1976
 
1977
              if (! ((*info->callbacks->reloc_overflow)
1978
                     (info, name, howto->name, (bfd_vma) 0,
1979
                      input_bfd, input_section, rel->r_offset)))
1980
                return false;
1981
            }
1982
          else
1983
            {
1984
              (*_bfd_error_handler)
1985
                (_("%s(%s+0x%lx): reloc against `%s': error %d"),
1986
                 bfd_archive_filename (input_bfd),
1987
                 bfd_get_section_name (input_bfd, input_section),
1988
                 (long) rel->r_offset, name, (int) r);
1989
              return false;
1990
            }
1991
        }
1992
    }
1993
 
1994
  return true;
1995
}
1996
 
1997
/* Finish up dynamic symbol handling.  We set the contents of various
1998
   dynamic sections here.  */
1999
 
2000
static boolean
2001
elf64_x86_64_finish_dynamic_symbol (output_bfd, info, h, sym)
2002
     bfd *output_bfd;
2003
     struct bfd_link_info *info;
2004
     struct elf_link_hash_entry *h;
2005
     Elf_Internal_Sym *sym;
2006
{
2007
  struct elf64_x86_64_link_hash_table *htab;
2008
 
2009
  htab = elf64_x86_64_hash_table (info);
2010
 
2011
  if (h->plt.offset != (bfd_vma) -1)
2012
    {
2013
      bfd_vma plt_index;
2014
      bfd_vma got_offset;
2015
      Elf_Internal_Rela rela;
2016
      Elf64_External_Rela *loc;
2017
 
2018
      /* This symbol has an entry in the procedure linkage table.  Set
2019
         it up.  */
2020
 
2021
      if (h->dynindx == -1
2022
          || htab->splt == NULL
2023
          || htab->sgotplt == NULL
2024
          || htab->srelplt == NULL)
2025
        abort ();
2026
 
2027
      /* Get the index in the procedure linkage table which
2028
         corresponds to this symbol.  This is the index of this symbol
2029
         in all the symbols for which we are making plt entries.  The
2030
         first entry in the procedure linkage table is reserved.  */
2031
      plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
2032
 
2033
      /* Get the offset into the .got table of the entry that
2034
         corresponds to this function.  Each .got entry is GOT_ENTRY_SIZE
2035
         bytes. The first three are reserved for the dynamic linker.  */
2036
      got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
2037
 
2038
      /* Fill in the entry in the procedure linkage table.  */
2039
      memcpy (htab->splt->contents + h->plt.offset, elf64_x86_64_plt_entry,
2040
              PLT_ENTRY_SIZE);
2041
 
2042
      /* Insert the relocation positions of the plt section.  The magic
2043
         numbers at the end of the statements are the positions of the
2044
         relocations in the plt section.  */
2045
      /* Put offset for jmp *name@GOTPCREL(%rip), since the
2046
         instruction uses 6 bytes, subtract this value.  */
2047
      bfd_put_32 (output_bfd,
2048
                      (htab->sgotplt->output_section->vma
2049
                       + htab->sgotplt->output_offset
2050
                       + got_offset
2051
                       - htab->splt->output_section->vma
2052
                       - htab->splt->output_offset
2053
                       - h->plt.offset
2054
                       - 6),
2055
                  htab->splt->contents + h->plt.offset + 2);
2056
      /* Put relocation index.  */
2057
      bfd_put_32 (output_bfd, plt_index,
2058
                  htab->splt->contents + h->plt.offset + 7);
2059
      /* Put offset for jmp .PLT0.  */
2060
      bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
2061
                  htab->splt->contents + h->plt.offset + 12);
2062
 
2063
      /* Fill in the entry in the global offset table, initially this
2064
         points to the pushq instruction in the PLT which is at offset 6.  */
2065
      bfd_put_64 (output_bfd, (htab->splt->output_section->vma
2066
                               + htab->splt->output_offset
2067
                               + h->plt.offset + 6),
2068
                  htab->sgotplt->contents + got_offset);
2069
 
2070
      /* Fill in the entry in the .rela.plt section.  */
2071
      rela.r_offset = (htab->sgotplt->output_section->vma
2072
                       + htab->sgotplt->output_offset
2073
                       + got_offset);
2074
      rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_JUMP_SLOT);
2075
      rela.r_addend = 0;
2076
      loc = (Elf64_External_Rela *) htab->srelplt->contents + plt_index;
2077
      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2078
 
2079
      if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2080
        {
2081
          /* Mark the symbol as undefined, rather than as defined in
2082
             the .plt section.  Leave the value alone.  This is a clue
2083
             for the dynamic linker, to make function pointer
2084
             comparisons work between an application and shared
2085
             library.  */
2086
          sym->st_shndx = SHN_UNDEF;
2087
        }
2088
    }
2089
 
2090
  if (h->got.offset != (bfd_vma) -1)
2091
    {
2092
      Elf_Internal_Rela rela;
2093
      Elf64_External_Rela *loc;
2094
 
2095
      /* This symbol has an entry in the global offset table.  Set it
2096
         up.  */
2097
 
2098
      if (htab->sgot == NULL || htab->srelgot == NULL)
2099
        abort ();
2100
 
2101
      rela.r_offset = (htab->sgot->output_section->vma
2102
                       + htab->sgot->output_offset
2103
                       + (h->got.offset &~ (bfd_vma) 1));
2104
 
2105
      /* If this is a static link, or it is a -Bsymbolic link and the
2106
         symbol is defined locally or was forced to be local because
2107
         of a version file, we just want to emit a RELATIVE reloc.
2108
         The entry in the global offset table will already have been
2109
         initialized in the relocate_section function.  */
2110
      if (info->shared
2111
          && (info->symbolic
2112
              || h->dynindx == -1
2113
              || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2114
          && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
2115
        {
2116
          BFD_ASSERT((h->got.offset & 1) != 0);
2117
          rela.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
2118
          rela.r_addend = (h->root.u.def.value
2119
                           + h->root.u.def.section->output_section->vma
2120
                           + h->root.u.def.section->output_offset);
2121
        }
2122
      else
2123
        {
2124
          BFD_ASSERT((h->got.offset & 1) == 0);
2125
          bfd_put_64 (output_bfd, (bfd_vma) 0,
2126
                      htab->sgot->contents + h->got.offset);
2127
          rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_GLOB_DAT);
2128
          rela.r_addend = 0;
2129
        }
2130
 
2131
      loc = (Elf64_External_Rela *) htab->srelgot->contents;
2132
      loc += htab->srelgot->reloc_count++;
2133
      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2134
    }
2135
 
2136
  if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
2137
    {
2138
      Elf_Internal_Rela rela;
2139
      Elf64_External_Rela *loc;
2140
 
2141
      /* This symbol needs a copy reloc.  Set it up.  */
2142
 
2143
      if (h->dynindx == -1
2144
          || (h->root.type != bfd_link_hash_defined
2145
              && h->root.type != bfd_link_hash_defweak)
2146
          || htab->srelbss == NULL)
2147
        abort ();
2148
 
2149
      rela.r_offset = (h->root.u.def.value
2150
                       + h->root.u.def.section->output_section->vma
2151
                       + h->root.u.def.section->output_offset);
2152
      rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_COPY);
2153
      rela.r_addend = 0;
2154
      loc = (Elf64_External_Rela *) htab->srelbss->contents;
2155
      loc += htab->srelbss->reloc_count++;
2156
      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2157
    }
2158
 
2159
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
2160
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2161
      || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2162
    sym->st_shndx = SHN_ABS;
2163
 
2164
  return true;
2165
}
2166
 
2167
/* Used to decide how to sort relocs in an optimal manner for the
2168
   dynamic linker, before writing them out.  */
2169
 
2170
static enum elf_reloc_type_class
2171
elf64_x86_64_reloc_type_class (rela)
2172
     const Elf_Internal_Rela *rela;
2173
{
2174
  switch ((int) ELF64_R_TYPE (rela->r_info))
2175
    {
2176
    case R_X86_64_RELATIVE:
2177
      return reloc_class_relative;
2178
    case R_X86_64_JUMP_SLOT:
2179
      return reloc_class_plt;
2180
    case R_X86_64_COPY:
2181
      return reloc_class_copy;
2182
    default:
2183
      return reloc_class_normal;
2184
    }
2185
}
2186
 
2187
/* Finish up the dynamic sections.  */
2188
 
2189
static boolean
2190
elf64_x86_64_finish_dynamic_sections (output_bfd, info)
2191
     bfd *output_bfd;
2192
     struct bfd_link_info *info;
2193
{
2194
  struct elf64_x86_64_link_hash_table *htab;
2195
  bfd *dynobj;
2196
  asection *sdyn;
2197
 
2198
  htab = elf64_x86_64_hash_table (info);
2199
  dynobj = htab->elf.dynobj;
2200
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2201
 
2202
  if (htab->elf.dynamic_sections_created)
2203
    {
2204
      Elf64_External_Dyn *dyncon, *dynconend;
2205
 
2206
      if (sdyn == NULL || htab->sgot == NULL)
2207
        abort ();
2208
 
2209
      dyncon = (Elf64_External_Dyn *) sdyn->contents;
2210
      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2211
      for (; dyncon < dynconend; dyncon++)
2212
        {
2213
          Elf_Internal_Dyn dyn;
2214
          asection *s;
2215
 
2216
          bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2217
 
2218
          switch (dyn.d_tag)
2219
            {
2220
            default:
2221
              continue;
2222
 
2223
            case DT_PLTGOT:
2224
              dyn.d_un.d_ptr = htab->sgot->output_section->vma;
2225
              break;
2226
 
2227
            case DT_JMPREL:
2228
              dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
2229
              break;
2230
 
2231
            case DT_PLTRELSZ:
2232
              s = htab->srelplt->output_section;
2233
              if (s->_cooked_size != 0)
2234
                dyn.d_un.d_val = s->_cooked_size;
2235
              else
2236
                dyn.d_un.d_val = s->_raw_size;
2237
              break;
2238
 
2239
            case DT_RELASZ:
2240
              /* The procedure linkage table relocs (DT_JMPREL) should
2241
                 not be included in the overall relocs (DT_RELA).
2242
                 Therefore, we override the DT_RELASZ entry here to
2243
                 make it not include the JMPREL relocs.  Since the
2244
                 linker script arranges for .rela.plt to follow all
2245
                 other relocation sections, we don't have to worry
2246
                 about changing the DT_RELA entry.  */
2247
              if (htab->srelplt != NULL)
2248
                {
2249
                  s = htab->srelplt->output_section;
2250
                  if (s->_cooked_size != 0)
2251
                    dyn.d_un.d_val -= s->_cooked_size;
2252
                  else
2253
                    dyn.d_un.d_val -= s->_raw_size;
2254
                }
2255
              break;
2256
            }
2257
 
2258
          bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2259
        }
2260
 
2261
      /* Fill in the special first entry in the procedure linkage table.  */
2262
      if (htab->splt && htab->splt->_raw_size > 0)
2263
        {
2264
          /* Fill in the first entry in the procedure linkage table.  */
2265
          memcpy (htab->splt->contents, elf64_x86_64_plt0_entry,
2266
                  PLT_ENTRY_SIZE);
2267
          /* Add offset for pushq GOT+8(%rip), since the instruction
2268
             uses 6 bytes subtract this value.  */
2269
          bfd_put_32 (output_bfd,
2270
                      (htab->sgotplt->output_section->vma
2271
                       + htab->sgotplt->output_offset
2272
                       + 8
2273
                       - htab->splt->output_section->vma
2274
                       - htab->splt->output_offset
2275
                       - 6),
2276
                      htab->splt->contents + 2);
2277
          /* Add offset for jmp *GOT+16(%rip). The 12 is the offset to
2278
             the end of the instruction.  */
2279
          bfd_put_32 (output_bfd,
2280
                      (htab->sgotplt->output_section->vma
2281
                       + htab->sgotplt->output_offset
2282
                       + 16
2283
                       - htab->splt->output_section->vma
2284
                       - htab->splt->output_offset
2285
                       - 12),
2286
                      htab->splt->contents + 8);
2287
 
2288
          elf_section_data (htab->splt->output_section)->this_hdr.sh_entsize =
2289
            PLT_ENTRY_SIZE;
2290
        }
2291
    }
2292
 
2293
  if (htab->sgotplt)
2294
    {
2295
      /* Fill in the first three entries in the global offset table.  */
2296
      if (htab->sgotplt->_raw_size > 0)
2297
        {
2298
          /* Set the first entry in the global offset table to the address of
2299
             the dynamic section.  */
2300
          if (sdyn == NULL)
2301
            bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents);
2302
          else
2303
            bfd_put_64 (output_bfd,
2304
                        sdyn->output_section->vma + sdyn->output_offset,
2305
                        htab->sgotplt->contents);
2306
          /* Write GOT[1] and GOT[2], needed for the dynamic linker.  */
2307
          bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + GOT_ENTRY_SIZE);
2308
          bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + GOT_ENTRY_SIZE*2);
2309
        }
2310
 
2311
      elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize =
2312
        GOT_ENTRY_SIZE;
2313
    }
2314
 
2315
  return true;
2316
}
2317
 
2318
 
2319
#define TARGET_LITTLE_SYM                   bfd_elf64_x86_64_vec
2320
#define TARGET_LITTLE_NAME                  "elf64-x86-64"
2321
#define ELF_ARCH                            bfd_arch_i386
2322
#define ELF_MACHINE_CODE                    EM_X86_64
2323
#define ELF_MAXPAGESIZE                     0x100000
2324
 
2325
#define elf_backend_can_gc_sections         1
2326
#define elf_backend_can_refcount            1
2327
#define elf_backend_want_got_plt            1
2328
#define elf_backend_plt_readonly            1
2329
#define elf_backend_want_plt_sym            0
2330
#define elf_backend_got_header_size         (GOT_ENTRY_SIZE*3)
2331
#define elf_backend_plt_header_size         PLT_ENTRY_SIZE
2332
#define elf_backend_rela_normal             1
2333
 
2334
#define elf_info_to_howto                   elf64_x86_64_info_to_howto
2335
 
2336
#define bfd_elf64_bfd_link_hash_table_create \
2337
  elf64_x86_64_link_hash_table_create
2338
#define bfd_elf64_bfd_reloc_type_lookup     elf64_x86_64_reloc_type_lookup
2339
 
2340
#define elf_backend_adjust_dynamic_symbol   elf64_x86_64_adjust_dynamic_symbol
2341
#define elf_backend_check_relocs            elf64_x86_64_check_relocs
2342
#define elf_backend_copy_indirect_symbol    elf64_x86_64_copy_indirect_symbol
2343
#define elf_backend_create_dynamic_sections elf64_x86_64_create_dynamic_sections
2344
#define elf_backend_finish_dynamic_sections elf64_x86_64_finish_dynamic_sections
2345
#define elf_backend_finish_dynamic_symbol   elf64_x86_64_finish_dynamic_symbol
2346
#define elf_backend_gc_mark_hook            elf64_x86_64_gc_mark_hook
2347
#define elf_backend_gc_sweep_hook           elf64_x86_64_gc_sweep_hook
2348
#define elf_backend_grok_prstatus           elf64_x86_64_grok_prstatus
2349
#define elf_backend_grok_psinfo             elf64_x86_64_grok_psinfo
2350
#define elf_backend_reloc_type_class        elf64_x86_64_reloc_type_class
2351
#define elf_backend_relocate_section        elf64_x86_64_relocate_section
2352
#define elf_backend_size_dynamic_sections   elf64_x86_64_size_dynamic_sections
2353
#define elf_backend_object_p                elf64_x86_64_elf_object_p
2354
 
2355
#include "elf64-target.h"

powered by: WebSVN 2.1.0

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