bfd/
[external/binutils.git] / bfd / elf64-x86-64.c
1 /* X86-64 specific support for 64-bit ELF
2    Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006
3    Free Software Foundation, Inc.
4    Contributed by Jan Hubicka <jh@suse.cz>.
5
6    This file is part of BFD, the Binary File Descriptor library.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27
28 #include "elf/x86-64.h"
29
30 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value.  */
31 #define MINUS_ONE (~ (bfd_vma) 0)
32
33 /* The relocation "howto" table.  Order of fields:
34    type, rightshift, size, bitsize, pc_relative, bitpos, complain_on_overflow,
35    special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset.  */
36 static reloc_howto_type x86_64_elf_howto_table[] =
37 {
38   HOWTO(R_X86_64_NONE, 0, 0, 0, FALSE, 0, complain_overflow_dont,
39         bfd_elf_generic_reloc, "R_X86_64_NONE", FALSE, 0x00000000, 0x00000000,
40         FALSE),
41   HOWTO(R_X86_64_64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
42         bfd_elf_generic_reloc, "R_X86_64_64", FALSE, MINUS_ONE, MINUS_ONE,
43         FALSE),
44   HOWTO(R_X86_64_PC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
45         bfd_elf_generic_reloc, "R_X86_64_PC32", FALSE, 0xffffffff, 0xffffffff,
46         TRUE),
47   HOWTO(R_X86_64_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
48         bfd_elf_generic_reloc, "R_X86_64_GOT32", FALSE, 0xffffffff, 0xffffffff,
49         FALSE),
50   HOWTO(R_X86_64_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
51         bfd_elf_generic_reloc, "R_X86_64_PLT32", FALSE, 0xffffffff, 0xffffffff,
52         TRUE),
53   HOWTO(R_X86_64_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
54         bfd_elf_generic_reloc, "R_X86_64_COPY", FALSE, 0xffffffff, 0xffffffff,
55         FALSE),
56   HOWTO(R_X86_64_GLOB_DAT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
57         bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", FALSE, MINUS_ONE,
58         MINUS_ONE, FALSE),
59   HOWTO(R_X86_64_JUMP_SLOT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
60         bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", FALSE, MINUS_ONE,
61         MINUS_ONE, FALSE),
62   HOWTO(R_X86_64_RELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
63         bfd_elf_generic_reloc, "R_X86_64_RELATIVE", FALSE, MINUS_ONE,
64         MINUS_ONE, FALSE),
65   HOWTO(R_X86_64_GOTPCREL, 0, 2, 32, TRUE, 0, complain_overflow_signed,
66         bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", FALSE, 0xffffffff,
67         0xffffffff, TRUE),
68   HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
69         bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
70         FALSE),
71   HOWTO(R_X86_64_32S, 0, 2, 32, FALSE, 0, complain_overflow_signed,
72         bfd_elf_generic_reloc, "R_X86_64_32S", FALSE, 0xffffffff, 0xffffffff,
73         FALSE),
74   HOWTO(R_X86_64_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
75         bfd_elf_generic_reloc, "R_X86_64_16", FALSE, 0xffff, 0xffff, FALSE),
76   HOWTO(R_X86_64_PC16,0, 1, 16, TRUE, 0, complain_overflow_bitfield,
77         bfd_elf_generic_reloc, "R_X86_64_PC16", FALSE, 0xffff, 0xffff, TRUE),
78   HOWTO(R_X86_64_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
79         bfd_elf_generic_reloc, "R_X86_64_8", FALSE, 0xff, 0xff, FALSE),
80   HOWTO(R_X86_64_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
81         bfd_elf_generic_reloc, "R_X86_64_PC8", FALSE, 0xff, 0xff, TRUE),
82   HOWTO(R_X86_64_DTPMOD64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
83         bfd_elf_generic_reloc, "R_X86_64_DTPMOD64", FALSE, MINUS_ONE,
84         MINUS_ONE, FALSE),
85   HOWTO(R_X86_64_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
86         bfd_elf_generic_reloc, "R_X86_64_DTPOFF64", FALSE, MINUS_ONE,
87         MINUS_ONE, FALSE),
88   HOWTO(R_X86_64_TPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
89         bfd_elf_generic_reloc, "R_X86_64_TPOFF64", FALSE, MINUS_ONE,
90         MINUS_ONE, FALSE),
91   HOWTO(R_X86_64_TLSGD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
92         bfd_elf_generic_reloc, "R_X86_64_TLSGD", FALSE, 0xffffffff,
93         0xffffffff, TRUE),
94   HOWTO(R_X86_64_TLSLD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
95         bfd_elf_generic_reloc, "R_X86_64_TLSLD", FALSE, 0xffffffff,
96         0xffffffff, TRUE),
97   HOWTO(R_X86_64_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
98         bfd_elf_generic_reloc, "R_X86_64_DTPOFF32", FALSE, 0xffffffff,
99         0xffffffff, FALSE),
100   HOWTO(R_X86_64_GOTTPOFF, 0, 2, 32, TRUE, 0, complain_overflow_signed,
101         bfd_elf_generic_reloc, "R_X86_64_GOTTPOFF", FALSE, 0xffffffff,
102         0xffffffff, TRUE),
103   HOWTO(R_X86_64_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
104         bfd_elf_generic_reloc, "R_X86_64_TPOFF32", FALSE, 0xffffffff,
105         0xffffffff, FALSE),
106   HOWTO(R_X86_64_PC64, 0, 4, 64, TRUE, 0, complain_overflow_bitfield,
107         bfd_elf_generic_reloc, "R_X86_64_PC64", FALSE, MINUS_ONE, MINUS_ONE,
108         TRUE),
109   HOWTO(R_X86_64_GOTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
110         bfd_elf_generic_reloc, "R_X86_64_GOTOFF64",
111         FALSE, MINUS_ONE, MINUS_ONE, FALSE),
112   HOWTO(R_X86_64_GOTPC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
113         bfd_elf_generic_reloc, "R_X86_64_GOTPC32",
114         FALSE, 0xffffffff, 0xffffffff, TRUE),
115   HOWTO(R_X86_64_GOT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
116         bfd_elf_generic_reloc, "R_X86_64_GOT64", FALSE, MINUS_ONE, MINUS_ONE,
117         FALSE),
118   HOWTO(R_X86_64_GOTPCREL64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
119         bfd_elf_generic_reloc, "R_X86_64_GOTPCREL64", FALSE, MINUS_ONE,
120         MINUS_ONE, TRUE),
121   HOWTO(R_X86_64_GOTPC64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
122         bfd_elf_generic_reloc, "R_X86_64_GOTPC64",
123         FALSE, MINUS_ONE, MINUS_ONE, TRUE),
124   HOWTO(R_X86_64_GOTPLT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
125         bfd_elf_generic_reloc, "R_X86_64_GOTPLT64", FALSE, MINUS_ONE,
126         MINUS_ONE, FALSE),
127   HOWTO(R_X86_64_PLTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
128         bfd_elf_generic_reloc, "R_X86_64_PLTOFF64", FALSE, MINUS_ONE,
129         MINUS_ONE, FALSE),
130   EMPTY_HOWTO (32),
131   EMPTY_HOWTO (33),
132   HOWTO(R_X86_64_GOTPC32_TLSDESC, 0, 2, 32, TRUE, 0,
133         complain_overflow_bitfield, bfd_elf_generic_reloc,
134         "R_X86_64_GOTPC32_TLSDESC",
135         FALSE, 0xffffffff, 0xffffffff, TRUE),
136   HOWTO(R_X86_64_TLSDESC_CALL, 0, 0, 0, FALSE, 0,
137         complain_overflow_dont, bfd_elf_generic_reloc,
138         "R_X86_64_TLSDESC_CALL",
139         FALSE, 0, 0, FALSE),
140   HOWTO(R_X86_64_TLSDESC, 0, 4, 64, FALSE, 0,
141         complain_overflow_bitfield, bfd_elf_generic_reloc,
142         "R_X86_64_TLSDESC",
143         FALSE, MINUS_ONE, MINUS_ONE, FALSE),
144
145   /* We have a gap in the reloc numbers here.
146      R_X86_64_standard counts the number up to this point, and
147      R_X86_64_vt_offset is the value to subtract from a reloc type of
148      R_X86_64_GNU_VT* to form an index into this table.  */
149 #define R_X86_64_standard (R_X86_64_TLSDESC + 1)
150 #define R_X86_64_vt_offset (R_X86_64_GNU_VTINHERIT - R_X86_64_standard)
151
152 /* GNU extension to record C++ vtable hierarchy.  */
153   HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, FALSE, 0, complain_overflow_dont,
154          NULL, "R_X86_64_GNU_VTINHERIT", FALSE, 0, 0, FALSE),
155
156 /* GNU extension to record C++ vtable member usage.  */
157   HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, FALSE, 0, complain_overflow_dont,
158          _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", FALSE, 0, 0,
159          FALSE)
160 };
161
162 /* Map BFD relocs to the x86_64 elf relocs.  */
163 struct elf_reloc_map
164 {
165   bfd_reloc_code_real_type bfd_reloc_val;
166   unsigned char elf_reloc_val;
167 };
168
169 static const struct elf_reloc_map x86_64_reloc_map[] =
170 {
171   { BFD_RELOC_NONE,             R_X86_64_NONE, },
172   { BFD_RELOC_64,               R_X86_64_64,   },
173   { BFD_RELOC_32_PCREL,         R_X86_64_PC32, },
174   { BFD_RELOC_X86_64_GOT32,     R_X86_64_GOT32,},
175   { BFD_RELOC_X86_64_PLT32,     R_X86_64_PLT32,},
176   { BFD_RELOC_X86_64_COPY,      R_X86_64_COPY, },
177   { BFD_RELOC_X86_64_GLOB_DAT,  R_X86_64_GLOB_DAT, },
178   { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, },
179   { BFD_RELOC_X86_64_RELATIVE,  R_X86_64_RELATIVE, },
180   { BFD_RELOC_X86_64_GOTPCREL,  R_X86_64_GOTPCREL, },
181   { BFD_RELOC_32,               R_X86_64_32, },
182   { BFD_RELOC_X86_64_32S,       R_X86_64_32S, },
183   { BFD_RELOC_16,               R_X86_64_16, },
184   { BFD_RELOC_16_PCREL,         R_X86_64_PC16, },
185   { BFD_RELOC_8,                R_X86_64_8, },
186   { BFD_RELOC_8_PCREL,          R_X86_64_PC8, },
187   { BFD_RELOC_X86_64_DTPMOD64,  R_X86_64_DTPMOD64, },
188   { BFD_RELOC_X86_64_DTPOFF64,  R_X86_64_DTPOFF64, },
189   { BFD_RELOC_X86_64_TPOFF64,   R_X86_64_TPOFF64, },
190   { BFD_RELOC_X86_64_TLSGD,     R_X86_64_TLSGD, },
191   { BFD_RELOC_X86_64_TLSLD,     R_X86_64_TLSLD, },
192   { BFD_RELOC_X86_64_DTPOFF32,  R_X86_64_DTPOFF32, },
193   { BFD_RELOC_X86_64_GOTTPOFF,  R_X86_64_GOTTPOFF, },
194   { BFD_RELOC_X86_64_TPOFF32,   R_X86_64_TPOFF32, },
195   { BFD_RELOC_64_PCREL,         R_X86_64_PC64, },
196   { BFD_RELOC_X86_64_GOTOFF64,  R_X86_64_GOTOFF64, },
197   { BFD_RELOC_X86_64_GOTPC32,   R_X86_64_GOTPC32, },
198   { BFD_RELOC_X86_64_GOT64,     R_X86_64_GOT64, },
199   { BFD_RELOC_X86_64_GOTPCREL64,R_X86_64_GOTPCREL64, },
200   { BFD_RELOC_X86_64_GOTPC64,   R_X86_64_GOTPC64, },
201   { BFD_RELOC_X86_64_GOTPLT64,  R_X86_64_GOTPLT64, },
202   { BFD_RELOC_X86_64_PLTOFF64,  R_X86_64_PLTOFF64, },
203   { BFD_RELOC_X86_64_GOTPC32_TLSDESC, R_X86_64_GOTPC32_TLSDESC, },
204   { BFD_RELOC_X86_64_TLSDESC_CALL, R_X86_64_TLSDESC_CALL, },
205   { BFD_RELOC_X86_64_TLSDESC,   R_X86_64_TLSDESC, },
206   { BFD_RELOC_VTABLE_INHERIT,   R_X86_64_GNU_VTINHERIT, },
207   { BFD_RELOC_VTABLE_ENTRY,     R_X86_64_GNU_VTENTRY, },
208 };
209
210 static reloc_howto_type *
211 elf64_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type)
212 {
213   unsigned i;
214
215   if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT
216       || r_type >= (unsigned int) R_X86_64_max)
217     {
218       if (r_type >= (unsigned int) R_X86_64_standard)
219         {
220           (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
221                                  abfd, (int) r_type);
222           r_type = R_X86_64_NONE;
223         }
224       i = r_type;
225     }
226   else
227     i = r_type - (unsigned int) R_X86_64_vt_offset;
228   BFD_ASSERT (x86_64_elf_howto_table[i].type == r_type);
229   return &x86_64_elf_howto_table[i];
230 }
231
232 /* Given a BFD reloc type, return a HOWTO structure.  */
233 static reloc_howto_type *
234 elf64_x86_64_reloc_type_lookup (bfd *abfd,
235                                 bfd_reloc_code_real_type code)
236 {
237   unsigned int i;
238
239   for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
240        i++)
241     {
242       if (x86_64_reloc_map[i].bfd_reloc_val == code)
243         return elf64_x86_64_rtype_to_howto (abfd,
244                                             x86_64_reloc_map[i].elf_reloc_val);
245     }
246   return 0;
247 }
248
249 /* Given an x86_64 ELF reloc type, fill in an arelent structure.  */
250
251 static void
252 elf64_x86_64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
253                             Elf_Internal_Rela *dst)
254 {
255   unsigned r_type;
256
257   r_type = ELF64_R_TYPE (dst->r_info);
258   cache_ptr->howto = elf64_x86_64_rtype_to_howto (abfd, r_type);
259   BFD_ASSERT (r_type == cache_ptr->howto->type);
260 }
261 \f
262 /* Support for core dump NOTE sections.  */
263 static bfd_boolean
264 elf64_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
265 {
266   int offset;
267   size_t size;
268
269   switch (note->descsz)
270     {
271       default:
272         return FALSE;
273
274       case 336:         /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
275         /* pr_cursig */
276         elf_tdata (abfd)->core_signal
277           = bfd_get_16 (abfd, note->descdata + 12);
278
279         /* pr_pid */
280         elf_tdata (abfd)->core_pid
281           = bfd_get_32 (abfd, note->descdata + 32);
282
283         /* pr_reg */
284         offset = 112;
285         size = 216;
286
287         break;
288     }
289
290   /* Make a ".reg/999" section.  */
291   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
292                                           size, note->descpos + offset);
293 }
294
295 static bfd_boolean
296 elf64_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
297 {
298   switch (note->descsz)
299     {
300       default:
301         return FALSE;
302
303       case 136:         /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
304         elf_tdata (abfd)->core_program
305          = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
306         elf_tdata (abfd)->core_command
307          = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
308     }
309
310   /* Note that for some reason, a spurious space is tacked
311      onto the end of the args in some (at least one anyway)
312      implementations, so strip it off if it exists.  */
313
314   {
315     char *command = elf_tdata (abfd)->core_command;
316     int n = strlen (command);
317
318     if (0 < n && command[n - 1] == ' ')
319       command[n - 1] = '\0';
320   }
321
322   return TRUE;
323 }
324 \f
325 /* Functions for the x86-64 ELF linker.  */
326
327 /* The name of the dynamic interpreter.  This is put in the .interp
328    section.  */
329
330 #define ELF_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
331
332 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
333    copying dynamic variables from a shared lib into an app's dynbss
334    section, and instead use a dynamic relocation to point into the
335    shared lib.  */
336 #define ELIMINATE_COPY_RELOCS 1
337
338 /* The size in bytes of an entry in the global offset table.  */
339
340 #define GOT_ENTRY_SIZE 8
341
342 /* The size in bytes of an entry in the procedure linkage table.  */
343
344 #define PLT_ENTRY_SIZE 16
345
346 /* The first entry in a procedure linkage table looks like this.  See the
347    SVR4 ABI i386 supplement and the x86-64 ABI to see how this works.  */
348
349 static const bfd_byte elf64_x86_64_plt0_entry[PLT_ENTRY_SIZE] =
350 {
351   0xff, 0x35, 8, 0, 0, 0,       /* pushq GOT+8(%rip)  */
352   0xff, 0x25, 16, 0, 0, 0,      /* jmpq *GOT+16(%rip) */
353   0x0f, 0x1f, 0x40, 0x00        /* nopl 0(%rax)       */
354 };
355
356 /* Subsequent entries in a procedure linkage table look like this.  */
357
358 static const bfd_byte elf64_x86_64_plt_entry[PLT_ENTRY_SIZE] =
359 {
360   0xff, 0x25,   /* jmpq *name@GOTPC(%rip) */
361   0, 0, 0, 0,   /* replaced with offset to this symbol in .got.  */
362   0x68,         /* pushq immediate */
363   0, 0, 0, 0,   /* replaced with index into relocation table.  */
364   0xe9,         /* jmp relative */
365   0, 0, 0, 0    /* replaced with offset to start of .plt0.  */
366 };
367
368 /* The x86-64 linker needs to keep track of the number of relocs that
369    it decides to copy as dynamic relocs in check_relocs for each symbol.
370    This is so that it can later discard them if they are found to be
371    unnecessary.  We store the information in a field extending the
372    regular ELF linker hash table.  */
373
374 struct elf64_x86_64_dyn_relocs
375 {
376   /* Next section.  */
377   struct elf64_x86_64_dyn_relocs *next;
378
379   /* The input section of the reloc.  */
380   asection *sec;
381
382   /* Total number of relocs copied for the input section.  */
383   bfd_size_type count;
384
385   /* Number of pc-relative relocs copied for the input section.  */
386   bfd_size_type pc_count;
387 };
388
389 /* x86-64 ELF linker hash entry.  */
390
391 struct elf64_x86_64_link_hash_entry
392 {
393   struct elf_link_hash_entry elf;
394
395   /* Track dynamic relocs copied for this symbol.  */
396   struct elf64_x86_64_dyn_relocs *dyn_relocs;
397
398 #define GOT_UNKNOWN     0
399 #define GOT_NORMAL      1
400 #define GOT_TLS_GD      2
401 #define GOT_TLS_IE      3
402 #define GOT_TLS_GDESC   4
403 #define GOT_TLS_GD_BOTH_P(type) \
404   ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
405 #define GOT_TLS_GD_P(type) \
406   ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
407 #define GOT_TLS_GDESC_P(type) \
408   ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
409 #define GOT_TLS_GD_ANY_P(type) \
410   (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
411   unsigned char tls_type;
412
413   /* Offset of the GOTPLT entry reserved for the TLS descriptor,
414      starting at the end of the jump table.  */
415   bfd_vma tlsdesc_got;
416 };
417
418 #define elf64_x86_64_hash_entry(ent) \
419   ((struct elf64_x86_64_link_hash_entry *)(ent))
420
421 struct elf64_x86_64_obj_tdata
422 {
423   struct elf_obj_tdata root;
424
425   /* tls_type for each local got entry.  */
426   char *local_got_tls_type;
427
428   /* GOTPLT entries for TLS descriptors.  */
429   bfd_vma *local_tlsdesc_gotent;
430 };
431
432 #define elf64_x86_64_tdata(abfd) \
433   ((struct elf64_x86_64_obj_tdata *) (abfd)->tdata.any)
434
435 #define elf64_x86_64_local_got_tls_type(abfd) \
436   (elf64_x86_64_tdata (abfd)->local_got_tls_type)
437
438 #define elf64_x86_64_local_tlsdesc_gotent(abfd) \
439   (elf64_x86_64_tdata (abfd)->local_tlsdesc_gotent)
440
441 /* x86-64 ELF linker hash table.  */
442
443 struct elf64_x86_64_link_hash_table
444 {
445   struct elf_link_hash_table elf;
446
447   /* Short-cuts to get to dynamic linker sections.  */
448   asection *sgot;
449   asection *sgotplt;
450   asection *srelgot;
451   asection *splt;
452   asection *srelplt;
453   asection *sdynbss;
454   asection *srelbss;
455
456   /* The offset into splt of the PLT entry for the TLS descriptor
457      resolver.  Special values are 0, if not necessary (or not found
458      to be necessary yet), and -1 if needed but not determined
459      yet.  */
460   bfd_vma tlsdesc_plt;
461   /* The offset into sgot of the GOT entry used by the PLT entry
462      above.  */
463   bfd_vma tlsdesc_got;
464
465   union {
466     bfd_signed_vma refcount;
467     bfd_vma offset;
468   } tls_ld_got;
469
470   /* The amount of space used by the jump slots in the GOT.  */
471   bfd_vma sgotplt_jump_table_size;
472
473   /* Small local sym to section mapping cache.  */
474   struct sym_sec_cache sym_sec;
475 };
476
477 /* Get the x86-64 ELF linker hash table from a link_info structure.  */
478
479 #define elf64_x86_64_hash_table(p) \
480   ((struct elf64_x86_64_link_hash_table *) ((p)->hash))
481
482 #define elf64_x86_64_compute_jump_table_size(htab) \
483   ((htab)->srelplt->reloc_count * GOT_ENTRY_SIZE)
484
485 /* Create an entry in an x86-64 ELF linker hash table.  */
486
487 static struct bfd_hash_entry *
488 link_hash_newfunc (struct bfd_hash_entry *entry, struct bfd_hash_table *table,
489                    const char *string)
490 {
491   /* Allocate the structure if it has not already been allocated by a
492      subclass.  */
493   if (entry == NULL)
494     {
495       entry = bfd_hash_allocate (table,
496                                  sizeof (struct elf64_x86_64_link_hash_entry));
497       if (entry == NULL)
498         return entry;
499     }
500
501   /* Call the allocation method of the superclass.  */
502   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
503   if (entry != NULL)
504     {
505       struct elf64_x86_64_link_hash_entry *eh;
506
507       eh = (struct elf64_x86_64_link_hash_entry *) entry;
508       eh->dyn_relocs = NULL;
509       eh->tls_type = GOT_UNKNOWN;
510       eh->tlsdesc_got = (bfd_vma) -1;
511     }
512
513   return entry;
514 }
515
516 /* Create an X86-64 ELF linker hash table.  */
517
518 static struct bfd_link_hash_table *
519 elf64_x86_64_link_hash_table_create (bfd *abfd)
520 {
521   struct elf64_x86_64_link_hash_table *ret;
522   bfd_size_type amt = sizeof (struct elf64_x86_64_link_hash_table);
523
524   ret = (struct elf64_x86_64_link_hash_table *) bfd_malloc (amt);
525   if (ret == NULL)
526     return NULL;
527
528   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
529                                       sizeof (struct elf64_x86_64_link_hash_entry)))
530     {
531       free (ret);
532       return NULL;
533     }
534
535   ret->sgot = NULL;
536   ret->sgotplt = NULL;
537   ret->srelgot = NULL;
538   ret->splt = NULL;
539   ret->srelplt = NULL;
540   ret->sdynbss = NULL;
541   ret->srelbss = NULL;
542   ret->sym_sec.abfd = NULL;
543   ret->tlsdesc_plt = 0;
544   ret->tlsdesc_got = 0;
545   ret->tls_ld_got.refcount = 0;
546   ret->sgotplt_jump_table_size = 0;
547
548   return &ret->elf.root;
549 }
550
551 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
552    shortcuts to them in our hash table.  */
553
554 static bfd_boolean
555 create_got_section (bfd *dynobj, struct bfd_link_info *info)
556 {
557   struct elf64_x86_64_link_hash_table *htab;
558
559   if (! _bfd_elf_create_got_section (dynobj, info))
560     return FALSE;
561
562   htab = elf64_x86_64_hash_table (info);
563   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
564   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
565   if (!htab->sgot || !htab->sgotplt)
566     abort ();
567
568   htab->srelgot = bfd_make_section_with_flags (dynobj, ".rela.got",
569                                                (SEC_ALLOC | SEC_LOAD
570                                                 | SEC_HAS_CONTENTS
571                                                 | SEC_IN_MEMORY
572                                                 | SEC_LINKER_CREATED
573                                                 | SEC_READONLY));
574   if (htab->srelgot == NULL
575       || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3))
576     return FALSE;
577   return TRUE;
578 }
579
580 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
581    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
582    hash table.  */
583
584 static bfd_boolean
585 elf64_x86_64_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
586 {
587   struct elf64_x86_64_link_hash_table *htab;
588
589   htab = elf64_x86_64_hash_table (info);
590   if (!htab->sgot && !create_got_section (dynobj, info))
591     return FALSE;
592
593   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
594     return FALSE;
595
596   htab->splt = bfd_get_section_by_name (dynobj, ".plt");
597   htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
598   htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
599   if (!info->shared)
600     htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
601
602   if (!htab->splt || !htab->srelplt || !htab->sdynbss
603       || (!info->shared && !htab->srelbss))
604     abort ();
605
606   return TRUE;
607 }
608
609 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
610
611 static void
612 elf64_x86_64_copy_indirect_symbol (struct bfd_link_info *info,
613                                    struct elf_link_hash_entry *dir,
614                                    struct elf_link_hash_entry *ind)
615 {
616   struct elf64_x86_64_link_hash_entry *edir, *eind;
617
618   edir = (struct elf64_x86_64_link_hash_entry *) dir;
619   eind = (struct elf64_x86_64_link_hash_entry *) ind;
620
621   if (eind->dyn_relocs != NULL)
622     {
623       if (edir->dyn_relocs != NULL)
624         {
625           struct elf64_x86_64_dyn_relocs **pp;
626           struct elf64_x86_64_dyn_relocs *p;
627
628           /* Add reloc counts against the indirect sym to the direct sym
629              list.  Merge any entries against the same section.  */
630           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
631             {
632               struct elf64_x86_64_dyn_relocs *q;
633
634               for (q = edir->dyn_relocs; q != NULL; q = q->next)
635                 if (q->sec == p->sec)
636                   {
637                     q->pc_count += p->pc_count;
638                     q->count += p->count;
639                     *pp = p->next;
640                     break;
641                   }
642               if (q == NULL)
643                 pp = &p->next;
644             }
645           *pp = edir->dyn_relocs;
646         }
647
648       edir->dyn_relocs = eind->dyn_relocs;
649       eind->dyn_relocs = NULL;
650     }
651
652   if (ind->root.type == bfd_link_hash_indirect
653       && dir->got.refcount <= 0)
654     {
655       edir->tls_type = eind->tls_type;
656       eind->tls_type = GOT_UNKNOWN;
657     }
658
659   if (ELIMINATE_COPY_RELOCS
660       && ind->root.type != bfd_link_hash_indirect
661       && dir->dynamic_adjusted)
662     {
663       /* If called to transfer flags for a weakdef during processing
664          of elf_adjust_dynamic_symbol, don't copy non_got_ref.
665          We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
666       dir->ref_dynamic |= ind->ref_dynamic;
667       dir->ref_regular |= ind->ref_regular;
668       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
669       dir->needs_plt |= ind->needs_plt;
670       dir->pointer_equality_needed |= ind->pointer_equality_needed;
671     }
672   else
673     _bfd_elf_link_hash_copy_indirect (info, dir, ind);
674 }
675
676 static bfd_boolean
677 elf64_x86_64_mkobject (bfd *abfd)
678 {
679   if (abfd->tdata.any == NULL)
680     {
681       bfd_size_type amt = sizeof (struct elf64_x86_64_obj_tdata);
682       abfd->tdata.any = bfd_zalloc (abfd, amt);
683       if (abfd->tdata.any == NULL)
684         return FALSE;
685     }
686   return bfd_elf_mkobject (abfd);
687 }
688
689 static bfd_boolean
690 elf64_x86_64_elf_object_p (bfd *abfd)
691 {
692   /* Set the right machine number for an x86-64 elf64 file.  */
693   bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
694   return TRUE;
695 }
696
697 static int
698 elf64_x86_64_tls_transition (struct bfd_link_info *info, int r_type, int is_local)
699 {
700   if (info->shared)
701     return r_type;
702
703   switch (r_type)
704     {
705     case R_X86_64_TLSGD:
706     case R_X86_64_GOTPC32_TLSDESC:
707     case R_X86_64_TLSDESC_CALL:
708     case R_X86_64_GOTTPOFF:
709       if (is_local)
710         return R_X86_64_TPOFF32;
711       return R_X86_64_GOTTPOFF;
712     case R_X86_64_TLSLD:
713       return R_X86_64_TPOFF32;
714     }
715
716    return r_type;
717 }
718
719 /* Look through the relocs for a section during the first phase, and
720    calculate needed space in the global offset table, procedure
721    linkage table, and dynamic reloc sections.  */
722
723 static bfd_boolean
724 elf64_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
725                            const Elf_Internal_Rela *relocs)
726 {
727   struct elf64_x86_64_link_hash_table *htab;
728   Elf_Internal_Shdr *symtab_hdr;
729   struct elf_link_hash_entry **sym_hashes;
730   const Elf_Internal_Rela *rel;
731   const Elf_Internal_Rela *rel_end;
732   asection *sreloc;
733
734   if (info->relocatable)
735     return TRUE;
736
737   htab = elf64_x86_64_hash_table (info);
738   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
739   sym_hashes = elf_sym_hashes (abfd);
740
741   sreloc = NULL;
742
743   rel_end = relocs + sec->reloc_count;
744   for (rel = relocs; rel < rel_end; rel++)
745     {
746       unsigned int r_type;
747       unsigned long r_symndx;
748       struct elf_link_hash_entry *h;
749
750       r_symndx = ELF64_R_SYM (rel->r_info);
751       r_type = ELF64_R_TYPE (rel->r_info);
752
753       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
754         {
755           (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
756                                  abfd, r_symndx);
757           return FALSE;
758         }
759
760       if (r_symndx < symtab_hdr->sh_info)
761         h = NULL;
762       else
763         {
764           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
765           while (h->root.type == bfd_link_hash_indirect
766                  || h->root.type == bfd_link_hash_warning)
767             h = (struct elf_link_hash_entry *) h->root.u.i.link;
768         }
769
770       r_type = elf64_x86_64_tls_transition (info, r_type, h == NULL);
771       switch (r_type)
772         {
773         case R_X86_64_TLSLD:
774           htab->tls_ld_got.refcount += 1;
775           goto create_got;
776
777         case R_X86_64_TPOFF32:
778           if (info->shared)
779             {
780               (*_bfd_error_handler)
781                 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
782                  abfd,
783                  x86_64_elf_howto_table[r_type].name,
784                  (h) ? h->root.root.string : "a local symbol");
785               bfd_set_error (bfd_error_bad_value);
786               return FALSE;
787             }
788           break;
789
790         case R_X86_64_GOTTPOFF:
791           if (info->shared)
792             info->flags |= DF_STATIC_TLS;
793           /* Fall through */
794
795         case R_X86_64_GOT32:
796         case R_X86_64_GOTPCREL:
797         case R_X86_64_TLSGD:
798         case R_X86_64_GOT64:
799         case R_X86_64_GOTPCREL64:
800         case R_X86_64_GOTPLT64:
801         case R_X86_64_GOTPC32_TLSDESC:
802         case R_X86_64_TLSDESC_CALL:
803           /* This symbol requires a global offset table entry.  */
804           {
805             int tls_type, old_tls_type;
806
807             switch (r_type)
808               {
809               default: tls_type = GOT_NORMAL; break;
810               case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break;
811               case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break;
812               case R_X86_64_GOTPC32_TLSDESC:
813               case R_X86_64_TLSDESC_CALL:
814                 tls_type = GOT_TLS_GDESC; break;
815               }
816
817             if (h != NULL)
818               {
819                 if (r_type == R_X86_64_GOTPLT64)
820                   {
821                     /* This relocation indicates that we also need
822                        a PLT entry, as this is a function.  We don't need
823                        a PLT entry for local symbols.  */
824                     h->needs_plt = 1;
825                     h->plt.refcount += 1;
826                   }
827                 h->got.refcount += 1;
828                 old_tls_type = elf64_x86_64_hash_entry (h)->tls_type;
829               }
830             else
831               {
832                 bfd_signed_vma *local_got_refcounts;
833
834                 /* This is a global offset table entry for a local symbol.  */
835                 local_got_refcounts = elf_local_got_refcounts (abfd);
836                 if (local_got_refcounts == NULL)
837                   {
838                     bfd_size_type size;
839
840                     size = symtab_hdr->sh_info;
841                     size *= sizeof (bfd_signed_vma)
842                       + sizeof (bfd_vma) + sizeof (char);
843                     local_got_refcounts = ((bfd_signed_vma *)
844                                            bfd_zalloc (abfd, size));
845                     if (local_got_refcounts == NULL)
846                       return FALSE;
847                     elf_local_got_refcounts (abfd) = local_got_refcounts;
848                     elf64_x86_64_local_tlsdesc_gotent (abfd)
849                       = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
850                     elf64_x86_64_local_got_tls_type (abfd)
851                       = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
852                   }
853                 local_got_refcounts[r_symndx] += 1;
854                 old_tls_type
855                   = elf64_x86_64_local_got_tls_type (abfd) [r_symndx];
856               }
857
858             /* If a TLS symbol is accessed using IE at least once,
859                there is no point to use dynamic model for it.  */
860             if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
861                 && (! GOT_TLS_GD_ANY_P (old_tls_type)
862                     || tls_type != GOT_TLS_IE))
863               {
864                 if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type))
865                   tls_type = old_tls_type;
866                 else if (GOT_TLS_GD_ANY_P (old_tls_type)
867                          && GOT_TLS_GD_ANY_P (tls_type))
868                   tls_type |= old_tls_type;
869                 else
870                   {
871                     (*_bfd_error_handler)
872                       (_("%B: %s' accessed both as normal and thread local symbol"),
873                        abfd, h ? h->root.root.string : "<local>");
874                     return FALSE;
875                   }
876               }
877
878             if (old_tls_type != tls_type)
879               {
880                 if (h != NULL)
881                   elf64_x86_64_hash_entry (h)->tls_type = tls_type;
882                 else
883                   elf64_x86_64_local_got_tls_type (abfd) [r_symndx] = tls_type;
884               }
885           }
886           /* Fall through */
887
888         case R_X86_64_GOTOFF64:
889         case R_X86_64_GOTPC32:
890         case R_X86_64_GOTPC64:
891         create_got:
892           if (htab->sgot == NULL)
893             {
894               if (htab->elf.dynobj == NULL)
895                 htab->elf.dynobj = abfd;
896               if (!create_got_section (htab->elf.dynobj, info))
897                 return FALSE;
898             }
899           break;
900
901         case R_X86_64_PLT32:
902           /* This symbol requires a procedure linkage table entry.  We
903              actually build the entry in adjust_dynamic_symbol,
904              because this might be a case of linking PIC code which is
905              never referenced by a dynamic object, in which case we
906              don't need to generate a procedure linkage table entry
907              after all.  */
908
909           /* If this is a local symbol, we resolve it directly without
910              creating a procedure linkage table entry.  */
911           if (h == NULL)
912             continue;
913
914           h->needs_plt = 1;
915           h->plt.refcount += 1;
916           break;
917
918         case R_X86_64_PLTOFF64:
919           /* This tries to form the 'address' of a function relative
920              to GOT.  For global symbols we need a PLT entry.  */
921           if (h != NULL)
922             {
923               h->needs_plt = 1;
924               h->plt.refcount += 1;
925             }
926           goto create_got;
927
928         case R_X86_64_8:
929         case R_X86_64_16:
930         case R_X86_64_32:
931         case R_X86_64_32S:
932           /* Let's help debug shared library creation.  These relocs
933              cannot be used in shared libs.  Don't error out for
934              sections we don't care about, such as debug sections or
935              non-constant sections.  */
936           if (info->shared
937               && (sec->flags & SEC_ALLOC) != 0
938               && (sec->flags & SEC_READONLY) != 0)
939             {
940               (*_bfd_error_handler)
941                 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
942                  abfd,
943                  x86_64_elf_howto_table[r_type].name,
944                  (h) ? h->root.root.string : "a local symbol");
945               bfd_set_error (bfd_error_bad_value);
946               return FALSE;
947             }
948           /* Fall through.  */
949
950         case R_X86_64_PC8:
951         case R_X86_64_PC16:
952         case R_X86_64_PC32:
953         case R_X86_64_PC64:
954         case R_X86_64_64:
955           if (h != NULL && !info->shared)
956             {
957               /* If this reloc is in a read-only section, we might
958                  need a copy reloc.  We can't check reliably at this
959                  stage whether the section is read-only, as input
960                  sections have not yet been mapped to output sections.
961                  Tentatively set the flag for now, and correct in
962                  adjust_dynamic_symbol.  */
963               h->non_got_ref = 1;
964
965               /* We may need a .plt entry if the function this reloc
966                  refers to is in a shared lib.  */
967               h->plt.refcount += 1;
968               if (r_type != R_X86_64_PC32 && r_type != R_X86_64_PC64)
969                 h->pointer_equality_needed = 1;
970             }
971
972           /* If we are creating a shared library, and this is a reloc
973              against a global symbol, or a non PC relative reloc
974              against a local symbol, then we need to copy the reloc
975              into the shared library.  However, if we are linking with
976              -Bsymbolic, we do not need to copy a reloc against a
977              global symbol which is defined in an object we are
978              including in the link (i.e., DEF_REGULAR is set).  At
979              this point we have not seen all the input files, so it is
980              possible that DEF_REGULAR is not set now but will be set
981              later (it is never cleared).  In case of a weak definition,
982              DEF_REGULAR may be cleared later by a strong definition in
983              a shared library.  We account for that possibility below by
984              storing information in the relocs_copied field of the hash
985              table entry.  A similar situation occurs when creating
986              shared libraries and symbol visibility changes render the
987              symbol local.
988
989              If on the other hand, we are creating an executable, we
990              may need to keep relocations for symbols satisfied by a
991              dynamic library if we manage to avoid copy relocs for the
992              symbol.  */
993           if ((info->shared
994                && (sec->flags & SEC_ALLOC) != 0
995                && (((r_type != R_X86_64_PC8)
996                     && (r_type != R_X86_64_PC16)
997                     && (r_type != R_X86_64_PC32)
998                     && (r_type != R_X86_64_PC64))
999                    || (h != NULL
1000                        && (! SYMBOLIC_BIND (info, h)
1001                            || h->root.type == bfd_link_hash_defweak
1002                            || !h->def_regular))))
1003               || (ELIMINATE_COPY_RELOCS
1004                   && !info->shared
1005                   && (sec->flags & SEC_ALLOC) != 0
1006                   && h != NULL
1007                   && (h->root.type == bfd_link_hash_defweak
1008                       || !h->def_regular)))
1009             {
1010               struct elf64_x86_64_dyn_relocs *p;
1011               struct elf64_x86_64_dyn_relocs **head;
1012
1013               /* We must copy these reloc types into the output file.
1014                  Create a reloc section in dynobj and make room for
1015                  this reloc.  */
1016               if (sreloc == NULL)
1017                 {
1018                   const char *name;
1019                   bfd *dynobj;
1020
1021                   name = (bfd_elf_string_from_elf_section
1022                           (abfd,
1023                            elf_elfheader (abfd)->e_shstrndx,
1024                            elf_section_data (sec)->rel_hdr.sh_name));
1025                   if (name == NULL)
1026                     return FALSE;
1027
1028                   if (! CONST_STRNEQ (name, ".rela")
1029                       || strcmp (bfd_get_section_name (abfd, sec),
1030                                  name + 5) != 0)
1031                     {
1032                       (*_bfd_error_handler)
1033                         (_("%B: bad relocation section name `%s\'"),
1034                          abfd, name);
1035                     }
1036
1037                   if (htab->elf.dynobj == NULL)
1038                     htab->elf.dynobj = abfd;
1039
1040                   dynobj = htab->elf.dynobj;
1041
1042                   sreloc = bfd_get_section_by_name (dynobj, name);
1043                   if (sreloc == NULL)
1044                     {
1045                       flagword flags;
1046
1047                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
1048                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1049                       if ((sec->flags & SEC_ALLOC) != 0)
1050                         flags |= SEC_ALLOC | SEC_LOAD;
1051                       sreloc = bfd_make_section_with_flags (dynobj,
1052                                                             name,
1053                                                             flags);
1054                       if (sreloc == NULL
1055                           || ! bfd_set_section_alignment (dynobj, sreloc, 3))
1056                         return FALSE;
1057                     }
1058                   elf_section_data (sec)->sreloc = sreloc;
1059                 }
1060
1061               /* If this is a global symbol, we count the number of
1062                  relocations we need for this symbol.  */
1063               if (h != NULL)
1064                 {
1065                   head = &((struct elf64_x86_64_link_hash_entry *) h)->dyn_relocs;
1066                 }
1067               else
1068                 {
1069                   void **vpp;
1070                   /* Track dynamic relocs needed for local syms too.
1071                      We really need local syms available to do this
1072                      easily.  Oh well.  */
1073
1074                   asection *s;
1075                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
1076                                                  sec, r_symndx);
1077                   if (s == NULL)
1078                     return FALSE;
1079
1080                   /* Beware of type punned pointers vs strict aliasing
1081                      rules.  */
1082                   vpp = &(elf_section_data (s)->local_dynrel);
1083                   head = (struct elf64_x86_64_dyn_relocs **)vpp;
1084                 }
1085
1086               p = *head;
1087               if (p == NULL || p->sec != sec)
1088                 {
1089                   bfd_size_type amt = sizeof *p;
1090                   p = ((struct elf64_x86_64_dyn_relocs *)
1091                        bfd_alloc (htab->elf.dynobj, amt));
1092                   if (p == NULL)
1093                     return FALSE;
1094                   p->next = *head;
1095                   *head = p;
1096                   p->sec = sec;
1097                   p->count = 0;
1098                   p->pc_count = 0;
1099                 }
1100
1101               p->count += 1;
1102               if (r_type == R_X86_64_PC8
1103                   || r_type == R_X86_64_PC16
1104                   || r_type == R_X86_64_PC32
1105                   || r_type == R_X86_64_PC64)
1106                 p->pc_count += 1;
1107             }
1108           break;
1109
1110           /* This relocation describes the C++ object vtable hierarchy.
1111              Reconstruct it for later use during GC.  */
1112         case R_X86_64_GNU_VTINHERIT:
1113           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1114             return FALSE;
1115           break;
1116
1117           /* This relocation describes which C++ vtable entries are actually
1118              used.  Record for later use during GC.  */
1119         case R_X86_64_GNU_VTENTRY:
1120           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1121             return FALSE;
1122           break;
1123
1124         default:
1125           break;
1126         }
1127     }
1128
1129   return TRUE;
1130 }
1131
1132 /* Return the section that should be marked against GC for a given
1133    relocation.  */
1134
1135 static asection *
1136 elf64_x86_64_gc_mark_hook (asection *sec,
1137                            struct bfd_link_info *info,
1138                            Elf_Internal_Rela *rel,
1139                            struct elf_link_hash_entry *h,
1140                            Elf_Internal_Sym *sym)
1141 {
1142   if (h != NULL)
1143     switch (ELF64_R_TYPE (rel->r_info))
1144       {
1145       case R_X86_64_GNU_VTINHERIT:
1146       case R_X86_64_GNU_VTENTRY:
1147         return NULL;
1148       }
1149
1150   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1151 }
1152
1153 /* Update the got entry reference counts for the section being removed.  */
1154
1155 static bfd_boolean
1156 elf64_x86_64_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
1157                             asection *sec, const Elf_Internal_Rela *relocs)
1158 {
1159   Elf_Internal_Shdr *symtab_hdr;
1160   struct elf_link_hash_entry **sym_hashes;
1161   bfd_signed_vma *local_got_refcounts;
1162   const Elf_Internal_Rela *rel, *relend;
1163
1164   elf_section_data (sec)->local_dynrel = NULL;
1165
1166   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1167   sym_hashes = elf_sym_hashes (abfd);
1168   local_got_refcounts = elf_local_got_refcounts (abfd);
1169
1170   relend = relocs + sec->reloc_count;
1171   for (rel = relocs; rel < relend; rel++)
1172     {
1173       unsigned long r_symndx;
1174       unsigned int r_type;
1175       struct elf_link_hash_entry *h = NULL;
1176
1177       r_symndx = ELF64_R_SYM (rel->r_info);
1178       if (r_symndx >= symtab_hdr->sh_info)
1179         {
1180           struct elf64_x86_64_link_hash_entry *eh;
1181           struct elf64_x86_64_dyn_relocs **pp;
1182           struct elf64_x86_64_dyn_relocs *p;
1183
1184           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1185           while (h->root.type == bfd_link_hash_indirect
1186                  || h->root.type == bfd_link_hash_warning)
1187             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1188           eh = (struct elf64_x86_64_link_hash_entry *) h;
1189
1190           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1191             if (p->sec == sec)
1192               {
1193                 /* Everything must go for SEC.  */
1194                 *pp = p->next;
1195                 break;
1196               }
1197         }
1198
1199       r_type = ELF64_R_TYPE (rel->r_info);
1200       r_type = elf64_x86_64_tls_transition (info, r_type, h != NULL);
1201       switch (r_type)
1202         {
1203         case R_X86_64_TLSLD:
1204           if (elf64_x86_64_hash_table (info)->tls_ld_got.refcount > 0)
1205             elf64_x86_64_hash_table (info)->tls_ld_got.refcount -= 1;
1206           break;
1207
1208         case R_X86_64_TLSGD:
1209         case R_X86_64_GOTPC32_TLSDESC:
1210         case R_X86_64_TLSDESC_CALL:
1211         case R_X86_64_GOTTPOFF:
1212         case R_X86_64_GOT32:
1213         case R_X86_64_GOTPCREL:
1214         case R_X86_64_GOT64:
1215         case R_X86_64_GOTPCREL64:
1216         case R_X86_64_GOTPLT64:
1217           if (h != NULL)
1218             {
1219               if (r_type == R_X86_64_GOTPLT64 && h->plt.refcount > 0)
1220                 h->plt.refcount -= 1;
1221               if (h->got.refcount > 0)
1222                 h->got.refcount -= 1;
1223             }
1224           else if (local_got_refcounts != NULL)
1225             {
1226               if (local_got_refcounts[r_symndx] > 0)
1227                 local_got_refcounts[r_symndx] -= 1;
1228             }
1229           break;
1230
1231         case R_X86_64_8:
1232         case R_X86_64_16:
1233         case R_X86_64_32:
1234         case R_X86_64_64:
1235         case R_X86_64_32S:
1236         case R_X86_64_PC8:
1237         case R_X86_64_PC16:
1238         case R_X86_64_PC32:
1239         case R_X86_64_PC64:
1240           if (info->shared)
1241             break;
1242           /* Fall thru */
1243
1244         case R_X86_64_PLT32:
1245         case R_X86_64_PLTOFF64:
1246           if (h != NULL)
1247             {
1248               if (h->plt.refcount > 0)
1249                 h->plt.refcount -= 1;
1250             }
1251           break;
1252
1253         default:
1254           break;
1255         }
1256     }
1257
1258   return TRUE;
1259 }
1260
1261 /* Adjust a symbol defined by a dynamic object and referenced by a
1262    regular object.  The current definition is in some section of the
1263    dynamic object, but we're not including those sections.  We have to
1264    change the definition to something the rest of the link can
1265    understand.  */
1266
1267 static bfd_boolean
1268 elf64_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
1269                                     struct elf_link_hash_entry *h)
1270 {
1271   struct elf64_x86_64_link_hash_table *htab;
1272   asection *s;
1273   unsigned int power_of_two;
1274
1275   /* If this is a function, put it in the procedure linkage table.  We
1276      will fill in the contents of the procedure linkage table later,
1277      when we know the address of the .got section.  */
1278   if (h->type == STT_FUNC
1279       || h->needs_plt)
1280     {
1281       if (h->plt.refcount <= 0
1282           || SYMBOL_CALLS_LOCAL (info, h)
1283           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1284               && h->root.type == bfd_link_hash_undefweak))
1285         {
1286           /* This case can occur if we saw a PLT32 reloc in an input
1287              file, but the symbol was never referred to by a dynamic
1288              object, or if all references were garbage collected.  In
1289              such a case, we don't actually need to build a procedure
1290              linkage table, and we can just do a PC32 reloc instead.  */
1291           h->plt.offset = (bfd_vma) -1;
1292           h->needs_plt = 0;
1293         }
1294
1295       return TRUE;
1296     }
1297   else
1298     /* It's possible that we incorrectly decided a .plt reloc was
1299        needed for an R_X86_64_PC32 reloc to a non-function sym in
1300        check_relocs.  We can't decide accurately between function and
1301        non-function syms in check-relocs;  Objects loaded later in
1302        the link may change h->type.  So fix it now.  */
1303     h->plt.offset = (bfd_vma) -1;
1304
1305   /* If this is a weak symbol, and there is a real definition, the
1306      processor independent code will have arranged for us to see the
1307      real definition first, and we can just use the same value.  */
1308   if (h->u.weakdef != NULL)
1309     {
1310       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1311                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
1312       h->root.u.def.section = h->u.weakdef->root.u.def.section;
1313       h->root.u.def.value = h->u.weakdef->root.u.def.value;
1314       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
1315         h->non_got_ref = h->u.weakdef->non_got_ref;
1316       return TRUE;
1317     }
1318
1319   /* This is a reference to a symbol defined by a dynamic object which
1320      is not a function.  */
1321
1322   /* If we are creating a shared library, we must presume that the
1323      only references to the symbol are via the global offset table.
1324      For such cases we need not do anything here; the relocations will
1325      be handled correctly by relocate_section.  */
1326   if (info->shared)
1327     return TRUE;
1328
1329   /* If there are no references to this symbol that do not use the
1330      GOT, we don't need to generate a copy reloc.  */
1331   if (!h->non_got_ref)
1332     return TRUE;
1333
1334   /* If -z nocopyreloc was given, we won't generate them either.  */
1335   if (info->nocopyreloc)
1336     {
1337       h->non_got_ref = 0;
1338       return TRUE;
1339     }
1340
1341   if (ELIMINATE_COPY_RELOCS)
1342     {
1343       struct elf64_x86_64_link_hash_entry * eh;
1344       struct elf64_x86_64_dyn_relocs *p;
1345
1346       eh = (struct elf64_x86_64_link_hash_entry *) h;
1347       for (p = eh->dyn_relocs; p != NULL; p = p->next)
1348         {
1349           s = p->sec->output_section;
1350           if (s != NULL && (s->flags & SEC_READONLY) != 0)
1351             break;
1352         }
1353
1354       /* If we didn't find any dynamic relocs in read-only sections, then
1355          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1356       if (p == NULL)
1357         {
1358           h->non_got_ref = 0;
1359           return TRUE;
1360         }
1361     }
1362
1363   if (h->size == 0)
1364     {
1365       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1366                              h->root.root.string);
1367       return TRUE;
1368     }
1369
1370   /* We must allocate the symbol in our .dynbss section, which will
1371      become part of the .bss section of the executable.  There will be
1372      an entry for this symbol in the .dynsym section.  The dynamic
1373      object will contain position independent code, so all references
1374      from the dynamic object to this symbol will go through the global
1375      offset table.  The dynamic linker will use the .dynsym entry to
1376      determine the address it must put in the global offset table, so
1377      both the dynamic object and the regular object will refer to the
1378      same memory location for the variable.  */
1379
1380   htab = elf64_x86_64_hash_table (info);
1381
1382   /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
1383      to copy the initial value out of the dynamic object and into the
1384      runtime process image.  */
1385   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1386     {
1387       htab->srelbss->size += sizeof (Elf64_External_Rela);
1388       h->needs_copy = 1;
1389     }
1390
1391   /* We need to figure out the alignment required for this symbol.  I
1392      have no idea how ELF linkers handle this.  16-bytes is the size
1393      of the largest type that requires hard alignment -- long double.  */
1394   /* FIXME: This is VERY ugly. Should be fixed for all architectures using
1395      this construct.  */
1396   power_of_two = bfd_log2 (h->size);
1397   if (power_of_two > 4)
1398     power_of_two = 4;
1399
1400   /* Apply the required alignment.  */
1401   s = htab->sdynbss;
1402   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
1403   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
1404     {
1405       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
1406         return FALSE;
1407     }
1408
1409   /* Define the symbol as being at this point in the section.  */
1410   h->root.u.def.section = s;
1411   h->root.u.def.value = s->size;
1412
1413   /* Increment the section size to make room for the symbol.  */
1414   s->size += h->size;
1415
1416   return TRUE;
1417 }
1418
1419 /* Allocate space in .plt, .got and associated reloc sections for
1420    dynamic relocs.  */
1421
1422 static bfd_boolean
1423 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
1424 {
1425   struct bfd_link_info *info;
1426   struct elf64_x86_64_link_hash_table *htab;
1427   struct elf64_x86_64_link_hash_entry *eh;
1428   struct elf64_x86_64_dyn_relocs *p;
1429
1430   if (h->root.type == bfd_link_hash_indirect)
1431     return TRUE;
1432
1433   if (h->root.type == bfd_link_hash_warning)
1434     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1435
1436   info = (struct bfd_link_info *) inf;
1437   htab = elf64_x86_64_hash_table (info);
1438
1439   if (htab->elf.dynamic_sections_created
1440       && h->plt.refcount > 0)
1441     {
1442       /* Make sure this symbol is output as a dynamic symbol.
1443          Undefined weak syms won't yet be marked as dynamic.  */
1444       if (h->dynindx == -1
1445           && !h->forced_local)
1446         {
1447           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1448             return FALSE;
1449         }
1450
1451       if (info->shared
1452           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
1453         {
1454           asection *s = htab->splt;
1455
1456           /* If this is the first .plt entry, make room for the special
1457              first entry.  */
1458           if (s->size == 0)
1459             s->size += PLT_ENTRY_SIZE;
1460
1461           h->plt.offset = s->size;
1462
1463           /* If this symbol is not defined in a regular file, and we are
1464              not generating a shared library, then set the symbol to this
1465              location in the .plt.  This is required to make function
1466              pointers compare as equal between the normal executable and
1467              the shared library.  */
1468           if (! info->shared
1469               && !h->def_regular)
1470             {
1471               h->root.u.def.section = s;
1472               h->root.u.def.value = h->plt.offset;
1473             }
1474
1475           /* Make room for this entry.  */
1476           s->size += PLT_ENTRY_SIZE;
1477
1478           /* We also need to make an entry in the .got.plt section, which
1479              will be placed in the .got section by the linker script.  */
1480           htab->sgotplt->size += GOT_ENTRY_SIZE;
1481
1482           /* We also need to make an entry in the .rela.plt section.  */
1483           htab->srelplt->size += sizeof (Elf64_External_Rela);
1484           htab->srelplt->reloc_count++;
1485         }
1486       else
1487         {
1488           h->plt.offset = (bfd_vma) -1;
1489           h->needs_plt = 0;
1490         }
1491     }
1492   else
1493     {
1494       h->plt.offset = (bfd_vma) -1;
1495       h->needs_plt = 0;
1496     }
1497
1498   eh = (struct elf64_x86_64_link_hash_entry *) h;
1499   eh->tlsdesc_got = (bfd_vma) -1;
1500
1501   /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
1502      make it a R_X86_64_TPOFF32 requiring no GOT entry.  */
1503   if (h->got.refcount > 0
1504       && !info->shared
1505       && h->dynindx == -1
1506       && elf64_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE)
1507     h->got.offset = (bfd_vma) -1;
1508   else if (h->got.refcount > 0)
1509     {
1510       asection *s;
1511       bfd_boolean dyn;
1512       int tls_type = elf64_x86_64_hash_entry (h)->tls_type;
1513
1514       /* Make sure this symbol is output as a dynamic symbol.
1515          Undefined weak syms won't yet be marked as dynamic.  */
1516       if (h->dynindx == -1
1517           && !h->forced_local)
1518         {
1519           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1520             return FALSE;
1521         }
1522
1523       if (GOT_TLS_GDESC_P (tls_type))
1524         {
1525           eh->tlsdesc_got = htab->sgotplt->size
1526             - elf64_x86_64_compute_jump_table_size (htab);
1527           htab->sgotplt->size += 2 * GOT_ENTRY_SIZE;
1528           h->got.offset = (bfd_vma) -2;
1529         }
1530       if (! GOT_TLS_GDESC_P (tls_type)
1531           || GOT_TLS_GD_P (tls_type))
1532         {
1533           s = htab->sgot;
1534           h->got.offset = s->size;
1535           s->size += GOT_ENTRY_SIZE;
1536           if (GOT_TLS_GD_P (tls_type))
1537             s->size += GOT_ENTRY_SIZE;
1538         }
1539       dyn = htab->elf.dynamic_sections_created;
1540       /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
1541          and two if global.
1542          R_X86_64_GOTTPOFF needs one dynamic relocation.  */
1543       if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
1544           || tls_type == GOT_TLS_IE)
1545         htab->srelgot->size += sizeof (Elf64_External_Rela);
1546       else if (GOT_TLS_GD_P (tls_type))
1547         htab->srelgot->size += 2 * sizeof (Elf64_External_Rela);
1548       else if (! GOT_TLS_GDESC_P (tls_type)
1549                && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1550                    || h->root.type != bfd_link_hash_undefweak)
1551                && (info->shared
1552                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
1553         htab->srelgot->size += sizeof (Elf64_External_Rela);
1554       if (GOT_TLS_GDESC_P (tls_type))
1555         {
1556           htab->srelplt->size += sizeof (Elf64_External_Rela);
1557           htab->tlsdesc_plt = (bfd_vma) -1;
1558         }
1559     }
1560   else
1561     h->got.offset = (bfd_vma) -1;
1562
1563   if (eh->dyn_relocs == NULL)
1564     return TRUE;
1565
1566   /* In the shared -Bsymbolic case, discard space allocated for
1567      dynamic pc-relative relocs against symbols which turn out to be
1568      defined in regular objects.  For the normal shared case, discard
1569      space for pc-relative relocs that have become local due to symbol
1570      visibility changes.  */
1571
1572   if (info->shared)
1573     {
1574       /* Relocs that use pc_count are those that appear on a call
1575          insn, or certain REL relocs that can generated via assembly.
1576          We want calls to protected symbols to resolve directly to the
1577          function rather than going via the plt.  If people want
1578          function pointer comparisons to work as expected then they
1579          should avoid writing weird assembly.  */
1580       if (SYMBOL_CALLS_LOCAL (info, h))
1581         {
1582           struct elf64_x86_64_dyn_relocs **pp;
1583
1584           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1585             {
1586               p->count -= p->pc_count;
1587               p->pc_count = 0;
1588               if (p->count == 0)
1589                 *pp = p->next;
1590               else
1591                 pp = &p->next;
1592             }
1593         }
1594
1595       /* Also discard relocs on undefined weak syms with non-default
1596          visibility.  */
1597       if (eh->dyn_relocs != NULL
1598           && h->root.type == bfd_link_hash_undefweak)
1599         {
1600           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1601             eh->dyn_relocs = NULL;
1602
1603           /* Make sure undefined weak symbols are output as a dynamic
1604              symbol in PIEs.  */
1605           else if (h->dynindx == -1
1606                    && !h->forced_local)
1607             {
1608               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1609                 return FALSE;
1610             }
1611         }
1612     }
1613   else if (ELIMINATE_COPY_RELOCS)
1614     {
1615       /* For the non-shared case, discard space for relocs against
1616          symbols which turn out to need copy relocs or are not
1617          dynamic.  */
1618
1619       if (!h->non_got_ref
1620           && ((h->def_dynamic
1621                && !h->def_regular)
1622               || (htab->elf.dynamic_sections_created
1623                   && (h->root.type == bfd_link_hash_undefweak
1624                       || h->root.type == bfd_link_hash_undefined))))
1625         {
1626           /* Make sure this symbol is output as a dynamic symbol.
1627              Undefined weak syms won't yet be marked as dynamic.  */
1628           if (h->dynindx == -1
1629               && !h->forced_local)
1630             {
1631               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1632                 return FALSE;
1633             }
1634
1635           /* If that succeeded, we know we'll be keeping all the
1636              relocs.  */
1637           if (h->dynindx != -1)
1638             goto keep;
1639         }
1640
1641       eh->dyn_relocs = NULL;
1642
1643     keep: ;
1644     }
1645
1646   /* Finally, allocate space.  */
1647   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1648     {
1649       asection *sreloc = elf_section_data (p->sec)->sreloc;
1650       sreloc->size += p->count * sizeof (Elf64_External_Rela);
1651     }
1652
1653   return TRUE;
1654 }
1655
1656 /* Find any dynamic relocs that apply to read-only sections.  */
1657
1658 static bfd_boolean
1659 readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf)
1660 {
1661   struct elf64_x86_64_link_hash_entry *eh;
1662   struct elf64_x86_64_dyn_relocs *p;
1663
1664   if (h->root.type == bfd_link_hash_warning)
1665     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1666
1667   eh = (struct elf64_x86_64_link_hash_entry *) h;
1668   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1669     {
1670       asection *s = p->sec->output_section;
1671
1672       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1673         {
1674           struct bfd_link_info *info = (struct bfd_link_info *) inf;
1675
1676           info->flags |= DF_TEXTREL;
1677
1678           /* Not an error, just cut short the traversal.  */
1679           return FALSE;
1680         }
1681     }
1682   return TRUE;
1683 }
1684
1685 /* Set the sizes of the dynamic sections.  */
1686
1687 static bfd_boolean
1688 elf64_x86_64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1689                                     struct bfd_link_info *info)
1690 {
1691   struct elf64_x86_64_link_hash_table *htab;
1692   bfd *dynobj;
1693   asection *s;
1694   bfd_boolean relocs;
1695   bfd *ibfd;
1696
1697   htab = elf64_x86_64_hash_table (info);
1698   dynobj = htab->elf.dynobj;
1699   if (dynobj == NULL)
1700     abort ();
1701
1702   if (htab->elf.dynamic_sections_created)
1703     {
1704       /* Set the contents of the .interp section to the interpreter.  */
1705       if (info->executable)
1706         {
1707           s = bfd_get_section_by_name (dynobj, ".interp");
1708           if (s == NULL)
1709             abort ();
1710           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1711           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1712         }
1713     }
1714
1715   /* Set up .got offsets for local syms, and space for local dynamic
1716      relocs.  */
1717   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1718     {
1719       bfd_signed_vma *local_got;
1720       bfd_signed_vma *end_local_got;
1721       char *local_tls_type;
1722       bfd_vma *local_tlsdesc_gotent;
1723       bfd_size_type locsymcount;
1724       Elf_Internal_Shdr *symtab_hdr;
1725       asection *srel;
1726
1727       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1728         continue;
1729
1730       for (s = ibfd->sections; s != NULL; s = s->next)
1731         {
1732           struct elf64_x86_64_dyn_relocs *p;
1733
1734           for (p = (struct elf64_x86_64_dyn_relocs *)
1735                     (elf_section_data (s)->local_dynrel);
1736                p != NULL;
1737                p = p->next)
1738             {
1739               if (!bfd_is_abs_section (p->sec)
1740                   && bfd_is_abs_section (p->sec->output_section))
1741                 {
1742                   /* Input section has been discarded, either because
1743                      it is a copy of a linkonce section or due to
1744                      linker script /DISCARD/, so we'll be discarding
1745                      the relocs too.  */
1746                 }
1747               else if (p->count != 0)
1748                 {
1749                   srel = elf_section_data (p->sec)->sreloc;
1750                   srel->size += p->count * sizeof (Elf64_External_Rela);
1751                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1752                     info->flags |= DF_TEXTREL;
1753
1754                 }
1755             }
1756         }
1757
1758       local_got = elf_local_got_refcounts (ibfd);
1759       if (!local_got)
1760         continue;
1761
1762       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1763       locsymcount = symtab_hdr->sh_info;
1764       end_local_got = local_got + locsymcount;
1765       local_tls_type = elf64_x86_64_local_got_tls_type (ibfd);
1766       local_tlsdesc_gotent = elf64_x86_64_local_tlsdesc_gotent (ibfd);
1767       s = htab->sgot;
1768       srel = htab->srelgot;
1769       for (; local_got < end_local_got;
1770            ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
1771         {
1772           *local_tlsdesc_gotent = (bfd_vma) -1;
1773           if (*local_got > 0)
1774             {
1775               if (GOT_TLS_GDESC_P (*local_tls_type))
1776                 {
1777                   *local_tlsdesc_gotent = htab->sgotplt->size
1778                     - elf64_x86_64_compute_jump_table_size (htab);
1779                   htab->sgotplt->size += 2 * GOT_ENTRY_SIZE;
1780                   *local_got = (bfd_vma) -2;
1781                 }
1782               if (! GOT_TLS_GDESC_P (*local_tls_type)
1783                   || GOT_TLS_GD_P (*local_tls_type))
1784                 {
1785                   *local_got = s->size;
1786                   s->size += GOT_ENTRY_SIZE;
1787                   if (GOT_TLS_GD_P (*local_tls_type))
1788                     s->size += GOT_ENTRY_SIZE;
1789                 }
1790               if (info->shared
1791                   || GOT_TLS_GD_ANY_P (*local_tls_type)
1792                   || *local_tls_type == GOT_TLS_IE)
1793                 {
1794                   if (GOT_TLS_GDESC_P (*local_tls_type))
1795                     {
1796                       htab->srelplt->size += sizeof (Elf64_External_Rela);
1797                       htab->tlsdesc_plt = (bfd_vma) -1;
1798                     }
1799                   if (! GOT_TLS_GDESC_P (*local_tls_type)
1800                       || GOT_TLS_GD_P (*local_tls_type))
1801                     srel->size += sizeof (Elf64_External_Rela);
1802                 }
1803             }
1804           else
1805             *local_got = (bfd_vma) -1;
1806         }
1807     }
1808
1809   if (htab->tls_ld_got.refcount > 0)
1810     {
1811       /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
1812          relocs.  */
1813       htab->tls_ld_got.offset = htab->sgot->size;
1814       htab->sgot->size += 2 * GOT_ENTRY_SIZE;
1815       htab->srelgot->size += sizeof (Elf64_External_Rela);
1816     }
1817   else
1818     htab->tls_ld_got.offset = -1;
1819
1820   /* Allocate global sym .plt and .got entries, and space for global
1821      sym dynamic relocs.  */
1822   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
1823
1824   /* For every jump slot reserved in the sgotplt, reloc_count is
1825      incremented.  However, when we reserve space for TLS descriptors,
1826      it's not incremented, so in order to compute the space reserved
1827      for them, it suffices to multiply the reloc count by the jump
1828      slot size.  */
1829   if (htab->srelplt)
1830     htab->sgotplt_jump_table_size
1831       = elf64_x86_64_compute_jump_table_size (htab);
1832
1833   if (htab->tlsdesc_plt)
1834     {
1835       /* If we're not using lazy TLS relocations, don't generate the
1836          PLT and GOT entries they require.  */
1837       if ((info->flags & DF_BIND_NOW))
1838         htab->tlsdesc_plt = 0;
1839       else
1840         {
1841           htab->tlsdesc_got = htab->sgot->size;
1842           htab->sgot->size += GOT_ENTRY_SIZE;
1843           /* Reserve room for the initial entry.
1844              FIXME: we could probably do away with it in this case.  */
1845           if (htab->splt->size == 0)
1846             htab->splt->size += PLT_ENTRY_SIZE;
1847           htab->tlsdesc_plt = htab->splt->size;
1848           htab->splt->size += PLT_ENTRY_SIZE;
1849         }
1850     }
1851
1852   /* We now have determined the sizes of the various dynamic sections.
1853      Allocate memory for them.  */
1854   relocs = FALSE;
1855   for (s = dynobj->sections; s != NULL; s = s->next)
1856     {
1857       if ((s->flags & SEC_LINKER_CREATED) == 0)
1858         continue;
1859
1860       if (s == htab->splt
1861           || s == htab->sgot
1862           || s == htab->sgotplt
1863           || s == htab->sdynbss)
1864         {
1865           /* Strip this section if we don't need it; see the
1866              comment below.  */
1867         }
1868       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
1869         {
1870           if (s->size != 0 && s != htab->srelplt)
1871             relocs = TRUE;
1872
1873           /* We use the reloc_count field as a counter if we need
1874              to copy relocs into the output file.  */
1875           if (s != htab->srelplt)
1876             s->reloc_count = 0;
1877         }
1878       else
1879         {
1880           /* It's not one of our sections, so don't allocate space.  */
1881           continue;
1882         }
1883
1884       if (s->size == 0)
1885         {
1886           /* If we don't need this section, strip it from the
1887              output file.  This is mostly to handle .rela.bss and
1888              .rela.plt.  We must create both sections in
1889              create_dynamic_sections, because they must be created
1890              before the linker maps input sections to output
1891              sections.  The linker does that before
1892              adjust_dynamic_symbol is called, and it is that
1893              function which decides whether anything needs to go
1894              into these sections.  */
1895
1896           s->flags |= SEC_EXCLUDE;
1897           continue;
1898         }
1899
1900       if ((s->flags & SEC_HAS_CONTENTS) == 0)
1901         continue;
1902
1903       /* Allocate memory for the section contents.  We use bfd_zalloc
1904          here in case unused entries are not reclaimed before the
1905          section's contents are written out.  This should not happen,
1906          but this way if it does, we get a R_X86_64_NONE reloc instead
1907          of garbage.  */
1908       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1909       if (s->contents == NULL)
1910         return FALSE;
1911     }
1912
1913   if (htab->elf.dynamic_sections_created)
1914     {
1915       /* Add some entries to the .dynamic section.  We fill in the
1916          values later, in elf64_x86_64_finish_dynamic_sections, but we
1917          must add the entries now so that we get the correct size for
1918          the .dynamic section.  The DT_DEBUG entry is filled in by the
1919          dynamic linker and used by the debugger.  */
1920 #define add_dynamic_entry(TAG, VAL) \
1921   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1922
1923       if (info->executable)
1924         {
1925           if (!add_dynamic_entry (DT_DEBUG, 0))
1926             return FALSE;
1927         }
1928
1929       if (htab->splt->size != 0)
1930         {
1931           if (!add_dynamic_entry (DT_PLTGOT, 0)
1932               || !add_dynamic_entry (DT_PLTRELSZ, 0)
1933               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1934               || !add_dynamic_entry (DT_JMPREL, 0))
1935             return FALSE;
1936
1937           if (htab->tlsdesc_plt
1938               && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
1939                   || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
1940             return FALSE;
1941         }
1942
1943       if (relocs)
1944         {
1945           if (!add_dynamic_entry (DT_RELA, 0)
1946               || !add_dynamic_entry (DT_RELASZ, 0)
1947               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
1948             return FALSE;
1949
1950           /* If any dynamic relocs apply to a read-only section,
1951              then we need a DT_TEXTREL entry.  */
1952           if ((info->flags & DF_TEXTREL) == 0)
1953             elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
1954                                     (PTR) info);
1955
1956           if ((info->flags & DF_TEXTREL) != 0)
1957             {
1958               if (!add_dynamic_entry (DT_TEXTREL, 0))
1959                 return FALSE;
1960             }
1961         }
1962     }
1963 #undef add_dynamic_entry
1964
1965   return TRUE;
1966 }
1967
1968 static bfd_boolean
1969 elf64_x86_64_always_size_sections (bfd *output_bfd,
1970                                    struct bfd_link_info *info)
1971 {
1972   asection *tls_sec = elf_hash_table (info)->tls_sec;
1973
1974   if (tls_sec)
1975     {
1976       struct elf_link_hash_entry *tlsbase;
1977
1978       tlsbase = elf_link_hash_lookup (elf_hash_table (info),
1979                                       "_TLS_MODULE_BASE_",
1980                                       FALSE, FALSE, FALSE);
1981
1982       if (tlsbase && tlsbase->type == STT_TLS)
1983         {
1984           struct bfd_link_hash_entry *bh = NULL;
1985           const struct elf_backend_data *bed
1986             = get_elf_backend_data (output_bfd);
1987
1988           if (!(_bfd_generic_link_add_one_symbol
1989                 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
1990                  tls_sec, 0, NULL, FALSE,
1991                  bed->collect, &bh)))
1992             return FALSE;
1993           tlsbase = (struct elf_link_hash_entry *)bh;
1994           tlsbase->def_regular = 1;
1995           tlsbase->other = STV_HIDDEN;
1996           (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
1997         }
1998     }
1999
2000   return TRUE;
2001 }
2002
2003 /* Return the base VMA address which should be subtracted from real addresses
2004    when resolving @dtpoff relocation.
2005    This is PT_TLS segment p_vaddr.  */
2006
2007 static bfd_vma
2008 dtpoff_base (struct bfd_link_info *info)
2009 {
2010   /* If tls_sec is NULL, we should have signalled an error already.  */
2011   if (elf_hash_table (info)->tls_sec == NULL)
2012     return 0;
2013   return elf_hash_table (info)->tls_sec->vma;
2014 }
2015
2016 /* Return the relocation value for @tpoff relocation
2017    if STT_TLS virtual address is ADDRESS.  */
2018
2019 static bfd_vma
2020 tpoff (struct bfd_link_info *info, bfd_vma address)
2021 {
2022   struct elf_link_hash_table *htab = elf_hash_table (info);
2023
2024   /* If tls_segment is NULL, we should have signalled an error already.  */
2025   if (htab->tls_sec == NULL)
2026     return 0;
2027   return address - htab->tls_size - htab->tls_sec->vma;
2028 }
2029
2030 /* Is the instruction before OFFSET in CONTENTS a 32bit relative
2031    branch?  */
2032
2033 static bfd_boolean
2034 is_32bit_relative_branch (bfd_byte *contents, bfd_vma offset)
2035 {
2036   /* Opcode             Instruction
2037      0xe8               call
2038      0xe9               jump
2039      0x0f 0x8x          conditional jump */
2040   return ((offset > 0
2041            && (contents [offset - 1] == 0xe8
2042                || contents [offset - 1] == 0xe9))
2043           || (offset > 1
2044               && contents [offset - 2] == 0x0f
2045               && (contents [offset - 1] & 0xf0) == 0x80));
2046 }
2047
2048 /* Relocate an x86_64 ELF section.  */
2049
2050 static bfd_boolean
2051 elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
2052                                bfd *input_bfd, asection *input_section,
2053                                bfd_byte *contents, Elf_Internal_Rela *relocs,
2054                                Elf_Internal_Sym *local_syms,
2055                                asection **local_sections)
2056 {
2057   struct elf64_x86_64_link_hash_table *htab;
2058   Elf_Internal_Shdr *symtab_hdr;
2059   struct elf_link_hash_entry **sym_hashes;
2060   bfd_vma *local_got_offsets;
2061   bfd_vma *local_tlsdesc_gotents;
2062   Elf_Internal_Rela *rel;
2063   Elf_Internal_Rela *relend;
2064
2065   if (info->relocatable)
2066     return TRUE;
2067
2068   htab = elf64_x86_64_hash_table (info);
2069   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2070   sym_hashes = elf_sym_hashes (input_bfd);
2071   local_got_offsets = elf_local_got_offsets (input_bfd);
2072   local_tlsdesc_gotents = elf64_x86_64_local_tlsdesc_gotent (input_bfd);
2073
2074   rel = relocs;
2075   relend = relocs + input_section->reloc_count;
2076   for (; rel < relend; rel++)
2077     {
2078       unsigned int r_type;
2079       reloc_howto_type *howto;
2080       unsigned long r_symndx;
2081       struct elf_link_hash_entry *h;
2082       Elf_Internal_Sym *sym;
2083       asection *sec;
2084       bfd_vma off, offplt;
2085       bfd_vma relocation;
2086       bfd_boolean unresolved_reloc;
2087       bfd_reloc_status_type r;
2088       int tls_type;
2089
2090       r_type = ELF64_R_TYPE (rel->r_info);
2091       if (r_type == (int) R_X86_64_GNU_VTINHERIT
2092           || r_type == (int) R_X86_64_GNU_VTENTRY)
2093         continue;
2094
2095       if (r_type >= R_X86_64_max)
2096         {
2097           bfd_set_error (bfd_error_bad_value);
2098           return FALSE;
2099         }
2100
2101       howto = x86_64_elf_howto_table + r_type;
2102       r_symndx = ELF64_R_SYM (rel->r_info);
2103       h = NULL;
2104       sym = NULL;
2105       sec = NULL;
2106       unresolved_reloc = FALSE;
2107       if (r_symndx < symtab_hdr->sh_info)
2108         {
2109           sym = local_syms + r_symndx;
2110           sec = local_sections[r_symndx];
2111
2112           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2113         }
2114       else
2115         {
2116           bfd_boolean warned;
2117
2118           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2119                                    r_symndx, symtab_hdr, sym_hashes,
2120                                    h, sec, relocation,
2121                                    unresolved_reloc, warned);
2122         }
2123       /* When generating a shared object, the relocations handled here are
2124          copied into the output file to be resolved at run time.  */
2125       switch (r_type)
2126         {
2127         asection *base_got;
2128         case R_X86_64_GOT32:
2129         case R_X86_64_GOT64:
2130           /* Relocation is to the entry for this symbol in the global
2131              offset table.  */
2132         case R_X86_64_GOTPCREL:
2133         case R_X86_64_GOTPCREL64:
2134           /* Use global offset table entry as symbol value.  */
2135         case R_X86_64_GOTPLT64:
2136           /* This is the same as GOT64 for relocation purposes, but
2137              indicates the existence of a PLT entry.  The difficulty is,
2138              that we must calculate the GOT slot offset from the PLT
2139              offset, if this symbol got a PLT entry (it was global).
2140              Additionally if it's computed from the PLT entry, then that
2141              GOT offset is relative to .got.plt, not to .got.  */
2142           base_got = htab->sgot;
2143
2144           if (htab->sgot == NULL)
2145             abort ();
2146
2147           if (h != NULL)
2148             {
2149               bfd_boolean dyn;
2150
2151               off = h->got.offset;
2152               if (h->needs_plt
2153                   && h->plt.offset != (bfd_vma)-1
2154                   && off == (bfd_vma)-1)
2155                 {
2156                   /* We can't use h->got.offset here to save
2157                      state, or even just remember the offset, as
2158                      finish_dynamic_symbol would use that as offset into
2159                      .got.  */
2160                   bfd_vma plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
2161                   off = (plt_index + 3) * GOT_ENTRY_SIZE;
2162                   base_got = htab->sgotplt;
2163                 }
2164
2165               dyn = htab->elf.dynamic_sections_created;
2166
2167               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2168                   || (info->shared
2169                       && SYMBOL_REFERENCES_LOCAL (info, h))
2170                   || (ELF_ST_VISIBILITY (h->other)
2171                       && h->root.type == bfd_link_hash_undefweak))
2172                 {
2173                   /* This is actually a static link, or it is a -Bsymbolic
2174                      link and the symbol is defined locally, or the symbol
2175                      was forced to be local because of a version file.  We
2176                      must initialize this entry in the global offset table.
2177                      Since the offset must always be a multiple of 8, we
2178                      use the least significant bit to record whether we
2179                      have initialized it already.
2180
2181                      When doing a dynamic link, we create a .rela.got
2182                      relocation entry to initialize the value.  This is
2183                      done in the finish_dynamic_symbol routine.  */
2184                   if ((off & 1) != 0)
2185                     off &= ~1;
2186                   else
2187                     {
2188                       bfd_put_64 (output_bfd, relocation,
2189                                   base_got->contents + off);
2190                       /* Note that this is harmless for the GOTPLT64 case,
2191                          as -1 | 1 still is -1.  */
2192                       h->got.offset |= 1;
2193                     }
2194                 }
2195               else
2196                 unresolved_reloc = FALSE;
2197             }
2198           else
2199             {
2200               if (local_got_offsets == NULL)
2201                 abort ();
2202
2203               off = local_got_offsets[r_symndx];
2204
2205               /* The offset must always be a multiple of 8.  We use
2206                  the least significant bit to record whether we have
2207                  already generated the necessary reloc.  */
2208               if ((off & 1) != 0)
2209                 off &= ~1;
2210               else
2211                 {
2212                   bfd_put_64 (output_bfd, relocation,
2213                               base_got->contents + off);
2214
2215                   if (info->shared)
2216                     {
2217                       asection *s;
2218                       Elf_Internal_Rela outrel;
2219                       bfd_byte *loc;
2220
2221                       /* We need to generate a R_X86_64_RELATIVE reloc
2222                          for the dynamic linker.  */
2223                       s = htab->srelgot;
2224                       if (s == NULL)
2225                         abort ();
2226
2227                       outrel.r_offset = (base_got->output_section->vma
2228                                          + base_got->output_offset
2229                                          + off);
2230                       outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
2231                       outrel.r_addend = relocation;
2232                       loc = s->contents;
2233                       loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
2234                       bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2235                     }
2236
2237                   local_got_offsets[r_symndx] |= 1;
2238                 }
2239             }
2240
2241           if (off >= (bfd_vma) -2)
2242             abort ();
2243
2244           relocation = base_got->output_section->vma
2245                        + base_got->output_offset + off;
2246           if (r_type != R_X86_64_GOTPCREL && r_type != R_X86_64_GOTPCREL64)
2247             relocation -= htab->sgotplt->output_section->vma
2248                           - htab->sgotplt->output_offset;
2249
2250           break;
2251
2252         case R_X86_64_GOTOFF64:
2253           /* Relocation is relative to the start of the global offset
2254              table.  */
2255
2256           /* Check to make sure it isn't a protected function symbol
2257              for shared library since it may not be local when used
2258              as function address.  */
2259           if (info->shared
2260               && h
2261               && h->def_regular
2262               && h->type == STT_FUNC
2263               && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
2264             {
2265               (*_bfd_error_handler)
2266                 (_("%B: relocation R_X86_64_GOTOFF64 against protected function `%s' can not be used when making a shared object"),
2267                  input_bfd, h->root.root.string);
2268               bfd_set_error (bfd_error_bad_value);
2269               return FALSE;
2270             }
2271
2272           /* Note that sgot is not involved in this
2273              calculation.  We always want the start of .got.plt.  If we
2274              defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
2275              permitted by the ABI, we might have to change this
2276              calculation.  */
2277           relocation -= htab->sgotplt->output_section->vma
2278                         + htab->sgotplt->output_offset;
2279           break;
2280
2281         case R_X86_64_GOTPC32:
2282         case R_X86_64_GOTPC64:
2283           /* Use global offset table as symbol value.  */
2284           relocation = htab->sgotplt->output_section->vma
2285                        + htab->sgotplt->output_offset;
2286           unresolved_reloc = FALSE;
2287           break;
2288
2289         case R_X86_64_PLTOFF64:
2290           /* Relocation is PLT entry relative to GOT.  For local
2291              symbols it's the symbol itself relative to GOT.  */
2292           if (h != NULL
2293               /* See PLT32 handling.  */
2294               && h->plt.offset != (bfd_vma) -1
2295               && htab->splt != NULL)
2296             {
2297               relocation = (htab->splt->output_section->vma
2298                             + htab->splt->output_offset
2299                             + h->plt.offset);
2300               unresolved_reloc = FALSE;
2301             }
2302
2303           relocation -= htab->sgotplt->output_section->vma
2304                         + htab->sgotplt->output_offset;
2305           break;
2306
2307         case R_X86_64_PLT32:
2308           /* Relocation is to the entry for this symbol in the
2309              procedure linkage table.  */
2310
2311           /* Resolve a PLT32 reloc against a local symbol directly,
2312              without using the procedure linkage table.  */
2313           if (h == NULL)
2314             break;
2315
2316           if (h->plt.offset == (bfd_vma) -1
2317               || htab->splt == NULL)
2318             {
2319               /* We didn't make a PLT entry for this symbol.  This
2320                  happens when statically linking PIC code, or when
2321                  using -Bsymbolic.  */
2322               break;
2323             }
2324
2325           relocation = (htab->splt->output_section->vma
2326                         + htab->splt->output_offset
2327                         + h->plt.offset);
2328           unresolved_reloc = FALSE;
2329           break;
2330
2331         case R_X86_64_PC8:
2332         case R_X86_64_PC16:
2333         case R_X86_64_PC32:
2334           if (info->shared
2335               && !SYMBOL_REFERENCES_LOCAL (info, h)
2336               && (input_section->flags & SEC_ALLOC) != 0
2337               && (input_section->flags & SEC_READONLY) != 0
2338               && (!h->def_regular
2339                   || r_type != R_X86_64_PC32
2340                   || h->type != STT_FUNC
2341                   || ELF_ST_VISIBILITY (h->other) != STV_PROTECTED
2342                   || !is_32bit_relative_branch (contents,
2343                                                 rel->r_offset)))
2344             {
2345               if (h->def_regular
2346                   && r_type == R_X86_64_PC32
2347                   && h->type == STT_FUNC
2348                   && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
2349                 (*_bfd_error_handler)
2350                    (_("%B: relocation R_X86_64_PC32 against protected function `%s' can not be used when making a shared object"),
2351                     input_bfd, h->root.root.string);
2352               else
2353                 (*_bfd_error_handler)
2354                   (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
2355                    input_bfd, x86_64_elf_howto_table[r_type].name,
2356                    h->root.root.string);
2357               bfd_set_error (bfd_error_bad_value);
2358               return FALSE;
2359             }
2360           /* Fall through.  */
2361
2362         case R_X86_64_8:
2363         case R_X86_64_16:
2364         case R_X86_64_32:
2365         case R_X86_64_PC64:
2366         case R_X86_64_64:
2367           /* FIXME: The ABI says the linker should make sure the value is
2368              the same when it's zeroextended to 64 bit.  */
2369
2370           /* r_symndx will be zero only for relocs against symbols
2371              from removed linkonce sections, or sections discarded by
2372              a linker script.  */
2373           if (r_symndx == 0)
2374             {
2375               _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
2376               break;
2377             }
2378
2379           if ((input_section->flags & SEC_ALLOC) == 0)
2380             break;
2381
2382           if ((info->shared
2383                && (h == NULL
2384                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2385                    || h->root.type != bfd_link_hash_undefweak)
2386                && ((r_type != R_X86_64_PC8
2387                     && r_type != R_X86_64_PC16
2388                     && r_type != R_X86_64_PC32
2389                     && r_type != R_X86_64_PC64)
2390                    || !SYMBOL_CALLS_LOCAL (info, h)))
2391               || (ELIMINATE_COPY_RELOCS
2392                   && !info->shared
2393                   && h != NULL
2394                   && h->dynindx != -1
2395                   && !h->non_got_ref
2396                   && ((h->def_dynamic
2397                        && !h->def_regular)
2398                       || h->root.type == bfd_link_hash_undefweak
2399                       || h->root.type == bfd_link_hash_undefined)))
2400             {
2401               Elf_Internal_Rela outrel;
2402               bfd_byte *loc;
2403               bfd_boolean skip, relocate;
2404               asection *sreloc;
2405
2406               /* When generating a shared object, these relocations
2407                  are copied into the output file to be resolved at run
2408                  time.  */
2409               skip = FALSE;
2410               relocate = FALSE;
2411
2412               outrel.r_offset =
2413                 _bfd_elf_section_offset (output_bfd, info, input_section,
2414                                          rel->r_offset);
2415               if (outrel.r_offset == (bfd_vma) -1)
2416                 skip = TRUE;
2417               else if (outrel.r_offset == (bfd_vma) -2)
2418                 skip = TRUE, relocate = TRUE;
2419
2420               outrel.r_offset += (input_section->output_section->vma
2421                                   + input_section->output_offset);
2422
2423               if (skip)
2424                 memset (&outrel, 0, sizeof outrel);
2425
2426               /* h->dynindx may be -1 if this symbol was marked to
2427                  become local.  */
2428               else if (h != NULL
2429                        && h->dynindx != -1
2430                        && (r_type == R_X86_64_PC8
2431                            || r_type == R_X86_64_PC16
2432                            || r_type == R_X86_64_PC32
2433                            || r_type == R_X86_64_PC64
2434                            || !info->shared
2435                            || !SYMBOLIC_BIND (info, h)
2436                            || !h->def_regular))
2437                 {
2438                   outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
2439                   outrel.r_addend = rel->r_addend;
2440                 }
2441               else
2442                 {
2443                   /* This symbol is local, or marked to become local.  */
2444                   if (r_type == R_X86_64_64)
2445                     {
2446                       relocate = TRUE;
2447                       outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
2448                       outrel.r_addend = relocation + rel->r_addend;
2449                     }
2450                   else
2451                     {
2452                       long sindx;
2453
2454                       if (bfd_is_abs_section (sec))
2455                         sindx = 0;
2456                       else if (sec == NULL || sec->owner == NULL)
2457                         {
2458                           bfd_set_error (bfd_error_bad_value);
2459                           return FALSE;
2460                         }
2461                       else
2462                         {
2463                           asection *osec;
2464
2465                           /* We are turning this relocation into one
2466                              against a section symbol.  It would be
2467                              proper to subtract the symbol's value,
2468                              osec->vma, from the emitted reloc addend,
2469                              but ld.so expects buggy relocs.  */
2470                           osec = sec->output_section;
2471                           sindx = elf_section_data (osec)->dynindx;
2472                           if (sindx == 0)
2473                             {
2474                               asection *oi = htab->elf.text_index_section;
2475                               sindx = elf_section_data (oi)->dynindx;
2476                             }
2477                           BFD_ASSERT (sindx != 0);
2478                         }
2479
2480                       outrel.r_info = ELF64_R_INFO (sindx, r_type);
2481                       outrel.r_addend = relocation + rel->r_addend;
2482                     }
2483                 }
2484
2485               sreloc = elf_section_data (input_section)->sreloc;
2486               if (sreloc == NULL)
2487                 abort ();
2488
2489               loc = sreloc->contents;
2490               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2491               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2492
2493               /* If this reloc is against an external symbol, we do
2494                  not want to fiddle with the addend.  Otherwise, we
2495                  need to include the symbol value so that it becomes
2496                  an addend for the dynamic reloc.  */
2497               if (! relocate)
2498                 continue;
2499             }
2500
2501           break;
2502
2503         case R_X86_64_TLSGD:
2504         case R_X86_64_GOTPC32_TLSDESC:
2505         case R_X86_64_TLSDESC_CALL:
2506         case R_X86_64_GOTTPOFF:
2507           r_type = elf64_x86_64_tls_transition (info, r_type, h == NULL);
2508           tls_type = GOT_UNKNOWN;
2509           if (h == NULL && local_got_offsets)
2510             tls_type = elf64_x86_64_local_got_tls_type (input_bfd) [r_symndx];
2511           else if (h != NULL)
2512             {
2513               tls_type = elf64_x86_64_hash_entry (h)->tls_type;
2514               if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
2515                 r_type = R_X86_64_TPOFF32;
2516             }
2517           if (r_type == R_X86_64_TLSGD
2518               || r_type == R_X86_64_GOTPC32_TLSDESC
2519               || r_type == R_X86_64_TLSDESC_CALL)
2520             {
2521               if (tls_type == GOT_TLS_IE)
2522                 r_type = R_X86_64_GOTTPOFF;
2523             }
2524
2525           if (r_type == R_X86_64_TPOFF32)
2526             {
2527               BFD_ASSERT (! unresolved_reloc);
2528               if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
2529                 {
2530                   unsigned int i;
2531                   static unsigned char tlsgd[8]
2532                     = { 0x66, 0x48, 0x8d, 0x3d, 0x66, 0x66, 0x48, 0xe8 };
2533
2534                   /* GD->LE transition.
2535                      .byte 0x66; leaq foo@tlsgd(%rip), %rdi
2536                      .word 0x6666; rex64; call __tls_get_addr@plt
2537                      Change it into:
2538                      movq %fs:0, %rax
2539                      leaq foo@tpoff(%rax), %rax */
2540                   BFD_ASSERT (rel->r_offset >= 4);
2541                   for (i = 0; i < 4; i++)
2542                     BFD_ASSERT (bfd_get_8 (input_bfd,
2543                                            contents + rel->r_offset - 4 + i)
2544                                 == tlsgd[i]);
2545                   BFD_ASSERT (rel->r_offset + 12 <= input_section->size);
2546                   for (i = 0; i < 4; i++)
2547                     BFD_ASSERT (bfd_get_8 (input_bfd,
2548                                            contents + rel->r_offset + 4 + i)
2549                                 == tlsgd[i+4]);
2550                   BFD_ASSERT (rel + 1 < relend);
2551                   BFD_ASSERT (ELF64_R_TYPE (rel[1].r_info) == R_X86_64_PLT32);
2552                   memcpy (contents + rel->r_offset - 4,
2553                           "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
2554                           16);
2555                   bfd_put_32 (output_bfd, tpoff (info, relocation),
2556                               contents + rel->r_offset + 8);
2557                   /* Skip R_X86_64_PLT32.  */
2558                   rel++;
2559                   continue;
2560                 }
2561               else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
2562                 {
2563                   /* GDesc -> LE transition.
2564                      It's originally something like:
2565                      leaq x@tlsdesc(%rip), %rax
2566
2567                      Change it to:
2568                      movl $x@tpoff, %rax
2569
2570                      Registers other than %rax may be set up here.  */
2571
2572                   unsigned int val, type, type2;
2573                   bfd_vma roff;
2574
2575                   /* First, make sure it's a leaq adding rip to a
2576                      32-bit offset into any register, although it's
2577                      probably almost always going to be rax.  */
2578                   roff = rel->r_offset;
2579                   BFD_ASSERT (roff >= 3);
2580                   type = bfd_get_8 (input_bfd, contents + roff - 3);
2581                   BFD_ASSERT ((type & 0xfb) == 0x48);
2582                   type2 = bfd_get_8 (input_bfd, contents + roff - 2);
2583                   BFD_ASSERT (type2 == 0x8d);
2584                   val = bfd_get_8 (input_bfd, contents + roff - 1);
2585                   BFD_ASSERT ((val & 0xc7) == 0x05);
2586                   BFD_ASSERT (roff + 4 <= input_section->size);
2587
2588                   /* Now modify the instruction as appropriate.  */
2589                   bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
2590                              contents + roff - 3);
2591                   bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
2592                   bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
2593                              contents + roff - 1);
2594                   bfd_put_32 (output_bfd, tpoff (info, relocation),
2595                               contents + roff);
2596                   continue;
2597                 }
2598               else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
2599                 {
2600                   /* GDesc -> LE transition.
2601                      It's originally:
2602                      call *(%rax)
2603                      Turn it into:
2604                      nop; nop.  */
2605
2606                   unsigned int val, type;
2607                   bfd_vma roff;
2608
2609                   /* First, make sure it's a call *(%rax).  */
2610                   roff = rel->r_offset;
2611                   BFD_ASSERT (roff + 2 <= input_section->size);
2612                   type = bfd_get_8 (input_bfd, contents + roff);
2613                   BFD_ASSERT (type == 0xff);
2614                   val = bfd_get_8 (input_bfd, contents + roff + 1);
2615                   BFD_ASSERT (val == 0x10);
2616
2617                   /* Now modify the instruction as appropriate.  Use
2618                      xchg %ax,%ax instead of 2 nops.  */
2619                   bfd_put_8 (output_bfd, 0x66, contents + roff);
2620                   bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
2621                   continue;
2622                 }
2623               else
2624                 {
2625                   unsigned int val, type, reg;
2626
2627                   /* IE->LE transition:
2628                      Originally it can be one of:
2629                      movq foo@gottpoff(%rip), %reg
2630                      addq foo@gottpoff(%rip), %reg
2631                      We change it into:
2632                      movq $foo, %reg
2633                      leaq foo(%reg), %reg
2634                      addq $foo, %reg.  */
2635                   BFD_ASSERT (rel->r_offset >= 3);
2636                   val = bfd_get_8 (input_bfd, contents + rel->r_offset - 3);
2637                   BFD_ASSERT (val == 0x48 || val == 0x4c);
2638                   type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
2639                   BFD_ASSERT (type == 0x8b || type == 0x03);
2640                   reg = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
2641                   BFD_ASSERT ((reg & 0xc7) == 5);
2642                   reg >>= 3;
2643                   BFD_ASSERT (rel->r_offset + 4 <= input_section->size);
2644                   if (type == 0x8b)
2645                     {
2646                       /* movq */
2647                       if (val == 0x4c)
2648                         bfd_put_8 (output_bfd, 0x49,
2649                                    contents + rel->r_offset - 3);
2650                       bfd_put_8 (output_bfd, 0xc7,
2651                                  contents + rel->r_offset - 2);
2652                       bfd_put_8 (output_bfd, 0xc0 | reg,
2653                                  contents + rel->r_offset - 1);
2654                     }
2655                   else if (reg == 4)
2656                     {
2657                       /* addq -> addq - addressing with %rsp/%r12 is
2658                          special  */
2659                       if (val == 0x4c)
2660                         bfd_put_8 (output_bfd, 0x49,
2661                                    contents + rel->r_offset - 3);
2662                       bfd_put_8 (output_bfd, 0x81,
2663                                  contents + rel->r_offset - 2);
2664                       bfd_put_8 (output_bfd, 0xc0 | reg,
2665                                  contents + rel->r_offset - 1);
2666                     }
2667                   else
2668                     {
2669                       /* addq -> leaq */
2670                       if (val == 0x4c)
2671                         bfd_put_8 (output_bfd, 0x4d,
2672                                    contents + rel->r_offset - 3);
2673                       bfd_put_8 (output_bfd, 0x8d,
2674                                  contents + rel->r_offset - 2);
2675                       bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
2676                                  contents + rel->r_offset - 1);
2677                     }
2678                   bfd_put_32 (output_bfd, tpoff (info, relocation),
2679                               contents + rel->r_offset);
2680                   continue;
2681                 }
2682             }
2683
2684           if (htab->sgot == NULL)
2685             abort ();
2686
2687           if (h != NULL)
2688             {
2689               off = h->got.offset;
2690               offplt = elf64_x86_64_hash_entry (h)->tlsdesc_got;
2691             }
2692           else
2693             {
2694               if (local_got_offsets == NULL)
2695                 abort ();
2696
2697               off = local_got_offsets[r_symndx];
2698               offplt = local_tlsdesc_gotents[r_symndx];
2699             }
2700
2701           if ((off & 1) != 0)
2702             off &= ~1;
2703           else
2704             {
2705               Elf_Internal_Rela outrel;
2706               bfd_byte *loc;
2707               int dr_type, indx;
2708               asection *sreloc;
2709
2710               if (htab->srelgot == NULL)
2711                 abort ();
2712
2713               indx = h && h->dynindx != -1 ? h->dynindx : 0;
2714
2715               if (GOT_TLS_GDESC_P (tls_type))
2716                 {
2717                   outrel.r_info = ELF64_R_INFO (indx, R_X86_64_TLSDESC);
2718                   BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
2719                               + 2 * GOT_ENTRY_SIZE <= htab->sgotplt->size);
2720                   outrel.r_offset = (htab->sgotplt->output_section->vma
2721                                      + htab->sgotplt->output_offset
2722                                      + offplt
2723                                      + htab->sgotplt_jump_table_size);
2724                   sreloc = htab->srelplt;
2725                   loc = sreloc->contents;
2726                   loc += sreloc->reloc_count++
2727                     * sizeof (Elf64_External_Rela);
2728                   BFD_ASSERT (loc + sizeof (Elf64_External_Rela)
2729                               <= sreloc->contents + sreloc->size);
2730                   if (indx == 0)
2731                     outrel.r_addend = relocation - dtpoff_base (info);
2732                   else
2733                     outrel.r_addend = 0;
2734                   bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2735                 }
2736
2737               sreloc = htab->srelgot;
2738
2739               outrel.r_offset = (htab->sgot->output_section->vma
2740                                  + htab->sgot->output_offset + off);
2741
2742               if (GOT_TLS_GD_P (tls_type))
2743                 dr_type = R_X86_64_DTPMOD64;
2744               else if (GOT_TLS_GDESC_P (tls_type))
2745                 goto dr_done;
2746               else
2747                 dr_type = R_X86_64_TPOFF64;
2748
2749               bfd_put_64 (output_bfd, 0, htab->sgot->contents + off);
2750               outrel.r_addend = 0;
2751               if ((dr_type == R_X86_64_TPOFF64
2752                    || dr_type == R_X86_64_TLSDESC) && indx == 0)
2753                 outrel.r_addend = relocation - dtpoff_base (info);
2754               outrel.r_info = ELF64_R_INFO (indx, dr_type);
2755
2756               loc = sreloc->contents;
2757               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2758               BFD_ASSERT (loc + sizeof (Elf64_External_Rela)
2759                           <= sreloc->contents + sreloc->size);
2760               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2761
2762               if (GOT_TLS_GD_P (tls_type))
2763                 {
2764                   if (indx == 0)
2765                     {
2766                       BFD_ASSERT (! unresolved_reloc);
2767                       bfd_put_64 (output_bfd,
2768                                   relocation - dtpoff_base (info),
2769                                   htab->sgot->contents + off + GOT_ENTRY_SIZE);
2770                     }
2771                   else
2772                     {
2773                       bfd_put_64 (output_bfd, 0,
2774                                   htab->sgot->contents + off + GOT_ENTRY_SIZE);
2775                       outrel.r_info = ELF64_R_INFO (indx,
2776                                                     R_X86_64_DTPOFF64);
2777                       outrel.r_offset += GOT_ENTRY_SIZE;
2778                       sreloc->reloc_count++;
2779                       loc += sizeof (Elf64_External_Rela);
2780                       BFD_ASSERT (loc + sizeof (Elf64_External_Rela)
2781                                   <= sreloc->contents + sreloc->size);
2782                       bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2783                     }
2784                 }
2785
2786             dr_done:
2787               if (h != NULL)
2788                 h->got.offset |= 1;
2789               else
2790                 local_got_offsets[r_symndx] |= 1;
2791             }
2792
2793           if (off >= (bfd_vma) -2
2794               && ! GOT_TLS_GDESC_P (tls_type))
2795             abort ();
2796           if (r_type == ELF64_R_TYPE (rel->r_info))
2797             {
2798               if (r_type == R_X86_64_GOTPC32_TLSDESC
2799                   || r_type == R_X86_64_TLSDESC_CALL)
2800                 relocation = htab->sgotplt->output_section->vma
2801                   + htab->sgotplt->output_offset
2802                   + offplt + htab->sgotplt_jump_table_size;
2803               else
2804                 relocation = htab->sgot->output_section->vma
2805                   + htab->sgot->output_offset + off;
2806               unresolved_reloc = FALSE;
2807             }
2808           else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
2809             {
2810               unsigned int i;
2811               static unsigned char tlsgd[8]
2812                 = { 0x66, 0x48, 0x8d, 0x3d, 0x66, 0x66, 0x48, 0xe8 };
2813
2814               /* GD->IE transition.
2815                  .byte 0x66; leaq foo@tlsgd(%rip), %rdi
2816                  .word 0x6666; rex64; call __tls_get_addr@plt
2817                  Change it into:
2818                  movq %fs:0, %rax
2819                  addq foo@gottpoff(%rip), %rax */
2820               BFD_ASSERT (rel->r_offset >= 4);
2821               for (i = 0; i < 4; i++)
2822                 BFD_ASSERT (bfd_get_8 (input_bfd,
2823                                        contents + rel->r_offset - 4 + i)
2824                             == tlsgd[i]);
2825               BFD_ASSERT (rel->r_offset + 12 <= input_section->size);
2826               for (i = 0; i < 4; i++)
2827                 BFD_ASSERT (bfd_get_8 (input_bfd,
2828                                        contents + rel->r_offset + 4 + i)
2829                             == tlsgd[i+4]);
2830               BFD_ASSERT (rel + 1 < relend);
2831               BFD_ASSERT (ELF64_R_TYPE (rel[1].r_info) == R_X86_64_PLT32);
2832               memcpy (contents + rel->r_offset - 4,
2833                       "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
2834                       16);
2835
2836               relocation = (htab->sgot->output_section->vma
2837                             + htab->sgot->output_offset + off
2838                             - rel->r_offset
2839                             - input_section->output_section->vma
2840                             - input_section->output_offset
2841                             - 12);
2842               bfd_put_32 (output_bfd, relocation,
2843                           contents + rel->r_offset + 8);
2844               /* Skip R_X86_64_PLT32.  */
2845               rel++;
2846               continue;
2847             }
2848           else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
2849             {
2850               /* GDesc -> IE transition.
2851                  It's originally something like:
2852                  leaq x@tlsdesc(%rip), %rax
2853
2854                  Change it to:
2855                  movq x@gottpoff(%rip), %rax # before nop; nop
2856
2857                  Registers other than %rax may be set up here.  */
2858
2859               unsigned int val, type, type2;
2860               bfd_vma roff;
2861
2862               /* First, make sure it's a leaq adding rip to a 32-bit
2863                  offset into any register, although it's probably
2864                  almost always going to be rax.  */
2865               roff = rel->r_offset;
2866               BFD_ASSERT (roff >= 3);
2867               type = bfd_get_8 (input_bfd, contents + roff - 3);
2868               BFD_ASSERT ((type & 0xfb) == 0x48);
2869               type2 = bfd_get_8 (input_bfd, contents + roff - 2);
2870               BFD_ASSERT (type2 == 0x8d);
2871               val = bfd_get_8 (input_bfd, contents + roff - 1);
2872               BFD_ASSERT ((val & 0xc7) == 0x05);
2873               BFD_ASSERT (roff + 4 <= input_section->size);
2874
2875               /* Now modify the instruction as appropriate.  */
2876               /* To turn a leaq into a movq in the form we use it, it
2877                  suffices to change the second byte from 0x8d to
2878                  0x8b.  */
2879               bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
2880
2881               bfd_put_32 (output_bfd,
2882                           htab->sgot->output_section->vma
2883                           + htab->sgot->output_offset + off
2884                           - rel->r_offset
2885                           - input_section->output_section->vma
2886                           - input_section->output_offset
2887                           - 4,
2888                           contents + roff);
2889               continue;
2890             }
2891           else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
2892             {
2893               /* GDesc -> IE transition.
2894                  It's originally:
2895                  call *(%rax)
2896
2897                  Change it to:
2898                  nop; nop.  */
2899
2900               unsigned int val, type;
2901               bfd_vma roff;
2902
2903               /* First, make sure it's a call *(%eax).  */
2904               roff = rel->r_offset;
2905               BFD_ASSERT (roff + 2 <= input_section->size);
2906               type = bfd_get_8 (input_bfd, contents + roff);
2907               BFD_ASSERT (type == 0xff);
2908               val = bfd_get_8 (input_bfd, contents + roff + 1);
2909               BFD_ASSERT (val == 0x10);
2910
2911               /* Now modify the instruction as appropriate.  Use
2912                  xchg %ax,%ax instead of 2 nops.  */
2913               bfd_put_8 (output_bfd, 0x66, contents + roff);
2914               bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
2915
2916               continue;
2917             }
2918           else
2919             BFD_ASSERT (FALSE);
2920           break;
2921
2922         case R_X86_64_TLSLD:
2923           if (! info->shared)
2924             {
2925               /* LD->LE transition:
2926                  Ensure it is:
2927                  leaq foo@tlsld(%rip), %rdi; call __tls_get_addr@plt.
2928                  We change it into:
2929                  .word 0x6666; .byte 0x66; movl %fs:0, %rax.  */
2930               BFD_ASSERT (rel->r_offset >= 3);
2931               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 3)
2932                           == 0x48);
2933               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 2)
2934                           == 0x8d);
2935               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 1)
2936                           == 0x3d);
2937               BFD_ASSERT (rel->r_offset + 9 <= input_section->size);
2938               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4)
2939                           == 0xe8);
2940               BFD_ASSERT (rel + 1 < relend);
2941               BFD_ASSERT (ELF64_R_TYPE (rel[1].r_info) == R_X86_64_PLT32);
2942               memcpy (contents + rel->r_offset - 3,
2943                       "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
2944               /* Skip R_X86_64_PLT32.  */
2945               rel++;
2946               continue;
2947             }
2948
2949           if (htab->sgot == NULL)
2950             abort ();
2951
2952           off = htab->tls_ld_got.offset;
2953           if (off & 1)
2954             off &= ~1;
2955           else
2956             {
2957               Elf_Internal_Rela outrel;
2958               bfd_byte *loc;
2959
2960               if (htab->srelgot == NULL)
2961                 abort ();
2962
2963               outrel.r_offset = (htab->sgot->output_section->vma
2964                                  + htab->sgot->output_offset + off);
2965
2966               bfd_put_64 (output_bfd, 0,
2967                           htab->sgot->contents + off);
2968               bfd_put_64 (output_bfd, 0,
2969                           htab->sgot->contents + off + GOT_ENTRY_SIZE);
2970               outrel.r_info = ELF64_R_INFO (0, R_X86_64_DTPMOD64);
2971               outrel.r_addend = 0;
2972               loc = htab->srelgot->contents;
2973               loc += htab->srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
2974               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2975               htab->tls_ld_got.offset |= 1;
2976             }
2977           relocation = htab->sgot->output_section->vma
2978                        + htab->sgot->output_offset + off;
2979           unresolved_reloc = FALSE;
2980           break;
2981
2982         case R_X86_64_DTPOFF32:
2983           if (info->shared || (input_section->flags & SEC_CODE) == 0)
2984             relocation -= dtpoff_base (info);
2985           else
2986             relocation = tpoff (info, relocation);
2987           break;
2988
2989         case R_X86_64_TPOFF32:
2990           BFD_ASSERT (! info->shared);
2991           relocation = tpoff (info, relocation);
2992           break;
2993
2994         default:
2995           break;
2996         }
2997
2998       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2999          because such sections are not SEC_ALLOC and thus ld.so will
3000          not process them.  */
3001       if (unresolved_reloc
3002           && !((input_section->flags & SEC_DEBUGGING) != 0
3003                && h->def_dynamic))
3004         (*_bfd_error_handler)
3005           (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3006            input_bfd,
3007            input_section,
3008            (long) rel->r_offset,
3009            howto->name,
3010            h->root.root.string);
3011
3012       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3013                                     contents, rel->r_offset,
3014                                     relocation, rel->r_addend);
3015
3016       if (r != bfd_reloc_ok)
3017         {
3018           const char *name;
3019
3020           if (h != NULL)
3021             name = h->root.root.string;
3022           else
3023             {
3024               name = bfd_elf_string_from_elf_section (input_bfd,
3025                                                       symtab_hdr->sh_link,
3026                                                       sym->st_name);
3027               if (name == NULL)
3028                 return FALSE;
3029               if (*name == '\0')
3030                 name = bfd_section_name (input_bfd, sec);
3031             }
3032
3033           if (r == bfd_reloc_overflow)
3034             {
3035               if (! ((*info->callbacks->reloc_overflow)
3036                      (info, (h ? &h->root : NULL), name, howto->name,
3037                       (bfd_vma) 0, input_bfd, input_section,
3038                       rel->r_offset)))
3039                 return FALSE;
3040             }
3041           else
3042             {
3043               (*_bfd_error_handler)
3044                 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
3045                  input_bfd, input_section,
3046                  (long) rel->r_offset, name, (int) r);
3047               return FALSE;
3048             }
3049         }
3050     }
3051
3052   return TRUE;
3053 }
3054
3055 /* Finish up dynamic symbol handling.  We set the contents of various
3056    dynamic sections here.  */
3057
3058 static bfd_boolean
3059 elf64_x86_64_finish_dynamic_symbol (bfd *output_bfd,
3060                                     struct bfd_link_info *info,
3061                                     struct elf_link_hash_entry *h,
3062                                     Elf_Internal_Sym *sym)
3063 {
3064   struct elf64_x86_64_link_hash_table *htab;
3065
3066   htab = elf64_x86_64_hash_table (info);
3067
3068   if (h->plt.offset != (bfd_vma) -1)
3069     {
3070       bfd_vma plt_index;
3071       bfd_vma got_offset;
3072       Elf_Internal_Rela rela;
3073       bfd_byte *loc;
3074
3075       /* This symbol has an entry in the procedure linkage table.  Set
3076          it up.  */
3077       if (h->dynindx == -1
3078           || htab->splt == NULL
3079           || htab->sgotplt == NULL
3080           || htab->srelplt == NULL)
3081         abort ();
3082
3083       /* Get the index in the procedure linkage table which
3084          corresponds to this symbol.  This is the index of this symbol
3085          in all the symbols for which we are making plt entries.  The
3086          first entry in the procedure linkage table is reserved.  */
3087       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
3088
3089       /* Get the offset into the .got table of the entry that
3090          corresponds to this function.  Each .got entry is GOT_ENTRY_SIZE
3091          bytes. The first three are reserved for the dynamic linker.  */
3092       got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
3093
3094       /* Fill in the entry in the procedure linkage table.  */
3095       memcpy (htab->splt->contents + h->plt.offset, elf64_x86_64_plt_entry,
3096               PLT_ENTRY_SIZE);
3097
3098       /* Insert the relocation positions of the plt section.  The magic
3099          numbers at the end of the statements are the positions of the
3100          relocations in the plt section.  */
3101       /* Put offset for jmp *name@GOTPCREL(%rip), since the
3102          instruction uses 6 bytes, subtract this value.  */
3103       bfd_put_32 (output_bfd,
3104                       (htab->sgotplt->output_section->vma
3105                        + htab->sgotplt->output_offset
3106                        + got_offset
3107                        - htab->splt->output_section->vma
3108                        - htab->splt->output_offset
3109                        - h->plt.offset
3110                        - 6),
3111                   htab->splt->contents + h->plt.offset + 2);
3112       /* Put relocation index.  */
3113       bfd_put_32 (output_bfd, plt_index,
3114                   htab->splt->contents + h->plt.offset + 7);
3115       /* Put offset for jmp .PLT0.  */
3116       bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
3117                   htab->splt->contents + h->plt.offset + 12);
3118
3119       /* Fill in the entry in the global offset table, initially this
3120          points to the pushq instruction in the PLT which is at offset 6.  */
3121       bfd_put_64 (output_bfd, (htab->splt->output_section->vma
3122                                + htab->splt->output_offset
3123                                + h->plt.offset + 6),
3124                   htab->sgotplt->contents + got_offset);
3125
3126       /* Fill in the entry in the .rela.plt section.  */
3127       rela.r_offset = (htab->sgotplt->output_section->vma
3128                        + htab->sgotplt->output_offset
3129                        + got_offset);
3130       rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_JUMP_SLOT);
3131       rela.r_addend = 0;
3132       loc = htab->srelplt->contents + plt_index * sizeof (Elf64_External_Rela);
3133       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3134
3135       if (!h->def_regular)
3136         {
3137           /* Mark the symbol as undefined, rather than as defined in
3138              the .plt section.  Leave the value if there were any
3139              relocations where pointer equality matters (this is a clue
3140              for the dynamic linker, to make function pointer
3141              comparisons work between an application and shared
3142              library), otherwise set it to zero.  If a function is only
3143              called from a binary, there is no need to slow down
3144              shared libraries because of that.  */
3145           sym->st_shndx = SHN_UNDEF;
3146           if (!h->pointer_equality_needed)
3147             sym->st_value = 0;
3148         }
3149     }
3150
3151   if (h->got.offset != (bfd_vma) -1
3152       && ! GOT_TLS_GD_ANY_P (elf64_x86_64_hash_entry (h)->tls_type)
3153       && elf64_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE)
3154     {
3155       Elf_Internal_Rela rela;
3156       bfd_byte *loc;
3157
3158       /* This symbol has an entry in the global offset table.  Set it
3159          up.  */
3160       if (htab->sgot == NULL || htab->srelgot == NULL)
3161         abort ();
3162
3163       rela.r_offset = (htab->sgot->output_section->vma
3164                        + htab->sgot->output_offset
3165                        + (h->got.offset &~ (bfd_vma) 1));
3166
3167       /* If this is a static link, or it is a -Bsymbolic link and the
3168          symbol is defined locally or was forced to be local because
3169          of a version file, we just want to emit a RELATIVE reloc.
3170          The entry in the global offset table will already have been
3171          initialized in the relocate_section function.  */
3172       if (info->shared
3173           && SYMBOL_REFERENCES_LOCAL (info, h))
3174         {
3175           BFD_ASSERT((h->got.offset & 1) != 0);
3176           rela.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
3177           rela.r_addend = (h->root.u.def.value
3178                            + h->root.u.def.section->output_section->vma
3179                            + h->root.u.def.section->output_offset);
3180         }
3181       else
3182         {
3183           BFD_ASSERT((h->got.offset & 1) == 0);
3184           bfd_put_64 (output_bfd, (bfd_vma) 0,
3185                       htab->sgot->contents + h->got.offset);
3186           rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_GLOB_DAT);
3187           rela.r_addend = 0;
3188         }
3189
3190       loc = htab->srelgot->contents;
3191       loc += htab->srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
3192       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3193     }
3194
3195   if (h->needs_copy)
3196     {
3197       Elf_Internal_Rela rela;
3198       bfd_byte *loc;
3199
3200       /* This symbol needs a copy reloc.  Set it up.  */
3201
3202       if (h->dynindx == -1
3203           || (h->root.type != bfd_link_hash_defined
3204               && h->root.type != bfd_link_hash_defweak)
3205           || htab->srelbss == NULL)
3206         abort ();
3207
3208       rela.r_offset = (h->root.u.def.value
3209                        + h->root.u.def.section->output_section->vma
3210                        + h->root.u.def.section->output_offset);
3211       rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_COPY);
3212       rela.r_addend = 0;
3213       loc = htab->srelbss->contents;
3214       loc += htab->srelbss->reloc_count++ * sizeof (Elf64_External_Rela);
3215       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3216     }
3217
3218   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
3219   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3220       || h == htab->elf.hgot)
3221     sym->st_shndx = SHN_ABS;
3222
3223   return TRUE;
3224 }
3225
3226 /* Used to decide how to sort relocs in an optimal manner for the
3227    dynamic linker, before writing them out.  */
3228
3229 static enum elf_reloc_type_class
3230 elf64_x86_64_reloc_type_class (const Elf_Internal_Rela *rela)
3231 {
3232   switch ((int) ELF64_R_TYPE (rela->r_info))
3233     {
3234     case R_X86_64_RELATIVE:
3235       return reloc_class_relative;
3236     case R_X86_64_JUMP_SLOT:
3237       return reloc_class_plt;
3238     case R_X86_64_COPY:
3239       return reloc_class_copy;
3240     default:
3241       return reloc_class_normal;
3242     }
3243 }
3244
3245 /* Finish up the dynamic sections.  */
3246
3247 static bfd_boolean
3248 elf64_x86_64_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
3249 {
3250   struct elf64_x86_64_link_hash_table *htab;
3251   bfd *dynobj;
3252   asection *sdyn;
3253
3254   htab = elf64_x86_64_hash_table (info);
3255   dynobj = htab->elf.dynobj;
3256   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3257
3258   if (htab->elf.dynamic_sections_created)
3259     {
3260       Elf64_External_Dyn *dyncon, *dynconend;
3261
3262       if (sdyn == NULL || htab->sgot == NULL)
3263         abort ();
3264
3265       dyncon = (Elf64_External_Dyn *) sdyn->contents;
3266       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
3267       for (; dyncon < dynconend; dyncon++)
3268         {
3269           Elf_Internal_Dyn dyn;
3270           asection *s;
3271
3272           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3273
3274           switch (dyn.d_tag)
3275             {
3276             default:
3277               continue;
3278
3279             case DT_PLTGOT:
3280               s = htab->sgotplt;
3281               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3282               break;
3283
3284             case DT_JMPREL:
3285               dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
3286               break;
3287
3288             case DT_PLTRELSZ:
3289               s = htab->srelplt->output_section;
3290               dyn.d_un.d_val = s->size;
3291               break;
3292
3293             case DT_RELASZ:
3294               /* The procedure linkage table relocs (DT_JMPREL) should
3295                  not be included in the overall relocs (DT_RELA).
3296                  Therefore, we override the DT_RELASZ entry here to
3297                  make it not include the JMPREL relocs.  Since the
3298                  linker script arranges for .rela.plt to follow all
3299                  other relocation sections, we don't have to worry
3300                  about changing the DT_RELA entry.  */
3301               if (htab->srelplt != NULL)
3302                 {
3303                   s = htab->srelplt->output_section;
3304                   dyn.d_un.d_val -= s->size;
3305                 }
3306               break;
3307
3308             case DT_TLSDESC_PLT:
3309               s = htab->splt;
3310               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
3311                 + htab->tlsdesc_plt;
3312               break;
3313
3314             case DT_TLSDESC_GOT:
3315               s = htab->sgot;
3316               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
3317                 + htab->tlsdesc_got;
3318               break;
3319             }
3320
3321           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3322         }
3323
3324       /* Fill in the special first entry in the procedure linkage table.  */
3325       if (htab->splt && htab->splt->size > 0)
3326         {
3327           /* Fill in the first entry in the procedure linkage table.  */
3328           memcpy (htab->splt->contents, elf64_x86_64_plt0_entry,
3329                   PLT_ENTRY_SIZE);
3330           /* Add offset for pushq GOT+8(%rip), since the instruction
3331              uses 6 bytes subtract this value.  */
3332           bfd_put_32 (output_bfd,
3333                       (htab->sgotplt->output_section->vma
3334                        + htab->sgotplt->output_offset
3335                        + 8
3336                        - htab->splt->output_section->vma
3337                        - htab->splt->output_offset
3338                        - 6),
3339                       htab->splt->contents + 2);
3340           /* Add offset for jmp *GOT+16(%rip). The 12 is the offset to
3341              the end of the instruction.  */
3342           bfd_put_32 (output_bfd,
3343                       (htab->sgotplt->output_section->vma
3344                        + htab->sgotplt->output_offset
3345                        + 16
3346                        - htab->splt->output_section->vma
3347                        - htab->splt->output_offset
3348                        - 12),
3349                       htab->splt->contents + 8);
3350
3351           elf_section_data (htab->splt->output_section)->this_hdr.sh_entsize =
3352             PLT_ENTRY_SIZE;
3353
3354           if (htab->tlsdesc_plt)
3355             {
3356               bfd_put_64 (output_bfd, (bfd_vma) 0,
3357                           htab->sgot->contents + htab->tlsdesc_got);
3358
3359               memcpy (htab->splt->contents + htab->tlsdesc_plt,
3360                       elf64_x86_64_plt0_entry,
3361                       PLT_ENTRY_SIZE);
3362
3363               /* Add offset for pushq GOT+8(%rip), since the
3364                  instruction uses 6 bytes subtract this value.  */
3365               bfd_put_32 (output_bfd,
3366                           (htab->sgotplt->output_section->vma
3367                            + htab->sgotplt->output_offset
3368                            + 8
3369                            - htab->splt->output_section->vma
3370                            - htab->splt->output_offset
3371                            - htab->tlsdesc_plt
3372                            - 6),
3373                           htab->splt->contents + htab->tlsdesc_plt + 2);
3374               /* Add offset for jmp *GOT+TDG(%rip), where TGD stands for
3375                  htab->tlsdesc_got. The 12 is the offset to the end of
3376                  the instruction.  */
3377               bfd_put_32 (output_bfd,
3378                           (htab->sgot->output_section->vma
3379                            + htab->sgot->output_offset
3380                            + htab->tlsdesc_got
3381                            - htab->splt->output_section->vma
3382                            - htab->splt->output_offset
3383                            - htab->tlsdesc_plt
3384                            - 12),
3385                           htab->splt->contents + htab->tlsdesc_plt + 8);
3386             }
3387         }
3388     }
3389
3390   if (htab->sgotplt)
3391     {
3392       /* Fill in the first three entries in the global offset table.  */
3393       if (htab->sgotplt->size > 0)
3394         {
3395           /* Set the first entry in the global offset table to the address of
3396              the dynamic section.  */
3397           if (sdyn == NULL)
3398             bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents);
3399           else
3400             bfd_put_64 (output_bfd,
3401                         sdyn->output_section->vma + sdyn->output_offset,
3402                         htab->sgotplt->contents);
3403           /* Write GOT[1] and GOT[2], needed for the dynamic linker.  */
3404           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + GOT_ENTRY_SIZE);
3405           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + GOT_ENTRY_SIZE*2);
3406         }
3407
3408       elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize =
3409         GOT_ENTRY_SIZE;
3410     }
3411
3412   if (htab->sgot && htab->sgot->size > 0)
3413     elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize
3414       = GOT_ENTRY_SIZE;
3415
3416   return TRUE;
3417 }
3418
3419 /* Return address for Ith PLT stub in section PLT, for relocation REL
3420    or (bfd_vma) -1 if it should not be included.  */
3421
3422 static bfd_vma
3423 elf64_x86_64_plt_sym_val (bfd_vma i, const asection *plt,
3424                           const arelent *rel ATTRIBUTE_UNUSED)
3425 {
3426   return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
3427 }
3428
3429 /* Handle an x86-64 specific section when reading an object file.  This
3430    is called when elfcode.h finds a section with an unknown type.  */
3431
3432 static bfd_boolean
3433 elf64_x86_64_section_from_shdr (bfd *abfd,
3434                                 Elf_Internal_Shdr *hdr,
3435                                 const char *name,
3436                                 int shindex)
3437 {
3438   if (hdr->sh_type != SHT_X86_64_UNWIND)
3439     return FALSE;
3440
3441   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
3442     return FALSE;
3443
3444   return TRUE;
3445 }
3446
3447 /* Hook called by the linker routine which adds symbols from an object
3448    file.  We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
3449    of .bss.  */
3450
3451 static bfd_boolean
3452 elf64_x86_64_add_symbol_hook (bfd *abfd,
3453                               struct bfd_link_info *info ATTRIBUTE_UNUSED,
3454                               Elf_Internal_Sym *sym,
3455                               const char **namep ATTRIBUTE_UNUSED,
3456                               flagword *flagsp ATTRIBUTE_UNUSED,
3457                               asection **secp, bfd_vma *valp)
3458 {
3459   asection *lcomm;
3460
3461   switch (sym->st_shndx)
3462     {
3463     case SHN_X86_64_LCOMMON:
3464       lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
3465       if (lcomm == NULL)
3466         {
3467           lcomm = bfd_make_section_with_flags (abfd,
3468                                                "LARGE_COMMON",
3469                                                (SEC_ALLOC
3470                                                 | SEC_IS_COMMON
3471                                                 | SEC_LINKER_CREATED));
3472           if (lcomm == NULL)
3473             return FALSE;
3474           elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
3475         }
3476       *secp = lcomm;
3477       *valp = sym->st_size;
3478       break;
3479     }
3480   return TRUE;
3481 }
3482
3483
3484 /* Given a BFD section, try to locate the corresponding ELF section
3485    index.  */
3486
3487 static bfd_boolean
3488 elf64_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
3489                                            asection *sec, int *index)
3490 {
3491   if (sec == &_bfd_elf_large_com_section)
3492     {
3493       *index = SHN_X86_64_LCOMMON;
3494       return TRUE;
3495     }
3496   return FALSE;
3497 }
3498
3499 /* Process a symbol.  */
3500
3501 static void
3502 elf64_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
3503                                 asymbol *asym)
3504 {
3505   elf_symbol_type *elfsym = (elf_symbol_type *) asym;
3506
3507   switch (elfsym->internal_elf_sym.st_shndx)
3508     {
3509     case SHN_X86_64_LCOMMON:
3510       asym->section = &_bfd_elf_large_com_section;
3511       asym->value = elfsym->internal_elf_sym.st_size;
3512       /* Common symbol doesn't set BSF_GLOBAL.  */
3513       asym->flags &= ~BSF_GLOBAL;
3514       break;
3515     }
3516 }
3517
3518 static bfd_boolean
3519 elf64_x86_64_common_definition (Elf_Internal_Sym *sym)
3520 {
3521   return (sym->st_shndx == SHN_COMMON
3522           || sym->st_shndx == SHN_X86_64_LCOMMON);
3523 }
3524
3525 static unsigned int
3526 elf64_x86_64_common_section_index (asection *sec)
3527 {
3528   if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
3529     return SHN_COMMON;
3530   else
3531     return SHN_X86_64_LCOMMON;
3532 }
3533
3534 static asection *
3535 elf64_x86_64_common_section (asection *sec)
3536 {
3537   if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
3538     return bfd_com_section_ptr;
3539   else
3540     return &_bfd_elf_large_com_section;
3541 }
3542
3543 static bfd_boolean
3544 elf64_x86_64_merge_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
3545                            struct elf_link_hash_entry **sym_hash ATTRIBUTE_UNUSED,
3546                            struct elf_link_hash_entry *h,
3547                            Elf_Internal_Sym *sym,
3548                            asection **psec,
3549                            bfd_vma *pvalue ATTRIBUTE_UNUSED,
3550                            unsigned int *pold_alignment ATTRIBUTE_UNUSED,
3551                            bfd_boolean *skip ATTRIBUTE_UNUSED,
3552                            bfd_boolean *override ATTRIBUTE_UNUSED,
3553                            bfd_boolean *type_change_ok ATTRIBUTE_UNUSED,
3554                            bfd_boolean *size_change_ok ATTRIBUTE_UNUSED,
3555                            bfd_boolean *newdef ATTRIBUTE_UNUSED,
3556                            bfd_boolean *newdyn,
3557                            bfd_boolean *newdyncommon ATTRIBUTE_UNUSED,
3558                            bfd_boolean *newweak ATTRIBUTE_UNUSED,
3559                            bfd *abfd ATTRIBUTE_UNUSED,
3560                            asection **sec,
3561                            bfd_boolean *olddef ATTRIBUTE_UNUSED,
3562                            bfd_boolean *olddyn,
3563                            bfd_boolean *olddyncommon ATTRIBUTE_UNUSED,
3564                            bfd_boolean *oldweak ATTRIBUTE_UNUSED,
3565                            bfd *oldbfd,
3566                            asection **oldsec)
3567 {
3568   /* A normal common symbol and a large common symbol result in a
3569      normal common symbol.  We turn the large common symbol into a
3570      normal one.  */
3571   if (!*olddyn
3572       && h->root.type == bfd_link_hash_common
3573       && !*newdyn
3574       && bfd_is_com_section (*sec)
3575       && *oldsec != *sec)
3576     {
3577       if (sym->st_shndx == SHN_COMMON
3578           && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) != 0)
3579         {
3580           h->root.u.c.p->section
3581             = bfd_make_section_old_way (oldbfd, "COMMON");
3582           h->root.u.c.p->section->flags = SEC_ALLOC;
3583         }
3584       else if (sym->st_shndx == SHN_X86_64_LCOMMON
3585                && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) == 0)
3586         *psec = *sec = bfd_com_section_ptr; 
3587     }
3588
3589   return TRUE;
3590 }
3591
3592 static int
3593 elf64_x86_64_additional_program_headers (bfd *abfd,
3594                                          struct bfd_link_info *info ATTRIBUTE_UNUSED)
3595 {
3596   asection *s;
3597   int count = 0; 
3598
3599   /* Check to see if we need a large readonly segment.  */
3600   s = bfd_get_section_by_name (abfd, ".lrodata");
3601   if (s && (s->flags & SEC_LOAD))
3602     count++;
3603
3604   /* Check to see if we need a large data segment.  Since .lbss sections
3605      is placed right after the .bss section, there should be no need for
3606      a large data segment just because of .lbss.  */
3607   s = bfd_get_section_by_name (abfd, ".ldata");
3608   if (s && (s->flags & SEC_LOAD))
3609     count++;
3610
3611   return count;
3612 }
3613
3614 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
3615
3616 static bfd_boolean
3617 elf64_x86_64_hash_symbol (struct elf_link_hash_entry *h)
3618 {
3619   if (h->plt.offset != (bfd_vma) -1
3620       && !h->def_regular
3621       && !h->pointer_equality_needed)
3622     return FALSE;
3623
3624   return _bfd_elf_hash_symbol (h);
3625 }
3626
3627 static const struct bfd_elf_special_section 
3628   elf64_x86_64_special_sections[]=
3629 {
3630   { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
3631   { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
3632   { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
3633   { STRING_COMMA_LEN (".lbss"),            -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
3634   { STRING_COMMA_LEN (".ldata"),           -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
3635   { STRING_COMMA_LEN (".lrodata"),         -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
3636   { NULL,                       0,          0, 0,            0 }
3637 };
3638
3639 #define TARGET_LITTLE_SYM                   bfd_elf64_x86_64_vec
3640 #define TARGET_LITTLE_NAME                  "elf64-x86-64"
3641 #define ELF_ARCH                            bfd_arch_i386
3642 #define ELF_MACHINE_CODE                    EM_X86_64
3643 #define ELF_MAXPAGESIZE                     0x200000
3644 #define ELF_MINPAGESIZE                     0x1000
3645 #define ELF_COMMONPAGESIZE                  0x1000
3646
3647 #define elf_backend_can_gc_sections         1
3648 #define elf_backend_can_refcount            1
3649 #define elf_backend_want_got_plt            1
3650 #define elf_backend_plt_readonly            1
3651 #define elf_backend_want_plt_sym            0
3652 #define elf_backend_got_header_size         (GOT_ENTRY_SIZE*3)
3653 #define elf_backend_rela_normal             1
3654
3655 #define elf_info_to_howto                   elf64_x86_64_info_to_howto
3656
3657 #define bfd_elf64_bfd_link_hash_table_create \
3658   elf64_x86_64_link_hash_table_create
3659 #define bfd_elf64_bfd_reloc_type_lookup     elf64_x86_64_reloc_type_lookup
3660
3661 #define elf_backend_adjust_dynamic_symbol   elf64_x86_64_adjust_dynamic_symbol
3662 #define elf_backend_check_relocs            elf64_x86_64_check_relocs
3663 #define elf_backend_copy_indirect_symbol    elf64_x86_64_copy_indirect_symbol
3664 #define elf_backend_create_dynamic_sections elf64_x86_64_create_dynamic_sections
3665 #define elf_backend_finish_dynamic_sections elf64_x86_64_finish_dynamic_sections
3666 #define elf_backend_finish_dynamic_symbol   elf64_x86_64_finish_dynamic_symbol
3667 #define elf_backend_gc_mark_hook            elf64_x86_64_gc_mark_hook
3668 #define elf_backend_gc_sweep_hook           elf64_x86_64_gc_sweep_hook
3669 #define elf_backend_grok_prstatus           elf64_x86_64_grok_prstatus
3670 #define elf_backend_grok_psinfo             elf64_x86_64_grok_psinfo
3671 #define elf_backend_reloc_type_class        elf64_x86_64_reloc_type_class
3672 #define elf_backend_relocate_section        elf64_x86_64_relocate_section
3673 #define elf_backend_size_dynamic_sections   elf64_x86_64_size_dynamic_sections
3674 #define elf_backend_always_size_sections    elf64_x86_64_always_size_sections
3675 #define elf_backend_init_index_section      _bfd_elf_init_1_index_section
3676 #define elf_backend_plt_sym_val             elf64_x86_64_plt_sym_val
3677 #define elf_backend_object_p                elf64_x86_64_elf_object_p
3678 #define bfd_elf64_mkobject                  elf64_x86_64_mkobject
3679
3680 #define elf_backend_section_from_shdr \
3681         elf64_x86_64_section_from_shdr
3682
3683 #define elf_backend_section_from_bfd_section \
3684   elf64_x86_64_elf_section_from_bfd_section
3685 #define elf_backend_add_symbol_hook \
3686   elf64_x86_64_add_symbol_hook
3687 #define elf_backend_symbol_processing \
3688   elf64_x86_64_symbol_processing
3689 #define elf_backend_common_section_index \
3690   elf64_x86_64_common_section_index
3691 #define elf_backend_common_section \
3692   elf64_x86_64_common_section
3693 #define elf_backend_common_definition \
3694   elf64_x86_64_common_definition
3695 #define elf_backend_merge_symbol \
3696   elf64_x86_64_merge_symbol
3697 #define elf_backend_special_sections \
3698   elf64_x86_64_special_sections
3699 #define elf_backend_additional_program_headers \
3700   elf64_x86_64_additional_program_headers
3701 #define elf_backend_hash_symbol \
3702   elf64_x86_64_hash_symbol
3703
3704 #include "elf64-target.h"
3705
3706 /* FreeBSD support.  */
3707
3708 #undef  TARGET_LITTLE_SYM
3709 #define TARGET_LITTLE_SYM                   bfd_elf64_x86_64_freebsd_vec
3710 #undef  TARGET_LITTLE_NAME
3711 #define TARGET_LITTLE_NAME                  "elf64-x86-64-freebsd"
3712
3713 /* The kernel recognizes executables as valid only if they carry a
3714    "FreeBSD" label in the ELF header.  So we put this label on all
3715    executables and (for simplicity) also all other object files.  */
3716
3717 static void
3718 elf64_x86_64_fbsd_post_process_headers (bfd * abfd,
3719                                         struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
3720 {
3721   Elf_Internal_Ehdr * i_ehdrp;  /* ELF file header, internal form.  */
3722
3723   i_ehdrp = elf_elfheader (abfd);
3724
3725   /* Put an ABI label supported by FreeBSD >= 4.1.  */
3726   i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
3727 }
3728
3729 #undef  elf_backend_post_process_headers
3730 #define elf_backend_post_process_headers  elf64_x86_64_fbsd_post_process_headers
3731
3732 #undef  elf64_bed
3733 #define elf64_bed elf64_x86_64_fbsd_bed
3734
3735 #include "elf64-target.h"