PR ld/2754
[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   0x90, 0x90, 0x90, 0x90        /* pad out to 16 bytes with nops.  */
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                        && (! info->symbolic
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 (strncmp (name, ".rela", 5) != 0
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 ATTRIBUTE_UNUSED,
1138                            Elf_Internal_Rela *rel,
1139                            struct elf_link_hash_entry *h,
1140                            Elf_Internal_Sym *sym)
1141 {
1142   if (h != NULL)
1143     {
1144       switch (ELF64_R_TYPE (rel->r_info))
1145         {
1146         case R_X86_64_GNU_VTINHERIT:
1147         case R_X86_64_GNU_VTENTRY:
1148           break;
1149
1150         default:
1151           switch (h->root.type)
1152             {
1153             case bfd_link_hash_defined:
1154             case bfd_link_hash_defweak:
1155               return h->root.u.def.section;
1156
1157             case bfd_link_hash_common:
1158               return h->root.u.c.p->section;
1159
1160             default:
1161               break;
1162             }
1163         }
1164     }
1165   else
1166     return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
1167
1168   return NULL;
1169 }
1170
1171 /* Update the got entry reference counts for the section being removed.  */
1172
1173 static bfd_boolean
1174 elf64_x86_64_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
1175                             asection *sec, const Elf_Internal_Rela *relocs)
1176 {
1177   Elf_Internal_Shdr *symtab_hdr;
1178   struct elf_link_hash_entry **sym_hashes;
1179   bfd_signed_vma *local_got_refcounts;
1180   const Elf_Internal_Rela *rel, *relend;
1181
1182   elf_section_data (sec)->local_dynrel = NULL;
1183
1184   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1185   sym_hashes = elf_sym_hashes (abfd);
1186   local_got_refcounts = elf_local_got_refcounts (abfd);
1187
1188   relend = relocs + sec->reloc_count;
1189   for (rel = relocs; rel < relend; rel++)
1190     {
1191       unsigned long r_symndx;
1192       unsigned int r_type;
1193       struct elf_link_hash_entry *h = NULL;
1194
1195       r_symndx = ELF64_R_SYM (rel->r_info);
1196       if (r_symndx >= symtab_hdr->sh_info)
1197         {
1198           struct elf64_x86_64_link_hash_entry *eh;
1199           struct elf64_x86_64_dyn_relocs **pp;
1200           struct elf64_x86_64_dyn_relocs *p;
1201
1202           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1203           while (h->root.type == bfd_link_hash_indirect
1204                  || h->root.type == bfd_link_hash_warning)
1205             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1206           eh = (struct elf64_x86_64_link_hash_entry *) h;
1207
1208           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1209             if (p->sec == sec)
1210               {
1211                 /* Everything must go for SEC.  */
1212                 *pp = p->next;
1213                 break;
1214               }
1215         }
1216
1217       r_type = ELF64_R_TYPE (rel->r_info);
1218       r_type = elf64_x86_64_tls_transition (info, r_type, h != NULL);
1219       switch (r_type)
1220         {
1221         case R_X86_64_TLSLD:
1222           if (elf64_x86_64_hash_table (info)->tls_ld_got.refcount > 0)
1223             elf64_x86_64_hash_table (info)->tls_ld_got.refcount -= 1;
1224           break;
1225
1226         case R_X86_64_TLSGD:
1227         case R_X86_64_GOTPC32_TLSDESC:
1228         case R_X86_64_TLSDESC_CALL:
1229         case R_X86_64_GOTTPOFF:
1230         case R_X86_64_GOT32:
1231         case R_X86_64_GOTPCREL:
1232         case R_X86_64_GOT64:
1233         case R_X86_64_GOTPCREL64:
1234         case R_X86_64_GOTPLT64:
1235           if (h != NULL)
1236             {
1237               if (r_type == R_X86_64_GOTPLT64 && h->plt.refcount > 0)
1238                 h->plt.refcount -= 1;
1239               if (h->got.refcount > 0)
1240                 h->got.refcount -= 1;
1241             }
1242           else if (local_got_refcounts != NULL)
1243             {
1244               if (local_got_refcounts[r_symndx] > 0)
1245                 local_got_refcounts[r_symndx] -= 1;
1246             }
1247           break;
1248
1249         case R_X86_64_8:
1250         case R_X86_64_16:
1251         case R_X86_64_32:
1252         case R_X86_64_64:
1253         case R_X86_64_32S:
1254         case R_X86_64_PC8:
1255         case R_X86_64_PC16:
1256         case R_X86_64_PC32:
1257         case R_X86_64_PC64:
1258           if (info->shared)
1259             break;
1260           /* Fall thru */
1261
1262         case R_X86_64_PLT32:
1263         case R_X86_64_PLTOFF64:
1264           if (h != NULL)
1265             {
1266               if (h->plt.refcount > 0)
1267                 h->plt.refcount -= 1;
1268             }
1269           break;
1270
1271         default:
1272           break;
1273         }
1274     }
1275
1276   return TRUE;
1277 }
1278
1279 /* Adjust a symbol defined by a dynamic object and referenced by a
1280    regular object.  The current definition is in some section of the
1281    dynamic object, but we're not including those sections.  We have to
1282    change the definition to something the rest of the link can
1283    understand.  */
1284
1285 static bfd_boolean
1286 elf64_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
1287                                     struct elf_link_hash_entry *h)
1288 {
1289   struct elf64_x86_64_link_hash_table *htab;
1290   asection *s;
1291   unsigned int power_of_two;
1292
1293   /* If this is a function, put it in the procedure linkage table.  We
1294      will fill in the contents of the procedure linkage table later,
1295      when we know the address of the .got section.  */
1296   if (h->type == STT_FUNC
1297       || h->needs_plt)
1298     {
1299       if (h->plt.refcount <= 0
1300           || SYMBOL_CALLS_LOCAL (info, h)
1301           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1302               && h->root.type == bfd_link_hash_undefweak))
1303         {
1304           /* This case can occur if we saw a PLT32 reloc in an input
1305              file, but the symbol was never referred to by a dynamic
1306              object, or if all references were garbage collected.  In
1307              such a case, we don't actually need to build a procedure
1308              linkage table, and we can just do a PC32 reloc instead.  */
1309           h->plt.offset = (bfd_vma) -1;
1310           h->needs_plt = 0;
1311         }
1312
1313       return TRUE;
1314     }
1315   else
1316     /* It's possible that we incorrectly decided a .plt reloc was
1317        needed for an R_X86_64_PC32 reloc to a non-function sym in
1318        check_relocs.  We can't decide accurately between function and
1319        non-function syms in check-relocs;  Objects loaded later in
1320        the link may change h->type.  So fix it now.  */
1321     h->plt.offset = (bfd_vma) -1;
1322
1323   /* If this is a weak symbol, and there is a real definition, the
1324      processor independent code will have arranged for us to see the
1325      real definition first, and we can just use the same value.  */
1326   if (h->u.weakdef != NULL)
1327     {
1328       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1329                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
1330       h->root.u.def.section = h->u.weakdef->root.u.def.section;
1331       h->root.u.def.value = h->u.weakdef->root.u.def.value;
1332       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
1333         h->non_got_ref = h->u.weakdef->non_got_ref;
1334       return TRUE;
1335     }
1336
1337   /* This is a reference to a symbol defined by a dynamic object which
1338      is not a function.  */
1339
1340   /* If we are creating a shared library, we must presume that the
1341      only references to the symbol are via the global offset table.
1342      For such cases we need not do anything here; the relocations will
1343      be handled correctly by relocate_section.  */
1344   if (info->shared)
1345     return TRUE;
1346
1347   /* If there are no references to this symbol that do not use the
1348      GOT, we don't need to generate a copy reloc.  */
1349   if (!h->non_got_ref)
1350     return TRUE;
1351
1352   /* If -z nocopyreloc was given, we won't generate them either.  */
1353   if (info->nocopyreloc)
1354     {
1355       h->non_got_ref = 0;
1356       return TRUE;
1357     }
1358
1359   if (ELIMINATE_COPY_RELOCS)
1360     {
1361       struct elf64_x86_64_link_hash_entry * eh;
1362       struct elf64_x86_64_dyn_relocs *p;
1363
1364       eh = (struct elf64_x86_64_link_hash_entry *) h;
1365       for (p = eh->dyn_relocs; p != NULL; p = p->next)
1366         {
1367           s = p->sec->output_section;
1368           if (s != NULL && (s->flags & SEC_READONLY) != 0)
1369             break;
1370         }
1371
1372       /* If we didn't find any dynamic relocs in read-only sections, then
1373          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1374       if (p == NULL)
1375         {
1376           h->non_got_ref = 0;
1377           return TRUE;
1378         }
1379     }
1380
1381   if (h->size == 0)
1382     {
1383       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1384                              h->root.root.string);
1385       return TRUE;
1386     }
1387
1388   /* We must allocate the symbol in our .dynbss section, which will
1389      become part of the .bss section of the executable.  There will be
1390      an entry for this symbol in the .dynsym section.  The dynamic
1391      object will contain position independent code, so all references
1392      from the dynamic object to this symbol will go through the global
1393      offset table.  The dynamic linker will use the .dynsym entry to
1394      determine the address it must put in the global offset table, so
1395      both the dynamic object and the regular object will refer to the
1396      same memory location for the variable.  */
1397
1398   htab = elf64_x86_64_hash_table (info);
1399
1400   /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
1401      to copy the initial value out of the dynamic object and into the
1402      runtime process image.  */
1403   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1404     {
1405       htab->srelbss->size += sizeof (Elf64_External_Rela);
1406       h->needs_copy = 1;
1407     }
1408
1409   /* We need to figure out the alignment required for this symbol.  I
1410      have no idea how ELF linkers handle this.  16-bytes is the size
1411      of the largest type that requires hard alignment -- long double.  */
1412   /* FIXME: This is VERY ugly. Should be fixed for all architectures using
1413      this construct.  */
1414   power_of_two = bfd_log2 (h->size);
1415   if (power_of_two > 4)
1416     power_of_two = 4;
1417
1418   /* Apply the required alignment.  */
1419   s = htab->sdynbss;
1420   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
1421   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
1422     {
1423       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
1424         return FALSE;
1425     }
1426
1427   /* Define the symbol as being at this point in the section.  */
1428   h->root.u.def.section = s;
1429   h->root.u.def.value = s->size;
1430
1431   /* Increment the section size to make room for the symbol.  */
1432   s->size += h->size;
1433
1434   return TRUE;
1435 }
1436
1437 /* Allocate space in .plt, .got and associated reloc sections for
1438    dynamic relocs.  */
1439
1440 static bfd_boolean
1441 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
1442 {
1443   struct bfd_link_info *info;
1444   struct elf64_x86_64_link_hash_table *htab;
1445   struct elf64_x86_64_link_hash_entry *eh;
1446   struct elf64_x86_64_dyn_relocs *p;
1447
1448   if (h->root.type == bfd_link_hash_indirect)
1449     return TRUE;
1450
1451   if (h->root.type == bfd_link_hash_warning)
1452     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1453
1454   info = (struct bfd_link_info *) inf;
1455   htab = elf64_x86_64_hash_table (info);
1456
1457   if (htab->elf.dynamic_sections_created
1458       && h->plt.refcount > 0)
1459     {
1460       /* Make sure this symbol is output as a dynamic symbol.
1461          Undefined weak syms won't yet be marked as dynamic.  */
1462       if (h->dynindx == -1
1463           && !h->forced_local)
1464         {
1465           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1466             return FALSE;
1467         }
1468
1469       if (info->shared
1470           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
1471         {
1472           asection *s = htab->splt;
1473
1474           /* If this is the first .plt entry, make room for the special
1475              first entry.  */
1476           if (s->size == 0)
1477             s->size += PLT_ENTRY_SIZE;
1478
1479           h->plt.offset = s->size;
1480
1481           /* If this symbol is not defined in a regular file, and we are
1482              not generating a shared library, then set the symbol to this
1483              location in the .plt.  This is required to make function
1484              pointers compare as equal between the normal executable and
1485              the shared library.  */
1486           if (! info->shared
1487               && !h->def_regular)
1488             {
1489               h->root.u.def.section = s;
1490               h->root.u.def.value = h->plt.offset;
1491             }
1492
1493           /* Make room for this entry.  */
1494           s->size += PLT_ENTRY_SIZE;
1495
1496           /* We also need to make an entry in the .got.plt section, which
1497              will be placed in the .got section by the linker script.  */
1498           htab->sgotplt->size += GOT_ENTRY_SIZE;
1499
1500           /* We also need to make an entry in the .rela.plt section.  */
1501           htab->srelplt->size += sizeof (Elf64_External_Rela);
1502           htab->srelplt->reloc_count++;
1503         }
1504       else
1505         {
1506           h->plt.offset = (bfd_vma) -1;
1507           h->needs_plt = 0;
1508         }
1509     }
1510   else
1511     {
1512       h->plt.offset = (bfd_vma) -1;
1513       h->needs_plt = 0;
1514     }
1515
1516   eh = (struct elf64_x86_64_link_hash_entry *) h;
1517   eh->tlsdesc_got = (bfd_vma) -1;
1518
1519   /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
1520      make it a R_X86_64_TPOFF32 requiring no GOT entry.  */
1521   if (h->got.refcount > 0
1522       && !info->shared
1523       && h->dynindx == -1
1524       && elf64_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE)
1525     h->got.offset = (bfd_vma) -1;
1526   else if (h->got.refcount > 0)
1527     {
1528       asection *s;
1529       bfd_boolean dyn;
1530       int tls_type = elf64_x86_64_hash_entry (h)->tls_type;
1531
1532       /* Make sure this symbol is output as a dynamic symbol.
1533          Undefined weak syms won't yet be marked as dynamic.  */
1534       if (h->dynindx == -1
1535           && !h->forced_local)
1536         {
1537           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1538             return FALSE;
1539         }
1540
1541       if (GOT_TLS_GDESC_P (tls_type))
1542         {
1543           eh->tlsdesc_got = htab->sgotplt->size
1544             - elf64_x86_64_compute_jump_table_size (htab);
1545           htab->sgotplt->size += 2 * GOT_ENTRY_SIZE;
1546           h->got.offset = (bfd_vma) -2;
1547         }
1548       if (! GOT_TLS_GDESC_P (tls_type)
1549           || GOT_TLS_GD_P (tls_type))
1550         {
1551           s = htab->sgot;
1552           h->got.offset = s->size;
1553           s->size += GOT_ENTRY_SIZE;
1554           if (GOT_TLS_GD_P (tls_type))
1555             s->size += GOT_ENTRY_SIZE;
1556         }
1557       dyn = htab->elf.dynamic_sections_created;
1558       /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
1559          and two if global.
1560          R_X86_64_GOTTPOFF needs one dynamic relocation.  */
1561       if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
1562           || tls_type == GOT_TLS_IE)
1563         htab->srelgot->size += sizeof (Elf64_External_Rela);
1564       else if (GOT_TLS_GD_P (tls_type))
1565         htab->srelgot->size += 2 * sizeof (Elf64_External_Rela);
1566       else if (! GOT_TLS_GDESC_P (tls_type)
1567                && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1568                    || h->root.type != bfd_link_hash_undefweak)
1569                && (info->shared
1570                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
1571         htab->srelgot->size += sizeof (Elf64_External_Rela);
1572       if (GOT_TLS_GDESC_P (tls_type))
1573         {
1574           htab->srelplt->size += sizeof (Elf64_External_Rela);
1575           htab->tlsdesc_plt = (bfd_vma) -1;
1576         }
1577     }
1578   else
1579     h->got.offset = (bfd_vma) -1;
1580
1581   if (eh->dyn_relocs == NULL)
1582     return TRUE;
1583
1584   /* In the shared -Bsymbolic case, discard space allocated for
1585      dynamic pc-relative relocs against symbols which turn out to be
1586      defined in regular objects.  For the normal shared case, discard
1587      space for pc-relative relocs that have become local due to symbol
1588      visibility changes.  */
1589
1590   if (info->shared)
1591     {
1592       /* Relocs that use pc_count are those that appear on a call
1593          insn, or certain REL relocs that can generated via assembly.
1594          We want calls to protected symbols to resolve directly to the
1595          function rather than going via the plt.  If people want
1596          function pointer comparisons to work as expected then they
1597          should avoid writing weird assembly.  */
1598       if (SYMBOL_CALLS_LOCAL (info, h))
1599         {
1600           struct elf64_x86_64_dyn_relocs **pp;
1601
1602           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1603             {
1604               p->count -= p->pc_count;
1605               p->pc_count = 0;
1606               if (p->count == 0)
1607                 *pp = p->next;
1608               else
1609                 pp = &p->next;
1610             }
1611         }
1612
1613       /* Also discard relocs on undefined weak syms with non-default
1614          visibility.  */
1615       if (eh->dyn_relocs != NULL
1616           && h->root.type == bfd_link_hash_undefweak)
1617         {
1618           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1619             eh->dyn_relocs = NULL;
1620
1621           /* Make sure undefined weak symbols are output as a dynamic
1622              symbol in PIEs.  */
1623           else if (h->dynindx == -1
1624                    && !h->forced_local)
1625             {
1626               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1627                 return FALSE;
1628             }
1629         }
1630     }
1631   else if (ELIMINATE_COPY_RELOCS)
1632     {
1633       /* For the non-shared case, discard space for relocs against
1634          symbols which turn out to need copy relocs or are not
1635          dynamic.  */
1636
1637       if (!h->non_got_ref
1638           && ((h->def_dynamic
1639                && !h->def_regular)
1640               || (htab->elf.dynamic_sections_created
1641                   && (h->root.type == bfd_link_hash_undefweak
1642                       || h->root.type == bfd_link_hash_undefined))))
1643         {
1644           /* Make sure this symbol is output as a dynamic symbol.
1645              Undefined weak syms won't yet be marked as dynamic.  */
1646           if (h->dynindx == -1
1647               && !h->forced_local)
1648             {
1649               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1650                 return FALSE;
1651             }
1652
1653           /* If that succeeded, we know we'll be keeping all the
1654              relocs.  */
1655           if (h->dynindx != -1)
1656             goto keep;
1657         }
1658
1659       eh->dyn_relocs = NULL;
1660
1661     keep: ;
1662     }
1663
1664   /* Finally, allocate space.  */
1665   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1666     {
1667       asection *sreloc = elf_section_data (p->sec)->sreloc;
1668       sreloc->size += p->count * sizeof (Elf64_External_Rela);
1669     }
1670
1671   return TRUE;
1672 }
1673
1674 /* Find any dynamic relocs that apply to read-only sections.  */
1675
1676 static bfd_boolean
1677 readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf)
1678 {
1679   struct elf64_x86_64_link_hash_entry *eh;
1680   struct elf64_x86_64_dyn_relocs *p;
1681
1682   if (h->root.type == bfd_link_hash_warning)
1683     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1684
1685   eh = (struct elf64_x86_64_link_hash_entry *) h;
1686   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1687     {
1688       asection *s = p->sec->output_section;
1689
1690       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1691         {
1692           struct bfd_link_info *info = (struct bfd_link_info *) inf;
1693
1694           info->flags |= DF_TEXTREL;
1695
1696           /* Not an error, just cut short the traversal.  */
1697           return FALSE;
1698         }
1699     }
1700   return TRUE;
1701 }
1702
1703 /* Set the sizes of the dynamic sections.  */
1704
1705 static bfd_boolean
1706 elf64_x86_64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1707                                     struct bfd_link_info *info)
1708 {
1709   struct elf64_x86_64_link_hash_table *htab;
1710   bfd *dynobj;
1711   asection *s;
1712   bfd_boolean relocs;
1713   bfd *ibfd;
1714
1715   htab = elf64_x86_64_hash_table (info);
1716   dynobj = htab->elf.dynobj;
1717   if (dynobj == NULL)
1718     abort ();
1719
1720   if (htab->elf.dynamic_sections_created)
1721     {
1722       /* Set the contents of the .interp section to the interpreter.  */
1723       if (info->executable)
1724         {
1725           s = bfd_get_section_by_name (dynobj, ".interp");
1726           if (s == NULL)
1727             abort ();
1728           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1729           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1730         }
1731     }
1732
1733   /* Set up .got offsets for local syms, and space for local dynamic
1734      relocs.  */
1735   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1736     {
1737       bfd_signed_vma *local_got;
1738       bfd_signed_vma *end_local_got;
1739       char *local_tls_type;
1740       bfd_vma *local_tlsdesc_gotent;
1741       bfd_size_type locsymcount;
1742       Elf_Internal_Shdr *symtab_hdr;
1743       asection *srel;
1744
1745       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1746         continue;
1747
1748       for (s = ibfd->sections; s != NULL; s = s->next)
1749         {
1750           struct elf64_x86_64_dyn_relocs *p;
1751
1752           for (p = (struct elf64_x86_64_dyn_relocs *)
1753                     (elf_section_data (s)->local_dynrel);
1754                p != NULL;
1755                p = p->next)
1756             {
1757               if (!bfd_is_abs_section (p->sec)
1758                   && bfd_is_abs_section (p->sec->output_section))
1759                 {
1760                   /* Input section has been discarded, either because
1761                      it is a copy of a linkonce section or due to
1762                      linker script /DISCARD/, so we'll be discarding
1763                      the relocs too.  */
1764                 }
1765               else if (p->count != 0)
1766                 {
1767                   srel = elf_section_data (p->sec)->sreloc;
1768                   srel->size += p->count * sizeof (Elf64_External_Rela);
1769                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1770                     info->flags |= DF_TEXTREL;
1771
1772                 }
1773             }
1774         }
1775
1776       local_got = elf_local_got_refcounts (ibfd);
1777       if (!local_got)
1778         continue;
1779
1780       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1781       locsymcount = symtab_hdr->sh_info;
1782       end_local_got = local_got + locsymcount;
1783       local_tls_type = elf64_x86_64_local_got_tls_type (ibfd);
1784       local_tlsdesc_gotent = elf64_x86_64_local_tlsdesc_gotent (ibfd);
1785       s = htab->sgot;
1786       srel = htab->srelgot;
1787       for (; local_got < end_local_got;
1788            ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
1789         {
1790           *local_tlsdesc_gotent = (bfd_vma) -1;
1791           if (*local_got > 0)
1792             {
1793               if (GOT_TLS_GDESC_P (*local_tls_type))
1794                 {
1795                   *local_tlsdesc_gotent = htab->sgotplt->size
1796                     - elf64_x86_64_compute_jump_table_size (htab);
1797                   htab->sgotplt->size += 2 * GOT_ENTRY_SIZE;
1798                   *local_got = (bfd_vma) -2;
1799                 }
1800               if (! GOT_TLS_GDESC_P (*local_tls_type)
1801                   || GOT_TLS_GD_P (*local_tls_type))
1802                 {
1803                   *local_got = s->size;
1804                   s->size += GOT_ENTRY_SIZE;
1805                   if (GOT_TLS_GD_P (*local_tls_type))
1806                     s->size += GOT_ENTRY_SIZE;
1807                 }
1808               if (info->shared
1809                   || GOT_TLS_GD_ANY_P (*local_tls_type)
1810                   || *local_tls_type == GOT_TLS_IE)
1811                 {
1812                   if (GOT_TLS_GDESC_P (*local_tls_type))
1813                     {
1814                       htab->srelplt->size += sizeof (Elf64_External_Rela);
1815                       htab->tlsdesc_plt = (bfd_vma) -1;
1816                     }
1817                   if (! GOT_TLS_GDESC_P (*local_tls_type)
1818                       || GOT_TLS_GD_P (*local_tls_type))
1819                     srel->size += sizeof (Elf64_External_Rela);
1820                 }
1821             }
1822           else
1823             *local_got = (bfd_vma) -1;
1824         }
1825     }
1826
1827   if (htab->tls_ld_got.refcount > 0)
1828     {
1829       /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
1830          relocs.  */
1831       htab->tls_ld_got.offset = htab->sgot->size;
1832       htab->sgot->size += 2 * GOT_ENTRY_SIZE;
1833       htab->srelgot->size += sizeof (Elf64_External_Rela);
1834     }
1835   else
1836     htab->tls_ld_got.offset = -1;
1837
1838   /* Allocate global sym .plt and .got entries, and space for global
1839      sym dynamic relocs.  */
1840   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
1841
1842   /* For every jump slot reserved in the sgotplt, reloc_count is
1843      incremented.  However, when we reserve space for TLS descriptors,
1844      it's not incremented, so in order to compute the space reserved
1845      for them, it suffices to multiply the reloc count by the jump
1846      slot size.  */
1847   if (htab->srelplt)
1848     htab->sgotplt_jump_table_size
1849       = elf64_x86_64_compute_jump_table_size (htab);
1850
1851   if (htab->tlsdesc_plt)
1852     {
1853       /* If we're not using lazy TLS relocations, don't generate the
1854          PLT and GOT entries they require.  */
1855       if ((info->flags & DF_BIND_NOW))
1856         htab->tlsdesc_plt = 0;
1857       else
1858         {
1859           htab->tlsdesc_got = htab->sgot->size;
1860           htab->sgot->size += GOT_ENTRY_SIZE;
1861           /* Reserve room for the initial entry.
1862              FIXME: we could probably do away with it in this case.  */
1863           if (htab->splt->size == 0)
1864             htab->splt->size += PLT_ENTRY_SIZE;
1865           htab->tlsdesc_plt = htab->splt->size;
1866           htab->splt->size += PLT_ENTRY_SIZE;
1867         }
1868     }
1869
1870   /* We now have determined the sizes of the various dynamic sections.
1871      Allocate memory for them.  */
1872   relocs = FALSE;
1873   for (s = dynobj->sections; s != NULL; s = s->next)
1874     {
1875       if ((s->flags & SEC_LINKER_CREATED) == 0)
1876         continue;
1877
1878       if (s == htab->splt
1879           || s == htab->sgot
1880           || s == htab->sgotplt
1881           || s == htab->sdynbss)
1882         {
1883           /* Strip this section if we don't need it; see the
1884              comment below.  */
1885         }
1886       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
1887         {
1888           if (s->size != 0 && s != htab->srelplt)
1889             relocs = TRUE;
1890
1891           /* We use the reloc_count field as a counter if we need
1892              to copy relocs into the output file.  */
1893           if (s != htab->srelplt)
1894             s->reloc_count = 0;
1895         }
1896       else
1897         {
1898           /* It's not one of our sections, so don't allocate space.  */
1899           continue;
1900         }
1901
1902       if (s->size == 0)
1903         {
1904           /* If we don't need this section, strip it from the
1905              output file.  This is mostly to handle .rela.bss and
1906              .rela.plt.  We must create both sections in
1907              create_dynamic_sections, because they must be created
1908              before the linker maps input sections to output
1909              sections.  The linker does that before
1910              adjust_dynamic_symbol is called, and it is that
1911              function which decides whether anything needs to go
1912              into these sections.  */
1913
1914           s->flags |= SEC_EXCLUDE;
1915           continue;
1916         }
1917
1918       if ((s->flags & SEC_HAS_CONTENTS) == 0)
1919         continue;
1920
1921       /* Allocate memory for the section contents.  We use bfd_zalloc
1922          here in case unused entries are not reclaimed before the
1923          section's contents are written out.  This should not happen,
1924          but this way if it does, we get a R_X86_64_NONE reloc instead
1925          of garbage.  */
1926       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1927       if (s->contents == NULL)
1928         return FALSE;
1929     }
1930
1931   if (htab->elf.dynamic_sections_created)
1932     {
1933       /* Add some entries to the .dynamic section.  We fill in the
1934          values later, in elf64_x86_64_finish_dynamic_sections, but we
1935          must add the entries now so that we get the correct size for
1936          the .dynamic section.  The DT_DEBUG entry is filled in by the
1937          dynamic linker and used by the debugger.  */
1938 #define add_dynamic_entry(TAG, VAL) \
1939   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1940
1941       if (info->executable)
1942         {
1943           if (!add_dynamic_entry (DT_DEBUG, 0))
1944             return FALSE;
1945         }
1946
1947       if (htab->splt->size != 0)
1948         {
1949           if (!add_dynamic_entry (DT_PLTGOT, 0)
1950               || !add_dynamic_entry (DT_PLTRELSZ, 0)
1951               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1952               || !add_dynamic_entry (DT_JMPREL, 0))
1953             return FALSE;
1954
1955           if (htab->tlsdesc_plt
1956               && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
1957                   || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
1958             return FALSE;
1959         }
1960
1961       if (relocs)
1962         {
1963           if (!add_dynamic_entry (DT_RELA, 0)
1964               || !add_dynamic_entry (DT_RELASZ, 0)
1965               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
1966             return FALSE;
1967
1968           /* If any dynamic relocs apply to a read-only section,
1969              then we need a DT_TEXTREL entry.  */
1970           if ((info->flags & DF_TEXTREL) == 0)
1971             elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
1972                                     (PTR) info);
1973
1974           if ((info->flags & DF_TEXTREL) != 0)
1975             {
1976               if (!add_dynamic_entry (DT_TEXTREL, 0))
1977                 return FALSE;
1978             }
1979         }
1980     }
1981 #undef add_dynamic_entry
1982
1983   return TRUE;
1984 }
1985
1986 static bfd_boolean
1987 elf64_x86_64_always_size_sections (bfd *output_bfd,
1988                                    struct bfd_link_info *info)
1989 {
1990   asection *tls_sec = elf_hash_table (info)->tls_sec;
1991
1992   if (tls_sec)
1993     {
1994       struct elf_link_hash_entry *tlsbase;
1995
1996       tlsbase = elf_link_hash_lookup (elf_hash_table (info),
1997                                       "_TLS_MODULE_BASE_",
1998                                       FALSE, FALSE, FALSE);
1999
2000       if (tlsbase && tlsbase->type == STT_TLS)
2001         {
2002           struct bfd_link_hash_entry *bh = NULL;
2003           const struct elf_backend_data *bed
2004             = get_elf_backend_data (output_bfd);
2005
2006           if (!(_bfd_generic_link_add_one_symbol
2007                 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
2008                  tls_sec, 0, NULL, FALSE,
2009                  bed->collect, &bh)))
2010             return FALSE;
2011           tlsbase = (struct elf_link_hash_entry *)bh;
2012           tlsbase->def_regular = 1;
2013           tlsbase->other = STV_HIDDEN;
2014           (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
2015         }
2016     }
2017
2018   return TRUE;
2019 }
2020
2021 /* Return the base VMA address which should be subtracted from real addresses
2022    when resolving @dtpoff relocation.
2023    This is PT_TLS segment p_vaddr.  */
2024
2025 static bfd_vma
2026 dtpoff_base (struct bfd_link_info *info)
2027 {
2028   /* If tls_sec is NULL, we should have signalled an error already.  */
2029   if (elf_hash_table (info)->tls_sec == NULL)
2030     return 0;
2031   return elf_hash_table (info)->tls_sec->vma;
2032 }
2033
2034 /* Return the relocation value for @tpoff relocation
2035    if STT_TLS virtual address is ADDRESS.  */
2036
2037 static bfd_vma
2038 tpoff (struct bfd_link_info *info, bfd_vma address)
2039 {
2040   struct elf_link_hash_table *htab = elf_hash_table (info);
2041
2042   /* If tls_segment is NULL, we should have signalled an error already.  */
2043   if (htab->tls_sec == NULL)
2044     return 0;
2045   return address - htab->tls_size - htab->tls_sec->vma;
2046 }
2047
2048 /* Is the instruction before OFFSET in CONTENTS a 32bit relative
2049    branch?  */
2050
2051 static bfd_boolean
2052 is_32bit_relative_branch (bfd_byte *contents, bfd_vma offset)
2053 {
2054   /* Opcode             Instruction
2055      0xe8               call
2056      0xe9               jump
2057      0x0f 0x8x          conditional jump */
2058   return ((offset > 0
2059            && (contents [offset - 1] == 0xe8
2060                || contents [offset - 1] == 0xe9))
2061           || (offset > 1
2062               && contents [offset - 2] == 0x0f
2063               && (contents [offset - 1] & 0xf0) == 0x80));
2064 }
2065
2066 /* Relocate an x86_64 ELF section.  */
2067
2068 static bfd_boolean
2069 elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
2070                                bfd *input_bfd, asection *input_section,
2071                                bfd_byte *contents, Elf_Internal_Rela *relocs,
2072                                Elf_Internal_Sym *local_syms,
2073                                asection **local_sections)
2074 {
2075   struct elf64_x86_64_link_hash_table *htab;
2076   Elf_Internal_Shdr *symtab_hdr;
2077   struct elf_link_hash_entry **sym_hashes;
2078   bfd_vma *local_got_offsets;
2079   bfd_vma *local_tlsdesc_gotents;
2080   Elf_Internal_Rela *rel;
2081   Elf_Internal_Rela *relend;
2082
2083   if (info->relocatable)
2084     return TRUE;
2085
2086   htab = elf64_x86_64_hash_table (info);
2087   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2088   sym_hashes = elf_sym_hashes (input_bfd);
2089   local_got_offsets = elf_local_got_offsets (input_bfd);
2090   local_tlsdesc_gotents = elf64_x86_64_local_tlsdesc_gotent (input_bfd);
2091
2092   rel = relocs;
2093   relend = relocs + input_section->reloc_count;
2094   for (; rel < relend; rel++)
2095     {
2096       unsigned int r_type;
2097       reloc_howto_type *howto;
2098       unsigned long r_symndx;
2099       struct elf_link_hash_entry *h;
2100       Elf_Internal_Sym *sym;
2101       asection *sec;
2102       bfd_vma off, offplt;
2103       bfd_vma relocation;
2104       bfd_boolean unresolved_reloc;
2105       bfd_reloc_status_type r;
2106       int tls_type;
2107
2108       r_type = ELF64_R_TYPE (rel->r_info);
2109       if (r_type == (int) R_X86_64_GNU_VTINHERIT
2110           || r_type == (int) R_X86_64_GNU_VTENTRY)
2111         continue;
2112
2113       if (r_type >= R_X86_64_max)
2114         {
2115           bfd_set_error (bfd_error_bad_value);
2116           return FALSE;
2117         }
2118
2119       howto = x86_64_elf_howto_table + r_type;
2120       r_symndx = ELF64_R_SYM (rel->r_info);
2121       h = NULL;
2122       sym = NULL;
2123       sec = NULL;
2124       unresolved_reloc = FALSE;
2125       if (r_symndx < symtab_hdr->sh_info)
2126         {
2127           sym = local_syms + r_symndx;
2128           sec = local_sections[r_symndx];
2129
2130           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2131         }
2132       else
2133         {
2134           bfd_boolean warned;
2135
2136           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2137                                    r_symndx, symtab_hdr, sym_hashes,
2138                                    h, sec, relocation,
2139                                    unresolved_reloc, warned);
2140         }
2141       /* When generating a shared object, the relocations handled here are
2142          copied into the output file to be resolved at run time.  */
2143       switch (r_type)
2144         {
2145         asection *base_got;
2146         case R_X86_64_GOT32:
2147         case R_X86_64_GOT64:
2148           /* Relocation is to the entry for this symbol in the global
2149              offset table.  */
2150         case R_X86_64_GOTPCREL:
2151         case R_X86_64_GOTPCREL64:
2152           /* Use global offset table entry as symbol value.  */
2153         case R_X86_64_GOTPLT64:
2154           /* This is the same as GOT64 for relocation purposes, but
2155              indicates the existence of a PLT entry.  The difficulty is,
2156              that we must calculate the GOT slot offset from the PLT
2157              offset, if this symbol got a PLT entry (it was global).
2158              Additionally if it's computed from the PLT entry, then that
2159              GOT offset is relative to .got.plt, not to .got.  */
2160           base_got = htab->sgot;
2161
2162           if (htab->sgot == NULL)
2163             abort ();
2164
2165           if (h != NULL)
2166             {
2167               bfd_boolean dyn;
2168
2169               off = h->got.offset;
2170               if (h->needs_plt
2171                   && h->plt.offset != (bfd_vma)-1
2172                   && off == (bfd_vma)-1)
2173                 {
2174                   /* We can't use h->got.offset here to save
2175                      state, or even just remember the offset, as
2176                      finish_dynamic_symbol would use that as offset into
2177                      .got.  */
2178                   bfd_vma plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
2179                   off = (plt_index + 3) * GOT_ENTRY_SIZE;
2180                   base_got = htab->sgotplt;
2181                 }
2182
2183               dyn = htab->elf.dynamic_sections_created;
2184
2185               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2186                   || (info->shared
2187                       && SYMBOL_REFERENCES_LOCAL (info, h))
2188                   || (ELF_ST_VISIBILITY (h->other)
2189                       && h->root.type == bfd_link_hash_undefweak))
2190                 {
2191                   /* This is actually a static link, or it is a -Bsymbolic
2192                      link and the symbol is defined locally, or the symbol
2193                      was forced to be local because of a version file.  We
2194                      must initialize this entry in the global offset table.
2195                      Since the offset must always be a multiple of 8, we
2196                      use the least significant bit to record whether we
2197                      have initialized it already.
2198
2199                      When doing a dynamic link, we create a .rela.got
2200                      relocation entry to initialize the value.  This is
2201                      done in the finish_dynamic_symbol routine.  */
2202                   if ((off & 1) != 0)
2203                     off &= ~1;
2204                   else
2205                     {
2206                       bfd_put_64 (output_bfd, relocation,
2207                                   base_got->contents + off);
2208                       /* Note that this is harmless for the GOTPLT64 case,
2209                          as -1 | 1 still is -1.  */
2210                       h->got.offset |= 1;
2211                     }
2212                 }
2213               else
2214                 unresolved_reloc = FALSE;
2215             }
2216           else
2217             {
2218               if (local_got_offsets == NULL)
2219                 abort ();
2220
2221               off = local_got_offsets[r_symndx];
2222
2223               /* The offset must always be a multiple of 8.  We use
2224                  the least significant bit to record whether we have
2225                  already generated the necessary reloc.  */
2226               if ((off & 1) != 0)
2227                 off &= ~1;
2228               else
2229                 {
2230                   bfd_put_64 (output_bfd, relocation,
2231                               base_got->contents + off);
2232
2233                   if (info->shared)
2234                     {
2235                       asection *s;
2236                       Elf_Internal_Rela outrel;
2237                       bfd_byte *loc;
2238
2239                       /* We need to generate a R_X86_64_RELATIVE reloc
2240                          for the dynamic linker.  */
2241                       s = htab->srelgot;
2242                       if (s == NULL)
2243                         abort ();
2244
2245                       outrel.r_offset = (base_got->output_section->vma
2246                                          + base_got->output_offset
2247                                          + off);
2248                       outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
2249                       outrel.r_addend = relocation;
2250                       loc = s->contents;
2251                       loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
2252                       bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2253                     }
2254
2255                   local_got_offsets[r_symndx] |= 1;
2256                 }
2257             }
2258
2259           if (off >= (bfd_vma) -2)
2260             abort ();
2261
2262           relocation = base_got->output_section->vma
2263                        + base_got->output_offset + off;
2264           if (r_type != R_X86_64_GOTPCREL && r_type != R_X86_64_GOTPCREL64)
2265             relocation -= htab->sgotplt->output_section->vma
2266                           - htab->sgotplt->output_offset;
2267
2268           break;
2269
2270         case R_X86_64_GOTOFF64:
2271           /* Relocation is relative to the start of the global offset
2272              table.  */
2273
2274           /* Check to make sure it isn't a protected function symbol
2275              for shared library since it may not be local when used
2276              as function address.  */
2277           if (info->shared
2278               && h
2279               && h->def_regular
2280               && h->type == STT_FUNC
2281               && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
2282             {
2283               (*_bfd_error_handler)
2284                 (_("%B: relocation R_X86_64_GOTOFF64 against protected function `%s' can not be used when making a shared object"),
2285                  input_bfd, h->root.root.string);
2286               bfd_set_error (bfd_error_bad_value);
2287               return FALSE;
2288             }
2289
2290           /* Note that sgot is not involved in this
2291              calculation.  We always want the start of .got.plt.  If we
2292              defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
2293              permitted by the ABI, we might have to change this
2294              calculation.  */
2295           relocation -= htab->sgotplt->output_section->vma
2296                         + htab->sgotplt->output_offset;
2297           break;
2298
2299         case R_X86_64_GOTPC32:
2300         case R_X86_64_GOTPC64:
2301           /* Use global offset table as symbol value.  */
2302           relocation = htab->sgotplt->output_section->vma
2303                        + htab->sgotplt->output_offset;
2304           unresolved_reloc = FALSE;
2305           break;
2306
2307         case R_X86_64_PLTOFF64:
2308           /* Relocation is PLT entry relative to GOT.  For local
2309              symbols it's the symbol itself relative to GOT.  */
2310           if (h != NULL
2311               /* See PLT32 handling.  */
2312               && h->plt.offset != (bfd_vma) -1
2313               && htab->splt != NULL)
2314             {
2315               relocation = (htab->splt->output_section->vma
2316                             + htab->splt->output_offset
2317                             + h->plt.offset);
2318               unresolved_reloc = FALSE;
2319             }
2320
2321           relocation -= htab->sgotplt->output_section->vma
2322                         + htab->sgotplt->output_offset;
2323           break;
2324
2325         case R_X86_64_PLT32:
2326           /* Relocation is to the entry for this symbol in the
2327              procedure linkage table.  */
2328
2329           /* Resolve a PLT32 reloc against a local symbol directly,
2330              without using the procedure linkage table.  */
2331           if (h == NULL)
2332             break;
2333
2334           if (h->plt.offset == (bfd_vma) -1
2335               || htab->splt == NULL)
2336             {
2337               /* We didn't make a PLT entry for this symbol.  This
2338                  happens when statically linking PIC code, or when
2339                  using -Bsymbolic.  */
2340               break;
2341             }
2342
2343           relocation = (htab->splt->output_section->vma
2344                         + htab->splt->output_offset
2345                         + h->plt.offset);
2346           unresolved_reloc = FALSE;
2347           break;
2348
2349         case R_X86_64_PC8:
2350         case R_X86_64_PC16:
2351         case R_X86_64_PC32:
2352           if (info->shared
2353               && !SYMBOL_REFERENCES_LOCAL (info, h)
2354               && (input_section->flags & SEC_ALLOC) != 0
2355               && (input_section->flags & SEC_READONLY) != 0
2356               && (!h->def_regular
2357                   || r_type != R_X86_64_PC32
2358                   || h->type != STT_FUNC
2359                   || ELF_ST_VISIBILITY (h->other) != STV_PROTECTED
2360                   || !is_32bit_relative_branch (contents,
2361                                                 rel->r_offset)))
2362             {
2363               if (h->def_regular
2364                   && r_type == R_X86_64_PC32
2365                   && h->type == STT_FUNC
2366                   && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
2367                 (*_bfd_error_handler)
2368                    (_("%B: relocation R_X86_64_PC32 against protected function `%s' can not be used when making a shared object"),
2369                     input_bfd, h->root.root.string);
2370               else
2371                 (*_bfd_error_handler)
2372                   (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
2373                    input_bfd, x86_64_elf_howto_table[r_type].name,
2374                    h->root.root.string);
2375               bfd_set_error (bfd_error_bad_value);
2376               return FALSE;
2377             }
2378           /* Fall through.  */
2379
2380         case R_X86_64_8:
2381         case R_X86_64_16:
2382         case R_X86_64_32:
2383         case R_X86_64_PC64:
2384         case R_X86_64_64:
2385           /* FIXME: The ABI says the linker should make sure the value is
2386              the same when it's zeroextended to 64 bit.  */
2387
2388           /* r_symndx will be zero only for relocs against symbols
2389              from removed linkonce sections, or sections discarded by
2390              a linker script.  */
2391           if (r_symndx == 0
2392               || (input_section->flags & SEC_ALLOC) == 0)
2393             break;
2394
2395           if ((info->shared
2396                && (h == NULL
2397                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2398                    || h->root.type != bfd_link_hash_undefweak)
2399                && ((r_type != R_X86_64_PC8
2400                     && r_type != R_X86_64_PC16
2401                     && r_type != R_X86_64_PC32
2402                     && r_type != R_X86_64_PC64)
2403                    || !SYMBOL_CALLS_LOCAL (info, h)))
2404               || (ELIMINATE_COPY_RELOCS
2405                   && !info->shared
2406                   && h != NULL
2407                   && h->dynindx != -1
2408                   && !h->non_got_ref
2409                   && ((h->def_dynamic
2410                        && !h->def_regular)
2411                       || h->root.type == bfd_link_hash_undefweak
2412                       || h->root.type == bfd_link_hash_undefined)))
2413             {
2414               Elf_Internal_Rela outrel;
2415               bfd_byte *loc;
2416               bfd_boolean skip, relocate;
2417               asection *sreloc;
2418
2419               /* When generating a shared object, these relocations
2420                  are copied into the output file to be resolved at run
2421                  time.  */
2422               skip = FALSE;
2423               relocate = FALSE;
2424
2425               outrel.r_offset =
2426                 _bfd_elf_section_offset (output_bfd, info, input_section,
2427                                          rel->r_offset);
2428               if (outrel.r_offset == (bfd_vma) -1)
2429                 skip = TRUE;
2430               else if (outrel.r_offset == (bfd_vma) -2)
2431                 skip = TRUE, relocate = TRUE;
2432
2433               outrel.r_offset += (input_section->output_section->vma
2434                                   + input_section->output_offset);
2435
2436               if (skip)
2437                 memset (&outrel, 0, sizeof outrel);
2438
2439               /* h->dynindx may be -1 if this symbol was marked to
2440                  become local.  */
2441               else if (h != NULL
2442                        && h->dynindx != -1
2443                        && (r_type == R_X86_64_PC8
2444                            || r_type == R_X86_64_PC16
2445                            || r_type == R_X86_64_PC32
2446                            || r_type == R_X86_64_PC64
2447                            || !info->shared
2448                            || !info->symbolic
2449                            || !h->def_regular))
2450                 {
2451                   outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
2452                   outrel.r_addend = rel->r_addend;
2453                 }
2454               else
2455                 {
2456                   /* This symbol is local, or marked to become local.  */
2457                   if (r_type == R_X86_64_64)
2458                     {
2459                       relocate = TRUE;
2460                       outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
2461                       outrel.r_addend = relocation + rel->r_addend;
2462                     }
2463                   else
2464                     {
2465                       long sindx;
2466
2467                       if (bfd_is_abs_section (sec))
2468                         sindx = 0;
2469                       else if (sec == NULL || sec->owner == NULL)
2470                         {
2471                           bfd_set_error (bfd_error_bad_value);
2472                           return FALSE;
2473                         }
2474                       else
2475                         {
2476                           asection *osec;
2477
2478                           osec = sec->output_section;
2479                           sindx = elf_section_data (osec)->dynindx;
2480                           BFD_ASSERT (sindx > 0);
2481                         }
2482
2483                       outrel.r_info = ELF64_R_INFO (sindx, r_type);
2484                       outrel.r_addend = relocation + rel->r_addend;
2485                     }
2486                 }
2487
2488               sreloc = elf_section_data (input_section)->sreloc;
2489               if (sreloc == NULL)
2490                 abort ();
2491
2492               loc = sreloc->contents;
2493               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2494               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2495
2496               /* If this reloc is against an external symbol, we do
2497                  not want to fiddle with the addend.  Otherwise, we
2498                  need to include the symbol value so that it becomes
2499                  an addend for the dynamic reloc.  */
2500               if (! relocate)
2501                 continue;
2502             }
2503
2504           break;
2505
2506         case R_X86_64_TLSGD:
2507         case R_X86_64_GOTPC32_TLSDESC:
2508         case R_X86_64_TLSDESC_CALL:
2509         case R_X86_64_GOTTPOFF:
2510           r_type = elf64_x86_64_tls_transition (info, r_type, h == NULL);
2511           tls_type = GOT_UNKNOWN;
2512           if (h == NULL && local_got_offsets)
2513             tls_type = elf64_x86_64_local_got_tls_type (input_bfd) [r_symndx];
2514           else if (h != NULL)
2515             {
2516               tls_type = elf64_x86_64_hash_entry (h)->tls_type;
2517               if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
2518                 r_type = R_X86_64_TPOFF32;
2519             }
2520           if (r_type == R_X86_64_TLSGD
2521               || r_type == R_X86_64_GOTPC32_TLSDESC
2522               || r_type == R_X86_64_TLSDESC_CALL)
2523             {
2524               if (tls_type == GOT_TLS_IE)
2525                 r_type = R_X86_64_GOTTPOFF;
2526             }
2527
2528           if (r_type == R_X86_64_TPOFF32)
2529             {
2530               BFD_ASSERT (! unresolved_reloc);
2531               if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
2532                 {
2533                   unsigned int i;
2534                   static unsigned char tlsgd[8]
2535                     = { 0x66, 0x48, 0x8d, 0x3d, 0x66, 0x66, 0x48, 0xe8 };
2536
2537                   /* GD->LE transition.
2538                      .byte 0x66; leaq foo@tlsgd(%rip), %rdi
2539                      .word 0x6666; rex64; call __tls_get_addr@plt
2540                      Change it into:
2541                      movq %fs:0, %rax
2542                      leaq foo@tpoff(%rax), %rax */
2543                   BFD_ASSERT (rel->r_offset >= 4);
2544                   for (i = 0; i < 4; i++)
2545                     BFD_ASSERT (bfd_get_8 (input_bfd,
2546                                            contents + rel->r_offset - 4 + i)
2547                                 == tlsgd[i]);
2548                   BFD_ASSERT (rel->r_offset + 12 <= input_section->size);
2549                   for (i = 0; i < 4; i++)
2550                     BFD_ASSERT (bfd_get_8 (input_bfd,
2551                                            contents + rel->r_offset + 4 + i)
2552                                 == tlsgd[i+4]);
2553                   BFD_ASSERT (rel + 1 < relend);
2554                   BFD_ASSERT (ELF64_R_TYPE (rel[1].r_info) == R_X86_64_PLT32);
2555                   memcpy (contents + rel->r_offset - 4,
2556                           "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
2557                           16);
2558                   bfd_put_32 (output_bfd, tpoff (info, relocation),
2559                               contents + rel->r_offset + 8);
2560                   /* Skip R_X86_64_PLT32.  */
2561                   rel++;
2562                   continue;
2563                 }
2564               else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
2565                 {
2566                   /* GDesc -> LE transition.
2567                      It's originally something like:
2568                      leaq x@tlsdesc(%rip), %rax
2569
2570                      Change it to:
2571                      movl $x@tpoff, %rax
2572
2573                      Registers other than %rax may be set up here.  */
2574
2575                   unsigned int val, type, type2;
2576                   bfd_vma roff;
2577
2578                   /* First, make sure it's a leaq adding rip to a
2579                      32-bit offset into any register, although it's
2580                      probably almost always going to be rax.  */
2581                   roff = rel->r_offset;
2582                   BFD_ASSERT (roff >= 3);
2583                   type = bfd_get_8 (input_bfd, contents + roff - 3);
2584                   BFD_ASSERT ((type & 0xfb) == 0x48);
2585                   type2 = bfd_get_8 (input_bfd, contents + roff - 2);
2586                   BFD_ASSERT (type2 == 0x8d);
2587                   val = bfd_get_8 (input_bfd, contents + roff - 1);
2588                   BFD_ASSERT ((val & 0xc7) == 0x05);
2589                   BFD_ASSERT (roff + 4 <= input_section->size);
2590
2591                   /* Now modify the instruction as appropriate.  */
2592                   bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
2593                              contents + roff - 3);
2594                   bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
2595                   bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
2596                              contents + roff - 1);
2597                   bfd_put_32 (output_bfd, tpoff (info, relocation),
2598                               contents + roff);
2599                   continue;
2600                 }
2601               else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
2602                 {
2603                   /* GDesc -> LE transition.
2604                      It's originally:
2605                      call *(%rax)
2606                      Turn it into:
2607                      nop; nop.  */
2608
2609                   unsigned int val, type;
2610                   bfd_vma roff;
2611
2612                   /* First, make sure it's a call *(%rax).  */
2613                   roff = rel->r_offset;
2614                   BFD_ASSERT (roff + 2 <= input_section->size);
2615                   type = bfd_get_8 (input_bfd, contents + roff);
2616                   BFD_ASSERT (type == 0xff);
2617                   val = bfd_get_8 (input_bfd, contents + roff + 1);
2618                   BFD_ASSERT (val == 0x10);
2619
2620                   /* Now modify the instruction as appropriate.  */
2621                   bfd_put_8 (output_bfd, 0x90, contents + roff);
2622                   bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
2623                   continue;
2624                 }
2625               else
2626                 {
2627                   unsigned int val, type, reg;
2628
2629                   /* IE->LE transition:
2630                      Originally it can be one of:
2631                      movq foo@gottpoff(%rip), %reg
2632                      addq foo@gottpoff(%rip), %reg
2633                      We change it into:
2634                      movq $foo, %reg
2635                      leaq foo(%reg), %reg
2636                      addq $foo, %reg.  */
2637                   BFD_ASSERT (rel->r_offset >= 3);
2638                   val = bfd_get_8 (input_bfd, contents + rel->r_offset - 3);
2639                   BFD_ASSERT (val == 0x48 || val == 0x4c);
2640                   type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
2641                   BFD_ASSERT (type == 0x8b || type == 0x03);
2642                   reg = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
2643                   BFD_ASSERT ((reg & 0xc7) == 5);
2644                   reg >>= 3;
2645                   BFD_ASSERT (rel->r_offset + 4 <= input_section->size);
2646                   if (type == 0x8b)
2647                     {
2648                       /* movq */
2649                       if (val == 0x4c)
2650                         bfd_put_8 (output_bfd, 0x49,
2651                                    contents + rel->r_offset - 3);
2652                       bfd_put_8 (output_bfd, 0xc7,
2653                                  contents + rel->r_offset - 2);
2654                       bfd_put_8 (output_bfd, 0xc0 | reg,
2655                                  contents + rel->r_offset - 1);
2656                     }
2657                   else if (reg == 4)
2658                     {
2659                       /* addq -> addq - addressing with %rsp/%r12 is
2660                          special  */
2661                       if (val == 0x4c)
2662                         bfd_put_8 (output_bfd, 0x49,
2663                                    contents + rel->r_offset - 3);
2664                       bfd_put_8 (output_bfd, 0x81,
2665                                  contents + rel->r_offset - 2);
2666                       bfd_put_8 (output_bfd, 0xc0 | reg,
2667                                  contents + rel->r_offset - 1);
2668                     }
2669                   else
2670                     {
2671                       /* addq -> leaq */
2672                       if (val == 0x4c)
2673                         bfd_put_8 (output_bfd, 0x4d,
2674                                    contents + rel->r_offset - 3);
2675                       bfd_put_8 (output_bfd, 0x8d,
2676                                  contents + rel->r_offset - 2);
2677                       bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
2678                                  contents + rel->r_offset - 1);
2679                     }
2680                   bfd_put_32 (output_bfd, tpoff (info, relocation),
2681                               contents + rel->r_offset);
2682                   continue;
2683                 }
2684             }
2685
2686           if (htab->sgot == NULL)
2687             abort ();
2688
2689           if (h != NULL)
2690             {
2691               off = h->got.offset;
2692               offplt = elf64_x86_64_hash_entry (h)->tlsdesc_got;
2693             }
2694           else
2695             {
2696               if (local_got_offsets == NULL)
2697                 abort ();
2698
2699               off = local_got_offsets[r_symndx];
2700               offplt = local_tlsdesc_gotents[r_symndx];
2701             }
2702
2703           if ((off & 1) != 0)
2704             off &= ~1;
2705           else
2706             {
2707               Elf_Internal_Rela outrel;
2708               bfd_byte *loc;
2709               int dr_type, indx;
2710               asection *sreloc;
2711
2712               if (htab->srelgot == NULL)
2713                 abort ();
2714
2715               indx = h && h->dynindx != -1 ? h->dynindx : 0;
2716
2717               if (GOT_TLS_GDESC_P (tls_type))
2718                 {
2719                   outrel.r_info = ELF64_R_INFO (indx, R_X86_64_TLSDESC);
2720                   BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
2721                               + 2 * GOT_ENTRY_SIZE <= htab->sgotplt->size);
2722                   outrel.r_offset = (htab->sgotplt->output_section->vma
2723                                      + htab->sgotplt->output_offset
2724                                      + offplt
2725                                      + htab->sgotplt_jump_table_size);
2726                   sreloc = htab->srelplt;
2727                   loc = sreloc->contents;
2728                   loc += sreloc->reloc_count++
2729                     * sizeof (Elf64_External_Rela);
2730                   BFD_ASSERT (loc + sizeof (Elf64_External_Rela)
2731                               <= sreloc->contents + sreloc->size);
2732                   if (indx == 0)
2733                     outrel.r_addend = relocation - dtpoff_base (info);
2734                   else
2735                     outrel.r_addend = 0;
2736                   bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2737                 }
2738
2739               sreloc = htab->srelgot;
2740
2741               outrel.r_offset = (htab->sgot->output_section->vma
2742                                  + htab->sgot->output_offset + off);
2743
2744               if (GOT_TLS_GD_P (tls_type))
2745                 dr_type = R_X86_64_DTPMOD64;
2746               else if (GOT_TLS_GDESC_P (tls_type))
2747                 goto dr_done;
2748               else
2749                 dr_type = R_X86_64_TPOFF64;
2750
2751               bfd_put_64 (output_bfd, 0, htab->sgot->contents + off);
2752               outrel.r_addend = 0;
2753               if ((dr_type == R_X86_64_TPOFF64
2754                    || dr_type == R_X86_64_TLSDESC) && indx == 0)
2755                 outrel.r_addend = relocation - dtpoff_base (info);
2756               outrel.r_info = ELF64_R_INFO (indx, dr_type);
2757
2758               loc = sreloc->contents;
2759               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2760               BFD_ASSERT (loc + sizeof (Elf64_External_Rela)
2761                           <= sreloc->contents + sreloc->size);
2762               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2763
2764               if (GOT_TLS_GD_P (tls_type))
2765                 {
2766                   if (indx == 0)
2767                     {
2768                       BFD_ASSERT (! unresolved_reloc);
2769                       bfd_put_64 (output_bfd,
2770                                   relocation - dtpoff_base (info),
2771                                   htab->sgot->contents + off + GOT_ENTRY_SIZE);
2772                     }
2773                   else
2774                     {
2775                       bfd_put_64 (output_bfd, 0,
2776                                   htab->sgot->contents + off + GOT_ENTRY_SIZE);
2777                       outrel.r_info = ELF64_R_INFO (indx,
2778                                                     R_X86_64_DTPOFF64);
2779                       outrel.r_offset += GOT_ENTRY_SIZE;
2780                       sreloc->reloc_count++;
2781                       loc += sizeof (Elf64_External_Rela);
2782                       BFD_ASSERT (loc + sizeof (Elf64_External_Rela)
2783                                   <= sreloc->contents + sreloc->size);
2784                       bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2785                     }
2786                 }
2787
2788             dr_done:
2789               if (h != NULL)
2790                 h->got.offset |= 1;
2791               else
2792                 local_got_offsets[r_symndx] |= 1;
2793             }
2794
2795           if (off >= (bfd_vma) -2
2796               && ! GOT_TLS_GDESC_P (tls_type))
2797             abort ();
2798           if (r_type == ELF64_R_TYPE (rel->r_info))
2799             {
2800               if (r_type == R_X86_64_GOTPC32_TLSDESC
2801                   || r_type == R_X86_64_TLSDESC_CALL)
2802                 relocation = htab->sgotplt->output_section->vma
2803                   + htab->sgotplt->output_offset
2804                   + offplt + htab->sgotplt_jump_table_size;
2805               else
2806                 relocation = htab->sgot->output_section->vma
2807                   + htab->sgot->output_offset + off;
2808               unresolved_reloc = FALSE;
2809             }
2810           else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
2811             {
2812               unsigned int i;
2813               static unsigned char tlsgd[8]
2814                 = { 0x66, 0x48, 0x8d, 0x3d, 0x66, 0x66, 0x48, 0xe8 };
2815
2816               /* GD->IE transition.
2817                  .byte 0x66; leaq foo@tlsgd(%rip), %rdi
2818                  .word 0x6666; rex64; call __tls_get_addr@plt
2819                  Change it into:
2820                  movq %fs:0, %rax
2821                  addq foo@gottpoff(%rip), %rax */
2822               BFD_ASSERT (rel->r_offset >= 4);
2823               for (i = 0; i < 4; i++)
2824                 BFD_ASSERT (bfd_get_8 (input_bfd,
2825                                        contents + rel->r_offset - 4 + i)
2826                             == tlsgd[i]);
2827               BFD_ASSERT (rel->r_offset + 12 <= input_section->size);
2828               for (i = 0; i < 4; i++)
2829                 BFD_ASSERT (bfd_get_8 (input_bfd,
2830                                        contents + rel->r_offset + 4 + i)
2831                             == tlsgd[i+4]);
2832               BFD_ASSERT (rel + 1 < relend);
2833               BFD_ASSERT (ELF64_R_TYPE (rel[1].r_info) == R_X86_64_PLT32);
2834               memcpy (contents + rel->r_offset - 4,
2835                       "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
2836                       16);
2837
2838               relocation = (htab->sgot->output_section->vma
2839                             + htab->sgot->output_offset + off
2840                             - rel->r_offset
2841                             - input_section->output_section->vma
2842                             - input_section->output_offset
2843                             - 12);
2844               bfd_put_32 (output_bfd, relocation,
2845                           contents + rel->r_offset + 8);
2846               /* Skip R_X86_64_PLT32.  */
2847               rel++;
2848               continue;
2849             }
2850           else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
2851             {
2852               /* GDesc -> IE transition.
2853                  It's originally something like:
2854                  leaq x@tlsdesc(%rip), %rax
2855
2856                  Change it to:
2857                  movq x@gottpoff(%rip), %rax # before nop; nop
2858
2859                  Registers other than %rax may be set up here.  */
2860
2861               unsigned int val, type, type2;
2862               bfd_vma roff;
2863
2864               /* First, make sure it's a leaq adding rip to a 32-bit
2865                  offset into any register, although it's probably
2866                  almost always going to be rax.  */
2867               roff = rel->r_offset;
2868               BFD_ASSERT (roff >= 3);
2869               type = bfd_get_8 (input_bfd, contents + roff - 3);
2870               BFD_ASSERT ((type & 0xfb) == 0x48);
2871               type2 = bfd_get_8 (input_bfd, contents + roff - 2);
2872               BFD_ASSERT (type2 == 0x8d);
2873               val = bfd_get_8 (input_bfd, contents + roff - 1);
2874               BFD_ASSERT ((val & 0xc7) == 0x05);
2875               BFD_ASSERT (roff + 4 <= input_section->size);
2876
2877               /* Now modify the instruction as appropriate.  */
2878               /* To turn a leaq into a movq in the form we use it, it
2879                  suffices to change the second byte from 0x8d to
2880                  0x8b.  */
2881               bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
2882
2883               bfd_put_32 (output_bfd,
2884                           htab->sgot->output_section->vma
2885                           + htab->sgot->output_offset + off
2886                           - rel->r_offset
2887                           - input_section->output_section->vma
2888                           - input_section->output_offset
2889                           - 4,
2890                           contents + roff);
2891               continue;
2892             }
2893           else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
2894             {
2895               /* GDesc -> IE transition.
2896                  It's originally:
2897                  call *(%rax)
2898
2899                  Change it to:
2900                  nop; nop.  */
2901
2902               unsigned int val, type;
2903               bfd_vma roff;
2904
2905               /* First, make sure it's a call *(%eax).  */
2906               roff = rel->r_offset;
2907               BFD_ASSERT (roff + 2 <= input_section->size);
2908               type = bfd_get_8 (input_bfd, contents + roff);
2909               BFD_ASSERT (type == 0xff);
2910               val = bfd_get_8 (input_bfd, contents + roff + 1);
2911               BFD_ASSERT (val == 0x10);
2912
2913               /* Now modify the instruction as appropriate.  */
2914               bfd_put_8 (output_bfd, 0x90, contents + roff);
2915               bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
2916
2917               continue;
2918             }
2919           else
2920             BFD_ASSERT (FALSE);
2921           break;
2922
2923         case R_X86_64_TLSLD:
2924           if (! info->shared)
2925             {
2926               /* LD->LE transition:
2927                  Ensure it is:
2928                  leaq foo@tlsld(%rip), %rdi; call __tls_get_addr@plt.
2929                  We change it into:
2930                  .word 0x6666; .byte 0x66; movl %fs:0, %rax.  */
2931               BFD_ASSERT (rel->r_offset >= 3);
2932               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 3)
2933                           == 0x48);
2934               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 2)
2935                           == 0x8d);
2936               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 1)
2937                           == 0x3d);
2938               BFD_ASSERT (rel->r_offset + 9 <= input_section->size);
2939               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4)
2940                           == 0xe8);
2941               BFD_ASSERT (rel + 1 < relend);
2942               BFD_ASSERT (ELF64_R_TYPE (rel[1].r_info) == R_X86_64_PLT32);
2943               memcpy (contents + rel->r_offset - 3,
2944                       "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
2945               /* Skip R_X86_64_PLT32.  */
2946               rel++;
2947               continue;
2948             }
2949
2950           if (htab->sgot == NULL)
2951             abort ();
2952
2953           off = htab->tls_ld_got.offset;
2954           if (off & 1)
2955             off &= ~1;
2956           else
2957             {
2958               Elf_Internal_Rela outrel;
2959               bfd_byte *loc;
2960
2961               if (htab->srelgot == NULL)
2962                 abort ();
2963
2964               outrel.r_offset = (htab->sgot->output_section->vma
2965                                  + htab->sgot->output_offset + off);
2966
2967               bfd_put_64 (output_bfd, 0,
2968                           htab->sgot->contents + off);
2969               bfd_put_64 (output_bfd, 0,
2970                           htab->sgot->contents + off + GOT_ENTRY_SIZE);
2971               outrel.r_info = ELF64_R_INFO (0, R_X86_64_DTPMOD64);
2972               outrel.r_addend = 0;
2973               loc = htab->srelgot->contents;
2974               loc += htab->srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
2975               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2976               htab->tls_ld_got.offset |= 1;
2977             }
2978           relocation = htab->sgot->output_section->vma
2979                        + htab->sgot->output_offset + off;
2980           unresolved_reloc = FALSE;
2981           break;
2982
2983         case R_X86_64_DTPOFF32:
2984           if (info->shared || (input_section->flags & SEC_CODE) == 0)
2985             relocation -= dtpoff_base (info);
2986           else
2987             relocation = tpoff (info, relocation);
2988           break;
2989
2990         case R_X86_64_TPOFF32:
2991           BFD_ASSERT (! info->shared);
2992           relocation = tpoff (info, relocation);
2993           break;
2994
2995         default:
2996           break;
2997         }
2998
2999       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3000          because such sections are not SEC_ALLOC and thus ld.so will
3001          not process them.  */
3002       if (unresolved_reloc
3003           && !((input_section->flags & SEC_DEBUGGING) != 0
3004                && h->def_dynamic))
3005         (*_bfd_error_handler)
3006           (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3007            input_bfd,
3008            input_section,
3009            (long) rel->r_offset,
3010            howto->name,
3011            h->root.root.string);
3012
3013       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3014                                     contents, rel->r_offset,
3015                                     relocation, rel->r_addend);
3016
3017       if (r != bfd_reloc_ok)
3018         {
3019           const char *name;
3020
3021           if (h != NULL)
3022             name = h->root.root.string;
3023           else
3024             {
3025               name = bfd_elf_string_from_elf_section (input_bfd,
3026                                                       symtab_hdr->sh_link,
3027                                                       sym->st_name);
3028               if (name == NULL)
3029                 return FALSE;
3030               if (*name == '\0')
3031                 name = bfd_section_name (input_bfd, sec);
3032             }
3033
3034           if (r == bfd_reloc_overflow)
3035             {
3036               if (h != NULL
3037                   && h->root.type == bfd_link_hash_undefweak
3038                   && howto->pc_relative)
3039                 /* Ignore reloc overflow on branches to undefweak syms.  */
3040                 continue;
3041
3042               if (! ((*info->callbacks->reloc_overflow)
3043                      (info, (h ? &h->root : NULL), name, howto->name,
3044                       (bfd_vma) 0, input_bfd, input_section,
3045                       rel->r_offset)))
3046                 return FALSE;
3047             }
3048           else
3049             {
3050               (*_bfd_error_handler)
3051                 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
3052                  input_bfd, input_section,
3053                  (long) rel->r_offset, name, (int) r);
3054               return FALSE;
3055             }
3056         }
3057     }
3058
3059   return TRUE;
3060 }
3061
3062 /* Finish up dynamic symbol handling.  We set the contents of various
3063    dynamic sections here.  */
3064
3065 static bfd_boolean
3066 elf64_x86_64_finish_dynamic_symbol (bfd *output_bfd,
3067                                     struct bfd_link_info *info,
3068                                     struct elf_link_hash_entry *h,
3069                                     Elf_Internal_Sym *sym)
3070 {
3071   struct elf64_x86_64_link_hash_table *htab;
3072
3073   htab = elf64_x86_64_hash_table (info);
3074
3075   if (h->plt.offset != (bfd_vma) -1)
3076     {
3077       bfd_vma plt_index;
3078       bfd_vma got_offset;
3079       Elf_Internal_Rela rela;
3080       bfd_byte *loc;
3081
3082       /* This symbol has an entry in the procedure linkage table.  Set
3083          it up.  */
3084       if (h->dynindx == -1
3085           || htab->splt == NULL
3086           || htab->sgotplt == NULL
3087           || htab->srelplt == NULL)
3088         abort ();
3089
3090       /* Get the index in the procedure linkage table which
3091          corresponds to this symbol.  This is the index of this symbol
3092          in all the symbols for which we are making plt entries.  The
3093          first entry in the procedure linkage table is reserved.  */
3094       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
3095
3096       /* Get the offset into the .got table of the entry that
3097          corresponds to this function.  Each .got entry is GOT_ENTRY_SIZE
3098          bytes. The first three are reserved for the dynamic linker.  */
3099       got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
3100
3101       /* Fill in the entry in the procedure linkage table.  */
3102       memcpy (htab->splt->contents + h->plt.offset, elf64_x86_64_plt_entry,
3103               PLT_ENTRY_SIZE);
3104
3105       /* Insert the relocation positions of the plt section.  The magic
3106          numbers at the end of the statements are the positions of the
3107          relocations in the plt section.  */
3108       /* Put offset for jmp *name@GOTPCREL(%rip), since the
3109          instruction uses 6 bytes, subtract this value.  */
3110       bfd_put_32 (output_bfd,
3111                       (htab->sgotplt->output_section->vma
3112                        + htab->sgotplt->output_offset
3113                        + got_offset
3114                        - htab->splt->output_section->vma
3115                        - htab->splt->output_offset
3116                        - h->plt.offset
3117                        - 6),
3118                   htab->splt->contents + h->plt.offset + 2);
3119       /* Put relocation index.  */
3120       bfd_put_32 (output_bfd, plt_index,
3121                   htab->splt->contents + h->plt.offset + 7);
3122       /* Put offset for jmp .PLT0.  */
3123       bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
3124                   htab->splt->contents + h->plt.offset + 12);
3125
3126       /* Fill in the entry in the global offset table, initially this
3127          points to the pushq instruction in the PLT which is at offset 6.  */
3128       bfd_put_64 (output_bfd, (htab->splt->output_section->vma
3129                                + htab->splt->output_offset
3130                                + h->plt.offset + 6),
3131                   htab->sgotplt->contents + got_offset);
3132
3133       /* Fill in the entry in the .rela.plt section.  */
3134       rela.r_offset = (htab->sgotplt->output_section->vma
3135                        + htab->sgotplt->output_offset
3136                        + got_offset);
3137       rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_JUMP_SLOT);
3138       rela.r_addend = 0;
3139       loc = htab->srelplt->contents + plt_index * sizeof (Elf64_External_Rela);
3140       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3141
3142       if (!h->def_regular)
3143         {
3144           /* Mark the symbol as undefined, rather than as defined in
3145              the .plt section.  Leave the value if there were any
3146              relocations where pointer equality matters (this is a clue
3147              for the dynamic linker, to make function pointer
3148              comparisons work between an application and shared
3149              library), otherwise set it to zero.  If a function is only
3150              called from a binary, there is no need to slow down
3151              shared libraries because of that.  */
3152           sym->st_shndx = SHN_UNDEF;
3153           if (!h->pointer_equality_needed)
3154             sym->st_value = 0;
3155         }
3156     }
3157
3158   if (h->got.offset != (bfd_vma) -1
3159       && ! GOT_TLS_GD_ANY_P (elf64_x86_64_hash_entry (h)->tls_type)
3160       && elf64_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE)
3161     {
3162       Elf_Internal_Rela rela;
3163       bfd_byte *loc;
3164
3165       /* This symbol has an entry in the global offset table.  Set it
3166          up.  */
3167       if (htab->sgot == NULL || htab->srelgot == NULL)
3168         abort ();
3169
3170       rela.r_offset = (htab->sgot->output_section->vma
3171                        + htab->sgot->output_offset
3172                        + (h->got.offset &~ (bfd_vma) 1));
3173
3174       /* If this is a static link, or it is a -Bsymbolic link and the
3175          symbol is defined locally or was forced to be local because
3176          of a version file, we just want to emit a RELATIVE reloc.
3177          The entry in the global offset table will already have been
3178          initialized in the relocate_section function.  */
3179       if (info->shared
3180           && SYMBOL_REFERENCES_LOCAL (info, h))
3181         {
3182           BFD_ASSERT((h->got.offset & 1) != 0);
3183           rela.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
3184           rela.r_addend = (h->root.u.def.value
3185                            + h->root.u.def.section->output_section->vma
3186                            + h->root.u.def.section->output_offset);
3187         }
3188       else
3189         {
3190           BFD_ASSERT((h->got.offset & 1) == 0);
3191           bfd_put_64 (output_bfd, (bfd_vma) 0,
3192                       htab->sgot->contents + h->got.offset);
3193           rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_GLOB_DAT);
3194           rela.r_addend = 0;
3195         }
3196
3197       loc = htab->srelgot->contents;
3198       loc += htab->srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
3199       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3200     }
3201
3202   if (h->needs_copy)
3203     {
3204       Elf_Internal_Rela rela;
3205       bfd_byte *loc;
3206
3207       /* This symbol needs a copy reloc.  Set it up.  */
3208
3209       if (h->dynindx == -1
3210           || (h->root.type != bfd_link_hash_defined
3211               && h->root.type != bfd_link_hash_defweak)
3212           || htab->srelbss == NULL)
3213         abort ();
3214
3215       rela.r_offset = (h->root.u.def.value
3216                        + h->root.u.def.section->output_section->vma
3217                        + h->root.u.def.section->output_offset);
3218       rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_COPY);
3219       rela.r_addend = 0;
3220       loc = htab->srelbss->contents;
3221       loc += htab->srelbss->reloc_count++ * sizeof (Elf64_External_Rela);
3222       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3223     }
3224
3225   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
3226   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3227       || h == htab->elf.hgot)
3228     sym->st_shndx = SHN_ABS;
3229
3230   return TRUE;
3231 }
3232
3233 /* Used to decide how to sort relocs in an optimal manner for the
3234    dynamic linker, before writing them out.  */
3235
3236 static enum elf_reloc_type_class
3237 elf64_x86_64_reloc_type_class (const Elf_Internal_Rela *rela)
3238 {
3239   switch ((int) ELF64_R_TYPE (rela->r_info))
3240     {
3241     case R_X86_64_RELATIVE:
3242       return reloc_class_relative;
3243     case R_X86_64_JUMP_SLOT:
3244       return reloc_class_plt;
3245     case R_X86_64_COPY:
3246       return reloc_class_copy;
3247     default:
3248       return reloc_class_normal;
3249     }
3250 }
3251
3252 /* Finish up the dynamic sections.  */
3253
3254 static bfd_boolean
3255 elf64_x86_64_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
3256 {
3257   struct elf64_x86_64_link_hash_table *htab;
3258   bfd *dynobj;
3259   asection *sdyn;
3260
3261   htab = elf64_x86_64_hash_table (info);
3262   dynobj = htab->elf.dynobj;
3263   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3264
3265   if (htab->elf.dynamic_sections_created)
3266     {
3267       Elf64_External_Dyn *dyncon, *dynconend;
3268
3269       if (sdyn == NULL || htab->sgot == NULL)
3270         abort ();
3271
3272       dyncon = (Elf64_External_Dyn *) sdyn->contents;
3273       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
3274       for (; dyncon < dynconend; dyncon++)
3275         {
3276           Elf_Internal_Dyn dyn;
3277           asection *s;
3278
3279           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3280
3281           switch (dyn.d_tag)
3282             {
3283             default:
3284               continue;
3285
3286             case DT_PLTGOT:
3287               s = htab->sgotplt;
3288               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3289               break;
3290
3291             case DT_JMPREL:
3292               dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
3293               break;
3294
3295             case DT_PLTRELSZ:
3296               s = htab->srelplt->output_section;
3297               dyn.d_un.d_val = s->size;
3298               break;
3299
3300             case DT_RELASZ:
3301               /* The procedure linkage table relocs (DT_JMPREL) should
3302                  not be included in the overall relocs (DT_RELA).
3303                  Therefore, we override the DT_RELASZ entry here to
3304                  make it not include the JMPREL relocs.  Since the
3305                  linker script arranges for .rela.plt to follow all
3306                  other relocation sections, we don't have to worry
3307                  about changing the DT_RELA entry.  */
3308               if (htab->srelplt != NULL)
3309                 {
3310                   s = htab->srelplt->output_section;
3311                   dyn.d_un.d_val -= s->size;
3312                 }
3313               break;
3314
3315             case DT_TLSDESC_PLT:
3316               s = htab->splt;
3317               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
3318                 + htab->tlsdesc_plt;
3319               break;
3320
3321             case DT_TLSDESC_GOT:
3322               s = htab->sgot;
3323               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
3324                 + htab->tlsdesc_got;
3325               break;
3326             }
3327
3328           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3329         }
3330
3331       /* Fill in the special first entry in the procedure linkage table.  */
3332       if (htab->splt && htab->splt->size > 0)
3333         {
3334           /* Fill in the first entry in the procedure linkage table.  */
3335           memcpy (htab->splt->contents, elf64_x86_64_plt0_entry,
3336                   PLT_ENTRY_SIZE);
3337           /* Add offset for pushq GOT+8(%rip), since the instruction
3338              uses 6 bytes subtract this value.  */
3339           bfd_put_32 (output_bfd,
3340                       (htab->sgotplt->output_section->vma
3341                        + htab->sgotplt->output_offset
3342                        + 8
3343                        - htab->splt->output_section->vma
3344                        - htab->splt->output_offset
3345                        - 6),
3346                       htab->splt->contents + 2);
3347           /* Add offset for jmp *GOT+16(%rip). The 12 is the offset to
3348              the end of the instruction.  */
3349           bfd_put_32 (output_bfd,
3350                       (htab->sgotplt->output_section->vma
3351                        + htab->sgotplt->output_offset
3352                        + 16
3353                        - htab->splt->output_section->vma
3354                        - htab->splt->output_offset
3355                        - 12),
3356                       htab->splt->contents + 8);
3357
3358           elf_section_data (htab->splt->output_section)->this_hdr.sh_entsize =
3359             PLT_ENTRY_SIZE;
3360
3361           if (htab->tlsdesc_plt)
3362             {
3363               bfd_put_64 (output_bfd, (bfd_vma) 0,
3364                           htab->sgot->contents + htab->tlsdesc_got);
3365
3366               memcpy (htab->splt->contents + htab->tlsdesc_plt,
3367                       elf64_x86_64_plt0_entry,
3368                       PLT_ENTRY_SIZE);
3369
3370               /* Add offset for pushq GOT+8(%rip), since the
3371                  instruction uses 6 bytes subtract this value.  */
3372               bfd_put_32 (output_bfd,
3373                           (htab->sgotplt->output_section->vma
3374                            + htab->sgotplt->output_offset
3375                            + 8
3376                            - htab->splt->output_section->vma
3377                            - htab->splt->output_offset
3378                            - htab->tlsdesc_plt
3379                            - 6),
3380                           htab->splt->contents + htab->tlsdesc_plt + 2);
3381               /* Add offset for jmp *GOT+TDG(%rip), where TGD stands for
3382                  htab->tlsdesc_got. The 12 is the offset to the end of
3383                  the instruction.  */
3384               bfd_put_32 (output_bfd,
3385                           (htab->sgot->output_section->vma
3386                            + htab->sgot->output_offset
3387                            + htab->tlsdesc_got
3388                            - htab->splt->output_section->vma
3389                            - htab->splt->output_offset
3390                            - htab->tlsdesc_plt
3391                            - 12),
3392                           htab->splt->contents + htab->tlsdesc_plt + 8);
3393             }
3394         }
3395     }
3396
3397   if (htab->sgotplt)
3398     {
3399       /* Fill in the first three entries in the global offset table.  */
3400       if (htab->sgotplt->size > 0)
3401         {
3402           /* Set the first entry in the global offset table to the address of
3403              the dynamic section.  */
3404           if (sdyn == NULL)
3405             bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents);
3406           else
3407             bfd_put_64 (output_bfd,
3408                         sdyn->output_section->vma + sdyn->output_offset,
3409                         htab->sgotplt->contents);
3410           /* Write GOT[1] and GOT[2], needed for the dynamic linker.  */
3411           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + GOT_ENTRY_SIZE);
3412           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + GOT_ENTRY_SIZE*2);
3413         }
3414
3415       elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize =
3416         GOT_ENTRY_SIZE;
3417     }
3418
3419   if (htab->sgot && htab->sgot->size > 0)
3420     elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize
3421       = GOT_ENTRY_SIZE;
3422
3423   return TRUE;
3424 }
3425
3426 /* Return address for Ith PLT stub in section PLT, for relocation REL
3427    or (bfd_vma) -1 if it should not be included.  */
3428
3429 static bfd_vma
3430 elf64_x86_64_plt_sym_val (bfd_vma i, const asection *plt,
3431                           const arelent *rel ATTRIBUTE_UNUSED)
3432 {
3433   return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
3434 }
3435
3436 /* Handle an x86-64 specific section when reading an object file.  This
3437    is called when elfcode.h finds a section with an unknown type.  */
3438
3439 static bfd_boolean
3440 elf64_x86_64_section_from_shdr (bfd *abfd,
3441                                 Elf_Internal_Shdr *hdr,
3442                                 const char *name,
3443                                 int shindex)
3444 {
3445   if (hdr->sh_type != SHT_X86_64_UNWIND)
3446     return FALSE;
3447
3448   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
3449     return FALSE;
3450
3451   return TRUE;
3452 }
3453
3454 /* Hook called by the linker routine which adds symbols from an object
3455    file.  We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
3456    of .bss.  */
3457
3458 static bfd_boolean
3459 elf64_x86_64_add_symbol_hook (bfd *abfd,
3460                               struct bfd_link_info *info ATTRIBUTE_UNUSED,
3461                               Elf_Internal_Sym *sym,
3462                               const char **namep ATTRIBUTE_UNUSED,
3463                               flagword *flagsp ATTRIBUTE_UNUSED,
3464                               asection **secp, bfd_vma *valp)
3465 {
3466   asection *lcomm;
3467
3468   switch (sym->st_shndx)
3469     {
3470     case SHN_X86_64_LCOMMON:
3471       lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
3472       if (lcomm == NULL)
3473         {
3474           lcomm = bfd_make_section_with_flags (abfd,
3475                                                "LARGE_COMMON",
3476                                                (SEC_ALLOC
3477                                                 | SEC_IS_COMMON
3478                                                 | SEC_LINKER_CREATED));
3479           if (lcomm == NULL)
3480             return FALSE;
3481           elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
3482         }
3483       *secp = lcomm;
3484       *valp = sym->st_size;
3485       break;
3486     }
3487   return TRUE;
3488 }
3489
3490
3491 /* Given a BFD section, try to locate the corresponding ELF section
3492    index.  */
3493
3494 static bfd_boolean
3495 elf64_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
3496                                            asection *sec, int *index)
3497 {
3498   if (sec == &_bfd_elf_large_com_section)
3499     {
3500       *index = SHN_X86_64_LCOMMON;
3501       return TRUE;
3502     }
3503   return FALSE;
3504 }
3505
3506 /* Process a symbol.  */
3507
3508 static void
3509 elf64_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
3510                                 asymbol *asym)
3511 {
3512   elf_symbol_type *elfsym = (elf_symbol_type *) asym;
3513
3514   switch (elfsym->internal_elf_sym.st_shndx)
3515     {
3516     case SHN_X86_64_LCOMMON:
3517       asym->section = &_bfd_elf_large_com_section;
3518       asym->value = elfsym->internal_elf_sym.st_size;
3519       /* Common symbol doesn't set BSF_GLOBAL.  */
3520       asym->flags &= ~BSF_GLOBAL;
3521       break;
3522     }
3523 }
3524
3525 static bfd_boolean
3526 elf64_x86_64_common_definition (Elf_Internal_Sym *sym)
3527 {
3528   return (sym->st_shndx == SHN_COMMON
3529           || sym->st_shndx == SHN_X86_64_LCOMMON);
3530 }
3531
3532 static unsigned int
3533 elf64_x86_64_common_section_index (asection *sec)
3534 {
3535   if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
3536     return SHN_COMMON;
3537   else
3538     return SHN_X86_64_LCOMMON;
3539 }
3540
3541 static asection *
3542 elf64_x86_64_common_section (asection *sec)
3543 {
3544   if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
3545     return bfd_com_section_ptr;
3546   else
3547     return &_bfd_elf_large_com_section;
3548 }
3549
3550 static bfd_boolean
3551 elf64_x86_64_merge_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
3552                            struct elf_link_hash_entry **sym_hash ATTRIBUTE_UNUSED,
3553                            struct elf_link_hash_entry *h,
3554                            Elf_Internal_Sym *sym,
3555                            asection **psec,
3556                            bfd_vma *pvalue ATTRIBUTE_UNUSED,
3557                            unsigned int *pold_alignment ATTRIBUTE_UNUSED,
3558                            bfd_boolean *skip ATTRIBUTE_UNUSED,
3559                            bfd_boolean *override ATTRIBUTE_UNUSED,
3560                            bfd_boolean *type_change_ok ATTRIBUTE_UNUSED,
3561                            bfd_boolean *size_change_ok ATTRIBUTE_UNUSED,
3562                            bfd_boolean *newdef ATTRIBUTE_UNUSED,
3563                            bfd_boolean *newdyn,
3564                            bfd_boolean *newdyncommon ATTRIBUTE_UNUSED,
3565                            bfd_boolean *newweak ATTRIBUTE_UNUSED,
3566                            bfd *abfd ATTRIBUTE_UNUSED,
3567                            asection **sec,
3568                            bfd_boolean *olddef ATTRIBUTE_UNUSED,
3569                            bfd_boolean *olddyn,
3570                            bfd_boolean *olddyncommon ATTRIBUTE_UNUSED,
3571                            bfd_boolean *oldweak ATTRIBUTE_UNUSED,
3572                            bfd *oldbfd,
3573                            asection **oldsec)
3574 {
3575   /* A normal common symbol and a large common symbol result in a
3576      normal common symbol.  We turn the large common symbol into a
3577      normal one.  */
3578   if (!*olddyn
3579       && h->root.type == bfd_link_hash_common
3580       && !*newdyn
3581       && bfd_is_com_section (*sec)
3582       && *oldsec != *sec)
3583     {
3584       if (sym->st_shndx == SHN_COMMON
3585           && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) != 0)
3586         {
3587           h->root.u.c.p->section
3588             = bfd_make_section_old_way (oldbfd, "COMMON");
3589           h->root.u.c.p->section->flags = SEC_ALLOC;
3590         }
3591       else if (sym->st_shndx == SHN_X86_64_LCOMMON
3592                && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) == 0)
3593         *psec = *sec = bfd_com_section_ptr; 
3594     }
3595
3596   return TRUE;
3597 }
3598
3599 static int
3600 elf64_x86_64_additional_program_headers (bfd *abfd,
3601                                          struct bfd_link_info *info ATTRIBUTE_UNUSED)
3602 {
3603   asection *s;
3604   int count = 0; 
3605
3606   /* Check to see if we need a large readonly segment.  */
3607   s = bfd_get_section_by_name (abfd, ".lrodata");
3608   if (s && (s->flags & SEC_LOAD))
3609     count++;
3610
3611   /* Check to see if we need a large data segment.  Since .lbss sections
3612      is placed right after the .bss section, there should be no need for
3613      a large data segment just because of .lbss.  */
3614   s = bfd_get_section_by_name (abfd, ".ldata");
3615   if (s && (s->flags & SEC_LOAD))
3616     count++;
3617
3618   return count;
3619 }
3620
3621 static const struct bfd_elf_special_section 
3622   elf64_x86_64_special_sections[]=
3623 {
3624   { ".gnu.linkonce.lb", 16, -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
3625   { ".gnu.linkonce.lr", 16, -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
3626   { ".gnu.linkonce.lt", 16, -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
3627   { ".lbss",    5, -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
3628   { ".ldata",   6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
3629   { ".lrodata", 8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
3630   { NULL,       0,  0, 0,            0 }
3631 };
3632
3633 #define TARGET_LITTLE_SYM                   bfd_elf64_x86_64_vec
3634 #define TARGET_LITTLE_NAME                  "elf64-x86-64"
3635 #define ELF_ARCH                            bfd_arch_i386
3636 #define ELF_MACHINE_CODE                    EM_X86_64
3637 #define ELF_MAXPAGESIZE                     0x200000
3638 #define ELF_MINPAGESIZE                     0x1000
3639 #define ELF_COMMONPAGESIZE                  0x1000
3640
3641 #define elf_backend_can_gc_sections         1
3642 #define elf_backend_can_refcount            1
3643 #define elf_backend_want_got_plt            1
3644 #define elf_backend_plt_readonly            1
3645 #define elf_backend_want_plt_sym            0
3646 #define elf_backend_got_header_size         (GOT_ENTRY_SIZE*3)
3647 #define elf_backend_rela_normal             1
3648
3649 #define elf_info_to_howto                   elf64_x86_64_info_to_howto
3650
3651 #define bfd_elf64_bfd_link_hash_table_create \
3652   elf64_x86_64_link_hash_table_create
3653 #define bfd_elf64_bfd_reloc_type_lookup     elf64_x86_64_reloc_type_lookup
3654
3655 #define elf_backend_adjust_dynamic_symbol   elf64_x86_64_adjust_dynamic_symbol
3656 #define elf_backend_check_relocs            elf64_x86_64_check_relocs
3657 #define elf_backend_copy_indirect_symbol    elf64_x86_64_copy_indirect_symbol
3658 #define elf_backend_create_dynamic_sections elf64_x86_64_create_dynamic_sections
3659 #define elf_backend_finish_dynamic_sections elf64_x86_64_finish_dynamic_sections
3660 #define elf_backend_finish_dynamic_symbol   elf64_x86_64_finish_dynamic_symbol
3661 #define elf_backend_gc_mark_hook            elf64_x86_64_gc_mark_hook
3662 #define elf_backend_gc_sweep_hook           elf64_x86_64_gc_sweep_hook
3663 #define elf_backend_grok_prstatus           elf64_x86_64_grok_prstatus
3664 #define elf_backend_grok_psinfo             elf64_x86_64_grok_psinfo
3665 #define elf_backend_reloc_type_class        elf64_x86_64_reloc_type_class
3666 #define elf_backend_relocate_section        elf64_x86_64_relocate_section
3667 #define elf_backend_size_dynamic_sections   elf64_x86_64_size_dynamic_sections
3668 #define elf_backend_always_size_sections    elf64_x86_64_always_size_sections
3669 #define elf_backend_plt_sym_val             elf64_x86_64_plt_sym_val
3670 #define elf_backend_object_p                elf64_x86_64_elf_object_p
3671 #define bfd_elf64_mkobject                  elf64_x86_64_mkobject
3672
3673 #define elf_backend_section_from_shdr \
3674         elf64_x86_64_section_from_shdr
3675
3676 #define elf_backend_section_from_bfd_section \
3677   elf64_x86_64_elf_section_from_bfd_section
3678 #define elf_backend_add_symbol_hook \
3679   elf64_x86_64_add_symbol_hook
3680 #define elf_backend_symbol_processing \
3681   elf64_x86_64_symbol_processing
3682 #define elf_backend_common_section_index \
3683   elf64_x86_64_common_section_index
3684 #define elf_backend_common_section \
3685   elf64_x86_64_common_section
3686 #define elf_backend_common_definition \
3687   elf64_x86_64_common_definition
3688 #define elf_backend_merge_symbol \
3689   elf64_x86_64_merge_symbol
3690 #define elf_backend_special_sections \
3691   elf64_x86_64_special_sections
3692 #define elf_backend_additional_program_headers \
3693   elf64_x86_64_additional_program_headers
3694
3695 #include "elf64-target.h"