elf64-x86-64.c revision 1.1.1.3
1/* X86-64 specific support for ELF
2   Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3   2010, 2011, 2012, 2013
4   Free Software Foundation, Inc.
5   Contributed by Jan Hubicka <jh@suse.cz>.
6
7   This file is part of BFD, the Binary File Descriptor library.
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 3 of the License, or
12   (at your option) any later version.
13
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19   You should have received a copy of the GNU General Public License
20   along with this program; if not, write to the Free Software
21   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22   MA 02110-1301, USA.  */
23
24#include "sysdep.h"
25#include "bfd.h"
26#include "bfdlink.h"
27#include "libbfd.h"
28#include "elf-bfd.h"
29#include "elf-nacl.h"
30#include "bfd_stdint.h"
31#include "objalloc.h"
32#include "hashtab.h"
33#include "dwarf2.h"
34#include "libiberty.h"
35
36#include "elf/x86-64.h"
37
38#ifdef CORE_HEADER
39#include <stdarg.h>
40#include CORE_HEADER
41#endif
42
43/* In case we're on a 32-bit machine, construct a 64-bit "-1" value.  */
44#define MINUS_ONE (~ (bfd_vma) 0)
45
46/* Since both 32-bit and 64-bit x86-64 encode relocation type in the
47   identical manner, we use ELF32_R_TYPE instead of ELF64_R_TYPE to get
48   relocation type.  We also use ELF_ST_TYPE instead of ELF64_ST_TYPE
49   since they are the same.  */
50
51#define ABI_64_P(abfd) \
52  (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
53
54/* The relocation "howto" table.  Order of fields:
55   type, rightshift, size, bitsize, pc_relative, bitpos, complain_on_overflow,
56   special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset.  */
57static reloc_howto_type x86_64_elf_howto_table[] =
58{
59  HOWTO(R_X86_64_NONE, 0, 0, 0, FALSE, 0, complain_overflow_dont,
60	bfd_elf_generic_reloc, "R_X86_64_NONE",	FALSE, 0x00000000, 0x00000000,
61	FALSE),
62  HOWTO(R_X86_64_64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
63	bfd_elf_generic_reloc, "R_X86_64_64", FALSE, MINUS_ONE, MINUS_ONE,
64	FALSE),
65  HOWTO(R_X86_64_PC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
66	bfd_elf_generic_reloc, "R_X86_64_PC32", FALSE, 0xffffffff, 0xffffffff,
67	TRUE),
68  HOWTO(R_X86_64_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
69	bfd_elf_generic_reloc, "R_X86_64_GOT32", FALSE, 0xffffffff, 0xffffffff,
70	FALSE),
71  HOWTO(R_X86_64_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
72	bfd_elf_generic_reloc, "R_X86_64_PLT32", FALSE, 0xffffffff, 0xffffffff,
73	TRUE),
74  HOWTO(R_X86_64_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
75	bfd_elf_generic_reloc, "R_X86_64_COPY", FALSE, 0xffffffff, 0xffffffff,
76	FALSE),
77  HOWTO(R_X86_64_GLOB_DAT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
78	bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", FALSE, MINUS_ONE,
79	MINUS_ONE, FALSE),
80  HOWTO(R_X86_64_JUMP_SLOT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
81	bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", FALSE, MINUS_ONE,
82	MINUS_ONE, FALSE),
83  HOWTO(R_X86_64_RELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
84	bfd_elf_generic_reloc, "R_X86_64_RELATIVE", FALSE, MINUS_ONE,
85	MINUS_ONE, FALSE),
86  HOWTO(R_X86_64_GOTPCREL, 0, 2, 32, TRUE, 0, complain_overflow_signed,
87	bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", FALSE, 0xffffffff,
88	0xffffffff, TRUE),
89  HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
90	bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
91	FALSE),
92  HOWTO(R_X86_64_32S, 0, 2, 32, FALSE, 0, complain_overflow_signed,
93	bfd_elf_generic_reloc, "R_X86_64_32S", FALSE, 0xffffffff, 0xffffffff,
94	FALSE),
95  HOWTO(R_X86_64_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
96	bfd_elf_generic_reloc, "R_X86_64_16", FALSE, 0xffff, 0xffff, FALSE),
97  HOWTO(R_X86_64_PC16,0, 1, 16, TRUE, 0, complain_overflow_bitfield,
98	bfd_elf_generic_reloc, "R_X86_64_PC16", FALSE, 0xffff, 0xffff, TRUE),
99  HOWTO(R_X86_64_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
100	bfd_elf_generic_reloc, "R_X86_64_8", FALSE, 0xff, 0xff, FALSE),
101  HOWTO(R_X86_64_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
102	bfd_elf_generic_reloc, "R_X86_64_PC8", FALSE, 0xff, 0xff, TRUE),
103  HOWTO(R_X86_64_DTPMOD64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
104	bfd_elf_generic_reloc, "R_X86_64_DTPMOD64", FALSE, MINUS_ONE,
105	MINUS_ONE, FALSE),
106  HOWTO(R_X86_64_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
107	bfd_elf_generic_reloc, "R_X86_64_DTPOFF64", FALSE, MINUS_ONE,
108	MINUS_ONE, FALSE),
109  HOWTO(R_X86_64_TPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
110	bfd_elf_generic_reloc, "R_X86_64_TPOFF64", FALSE, MINUS_ONE,
111	MINUS_ONE, FALSE),
112  HOWTO(R_X86_64_TLSGD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
113	bfd_elf_generic_reloc, "R_X86_64_TLSGD", FALSE, 0xffffffff,
114	0xffffffff, TRUE),
115  HOWTO(R_X86_64_TLSLD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
116	bfd_elf_generic_reloc, "R_X86_64_TLSLD", FALSE, 0xffffffff,
117	0xffffffff, TRUE),
118  HOWTO(R_X86_64_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
119	bfd_elf_generic_reloc, "R_X86_64_DTPOFF32", FALSE, 0xffffffff,
120	0xffffffff, FALSE),
121  HOWTO(R_X86_64_GOTTPOFF, 0, 2, 32, TRUE, 0, complain_overflow_signed,
122	bfd_elf_generic_reloc, "R_X86_64_GOTTPOFF", FALSE, 0xffffffff,
123	0xffffffff, TRUE),
124  HOWTO(R_X86_64_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
125	bfd_elf_generic_reloc, "R_X86_64_TPOFF32", FALSE, 0xffffffff,
126	0xffffffff, FALSE),
127  HOWTO(R_X86_64_PC64, 0, 4, 64, TRUE, 0, complain_overflow_bitfield,
128	bfd_elf_generic_reloc, "R_X86_64_PC64", FALSE, MINUS_ONE, MINUS_ONE,
129	TRUE),
130  HOWTO(R_X86_64_GOTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
131	bfd_elf_generic_reloc, "R_X86_64_GOTOFF64",
132	FALSE, MINUS_ONE, MINUS_ONE, FALSE),
133  HOWTO(R_X86_64_GOTPC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
134	bfd_elf_generic_reloc, "R_X86_64_GOTPC32",
135	FALSE, 0xffffffff, 0xffffffff, TRUE),
136  HOWTO(R_X86_64_GOT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
137	bfd_elf_generic_reloc, "R_X86_64_GOT64", FALSE, MINUS_ONE, MINUS_ONE,
138	FALSE),
139  HOWTO(R_X86_64_GOTPCREL64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
140	bfd_elf_generic_reloc, "R_X86_64_GOTPCREL64", FALSE, MINUS_ONE,
141	MINUS_ONE, TRUE),
142  HOWTO(R_X86_64_GOTPC64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
143	bfd_elf_generic_reloc, "R_X86_64_GOTPC64",
144	FALSE, MINUS_ONE, MINUS_ONE, TRUE),
145  HOWTO(R_X86_64_GOTPLT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
146	bfd_elf_generic_reloc, "R_X86_64_GOTPLT64", FALSE, MINUS_ONE,
147	MINUS_ONE, FALSE),
148  HOWTO(R_X86_64_PLTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
149	bfd_elf_generic_reloc, "R_X86_64_PLTOFF64", FALSE, MINUS_ONE,
150	MINUS_ONE, FALSE),
151  HOWTO(R_X86_64_SIZE32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
152	bfd_elf_generic_reloc, "R_X86_64_SIZE32", FALSE, 0xffffffff, 0xffffffff,
153	FALSE),
154  HOWTO(R_X86_64_SIZE64, 0, 4, 64, FALSE, 0, complain_overflow_unsigned,
155	bfd_elf_generic_reloc, "R_X86_64_SIZE64", FALSE, MINUS_ONE, MINUS_ONE,
156	FALSE),
157  HOWTO(R_X86_64_GOTPC32_TLSDESC, 0, 2, 32, TRUE, 0,
158	complain_overflow_bitfield, bfd_elf_generic_reloc,
159	"R_X86_64_GOTPC32_TLSDESC",
160	FALSE, 0xffffffff, 0xffffffff, TRUE),
161  HOWTO(R_X86_64_TLSDESC_CALL, 0, 0, 0, FALSE, 0,
162	complain_overflow_dont, bfd_elf_generic_reloc,
163	"R_X86_64_TLSDESC_CALL",
164	FALSE, 0, 0, FALSE),
165  HOWTO(R_X86_64_TLSDESC, 0, 4, 64, FALSE, 0,
166	complain_overflow_bitfield, bfd_elf_generic_reloc,
167	"R_X86_64_TLSDESC",
168	FALSE, MINUS_ONE, MINUS_ONE, FALSE),
169  HOWTO(R_X86_64_IRELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
170	bfd_elf_generic_reloc, "R_X86_64_IRELATIVE", FALSE, MINUS_ONE,
171	MINUS_ONE, FALSE),
172  HOWTO(R_X86_64_RELATIVE64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
173	bfd_elf_generic_reloc, "R_X86_64_RELATIVE64", FALSE, MINUS_ONE,
174	MINUS_ONE, FALSE),
175  HOWTO(R_X86_64_PC32_BND, 0, 2, 32, TRUE, 0, complain_overflow_signed,
176	bfd_elf_generic_reloc, "R_X86_64_PC32_BND", FALSE, 0xffffffff, 0xffffffff,
177	TRUE),
178  HOWTO(R_X86_64_PLT32_BND, 0, 2, 32, TRUE, 0, complain_overflow_signed,
179	bfd_elf_generic_reloc, "R_X86_64_PLT32_BND", FALSE, 0xffffffff, 0xffffffff,
180	TRUE),
181
182  /* We have a gap in the reloc numbers here.
183     R_X86_64_standard counts the number up to this point, and
184     R_X86_64_vt_offset is the value to subtract from a reloc type of
185     R_X86_64_GNU_VT* to form an index into this table.  */
186#define R_X86_64_standard (R_X86_64_PLT32_BND + 1)
187#define R_X86_64_vt_offset (R_X86_64_GNU_VTINHERIT - R_X86_64_standard)
188
189/* GNU extension to record C++ vtable hierarchy.  */
190  HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, FALSE, 0, complain_overflow_dont,
191	 NULL, "R_X86_64_GNU_VTINHERIT", FALSE, 0, 0, FALSE),
192
193/* GNU extension to record C++ vtable member usage.  */
194  HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, FALSE, 0, complain_overflow_dont,
195	 _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", FALSE, 0, 0,
196	 FALSE),
197
198/* Use complain_overflow_bitfield on R_X86_64_32 for x32.  */
199  HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
200	bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
201	FALSE)
202};
203
204#define IS_X86_64_PCREL_TYPE(TYPE)	\
205  (   ((TYPE) == R_X86_64_PC8)		\
206   || ((TYPE) == R_X86_64_PC16)		\
207   || ((TYPE) == R_X86_64_PC32)		\
208   || ((TYPE) == R_X86_64_PC32_BND)	\
209   || ((TYPE) == R_X86_64_PC64))
210
211/* Map BFD relocs to the x86_64 elf relocs.  */
212struct elf_reloc_map
213{
214  bfd_reloc_code_real_type bfd_reloc_val;
215  unsigned char elf_reloc_val;
216};
217
218static const struct elf_reloc_map x86_64_reloc_map[] =
219{
220  { BFD_RELOC_NONE,		R_X86_64_NONE, },
221  { BFD_RELOC_64,		R_X86_64_64,   },
222  { BFD_RELOC_32_PCREL,		R_X86_64_PC32, },
223  { BFD_RELOC_X86_64_GOT32,	R_X86_64_GOT32,},
224  { BFD_RELOC_X86_64_PLT32,	R_X86_64_PLT32,},
225  { BFD_RELOC_X86_64_COPY,	R_X86_64_COPY, },
226  { BFD_RELOC_X86_64_GLOB_DAT,	R_X86_64_GLOB_DAT, },
227  { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, },
228  { BFD_RELOC_X86_64_RELATIVE,	R_X86_64_RELATIVE, },
229  { BFD_RELOC_X86_64_GOTPCREL,	R_X86_64_GOTPCREL, },
230  { BFD_RELOC_32,		R_X86_64_32, },
231  { BFD_RELOC_X86_64_32S,	R_X86_64_32S, },
232  { BFD_RELOC_16,		R_X86_64_16, },
233  { BFD_RELOC_16_PCREL,		R_X86_64_PC16, },
234  { BFD_RELOC_8,		R_X86_64_8, },
235  { BFD_RELOC_8_PCREL,		R_X86_64_PC8, },
236  { BFD_RELOC_X86_64_DTPMOD64,	R_X86_64_DTPMOD64, },
237  { BFD_RELOC_X86_64_DTPOFF64,	R_X86_64_DTPOFF64, },
238  { BFD_RELOC_X86_64_TPOFF64,	R_X86_64_TPOFF64, },
239  { BFD_RELOC_X86_64_TLSGD,	R_X86_64_TLSGD, },
240  { BFD_RELOC_X86_64_TLSLD,	R_X86_64_TLSLD, },
241  { BFD_RELOC_X86_64_DTPOFF32,	R_X86_64_DTPOFF32, },
242  { BFD_RELOC_X86_64_GOTTPOFF,	R_X86_64_GOTTPOFF, },
243  { BFD_RELOC_X86_64_TPOFF32,	R_X86_64_TPOFF32, },
244  { BFD_RELOC_64_PCREL,		R_X86_64_PC64, },
245  { BFD_RELOC_X86_64_GOTOFF64,	R_X86_64_GOTOFF64, },
246  { BFD_RELOC_X86_64_GOTPC32,	R_X86_64_GOTPC32, },
247  { BFD_RELOC_X86_64_GOT64,	R_X86_64_GOT64, },
248  { BFD_RELOC_X86_64_GOTPCREL64,R_X86_64_GOTPCREL64, },
249  { BFD_RELOC_X86_64_GOTPC64,	R_X86_64_GOTPC64, },
250  { BFD_RELOC_X86_64_GOTPLT64,	R_X86_64_GOTPLT64, },
251  { BFD_RELOC_X86_64_PLTOFF64,	R_X86_64_PLTOFF64, },
252  { BFD_RELOC_SIZE32,		R_X86_64_SIZE32, },
253  { BFD_RELOC_SIZE64,		R_X86_64_SIZE64, },
254  { BFD_RELOC_X86_64_GOTPC32_TLSDESC, R_X86_64_GOTPC32_TLSDESC, },
255  { BFD_RELOC_X86_64_TLSDESC_CALL, R_X86_64_TLSDESC_CALL, },
256  { BFD_RELOC_X86_64_TLSDESC,	R_X86_64_TLSDESC, },
257  { BFD_RELOC_X86_64_IRELATIVE,	R_X86_64_IRELATIVE, },
258  { BFD_RELOC_X86_64_PC32_BND,	R_X86_64_PC32_BND,},
259  { BFD_RELOC_X86_64_PLT32_BND,	R_X86_64_PLT32_BND,},
260  { BFD_RELOC_VTABLE_INHERIT,	R_X86_64_GNU_VTINHERIT, },
261  { BFD_RELOC_VTABLE_ENTRY,	R_X86_64_GNU_VTENTRY, },
262};
263
264static reloc_howto_type *
265elf_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type)
266{
267  unsigned i;
268
269  if (r_type == (unsigned int) R_X86_64_32)
270    {
271      if (ABI_64_P (abfd))
272	i = r_type;
273      else
274	i = ARRAY_SIZE (x86_64_elf_howto_table) - 1;
275    }
276  else if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT
277	   || r_type >= (unsigned int) R_X86_64_max)
278    {
279      if (r_type >= (unsigned int) R_X86_64_standard)
280	{
281	  (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
282				 abfd, (int) r_type);
283	  r_type = R_X86_64_NONE;
284	}
285      i = r_type;
286    }
287  else
288    i = r_type - (unsigned int) R_X86_64_vt_offset;
289  BFD_ASSERT (x86_64_elf_howto_table[i].type == r_type);
290  return &x86_64_elf_howto_table[i];
291}
292
293/* Given a BFD reloc type, return a HOWTO structure.  */
294static reloc_howto_type *
295elf_x86_64_reloc_type_lookup (bfd *abfd,
296			      bfd_reloc_code_real_type code)
297{
298  unsigned int i;
299
300  for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
301       i++)
302    {
303      if (x86_64_reloc_map[i].bfd_reloc_val == code)
304	return elf_x86_64_rtype_to_howto (abfd,
305					  x86_64_reloc_map[i].elf_reloc_val);
306    }
307  return 0;
308}
309
310static reloc_howto_type *
311elf_x86_64_reloc_name_lookup (bfd *abfd,
312			      const char *r_name)
313{
314  unsigned int i;
315
316  if (!ABI_64_P (abfd) && strcasecmp (r_name, "R_X86_64_32") == 0)
317    {
318      /* Get x32 R_X86_64_32.  */
319      reloc_howto_type *reloc
320	= &x86_64_elf_howto_table[ARRAY_SIZE (x86_64_elf_howto_table) - 1];
321      BFD_ASSERT (reloc->type == (unsigned int) R_X86_64_32);
322      return reloc;
323    }
324
325  for (i = 0; i < ARRAY_SIZE (x86_64_elf_howto_table); i++)
326    if (x86_64_elf_howto_table[i].name != NULL
327	&& strcasecmp (x86_64_elf_howto_table[i].name, r_name) == 0)
328      return &x86_64_elf_howto_table[i];
329
330  return NULL;
331}
332
333/* Given an x86_64 ELF reloc type, fill in an arelent structure.  */
334
335static void
336elf_x86_64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
337			  Elf_Internal_Rela *dst)
338{
339  unsigned r_type;
340
341  r_type = ELF32_R_TYPE (dst->r_info);
342  cache_ptr->howto = elf_x86_64_rtype_to_howto (abfd, r_type);
343  BFD_ASSERT (r_type == cache_ptr->howto->type);
344}
345
346/* Support for core dump NOTE sections.  */
347static bfd_boolean
348elf_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
349{
350  int offset;
351  size_t size;
352
353  switch (note->descsz)
354    {
355      default:
356	return FALSE;
357
358      case 296:		/* sizeof(istruct elf_prstatus) on Linux/x32 */
359	/* pr_cursig */
360	elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
361
362	/* pr_pid */
363	elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
364
365	/* pr_reg */
366	offset = 72;
367	size = 216;
368
369	break;
370
371      case 336:		/* sizeof(istruct elf_prstatus) on Linux/x86_64 */
372	/* pr_cursig */
373	elf_tdata (abfd)->core->signal
374	  = bfd_get_16 (abfd, note->descdata + 12);
375
376	/* pr_pid */
377	elf_tdata (abfd)->core->lwpid
378	  = bfd_get_32 (abfd, note->descdata + 32);
379
380	/* pr_reg */
381	offset = 112;
382	size = 216;
383
384	break;
385    }
386
387  /* Make a ".reg/999" section.  */
388  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
389					  size, note->descpos + offset);
390}
391
392static bfd_boolean
393elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
394{
395  switch (note->descsz)
396    {
397      default:
398	return FALSE;
399
400      case 124:		/* sizeof(struct elf_prpsinfo) on Linux/x32 */
401	elf_tdata (abfd)->core->pid
402	  = bfd_get_32 (abfd, note->descdata + 12);
403	elf_tdata (abfd)->core->program
404	  = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
405	elf_tdata (abfd)->core->command
406	  = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
407	break;
408
409      case 136:		/* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
410	elf_tdata (abfd)->core->pid
411	  = bfd_get_32 (abfd, note->descdata + 24);
412	elf_tdata (abfd)->core->program
413	 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
414	elf_tdata (abfd)->core->command
415	 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
416    }
417
418  /* Note that for some reason, a spurious space is tacked
419     onto the end of the args in some (at least one anyway)
420     implementations, so strip it off if it exists.  */
421
422  {
423    char *command = elf_tdata (abfd)->core->command;
424    int n = strlen (command);
425
426    if (0 < n && command[n - 1] == ' ')
427      command[n - 1] = '\0';
428  }
429
430  return TRUE;
431}
432
433#ifdef CORE_HEADER
434static char *
435elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
436			    int note_type, ...)
437{
438  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
439  va_list ap;
440  const char *fname, *psargs;
441  long pid;
442  int cursig;
443  const void *gregs;
444
445  switch (note_type)
446    {
447    default:
448      return NULL;
449
450    case NT_PRPSINFO:
451      va_start (ap, note_type);
452      fname = va_arg (ap, const char *);
453      psargs = va_arg (ap, const char *);
454      va_end (ap);
455
456      if (bed->s->elfclass == ELFCLASS32)
457	{
458	  prpsinfo32_t data;
459	  memset (&data, 0, sizeof (data));
460	  strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
461	  strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
462	  return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
463				     &data, sizeof (data));
464	}
465      else
466	{
467	  prpsinfo64_t data;
468	  memset (&data, 0, sizeof (data));
469	  strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
470	  strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
471	  return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
472				     &data, sizeof (data));
473	}
474      /* NOTREACHED */
475
476    case NT_PRSTATUS:
477      va_start (ap, note_type);
478      pid = va_arg (ap, long);
479      cursig = va_arg (ap, int);
480      gregs = va_arg (ap, const void *);
481      va_end (ap);
482
483      if (bed->s->elfclass == ELFCLASS32)
484	{
485	  if (bed->elf_machine_code == EM_X86_64)
486	    {
487	      prstatusx32_t prstat;
488	      memset (&prstat, 0, sizeof (prstat));
489	      prstat.pr_pid = pid;
490	      prstat.pr_cursig = cursig;
491	      memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
492	      return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
493					 &prstat, sizeof (prstat));
494	    }
495	  else
496	    {
497	      prstatus32_t prstat;
498	      memset (&prstat, 0, sizeof (prstat));
499	      prstat.pr_pid = pid;
500	      prstat.pr_cursig = cursig;
501	      memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
502	      return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
503					 &prstat, sizeof (prstat));
504	    }
505	}
506      else
507	{
508	  prstatus64_t prstat;
509	  memset (&prstat, 0, sizeof (prstat));
510	  prstat.pr_pid = pid;
511	  prstat.pr_cursig = cursig;
512	  memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
513	  return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
514				     &prstat, sizeof (prstat));
515	}
516    }
517  /* NOTREACHED */
518}
519#endif
520
521/* Functions for the x86-64 ELF linker.	 */
522
523/* The name of the dynamic interpreter.	 This is put in the .interp
524   section.  */
525
526#define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
527#define ELF32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
528
529/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
530   copying dynamic variables from a shared lib into an app's dynbss
531   section, and instead use a dynamic relocation to point into the
532   shared lib.  */
533#define ELIMINATE_COPY_RELOCS 1
534
535/* The size in bytes of an entry in the global offset table.  */
536
537#define GOT_ENTRY_SIZE 8
538
539/* The size in bytes of an entry in the procedure linkage table.  */
540
541#define PLT_ENTRY_SIZE 16
542
543/* The first entry in a procedure linkage table looks like this.  See the
544   SVR4 ABI i386 supplement and the x86-64 ABI to see how this works.  */
545
546static const bfd_byte elf_x86_64_plt0_entry[PLT_ENTRY_SIZE] =
547{
548  0xff, 0x35, 8, 0, 0, 0,	/* pushq GOT+8(%rip)  */
549  0xff, 0x25, 16, 0, 0, 0,	/* jmpq *GOT+16(%rip) */
550  0x0f, 0x1f, 0x40, 0x00	/* nopl 0(%rax)       */
551};
552
553/* Subsequent entries in a procedure linkage table look like this.  */
554
555static const bfd_byte elf_x86_64_plt_entry[PLT_ENTRY_SIZE] =
556{
557  0xff, 0x25,	/* jmpq *name@GOTPC(%rip) */
558  0, 0, 0, 0,	/* replaced with offset to this symbol in .got.	 */
559  0x68,		/* pushq immediate */
560  0, 0, 0, 0,	/* replaced with index into relocation table.  */
561  0xe9,		/* jmp relative */
562  0, 0, 0, 0	/* replaced with offset to start of .plt0.  */
563};
564
565/* .eh_frame covering the .plt section.  */
566
567static const bfd_byte elf_x86_64_eh_frame_plt[] =
568{
569#define PLT_CIE_LENGTH		20
570#define PLT_FDE_LENGTH		36
571#define PLT_FDE_START_OFFSET	4 + PLT_CIE_LENGTH + 8
572#define PLT_FDE_LEN_OFFSET	4 + PLT_CIE_LENGTH + 12
573  PLT_CIE_LENGTH, 0, 0, 0,	/* CIE length */
574  0, 0, 0, 0,			/* CIE ID */
575  1,				/* CIE version */
576  'z', 'R', 0,			/* Augmentation string */
577  1,				/* Code alignment factor */
578  0x78,				/* Data alignment factor */
579  16,				/* Return address column */
580  1,				/* Augmentation size */
581  DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
582  DW_CFA_def_cfa, 7, 8,		/* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
583  DW_CFA_offset + 16, 1,	/* DW_CFA_offset: r16 (rip) at cfa-8 */
584  DW_CFA_nop, DW_CFA_nop,
585
586  PLT_FDE_LENGTH, 0, 0, 0,	/* FDE length */
587  PLT_CIE_LENGTH + 8, 0, 0, 0,	/* CIE pointer */
588  0, 0, 0, 0,			/* R_X86_64_PC32 .plt goes here */
589  0, 0, 0, 0,			/* .plt size goes here */
590  0,				/* Augmentation size */
591  DW_CFA_def_cfa_offset, 16,	/* DW_CFA_def_cfa_offset: 16 */
592  DW_CFA_advance_loc + 6,	/* DW_CFA_advance_loc: 6 to __PLT__+6 */
593  DW_CFA_def_cfa_offset, 24,	/* DW_CFA_def_cfa_offset: 24 */
594  DW_CFA_advance_loc + 10,	/* DW_CFA_advance_loc: 10 to __PLT__+16 */
595  DW_CFA_def_cfa_expression,	/* DW_CFA_def_cfa_expression */
596  11,				/* Block length */
597  DW_OP_breg7, 8,		/* DW_OP_breg7 (rsp): 8 */
598  DW_OP_breg16, 0,		/* DW_OP_breg16 (rip): 0 */
599  DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
600  DW_OP_lit3, DW_OP_shl, DW_OP_plus,
601  DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
602};
603
604/* Architecture-specific backend data for x86-64.  */
605
606struct elf_x86_64_backend_data
607{
608  /* Templates for the initial PLT entry and for subsequent entries.  */
609  const bfd_byte *plt0_entry;
610  const bfd_byte *plt_entry;
611  unsigned int plt_entry_size;          /* Size of each PLT entry.  */
612
613  /* Offsets into plt0_entry that are to be replaced with GOT[1] and GOT[2].  */
614  unsigned int plt0_got1_offset;
615  unsigned int plt0_got2_offset;
616
617  /* Offset of the end of the PC-relative instruction containing
618     plt0_got2_offset.  */
619  unsigned int plt0_got2_insn_end;
620
621  /* Offsets into plt_entry that are to be replaced with...  */
622  unsigned int plt_got_offset;    /* ... address of this symbol in .got. */
623  unsigned int plt_reloc_offset;  /* ... offset into relocation table. */
624  unsigned int plt_plt_offset;    /* ... offset to start of .plt. */
625
626  /* Length of the PC-relative instruction containing plt_got_offset.  */
627  unsigned int plt_got_insn_size;
628
629  /* Offset of the end of the PC-relative jump to plt0_entry.  */
630  unsigned int plt_plt_insn_end;
631
632  /* Offset into plt_entry where the initial value of the GOT entry points.  */
633  unsigned int plt_lazy_offset;
634
635  /* .eh_frame covering the .plt section.  */
636  const bfd_byte *eh_frame_plt;
637  unsigned int eh_frame_plt_size;
638};
639
640#define get_elf_x86_64_arch_data(bed) \
641  ((const struct elf_x86_64_backend_data *) (bed)->arch_data)
642
643#define get_elf_x86_64_backend_data(abfd) \
644  get_elf_x86_64_arch_data (get_elf_backend_data (abfd))
645
646#define GET_PLT_ENTRY_SIZE(abfd) \
647  get_elf_x86_64_backend_data (abfd)->plt_entry_size
648
649/* These are the standard parameters.  */
650static const struct elf_x86_64_backend_data elf_x86_64_arch_bed =
651  {
652    elf_x86_64_plt0_entry,              /* plt0_entry */
653    elf_x86_64_plt_entry,               /* plt_entry */
654    sizeof (elf_x86_64_plt_entry),      /* plt_entry_size */
655    2,                                  /* plt0_got1_offset */
656    8,                                  /* plt0_got2_offset */
657    12,                                 /* plt0_got2_insn_end */
658    2,                                  /* plt_got_offset */
659    7,                                  /* plt_reloc_offset */
660    12,                                 /* plt_plt_offset */
661    6,                                  /* plt_got_insn_size */
662    PLT_ENTRY_SIZE,                     /* plt_plt_insn_end */
663    6,                                  /* plt_lazy_offset */
664    elf_x86_64_eh_frame_plt,            /* eh_frame_plt */
665    sizeof (elf_x86_64_eh_frame_plt),   /* eh_frame_plt_size */
666  };
667
668#define	elf_backend_arch_data	&elf_x86_64_arch_bed
669
670/* x86-64 ELF linker hash entry.  */
671
672struct elf_x86_64_link_hash_entry
673{
674  struct elf_link_hash_entry elf;
675
676  /* Track dynamic relocs copied for this symbol.  */
677  struct elf_dyn_relocs *dyn_relocs;
678
679#define GOT_UNKNOWN	0
680#define GOT_NORMAL	1
681#define GOT_TLS_GD	2
682#define GOT_TLS_IE	3
683#define GOT_TLS_GDESC	4
684#define GOT_TLS_GD_BOTH_P(type) \
685  ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
686#define GOT_TLS_GD_P(type) \
687  ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
688#define GOT_TLS_GDESC_P(type) \
689  ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
690#define GOT_TLS_GD_ANY_P(type) \
691  (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
692  unsigned char tls_type;
693
694  /* Offset of the GOTPLT entry reserved for the TLS descriptor,
695     starting at the end of the jump table.  */
696  bfd_vma tlsdesc_got;
697};
698
699#define elf_x86_64_hash_entry(ent) \
700  ((struct elf_x86_64_link_hash_entry *)(ent))
701
702struct elf_x86_64_obj_tdata
703{
704  struct elf_obj_tdata root;
705
706  /* tls_type for each local got entry.  */
707  char *local_got_tls_type;
708
709  /* GOTPLT entries for TLS descriptors.  */
710  bfd_vma *local_tlsdesc_gotent;
711};
712
713#define elf_x86_64_tdata(abfd) \
714  ((struct elf_x86_64_obj_tdata *) (abfd)->tdata.any)
715
716#define elf_x86_64_local_got_tls_type(abfd) \
717  (elf_x86_64_tdata (abfd)->local_got_tls_type)
718
719#define elf_x86_64_local_tlsdesc_gotent(abfd) \
720  (elf_x86_64_tdata (abfd)->local_tlsdesc_gotent)
721
722#define is_x86_64_elf(bfd)				\
723  (bfd_get_flavour (bfd) == bfd_target_elf_flavour	\
724   && elf_tdata (bfd) != NULL				\
725   && elf_object_id (bfd) == X86_64_ELF_DATA)
726
727static bfd_boolean
728elf_x86_64_mkobject (bfd *abfd)
729{
730  return bfd_elf_allocate_object (abfd, sizeof (struct elf_x86_64_obj_tdata),
731				  X86_64_ELF_DATA);
732}
733
734/* x86-64 ELF linker hash table.  */
735
736struct elf_x86_64_link_hash_table
737{
738  struct elf_link_hash_table elf;
739
740  /* Short-cuts to get to dynamic linker sections.  */
741  asection *sdynbss;
742  asection *srelbss;
743  asection *plt_eh_frame;
744
745  union
746  {
747    bfd_signed_vma refcount;
748    bfd_vma offset;
749  } tls_ld_got;
750
751  /* The amount of space used by the jump slots in the GOT.  */
752  bfd_vma sgotplt_jump_table_size;
753
754  /* Small local sym cache.  */
755  struct sym_cache sym_cache;
756
757  bfd_vma (*r_info) (bfd_vma, bfd_vma);
758  bfd_vma (*r_sym) (bfd_vma);
759  unsigned int pointer_r_type;
760  const char *dynamic_interpreter;
761  int dynamic_interpreter_size;
762
763  /* _TLS_MODULE_BASE_ symbol.  */
764  struct bfd_link_hash_entry *tls_module_base;
765
766  /* Used by local STT_GNU_IFUNC symbols.  */
767  htab_t loc_hash_table;
768  void * loc_hash_memory;
769
770  /* The offset into splt of the PLT entry for the TLS descriptor
771     resolver.  Special values are 0, if not necessary (or not found
772     to be necessary yet), and -1 if needed but not determined
773     yet.  */
774  bfd_vma tlsdesc_plt;
775  /* The offset into sgot of the GOT entry used by the PLT entry
776     above.  */
777  bfd_vma tlsdesc_got;
778
779  /* The index of the next R_X86_64_JUMP_SLOT entry in .rela.plt.  */
780  bfd_vma next_jump_slot_index;
781  /* The index of the next R_X86_64_IRELATIVE entry in .rela.plt.  */
782  bfd_vma next_irelative_index;
783};
784
785/* Get the x86-64 ELF linker hash table from a link_info structure.  */
786
787#define elf_x86_64_hash_table(p) \
788  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
789  == X86_64_ELF_DATA ? ((struct elf_x86_64_link_hash_table *) ((p)->hash)) : NULL)
790
791#define elf_x86_64_compute_jump_table_size(htab) \
792  ((htab)->elf.srelplt->reloc_count * GOT_ENTRY_SIZE)
793
794/* Create an entry in an x86-64 ELF linker hash table.	*/
795
796static struct bfd_hash_entry *
797elf_x86_64_link_hash_newfunc (struct bfd_hash_entry *entry,
798			      struct bfd_hash_table *table,
799			      const char *string)
800{
801  /* Allocate the structure if it has not already been allocated by a
802     subclass.  */
803  if (entry == NULL)
804    {
805      entry = (struct bfd_hash_entry *)
806	  bfd_hash_allocate (table,
807			     sizeof (struct elf_x86_64_link_hash_entry));
808      if (entry == NULL)
809	return entry;
810    }
811
812  /* Call the allocation method of the superclass.  */
813  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
814  if (entry != NULL)
815    {
816      struct elf_x86_64_link_hash_entry *eh;
817
818      eh = (struct elf_x86_64_link_hash_entry *) entry;
819      eh->dyn_relocs = NULL;
820      eh->tls_type = GOT_UNKNOWN;
821      eh->tlsdesc_got = (bfd_vma) -1;
822    }
823
824  return entry;
825}
826
827/* Compute a hash of a local hash entry.  We use elf_link_hash_entry
828  for local symbol so that we can handle local STT_GNU_IFUNC symbols
829  as global symbol.  We reuse indx and dynstr_index for local symbol
830  hash since they aren't used by global symbols in this backend.  */
831
832static hashval_t
833elf_x86_64_local_htab_hash (const void *ptr)
834{
835  struct elf_link_hash_entry *h
836    = (struct elf_link_hash_entry *) ptr;
837  return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
838}
839
840/* Compare local hash entries.  */
841
842static int
843elf_x86_64_local_htab_eq (const void *ptr1, const void *ptr2)
844{
845  struct elf_link_hash_entry *h1
846     = (struct elf_link_hash_entry *) ptr1;
847  struct elf_link_hash_entry *h2
848    = (struct elf_link_hash_entry *) ptr2;
849
850  return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
851}
852
853/* Find and/or create a hash entry for local symbol.  */
854
855static struct elf_link_hash_entry *
856elf_x86_64_get_local_sym_hash (struct elf_x86_64_link_hash_table *htab,
857			       bfd *abfd, const Elf_Internal_Rela *rel,
858			       bfd_boolean create)
859{
860  struct elf_x86_64_link_hash_entry e, *ret;
861  asection *sec = abfd->sections;
862  hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
863				       htab->r_sym (rel->r_info));
864  void **slot;
865
866  e.elf.indx = sec->id;
867  e.elf.dynstr_index = htab->r_sym (rel->r_info);
868  slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
869				   create ? INSERT : NO_INSERT);
870
871  if (!slot)
872    return NULL;
873
874  if (*slot)
875    {
876      ret = (struct elf_x86_64_link_hash_entry *) *slot;
877      return &ret->elf;
878    }
879
880  ret = (struct elf_x86_64_link_hash_entry *)
881	objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
882			sizeof (struct elf_x86_64_link_hash_entry));
883  if (ret)
884    {
885      memset (ret, 0, sizeof (*ret));
886      ret->elf.indx = sec->id;
887      ret->elf.dynstr_index = htab->r_sym (rel->r_info);
888      ret->elf.dynindx = -1;
889      *slot = ret;
890    }
891  return &ret->elf;
892}
893
894/* Create an X86-64 ELF linker hash table.  */
895
896static struct bfd_link_hash_table *
897elf_x86_64_link_hash_table_create (bfd *abfd)
898{
899  struct elf_x86_64_link_hash_table *ret;
900  bfd_size_type amt = sizeof (struct elf_x86_64_link_hash_table);
901
902  ret = (struct elf_x86_64_link_hash_table *) bfd_zmalloc (amt);
903  if (ret == NULL)
904    return NULL;
905
906  if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
907				      elf_x86_64_link_hash_newfunc,
908				      sizeof (struct elf_x86_64_link_hash_entry),
909				      X86_64_ELF_DATA))
910    {
911      free (ret);
912      return NULL;
913    }
914
915  if (ABI_64_P (abfd))
916    {
917      ret->r_info = elf64_r_info;
918      ret->r_sym = elf64_r_sym;
919      ret->pointer_r_type = R_X86_64_64;
920      ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
921      ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
922    }
923  else
924    {
925      ret->r_info = elf32_r_info;
926      ret->r_sym = elf32_r_sym;
927      ret->pointer_r_type = R_X86_64_32;
928      ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
929      ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER;
930    }
931
932  ret->loc_hash_table = htab_try_create (1024,
933					 elf_x86_64_local_htab_hash,
934					 elf_x86_64_local_htab_eq,
935					 NULL);
936  ret->loc_hash_memory = objalloc_create ();
937  if (!ret->loc_hash_table || !ret->loc_hash_memory)
938    {
939      free (ret);
940      return NULL;
941    }
942
943  return &ret->elf.root;
944}
945
946/* Destroy an X86-64 ELF linker hash table.  */
947
948static void
949elf_x86_64_link_hash_table_free (struct bfd_link_hash_table *hash)
950{
951  struct elf_x86_64_link_hash_table *htab
952    = (struct elf_x86_64_link_hash_table *) hash;
953
954  if (htab->loc_hash_table)
955    htab_delete (htab->loc_hash_table);
956  if (htab->loc_hash_memory)
957    objalloc_free ((struct objalloc *) htab->loc_hash_memory);
958  _bfd_elf_link_hash_table_free (hash);
959}
960
961/* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
962   .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
963   hash table.  */
964
965static bfd_boolean
966elf_x86_64_create_dynamic_sections (bfd *dynobj,
967				    struct bfd_link_info *info)
968{
969  struct elf_x86_64_link_hash_table *htab;
970
971  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
972    return FALSE;
973
974  htab = elf_x86_64_hash_table (info);
975  if (htab == NULL)
976    return FALSE;
977
978  htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
979  if (!info->shared)
980    htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
981
982  if (!htab->sdynbss
983      || (!info->shared && !htab->srelbss))
984    abort ();
985
986  if (!info->no_ld_generated_unwind_info
987      && htab->plt_eh_frame == NULL
988      && htab->elf.splt != NULL)
989    {
990      flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
991			| SEC_HAS_CONTENTS | SEC_IN_MEMORY
992			| SEC_LINKER_CREATED);
993      htab->plt_eh_frame
994	= bfd_make_section_anyway_with_flags (dynobj, ".eh_frame", flags);
995      if (htab->plt_eh_frame == NULL
996	  || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 3))
997	return FALSE;
998    }
999  return TRUE;
1000}
1001
1002/* Copy the extra info we tack onto an elf_link_hash_entry.  */
1003
1004static void
1005elf_x86_64_copy_indirect_symbol (struct bfd_link_info *info,
1006				 struct elf_link_hash_entry *dir,
1007				 struct elf_link_hash_entry *ind)
1008{
1009  struct elf_x86_64_link_hash_entry *edir, *eind;
1010
1011  edir = (struct elf_x86_64_link_hash_entry *) dir;
1012  eind = (struct elf_x86_64_link_hash_entry *) ind;
1013
1014  if (eind->dyn_relocs != NULL)
1015    {
1016      if (edir->dyn_relocs != NULL)
1017	{
1018	  struct elf_dyn_relocs **pp;
1019	  struct elf_dyn_relocs *p;
1020
1021	  /* Add reloc counts against the indirect sym to the direct sym
1022	     list.  Merge any entries against the same section.  */
1023	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1024	    {
1025	      struct elf_dyn_relocs *q;
1026
1027	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
1028		if (q->sec == p->sec)
1029		  {
1030		    q->pc_count += p->pc_count;
1031		    q->count += p->count;
1032		    *pp = p->next;
1033		    break;
1034		  }
1035	      if (q == NULL)
1036		pp = &p->next;
1037	    }
1038	  *pp = edir->dyn_relocs;
1039	}
1040
1041      edir->dyn_relocs = eind->dyn_relocs;
1042      eind->dyn_relocs = NULL;
1043    }
1044
1045  if (ind->root.type == bfd_link_hash_indirect
1046      && dir->got.refcount <= 0)
1047    {
1048      edir->tls_type = eind->tls_type;
1049      eind->tls_type = GOT_UNKNOWN;
1050    }
1051
1052  if (ELIMINATE_COPY_RELOCS
1053      && ind->root.type != bfd_link_hash_indirect
1054      && dir->dynamic_adjusted)
1055    {
1056      /* If called to transfer flags for a weakdef during processing
1057	 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1058	 We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
1059      dir->ref_dynamic |= ind->ref_dynamic;
1060      dir->ref_regular |= ind->ref_regular;
1061      dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1062      dir->needs_plt |= ind->needs_plt;
1063      dir->pointer_equality_needed |= ind->pointer_equality_needed;
1064    }
1065  else
1066    _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1067}
1068
1069static bfd_boolean
1070elf64_x86_64_elf_object_p (bfd *abfd)
1071{
1072  /* Set the right machine number for an x86-64 elf64 file.  */
1073  bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
1074  return TRUE;
1075}
1076
1077static bfd_boolean
1078elf32_x86_64_elf_object_p (bfd *abfd)
1079{
1080  /* Set the right machine number for an x86-64 elf32 file.  */
1081  bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32);
1082  return TRUE;
1083}
1084
1085/* Return TRUE if the TLS access code sequence support transition
1086   from R_TYPE.  */
1087
1088static bfd_boolean
1089elf_x86_64_check_tls_transition (bfd *abfd,
1090				 struct bfd_link_info *info,
1091				 asection *sec,
1092				 bfd_byte *contents,
1093				 Elf_Internal_Shdr *symtab_hdr,
1094				 struct elf_link_hash_entry **sym_hashes,
1095				 unsigned int r_type,
1096				 const Elf_Internal_Rela *rel,
1097				 const Elf_Internal_Rela *relend)
1098{
1099  unsigned int val;
1100  unsigned long r_symndx;
1101  bfd_boolean largepic = FALSE;
1102  struct elf_link_hash_entry *h;
1103  bfd_vma offset;
1104  struct elf_x86_64_link_hash_table *htab;
1105
1106  /* Get the section contents.  */
1107  if (contents == NULL)
1108    {
1109      if (elf_section_data (sec)->this_hdr.contents != NULL)
1110	contents = elf_section_data (sec)->this_hdr.contents;
1111      else
1112	{
1113	  /* FIXME: How to better handle error condition?  */
1114	  if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1115	    return FALSE;
1116
1117	  /* Cache the section contents for elf_link_input_bfd.  */
1118	  elf_section_data (sec)->this_hdr.contents = contents;
1119	}
1120    }
1121
1122  htab = elf_x86_64_hash_table (info);
1123  offset = rel->r_offset;
1124  switch (r_type)
1125    {
1126    case R_X86_64_TLSGD:
1127    case R_X86_64_TLSLD:
1128      if ((rel + 1) >= relend)
1129	return FALSE;
1130
1131      if (r_type == R_X86_64_TLSGD)
1132	{
1133	  /* Check transition from GD access model.  For 64bit, only
1134		.byte 0x66; leaq foo@tlsgd(%rip), %rdi
1135		.word 0x6666; rex64; call __tls_get_addr
1136	     can transit to different access model.  For 32bit, only
1137		leaq foo@tlsgd(%rip), %rdi
1138		.word 0x6666; rex64; call __tls_get_addr
1139	     can transit to different access model.  For largepic
1140	     we also support:
1141	        leaq foo@tlsgd(%rip), %rdi
1142	        movabsq $__tls_get_addr@pltoff, %rax
1143	        addq $rbx, %rax
1144	        call *%rax.  */
1145
1146	  static const unsigned char call[] = { 0x66, 0x66, 0x48, 0xe8 };
1147	  static const unsigned char leaq[] = { 0x66, 0x48, 0x8d, 0x3d };
1148
1149	  if ((offset + 12) > sec->size)
1150	    return FALSE;
1151
1152	  if (memcmp (contents + offset + 4, call, 4) != 0)
1153	    {
1154	      if (!ABI_64_P (abfd)
1155		  || (offset + 19) > sec->size
1156		  || offset < 3
1157		  || memcmp (contents + offset - 3, leaq + 1, 3) != 0
1158		  || memcmp (contents + offset + 4, "\x48\xb8", 2) != 0
1159		  || memcmp (contents + offset + 14, "\x48\x01\xd8\xff\xd0", 5)
1160		     != 0)
1161		return FALSE;
1162	      largepic = TRUE;
1163	    }
1164	  else if (ABI_64_P (abfd))
1165	    {
1166	      if (offset < 4
1167		  || memcmp (contents + offset - 4, leaq, 4) != 0)
1168		return FALSE;
1169	    }
1170	  else
1171	    {
1172	      if (offset < 3
1173		  || memcmp (contents + offset - 3, leaq + 1, 3) != 0)
1174		return FALSE;
1175	    }
1176	}
1177      else
1178	{
1179	  /* Check transition from LD access model.  Only
1180		leaq foo@tlsld(%rip), %rdi;
1181		call __tls_get_addr
1182	     can transit to different access model.  For largepic
1183	     we also support:
1184	        leaq foo@tlsld(%rip), %rdi
1185	        movabsq $__tls_get_addr@pltoff, %rax
1186	        addq $rbx, %rax
1187	        call *%rax.  */
1188
1189	  static const unsigned char lea[] = { 0x48, 0x8d, 0x3d };
1190
1191	  if (offset < 3 || (offset + 9) > sec->size)
1192	    return FALSE;
1193
1194	  if (memcmp (contents + offset - 3, lea, 3) != 0)
1195	    return FALSE;
1196
1197	  if (0xe8 != *(contents + offset + 4))
1198	    {
1199	      if (!ABI_64_P (abfd)
1200		  || (offset + 19) > sec->size
1201		  || memcmp (contents + offset + 4, "\x48\xb8", 2) != 0
1202		  || memcmp (contents + offset + 14, "\x48\x01\xd8\xff\xd0", 5)
1203		     != 0)
1204		return FALSE;
1205	      largepic = TRUE;
1206	    }
1207	}
1208
1209      r_symndx = htab->r_sym (rel[1].r_info);
1210      if (r_symndx < symtab_hdr->sh_info)
1211	return FALSE;
1212
1213      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1214      /* Use strncmp to check __tls_get_addr since __tls_get_addr
1215	 may be versioned.  */
1216      return (h != NULL
1217	      && h->root.root.string != NULL
1218	      && (largepic
1219		  ? ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLTOFF64
1220		  : (ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PC32
1221		     || ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLT32))
1222	      && (strncmp (h->root.root.string,
1223			   "__tls_get_addr", 14) == 0));
1224
1225    case R_X86_64_GOTTPOFF:
1226      /* Check transition from IE access model:
1227		mov foo@gottpoff(%rip), %reg
1228		add foo@gottpoff(%rip), %reg
1229       */
1230
1231      /* Check REX prefix first.  */
1232      if (offset >= 3 && (offset + 4) <= sec->size)
1233	{
1234	  val = bfd_get_8 (abfd, contents + offset - 3);
1235	  if (val != 0x48 && val != 0x4c)
1236	    {
1237	      /* X32 may have 0x44 REX prefix or no REX prefix.  */
1238	      if (ABI_64_P (abfd))
1239		return FALSE;
1240	    }
1241	}
1242      else
1243	{
1244	  /* X32 may not have any REX prefix.  */
1245	  if (ABI_64_P (abfd))
1246	    return FALSE;
1247	  if (offset < 2 || (offset + 3) > sec->size)
1248	    return FALSE;
1249	}
1250
1251      val = bfd_get_8 (abfd, contents + offset - 2);
1252      if (val != 0x8b && val != 0x03)
1253	return FALSE;
1254
1255      val = bfd_get_8 (abfd, contents + offset - 1);
1256      return (val & 0xc7) == 5;
1257
1258    case R_X86_64_GOTPC32_TLSDESC:
1259      /* Check transition from GDesc access model:
1260		leaq x@tlsdesc(%rip), %rax
1261
1262	 Make sure it's a leaq adding rip to a 32-bit offset
1263	 into any register, although it's probably almost always
1264	 going to be rax.  */
1265
1266      if (offset < 3 || (offset + 4) > sec->size)
1267	return FALSE;
1268
1269      val = bfd_get_8 (abfd, contents + offset - 3);
1270      if ((val & 0xfb) != 0x48)
1271	return FALSE;
1272
1273      if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1274	return FALSE;
1275
1276      val = bfd_get_8 (abfd, contents + offset - 1);
1277      return (val & 0xc7) == 0x05;
1278
1279    case R_X86_64_TLSDESC_CALL:
1280      /* Check transition from GDesc access model:
1281		call *x@tlsdesc(%rax)
1282       */
1283      if (offset + 2 <= sec->size)
1284	{
1285	  /* Make sure that it's a call *x@tlsdesc(%rax).  */
1286	  static const unsigned char call[] = { 0xff, 0x10 };
1287	  return memcmp (contents + offset, call, 2) == 0;
1288	}
1289
1290      return FALSE;
1291
1292    default:
1293      abort ();
1294    }
1295}
1296
1297/* Return TRUE if the TLS access transition is OK or no transition
1298   will be performed.  Update R_TYPE if there is a transition.  */
1299
1300static bfd_boolean
1301elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
1302			   asection *sec, bfd_byte *contents,
1303			   Elf_Internal_Shdr *symtab_hdr,
1304			   struct elf_link_hash_entry **sym_hashes,
1305			   unsigned int *r_type, int tls_type,
1306			   const Elf_Internal_Rela *rel,
1307			   const Elf_Internal_Rela *relend,
1308			   struct elf_link_hash_entry *h,
1309			   unsigned long r_symndx)
1310{
1311  unsigned int from_type = *r_type;
1312  unsigned int to_type = from_type;
1313  bfd_boolean check = TRUE;
1314
1315  /* Skip TLS transition for functions.  */
1316  if (h != NULL
1317      && (h->type == STT_FUNC
1318	  || h->type == STT_GNU_IFUNC))
1319    return TRUE;
1320
1321  switch (from_type)
1322    {
1323    case R_X86_64_TLSGD:
1324    case R_X86_64_GOTPC32_TLSDESC:
1325    case R_X86_64_TLSDESC_CALL:
1326    case R_X86_64_GOTTPOFF:
1327      if (info->executable)
1328	{
1329	  if (h == NULL)
1330	    to_type = R_X86_64_TPOFF32;
1331	  else
1332	    to_type = R_X86_64_GOTTPOFF;
1333	}
1334
1335      /* When we are called from elf_x86_64_relocate_section,
1336	 CONTENTS isn't NULL and there may be additional transitions
1337	 based on TLS_TYPE.  */
1338      if (contents != NULL)
1339	{
1340	  unsigned int new_to_type = to_type;
1341
1342	  if (info->executable
1343	      && h != NULL
1344	      && h->dynindx == -1
1345	      && tls_type == GOT_TLS_IE)
1346	    new_to_type = R_X86_64_TPOFF32;
1347
1348	  if (to_type == R_X86_64_TLSGD
1349	      || to_type == R_X86_64_GOTPC32_TLSDESC
1350	      || to_type == R_X86_64_TLSDESC_CALL)
1351	    {
1352	      if (tls_type == GOT_TLS_IE)
1353		new_to_type = R_X86_64_GOTTPOFF;
1354	    }
1355
1356	  /* We checked the transition before when we were called from
1357	     elf_x86_64_check_relocs.  We only want to check the new
1358	     transition which hasn't been checked before.  */
1359	  check = new_to_type != to_type && from_type == to_type;
1360	  to_type = new_to_type;
1361	}
1362
1363      break;
1364
1365    case R_X86_64_TLSLD:
1366      if (info->executable)
1367	to_type = R_X86_64_TPOFF32;
1368      break;
1369
1370    default:
1371      return TRUE;
1372    }
1373
1374  /* Return TRUE if there is no transition.  */
1375  if (from_type == to_type)
1376    return TRUE;
1377
1378  /* Check if the transition can be performed.  */
1379  if (check
1380      && ! elf_x86_64_check_tls_transition (abfd, info, sec, contents,
1381					    symtab_hdr, sym_hashes,
1382					    from_type, rel, relend))
1383    {
1384      reloc_howto_type *from, *to;
1385      const char *name;
1386
1387      from = elf_x86_64_rtype_to_howto (abfd, from_type);
1388      to = elf_x86_64_rtype_to_howto (abfd, to_type);
1389
1390      if (h)
1391	name = h->root.root.string;
1392      else
1393	{
1394	  struct elf_x86_64_link_hash_table *htab;
1395
1396	  htab = elf_x86_64_hash_table (info);
1397	  if (htab == NULL)
1398	    name = "*unknown*";
1399	  else
1400	    {
1401	      Elf_Internal_Sym *isym;
1402
1403	      isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1404					    abfd, r_symndx);
1405	      name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1406	    }
1407	}
1408
1409      (*_bfd_error_handler)
1410	(_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1411	   "in section `%A' failed"),
1412	 abfd, sec, from->name, to->name, name,
1413	 (unsigned long) rel->r_offset);
1414      bfd_set_error (bfd_error_bad_value);
1415      return FALSE;
1416    }
1417
1418  *r_type = to_type;
1419  return TRUE;
1420}
1421
1422/* Look through the relocs for a section during the first phase, and
1423   calculate needed space in the global offset table, procedure
1424   linkage table, and dynamic reloc sections.  */
1425
1426static bfd_boolean
1427elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
1428			 asection *sec,
1429			 const Elf_Internal_Rela *relocs)
1430{
1431  struct elf_x86_64_link_hash_table *htab;
1432  Elf_Internal_Shdr *symtab_hdr;
1433  struct elf_link_hash_entry **sym_hashes;
1434  const Elf_Internal_Rela *rel;
1435  const Elf_Internal_Rela *rel_end;
1436  asection *sreloc;
1437
1438  if (info->relocatable)
1439    return TRUE;
1440
1441  BFD_ASSERT (is_x86_64_elf (abfd));
1442
1443  htab = elf_x86_64_hash_table (info);
1444  if (htab == NULL)
1445    return FALSE;
1446
1447  symtab_hdr = &elf_symtab_hdr (abfd);
1448  sym_hashes = elf_sym_hashes (abfd);
1449
1450  sreloc = NULL;
1451
1452  rel_end = relocs + sec->reloc_count;
1453  for (rel = relocs; rel < rel_end; rel++)
1454    {
1455      unsigned int r_type;
1456      unsigned long r_symndx;
1457      struct elf_link_hash_entry *h;
1458      Elf_Internal_Sym *isym;
1459      const char *name;
1460      bfd_boolean size_reloc;
1461
1462      r_symndx = htab->r_sym (rel->r_info);
1463      r_type = ELF32_R_TYPE (rel->r_info);
1464
1465      if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1466	{
1467	  (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1468				 abfd, r_symndx);
1469	  return FALSE;
1470	}
1471
1472      if (r_symndx < symtab_hdr->sh_info)
1473	{
1474	  /* A local symbol.  */
1475	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1476					abfd, r_symndx);
1477	  if (isym == NULL)
1478	    return FALSE;
1479
1480	  /* Check relocation against local STT_GNU_IFUNC symbol.  */
1481	  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1482	    {
1483	      h = elf_x86_64_get_local_sym_hash (htab, abfd, rel,
1484						 TRUE);
1485	      if (h == NULL)
1486		return FALSE;
1487
1488	      /* Fake a STT_GNU_IFUNC symbol.  */
1489	      h->type = STT_GNU_IFUNC;
1490	      h->def_regular = 1;
1491	      h->ref_regular = 1;
1492	      h->forced_local = 1;
1493	      h->root.type = bfd_link_hash_defined;
1494	    }
1495	  else
1496	    h = NULL;
1497	}
1498      else
1499	{
1500	  isym = NULL;
1501	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1502	  while (h->root.type == bfd_link_hash_indirect
1503		 || h->root.type == bfd_link_hash_warning)
1504	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1505	}
1506
1507      /* Check invalid x32 relocations.  */
1508      if (!ABI_64_P (abfd))
1509	switch (r_type)
1510	  {
1511	  default:
1512	    break;
1513
1514	  case R_X86_64_DTPOFF64:
1515	  case R_X86_64_TPOFF64:
1516	  case R_X86_64_PC64:
1517	  case R_X86_64_GOTOFF64:
1518	  case R_X86_64_GOT64:
1519	  case R_X86_64_GOTPCREL64:
1520	  case R_X86_64_GOTPC64:
1521	  case R_X86_64_GOTPLT64:
1522	  case R_X86_64_PLTOFF64:
1523	      {
1524		if (h)
1525		  name = h->root.root.string;
1526		else
1527		  name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1528					   NULL);
1529		(*_bfd_error_handler)
1530		  (_("%B: relocation %s against symbol `%s' isn't "
1531		     "supported in x32 mode"), abfd,
1532		   x86_64_elf_howto_table[r_type].name, name);
1533		bfd_set_error (bfd_error_bad_value);
1534		return FALSE;
1535	      }
1536	    break;
1537	  }
1538
1539      if (h != NULL)
1540	{
1541	  /* Create the ifunc sections for static executables.  If we
1542	     never see an indirect function symbol nor we are building
1543	     a static executable, those sections will be empty and
1544	     won't appear in output.  */
1545	  switch (r_type)
1546	    {
1547	    default:
1548	      break;
1549
1550	    case R_X86_64_32S:
1551	    case R_X86_64_32:
1552	    case R_X86_64_64:
1553	    case R_X86_64_PC32:
1554	    case R_X86_64_PC32_BND:
1555	    case R_X86_64_PC64:
1556	    case R_X86_64_PLT32:
1557	    case R_X86_64_PLT32_BND:
1558	    case R_X86_64_GOTPCREL:
1559	    case R_X86_64_GOTPCREL64:
1560	      if (htab->elf.dynobj == NULL)
1561		htab->elf.dynobj = abfd;
1562	      if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info))
1563		return FALSE;
1564	      break;
1565	    }
1566
1567	  /* It is referenced by a non-shared object. */
1568	  h->ref_regular = 1;
1569	  h->root.non_ir_ref = 1;
1570	}
1571
1572      if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
1573				       symtab_hdr, sym_hashes,
1574				       &r_type, GOT_UNKNOWN,
1575				       rel, rel_end, h, r_symndx))
1576	return FALSE;
1577
1578      switch (r_type)
1579	{
1580	case R_X86_64_TLSLD:
1581	  htab->tls_ld_got.refcount += 1;
1582	  goto create_got;
1583
1584	case R_X86_64_TPOFF32:
1585	  if (!info->executable && ABI_64_P (abfd))
1586	    {
1587	      if (h)
1588		name = h->root.root.string;
1589	      else
1590		name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1591					 NULL);
1592	      (*_bfd_error_handler)
1593		(_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1594		 abfd,
1595		 x86_64_elf_howto_table[r_type].name, name);
1596	      bfd_set_error (bfd_error_bad_value);
1597	      return FALSE;
1598	    }
1599	  break;
1600
1601	case R_X86_64_GOTTPOFF:
1602	  if (!info->executable)
1603	    info->flags |= DF_STATIC_TLS;
1604	  /* Fall through */
1605
1606	case R_X86_64_GOT32:
1607	case R_X86_64_GOTPCREL:
1608	case R_X86_64_TLSGD:
1609	case R_X86_64_GOT64:
1610	case R_X86_64_GOTPCREL64:
1611	case R_X86_64_GOTPLT64:
1612	case R_X86_64_GOTPC32_TLSDESC:
1613	case R_X86_64_TLSDESC_CALL:
1614	  /* This symbol requires a global offset table entry.	*/
1615	  {
1616	    int tls_type, old_tls_type;
1617
1618	    switch (r_type)
1619	      {
1620	      default: tls_type = GOT_NORMAL; break;
1621	      case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break;
1622	      case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break;
1623	      case R_X86_64_GOTPC32_TLSDESC:
1624	      case R_X86_64_TLSDESC_CALL:
1625		tls_type = GOT_TLS_GDESC; break;
1626	      }
1627
1628	    if (h != NULL)
1629	      {
1630		if (r_type == R_X86_64_GOTPLT64)
1631		  {
1632		    /* This relocation indicates that we also need
1633		       a PLT entry, as this is a function.  We don't need
1634		       a PLT entry for local symbols.  */
1635		    h->needs_plt = 1;
1636		    h->plt.refcount += 1;
1637		  }
1638		h->got.refcount += 1;
1639		old_tls_type = elf_x86_64_hash_entry (h)->tls_type;
1640	      }
1641	    else
1642	      {
1643		bfd_signed_vma *local_got_refcounts;
1644
1645		/* This is a global offset table entry for a local symbol.  */
1646		local_got_refcounts = elf_local_got_refcounts (abfd);
1647		if (local_got_refcounts == NULL)
1648		  {
1649		    bfd_size_type size;
1650
1651		    size = symtab_hdr->sh_info;
1652		    size *= sizeof (bfd_signed_vma)
1653		      + sizeof (bfd_vma) + sizeof (char);
1654		    local_got_refcounts = ((bfd_signed_vma *)
1655					   bfd_zalloc (abfd, size));
1656		    if (local_got_refcounts == NULL)
1657		      return FALSE;
1658		    elf_local_got_refcounts (abfd) = local_got_refcounts;
1659		    elf_x86_64_local_tlsdesc_gotent (abfd)
1660		      = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
1661		    elf_x86_64_local_got_tls_type (abfd)
1662		      = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
1663		  }
1664		local_got_refcounts[r_symndx] += 1;
1665		old_tls_type
1666		  = elf_x86_64_local_got_tls_type (abfd) [r_symndx];
1667	      }
1668
1669	    /* If a TLS symbol is accessed using IE at least once,
1670	       there is no point to use dynamic model for it.  */
1671	    if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1672		&& (! GOT_TLS_GD_ANY_P (old_tls_type)
1673		    || tls_type != GOT_TLS_IE))
1674	      {
1675		if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type))
1676		  tls_type = old_tls_type;
1677		else if (GOT_TLS_GD_ANY_P (old_tls_type)
1678			 && GOT_TLS_GD_ANY_P (tls_type))
1679		  tls_type |= old_tls_type;
1680		else
1681		  {
1682		    if (h)
1683		      name = h->root.root.string;
1684		    else
1685		      name = bfd_elf_sym_name (abfd, symtab_hdr,
1686					       isym, NULL);
1687		    (*_bfd_error_handler)
1688		      (_("%B: '%s' accessed both as normal and thread local symbol"),
1689		       abfd, name);
1690		    bfd_set_error (bfd_error_bad_value);
1691		    return FALSE;
1692		  }
1693	      }
1694
1695	    if (old_tls_type != tls_type)
1696	      {
1697		if (h != NULL)
1698		  elf_x86_64_hash_entry (h)->tls_type = tls_type;
1699		else
1700		  elf_x86_64_local_got_tls_type (abfd) [r_symndx] = tls_type;
1701	      }
1702	  }
1703	  /* Fall through */
1704
1705	case R_X86_64_GOTOFF64:
1706	case R_X86_64_GOTPC32:
1707	case R_X86_64_GOTPC64:
1708	create_got:
1709	  if (htab->elf.sgot == NULL)
1710	    {
1711	      if (htab->elf.dynobj == NULL)
1712		htab->elf.dynobj = abfd;
1713	      if (!_bfd_elf_create_got_section (htab->elf.dynobj,
1714						info))
1715		return FALSE;
1716	    }
1717	  break;
1718
1719	case R_X86_64_PLT32:
1720	case R_X86_64_PLT32_BND:
1721	  /* This symbol requires a procedure linkage table entry.  We
1722	     actually build the entry in adjust_dynamic_symbol,
1723	     because this might be a case of linking PIC code which is
1724	     never referenced by a dynamic object, in which case we
1725	     don't need to generate a procedure linkage table entry
1726	     after all.	 */
1727
1728	  /* If this is a local symbol, we resolve it directly without
1729	     creating a procedure linkage table entry.	*/
1730	  if (h == NULL)
1731	    continue;
1732
1733	  h->needs_plt = 1;
1734	  h->plt.refcount += 1;
1735	  break;
1736
1737	case R_X86_64_PLTOFF64:
1738	  /* This tries to form the 'address' of a function relative
1739	     to GOT.  For global symbols we need a PLT entry.  */
1740	  if (h != NULL)
1741	    {
1742	      h->needs_plt = 1;
1743	      h->plt.refcount += 1;
1744	    }
1745	  goto create_got;
1746
1747	case R_X86_64_SIZE32:
1748	case R_X86_64_SIZE64:
1749	  size_reloc = TRUE;
1750	  goto do_size;
1751
1752	case R_X86_64_32:
1753	  if (!ABI_64_P (abfd))
1754	    goto pointer;
1755	case R_X86_64_8:
1756	case R_X86_64_16:
1757	case R_X86_64_32S:
1758	  /* Let's help debug shared library creation.  These relocs
1759	     cannot be used in shared libs.  Don't error out for
1760	     sections we don't care about, such as debug sections or
1761	     non-constant sections.  */
1762	  if (info->shared
1763	      && (sec->flags & SEC_ALLOC) != 0
1764	      && (sec->flags & SEC_READONLY) != 0)
1765	    {
1766	      if (h)
1767		name = h->root.root.string;
1768	      else
1769		name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1770	      (*_bfd_error_handler)
1771		(_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1772		 abfd, x86_64_elf_howto_table[r_type].name, name);
1773	      bfd_set_error (bfd_error_bad_value);
1774	      return FALSE;
1775	    }
1776	  /* Fall through.  */
1777
1778	case R_X86_64_PC8:
1779	case R_X86_64_PC16:
1780	case R_X86_64_PC32:
1781	case R_X86_64_PC32_BND:
1782	case R_X86_64_PC64:
1783	case R_X86_64_64:
1784pointer:
1785	  if (h != NULL && info->executable)
1786	    {
1787	      /* If this reloc is in a read-only section, we might
1788		 need a copy reloc.  We can't check reliably at this
1789		 stage whether the section is read-only, as input
1790		 sections have not yet been mapped to output sections.
1791		 Tentatively set the flag for now, and correct in
1792		 adjust_dynamic_symbol.  */
1793	      h->non_got_ref = 1;
1794
1795	      /* We may need a .plt entry if the function this reloc
1796		 refers to is in a shared lib.  */
1797	      h->plt.refcount += 1;
1798	      if (r_type != R_X86_64_PC32
1799		  && r_type != R_X86_64_PC32_BND
1800		  && r_type != R_X86_64_PC64)
1801		h->pointer_equality_needed = 1;
1802	    }
1803
1804	  size_reloc = FALSE;
1805do_size:
1806	  /* If we are creating a shared library, and this is a reloc
1807	     against a global symbol, or a non PC relative reloc
1808	     against a local symbol, then we need to copy the reloc
1809	     into the shared library.  However, if we are linking with
1810	     -Bsymbolic, we do not need to copy a reloc against a
1811	     global symbol which is defined in an object we are
1812	     including in the link (i.e., DEF_REGULAR is set).	At
1813	     this point we have not seen all the input files, so it is
1814	     possible that DEF_REGULAR is not set now but will be set
1815	     later (it is never cleared).  In case of a weak definition,
1816	     DEF_REGULAR may be cleared later by a strong definition in
1817	     a shared library.  We account for that possibility below by
1818	     storing information in the relocs_copied field of the hash
1819	     table entry.  A similar situation occurs when creating
1820	     shared libraries and symbol visibility changes render the
1821	     symbol local.
1822
1823	     If on the other hand, we are creating an executable, we
1824	     may need to keep relocations for symbols satisfied by a
1825	     dynamic library if we manage to avoid copy relocs for the
1826	     symbol.  */
1827	  if ((info->shared
1828	       && (sec->flags & SEC_ALLOC) != 0
1829	       && (! IS_X86_64_PCREL_TYPE (r_type)
1830		   || (h != NULL
1831		       && (! SYMBOLIC_BIND (info, h)
1832			   || h->root.type == bfd_link_hash_defweak
1833			   || !h->def_regular))))
1834	      || (ELIMINATE_COPY_RELOCS
1835		  && !info->shared
1836		  && (sec->flags & SEC_ALLOC) != 0
1837		  && h != NULL
1838		  && (h->root.type == bfd_link_hash_defweak
1839		      || !h->def_regular)))
1840	    {
1841	      struct elf_dyn_relocs *p;
1842	      struct elf_dyn_relocs **head;
1843
1844	      /* We must copy these reloc types into the output file.
1845		 Create a reloc section in dynobj and make room for
1846		 this reloc.  */
1847	      if (sreloc == NULL)
1848		{
1849		  if (htab->elf.dynobj == NULL)
1850		    htab->elf.dynobj = abfd;
1851
1852		  sreloc = _bfd_elf_make_dynamic_reloc_section
1853		    (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2,
1854		     abfd, /*rela?*/ TRUE);
1855
1856		  if (sreloc == NULL)
1857		    return FALSE;
1858		}
1859
1860	      /* If this is a global symbol, we count the number of
1861		 relocations we need for this symbol.  */
1862	      if (h != NULL)
1863		{
1864		  head = &((struct elf_x86_64_link_hash_entry *) h)->dyn_relocs;
1865		}
1866	      else
1867		{
1868		  /* Track dynamic relocs needed for local syms too.
1869		     We really need local syms available to do this
1870		     easily.  Oh well.  */
1871		  asection *s;
1872		  void **vpp;
1873
1874		  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1875						abfd, r_symndx);
1876		  if (isym == NULL)
1877		    return FALSE;
1878
1879		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1880		  if (s == NULL)
1881		    s = sec;
1882
1883		  /* Beware of type punned pointers vs strict aliasing
1884		     rules.  */
1885		  vpp = &(elf_section_data (s)->local_dynrel);
1886		  head = (struct elf_dyn_relocs **)vpp;
1887		}
1888
1889	      p = *head;
1890	      if (p == NULL || p->sec != sec)
1891		{
1892		  bfd_size_type amt = sizeof *p;
1893
1894		  p = ((struct elf_dyn_relocs *)
1895		       bfd_alloc (htab->elf.dynobj, amt));
1896		  if (p == NULL)
1897		    return FALSE;
1898		  p->next = *head;
1899		  *head = p;
1900		  p->sec = sec;
1901		  p->count = 0;
1902		  p->pc_count = 0;
1903		}
1904
1905	      p->count += 1;
1906	      /* Count size relocation as PC-relative relocation.  */
1907	      if (IS_X86_64_PCREL_TYPE (r_type) || size_reloc)
1908		p->pc_count += 1;
1909	    }
1910	  break;
1911
1912	  /* This relocation describes the C++ object vtable hierarchy.
1913	     Reconstruct it for later use during GC.  */
1914	case R_X86_64_GNU_VTINHERIT:
1915	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1916	    return FALSE;
1917	  break;
1918
1919	  /* This relocation describes which C++ vtable entries are actually
1920	     used.  Record for later use during GC.  */
1921	case R_X86_64_GNU_VTENTRY:
1922	  BFD_ASSERT (h != NULL);
1923	  if (h != NULL
1924	      && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1925	    return FALSE;
1926	  break;
1927
1928	default:
1929	  break;
1930	}
1931    }
1932
1933  return TRUE;
1934}
1935
1936/* Return the section that should be marked against GC for a given
1937   relocation.	*/
1938
1939static asection *
1940elf_x86_64_gc_mark_hook (asection *sec,
1941			 struct bfd_link_info *info,
1942			 Elf_Internal_Rela *rel,
1943			 struct elf_link_hash_entry *h,
1944			 Elf_Internal_Sym *sym)
1945{
1946  if (h != NULL)
1947    switch (ELF32_R_TYPE (rel->r_info))
1948      {
1949      case R_X86_64_GNU_VTINHERIT:
1950      case R_X86_64_GNU_VTENTRY:
1951	return NULL;
1952      }
1953
1954  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1955}
1956
1957/* Update the got entry reference counts for the section being removed.	 */
1958
1959static bfd_boolean
1960elf_x86_64_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
1961			  asection *sec,
1962			  const Elf_Internal_Rela *relocs)
1963{
1964  struct elf_x86_64_link_hash_table *htab;
1965  Elf_Internal_Shdr *symtab_hdr;
1966  struct elf_link_hash_entry **sym_hashes;
1967  bfd_signed_vma *local_got_refcounts;
1968  const Elf_Internal_Rela *rel, *relend;
1969
1970  if (info->relocatable)
1971    return TRUE;
1972
1973  htab = elf_x86_64_hash_table (info);
1974  if (htab == NULL)
1975    return FALSE;
1976
1977  elf_section_data (sec)->local_dynrel = NULL;
1978
1979  symtab_hdr = &elf_symtab_hdr (abfd);
1980  sym_hashes = elf_sym_hashes (abfd);
1981  local_got_refcounts = elf_local_got_refcounts (abfd);
1982
1983  htab = elf_x86_64_hash_table (info);
1984  relend = relocs + sec->reloc_count;
1985  for (rel = relocs; rel < relend; rel++)
1986    {
1987      unsigned long r_symndx;
1988      unsigned int r_type;
1989      struct elf_link_hash_entry *h = NULL;
1990
1991      r_symndx = htab->r_sym (rel->r_info);
1992      if (r_symndx >= symtab_hdr->sh_info)
1993	{
1994	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1995	  while (h->root.type == bfd_link_hash_indirect
1996		 || h->root.type == bfd_link_hash_warning)
1997	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1998	}
1999      else
2000	{
2001	  /* A local symbol.  */
2002	  Elf_Internal_Sym *isym;
2003
2004	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2005					abfd, r_symndx);
2006
2007	  /* Check relocation against local STT_GNU_IFUNC symbol.  */
2008	  if (isym != NULL
2009	      && ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2010	    {
2011	      h = elf_x86_64_get_local_sym_hash (htab, abfd, rel, FALSE);
2012	      if (h == NULL)
2013		abort ();
2014	    }
2015	}
2016
2017      if (h)
2018	{
2019	  struct elf_x86_64_link_hash_entry *eh;
2020	  struct elf_dyn_relocs **pp;
2021	  struct elf_dyn_relocs *p;
2022
2023	  eh = (struct elf_x86_64_link_hash_entry *) h;
2024
2025	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2026	    if (p->sec == sec)
2027	      {
2028		/* Everything must go for SEC.  */
2029		*pp = p->next;
2030		break;
2031	      }
2032	}
2033
2034      r_type = ELF32_R_TYPE (rel->r_info);
2035      if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
2036				       symtab_hdr, sym_hashes,
2037				       &r_type, GOT_UNKNOWN,
2038				       rel, relend, h, r_symndx))
2039	return FALSE;
2040
2041      switch (r_type)
2042	{
2043	case R_X86_64_TLSLD:
2044	  if (htab->tls_ld_got.refcount > 0)
2045	    htab->tls_ld_got.refcount -= 1;
2046	  break;
2047
2048	case R_X86_64_TLSGD:
2049	case R_X86_64_GOTPC32_TLSDESC:
2050	case R_X86_64_TLSDESC_CALL:
2051	case R_X86_64_GOTTPOFF:
2052	case R_X86_64_GOT32:
2053	case R_X86_64_GOTPCREL:
2054	case R_X86_64_GOT64:
2055	case R_X86_64_GOTPCREL64:
2056	case R_X86_64_GOTPLT64:
2057	  if (h != NULL)
2058	    {
2059	      if (r_type == R_X86_64_GOTPLT64 && h->plt.refcount > 0)
2060		h->plt.refcount -= 1;
2061	      if (h->got.refcount > 0)
2062		h->got.refcount -= 1;
2063	      if (h->type == STT_GNU_IFUNC)
2064		{
2065		  if (h->plt.refcount > 0)
2066		    h->plt.refcount -= 1;
2067		}
2068	    }
2069	  else if (local_got_refcounts != NULL)
2070	    {
2071	      if (local_got_refcounts[r_symndx] > 0)
2072		local_got_refcounts[r_symndx] -= 1;
2073	    }
2074	  break;
2075
2076	case R_X86_64_8:
2077	case R_X86_64_16:
2078	case R_X86_64_32:
2079	case R_X86_64_64:
2080	case R_X86_64_32S:
2081	case R_X86_64_PC8:
2082	case R_X86_64_PC16:
2083	case R_X86_64_PC32:
2084	case R_X86_64_PC32_BND:
2085	case R_X86_64_PC64:
2086	case R_X86_64_SIZE32:
2087	case R_X86_64_SIZE64:
2088	  if (info->shared
2089	      && (h == NULL || h->type != STT_GNU_IFUNC))
2090	    break;
2091	  /* Fall thru */
2092
2093	case R_X86_64_PLT32:
2094	case R_X86_64_PLT32_BND:
2095	case R_X86_64_PLTOFF64:
2096	  if (h != NULL)
2097	    {
2098	      if (h->plt.refcount > 0)
2099		h->plt.refcount -= 1;
2100	    }
2101	  break;
2102
2103	default:
2104	  break;
2105	}
2106    }
2107
2108  return TRUE;
2109}
2110
2111/* Adjust a symbol defined by a dynamic object and referenced by a
2112   regular object.  The current definition is in some section of the
2113   dynamic object, but we're not including those sections.  We have to
2114   change the definition to something the rest of the link can
2115   understand.	*/
2116
2117static bfd_boolean
2118elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
2119				  struct elf_link_hash_entry *h)
2120{
2121  struct elf_x86_64_link_hash_table *htab;
2122  asection *s;
2123  struct elf_x86_64_link_hash_entry *eh;
2124  struct elf_dyn_relocs *p;
2125
2126  /* STT_GNU_IFUNC symbol must go through PLT. */
2127  if (h->type == STT_GNU_IFUNC)
2128    {
2129      /* All local STT_GNU_IFUNC references must be treate as local
2130	 calls via local PLT.  */
2131      if (h->ref_regular
2132	  && SYMBOL_CALLS_LOCAL (info, h))
2133	{
2134	  bfd_size_type pc_count = 0, count = 0;
2135	  struct elf_dyn_relocs **pp;
2136
2137	  eh = (struct elf_x86_64_link_hash_entry *) h;
2138	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2139	    {
2140	      pc_count += p->pc_count;
2141	      p->count -= p->pc_count;
2142	      p->pc_count = 0;
2143	      count += p->count;
2144	      if (p->count == 0)
2145		*pp = p->next;
2146	      else
2147		pp = &p->next;
2148	    }
2149
2150	  if (pc_count || count)
2151	    {
2152	      h->needs_plt = 1;
2153	      h->non_got_ref = 1;
2154	      if (h->plt.refcount <= 0)
2155		h->plt.refcount = 1;
2156	      else
2157		h->plt.refcount += 1;
2158	    }
2159	}
2160
2161      if (h->plt.refcount <= 0)
2162	{
2163	  h->plt.offset = (bfd_vma) -1;
2164	  h->needs_plt = 0;
2165	}
2166      return TRUE;
2167    }
2168
2169  /* If this is a function, put it in the procedure linkage table.  We
2170     will fill in the contents of the procedure linkage table later,
2171     when we know the address of the .got section.  */
2172  if (h->type == STT_FUNC
2173      || h->needs_plt)
2174    {
2175      if (h->plt.refcount <= 0
2176	  || SYMBOL_CALLS_LOCAL (info, h)
2177	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2178	      && h->root.type == bfd_link_hash_undefweak))
2179	{
2180	  /* This case can occur if we saw a PLT32 reloc in an input
2181	     file, but the symbol was never referred to by a dynamic
2182	     object, or if all references were garbage collected.  In
2183	     such a case, we don't actually need to build a procedure
2184	     linkage table, and we can just do a PC32 reloc instead.  */
2185	  h->plt.offset = (bfd_vma) -1;
2186	  h->needs_plt = 0;
2187	}
2188
2189      return TRUE;
2190    }
2191  else
2192    /* It's possible that we incorrectly decided a .plt reloc was
2193       needed for an R_X86_64_PC32 reloc to a non-function sym in
2194       check_relocs.  We can't decide accurately between function and
2195       non-function syms in check-relocs;  Objects loaded later in
2196       the link may change h->type.  So fix it now.  */
2197    h->plt.offset = (bfd_vma) -1;
2198
2199  /* If this is a weak symbol, and there is a real definition, the
2200     processor independent code will have arranged for us to see the
2201     real definition first, and we can just use the same value.	 */
2202  if (h->u.weakdef != NULL)
2203    {
2204      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2205		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
2206      h->root.u.def.section = h->u.weakdef->root.u.def.section;
2207      h->root.u.def.value = h->u.weakdef->root.u.def.value;
2208      if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2209	h->non_got_ref = h->u.weakdef->non_got_ref;
2210      return TRUE;
2211    }
2212
2213  /* This is a reference to a symbol defined by a dynamic object which
2214     is not a function.	 */
2215
2216  /* If we are creating a shared library, we must presume that the
2217     only references to the symbol are via the global offset table.
2218     For such cases we need not do anything here; the relocations will
2219     be handled correctly by relocate_section.	*/
2220  if (info->shared)
2221    return TRUE;
2222
2223  /* If there are no references to this symbol that do not use the
2224     GOT, we don't need to generate a copy reloc.  */
2225  if (!h->non_got_ref)
2226    return TRUE;
2227
2228  /* If -z nocopyreloc was given, we won't generate them either.  */
2229  if (info->nocopyreloc)
2230    {
2231      h->non_got_ref = 0;
2232      return TRUE;
2233    }
2234
2235  if (ELIMINATE_COPY_RELOCS)
2236    {
2237      eh = (struct elf_x86_64_link_hash_entry *) h;
2238      for (p = eh->dyn_relocs; p != NULL; p = p->next)
2239	{
2240	  s = p->sec->output_section;
2241	  if (s != NULL && (s->flags & SEC_READONLY) != 0)
2242	    break;
2243	}
2244
2245      /* If we didn't find any dynamic relocs in read-only sections, then
2246	 we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
2247      if (p == NULL)
2248	{
2249	  h->non_got_ref = 0;
2250	  return TRUE;
2251	}
2252    }
2253
2254  /* We must allocate the symbol in our .dynbss section, which will
2255     become part of the .bss section of the executable.	 There will be
2256     an entry for this symbol in the .dynsym section.  The dynamic
2257     object will contain position independent code, so all references
2258     from the dynamic object to this symbol will go through the global
2259     offset table.  The dynamic linker will use the .dynsym entry to
2260     determine the address it must put in the global offset table, so
2261     both the dynamic object and the regular object will refer to the
2262     same memory location for the variable.  */
2263
2264  htab = elf_x86_64_hash_table (info);
2265  if (htab == NULL)
2266    return FALSE;
2267
2268  /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
2269     to copy the initial value out of the dynamic object and into the
2270     runtime process image.  */
2271  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2272    {
2273      const struct elf_backend_data *bed;
2274      bed = get_elf_backend_data (info->output_bfd);
2275      htab->srelbss->size += bed->s->sizeof_rela;
2276      h->needs_copy = 1;
2277    }
2278
2279  s = htab->sdynbss;
2280
2281  return _bfd_elf_adjust_dynamic_copy (h, s);
2282}
2283
2284/* Allocate space in .plt, .got and associated reloc sections for
2285   dynamic relocs.  */
2286
2287static bfd_boolean
2288elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2289{
2290  struct bfd_link_info *info;
2291  struct elf_x86_64_link_hash_table *htab;
2292  struct elf_x86_64_link_hash_entry *eh;
2293  struct elf_dyn_relocs *p;
2294  const struct elf_backend_data *bed;
2295  unsigned int plt_entry_size;
2296
2297  if (h->root.type == bfd_link_hash_indirect)
2298    return TRUE;
2299
2300  eh = (struct elf_x86_64_link_hash_entry *) h;
2301
2302  info = (struct bfd_link_info *) inf;
2303  htab = elf_x86_64_hash_table (info);
2304  if (htab == NULL)
2305    return FALSE;
2306  bed = get_elf_backend_data (info->output_bfd);
2307  plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2308
2309  /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2310     here if it is defined and referenced in a non-shared object.  */
2311  if (h->type == STT_GNU_IFUNC
2312      && h->def_regular)
2313    return _bfd_elf_allocate_ifunc_dyn_relocs (info, h,
2314					       &eh->dyn_relocs,
2315					       plt_entry_size,
2316					       plt_entry_size,
2317					       GOT_ENTRY_SIZE);
2318  else if (htab->elf.dynamic_sections_created
2319	   && h->plt.refcount > 0)
2320    {
2321      /* Make sure this symbol is output as a dynamic symbol.
2322	 Undefined weak syms won't yet be marked as dynamic.  */
2323      if (h->dynindx == -1
2324	  && !h->forced_local)
2325	{
2326	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
2327	    return FALSE;
2328	}
2329
2330      if (info->shared
2331	  || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2332	{
2333	  asection *s = htab->elf.splt;
2334
2335	  /* If this is the first .plt entry, make room for the special
2336	     first entry.  */
2337	  if (s->size == 0)
2338	    s->size = plt_entry_size;
2339
2340	  h->plt.offset = s->size;
2341
2342	  /* If this symbol is not defined in a regular file, and we are
2343	     not generating a shared library, then set the symbol to this
2344	     location in the .plt.  This is required to make function
2345	     pointers compare as equal between the normal executable and
2346	     the shared library.  */
2347	  if (! info->shared
2348	      && !h->def_regular)
2349	    {
2350	      h->root.u.def.section = s;
2351	      h->root.u.def.value = h->plt.offset;
2352	    }
2353
2354	  /* Make room for this entry.  */
2355	  s->size += plt_entry_size;
2356
2357	  /* We also need to make an entry in the .got.plt section, which
2358	     will be placed in the .got section by the linker script.  */
2359	  htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
2360
2361	  /* We also need to make an entry in the .rela.plt section.  */
2362	  htab->elf.srelplt->size += bed->s->sizeof_rela;
2363	  htab->elf.srelplt->reloc_count++;
2364	}
2365      else
2366	{
2367	  h->plt.offset = (bfd_vma) -1;
2368	  h->needs_plt = 0;
2369	}
2370    }
2371  else
2372    {
2373      h->plt.offset = (bfd_vma) -1;
2374      h->needs_plt = 0;
2375    }
2376
2377  eh->tlsdesc_got = (bfd_vma) -1;
2378
2379  /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
2380     make it a R_X86_64_TPOFF32 requiring no GOT entry.  */
2381  if (h->got.refcount > 0
2382      && info->executable
2383      && h->dynindx == -1
2384      && elf_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE)
2385    {
2386      h->got.offset = (bfd_vma) -1;
2387    }
2388  else if (h->got.refcount > 0)
2389    {
2390      asection *s;
2391      bfd_boolean dyn;
2392      int tls_type = elf_x86_64_hash_entry (h)->tls_type;
2393
2394      /* Make sure this symbol is output as a dynamic symbol.
2395	 Undefined weak syms won't yet be marked as dynamic.  */
2396      if (h->dynindx == -1
2397	  && !h->forced_local)
2398	{
2399	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
2400	    return FALSE;
2401	}
2402
2403      if (GOT_TLS_GDESC_P (tls_type))
2404	{
2405	  eh->tlsdesc_got = htab->elf.sgotplt->size
2406	    - elf_x86_64_compute_jump_table_size (htab);
2407	  htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
2408	  h->got.offset = (bfd_vma) -2;
2409	}
2410      if (! GOT_TLS_GDESC_P (tls_type)
2411	  || GOT_TLS_GD_P (tls_type))
2412	{
2413	  s = htab->elf.sgot;
2414	  h->got.offset = s->size;
2415	  s->size += GOT_ENTRY_SIZE;
2416	  if (GOT_TLS_GD_P (tls_type))
2417	    s->size += GOT_ENTRY_SIZE;
2418	}
2419      dyn = htab->elf.dynamic_sections_created;
2420      /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
2421	 and two if global.
2422	 R_X86_64_GOTTPOFF needs one dynamic relocation.  */
2423      if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2424	  || tls_type == GOT_TLS_IE)
2425	htab->elf.srelgot->size += bed->s->sizeof_rela;
2426      else if (GOT_TLS_GD_P (tls_type))
2427	htab->elf.srelgot->size += 2 * bed->s->sizeof_rela;
2428      else if (! GOT_TLS_GDESC_P (tls_type)
2429	       && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2430		   || h->root.type != bfd_link_hash_undefweak)
2431	       && (info->shared
2432		   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2433	htab->elf.srelgot->size += bed->s->sizeof_rela;
2434      if (GOT_TLS_GDESC_P (tls_type))
2435	{
2436	  htab->elf.srelplt->size += bed->s->sizeof_rela;
2437	  htab->tlsdesc_plt = (bfd_vma) -1;
2438	}
2439    }
2440  else
2441    h->got.offset = (bfd_vma) -1;
2442
2443  if (eh->dyn_relocs == NULL)
2444    return TRUE;
2445
2446  /* In the shared -Bsymbolic case, discard space allocated for
2447     dynamic pc-relative relocs against symbols which turn out to be
2448     defined in regular objects.  For the normal shared case, discard
2449     space for pc-relative relocs that have become local due to symbol
2450     visibility changes.  */
2451
2452  if (info->shared)
2453    {
2454      /* Relocs that use pc_count are those that appear on a call
2455	 insn, or certain REL relocs that can generated via assembly.
2456	 We want calls to protected symbols to resolve directly to the
2457	 function rather than going via the plt.  If people want
2458	 function pointer comparisons to work as expected then they
2459	 should avoid writing weird assembly.  */
2460      if (SYMBOL_CALLS_LOCAL (info, h))
2461	{
2462	  struct elf_dyn_relocs **pp;
2463
2464	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2465	    {
2466	      p->count -= p->pc_count;
2467	      p->pc_count = 0;
2468	      if (p->count == 0)
2469		*pp = p->next;
2470	      else
2471		pp = &p->next;
2472	    }
2473	}
2474
2475      /* Also discard relocs on undefined weak syms with non-default
2476	 visibility.  */
2477      if (eh->dyn_relocs != NULL
2478	  && h->root.type == bfd_link_hash_undefweak)
2479	{
2480	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2481	    eh->dyn_relocs = NULL;
2482
2483	  /* Make sure undefined weak symbols are output as a dynamic
2484	     symbol in PIEs.  */
2485	  else if (h->dynindx == -1
2486		   && ! h->forced_local
2487		   && ! bfd_elf_link_record_dynamic_symbol (info, h))
2488	    return FALSE;
2489	}
2490
2491    }
2492  else if (ELIMINATE_COPY_RELOCS)
2493    {
2494      /* For the non-shared case, discard space for relocs against
2495	 symbols which turn out to need copy relocs or are not
2496	 dynamic.  */
2497
2498      if (!h->non_got_ref
2499	  && ((h->def_dynamic
2500	       && !h->def_regular)
2501	      || (htab->elf.dynamic_sections_created
2502		  && (h->root.type == bfd_link_hash_undefweak
2503		      || h->root.type == bfd_link_hash_undefined))))
2504	{
2505	  /* Make sure this symbol is output as a dynamic symbol.
2506	     Undefined weak syms won't yet be marked as dynamic.  */
2507	  if (h->dynindx == -1
2508	      && ! h->forced_local
2509	      && ! bfd_elf_link_record_dynamic_symbol (info, h))
2510	    return FALSE;
2511
2512	  /* If that succeeded, we know we'll be keeping all the
2513	     relocs.  */
2514	  if (h->dynindx != -1)
2515	    goto keep;
2516	}
2517
2518      eh->dyn_relocs = NULL;
2519
2520    keep: ;
2521    }
2522
2523  /* Finally, allocate space.  */
2524  for (p = eh->dyn_relocs; p != NULL; p = p->next)
2525    {
2526      asection * sreloc;
2527
2528      sreloc = elf_section_data (p->sec)->sreloc;
2529
2530      BFD_ASSERT (sreloc != NULL);
2531
2532      sreloc->size += p->count * bed->s->sizeof_rela;
2533    }
2534
2535  return TRUE;
2536}
2537
2538/* Allocate space in .plt, .got and associated reloc sections for
2539   local dynamic relocs.  */
2540
2541static bfd_boolean
2542elf_x86_64_allocate_local_dynrelocs (void **slot, void *inf)
2543{
2544  struct elf_link_hash_entry *h
2545    = (struct elf_link_hash_entry *) *slot;
2546
2547  if (h->type != STT_GNU_IFUNC
2548      || !h->def_regular
2549      || !h->ref_regular
2550      || !h->forced_local
2551      || h->root.type != bfd_link_hash_defined)
2552    abort ();
2553
2554  return elf_x86_64_allocate_dynrelocs (h, inf);
2555}
2556
2557/* Find any dynamic relocs that apply to read-only sections.  */
2558
2559static bfd_boolean
2560elf_x86_64_readonly_dynrelocs (struct elf_link_hash_entry *h,
2561			       void * inf)
2562{
2563  struct elf_x86_64_link_hash_entry *eh;
2564  struct elf_dyn_relocs *p;
2565
2566  /* Skip local IFUNC symbols. */
2567  if (h->forced_local && h->type == STT_GNU_IFUNC)
2568    return TRUE;
2569
2570  eh = (struct elf_x86_64_link_hash_entry *) h;
2571  for (p = eh->dyn_relocs; p != NULL; p = p->next)
2572    {
2573      asection *s = p->sec->output_section;
2574
2575      if (s != NULL && (s->flags & SEC_READONLY) != 0)
2576	{
2577	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
2578
2579	  info->flags |= DF_TEXTREL;
2580
2581	  if (info->warn_shared_textrel && info->shared)
2582	    info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'.\n"),
2583				    p->sec->owner, h->root.root.string,
2584				    p->sec);
2585
2586	  /* Not an error, just cut short the traversal.  */
2587	  return FALSE;
2588	}
2589    }
2590  return TRUE;
2591}
2592
2593/* Convert
2594   mov foo@GOTPCREL(%rip), %reg
2595   to
2596   lea foo(%rip), %reg
2597   with the local symbol, foo.  */
2598
2599static bfd_boolean
2600elf_x86_64_convert_mov_to_lea (bfd *abfd, asection *sec,
2601			       struct bfd_link_info *link_info)
2602{
2603  Elf_Internal_Shdr *symtab_hdr;
2604  Elf_Internal_Rela *internal_relocs;
2605  Elf_Internal_Rela *irel, *irelend;
2606  bfd_byte *contents;
2607  struct elf_x86_64_link_hash_table *htab;
2608  bfd_boolean changed_contents;
2609  bfd_boolean changed_relocs;
2610  bfd_signed_vma *local_got_refcounts;
2611
2612  /* Don't even try to convert non-ELF outputs.  */
2613  if (!is_elf_hash_table (link_info->hash))
2614    return FALSE;
2615
2616  /* Nothing to do if there are no codes, no relocations or no output.  */
2617  if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
2618      || sec->reloc_count == 0
2619      || discarded_section (sec))
2620    return TRUE;
2621
2622  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2623
2624  /* Load the relocations for this section.  */
2625  internal_relocs = (_bfd_elf_link_read_relocs
2626		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2627		      link_info->keep_memory));
2628  if (internal_relocs == NULL)
2629    return FALSE;
2630
2631  htab = elf_x86_64_hash_table (link_info);
2632  changed_contents = FALSE;
2633  changed_relocs = FALSE;
2634  local_got_refcounts = elf_local_got_refcounts (abfd);
2635
2636  /* Get the section contents.  */
2637  if (elf_section_data (sec)->this_hdr.contents != NULL)
2638    contents = elf_section_data (sec)->this_hdr.contents;
2639  else
2640    {
2641      if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2642	goto error_return;
2643    }
2644
2645  irelend = internal_relocs + sec->reloc_count;
2646  for (irel = internal_relocs; irel < irelend; irel++)
2647    {
2648      unsigned int r_type = ELF32_R_TYPE (irel->r_info);
2649      unsigned int r_symndx = htab->r_sym (irel->r_info);
2650      unsigned int indx;
2651      struct elf_link_hash_entry *h;
2652
2653      if (r_type != R_X86_64_GOTPCREL)
2654	continue;
2655
2656      /* Get the symbol referred to by the reloc.  */
2657      if (r_symndx < symtab_hdr->sh_info)
2658	{
2659	  Elf_Internal_Sym *isym;
2660
2661	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2662					abfd, r_symndx);
2663
2664	  /* STT_GNU_IFUNC must keep R_X86_64_GOTPCREL relocation.  */
2665	  if (ELF_ST_TYPE (isym->st_info) != STT_GNU_IFUNC
2666	      && bfd_get_8 (input_bfd,
2667			    contents + irel->r_offset - 2) == 0x8b)
2668	    {
2669	      bfd_put_8 (output_bfd, 0x8d,
2670			 contents + irel->r_offset - 2);
2671	      irel->r_info = htab->r_info (r_symndx, R_X86_64_PC32);
2672	      if (local_got_refcounts != NULL
2673		  && local_got_refcounts[r_symndx] > 0)
2674		local_got_refcounts[r_symndx] -= 1;
2675	      changed_contents = TRUE;
2676	      changed_relocs = TRUE;
2677	    }
2678	  continue;
2679	}
2680
2681      indx = r_symndx - symtab_hdr->sh_info;
2682      h = elf_sym_hashes (abfd)[indx];
2683      BFD_ASSERT (h != NULL);
2684
2685      while (h->root.type == bfd_link_hash_indirect
2686	     || h->root.type == bfd_link_hash_warning)
2687	h = (struct elf_link_hash_entry *) h->root.u.i.link;
2688
2689      /* STT_GNU_IFUNC must keep R_X86_64_GOTPCREL relocation.  We also
2690	 avoid optimizing _DYNAMIC since ld.so may use its link-time
2691	 address.  */
2692      if (h->def_regular
2693	  && h->type != STT_GNU_IFUNC
2694	  && h != htab->elf.hdynamic
2695	  && SYMBOL_REFERENCES_LOCAL (link_info, h)
2696	  && bfd_get_8 (input_bfd,
2697			contents + irel->r_offset - 2) == 0x8b)
2698	{
2699	  bfd_put_8 (output_bfd, 0x8d,
2700		     contents + irel->r_offset - 2);
2701	  irel->r_info = htab->r_info (r_symndx, R_X86_64_PC32);
2702	  if (h->got.refcount > 0)
2703	    h->got.refcount -= 1;
2704	  changed_contents = TRUE;
2705	  changed_relocs = TRUE;
2706	}
2707    }
2708
2709  if (contents != NULL
2710      && elf_section_data (sec)->this_hdr.contents != contents)
2711    {
2712      if (!changed_contents && !link_info->keep_memory)
2713	free (contents);
2714      else
2715	{
2716	  /* Cache the section contents for elf_link_input_bfd.  */
2717	  elf_section_data (sec)->this_hdr.contents = contents;
2718	}
2719    }
2720
2721  if (elf_section_data (sec)->relocs != internal_relocs)
2722    {
2723      if (!changed_relocs)
2724	free (internal_relocs);
2725      else
2726	elf_section_data (sec)->relocs = internal_relocs;
2727    }
2728
2729  return TRUE;
2730
2731 error_return:
2732  if (contents != NULL
2733      && elf_section_data (sec)->this_hdr.contents != contents)
2734    free (contents);
2735  if (internal_relocs != NULL
2736      && elf_section_data (sec)->relocs != internal_relocs)
2737    free (internal_relocs);
2738  return FALSE;
2739}
2740
2741/* Set the sizes of the dynamic sections.  */
2742
2743static bfd_boolean
2744elf_x86_64_size_dynamic_sections (bfd *output_bfd,
2745				  struct bfd_link_info *info)
2746{
2747  struct elf_x86_64_link_hash_table *htab;
2748  bfd *dynobj;
2749  asection *s;
2750  bfd_boolean relocs;
2751  bfd *ibfd;
2752  const struct elf_backend_data *bed;
2753
2754  htab = elf_x86_64_hash_table (info);
2755  if (htab == NULL)
2756    return FALSE;
2757  bed = get_elf_backend_data (output_bfd);
2758
2759  dynobj = htab->elf.dynobj;
2760  if (dynobj == NULL)
2761    abort ();
2762
2763  if (htab->elf.dynamic_sections_created)
2764    {
2765      /* Set the contents of the .interp section to the interpreter.  */
2766      if (info->executable)
2767	{
2768	  s = bfd_get_linker_section (dynobj, ".interp");
2769	  if (s == NULL)
2770	    abort ();
2771	  s->size = htab->dynamic_interpreter_size;
2772	  s->contents = (unsigned char *) htab->dynamic_interpreter;
2773	}
2774    }
2775
2776  /* Set up .got offsets for local syms, and space for local dynamic
2777     relocs.  */
2778  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2779    {
2780      bfd_signed_vma *local_got;
2781      bfd_signed_vma *end_local_got;
2782      char *local_tls_type;
2783      bfd_vma *local_tlsdesc_gotent;
2784      bfd_size_type locsymcount;
2785      Elf_Internal_Shdr *symtab_hdr;
2786      asection *srel;
2787
2788      if (! is_x86_64_elf (ibfd))
2789	continue;
2790
2791      for (s = ibfd->sections; s != NULL; s = s->next)
2792	{
2793	  struct elf_dyn_relocs *p;
2794
2795	  if (!elf_x86_64_convert_mov_to_lea (ibfd, s, info))
2796	    return FALSE;
2797
2798	  for (p = (struct elf_dyn_relocs *)
2799		    (elf_section_data (s)->local_dynrel);
2800	       p != NULL;
2801	       p = p->next)
2802	    {
2803	      if (!bfd_is_abs_section (p->sec)
2804		  && bfd_is_abs_section (p->sec->output_section))
2805		{
2806		  /* Input section has been discarded, either because
2807		     it is a copy of a linkonce section or due to
2808		     linker script /DISCARD/, so we'll be discarding
2809		     the relocs too.  */
2810		}
2811	      else if (p->count != 0)
2812		{
2813		  srel = elf_section_data (p->sec)->sreloc;
2814		  srel->size += p->count * bed->s->sizeof_rela;
2815		  if ((p->sec->output_section->flags & SEC_READONLY) != 0
2816		      && (info->flags & DF_TEXTREL) == 0)
2817		    {
2818		      info->flags |= DF_TEXTREL;
2819		      if (info->warn_shared_textrel && info->shared)
2820			info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'.\n"),
2821						p->sec->owner, p->sec);
2822		    }
2823		}
2824	    }
2825	}
2826
2827      local_got = elf_local_got_refcounts (ibfd);
2828      if (!local_got)
2829	continue;
2830
2831      symtab_hdr = &elf_symtab_hdr (ibfd);
2832      locsymcount = symtab_hdr->sh_info;
2833      end_local_got = local_got + locsymcount;
2834      local_tls_type = elf_x86_64_local_got_tls_type (ibfd);
2835      local_tlsdesc_gotent = elf_x86_64_local_tlsdesc_gotent (ibfd);
2836      s = htab->elf.sgot;
2837      srel = htab->elf.srelgot;
2838      for (; local_got < end_local_got;
2839	   ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
2840	{
2841	  *local_tlsdesc_gotent = (bfd_vma) -1;
2842	  if (*local_got > 0)
2843	    {
2844	      if (GOT_TLS_GDESC_P (*local_tls_type))
2845		{
2846		  *local_tlsdesc_gotent = htab->elf.sgotplt->size
2847		    - elf_x86_64_compute_jump_table_size (htab);
2848		  htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
2849		  *local_got = (bfd_vma) -2;
2850		}
2851	      if (! GOT_TLS_GDESC_P (*local_tls_type)
2852		  || GOT_TLS_GD_P (*local_tls_type))
2853		{
2854		  *local_got = s->size;
2855		  s->size += GOT_ENTRY_SIZE;
2856		  if (GOT_TLS_GD_P (*local_tls_type))
2857		    s->size += GOT_ENTRY_SIZE;
2858		}
2859	      if (info->shared
2860		  || GOT_TLS_GD_ANY_P (*local_tls_type)
2861		  || *local_tls_type == GOT_TLS_IE)
2862		{
2863		  if (GOT_TLS_GDESC_P (*local_tls_type))
2864		    {
2865		      htab->elf.srelplt->size
2866			+= bed->s->sizeof_rela;
2867		      htab->tlsdesc_plt = (bfd_vma) -1;
2868		    }
2869		  if (! GOT_TLS_GDESC_P (*local_tls_type)
2870		      || GOT_TLS_GD_P (*local_tls_type))
2871		    srel->size += bed->s->sizeof_rela;
2872		}
2873	    }
2874	  else
2875	    *local_got = (bfd_vma) -1;
2876	}
2877    }
2878
2879  if (htab->tls_ld_got.refcount > 0)
2880    {
2881      /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
2882	 relocs.  */
2883      htab->tls_ld_got.offset = htab->elf.sgot->size;
2884      htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE;
2885      htab->elf.srelgot->size += bed->s->sizeof_rela;
2886    }
2887  else
2888    htab->tls_ld_got.offset = -1;
2889
2890  /* Allocate global sym .plt and .got entries, and space for global
2891     sym dynamic relocs.  */
2892  elf_link_hash_traverse (&htab->elf, elf_x86_64_allocate_dynrelocs,
2893			  info);
2894
2895  /* Allocate .plt and .got entries, and space for local symbols.  */
2896  htab_traverse (htab->loc_hash_table,
2897		 elf_x86_64_allocate_local_dynrelocs,
2898		 info);
2899
2900  /* For every jump slot reserved in the sgotplt, reloc_count is
2901     incremented.  However, when we reserve space for TLS descriptors,
2902     it's not incremented, so in order to compute the space reserved
2903     for them, it suffices to multiply the reloc count by the jump
2904     slot size.
2905
2906     PR ld/13302: We start next_irelative_index at the end of .rela.plt
2907     so that R_X86_64_IRELATIVE entries come last.  */
2908  if (htab->elf.srelplt)
2909    {
2910      htab->sgotplt_jump_table_size
2911	= elf_x86_64_compute_jump_table_size (htab);
2912      htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
2913    }
2914  else if (htab->elf.irelplt)
2915    htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
2916
2917  if (htab->tlsdesc_plt)
2918    {
2919      /* If we're not using lazy TLS relocations, don't generate the
2920	 PLT and GOT entries they require.  */
2921      if ((info->flags & DF_BIND_NOW))
2922	htab->tlsdesc_plt = 0;
2923      else
2924	{
2925	  htab->tlsdesc_got = htab->elf.sgot->size;
2926	  htab->elf.sgot->size += GOT_ENTRY_SIZE;
2927	  /* Reserve room for the initial entry.
2928	     FIXME: we could probably do away with it in this case.  */
2929	  if (htab->elf.splt->size == 0)
2930	    htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
2931	  htab->tlsdesc_plt = htab->elf.splt->size;
2932	  htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
2933	}
2934    }
2935
2936  if (htab->elf.sgotplt)
2937    {
2938      /* Don't allocate .got.plt section if there are no GOT nor PLT
2939	 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_.  */
2940      if ((htab->elf.hgot == NULL
2941	   || !htab->elf.hgot->ref_regular_nonweak)
2942	  && (htab->elf.sgotplt->size
2943	      == get_elf_backend_data (output_bfd)->got_header_size)
2944	  && (htab->elf.splt == NULL
2945	      || htab->elf.splt->size == 0)
2946	  && (htab->elf.sgot == NULL
2947	      || htab->elf.sgot->size == 0)
2948	  && (htab->elf.iplt == NULL
2949	      || htab->elf.iplt->size == 0)
2950	  && (htab->elf.igotplt == NULL
2951	      || htab->elf.igotplt->size == 0))
2952	htab->elf.sgotplt->size = 0;
2953    }
2954
2955  if (htab->plt_eh_frame != NULL
2956      && htab->elf.splt != NULL
2957      && htab->elf.splt->size != 0
2958      && !bfd_is_abs_section (htab->elf.splt->output_section)
2959      && _bfd_elf_eh_frame_present (info))
2960    {
2961      const struct elf_x86_64_backend_data *arch_data
2962	= get_elf_x86_64_arch_data (bed);
2963      htab->plt_eh_frame->size = arch_data->eh_frame_plt_size;
2964    }
2965
2966  /* We now have determined the sizes of the various dynamic sections.
2967     Allocate memory for them.  */
2968  relocs = FALSE;
2969  for (s = dynobj->sections; s != NULL; s = s->next)
2970    {
2971      if ((s->flags & SEC_LINKER_CREATED) == 0)
2972	continue;
2973
2974      if (s == htab->elf.splt
2975	  || s == htab->elf.sgot
2976	  || s == htab->elf.sgotplt
2977	  || s == htab->elf.iplt
2978	  || s == htab->elf.igotplt
2979	  || s == htab->plt_eh_frame
2980	  || s == htab->sdynbss)
2981	{
2982	  /* Strip this section if we don't need it; see the
2983	     comment below.  */
2984	}
2985      else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2986	{
2987	  if (s->size != 0 && s != htab->elf.srelplt)
2988	    relocs = TRUE;
2989
2990	  /* We use the reloc_count field as a counter if we need
2991	     to copy relocs into the output file.  */
2992	  if (s != htab->elf.srelplt)
2993	    s->reloc_count = 0;
2994	}
2995      else
2996	{
2997	  /* It's not one of our sections, so don't allocate space.  */
2998	  continue;
2999	}
3000
3001      if (s->size == 0)
3002	{
3003	  /* If we don't need this section, strip it from the
3004	     output file.  This is mostly to handle .rela.bss and
3005	     .rela.plt.  We must create both sections in
3006	     create_dynamic_sections, because they must be created
3007	     before the linker maps input sections to output
3008	     sections.  The linker does that before
3009	     adjust_dynamic_symbol is called, and it is that
3010	     function which decides whether anything needs to go
3011	     into these sections.  */
3012
3013	  s->flags |= SEC_EXCLUDE;
3014	  continue;
3015	}
3016
3017      if ((s->flags & SEC_HAS_CONTENTS) == 0)
3018	continue;
3019
3020      /* Allocate memory for the section contents.  We use bfd_zalloc
3021	 here in case unused entries are not reclaimed before the
3022	 section's contents are written out.  This should not happen,
3023	 but this way if it does, we get a R_X86_64_NONE reloc instead
3024	 of garbage.  */
3025      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
3026      if (s->contents == NULL)
3027	return FALSE;
3028    }
3029
3030  if (htab->plt_eh_frame != NULL
3031      && htab->plt_eh_frame->contents != NULL)
3032    {
3033      const struct elf_x86_64_backend_data *arch_data
3034	= get_elf_x86_64_arch_data (bed);
3035
3036      memcpy (htab->plt_eh_frame->contents,
3037	      arch_data->eh_frame_plt, htab->plt_eh_frame->size);
3038      bfd_put_32 (dynobj, htab->elf.splt->size,
3039		  htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
3040    }
3041
3042  if (htab->elf.dynamic_sections_created)
3043    {
3044      /* Add some entries to the .dynamic section.  We fill in the
3045	 values later, in elf_x86_64_finish_dynamic_sections, but we
3046	 must add the entries now so that we get the correct size for
3047	 the .dynamic section.	The DT_DEBUG entry is filled in by the
3048	 dynamic linker and used by the debugger.  */
3049#define add_dynamic_entry(TAG, VAL) \
3050  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3051
3052      if (info->executable)
3053	{
3054	  if (!add_dynamic_entry (DT_DEBUG, 0))
3055	    return FALSE;
3056	}
3057
3058      if (htab->elf.splt->size != 0)
3059	{
3060	  if (!add_dynamic_entry (DT_PLTGOT, 0)
3061	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
3062	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3063	      || !add_dynamic_entry (DT_JMPREL, 0))
3064	    return FALSE;
3065
3066	  if (htab->tlsdesc_plt
3067	      && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
3068		  || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
3069	    return FALSE;
3070	}
3071
3072      if (relocs)
3073	{
3074	  if (!add_dynamic_entry (DT_RELA, 0)
3075	      || !add_dynamic_entry (DT_RELASZ, 0)
3076	      || !add_dynamic_entry (DT_RELAENT, bed->s->sizeof_rela))
3077	    return FALSE;
3078
3079	  /* If any dynamic relocs apply to a read-only section,
3080	     then we need a DT_TEXTREL entry.  */
3081	  if ((info->flags & DF_TEXTREL) == 0)
3082	    elf_link_hash_traverse (&htab->elf,
3083				    elf_x86_64_readonly_dynrelocs,
3084				    info);
3085
3086	  if ((info->flags & DF_TEXTREL) != 0)
3087	    {
3088	      if (!add_dynamic_entry (DT_TEXTREL, 0))
3089		return FALSE;
3090	    }
3091	}
3092    }
3093#undef add_dynamic_entry
3094
3095  return TRUE;
3096}
3097
3098static bfd_boolean
3099elf_x86_64_always_size_sections (bfd *output_bfd,
3100				 struct bfd_link_info *info)
3101{
3102  asection *tls_sec = elf_hash_table (info)->tls_sec;
3103
3104  if (tls_sec)
3105    {
3106      struct elf_link_hash_entry *tlsbase;
3107
3108      tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3109				      "_TLS_MODULE_BASE_",
3110				      FALSE, FALSE, FALSE);
3111
3112      if (tlsbase && tlsbase->type == STT_TLS)
3113	{
3114	  struct elf_x86_64_link_hash_table *htab;
3115	  struct bfd_link_hash_entry *bh = NULL;
3116	  const struct elf_backend_data *bed
3117	    = get_elf_backend_data (output_bfd);
3118
3119	  htab = elf_x86_64_hash_table (info);
3120	  if (htab == NULL)
3121	    return FALSE;
3122
3123	  if (!(_bfd_generic_link_add_one_symbol
3124		(info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3125		 tls_sec, 0, NULL, FALSE,
3126		 bed->collect, &bh)))
3127	    return FALSE;
3128
3129	  htab->tls_module_base = bh;
3130
3131	  tlsbase = (struct elf_link_hash_entry *)bh;
3132	  tlsbase->def_regular = 1;
3133	  tlsbase->other = STV_HIDDEN;
3134	  (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3135	}
3136    }
3137
3138  return TRUE;
3139}
3140
3141/* _TLS_MODULE_BASE_ needs to be treated especially when linking
3142   executables.  Rather than setting it to the beginning of the TLS
3143   section, we have to set it to the end.  This function may be called
3144   multiple times, it is idempotent.  */
3145
3146static void
3147elf_x86_64_set_tls_module_base (struct bfd_link_info *info)
3148{
3149  struct elf_x86_64_link_hash_table *htab;
3150  struct bfd_link_hash_entry *base;
3151
3152  if (!info->executable)
3153    return;
3154
3155  htab = elf_x86_64_hash_table (info);
3156  if (htab == NULL)
3157    return;
3158
3159  base = htab->tls_module_base;
3160  if (base == NULL)
3161    return;
3162
3163  base->u.def.value = htab->elf.tls_size;
3164}
3165
3166/* Return the base VMA address which should be subtracted from real addresses
3167   when resolving @dtpoff relocation.
3168   This is PT_TLS segment p_vaddr.  */
3169
3170static bfd_vma
3171elf_x86_64_dtpoff_base (struct bfd_link_info *info)
3172{
3173  /* If tls_sec is NULL, we should have signalled an error already.  */
3174  if (elf_hash_table (info)->tls_sec == NULL)
3175    return 0;
3176  return elf_hash_table (info)->tls_sec->vma;
3177}
3178
3179/* Return the relocation value for @tpoff relocation
3180   if STT_TLS virtual address is ADDRESS.  */
3181
3182static bfd_vma
3183elf_x86_64_tpoff (struct bfd_link_info *info, bfd_vma address)
3184{
3185  struct elf_link_hash_table *htab = elf_hash_table (info);
3186  const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3187  bfd_vma static_tls_size;
3188
3189  /* If tls_segment is NULL, we should have signalled an error already.  */
3190  if (htab->tls_sec == NULL)
3191    return 0;
3192
3193  /* Consider special static TLS alignment requirements.  */
3194  static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3195  return address - static_tls_size - htab->tls_sec->vma;
3196}
3197
3198/* Is the instruction before OFFSET in CONTENTS a 32bit relative
3199   branch?  */
3200
3201static bfd_boolean
3202is_32bit_relative_branch (bfd_byte *contents, bfd_vma offset)
3203{
3204  /* Opcode		Instruction
3205     0xe8		call
3206     0xe9		jump
3207     0x0f 0x8x		conditional jump */
3208  return ((offset > 0
3209	   && (contents [offset - 1] == 0xe8
3210	       || contents [offset - 1] == 0xe9))
3211	  || (offset > 1
3212	      && contents [offset - 2] == 0x0f
3213	      && (contents [offset - 1] & 0xf0) == 0x80));
3214}
3215
3216/* Relocate an x86_64 ELF section.  */
3217
3218static bfd_boolean
3219elf_x86_64_relocate_section (bfd *output_bfd,
3220			     struct bfd_link_info *info,
3221			     bfd *input_bfd,
3222			     asection *input_section,
3223			     bfd_byte *contents,
3224			     Elf_Internal_Rela *relocs,
3225			     Elf_Internal_Sym *local_syms,
3226			     asection **local_sections)
3227{
3228  struct elf_x86_64_link_hash_table *htab;
3229  Elf_Internal_Shdr *symtab_hdr;
3230  struct elf_link_hash_entry **sym_hashes;
3231  bfd_vma *local_got_offsets;
3232  bfd_vma *local_tlsdesc_gotents;
3233  Elf_Internal_Rela *rel;
3234  Elf_Internal_Rela *relend;
3235  const unsigned int plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
3236
3237  BFD_ASSERT (is_x86_64_elf (input_bfd));
3238
3239  htab = elf_x86_64_hash_table (info);
3240  if (htab == NULL)
3241    return FALSE;
3242  symtab_hdr = &elf_symtab_hdr (input_bfd);
3243  sym_hashes = elf_sym_hashes (input_bfd);
3244  local_got_offsets = elf_local_got_offsets (input_bfd);
3245  local_tlsdesc_gotents = elf_x86_64_local_tlsdesc_gotent (input_bfd);
3246
3247  elf_x86_64_set_tls_module_base (info);
3248
3249  rel = relocs;
3250  relend = relocs + input_section->reloc_count;
3251  for (; rel < relend; rel++)
3252    {
3253      unsigned int r_type;
3254      reloc_howto_type *howto;
3255      unsigned long r_symndx;
3256      struct elf_link_hash_entry *h;
3257      Elf_Internal_Sym *sym;
3258      asection *sec;
3259      bfd_vma off, offplt;
3260      bfd_vma relocation;
3261      bfd_boolean unresolved_reloc;
3262      bfd_reloc_status_type r;
3263      int tls_type;
3264      asection *base_got;
3265      bfd_vma st_size;
3266
3267      r_type = ELF32_R_TYPE (rel->r_info);
3268      if (r_type == (int) R_X86_64_GNU_VTINHERIT
3269	  || r_type == (int) R_X86_64_GNU_VTENTRY)
3270	continue;
3271
3272      if (r_type >= (int) R_X86_64_standard)
3273	{
3274	  (*_bfd_error_handler)
3275	    (_("%B: unrecognized relocation (0x%x) in section `%A'"),
3276	     input_bfd, input_section, r_type);
3277	  bfd_set_error (bfd_error_bad_value);
3278	  return FALSE;
3279	}
3280
3281      if (r_type != (int) R_X86_64_32
3282	  || ABI_64_P (output_bfd))
3283	howto = x86_64_elf_howto_table + r_type;
3284      else
3285	howto = (x86_64_elf_howto_table
3286		 + ARRAY_SIZE (x86_64_elf_howto_table) - 1);
3287      r_symndx = htab->r_sym (rel->r_info);
3288      h = NULL;
3289      sym = NULL;
3290      sec = NULL;
3291      unresolved_reloc = FALSE;
3292      if (r_symndx < symtab_hdr->sh_info)
3293	{
3294	  sym = local_syms + r_symndx;
3295	  sec = local_sections[r_symndx];
3296
3297	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym,
3298						&sec, rel);
3299	  st_size = sym->st_size;
3300
3301	  /* Relocate against local STT_GNU_IFUNC symbol.  */
3302	  if (!info->relocatable
3303	      && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3304	    {
3305	      h = elf_x86_64_get_local_sym_hash (htab, input_bfd,
3306						 rel, FALSE);
3307	      if (h == NULL)
3308		abort ();
3309
3310	      /* Set STT_GNU_IFUNC symbol value.  */
3311	      h->root.u.def.value = sym->st_value;
3312	      h->root.u.def.section = sec;
3313	    }
3314	}
3315      else
3316	{
3317	  bfd_boolean warned ATTRIBUTE_UNUSED;
3318	  bfd_boolean ignored ATTRIBUTE_UNUSED;
3319
3320	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3321				   r_symndx, symtab_hdr, sym_hashes,
3322				   h, sec, relocation,
3323				   unresolved_reloc, warned, ignored);
3324	  st_size = h->size;
3325	}
3326
3327      if (sec != NULL && discarded_section (sec))
3328	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3329					 rel, 1, relend, howto, 0, contents);
3330
3331      if (info->relocatable)
3332	continue;
3333
3334      if (rel->r_addend == 0 && !ABI_64_P (output_bfd))
3335	{
3336	  if (r_type == R_X86_64_64)
3337	    {
3338	      /* For x32, treat R_X86_64_64 like R_X86_64_32 and
3339		 zero-extend it to 64bit if addend is zero.  */
3340	      r_type = R_X86_64_32;
3341	      memset (contents + rel->r_offset + 4, 0, 4);
3342	    }
3343	  else if (r_type == R_X86_64_SIZE64)
3344	    {
3345	      /* For x32, treat R_X86_64_SIZE64 like R_X86_64_SIZE32 and
3346		 zero-extend it to 64bit if addend is zero.  */
3347	      r_type = R_X86_64_SIZE32;
3348	      memset (contents + rel->r_offset + 4, 0, 4);
3349	    }
3350	}
3351
3352      /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
3353	 it here if it is defined in a non-shared object.  */
3354      if (h != NULL
3355	  && h->type == STT_GNU_IFUNC
3356	  && h->def_regular)
3357	{
3358	  asection *plt;
3359	  bfd_vma plt_index;
3360	  const char *name;
3361
3362	  if ((input_section->flags & SEC_ALLOC) == 0
3363	      || h->plt.offset == (bfd_vma) -1)
3364	    abort ();
3365
3366	  /* STT_GNU_IFUNC symbol must go through PLT.  */
3367	  plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
3368	  relocation = (plt->output_section->vma
3369			+ plt->output_offset + h->plt.offset);
3370
3371	  switch (r_type)
3372	    {
3373	    default:
3374	      if (h->root.root.string)
3375		name = h->root.root.string;
3376	      else
3377		name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3378					 NULL);
3379	      (*_bfd_error_handler)
3380		(_("%B: relocation %s against STT_GNU_IFUNC "
3381		   "symbol `%s' isn't handled by %s"), input_bfd,
3382		 x86_64_elf_howto_table[r_type].name,
3383		 name, __FUNCTION__);
3384	      bfd_set_error (bfd_error_bad_value);
3385	      return FALSE;
3386
3387	    case R_X86_64_32S:
3388	      if (info->shared)
3389		abort ();
3390	      goto do_relocation;
3391
3392	    case R_X86_64_32:
3393	      if (ABI_64_P (output_bfd))
3394		goto do_relocation;
3395	      /* FALLTHROUGH */
3396	    case R_X86_64_64:
3397	      if (rel->r_addend != 0)
3398		{
3399		  if (h->root.root.string)
3400		    name = h->root.root.string;
3401		  else
3402		    name = bfd_elf_sym_name (input_bfd, symtab_hdr,
3403					     sym, NULL);
3404		  (*_bfd_error_handler)
3405		    (_("%B: relocation %s against STT_GNU_IFUNC "
3406		       "symbol `%s' has non-zero addend: %d"),
3407		     input_bfd, x86_64_elf_howto_table[r_type].name,
3408		     name, rel->r_addend);
3409		  bfd_set_error (bfd_error_bad_value);
3410		  return FALSE;
3411		}
3412
3413	      /* Generate dynamic relcoation only when there is a
3414		 non-GOT reference in a shared object.  */
3415	      if (info->shared && h->non_got_ref)
3416		{
3417		  Elf_Internal_Rela outrel;
3418		  asection *sreloc;
3419
3420		  /* Need a dynamic relocation to get the real function
3421		     address.  */
3422		  outrel.r_offset = _bfd_elf_section_offset (output_bfd,
3423							     info,
3424							     input_section,
3425							     rel->r_offset);
3426		  if (outrel.r_offset == (bfd_vma) -1
3427		      || outrel.r_offset == (bfd_vma) -2)
3428		    abort ();
3429
3430		  outrel.r_offset += (input_section->output_section->vma
3431				      + input_section->output_offset);
3432
3433		  if (h->dynindx == -1
3434		      || h->forced_local
3435		      || info->executable)
3436		    {
3437		      /* This symbol is resolved locally.  */
3438		      outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
3439		      outrel.r_addend = (h->root.u.def.value
3440					 + h->root.u.def.section->output_section->vma
3441					 + h->root.u.def.section->output_offset);
3442		    }
3443		  else
3444		    {
3445		      outrel.r_info = htab->r_info (h->dynindx, r_type);
3446		      outrel.r_addend = 0;
3447		    }
3448
3449		  sreloc = htab->elf.irelifunc;
3450		  elf_append_rela (output_bfd, sreloc, &outrel);
3451
3452		  /* If this reloc is against an external symbol, we
3453		     do not want to fiddle with the addend.  Otherwise,
3454		     we need to include the symbol value so that it
3455		     becomes an addend for the dynamic reloc.  For an
3456		     internal symbol, we have updated addend.  */
3457		  continue;
3458		}
3459	      /* FALLTHROUGH */
3460	    case R_X86_64_PC32:
3461	    case R_X86_64_PC32_BND:
3462	    case R_X86_64_PC64:
3463	    case R_X86_64_PLT32:
3464	    case R_X86_64_PLT32_BND:
3465	      goto do_relocation;
3466
3467	    case R_X86_64_GOTPCREL:
3468	    case R_X86_64_GOTPCREL64:
3469	      base_got = htab->elf.sgot;
3470	      off = h->got.offset;
3471
3472	      if (base_got == NULL)
3473		abort ();
3474
3475	      if (off == (bfd_vma) -1)
3476		{
3477		  /* We can't use h->got.offset here to save state, or
3478		     even just remember the offset, as finish_dynamic_symbol
3479		     would use that as offset into .got.  */
3480
3481		  if (htab->elf.splt != NULL)
3482		    {
3483		      plt_index = h->plt.offset / plt_entry_size - 1;
3484		      off = (plt_index + 3) * GOT_ENTRY_SIZE;
3485		      base_got = htab->elf.sgotplt;
3486		    }
3487		  else
3488		    {
3489		      plt_index = h->plt.offset / plt_entry_size;
3490		      off = plt_index * GOT_ENTRY_SIZE;
3491		      base_got = htab->elf.igotplt;
3492		    }
3493
3494		  if (h->dynindx == -1
3495		      || h->forced_local
3496		      || info->symbolic)
3497		    {
3498		      /* This references the local defitionion.  We must
3499			 initialize this entry in the global offset table.
3500			 Since the offset must always be a multiple of 8,
3501			 we use the least significant bit to record
3502			 whether we have initialized it already.
3503
3504			 When doing a dynamic link, we create a .rela.got
3505			 relocation entry to initialize the value.  This
3506			 is done in the finish_dynamic_symbol routine.	 */
3507		      if ((off & 1) != 0)
3508			off &= ~1;
3509		      else
3510			{
3511			  bfd_put_64 (output_bfd, relocation,
3512				      base_got->contents + off);
3513			  /* Note that this is harmless for the GOTPLT64
3514			     case, as -1 | 1 still is -1.  */
3515			  h->got.offset |= 1;
3516			}
3517		    }
3518		}
3519
3520	      relocation = (base_got->output_section->vma
3521			    + base_got->output_offset + off);
3522
3523	      goto do_relocation;
3524	    }
3525	}
3526
3527      /* When generating a shared object, the relocations handled here are
3528	 copied into the output file to be resolved at run time.  */
3529      switch (r_type)
3530	{
3531	case R_X86_64_GOT32:
3532	case R_X86_64_GOT64:
3533	  /* Relocation is to the entry for this symbol in the global
3534	     offset table.  */
3535	case R_X86_64_GOTPCREL:
3536	case R_X86_64_GOTPCREL64:
3537	  /* Use global offset table entry as symbol value.  */
3538	case R_X86_64_GOTPLT64:
3539	  /* This is the same as GOT64 for relocation purposes, but
3540	     indicates the existence of a PLT entry.  The difficulty is,
3541	     that we must calculate the GOT slot offset from the PLT
3542	     offset, if this symbol got a PLT entry (it was global).
3543	     Additionally if it's computed from the PLT entry, then that
3544	     GOT offset is relative to .got.plt, not to .got.  */
3545	  base_got = htab->elf.sgot;
3546
3547	  if (htab->elf.sgot == NULL)
3548	    abort ();
3549
3550	  if (h != NULL)
3551	    {
3552	      bfd_boolean dyn;
3553
3554	      off = h->got.offset;
3555	      if (h->needs_plt
3556		  && h->plt.offset != (bfd_vma)-1
3557		  && off == (bfd_vma)-1)
3558		{
3559		  /* We can't use h->got.offset here to save
3560		     state, or even just remember the offset, as
3561		     finish_dynamic_symbol would use that as offset into
3562		     .got.  */
3563		  bfd_vma plt_index = h->plt.offset / plt_entry_size - 1;
3564		  off = (plt_index + 3) * GOT_ENTRY_SIZE;
3565		  base_got = htab->elf.sgotplt;
3566		}
3567
3568	      dyn = htab->elf.dynamic_sections_created;
3569
3570	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3571		  || (info->shared
3572		      && SYMBOL_REFERENCES_LOCAL (info, h))
3573		  || (ELF_ST_VISIBILITY (h->other)
3574		      && h->root.type == bfd_link_hash_undefweak))
3575		{
3576		  /* This is actually a static link, or it is a -Bsymbolic
3577		     link and the symbol is defined locally, or the symbol
3578		     was forced to be local because of a version file.	We
3579		     must initialize this entry in the global offset table.
3580		     Since the offset must always be a multiple of 8, we
3581		     use the least significant bit to record whether we
3582		     have initialized it already.
3583
3584		     When doing a dynamic link, we create a .rela.got
3585		     relocation entry to initialize the value.	This is
3586		     done in the finish_dynamic_symbol routine.	 */
3587		  if ((off & 1) != 0)
3588		    off &= ~1;
3589		  else
3590		    {
3591		      bfd_put_64 (output_bfd, relocation,
3592				  base_got->contents + off);
3593		      /* Note that this is harmless for the GOTPLT64 case,
3594			 as -1 | 1 still is -1.  */
3595		      h->got.offset |= 1;
3596		    }
3597		}
3598	      else
3599		unresolved_reloc = FALSE;
3600	    }
3601	  else
3602	    {
3603	      if (local_got_offsets == NULL)
3604		abort ();
3605
3606	      off = local_got_offsets[r_symndx];
3607
3608	      /* The offset must always be a multiple of 8.  We use
3609		 the least significant bit to record whether we have
3610		 already generated the necessary reloc.	 */
3611	      if ((off & 1) != 0)
3612		off &= ~1;
3613	      else
3614		{
3615		  bfd_put_64 (output_bfd, relocation,
3616			      base_got->contents + off);
3617
3618		  if (info->shared)
3619		    {
3620		      asection *s;
3621		      Elf_Internal_Rela outrel;
3622
3623		      /* We need to generate a R_X86_64_RELATIVE reloc
3624			 for the dynamic linker.  */
3625		      s = htab->elf.srelgot;
3626		      if (s == NULL)
3627			abort ();
3628
3629		      outrel.r_offset = (base_got->output_section->vma
3630					 + base_got->output_offset
3631					 + off);
3632		      outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
3633		      outrel.r_addend = relocation;
3634		      elf_append_rela (output_bfd, s, &outrel);
3635		    }
3636
3637		  local_got_offsets[r_symndx] |= 1;
3638		}
3639	    }
3640
3641	  if (off >= (bfd_vma) -2)
3642	    abort ();
3643
3644	  relocation = base_got->output_section->vma
3645		       + base_got->output_offset + off;
3646	  if (r_type != R_X86_64_GOTPCREL && r_type != R_X86_64_GOTPCREL64)
3647	    relocation -= htab->elf.sgotplt->output_section->vma
3648			  - htab->elf.sgotplt->output_offset;
3649
3650	  break;
3651
3652	case R_X86_64_GOTOFF64:
3653	  /* Relocation is relative to the start of the global offset
3654	     table.  */
3655
3656	  /* Check to make sure it isn't a protected function symbol
3657	     for shared library since it may not be local when used
3658	     as function address.  */
3659	  if (!info->executable
3660	      && h
3661	      && !SYMBOLIC_BIND (info, h)
3662	      && h->def_regular
3663	      && h->type == STT_FUNC
3664	      && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
3665	    {
3666	      (*_bfd_error_handler)
3667		(_("%B: relocation R_X86_64_GOTOFF64 against protected function `%s' can not be used when making a shared object"),
3668		 input_bfd, h->root.root.string);
3669	      bfd_set_error (bfd_error_bad_value);
3670	      return FALSE;
3671	    }
3672
3673	  /* Note that sgot is not involved in this
3674	     calculation.  We always want the start of .got.plt.  If we
3675	     defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
3676	     permitted by the ABI, we might have to change this
3677	     calculation.  */
3678	  relocation -= htab->elf.sgotplt->output_section->vma
3679			+ htab->elf.sgotplt->output_offset;
3680	  break;
3681
3682	case R_X86_64_GOTPC32:
3683	case R_X86_64_GOTPC64:
3684	  /* Use global offset table as symbol value.  */
3685	  relocation = htab->elf.sgotplt->output_section->vma
3686		       + htab->elf.sgotplt->output_offset;
3687	  unresolved_reloc = FALSE;
3688	  break;
3689
3690	case R_X86_64_PLTOFF64:
3691	  /* Relocation is PLT entry relative to GOT.  For local
3692	     symbols it's the symbol itself relative to GOT.  */
3693	  if (h != NULL
3694	      /* See PLT32 handling.  */
3695	      && h->plt.offset != (bfd_vma) -1
3696	      && htab->elf.splt != NULL)
3697	    {
3698	      relocation = (htab->elf.splt->output_section->vma
3699			    + htab->elf.splt->output_offset
3700			    + h->plt.offset);
3701	      unresolved_reloc = FALSE;
3702	    }
3703
3704	  relocation -= htab->elf.sgotplt->output_section->vma
3705			+ htab->elf.sgotplt->output_offset;
3706	  break;
3707
3708	case R_X86_64_PLT32:
3709	case R_X86_64_PLT32_BND:
3710	  /* Relocation is to the entry for this symbol in the
3711	     procedure linkage table.  */
3712
3713	  /* Resolve a PLT32 reloc against a local symbol directly,
3714	     without using the procedure linkage table.	 */
3715	  if (h == NULL)
3716	    break;
3717
3718	  if (h->plt.offset == (bfd_vma) -1
3719	      || htab->elf.splt == NULL)
3720	    {
3721	      /* We didn't make a PLT entry for this symbol.  This
3722		 happens when statically linking PIC code, or when
3723		 using -Bsymbolic.  */
3724	      break;
3725	    }
3726
3727	  relocation = (htab->elf.splt->output_section->vma
3728			+ htab->elf.splt->output_offset
3729			+ h->plt.offset);
3730	  unresolved_reloc = FALSE;
3731	  break;
3732
3733	case R_X86_64_SIZE32:
3734	case R_X86_64_SIZE64:
3735	  /* Set to symbol size.  */
3736	  relocation = st_size;
3737	  goto direct;
3738
3739	case R_X86_64_PC8:
3740	case R_X86_64_PC16:
3741	case R_X86_64_PC32:
3742	case R_X86_64_PC32_BND:
3743	  if (info->shared
3744	      && (input_section->flags & SEC_ALLOC) != 0
3745	      && (input_section->flags & SEC_READONLY) != 0
3746	      && h != NULL)
3747	    {
3748	      bfd_boolean fail = FALSE;
3749	      bfd_boolean branch
3750		= ((r_type == R_X86_64_PC32
3751		    || r_type == R_X86_64_PC32_BND)
3752		   && is_32bit_relative_branch (contents, rel->r_offset));
3753
3754	      if (SYMBOL_REFERENCES_LOCAL (info, h))
3755		{
3756		  /* Symbol is referenced locally.  Make sure it is
3757		     defined locally or for a branch.  */
3758		  fail = !h->def_regular && !branch;
3759		}
3760	      else
3761		{
3762		  /* Symbol isn't referenced locally.  We only allow
3763		     branch to symbol with non-default visibility. */
3764		  fail = (!branch
3765			  || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT);
3766		}
3767
3768	      if (fail)
3769		{
3770		  const char *fmt;
3771		  const char *v;
3772		  const char *pic = "";
3773
3774		  switch (ELF_ST_VISIBILITY (h->other))
3775		    {
3776		    case STV_HIDDEN:
3777		      v = _("hidden symbol");
3778		      break;
3779		    case STV_INTERNAL:
3780		      v = _("internal symbol");
3781		      break;
3782		    case STV_PROTECTED:
3783		      v = _("protected symbol");
3784		      break;
3785		    default:
3786		      v = _("symbol");
3787		      pic = _("; recompile with -fPIC");
3788		      break;
3789		    }
3790
3791		  if (h->def_regular)
3792		    fmt = _("%B: relocation %s against %s `%s' can not be used when making a shared object%s");
3793		  else
3794		    fmt = _("%B: relocation %s against undefined %s `%s' can not be used when making a shared object%s");
3795
3796		  (*_bfd_error_handler) (fmt, input_bfd,
3797					 x86_64_elf_howto_table[r_type].name,
3798					 v,  h->root.root.string, pic);
3799		  bfd_set_error (bfd_error_bad_value);
3800		  return FALSE;
3801		}
3802	    }
3803	  /* Fall through.  */
3804
3805	case R_X86_64_8:
3806	case R_X86_64_16:
3807	case R_X86_64_32:
3808	case R_X86_64_PC64:
3809	case R_X86_64_64:
3810	  /* FIXME: The ABI says the linker should make sure the value is
3811	     the same when it's zeroextended to 64 bit.	 */
3812
3813direct:
3814	  if ((input_section->flags & SEC_ALLOC) == 0)
3815	    break;
3816
3817	  if ((info->shared
3818	       && (h == NULL
3819		   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3820		   || h->root.type != bfd_link_hash_undefweak)
3821	       && ((! IS_X86_64_PCREL_TYPE (r_type)
3822		      && r_type != R_X86_64_SIZE32
3823		      && r_type != R_X86_64_SIZE64)
3824		   || ! SYMBOL_CALLS_LOCAL (info, h)))
3825	      || (ELIMINATE_COPY_RELOCS
3826		  && !info->shared
3827		  && h != NULL
3828		  && h->dynindx != -1
3829		  && !h->non_got_ref
3830		  && ((h->def_dynamic
3831		       && !h->def_regular)
3832		      || h->root.type == bfd_link_hash_undefweak
3833		      || h->root.type == bfd_link_hash_undefined)))
3834	    {
3835	      Elf_Internal_Rela outrel;
3836	      bfd_boolean skip, relocate;
3837	      asection *sreloc;
3838
3839	      /* When generating a shared object, these relocations
3840		 are copied into the output file to be resolved at run
3841		 time.	*/
3842	      skip = FALSE;
3843	      relocate = FALSE;
3844
3845	      outrel.r_offset =
3846		_bfd_elf_section_offset (output_bfd, info, input_section,
3847					 rel->r_offset);
3848	      if (outrel.r_offset == (bfd_vma) -1)
3849		skip = TRUE;
3850	      else if (outrel.r_offset == (bfd_vma) -2)
3851		skip = TRUE, relocate = TRUE;
3852
3853	      outrel.r_offset += (input_section->output_section->vma
3854				  + input_section->output_offset);
3855
3856	      if (skip)
3857		memset (&outrel, 0, sizeof outrel);
3858
3859	      /* h->dynindx may be -1 if this symbol was marked to
3860		 become local.  */
3861	      else if (h != NULL
3862		       && h->dynindx != -1
3863		       && (IS_X86_64_PCREL_TYPE (r_type)
3864			   || ! info->shared
3865			   || ! SYMBOLIC_BIND (info, h)
3866			   || ! h->def_regular))
3867		{
3868		  outrel.r_info = htab->r_info (h->dynindx, r_type);
3869		  outrel.r_addend = rel->r_addend;
3870		}
3871	      else
3872		{
3873		  /* This symbol is local, or marked to become local.  */
3874		  if (r_type == htab->pointer_r_type)
3875		    {
3876		      relocate = TRUE;
3877		      outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
3878		      outrel.r_addend = relocation + rel->r_addend;
3879		    }
3880		  else if (r_type == R_X86_64_64
3881			   && !ABI_64_P (output_bfd))
3882		    {
3883		      relocate = TRUE;
3884		      outrel.r_info = htab->r_info (0,
3885						    R_X86_64_RELATIVE64);
3886		      outrel.r_addend = relocation + rel->r_addend;
3887		      /* Check addend overflow.  */
3888		      if ((outrel.r_addend & 0x80000000)
3889			  != (rel->r_addend & 0x80000000))
3890			{
3891			  const char *name;
3892			  int addend = rel->r_addend;
3893			  if (h && h->root.root.string)
3894			    name = h->root.root.string;
3895			  else
3896			    name = bfd_elf_sym_name (input_bfd, symtab_hdr,
3897						     sym, NULL);
3898			  if (addend < 0)
3899			    (*_bfd_error_handler)
3900			      (_("%B: addend -0x%x in relocation %s against "
3901				 "symbol `%s' at 0x%lx in section `%A' is "
3902				 "out of range"),
3903			       input_bfd, input_section, addend,
3904			       x86_64_elf_howto_table[r_type].name,
3905			       name, (unsigned long) rel->r_offset);
3906			  else
3907			    (*_bfd_error_handler)
3908			      (_("%B: addend 0x%x in relocation %s against "
3909				 "symbol `%s' at 0x%lx in section `%A' is "
3910				 "out of range"),
3911			       input_bfd, input_section, addend,
3912			       x86_64_elf_howto_table[r_type].name,
3913			       name, (unsigned long) rel->r_offset);
3914			  bfd_set_error (bfd_error_bad_value);
3915			  return FALSE;
3916			}
3917		    }
3918		  else
3919		    {
3920		      long sindx;
3921
3922		      if (bfd_is_abs_section (sec))
3923			sindx = 0;
3924		      else if (sec == NULL || sec->owner == NULL)
3925			{
3926			  bfd_set_error (bfd_error_bad_value);
3927			  return FALSE;
3928			}
3929		      else
3930			{
3931			  asection *osec;
3932
3933			  /* We are turning this relocation into one
3934			     against a section symbol.  It would be
3935			     proper to subtract the symbol's value,
3936			     osec->vma, from the emitted reloc addend,
3937			     but ld.so expects buggy relocs.  */
3938			  osec = sec->output_section;
3939			  sindx = elf_section_data (osec)->dynindx;
3940			  if (sindx == 0)
3941			    {
3942			      asection *oi = htab->elf.text_index_section;
3943			      sindx = elf_section_data (oi)->dynindx;
3944			    }
3945			  BFD_ASSERT (sindx != 0);
3946			}
3947
3948		      outrel.r_info = htab->r_info (sindx, r_type);
3949		      outrel.r_addend = relocation + rel->r_addend;
3950		    }
3951		}
3952
3953	      sreloc = elf_section_data (input_section)->sreloc;
3954
3955	      if (sreloc == NULL || sreloc->contents == NULL)
3956		{
3957		  r = bfd_reloc_notsupported;
3958		  goto check_relocation_error;
3959		}
3960
3961	      elf_append_rela (output_bfd, sreloc, &outrel);
3962
3963	      /* If this reloc is against an external symbol, we do
3964		 not want to fiddle with the addend.  Otherwise, we
3965		 need to include the symbol value so that it becomes
3966		 an addend for the dynamic reloc.  */
3967	      if (! relocate)
3968		continue;
3969	    }
3970
3971	  break;
3972
3973	case R_X86_64_TLSGD:
3974	case R_X86_64_GOTPC32_TLSDESC:
3975	case R_X86_64_TLSDESC_CALL:
3976	case R_X86_64_GOTTPOFF:
3977	  tls_type = GOT_UNKNOWN;
3978	  if (h == NULL && local_got_offsets)
3979	    tls_type = elf_x86_64_local_got_tls_type (input_bfd) [r_symndx];
3980	  else if (h != NULL)
3981	    tls_type = elf_x86_64_hash_entry (h)->tls_type;
3982
3983	  if (! elf_x86_64_tls_transition (info, input_bfd,
3984					   input_section, contents,
3985					   symtab_hdr, sym_hashes,
3986					   &r_type, tls_type, rel,
3987					   relend, h, r_symndx))
3988	    return FALSE;
3989
3990	  if (r_type == R_X86_64_TPOFF32)
3991	    {
3992	      bfd_vma roff = rel->r_offset;
3993
3994	      BFD_ASSERT (! unresolved_reloc);
3995
3996	      if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
3997		{
3998		  /* GD->LE transition.  For 64bit, change
3999		     .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4000		     .word 0x6666; rex64; call __tls_get_addr
4001		     into:
4002		     movq %fs:0, %rax
4003		     leaq foo@tpoff(%rax), %rax
4004		     For 32bit, change
4005		     leaq foo@tlsgd(%rip), %rdi
4006		     .word 0x6666; rex64; call __tls_get_addr
4007		     into:
4008		     movl %fs:0, %eax
4009		     leaq foo@tpoff(%rax), %rax
4010		     For largepic, change:
4011		     leaq foo@tlsgd(%rip), %rdi
4012		     movabsq $__tls_get_addr@pltoff, %rax
4013		     addq %rbx, %rax
4014		     call *%rax
4015		     into:
4016		     movq %fs:0, %rax
4017		     leaq foo@tpoff(%rax), %rax
4018		     nopw 0x0(%rax,%rax,1) */
4019		  int largepic = 0;
4020		  if (ABI_64_P (output_bfd)
4021		      && contents[roff + 5] == (bfd_byte) '\xb8')
4022		    {
4023		      memcpy (contents + roff - 3,
4024			      "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80"
4025			      "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
4026		      largepic = 1;
4027		    }
4028		  else if (ABI_64_P (output_bfd))
4029		    memcpy (contents + roff - 4,
4030			    "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
4031			    16);
4032		  else
4033		    memcpy (contents + roff - 3,
4034			    "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
4035			    15);
4036		  bfd_put_32 (output_bfd,
4037			      elf_x86_64_tpoff (info, relocation),
4038			      contents + roff + 8 + largepic);
4039		  /* Skip R_X86_64_PC32/R_X86_64_PLT32/R_X86_64_PLTOFF64.  */
4040		  rel++;
4041		  continue;
4042		}
4043	      else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
4044		{
4045		  /* GDesc -> LE transition.
4046		     It's originally something like:
4047		     leaq x@tlsdesc(%rip), %rax
4048
4049		     Change it to:
4050		     movl $x@tpoff, %rax.  */
4051
4052		  unsigned int val, type;
4053
4054		  type = bfd_get_8 (input_bfd, contents + roff - 3);
4055		  val = bfd_get_8 (input_bfd, contents + roff - 1);
4056		  bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
4057			     contents + roff - 3);
4058		  bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
4059		  bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4060			     contents + roff - 1);
4061		  bfd_put_32 (output_bfd,
4062			      elf_x86_64_tpoff (info, relocation),
4063			      contents + roff);
4064		  continue;
4065		}
4066	      else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
4067		{
4068		  /* GDesc -> LE transition.
4069		     It's originally:
4070		     call *(%rax)
4071		     Turn it into:
4072		     xchg %ax,%ax.  */
4073		  bfd_put_8 (output_bfd, 0x66, contents + roff);
4074		  bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4075		  continue;
4076		}
4077	      else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTTPOFF)
4078		{
4079		  /* IE->LE transition:
4080		     Originally it can be one of:
4081		     movq foo@gottpoff(%rip), %reg
4082		     addq foo@gottpoff(%rip), %reg
4083		     We change it into:
4084		     movq $foo, %reg
4085		     leaq foo(%reg), %reg
4086		     addq $foo, %reg.  */
4087
4088		  unsigned int val, type, reg;
4089
4090		  val = bfd_get_8 (input_bfd, contents + roff - 3);
4091		  type = bfd_get_8 (input_bfd, contents + roff - 2);
4092		  reg = bfd_get_8 (input_bfd, contents + roff - 1);
4093		  reg >>= 3;
4094		  if (type == 0x8b)
4095		    {
4096		      /* movq */
4097		      if (val == 0x4c)
4098			bfd_put_8 (output_bfd, 0x49,
4099				   contents + roff - 3);
4100		      else if (!ABI_64_P (output_bfd) && val == 0x44)
4101			bfd_put_8 (output_bfd, 0x41,
4102				   contents + roff - 3);
4103		      bfd_put_8 (output_bfd, 0xc7,
4104				 contents + roff - 2);
4105		      bfd_put_8 (output_bfd, 0xc0 | reg,
4106				 contents + roff - 1);
4107		    }
4108		  else if (reg == 4)
4109		    {
4110		      /* addq -> addq - addressing with %rsp/%r12 is
4111			 special  */
4112		      if (val == 0x4c)
4113			bfd_put_8 (output_bfd, 0x49,
4114				   contents + roff - 3);
4115		      else if (!ABI_64_P (output_bfd) && val == 0x44)
4116			bfd_put_8 (output_bfd, 0x41,
4117				   contents + roff - 3);
4118		      bfd_put_8 (output_bfd, 0x81,
4119				 contents + roff - 2);
4120		      bfd_put_8 (output_bfd, 0xc0 | reg,
4121				 contents + roff - 1);
4122		    }
4123		  else
4124		    {
4125		      /* addq -> leaq */
4126		      if (val == 0x4c)
4127			bfd_put_8 (output_bfd, 0x4d,
4128				   contents + roff - 3);
4129		      else if (!ABI_64_P (output_bfd) && val == 0x44)
4130			bfd_put_8 (output_bfd, 0x45,
4131				   contents + roff - 3);
4132		      bfd_put_8 (output_bfd, 0x8d,
4133				 contents + roff - 2);
4134		      bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
4135				 contents + roff - 1);
4136		    }
4137		  bfd_put_32 (output_bfd,
4138			      elf_x86_64_tpoff (info, relocation),
4139			      contents + roff);
4140		  continue;
4141		}
4142	      else
4143		BFD_ASSERT (FALSE);
4144	    }
4145
4146	  if (htab->elf.sgot == NULL)
4147	    abort ();
4148
4149	  if (h != NULL)
4150	    {
4151	      off = h->got.offset;
4152	      offplt = elf_x86_64_hash_entry (h)->tlsdesc_got;
4153	    }
4154	  else
4155	    {
4156	      if (local_got_offsets == NULL)
4157		abort ();
4158
4159	      off = local_got_offsets[r_symndx];
4160	      offplt = local_tlsdesc_gotents[r_symndx];
4161	    }
4162
4163	  if ((off & 1) != 0)
4164	    off &= ~1;
4165	  else
4166	    {
4167	      Elf_Internal_Rela outrel;
4168	      int dr_type, indx;
4169	      asection *sreloc;
4170
4171	      if (htab->elf.srelgot == NULL)
4172		abort ();
4173
4174	      indx = h && h->dynindx != -1 ? h->dynindx : 0;
4175
4176	      if (GOT_TLS_GDESC_P (tls_type))
4177		{
4178		  outrel.r_info = htab->r_info (indx, R_X86_64_TLSDESC);
4179		  BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
4180			      + 2 * GOT_ENTRY_SIZE <= htab->elf.sgotplt->size);
4181		  outrel.r_offset = (htab->elf.sgotplt->output_section->vma
4182				     + htab->elf.sgotplt->output_offset
4183				     + offplt
4184				     + htab->sgotplt_jump_table_size);
4185		  sreloc = htab->elf.srelplt;
4186		  if (indx == 0)
4187		    outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
4188		  else
4189		    outrel.r_addend = 0;
4190		  elf_append_rela (output_bfd, sreloc, &outrel);
4191		}
4192
4193	      sreloc = htab->elf.srelgot;
4194
4195	      outrel.r_offset = (htab->elf.sgot->output_section->vma
4196				 + htab->elf.sgot->output_offset + off);
4197
4198	      if (GOT_TLS_GD_P (tls_type))
4199		dr_type = R_X86_64_DTPMOD64;
4200	      else if (GOT_TLS_GDESC_P (tls_type))
4201		goto dr_done;
4202	      else
4203		dr_type = R_X86_64_TPOFF64;
4204
4205	      bfd_put_64 (output_bfd, 0, htab->elf.sgot->contents + off);
4206	      outrel.r_addend = 0;
4207	      if ((dr_type == R_X86_64_TPOFF64
4208		   || dr_type == R_X86_64_TLSDESC) && indx == 0)
4209		outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
4210	      outrel.r_info = htab->r_info (indx, dr_type);
4211
4212	      elf_append_rela (output_bfd, sreloc, &outrel);
4213
4214	      if (GOT_TLS_GD_P (tls_type))
4215		{
4216		  if (indx == 0)
4217		    {
4218		      BFD_ASSERT (! unresolved_reloc);
4219		      bfd_put_64 (output_bfd,
4220				  relocation - elf_x86_64_dtpoff_base (info),
4221				  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4222		    }
4223		  else
4224		    {
4225		      bfd_put_64 (output_bfd, 0,
4226				  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4227		      outrel.r_info = htab->r_info (indx,
4228						    R_X86_64_DTPOFF64);
4229		      outrel.r_offset += GOT_ENTRY_SIZE;
4230		      elf_append_rela (output_bfd, sreloc,
4231						&outrel);
4232		    }
4233		}
4234
4235	    dr_done:
4236	      if (h != NULL)
4237		h->got.offset |= 1;
4238	      else
4239		local_got_offsets[r_symndx] |= 1;
4240	    }
4241
4242	  if (off >= (bfd_vma) -2
4243	      && ! GOT_TLS_GDESC_P (tls_type))
4244	    abort ();
4245	  if (r_type == ELF32_R_TYPE (rel->r_info))
4246	    {
4247	      if (r_type == R_X86_64_GOTPC32_TLSDESC
4248		  || r_type == R_X86_64_TLSDESC_CALL)
4249		relocation = htab->elf.sgotplt->output_section->vma
4250		  + htab->elf.sgotplt->output_offset
4251		  + offplt + htab->sgotplt_jump_table_size;
4252	      else
4253		relocation = htab->elf.sgot->output_section->vma
4254		  + htab->elf.sgot->output_offset + off;
4255	      unresolved_reloc = FALSE;
4256	    }
4257	  else
4258	    {
4259	      bfd_vma roff = rel->r_offset;
4260
4261	      if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
4262		{
4263		  /* GD->IE transition.  For 64bit, change
4264		     .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4265		     .word 0x6666; rex64; call __tls_get_addr@plt
4266		     into:
4267		     movq %fs:0, %rax
4268		     addq foo@gottpoff(%rip), %rax
4269		     For 32bit, change
4270		     leaq foo@tlsgd(%rip), %rdi
4271		     .word 0x6666; rex64; call __tls_get_addr@plt
4272		     into:
4273		     movl %fs:0, %eax
4274		     addq foo@gottpoff(%rip), %rax
4275		     For largepic, change:
4276		     leaq foo@tlsgd(%rip), %rdi
4277		     movabsq $__tls_get_addr@pltoff, %rax
4278		     addq %rbx, %rax
4279		     call *%rax
4280		     into:
4281		     movq %fs:0, %rax
4282		     addq foo@gottpoff(%rax), %rax
4283		     nopw 0x0(%rax,%rax,1) */
4284		  int largepic = 0;
4285		  if (ABI_64_P (output_bfd)
4286		      && contents[roff + 5] == (bfd_byte) '\xb8')
4287		    {
4288		      memcpy (contents + roff - 3,
4289			      "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05"
4290			      "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
4291		      largepic = 1;
4292		    }
4293		  else if (ABI_64_P (output_bfd))
4294		    memcpy (contents + roff - 4,
4295			    "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
4296			    16);
4297		  else
4298		    memcpy (contents + roff - 3,
4299			    "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
4300			    15);
4301
4302		  relocation = (htab->elf.sgot->output_section->vma
4303				+ htab->elf.sgot->output_offset + off
4304				- roff
4305				- largepic
4306				- input_section->output_section->vma
4307				- input_section->output_offset
4308				- 12);
4309		  bfd_put_32 (output_bfd, relocation,
4310			      contents + roff + 8 + largepic);
4311		  /* Skip R_X86_64_PLT32/R_X86_64_PLTOFF64.  */
4312		  rel++;
4313		  continue;
4314		}
4315	      else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
4316		{
4317		  /* GDesc -> IE transition.
4318		     It's originally something like:
4319		     leaq x@tlsdesc(%rip), %rax
4320
4321		     Change it to:
4322		     movq x@gottpoff(%rip), %rax # before xchg %ax,%ax.  */
4323
4324		  /* Now modify the instruction as appropriate. To
4325		     turn a leaq into a movq in the form we use it, it
4326		     suffices to change the second byte from 0x8d to
4327		     0x8b.  */
4328		  bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4329
4330		  bfd_put_32 (output_bfd,
4331			      htab->elf.sgot->output_section->vma
4332			      + htab->elf.sgot->output_offset + off
4333			      - rel->r_offset
4334			      - input_section->output_section->vma
4335			      - input_section->output_offset
4336			      - 4,
4337			      contents + roff);
4338		  continue;
4339		}
4340	      else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
4341		{
4342		  /* GDesc -> IE transition.
4343		     It's originally:
4344		     call *(%rax)
4345
4346		     Change it to:
4347		     xchg %ax, %ax.  */
4348
4349		  bfd_put_8 (output_bfd, 0x66, contents + roff);
4350		  bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4351		  continue;
4352		}
4353	      else
4354		BFD_ASSERT (FALSE);
4355	    }
4356	  break;
4357
4358	case R_X86_64_TLSLD:
4359	  if (! elf_x86_64_tls_transition (info, input_bfd,
4360					   input_section, contents,
4361					   symtab_hdr, sym_hashes,
4362					   &r_type, GOT_UNKNOWN,
4363					   rel, relend, h, r_symndx))
4364	    return FALSE;
4365
4366	  if (r_type != R_X86_64_TLSLD)
4367	    {
4368	      /* LD->LE transition:
4369		 leaq foo@tlsld(%rip), %rdi; call __tls_get_addr.
4370		 For 64bit, we change it into:
4371		 .word 0x6666; .byte 0x66; movq %fs:0, %rax.
4372		 For 32bit, we change it into:
4373		 nopl 0x0(%rax); movl %fs:0, %eax.
4374		 For largepic, change:
4375		 leaq foo@tlsgd(%rip), %rdi
4376		 movabsq $__tls_get_addr@pltoff, %rax
4377		 addq %rbx, %rax
4378		 call *%rax
4379		 into:
4380		 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
4381		 movq %fs:0, %eax */
4382
4383	      BFD_ASSERT (r_type == R_X86_64_TPOFF32);
4384	      if (ABI_64_P (output_bfd)
4385		  && contents[rel->r_offset + 5] == (bfd_byte) '\xb8')
4386		memcpy (contents + rel->r_offset - 3,
4387			"\x66\x66\x66\x66\x2e\x0f\x1f\x84\0\0\0\0\0"
4388			"\x64\x48\x8b\x04\x25\0\0\0", 22);
4389	      else if (ABI_64_P (output_bfd))
4390		memcpy (contents + rel->r_offset - 3,
4391			"\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
4392	      else
4393		memcpy (contents + rel->r_offset - 3,
4394			"\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
4395	      /* Skip R_X86_64_PC32/R_X86_64_PLT32/R_X86_64_PLTOFF64.  */
4396	      rel++;
4397	      continue;
4398	    }
4399
4400	  if (htab->elf.sgot == NULL)
4401	    abort ();
4402
4403	  off = htab->tls_ld_got.offset;
4404	  if (off & 1)
4405	    off &= ~1;
4406	  else
4407	    {
4408	      Elf_Internal_Rela outrel;
4409
4410	      if (htab->elf.srelgot == NULL)
4411		abort ();
4412
4413	      outrel.r_offset = (htab->elf.sgot->output_section->vma
4414				 + htab->elf.sgot->output_offset + off);
4415
4416	      bfd_put_64 (output_bfd, 0,
4417			  htab->elf.sgot->contents + off);
4418	      bfd_put_64 (output_bfd, 0,
4419			  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4420	      outrel.r_info = htab->r_info (0, R_X86_64_DTPMOD64);
4421	      outrel.r_addend = 0;
4422	      elf_append_rela (output_bfd, htab->elf.srelgot,
4423					&outrel);
4424	      htab->tls_ld_got.offset |= 1;
4425	    }
4426	  relocation = htab->elf.sgot->output_section->vma
4427		       + htab->elf.sgot->output_offset + off;
4428	  unresolved_reloc = FALSE;
4429	  break;
4430
4431	case R_X86_64_DTPOFF32:
4432	  if (!info->executable|| (input_section->flags & SEC_CODE) == 0)
4433	    relocation -= elf_x86_64_dtpoff_base (info);
4434	  else
4435	    relocation = elf_x86_64_tpoff (info, relocation);
4436	  break;
4437
4438	case R_X86_64_TPOFF32:
4439	case R_X86_64_TPOFF64:
4440	  BFD_ASSERT (info->executable);
4441	  relocation = elf_x86_64_tpoff (info, relocation);
4442	  break;
4443
4444	case R_X86_64_DTPOFF64:
4445	  BFD_ASSERT ((input_section->flags & SEC_CODE) == 0);
4446	  relocation -= elf_x86_64_dtpoff_base (info);
4447	  break;
4448
4449	default:
4450	  break;
4451	}
4452
4453      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4454	 because such sections are not SEC_ALLOC and thus ld.so will
4455	 not process them.  */
4456      if (unresolved_reloc
4457	  && !((input_section->flags & SEC_DEBUGGING) != 0
4458	       && h->def_dynamic)
4459	  && _bfd_elf_section_offset (output_bfd, info, input_section,
4460				      rel->r_offset) != (bfd_vma) -1)
4461	{
4462	  (*_bfd_error_handler)
4463	    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
4464	     input_bfd,
4465	     input_section,
4466	     (long) rel->r_offset,
4467	     howto->name,
4468	     h->root.root.string);
4469	  return FALSE;
4470	}
4471
4472do_relocation:
4473      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4474				    contents, rel->r_offset,
4475				    relocation, rel->r_addend);
4476
4477check_relocation_error:
4478      if (r != bfd_reloc_ok)
4479	{
4480	  const char *name;
4481
4482	  if (h != NULL)
4483	    name = h->root.root.string;
4484	  else
4485	    {
4486	      name = bfd_elf_string_from_elf_section (input_bfd,
4487						      symtab_hdr->sh_link,
4488						      sym->st_name);
4489	      if (name == NULL)
4490		return FALSE;
4491	      if (*name == '\0')
4492		name = bfd_section_name (input_bfd, sec);
4493	    }
4494
4495	  if (r == bfd_reloc_overflow)
4496	    {
4497	      if (! ((*info->callbacks->reloc_overflow)
4498		     (info, (h ? &h->root : NULL), name, howto->name,
4499		      (bfd_vma) 0, input_bfd, input_section,
4500		      rel->r_offset)))
4501		return FALSE;
4502	    }
4503	  else
4504	    {
4505	      (*_bfd_error_handler)
4506		(_("%B(%A+0x%lx): reloc against `%s': error %d"),
4507		 input_bfd, input_section,
4508		 (long) rel->r_offset, name, (int) r);
4509	      return FALSE;
4510	    }
4511	}
4512    }
4513
4514  return TRUE;
4515}
4516
4517/* Finish up dynamic symbol handling.  We set the contents of various
4518   dynamic sections here.  */
4519
4520static bfd_boolean
4521elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
4522				  struct bfd_link_info *info,
4523				  struct elf_link_hash_entry *h,
4524				  Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
4525{
4526  struct elf_x86_64_link_hash_table *htab;
4527  const struct elf_x86_64_backend_data *const abed
4528    = get_elf_x86_64_backend_data (output_bfd);
4529
4530  htab = elf_x86_64_hash_table (info);
4531  if (htab == NULL)
4532    return FALSE;
4533
4534  if (h->plt.offset != (bfd_vma) -1)
4535    {
4536      bfd_vma plt_index;
4537      bfd_vma got_offset;
4538      Elf_Internal_Rela rela;
4539      bfd_byte *loc;
4540      asection *plt, *gotplt, *relplt;
4541      const struct elf_backend_data *bed;
4542
4543      /* When building a static executable, use .iplt, .igot.plt and
4544	 .rela.iplt sections for STT_GNU_IFUNC symbols.  */
4545      if (htab->elf.splt != NULL)
4546	{
4547	  plt = htab->elf.splt;
4548	  gotplt = htab->elf.sgotplt;
4549	  relplt = htab->elf.srelplt;
4550	}
4551      else
4552	{
4553	  plt = htab->elf.iplt;
4554	  gotplt = htab->elf.igotplt;
4555	  relplt = htab->elf.irelplt;
4556	}
4557
4558      /* This symbol has an entry in the procedure linkage table.  Set
4559	 it up.	 */
4560      if ((h->dynindx == -1
4561	   && !((h->forced_local || info->executable)
4562		&& h->def_regular
4563		&& h->type == STT_GNU_IFUNC))
4564	  || plt == NULL
4565	  || gotplt == NULL
4566	  || relplt == NULL)
4567	abort ();
4568
4569      /* Get the index in the procedure linkage table which
4570	 corresponds to this symbol.  This is the index of this symbol
4571	 in all the symbols for which we are making plt entries.  The
4572	 first entry in the procedure linkage table is reserved.
4573
4574	 Get the offset into the .got table of the entry that
4575	 corresponds to this function.	Each .got entry is GOT_ENTRY_SIZE
4576	 bytes. The first three are reserved for the dynamic linker.
4577
4578	 For static executables, we don't reserve anything.  */
4579
4580      if (plt == htab->elf.splt)
4581	{
4582	  got_offset = h->plt.offset / abed->plt_entry_size - 1;
4583	  got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
4584	}
4585      else
4586	{
4587	  got_offset = h->plt.offset / abed->plt_entry_size;
4588	  got_offset = got_offset * GOT_ENTRY_SIZE;
4589	}
4590
4591      /* Fill in the entry in the procedure linkage table.  */
4592      memcpy (plt->contents + h->plt.offset, abed->plt_entry,
4593	      abed->plt_entry_size);
4594
4595      /* Insert the relocation positions of the plt section.  */
4596
4597      /* Put offset the PC-relative instruction referring to the GOT entry,
4598	 subtracting the size of that instruction.  */
4599      bfd_put_32 (output_bfd,
4600		  (gotplt->output_section->vma
4601		   + gotplt->output_offset
4602		   + got_offset
4603		   - plt->output_section->vma
4604		   - plt->output_offset
4605		   - h->plt.offset
4606		   - abed->plt_got_insn_size),
4607		  plt->contents + h->plt.offset + abed->plt_got_offset);
4608
4609      /* Fill in the entry in the global offset table, initially this
4610	 points to the second part of the PLT entry.  */
4611      bfd_put_64 (output_bfd, (plt->output_section->vma
4612			       + plt->output_offset
4613			       + h->plt.offset + abed->plt_lazy_offset),
4614		  gotplt->contents + got_offset);
4615
4616      /* Fill in the entry in the .rela.plt section.  */
4617      rela.r_offset = (gotplt->output_section->vma
4618		       + gotplt->output_offset
4619		       + got_offset);
4620      if (h->dynindx == -1
4621	  || ((info->executable
4622	       || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4623	      && h->def_regular
4624	      && h->type == STT_GNU_IFUNC))
4625	{
4626	  /* If an STT_GNU_IFUNC symbol is locally defined, generate
4627	     R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT.  */
4628	  rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
4629	  rela.r_addend = (h->root.u.def.value
4630			   + h->root.u.def.section->output_section->vma
4631			   + h->root.u.def.section->output_offset);
4632	  /* R_X86_64_IRELATIVE comes last.  */
4633	  plt_index = htab->next_irelative_index--;
4634	}
4635      else
4636	{
4637	  rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
4638	  rela.r_addend = 0;
4639	  plt_index = htab->next_jump_slot_index++;
4640	}
4641
4642      /* Don't fill PLT entry for static executables.  */
4643      if (plt == htab->elf.splt)
4644	{
4645	  /* Put relocation index.  */
4646	  bfd_put_32 (output_bfd, plt_index,
4647		      plt->contents + h->plt.offset + abed->plt_reloc_offset);
4648	  /* Put offset for jmp .PLT0.  */
4649	  bfd_put_32 (output_bfd, - (h->plt.offset + abed->plt_plt_insn_end),
4650		      plt->contents + h->plt.offset + abed->plt_plt_offset);
4651	}
4652
4653      bed = get_elf_backend_data (output_bfd);
4654      loc = relplt->contents + plt_index * bed->s->sizeof_rela;
4655      bed->s->swap_reloca_out (output_bfd, &rela, loc);
4656
4657      if (!h->def_regular)
4658	{
4659	  /* Mark the symbol as undefined, rather than as defined in
4660	     the .plt section.  Leave the value if there were any
4661	     relocations where pointer equality matters (this is a clue
4662	     for the dynamic linker, to make function pointer
4663	     comparisons work between an application and shared
4664	     library), otherwise set it to zero.  If a function is only
4665	     called from a binary, there is no need to slow down
4666	     shared libraries because of that.  */
4667	  sym->st_shndx = SHN_UNDEF;
4668	  if (!h->pointer_equality_needed)
4669	    sym->st_value = 0;
4670	}
4671    }
4672
4673  if (h->got.offset != (bfd_vma) -1
4674      && ! GOT_TLS_GD_ANY_P (elf_x86_64_hash_entry (h)->tls_type)
4675      && elf_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE)
4676    {
4677      Elf_Internal_Rela rela;
4678
4679      /* This symbol has an entry in the global offset table.  Set it
4680	 up.  */
4681      if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
4682	abort ();
4683
4684      rela.r_offset = (htab->elf.sgot->output_section->vma
4685		       + htab->elf.sgot->output_offset
4686		       + (h->got.offset &~ (bfd_vma) 1));
4687
4688      /* If this is a static link, or it is a -Bsymbolic link and the
4689	 symbol is defined locally or was forced to be local because
4690	 of a version file, we just want to emit a RELATIVE reloc.
4691	 The entry in the global offset table will already have been
4692	 initialized in the relocate_section function.  */
4693      if (h->def_regular
4694	  && h->type == STT_GNU_IFUNC)
4695	{
4696	  if (info->shared)
4697	    {
4698	      /* Generate R_X86_64_GLOB_DAT.  */
4699	      goto do_glob_dat;
4700	    }
4701	  else
4702	    {
4703	      asection *plt;
4704
4705	      if (!h->pointer_equality_needed)
4706		abort ();
4707
4708	      /* For non-shared object, we can't use .got.plt, which
4709		 contains the real function addres if we need pointer
4710		 equality.  We load the GOT entry with the PLT entry.  */
4711	      plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4712	      bfd_put_64 (output_bfd, (plt->output_section->vma
4713				       + plt->output_offset
4714				       + h->plt.offset),
4715			  htab->elf.sgot->contents + h->got.offset);
4716	      return TRUE;
4717	    }
4718	}
4719      else if (info->shared
4720	       && SYMBOL_REFERENCES_LOCAL (info, h))
4721	{
4722	  if (!h->def_regular)
4723	    return FALSE;
4724	  BFD_ASSERT((h->got.offset & 1) != 0);
4725	  rela.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4726	  rela.r_addend = (h->root.u.def.value
4727			   + h->root.u.def.section->output_section->vma
4728			   + h->root.u.def.section->output_offset);
4729	}
4730      else
4731	{
4732	  BFD_ASSERT((h->got.offset & 1) == 0);
4733do_glob_dat:
4734	  bfd_put_64 (output_bfd, (bfd_vma) 0,
4735		      htab->elf.sgot->contents + h->got.offset);
4736	  rela.r_info = htab->r_info (h->dynindx, R_X86_64_GLOB_DAT);
4737	  rela.r_addend = 0;
4738	}
4739
4740      elf_append_rela (output_bfd, htab->elf.srelgot, &rela);
4741    }
4742
4743  if (h->needs_copy)
4744    {
4745      Elf_Internal_Rela rela;
4746
4747      /* This symbol needs a copy reloc.  Set it up.  */
4748
4749      if (h->dynindx == -1
4750	  || (h->root.type != bfd_link_hash_defined
4751	      && h->root.type != bfd_link_hash_defweak)
4752	  || htab->srelbss == NULL)
4753	abort ();
4754
4755      rela.r_offset = (h->root.u.def.value
4756		       + h->root.u.def.section->output_section->vma
4757		       + h->root.u.def.section->output_offset);
4758      rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY);
4759      rela.r_addend = 0;
4760      elf_append_rela (output_bfd, htab->srelbss, &rela);
4761    }
4762
4763  return TRUE;
4764}
4765
4766/* Finish up local dynamic symbol handling.  We set the contents of
4767   various dynamic sections here.  */
4768
4769static bfd_boolean
4770elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
4771{
4772  struct elf_link_hash_entry *h
4773    = (struct elf_link_hash_entry *) *slot;
4774  struct bfd_link_info *info
4775    = (struct bfd_link_info *) inf;
4776
4777  return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
4778					     info, h, NULL);
4779}
4780
4781/* Used to decide how to sort relocs in an optimal manner for the
4782   dynamic linker, before writing them out.  */
4783
4784static enum elf_reloc_type_class
4785elf_x86_64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
4786			     const asection *rel_sec ATTRIBUTE_UNUSED,
4787			     const Elf_Internal_Rela *rela)
4788{
4789  switch ((int) ELF32_R_TYPE (rela->r_info))
4790    {
4791    case R_X86_64_RELATIVE:
4792    case R_X86_64_RELATIVE64:
4793      return reloc_class_relative;
4794    case R_X86_64_JUMP_SLOT:
4795      return reloc_class_plt;
4796    case R_X86_64_COPY:
4797      return reloc_class_copy;
4798    default:
4799      return reloc_class_normal;
4800    }
4801}
4802
4803/* Finish up the dynamic sections.  */
4804
4805static bfd_boolean
4806elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
4807				    struct bfd_link_info *info)
4808{
4809  struct elf_x86_64_link_hash_table *htab;
4810  bfd *dynobj;
4811  asection *sdyn;
4812  const struct elf_x86_64_backend_data *const abed
4813    = get_elf_x86_64_backend_data (output_bfd);
4814
4815  htab = elf_x86_64_hash_table (info);
4816  if (htab == NULL)
4817    return FALSE;
4818
4819  dynobj = htab->elf.dynobj;
4820  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4821
4822  if (htab->elf.dynamic_sections_created)
4823    {
4824      bfd_byte *dyncon, *dynconend;
4825      const struct elf_backend_data *bed;
4826      bfd_size_type sizeof_dyn;
4827
4828      if (sdyn == NULL || htab->elf.sgot == NULL)
4829	abort ();
4830
4831      bed = get_elf_backend_data (dynobj);
4832      sizeof_dyn = bed->s->sizeof_dyn;
4833      dyncon = sdyn->contents;
4834      dynconend = sdyn->contents + sdyn->size;
4835      for (; dyncon < dynconend; dyncon += sizeof_dyn)
4836	{
4837	  Elf_Internal_Dyn dyn;
4838	  asection *s;
4839
4840	  (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
4841
4842	  switch (dyn.d_tag)
4843	    {
4844	    default:
4845	      continue;
4846
4847	    case DT_PLTGOT:
4848	      s = htab->elf.sgotplt;
4849	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4850	      break;
4851
4852	    case DT_JMPREL:
4853	      dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
4854	      break;
4855
4856	    case DT_PLTRELSZ:
4857	      s = htab->elf.srelplt->output_section;
4858	      dyn.d_un.d_val = s->size;
4859	      break;
4860
4861	    case DT_RELASZ:
4862	      /* The procedure linkage table relocs (DT_JMPREL) should
4863		 not be included in the overall relocs (DT_RELA).
4864		 Therefore, we override the DT_RELASZ entry here to
4865		 make it not include the JMPREL relocs.  Since the
4866		 linker script arranges for .rela.plt to follow all
4867		 other relocation sections, we don't have to worry
4868		 about changing the DT_RELA entry.  */
4869	      if (htab->elf.srelplt != NULL)
4870		{
4871		  s = htab->elf.srelplt->output_section;
4872		  dyn.d_un.d_val -= s->size;
4873		}
4874	      break;
4875
4876	    case DT_TLSDESC_PLT:
4877	      s = htab->elf.splt;
4878	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
4879		+ htab->tlsdesc_plt;
4880	      break;
4881
4882	    case DT_TLSDESC_GOT:
4883	      s = htab->elf.sgot;
4884	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
4885		+ htab->tlsdesc_got;
4886	      break;
4887	    }
4888
4889	  (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
4890	}
4891
4892      /* Fill in the special first entry in the procedure linkage table.  */
4893      if (htab->elf.splt && htab->elf.splt->size > 0)
4894	{
4895	  /* Fill in the first entry in the procedure linkage table.  */
4896	  memcpy (htab->elf.splt->contents,
4897		  abed->plt0_entry, abed->plt_entry_size);
4898	  /* Add offset for pushq GOT+8(%rip), since the instruction
4899	     uses 6 bytes subtract this value.  */
4900	  bfd_put_32 (output_bfd,
4901		      (htab->elf.sgotplt->output_section->vma
4902		       + htab->elf.sgotplt->output_offset
4903		       + 8
4904		       - htab->elf.splt->output_section->vma
4905		       - htab->elf.splt->output_offset
4906		       - 6),
4907		      htab->elf.splt->contents + abed->plt0_got1_offset);
4908	  /* Add offset for the PC-relative instruction accessing GOT+16,
4909	     subtracting the offset to the end of that instruction.  */
4910	  bfd_put_32 (output_bfd,
4911		      (htab->elf.sgotplt->output_section->vma
4912		       + htab->elf.sgotplt->output_offset
4913		       + 16
4914		       - htab->elf.splt->output_section->vma
4915		       - htab->elf.splt->output_offset
4916		       - abed->plt0_got2_insn_end),
4917		      htab->elf.splt->contents + abed->plt0_got2_offset);
4918
4919	  elf_section_data (htab->elf.splt->output_section)
4920	    ->this_hdr.sh_entsize = abed->plt_entry_size;
4921
4922	  if (htab->tlsdesc_plt)
4923	    {
4924	      bfd_put_64 (output_bfd, (bfd_vma) 0,
4925			  htab->elf.sgot->contents + htab->tlsdesc_got);
4926
4927	      memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
4928		      abed->plt0_entry, abed->plt_entry_size);
4929
4930	      /* Add offset for pushq GOT+8(%rip), since the
4931		 instruction uses 6 bytes subtract this value.  */
4932	      bfd_put_32 (output_bfd,
4933			  (htab->elf.sgotplt->output_section->vma
4934			   + htab->elf.sgotplt->output_offset
4935			   + 8
4936			   - htab->elf.splt->output_section->vma
4937			   - htab->elf.splt->output_offset
4938			   - htab->tlsdesc_plt
4939			   - 6),
4940			  htab->elf.splt->contents
4941			  + htab->tlsdesc_plt + abed->plt0_got1_offset);
4942	  /* Add offset for the PC-relative instruction accessing GOT+TDG,
4943	     where TGD stands for htab->tlsdesc_got, subtracting the offset
4944	     to the end of that instruction.  */
4945	      bfd_put_32 (output_bfd,
4946			  (htab->elf.sgot->output_section->vma
4947			   + htab->elf.sgot->output_offset
4948			   + htab->tlsdesc_got
4949			   - htab->elf.splt->output_section->vma
4950			   - htab->elf.splt->output_offset
4951			   - htab->tlsdesc_plt
4952			   - abed->plt0_got2_insn_end),
4953			  htab->elf.splt->contents
4954			  + htab->tlsdesc_plt + abed->plt0_got2_offset);
4955	    }
4956	}
4957    }
4958
4959  if (htab->elf.sgotplt)
4960    {
4961      if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
4962	{
4963	  (*_bfd_error_handler)
4964	    (_("discarded output section: `%A'"), htab->elf.sgotplt);
4965	  return FALSE;
4966	}
4967
4968      /* Fill in the first three entries in the global offset table.  */
4969      if (htab->elf.sgotplt->size > 0)
4970	{
4971	  /* Set the first entry in the global offset table to the address of
4972	     the dynamic section.  */
4973	  if (sdyn == NULL)
4974	    bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents);
4975	  else
4976	    bfd_put_64 (output_bfd,
4977			sdyn->output_section->vma + sdyn->output_offset,
4978			htab->elf.sgotplt->contents);
4979	  /* Write GOT[1] and GOT[2], needed for the dynamic linker.  */
4980	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
4981	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE*2);
4982	}
4983
4984      elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize =
4985	GOT_ENTRY_SIZE;
4986    }
4987
4988  /* Adjust .eh_frame for .plt section.  */
4989  if (htab->plt_eh_frame != NULL
4990      && htab->plt_eh_frame->contents != NULL)
4991    {
4992      if (htab->elf.splt != NULL
4993	  && htab->elf.splt->size != 0
4994	  && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
4995	  && htab->elf.splt->output_section != NULL
4996	  && htab->plt_eh_frame->output_section != NULL)
4997	{
4998	  bfd_vma plt_start = htab->elf.splt->output_section->vma;
4999	  bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
5000				   + htab->plt_eh_frame->output_offset
5001				   + PLT_FDE_START_OFFSET;
5002	  bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
5003			     htab->plt_eh_frame->contents
5004			     + PLT_FDE_START_OFFSET);
5005	}
5006      if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
5007	{
5008	  if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
5009						 htab->plt_eh_frame,
5010						 htab->plt_eh_frame->contents))
5011	    return FALSE;
5012	}
5013    }
5014
5015  if (htab->elf.sgot && htab->elf.sgot->size > 0)
5016    elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
5017      = GOT_ENTRY_SIZE;
5018
5019  /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
5020  htab_traverse (htab->loc_hash_table,
5021		 elf_x86_64_finish_local_dynamic_symbol,
5022		 info);
5023
5024  return TRUE;
5025}
5026
5027/* Return address for Ith PLT stub in section PLT, for relocation REL
5028   or (bfd_vma) -1 if it should not be included.  */
5029
5030static bfd_vma
5031elf_x86_64_plt_sym_val (bfd_vma i, const asection *plt,
5032			const arelent *rel ATTRIBUTE_UNUSED)
5033{
5034  return plt->vma + (i + 1) * GET_PLT_ENTRY_SIZE (plt->owner);
5035}
5036
5037/* Handle an x86-64 specific section when reading an object file.  This
5038   is called when elfcode.h finds a section with an unknown type.  */
5039
5040static bfd_boolean
5041elf_x86_64_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr,
5042			      const char *name, int shindex)
5043{
5044  if (hdr->sh_type != SHT_X86_64_UNWIND)
5045    return FALSE;
5046
5047  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
5048    return FALSE;
5049
5050  return TRUE;
5051}
5052
5053/* Hook called by the linker routine which adds symbols from an object
5054   file.  We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
5055   of .bss.  */
5056
5057static bfd_boolean
5058elf_x86_64_add_symbol_hook (bfd *abfd,
5059			    struct bfd_link_info *info,
5060			    Elf_Internal_Sym *sym,
5061			    const char **namep ATTRIBUTE_UNUSED,
5062			    flagword *flagsp ATTRIBUTE_UNUSED,
5063			    asection **secp,
5064			    bfd_vma *valp)
5065{
5066  asection *lcomm;
5067
5068  switch (sym->st_shndx)
5069    {
5070    case SHN_X86_64_LCOMMON:
5071      lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
5072      if (lcomm == NULL)
5073	{
5074	  lcomm = bfd_make_section_with_flags (abfd,
5075					       "LARGE_COMMON",
5076					       (SEC_ALLOC
5077						| SEC_IS_COMMON
5078						| SEC_LINKER_CREATED));
5079	  if (lcomm == NULL)
5080	    return FALSE;
5081	  elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
5082	}
5083      *secp = lcomm;
5084      *valp = sym->st_size;
5085      return TRUE;
5086    }
5087
5088  if ((abfd->flags & DYNAMIC) == 0
5089      && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
5090	  || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
5091    elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
5092
5093  return TRUE;
5094}
5095
5096
5097/* Given a BFD section, try to locate the corresponding ELF section
5098   index.  */
5099
5100static bfd_boolean
5101elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
5102					 asection *sec, int *index_return)
5103{
5104  if (sec == &_bfd_elf_large_com_section)
5105    {
5106      *index_return = SHN_X86_64_LCOMMON;
5107      return TRUE;
5108    }
5109  return FALSE;
5110}
5111
5112/* Process a symbol.  */
5113
5114static void
5115elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
5116			      asymbol *asym)
5117{
5118  elf_symbol_type *elfsym = (elf_symbol_type *) asym;
5119
5120  switch (elfsym->internal_elf_sym.st_shndx)
5121    {
5122    case SHN_X86_64_LCOMMON:
5123      asym->section = &_bfd_elf_large_com_section;
5124      asym->value = elfsym->internal_elf_sym.st_size;
5125      /* Common symbol doesn't set BSF_GLOBAL.  */
5126      asym->flags &= ~BSF_GLOBAL;
5127      break;
5128    }
5129}
5130
5131static bfd_boolean
5132elf_x86_64_common_definition (Elf_Internal_Sym *sym)
5133{
5134  return (sym->st_shndx == SHN_COMMON
5135	  || sym->st_shndx == SHN_X86_64_LCOMMON);
5136}
5137
5138static unsigned int
5139elf_x86_64_common_section_index (asection *sec)
5140{
5141  if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
5142    return SHN_COMMON;
5143  else
5144    return SHN_X86_64_LCOMMON;
5145}
5146
5147static asection *
5148elf_x86_64_common_section (asection *sec)
5149{
5150  if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
5151    return bfd_com_section_ptr;
5152  else
5153    return &_bfd_elf_large_com_section;
5154}
5155
5156static bfd_boolean
5157elf_x86_64_merge_symbol (struct elf_link_hash_entry *h,
5158			 const Elf_Internal_Sym *sym,
5159			 asection **psec,
5160			 bfd_boolean newdef,
5161			 bfd_boolean olddef,
5162			 bfd *oldbfd,
5163			 const asection *oldsec)
5164{
5165  /* A normal common symbol and a large common symbol result in a
5166     normal common symbol.  We turn the large common symbol into a
5167     normal one.  */
5168  if (!olddef
5169      && h->root.type == bfd_link_hash_common
5170      && !newdef
5171      && bfd_is_com_section (*psec)
5172      && oldsec != *psec)
5173    {
5174      if (sym->st_shndx == SHN_COMMON
5175	  && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) != 0)
5176	{
5177	  h->root.u.c.p->section
5178	    = bfd_make_section_old_way (oldbfd, "COMMON");
5179	  h->root.u.c.p->section->flags = SEC_ALLOC;
5180	}
5181      else if (sym->st_shndx == SHN_X86_64_LCOMMON
5182	       && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) == 0)
5183	*psec = bfd_com_section_ptr;
5184    }
5185
5186  return TRUE;
5187}
5188
5189static int
5190elf_x86_64_additional_program_headers (bfd *abfd,
5191				       struct bfd_link_info *info ATTRIBUTE_UNUSED)
5192{
5193  asection *s;
5194  int count = 0;
5195
5196  /* Check to see if we need a large readonly segment.  */
5197  s = bfd_get_section_by_name (abfd, ".lrodata");
5198  if (s && (s->flags & SEC_LOAD))
5199    count++;
5200
5201  /* Check to see if we need a large data segment.  Since .lbss sections
5202     is placed right after the .bss section, there should be no need for
5203     a large data segment just because of .lbss.  */
5204  s = bfd_get_section_by_name (abfd, ".ldata");
5205  if (s && (s->flags & SEC_LOAD))
5206    count++;
5207
5208  return count;
5209}
5210
5211/* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
5212
5213static bfd_boolean
5214elf_x86_64_hash_symbol (struct elf_link_hash_entry *h)
5215{
5216  if (h->plt.offset != (bfd_vma) -1
5217      && !h->def_regular
5218      && !h->pointer_equality_needed)
5219    return FALSE;
5220
5221  return _bfd_elf_hash_symbol (h);
5222}
5223
5224/* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
5225
5226static bfd_boolean
5227elf_x86_64_relocs_compatible (const bfd_target *input,
5228			      const bfd_target *output)
5229{
5230  return ((xvec_get_elf_backend_data (input)->s->elfclass
5231	   == xvec_get_elf_backend_data (output)->s->elfclass)
5232	  && _bfd_elf_relocs_compatible (input, output));
5233}
5234
5235static const struct bfd_elf_special_section
5236  elf_x86_64_special_sections[]=
5237{
5238  { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
5239  { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
5240  { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
5241  { STRING_COMMA_LEN (".lbss"),	           -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
5242  { STRING_COMMA_LEN (".ldata"),	   -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
5243  { STRING_COMMA_LEN (".lrodata"),	   -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
5244  { NULL,	                0,          0, 0,            0 }
5245};
5246
5247#define TARGET_LITTLE_SYM		    bfd_elf64_x86_64_vec
5248#define TARGET_LITTLE_NAME		    "elf64-x86-64"
5249#define ELF_ARCH			    bfd_arch_i386
5250#define ELF_TARGET_ID			    X86_64_ELF_DATA
5251#define ELF_MACHINE_CODE		    EM_X86_64
5252#define ELF_MAXPAGESIZE			    0x200000
5253#define ELF_MINPAGESIZE			    0x1000
5254#define ELF_COMMONPAGESIZE		    0x1000
5255
5256#define elf_backend_can_gc_sections	    1
5257#define elf_backend_can_refcount	    1
5258#define elf_backend_want_got_plt	    1
5259#define elf_backend_plt_readonly	    1
5260#define elf_backend_want_plt_sym	    0
5261#define elf_backend_got_header_size	    (GOT_ENTRY_SIZE*3)
5262#define elf_backend_rela_normal		    1
5263#define elf_backend_plt_alignment           4
5264
5265#define elf_info_to_howto		    elf_x86_64_info_to_howto
5266
5267#define bfd_elf64_bfd_link_hash_table_create \
5268  elf_x86_64_link_hash_table_create
5269#define bfd_elf64_bfd_link_hash_table_free \
5270  elf_x86_64_link_hash_table_free
5271#define bfd_elf64_bfd_reloc_type_lookup	    elf_x86_64_reloc_type_lookup
5272#define bfd_elf64_bfd_reloc_name_lookup \
5273  elf_x86_64_reloc_name_lookup
5274
5275#define elf_backend_adjust_dynamic_symbol   elf_x86_64_adjust_dynamic_symbol
5276#define elf_backend_relocs_compatible	    elf_x86_64_relocs_compatible
5277#define elf_backend_check_relocs	    elf_x86_64_check_relocs
5278#define elf_backend_copy_indirect_symbol    elf_x86_64_copy_indirect_symbol
5279#define elf_backend_create_dynamic_sections elf_x86_64_create_dynamic_sections
5280#define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
5281#define elf_backend_finish_dynamic_symbol   elf_x86_64_finish_dynamic_symbol
5282#define elf_backend_gc_mark_hook	    elf_x86_64_gc_mark_hook
5283#define elf_backend_gc_sweep_hook	    elf_x86_64_gc_sweep_hook
5284#define elf_backend_grok_prstatus	    elf_x86_64_grok_prstatus
5285#define elf_backend_grok_psinfo		    elf_x86_64_grok_psinfo
5286#ifdef CORE_HEADER
5287#define elf_backend_write_core_note	    elf_x86_64_write_core_note
5288#endif
5289#define elf_backend_reloc_type_class	    elf_x86_64_reloc_type_class
5290#define elf_backend_relocate_section	    elf_x86_64_relocate_section
5291#define elf_backend_size_dynamic_sections   elf_x86_64_size_dynamic_sections
5292#define elf_backend_always_size_sections    elf_x86_64_always_size_sections
5293#define elf_backend_init_index_section	    _bfd_elf_init_1_index_section
5294#define elf_backend_plt_sym_val		    elf_x86_64_plt_sym_val
5295#define elf_backend_object_p		    elf64_x86_64_elf_object_p
5296#define bfd_elf64_mkobject		    elf_x86_64_mkobject
5297
5298#define elf_backend_section_from_shdr \
5299	elf_x86_64_section_from_shdr
5300
5301#define elf_backend_section_from_bfd_section \
5302  elf_x86_64_elf_section_from_bfd_section
5303#define elf_backend_add_symbol_hook \
5304  elf_x86_64_add_symbol_hook
5305#define elf_backend_symbol_processing \
5306  elf_x86_64_symbol_processing
5307#define elf_backend_common_section_index \
5308  elf_x86_64_common_section_index
5309#define elf_backend_common_section \
5310  elf_x86_64_common_section
5311#define elf_backend_common_definition \
5312  elf_x86_64_common_definition
5313#define elf_backend_merge_symbol \
5314  elf_x86_64_merge_symbol
5315#define elf_backend_special_sections \
5316  elf_x86_64_special_sections
5317#define elf_backend_additional_program_headers \
5318  elf_x86_64_additional_program_headers
5319#define elf_backend_hash_symbol \
5320  elf_x86_64_hash_symbol
5321
5322#include "elf64-target.h"
5323
5324/* FreeBSD support.  */
5325
5326#undef  TARGET_LITTLE_SYM
5327#define TARGET_LITTLE_SYM		    bfd_elf64_x86_64_freebsd_vec
5328#undef  TARGET_LITTLE_NAME
5329#define TARGET_LITTLE_NAME		    "elf64-x86-64-freebsd"
5330
5331#undef	ELF_OSABI
5332#define	ELF_OSABI			    ELFOSABI_FREEBSD
5333
5334#undef  elf64_bed
5335#define elf64_bed elf64_x86_64_fbsd_bed
5336
5337#include "elf64-target.h"
5338
5339/* Solaris 2 support.  */
5340
5341#undef  TARGET_LITTLE_SYM
5342#define TARGET_LITTLE_SYM		    bfd_elf64_x86_64_sol2_vec
5343#undef  TARGET_LITTLE_NAME
5344#define TARGET_LITTLE_NAME		    "elf64-x86-64-sol2"
5345
5346/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
5347   objects won't be recognized.  */
5348#undef ELF_OSABI
5349
5350#undef  elf64_bed
5351#define elf64_bed			    elf64_x86_64_sol2_bed
5352
5353/* The 64-bit static TLS arena size is rounded to the nearest 16-byte
5354   boundary.  */
5355#undef elf_backend_static_tls_alignment
5356#define elf_backend_static_tls_alignment    16
5357
5358/* The Solaris 2 ABI requires a plt symbol on all platforms.
5359
5360   Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
5361   File, p.63.  */
5362#undef elf_backend_want_plt_sym
5363#define elf_backend_want_plt_sym	    1
5364
5365#include "elf64-target.h"
5366
5367/* Native Client support.  */
5368
5369static bfd_boolean
5370elf64_x86_64_nacl_elf_object_p (bfd *abfd)
5371{
5372  /* Set the right machine number for a NaCl x86-64 ELF64 file.  */
5373  bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64_nacl);
5374  return TRUE;
5375}
5376
5377#undef	TARGET_LITTLE_SYM
5378#define	TARGET_LITTLE_SYM		bfd_elf64_x86_64_nacl_vec
5379#undef	TARGET_LITTLE_NAME
5380#define	TARGET_LITTLE_NAME		"elf64-x86-64-nacl"
5381#undef	elf64_bed
5382#define	elf64_bed			elf64_x86_64_nacl_bed
5383
5384#undef	ELF_MAXPAGESIZE
5385#undef	ELF_MINPAGESIZE
5386#undef	ELF_COMMONPAGESIZE
5387#define ELF_MAXPAGESIZE			0x10000
5388#define ELF_MINPAGESIZE			0x10000
5389#define ELF_COMMONPAGESIZE		0x10000
5390
5391/* Restore defaults.  */
5392#undef	ELF_OSABI
5393#undef	elf_backend_static_tls_alignment
5394#undef	elf_backend_want_plt_sym
5395#define elf_backend_want_plt_sym	0
5396
5397/* NaCl uses substantially different PLT entries for the same effects.  */
5398
5399#undef	elf_backend_plt_alignment
5400#define elf_backend_plt_alignment	5
5401#define NACL_PLT_ENTRY_SIZE		64
5402#define	NACLMASK			0xe0 /* 32-byte alignment mask.  */
5403
5404static const bfd_byte elf_x86_64_nacl_plt0_entry[NACL_PLT_ENTRY_SIZE] =
5405  {
5406    0xff, 0x35, 8, 0, 0, 0,             /* pushq GOT+8(%rip) 		*/
5407    0x4c, 0x8b, 0x1d, 16, 0, 0, 0,	/* mov GOT+16(%rip), %r11	*/
5408    0x41, 0x83, 0xe3, NACLMASK,         /* and $-32, %r11d		*/
5409    0x4d, 0x01, 0xfb,             	/* add %r15, %r11		*/
5410    0x41, 0xff, 0xe3,             	/* jmpq *%r11			*/
5411
5412    /* 9-byte nop sequence to pad out to the next 32-byte boundary.  */
5413    0x66, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw 0x0(%rax,%rax,1)	*/
5414
5415    /* 32 bytes of nop to pad out to the standard size.  */
5416    0x66, 0x66, 0x66, 0x66, 0x66, 0x66,    /* excess data32 prefixes	*/
5417    0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1)	*/
5418    0x66, 0x66, 0x66, 0x66, 0x66, 0x66,    /* excess data32 prefixes	*/
5419    0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1)	*/
5420    0x66,                                  /* excess data32 prefix	*/
5421    0x90                                   /* nop */
5422  };
5423
5424static const bfd_byte elf_x86_64_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
5425  {
5426    0x4c, 0x8b, 0x1d, 0, 0, 0, 0,	/* mov name@GOTPCREL(%rip),%r11	*/
5427    0x41, 0x83, 0xe3, NACLMASK,         /* and $-32, %r11d		*/
5428    0x4d, 0x01, 0xfb,             	/* add %r15, %r11		*/
5429    0x41, 0xff, 0xe3,             	/* jmpq *%r11			*/
5430
5431    /* 15-byte nop sequence to pad out to the next 32-byte boundary.  */
5432    0x66, 0x66, 0x66, 0x66, 0x66, 0x66,    /* excess data32 prefixes	*/
5433    0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1)	*/
5434
5435    /* Lazy GOT entries point here (32-byte aligned).  */
5436    0x68,                 /* pushq immediate */
5437    0, 0, 0, 0,           /* replaced with index into relocation table.  */
5438    0xe9,                 /* jmp relative */
5439    0, 0, 0, 0,           /* replaced with offset to start of .plt0.  */
5440
5441    /* 22 bytes of nop to pad out to the standard size.  */
5442    0x66, 0x66, 0x66, 0x66, 0x66, 0x66,    /* excess data32 prefixes	*/
5443    0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1)	*/
5444    0x0f, 0x1f, 0x80, 0, 0, 0, 0,          /* nopl 0x0(%rax)		*/
5445  };
5446
5447/* .eh_frame covering the .plt section.  */
5448
5449static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] =
5450  {
5451#if (PLT_CIE_LENGTH != 20                               \
5452     || PLT_FDE_LENGTH != 36                            \
5453     || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8  \
5454     || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
5455# error "Need elf_x86_64_backend_data parameters for eh_frame_plt offsets!"
5456#endif
5457    PLT_CIE_LENGTH, 0, 0, 0,	/* CIE length */
5458    0, 0, 0, 0,			/* CIE ID */
5459    1,				/* CIE version */
5460    'z', 'R', 0,                /* Augmentation string */
5461    1,				/* Code alignment factor */
5462    0x78,                       /* Data alignment factor */
5463    16,				/* Return address column */
5464    1,				/* Augmentation size */
5465    DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
5466    DW_CFA_def_cfa, 7, 8,	/* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
5467    DW_CFA_offset + 16, 1,	/* DW_CFA_offset: r16 (rip) at cfa-8 */
5468    DW_CFA_nop, DW_CFA_nop,
5469
5470    PLT_FDE_LENGTH, 0, 0, 0,	/* FDE length */
5471    PLT_CIE_LENGTH + 8, 0, 0, 0,/* CIE pointer */
5472    0, 0, 0, 0,			/* R_X86_64_PC32 .plt goes here */
5473    0, 0, 0, 0,			/* .plt size goes here */
5474    0,				/* Augmentation size */
5475    DW_CFA_def_cfa_offset, 16,	/* DW_CFA_def_cfa_offset: 16 */
5476    DW_CFA_advance_loc + 6,	/* DW_CFA_advance_loc: 6 to __PLT__+6 */
5477    DW_CFA_def_cfa_offset, 24,	/* DW_CFA_def_cfa_offset: 24 */
5478    DW_CFA_advance_loc + 58,	/* DW_CFA_advance_loc: 58 to __PLT__+64 */
5479    DW_CFA_def_cfa_expression,	/* DW_CFA_def_cfa_expression */
5480    13,				/* Block length */
5481    DW_OP_breg7, 8,		/* DW_OP_breg7 (rsp): 8 */
5482    DW_OP_breg16, 0,		/* DW_OP_breg16 (rip): 0 */
5483    DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
5484    DW_OP_lit3, DW_OP_shl, DW_OP_plus,
5485    DW_CFA_nop, DW_CFA_nop
5486  };
5487
5488static const struct elf_x86_64_backend_data elf_x86_64_nacl_arch_bed =
5489  {
5490    elf_x86_64_nacl_plt0_entry,              /* plt0_entry */
5491    elf_x86_64_nacl_plt_entry,               /* plt_entry */
5492    NACL_PLT_ENTRY_SIZE,                     /* plt_entry_size */
5493    2,                                       /* plt0_got1_offset */
5494    9,                                       /* plt0_got2_offset */
5495    13,                                      /* plt0_got2_insn_end */
5496    3,                                       /* plt_got_offset */
5497    33,                                      /* plt_reloc_offset */
5498    38,                                      /* plt_plt_offset */
5499    7,                                       /* plt_got_insn_size */
5500    42,                                      /* plt_plt_insn_end */
5501    32,                                      /* plt_lazy_offset */
5502    elf_x86_64_nacl_eh_frame_plt,            /* eh_frame_plt */
5503    sizeof (elf_x86_64_nacl_eh_frame_plt),   /* eh_frame_plt_size */
5504  };
5505
5506#undef	elf_backend_arch_data
5507#define	elf_backend_arch_data	&elf_x86_64_nacl_arch_bed
5508
5509#undef	elf_backend_object_p
5510#define elf_backend_object_p			elf64_x86_64_nacl_elf_object_p
5511#undef	elf_backend_modify_segment_map
5512#define	elf_backend_modify_segment_map		nacl_modify_segment_map
5513#undef	elf_backend_modify_program_headers
5514#define	elf_backend_modify_program_headers	nacl_modify_program_headers
5515#undef	elf_backend_final_write_processing
5516#define elf_backend_final_write_processing	nacl_final_write_processing
5517
5518#include "elf64-target.h"
5519
5520/* Native Client x32 support.  */
5521
5522static bfd_boolean
5523elf32_x86_64_nacl_elf_object_p (bfd *abfd)
5524{
5525  /* Set the right machine number for a NaCl x86-64 ELF32 file.  */
5526  bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32_nacl);
5527  return TRUE;
5528}
5529
5530#undef  TARGET_LITTLE_SYM
5531#define TARGET_LITTLE_SYM		bfd_elf32_x86_64_nacl_vec
5532#undef  TARGET_LITTLE_NAME
5533#define TARGET_LITTLE_NAME		"elf32-x86-64-nacl"
5534#undef	elf32_bed
5535#define	elf32_bed			elf32_x86_64_nacl_bed
5536
5537#define bfd_elf32_bfd_link_hash_table_create \
5538  elf_x86_64_link_hash_table_create
5539#define bfd_elf32_bfd_link_hash_table_free \
5540  elf_x86_64_link_hash_table_free
5541#define bfd_elf32_bfd_reloc_type_lookup	\
5542  elf_x86_64_reloc_type_lookup
5543#define bfd_elf32_bfd_reloc_name_lookup \
5544  elf_x86_64_reloc_name_lookup
5545#define bfd_elf32_mkobject \
5546  elf_x86_64_mkobject
5547
5548#undef elf_backend_object_p
5549#define elf_backend_object_p \
5550  elf32_x86_64_nacl_elf_object_p
5551
5552#undef elf_backend_bfd_from_remote_memory
5553#define elf_backend_bfd_from_remote_memory \
5554  _bfd_elf32_bfd_from_remote_memory
5555
5556#undef elf_backend_size_info
5557#define elf_backend_size_info \
5558  _bfd_elf32_size_info
5559
5560#include "elf32-target.h"
5561
5562/* Restore defaults.  */
5563#undef	elf_backend_object_p
5564#define elf_backend_object_p		    elf64_x86_64_elf_object_p
5565#undef	elf_backend_bfd_from_remote_memory
5566#undef	elf_backend_size_info
5567#undef	elf_backend_modify_segment_map
5568#undef	elf_backend_modify_program_headers
5569#undef	elf_backend_final_write_processing
5570
5571/* Intel L1OM support.  */
5572
5573static bfd_boolean
5574elf64_l1om_elf_object_p (bfd *abfd)
5575{
5576  /* Set the right machine number for an L1OM elf64 file.  */
5577  bfd_default_set_arch_mach (abfd, bfd_arch_l1om, bfd_mach_l1om);
5578  return TRUE;
5579}
5580
5581#undef  TARGET_LITTLE_SYM
5582#define TARGET_LITTLE_SYM		    bfd_elf64_l1om_vec
5583#undef  TARGET_LITTLE_NAME
5584#define TARGET_LITTLE_NAME		    "elf64-l1om"
5585#undef ELF_ARCH
5586#define ELF_ARCH			    bfd_arch_l1om
5587
5588#undef	ELF_MACHINE_CODE
5589#define ELF_MACHINE_CODE		    EM_L1OM
5590
5591#undef	ELF_OSABI
5592
5593#undef  elf64_bed
5594#define elf64_bed elf64_l1om_bed
5595
5596#undef elf_backend_object_p
5597#define elf_backend_object_p		    elf64_l1om_elf_object_p
5598
5599/* Restore defaults.  */
5600#undef	ELF_MAXPAGESIZE
5601#undef	ELF_MINPAGESIZE
5602#undef	ELF_COMMONPAGESIZE
5603#define ELF_MAXPAGESIZE			0x200000
5604#define ELF_MINPAGESIZE			0x1000
5605#define ELF_COMMONPAGESIZE		0x1000
5606#undef	elf_backend_plt_alignment
5607#define elf_backend_plt_alignment	4
5608#undef	elf_backend_arch_data
5609#define	elf_backend_arch_data	&elf_x86_64_arch_bed
5610
5611#include "elf64-target.h"
5612
5613/* FreeBSD L1OM support.  */
5614
5615#undef  TARGET_LITTLE_SYM
5616#define TARGET_LITTLE_SYM		    bfd_elf64_l1om_freebsd_vec
5617#undef  TARGET_LITTLE_NAME
5618#define TARGET_LITTLE_NAME		    "elf64-l1om-freebsd"
5619
5620#undef	ELF_OSABI
5621#define	ELF_OSABI			    ELFOSABI_FREEBSD
5622
5623#undef  elf64_bed
5624#define elf64_bed elf64_l1om_fbsd_bed
5625
5626#include "elf64-target.h"
5627
5628/* Intel K1OM support.  */
5629
5630static bfd_boolean
5631elf64_k1om_elf_object_p (bfd *abfd)
5632{
5633  /* Set the right machine number for an K1OM elf64 file.  */
5634  bfd_default_set_arch_mach (abfd, bfd_arch_k1om, bfd_mach_k1om);
5635  return TRUE;
5636}
5637
5638#undef  TARGET_LITTLE_SYM
5639#define TARGET_LITTLE_SYM		    bfd_elf64_k1om_vec
5640#undef  TARGET_LITTLE_NAME
5641#define TARGET_LITTLE_NAME		    "elf64-k1om"
5642#undef ELF_ARCH
5643#define ELF_ARCH			    bfd_arch_k1om
5644
5645#undef	ELF_MACHINE_CODE
5646#define ELF_MACHINE_CODE		    EM_K1OM
5647
5648#undef	ELF_OSABI
5649
5650#undef  elf64_bed
5651#define elf64_bed elf64_k1om_bed
5652
5653#undef elf_backend_object_p
5654#define elf_backend_object_p		    elf64_k1om_elf_object_p
5655
5656#undef  elf_backend_static_tls_alignment
5657
5658#undef elf_backend_want_plt_sym
5659#define elf_backend_want_plt_sym	    0
5660
5661#include "elf64-target.h"
5662
5663/* FreeBSD K1OM support.  */
5664
5665#undef  TARGET_LITTLE_SYM
5666#define TARGET_LITTLE_SYM		    bfd_elf64_k1om_freebsd_vec
5667#undef  TARGET_LITTLE_NAME
5668#define TARGET_LITTLE_NAME		    "elf64-k1om-freebsd"
5669
5670#undef	ELF_OSABI
5671#define	ELF_OSABI			    ELFOSABI_FREEBSD
5672
5673#undef  elf64_bed
5674#define elf64_bed elf64_k1om_fbsd_bed
5675
5676#include "elf64-target.h"
5677
5678/* 32bit x86-64 support.  */
5679
5680#undef  TARGET_LITTLE_SYM
5681#define TARGET_LITTLE_SYM		    bfd_elf32_x86_64_vec
5682#undef  TARGET_LITTLE_NAME
5683#define TARGET_LITTLE_NAME		    "elf32-x86-64"
5684#undef	elf32_bed
5685
5686#undef ELF_ARCH
5687#define ELF_ARCH			    bfd_arch_i386
5688
5689#undef	ELF_MACHINE_CODE
5690#define ELF_MACHINE_CODE		    EM_X86_64
5691
5692#undef	ELF_OSABI
5693
5694#undef elf_backend_object_p
5695#define elf_backend_object_p \
5696  elf32_x86_64_elf_object_p
5697
5698#undef elf_backend_bfd_from_remote_memory
5699#define elf_backend_bfd_from_remote_memory \
5700  _bfd_elf32_bfd_from_remote_memory
5701
5702#undef elf_backend_size_info
5703#define elf_backend_size_info \
5704  _bfd_elf32_size_info
5705
5706#include "elf32-target.h"
5707