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