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