1 /* X86-64 specific support for ELF
2 Copyright (C) 2000-2016 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka <jh@suse.cz>.
5 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
28 #include "bfd_stdint.h"
32 #include "libiberty.h"
34 #include "opcode/i386.h"
35 #include "elf/x86-64.h"
42 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
43 #define MINUS_ONE (~ (bfd_vma) 0)
45 /* Since both 32-bit and 64-bit x86-64 encode relocation type in the
46 identical manner, we use ELF32_R_TYPE instead of ELF64_R_TYPE to get
47 relocation type. We also use ELF_ST_TYPE instead of ELF64_ST_TYPE
48 since they are the same. */
50 #define ABI_64_P(abfd) \
51 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
53 /* The relocation "howto" table. Order of fields:
54 type, rightshift, size, bitsize, pc_relative, bitpos, complain_on_overflow,
55 special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset. */
56 static reloc_howto_type x86_64_elf_howto_table[] =
58 HOWTO(R_X86_64_NONE, 0, 3, 0, FALSE, 0, complain_overflow_dont,
59 bfd_elf_generic_reloc, "R_X86_64_NONE", FALSE, 0x00000000, 0x00000000,
61 HOWTO(R_X86_64_64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
62 bfd_elf_generic_reloc, "R_X86_64_64", FALSE, MINUS_ONE, MINUS_ONE,
64 HOWTO(R_X86_64_PC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
65 bfd_elf_generic_reloc, "R_X86_64_PC32", FALSE, 0xffffffff, 0xffffffff,
67 HOWTO(R_X86_64_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
68 bfd_elf_generic_reloc, "R_X86_64_GOT32", FALSE, 0xffffffff, 0xffffffff,
70 HOWTO(R_X86_64_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
71 bfd_elf_generic_reloc, "R_X86_64_PLT32", FALSE, 0xffffffff, 0xffffffff,
73 HOWTO(R_X86_64_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
74 bfd_elf_generic_reloc, "R_X86_64_COPY", FALSE, 0xffffffff, 0xffffffff,
76 HOWTO(R_X86_64_GLOB_DAT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
77 bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", FALSE, MINUS_ONE,
79 HOWTO(R_X86_64_JUMP_SLOT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
80 bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", FALSE, MINUS_ONE,
82 HOWTO(R_X86_64_RELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
83 bfd_elf_generic_reloc, "R_X86_64_RELATIVE", FALSE, MINUS_ONE,
85 HOWTO(R_X86_64_GOTPCREL, 0, 2, 32, TRUE, 0, complain_overflow_signed,
86 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", FALSE, 0xffffffff,
88 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
89 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
91 HOWTO(R_X86_64_32S, 0, 2, 32, FALSE, 0, complain_overflow_signed,
92 bfd_elf_generic_reloc, "R_X86_64_32S", FALSE, 0xffffffff, 0xffffffff,
94 HOWTO(R_X86_64_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
95 bfd_elf_generic_reloc, "R_X86_64_16", FALSE, 0xffff, 0xffff, FALSE),
96 HOWTO(R_X86_64_PC16,0, 1, 16, TRUE, 0, complain_overflow_bitfield,
97 bfd_elf_generic_reloc, "R_X86_64_PC16", FALSE, 0xffff, 0xffff, TRUE),
98 HOWTO(R_X86_64_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
99 bfd_elf_generic_reloc, "R_X86_64_8", FALSE, 0xff, 0xff, FALSE),
100 HOWTO(R_X86_64_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
101 bfd_elf_generic_reloc, "R_X86_64_PC8", FALSE, 0xff, 0xff, TRUE),
102 HOWTO(R_X86_64_DTPMOD64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
103 bfd_elf_generic_reloc, "R_X86_64_DTPMOD64", FALSE, MINUS_ONE,
105 HOWTO(R_X86_64_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
106 bfd_elf_generic_reloc, "R_X86_64_DTPOFF64", FALSE, MINUS_ONE,
108 HOWTO(R_X86_64_TPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
109 bfd_elf_generic_reloc, "R_X86_64_TPOFF64", FALSE, MINUS_ONE,
111 HOWTO(R_X86_64_TLSGD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
112 bfd_elf_generic_reloc, "R_X86_64_TLSGD", FALSE, 0xffffffff,
114 HOWTO(R_X86_64_TLSLD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
115 bfd_elf_generic_reloc, "R_X86_64_TLSLD", FALSE, 0xffffffff,
117 HOWTO(R_X86_64_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
118 bfd_elf_generic_reloc, "R_X86_64_DTPOFF32", FALSE, 0xffffffff,
120 HOWTO(R_X86_64_GOTTPOFF, 0, 2, 32, TRUE, 0, complain_overflow_signed,
121 bfd_elf_generic_reloc, "R_X86_64_GOTTPOFF", FALSE, 0xffffffff,
123 HOWTO(R_X86_64_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
124 bfd_elf_generic_reloc, "R_X86_64_TPOFF32", FALSE, 0xffffffff,
126 HOWTO(R_X86_64_PC64, 0, 4, 64, TRUE, 0, complain_overflow_bitfield,
127 bfd_elf_generic_reloc, "R_X86_64_PC64", FALSE, MINUS_ONE, MINUS_ONE,
129 HOWTO(R_X86_64_GOTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
130 bfd_elf_generic_reloc, "R_X86_64_GOTOFF64",
131 FALSE, MINUS_ONE, MINUS_ONE, FALSE),
132 HOWTO(R_X86_64_GOTPC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
133 bfd_elf_generic_reloc, "R_X86_64_GOTPC32",
134 FALSE, 0xffffffff, 0xffffffff, TRUE),
135 HOWTO(R_X86_64_GOT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
136 bfd_elf_generic_reloc, "R_X86_64_GOT64", FALSE, MINUS_ONE, MINUS_ONE,
138 HOWTO(R_X86_64_GOTPCREL64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
139 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL64", FALSE, MINUS_ONE,
141 HOWTO(R_X86_64_GOTPC64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
142 bfd_elf_generic_reloc, "R_X86_64_GOTPC64",
143 FALSE, MINUS_ONE, MINUS_ONE, TRUE),
144 HOWTO(R_X86_64_GOTPLT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
145 bfd_elf_generic_reloc, "R_X86_64_GOTPLT64", FALSE, MINUS_ONE,
147 HOWTO(R_X86_64_PLTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
148 bfd_elf_generic_reloc, "R_X86_64_PLTOFF64", FALSE, MINUS_ONE,
150 HOWTO(R_X86_64_SIZE32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
151 bfd_elf_generic_reloc, "R_X86_64_SIZE32", FALSE, 0xffffffff, 0xffffffff,
153 HOWTO(R_X86_64_SIZE64, 0, 4, 64, FALSE, 0, complain_overflow_unsigned,
154 bfd_elf_generic_reloc, "R_X86_64_SIZE64", FALSE, MINUS_ONE, MINUS_ONE,
156 HOWTO(R_X86_64_GOTPC32_TLSDESC, 0, 2, 32, TRUE, 0,
157 complain_overflow_bitfield, bfd_elf_generic_reloc,
158 "R_X86_64_GOTPC32_TLSDESC",
159 FALSE, 0xffffffff, 0xffffffff, TRUE),
160 HOWTO(R_X86_64_TLSDESC_CALL, 0, 0, 0, FALSE, 0,
161 complain_overflow_dont, bfd_elf_generic_reloc,
162 "R_X86_64_TLSDESC_CALL",
164 HOWTO(R_X86_64_TLSDESC, 0, 4, 64, FALSE, 0,
165 complain_overflow_bitfield, bfd_elf_generic_reloc,
167 FALSE, MINUS_ONE, MINUS_ONE, FALSE),
168 HOWTO(R_X86_64_IRELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
169 bfd_elf_generic_reloc, "R_X86_64_IRELATIVE", FALSE, MINUS_ONE,
171 HOWTO(R_X86_64_RELATIVE64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
172 bfd_elf_generic_reloc, "R_X86_64_RELATIVE64", FALSE, MINUS_ONE,
174 HOWTO(R_X86_64_PC32_BND, 0, 2, 32, TRUE, 0, complain_overflow_signed,
175 bfd_elf_generic_reloc, "R_X86_64_PC32_BND", FALSE, 0xffffffff, 0xffffffff,
177 HOWTO(R_X86_64_PLT32_BND, 0, 2, 32, TRUE, 0, complain_overflow_signed,
178 bfd_elf_generic_reloc, "R_X86_64_PLT32_BND", FALSE, 0xffffffff, 0xffffffff,
180 HOWTO(R_X86_64_GOTPCRELX, 0, 2, 32, TRUE, 0, complain_overflow_signed,
181 bfd_elf_generic_reloc, "R_X86_64_GOTPCRELX", FALSE, 0xffffffff,
183 HOWTO(R_X86_64_REX_GOTPCRELX, 0, 2, 32, TRUE, 0, complain_overflow_signed,
184 bfd_elf_generic_reloc, "R_X86_64_REX_GOTPCRELX", FALSE, 0xffffffff,
187 /* We have a gap in the reloc numbers here.
188 R_X86_64_standard counts the number up to this point, and
189 R_X86_64_vt_offset is the value to subtract from a reloc type of
190 R_X86_64_GNU_VT* to form an index into this table. */
191 #define R_X86_64_standard (R_X86_64_REX_GOTPCRELX + 1)
192 #define R_X86_64_vt_offset (R_X86_64_GNU_VTINHERIT - R_X86_64_standard)
194 /* GNU extension to record C++ vtable hierarchy. */
195 HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, FALSE, 0, complain_overflow_dont,
196 NULL, "R_X86_64_GNU_VTINHERIT", FALSE, 0, 0, FALSE),
198 /* GNU extension to record C++ vtable member usage. */
199 HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, FALSE, 0, complain_overflow_dont,
200 _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", FALSE, 0, 0,
203 /* Use complain_overflow_bitfield on R_X86_64_32 for x32. */
204 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
205 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
209 #define IS_X86_64_PCREL_TYPE(TYPE) \
210 ( ((TYPE) == R_X86_64_PC8) \
211 || ((TYPE) == R_X86_64_PC16) \
212 || ((TYPE) == R_X86_64_PC32) \
213 || ((TYPE) == R_X86_64_PC32_BND) \
214 || ((TYPE) == R_X86_64_PC64))
216 /* Map BFD relocs to the x86_64 elf relocs. */
219 bfd_reloc_code_real_type bfd_reloc_val;
220 unsigned char elf_reloc_val;
223 static const struct elf_reloc_map x86_64_reloc_map[] =
225 { BFD_RELOC_NONE, R_X86_64_NONE, },
226 { BFD_RELOC_64, R_X86_64_64, },
227 { BFD_RELOC_32_PCREL, R_X86_64_PC32, },
228 { BFD_RELOC_X86_64_GOT32, R_X86_64_GOT32,},
229 { BFD_RELOC_X86_64_PLT32, R_X86_64_PLT32,},
230 { BFD_RELOC_X86_64_COPY, R_X86_64_COPY, },
231 { BFD_RELOC_X86_64_GLOB_DAT, R_X86_64_GLOB_DAT, },
232 { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, },
233 { BFD_RELOC_X86_64_RELATIVE, R_X86_64_RELATIVE, },
234 { BFD_RELOC_X86_64_GOTPCREL, R_X86_64_GOTPCREL, },
235 { BFD_RELOC_32, R_X86_64_32, },
236 { BFD_RELOC_X86_64_32S, R_X86_64_32S, },
237 { BFD_RELOC_16, R_X86_64_16, },
238 { BFD_RELOC_16_PCREL, R_X86_64_PC16, },
239 { BFD_RELOC_8, R_X86_64_8, },
240 { BFD_RELOC_8_PCREL, R_X86_64_PC8, },
241 { BFD_RELOC_X86_64_DTPMOD64, R_X86_64_DTPMOD64, },
242 { BFD_RELOC_X86_64_DTPOFF64, R_X86_64_DTPOFF64, },
243 { BFD_RELOC_X86_64_TPOFF64, R_X86_64_TPOFF64, },
244 { BFD_RELOC_X86_64_TLSGD, R_X86_64_TLSGD, },
245 { BFD_RELOC_X86_64_TLSLD, R_X86_64_TLSLD, },
246 { BFD_RELOC_X86_64_DTPOFF32, R_X86_64_DTPOFF32, },
247 { BFD_RELOC_X86_64_GOTTPOFF, R_X86_64_GOTTPOFF, },
248 { BFD_RELOC_X86_64_TPOFF32, R_X86_64_TPOFF32, },
249 { BFD_RELOC_64_PCREL, R_X86_64_PC64, },
250 { BFD_RELOC_X86_64_GOTOFF64, R_X86_64_GOTOFF64, },
251 { BFD_RELOC_X86_64_GOTPC32, R_X86_64_GOTPC32, },
252 { BFD_RELOC_X86_64_GOT64, R_X86_64_GOT64, },
253 { BFD_RELOC_X86_64_GOTPCREL64,R_X86_64_GOTPCREL64, },
254 { BFD_RELOC_X86_64_GOTPC64, R_X86_64_GOTPC64, },
255 { BFD_RELOC_X86_64_GOTPLT64, R_X86_64_GOTPLT64, },
256 { BFD_RELOC_X86_64_PLTOFF64, R_X86_64_PLTOFF64, },
257 { BFD_RELOC_SIZE32, R_X86_64_SIZE32, },
258 { BFD_RELOC_SIZE64, R_X86_64_SIZE64, },
259 { BFD_RELOC_X86_64_GOTPC32_TLSDESC, R_X86_64_GOTPC32_TLSDESC, },
260 { BFD_RELOC_X86_64_TLSDESC_CALL, R_X86_64_TLSDESC_CALL, },
261 { BFD_RELOC_X86_64_TLSDESC, R_X86_64_TLSDESC, },
262 { BFD_RELOC_X86_64_IRELATIVE, R_X86_64_IRELATIVE, },
263 { BFD_RELOC_X86_64_PC32_BND, R_X86_64_PC32_BND, },
264 { BFD_RELOC_X86_64_PLT32_BND, R_X86_64_PLT32_BND, },
265 { BFD_RELOC_X86_64_GOTPCRELX, R_X86_64_GOTPCRELX, },
266 { BFD_RELOC_X86_64_REX_GOTPCRELX, R_X86_64_REX_GOTPCRELX, },
267 { BFD_RELOC_VTABLE_INHERIT, R_X86_64_GNU_VTINHERIT, },
268 { BFD_RELOC_VTABLE_ENTRY, R_X86_64_GNU_VTENTRY, },
271 static reloc_howto_type *
272 elf_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type)
276 if (r_type == (unsigned int) R_X86_64_32)
281 i = ARRAY_SIZE (x86_64_elf_howto_table) - 1;
283 else if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT
284 || r_type >= (unsigned int) R_X86_64_max)
286 if (r_type >= (unsigned int) R_X86_64_standard)
288 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
290 r_type = R_X86_64_NONE;
295 i = r_type - (unsigned int) R_X86_64_vt_offset;
296 BFD_ASSERT (x86_64_elf_howto_table[i].type == r_type);
297 return &x86_64_elf_howto_table[i];
300 /* Given a BFD reloc type, return a HOWTO structure. */
301 static reloc_howto_type *
302 elf_x86_64_reloc_type_lookup (bfd *abfd,
303 bfd_reloc_code_real_type code)
307 for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
310 if (x86_64_reloc_map[i].bfd_reloc_val == code)
311 return elf_x86_64_rtype_to_howto (abfd,
312 x86_64_reloc_map[i].elf_reloc_val);
317 static reloc_howto_type *
318 elf_x86_64_reloc_name_lookup (bfd *abfd,
323 if (!ABI_64_P (abfd) && strcasecmp (r_name, "R_X86_64_32") == 0)
325 /* Get x32 R_X86_64_32. */
326 reloc_howto_type *reloc
327 = &x86_64_elf_howto_table[ARRAY_SIZE (x86_64_elf_howto_table) - 1];
328 BFD_ASSERT (reloc->type == (unsigned int) R_X86_64_32);
332 for (i = 0; i < ARRAY_SIZE (x86_64_elf_howto_table); i++)
333 if (x86_64_elf_howto_table[i].name != NULL
334 && strcasecmp (x86_64_elf_howto_table[i].name, r_name) == 0)
335 return &x86_64_elf_howto_table[i];
340 /* Given an x86_64 ELF reloc type, fill in an arelent structure. */
343 elf_x86_64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
344 Elf_Internal_Rela *dst)
348 r_type = ELF32_R_TYPE (dst->r_info);
349 cache_ptr->howto = elf_x86_64_rtype_to_howto (abfd, r_type);
350 BFD_ASSERT (r_type == cache_ptr->howto->type);
353 /* Support for core dump NOTE sections. */
355 elf_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
360 switch (note->descsz)
365 case 296: /* sizeof(istruct elf_prstatus) on Linux/x32 */
367 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
370 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
378 case 336: /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
380 elf_tdata (abfd)->core->signal
381 = bfd_get_16 (abfd, note->descdata + 12);
384 elf_tdata (abfd)->core->lwpid
385 = bfd_get_32 (abfd, note->descdata + 32);
394 /* Make a ".reg/999" section. */
395 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
396 size, note->descpos + offset);
400 elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
402 switch (note->descsz)
407 case 124: /* sizeof(struct elf_prpsinfo) on Linux/x32 */
408 elf_tdata (abfd)->core->pid
409 = bfd_get_32 (abfd, note->descdata + 12);
410 elf_tdata (abfd)->core->program
411 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
412 elf_tdata (abfd)->core->command
413 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
416 case 136: /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
417 elf_tdata (abfd)->core->pid
418 = bfd_get_32 (abfd, note->descdata + 24);
419 elf_tdata (abfd)->core->program
420 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
421 elf_tdata (abfd)->core->command
422 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
425 /* Note that for some reason, a spurious space is tacked
426 onto the end of the args in some (at least one anyway)
427 implementations, so strip it off if it exists. */
430 char *command = elf_tdata (abfd)->core->command;
431 int n = strlen (command);
433 if (0 < n && command[n - 1] == ' ')
434 command[n - 1] = '\0';
442 elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
445 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
447 const char *fname, *psargs;
458 va_start (ap, note_type);
459 fname = va_arg (ap, const char *);
460 psargs = va_arg (ap, const char *);
463 if (bed->s->elfclass == ELFCLASS32)
466 memset (&data, 0, sizeof (data));
467 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
468 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
469 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
470 &data, sizeof (data));
475 memset (&data, 0, sizeof (data));
476 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
477 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
478 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
479 &data, sizeof (data));
484 va_start (ap, note_type);
485 pid = va_arg (ap, long);
486 cursig = va_arg (ap, int);
487 gregs = va_arg (ap, const void *);
490 if (bed->s->elfclass == ELFCLASS32)
492 if (bed->elf_machine_code == EM_X86_64)
494 prstatusx32_t prstat;
495 memset (&prstat, 0, sizeof (prstat));
497 prstat.pr_cursig = cursig;
498 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
499 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
500 &prstat, sizeof (prstat));
505 memset (&prstat, 0, sizeof (prstat));
507 prstat.pr_cursig = cursig;
508 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
509 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
510 &prstat, sizeof (prstat));
516 memset (&prstat, 0, sizeof (prstat));
518 prstat.pr_cursig = cursig;
519 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
520 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
521 &prstat, sizeof (prstat));
528 /* Functions for the x86-64 ELF linker. */
530 /* The name of the dynamic interpreter. This is put in the .interp
533 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
534 #define ELF32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
536 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
537 copying dynamic variables from a shared lib into an app's dynbss
538 section, and instead use a dynamic relocation to point into the
540 #define ELIMINATE_COPY_RELOCS 1
542 /* The size in bytes of an entry in the global offset table. */
544 #define GOT_ENTRY_SIZE 8
546 /* The size in bytes of an entry in the procedure linkage table. */
548 #define PLT_ENTRY_SIZE 16
550 /* The first entry in a procedure linkage table looks like this. See the
551 SVR4 ABI i386 supplement and the x86-64 ABI to see how this works. */
553 static const bfd_byte elf_x86_64_plt0_entry[PLT_ENTRY_SIZE] =
555 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
556 0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */
557 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */
560 /* Subsequent entries in a procedure linkage table look like this. */
562 static const bfd_byte elf_x86_64_plt_entry[PLT_ENTRY_SIZE] =
564 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
565 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
566 0x68, /* pushq immediate */
567 0, 0, 0, 0, /* replaced with index into relocation table. */
568 0xe9, /* jmp relative */
569 0, 0, 0, 0 /* replaced with offset to start of .plt0. */
572 /* The first entry in a procedure linkage table with BND relocations
575 static const bfd_byte elf_x86_64_bnd_plt0_entry[PLT_ENTRY_SIZE] =
577 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
578 0xf2, 0xff, 0x25, 16, 0, 0, 0, /* bnd jmpq *GOT+16(%rip) */
579 0x0f, 0x1f, 0 /* nopl (%rax) */
582 /* Subsequent entries for legacy branches in a procedure linkage table
583 with BND relocations look like this. */
585 static const bfd_byte elf_x86_64_legacy_plt_entry[PLT_ENTRY_SIZE] =
587 0x68, 0, 0, 0, 0, /* pushq immediate */
588 0xe9, 0, 0, 0, 0, /* jmpq relative */
589 0x66, 0x0f, 0x1f, 0x44, 0, 0 /* nopw (%rax,%rax,1) */
592 /* Subsequent entries for branches with BND prefx in a procedure linkage
593 table with BND relocations look like this. */
595 static const bfd_byte elf_x86_64_bnd_plt_entry[PLT_ENTRY_SIZE] =
597 0x68, 0, 0, 0, 0, /* pushq immediate */
598 0xf2, 0xe9, 0, 0, 0, 0, /* bnd jmpq relative */
599 0x0f, 0x1f, 0x44, 0, 0 /* nopl 0(%rax,%rax,1) */
602 /* Entries for legacy branches in the second procedure linkage table
605 static const bfd_byte elf_x86_64_legacy_plt2_entry[8] =
607 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
608 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
609 0x66, 0x90 /* xchg %ax,%ax */
612 /* Entries for branches with BND prefix in the second procedure linkage
613 table look like this. */
615 static const bfd_byte elf_x86_64_bnd_plt2_entry[8] =
617 0xf2, 0xff, 0x25, /* bnd jmpq *name@GOTPC(%rip) */
618 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
622 /* .eh_frame covering the .plt section. */
624 static const bfd_byte elf_x86_64_eh_frame_plt[] =
626 #define PLT_CIE_LENGTH 20
627 #define PLT_FDE_LENGTH 36
628 #define PLT_FDE_START_OFFSET 4 + PLT_CIE_LENGTH + 8
629 #define PLT_FDE_LEN_OFFSET 4 + PLT_CIE_LENGTH + 12
630 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
631 0, 0, 0, 0, /* CIE ID */
633 'z', 'R', 0, /* Augmentation string */
634 1, /* Code alignment factor */
635 0x78, /* Data alignment factor */
636 16, /* Return address column */
637 1, /* Augmentation size */
638 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
639 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
640 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
641 DW_CFA_nop, DW_CFA_nop,
643 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
644 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
645 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
646 0, 0, 0, 0, /* .plt size goes here */
647 0, /* Augmentation size */
648 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
649 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
650 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
651 DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
652 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
653 11, /* Block length */
654 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
655 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
656 DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
657 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
658 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
661 /* Architecture-specific backend data for x86-64. */
663 struct elf_x86_64_backend_data
665 /* Templates for the initial PLT entry and for subsequent entries. */
666 const bfd_byte *plt0_entry;
667 const bfd_byte *plt_entry;
668 unsigned int plt_entry_size; /* Size of each PLT entry. */
670 /* Offsets into plt0_entry that are to be replaced with GOT[1] and GOT[2]. */
671 unsigned int plt0_got1_offset;
672 unsigned int plt0_got2_offset;
674 /* Offset of the end of the PC-relative instruction containing
676 unsigned int plt0_got2_insn_end;
678 /* Offsets into plt_entry that are to be replaced with... */
679 unsigned int plt_got_offset; /* ... address of this symbol in .got. */
680 unsigned int plt_reloc_offset; /* ... offset into relocation table. */
681 unsigned int plt_plt_offset; /* ... offset to start of .plt. */
683 /* Length of the PC-relative instruction containing plt_got_offset. */
684 unsigned int plt_got_insn_size;
686 /* Offset of the end of the PC-relative jump to plt0_entry. */
687 unsigned int plt_plt_insn_end;
689 /* Offset into plt_entry where the initial value of the GOT entry points. */
690 unsigned int plt_lazy_offset;
692 /* .eh_frame covering the .plt section. */
693 const bfd_byte *eh_frame_plt;
694 unsigned int eh_frame_plt_size;
697 #define get_elf_x86_64_arch_data(bed) \
698 ((const struct elf_x86_64_backend_data *) (bed)->arch_data)
700 #define get_elf_x86_64_backend_data(abfd) \
701 get_elf_x86_64_arch_data (get_elf_backend_data (abfd))
703 #define GET_PLT_ENTRY_SIZE(abfd) \
704 get_elf_x86_64_backend_data (abfd)->plt_entry_size
706 /* These are the standard parameters. */
707 static const struct elf_x86_64_backend_data elf_x86_64_arch_bed =
709 elf_x86_64_plt0_entry, /* plt0_entry */
710 elf_x86_64_plt_entry, /* plt_entry */
711 sizeof (elf_x86_64_plt_entry), /* plt_entry_size */
712 2, /* plt0_got1_offset */
713 8, /* plt0_got2_offset */
714 12, /* plt0_got2_insn_end */
715 2, /* plt_got_offset */
716 7, /* plt_reloc_offset */
717 12, /* plt_plt_offset */
718 6, /* plt_got_insn_size */
719 PLT_ENTRY_SIZE, /* plt_plt_insn_end */
720 6, /* plt_lazy_offset */
721 elf_x86_64_eh_frame_plt, /* eh_frame_plt */
722 sizeof (elf_x86_64_eh_frame_plt), /* eh_frame_plt_size */
725 static const struct elf_x86_64_backend_data elf_x86_64_bnd_arch_bed =
727 elf_x86_64_bnd_plt0_entry, /* plt0_entry */
728 elf_x86_64_bnd_plt_entry, /* plt_entry */
729 sizeof (elf_x86_64_bnd_plt_entry), /* plt_entry_size */
730 2, /* plt0_got1_offset */
731 1+8, /* plt0_got2_offset */
732 1+12, /* plt0_got2_insn_end */
733 1+2, /* plt_got_offset */
734 1, /* plt_reloc_offset */
735 7, /* plt_plt_offset */
736 1+6, /* plt_got_insn_size */
737 11, /* plt_plt_insn_end */
738 0, /* plt_lazy_offset */
739 elf_x86_64_eh_frame_plt, /* eh_frame_plt */
740 sizeof (elf_x86_64_eh_frame_plt), /* eh_frame_plt_size */
743 #define elf_backend_arch_data &elf_x86_64_arch_bed
745 /* Is a undefined weak symbol which is resolved to 0. Reference to an
746 undefined weak symbol is resolved to 0 when building executable if
748 1. Has non-GOT/non-PLT relocations in text section. Or
749 2. Has no GOT/PLT relocation.
751 #define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, EH) \
752 ((EH)->elf.root.type == bfd_link_hash_undefweak \
753 && bfd_link_executable (INFO) \
754 && (elf_x86_64_hash_table (INFO)->interp == NULL \
755 || !(EH)->has_got_reloc \
756 || (EH)->has_non_got_reloc \
757 || !(INFO)->dynamic_undefined_weak))
759 /* x86-64 ELF linker hash entry. */
761 struct elf_x86_64_link_hash_entry
763 struct elf_link_hash_entry elf;
765 /* Track dynamic relocs copied for this symbol. */
766 struct elf_dyn_relocs *dyn_relocs;
768 #define GOT_UNKNOWN 0
772 #define GOT_TLS_GDESC 4
773 #define GOT_TLS_GD_BOTH_P(type) \
774 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
775 #define GOT_TLS_GD_P(type) \
776 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
777 #define GOT_TLS_GDESC_P(type) \
778 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
779 #define GOT_TLS_GD_ANY_P(type) \
780 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
781 unsigned char tls_type;
783 /* TRUE if a weak symbol with a real definition needs a copy reloc.
784 When there is a weak symbol with a real definition, the processor
785 independent code will have arranged for us to see the real
786 definition first. We need to copy the needs_copy bit from the
787 real definition and check it when allowing copy reloc in PIE. */
788 unsigned int needs_copy : 1;
790 /* TRUE if symbol has at least one BND relocation. */
791 unsigned int has_bnd_reloc : 1;
793 /* TRUE if symbol has GOT or PLT relocations. */
794 unsigned int has_got_reloc : 1;
796 /* TRUE if symbol has non-GOT/non-PLT relocations in text sections. */
797 unsigned int has_non_got_reloc : 1;
799 /* Reference count of C/C++ function pointer relocations in read-write
800 section which can be resolved at run-time. */
801 bfd_signed_vma func_pointer_refcount;
803 /* Information about the GOT PLT entry. Filled when there are both
804 GOT and PLT relocations against the same function. */
805 union gotplt_union plt_got;
807 /* Information about the second PLT entry. Filled when has_bnd_reloc is
809 union gotplt_union plt_bnd;
811 /* Offset of the GOTPLT entry reserved for the TLS descriptor,
812 starting at the end of the jump table. */
816 #define elf_x86_64_hash_entry(ent) \
817 ((struct elf_x86_64_link_hash_entry *)(ent))
819 struct elf_x86_64_obj_tdata
821 struct elf_obj_tdata root;
823 /* tls_type for each local got entry. */
824 char *local_got_tls_type;
826 /* GOTPLT entries for TLS descriptors. */
827 bfd_vma *local_tlsdesc_gotent;
830 #define elf_x86_64_tdata(abfd) \
831 ((struct elf_x86_64_obj_tdata *) (abfd)->tdata.any)
833 #define elf_x86_64_local_got_tls_type(abfd) \
834 (elf_x86_64_tdata (abfd)->local_got_tls_type)
836 #define elf_x86_64_local_tlsdesc_gotent(abfd) \
837 (elf_x86_64_tdata (abfd)->local_tlsdesc_gotent)
839 #define is_x86_64_elf(bfd) \
840 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
841 && elf_tdata (bfd) != NULL \
842 && elf_object_id (bfd) == X86_64_ELF_DATA)
845 elf_x86_64_mkobject (bfd *abfd)
847 return bfd_elf_allocate_object (abfd, sizeof (struct elf_x86_64_obj_tdata),
851 /* x86-64 ELF linker hash table. */
853 struct elf_x86_64_link_hash_table
855 struct elf_link_hash_table elf;
857 /* Short-cuts to get to dynamic linker sections. */
861 asection *plt_eh_frame;
867 bfd_signed_vma refcount;
871 /* The amount of space used by the jump slots in the GOT. */
872 bfd_vma sgotplt_jump_table_size;
874 /* Small local sym cache. */
875 struct sym_cache sym_cache;
877 bfd_vma (*r_info) (bfd_vma, bfd_vma);
878 bfd_vma (*r_sym) (bfd_vma);
879 unsigned int pointer_r_type;
880 const char *dynamic_interpreter;
881 int dynamic_interpreter_size;
883 /* _TLS_MODULE_BASE_ symbol. */
884 struct bfd_link_hash_entry *tls_module_base;
886 /* Used by local STT_GNU_IFUNC symbols. */
887 htab_t loc_hash_table;
888 void * loc_hash_memory;
890 /* The offset into splt of the PLT entry for the TLS descriptor
891 resolver. Special values are 0, if not necessary (or not found
892 to be necessary yet), and -1 if needed but not determined
895 /* The offset into sgot of the GOT entry used by the PLT entry
899 /* The index of the next R_X86_64_JUMP_SLOT entry in .rela.plt. */
900 bfd_vma next_jump_slot_index;
901 /* The index of the next R_X86_64_IRELATIVE entry in .rela.plt. */
902 bfd_vma next_irelative_index;
904 /* TRUE if there are dynamic relocs against IFUNC symbols that apply
905 to read-only sections. */
906 bfd_boolean readonly_dynrelocs_against_ifunc;
909 /* Get the x86-64 ELF linker hash table from a link_info structure. */
911 #define elf_x86_64_hash_table(p) \
912 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
913 == X86_64_ELF_DATA ? ((struct elf_x86_64_link_hash_table *) ((p)->hash)) : NULL)
915 #define elf_x86_64_compute_jump_table_size(htab) \
916 ((htab)->elf.srelplt->reloc_count * GOT_ENTRY_SIZE)
918 /* Create an entry in an x86-64 ELF linker hash table. */
920 static struct bfd_hash_entry *
921 elf_x86_64_link_hash_newfunc (struct bfd_hash_entry *entry,
922 struct bfd_hash_table *table,
925 /* Allocate the structure if it has not already been allocated by a
929 entry = (struct bfd_hash_entry *)
930 bfd_hash_allocate (table,
931 sizeof (struct elf_x86_64_link_hash_entry));
936 /* Call the allocation method of the superclass. */
937 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
940 struct elf_x86_64_link_hash_entry *eh;
942 eh = (struct elf_x86_64_link_hash_entry *) entry;
943 eh->dyn_relocs = NULL;
944 eh->tls_type = GOT_UNKNOWN;
946 eh->has_bnd_reloc = 0;
947 eh->has_got_reloc = 0;
948 eh->has_non_got_reloc = 0;
949 eh->func_pointer_refcount = 0;
950 eh->plt_bnd.offset = (bfd_vma) -1;
951 eh->plt_got.offset = (bfd_vma) -1;
952 eh->tlsdesc_got = (bfd_vma) -1;
958 /* Compute a hash of a local hash entry. We use elf_link_hash_entry
959 for local symbol so that we can handle local STT_GNU_IFUNC symbols
960 as global symbol. We reuse indx and dynstr_index for local symbol
961 hash since they aren't used by global symbols in this backend. */
964 elf_x86_64_local_htab_hash (const void *ptr)
966 struct elf_link_hash_entry *h
967 = (struct elf_link_hash_entry *) ptr;
968 return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
971 /* Compare local hash entries. */
974 elf_x86_64_local_htab_eq (const void *ptr1, const void *ptr2)
976 struct elf_link_hash_entry *h1
977 = (struct elf_link_hash_entry *) ptr1;
978 struct elf_link_hash_entry *h2
979 = (struct elf_link_hash_entry *) ptr2;
981 return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
984 /* Find and/or create a hash entry for local symbol. */
986 static struct elf_link_hash_entry *
987 elf_x86_64_get_local_sym_hash (struct elf_x86_64_link_hash_table *htab,
988 bfd *abfd, const Elf_Internal_Rela *rel,
991 struct elf_x86_64_link_hash_entry e, *ret;
992 asection *sec = abfd->sections;
993 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
994 htab->r_sym (rel->r_info));
997 e.elf.indx = sec->id;
998 e.elf.dynstr_index = htab->r_sym (rel->r_info);
999 slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
1000 create ? INSERT : NO_INSERT);
1007 ret = (struct elf_x86_64_link_hash_entry *) *slot;
1011 ret = (struct elf_x86_64_link_hash_entry *)
1012 objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
1013 sizeof (struct elf_x86_64_link_hash_entry));
1016 memset (ret, 0, sizeof (*ret));
1017 ret->elf.indx = sec->id;
1018 ret->elf.dynstr_index = htab->r_sym (rel->r_info);
1019 ret->elf.dynindx = -1;
1020 ret->func_pointer_refcount = 0;
1021 ret->plt_got.offset = (bfd_vma) -1;
1027 /* Destroy an X86-64 ELF linker hash table. */
1030 elf_x86_64_link_hash_table_free (bfd *obfd)
1032 struct elf_x86_64_link_hash_table *htab
1033 = (struct elf_x86_64_link_hash_table *) obfd->link.hash;
1035 if (htab->loc_hash_table)
1036 htab_delete (htab->loc_hash_table);
1037 if (htab->loc_hash_memory)
1038 objalloc_free ((struct objalloc *) htab->loc_hash_memory);
1039 _bfd_elf_link_hash_table_free (obfd);
1042 /* Create an X86-64 ELF linker hash table. */
1044 static struct bfd_link_hash_table *
1045 elf_x86_64_link_hash_table_create (bfd *abfd)
1047 struct elf_x86_64_link_hash_table *ret;
1048 bfd_size_type amt = sizeof (struct elf_x86_64_link_hash_table);
1050 ret = (struct elf_x86_64_link_hash_table *) bfd_zmalloc (amt);
1054 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
1055 elf_x86_64_link_hash_newfunc,
1056 sizeof (struct elf_x86_64_link_hash_entry),
1063 if (ABI_64_P (abfd))
1065 ret->r_info = elf64_r_info;
1066 ret->r_sym = elf64_r_sym;
1067 ret->pointer_r_type = R_X86_64_64;
1068 ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
1069 ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
1073 ret->r_info = elf32_r_info;
1074 ret->r_sym = elf32_r_sym;
1075 ret->pointer_r_type = R_X86_64_32;
1076 ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
1077 ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER;
1080 ret->loc_hash_table = htab_try_create (1024,
1081 elf_x86_64_local_htab_hash,
1082 elf_x86_64_local_htab_eq,
1084 ret->loc_hash_memory = objalloc_create ();
1085 if (!ret->loc_hash_table || !ret->loc_hash_memory)
1087 elf_x86_64_link_hash_table_free (abfd);
1090 ret->elf.root.hash_table_free = elf_x86_64_link_hash_table_free;
1092 return &ret->elf.root;
1095 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
1096 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
1100 elf_x86_64_create_dynamic_sections (bfd *dynobj,
1101 struct bfd_link_info *info)
1103 struct elf_x86_64_link_hash_table *htab;
1105 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1108 htab = elf_x86_64_hash_table (info);
1112 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
1116 if (bfd_link_executable (info))
1118 /* Always allow copy relocs for building executables. */
1119 asection *s = bfd_get_linker_section (dynobj, ".rela.bss");
1122 const struct elf_backend_data *bed = get_elf_backend_data (dynobj);
1123 s = bfd_make_section_anyway_with_flags (dynobj,
1125 (bed->dynamic_sec_flags
1128 || ! bfd_set_section_alignment (dynobj, s,
1129 bed->s->log_file_align))
1135 if (!info->no_ld_generated_unwind_info
1136 && htab->plt_eh_frame == NULL
1137 && htab->elf.splt != NULL)
1139 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
1140 | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1141 | SEC_LINKER_CREATED);
1143 = bfd_make_section_anyway_with_flags (dynobj, ".eh_frame", flags);
1144 if (htab->plt_eh_frame == NULL
1145 || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 3))
1151 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1154 elf_x86_64_copy_indirect_symbol (struct bfd_link_info *info,
1155 struct elf_link_hash_entry *dir,
1156 struct elf_link_hash_entry *ind)
1158 struct elf_x86_64_link_hash_entry *edir, *eind;
1160 edir = (struct elf_x86_64_link_hash_entry *) dir;
1161 eind = (struct elf_x86_64_link_hash_entry *) ind;
1163 if (!edir->has_bnd_reloc)
1164 edir->has_bnd_reloc = eind->has_bnd_reloc;
1166 if (!edir->has_got_reloc)
1167 edir->has_got_reloc = eind->has_got_reloc;
1169 if (!edir->has_non_got_reloc)
1170 edir->has_non_got_reloc = eind->has_non_got_reloc;
1172 if (eind->dyn_relocs != NULL)
1174 if (edir->dyn_relocs != NULL)
1176 struct elf_dyn_relocs **pp;
1177 struct elf_dyn_relocs *p;
1179 /* Add reloc counts against the indirect sym to the direct sym
1180 list. Merge any entries against the same section. */
1181 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1183 struct elf_dyn_relocs *q;
1185 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1186 if (q->sec == p->sec)
1188 q->pc_count += p->pc_count;
1189 q->count += p->count;
1196 *pp = edir->dyn_relocs;
1199 edir->dyn_relocs = eind->dyn_relocs;
1200 eind->dyn_relocs = NULL;
1203 if (ind->root.type == bfd_link_hash_indirect
1204 && dir->got.refcount <= 0)
1206 edir->tls_type = eind->tls_type;
1207 eind->tls_type = GOT_UNKNOWN;
1210 if (ELIMINATE_COPY_RELOCS
1211 && ind->root.type != bfd_link_hash_indirect
1212 && dir->dynamic_adjusted)
1214 /* If called to transfer flags for a weakdef during processing
1215 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1216 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1217 dir->ref_dynamic |= ind->ref_dynamic;
1218 dir->ref_regular |= ind->ref_regular;
1219 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1220 dir->needs_plt |= ind->needs_plt;
1221 dir->pointer_equality_needed |= ind->pointer_equality_needed;
1225 if (eind->func_pointer_refcount > 0)
1227 edir->func_pointer_refcount += eind->func_pointer_refcount;
1228 eind->func_pointer_refcount = 0;
1231 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1236 elf64_x86_64_elf_object_p (bfd *abfd)
1238 /* Set the right machine number for an x86-64 elf64 file. */
1239 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
1244 elf32_x86_64_elf_object_p (bfd *abfd)
1246 /* Set the right machine number for an x86-64 elf32 file. */
1247 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32);
1251 /* Return TRUE if the TLS access code sequence support transition
1255 elf_x86_64_check_tls_transition (bfd *abfd,
1256 struct bfd_link_info *info,
1259 Elf_Internal_Shdr *symtab_hdr,
1260 struct elf_link_hash_entry **sym_hashes,
1261 unsigned int r_type,
1262 const Elf_Internal_Rela *rel,
1263 const Elf_Internal_Rela *relend)
1266 unsigned long r_symndx;
1267 bfd_boolean largepic = FALSE;
1268 struct elf_link_hash_entry *h;
1270 struct elf_x86_64_link_hash_table *htab;
1272 /* Get the section contents. */
1273 if (contents == NULL)
1275 if (elf_section_data (sec)->this_hdr.contents != NULL)
1276 contents = elf_section_data (sec)->this_hdr.contents;
1279 /* FIXME: How to better handle error condition? */
1280 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1283 /* Cache the section contents for elf_link_input_bfd. */
1284 elf_section_data (sec)->this_hdr.contents = contents;
1288 htab = elf_x86_64_hash_table (info);
1289 offset = rel->r_offset;
1292 case R_X86_64_TLSGD:
1293 case R_X86_64_TLSLD:
1294 if ((rel + 1) >= relend)
1297 if (r_type == R_X86_64_TLSGD)
1299 /* Check transition from GD access model. For 64bit, only
1300 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
1301 .word 0x6666; rex64; call __tls_get_addr
1302 can transit to different access model. For 32bit, only
1303 leaq foo@tlsgd(%rip), %rdi
1304 .word 0x6666; rex64; call __tls_get_addr
1305 can transit to different access model. For largepic
1307 leaq foo@tlsgd(%rip), %rdi
1308 movabsq $__tls_get_addr@pltoff, %rax
1312 static const unsigned char call[] = { 0x66, 0x66, 0x48, 0xe8 };
1313 static const unsigned char leaq[] = { 0x66, 0x48, 0x8d, 0x3d };
1315 if ((offset + 12) > sec->size)
1318 if (memcmp (contents + offset + 4, call, 4) != 0)
1320 if (!ABI_64_P (abfd)
1321 || (offset + 19) > sec->size
1323 || memcmp (contents + offset - 3, leaq + 1, 3) != 0
1324 || memcmp (contents + offset + 4, "\x48\xb8", 2) != 0
1325 || memcmp (contents + offset + 14, "\x48\x01\xd8\xff\xd0", 5)
1330 else if (ABI_64_P (abfd))
1333 || memcmp (contents + offset - 4, leaq, 4) != 0)
1339 || memcmp (contents + offset - 3, leaq + 1, 3) != 0)
1345 /* Check transition from LD access model. Only
1346 leaq foo@tlsld(%rip), %rdi;
1348 can transit to different access model. For largepic
1350 leaq foo@tlsld(%rip), %rdi
1351 movabsq $__tls_get_addr@pltoff, %rax
1355 static const unsigned char lea[] = { 0x48, 0x8d, 0x3d };
1357 if (offset < 3 || (offset + 9) > sec->size)
1360 if (memcmp (contents + offset - 3, lea, 3) != 0)
1363 if (0xe8 != *(contents + offset + 4))
1365 if (!ABI_64_P (abfd)
1366 || (offset + 19) > sec->size
1367 || memcmp (contents + offset + 4, "\x48\xb8", 2) != 0
1368 || memcmp (contents + offset + 14, "\x48\x01\xd8\xff\xd0", 5)
1375 r_symndx = htab->r_sym (rel[1].r_info);
1376 if (r_symndx < symtab_hdr->sh_info)
1379 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1380 /* Use strncmp to check __tls_get_addr since __tls_get_addr
1381 may be versioned. */
1383 && h->root.root.string != NULL
1385 ? ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLTOFF64
1386 : (ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PC32
1387 || ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLT32))
1388 && (strncmp (h->root.root.string,
1389 "__tls_get_addr", 14) == 0));
1391 case R_X86_64_GOTTPOFF:
1392 /* Check transition from IE access model:
1393 mov foo@gottpoff(%rip), %reg
1394 add foo@gottpoff(%rip), %reg
1397 /* Check REX prefix first. */
1398 if (offset >= 3 && (offset + 4) <= sec->size)
1400 val = bfd_get_8 (abfd, contents + offset - 3);
1401 if (val != 0x48 && val != 0x4c)
1403 /* X32 may have 0x44 REX prefix or no REX prefix. */
1404 if (ABI_64_P (abfd))
1410 /* X32 may not have any REX prefix. */
1411 if (ABI_64_P (abfd))
1413 if (offset < 2 || (offset + 3) > sec->size)
1417 val = bfd_get_8 (abfd, contents + offset - 2);
1418 if (val != 0x8b && val != 0x03)
1421 val = bfd_get_8 (abfd, contents + offset - 1);
1422 return (val & 0xc7) == 5;
1424 case R_X86_64_GOTPC32_TLSDESC:
1425 /* Check transition from GDesc access model:
1426 leaq x@tlsdesc(%rip), %rax
1428 Make sure it's a leaq adding rip to a 32-bit offset
1429 into any register, although it's probably almost always
1432 if (offset < 3 || (offset + 4) > sec->size)
1435 val = bfd_get_8 (abfd, contents + offset - 3);
1436 if ((val & 0xfb) != 0x48)
1439 if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1442 val = bfd_get_8 (abfd, contents + offset - 1);
1443 return (val & 0xc7) == 0x05;
1445 case R_X86_64_TLSDESC_CALL:
1446 /* Check transition from GDesc access model:
1447 call *x@tlsdesc(%rax)
1449 if (offset + 2 <= sec->size)
1451 /* Make sure that it's a call *x@tlsdesc(%rax). */
1452 static const unsigned char call[] = { 0xff, 0x10 };
1453 return memcmp (contents + offset, call, 2) == 0;
1463 /* Return TRUE if the TLS access transition is OK or no transition
1464 will be performed. Update R_TYPE if there is a transition. */
1467 elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
1468 asection *sec, bfd_byte *contents,
1469 Elf_Internal_Shdr *symtab_hdr,
1470 struct elf_link_hash_entry **sym_hashes,
1471 unsigned int *r_type, int tls_type,
1472 const Elf_Internal_Rela *rel,
1473 const Elf_Internal_Rela *relend,
1474 struct elf_link_hash_entry *h,
1475 unsigned long r_symndx)
1477 unsigned int from_type = *r_type;
1478 unsigned int to_type = from_type;
1479 bfd_boolean check = TRUE;
1481 /* Skip TLS transition for functions. */
1483 && (h->type == STT_FUNC
1484 || h->type == STT_GNU_IFUNC))
1489 case R_X86_64_TLSGD:
1490 case R_X86_64_GOTPC32_TLSDESC:
1491 case R_X86_64_TLSDESC_CALL:
1492 case R_X86_64_GOTTPOFF:
1493 if (bfd_link_executable (info))
1496 to_type = R_X86_64_TPOFF32;
1498 to_type = R_X86_64_GOTTPOFF;
1501 /* When we are called from elf_x86_64_relocate_section,
1502 CONTENTS isn't NULL and there may be additional transitions
1503 based on TLS_TYPE. */
1504 if (contents != NULL)
1506 unsigned int new_to_type = to_type;
1508 if (bfd_link_executable (info)
1511 && tls_type == GOT_TLS_IE)
1512 new_to_type = R_X86_64_TPOFF32;
1514 if (to_type == R_X86_64_TLSGD
1515 || to_type == R_X86_64_GOTPC32_TLSDESC
1516 || to_type == R_X86_64_TLSDESC_CALL)
1518 if (tls_type == GOT_TLS_IE)
1519 new_to_type = R_X86_64_GOTTPOFF;
1522 /* We checked the transition before when we were called from
1523 elf_x86_64_check_relocs. We only want to check the new
1524 transition which hasn't been checked before. */
1525 check = new_to_type != to_type && from_type == to_type;
1526 to_type = new_to_type;
1531 case R_X86_64_TLSLD:
1532 if (bfd_link_executable (info))
1533 to_type = R_X86_64_TPOFF32;
1540 /* Return TRUE if there is no transition. */
1541 if (from_type == to_type)
1544 /* Check if the transition can be performed. */
1546 && ! elf_x86_64_check_tls_transition (abfd, info, sec, contents,
1547 symtab_hdr, sym_hashes,
1548 from_type, rel, relend))
1550 reloc_howto_type *from, *to;
1553 from = elf_x86_64_rtype_to_howto (abfd, from_type);
1554 to = elf_x86_64_rtype_to_howto (abfd, to_type);
1557 name = h->root.root.string;
1560 struct elf_x86_64_link_hash_table *htab;
1562 htab = elf_x86_64_hash_table (info);
1567 Elf_Internal_Sym *isym;
1569 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1571 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1575 (*_bfd_error_handler)
1576 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1577 "in section `%A' failed"),
1578 abfd, sec, from->name, to->name, name,
1579 (unsigned long) rel->r_offset);
1580 bfd_set_error (bfd_error_bad_value);
1588 /* Rename some of the generic section flags to better document how they
1590 #define need_convert_load sec_flg0
1592 /* Look through the relocs for a section during the first phase, and
1593 calculate needed space in the global offset table, procedure
1594 linkage table, and dynamic reloc sections. */
1597 elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
1599 const Elf_Internal_Rela *relocs)
1601 struct elf_x86_64_link_hash_table *htab;
1602 Elf_Internal_Shdr *symtab_hdr;
1603 struct elf_link_hash_entry **sym_hashes;
1604 const Elf_Internal_Rela *rel;
1605 const Elf_Internal_Rela *rel_end;
1607 bfd_boolean use_plt_got;
1609 if (bfd_link_relocatable (info))
1612 BFD_ASSERT (is_x86_64_elf (abfd));
1614 htab = elf_x86_64_hash_table (info);
1618 use_plt_got = get_elf_x86_64_backend_data (abfd) == &elf_x86_64_arch_bed;
1620 symtab_hdr = &elf_symtab_hdr (abfd);
1621 sym_hashes = elf_sym_hashes (abfd);
1625 rel_end = relocs + sec->reloc_count;
1626 for (rel = relocs; rel < rel_end; rel++)
1628 unsigned int r_type;
1629 unsigned long r_symndx;
1630 struct elf_link_hash_entry *h;
1631 struct elf_x86_64_link_hash_entry *eh;
1632 Elf_Internal_Sym *isym;
1634 bfd_boolean size_reloc;
1636 r_symndx = htab->r_sym (rel->r_info);
1637 r_type = ELF32_R_TYPE (rel->r_info);
1639 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1641 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1646 if (r_symndx < symtab_hdr->sh_info)
1648 /* A local symbol. */
1649 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1654 /* Check relocation against local STT_GNU_IFUNC symbol. */
1655 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1657 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel,
1662 /* Fake a STT_GNU_IFUNC symbol. */
1663 h->type = STT_GNU_IFUNC;
1666 h->forced_local = 1;
1667 h->root.type = bfd_link_hash_defined;
1675 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1676 while (h->root.type == bfd_link_hash_indirect
1677 || h->root.type == bfd_link_hash_warning)
1678 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1681 /* Check invalid x32 relocations. */
1682 if (!ABI_64_P (abfd))
1688 case R_X86_64_DTPOFF64:
1689 case R_X86_64_TPOFF64:
1691 case R_X86_64_GOTOFF64:
1692 case R_X86_64_GOT64:
1693 case R_X86_64_GOTPCREL64:
1694 case R_X86_64_GOTPC64:
1695 case R_X86_64_GOTPLT64:
1696 case R_X86_64_PLTOFF64:
1699 name = h->root.root.string;
1701 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1703 (*_bfd_error_handler)
1704 (_("%B: relocation %s against symbol `%s' isn't "
1705 "supported in x32 mode"), abfd,
1706 x86_64_elf_howto_table[r_type].name, name);
1707 bfd_set_error (bfd_error_bad_value);
1715 /* Create the ifunc sections for static executables. If we
1716 never see an indirect function symbol nor we are building
1717 a static executable, those sections will be empty and
1718 won't appear in output. */
1724 case R_X86_64_PC32_BND:
1725 case R_X86_64_PLT32_BND:
1727 case R_X86_64_PLT32:
1730 /* MPX PLT is supported only if elf_x86_64_arch_bed
1731 is used in 64-bit mode. */
1734 && (get_elf_x86_64_backend_data (abfd)
1735 == &elf_x86_64_arch_bed))
1737 elf_x86_64_hash_entry (h)->has_bnd_reloc = 1;
1739 /* Create the second PLT for Intel MPX support. */
1740 if (htab->plt_bnd == NULL)
1742 unsigned int plt_bnd_align;
1743 const struct elf_backend_data *bed;
1745 bed = get_elf_backend_data (info->output_bfd);
1746 BFD_ASSERT (sizeof (elf_x86_64_bnd_plt2_entry) == 8
1747 && (sizeof (elf_x86_64_bnd_plt2_entry)
1748 == sizeof (elf_x86_64_legacy_plt2_entry)));
1751 if (htab->elf.dynobj == NULL)
1752 htab->elf.dynobj = abfd;
1754 = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
1756 (bed->dynamic_sec_flags
1761 if (htab->plt_bnd == NULL
1762 || !bfd_set_section_alignment (htab->elf.dynobj,
1771 case R_X86_64_GOTPCREL:
1772 case R_X86_64_GOTPCRELX:
1773 case R_X86_64_REX_GOTPCRELX:
1774 case R_X86_64_GOTPCREL64:
1775 if (htab->elf.dynobj == NULL)
1776 htab->elf.dynobj = abfd;
1777 if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info))
1782 /* It is referenced by a non-shared object. */
1784 h->root.non_ir_ref = 1;
1786 if (h->type == STT_GNU_IFUNC)
1787 elf_tdata (info->output_bfd)->has_gnu_symbols
1788 |= elf_gnu_symbol_ifunc;
1791 if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
1792 symtab_hdr, sym_hashes,
1793 &r_type, GOT_UNKNOWN,
1794 rel, rel_end, h, r_symndx))
1797 eh = (struct elf_x86_64_link_hash_entry *) h;
1800 case R_X86_64_TLSLD:
1801 htab->tls_ld_got.refcount += 1;
1804 case R_X86_64_TPOFF32:
1805 if (!bfd_link_executable (info) && ABI_64_P (abfd))
1808 name = h->root.root.string;
1810 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1812 (*_bfd_error_handler)
1813 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1815 x86_64_elf_howto_table[r_type].name, name);
1816 bfd_set_error (bfd_error_bad_value);
1820 eh->has_got_reloc = 1;
1823 case R_X86_64_GOTTPOFF:
1824 if (!bfd_link_executable (info))
1825 info->flags |= DF_STATIC_TLS;
1828 case R_X86_64_GOT32:
1829 case R_X86_64_GOTPCREL:
1830 case R_X86_64_GOTPCRELX:
1831 case R_X86_64_REX_GOTPCRELX:
1832 case R_X86_64_TLSGD:
1833 case R_X86_64_GOT64:
1834 case R_X86_64_GOTPCREL64:
1835 case R_X86_64_GOTPLT64:
1836 case R_X86_64_GOTPC32_TLSDESC:
1837 case R_X86_64_TLSDESC_CALL:
1838 /* This symbol requires a global offset table entry. */
1840 int tls_type, old_tls_type;
1844 default: tls_type = GOT_NORMAL; break;
1845 case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break;
1846 case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break;
1847 case R_X86_64_GOTPC32_TLSDESC:
1848 case R_X86_64_TLSDESC_CALL:
1849 tls_type = GOT_TLS_GDESC; break;
1854 h->got.refcount += 1;
1855 old_tls_type = eh->tls_type;
1859 bfd_signed_vma *local_got_refcounts;
1861 /* This is a global offset table entry for a local symbol. */
1862 local_got_refcounts = elf_local_got_refcounts (abfd);
1863 if (local_got_refcounts == NULL)
1867 size = symtab_hdr->sh_info;
1868 size *= sizeof (bfd_signed_vma)
1869 + sizeof (bfd_vma) + sizeof (char);
1870 local_got_refcounts = ((bfd_signed_vma *)
1871 bfd_zalloc (abfd, size));
1872 if (local_got_refcounts == NULL)
1874 elf_local_got_refcounts (abfd) = local_got_refcounts;
1875 elf_x86_64_local_tlsdesc_gotent (abfd)
1876 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
1877 elf_x86_64_local_got_tls_type (abfd)
1878 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
1880 local_got_refcounts[r_symndx] += 1;
1882 = elf_x86_64_local_got_tls_type (abfd) [r_symndx];
1885 /* If a TLS symbol is accessed using IE at least once,
1886 there is no point to use dynamic model for it. */
1887 if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1888 && (! GOT_TLS_GD_ANY_P (old_tls_type)
1889 || tls_type != GOT_TLS_IE))
1891 if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type))
1892 tls_type = old_tls_type;
1893 else if (GOT_TLS_GD_ANY_P (old_tls_type)
1894 && GOT_TLS_GD_ANY_P (tls_type))
1895 tls_type |= old_tls_type;
1899 name = h->root.root.string;
1901 name = bfd_elf_sym_name (abfd, symtab_hdr,
1903 (*_bfd_error_handler)
1904 (_("%B: '%s' accessed both as normal and thread local symbol"),
1906 bfd_set_error (bfd_error_bad_value);
1911 if (old_tls_type != tls_type)
1914 eh->tls_type = tls_type;
1916 elf_x86_64_local_got_tls_type (abfd) [r_symndx] = tls_type;
1921 case R_X86_64_GOTOFF64:
1922 case R_X86_64_GOTPC32:
1923 case R_X86_64_GOTPC64:
1926 eh->has_got_reloc = 1;
1927 if (htab->elf.sgot == NULL)
1929 if (htab->elf.dynobj == NULL)
1930 htab->elf.dynobj = abfd;
1931 if (!_bfd_elf_create_got_section (htab->elf.dynobj,
1937 case R_X86_64_PLT32:
1938 case R_X86_64_PLT32_BND:
1939 /* This symbol requires a procedure linkage table entry. We
1940 actually build the entry in adjust_dynamic_symbol,
1941 because this might be a case of linking PIC code which is
1942 never referenced by a dynamic object, in which case we
1943 don't need to generate a procedure linkage table entry
1946 /* If this is a local symbol, we resolve it directly without
1947 creating a procedure linkage table entry. */
1951 eh->has_got_reloc = 1;
1953 h->plt.refcount += 1;
1956 case R_X86_64_PLTOFF64:
1957 /* This tries to form the 'address' of a function relative
1958 to GOT. For global symbols we need a PLT entry. */
1962 h->plt.refcount += 1;
1966 case R_X86_64_SIZE32:
1967 case R_X86_64_SIZE64:
1972 if (!ABI_64_P (abfd))
1977 /* Let's help debug shared library creation. These relocs
1978 cannot be used in shared libs. Don't error out for
1979 sections we don't care about, such as debug sections or
1980 non-constant sections, or when relocation overflow check
1982 if (!info->no_reloc_overflow_check
1983 && bfd_link_pic (info)
1984 && (sec->flags & SEC_ALLOC) != 0
1985 && (sec->flags & SEC_READONLY) != 0)
1988 name = h->root.root.string;
1990 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1991 (*_bfd_error_handler)
1992 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1993 abfd, x86_64_elf_howto_table[r_type].name, name);
1994 bfd_set_error (bfd_error_bad_value);
2002 case R_X86_64_PC32_BND:
2006 if (eh != NULL && (sec->flags & SEC_CODE) != 0)
2007 eh->has_non_got_reloc = 1;
2008 /* STT_GNU_IFUNC symbol must go through PLT even if it is
2009 locally defined and undefined symbol may turn out to be
2010 a STT_GNU_IFUNC symbol later. */
2012 && (bfd_link_executable (info)
2013 || ((h->type == STT_GNU_IFUNC
2014 || h->root.type == bfd_link_hash_undefweak
2015 || h->root.type == bfd_link_hash_undefined)
2016 && SYMBOLIC_BIND (info, h))))
2018 /* If this reloc is in a read-only section, we might
2019 need a copy reloc. We can't check reliably at this
2020 stage whether the section is read-only, as input
2021 sections have not yet been mapped to output sections.
2022 Tentatively set the flag for now, and correct in
2023 adjust_dynamic_symbol. */
2026 /* We may need a .plt entry if the function this reloc
2027 refers to is in a shared lib. */
2028 h->plt.refcount += 1;
2029 if (r_type == R_X86_64_PC32)
2031 /* Since something like ".long foo - ." may be used
2032 as pointer, make sure that PLT is used if foo is
2033 a function defined in a shared library. */
2034 if ((sec->flags & SEC_CODE) == 0)
2035 h->pointer_equality_needed = 1;
2037 else if (r_type != R_X86_64_PC32_BND
2038 && r_type != R_X86_64_PC64)
2040 h->pointer_equality_needed = 1;
2041 /* At run-time, R_X86_64_64 can be resolved for both
2042 x86-64 and x32. But R_X86_64_32 and R_X86_64_32S
2043 can only be resolved for x32. */
2044 if ((sec->flags & SEC_READONLY) == 0
2045 && (r_type == R_X86_64_64
2046 || (!ABI_64_P (abfd)
2047 && (r_type == R_X86_64_32
2048 || r_type == R_X86_64_32S))))
2049 eh->func_pointer_refcount += 1;
2055 /* If we are creating a shared library, and this is a reloc
2056 against a global symbol, or a non PC relative reloc
2057 against a local symbol, then we need to copy the reloc
2058 into the shared library. However, if we are linking with
2059 -Bsymbolic, we do not need to copy a reloc against a
2060 global symbol which is defined in an object we are
2061 including in the link (i.e., DEF_REGULAR is set). At
2062 this point we have not seen all the input files, so it is
2063 possible that DEF_REGULAR is not set now but will be set
2064 later (it is never cleared). In case of a weak definition,
2065 DEF_REGULAR may be cleared later by a strong definition in
2066 a shared library. We account for that possibility below by
2067 storing information in the relocs_copied field of the hash
2068 table entry. A similar situation occurs when creating
2069 shared libraries and symbol visibility changes render the
2072 If on the other hand, we are creating an executable, we
2073 may need to keep relocations for symbols satisfied by a
2074 dynamic library if we manage to avoid copy relocs for the
2076 if ((bfd_link_pic (info)
2077 && (sec->flags & SEC_ALLOC) != 0
2078 && (! IS_X86_64_PCREL_TYPE (r_type)
2080 && (! (bfd_link_pie (info)
2081 || SYMBOLIC_BIND (info, h))
2082 || h->root.type == bfd_link_hash_defweak
2083 || !h->def_regular))))
2084 || (ELIMINATE_COPY_RELOCS
2085 && !bfd_link_pic (info)
2086 && (sec->flags & SEC_ALLOC) != 0
2088 && (h->root.type == bfd_link_hash_defweak
2089 || !h->def_regular)))
2091 struct elf_dyn_relocs *p;
2092 struct elf_dyn_relocs **head;
2094 /* We must copy these reloc types into the output file.
2095 Create a reloc section in dynobj and make room for
2099 if (htab->elf.dynobj == NULL)
2100 htab->elf.dynobj = abfd;
2102 sreloc = _bfd_elf_make_dynamic_reloc_section
2103 (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2,
2104 abfd, /*rela?*/ TRUE);
2110 /* If this is a global symbol, we count the number of
2111 relocations we need for this symbol. */
2113 head = &eh->dyn_relocs;
2116 /* Track dynamic relocs needed for local syms too.
2117 We really need local syms available to do this
2122 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2127 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2131 /* Beware of type punned pointers vs strict aliasing
2133 vpp = &(elf_section_data (s)->local_dynrel);
2134 head = (struct elf_dyn_relocs **)vpp;
2138 if (p == NULL || p->sec != sec)
2140 bfd_size_type amt = sizeof *p;
2142 p = ((struct elf_dyn_relocs *)
2143 bfd_alloc (htab->elf.dynobj, amt));
2154 /* Count size relocation as PC-relative relocation. */
2155 if (IS_X86_64_PCREL_TYPE (r_type) || size_reloc)
2160 /* This relocation describes the C++ object vtable hierarchy.
2161 Reconstruct it for later use during GC. */
2162 case R_X86_64_GNU_VTINHERIT:
2163 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2167 /* This relocation describes which C++ vtable entries are actually
2168 used. Record for later use during GC. */
2169 case R_X86_64_GNU_VTENTRY:
2170 BFD_ASSERT (h != NULL);
2172 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2182 && h->plt.refcount > 0
2183 && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
2184 || h->got.refcount > 0)
2185 && htab->plt_got == NULL)
2187 /* Create the GOT procedure linkage table. */
2188 unsigned int plt_got_align;
2189 const struct elf_backend_data *bed;
2191 bed = get_elf_backend_data (info->output_bfd);
2192 BFD_ASSERT (sizeof (elf_x86_64_legacy_plt2_entry) == 8
2193 && (sizeof (elf_x86_64_bnd_plt2_entry)
2194 == sizeof (elf_x86_64_legacy_plt2_entry)));
2197 if (htab->elf.dynobj == NULL)
2198 htab->elf.dynobj = abfd;
2200 = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2202 (bed->dynamic_sec_flags
2207 if (htab->plt_got == NULL
2208 || !bfd_set_section_alignment (htab->elf.dynobj,
2214 if ((r_type == R_X86_64_GOTPCREL
2215 || r_type == R_X86_64_GOTPCRELX
2216 || r_type == R_X86_64_REX_GOTPCRELX)
2217 && (h == NULL || h->type != STT_GNU_IFUNC))
2218 sec->need_convert_load = 1;
2224 /* Return the section that should be marked against GC for a given
2228 elf_x86_64_gc_mark_hook (asection *sec,
2229 struct bfd_link_info *info,
2230 Elf_Internal_Rela *rel,
2231 struct elf_link_hash_entry *h,
2232 Elf_Internal_Sym *sym)
2235 switch (ELF32_R_TYPE (rel->r_info))
2237 case R_X86_64_GNU_VTINHERIT:
2238 case R_X86_64_GNU_VTENTRY:
2242 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2245 /* Update the got entry reference counts for the section being removed. */
2248 elf_x86_64_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
2250 const Elf_Internal_Rela *relocs)
2252 struct elf_x86_64_link_hash_table *htab;
2253 Elf_Internal_Shdr *symtab_hdr;
2254 struct elf_link_hash_entry **sym_hashes;
2255 bfd_signed_vma *local_got_refcounts;
2256 const Elf_Internal_Rela *rel, *relend;
2258 if (bfd_link_relocatable (info))
2261 htab = elf_x86_64_hash_table (info);
2265 elf_section_data (sec)->local_dynrel = NULL;
2267 symtab_hdr = &elf_symtab_hdr (abfd);
2268 sym_hashes = elf_sym_hashes (abfd);
2269 local_got_refcounts = elf_local_got_refcounts (abfd);
2271 htab = elf_x86_64_hash_table (info);
2272 relend = relocs + sec->reloc_count;
2273 for (rel = relocs; rel < relend; rel++)
2275 unsigned long r_symndx;
2276 unsigned int r_type;
2277 struct elf_link_hash_entry *h = NULL;
2278 bfd_boolean pointer_reloc;
2280 r_symndx = htab->r_sym (rel->r_info);
2281 if (r_symndx >= symtab_hdr->sh_info)
2283 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2284 while (h->root.type == bfd_link_hash_indirect
2285 || h->root.type == bfd_link_hash_warning)
2286 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2290 /* A local symbol. */
2291 Elf_Internal_Sym *isym;
2293 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2296 /* Check relocation against local STT_GNU_IFUNC symbol. */
2298 && ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2300 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel, FALSE);
2308 struct elf_x86_64_link_hash_entry *eh;
2309 struct elf_dyn_relocs **pp;
2310 struct elf_dyn_relocs *p;
2312 eh = (struct elf_x86_64_link_hash_entry *) h;
2314 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2317 /* Everything must go for SEC. */
2323 r_type = ELF32_R_TYPE (rel->r_info);
2324 if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
2325 symtab_hdr, sym_hashes,
2326 &r_type, GOT_UNKNOWN,
2327 rel, relend, h, r_symndx))
2330 pointer_reloc = FALSE;
2333 case R_X86_64_TLSLD:
2334 if (htab->tls_ld_got.refcount > 0)
2335 htab->tls_ld_got.refcount -= 1;
2338 case R_X86_64_TLSGD:
2339 case R_X86_64_GOTPC32_TLSDESC:
2340 case R_X86_64_TLSDESC_CALL:
2341 case R_X86_64_GOTTPOFF:
2342 case R_X86_64_GOT32:
2343 case R_X86_64_GOTPCREL:
2344 case R_X86_64_GOTPCRELX:
2345 case R_X86_64_REX_GOTPCRELX:
2346 case R_X86_64_GOT64:
2347 case R_X86_64_GOTPCREL64:
2348 case R_X86_64_GOTPLT64:
2351 if (h->got.refcount > 0)
2352 h->got.refcount -= 1;
2353 if (h->type == STT_GNU_IFUNC)
2355 if (h->plt.refcount > 0)
2356 h->plt.refcount -= 1;
2359 else if (local_got_refcounts != NULL)
2361 if (local_got_refcounts[r_symndx] > 0)
2362 local_got_refcounts[r_symndx] -= 1;
2368 pointer_reloc = !ABI_64_P (abfd);
2372 pointer_reloc = TRUE;
2378 case R_X86_64_PC32_BND:
2380 case R_X86_64_SIZE32:
2381 case R_X86_64_SIZE64:
2383 if (bfd_link_pic (info)
2384 && (h == NULL || h->type != STT_GNU_IFUNC))
2388 case R_X86_64_PLT32:
2389 case R_X86_64_PLT32_BND:
2390 case R_X86_64_PLTOFF64:
2393 if (h->plt.refcount > 0)
2394 h->plt.refcount -= 1;
2395 if (pointer_reloc && (sec->flags & SEC_READONLY) == 0)
2397 struct elf_x86_64_link_hash_entry *eh
2398 = (struct elf_x86_64_link_hash_entry *) h;
2399 if (eh->func_pointer_refcount > 0)
2400 eh->func_pointer_refcount -= 1;
2413 /* Remove undefined weak symbol from the dynamic symbol table if it
2414 is resolved to 0. */
2417 elf_x86_64_fixup_symbol (struct bfd_link_info *info,
2418 struct elf_link_hash_entry *h)
2420 if (h->dynindx != -1
2421 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
2422 elf_x86_64_hash_entry (h)))
2425 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2431 /* Adjust a symbol defined by a dynamic object and referenced by a
2432 regular object. The current definition is in some section of the
2433 dynamic object, but we're not including those sections. We have to
2434 change the definition to something the rest of the link can
2438 elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
2439 struct elf_link_hash_entry *h)
2441 struct elf_x86_64_link_hash_table *htab;
2443 struct elf_x86_64_link_hash_entry *eh;
2444 struct elf_dyn_relocs *p;
2446 /* STT_GNU_IFUNC symbol must go through PLT. */
2447 if (h->type == STT_GNU_IFUNC)
2449 /* All local STT_GNU_IFUNC references must be treate as local
2450 calls via local PLT. */
2452 && SYMBOL_CALLS_LOCAL (info, h))
2454 bfd_size_type pc_count = 0, count = 0;
2455 struct elf_dyn_relocs **pp;
2457 eh = (struct elf_x86_64_link_hash_entry *) h;
2458 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2460 pc_count += p->pc_count;
2461 p->count -= p->pc_count;
2470 if (pc_count || count)
2474 if (h->plt.refcount <= 0)
2475 h->plt.refcount = 1;
2477 h->plt.refcount += 1;
2481 if (h->plt.refcount <= 0)
2483 h->plt.offset = (bfd_vma) -1;
2489 /* If this is a function, put it in the procedure linkage table. We
2490 will fill in the contents of the procedure linkage table later,
2491 when we know the address of the .got section. */
2492 if (h->type == STT_FUNC
2495 if (h->plt.refcount <= 0
2496 || SYMBOL_CALLS_LOCAL (info, h)
2497 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2498 && h->root.type == bfd_link_hash_undefweak))
2500 /* This case can occur if we saw a PLT32 reloc in an input
2501 file, but the symbol was never referred to by a dynamic
2502 object, or if all references were garbage collected. In
2503 such a case, we don't actually need to build a procedure
2504 linkage table, and we can just do a PC32 reloc instead. */
2505 h->plt.offset = (bfd_vma) -1;
2512 /* It's possible that we incorrectly decided a .plt reloc was
2513 needed for an R_X86_64_PC32 reloc to a non-function sym in
2514 check_relocs. We can't decide accurately between function and
2515 non-function syms in check-relocs; Objects loaded later in
2516 the link may change h->type. So fix it now. */
2517 h->plt.offset = (bfd_vma) -1;
2519 /* If this is a weak symbol, and there is a real definition, the
2520 processor independent code will have arranged for us to see the
2521 real definition first, and we can just use the same value. */
2522 if (h->u.weakdef != NULL)
2524 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2525 || h->u.weakdef->root.type == bfd_link_hash_defweak);
2526 h->root.u.def.section = h->u.weakdef->root.u.def.section;
2527 h->root.u.def.value = h->u.weakdef->root.u.def.value;
2528 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2530 eh = (struct elf_x86_64_link_hash_entry *) h;
2531 h->non_got_ref = h->u.weakdef->non_got_ref;
2532 eh->needs_copy = h->u.weakdef->needs_copy;
2537 /* This is a reference to a symbol defined by a dynamic object which
2538 is not a function. */
2540 /* If we are creating a shared library, we must presume that the
2541 only references to the symbol are via the global offset table.
2542 For such cases we need not do anything here; the relocations will
2543 be handled correctly by relocate_section. */
2544 if (!bfd_link_executable (info))
2547 /* If there are no references to this symbol that do not use the
2548 GOT, we don't need to generate a copy reloc. */
2549 if (!h->non_got_ref)
2552 /* If -z nocopyreloc was given, we won't generate them either. */
2553 if (info->nocopyreloc)
2559 if (ELIMINATE_COPY_RELOCS)
2561 eh = (struct elf_x86_64_link_hash_entry *) h;
2562 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2564 s = p->sec->output_section;
2565 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2569 /* If we didn't find any dynamic relocs in read-only sections, then
2570 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
2578 /* We must allocate the symbol in our .dynbss section, which will
2579 become part of the .bss section of the executable. There will be
2580 an entry for this symbol in the .dynsym section. The dynamic
2581 object will contain position independent code, so all references
2582 from the dynamic object to this symbol will go through the global
2583 offset table. The dynamic linker will use the .dynsym entry to
2584 determine the address it must put in the global offset table, so
2585 both the dynamic object and the regular object will refer to the
2586 same memory location for the variable. */
2588 htab = elf_x86_64_hash_table (info);
2592 /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
2593 to copy the initial value out of the dynamic object and into the
2594 runtime process image. */
2595 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2597 const struct elf_backend_data *bed;
2598 bed = get_elf_backend_data (info->output_bfd);
2599 htab->srelbss->size += bed->s->sizeof_rela;
2605 return _bfd_elf_adjust_dynamic_copy (info, h, s);
2608 /* Allocate space in .plt, .got and associated reloc sections for
2612 elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2614 struct bfd_link_info *info;
2615 struct elf_x86_64_link_hash_table *htab;
2616 struct elf_x86_64_link_hash_entry *eh;
2617 struct elf_dyn_relocs *p;
2618 const struct elf_backend_data *bed;
2619 unsigned int plt_entry_size;
2620 bfd_boolean resolved_to_zero;
2622 if (h->root.type == bfd_link_hash_indirect)
2625 eh = (struct elf_x86_64_link_hash_entry *) h;
2627 info = (struct bfd_link_info *) inf;
2628 htab = elf_x86_64_hash_table (info);
2631 bed = get_elf_backend_data (info->output_bfd);
2632 plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2634 resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
2636 /* We can't use the GOT PLT if pointer equality is needed since
2637 finish_dynamic_symbol won't clear symbol value and the dynamic
2638 linker won't update the GOT slot. We will get into an infinite
2639 loop at run-time. */
2640 if (htab->plt_got != NULL
2641 && h->type != STT_GNU_IFUNC
2642 && !h->pointer_equality_needed
2643 && h->plt.refcount > 0
2644 && h->got.refcount > 0)
2646 /* Don't use the regular PLT if there are both GOT and GOTPLT
2648 h->plt.offset = (bfd_vma) -1;
2650 /* Use the GOT PLT. */
2651 eh->plt_got.refcount = 1;
2654 /* Clear the reference count of function pointer relocations if
2655 symbol isn't a normal function. */
2656 if (h->type != STT_FUNC)
2657 eh->func_pointer_refcount = 0;
2659 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2660 here if it is defined and referenced in a non-shared object. */
2661 if (h->type == STT_GNU_IFUNC
2664 if (_bfd_elf_allocate_ifunc_dyn_relocs (info, h,
2666 &htab->readonly_dynrelocs_against_ifunc,
2671 asection *s = htab->plt_bnd;
2672 if (h->plt.offset != (bfd_vma) -1 && s != NULL)
2674 /* Use the .plt.bnd section if it is created. */
2675 eh->plt_bnd.offset = s->size;
2677 /* Make room for this entry in the .plt.bnd section. */
2678 s->size += sizeof (elf_x86_64_legacy_plt2_entry);
2686 /* Don't create the PLT entry if there are only function pointer
2687 relocations which can be resolved at run-time. */
2688 else if (htab->elf.dynamic_sections_created
2689 && (h->plt.refcount > eh->func_pointer_refcount
2690 || eh->plt_got.refcount > 0))
2692 bfd_boolean use_plt_got;
2694 /* Clear the reference count of function pointer relocations
2696 eh->func_pointer_refcount = 0;
2698 if ((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
2700 /* Don't use the regular PLT for DF_BIND_NOW. */
2701 h->plt.offset = (bfd_vma) -1;
2703 /* Use the GOT PLT. */
2704 h->got.refcount = 1;
2705 eh->plt_got.refcount = 1;
2708 use_plt_got = eh->plt_got.refcount > 0;
2710 /* Make sure this symbol is output as a dynamic symbol.
2711 Undefined weak syms won't yet be marked as dynamic. */
2712 if (h->dynindx == -1
2714 && !resolved_to_zero)
2716 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2720 if (bfd_link_pic (info)
2721 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2723 asection *s = htab->elf.splt;
2724 asection *bnd_s = htab->plt_bnd;
2725 asection *got_s = htab->plt_got;
2727 /* If this is the first .plt entry, make room for the special
2728 first entry. The .plt section is used by prelink to undo
2729 prelinking for dynamic relocations. */
2731 s->size = plt_entry_size;
2734 eh->plt_got.offset = got_s->size;
2737 h->plt.offset = s->size;
2739 eh->plt_bnd.offset = bnd_s->size;
2742 /* If this symbol is not defined in a regular file, and we are
2743 not generating a shared library, then set the symbol to this
2744 location in the .plt. This is required to make function
2745 pointers compare as equal between the normal executable and
2746 the shared library. */
2747 if (! bfd_link_pic (info)
2752 /* We need to make a call to the entry of the GOT PLT
2753 instead of regular PLT entry. */
2754 h->root.u.def.section = got_s;
2755 h->root.u.def.value = eh->plt_got.offset;
2761 /* We need to make a call to the entry of the second
2762 PLT instead of regular PLT entry. */
2763 h->root.u.def.section = bnd_s;
2764 h->root.u.def.value = eh->plt_bnd.offset;
2768 h->root.u.def.section = s;
2769 h->root.u.def.value = h->plt.offset;
2774 /* Make room for this entry. */
2776 got_s->size += sizeof (elf_x86_64_legacy_plt2_entry);
2779 s->size += plt_entry_size;
2781 bnd_s->size += sizeof (elf_x86_64_legacy_plt2_entry);
2783 /* We also need to make an entry in the .got.plt section,
2784 which will be placed in the .got section by the linker
2786 htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
2788 /* There should be no PLT relocation against resolved
2789 undefined weak symbol in executable. */
2790 if (!resolved_to_zero)
2792 /* We also need to make an entry in the .rela.plt
2794 htab->elf.srelplt->size += bed->s->sizeof_rela;
2795 htab->elf.srelplt->reloc_count++;
2801 eh->plt_got.offset = (bfd_vma) -1;
2802 h->plt.offset = (bfd_vma) -1;
2808 eh->plt_got.offset = (bfd_vma) -1;
2809 h->plt.offset = (bfd_vma) -1;
2813 eh->tlsdesc_got = (bfd_vma) -1;
2815 /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
2816 make it a R_X86_64_TPOFF32 requiring no GOT entry. */
2817 if (h->got.refcount > 0
2818 && bfd_link_executable (info)
2820 && elf_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE)
2822 h->got.offset = (bfd_vma) -1;
2824 else if (h->got.refcount > 0)
2828 int tls_type = elf_x86_64_hash_entry (h)->tls_type;
2830 /* Make sure this symbol is output as a dynamic symbol.
2831 Undefined weak syms won't yet be marked as dynamic. */
2832 if (h->dynindx == -1
2834 && !resolved_to_zero)
2836 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2840 if (GOT_TLS_GDESC_P (tls_type))
2842 eh->tlsdesc_got = htab->elf.sgotplt->size
2843 - elf_x86_64_compute_jump_table_size (htab);
2844 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
2845 h->got.offset = (bfd_vma) -2;
2847 if (! GOT_TLS_GDESC_P (tls_type)
2848 || GOT_TLS_GD_P (tls_type))
2851 h->got.offset = s->size;
2852 s->size += GOT_ENTRY_SIZE;
2853 if (GOT_TLS_GD_P (tls_type))
2854 s->size += GOT_ENTRY_SIZE;
2856 dyn = htab->elf.dynamic_sections_created;
2857 /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
2858 and two if global. R_X86_64_GOTTPOFF needs one dynamic
2859 relocation. No dynamic relocation against resolved undefined
2860 weak symbol in executable. */
2861 if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2862 || tls_type == GOT_TLS_IE)
2863 htab->elf.srelgot->size += bed->s->sizeof_rela;
2864 else if (GOT_TLS_GD_P (tls_type))
2865 htab->elf.srelgot->size += 2 * bed->s->sizeof_rela;
2866 else if (! GOT_TLS_GDESC_P (tls_type)
2867 && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2868 && !resolved_to_zero)
2869 || h->root.type != bfd_link_hash_undefweak)
2870 && (bfd_link_pic (info)
2871 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2872 htab->elf.srelgot->size += bed->s->sizeof_rela;
2873 if (GOT_TLS_GDESC_P (tls_type))
2875 htab->elf.srelplt->size += bed->s->sizeof_rela;
2876 htab->tlsdesc_plt = (bfd_vma) -1;
2880 h->got.offset = (bfd_vma) -1;
2882 if (eh->dyn_relocs == NULL)
2885 /* In the shared -Bsymbolic case, discard space allocated for
2886 dynamic pc-relative relocs against symbols which turn out to be
2887 defined in regular objects. For the normal shared case, discard
2888 space for pc-relative relocs that have become local due to symbol
2889 visibility changes. */
2891 if (bfd_link_pic (info))
2893 /* Relocs that use pc_count are those that appear on a call
2894 insn, or certain REL relocs that can generated via assembly.
2895 We want calls to protected symbols to resolve directly to the
2896 function rather than going via the plt. If people want
2897 function pointer comparisons to work as expected then they
2898 should avoid writing weird assembly. */
2899 if (SYMBOL_CALLS_LOCAL (info, h))
2901 struct elf_dyn_relocs **pp;
2903 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2905 p->count -= p->pc_count;
2914 /* Also discard relocs on undefined weak syms with non-default
2915 visibility or in PIE. */
2916 if (eh->dyn_relocs != NULL)
2918 if (h->root.type == bfd_link_hash_undefweak)
2920 /* Undefined weak symbol is never bound locally in shared
2922 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2923 || resolved_to_zero)
2924 eh->dyn_relocs = NULL;
2925 else if (h->dynindx == -1
2926 && ! h->forced_local
2927 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2930 /* For PIE, discard space for pc-relative relocs against
2931 symbols which turn out to need copy relocs. */
2932 else if (bfd_link_executable (info)
2933 && (h->needs_copy || eh->needs_copy)
2937 struct elf_dyn_relocs **pp;
2939 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2941 if (p->pc_count != 0)
2949 else if (ELIMINATE_COPY_RELOCS)
2951 /* For the non-shared case, discard space for relocs against
2952 symbols which turn out to need copy relocs or are not
2953 dynamic. Keep dynamic relocations for run-time function
2954 pointer initialization. */
2956 if ((!h->non_got_ref
2957 || eh->func_pointer_refcount > 0
2958 || (h->root.type == bfd_link_hash_undefweak
2959 && !resolved_to_zero))
2962 || (htab->elf.dynamic_sections_created
2963 && (h->root.type == bfd_link_hash_undefweak
2964 || h->root.type == bfd_link_hash_undefined))))
2966 /* Make sure this symbol is output as a dynamic symbol.
2967 Undefined weak syms won't yet be marked as dynamic. */
2968 if (h->dynindx == -1
2969 && ! h->forced_local
2970 && ! resolved_to_zero
2971 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2974 /* If that succeeded, we know we'll be keeping all the
2976 if (h->dynindx != -1)
2980 eh->dyn_relocs = NULL;
2981 eh->func_pointer_refcount = 0;
2986 /* Finally, allocate space. */
2987 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2991 sreloc = elf_section_data (p->sec)->sreloc;
2993 BFD_ASSERT (sreloc != NULL);
2995 sreloc->size += p->count * bed->s->sizeof_rela;
3001 /* Allocate space in .plt, .got and associated reloc sections for
3002 local dynamic relocs. */
3005 elf_x86_64_allocate_local_dynrelocs (void **slot, void *inf)
3007 struct elf_link_hash_entry *h
3008 = (struct elf_link_hash_entry *) *slot;
3010 if (h->type != STT_GNU_IFUNC
3014 || h->root.type != bfd_link_hash_defined)
3017 return elf_x86_64_allocate_dynrelocs (h, inf);
3020 /* Find any dynamic relocs that apply to read-only sections. */
3023 elf_x86_64_readonly_dynrelocs (struct elf_link_hash_entry *h,
3026 struct elf_x86_64_link_hash_entry *eh;
3027 struct elf_dyn_relocs *p;
3029 /* Skip local IFUNC symbols. */
3030 if (h->forced_local && h->type == STT_GNU_IFUNC)
3033 eh = (struct elf_x86_64_link_hash_entry *) h;
3034 for (p = eh->dyn_relocs; p != NULL; p = p->next)
3036 asection *s = p->sec->output_section;
3038 if (s != NULL && (s->flags & SEC_READONLY) != 0)
3040 struct bfd_link_info *info = (struct bfd_link_info *) inf;
3042 info->flags |= DF_TEXTREL;
3044 if ((info->warn_shared_textrel && bfd_link_pic (info))
3045 || info->error_textrel)
3046 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
3047 p->sec->owner, h->root.root.string,
3050 /* Not an error, just cut short the traversal. */
3057 /* With the local symbol, foo, we convert
3058 mov foo@GOTPCREL(%rip), %reg
3062 call/jmp *foo@GOTPCREL(%rip)
3064 nop call foo/jmp foo nop
3065 When PIC is false, convert
3066 test %reg, foo@GOTPCREL(%rip)
3070 binop foo@GOTPCREL(%rip), %reg
3073 where binop is one of adc, add, and, cmp, or, sbb, sub, xor
3077 elf_x86_64_convert_load (bfd *abfd, asection *sec,
3078 struct bfd_link_info *link_info)
3080 Elf_Internal_Shdr *symtab_hdr;
3081 Elf_Internal_Rela *internal_relocs;
3082 Elf_Internal_Rela *irel, *irelend;
3084 struct elf_x86_64_link_hash_table *htab;
3085 bfd_boolean changed_contents;
3086 bfd_boolean changed_relocs;
3087 bfd_signed_vma *local_got_refcounts;
3088 bfd_vma maxpagesize;
3090 bfd_boolean require_reloc_pc32;
3092 /* Don't even try to convert non-ELF outputs. */
3093 if (!is_elf_hash_table (link_info->hash))
3096 /* Nothing to do if there is no need or no output. */
3097 if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
3098 || sec->need_convert_load == 0
3099 || bfd_is_abs_section (sec->output_section))
3102 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3104 /* Load the relocations for this section. */
3105 internal_relocs = (_bfd_elf_link_read_relocs
3106 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
3107 link_info->keep_memory));
3108 if (internal_relocs == NULL)
3111 htab = elf_x86_64_hash_table (link_info);
3112 changed_contents = FALSE;
3113 changed_relocs = FALSE;
3114 local_got_refcounts = elf_local_got_refcounts (abfd);
3115 maxpagesize = get_elf_backend_data (abfd)->maxpagesize;
3117 /* Get the section contents. */
3118 if (elf_section_data (sec)->this_hdr.contents != NULL)
3119 contents = elf_section_data (sec)->this_hdr.contents;
3122 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
3126 is_pic = bfd_link_pic (link_info);
3128 /* TRUE if we can convert only to R_X86_64_PC32. Enable it for
3131 = link_info->disable_target_specific_optimizations > 1;
3133 irelend = internal_relocs + sec->reloc_count;
3134 for (irel = internal_relocs; irel < irelend; irel++)
3136 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
3137 unsigned int r_symndx = htab->r_sym (irel->r_info);
3139 struct elf_link_hash_entry *h;
3143 bfd_signed_vma raddend;
3144 unsigned int opcode;
3147 bfd_boolean to_reloc_pc32;
3149 relocx = (r_type == R_X86_64_GOTPCRELX
3150 || r_type == R_X86_64_REX_GOTPCRELX);
3151 if (!relocx && r_type != R_X86_64_GOTPCREL)
3154 roff = irel->r_offset;
3155 if (roff < (r_type == R_X86_64_REX_GOTPCRELX ? 3 : 2))
3158 raddend = irel->r_addend;
3159 /* Addend for 32-bit PC-relative relocation must be -4. */
3163 opcode = bfd_get_8 (abfd, contents + roff - 2);
3165 /* Convert mov to lea since it has been done for a while. */
3168 /* Only convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX
3169 for call, jmp or one of adc, add, and, cmp, or, sbb, sub,
3170 test, xor instructions. */
3175 /* We convert only to R_X86_64_PC32:
3177 2. R_X86_64_GOTPCREL since we can't modify REX byte.
3178 3. require_reloc_pc32 is true.
3181 to_reloc_pc32 = (opcode == 0xff
3183 || require_reloc_pc32
3186 /* Get the symbol referred to by the reloc. */
3187 if (r_symndx < symtab_hdr->sh_info)
3189 Elf_Internal_Sym *isym;
3191 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
3194 symtype = ELF_ST_TYPE (isym->st_info);
3196 /* STT_GNU_IFUNC must keep GOTPCREL relocations and skip
3197 relocation against undefined symbols. */
3198 if (symtype == STT_GNU_IFUNC || isym->st_shndx == SHN_UNDEF)
3201 if (isym->st_shndx == SHN_ABS)
3202 tsec = bfd_abs_section_ptr;
3203 else if (isym->st_shndx == SHN_COMMON)
3204 tsec = bfd_com_section_ptr;
3205 else if (isym->st_shndx == SHN_X86_64_LCOMMON)
3206 tsec = &_bfd_elf_large_com_section;
3208 tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3211 toff = isym->st_value;
3215 indx = r_symndx - symtab_hdr->sh_info;
3216 h = elf_sym_hashes (abfd)[indx];
3217 BFD_ASSERT (h != NULL);
3219 while (h->root.type == bfd_link_hash_indirect
3220 || h->root.type == bfd_link_hash_warning)
3221 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3223 /* STT_GNU_IFUNC must keep GOTPCREL relocations. We also
3224 avoid optimizing GOTPCREL relocations againt _DYNAMIC
3225 since ld.so may use its link-time address. */
3226 if (h->type == STT_GNU_IFUNC)
3229 /* Undefined weak symbol is only bound locally in executable
3230 and its reference is resolved as 0 without relocation
3231 overflow. We can only perform this optimization for
3232 GOTPCRELX relocations since we need to modify REX byte.
3233 It is OK convert mov with R_X86_64_GOTPCREL to
3235 if ((relocx || opcode == 0x8b)
3236 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (link_info,
3237 elf_x86_64_hash_entry (h)))
3241 /* Skip for branch instructions since R_X86_64_PC32
3243 if (require_reloc_pc32)
3248 /* For non-branch instructions, we can convert to
3249 R_X86_64_32/R_X86_64_32S since we know if there
3251 to_reloc_pc32 = FALSE;
3254 /* Since we don't know the current PC when PIC is true,
3255 we can't convert to R_X86_64_PC32. */
3256 if (to_reloc_pc32 && is_pic)
3261 else if ((h->def_regular
3262 || h->root.type == bfd_link_hash_defined
3263 || h->root.type == bfd_link_hash_defweak)
3264 && h != htab->elf.hdynamic
3265 && SYMBOL_REFERENCES_LOCAL (link_info, h))
3267 /* bfd_link_hash_new or bfd_link_hash_undefined is
3268 set by an assignment in a linker script in
3269 bfd_elf_record_link_assignment. */
3271 && (h->root.type == bfd_link_hash_new
3272 || h->root.type == bfd_link_hash_undefined))
3274 /* Skip since R_X86_64_32/R_X86_64_32S may overflow. */
3275 if (require_reloc_pc32)
3279 tsec = h->root.u.def.section;
3280 toff = h->root.u.def.value;
3287 /* We can only estimate relocation overflow for R_X86_64_PC32. */
3291 if (tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
3293 /* At this stage in linking, no SEC_MERGE symbol has been
3294 adjusted, so all references to such symbols need to be
3295 passed through _bfd_merged_section_offset. (Later, in
3296 relocate_section, all SEC_MERGE symbols *except* for
3297 section symbols have been adjusted.)
3299 gas may reduce relocations against symbols in SEC_MERGE
3300 sections to a relocation against the section symbol when
3301 the original addend was zero. When the reloc is against
3302 a section symbol we should include the addend in the
3303 offset passed to _bfd_merged_section_offset, since the
3304 location of interest is the original symbol. On the
3305 other hand, an access to "sym+addend" where "sym" is not
3306 a section symbol should not include the addend; Such an
3307 access is presumed to be an offset from "sym"; The
3308 location of interest is just "sym". */
3309 if (symtype == STT_SECTION)
3312 toff = _bfd_merged_section_offset (abfd, &tsec,
3313 elf_section_data (tsec)->sec_info,
3316 if (symtype != STT_SECTION)
3322 /* Don't convert if R_X86_64_PC32 relocation overflows. */
3323 if (tsec->output_section == sec->output_section)
3325 if ((toff - roff + 0x80000000) > 0xffffffff)
3330 bfd_signed_vma distance;
3332 /* At this point, we don't know the load addresses of TSEC
3333 section nor SEC section. We estimate the distrance between
3334 SEC and TSEC. We store the estimated distances in the
3335 compressed_size field of the output section, which is only
3336 used to decompress the compressed input section. */
3337 if (sec->output_section->compressed_size == 0)
3340 bfd_size_type size = 0;
3341 for (asect = link_info->output_bfd->sections;
3343 asect = asect->next)
3346 for (i = asect->map_head.s;
3350 size = align_power (size, i->alignment_power);
3353 asect->compressed_size = size;
3357 /* Don't convert GOTPCREL relocations if TSEC isn't placed
3359 distance = (tsec->output_section->compressed_size
3360 - sec->output_section->compressed_size);
3364 /* Take PT_GNU_RELRO segment into account by adding
3366 if ((toff + distance + maxpagesize - roff + 0x80000000)
3374 /* We have "call/jmp *foo@GOTPCREL(%rip)". */
3379 /* Convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX to
3381 modrm = bfd_get_8 (abfd, contents + roff - 1);
3384 /* Convert to "jmp foo nop". */
3387 nop_offset = irel->r_offset + 3;
3388 disp = bfd_get_32 (abfd, contents + irel->r_offset);
3389 irel->r_offset -= 1;
3390 bfd_put_32 (abfd, disp, contents + irel->r_offset);
3394 /* Convert to "nop call foo". ADDR_PREFIX_OPCODE
3397 nop = link_info->call_nop_byte;
3398 if (link_info->call_nop_as_suffix)
3400 nop_offset = irel->r_offset + 3;
3401 disp = bfd_get_32 (abfd, contents + irel->r_offset);
3402 irel->r_offset -= 1;
3403 bfd_put_32 (abfd, disp, contents + irel->r_offset);
3406 nop_offset = irel->r_offset - 2;
3408 bfd_put_8 (abfd, nop, contents + nop_offset);
3409 bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
3410 r_type = R_X86_64_PC32;
3415 unsigned int rex_mask = REX_R;
3417 if (r_type == R_X86_64_REX_GOTPCRELX)
3418 rex = bfd_get_8 (abfd, contents + roff - 3);
3426 /* Convert "mov foo@GOTPCREL(%rip), %reg" to
3427 "lea foo(%rip), %reg". */
3429 r_type = R_X86_64_PC32;
3433 /* Convert "mov foo@GOTPCREL(%rip), %reg" to
3434 "mov $foo, %reg". */
3436 modrm = bfd_get_8 (abfd, contents + roff - 1);
3437 modrm = 0xc0 | (modrm & 0x38) >> 3;
3438 if ((rex & REX_W) != 0
3439 && ABI_64_P (link_info->output_bfd))
3441 /* Keep the REX_W bit in REX byte for LP64. */
3442 r_type = R_X86_64_32S;
3443 goto rewrite_modrm_rex;
3447 /* If the REX_W bit in REX byte isn't needed,
3448 use R_X86_64_32 and clear the W bit to avoid
3449 sign-extend imm32 to imm64. */
3450 r_type = R_X86_64_32;
3451 /* Clear the W bit in REX byte. */
3453 goto rewrite_modrm_rex;
3459 /* R_X86_64_PC32 isn't supported. */
3463 modrm = bfd_get_8 (abfd, contents + roff - 1);
3466 /* Convert "test %reg, foo@GOTPCREL(%rip)" to
3467 "test $foo, %reg". */
3468 modrm = 0xc0 | (modrm & 0x38) >> 3;
3473 /* Convert "binop foo@GOTPCREL(%rip), %reg" to
3474 "binop $foo, %reg". */
3475 modrm = 0xc0 | (modrm & 0x38) >> 3 | (opcode & 0x3c);
3479 /* Use R_X86_64_32 with 32-bit operand to avoid relocation
3480 overflow when sign-extending imm32 to imm64. */
3481 r_type = (rex & REX_W) != 0 ? R_X86_64_32S : R_X86_64_32;
3484 bfd_put_8 (abfd, modrm, contents + roff - 1);
3488 /* Move the R bit to the B bit in REX byte. */
3489 rex = (rex & ~rex_mask) | (rex & REX_R) >> 2;
3490 bfd_put_8 (abfd, rex, contents + roff - 3);
3493 /* No addend for R_X86_64_32/R_X86_64_32S relocations. */
3497 bfd_put_8 (abfd, opcode, contents + roff - 2);
3500 irel->r_info = htab->r_info (r_symndx, r_type);
3501 changed_contents = TRUE;
3502 changed_relocs = TRUE;
3506 if (h->got.refcount > 0)
3507 h->got.refcount -= 1;
3511 if (local_got_refcounts != NULL
3512 && local_got_refcounts[r_symndx] > 0)
3513 local_got_refcounts[r_symndx] -= 1;
3517 if (contents != NULL
3518 && elf_section_data (sec)->this_hdr.contents != contents)
3520 if (!changed_contents && !link_info->keep_memory)
3524 /* Cache the section contents for elf_link_input_bfd. */
3525 elf_section_data (sec)->this_hdr.contents = contents;
3529 if (elf_section_data (sec)->relocs != internal_relocs)
3531 if (!changed_relocs)
3532 free (internal_relocs);
3534 elf_section_data (sec)->relocs = internal_relocs;
3540 if (contents != NULL
3541 && elf_section_data (sec)->this_hdr.contents != contents)
3543 if (internal_relocs != NULL
3544 && elf_section_data (sec)->relocs != internal_relocs)
3545 free (internal_relocs);
3549 /* Set the sizes of the dynamic sections. */
3552 elf_x86_64_size_dynamic_sections (bfd *output_bfd,
3553 struct bfd_link_info *info)
3555 struct elf_x86_64_link_hash_table *htab;
3560 const struct elf_backend_data *bed;
3562 htab = elf_x86_64_hash_table (info);
3565 bed = get_elf_backend_data (output_bfd);
3567 dynobj = htab->elf.dynobj;
3571 if (htab->elf.dynamic_sections_created)
3573 /* Set the contents of the .interp section to the interpreter. */
3574 if (bfd_link_executable (info) && !info->nointerp)
3576 s = bfd_get_linker_section (dynobj, ".interp");
3579 s->size = htab->dynamic_interpreter_size;
3580 s->contents = (unsigned char *) htab->dynamic_interpreter;
3585 /* Set up .got offsets for local syms, and space for local dynamic
3587 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3589 bfd_signed_vma *local_got;
3590 bfd_signed_vma *end_local_got;
3591 char *local_tls_type;
3592 bfd_vma *local_tlsdesc_gotent;
3593 bfd_size_type locsymcount;
3594 Elf_Internal_Shdr *symtab_hdr;
3597 if (! is_x86_64_elf (ibfd))
3600 for (s = ibfd->sections; s != NULL; s = s->next)
3602 struct elf_dyn_relocs *p;
3604 if (!elf_x86_64_convert_load (ibfd, s, info))
3607 for (p = (struct elf_dyn_relocs *)
3608 (elf_section_data (s)->local_dynrel);
3612 if (!bfd_is_abs_section (p->sec)
3613 && bfd_is_abs_section (p->sec->output_section))
3615 /* Input section has been discarded, either because
3616 it is a copy of a linkonce section or due to
3617 linker script /DISCARD/, so we'll be discarding
3620 else if (p->count != 0)
3622 srel = elf_section_data (p->sec)->sreloc;
3623 srel->size += p->count * bed->s->sizeof_rela;
3624 if ((p->sec->output_section->flags & SEC_READONLY) != 0
3625 && (info->flags & DF_TEXTREL) == 0)
3627 info->flags |= DF_TEXTREL;
3628 if ((info->warn_shared_textrel && bfd_link_pic (info))
3629 || info->error_textrel)
3630 info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"),
3631 p->sec->owner, p->sec);
3637 local_got = elf_local_got_refcounts (ibfd);
3641 symtab_hdr = &elf_symtab_hdr (ibfd);
3642 locsymcount = symtab_hdr->sh_info;
3643 end_local_got = local_got + locsymcount;
3644 local_tls_type = elf_x86_64_local_got_tls_type (ibfd);
3645 local_tlsdesc_gotent = elf_x86_64_local_tlsdesc_gotent (ibfd);
3647 srel = htab->elf.srelgot;
3648 for (; local_got < end_local_got;
3649 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
3651 *local_tlsdesc_gotent = (bfd_vma) -1;
3654 if (GOT_TLS_GDESC_P (*local_tls_type))
3656 *local_tlsdesc_gotent = htab->elf.sgotplt->size
3657 - elf_x86_64_compute_jump_table_size (htab);
3658 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
3659 *local_got = (bfd_vma) -2;
3661 if (! GOT_TLS_GDESC_P (*local_tls_type)
3662 || GOT_TLS_GD_P (*local_tls_type))
3664 *local_got = s->size;
3665 s->size += GOT_ENTRY_SIZE;
3666 if (GOT_TLS_GD_P (*local_tls_type))
3667 s->size += GOT_ENTRY_SIZE;
3669 if (bfd_link_pic (info)
3670 || GOT_TLS_GD_ANY_P (*local_tls_type)
3671 || *local_tls_type == GOT_TLS_IE)
3673 if (GOT_TLS_GDESC_P (*local_tls_type))
3675 htab->elf.srelplt->size
3676 += bed->s->sizeof_rela;
3677 htab->tlsdesc_plt = (bfd_vma) -1;
3679 if (! GOT_TLS_GDESC_P (*local_tls_type)
3680 || GOT_TLS_GD_P (*local_tls_type))
3681 srel->size += bed->s->sizeof_rela;
3685 *local_got = (bfd_vma) -1;
3689 if (htab->tls_ld_got.refcount > 0)
3691 /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
3693 htab->tls_ld_got.offset = htab->elf.sgot->size;
3694 htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE;
3695 htab->elf.srelgot->size += bed->s->sizeof_rela;
3698 htab->tls_ld_got.offset = -1;
3700 /* Allocate global sym .plt and .got entries, and space for global
3701 sym dynamic relocs. */
3702 elf_link_hash_traverse (&htab->elf, elf_x86_64_allocate_dynrelocs,
3705 /* Allocate .plt and .got entries, and space for local symbols. */
3706 htab_traverse (htab->loc_hash_table,
3707 elf_x86_64_allocate_local_dynrelocs,
3710 /* For every jump slot reserved in the sgotplt, reloc_count is
3711 incremented. However, when we reserve space for TLS descriptors,
3712 it's not incremented, so in order to compute the space reserved
3713 for them, it suffices to multiply the reloc count by the jump
3716 PR ld/13302: We start next_irelative_index at the end of .rela.plt
3717 so that R_X86_64_IRELATIVE entries come last. */
3718 if (htab->elf.srelplt)
3720 htab->sgotplt_jump_table_size
3721 = elf_x86_64_compute_jump_table_size (htab);
3722 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
3724 else if (htab->elf.irelplt)
3725 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
3727 if (htab->tlsdesc_plt)
3729 /* If we're not using lazy TLS relocations, don't generate the
3730 PLT and GOT entries they require. */
3731 if ((info->flags & DF_BIND_NOW))
3732 htab->tlsdesc_plt = 0;
3735 htab->tlsdesc_got = htab->elf.sgot->size;
3736 htab->elf.sgot->size += GOT_ENTRY_SIZE;
3737 /* Reserve room for the initial entry.
3738 FIXME: we could probably do away with it in this case. */
3739 if (htab->elf.splt->size == 0)
3740 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
3741 htab->tlsdesc_plt = htab->elf.splt->size;
3742 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
3746 if (htab->elf.sgotplt)
3748 /* Don't allocate .got.plt section if there are no GOT nor PLT
3749 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
3750 if ((htab->elf.hgot == NULL
3751 || !htab->elf.hgot->ref_regular_nonweak)
3752 && (htab->elf.sgotplt->size
3753 == get_elf_backend_data (output_bfd)->got_header_size)
3754 && (htab->elf.splt == NULL
3755 || htab->elf.splt->size == 0)
3756 && (htab->elf.sgot == NULL
3757 || htab->elf.sgot->size == 0)
3758 && (htab->elf.iplt == NULL
3759 || htab->elf.iplt->size == 0)
3760 && (htab->elf.igotplt == NULL
3761 || htab->elf.igotplt->size == 0))
3762 htab->elf.sgotplt->size = 0;
3765 if (htab->plt_eh_frame != NULL
3766 && htab->elf.splt != NULL
3767 && htab->elf.splt->size != 0
3768 && !bfd_is_abs_section (htab->elf.splt->output_section)
3769 && _bfd_elf_eh_frame_present (info))
3771 const struct elf_x86_64_backend_data *arch_data
3772 = get_elf_x86_64_arch_data (bed);
3773 htab->plt_eh_frame->size = arch_data->eh_frame_plt_size;
3776 /* We now have determined the sizes of the various dynamic sections.
3777 Allocate memory for them. */
3779 for (s = dynobj->sections; s != NULL; s = s->next)
3781 if ((s->flags & SEC_LINKER_CREATED) == 0)
3784 if (s == htab->elf.splt
3785 || s == htab->elf.sgot
3786 || s == htab->elf.sgotplt
3787 || s == htab->elf.iplt
3788 || s == htab->elf.igotplt
3789 || s == htab->plt_bnd
3790 || s == htab->plt_got
3791 || s == htab->plt_eh_frame
3792 || s == htab->sdynbss)
3794 /* Strip this section if we don't need it; see the
3797 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
3799 if (s->size != 0 && s != htab->elf.srelplt)
3802 /* We use the reloc_count field as a counter if we need
3803 to copy relocs into the output file. */
3804 if (s != htab->elf.srelplt)
3809 /* It's not one of our sections, so don't allocate space. */
3815 /* If we don't need this section, strip it from the
3816 output file. This is mostly to handle .rela.bss and
3817 .rela.plt. We must create both sections in
3818 create_dynamic_sections, because they must be created
3819 before the linker maps input sections to output
3820 sections. The linker does that before
3821 adjust_dynamic_symbol is called, and it is that
3822 function which decides whether anything needs to go
3823 into these sections. */
3825 s->flags |= SEC_EXCLUDE;
3829 if ((s->flags & SEC_HAS_CONTENTS) == 0)
3832 /* Allocate memory for the section contents. We use bfd_zalloc
3833 here in case unused entries are not reclaimed before the
3834 section's contents are written out. This should not happen,
3835 but this way if it does, we get a R_X86_64_NONE reloc instead
3837 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
3838 if (s->contents == NULL)
3842 if (htab->plt_eh_frame != NULL
3843 && htab->plt_eh_frame->contents != NULL)
3845 const struct elf_x86_64_backend_data *arch_data
3846 = get_elf_x86_64_arch_data (bed);
3848 memcpy (htab->plt_eh_frame->contents,
3849 arch_data->eh_frame_plt, htab->plt_eh_frame->size);
3850 bfd_put_32 (dynobj, htab->elf.splt->size,
3851 htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
3854 if (htab->elf.dynamic_sections_created)
3856 /* Add some entries to the .dynamic section. We fill in the
3857 values later, in elf_x86_64_finish_dynamic_sections, but we
3858 must add the entries now so that we get the correct size for
3859 the .dynamic section. The DT_DEBUG entry is filled in by the
3860 dynamic linker and used by the debugger. */
3861 #define add_dynamic_entry(TAG, VAL) \
3862 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3864 if (bfd_link_executable (info))
3866 if (!add_dynamic_entry (DT_DEBUG, 0))
3870 if (htab->elf.splt->size != 0)
3872 /* DT_PLTGOT is used by prelink even if there is no PLT
3874 if (!add_dynamic_entry (DT_PLTGOT, 0))
3877 if (htab->elf.srelplt->size != 0)
3879 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
3880 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3881 || !add_dynamic_entry (DT_JMPREL, 0))
3885 if (htab->tlsdesc_plt
3886 && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
3887 || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
3893 if (!add_dynamic_entry (DT_RELA, 0)
3894 || !add_dynamic_entry (DT_RELASZ, 0)
3895 || !add_dynamic_entry (DT_RELAENT, bed->s->sizeof_rela))
3898 /* If any dynamic relocs apply to a read-only section,
3899 then we need a DT_TEXTREL entry. */
3900 if ((info->flags & DF_TEXTREL) == 0)
3901 elf_link_hash_traverse (&htab->elf,
3902 elf_x86_64_readonly_dynrelocs,
3905 if ((info->flags & DF_TEXTREL) != 0)
3907 if (htab->readonly_dynrelocs_against_ifunc)
3909 info->callbacks->einfo
3910 (_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n"));
3911 bfd_set_error (bfd_error_bad_value);
3915 if (!add_dynamic_entry (DT_TEXTREL, 0))
3920 #undef add_dynamic_entry
3926 elf_x86_64_always_size_sections (bfd *output_bfd,
3927 struct bfd_link_info *info)
3929 asection *tls_sec = elf_hash_table (info)->tls_sec;
3933 struct elf_link_hash_entry *tlsbase;
3935 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3936 "_TLS_MODULE_BASE_",
3937 FALSE, FALSE, FALSE);
3939 if (tlsbase && tlsbase->type == STT_TLS)
3941 struct elf_x86_64_link_hash_table *htab;
3942 struct bfd_link_hash_entry *bh = NULL;
3943 const struct elf_backend_data *bed
3944 = get_elf_backend_data (output_bfd);
3946 htab = elf_x86_64_hash_table (info);
3950 if (!(_bfd_generic_link_add_one_symbol
3951 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3952 tls_sec, 0, NULL, FALSE,
3953 bed->collect, &bh)))
3956 htab->tls_module_base = bh;
3958 tlsbase = (struct elf_link_hash_entry *)bh;
3959 tlsbase->def_regular = 1;
3960 tlsbase->other = STV_HIDDEN;
3961 tlsbase->root.linker_def = 1;
3962 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3969 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3970 executables. Rather than setting it to the beginning of the TLS
3971 section, we have to set it to the end. This function may be called
3972 multiple times, it is idempotent. */
3975 elf_x86_64_set_tls_module_base (struct bfd_link_info *info)
3977 struct elf_x86_64_link_hash_table *htab;
3978 struct bfd_link_hash_entry *base;
3980 if (!bfd_link_executable (info))
3983 htab = elf_x86_64_hash_table (info);
3987 base = htab->tls_module_base;
3991 base->u.def.value = htab->elf.tls_size;
3994 /* Return the base VMA address which should be subtracted from real addresses
3995 when resolving @dtpoff relocation.
3996 This is PT_TLS segment p_vaddr. */
3999 elf_x86_64_dtpoff_base (struct bfd_link_info *info)
4001 /* If tls_sec is NULL, we should have signalled an error already. */
4002 if (elf_hash_table (info)->tls_sec == NULL)
4004 return elf_hash_table (info)->tls_sec->vma;
4007 /* Return the relocation value for @tpoff relocation
4008 if STT_TLS virtual address is ADDRESS. */
4011 elf_x86_64_tpoff (struct bfd_link_info *info, bfd_vma address)
4013 struct elf_link_hash_table *htab = elf_hash_table (info);
4014 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
4015 bfd_vma static_tls_size;
4017 /* If tls_segment is NULL, we should have signalled an error already. */
4018 if (htab->tls_sec == NULL)
4021 /* Consider special static TLS alignment requirements. */
4022 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
4023 return address - static_tls_size - htab->tls_sec->vma;
4026 /* Is the instruction before OFFSET in CONTENTS a 32bit relative
4030 is_32bit_relative_branch (bfd_byte *contents, bfd_vma offset)
4032 /* Opcode Instruction
4035 0x0f 0x8x conditional jump */
4037 && (contents [offset - 1] == 0xe8
4038 || contents [offset - 1] == 0xe9))
4040 && contents [offset - 2] == 0x0f
4041 && (contents [offset - 1] & 0xf0) == 0x80));
4045 elf_x86_64_need_pic (bfd *input_bfd, struct elf_link_hash_entry *h,
4046 reloc_howto_type *howto)
4050 const char *pic = "";
4052 switch (ELF_ST_VISIBILITY (h->other))
4055 v = _("hidden symbol");
4058 v = _("internal symbol");
4061 v = _("protected symbol");
4065 pic = _("; recompile with -fPIC");
4070 fmt = _("%B: relocation %s against %s `%s' can not be used when making a shared object%s");
4072 fmt = _("%B: relocation %s against undefined %s `%s' can not be used when making a shared object%s");
4074 (*_bfd_error_handler) (fmt, input_bfd, howto->name,
4075 v, h->root.root.string, pic);
4076 bfd_set_error (bfd_error_bad_value);
4080 /* Relocate an x86_64 ELF section. */
4083 elf_x86_64_relocate_section (bfd *output_bfd,
4084 struct bfd_link_info *info,
4086 asection *input_section,
4088 Elf_Internal_Rela *relocs,
4089 Elf_Internal_Sym *local_syms,
4090 asection **local_sections)
4092 struct elf_x86_64_link_hash_table *htab;
4093 Elf_Internal_Shdr *symtab_hdr;
4094 struct elf_link_hash_entry **sym_hashes;
4095 bfd_vma *local_got_offsets;
4096 bfd_vma *local_tlsdesc_gotents;
4097 Elf_Internal_Rela *rel;
4098 Elf_Internal_Rela *wrel;
4099 Elf_Internal_Rela *relend;
4100 const unsigned int plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
4102 BFD_ASSERT (is_x86_64_elf (input_bfd));
4104 htab = elf_x86_64_hash_table (info);
4107 symtab_hdr = &elf_symtab_hdr (input_bfd);
4108 sym_hashes = elf_sym_hashes (input_bfd);
4109 local_got_offsets = elf_local_got_offsets (input_bfd);
4110 local_tlsdesc_gotents = elf_x86_64_local_tlsdesc_gotent (input_bfd);
4112 elf_x86_64_set_tls_module_base (info);
4114 rel = wrel = relocs;
4115 relend = relocs + input_section->reloc_count;
4116 for (; rel < relend; wrel++, rel++)
4118 unsigned int r_type;
4119 reloc_howto_type *howto;
4120 unsigned long r_symndx;
4121 struct elf_link_hash_entry *h;
4122 struct elf_x86_64_link_hash_entry *eh;
4123 Elf_Internal_Sym *sym;
4125 bfd_vma off, offplt, plt_offset;
4127 bfd_boolean unresolved_reloc;
4128 bfd_reloc_status_type r;
4130 asection *base_got, *resolved_plt;
4132 bfd_boolean resolved_to_zero;
4134 r_type = ELF32_R_TYPE (rel->r_info);
4135 if (r_type == (int) R_X86_64_GNU_VTINHERIT
4136 || r_type == (int) R_X86_64_GNU_VTENTRY)
4143 if (r_type >= (int) R_X86_64_standard)
4145 (*_bfd_error_handler)
4146 (_("%B: unrecognized relocation (0x%x) in section `%A'"),
4147 input_bfd, input_section, r_type);
4148 bfd_set_error (bfd_error_bad_value);
4152 if (r_type != (int) R_X86_64_32
4153 || ABI_64_P (output_bfd))
4154 howto = x86_64_elf_howto_table + r_type;
4156 howto = (x86_64_elf_howto_table
4157 + ARRAY_SIZE (x86_64_elf_howto_table) - 1);
4158 r_symndx = htab->r_sym (rel->r_info);
4162 unresolved_reloc = FALSE;
4163 if (r_symndx < symtab_hdr->sh_info)
4165 sym = local_syms + r_symndx;
4166 sec = local_sections[r_symndx];
4168 relocation = _bfd_elf_rela_local_sym (output_bfd, sym,
4170 st_size = sym->st_size;
4172 /* Relocate against local STT_GNU_IFUNC symbol. */
4173 if (!bfd_link_relocatable (info)
4174 && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
4176 h = elf_x86_64_get_local_sym_hash (htab, input_bfd,
4181 /* Set STT_GNU_IFUNC symbol value. */
4182 h->root.u.def.value = sym->st_value;
4183 h->root.u.def.section = sec;
4188 bfd_boolean warned ATTRIBUTE_UNUSED;
4189 bfd_boolean ignored ATTRIBUTE_UNUSED;
4191 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4192 r_symndx, symtab_hdr, sym_hashes,
4194 unresolved_reloc, warned, ignored);
4198 if (sec != NULL && discarded_section (sec))
4200 _bfd_clear_contents (howto, input_bfd, input_section,
4201 contents + rel->r_offset);
4202 wrel->r_offset = rel->r_offset;
4206 /* For ld -r, remove relocations in debug sections against
4207 sections defined in discarded sections. Not done for
4208 eh_frame editing code expects to be present. */
4209 if (bfd_link_relocatable (info)
4210 && (input_section->flags & SEC_DEBUGGING))
4216 if (bfd_link_relocatable (info))
4223 if (rel->r_addend == 0 && !ABI_64_P (output_bfd))
4225 if (r_type == R_X86_64_64)
4227 /* For x32, treat R_X86_64_64 like R_X86_64_32 and
4228 zero-extend it to 64bit if addend is zero. */
4229 r_type = R_X86_64_32;
4230 memset (contents + rel->r_offset + 4, 0, 4);
4232 else if (r_type == R_X86_64_SIZE64)
4234 /* For x32, treat R_X86_64_SIZE64 like R_X86_64_SIZE32 and
4235 zero-extend it to 64bit if addend is zero. */
4236 r_type = R_X86_64_SIZE32;
4237 memset (contents + rel->r_offset + 4, 0, 4);
4241 eh = (struct elf_x86_64_link_hash_entry *) h;
4243 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
4244 it here if it is defined in a non-shared object. */
4246 && h->type == STT_GNU_IFUNC
4252 if ((input_section->flags & SEC_ALLOC) == 0)
4254 /* Dynamic relocs are not propagated for SEC_DEBUGGING
4255 sections because such sections are not SEC_ALLOC and
4256 thus ld.so will not process them. */
4257 if ((input_section->flags & SEC_DEBUGGING) != 0)
4261 else if (h->plt.offset == (bfd_vma) -1)
4264 /* STT_GNU_IFUNC symbol must go through PLT. */
4265 if (htab->elf.splt != NULL)
4267 if (htab->plt_bnd != NULL)
4269 resolved_plt = htab->plt_bnd;
4270 plt_offset = eh->plt_bnd.offset;
4274 resolved_plt = htab->elf.splt;
4275 plt_offset = h->plt.offset;
4280 resolved_plt = htab->elf.iplt;
4281 plt_offset = h->plt.offset;
4284 relocation = (resolved_plt->output_section->vma
4285 + resolved_plt->output_offset + plt_offset);
4290 if (h->root.root.string)
4291 name = h->root.root.string;
4293 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
4295 (*_bfd_error_handler)
4296 (_("%B: relocation %s against STT_GNU_IFUNC "
4297 "symbol `%s' isn't handled by %s"), input_bfd,
4298 howto->name, name, __FUNCTION__);
4299 bfd_set_error (bfd_error_bad_value);
4303 if (bfd_link_pic (info))
4308 if (ABI_64_P (output_bfd))
4312 if (rel->r_addend != 0)
4314 if (h->root.root.string)
4315 name = h->root.root.string;
4317 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
4319 (*_bfd_error_handler)
4320 (_("%B: relocation %s against STT_GNU_IFUNC "
4321 "symbol `%s' has non-zero addend: %d"),
4322 input_bfd, howto->name, name, rel->r_addend);
4323 bfd_set_error (bfd_error_bad_value);
4327 /* Generate dynamic relcoation only when there is a
4328 non-GOT reference in a shared object. */
4329 if (bfd_link_pic (info) && h->non_got_ref)
4331 Elf_Internal_Rela outrel;
4334 /* Need a dynamic relocation to get the real function
4336 outrel.r_offset = _bfd_elf_section_offset (output_bfd,
4340 if (outrel.r_offset == (bfd_vma) -1
4341 || outrel.r_offset == (bfd_vma) -2)
4344 outrel.r_offset += (input_section->output_section->vma
4345 + input_section->output_offset);
4347 if (h->dynindx == -1
4349 || bfd_link_executable (info))
4351 /* This symbol is resolved locally. */
4352 outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
4353 outrel.r_addend = (h->root.u.def.value
4354 + h->root.u.def.section->output_section->vma
4355 + h->root.u.def.section->output_offset);
4359 outrel.r_info = htab->r_info (h->dynindx, r_type);
4360 outrel.r_addend = 0;
4363 sreloc = htab->elf.irelifunc;
4364 elf_append_rela (output_bfd, sreloc, &outrel);
4366 /* If this reloc is against an external symbol, we
4367 do not want to fiddle with the addend. Otherwise,
4368 we need to include the symbol value so that it
4369 becomes an addend for the dynamic reloc. For an
4370 internal symbol, we have updated addend. */
4375 case R_X86_64_PC32_BND:
4377 case R_X86_64_PLT32:
4378 case R_X86_64_PLT32_BND:
4381 case R_X86_64_GOTPCREL:
4382 case R_X86_64_GOTPCRELX:
4383 case R_X86_64_REX_GOTPCRELX:
4384 case R_X86_64_GOTPCREL64:
4385 base_got = htab->elf.sgot;
4386 off = h->got.offset;
4388 if (base_got == NULL)
4391 if (off == (bfd_vma) -1)
4393 /* We can't use h->got.offset here to save state, or
4394 even just remember the offset, as finish_dynamic_symbol
4395 would use that as offset into .got. */
4397 if (htab->elf.splt != NULL)
4399 plt_index = h->plt.offset / plt_entry_size - 1;
4400 off = (plt_index + 3) * GOT_ENTRY_SIZE;
4401 base_got = htab->elf.sgotplt;
4405 plt_index = h->plt.offset / plt_entry_size;
4406 off = plt_index * GOT_ENTRY_SIZE;
4407 base_got = htab->elf.igotplt;
4410 if (h->dynindx == -1
4414 /* This references the local defitionion. We must
4415 initialize this entry in the global offset table.
4416 Since the offset must always be a multiple of 8,
4417 we use the least significant bit to record
4418 whether we have initialized it already.
4420 When doing a dynamic link, we create a .rela.got
4421 relocation entry to initialize the value. This
4422 is done in the finish_dynamic_symbol routine. */
4427 bfd_put_64 (output_bfd, relocation,
4428 base_got->contents + off);
4429 /* Note that this is harmless for the GOTPLT64
4430 case, as -1 | 1 still is -1. */
4436 relocation = (base_got->output_section->vma
4437 + base_got->output_offset + off);
4443 resolved_to_zero = (eh != NULL
4444 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
4446 /* When generating a shared object, the relocations handled here are
4447 copied into the output file to be resolved at run time. */
4450 case R_X86_64_GOT32:
4451 case R_X86_64_GOT64:
4452 /* Relocation is to the entry for this symbol in the global
4454 case R_X86_64_GOTPCREL:
4455 case R_X86_64_GOTPCRELX:
4456 case R_X86_64_REX_GOTPCRELX:
4457 case R_X86_64_GOTPCREL64:
4458 /* Use global offset table entry as symbol value. */
4459 case R_X86_64_GOTPLT64:
4460 /* This is obsolete and treated the the same as GOT64. */
4461 base_got = htab->elf.sgot;
4463 if (htab->elf.sgot == NULL)
4470 off = h->got.offset;
4472 && h->plt.offset != (bfd_vma)-1
4473 && off == (bfd_vma)-1)
4475 /* We can't use h->got.offset here to save
4476 state, or even just remember the offset, as
4477 finish_dynamic_symbol would use that as offset into
4479 bfd_vma plt_index = h->plt.offset / plt_entry_size - 1;
4480 off = (plt_index + 3) * GOT_ENTRY_SIZE;
4481 base_got = htab->elf.sgotplt;
4484 dyn = htab->elf.dynamic_sections_created;
4486 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
4487 || (bfd_link_pic (info)
4488 && SYMBOL_REFERENCES_LOCAL (info, h))
4489 || (ELF_ST_VISIBILITY (h->other)
4490 && h->root.type == bfd_link_hash_undefweak))
4492 /* This is actually a static link, or it is a -Bsymbolic
4493 link and the symbol is defined locally, or the symbol
4494 was forced to be local because of a version file. We
4495 must initialize this entry in the global offset table.
4496 Since the offset must always be a multiple of 8, we
4497 use the least significant bit to record whether we
4498 have initialized it already.
4500 When doing a dynamic link, we create a .rela.got
4501 relocation entry to initialize the value. This is
4502 done in the finish_dynamic_symbol routine. */
4507 bfd_put_64 (output_bfd, relocation,
4508 base_got->contents + off);
4509 /* Note that this is harmless for the GOTPLT64 case,
4510 as -1 | 1 still is -1. */
4515 unresolved_reloc = FALSE;
4519 if (local_got_offsets == NULL)
4522 off = local_got_offsets[r_symndx];
4524 /* The offset must always be a multiple of 8. We use
4525 the least significant bit to record whether we have
4526 already generated the necessary reloc. */
4531 bfd_put_64 (output_bfd, relocation,
4532 base_got->contents + off);
4534 if (bfd_link_pic (info))
4537 Elf_Internal_Rela outrel;
4539 /* We need to generate a R_X86_64_RELATIVE reloc
4540 for the dynamic linker. */
4541 s = htab->elf.srelgot;
4545 outrel.r_offset = (base_got->output_section->vma
4546 + base_got->output_offset
4548 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4549 outrel.r_addend = relocation;
4550 elf_append_rela (output_bfd, s, &outrel);
4553 local_got_offsets[r_symndx] |= 1;
4557 if (off >= (bfd_vma) -2)
4560 relocation = base_got->output_section->vma
4561 + base_got->output_offset + off;
4562 if (r_type != R_X86_64_GOTPCREL
4563 && r_type != R_X86_64_GOTPCRELX
4564 && r_type != R_X86_64_REX_GOTPCRELX
4565 && r_type != R_X86_64_GOTPCREL64)
4566 relocation -= htab->elf.sgotplt->output_section->vma
4567 - htab->elf.sgotplt->output_offset;
4571 case R_X86_64_GOTOFF64:
4572 /* Relocation is relative to the start of the global offset
4575 /* Check to make sure it isn't a protected function or data
4576 symbol for shared library since it may not be local when
4577 used as function address or with copy relocation. We also
4578 need to make sure that a symbol is referenced locally. */
4579 if (bfd_link_pic (info) && h)
4581 if (!h->def_regular)
4585 switch (ELF_ST_VISIBILITY (h->other))
4588 v = _("hidden symbol");
4591 v = _("internal symbol");
4594 v = _("protected symbol");
4601 (*_bfd_error_handler)
4602 (_("%B: relocation R_X86_64_GOTOFF64 against undefined %s `%s' can not be used when making a shared object"),
4603 input_bfd, v, h->root.root.string);
4604 bfd_set_error (bfd_error_bad_value);
4607 else if (!bfd_link_executable (info)
4608 && !SYMBOL_REFERENCES_LOCAL (info, h)
4609 && (h->type == STT_FUNC
4610 || h->type == STT_OBJECT)
4611 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
4613 (*_bfd_error_handler)
4614 (_("%B: relocation R_X86_64_GOTOFF64 against protected %s `%s' can not be used when making a shared object"),
4616 h->type == STT_FUNC ? "function" : "data",
4617 h->root.root.string);
4618 bfd_set_error (bfd_error_bad_value);
4623 /* Note that sgot is not involved in this
4624 calculation. We always want the start of .got.plt. If we
4625 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
4626 permitted by the ABI, we might have to change this
4628 relocation -= htab->elf.sgotplt->output_section->vma
4629 + htab->elf.sgotplt->output_offset;
4632 case R_X86_64_GOTPC32:
4633 case R_X86_64_GOTPC64:
4634 /* Use global offset table as symbol value. */
4635 relocation = htab->elf.sgotplt->output_section->vma
4636 + htab->elf.sgotplt->output_offset;
4637 unresolved_reloc = FALSE;
4640 case R_X86_64_PLTOFF64:
4641 /* Relocation is PLT entry relative to GOT. For local
4642 symbols it's the symbol itself relative to GOT. */
4644 /* See PLT32 handling. */
4645 && h->plt.offset != (bfd_vma) -1
4646 && htab->elf.splt != NULL)
4648 if (htab->plt_bnd != NULL)
4650 resolved_plt = htab->plt_bnd;
4651 plt_offset = eh->plt_bnd.offset;
4655 resolved_plt = htab->elf.splt;
4656 plt_offset = h->plt.offset;
4659 relocation = (resolved_plt->output_section->vma
4660 + resolved_plt->output_offset
4662 unresolved_reloc = FALSE;
4665 relocation -= htab->elf.sgotplt->output_section->vma
4666 + htab->elf.sgotplt->output_offset;
4669 case R_X86_64_PLT32:
4670 case R_X86_64_PLT32_BND:
4671 /* Relocation is to the entry for this symbol in the
4672 procedure linkage table. */
4674 /* Resolve a PLT32 reloc against a local symbol directly,
4675 without using the procedure linkage table. */
4679 if ((h->plt.offset == (bfd_vma) -1
4680 && eh->plt_got.offset == (bfd_vma) -1)
4681 || htab->elf.splt == NULL)
4683 /* We didn't make a PLT entry for this symbol. This
4684 happens when statically linking PIC code, or when
4685 using -Bsymbolic. */
4689 if (h->plt.offset != (bfd_vma) -1)
4691 if (htab->plt_bnd != NULL)
4693 resolved_plt = htab->plt_bnd;
4694 plt_offset = eh->plt_bnd.offset;
4698 resolved_plt = htab->elf.splt;
4699 plt_offset = h->plt.offset;
4704 /* Use the GOT PLT. */
4705 resolved_plt = htab->plt_got;
4706 plt_offset = eh->plt_got.offset;
4709 relocation = (resolved_plt->output_section->vma
4710 + resolved_plt->output_offset
4712 unresolved_reloc = FALSE;
4715 case R_X86_64_SIZE32:
4716 case R_X86_64_SIZE64:
4717 /* Set to symbol size. */
4718 relocation = st_size;
4724 case R_X86_64_PC32_BND:
4725 /* Don't complain about -fPIC if the symbol is undefined when
4726 building executable unless it is unresolved weak symbol. */
4727 if ((input_section->flags & SEC_ALLOC) != 0
4728 && (input_section->flags & SEC_READONLY) != 0
4730 && ((bfd_link_executable (info)
4731 && h->root.type == bfd_link_hash_undefweak
4732 && !resolved_to_zero)
4733 || (bfd_link_pic (info)
4734 && !(bfd_link_pie (info)
4735 && h->root.type == bfd_link_hash_undefined))))
4737 bfd_boolean fail = FALSE;
4739 = ((r_type == R_X86_64_PC32
4740 || r_type == R_X86_64_PC32_BND)
4741 && is_32bit_relative_branch (contents, rel->r_offset));
4743 if (SYMBOL_REFERENCES_LOCAL (info, h))
4745 /* Symbol is referenced locally. Make sure it is
4746 defined locally or for a branch. */
4747 fail = !h->def_regular && !branch;
4749 else if (!(bfd_link_pie (info)
4750 && (h->needs_copy || eh->needs_copy)))
4752 /* Symbol doesn't need copy reloc and isn't referenced
4753 locally. We only allow branch to symbol with
4754 non-default visibility. */
4756 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT);
4760 return elf_x86_64_need_pic (input_bfd, h, howto);
4769 /* FIXME: The ABI says the linker should make sure the value is
4770 the same when it's zeroextended to 64 bit. */
4773 if ((input_section->flags & SEC_ALLOC) == 0)
4776 /* Don't copy a pc-relative relocation into the output file
4777 if the symbol needs copy reloc or the symbol is undefined
4778 when building executable. Copy dynamic function pointer
4779 relocations. Don't generate dynamic relocations against
4780 resolved undefined weak symbols in PIE. */
4781 if ((bfd_link_pic (info)
4782 && !(bfd_link_pie (info)
4786 || h->root.type == bfd_link_hash_undefined)
4787 && IS_X86_64_PCREL_TYPE (r_type))
4789 || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4790 && !resolved_to_zero)
4791 || h->root.type != bfd_link_hash_undefweak))
4792 && ((! IS_X86_64_PCREL_TYPE (r_type)
4793 && r_type != R_X86_64_SIZE32
4794 && r_type != R_X86_64_SIZE64)
4795 || ! SYMBOL_CALLS_LOCAL (info, h)))
4796 || (ELIMINATE_COPY_RELOCS
4797 && !bfd_link_pic (info)
4801 || eh->func_pointer_refcount > 0
4802 || (h->root.type == bfd_link_hash_undefweak
4803 && !resolved_to_zero))
4804 && ((h->def_dynamic && !h->def_regular)
4805 /* Undefined weak symbol is bound locally when
4807 || h->root.type == bfd_link_hash_undefined)))
4809 Elf_Internal_Rela outrel;
4810 bfd_boolean skip, relocate;
4813 /* When generating a shared object, these relocations
4814 are copied into the output file to be resolved at run
4820 _bfd_elf_section_offset (output_bfd, info, input_section,
4822 if (outrel.r_offset == (bfd_vma) -1)
4824 else if (outrel.r_offset == (bfd_vma) -2)
4825 skip = TRUE, relocate = TRUE;
4827 outrel.r_offset += (input_section->output_section->vma
4828 + input_section->output_offset);
4831 memset (&outrel, 0, sizeof outrel);
4833 /* h->dynindx may be -1 if this symbol was marked to
4837 && (IS_X86_64_PCREL_TYPE (r_type)
4838 || !(bfd_link_executable (info)
4839 || SYMBOLIC_BIND (info, h))
4840 || ! h->def_regular))
4842 if ((r_type != R_X86_64_PC64 && r_type != R_X86_64_64)
4843 && bfd_link_executable (info)
4844 && h->root.type == bfd_link_hash_undefweak
4845 && !resolved_to_zero)
4846 return elf_x86_64_need_pic (input_bfd, h, howto);
4847 outrel.r_info = htab->r_info (h->dynindx, r_type);
4848 outrel.r_addend = rel->r_addend;
4852 /* This symbol is local, or marked to become local.
4853 When relocation overflow check is disabled, we
4854 convert R_X86_64_32 to dynamic R_X86_64_RELATIVE. */
4855 if (r_type == htab->pointer_r_type
4856 || (r_type == R_X86_64_32
4857 && info->no_reloc_overflow_check))
4860 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4861 outrel.r_addend = relocation + rel->r_addend;
4863 else if (r_type == R_X86_64_64
4864 && !ABI_64_P (output_bfd))
4867 outrel.r_info = htab->r_info (0,
4868 R_X86_64_RELATIVE64);
4869 outrel.r_addend = relocation + rel->r_addend;
4870 /* Check addend overflow. */
4871 if ((outrel.r_addend & 0x80000000)
4872 != (rel->r_addend & 0x80000000))
4875 int addend = rel->r_addend;
4876 if (h && h->root.root.string)
4877 name = h->root.root.string;
4879 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
4882 (*_bfd_error_handler)
4883 (_("%B: addend -0x%x in relocation %s against "
4884 "symbol `%s' at 0x%lx in section `%A' is "
4886 input_bfd, input_section, addend,
4888 (unsigned long) rel->r_offset);
4890 (*_bfd_error_handler)
4891 (_("%B: addend 0x%x in relocation %s against "
4892 "symbol `%s' at 0x%lx in section `%A' is "
4894 input_bfd, input_section, addend,
4896 (unsigned long) rel->r_offset);
4897 bfd_set_error (bfd_error_bad_value);
4905 if (bfd_is_abs_section (sec))
4907 else if (sec == NULL || sec->owner == NULL)
4909 bfd_set_error (bfd_error_bad_value);
4916 /* We are turning this relocation into one
4917 against a section symbol. It would be
4918 proper to subtract the symbol's value,
4919 osec->vma, from the emitted reloc addend,
4920 but ld.so expects buggy relocs. */
4921 osec = sec->output_section;
4922 sindx = elf_section_data (osec)->dynindx;
4925 asection *oi = htab->elf.text_index_section;
4926 sindx = elf_section_data (oi)->dynindx;
4928 BFD_ASSERT (sindx != 0);
4931 outrel.r_info = htab->r_info (sindx, r_type);
4932 outrel.r_addend = relocation + rel->r_addend;
4936 sreloc = elf_section_data (input_section)->sreloc;
4938 if (sreloc == NULL || sreloc->contents == NULL)
4940 r = bfd_reloc_notsupported;
4941 goto check_relocation_error;
4944 elf_append_rela (output_bfd, sreloc, &outrel);
4946 /* If this reloc is against an external symbol, we do
4947 not want to fiddle with the addend. Otherwise, we
4948 need to include the symbol value so that it becomes
4949 an addend for the dynamic reloc. */
4956 case R_X86_64_TLSGD:
4957 case R_X86_64_GOTPC32_TLSDESC:
4958 case R_X86_64_TLSDESC_CALL:
4959 case R_X86_64_GOTTPOFF:
4960 tls_type = GOT_UNKNOWN;
4961 if (h == NULL && local_got_offsets)
4962 tls_type = elf_x86_64_local_got_tls_type (input_bfd) [r_symndx];
4964 tls_type = elf_x86_64_hash_entry (h)->tls_type;
4966 if (! elf_x86_64_tls_transition (info, input_bfd,
4967 input_section, contents,
4968 symtab_hdr, sym_hashes,
4969 &r_type, tls_type, rel,
4970 relend, h, r_symndx))
4973 if (r_type == R_X86_64_TPOFF32)
4975 bfd_vma roff = rel->r_offset;
4977 BFD_ASSERT (! unresolved_reloc);
4979 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
4981 /* GD->LE transition. For 64bit, change
4982 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4983 .word 0x6666; rex64; call __tls_get_addr
4986 leaq foo@tpoff(%rax), %rax
4988 leaq foo@tlsgd(%rip), %rdi
4989 .word 0x6666; rex64; call __tls_get_addr
4992 leaq foo@tpoff(%rax), %rax
4993 For largepic, change:
4994 leaq foo@tlsgd(%rip), %rdi
4995 movabsq $__tls_get_addr@pltoff, %rax
5000 leaq foo@tpoff(%rax), %rax
5001 nopw 0x0(%rax,%rax,1) */
5003 if (ABI_64_P (output_bfd)
5004 && contents[roff + 5] == (bfd_byte) '\xb8')
5006 memcpy (contents + roff - 3,
5007 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80"
5008 "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
5011 else if (ABI_64_P (output_bfd))
5012 memcpy (contents + roff - 4,
5013 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
5016 memcpy (contents + roff - 3,
5017 "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
5019 bfd_put_32 (output_bfd,
5020 elf_x86_64_tpoff (info, relocation),
5021 contents + roff + 8 + largepic);
5022 /* Skip R_X86_64_PC32/R_X86_64_PLT32/R_X86_64_PLTOFF64. */
5027 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
5029 /* GDesc -> LE transition.
5030 It's originally something like:
5031 leaq x@tlsdesc(%rip), %rax
5034 movl $x@tpoff, %rax. */
5036 unsigned int val, type;
5038 type = bfd_get_8 (input_bfd, contents + roff - 3);
5039 val = bfd_get_8 (input_bfd, contents + roff - 1);
5040 bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
5041 contents + roff - 3);
5042 bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
5043 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
5044 contents + roff - 1);
5045 bfd_put_32 (output_bfd,
5046 elf_x86_64_tpoff (info, relocation),
5050 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
5052 /* GDesc -> LE transition.
5057 bfd_put_8 (output_bfd, 0x66, contents + roff);
5058 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
5061 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTTPOFF)
5063 /* IE->LE transition:
5064 For 64bit, originally it can be one of:
5065 movq foo@gottpoff(%rip), %reg
5066 addq foo@gottpoff(%rip), %reg
5069 leaq foo(%reg), %reg
5071 For 32bit, originally it can be one of:
5072 movq foo@gottpoff(%rip), %reg
5073 addl foo@gottpoff(%rip), %reg
5076 leal foo(%reg), %reg
5079 unsigned int val, type, reg;
5082 val = bfd_get_8 (input_bfd, contents + roff - 3);
5085 type = bfd_get_8 (input_bfd, contents + roff - 2);
5086 reg = bfd_get_8 (input_bfd, contents + roff - 1);
5092 bfd_put_8 (output_bfd, 0x49,
5093 contents + roff - 3);
5094 else if (!ABI_64_P (output_bfd) && val == 0x44)
5095 bfd_put_8 (output_bfd, 0x41,
5096 contents + roff - 3);
5097 bfd_put_8 (output_bfd, 0xc7,
5098 contents + roff - 2);
5099 bfd_put_8 (output_bfd, 0xc0 | reg,
5100 contents + roff - 1);
5104 /* addq/addl -> addq/addl - addressing with %rsp/%r12
5107 bfd_put_8 (output_bfd, 0x49,
5108 contents + roff - 3);
5109 else if (!ABI_64_P (output_bfd) && val == 0x44)
5110 bfd_put_8 (output_bfd, 0x41,
5111 contents + roff - 3);
5112 bfd_put_8 (output_bfd, 0x81,
5113 contents + roff - 2);
5114 bfd_put_8 (output_bfd, 0xc0 | reg,
5115 contents + roff - 1);
5119 /* addq/addl -> leaq/leal */
5121 bfd_put_8 (output_bfd, 0x4d,
5122 contents + roff - 3);
5123 else if (!ABI_64_P (output_bfd) && val == 0x44)
5124 bfd_put_8 (output_bfd, 0x45,
5125 contents + roff - 3);
5126 bfd_put_8 (output_bfd, 0x8d,
5127 contents + roff - 2);
5128 bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
5129 contents + roff - 1);
5131 bfd_put_32 (output_bfd,
5132 elf_x86_64_tpoff (info, relocation),
5140 if (htab->elf.sgot == NULL)
5145 off = h->got.offset;
5146 offplt = elf_x86_64_hash_entry (h)->tlsdesc_got;
5150 if (local_got_offsets == NULL)
5153 off = local_got_offsets[r_symndx];
5154 offplt = local_tlsdesc_gotents[r_symndx];
5161 Elf_Internal_Rela outrel;
5165 if (htab->elf.srelgot == NULL)
5168 indx = h && h->dynindx != -1 ? h->dynindx : 0;
5170 if (GOT_TLS_GDESC_P (tls_type))
5172 outrel.r_info = htab->r_info (indx, R_X86_64_TLSDESC);
5173 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
5174 + 2 * GOT_ENTRY_SIZE <= htab->elf.sgotplt->size);
5175 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
5176 + htab->elf.sgotplt->output_offset
5178 + htab->sgotplt_jump_table_size);
5179 sreloc = htab->elf.srelplt;
5181 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
5183 outrel.r_addend = 0;
5184 elf_append_rela (output_bfd, sreloc, &outrel);
5187 sreloc = htab->elf.srelgot;
5189 outrel.r_offset = (htab->elf.sgot->output_section->vma
5190 + htab->elf.sgot->output_offset + off);
5192 if (GOT_TLS_GD_P (tls_type))
5193 dr_type = R_X86_64_DTPMOD64;
5194 else if (GOT_TLS_GDESC_P (tls_type))
5197 dr_type = R_X86_64_TPOFF64;
5199 bfd_put_64 (output_bfd, 0, htab->elf.sgot->contents + off);
5200 outrel.r_addend = 0;
5201 if ((dr_type == R_X86_64_TPOFF64
5202 || dr_type == R_X86_64_TLSDESC) && indx == 0)
5203 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
5204 outrel.r_info = htab->r_info (indx, dr_type);
5206 elf_append_rela (output_bfd, sreloc, &outrel);
5208 if (GOT_TLS_GD_P (tls_type))
5212 BFD_ASSERT (! unresolved_reloc);
5213 bfd_put_64 (output_bfd,
5214 relocation - elf_x86_64_dtpoff_base (info),
5215 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
5219 bfd_put_64 (output_bfd, 0,
5220 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
5221 outrel.r_info = htab->r_info (indx,
5223 outrel.r_offset += GOT_ENTRY_SIZE;
5224 elf_append_rela (output_bfd, sreloc,
5233 local_got_offsets[r_symndx] |= 1;
5236 if (off >= (bfd_vma) -2
5237 && ! GOT_TLS_GDESC_P (tls_type))
5239 if (r_type == ELF32_R_TYPE (rel->r_info))
5241 if (r_type == R_X86_64_GOTPC32_TLSDESC
5242 || r_type == R_X86_64_TLSDESC_CALL)
5243 relocation = htab->elf.sgotplt->output_section->vma
5244 + htab->elf.sgotplt->output_offset
5245 + offplt + htab->sgotplt_jump_table_size;
5247 relocation = htab->elf.sgot->output_section->vma
5248 + htab->elf.sgot->output_offset + off;
5249 unresolved_reloc = FALSE;
5253 bfd_vma roff = rel->r_offset;
5255 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
5257 /* GD->IE transition. For 64bit, change
5258 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
5259 .word 0x6666; rex64; call __tls_get_addr@plt
5262 addq foo@gottpoff(%rip), %rax
5264 leaq foo@tlsgd(%rip), %rdi
5265 .word 0x6666; rex64; call __tls_get_addr@plt
5268 addq foo@gottpoff(%rip), %rax
5269 For largepic, change:
5270 leaq foo@tlsgd(%rip), %rdi
5271 movabsq $__tls_get_addr@pltoff, %rax
5276 addq foo@gottpoff(%rax), %rax
5277 nopw 0x0(%rax,%rax,1) */
5279 if (ABI_64_P (output_bfd)
5280 && contents[roff + 5] == (bfd_byte) '\xb8')
5282 memcpy (contents + roff - 3,
5283 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05"
5284 "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
5287 else if (ABI_64_P (output_bfd))
5288 memcpy (contents + roff - 4,
5289 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
5292 memcpy (contents + roff - 3,
5293 "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
5296 relocation = (htab->elf.sgot->output_section->vma
5297 + htab->elf.sgot->output_offset + off
5300 - input_section->output_section->vma
5301 - input_section->output_offset
5303 bfd_put_32 (output_bfd, relocation,
5304 contents + roff + 8 + largepic);
5305 /* Skip R_X86_64_PLT32/R_X86_64_PLTOFF64. */
5310 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
5312 /* GDesc -> IE transition.
5313 It's originally something like:
5314 leaq x@tlsdesc(%rip), %rax
5317 movq x@gottpoff(%rip), %rax # before xchg %ax,%ax. */
5319 /* Now modify the instruction as appropriate. To
5320 turn a leaq into a movq in the form we use it, it
5321 suffices to change the second byte from 0x8d to
5323 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
5325 bfd_put_32 (output_bfd,
5326 htab->elf.sgot->output_section->vma
5327 + htab->elf.sgot->output_offset + off
5329 - input_section->output_section->vma
5330 - input_section->output_offset
5335 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
5337 /* GDesc -> IE transition.
5344 bfd_put_8 (output_bfd, 0x66, contents + roff);
5345 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
5353 case R_X86_64_TLSLD:
5354 if (! elf_x86_64_tls_transition (info, input_bfd,
5355 input_section, contents,
5356 symtab_hdr, sym_hashes,
5357 &r_type, GOT_UNKNOWN,
5358 rel, relend, h, r_symndx))
5361 if (r_type != R_X86_64_TLSLD)
5363 /* LD->LE transition:
5364 leaq foo@tlsld(%rip), %rdi; call __tls_get_addr.
5365 For 64bit, we change it into:
5366 .word 0x6666; .byte 0x66; movq %fs:0, %rax.
5367 For 32bit, we change it into:
5368 nopl 0x0(%rax); movl %fs:0, %eax.
5369 For largepic, change:
5370 leaq foo@tlsgd(%rip), %rdi
5371 movabsq $__tls_get_addr@pltoff, %rax
5375 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
5378 BFD_ASSERT (r_type == R_X86_64_TPOFF32);
5379 if (ABI_64_P (output_bfd)
5380 && contents[rel->r_offset + 5] == (bfd_byte) '\xb8')
5381 memcpy (contents + rel->r_offset - 3,
5382 "\x66\x66\x66\x66\x2e\x0f\x1f\x84\0\0\0\0\0"
5383 "\x64\x48\x8b\x04\x25\0\0\0", 22);
5384 else if (ABI_64_P (output_bfd))
5385 memcpy (contents + rel->r_offset - 3,
5386 "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
5388 memcpy (contents + rel->r_offset - 3,
5389 "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
5390 /* Skip R_X86_64_PC32/R_X86_64_PLT32/R_X86_64_PLTOFF64. */
5396 if (htab->elf.sgot == NULL)
5399 off = htab->tls_ld_got.offset;
5404 Elf_Internal_Rela outrel;
5406 if (htab->elf.srelgot == NULL)
5409 outrel.r_offset = (htab->elf.sgot->output_section->vma
5410 + htab->elf.sgot->output_offset + off);
5412 bfd_put_64 (output_bfd, 0,
5413 htab->elf.sgot->contents + off);
5414 bfd_put_64 (output_bfd, 0,
5415 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
5416 outrel.r_info = htab->r_info (0, R_X86_64_DTPMOD64);
5417 outrel.r_addend = 0;
5418 elf_append_rela (output_bfd, htab->elf.srelgot,
5420 htab->tls_ld_got.offset |= 1;
5422 relocation = htab->elf.sgot->output_section->vma
5423 + htab->elf.sgot->output_offset + off;
5424 unresolved_reloc = FALSE;
5427 case R_X86_64_DTPOFF32:
5428 if (!bfd_link_executable (info)
5429 || (input_section->flags & SEC_CODE) == 0)
5430 relocation -= elf_x86_64_dtpoff_base (info);
5432 relocation = elf_x86_64_tpoff (info, relocation);
5435 case R_X86_64_TPOFF32:
5436 case R_X86_64_TPOFF64:
5437 BFD_ASSERT (bfd_link_executable (info));
5438 relocation = elf_x86_64_tpoff (info, relocation);
5441 case R_X86_64_DTPOFF64:
5442 BFD_ASSERT ((input_section->flags & SEC_CODE) == 0);
5443 relocation -= elf_x86_64_dtpoff_base (info);
5450 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5451 because such sections are not SEC_ALLOC and thus ld.so will
5452 not process them. */
5453 if (unresolved_reloc
5454 && !((input_section->flags & SEC_DEBUGGING) != 0
5456 && _bfd_elf_section_offset (output_bfd, info, input_section,
5457 rel->r_offset) != (bfd_vma) -1)
5459 (*_bfd_error_handler)
5460 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5463 (long) rel->r_offset,
5465 h->root.root.string);
5470 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5471 contents, rel->r_offset,
5472 relocation, rel->r_addend);
5474 check_relocation_error:
5475 if (r != bfd_reloc_ok)
5480 name = h->root.root.string;
5483 name = bfd_elf_string_from_elf_section (input_bfd,
5484 symtab_hdr->sh_link,
5489 name = bfd_section_name (input_bfd, sec);
5492 if (r == bfd_reloc_overflow)
5494 if (! ((*info->callbacks->reloc_overflow)
5495 (info, (h ? &h->root : NULL), name, howto->name,
5496 (bfd_vma) 0, input_bfd, input_section,
5502 (*_bfd_error_handler)
5503 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
5504 input_bfd, input_section,
5505 (long) rel->r_offset, name, (int) r);
5516 Elf_Internal_Shdr *rel_hdr;
5517 size_t deleted = rel - wrel;
5519 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
5520 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5521 if (rel_hdr->sh_size == 0)
5523 /* It is too late to remove an empty reloc section. Leave
5525 ??? What is wrong with an empty section??? */
5526 rel_hdr->sh_size = rel_hdr->sh_entsize;
5529 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
5530 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5531 input_section->reloc_count -= deleted;
5537 /* Finish up dynamic symbol handling. We set the contents of various
5538 dynamic sections here. */
5541 elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
5542 struct bfd_link_info *info,
5543 struct elf_link_hash_entry *h,
5544 Elf_Internal_Sym *sym)
5546 struct elf_x86_64_link_hash_table *htab;
5547 const struct elf_x86_64_backend_data *abed;
5548 bfd_boolean use_plt_bnd;
5549 struct elf_x86_64_link_hash_entry *eh;
5550 bfd_boolean local_undefweak;
5552 htab = elf_x86_64_hash_table (info);
5556 /* Use MPX backend data in case of BND relocation. Use .plt_bnd
5557 section only if there is .plt section. */
5558 use_plt_bnd = htab->elf.splt != NULL && htab->plt_bnd != NULL;
5560 ? &elf_x86_64_bnd_arch_bed
5561 : get_elf_x86_64_backend_data (output_bfd));
5563 eh = (struct elf_x86_64_link_hash_entry *) h;
5565 /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
5566 resolved undefined weak symbols in executable so that their
5567 references have value 0 at run-time. */
5568 local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
5570 if (h->plt.offset != (bfd_vma) -1)
5573 bfd_vma got_offset, plt_offset, plt_plt_offset, plt_got_offset;
5574 bfd_vma plt_plt_insn_end, plt_got_insn_size;
5575 Elf_Internal_Rela rela;
5577 asection *plt, *gotplt, *relplt, *resolved_plt;
5578 const struct elf_backend_data *bed;
5579 bfd_vma plt_got_pcrel_offset;
5581 /* When building a static executable, use .iplt, .igot.plt and
5582 .rela.iplt sections for STT_GNU_IFUNC symbols. */
5583 if (htab->elf.splt != NULL)
5585 plt = htab->elf.splt;
5586 gotplt = htab->elf.sgotplt;
5587 relplt = htab->elf.srelplt;
5591 plt = htab->elf.iplt;
5592 gotplt = htab->elf.igotplt;
5593 relplt = htab->elf.irelplt;
5596 /* This symbol has an entry in the procedure linkage table. Set
5598 if ((h->dynindx == -1
5600 && !((h->forced_local || bfd_link_executable (info))
5602 && h->type == STT_GNU_IFUNC))
5608 /* Get the index in the procedure linkage table which
5609 corresponds to this symbol. This is the index of this symbol
5610 in all the symbols for which we are making plt entries. The
5611 first entry in the procedure linkage table is reserved.
5613 Get the offset into the .got table of the entry that
5614 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
5615 bytes. The first three are reserved for the dynamic linker.
5617 For static executables, we don't reserve anything. */
5619 if (plt == htab->elf.splt)
5621 got_offset = h->plt.offset / abed->plt_entry_size - 1;
5622 got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
5626 got_offset = h->plt.offset / abed->plt_entry_size;
5627 got_offset = got_offset * GOT_ENTRY_SIZE;
5630 plt_plt_insn_end = abed->plt_plt_insn_end;
5631 plt_plt_offset = abed->plt_plt_offset;
5632 plt_got_insn_size = abed->plt_got_insn_size;
5633 plt_got_offset = abed->plt_got_offset;
5636 /* Use the second PLT with BND relocations. */
5637 const bfd_byte *plt_entry, *plt2_entry;
5639 if (eh->has_bnd_reloc)
5641 plt_entry = elf_x86_64_bnd_plt_entry;
5642 plt2_entry = elf_x86_64_bnd_plt2_entry;
5646 plt_entry = elf_x86_64_legacy_plt_entry;
5647 plt2_entry = elf_x86_64_legacy_plt2_entry;
5649 /* Subtract 1 since there is no BND prefix. */
5650 plt_plt_insn_end -= 1;
5651 plt_plt_offset -= 1;
5652 plt_got_insn_size -= 1;
5653 plt_got_offset -= 1;
5656 BFD_ASSERT (sizeof (elf_x86_64_bnd_plt_entry)
5657 == sizeof (elf_x86_64_legacy_plt_entry));
5659 /* Fill in the entry in the procedure linkage table. */
5660 memcpy (plt->contents + h->plt.offset,
5661 plt_entry, sizeof (elf_x86_64_legacy_plt_entry));
5662 /* Fill in the entry in the second PLT. */
5663 memcpy (htab->plt_bnd->contents + eh->plt_bnd.offset,
5664 plt2_entry, sizeof (elf_x86_64_legacy_plt2_entry));
5666 resolved_plt = htab->plt_bnd;
5667 plt_offset = eh->plt_bnd.offset;
5671 /* Fill in the entry in the procedure linkage table. */
5672 memcpy (plt->contents + h->plt.offset, abed->plt_entry,
5673 abed->plt_entry_size);
5676 plt_offset = h->plt.offset;
5679 /* Insert the relocation positions of the plt section. */
5681 /* Put offset the PC-relative instruction referring to the GOT entry,
5682 subtracting the size of that instruction. */
5683 plt_got_pcrel_offset = (gotplt->output_section->vma
5684 + gotplt->output_offset
5686 - resolved_plt->output_section->vma
5687 - resolved_plt->output_offset
5689 - plt_got_insn_size);
5691 /* Check PC-relative offset overflow in PLT entry. */
5692 if ((plt_got_pcrel_offset + 0x80000000) > 0xffffffff)
5693 info->callbacks->einfo (_("%F%B: PC-relative offset overflow in PLT entry for `%s'\n"),
5694 output_bfd, h->root.root.string);
5696 bfd_put_32 (output_bfd, plt_got_pcrel_offset,
5697 resolved_plt->contents + plt_offset + plt_got_offset);
5699 /* Fill in the entry in the global offset table, initially this
5700 points to the second part of the PLT entry. Leave the entry
5701 as zero for undefined weak symbol in PIE. No PLT relocation
5702 against undefined weak symbol in PIE. */
5703 if (!local_undefweak)
5705 bfd_put_64 (output_bfd, (plt->output_section->vma
5706 + plt->output_offset
5708 + abed->plt_lazy_offset),
5709 gotplt->contents + got_offset);
5711 /* Fill in the entry in the .rela.plt section. */
5712 rela.r_offset = (gotplt->output_section->vma
5713 + gotplt->output_offset
5715 if (h->dynindx == -1
5716 || ((bfd_link_executable (info)
5717 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5719 && h->type == STT_GNU_IFUNC))
5721 /* If an STT_GNU_IFUNC symbol is locally defined, generate
5722 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT. */
5723 rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
5724 rela.r_addend = (h->root.u.def.value
5725 + h->root.u.def.section->output_section->vma
5726 + h->root.u.def.section->output_offset);
5727 /* R_X86_64_IRELATIVE comes last. */
5728 plt_index = htab->next_irelative_index--;
5732 rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
5734 plt_index = htab->next_jump_slot_index++;
5737 /* Don't fill PLT entry for static executables. */
5738 if (plt == htab->elf.splt)
5740 bfd_vma plt0_offset = h->plt.offset + plt_plt_insn_end;
5742 /* Put relocation index. */
5743 bfd_put_32 (output_bfd, plt_index,
5744 (plt->contents + h->plt.offset
5745 + abed->plt_reloc_offset));
5747 /* Put offset for jmp .PLT0 and check for overflow. We don't
5748 check relocation index for overflow since branch displacement
5749 will overflow first. */
5750 if (plt0_offset > 0x80000000)
5751 info->callbacks->einfo (_("%F%B: branch displacement overflow in PLT entry for `%s'\n"),
5752 output_bfd, h->root.root.string);
5753 bfd_put_32 (output_bfd, - plt0_offset,
5754 plt->contents + h->plt.offset + plt_plt_offset);
5757 bed = get_elf_backend_data (output_bfd);
5758 loc = relplt->contents + plt_index * bed->s->sizeof_rela;
5759 bed->s->swap_reloca_out (output_bfd, &rela, loc);
5762 else if (eh->plt_got.offset != (bfd_vma) -1)
5764 bfd_vma got_offset, plt_offset, plt_got_offset, plt_got_insn_size;
5765 asection *plt, *got;
5766 bfd_boolean got_after_plt;
5767 int32_t got_pcrel_offset;
5768 const bfd_byte *got_plt_entry;
5770 /* Set the entry in the GOT procedure linkage table. */
5771 plt = htab->plt_got;
5772 got = htab->elf.sgot;
5773 got_offset = h->got.offset;
5775 if (got_offset == (bfd_vma) -1
5776 || h->type == STT_GNU_IFUNC
5781 /* Use the second PLT entry template for the GOT PLT since they
5782 are the identical. */
5783 plt_got_insn_size = elf_x86_64_bnd_arch_bed.plt_got_insn_size;
5784 plt_got_offset = elf_x86_64_bnd_arch_bed.plt_got_offset;
5785 if (eh->has_bnd_reloc)
5786 got_plt_entry = elf_x86_64_bnd_plt2_entry;
5789 got_plt_entry = elf_x86_64_legacy_plt2_entry;
5791 /* Subtract 1 since there is no BND prefix. */
5792 plt_got_insn_size -= 1;
5793 plt_got_offset -= 1;
5796 /* Fill in the entry in the GOT procedure linkage table. */
5797 plt_offset = eh->plt_got.offset;
5798 memcpy (plt->contents + plt_offset,
5799 got_plt_entry, sizeof (elf_x86_64_legacy_plt2_entry));
5801 /* Put offset the PC-relative instruction referring to the GOT
5802 entry, subtracting the size of that instruction. */
5803 got_pcrel_offset = (got->output_section->vma
5804 + got->output_offset
5806 - plt->output_section->vma
5807 - plt->output_offset
5809 - plt_got_insn_size);
5811 /* Check PC-relative offset overflow in GOT PLT entry. */
5812 got_after_plt = got->output_section->vma > plt->output_section->vma;
5813 if ((got_after_plt && got_pcrel_offset < 0)
5814 || (!got_after_plt && got_pcrel_offset > 0))
5815 info->callbacks->einfo (_("%F%B: PC-relative offset overflow in GOT PLT entry for `%s'\n"),
5816 output_bfd, h->root.root.string);
5818 bfd_put_32 (output_bfd, got_pcrel_offset,
5819 plt->contents + plt_offset + plt_got_offset);
5822 if (!local_undefweak
5824 && (h->plt.offset != (bfd_vma) -1
5825 || eh->plt_got.offset != (bfd_vma) -1))
5827 /* Mark the symbol as undefined, rather than as defined in
5828 the .plt section. Leave the value if there were any
5829 relocations where pointer equality matters (this is a clue
5830 for the dynamic linker, to make function pointer
5831 comparisons work between an application and shared
5832 library), otherwise set it to zero. If a function is only
5833 called from a binary, there is no need to slow down
5834 shared libraries because of that. */
5835 sym->st_shndx = SHN_UNDEF;
5836 if (!h->pointer_equality_needed)
5840 /* Don't generate dynamic GOT relocation against undefined weak
5841 symbol in executable. */
5842 if (h->got.offset != (bfd_vma) -1
5843 && ! GOT_TLS_GD_ANY_P (elf_x86_64_hash_entry (h)->tls_type)
5844 && elf_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE
5845 && !local_undefweak)
5847 Elf_Internal_Rela rela;
5849 /* This symbol has an entry in the global offset table. Set it
5851 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
5854 rela.r_offset = (htab->elf.sgot->output_section->vma
5855 + htab->elf.sgot->output_offset
5856 + (h->got.offset &~ (bfd_vma) 1));
5858 /* If this is a static link, or it is a -Bsymbolic link and the
5859 symbol is defined locally or was forced to be local because
5860 of a version file, we just want to emit a RELATIVE reloc.
5861 The entry in the global offset table will already have been
5862 initialized in the relocate_section function. */
5864 && h->type == STT_GNU_IFUNC)
5866 if (bfd_link_pic (info))
5868 /* Generate R_X86_64_GLOB_DAT. */
5875 if (!h->pointer_equality_needed)
5878 /* For non-shared object, we can't use .got.plt, which
5879 contains the real function addres if we need pointer
5880 equality. We load the GOT entry with the PLT entry. */
5881 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
5882 bfd_put_64 (output_bfd, (plt->output_section->vma
5883 + plt->output_offset
5885 htab->elf.sgot->contents + h->got.offset);
5889 else if (bfd_link_pic (info)
5890 && SYMBOL_REFERENCES_LOCAL (info, h))
5892 if (!h->def_regular)
5894 BFD_ASSERT((h->got.offset & 1) != 0);
5895 rela.r_info = htab->r_info (0, R_X86_64_RELATIVE);
5896 rela.r_addend = (h->root.u.def.value
5897 + h->root.u.def.section->output_section->vma
5898 + h->root.u.def.section->output_offset);
5902 BFD_ASSERT((h->got.offset & 1) == 0);
5904 bfd_put_64 (output_bfd, (bfd_vma) 0,
5905 htab->elf.sgot->contents + h->got.offset);
5906 rela.r_info = htab->r_info (h->dynindx, R_X86_64_GLOB_DAT);
5910 elf_append_rela (output_bfd, htab->elf.srelgot, &rela);
5915 Elf_Internal_Rela rela;
5917 /* This symbol needs a copy reloc. Set it up. */
5919 if (h->dynindx == -1
5920 || (h->root.type != bfd_link_hash_defined
5921 && h->root.type != bfd_link_hash_defweak)
5922 || htab->srelbss == NULL)
5925 rela.r_offset = (h->root.u.def.value
5926 + h->root.u.def.section->output_section->vma
5927 + h->root.u.def.section->output_offset);
5928 rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY);
5930 elf_append_rela (output_bfd, htab->srelbss, &rela);
5936 /* Finish up local dynamic symbol handling. We set the contents of
5937 various dynamic sections here. */
5940 elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
5942 struct elf_link_hash_entry *h
5943 = (struct elf_link_hash_entry *) *slot;
5944 struct bfd_link_info *info
5945 = (struct bfd_link_info *) inf;
5947 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
5951 /* Finish up undefined weak symbol handling in PIE. Fill its PLT entry
5952 here since undefined weak symbol may not be dynamic and may not be
5953 called for elf_x86_64_finish_dynamic_symbol. */
5956 elf_x86_64_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
5959 struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
5960 struct bfd_link_info *info = (struct bfd_link_info *) inf;
5962 if (h->root.type != bfd_link_hash_undefweak
5963 || h->dynindx != -1)
5966 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
5970 /* Used to decide how to sort relocs in an optimal manner for the
5971 dynamic linker, before writing them out. */
5973 static enum elf_reloc_type_class
5974 elf_x86_64_reloc_type_class (const struct bfd_link_info *info,
5975 const asection *rel_sec ATTRIBUTE_UNUSED,
5976 const Elf_Internal_Rela *rela)
5978 bfd *abfd = info->output_bfd;
5979 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5980 struct elf_x86_64_link_hash_table *htab = elf_x86_64_hash_table (info);
5982 if (htab->elf.dynsym != NULL
5983 && htab->elf.dynsym->contents != NULL)
5985 /* Check relocation against STT_GNU_IFUNC symbol if there are
5987 unsigned long r_symndx = htab->r_sym (rela->r_info);
5988 Elf_Internal_Sym sym;
5989 if (!bed->s->swap_symbol_in (abfd,
5990 (htab->elf.dynsym->contents
5991 + r_symndx * bed->s->sizeof_sym),
5995 if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
5996 return reloc_class_ifunc;
5999 switch ((int) ELF32_R_TYPE (rela->r_info))
6001 case R_X86_64_RELATIVE:
6002 case R_X86_64_RELATIVE64:
6003 return reloc_class_relative;
6004 case R_X86_64_JUMP_SLOT:
6005 return reloc_class_plt;
6007 return reloc_class_copy;
6009 return reloc_class_normal;
6013 /* Finish up the dynamic sections. */
6016 elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
6017 struct bfd_link_info *info)
6019 struct elf_x86_64_link_hash_table *htab;
6022 const struct elf_x86_64_backend_data *abed;
6024 htab = elf_x86_64_hash_table (info);
6028 /* Use MPX backend data in case of BND relocation. Use .plt_bnd
6029 section only if there is .plt section. */
6030 abed = (htab->elf.splt != NULL && htab->plt_bnd != NULL
6031 ? &elf_x86_64_bnd_arch_bed
6032 : get_elf_x86_64_backend_data (output_bfd));
6034 dynobj = htab->elf.dynobj;
6035 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
6037 if (htab->elf.dynamic_sections_created)
6039 bfd_byte *dyncon, *dynconend;
6040 const struct elf_backend_data *bed;
6041 bfd_size_type sizeof_dyn;
6043 if (sdyn == NULL || htab->elf.sgot == NULL)
6046 bed = get_elf_backend_data (dynobj);
6047 sizeof_dyn = bed->s->sizeof_dyn;
6048 dyncon = sdyn->contents;
6049 dynconend = sdyn->contents + sdyn->size;
6050 for (; dyncon < dynconend; dyncon += sizeof_dyn)
6052 Elf_Internal_Dyn dyn;
6055 (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
6063 s = htab->elf.sgotplt;
6064 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
6068 dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
6072 s = htab->elf.srelplt->output_section;
6073 dyn.d_un.d_val = s->size;
6077 /* The procedure linkage table relocs (DT_JMPREL) should
6078 not be included in the overall relocs (DT_RELA).
6079 Therefore, we override the DT_RELASZ entry here to
6080 make it not include the JMPREL relocs. Since the
6081 linker script arranges for .rela.plt to follow all
6082 other relocation sections, we don't have to worry
6083 about changing the DT_RELA entry. */
6084 if (htab->elf.srelplt != NULL)
6086 s = htab->elf.srelplt->output_section;
6087 dyn.d_un.d_val -= s->size;
6091 case DT_TLSDESC_PLT:
6093 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
6094 + htab->tlsdesc_plt;
6097 case DT_TLSDESC_GOT:
6099 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
6100 + htab->tlsdesc_got;
6104 (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
6107 /* Fill in the special first entry in the procedure linkage table. */
6108 if (htab->elf.splt && htab->elf.splt->size > 0)
6110 /* Fill in the first entry in the procedure linkage table. */
6111 memcpy (htab->elf.splt->contents,
6112 abed->plt0_entry, abed->plt_entry_size);
6113 /* Add offset for pushq GOT+8(%rip), since the instruction
6114 uses 6 bytes subtract this value. */
6115 bfd_put_32 (output_bfd,
6116 (htab->elf.sgotplt->output_section->vma
6117 + htab->elf.sgotplt->output_offset
6119 - htab->elf.splt->output_section->vma
6120 - htab->elf.splt->output_offset
6122 htab->elf.splt->contents + abed->plt0_got1_offset);
6123 /* Add offset for the PC-relative instruction accessing GOT+16,
6124 subtracting the offset to the end of that instruction. */
6125 bfd_put_32 (output_bfd,
6126 (htab->elf.sgotplt->output_section->vma
6127 + htab->elf.sgotplt->output_offset
6129 - htab->elf.splt->output_section->vma
6130 - htab->elf.splt->output_offset
6131 - abed->plt0_got2_insn_end),
6132 htab->elf.splt->contents + abed->plt0_got2_offset);
6134 elf_section_data (htab->elf.splt->output_section)
6135 ->this_hdr.sh_entsize = abed->plt_entry_size;
6137 if (htab->tlsdesc_plt)
6139 bfd_put_64 (output_bfd, (bfd_vma) 0,
6140 htab->elf.sgot->contents + htab->tlsdesc_got);
6142 memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
6143 abed->plt0_entry, abed->plt_entry_size);
6145 /* Add offset for pushq GOT+8(%rip), since the
6146 instruction uses 6 bytes subtract this value. */
6147 bfd_put_32 (output_bfd,
6148 (htab->elf.sgotplt->output_section->vma
6149 + htab->elf.sgotplt->output_offset
6151 - htab->elf.splt->output_section->vma
6152 - htab->elf.splt->output_offset
6155 htab->elf.splt->contents
6156 + htab->tlsdesc_plt + abed->plt0_got1_offset);
6157 /* Add offset for the PC-relative instruction accessing GOT+TDG,
6158 where TGD stands for htab->tlsdesc_got, subtracting the offset
6159 to the end of that instruction. */
6160 bfd_put_32 (output_bfd,
6161 (htab->elf.sgot->output_section->vma
6162 + htab->elf.sgot->output_offset
6164 - htab->elf.splt->output_section->vma
6165 - htab->elf.splt->output_offset
6167 - abed->plt0_got2_insn_end),
6168 htab->elf.splt->contents
6169 + htab->tlsdesc_plt + abed->plt0_got2_offset);
6174 if (htab->plt_bnd != NULL)
6175 elf_section_data (htab->plt_bnd->output_section)
6176 ->this_hdr.sh_entsize = sizeof (elf_x86_64_bnd_plt2_entry);
6178 if (htab->elf.sgotplt)
6180 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
6182 (*_bfd_error_handler)
6183 (_("discarded output section: `%A'"), htab->elf.sgotplt);
6187 /* Fill in the first three entries in the global offset table. */
6188 if (htab->elf.sgotplt->size > 0)
6190 /* Set the first entry in the global offset table to the address of
6191 the dynamic section. */
6193 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents);
6195 bfd_put_64 (output_bfd,
6196 sdyn->output_section->vma + sdyn->output_offset,
6197 htab->elf.sgotplt->contents);
6198 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
6199 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
6200 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE*2);
6203 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize =
6207 /* Adjust .eh_frame for .plt section. */
6208 if (htab->plt_eh_frame != NULL
6209 && htab->plt_eh_frame->contents != NULL)
6211 if (htab->elf.splt != NULL
6212 && htab->elf.splt->size != 0
6213 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
6214 && htab->elf.splt->output_section != NULL
6215 && htab->plt_eh_frame->output_section != NULL)
6217 bfd_vma plt_start = htab->elf.splt->output_section->vma;
6218 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
6219 + htab->plt_eh_frame->output_offset
6220 + PLT_FDE_START_OFFSET;
6221 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
6222 htab->plt_eh_frame->contents
6223 + PLT_FDE_START_OFFSET);
6225 if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
6227 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
6229 htab->plt_eh_frame->contents))
6234 if (htab->elf.sgot && htab->elf.sgot->size > 0)
6235 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
6238 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
6239 htab_traverse (htab->loc_hash_table,
6240 elf_x86_64_finish_local_dynamic_symbol,
6243 /* Fill PLT entries for undefined weak symbols in PIE. */
6244 if (bfd_link_pie (info))
6245 bfd_hash_traverse (&info->hash->table,
6246 elf_x86_64_pie_finish_undefweak_symbol,
6252 /* Return an array of PLT entry symbol values. */
6255 elf_x86_64_get_plt_sym_val (bfd *abfd, asymbol **dynsyms, asection *plt,
6258 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
6261 bfd_vma *plt_sym_val;
6263 bfd_byte *plt_contents;
6264 const struct elf_x86_64_backend_data *bed;
6265 Elf_Internal_Shdr *hdr;
6268 /* Get the .plt section contents. PLT passed down may point to the
6269 .plt.bnd section. Make sure that PLT always points to the .plt
6271 plt_bnd = bfd_get_section_by_name (abfd, ".plt.bnd");
6276 plt = bfd_get_section_by_name (abfd, ".plt");
6279 bed = &elf_x86_64_bnd_arch_bed;
6282 bed = get_elf_x86_64_backend_data (abfd);
6284 plt_contents = (bfd_byte *) bfd_malloc (plt->size);
6285 if (plt_contents == NULL)
6287 if (!bfd_get_section_contents (abfd, (asection *) plt,
6288 plt_contents, 0, plt->size))
6291 free (plt_contents);
6295 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
6296 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
6299 hdr = &elf_section_data (relplt)->this_hdr;
6300 count = relplt->size / hdr->sh_entsize;
6302 plt_sym_val = (bfd_vma *) bfd_malloc (sizeof (bfd_vma) * count);
6303 if (plt_sym_val == NULL)
6306 for (i = 0; i < count; i++)
6307 plt_sym_val[i] = -1;
6309 plt_offset = bed->plt_entry_size;
6310 p = relplt->relocation;
6311 for (i = 0; i < count; i++, p++)
6315 /* Skip unknown relocation. */
6316 if (p->howto == NULL)
6319 if (p->howto->type != R_X86_64_JUMP_SLOT
6320 && p->howto->type != R_X86_64_IRELATIVE)
6323 reloc_index = H_GET_32 (abfd, (plt_contents + plt_offset
6324 + bed->plt_reloc_offset));
6325 if (reloc_index < count)
6329 /* This is the index in .plt section. */
6330 long plt_index = plt_offset / bed->plt_entry_size;
6331 /* Store VMA + the offset in .plt.bnd section. */
6332 plt_sym_val[reloc_index] =
6334 + (plt_index - 1) * sizeof (elf_x86_64_legacy_plt2_entry));
6337 plt_sym_val[reloc_index] = plt->vma + plt_offset;
6339 plt_offset += bed->plt_entry_size;
6341 /* PR binutils/18437: Skip extra relocations in the .rela.plt
6343 if (plt_offset >= plt->size)
6347 free (plt_contents);
6352 /* Similar to _bfd_elf_get_synthetic_symtab, with .plt.bnd section
6356 elf_x86_64_get_synthetic_symtab (bfd *abfd,
6363 /* Pass the .plt.bnd section to _bfd_elf_ifunc_get_synthetic_symtab
6364 as PLT if it exists. */
6365 asection *plt = bfd_get_section_by_name (abfd, ".plt.bnd");
6367 plt = bfd_get_section_by_name (abfd, ".plt");
6368 return _bfd_elf_ifunc_get_synthetic_symtab (abfd, symcount, syms,
6369 dynsymcount, dynsyms, ret,
6371 elf_x86_64_get_plt_sym_val);
6374 /* Handle an x86-64 specific section when reading an object file. This
6375 is called when elfcode.h finds a section with an unknown type. */
6378 elf_x86_64_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr,
6379 const char *name, int shindex)
6381 if (hdr->sh_type != SHT_X86_64_UNWIND)
6384 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
6390 /* Hook called by the linker routine which adds symbols from an object
6391 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
6395 elf_x86_64_add_symbol_hook (bfd *abfd,
6396 struct bfd_link_info *info,
6397 Elf_Internal_Sym *sym,
6398 const char **namep ATTRIBUTE_UNUSED,
6399 flagword *flagsp ATTRIBUTE_UNUSED,
6405 switch (sym->st_shndx)
6407 case SHN_X86_64_LCOMMON:
6408 lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
6411 lcomm = bfd_make_section_with_flags (abfd,
6415 | SEC_LINKER_CREATED));
6418 elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
6421 *valp = sym->st_size;
6425 if (ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE
6426 && (abfd->flags & DYNAMIC) == 0
6427 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
6428 elf_tdata (info->output_bfd)->has_gnu_symbols
6429 |= elf_gnu_symbol_unique;
6435 /* Given a BFD section, try to locate the corresponding ELF section
6439 elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
6440 asection *sec, int *index_return)
6442 if (sec == &_bfd_elf_large_com_section)
6444 *index_return = SHN_X86_64_LCOMMON;
6450 /* Process a symbol. */
6453 elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
6456 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
6458 switch (elfsym->internal_elf_sym.st_shndx)
6460 case SHN_X86_64_LCOMMON:
6461 asym->section = &_bfd_elf_large_com_section;
6462 asym->value = elfsym->internal_elf_sym.st_size;
6463 /* Common symbol doesn't set BSF_GLOBAL. */
6464 asym->flags &= ~BSF_GLOBAL;
6470 elf_x86_64_common_definition (Elf_Internal_Sym *sym)
6472 return (sym->st_shndx == SHN_COMMON
6473 || sym->st_shndx == SHN_X86_64_LCOMMON);
6477 elf_x86_64_common_section_index (asection *sec)
6479 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
6482 return SHN_X86_64_LCOMMON;
6486 elf_x86_64_common_section (asection *sec)
6488 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
6489 return bfd_com_section_ptr;
6491 return &_bfd_elf_large_com_section;
6495 elf_x86_64_merge_symbol (struct elf_link_hash_entry *h,
6496 const Elf_Internal_Sym *sym,
6501 const asection *oldsec)
6503 /* A normal common symbol and a large common symbol result in a
6504 normal common symbol. We turn the large common symbol into a
6507 && h->root.type == bfd_link_hash_common
6509 && bfd_is_com_section (*psec)
6512 if (sym->st_shndx == SHN_COMMON
6513 && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) != 0)
6515 h->root.u.c.p->section
6516 = bfd_make_section_old_way (oldbfd, "COMMON");
6517 h->root.u.c.p->section->flags = SEC_ALLOC;
6519 else if (sym->st_shndx == SHN_X86_64_LCOMMON
6520 && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) == 0)
6521 *psec = bfd_com_section_ptr;
6528 elf_x86_64_additional_program_headers (bfd *abfd,
6529 struct bfd_link_info *info ATTRIBUTE_UNUSED)
6534 /* Check to see if we need a large readonly segment. */
6535 s = bfd_get_section_by_name (abfd, ".lrodata");
6536 if (s && (s->flags & SEC_LOAD))
6539 /* Check to see if we need a large data segment. Since .lbss sections
6540 is placed right after the .bss section, there should be no need for
6541 a large data segment just because of .lbss. */
6542 s = bfd_get_section_by_name (abfd, ".ldata");
6543 if (s && (s->flags & SEC_LOAD))
6549 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
6552 elf_x86_64_hash_symbol (struct elf_link_hash_entry *h)
6554 if (h->plt.offset != (bfd_vma) -1
6556 && !h->pointer_equality_needed)
6559 return _bfd_elf_hash_symbol (h);
6562 /* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
6565 elf_x86_64_relocs_compatible (const bfd_target *input,
6566 const bfd_target *output)
6568 return ((xvec_get_elf_backend_data (input)->s->elfclass
6569 == xvec_get_elf_backend_data (output)->s->elfclass)
6570 && _bfd_elf_relocs_compatible (input, output));
6573 static const struct bfd_elf_special_section
6574 elf_x86_64_special_sections[]=
6576 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
6577 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
6578 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
6579 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
6580 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
6581 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
6582 { NULL, 0, 0, 0, 0 }
6585 #define TARGET_LITTLE_SYM x86_64_elf64_vec
6586 #define TARGET_LITTLE_NAME "elf64-x86-64"
6587 #define ELF_ARCH bfd_arch_i386
6588 #define ELF_TARGET_ID X86_64_ELF_DATA
6589 #define ELF_MACHINE_CODE EM_X86_64
6590 #define ELF_MAXPAGESIZE 0x200000
6591 #define ELF_MINPAGESIZE 0x1000
6592 #define ELF_COMMONPAGESIZE 0x1000
6594 #define elf_backend_can_gc_sections 1
6595 #define elf_backend_can_refcount 1
6596 #define elf_backend_want_got_plt 1
6597 #define elf_backend_plt_readonly 1
6598 #define elf_backend_want_plt_sym 0
6599 #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
6600 #define elf_backend_rela_normal 1
6601 #define elf_backend_plt_alignment 4
6602 #define elf_backend_extern_protected_data 1
6604 #define elf_info_to_howto elf_x86_64_info_to_howto
6606 #define bfd_elf64_bfd_link_hash_table_create \
6607 elf_x86_64_link_hash_table_create
6608 #define bfd_elf64_bfd_reloc_type_lookup elf_x86_64_reloc_type_lookup
6609 #define bfd_elf64_bfd_reloc_name_lookup \
6610 elf_x86_64_reloc_name_lookup
6612 #define elf_backend_adjust_dynamic_symbol elf_x86_64_adjust_dynamic_symbol
6613 #define elf_backend_relocs_compatible elf_x86_64_relocs_compatible
6614 #define elf_backend_check_relocs elf_x86_64_check_relocs
6615 #define elf_backend_copy_indirect_symbol elf_x86_64_copy_indirect_symbol
6616 #define elf_backend_create_dynamic_sections elf_x86_64_create_dynamic_sections
6617 #define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
6618 #define elf_backend_finish_dynamic_symbol elf_x86_64_finish_dynamic_symbol
6619 #define elf_backend_gc_mark_hook elf_x86_64_gc_mark_hook
6620 #define elf_backend_gc_sweep_hook elf_x86_64_gc_sweep_hook
6621 #define elf_backend_grok_prstatus elf_x86_64_grok_prstatus
6622 #define elf_backend_grok_psinfo elf_x86_64_grok_psinfo
6624 #define elf_backend_write_core_note elf_x86_64_write_core_note
6626 #define elf_backend_reloc_type_class elf_x86_64_reloc_type_class
6627 #define elf_backend_relocate_section elf_x86_64_relocate_section
6628 #define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections
6629 #define elf_backend_always_size_sections elf_x86_64_always_size_sections
6630 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
6631 #define elf_backend_object_p elf64_x86_64_elf_object_p
6632 #define bfd_elf64_mkobject elf_x86_64_mkobject
6633 #define bfd_elf64_get_synthetic_symtab elf_x86_64_get_synthetic_symtab
6635 #define elf_backend_section_from_shdr \
6636 elf_x86_64_section_from_shdr
6638 #define elf_backend_section_from_bfd_section \
6639 elf_x86_64_elf_section_from_bfd_section
6640 #define elf_backend_add_symbol_hook \
6641 elf_x86_64_add_symbol_hook
6642 #define elf_backend_symbol_processing \
6643 elf_x86_64_symbol_processing
6644 #define elf_backend_common_section_index \
6645 elf_x86_64_common_section_index
6646 #define elf_backend_common_section \
6647 elf_x86_64_common_section
6648 #define elf_backend_common_definition \
6649 elf_x86_64_common_definition
6650 #define elf_backend_merge_symbol \
6651 elf_x86_64_merge_symbol
6652 #define elf_backend_special_sections \
6653 elf_x86_64_special_sections
6654 #define elf_backend_additional_program_headers \
6655 elf_x86_64_additional_program_headers
6656 #define elf_backend_hash_symbol \
6657 elf_x86_64_hash_symbol
6658 #define elf_backend_omit_section_dynsym \
6659 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
6660 #define elf_backend_fixup_symbol \
6661 elf_x86_64_fixup_symbol
6663 #include "elf64-target.h"
6665 /* CloudABI support. */
6667 #undef TARGET_LITTLE_SYM
6668 #define TARGET_LITTLE_SYM x86_64_elf64_cloudabi_vec
6669 #undef TARGET_LITTLE_NAME
6670 #define TARGET_LITTLE_NAME "elf64-x86-64-cloudabi"
6673 #define ELF_OSABI ELFOSABI_CLOUDABI
6676 #define elf64_bed elf64_x86_64_cloudabi_bed
6678 #include "elf64-target.h"
6680 /* FreeBSD support. */
6682 #undef TARGET_LITTLE_SYM
6683 #define TARGET_LITTLE_SYM x86_64_elf64_fbsd_vec
6684 #undef TARGET_LITTLE_NAME
6685 #define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
6688 #define ELF_OSABI ELFOSABI_FREEBSD
6691 #define elf64_bed elf64_x86_64_fbsd_bed
6693 #include "elf64-target.h"
6695 /* Solaris 2 support. */
6697 #undef TARGET_LITTLE_SYM
6698 #define TARGET_LITTLE_SYM x86_64_elf64_sol2_vec
6699 #undef TARGET_LITTLE_NAME
6700 #define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
6702 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
6703 objects won't be recognized. */
6707 #define elf64_bed elf64_x86_64_sol2_bed
6709 /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
6711 #undef elf_backend_static_tls_alignment
6712 #define elf_backend_static_tls_alignment 16
6714 /* The Solaris 2 ABI requires a plt symbol on all platforms.
6716 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
6718 #undef elf_backend_want_plt_sym
6719 #define elf_backend_want_plt_sym 1
6721 #undef elf_backend_strtab_flags
6722 #define elf_backend_strtab_flags SHF_STRINGS
6725 elf64_x86_64_set_special_info_link (const bfd *ibfd ATTRIBUTE_UNUSED,
6726 bfd *obfd ATTRIBUTE_UNUSED,
6727 const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
6728 Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
6730 /* PR 19938: FIXME: Need to add code for setting the sh_info
6731 and sh_link fields of Solaris specific section types. */
6735 #undef elf_backend_set_special_section_info_and_link
6736 #define elf_backend_set_special_section_info_and_link elf64_x86_64_set_special_info_link
6738 #include "elf64-target.h"
6740 /* Native Client support. */
6743 elf64_x86_64_nacl_elf_object_p (bfd *abfd)
6745 /* Set the right machine number for a NaCl x86-64 ELF64 file. */
6746 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64_nacl);
6750 #undef TARGET_LITTLE_SYM
6751 #define TARGET_LITTLE_SYM x86_64_elf64_nacl_vec
6752 #undef TARGET_LITTLE_NAME
6753 #define TARGET_LITTLE_NAME "elf64-x86-64-nacl"
6755 #define elf64_bed elf64_x86_64_nacl_bed
6757 #undef ELF_MAXPAGESIZE
6758 #undef ELF_MINPAGESIZE
6759 #undef ELF_COMMONPAGESIZE
6760 #define ELF_MAXPAGESIZE 0x10000
6761 #define ELF_MINPAGESIZE 0x10000
6762 #define ELF_COMMONPAGESIZE 0x10000
6764 /* Restore defaults. */
6766 #undef elf_backend_static_tls_alignment
6767 #undef elf_backend_want_plt_sym
6768 #define elf_backend_want_plt_sym 0
6769 #undef elf_backend_strtab_flags
6770 #undef elf_backend_set_special_section_info_and_link
6772 /* NaCl uses substantially different PLT entries for the same effects. */
6774 #undef elf_backend_plt_alignment
6775 #define elf_backend_plt_alignment 5
6776 #define NACL_PLT_ENTRY_SIZE 64
6777 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
6779 static const bfd_byte elf_x86_64_nacl_plt0_entry[NACL_PLT_ENTRY_SIZE] =
6781 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
6782 0x4c, 0x8b, 0x1d, 16, 0, 0, 0, /* mov GOT+16(%rip), %r11 */
6783 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
6784 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
6785 0x41, 0xff, 0xe3, /* jmpq *%r11 */
6787 /* 9-byte nop sequence to pad out to the next 32-byte boundary. */
6788 0x66, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw 0x0(%rax,%rax,1) */
6790 /* 32 bytes of nop to pad out to the standard size. */
6791 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
6792 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6793 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
6794 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6795 0x66, /* excess data32 prefix */
6799 static const bfd_byte elf_x86_64_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
6801 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, /* mov name@GOTPCREL(%rip),%r11 */
6802 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
6803 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
6804 0x41, 0xff, 0xe3, /* jmpq *%r11 */
6806 /* 15-byte nop sequence to pad out to the next 32-byte boundary. */
6807 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
6808 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6810 /* Lazy GOT entries point here (32-byte aligned). */
6811 0x68, /* pushq immediate */
6812 0, 0, 0, 0, /* replaced with index into relocation table. */
6813 0xe9, /* jmp relative */
6814 0, 0, 0, 0, /* replaced with offset to start of .plt0. */
6816 /* 22 bytes of nop to pad out to the standard size. */
6817 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
6818 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6819 0x0f, 0x1f, 0x80, 0, 0, 0, 0, /* nopl 0x0(%rax) */
6822 /* .eh_frame covering the .plt section. */
6824 static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] =
6826 #if (PLT_CIE_LENGTH != 20 \
6827 || PLT_FDE_LENGTH != 36 \
6828 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
6829 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
6830 # error "Need elf_x86_64_backend_data parameters for eh_frame_plt offsets!"
6832 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
6833 0, 0, 0, 0, /* CIE ID */
6834 1, /* CIE version */
6835 'z', 'R', 0, /* Augmentation string */
6836 1, /* Code alignment factor */
6837 0x78, /* Data alignment factor */
6838 16, /* Return address column */
6839 1, /* Augmentation size */
6840 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
6841 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
6842 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
6843 DW_CFA_nop, DW_CFA_nop,
6845 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
6846 PLT_CIE_LENGTH + 8, 0, 0, 0,/* CIE pointer */
6847 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
6848 0, 0, 0, 0, /* .plt size goes here */
6849 0, /* Augmentation size */
6850 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
6851 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
6852 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
6853 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
6854 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
6855 13, /* Block length */
6856 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
6857 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
6858 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
6859 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
6860 DW_CFA_nop, DW_CFA_nop
6863 static const struct elf_x86_64_backend_data elf_x86_64_nacl_arch_bed =
6865 elf_x86_64_nacl_plt0_entry, /* plt0_entry */
6866 elf_x86_64_nacl_plt_entry, /* plt_entry */
6867 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
6868 2, /* plt0_got1_offset */
6869 9, /* plt0_got2_offset */
6870 13, /* plt0_got2_insn_end */
6871 3, /* plt_got_offset */
6872 33, /* plt_reloc_offset */
6873 38, /* plt_plt_offset */
6874 7, /* plt_got_insn_size */
6875 42, /* plt_plt_insn_end */
6876 32, /* plt_lazy_offset */
6877 elf_x86_64_nacl_eh_frame_plt, /* eh_frame_plt */
6878 sizeof (elf_x86_64_nacl_eh_frame_plt), /* eh_frame_plt_size */
6881 #undef elf_backend_arch_data
6882 #define elf_backend_arch_data &elf_x86_64_nacl_arch_bed
6884 #undef elf_backend_object_p
6885 #define elf_backend_object_p elf64_x86_64_nacl_elf_object_p
6886 #undef elf_backend_modify_segment_map
6887 #define elf_backend_modify_segment_map nacl_modify_segment_map
6888 #undef elf_backend_modify_program_headers
6889 #define elf_backend_modify_program_headers nacl_modify_program_headers
6890 #undef elf_backend_final_write_processing
6891 #define elf_backend_final_write_processing nacl_final_write_processing
6893 #include "elf64-target.h"
6895 /* Native Client x32 support. */
6898 elf32_x86_64_nacl_elf_object_p (bfd *abfd)
6900 /* Set the right machine number for a NaCl x86-64 ELF32 file. */
6901 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32_nacl);
6905 #undef TARGET_LITTLE_SYM
6906 #define TARGET_LITTLE_SYM x86_64_elf32_nacl_vec
6907 #undef TARGET_LITTLE_NAME
6908 #define TARGET_LITTLE_NAME "elf32-x86-64-nacl"
6910 #define elf32_bed elf32_x86_64_nacl_bed
6912 #define bfd_elf32_bfd_link_hash_table_create \
6913 elf_x86_64_link_hash_table_create
6914 #define bfd_elf32_bfd_reloc_type_lookup \
6915 elf_x86_64_reloc_type_lookup
6916 #define bfd_elf32_bfd_reloc_name_lookup \
6917 elf_x86_64_reloc_name_lookup
6918 #define bfd_elf32_mkobject \
6920 #define bfd_elf32_get_synthetic_symtab \
6921 elf_x86_64_get_synthetic_symtab
6923 #undef elf_backend_object_p
6924 #define elf_backend_object_p \
6925 elf32_x86_64_nacl_elf_object_p
6927 #undef elf_backend_bfd_from_remote_memory
6928 #define elf_backend_bfd_from_remote_memory \
6929 _bfd_elf32_bfd_from_remote_memory
6931 #undef elf_backend_size_info
6932 #define elf_backend_size_info \
6933 _bfd_elf32_size_info
6935 #include "elf32-target.h"
6937 /* Restore defaults. */
6938 #undef elf_backend_object_p
6939 #define elf_backend_object_p elf64_x86_64_elf_object_p
6940 #undef elf_backend_bfd_from_remote_memory
6941 #undef elf_backend_size_info
6942 #undef elf_backend_modify_segment_map
6943 #undef elf_backend_modify_program_headers
6944 #undef elf_backend_final_write_processing
6946 /* Intel L1OM support. */
6949 elf64_l1om_elf_object_p (bfd *abfd)
6951 /* Set the right machine number for an L1OM elf64 file. */
6952 bfd_default_set_arch_mach (abfd, bfd_arch_l1om, bfd_mach_l1om);
6956 #undef TARGET_LITTLE_SYM
6957 #define TARGET_LITTLE_SYM l1om_elf64_vec
6958 #undef TARGET_LITTLE_NAME
6959 #define TARGET_LITTLE_NAME "elf64-l1om"
6961 #define ELF_ARCH bfd_arch_l1om
6963 #undef ELF_MACHINE_CODE
6964 #define ELF_MACHINE_CODE EM_L1OM
6969 #define elf64_bed elf64_l1om_bed
6971 #undef elf_backend_object_p
6972 #define elf_backend_object_p elf64_l1om_elf_object_p
6974 /* Restore defaults. */
6975 #undef ELF_MAXPAGESIZE
6976 #undef ELF_MINPAGESIZE
6977 #undef ELF_COMMONPAGESIZE
6978 #define ELF_MAXPAGESIZE 0x200000
6979 #define ELF_MINPAGESIZE 0x1000
6980 #define ELF_COMMONPAGESIZE 0x1000
6981 #undef elf_backend_plt_alignment
6982 #define elf_backend_plt_alignment 4
6983 #undef elf_backend_arch_data
6984 #define elf_backend_arch_data &elf_x86_64_arch_bed
6986 #include "elf64-target.h"
6988 /* FreeBSD L1OM support. */
6990 #undef TARGET_LITTLE_SYM
6991 #define TARGET_LITTLE_SYM l1om_elf64_fbsd_vec
6992 #undef TARGET_LITTLE_NAME
6993 #define TARGET_LITTLE_NAME "elf64-l1om-freebsd"
6996 #define ELF_OSABI ELFOSABI_FREEBSD
6999 #define elf64_bed elf64_l1om_fbsd_bed
7001 #include "elf64-target.h"
7003 /* Intel K1OM support. */
7006 elf64_k1om_elf_object_p (bfd *abfd)
7008 /* Set the right machine number for an K1OM elf64 file. */
7009 bfd_default_set_arch_mach (abfd, bfd_arch_k1om, bfd_mach_k1om);
7013 #undef TARGET_LITTLE_SYM
7014 #define TARGET_LITTLE_SYM k1om_elf64_vec
7015 #undef TARGET_LITTLE_NAME
7016 #define TARGET_LITTLE_NAME "elf64-k1om"
7018 #define ELF_ARCH bfd_arch_k1om
7020 #undef ELF_MACHINE_CODE
7021 #define ELF_MACHINE_CODE EM_K1OM
7026 #define elf64_bed elf64_k1om_bed
7028 #undef elf_backend_object_p
7029 #define elf_backend_object_p elf64_k1om_elf_object_p
7031 #undef elf_backend_static_tls_alignment
7033 #undef elf_backend_want_plt_sym
7034 #define elf_backend_want_plt_sym 0
7036 #include "elf64-target.h"
7038 /* FreeBSD K1OM support. */
7040 #undef TARGET_LITTLE_SYM
7041 #define TARGET_LITTLE_SYM k1om_elf64_fbsd_vec
7042 #undef TARGET_LITTLE_NAME
7043 #define TARGET_LITTLE_NAME "elf64-k1om-freebsd"
7046 #define ELF_OSABI ELFOSABI_FREEBSD
7049 #define elf64_bed elf64_k1om_fbsd_bed
7051 #include "elf64-target.h"
7053 /* 32bit x86-64 support. */
7055 #undef TARGET_LITTLE_SYM
7056 #define TARGET_LITTLE_SYM x86_64_elf32_vec
7057 #undef TARGET_LITTLE_NAME
7058 #define TARGET_LITTLE_NAME "elf32-x86-64"
7062 #define ELF_ARCH bfd_arch_i386
7064 #undef ELF_MACHINE_CODE
7065 #define ELF_MACHINE_CODE EM_X86_64
7069 #undef elf_backend_object_p
7070 #define elf_backend_object_p \
7071 elf32_x86_64_elf_object_p
7073 #undef elf_backend_bfd_from_remote_memory
7074 #define elf_backend_bfd_from_remote_memory \
7075 _bfd_elf32_bfd_from_remote_memory
7077 #undef elf_backend_size_info
7078 #define elf_backend_size_info \
7079 _bfd_elf32_size_info
7081 #include "elf32-target.h"