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