1 /* X86-64 specific support for ELF
2 Copyright (C) 2000-2017 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 /* xgettext:c-format */
289 _bfd_error_handler (_("%B: invalid relocation type %d"),
291 r_type = R_X86_64_NONE;
296 i = r_type - (unsigned int) R_X86_64_vt_offset;
297 BFD_ASSERT (x86_64_elf_howto_table[i].type == r_type);
298 return &x86_64_elf_howto_table[i];
301 /* Given a BFD reloc type, return a HOWTO structure. */
302 static reloc_howto_type *
303 elf_x86_64_reloc_type_lookup (bfd *abfd,
304 bfd_reloc_code_real_type code)
308 for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
311 if (x86_64_reloc_map[i].bfd_reloc_val == code)
312 return elf_x86_64_rtype_to_howto (abfd,
313 x86_64_reloc_map[i].elf_reloc_val);
318 static reloc_howto_type *
319 elf_x86_64_reloc_name_lookup (bfd *abfd,
324 if (!ABI_64_P (abfd) && strcasecmp (r_name, "R_X86_64_32") == 0)
326 /* Get x32 R_X86_64_32. */
327 reloc_howto_type *reloc
328 = &x86_64_elf_howto_table[ARRAY_SIZE (x86_64_elf_howto_table) - 1];
329 BFD_ASSERT (reloc->type == (unsigned int) R_X86_64_32);
333 for (i = 0; i < ARRAY_SIZE (x86_64_elf_howto_table); i++)
334 if (x86_64_elf_howto_table[i].name != NULL
335 && strcasecmp (x86_64_elf_howto_table[i].name, r_name) == 0)
336 return &x86_64_elf_howto_table[i];
341 /* Given an x86_64 ELF reloc type, fill in an arelent structure. */
344 elf_x86_64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
345 Elf_Internal_Rela *dst)
349 r_type = ELF32_R_TYPE (dst->r_info);
350 cache_ptr->howto = elf_x86_64_rtype_to_howto (abfd, r_type);
351 BFD_ASSERT (r_type == cache_ptr->howto->type);
354 /* Support for core dump NOTE sections. */
356 elf_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
361 switch (note->descsz)
366 case 296: /* sizeof(istruct elf_prstatus) on Linux/x32 */
368 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
371 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
379 case 336: /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
381 elf_tdata (abfd)->core->signal
382 = bfd_get_16 (abfd, note->descdata + 12);
385 elf_tdata (abfd)->core->lwpid
386 = bfd_get_32 (abfd, note->descdata + 32);
395 /* Make a ".reg/999" section. */
396 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
397 size, note->descpos + offset);
401 elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
403 switch (note->descsz)
408 case 124: /* sizeof(struct elf_prpsinfo) on Linux/x32 */
409 elf_tdata (abfd)->core->pid
410 = bfd_get_32 (abfd, note->descdata + 12);
411 elf_tdata (abfd)->core->program
412 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
413 elf_tdata (abfd)->core->command
414 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
417 case 136: /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
418 elf_tdata (abfd)->core->pid
419 = bfd_get_32 (abfd, note->descdata + 24);
420 elf_tdata (abfd)->core->program
421 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
422 elf_tdata (abfd)->core->command
423 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
426 /* Note that for some reason, a spurious space is tacked
427 onto the end of the args in some (at least one anyway)
428 implementations, so strip it off if it exists. */
431 char *command = elf_tdata (abfd)->core->command;
432 int n = strlen (command);
434 if (0 < n && command[n - 1] == ' ')
435 command[n - 1] = '\0';
443 elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
446 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
448 const char *fname, *psargs;
459 va_start (ap, note_type);
460 fname = va_arg (ap, const char *);
461 psargs = va_arg (ap, const char *);
464 if (bed->s->elfclass == ELFCLASS32)
467 memset (&data, 0, sizeof (data));
468 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
469 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
470 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
471 &data, sizeof (data));
476 memset (&data, 0, sizeof (data));
477 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
478 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
479 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
480 &data, sizeof (data));
485 va_start (ap, note_type);
486 pid = va_arg (ap, long);
487 cursig = va_arg (ap, int);
488 gregs = va_arg (ap, const void *);
491 if (bed->s->elfclass == ELFCLASS32)
493 if (bed->elf_machine_code == EM_X86_64)
495 prstatusx32_t prstat;
496 memset (&prstat, 0, sizeof (prstat));
498 prstat.pr_cursig = cursig;
499 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
500 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
501 &prstat, sizeof (prstat));
506 memset (&prstat, 0, sizeof (prstat));
508 prstat.pr_cursig = cursig;
509 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
510 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
511 &prstat, sizeof (prstat));
517 memset (&prstat, 0, sizeof (prstat));
519 prstat.pr_cursig = cursig;
520 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
521 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
522 &prstat, sizeof (prstat));
529 /* Functions for the x86-64 ELF linker. */
531 /* The name of the dynamic interpreter. This is put in the .interp
534 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
535 #define ELF32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
537 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
538 copying dynamic variables from a shared lib into an app's dynbss
539 section, and instead use a dynamic relocation to point into the
541 #define ELIMINATE_COPY_RELOCS 1
543 /* The size in bytes of an entry in the global offset table. */
545 #define GOT_ENTRY_SIZE 8
547 /* The size in bytes of an entry in the lazy procedure linkage table. */
549 #define LAZY_PLT_ENTRY_SIZE 16
551 /* The size in bytes of an entry in the non-lazy procedure linkage
554 #define NON_LAZY_PLT_ENTRY_SIZE 8
556 /* The first entry in a lazy procedure linkage table looks like this.
557 See the SVR4 ABI i386 supplement and the x86-64 ABI to see how this
560 static const bfd_byte elf_x86_64_lazy_plt0_entry[LAZY_PLT_ENTRY_SIZE] =
562 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
563 0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */
564 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */
567 /* Subsequent entries in a lazy procedure linkage table look like this. */
569 static const bfd_byte elf_x86_64_lazy_plt_entry[LAZY_PLT_ENTRY_SIZE] =
571 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
572 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
573 0x68, /* pushq immediate */
574 0, 0, 0, 0, /* replaced with index into relocation table. */
575 0xe9, /* jmp relative */
576 0, 0, 0, 0 /* replaced with offset to start of .plt0. */
579 /* The first entry in a lazy procedure linkage table with BND prefix
582 static const bfd_byte elf_x86_64_lazy_bnd_plt0_entry[LAZY_PLT_ENTRY_SIZE] =
584 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
585 0xf2, 0xff, 0x25, 16, 0, 0, 0, /* bnd jmpq *GOT+16(%rip) */
586 0x0f, 0x1f, 0 /* nopl (%rax) */
589 /* Subsequent entries for branches with BND prefx in a lazy procedure
590 linkage table look like this. */
592 static const bfd_byte elf_x86_64_lazy_bnd_plt_entry[LAZY_PLT_ENTRY_SIZE] =
594 0x68, 0, 0, 0, 0, /* pushq immediate */
595 0xf2, 0xe9, 0, 0, 0, 0, /* bnd jmpq relative */
596 0x0f, 0x1f, 0x44, 0, 0 /* nopl 0(%rax,%rax,1) */
599 /* Entries in the non-lazey procedure linkage table look like this. */
601 static const bfd_byte elf_x86_64_non_lazy_plt_entry[NON_LAZY_PLT_ENTRY_SIZE] =
603 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
604 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
605 0x66, 0x90 /* xchg %ax,%ax */
608 /* Entries for branches with BND prefix in the non-lazey procedure
609 linkage table look like this. */
611 static const bfd_byte elf_x86_64_non_lazy_bnd_plt_entry[NON_LAZY_PLT_ENTRY_SIZE] =
613 0xf2, 0xff, 0x25, /* bnd jmpq *name@GOTPC(%rip) */
614 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
618 /* .eh_frame covering the lazy .plt section. */
620 static const bfd_byte elf_x86_64_eh_frame_lazy_plt[] =
622 #define PLT_CIE_LENGTH 20
623 #define PLT_FDE_LENGTH 36
624 #define PLT_FDE_START_OFFSET 4 + PLT_CIE_LENGTH + 8
625 #define PLT_FDE_LEN_OFFSET 4 + PLT_CIE_LENGTH + 12
626 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
627 0, 0, 0, 0, /* CIE ID */
629 'z', 'R', 0, /* Augmentation string */
630 1, /* Code alignment factor */
631 0x78, /* Data alignment factor */
632 16, /* Return address column */
633 1, /* Augmentation size */
634 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
635 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
636 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
637 DW_CFA_nop, DW_CFA_nop,
639 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
640 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
641 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
642 0, 0, 0, 0, /* .plt size goes here */
643 0, /* Augmentation size */
644 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
645 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
646 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
647 DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
648 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
649 11, /* Block length */
650 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
651 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
652 DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
653 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
654 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
657 /* .eh_frame covering the lazy BND .plt section. */
659 static const bfd_byte elf_x86_64_eh_frame_lazy_bnd_plt[] =
661 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
662 0, 0, 0, 0, /* CIE ID */
664 'z', 'R', 0, /* Augmentation string */
665 1, /* Code alignment factor */
666 0x78, /* Data alignment factor */
667 16, /* Return address column */
668 1, /* Augmentation size */
669 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
670 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
671 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
672 DW_CFA_nop, DW_CFA_nop,
674 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
675 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
676 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
677 0, 0, 0, 0, /* .plt size goes here */
678 0, /* Augmentation size */
679 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
680 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
681 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
682 DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
683 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
684 11, /* Block length */
685 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
686 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
687 DW_OP_lit15, DW_OP_and, DW_OP_lit5, DW_OP_ge,
688 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
689 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
692 /* .eh_frame covering the non-lazy .plt section. */
694 static const bfd_byte elf_x86_64_eh_frame_non_lazy_plt[] =
696 #define PLT_GOT_FDE_LENGTH 20
697 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
698 0, 0, 0, 0, /* CIE ID */
700 'z', 'R', 0, /* Augmentation string */
701 1, /* Code alignment factor */
702 0x78, /* Data alignment factor */
703 16, /* Return address column */
704 1, /* Augmentation size */
705 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
706 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
707 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
708 DW_CFA_nop, DW_CFA_nop,
710 PLT_GOT_FDE_LENGTH, 0, 0, 0, /* FDE length */
711 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
712 0, 0, 0, 0, /* the start of non-lazy .plt goes here */
713 0, 0, 0, 0, /* non-lazy .plt size goes here */
714 0, /* Augmentation size */
715 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop,
716 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
719 struct elf_x86_64_lazy_plt_layout
721 /* Templates for the initial PLT entry and for subsequent entries. */
722 const bfd_byte *plt0_entry;
723 const bfd_byte *plt_entry;
724 unsigned int plt_entry_size; /* Size of each PLT entry. */
726 /* Offsets into plt0_entry that are to be replaced with GOT[1] and GOT[2]. */
727 unsigned int plt0_got1_offset;
728 unsigned int plt0_got2_offset;
730 /* Offset of the end of the PC-relative instruction containing
732 unsigned int plt0_got2_insn_end;
734 /* Offsets into plt_entry that are to be replaced with... */
735 unsigned int plt_got_offset; /* ... address of this symbol in .got. */
736 unsigned int plt_reloc_offset; /* ... offset into relocation table. */
737 unsigned int plt_plt_offset; /* ... offset to start of .plt. */
739 /* Length of the PC-relative instruction containing plt_got_offset. */
740 unsigned int plt_got_insn_size;
742 /* Offset of the end of the PC-relative jump to plt0_entry. */
743 unsigned int plt_plt_insn_end;
745 /* Offset into plt_entry where the initial value of the GOT entry points. */
746 unsigned int plt_lazy_offset;
748 /* .eh_frame covering the lazy .plt section. */
749 const bfd_byte *eh_frame_plt;
750 unsigned int eh_frame_plt_size;
753 struct elf_x86_64_non_lazy_plt_layout
755 /* Template for the lazy PLT entries. */
756 const bfd_byte *plt_entry;
757 unsigned int plt_entry_size; /* Size of each PLT entry. */
759 /* Offsets into plt_entry that are to be replaced with... */
760 unsigned int plt_got_offset; /* ... address of this symbol in .got. */
762 /* Length of the PC-relative instruction containing plt_got_offset. */
763 unsigned int plt_got_insn_size;
765 /* .eh_frame covering the non-lazy .plt section. */
766 const bfd_byte *eh_frame_plt;
767 unsigned int eh_frame_plt_size;
770 struct elf_x86_64_plt_layout
772 /* Template for the PLT entries. */
773 const bfd_byte *plt_entry;
774 unsigned int plt_entry_size; /* Size of each PLT entry. */
777 unsigned int has_plt0;
779 /* Offsets into plt_entry that are to be replaced with... */
780 unsigned int plt_got_offset; /* ... address of this symbol in .got. */
782 /* Length of the PC-relative instruction containing plt_got_offset. */
783 unsigned int plt_got_insn_size;
785 /* .eh_frame covering the .plt section. */
786 const bfd_byte *eh_frame_plt;
787 unsigned int eh_frame_plt_size;
790 /* Architecture-specific backend data for x86-64. */
792 struct elf_x86_64_backend_data
802 #define get_elf_x86_64_arch_data(bed) \
803 ((const struct elf_x86_64_backend_data *) (bed)->arch_data)
805 #define get_elf_x86_64_backend_data(abfd) \
806 get_elf_x86_64_arch_data (get_elf_backend_data (abfd))
808 /* These are the standard parameters. */
809 static const struct elf_x86_64_lazy_plt_layout elf_x86_64_lazy_plt =
811 elf_x86_64_lazy_plt0_entry, /* plt0_entry */
812 elf_x86_64_lazy_plt_entry, /* plt_entry */
813 LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
814 2, /* plt0_got1_offset */
815 8, /* plt0_got2_offset */
816 12, /* plt0_got2_insn_end */
817 2, /* plt_got_offset */
818 7, /* plt_reloc_offset */
819 12, /* plt_plt_offset */
820 6, /* plt_got_insn_size */
821 LAZY_PLT_ENTRY_SIZE, /* plt_plt_insn_end */
822 6, /* plt_lazy_offset */
823 elf_x86_64_eh_frame_lazy_plt, /* eh_frame_plt */
824 sizeof (elf_x86_64_eh_frame_lazy_plt) /* eh_frame_plt_size */
827 static const struct elf_x86_64_non_lazy_plt_layout elf_x86_64_non_lazy_plt =
829 elf_x86_64_non_lazy_plt_entry, /* plt_entry */
830 NON_LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
831 2, /* plt_got_offset */
832 6, /* plt_got_insn_size */
833 elf_x86_64_eh_frame_non_lazy_plt, /* eh_frame_plt */
834 sizeof (elf_x86_64_eh_frame_non_lazy_plt) /* eh_frame_plt_size */
837 static const struct elf_x86_64_lazy_plt_layout elf_x86_64_lazy_bnd_plt =
839 elf_x86_64_lazy_bnd_plt0_entry, /* plt0_entry */
840 elf_x86_64_lazy_bnd_plt_entry, /* plt_entry */
841 LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
842 2, /* plt0_got1_offset */
843 1+8, /* plt0_got2_offset */
844 1+12, /* plt0_got2_insn_end */
845 1+2, /* plt_got_offset */
846 1, /* plt_reloc_offset */
847 7, /* plt_plt_offset */
848 1+6, /* plt_got_insn_size */
849 11, /* plt_plt_insn_end */
850 0, /* plt_lazy_offset */
851 elf_x86_64_eh_frame_lazy_bnd_plt, /* eh_frame_plt */
852 sizeof (elf_x86_64_eh_frame_lazy_bnd_plt) /* eh_frame_plt_size */
855 static const struct elf_x86_64_non_lazy_plt_layout elf_x86_64_non_lazy_bnd_plt =
857 elf_x86_64_non_lazy_bnd_plt_entry, /* plt_entry */
858 NON_LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
859 1+2, /* plt_got_offset */
860 1+6, /* plt_got_insn_size */
861 elf_x86_64_eh_frame_non_lazy_plt, /* eh_frame_plt */
862 sizeof (elf_x86_64_eh_frame_non_lazy_plt) /* eh_frame_plt_size */
865 static const struct elf_x86_64_backend_data elf_x86_64_arch_bed =
870 #define elf_backend_arch_data &elf_x86_64_arch_bed
872 /* Is a undefined weak symbol which is resolved to 0. Reference to an
873 undefined weak symbol is resolved to 0 when building executable if
875 1. Has non-GOT/non-PLT relocations in text section. Or
876 2. Has no GOT/PLT relocation.
878 #define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, GOT_RELOC, EH) \
879 ((EH)->elf.root.type == bfd_link_hash_undefweak \
880 && bfd_link_executable (INFO) \
881 && (elf_x86_64_hash_table (INFO)->interp == NULL \
883 || (EH)->has_non_got_reloc \
884 || !(INFO)->dynamic_undefined_weak))
886 /* x86-64 ELF linker hash entry. */
888 struct elf_x86_64_link_hash_entry
890 struct elf_link_hash_entry elf;
892 /* Track dynamic relocs copied for this symbol. */
893 struct elf_dyn_relocs *dyn_relocs;
895 #define GOT_UNKNOWN 0
899 #define GOT_TLS_GDESC 4
900 #define GOT_TLS_GD_BOTH_P(type) \
901 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
902 #define GOT_TLS_GD_P(type) \
903 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
904 #define GOT_TLS_GDESC_P(type) \
905 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
906 #define GOT_TLS_GD_ANY_P(type) \
907 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
908 unsigned char tls_type;
910 /* TRUE if a weak symbol with a real definition needs a copy reloc.
911 When there is a weak symbol with a real definition, the processor
912 independent code will have arranged for us to see the real
913 definition first. We need to copy the needs_copy bit from the
914 real definition and check it when allowing copy reloc in PIE. */
915 unsigned int needs_copy : 1;
917 /* TRUE if symbol has GOT or PLT relocations. */
918 unsigned int has_got_reloc : 1;
920 /* TRUE if symbol has non-GOT/non-PLT relocations in text sections. */
921 unsigned int has_non_got_reloc : 1;
923 /* Don't call finish_dynamic_symbol on this symbol. */
924 unsigned int no_finish_dynamic_symbol : 1;
926 /* 0: symbol isn't __tls_get_addr.
927 1: symbol is __tls_get_addr.
928 2: symbol is unknown. */
929 unsigned int tls_get_addr : 2;
931 /* Reference count of C/C++ function pointer relocations in read-write
932 section which can be resolved at run-time. */
933 bfd_signed_vma func_pointer_refcount;
935 /* Information about the GOT PLT entry. Filled when there are both
936 GOT and PLT relocations against the same function. */
937 union gotplt_union plt_got;
939 /* Information about the second PLT entry. */
940 union gotplt_union plt_second;
942 /* Offset of the GOTPLT entry reserved for the TLS descriptor,
943 starting at the end of the jump table. */
947 #define elf_x86_64_hash_entry(ent) \
948 ((struct elf_x86_64_link_hash_entry *)(ent))
950 struct elf_x86_64_obj_tdata
952 struct elf_obj_tdata root;
954 /* tls_type for each local got entry. */
955 char *local_got_tls_type;
957 /* GOTPLT entries for TLS descriptors. */
958 bfd_vma *local_tlsdesc_gotent;
961 #define elf_x86_64_tdata(abfd) \
962 ((struct elf_x86_64_obj_tdata *) (abfd)->tdata.any)
964 #define elf_x86_64_local_got_tls_type(abfd) \
965 (elf_x86_64_tdata (abfd)->local_got_tls_type)
967 #define elf_x86_64_local_tlsdesc_gotent(abfd) \
968 (elf_x86_64_tdata (abfd)->local_tlsdesc_gotent)
970 #define is_x86_64_elf(bfd) \
971 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
972 && elf_tdata (bfd) != NULL \
973 && elf_object_id (bfd) == X86_64_ELF_DATA)
976 elf_x86_64_mkobject (bfd *abfd)
978 return bfd_elf_allocate_object (abfd, sizeof (struct elf_x86_64_obj_tdata),
982 /* x86-64 ELF linker hash table. */
984 struct elf_x86_64_link_hash_table
986 struct elf_link_hash_table elf;
988 /* Short-cuts to get to dynamic linker sections. */
990 asection *plt_eh_frame;
991 asection *plt_second;
992 asection *plt_second_eh_frame;
994 asection *plt_got_eh_frame;
996 /* Parameters describing PLT generation, lazy or non-lazy. */
997 struct elf_x86_64_plt_layout plt;
999 /* Parameters describing lazy PLT generation. */
1000 const struct elf_x86_64_lazy_plt_layout *lazy_plt;
1002 /* Parameters describing non-lazy PLT generation. */
1003 const struct elf_x86_64_non_lazy_plt_layout *non_lazy_plt;
1007 bfd_signed_vma refcount;
1011 /* The amount of space used by the jump slots in the GOT. */
1012 bfd_vma sgotplt_jump_table_size;
1014 /* Small local sym cache. */
1015 struct sym_cache sym_cache;
1017 bfd_vma (*r_info) (bfd_vma, bfd_vma);
1018 bfd_vma (*r_sym) (bfd_vma);
1019 unsigned int pointer_r_type;
1020 const char *dynamic_interpreter;
1021 int dynamic_interpreter_size;
1023 /* _TLS_MODULE_BASE_ symbol. */
1024 struct bfd_link_hash_entry *tls_module_base;
1026 /* Used by local STT_GNU_IFUNC symbols. */
1027 htab_t loc_hash_table;
1028 void * loc_hash_memory;
1030 /* The offset into splt of the PLT entry for the TLS descriptor
1031 resolver. Special values are 0, if not necessary (or not found
1032 to be necessary yet), and -1 if needed but not determined
1034 bfd_vma tlsdesc_plt;
1035 /* The offset into sgot of the GOT entry used by the PLT entry
1037 bfd_vma tlsdesc_got;
1039 /* The index of the next R_X86_64_JUMP_SLOT entry in .rela.plt. */
1040 bfd_vma next_jump_slot_index;
1041 /* The index of the next R_X86_64_IRELATIVE entry in .rela.plt. */
1042 bfd_vma next_irelative_index;
1044 /* TRUE if there are dynamic relocs against IFUNC symbols that apply
1045 to read-only sections. */
1046 bfd_boolean readonly_dynrelocs_against_ifunc;
1049 /* Get the x86-64 ELF linker hash table from a link_info structure. */
1051 #define elf_x86_64_hash_table(p) \
1052 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
1053 == X86_64_ELF_DATA ? ((struct elf_x86_64_link_hash_table *) ((p)->hash)) : NULL)
1055 #define elf_x86_64_compute_jump_table_size(htab) \
1056 ((htab)->elf.srelplt->reloc_count * GOT_ENTRY_SIZE)
1058 /* Create an entry in an x86-64 ELF linker hash table. */
1060 static struct bfd_hash_entry *
1061 elf_x86_64_link_hash_newfunc (struct bfd_hash_entry *entry,
1062 struct bfd_hash_table *table,
1065 /* Allocate the structure if it has not already been allocated by a
1069 entry = (struct bfd_hash_entry *)
1070 bfd_hash_allocate (table,
1071 sizeof (struct elf_x86_64_link_hash_entry));
1076 /* Call the allocation method of the superclass. */
1077 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
1080 struct elf_x86_64_link_hash_entry *eh;
1082 eh = (struct elf_x86_64_link_hash_entry *) entry;
1083 eh->dyn_relocs = NULL;
1084 eh->tls_type = GOT_UNKNOWN;
1086 eh->has_got_reloc = 0;
1087 eh->has_non_got_reloc = 0;
1088 eh->no_finish_dynamic_symbol = 0;
1089 eh->tls_get_addr = 2;
1090 eh->func_pointer_refcount = 0;
1091 eh->plt_second.offset = (bfd_vma) -1;
1092 eh->plt_got.offset = (bfd_vma) -1;
1093 eh->tlsdesc_got = (bfd_vma) -1;
1099 /* Compute a hash of a local hash entry. We use elf_link_hash_entry
1100 for local symbol so that we can handle local STT_GNU_IFUNC symbols
1101 as global symbol. We reuse indx and dynstr_index for local symbol
1102 hash since they aren't used by global symbols in this backend. */
1105 elf_x86_64_local_htab_hash (const void *ptr)
1107 struct elf_link_hash_entry *h
1108 = (struct elf_link_hash_entry *) ptr;
1109 return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
1112 /* Compare local hash entries. */
1115 elf_x86_64_local_htab_eq (const void *ptr1, const void *ptr2)
1117 struct elf_link_hash_entry *h1
1118 = (struct elf_link_hash_entry *) ptr1;
1119 struct elf_link_hash_entry *h2
1120 = (struct elf_link_hash_entry *) ptr2;
1122 return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
1125 /* Find and/or create a hash entry for local symbol. */
1127 static struct elf_link_hash_entry *
1128 elf_x86_64_get_local_sym_hash (struct elf_x86_64_link_hash_table *htab,
1129 bfd *abfd, const Elf_Internal_Rela *rel,
1132 struct elf_x86_64_link_hash_entry e, *ret;
1133 asection *sec = abfd->sections;
1134 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
1135 htab->r_sym (rel->r_info));
1138 e.elf.indx = sec->id;
1139 e.elf.dynstr_index = htab->r_sym (rel->r_info);
1140 slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
1141 create ? INSERT : NO_INSERT);
1148 ret = (struct elf_x86_64_link_hash_entry *) *slot;
1152 ret = (struct elf_x86_64_link_hash_entry *)
1153 objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
1154 sizeof (struct elf_x86_64_link_hash_entry));
1157 memset (ret, 0, sizeof (*ret));
1158 ret->elf.indx = sec->id;
1159 ret->elf.dynstr_index = htab->r_sym (rel->r_info);
1160 ret->elf.dynindx = -1;
1161 ret->func_pointer_refcount = 0;
1162 ret->plt_got.offset = (bfd_vma) -1;
1168 /* Destroy an X86-64 ELF linker hash table. */
1171 elf_x86_64_link_hash_table_free (bfd *obfd)
1173 struct elf_x86_64_link_hash_table *htab
1174 = (struct elf_x86_64_link_hash_table *) obfd->link.hash;
1176 if (htab->loc_hash_table)
1177 htab_delete (htab->loc_hash_table);
1178 if (htab->loc_hash_memory)
1179 objalloc_free ((struct objalloc *) htab->loc_hash_memory);
1180 _bfd_elf_link_hash_table_free (obfd);
1183 /* Create an X86-64 ELF linker hash table. */
1185 static struct bfd_link_hash_table *
1186 elf_x86_64_link_hash_table_create (bfd *abfd)
1188 struct elf_x86_64_link_hash_table *ret;
1189 bfd_size_type amt = sizeof (struct elf_x86_64_link_hash_table);
1191 ret = (struct elf_x86_64_link_hash_table *) bfd_zmalloc (amt);
1195 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
1196 elf_x86_64_link_hash_newfunc,
1197 sizeof (struct elf_x86_64_link_hash_entry),
1204 if (ABI_64_P (abfd))
1206 ret->r_info = elf64_r_info;
1207 ret->r_sym = elf64_r_sym;
1208 ret->pointer_r_type = R_X86_64_64;
1209 ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
1210 ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
1214 ret->r_info = elf32_r_info;
1215 ret->r_sym = elf32_r_sym;
1216 ret->pointer_r_type = R_X86_64_32;
1217 ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
1218 ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER;
1221 ret->loc_hash_table = htab_try_create (1024,
1222 elf_x86_64_local_htab_hash,
1223 elf_x86_64_local_htab_eq,
1225 ret->loc_hash_memory = objalloc_create ();
1226 if (!ret->loc_hash_table || !ret->loc_hash_memory)
1228 elf_x86_64_link_hash_table_free (abfd);
1231 ret->elf.root.hash_table_free = elf_x86_64_link_hash_table_free;
1233 return &ret->elf.root;
1236 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1239 elf_x86_64_copy_indirect_symbol (struct bfd_link_info *info,
1240 struct elf_link_hash_entry *dir,
1241 struct elf_link_hash_entry *ind)
1243 struct elf_x86_64_link_hash_entry *edir, *eind;
1245 edir = (struct elf_x86_64_link_hash_entry *) dir;
1246 eind = (struct elf_x86_64_link_hash_entry *) ind;
1248 edir->has_got_reloc |= eind->has_got_reloc;
1249 edir->has_non_got_reloc |= eind->has_non_got_reloc;
1251 if (eind->dyn_relocs != NULL)
1253 if (edir->dyn_relocs != NULL)
1255 struct elf_dyn_relocs **pp;
1256 struct elf_dyn_relocs *p;
1258 /* Add reloc counts against the indirect sym to the direct sym
1259 list. Merge any entries against the same section. */
1260 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1262 struct elf_dyn_relocs *q;
1264 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1265 if (q->sec == p->sec)
1267 q->pc_count += p->pc_count;
1268 q->count += p->count;
1275 *pp = edir->dyn_relocs;
1278 edir->dyn_relocs = eind->dyn_relocs;
1279 eind->dyn_relocs = NULL;
1282 if (ind->root.type == bfd_link_hash_indirect
1283 && dir->got.refcount <= 0)
1285 edir->tls_type = eind->tls_type;
1286 eind->tls_type = GOT_UNKNOWN;
1289 if (ELIMINATE_COPY_RELOCS
1290 && ind->root.type != bfd_link_hash_indirect
1291 && dir->dynamic_adjusted)
1293 /* If called to transfer flags for a weakdef during processing
1294 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1295 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1296 if (dir->versioned != versioned_hidden)
1297 dir->ref_dynamic |= ind->ref_dynamic;
1298 dir->ref_regular |= ind->ref_regular;
1299 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1300 dir->needs_plt |= ind->needs_plt;
1301 dir->pointer_equality_needed |= ind->pointer_equality_needed;
1305 if (eind->func_pointer_refcount > 0)
1307 edir->func_pointer_refcount += eind->func_pointer_refcount;
1308 eind->func_pointer_refcount = 0;
1311 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1316 elf64_x86_64_elf_object_p (bfd *abfd)
1318 /* Set the right machine number for an x86-64 elf64 file. */
1319 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
1324 elf32_x86_64_elf_object_p (bfd *abfd)
1326 /* Set the right machine number for an x86-64 elf32 file. */
1327 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32);
1331 /* Return TRUE if the TLS access code sequence support transition
1335 elf_x86_64_check_tls_transition (bfd *abfd,
1336 struct bfd_link_info *info,
1339 Elf_Internal_Shdr *symtab_hdr,
1340 struct elf_link_hash_entry **sym_hashes,
1341 unsigned int r_type,
1342 const Elf_Internal_Rela *rel,
1343 const Elf_Internal_Rela *relend)
1346 unsigned long r_symndx;
1347 bfd_boolean largepic = FALSE;
1348 struct elf_link_hash_entry *h;
1350 struct elf_x86_64_link_hash_table *htab;
1352 bfd_boolean indirect_call, tls_get_addr;
1354 htab = elf_x86_64_hash_table (info);
1355 offset = rel->r_offset;
1358 case R_X86_64_TLSGD:
1359 case R_X86_64_TLSLD:
1360 if ((rel + 1) >= relend)
1363 if (r_type == R_X86_64_TLSGD)
1365 /* Check transition from GD access model. For 64bit, only
1366 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
1367 .word 0x6666; rex64; call __tls_get_addr@PLT
1369 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
1371 call *__tls_get_addr@GOTPCREL(%rip)
1372 which may be converted to
1373 addr32 call __tls_get_addr
1374 can transit to different access model. For 32bit, only
1375 leaq foo@tlsgd(%rip), %rdi
1376 .word 0x6666; rex64; call __tls_get_addr@PLT
1378 leaq foo@tlsgd(%rip), %rdi
1380 call *__tls_get_addr@GOTPCREL(%rip)
1381 which may be converted to
1382 addr32 call __tls_get_addr
1383 can transit to different access model. For largepic,
1385 leaq foo@tlsgd(%rip), %rdi
1386 movabsq $__tls_get_addr@pltoff, %rax
1390 leaq foo@tlsgd(%rip), %rdi
1391 movabsq $__tls_get_addr@pltoff, %rax
1395 static const unsigned char leaq[] = { 0x66, 0x48, 0x8d, 0x3d };
1397 if ((offset + 12) > sec->size)
1400 call = contents + offset + 4;
1402 || !((call[1] == 0x48
1410 && call[3] == 0xe8)))
1412 if (!ABI_64_P (abfd)
1413 || (offset + 19) > sec->size
1415 || memcmp (call - 7, leaq + 1, 3) != 0
1416 || memcmp (call, "\x48\xb8", 2) != 0
1420 || !((call[10] == 0x48 && call[12] == 0xd8)
1421 || (call[10] == 0x4c && call[12] == 0xf8)))
1425 else if (ABI_64_P (abfd))
1428 || memcmp (contents + offset - 4, leaq, 4) != 0)
1434 || memcmp (contents + offset - 3, leaq + 1, 3) != 0)
1437 indirect_call = call[2] == 0xff;
1441 /* Check transition from LD access model. Only
1442 leaq foo@tlsld(%rip), %rdi;
1443 call __tls_get_addr@PLT
1445 leaq foo@tlsld(%rip), %rdi;
1446 call *__tls_get_addr@GOTPCREL(%rip)
1447 which may be converted to
1448 addr32 call __tls_get_addr
1449 can transit to different access model. For largepic
1451 leaq foo@tlsld(%rip), %rdi
1452 movabsq $__tls_get_addr@pltoff, %rax
1456 leaq foo@tlsld(%rip), %rdi
1457 movabsq $__tls_get_addr@pltoff, %rax
1461 static const unsigned char lea[] = { 0x48, 0x8d, 0x3d };
1463 if (offset < 3 || (offset + 9) > sec->size)
1466 if (memcmp (contents + offset - 3, lea, 3) != 0)
1469 call = contents + offset + 4;
1470 if (!(call[0] == 0xe8
1471 || (call[0] == 0xff && call[1] == 0x15)
1472 || (call[0] == 0x67 && call[1] == 0xe8)))
1474 if (!ABI_64_P (abfd)
1475 || (offset + 19) > sec->size
1476 || memcmp (call, "\x48\xb8", 2) != 0
1480 || !((call[10] == 0x48 && call[12] == 0xd8)
1481 || (call[10] == 0x4c && call[12] == 0xf8)))
1485 indirect_call = call[0] == 0xff;
1488 r_symndx = htab->r_sym (rel[1].r_info);
1489 if (r_symndx < symtab_hdr->sh_info)
1492 tls_get_addr = FALSE;
1493 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1494 if (h != NULL && h->root.root.string != NULL)
1496 struct elf_x86_64_link_hash_entry *eh
1497 = (struct elf_x86_64_link_hash_entry *) h;
1498 tls_get_addr = eh->tls_get_addr == 1;
1499 if (eh->tls_get_addr > 1)
1501 /* Use strncmp to check __tls_get_addr since
1502 __tls_get_addr may be versioned. */
1503 if (strncmp (h->root.root.string, "__tls_get_addr", 14)
1506 eh->tls_get_addr = 1;
1507 tls_get_addr = TRUE;
1510 eh->tls_get_addr = 0;
1517 return ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLTOFF64;
1518 else if (indirect_call)
1519 return ELF32_R_TYPE (rel[1].r_info) == R_X86_64_GOTPCRELX;
1521 return (ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PC32
1522 || ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLT32);
1524 case R_X86_64_GOTTPOFF:
1525 /* Check transition from IE access model:
1526 mov foo@gottpoff(%rip), %reg
1527 add foo@gottpoff(%rip), %reg
1530 /* Check REX prefix first. */
1531 if (offset >= 3 && (offset + 4) <= sec->size)
1533 val = bfd_get_8 (abfd, contents + offset - 3);
1534 if (val != 0x48 && val != 0x4c)
1536 /* X32 may have 0x44 REX prefix or no REX prefix. */
1537 if (ABI_64_P (abfd))
1543 /* X32 may not have any REX prefix. */
1544 if (ABI_64_P (abfd))
1546 if (offset < 2 || (offset + 3) > sec->size)
1550 val = bfd_get_8 (abfd, contents + offset - 2);
1551 if (val != 0x8b && val != 0x03)
1554 val = bfd_get_8 (abfd, contents + offset - 1);
1555 return (val & 0xc7) == 5;
1557 case R_X86_64_GOTPC32_TLSDESC:
1558 /* Check transition from GDesc access model:
1559 leaq x@tlsdesc(%rip), %rax
1561 Make sure it's a leaq adding rip to a 32-bit offset
1562 into any register, although it's probably almost always
1565 if (offset < 3 || (offset + 4) > sec->size)
1568 val = bfd_get_8 (abfd, contents + offset - 3);
1569 if ((val & 0xfb) != 0x48)
1572 if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1575 val = bfd_get_8 (abfd, contents + offset - 1);
1576 return (val & 0xc7) == 0x05;
1578 case R_X86_64_TLSDESC_CALL:
1579 /* Check transition from GDesc access model:
1580 call *x@tlsdesc(%rax)
1582 if (offset + 2 <= sec->size)
1584 /* Make sure that it's a call *x@tlsdesc(%rax). */
1585 call = contents + offset;
1586 return call[0] == 0xff && call[1] == 0x10;
1596 /* Return TRUE if the TLS access transition is OK or no transition
1597 will be performed. Update R_TYPE if there is a transition. */
1600 elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
1601 asection *sec, bfd_byte *contents,
1602 Elf_Internal_Shdr *symtab_hdr,
1603 struct elf_link_hash_entry **sym_hashes,
1604 unsigned int *r_type, int tls_type,
1605 const Elf_Internal_Rela *rel,
1606 const Elf_Internal_Rela *relend,
1607 struct elf_link_hash_entry *h,
1608 unsigned long r_symndx,
1609 bfd_boolean from_relocate_section)
1611 unsigned int from_type = *r_type;
1612 unsigned int to_type = from_type;
1613 bfd_boolean check = TRUE;
1615 /* Skip TLS transition for functions. */
1617 && (h->type == STT_FUNC
1618 || h->type == STT_GNU_IFUNC))
1623 case R_X86_64_TLSGD:
1624 case R_X86_64_GOTPC32_TLSDESC:
1625 case R_X86_64_TLSDESC_CALL:
1626 case R_X86_64_GOTTPOFF:
1627 if (bfd_link_executable (info))
1630 to_type = R_X86_64_TPOFF32;
1632 to_type = R_X86_64_GOTTPOFF;
1635 /* When we are called from elf_x86_64_relocate_section, there may
1636 be additional transitions based on TLS_TYPE. */
1637 if (from_relocate_section)
1639 unsigned int new_to_type = to_type;
1641 if (bfd_link_executable (info)
1644 && tls_type == GOT_TLS_IE)
1645 new_to_type = R_X86_64_TPOFF32;
1647 if (to_type == R_X86_64_TLSGD
1648 || to_type == R_X86_64_GOTPC32_TLSDESC
1649 || to_type == R_X86_64_TLSDESC_CALL)
1651 if (tls_type == GOT_TLS_IE)
1652 new_to_type = R_X86_64_GOTTPOFF;
1655 /* We checked the transition before when we were called from
1656 elf_x86_64_check_relocs. We only want to check the new
1657 transition which hasn't been checked before. */
1658 check = new_to_type != to_type && from_type == to_type;
1659 to_type = new_to_type;
1664 case R_X86_64_TLSLD:
1665 if (bfd_link_executable (info))
1666 to_type = R_X86_64_TPOFF32;
1673 /* Return TRUE if there is no transition. */
1674 if (from_type == to_type)
1677 /* Check if the transition can be performed. */
1679 && ! elf_x86_64_check_tls_transition (abfd, info, sec, contents,
1680 symtab_hdr, sym_hashes,
1681 from_type, rel, relend))
1683 reloc_howto_type *from, *to;
1686 from = elf_x86_64_rtype_to_howto (abfd, from_type);
1687 to = elf_x86_64_rtype_to_howto (abfd, to_type);
1690 name = h->root.root.string;
1693 struct elf_x86_64_link_hash_table *htab;
1695 htab = elf_x86_64_hash_table (info);
1700 Elf_Internal_Sym *isym;
1702 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1704 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1709 /* xgettext:c-format */
1710 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1711 "in section `%A' failed"),
1712 abfd, from->name, to->name, name,
1713 (unsigned long) rel->r_offset, sec);
1714 bfd_set_error (bfd_error_bad_value);
1722 /* Rename some of the generic section flags to better document how they
1724 #define need_convert_load sec_flg0
1725 #define check_relocs_failed sec_flg1
1728 elf_x86_64_need_pic (bfd *input_bfd, asection *sec,
1729 struct elf_link_hash_entry *h,
1730 Elf_Internal_Shdr *symtab_hdr,
1731 Elf_Internal_Sym *isym,
1732 reloc_howto_type *howto)
1735 const char *und = "";
1736 const char *pic = "";
1741 name = h->root.root.string;
1742 switch (ELF_ST_VISIBILITY (h->other))
1745 v = _("hidden symbol ");
1748 v = _("internal symbol ");
1751 v = _("protected symbol ");
1755 pic = _("; recompile with -fPIC");
1759 if (!h->def_regular && !h->def_dynamic)
1760 und = _("undefined ");
1764 name = bfd_elf_sym_name (input_bfd, symtab_hdr, isym, NULL);
1765 pic = _("; recompile with -fPIC");
1768 /* xgettext:c-format */
1769 _bfd_error_handler (_("%B: relocation %s against %s%s`%s' can "
1770 "not be used when making a shared object%s"),
1771 input_bfd, howto->name, und, v, name, pic);
1772 bfd_set_error (bfd_error_bad_value);
1773 sec->check_relocs_failed = 1;
1777 /* With the local symbol, foo, we convert
1778 mov foo@GOTPCREL(%rip), %reg
1782 call/jmp *foo@GOTPCREL(%rip)
1784 nop call foo/jmp foo nop
1785 When PIC is false, convert
1786 test %reg, foo@GOTPCREL(%rip)
1790 binop foo@GOTPCREL(%rip), %reg
1793 where binop is one of adc, add, and, cmp, or, sbb, sub, xor
1797 elf_x86_64_convert_load_reloc (bfd *abfd, asection *sec,
1799 Elf_Internal_Rela *irel,
1800 struct elf_link_hash_entry *h,
1801 bfd_boolean *converted,
1802 struct bfd_link_info *link_info)
1804 struct elf_x86_64_link_hash_table *htab;
1806 bfd_boolean require_reloc_pc32;
1808 bfd_boolean to_reloc_pc32;
1811 bfd_signed_vma raddend;
1812 unsigned int opcode;
1814 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
1815 unsigned int r_symndx;
1817 bfd_vma roff = irel->r_offset;
1819 if (roff < (r_type == R_X86_64_REX_GOTPCRELX ? 3 : 2))
1822 raddend = irel->r_addend;
1823 /* Addend for 32-bit PC-relative relocation must be -4. */
1827 htab = elf_x86_64_hash_table (link_info);
1828 is_pic = bfd_link_pic (link_info);
1830 relocx = (r_type == R_X86_64_GOTPCRELX
1831 || r_type == R_X86_64_REX_GOTPCRELX);
1833 /* TRUE if we can convert only to R_X86_64_PC32. Enable it for
1836 = link_info->disable_target_specific_optimizations > 1;
1838 r_symndx = htab->r_sym (irel->r_info);
1840 opcode = bfd_get_8 (abfd, contents + roff - 2);
1842 /* Convert mov to lea since it has been done for a while. */
1845 /* Only convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX
1846 for call, jmp or one of adc, add, and, cmp, or, sbb, sub,
1847 test, xor instructions. */
1852 /* We convert only to R_X86_64_PC32:
1854 2. R_X86_64_GOTPCREL since we can't modify REX byte.
1855 3. require_reloc_pc32 is true.
1858 to_reloc_pc32 = (opcode == 0xff
1860 || require_reloc_pc32
1863 /* Get the symbol referred to by the reloc. */
1866 Elf_Internal_Sym *isym
1867 = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx);
1869 /* Skip relocation against undefined symbols. */
1870 if (isym->st_shndx == SHN_UNDEF)
1873 symtype = ELF_ST_TYPE (isym->st_info);
1875 if (isym->st_shndx == SHN_ABS)
1876 tsec = bfd_abs_section_ptr;
1877 else if (isym->st_shndx == SHN_COMMON)
1878 tsec = bfd_com_section_ptr;
1879 else if (isym->st_shndx == SHN_X86_64_LCOMMON)
1880 tsec = &_bfd_elf_large_com_section;
1882 tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1884 toff = isym->st_value;
1888 /* Undefined weak symbol is only bound locally in executable
1889 and its reference is resolved as 0 without relocation
1890 overflow. We can only perform this optimization for
1891 GOTPCRELX relocations since we need to modify REX byte.
1892 It is OK convert mov with R_X86_64_GOTPCREL to
1894 if ((relocx || opcode == 0x8b)
1895 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (link_info,
1897 elf_x86_64_hash_entry (h)))
1901 /* Skip for branch instructions since R_X86_64_PC32
1903 if (require_reloc_pc32)
1908 /* For non-branch instructions, we can convert to
1909 R_X86_64_32/R_X86_64_32S since we know if there
1911 to_reloc_pc32 = FALSE;
1914 /* Since we don't know the current PC when PIC is true,
1915 we can't convert to R_X86_64_PC32. */
1916 if (to_reloc_pc32 && is_pic)
1921 /* Avoid optimizing GOTPCREL relocations againt _DYNAMIC since
1922 ld.so may use its link-time address. */
1923 else if ((h->def_regular
1924 || h->root.type == bfd_link_hash_defined
1925 || h->root.type == bfd_link_hash_defweak)
1926 && h != htab->elf.hdynamic
1927 && SYMBOL_REFERENCES_LOCAL (link_info, h))
1929 /* bfd_link_hash_new or bfd_link_hash_undefined is
1930 set by an assignment in a linker script in
1931 bfd_elf_record_link_assignment. */
1933 && (h->root.type == bfd_link_hash_new
1934 || h->root.type == bfd_link_hash_undefined
1935 || ((h->root.type == bfd_link_hash_defined
1936 || h->root.type == bfd_link_hash_defweak)
1937 && h->root.u.def.section == bfd_und_section_ptr)))
1939 /* Skip since R_X86_64_32/R_X86_64_32S may overflow. */
1940 if (require_reloc_pc32)
1944 tsec = h->root.u.def.section;
1945 toff = h->root.u.def.value;
1952 /* Don't convert GOTPCREL relocation against large section. */
1953 if (elf_section_data (tsec) != NULL
1954 && (elf_section_flags (tsec) & SHF_X86_64_LARGE) != 0)
1957 /* We can only estimate relocation overflow for R_X86_64_PC32. */
1961 if (tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
1963 /* At this stage in linking, no SEC_MERGE symbol has been
1964 adjusted, so all references to such symbols need to be
1965 passed through _bfd_merged_section_offset. (Later, in
1966 relocate_section, all SEC_MERGE symbols *except* for
1967 section symbols have been adjusted.)
1969 gas may reduce relocations against symbols in SEC_MERGE
1970 sections to a relocation against the section symbol when
1971 the original addend was zero. When the reloc is against
1972 a section symbol we should include the addend in the
1973 offset passed to _bfd_merged_section_offset, since the
1974 location of interest is the original symbol. On the
1975 other hand, an access to "sym+addend" where "sym" is not
1976 a section symbol should not include the addend; Such an
1977 access is presumed to be an offset from "sym"; The
1978 location of interest is just "sym". */
1979 if (symtype == STT_SECTION)
1982 toff = _bfd_merged_section_offset (abfd, &tsec,
1983 elf_section_data (tsec)->sec_info,
1986 if (symtype != STT_SECTION)
1992 /* Don't convert if R_X86_64_PC32 relocation overflows. */
1993 if (tsec->output_section == sec->output_section)
1995 if ((toff - roff + 0x80000000) > 0xffffffff)
2000 bfd_signed_vma distance;
2002 /* At this point, we don't know the load addresses of TSEC
2003 section nor SEC section. We estimate the distrance between
2004 SEC and TSEC. We store the estimated distances in the
2005 compressed_size field of the output section, which is only
2006 used to decompress the compressed input section. */
2007 if (sec->output_section->compressed_size == 0)
2010 bfd_size_type size = 0;
2011 for (asect = link_info->output_bfd->sections;
2013 asect = asect->next)
2014 /* Skip debug sections since compressed_size is used to
2015 compress debug sections. */
2016 if ((asect->flags & SEC_DEBUGGING) == 0)
2019 for (i = asect->map_head.s;
2023 size = align_power (size, i->alignment_power);
2026 asect->compressed_size = size;
2030 /* Don't convert GOTPCREL relocations if TSEC isn't placed
2032 distance = (tsec->output_section->compressed_size
2033 - sec->output_section->compressed_size);
2037 /* Take PT_GNU_RELRO segment into account by adding
2039 if ((toff + distance + get_elf_backend_data (abfd)->maxpagesize
2040 - roff + 0x80000000) > 0xffffffff)
2047 /* We have "call/jmp *foo@GOTPCREL(%rip)". */
2052 /* Convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX to
2054 modrm = bfd_get_8 (abfd, contents + roff - 1);
2057 /* Convert to "jmp foo nop". */
2060 nop_offset = irel->r_offset + 3;
2061 disp = bfd_get_32 (abfd, contents + irel->r_offset);
2062 irel->r_offset -= 1;
2063 bfd_put_32 (abfd, disp, contents + irel->r_offset);
2067 struct elf_x86_64_link_hash_entry *eh
2068 = (struct elf_x86_64_link_hash_entry *) h;
2070 /* Convert to "nop call foo". ADDR_PREFIX_OPCODE
2073 /* To support TLS optimization, always use addr32 prefix for
2074 "call *__tls_get_addr@GOTPCREL(%rip)". */
2075 if (eh && eh->tls_get_addr == 1)
2078 nop_offset = irel->r_offset - 2;
2082 nop = link_info->call_nop_byte;
2083 if (link_info->call_nop_as_suffix)
2085 nop_offset = irel->r_offset + 3;
2086 disp = bfd_get_32 (abfd, contents + irel->r_offset);
2087 irel->r_offset -= 1;
2088 bfd_put_32 (abfd, disp, contents + irel->r_offset);
2091 nop_offset = irel->r_offset - 2;
2094 bfd_put_8 (abfd, nop, contents + nop_offset);
2095 bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
2096 r_type = R_X86_64_PC32;
2101 unsigned int rex_mask = REX_R;
2103 if (r_type == R_X86_64_REX_GOTPCRELX)
2104 rex = bfd_get_8 (abfd, contents + roff - 3);
2112 /* Convert "mov foo@GOTPCREL(%rip), %reg" to
2113 "lea foo(%rip), %reg". */
2115 r_type = R_X86_64_PC32;
2119 /* Convert "mov foo@GOTPCREL(%rip), %reg" to
2120 "mov $foo, %reg". */
2122 modrm = bfd_get_8 (abfd, contents + roff - 1);
2123 modrm = 0xc0 | (modrm & 0x38) >> 3;
2124 if ((rex & REX_W) != 0
2125 && ABI_64_P (link_info->output_bfd))
2127 /* Keep the REX_W bit in REX byte for LP64. */
2128 r_type = R_X86_64_32S;
2129 goto rewrite_modrm_rex;
2133 /* If the REX_W bit in REX byte isn't needed,
2134 use R_X86_64_32 and clear the W bit to avoid
2135 sign-extend imm32 to imm64. */
2136 r_type = R_X86_64_32;
2137 /* Clear the W bit in REX byte. */
2139 goto rewrite_modrm_rex;
2145 /* R_X86_64_PC32 isn't supported. */
2149 modrm = bfd_get_8 (abfd, contents + roff - 1);
2152 /* Convert "test %reg, foo@GOTPCREL(%rip)" to
2153 "test $foo, %reg". */
2154 modrm = 0xc0 | (modrm & 0x38) >> 3;
2159 /* Convert "binop foo@GOTPCREL(%rip), %reg" to
2160 "binop $foo, %reg". */
2161 modrm = 0xc0 | (modrm & 0x38) >> 3 | (opcode & 0x3c);
2165 /* Use R_X86_64_32 with 32-bit operand to avoid relocation
2166 overflow when sign-extending imm32 to imm64. */
2167 r_type = (rex & REX_W) != 0 ? R_X86_64_32S : R_X86_64_32;
2170 bfd_put_8 (abfd, modrm, contents + roff - 1);
2174 /* Move the R bit to the B bit in REX byte. */
2175 rex = (rex & ~rex_mask) | (rex & REX_R) >> 2;
2176 bfd_put_8 (abfd, rex, contents + roff - 3);
2179 /* No addend for R_X86_64_32/R_X86_64_32S relocations. */
2183 bfd_put_8 (abfd, opcode, contents + roff - 2);
2186 irel->r_info = htab->r_info (r_symndx, r_type);
2193 /* Look through the relocs for a section during the first phase, and
2194 calculate needed space in the global offset table, procedure
2195 linkage table, and dynamic reloc sections. */
2198 elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
2200 const Elf_Internal_Rela *relocs)
2202 struct elf_x86_64_link_hash_table *htab;
2203 Elf_Internal_Shdr *symtab_hdr;
2204 struct elf_link_hash_entry **sym_hashes;
2205 const Elf_Internal_Rela *rel;
2206 const Elf_Internal_Rela *rel_end;
2210 if (bfd_link_relocatable (info))
2213 /* Don't do anything special with non-loaded, non-alloced sections.
2214 In particular, any relocs in such sections should not affect GOT
2215 and PLT reference counting (ie. we don't allow them to create GOT
2216 or PLT entries), there's no possibility or desire to optimize TLS
2217 relocs, and there's not much point in propagating relocs to shared
2218 libs that the dynamic linker won't relocate. */
2219 if ((sec->flags & SEC_ALLOC) == 0)
2222 BFD_ASSERT (is_x86_64_elf (abfd));
2224 htab = elf_x86_64_hash_table (info);
2227 sec->check_relocs_failed = 1;
2231 /* Get the section contents. */
2232 if (elf_section_data (sec)->this_hdr.contents != NULL)
2233 contents = elf_section_data (sec)->this_hdr.contents;
2234 else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2236 sec->check_relocs_failed = 1;
2240 symtab_hdr = &elf_symtab_hdr (abfd);
2241 sym_hashes = elf_sym_hashes (abfd);
2245 rel_end = relocs + sec->reloc_count;
2246 for (rel = relocs; rel < rel_end; rel++)
2248 unsigned int r_type;
2249 unsigned long r_symndx;
2250 struct elf_link_hash_entry *h;
2251 struct elf_x86_64_link_hash_entry *eh;
2252 Elf_Internal_Sym *isym;
2254 bfd_boolean size_reloc;
2256 r_symndx = htab->r_sym (rel->r_info);
2257 r_type = ELF32_R_TYPE (rel->r_info);
2259 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
2261 /* xgettext:c-format */
2262 _bfd_error_handler (_("%B: bad symbol index: %d"),
2267 if (r_symndx < symtab_hdr->sh_info)
2269 /* A local symbol. */
2270 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2275 /* Check relocation against local STT_GNU_IFUNC symbol. */
2276 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2278 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel,
2283 /* Fake a STT_GNU_IFUNC symbol. */
2284 h->root.root.string = bfd_elf_sym_name (abfd, symtab_hdr,
2286 h->type = STT_GNU_IFUNC;
2289 h->forced_local = 1;
2290 h->root.type = bfd_link_hash_defined;
2298 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2299 while (h->root.type == bfd_link_hash_indirect
2300 || h->root.type == bfd_link_hash_warning)
2301 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2304 /* Check invalid x32 relocations. */
2305 if (!ABI_64_P (abfd))
2311 case R_X86_64_DTPOFF64:
2312 case R_X86_64_TPOFF64:
2314 case R_X86_64_GOTOFF64:
2315 case R_X86_64_GOT64:
2316 case R_X86_64_GOTPCREL64:
2317 case R_X86_64_GOTPC64:
2318 case R_X86_64_GOTPLT64:
2319 case R_X86_64_PLTOFF64:
2322 name = h->root.root.string;
2324 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
2327 /* xgettext:c-format */
2328 (_("%B: relocation %s against symbol `%s' isn't "
2329 "supported in x32 mode"), abfd,
2330 x86_64_elf_howto_table[r_type].name, name);
2331 bfd_set_error (bfd_error_bad_value);
2339 /* It is referenced by a non-shared object. */
2341 h->root.non_ir_ref_regular = 1;
2343 if (h->type == STT_GNU_IFUNC)
2344 elf_tdata (info->output_bfd)->has_gnu_symbols
2345 |= elf_gnu_symbol_ifunc;
2348 if (! elf_x86_64_tls_transition (info, abfd, sec, contents,
2349 symtab_hdr, sym_hashes,
2350 &r_type, GOT_UNKNOWN,
2351 rel, rel_end, h, r_symndx, FALSE))
2354 eh = (struct elf_x86_64_link_hash_entry *) h;
2357 case R_X86_64_TLSLD:
2358 htab->tls_ld_got.refcount += 1;
2361 case R_X86_64_TPOFF32:
2362 if (!bfd_link_executable (info) && ABI_64_P (abfd))
2363 return elf_x86_64_need_pic (abfd, sec, h, symtab_hdr, isym,
2364 &x86_64_elf_howto_table[r_type]);
2366 eh->has_got_reloc = 1;
2369 case R_X86_64_GOTTPOFF:
2370 if (!bfd_link_executable (info))
2371 info->flags |= DF_STATIC_TLS;
2374 case R_X86_64_GOT32:
2375 case R_X86_64_GOTPCREL:
2376 case R_X86_64_GOTPCRELX:
2377 case R_X86_64_REX_GOTPCRELX:
2378 case R_X86_64_TLSGD:
2379 case R_X86_64_GOT64:
2380 case R_X86_64_GOTPCREL64:
2381 case R_X86_64_GOTPLT64:
2382 case R_X86_64_GOTPC32_TLSDESC:
2383 case R_X86_64_TLSDESC_CALL:
2384 /* This symbol requires a global offset table entry. */
2386 int tls_type, old_tls_type;
2390 default: tls_type = GOT_NORMAL; break;
2391 case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break;
2392 case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break;
2393 case R_X86_64_GOTPC32_TLSDESC:
2394 case R_X86_64_TLSDESC_CALL:
2395 tls_type = GOT_TLS_GDESC; break;
2400 h->got.refcount += 1;
2401 old_tls_type = eh->tls_type;
2405 bfd_signed_vma *local_got_refcounts;
2407 /* This is a global offset table entry for a local symbol. */
2408 local_got_refcounts = elf_local_got_refcounts (abfd);
2409 if (local_got_refcounts == NULL)
2413 size = symtab_hdr->sh_info;
2414 size *= sizeof (bfd_signed_vma)
2415 + sizeof (bfd_vma) + sizeof (char);
2416 local_got_refcounts = ((bfd_signed_vma *)
2417 bfd_zalloc (abfd, size));
2418 if (local_got_refcounts == NULL)
2420 elf_local_got_refcounts (abfd) = local_got_refcounts;
2421 elf_x86_64_local_tlsdesc_gotent (abfd)
2422 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
2423 elf_x86_64_local_got_tls_type (abfd)
2424 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
2426 local_got_refcounts[r_symndx] += 1;
2428 = elf_x86_64_local_got_tls_type (abfd) [r_symndx];
2431 /* If a TLS symbol is accessed using IE at least once,
2432 there is no point to use dynamic model for it. */
2433 if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
2434 && (! GOT_TLS_GD_ANY_P (old_tls_type)
2435 || tls_type != GOT_TLS_IE))
2437 if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type))
2438 tls_type = old_tls_type;
2439 else if (GOT_TLS_GD_ANY_P (old_tls_type)
2440 && GOT_TLS_GD_ANY_P (tls_type))
2441 tls_type |= old_tls_type;
2445 name = h->root.root.string;
2447 name = bfd_elf_sym_name (abfd, symtab_hdr,
2450 /* xgettext:c-format */
2451 (_("%B: '%s' accessed both as normal and"
2452 " thread local symbol"),
2454 bfd_set_error (bfd_error_bad_value);
2459 if (old_tls_type != tls_type)
2462 eh->tls_type = tls_type;
2464 elf_x86_64_local_got_tls_type (abfd) [r_symndx] = tls_type;
2469 case R_X86_64_GOTOFF64:
2470 case R_X86_64_GOTPC32:
2471 case R_X86_64_GOTPC64:
2474 eh->has_got_reloc = 1;
2477 case R_X86_64_PLT32:
2478 case R_X86_64_PLT32_BND:
2479 /* This symbol requires a procedure linkage table entry. We
2480 actually build the entry in adjust_dynamic_symbol,
2481 because this might be a case of linking PIC code which is
2482 never referenced by a dynamic object, in which case we
2483 don't need to generate a procedure linkage table entry
2486 /* If this is a local symbol, we resolve it directly without
2487 creating a procedure linkage table entry. */
2491 eh->has_got_reloc = 1;
2493 h->plt.refcount += 1;
2496 case R_X86_64_PLTOFF64:
2497 /* This tries to form the 'address' of a function relative
2498 to GOT. For global symbols we need a PLT entry. */
2502 h->plt.refcount += 1;
2506 case R_X86_64_SIZE32:
2507 case R_X86_64_SIZE64:
2512 if (!ABI_64_P (abfd))
2518 /* Check relocation overflow as these relocs may lead to
2519 run-time relocation overflow. Don't error out for
2520 sections we don't care about, such as debug sections or
2521 when relocation overflow check is disabled. */
2522 if (!info->no_reloc_overflow_check
2523 && (bfd_link_pic (info)
2524 || (bfd_link_executable (info)
2528 && (sec->flags & SEC_READONLY) == 0)))
2529 return elf_x86_64_need_pic (abfd, sec, h, symtab_hdr, isym,
2530 &x86_64_elf_howto_table[r_type]);
2536 case R_X86_64_PC32_BND:
2540 if (eh != NULL && (sec->flags & SEC_CODE) != 0)
2541 eh->has_non_got_reloc = 1;
2542 /* We are called after all symbols have been resolved. Only
2543 relocation against STT_GNU_IFUNC symbol must go through
2546 && (bfd_link_executable (info)
2547 || h->type == STT_GNU_IFUNC))
2549 /* If this reloc is in a read-only section, we might
2550 need a copy reloc. We can't check reliably at this
2551 stage whether the section is read-only, as input
2552 sections have not yet been mapped to output sections.
2553 Tentatively set the flag for now, and correct in
2554 adjust_dynamic_symbol. */
2557 /* We may need a .plt entry if the symbol is a function
2558 defined in a shared lib or is a STT_GNU_IFUNC function
2559 referenced from the code or read-only section. */
2561 || (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
2562 h->plt.refcount += 1;
2564 if (r_type == R_X86_64_PC32)
2566 /* Since something like ".long foo - ." may be used
2567 as pointer, make sure that PLT is used if foo is
2568 a function defined in a shared library. */
2569 if ((sec->flags & SEC_CODE) == 0)
2570 h->pointer_equality_needed = 1;
2572 else if (r_type != R_X86_64_PC32_BND
2573 && r_type != R_X86_64_PC64)
2575 h->pointer_equality_needed = 1;
2576 /* At run-time, R_X86_64_64 can be resolved for both
2577 x86-64 and x32. But R_X86_64_32 and R_X86_64_32S
2578 can only be resolved for x32. */
2579 if ((sec->flags & SEC_READONLY) == 0
2580 && (r_type == R_X86_64_64
2581 || (!ABI_64_P (abfd)
2582 && (r_type == R_X86_64_32
2583 || r_type == R_X86_64_32S))))
2584 eh->func_pointer_refcount += 1;
2590 /* If we are creating a shared library, and this is a reloc
2591 against a global symbol, or a non PC relative reloc
2592 against a local symbol, then we need to copy the reloc
2593 into the shared library. However, if we are linking with
2594 -Bsymbolic, we do not need to copy a reloc against a
2595 global symbol which is defined in an object we are
2596 including in the link (i.e., DEF_REGULAR is set). At
2597 this point we have not seen all the input files, so it is
2598 possible that DEF_REGULAR is not set now but will be set
2599 later (it is never cleared). In case of a weak definition,
2600 DEF_REGULAR may be cleared later by a strong definition in
2601 a shared library. We account for that possibility below by
2602 storing information in the relocs_copied field of the hash
2603 table entry. A similar situation occurs when creating
2604 shared libraries and symbol visibility changes render the
2607 If on the other hand, we are creating an executable, we
2608 may need to keep relocations for symbols satisfied by a
2609 dynamic library if we manage to avoid copy relocs for the
2612 Generate dynamic pointer relocation against STT_GNU_IFUNC
2613 symbol in the non-code section. */
2614 if ((bfd_link_pic (info)
2615 && (! IS_X86_64_PCREL_TYPE (r_type)
2617 && (! (bfd_link_pie (info)
2618 || SYMBOLIC_BIND (info, h))
2619 || h->root.type == bfd_link_hash_defweak
2620 || !h->def_regular))))
2622 && h->type == STT_GNU_IFUNC
2623 && r_type == htab->pointer_r_type
2624 && (sec->flags & SEC_CODE) == 0)
2625 || (ELIMINATE_COPY_RELOCS
2626 && !bfd_link_pic (info)
2628 && (h->root.type == bfd_link_hash_defweak
2629 || !h->def_regular)))
2631 struct elf_dyn_relocs *p;
2632 struct elf_dyn_relocs **head;
2634 /* We must copy these reloc types into the output file.
2635 Create a reloc section in dynobj and make room for
2639 sreloc = _bfd_elf_make_dynamic_reloc_section
2640 (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2,
2641 abfd, /*rela?*/ TRUE);
2647 /* If this is a global symbol, we count the number of
2648 relocations we need for this symbol. */
2650 head = &eh->dyn_relocs;
2653 /* Track dynamic relocs needed for local syms too.
2654 We really need local syms available to do this
2659 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2664 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2668 /* Beware of type punned pointers vs strict aliasing
2670 vpp = &(elf_section_data (s)->local_dynrel);
2671 head = (struct elf_dyn_relocs **)vpp;
2675 if (p == NULL || p->sec != sec)
2677 bfd_size_type amt = sizeof *p;
2679 p = ((struct elf_dyn_relocs *)
2680 bfd_alloc (htab->elf.dynobj, amt));
2691 /* Count size relocation as PC-relative relocation. */
2692 if (IS_X86_64_PCREL_TYPE (r_type) || size_reloc)
2697 /* This relocation describes the C++ object vtable hierarchy.
2698 Reconstruct it for later use during GC. */
2699 case R_X86_64_GNU_VTINHERIT:
2700 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2704 /* This relocation describes which C++ vtable entries are actually
2705 used. Record for later use during GC. */
2706 case R_X86_64_GNU_VTENTRY:
2707 BFD_ASSERT (h != NULL);
2709 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2717 if ((r_type == R_X86_64_GOTPCREL
2718 || r_type == R_X86_64_GOTPCRELX
2719 || r_type == R_X86_64_REX_GOTPCRELX)
2720 && (h == NULL || h->type != STT_GNU_IFUNC))
2721 sec->need_convert_load = 1;
2724 if (elf_section_data (sec)->this_hdr.contents != contents)
2726 if (!info->keep_memory)
2730 /* Cache the section contents for elf_link_input_bfd. */
2731 elf_section_data (sec)->this_hdr.contents = contents;
2738 if (elf_section_data (sec)->this_hdr.contents != contents)
2740 sec->check_relocs_failed = 1;
2744 /* Return the section that should be marked against GC for a given
2748 elf_x86_64_gc_mark_hook (asection *sec,
2749 struct bfd_link_info *info,
2750 Elf_Internal_Rela *rel,
2751 struct elf_link_hash_entry *h,
2752 Elf_Internal_Sym *sym)
2755 switch (ELF32_R_TYPE (rel->r_info))
2757 case R_X86_64_GNU_VTINHERIT:
2758 case R_X86_64_GNU_VTENTRY:
2762 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2765 /* Remove undefined weak symbol from the dynamic symbol table if it
2766 is resolved to 0. */
2769 elf_x86_64_fixup_symbol (struct bfd_link_info *info,
2770 struct elf_link_hash_entry *h)
2772 if (h->dynindx != -1
2773 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
2774 elf_x86_64_hash_entry (h)->has_got_reloc,
2775 elf_x86_64_hash_entry (h)))
2778 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2784 /* Adjust a symbol defined by a dynamic object and referenced by a
2785 regular object. The current definition is in some section of the
2786 dynamic object, but we're not including those sections. We have to
2787 change the definition to something the rest of the link can
2791 elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
2792 struct elf_link_hash_entry *h)
2794 struct elf_x86_64_link_hash_table *htab;
2796 struct elf_x86_64_link_hash_entry *eh;
2797 struct elf_dyn_relocs *p;
2799 /* STT_GNU_IFUNC symbol must go through PLT. */
2800 if (h->type == STT_GNU_IFUNC)
2802 /* All local STT_GNU_IFUNC references must be treate as local
2803 calls via local PLT. */
2805 && SYMBOL_CALLS_LOCAL (info, h))
2807 bfd_size_type pc_count = 0, count = 0;
2808 struct elf_dyn_relocs **pp;
2810 eh = (struct elf_x86_64_link_hash_entry *) h;
2811 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2813 pc_count += p->pc_count;
2814 p->count -= p->pc_count;
2823 if (pc_count || count)
2828 /* Increment PLT reference count only for PC-relative
2831 if (h->plt.refcount <= 0)
2832 h->plt.refcount = 1;
2834 h->plt.refcount += 1;
2839 if (h->plt.refcount <= 0)
2841 h->plt.offset = (bfd_vma) -1;
2847 /* If this is a function, put it in the procedure linkage table. We
2848 will fill in the contents of the procedure linkage table later,
2849 when we know the address of the .got section. */
2850 if (h->type == STT_FUNC
2853 if (h->plt.refcount <= 0
2854 || SYMBOL_CALLS_LOCAL (info, h)
2855 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2856 && h->root.type == bfd_link_hash_undefweak))
2858 /* This case can occur if we saw a PLT32 reloc in an input
2859 file, but the symbol was never referred to by a dynamic
2860 object, or if all references were garbage collected. In
2861 such a case, we don't actually need to build a procedure
2862 linkage table, and we can just do a PC32 reloc instead. */
2863 h->plt.offset = (bfd_vma) -1;
2870 /* It's possible that we incorrectly decided a .plt reloc was
2871 needed for an R_X86_64_PC32 reloc to a non-function sym in
2872 check_relocs. We can't decide accurately between function and
2873 non-function syms in check-relocs; Objects loaded later in
2874 the link may change h->type. So fix it now. */
2875 h->plt.offset = (bfd_vma) -1;
2877 /* If this is a weak symbol, and there is a real definition, the
2878 processor independent code will have arranged for us to see the
2879 real definition first, and we can just use the same value. */
2880 if (h->u.weakdef != NULL)
2882 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2883 || h->u.weakdef->root.type == bfd_link_hash_defweak);
2884 h->root.u.def.section = h->u.weakdef->root.u.def.section;
2885 h->root.u.def.value = h->u.weakdef->root.u.def.value;
2886 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2888 eh = (struct elf_x86_64_link_hash_entry *) h;
2889 h->non_got_ref = h->u.weakdef->non_got_ref;
2890 eh->needs_copy = h->u.weakdef->needs_copy;
2895 /* This is a reference to a symbol defined by a dynamic object which
2896 is not a function. */
2898 /* If we are creating a shared library, we must presume that the
2899 only references to the symbol are via the global offset table.
2900 For such cases we need not do anything here; the relocations will
2901 be handled correctly by relocate_section. */
2902 if (!bfd_link_executable (info))
2905 /* If there are no references to this symbol that do not use the
2906 GOT, we don't need to generate a copy reloc. */
2907 if (!h->non_got_ref)
2910 /* If -z nocopyreloc was given, we won't generate them either. */
2911 if (info->nocopyreloc)
2917 if (ELIMINATE_COPY_RELOCS)
2919 eh = (struct elf_x86_64_link_hash_entry *) h;
2920 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2922 s = p->sec->output_section;
2923 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2927 /* If we didn't find any dynamic relocs in read-only sections, then
2928 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
2936 /* We must allocate the symbol in our .dynbss section, which will
2937 become part of the .bss section of the executable. There will be
2938 an entry for this symbol in the .dynsym section. The dynamic
2939 object will contain position independent code, so all references
2940 from the dynamic object to this symbol will go through the global
2941 offset table. The dynamic linker will use the .dynsym entry to
2942 determine the address it must put in the global offset table, so
2943 both the dynamic object and the regular object will refer to the
2944 same memory location for the variable. */
2946 htab = elf_x86_64_hash_table (info);
2950 /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
2951 to copy the initial value out of the dynamic object and into the
2952 runtime process image. */
2953 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
2955 s = htab->elf.sdynrelro;
2956 srel = htab->elf.sreldynrelro;
2960 s = htab->elf.sdynbss;
2961 srel = htab->elf.srelbss;
2963 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2965 const struct elf_backend_data *bed;
2966 bed = get_elf_backend_data (info->output_bfd);
2967 srel->size += bed->s->sizeof_rela;
2971 return _bfd_elf_adjust_dynamic_copy (info, h, s);
2974 /* Allocate space in .plt, .got and associated reloc sections for
2978 elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2980 struct bfd_link_info *info;
2981 struct elf_x86_64_link_hash_table *htab;
2982 struct elf_x86_64_link_hash_entry *eh;
2983 struct elf_dyn_relocs *p;
2984 const struct elf_backend_data *bed;
2985 unsigned int plt_entry_size;
2986 bfd_boolean resolved_to_zero;
2988 if (h->root.type == bfd_link_hash_indirect)
2991 eh = (struct elf_x86_64_link_hash_entry *) h;
2993 info = (struct bfd_link_info *) inf;
2994 htab = elf_x86_64_hash_table (info);
2997 bed = get_elf_backend_data (info->output_bfd);
2998 plt_entry_size = htab->plt.plt_entry_size;
3000 resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
3004 /* We can't use the GOT PLT if pointer equality is needed since
3005 finish_dynamic_symbol won't clear symbol value and the dynamic
3006 linker won't update the GOT slot. We will get into an infinite
3007 loop at run-time. */
3008 if (htab->plt_got != NULL
3009 && h->type != STT_GNU_IFUNC
3010 && !h->pointer_equality_needed
3011 && h->plt.refcount > 0
3012 && h->got.refcount > 0)
3014 /* Don't use the regular PLT if there are both GOT and GOTPLT
3016 h->plt.offset = (bfd_vma) -1;
3018 /* Use the GOT PLT. */
3019 eh->plt_got.refcount = 1;
3022 /* Clear the reference count of function pointer relocations if
3023 symbol isn't a normal function. */
3024 if (h->type != STT_FUNC)
3025 eh->func_pointer_refcount = 0;
3027 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
3028 here if it is defined and referenced in a non-shared object. */
3029 if (h->type == STT_GNU_IFUNC
3032 if (_bfd_elf_allocate_ifunc_dyn_relocs (info, h,
3034 &htab->readonly_dynrelocs_against_ifunc,
3038 GOT_ENTRY_SIZE, TRUE))
3040 asection *s = htab->plt_second;
3041 if (h->plt.offset != (bfd_vma) -1 && s != NULL)
3043 /* Use the second PLT section if it is created. */
3044 eh->plt_second.offset = s->size;
3046 /* Make room for this entry in the second PLT section. */
3047 s->size += htab->non_lazy_plt->plt_entry_size;
3055 /* Don't create the PLT entry if there are only function pointer
3056 relocations which can be resolved at run-time. */
3057 else if (htab->elf.dynamic_sections_created
3058 && (h->plt.refcount > eh->func_pointer_refcount
3059 || eh->plt_got.refcount > 0))
3061 bfd_boolean use_plt_got = eh->plt_got.refcount > 0;
3063 /* Clear the reference count of function pointer relocations
3065 eh->func_pointer_refcount = 0;
3067 /* Make sure this symbol is output as a dynamic symbol.
3068 Undefined weak syms won't yet be marked as dynamic. */
3069 if (h->dynindx == -1
3071 && !resolved_to_zero
3072 && h->root.type == bfd_link_hash_undefweak)
3074 if (! bfd_elf_link_record_dynamic_symbol (info, h))
3078 if (bfd_link_pic (info)
3079 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
3081 asection *s = htab->elf.splt;
3082 asection *second_s = htab->plt_second;
3083 asection *got_s = htab->plt_got;
3085 /* If this is the first .plt entry, make room for the special
3086 first entry. The .plt section is used by prelink to undo
3087 prelinking for dynamic relocations. */
3089 s->size = htab->plt.has_plt0 * plt_entry_size;
3092 eh->plt_got.offset = got_s->size;
3095 h->plt.offset = s->size;
3097 eh->plt_second.offset = second_s->size;
3100 /* If this symbol is not defined in a regular file, and we are
3101 not generating a shared library, then set the symbol to this
3102 location in the .plt. This is required to make function
3103 pointers compare as equal between the normal executable and
3104 the shared library. */
3105 if (! bfd_link_pic (info)
3110 /* We need to make a call to the entry of the GOT PLT
3111 instead of regular PLT entry. */
3112 h->root.u.def.section = got_s;
3113 h->root.u.def.value = eh->plt_got.offset;
3119 /* We need to make a call to the entry of the
3120 second PLT instead of regular PLT entry. */
3121 h->root.u.def.section = second_s;
3122 h->root.u.def.value = eh->plt_second.offset;
3126 h->root.u.def.section = s;
3127 h->root.u.def.value = h->plt.offset;
3132 /* Make room for this entry. */
3134 got_s->size += htab->non_lazy_plt->plt_entry_size;
3137 s->size += plt_entry_size;
3139 second_s->size += htab->non_lazy_plt->plt_entry_size;
3141 /* We also need to make an entry in the .got.plt section,
3142 which will be placed in the .got section by the linker
3144 htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
3146 /* There should be no PLT relocation against resolved
3147 undefined weak symbol in executable. */
3148 if (!resolved_to_zero)
3150 /* We also need to make an entry in the .rela.plt
3152 htab->elf.srelplt->size += bed->s->sizeof_rela;
3153 htab->elf.srelplt->reloc_count++;
3159 eh->plt_got.offset = (bfd_vma) -1;
3160 h->plt.offset = (bfd_vma) -1;
3166 eh->plt_got.offset = (bfd_vma) -1;
3167 h->plt.offset = (bfd_vma) -1;
3171 eh->tlsdesc_got = (bfd_vma) -1;
3173 /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
3174 make it a R_X86_64_TPOFF32 requiring no GOT entry. */
3175 if (h->got.refcount > 0
3176 && bfd_link_executable (info)
3178 && elf_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE)
3180 h->got.offset = (bfd_vma) -1;
3182 else if (h->got.refcount > 0)
3186 int tls_type = elf_x86_64_hash_entry (h)->tls_type;
3188 /* Make sure this symbol is output as a dynamic symbol.
3189 Undefined weak syms won't yet be marked as dynamic. */
3190 if (h->dynindx == -1
3192 && !resolved_to_zero
3193 && h->root.type == bfd_link_hash_undefweak)
3195 if (! bfd_elf_link_record_dynamic_symbol (info, h))
3199 if (GOT_TLS_GDESC_P (tls_type))
3201 eh->tlsdesc_got = htab->elf.sgotplt->size
3202 - elf_x86_64_compute_jump_table_size (htab);
3203 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
3204 h->got.offset = (bfd_vma) -2;
3206 if (! GOT_TLS_GDESC_P (tls_type)
3207 || GOT_TLS_GD_P (tls_type))
3210 h->got.offset = s->size;
3211 s->size += GOT_ENTRY_SIZE;
3212 if (GOT_TLS_GD_P (tls_type))
3213 s->size += GOT_ENTRY_SIZE;
3215 dyn = htab->elf.dynamic_sections_created;
3216 /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
3217 and two if global. R_X86_64_GOTTPOFF needs one dynamic
3218 relocation. No dynamic relocation against resolved undefined
3219 weak symbol in executable. */
3220 if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
3221 || tls_type == GOT_TLS_IE)
3222 htab->elf.srelgot->size += bed->s->sizeof_rela;
3223 else if (GOT_TLS_GD_P (tls_type))
3224 htab->elf.srelgot->size += 2 * bed->s->sizeof_rela;
3225 else if (! GOT_TLS_GDESC_P (tls_type)
3226 && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3227 && !resolved_to_zero)
3228 || h->root.type != bfd_link_hash_undefweak)
3229 && (bfd_link_pic (info)
3230 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
3231 htab->elf.srelgot->size += bed->s->sizeof_rela;
3232 if (GOT_TLS_GDESC_P (tls_type))
3234 htab->elf.srelplt->size += bed->s->sizeof_rela;
3235 htab->tlsdesc_plt = (bfd_vma) -1;
3239 h->got.offset = (bfd_vma) -1;
3241 if (eh->dyn_relocs == NULL)
3244 /* In the shared -Bsymbolic case, discard space allocated for
3245 dynamic pc-relative relocs against symbols which turn out to be
3246 defined in regular objects. For the normal shared case, discard
3247 space for pc-relative relocs that have become local due to symbol
3248 visibility changes. */
3250 if (bfd_link_pic (info))
3252 /* Relocs that use pc_count are those that appear on a call
3253 insn, or certain REL relocs that can generated via assembly.
3254 We want calls to protected symbols to resolve directly to the
3255 function rather than going via the plt. If people want
3256 function pointer comparisons to work as expected then they
3257 should avoid writing weird assembly. */
3258 if (SYMBOL_CALLS_LOCAL (info, h))
3260 struct elf_dyn_relocs **pp;
3262 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
3264 p->count -= p->pc_count;
3273 /* Also discard relocs on undefined weak syms with non-default
3274 visibility or in PIE. */
3275 if (eh->dyn_relocs != NULL)
3277 if (h->root.type == bfd_link_hash_undefweak)
3279 /* Undefined weak symbol is never bound locally in shared
3281 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3282 || resolved_to_zero)
3283 eh->dyn_relocs = NULL;
3284 else if (h->dynindx == -1
3285 && ! h->forced_local
3286 && ! bfd_elf_link_record_dynamic_symbol (info, h))
3289 /* For PIE, discard space for pc-relative relocs against
3290 symbols which turn out to need copy relocs. */
3291 else if (bfd_link_executable (info)
3292 && (h->needs_copy || eh->needs_copy)
3296 struct elf_dyn_relocs **pp;
3298 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
3300 if (p->pc_count != 0)
3308 else if (ELIMINATE_COPY_RELOCS)
3310 /* For the non-shared case, discard space for relocs against
3311 symbols which turn out to need copy relocs or are not
3312 dynamic. Keep dynamic relocations for run-time function
3313 pointer initialization. */
3315 if ((!h->non_got_ref
3316 || eh->func_pointer_refcount > 0
3317 || (h->root.type == bfd_link_hash_undefweak
3318 && !resolved_to_zero))
3321 || (htab->elf.dynamic_sections_created
3322 && (h->root.type == bfd_link_hash_undefweak
3323 || h->root.type == bfd_link_hash_undefined))))
3325 /* Make sure this symbol is output as a dynamic symbol.
3326 Undefined weak syms won't yet be marked as dynamic. */
3327 if (h->dynindx == -1
3328 && ! h->forced_local
3329 && ! resolved_to_zero
3330 && h->root.type == bfd_link_hash_undefweak
3331 && ! bfd_elf_link_record_dynamic_symbol (info, h))
3334 /* If that succeeded, we know we'll be keeping all the
3336 if (h->dynindx != -1)
3340 eh->dyn_relocs = NULL;
3341 eh->func_pointer_refcount = 0;
3346 /* Finally, allocate space. */
3347 for (p = eh->dyn_relocs; p != NULL; p = p->next)
3351 sreloc = elf_section_data (p->sec)->sreloc;
3353 BFD_ASSERT (sreloc != NULL);
3355 sreloc->size += p->count * bed->s->sizeof_rela;
3361 /* Allocate space in .plt, .got and associated reloc sections for
3362 local dynamic relocs. */
3365 elf_x86_64_allocate_local_dynrelocs (void **slot, void *inf)
3367 struct elf_link_hash_entry *h
3368 = (struct elf_link_hash_entry *) *slot;
3370 if (h->type != STT_GNU_IFUNC
3374 || h->root.type != bfd_link_hash_defined)
3377 return elf_x86_64_allocate_dynrelocs (h, inf);
3380 /* Find any dynamic relocs that apply to read-only sections. */
3383 elf_x86_64_readonly_dynrelocs (struct elf_link_hash_entry *h,
3386 struct elf_x86_64_link_hash_entry *eh;
3387 struct elf_dyn_relocs *p;
3389 /* Skip local IFUNC symbols. */
3390 if (h->forced_local && h->type == STT_GNU_IFUNC)
3393 eh = (struct elf_x86_64_link_hash_entry *) h;
3394 for (p = eh->dyn_relocs; p != NULL; p = p->next)
3396 asection *s = p->sec->output_section;
3398 if (s != NULL && (s->flags & SEC_READONLY) != 0)
3400 struct bfd_link_info *info = (struct bfd_link_info *) inf;
3402 info->flags |= DF_TEXTREL;
3404 if ((info->warn_shared_textrel && bfd_link_pic (info))
3405 || info->error_textrel)
3406 /* xgettext:c-format */
3407 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
3408 p->sec->owner, h->root.root.string,
3411 /* Not an error, just cut short the traversal. */
3418 /* Convert load via the GOT slot to load immediate. */
3421 elf_x86_64_convert_load (bfd *abfd, asection *sec,
3422 struct bfd_link_info *link_info)
3424 Elf_Internal_Shdr *symtab_hdr;
3425 Elf_Internal_Rela *internal_relocs;
3426 Elf_Internal_Rela *irel, *irelend;
3428 struct elf_x86_64_link_hash_table *htab;
3429 bfd_boolean changed;
3430 bfd_signed_vma *local_got_refcounts;
3432 /* Don't even try to convert non-ELF outputs. */
3433 if (!is_elf_hash_table (link_info->hash))
3436 /* Nothing to do if there is no need or no output. */
3437 if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
3438 || sec->need_convert_load == 0
3439 || bfd_is_abs_section (sec->output_section))
3442 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3444 /* Load the relocations for this section. */
3445 internal_relocs = (_bfd_elf_link_read_relocs
3446 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
3447 link_info->keep_memory));
3448 if (internal_relocs == NULL)
3452 htab = elf_x86_64_hash_table (link_info);
3453 local_got_refcounts = elf_local_got_refcounts (abfd);
3455 /* Get the section contents. */
3456 if (elf_section_data (sec)->this_hdr.contents != NULL)
3457 contents = elf_section_data (sec)->this_hdr.contents;
3460 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
3464 irelend = internal_relocs + sec->reloc_count;
3465 for (irel = internal_relocs; irel < irelend; irel++)
3467 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
3468 unsigned int r_symndx;
3469 struct elf_link_hash_entry *h;
3470 bfd_boolean converted;
3472 if (r_type != R_X86_64_GOTPCRELX
3473 && r_type != R_X86_64_REX_GOTPCRELX
3474 && r_type != R_X86_64_GOTPCREL)
3477 r_symndx = htab->r_sym (irel->r_info);
3478 if (r_symndx < symtab_hdr->sh_info)
3479 h = elf_x86_64_get_local_sym_hash (htab, sec->owner,
3480 (const Elf_Internal_Rela *) irel,
3484 h = elf_sym_hashes (abfd)[r_symndx - symtab_hdr->sh_info];
3485 while (h->root.type == bfd_link_hash_indirect
3486 || h->root.type == bfd_link_hash_warning)
3487 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3490 /* STT_GNU_IFUNC must keep GOTPCREL relocations. */
3491 if (h != NULL && h->type == STT_GNU_IFUNC)
3495 if (!elf_x86_64_convert_load_reloc (abfd, sec, contents, irel, h,
3496 &converted, link_info))
3501 changed = converted;
3504 if (h->got.refcount > 0)
3505 h->got.refcount -= 1;
3509 if (local_got_refcounts != NULL
3510 && local_got_refcounts[r_symndx] > 0)
3511 local_got_refcounts[r_symndx] -= 1;
3516 if (contents != NULL
3517 && elf_section_data (sec)->this_hdr.contents != contents)
3519 if (!changed && !link_info->keep_memory)
3523 /* Cache the section contents for elf_link_input_bfd. */
3524 elf_section_data (sec)->this_hdr.contents = contents;
3528 if (elf_section_data (sec)->relocs != internal_relocs)
3531 free (internal_relocs);
3533 elf_section_data (sec)->relocs = internal_relocs;
3539 if (contents != NULL
3540 && elf_section_data (sec)->this_hdr.contents != contents)
3542 if (internal_relocs != NULL
3543 && elf_section_data (sec)->relocs != internal_relocs)
3544 free (internal_relocs);
3548 /* Set the sizes of the dynamic sections. */
3551 elf_x86_64_size_dynamic_sections (bfd *output_bfd,
3552 struct bfd_link_info *info)
3554 struct elf_x86_64_link_hash_table *htab;
3559 const struct elf_backend_data *bed;
3561 htab = elf_x86_64_hash_table (info);
3564 bed = get_elf_backend_data (output_bfd);
3566 dynobj = htab->elf.dynobj;
3570 /* Set up .got offsets for local syms, and space for local dynamic
3572 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3574 bfd_signed_vma *local_got;
3575 bfd_signed_vma *end_local_got;
3576 char *local_tls_type;
3577 bfd_vma *local_tlsdesc_gotent;
3578 bfd_size_type locsymcount;
3579 Elf_Internal_Shdr *symtab_hdr;
3582 if (! is_x86_64_elf (ibfd))
3585 for (s = ibfd->sections; s != NULL; s = s->next)
3587 struct elf_dyn_relocs *p;
3589 if (!elf_x86_64_convert_load (ibfd, s, info))
3592 for (p = (struct elf_dyn_relocs *)
3593 (elf_section_data (s)->local_dynrel);
3597 if (!bfd_is_abs_section (p->sec)
3598 && bfd_is_abs_section (p->sec->output_section))
3600 /* Input section has been discarded, either because
3601 it is a copy of a linkonce section or due to
3602 linker script /DISCARD/, so we'll be discarding
3605 else if (p->count != 0)
3607 srel = elf_section_data (p->sec)->sreloc;
3608 srel->size += p->count * bed->s->sizeof_rela;
3609 if ((p->sec->output_section->flags & SEC_READONLY) != 0
3610 && (info->flags & DF_TEXTREL) == 0)
3612 info->flags |= DF_TEXTREL;
3613 if ((info->warn_shared_textrel && bfd_link_pic (info))
3614 || info->error_textrel)
3615 /* xgettext:c-format */
3616 info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"),
3617 p->sec->owner, p->sec);
3623 local_got = elf_local_got_refcounts (ibfd);
3627 symtab_hdr = &elf_symtab_hdr (ibfd);
3628 locsymcount = symtab_hdr->sh_info;
3629 end_local_got = local_got + locsymcount;
3630 local_tls_type = elf_x86_64_local_got_tls_type (ibfd);
3631 local_tlsdesc_gotent = elf_x86_64_local_tlsdesc_gotent (ibfd);
3633 srel = htab->elf.srelgot;
3634 for (; local_got < end_local_got;
3635 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
3637 *local_tlsdesc_gotent = (bfd_vma) -1;
3640 if (GOT_TLS_GDESC_P (*local_tls_type))
3642 *local_tlsdesc_gotent = htab->elf.sgotplt->size
3643 - elf_x86_64_compute_jump_table_size (htab);
3644 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
3645 *local_got = (bfd_vma) -2;
3647 if (! GOT_TLS_GDESC_P (*local_tls_type)
3648 || GOT_TLS_GD_P (*local_tls_type))
3650 *local_got = s->size;
3651 s->size += GOT_ENTRY_SIZE;
3652 if (GOT_TLS_GD_P (*local_tls_type))
3653 s->size += GOT_ENTRY_SIZE;
3655 if (bfd_link_pic (info)
3656 || GOT_TLS_GD_ANY_P (*local_tls_type)
3657 || *local_tls_type == GOT_TLS_IE)
3659 if (GOT_TLS_GDESC_P (*local_tls_type))
3661 htab->elf.srelplt->size
3662 += bed->s->sizeof_rela;
3663 htab->tlsdesc_plt = (bfd_vma) -1;
3665 if (! GOT_TLS_GDESC_P (*local_tls_type)
3666 || GOT_TLS_GD_P (*local_tls_type))
3667 srel->size += bed->s->sizeof_rela;
3671 *local_got = (bfd_vma) -1;
3675 if (htab->tls_ld_got.refcount > 0)
3677 /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
3679 htab->tls_ld_got.offset = htab->elf.sgot->size;
3680 htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE;
3681 htab->elf.srelgot->size += bed->s->sizeof_rela;
3684 htab->tls_ld_got.offset = -1;
3686 /* Allocate global sym .plt and .got entries, and space for global
3687 sym dynamic relocs. */
3688 elf_link_hash_traverse (&htab->elf, elf_x86_64_allocate_dynrelocs,
3691 /* Allocate .plt and .got entries, and space for local symbols. */
3692 htab_traverse (htab->loc_hash_table,
3693 elf_x86_64_allocate_local_dynrelocs,
3696 /* For every jump slot reserved in the sgotplt, reloc_count is
3697 incremented. However, when we reserve space for TLS descriptors,
3698 it's not incremented, so in order to compute the space reserved
3699 for them, it suffices to multiply the reloc count by the jump
3702 PR ld/13302: We start next_irelative_index at the end of .rela.plt
3703 so that R_X86_64_IRELATIVE entries come last. */
3704 if (htab->elf.srelplt)
3706 htab->sgotplt_jump_table_size
3707 = elf_x86_64_compute_jump_table_size (htab);
3708 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
3710 else if (htab->elf.irelplt)
3711 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
3713 if (htab->tlsdesc_plt)
3715 /* If we're not using lazy TLS relocations, don't generate the
3716 PLT and GOT entries they require. */
3717 if ((info->flags & DF_BIND_NOW))
3718 htab->tlsdesc_plt = 0;
3721 htab->tlsdesc_got = htab->elf.sgot->size;
3722 htab->elf.sgot->size += GOT_ENTRY_SIZE;
3723 /* Reserve room for the initial entry.
3724 FIXME: we could probably do away with it in this case. */
3725 if (htab->elf.splt->size == 0)
3726 htab->elf.splt->size = htab->plt.plt_entry_size;
3727 htab->tlsdesc_plt = htab->elf.splt->size;
3728 htab->elf.splt->size += htab->plt.plt_entry_size;
3732 if (htab->elf.sgotplt)
3734 /* Don't allocate .got.plt section if there are no GOT nor PLT
3735 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
3736 if ((htab->elf.hgot == NULL
3737 || !htab->elf.hgot->ref_regular_nonweak)
3738 && (htab->elf.sgotplt->size
3739 == get_elf_backend_data (output_bfd)->got_header_size)
3740 && (htab->elf.splt == NULL
3741 || htab->elf.splt->size == 0)
3742 && (htab->elf.sgot == NULL
3743 || htab->elf.sgot->size == 0)
3744 && (htab->elf.iplt == NULL
3745 || htab->elf.iplt->size == 0)
3746 && (htab->elf.igotplt == NULL
3747 || htab->elf.igotplt->size == 0))
3748 htab->elf.sgotplt->size = 0;
3751 if (_bfd_elf_eh_frame_present (info))
3753 if (htab->plt_eh_frame != NULL
3754 && htab->elf.splt != NULL
3755 && htab->elf.splt->size != 0
3756 && !bfd_is_abs_section (htab->elf.splt->output_section))
3757 htab->plt_eh_frame->size = htab->plt.eh_frame_plt_size;
3759 if (htab->plt_got_eh_frame != NULL
3760 && htab->plt_got != NULL
3761 && htab->plt_got->size != 0
3762 && !bfd_is_abs_section (htab->plt_got->output_section))
3763 htab->plt_got_eh_frame->size
3764 = htab->non_lazy_plt->eh_frame_plt_size;
3766 /* Unwind info for the second PLT and .plt.got sections are
3768 if (htab->plt_second_eh_frame != NULL
3769 && htab->plt_second != NULL
3770 && htab->plt_second->size != 0
3771 && !bfd_is_abs_section (htab->plt_second->output_section))
3772 htab->plt_second_eh_frame->size
3773 = htab->non_lazy_plt->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_second
3790 || s == htab->plt_got
3791 || s == htab->plt_eh_frame
3792 || s == htab->plt_got_eh_frame
3793 || s == htab->plt_second_eh_frame
3794 || s == htab->elf.sdynbss
3795 || s == htab->elf.sdynrelro)
3797 /* Strip this section if we don't need it; see the
3800 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
3802 if (s->size != 0 && s != htab->elf.srelplt)
3805 /* We use the reloc_count field as a counter if we need
3806 to copy relocs into the output file. */
3807 if (s != htab->elf.srelplt)
3812 /* It's not one of our sections, so don't allocate space. */
3818 /* If we don't need this section, strip it from the
3819 output file. This is mostly to handle .rela.bss and
3820 .rela.plt. We must create both sections in
3821 create_dynamic_sections, because they must be created
3822 before the linker maps input sections to output
3823 sections. The linker does that before
3824 adjust_dynamic_symbol is called, and it is that
3825 function which decides whether anything needs to go
3826 into these sections. */
3828 s->flags |= SEC_EXCLUDE;
3832 if ((s->flags & SEC_HAS_CONTENTS) == 0)
3835 /* Allocate memory for the section contents. We use bfd_zalloc
3836 here in case unused entries are not reclaimed before the
3837 section's contents are written out. This should not happen,
3838 but this way if it does, we get a R_X86_64_NONE reloc instead
3840 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
3841 if (s->contents == NULL)
3845 if (htab->plt_eh_frame != NULL
3846 && htab->plt_eh_frame->contents != NULL)
3848 memcpy (htab->plt_eh_frame->contents,
3849 htab->plt.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->plt_got_eh_frame != NULL
3855 && htab->plt_got_eh_frame->contents != NULL)
3857 memcpy (htab->plt_got_eh_frame->contents,
3858 htab->non_lazy_plt->eh_frame_plt,
3859 htab->plt_got_eh_frame->size);
3860 bfd_put_32 (dynobj, htab->plt_got->size,
3861 (htab->plt_got_eh_frame->contents
3862 + PLT_FDE_LEN_OFFSET));
3865 if (htab->plt_second_eh_frame != NULL
3866 && htab->plt_second_eh_frame->contents != NULL)
3868 memcpy (htab->plt_second_eh_frame->contents,
3869 htab->non_lazy_plt->eh_frame_plt,
3870 htab->plt_second_eh_frame->size);
3871 bfd_put_32 (dynobj, htab->plt_second->size,
3872 (htab->plt_second_eh_frame->contents
3873 + PLT_FDE_LEN_OFFSET));
3876 if (htab->elf.dynamic_sections_created)
3878 /* Add some entries to the .dynamic section. We fill in the
3879 values later, in elf_x86_64_finish_dynamic_sections, but we
3880 must add the entries now so that we get the correct size for
3881 the .dynamic section. The DT_DEBUG entry is filled in by the
3882 dynamic linker and used by the debugger. */
3883 #define add_dynamic_entry(TAG, VAL) \
3884 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3886 if (bfd_link_executable (info))
3888 if (!add_dynamic_entry (DT_DEBUG, 0))
3892 if (htab->elf.splt->size != 0)
3894 /* DT_PLTGOT is used by prelink even if there is no PLT
3896 if (!add_dynamic_entry (DT_PLTGOT, 0))
3900 if (htab->elf.srelplt->size != 0)
3902 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
3903 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3904 || !add_dynamic_entry (DT_JMPREL, 0))
3908 if (htab->tlsdesc_plt
3909 && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
3910 || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
3915 if (!add_dynamic_entry (DT_RELA, 0)
3916 || !add_dynamic_entry (DT_RELASZ, 0)
3917 || !add_dynamic_entry (DT_RELAENT, bed->s->sizeof_rela))
3920 /* If any dynamic relocs apply to a read-only section,
3921 then we need a DT_TEXTREL entry. */
3922 if ((info->flags & DF_TEXTREL) == 0)
3923 elf_link_hash_traverse (&htab->elf,
3924 elf_x86_64_readonly_dynrelocs,
3927 if ((info->flags & DF_TEXTREL) != 0)
3929 if (htab->readonly_dynrelocs_against_ifunc)
3931 info->callbacks->einfo
3932 (_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n"));
3933 bfd_set_error (bfd_error_bad_value);
3937 if (!add_dynamic_entry (DT_TEXTREL, 0))
3942 #undef add_dynamic_entry
3948 elf_x86_64_always_size_sections (bfd *output_bfd,
3949 struct bfd_link_info *info)
3951 asection *tls_sec = elf_hash_table (info)->tls_sec;
3955 struct elf_link_hash_entry *tlsbase;
3957 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3958 "_TLS_MODULE_BASE_",
3959 FALSE, FALSE, FALSE);
3961 if (tlsbase && tlsbase->type == STT_TLS)
3963 struct elf_x86_64_link_hash_table *htab;
3964 struct bfd_link_hash_entry *bh = NULL;
3965 const struct elf_backend_data *bed
3966 = get_elf_backend_data (output_bfd);
3968 htab = elf_x86_64_hash_table (info);
3972 if (!(_bfd_generic_link_add_one_symbol
3973 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3974 tls_sec, 0, NULL, FALSE,
3975 bed->collect, &bh)))
3978 htab->tls_module_base = bh;
3980 tlsbase = (struct elf_link_hash_entry *)bh;
3981 tlsbase->def_regular = 1;
3982 tlsbase->other = STV_HIDDEN;
3983 tlsbase->root.linker_def = 1;
3984 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3991 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3992 executables. Rather than setting it to the beginning of the TLS
3993 section, we have to set it to the end. This function may be called
3994 multiple times, it is idempotent. */
3997 elf_x86_64_set_tls_module_base (struct bfd_link_info *info)
3999 struct elf_x86_64_link_hash_table *htab;
4000 struct bfd_link_hash_entry *base;
4002 if (!bfd_link_executable (info))
4005 htab = elf_x86_64_hash_table (info);
4009 base = htab->tls_module_base;
4013 base->u.def.value = htab->elf.tls_size;
4016 /* Return the base VMA address which should be subtracted from real addresses
4017 when resolving @dtpoff relocation.
4018 This is PT_TLS segment p_vaddr. */
4021 elf_x86_64_dtpoff_base (struct bfd_link_info *info)
4023 /* If tls_sec is NULL, we should have signalled an error already. */
4024 if (elf_hash_table (info)->tls_sec == NULL)
4026 return elf_hash_table (info)->tls_sec->vma;
4029 /* Return the relocation value for @tpoff relocation
4030 if STT_TLS virtual address is ADDRESS. */
4033 elf_x86_64_tpoff (struct bfd_link_info *info, bfd_vma address)
4035 struct elf_link_hash_table *htab = elf_hash_table (info);
4036 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
4037 bfd_vma static_tls_size;
4039 /* If tls_segment is NULL, we should have signalled an error already. */
4040 if (htab->tls_sec == NULL)
4043 /* Consider special static TLS alignment requirements. */
4044 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
4045 return address - static_tls_size - htab->tls_sec->vma;
4048 /* Is the instruction before OFFSET in CONTENTS a 32bit relative
4052 is_32bit_relative_branch (bfd_byte *contents, bfd_vma offset)
4054 /* Opcode Instruction
4057 0x0f 0x8x conditional jump */
4059 && (contents [offset - 1] == 0xe8
4060 || contents [offset - 1] == 0xe9))
4062 && contents [offset - 2] == 0x0f
4063 && (contents [offset - 1] & 0xf0) == 0x80));
4066 /* Relocate an x86_64 ELF section. */
4069 elf_x86_64_relocate_section (bfd *output_bfd,
4070 struct bfd_link_info *info,
4072 asection *input_section,
4074 Elf_Internal_Rela *relocs,
4075 Elf_Internal_Sym *local_syms,
4076 asection **local_sections)
4078 struct elf_x86_64_link_hash_table *htab;
4079 Elf_Internal_Shdr *symtab_hdr;
4080 struct elf_link_hash_entry **sym_hashes;
4081 bfd_vma *local_got_offsets;
4082 bfd_vma *local_tlsdesc_gotents;
4083 Elf_Internal_Rela *rel;
4084 Elf_Internal_Rela *wrel;
4085 Elf_Internal_Rela *relend;
4086 unsigned int plt_entry_size;
4088 BFD_ASSERT (is_x86_64_elf (input_bfd));
4090 /* Skip if check_relocs failed. */
4091 if (input_section->check_relocs_failed)
4094 htab = elf_x86_64_hash_table (info);
4097 plt_entry_size = htab->plt.plt_entry_size;
4098 symtab_hdr = &elf_symtab_hdr (input_bfd);
4099 sym_hashes = elf_sym_hashes (input_bfd);
4100 local_got_offsets = elf_local_got_offsets (input_bfd);
4101 local_tlsdesc_gotents = elf_x86_64_local_tlsdesc_gotent (input_bfd);
4103 elf_x86_64_set_tls_module_base (info);
4105 rel = wrel = relocs;
4106 relend = relocs + input_section->reloc_count;
4107 for (; rel < relend; wrel++, rel++)
4109 unsigned int r_type;
4110 reloc_howto_type *howto;
4111 unsigned long r_symndx;
4112 struct elf_link_hash_entry *h;
4113 struct elf_x86_64_link_hash_entry *eh;
4114 Elf_Internal_Sym *sym;
4116 bfd_vma off, offplt, plt_offset;
4118 bfd_boolean unresolved_reloc;
4119 bfd_reloc_status_type r;
4121 asection *base_got, *resolved_plt;
4123 bfd_boolean resolved_to_zero;
4124 bfd_boolean relative_reloc;
4126 r_type = ELF32_R_TYPE (rel->r_info);
4127 if (r_type == (int) R_X86_64_GNU_VTINHERIT
4128 || r_type == (int) R_X86_64_GNU_VTENTRY)
4135 if (r_type >= (int) R_X86_64_standard)
4138 /* xgettext:c-format */
4139 (_("%B: unrecognized relocation (0x%x) in section `%A'"),
4140 input_bfd, r_type, input_section);
4141 bfd_set_error (bfd_error_bad_value);
4145 if (r_type != (int) R_X86_64_32
4146 || ABI_64_P (output_bfd))
4147 howto = x86_64_elf_howto_table + r_type;
4149 howto = (x86_64_elf_howto_table
4150 + ARRAY_SIZE (x86_64_elf_howto_table) - 1);
4151 r_symndx = htab->r_sym (rel->r_info);
4155 unresolved_reloc = FALSE;
4156 if (r_symndx < symtab_hdr->sh_info)
4158 sym = local_syms + r_symndx;
4159 sec = local_sections[r_symndx];
4161 relocation = _bfd_elf_rela_local_sym (output_bfd, sym,
4163 st_size = sym->st_size;
4165 /* Relocate against local STT_GNU_IFUNC symbol. */
4166 if (!bfd_link_relocatable (info)
4167 && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
4169 h = elf_x86_64_get_local_sym_hash (htab, input_bfd,
4174 /* Set STT_GNU_IFUNC symbol value. */
4175 h->root.u.def.value = sym->st_value;
4176 h->root.u.def.section = sec;
4181 bfd_boolean warned ATTRIBUTE_UNUSED;
4182 bfd_boolean ignored ATTRIBUTE_UNUSED;
4184 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4185 r_symndx, symtab_hdr, sym_hashes,
4187 unresolved_reloc, warned, ignored);
4191 if (sec != NULL && discarded_section (sec))
4193 _bfd_clear_contents (howto, input_bfd, input_section,
4194 contents + rel->r_offset);
4195 wrel->r_offset = rel->r_offset;
4199 /* For ld -r, remove relocations in debug sections against
4200 sections defined in discarded sections. Not done for
4201 eh_frame editing code expects to be present. */
4202 if (bfd_link_relocatable (info)
4203 && (input_section->flags & SEC_DEBUGGING))
4209 if (bfd_link_relocatable (info))
4216 if (rel->r_addend == 0 && !ABI_64_P (output_bfd))
4218 if (r_type == R_X86_64_64)
4220 /* For x32, treat R_X86_64_64 like R_X86_64_32 and
4221 zero-extend it to 64bit if addend is zero. */
4222 r_type = R_X86_64_32;
4223 memset (contents + rel->r_offset + 4, 0, 4);
4225 else if (r_type == R_X86_64_SIZE64)
4227 /* For x32, treat R_X86_64_SIZE64 like R_X86_64_SIZE32 and
4228 zero-extend it to 64bit if addend is zero. */
4229 r_type = R_X86_64_SIZE32;
4230 memset (contents + rel->r_offset + 4, 0, 4);
4234 eh = (struct elf_x86_64_link_hash_entry *) h;
4236 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
4237 it here if it is defined in a non-shared object. */
4239 && h->type == STT_GNU_IFUNC
4245 if ((input_section->flags & SEC_ALLOC) == 0)
4247 /* Dynamic relocs are not propagated for SEC_DEBUGGING
4248 sections because such sections are not SEC_ALLOC and
4249 thus ld.so will not process them. */
4250 if ((input_section->flags & SEC_DEBUGGING) != 0)
4260 case R_X86_64_GOTPCREL:
4261 case R_X86_64_GOTPCRELX:
4262 case R_X86_64_REX_GOTPCRELX:
4263 case R_X86_64_GOTPCREL64:
4264 base_got = htab->elf.sgot;
4265 off = h->got.offset;
4267 if (base_got == NULL)
4270 if (off == (bfd_vma) -1)
4272 /* We can't use h->got.offset here to save state, or
4273 even just remember the offset, as finish_dynamic_symbol
4274 would use that as offset into .got. */
4276 if (h->plt.offset == (bfd_vma) -1)
4279 if (htab->elf.splt != NULL)
4281 plt_index = (h->plt.offset / plt_entry_size
4282 - htab->plt.has_plt0);
4283 off = (plt_index + 3) * GOT_ENTRY_SIZE;
4284 base_got = htab->elf.sgotplt;
4288 plt_index = h->plt.offset / plt_entry_size;
4289 off = plt_index * GOT_ENTRY_SIZE;
4290 base_got = htab->elf.igotplt;
4293 if (h->dynindx == -1
4297 /* This references the local defitionion. We must
4298 initialize this entry in the global offset table.
4299 Since the offset must always be a multiple of 8,
4300 we use the least significant bit to record
4301 whether we have initialized it already.
4303 When doing a dynamic link, we create a .rela.got
4304 relocation entry to initialize the value. This
4305 is done in the finish_dynamic_symbol routine. */
4310 bfd_put_64 (output_bfd, relocation,
4311 base_got->contents + off);
4312 /* Note that this is harmless for the GOTPLT64
4313 case, as -1 | 1 still is -1. */
4319 relocation = (base_got->output_section->vma
4320 + base_got->output_offset + off);
4325 if (h->plt.offset == (bfd_vma) -1)
4327 /* Handle static pointers of STT_GNU_IFUNC symbols. */
4328 if (r_type == htab->pointer_r_type
4329 && (input_section->flags & SEC_CODE) == 0)
4330 goto do_ifunc_pointer;
4331 goto bad_ifunc_reloc;
4334 /* STT_GNU_IFUNC symbol must go through PLT. */
4335 if (htab->elf.splt != NULL)
4337 if (htab->plt_second != NULL)
4339 resolved_plt = htab->plt_second;
4340 plt_offset = eh->plt_second.offset;
4344 resolved_plt = htab->elf.splt;
4345 plt_offset = h->plt.offset;
4350 resolved_plt = htab->elf.iplt;
4351 plt_offset = h->plt.offset;
4354 relocation = (resolved_plt->output_section->vma
4355 + resolved_plt->output_offset + plt_offset);
4361 if (h->root.root.string)
4362 name = h->root.root.string;
4364 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
4367 /* xgettext:c-format */
4368 (_("%B: relocation %s against STT_GNU_IFUNC "
4369 "symbol `%s' isn't supported"), input_bfd,
4371 bfd_set_error (bfd_error_bad_value);
4375 if (bfd_link_pic (info))
4380 if (ABI_64_P (output_bfd))
4385 if (rel->r_addend != 0)
4387 if (h->root.root.string)
4388 name = h->root.root.string;
4390 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
4393 /* xgettext:c-format */
4394 (_("%B: relocation %s against STT_GNU_IFUNC "
4395 "symbol `%s' has non-zero addend: %d"),
4396 input_bfd, howto->name, name, rel->r_addend);
4397 bfd_set_error (bfd_error_bad_value);
4401 /* Generate dynamic relcoation only when there is a
4402 non-GOT reference in a shared object or there is no
4404 if ((bfd_link_pic (info) && h->non_got_ref)
4405 || h->plt.offset == (bfd_vma) -1)
4407 Elf_Internal_Rela outrel;
4410 /* Need a dynamic relocation to get the real function
4412 outrel.r_offset = _bfd_elf_section_offset (output_bfd,
4416 if (outrel.r_offset == (bfd_vma) -1
4417 || outrel.r_offset == (bfd_vma) -2)
4420 outrel.r_offset += (input_section->output_section->vma
4421 + input_section->output_offset);
4423 if (h->dynindx == -1
4425 || bfd_link_executable (info))
4427 info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
4428 h->root.root.string,
4429 h->root.u.def.section->owner);
4431 /* This symbol is resolved locally. */
4432 outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
4433 outrel.r_addend = (h->root.u.def.value
4434 + h->root.u.def.section->output_section->vma
4435 + h->root.u.def.section->output_offset);
4439 outrel.r_info = htab->r_info (h->dynindx, r_type);
4440 outrel.r_addend = 0;
4443 /* Dynamic relocations are stored in
4444 1. .rela.ifunc section in PIC object.
4445 2. .rela.got section in dynamic executable.
4446 3. .rela.iplt section in static executable. */
4447 if (bfd_link_pic (info))
4448 sreloc = htab->elf.irelifunc;
4449 else if (htab->elf.splt != NULL)
4450 sreloc = htab->elf.srelgot;
4452 sreloc = htab->elf.irelplt;
4453 elf_append_rela (output_bfd, sreloc, &outrel);
4455 /* If this reloc is against an external symbol, we
4456 do not want to fiddle with the addend. Otherwise,
4457 we need to include the symbol value so that it
4458 becomes an addend for the dynamic reloc. For an
4459 internal symbol, we have updated addend. */
4464 case R_X86_64_PC32_BND:
4466 case R_X86_64_PLT32:
4467 case R_X86_64_PLT32_BND:
4472 resolved_to_zero = (eh != NULL
4473 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
4477 /* When generating a shared object, the relocations handled here are
4478 copied into the output file to be resolved at run time. */
4481 case R_X86_64_GOT32:
4482 case R_X86_64_GOT64:
4483 /* Relocation is to the entry for this symbol in the global
4485 case R_X86_64_GOTPCREL:
4486 case R_X86_64_GOTPCRELX:
4487 case R_X86_64_REX_GOTPCRELX:
4488 case R_X86_64_GOTPCREL64:
4489 /* Use global offset table entry as symbol value. */
4490 case R_X86_64_GOTPLT64:
4491 /* This is obsolete and treated the the same as GOT64. */
4492 base_got = htab->elf.sgot;
4494 if (htab->elf.sgot == NULL)
4497 relative_reloc = FALSE;
4502 off = h->got.offset;
4504 && h->plt.offset != (bfd_vma)-1
4505 && off == (bfd_vma)-1)
4507 /* We can't use h->got.offset here to save
4508 state, or even just remember the offset, as
4509 finish_dynamic_symbol would use that as offset into
4511 bfd_vma plt_index = (h->plt.offset / plt_entry_size
4512 - htab->plt.has_plt0);
4513 off = (plt_index + 3) * GOT_ENTRY_SIZE;
4514 base_got = htab->elf.sgotplt;
4517 dyn = htab->elf.dynamic_sections_created;
4519 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
4520 || (bfd_link_pic (info)
4521 && SYMBOL_REFERENCES_LOCAL (info, h))
4522 || (ELF_ST_VISIBILITY (h->other)
4523 && h->root.type == bfd_link_hash_undefweak))
4525 /* This is actually a static link, or it is a -Bsymbolic
4526 link and the symbol is defined locally, or the symbol
4527 was forced to be local because of a version file. We
4528 must initialize this entry in the global offset table.
4529 Since the offset must always be a multiple of 8, we
4530 use the least significant bit to record whether we
4531 have initialized it already.
4533 When doing a dynamic link, we create a .rela.got
4534 relocation entry to initialize the value. This is
4535 done in the finish_dynamic_symbol routine. */
4540 bfd_put_64 (output_bfd, relocation,
4541 base_got->contents + off);
4542 /* Note that this is harmless for the GOTPLT64 case,
4543 as -1 | 1 still is -1. */
4546 if (h->dynindx == -1
4548 && h->root.type != bfd_link_hash_undefweak
4549 && bfd_link_pic (info))
4551 /* If this symbol isn't dynamic in PIC,
4552 generate R_X86_64_RELATIVE here. */
4553 eh->no_finish_dynamic_symbol = 1;
4554 relative_reloc = TRUE;
4559 unresolved_reloc = FALSE;
4563 if (local_got_offsets == NULL)
4566 off = local_got_offsets[r_symndx];
4568 /* The offset must always be a multiple of 8. We use
4569 the least significant bit to record whether we have
4570 already generated the necessary reloc. */
4575 bfd_put_64 (output_bfd, relocation,
4576 base_got->contents + off);
4577 local_got_offsets[r_symndx] |= 1;
4579 if (bfd_link_pic (info))
4580 relative_reloc = TRUE;
4587 Elf_Internal_Rela outrel;
4589 /* We need to generate a R_X86_64_RELATIVE reloc
4590 for the dynamic linker. */
4591 s = htab->elf.srelgot;
4595 outrel.r_offset = (base_got->output_section->vma
4596 + base_got->output_offset
4598 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4599 outrel.r_addend = relocation;
4600 elf_append_rela (output_bfd, s, &outrel);
4603 if (off >= (bfd_vma) -2)
4606 relocation = base_got->output_section->vma
4607 + base_got->output_offset + off;
4608 if (r_type != R_X86_64_GOTPCREL
4609 && r_type != R_X86_64_GOTPCRELX
4610 && r_type != R_X86_64_REX_GOTPCRELX
4611 && r_type != R_X86_64_GOTPCREL64)
4612 relocation -= htab->elf.sgotplt->output_section->vma
4613 - htab->elf.sgotplt->output_offset;
4617 case R_X86_64_GOTOFF64:
4618 /* Relocation is relative to the start of the global offset
4621 /* Check to make sure it isn't a protected function or data
4622 symbol for shared library since it may not be local when
4623 used as function address or with copy relocation. We also
4624 need to make sure that a symbol is referenced locally. */
4625 if (bfd_link_pic (info) && h)
4627 if (!h->def_regular)
4631 switch (ELF_ST_VISIBILITY (h->other))
4634 v = _("hidden symbol");
4637 v = _("internal symbol");
4640 v = _("protected symbol");
4648 /* xgettext:c-format */
4649 (_("%B: relocation R_X86_64_GOTOFF64 against undefined %s"
4650 " `%s' can not be used when making a shared object"),
4651 input_bfd, v, h->root.root.string);
4652 bfd_set_error (bfd_error_bad_value);
4655 else if (!bfd_link_executable (info)
4656 && !SYMBOL_REFERENCES_LOCAL (info, h)
4657 && (h->type == STT_FUNC
4658 || h->type == STT_OBJECT)
4659 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
4662 /* xgettext:c-format */
4663 (_("%B: relocation R_X86_64_GOTOFF64 against protected %s"
4664 " `%s' can not be used when making a shared object"),
4666 h->type == STT_FUNC ? "function" : "data",
4667 h->root.root.string);
4668 bfd_set_error (bfd_error_bad_value);
4673 /* Note that sgot is not involved in this
4674 calculation. We always want the start of .got.plt. If we
4675 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
4676 permitted by the ABI, we might have to change this
4678 relocation -= htab->elf.sgotplt->output_section->vma
4679 + htab->elf.sgotplt->output_offset;
4682 case R_X86_64_GOTPC32:
4683 case R_X86_64_GOTPC64:
4684 /* Use global offset table as symbol value. */
4685 relocation = htab->elf.sgotplt->output_section->vma
4686 + htab->elf.sgotplt->output_offset;
4687 unresolved_reloc = FALSE;
4690 case R_X86_64_PLTOFF64:
4691 /* Relocation is PLT entry relative to GOT. For local
4692 symbols it's the symbol itself relative to GOT. */
4694 /* See PLT32 handling. */
4695 && (h->plt.offset != (bfd_vma) -1
4696 || eh->plt_got.offset != (bfd_vma) -1)
4697 && htab->elf.splt != NULL)
4699 if (eh->plt_got.offset != (bfd_vma) -1)
4701 /* Use the GOT PLT. */
4702 resolved_plt = htab->plt_got;
4703 plt_offset = eh->plt_got.offset;
4705 else if (htab->plt_second != NULL)
4707 resolved_plt = htab->plt_second;
4708 plt_offset = eh->plt_second.offset;
4712 resolved_plt = htab->elf.splt;
4713 plt_offset = h->plt.offset;
4716 relocation = (resolved_plt->output_section->vma
4717 + resolved_plt->output_offset
4719 unresolved_reloc = FALSE;
4722 relocation -= htab->elf.sgotplt->output_section->vma
4723 + htab->elf.sgotplt->output_offset;
4726 case R_X86_64_PLT32:
4727 case R_X86_64_PLT32_BND:
4728 /* Relocation is to the entry for this symbol in the
4729 procedure linkage table. */
4731 /* Resolve a PLT32 reloc against a local symbol directly,
4732 without using the procedure linkage table. */
4736 if ((h->plt.offset == (bfd_vma) -1
4737 && eh->plt_got.offset == (bfd_vma) -1)
4738 || htab->elf.splt == NULL)
4740 /* We didn't make a PLT entry for this symbol. This
4741 happens when statically linking PIC code, or when
4742 using -Bsymbolic. */
4746 if (h->plt.offset != (bfd_vma) -1)
4748 if (htab->plt_second != NULL)
4750 resolved_plt = htab->plt_second;
4751 plt_offset = eh->plt_second.offset;
4755 resolved_plt = htab->elf.splt;
4756 plt_offset = h->plt.offset;
4761 /* Use the GOT PLT. */
4762 resolved_plt = htab->plt_got;
4763 plt_offset = eh->plt_got.offset;
4766 relocation = (resolved_plt->output_section->vma
4767 + resolved_plt->output_offset
4769 unresolved_reloc = FALSE;
4772 case R_X86_64_SIZE32:
4773 case R_X86_64_SIZE64:
4774 /* Set to symbol size. */
4775 relocation = st_size;
4781 case R_X86_64_PC32_BND:
4782 /* Don't complain about -fPIC if the symbol is undefined when
4783 building executable unless it is unresolved weak symbol. */
4784 if ((input_section->flags & SEC_ALLOC) != 0
4785 && (input_section->flags & SEC_READONLY) != 0
4787 && ((bfd_link_executable (info)
4788 && h->root.type == bfd_link_hash_undefweak
4789 && !resolved_to_zero)
4790 || (bfd_link_pic (info)
4791 && !(bfd_link_pie (info)
4792 && h->root.type == bfd_link_hash_undefined))))
4794 bfd_boolean fail = FALSE;
4796 = ((r_type == R_X86_64_PC32
4797 || r_type == R_X86_64_PC32_BND)
4798 && is_32bit_relative_branch (contents, rel->r_offset));
4800 if (SYMBOL_REFERENCES_LOCAL (info, h))
4802 /* Symbol is referenced locally. Make sure it is
4803 defined locally or for a branch. */
4804 fail = (!(h->def_regular || ELF_COMMON_DEF_P (h))
4807 else if (!(bfd_link_pie (info)
4808 && (h->needs_copy || eh->needs_copy)))
4810 /* Symbol doesn't need copy reloc and isn't referenced
4811 locally. We only allow branch to symbol with
4812 non-default visibility. */
4814 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT);
4818 return elf_x86_64_need_pic (input_bfd, input_section,
4819 h, NULL, NULL, howto);
4828 /* FIXME: The ABI says the linker should make sure the value is
4829 the same when it's zeroextended to 64 bit. */
4832 if ((input_section->flags & SEC_ALLOC) == 0)
4835 /* Don't copy a pc-relative relocation into the output file
4836 if the symbol needs copy reloc or the symbol is undefined
4837 when building executable. Copy dynamic function pointer
4838 relocations. Don't generate dynamic relocations against
4839 resolved undefined weak symbols in PIE. */
4840 if ((bfd_link_pic (info)
4841 && !(bfd_link_pie (info)
4845 || h->root.type == bfd_link_hash_undefined)
4846 && (IS_X86_64_PCREL_TYPE (r_type)
4847 || r_type == R_X86_64_SIZE32
4848 || r_type == R_X86_64_SIZE64))
4850 || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4851 && !resolved_to_zero)
4852 || h->root.type != bfd_link_hash_undefweak))
4853 && ((! IS_X86_64_PCREL_TYPE (r_type)
4854 && r_type != R_X86_64_SIZE32
4855 && r_type != R_X86_64_SIZE64)
4856 || ! SYMBOL_CALLS_LOCAL (info, h)))
4857 || (ELIMINATE_COPY_RELOCS
4858 && !bfd_link_pic (info)
4862 || eh->func_pointer_refcount > 0
4863 || (h->root.type == bfd_link_hash_undefweak
4864 && !resolved_to_zero))
4865 && ((h->def_dynamic && !h->def_regular)
4866 /* Undefined weak symbol is bound locally when
4868 || h->root.type == bfd_link_hash_undefined)))
4870 Elf_Internal_Rela outrel;
4871 bfd_boolean skip, relocate;
4874 /* When generating a shared object, these relocations
4875 are copied into the output file to be resolved at run
4881 _bfd_elf_section_offset (output_bfd, info, input_section,
4883 if (outrel.r_offset == (bfd_vma) -1)
4885 else if (outrel.r_offset == (bfd_vma) -2)
4886 skip = TRUE, relocate = TRUE;
4888 outrel.r_offset += (input_section->output_section->vma
4889 + input_section->output_offset);
4892 memset (&outrel, 0, sizeof outrel);
4894 /* h->dynindx may be -1 if this symbol was marked to
4898 && (IS_X86_64_PCREL_TYPE (r_type)
4899 || !(bfd_link_executable (info)
4900 || SYMBOLIC_BIND (info, h))
4901 || ! h->def_regular))
4903 outrel.r_info = htab->r_info (h->dynindx, r_type);
4904 outrel.r_addend = rel->r_addend;
4908 /* This symbol is local, or marked to become local.
4909 When relocation overflow check is disabled, we
4910 convert R_X86_64_32 to dynamic R_X86_64_RELATIVE. */
4911 if (r_type == htab->pointer_r_type
4912 || (r_type == R_X86_64_32
4913 && info->no_reloc_overflow_check))
4916 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4917 outrel.r_addend = relocation + rel->r_addend;
4919 else if (r_type == R_X86_64_64
4920 && !ABI_64_P (output_bfd))
4923 outrel.r_info = htab->r_info (0,
4924 R_X86_64_RELATIVE64);
4925 outrel.r_addend = relocation + rel->r_addend;
4926 /* Check addend overflow. */
4927 if ((outrel.r_addend & 0x80000000)
4928 != (rel->r_addend & 0x80000000))
4931 int addend = rel->r_addend;
4932 if (h && h->root.root.string)
4933 name = h->root.root.string;
4935 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
4939 /* xgettext:c-format */
4940 (_("%B: addend -0x%x in relocation %s against "
4941 "symbol `%s' at 0x%lx in section `%A' is "
4943 input_bfd, addend, howto->name, name,
4944 (unsigned long) rel->r_offset, input_section);
4947 /* xgettext:c-format */
4948 (_("%B: addend 0x%x in relocation %s against "
4949 "symbol `%s' at 0x%lx in section `%A' is "
4951 input_bfd, addend, howto->name, name,
4952 (unsigned long) rel->r_offset, input_section);
4953 bfd_set_error (bfd_error_bad_value);
4961 if (bfd_is_abs_section (sec))
4963 else if (sec == NULL || sec->owner == NULL)
4965 bfd_set_error (bfd_error_bad_value);
4972 /* We are turning this relocation into one
4973 against a section symbol. It would be
4974 proper to subtract the symbol's value,
4975 osec->vma, from the emitted reloc addend,
4976 but ld.so expects buggy relocs. */
4977 osec = sec->output_section;
4978 sindx = elf_section_data (osec)->dynindx;
4981 asection *oi = htab->elf.text_index_section;
4982 sindx = elf_section_data (oi)->dynindx;
4984 BFD_ASSERT (sindx != 0);
4987 outrel.r_info = htab->r_info (sindx, r_type);
4988 outrel.r_addend = relocation + rel->r_addend;
4992 sreloc = elf_section_data (input_section)->sreloc;
4994 if (sreloc == NULL || sreloc->contents == NULL)
4996 r = bfd_reloc_notsupported;
4997 goto check_relocation_error;
5000 elf_append_rela (output_bfd, sreloc, &outrel);
5002 /* If this reloc is against an external symbol, we do
5003 not want to fiddle with the addend. Otherwise, we
5004 need to include the symbol value so that it becomes
5005 an addend for the dynamic reloc. */
5012 case R_X86_64_TLSGD:
5013 case R_X86_64_GOTPC32_TLSDESC:
5014 case R_X86_64_TLSDESC_CALL:
5015 case R_X86_64_GOTTPOFF:
5016 tls_type = GOT_UNKNOWN;
5017 if (h == NULL && local_got_offsets)
5018 tls_type = elf_x86_64_local_got_tls_type (input_bfd) [r_symndx];
5020 tls_type = elf_x86_64_hash_entry (h)->tls_type;
5022 if (! elf_x86_64_tls_transition (info, input_bfd,
5023 input_section, contents,
5024 symtab_hdr, sym_hashes,
5025 &r_type, tls_type, rel,
5026 relend, h, r_symndx, TRUE))
5029 if (r_type == R_X86_64_TPOFF32)
5031 bfd_vma roff = rel->r_offset;
5033 BFD_ASSERT (! unresolved_reloc);
5035 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
5037 /* GD->LE transition. For 64bit, change
5038 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
5039 .word 0x6666; rex64; call __tls_get_addr@PLT
5041 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
5043 call *__tls_get_addr@GOTPCREL(%rip)
5044 which may be converted to
5045 addr32 call __tls_get_addr
5048 leaq foo@tpoff(%rax), %rax
5050 leaq foo@tlsgd(%rip), %rdi
5051 .word 0x6666; rex64; call __tls_get_addr@PLT
5053 leaq foo@tlsgd(%rip), %rdi
5055 call *__tls_get_addr@GOTPCREL(%rip)
5056 which may be converted to
5057 addr32 call __tls_get_addr
5060 leaq foo@tpoff(%rax), %rax
5061 For largepic, change:
5062 leaq foo@tlsgd(%rip), %rdi
5063 movabsq $__tls_get_addr@pltoff, %rax
5068 leaq foo@tpoff(%rax), %rax
5069 nopw 0x0(%rax,%rax,1) */
5071 if (ABI_64_P (output_bfd))
5073 if (contents[roff + 5] == 0xb8)
5075 memcpy (contents + roff - 3,
5076 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80"
5077 "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
5081 memcpy (contents + roff - 4,
5082 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
5086 memcpy (contents + roff - 3,
5087 "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
5089 bfd_put_32 (output_bfd,
5090 elf_x86_64_tpoff (info, relocation),
5091 contents + roff + 8 + largepic);
5092 /* Skip R_X86_64_PC32, R_X86_64_PLT32,
5093 R_X86_64_GOTPCRELX and R_X86_64_PLTOFF64. */
5098 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
5100 /* GDesc -> LE transition.
5101 It's originally something like:
5102 leaq x@tlsdesc(%rip), %rax
5105 movl $x@tpoff, %rax. */
5107 unsigned int val, type;
5109 type = bfd_get_8 (input_bfd, contents + roff - 3);
5110 val = bfd_get_8 (input_bfd, contents + roff - 1);
5111 bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
5112 contents + roff - 3);
5113 bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
5114 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
5115 contents + roff - 1);
5116 bfd_put_32 (output_bfd,
5117 elf_x86_64_tpoff (info, relocation),
5121 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
5123 /* GDesc -> LE transition.
5128 bfd_put_8 (output_bfd, 0x66, contents + roff);
5129 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
5132 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTTPOFF)
5134 /* IE->LE transition:
5135 For 64bit, originally it can be one of:
5136 movq foo@gottpoff(%rip), %reg
5137 addq foo@gottpoff(%rip), %reg
5140 leaq foo(%reg), %reg
5142 For 32bit, originally it can be one of:
5143 movq foo@gottpoff(%rip), %reg
5144 addl foo@gottpoff(%rip), %reg
5147 leal foo(%reg), %reg
5150 unsigned int val, type, reg;
5153 val = bfd_get_8 (input_bfd, contents + roff - 3);
5156 type = bfd_get_8 (input_bfd, contents + roff - 2);
5157 reg = bfd_get_8 (input_bfd, contents + roff - 1);
5163 bfd_put_8 (output_bfd, 0x49,
5164 contents + roff - 3);
5165 else if (!ABI_64_P (output_bfd) && val == 0x44)
5166 bfd_put_8 (output_bfd, 0x41,
5167 contents + roff - 3);
5168 bfd_put_8 (output_bfd, 0xc7,
5169 contents + roff - 2);
5170 bfd_put_8 (output_bfd, 0xc0 | reg,
5171 contents + roff - 1);
5175 /* addq/addl -> addq/addl - addressing with %rsp/%r12
5178 bfd_put_8 (output_bfd, 0x49,
5179 contents + roff - 3);
5180 else if (!ABI_64_P (output_bfd) && val == 0x44)
5181 bfd_put_8 (output_bfd, 0x41,
5182 contents + roff - 3);
5183 bfd_put_8 (output_bfd, 0x81,
5184 contents + roff - 2);
5185 bfd_put_8 (output_bfd, 0xc0 | reg,
5186 contents + roff - 1);
5190 /* addq/addl -> leaq/leal */
5192 bfd_put_8 (output_bfd, 0x4d,
5193 contents + roff - 3);
5194 else if (!ABI_64_P (output_bfd) && val == 0x44)
5195 bfd_put_8 (output_bfd, 0x45,
5196 contents + roff - 3);
5197 bfd_put_8 (output_bfd, 0x8d,
5198 contents + roff - 2);
5199 bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
5200 contents + roff - 1);
5202 bfd_put_32 (output_bfd,
5203 elf_x86_64_tpoff (info, relocation),
5211 if (htab->elf.sgot == NULL)
5216 off = h->got.offset;
5217 offplt = elf_x86_64_hash_entry (h)->tlsdesc_got;
5221 if (local_got_offsets == NULL)
5224 off = local_got_offsets[r_symndx];
5225 offplt = local_tlsdesc_gotents[r_symndx];
5232 Elf_Internal_Rela outrel;
5236 if (htab->elf.srelgot == NULL)
5239 indx = h && h->dynindx != -1 ? h->dynindx : 0;
5241 if (GOT_TLS_GDESC_P (tls_type))
5243 outrel.r_info = htab->r_info (indx, R_X86_64_TLSDESC);
5244 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
5245 + 2 * GOT_ENTRY_SIZE <= htab->elf.sgotplt->size);
5246 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
5247 + htab->elf.sgotplt->output_offset
5249 + htab->sgotplt_jump_table_size);
5250 sreloc = htab->elf.srelplt;
5252 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
5254 outrel.r_addend = 0;
5255 elf_append_rela (output_bfd, sreloc, &outrel);
5258 sreloc = htab->elf.srelgot;
5260 outrel.r_offset = (htab->elf.sgot->output_section->vma
5261 + htab->elf.sgot->output_offset + off);
5263 if (GOT_TLS_GD_P (tls_type))
5264 dr_type = R_X86_64_DTPMOD64;
5265 else if (GOT_TLS_GDESC_P (tls_type))
5268 dr_type = R_X86_64_TPOFF64;
5270 bfd_put_64 (output_bfd, 0, htab->elf.sgot->contents + off);
5271 outrel.r_addend = 0;
5272 if ((dr_type == R_X86_64_TPOFF64
5273 || dr_type == R_X86_64_TLSDESC) && indx == 0)
5274 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
5275 outrel.r_info = htab->r_info (indx, dr_type);
5277 elf_append_rela (output_bfd, sreloc, &outrel);
5279 if (GOT_TLS_GD_P (tls_type))
5283 BFD_ASSERT (! unresolved_reloc);
5284 bfd_put_64 (output_bfd,
5285 relocation - elf_x86_64_dtpoff_base (info),
5286 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
5290 bfd_put_64 (output_bfd, 0,
5291 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
5292 outrel.r_info = htab->r_info (indx,
5294 outrel.r_offset += GOT_ENTRY_SIZE;
5295 elf_append_rela (output_bfd, sreloc,
5304 local_got_offsets[r_symndx] |= 1;
5307 if (off >= (bfd_vma) -2
5308 && ! GOT_TLS_GDESC_P (tls_type))
5310 if (r_type == ELF32_R_TYPE (rel->r_info))
5312 if (r_type == R_X86_64_GOTPC32_TLSDESC
5313 || r_type == R_X86_64_TLSDESC_CALL)
5314 relocation = htab->elf.sgotplt->output_section->vma
5315 + htab->elf.sgotplt->output_offset
5316 + offplt + htab->sgotplt_jump_table_size;
5318 relocation = htab->elf.sgot->output_section->vma
5319 + htab->elf.sgot->output_offset + off;
5320 unresolved_reloc = FALSE;
5324 bfd_vma roff = rel->r_offset;
5326 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
5328 /* GD->IE transition. For 64bit, change
5329 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
5330 .word 0x6666; rex64; call __tls_get_addr@PLT
5332 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
5334 call *__tls_get_addr@GOTPCREL(%rip
5335 which may be converted to
5336 addr32 call __tls_get_addr
5339 addq foo@gottpoff(%rip), %rax
5341 leaq foo@tlsgd(%rip), %rdi
5342 .word 0x6666; rex64; call __tls_get_addr@PLT
5344 leaq foo@tlsgd(%rip), %rdi
5346 call *__tls_get_addr@GOTPCREL(%rip)
5347 which may be converted to
5348 addr32 call __tls_get_addr
5351 addq foo@gottpoff(%rip), %rax
5352 For largepic, change:
5353 leaq foo@tlsgd(%rip), %rdi
5354 movabsq $__tls_get_addr@pltoff, %rax
5359 addq foo@gottpoff(%rax), %rax
5360 nopw 0x0(%rax,%rax,1) */
5362 if (ABI_64_P (output_bfd))
5364 if (contents[roff + 5] == 0xb8)
5366 memcpy (contents + roff - 3,
5367 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05"
5368 "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
5372 memcpy (contents + roff - 4,
5373 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
5377 memcpy (contents + roff - 3,
5378 "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
5381 relocation = (htab->elf.sgot->output_section->vma
5382 + htab->elf.sgot->output_offset + off
5385 - input_section->output_section->vma
5386 - input_section->output_offset
5388 bfd_put_32 (output_bfd, relocation,
5389 contents + roff + 8 + largepic);
5390 /* Skip R_X86_64_PLT32/R_X86_64_PLTOFF64. */
5395 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
5397 /* GDesc -> IE transition.
5398 It's originally something like:
5399 leaq x@tlsdesc(%rip), %rax
5402 movq x@gottpoff(%rip), %rax # before xchg %ax,%ax. */
5404 /* Now modify the instruction as appropriate. To
5405 turn a leaq into a movq in the form we use it, it
5406 suffices to change the second byte from 0x8d to
5408 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
5410 bfd_put_32 (output_bfd,
5411 htab->elf.sgot->output_section->vma
5412 + htab->elf.sgot->output_offset + off
5414 - input_section->output_section->vma
5415 - input_section->output_offset
5420 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
5422 /* GDesc -> IE transition.
5429 bfd_put_8 (output_bfd, 0x66, contents + roff);
5430 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
5438 case R_X86_64_TLSLD:
5439 if (! elf_x86_64_tls_transition (info, input_bfd,
5440 input_section, contents,
5441 symtab_hdr, sym_hashes,
5442 &r_type, GOT_UNKNOWN, rel,
5443 relend, h, r_symndx, TRUE))
5446 if (r_type != R_X86_64_TLSLD)
5448 /* LD->LE transition:
5449 leaq foo@tlsld(%rip), %rdi
5450 call __tls_get_addr@PLT
5451 For 64bit, we change it into:
5452 .word 0x6666; .byte 0x66; movq %fs:0, %rax
5453 For 32bit, we change it into:
5454 nopl 0x0(%rax); movl %fs:0, %eax
5456 leaq foo@tlsld(%rip), %rdi;
5457 call *__tls_get_addr@GOTPCREL(%rip)
5458 which may be converted to
5459 addr32 call __tls_get_addr
5460 For 64bit, we change it into:
5461 .word 0x6666; .word 0x6666; movq %fs:0, %rax
5462 For 32bit, we change it into:
5463 nopw 0x0(%rax); movl %fs:0, %eax
5464 For largepic, change:
5465 leaq foo@tlsgd(%rip), %rdi
5466 movabsq $__tls_get_addr@pltoff, %rax
5470 data16 data16 data16 nopw %cs:0x0(%rax,%rax,1)
5473 BFD_ASSERT (r_type == R_X86_64_TPOFF32);
5474 if (ABI_64_P (output_bfd))
5476 if (contents[rel->r_offset + 5] == 0xb8)
5477 memcpy (contents + rel->r_offset - 3,
5478 "\x66\x66\x66\x66\x2e\x0f\x1f\x84\0\0\0\0\0"
5479 "\x64\x48\x8b\x04\x25\0\0\0", 22);
5480 else if (contents[rel->r_offset + 4] == 0xff
5481 || contents[rel->r_offset + 4] == 0x67)
5482 memcpy (contents + rel->r_offset - 3,
5483 "\x66\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0",
5486 memcpy (contents + rel->r_offset - 3,
5487 "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
5491 if (contents[rel->r_offset + 4] == 0xff)
5492 memcpy (contents + rel->r_offset - 3,
5493 "\x66\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0",
5496 memcpy (contents + rel->r_offset - 3,
5497 "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
5499 /* Skip R_X86_64_PC32, R_X86_64_PLT32, R_X86_64_GOTPCRELX
5500 and R_X86_64_PLTOFF64. */
5506 if (htab->elf.sgot == NULL)
5509 off = htab->tls_ld_got.offset;
5514 Elf_Internal_Rela outrel;
5516 if (htab->elf.srelgot == NULL)
5519 outrel.r_offset = (htab->elf.sgot->output_section->vma
5520 + htab->elf.sgot->output_offset + off);
5522 bfd_put_64 (output_bfd, 0,
5523 htab->elf.sgot->contents + off);
5524 bfd_put_64 (output_bfd, 0,
5525 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
5526 outrel.r_info = htab->r_info (0, R_X86_64_DTPMOD64);
5527 outrel.r_addend = 0;
5528 elf_append_rela (output_bfd, htab->elf.srelgot,
5530 htab->tls_ld_got.offset |= 1;
5532 relocation = htab->elf.sgot->output_section->vma
5533 + htab->elf.sgot->output_offset + off;
5534 unresolved_reloc = FALSE;
5537 case R_X86_64_DTPOFF32:
5538 if (!bfd_link_executable (info)
5539 || (input_section->flags & SEC_CODE) == 0)
5540 relocation -= elf_x86_64_dtpoff_base (info);
5542 relocation = elf_x86_64_tpoff (info, relocation);
5545 case R_X86_64_TPOFF32:
5546 case R_X86_64_TPOFF64:
5547 BFD_ASSERT (bfd_link_executable (info));
5548 relocation = elf_x86_64_tpoff (info, relocation);
5551 case R_X86_64_DTPOFF64:
5552 BFD_ASSERT ((input_section->flags & SEC_CODE) == 0);
5553 relocation -= elf_x86_64_dtpoff_base (info);
5560 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5561 because such sections are not SEC_ALLOC and thus ld.so will
5562 not process them. */
5563 if (unresolved_reloc
5564 && !((input_section->flags & SEC_DEBUGGING) != 0
5566 && _bfd_elf_section_offset (output_bfd, info, input_section,
5567 rel->r_offset) != (bfd_vma) -1)
5570 /* xgettext:c-format */
5571 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5574 (long) rel->r_offset,
5576 h->root.root.string);
5581 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5582 contents, rel->r_offset,
5583 relocation, rel->r_addend);
5585 check_relocation_error:
5586 if (r != bfd_reloc_ok)
5591 name = h->root.root.string;
5594 name = bfd_elf_string_from_elf_section (input_bfd,
5595 symtab_hdr->sh_link,
5600 name = bfd_section_name (input_bfd, sec);
5603 if (r == bfd_reloc_overflow)
5604 (*info->callbacks->reloc_overflow)
5605 (info, (h ? &h->root : NULL), name, howto->name,
5606 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
5610 /* xgettext:c-format */
5611 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
5612 input_bfd, input_section,
5613 (long) rel->r_offset, name, (int) r);
5624 Elf_Internal_Shdr *rel_hdr;
5625 size_t deleted = rel - wrel;
5627 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
5628 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5629 if (rel_hdr->sh_size == 0)
5631 /* It is too late to remove an empty reloc section. Leave
5633 ??? What is wrong with an empty section??? */
5634 rel_hdr->sh_size = rel_hdr->sh_entsize;
5637 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
5638 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5639 input_section->reloc_count -= deleted;
5645 /* Finish up dynamic symbol handling. We set the contents of various
5646 dynamic sections here. */
5649 elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
5650 struct bfd_link_info *info,
5651 struct elf_link_hash_entry *h,
5652 Elf_Internal_Sym *sym)
5654 struct elf_x86_64_link_hash_table *htab;
5655 bfd_boolean use_plt_second;
5656 struct elf_x86_64_link_hash_entry *eh;
5657 bfd_boolean local_undefweak;
5659 htab = elf_x86_64_hash_table (info);
5663 /* Use the second PLT section only if there is .plt section. */
5664 use_plt_second = htab->elf.splt != NULL && htab->plt_second != NULL;
5666 eh = (struct elf_x86_64_link_hash_entry *) h;
5667 if (eh->no_finish_dynamic_symbol)
5670 /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
5671 resolved undefined weak symbols in executable so that their
5672 references have value 0 at run-time. */
5673 local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
5677 if (h->plt.offset != (bfd_vma) -1)
5680 bfd_vma got_offset, plt_offset;
5681 Elf_Internal_Rela rela;
5683 asection *plt, *gotplt, *relplt, *resolved_plt;
5684 const struct elf_backend_data *bed;
5685 bfd_vma plt_got_pcrel_offset;
5687 /* When building a static executable, use .iplt, .igot.plt and
5688 .rela.iplt sections for STT_GNU_IFUNC symbols. */
5689 if (htab->elf.splt != NULL)
5691 plt = htab->elf.splt;
5692 gotplt = htab->elf.sgotplt;
5693 relplt = htab->elf.srelplt;
5697 plt = htab->elf.iplt;
5698 gotplt = htab->elf.igotplt;
5699 relplt = htab->elf.irelplt;
5702 /* This symbol has an entry in the procedure linkage table. Set
5704 if ((h->dynindx == -1
5706 && !((h->forced_local || bfd_link_executable (info))
5708 && h->type == STT_GNU_IFUNC))
5714 /* Get the index in the procedure linkage table which
5715 corresponds to this symbol. This is the index of this symbol
5716 in all the symbols for which we are making plt entries. The
5717 first entry in the procedure linkage table is reserved.
5719 Get the offset into the .got table of the entry that
5720 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
5721 bytes. The first three are reserved for the dynamic linker.
5723 For static executables, we don't reserve anything. */
5725 if (plt == htab->elf.splt)
5727 got_offset = (h->plt.offset / htab->plt.plt_entry_size
5728 - htab->plt.has_plt0);
5729 got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
5733 got_offset = h->plt.offset / htab->plt.plt_entry_size;
5734 got_offset = got_offset * GOT_ENTRY_SIZE;
5737 /* Fill in the entry in the procedure linkage table. */
5738 memcpy (plt->contents + h->plt.offset, htab->plt.plt_entry,
5739 htab->plt.plt_entry_size);
5742 memcpy (htab->plt_second->contents + eh->plt_second.offset,
5743 htab->non_lazy_plt->plt_entry,
5744 htab->non_lazy_plt->plt_entry_size);
5746 resolved_plt = htab->plt_second;
5747 plt_offset = eh->plt_second.offset;
5752 plt_offset = h->plt.offset;
5755 /* Insert the relocation positions of the plt section. */
5757 /* Put offset the PC-relative instruction referring to the GOT entry,
5758 subtracting the size of that instruction. */
5759 plt_got_pcrel_offset = (gotplt->output_section->vma
5760 + gotplt->output_offset
5762 - resolved_plt->output_section->vma
5763 - resolved_plt->output_offset
5765 - htab->plt.plt_got_insn_size);
5767 /* Check PC-relative offset overflow in PLT entry. */
5768 if ((plt_got_pcrel_offset + 0x80000000) > 0xffffffff)
5769 /* xgettext:c-format */
5770 info->callbacks->einfo (_("%F%B: PC-relative offset overflow in PLT entry for `%s'\n"),
5771 output_bfd, h->root.root.string);
5773 bfd_put_32 (output_bfd, plt_got_pcrel_offset,
5774 (resolved_plt->contents + plt_offset
5775 + htab->plt.plt_got_offset));
5777 /* Fill in the entry in the global offset table, initially this
5778 points to the second part of the PLT entry. Leave the entry
5779 as zero for undefined weak symbol in PIE. No PLT relocation
5780 against undefined weak symbol in PIE. */
5781 if (!local_undefweak)
5783 if (htab->plt.has_plt0)
5784 bfd_put_64 (output_bfd, (plt->output_section->vma
5785 + plt->output_offset
5787 + htab->lazy_plt->plt_lazy_offset),
5788 gotplt->contents + got_offset);
5790 /* Fill in the entry in the .rela.plt section. */
5791 rela.r_offset = (gotplt->output_section->vma
5792 + gotplt->output_offset
5794 if (h->dynindx == -1
5795 || ((bfd_link_executable (info)
5796 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5798 && h->type == STT_GNU_IFUNC))
5800 info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
5801 h->root.root.string,
5802 h->root.u.def.section->owner);
5804 /* If an STT_GNU_IFUNC symbol is locally defined, generate
5805 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT. */
5806 rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
5807 rela.r_addend = (h->root.u.def.value
5808 + h->root.u.def.section->output_section->vma
5809 + h->root.u.def.section->output_offset);
5810 /* R_X86_64_IRELATIVE comes last. */
5811 plt_index = htab->next_irelative_index--;
5815 rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
5817 plt_index = htab->next_jump_slot_index++;
5820 /* Don't fill the second and third slots in PLT entry for
5821 static executables nor without PLT0. */
5822 if (plt == htab->elf.splt && htab->plt.has_plt0)
5825 = h->plt.offset + htab->lazy_plt->plt_plt_insn_end;
5827 /* Put relocation index. */
5828 bfd_put_32 (output_bfd, plt_index,
5829 (plt->contents + h->plt.offset
5830 + htab->lazy_plt->plt_reloc_offset));
5832 /* Put offset for jmp .PLT0 and check for overflow. We don't
5833 check relocation index for overflow since branch displacement
5834 will overflow first. */
5835 if (plt0_offset > 0x80000000)
5836 /* xgettext:c-format */
5837 info->callbacks->einfo (_("%F%B: branch displacement overflow in PLT entry for `%s'\n"),
5838 output_bfd, h->root.root.string);
5839 bfd_put_32 (output_bfd, - plt0_offset,
5840 (plt->contents + h->plt.offset
5841 + htab->lazy_plt->plt_plt_offset));
5844 bed = get_elf_backend_data (output_bfd);
5845 loc = relplt->contents + plt_index * bed->s->sizeof_rela;
5846 bed->s->swap_reloca_out (output_bfd, &rela, loc);
5849 else if (eh->plt_got.offset != (bfd_vma) -1)
5851 bfd_vma got_offset, plt_offset;
5852 asection *plt, *got;
5853 bfd_boolean got_after_plt;
5854 int32_t got_pcrel_offset;
5856 /* Set the entry in the GOT procedure linkage table. */
5857 plt = htab->plt_got;
5858 got = htab->elf.sgot;
5859 got_offset = h->got.offset;
5861 if (got_offset == (bfd_vma) -1
5862 || (h->type == STT_GNU_IFUNC && h->def_regular)
5867 /* Use the non-lazy PLT entry template for the GOT PLT since they
5868 are the identical. */
5869 /* Fill in the entry in the GOT procedure linkage table. */
5870 plt_offset = eh->plt_got.offset;
5871 memcpy (plt->contents + plt_offset,
5872 htab->non_lazy_plt->plt_entry,
5873 htab->non_lazy_plt->plt_entry_size);
5875 /* Put offset the PC-relative instruction referring to the GOT
5876 entry, subtracting the size of that instruction. */
5877 got_pcrel_offset = (got->output_section->vma
5878 + got->output_offset
5880 - plt->output_section->vma
5881 - plt->output_offset
5883 - htab->non_lazy_plt->plt_got_insn_size);
5885 /* Check PC-relative offset overflow in GOT PLT entry. */
5886 got_after_plt = got->output_section->vma > plt->output_section->vma;
5887 if ((got_after_plt && got_pcrel_offset < 0)
5888 || (!got_after_plt && got_pcrel_offset > 0))
5889 /* xgettext:c-format */
5890 info->callbacks->einfo (_("%F%B: PC-relative offset overflow in GOT PLT entry for `%s'\n"),
5891 output_bfd, h->root.root.string);
5893 bfd_put_32 (output_bfd, got_pcrel_offset,
5894 (plt->contents + plt_offset
5895 + htab->non_lazy_plt->plt_got_offset));
5898 if (!local_undefweak
5900 && (h->plt.offset != (bfd_vma) -1
5901 || eh->plt_got.offset != (bfd_vma) -1))
5903 /* Mark the symbol as undefined, rather than as defined in
5904 the .plt section. Leave the value if there were any
5905 relocations where pointer equality matters (this is a clue
5906 for the dynamic linker, to make function pointer
5907 comparisons work between an application and shared
5908 library), otherwise set it to zero. If a function is only
5909 called from a binary, there is no need to slow down
5910 shared libraries because of that. */
5911 sym->st_shndx = SHN_UNDEF;
5912 if (!h->pointer_equality_needed)
5916 /* Don't generate dynamic GOT relocation against undefined weak
5917 symbol in executable. */
5918 if (h->got.offset != (bfd_vma) -1
5919 && ! GOT_TLS_GD_ANY_P (elf_x86_64_hash_entry (h)->tls_type)
5920 && elf_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE
5921 && !local_undefweak)
5923 Elf_Internal_Rela rela;
5924 asection *relgot = htab->elf.srelgot;
5926 /* This symbol has an entry in the global offset table. Set it
5928 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
5931 rela.r_offset = (htab->elf.sgot->output_section->vma
5932 + htab->elf.sgot->output_offset
5933 + (h->got.offset &~ (bfd_vma) 1));
5935 /* If this is a static link, or it is a -Bsymbolic link and the
5936 symbol is defined locally or was forced to be local because
5937 of a version file, we just want to emit a RELATIVE reloc.
5938 The entry in the global offset table will already have been
5939 initialized in the relocate_section function. */
5941 && h->type == STT_GNU_IFUNC)
5943 if (h->plt.offset == (bfd_vma) -1)
5945 /* STT_GNU_IFUNC is referenced without PLT. */
5946 if (htab->elf.splt == NULL)
5948 /* use .rel[a].iplt section to store .got relocations
5949 in static executable. */
5950 relgot = htab->elf.irelplt;
5952 if (SYMBOL_REFERENCES_LOCAL (info, h))
5954 info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
5956 h->root.root.string,
5957 h->root.u.def.section->owner);
5959 rela.r_info = htab->r_info (0,
5960 R_X86_64_IRELATIVE);
5961 rela.r_addend = (h->root.u.def.value
5962 + h->root.u.def.section->output_section->vma
5963 + h->root.u.def.section->output_offset);
5968 else if (bfd_link_pic (info))
5970 /* Generate R_X86_64_GLOB_DAT. */
5978 if (!h->pointer_equality_needed)
5981 /* For non-shared object, we can't use .got.plt, which
5982 contains the real function addres if we need pointer
5983 equality. We load the GOT entry with the PLT entry. */
5984 if (htab->plt_second != NULL)
5986 plt = htab->plt_second;
5987 plt_offset = eh->plt_second.offset;
5991 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
5992 plt_offset = h->plt.offset;
5994 bfd_put_64 (output_bfd, (plt->output_section->vma
5995 + plt->output_offset
5997 htab->elf.sgot->contents + h->got.offset);
6001 else if (bfd_link_pic (info)
6002 && SYMBOL_REFERENCES_LOCAL (info, h))
6004 if (!h->def_regular)
6006 BFD_ASSERT((h->got.offset & 1) != 0);
6007 rela.r_info = htab->r_info (0, R_X86_64_RELATIVE);
6008 rela.r_addend = (h->root.u.def.value
6009 + h->root.u.def.section->output_section->vma
6010 + h->root.u.def.section->output_offset);
6014 BFD_ASSERT((h->got.offset & 1) == 0);
6016 bfd_put_64 (output_bfd, (bfd_vma) 0,
6017 htab->elf.sgot->contents + h->got.offset);
6018 rela.r_info = htab->r_info (h->dynindx, R_X86_64_GLOB_DAT);
6022 elf_append_rela (output_bfd, relgot, &rela);
6027 Elf_Internal_Rela rela;
6030 /* This symbol needs a copy reloc. Set it up. */
6032 if (h->dynindx == -1
6033 || (h->root.type != bfd_link_hash_defined
6034 && h->root.type != bfd_link_hash_defweak)
6035 || htab->elf.srelbss == NULL
6036 || htab->elf.sreldynrelro == NULL)
6039 rela.r_offset = (h->root.u.def.value
6040 + h->root.u.def.section->output_section->vma
6041 + h->root.u.def.section->output_offset);
6042 rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY);
6044 if (h->root.u.def.section == htab->elf.sdynrelro)
6045 s = htab->elf.sreldynrelro;
6047 s = htab->elf.srelbss;
6048 elf_append_rela (output_bfd, s, &rela);
6054 /* Finish up local dynamic symbol handling. We set the contents of
6055 various dynamic sections here. */
6058 elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
6060 struct elf_link_hash_entry *h
6061 = (struct elf_link_hash_entry *) *slot;
6062 struct bfd_link_info *info
6063 = (struct bfd_link_info *) inf;
6065 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
6069 /* Finish up undefined weak symbol handling in PIE. Fill its PLT entry
6070 here since undefined weak symbol may not be dynamic and may not be
6071 called for elf_x86_64_finish_dynamic_symbol. */
6074 elf_x86_64_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
6077 struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
6078 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6080 if (h->root.type != bfd_link_hash_undefweak
6081 || h->dynindx != -1)
6084 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
6088 /* Used to decide how to sort relocs in an optimal manner for the
6089 dynamic linker, before writing them out. */
6091 static enum elf_reloc_type_class
6092 elf_x86_64_reloc_type_class (const struct bfd_link_info *info,
6093 const asection *rel_sec ATTRIBUTE_UNUSED,
6094 const Elf_Internal_Rela *rela)
6096 bfd *abfd = info->output_bfd;
6097 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
6098 struct elf_x86_64_link_hash_table *htab = elf_x86_64_hash_table (info);
6100 if (htab->elf.dynsym != NULL
6101 && htab->elf.dynsym->contents != NULL)
6103 /* Check relocation against STT_GNU_IFUNC symbol if there are
6105 unsigned long r_symndx = htab->r_sym (rela->r_info);
6106 if (r_symndx != STN_UNDEF)
6108 Elf_Internal_Sym sym;
6109 if (!bed->s->swap_symbol_in (abfd,
6110 (htab->elf.dynsym->contents
6111 + r_symndx * bed->s->sizeof_sym),
6115 if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
6116 return reloc_class_ifunc;
6120 switch ((int) ELF32_R_TYPE (rela->r_info))
6122 case R_X86_64_IRELATIVE:
6123 return reloc_class_ifunc;
6124 case R_X86_64_RELATIVE:
6125 case R_X86_64_RELATIVE64:
6126 return reloc_class_relative;
6127 case R_X86_64_JUMP_SLOT:
6128 return reloc_class_plt;
6130 return reloc_class_copy;
6132 return reloc_class_normal;
6136 /* Finish up the dynamic sections. */
6139 elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
6140 struct bfd_link_info *info)
6142 struct elf_x86_64_link_hash_table *htab;
6146 htab = elf_x86_64_hash_table (info);
6150 dynobj = htab->elf.dynobj;
6151 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
6153 if (htab->elf.dynamic_sections_created)
6155 bfd_byte *dyncon, *dynconend;
6156 const struct elf_backend_data *bed;
6157 bfd_size_type sizeof_dyn;
6159 if (sdyn == NULL || htab->elf.sgot == NULL)
6162 bed = get_elf_backend_data (dynobj);
6163 sizeof_dyn = bed->s->sizeof_dyn;
6164 dyncon = sdyn->contents;
6165 dynconend = sdyn->contents + sdyn->size;
6166 for (; dyncon < dynconend; dyncon += sizeof_dyn)
6168 Elf_Internal_Dyn dyn;
6171 (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
6179 s = htab->elf.sgotplt;
6180 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
6184 dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
6188 s = htab->elf.srelplt->output_section;
6189 dyn.d_un.d_val = s->size;
6192 case DT_TLSDESC_PLT:
6194 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
6195 + htab->tlsdesc_plt;
6198 case DT_TLSDESC_GOT:
6200 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
6201 + htab->tlsdesc_got;
6205 (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
6208 if (htab->elf.splt && htab->elf.splt->size > 0)
6210 elf_section_data (htab->elf.splt->output_section)
6211 ->this_hdr.sh_entsize = htab->plt.plt_entry_size;
6213 if (htab->plt.has_plt0)
6215 /* Fill in the special first entry in the procedure linkage
6217 memcpy (htab->elf.splt->contents,
6218 htab->lazy_plt->plt0_entry,
6219 htab->lazy_plt->plt_entry_size);
6220 /* Add offset for pushq GOT+8(%rip), since the instruction
6221 uses 6 bytes subtract this value. */
6222 bfd_put_32 (output_bfd,
6223 (htab->elf.sgotplt->output_section->vma
6224 + htab->elf.sgotplt->output_offset
6226 - htab->elf.splt->output_section->vma
6227 - htab->elf.splt->output_offset
6229 (htab->elf.splt->contents
6230 + htab->lazy_plt->plt0_got1_offset));
6231 /* Add offset for the PC-relative instruction accessing
6232 GOT+16, subtracting the offset to the end of that
6234 bfd_put_32 (output_bfd,
6235 (htab->elf.sgotplt->output_section->vma
6236 + htab->elf.sgotplt->output_offset
6238 - htab->elf.splt->output_section->vma
6239 - htab->elf.splt->output_offset
6240 - htab->lazy_plt->plt0_got2_insn_end),
6241 (htab->elf.splt->contents
6242 + htab->lazy_plt->plt0_got2_offset));
6244 if (htab->tlsdesc_plt)
6246 bfd_put_64 (output_bfd, (bfd_vma) 0,
6247 htab->elf.sgot->contents + htab->tlsdesc_got);
6249 memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
6250 htab->lazy_plt->plt0_entry,
6251 htab->lazy_plt->plt_entry_size);
6253 /* Add offset for pushq GOT+8(%rip), since the
6254 instruction uses 6 bytes subtract this value. */
6255 bfd_put_32 (output_bfd,
6256 (htab->elf.sgotplt->output_section->vma
6257 + htab->elf.sgotplt->output_offset
6259 - htab->elf.splt->output_section->vma
6260 - htab->elf.splt->output_offset
6263 (htab->elf.splt->contents
6265 + htab->lazy_plt->plt0_got1_offset));
6266 /* Add offset for the PC-relative instruction accessing
6267 GOT+TDG, where TDG stands for htab->tlsdesc_got,
6268 subtracting the offset to the end of that
6270 bfd_put_32 (output_bfd,
6271 (htab->elf.sgot->output_section->vma
6272 + htab->elf.sgot->output_offset
6274 - htab->elf.splt->output_section->vma
6275 - htab->elf.splt->output_offset
6277 - htab->lazy_plt->plt0_got2_insn_end),
6278 (htab->elf.splt->contents
6280 + htab->lazy_plt->plt0_got2_offset));
6286 if (htab->plt_got != NULL && htab->plt_got->size > 0)
6287 elf_section_data (htab->plt_got->output_section)
6288 ->this_hdr.sh_entsize = htab->non_lazy_plt->plt_entry_size;
6290 if (htab->plt_second != NULL && htab->plt_second->size > 0)
6291 elf_section_data (htab->plt_second->output_section)
6292 ->this_hdr.sh_entsize = htab->non_lazy_plt->plt_entry_size;
6294 /* GOT is always created in setup_gnu_properties. But it may not be
6296 if (htab->elf.sgotplt && htab->elf.sgotplt->size > 0)
6298 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
6301 (_("discarded output section: `%A'"), htab->elf.sgotplt);
6305 /* Set the first entry in the global offset table to the address of
6306 the dynamic section. */
6308 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents);
6310 bfd_put_64 (output_bfd,
6311 sdyn->output_section->vma + sdyn->output_offset,
6312 htab->elf.sgotplt->contents);
6313 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
6314 bfd_put_64 (output_bfd, (bfd_vma) 0,
6315 htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
6316 bfd_put_64 (output_bfd, (bfd_vma) 0,
6317 htab->elf.sgotplt->contents + GOT_ENTRY_SIZE*2);
6319 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize
6323 /* Adjust .eh_frame for .plt section. */
6324 if (htab->plt_eh_frame != NULL
6325 && htab->plt_eh_frame->contents != NULL)
6327 if (htab->elf.splt != NULL
6328 && htab->elf.splt->size != 0
6329 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
6330 && htab->elf.splt->output_section != NULL
6331 && htab->plt_eh_frame->output_section != NULL)
6333 bfd_vma plt_start = htab->elf.splt->output_section->vma;
6334 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
6335 + htab->plt_eh_frame->output_offset
6336 + PLT_FDE_START_OFFSET;
6337 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
6338 htab->plt_eh_frame->contents
6339 + PLT_FDE_START_OFFSET);
6341 if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
6343 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
6345 htab->plt_eh_frame->contents))
6350 /* Adjust .eh_frame for .plt.got section. */
6351 if (htab->plt_got_eh_frame != NULL
6352 && htab->plt_got_eh_frame->contents != NULL)
6354 if (htab->plt_got != NULL
6355 && htab->plt_got->size != 0
6356 && (htab->plt_got->flags & SEC_EXCLUDE) == 0
6357 && htab->plt_got->output_section != NULL
6358 && htab->plt_got_eh_frame->output_section != NULL)
6360 bfd_vma plt_start = htab->plt_got->output_section->vma;
6361 bfd_vma eh_frame_start = htab->plt_got_eh_frame->output_section->vma
6362 + htab->plt_got_eh_frame->output_offset
6363 + PLT_FDE_START_OFFSET;
6364 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
6365 htab->plt_got_eh_frame->contents
6366 + PLT_FDE_START_OFFSET);
6368 if (htab->plt_got_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
6370 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
6371 htab->plt_got_eh_frame,
6372 htab->plt_got_eh_frame->contents))
6377 /* Adjust .eh_frame for the second PLT section. */
6378 if (htab->plt_second_eh_frame != NULL
6379 && htab->plt_second_eh_frame->contents != NULL)
6381 if (htab->plt_second != NULL
6382 && htab->plt_second->size != 0
6383 && (htab->plt_second->flags & SEC_EXCLUDE) == 0
6384 && htab->plt_second->output_section != NULL
6385 && htab->plt_second_eh_frame->output_section != NULL)
6387 bfd_vma plt_start = htab->plt_second->output_section->vma;
6388 bfd_vma eh_frame_start
6389 = (htab->plt_second_eh_frame->output_section->vma
6390 + htab->plt_second_eh_frame->output_offset
6391 + PLT_FDE_START_OFFSET);
6392 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
6393 htab->plt_second_eh_frame->contents
6394 + PLT_FDE_START_OFFSET);
6396 if (htab->plt_second_eh_frame->sec_info_type
6397 == SEC_INFO_TYPE_EH_FRAME)
6399 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
6400 htab->plt_second_eh_frame,
6401 htab->plt_second_eh_frame->contents))
6406 if (htab->elf.sgot && htab->elf.sgot->size > 0)
6407 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
6410 /* Fill PLT entries for undefined weak symbols in PIE. */
6411 if (bfd_link_pie (info))
6412 bfd_hash_traverse (&info->hash->table,
6413 elf_x86_64_pie_finish_undefweak_symbol,
6419 /* Fill PLT/GOT entries and allocate dynamic relocations for local
6420 STT_GNU_IFUNC symbols, which aren't in the ELF linker hash table.
6421 It has to be done before elf_link_sort_relocs is called so that
6422 dynamic relocations are properly sorted. */
6425 elf_x86_64_output_arch_local_syms
6426 (bfd *output_bfd ATTRIBUTE_UNUSED,
6427 struct bfd_link_info *info,
6428 void *flaginfo ATTRIBUTE_UNUSED,
6429 int (*func) (void *, const char *,
6432 struct elf_link_hash_entry *) ATTRIBUTE_UNUSED)
6434 struct elf_x86_64_link_hash_table *htab = elf_x86_64_hash_table (info);
6438 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
6439 htab_traverse (htab->loc_hash_table,
6440 elf_x86_64_finish_local_dynamic_symbol,
6446 /* Sort relocs into address order. */
6449 compare_relocs (const void *ap, const void *bp)
6451 const arelent *a = * (const arelent **) ap;
6452 const arelent *b = * (const arelent **) bp;
6454 if (a->address > b->address)
6456 else if (a->address < b->address)
6462 enum elf_x86_64_plt_type
6466 plt_second = 1 << 1,
6470 struct elf_x86_64_plt
6475 enum elf_x86_64_plt_type type;
6476 unsigned int plt_got_offset;
6477 unsigned int plt_got_insn_size;
6478 unsigned int plt_entry_size;
6482 /* Forward declaration. */
6483 static const struct elf_x86_64_lazy_plt_layout elf_x86_64_nacl_plt;
6485 /* Similar to _bfd_elf_get_synthetic_symtab. Support PLTs with all
6486 dynamic relocations. */
6489 elf_x86_64_get_synthetic_symtab (bfd *abfd,
6490 long symcount ATTRIBUTE_UNUSED,
6491 asymbol **syms ATTRIBUTE_UNUSED,
6496 long size, count, i, n;
6498 unsigned int plt_got_offset, plt_entry_size, plt_got_insn_size;
6500 bfd_byte *plt_contents;
6501 long dynrelcount, relsize;
6502 arelent **dynrelbuf;
6503 const struct elf_x86_64_lazy_plt_layout *lazy_plt;
6504 const struct elf_x86_64_non_lazy_plt_layout *non_lazy_plt;
6505 const struct elf_x86_64_lazy_plt_layout *lazy_bnd_plt;
6506 const struct elf_x86_64_non_lazy_plt_layout *non_lazy_bnd_plt;
6509 enum elf_x86_64_plt_type plt_type;
6510 struct elf_x86_64_plt plts[] =
6512 { ".plt", NULL, NULL, plt_unknown, 0, 0, 0, 0 },
6513 { ".plt.got", NULL, NULL, plt_non_lazy, 0, 0, 0, 0 },
6514 { ".plt.sec", NULL, NULL, plt_second, 0, 0, 0, 0 },
6515 { ".plt.bnd", NULL, NULL, plt_second, 0, 0, 0, 0 },
6516 { NULL, NULL, NULL, plt_non_lazy, 0, 0, 0, 0 }
6521 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
6524 if (dynsymcount <= 0)
6527 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
6531 dynrelbuf = (arelent **) bfd_malloc (relsize);
6532 if (dynrelbuf == NULL)
6535 dynrelcount = bfd_canonicalize_dynamic_reloc (abfd, dynrelbuf,
6538 /* Sort the relocs by address. */
6539 qsort (dynrelbuf, dynrelcount, sizeof (arelent *), compare_relocs);
6541 if (get_elf_x86_64_backend_data (abfd)->os == is_normal)
6543 lazy_plt = &elf_x86_64_lazy_plt;
6544 non_lazy_plt = &elf_x86_64_non_lazy_plt;
6545 lazy_bnd_plt = &elf_x86_64_lazy_bnd_plt;
6546 non_lazy_bnd_plt = &elf_x86_64_non_lazy_bnd_plt;
6550 lazy_plt = &elf_x86_64_nacl_plt;
6551 non_lazy_plt = NULL;
6552 lazy_bnd_plt = NULL;
6553 non_lazy_bnd_plt = NULL;
6557 for (j = 0; plts[j].name != NULL; j++)
6559 plt = bfd_get_section_by_name (abfd, plts[j].name);
6563 /* Get the PLT section contents. */
6564 plt_contents = (bfd_byte *) bfd_malloc (plt->size);
6565 if (plt_contents == NULL)
6567 if (!bfd_get_section_contents (abfd, (asection *) plt,
6568 plt_contents, 0, plt->size))
6570 free (plt_contents);
6574 /* Check what kind of PLT it is. */
6575 plt_type = plt_unknown;
6576 if (plts[j].type == plt_unknown)
6578 /* Match lazy PLT first. Need to check the first two
6580 if ((memcmp (plt_contents, lazy_plt->plt0_entry,
6581 lazy_plt->plt0_got1_offset) == 0)
6582 && (memcmp (plt_contents + 6, lazy_plt->plt0_entry + 6,
6584 plt_type = plt_lazy;
6585 else if (lazy_bnd_plt != NULL
6586 && (memcmp (plt_contents, lazy_bnd_plt->plt0_entry,
6587 lazy_bnd_plt->plt0_got1_offset) == 0)
6588 && (memcmp (plt_contents + 6,
6589 lazy_bnd_plt->plt0_entry + 6, 3) == 0))
6591 plt_type = plt_lazy | plt_second;
6592 lazy_plt = lazy_bnd_plt;
6596 if (non_lazy_plt != NULL
6597 && (plt_type == plt_unknown || plt_type == plt_non_lazy))
6599 /* Match non-lazy PLT. */
6600 if (memcmp (plt_contents, non_lazy_plt->plt_entry,
6601 non_lazy_plt->plt_got_offset) == 0)
6602 plt_type = plt_non_lazy;
6605 if (non_lazy_bnd_plt != NULL
6606 && (plt_type == plt_unknown || plt_type == plt_second))
6608 /* Match BND PLT. */
6609 if (memcmp (plt_contents, non_lazy_bnd_plt->plt_entry,
6610 non_lazy_bnd_plt->plt_got_offset) == 0)
6612 plt_type = plt_second;
6613 non_lazy_plt = non_lazy_bnd_plt;
6617 if (plt_type == plt_unknown)
6621 plts[j].type = plt_type;
6623 if ((plt_type & plt_lazy))
6625 plts[j].plt_got_offset = lazy_plt->plt_got_offset;
6626 plts[j].plt_got_insn_size = lazy_plt->plt_got_insn_size;
6627 plts[j].plt_entry_size = lazy_plt->plt_entry_size;
6628 /* Skip PLT0 in lazy PLT. */
6633 plts[j].plt_got_offset = non_lazy_plt->plt_got_offset;
6634 plts[j].plt_got_insn_size = non_lazy_plt->plt_got_insn_size;
6635 plts[j].plt_entry_size = non_lazy_plt->plt_entry_size;
6639 /* Skip lazy PLT when the second PLT is used. */
6640 if (plt_type == (plt_lazy | plt_second))
6644 n = plt->size / plts[j].plt_entry_size;
6649 plts[j].contents = plt_contents;
6652 size = count * sizeof (asymbol);
6653 s = *ret = (asymbol *) bfd_zmalloc (size);
6657 for (j = 0; plts[j].name != NULL; j++)
6658 if (plts[j].contents != NULL)
6659 free (plts[j].contents);
6664 /* Check for each PLT section. */
6667 for (j = 0; plts[j].name != NULL; j++)
6668 if ((plt_contents = plts[j].contents) != NULL)
6673 plt_got_offset = plts[j].plt_got_offset;
6674 plt_got_insn_size = plts[j].plt_got_insn_size;
6675 plt_entry_size = plts[j].plt_entry_size;
6679 if ((plts[j].type & plt_lazy))
6681 /* Skip PLT0 in lazy PLT. */
6683 offset = plt_entry_size;
6691 /* Check each PLT entry against dynamic relocations. */
6692 for (; k < plts[j].count; k++)
6699 /* Get the PC-relative offset, a signed 32-bit integer. */
6700 off = H_GET_32 (abfd, (plt_contents + offset
6702 got_vma = plt->vma + offset + off + plt_got_insn_size;
6704 /* Binary search. */
6708 while ((min + 1) < max)
6712 mid = (min + max) / 2;
6714 if (got_vma > r->address)
6716 else if (got_vma < r->address)
6725 /* Skip unknown relocation. PR 17512: file: bc9d6cf5. */
6726 if (got_vma == p->address
6728 && (p->howto->type == R_X86_64_JUMP_SLOT
6729 || p->howto->type == R_X86_64_GLOB_DAT
6730 || p->howto->type == R_X86_64_IRELATIVE))
6732 *s = **p->sym_ptr_ptr;
6733 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL
6734 set. Since we are defining a symbol, ensure one
6736 if ((s->flags & BSF_LOCAL) == 0)
6737 s->flags |= BSF_GLOBAL;
6738 s->flags |= BSF_SYNTHETIC;
6739 /* This is no longer a section symbol. */
6740 s->flags &= ~BSF_SECTION_SYM;
6742 s->the_bfd = plt->owner;
6744 /* Store relocation for later use. */
6746 /* Add @plt to function name later. */
6747 size += strlen (s->name) + sizeof ("@plt");
6749 size += sizeof ("+0x") - 1 + 8 + 8 * ABI_64_P (abfd);
6753 offset += plt_entry_size;
6757 /* PLT entries with R_X86_64_TLSDESC relocations are skipped. */
6763 /* Allocate space for @plt suffixes. */
6764 names = (char *) bfd_malloc (size);
6769 for (i = 0; i < count; i++)
6771 /* Add @plt to function name. */
6772 arelent *p = (arelent *) s->udata.p;
6775 size = strlen (s->name);
6776 memcpy (names, s->name, size);
6783 memcpy (names, "+0x", sizeof ("+0x") - 1);
6784 names += sizeof ("+0x") - 1;
6785 bfd_sprintf_vma (abfd, buf, p->addend);
6786 for (a = buf; *a == '0'; ++a)
6789 memcpy (names, a, size);
6792 memcpy (names, "@plt", sizeof ("@plt"));
6793 names += sizeof ("@plt");
6797 for (j = 0; plts[j].name != NULL; j++)
6798 if (plts[j].contents != NULL)
6799 free (plts[j].contents);
6806 /* Handle an x86-64 specific section when reading an object file. This
6807 is called when elfcode.h finds a section with an unknown type. */
6810 elf_x86_64_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr,
6811 const char *name, int shindex)
6813 if (hdr->sh_type != SHT_X86_64_UNWIND)
6816 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
6822 /* Hook called by the linker routine which adds symbols from an object
6823 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
6827 elf_x86_64_add_symbol_hook (bfd *abfd,
6828 struct bfd_link_info *info ATTRIBUTE_UNUSED,
6829 Elf_Internal_Sym *sym,
6830 const char **namep ATTRIBUTE_UNUSED,
6831 flagword *flagsp ATTRIBUTE_UNUSED,
6837 switch (sym->st_shndx)
6839 case SHN_X86_64_LCOMMON:
6840 lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
6843 lcomm = bfd_make_section_with_flags (abfd,
6847 | SEC_LINKER_CREATED));
6850 elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
6853 *valp = sym->st_size;
6861 /* Given a BFD section, try to locate the corresponding ELF section
6865 elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
6866 asection *sec, int *index_return)
6868 if (sec == &_bfd_elf_large_com_section)
6870 *index_return = SHN_X86_64_LCOMMON;
6876 /* Process a symbol. */
6879 elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
6882 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
6884 switch (elfsym->internal_elf_sym.st_shndx)
6886 case SHN_X86_64_LCOMMON:
6887 asym->section = &_bfd_elf_large_com_section;
6888 asym->value = elfsym->internal_elf_sym.st_size;
6889 /* Common symbol doesn't set BSF_GLOBAL. */
6890 asym->flags &= ~BSF_GLOBAL;
6896 elf_x86_64_common_definition (Elf_Internal_Sym *sym)
6898 return (sym->st_shndx == SHN_COMMON
6899 || sym->st_shndx == SHN_X86_64_LCOMMON);
6903 elf_x86_64_common_section_index (asection *sec)
6905 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
6908 return SHN_X86_64_LCOMMON;
6912 elf_x86_64_common_section (asection *sec)
6914 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
6915 return bfd_com_section_ptr;
6917 return &_bfd_elf_large_com_section;
6921 elf_x86_64_merge_symbol (struct elf_link_hash_entry *h,
6922 const Elf_Internal_Sym *sym,
6927 const asection *oldsec)
6929 /* A normal common symbol and a large common symbol result in a
6930 normal common symbol. We turn the large common symbol into a
6933 && h->root.type == bfd_link_hash_common
6935 && bfd_is_com_section (*psec)
6938 if (sym->st_shndx == SHN_COMMON
6939 && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) != 0)
6941 h->root.u.c.p->section
6942 = bfd_make_section_old_way (oldbfd, "COMMON");
6943 h->root.u.c.p->section->flags = SEC_ALLOC;
6945 else if (sym->st_shndx == SHN_X86_64_LCOMMON
6946 && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) == 0)
6947 *psec = bfd_com_section_ptr;
6954 elf_x86_64_additional_program_headers (bfd *abfd,
6955 struct bfd_link_info *info ATTRIBUTE_UNUSED)
6960 /* Check to see if we need a large readonly segment. */
6961 s = bfd_get_section_by_name (abfd, ".lrodata");
6962 if (s && (s->flags & SEC_LOAD))
6965 /* Check to see if we need a large data segment. Since .lbss sections
6966 is placed right after the .bss section, there should be no need for
6967 a large data segment just because of .lbss. */
6968 s = bfd_get_section_by_name (abfd, ".ldata");
6969 if (s && (s->flags & SEC_LOAD))
6975 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
6978 elf_x86_64_hash_symbol (struct elf_link_hash_entry *h)
6980 if (h->plt.offset != (bfd_vma) -1
6982 && !h->pointer_equality_needed)
6985 return _bfd_elf_hash_symbol (h);
6988 /* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
6991 elf_x86_64_relocs_compatible (const bfd_target *input,
6992 const bfd_target *output)
6994 return ((xvec_get_elf_backend_data (input)->s->elfclass
6995 == xvec_get_elf_backend_data (output)->s->elfclass)
6996 && _bfd_elf_relocs_compatible (input, output));
6999 /* Parse x86-64 GNU properties. */
7001 static enum elf_property_kind
7002 elf_x86_64_parse_gnu_properties (bfd *abfd, unsigned int type,
7003 bfd_byte *ptr, unsigned int datasz)
7009 case GNU_PROPERTY_X86_ISA_1_USED:
7010 case GNU_PROPERTY_X86_ISA_1_NEEDED:
7014 ((type == GNU_PROPERTY_X86_ISA_1_USED
7015 ? _("error: %B: <corrupt x86 ISA used size: 0x%x>")
7016 : _("error: %B: <corrupt x86 ISA needed size: 0x%x>")),
7018 return property_corrupt;
7020 prop = _bfd_elf_get_property (abfd, type, datasz);
7021 /* Combine properties of the same type. */
7022 prop->u.number |= bfd_h_get_32 (abfd, ptr);
7023 prop->pr_kind = property_number;
7027 return property_ignored;
7030 return property_number;
7033 /* Merge x86-64 GNU property BPROP with APROP. If APROP isn't NULL,
7034 return TRUE if APROP is updated. Otherwise, return TRUE if BPROP
7035 should be merged with ABFD. */
7038 elf_x86_64_merge_gnu_properties (bfd *abfd ATTRIBUTE_UNUSED,
7039 elf_property *aprop,
7040 elf_property *bprop)
7042 unsigned int number;
7043 bfd_boolean updated = FALSE;
7044 unsigned int pr_type = aprop != NULL ? aprop->pr_type : bprop->pr_type;
7048 case GNU_PROPERTY_X86_ISA_1_USED:
7049 case GNU_PROPERTY_X86_ISA_1_NEEDED:
7050 if (aprop != NULL && bprop != NULL)
7052 number = aprop->u.number;
7053 aprop->u.number = number | bprop->u.number;
7054 updated = number != (unsigned int) aprop->u.number;
7058 /* Return TRUE if APROP is NULL to indicate that BPROP should
7059 be added to ABFD. */
7060 updated = aprop == NULL;
7065 /* Never should happen. */
7072 /* Set up x86-64 GNU properties. Return the first relocatable ELF input
7073 with GNU properties if found. Otherwise, return NULL. */
7076 elf_x86_64_link_setup_gnu_properties (struct bfd_link_info *info)
7078 bfd_boolean normal_target;
7079 bfd_boolean lazy_plt;
7080 asection *sec, *pltsec;
7082 unsigned int plt_alignment;
7083 struct elf_x86_64_link_hash_table *htab;
7084 bfd *pbfd = _bfd_elf_link_setup_gnu_properties (info);
7086 if (bfd_link_relocatable (info))
7089 htab = elf_x86_64_hash_table (info);
7093 dynobj = htab->elf.dynobj;
7095 /* Set htab->elf.dynobj here so that there is no need to check and
7096 set it in check_relocs. */
7101 /* Find a normal input file to hold linker created
7103 for (abfd = info->input_bfds;
7105 abfd = abfd->link.next)
7107 & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0)
7109 htab->elf.dynobj = abfd;
7115 /* Even when lazy binding is disabled by "-z now", the PLT0 entry may
7116 still be used with LD_AUDIT or LD_PROFILE if PLT entry is used for
7117 canonical function address. */
7118 htab->plt.has_plt0 = 1;
7120 if (get_elf_x86_64_backend_data (info->output_bfd)->os
7125 htab->lazy_plt = &elf_x86_64_lazy_bnd_plt;
7126 htab->non_lazy_plt = &elf_x86_64_non_lazy_bnd_plt;
7130 htab->lazy_plt = &elf_x86_64_lazy_plt;
7131 htab->non_lazy_plt = &elf_x86_64_non_lazy_plt;
7133 normal_target = TRUE;
7137 htab->lazy_plt = &elf_x86_64_nacl_plt;
7138 htab->non_lazy_plt = NULL;
7139 normal_target = FALSE;
7142 pltsec = htab->elf.splt;
7144 /* If the non-lazy PLT is available, use it for all PLT entries if
7145 there are no PLT0 or no .plt section. */
7146 if (htab->non_lazy_plt != NULL
7147 && (!htab->plt.has_plt0 || pltsec == NULL))
7151 = htab->non_lazy_plt->plt_entry;
7152 htab->plt.plt_entry_size
7153 = htab->non_lazy_plt->plt_entry_size;
7154 htab->plt.plt_got_offset
7155 = htab->non_lazy_plt->plt_got_offset;
7156 htab->plt.plt_got_insn_size
7157 = htab->non_lazy_plt->plt_got_insn_size;
7158 htab->plt.eh_frame_plt_size
7159 = htab->non_lazy_plt->eh_frame_plt_size;
7160 htab->plt.eh_frame_plt
7161 = htab->non_lazy_plt->eh_frame_plt;
7167 = htab->lazy_plt->plt_entry;
7168 htab->plt.plt_entry_size
7169 = htab->lazy_plt->plt_entry_size;
7170 htab->plt.plt_got_offset
7171 = htab->lazy_plt->plt_got_offset;
7172 htab->plt.plt_got_insn_size
7173 = htab->lazy_plt->plt_got_insn_size;
7174 htab->plt.eh_frame_plt_size
7175 = htab->lazy_plt->eh_frame_plt_size;
7176 htab->plt.eh_frame_plt
7177 = htab->lazy_plt->eh_frame_plt;
7180 /* Return if there are no normal input files. */
7184 /* Since create_dynamic_sections isn't always called, but GOT
7185 relocations need GOT relocations, create them here so that we
7186 don't need to do it in check_relocs. */
7187 if (htab->elf.sgot == NULL
7188 && !_bfd_elf_create_got_section (dynobj, info))
7189 info->callbacks->einfo (_("%F: failed to create GOT sections\n"));
7191 /* Align .got and .got.plt sections to their entry size. Do it here
7192 instead of in create_dynamic_sections so that they are always
7193 properly aligned even if create_dynamic_sections isn't called. */
7194 sec = htab->elf.sgot;
7195 if (!bfd_set_section_alignment (dynobj, sec, 3))
7198 info->callbacks->einfo (_("%F%A: failed to align section\n"),
7202 sec = htab->elf.sgotplt;
7203 if (!bfd_set_section_alignment (dynobj, sec, 3))
7204 goto error_alignment;
7206 /* Create the ifunc sections here so that check_relocs can be
7208 if (!_bfd_elf_create_ifunc_sections (dynobj, info))
7209 info->callbacks->einfo (_("%F: failed to create ifunc sections\n"));
7211 plt_alignment = bfd_log2 (htab->plt.plt_entry_size);
7215 /* Whe creating executable, set the contents of the .interp
7216 section to the interpreter. */
7217 if (bfd_link_executable (info) && !info->nointerp)
7219 asection *s = bfd_get_linker_section (dynobj, ".interp");
7222 s->size = htab->dynamic_interpreter_size;
7223 s->contents = (unsigned char *) htab->dynamic_interpreter;
7227 /* Don't change PLT section alignment for NaCl since it uses
7228 64-byte PLT entry and sets PLT section alignment to 32
7229 bytes. Don't create additional PLT sections for NaCl. */
7232 const struct elf_backend_data *bed
7233 = get_elf_backend_data (dynobj);
7234 flagword pltflags = (bed->dynamic_sec_flags
7239 unsigned int non_lazy_plt_alignment
7240 = bfd_log2 (htab->non_lazy_plt->plt_entry_size);
7243 if (!bfd_set_section_alignment (sec->owner, sec,
7245 goto error_alignment;
7247 /* Create the GOT procedure linkage table. */
7248 sec = bfd_make_section_anyway_with_flags (dynobj,
7252 info->callbacks->einfo (_("%F: failed to create GOT PLT section\n"));
7254 if (!bfd_set_section_alignment (dynobj, sec,
7255 non_lazy_plt_alignment))
7256 goto error_alignment;
7258 htab->plt_got = sec;
7260 /* MPX PLT is supported only for non-NaCl target in 64-bit
7261 mode and is needed only for lazy binding. */
7263 && info->bndplt && ABI_64_P (dynobj))
7265 /* Create the second PLT for Intel MPX support. */
7266 sec = bfd_make_section_anyway_with_flags (dynobj,
7270 info->callbacks->einfo (_("%F: failed to create BND PLT section\n"));
7272 if (!bfd_set_section_alignment (dynobj, sec,
7273 non_lazy_plt_alignment))
7274 goto error_alignment;
7276 htab->plt_second = sec;
7280 if (!info->no_ld_generated_unwind_info)
7282 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
7283 | SEC_HAS_CONTENTS | SEC_IN_MEMORY
7284 | SEC_LINKER_CREATED);
7286 sec = bfd_make_section_anyway_with_flags (dynobj,
7290 info->callbacks->einfo (_("%F: failed to create PLT .eh_frame section\n"));
7292 if (!bfd_set_section_alignment (dynobj, sec,
7293 ABI_64_P (dynobj) ? 3 : 2))
7294 goto error_alignment;
7296 htab->plt_eh_frame = sec;
7298 if (htab->plt_got != NULL)
7300 sec = bfd_make_section_anyway_with_flags (dynobj,
7304 info->callbacks->einfo (_("%F: failed to create GOT PLT .eh_frame section\n"));
7306 if (!bfd_set_section_alignment (dynobj, sec,
7307 ABI_64_P (dynobj) ? 3 : 2))
7308 goto error_alignment;
7310 htab->plt_got_eh_frame = sec;
7313 if (htab->plt_second != NULL)
7315 sec = bfd_make_section_anyway_with_flags (dynobj,
7319 info->callbacks->einfo (_("%F: failed to create BND PLT .eh_frame section\n"));
7321 if (!bfd_set_section_alignment (dynobj, sec, 3))
7322 goto error_alignment;
7324 htab->plt_second_eh_frame = sec;
7331 /* The .iplt section is used for IFUNC symbols in static
7333 sec = htab->elf.iplt;
7335 && !bfd_set_section_alignment (sec->owner, sec,
7337 goto error_alignment;
7343 static const struct bfd_elf_special_section
7344 elf_x86_64_special_sections[]=
7346 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
7347 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
7348 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
7349 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
7350 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
7351 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
7352 { NULL, 0, 0, 0, 0 }
7355 #define TARGET_LITTLE_SYM x86_64_elf64_vec
7356 #define TARGET_LITTLE_NAME "elf64-x86-64"
7357 #define ELF_ARCH bfd_arch_i386
7358 #define ELF_TARGET_ID X86_64_ELF_DATA
7359 #define ELF_MACHINE_CODE EM_X86_64
7360 #define ELF_MAXPAGESIZE 0x200000
7361 #define ELF_MINPAGESIZE 0x1000
7362 #define ELF_COMMONPAGESIZE 0x1000
7364 #define elf_backend_can_gc_sections 1
7365 #define elf_backend_can_refcount 1
7366 #define elf_backend_want_got_plt 1
7367 #define elf_backend_plt_readonly 1
7368 #define elf_backend_want_plt_sym 0
7369 #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
7370 #define elf_backend_rela_normal 1
7371 #define elf_backend_plt_alignment 4
7372 #define elf_backend_extern_protected_data 1
7373 #define elf_backend_caches_rawsize 1
7374 #define elf_backend_dtrel_excludes_plt 1
7375 #define elf_backend_want_dynrelro 1
7377 #define elf_info_to_howto elf_x86_64_info_to_howto
7379 #define bfd_elf64_bfd_link_hash_table_create \
7380 elf_x86_64_link_hash_table_create
7381 #define bfd_elf64_bfd_reloc_type_lookup elf_x86_64_reloc_type_lookup
7382 #define bfd_elf64_bfd_reloc_name_lookup \
7383 elf_x86_64_reloc_name_lookup
7385 #define elf_backend_adjust_dynamic_symbol elf_x86_64_adjust_dynamic_symbol
7386 #define elf_backend_relocs_compatible elf_x86_64_relocs_compatible
7387 #define elf_backend_check_relocs elf_x86_64_check_relocs
7388 #define elf_backend_copy_indirect_symbol elf_x86_64_copy_indirect_symbol
7389 #define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
7390 #define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
7391 #define elf_backend_finish_dynamic_symbol elf_x86_64_finish_dynamic_symbol
7392 #define elf_backend_output_arch_local_syms elf_x86_64_output_arch_local_syms
7393 #define elf_backend_gc_mark_hook elf_x86_64_gc_mark_hook
7394 #define elf_backend_grok_prstatus elf_x86_64_grok_prstatus
7395 #define elf_backend_grok_psinfo elf_x86_64_grok_psinfo
7397 #define elf_backend_write_core_note elf_x86_64_write_core_note
7399 #define elf_backend_reloc_type_class elf_x86_64_reloc_type_class
7400 #define elf_backend_relocate_section elf_x86_64_relocate_section
7401 #define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections
7402 #define elf_backend_always_size_sections elf_x86_64_always_size_sections
7403 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
7404 #define elf_backend_object_p elf64_x86_64_elf_object_p
7405 #define bfd_elf64_mkobject elf_x86_64_mkobject
7406 #define bfd_elf64_get_synthetic_symtab elf_x86_64_get_synthetic_symtab
7408 #define elf_backend_section_from_shdr \
7409 elf_x86_64_section_from_shdr
7411 #define elf_backend_section_from_bfd_section \
7412 elf_x86_64_elf_section_from_bfd_section
7413 #define elf_backend_add_symbol_hook \
7414 elf_x86_64_add_symbol_hook
7415 #define elf_backend_symbol_processing \
7416 elf_x86_64_symbol_processing
7417 #define elf_backend_common_section_index \
7418 elf_x86_64_common_section_index
7419 #define elf_backend_common_section \
7420 elf_x86_64_common_section
7421 #define elf_backend_common_definition \
7422 elf_x86_64_common_definition
7423 #define elf_backend_merge_symbol \
7424 elf_x86_64_merge_symbol
7425 #define elf_backend_special_sections \
7426 elf_x86_64_special_sections
7427 #define elf_backend_additional_program_headers \
7428 elf_x86_64_additional_program_headers
7429 #define elf_backend_hash_symbol \
7430 elf_x86_64_hash_symbol
7431 #define elf_backend_omit_section_dynsym \
7432 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
7433 #define elf_backend_fixup_symbol \
7434 elf_x86_64_fixup_symbol
7435 #define elf_backend_parse_gnu_properties \
7436 elf_x86_64_parse_gnu_properties
7437 #define elf_backend_merge_gnu_properties \
7438 elf_x86_64_merge_gnu_properties
7439 #define elf_backend_setup_gnu_properties \
7440 elf_x86_64_link_setup_gnu_properties
7442 #include "elf64-target.h"
7444 /* CloudABI support. */
7446 #undef TARGET_LITTLE_SYM
7447 #define TARGET_LITTLE_SYM x86_64_elf64_cloudabi_vec
7448 #undef TARGET_LITTLE_NAME
7449 #define TARGET_LITTLE_NAME "elf64-x86-64-cloudabi"
7452 #define ELF_OSABI ELFOSABI_CLOUDABI
7455 #define elf64_bed elf64_x86_64_cloudabi_bed
7457 #include "elf64-target.h"
7459 /* FreeBSD support. */
7461 #undef TARGET_LITTLE_SYM
7462 #define TARGET_LITTLE_SYM x86_64_elf64_fbsd_vec
7463 #undef TARGET_LITTLE_NAME
7464 #define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
7467 #define ELF_OSABI ELFOSABI_FREEBSD
7470 #define elf64_bed elf64_x86_64_fbsd_bed
7472 #include "elf64-target.h"
7474 /* Solaris 2 support. */
7476 #undef TARGET_LITTLE_SYM
7477 #define TARGET_LITTLE_SYM x86_64_elf64_sol2_vec
7478 #undef TARGET_LITTLE_NAME
7479 #define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
7481 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
7482 objects won't be recognized. */
7486 #define elf64_bed elf64_x86_64_sol2_bed
7488 /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
7490 #undef elf_backend_static_tls_alignment
7491 #define elf_backend_static_tls_alignment 16
7493 /* The Solaris 2 ABI requires a plt symbol on all platforms.
7495 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
7497 #undef elf_backend_want_plt_sym
7498 #define elf_backend_want_plt_sym 1
7500 #undef elf_backend_strtab_flags
7501 #define elf_backend_strtab_flags SHF_STRINGS
7504 elf64_x86_64_copy_solaris_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED,
7505 bfd *obfd ATTRIBUTE_UNUSED,
7506 const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
7507 Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
7509 /* PR 19938: FIXME: Need to add code for setting the sh_info
7510 and sh_link fields of Solaris specific section types. */
7514 #undef elf_backend_copy_special_section_fields
7515 #define elf_backend_copy_special_section_fields elf64_x86_64_copy_solaris_special_section_fields
7517 #include "elf64-target.h"
7519 /* Native Client support. */
7522 elf64_x86_64_nacl_elf_object_p (bfd *abfd)
7524 /* Set the right machine number for a NaCl x86-64 ELF64 file. */
7525 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64_nacl);
7529 #undef TARGET_LITTLE_SYM
7530 #define TARGET_LITTLE_SYM x86_64_elf64_nacl_vec
7531 #undef TARGET_LITTLE_NAME
7532 #define TARGET_LITTLE_NAME "elf64-x86-64-nacl"
7534 #define elf64_bed elf64_x86_64_nacl_bed
7536 #undef ELF_MAXPAGESIZE
7537 #undef ELF_MINPAGESIZE
7538 #undef ELF_COMMONPAGESIZE
7539 #define ELF_MAXPAGESIZE 0x10000
7540 #define ELF_MINPAGESIZE 0x10000
7541 #define ELF_COMMONPAGESIZE 0x10000
7543 /* Restore defaults. */
7545 #undef elf_backend_static_tls_alignment
7546 #undef elf_backend_want_plt_sym
7547 #define elf_backend_want_plt_sym 0
7548 #undef elf_backend_strtab_flags
7549 #undef elf_backend_copy_special_section_fields
7551 /* NaCl uses substantially different PLT entries for the same effects. */
7553 #undef elf_backend_plt_alignment
7554 #define elf_backend_plt_alignment 5
7555 #define NACL_PLT_ENTRY_SIZE 64
7556 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
7558 static const bfd_byte elf_x86_64_nacl_plt0_entry[NACL_PLT_ENTRY_SIZE] =
7560 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
7561 0x4c, 0x8b, 0x1d, 16, 0, 0, 0, /* mov GOT+16(%rip), %r11 */
7562 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
7563 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
7564 0x41, 0xff, 0xe3, /* jmpq *%r11 */
7566 /* 9-byte nop sequence to pad out to the next 32-byte boundary. */
7567 0x66, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw 0x0(%rax,%rax,1) */
7569 /* 32 bytes of nop to pad out to the standard size. */
7570 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data16 prefixes */
7571 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
7572 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data16 prefixes */
7573 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
7574 0x66, /* excess data16 prefix */
7578 static const bfd_byte elf_x86_64_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
7580 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, /* mov name@GOTPCREL(%rip),%r11 */
7581 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
7582 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
7583 0x41, 0xff, 0xe3, /* jmpq *%r11 */
7585 /* 15-byte nop sequence to pad out to the next 32-byte boundary. */
7586 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data16 prefixes */
7587 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
7589 /* Lazy GOT entries point here (32-byte aligned). */
7590 0x68, /* pushq immediate */
7591 0, 0, 0, 0, /* replaced with index into relocation table. */
7592 0xe9, /* jmp relative */
7593 0, 0, 0, 0, /* replaced with offset to start of .plt0. */
7595 /* 22 bytes of nop to pad out to the standard size. */
7596 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data16 prefixes */
7597 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
7598 0x0f, 0x1f, 0x80, 0, 0, 0, 0, /* nopl 0x0(%rax) */
7601 /* .eh_frame covering the .plt section. */
7603 static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] =
7605 #if (PLT_CIE_LENGTH != 20 \
7606 || PLT_FDE_LENGTH != 36 \
7607 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
7608 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
7609 # error "Need elf_x86_64_backend_data parameters for eh_frame_plt offsets!"
7611 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
7612 0, 0, 0, 0, /* CIE ID */
7613 1, /* CIE version */
7614 'z', 'R', 0, /* Augmentation string */
7615 1, /* Code alignment factor */
7616 0x78, /* Data alignment factor */
7617 16, /* Return address column */
7618 1, /* Augmentation size */
7619 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
7620 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
7621 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
7622 DW_CFA_nop, DW_CFA_nop,
7624 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
7625 PLT_CIE_LENGTH + 8, 0, 0, 0,/* CIE pointer */
7626 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
7627 0, 0, 0, 0, /* .plt size goes here */
7628 0, /* Augmentation size */
7629 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
7630 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
7631 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
7632 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
7633 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
7634 13, /* Block length */
7635 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
7636 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
7637 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
7638 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
7639 DW_CFA_nop, DW_CFA_nop
7642 static const struct elf_x86_64_lazy_plt_layout elf_x86_64_nacl_plt =
7644 elf_x86_64_nacl_plt0_entry, /* plt0_entry */
7645 elf_x86_64_nacl_plt_entry, /* plt_entry */
7646 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
7647 2, /* plt0_got1_offset */
7648 9, /* plt0_got2_offset */
7649 13, /* plt0_got2_insn_end */
7650 3, /* plt_got_offset */
7651 33, /* plt_reloc_offset */
7652 38, /* plt_plt_offset */
7653 7, /* plt_got_insn_size */
7654 42, /* plt_plt_insn_end */
7655 32, /* plt_lazy_offset */
7656 elf_x86_64_nacl_eh_frame_plt, /* eh_frame_plt */
7657 sizeof (elf_x86_64_nacl_eh_frame_plt) /* eh_frame_plt_size */
7660 static const struct elf_x86_64_backend_data elf_x86_64_nacl_arch_bed =
7665 #undef elf_backend_arch_data
7666 #define elf_backend_arch_data &elf_x86_64_nacl_arch_bed
7668 #undef elf_backend_object_p
7669 #define elf_backend_object_p elf64_x86_64_nacl_elf_object_p
7670 #undef elf_backend_modify_segment_map
7671 #define elf_backend_modify_segment_map nacl_modify_segment_map
7672 #undef elf_backend_modify_program_headers
7673 #define elf_backend_modify_program_headers nacl_modify_program_headers
7674 #undef elf_backend_final_write_processing
7675 #define elf_backend_final_write_processing nacl_final_write_processing
7677 #include "elf64-target.h"
7679 /* Native Client x32 support. */
7682 elf32_x86_64_nacl_elf_object_p (bfd *abfd)
7684 /* Set the right machine number for a NaCl x86-64 ELF32 file. */
7685 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32_nacl);
7689 #undef TARGET_LITTLE_SYM
7690 #define TARGET_LITTLE_SYM x86_64_elf32_nacl_vec
7691 #undef TARGET_LITTLE_NAME
7692 #define TARGET_LITTLE_NAME "elf32-x86-64-nacl"
7694 #define elf32_bed elf32_x86_64_nacl_bed
7696 #define bfd_elf32_bfd_link_hash_table_create \
7697 elf_x86_64_link_hash_table_create
7698 #define bfd_elf32_bfd_reloc_type_lookup \
7699 elf_x86_64_reloc_type_lookup
7700 #define bfd_elf32_bfd_reloc_name_lookup \
7701 elf_x86_64_reloc_name_lookup
7702 #define bfd_elf32_mkobject \
7704 #define bfd_elf32_get_synthetic_symtab \
7705 elf_x86_64_get_synthetic_symtab
7707 #undef elf_backend_object_p
7708 #define elf_backend_object_p \
7709 elf32_x86_64_nacl_elf_object_p
7711 #undef elf_backend_bfd_from_remote_memory
7712 #define elf_backend_bfd_from_remote_memory \
7713 _bfd_elf32_bfd_from_remote_memory
7715 #undef elf_backend_size_info
7716 #define elf_backend_size_info \
7717 _bfd_elf32_size_info
7719 #include "elf32-target.h"
7721 /* Restore defaults. */
7722 #undef elf_backend_object_p
7723 #define elf_backend_object_p elf64_x86_64_elf_object_p
7724 #undef elf_backend_bfd_from_remote_memory
7725 #undef elf_backend_size_info
7726 #undef elf_backend_modify_segment_map
7727 #undef elf_backend_modify_program_headers
7728 #undef elf_backend_final_write_processing
7730 /* Intel L1OM support. */
7733 elf64_l1om_elf_object_p (bfd *abfd)
7735 /* Set the right machine number for an L1OM elf64 file. */
7736 bfd_default_set_arch_mach (abfd, bfd_arch_l1om, bfd_mach_l1om);
7740 #undef TARGET_LITTLE_SYM
7741 #define TARGET_LITTLE_SYM l1om_elf64_vec
7742 #undef TARGET_LITTLE_NAME
7743 #define TARGET_LITTLE_NAME "elf64-l1om"
7745 #define ELF_ARCH bfd_arch_l1om
7747 #undef ELF_MACHINE_CODE
7748 #define ELF_MACHINE_CODE EM_L1OM
7753 #define elf64_bed elf64_l1om_bed
7755 #undef elf_backend_object_p
7756 #define elf_backend_object_p elf64_l1om_elf_object_p
7758 /* Restore defaults. */
7759 #undef ELF_MAXPAGESIZE
7760 #undef ELF_MINPAGESIZE
7761 #undef ELF_COMMONPAGESIZE
7762 #define ELF_MAXPAGESIZE 0x200000
7763 #define ELF_MINPAGESIZE 0x1000
7764 #define ELF_COMMONPAGESIZE 0x1000
7765 #undef elf_backend_plt_alignment
7766 #define elf_backend_plt_alignment 4
7767 #undef elf_backend_arch_data
7768 #define elf_backend_arch_data &elf_x86_64_arch_bed
7770 #include "elf64-target.h"
7772 /* FreeBSD L1OM support. */
7774 #undef TARGET_LITTLE_SYM
7775 #define TARGET_LITTLE_SYM l1om_elf64_fbsd_vec
7776 #undef TARGET_LITTLE_NAME
7777 #define TARGET_LITTLE_NAME "elf64-l1om-freebsd"
7780 #define ELF_OSABI ELFOSABI_FREEBSD
7783 #define elf64_bed elf64_l1om_fbsd_bed
7785 #include "elf64-target.h"
7787 /* Intel K1OM support. */
7790 elf64_k1om_elf_object_p (bfd *abfd)
7792 /* Set the right machine number for an K1OM elf64 file. */
7793 bfd_default_set_arch_mach (abfd, bfd_arch_k1om, bfd_mach_k1om);
7797 #undef TARGET_LITTLE_SYM
7798 #define TARGET_LITTLE_SYM k1om_elf64_vec
7799 #undef TARGET_LITTLE_NAME
7800 #define TARGET_LITTLE_NAME "elf64-k1om"
7802 #define ELF_ARCH bfd_arch_k1om
7804 #undef ELF_MACHINE_CODE
7805 #define ELF_MACHINE_CODE EM_K1OM
7810 #define elf64_bed elf64_k1om_bed
7812 #undef elf_backend_object_p
7813 #define elf_backend_object_p elf64_k1om_elf_object_p
7815 #undef elf_backend_static_tls_alignment
7817 #undef elf_backend_want_plt_sym
7818 #define elf_backend_want_plt_sym 0
7820 #include "elf64-target.h"
7822 /* FreeBSD K1OM support. */
7824 #undef TARGET_LITTLE_SYM
7825 #define TARGET_LITTLE_SYM k1om_elf64_fbsd_vec
7826 #undef TARGET_LITTLE_NAME
7827 #define TARGET_LITTLE_NAME "elf64-k1om-freebsd"
7830 #define ELF_OSABI ELFOSABI_FREEBSD
7833 #define elf64_bed elf64_k1om_fbsd_bed
7835 #include "elf64-target.h"
7837 /* 32bit x86-64 support. */
7839 #undef TARGET_LITTLE_SYM
7840 #define TARGET_LITTLE_SYM x86_64_elf32_vec
7841 #undef TARGET_LITTLE_NAME
7842 #define TARGET_LITTLE_NAME "elf32-x86-64"
7846 #define ELF_ARCH bfd_arch_i386
7848 #undef ELF_MACHINE_CODE
7849 #define ELF_MACHINE_CODE EM_X86_64
7853 #undef elf_backend_object_p
7854 #define elf_backend_object_p \
7855 elf32_x86_64_elf_object_p
7857 #undef elf_backend_bfd_from_remote_memory
7858 #define elf_backend_bfd_from_remote_memory \
7859 _bfd_elf32_bfd_from_remote_memory
7861 #undef elf_backend_size_info
7862 #define elf_backend_size_info \
7863 _bfd_elf32_size_info
7865 #include "elf32-target.h"