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