1 /* X86-64 specific support for ELF
2 Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
4 Free Software Foundation, Inc.
5 Contributed by Jan Hubicka <jh@suse.cz>.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22 MA 02110-1301, USA. */
30 #include "bfd_stdint.h"
34 #include "libiberty.h"
36 #include "elf/x86-64.h"
43 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
44 #define MINUS_ONE (~ (bfd_vma) 0)
46 /* Since both 32-bit and 64-bit x86-64 encode relocation type in the
47 identical manner, we use ELF32_R_TYPE instead of ELF64_R_TYPE to get
48 relocation type. We also use ELF_ST_TYPE instead of ELF64_ST_TYPE
49 since they are the same. */
51 #define ABI_64_P(abfd) \
52 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
54 /* The relocation "howto" table. Order of fields:
55 type, rightshift, size, bitsize, pc_relative, bitpos, complain_on_overflow,
56 special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset. */
57 static reloc_howto_type x86_64_elf_howto_table[] =
59 HOWTO(R_X86_64_NONE, 0, 0, 0, FALSE, 0, complain_overflow_dont,
60 bfd_elf_generic_reloc, "R_X86_64_NONE", FALSE, 0x00000000, 0x00000000,
62 HOWTO(R_X86_64_64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
63 bfd_elf_generic_reloc, "R_X86_64_64", FALSE, MINUS_ONE, MINUS_ONE,
65 HOWTO(R_X86_64_PC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
66 bfd_elf_generic_reloc, "R_X86_64_PC32", FALSE, 0xffffffff, 0xffffffff,
68 HOWTO(R_X86_64_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
69 bfd_elf_generic_reloc, "R_X86_64_GOT32", FALSE, 0xffffffff, 0xffffffff,
71 HOWTO(R_X86_64_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
72 bfd_elf_generic_reloc, "R_X86_64_PLT32", FALSE, 0xffffffff, 0xffffffff,
74 HOWTO(R_X86_64_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
75 bfd_elf_generic_reloc, "R_X86_64_COPY", FALSE, 0xffffffff, 0xffffffff,
77 HOWTO(R_X86_64_GLOB_DAT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
78 bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", FALSE, MINUS_ONE,
80 HOWTO(R_X86_64_JUMP_SLOT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
81 bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", FALSE, MINUS_ONE,
83 HOWTO(R_X86_64_RELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
84 bfd_elf_generic_reloc, "R_X86_64_RELATIVE", FALSE, MINUS_ONE,
86 HOWTO(R_X86_64_GOTPCREL, 0, 2, 32, TRUE, 0, complain_overflow_signed,
87 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", FALSE, 0xffffffff,
89 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
90 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
92 HOWTO(R_X86_64_32S, 0, 2, 32, FALSE, 0, complain_overflow_signed,
93 bfd_elf_generic_reloc, "R_X86_64_32S", FALSE, 0xffffffff, 0xffffffff,
95 HOWTO(R_X86_64_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
96 bfd_elf_generic_reloc, "R_X86_64_16", FALSE, 0xffff, 0xffff, FALSE),
97 HOWTO(R_X86_64_PC16,0, 1, 16, TRUE, 0, complain_overflow_bitfield,
98 bfd_elf_generic_reloc, "R_X86_64_PC16", FALSE, 0xffff, 0xffff, TRUE),
99 HOWTO(R_X86_64_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
100 bfd_elf_generic_reloc, "R_X86_64_8", FALSE, 0xff, 0xff, FALSE),
101 HOWTO(R_X86_64_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
102 bfd_elf_generic_reloc, "R_X86_64_PC8", FALSE, 0xff, 0xff, TRUE),
103 HOWTO(R_X86_64_DTPMOD64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
104 bfd_elf_generic_reloc, "R_X86_64_DTPMOD64", FALSE, MINUS_ONE,
106 HOWTO(R_X86_64_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
107 bfd_elf_generic_reloc, "R_X86_64_DTPOFF64", FALSE, MINUS_ONE,
109 HOWTO(R_X86_64_TPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
110 bfd_elf_generic_reloc, "R_X86_64_TPOFF64", FALSE, MINUS_ONE,
112 HOWTO(R_X86_64_TLSGD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
113 bfd_elf_generic_reloc, "R_X86_64_TLSGD", FALSE, 0xffffffff,
115 HOWTO(R_X86_64_TLSLD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
116 bfd_elf_generic_reloc, "R_X86_64_TLSLD", FALSE, 0xffffffff,
118 HOWTO(R_X86_64_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
119 bfd_elf_generic_reloc, "R_X86_64_DTPOFF32", FALSE, 0xffffffff,
121 HOWTO(R_X86_64_GOTTPOFF, 0, 2, 32, TRUE, 0, complain_overflow_signed,
122 bfd_elf_generic_reloc, "R_X86_64_GOTTPOFF", FALSE, 0xffffffff,
124 HOWTO(R_X86_64_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
125 bfd_elf_generic_reloc, "R_X86_64_TPOFF32", FALSE, 0xffffffff,
127 HOWTO(R_X86_64_PC64, 0, 4, 64, TRUE, 0, complain_overflow_bitfield,
128 bfd_elf_generic_reloc, "R_X86_64_PC64", FALSE, MINUS_ONE, MINUS_ONE,
130 HOWTO(R_X86_64_GOTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
131 bfd_elf_generic_reloc, "R_X86_64_GOTOFF64",
132 FALSE, MINUS_ONE, MINUS_ONE, FALSE),
133 HOWTO(R_X86_64_GOTPC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
134 bfd_elf_generic_reloc, "R_X86_64_GOTPC32",
135 FALSE, 0xffffffff, 0xffffffff, TRUE),
136 HOWTO(R_X86_64_GOT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
137 bfd_elf_generic_reloc, "R_X86_64_GOT64", FALSE, MINUS_ONE, MINUS_ONE,
139 HOWTO(R_X86_64_GOTPCREL64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
140 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL64", FALSE, MINUS_ONE,
142 HOWTO(R_X86_64_GOTPC64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
143 bfd_elf_generic_reloc, "R_X86_64_GOTPC64",
144 FALSE, MINUS_ONE, MINUS_ONE, TRUE),
145 HOWTO(R_X86_64_GOTPLT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
146 bfd_elf_generic_reloc, "R_X86_64_GOTPLT64", FALSE, MINUS_ONE,
148 HOWTO(R_X86_64_PLTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
149 bfd_elf_generic_reloc, "R_X86_64_PLTOFF64", FALSE, MINUS_ONE,
153 HOWTO(R_X86_64_GOTPC32_TLSDESC, 0, 2, 32, TRUE, 0,
154 complain_overflow_bitfield, bfd_elf_generic_reloc,
155 "R_X86_64_GOTPC32_TLSDESC",
156 FALSE, 0xffffffff, 0xffffffff, TRUE),
157 HOWTO(R_X86_64_TLSDESC_CALL, 0, 0, 0, FALSE, 0,
158 complain_overflow_dont, bfd_elf_generic_reloc,
159 "R_X86_64_TLSDESC_CALL",
161 HOWTO(R_X86_64_TLSDESC, 0, 4, 64, FALSE, 0,
162 complain_overflow_bitfield, bfd_elf_generic_reloc,
164 FALSE, MINUS_ONE, MINUS_ONE, FALSE),
165 HOWTO(R_X86_64_IRELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
166 bfd_elf_generic_reloc, "R_X86_64_IRELATIVE", FALSE, MINUS_ONE,
168 HOWTO(R_X86_64_RELATIVE64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
169 bfd_elf_generic_reloc, "R_X86_64_RELATIVE64", FALSE, MINUS_ONE,
172 /* We have a gap in the reloc numbers here.
173 R_X86_64_standard counts the number up to this point, and
174 R_X86_64_vt_offset is the value to subtract from a reloc type of
175 R_X86_64_GNU_VT* to form an index into this table. */
176 #define R_X86_64_standard (R_X86_64_IRELATIVE + 1)
177 #define R_X86_64_vt_offset (R_X86_64_GNU_VTINHERIT - R_X86_64_standard)
179 /* GNU extension to record C++ vtable hierarchy. */
180 HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, FALSE, 0, complain_overflow_dont,
181 NULL, "R_X86_64_GNU_VTINHERIT", FALSE, 0, 0, FALSE),
183 /* GNU extension to record C++ vtable member usage. */
184 HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, FALSE, 0, complain_overflow_dont,
185 _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", FALSE, 0, 0,
188 /* Use complain_overflow_bitfield on R_X86_64_32 for x32. */
189 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
190 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
194 #define IS_X86_64_PCREL_TYPE(TYPE) \
195 ( ((TYPE) == R_X86_64_PC8) \
196 || ((TYPE) == R_X86_64_PC16) \
197 || ((TYPE) == R_X86_64_PC32) \
198 || ((TYPE) == R_X86_64_PC64))
200 /* Map BFD relocs to the x86_64 elf relocs. */
203 bfd_reloc_code_real_type bfd_reloc_val;
204 unsigned char elf_reloc_val;
207 static const struct elf_reloc_map x86_64_reloc_map[] =
209 { BFD_RELOC_NONE, R_X86_64_NONE, },
210 { BFD_RELOC_64, R_X86_64_64, },
211 { BFD_RELOC_32_PCREL, R_X86_64_PC32, },
212 { BFD_RELOC_X86_64_GOT32, R_X86_64_GOT32,},
213 { BFD_RELOC_X86_64_PLT32, R_X86_64_PLT32,},
214 { BFD_RELOC_X86_64_COPY, R_X86_64_COPY, },
215 { BFD_RELOC_X86_64_GLOB_DAT, R_X86_64_GLOB_DAT, },
216 { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, },
217 { BFD_RELOC_X86_64_RELATIVE, R_X86_64_RELATIVE, },
218 { BFD_RELOC_X86_64_GOTPCREL, R_X86_64_GOTPCREL, },
219 { BFD_RELOC_32, R_X86_64_32, },
220 { BFD_RELOC_X86_64_32S, R_X86_64_32S, },
221 { BFD_RELOC_16, R_X86_64_16, },
222 { BFD_RELOC_16_PCREL, R_X86_64_PC16, },
223 { BFD_RELOC_8, R_X86_64_8, },
224 { BFD_RELOC_8_PCREL, R_X86_64_PC8, },
225 { BFD_RELOC_X86_64_DTPMOD64, R_X86_64_DTPMOD64, },
226 { BFD_RELOC_X86_64_DTPOFF64, R_X86_64_DTPOFF64, },
227 { BFD_RELOC_X86_64_TPOFF64, R_X86_64_TPOFF64, },
228 { BFD_RELOC_X86_64_TLSGD, R_X86_64_TLSGD, },
229 { BFD_RELOC_X86_64_TLSLD, R_X86_64_TLSLD, },
230 { BFD_RELOC_X86_64_DTPOFF32, R_X86_64_DTPOFF32, },
231 { BFD_RELOC_X86_64_GOTTPOFF, R_X86_64_GOTTPOFF, },
232 { BFD_RELOC_X86_64_TPOFF32, R_X86_64_TPOFF32, },
233 { BFD_RELOC_64_PCREL, R_X86_64_PC64, },
234 { BFD_RELOC_X86_64_GOTOFF64, R_X86_64_GOTOFF64, },
235 { BFD_RELOC_X86_64_GOTPC32, R_X86_64_GOTPC32, },
236 { BFD_RELOC_X86_64_GOT64, R_X86_64_GOT64, },
237 { BFD_RELOC_X86_64_GOTPCREL64,R_X86_64_GOTPCREL64, },
238 { BFD_RELOC_X86_64_GOTPC64, R_X86_64_GOTPC64, },
239 { BFD_RELOC_X86_64_GOTPLT64, R_X86_64_GOTPLT64, },
240 { BFD_RELOC_X86_64_PLTOFF64, R_X86_64_PLTOFF64, },
241 { BFD_RELOC_X86_64_GOTPC32_TLSDESC, R_X86_64_GOTPC32_TLSDESC, },
242 { BFD_RELOC_X86_64_TLSDESC_CALL, R_X86_64_TLSDESC_CALL, },
243 { BFD_RELOC_X86_64_TLSDESC, R_X86_64_TLSDESC, },
244 { BFD_RELOC_X86_64_IRELATIVE, R_X86_64_IRELATIVE, },
245 { BFD_RELOC_VTABLE_INHERIT, R_X86_64_GNU_VTINHERIT, },
246 { BFD_RELOC_VTABLE_ENTRY, R_X86_64_GNU_VTENTRY, },
249 static reloc_howto_type *
250 elf_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type)
254 if (r_type == (unsigned int) R_X86_64_32)
259 i = ARRAY_SIZE (x86_64_elf_howto_table) - 1;
261 else if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT
262 || r_type >= (unsigned int) R_X86_64_max)
264 if (r_type >= (unsigned int) R_X86_64_standard)
266 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
268 r_type = R_X86_64_NONE;
273 i = r_type - (unsigned int) R_X86_64_vt_offset;
274 BFD_ASSERT (x86_64_elf_howto_table[i].type == r_type);
275 return &x86_64_elf_howto_table[i];
278 /* Given a BFD reloc type, return a HOWTO structure. */
279 static reloc_howto_type *
280 elf_x86_64_reloc_type_lookup (bfd *abfd,
281 bfd_reloc_code_real_type code)
285 for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
288 if (x86_64_reloc_map[i].bfd_reloc_val == code)
289 return elf_x86_64_rtype_to_howto (abfd,
290 x86_64_reloc_map[i].elf_reloc_val);
295 static reloc_howto_type *
296 elf_x86_64_reloc_name_lookup (bfd *abfd,
301 if (!ABI_64_P (abfd) && strcasecmp (r_name, "R_X86_64_32") == 0)
303 /* Get x32 R_X86_64_32. */
304 reloc_howto_type *reloc
305 = &x86_64_elf_howto_table[ARRAY_SIZE (x86_64_elf_howto_table) - 1];
306 BFD_ASSERT (reloc->type == (unsigned int) R_X86_64_32);
310 for (i = 0; i < ARRAY_SIZE (x86_64_elf_howto_table); i++)
311 if (x86_64_elf_howto_table[i].name != NULL
312 && strcasecmp (x86_64_elf_howto_table[i].name, r_name) == 0)
313 return &x86_64_elf_howto_table[i];
318 /* Given an x86_64 ELF reloc type, fill in an arelent structure. */
321 elf_x86_64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
322 Elf_Internal_Rela *dst)
326 r_type = ELF32_R_TYPE (dst->r_info);
327 cache_ptr->howto = elf_x86_64_rtype_to_howto (abfd, r_type);
328 BFD_ASSERT (r_type == cache_ptr->howto->type);
331 /* Support for core dump NOTE sections. */
333 elf_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
338 switch (note->descsz)
343 case 296: /* sizeof(istruct elf_prstatus) on Linux/x32 */
345 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
348 elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
356 case 336: /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
358 elf_tdata (abfd)->core_signal
359 = bfd_get_16 (abfd, note->descdata + 12);
362 elf_tdata (abfd)->core_lwpid
363 = bfd_get_32 (abfd, note->descdata + 32);
372 /* Make a ".reg/999" section. */
373 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
374 size, note->descpos + offset);
378 elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
380 switch (note->descsz)
385 case 124: /* sizeof(struct elf_prpsinfo) on Linux/x32 */
386 elf_tdata (abfd)->core_pid
387 = bfd_get_32 (abfd, note->descdata + 12);
388 elf_tdata (abfd)->core_program
389 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
390 elf_tdata (abfd)->core_command
391 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
394 case 136: /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
395 elf_tdata (abfd)->core_pid
396 = bfd_get_32 (abfd, note->descdata + 24);
397 elf_tdata (abfd)->core_program
398 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
399 elf_tdata (abfd)->core_command
400 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
403 /* Note that for some reason, a spurious space is tacked
404 onto the end of the args in some (at least one anyway)
405 implementations, so strip it off if it exists. */
408 char *command = elf_tdata (abfd)->core_command;
409 int n = strlen (command);
411 if (0 < n && command[n - 1] == ' ')
412 command[n - 1] = '\0';
420 elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
423 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
425 const char *fname, *psargs;
436 va_start (ap, note_type);
437 fname = va_arg (ap, const char *);
438 psargs = va_arg (ap, const char *);
441 if (bed->s->elfclass == ELFCLASS32)
444 memset (&data, 0, sizeof (data));
445 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
446 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
447 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
448 &data, sizeof (data));
453 memset (&data, 0, sizeof (data));
454 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
455 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
456 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
457 &data, sizeof (data));
462 va_start (ap, note_type);
463 pid = va_arg (ap, long);
464 cursig = va_arg (ap, int);
465 gregs = va_arg (ap, const void *);
468 if (bed->s->elfclass == ELFCLASS32)
470 if (bed->elf_machine_code == EM_X86_64)
472 prstatusx32_t prstat;
473 memset (&prstat, 0, sizeof (prstat));
475 prstat.pr_cursig = cursig;
476 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
477 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
478 &prstat, sizeof (prstat));
483 memset (&prstat, 0, sizeof (prstat));
485 prstat.pr_cursig = cursig;
486 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
487 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
488 &prstat, sizeof (prstat));
494 memset (&prstat, 0, sizeof (prstat));
496 prstat.pr_cursig = cursig;
497 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
498 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
499 &prstat, sizeof (prstat));
506 /* Functions for the x86-64 ELF linker. */
508 /* The name of the dynamic interpreter. This is put in the .interp
511 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
512 #define ELF32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
514 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
515 copying dynamic variables from a shared lib into an app's dynbss
516 section, and instead use a dynamic relocation to point into the
518 #define ELIMINATE_COPY_RELOCS 1
520 /* The size in bytes of an entry in the global offset table. */
522 #define GOT_ENTRY_SIZE 8
524 /* The size in bytes of an entry in the procedure linkage table. */
526 #define PLT_ENTRY_SIZE 16
528 /* The first entry in a procedure linkage table looks like this. See the
529 SVR4 ABI i386 supplement and the x86-64 ABI to see how this works. */
531 static const bfd_byte elf_x86_64_plt0_entry[PLT_ENTRY_SIZE] =
533 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
534 0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */
535 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */
538 /* Subsequent entries in a procedure linkage table look like this. */
540 static const bfd_byte elf_x86_64_plt_entry[PLT_ENTRY_SIZE] =
542 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
543 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
544 0x68, /* pushq immediate */
545 0, 0, 0, 0, /* replaced with index into relocation table. */
546 0xe9, /* jmp relative */
547 0, 0, 0, 0 /* replaced with offset to start of .plt0. */
550 /* .eh_frame covering the .plt section. */
552 static const bfd_byte elf_x86_64_eh_frame_plt[] =
554 #define PLT_CIE_LENGTH 20
555 #define PLT_FDE_LENGTH 36
556 #define PLT_FDE_START_OFFSET 4 + PLT_CIE_LENGTH + 8
557 #define PLT_FDE_LEN_OFFSET 4 + PLT_CIE_LENGTH + 12
558 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
559 0, 0, 0, 0, /* CIE ID */
561 'z', 'R', 0, /* Augmentation string */
562 1, /* Code alignment factor */
563 0x78, /* Data alignment factor */
564 16, /* Return address column */
565 1, /* Augmentation size */
566 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
567 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
568 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
569 DW_CFA_nop, DW_CFA_nop,
571 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
572 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
573 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
574 0, 0, 0, 0, /* .plt size goes here */
575 0, /* Augmentation size */
576 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
577 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
578 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
579 DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
580 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
581 11, /* Block length */
582 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
583 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
584 DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
585 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
586 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
589 /* Architecture-specific backend data for x86-64. */
591 struct elf_x86_64_backend_data
593 /* Templates for the initial PLT entry and for subsequent entries. */
594 const bfd_byte *plt0_entry;
595 const bfd_byte *plt_entry;
596 unsigned int plt_entry_size; /* Size of each PLT entry. */
598 /* Offsets into plt0_entry that are to be replaced with GOT[1] and GOT[2]. */
599 unsigned int plt0_got1_offset;
600 unsigned int plt0_got2_offset;
602 /* Offset of the end of the PC-relative instruction containing
604 unsigned int plt0_got2_insn_end;
606 /* Offsets into plt_entry that are to be replaced with... */
607 unsigned int plt_got_offset; /* ... address of this symbol in .got. */
608 unsigned int plt_reloc_offset; /* ... offset into relocation table. */
609 unsigned int plt_plt_offset; /* ... offset to start of .plt. */
611 /* Length of the PC-relative instruction containing plt_got_offset. */
612 unsigned int plt_got_insn_size;
614 /* Offset of the end of the PC-relative jump to plt0_entry. */
615 unsigned int plt_plt_insn_end;
617 /* Offset into plt_entry where the initial value of the GOT entry points. */
618 unsigned int plt_lazy_offset;
620 /* .eh_frame covering the .plt section. */
621 const bfd_byte *eh_frame_plt;
622 unsigned int eh_frame_plt_size;
625 #define get_elf_x86_64_backend_data(abfd) \
626 ((const struct elf_x86_64_backend_data *) \
627 get_elf_backend_data (abfd)->arch_data)
629 #define GET_PLT_ENTRY_SIZE(abfd) \
630 get_elf_x86_64_backend_data (abfd)->plt_entry_size
632 /* These are the standard parameters. */
633 static const struct elf_x86_64_backend_data elf_x86_64_arch_bed =
635 elf_x86_64_plt0_entry, /* plt0_entry */
636 elf_x86_64_plt_entry, /* plt_entry */
637 sizeof (elf_x86_64_plt_entry), /* plt_entry_size */
638 2, /* plt0_got1_offset */
639 8, /* plt0_got2_offset */
640 12, /* plt0_got2_insn_end */
641 2, /* plt_got_offset */
642 7, /* plt_reloc_offset */
643 12, /* plt_plt_offset */
644 6, /* plt_got_insn_size */
645 PLT_ENTRY_SIZE, /* plt_plt_insn_end */
646 6, /* plt_lazy_offset */
647 elf_x86_64_eh_frame_plt, /* eh_frame_plt */
648 sizeof (elf_x86_64_eh_frame_plt), /* eh_frame_plt_size */
651 #define elf_backend_arch_data &elf_x86_64_arch_bed
653 /* x86-64 ELF linker hash entry. */
655 struct elf_x86_64_link_hash_entry
657 struct elf_link_hash_entry elf;
659 /* Track dynamic relocs copied for this symbol. */
660 struct elf_dyn_relocs *dyn_relocs;
662 #define GOT_UNKNOWN 0
666 #define GOT_TLS_GDESC 4
667 #define GOT_TLS_GD_BOTH_P(type) \
668 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
669 #define GOT_TLS_GD_P(type) \
670 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
671 #define GOT_TLS_GDESC_P(type) \
672 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
673 #define GOT_TLS_GD_ANY_P(type) \
674 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
675 unsigned char tls_type;
677 /* Offset of the GOTPLT entry reserved for the TLS descriptor,
678 starting at the end of the jump table. */
682 #define elf_x86_64_hash_entry(ent) \
683 ((struct elf_x86_64_link_hash_entry *)(ent))
685 struct elf_x86_64_obj_tdata
687 struct elf_obj_tdata root;
689 /* tls_type for each local got entry. */
690 char *local_got_tls_type;
692 /* GOTPLT entries for TLS descriptors. */
693 bfd_vma *local_tlsdesc_gotent;
696 #define elf_x86_64_tdata(abfd) \
697 ((struct elf_x86_64_obj_tdata *) (abfd)->tdata.any)
699 #define elf_x86_64_local_got_tls_type(abfd) \
700 (elf_x86_64_tdata (abfd)->local_got_tls_type)
702 #define elf_x86_64_local_tlsdesc_gotent(abfd) \
703 (elf_x86_64_tdata (abfd)->local_tlsdesc_gotent)
705 #define is_x86_64_elf(bfd) \
706 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
707 && elf_tdata (bfd) != NULL \
708 && elf_object_id (bfd) == X86_64_ELF_DATA)
711 elf_x86_64_mkobject (bfd *abfd)
713 return bfd_elf_allocate_object (abfd, sizeof (struct elf_x86_64_obj_tdata),
717 /* x86-64 ELF linker hash table. */
719 struct elf_x86_64_link_hash_table
721 struct elf_link_hash_table elf;
723 /* Short-cuts to get to dynamic linker sections. */
726 asection *plt_eh_frame;
730 bfd_signed_vma refcount;
734 /* The amount of space used by the jump slots in the GOT. */
735 bfd_vma sgotplt_jump_table_size;
737 /* Small local sym cache. */
738 struct sym_cache sym_cache;
740 bfd_vma (*r_info) (bfd_vma, bfd_vma);
741 bfd_vma (*r_sym) (bfd_vma);
742 unsigned int pointer_r_type;
743 const char *dynamic_interpreter;
744 int dynamic_interpreter_size;
746 /* _TLS_MODULE_BASE_ symbol. */
747 struct bfd_link_hash_entry *tls_module_base;
749 /* Used by local STT_GNU_IFUNC symbols. */
750 htab_t loc_hash_table;
751 void * loc_hash_memory;
753 /* The offset into splt of the PLT entry for the TLS descriptor
754 resolver. Special values are 0, if not necessary (or not found
755 to be necessary yet), and -1 if needed but not determined
758 /* The offset into sgot of the GOT entry used by the PLT entry
762 /* The index of the next R_X86_64_JUMP_SLOT entry in .rela.plt. */
763 bfd_vma next_jump_slot_index;
764 /* The index of the next R_X86_64_IRELATIVE entry in .rela.plt. */
765 bfd_vma next_irelative_index;
768 /* Get the x86-64 ELF linker hash table from a link_info structure. */
770 #define elf_x86_64_hash_table(p) \
771 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
772 == X86_64_ELF_DATA ? ((struct elf_x86_64_link_hash_table *) ((p)->hash)) : NULL)
774 #define elf_x86_64_compute_jump_table_size(htab) \
775 ((htab)->elf.srelplt->reloc_count * GOT_ENTRY_SIZE)
777 /* Create an entry in an x86-64 ELF linker hash table. */
779 static struct bfd_hash_entry *
780 elf_x86_64_link_hash_newfunc (struct bfd_hash_entry *entry,
781 struct bfd_hash_table *table,
784 /* Allocate the structure if it has not already been allocated by a
788 entry = (struct bfd_hash_entry *)
789 bfd_hash_allocate (table,
790 sizeof (struct elf_x86_64_link_hash_entry));
795 /* Call the allocation method of the superclass. */
796 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
799 struct elf_x86_64_link_hash_entry *eh;
801 eh = (struct elf_x86_64_link_hash_entry *) entry;
802 eh->dyn_relocs = NULL;
803 eh->tls_type = GOT_UNKNOWN;
804 eh->tlsdesc_got = (bfd_vma) -1;
810 /* Compute a hash of a local hash entry. We use elf_link_hash_entry
811 for local symbol so that we can handle local STT_GNU_IFUNC symbols
812 as global symbol. We reuse indx and dynstr_index for local symbol
813 hash since they aren't used by global symbols in this backend. */
816 elf_x86_64_local_htab_hash (const void *ptr)
818 struct elf_link_hash_entry *h
819 = (struct elf_link_hash_entry *) ptr;
820 return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
823 /* Compare local hash entries. */
826 elf_x86_64_local_htab_eq (const void *ptr1, const void *ptr2)
828 struct elf_link_hash_entry *h1
829 = (struct elf_link_hash_entry *) ptr1;
830 struct elf_link_hash_entry *h2
831 = (struct elf_link_hash_entry *) ptr2;
833 return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
836 /* Find and/or create a hash entry for local symbol. */
838 static struct elf_link_hash_entry *
839 elf_x86_64_get_local_sym_hash (struct elf_x86_64_link_hash_table *htab,
840 bfd *abfd, const Elf_Internal_Rela *rel,
843 struct elf_x86_64_link_hash_entry e, *ret;
844 asection *sec = abfd->sections;
845 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
846 htab->r_sym (rel->r_info));
849 e.elf.indx = sec->id;
850 e.elf.dynstr_index = htab->r_sym (rel->r_info);
851 slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
852 create ? INSERT : NO_INSERT);
859 ret = (struct elf_x86_64_link_hash_entry *) *slot;
863 ret = (struct elf_x86_64_link_hash_entry *)
864 objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
865 sizeof (struct elf_x86_64_link_hash_entry));
868 memset (ret, 0, sizeof (*ret));
869 ret->elf.indx = sec->id;
870 ret->elf.dynstr_index = htab->r_sym (rel->r_info);
871 ret->elf.dynindx = -1;
877 /* Create an X86-64 ELF linker hash table. */
879 static struct bfd_link_hash_table *
880 elf_x86_64_link_hash_table_create (bfd *abfd)
882 struct elf_x86_64_link_hash_table *ret;
883 bfd_size_type amt = sizeof (struct elf_x86_64_link_hash_table);
885 ret = (struct elf_x86_64_link_hash_table *) bfd_malloc (amt);
889 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
890 elf_x86_64_link_hash_newfunc,
891 sizeof (struct elf_x86_64_link_hash_entry),
900 ret->plt_eh_frame = NULL;
901 ret->sym_cache.abfd = NULL;
902 ret->tlsdesc_plt = 0;
903 ret->tlsdesc_got = 0;
904 ret->tls_ld_got.refcount = 0;
905 ret->sgotplt_jump_table_size = 0;
906 ret->tls_module_base = NULL;
907 ret->next_jump_slot_index = 0;
908 ret->next_irelative_index = 0;
912 ret->r_info = elf64_r_info;
913 ret->r_sym = elf64_r_sym;
914 ret->pointer_r_type = R_X86_64_64;
915 ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
916 ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
920 ret->r_info = elf32_r_info;
921 ret->r_sym = elf32_r_sym;
922 ret->pointer_r_type = R_X86_64_32;
923 ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
924 ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER;
927 ret->loc_hash_table = htab_try_create (1024,
928 elf_x86_64_local_htab_hash,
929 elf_x86_64_local_htab_eq,
931 ret->loc_hash_memory = objalloc_create ();
932 if (!ret->loc_hash_table || !ret->loc_hash_memory)
938 return &ret->elf.root;
941 /* Destroy an X86-64 ELF linker hash table. */
944 elf_x86_64_link_hash_table_free (struct bfd_link_hash_table *hash)
946 struct elf_x86_64_link_hash_table *htab
947 = (struct elf_x86_64_link_hash_table *) hash;
949 if (htab->loc_hash_table)
950 htab_delete (htab->loc_hash_table);
951 if (htab->loc_hash_memory)
952 objalloc_free ((struct objalloc *) htab->loc_hash_memory);
953 _bfd_generic_link_hash_table_free (hash);
956 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
957 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
961 elf_x86_64_create_dynamic_sections (bfd *dynobj,
962 struct bfd_link_info *info)
964 struct elf_x86_64_link_hash_table *htab;
966 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
969 htab = elf_x86_64_hash_table (info);
973 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
975 htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
978 || (!info->shared && !htab->srelbss))
981 if (!info->no_ld_generated_unwind_info
982 && bfd_get_section_by_name (dynobj, ".eh_frame") == NULL
983 && htab->elf.splt != NULL)
985 const struct elf_x86_64_backend_data *const abed
986 = get_elf_x86_64_backend_data (dynobj);
987 flagword flags = get_elf_backend_data (dynobj)->dynamic_sec_flags;
989 = bfd_make_section_with_flags (dynobj, ".eh_frame",
990 flags | SEC_READONLY);
991 if (htab->plt_eh_frame == NULL
992 || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 3))
995 htab->plt_eh_frame->size = abed->eh_frame_plt_size;
996 htab->plt_eh_frame->contents
997 = bfd_alloc (dynobj, htab->plt_eh_frame->size);
998 memcpy (htab->plt_eh_frame->contents,
999 abed->eh_frame_plt, abed->eh_frame_plt_size);
1004 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1007 elf_x86_64_copy_indirect_symbol (struct bfd_link_info *info,
1008 struct elf_link_hash_entry *dir,
1009 struct elf_link_hash_entry *ind)
1011 struct elf_x86_64_link_hash_entry *edir, *eind;
1013 edir = (struct elf_x86_64_link_hash_entry *) dir;
1014 eind = (struct elf_x86_64_link_hash_entry *) ind;
1016 if (eind->dyn_relocs != NULL)
1018 if (edir->dyn_relocs != NULL)
1020 struct elf_dyn_relocs **pp;
1021 struct elf_dyn_relocs *p;
1023 /* Add reloc counts against the indirect sym to the direct sym
1024 list. Merge any entries against the same section. */
1025 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1027 struct elf_dyn_relocs *q;
1029 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1030 if (q->sec == p->sec)
1032 q->pc_count += p->pc_count;
1033 q->count += p->count;
1040 *pp = edir->dyn_relocs;
1043 edir->dyn_relocs = eind->dyn_relocs;
1044 eind->dyn_relocs = NULL;
1047 if (ind->root.type == bfd_link_hash_indirect
1048 && dir->got.refcount <= 0)
1050 edir->tls_type = eind->tls_type;
1051 eind->tls_type = GOT_UNKNOWN;
1054 if (ELIMINATE_COPY_RELOCS
1055 && ind->root.type != bfd_link_hash_indirect
1056 && dir->dynamic_adjusted)
1058 /* If called to transfer flags for a weakdef during processing
1059 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1060 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1061 dir->ref_dynamic |= ind->ref_dynamic;
1062 dir->ref_regular |= ind->ref_regular;
1063 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1064 dir->needs_plt |= ind->needs_plt;
1065 dir->pointer_equality_needed |= ind->pointer_equality_needed;
1068 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1072 elf64_x86_64_elf_object_p (bfd *abfd)
1074 /* Set the right machine number for an x86-64 elf64 file. */
1075 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
1080 elf32_x86_64_elf_object_p (bfd *abfd)
1082 /* Set the right machine number for an x86-64 elf32 file. */
1083 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32);
1087 /* Return TRUE if the TLS access code sequence support transition
1091 elf_x86_64_check_tls_transition (bfd *abfd,
1092 struct bfd_link_info *info,
1095 Elf_Internal_Shdr *symtab_hdr,
1096 struct elf_link_hash_entry **sym_hashes,
1097 unsigned int r_type,
1098 const Elf_Internal_Rela *rel,
1099 const Elf_Internal_Rela *relend)
1102 unsigned long r_symndx;
1103 struct elf_link_hash_entry *h;
1105 struct elf_x86_64_link_hash_table *htab;
1107 /* Get the section contents. */
1108 if (contents == NULL)
1110 if (elf_section_data (sec)->this_hdr.contents != NULL)
1111 contents = elf_section_data (sec)->this_hdr.contents;
1114 /* FIXME: How to better handle error condition? */
1115 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1118 /* Cache the section contents for elf_link_input_bfd. */
1119 elf_section_data (sec)->this_hdr.contents = contents;
1123 htab = elf_x86_64_hash_table (info);
1124 offset = rel->r_offset;
1127 case R_X86_64_TLSGD:
1128 case R_X86_64_TLSLD:
1129 if ((rel + 1) >= relend)
1132 if (r_type == R_X86_64_TLSGD)
1134 /* Check transition from GD access model. For 64bit, only
1135 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
1136 .word 0x6666; rex64; call __tls_get_addr
1137 can transit to different access model. For 32bit, only
1138 leaq foo@tlsgd(%rip), %rdi
1139 .word 0x6666; rex64; call __tls_get_addr
1140 can transit to different access model. */
1142 static const unsigned char call[] = { 0x66, 0x66, 0x48, 0xe8 };
1143 static const unsigned char leaq[] = { 0x66, 0x48, 0x8d, 0x3d };
1145 if ((offset + 12) > sec->size
1146 || memcmp (contents + offset + 4, call, 4) != 0)
1149 if (ABI_64_P (abfd))
1152 || memcmp (contents + offset - 4, leaq, 4) != 0)
1158 || memcmp (contents + offset - 3, leaq + 1, 3) != 0)
1164 /* Check transition from LD access model. Only
1165 leaq foo@tlsld(%rip), %rdi;
1167 can transit to different access model. */
1169 static const unsigned char lea[] = { 0x48, 0x8d, 0x3d };
1171 if (offset < 3 || (offset + 9) > sec->size)
1174 if (memcmp (contents + offset - 3, lea, 3) != 0
1175 || 0xe8 != *(contents + offset + 4))
1179 r_symndx = htab->r_sym (rel[1].r_info);
1180 if (r_symndx < symtab_hdr->sh_info)
1183 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1184 /* Use strncmp to check __tls_get_addr since __tls_get_addr
1185 may be versioned. */
1187 && h->root.root.string != NULL
1188 && (ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PC32
1189 || ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLT32)
1190 && (strncmp (h->root.root.string,
1191 "__tls_get_addr", 14) == 0));
1193 case R_X86_64_GOTTPOFF:
1194 /* Check transition from IE access model:
1195 mov foo@gottpoff(%rip), %reg
1196 add foo@gottpoff(%rip), %reg
1199 /* Check REX prefix first. */
1200 if (offset >= 3 && (offset + 4) <= sec->size)
1202 val = bfd_get_8 (abfd, contents + offset - 3);
1203 if (val != 0x48 && val != 0x4c)
1205 /* X32 may have 0x44 REX prefix or no REX prefix. */
1206 if (ABI_64_P (abfd))
1212 /* X32 may not have any REX prefix. */
1213 if (ABI_64_P (abfd))
1215 if (offset < 2 || (offset + 3) > sec->size)
1219 val = bfd_get_8 (abfd, contents + offset - 2);
1220 if (val != 0x8b && val != 0x03)
1223 val = bfd_get_8 (abfd, contents + offset - 1);
1224 return (val & 0xc7) == 5;
1226 case R_X86_64_GOTPC32_TLSDESC:
1227 /* Check transition from GDesc access model:
1228 leaq x@tlsdesc(%rip), %rax
1230 Make sure it's a leaq adding rip to a 32-bit offset
1231 into any register, although it's probably almost always
1234 if (offset < 3 || (offset + 4) > sec->size)
1237 val = bfd_get_8 (abfd, contents + offset - 3);
1238 if ((val & 0xfb) != 0x48)
1241 if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1244 val = bfd_get_8 (abfd, contents + offset - 1);
1245 return (val & 0xc7) == 0x05;
1247 case R_X86_64_TLSDESC_CALL:
1248 /* Check transition from GDesc access model:
1249 call *x@tlsdesc(%rax)
1251 if (offset + 2 <= sec->size)
1253 /* Make sure that it's a call *x@tlsdesc(%rax). */
1254 static const unsigned char call[] = { 0xff, 0x10 };
1255 return memcmp (contents + offset, call, 2) == 0;
1265 /* Return TRUE if the TLS access transition is OK or no transition
1266 will be performed. Update R_TYPE if there is a transition. */
1269 elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
1270 asection *sec, bfd_byte *contents,
1271 Elf_Internal_Shdr *symtab_hdr,
1272 struct elf_link_hash_entry **sym_hashes,
1273 unsigned int *r_type, int tls_type,
1274 const Elf_Internal_Rela *rel,
1275 const Elf_Internal_Rela *relend,
1276 struct elf_link_hash_entry *h,
1277 unsigned long r_symndx)
1279 unsigned int from_type = *r_type;
1280 unsigned int to_type = from_type;
1281 bfd_boolean check = TRUE;
1283 /* Skip TLS transition for functions. */
1285 && (h->type == STT_FUNC
1286 || h->type == STT_GNU_IFUNC))
1291 case R_X86_64_TLSGD:
1292 case R_X86_64_GOTPC32_TLSDESC:
1293 case R_X86_64_TLSDESC_CALL:
1294 case R_X86_64_GOTTPOFF:
1295 if (info->executable)
1298 to_type = R_X86_64_TPOFF32;
1300 to_type = R_X86_64_GOTTPOFF;
1303 /* When we are called from elf_x86_64_relocate_section,
1304 CONTENTS isn't NULL and there may be additional transitions
1305 based on TLS_TYPE. */
1306 if (contents != NULL)
1308 unsigned int new_to_type = to_type;
1310 if (info->executable
1313 && tls_type == GOT_TLS_IE)
1314 new_to_type = R_X86_64_TPOFF32;
1316 if (to_type == R_X86_64_TLSGD
1317 || to_type == R_X86_64_GOTPC32_TLSDESC
1318 || to_type == R_X86_64_TLSDESC_CALL)
1320 if (tls_type == GOT_TLS_IE)
1321 new_to_type = R_X86_64_GOTTPOFF;
1324 /* We checked the transition before when we were called from
1325 elf_x86_64_check_relocs. We only want to check the new
1326 transition which hasn't been checked before. */
1327 check = new_to_type != to_type && from_type == to_type;
1328 to_type = new_to_type;
1333 case R_X86_64_TLSLD:
1334 if (info->executable)
1335 to_type = R_X86_64_TPOFF32;
1342 /* Return TRUE if there is no transition. */
1343 if (from_type == to_type)
1346 /* Check if the transition can be performed. */
1348 && ! elf_x86_64_check_tls_transition (abfd, info, sec, contents,
1349 symtab_hdr, sym_hashes,
1350 from_type, rel, relend))
1352 reloc_howto_type *from, *to;
1355 from = elf_x86_64_rtype_to_howto (abfd, from_type);
1356 to = elf_x86_64_rtype_to_howto (abfd, to_type);
1359 name = h->root.root.string;
1362 struct elf_x86_64_link_hash_table *htab;
1364 htab = elf_x86_64_hash_table (info);
1369 Elf_Internal_Sym *isym;
1371 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1373 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1377 (*_bfd_error_handler)
1378 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1379 "in section `%A' failed"),
1380 abfd, sec, from->name, to->name, name,
1381 (unsigned long) rel->r_offset);
1382 bfd_set_error (bfd_error_bad_value);
1390 /* Look through the relocs for a section during the first phase, and
1391 calculate needed space in the global offset table, procedure
1392 linkage table, and dynamic reloc sections. */
1395 elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
1397 const Elf_Internal_Rela *relocs)
1399 struct elf_x86_64_link_hash_table *htab;
1400 Elf_Internal_Shdr *symtab_hdr;
1401 struct elf_link_hash_entry **sym_hashes;
1402 const Elf_Internal_Rela *rel;
1403 const Elf_Internal_Rela *rel_end;
1406 if (info->relocatable)
1409 BFD_ASSERT (is_x86_64_elf (abfd));
1411 htab = elf_x86_64_hash_table (info);
1415 symtab_hdr = &elf_symtab_hdr (abfd);
1416 sym_hashes = elf_sym_hashes (abfd);
1420 rel_end = relocs + sec->reloc_count;
1421 for (rel = relocs; rel < rel_end; rel++)
1423 unsigned int r_type;
1424 unsigned long r_symndx;
1425 struct elf_link_hash_entry *h;
1426 Elf_Internal_Sym *isym;
1429 r_symndx = htab->r_sym (rel->r_info);
1430 r_type = ELF32_R_TYPE (rel->r_info);
1432 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1434 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1439 if (r_symndx < symtab_hdr->sh_info)
1441 /* A local symbol. */
1442 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1447 /* Check relocation against local STT_GNU_IFUNC symbol. */
1448 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1450 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel,
1455 /* Fake a STT_GNU_IFUNC symbol. */
1456 h->type = STT_GNU_IFUNC;
1459 h->forced_local = 1;
1460 h->root.type = bfd_link_hash_defined;
1468 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1469 while (h->root.type == bfd_link_hash_indirect
1470 || h->root.type == bfd_link_hash_warning)
1471 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1474 /* Check invalid x32 relocations. */
1475 if (!ABI_64_P (abfd))
1481 case R_X86_64_DTPOFF64:
1482 case R_X86_64_TPOFF64:
1484 case R_X86_64_GOTOFF64:
1485 case R_X86_64_GOT64:
1486 case R_X86_64_GOTPCREL64:
1487 case R_X86_64_GOTPC64:
1488 case R_X86_64_GOTPLT64:
1489 case R_X86_64_PLTOFF64:
1492 name = h->root.root.string;
1494 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1496 (*_bfd_error_handler)
1497 (_("%B: relocation %s against symbol `%s' isn't "
1498 "supported in x32 mode"), abfd,
1499 x86_64_elf_howto_table[r_type].name, name);
1500 bfd_set_error (bfd_error_bad_value);
1508 /* Create the ifunc sections for static executables. If we
1509 never see an indirect function symbol nor we are building
1510 a static executable, those sections will be empty and
1511 won't appear in output. */
1522 case R_X86_64_PLT32:
1523 case R_X86_64_GOTPCREL:
1524 case R_X86_64_GOTPCREL64:
1525 if (htab->elf.dynobj == NULL)
1526 htab->elf.dynobj = abfd;
1527 if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info))
1532 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
1533 it here if it is defined in a non-shared object. */
1534 if (h->type == STT_GNU_IFUNC
1537 /* It is referenced by a non-shared object. */
1541 /* STT_GNU_IFUNC symbol must go through PLT. */
1542 h->plt.refcount += 1;
1544 /* STT_GNU_IFUNC needs dynamic sections. */
1545 if (htab->elf.dynobj == NULL)
1546 htab->elf.dynobj = abfd;
1551 if (h->root.root.string)
1552 name = h->root.root.string;
1554 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1556 (*_bfd_error_handler)
1557 (_("%B: relocation %s against STT_GNU_IFUNC "
1558 "symbol `%s' isn't handled by %s"), abfd,
1559 x86_64_elf_howto_table[r_type].name,
1560 name, __FUNCTION__);
1561 bfd_set_error (bfd_error_bad_value);
1565 if (ABI_64_P (abfd))
1569 h->pointer_equality_needed = 1;
1572 /* We must copy these reloc types into the output
1573 file. Create a reloc section in dynobj and
1574 make room for this reloc. */
1575 sreloc = _bfd_elf_create_ifunc_dyn_reloc
1576 (abfd, info, sec, sreloc,
1577 &((struct elf_x86_64_link_hash_entry *) h)->dyn_relocs);
1588 if (r_type != R_X86_64_PC32
1589 && r_type != R_X86_64_PC64)
1590 h->pointer_equality_needed = 1;
1593 case R_X86_64_PLT32:
1596 case R_X86_64_GOTPCREL:
1597 case R_X86_64_GOTPCREL64:
1598 h->got.refcount += 1;
1599 if (htab->elf.sgot == NULL
1600 && !_bfd_elf_create_got_section (htab->elf.dynobj,
1610 if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
1611 symtab_hdr, sym_hashes,
1612 &r_type, GOT_UNKNOWN,
1613 rel, rel_end, h, r_symndx))
1618 case R_X86_64_TLSLD:
1619 htab->tls_ld_got.refcount += 1;
1622 case R_X86_64_TPOFF32:
1623 if (!info->executable && ABI_64_P (abfd))
1626 name = h->root.root.string;
1628 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1630 (*_bfd_error_handler)
1631 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1633 x86_64_elf_howto_table[r_type].name, name);
1634 bfd_set_error (bfd_error_bad_value);
1639 case R_X86_64_GOTTPOFF:
1640 if (!info->executable)
1641 info->flags |= DF_STATIC_TLS;
1644 case R_X86_64_GOT32:
1645 case R_X86_64_GOTPCREL:
1646 case R_X86_64_TLSGD:
1647 case R_X86_64_GOT64:
1648 case R_X86_64_GOTPCREL64:
1649 case R_X86_64_GOTPLT64:
1650 case R_X86_64_GOTPC32_TLSDESC:
1651 case R_X86_64_TLSDESC_CALL:
1652 /* This symbol requires a global offset table entry. */
1654 int tls_type, old_tls_type;
1658 default: tls_type = GOT_NORMAL; break;
1659 case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break;
1660 case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break;
1661 case R_X86_64_GOTPC32_TLSDESC:
1662 case R_X86_64_TLSDESC_CALL:
1663 tls_type = GOT_TLS_GDESC; break;
1668 if (r_type == R_X86_64_GOTPLT64)
1670 /* This relocation indicates that we also need
1671 a PLT entry, as this is a function. We don't need
1672 a PLT entry for local symbols. */
1674 h->plt.refcount += 1;
1676 h->got.refcount += 1;
1677 old_tls_type = elf_x86_64_hash_entry (h)->tls_type;
1681 bfd_signed_vma *local_got_refcounts;
1683 /* This is a global offset table entry for a local symbol. */
1684 local_got_refcounts = elf_local_got_refcounts (abfd);
1685 if (local_got_refcounts == NULL)
1689 size = symtab_hdr->sh_info;
1690 size *= sizeof (bfd_signed_vma)
1691 + sizeof (bfd_vma) + sizeof (char);
1692 local_got_refcounts = ((bfd_signed_vma *)
1693 bfd_zalloc (abfd, size));
1694 if (local_got_refcounts == NULL)
1696 elf_local_got_refcounts (abfd) = local_got_refcounts;
1697 elf_x86_64_local_tlsdesc_gotent (abfd)
1698 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
1699 elf_x86_64_local_got_tls_type (abfd)
1700 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
1702 local_got_refcounts[r_symndx] += 1;
1704 = elf_x86_64_local_got_tls_type (abfd) [r_symndx];
1707 /* If a TLS symbol is accessed using IE at least once,
1708 there is no point to use dynamic model for it. */
1709 if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1710 && (! GOT_TLS_GD_ANY_P (old_tls_type)
1711 || tls_type != GOT_TLS_IE))
1713 if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type))
1714 tls_type = old_tls_type;
1715 else if (GOT_TLS_GD_ANY_P (old_tls_type)
1716 && GOT_TLS_GD_ANY_P (tls_type))
1717 tls_type |= old_tls_type;
1721 name = h->root.root.string;
1723 name = bfd_elf_sym_name (abfd, symtab_hdr,
1725 (*_bfd_error_handler)
1726 (_("%B: '%s' accessed both as normal and thread local symbol"),
1732 if (old_tls_type != tls_type)
1735 elf_x86_64_hash_entry (h)->tls_type = tls_type;
1737 elf_x86_64_local_got_tls_type (abfd) [r_symndx] = tls_type;
1742 case R_X86_64_GOTOFF64:
1743 case R_X86_64_GOTPC32:
1744 case R_X86_64_GOTPC64:
1746 if (htab->elf.sgot == NULL)
1748 if (htab->elf.dynobj == NULL)
1749 htab->elf.dynobj = abfd;
1750 if (!_bfd_elf_create_got_section (htab->elf.dynobj,
1756 case R_X86_64_PLT32:
1757 /* This symbol requires a procedure linkage table entry. We
1758 actually build the entry in adjust_dynamic_symbol,
1759 because this might be a case of linking PIC code which is
1760 never referenced by a dynamic object, in which case we
1761 don't need to generate a procedure linkage table entry
1764 /* If this is a local symbol, we resolve it directly without
1765 creating a procedure linkage table entry. */
1770 h->plt.refcount += 1;
1773 case R_X86_64_PLTOFF64:
1774 /* This tries to form the 'address' of a function relative
1775 to GOT. For global symbols we need a PLT entry. */
1779 h->plt.refcount += 1;
1784 if (!ABI_64_P (abfd))
1789 /* Let's help debug shared library creation. These relocs
1790 cannot be used in shared libs. Don't error out for
1791 sections we don't care about, such as debug sections or
1792 non-constant sections. */
1794 && (sec->flags & SEC_ALLOC) != 0
1795 && (sec->flags & SEC_READONLY) != 0)
1798 name = h->root.root.string;
1800 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1801 (*_bfd_error_handler)
1802 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1803 abfd, x86_64_elf_howto_table[r_type].name, name);
1804 bfd_set_error (bfd_error_bad_value);
1815 if (h != NULL && info->executable)
1817 /* If this reloc is in a read-only section, we might
1818 need a copy reloc. We can't check reliably at this
1819 stage whether the section is read-only, as input
1820 sections have not yet been mapped to output sections.
1821 Tentatively set the flag for now, and correct in
1822 adjust_dynamic_symbol. */
1825 /* We may need a .plt entry if the function this reloc
1826 refers to is in a shared lib. */
1827 h->plt.refcount += 1;
1828 if (r_type != R_X86_64_PC32 && r_type != R_X86_64_PC64)
1829 h->pointer_equality_needed = 1;
1832 /* If we are creating a shared library, and this is a reloc
1833 against a global symbol, or a non PC relative reloc
1834 against a local symbol, then we need to copy the reloc
1835 into the shared library. However, if we are linking with
1836 -Bsymbolic, we do not need to copy a reloc against a
1837 global symbol which is defined in an object we are
1838 including in the link (i.e., DEF_REGULAR is set). At
1839 this point we have not seen all the input files, so it is
1840 possible that DEF_REGULAR is not set now but will be set
1841 later (it is never cleared). In case of a weak definition,
1842 DEF_REGULAR may be cleared later by a strong definition in
1843 a shared library. We account for that possibility below by
1844 storing information in the relocs_copied field of the hash
1845 table entry. A similar situation occurs when creating
1846 shared libraries and symbol visibility changes render the
1849 If on the other hand, we are creating an executable, we
1850 may need to keep relocations for symbols satisfied by a
1851 dynamic library if we manage to avoid copy relocs for the
1854 && (sec->flags & SEC_ALLOC) != 0
1855 && (! IS_X86_64_PCREL_TYPE (r_type)
1857 && (! SYMBOLIC_BIND (info, h)
1858 || h->root.type == bfd_link_hash_defweak
1859 || !h->def_regular))))
1860 || (ELIMINATE_COPY_RELOCS
1862 && (sec->flags & SEC_ALLOC) != 0
1864 && (h->root.type == bfd_link_hash_defweak
1865 || !h->def_regular)))
1867 struct elf_dyn_relocs *p;
1868 struct elf_dyn_relocs **head;
1870 /* We must copy these reloc types into the output file.
1871 Create a reloc section in dynobj and make room for
1875 if (htab->elf.dynobj == NULL)
1876 htab->elf.dynobj = abfd;
1878 sreloc = _bfd_elf_make_dynamic_reloc_section
1879 (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2,
1880 abfd, /*rela?*/ TRUE);
1886 /* If this is a global symbol, we count the number of
1887 relocations we need for this symbol. */
1890 head = &((struct elf_x86_64_link_hash_entry *) h)->dyn_relocs;
1894 /* Track dynamic relocs needed for local syms too.
1895 We really need local syms available to do this
1900 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1905 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1909 /* Beware of type punned pointers vs strict aliasing
1911 vpp = &(elf_section_data (s)->local_dynrel);
1912 head = (struct elf_dyn_relocs **)vpp;
1916 if (p == NULL || p->sec != sec)
1918 bfd_size_type amt = sizeof *p;
1920 p = ((struct elf_dyn_relocs *)
1921 bfd_alloc (htab->elf.dynobj, amt));
1932 if (IS_X86_64_PCREL_TYPE (r_type))
1937 /* This relocation describes the C++ object vtable hierarchy.
1938 Reconstruct it for later use during GC. */
1939 case R_X86_64_GNU_VTINHERIT:
1940 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1944 /* This relocation describes which C++ vtable entries are actually
1945 used. Record for later use during GC. */
1946 case R_X86_64_GNU_VTENTRY:
1947 BFD_ASSERT (h != NULL);
1949 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1961 /* Return the section that should be marked against GC for a given
1965 elf_x86_64_gc_mark_hook (asection *sec,
1966 struct bfd_link_info *info,
1967 Elf_Internal_Rela *rel,
1968 struct elf_link_hash_entry *h,
1969 Elf_Internal_Sym *sym)
1972 switch (ELF32_R_TYPE (rel->r_info))
1974 case R_X86_64_GNU_VTINHERIT:
1975 case R_X86_64_GNU_VTENTRY:
1979 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1982 /* Update the got entry reference counts for the section being removed. */
1985 elf_x86_64_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
1987 const Elf_Internal_Rela *relocs)
1989 struct elf_x86_64_link_hash_table *htab;
1990 Elf_Internal_Shdr *symtab_hdr;
1991 struct elf_link_hash_entry **sym_hashes;
1992 bfd_signed_vma *local_got_refcounts;
1993 const Elf_Internal_Rela *rel, *relend;
1995 if (info->relocatable)
1998 htab = elf_x86_64_hash_table (info);
2002 elf_section_data (sec)->local_dynrel = NULL;
2004 symtab_hdr = &elf_symtab_hdr (abfd);
2005 sym_hashes = elf_sym_hashes (abfd);
2006 local_got_refcounts = elf_local_got_refcounts (abfd);
2008 htab = elf_x86_64_hash_table (info);
2009 relend = relocs + sec->reloc_count;
2010 for (rel = relocs; rel < relend; rel++)
2012 unsigned long r_symndx;
2013 unsigned int r_type;
2014 struct elf_link_hash_entry *h = NULL;
2016 r_symndx = htab->r_sym (rel->r_info);
2017 if (r_symndx >= symtab_hdr->sh_info)
2019 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2020 while (h->root.type == bfd_link_hash_indirect
2021 || h->root.type == bfd_link_hash_warning)
2022 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2026 /* A local symbol. */
2027 Elf_Internal_Sym *isym;
2029 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2032 /* Check relocation against local STT_GNU_IFUNC symbol. */
2034 && ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2036 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel, FALSE);
2044 struct elf_x86_64_link_hash_entry *eh;
2045 struct elf_dyn_relocs **pp;
2046 struct elf_dyn_relocs *p;
2048 eh = (struct elf_x86_64_link_hash_entry *) h;
2050 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2053 /* Everything must go for SEC. */
2059 r_type = ELF32_R_TYPE (rel->r_info);
2060 if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
2061 symtab_hdr, sym_hashes,
2062 &r_type, GOT_UNKNOWN,
2063 rel, relend, h, r_symndx))
2068 case R_X86_64_TLSLD:
2069 if (htab->tls_ld_got.refcount > 0)
2070 htab->tls_ld_got.refcount -= 1;
2073 case R_X86_64_TLSGD:
2074 case R_X86_64_GOTPC32_TLSDESC:
2075 case R_X86_64_TLSDESC_CALL:
2076 case R_X86_64_GOTTPOFF:
2077 case R_X86_64_GOT32:
2078 case R_X86_64_GOTPCREL:
2079 case R_X86_64_GOT64:
2080 case R_X86_64_GOTPCREL64:
2081 case R_X86_64_GOTPLT64:
2084 if (r_type == R_X86_64_GOTPLT64 && h->plt.refcount > 0)
2085 h->plt.refcount -= 1;
2086 if (h->got.refcount > 0)
2087 h->got.refcount -= 1;
2088 if (h->type == STT_GNU_IFUNC)
2090 if (h->plt.refcount > 0)
2091 h->plt.refcount -= 1;
2094 else if (local_got_refcounts != NULL)
2096 if (local_got_refcounts[r_symndx] > 0)
2097 local_got_refcounts[r_symndx] -= 1;
2111 && (h == NULL || h->type != STT_GNU_IFUNC))
2115 case R_X86_64_PLT32:
2116 case R_X86_64_PLTOFF64:
2119 if (h->plt.refcount > 0)
2120 h->plt.refcount -= 1;
2132 /* Adjust a symbol defined by a dynamic object and referenced by a
2133 regular object. The current definition is in some section of the
2134 dynamic object, but we're not including those sections. We have to
2135 change the definition to something the rest of the link can
2139 elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
2140 struct elf_link_hash_entry *h)
2142 struct elf_x86_64_link_hash_table *htab;
2145 /* STT_GNU_IFUNC symbol must go through PLT. */
2146 if (h->type == STT_GNU_IFUNC)
2148 if (h->plt.refcount <= 0)
2150 h->plt.offset = (bfd_vma) -1;
2156 /* If this is a function, put it in the procedure linkage table. We
2157 will fill in the contents of the procedure linkage table later,
2158 when we know the address of the .got section. */
2159 if (h->type == STT_FUNC
2162 if (h->plt.refcount <= 0
2163 || SYMBOL_CALLS_LOCAL (info, h)
2164 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2165 && h->root.type == bfd_link_hash_undefweak))
2167 /* This case can occur if we saw a PLT32 reloc in an input
2168 file, but the symbol was never referred to by a dynamic
2169 object, or if all references were garbage collected. In
2170 such a case, we don't actually need to build a procedure
2171 linkage table, and we can just do a PC32 reloc instead. */
2172 h->plt.offset = (bfd_vma) -1;
2179 /* It's possible that we incorrectly decided a .plt reloc was
2180 needed for an R_X86_64_PC32 reloc to a non-function sym in
2181 check_relocs. We can't decide accurately between function and
2182 non-function syms in check-relocs; Objects loaded later in
2183 the link may change h->type. So fix it now. */
2184 h->plt.offset = (bfd_vma) -1;
2186 /* If this is a weak symbol, and there is a real definition, the
2187 processor independent code will have arranged for us to see the
2188 real definition first, and we can just use the same value. */
2189 if (h->u.weakdef != NULL)
2191 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2192 || h->u.weakdef->root.type == bfd_link_hash_defweak);
2193 h->root.u.def.section = h->u.weakdef->root.u.def.section;
2194 h->root.u.def.value = h->u.weakdef->root.u.def.value;
2195 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2196 h->non_got_ref = h->u.weakdef->non_got_ref;
2200 /* This is a reference to a symbol defined by a dynamic object which
2201 is not a function. */
2203 /* If we are creating a shared library, we must presume that the
2204 only references to the symbol are via the global offset table.
2205 For such cases we need not do anything here; the relocations will
2206 be handled correctly by relocate_section. */
2210 /* If there are no references to this symbol that do not use the
2211 GOT, we don't need to generate a copy reloc. */
2212 if (!h->non_got_ref)
2215 /* If -z nocopyreloc was given, we won't generate them either. */
2216 if (info->nocopyreloc)
2222 if (ELIMINATE_COPY_RELOCS)
2224 struct elf_x86_64_link_hash_entry * eh;
2225 struct elf_dyn_relocs *p;
2227 eh = (struct elf_x86_64_link_hash_entry *) h;
2228 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2230 s = p->sec->output_section;
2231 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2235 /* If we didn't find any dynamic relocs in read-only sections, then
2236 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
2244 /* We must allocate the symbol in our .dynbss section, which will
2245 become part of the .bss section of the executable. There will be
2246 an entry for this symbol in the .dynsym section. The dynamic
2247 object will contain position independent code, so all references
2248 from the dynamic object to this symbol will go through the global
2249 offset table. The dynamic linker will use the .dynsym entry to
2250 determine the address it must put in the global offset table, so
2251 both the dynamic object and the regular object will refer to the
2252 same memory location for the variable. */
2254 htab = elf_x86_64_hash_table (info);
2258 /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
2259 to copy the initial value out of the dynamic object and into the
2260 runtime process image. */
2261 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2263 const struct elf_backend_data *bed;
2264 bed = get_elf_backend_data (info->output_bfd);
2265 htab->srelbss->size += bed->s->sizeof_rela;
2271 return _bfd_elf_adjust_dynamic_copy (h, s);
2274 /* Allocate space in .plt, .got and associated reloc sections for
2278 elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2280 struct bfd_link_info *info;
2281 struct elf_x86_64_link_hash_table *htab;
2282 struct elf_x86_64_link_hash_entry *eh;
2283 struct elf_dyn_relocs *p;
2284 const struct elf_backend_data *bed;
2285 unsigned int plt_entry_size;
2287 if (h->root.type == bfd_link_hash_indirect)
2290 eh = (struct elf_x86_64_link_hash_entry *) h;
2292 info = (struct bfd_link_info *) inf;
2293 htab = elf_x86_64_hash_table (info);
2296 bed = get_elf_backend_data (info->output_bfd);
2297 plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2299 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2300 here if it is defined and referenced in a non-shared object. */
2301 if (h->type == STT_GNU_IFUNC
2303 return _bfd_elf_allocate_ifunc_dyn_relocs (info, h,
2307 else if (htab->elf.dynamic_sections_created
2308 && h->plt.refcount > 0)
2310 /* Make sure this symbol is output as a dynamic symbol.
2311 Undefined weak syms won't yet be marked as dynamic. */
2312 if (h->dynindx == -1
2313 && !h->forced_local)
2315 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2320 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2322 asection *s = htab->elf.splt;
2324 /* If this is the first .plt entry, make room for the special
2327 s->size += plt_entry_size;
2329 h->plt.offset = s->size;
2331 /* If this symbol is not defined in a regular file, and we are
2332 not generating a shared library, then set the symbol to this
2333 location in the .plt. This is required to make function
2334 pointers compare as equal between the normal executable and
2335 the shared library. */
2339 h->root.u.def.section = s;
2340 h->root.u.def.value = h->plt.offset;
2343 /* Make room for this entry. */
2344 s->size += plt_entry_size;
2346 /* We also need to make an entry in the .got.plt section, which
2347 will be placed in the .got section by the linker script. */
2348 htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
2350 /* We also need to make an entry in the .rela.plt section. */
2351 htab->elf.srelplt->size += bed->s->sizeof_rela;
2352 htab->elf.srelplt->reloc_count++;
2356 h->plt.offset = (bfd_vma) -1;
2362 h->plt.offset = (bfd_vma) -1;
2366 eh->tlsdesc_got = (bfd_vma) -1;
2368 /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
2369 make it a R_X86_64_TPOFF32 requiring no GOT entry. */
2370 if (h->got.refcount > 0
2373 && elf_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE)
2375 h->got.offset = (bfd_vma) -1;
2377 else if (h->got.refcount > 0)
2381 int tls_type = elf_x86_64_hash_entry (h)->tls_type;
2383 /* Make sure this symbol is output as a dynamic symbol.
2384 Undefined weak syms won't yet be marked as dynamic. */
2385 if (h->dynindx == -1
2386 && !h->forced_local)
2388 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2392 if (GOT_TLS_GDESC_P (tls_type))
2394 eh->tlsdesc_got = htab->elf.sgotplt->size
2395 - elf_x86_64_compute_jump_table_size (htab);
2396 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
2397 h->got.offset = (bfd_vma) -2;
2399 if (! GOT_TLS_GDESC_P (tls_type)
2400 || GOT_TLS_GD_P (tls_type))
2403 h->got.offset = s->size;
2404 s->size += GOT_ENTRY_SIZE;
2405 if (GOT_TLS_GD_P (tls_type))
2406 s->size += GOT_ENTRY_SIZE;
2408 dyn = htab->elf.dynamic_sections_created;
2409 /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
2411 R_X86_64_GOTTPOFF needs one dynamic relocation. */
2412 if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2413 || tls_type == GOT_TLS_IE)
2414 htab->elf.srelgot->size += bed->s->sizeof_rela;
2415 else if (GOT_TLS_GD_P (tls_type))
2416 htab->elf.srelgot->size += 2 * bed->s->sizeof_rela;
2417 else if (! GOT_TLS_GDESC_P (tls_type)
2418 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2419 || h->root.type != bfd_link_hash_undefweak)
2421 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2422 htab->elf.srelgot->size += bed->s->sizeof_rela;
2423 if (GOT_TLS_GDESC_P (tls_type))
2425 htab->elf.srelplt->size += bed->s->sizeof_rela;
2426 htab->tlsdesc_plt = (bfd_vma) -1;
2430 h->got.offset = (bfd_vma) -1;
2432 if (eh->dyn_relocs == NULL)
2435 /* In the shared -Bsymbolic case, discard space allocated for
2436 dynamic pc-relative relocs against symbols which turn out to be
2437 defined in regular objects. For the normal shared case, discard
2438 space for pc-relative relocs that have become local due to symbol
2439 visibility changes. */
2443 /* Relocs that use pc_count are those that appear on a call
2444 insn, or certain REL relocs that can generated via assembly.
2445 We want calls to protected symbols to resolve directly to the
2446 function rather than going via the plt. If people want
2447 function pointer comparisons to work as expected then they
2448 should avoid writing weird assembly. */
2449 if (SYMBOL_CALLS_LOCAL (info, h))
2451 struct elf_dyn_relocs **pp;
2453 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2455 p->count -= p->pc_count;
2464 /* Also discard relocs on undefined weak syms with non-default
2466 if (eh->dyn_relocs != NULL
2467 && h->root.type == bfd_link_hash_undefweak)
2469 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2470 eh->dyn_relocs = NULL;
2472 /* Make sure undefined weak symbols are output as a dynamic
2474 else if (h->dynindx == -1
2475 && ! h->forced_local
2476 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2481 else if (ELIMINATE_COPY_RELOCS)
2483 /* For the non-shared case, discard space for relocs against
2484 symbols which turn out to need copy relocs or are not
2490 || (htab->elf.dynamic_sections_created
2491 && (h->root.type == bfd_link_hash_undefweak
2492 || h->root.type == bfd_link_hash_undefined))))
2494 /* Make sure this symbol is output as a dynamic symbol.
2495 Undefined weak syms won't yet be marked as dynamic. */
2496 if (h->dynindx == -1
2497 && ! h->forced_local
2498 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2501 /* If that succeeded, we know we'll be keeping all the
2503 if (h->dynindx != -1)
2507 eh->dyn_relocs = NULL;
2512 /* Finally, allocate space. */
2513 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2517 sreloc = elf_section_data (p->sec)->sreloc;
2519 BFD_ASSERT (sreloc != NULL);
2521 sreloc->size += p->count * bed->s->sizeof_rela;
2527 /* Allocate space in .plt, .got and associated reloc sections for
2528 local dynamic relocs. */
2531 elf_x86_64_allocate_local_dynrelocs (void **slot, void *inf)
2533 struct elf_link_hash_entry *h
2534 = (struct elf_link_hash_entry *) *slot;
2536 if (h->type != STT_GNU_IFUNC
2540 || h->root.type != bfd_link_hash_defined)
2543 return elf_x86_64_allocate_dynrelocs (h, inf);
2546 /* Find any dynamic relocs that apply to read-only sections. */
2549 elf_x86_64_readonly_dynrelocs (struct elf_link_hash_entry *h,
2552 struct elf_x86_64_link_hash_entry *eh;
2553 struct elf_dyn_relocs *p;
2555 /* Skip local IFUNC symbols. */
2556 if (h->forced_local && h->type == STT_GNU_IFUNC)
2559 eh = (struct elf_x86_64_link_hash_entry *) h;
2560 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2562 asection *s = p->sec->output_section;
2564 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2566 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2568 info->flags |= DF_TEXTREL;
2570 if (info->warn_shared_textrel && info->shared)
2571 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'.\n"),
2572 p->sec->owner, h->root.root.string,
2575 /* Not an error, just cut short the traversal. */
2582 /* Set the sizes of the dynamic sections. */
2585 elf_x86_64_size_dynamic_sections (bfd *output_bfd,
2586 struct bfd_link_info *info)
2588 struct elf_x86_64_link_hash_table *htab;
2593 const struct elf_backend_data *bed;
2595 htab = elf_x86_64_hash_table (info);
2598 bed = get_elf_backend_data (output_bfd);
2600 dynobj = htab->elf.dynobj;
2604 if (htab->elf.dynamic_sections_created)
2606 /* Set the contents of the .interp section to the interpreter. */
2607 if (info->executable)
2609 s = bfd_get_section_by_name (dynobj, ".interp");
2612 s->size = htab->dynamic_interpreter_size;
2613 s->contents = (unsigned char *) htab->dynamic_interpreter;
2617 /* Set up .got offsets for local syms, and space for local dynamic
2619 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2621 bfd_signed_vma *local_got;
2622 bfd_signed_vma *end_local_got;
2623 char *local_tls_type;
2624 bfd_vma *local_tlsdesc_gotent;
2625 bfd_size_type locsymcount;
2626 Elf_Internal_Shdr *symtab_hdr;
2629 if (! is_x86_64_elf (ibfd))
2632 for (s = ibfd->sections; s != NULL; s = s->next)
2634 struct elf_dyn_relocs *p;
2636 for (p = (struct elf_dyn_relocs *)
2637 (elf_section_data (s)->local_dynrel);
2641 if (!bfd_is_abs_section (p->sec)
2642 && bfd_is_abs_section (p->sec->output_section))
2644 /* Input section has been discarded, either because
2645 it is a copy of a linkonce section or due to
2646 linker script /DISCARD/, so we'll be discarding
2649 else if (p->count != 0)
2651 srel = elf_section_data (p->sec)->sreloc;
2652 srel->size += p->count * bed->s->sizeof_rela;
2653 if ((p->sec->output_section->flags & SEC_READONLY) != 0
2654 && (info->flags & DF_TEXTREL) == 0)
2656 info->flags |= DF_TEXTREL;
2657 if (info->warn_shared_textrel && info->shared)
2658 info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'.\n"),
2659 p->sec->owner, p->sec);
2665 local_got = elf_local_got_refcounts (ibfd);
2669 symtab_hdr = &elf_symtab_hdr (ibfd);
2670 locsymcount = symtab_hdr->sh_info;
2671 end_local_got = local_got + locsymcount;
2672 local_tls_type = elf_x86_64_local_got_tls_type (ibfd);
2673 local_tlsdesc_gotent = elf_x86_64_local_tlsdesc_gotent (ibfd);
2675 srel = htab->elf.srelgot;
2676 for (; local_got < end_local_got;
2677 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
2679 *local_tlsdesc_gotent = (bfd_vma) -1;
2682 if (GOT_TLS_GDESC_P (*local_tls_type))
2684 *local_tlsdesc_gotent = htab->elf.sgotplt->size
2685 - elf_x86_64_compute_jump_table_size (htab);
2686 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
2687 *local_got = (bfd_vma) -2;
2689 if (! GOT_TLS_GDESC_P (*local_tls_type)
2690 || GOT_TLS_GD_P (*local_tls_type))
2692 *local_got = s->size;
2693 s->size += GOT_ENTRY_SIZE;
2694 if (GOT_TLS_GD_P (*local_tls_type))
2695 s->size += GOT_ENTRY_SIZE;
2698 || GOT_TLS_GD_ANY_P (*local_tls_type)
2699 || *local_tls_type == GOT_TLS_IE)
2701 if (GOT_TLS_GDESC_P (*local_tls_type))
2703 htab->elf.srelplt->size
2704 += bed->s->sizeof_rela;
2705 htab->tlsdesc_plt = (bfd_vma) -1;
2707 if (! GOT_TLS_GDESC_P (*local_tls_type)
2708 || GOT_TLS_GD_P (*local_tls_type))
2709 srel->size += bed->s->sizeof_rela;
2713 *local_got = (bfd_vma) -1;
2717 if (htab->tls_ld_got.refcount > 0)
2719 /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
2721 htab->tls_ld_got.offset = htab->elf.sgot->size;
2722 htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE;
2723 htab->elf.srelgot->size += bed->s->sizeof_rela;
2726 htab->tls_ld_got.offset = -1;
2728 /* Allocate global sym .plt and .got entries, and space for global
2729 sym dynamic relocs. */
2730 elf_link_hash_traverse (&htab->elf, elf_x86_64_allocate_dynrelocs,
2733 /* Allocate .plt and .got entries, and space for local symbols. */
2734 htab_traverse (htab->loc_hash_table,
2735 elf_x86_64_allocate_local_dynrelocs,
2738 /* For every jump slot reserved in the sgotplt, reloc_count is
2739 incremented. However, when we reserve space for TLS descriptors,
2740 it's not incremented, so in order to compute the space reserved
2741 for them, it suffices to multiply the reloc count by the jump
2744 PR ld/13302: We start next_irelative_index at the end of .rela.plt
2745 so that R_X86_64_IRELATIVE entries come last. */
2746 if (htab->elf.srelplt)
2748 htab->sgotplt_jump_table_size
2749 = elf_x86_64_compute_jump_table_size (htab);
2750 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
2752 else if (htab->elf.irelplt)
2753 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
2755 if (htab->tlsdesc_plt)
2757 /* If we're not using lazy TLS relocations, don't generate the
2758 PLT and GOT entries they require. */
2759 if ((info->flags & DF_BIND_NOW))
2760 htab->tlsdesc_plt = 0;
2763 htab->tlsdesc_got = htab->elf.sgot->size;
2764 htab->elf.sgot->size += GOT_ENTRY_SIZE;
2765 /* Reserve room for the initial entry.
2766 FIXME: we could probably do away with it in this case. */
2767 if (htab->elf.splt->size == 0)
2768 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
2769 htab->tlsdesc_plt = htab->elf.splt->size;
2770 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
2774 if (htab->elf.sgotplt)
2776 struct elf_link_hash_entry *got;
2777 got = elf_link_hash_lookup (elf_hash_table (info),
2778 "_GLOBAL_OFFSET_TABLE_",
2779 FALSE, FALSE, FALSE);
2781 /* Don't allocate .got.plt section if there are no GOT nor PLT
2782 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
2784 || !got->ref_regular_nonweak)
2785 && (htab->elf.sgotplt->size
2786 == get_elf_backend_data (output_bfd)->got_header_size)
2787 && (htab->elf.splt == NULL
2788 || htab->elf.splt->size == 0)
2789 && (htab->elf.sgot == NULL
2790 || htab->elf.sgot->size == 0)
2791 && (htab->elf.iplt == NULL
2792 || htab->elf.iplt->size == 0)
2793 && (htab->elf.igotplt == NULL
2794 || htab->elf.igotplt->size == 0))
2795 htab->elf.sgotplt->size = 0;
2798 /* We now have determined the sizes of the various dynamic sections.
2799 Allocate memory for them. */
2801 for (s = dynobj->sections; s != NULL; s = s->next)
2803 if ((s->flags & SEC_LINKER_CREATED) == 0)
2806 if (s == htab->elf.splt
2807 || s == htab->elf.sgot
2808 || s == htab->elf.sgotplt
2809 || s == htab->elf.iplt
2810 || s == htab->elf.igotplt
2811 || s == htab->sdynbss)
2813 /* Strip this section if we don't need it; see the
2816 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2818 if (s->size != 0 && s != htab->elf.srelplt)
2821 /* We use the reloc_count field as a counter if we need
2822 to copy relocs into the output file. */
2823 if (s != htab->elf.srelplt)
2828 /* It's not one of our sections, so don't allocate space. */
2834 /* If we don't need this section, strip it from the
2835 output file. This is mostly to handle .rela.bss and
2836 .rela.plt. We must create both sections in
2837 create_dynamic_sections, because they must be created
2838 before the linker maps input sections to output
2839 sections. The linker does that before
2840 adjust_dynamic_symbol is called, and it is that
2841 function which decides whether anything needs to go
2842 into these sections. */
2844 s->flags |= SEC_EXCLUDE;
2848 if ((s->flags & SEC_HAS_CONTENTS) == 0)
2851 /* Allocate memory for the section contents. We use bfd_zalloc
2852 here in case unused entries are not reclaimed before the
2853 section's contents are written out. This should not happen,
2854 but this way if it does, we get a R_X86_64_NONE reloc instead
2856 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2857 if (s->contents == NULL)
2861 if (htab->plt_eh_frame != NULL
2862 && htab->elf.splt != NULL
2863 && htab->elf.splt->size != 0
2864 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0)
2865 bfd_put_32 (dynobj, htab->elf.splt->size,
2866 htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
2868 if (htab->elf.dynamic_sections_created)
2870 /* Add some entries to the .dynamic section. We fill in the
2871 values later, in elf_x86_64_finish_dynamic_sections, but we
2872 must add the entries now so that we get the correct size for
2873 the .dynamic section. The DT_DEBUG entry is filled in by the
2874 dynamic linker and used by the debugger. */
2875 #define add_dynamic_entry(TAG, VAL) \
2876 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2878 if (info->executable)
2880 if (!add_dynamic_entry (DT_DEBUG, 0))
2884 if (htab->elf.splt->size != 0)
2886 if (!add_dynamic_entry (DT_PLTGOT, 0)
2887 || !add_dynamic_entry (DT_PLTRELSZ, 0)
2888 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2889 || !add_dynamic_entry (DT_JMPREL, 0))
2892 if (htab->tlsdesc_plt
2893 && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
2894 || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
2900 if (!add_dynamic_entry (DT_RELA, 0)
2901 || !add_dynamic_entry (DT_RELASZ, 0)
2902 || !add_dynamic_entry (DT_RELAENT, bed->s->sizeof_rela))
2905 /* If any dynamic relocs apply to a read-only section,
2906 then we need a DT_TEXTREL entry. */
2907 if ((info->flags & DF_TEXTREL) == 0)
2908 elf_link_hash_traverse (&htab->elf,
2909 elf_x86_64_readonly_dynrelocs,
2912 if ((info->flags & DF_TEXTREL) != 0)
2914 if (!add_dynamic_entry (DT_TEXTREL, 0))
2919 #undef add_dynamic_entry
2925 elf_x86_64_always_size_sections (bfd *output_bfd,
2926 struct bfd_link_info *info)
2928 asection *tls_sec = elf_hash_table (info)->tls_sec;
2932 struct elf_link_hash_entry *tlsbase;
2934 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
2935 "_TLS_MODULE_BASE_",
2936 FALSE, FALSE, FALSE);
2938 if (tlsbase && tlsbase->type == STT_TLS)
2940 struct elf_x86_64_link_hash_table *htab;
2941 struct bfd_link_hash_entry *bh = NULL;
2942 const struct elf_backend_data *bed
2943 = get_elf_backend_data (output_bfd);
2945 htab = elf_x86_64_hash_table (info);
2949 if (!(_bfd_generic_link_add_one_symbol
2950 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
2951 tls_sec, 0, NULL, FALSE,
2952 bed->collect, &bh)))
2955 htab->tls_module_base = bh;
2957 tlsbase = (struct elf_link_hash_entry *)bh;
2958 tlsbase->def_regular = 1;
2959 tlsbase->other = STV_HIDDEN;
2960 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
2967 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
2968 executables. Rather than setting it to the beginning of the TLS
2969 section, we have to set it to the end. This function may be called
2970 multiple times, it is idempotent. */
2973 elf_x86_64_set_tls_module_base (struct bfd_link_info *info)
2975 struct elf_x86_64_link_hash_table *htab;
2976 struct bfd_link_hash_entry *base;
2978 if (!info->executable)
2981 htab = elf_x86_64_hash_table (info);
2985 base = htab->tls_module_base;
2989 base->u.def.value = htab->elf.tls_size;
2992 /* Return the base VMA address which should be subtracted from real addresses
2993 when resolving @dtpoff relocation.
2994 This is PT_TLS segment p_vaddr. */
2997 elf_x86_64_dtpoff_base (struct bfd_link_info *info)
2999 /* If tls_sec is NULL, we should have signalled an error already. */
3000 if (elf_hash_table (info)->tls_sec == NULL)
3002 return elf_hash_table (info)->tls_sec->vma;
3005 /* Return the relocation value for @tpoff relocation
3006 if STT_TLS virtual address is ADDRESS. */
3009 elf_x86_64_tpoff (struct bfd_link_info *info, bfd_vma address)
3011 struct elf_link_hash_table *htab = elf_hash_table (info);
3012 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3013 bfd_vma static_tls_size;
3015 /* If tls_segment is NULL, we should have signalled an error already. */
3016 if (htab->tls_sec == NULL)
3019 /* Consider special static TLS alignment requirements. */
3020 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3021 return address - static_tls_size - htab->tls_sec->vma;
3024 /* Is the instruction before OFFSET in CONTENTS a 32bit relative
3028 is_32bit_relative_branch (bfd_byte *contents, bfd_vma offset)
3030 /* Opcode Instruction
3033 0x0f 0x8x conditional jump */
3035 && (contents [offset - 1] == 0xe8
3036 || contents [offset - 1] == 0xe9))
3038 && contents [offset - 2] == 0x0f
3039 && (contents [offset - 1] & 0xf0) == 0x80));
3042 /* Relocate an x86_64 ELF section. */
3045 elf_x86_64_relocate_section (bfd *output_bfd,
3046 struct bfd_link_info *info,
3048 asection *input_section,
3050 Elf_Internal_Rela *relocs,
3051 Elf_Internal_Sym *local_syms,
3052 asection **local_sections)
3054 struct elf_x86_64_link_hash_table *htab;
3055 Elf_Internal_Shdr *symtab_hdr;
3056 struct elf_link_hash_entry **sym_hashes;
3057 bfd_vma *local_got_offsets;
3058 bfd_vma *local_tlsdesc_gotents;
3059 Elf_Internal_Rela *rel;
3060 Elf_Internal_Rela *relend;
3061 const unsigned int plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
3063 BFD_ASSERT (is_x86_64_elf (input_bfd));
3065 htab = elf_x86_64_hash_table (info);
3068 symtab_hdr = &elf_symtab_hdr (input_bfd);
3069 sym_hashes = elf_sym_hashes (input_bfd);
3070 local_got_offsets = elf_local_got_offsets (input_bfd);
3071 local_tlsdesc_gotents = elf_x86_64_local_tlsdesc_gotent (input_bfd);
3073 elf_x86_64_set_tls_module_base (info);
3076 relend = relocs + input_section->reloc_count;
3077 for (; rel < relend; rel++)
3079 unsigned int r_type;
3080 reloc_howto_type *howto;
3081 unsigned long r_symndx;
3082 struct elf_link_hash_entry *h;
3083 Elf_Internal_Sym *sym;
3085 bfd_vma off, offplt;
3087 bfd_boolean unresolved_reloc;
3088 bfd_reloc_status_type r;
3092 r_type = ELF32_R_TYPE (rel->r_info);
3093 if (r_type == (int) R_X86_64_GNU_VTINHERIT
3094 || r_type == (int) R_X86_64_GNU_VTENTRY)
3097 if (r_type >= R_X86_64_max)
3099 bfd_set_error (bfd_error_bad_value);
3103 if (r_type != (int) R_X86_64_32
3104 || ABI_64_P (output_bfd))
3105 howto = x86_64_elf_howto_table + r_type;
3107 howto = (x86_64_elf_howto_table
3108 + ARRAY_SIZE (x86_64_elf_howto_table) - 1);
3109 r_symndx = htab->r_sym (rel->r_info);
3113 unresolved_reloc = FALSE;
3114 if (r_symndx < symtab_hdr->sh_info)
3116 sym = local_syms + r_symndx;
3117 sec = local_sections[r_symndx];
3119 relocation = _bfd_elf_rela_local_sym (output_bfd, sym,
3122 /* Relocate against local STT_GNU_IFUNC symbol. */
3123 if (!info->relocatable
3124 && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3126 h = elf_x86_64_get_local_sym_hash (htab, input_bfd,
3131 /* Set STT_GNU_IFUNC symbol value. */
3132 h->root.u.def.value = sym->st_value;
3133 h->root.u.def.section = sec;
3138 bfd_boolean warned ATTRIBUTE_UNUSED;
3140 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3141 r_symndx, symtab_hdr, sym_hashes,
3143 unresolved_reloc, warned);
3146 if (sec != NULL && elf_discarded_section (sec))
3147 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3148 rel, relend, howto, contents);
3150 if (info->relocatable)
3153 if (rel->r_addend == 0
3154 && r_type == R_X86_64_64
3155 && !ABI_64_P (output_bfd))
3157 /* For x32, treat R_X86_64_64 like R_X86_64_32 and zero-extend
3158 it to 64bit if addend is zero. */
3159 r_type = R_X86_64_32;
3160 memset (contents + rel->r_offset + 4, 0, 4);
3163 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
3164 it here if it is defined in a non-shared object. */
3166 && h->type == STT_GNU_IFUNC
3173 if ((input_section->flags & SEC_ALLOC) == 0
3174 || h->plt.offset == (bfd_vma) -1)
3177 /* STT_GNU_IFUNC symbol must go through PLT. */
3178 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
3179 relocation = (plt->output_section->vma
3180 + plt->output_offset + h->plt.offset);
3185 if (h->root.root.string)
3186 name = h->root.root.string;
3188 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3190 (*_bfd_error_handler)
3191 (_("%B: relocation %s against STT_GNU_IFUNC "
3192 "symbol `%s' isn't handled by %s"), input_bfd,
3193 x86_64_elf_howto_table[r_type].name,
3194 name, __FUNCTION__);
3195 bfd_set_error (bfd_error_bad_value);
3204 if (ABI_64_P (output_bfd))
3208 if (rel->r_addend != 0)
3210 if (h->root.root.string)
3211 name = h->root.root.string;
3213 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
3215 (*_bfd_error_handler)
3216 (_("%B: relocation %s against STT_GNU_IFUNC "
3217 "symbol `%s' has non-zero addend: %d"),
3218 input_bfd, x86_64_elf_howto_table[r_type].name,
3219 name, rel->r_addend);
3220 bfd_set_error (bfd_error_bad_value);
3224 /* Generate dynamic relcoation only when there is a
3225 non-GOT reference in a shared object. */
3226 if (info->shared && h->non_got_ref)
3228 Elf_Internal_Rela outrel;
3231 /* Need a dynamic relocation to get the real function
3233 outrel.r_offset = _bfd_elf_section_offset (output_bfd,
3237 if (outrel.r_offset == (bfd_vma) -1
3238 || outrel.r_offset == (bfd_vma) -2)
3241 outrel.r_offset += (input_section->output_section->vma
3242 + input_section->output_offset);
3244 if (h->dynindx == -1
3246 || info->executable)
3248 /* This symbol is resolved locally. */
3249 outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
3250 outrel.r_addend = (h->root.u.def.value
3251 + h->root.u.def.section->output_section->vma
3252 + h->root.u.def.section->output_offset);
3256 outrel.r_info = htab->r_info (h->dynindx, r_type);
3257 outrel.r_addend = 0;
3260 sreloc = htab->elf.irelifunc;
3261 elf_append_rela (output_bfd, sreloc, &outrel);
3263 /* If this reloc is against an external symbol, we
3264 do not want to fiddle with the addend. Otherwise,
3265 we need to include the symbol value so that it
3266 becomes an addend for the dynamic reloc. For an
3267 internal symbol, we have updated addend. */
3273 case R_X86_64_PLT32:
3276 case R_X86_64_GOTPCREL:
3277 case R_X86_64_GOTPCREL64:
3278 base_got = htab->elf.sgot;
3279 off = h->got.offset;
3281 if (base_got == NULL)
3284 if (off == (bfd_vma) -1)
3286 /* We can't use h->got.offset here to save state, or
3287 even just remember the offset, as finish_dynamic_symbol
3288 would use that as offset into .got. */
3290 if (htab->elf.splt != NULL)
3292 plt_index = h->plt.offset / plt_entry_size - 1;
3293 off = (plt_index + 3) * GOT_ENTRY_SIZE;
3294 base_got = htab->elf.sgotplt;
3298 plt_index = h->plt.offset / plt_entry_size;
3299 off = plt_index * GOT_ENTRY_SIZE;
3300 base_got = htab->elf.igotplt;
3303 if (h->dynindx == -1
3307 /* This references the local defitionion. We must
3308 initialize this entry in the global offset table.
3309 Since the offset must always be a multiple of 8,
3310 we use the least significant bit to record
3311 whether we have initialized it already.
3313 When doing a dynamic link, we create a .rela.got
3314 relocation entry to initialize the value. This
3315 is done in the finish_dynamic_symbol routine. */
3320 bfd_put_64 (output_bfd, relocation,
3321 base_got->contents + off);
3322 /* Note that this is harmless for the GOTPLT64
3323 case, as -1 | 1 still is -1. */
3329 relocation = (base_got->output_section->vma
3330 + base_got->output_offset + off);
3336 /* When generating a shared object, the relocations handled here are
3337 copied into the output file to be resolved at run time. */
3340 case R_X86_64_GOT32:
3341 case R_X86_64_GOT64:
3342 /* Relocation is to the entry for this symbol in the global
3344 case R_X86_64_GOTPCREL:
3345 case R_X86_64_GOTPCREL64:
3346 /* Use global offset table entry as symbol value. */
3347 case R_X86_64_GOTPLT64:
3348 /* This is the same as GOT64 for relocation purposes, but
3349 indicates the existence of a PLT entry. The difficulty is,
3350 that we must calculate the GOT slot offset from the PLT
3351 offset, if this symbol got a PLT entry (it was global).
3352 Additionally if it's computed from the PLT entry, then that
3353 GOT offset is relative to .got.plt, not to .got. */
3354 base_got = htab->elf.sgot;
3356 if (htab->elf.sgot == NULL)
3363 off = h->got.offset;
3365 && h->plt.offset != (bfd_vma)-1
3366 && off == (bfd_vma)-1)
3368 /* We can't use h->got.offset here to save
3369 state, or even just remember the offset, as
3370 finish_dynamic_symbol would use that as offset into
3372 bfd_vma plt_index = h->plt.offset / plt_entry_size - 1;
3373 off = (plt_index + 3) * GOT_ENTRY_SIZE;
3374 base_got = htab->elf.sgotplt;
3377 dyn = htab->elf.dynamic_sections_created;
3379 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3381 && SYMBOL_REFERENCES_LOCAL (info, h))
3382 || (ELF_ST_VISIBILITY (h->other)
3383 && h->root.type == bfd_link_hash_undefweak))
3385 /* This is actually a static link, or it is a -Bsymbolic
3386 link and the symbol is defined locally, or the symbol
3387 was forced to be local because of a version file. We
3388 must initialize this entry in the global offset table.
3389 Since the offset must always be a multiple of 8, we
3390 use the least significant bit to record whether we
3391 have initialized it already.
3393 When doing a dynamic link, we create a .rela.got
3394 relocation entry to initialize the value. This is
3395 done in the finish_dynamic_symbol routine. */
3400 bfd_put_64 (output_bfd, relocation,
3401 base_got->contents + off);
3402 /* Note that this is harmless for the GOTPLT64 case,
3403 as -1 | 1 still is -1. */
3408 unresolved_reloc = FALSE;
3412 if (local_got_offsets == NULL)
3415 off = local_got_offsets[r_symndx];
3417 /* The offset must always be a multiple of 8. We use
3418 the least significant bit to record whether we have
3419 already generated the necessary reloc. */
3424 bfd_put_64 (output_bfd, relocation,
3425 base_got->contents + off);
3430 Elf_Internal_Rela outrel;
3432 /* We need to generate a R_X86_64_RELATIVE reloc
3433 for the dynamic linker. */
3434 s = htab->elf.srelgot;
3438 outrel.r_offset = (base_got->output_section->vma
3439 + base_got->output_offset
3441 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
3442 outrel.r_addend = relocation;
3443 elf_append_rela (output_bfd, s, &outrel);
3446 local_got_offsets[r_symndx] |= 1;
3450 if (off >= (bfd_vma) -2)
3453 relocation = base_got->output_section->vma
3454 + base_got->output_offset + off;
3455 if (r_type != R_X86_64_GOTPCREL && r_type != R_X86_64_GOTPCREL64)
3456 relocation -= htab->elf.sgotplt->output_section->vma
3457 - htab->elf.sgotplt->output_offset;
3461 case R_X86_64_GOTOFF64:
3462 /* Relocation is relative to the start of the global offset
3465 /* Check to make sure it isn't a protected function symbol
3466 for shared library since it may not be local when used
3467 as function address. */
3468 if (!info->executable
3470 && !SYMBOLIC_BIND (info, h)
3472 && h->type == STT_FUNC
3473 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
3475 (*_bfd_error_handler)
3476 (_("%B: relocation R_X86_64_GOTOFF64 against protected function `%s' can not be used when making a shared object"),
3477 input_bfd, h->root.root.string);
3478 bfd_set_error (bfd_error_bad_value);
3482 /* Note that sgot is not involved in this
3483 calculation. We always want the start of .got.plt. If we
3484 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
3485 permitted by the ABI, we might have to change this
3487 relocation -= htab->elf.sgotplt->output_section->vma
3488 + htab->elf.sgotplt->output_offset;
3491 case R_X86_64_GOTPC32:
3492 case R_X86_64_GOTPC64:
3493 /* Use global offset table as symbol value. */
3494 relocation = htab->elf.sgotplt->output_section->vma
3495 + htab->elf.sgotplt->output_offset;
3496 unresolved_reloc = FALSE;
3499 case R_X86_64_PLTOFF64:
3500 /* Relocation is PLT entry relative to GOT. For local
3501 symbols it's the symbol itself relative to GOT. */
3503 /* See PLT32 handling. */
3504 && h->plt.offset != (bfd_vma) -1
3505 && htab->elf.splt != NULL)
3507 relocation = (htab->elf.splt->output_section->vma
3508 + htab->elf.splt->output_offset
3510 unresolved_reloc = FALSE;
3513 relocation -= htab->elf.sgotplt->output_section->vma
3514 + htab->elf.sgotplt->output_offset;
3517 case R_X86_64_PLT32:
3518 /* Relocation is to the entry for this symbol in the
3519 procedure linkage table. */
3521 /* Resolve a PLT32 reloc against a local symbol directly,
3522 without using the procedure linkage table. */
3526 if (h->plt.offset == (bfd_vma) -1
3527 || htab->elf.splt == NULL)
3529 /* We didn't make a PLT entry for this symbol. This
3530 happens when statically linking PIC code, or when
3531 using -Bsymbolic. */
3535 relocation = (htab->elf.splt->output_section->vma
3536 + htab->elf.splt->output_offset
3538 unresolved_reloc = FALSE;
3545 && (input_section->flags & SEC_ALLOC) != 0
3546 && (input_section->flags & SEC_READONLY) != 0
3549 bfd_boolean fail = FALSE;
3551 = (r_type == R_X86_64_PC32
3552 && is_32bit_relative_branch (contents, rel->r_offset));
3554 if (SYMBOL_REFERENCES_LOCAL (info, h))
3556 /* Symbol is referenced locally. Make sure it is
3557 defined locally or for a branch. */
3558 fail = !h->def_regular && !branch;
3562 /* Symbol isn't referenced locally. We only allow
3563 branch to symbol with non-default visibility. */
3565 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT);
3572 const char *pic = "";
3574 switch (ELF_ST_VISIBILITY (h->other))
3577 v = _("hidden symbol");
3580 v = _("internal symbol");
3583 v = _("protected symbol");
3587 pic = _("; recompile with -fPIC");
3592 fmt = _("%B: relocation %s against %s `%s' can not be used when making a shared object%s");
3594 fmt = _("%B: relocation %s against undefined %s `%s' can not be used when making a shared object%s");
3596 (*_bfd_error_handler) (fmt, input_bfd,
3597 x86_64_elf_howto_table[r_type].name,
3598 v, h->root.root.string, pic);
3599 bfd_set_error (bfd_error_bad_value);
3610 /* FIXME: The ABI says the linker should make sure the value is
3611 the same when it's zeroextended to 64 bit. */
3613 if ((input_section->flags & SEC_ALLOC) == 0)
3618 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3619 || h->root.type != bfd_link_hash_undefweak)
3620 && (! IS_X86_64_PCREL_TYPE (r_type)
3621 || ! SYMBOL_CALLS_LOCAL (info, h)))
3622 || (ELIMINATE_COPY_RELOCS
3629 || h->root.type == bfd_link_hash_undefweak
3630 || h->root.type == bfd_link_hash_undefined)))
3632 Elf_Internal_Rela outrel;
3633 bfd_boolean skip, relocate;
3636 /* When generating a shared object, these relocations
3637 are copied into the output file to be resolved at run
3643 _bfd_elf_section_offset (output_bfd, info, input_section,
3645 if (outrel.r_offset == (bfd_vma) -1)
3647 else if (outrel.r_offset == (bfd_vma) -2)
3648 skip = TRUE, relocate = TRUE;
3650 outrel.r_offset += (input_section->output_section->vma
3651 + input_section->output_offset);
3654 memset (&outrel, 0, sizeof outrel);
3656 /* h->dynindx may be -1 if this symbol was marked to
3660 && (IS_X86_64_PCREL_TYPE (r_type)
3662 || ! SYMBOLIC_BIND (info, h)
3663 || ! h->def_regular))
3665 outrel.r_info = htab->r_info (h->dynindx, r_type);
3666 outrel.r_addend = rel->r_addend;
3670 /* This symbol is local, or marked to become local. */
3671 if (r_type == htab->pointer_r_type)
3674 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
3675 outrel.r_addend = relocation + rel->r_addend;
3677 else if (r_type == R_X86_64_64
3678 && !ABI_64_P (output_bfd))
3681 outrel.r_info = htab->r_info (0,
3682 R_X86_64_RELATIVE64);
3683 outrel.r_addend = relocation + rel->r_addend;
3689 if (bfd_is_abs_section (sec))
3691 else if (sec == NULL || sec->owner == NULL)
3693 bfd_set_error (bfd_error_bad_value);
3700 /* We are turning this relocation into one
3701 against a section symbol. It would be
3702 proper to subtract the symbol's value,
3703 osec->vma, from the emitted reloc addend,
3704 but ld.so expects buggy relocs. */
3705 osec = sec->output_section;
3706 sindx = elf_section_data (osec)->dynindx;
3709 asection *oi = htab->elf.text_index_section;
3710 sindx = elf_section_data (oi)->dynindx;
3712 BFD_ASSERT (sindx != 0);
3715 outrel.r_info = htab->r_info (sindx, r_type);
3716 outrel.r_addend = relocation + rel->r_addend;
3720 sreloc = elf_section_data (input_section)->sreloc;
3722 if (sreloc == NULL || sreloc->contents == NULL)
3724 r = bfd_reloc_notsupported;
3725 goto check_relocation_error;
3728 elf_append_rela (output_bfd, sreloc, &outrel);
3730 /* If this reloc is against an external symbol, we do
3731 not want to fiddle with the addend. Otherwise, we
3732 need to include the symbol value so that it becomes
3733 an addend for the dynamic reloc. */
3740 case R_X86_64_TLSGD:
3741 case R_X86_64_GOTPC32_TLSDESC:
3742 case R_X86_64_TLSDESC_CALL:
3743 case R_X86_64_GOTTPOFF:
3744 tls_type = GOT_UNKNOWN;
3745 if (h == NULL && local_got_offsets)
3746 tls_type = elf_x86_64_local_got_tls_type (input_bfd) [r_symndx];
3748 tls_type = elf_x86_64_hash_entry (h)->tls_type;
3750 if (! elf_x86_64_tls_transition (info, input_bfd,
3751 input_section, contents,
3752 symtab_hdr, sym_hashes,
3753 &r_type, tls_type, rel,
3754 relend, h, r_symndx))
3757 if (r_type == R_X86_64_TPOFF32)
3759 bfd_vma roff = rel->r_offset;
3761 BFD_ASSERT (! unresolved_reloc);
3763 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
3765 /* GD->LE transition. For 64bit, change
3766 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
3767 .word 0x6666; rex64; call __tls_get_addr
3770 leaq foo@tpoff(%rax), %rax
3772 leaq foo@tlsgd(%rip), %rdi
3773 .word 0x6666; rex64; call __tls_get_addr
3776 leaq foo@tpoff(%rax), %rax */
3777 if (ABI_64_P (output_bfd))
3778 memcpy (contents + roff - 4,
3779 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
3782 memcpy (contents + roff - 3,
3783 "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
3785 bfd_put_32 (output_bfd,
3786 elf_x86_64_tpoff (info, relocation),
3787 contents + roff + 8);
3788 /* Skip R_X86_64_PC32/R_X86_64_PLT32. */
3792 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
3794 /* GDesc -> LE transition.
3795 It's originally something like:
3796 leaq x@tlsdesc(%rip), %rax
3799 movl $x@tpoff, %rax. */
3801 unsigned int val, type;
3803 type = bfd_get_8 (input_bfd, contents + roff - 3);
3804 val = bfd_get_8 (input_bfd, contents + roff - 1);
3805 bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
3806 contents + roff - 3);
3807 bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
3808 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
3809 contents + roff - 1);
3810 bfd_put_32 (output_bfd,
3811 elf_x86_64_tpoff (info, relocation),
3815 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
3817 /* GDesc -> LE transition.
3822 bfd_put_8 (output_bfd, 0x66, contents + roff);
3823 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3826 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTTPOFF)
3828 /* IE->LE transition:
3829 Originally it can be one of:
3830 movq foo@gottpoff(%rip), %reg
3831 addq foo@gottpoff(%rip), %reg
3834 leaq foo(%reg), %reg
3837 unsigned int val, type, reg;
3839 val = bfd_get_8 (input_bfd, contents + roff - 3);
3840 type = bfd_get_8 (input_bfd, contents + roff - 2);
3841 reg = bfd_get_8 (input_bfd, contents + roff - 1);
3847 bfd_put_8 (output_bfd, 0x49,
3848 contents + roff - 3);
3849 else if (!ABI_64_P (output_bfd) && val == 0x44)
3850 bfd_put_8 (output_bfd, 0x41,
3851 contents + roff - 3);
3852 bfd_put_8 (output_bfd, 0xc7,
3853 contents + roff - 2);
3854 bfd_put_8 (output_bfd, 0xc0 | reg,
3855 contents + roff - 1);
3859 /* addq -> addq - addressing with %rsp/%r12 is
3862 bfd_put_8 (output_bfd, 0x49,
3863 contents + roff - 3);
3864 else if (!ABI_64_P (output_bfd) && val == 0x44)
3865 bfd_put_8 (output_bfd, 0x41,
3866 contents + roff - 3);
3867 bfd_put_8 (output_bfd, 0x81,
3868 contents + roff - 2);
3869 bfd_put_8 (output_bfd, 0xc0 | reg,
3870 contents + roff - 1);
3876 bfd_put_8 (output_bfd, 0x4d,
3877 contents + roff - 3);
3878 else if (!ABI_64_P (output_bfd) && val == 0x44)
3879 bfd_put_8 (output_bfd, 0x45,
3880 contents + roff - 3);
3881 bfd_put_8 (output_bfd, 0x8d,
3882 contents + roff - 2);
3883 bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
3884 contents + roff - 1);
3886 bfd_put_32 (output_bfd,
3887 elf_x86_64_tpoff (info, relocation),
3895 if (htab->elf.sgot == NULL)
3900 off = h->got.offset;
3901 offplt = elf_x86_64_hash_entry (h)->tlsdesc_got;
3905 if (local_got_offsets == NULL)
3908 off = local_got_offsets[r_symndx];
3909 offplt = local_tlsdesc_gotents[r_symndx];
3916 Elf_Internal_Rela outrel;
3920 if (htab->elf.srelgot == NULL)
3923 indx = h && h->dynindx != -1 ? h->dynindx : 0;
3925 if (GOT_TLS_GDESC_P (tls_type))
3927 outrel.r_info = htab->r_info (indx, R_X86_64_TLSDESC);
3928 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
3929 + 2 * GOT_ENTRY_SIZE <= htab->elf.sgotplt->size);
3930 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
3931 + htab->elf.sgotplt->output_offset
3933 + htab->sgotplt_jump_table_size);
3934 sreloc = htab->elf.srelplt;
3936 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
3938 outrel.r_addend = 0;
3939 elf_append_rela (output_bfd, sreloc, &outrel);
3942 sreloc = htab->elf.srelgot;
3944 outrel.r_offset = (htab->elf.sgot->output_section->vma
3945 + htab->elf.sgot->output_offset + off);
3947 if (GOT_TLS_GD_P (tls_type))
3948 dr_type = R_X86_64_DTPMOD64;
3949 else if (GOT_TLS_GDESC_P (tls_type))
3952 dr_type = R_X86_64_TPOFF64;
3954 bfd_put_64 (output_bfd, 0, htab->elf.sgot->contents + off);
3955 outrel.r_addend = 0;
3956 if ((dr_type == R_X86_64_TPOFF64
3957 || dr_type == R_X86_64_TLSDESC) && indx == 0)
3958 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
3959 outrel.r_info = htab->r_info (indx, dr_type);
3961 elf_append_rela (output_bfd, sreloc, &outrel);
3963 if (GOT_TLS_GD_P (tls_type))
3967 BFD_ASSERT (! unresolved_reloc);
3968 bfd_put_64 (output_bfd,
3969 relocation - elf_x86_64_dtpoff_base (info),
3970 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
3974 bfd_put_64 (output_bfd, 0,
3975 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
3976 outrel.r_info = htab->r_info (indx,
3978 outrel.r_offset += GOT_ENTRY_SIZE;
3979 elf_append_rela (output_bfd, sreloc,
3988 local_got_offsets[r_symndx] |= 1;
3991 if (off >= (bfd_vma) -2
3992 && ! GOT_TLS_GDESC_P (tls_type))
3994 if (r_type == ELF32_R_TYPE (rel->r_info))
3996 if (r_type == R_X86_64_GOTPC32_TLSDESC
3997 || r_type == R_X86_64_TLSDESC_CALL)
3998 relocation = htab->elf.sgotplt->output_section->vma
3999 + htab->elf.sgotplt->output_offset
4000 + offplt + htab->sgotplt_jump_table_size;
4002 relocation = htab->elf.sgot->output_section->vma
4003 + htab->elf.sgot->output_offset + off;
4004 unresolved_reloc = FALSE;
4008 bfd_vma roff = rel->r_offset;
4010 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
4012 /* GD->IE transition. For 64bit, change
4013 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4014 .word 0x6666; rex64; call __tls_get_addr@plt
4017 addq foo@gottpoff(%rip), %rax
4019 leaq foo@tlsgd(%rip), %rdi
4020 .word 0x6666; rex64; call __tls_get_addr@plt
4023 addq foo@gottpoff(%rip), %rax */
4024 if (ABI_64_P (output_bfd))
4025 memcpy (contents + roff - 4,
4026 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
4029 memcpy (contents + roff - 3,
4030 "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
4033 relocation = (htab->elf.sgot->output_section->vma
4034 + htab->elf.sgot->output_offset + off
4036 - input_section->output_section->vma
4037 - input_section->output_offset
4039 bfd_put_32 (output_bfd, relocation,
4040 contents + roff + 8);
4041 /* Skip R_X86_64_PLT32. */
4045 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
4047 /* GDesc -> IE transition.
4048 It's originally something like:
4049 leaq x@tlsdesc(%rip), %rax
4052 movq x@gottpoff(%rip), %rax # before xchg %ax,%ax. */
4054 /* Now modify the instruction as appropriate. To
4055 turn a leaq into a movq in the form we use it, it
4056 suffices to change the second byte from 0x8d to
4058 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4060 bfd_put_32 (output_bfd,
4061 htab->elf.sgot->output_section->vma
4062 + htab->elf.sgot->output_offset + off
4064 - input_section->output_section->vma
4065 - input_section->output_offset
4070 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
4072 /* GDesc -> IE transition.
4079 bfd_put_8 (output_bfd, 0x66, contents + roff);
4080 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4088 case R_X86_64_TLSLD:
4089 if (! elf_x86_64_tls_transition (info, input_bfd,
4090 input_section, contents,
4091 symtab_hdr, sym_hashes,
4092 &r_type, GOT_UNKNOWN,
4093 rel, relend, h, r_symndx))
4096 if (r_type != R_X86_64_TLSLD)
4098 /* LD->LE transition:
4099 leaq foo@tlsld(%rip), %rdi; call __tls_get_addr.
4100 For 64bit, we change it into:
4101 .word 0x6666; .byte 0x66; movq %fs:0, %rax.
4102 For 32bit, we change it into:
4103 nopl 0x0(%rax); movl %fs:0, %eax. */
4105 BFD_ASSERT (r_type == R_X86_64_TPOFF32);
4106 if (ABI_64_P (output_bfd))
4107 memcpy (contents + rel->r_offset - 3,
4108 "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
4110 memcpy (contents + rel->r_offset - 3,
4111 "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
4112 /* Skip R_X86_64_PC32/R_X86_64_PLT32. */
4117 if (htab->elf.sgot == NULL)
4120 off = htab->tls_ld_got.offset;
4125 Elf_Internal_Rela outrel;
4127 if (htab->elf.srelgot == NULL)
4130 outrel.r_offset = (htab->elf.sgot->output_section->vma
4131 + htab->elf.sgot->output_offset + off);
4133 bfd_put_64 (output_bfd, 0,
4134 htab->elf.sgot->contents + off);
4135 bfd_put_64 (output_bfd, 0,
4136 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4137 outrel.r_info = htab->r_info (0, R_X86_64_DTPMOD64);
4138 outrel.r_addend = 0;
4139 elf_append_rela (output_bfd, htab->elf.srelgot,
4141 htab->tls_ld_got.offset |= 1;
4143 relocation = htab->elf.sgot->output_section->vma
4144 + htab->elf.sgot->output_offset + off;
4145 unresolved_reloc = FALSE;
4148 case R_X86_64_DTPOFF32:
4149 if (!info->executable|| (input_section->flags & SEC_CODE) == 0)
4150 relocation -= elf_x86_64_dtpoff_base (info);
4152 relocation = elf_x86_64_tpoff (info, relocation);
4155 case R_X86_64_TPOFF32:
4156 case R_X86_64_TPOFF64:
4157 BFD_ASSERT (info->executable);
4158 relocation = elf_x86_64_tpoff (info, relocation);
4165 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4166 because such sections are not SEC_ALLOC and thus ld.so will
4167 not process them. */
4168 if (unresolved_reloc
4169 && !((input_section->flags & SEC_DEBUGGING) != 0
4171 && _bfd_elf_section_offset (output_bfd, info, input_section,
4172 rel->r_offset) != (bfd_vma) -1)
4173 (*_bfd_error_handler)
4174 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
4177 (long) rel->r_offset,
4179 h->root.root.string);
4182 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4183 contents, rel->r_offset,
4184 relocation, rel->r_addend);
4186 check_relocation_error:
4187 if (r != bfd_reloc_ok)
4192 name = h->root.root.string;
4195 name = bfd_elf_string_from_elf_section (input_bfd,
4196 symtab_hdr->sh_link,
4201 name = bfd_section_name (input_bfd, sec);
4204 if (r == bfd_reloc_overflow)
4206 if (! ((*info->callbacks->reloc_overflow)
4207 (info, (h ? &h->root : NULL), name, howto->name,
4208 (bfd_vma) 0, input_bfd, input_section,
4214 (*_bfd_error_handler)
4215 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
4216 input_bfd, input_section,
4217 (long) rel->r_offset, name, (int) r);
4226 /* Finish up dynamic symbol handling. We set the contents of various
4227 dynamic sections here. */
4230 elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
4231 struct bfd_link_info *info,
4232 struct elf_link_hash_entry *h,
4233 Elf_Internal_Sym *sym)
4235 struct elf_x86_64_link_hash_table *htab;
4236 const struct elf_x86_64_backend_data *const abed
4237 = get_elf_x86_64_backend_data (output_bfd);
4239 htab = elf_x86_64_hash_table (info);
4243 if (h->plt.offset != (bfd_vma) -1)
4247 Elf_Internal_Rela rela;
4249 asection *plt, *gotplt, *relplt;
4250 const struct elf_backend_data *bed;
4252 /* When building a static executable, use .iplt, .igot.plt and
4253 .rela.iplt sections for STT_GNU_IFUNC symbols. */
4254 if (htab->elf.splt != NULL)
4256 plt = htab->elf.splt;
4257 gotplt = htab->elf.sgotplt;
4258 relplt = htab->elf.srelplt;
4262 plt = htab->elf.iplt;
4263 gotplt = htab->elf.igotplt;
4264 relplt = htab->elf.irelplt;
4267 /* This symbol has an entry in the procedure linkage table. Set
4269 if ((h->dynindx == -1
4270 && !((h->forced_local || info->executable)
4272 && h->type == STT_GNU_IFUNC))
4278 /* Get the index in the procedure linkage table which
4279 corresponds to this symbol. This is the index of this symbol
4280 in all the symbols for which we are making plt entries. The
4281 first entry in the procedure linkage table is reserved.
4283 Get the offset into the .got table of the entry that
4284 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
4285 bytes. The first three are reserved for the dynamic linker.
4287 For static executables, we don't reserve anything. */
4289 if (plt == htab->elf.splt)
4291 got_offset = h->plt.offset / abed->plt_entry_size - 1;
4292 got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
4296 got_offset = h->plt.offset / abed->plt_entry_size;
4297 got_offset = got_offset * GOT_ENTRY_SIZE;
4300 /* Fill in the entry in the procedure linkage table. */
4301 memcpy (plt->contents + h->plt.offset, abed->plt_entry,
4302 abed->plt_entry_size);
4304 /* Insert the relocation positions of the plt section. */
4306 /* Put offset the PC-relative instruction referring to the GOT entry,
4307 subtracting the size of that instruction. */
4308 bfd_put_32 (output_bfd,
4309 (gotplt->output_section->vma
4310 + gotplt->output_offset
4312 - plt->output_section->vma
4313 - plt->output_offset
4315 - abed->plt_got_insn_size),
4316 plt->contents + h->plt.offset + abed->plt_got_offset);
4318 /* Fill in the entry in the global offset table, initially this
4319 points to the second part of the PLT entry. */
4320 bfd_put_64 (output_bfd, (plt->output_section->vma
4321 + plt->output_offset
4322 + h->plt.offset + abed->plt_lazy_offset),
4323 gotplt->contents + got_offset);
4325 /* Fill in the entry in the .rela.plt section. */
4326 rela.r_offset = (gotplt->output_section->vma
4327 + gotplt->output_offset
4329 if (h->dynindx == -1
4330 || ((info->executable
4331 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4333 && h->type == STT_GNU_IFUNC))
4335 /* If an STT_GNU_IFUNC symbol is locally defined, generate
4336 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT. */
4337 rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
4338 rela.r_addend = (h->root.u.def.value
4339 + h->root.u.def.section->output_section->vma
4340 + h->root.u.def.section->output_offset);
4341 /* R_X86_64_IRELATIVE comes last. */
4342 plt_index = htab->next_irelative_index--;
4346 rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
4348 plt_index = htab->next_jump_slot_index++;
4351 /* Don't fill PLT entry for static executables. */
4352 if (plt == htab->elf.splt)
4354 /* Put relocation index. */
4355 bfd_put_32 (output_bfd, plt_index,
4356 plt->contents + h->plt.offset + abed->plt_reloc_offset);
4357 /* Put offset for jmp .PLT0. */
4358 bfd_put_32 (output_bfd, - (h->plt.offset + abed->plt_plt_insn_end),
4359 plt->contents + h->plt.offset + abed->plt_plt_offset);
4362 bed = get_elf_backend_data (output_bfd);
4363 loc = relplt->contents + plt_index * bed->s->sizeof_rela;
4364 bed->s->swap_reloca_out (output_bfd, &rela, loc);
4366 if (!h->def_regular)
4368 /* Mark the symbol as undefined, rather than as defined in
4369 the .plt section. Leave the value if there were any
4370 relocations where pointer equality matters (this is a clue
4371 for the dynamic linker, to make function pointer
4372 comparisons work between an application and shared
4373 library), otherwise set it to zero. If a function is only
4374 called from a binary, there is no need to slow down
4375 shared libraries because of that. */
4376 sym->st_shndx = SHN_UNDEF;
4377 if (!h->pointer_equality_needed)
4382 if (h->got.offset != (bfd_vma) -1
4383 && ! GOT_TLS_GD_ANY_P (elf_x86_64_hash_entry (h)->tls_type)
4384 && elf_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE)
4386 Elf_Internal_Rela rela;
4388 /* This symbol has an entry in the global offset table. Set it
4390 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
4393 rela.r_offset = (htab->elf.sgot->output_section->vma
4394 + htab->elf.sgot->output_offset
4395 + (h->got.offset &~ (bfd_vma) 1));
4397 /* If this is a static link, or it is a -Bsymbolic link and the
4398 symbol is defined locally or was forced to be local because
4399 of a version file, we just want to emit a RELATIVE reloc.
4400 The entry in the global offset table will already have been
4401 initialized in the relocate_section function. */
4403 && h->type == STT_GNU_IFUNC)
4407 /* Generate R_X86_64_GLOB_DAT. */
4414 if (!h->pointer_equality_needed)
4417 /* For non-shared object, we can't use .got.plt, which
4418 contains the real function addres if we need pointer
4419 equality. We load the GOT entry with the PLT entry. */
4420 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4421 bfd_put_64 (output_bfd, (plt->output_section->vma
4422 + plt->output_offset
4424 htab->elf.sgot->contents + h->got.offset);
4428 else if (info->shared
4429 && SYMBOL_REFERENCES_LOCAL (info, h))
4431 if (!h->def_regular)
4433 BFD_ASSERT((h->got.offset & 1) != 0);
4434 rela.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4435 rela.r_addend = (h->root.u.def.value
4436 + h->root.u.def.section->output_section->vma
4437 + h->root.u.def.section->output_offset);
4441 BFD_ASSERT((h->got.offset & 1) == 0);
4443 bfd_put_64 (output_bfd, (bfd_vma) 0,
4444 htab->elf.sgot->contents + h->got.offset);
4445 rela.r_info = htab->r_info (h->dynindx, R_X86_64_GLOB_DAT);
4449 elf_append_rela (output_bfd, htab->elf.srelgot, &rela);
4454 Elf_Internal_Rela rela;
4456 /* This symbol needs a copy reloc. Set it up. */
4458 if (h->dynindx == -1
4459 || (h->root.type != bfd_link_hash_defined
4460 && h->root.type != bfd_link_hash_defweak)
4461 || htab->srelbss == NULL)
4464 rela.r_offset = (h->root.u.def.value
4465 + h->root.u.def.section->output_section->vma
4466 + h->root.u.def.section->output_offset);
4467 rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY);
4469 elf_append_rela (output_bfd, htab->srelbss, &rela);
4472 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. SYM may
4473 be NULL for local symbols. */
4475 && (strcmp (h->root.root.string, "_DYNAMIC") == 0
4476 || h == htab->elf.hgot))
4477 sym->st_shndx = SHN_ABS;
4482 /* Finish up local dynamic symbol handling. We set the contents of
4483 various dynamic sections here. */
4486 elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
4488 struct elf_link_hash_entry *h
4489 = (struct elf_link_hash_entry *) *slot;
4490 struct bfd_link_info *info
4491 = (struct bfd_link_info *) inf;
4493 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
4497 /* Used to decide how to sort relocs in an optimal manner for the
4498 dynamic linker, before writing them out. */
4500 static enum elf_reloc_type_class
4501 elf_x86_64_reloc_type_class (const Elf_Internal_Rela *rela)
4503 switch ((int) ELF32_R_TYPE (rela->r_info))
4505 case R_X86_64_RELATIVE:
4506 return reloc_class_relative;
4507 case R_X86_64_JUMP_SLOT:
4508 return reloc_class_plt;
4510 return reloc_class_copy;
4512 return reloc_class_normal;
4516 /* Finish up the dynamic sections. */
4519 elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
4520 struct bfd_link_info *info)
4522 struct elf_x86_64_link_hash_table *htab;
4525 const struct elf_x86_64_backend_data *const abed
4526 = get_elf_x86_64_backend_data (output_bfd);
4528 htab = elf_x86_64_hash_table (info);
4532 dynobj = htab->elf.dynobj;
4533 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4535 if (htab->elf.dynamic_sections_created)
4537 bfd_byte *dyncon, *dynconend;
4538 const struct elf_backend_data *bed;
4539 bfd_size_type sizeof_dyn;
4541 if (sdyn == NULL || htab->elf.sgot == NULL)
4544 bed = get_elf_backend_data (dynobj);
4545 sizeof_dyn = bed->s->sizeof_dyn;
4546 dyncon = sdyn->contents;
4547 dynconend = sdyn->contents + sdyn->size;
4548 for (; dyncon < dynconend; dyncon += sizeof_dyn)
4550 Elf_Internal_Dyn dyn;
4553 (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
4561 s = htab->elf.sgotplt;
4562 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4566 dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
4570 s = htab->elf.srelplt->output_section;
4571 dyn.d_un.d_val = s->size;
4575 /* The procedure linkage table relocs (DT_JMPREL) should
4576 not be included in the overall relocs (DT_RELA).
4577 Therefore, we override the DT_RELASZ entry here to
4578 make it not include the JMPREL relocs. Since the
4579 linker script arranges for .rela.plt to follow all
4580 other relocation sections, we don't have to worry
4581 about changing the DT_RELA entry. */
4582 if (htab->elf.srelplt != NULL)
4584 s = htab->elf.srelplt->output_section;
4585 dyn.d_un.d_val -= s->size;
4589 case DT_TLSDESC_PLT:
4591 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
4592 + htab->tlsdesc_plt;
4595 case DT_TLSDESC_GOT:
4597 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
4598 + htab->tlsdesc_got;
4602 (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
4605 /* Fill in the special first entry in the procedure linkage table. */
4606 if (htab->elf.splt && htab->elf.splt->size > 0)
4608 /* Fill in the first entry in the procedure linkage table. */
4609 memcpy (htab->elf.splt->contents,
4610 abed->plt0_entry, abed->plt_entry_size);
4611 /* Add offset for pushq GOT+8(%rip), since the instruction
4612 uses 6 bytes subtract this value. */
4613 bfd_put_32 (output_bfd,
4614 (htab->elf.sgotplt->output_section->vma
4615 + htab->elf.sgotplt->output_offset
4617 - htab->elf.splt->output_section->vma
4618 - htab->elf.splt->output_offset
4620 htab->elf.splt->contents + abed->plt0_got1_offset);
4621 /* Add offset for the PC-relative instruction accessing GOT+16,
4622 subtracting the offset to the end of that instruction. */
4623 bfd_put_32 (output_bfd,
4624 (htab->elf.sgotplt->output_section->vma
4625 + htab->elf.sgotplt->output_offset
4627 - htab->elf.splt->output_section->vma
4628 - htab->elf.splt->output_offset
4629 - abed->plt0_got2_insn_end),
4630 htab->elf.splt->contents + abed->plt0_got2_offset);
4632 elf_section_data (htab->elf.splt->output_section)
4633 ->this_hdr.sh_entsize = abed->plt_entry_size;
4635 if (htab->tlsdesc_plt)
4637 bfd_put_64 (output_bfd, (bfd_vma) 0,
4638 htab->elf.sgot->contents + htab->tlsdesc_got);
4640 memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
4641 abed->plt0_entry, abed->plt_entry_size);
4643 /* Add offset for pushq GOT+8(%rip), since the
4644 instruction uses 6 bytes subtract this value. */
4645 bfd_put_32 (output_bfd,
4646 (htab->elf.sgotplt->output_section->vma
4647 + htab->elf.sgotplt->output_offset
4649 - htab->elf.splt->output_section->vma
4650 - htab->elf.splt->output_offset
4653 htab->elf.splt->contents
4654 + htab->tlsdesc_plt + abed->plt0_got1_offset);
4655 /* Add offset for the PC-relative instruction accessing GOT+TDG,
4656 where TGD stands for htab->tlsdesc_got, subtracting the offset
4657 to the end of that instruction. */
4658 bfd_put_32 (output_bfd,
4659 (htab->elf.sgot->output_section->vma
4660 + htab->elf.sgot->output_offset
4662 - htab->elf.splt->output_section->vma
4663 - htab->elf.splt->output_offset
4665 - abed->plt0_got2_insn_end),
4666 htab->elf.splt->contents
4667 + htab->tlsdesc_plt + abed->plt0_got2_offset);
4672 if (htab->elf.sgotplt)
4674 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
4676 (*_bfd_error_handler)
4677 (_("discarded output section: `%A'"), htab->elf.sgotplt);
4681 /* Fill in the first three entries in the global offset table. */
4682 if (htab->elf.sgotplt->size > 0)
4684 /* Set the first entry in the global offset table to the address of
4685 the dynamic section. */
4687 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents);
4689 bfd_put_64 (output_bfd,
4690 sdyn->output_section->vma + sdyn->output_offset,
4691 htab->elf.sgotplt->contents);
4692 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
4693 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
4694 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE*2);
4697 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize =
4701 /* Adjust .eh_frame for .plt section. */
4702 if (htab->plt_eh_frame != NULL)
4704 if (htab->elf.splt != NULL
4705 && htab->elf.splt->size != 0
4706 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
4707 && htab->elf.splt->output_section != NULL
4708 && htab->plt_eh_frame->output_section != NULL)
4710 bfd_vma plt_start = htab->elf.splt->output_section->vma;
4711 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
4712 + htab->plt_eh_frame->output_offset
4713 + PLT_FDE_START_OFFSET;
4714 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
4715 htab->plt_eh_frame->contents
4716 + PLT_FDE_START_OFFSET);
4718 if (htab->plt_eh_frame->sec_info_type
4719 == ELF_INFO_TYPE_EH_FRAME)
4721 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
4723 htab->plt_eh_frame->contents))
4728 if (htab->elf.sgot && htab->elf.sgot->size > 0)
4729 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
4732 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
4733 htab_traverse (htab->loc_hash_table,
4734 elf_x86_64_finish_local_dynamic_symbol,
4740 /* Return address for Ith PLT stub in section PLT, for relocation REL
4741 or (bfd_vma) -1 if it should not be included. */
4744 elf_x86_64_plt_sym_val (bfd_vma i, const asection *plt,
4745 const arelent *rel ATTRIBUTE_UNUSED)
4747 return plt->vma + (i + 1) * GET_PLT_ENTRY_SIZE (plt->owner);
4750 /* Handle an x86-64 specific section when reading an object file. This
4751 is called when elfcode.h finds a section with an unknown type. */
4754 elf_x86_64_section_from_shdr (bfd *abfd,
4755 Elf_Internal_Shdr *hdr,
4759 if (hdr->sh_type != SHT_X86_64_UNWIND)
4762 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
4768 /* Hook called by the linker routine which adds symbols from an object
4769 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
4773 elf_x86_64_add_symbol_hook (bfd *abfd,
4774 struct bfd_link_info *info,
4775 Elf_Internal_Sym *sym,
4776 const char **namep ATTRIBUTE_UNUSED,
4777 flagword *flagsp ATTRIBUTE_UNUSED,
4783 switch (sym->st_shndx)
4785 case SHN_X86_64_LCOMMON:
4786 lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
4789 lcomm = bfd_make_section_with_flags (abfd,
4793 | SEC_LINKER_CREATED));
4796 elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
4799 *valp = sym->st_size;
4803 if ((abfd->flags & DYNAMIC) == 0
4804 && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
4805 || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
4806 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4812 /* Given a BFD section, try to locate the corresponding ELF section
4816 elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
4817 asection *sec, int *index_return)
4819 if (sec == &_bfd_elf_large_com_section)
4821 *index_return = SHN_X86_64_LCOMMON;
4827 /* Process a symbol. */
4830 elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
4833 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
4835 switch (elfsym->internal_elf_sym.st_shndx)
4837 case SHN_X86_64_LCOMMON:
4838 asym->section = &_bfd_elf_large_com_section;
4839 asym->value = elfsym->internal_elf_sym.st_size;
4840 /* Common symbol doesn't set BSF_GLOBAL. */
4841 asym->flags &= ~BSF_GLOBAL;
4847 elf_x86_64_common_definition (Elf_Internal_Sym *sym)
4849 return (sym->st_shndx == SHN_COMMON
4850 || sym->st_shndx == SHN_X86_64_LCOMMON);
4854 elf_x86_64_common_section_index (asection *sec)
4856 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
4859 return SHN_X86_64_LCOMMON;
4863 elf_x86_64_common_section (asection *sec)
4865 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
4866 return bfd_com_section_ptr;
4868 return &_bfd_elf_large_com_section;
4872 elf_x86_64_merge_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
4873 struct elf_link_hash_entry **sym_hash ATTRIBUTE_UNUSED,
4874 struct elf_link_hash_entry *h,
4875 Elf_Internal_Sym *sym,
4877 bfd_vma *pvalue ATTRIBUTE_UNUSED,
4878 unsigned int *pold_alignment ATTRIBUTE_UNUSED,
4879 bfd_boolean *skip ATTRIBUTE_UNUSED,
4880 bfd_boolean *override ATTRIBUTE_UNUSED,
4881 bfd_boolean *type_change_ok ATTRIBUTE_UNUSED,
4882 bfd_boolean *size_change_ok ATTRIBUTE_UNUSED,
4883 bfd_boolean *newdyn ATTRIBUTE_UNUSED,
4884 bfd_boolean *newdef,
4885 bfd_boolean *newdyncommon ATTRIBUTE_UNUSED,
4886 bfd_boolean *newweak ATTRIBUTE_UNUSED,
4887 bfd *abfd ATTRIBUTE_UNUSED,
4889 bfd_boolean *olddyn ATTRIBUTE_UNUSED,
4890 bfd_boolean *olddef,
4891 bfd_boolean *olddyncommon ATTRIBUTE_UNUSED,
4892 bfd_boolean *oldweak ATTRIBUTE_UNUSED,
4896 /* A normal common symbol and a large common symbol result in a
4897 normal common symbol. We turn the large common symbol into a
4900 && h->root.type == bfd_link_hash_common
4902 && bfd_is_com_section (*sec)
4905 if (sym->st_shndx == SHN_COMMON
4906 && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) != 0)
4908 h->root.u.c.p->section
4909 = bfd_make_section_old_way (oldbfd, "COMMON");
4910 h->root.u.c.p->section->flags = SEC_ALLOC;
4912 else if (sym->st_shndx == SHN_X86_64_LCOMMON
4913 && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) == 0)
4914 *psec = *sec = bfd_com_section_ptr;
4921 elf_x86_64_additional_program_headers (bfd *abfd,
4922 struct bfd_link_info *info ATTRIBUTE_UNUSED)
4927 /* Check to see if we need a large readonly segment. */
4928 s = bfd_get_section_by_name (abfd, ".lrodata");
4929 if (s && (s->flags & SEC_LOAD))
4932 /* Check to see if we need a large data segment. Since .lbss sections
4933 is placed right after the .bss section, there should be no need for
4934 a large data segment just because of .lbss. */
4935 s = bfd_get_section_by_name (abfd, ".ldata");
4936 if (s && (s->flags & SEC_LOAD))
4942 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
4945 elf_x86_64_hash_symbol (struct elf_link_hash_entry *h)
4947 if (h->plt.offset != (bfd_vma) -1
4949 && !h->pointer_equality_needed)
4952 return _bfd_elf_hash_symbol (h);
4955 /* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
4958 elf_x86_64_relocs_compatible (const bfd_target *input,
4959 const bfd_target *output)
4961 return ((xvec_get_elf_backend_data (input)->s->elfclass
4962 == xvec_get_elf_backend_data (output)->s->elfclass)
4963 && _bfd_elf_relocs_compatible (input, output));
4966 static const struct bfd_elf_special_section
4967 elf_x86_64_special_sections[]=
4969 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
4970 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
4971 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
4972 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
4973 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
4974 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
4975 { NULL, 0, 0, 0, 0 }
4978 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_vec
4979 #define TARGET_LITTLE_NAME "elf64-x86-64"
4980 #define ELF_ARCH bfd_arch_i386
4981 #define ELF_TARGET_ID X86_64_ELF_DATA
4982 #define ELF_MACHINE_CODE EM_X86_64
4983 #define ELF_MAXPAGESIZE 0x200000
4984 #define ELF_MINPAGESIZE 0x1000
4985 #define ELF_COMMONPAGESIZE 0x1000
4987 #define elf_backend_can_gc_sections 1
4988 #define elf_backend_can_refcount 1
4989 #define elf_backend_want_got_plt 1
4990 #define elf_backend_plt_readonly 1
4991 #define elf_backend_want_plt_sym 0
4992 #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
4993 #define elf_backend_rela_normal 1
4994 #define elf_backend_plt_alignment 4
4996 #define elf_info_to_howto elf_x86_64_info_to_howto
4998 #define bfd_elf64_bfd_link_hash_table_create \
4999 elf_x86_64_link_hash_table_create
5000 #define bfd_elf64_bfd_link_hash_table_free \
5001 elf_x86_64_link_hash_table_free
5002 #define bfd_elf64_bfd_reloc_type_lookup elf_x86_64_reloc_type_lookup
5003 #define bfd_elf64_bfd_reloc_name_lookup \
5004 elf_x86_64_reloc_name_lookup
5006 #define elf_backend_adjust_dynamic_symbol elf_x86_64_adjust_dynamic_symbol
5007 #define elf_backend_relocs_compatible elf_x86_64_relocs_compatible
5008 #define elf_backend_check_relocs elf_x86_64_check_relocs
5009 #define elf_backend_copy_indirect_symbol elf_x86_64_copy_indirect_symbol
5010 #define elf_backend_create_dynamic_sections elf_x86_64_create_dynamic_sections
5011 #define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
5012 #define elf_backend_finish_dynamic_symbol elf_x86_64_finish_dynamic_symbol
5013 #define elf_backend_gc_mark_hook elf_x86_64_gc_mark_hook
5014 #define elf_backend_gc_sweep_hook elf_x86_64_gc_sweep_hook
5015 #define elf_backend_grok_prstatus elf_x86_64_grok_prstatus
5016 #define elf_backend_grok_psinfo elf_x86_64_grok_psinfo
5018 #define elf_backend_write_core_note elf_x86_64_write_core_note
5020 #define elf_backend_reloc_type_class elf_x86_64_reloc_type_class
5021 #define elf_backend_relocate_section elf_x86_64_relocate_section
5022 #define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections
5023 #define elf_backend_always_size_sections elf_x86_64_always_size_sections
5024 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
5025 #define elf_backend_plt_sym_val elf_x86_64_plt_sym_val
5026 #define elf_backend_object_p elf64_x86_64_elf_object_p
5027 #define bfd_elf64_mkobject elf_x86_64_mkobject
5029 #define elf_backend_section_from_shdr \
5030 elf_x86_64_section_from_shdr
5032 #define elf_backend_section_from_bfd_section \
5033 elf_x86_64_elf_section_from_bfd_section
5034 #define elf_backend_add_symbol_hook \
5035 elf_x86_64_add_symbol_hook
5036 #define elf_backend_symbol_processing \
5037 elf_x86_64_symbol_processing
5038 #define elf_backend_common_section_index \
5039 elf_x86_64_common_section_index
5040 #define elf_backend_common_section \
5041 elf_x86_64_common_section
5042 #define elf_backend_common_definition \
5043 elf_x86_64_common_definition
5044 #define elf_backend_merge_symbol \
5045 elf_x86_64_merge_symbol
5046 #define elf_backend_special_sections \
5047 elf_x86_64_special_sections
5048 #define elf_backend_additional_program_headers \
5049 elf_x86_64_additional_program_headers
5050 #define elf_backend_hash_symbol \
5051 elf_x86_64_hash_symbol
5053 #define elf_backend_post_process_headers _bfd_elf_set_osabi
5055 #include "elf64-target.h"
5057 /* FreeBSD support. */
5059 #undef TARGET_LITTLE_SYM
5060 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_freebsd_vec
5061 #undef TARGET_LITTLE_NAME
5062 #define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
5065 #define ELF_OSABI ELFOSABI_FREEBSD
5068 #define elf64_bed elf64_x86_64_fbsd_bed
5070 #include "elf64-target.h"
5072 /* Solaris 2 support. */
5074 #undef TARGET_LITTLE_SYM
5075 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_sol2_vec
5076 #undef TARGET_LITTLE_NAME
5077 #define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
5079 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
5080 objects won't be recognized. */
5084 #define elf64_bed elf64_x86_64_sol2_bed
5086 /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
5088 #undef elf_backend_static_tls_alignment
5089 #define elf_backend_static_tls_alignment 16
5091 /* The Solaris 2 ABI requires a plt symbol on all platforms.
5093 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
5095 #undef elf_backend_want_plt_sym
5096 #define elf_backend_want_plt_sym 1
5098 #include "elf64-target.h"
5100 /* Native Client support. */
5102 #undef TARGET_LITTLE_SYM
5103 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_nacl_vec
5104 #undef TARGET_LITTLE_NAME
5105 #define TARGET_LITTLE_NAME "elf64-x86-64-nacl"
5107 #define elf64_bed elf64_x86_64_nacl_bed
5109 #undef ELF_MAXPAGESIZE
5110 #undef ELF_MINPAGESIZE
5111 #undef ELF_COMMONPAGESIZE
5112 #define ELF_MAXPAGESIZE 0x10000
5113 #define ELF_MINPAGESIZE 0x10000
5114 #define ELF_COMMONPAGESIZE 0x10000
5116 /* Restore defaults. */
5118 #undef elf_backend_static_tls_alignment
5119 #undef elf_backend_want_plt_sym
5120 #define elf_backend_want_plt_sym 0
5122 /* NaCl uses substantially different PLT entries for the same effects. */
5124 #undef elf_backend_plt_alignment
5125 #define elf_backend_plt_alignment 5
5126 #define NACL_PLT_ENTRY_SIZE 64
5127 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
5129 static const bfd_byte elf_x86_64_nacl_plt0_entry[NACL_PLT_ENTRY_SIZE] =
5131 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
5132 0x4c, 0x8b, 0x1d, 16, 0, 0, 0, /* mov GOT+16(%rip), %r11 */
5133 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
5134 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
5135 0x41, 0xff, 0xe3, /* jmpq *%r11 */
5137 /* 41 bytes of nop to pad out to the standard size. */
5138 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5139 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5140 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5141 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5142 0x66, 0x66, /* excess data32 prefixes */
5143 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5146 static const bfd_byte elf_x86_64_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
5148 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, /* mov name@GOTPCREL(%rip),%r11 */
5149 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
5150 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
5151 0x41, 0xff, 0xe3, /* jmpq *%r11 */
5153 /* 15-byte nop sequence to pad out to the next 32-byte boundary. */
5154 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5155 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5157 /* Lazy GOT entries point here (32-byte aligned). */
5158 0x68, /* pushq immediate */
5159 0, 0, 0, 0, /* replaced with index into relocation table. */
5160 0xe9, /* jmp relative */
5161 0, 0, 0, 0, /* replaced with offset to start of .plt0. */
5163 /* 22 bytes of nop to pad out to the standard size. */
5164 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5165 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5166 0x0f, 0x1f, 0x80, 0, 0, 0, 0, /* nopl 0x0(%rax) */
5169 /* .eh_frame covering the .plt section. */
5171 static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] =
5173 #if (PLT_CIE_LENGTH != 20 \
5174 || PLT_FDE_LENGTH != 36 \
5175 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
5176 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
5177 # error "Need elf_x86_64_backend_data parameters for eh_frame_plt offsets!"
5179 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
5180 0, 0, 0, 0, /* CIE ID */
5181 1, /* CIE version */
5182 'z', 'R', 0, /* Augmentation string */
5183 1, /* Code alignment factor */
5184 0x78, /* Data alignment factor */
5185 16, /* Return address column */
5186 1, /* Augmentation size */
5187 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
5188 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
5189 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
5190 DW_CFA_nop, DW_CFA_nop,
5192 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
5193 PLT_CIE_LENGTH + 8, 0, 0, 0,/* CIE pointer */
5194 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
5195 0, 0, 0, 0, /* .plt size goes here */
5196 0, /* Augmentation size */
5197 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
5198 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
5199 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
5200 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
5201 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
5202 13, /* Block length */
5203 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
5204 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
5205 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
5206 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
5207 DW_CFA_nop, DW_CFA_nop
5210 static const struct elf_x86_64_backend_data elf_x86_64_nacl_arch_bed =
5212 elf_x86_64_nacl_plt0_entry, /* plt0_entry */
5213 elf_x86_64_nacl_plt_entry, /* plt_entry */
5214 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
5215 2, /* plt0_got1_offset */
5216 9, /* plt0_got2_offset */
5217 13, /* plt0_got2_insn_end */
5218 3, /* plt_got_offset */
5219 33, /* plt_reloc_offset */
5220 38, /* plt_plt_offset */
5221 7, /* plt_got_insn_size */
5222 42, /* plt_plt_insn_end */
5223 32, /* plt_lazy_offset */
5224 elf_x86_64_nacl_eh_frame_plt, /* eh_frame_plt */
5225 sizeof (elf_x86_64_nacl_eh_frame_plt), /* eh_frame_plt_size */
5228 #undef elf_backend_arch_data
5229 #define elf_backend_arch_data &elf_x86_64_nacl_arch_bed
5231 #undef elf_backend_modify_segment_map
5232 #define elf_backend_modify_segment_map nacl_modify_segment_map
5233 #undef elf_backend_modify_program_headers
5234 #define elf_backend_modify_program_headers nacl_modify_program_headers
5236 #include "elf64-target.h"
5238 /* Native Client x32 support. */
5240 #undef TARGET_LITTLE_SYM
5241 #define TARGET_LITTLE_SYM bfd_elf32_x86_64_nacl_vec
5242 #undef TARGET_LITTLE_NAME
5243 #define TARGET_LITTLE_NAME "elf32-x86-64-nacl"
5245 #define elf32_bed elf32_x86_64_nacl_bed
5247 #define bfd_elf32_bfd_link_hash_table_create \
5248 elf_x86_64_link_hash_table_create
5249 #define bfd_elf32_bfd_link_hash_table_free \
5250 elf_x86_64_link_hash_table_free
5251 #define bfd_elf32_bfd_reloc_type_lookup \
5252 elf_x86_64_reloc_type_lookup
5253 #define bfd_elf32_bfd_reloc_name_lookup \
5254 elf_x86_64_reloc_name_lookup
5255 #define bfd_elf32_mkobject \
5258 #undef elf_backend_object_p
5259 #define elf_backend_object_p \
5260 elf32_x86_64_elf_object_p
5262 #undef elf_backend_bfd_from_remote_memory
5263 #define elf_backend_bfd_from_remote_memory \
5264 _bfd_elf32_bfd_from_remote_memory
5266 #undef elf_backend_size_info
5267 #define elf_backend_size_info \
5268 _bfd_elf32_size_info
5270 #include "elf32-target.h"
5272 /* Restore defaults. */
5273 #undef elf_backend_object_p
5274 #define elf_backend_object_p elf64_x86_64_elf_object_p
5275 #undef elf_backend_bfd_from_remote_memory
5276 #undef elf_backend_size_info
5277 #undef elf_backend_modify_segment_map
5278 #undef elf_backend_modify_program_headers
5280 /* Intel L1OM support. */
5283 elf64_l1om_elf_object_p (bfd *abfd)
5285 /* Set the right machine number for an L1OM elf64 file. */
5286 bfd_default_set_arch_mach (abfd, bfd_arch_l1om, bfd_mach_l1om);
5290 #undef TARGET_LITTLE_SYM
5291 #define TARGET_LITTLE_SYM bfd_elf64_l1om_vec
5292 #undef TARGET_LITTLE_NAME
5293 #define TARGET_LITTLE_NAME "elf64-l1om"
5295 #define ELF_ARCH bfd_arch_l1om
5297 #undef ELF_MACHINE_CODE
5298 #define ELF_MACHINE_CODE EM_L1OM
5303 #define elf64_bed elf64_l1om_bed
5305 #undef elf_backend_object_p
5306 #define elf_backend_object_p elf64_l1om_elf_object_p
5308 /* Restore defaults. */
5309 #undef ELF_MAXPAGESIZE
5310 #undef ELF_MINPAGESIZE
5311 #undef ELF_COMMONPAGESIZE
5312 #define ELF_MAXPAGESIZE 0x200000
5313 #define ELF_MINPAGESIZE 0x1000
5314 #define ELF_COMMONPAGESIZE 0x1000
5315 #undef elf_backend_plt_alignment
5316 #define elf_backend_plt_alignment 4
5317 #undef elf_backend_arch_data
5318 #define elf_backend_arch_data &elf_x86_64_arch_bed
5320 #include "elf64-target.h"
5322 /* FreeBSD L1OM support. */
5324 #undef TARGET_LITTLE_SYM
5325 #define TARGET_LITTLE_SYM bfd_elf64_l1om_freebsd_vec
5326 #undef TARGET_LITTLE_NAME
5327 #define TARGET_LITTLE_NAME "elf64-l1om-freebsd"
5330 #define ELF_OSABI ELFOSABI_FREEBSD
5333 #define elf64_bed elf64_l1om_fbsd_bed
5335 #include "elf64-target.h"
5337 /* Intel K1OM support. */
5340 elf64_k1om_elf_object_p (bfd *abfd)
5342 /* Set the right machine number for an K1OM elf64 file. */
5343 bfd_default_set_arch_mach (abfd, bfd_arch_k1om, bfd_mach_k1om);
5347 #undef TARGET_LITTLE_SYM
5348 #define TARGET_LITTLE_SYM bfd_elf64_k1om_vec
5349 #undef TARGET_LITTLE_NAME
5350 #define TARGET_LITTLE_NAME "elf64-k1om"
5352 #define ELF_ARCH bfd_arch_k1om
5354 #undef ELF_MACHINE_CODE
5355 #define ELF_MACHINE_CODE EM_K1OM
5360 #define elf64_bed elf64_k1om_bed
5362 #undef elf_backend_object_p
5363 #define elf_backend_object_p elf64_k1om_elf_object_p
5365 #undef elf_backend_static_tls_alignment
5367 #undef elf_backend_want_plt_sym
5368 #define elf_backend_want_plt_sym 0
5370 #include "elf64-target.h"
5372 /* FreeBSD K1OM support. */
5374 #undef TARGET_LITTLE_SYM
5375 #define TARGET_LITTLE_SYM bfd_elf64_k1om_freebsd_vec
5376 #undef TARGET_LITTLE_NAME
5377 #define TARGET_LITTLE_NAME "elf64-k1om-freebsd"
5380 #define ELF_OSABI ELFOSABI_FREEBSD
5383 #define elf64_bed elf64_k1om_fbsd_bed
5385 #include "elf64-target.h"
5387 /* 32bit x86-64 support. */
5389 #undef TARGET_LITTLE_SYM
5390 #define TARGET_LITTLE_SYM bfd_elf32_x86_64_vec
5391 #undef TARGET_LITTLE_NAME
5392 #define TARGET_LITTLE_NAME "elf32-x86-64"
5396 #define ELF_ARCH bfd_arch_i386
5398 #undef ELF_MACHINE_CODE
5399 #define ELF_MACHINE_CODE EM_X86_64
5403 #undef elf_backend_object_p
5404 #define elf_backend_object_p \
5405 elf32_x86_64_elf_object_p
5407 #undef elf_backend_bfd_from_remote_memory
5408 #define elf_backend_bfd_from_remote_memory \
5409 _bfd_elf32_bfd_from_remote_memory
5411 #undef elf_backend_size_info
5412 #define elf_backend_size_info \
5413 _bfd_elf32_size_info
5415 #include "elf32-target.h"