1 /* X86-64 specific support for ELF
2    Copyright (C) 2000-2020 Free Software Foundation, Inc.
3    Contributed by Jan Hubicka <jh@suse.cz>.
4 
5    This file is part of BFD, the Binary File Descriptor library.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21 
22 #include "elfxx-x86.h"
23 #include "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 = NULL;
1426 	  break;
1427 	}
1428 
1429       if (!SYMBOL_DEFINED_NON_SHARED_P (h) && !h->def_dynamic)
1430 	und = _("undefined ");
1431     }
1432   else
1433     {
1434       name = bfd_elf_sym_name (input_bfd, symtab_hdr, isym, NULL);
1435       pic = NULL;
1436     }
1437 
1438   if (bfd_link_dll (info))
1439     {
1440       object = _("a shared object");
1441       if (!pic)
1442 	pic = _("; recompile with -fPIC");
1443     }
1444   else
1445     {
1446       if (bfd_link_pie (info))
1447 	object = _("a PIE object");
1448       else
1449 	object = _("a PDE object");
1450       if (!pic)
1451 	pic = _("; recompile with -fPIE");
1452     }
1453 
1454   /* xgettext:c-format */
1455   _bfd_error_handler (_("%pB: relocation %s against %s%s`%s' can "
1456 			"not be used when making %s%s"),
1457 		      input_bfd, howto->name, und, v, name,
1458 		      object, pic);
1459   bfd_set_error (bfd_error_bad_value);
1460   sec->check_relocs_failed = 1;
1461   return FALSE;
1462 }
1463 
1464 /* With the local symbol, foo, we convert
1465    mov foo@GOTPCREL(%rip), %reg
1466    to
1467    lea foo(%rip), %reg
1468    and convert
1469    call/jmp *foo@GOTPCREL(%rip)
1470    to
1471    nop call foo/jmp foo nop
1472    When PIC is false, convert
1473    test %reg, foo@GOTPCREL(%rip)
1474    to
1475    test $foo, %reg
1476    and convert
1477    binop foo@GOTPCREL(%rip), %reg
1478    to
1479    binop $foo, %reg
1480    where binop is one of adc, add, and, cmp, or, sbb, sub, xor
1481    instructions.  */
1482 
1483 static bfd_boolean
1484 elf_x86_64_convert_load_reloc (bfd *abfd,
1485 			       bfd_byte *contents,
1486 			       unsigned int *r_type_p,
1487 			       Elf_Internal_Rela *irel,
1488 			       struct elf_link_hash_entry *h,
1489 			       bfd_boolean *converted,
1490 			       struct bfd_link_info *link_info)
1491 {
1492   struct elf_x86_link_hash_table *htab;
1493   bfd_boolean is_pic;
1494   bfd_boolean no_overflow;
1495   bfd_boolean relocx;
1496   bfd_boolean to_reloc_pc32;
1497   asection *tsec;
1498   bfd_signed_vma raddend;
1499   unsigned int opcode;
1500   unsigned int modrm;
1501   unsigned int r_type = *r_type_p;
1502   unsigned int r_symndx;
1503   bfd_vma roff = irel->r_offset;
1504 
1505   if (roff < (r_type == R_X86_64_REX_GOTPCRELX ? 3 : 2))
1506     return TRUE;
1507 
1508   raddend = irel->r_addend;
1509   /* Addend for 32-bit PC-relative relocation must be -4.  */
1510   if (raddend != -4)
1511     return TRUE;
1512 
1513   htab = elf_x86_hash_table (link_info, X86_64_ELF_DATA);
1514   is_pic = bfd_link_pic (link_info);
1515 
1516   relocx = (r_type == R_X86_64_GOTPCRELX
1517 	    || r_type == R_X86_64_REX_GOTPCRELX);
1518 
1519   /* TRUE if --no-relax is used.  */
1520   no_overflow = link_info->disable_target_specific_optimizations > 1;
1521 
1522   r_symndx = htab->r_sym (irel->r_info);
1523 
1524   opcode = bfd_get_8 (abfd, contents + roff - 2);
1525 
1526   /* Convert mov to lea since it has been done for a while.  */
1527   if (opcode != 0x8b)
1528     {
1529       /* Only convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX
1530 	 for call, jmp or one of adc, add, and, cmp, or, sbb, sub,
1531 	 test, xor instructions.  */
1532       if (!relocx)
1533 	return TRUE;
1534     }
1535 
1536   /* We convert only to R_X86_64_PC32:
1537      1. Branch.
1538      2. R_X86_64_GOTPCREL since we can't modify REX byte.
1539      3. no_overflow is true.
1540      4. PIC.
1541      */
1542   to_reloc_pc32 = (opcode == 0xff
1543 		   || !relocx
1544 		   || no_overflow
1545 		   || is_pic);
1546 
1547   /* Get the symbol referred to by the reloc.  */
1548   if (h == NULL)
1549     {
1550       Elf_Internal_Sym *isym
1551 	= bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx);
1552 
1553       /* Skip relocation against undefined symbols.  */
1554       if (isym->st_shndx == SHN_UNDEF)
1555 	return TRUE;
1556 
1557       if (isym->st_shndx == SHN_ABS)
1558 	tsec = bfd_abs_section_ptr;
1559       else if (isym->st_shndx == SHN_COMMON)
1560 	tsec = bfd_com_section_ptr;
1561       else if (isym->st_shndx == SHN_X86_64_LCOMMON)
1562 	tsec = &_bfd_elf_large_com_section;
1563       else
1564 	tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1565     }
1566   else
1567     {
1568       /* Undefined weak symbol is only bound locally in executable
1569 	 and its reference is resolved as 0 without relocation
1570 	 overflow.  We can only perform this optimization for
1571 	 GOTPCRELX relocations since we need to modify REX byte.
1572 	 It is OK convert mov with R_X86_64_GOTPCREL to
1573 	 R_X86_64_PC32.  */
1574       bfd_boolean local_ref;
1575       struct elf_x86_link_hash_entry *eh = elf_x86_hash_entry (h);
1576 
1577       /* NB: Also set linker_def via SYMBOL_REFERENCES_LOCAL_P.  */
1578       local_ref = SYMBOL_REFERENCES_LOCAL_P (link_info, h);
1579       if ((relocx || opcode == 0x8b)
1580 	  && (h->root.type == bfd_link_hash_undefweak
1581 	      && !eh->linker_def
1582 	      && local_ref))
1583 	{
1584 	  if (opcode == 0xff)
1585 	    {
1586 	      /* Skip for branch instructions since R_X86_64_PC32
1587 		 may overflow.  */
1588 	      if (no_overflow)
1589 		return TRUE;
1590 	    }
1591 	  else if (relocx)
1592 	    {
1593 	      /* For non-branch instructions, we can convert to
1594 		 R_X86_64_32/R_X86_64_32S since we know if there
1595 		 is a REX byte.  */
1596 	      to_reloc_pc32 = FALSE;
1597 	    }
1598 
1599 	  /* Since we don't know the current PC when PIC is true,
1600 	     we can't convert to R_X86_64_PC32.  */
1601 	  if (to_reloc_pc32 && is_pic)
1602 	    return TRUE;
1603 
1604 	  goto convert;
1605 	}
1606       /* Avoid optimizing GOTPCREL relocations againt _DYNAMIC since
1607 	 ld.so may use its link-time address.  */
1608       else if (h->start_stop
1609 	       || eh->linker_def
1610 	       || ((h->def_regular
1611 		    || h->root.type == bfd_link_hash_defined
1612 		    || h->root.type == bfd_link_hash_defweak)
1613 		   && h != htab->elf.hdynamic
1614 		   && local_ref))
1615 	{
1616 	  /* bfd_link_hash_new or bfd_link_hash_undefined is
1617 	     set by an assignment in a linker script in
1618 	     bfd_elf_record_link_assignment.  start_stop is set
1619 	     on __start_SECNAME/__stop_SECNAME which mark section
1620 	     SECNAME.  */
1621 	  if (h->start_stop
1622 	      || eh->linker_def
1623 	      || (h->def_regular
1624 		  && (h->root.type == bfd_link_hash_new
1625 		      || h->root.type == bfd_link_hash_undefined
1626 		      || ((h->root.type == bfd_link_hash_defined
1627 			   || h->root.type == bfd_link_hash_defweak)
1628 			  && h->root.u.def.section == bfd_und_section_ptr))))
1629 	    {
1630 	      /* Skip since R_X86_64_32/R_X86_64_32S may overflow.  */
1631 	      if (no_overflow)
1632 		return TRUE;
1633 	      goto convert;
1634 	    }
1635 	  tsec = h->root.u.def.section;
1636 	}
1637       else
1638 	return TRUE;
1639     }
1640 
1641   /* Don't convert GOTPCREL relocation against large section.  */
1642   if (elf_section_data (tsec) !=  NULL
1643       && (elf_section_flags (tsec) & SHF_X86_64_LARGE) != 0)
1644     return TRUE;
1645 
1646   /* Skip since R_X86_64_PC32/R_X86_64_32/R_X86_64_32S may overflow.  */
1647   if (no_overflow)
1648     return TRUE;
1649 
1650 convert:
1651   if (opcode == 0xff)
1652     {
1653       /* We have "call/jmp *foo@GOTPCREL(%rip)".  */
1654       unsigned int nop;
1655       unsigned int disp;
1656       bfd_vma nop_offset;
1657 
1658       /* Convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX to
1659 	 R_X86_64_PC32.  */
1660       modrm = bfd_get_8 (abfd, contents + roff - 1);
1661       if (modrm == 0x25)
1662 	{
1663 	  /* Convert to "jmp foo nop".  */
1664 	  modrm = 0xe9;
1665 	  nop = NOP_OPCODE;
1666 	  nop_offset = irel->r_offset + 3;
1667 	  disp = bfd_get_32 (abfd, contents + irel->r_offset);
1668 	  irel->r_offset -= 1;
1669 	  bfd_put_32 (abfd, disp, contents + irel->r_offset);
1670 	}
1671       else
1672 	{
1673 	  struct elf_x86_link_hash_entry *eh
1674 	    = (struct elf_x86_link_hash_entry *) h;
1675 
1676 	  /* Convert to "nop call foo".  ADDR_PREFIX_OPCODE
1677 	     is a nop prefix.  */
1678 	  modrm = 0xe8;
1679 	  /* To support TLS optimization, always use addr32 prefix for
1680 	     "call *__tls_get_addr@GOTPCREL(%rip)".  */
1681 	  if (eh && eh->tls_get_addr)
1682 	    {
1683 	      nop = 0x67;
1684 	      nop_offset = irel->r_offset - 2;
1685 	    }
1686 	  else
1687 	    {
1688 	      nop = htab->params->call_nop_byte;
1689 	      if (htab->params->call_nop_as_suffix)
1690 		{
1691 		  nop_offset = irel->r_offset + 3;
1692 		  disp = bfd_get_32 (abfd, contents + irel->r_offset);
1693 		  irel->r_offset -= 1;
1694 		  bfd_put_32 (abfd, disp, contents + irel->r_offset);
1695 		}
1696 	      else
1697 		nop_offset = irel->r_offset - 2;
1698 	    }
1699 	}
1700       bfd_put_8 (abfd, nop, contents + nop_offset);
1701       bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
1702       r_type = R_X86_64_PC32;
1703     }
1704   else
1705     {
1706       unsigned int rex;
1707       unsigned int rex_mask = REX_R;
1708 
1709       if (r_type == R_X86_64_REX_GOTPCRELX)
1710 	rex = bfd_get_8 (abfd, contents + roff - 3);
1711       else
1712 	rex = 0;
1713 
1714       if (opcode == 0x8b)
1715 	{
1716 	  if (to_reloc_pc32)
1717 	    {
1718 	      /* Convert "mov foo@GOTPCREL(%rip), %reg" to
1719 		 "lea foo(%rip), %reg".  */
1720 	      opcode = 0x8d;
1721 	      r_type = R_X86_64_PC32;
1722 	    }
1723 	  else
1724 	    {
1725 	      /* Convert "mov foo@GOTPCREL(%rip), %reg" to
1726 		 "mov $foo, %reg".  */
1727 	      opcode = 0xc7;
1728 	      modrm = bfd_get_8 (abfd, contents + roff - 1);
1729 	      modrm = 0xc0 | (modrm & 0x38) >> 3;
1730 	      if ((rex & REX_W) != 0
1731 		  && ABI_64_P (link_info->output_bfd))
1732 		{
1733 		  /* Keep the REX_W bit in REX byte for LP64.  */
1734 		  r_type = R_X86_64_32S;
1735 		  goto rewrite_modrm_rex;
1736 		}
1737 	      else
1738 		{
1739 		  /* If the REX_W bit in REX byte isn't needed,
1740 		     use R_X86_64_32 and clear the W bit to avoid
1741 		     sign-extend imm32 to imm64.  */
1742 		  r_type = R_X86_64_32;
1743 		  /* Clear the W bit in REX byte.  */
1744 		  rex_mask |= REX_W;
1745 		  goto rewrite_modrm_rex;
1746 		}
1747 	    }
1748 	}
1749       else
1750 	{
1751 	  /* R_X86_64_PC32 isn't supported.  */
1752 	  if (to_reloc_pc32)
1753 	    return TRUE;
1754 
1755 	  modrm = bfd_get_8 (abfd, contents + roff - 1);
1756 	  if (opcode == 0x85)
1757 	    {
1758 	      /* Convert "test %reg, foo@GOTPCREL(%rip)" to
1759 		 "test $foo, %reg".  */
1760 	      modrm = 0xc0 | (modrm & 0x38) >> 3;
1761 	      opcode = 0xf7;
1762 	    }
1763 	  else
1764 	    {
1765 	      /* Convert "binop foo@GOTPCREL(%rip), %reg" to
1766 		 "binop $foo, %reg".  */
1767 	      modrm = 0xc0 | (modrm & 0x38) >> 3 | (opcode & 0x3c);
1768 	      opcode = 0x81;
1769 	    }
1770 
1771 	  /* Use R_X86_64_32 with 32-bit operand to avoid relocation
1772 	     overflow when sign-extending imm32 to imm64.  */
1773 	  r_type = (rex & REX_W) != 0 ? R_X86_64_32S : R_X86_64_32;
1774 
1775 rewrite_modrm_rex:
1776 	  bfd_put_8 (abfd, modrm, contents + roff - 1);
1777 
1778 	  if (rex)
1779 	    {
1780 	      /* Move the R bit to the B bit in REX byte.  */
1781 	      rex = (rex & ~rex_mask) | (rex & REX_R) >> 2;
1782 	      bfd_put_8 (abfd, rex, contents + roff - 3);
1783 	    }
1784 
1785 	  /* No addend for R_X86_64_32/R_X86_64_32S relocations.  */
1786 	  irel->r_addend = 0;
1787 	}
1788 
1789       bfd_put_8 (abfd, opcode, contents + roff - 2);
1790     }
1791 
1792   *r_type_p = r_type;
1793   irel->r_info = htab->r_info (r_symndx,
1794 			       r_type | R_X86_64_converted_reloc_bit);
1795 
1796   *converted = TRUE;
1797 
1798   return TRUE;
1799 }
1800 
1801 /* Look through the relocs for a section during the first phase, and
1802    calculate needed space in the global offset table, procedure
1803    linkage table, and dynamic reloc sections.  */
1804 
1805 static bfd_boolean
1806 elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
1807 			 asection *sec,
1808 			 const Elf_Internal_Rela *relocs)
1809 {
1810   struct elf_x86_link_hash_table *htab;
1811   Elf_Internal_Shdr *symtab_hdr;
1812   struct elf_link_hash_entry **sym_hashes;
1813   const Elf_Internal_Rela *rel;
1814   const Elf_Internal_Rela *rel_end;
1815   asection *sreloc;
1816   bfd_byte *contents;
1817   bfd_boolean converted;
1818 
1819   if (bfd_link_relocatable (info))
1820     return TRUE;
1821 
1822   /* Don't do anything special with non-loaded, non-alloced sections.
1823      In particular, any relocs in such sections should not affect GOT
1824      and PLT reference counting (ie. we don't allow them to create GOT
1825      or PLT entries), there's no possibility or desire to optimize TLS
1826      relocs, and there's not much point in propagating relocs to shared
1827      libs that the dynamic linker won't relocate.  */
1828   if ((sec->flags & SEC_ALLOC) == 0)
1829     return TRUE;
1830 
1831   htab = elf_x86_hash_table (info, X86_64_ELF_DATA);
1832   if (htab == NULL)
1833     {
1834       sec->check_relocs_failed = 1;
1835       return FALSE;
1836     }
1837 
1838   BFD_ASSERT (is_x86_elf (abfd, htab));
1839 
1840   /* Get the section contents.  */
1841   if (elf_section_data (sec)->this_hdr.contents != NULL)
1842     contents = elf_section_data (sec)->this_hdr.contents;
1843   else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1844     {
1845       sec->check_relocs_failed = 1;
1846       return FALSE;
1847     }
1848 
1849   symtab_hdr = &elf_symtab_hdr (abfd);
1850   sym_hashes = elf_sym_hashes (abfd);
1851 
1852   converted = FALSE;
1853 
1854   sreloc = NULL;
1855 
1856   rel_end = relocs + sec->reloc_count;
1857   for (rel = relocs; rel < rel_end; rel++)
1858     {
1859       unsigned int r_type;
1860       unsigned int r_symndx;
1861       struct elf_link_hash_entry *h;
1862       struct elf_x86_link_hash_entry *eh;
1863       Elf_Internal_Sym *isym;
1864       const char *name;
1865       bfd_boolean size_reloc;
1866       bfd_boolean converted_reloc;
1867 
1868       r_symndx = htab->r_sym (rel->r_info);
1869       r_type = ELF32_R_TYPE (rel->r_info);
1870 
1871       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1872 	{
1873 	  /* xgettext:c-format */
1874 	  _bfd_error_handler (_("%pB: bad symbol index: %d"),
1875 			      abfd, r_symndx);
1876 	  goto error_return;
1877 	}
1878 
1879       if (r_symndx < symtab_hdr->sh_info)
1880 	{
1881 	  /* A local symbol.  */
1882 	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1883 					abfd, r_symndx);
1884 	  if (isym == NULL)
1885 	    goto error_return;
1886 
1887 	  /* Check relocation against local STT_GNU_IFUNC symbol.  */
1888 	  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1889 	    {
1890 	      h = _bfd_elf_x86_get_local_sym_hash (htab, abfd, rel,
1891 						   TRUE);
1892 	      if (h == NULL)
1893 		goto error_return;
1894 
1895 	      /* Fake a STT_GNU_IFUNC symbol.  */
1896 	      h->root.root.string = bfd_elf_sym_name (abfd, symtab_hdr,
1897 						      isym, NULL);
1898 	      h->type = STT_GNU_IFUNC;
1899 	      h->def_regular = 1;
1900 	      h->ref_regular = 1;
1901 	      h->forced_local = 1;
1902 	      h->root.type = bfd_link_hash_defined;
1903 	    }
1904 	  else
1905 	    h = NULL;
1906 	}
1907       else
1908 	{
1909 	  isym = NULL;
1910 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1911 	  while (h->root.type == bfd_link_hash_indirect
1912 		 || h->root.type == bfd_link_hash_warning)
1913 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1914 	}
1915 
1916       /* Check invalid x32 relocations.  */
1917       if (!ABI_64_P (abfd))
1918 	switch (r_type)
1919 	  {
1920 	  default:
1921 	    break;
1922 
1923 	  case R_X86_64_DTPOFF64:
1924 	  case R_X86_64_TPOFF64:
1925 	  case R_X86_64_PC64:
1926 	  case R_X86_64_GOTOFF64:
1927 	  case R_X86_64_GOT64:
1928 	  case R_X86_64_GOTPCREL64:
1929 	  case R_X86_64_GOTPC64:
1930 	  case R_X86_64_GOTPLT64:
1931 	  case R_X86_64_PLTOFF64:
1932 	      {
1933 		if (h)
1934 		  name = h->root.root.string;
1935 		else
1936 		  name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1937 					   NULL);
1938 		_bfd_error_handler
1939 		  /* xgettext:c-format */
1940 		  (_("%pB: relocation %s against symbol `%s' isn't "
1941 		     "supported in x32 mode"), abfd,
1942 		   x86_64_elf_howto_table[r_type].name, name);
1943 		bfd_set_error (bfd_error_bad_value);
1944 		goto error_return;
1945 	      }
1946 	    break;
1947 	  }
1948 
1949       if (h != NULL)
1950 	{
1951 	  /* It is referenced by a non-shared object. */
1952 	  h->ref_regular = 1;
1953 	}
1954 
1955       converted_reloc = FALSE;
1956       if ((r_type == R_X86_64_GOTPCREL
1957 	   || r_type == R_X86_64_GOTPCRELX
1958 	   || r_type == R_X86_64_REX_GOTPCRELX)
1959 	  && (h == NULL || h->type != STT_GNU_IFUNC))
1960 	{
1961 	  Elf_Internal_Rela *irel = (Elf_Internal_Rela *) rel;
1962 	  if (!elf_x86_64_convert_load_reloc (abfd, contents, &r_type,
1963 					      irel, h, &converted_reloc,
1964 					      info))
1965 	    goto error_return;
1966 
1967 	  if (converted_reloc)
1968 	    converted = TRUE;
1969 	}
1970 
1971       if (! elf_x86_64_tls_transition (info, abfd, sec, contents,
1972 				       symtab_hdr, sym_hashes,
1973 				       &r_type, GOT_UNKNOWN,
1974 				       rel, rel_end, h, r_symndx, FALSE))
1975 	goto error_return;
1976 
1977       /* Check if _GLOBAL_OFFSET_TABLE_ is referenced.  */
1978       if (h == htab->elf.hgot)
1979 	htab->got_referenced = TRUE;
1980 
1981       eh = (struct elf_x86_link_hash_entry *) h;
1982       switch (r_type)
1983 	{
1984 	case R_X86_64_TLSLD:
1985 	  htab->tls_ld_or_ldm_got.refcount = 1;
1986 	  goto create_got;
1987 
1988 	case R_X86_64_TPOFF32:
1989 	  if (!bfd_link_executable (info) && ABI_64_P (abfd))
1990 	    return elf_x86_64_need_pic (info, abfd, sec, h, symtab_hdr, isym,
1991 					&x86_64_elf_howto_table[r_type]);
1992 	  if (eh != NULL)
1993 	    eh->zero_undefweak &= 0x2;
1994 	  break;
1995 
1996 	case R_X86_64_GOTTPOFF:
1997 	  if (!bfd_link_executable (info))
1998 	    info->flags |= DF_STATIC_TLS;
1999 	  /* Fall through */
2000 
2001 	case R_X86_64_GOT32:
2002 	case R_X86_64_GOTPCREL:
2003 	case R_X86_64_GOTPCRELX:
2004 	case R_X86_64_REX_GOTPCRELX:
2005 	case R_X86_64_TLSGD:
2006 	case R_X86_64_GOT64:
2007 	case R_X86_64_GOTPCREL64:
2008 	case R_X86_64_GOTPLT64:
2009 	case R_X86_64_GOTPC32_TLSDESC:
2010 	case R_X86_64_TLSDESC_CALL:
2011 	  /* This symbol requires a global offset table entry.	*/
2012 	  {
2013 	    int tls_type, old_tls_type;
2014 
2015 	    switch (r_type)
2016 	      {
2017 	      default: tls_type = GOT_NORMAL; break;
2018 	      case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break;
2019 	      case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break;
2020 	      case R_X86_64_GOTPC32_TLSDESC:
2021 	      case R_X86_64_TLSDESC_CALL:
2022 		tls_type = GOT_TLS_GDESC; break;
2023 	      }
2024 
2025 	    if (h != NULL)
2026 	      {
2027 		h->got.refcount = 1;
2028 		old_tls_type = eh->tls_type;
2029 	      }
2030 	    else
2031 	      {
2032 		bfd_signed_vma *local_got_refcounts;
2033 
2034 		/* This is a global offset table entry for a local symbol.  */
2035 		local_got_refcounts = elf_local_got_refcounts (abfd);
2036 		if (local_got_refcounts == NULL)
2037 		  {
2038 		    bfd_size_type size;
2039 
2040 		    size = symtab_hdr->sh_info;
2041 		    size *= sizeof (bfd_signed_vma)
2042 		      + sizeof (bfd_vma) + sizeof (char);
2043 		    local_got_refcounts = ((bfd_signed_vma *)
2044 					   bfd_zalloc (abfd, size));
2045 		    if (local_got_refcounts == NULL)
2046 		      goto error_return;
2047 		    elf_local_got_refcounts (abfd) = local_got_refcounts;
2048 		    elf_x86_local_tlsdesc_gotent (abfd)
2049 		      = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
2050 		    elf_x86_local_got_tls_type (abfd)
2051 		      = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
2052 		  }
2053 		local_got_refcounts[r_symndx] = 1;
2054 		old_tls_type
2055 		  = elf_x86_local_got_tls_type (abfd) [r_symndx];
2056 	      }
2057 
2058 	    /* If a TLS symbol is accessed using IE at least once,
2059 	       there is no point to use dynamic model for it.  */
2060 	    if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
2061 		&& (! GOT_TLS_GD_ANY_P (old_tls_type)
2062 		    || tls_type != GOT_TLS_IE))
2063 	      {
2064 		if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type))
2065 		  tls_type = old_tls_type;
2066 		else if (GOT_TLS_GD_ANY_P (old_tls_type)
2067 			 && GOT_TLS_GD_ANY_P (tls_type))
2068 		  tls_type |= old_tls_type;
2069 		else
2070 		  {
2071 		    if (h)
2072 		      name = h->root.root.string;
2073 		    else
2074 		      name = bfd_elf_sym_name (abfd, symtab_hdr,
2075 					       isym, NULL);
2076 		    _bfd_error_handler
2077 		      /* xgettext:c-format */
2078 		      (_("%pB: '%s' accessed both as normal and"
2079 			 " thread local symbol"),
2080 		       abfd, name);
2081 		    bfd_set_error (bfd_error_bad_value);
2082 		    goto error_return;
2083 		  }
2084 	      }
2085 
2086 	    if (old_tls_type != tls_type)
2087 	      {
2088 		if (eh != NULL)
2089 		  eh->tls_type = tls_type;
2090 		else
2091 		  elf_x86_local_got_tls_type (abfd) [r_symndx] = tls_type;
2092 	      }
2093 	  }
2094 	  /* Fall through */
2095 
2096 	case R_X86_64_GOTOFF64:
2097 	case R_X86_64_GOTPC32:
2098 	case R_X86_64_GOTPC64:
2099 	create_got:
2100 	  if (eh != NULL)
2101 	    eh->zero_undefweak &= 0x2;
2102 	  break;
2103 
2104 	case R_X86_64_PLT32:
2105 	case R_X86_64_PLT32_BND:
2106 	  /* This symbol requires a procedure linkage table entry.  We
2107 	     actually build the entry in adjust_dynamic_symbol,
2108 	     because this might be a case of linking PIC code which is
2109 	     never referenced by a dynamic object, in which case we
2110 	     don't need to generate a procedure linkage table entry
2111 	     after all.	 */
2112 
2113 	  /* If this is a local symbol, we resolve it directly without
2114 	     creating a procedure linkage table entry.	*/
2115 	  if (h == NULL)
2116 	    continue;
2117 
2118 	  eh->zero_undefweak &= 0x2;
2119 	  h->needs_plt = 1;
2120 	  h->plt.refcount = 1;
2121 	  break;
2122 
2123 	case R_X86_64_PLTOFF64:
2124 	  /* This tries to form the 'address' of a function relative
2125 	     to GOT.  For global symbols we need a PLT entry.  */
2126 	  if (h != NULL)
2127 	    {
2128 	      h->needs_plt = 1;
2129 	      h->plt.refcount = 1;
2130 	    }
2131 	  goto create_got;
2132 
2133 	case R_X86_64_SIZE32:
2134 	case R_X86_64_SIZE64:
2135 	  size_reloc = TRUE;
2136 	  goto do_size;
2137 
2138 	case R_X86_64_32:
2139 	  if (!ABI_64_P (abfd))
2140 	    goto pointer;
2141 	  /* Fall through.  */
2142 	case R_X86_64_8:
2143 	case R_X86_64_16:
2144 	case R_X86_64_32S:
2145 	  /* Check relocation overflow as these relocs may lead to
2146 	     run-time relocation overflow.  Don't error out for
2147 	     sections we don't care about, such as debug sections or
2148 	     when relocation overflow check is disabled.  */
2149 	  if (!htab->params->no_reloc_overflow_check
2150 	      && !converted_reloc
2151 	      && (bfd_link_pic (info)
2152 		  || (bfd_link_executable (info)
2153 		      && h != NULL
2154 		      && !h->def_regular
2155 		      && h->def_dynamic
2156 		      && (sec->flags & SEC_READONLY) == 0)))
2157 	    return elf_x86_64_need_pic (info, abfd, sec, h, symtab_hdr, isym,
2158 					&x86_64_elf_howto_table[r_type]);
2159 	  /* Fall through.  */
2160 
2161 	case R_X86_64_PC8:
2162 	case R_X86_64_PC16:
2163 	case R_X86_64_PC32:
2164 	case R_X86_64_PC32_BND:
2165 	case R_X86_64_PC64:
2166 	case R_X86_64_64:
2167 pointer:
2168 	  if (eh != NULL && (sec->flags & SEC_CODE) != 0)
2169 	    eh->zero_undefweak |= 0x2;
2170 	  /* We are called after all symbols have been resolved.  Only
2171 	     relocation against STT_GNU_IFUNC symbol must go through
2172 	     PLT.  */
2173 	  if (h != NULL
2174 	      && (bfd_link_executable (info)
2175 		  || h->type == STT_GNU_IFUNC))
2176 	    {
2177 	      bfd_boolean func_pointer_ref = FALSE;
2178 
2179 	      if (r_type == R_X86_64_PC32)
2180 		{
2181 		  /* Since something like ".long foo - ." may be used
2182 		     as pointer, make sure that PLT is used if foo is
2183 		     a function defined in a shared library.  */
2184 		  if ((sec->flags & SEC_CODE) == 0)
2185 		    {
2186 		      h->pointer_equality_needed = 1;
2187 		      if (bfd_link_pie (info)
2188 			  && h->type == STT_FUNC
2189 			  && !h->def_regular
2190 			  && h->def_dynamic)
2191 			{
2192 			  h->needs_plt = 1;
2193 			  h->plt.refcount = 1;
2194 			}
2195 		    }
2196 		}
2197 	      else if (r_type != R_X86_64_PC32_BND
2198 		       && r_type != R_X86_64_PC64)
2199 		{
2200 		  h->pointer_equality_needed = 1;
2201 		  /* At run-time, R_X86_64_64 can be resolved for both
2202 		     x86-64 and x32. But R_X86_64_32 and R_X86_64_32S
2203 		     can only be resolved for x32.  */
2204 		  if ((sec->flags & SEC_READONLY) == 0
2205 		      && (r_type == R_X86_64_64
2206 			  || (!ABI_64_P (abfd)
2207 			      && (r_type == R_X86_64_32
2208 				  || r_type == R_X86_64_32S))))
2209 		    func_pointer_ref = TRUE;
2210 		}
2211 
2212 	      if (!func_pointer_ref)
2213 		{
2214 		  /* If this reloc is in a read-only section, we might
2215 		     need a copy reloc.  We can't check reliably at this
2216 		     stage whether the section is read-only, as input
2217 		     sections have not yet been mapped to output sections.
2218 		     Tentatively set the flag for now, and correct in
2219 		     adjust_dynamic_symbol.  */
2220 		  h->non_got_ref = 1;
2221 
2222 		  /* We may need a .plt entry if the symbol is a function
2223 		     defined in a shared lib or is a function referenced
2224 		     from the code or read-only section.  */
2225 		  if (!h->def_regular
2226 		      || (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
2227 		    h->plt.refcount = 1;
2228 		}
2229 	    }
2230 
2231 	  size_reloc = FALSE;
2232 do_size:
2233 	  if (NEED_DYNAMIC_RELOCATION_P (info, TRUE, h, sec, r_type,
2234 					 htab->pointer_r_type))
2235 	    {
2236 	      struct elf_dyn_relocs *p;
2237 	      struct elf_dyn_relocs **head;
2238 
2239 	      /* We must copy these reloc types into the output file.
2240 		 Create a reloc section in dynobj and make room for
2241 		 this reloc.  */
2242 	      if (sreloc == NULL)
2243 		{
2244 		  sreloc = _bfd_elf_make_dynamic_reloc_section
2245 		    (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2,
2246 		     abfd, /*rela?*/ TRUE);
2247 
2248 		  if (sreloc == NULL)
2249 		    goto error_return;
2250 		}
2251 
2252 	      /* If this is a global symbol, we count the number of
2253 		 relocations we need for this symbol.  */
2254 	      if (h != NULL)
2255 		head = &eh->dyn_relocs;
2256 	      else
2257 		{
2258 		  /* Track dynamic relocs needed for local syms too.
2259 		     We really need local syms available to do this
2260 		     easily.  Oh well.  */
2261 		  asection *s;
2262 		  void **vpp;
2263 
2264 		  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2265 						abfd, r_symndx);
2266 		  if (isym == NULL)
2267 		    goto error_return;
2268 
2269 		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2270 		  if (s == NULL)
2271 		    s = sec;
2272 
2273 		  /* Beware of type punned pointers vs strict aliasing
2274 		     rules.  */
2275 		  vpp = &(elf_section_data (s)->local_dynrel);
2276 		  head = (struct elf_dyn_relocs **)vpp;
2277 		}
2278 
2279 	      p = *head;
2280 	      if (p == NULL || p->sec != sec)
2281 		{
2282 		  bfd_size_type amt = sizeof *p;
2283 
2284 		  p = ((struct elf_dyn_relocs *)
2285 		       bfd_alloc (htab->elf.dynobj, amt));
2286 		  if (p == NULL)
2287 		    goto error_return;
2288 		  p->next = *head;
2289 		  *head = p;
2290 		  p->sec = sec;
2291 		  p->count = 0;
2292 		  p->pc_count = 0;
2293 		}
2294 
2295 	      p->count += 1;
2296 	      /* Count size relocation as PC-relative relocation.  */
2297 	      if (X86_PCREL_TYPE_P (r_type) || size_reloc)
2298 		p->pc_count += 1;
2299 	    }
2300 	  break;
2301 
2302 	  /* This relocation describes the C++ object vtable hierarchy.
2303 	     Reconstruct it for later use during GC.  */
2304 	case R_X86_64_GNU_VTINHERIT:
2305 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2306 	    goto error_return;
2307 	  break;
2308 
2309 	  /* This relocation describes which C++ vtable entries are actually
2310 	     used.  Record for later use during GC.  */
2311 	case R_X86_64_GNU_VTENTRY:
2312 	  if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2313 	    goto error_return;
2314 	  break;
2315 
2316 	default:
2317 	  break;
2318 	}
2319     }
2320 
2321   if (elf_section_data (sec)->this_hdr.contents != contents)
2322     {
2323       if (!converted && !info->keep_memory)
2324 	free (contents);
2325       else
2326 	{
2327 	  /* Cache the section contents for elf_link_input_bfd if any
2328 	     load is converted or --no-keep-memory isn't used.  */
2329 	  elf_section_data (sec)->this_hdr.contents = contents;
2330 	}
2331     }
2332 
2333   /* Cache relocations if any load is converted.  */
2334   if (elf_section_data (sec)->relocs != relocs && converted)
2335     elf_section_data (sec)->relocs = (Elf_Internal_Rela *) relocs;
2336 
2337   return TRUE;
2338 
2339 error_return:
2340   if (elf_section_data (sec)->this_hdr.contents != contents)
2341     free (contents);
2342   sec->check_relocs_failed = 1;
2343   return FALSE;
2344 }
2345 
2346 /* Return the relocation value for @tpoff relocation
2347    if STT_TLS virtual address is ADDRESS.  */
2348 
2349 static bfd_vma
2350 elf_x86_64_tpoff (struct bfd_link_info *info, bfd_vma address)
2351 {
2352   struct elf_link_hash_table *htab = elf_hash_table (info);
2353   const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
2354   bfd_vma static_tls_size;
2355 
2356   /* If tls_segment is NULL, we should have signalled an error already.  */
2357   if (htab->tls_sec == NULL)
2358     return 0;
2359 
2360   /* Consider special static TLS alignment requirements.  */
2361   static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
2362   return address - static_tls_size - htab->tls_sec->vma;
2363 }
2364 
2365 /* Relocate an x86_64 ELF section.  */
2366 
2367 static bfd_boolean
2368 elf_x86_64_relocate_section (bfd *output_bfd,
2369 			     struct bfd_link_info *info,
2370 			     bfd *input_bfd,
2371 			     asection *input_section,
2372 			     bfd_byte *contents,
2373 			     Elf_Internal_Rela *relocs,
2374 			     Elf_Internal_Sym *local_syms,
2375 			     asection **local_sections)
2376 {
2377   struct elf_x86_link_hash_table *htab;
2378   Elf_Internal_Shdr *symtab_hdr;
2379   struct elf_link_hash_entry **sym_hashes;
2380   bfd_vma *local_got_offsets;
2381   bfd_vma *local_tlsdesc_gotents;
2382   Elf_Internal_Rela *rel;
2383   Elf_Internal_Rela *wrel;
2384   Elf_Internal_Rela *relend;
2385   unsigned int plt_entry_size;
2386 
2387   /* Skip if check_relocs failed.  */
2388   if (input_section->check_relocs_failed)
2389     return FALSE;
2390 
2391   htab = elf_x86_hash_table (info, X86_64_ELF_DATA);
2392   if (htab == NULL)
2393     return FALSE;
2394 
2395   if (!is_x86_elf (input_bfd, htab))
2396     {
2397       bfd_set_error (bfd_error_wrong_format);
2398       return FALSE;
2399     }
2400 
2401   plt_entry_size = htab->plt.plt_entry_size;
2402   symtab_hdr = &elf_symtab_hdr (input_bfd);
2403   sym_hashes = elf_sym_hashes (input_bfd);
2404   local_got_offsets = elf_local_got_offsets (input_bfd);
2405   local_tlsdesc_gotents = elf_x86_local_tlsdesc_gotent (input_bfd);
2406 
2407   _bfd_x86_elf_set_tls_module_base (info);
2408 
2409   rel = wrel = relocs;
2410   relend = relocs + input_section->reloc_count;
2411   for (; rel < relend; wrel++, rel++)
2412     {
2413       unsigned int r_type, r_type_tls;
2414       reloc_howto_type *howto;
2415       unsigned long r_symndx;
2416       struct elf_link_hash_entry *h;
2417       struct elf_x86_link_hash_entry *eh;
2418       Elf_Internal_Sym *sym;
2419       asection *sec;
2420       bfd_vma off, offplt, plt_offset;
2421       bfd_vma relocation;
2422       bfd_boolean unresolved_reloc;
2423       bfd_reloc_status_type r;
2424       int tls_type;
2425       asection *base_got, *resolved_plt;
2426       bfd_vma st_size;
2427       bfd_boolean resolved_to_zero;
2428       bfd_boolean relative_reloc;
2429       bfd_boolean converted_reloc;
2430       bfd_boolean need_copy_reloc_in_pie;
2431       bfd_boolean no_copyreloc_p;
2432 
2433       r_type = ELF32_R_TYPE (rel->r_info);
2434       if (r_type == (int) R_X86_64_GNU_VTINHERIT
2435 	  || r_type == (int) R_X86_64_GNU_VTENTRY)
2436 	{
2437 	  if (wrel != rel)
2438 	    *wrel = *rel;
2439 	  continue;
2440 	}
2441 
2442       r_symndx = htab->r_sym (rel->r_info);
2443       converted_reloc = (r_type & R_X86_64_converted_reloc_bit) != 0;
2444       if (converted_reloc)
2445 	{
2446 	  r_type &= ~R_X86_64_converted_reloc_bit;
2447 	  rel->r_info = htab->r_info (r_symndx, r_type);
2448 	}
2449 
2450       howto = elf_x86_64_rtype_to_howto (input_bfd, r_type);
2451       if (howto == NULL)
2452 	return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
2453 
2454       h = NULL;
2455       sym = NULL;
2456       sec = NULL;
2457       unresolved_reloc = FALSE;
2458       if (r_symndx < symtab_hdr->sh_info)
2459 	{
2460 	  sym = local_syms + r_symndx;
2461 	  sec = local_sections[r_symndx];
2462 
2463 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym,
2464 						&sec, rel);
2465 	  st_size = sym->st_size;
2466 
2467 	  /* Relocate against local STT_GNU_IFUNC symbol.  */
2468 	  if (!bfd_link_relocatable (info)
2469 	      && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
2470 	    {
2471 	      h = _bfd_elf_x86_get_local_sym_hash (htab, input_bfd,
2472 						   rel, FALSE);
2473 	      if (h == NULL)
2474 		abort ();
2475 
2476 	      /* Set STT_GNU_IFUNC symbol value.  */
2477 	      h->root.u.def.value = sym->st_value;
2478 	      h->root.u.def.section = sec;
2479 	    }
2480 	}
2481       else
2482 	{
2483 	  bfd_boolean warned ATTRIBUTE_UNUSED;
2484 	  bfd_boolean ignored ATTRIBUTE_UNUSED;
2485 
2486 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2487 				   r_symndx, symtab_hdr, sym_hashes,
2488 				   h, sec, relocation,
2489 				   unresolved_reloc, warned, ignored);
2490 	  st_size = h->size;
2491 	}
2492 
2493       if (sec != NULL && discarded_section (sec))
2494 	{
2495 	  _bfd_clear_contents (howto, input_bfd, input_section,
2496 			       contents, rel->r_offset);
2497 	  wrel->r_offset = rel->r_offset;
2498 	  wrel->r_info = 0;
2499 	  wrel->r_addend = 0;
2500 
2501 	  /* For ld -r, remove relocations in debug sections against
2502 	     sections defined in discarded sections.  Not done for
2503 	     eh_frame editing code expects to be present.  */
2504 	   if (bfd_link_relocatable (info)
2505 	       && (input_section->flags & SEC_DEBUGGING))
2506 	     wrel--;
2507 
2508 	  continue;
2509 	}
2510 
2511       if (bfd_link_relocatable (info))
2512 	{
2513 	  if (wrel != rel)
2514 	    *wrel = *rel;
2515 	  continue;
2516 	}
2517 
2518       if (rel->r_addend == 0 && !ABI_64_P (output_bfd))
2519 	{
2520 	  if (r_type == R_X86_64_64)
2521 	    {
2522 	      /* For x32, treat R_X86_64_64 like R_X86_64_32 and
2523 		 zero-extend it to 64bit if addend is zero.  */
2524 	      r_type = R_X86_64_32;
2525 	      memset (contents + rel->r_offset + 4, 0, 4);
2526 	    }
2527 	  else if (r_type == R_X86_64_SIZE64)
2528 	    {
2529 	      /* For x32, treat R_X86_64_SIZE64 like R_X86_64_SIZE32 and
2530 		 zero-extend it to 64bit if addend is zero.  */
2531 	      r_type = R_X86_64_SIZE32;
2532 	      memset (contents + rel->r_offset + 4, 0, 4);
2533 	    }
2534 	}
2535 
2536       eh = (struct elf_x86_link_hash_entry *) h;
2537 
2538       /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
2539 	 it here if it is defined in a non-shared object.  */
2540       if (h != NULL
2541 	  && h->type == STT_GNU_IFUNC
2542 	  && h->def_regular)
2543 	{
2544 	  bfd_vma plt_index;
2545 	  const char *name;
2546 
2547 	  if ((input_section->flags & SEC_ALLOC) == 0)
2548 	    {
2549 	      /* If this is a SHT_NOTE section without SHF_ALLOC, treat
2550 	         STT_GNU_IFUNC symbol as STT_FUNC.  */
2551 	      if (elf_section_type (input_section) == SHT_NOTE)
2552 		goto skip_ifunc;
2553 	      /* Dynamic relocs are not propagated for SEC_DEBUGGING
2554 		 sections because such sections are not SEC_ALLOC and
2555 		 thus ld.so will not process them.  */
2556 	      if ((input_section->flags & SEC_DEBUGGING) != 0)
2557 		continue;
2558 	      abort ();
2559 	    }
2560 
2561 	  switch (r_type)
2562 	    {
2563 	    default:
2564 	      break;
2565 
2566 	    case R_X86_64_GOTPCREL:
2567 	    case R_X86_64_GOTPCRELX:
2568 	    case R_X86_64_REX_GOTPCRELX:
2569 	    case R_X86_64_GOTPCREL64:
2570 	      base_got = htab->elf.sgot;
2571 	      off = h->got.offset;
2572 
2573 	      if (base_got == NULL)
2574 		abort ();
2575 
2576 	      if (off == (bfd_vma) -1)
2577 		{
2578 		  /* We can't use h->got.offset here to save state, or
2579 		     even just remember the offset, as finish_dynamic_symbol
2580 		     would use that as offset into .got.  */
2581 
2582 		  if (h->plt.offset == (bfd_vma) -1)
2583 		    abort ();
2584 
2585 		  if (htab->elf.splt != NULL)
2586 		    {
2587 		      plt_index = (h->plt.offset / plt_entry_size
2588 				   - htab->plt.has_plt0);
2589 		      off = (plt_index + 3) * GOT_ENTRY_SIZE;
2590 		      base_got = htab->elf.sgotplt;
2591 		    }
2592 		  else
2593 		    {
2594 		      plt_index = h->plt.offset / plt_entry_size;
2595 		      off = plt_index * GOT_ENTRY_SIZE;
2596 		      base_got = htab->elf.igotplt;
2597 		    }
2598 
2599 		  if (h->dynindx == -1
2600 		      || h->forced_local
2601 		      || info->symbolic)
2602 		    {
2603 		      /* This references the local defitionion.  We must
2604 			 initialize this entry in the global offset table.
2605 			 Since the offset must always be a multiple of 8,
2606 			 we use the least significant bit to record
2607 			 whether we have initialized it already.
2608 
2609 			 When doing a dynamic link, we create a .rela.got
2610 			 relocation entry to initialize the value.  This
2611 			 is done in the finish_dynamic_symbol routine.	 */
2612 		      if ((off & 1) != 0)
2613 			off &= ~1;
2614 		      else
2615 			{
2616 			  bfd_put_64 (output_bfd, relocation,
2617 				      base_got->contents + off);
2618 			  /* Note that this is harmless for the GOTPLT64
2619 			     case, as -1 | 1 still is -1.  */
2620 			  h->got.offset |= 1;
2621 			}
2622 		    }
2623 		}
2624 
2625 	      relocation = (base_got->output_section->vma
2626 			    + base_got->output_offset + off);
2627 
2628 	      goto do_relocation;
2629 	    }
2630 
2631 	  if (h->plt.offset == (bfd_vma) -1)
2632 	    {
2633 	      /* Handle static pointers of STT_GNU_IFUNC symbols.  */
2634 	      if (r_type == htab->pointer_r_type
2635 		  && (input_section->flags & SEC_CODE) == 0)
2636 		goto do_ifunc_pointer;
2637 	      goto bad_ifunc_reloc;
2638 	    }
2639 
2640 	  /* STT_GNU_IFUNC symbol must go through PLT.  */
2641 	  if (htab->elf.splt != NULL)
2642 	    {
2643 	      if (htab->plt_second != NULL)
2644 		{
2645 		  resolved_plt = htab->plt_second;
2646 		  plt_offset = eh->plt_second.offset;
2647 		}
2648 	      else
2649 		{
2650 		  resolved_plt = htab->elf.splt;
2651 		  plt_offset =  h->plt.offset;
2652 		}
2653 	    }
2654 	  else
2655 	    {
2656 	      resolved_plt = htab->elf.iplt;
2657 	      plt_offset =  h->plt.offset;
2658 	    }
2659 
2660 	  relocation = (resolved_plt->output_section->vma
2661 			+ resolved_plt->output_offset + plt_offset);
2662 
2663 	  switch (r_type)
2664 	    {
2665 	    default:
2666 bad_ifunc_reloc:
2667 	      if (h->root.root.string)
2668 		name = h->root.root.string;
2669 	      else
2670 		name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
2671 					 NULL);
2672 	      _bfd_error_handler
2673 		/* xgettext:c-format */
2674 		(_("%pB: relocation %s against STT_GNU_IFUNC "
2675 		   "symbol `%s' isn't supported"), input_bfd,
2676 		 howto->name, name);
2677 	      bfd_set_error (bfd_error_bad_value);
2678 	      return FALSE;
2679 
2680 	    case R_X86_64_32S:
2681 	      if (bfd_link_pic (info))
2682 		abort ();
2683 	      goto do_relocation;
2684 
2685 	    case R_X86_64_32:
2686 	      if (ABI_64_P (output_bfd))
2687 		goto do_relocation;
2688 	      /* FALLTHROUGH */
2689 	    case R_X86_64_64:
2690 do_ifunc_pointer:
2691 	      if (rel->r_addend != 0)
2692 		{
2693 		  if (h->root.root.string)
2694 		    name = h->root.root.string;
2695 		  else
2696 		    name = bfd_elf_sym_name (input_bfd, symtab_hdr,
2697 					     sym, NULL);
2698 		  _bfd_error_handler
2699 		    /* xgettext:c-format */
2700 		    (_("%pB: relocation %s against STT_GNU_IFUNC "
2701 		       "symbol `%s' has non-zero addend: %" PRId64),
2702 		     input_bfd, howto->name, name, (int64_t) rel->r_addend);
2703 		  bfd_set_error (bfd_error_bad_value);
2704 		  return FALSE;
2705 		}
2706 
2707 	      /* Generate dynamic relcoation only when there is a
2708 		 non-GOT reference in a shared object or there is no
2709 		 PLT.  */
2710 	      if ((bfd_link_pic (info) && h->non_got_ref)
2711 		  || h->plt.offset == (bfd_vma) -1)
2712 		{
2713 		  Elf_Internal_Rela outrel;
2714 		  asection *sreloc;
2715 
2716 		  /* Need a dynamic relocation to get the real function
2717 		     address.  */
2718 		  outrel.r_offset = _bfd_elf_section_offset (output_bfd,
2719 							     info,
2720 							     input_section,
2721 							     rel->r_offset);
2722 		  if (outrel.r_offset == (bfd_vma) -1
2723 		      || outrel.r_offset == (bfd_vma) -2)
2724 		    abort ();
2725 
2726 		  outrel.r_offset += (input_section->output_section->vma
2727 				      + input_section->output_offset);
2728 
2729 		  if (POINTER_LOCAL_IFUNC_P (info, h))
2730 		    {
2731 		      info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
2732 					      h->root.root.string,
2733 					      h->root.u.def.section->owner);
2734 
2735 		      /* This symbol is resolved locally.  */
2736 		      outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
2737 		      outrel.r_addend = (h->root.u.def.value
2738 					 + h->root.u.def.section->output_section->vma
2739 					 + h->root.u.def.section->output_offset);
2740 		    }
2741 		  else
2742 		    {
2743 		      outrel.r_info = htab->r_info (h->dynindx, r_type);
2744 		      outrel.r_addend = 0;
2745 		    }
2746 
2747 		  /* Dynamic relocations are stored in
2748 		     1. .rela.ifunc section in PIC object.
2749 		     2. .rela.got section in dynamic executable.
2750 		     3. .rela.iplt section in static executable.  */
2751 		  if (bfd_link_pic (info))
2752 		    sreloc = htab->elf.irelifunc;
2753 		  else if (htab->elf.splt != NULL)
2754 		    sreloc = htab->elf.srelgot;
2755 		  else
2756 		    sreloc = htab->elf.irelplt;
2757 		  elf_append_rela (output_bfd, sreloc, &outrel);
2758 
2759 		  /* If this reloc is against an external symbol, we
2760 		     do not want to fiddle with the addend.  Otherwise,
2761 		     we need to include the symbol value so that it
2762 		     becomes an addend for the dynamic reloc.  For an
2763 		     internal symbol, we have updated addend.  */
2764 		  continue;
2765 		}
2766 	      /* FALLTHROUGH */
2767 	    case R_X86_64_PC32:
2768 	    case R_X86_64_PC32_BND:
2769 	    case R_X86_64_PC64:
2770 	    case R_X86_64_PLT32:
2771 	    case R_X86_64_PLT32_BND:
2772 	      goto do_relocation;
2773 	    }
2774 	}
2775 
2776 skip_ifunc:
2777       resolved_to_zero = (eh != NULL
2778 			  && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
2779 
2780       /* When generating a shared object, the relocations handled here are
2781 	 copied into the output file to be resolved at run time.  */
2782       switch (r_type)
2783 	{
2784 	case R_X86_64_GOT32:
2785 	case R_X86_64_GOT64:
2786 	  /* Relocation is to the entry for this symbol in the global
2787 	     offset table.  */
2788 	case R_X86_64_GOTPCREL:
2789 	case R_X86_64_GOTPCRELX:
2790 	case R_X86_64_REX_GOTPCRELX:
2791 	case R_X86_64_GOTPCREL64:
2792 	  /* Use global offset table entry as symbol value.  */
2793 	case R_X86_64_GOTPLT64:
2794 	  /* This is obsolete and treated the same as GOT64.  */
2795 	  base_got = htab->elf.sgot;
2796 
2797 	  if (htab->elf.sgot == NULL)
2798 	    abort ();
2799 
2800 	  relative_reloc = FALSE;
2801 	  if (h != NULL)
2802 	    {
2803 	      off = h->got.offset;
2804 	      if (h->needs_plt
2805 		  && h->plt.offset != (bfd_vma)-1
2806 		  && off == (bfd_vma)-1)
2807 		{
2808 		  /* We can't use h->got.offset here to save
2809 		     state, or even just remember the offset, as
2810 		     finish_dynamic_symbol would use that as offset into
2811 		     .got.  */
2812 		  bfd_vma plt_index = (h->plt.offset / plt_entry_size
2813 				       - htab->plt.has_plt0);
2814 		  off = (plt_index + 3) * GOT_ENTRY_SIZE;
2815 		  base_got = htab->elf.sgotplt;
2816 		}
2817 
2818 	      if (RESOLVED_LOCALLY_P (info, h, htab))
2819 		{
2820 		  /* We must initialize this entry in the global offset
2821 		     table.  Since the offset must always be a multiple
2822 		     of 8, we use the least significant bit to record
2823 		     whether we have initialized it already.
2824 
2825 		     When doing a dynamic link, we create a .rela.got
2826 		     relocation entry to initialize the value.	This is
2827 		     done in the finish_dynamic_symbol routine.	 */
2828 		  if ((off & 1) != 0)
2829 		    off &= ~1;
2830 		  else
2831 		    {
2832 		      bfd_put_64 (output_bfd, relocation,
2833 				  base_got->contents + off);
2834 		      /* Note that this is harmless for the GOTPLT64 case,
2835 			 as -1 | 1 still is -1.  */
2836 		      h->got.offset |= 1;
2837 
2838 		      if (GENERATE_RELATIVE_RELOC_P (info, h))
2839 			{
2840 			  /* If this symbol isn't dynamic in PIC,
2841 			     generate R_X86_64_RELATIVE here.  */
2842 			  eh->no_finish_dynamic_symbol = 1;
2843 			  relative_reloc = TRUE;
2844 			}
2845 		    }
2846 		}
2847 	      else
2848 		unresolved_reloc = FALSE;
2849 	    }
2850 	  else
2851 	    {
2852 	      if (local_got_offsets == NULL)
2853 		abort ();
2854 
2855 	      off = local_got_offsets[r_symndx];
2856 
2857 	      /* The offset must always be a multiple of 8.  We use
2858 		 the least significant bit to record whether we have
2859 		 already generated the necessary reloc.	 */
2860 	      if ((off & 1) != 0)
2861 		off &= ~1;
2862 	      else
2863 		{
2864 		  bfd_put_64 (output_bfd, relocation,
2865 			      base_got->contents + off);
2866 		  local_got_offsets[r_symndx] |= 1;
2867 
2868 		  if (bfd_link_pic (info))
2869 		    relative_reloc = TRUE;
2870 		}
2871 	    }
2872 
2873 	  if (relative_reloc)
2874 	    {
2875 	      asection *s;
2876 	      Elf_Internal_Rela outrel;
2877 
2878 	      /* We need to generate a R_X86_64_RELATIVE reloc
2879 		 for the dynamic linker.  */
2880 	      s = htab->elf.srelgot;
2881 	      if (s == NULL)
2882 		abort ();
2883 
2884 	      outrel.r_offset = (base_got->output_section->vma
2885 				 + base_got->output_offset
2886 				 + off);
2887 	      outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
2888 	      outrel.r_addend = relocation;
2889 	      elf_append_rela (output_bfd, s, &outrel);
2890 	    }
2891 
2892 	  if (off >= (bfd_vma) -2)
2893 	    abort ();
2894 
2895 	  relocation = base_got->output_section->vma
2896 		       + base_got->output_offset + off;
2897 	  if (r_type != R_X86_64_GOTPCREL
2898 	      && r_type != R_X86_64_GOTPCRELX
2899 	      && r_type != R_X86_64_REX_GOTPCRELX
2900 	      && r_type != R_X86_64_GOTPCREL64)
2901 	    relocation -= htab->elf.sgotplt->output_section->vma
2902 			  - htab->elf.sgotplt->output_offset;
2903 
2904 	  break;
2905 
2906 	case R_X86_64_GOTOFF64:
2907 	  /* Relocation is relative to the start of the global offset
2908 	     table.  */
2909 
2910 	  /* Check to make sure it isn't a protected function or data
2911 	     symbol for shared library since it may not be local when
2912 	     used as function address or with copy relocation.  We also
2913 	     need to make sure that a symbol is referenced locally.  */
2914 	  if (bfd_link_pic (info) && h)
2915 	    {
2916 	      if (!h->def_regular)
2917 		{
2918 		  const char *v;
2919 
2920 		  switch (ELF_ST_VISIBILITY (h->other))
2921 		    {
2922 		    case STV_HIDDEN:
2923 		      v = _("hidden symbol");
2924 		      break;
2925 		    case STV_INTERNAL:
2926 		      v = _("internal symbol");
2927 		      break;
2928 		    case STV_PROTECTED:
2929 		      v = _("protected symbol");
2930 		      break;
2931 		    default:
2932 		      v = _("symbol");
2933 		      break;
2934 		    }
2935 
2936 		  _bfd_error_handler
2937 		    /* xgettext:c-format */
2938 		    (_("%pB: relocation R_X86_64_GOTOFF64 against undefined %s"
2939 		       " `%s' can not be used when making a shared object"),
2940 		     input_bfd, v, h->root.root.string);
2941 		  bfd_set_error (bfd_error_bad_value);
2942 		  return FALSE;
2943 		}
2944 	      else if (!bfd_link_executable (info)
2945 		       && !SYMBOL_REFERENCES_LOCAL_P (info, h)
2946 		       && (h->type == STT_FUNC
2947 			   || h->type == STT_OBJECT)
2948 		       && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
2949 		{
2950 		  _bfd_error_handler
2951 		    /* xgettext:c-format */
2952 		    (_("%pB: relocation R_X86_64_GOTOFF64 against protected %s"
2953 		       " `%s' can not be used when making a shared object"),
2954 		     input_bfd,
2955 		     h->type == STT_FUNC ? "function" : "data",
2956 		     h->root.root.string);
2957 		  bfd_set_error (bfd_error_bad_value);
2958 		  return FALSE;
2959 		}
2960 	    }
2961 
2962 	  /* Note that sgot is not involved in this
2963 	     calculation.  We always want the start of .got.plt.  If we
2964 	     defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
2965 	     permitted by the ABI, we might have to change this
2966 	     calculation.  */
2967 	  relocation -= htab->elf.sgotplt->output_section->vma
2968 			+ htab->elf.sgotplt->output_offset;
2969 	  break;
2970 
2971 	case R_X86_64_GOTPC32:
2972 	case R_X86_64_GOTPC64:
2973 	  /* Use global offset table as symbol value.  */
2974 	  relocation = htab->elf.sgotplt->output_section->vma
2975 		       + htab->elf.sgotplt->output_offset;
2976 	  unresolved_reloc = FALSE;
2977 	  break;
2978 
2979 	case R_X86_64_PLTOFF64:
2980 	  /* Relocation is PLT entry relative to GOT.  For local
2981 	     symbols it's the symbol itself relative to GOT.  */
2982 	  if (h != NULL
2983 	      /* See PLT32 handling.  */
2984 	      && (h->plt.offset != (bfd_vma) -1
2985 		  || eh->plt_got.offset != (bfd_vma) -1)
2986 	      && htab->elf.splt != NULL)
2987 	    {
2988 	      if (eh->plt_got.offset != (bfd_vma) -1)
2989 		{
2990 		  /* Use the GOT PLT.  */
2991 		  resolved_plt = htab->plt_got;
2992 		  plt_offset = eh->plt_got.offset;
2993 		}
2994 	      else if (htab->plt_second != NULL)
2995 		{
2996 		  resolved_plt = htab->plt_second;
2997 		  plt_offset = eh->plt_second.offset;
2998 		}
2999 	      else
3000 		{
3001 		  resolved_plt = htab->elf.splt;
3002 		  plt_offset = h->plt.offset;
3003 		}
3004 
3005 	      relocation = (resolved_plt->output_section->vma
3006 			    + resolved_plt->output_offset
3007 			    + plt_offset);
3008 	      unresolved_reloc = FALSE;
3009 	    }
3010 
3011 	  relocation -= htab->elf.sgotplt->output_section->vma
3012 			+ htab->elf.sgotplt->output_offset;
3013 	  break;
3014 
3015 	case R_X86_64_PLT32:
3016 	case R_X86_64_PLT32_BND:
3017 	  /* Relocation is to the entry for this symbol in the
3018 	     procedure linkage table.  */
3019 
3020 	  /* Resolve a PLT32 reloc against a local symbol directly,
3021 	     without using the procedure linkage table.	 */
3022 	  if (h == NULL)
3023 	    break;
3024 
3025 	  if ((h->plt.offset == (bfd_vma) -1
3026 	       && eh->plt_got.offset == (bfd_vma) -1)
3027 	      || htab->elf.splt == NULL)
3028 	    {
3029 	      /* We didn't make a PLT entry for this symbol.  This
3030 		 happens when statically linking PIC code, or when
3031 		 using -Bsymbolic.  */
3032 	      break;
3033 	    }
3034 
3035 use_plt:
3036 	  if (h->plt.offset != (bfd_vma) -1)
3037 	    {
3038 	      if (htab->plt_second != NULL)
3039 		{
3040 		  resolved_plt = htab->plt_second;
3041 		  plt_offset = eh->plt_second.offset;
3042 		}
3043 	      else
3044 		{
3045 		  resolved_plt = htab->elf.splt;
3046 		  plt_offset = h->plt.offset;
3047 		}
3048 	    }
3049 	  else
3050 	    {
3051 	      /* Use the GOT PLT.  */
3052 	      resolved_plt = htab->plt_got;
3053 	      plt_offset = eh->plt_got.offset;
3054 	    }
3055 
3056 	  relocation = (resolved_plt->output_section->vma
3057 			+ resolved_plt->output_offset
3058 			+ plt_offset);
3059 	  unresolved_reloc = FALSE;
3060 	  break;
3061 
3062 	case R_X86_64_SIZE32:
3063 	case R_X86_64_SIZE64:
3064 	  /* Set to symbol size.  */
3065 	  relocation = st_size;
3066 	  goto direct;
3067 
3068 	case R_X86_64_PC8:
3069 	case R_X86_64_PC16:
3070 	case R_X86_64_PC32:
3071 	case R_X86_64_PC32_BND:
3072 	  /* Don't complain about -fPIC if the symbol is undefined when
3073 	     building executable unless it is unresolved weak symbol,
3074 	     references a dynamic definition in PIE or -z nocopyreloc
3075 	     is used.  */
3076 	  no_copyreloc_p
3077 	    = (info->nocopyreloc
3078 	       || (h != NULL
3079 		   && !h->root.linker_def
3080 		   && !h->root.ldscript_def
3081 		   && eh->def_protected
3082 		   && elf_has_no_copy_on_protected (h->root.u.def.section->owner)));
3083 
3084 	  if ((input_section->flags & SEC_ALLOC) != 0
3085 	      && (input_section->flags & SEC_READONLY) != 0
3086 	      && h != NULL
3087 	      && ((bfd_link_executable (info)
3088 		   && ((h->root.type == bfd_link_hash_undefweak
3089 			&& (eh == NULL
3090 			    || !UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
3091 								 eh)))
3092 		       || (bfd_link_pie (info)
3093 			   && !SYMBOL_DEFINED_NON_SHARED_P (h)
3094 			   && h->def_dynamic)
3095 		       || (no_copyreloc_p
3096 			   && h->def_dynamic
3097 			   && !(h->root.u.def.section->flags & SEC_CODE))))
3098 		  || bfd_link_dll (info)))
3099 	    {
3100 	      bfd_boolean fail = FALSE;
3101 	      if (SYMBOL_REFERENCES_LOCAL_P (info, h))
3102 		{
3103 		  /* Symbol is referenced locally.  Make sure it is
3104 		     defined locally.  */
3105 		  fail = !SYMBOL_DEFINED_NON_SHARED_P (h);
3106 		}
3107 	      else if (bfd_link_pie (info))
3108 		{
3109 		  /* We can only use PC-relative relocations in PIE
3110 		     from non-code sections.  */
3111 		  if (h->type == STT_FUNC
3112 		      && (sec->flags & SEC_CODE) != 0)
3113 		    fail = TRUE;
3114 		}
3115 	      else if (no_copyreloc_p || bfd_link_dll (info))
3116 		{
3117 		  /* Symbol doesn't need copy reloc and isn't
3118 		     referenced locally.  Don't allow PC-relative
3119 		     relocations against default and protected
3120 		     symbols since address of protected function
3121 		     and location of protected data may not be in
3122 		     the shared object.   */
3123 		  fail = (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3124 			  || ELF_ST_VISIBILITY (h->other) == STV_PROTECTED);
3125 		}
3126 
3127 	      if (fail)
3128 		return elf_x86_64_need_pic (info, input_bfd, input_section,
3129 					    h, NULL, NULL, howto);
3130 	    }
3131 	  /* Since x86-64 has PC-relative PLT, we can use PLT in PIE
3132 	     as function address.  */
3133 	  else if (h != NULL
3134 		   && (input_section->flags & SEC_CODE) == 0
3135 		   && bfd_link_pie (info)
3136 		   && h->type == STT_FUNC
3137 		   && !h->def_regular
3138 		   && h->def_dynamic)
3139 	    goto use_plt;
3140 	  /* Fall through.  */
3141 
3142 	case R_X86_64_8:
3143 	case R_X86_64_16:
3144 	case R_X86_64_32:
3145 	case R_X86_64_PC64:
3146 	case R_X86_64_64:
3147 	  /* FIXME: The ABI says the linker should make sure the value is
3148 	     the same when it's zeroextended to 64 bit.	 */
3149 
3150 direct:
3151 	  if ((input_section->flags & SEC_ALLOC) == 0)
3152 	    break;
3153 
3154 	  need_copy_reloc_in_pie = (bfd_link_pie (info)
3155 				    && h != NULL
3156 				    && (h->needs_copy
3157 					|| eh->needs_copy
3158 					|| (h->root.type
3159 					    == bfd_link_hash_undefined))
3160 				    && (X86_PCREL_TYPE_P (r_type)
3161 					|| X86_SIZE_TYPE_P (r_type)));
3162 
3163 	  if (GENERATE_DYNAMIC_RELOCATION_P (info, eh, r_type,
3164 					     need_copy_reloc_in_pie,
3165 					     resolved_to_zero, FALSE))
3166 	    {
3167 	      Elf_Internal_Rela outrel;
3168 	      bfd_boolean skip, relocate;
3169 	      asection *sreloc;
3170 
3171 	      /* When generating a shared object, these relocations
3172 		 are copied into the output file to be resolved at run
3173 		 time.	*/
3174 	      skip = FALSE;
3175 	      relocate = FALSE;
3176 
3177 	      outrel.r_offset =
3178 		_bfd_elf_section_offset (output_bfd, info, input_section,
3179 					 rel->r_offset);
3180 	      if (outrel.r_offset == (bfd_vma) -1)
3181 		skip = TRUE;
3182 	      else if (outrel.r_offset == (bfd_vma) -2)
3183 		skip = TRUE, relocate = TRUE;
3184 
3185 	      outrel.r_offset += (input_section->output_section->vma
3186 				  + input_section->output_offset);
3187 
3188 	      if (skip)
3189 		memset (&outrel, 0, sizeof outrel);
3190 
3191 	      else if (COPY_INPUT_RELOC_P (info, h, r_type))
3192 		{
3193 		  outrel.r_info = htab->r_info (h->dynindx, r_type);
3194 		  outrel.r_addend = rel->r_addend;
3195 		}
3196 	      else
3197 		{
3198 		  /* This symbol is local, or marked to become local.
3199 		     When relocation overflow check is disabled, we
3200 		     convert R_X86_64_32 to dynamic R_X86_64_RELATIVE.  */
3201 		  if (r_type == htab->pointer_r_type
3202 		      || (r_type == R_X86_64_32
3203 			  && htab->params->no_reloc_overflow_check))
3204 		    {
3205 		      relocate = TRUE;
3206 		      outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
3207 		      outrel.r_addend = relocation + rel->r_addend;
3208 		    }
3209 		  else if (r_type == R_X86_64_64
3210 			   && !ABI_64_P (output_bfd))
3211 		    {
3212 		      relocate = TRUE;
3213 		      outrel.r_info = htab->r_info (0,
3214 						    R_X86_64_RELATIVE64);
3215 		      outrel.r_addend = relocation + rel->r_addend;
3216 		      /* Check addend overflow.  */
3217 		      if ((outrel.r_addend & 0x80000000)
3218 			  != (rel->r_addend & 0x80000000))
3219 			{
3220 			  const char *name;
3221 			  int addend = rel->r_addend;
3222 			  if (h && h->root.root.string)
3223 			    name = h->root.root.string;
3224 			  else
3225 			    name = bfd_elf_sym_name (input_bfd, symtab_hdr,
3226 						     sym, NULL);
3227 			  _bfd_error_handler
3228 			    /* xgettext:c-format */
3229 			    (_("%pB: addend %s%#x in relocation %s against "
3230 			       "symbol `%s' at %#" PRIx64
3231 			       " in section `%pA' is out of range"),
3232 			     input_bfd, addend < 0 ? "-" : "", addend,
3233 			     howto->name, name, (uint64_t) rel->r_offset,
3234 			     input_section);
3235 			  bfd_set_error (bfd_error_bad_value);
3236 			  return FALSE;
3237 			}
3238 		    }
3239 		  else
3240 		    {
3241 		      long sindx;
3242 
3243 		      if (bfd_is_abs_section (sec))
3244 			sindx = 0;
3245 		      else if (sec == NULL || sec->owner == NULL)
3246 			{
3247 			  bfd_set_error (bfd_error_bad_value);
3248 			  return FALSE;
3249 			}
3250 		      else
3251 			{
3252 			  asection *osec;
3253 
3254 			  /* We are turning this relocation into one
3255 			     against a section symbol.  It would be
3256 			     proper to subtract the symbol's value,
3257 			     osec->vma, from the emitted reloc addend,
3258 			     but ld.so expects buggy relocs.  */
3259 			  osec = sec->output_section;
3260 			  sindx = elf_section_data (osec)->dynindx;
3261 			  if (sindx == 0)
3262 			    {
3263 			      asection *oi = htab->elf.text_index_section;
3264 			      sindx = elf_section_data (oi)->dynindx;
3265 			    }
3266 			  BFD_ASSERT (sindx != 0);
3267 			}
3268 
3269 		      outrel.r_info = htab->r_info (sindx, r_type);
3270 		      outrel.r_addend = relocation + rel->r_addend;
3271 		    }
3272 		}
3273 
3274 	      sreloc = elf_section_data (input_section)->sreloc;
3275 
3276 	      if (sreloc == NULL || sreloc->contents == NULL)
3277 		{
3278 		  r = bfd_reloc_notsupported;
3279 		  goto check_relocation_error;
3280 		}
3281 
3282 	      elf_append_rela (output_bfd, sreloc, &outrel);
3283 
3284 	      /* If this reloc is against an external symbol, we do
3285 		 not want to fiddle with the addend.  Otherwise, we
3286 		 need to include the symbol value so that it becomes
3287 		 an addend for the dynamic reloc.  */
3288 	      if (! relocate)
3289 		continue;
3290 	    }
3291 
3292 	  break;
3293 
3294 	case R_X86_64_TLSGD:
3295 	case R_X86_64_GOTPC32_TLSDESC:
3296 	case R_X86_64_TLSDESC_CALL:
3297 	case R_X86_64_GOTTPOFF:
3298 	  tls_type = GOT_UNKNOWN;
3299 	  if (h == NULL && local_got_offsets)
3300 	    tls_type = elf_x86_local_got_tls_type (input_bfd) [r_symndx];
3301 	  else if (h != NULL)
3302 	    tls_type = elf_x86_hash_entry (h)->tls_type;
3303 
3304 	  r_type_tls = r_type;
3305 	  if (! elf_x86_64_tls_transition (info, input_bfd,
3306 					   input_section, contents,
3307 					   symtab_hdr, sym_hashes,
3308 					   &r_type_tls, tls_type, rel,
3309 					   relend, h, r_symndx, TRUE))
3310 	    return FALSE;
3311 
3312 	  if (r_type_tls == R_X86_64_TPOFF32)
3313 	    {
3314 	      bfd_vma roff = rel->r_offset;
3315 
3316 	      BFD_ASSERT (! unresolved_reloc);
3317 
3318 	      if (r_type == R_X86_64_TLSGD)
3319 		{
3320 		  /* GD->LE transition.  For 64bit, change
3321 			.byte 0x66; leaq foo@tlsgd(%rip), %rdi
3322 			.word 0x6666; rex64; call __tls_get_addr@PLT
3323 		     or
3324 			.byte 0x66; leaq foo@tlsgd(%rip), %rdi
3325 			.byte 0x66; rex64
3326 			call *__tls_get_addr@GOTPCREL(%rip)
3327 			which may be converted to
3328 			addr32 call __tls_get_addr
3329 		     into:
3330 			movq %fs:0, %rax
3331 			leaq foo@tpoff(%rax), %rax
3332 		     For 32bit, change
3333 			leaq foo@tlsgd(%rip), %rdi
3334 			.word 0x6666; rex64; call __tls_get_addr@PLT
3335 		     or
3336 			leaq foo@tlsgd(%rip), %rdi
3337 			.byte 0x66; rex64
3338 			call *__tls_get_addr@GOTPCREL(%rip)
3339 			which may be converted to
3340 			addr32 call __tls_get_addr
3341 		     into:
3342 			movl %fs:0, %eax
3343 			leaq foo@tpoff(%rax), %rax
3344 		     For largepic, change:
3345 			leaq foo@tlsgd(%rip), %rdi
3346 			movabsq $__tls_get_addr@pltoff, %rax
3347 			addq %r15, %rax
3348 			call *%rax
3349 		     into:
3350 			movq %fs:0, %rax
3351 			leaq foo@tpoff(%rax), %rax
3352 			nopw 0x0(%rax,%rax,1)  */
3353 		  int largepic = 0;
3354 		  if (ABI_64_P (output_bfd))
3355 		    {
3356 		      if (contents[roff + 5] == 0xb8)
3357 			{
3358 			  if (roff < 3
3359 			      || (roff - 3 + 22) > input_section->size)
3360 			    {
3361 corrupt_input:
3362 			      info->callbacks->einfo
3363 				(_("%F%P: corrupt input: %pB\n"),
3364 				 input_bfd);
3365 			      return FALSE;
3366 			    }
3367 			  memcpy (contents + roff - 3,
3368 				  "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80"
3369 				  "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
3370 			  largepic = 1;
3371 			}
3372 		      else
3373 			{
3374 			  if (roff < 4
3375 			      || (roff - 4 + 16) > input_section->size)
3376 			    goto corrupt_input;
3377 			  memcpy (contents + roff - 4,
3378 				  "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
3379 				  16);
3380 			}
3381 		    }
3382 		  else
3383 		    {
3384 		      if (roff < 3
3385 			  || (roff - 3 + 15) > input_section->size)
3386 			goto corrupt_input;
3387 		      memcpy (contents + roff - 3,
3388 			      "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
3389 			      15);
3390 		    }
3391 		  bfd_put_32 (output_bfd,
3392 			      elf_x86_64_tpoff (info, relocation),
3393 			      contents + roff + 8 + largepic);
3394 		  /* Skip R_X86_64_PC32, R_X86_64_PLT32,
3395 		     R_X86_64_GOTPCRELX and R_X86_64_PLTOFF64.  */
3396 		  rel++;
3397 		  wrel++;
3398 		  continue;
3399 		}
3400 	      else if (r_type == R_X86_64_GOTPC32_TLSDESC)
3401 		{
3402 		  /* GDesc -> LE transition.
3403 		     It's originally something like:
3404 		     leaq x@tlsdesc(%rip), %rax
3405 
3406 		     Change it to:
3407 		     movl $x@tpoff, %rax.  */
3408 
3409 		  unsigned int val, type;
3410 
3411 		  if (roff < 3)
3412 		    goto corrupt_input;
3413 		  type = bfd_get_8 (input_bfd, contents + roff - 3);
3414 		  val = bfd_get_8 (input_bfd, contents + roff - 1);
3415 		  bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
3416 			     contents + roff - 3);
3417 		  bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
3418 		  bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
3419 			     contents + roff - 1);
3420 		  bfd_put_32 (output_bfd,
3421 			      elf_x86_64_tpoff (info, relocation),
3422 			      contents + roff);
3423 		  continue;
3424 		}
3425 	      else if (r_type == R_X86_64_TLSDESC_CALL)
3426 		{
3427 		  /* GDesc -> LE transition.
3428 		     It's originally:
3429 		     call *(%rax)
3430 		     Turn it into:
3431 		     xchg %ax,%ax.  */
3432 		  bfd_put_8 (output_bfd, 0x66, contents + roff);
3433 		  bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3434 		  continue;
3435 		}
3436 	      else if (r_type == R_X86_64_GOTTPOFF)
3437 		{
3438 		  /* IE->LE transition:
3439 		     For 64bit, originally it can be one of:
3440 		     movq foo@gottpoff(%rip), %reg
3441 		     addq foo@gottpoff(%rip), %reg
3442 		     We change it into:
3443 		     movq $foo, %reg
3444 		     leaq foo(%reg), %reg
3445 		     addq $foo, %reg.
3446 		     For 32bit, originally it can be one of:
3447 		     movq foo@gottpoff(%rip), %reg
3448 		     addl foo@gottpoff(%rip), %reg
3449 		     We change it into:
3450 		     movq $foo, %reg
3451 		     leal foo(%reg), %reg
3452 		     addl $foo, %reg. */
3453 
3454 		  unsigned int val, type, reg;
3455 
3456 		  if (roff >= 3)
3457 		    val = bfd_get_8 (input_bfd, contents + roff - 3);
3458 		  else
3459 		    {
3460 		      if (roff < 2)
3461 			goto corrupt_input;
3462 		      val = 0;
3463 		    }
3464 		  type = bfd_get_8 (input_bfd, contents + roff - 2);
3465 		  reg = bfd_get_8 (input_bfd, contents + roff - 1);
3466 		  reg >>= 3;
3467 		  if (type == 0x8b)
3468 		    {
3469 		      /* movq */
3470 		      if (val == 0x4c)
3471 			{
3472 			  if (roff < 3)
3473 			    goto corrupt_input;
3474 			  bfd_put_8 (output_bfd, 0x49,
3475 				     contents + roff - 3);
3476 			}
3477 		      else if (!ABI_64_P (output_bfd) && val == 0x44)
3478 			{
3479 			  if (roff < 3)
3480 			    goto corrupt_input;
3481 			  bfd_put_8 (output_bfd, 0x41,
3482 				     contents + roff - 3);
3483 			}
3484 		      bfd_put_8 (output_bfd, 0xc7,
3485 				 contents + roff - 2);
3486 		      bfd_put_8 (output_bfd, 0xc0 | reg,
3487 				 contents + roff - 1);
3488 		    }
3489 		  else if (reg == 4)
3490 		    {
3491 		      /* addq/addl -> addq/addl - addressing with %rsp/%r12
3492 			 is special  */
3493 		      if (val == 0x4c)
3494 			{
3495 			  if (roff < 3)
3496 			    goto corrupt_input;
3497 			  bfd_put_8 (output_bfd, 0x49,
3498 				     contents + roff - 3);
3499 			}
3500 		      else if (!ABI_64_P (output_bfd) && val == 0x44)
3501 			{
3502 			  if (roff < 3)
3503 			    goto corrupt_input;
3504 			  bfd_put_8 (output_bfd, 0x41,
3505 				     contents + roff - 3);
3506 			}
3507 		      bfd_put_8 (output_bfd, 0x81,
3508 				 contents + roff - 2);
3509 		      bfd_put_8 (output_bfd, 0xc0 | reg,
3510 				 contents + roff - 1);
3511 		    }
3512 		  else
3513 		    {
3514 		      /* addq/addl -> leaq/leal */
3515 		      if (val == 0x4c)
3516 			{
3517 			  if (roff < 3)
3518 			    goto corrupt_input;
3519 			  bfd_put_8 (output_bfd, 0x4d,
3520 				     contents + roff - 3);
3521 			}
3522 		      else if (!ABI_64_P (output_bfd) && val == 0x44)
3523 			{
3524 			  if (roff < 3)
3525 			    goto corrupt_input;
3526 			  bfd_put_8 (output_bfd, 0x45,
3527 				     contents + roff - 3);
3528 			}
3529 		      bfd_put_8 (output_bfd, 0x8d,
3530 				 contents + roff - 2);
3531 		      bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
3532 				 contents + roff - 1);
3533 		    }
3534 		  bfd_put_32 (output_bfd,
3535 			      elf_x86_64_tpoff (info, relocation),
3536 			      contents + roff);
3537 		  continue;
3538 		}
3539 	      else
3540 		BFD_ASSERT (FALSE);
3541 	    }
3542 
3543 	  if (htab->elf.sgot == NULL)
3544 	    abort ();
3545 
3546 	  if (h != NULL)
3547 	    {
3548 	      off = h->got.offset;
3549 	      offplt = elf_x86_hash_entry (h)->tlsdesc_got;
3550 	    }
3551 	  else
3552 	    {
3553 	      if (local_got_offsets == NULL)
3554 		abort ();
3555 
3556 	      off = local_got_offsets[r_symndx];
3557 	      offplt = local_tlsdesc_gotents[r_symndx];
3558 	    }
3559 
3560 	  if ((off & 1) != 0)
3561 	    off &= ~1;
3562 	  else
3563 	    {
3564 	      Elf_Internal_Rela outrel;
3565 	      int dr_type, indx;
3566 	      asection *sreloc;
3567 
3568 	      if (htab->elf.srelgot == NULL)
3569 		abort ();
3570 
3571 	      indx = h && h->dynindx != -1 ? h->dynindx : 0;
3572 
3573 	      if (GOT_TLS_GDESC_P (tls_type))
3574 		{
3575 		  outrel.r_info = htab->r_info (indx, R_X86_64_TLSDESC);
3576 		  BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
3577 			      + 2 * GOT_ENTRY_SIZE <= htab->elf.sgotplt->size);
3578 		  outrel.r_offset = (htab->elf.sgotplt->output_section->vma
3579 				     + htab->elf.sgotplt->output_offset
3580 				     + offplt
3581 				     + htab->sgotplt_jump_table_size);
3582 		  sreloc = htab->elf.srelplt;
3583 		  if (indx == 0)
3584 		    outrel.r_addend = relocation - _bfd_x86_elf_dtpoff_base (info);
3585 		  else
3586 		    outrel.r_addend = 0;
3587 		  elf_append_rela (output_bfd, sreloc, &outrel);
3588 		}
3589 
3590 	      sreloc = htab->elf.srelgot;
3591 
3592 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
3593 				 + htab->elf.sgot->output_offset + off);
3594 
3595 	      if (GOT_TLS_GD_P (tls_type))
3596 		dr_type = R_X86_64_DTPMOD64;
3597 	      else if (GOT_TLS_GDESC_P (tls_type))
3598 		goto dr_done;
3599 	      else
3600 		dr_type = R_X86_64_TPOFF64;
3601 
3602 	      bfd_put_64 (output_bfd, 0, htab->elf.sgot->contents + off);
3603 	      outrel.r_addend = 0;
3604 	      if ((dr_type == R_X86_64_TPOFF64
3605 		   || dr_type == R_X86_64_TLSDESC) && indx == 0)
3606 		outrel.r_addend = relocation - _bfd_x86_elf_dtpoff_base (info);
3607 	      outrel.r_info = htab->r_info (indx, dr_type);
3608 
3609 	      elf_append_rela (output_bfd, sreloc, &outrel);
3610 
3611 	      if (GOT_TLS_GD_P (tls_type))
3612 		{
3613 		  if (indx == 0)
3614 		    {
3615 		      BFD_ASSERT (! unresolved_reloc);
3616 		      bfd_put_64 (output_bfd,
3617 				  relocation - _bfd_x86_elf_dtpoff_base (info),
3618 				  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
3619 		    }
3620 		  else
3621 		    {
3622 		      bfd_put_64 (output_bfd, 0,
3623 				  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
3624 		      outrel.r_info = htab->r_info (indx,
3625 						    R_X86_64_DTPOFF64);
3626 		      outrel.r_offset += GOT_ENTRY_SIZE;
3627 		      elf_append_rela (output_bfd, sreloc,
3628 						&outrel);
3629 		    }
3630 		}
3631 
3632 	    dr_done:
3633 	      if (h != NULL)
3634 		h->got.offset |= 1;
3635 	      else
3636 		local_got_offsets[r_symndx] |= 1;
3637 	    }
3638 
3639 	  if (off >= (bfd_vma) -2
3640 	      && ! GOT_TLS_GDESC_P (tls_type))
3641 	    abort ();
3642 	  if (r_type_tls == r_type)
3643 	    {
3644 	      if (r_type == R_X86_64_GOTPC32_TLSDESC
3645 		  || r_type == R_X86_64_TLSDESC_CALL)
3646 		relocation = htab->elf.sgotplt->output_section->vma
3647 		  + htab->elf.sgotplt->output_offset
3648 		  + offplt + htab->sgotplt_jump_table_size;
3649 	      else
3650 		relocation = htab->elf.sgot->output_section->vma
3651 		  + htab->elf.sgot->output_offset + off;
3652 	      unresolved_reloc = FALSE;
3653 	    }
3654 	  else
3655 	    {
3656 	      bfd_vma roff = rel->r_offset;
3657 
3658 	      if (r_type == R_X86_64_TLSGD)
3659 		{
3660 		  /* GD->IE transition.  For 64bit, change
3661 			.byte 0x66; leaq foo@tlsgd(%rip), %rdi
3662 			.word 0x6666; rex64; call __tls_get_addr@PLT
3663 		     or
3664 			.byte 0x66; leaq foo@tlsgd(%rip), %rdi
3665 			.byte 0x66; rex64
3666 			call *__tls_get_addr@GOTPCREL(%rip
3667 			which may be converted to
3668 			addr32 call __tls_get_addr
3669 		     into:
3670 			movq %fs:0, %rax
3671 			addq foo@gottpoff(%rip), %rax
3672 		     For 32bit, change
3673 			leaq foo@tlsgd(%rip), %rdi
3674 			.word 0x6666; rex64; call __tls_get_addr@PLT
3675 		     or
3676 			leaq foo@tlsgd(%rip), %rdi
3677 			.byte 0x66; rex64;
3678 			call *__tls_get_addr@GOTPCREL(%rip)
3679 			which may be converted to
3680 			addr32 call __tls_get_addr
3681 		     into:
3682 			movl %fs:0, %eax
3683 			addq foo@gottpoff(%rip), %rax
3684 		     For largepic, change:
3685 			leaq foo@tlsgd(%rip), %rdi
3686 			movabsq $__tls_get_addr@pltoff, %rax
3687 			addq %r15, %rax
3688 			call *%rax
3689 		     into:
3690 			movq %fs:0, %rax
3691 			addq foo@gottpoff(%rax), %rax
3692 			nopw 0x0(%rax,%rax,1)  */
3693 		  int largepic = 0;
3694 		  if (ABI_64_P (output_bfd))
3695 		    {
3696 		      if (contents[roff + 5] == 0xb8)
3697 			{
3698 			  if (roff < 3
3699 			      || (roff - 3 + 22) > input_section->size)
3700 			    goto corrupt_input;
3701 			  memcpy (contents + roff - 3,
3702 				  "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05"
3703 				  "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
3704 			  largepic = 1;
3705 			}
3706 		      else
3707 			{
3708 			  if (roff < 4
3709 			      || (roff - 4 + 16) > input_section->size)
3710 			    goto corrupt_input;
3711 			  memcpy (contents + roff - 4,
3712 				  "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
3713 				  16);
3714 			}
3715 		    }
3716 		  else
3717 		    {
3718 		      if (roff < 3
3719 			  || (roff - 3 + 15) > input_section->size)
3720 			goto corrupt_input;
3721 		      memcpy (contents + roff - 3,
3722 			      "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
3723 			      15);
3724 		    }
3725 
3726 		  relocation = (htab->elf.sgot->output_section->vma
3727 				+ htab->elf.sgot->output_offset + off
3728 				- roff
3729 				- largepic
3730 				- input_section->output_section->vma
3731 				- input_section->output_offset
3732 				- 12);
3733 		  bfd_put_32 (output_bfd, relocation,
3734 			      contents + roff + 8 + largepic);
3735 		  /* Skip R_X86_64_PLT32/R_X86_64_PLTOFF64.  */
3736 		  rel++;
3737 		  wrel++;
3738 		  continue;
3739 		}
3740 	      else if (r_type == R_X86_64_GOTPC32_TLSDESC)
3741 		{
3742 		  /* GDesc -> IE transition.
3743 		     It's originally something like:
3744 		     leaq x@tlsdesc(%rip), %rax
3745 
3746 		     Change it to:
3747 		     movq x@gottpoff(%rip), %rax # before xchg %ax,%ax.  */
3748 
3749 		  /* Now modify the instruction as appropriate. To
3750 		     turn a leaq into a movq in the form we use it, it
3751 		     suffices to change the second byte from 0x8d to
3752 		     0x8b.  */
3753 		  if (roff < 2)
3754 		    goto corrupt_input;
3755 		  bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
3756 
3757 		  bfd_put_32 (output_bfd,
3758 			      htab->elf.sgot->output_section->vma
3759 			      + htab->elf.sgot->output_offset + off
3760 			      - rel->r_offset
3761 			      - input_section->output_section->vma
3762 			      - input_section->output_offset
3763 			      - 4,
3764 			      contents + roff);
3765 		  continue;
3766 		}
3767 	      else if (r_type == R_X86_64_TLSDESC_CALL)
3768 		{
3769 		  /* GDesc -> IE transition.
3770 		     It's originally:
3771 		     call *(%rax)
3772 
3773 		     Change it to:
3774 		     xchg %ax, %ax.  */
3775 
3776 		  bfd_put_8 (output_bfd, 0x66, contents + roff);
3777 		  bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3778 		  continue;
3779 		}
3780 	      else
3781 		BFD_ASSERT (FALSE);
3782 	    }
3783 	  break;
3784 
3785 	case R_X86_64_TLSLD:
3786 	  if (! elf_x86_64_tls_transition (info, input_bfd,
3787 					   input_section, contents,
3788 					   symtab_hdr, sym_hashes,
3789 					   &r_type, GOT_UNKNOWN, rel,
3790 					   relend, h, r_symndx, TRUE))
3791 	    return FALSE;
3792 
3793 	  if (r_type != R_X86_64_TLSLD)
3794 	    {
3795 	      /* LD->LE transition:
3796 			leaq foo@tlsld(%rip), %rdi
3797 			call __tls_get_addr@PLT
3798 		 For 64bit, we change it into:
3799 			.word 0x6666; .byte 0x66; movq %fs:0, %rax
3800 		 For 32bit, we change it into:
3801 			nopl 0x0(%rax); movl %fs:0, %eax
3802 		 Or
3803 			leaq foo@tlsld(%rip), %rdi;
3804 			call *__tls_get_addr@GOTPCREL(%rip)
3805 			which may be converted to
3806 			addr32 call __tls_get_addr
3807 		 For 64bit, we change it into:
3808 			.word 0x6666; .word 0x6666; movq %fs:0, %rax
3809 		 For 32bit, we change it into:
3810 			nopw 0x0(%rax); movl %fs:0, %eax
3811 		 For largepic, change:
3812 			leaq foo@tlsgd(%rip), %rdi
3813 			movabsq $__tls_get_addr@pltoff, %rax
3814 			addq %rbx, %rax
3815 			call *%rax
3816 		 into
3817 			data16 data16 data16 nopw %cs:0x0(%rax,%rax,1)
3818 			movq %fs:0, %eax  */
3819 
3820 	      BFD_ASSERT (r_type == R_X86_64_TPOFF32);
3821 	      if (ABI_64_P (output_bfd))
3822 		{
3823 		  if ((rel->r_offset + 5) >= input_section->size)
3824 		    goto corrupt_input;
3825 		  if (contents[rel->r_offset + 5] == 0xb8)
3826 		    {
3827 		      if (rel->r_offset < 3
3828 			  || (rel->r_offset - 3 + 22) > input_section->size)
3829 			goto corrupt_input;
3830 		      memcpy (contents + rel->r_offset - 3,
3831 			      "\x66\x66\x66\x66\x2e\x0f\x1f\x84\0\0\0\0\0"
3832 			      "\x64\x48\x8b\x04\x25\0\0\0", 22);
3833 		    }
3834 		  else if (contents[rel->r_offset + 4] == 0xff
3835 			   || contents[rel->r_offset + 4] == 0x67)
3836 		    {
3837 		      if (rel->r_offset < 3
3838 			  || (rel->r_offset - 3 + 13) > input_section->size)
3839 			goto corrupt_input;
3840 		      memcpy (contents + rel->r_offset - 3,
3841 			      "\x66\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0",
3842 			      13);
3843 
3844 		    }
3845 		  else
3846 		    {
3847 		      if (rel->r_offset < 3
3848 			  || (rel->r_offset - 3 + 12) > input_section->size)
3849 			goto corrupt_input;
3850 		      memcpy (contents + rel->r_offset - 3,
3851 			      "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
3852 		    }
3853 		}
3854 	      else
3855 		{
3856 		  if ((rel->r_offset + 4) >= input_section->size)
3857 		    goto corrupt_input;
3858 		  if (contents[rel->r_offset + 4] == 0xff)
3859 		    {
3860 		      if (rel->r_offset < 3
3861 			  || (rel->r_offset - 3 + 13) > input_section->size)
3862 			goto corrupt_input;
3863 		      memcpy (contents + rel->r_offset - 3,
3864 			      "\x66\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0",
3865 			      13);
3866 		    }
3867 		  else
3868 		    {
3869 		      if (rel->r_offset < 3
3870 			  || (rel->r_offset - 3 + 12) > input_section->size)
3871 			goto corrupt_input;
3872 		      memcpy (contents + rel->r_offset - 3,
3873 			      "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
3874 		    }
3875 		}
3876 	      /* Skip R_X86_64_PC32, R_X86_64_PLT32, R_X86_64_GOTPCRELX
3877 		 and R_X86_64_PLTOFF64.  */
3878 	      rel++;
3879 	      wrel++;
3880 	      continue;
3881 	    }
3882 
3883 	  if (htab->elf.sgot == NULL)
3884 	    abort ();
3885 
3886 	  off = htab->tls_ld_or_ldm_got.offset;
3887 	  if (off & 1)
3888 	    off &= ~1;
3889 	  else
3890 	    {
3891 	      Elf_Internal_Rela outrel;
3892 
3893 	      if (htab->elf.srelgot == NULL)
3894 		abort ();
3895 
3896 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
3897 				 + htab->elf.sgot->output_offset + off);
3898 
3899 	      bfd_put_64 (output_bfd, 0,
3900 			  htab->elf.sgot->contents + off);
3901 	      bfd_put_64 (output_bfd, 0,
3902 			  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
3903 	      outrel.r_info = htab->r_info (0, R_X86_64_DTPMOD64);
3904 	      outrel.r_addend = 0;
3905 	      elf_append_rela (output_bfd, htab->elf.srelgot,
3906 					&outrel);
3907 	      htab->tls_ld_or_ldm_got.offset |= 1;
3908 	    }
3909 	  relocation = htab->elf.sgot->output_section->vma
3910 		       + htab->elf.sgot->output_offset + off;
3911 	  unresolved_reloc = FALSE;
3912 	  break;
3913 
3914 	case R_X86_64_DTPOFF32:
3915 	  if (!bfd_link_executable (info)
3916 	      || (input_section->flags & SEC_CODE) == 0)
3917 	    relocation -= _bfd_x86_elf_dtpoff_base (info);
3918 	  else
3919 	    relocation = elf_x86_64_tpoff (info, relocation);
3920 	  break;
3921 
3922 	case R_X86_64_TPOFF32:
3923 	case R_X86_64_TPOFF64:
3924 	  BFD_ASSERT (bfd_link_executable (info));
3925 	  relocation = elf_x86_64_tpoff (info, relocation);
3926 	  break;
3927 
3928 	case R_X86_64_DTPOFF64:
3929 	  BFD_ASSERT ((input_section->flags & SEC_CODE) == 0);
3930 	  relocation -= _bfd_x86_elf_dtpoff_base (info);
3931 	  break;
3932 
3933 	default:
3934 	  break;
3935 	}
3936 
3937       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3938 	 because such sections are not SEC_ALLOC and thus ld.so will
3939 	 not process them.  */
3940       if (unresolved_reloc
3941 	  && !((input_section->flags & SEC_DEBUGGING) != 0
3942 	       && h->def_dynamic)
3943 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
3944 				      rel->r_offset) != (bfd_vma) -1)
3945 	{
3946 	  switch (r_type)
3947 	    {
3948 	    case R_X86_64_32S:
3949 	      sec = h->root.u.def.section;
3950 	      if ((info->nocopyreloc
3951 		   || (eh->def_protected
3952 		       && elf_has_no_copy_on_protected (h->root.u.def.section->owner)))
3953 		  && !(h->root.u.def.section->flags & SEC_CODE))
3954 		return elf_x86_64_need_pic (info, input_bfd, input_section,
3955 					    h, NULL, NULL, howto);
3956 	      /* Fall through.  */
3957 
3958 	    default:
3959 	      _bfd_error_handler
3960 		/* xgettext:c-format */
3961 		(_("%pB(%pA+%#" PRIx64 "): "
3962 		   "unresolvable %s relocation against symbol `%s'"),
3963 		 input_bfd,
3964 		 input_section,
3965 		 (uint64_t) rel->r_offset,
3966 		 howto->name,
3967 		 h->root.root.string);
3968 	      return FALSE;
3969 	    }
3970 	}
3971 
3972 do_relocation:
3973       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3974 				    contents, rel->r_offset,
3975 				    relocation, rel->r_addend);
3976 
3977 check_relocation_error:
3978       if (r != bfd_reloc_ok)
3979 	{
3980 	  const char *name;
3981 
3982 	  if (h != NULL)
3983 	    name = h->root.root.string;
3984 	  else
3985 	    {
3986 	      name = bfd_elf_string_from_elf_section (input_bfd,
3987 						      symtab_hdr->sh_link,
3988 						      sym->st_name);
3989 	      if (name == NULL)
3990 		return FALSE;
3991 	      if (*name == '\0')
3992 		name = bfd_section_name (sec);
3993 	    }
3994 
3995 	  if (r == bfd_reloc_overflow)
3996 	    {
3997 	      if (converted_reloc)
3998 		{
3999 		  info->callbacks->einfo
4000 		    (_("%F%P: failed to convert GOTPCREL relocation; relink with --no-relax\n"));
4001 		  return FALSE;
4002 		}
4003 	      (*info->callbacks->reloc_overflow)
4004 		(info, (h ? &h->root : NULL), name, howto->name,
4005 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
4006 	    }
4007 	  else
4008 	    {
4009 	      _bfd_error_handler
4010 		/* xgettext:c-format */
4011 		(_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"),
4012 		 input_bfd, input_section,
4013 		 (uint64_t) rel->r_offset, name, (int) r);
4014 	      return FALSE;
4015 	    }
4016 	}
4017 
4018       if (wrel != rel)
4019 	*wrel = *rel;
4020     }
4021 
4022   if (wrel != rel)
4023     {
4024       Elf_Internal_Shdr *rel_hdr;
4025       size_t deleted = rel - wrel;
4026 
4027       rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
4028       rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
4029       if (rel_hdr->sh_size == 0)
4030 	{
4031 	  /* It is too late to remove an empty reloc section.  Leave
4032 	     one NONE reloc.
4033 	     ??? What is wrong with an empty section???  */
4034 	  rel_hdr->sh_size = rel_hdr->sh_entsize;
4035 	  deleted -= 1;
4036 	}
4037       rel_hdr = _bfd_elf_single_rel_hdr (input_section);
4038       rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
4039       input_section->reloc_count -= deleted;
4040     }
4041 
4042   return TRUE;
4043 }
4044 
4045 /* Finish up dynamic symbol handling.  We set the contents of various
4046    dynamic sections here.  */
4047 
4048 static bfd_boolean
4049 elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
4050 				  struct bfd_link_info *info,
4051 				  struct elf_link_hash_entry *h,
4052 				  Elf_Internal_Sym *sym)
4053 {
4054   struct elf_x86_link_hash_table *htab;
4055   bfd_boolean use_plt_second;
4056   struct elf_x86_link_hash_entry *eh;
4057   bfd_boolean local_undefweak;
4058 
4059   htab = elf_x86_hash_table (info, X86_64_ELF_DATA);
4060   if (htab == NULL)
4061     return FALSE;
4062 
4063   /* Use the second PLT section only if there is .plt section.  */
4064   use_plt_second = htab->elf.splt != NULL && htab->plt_second != NULL;
4065 
4066   eh = (struct elf_x86_link_hash_entry *) h;
4067   if (eh->no_finish_dynamic_symbol)
4068     abort ();
4069 
4070   /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
4071      resolved undefined weak symbols in executable so that their
4072      references have value 0 at run-time.  */
4073   local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
4074 
4075   if (h->plt.offset != (bfd_vma) -1)
4076     {
4077       bfd_vma plt_index;
4078       bfd_vma got_offset, plt_offset;
4079       Elf_Internal_Rela rela;
4080       bfd_byte *loc;
4081       asection *plt, *gotplt, *relplt, *resolved_plt;
4082       const struct elf_backend_data *bed;
4083       bfd_vma plt_got_pcrel_offset;
4084 
4085       /* When building a static executable, use .iplt, .igot.plt and
4086 	 .rela.iplt sections for STT_GNU_IFUNC symbols.  */
4087       if (htab->elf.splt != NULL)
4088 	{
4089 	  plt = htab->elf.splt;
4090 	  gotplt = htab->elf.sgotplt;
4091 	  relplt = htab->elf.srelplt;
4092 	}
4093       else
4094 	{
4095 	  plt = htab->elf.iplt;
4096 	  gotplt = htab->elf.igotplt;
4097 	  relplt = htab->elf.irelplt;
4098 	}
4099 
4100       VERIFY_PLT_ENTRY (info, h, plt, gotplt, relplt, local_undefweak)
4101 
4102       /* Get the index in the procedure linkage table which
4103 	 corresponds to this symbol.  This is the index of this symbol
4104 	 in all the symbols for which we are making plt entries.  The
4105 	 first entry in the procedure linkage table is reserved.
4106 
4107 	 Get the offset into the .got table of the entry that
4108 	 corresponds to this function.	Each .got entry is GOT_ENTRY_SIZE
4109 	 bytes. The first three are reserved for the dynamic linker.
4110 
4111 	 For static executables, we don't reserve anything.  */
4112 
4113       if (plt == htab->elf.splt)
4114 	{
4115 	  got_offset = (h->plt.offset / htab->plt.plt_entry_size
4116 			- htab->plt.has_plt0);
4117 	  got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
4118 	}
4119       else
4120 	{
4121 	  got_offset = h->plt.offset / htab->plt.plt_entry_size;
4122 	  got_offset = got_offset * GOT_ENTRY_SIZE;
4123 	}
4124 
4125       /* Fill in the entry in the procedure linkage table.  */
4126       memcpy (plt->contents + h->plt.offset, htab->plt.plt_entry,
4127 	      htab->plt.plt_entry_size);
4128       if (use_plt_second)
4129 	{
4130 	  memcpy (htab->plt_second->contents + eh->plt_second.offset,
4131 		  htab->non_lazy_plt->plt_entry,
4132 		  htab->non_lazy_plt->plt_entry_size);
4133 
4134 	  resolved_plt = htab->plt_second;
4135 	  plt_offset = eh->plt_second.offset;
4136 	}
4137       else
4138 	{
4139 	  resolved_plt = plt;
4140 	  plt_offset = h->plt.offset;
4141 	}
4142 
4143       /* Insert the relocation positions of the plt section.  */
4144 
4145       /* Put offset the PC-relative instruction referring to the GOT entry,
4146 	 subtracting the size of that instruction.  */
4147       plt_got_pcrel_offset = (gotplt->output_section->vma
4148 			      + gotplt->output_offset
4149 			      + got_offset
4150 			      - resolved_plt->output_section->vma
4151 			      - resolved_plt->output_offset
4152 			      - plt_offset
4153 			      - htab->plt.plt_got_insn_size);
4154 
4155       /* Check PC-relative offset overflow in PLT entry.  */
4156       if ((plt_got_pcrel_offset + 0x80000000) > 0xffffffff)
4157 	/* xgettext:c-format */
4158 	info->callbacks->einfo (_("%F%pB: PC-relative offset overflow in PLT entry for `%s'\n"),
4159 				output_bfd, h->root.root.string);
4160 
4161       bfd_put_32 (output_bfd, plt_got_pcrel_offset,
4162 		  (resolved_plt->contents + plt_offset
4163 		   + htab->plt.plt_got_offset));
4164 
4165       /* Fill in the entry in the global offset table, initially this
4166 	 points to the second part of the PLT entry.  Leave the entry
4167 	 as zero for undefined weak symbol in PIE.  No PLT relocation
4168 	 against undefined weak symbol in PIE.  */
4169       if (!local_undefweak)
4170 	{
4171 	  if (htab->plt.has_plt0)
4172 	    bfd_put_64 (output_bfd, (plt->output_section->vma
4173 				     + plt->output_offset
4174 				     + h->plt.offset
4175 				     + htab->lazy_plt->plt_lazy_offset),
4176 			gotplt->contents + got_offset);
4177 
4178 	  /* Fill in the entry in the .rela.plt section.  */
4179 	  rela.r_offset = (gotplt->output_section->vma
4180 			   + gotplt->output_offset
4181 			   + got_offset);
4182 	  if (PLT_LOCAL_IFUNC_P (info, h))
4183 	    {
4184 	      info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
4185 				      h->root.root.string,
4186 				      h->root.u.def.section->owner);
4187 
4188 	      /* If an STT_GNU_IFUNC symbol is locally defined, generate
4189 		 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT.  */
4190 	      rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
4191 	      rela.r_addend = (h->root.u.def.value
4192 			       + h->root.u.def.section->output_section->vma
4193 			       + h->root.u.def.section->output_offset);
4194 	      /* R_X86_64_IRELATIVE comes last.  */
4195 	      plt_index = htab->next_irelative_index--;
4196 	    }
4197 	  else
4198 	    {
4199 	      rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
4200 	      rela.r_addend = 0;
4201 	      plt_index = htab->next_jump_slot_index++;
4202 	    }
4203 
4204 	  /* Don't fill the second and third slots in PLT entry for
4205 	     static executables nor without PLT0.  */
4206 	  if (plt == htab->elf.splt && htab->plt.has_plt0)
4207 	    {
4208 	      bfd_vma plt0_offset
4209 		= h->plt.offset + htab->lazy_plt->plt_plt_insn_end;
4210 
4211 	      /* Put relocation index.  */
4212 	      bfd_put_32 (output_bfd, plt_index,
4213 			  (plt->contents + h->plt.offset
4214 			   + htab->lazy_plt->plt_reloc_offset));
4215 
4216 	      /* Put offset for jmp .PLT0 and check for overflow.  We don't
4217 		 check relocation index for overflow since branch displacement
4218 		 will overflow first.  */
4219 	      if (plt0_offset > 0x80000000)
4220 		/* xgettext:c-format */
4221 		info->callbacks->einfo (_("%F%pB: branch displacement overflow in PLT entry for `%s'\n"),
4222 					output_bfd, h->root.root.string);
4223 	      bfd_put_32 (output_bfd, - plt0_offset,
4224 			  (plt->contents + h->plt.offset
4225 			   + htab->lazy_plt->plt_plt_offset));
4226 	    }
4227 
4228 	  bed = get_elf_backend_data (output_bfd);
4229 	  loc = relplt->contents + plt_index * bed->s->sizeof_rela;
4230 	  bed->s->swap_reloca_out (output_bfd, &rela, loc);
4231 	}
4232     }
4233   else if (eh->plt_got.offset != (bfd_vma) -1)
4234     {
4235       bfd_vma got_offset, plt_offset;
4236       asection *plt, *got;
4237       bfd_boolean got_after_plt;
4238       int32_t got_pcrel_offset;
4239 
4240       /* Set the entry in the GOT procedure linkage table.  */
4241       plt = htab->plt_got;
4242       got = htab->elf.sgot;
4243       got_offset = h->got.offset;
4244 
4245       if (got_offset == (bfd_vma) -1
4246 	  || (h->type == STT_GNU_IFUNC && h->def_regular)
4247 	  || plt == NULL
4248 	  || got == NULL)
4249 	abort ();
4250 
4251       /* Use the non-lazy PLT entry template for the GOT PLT since they
4252 	 are the identical.  */
4253       /* Fill in the entry in the GOT procedure linkage table.  */
4254       plt_offset = eh->plt_got.offset;
4255       memcpy (plt->contents + plt_offset,
4256 	      htab->non_lazy_plt->plt_entry,
4257 	      htab->non_lazy_plt->plt_entry_size);
4258 
4259       /* Put offset the PC-relative instruction referring to the GOT
4260 	 entry, subtracting the size of that instruction.  */
4261       got_pcrel_offset = (got->output_section->vma
4262 			  + got->output_offset
4263 			  + got_offset
4264 			  - plt->output_section->vma
4265 			  - plt->output_offset
4266 			  - plt_offset
4267 			  - htab->non_lazy_plt->plt_got_insn_size);
4268 
4269       /* Check PC-relative offset overflow in GOT PLT entry.  */
4270       got_after_plt = got->output_section->vma > plt->output_section->vma;
4271       if ((got_after_plt && got_pcrel_offset < 0)
4272 	  || (!got_after_plt && got_pcrel_offset > 0))
4273 	/* xgettext:c-format */
4274 	info->callbacks->einfo (_("%F%pB: PC-relative offset overflow in GOT PLT entry for `%s'\n"),
4275 				output_bfd, h->root.root.string);
4276 
4277       bfd_put_32 (output_bfd, got_pcrel_offset,
4278 		  (plt->contents + plt_offset
4279 		   + htab->non_lazy_plt->plt_got_offset));
4280     }
4281 
4282   if (!local_undefweak
4283       && !h->def_regular
4284       && (h->plt.offset != (bfd_vma) -1
4285 	  || eh->plt_got.offset != (bfd_vma) -1))
4286     {
4287       /* Mark the symbol as undefined, rather than as defined in
4288 	 the .plt section.  Leave the value if there were any
4289 	 relocations where pointer equality matters (this is a clue
4290 	 for the dynamic linker, to make function pointer
4291 	 comparisons work between an application and shared
4292 	 library), otherwise set it to zero.  If a function is only
4293 	 called from a binary, there is no need to slow down
4294 	 shared libraries because of that.  */
4295       sym->st_shndx = SHN_UNDEF;
4296       if (!h->pointer_equality_needed)
4297 	sym->st_value = 0;
4298     }
4299 
4300   _bfd_x86_elf_link_fixup_ifunc_symbol (info, htab, h, sym);
4301 
4302   /* Don't generate dynamic GOT relocation against undefined weak
4303      symbol in executable.  */
4304   if (h->got.offset != (bfd_vma) -1
4305       && ! GOT_TLS_GD_ANY_P (elf_x86_hash_entry (h)->tls_type)
4306       && elf_x86_hash_entry (h)->tls_type != GOT_TLS_IE
4307       && !local_undefweak)
4308     {
4309       Elf_Internal_Rela rela;
4310       asection *relgot = htab->elf.srelgot;
4311 
4312       /* This symbol has an entry in the global offset table.  Set it
4313 	 up.  */
4314       if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
4315 	abort ();
4316 
4317       rela.r_offset = (htab->elf.sgot->output_section->vma
4318 		       + htab->elf.sgot->output_offset
4319 		       + (h->got.offset &~ (bfd_vma) 1));
4320 
4321       /* If this is a static link, or it is a -Bsymbolic link and the
4322 	 symbol is defined locally or was forced to be local because
4323 	 of a version file, we just want to emit a RELATIVE reloc.
4324 	 The entry in the global offset table will already have been
4325 	 initialized in the relocate_section function.  */
4326       if (h->def_regular
4327 	  && h->type == STT_GNU_IFUNC)
4328 	{
4329 	  if (h->plt.offset == (bfd_vma) -1)
4330 	    {
4331 	      /* STT_GNU_IFUNC is referenced without PLT.  */
4332 	      if (htab->elf.splt == NULL)
4333 		{
4334 		  /* use .rel[a].iplt section to store .got relocations
4335 		     in static executable.  */
4336 		  relgot = htab->elf.irelplt;
4337 		}
4338 	      if (SYMBOL_REFERENCES_LOCAL_P (info, h))
4339 		{
4340 		  info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
4341 					  h->root.root.string,
4342 					  h->root.u.def.section->owner);
4343 
4344 		  rela.r_info = htab->r_info (0,
4345 					      R_X86_64_IRELATIVE);
4346 		  rela.r_addend = (h->root.u.def.value
4347 				   + h->root.u.def.section->output_section->vma
4348 				   + h->root.u.def.section->output_offset);
4349 		}
4350 	      else
4351 		goto do_glob_dat;
4352 	    }
4353 	  else if (bfd_link_pic (info))
4354 	    {
4355 	      /* Generate R_X86_64_GLOB_DAT.  */
4356 	      goto do_glob_dat;
4357 	    }
4358 	  else
4359 	    {
4360 	      asection *plt;
4361 	      bfd_vma plt_offset;
4362 
4363 	      if (!h->pointer_equality_needed)
4364 		abort ();
4365 
4366 	      /* For non-shared object, we can't use .got.plt, which
4367 		 contains the real function addres if we need pointer
4368 		 equality.  We load the GOT entry with the PLT entry.  */
4369 	      if (htab->plt_second != NULL)
4370 		{
4371 		  plt = htab->plt_second;
4372 		  plt_offset = eh->plt_second.offset;
4373 		}
4374 	      else
4375 		{
4376 		  plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4377 		  plt_offset =  h->plt.offset;
4378 		}
4379 	      bfd_put_64 (output_bfd, (plt->output_section->vma
4380 				       + plt->output_offset
4381 				       + plt_offset),
4382 			  htab->elf.sgot->contents + h->got.offset);
4383 	      return TRUE;
4384 	    }
4385 	}
4386       else if (bfd_link_pic (info)
4387 	       && SYMBOL_REFERENCES_LOCAL_P (info, h))
4388 	{
4389 	  if (!SYMBOL_DEFINED_NON_SHARED_P (h))
4390 	    return FALSE;
4391 	  BFD_ASSERT((h->got.offset & 1) != 0);
4392 	  rela.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4393 	  rela.r_addend = (h->root.u.def.value
4394 			   + h->root.u.def.section->output_section->vma
4395 			   + h->root.u.def.section->output_offset);
4396 	}
4397       else
4398 	{
4399 	  BFD_ASSERT((h->got.offset & 1) == 0);
4400 do_glob_dat:
4401 	  bfd_put_64 (output_bfd, (bfd_vma) 0,
4402 		      htab->elf.sgot->contents + h->got.offset);
4403 	  rela.r_info = htab->r_info (h->dynindx, R_X86_64_GLOB_DAT);
4404 	  rela.r_addend = 0;
4405 	}
4406 
4407       elf_append_rela (output_bfd, relgot, &rela);
4408     }
4409 
4410   if (h->needs_copy)
4411     {
4412       Elf_Internal_Rela rela;
4413       asection *s;
4414 
4415       /* This symbol needs a copy reloc.  Set it up.  */
4416       VERIFY_COPY_RELOC (h, htab)
4417 
4418       rela.r_offset = (h->root.u.def.value
4419 		       + h->root.u.def.section->output_section->vma
4420 		       + h->root.u.def.section->output_offset);
4421       rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY);
4422       rela.r_addend = 0;
4423       if (h->root.u.def.section == htab->elf.sdynrelro)
4424 	s = htab->elf.sreldynrelro;
4425       else
4426 	s = htab->elf.srelbss;
4427       elf_append_rela (output_bfd, s, &rela);
4428     }
4429 
4430   return TRUE;
4431 }
4432 
4433 /* Finish up local dynamic symbol handling.  We set the contents of
4434    various dynamic sections here.  */
4435 
4436 static bfd_boolean
4437 elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
4438 {
4439   struct elf_link_hash_entry *h
4440     = (struct elf_link_hash_entry *) *slot;
4441   struct bfd_link_info *info
4442     = (struct bfd_link_info *) inf;
4443 
4444   return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
4445 					   info, h, NULL);
4446 }
4447 
4448 /* Finish up undefined weak symbol handling in PIE.  Fill its PLT entry
4449    here since undefined weak symbol may not be dynamic and may not be
4450    called for elf_x86_64_finish_dynamic_symbol.  */
4451 
4452 static bfd_boolean
4453 elf_x86_64_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
4454 					void *inf)
4455 {
4456   struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
4457   struct bfd_link_info *info = (struct bfd_link_info *) inf;
4458 
4459   if (h->root.type != bfd_link_hash_undefweak
4460       || h->dynindx != -1)
4461     return TRUE;
4462 
4463   return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
4464 					   info, h, NULL);
4465 }
4466 
4467 /* Used to decide how to sort relocs in an optimal manner for the
4468    dynamic linker, before writing them out.  */
4469 
4470 static enum elf_reloc_type_class
4471 elf_x86_64_reloc_type_class (const struct bfd_link_info *info,
4472 			     const asection *rel_sec ATTRIBUTE_UNUSED,
4473 			     const Elf_Internal_Rela *rela)
4474 {
4475   bfd *abfd = info->output_bfd;
4476   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
4477   struct elf_x86_link_hash_table *htab
4478     = elf_x86_hash_table (info, X86_64_ELF_DATA);
4479 
4480   if (htab->elf.dynsym != NULL
4481       && htab->elf.dynsym->contents != NULL)
4482     {
4483       /* Check relocation against STT_GNU_IFUNC symbol if there are
4484 	 dynamic symbols.  */
4485       unsigned long r_symndx = htab->r_sym (rela->r_info);
4486       if (r_symndx != STN_UNDEF)
4487 	{
4488 	  Elf_Internal_Sym sym;
4489 	  if (!bed->s->swap_symbol_in (abfd,
4490 				       (htab->elf.dynsym->contents
4491 					+ r_symndx * bed->s->sizeof_sym),
4492 				       0, &sym))
4493 	    abort ();
4494 
4495 	  if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
4496 	    return reloc_class_ifunc;
4497 	}
4498     }
4499 
4500   switch ((int) ELF32_R_TYPE (rela->r_info))
4501     {
4502     case R_X86_64_IRELATIVE:
4503       return reloc_class_ifunc;
4504     case R_X86_64_RELATIVE:
4505     case R_X86_64_RELATIVE64:
4506       return reloc_class_relative;
4507     case R_X86_64_JUMP_SLOT:
4508       return reloc_class_plt;
4509     case R_X86_64_COPY:
4510       return reloc_class_copy;
4511     default:
4512       return reloc_class_normal;
4513     }
4514 }
4515 
4516 /* Finish up the dynamic sections.  */
4517 
4518 static bfd_boolean
4519 elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
4520 				    struct bfd_link_info *info)
4521 {
4522   struct elf_x86_link_hash_table *htab;
4523 
4524   htab = _bfd_x86_elf_finish_dynamic_sections (output_bfd, info);
4525   if (htab == NULL)
4526     return FALSE;
4527 
4528   if (! htab->elf.dynamic_sections_created)
4529     return TRUE;
4530 
4531   if (htab->elf.splt && htab->elf.splt->size > 0)
4532     {
4533       elf_section_data (htab->elf.splt->output_section)
4534 	->this_hdr.sh_entsize = htab->plt.plt_entry_size;
4535 
4536       if (htab->plt.has_plt0)
4537 	{
4538 	  /* Fill in the special first entry in the procedure linkage
4539 	     table.  */
4540 	  memcpy (htab->elf.splt->contents,
4541 		  htab->lazy_plt->plt0_entry,
4542 		  htab->lazy_plt->plt0_entry_size);
4543 	  /* Add offset for pushq GOT+8(%rip), since the instruction
4544 	     uses 6 bytes subtract this value.  */
4545 	  bfd_put_32 (output_bfd,
4546 		      (htab->elf.sgotplt->output_section->vma
4547 		       + htab->elf.sgotplt->output_offset
4548 		       + 8
4549 		       - htab->elf.splt->output_section->vma
4550 		       - htab->elf.splt->output_offset
4551 		       - 6),
4552 		      (htab->elf.splt->contents
4553 		       + htab->lazy_plt->plt0_got1_offset));
4554 	  /* Add offset for the PC-relative instruction accessing
4555 	     GOT+16, subtracting the offset to the end of that
4556 	     instruction.  */
4557 	  bfd_put_32 (output_bfd,
4558 		      (htab->elf.sgotplt->output_section->vma
4559 		       + htab->elf.sgotplt->output_offset
4560 		       + 16
4561 		       - htab->elf.splt->output_section->vma
4562 		       - htab->elf.splt->output_offset
4563 		       - htab->lazy_plt->plt0_got2_insn_end),
4564 		      (htab->elf.splt->contents
4565 		       + htab->lazy_plt->plt0_got2_offset));
4566 	}
4567 
4568       if (htab->tlsdesc_plt)
4569 	{
4570 	  bfd_put_64 (output_bfd, (bfd_vma) 0,
4571 		      htab->elf.sgot->contents + htab->tlsdesc_got);
4572 
4573 	  memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
4574 		  htab->lazy_plt->plt_tlsdesc_entry,
4575 		  htab->lazy_plt->plt_tlsdesc_entry_size);
4576 
4577 	  /* Add offset for pushq GOT+8(%rip), since ENDBR64 uses 4
4578 	     bytes and the instruction uses 6 bytes, subtract these
4579 	     values.  */
4580 	  bfd_put_32 (output_bfd,
4581 		      (htab->elf.sgotplt->output_section->vma
4582 		       + htab->elf.sgotplt->output_offset
4583 		       + 8
4584 		       - htab->elf.splt->output_section->vma
4585 		       - htab->elf.splt->output_offset
4586 		       - htab->tlsdesc_plt
4587 		       - htab->lazy_plt->plt_tlsdesc_got1_insn_end),
4588 		      (htab->elf.splt->contents
4589 		       + htab->tlsdesc_plt
4590 		       + htab->lazy_plt->plt_tlsdesc_got1_offset));
4591 	  /* Add offset for indirect branch via GOT+TDG, where TDG
4592 	     stands for htab->tlsdesc_got, subtracting the offset
4593 	     to the end of that instruction.  */
4594 	  bfd_put_32 (output_bfd,
4595 		      (htab->elf.sgot->output_section->vma
4596 		       + htab->elf.sgot->output_offset
4597 		       + htab->tlsdesc_got
4598 		       - htab->elf.splt->output_section->vma
4599 		       - htab->elf.splt->output_offset
4600 		       - htab->tlsdesc_plt
4601 		       - htab->lazy_plt->plt_tlsdesc_got2_insn_end),
4602 		      (htab->elf.splt->contents
4603 		       + htab->tlsdesc_plt
4604 		       + htab->lazy_plt->plt_tlsdesc_got2_offset));
4605 	}
4606     }
4607 
4608   /* Fill PLT entries for undefined weak symbols in PIE.  */
4609   if (bfd_link_pie (info))
4610     bfd_hash_traverse (&info->hash->table,
4611 		       elf_x86_64_pie_finish_undefweak_symbol,
4612 		       info);
4613 
4614   return TRUE;
4615 }
4616 
4617 /* Fill PLT/GOT entries and allocate dynamic relocations for local
4618    STT_GNU_IFUNC symbols, which aren't in the ELF linker hash table.
4619    It has to be done before elf_link_sort_relocs is called so that
4620    dynamic relocations are properly sorted.  */
4621 
4622 static bfd_boolean
4623 elf_x86_64_output_arch_local_syms
4624   (bfd *output_bfd ATTRIBUTE_UNUSED,
4625    struct bfd_link_info *info,
4626    void *flaginfo ATTRIBUTE_UNUSED,
4627    int (*func) (void *, const char *,
4628 		Elf_Internal_Sym *,
4629 		asection *,
4630 		struct elf_link_hash_entry *) ATTRIBUTE_UNUSED)
4631 {
4632   struct elf_x86_link_hash_table *htab
4633     = elf_x86_hash_table (info, X86_64_ELF_DATA);
4634   if (htab == NULL)
4635     return FALSE;
4636 
4637   /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
4638   htab_traverse (htab->loc_hash_table,
4639 		 elf_x86_64_finish_local_dynamic_symbol,
4640 		 info);
4641 
4642   return TRUE;
4643 }
4644 
4645 /* Forward declaration.  */
4646 static const struct elf_x86_lazy_plt_layout elf_x86_64_nacl_plt;
4647 
4648 /* Similar to _bfd_elf_get_synthetic_symtab.  Support PLTs with all
4649    dynamic relocations.   */
4650 
4651 static long
4652 elf_x86_64_get_synthetic_symtab (bfd *abfd,
4653 				 long symcount ATTRIBUTE_UNUSED,
4654 				 asymbol **syms ATTRIBUTE_UNUSED,
4655 				 long dynsymcount,
4656 				 asymbol **dynsyms,
4657 				 asymbol **ret)
4658 {
4659   long count, i, n;
4660   int j;
4661   bfd_byte *plt_contents;
4662   long relsize;
4663   const struct elf_x86_lazy_plt_layout *lazy_plt;
4664   const struct elf_x86_non_lazy_plt_layout *non_lazy_plt;
4665   const struct elf_x86_lazy_plt_layout *lazy_bnd_plt;
4666   const struct elf_x86_non_lazy_plt_layout *non_lazy_bnd_plt;
4667   const struct elf_x86_lazy_plt_layout *lazy_ibt_plt;
4668   const struct elf_x86_non_lazy_plt_layout *non_lazy_ibt_plt;
4669   asection *plt;
4670   enum elf_x86_plt_type plt_type;
4671   struct elf_x86_plt plts[] =
4672     {
4673       { ".plt", NULL, NULL, plt_unknown, 0, 0, 0, 0 },
4674       { ".plt.got", NULL, NULL, plt_non_lazy, 0, 0, 0, 0 },
4675       { ".plt.sec", NULL, NULL, plt_second, 0, 0, 0, 0 },
4676       { ".plt.bnd", NULL, NULL, plt_second, 0, 0, 0, 0 },
4677       { NULL, NULL, NULL, plt_non_lazy, 0, 0, 0, 0 }
4678     };
4679 
4680   *ret = NULL;
4681 
4682   if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
4683     return 0;
4684 
4685   if (dynsymcount <= 0)
4686     return 0;
4687 
4688   relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
4689   if (relsize <= 0)
4690     return -1;
4691 
4692   if (get_elf_x86_backend_data (abfd)->target_os != is_nacl)
4693     {
4694       lazy_plt = &elf_x86_64_lazy_plt;
4695       non_lazy_plt = &elf_x86_64_non_lazy_plt;
4696       lazy_bnd_plt = &elf_x86_64_lazy_bnd_plt;
4697       non_lazy_bnd_plt = &elf_x86_64_non_lazy_bnd_plt;
4698       if (ABI_64_P (abfd))
4699 	{
4700 	  lazy_ibt_plt = &elf_x86_64_lazy_ibt_plt;
4701 	  non_lazy_ibt_plt = &elf_x86_64_non_lazy_ibt_plt;
4702 	}
4703       else
4704 	{
4705 	  lazy_ibt_plt = &elf_x32_lazy_ibt_plt;
4706 	  non_lazy_ibt_plt = &elf_x32_non_lazy_ibt_plt;
4707 	}
4708     }
4709   else
4710     {
4711       lazy_plt = &elf_x86_64_nacl_plt;
4712       non_lazy_plt = NULL;
4713       lazy_bnd_plt = NULL;
4714       non_lazy_bnd_plt = NULL;
4715       lazy_ibt_plt = NULL;
4716       non_lazy_ibt_plt = NULL;
4717     }
4718 
4719   count = 0;
4720   for (j = 0; plts[j].name != NULL; j++)
4721     {
4722       plt = bfd_get_section_by_name (abfd, plts[j].name);
4723       if (plt == NULL || plt->size == 0)
4724 	continue;
4725 
4726       /* Get the PLT section contents.  */
4727       plt_contents = (bfd_byte *) bfd_malloc (plt->size);
4728       if (plt_contents == NULL)
4729 	break;
4730       if (!bfd_get_section_contents (abfd, (asection *) plt,
4731 				     plt_contents, 0, plt->size))
4732 	{
4733 	  free (plt_contents);
4734 	  break;
4735 	}
4736 
4737       /* Check what kind of PLT it is.  */
4738       plt_type = plt_unknown;
4739       if (plts[j].type == plt_unknown
4740 	  && (plt->size >= (lazy_plt->plt_entry_size
4741 			    + lazy_plt->plt_entry_size)))
4742 	{
4743 	  /* Match lazy PLT first.  Need to check the first two
4744 	     instructions.   */
4745 	  if ((memcmp (plt_contents, lazy_plt->plt0_entry,
4746 		       lazy_plt->plt0_got1_offset) == 0)
4747 	      && (memcmp (plt_contents + 6, lazy_plt->plt0_entry + 6,
4748 			  2) == 0))
4749 	    plt_type = plt_lazy;
4750 	  else if (lazy_bnd_plt != NULL
4751 		   && (memcmp (plt_contents, lazy_bnd_plt->plt0_entry,
4752 			       lazy_bnd_plt->plt0_got1_offset) == 0)
4753 		   && (memcmp (plt_contents + 6,
4754 			       lazy_bnd_plt->plt0_entry + 6, 3) == 0))
4755 	    {
4756 	      plt_type = plt_lazy | plt_second;
4757 	      /* The fist entry in the lazy IBT PLT is the same as the
4758 		 lazy BND PLT.  */
4759 	      if ((memcmp (plt_contents + lazy_ibt_plt->plt_entry_size,
4760 			   lazy_ibt_plt->plt_entry,
4761 			   lazy_ibt_plt->plt_got_offset) == 0))
4762 		lazy_plt = lazy_ibt_plt;
4763 	      else
4764 		lazy_plt = lazy_bnd_plt;
4765 	    }
4766 	}
4767 
4768       if (non_lazy_plt != NULL
4769 	  && (plt_type == plt_unknown || plt_type == plt_non_lazy)
4770 	  && plt->size >= non_lazy_plt->plt_entry_size)
4771 	{
4772 	  /* Match non-lazy PLT.  */
4773 	  if (memcmp (plt_contents, non_lazy_plt->plt_entry,
4774 		      non_lazy_plt->plt_got_offset) == 0)
4775 	    plt_type = plt_non_lazy;
4776 	}
4777 
4778       if (plt_type == plt_unknown || plt_type == plt_second)
4779 	{
4780 	  if (non_lazy_bnd_plt != NULL
4781 	      && plt->size >= non_lazy_bnd_plt->plt_entry_size
4782 	      && (memcmp (plt_contents, non_lazy_bnd_plt->plt_entry,
4783 			  non_lazy_bnd_plt->plt_got_offset) == 0))
4784 	    {
4785 	      /* Match BND PLT.  */
4786 	      plt_type = plt_second;
4787 	      non_lazy_plt = non_lazy_bnd_plt;
4788 	    }
4789 	  else if (non_lazy_ibt_plt != NULL
4790 		   && plt->size >= non_lazy_ibt_plt->plt_entry_size
4791 		   && (memcmp (plt_contents,
4792 			       non_lazy_ibt_plt->plt_entry,
4793 			       non_lazy_ibt_plt->plt_got_offset) == 0))
4794 	    {
4795 	      /* Match IBT PLT.  */
4796 	      plt_type = plt_second;
4797 	      non_lazy_plt = non_lazy_ibt_plt;
4798 	    }
4799 	}
4800 
4801       if (plt_type == plt_unknown)
4802 	{
4803 	  free (plt_contents);
4804 	  continue;
4805 	}
4806 
4807       plts[j].sec = plt;
4808       plts[j].type = plt_type;
4809 
4810       if ((plt_type & plt_lazy))
4811 	{
4812 	  plts[j].plt_got_offset = lazy_plt->plt_got_offset;
4813 	  plts[j].plt_got_insn_size = lazy_plt->plt_got_insn_size;
4814 	  plts[j].plt_entry_size = lazy_plt->plt_entry_size;
4815 	  /* Skip PLT0 in lazy PLT.  */
4816 	  i = 1;
4817 	}
4818       else
4819 	{
4820 	  plts[j].plt_got_offset = non_lazy_plt->plt_got_offset;
4821 	  plts[j].plt_got_insn_size = non_lazy_plt->plt_got_insn_size;
4822 	  plts[j].plt_entry_size = non_lazy_plt->plt_entry_size;
4823 	  i = 0;
4824 	}
4825 
4826       /* Skip lazy PLT when the second PLT is used.  */
4827       if (plt_type == (plt_lazy | plt_second))
4828 	plts[j].count = 0;
4829       else
4830 	{
4831 	  n = plt->size / plts[j].plt_entry_size;
4832 	  plts[j].count = n;
4833 	  count += n - i;
4834 	}
4835 
4836       plts[j].contents = plt_contents;
4837     }
4838 
4839   return _bfd_x86_elf_get_synthetic_symtab (abfd, count, relsize,
4840 					    (bfd_vma) 0, plts, dynsyms,
4841 					    ret);
4842 }
4843 
4844 /* Handle an x86-64 specific section when reading an object file.  This
4845    is called when elfcode.h finds a section with an unknown type.  */
4846 
4847 static bfd_boolean
4848 elf_x86_64_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr,
4849 			      const char *name, int shindex)
4850 {
4851   if (hdr->sh_type != SHT_X86_64_UNWIND)
4852     return FALSE;
4853 
4854   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
4855     return FALSE;
4856 
4857   return TRUE;
4858 }
4859 
4860 /* Hook called by the linker routine which adds symbols from an object
4861    file.  We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
4862    of .bss.  */
4863 
4864 static bfd_boolean
4865 elf_x86_64_add_symbol_hook (bfd *abfd,
4866 			    struct bfd_link_info *info ATTRIBUTE_UNUSED,
4867 			    Elf_Internal_Sym *sym,
4868 			    const char **namep ATTRIBUTE_UNUSED,
4869 			    flagword *flagsp ATTRIBUTE_UNUSED,
4870 			    asection **secp,
4871 			    bfd_vma *valp)
4872 {
4873   asection *lcomm;
4874 
4875   switch (sym->st_shndx)
4876     {
4877     case SHN_X86_64_LCOMMON:
4878       lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
4879       if (lcomm == NULL)
4880 	{
4881 	  lcomm = bfd_make_section_with_flags (abfd,
4882 					       "LARGE_COMMON",
4883 					       (SEC_ALLOC
4884 						| SEC_IS_COMMON
4885 						| SEC_LINKER_CREATED));
4886 	  if (lcomm == NULL)
4887 	    return FALSE;
4888 	  elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
4889 	}
4890       *secp = lcomm;
4891       *valp = sym->st_size;
4892       return TRUE;
4893     }
4894 
4895   return TRUE;
4896 }
4897 
4898 
4899 /* Given a BFD section, try to locate the corresponding ELF section
4900    index.  */
4901 
4902 static bfd_boolean
4903 elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
4904 					 asection *sec, int *index_return)
4905 {
4906   if (sec == &_bfd_elf_large_com_section)
4907     {
4908       *index_return = SHN_X86_64_LCOMMON;
4909       return TRUE;
4910     }
4911   return FALSE;
4912 }
4913 
4914 /* Process a symbol.  */
4915 
4916 static void
4917 elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
4918 			      asymbol *asym)
4919 {
4920   elf_symbol_type *elfsym = (elf_symbol_type *) asym;
4921 
4922   switch (elfsym->internal_elf_sym.st_shndx)
4923     {
4924     case SHN_X86_64_LCOMMON:
4925       asym->section = &_bfd_elf_large_com_section;
4926       asym->value = elfsym->internal_elf_sym.st_size;
4927       /* Common symbol doesn't set BSF_GLOBAL.  */
4928       asym->flags &= ~BSF_GLOBAL;
4929       break;
4930     }
4931 }
4932 
4933 static bfd_boolean
4934 elf_x86_64_common_definition (Elf_Internal_Sym *sym)
4935 {
4936   return (sym->st_shndx == SHN_COMMON
4937 	  || sym->st_shndx == SHN_X86_64_LCOMMON);
4938 }
4939 
4940 static unsigned int
4941 elf_x86_64_common_section_index (asection *sec)
4942 {
4943   if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
4944     return SHN_COMMON;
4945   else
4946     return SHN_X86_64_LCOMMON;
4947 }
4948 
4949 static asection *
4950 elf_x86_64_common_section (asection *sec)
4951 {
4952   if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
4953     return bfd_com_section_ptr;
4954   else
4955     return &_bfd_elf_large_com_section;
4956 }
4957 
4958 static bfd_boolean
4959 elf_x86_64_merge_symbol (struct elf_link_hash_entry *h,
4960 			 const Elf_Internal_Sym *sym,
4961 			 asection **psec,
4962 			 bfd_boolean newdef,
4963 			 bfd_boolean olddef,
4964 			 bfd *oldbfd,
4965 			 const asection *oldsec)
4966 {
4967   /* A normal common symbol and a large common symbol result in a
4968      normal common symbol.  We turn the large common symbol into a
4969      normal one.  */
4970   if (!olddef
4971       && h->root.type == bfd_link_hash_common
4972       && !newdef
4973       && bfd_is_com_section (*psec)
4974       && oldsec != *psec)
4975     {
4976       if (sym->st_shndx == SHN_COMMON
4977 	  && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) != 0)
4978 	{
4979 	  h->root.u.c.p->section
4980 	    = bfd_make_section_old_way (oldbfd, "COMMON");
4981 	  h->root.u.c.p->section->flags = SEC_ALLOC;
4982 	}
4983       else if (sym->st_shndx == SHN_X86_64_LCOMMON
4984 	       && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) == 0)
4985 	*psec = bfd_com_section_ptr;
4986     }
4987 
4988   return TRUE;
4989 }
4990 
4991 static int
4992 elf_x86_64_additional_program_headers (bfd *abfd,
4993 				       struct bfd_link_info *info ATTRIBUTE_UNUSED)
4994 {
4995   asection *s;
4996   int count = 0;
4997 
4998   /* Check to see if we need a large readonly segment.  */
4999   s = bfd_get_section_by_name (abfd, ".lrodata");
5000   if (s && (s->flags & SEC_LOAD))
5001     count++;
5002 
5003   /* Check to see if we need a large data segment.  Since .lbss sections
5004      is placed right after the .bss section, there should be no need for
5005      a large data segment just because of .lbss.  */
5006   s = bfd_get_section_by_name (abfd, ".ldata");
5007   if (s && (s->flags & SEC_LOAD))
5008     count++;
5009 
5010   return count;
5011 }
5012 
5013 /* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
5014 
5015 static bfd_boolean
5016 elf_x86_64_relocs_compatible (const bfd_target *input,
5017 			      const bfd_target *output)
5018 {
5019   return ((xvec_get_elf_backend_data (input)->s->elfclass
5020 	   == xvec_get_elf_backend_data (output)->s->elfclass)
5021 	  && _bfd_elf_relocs_compatible (input, output));
5022 }
5023 
5024 /* Set up x86-64 GNU properties.  Return the first relocatable ELF input
5025    with GNU properties if found.  Otherwise, return NULL.  */
5026 
5027 static bfd *
5028 elf_x86_64_link_setup_gnu_properties (struct bfd_link_info *info)
5029 {
5030   struct elf_x86_init_table init_table;
5031 
5032   if ((int) R_X86_64_standard >= (int) R_X86_64_converted_reloc_bit
5033       || (int) R_X86_64_max <= (int) R_X86_64_converted_reloc_bit
5034       || ((int) (R_X86_64_GNU_VTINHERIT | R_X86_64_converted_reloc_bit)
5035 	  != (int) R_X86_64_GNU_VTINHERIT)
5036       || ((int) (R_X86_64_GNU_VTENTRY | R_X86_64_converted_reloc_bit)
5037 	  != (int) R_X86_64_GNU_VTENTRY))
5038     abort ();
5039 
5040   /* This is unused for x86-64.  */
5041   init_table.plt0_pad_byte = 0x90;
5042 
5043   if (get_elf_x86_backend_data (info->output_bfd)->target_os != is_nacl)
5044     {
5045       const struct elf_backend_data *bed
5046 	= get_elf_backend_data (info->output_bfd);
5047       struct elf_x86_link_hash_table *htab
5048 	= elf_x86_hash_table (info, bed->target_id);
5049       if (!htab)
5050 	abort ();
5051       if (htab->params->bndplt)
5052 	{
5053 	  init_table.lazy_plt = &elf_x86_64_lazy_bnd_plt;
5054 	  init_table.non_lazy_plt = &elf_x86_64_non_lazy_bnd_plt;
5055 	}
5056       else
5057 	{
5058 	  init_table.lazy_plt = &elf_x86_64_lazy_plt;
5059 	  init_table.non_lazy_plt = &elf_x86_64_non_lazy_plt;
5060 	}
5061 
5062       if (ABI_64_P (info->output_bfd))
5063 	{
5064 	  init_table.lazy_ibt_plt = &elf_x86_64_lazy_ibt_plt;
5065 	  init_table.non_lazy_ibt_plt = &elf_x86_64_non_lazy_ibt_plt;
5066 	}
5067       else
5068 	{
5069 	  init_table.lazy_ibt_plt = &elf_x32_lazy_ibt_plt;
5070 	  init_table.non_lazy_ibt_plt = &elf_x32_non_lazy_ibt_plt;
5071 	}
5072     }
5073   else
5074     {
5075       init_table.lazy_plt = &elf_x86_64_nacl_plt;
5076       init_table.non_lazy_plt = NULL;
5077       init_table.lazy_ibt_plt = NULL;
5078       init_table.non_lazy_ibt_plt = NULL;
5079     }
5080 
5081   if (ABI_64_P (info->output_bfd))
5082     {
5083       init_table.r_info = elf64_r_info;
5084       init_table.r_sym = elf64_r_sym;
5085     }
5086   else
5087     {
5088       init_table.r_info = elf32_r_info;
5089       init_table.r_sym = elf32_r_sym;
5090     }
5091 
5092   return _bfd_x86_elf_link_setup_gnu_properties (info, &init_table);
5093 }
5094 
5095 static const struct bfd_elf_special_section
5096 elf_x86_64_special_sections[]=
5097 {
5098   { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
5099   { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
5100   { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
5101   { STRING_COMMA_LEN (".lbss"),		   -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
5102   { STRING_COMMA_LEN (".ldata"),	   -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
5103   { STRING_COMMA_LEN (".lrodata"),	   -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
5104   { NULL,			0,	    0, 0,	     0 }
5105 };
5106 
5107 #define TARGET_LITTLE_SYM		    x86_64_elf64_vec
5108 #define TARGET_LITTLE_NAME		    "elf64-x86-64"
5109 #define ELF_ARCH			    bfd_arch_i386
5110 #define ELF_TARGET_ID			    X86_64_ELF_DATA
5111 #define ELF_MACHINE_CODE		    EM_X86_64
5112 #if DEFAULT_LD_Z_SEPARATE_CODE
5113 # define ELF_MAXPAGESIZE		    0x1000
5114 #else
5115 # define ELF_MAXPAGESIZE		    0x200000
5116 #endif
5117 #define ELF_MINPAGESIZE			    0x1000
5118 #define ELF_COMMONPAGESIZE		    0x1000
5119 
5120 #define elf_backend_can_gc_sections	    1
5121 #define elf_backend_can_refcount	    1
5122 #define elf_backend_want_got_plt	    1
5123 #define elf_backend_plt_readonly	    1
5124 #define elf_backend_want_plt_sym	    0
5125 #define elf_backend_got_header_size	    (GOT_ENTRY_SIZE*3)
5126 #define elf_backend_rela_normal		    1
5127 #define elf_backend_plt_alignment	    4
5128 #define elf_backend_extern_protected_data   1
5129 #define elf_backend_caches_rawsize	    1
5130 #define elf_backend_dtrel_excludes_plt	    1
5131 #define elf_backend_want_dynrelro	    1
5132 
5133 #define elf_info_to_howto		    elf_x86_64_info_to_howto
5134 
5135 #define bfd_elf64_bfd_reloc_type_lookup	    elf_x86_64_reloc_type_lookup
5136 #define bfd_elf64_bfd_reloc_name_lookup \
5137   elf_x86_64_reloc_name_lookup
5138 
5139 #define elf_backend_relocs_compatible	    elf_x86_64_relocs_compatible
5140 #define elf_backend_check_relocs	    elf_x86_64_check_relocs
5141 #define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
5142 #define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
5143 #define elf_backend_finish_dynamic_symbol   elf_x86_64_finish_dynamic_symbol
5144 #define elf_backend_output_arch_local_syms  elf_x86_64_output_arch_local_syms
5145 #define elf_backend_grok_prstatus	    elf_x86_64_grok_prstatus
5146 #define elf_backend_grok_psinfo		    elf_x86_64_grok_psinfo
5147 #ifdef CORE_HEADER
5148 #define elf_backend_write_core_note	    elf_x86_64_write_core_note
5149 #endif
5150 #define elf_backend_reloc_type_class	    elf_x86_64_reloc_type_class
5151 #define elf_backend_relocate_section	    elf_x86_64_relocate_section
5152 #define elf_backend_init_index_section	    _bfd_elf_init_1_index_section
5153 #define elf_backend_object_p		    elf64_x86_64_elf_object_p
5154 #define bfd_elf64_get_synthetic_symtab	    elf_x86_64_get_synthetic_symtab
5155 
5156 #define elf_backend_section_from_shdr \
5157 	elf_x86_64_section_from_shdr
5158 
5159 #define elf_backend_section_from_bfd_section \
5160   elf_x86_64_elf_section_from_bfd_section
5161 #define elf_backend_add_symbol_hook \
5162   elf_x86_64_add_symbol_hook
5163 #define elf_backend_symbol_processing \
5164   elf_x86_64_symbol_processing
5165 #define elf_backend_common_section_index \
5166   elf_x86_64_common_section_index
5167 #define elf_backend_common_section \
5168   elf_x86_64_common_section
5169 #define elf_backend_common_definition \
5170   elf_x86_64_common_definition
5171 #define elf_backend_merge_symbol \
5172   elf_x86_64_merge_symbol
5173 #define elf_backend_special_sections \
5174   elf_x86_64_special_sections
5175 #define elf_backend_additional_program_headers \
5176   elf_x86_64_additional_program_headers
5177 #define elf_backend_setup_gnu_properties \
5178   elf_x86_64_link_setup_gnu_properties
5179 #define elf_backend_hide_symbol \
5180   _bfd_x86_elf_hide_symbol
5181 
5182 #undef	elf64_bed
5183 #define elf64_bed elf64_x86_64_bed
5184 
5185 #include "elf64-target.h"
5186 
5187 /* CloudABI support.  */
5188 
5189 #undef	TARGET_LITTLE_SYM
5190 #define TARGET_LITTLE_SYM		    x86_64_elf64_cloudabi_vec
5191 #undef	TARGET_LITTLE_NAME
5192 #define TARGET_LITTLE_NAME		    "elf64-x86-64-cloudabi"
5193 
5194 #undef	ELF_OSABI
5195 #define	ELF_OSABI			    ELFOSABI_CLOUDABI
5196 
5197 #undef	elf64_bed
5198 #define elf64_bed elf64_x86_64_cloudabi_bed
5199 
5200 #include "elf64-target.h"
5201 
5202 /* FreeBSD support.  */
5203 
5204 #undef	TARGET_LITTLE_SYM
5205 #define TARGET_LITTLE_SYM		    x86_64_elf64_fbsd_vec
5206 #undef	TARGET_LITTLE_NAME
5207 #define TARGET_LITTLE_NAME		    "elf64-x86-64-freebsd"
5208 
5209 #undef	ELF_OSABI
5210 #define	ELF_OSABI			    ELFOSABI_FREEBSD
5211 
5212 #undef	elf64_bed
5213 #define elf64_bed elf64_x86_64_fbsd_bed
5214 
5215 #include "elf64-target.h"
5216 
5217 /* Solaris 2 support.  */
5218 
5219 #undef  TARGET_LITTLE_SYM
5220 #define TARGET_LITTLE_SYM		    x86_64_elf64_sol2_vec
5221 #undef  TARGET_LITTLE_NAME
5222 #define TARGET_LITTLE_NAME		    "elf64-x86-64-sol2"
5223 
5224 static const struct elf_x86_backend_data elf_x86_64_solaris_arch_bed =
5225   {
5226     is_solaris				    /* os */
5227   };
5228 
5229 #undef	elf_backend_arch_data
5230 #define	elf_backend_arch_data		    &elf_x86_64_solaris_arch_bed
5231 
5232 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
5233    objects won't be recognized.  */
5234 #undef ELF_OSABI
5235 
5236 #undef  elf64_bed
5237 #define elf64_bed			    elf64_x86_64_sol2_bed
5238 
5239 /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
5240    boundary.  */
5241 #undef  elf_backend_static_tls_alignment
5242 #define elf_backend_static_tls_alignment    16
5243 
5244 /* The Solaris 2 ABI requires a plt symbol on all platforms.
5245 
5246    Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
5247    File, p.63.  */
5248 #undef  elf_backend_want_plt_sym
5249 #define elf_backend_want_plt_sym	    1
5250 
5251 #undef  elf_backend_strtab_flags
5252 #define elf_backend_strtab_flags	SHF_STRINGS
5253 
5254 static bfd_boolean
5255 elf64_x86_64_copy_solaris_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED,
5256 						  bfd *obfd ATTRIBUTE_UNUSED,
5257 						  const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
5258 						  Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
5259 {
5260   /* PR 19938: FIXME: Need to add code for setting the sh_info
5261      and sh_link fields of Solaris specific section types.  */
5262   return FALSE;
5263 }
5264 
5265 #undef  elf_backend_copy_special_section_fields
5266 #define elf_backend_copy_special_section_fields elf64_x86_64_copy_solaris_special_section_fields
5267 
5268 #include "elf64-target.h"
5269 
5270 /* Native Client support.  */
5271 
5272 static bfd_boolean
5273 elf64_x86_64_nacl_elf_object_p (bfd *abfd)
5274 {
5275   /* Set the right machine number for a NaCl x86-64 ELF64 file.  */
5276   bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64_nacl);
5277   return TRUE;
5278 }
5279 
5280 #undef	TARGET_LITTLE_SYM
5281 #define	TARGET_LITTLE_SYM		x86_64_elf64_nacl_vec
5282 #undef	TARGET_LITTLE_NAME
5283 #define	TARGET_LITTLE_NAME		"elf64-x86-64-nacl"
5284 #undef	elf64_bed
5285 #define	elf64_bed			elf64_x86_64_nacl_bed
5286 
5287 #undef	ELF_MAXPAGESIZE
5288 #undef	ELF_MINPAGESIZE
5289 #undef	ELF_COMMONPAGESIZE
5290 #define ELF_MAXPAGESIZE			0x10000
5291 #define ELF_MINPAGESIZE			0x10000
5292 #define ELF_COMMONPAGESIZE		0x10000
5293 
5294 /* Restore defaults.  */
5295 #undef	ELF_OSABI
5296 #undef	elf_backend_static_tls_alignment
5297 #undef	elf_backend_want_plt_sym
5298 #define elf_backend_want_plt_sym	0
5299 #undef  elf_backend_strtab_flags
5300 #undef  elf_backend_copy_special_section_fields
5301 
5302 /* NaCl uses substantially different PLT entries for the same effects.  */
5303 
5304 #undef	elf_backend_plt_alignment
5305 #define elf_backend_plt_alignment	5
5306 #define NACL_PLT_ENTRY_SIZE		64
5307 #define	NACLMASK			0xe0 /* 32-byte alignment mask.  */
5308 
5309 static const bfd_byte elf_x86_64_nacl_plt0_entry[NACL_PLT_ENTRY_SIZE] =
5310   {
5311     0xff, 0x35, 8, 0, 0, 0,		/* pushq GOT+8(%rip)		*/
5312     0x4c, 0x8b, 0x1d, 16, 0, 0, 0,	/* mov GOT+16(%rip), %r11	*/
5313     0x41, 0x83, 0xe3, NACLMASK,		/* and $-32, %r11d		*/
5314     0x4d, 0x01, 0xfb,			/* add %r15, %r11		*/
5315     0x41, 0xff, 0xe3,			/* jmpq *%r11			*/
5316 
5317     /* 9-byte nop sequence to pad out to the next 32-byte boundary.  */
5318     0x66, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw 0x0(%rax,%rax,1)	*/
5319 
5320     /* 32 bytes of nop to pad out to the standard size.  */
5321     0x66, 0x66, 0x66, 0x66, 0x66, 0x66,    /* excess data16 prefixes	*/
5322     0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1)	*/
5323     0x66, 0x66, 0x66, 0x66, 0x66, 0x66,    /* excess data16 prefixes	*/
5324     0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1)	*/
5325     0x66,				   /* excess data16 prefix	*/
5326     0x90				   /* nop */
5327   };
5328 
5329 static const bfd_byte elf_x86_64_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
5330   {
5331     0x4c, 0x8b, 0x1d, 0, 0, 0, 0,	/* mov name@GOTPCREL(%rip),%r11	*/
5332     0x41, 0x83, 0xe3, NACLMASK,		/* and $-32, %r11d		*/
5333     0x4d, 0x01, 0xfb,			/* add %r15, %r11		*/
5334     0x41, 0xff, 0xe3,			/* jmpq *%r11			*/
5335 
5336     /* 15-byte nop sequence to pad out to the next 32-byte boundary.  */
5337     0x66, 0x66, 0x66, 0x66, 0x66, 0x66,    /* excess data16 prefixes	*/
5338     0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1)	*/
5339 
5340     /* Lazy GOT entries point here (32-byte aligned).  */
5341     0x68,		  /* pushq immediate */
5342     0, 0, 0, 0,		  /* replaced with index into relocation table.	 */
5343     0xe9,		  /* jmp relative */
5344     0, 0, 0, 0,		  /* replaced with offset to start of .plt0.  */
5345 
5346     /* 22 bytes of nop to pad out to the standard size.	 */
5347     0x66, 0x66, 0x66, 0x66, 0x66, 0x66,    /* excess data16 prefixes	*/
5348     0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1)	*/
5349     0x0f, 0x1f, 0x80, 0, 0, 0, 0,	   /* nopl 0x0(%rax)		*/
5350   };
5351 
5352 /* .eh_frame covering the .plt section.  */
5353 
5354 static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] =
5355   {
5356 #if (PLT_CIE_LENGTH != 20				\
5357      || PLT_FDE_LENGTH != 36				\
5358      || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8	\
5359      || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
5360 # error "Need elf_x86_backend_data parameters for eh_frame_plt offsets!"
5361 #endif
5362     PLT_CIE_LENGTH, 0, 0, 0,	/* CIE length */
5363     0, 0, 0, 0,			/* CIE ID */
5364     1,				/* CIE version */
5365     'z', 'R', 0,		/* Augmentation string */
5366     1,				/* Code alignment factor */
5367     0x78,			/* Data alignment factor */
5368     16,				/* Return address column */
5369     1,				/* Augmentation size */
5370     DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
5371     DW_CFA_def_cfa, 7, 8,	/* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
5372     DW_CFA_offset + 16, 1,	/* DW_CFA_offset: r16 (rip) at cfa-8 */
5373     DW_CFA_nop, DW_CFA_nop,
5374 
5375     PLT_FDE_LENGTH, 0, 0, 0,	/* FDE length */
5376     PLT_CIE_LENGTH + 8, 0, 0, 0,/* CIE pointer */
5377     0, 0, 0, 0,			/* R_X86_64_PC32 .plt goes here */
5378     0, 0, 0, 0,			/* .plt size goes here */
5379     0,				/* Augmentation size */
5380     DW_CFA_def_cfa_offset, 16,	/* DW_CFA_def_cfa_offset: 16 */
5381     DW_CFA_advance_loc + 6,	/* DW_CFA_advance_loc: 6 to __PLT__+6 */
5382     DW_CFA_def_cfa_offset, 24,	/* DW_CFA_def_cfa_offset: 24 */
5383     DW_CFA_advance_loc + 58,	/* DW_CFA_advance_loc: 58 to __PLT__+64 */
5384     DW_CFA_def_cfa_expression,	/* DW_CFA_def_cfa_expression */
5385     13,				/* Block length */
5386     DW_OP_breg7, 8,		/* DW_OP_breg7 (rsp): 8 */
5387     DW_OP_breg16, 0,		/* DW_OP_breg16 (rip): 0 */
5388     DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
5389     DW_OP_lit3, DW_OP_shl, DW_OP_plus,
5390     DW_CFA_nop, DW_CFA_nop
5391   };
5392 
5393 static const struct elf_x86_lazy_plt_layout elf_x86_64_nacl_plt =
5394   {
5395     elf_x86_64_nacl_plt0_entry,		     /* plt0_entry */
5396     NACL_PLT_ENTRY_SIZE,		     /* plt0_entry_size */
5397     elf_x86_64_nacl_plt_entry,		     /* plt_entry */
5398     NACL_PLT_ENTRY_SIZE,		     /* plt_entry_size */
5399     elf_x86_64_nacl_plt0_entry,		     /* plt_tlsdesc_entry */
5400     NACL_PLT_ENTRY_SIZE,		     /* plt_tlsdesc_entry_size */
5401     2,					     /* plt_tlsdesc_got1_offset */
5402     9,					     /* plt_tlsdesc_got2_offset */
5403     6,					     /* plt_tlsdesc_got1_insn_end */
5404     13,					     /* plt_tlsdesc_got2_insn_end */
5405     2,					     /* plt0_got1_offset */
5406     9,					     /* plt0_got2_offset */
5407     13,					     /* plt0_got2_insn_end */
5408     3,					     /* plt_got_offset */
5409     33,					     /* plt_reloc_offset */
5410     38,					     /* plt_plt_offset */
5411     7,					     /* plt_got_insn_size */
5412     42,					     /* plt_plt_insn_end */
5413     32,					     /* plt_lazy_offset */
5414     elf_x86_64_nacl_plt0_entry,		     /* pic_plt0_entry */
5415     elf_x86_64_nacl_plt_entry,		     /* pic_plt_entry */
5416     elf_x86_64_nacl_eh_frame_plt,	     /* eh_frame_plt */
5417     sizeof (elf_x86_64_nacl_eh_frame_plt)    /* eh_frame_plt_size */
5418   };
5419 
5420 static const struct elf_x86_backend_data elf_x86_64_nacl_arch_bed =
5421   {
5422     is_nacl				     /* os */
5423   };
5424 
5425 #undef	elf_backend_arch_data
5426 #define	elf_backend_arch_data	&elf_x86_64_nacl_arch_bed
5427 
5428 #undef	elf_backend_object_p
5429 #define elf_backend_object_p			elf64_x86_64_nacl_elf_object_p
5430 #undef	elf_backend_modify_segment_map
5431 #define	elf_backend_modify_segment_map		nacl_modify_segment_map
5432 #undef	elf_backend_modify_headers
5433 #define	elf_backend_modify_headers		nacl_modify_headers
5434 #undef	elf_backend_final_write_processing
5435 #define elf_backend_final_write_processing	nacl_final_write_processing
5436 
5437 #include "elf64-target.h"
5438 
5439 /* Native Client x32 support.  */
5440 
5441 static bfd_boolean
5442 elf32_x86_64_nacl_elf_object_p (bfd *abfd)
5443 {
5444   /* Set the right machine number for a NaCl x86-64 ELF32 file.  */
5445   bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32_nacl);
5446   return TRUE;
5447 }
5448 
5449 #undef	TARGET_LITTLE_SYM
5450 #define TARGET_LITTLE_SYM		x86_64_elf32_nacl_vec
5451 #undef	TARGET_LITTLE_NAME
5452 #define TARGET_LITTLE_NAME		"elf32-x86-64-nacl"
5453 #undef	elf32_bed
5454 #define	elf32_bed			elf32_x86_64_nacl_bed
5455 
5456 #define bfd_elf32_bfd_reloc_type_lookup	\
5457   elf_x86_64_reloc_type_lookup
5458 #define bfd_elf32_bfd_reloc_name_lookup \
5459   elf_x86_64_reloc_name_lookup
5460 #define bfd_elf32_get_synthetic_symtab \
5461   elf_x86_64_get_synthetic_symtab
5462 
5463 #undef elf_backend_object_p
5464 #define elf_backend_object_p \
5465   elf32_x86_64_nacl_elf_object_p
5466 
5467 #undef elf_backend_bfd_from_remote_memory
5468 #define elf_backend_bfd_from_remote_memory \
5469   _bfd_elf32_bfd_from_remote_memory
5470 
5471 #undef elf_backend_size_info
5472 #define elf_backend_size_info \
5473   _bfd_elf32_size_info
5474 
5475 #undef	elf32_bed
5476 #define	elf32_bed			elf32_x86_64_bed
5477 
5478 #include "elf32-target.h"
5479 
5480 /* Restore defaults.  */
5481 #undef	elf_backend_object_p
5482 #define elf_backend_object_p		    elf64_x86_64_elf_object_p
5483 #undef	elf_backend_bfd_from_remote_memory
5484 #undef	elf_backend_size_info
5485 #undef	elf_backend_modify_segment_map
5486 #undef	elf_backend_modify_headers
5487 #undef	elf_backend_final_write_processing
5488 
5489 /* Intel L1OM support.  */
5490 
5491 static bfd_boolean
5492 elf64_l1om_elf_object_p (bfd *abfd)
5493 {
5494   /* Set the right machine number for an L1OM elf64 file.  */
5495   bfd_default_set_arch_mach (abfd, bfd_arch_l1om, bfd_mach_l1om);
5496   return TRUE;
5497 }
5498 
5499 #undef  TARGET_LITTLE_SYM
5500 #define TARGET_LITTLE_SYM		    l1om_elf64_vec
5501 #undef  TARGET_LITTLE_NAME
5502 #define TARGET_LITTLE_NAME		    "elf64-l1om"
5503 #undef ELF_ARCH
5504 #define ELF_ARCH			    bfd_arch_l1om
5505 
5506 #undef	ELF_MACHINE_CODE
5507 #define ELF_MACHINE_CODE		    EM_L1OM
5508 
5509 #undef	ELF_OSABI
5510 
5511 #undef  elf64_bed
5512 #define elf64_bed elf64_l1om_bed
5513 
5514 #undef elf_backend_object_p
5515 #define elf_backend_object_p		    elf64_l1om_elf_object_p
5516 
5517 /* Restore defaults.  */
5518 #undef	ELF_MAXPAGESIZE
5519 #undef	ELF_MINPAGESIZE
5520 #undef	ELF_COMMONPAGESIZE
5521 #if DEFAULT_LD_Z_SEPARATE_CODE
5522 # define ELF_MAXPAGESIZE		0x1000
5523 #else
5524 # define ELF_MAXPAGESIZE		0x200000
5525 #endif
5526 #define ELF_MINPAGESIZE			0x1000
5527 #define ELF_COMMONPAGESIZE		0x1000
5528 #undef	elf_backend_plt_alignment
5529 #define elf_backend_plt_alignment	4
5530 #undef	elf_backend_arch_data
5531 #define	elf_backend_arch_data	&elf_x86_64_arch_bed
5532 
5533 #include "elf64-target.h"
5534 
5535 /* FreeBSD L1OM support.  */
5536 
5537 #undef  TARGET_LITTLE_SYM
5538 #define TARGET_LITTLE_SYM		    l1om_elf64_fbsd_vec
5539 #undef  TARGET_LITTLE_NAME
5540 #define TARGET_LITTLE_NAME		    "elf64-l1om-freebsd"
5541 
5542 #undef	ELF_OSABI
5543 #define	ELF_OSABI			    ELFOSABI_FREEBSD
5544 
5545 #undef  elf64_bed
5546 #define elf64_bed elf64_l1om_fbsd_bed
5547 
5548 #include "elf64-target.h"
5549 
5550 /* Intel K1OM support.  */
5551 
5552 static bfd_boolean
5553 elf64_k1om_elf_object_p (bfd *abfd)
5554 {
5555   /* Set the right machine number for an K1OM elf64 file.  */
5556   bfd_default_set_arch_mach (abfd, bfd_arch_k1om, bfd_mach_k1om);
5557   return TRUE;
5558 }
5559 
5560 #undef  TARGET_LITTLE_SYM
5561 #define TARGET_LITTLE_SYM		    k1om_elf64_vec
5562 #undef  TARGET_LITTLE_NAME
5563 #define TARGET_LITTLE_NAME		    "elf64-k1om"
5564 #undef ELF_ARCH
5565 #define ELF_ARCH			    bfd_arch_k1om
5566 
5567 #undef	ELF_MACHINE_CODE
5568 #define ELF_MACHINE_CODE		    EM_K1OM
5569 
5570 #undef	ELF_OSABI
5571 
5572 #undef  elf64_bed
5573 #define elf64_bed elf64_k1om_bed
5574 
5575 #undef elf_backend_object_p
5576 #define elf_backend_object_p		    elf64_k1om_elf_object_p
5577 
5578 #undef  elf_backend_static_tls_alignment
5579 
5580 #undef elf_backend_want_plt_sym
5581 #define elf_backend_want_plt_sym	    0
5582 
5583 #include "elf64-target.h"
5584 
5585 /* FreeBSD K1OM support.  */
5586 
5587 #undef  TARGET_LITTLE_SYM
5588 #define TARGET_LITTLE_SYM		    k1om_elf64_fbsd_vec
5589 #undef  TARGET_LITTLE_NAME
5590 #define TARGET_LITTLE_NAME		    "elf64-k1om-freebsd"
5591 
5592 #undef	ELF_OSABI
5593 #define	ELF_OSABI			    ELFOSABI_FREEBSD
5594 
5595 #undef  elf64_bed
5596 #define elf64_bed elf64_k1om_fbsd_bed
5597 
5598 #include "elf64-target.h"
5599 
5600 /* 32bit x86-64 support.  */
5601 
5602 #undef  TARGET_LITTLE_SYM
5603 #define TARGET_LITTLE_SYM		    x86_64_elf32_vec
5604 #undef  TARGET_LITTLE_NAME
5605 #define TARGET_LITTLE_NAME		    "elf32-x86-64"
5606 #undef	elf32_bed
5607 
5608 #undef ELF_ARCH
5609 #define ELF_ARCH			    bfd_arch_i386
5610 
5611 #undef	ELF_MACHINE_CODE
5612 #define ELF_MACHINE_CODE		    EM_X86_64
5613 
5614 #undef	ELF_OSABI
5615 
5616 #undef elf_backend_object_p
5617 #define elf_backend_object_p \
5618   elf32_x86_64_elf_object_p
5619 
5620 #undef elf_backend_bfd_from_remote_memory
5621 #define elf_backend_bfd_from_remote_memory \
5622   _bfd_elf32_bfd_from_remote_memory
5623 
5624 #undef elf_backend_size_info
5625 #define elf_backend_size_info \
5626   _bfd_elf32_size_info
5627 
5628 #include "elf32-target.h"
5629