* elf64-x86-64.c (allocate_dynrelocs): Don't allocate dynamic
[external/binutils.git] / bfd / elf64-x86-64.c
1 /* X86-64 specific support for 64-bit ELF
2    Copyright 2000, 2001, 2002, 2003 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, 2, 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, 2, 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, 2, 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, 2, 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, 2, 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, 2, 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, 2, 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   HOWTO(R_X86_64_DTPMOD64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
82         bfd_elf_generic_reloc, "R_X86_64_DTPMOD64", FALSE, MINUS_ONE,
83         MINUS_ONE, FALSE),
84   HOWTO(R_X86_64_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
85         bfd_elf_generic_reloc, "R_X86_64_DTPOFF64", FALSE, MINUS_ONE,
86         MINUS_ONE, FALSE),
87   HOWTO(R_X86_64_TPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
88         bfd_elf_generic_reloc, "R_X86_64_TPOFF64", FALSE, MINUS_ONE,
89         MINUS_ONE, FALSE),
90   HOWTO(R_X86_64_TLSGD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
91         bfd_elf_generic_reloc, "R_X86_64_TLSGD", FALSE, 0xffffffff,
92         0xffffffff, TRUE),
93   HOWTO(R_X86_64_TLSLD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
94         bfd_elf_generic_reloc, "R_X86_64_TLSLD", FALSE, 0xffffffff,
95         0xffffffff, TRUE),
96   HOWTO(R_X86_64_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
97         bfd_elf_generic_reloc, "R_X86_64_DTPOFF32", FALSE, 0xffffffff,
98         0xffffffff, FALSE),
99   HOWTO(R_X86_64_GOTTPOFF, 0, 2, 32, TRUE, 0, complain_overflow_signed,
100         bfd_elf_generic_reloc, "R_X86_64_GOTTPOFF", FALSE, 0xffffffff,
101         0xffffffff, TRUE),
102   HOWTO(R_X86_64_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
103         bfd_elf_generic_reloc, "R_X86_64_TPOFF32", FALSE, 0xffffffff,
104         0xffffffff, FALSE),
105
106 /* GNU extension to record C++ vtable hierarchy.  */
107   HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, FALSE, 0, complain_overflow_dont,
108          NULL, "R_X86_64_GNU_VTINHERIT", FALSE, 0, 0, FALSE),
109
110 /* GNU extension to record C++ vtable member usage.  */
111   HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, FALSE, 0, complain_overflow_dont,
112          _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", FALSE, 0, 0,
113          FALSE)
114 };
115
116 /* Map BFD relocs to the x86_64 elf relocs.  */
117 struct elf_reloc_map
118 {
119   bfd_reloc_code_real_type bfd_reloc_val;
120   unsigned char elf_reloc_val;
121 };
122
123 static const struct elf_reloc_map x86_64_reloc_map[] =
124 {
125   { BFD_RELOC_NONE,             R_X86_64_NONE, },
126   { BFD_RELOC_64,               R_X86_64_64,   },
127   { BFD_RELOC_32_PCREL,         R_X86_64_PC32, },
128   { BFD_RELOC_X86_64_GOT32,     R_X86_64_GOT32,},
129   { BFD_RELOC_X86_64_PLT32,     R_X86_64_PLT32,},
130   { BFD_RELOC_X86_64_COPY,      R_X86_64_COPY, },
131   { BFD_RELOC_X86_64_GLOB_DAT,  R_X86_64_GLOB_DAT, },
132   { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, },
133   { BFD_RELOC_X86_64_RELATIVE,  R_X86_64_RELATIVE, },
134   { BFD_RELOC_X86_64_GOTPCREL,  R_X86_64_GOTPCREL, },
135   { BFD_RELOC_32,               R_X86_64_32, },
136   { BFD_RELOC_X86_64_32S,       R_X86_64_32S, },
137   { BFD_RELOC_16,               R_X86_64_16, },
138   { BFD_RELOC_16_PCREL,         R_X86_64_PC16, },
139   { BFD_RELOC_8,                R_X86_64_8, },
140   { BFD_RELOC_8_PCREL,          R_X86_64_PC8, },
141   { BFD_RELOC_X86_64_DTPMOD64,  R_X86_64_DTPMOD64, },
142   { BFD_RELOC_X86_64_DTPOFF64,  R_X86_64_DTPOFF64, },
143   { BFD_RELOC_X86_64_TPOFF64,   R_X86_64_TPOFF64, },
144   { BFD_RELOC_X86_64_TLSGD,     R_X86_64_TLSGD, },
145   { BFD_RELOC_X86_64_TLSLD,     R_X86_64_TLSLD, },
146   { BFD_RELOC_X86_64_DTPOFF32,  R_X86_64_DTPOFF32, },
147   { BFD_RELOC_X86_64_GOTTPOFF,  R_X86_64_GOTTPOFF, },
148   { BFD_RELOC_X86_64_TPOFF32,   R_X86_64_TPOFF32, },
149   { BFD_RELOC_VTABLE_INHERIT,   R_X86_64_GNU_VTINHERIT, },
150   { BFD_RELOC_VTABLE_ENTRY,     R_X86_64_GNU_VTENTRY, },
151 };
152
153 static reloc_howto_type *elf64_x86_64_reloc_type_lookup
154   PARAMS ((bfd *, bfd_reloc_code_real_type));
155 static void elf64_x86_64_info_to_howto
156   PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
157 static bfd_boolean elf64_x86_64_grok_prstatus
158   PARAMS ((bfd *, Elf_Internal_Note *));
159 static bfd_boolean elf64_x86_64_grok_psinfo
160   PARAMS ((bfd *, Elf_Internal_Note *));
161 static struct bfd_link_hash_table *elf64_x86_64_link_hash_table_create
162   PARAMS ((bfd *));
163 static int elf64_x86_64_tls_transition
164   PARAMS ((struct bfd_link_info *, int, int));
165 static bfd_boolean elf64_x86_64_mkobject
166   PARAMS((bfd *));
167 static bfd_boolean elf64_x86_64_elf_object_p PARAMS ((bfd *abfd));
168 static bfd_boolean create_got_section
169   PARAMS((bfd *, struct bfd_link_info *));
170 static bfd_boolean elf64_x86_64_create_dynamic_sections
171   PARAMS((bfd *, struct bfd_link_info *));
172 static void elf64_x86_64_copy_indirect_symbol
173   PARAMS ((struct elf_backend_data *, struct elf_link_hash_entry *,
174            struct elf_link_hash_entry *));
175 static bfd_boolean elf64_x86_64_check_relocs
176   PARAMS ((bfd *, struct bfd_link_info *, asection *sec,
177            const Elf_Internal_Rela *));
178 static asection *elf64_x86_64_gc_mark_hook
179   PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
180            struct elf_link_hash_entry *, Elf_Internal_Sym *));
181
182 static bfd_boolean elf64_x86_64_gc_sweep_hook
183   PARAMS ((bfd *, struct bfd_link_info *, asection *,
184            const Elf_Internal_Rela *));
185
186 static struct bfd_hash_entry *link_hash_newfunc
187   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
188 static bfd_boolean elf64_x86_64_adjust_dynamic_symbol
189   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
190
191 static bfd_boolean allocate_dynrelocs
192   PARAMS ((struct elf_link_hash_entry *, PTR));
193 static bfd_boolean readonly_dynrelocs
194   PARAMS ((struct elf_link_hash_entry *, PTR));
195 static bfd_boolean elf64_x86_64_size_dynamic_sections
196   PARAMS ((bfd *, struct bfd_link_info *));
197 static bfd_vma dtpoff_base
198   PARAMS ((struct bfd_link_info *));
199 static bfd_vma tpoff
200   PARAMS ((struct bfd_link_info *, bfd_vma));
201 static bfd_boolean elf64_x86_64_relocate_section
202   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
203          Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
204 static bfd_boolean elf64_x86_64_finish_dynamic_symbol
205   PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
206            Elf_Internal_Sym *sym));
207 static bfd_boolean elf64_x86_64_finish_dynamic_sections
208   PARAMS ((bfd *, struct bfd_link_info *));
209 static enum elf_reloc_type_class elf64_x86_64_reloc_type_class
210   PARAMS ((const Elf_Internal_Rela *));
211
212 /* Given a BFD reloc type, return a HOWTO structure.  */
213 static reloc_howto_type *
214 elf64_x86_64_reloc_type_lookup (abfd, code)
215      bfd *abfd ATTRIBUTE_UNUSED;
216      bfd_reloc_code_real_type code;
217 {
218   unsigned int i;
219   for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
220        i++)
221     {
222       if (x86_64_reloc_map[i].bfd_reloc_val == code)
223         return &x86_64_elf_howto_table[i];
224     }
225   return 0;
226 }
227
228 /* Given an x86_64 ELF reloc type, fill in an arelent structure.  */
229
230 static void
231 elf64_x86_64_info_to_howto (abfd, cache_ptr, dst)
232      bfd *abfd ATTRIBUTE_UNUSED;
233      arelent *cache_ptr;
234      Elf_Internal_Rela *dst;
235 {
236   unsigned r_type, i;
237
238   r_type = ELF64_R_TYPE (dst->r_info);
239   if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT)
240     {
241       BFD_ASSERT (r_type <= (unsigned int) R_X86_64_TPOFF32);
242       i = r_type;
243     }
244   else
245     {
246       BFD_ASSERT (r_type < (unsigned int) R_X86_64_max);
247       i = r_type - ((unsigned int) R_X86_64_GNU_VTINHERIT - R_X86_64_TPOFF32 - 1);
248     }
249   cache_ptr->howto = &x86_64_elf_howto_table[i];
250   BFD_ASSERT (r_type == cache_ptr->howto->type);
251 }
252 \f
253 /* Support for core dump NOTE sections.  */
254 static bfd_boolean
255 elf64_x86_64_grok_prstatus (abfd, note)
256      bfd *abfd;
257      Elf_Internal_Note *note;
258 {
259   int offset;
260   size_t raw_size;
261
262   switch (note->descsz)
263     {
264       default:
265         return FALSE;
266
267       case 336:         /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
268         /* pr_cursig */
269         elf_tdata (abfd)->core_signal
270           = bfd_get_16 (abfd, note->descdata + 12);
271
272         /* pr_pid */
273         elf_tdata (abfd)->core_pid
274           = bfd_get_32 (abfd, note->descdata + 32);
275
276         /* pr_reg */
277         offset = 112;
278         raw_size = 216;
279
280         break;
281     }
282
283   /* Make a ".reg/999" section.  */
284   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
285                                           raw_size, note->descpos + offset);
286 }
287
288 static bfd_boolean
289 elf64_x86_64_grok_psinfo (abfd, note)
290      bfd *abfd;
291      Elf_Internal_Note *note;
292 {
293   switch (note->descsz)
294     {
295       default:
296         return FALSE;
297
298       case 136:         /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
299         elf_tdata (abfd)->core_program
300          = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
301         elf_tdata (abfd)->core_command
302          = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
303     }
304
305   /* Note that for some reason, a spurious space is tacked
306      onto the end of the args in some (at least one anyway)
307      implementations, so strip it off if it exists.  */
308
309   {
310     char *command = elf_tdata (abfd)->core_command;
311     int n = strlen (command);
312
313     if (0 < n && command[n - 1] == ' ')
314       command[n - 1] = '\0';
315   }
316
317   return TRUE;
318 }
319 \f
320 /* Functions for the x86-64 ELF linker.  */
321
322 /* The name of the dynamic interpreter.  This is put in the .interp
323    section.  */
324
325 #define ELF_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
326
327 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
328    copying dynamic variables from a shared lib into an app's dynbss
329    section, and instead use a dynamic relocation to point into the
330    shared lib.  */
331 #define ELIMINATE_COPY_RELOCS 1
332
333 /* The size in bytes of an entry in the global offset table.  */
334
335 #define GOT_ENTRY_SIZE 8
336
337 /* The size in bytes of an entry in the procedure linkage table.  */
338
339 #define PLT_ENTRY_SIZE 16
340
341 /* The first entry in a procedure linkage table looks like this.  See the
342    SVR4 ABI i386 supplement and the x86-64 ABI to see how this works.  */
343
344 static const bfd_byte elf64_x86_64_plt0_entry[PLT_ENTRY_SIZE] =
345 {
346   0xff, 0x35, 8, 0, 0, 0,       /* pushq GOT+8(%rip)  */
347   0xff, 0x25, 16, 0, 0, 0,      /* jmpq *GOT+16(%rip) */
348   0x90, 0x90, 0x90, 0x90        /* pad out to 16 bytes with nops.  */
349 };
350
351 /* Subsequent entries in a procedure linkage table look like this.  */
352
353 static const bfd_byte elf64_x86_64_plt_entry[PLT_ENTRY_SIZE] =
354 {
355   0xff, 0x25,   /* jmpq *name@GOTPC(%rip) */
356   0, 0, 0, 0,   /* replaced with offset to this symbol in .got.  */
357   0x68,         /* pushq immediate */
358   0, 0, 0, 0,   /* replaced with index into relocation table.  */
359   0xe9,         /* jmp relative */
360   0, 0, 0, 0    /* replaced with offset to start of .plt0.  */
361 };
362
363 /* The x86-64 linker needs to keep track of the number of relocs that
364    it decides to copy as dynamic relocs in check_relocs for each symbol.
365    This is so that it can later discard them if they are found to be
366    unnecessary.  We store the information in a field extending the
367    regular ELF linker hash table.  */
368
369 struct elf64_x86_64_dyn_relocs
370 {
371   /* Next section.  */
372   struct elf64_x86_64_dyn_relocs *next;
373
374   /* The input section of the reloc.  */
375   asection *sec;
376
377   /* Total number of relocs copied for the input section.  */
378   bfd_size_type count;
379
380   /* Number of pc-relative relocs copied for the input section.  */
381   bfd_size_type pc_count;
382 };
383
384 /* x86-64 ELF linker hash entry.  */
385
386 struct elf64_x86_64_link_hash_entry
387 {
388   struct elf_link_hash_entry elf;
389
390   /* Track dynamic relocs copied for this symbol.  */
391   struct elf64_x86_64_dyn_relocs *dyn_relocs;
392
393 #define GOT_UNKNOWN     0
394 #define GOT_NORMAL      1
395 #define GOT_TLS_GD      2
396 #define GOT_TLS_IE      3
397   unsigned char tls_type;
398 };
399
400 #define elf64_x86_64_hash_entry(ent) \
401   ((struct elf64_x86_64_link_hash_entry *)(ent))
402
403 struct elf64_x86_64_obj_tdata
404 {
405   struct elf_obj_tdata root;
406
407   /* tls_type for each local got entry.  */
408   char *local_got_tls_type;
409 };
410
411 #define elf64_x86_64_tdata(abfd) \
412   ((struct elf64_x86_64_obj_tdata *) (abfd)->tdata.any)
413
414 #define elf64_x86_64_local_got_tls_type(abfd) \
415   (elf64_x86_64_tdata (abfd)->local_got_tls_type)
416
417
418 /* x86-64 ELF linker hash table.  */
419
420 struct elf64_x86_64_link_hash_table
421 {
422   struct elf_link_hash_table elf;
423
424   /* Short-cuts to get to dynamic linker sections.  */
425   asection *sgot;
426   asection *sgotplt;
427   asection *srelgot;
428   asection *splt;
429   asection *srelplt;
430   asection *sdynbss;
431   asection *srelbss;
432
433   union {
434     bfd_signed_vma refcount;
435     bfd_vma offset;
436   } tls_ld_got;
437
438   /* Small local sym to section mapping cache.  */
439   struct sym_sec_cache sym_sec;
440 };
441
442 /* Get the x86-64 ELF linker hash table from a link_info structure.  */
443
444 #define elf64_x86_64_hash_table(p) \
445   ((struct elf64_x86_64_link_hash_table *) ((p)->hash))
446
447 /* Create an entry in an x86-64 ELF linker hash table.  */
448
449 static struct bfd_hash_entry *
450 link_hash_newfunc (entry, table, string)
451      struct bfd_hash_entry *entry;
452      struct bfd_hash_table *table;
453      const char *string;
454 {
455   /* Allocate the structure if it has not already been allocated by a
456      subclass.  */
457   if (entry == NULL)
458     {
459       entry = bfd_hash_allocate (table,
460                                  sizeof (struct elf64_x86_64_link_hash_entry));
461       if (entry == NULL)
462         return entry;
463     }
464
465   /* Call the allocation method of the superclass.  */
466   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
467   if (entry != NULL)
468     {
469       struct elf64_x86_64_link_hash_entry *eh;
470
471       eh = (struct elf64_x86_64_link_hash_entry *) entry;
472       eh->dyn_relocs = NULL;
473       eh->tls_type = GOT_UNKNOWN;
474     }
475
476   return entry;
477 }
478
479 /* Create an X86-64 ELF linker hash table.  */
480
481 static struct bfd_link_hash_table *
482 elf64_x86_64_link_hash_table_create (abfd)
483      bfd *abfd;
484 {
485   struct elf64_x86_64_link_hash_table *ret;
486   bfd_size_type amt = sizeof (struct elf64_x86_64_link_hash_table);
487
488   ret = (struct elf64_x86_64_link_hash_table *) bfd_malloc (amt);
489   if (ret == NULL)
490     return NULL;
491
492   if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
493     {
494       free (ret);
495       return NULL;
496     }
497
498   ret->sgot = NULL;
499   ret->sgotplt = NULL;
500   ret->srelgot = NULL;
501   ret->splt = NULL;
502   ret->srelplt = NULL;
503   ret->sdynbss = NULL;
504   ret->srelbss = NULL;
505   ret->sym_sec.abfd = NULL;
506   ret->tls_ld_got.refcount = 0;
507
508   return &ret->elf.root;
509 }
510
511 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
512    shortcuts to them in our hash table.  */
513
514 static bfd_boolean
515 create_got_section (dynobj, info)
516      bfd *dynobj;
517      struct bfd_link_info *info;
518 {
519   struct elf64_x86_64_link_hash_table *htab;
520
521   if (! _bfd_elf_create_got_section (dynobj, info))
522     return FALSE;
523
524   htab = elf64_x86_64_hash_table (info);
525   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
526   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
527   if (!htab->sgot || !htab->sgotplt)
528     abort ();
529
530   htab->srelgot = bfd_make_section (dynobj, ".rela.got");
531   if (htab->srelgot == NULL
532       || ! bfd_set_section_flags (dynobj, htab->srelgot,
533                                   (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
534                                    | SEC_IN_MEMORY | SEC_LINKER_CREATED
535                                    | SEC_READONLY))
536       || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3))
537     return FALSE;
538   return TRUE;
539 }
540
541 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
542    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
543    hash table.  */
544
545 static bfd_boolean
546 elf64_x86_64_create_dynamic_sections (dynobj, info)
547      bfd *dynobj;
548      struct bfd_link_info *info;
549 {
550   struct elf64_x86_64_link_hash_table *htab;
551
552   htab = elf64_x86_64_hash_table (info);
553   if (!htab->sgot && !create_got_section (dynobj, info))
554     return FALSE;
555
556   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
557     return FALSE;
558
559   htab->splt = bfd_get_section_by_name (dynobj, ".plt");
560   htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
561   htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
562   if (!info->shared)
563     htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
564
565   if (!htab->splt || !htab->srelplt || !htab->sdynbss
566       || (!info->shared && !htab->srelbss))
567     abort ();
568
569   return TRUE;
570 }
571
572 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
573
574 static void
575 elf64_x86_64_copy_indirect_symbol (bed, dir, ind)
576      struct elf_backend_data *bed;
577      struct elf_link_hash_entry *dir, *ind;
578 {
579   struct elf64_x86_64_link_hash_entry *edir, *eind;
580
581   edir = (struct elf64_x86_64_link_hash_entry *) dir;
582   eind = (struct elf64_x86_64_link_hash_entry *) ind;
583
584   if (eind->dyn_relocs != NULL)
585     {
586       if (edir->dyn_relocs != NULL)
587         {
588           struct elf64_x86_64_dyn_relocs **pp;
589           struct elf64_x86_64_dyn_relocs *p;
590
591           if (ind->root.type == bfd_link_hash_indirect)
592             abort ();
593
594           /* Add reloc counts against the weak sym to the strong sym
595              list.  Merge any entries against the same section.  */
596           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
597             {
598               struct elf64_x86_64_dyn_relocs *q;
599
600               for (q = edir->dyn_relocs; q != NULL; q = q->next)
601                 if (q->sec == p->sec)
602                   {
603                     q->pc_count += p->pc_count;
604                     q->count += p->count;
605                     *pp = p->next;
606                     break;
607                   }
608               if (q == NULL)
609                 pp = &p->next;
610             }
611           *pp = edir->dyn_relocs;
612         }
613
614       edir->dyn_relocs = eind->dyn_relocs;
615       eind->dyn_relocs = NULL;
616     }
617
618   if (ind->root.type == bfd_link_hash_indirect
619       && dir->got.refcount <= 0)
620     {
621       edir->tls_type = eind->tls_type;
622       eind->tls_type = GOT_UNKNOWN;
623     }
624
625   if (ELIMINATE_COPY_RELOCS
626       && ind->root.type != bfd_link_hash_indirect
627       && (dir->elf_link_hash_flags & ELF_LINK_HASH_DYNAMIC_ADJUSTED) != 0)
628     /* If called to transfer flags for a weakdef during processing
629        of elf_adjust_dynamic_symbol, don't copy ELF_LINK_NON_GOT_REF.
630        We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
631     dir->elf_link_hash_flags |=
632       (ind->elf_link_hash_flags & (ELF_LINK_HASH_REF_DYNAMIC
633                                    | ELF_LINK_HASH_REF_REGULAR
634                                    | ELF_LINK_HASH_REF_REGULAR_NONWEAK));
635   else
636     _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
637 }
638
639 static bfd_boolean
640 elf64_x86_64_mkobject (abfd)
641      bfd *abfd;
642 {
643   bfd_size_type amt = sizeof (struct elf64_x86_64_obj_tdata);
644   abfd->tdata.any = bfd_zalloc (abfd, amt);
645   if (abfd->tdata.any == NULL)
646     return FALSE;
647   return TRUE;
648 }
649
650 static bfd_boolean
651 elf64_x86_64_elf_object_p (abfd)
652   bfd *abfd;
653 {
654   /* Allocate our special target data.  */
655   struct elf64_x86_64_obj_tdata *new_tdata;
656   bfd_size_type amt = sizeof (struct elf64_x86_64_obj_tdata);
657   new_tdata = bfd_zalloc (abfd, amt);
658   if (new_tdata == NULL)
659     return FALSE;
660   new_tdata->root = *abfd->tdata.elf_obj_data;
661   abfd->tdata.any = new_tdata;
662   /* Set the right machine number for an x86-64 elf64 file.  */
663   bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
664   return TRUE;
665 }
666
667 static int
668 elf64_x86_64_tls_transition (info, r_type, is_local)
669      struct bfd_link_info *info;
670      int r_type;
671      int is_local;
672 {
673   if (info->shared)
674     return r_type;
675
676   switch (r_type)
677     {
678     case R_X86_64_TLSGD:
679     case R_X86_64_GOTTPOFF:
680       if (is_local)
681         return R_X86_64_TPOFF32;
682       return R_X86_64_GOTTPOFF;
683     case R_X86_64_TLSLD:
684       return R_X86_64_TPOFF32;
685     }
686
687    return r_type;
688 }
689
690 /* Look through the relocs for a section during the first phase, and
691    calculate needed space in the global offset table, procedure
692    linkage table, and dynamic reloc sections.  */
693
694 static bfd_boolean
695 elf64_x86_64_check_relocs (abfd, info, sec, relocs)
696      bfd *abfd;
697      struct bfd_link_info *info;
698      asection *sec;
699      const Elf_Internal_Rela *relocs;
700 {
701   struct elf64_x86_64_link_hash_table *htab;
702   Elf_Internal_Shdr *symtab_hdr;
703   struct elf_link_hash_entry **sym_hashes;
704   const Elf_Internal_Rela *rel;
705   const Elf_Internal_Rela *rel_end;
706   asection *sreloc;
707
708   if (info->relocateable)
709     return TRUE;
710
711   htab = elf64_x86_64_hash_table (info);
712   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
713   sym_hashes = elf_sym_hashes (abfd);
714
715   sreloc = NULL;
716
717   rel_end = relocs + sec->reloc_count;
718   for (rel = relocs; rel < rel_end; rel++)
719     {
720       unsigned int r_type;
721       unsigned long r_symndx;
722       struct elf_link_hash_entry *h;
723
724       r_symndx = ELF64_R_SYM (rel->r_info);
725       r_type = ELF64_R_TYPE (rel->r_info);
726
727       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
728         {
729           (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
730                                  bfd_archive_filename (abfd),
731                                  r_symndx);
732           return FALSE;
733         }
734
735       if (r_symndx < symtab_hdr->sh_info)
736         h = NULL;
737       else
738         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
739
740       r_type = elf64_x86_64_tls_transition (info, r_type, h == NULL);
741       switch (r_type)
742         {
743         case R_X86_64_TLSLD:
744           htab->tls_ld_got.refcount += 1;
745           goto create_got;
746
747         case R_X86_64_TPOFF32:
748           if (info->shared)
749             {
750               (*_bfd_error_handler)
751                 (_("%s: relocation %s can not be used when making a shared object; recompile with -fPIC"),
752                  bfd_archive_filename (abfd),
753                  x86_64_elf_howto_table[r_type].name);
754               bfd_set_error (bfd_error_bad_value);
755               return FALSE;
756             }
757           break;
758
759         case R_X86_64_GOTTPOFF:
760           if (info->shared)
761             info->flags |= DF_STATIC_TLS;
762           /* Fall through */
763
764         case R_X86_64_GOT32:
765         case R_X86_64_GOTPCREL:
766         case R_X86_64_TLSGD:
767           /* This symbol requires a global offset table entry.  */
768           {
769             int tls_type, old_tls_type;
770
771             switch (r_type)
772               {
773               default: tls_type = GOT_NORMAL; break;
774               case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break;
775               case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break;
776               }
777
778             if (h != NULL)
779               {
780                 h->got.refcount += 1;
781                 old_tls_type = elf64_x86_64_hash_entry (h)->tls_type;
782               }
783             else
784               {
785                 bfd_signed_vma *local_got_refcounts;
786
787                 /* This is a global offset table entry for a local symbol.  */
788                 local_got_refcounts = elf_local_got_refcounts (abfd);
789                 if (local_got_refcounts == NULL)
790                   {
791                     bfd_size_type size;
792
793                     size = symtab_hdr->sh_info;
794                     size *= sizeof (bfd_signed_vma) + sizeof (char);
795                     local_got_refcounts = ((bfd_signed_vma *)
796                                            bfd_zalloc (abfd, size));
797                     if (local_got_refcounts == NULL)
798                       return FALSE;
799                     elf_local_got_refcounts (abfd) = local_got_refcounts;
800                     elf64_x86_64_local_got_tls_type (abfd)
801                       = (char *) (local_got_refcounts + symtab_hdr->sh_info);
802                   }
803                 local_got_refcounts[r_symndx] += 1;
804                 old_tls_type
805                   = elf64_x86_64_local_got_tls_type (abfd) [r_symndx];
806               }
807
808             /* If a TLS symbol is accessed using IE at least once,
809                there is no point to use dynamic model for it.  */
810             if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
811                 && (old_tls_type != GOT_TLS_GD || tls_type != GOT_TLS_IE))
812               {
813                 if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
814                   tls_type = old_tls_type;
815                 else
816                   {
817                     (*_bfd_error_handler)
818                       (_("%s: %s' accessed both as normal and thread local symbol"),
819                        bfd_archive_filename (abfd),
820                        h ? h->root.root.string : "<local>");
821                     return FALSE;
822                   }
823               }
824
825             if (old_tls_type != tls_type)
826               {
827                 if (h != NULL)
828                   elf64_x86_64_hash_entry (h)->tls_type = tls_type;
829                 else
830                   elf64_x86_64_local_got_tls_type (abfd) [r_symndx] = tls_type;
831               }
832           }
833           /* Fall through */
834
835           //case R_X86_64_GOTPCREL:
836         create_got:
837           if (htab->sgot == NULL)
838             {
839               if (htab->elf.dynobj == NULL)
840                 htab->elf.dynobj = abfd;
841               if (!create_got_section (htab->elf.dynobj, info))
842                 return FALSE;
843             }
844           break;
845
846         case R_X86_64_PLT32:
847           /* This symbol requires a procedure linkage table entry.  We
848              actually build the entry in adjust_dynamic_symbol,
849              because this might be a case of linking PIC code which is
850              never referenced by a dynamic object, in which case we
851              don't need to generate a procedure linkage table entry
852              after all.  */
853
854           /* If this is a local symbol, we resolve it directly without
855              creating a procedure linkage table entry.  */
856           if (h == NULL)
857             continue;
858
859           h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
860           h->plt.refcount += 1;
861           break;
862
863         case R_X86_64_8:
864         case R_X86_64_16:
865         case R_X86_64_32:
866         case R_X86_64_32S:
867           /* Let's help debug shared library creation.  These relocs
868              cannot be used in shared libs.  Don't error out for
869              sections we don't care about, such as debug sections or
870              non-constant sections.  */
871           if (info->shared
872               && (sec->flags & SEC_ALLOC) != 0
873               && (sec->flags & SEC_READONLY) != 0)
874             {
875               (*_bfd_error_handler)
876                 (_("%s: relocation %s can not be used when making a shared object; recompile with -fPIC"),
877                  bfd_archive_filename (abfd),
878                  x86_64_elf_howto_table[r_type].name);
879               bfd_set_error (bfd_error_bad_value);
880               return FALSE;
881             }
882           /* Fall through.  */
883
884         case R_X86_64_PC8:
885         case R_X86_64_PC16:
886         case R_X86_64_PC32:
887         case R_X86_64_64:
888           if (h != NULL && !info->shared)
889             {
890               /* If this reloc is in a read-only section, we might
891                  need a copy reloc.  We can't check reliably at this
892                  stage whether the section is read-only, as input
893                  sections have not yet been mapped to output sections.
894                  Tentatively set the flag for now, and correct in
895                  adjust_dynamic_symbol.  */
896               h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
897
898               /* We may need a .plt entry if the function this reloc
899                  refers to is in a shared lib.  */
900               h->plt.refcount += 1;
901             }
902
903           /* If we are creating a shared library, and this is a reloc
904              against a global symbol, or a non PC relative reloc
905              against a local symbol, then we need to copy the reloc
906              into the shared library.  However, if we are linking with
907              -Bsymbolic, we do not need to copy a reloc against a
908              global symbol which is defined in an object we are
909              including in the link (i.e., DEF_REGULAR is set).  At
910              this point we have not seen all the input files, so it is
911              possible that DEF_REGULAR is not set now but will be set
912              later (it is never cleared).  In case of a weak definition,
913              DEF_REGULAR may be cleared later by a strong definition in
914              a shared library.  We account for that possibility below by
915              storing information in the relocs_copied field of the hash
916              table entry.  A similar situation occurs when creating
917              shared libraries and symbol visibility changes render the
918              symbol local.
919
920              If on the other hand, we are creating an executable, we
921              may need to keep relocations for symbols satisfied by a
922              dynamic library if we manage to avoid copy relocs for the
923              symbol.  */
924           if ((info->shared
925                && (sec->flags & SEC_ALLOC) != 0
926                && (((r_type != R_X86_64_PC8)
927                     && (r_type != R_X86_64_PC16)
928                     && (r_type != R_X86_64_PC32))
929                    || (h != NULL
930                        && (! info->symbolic
931                            || h->root.type == bfd_link_hash_defweak
932                            || (h->elf_link_hash_flags
933                                & ELF_LINK_HASH_DEF_REGULAR) == 0))))
934               || (ELIMINATE_COPY_RELOCS
935                   && !info->shared
936                   && (sec->flags & SEC_ALLOC) != 0
937                   && h != NULL
938                   && (h->root.type == bfd_link_hash_defweak
939                       || (h->elf_link_hash_flags
940                           & ELF_LINK_HASH_DEF_REGULAR) == 0)))
941             {
942               struct elf64_x86_64_dyn_relocs *p;
943               struct elf64_x86_64_dyn_relocs **head;
944
945               /* We must copy these reloc types into the output file.
946                  Create a reloc section in dynobj and make room for
947                  this reloc.  */
948               if (sreloc == NULL)
949                 {
950                   const char *name;
951                   bfd *dynobj;
952
953                   name = (bfd_elf_string_from_elf_section
954                           (abfd,
955                            elf_elfheader (abfd)->e_shstrndx,
956                            elf_section_data (sec)->rel_hdr.sh_name));
957                   if (name == NULL)
958                     return FALSE;
959
960                   if (strncmp (name, ".rela", 5) != 0
961                       || strcmp (bfd_get_section_name (abfd, sec),
962                                  name + 5) != 0)
963                     {
964                       (*_bfd_error_handler)
965                         (_("%s: bad relocation section name `%s\'"),
966                          bfd_archive_filename (abfd), name);
967                     }
968
969                   if (htab->elf.dynobj == NULL)
970                     htab->elf.dynobj = abfd;
971
972                   dynobj = htab->elf.dynobj;
973
974                   sreloc = bfd_get_section_by_name (dynobj, name);
975                   if (sreloc == NULL)
976                     {
977                       flagword flags;
978
979                       sreloc = bfd_make_section (dynobj, name);
980                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
981                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
982                       if ((sec->flags & SEC_ALLOC) != 0)
983                         flags |= SEC_ALLOC | SEC_LOAD;
984                       if (sreloc == NULL
985                           || ! bfd_set_section_flags (dynobj, sreloc, flags)
986                           || ! bfd_set_section_alignment (dynobj, sreloc, 3))
987                         return FALSE;
988                     }
989                   elf_section_data (sec)->sreloc = sreloc;
990                 }
991
992               /* If this is a global symbol, we count the number of
993                  relocations we need for this symbol.  */
994               if (h != NULL)
995                 {
996                   head = &((struct elf64_x86_64_link_hash_entry *) h)->dyn_relocs;
997                 }
998               else
999                 {
1000                   /* Track dynamic relocs needed for local syms too.
1001                      We really need local syms available to do this
1002                      easily.  Oh well.  */
1003
1004                   asection *s;
1005                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
1006                                                  sec, r_symndx);
1007                   if (s == NULL)
1008                     return FALSE;
1009
1010                   head = ((struct elf64_x86_64_dyn_relocs **)
1011                           &elf_section_data (s)->local_dynrel);
1012                 }
1013
1014               p = *head;
1015               if (p == NULL || p->sec != sec)
1016                 {
1017                   bfd_size_type amt = sizeof *p;
1018                   p = ((struct elf64_x86_64_dyn_relocs *)
1019                        bfd_alloc (htab->elf.dynobj, amt));
1020                   if (p == NULL)
1021                     return FALSE;
1022                   p->next = *head;
1023                   *head = p;
1024                   p->sec = sec;
1025                   p->count = 0;
1026                   p->pc_count = 0;
1027                 }
1028
1029               p->count += 1;
1030               if (r_type == R_X86_64_PC8
1031                   || r_type == R_X86_64_PC16
1032                   || r_type == R_X86_64_PC32)
1033                 p->pc_count += 1;
1034             }
1035           break;
1036
1037           /* This relocation describes the C++ object vtable hierarchy.
1038              Reconstruct it for later use during GC.  */
1039         case R_X86_64_GNU_VTINHERIT:
1040           if (!_bfd_elf64_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1041             return FALSE;
1042           break;
1043
1044           /* This relocation describes which C++ vtable entries are actually
1045              used.  Record for later use during GC.  */
1046         case R_X86_64_GNU_VTENTRY:
1047           if (!_bfd_elf64_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1048             return FALSE;
1049           break;
1050
1051         default:
1052           break;
1053         }
1054     }
1055
1056   return TRUE;
1057 }
1058
1059 /* Return the section that should be marked against GC for a given
1060    relocation.  */
1061
1062 static asection *
1063 elf64_x86_64_gc_mark_hook (sec, info, rel, h, sym)
1064      asection *sec;
1065      struct bfd_link_info *info ATTRIBUTE_UNUSED;
1066      Elf_Internal_Rela *rel;
1067      struct elf_link_hash_entry *h;
1068      Elf_Internal_Sym *sym;
1069 {
1070   if (h != NULL)
1071     {
1072       switch (ELF64_R_TYPE (rel->r_info))
1073         {
1074         case R_X86_64_GNU_VTINHERIT:
1075         case R_X86_64_GNU_VTENTRY:
1076           break;
1077
1078         default:
1079           switch (h->root.type)
1080             {
1081             case bfd_link_hash_defined:
1082             case bfd_link_hash_defweak:
1083               return h->root.u.def.section;
1084
1085             case bfd_link_hash_common:
1086               return h->root.u.c.p->section;
1087
1088             default:
1089               break;
1090             }
1091         }
1092     }
1093   else
1094     return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
1095
1096   return NULL;
1097 }
1098
1099 /* Update the got entry reference counts for the section being removed.  */
1100
1101 static bfd_boolean
1102 elf64_x86_64_gc_sweep_hook (abfd, info, sec, relocs)
1103      bfd *abfd;
1104      struct bfd_link_info *info;
1105      asection *sec;
1106      const Elf_Internal_Rela *relocs;
1107 {
1108   Elf_Internal_Shdr *symtab_hdr;
1109   struct elf_link_hash_entry **sym_hashes;
1110   bfd_signed_vma *local_got_refcounts;
1111   const Elf_Internal_Rela *rel, *relend;
1112
1113   elf_section_data (sec)->local_dynrel = NULL;
1114
1115   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1116   sym_hashes = elf_sym_hashes (abfd);
1117   local_got_refcounts = elf_local_got_refcounts (abfd);
1118
1119   relend = relocs + sec->reloc_count;
1120   for (rel = relocs; rel < relend; rel++)
1121     {
1122       unsigned long r_symndx;
1123       unsigned int r_type;
1124       struct elf_link_hash_entry *h = NULL;
1125
1126       r_symndx = ELF64_R_SYM (rel->r_info);
1127       if (r_symndx >= symtab_hdr->sh_info)
1128         {
1129           struct elf64_x86_64_link_hash_entry *eh;
1130           struct elf64_x86_64_dyn_relocs **pp;
1131           struct elf64_x86_64_dyn_relocs *p;
1132
1133           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1134           eh = (struct elf64_x86_64_link_hash_entry *) h;
1135
1136           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1137             if (p->sec == sec)
1138               {
1139                 /* Everything must go for SEC.  */
1140                 *pp = p->next;
1141                 break;
1142               }
1143         }
1144
1145       r_type = ELF64_R_TYPE (rel->r_info);
1146       r_type = elf64_x86_64_tls_transition (info, r_type, h != NULL);
1147       switch (r_type)
1148         {
1149         case R_X86_64_TLSLD:
1150           if (elf64_x86_64_hash_table (info)->tls_ld_got.refcount > 0)
1151             elf64_x86_64_hash_table (info)->tls_ld_got.refcount -= 1;
1152           break;
1153
1154         case R_X86_64_TLSGD:
1155         case R_X86_64_GOTTPOFF:
1156         case R_X86_64_GOT32:
1157         case R_X86_64_GOTPCREL:
1158           if (h != NULL)
1159             {
1160               if (h->got.refcount > 0)
1161                 h->got.refcount -= 1;
1162             }
1163           else if (local_got_refcounts != NULL)
1164             {
1165               if (local_got_refcounts[r_symndx] > 0)
1166                 local_got_refcounts[r_symndx] -= 1;
1167             }
1168           break;
1169
1170         case R_X86_64_8:
1171         case R_X86_64_16:
1172         case R_X86_64_32:
1173         case R_X86_64_64:
1174         case R_X86_64_32S:
1175         case R_X86_64_PC8:
1176         case R_X86_64_PC16:
1177         case R_X86_64_PC32:
1178           if (info->shared)
1179             break;
1180           /* Fall thru */
1181
1182         case R_X86_64_PLT32:
1183           if (h != NULL)
1184             {
1185               if (h->plt.refcount > 0)
1186                 h->plt.refcount -= 1;
1187             }
1188           break;
1189
1190         default:
1191           break;
1192         }
1193     }
1194
1195   return TRUE;
1196 }
1197
1198 /* Adjust a symbol defined by a dynamic object and referenced by a
1199    regular object.  The current definition is in some section of the
1200    dynamic object, but we're not including those sections.  We have to
1201    change the definition to something the rest of the link can
1202    understand.  */
1203
1204 static bfd_boolean
1205 elf64_x86_64_adjust_dynamic_symbol (info, h)
1206      struct bfd_link_info *info;
1207      struct elf_link_hash_entry *h;
1208 {
1209   struct elf64_x86_64_link_hash_table *htab;
1210   asection *s;
1211   unsigned int power_of_two;
1212
1213   /* If this is a function, put it in the procedure linkage table.  We
1214      will fill in the contents of the procedure linkage table later,
1215      when we know the address of the .got section.  */
1216   if (h->type == STT_FUNC
1217       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
1218     {
1219       if (h->plt.refcount <= 0
1220           || (! info->shared
1221               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
1222               && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
1223               && h->root.type != bfd_link_hash_undefweak
1224               && h->root.type != bfd_link_hash_undefined))
1225         {
1226           /* This case can occur if we saw a PLT32 reloc in an input
1227              file, but the symbol was never referred to by a dynamic
1228              object, or if all references were garbage collected.  In
1229              such a case, we don't actually need to build a procedure
1230              linkage table, and we can just do a PC32 reloc instead.  */
1231           h->plt.offset = (bfd_vma) -1;
1232           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1233         }
1234
1235       return TRUE;
1236     }
1237   else
1238     /* It's possible that we incorrectly decided a .plt reloc was
1239        needed for an R_X86_64_PC32 reloc to a non-function sym in
1240        check_relocs.  We can't decide accurately between function and
1241        non-function syms in check-relocs;  Objects loaded later in
1242        the link may change h->type.  So fix it now.  */
1243     h->plt.offset = (bfd_vma) -1;
1244
1245   /* If this is a weak symbol, and there is a real definition, the
1246      processor independent code will have arranged for us to see the
1247      real definition first, and we can just use the same value.  */
1248   if (h->weakdef != NULL)
1249     {
1250       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1251                   || h->weakdef->root.type == bfd_link_hash_defweak);
1252       h->root.u.def.section = h->weakdef->root.u.def.section;
1253       h->root.u.def.value = h->weakdef->root.u.def.value;
1254       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
1255         h->elf_link_hash_flags
1256           = ((h->elf_link_hash_flags & ~ELF_LINK_NON_GOT_REF)
1257              | (h->weakdef->elf_link_hash_flags & ELF_LINK_NON_GOT_REF));
1258       return TRUE;
1259     }
1260
1261   /* This is a reference to a symbol defined by a dynamic object which
1262      is not a function.  */
1263
1264   /* If we are creating a shared library, we must presume that the
1265      only references to the symbol are via the global offset table.
1266      For such cases we need not do anything here; the relocations will
1267      be handled correctly by relocate_section.  */
1268   if (info->shared)
1269     return TRUE;
1270
1271   /* If there are no references to this symbol that do not use the
1272      GOT, we don't need to generate a copy reloc.  */
1273   if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1274     return TRUE;
1275
1276   /* If -z nocopyreloc was given, we won't generate them either.  */
1277   if (info->nocopyreloc)
1278     {
1279       h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1280       return TRUE;
1281     }
1282
1283   if (ELIMINATE_COPY_RELOCS)
1284     {
1285       struct elf64_x86_64_link_hash_entry * eh;
1286       struct elf64_x86_64_dyn_relocs *p;
1287
1288       eh = (struct elf64_x86_64_link_hash_entry *) h;
1289       for (p = eh->dyn_relocs; p != NULL; p = p->next)
1290         {
1291           s = p->sec->output_section;
1292           if (s != NULL && (s->flags & SEC_READONLY) != 0)
1293             break;
1294         }
1295
1296       /* If we didn't find any dynamic relocs in read-only sections, then
1297          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1298       if (p == NULL)
1299         {
1300           h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1301           return TRUE;
1302         }
1303     }
1304
1305   /* We must allocate the symbol in our .dynbss section, which will
1306      become part of the .bss section of the executable.  There will be
1307      an entry for this symbol in the .dynsym section.  The dynamic
1308      object will contain position independent code, so all references
1309      from the dynamic object to this symbol will go through the global
1310      offset table.  The dynamic linker will use the .dynsym entry to
1311      determine the address it must put in the global offset table, so
1312      both the dynamic object and the regular object will refer to the
1313      same memory location for the variable.  */
1314
1315   htab = elf64_x86_64_hash_table (info);
1316
1317   /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
1318      to copy the initial value out of the dynamic object and into the
1319      runtime process image.  */
1320   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1321     {
1322       htab->srelbss->_raw_size += sizeof (Elf64_External_Rela);
1323       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1324     }
1325
1326   /* We need to figure out the alignment required for this symbol.  I
1327      have no idea how ELF linkers handle this.  16-bytes is the size
1328      of the largest type that requires hard alignment -- long double.  */
1329   /* FIXME: This is VERY ugly. Should be fixed for all architectures using
1330      this construct.  */
1331   power_of_two = bfd_log2 (h->size);
1332   if (power_of_two > 4)
1333     power_of_two = 4;
1334
1335   /* Apply the required alignment.  */
1336   s = htab->sdynbss;
1337   s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two));
1338   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
1339     {
1340       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
1341         return FALSE;
1342     }
1343
1344   /* Define the symbol as being at this point in the section.  */
1345   h->root.u.def.section = s;
1346   h->root.u.def.value = s->_raw_size;
1347
1348   /* Increment the section size to make room for the symbol.  */
1349   s->_raw_size += h->size;
1350
1351   return TRUE;
1352 }
1353
1354 /* This is the condition under which elf64_x86_64_finish_dynamic_symbol
1355    will be called from elflink.h.  If elflink.h doesn't call our
1356    finish_dynamic_symbol routine, we'll need to do something about
1357    initializing any .plt and .got entries in elf64_x86_64_relocate_section.  */
1358 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
1359   ((DYN)                                                                \
1360    && ((INFO)->shared                                                   \
1361        || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)      \
1362    && ((H)->dynindx != -1                                               \
1363        || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
1364
1365 /* Allocate space in .plt, .got and associated reloc sections for
1366    dynamic relocs.  */
1367
1368 static bfd_boolean
1369 allocate_dynrelocs (h, inf)
1370      struct elf_link_hash_entry *h;
1371      PTR inf;
1372 {
1373   struct bfd_link_info *info;
1374   struct elf64_x86_64_link_hash_table *htab;
1375   struct elf64_x86_64_link_hash_entry *eh;
1376   struct elf64_x86_64_dyn_relocs *p;
1377
1378   if (h->root.type == bfd_link_hash_indirect)
1379     return TRUE;
1380
1381   if (h->root.type == bfd_link_hash_warning)
1382     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1383
1384   info = (struct bfd_link_info *) inf;
1385   htab = elf64_x86_64_hash_table (info);
1386
1387   if (htab->elf.dynamic_sections_created
1388       && h->plt.refcount > 0)
1389     {
1390       /* Make sure this symbol is output as a dynamic symbol.
1391          Undefined weak syms won't yet be marked as dynamic.  */
1392       if (h->dynindx == -1
1393           && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1394         {
1395           if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1396             return FALSE;
1397         }
1398
1399       if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1400            || h->root.type != bfd_link_hash_undefweak)
1401           && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
1402         {
1403           asection *s = htab->splt;
1404
1405           /* If this is the first .plt entry, make room for the special
1406              first entry.  */
1407           if (s->_raw_size == 0)
1408             s->_raw_size += PLT_ENTRY_SIZE;
1409
1410           h->plt.offset = s->_raw_size;
1411
1412           /* If this symbol is not defined in a regular file, and we are
1413              not generating a shared library, then set the symbol to this
1414              location in the .plt.  This is required to make function
1415              pointers compare as equal between the normal executable and
1416              the shared library.  */
1417           if (! info->shared
1418               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1419             {
1420               h->root.u.def.section = s;
1421               h->root.u.def.value = h->plt.offset;
1422             }
1423
1424           /* Make room for this entry.  */
1425           s->_raw_size += PLT_ENTRY_SIZE;
1426
1427           /* We also need to make an entry in the .got.plt section, which
1428              will be placed in the .got section by the linker script.  */
1429           htab->sgotplt->_raw_size += GOT_ENTRY_SIZE;
1430
1431           /* We also need to make an entry in the .rela.plt section.  */
1432           htab->srelplt->_raw_size += sizeof (Elf64_External_Rela);
1433         }
1434       else
1435         {
1436           h->plt.offset = (bfd_vma) -1;
1437           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1438         }
1439     }
1440   else
1441     {
1442       h->plt.offset = (bfd_vma) -1;
1443       h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1444     }
1445
1446   /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
1447      make it a R_X86_64_TPOFF32 requiring no GOT entry.  */
1448   if (h->got.refcount > 0
1449       && !info->shared
1450       && h->dynindx == -1
1451       && elf64_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE)
1452     h->got.offset = (bfd_vma) -1;
1453   else if (h->got.refcount > 0)
1454     {
1455       asection *s;
1456       bfd_boolean dyn;
1457       int tls_type = elf64_x86_64_hash_entry (h)->tls_type;
1458
1459       /* Make sure this symbol is output as a dynamic symbol.
1460          Undefined weak syms won't yet be marked as dynamic.  */
1461       if (h->dynindx == -1
1462           && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1463         {
1464           if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1465             return FALSE;
1466         }
1467
1468       s = htab->sgot;
1469       h->got.offset = s->_raw_size;
1470       s->_raw_size += GOT_ENTRY_SIZE;
1471       /* R_X86_64_TLSGD needs 2 consecutive GOT slots.  */
1472       if (tls_type == GOT_TLS_GD)
1473         s->_raw_size += GOT_ENTRY_SIZE;
1474       dyn = htab->elf.dynamic_sections_created;
1475       /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
1476          and two if global.
1477          R_X86_64_GOTTPOFF needs one dynamic relocation.  */
1478       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
1479           || tls_type == GOT_TLS_IE)
1480         htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
1481       else if (tls_type == GOT_TLS_GD)
1482         htab->srelgot->_raw_size += 2 * sizeof (Elf64_External_Rela);
1483       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1484                 || h->root.type != bfd_link_hash_undefweak)
1485                && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
1486         htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
1487     }
1488   else
1489     h->got.offset = (bfd_vma) -1;
1490
1491   eh = (struct elf64_x86_64_link_hash_entry *) h;
1492   if (eh->dyn_relocs == NULL)
1493     return TRUE;
1494
1495   /* In the shared -Bsymbolic case, discard space allocated for
1496      dynamic pc-relative relocs against symbols which turn out to be
1497      defined in regular objects.  For the normal shared case, discard
1498      space for pc-relative relocs that have become local due to symbol
1499      visibility changes.  */
1500
1501   if (info->shared)
1502     {
1503       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1504           && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1505               || info->symbolic))
1506         {
1507           struct elf64_x86_64_dyn_relocs **pp;
1508
1509           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1510             {
1511               p->count -= p->pc_count;
1512               p->pc_count = 0;
1513               if (p->count == 0)
1514                 *pp = p->next;
1515               else
1516                 pp = &p->next;
1517             }
1518         }
1519     }
1520   else if (ELIMINATE_COPY_RELOCS)
1521     {
1522       /* For the non-shared case, discard space for relocs against
1523          symbols which turn out to need copy relocs or are not
1524          dynamic.  */
1525
1526       if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1527           && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1528                && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1529               || (htab->elf.dynamic_sections_created
1530                   && (h->root.type == bfd_link_hash_undefweak
1531                       || h->root.type == bfd_link_hash_undefined))))
1532         {
1533           /* Make sure this symbol is output as a dynamic symbol.
1534              Undefined weak syms won't yet be marked as dynamic.  */
1535           if (h->dynindx == -1
1536               && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1537             {
1538               if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1539                 return FALSE;
1540             }
1541
1542           /* If that succeeded, we know we'll be keeping all the
1543              relocs.  */
1544           if (h->dynindx != -1)
1545             goto keep;
1546         }
1547
1548       eh->dyn_relocs = NULL;
1549
1550     keep: ;
1551     }
1552
1553   /* Finally, allocate space.  */
1554   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1555     {
1556       asection *sreloc = elf_section_data (p->sec)->sreloc;
1557       sreloc->_raw_size += p->count * sizeof (Elf64_External_Rela);
1558     }
1559
1560   return TRUE;
1561 }
1562
1563 /* Find any dynamic relocs that apply to read-only sections.  */
1564
1565 static bfd_boolean
1566 readonly_dynrelocs (h, inf)
1567      struct elf_link_hash_entry *h;
1568      PTR inf;
1569 {
1570   struct elf64_x86_64_link_hash_entry *eh;
1571   struct elf64_x86_64_dyn_relocs *p;
1572
1573   if (h->root.type == bfd_link_hash_warning)
1574     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1575
1576   eh = (struct elf64_x86_64_link_hash_entry *) h;
1577   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1578     {
1579       asection *s = p->sec->output_section;
1580
1581       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1582         {
1583           struct bfd_link_info *info = (struct bfd_link_info *) inf;
1584
1585           info->flags |= DF_TEXTREL;
1586
1587           /* Not an error, just cut short the traversal.  */
1588           return FALSE;
1589         }
1590     }
1591   return TRUE;
1592 }
1593
1594 /* Set the sizes of the dynamic sections.  */
1595
1596 static bfd_boolean
1597 elf64_x86_64_size_dynamic_sections (output_bfd, info)
1598      bfd *output_bfd ATTRIBUTE_UNUSED;
1599      struct bfd_link_info *info;
1600 {
1601   struct elf64_x86_64_link_hash_table *htab;
1602   bfd *dynobj;
1603   asection *s;
1604   bfd_boolean relocs;
1605   bfd *ibfd;
1606
1607   htab = elf64_x86_64_hash_table (info);
1608   dynobj = htab->elf.dynobj;
1609   if (dynobj == NULL)
1610     abort ();
1611
1612   if (htab->elf.dynamic_sections_created)
1613     {
1614       /* Set the contents of the .interp section to the interpreter.  */
1615       if (! info->shared)
1616         {
1617           s = bfd_get_section_by_name (dynobj, ".interp");
1618           if (s == NULL)
1619             abort ();
1620           s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1621           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1622         }
1623     }
1624
1625   /* Set up .got offsets for local syms, and space for local dynamic
1626      relocs.  */
1627   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1628     {
1629       bfd_signed_vma *local_got;
1630       bfd_signed_vma *end_local_got;
1631       char *local_tls_type;
1632       bfd_size_type locsymcount;
1633       Elf_Internal_Shdr *symtab_hdr;
1634       asection *srel;
1635
1636       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1637         continue;
1638
1639       for (s = ibfd->sections; s != NULL; s = s->next)
1640         {
1641           struct elf64_x86_64_dyn_relocs *p;
1642
1643           for (p = *((struct elf64_x86_64_dyn_relocs **)
1644                      &elf_section_data (s)->local_dynrel);
1645                p != NULL;
1646                p = p->next)
1647             {
1648               if (!bfd_is_abs_section (p->sec)
1649                   && bfd_is_abs_section (p->sec->output_section))
1650                 {
1651                   /* Input section has been discarded, either because
1652                      it is a copy of a linkonce section or due to
1653                      linker script /DISCARD/, so we'll be discarding
1654                      the relocs too.  */
1655                 }
1656               else if (p->count != 0)
1657                 {
1658                   srel = elf_section_data (p->sec)->sreloc;
1659                   srel->_raw_size += p->count * sizeof (Elf64_External_Rela);
1660                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1661                     info->flags |= DF_TEXTREL;
1662
1663                 }
1664             }
1665         }
1666
1667       local_got = elf_local_got_refcounts (ibfd);
1668       if (!local_got)
1669         continue;
1670
1671       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1672       locsymcount = symtab_hdr->sh_info;
1673       end_local_got = local_got + locsymcount;
1674       local_tls_type = elf64_x86_64_local_got_tls_type (ibfd);
1675       s = htab->sgot;
1676       srel = htab->srelgot;
1677       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1678         {
1679           if (*local_got > 0)
1680             {
1681               *local_got = s->_raw_size;
1682               s->_raw_size += GOT_ENTRY_SIZE;
1683               if (*local_tls_type == GOT_TLS_GD)
1684                 s->_raw_size += GOT_ENTRY_SIZE;
1685               if (info->shared
1686                   || *local_tls_type == GOT_TLS_GD
1687                   || *local_tls_type == GOT_TLS_IE)
1688                 srel->_raw_size += sizeof (Elf64_External_Rela);
1689             }
1690           else
1691             *local_got = (bfd_vma) -1;
1692         }
1693     }
1694
1695   if (htab->tls_ld_got.refcount > 0)
1696     {
1697       /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
1698          relocs.  */
1699       htab->tls_ld_got.offset = htab->sgot->_raw_size;
1700       htab->sgot->_raw_size += 2 * GOT_ENTRY_SIZE;
1701       htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
1702     }
1703   else
1704     htab->tls_ld_got.offset = -1;
1705
1706   /* Allocate global sym .plt and .got entries, and space for global
1707      sym dynamic relocs.  */
1708   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
1709
1710   /* We now have determined the sizes of the various dynamic sections.
1711      Allocate memory for them.  */
1712   relocs = FALSE;
1713   for (s = dynobj->sections; s != NULL; s = s->next)
1714     {
1715       if ((s->flags & SEC_LINKER_CREATED) == 0)
1716         continue;
1717
1718       if (s == htab->splt
1719           || s == htab->sgot
1720           || s == htab->sgotplt)
1721         {
1722           /* Strip this section if we don't need it; see the
1723              comment below.  */
1724         }
1725       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
1726         {
1727           if (s->_raw_size != 0 && s != htab->srelplt)
1728             relocs = TRUE;
1729
1730           /* We use the reloc_count field as a counter if we need
1731              to copy relocs into the output file.  */
1732           s->reloc_count = 0;
1733         }
1734       else
1735         {
1736           /* It's not one of our sections, so don't allocate space.  */
1737           continue;
1738         }
1739
1740       if (s->_raw_size == 0)
1741         {
1742           /* If we don't need this section, strip it from the
1743              output file.  This is mostly to handle .rela.bss and
1744              .rela.plt.  We must create both sections in
1745              create_dynamic_sections, because they must be created
1746              before the linker maps input sections to output
1747              sections.  The linker does that before
1748              adjust_dynamic_symbol is called, and it is that
1749              function which decides whether anything needs to go
1750              into these sections.  */
1751
1752           _bfd_strip_section_from_output (info, s);
1753           continue;
1754         }
1755
1756       /* Allocate memory for the section contents.  We use bfd_zalloc
1757          here in case unused entries are not reclaimed before the
1758          section's contents are written out.  This should not happen,
1759          but this way if it does, we get a R_X86_64_NONE reloc instead
1760          of garbage.  */
1761       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1762       if (s->contents == NULL)
1763         return FALSE;
1764     }
1765
1766   if (htab->elf.dynamic_sections_created)
1767     {
1768       /* Add some entries to the .dynamic section.  We fill in the
1769          values later, in elf64_x86_64_finish_dynamic_sections, but we
1770          must add the entries now so that we get the correct size for
1771          the .dynamic section.  The DT_DEBUG entry is filled in by the
1772          dynamic linker and used by the debugger.  */
1773 #define add_dynamic_entry(TAG, VAL) \
1774   bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
1775
1776       if (! info->shared)
1777         {
1778           if (!add_dynamic_entry (DT_DEBUG, 0))
1779             return FALSE;
1780         }
1781
1782       if (htab->splt->_raw_size != 0)
1783         {
1784           if (!add_dynamic_entry (DT_PLTGOT, 0)
1785               || !add_dynamic_entry (DT_PLTRELSZ, 0)
1786               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1787               || !add_dynamic_entry (DT_JMPREL, 0))
1788             return FALSE;
1789         }
1790
1791       if (relocs)
1792         {
1793           if (!add_dynamic_entry (DT_RELA, 0)
1794               || !add_dynamic_entry (DT_RELASZ, 0)
1795               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
1796             return FALSE;
1797
1798           /* If any dynamic relocs apply to a read-only section,
1799              then we need a DT_TEXTREL entry.  */
1800           if ((info->flags & DF_TEXTREL) == 0)
1801             elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
1802                                     (PTR) info);
1803
1804           if ((info->flags & DF_TEXTREL) != 0)
1805             {
1806               if (!add_dynamic_entry (DT_TEXTREL, 0))
1807                 return FALSE;
1808             }
1809         }
1810     }
1811 #undef add_dynamic_entry
1812
1813   return TRUE;
1814 }
1815
1816 /* Return the base VMA address which should be subtracted from real addresses
1817    when resolving @dtpoff relocation.
1818    This is PT_TLS segment p_vaddr.  */
1819
1820 static bfd_vma
1821 dtpoff_base (info)
1822      struct bfd_link_info *info;
1823 {
1824   /* If tls_segment is NULL, we should have signalled an error already.  */
1825   if (elf_hash_table (info)->tls_segment == NULL)
1826     return 0;
1827   return elf_hash_table (info)->tls_segment->start;
1828 }
1829
1830 /* Return the relocation value for @tpoff relocation
1831    if STT_TLS virtual address is ADDRESS.  */
1832
1833 static bfd_vma
1834 tpoff (info, address)
1835      struct bfd_link_info *info;
1836      bfd_vma address;
1837 {
1838   struct elf_link_tls_segment *tls_segment
1839     = elf_hash_table (info)->tls_segment;
1840
1841   /* If tls_segment is NULL, we should have signalled an error already.  */
1842   if (tls_segment == NULL)
1843     return 0;
1844   return address - align_power (tls_segment->size, tls_segment->align)
1845          - tls_segment->start;
1846 }
1847
1848 /* Relocate an x86_64 ELF section.  */
1849
1850 static bfd_boolean
1851 elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
1852                                contents, relocs, local_syms, local_sections)
1853      bfd *output_bfd;
1854      struct bfd_link_info *info;
1855      bfd *input_bfd;
1856      asection *input_section;
1857      bfd_byte *contents;
1858      Elf_Internal_Rela *relocs;
1859      Elf_Internal_Sym *local_syms;
1860      asection **local_sections;
1861 {
1862   struct elf64_x86_64_link_hash_table *htab;
1863   Elf_Internal_Shdr *symtab_hdr;
1864   struct elf_link_hash_entry **sym_hashes;
1865   bfd_vma *local_got_offsets;
1866   Elf_Internal_Rela *rel;
1867   Elf_Internal_Rela *relend;
1868
1869   if (info->relocateable)
1870     return TRUE;
1871
1872   htab = elf64_x86_64_hash_table (info);
1873   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1874   sym_hashes = elf_sym_hashes (input_bfd);
1875   local_got_offsets = elf_local_got_offsets (input_bfd);
1876
1877   rel = relocs;
1878   relend = relocs + input_section->reloc_count;
1879   for (; rel < relend; rel++)
1880     {
1881       unsigned int r_type;
1882       reloc_howto_type *howto;
1883       unsigned long r_symndx;
1884       struct elf_link_hash_entry *h;
1885       Elf_Internal_Sym *sym;
1886       asection *sec;
1887       bfd_vma off;
1888       bfd_vma relocation;
1889       bfd_boolean unresolved_reloc;
1890       bfd_reloc_status_type r;
1891       int tls_type;
1892
1893       r_type = ELF64_R_TYPE (rel->r_info);
1894       if (r_type == (int) R_X86_64_GNU_VTINHERIT
1895           || r_type == (int) R_X86_64_GNU_VTENTRY)
1896         continue;
1897
1898       if (r_type >= R_X86_64_max)
1899         {
1900           bfd_set_error (bfd_error_bad_value);
1901           return FALSE;
1902         }
1903
1904       howto = x86_64_elf_howto_table + r_type;
1905       r_symndx = ELF64_R_SYM (rel->r_info);
1906       h = NULL;
1907       sym = NULL;
1908       sec = NULL;
1909       unresolved_reloc = FALSE;
1910       if (r_symndx < symtab_hdr->sh_info)
1911         {
1912           sym = local_syms + r_symndx;
1913           sec = local_sections[r_symndx];
1914
1915           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
1916         }
1917       else
1918         {
1919           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1920           while (h->root.type == bfd_link_hash_indirect
1921                  || h->root.type == bfd_link_hash_warning)
1922             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1923
1924           if (h->root.type == bfd_link_hash_defined
1925               || h->root.type == bfd_link_hash_defweak)
1926             {
1927               sec = h->root.u.def.section;
1928               if (sec->output_section == NULL)
1929                 {
1930                   /* Set a flag that will be cleared later if we find a
1931                      relocation value for this symbol.  output_section
1932                      is typically NULL for symbols satisfied by a shared
1933                      library.  */
1934                   unresolved_reloc = TRUE;
1935                   relocation = 0;
1936                 }
1937               else
1938                 relocation = (h->root.u.def.value
1939                               + sec->output_section->vma
1940                               + sec->output_offset);
1941             }
1942           else if (h->root.type == bfd_link_hash_undefweak)
1943             relocation = 0;
1944           else if (info->shared
1945                    && !info->no_undefined
1946                    && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1947             relocation = 0;
1948           else
1949             {
1950               if (! ((*info->callbacks->undefined_symbol)
1951                      (info, h->root.root.string, input_bfd,
1952                       input_section, rel->r_offset,
1953                       (!info->shared || info->no_undefined
1954                        || ELF_ST_VISIBILITY (h->other)))))
1955                 return FALSE;
1956               relocation = 0;
1957             }
1958         }
1959       /* When generating a shared object, the relocations handled here are
1960          copied into the output file to be resolved at run time.  */
1961       switch (r_type)
1962         {
1963         case R_X86_64_GOT32:
1964           /* Relocation is to the entry for this symbol in the global
1965              offset table.  */
1966         case R_X86_64_GOTPCREL:
1967           /* Use global offset table as symbol value.  */
1968           if (htab->sgot == NULL)
1969             abort ();
1970
1971           if (h != NULL)
1972             {
1973               bfd_boolean dyn;
1974
1975               off = h->got.offset;
1976               dyn = htab->elf.dynamic_sections_created;
1977
1978               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
1979                   || (info->shared
1980                       && (info->symbolic
1981                           || h->dynindx == -1
1982                           || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
1983                       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
1984                   || (ELF_ST_VISIBILITY (h->other)
1985                       && h->root.type == bfd_link_hash_undefweak))
1986                 {
1987                   /* This is actually a static link, or it is a -Bsymbolic
1988                      link and the symbol is defined locally, or the symbol
1989                      was forced to be local because of a version file.  We
1990                      must initialize this entry in the global offset table.
1991                      Since the offset must always be a multiple of 8, we
1992                      use the least significant bit to record whether we
1993                      have initialized it already.
1994
1995                      When doing a dynamic link, we create a .rela.got
1996                      relocation entry to initialize the value.  This is
1997                      done in the finish_dynamic_symbol routine.  */
1998                   if ((off & 1) != 0)
1999                     off &= ~1;
2000                   else
2001                     {
2002                       bfd_put_64 (output_bfd, relocation,
2003                                   htab->sgot->contents + off);
2004                       h->got.offset |= 1;
2005                     }
2006                 }
2007               else
2008                 unresolved_reloc = FALSE;
2009             }
2010           else
2011             {
2012               if (local_got_offsets == NULL)
2013                 abort ();
2014
2015               off = local_got_offsets[r_symndx];
2016
2017               /* The offset must always be a multiple of 8.  We use
2018                  the least significant bit to record whether we have
2019                  already generated the necessary reloc.  */
2020               if ((off & 1) != 0)
2021                 off &= ~1;
2022               else
2023                 {
2024                   bfd_put_64 (output_bfd, relocation,
2025                               htab->sgot->contents + off);
2026
2027                   if (info->shared)
2028                     {
2029                       asection *s;
2030                       Elf_Internal_Rela outrel;
2031                       bfd_byte *loc;
2032
2033                       /* We need to generate a R_X86_64_RELATIVE reloc
2034                          for the dynamic linker.  */
2035                       s = htab->srelgot;
2036                       if (s == NULL)
2037                         abort ();
2038
2039                       outrel.r_offset = (htab->sgot->output_section->vma
2040                                          + htab->sgot->output_offset
2041                                          + off);
2042                       outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
2043                       outrel.r_addend = relocation;
2044                       loc = s->contents;
2045                       loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
2046                       bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2047                     }
2048
2049                   local_got_offsets[r_symndx] |= 1;
2050                 }
2051             }
2052
2053           if (off >= (bfd_vma) -2)
2054             abort ();
2055
2056           relocation = htab->sgot->output_offset + off;
2057           if (r_type == R_X86_64_GOTPCREL)
2058             relocation += htab->sgot->output_section->vma;
2059
2060           break;
2061
2062         case R_X86_64_PLT32:
2063           /* Relocation is to the entry for this symbol in the
2064              procedure linkage table.  */
2065
2066           /* Resolve a PLT32 reloc against a local symbol directly,
2067              without using the procedure linkage table.  */
2068           if (h == NULL)
2069             break;
2070
2071           if (h->plt.offset == (bfd_vma) -1
2072               || htab->splt == NULL)
2073             {
2074               /* We didn't make a PLT entry for this symbol.  This
2075                  happens when statically linking PIC code, or when
2076                  using -Bsymbolic.  */
2077               break;
2078             }
2079
2080           relocation = (htab->splt->output_section->vma
2081                         + htab->splt->output_offset
2082                         + h->plt.offset);
2083           unresolved_reloc = FALSE;
2084           break;
2085
2086         case R_X86_64_PC8:
2087         case R_X86_64_PC16:
2088         case R_X86_64_PC32:
2089         case R_X86_64_8:
2090         case R_X86_64_16:
2091         case R_X86_64_32:
2092         case R_X86_64_64:
2093           /* FIXME: The ABI says the linker should make sure the value is
2094              the same when it's zeroextended to 64 bit.  */
2095
2096           /* r_symndx will be zero only for relocs against symbols
2097              from removed linkonce sections, or sections discarded by
2098              a linker script.  */
2099           if (r_symndx == 0
2100               || (input_section->flags & SEC_ALLOC) == 0)
2101             break;
2102
2103           if ((info->shared
2104                && (h == NULL
2105                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2106                    || h->root.type != bfd_link_hash_undefweak)
2107                && ((r_type != R_X86_64_PC8
2108                     && r_type != R_X86_64_PC16
2109                     && r_type != R_X86_64_PC32)
2110                    || (h != NULL
2111                        && h->dynindx != -1
2112                        && (! info->symbolic
2113                            || (h->elf_link_hash_flags
2114                                & ELF_LINK_HASH_DEF_REGULAR) == 0))))
2115               || (ELIMINATE_COPY_RELOCS
2116                   && !info->shared
2117                   && h != NULL
2118                   && h->dynindx != -1
2119                   && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
2120                   && (((h->elf_link_hash_flags
2121                         & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2122                        && (h->elf_link_hash_flags
2123                            & ELF_LINK_HASH_DEF_REGULAR) == 0)
2124                       || h->root.type == bfd_link_hash_undefweak
2125                       || h->root.type == bfd_link_hash_undefined)))
2126             {
2127               Elf_Internal_Rela outrel;
2128               bfd_byte *loc;
2129               bfd_boolean skip, relocate;
2130               asection *sreloc;
2131
2132               /* When generating a shared object, these relocations
2133                  are copied into the output file to be resolved at run
2134                  time.  */
2135               skip = FALSE;
2136               relocate = FALSE;
2137
2138               outrel.r_offset =
2139                 _bfd_elf_section_offset (output_bfd, info, input_section,
2140                                          rel->r_offset);
2141               if (outrel.r_offset == (bfd_vma) -1)
2142                 skip = TRUE;
2143               else if (outrel.r_offset == (bfd_vma) -2)
2144                 skip = TRUE, relocate = TRUE;
2145
2146               outrel.r_offset += (input_section->output_section->vma
2147                                   + input_section->output_offset);
2148
2149               if (skip)
2150                 memset (&outrel, 0, sizeof outrel);
2151
2152               /* h->dynindx may be -1 if this symbol was marked to
2153                  become local.  */
2154               else if (h != NULL
2155                        && h->dynindx != -1
2156                        && (r_type == R_X86_64_PC8
2157                            || r_type == R_X86_64_PC16
2158                            || r_type == R_X86_64_PC32
2159                            || !info->shared
2160                            || !info->symbolic
2161                            || (h->elf_link_hash_flags
2162                                & ELF_LINK_HASH_DEF_REGULAR) == 0))
2163                 {
2164                   outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
2165                   outrel.r_addend = rel->r_addend;
2166                 }
2167               else
2168                 {
2169                   /* This symbol is local, or marked to become local.  */
2170                   if (r_type == R_X86_64_64)
2171                     {
2172                       relocate = TRUE;
2173                       outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
2174                       outrel.r_addend = relocation + rel->r_addend;
2175                     }
2176                   else
2177                     {
2178                       long sindx;
2179
2180                       if (h == NULL)
2181                         sec = local_sections[r_symndx];
2182                       else
2183                         {
2184                           BFD_ASSERT (h->root.type == bfd_link_hash_defined
2185                                       || (h->root.type
2186                                           == bfd_link_hash_defweak));
2187                           sec = h->root.u.def.section;
2188                         }
2189                       if (sec != NULL && bfd_is_abs_section (sec))
2190                         sindx = 0;
2191                       else if (sec == NULL || sec->owner == NULL)
2192                         {
2193                           bfd_set_error (bfd_error_bad_value);
2194                           return FALSE;
2195                         }
2196                       else
2197                         {
2198                           asection *osec;
2199
2200                           osec = sec->output_section;
2201                           sindx = elf_section_data (osec)->dynindx;
2202                           BFD_ASSERT (sindx > 0);
2203                         }
2204
2205                       outrel.r_info = ELF64_R_INFO (sindx, r_type);
2206                       outrel.r_addend = relocation + rel->r_addend;
2207                     }
2208                 }
2209
2210               sreloc = elf_section_data (input_section)->sreloc;
2211               if (sreloc == NULL)
2212                 abort ();
2213
2214               loc = sreloc->contents;
2215               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2216               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2217
2218               /* If this reloc is against an external symbol, we do
2219                  not want to fiddle with the addend.  Otherwise, we
2220                  need to include the symbol value so that it becomes
2221                  an addend for the dynamic reloc.  */
2222               if (! relocate)
2223                 continue;
2224             }
2225
2226           break;
2227
2228         case R_X86_64_TLSGD:
2229         case R_X86_64_GOTTPOFF:
2230           r_type = elf64_x86_64_tls_transition (info, r_type, h == NULL);
2231           tls_type = GOT_UNKNOWN;
2232           if (h == NULL && local_got_offsets)
2233             tls_type = elf64_x86_64_local_got_tls_type (input_bfd) [r_symndx];
2234           else if (h != NULL)
2235             {
2236               tls_type = elf64_x86_64_hash_entry (h)->tls_type;
2237               if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
2238                 r_type = R_X86_64_TPOFF32;
2239             }
2240           if (r_type == R_X86_64_TLSGD)
2241             {
2242               if (tls_type == GOT_TLS_IE)
2243                 r_type = R_X86_64_GOTTPOFF;
2244             }
2245
2246           if (r_type == R_X86_64_TPOFF32)
2247             {
2248               BFD_ASSERT (! unresolved_reloc);
2249               if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
2250                 {
2251                   unsigned int i;
2252                   static unsigned char tlsgd[8]
2253                     = { 0x66, 0x48, 0x8d, 0x3d, 0x66, 0x66, 0x48, 0xe8 };
2254
2255                   /* GD->LE transition.
2256                      .byte 0x66; leaq foo@tlsgd(%rip), %rdi
2257                      .word 0x6666; rex64; call __tls_get_addr@plt
2258                      Change it into:
2259                      movq %fs:0, %rax
2260                      leaq foo@tpoff(%rax), %rax */
2261                   BFD_ASSERT (rel->r_offset >= 4);
2262                   for (i = 0; i < 4; i++)
2263                     BFD_ASSERT (bfd_get_8 (input_bfd,
2264                                            contents + rel->r_offset - 4 + i)
2265                                 == tlsgd[i]);
2266                   BFD_ASSERT (rel->r_offset + 12 <= input_section->_raw_size);
2267                   for (i = 0; i < 4; i++)
2268                     BFD_ASSERT (bfd_get_8 (input_bfd,
2269                                            contents + rel->r_offset + 4 + i)
2270                                 == tlsgd[i+4]);
2271                   BFD_ASSERT (rel + 1 < relend);
2272                   BFD_ASSERT (ELF64_R_TYPE (rel[1].r_info) == R_X86_64_PLT32);
2273                   memcpy (contents + rel->r_offset - 4,
2274                           "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
2275                           16);
2276                   bfd_put_32 (output_bfd, tpoff (info, relocation),
2277                               contents + rel->r_offset + 8);
2278                   /* Skip R_X86_64_PLT32.  */
2279                   rel++;
2280                   continue;
2281                 }
2282               else
2283                 {
2284                   unsigned int val, type, reg;
2285
2286                   /* IE->LE transition:
2287                      Originally it can be one of:
2288                      movq foo@gottpoff(%rip), %reg
2289                      addq foo@gottpoff(%rip), %reg
2290                      We change it into:
2291                      movq $foo, %reg
2292                      leaq foo(%reg), %reg
2293                      addq $foo, %reg.  */
2294                   BFD_ASSERT (rel->r_offset >= 3);
2295                   val = bfd_get_8 (input_bfd, contents + rel->r_offset - 3);
2296                   BFD_ASSERT (val == 0x48 || val == 0x4c);
2297                   type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
2298                   BFD_ASSERT (type == 0x8b || type == 0x03);
2299                   reg = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
2300                   BFD_ASSERT ((reg & 0xc7) == 5);
2301                   reg >>= 3;
2302                   BFD_ASSERT (rel->r_offset + 4 <= input_section->_raw_size);
2303                   if (type == 0x8b)
2304                     {
2305                       /* movq */
2306                       if (val == 0x4c)
2307                         bfd_put_8 (output_bfd, 0x49,
2308                                    contents + rel->r_offset - 3);
2309                       bfd_put_8 (output_bfd, 0xc7,
2310                                  contents + rel->r_offset - 2);
2311                       bfd_put_8 (output_bfd, 0xc0 | reg,
2312                                  contents + rel->r_offset - 1);
2313                     }
2314                   else if (reg == 4)
2315                     {
2316                       /* addq -> addq - addressing with %rsp/%r12 is
2317                          special  */
2318                       if (val == 0x4c)
2319                         bfd_put_8 (output_bfd, 0x49,
2320                                    contents + rel->r_offset - 3);
2321                       bfd_put_8 (output_bfd, 0x81,
2322                                  contents + rel->r_offset - 2);
2323                       bfd_put_8 (output_bfd, 0xc0 | reg,
2324                                  contents + rel->r_offset - 1);
2325                     }
2326                   else
2327                     {
2328                       /* addq -> leaq */
2329                       if (val == 0x4c)
2330                         bfd_put_8 (output_bfd, 0x4d,
2331                                    contents + rel->r_offset - 3);
2332                       bfd_put_8 (output_bfd, 0x8d,
2333                                  contents + rel->r_offset - 2);
2334                       bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
2335                                  contents + rel->r_offset - 1);
2336                     }
2337                   bfd_put_32 (output_bfd, tpoff (info, relocation),
2338                               contents + rel->r_offset);
2339                   continue;
2340                 }
2341             }
2342
2343           if (htab->sgot == NULL)
2344             abort ();
2345
2346           if (h != NULL)
2347             off = h->got.offset;
2348           else
2349             {
2350               if (local_got_offsets == NULL)
2351                 abort ();
2352
2353               off = local_got_offsets[r_symndx];
2354             }
2355
2356           if ((off & 1) != 0)
2357             off &= ~1;
2358           else
2359             {
2360               Elf_Internal_Rela outrel;
2361               bfd_byte *loc;
2362               int dr_type, indx;
2363
2364               if (htab->srelgot == NULL)
2365                 abort ();
2366
2367               outrel.r_offset = (htab->sgot->output_section->vma
2368                                  + htab->sgot->output_offset + off);
2369
2370               indx = h && h->dynindx != -1 ? h->dynindx : 0;
2371               if (r_type == R_X86_64_TLSGD)
2372                 dr_type = R_X86_64_DTPMOD64;
2373               else
2374                 dr_type = R_X86_64_TPOFF64;
2375
2376               bfd_put_64 (output_bfd, 0, htab->sgot->contents + off);
2377               outrel.r_addend = 0;
2378               if (dr_type == R_X86_64_TPOFF64 && indx == 0)
2379                 outrel.r_addend = relocation - dtpoff_base (info);
2380               outrel.r_info = ELF64_R_INFO (indx, dr_type);
2381
2382               loc = htab->srelgot->contents;
2383               loc += htab->srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
2384               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2385
2386               if (r_type == R_X86_64_TLSGD)
2387                 {
2388                   if (indx == 0)
2389                     {
2390                       BFD_ASSERT (! unresolved_reloc);
2391                       bfd_put_64 (output_bfd,
2392                                   relocation - dtpoff_base (info),
2393                                   htab->sgot->contents + off + GOT_ENTRY_SIZE);
2394                     }
2395                   else
2396                     {
2397                       bfd_put_64 (output_bfd, 0,
2398                                   htab->sgot->contents + off + GOT_ENTRY_SIZE);
2399                       outrel.r_info = ELF64_R_INFO (indx,
2400                                                     R_X86_64_DTPOFF64);
2401                       outrel.r_offset += GOT_ENTRY_SIZE;
2402                       htab->srelgot->reloc_count++;
2403                       loc += sizeof (Elf64_External_Rela);
2404                       bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2405                     }
2406                 }
2407
2408               if (h != NULL)
2409                 h->got.offset |= 1;
2410               else
2411                 local_got_offsets[r_symndx] |= 1;
2412             }
2413
2414           if (off >= (bfd_vma) -2)
2415             abort ();
2416           if (r_type == ELF64_R_TYPE (rel->r_info))
2417             {
2418               relocation = htab->sgot->output_section->vma
2419                            + htab->sgot->output_offset + off;
2420               unresolved_reloc = FALSE;
2421             }
2422           else
2423             {
2424               unsigned int i;
2425               static unsigned char tlsgd[8]
2426                 = { 0x66, 0x48, 0x8d, 0x3d, 0x66, 0x66, 0x48, 0xe8 };
2427
2428               /* GD->IE transition.
2429                  .byte 0x66; leaq foo@tlsgd(%rip), %rdi
2430                  .word 0x6666; rex64; call __tls_get_addr@plt
2431                  Change it into:
2432                  movq %fs:0, %rax
2433                  addq foo@gottpoff(%rip), %rax */
2434               BFD_ASSERT (rel->r_offset >= 4);
2435               for (i = 0; i < 4; i++)
2436                 BFD_ASSERT (bfd_get_8 (input_bfd,
2437                                        contents + rel->r_offset - 4 + i)
2438                             == tlsgd[i]);
2439               BFD_ASSERT (rel->r_offset + 12 <= input_section->_raw_size);
2440               for (i = 0; i < 4; i++)
2441                 BFD_ASSERT (bfd_get_8 (input_bfd,
2442                                        contents + rel->r_offset + 4 + i)
2443                             == tlsgd[i+4]);
2444               BFD_ASSERT (rel + 1 < relend);
2445               BFD_ASSERT (ELF64_R_TYPE (rel[1].r_info) == R_X86_64_PLT32);
2446               memcpy (contents + rel->r_offset - 4,
2447                       "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
2448                       16);
2449
2450               relocation = (htab->sgot->output_section->vma
2451                             + htab->sgot->output_offset + off
2452                             - rel->r_offset
2453                             - input_section->output_section->vma
2454                             - input_section->output_offset
2455                             - 12);
2456               bfd_put_32 (output_bfd, relocation,
2457                           contents + rel->r_offset + 8);
2458               /* Skip R_X86_64_PLT32.  */
2459               rel++;
2460               continue;
2461             }
2462           break;
2463
2464         case R_X86_64_TLSLD:
2465           if (! info->shared)
2466             {
2467               /* LD->LE transition:
2468                  Ensure it is:
2469                  leaq foo@tlsld(%rip), %rdi; call __tls_get_addr@plt.
2470                  We change it into:
2471                  .word 0x6666; .byte 0x66; movl %fs:0, %rax.  */
2472               BFD_ASSERT (rel->r_offset >= 3);
2473               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 3)
2474                           == 0x48);
2475               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 2)
2476                           == 0x8d);
2477               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 1)
2478                           == 0x3d);
2479               BFD_ASSERT (rel->r_offset + 9 <= input_section->_raw_size);
2480               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4)
2481                           == 0xe8);
2482               BFD_ASSERT (rel + 1 < relend);
2483               BFD_ASSERT (ELF64_R_TYPE (rel[1].r_info) == R_X86_64_PLT32);
2484               memcpy (contents + rel->r_offset - 3,
2485                       "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
2486               /* Skip R_X86_64_PLT32.  */
2487               rel++;
2488               continue;
2489             }
2490
2491           if (htab->sgot == NULL)
2492             abort ();
2493
2494           off = htab->tls_ld_got.offset;
2495           if (off & 1)
2496             off &= ~1;
2497           else
2498             {
2499               Elf_Internal_Rela outrel;
2500               bfd_byte *loc;
2501
2502               if (htab->srelgot == NULL)
2503                 abort ();
2504
2505               outrel.r_offset = (htab->sgot->output_section->vma
2506                                  + htab->sgot->output_offset + off);
2507
2508               bfd_put_64 (output_bfd, 0,
2509                           htab->sgot->contents + off);
2510               bfd_put_64 (output_bfd, 0,
2511                           htab->sgot->contents + off + GOT_ENTRY_SIZE);
2512               outrel.r_info = ELF64_R_INFO (0, R_X86_64_DTPMOD64);
2513               outrel.r_addend = 0;
2514               loc = htab->srelgot->contents;
2515               loc += htab->srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
2516               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2517               htab->tls_ld_got.offset |= 1;
2518             }
2519           relocation = htab->sgot->output_section->vma
2520                        + htab->sgot->output_offset + off;
2521           unresolved_reloc = FALSE;
2522           break;
2523
2524         case R_X86_64_DTPOFF32:
2525           if (info->shared || (input_section->flags & SEC_CODE) == 0)
2526             relocation -= dtpoff_base (info);
2527           else
2528             relocation = tpoff (info, relocation);
2529           break;
2530
2531         case R_X86_64_TPOFF32:
2532           BFD_ASSERT (! info->shared);
2533           relocation = tpoff (info, relocation);
2534           break;
2535
2536         default:
2537           break;
2538         }
2539
2540       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2541          because such sections are not SEC_ALLOC and thus ld.so will
2542          not process them.  */
2543       if (unresolved_reloc
2544           && !((input_section->flags & SEC_DEBUGGING) != 0
2545                && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
2546         (*_bfd_error_handler)
2547           (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
2548            bfd_archive_filename (input_bfd),
2549            bfd_get_section_name (input_bfd, input_section),
2550            (long) rel->r_offset,
2551            h->root.root.string);
2552
2553       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2554                                     contents, rel->r_offset,
2555                                     relocation, rel->r_addend);
2556
2557       if (r != bfd_reloc_ok)
2558         {
2559           const char *name;
2560
2561           if (h != NULL)
2562             name = h->root.root.string;
2563           else
2564             {
2565               name = bfd_elf_string_from_elf_section (input_bfd,
2566                                                       symtab_hdr->sh_link,
2567                                                       sym->st_name);
2568               if (name == NULL)
2569                 return FALSE;
2570               if (*name == '\0')
2571                 name = bfd_section_name (input_bfd, sec);
2572             }
2573
2574           if (r == bfd_reloc_overflow)
2575             {
2576
2577               if (! ((*info->callbacks->reloc_overflow)
2578                      (info, name, howto->name, (bfd_vma) 0,
2579                       input_bfd, input_section, rel->r_offset)))
2580                 return FALSE;
2581             }
2582           else
2583             {
2584               (*_bfd_error_handler)
2585                 (_("%s(%s+0x%lx): reloc against `%s': error %d"),
2586                  bfd_archive_filename (input_bfd),
2587                  bfd_get_section_name (input_bfd, input_section),
2588                  (long) rel->r_offset, name, (int) r);
2589               return FALSE;
2590             }
2591         }
2592     }
2593
2594   return TRUE;
2595 }
2596
2597 /* Finish up dynamic symbol handling.  We set the contents of various
2598    dynamic sections here.  */
2599
2600 static bfd_boolean
2601 elf64_x86_64_finish_dynamic_symbol (output_bfd, info, h, sym)
2602      bfd *output_bfd;
2603      struct bfd_link_info *info;
2604      struct elf_link_hash_entry *h;
2605      Elf_Internal_Sym *sym;
2606 {
2607   struct elf64_x86_64_link_hash_table *htab;
2608
2609   htab = elf64_x86_64_hash_table (info);
2610
2611   if (h->plt.offset != (bfd_vma) -1)
2612     {
2613       bfd_vma plt_index;
2614       bfd_vma got_offset;
2615       Elf_Internal_Rela rela;
2616       bfd_byte *loc;
2617
2618       /* This symbol has an entry in the procedure linkage table.  Set
2619          it up.  */
2620       if (h->dynindx == -1
2621           || htab->splt == NULL
2622           || htab->sgotplt == NULL
2623           || htab->srelplt == NULL)
2624         abort ();
2625
2626       /* Get the index in the procedure linkage table which
2627          corresponds to this symbol.  This is the index of this symbol
2628          in all the symbols for which we are making plt entries.  The
2629          first entry in the procedure linkage table is reserved.  */
2630       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
2631
2632       /* Get the offset into the .got table of the entry that
2633          corresponds to this function.  Each .got entry is GOT_ENTRY_SIZE
2634          bytes. The first three are reserved for the dynamic linker.  */
2635       got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
2636
2637       /* Fill in the entry in the procedure linkage table.  */
2638       memcpy (htab->splt->contents + h->plt.offset, elf64_x86_64_plt_entry,
2639               PLT_ENTRY_SIZE);
2640
2641       /* Insert the relocation positions of the plt section.  The magic
2642          numbers at the end of the statements are the positions of the
2643          relocations in the plt section.  */
2644       /* Put offset for jmp *name@GOTPCREL(%rip), since the
2645          instruction uses 6 bytes, subtract this value.  */
2646       bfd_put_32 (output_bfd,
2647                       (htab->sgotplt->output_section->vma
2648                        + htab->sgotplt->output_offset
2649                        + got_offset
2650                        - htab->splt->output_section->vma
2651                        - htab->splt->output_offset
2652                        - h->plt.offset
2653                        - 6),
2654                   htab->splt->contents + h->plt.offset + 2);
2655       /* Put relocation index.  */
2656       bfd_put_32 (output_bfd, plt_index,
2657                   htab->splt->contents + h->plt.offset + 7);
2658       /* Put offset for jmp .PLT0.  */
2659       bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
2660                   htab->splt->contents + h->plt.offset + 12);
2661
2662       /* Fill in the entry in the global offset table, initially this
2663          points to the pushq instruction in the PLT which is at offset 6.  */
2664       bfd_put_64 (output_bfd, (htab->splt->output_section->vma
2665                                + htab->splt->output_offset
2666                                + h->plt.offset + 6),
2667                   htab->sgotplt->contents + got_offset);
2668
2669       /* Fill in the entry in the .rela.plt section.  */
2670       rela.r_offset = (htab->sgotplt->output_section->vma
2671                        + htab->sgotplt->output_offset
2672                        + got_offset);
2673       rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_JUMP_SLOT);
2674       rela.r_addend = 0;
2675       loc = htab->srelplt->contents + plt_index * sizeof (Elf64_External_Rela);
2676       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2677
2678       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2679         {
2680           /* Mark the symbol as undefined, rather than as defined in
2681              the .plt section.  Leave the value alone.  This is a clue
2682              for the dynamic linker, to make function pointer
2683              comparisons work between an application and shared
2684              library.  */
2685           sym->st_shndx = SHN_UNDEF;
2686         }
2687     }
2688
2689   if (h->got.offset != (bfd_vma) -1
2690       && elf64_x86_64_hash_entry (h)->tls_type != GOT_TLS_GD
2691       && elf64_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE)
2692     {
2693       Elf_Internal_Rela rela;
2694       bfd_byte *loc;
2695
2696       /* This symbol has an entry in the global offset table.  Set it
2697          up.  */
2698       if (htab->sgot == NULL || htab->srelgot == NULL)
2699         abort ();
2700
2701       rela.r_offset = (htab->sgot->output_section->vma
2702                        + htab->sgot->output_offset
2703                        + (h->got.offset &~ (bfd_vma) 1));
2704
2705       /* If this is a static link, or it is a -Bsymbolic link and the
2706          symbol is defined locally or was forced to be local because
2707          of a version file, we just want to emit a RELATIVE reloc.
2708          The entry in the global offset table will already have been
2709          initialized in the relocate_section function.  */
2710       if (info->shared
2711           && (info->symbolic
2712               || h->dynindx == -1
2713               || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2714           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
2715         {
2716           BFD_ASSERT((h->got.offset & 1) != 0);
2717           rela.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
2718           rela.r_addend = (h->root.u.def.value
2719                            + h->root.u.def.section->output_section->vma
2720                            + h->root.u.def.section->output_offset);
2721         }
2722       else
2723         {
2724           BFD_ASSERT((h->got.offset & 1) == 0);
2725           bfd_put_64 (output_bfd, (bfd_vma) 0,
2726                       htab->sgot->contents + h->got.offset);
2727           rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_GLOB_DAT);
2728           rela.r_addend = 0;
2729         }
2730
2731       loc = htab->srelgot->contents;
2732       loc += htab->srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
2733       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2734     }
2735
2736   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
2737     {
2738       Elf_Internal_Rela rela;
2739       bfd_byte *loc;
2740
2741       /* This symbol needs a copy reloc.  Set it up.  */
2742
2743       if (h->dynindx == -1
2744           || (h->root.type != bfd_link_hash_defined
2745               && h->root.type != bfd_link_hash_defweak)
2746           || htab->srelbss == NULL)
2747         abort ();
2748
2749       rela.r_offset = (h->root.u.def.value
2750                        + h->root.u.def.section->output_section->vma
2751                        + h->root.u.def.section->output_offset);
2752       rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_COPY);
2753       rela.r_addend = 0;
2754       loc = htab->srelbss->contents;
2755       loc += htab->srelbss->reloc_count++ * sizeof (Elf64_External_Rela);
2756       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2757     }
2758
2759   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
2760   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2761       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2762     sym->st_shndx = SHN_ABS;
2763
2764   return TRUE;
2765 }
2766
2767 /* Used to decide how to sort relocs in an optimal manner for the
2768    dynamic linker, before writing them out.  */
2769
2770 static enum elf_reloc_type_class
2771 elf64_x86_64_reloc_type_class (rela)
2772      const Elf_Internal_Rela *rela;
2773 {
2774   switch ((int) ELF64_R_TYPE (rela->r_info))
2775     {
2776     case R_X86_64_RELATIVE:
2777       return reloc_class_relative;
2778     case R_X86_64_JUMP_SLOT:
2779       return reloc_class_plt;
2780     case R_X86_64_COPY:
2781       return reloc_class_copy;
2782     default:
2783       return reloc_class_normal;
2784     }
2785 }
2786
2787 /* Finish up the dynamic sections.  */
2788
2789 static bfd_boolean
2790 elf64_x86_64_finish_dynamic_sections (output_bfd, info)
2791      bfd *output_bfd;
2792      struct bfd_link_info *info;
2793 {
2794   struct elf64_x86_64_link_hash_table *htab;
2795   bfd *dynobj;
2796   asection *sdyn;
2797
2798   htab = elf64_x86_64_hash_table (info);
2799   dynobj = htab->elf.dynobj;
2800   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2801
2802   if (htab->elf.dynamic_sections_created)
2803     {
2804       Elf64_External_Dyn *dyncon, *dynconend;
2805
2806       if (sdyn == NULL || htab->sgot == NULL)
2807         abort ();
2808
2809       dyncon = (Elf64_External_Dyn *) sdyn->contents;
2810       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2811       for (; dyncon < dynconend; dyncon++)
2812         {
2813           Elf_Internal_Dyn dyn;
2814           asection *s;
2815
2816           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2817
2818           switch (dyn.d_tag)
2819             {
2820             default:
2821               continue;
2822
2823             case DT_PLTGOT:
2824               dyn.d_un.d_ptr = htab->sgot->output_section->vma;
2825               break;
2826
2827             case DT_JMPREL:
2828               dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
2829               break;
2830
2831             case DT_PLTRELSZ:
2832               s = htab->srelplt->output_section;
2833               if (s->_cooked_size != 0)
2834                 dyn.d_un.d_val = s->_cooked_size;
2835               else
2836                 dyn.d_un.d_val = s->_raw_size;
2837               break;
2838
2839             case DT_RELASZ:
2840               /* The procedure linkage table relocs (DT_JMPREL) should
2841                  not be included in the overall relocs (DT_RELA).
2842                  Therefore, we override the DT_RELASZ entry here to
2843                  make it not include the JMPREL relocs.  Since the
2844                  linker script arranges for .rela.plt to follow all
2845                  other relocation sections, we don't have to worry
2846                  about changing the DT_RELA entry.  */
2847               if (htab->srelplt != NULL)
2848                 {
2849                   s = htab->srelplt->output_section;
2850                   if (s->_cooked_size != 0)
2851                     dyn.d_un.d_val -= s->_cooked_size;
2852                   else
2853                     dyn.d_un.d_val -= s->_raw_size;
2854                 }
2855               break;
2856             }
2857
2858           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2859         }
2860
2861       /* Fill in the special first entry in the procedure linkage table.  */
2862       if (htab->splt && htab->splt->_raw_size > 0)
2863         {
2864           /* Fill in the first entry in the procedure linkage table.  */
2865           memcpy (htab->splt->contents, elf64_x86_64_plt0_entry,
2866                   PLT_ENTRY_SIZE);
2867           /* Add offset for pushq GOT+8(%rip), since the instruction
2868              uses 6 bytes subtract this value.  */
2869           bfd_put_32 (output_bfd,
2870                       (htab->sgotplt->output_section->vma
2871                        + htab->sgotplt->output_offset
2872                        + 8
2873                        - htab->splt->output_section->vma
2874                        - htab->splt->output_offset
2875                        - 6),
2876                       htab->splt->contents + 2);
2877           /* Add offset for jmp *GOT+16(%rip). The 12 is the offset to
2878              the end of the instruction.  */
2879           bfd_put_32 (output_bfd,
2880                       (htab->sgotplt->output_section->vma
2881                        + htab->sgotplt->output_offset
2882                        + 16
2883                        - htab->splt->output_section->vma
2884                        - htab->splt->output_offset
2885                        - 12),
2886                       htab->splt->contents + 8);
2887
2888           elf_section_data (htab->splt->output_section)->this_hdr.sh_entsize =
2889             PLT_ENTRY_SIZE;
2890         }
2891     }
2892
2893   if (htab->sgotplt)
2894     {
2895       /* Fill in the first three entries in the global offset table.  */
2896       if (htab->sgotplt->_raw_size > 0)
2897         {
2898           /* Set the first entry in the global offset table to the address of
2899              the dynamic section.  */
2900           if (sdyn == NULL)
2901             bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents);
2902           else
2903             bfd_put_64 (output_bfd,
2904                         sdyn->output_section->vma + sdyn->output_offset,
2905                         htab->sgotplt->contents);
2906           /* Write GOT[1] and GOT[2], needed for the dynamic linker.  */
2907           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + GOT_ENTRY_SIZE);
2908           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + GOT_ENTRY_SIZE*2);
2909         }
2910
2911       elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize =
2912         GOT_ENTRY_SIZE;
2913     }
2914
2915   return TRUE;
2916 }
2917
2918
2919 #define TARGET_LITTLE_SYM                   bfd_elf64_x86_64_vec
2920 #define TARGET_LITTLE_NAME                  "elf64-x86-64"
2921 #define ELF_ARCH                            bfd_arch_i386
2922 #define ELF_MACHINE_CODE                    EM_X86_64
2923 #define ELF_MAXPAGESIZE                     0x100000
2924
2925 #define elf_backend_can_gc_sections         1
2926 #define elf_backend_can_refcount            1
2927 #define elf_backend_want_got_plt            1
2928 #define elf_backend_plt_readonly            1
2929 #define elf_backend_want_plt_sym            0
2930 #define elf_backend_got_header_size         (GOT_ENTRY_SIZE*3)
2931 #define elf_backend_plt_header_size         PLT_ENTRY_SIZE
2932 #define elf_backend_rela_normal             1
2933
2934 #define elf_info_to_howto                   elf64_x86_64_info_to_howto
2935
2936 #define bfd_elf64_bfd_link_hash_table_create \
2937   elf64_x86_64_link_hash_table_create
2938 #define bfd_elf64_bfd_reloc_type_lookup     elf64_x86_64_reloc_type_lookup
2939
2940 #define elf_backend_adjust_dynamic_symbol   elf64_x86_64_adjust_dynamic_symbol
2941 #define elf_backend_check_relocs            elf64_x86_64_check_relocs
2942 #define elf_backend_copy_indirect_symbol    elf64_x86_64_copy_indirect_symbol
2943 #define elf_backend_create_dynamic_sections elf64_x86_64_create_dynamic_sections
2944 #define elf_backend_finish_dynamic_sections elf64_x86_64_finish_dynamic_sections
2945 #define elf_backend_finish_dynamic_symbol   elf64_x86_64_finish_dynamic_symbol
2946 #define elf_backend_gc_mark_hook            elf64_x86_64_gc_mark_hook
2947 #define elf_backend_gc_sweep_hook           elf64_x86_64_gc_sweep_hook
2948 #define elf_backend_grok_prstatus           elf64_x86_64_grok_prstatus
2949 #define elf_backend_grok_psinfo             elf64_x86_64_grok_psinfo
2950 #define elf_backend_reloc_type_class        elf64_x86_64_reloc_type_class
2951 #define elf_backend_relocate_section        elf64_x86_64_relocate_section
2952 #define elf_backend_size_dynamic_sections   elf64_x86_64_size_dynamic_sections
2953 #define elf_backend_object_p                elf64_x86_64_elf_object_p
2954 #define bfd_elf64_mkobject                  elf64_x86_64_mkobject
2955
2956 #include "elf64-target.h"