Drop non-prototype C function header variants: 'sepdebug' test case
[binutils-gdb.git] / bfd / elf64-x86-64.c
blobd0ed8a7e0769aef1d7c40b4563306e2805f4ec3c
1 /* X86-64 specific support for ELF
2 Copyright (C) 2000-2014 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka <jh@suse.cz>.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "bfdlink.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27 #include "elf-nacl.h"
28 #include "bfd_stdint.h"
29 #include "objalloc.h"
30 #include "hashtab.h"
31 #include "dwarf2.h"
32 #include "libiberty.h"
34 #include "elf/x86-64.h"
36 #ifdef CORE_HEADER
37 #include <stdarg.h>
38 #include CORE_HEADER
39 #endif
41 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
42 #define MINUS_ONE (~ (bfd_vma) 0)
44 /* Since both 32-bit and 64-bit x86-64 encode relocation type in the
45 identical manner, we use ELF32_R_TYPE instead of ELF64_R_TYPE to get
46 relocation type. We also use ELF_ST_TYPE instead of ELF64_ST_TYPE
47 since they are the same. */
49 #define ABI_64_P(abfd) \
50 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
52 /* The relocation "howto" table. Order of fields:
53 type, rightshift, size, bitsize, pc_relative, bitpos, complain_on_overflow,
54 special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset. */
55 static reloc_howto_type x86_64_elf_howto_table[] =
57 HOWTO(R_X86_64_NONE, 0, 0, 0, FALSE, 0, complain_overflow_dont,
58 bfd_elf_generic_reloc, "R_X86_64_NONE", FALSE, 0x00000000, 0x00000000,
59 FALSE),
60 HOWTO(R_X86_64_64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
61 bfd_elf_generic_reloc, "R_X86_64_64", FALSE, MINUS_ONE, MINUS_ONE,
62 FALSE),
63 HOWTO(R_X86_64_PC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
64 bfd_elf_generic_reloc, "R_X86_64_PC32", FALSE, 0xffffffff, 0xffffffff,
65 TRUE),
66 HOWTO(R_X86_64_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
67 bfd_elf_generic_reloc, "R_X86_64_GOT32", FALSE, 0xffffffff, 0xffffffff,
68 FALSE),
69 HOWTO(R_X86_64_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
70 bfd_elf_generic_reloc, "R_X86_64_PLT32", FALSE, 0xffffffff, 0xffffffff,
71 TRUE),
72 HOWTO(R_X86_64_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
73 bfd_elf_generic_reloc, "R_X86_64_COPY", FALSE, 0xffffffff, 0xffffffff,
74 FALSE),
75 HOWTO(R_X86_64_GLOB_DAT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
76 bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", FALSE, MINUS_ONE,
77 MINUS_ONE, FALSE),
78 HOWTO(R_X86_64_JUMP_SLOT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
79 bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", FALSE, MINUS_ONE,
80 MINUS_ONE, FALSE),
81 HOWTO(R_X86_64_RELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
82 bfd_elf_generic_reloc, "R_X86_64_RELATIVE", FALSE, MINUS_ONE,
83 MINUS_ONE, FALSE),
84 HOWTO(R_X86_64_GOTPCREL, 0, 2, 32, TRUE, 0, complain_overflow_signed,
85 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", FALSE, 0xffffffff,
86 0xffffffff, TRUE),
87 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
88 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
89 FALSE),
90 HOWTO(R_X86_64_32S, 0, 2, 32, FALSE, 0, complain_overflow_signed,
91 bfd_elf_generic_reloc, "R_X86_64_32S", FALSE, 0xffffffff, 0xffffffff,
92 FALSE),
93 HOWTO(R_X86_64_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
94 bfd_elf_generic_reloc, "R_X86_64_16", FALSE, 0xffff, 0xffff, FALSE),
95 HOWTO(R_X86_64_PC16,0, 1, 16, TRUE, 0, complain_overflow_bitfield,
96 bfd_elf_generic_reloc, "R_X86_64_PC16", FALSE, 0xffff, 0xffff, TRUE),
97 HOWTO(R_X86_64_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
98 bfd_elf_generic_reloc, "R_X86_64_8", FALSE, 0xff, 0xff, FALSE),
99 HOWTO(R_X86_64_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
100 bfd_elf_generic_reloc, "R_X86_64_PC8", FALSE, 0xff, 0xff, TRUE),
101 HOWTO(R_X86_64_DTPMOD64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
102 bfd_elf_generic_reloc, "R_X86_64_DTPMOD64", FALSE, MINUS_ONE,
103 MINUS_ONE, FALSE),
104 HOWTO(R_X86_64_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
105 bfd_elf_generic_reloc, "R_X86_64_DTPOFF64", FALSE, MINUS_ONE,
106 MINUS_ONE, FALSE),
107 HOWTO(R_X86_64_TPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
108 bfd_elf_generic_reloc, "R_X86_64_TPOFF64", FALSE, MINUS_ONE,
109 MINUS_ONE, FALSE),
110 HOWTO(R_X86_64_TLSGD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
111 bfd_elf_generic_reloc, "R_X86_64_TLSGD", FALSE, 0xffffffff,
112 0xffffffff, TRUE),
113 HOWTO(R_X86_64_TLSLD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
114 bfd_elf_generic_reloc, "R_X86_64_TLSLD", FALSE, 0xffffffff,
115 0xffffffff, TRUE),
116 HOWTO(R_X86_64_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
117 bfd_elf_generic_reloc, "R_X86_64_DTPOFF32", FALSE, 0xffffffff,
118 0xffffffff, FALSE),
119 HOWTO(R_X86_64_GOTTPOFF, 0, 2, 32, TRUE, 0, complain_overflow_signed,
120 bfd_elf_generic_reloc, "R_X86_64_GOTTPOFF", FALSE, 0xffffffff,
121 0xffffffff, TRUE),
122 HOWTO(R_X86_64_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
123 bfd_elf_generic_reloc, "R_X86_64_TPOFF32", FALSE, 0xffffffff,
124 0xffffffff, FALSE),
125 HOWTO(R_X86_64_PC64, 0, 4, 64, TRUE, 0, complain_overflow_bitfield,
126 bfd_elf_generic_reloc, "R_X86_64_PC64", FALSE, MINUS_ONE, MINUS_ONE,
127 TRUE),
128 HOWTO(R_X86_64_GOTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
129 bfd_elf_generic_reloc, "R_X86_64_GOTOFF64",
130 FALSE, MINUS_ONE, MINUS_ONE, FALSE),
131 HOWTO(R_X86_64_GOTPC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
132 bfd_elf_generic_reloc, "R_X86_64_GOTPC32",
133 FALSE, 0xffffffff, 0xffffffff, TRUE),
134 HOWTO(R_X86_64_GOT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
135 bfd_elf_generic_reloc, "R_X86_64_GOT64", FALSE, MINUS_ONE, MINUS_ONE,
136 FALSE),
137 HOWTO(R_X86_64_GOTPCREL64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
138 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL64", FALSE, MINUS_ONE,
139 MINUS_ONE, TRUE),
140 HOWTO(R_X86_64_GOTPC64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
141 bfd_elf_generic_reloc, "R_X86_64_GOTPC64",
142 FALSE, MINUS_ONE, MINUS_ONE, TRUE),
143 HOWTO(R_X86_64_GOTPLT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
144 bfd_elf_generic_reloc, "R_X86_64_GOTPLT64", FALSE, MINUS_ONE,
145 MINUS_ONE, FALSE),
146 HOWTO(R_X86_64_PLTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
147 bfd_elf_generic_reloc, "R_X86_64_PLTOFF64", FALSE, MINUS_ONE,
148 MINUS_ONE, FALSE),
149 HOWTO(R_X86_64_SIZE32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
150 bfd_elf_generic_reloc, "R_X86_64_SIZE32", FALSE, 0xffffffff, 0xffffffff,
151 FALSE),
152 HOWTO(R_X86_64_SIZE64, 0, 4, 64, FALSE, 0, complain_overflow_unsigned,
153 bfd_elf_generic_reloc, "R_X86_64_SIZE64", FALSE, MINUS_ONE, MINUS_ONE,
154 FALSE),
155 HOWTO(R_X86_64_GOTPC32_TLSDESC, 0, 2, 32, TRUE, 0,
156 complain_overflow_bitfield, bfd_elf_generic_reloc,
157 "R_X86_64_GOTPC32_TLSDESC",
158 FALSE, 0xffffffff, 0xffffffff, TRUE),
159 HOWTO(R_X86_64_TLSDESC_CALL, 0, 0, 0, FALSE, 0,
160 complain_overflow_dont, bfd_elf_generic_reloc,
161 "R_X86_64_TLSDESC_CALL",
162 FALSE, 0, 0, FALSE),
163 HOWTO(R_X86_64_TLSDESC, 0, 4, 64, FALSE, 0,
164 complain_overflow_bitfield, bfd_elf_generic_reloc,
165 "R_X86_64_TLSDESC",
166 FALSE, MINUS_ONE, MINUS_ONE, FALSE),
167 HOWTO(R_X86_64_IRELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
168 bfd_elf_generic_reloc, "R_X86_64_IRELATIVE", FALSE, MINUS_ONE,
169 MINUS_ONE, FALSE),
170 HOWTO(R_X86_64_RELATIVE64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
171 bfd_elf_generic_reloc, "R_X86_64_RELATIVE64", FALSE, MINUS_ONE,
172 MINUS_ONE, FALSE),
173 HOWTO(R_X86_64_PC32_BND, 0, 2, 32, TRUE, 0, complain_overflow_signed,
174 bfd_elf_generic_reloc, "R_X86_64_PC32_BND", FALSE, 0xffffffff, 0xffffffff,
175 TRUE),
176 HOWTO(R_X86_64_PLT32_BND, 0, 2, 32, TRUE, 0, complain_overflow_signed,
177 bfd_elf_generic_reloc, "R_X86_64_PLT32_BND", FALSE, 0xffffffff, 0xffffffff,
178 TRUE),
180 /* We have a gap in the reloc numbers here.
181 R_X86_64_standard counts the number up to this point, and
182 R_X86_64_vt_offset is the value to subtract from a reloc type of
183 R_X86_64_GNU_VT* to form an index into this table. */
184 #define R_X86_64_standard (R_X86_64_PLT32_BND + 1)
185 #define R_X86_64_vt_offset (R_X86_64_GNU_VTINHERIT - R_X86_64_standard)
187 /* GNU extension to record C++ vtable hierarchy. */
188 HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, FALSE, 0, complain_overflow_dont,
189 NULL, "R_X86_64_GNU_VTINHERIT", FALSE, 0, 0, FALSE),
191 /* GNU extension to record C++ vtable member usage. */
192 HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, FALSE, 0, complain_overflow_dont,
193 _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", FALSE, 0, 0,
194 FALSE),
196 /* Use complain_overflow_bitfield on R_X86_64_32 for x32. */
197 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
198 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
199 FALSE)
202 #define IS_X86_64_PCREL_TYPE(TYPE) \
203 ( ((TYPE) == R_X86_64_PC8) \
204 || ((TYPE) == R_X86_64_PC16) \
205 || ((TYPE) == R_X86_64_PC32) \
206 || ((TYPE) == R_X86_64_PC32_BND) \
207 || ((TYPE) == R_X86_64_PC64))
209 /* Map BFD relocs to the x86_64 elf relocs. */
210 struct elf_reloc_map
212 bfd_reloc_code_real_type bfd_reloc_val;
213 unsigned char elf_reloc_val;
216 static const struct elf_reloc_map x86_64_reloc_map[] =
218 { BFD_RELOC_NONE, R_X86_64_NONE, },
219 { BFD_RELOC_64, R_X86_64_64, },
220 { BFD_RELOC_32_PCREL, R_X86_64_PC32, },
221 { BFD_RELOC_X86_64_GOT32, R_X86_64_GOT32,},
222 { BFD_RELOC_X86_64_PLT32, R_X86_64_PLT32,},
223 { BFD_RELOC_X86_64_COPY, R_X86_64_COPY, },
224 { BFD_RELOC_X86_64_GLOB_DAT, R_X86_64_GLOB_DAT, },
225 { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, },
226 { BFD_RELOC_X86_64_RELATIVE, R_X86_64_RELATIVE, },
227 { BFD_RELOC_X86_64_GOTPCREL, R_X86_64_GOTPCREL, },
228 { BFD_RELOC_32, R_X86_64_32, },
229 { BFD_RELOC_X86_64_32S, R_X86_64_32S, },
230 { BFD_RELOC_16, R_X86_64_16, },
231 { BFD_RELOC_16_PCREL, R_X86_64_PC16, },
232 { BFD_RELOC_8, R_X86_64_8, },
233 { BFD_RELOC_8_PCREL, R_X86_64_PC8, },
234 { BFD_RELOC_X86_64_DTPMOD64, R_X86_64_DTPMOD64, },
235 { BFD_RELOC_X86_64_DTPOFF64, R_X86_64_DTPOFF64, },
236 { BFD_RELOC_X86_64_TPOFF64, R_X86_64_TPOFF64, },
237 { BFD_RELOC_X86_64_TLSGD, R_X86_64_TLSGD, },
238 { BFD_RELOC_X86_64_TLSLD, R_X86_64_TLSLD, },
239 { BFD_RELOC_X86_64_DTPOFF32, R_X86_64_DTPOFF32, },
240 { BFD_RELOC_X86_64_GOTTPOFF, R_X86_64_GOTTPOFF, },
241 { BFD_RELOC_X86_64_TPOFF32, R_X86_64_TPOFF32, },
242 { BFD_RELOC_64_PCREL, R_X86_64_PC64, },
243 { BFD_RELOC_X86_64_GOTOFF64, R_X86_64_GOTOFF64, },
244 { BFD_RELOC_X86_64_GOTPC32, R_X86_64_GOTPC32, },
245 { BFD_RELOC_X86_64_GOT64, R_X86_64_GOT64, },
246 { BFD_RELOC_X86_64_GOTPCREL64,R_X86_64_GOTPCREL64, },
247 { BFD_RELOC_X86_64_GOTPC64, R_X86_64_GOTPC64, },
248 { BFD_RELOC_X86_64_GOTPLT64, R_X86_64_GOTPLT64, },
249 { BFD_RELOC_X86_64_PLTOFF64, R_X86_64_PLTOFF64, },
250 { BFD_RELOC_SIZE32, R_X86_64_SIZE32, },
251 { BFD_RELOC_SIZE64, R_X86_64_SIZE64, },
252 { BFD_RELOC_X86_64_GOTPC32_TLSDESC, R_X86_64_GOTPC32_TLSDESC, },
253 { BFD_RELOC_X86_64_TLSDESC_CALL, R_X86_64_TLSDESC_CALL, },
254 { BFD_RELOC_X86_64_TLSDESC, R_X86_64_TLSDESC, },
255 { BFD_RELOC_X86_64_IRELATIVE, R_X86_64_IRELATIVE, },
256 { BFD_RELOC_X86_64_PC32_BND, R_X86_64_PC32_BND,},
257 { BFD_RELOC_X86_64_PLT32_BND, R_X86_64_PLT32_BND,},
258 { BFD_RELOC_VTABLE_INHERIT, R_X86_64_GNU_VTINHERIT, },
259 { BFD_RELOC_VTABLE_ENTRY, R_X86_64_GNU_VTENTRY, },
262 static reloc_howto_type *
263 elf_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type)
265 unsigned i;
267 if (r_type == (unsigned int) R_X86_64_32)
269 if (ABI_64_P (abfd))
270 i = r_type;
271 else
272 i = ARRAY_SIZE (x86_64_elf_howto_table) - 1;
274 else if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT
275 || r_type >= (unsigned int) R_X86_64_max)
277 if (r_type >= (unsigned int) R_X86_64_standard)
279 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
280 abfd, (int) r_type);
281 r_type = R_X86_64_NONE;
283 i = r_type;
285 else
286 i = r_type - (unsigned int) R_X86_64_vt_offset;
287 BFD_ASSERT (x86_64_elf_howto_table[i].type == r_type);
288 return &x86_64_elf_howto_table[i];
291 /* Given a BFD reloc type, return a HOWTO structure. */
292 static reloc_howto_type *
293 elf_x86_64_reloc_type_lookup (bfd *abfd,
294 bfd_reloc_code_real_type code)
296 unsigned int i;
298 for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
299 i++)
301 if (x86_64_reloc_map[i].bfd_reloc_val == code)
302 return elf_x86_64_rtype_to_howto (abfd,
303 x86_64_reloc_map[i].elf_reloc_val);
305 return 0;
308 static reloc_howto_type *
309 elf_x86_64_reloc_name_lookup (bfd *abfd,
310 const char *r_name)
312 unsigned int i;
314 if (!ABI_64_P (abfd) && strcasecmp (r_name, "R_X86_64_32") == 0)
316 /* Get x32 R_X86_64_32. */
317 reloc_howto_type *reloc
318 = &x86_64_elf_howto_table[ARRAY_SIZE (x86_64_elf_howto_table) - 1];
319 BFD_ASSERT (reloc->type == (unsigned int) R_X86_64_32);
320 return reloc;
323 for (i = 0; i < ARRAY_SIZE (x86_64_elf_howto_table); i++)
324 if (x86_64_elf_howto_table[i].name != NULL
325 && strcasecmp (x86_64_elf_howto_table[i].name, r_name) == 0)
326 return &x86_64_elf_howto_table[i];
328 return NULL;
331 /* Given an x86_64 ELF reloc type, fill in an arelent structure. */
333 static void
334 elf_x86_64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
335 Elf_Internal_Rela *dst)
337 unsigned r_type;
339 r_type = ELF32_R_TYPE (dst->r_info);
340 cache_ptr->howto = elf_x86_64_rtype_to_howto (abfd, r_type);
341 BFD_ASSERT (r_type == cache_ptr->howto->type);
344 /* Support for core dump NOTE sections. */
345 static bfd_boolean
346 elf_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
348 int offset;
349 size_t size;
351 switch (note->descsz)
353 default:
354 return FALSE;
356 case 296: /* sizeof(istruct elf_prstatus) on Linux/x32 */
357 /* pr_cursig */
358 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
360 /* pr_pid */
361 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
363 /* pr_reg */
364 offset = 72;
365 size = 216;
367 break;
369 case 336: /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
370 /* pr_cursig */
371 elf_tdata (abfd)->core->signal
372 = bfd_get_16 (abfd, note->descdata + 12);
374 /* pr_pid */
375 elf_tdata (abfd)->core->lwpid
376 = bfd_get_32 (abfd, note->descdata + 32);
378 /* pr_reg */
379 offset = 112;
380 size = 216;
382 break;
385 /* Make a ".reg/999" section. */
386 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
387 size, note->descpos + offset);
390 static bfd_boolean
391 elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
393 switch (note->descsz)
395 default:
396 return FALSE;
398 case 124: /* sizeof(struct elf_prpsinfo) on Linux/x32 */
399 elf_tdata (abfd)->core->pid
400 = bfd_get_32 (abfd, note->descdata + 12);
401 elf_tdata (abfd)->core->program
402 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
403 elf_tdata (abfd)->core->command
404 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
405 break;
407 case 136: /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
408 elf_tdata (abfd)->core->pid
409 = bfd_get_32 (abfd, note->descdata + 24);
410 elf_tdata (abfd)->core->program
411 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
412 elf_tdata (abfd)->core->command
413 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
416 /* Note that for some reason, a spurious space is tacked
417 onto the end of the args in some (at least one anyway)
418 implementations, so strip it off if it exists. */
421 char *command = elf_tdata (abfd)->core->command;
422 int n = strlen (command);
424 if (0 < n && command[n - 1] == ' ')
425 command[n - 1] = '\0';
428 return TRUE;
431 #ifdef CORE_HEADER
432 static char *
433 elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
434 int note_type, ...)
436 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
437 va_list ap;
438 const char *fname, *psargs;
439 long pid;
440 int cursig;
441 const void *gregs;
443 switch (note_type)
445 default:
446 return NULL;
448 case NT_PRPSINFO:
449 va_start (ap, note_type);
450 fname = va_arg (ap, const char *);
451 psargs = va_arg (ap, const char *);
452 va_end (ap);
454 if (bed->s->elfclass == ELFCLASS32)
456 prpsinfo32_t data;
457 memset (&data, 0, sizeof (data));
458 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
459 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
460 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
461 &data, sizeof (data));
463 else
465 prpsinfo64_t data;
466 memset (&data, 0, sizeof (data));
467 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
468 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
469 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
470 &data, sizeof (data));
472 /* NOTREACHED */
474 case NT_PRSTATUS:
475 va_start (ap, note_type);
476 pid = va_arg (ap, long);
477 cursig = va_arg (ap, int);
478 gregs = va_arg (ap, const void *);
479 va_end (ap);
481 if (bed->s->elfclass == ELFCLASS32)
483 if (bed->elf_machine_code == EM_X86_64)
485 prstatusx32_t prstat;
486 memset (&prstat, 0, sizeof (prstat));
487 prstat.pr_pid = pid;
488 prstat.pr_cursig = cursig;
489 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
490 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
491 &prstat, sizeof (prstat));
493 else
495 prstatus32_t prstat;
496 memset (&prstat, 0, sizeof (prstat));
497 prstat.pr_pid = pid;
498 prstat.pr_cursig = cursig;
499 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
500 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
501 &prstat, sizeof (prstat));
504 else
506 prstatus64_t prstat;
507 memset (&prstat, 0, sizeof (prstat));
508 prstat.pr_pid = pid;
509 prstat.pr_cursig = cursig;
510 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
511 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
512 &prstat, sizeof (prstat));
515 /* NOTREACHED */
517 #endif
519 /* Functions for the x86-64 ELF linker. */
521 /* The name of the dynamic interpreter. This is put in the .interp
522 section. */
524 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
525 #define ELF32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
527 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
528 copying dynamic variables from a shared lib into an app's dynbss
529 section, and instead use a dynamic relocation to point into the
530 shared lib. */
531 #define ELIMINATE_COPY_RELOCS 1
533 /* The size in bytes of an entry in the global offset table. */
535 #define GOT_ENTRY_SIZE 8
537 /* The size in bytes of an entry in the procedure linkage table. */
539 #define PLT_ENTRY_SIZE 16
541 /* The first entry in a procedure linkage table looks like this. See the
542 SVR4 ABI i386 supplement and the x86-64 ABI to see how this works. */
544 static const bfd_byte elf_x86_64_plt0_entry[PLT_ENTRY_SIZE] =
546 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
547 0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */
548 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */
551 /* Subsequent entries in a procedure linkage table look like this. */
553 static const bfd_byte elf_x86_64_plt_entry[PLT_ENTRY_SIZE] =
555 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
556 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
557 0x68, /* pushq immediate */
558 0, 0, 0, 0, /* replaced with index into relocation table. */
559 0xe9, /* jmp relative */
560 0, 0, 0, 0 /* replaced with offset to start of .plt0. */
563 /* The first entry in a procedure linkage table with BND relocations
564 like this. */
566 static const bfd_byte elf_x86_64_bnd_plt0_entry[PLT_ENTRY_SIZE] =
568 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
569 0xf2, 0xff, 0x25, 16, 0, 0, 0, /* bnd jmpq *GOT+16(%rip) */
570 0x0f, 0x1f, 0 /* nopl (%rax) */
573 /* Subsequent entries for legacy branches in a procedure linkage table
574 with BND relocations look like this. */
576 static const bfd_byte elf_x86_64_legacy_plt_entry[PLT_ENTRY_SIZE] =
578 0x68, 0, 0, 0, 0, /* pushq immediate */
579 0xe9, 0, 0, 0, 0, /* jmpq relative */
580 0x66, 0x0f, 0x1f, 0x44, 0, 0 /* nopw (%rax,%rax,1) */
583 /* Subsequent entries for branches with BND prefx in a procedure linkage
584 table with BND relocations look like this. */
586 static const bfd_byte elf_x86_64_bnd_plt_entry[PLT_ENTRY_SIZE] =
588 0x68, 0, 0, 0, 0, /* pushq immediate */
589 0xf2, 0xe9, 0, 0, 0, 0, /* bnd jmpq relative */
590 0x0f, 0x1f, 0x44, 0, 0 /* nopl 0(%rax,%rax,1) */
593 /* Entries for legacy branches in the second procedure linkage table
594 look like this. */
596 static const bfd_byte elf_x86_64_legacy_plt2_entry[8] =
598 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
599 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
600 0x66, 0x90 /* xchg %ax,%ax */
603 /* Entries for branches with BND prefix in the second procedure linkage
604 table look like this. */
606 static const bfd_byte elf_x86_64_bnd_plt2_entry[8] =
608 0xf2, 0xff, 0x25, /* bnd jmpq *name@GOTPC(%rip) */
609 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
610 0x90 /* nop */
613 /* .eh_frame covering the .plt section. */
615 static const bfd_byte elf_x86_64_eh_frame_plt[] =
617 #define PLT_CIE_LENGTH 20
618 #define PLT_FDE_LENGTH 36
619 #define PLT_FDE_START_OFFSET 4 + PLT_CIE_LENGTH + 8
620 #define PLT_FDE_LEN_OFFSET 4 + PLT_CIE_LENGTH + 12
621 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
622 0, 0, 0, 0, /* CIE ID */
623 1, /* CIE version */
624 'z', 'R', 0, /* Augmentation string */
625 1, /* Code alignment factor */
626 0x78, /* Data alignment factor */
627 16, /* Return address column */
628 1, /* Augmentation size */
629 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
630 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
631 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
632 DW_CFA_nop, DW_CFA_nop,
634 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
635 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
636 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
637 0, 0, 0, 0, /* .plt size goes here */
638 0, /* Augmentation size */
639 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
640 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
641 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
642 DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
643 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
644 11, /* Block length */
645 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
646 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
647 DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
648 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
649 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
652 /* Architecture-specific backend data for x86-64. */
654 struct elf_x86_64_backend_data
656 /* Templates for the initial PLT entry and for subsequent entries. */
657 const bfd_byte *plt0_entry;
658 const bfd_byte *plt_entry;
659 unsigned int plt_entry_size; /* Size of each PLT entry. */
661 /* Offsets into plt0_entry that are to be replaced with GOT[1] and GOT[2]. */
662 unsigned int plt0_got1_offset;
663 unsigned int plt0_got2_offset;
665 /* Offset of the end of the PC-relative instruction containing
666 plt0_got2_offset. */
667 unsigned int plt0_got2_insn_end;
669 /* Offsets into plt_entry that are to be replaced with... */
670 unsigned int plt_got_offset; /* ... address of this symbol in .got. */
671 unsigned int plt_reloc_offset; /* ... offset into relocation table. */
672 unsigned int plt_plt_offset; /* ... offset to start of .plt. */
674 /* Length of the PC-relative instruction containing plt_got_offset. */
675 unsigned int plt_got_insn_size;
677 /* Offset of the end of the PC-relative jump to plt0_entry. */
678 unsigned int plt_plt_insn_end;
680 /* Offset into plt_entry where the initial value of the GOT entry points. */
681 unsigned int plt_lazy_offset;
683 /* .eh_frame covering the .plt section. */
684 const bfd_byte *eh_frame_plt;
685 unsigned int eh_frame_plt_size;
688 #define get_elf_x86_64_arch_data(bed) \
689 ((const struct elf_x86_64_backend_data *) (bed)->arch_data)
691 #define get_elf_x86_64_backend_data(abfd) \
692 get_elf_x86_64_arch_data (get_elf_backend_data (abfd))
694 #define GET_PLT_ENTRY_SIZE(abfd) \
695 get_elf_x86_64_backend_data (abfd)->plt_entry_size
697 /* These are the standard parameters. */
698 static const struct elf_x86_64_backend_data elf_x86_64_arch_bed =
700 elf_x86_64_plt0_entry, /* plt0_entry */
701 elf_x86_64_plt_entry, /* plt_entry */
702 sizeof (elf_x86_64_plt_entry), /* plt_entry_size */
703 2, /* plt0_got1_offset */
704 8, /* plt0_got2_offset */
705 12, /* plt0_got2_insn_end */
706 2, /* plt_got_offset */
707 7, /* plt_reloc_offset */
708 12, /* plt_plt_offset */
709 6, /* plt_got_insn_size */
710 PLT_ENTRY_SIZE, /* plt_plt_insn_end */
711 6, /* plt_lazy_offset */
712 elf_x86_64_eh_frame_plt, /* eh_frame_plt */
713 sizeof (elf_x86_64_eh_frame_plt), /* eh_frame_plt_size */
716 static const struct elf_x86_64_backend_data elf_x86_64_bnd_arch_bed =
718 elf_x86_64_bnd_plt0_entry, /* plt0_entry */
719 elf_x86_64_bnd_plt_entry, /* plt_entry */
720 sizeof (elf_x86_64_bnd_plt_entry), /* plt_entry_size */
721 2, /* plt0_got1_offset */
722 1+8, /* plt0_got2_offset */
723 1+12, /* plt0_got2_insn_end */
724 1+2, /* plt_got_offset */
725 1, /* plt_reloc_offset */
726 7, /* plt_plt_offset */
727 1+6, /* plt_got_insn_size */
728 11, /* plt_plt_insn_end */
729 0, /* plt_lazy_offset */
730 elf_x86_64_eh_frame_plt, /* eh_frame_plt */
731 sizeof (elf_x86_64_eh_frame_plt), /* eh_frame_plt_size */
734 #define elf_backend_arch_data &elf_x86_64_arch_bed
736 /* x86-64 ELF linker hash entry. */
738 struct elf_x86_64_link_hash_entry
740 struct elf_link_hash_entry elf;
742 /* Track dynamic relocs copied for this symbol. */
743 struct elf_dyn_relocs *dyn_relocs;
745 #define GOT_UNKNOWN 0
746 #define GOT_NORMAL 1
747 #define GOT_TLS_GD 2
748 #define GOT_TLS_IE 3
749 #define GOT_TLS_GDESC 4
750 #define GOT_TLS_GD_BOTH_P(type) \
751 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
752 #define GOT_TLS_GD_P(type) \
753 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
754 #define GOT_TLS_GDESC_P(type) \
755 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
756 #define GOT_TLS_GD_ANY_P(type) \
757 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
758 unsigned char tls_type;
760 /* TRUE if symbol has at least one BND relocation. */
761 bfd_boolean has_bnd_reloc;
763 /* Information about the second PLT entry. Filled when has_bnd_reloc is
764 set. */
765 union gotplt_union plt_bnd;
767 /* Offset of the GOTPLT entry reserved for the TLS descriptor,
768 starting at the end of the jump table. */
769 bfd_vma tlsdesc_got;
772 #define elf_x86_64_hash_entry(ent) \
773 ((struct elf_x86_64_link_hash_entry *)(ent))
775 struct elf_x86_64_obj_tdata
777 struct elf_obj_tdata root;
779 /* tls_type for each local got entry. */
780 char *local_got_tls_type;
782 /* GOTPLT entries for TLS descriptors. */
783 bfd_vma *local_tlsdesc_gotent;
786 #define elf_x86_64_tdata(abfd) \
787 ((struct elf_x86_64_obj_tdata *) (abfd)->tdata.any)
789 #define elf_x86_64_local_got_tls_type(abfd) \
790 (elf_x86_64_tdata (abfd)->local_got_tls_type)
792 #define elf_x86_64_local_tlsdesc_gotent(abfd) \
793 (elf_x86_64_tdata (abfd)->local_tlsdesc_gotent)
795 #define is_x86_64_elf(bfd) \
796 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
797 && elf_tdata (bfd) != NULL \
798 && elf_object_id (bfd) == X86_64_ELF_DATA)
800 static bfd_boolean
801 elf_x86_64_mkobject (bfd *abfd)
803 return bfd_elf_allocate_object (abfd, sizeof (struct elf_x86_64_obj_tdata),
804 X86_64_ELF_DATA);
807 /* x86-64 ELF linker hash table. */
809 struct elf_x86_64_link_hash_table
811 struct elf_link_hash_table elf;
813 /* Short-cuts to get to dynamic linker sections. */
814 asection *sdynbss;
815 asection *srelbss;
816 asection *plt_eh_frame;
817 asection *plt_bnd;
819 union
821 bfd_signed_vma refcount;
822 bfd_vma offset;
823 } tls_ld_got;
825 /* The amount of space used by the jump slots in the GOT. */
826 bfd_vma sgotplt_jump_table_size;
828 /* Small local sym cache. */
829 struct sym_cache sym_cache;
831 bfd_vma (*r_info) (bfd_vma, bfd_vma);
832 bfd_vma (*r_sym) (bfd_vma);
833 unsigned int pointer_r_type;
834 const char *dynamic_interpreter;
835 int dynamic_interpreter_size;
837 /* _TLS_MODULE_BASE_ symbol. */
838 struct bfd_link_hash_entry *tls_module_base;
840 /* Used by local STT_GNU_IFUNC symbols. */
841 htab_t loc_hash_table;
842 void * loc_hash_memory;
844 /* The offset into splt of the PLT entry for the TLS descriptor
845 resolver. Special values are 0, if not necessary (or not found
846 to be necessary yet), and -1 if needed but not determined
847 yet. */
848 bfd_vma tlsdesc_plt;
849 /* The offset into sgot of the GOT entry used by the PLT entry
850 above. */
851 bfd_vma tlsdesc_got;
853 /* The index of the next R_X86_64_JUMP_SLOT entry in .rela.plt. */
854 bfd_vma next_jump_slot_index;
855 /* The index of the next R_X86_64_IRELATIVE entry in .rela.plt. */
856 bfd_vma next_irelative_index;
859 /* Get the x86-64 ELF linker hash table from a link_info structure. */
861 #define elf_x86_64_hash_table(p) \
862 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
863 == X86_64_ELF_DATA ? ((struct elf_x86_64_link_hash_table *) ((p)->hash)) : NULL)
865 #define elf_x86_64_compute_jump_table_size(htab) \
866 ((htab)->elf.srelplt->reloc_count * GOT_ENTRY_SIZE)
868 /* Create an entry in an x86-64 ELF linker hash table. */
870 static struct bfd_hash_entry *
871 elf_x86_64_link_hash_newfunc (struct bfd_hash_entry *entry,
872 struct bfd_hash_table *table,
873 const char *string)
875 /* Allocate the structure if it has not already been allocated by a
876 subclass. */
877 if (entry == NULL)
879 entry = (struct bfd_hash_entry *)
880 bfd_hash_allocate (table,
881 sizeof (struct elf_x86_64_link_hash_entry));
882 if (entry == NULL)
883 return entry;
886 /* Call the allocation method of the superclass. */
887 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
888 if (entry != NULL)
890 struct elf_x86_64_link_hash_entry *eh;
892 eh = (struct elf_x86_64_link_hash_entry *) entry;
893 eh->dyn_relocs = NULL;
894 eh->tls_type = GOT_UNKNOWN;
895 eh->has_bnd_reloc = FALSE;
896 eh->plt_bnd.offset = (bfd_vma) -1;
897 eh->tlsdesc_got = (bfd_vma) -1;
900 return entry;
903 /* Compute a hash of a local hash entry. We use elf_link_hash_entry
904 for local symbol so that we can handle local STT_GNU_IFUNC symbols
905 as global symbol. We reuse indx and dynstr_index for local symbol
906 hash since they aren't used by global symbols in this backend. */
908 static hashval_t
909 elf_x86_64_local_htab_hash (const void *ptr)
911 struct elf_link_hash_entry *h
912 = (struct elf_link_hash_entry *) ptr;
913 return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
916 /* Compare local hash entries. */
918 static int
919 elf_x86_64_local_htab_eq (const void *ptr1, const void *ptr2)
921 struct elf_link_hash_entry *h1
922 = (struct elf_link_hash_entry *) ptr1;
923 struct elf_link_hash_entry *h2
924 = (struct elf_link_hash_entry *) ptr2;
926 return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
929 /* Find and/or create a hash entry for local symbol. */
931 static struct elf_link_hash_entry *
932 elf_x86_64_get_local_sym_hash (struct elf_x86_64_link_hash_table *htab,
933 bfd *abfd, const Elf_Internal_Rela *rel,
934 bfd_boolean create)
936 struct elf_x86_64_link_hash_entry e, *ret;
937 asection *sec = abfd->sections;
938 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
939 htab->r_sym (rel->r_info));
940 void **slot;
942 e.elf.indx = sec->id;
943 e.elf.dynstr_index = htab->r_sym (rel->r_info);
944 slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
945 create ? INSERT : NO_INSERT);
947 if (!slot)
948 return NULL;
950 if (*slot)
952 ret = (struct elf_x86_64_link_hash_entry *) *slot;
953 return &ret->elf;
956 ret = (struct elf_x86_64_link_hash_entry *)
957 objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
958 sizeof (struct elf_x86_64_link_hash_entry));
959 if (ret)
961 memset (ret, 0, sizeof (*ret));
962 ret->elf.indx = sec->id;
963 ret->elf.dynstr_index = htab->r_sym (rel->r_info);
964 ret->elf.dynindx = -1;
965 *slot = ret;
967 return &ret->elf;
970 /* Destroy an X86-64 ELF linker hash table. */
972 static void
973 elf_x86_64_link_hash_table_free (bfd *obfd)
975 struct elf_x86_64_link_hash_table *htab
976 = (struct elf_x86_64_link_hash_table *) obfd->link.hash;
978 if (htab->loc_hash_table)
979 htab_delete (htab->loc_hash_table);
980 if (htab->loc_hash_memory)
981 objalloc_free ((struct objalloc *) htab->loc_hash_memory);
982 _bfd_elf_link_hash_table_free (obfd);
985 /* Create an X86-64 ELF linker hash table. */
987 static struct bfd_link_hash_table *
988 elf_x86_64_link_hash_table_create (bfd *abfd)
990 struct elf_x86_64_link_hash_table *ret;
991 bfd_size_type amt = sizeof (struct elf_x86_64_link_hash_table);
993 ret = (struct elf_x86_64_link_hash_table *) bfd_zmalloc (amt);
994 if (ret == NULL)
995 return NULL;
997 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
998 elf_x86_64_link_hash_newfunc,
999 sizeof (struct elf_x86_64_link_hash_entry),
1000 X86_64_ELF_DATA))
1002 free (ret);
1003 return NULL;
1006 if (ABI_64_P (abfd))
1008 ret->r_info = elf64_r_info;
1009 ret->r_sym = elf64_r_sym;
1010 ret->pointer_r_type = R_X86_64_64;
1011 ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
1012 ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
1014 else
1016 ret->r_info = elf32_r_info;
1017 ret->r_sym = elf32_r_sym;
1018 ret->pointer_r_type = R_X86_64_32;
1019 ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
1020 ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER;
1023 ret->loc_hash_table = htab_try_create (1024,
1024 elf_x86_64_local_htab_hash,
1025 elf_x86_64_local_htab_eq,
1026 NULL);
1027 ret->loc_hash_memory = objalloc_create ();
1028 if (!ret->loc_hash_table || !ret->loc_hash_memory)
1030 elf_x86_64_link_hash_table_free (abfd);
1031 return NULL;
1033 ret->elf.root.hash_table_free = elf_x86_64_link_hash_table_free;
1035 return &ret->elf.root;
1038 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
1039 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
1040 hash table. */
1042 static bfd_boolean
1043 elf_x86_64_create_dynamic_sections (bfd *dynobj,
1044 struct bfd_link_info *info)
1046 struct elf_x86_64_link_hash_table *htab;
1048 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1049 return FALSE;
1051 htab = elf_x86_64_hash_table (info);
1052 if (htab == NULL)
1053 return FALSE;
1055 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
1056 if (!info->shared)
1057 htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
1059 if (!htab->sdynbss
1060 || (!info->shared && !htab->srelbss))
1061 abort ();
1063 if (!info->no_ld_generated_unwind_info
1064 && htab->plt_eh_frame == NULL
1065 && htab->elf.splt != NULL)
1067 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
1068 | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1069 | SEC_LINKER_CREATED);
1070 htab->plt_eh_frame
1071 = bfd_make_section_anyway_with_flags (dynobj, ".eh_frame", flags);
1072 if (htab->plt_eh_frame == NULL
1073 || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 3))
1074 return FALSE;
1076 return TRUE;
1079 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1081 static void
1082 elf_x86_64_copy_indirect_symbol (struct bfd_link_info *info,
1083 struct elf_link_hash_entry *dir,
1084 struct elf_link_hash_entry *ind)
1086 struct elf_x86_64_link_hash_entry *edir, *eind;
1088 edir = (struct elf_x86_64_link_hash_entry *) dir;
1089 eind = (struct elf_x86_64_link_hash_entry *) ind;
1091 if (!edir->has_bnd_reloc)
1092 edir->has_bnd_reloc = eind->has_bnd_reloc;
1094 if (eind->dyn_relocs != NULL)
1096 if (edir->dyn_relocs != NULL)
1098 struct elf_dyn_relocs **pp;
1099 struct elf_dyn_relocs *p;
1101 /* Add reloc counts against the indirect sym to the direct sym
1102 list. Merge any entries against the same section. */
1103 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1105 struct elf_dyn_relocs *q;
1107 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1108 if (q->sec == p->sec)
1110 q->pc_count += p->pc_count;
1111 q->count += p->count;
1112 *pp = p->next;
1113 break;
1115 if (q == NULL)
1116 pp = &p->next;
1118 *pp = edir->dyn_relocs;
1121 edir->dyn_relocs = eind->dyn_relocs;
1122 eind->dyn_relocs = NULL;
1125 if (ind->root.type == bfd_link_hash_indirect
1126 && dir->got.refcount <= 0)
1128 edir->tls_type = eind->tls_type;
1129 eind->tls_type = GOT_UNKNOWN;
1132 if (ELIMINATE_COPY_RELOCS
1133 && ind->root.type != bfd_link_hash_indirect
1134 && dir->dynamic_adjusted)
1136 /* If called to transfer flags for a weakdef during processing
1137 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1138 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1139 dir->ref_dynamic |= ind->ref_dynamic;
1140 dir->ref_regular |= ind->ref_regular;
1141 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1142 dir->needs_plt |= ind->needs_plt;
1143 dir->pointer_equality_needed |= ind->pointer_equality_needed;
1145 else
1146 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1149 static bfd_boolean
1150 elf64_x86_64_elf_object_p (bfd *abfd)
1152 /* Set the right machine number for an x86-64 elf64 file. */
1153 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
1154 return TRUE;
1157 static bfd_boolean
1158 elf32_x86_64_elf_object_p (bfd *abfd)
1160 /* Set the right machine number for an x86-64 elf32 file. */
1161 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32);
1162 return TRUE;
1165 /* Return TRUE if the TLS access code sequence support transition
1166 from R_TYPE. */
1168 static bfd_boolean
1169 elf_x86_64_check_tls_transition (bfd *abfd,
1170 struct bfd_link_info *info,
1171 asection *sec,
1172 bfd_byte *contents,
1173 Elf_Internal_Shdr *symtab_hdr,
1174 struct elf_link_hash_entry **sym_hashes,
1175 unsigned int r_type,
1176 const Elf_Internal_Rela *rel,
1177 const Elf_Internal_Rela *relend)
1179 unsigned int val;
1180 unsigned long r_symndx;
1181 bfd_boolean largepic = FALSE;
1182 struct elf_link_hash_entry *h;
1183 bfd_vma offset;
1184 struct elf_x86_64_link_hash_table *htab;
1186 /* Get the section contents. */
1187 if (contents == NULL)
1189 if (elf_section_data (sec)->this_hdr.contents != NULL)
1190 contents = elf_section_data (sec)->this_hdr.contents;
1191 else
1193 /* FIXME: How to better handle error condition? */
1194 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1195 return FALSE;
1197 /* Cache the section contents for elf_link_input_bfd. */
1198 elf_section_data (sec)->this_hdr.contents = contents;
1202 htab = elf_x86_64_hash_table (info);
1203 offset = rel->r_offset;
1204 switch (r_type)
1206 case R_X86_64_TLSGD:
1207 case R_X86_64_TLSLD:
1208 if ((rel + 1) >= relend)
1209 return FALSE;
1211 if (r_type == R_X86_64_TLSGD)
1213 /* Check transition from GD access model. For 64bit, only
1214 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
1215 .word 0x6666; rex64; call __tls_get_addr
1216 can transit to different access model. For 32bit, only
1217 leaq foo@tlsgd(%rip), %rdi
1218 .word 0x6666; rex64; call __tls_get_addr
1219 can transit to different access model. For largepic
1220 we also support:
1221 leaq foo@tlsgd(%rip), %rdi
1222 movabsq $__tls_get_addr@pltoff, %rax
1223 addq $rbx, %rax
1224 call *%rax. */
1226 static const unsigned char call[] = { 0x66, 0x66, 0x48, 0xe8 };
1227 static const unsigned char leaq[] = { 0x66, 0x48, 0x8d, 0x3d };
1229 if ((offset + 12) > sec->size)
1230 return FALSE;
1232 if (memcmp (contents + offset + 4, call, 4) != 0)
1234 if (!ABI_64_P (abfd)
1235 || (offset + 19) > sec->size
1236 || offset < 3
1237 || memcmp (contents + offset - 3, leaq + 1, 3) != 0
1238 || memcmp (contents + offset + 4, "\x48\xb8", 2) != 0
1239 || memcmp (contents + offset + 14, "\x48\x01\xd8\xff\xd0", 5)
1240 != 0)
1241 return FALSE;
1242 largepic = TRUE;
1244 else if (ABI_64_P (abfd))
1246 if (offset < 4
1247 || memcmp (contents + offset - 4, leaq, 4) != 0)
1248 return FALSE;
1250 else
1252 if (offset < 3
1253 || memcmp (contents + offset - 3, leaq + 1, 3) != 0)
1254 return FALSE;
1257 else
1259 /* Check transition from LD access model. Only
1260 leaq foo@tlsld(%rip), %rdi;
1261 call __tls_get_addr
1262 can transit to different access model. For largepic
1263 we also support:
1264 leaq foo@tlsld(%rip), %rdi
1265 movabsq $__tls_get_addr@pltoff, %rax
1266 addq $rbx, %rax
1267 call *%rax. */
1269 static const unsigned char lea[] = { 0x48, 0x8d, 0x3d };
1271 if (offset < 3 || (offset + 9) > sec->size)
1272 return FALSE;
1274 if (memcmp (contents + offset - 3, lea, 3) != 0)
1275 return FALSE;
1277 if (0xe8 != *(contents + offset + 4))
1279 if (!ABI_64_P (abfd)
1280 || (offset + 19) > sec->size
1281 || memcmp (contents + offset + 4, "\x48\xb8", 2) != 0
1282 || memcmp (contents + offset + 14, "\x48\x01\xd8\xff\xd0", 5)
1283 != 0)
1284 return FALSE;
1285 largepic = TRUE;
1289 r_symndx = htab->r_sym (rel[1].r_info);
1290 if (r_symndx < symtab_hdr->sh_info)
1291 return FALSE;
1293 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1294 /* Use strncmp to check __tls_get_addr since __tls_get_addr
1295 may be versioned. */
1296 return (h != NULL
1297 && h->root.root.string != NULL
1298 && (largepic
1299 ? ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLTOFF64
1300 : (ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PC32
1301 || ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLT32))
1302 && (strncmp (h->root.root.string,
1303 "__tls_get_addr", 14) == 0));
1305 case R_X86_64_GOTTPOFF:
1306 /* Check transition from IE access model:
1307 mov foo@gottpoff(%rip), %reg
1308 add foo@gottpoff(%rip), %reg
1311 /* Check REX prefix first. */
1312 if (offset >= 3 && (offset + 4) <= sec->size)
1314 val = bfd_get_8 (abfd, contents + offset - 3);
1315 if (val != 0x48 && val != 0x4c)
1317 /* X32 may have 0x44 REX prefix or no REX prefix. */
1318 if (ABI_64_P (abfd))
1319 return FALSE;
1322 else
1324 /* X32 may not have any REX prefix. */
1325 if (ABI_64_P (abfd))
1326 return FALSE;
1327 if (offset < 2 || (offset + 3) > sec->size)
1328 return FALSE;
1331 val = bfd_get_8 (abfd, contents + offset - 2);
1332 if (val != 0x8b && val != 0x03)
1333 return FALSE;
1335 val = bfd_get_8 (abfd, contents + offset - 1);
1336 return (val & 0xc7) == 5;
1338 case R_X86_64_GOTPC32_TLSDESC:
1339 /* Check transition from GDesc access model:
1340 leaq x@tlsdesc(%rip), %rax
1342 Make sure it's a leaq adding rip to a 32-bit offset
1343 into any register, although it's probably almost always
1344 going to be rax. */
1346 if (offset < 3 || (offset + 4) > sec->size)
1347 return FALSE;
1349 val = bfd_get_8 (abfd, contents + offset - 3);
1350 if ((val & 0xfb) != 0x48)
1351 return FALSE;
1353 if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1354 return FALSE;
1356 val = bfd_get_8 (abfd, contents + offset - 1);
1357 return (val & 0xc7) == 0x05;
1359 case R_X86_64_TLSDESC_CALL:
1360 /* Check transition from GDesc access model:
1361 call *x@tlsdesc(%rax)
1363 if (offset + 2 <= sec->size)
1365 /* Make sure that it's a call *x@tlsdesc(%rax). */
1366 static const unsigned char call[] = { 0xff, 0x10 };
1367 return memcmp (contents + offset, call, 2) == 0;
1370 return FALSE;
1372 default:
1373 abort ();
1377 /* Return TRUE if the TLS access transition is OK or no transition
1378 will be performed. Update R_TYPE if there is a transition. */
1380 static bfd_boolean
1381 elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
1382 asection *sec, bfd_byte *contents,
1383 Elf_Internal_Shdr *symtab_hdr,
1384 struct elf_link_hash_entry **sym_hashes,
1385 unsigned int *r_type, int tls_type,
1386 const Elf_Internal_Rela *rel,
1387 const Elf_Internal_Rela *relend,
1388 struct elf_link_hash_entry *h,
1389 unsigned long r_symndx)
1391 unsigned int from_type = *r_type;
1392 unsigned int to_type = from_type;
1393 bfd_boolean check = TRUE;
1395 /* Skip TLS transition for functions. */
1396 if (h != NULL
1397 && (h->type == STT_FUNC
1398 || h->type == STT_GNU_IFUNC))
1399 return TRUE;
1401 switch (from_type)
1403 case R_X86_64_TLSGD:
1404 case R_X86_64_GOTPC32_TLSDESC:
1405 case R_X86_64_TLSDESC_CALL:
1406 case R_X86_64_GOTTPOFF:
1407 if (info->executable)
1409 if (h == NULL)
1410 to_type = R_X86_64_TPOFF32;
1411 else
1412 to_type = R_X86_64_GOTTPOFF;
1415 /* When we are called from elf_x86_64_relocate_section,
1416 CONTENTS isn't NULL and there may be additional transitions
1417 based on TLS_TYPE. */
1418 if (contents != NULL)
1420 unsigned int new_to_type = to_type;
1422 if (info->executable
1423 && h != NULL
1424 && h->dynindx == -1
1425 && tls_type == GOT_TLS_IE)
1426 new_to_type = R_X86_64_TPOFF32;
1428 if (to_type == R_X86_64_TLSGD
1429 || to_type == R_X86_64_GOTPC32_TLSDESC
1430 || to_type == R_X86_64_TLSDESC_CALL)
1432 if (tls_type == GOT_TLS_IE)
1433 new_to_type = R_X86_64_GOTTPOFF;
1436 /* We checked the transition before when we were called from
1437 elf_x86_64_check_relocs. We only want to check the new
1438 transition which hasn't been checked before. */
1439 check = new_to_type != to_type && from_type == to_type;
1440 to_type = new_to_type;
1443 break;
1445 case R_X86_64_TLSLD:
1446 if (info->executable)
1447 to_type = R_X86_64_TPOFF32;
1448 break;
1450 default:
1451 return TRUE;
1454 /* Return TRUE if there is no transition. */
1455 if (from_type == to_type)
1456 return TRUE;
1458 /* Check if the transition can be performed. */
1459 if (check
1460 && ! elf_x86_64_check_tls_transition (abfd, info, sec, contents,
1461 symtab_hdr, sym_hashes,
1462 from_type, rel, relend))
1464 reloc_howto_type *from, *to;
1465 const char *name;
1467 from = elf_x86_64_rtype_to_howto (abfd, from_type);
1468 to = elf_x86_64_rtype_to_howto (abfd, to_type);
1470 if (h)
1471 name = h->root.root.string;
1472 else
1474 struct elf_x86_64_link_hash_table *htab;
1476 htab = elf_x86_64_hash_table (info);
1477 if (htab == NULL)
1478 name = "*unknown*";
1479 else
1481 Elf_Internal_Sym *isym;
1483 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1484 abfd, r_symndx);
1485 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1489 (*_bfd_error_handler)
1490 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1491 "in section `%A' failed"),
1492 abfd, sec, from->name, to->name, name,
1493 (unsigned long) rel->r_offset);
1494 bfd_set_error (bfd_error_bad_value);
1495 return FALSE;
1498 *r_type = to_type;
1499 return TRUE;
1502 /* Look through the relocs for a section during the first phase, and
1503 calculate needed space in the global offset table, procedure
1504 linkage table, and dynamic reloc sections. */
1506 static bfd_boolean
1507 elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
1508 asection *sec,
1509 const Elf_Internal_Rela *relocs)
1511 struct elf_x86_64_link_hash_table *htab;
1512 Elf_Internal_Shdr *symtab_hdr;
1513 struct elf_link_hash_entry **sym_hashes;
1514 const Elf_Internal_Rela *rel;
1515 const Elf_Internal_Rela *rel_end;
1516 asection *sreloc;
1518 if (info->relocatable)
1519 return TRUE;
1521 BFD_ASSERT (is_x86_64_elf (abfd));
1523 htab = elf_x86_64_hash_table (info);
1524 if (htab == NULL)
1525 return FALSE;
1527 symtab_hdr = &elf_symtab_hdr (abfd);
1528 sym_hashes = elf_sym_hashes (abfd);
1530 sreloc = NULL;
1532 rel_end = relocs + sec->reloc_count;
1533 for (rel = relocs; rel < rel_end; rel++)
1535 unsigned int r_type;
1536 unsigned long r_symndx;
1537 struct elf_link_hash_entry *h;
1538 Elf_Internal_Sym *isym;
1539 const char *name;
1540 bfd_boolean size_reloc;
1542 r_symndx = htab->r_sym (rel->r_info);
1543 r_type = ELF32_R_TYPE (rel->r_info);
1545 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1547 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1548 abfd, r_symndx);
1549 return FALSE;
1552 if (r_symndx < symtab_hdr->sh_info)
1554 /* A local symbol. */
1555 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1556 abfd, r_symndx);
1557 if (isym == NULL)
1558 return FALSE;
1560 /* Check relocation against local STT_GNU_IFUNC symbol. */
1561 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1563 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel,
1564 TRUE);
1565 if (h == NULL)
1566 return FALSE;
1568 /* Fake a STT_GNU_IFUNC symbol. */
1569 h->type = STT_GNU_IFUNC;
1570 h->def_regular = 1;
1571 h->ref_regular = 1;
1572 h->forced_local = 1;
1573 h->root.type = bfd_link_hash_defined;
1575 else
1576 h = NULL;
1578 else
1580 isym = NULL;
1581 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1582 while (h->root.type == bfd_link_hash_indirect
1583 || h->root.type == bfd_link_hash_warning)
1584 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1587 /* Check invalid x32 relocations. */
1588 if (!ABI_64_P (abfd))
1589 switch (r_type)
1591 default:
1592 break;
1594 case R_X86_64_DTPOFF64:
1595 case R_X86_64_TPOFF64:
1596 case R_X86_64_PC64:
1597 case R_X86_64_GOTOFF64:
1598 case R_X86_64_GOT64:
1599 case R_X86_64_GOTPCREL64:
1600 case R_X86_64_GOTPC64:
1601 case R_X86_64_GOTPLT64:
1602 case R_X86_64_PLTOFF64:
1604 if (h)
1605 name = h->root.root.string;
1606 else
1607 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1608 NULL);
1609 (*_bfd_error_handler)
1610 (_("%B: relocation %s against symbol `%s' isn't "
1611 "supported in x32 mode"), abfd,
1612 x86_64_elf_howto_table[r_type].name, name);
1613 bfd_set_error (bfd_error_bad_value);
1614 return FALSE;
1616 break;
1619 if (h != NULL)
1621 /* Create the ifunc sections for static executables. If we
1622 never see an indirect function symbol nor we are building
1623 a static executable, those sections will be empty and
1624 won't appear in output. */
1625 switch (r_type)
1627 default:
1628 break;
1630 case R_X86_64_PC32_BND:
1631 case R_X86_64_PLT32_BND:
1632 /* MPX PLT is supported only if elf_x86_64_arch_bed
1633 is used in 64-bit mode. */
1634 if (ABI_64_P (abfd)
1635 && (get_elf_x86_64_backend_data (abfd)
1636 == &elf_x86_64_arch_bed))
1638 elf_x86_64_hash_entry (h)->has_bnd_reloc = TRUE;
1640 /* Create the second PLT for Intel MPX support. */
1641 if (htab->plt_bnd == NULL)
1643 unsigned int plt_bnd_align;
1644 const struct elf_backend_data *bed;
1646 bed = get_elf_backend_data (info->output_bfd);
1647 switch (sizeof (elf_x86_64_bnd_plt2_entry))
1649 case 8:
1650 plt_bnd_align = 3;
1651 break;
1652 case 16:
1653 plt_bnd_align = 4;
1654 break;
1655 default:
1656 abort ();
1659 if (htab->elf.dynobj == NULL)
1660 htab->elf.dynobj = abfd;
1661 htab->plt_bnd
1662 = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
1663 ".plt.bnd",
1664 (bed->dynamic_sec_flags
1665 | SEC_ALLOC
1666 | SEC_CODE
1667 | SEC_LOAD
1668 | SEC_READONLY));
1669 if (htab->plt_bnd == NULL
1670 || !bfd_set_section_alignment (htab->elf.dynobj,
1671 htab->plt_bnd,
1672 plt_bnd_align))
1673 return FALSE;
1677 case R_X86_64_32S:
1678 case R_X86_64_32:
1679 case R_X86_64_64:
1680 case R_X86_64_PC32:
1681 case R_X86_64_PC64:
1682 case R_X86_64_PLT32:
1683 case R_X86_64_GOTPCREL:
1684 case R_X86_64_GOTPCREL64:
1685 if (htab->elf.dynobj == NULL)
1686 htab->elf.dynobj = abfd;
1687 if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info))
1688 return FALSE;
1689 break;
1692 /* It is referenced by a non-shared object. */
1693 h->ref_regular = 1;
1694 h->root.non_ir_ref = 1;
1697 if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
1698 symtab_hdr, sym_hashes,
1699 &r_type, GOT_UNKNOWN,
1700 rel, rel_end, h, r_symndx))
1701 return FALSE;
1703 switch (r_type)
1705 case R_X86_64_TLSLD:
1706 htab->tls_ld_got.refcount += 1;
1707 goto create_got;
1709 case R_X86_64_TPOFF32:
1710 if (!info->executable && ABI_64_P (abfd))
1712 if (h)
1713 name = h->root.root.string;
1714 else
1715 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1716 NULL);
1717 (*_bfd_error_handler)
1718 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1719 abfd,
1720 x86_64_elf_howto_table[r_type].name, name);
1721 bfd_set_error (bfd_error_bad_value);
1722 return FALSE;
1724 break;
1726 case R_X86_64_GOTTPOFF:
1727 if (!info->executable)
1728 info->flags |= DF_STATIC_TLS;
1729 /* Fall through */
1731 case R_X86_64_GOT32:
1732 case R_X86_64_GOTPCREL:
1733 case R_X86_64_TLSGD:
1734 case R_X86_64_GOT64:
1735 case R_X86_64_GOTPCREL64:
1736 case R_X86_64_GOTPLT64:
1737 case R_X86_64_GOTPC32_TLSDESC:
1738 case R_X86_64_TLSDESC_CALL:
1739 /* This symbol requires a global offset table entry. */
1741 int tls_type, old_tls_type;
1743 switch (r_type)
1745 default: tls_type = GOT_NORMAL; break;
1746 case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break;
1747 case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break;
1748 case R_X86_64_GOTPC32_TLSDESC:
1749 case R_X86_64_TLSDESC_CALL:
1750 tls_type = GOT_TLS_GDESC; break;
1753 if (h != NULL)
1755 if (r_type == R_X86_64_GOTPLT64)
1757 /* This relocation indicates that we also need
1758 a PLT entry, as this is a function. We don't need
1759 a PLT entry for local symbols. */
1760 h->needs_plt = 1;
1761 h->plt.refcount += 1;
1763 h->got.refcount += 1;
1764 old_tls_type = elf_x86_64_hash_entry (h)->tls_type;
1766 else
1768 bfd_signed_vma *local_got_refcounts;
1770 /* This is a global offset table entry for a local symbol. */
1771 local_got_refcounts = elf_local_got_refcounts (abfd);
1772 if (local_got_refcounts == NULL)
1774 bfd_size_type size;
1776 size = symtab_hdr->sh_info;
1777 size *= sizeof (bfd_signed_vma)
1778 + sizeof (bfd_vma) + sizeof (char);
1779 local_got_refcounts = ((bfd_signed_vma *)
1780 bfd_zalloc (abfd, size));
1781 if (local_got_refcounts == NULL)
1782 return FALSE;
1783 elf_local_got_refcounts (abfd) = local_got_refcounts;
1784 elf_x86_64_local_tlsdesc_gotent (abfd)
1785 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
1786 elf_x86_64_local_got_tls_type (abfd)
1787 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
1789 local_got_refcounts[r_symndx] += 1;
1790 old_tls_type
1791 = elf_x86_64_local_got_tls_type (abfd) [r_symndx];
1794 /* If a TLS symbol is accessed using IE at least once,
1795 there is no point to use dynamic model for it. */
1796 if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1797 && (! GOT_TLS_GD_ANY_P (old_tls_type)
1798 || tls_type != GOT_TLS_IE))
1800 if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type))
1801 tls_type = old_tls_type;
1802 else if (GOT_TLS_GD_ANY_P (old_tls_type)
1803 && GOT_TLS_GD_ANY_P (tls_type))
1804 tls_type |= old_tls_type;
1805 else
1807 if (h)
1808 name = h->root.root.string;
1809 else
1810 name = bfd_elf_sym_name (abfd, symtab_hdr,
1811 isym, NULL);
1812 (*_bfd_error_handler)
1813 (_("%B: '%s' accessed both as normal and thread local symbol"),
1814 abfd, name);
1815 bfd_set_error (bfd_error_bad_value);
1816 return FALSE;
1820 if (old_tls_type != tls_type)
1822 if (h != NULL)
1823 elf_x86_64_hash_entry (h)->tls_type = tls_type;
1824 else
1825 elf_x86_64_local_got_tls_type (abfd) [r_symndx] = tls_type;
1828 /* Fall through */
1830 case R_X86_64_GOTOFF64:
1831 case R_X86_64_GOTPC32:
1832 case R_X86_64_GOTPC64:
1833 create_got:
1834 if (htab->elf.sgot == NULL)
1836 if (htab->elf.dynobj == NULL)
1837 htab->elf.dynobj = abfd;
1838 if (!_bfd_elf_create_got_section (htab->elf.dynobj,
1839 info))
1840 return FALSE;
1842 break;
1844 case R_X86_64_PLT32:
1845 case R_X86_64_PLT32_BND:
1846 /* This symbol requires a procedure linkage table entry. We
1847 actually build the entry in adjust_dynamic_symbol,
1848 because this might be a case of linking PIC code which is
1849 never referenced by a dynamic object, in which case we
1850 don't need to generate a procedure linkage table entry
1851 after all. */
1853 /* If this is a local symbol, we resolve it directly without
1854 creating a procedure linkage table entry. */
1855 if (h == NULL)
1856 continue;
1858 h->needs_plt = 1;
1859 h->plt.refcount += 1;
1860 break;
1862 case R_X86_64_PLTOFF64:
1863 /* This tries to form the 'address' of a function relative
1864 to GOT. For global symbols we need a PLT entry. */
1865 if (h != NULL)
1867 h->needs_plt = 1;
1868 h->plt.refcount += 1;
1870 goto create_got;
1872 case R_X86_64_SIZE32:
1873 case R_X86_64_SIZE64:
1874 size_reloc = TRUE;
1875 goto do_size;
1877 case R_X86_64_32:
1878 if (!ABI_64_P (abfd))
1879 goto pointer;
1880 case R_X86_64_8:
1881 case R_X86_64_16:
1882 case R_X86_64_32S:
1883 /* Let's help debug shared library creation. These relocs
1884 cannot be used in shared libs. Don't error out for
1885 sections we don't care about, such as debug sections or
1886 non-constant sections. */
1887 if (info->shared
1888 && (sec->flags & SEC_ALLOC) != 0
1889 && (sec->flags & SEC_READONLY) != 0)
1891 if (h)
1892 name = h->root.root.string;
1893 else
1894 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1895 (*_bfd_error_handler)
1896 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1897 abfd, x86_64_elf_howto_table[r_type].name, name);
1898 bfd_set_error (bfd_error_bad_value);
1899 return FALSE;
1901 /* Fall through. */
1903 case R_X86_64_PC8:
1904 case R_X86_64_PC16:
1905 case R_X86_64_PC32:
1906 case R_X86_64_PC32_BND:
1907 case R_X86_64_PC64:
1908 case R_X86_64_64:
1909 pointer:
1910 if (h != NULL && info->executable)
1912 /* If this reloc is in a read-only section, we might
1913 need a copy reloc. We can't check reliably at this
1914 stage whether the section is read-only, as input
1915 sections have not yet been mapped to output sections.
1916 Tentatively set the flag for now, and correct in
1917 adjust_dynamic_symbol. */
1918 h->non_got_ref = 1;
1920 /* We may need a .plt entry if the function this reloc
1921 refers to is in a shared lib. */
1922 h->plt.refcount += 1;
1923 if (r_type != R_X86_64_PC32
1924 && r_type != R_X86_64_PC32_BND
1925 && r_type != R_X86_64_PC64)
1926 h->pointer_equality_needed = 1;
1929 size_reloc = FALSE;
1930 do_size:
1931 /* If we are creating a shared library, and this is a reloc
1932 against a global symbol, or a non PC relative reloc
1933 against a local symbol, then we need to copy the reloc
1934 into the shared library. However, if we are linking with
1935 -Bsymbolic, we do not need to copy a reloc against a
1936 global symbol which is defined in an object we are
1937 including in the link (i.e., DEF_REGULAR is set). At
1938 this point we have not seen all the input files, so it is
1939 possible that DEF_REGULAR is not set now but will be set
1940 later (it is never cleared). In case of a weak definition,
1941 DEF_REGULAR may be cleared later by a strong definition in
1942 a shared library. We account for that possibility below by
1943 storing information in the relocs_copied field of the hash
1944 table entry. A similar situation occurs when creating
1945 shared libraries and symbol visibility changes render the
1946 symbol local.
1948 If on the other hand, we are creating an executable, we
1949 may need to keep relocations for symbols satisfied by a
1950 dynamic library if we manage to avoid copy relocs for the
1951 symbol. */
1952 if ((info->shared
1953 && (sec->flags & SEC_ALLOC) != 0
1954 && (! IS_X86_64_PCREL_TYPE (r_type)
1955 || (h != NULL
1956 && (! SYMBOLIC_BIND (info, h)
1957 || h->root.type == bfd_link_hash_defweak
1958 || !h->def_regular))))
1959 || (ELIMINATE_COPY_RELOCS
1960 && !info->shared
1961 && (sec->flags & SEC_ALLOC) != 0
1962 && h != NULL
1963 && (h->root.type == bfd_link_hash_defweak
1964 || !h->def_regular)))
1966 struct elf_dyn_relocs *p;
1967 struct elf_dyn_relocs **head;
1969 /* We must copy these reloc types into the output file.
1970 Create a reloc section in dynobj and make room for
1971 this reloc. */
1972 if (sreloc == NULL)
1974 if (htab->elf.dynobj == NULL)
1975 htab->elf.dynobj = abfd;
1977 sreloc = _bfd_elf_make_dynamic_reloc_section
1978 (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2,
1979 abfd, /*rela?*/ TRUE);
1981 if (sreloc == NULL)
1982 return FALSE;
1985 /* If this is a global symbol, we count the number of
1986 relocations we need for this symbol. */
1987 if (h != NULL)
1989 head = &((struct elf_x86_64_link_hash_entry *) h)->dyn_relocs;
1991 else
1993 /* Track dynamic relocs needed for local syms too.
1994 We really need local syms available to do this
1995 easily. Oh well. */
1996 asection *s;
1997 void **vpp;
1999 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2000 abfd, r_symndx);
2001 if (isym == NULL)
2002 return FALSE;
2004 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2005 if (s == NULL)
2006 s = sec;
2008 /* Beware of type punned pointers vs strict aliasing
2009 rules. */
2010 vpp = &(elf_section_data (s)->local_dynrel);
2011 head = (struct elf_dyn_relocs **)vpp;
2014 p = *head;
2015 if (p == NULL || p->sec != sec)
2017 bfd_size_type amt = sizeof *p;
2019 p = ((struct elf_dyn_relocs *)
2020 bfd_alloc (htab->elf.dynobj, amt));
2021 if (p == NULL)
2022 return FALSE;
2023 p->next = *head;
2024 *head = p;
2025 p->sec = sec;
2026 p->count = 0;
2027 p->pc_count = 0;
2030 p->count += 1;
2031 /* Count size relocation as PC-relative relocation. */
2032 if (IS_X86_64_PCREL_TYPE (r_type) || size_reloc)
2033 p->pc_count += 1;
2035 break;
2037 /* This relocation describes the C++ object vtable hierarchy.
2038 Reconstruct it for later use during GC. */
2039 case R_X86_64_GNU_VTINHERIT:
2040 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2041 return FALSE;
2042 break;
2044 /* This relocation describes which C++ vtable entries are actually
2045 used. Record for later use during GC. */
2046 case R_X86_64_GNU_VTENTRY:
2047 BFD_ASSERT (h != NULL);
2048 if (h != NULL
2049 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2050 return FALSE;
2051 break;
2053 default:
2054 break;
2058 return TRUE;
2061 /* Return the section that should be marked against GC for a given
2062 relocation. */
2064 static asection *
2065 elf_x86_64_gc_mark_hook (asection *sec,
2066 struct bfd_link_info *info,
2067 Elf_Internal_Rela *rel,
2068 struct elf_link_hash_entry *h,
2069 Elf_Internal_Sym *sym)
2071 if (h != NULL)
2072 switch (ELF32_R_TYPE (rel->r_info))
2074 case R_X86_64_GNU_VTINHERIT:
2075 case R_X86_64_GNU_VTENTRY:
2076 return NULL;
2079 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2082 /* Update the got entry reference counts for the section being removed. */
2084 static bfd_boolean
2085 elf_x86_64_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
2086 asection *sec,
2087 const Elf_Internal_Rela *relocs)
2089 struct elf_x86_64_link_hash_table *htab;
2090 Elf_Internal_Shdr *symtab_hdr;
2091 struct elf_link_hash_entry **sym_hashes;
2092 bfd_signed_vma *local_got_refcounts;
2093 const Elf_Internal_Rela *rel, *relend;
2095 if (info->relocatable)
2096 return TRUE;
2098 htab = elf_x86_64_hash_table (info);
2099 if (htab == NULL)
2100 return FALSE;
2102 elf_section_data (sec)->local_dynrel = NULL;
2104 symtab_hdr = &elf_symtab_hdr (abfd);
2105 sym_hashes = elf_sym_hashes (abfd);
2106 local_got_refcounts = elf_local_got_refcounts (abfd);
2108 htab = elf_x86_64_hash_table (info);
2109 relend = relocs + sec->reloc_count;
2110 for (rel = relocs; rel < relend; rel++)
2112 unsigned long r_symndx;
2113 unsigned int r_type;
2114 struct elf_link_hash_entry *h = NULL;
2116 r_symndx = htab->r_sym (rel->r_info);
2117 if (r_symndx >= symtab_hdr->sh_info)
2119 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2120 while (h->root.type == bfd_link_hash_indirect
2121 || h->root.type == bfd_link_hash_warning)
2122 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2124 else
2126 /* A local symbol. */
2127 Elf_Internal_Sym *isym;
2129 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2130 abfd, r_symndx);
2132 /* Check relocation against local STT_GNU_IFUNC symbol. */
2133 if (isym != NULL
2134 && ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2136 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel, FALSE);
2137 if (h == NULL)
2138 abort ();
2142 if (h)
2144 struct elf_x86_64_link_hash_entry *eh;
2145 struct elf_dyn_relocs **pp;
2146 struct elf_dyn_relocs *p;
2148 eh = (struct elf_x86_64_link_hash_entry *) h;
2150 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2151 if (p->sec == sec)
2153 /* Everything must go for SEC. */
2154 *pp = p->next;
2155 break;
2159 r_type = ELF32_R_TYPE (rel->r_info);
2160 if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
2161 symtab_hdr, sym_hashes,
2162 &r_type, GOT_UNKNOWN,
2163 rel, relend, h, r_symndx))
2164 return FALSE;
2166 switch (r_type)
2168 case R_X86_64_TLSLD:
2169 if (htab->tls_ld_got.refcount > 0)
2170 htab->tls_ld_got.refcount -= 1;
2171 break;
2173 case R_X86_64_TLSGD:
2174 case R_X86_64_GOTPC32_TLSDESC:
2175 case R_X86_64_TLSDESC_CALL:
2176 case R_X86_64_GOTTPOFF:
2177 case R_X86_64_GOT32:
2178 case R_X86_64_GOTPCREL:
2179 case R_X86_64_GOT64:
2180 case R_X86_64_GOTPCREL64:
2181 case R_X86_64_GOTPLT64:
2182 if (h != NULL)
2184 if (r_type == R_X86_64_GOTPLT64 && h->plt.refcount > 0)
2185 h->plt.refcount -= 1;
2186 if (h->got.refcount > 0)
2187 h->got.refcount -= 1;
2188 if (h->type == STT_GNU_IFUNC)
2190 if (h->plt.refcount > 0)
2191 h->plt.refcount -= 1;
2194 else if (local_got_refcounts != NULL)
2196 if (local_got_refcounts[r_symndx] > 0)
2197 local_got_refcounts[r_symndx] -= 1;
2199 break;
2201 case R_X86_64_8:
2202 case R_X86_64_16:
2203 case R_X86_64_32:
2204 case R_X86_64_64:
2205 case R_X86_64_32S:
2206 case R_X86_64_PC8:
2207 case R_X86_64_PC16:
2208 case R_X86_64_PC32:
2209 case R_X86_64_PC32_BND:
2210 case R_X86_64_PC64:
2211 case R_X86_64_SIZE32:
2212 case R_X86_64_SIZE64:
2213 if (info->shared
2214 && (h == NULL || h->type != STT_GNU_IFUNC))
2215 break;
2216 /* Fall thru */
2218 case R_X86_64_PLT32:
2219 case R_X86_64_PLT32_BND:
2220 case R_X86_64_PLTOFF64:
2221 if (h != NULL)
2223 if (h->plt.refcount > 0)
2224 h->plt.refcount -= 1;
2226 break;
2228 default:
2229 break;
2233 return TRUE;
2236 /* Adjust a symbol defined by a dynamic object and referenced by a
2237 regular object. The current definition is in some section of the
2238 dynamic object, but we're not including those sections. We have to
2239 change the definition to something the rest of the link can
2240 understand. */
2242 static bfd_boolean
2243 elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
2244 struct elf_link_hash_entry *h)
2246 struct elf_x86_64_link_hash_table *htab;
2247 asection *s;
2248 struct elf_x86_64_link_hash_entry *eh;
2249 struct elf_dyn_relocs *p;
2251 /* STT_GNU_IFUNC symbol must go through PLT. */
2252 if (h->type == STT_GNU_IFUNC)
2254 /* All local STT_GNU_IFUNC references must be treate as local
2255 calls via local PLT. */
2256 if (h->ref_regular
2257 && SYMBOL_CALLS_LOCAL (info, h))
2259 bfd_size_type pc_count = 0, count = 0;
2260 struct elf_dyn_relocs **pp;
2262 eh = (struct elf_x86_64_link_hash_entry *) h;
2263 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2265 pc_count += p->pc_count;
2266 p->count -= p->pc_count;
2267 p->pc_count = 0;
2268 count += p->count;
2269 if (p->count == 0)
2270 *pp = p->next;
2271 else
2272 pp = &p->next;
2275 if (pc_count || count)
2277 h->needs_plt = 1;
2278 h->non_got_ref = 1;
2279 if (h->plt.refcount <= 0)
2280 h->plt.refcount = 1;
2281 else
2282 h->plt.refcount += 1;
2286 if (h->plt.refcount <= 0)
2288 h->plt.offset = (bfd_vma) -1;
2289 h->needs_plt = 0;
2291 return TRUE;
2294 /* If this is a function, put it in the procedure linkage table. We
2295 will fill in the contents of the procedure linkage table later,
2296 when we know the address of the .got section. */
2297 if (h->type == STT_FUNC
2298 || h->needs_plt)
2300 if (h->plt.refcount <= 0
2301 || SYMBOL_CALLS_LOCAL (info, h)
2302 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2303 && h->root.type == bfd_link_hash_undefweak))
2305 /* This case can occur if we saw a PLT32 reloc in an input
2306 file, but the symbol was never referred to by a dynamic
2307 object, or if all references were garbage collected. In
2308 such a case, we don't actually need to build a procedure
2309 linkage table, and we can just do a PC32 reloc instead. */
2310 h->plt.offset = (bfd_vma) -1;
2311 h->needs_plt = 0;
2314 return TRUE;
2316 else
2317 /* It's possible that we incorrectly decided a .plt reloc was
2318 needed for an R_X86_64_PC32 reloc to a non-function sym in
2319 check_relocs. We can't decide accurately between function and
2320 non-function syms in check-relocs; Objects loaded later in
2321 the link may change h->type. So fix it now. */
2322 h->plt.offset = (bfd_vma) -1;
2324 /* If this is a weak symbol, and there is a real definition, the
2325 processor independent code will have arranged for us to see the
2326 real definition first, and we can just use the same value. */
2327 if (h->u.weakdef != NULL)
2329 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2330 || h->u.weakdef->root.type == bfd_link_hash_defweak);
2331 h->root.u.def.section = h->u.weakdef->root.u.def.section;
2332 h->root.u.def.value = h->u.weakdef->root.u.def.value;
2333 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2334 h->non_got_ref = h->u.weakdef->non_got_ref;
2335 return TRUE;
2338 /* This is a reference to a symbol defined by a dynamic object which
2339 is not a function. */
2341 /* If we are creating a shared library, we must presume that the
2342 only references to the symbol are via the global offset table.
2343 For such cases we need not do anything here; the relocations will
2344 be handled correctly by relocate_section. */
2345 if (info->shared)
2346 return TRUE;
2348 /* If there are no references to this symbol that do not use the
2349 GOT, we don't need to generate a copy reloc. */
2350 if (!h->non_got_ref)
2351 return TRUE;
2353 /* If -z nocopyreloc was given, we won't generate them either. */
2354 if (info->nocopyreloc)
2356 h->non_got_ref = 0;
2357 return TRUE;
2360 if (ELIMINATE_COPY_RELOCS)
2362 eh = (struct elf_x86_64_link_hash_entry *) h;
2363 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2365 s = p->sec->output_section;
2366 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2367 break;
2370 /* If we didn't find any dynamic relocs in read-only sections, then
2371 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
2372 if (p == NULL)
2374 h->non_got_ref = 0;
2375 return TRUE;
2379 /* We must allocate the symbol in our .dynbss section, which will
2380 become part of the .bss section of the executable. There will be
2381 an entry for this symbol in the .dynsym section. The dynamic
2382 object will contain position independent code, so all references
2383 from the dynamic object to this symbol will go through the global
2384 offset table. The dynamic linker will use the .dynsym entry to
2385 determine the address it must put in the global offset table, so
2386 both the dynamic object and the regular object will refer to the
2387 same memory location for the variable. */
2389 htab = elf_x86_64_hash_table (info);
2390 if (htab == NULL)
2391 return FALSE;
2393 /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
2394 to copy the initial value out of the dynamic object and into the
2395 runtime process image. */
2396 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2398 const struct elf_backend_data *bed;
2399 bed = get_elf_backend_data (info->output_bfd);
2400 htab->srelbss->size += bed->s->sizeof_rela;
2401 h->needs_copy = 1;
2404 s = htab->sdynbss;
2406 return _bfd_elf_adjust_dynamic_copy (h, s);
2409 /* Allocate space in .plt, .got and associated reloc sections for
2410 dynamic relocs. */
2412 static bfd_boolean
2413 elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2415 struct bfd_link_info *info;
2416 struct elf_x86_64_link_hash_table *htab;
2417 struct elf_x86_64_link_hash_entry *eh;
2418 struct elf_dyn_relocs *p;
2419 const struct elf_backend_data *bed;
2420 unsigned int plt_entry_size;
2422 if (h->root.type == bfd_link_hash_indirect)
2423 return TRUE;
2425 eh = (struct elf_x86_64_link_hash_entry *) h;
2427 info = (struct bfd_link_info *) inf;
2428 htab = elf_x86_64_hash_table (info);
2429 if (htab == NULL)
2430 return FALSE;
2431 bed = get_elf_backend_data (info->output_bfd);
2432 plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2434 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2435 here if it is defined and referenced in a non-shared object. */
2436 if (h->type == STT_GNU_IFUNC
2437 && h->def_regular)
2439 if (_bfd_elf_allocate_ifunc_dyn_relocs (info, h,
2440 &eh->dyn_relocs,
2441 plt_entry_size,
2442 plt_entry_size,
2443 GOT_ENTRY_SIZE))
2445 asection *s = htab->plt_bnd;
2446 if (h->plt.offset != (bfd_vma) -1 && s != NULL)
2448 /* Use the .plt.bnd section if it is created. */
2449 eh->plt_bnd.offset = s->size;
2451 /* Make room for this entry in the .plt.bnd section. */
2452 s->size += sizeof (elf_x86_64_legacy_plt2_entry);
2455 return TRUE;
2457 else
2458 return FALSE;
2460 else if (htab->elf.dynamic_sections_created
2461 && h->plt.refcount > 0)
2463 /* Make sure this symbol is output as a dynamic symbol.
2464 Undefined weak syms won't yet be marked as dynamic. */
2465 if (h->dynindx == -1
2466 && !h->forced_local)
2468 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2469 return FALSE;
2472 if (info->shared
2473 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2475 asection *s = htab->elf.splt;
2476 asection *bnd_s = htab->plt_bnd;
2478 /* If this is the first .plt entry, make room for the special
2479 first entry. */
2480 if (s->size == 0)
2481 s->size = plt_entry_size;
2483 h->plt.offset = s->size;
2484 if (bnd_s)
2485 eh->plt_bnd.offset = bnd_s->size;
2487 /* If this symbol is not defined in a regular file, and we are
2488 not generating a shared library, then set the symbol to this
2489 location in the .plt. This is required to make function
2490 pointers compare as equal between the normal executable and
2491 the shared library. */
2492 if (! info->shared
2493 && !h->def_regular)
2495 if (bnd_s)
2497 /* We need to make a call to the entry of the second
2498 PLT instead of regular PLT entry. */
2499 h->root.u.def.section = bnd_s;
2500 h->root.u.def.value = eh->plt_bnd.offset;
2502 else
2504 h->root.u.def.section = s;
2505 h->root.u.def.value = h->plt.offset;
2509 /* Make room for this entry. */
2510 s->size += plt_entry_size;
2511 if (bnd_s)
2513 BFD_ASSERT (sizeof (elf_x86_64_bnd_plt2_entry)
2514 == sizeof (elf_x86_64_legacy_plt2_entry));
2515 bnd_s->size += sizeof (elf_x86_64_legacy_plt2_entry);
2518 /* We also need to make an entry in the .got.plt section, which
2519 will be placed in the .got section by the linker script. */
2520 htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
2522 /* We also need to make an entry in the .rela.plt section. */
2523 htab->elf.srelplt->size += bed->s->sizeof_rela;
2524 htab->elf.srelplt->reloc_count++;
2526 else
2528 h->plt.offset = (bfd_vma) -1;
2529 h->needs_plt = 0;
2532 else
2534 h->plt.offset = (bfd_vma) -1;
2535 h->needs_plt = 0;
2538 eh->tlsdesc_got = (bfd_vma) -1;
2540 /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
2541 make it a R_X86_64_TPOFF32 requiring no GOT entry. */
2542 if (h->got.refcount > 0
2543 && info->executable
2544 && h->dynindx == -1
2545 && elf_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE)
2547 h->got.offset = (bfd_vma) -1;
2549 else if (h->got.refcount > 0)
2551 asection *s;
2552 bfd_boolean dyn;
2553 int tls_type = elf_x86_64_hash_entry (h)->tls_type;
2555 /* Make sure this symbol is output as a dynamic symbol.
2556 Undefined weak syms won't yet be marked as dynamic. */
2557 if (h->dynindx == -1
2558 && !h->forced_local)
2560 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2561 return FALSE;
2564 if (GOT_TLS_GDESC_P (tls_type))
2566 eh->tlsdesc_got = htab->elf.sgotplt->size
2567 - elf_x86_64_compute_jump_table_size (htab);
2568 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
2569 h->got.offset = (bfd_vma) -2;
2571 if (! GOT_TLS_GDESC_P (tls_type)
2572 || GOT_TLS_GD_P (tls_type))
2574 s = htab->elf.sgot;
2575 h->got.offset = s->size;
2576 s->size += GOT_ENTRY_SIZE;
2577 if (GOT_TLS_GD_P (tls_type))
2578 s->size += GOT_ENTRY_SIZE;
2580 dyn = htab->elf.dynamic_sections_created;
2581 /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
2582 and two if global.
2583 R_X86_64_GOTTPOFF needs one dynamic relocation. */
2584 if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2585 || tls_type == GOT_TLS_IE)
2586 htab->elf.srelgot->size += bed->s->sizeof_rela;
2587 else if (GOT_TLS_GD_P (tls_type))
2588 htab->elf.srelgot->size += 2 * bed->s->sizeof_rela;
2589 else if (! GOT_TLS_GDESC_P (tls_type)
2590 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2591 || h->root.type != bfd_link_hash_undefweak)
2592 && (info->shared
2593 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2594 htab->elf.srelgot->size += bed->s->sizeof_rela;
2595 if (GOT_TLS_GDESC_P (tls_type))
2597 htab->elf.srelplt->size += bed->s->sizeof_rela;
2598 htab->tlsdesc_plt = (bfd_vma) -1;
2601 else
2602 h->got.offset = (bfd_vma) -1;
2604 if (eh->dyn_relocs == NULL)
2605 return TRUE;
2607 /* In the shared -Bsymbolic case, discard space allocated for
2608 dynamic pc-relative relocs against symbols which turn out to be
2609 defined in regular objects. For the normal shared case, discard
2610 space for pc-relative relocs that have become local due to symbol
2611 visibility changes. */
2613 if (info->shared)
2615 /* Relocs that use pc_count are those that appear on a call
2616 insn, or certain REL relocs that can generated via assembly.
2617 We want calls to protected symbols to resolve directly to the
2618 function rather than going via the plt. If people want
2619 function pointer comparisons to work as expected then they
2620 should avoid writing weird assembly. */
2621 if (SYMBOL_CALLS_LOCAL (info, h))
2623 struct elf_dyn_relocs **pp;
2625 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2627 p->count -= p->pc_count;
2628 p->pc_count = 0;
2629 if (p->count == 0)
2630 *pp = p->next;
2631 else
2632 pp = &p->next;
2636 /* Also discard relocs on undefined weak syms with non-default
2637 visibility. */
2638 if (eh->dyn_relocs != NULL
2639 && h->root.type == bfd_link_hash_undefweak)
2641 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2642 eh->dyn_relocs = NULL;
2644 /* Make sure undefined weak symbols are output as a dynamic
2645 symbol in PIEs. */
2646 else if (h->dynindx == -1
2647 && ! h->forced_local
2648 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2649 return FALSE;
2653 else if (ELIMINATE_COPY_RELOCS)
2655 /* For the non-shared case, discard space for relocs against
2656 symbols which turn out to need copy relocs or are not
2657 dynamic. */
2659 if (!h->non_got_ref
2660 && ((h->def_dynamic
2661 && !h->def_regular)
2662 || (htab->elf.dynamic_sections_created
2663 && (h->root.type == bfd_link_hash_undefweak
2664 || h->root.type == bfd_link_hash_undefined))))
2666 /* Make sure this symbol is output as a dynamic symbol.
2667 Undefined weak syms won't yet be marked as dynamic. */
2668 if (h->dynindx == -1
2669 && ! h->forced_local
2670 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2671 return FALSE;
2673 /* If that succeeded, we know we'll be keeping all the
2674 relocs. */
2675 if (h->dynindx != -1)
2676 goto keep;
2679 eh->dyn_relocs = NULL;
2681 keep: ;
2684 /* Finally, allocate space. */
2685 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2687 asection * sreloc;
2689 sreloc = elf_section_data (p->sec)->sreloc;
2691 BFD_ASSERT (sreloc != NULL);
2693 sreloc->size += p->count * bed->s->sizeof_rela;
2696 return TRUE;
2699 /* Allocate space in .plt, .got and associated reloc sections for
2700 local dynamic relocs. */
2702 static bfd_boolean
2703 elf_x86_64_allocate_local_dynrelocs (void **slot, void *inf)
2705 struct elf_link_hash_entry *h
2706 = (struct elf_link_hash_entry *) *slot;
2708 if (h->type != STT_GNU_IFUNC
2709 || !h->def_regular
2710 || !h->ref_regular
2711 || !h->forced_local
2712 || h->root.type != bfd_link_hash_defined)
2713 abort ();
2715 return elf_x86_64_allocate_dynrelocs (h, inf);
2718 /* Find any dynamic relocs that apply to read-only sections. */
2720 static bfd_boolean
2721 elf_x86_64_readonly_dynrelocs (struct elf_link_hash_entry *h,
2722 void * inf)
2724 struct elf_x86_64_link_hash_entry *eh;
2725 struct elf_dyn_relocs *p;
2727 /* Skip local IFUNC symbols. */
2728 if (h->forced_local && h->type == STT_GNU_IFUNC)
2729 return TRUE;
2731 eh = (struct elf_x86_64_link_hash_entry *) h;
2732 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2734 asection *s = p->sec->output_section;
2736 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2738 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2740 info->flags |= DF_TEXTREL;
2742 if (info->warn_shared_textrel && info->shared)
2743 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'.\n"),
2744 p->sec->owner, h->root.root.string,
2745 p->sec);
2747 /* Not an error, just cut short the traversal. */
2748 return FALSE;
2751 return TRUE;
2754 /* Convert
2755 mov foo@GOTPCREL(%rip), %reg
2757 lea foo(%rip), %reg
2758 with the local symbol, foo. */
2760 static bfd_boolean
2761 elf_x86_64_convert_mov_to_lea (bfd *abfd, asection *sec,
2762 struct bfd_link_info *link_info)
2764 Elf_Internal_Shdr *symtab_hdr;
2765 Elf_Internal_Rela *internal_relocs;
2766 Elf_Internal_Rela *irel, *irelend;
2767 bfd_byte *contents;
2768 struct elf_x86_64_link_hash_table *htab;
2769 bfd_boolean changed_contents;
2770 bfd_boolean changed_relocs;
2771 bfd_signed_vma *local_got_refcounts;
2773 /* Don't even try to convert non-ELF outputs. */
2774 if (!is_elf_hash_table (link_info->hash))
2775 return FALSE;
2777 /* Nothing to do if there are no codes, no relocations or no output. */
2778 if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
2779 || sec->reloc_count == 0
2780 || bfd_is_abs_section (sec->output_section))
2781 return TRUE;
2783 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2785 /* Load the relocations for this section. */
2786 internal_relocs = (_bfd_elf_link_read_relocs
2787 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2788 link_info->keep_memory));
2789 if (internal_relocs == NULL)
2790 return FALSE;
2792 htab = elf_x86_64_hash_table (link_info);
2793 changed_contents = FALSE;
2794 changed_relocs = FALSE;
2795 local_got_refcounts = elf_local_got_refcounts (abfd);
2797 /* Get the section contents. */
2798 if (elf_section_data (sec)->this_hdr.contents != NULL)
2799 contents = elf_section_data (sec)->this_hdr.contents;
2800 else
2802 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2803 goto error_return;
2806 irelend = internal_relocs + sec->reloc_count;
2807 for (irel = internal_relocs; irel < irelend; irel++)
2809 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
2810 unsigned int r_symndx = htab->r_sym (irel->r_info);
2811 unsigned int indx;
2812 struct elf_link_hash_entry *h;
2814 if (r_type != R_X86_64_GOTPCREL)
2815 continue;
2817 /* Get the symbol referred to by the reloc. */
2818 if (r_symndx < symtab_hdr->sh_info)
2820 Elf_Internal_Sym *isym;
2822 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2823 abfd, r_symndx);
2825 /* STT_GNU_IFUNC must keep R_X86_64_GOTPCREL relocation. */
2826 if (ELF_ST_TYPE (isym->st_info) != STT_GNU_IFUNC
2827 && irel->r_offset >= 2
2828 && bfd_get_8 (input_bfd,
2829 contents + irel->r_offset - 2) == 0x8b)
2831 bfd_put_8 (output_bfd, 0x8d,
2832 contents + irel->r_offset - 2);
2833 irel->r_info = htab->r_info (r_symndx, R_X86_64_PC32);
2834 if (local_got_refcounts != NULL
2835 && local_got_refcounts[r_symndx] > 0)
2836 local_got_refcounts[r_symndx] -= 1;
2837 changed_contents = TRUE;
2838 changed_relocs = TRUE;
2840 continue;
2843 indx = r_symndx - symtab_hdr->sh_info;
2844 h = elf_sym_hashes (abfd)[indx];
2845 BFD_ASSERT (h != NULL);
2847 while (h->root.type == bfd_link_hash_indirect
2848 || h->root.type == bfd_link_hash_warning)
2849 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2851 /* STT_GNU_IFUNC must keep R_X86_64_GOTPCREL relocation. We also
2852 avoid optimizing _DYNAMIC since ld.so may use its link-time
2853 address. */
2854 if (h->def_regular
2855 && h->type != STT_GNU_IFUNC
2856 && h != htab->elf.hdynamic
2857 && SYMBOL_REFERENCES_LOCAL (link_info, h)
2858 && irel->r_offset >= 2
2859 && bfd_get_8 (input_bfd,
2860 contents + irel->r_offset - 2) == 0x8b)
2862 bfd_put_8 (output_bfd, 0x8d,
2863 contents + irel->r_offset - 2);
2864 irel->r_info = htab->r_info (r_symndx, R_X86_64_PC32);
2865 if (h->got.refcount > 0)
2866 h->got.refcount -= 1;
2867 changed_contents = TRUE;
2868 changed_relocs = TRUE;
2872 if (contents != NULL
2873 && elf_section_data (sec)->this_hdr.contents != contents)
2875 if (!changed_contents && !link_info->keep_memory)
2876 free (contents);
2877 else
2879 /* Cache the section contents for elf_link_input_bfd. */
2880 elf_section_data (sec)->this_hdr.contents = contents;
2884 if (elf_section_data (sec)->relocs != internal_relocs)
2886 if (!changed_relocs)
2887 free (internal_relocs);
2888 else
2889 elf_section_data (sec)->relocs = internal_relocs;
2892 return TRUE;
2894 error_return:
2895 if (contents != NULL
2896 && elf_section_data (sec)->this_hdr.contents != contents)
2897 free (contents);
2898 if (internal_relocs != NULL
2899 && elf_section_data (sec)->relocs != internal_relocs)
2900 free (internal_relocs);
2901 return FALSE;
2904 /* Set the sizes of the dynamic sections. */
2906 static bfd_boolean
2907 elf_x86_64_size_dynamic_sections (bfd *output_bfd,
2908 struct bfd_link_info *info)
2910 struct elf_x86_64_link_hash_table *htab;
2911 bfd *dynobj;
2912 asection *s;
2913 bfd_boolean relocs;
2914 bfd *ibfd;
2915 const struct elf_backend_data *bed;
2917 htab = elf_x86_64_hash_table (info);
2918 if (htab == NULL)
2919 return FALSE;
2920 bed = get_elf_backend_data (output_bfd);
2922 dynobj = htab->elf.dynobj;
2923 if (dynobj == NULL)
2924 abort ();
2926 if (htab->elf.dynamic_sections_created)
2928 /* Set the contents of the .interp section to the interpreter. */
2929 if (info->executable)
2931 s = bfd_get_linker_section (dynobj, ".interp");
2932 if (s == NULL)
2933 abort ();
2934 s->size = htab->dynamic_interpreter_size;
2935 s->contents = (unsigned char *) htab->dynamic_interpreter;
2939 /* Set up .got offsets for local syms, and space for local dynamic
2940 relocs. */
2941 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2943 bfd_signed_vma *local_got;
2944 bfd_signed_vma *end_local_got;
2945 char *local_tls_type;
2946 bfd_vma *local_tlsdesc_gotent;
2947 bfd_size_type locsymcount;
2948 Elf_Internal_Shdr *symtab_hdr;
2949 asection *srel;
2951 if (! is_x86_64_elf (ibfd))
2952 continue;
2954 for (s = ibfd->sections; s != NULL; s = s->next)
2956 struct elf_dyn_relocs *p;
2958 if (!elf_x86_64_convert_mov_to_lea (ibfd, s, info))
2959 return FALSE;
2961 for (p = (struct elf_dyn_relocs *)
2962 (elf_section_data (s)->local_dynrel);
2963 p != NULL;
2964 p = p->next)
2966 if (!bfd_is_abs_section (p->sec)
2967 && bfd_is_abs_section (p->sec->output_section))
2969 /* Input section has been discarded, either because
2970 it is a copy of a linkonce section or due to
2971 linker script /DISCARD/, so we'll be discarding
2972 the relocs too. */
2974 else if (p->count != 0)
2976 srel = elf_section_data (p->sec)->sreloc;
2977 srel->size += p->count * bed->s->sizeof_rela;
2978 if ((p->sec->output_section->flags & SEC_READONLY) != 0
2979 && (info->flags & DF_TEXTREL) == 0)
2981 info->flags |= DF_TEXTREL;
2982 if (info->warn_shared_textrel && info->shared)
2983 info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'.\n"),
2984 p->sec->owner, p->sec);
2990 local_got = elf_local_got_refcounts (ibfd);
2991 if (!local_got)
2992 continue;
2994 symtab_hdr = &elf_symtab_hdr (ibfd);
2995 locsymcount = symtab_hdr->sh_info;
2996 end_local_got = local_got + locsymcount;
2997 local_tls_type = elf_x86_64_local_got_tls_type (ibfd);
2998 local_tlsdesc_gotent = elf_x86_64_local_tlsdesc_gotent (ibfd);
2999 s = htab->elf.sgot;
3000 srel = htab->elf.srelgot;
3001 for (; local_got < end_local_got;
3002 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
3004 *local_tlsdesc_gotent = (bfd_vma) -1;
3005 if (*local_got > 0)
3007 if (GOT_TLS_GDESC_P (*local_tls_type))
3009 *local_tlsdesc_gotent = htab->elf.sgotplt->size
3010 - elf_x86_64_compute_jump_table_size (htab);
3011 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
3012 *local_got = (bfd_vma) -2;
3014 if (! GOT_TLS_GDESC_P (*local_tls_type)
3015 || GOT_TLS_GD_P (*local_tls_type))
3017 *local_got = s->size;
3018 s->size += GOT_ENTRY_SIZE;
3019 if (GOT_TLS_GD_P (*local_tls_type))
3020 s->size += GOT_ENTRY_SIZE;
3022 if (info->shared
3023 || GOT_TLS_GD_ANY_P (*local_tls_type)
3024 || *local_tls_type == GOT_TLS_IE)
3026 if (GOT_TLS_GDESC_P (*local_tls_type))
3028 htab->elf.srelplt->size
3029 += bed->s->sizeof_rela;
3030 htab->tlsdesc_plt = (bfd_vma) -1;
3032 if (! GOT_TLS_GDESC_P (*local_tls_type)
3033 || GOT_TLS_GD_P (*local_tls_type))
3034 srel->size += bed->s->sizeof_rela;
3037 else
3038 *local_got = (bfd_vma) -1;
3042 if (htab->tls_ld_got.refcount > 0)
3044 /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
3045 relocs. */
3046 htab->tls_ld_got.offset = htab->elf.sgot->size;
3047 htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE;
3048 htab->elf.srelgot->size += bed->s->sizeof_rela;
3050 else
3051 htab->tls_ld_got.offset = -1;
3053 /* Allocate global sym .plt and .got entries, and space for global
3054 sym dynamic relocs. */
3055 elf_link_hash_traverse (&htab->elf, elf_x86_64_allocate_dynrelocs,
3056 info);
3058 /* Allocate .plt and .got entries, and space for local symbols. */
3059 htab_traverse (htab->loc_hash_table,
3060 elf_x86_64_allocate_local_dynrelocs,
3061 info);
3063 /* For every jump slot reserved in the sgotplt, reloc_count is
3064 incremented. However, when we reserve space for TLS descriptors,
3065 it's not incremented, so in order to compute the space reserved
3066 for them, it suffices to multiply the reloc count by the jump
3067 slot size.
3069 PR ld/13302: We start next_irelative_index at the end of .rela.plt
3070 so that R_X86_64_IRELATIVE entries come last. */
3071 if (htab->elf.srelplt)
3073 htab->sgotplt_jump_table_size
3074 = elf_x86_64_compute_jump_table_size (htab);
3075 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
3077 else if (htab->elf.irelplt)
3078 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
3080 if (htab->tlsdesc_plt)
3082 /* If we're not using lazy TLS relocations, don't generate the
3083 PLT and GOT entries they require. */
3084 if ((info->flags & DF_BIND_NOW))
3085 htab->tlsdesc_plt = 0;
3086 else
3088 htab->tlsdesc_got = htab->elf.sgot->size;
3089 htab->elf.sgot->size += GOT_ENTRY_SIZE;
3090 /* Reserve room for the initial entry.
3091 FIXME: we could probably do away with it in this case. */
3092 if (htab->elf.splt->size == 0)
3093 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
3094 htab->tlsdesc_plt = htab->elf.splt->size;
3095 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
3099 if (htab->elf.sgotplt)
3101 /* Don't allocate .got.plt section if there are no GOT nor PLT
3102 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
3103 if ((htab->elf.hgot == NULL
3104 || !htab->elf.hgot->ref_regular_nonweak)
3105 && (htab->elf.sgotplt->size
3106 == get_elf_backend_data (output_bfd)->got_header_size)
3107 && (htab->elf.splt == NULL
3108 || htab->elf.splt->size == 0)
3109 && (htab->elf.sgot == NULL
3110 || htab->elf.sgot->size == 0)
3111 && (htab->elf.iplt == NULL
3112 || htab->elf.iplt->size == 0)
3113 && (htab->elf.igotplt == NULL
3114 || htab->elf.igotplt->size == 0))
3115 htab->elf.sgotplt->size = 0;
3118 if (htab->plt_eh_frame != NULL
3119 && htab->elf.splt != NULL
3120 && htab->elf.splt->size != 0
3121 && !bfd_is_abs_section (htab->elf.splt->output_section)
3122 && _bfd_elf_eh_frame_present (info))
3124 const struct elf_x86_64_backend_data *arch_data
3125 = get_elf_x86_64_arch_data (bed);
3126 htab->plt_eh_frame->size = arch_data->eh_frame_plt_size;
3129 /* We now have determined the sizes of the various dynamic sections.
3130 Allocate memory for them. */
3131 relocs = FALSE;
3132 for (s = dynobj->sections; s != NULL; s = s->next)
3134 if ((s->flags & SEC_LINKER_CREATED) == 0)
3135 continue;
3137 if (s == htab->elf.splt
3138 || s == htab->elf.sgot
3139 || s == htab->elf.sgotplt
3140 || s == htab->elf.iplt
3141 || s == htab->elf.igotplt
3142 || s == htab->plt_bnd
3143 || s == htab->plt_eh_frame
3144 || s == htab->sdynbss)
3146 /* Strip this section if we don't need it; see the
3147 comment below. */
3149 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
3151 if (s->size != 0 && s != htab->elf.srelplt)
3152 relocs = TRUE;
3154 /* We use the reloc_count field as a counter if we need
3155 to copy relocs into the output file. */
3156 if (s != htab->elf.srelplt)
3157 s->reloc_count = 0;
3159 else
3161 /* It's not one of our sections, so don't allocate space. */
3162 continue;
3165 if (s->size == 0)
3167 /* If we don't need this section, strip it from the
3168 output file. This is mostly to handle .rela.bss and
3169 .rela.plt. We must create both sections in
3170 create_dynamic_sections, because they must be created
3171 before the linker maps input sections to output
3172 sections. The linker does that before
3173 adjust_dynamic_symbol is called, and it is that
3174 function which decides whether anything needs to go
3175 into these sections. */
3177 s->flags |= SEC_EXCLUDE;
3178 continue;
3181 if ((s->flags & SEC_HAS_CONTENTS) == 0)
3182 continue;
3184 /* Allocate memory for the section contents. We use bfd_zalloc
3185 here in case unused entries are not reclaimed before the
3186 section's contents are written out. This should not happen,
3187 but this way if it does, we get a R_X86_64_NONE reloc instead
3188 of garbage. */
3189 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
3190 if (s->contents == NULL)
3191 return FALSE;
3194 if (htab->plt_eh_frame != NULL
3195 && htab->plt_eh_frame->contents != NULL)
3197 const struct elf_x86_64_backend_data *arch_data
3198 = get_elf_x86_64_arch_data (bed);
3200 memcpy (htab->plt_eh_frame->contents,
3201 arch_data->eh_frame_plt, htab->plt_eh_frame->size);
3202 bfd_put_32 (dynobj, htab->elf.splt->size,
3203 htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
3206 if (htab->elf.dynamic_sections_created)
3208 /* Add some entries to the .dynamic section. We fill in the
3209 values later, in elf_x86_64_finish_dynamic_sections, but we
3210 must add the entries now so that we get the correct size for
3211 the .dynamic section. The DT_DEBUG entry is filled in by the
3212 dynamic linker and used by the debugger. */
3213 #define add_dynamic_entry(TAG, VAL) \
3214 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3216 if (info->executable)
3218 if (!add_dynamic_entry (DT_DEBUG, 0))
3219 return FALSE;
3222 if (htab->elf.splt->size != 0)
3224 if (!add_dynamic_entry (DT_PLTGOT, 0)
3225 || !add_dynamic_entry (DT_PLTRELSZ, 0)
3226 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3227 || !add_dynamic_entry (DT_JMPREL, 0))
3228 return FALSE;
3230 if (htab->tlsdesc_plt
3231 && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
3232 || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
3233 return FALSE;
3236 if (relocs)
3238 if (!add_dynamic_entry (DT_RELA, 0)
3239 || !add_dynamic_entry (DT_RELASZ, 0)
3240 || !add_dynamic_entry (DT_RELAENT, bed->s->sizeof_rela))
3241 return FALSE;
3243 /* If any dynamic relocs apply to a read-only section,
3244 then we need a DT_TEXTREL entry. */
3245 if ((info->flags & DF_TEXTREL) == 0)
3246 elf_link_hash_traverse (&htab->elf,
3247 elf_x86_64_readonly_dynrelocs,
3248 info);
3250 if ((info->flags & DF_TEXTREL) != 0)
3252 if (!add_dynamic_entry (DT_TEXTREL, 0))
3253 return FALSE;
3257 #undef add_dynamic_entry
3259 return TRUE;
3262 static bfd_boolean
3263 elf_x86_64_always_size_sections (bfd *output_bfd,
3264 struct bfd_link_info *info)
3266 asection *tls_sec = elf_hash_table (info)->tls_sec;
3268 if (tls_sec)
3270 struct elf_link_hash_entry *tlsbase;
3272 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3273 "_TLS_MODULE_BASE_",
3274 FALSE, FALSE, FALSE);
3276 if (tlsbase && tlsbase->type == STT_TLS)
3278 struct elf_x86_64_link_hash_table *htab;
3279 struct bfd_link_hash_entry *bh = NULL;
3280 const struct elf_backend_data *bed
3281 = get_elf_backend_data (output_bfd);
3283 htab = elf_x86_64_hash_table (info);
3284 if (htab == NULL)
3285 return FALSE;
3287 if (!(_bfd_generic_link_add_one_symbol
3288 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3289 tls_sec, 0, NULL, FALSE,
3290 bed->collect, &bh)))
3291 return FALSE;
3293 htab->tls_module_base = bh;
3295 tlsbase = (struct elf_link_hash_entry *)bh;
3296 tlsbase->def_regular = 1;
3297 tlsbase->other = STV_HIDDEN;
3298 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3302 return TRUE;
3305 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3306 executables. Rather than setting it to the beginning of the TLS
3307 section, we have to set it to the end. This function may be called
3308 multiple times, it is idempotent. */
3310 static void
3311 elf_x86_64_set_tls_module_base (struct bfd_link_info *info)
3313 struct elf_x86_64_link_hash_table *htab;
3314 struct bfd_link_hash_entry *base;
3316 if (!info->executable)
3317 return;
3319 htab = elf_x86_64_hash_table (info);
3320 if (htab == NULL)
3321 return;
3323 base = htab->tls_module_base;
3324 if (base == NULL)
3325 return;
3327 base->u.def.value = htab->elf.tls_size;
3330 /* Return the base VMA address which should be subtracted from real addresses
3331 when resolving @dtpoff relocation.
3332 This is PT_TLS segment p_vaddr. */
3334 static bfd_vma
3335 elf_x86_64_dtpoff_base (struct bfd_link_info *info)
3337 /* If tls_sec is NULL, we should have signalled an error already. */
3338 if (elf_hash_table (info)->tls_sec == NULL)
3339 return 0;
3340 return elf_hash_table (info)->tls_sec->vma;
3343 /* Return the relocation value for @tpoff relocation
3344 if STT_TLS virtual address is ADDRESS. */
3346 static bfd_vma
3347 elf_x86_64_tpoff (struct bfd_link_info *info, bfd_vma address)
3349 struct elf_link_hash_table *htab = elf_hash_table (info);
3350 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3351 bfd_vma static_tls_size;
3353 /* If tls_segment is NULL, we should have signalled an error already. */
3354 if (htab->tls_sec == NULL)
3355 return 0;
3357 /* Consider special static TLS alignment requirements. */
3358 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3359 return address - static_tls_size - htab->tls_sec->vma;
3362 /* Is the instruction before OFFSET in CONTENTS a 32bit relative
3363 branch? */
3365 static bfd_boolean
3366 is_32bit_relative_branch (bfd_byte *contents, bfd_vma offset)
3368 /* Opcode Instruction
3369 0xe8 call
3370 0xe9 jump
3371 0x0f 0x8x conditional jump */
3372 return ((offset > 0
3373 && (contents [offset - 1] == 0xe8
3374 || contents [offset - 1] == 0xe9))
3375 || (offset > 1
3376 && contents [offset - 2] == 0x0f
3377 && (contents [offset - 1] & 0xf0) == 0x80));
3380 /* Relocate an x86_64 ELF section. */
3382 static bfd_boolean
3383 elf_x86_64_relocate_section (bfd *output_bfd,
3384 struct bfd_link_info *info,
3385 bfd *input_bfd,
3386 asection *input_section,
3387 bfd_byte *contents,
3388 Elf_Internal_Rela *relocs,
3389 Elf_Internal_Sym *local_syms,
3390 asection **local_sections)
3392 struct elf_x86_64_link_hash_table *htab;
3393 Elf_Internal_Shdr *symtab_hdr;
3394 struct elf_link_hash_entry **sym_hashes;
3395 bfd_vma *local_got_offsets;
3396 bfd_vma *local_tlsdesc_gotents;
3397 Elf_Internal_Rela *rel;
3398 Elf_Internal_Rela *relend;
3399 const unsigned int plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
3401 BFD_ASSERT (is_x86_64_elf (input_bfd));
3403 htab = elf_x86_64_hash_table (info);
3404 if (htab == NULL)
3405 return FALSE;
3406 symtab_hdr = &elf_symtab_hdr (input_bfd);
3407 sym_hashes = elf_sym_hashes (input_bfd);
3408 local_got_offsets = elf_local_got_offsets (input_bfd);
3409 local_tlsdesc_gotents = elf_x86_64_local_tlsdesc_gotent (input_bfd);
3411 elf_x86_64_set_tls_module_base (info);
3413 rel = relocs;
3414 relend = relocs + input_section->reloc_count;
3415 for (; rel < relend; rel++)
3417 unsigned int r_type;
3418 reloc_howto_type *howto;
3419 unsigned long r_symndx;
3420 struct elf_link_hash_entry *h;
3421 struct elf_x86_64_link_hash_entry *eh;
3422 Elf_Internal_Sym *sym;
3423 asection *sec;
3424 bfd_vma off, offplt, plt_offset;
3425 bfd_vma relocation;
3426 bfd_boolean unresolved_reloc;
3427 bfd_reloc_status_type r;
3428 int tls_type;
3429 asection *base_got, *resolved_plt;
3430 bfd_vma st_size;
3432 r_type = ELF32_R_TYPE (rel->r_info);
3433 if (r_type == (int) R_X86_64_GNU_VTINHERIT
3434 || r_type == (int) R_X86_64_GNU_VTENTRY)
3435 continue;
3437 if (r_type >= (int) R_X86_64_standard)
3439 (*_bfd_error_handler)
3440 (_("%B: unrecognized relocation (0x%x) in section `%A'"),
3441 input_bfd, input_section, r_type);
3442 bfd_set_error (bfd_error_bad_value);
3443 return FALSE;
3446 if (r_type != (int) R_X86_64_32
3447 || ABI_64_P (output_bfd))
3448 howto = x86_64_elf_howto_table + r_type;
3449 else
3450 howto = (x86_64_elf_howto_table
3451 + ARRAY_SIZE (x86_64_elf_howto_table) - 1);
3452 r_symndx = htab->r_sym (rel->r_info);
3453 h = NULL;
3454 sym = NULL;
3455 sec = NULL;
3456 unresolved_reloc = FALSE;
3457 if (r_symndx < symtab_hdr->sh_info)
3459 sym = local_syms + r_symndx;
3460 sec = local_sections[r_symndx];
3462 relocation = _bfd_elf_rela_local_sym (output_bfd, sym,
3463 &sec, rel);
3464 st_size = sym->st_size;
3466 /* Relocate against local STT_GNU_IFUNC symbol. */
3467 if (!info->relocatable
3468 && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3470 h = elf_x86_64_get_local_sym_hash (htab, input_bfd,
3471 rel, FALSE);
3472 if (h == NULL)
3473 abort ();
3475 /* Set STT_GNU_IFUNC symbol value. */
3476 h->root.u.def.value = sym->st_value;
3477 h->root.u.def.section = sec;
3480 else
3482 bfd_boolean warned ATTRIBUTE_UNUSED;
3483 bfd_boolean ignored ATTRIBUTE_UNUSED;
3485 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3486 r_symndx, symtab_hdr, sym_hashes,
3487 h, sec, relocation,
3488 unresolved_reloc, warned, ignored);
3489 st_size = h->size;
3492 if (sec != NULL && discarded_section (sec))
3493 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3494 rel, 1, relend, howto, 0, contents);
3496 if (info->relocatable)
3497 continue;
3499 if (rel->r_addend == 0 && !ABI_64_P (output_bfd))
3501 if (r_type == R_X86_64_64)
3503 /* For x32, treat R_X86_64_64 like R_X86_64_32 and
3504 zero-extend it to 64bit if addend is zero. */
3505 r_type = R_X86_64_32;
3506 memset (contents + rel->r_offset + 4, 0, 4);
3508 else if (r_type == R_X86_64_SIZE64)
3510 /* For x32, treat R_X86_64_SIZE64 like R_X86_64_SIZE32 and
3511 zero-extend it to 64bit if addend is zero. */
3512 r_type = R_X86_64_SIZE32;
3513 memset (contents + rel->r_offset + 4, 0, 4);
3517 eh = (struct elf_x86_64_link_hash_entry *) h;
3519 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
3520 it here if it is defined in a non-shared object. */
3521 if (h != NULL
3522 && h->type == STT_GNU_IFUNC
3523 && h->def_regular)
3525 bfd_vma plt_index;
3526 const char *name;
3528 if ((input_section->flags & SEC_ALLOC) == 0
3529 || h->plt.offset == (bfd_vma) -1)
3530 abort ();
3532 /* STT_GNU_IFUNC symbol must go through PLT. */
3533 if (htab->elf.splt != NULL)
3535 if (htab->plt_bnd != NULL)
3537 resolved_plt = htab->plt_bnd;
3538 plt_offset = eh->plt_bnd.offset;
3540 else
3542 resolved_plt = htab->elf.splt;
3543 plt_offset = h->plt.offset;
3546 else
3548 resolved_plt = htab->elf.iplt;
3549 plt_offset = h->plt.offset;
3552 relocation = (resolved_plt->output_section->vma
3553 + resolved_plt->output_offset + plt_offset);
3555 switch (r_type)
3557 default:
3558 if (h->root.root.string)
3559 name = h->root.root.string;
3560 else
3561 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3562 NULL);
3563 (*_bfd_error_handler)
3564 (_("%B: relocation %s against STT_GNU_IFUNC "
3565 "symbol `%s' isn't handled by %s"), input_bfd,
3566 x86_64_elf_howto_table[r_type].name,
3567 name, __FUNCTION__);
3568 bfd_set_error (bfd_error_bad_value);
3569 return FALSE;
3571 case R_X86_64_32S:
3572 if (info->shared)
3573 abort ();
3574 goto do_relocation;
3576 case R_X86_64_32:
3577 if (ABI_64_P (output_bfd))
3578 goto do_relocation;
3579 /* FALLTHROUGH */
3580 case R_X86_64_64:
3581 if (rel->r_addend != 0)
3583 if (h->root.root.string)
3584 name = h->root.root.string;
3585 else
3586 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
3587 sym, NULL);
3588 (*_bfd_error_handler)
3589 (_("%B: relocation %s against STT_GNU_IFUNC "
3590 "symbol `%s' has non-zero addend: %d"),
3591 input_bfd, x86_64_elf_howto_table[r_type].name,
3592 name, rel->r_addend);
3593 bfd_set_error (bfd_error_bad_value);
3594 return FALSE;
3597 /* Generate dynamic relcoation only when there is a
3598 non-GOT reference in a shared object. */
3599 if (info->shared && h->non_got_ref)
3601 Elf_Internal_Rela outrel;
3602 asection *sreloc;
3604 /* Need a dynamic relocation to get the real function
3605 address. */
3606 outrel.r_offset = _bfd_elf_section_offset (output_bfd,
3607 info,
3608 input_section,
3609 rel->r_offset);
3610 if (outrel.r_offset == (bfd_vma) -1
3611 || outrel.r_offset == (bfd_vma) -2)
3612 abort ();
3614 outrel.r_offset += (input_section->output_section->vma
3615 + input_section->output_offset);
3617 if (h->dynindx == -1
3618 || h->forced_local
3619 || info->executable)
3621 /* This symbol is resolved locally. */
3622 outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
3623 outrel.r_addend = (h->root.u.def.value
3624 + h->root.u.def.section->output_section->vma
3625 + h->root.u.def.section->output_offset);
3627 else
3629 outrel.r_info = htab->r_info (h->dynindx, r_type);
3630 outrel.r_addend = 0;
3633 sreloc = htab->elf.irelifunc;
3634 elf_append_rela (output_bfd, sreloc, &outrel);
3636 /* If this reloc is against an external symbol, we
3637 do not want to fiddle with the addend. Otherwise,
3638 we need to include the symbol value so that it
3639 becomes an addend for the dynamic reloc. For an
3640 internal symbol, we have updated addend. */
3641 continue;
3643 /* FALLTHROUGH */
3644 case R_X86_64_PC32:
3645 case R_X86_64_PC32_BND:
3646 case R_X86_64_PC64:
3647 case R_X86_64_PLT32:
3648 case R_X86_64_PLT32_BND:
3649 goto do_relocation;
3651 case R_X86_64_GOTPCREL:
3652 case R_X86_64_GOTPCREL64:
3653 base_got = htab->elf.sgot;
3654 off = h->got.offset;
3656 if (base_got == NULL)
3657 abort ();
3659 if (off == (bfd_vma) -1)
3661 /* We can't use h->got.offset here to save state, or
3662 even just remember the offset, as finish_dynamic_symbol
3663 would use that as offset into .got. */
3665 if (htab->elf.splt != NULL)
3667 plt_index = h->plt.offset / plt_entry_size - 1;
3668 off = (plt_index + 3) * GOT_ENTRY_SIZE;
3669 base_got = htab->elf.sgotplt;
3671 else
3673 plt_index = h->plt.offset / plt_entry_size;
3674 off = plt_index * GOT_ENTRY_SIZE;
3675 base_got = htab->elf.igotplt;
3678 if (h->dynindx == -1
3679 || h->forced_local
3680 || info->symbolic)
3682 /* This references the local defitionion. We must
3683 initialize this entry in the global offset table.
3684 Since the offset must always be a multiple of 8,
3685 we use the least significant bit to record
3686 whether we have initialized it already.
3688 When doing a dynamic link, we create a .rela.got
3689 relocation entry to initialize the value. This
3690 is done in the finish_dynamic_symbol routine. */
3691 if ((off & 1) != 0)
3692 off &= ~1;
3693 else
3695 bfd_put_64 (output_bfd, relocation,
3696 base_got->contents + off);
3697 /* Note that this is harmless for the GOTPLT64
3698 case, as -1 | 1 still is -1. */
3699 h->got.offset |= 1;
3704 relocation = (base_got->output_section->vma
3705 + base_got->output_offset + off);
3707 goto do_relocation;
3711 /* When generating a shared object, the relocations handled here are
3712 copied into the output file to be resolved at run time. */
3713 switch (r_type)
3715 case R_X86_64_GOT32:
3716 case R_X86_64_GOT64:
3717 /* Relocation is to the entry for this symbol in the global
3718 offset table. */
3719 case R_X86_64_GOTPCREL:
3720 case R_X86_64_GOTPCREL64:
3721 /* Use global offset table entry as symbol value. */
3722 case R_X86_64_GOTPLT64:
3723 /* This is the same as GOT64 for relocation purposes, but
3724 indicates the existence of a PLT entry. The difficulty is,
3725 that we must calculate the GOT slot offset from the PLT
3726 offset, if this symbol got a PLT entry (it was global).
3727 Additionally if it's computed from the PLT entry, then that
3728 GOT offset is relative to .got.plt, not to .got. */
3729 base_got = htab->elf.sgot;
3731 if (htab->elf.sgot == NULL)
3732 abort ();
3734 if (h != NULL)
3736 bfd_boolean dyn;
3738 off = h->got.offset;
3739 if (h->needs_plt
3740 && h->plt.offset != (bfd_vma)-1
3741 && off == (bfd_vma)-1)
3743 /* We can't use h->got.offset here to save
3744 state, or even just remember the offset, as
3745 finish_dynamic_symbol would use that as offset into
3746 .got. */
3747 bfd_vma plt_index = h->plt.offset / plt_entry_size - 1;
3748 off = (plt_index + 3) * GOT_ENTRY_SIZE;
3749 base_got = htab->elf.sgotplt;
3752 dyn = htab->elf.dynamic_sections_created;
3754 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3755 || (info->shared
3756 && SYMBOL_REFERENCES_LOCAL (info, h))
3757 || (ELF_ST_VISIBILITY (h->other)
3758 && h->root.type == bfd_link_hash_undefweak))
3760 /* This is actually a static link, or it is a -Bsymbolic
3761 link and the symbol is defined locally, or the symbol
3762 was forced to be local because of a version file. We
3763 must initialize this entry in the global offset table.
3764 Since the offset must always be a multiple of 8, we
3765 use the least significant bit to record whether we
3766 have initialized it already.
3768 When doing a dynamic link, we create a .rela.got
3769 relocation entry to initialize the value. This is
3770 done in the finish_dynamic_symbol routine. */
3771 if ((off & 1) != 0)
3772 off &= ~1;
3773 else
3775 bfd_put_64 (output_bfd, relocation,
3776 base_got->contents + off);
3777 /* Note that this is harmless for the GOTPLT64 case,
3778 as -1 | 1 still is -1. */
3779 h->got.offset |= 1;
3782 else
3783 unresolved_reloc = FALSE;
3785 else
3787 if (local_got_offsets == NULL)
3788 abort ();
3790 off = local_got_offsets[r_symndx];
3792 /* The offset must always be a multiple of 8. We use
3793 the least significant bit to record whether we have
3794 already generated the necessary reloc. */
3795 if ((off & 1) != 0)
3796 off &= ~1;
3797 else
3799 bfd_put_64 (output_bfd, relocation,
3800 base_got->contents + off);
3802 if (info->shared)
3804 asection *s;
3805 Elf_Internal_Rela outrel;
3807 /* We need to generate a R_X86_64_RELATIVE reloc
3808 for the dynamic linker. */
3809 s = htab->elf.srelgot;
3810 if (s == NULL)
3811 abort ();
3813 outrel.r_offset = (base_got->output_section->vma
3814 + base_got->output_offset
3815 + off);
3816 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
3817 outrel.r_addend = relocation;
3818 elf_append_rela (output_bfd, s, &outrel);
3821 local_got_offsets[r_symndx] |= 1;
3825 if (off >= (bfd_vma) -2)
3826 abort ();
3828 relocation = base_got->output_section->vma
3829 + base_got->output_offset + off;
3830 if (r_type != R_X86_64_GOTPCREL && r_type != R_X86_64_GOTPCREL64)
3831 relocation -= htab->elf.sgotplt->output_section->vma
3832 - htab->elf.sgotplt->output_offset;
3834 break;
3836 case R_X86_64_GOTOFF64:
3837 /* Relocation is relative to the start of the global offset
3838 table. */
3840 /* Check to make sure it isn't a protected function symbol
3841 for shared library since it may not be local when used
3842 as function address. */
3843 if (!info->executable
3844 && h
3845 && !SYMBOLIC_BIND (info, h)
3846 && h->def_regular
3847 && h->type == STT_FUNC
3848 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
3850 (*_bfd_error_handler)
3851 (_("%B: relocation R_X86_64_GOTOFF64 against protected function `%s' can not be used when making a shared object"),
3852 input_bfd, h->root.root.string);
3853 bfd_set_error (bfd_error_bad_value);
3854 return FALSE;
3857 /* Note that sgot is not involved in this
3858 calculation. We always want the start of .got.plt. If we
3859 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
3860 permitted by the ABI, we might have to change this
3861 calculation. */
3862 relocation -= htab->elf.sgotplt->output_section->vma
3863 + htab->elf.sgotplt->output_offset;
3864 break;
3866 case R_X86_64_GOTPC32:
3867 case R_X86_64_GOTPC64:
3868 /* Use global offset table as symbol value. */
3869 relocation = htab->elf.sgotplt->output_section->vma
3870 + htab->elf.sgotplt->output_offset;
3871 unresolved_reloc = FALSE;
3872 break;
3874 case R_X86_64_PLTOFF64:
3875 /* Relocation is PLT entry relative to GOT. For local
3876 symbols it's the symbol itself relative to GOT. */
3877 if (h != NULL
3878 /* See PLT32 handling. */
3879 && h->plt.offset != (bfd_vma) -1
3880 && htab->elf.splt != NULL)
3882 if (htab->plt_bnd != NULL)
3884 resolved_plt = htab->plt_bnd;
3885 plt_offset = eh->plt_bnd.offset;
3887 else
3889 resolved_plt = htab->elf.splt;
3890 plt_offset = h->plt.offset;
3893 relocation = (resolved_plt->output_section->vma
3894 + resolved_plt->output_offset
3895 + plt_offset);
3896 unresolved_reloc = FALSE;
3899 relocation -= htab->elf.sgotplt->output_section->vma
3900 + htab->elf.sgotplt->output_offset;
3901 break;
3903 case R_X86_64_PLT32:
3904 case R_X86_64_PLT32_BND:
3905 /* Relocation is to the entry for this symbol in the
3906 procedure linkage table. */
3908 /* Resolve a PLT32 reloc against a local symbol directly,
3909 without using the procedure linkage table. */
3910 if (h == NULL)
3911 break;
3913 if (h->plt.offset == (bfd_vma) -1
3914 || htab->elf.splt == NULL)
3916 /* We didn't make a PLT entry for this symbol. This
3917 happens when statically linking PIC code, or when
3918 using -Bsymbolic. */
3919 break;
3922 if (htab->plt_bnd != NULL)
3924 resolved_plt = htab->plt_bnd;
3925 plt_offset = eh->plt_bnd.offset;
3927 else
3929 resolved_plt = htab->elf.splt;
3930 plt_offset = h->plt.offset;
3933 relocation = (resolved_plt->output_section->vma
3934 + resolved_plt->output_offset
3935 + plt_offset);
3936 unresolved_reloc = FALSE;
3937 break;
3939 case R_X86_64_SIZE32:
3940 case R_X86_64_SIZE64:
3941 /* Set to symbol size. */
3942 relocation = st_size;
3943 goto direct;
3945 case R_X86_64_PC8:
3946 case R_X86_64_PC16:
3947 case R_X86_64_PC32:
3948 case R_X86_64_PC32_BND:
3949 if (info->shared
3950 && (input_section->flags & SEC_ALLOC) != 0
3951 && (input_section->flags & SEC_READONLY) != 0
3952 && h != NULL)
3954 bfd_boolean fail = FALSE;
3955 bfd_boolean branch
3956 = ((r_type == R_X86_64_PC32
3957 || r_type == R_X86_64_PC32_BND)
3958 && is_32bit_relative_branch (contents, rel->r_offset));
3960 if (SYMBOL_REFERENCES_LOCAL (info, h))
3962 /* Symbol is referenced locally. Make sure it is
3963 defined locally or for a branch. */
3964 fail = !h->def_regular && !branch;
3966 else
3968 /* Symbol isn't referenced locally. We only allow
3969 branch to symbol with non-default visibility. */
3970 fail = (!branch
3971 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT);
3974 if (fail)
3976 const char *fmt;
3977 const char *v;
3978 const char *pic = "";
3980 switch (ELF_ST_VISIBILITY (h->other))
3982 case STV_HIDDEN:
3983 v = _("hidden symbol");
3984 break;
3985 case STV_INTERNAL:
3986 v = _("internal symbol");
3987 break;
3988 case STV_PROTECTED:
3989 v = _("protected symbol");
3990 break;
3991 default:
3992 v = _("symbol");
3993 pic = _("; recompile with -fPIC");
3994 break;
3997 if (h->def_regular)
3998 fmt = _("%B: relocation %s against %s `%s' can not be used when making a shared object%s");
3999 else
4000 fmt = _("%B: relocation %s against undefined %s `%s' can not be used when making a shared object%s");
4002 (*_bfd_error_handler) (fmt, input_bfd,
4003 x86_64_elf_howto_table[r_type].name,
4004 v, h->root.root.string, pic);
4005 bfd_set_error (bfd_error_bad_value);
4006 return FALSE;
4009 /* Fall through. */
4011 case R_X86_64_8:
4012 case R_X86_64_16:
4013 case R_X86_64_32:
4014 case R_X86_64_PC64:
4015 case R_X86_64_64:
4016 /* FIXME: The ABI says the linker should make sure the value is
4017 the same when it's zeroextended to 64 bit. */
4019 direct:
4020 if ((input_section->flags & SEC_ALLOC) == 0)
4021 break;
4023 if ((info->shared
4024 && (h == NULL
4025 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4026 || h->root.type != bfd_link_hash_undefweak)
4027 && ((! IS_X86_64_PCREL_TYPE (r_type)
4028 && r_type != R_X86_64_SIZE32
4029 && r_type != R_X86_64_SIZE64)
4030 || ! SYMBOL_CALLS_LOCAL (info, h)))
4031 || (ELIMINATE_COPY_RELOCS
4032 && !info->shared
4033 && h != NULL
4034 && h->dynindx != -1
4035 && !h->non_got_ref
4036 && ((h->def_dynamic
4037 && !h->def_regular)
4038 || h->root.type == bfd_link_hash_undefweak
4039 || h->root.type == bfd_link_hash_undefined)))
4041 Elf_Internal_Rela outrel;
4042 bfd_boolean skip, relocate;
4043 asection *sreloc;
4045 /* When generating a shared object, these relocations
4046 are copied into the output file to be resolved at run
4047 time. */
4048 skip = FALSE;
4049 relocate = FALSE;
4051 outrel.r_offset =
4052 _bfd_elf_section_offset (output_bfd, info, input_section,
4053 rel->r_offset);
4054 if (outrel.r_offset == (bfd_vma) -1)
4055 skip = TRUE;
4056 else if (outrel.r_offset == (bfd_vma) -2)
4057 skip = TRUE, relocate = TRUE;
4059 outrel.r_offset += (input_section->output_section->vma
4060 + input_section->output_offset);
4062 if (skip)
4063 memset (&outrel, 0, sizeof outrel);
4065 /* h->dynindx may be -1 if this symbol was marked to
4066 become local. */
4067 else if (h != NULL
4068 && h->dynindx != -1
4069 && (IS_X86_64_PCREL_TYPE (r_type)
4070 || ! info->shared
4071 || ! SYMBOLIC_BIND (info, h)
4072 || ! h->def_regular))
4074 outrel.r_info = htab->r_info (h->dynindx, r_type);
4075 outrel.r_addend = rel->r_addend;
4077 else
4079 /* This symbol is local, or marked to become local. */
4080 if (r_type == htab->pointer_r_type)
4082 relocate = TRUE;
4083 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4084 outrel.r_addend = relocation + rel->r_addend;
4086 else if (r_type == R_X86_64_64
4087 && !ABI_64_P (output_bfd))
4089 relocate = TRUE;
4090 outrel.r_info = htab->r_info (0,
4091 R_X86_64_RELATIVE64);
4092 outrel.r_addend = relocation + rel->r_addend;
4093 /* Check addend overflow. */
4094 if ((outrel.r_addend & 0x80000000)
4095 != (rel->r_addend & 0x80000000))
4097 const char *name;
4098 int addend = rel->r_addend;
4099 if (h && h->root.root.string)
4100 name = h->root.root.string;
4101 else
4102 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
4103 sym, NULL);
4104 if (addend < 0)
4105 (*_bfd_error_handler)
4106 (_("%B: addend -0x%x in relocation %s against "
4107 "symbol `%s' at 0x%lx in section `%A' is "
4108 "out of range"),
4109 input_bfd, input_section, addend,
4110 x86_64_elf_howto_table[r_type].name,
4111 name, (unsigned long) rel->r_offset);
4112 else
4113 (*_bfd_error_handler)
4114 (_("%B: addend 0x%x in relocation %s against "
4115 "symbol `%s' at 0x%lx in section `%A' is "
4116 "out of range"),
4117 input_bfd, input_section, addend,
4118 x86_64_elf_howto_table[r_type].name,
4119 name, (unsigned long) rel->r_offset);
4120 bfd_set_error (bfd_error_bad_value);
4121 return FALSE;
4124 else
4126 long sindx;
4128 if (bfd_is_abs_section (sec))
4129 sindx = 0;
4130 else if (sec == NULL || sec->owner == NULL)
4132 bfd_set_error (bfd_error_bad_value);
4133 return FALSE;
4135 else
4137 asection *osec;
4139 /* We are turning this relocation into one
4140 against a section symbol. It would be
4141 proper to subtract the symbol's value,
4142 osec->vma, from the emitted reloc addend,
4143 but ld.so expects buggy relocs. */
4144 osec = sec->output_section;
4145 sindx = elf_section_data (osec)->dynindx;
4146 if (sindx == 0)
4148 asection *oi = htab->elf.text_index_section;
4149 sindx = elf_section_data (oi)->dynindx;
4151 BFD_ASSERT (sindx != 0);
4154 outrel.r_info = htab->r_info (sindx, r_type);
4155 outrel.r_addend = relocation + rel->r_addend;
4159 sreloc = elf_section_data (input_section)->sreloc;
4161 if (sreloc == NULL || sreloc->contents == NULL)
4163 r = bfd_reloc_notsupported;
4164 goto check_relocation_error;
4167 elf_append_rela (output_bfd, sreloc, &outrel);
4169 /* If this reloc is against an external symbol, we do
4170 not want to fiddle with the addend. Otherwise, we
4171 need to include the symbol value so that it becomes
4172 an addend for the dynamic reloc. */
4173 if (! relocate)
4174 continue;
4177 break;
4179 case R_X86_64_TLSGD:
4180 case R_X86_64_GOTPC32_TLSDESC:
4181 case R_X86_64_TLSDESC_CALL:
4182 case R_X86_64_GOTTPOFF:
4183 tls_type = GOT_UNKNOWN;
4184 if (h == NULL && local_got_offsets)
4185 tls_type = elf_x86_64_local_got_tls_type (input_bfd) [r_symndx];
4186 else if (h != NULL)
4187 tls_type = elf_x86_64_hash_entry (h)->tls_type;
4189 if (! elf_x86_64_tls_transition (info, input_bfd,
4190 input_section, contents,
4191 symtab_hdr, sym_hashes,
4192 &r_type, tls_type, rel,
4193 relend, h, r_symndx))
4194 return FALSE;
4196 if (r_type == R_X86_64_TPOFF32)
4198 bfd_vma roff = rel->r_offset;
4200 BFD_ASSERT (! unresolved_reloc);
4202 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
4204 /* GD->LE transition. For 64bit, change
4205 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4206 .word 0x6666; rex64; call __tls_get_addr
4207 into:
4208 movq %fs:0, %rax
4209 leaq foo@tpoff(%rax), %rax
4210 For 32bit, change
4211 leaq foo@tlsgd(%rip), %rdi
4212 .word 0x6666; rex64; call __tls_get_addr
4213 into:
4214 movl %fs:0, %eax
4215 leaq foo@tpoff(%rax), %rax
4216 For largepic, change:
4217 leaq foo@tlsgd(%rip), %rdi
4218 movabsq $__tls_get_addr@pltoff, %rax
4219 addq %rbx, %rax
4220 call *%rax
4221 into:
4222 movq %fs:0, %rax
4223 leaq foo@tpoff(%rax), %rax
4224 nopw 0x0(%rax,%rax,1) */
4225 int largepic = 0;
4226 if (ABI_64_P (output_bfd)
4227 && contents[roff + 5] == (bfd_byte) '\xb8')
4229 memcpy (contents + roff - 3,
4230 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80"
4231 "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
4232 largepic = 1;
4234 else if (ABI_64_P (output_bfd))
4235 memcpy (contents + roff - 4,
4236 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
4237 16);
4238 else
4239 memcpy (contents + roff - 3,
4240 "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
4241 15);
4242 bfd_put_32 (output_bfd,
4243 elf_x86_64_tpoff (info, relocation),
4244 contents + roff + 8 + largepic);
4245 /* Skip R_X86_64_PC32/R_X86_64_PLT32/R_X86_64_PLTOFF64. */
4246 rel++;
4247 continue;
4249 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
4251 /* GDesc -> LE transition.
4252 It's originally something like:
4253 leaq x@tlsdesc(%rip), %rax
4255 Change it to:
4256 movl $x@tpoff, %rax. */
4258 unsigned int val, type;
4260 type = bfd_get_8 (input_bfd, contents + roff - 3);
4261 val = bfd_get_8 (input_bfd, contents + roff - 1);
4262 bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
4263 contents + roff - 3);
4264 bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
4265 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4266 contents + roff - 1);
4267 bfd_put_32 (output_bfd,
4268 elf_x86_64_tpoff (info, relocation),
4269 contents + roff);
4270 continue;
4272 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
4274 /* GDesc -> LE transition.
4275 It's originally:
4276 call *(%rax)
4277 Turn it into:
4278 xchg %ax,%ax. */
4279 bfd_put_8 (output_bfd, 0x66, contents + roff);
4280 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4281 continue;
4283 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTTPOFF)
4285 /* IE->LE transition:
4286 For 64bit, originally it can be one of:
4287 movq foo@gottpoff(%rip), %reg
4288 addq foo@gottpoff(%rip), %reg
4289 We change it into:
4290 movq $foo, %reg
4291 leaq foo(%reg), %reg
4292 addq $foo, %reg.
4293 For 32bit, originally it can be one of:
4294 movq foo@gottpoff(%rip), %reg
4295 addl foo@gottpoff(%rip), %reg
4296 We change it into:
4297 movq $foo, %reg
4298 leal foo(%reg), %reg
4299 addl $foo, %reg. */
4301 unsigned int val, type, reg;
4303 if (roff >= 3)
4304 val = bfd_get_8 (input_bfd, contents + roff - 3);
4305 else
4306 val = 0;
4307 type = bfd_get_8 (input_bfd, contents + roff - 2);
4308 reg = bfd_get_8 (input_bfd, contents + roff - 1);
4309 reg >>= 3;
4310 if (type == 0x8b)
4312 /* movq */
4313 if (val == 0x4c)
4314 bfd_put_8 (output_bfd, 0x49,
4315 contents + roff - 3);
4316 else if (!ABI_64_P (output_bfd) && val == 0x44)
4317 bfd_put_8 (output_bfd, 0x41,
4318 contents + roff - 3);
4319 bfd_put_8 (output_bfd, 0xc7,
4320 contents + roff - 2);
4321 bfd_put_8 (output_bfd, 0xc0 | reg,
4322 contents + roff - 1);
4324 else if (reg == 4)
4326 /* addq/addl -> addq/addl - addressing with %rsp/%r12
4327 is special */
4328 if (val == 0x4c)
4329 bfd_put_8 (output_bfd, 0x49,
4330 contents + roff - 3);
4331 else if (!ABI_64_P (output_bfd) && val == 0x44)
4332 bfd_put_8 (output_bfd, 0x41,
4333 contents + roff - 3);
4334 bfd_put_8 (output_bfd, 0x81,
4335 contents + roff - 2);
4336 bfd_put_8 (output_bfd, 0xc0 | reg,
4337 contents + roff - 1);
4339 else
4341 /* addq/addl -> leaq/leal */
4342 if (val == 0x4c)
4343 bfd_put_8 (output_bfd, 0x4d,
4344 contents + roff - 3);
4345 else if (!ABI_64_P (output_bfd) && val == 0x44)
4346 bfd_put_8 (output_bfd, 0x45,
4347 contents + roff - 3);
4348 bfd_put_8 (output_bfd, 0x8d,
4349 contents + roff - 2);
4350 bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
4351 contents + roff - 1);
4353 bfd_put_32 (output_bfd,
4354 elf_x86_64_tpoff (info, relocation),
4355 contents + roff);
4356 continue;
4358 else
4359 BFD_ASSERT (FALSE);
4362 if (htab->elf.sgot == NULL)
4363 abort ();
4365 if (h != NULL)
4367 off = h->got.offset;
4368 offplt = elf_x86_64_hash_entry (h)->tlsdesc_got;
4370 else
4372 if (local_got_offsets == NULL)
4373 abort ();
4375 off = local_got_offsets[r_symndx];
4376 offplt = local_tlsdesc_gotents[r_symndx];
4379 if ((off & 1) != 0)
4380 off &= ~1;
4381 else
4383 Elf_Internal_Rela outrel;
4384 int dr_type, indx;
4385 asection *sreloc;
4387 if (htab->elf.srelgot == NULL)
4388 abort ();
4390 indx = h && h->dynindx != -1 ? h->dynindx : 0;
4392 if (GOT_TLS_GDESC_P (tls_type))
4394 outrel.r_info = htab->r_info (indx, R_X86_64_TLSDESC);
4395 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
4396 + 2 * GOT_ENTRY_SIZE <= htab->elf.sgotplt->size);
4397 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
4398 + htab->elf.sgotplt->output_offset
4399 + offplt
4400 + htab->sgotplt_jump_table_size);
4401 sreloc = htab->elf.srelplt;
4402 if (indx == 0)
4403 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
4404 else
4405 outrel.r_addend = 0;
4406 elf_append_rela (output_bfd, sreloc, &outrel);
4409 sreloc = htab->elf.srelgot;
4411 outrel.r_offset = (htab->elf.sgot->output_section->vma
4412 + htab->elf.sgot->output_offset + off);
4414 if (GOT_TLS_GD_P (tls_type))
4415 dr_type = R_X86_64_DTPMOD64;
4416 else if (GOT_TLS_GDESC_P (tls_type))
4417 goto dr_done;
4418 else
4419 dr_type = R_X86_64_TPOFF64;
4421 bfd_put_64 (output_bfd, 0, htab->elf.sgot->contents + off);
4422 outrel.r_addend = 0;
4423 if ((dr_type == R_X86_64_TPOFF64
4424 || dr_type == R_X86_64_TLSDESC) && indx == 0)
4425 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
4426 outrel.r_info = htab->r_info (indx, dr_type);
4428 elf_append_rela (output_bfd, sreloc, &outrel);
4430 if (GOT_TLS_GD_P (tls_type))
4432 if (indx == 0)
4434 BFD_ASSERT (! unresolved_reloc);
4435 bfd_put_64 (output_bfd,
4436 relocation - elf_x86_64_dtpoff_base (info),
4437 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4439 else
4441 bfd_put_64 (output_bfd, 0,
4442 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4443 outrel.r_info = htab->r_info (indx,
4444 R_X86_64_DTPOFF64);
4445 outrel.r_offset += GOT_ENTRY_SIZE;
4446 elf_append_rela (output_bfd, sreloc,
4447 &outrel);
4451 dr_done:
4452 if (h != NULL)
4453 h->got.offset |= 1;
4454 else
4455 local_got_offsets[r_symndx] |= 1;
4458 if (off >= (bfd_vma) -2
4459 && ! GOT_TLS_GDESC_P (tls_type))
4460 abort ();
4461 if (r_type == ELF32_R_TYPE (rel->r_info))
4463 if (r_type == R_X86_64_GOTPC32_TLSDESC
4464 || r_type == R_X86_64_TLSDESC_CALL)
4465 relocation = htab->elf.sgotplt->output_section->vma
4466 + htab->elf.sgotplt->output_offset
4467 + offplt + htab->sgotplt_jump_table_size;
4468 else
4469 relocation = htab->elf.sgot->output_section->vma
4470 + htab->elf.sgot->output_offset + off;
4471 unresolved_reloc = FALSE;
4473 else
4475 bfd_vma roff = rel->r_offset;
4477 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
4479 /* GD->IE transition. For 64bit, change
4480 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4481 .word 0x6666; rex64; call __tls_get_addr@plt
4482 into:
4483 movq %fs:0, %rax
4484 addq foo@gottpoff(%rip), %rax
4485 For 32bit, change
4486 leaq foo@tlsgd(%rip), %rdi
4487 .word 0x6666; rex64; call __tls_get_addr@plt
4488 into:
4489 movl %fs:0, %eax
4490 addq foo@gottpoff(%rip), %rax
4491 For largepic, change:
4492 leaq foo@tlsgd(%rip), %rdi
4493 movabsq $__tls_get_addr@pltoff, %rax
4494 addq %rbx, %rax
4495 call *%rax
4496 into:
4497 movq %fs:0, %rax
4498 addq foo@gottpoff(%rax), %rax
4499 nopw 0x0(%rax,%rax,1) */
4500 int largepic = 0;
4501 if (ABI_64_P (output_bfd)
4502 && contents[roff + 5] == (bfd_byte) '\xb8')
4504 memcpy (contents + roff - 3,
4505 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05"
4506 "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
4507 largepic = 1;
4509 else if (ABI_64_P (output_bfd))
4510 memcpy (contents + roff - 4,
4511 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
4512 16);
4513 else
4514 memcpy (contents + roff - 3,
4515 "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
4516 15);
4518 relocation = (htab->elf.sgot->output_section->vma
4519 + htab->elf.sgot->output_offset + off
4520 - roff
4521 - largepic
4522 - input_section->output_section->vma
4523 - input_section->output_offset
4524 - 12);
4525 bfd_put_32 (output_bfd, relocation,
4526 contents + roff + 8 + largepic);
4527 /* Skip R_X86_64_PLT32/R_X86_64_PLTOFF64. */
4528 rel++;
4529 continue;
4531 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
4533 /* GDesc -> IE transition.
4534 It's originally something like:
4535 leaq x@tlsdesc(%rip), %rax
4537 Change it to:
4538 movq x@gottpoff(%rip), %rax # before xchg %ax,%ax. */
4540 /* Now modify the instruction as appropriate. To
4541 turn a leaq into a movq in the form we use it, it
4542 suffices to change the second byte from 0x8d to
4543 0x8b. */
4544 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4546 bfd_put_32 (output_bfd,
4547 htab->elf.sgot->output_section->vma
4548 + htab->elf.sgot->output_offset + off
4549 - rel->r_offset
4550 - input_section->output_section->vma
4551 - input_section->output_offset
4552 - 4,
4553 contents + roff);
4554 continue;
4556 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
4558 /* GDesc -> IE transition.
4559 It's originally:
4560 call *(%rax)
4562 Change it to:
4563 xchg %ax, %ax. */
4565 bfd_put_8 (output_bfd, 0x66, contents + roff);
4566 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4567 continue;
4569 else
4570 BFD_ASSERT (FALSE);
4572 break;
4574 case R_X86_64_TLSLD:
4575 if (! elf_x86_64_tls_transition (info, input_bfd,
4576 input_section, contents,
4577 symtab_hdr, sym_hashes,
4578 &r_type, GOT_UNKNOWN,
4579 rel, relend, h, r_symndx))
4580 return FALSE;
4582 if (r_type != R_X86_64_TLSLD)
4584 /* LD->LE transition:
4585 leaq foo@tlsld(%rip), %rdi; call __tls_get_addr.
4586 For 64bit, we change it into:
4587 .word 0x6666; .byte 0x66; movq %fs:0, %rax.
4588 For 32bit, we change it into:
4589 nopl 0x0(%rax); movl %fs:0, %eax.
4590 For largepic, change:
4591 leaq foo@tlsgd(%rip), %rdi
4592 movabsq $__tls_get_addr@pltoff, %rax
4593 addq %rbx, %rax
4594 call *%rax
4595 into:
4596 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
4597 movq %fs:0, %eax */
4599 BFD_ASSERT (r_type == R_X86_64_TPOFF32);
4600 if (ABI_64_P (output_bfd)
4601 && contents[rel->r_offset + 5] == (bfd_byte) '\xb8')
4602 memcpy (contents + rel->r_offset - 3,
4603 "\x66\x66\x66\x66\x2e\x0f\x1f\x84\0\0\0\0\0"
4604 "\x64\x48\x8b\x04\x25\0\0\0", 22);
4605 else if (ABI_64_P (output_bfd))
4606 memcpy (contents + rel->r_offset - 3,
4607 "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
4608 else
4609 memcpy (contents + rel->r_offset - 3,
4610 "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
4611 /* Skip R_X86_64_PC32/R_X86_64_PLT32/R_X86_64_PLTOFF64. */
4612 rel++;
4613 continue;
4616 if (htab->elf.sgot == NULL)
4617 abort ();
4619 off = htab->tls_ld_got.offset;
4620 if (off & 1)
4621 off &= ~1;
4622 else
4624 Elf_Internal_Rela outrel;
4626 if (htab->elf.srelgot == NULL)
4627 abort ();
4629 outrel.r_offset = (htab->elf.sgot->output_section->vma
4630 + htab->elf.sgot->output_offset + off);
4632 bfd_put_64 (output_bfd, 0,
4633 htab->elf.sgot->contents + off);
4634 bfd_put_64 (output_bfd, 0,
4635 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4636 outrel.r_info = htab->r_info (0, R_X86_64_DTPMOD64);
4637 outrel.r_addend = 0;
4638 elf_append_rela (output_bfd, htab->elf.srelgot,
4639 &outrel);
4640 htab->tls_ld_got.offset |= 1;
4642 relocation = htab->elf.sgot->output_section->vma
4643 + htab->elf.sgot->output_offset + off;
4644 unresolved_reloc = FALSE;
4645 break;
4647 case R_X86_64_DTPOFF32:
4648 if (!info->executable|| (input_section->flags & SEC_CODE) == 0)
4649 relocation -= elf_x86_64_dtpoff_base (info);
4650 else
4651 relocation = elf_x86_64_tpoff (info, relocation);
4652 break;
4654 case R_X86_64_TPOFF32:
4655 case R_X86_64_TPOFF64:
4656 BFD_ASSERT (info->executable);
4657 relocation = elf_x86_64_tpoff (info, relocation);
4658 break;
4660 case R_X86_64_DTPOFF64:
4661 BFD_ASSERT ((input_section->flags & SEC_CODE) == 0);
4662 relocation -= elf_x86_64_dtpoff_base (info);
4663 break;
4665 default:
4666 break;
4669 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4670 because such sections are not SEC_ALLOC and thus ld.so will
4671 not process them. */
4672 if (unresolved_reloc
4673 && !((input_section->flags & SEC_DEBUGGING) != 0
4674 && h->def_dynamic)
4675 && _bfd_elf_section_offset (output_bfd, info, input_section,
4676 rel->r_offset) != (bfd_vma) -1)
4678 (*_bfd_error_handler)
4679 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
4680 input_bfd,
4681 input_section,
4682 (long) rel->r_offset,
4683 howto->name,
4684 h->root.root.string);
4685 return FALSE;
4688 do_relocation:
4689 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4690 contents, rel->r_offset,
4691 relocation, rel->r_addend);
4693 check_relocation_error:
4694 if (r != bfd_reloc_ok)
4696 const char *name;
4698 if (h != NULL)
4699 name = h->root.root.string;
4700 else
4702 name = bfd_elf_string_from_elf_section (input_bfd,
4703 symtab_hdr->sh_link,
4704 sym->st_name);
4705 if (name == NULL)
4706 return FALSE;
4707 if (*name == '\0')
4708 name = bfd_section_name (input_bfd, sec);
4711 if (r == bfd_reloc_overflow)
4713 if (! ((*info->callbacks->reloc_overflow)
4714 (info, (h ? &h->root : NULL), name, howto->name,
4715 (bfd_vma) 0, input_bfd, input_section,
4716 rel->r_offset)))
4717 return FALSE;
4719 else
4721 (*_bfd_error_handler)
4722 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
4723 input_bfd, input_section,
4724 (long) rel->r_offset, name, (int) r);
4725 return FALSE;
4730 return TRUE;
4733 /* Finish up dynamic symbol handling. We set the contents of various
4734 dynamic sections here. */
4736 static bfd_boolean
4737 elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
4738 struct bfd_link_info *info,
4739 struct elf_link_hash_entry *h,
4740 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
4742 struct elf_x86_64_link_hash_table *htab;
4743 const struct elf_x86_64_backend_data *abed;
4744 bfd_boolean use_plt_bnd;
4746 htab = elf_x86_64_hash_table (info);
4747 if (htab == NULL)
4748 return FALSE;
4750 /* Use MPX backend data in case of BND relocation. Use .plt_bnd
4751 section only if there is .plt section. */
4752 use_plt_bnd = htab->elf.splt != NULL && htab->plt_bnd != NULL;
4753 abed = (use_plt_bnd
4754 ? &elf_x86_64_bnd_arch_bed
4755 : get_elf_x86_64_backend_data (output_bfd));
4757 if (h->plt.offset != (bfd_vma) -1)
4759 bfd_vma plt_index;
4760 bfd_vma got_offset, plt_offset, plt_plt_offset, plt_got_offset;
4761 bfd_vma plt_plt_insn_end, plt_got_insn_size;
4762 Elf_Internal_Rela rela;
4763 bfd_byte *loc;
4764 asection *plt, *gotplt, *relplt, *resolved_plt;
4765 const struct elf_backend_data *bed;
4767 /* When building a static executable, use .iplt, .igot.plt and
4768 .rela.iplt sections for STT_GNU_IFUNC symbols. */
4769 if (htab->elf.splt != NULL)
4771 plt = htab->elf.splt;
4772 gotplt = htab->elf.sgotplt;
4773 relplt = htab->elf.srelplt;
4775 else
4777 plt = htab->elf.iplt;
4778 gotplt = htab->elf.igotplt;
4779 relplt = htab->elf.irelplt;
4782 /* This symbol has an entry in the procedure linkage table. Set
4783 it up. */
4784 if ((h->dynindx == -1
4785 && !((h->forced_local || info->executable)
4786 && h->def_regular
4787 && h->type == STT_GNU_IFUNC))
4788 || plt == NULL
4789 || gotplt == NULL
4790 || relplt == NULL)
4791 abort ();
4793 /* Get the index in the procedure linkage table which
4794 corresponds to this symbol. This is the index of this symbol
4795 in all the symbols for which we are making plt entries. The
4796 first entry in the procedure linkage table is reserved.
4798 Get the offset into the .got table of the entry that
4799 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
4800 bytes. The first three are reserved for the dynamic linker.
4802 For static executables, we don't reserve anything. */
4804 if (plt == htab->elf.splt)
4806 got_offset = h->plt.offset / abed->plt_entry_size - 1;
4807 got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
4809 else
4811 got_offset = h->plt.offset / abed->plt_entry_size;
4812 got_offset = got_offset * GOT_ENTRY_SIZE;
4815 plt_plt_insn_end = abed->plt_plt_insn_end;
4816 plt_plt_offset = abed->plt_plt_offset;
4817 plt_got_insn_size = abed->plt_got_insn_size;
4818 plt_got_offset = abed->plt_got_offset;
4819 if (use_plt_bnd)
4821 /* Use the second PLT with BND relocations. */
4822 const bfd_byte *plt_entry, *plt2_entry;
4823 struct elf_x86_64_link_hash_entry *eh
4824 = (struct elf_x86_64_link_hash_entry *) h;
4826 if (eh->has_bnd_reloc)
4828 plt_entry = elf_x86_64_bnd_plt_entry;
4829 plt2_entry = elf_x86_64_bnd_plt2_entry;
4831 else
4833 plt_entry = elf_x86_64_legacy_plt_entry;
4834 plt2_entry = elf_x86_64_legacy_plt2_entry;
4836 /* Subtract 1 since there is no BND prefix. */
4837 plt_plt_insn_end -= 1;
4838 plt_plt_offset -= 1;
4839 plt_got_insn_size -= 1;
4840 plt_got_offset -= 1;
4843 BFD_ASSERT (sizeof (elf_x86_64_bnd_plt_entry)
4844 == sizeof (elf_x86_64_legacy_plt_entry));
4846 /* Fill in the entry in the procedure linkage table. */
4847 memcpy (plt->contents + h->plt.offset,
4848 plt_entry, sizeof (elf_x86_64_legacy_plt_entry));
4849 /* Fill in the entry in the second PLT. */
4850 memcpy (htab->plt_bnd->contents + eh->plt_bnd.offset,
4851 plt2_entry, sizeof (elf_x86_64_legacy_plt2_entry));
4853 resolved_plt = htab->plt_bnd;
4854 plt_offset = eh->plt_bnd.offset;
4856 else
4858 /* Fill in the entry in the procedure linkage table. */
4859 memcpy (plt->contents + h->plt.offset, abed->plt_entry,
4860 abed->plt_entry_size);
4862 resolved_plt = plt;
4863 plt_offset = h->plt.offset;
4866 /* Insert the relocation positions of the plt section. */
4868 /* Put offset the PC-relative instruction referring to the GOT entry,
4869 subtracting the size of that instruction. */
4870 bfd_put_32 (output_bfd,
4871 (gotplt->output_section->vma
4872 + gotplt->output_offset
4873 + got_offset
4874 - resolved_plt->output_section->vma
4875 - resolved_plt->output_offset
4876 - plt_offset
4877 - plt_got_insn_size),
4878 resolved_plt->contents + plt_offset + plt_got_offset);
4880 /* Fill in the entry in the global offset table, initially this
4881 points to the second part of the PLT entry. */
4882 bfd_put_64 (output_bfd, (plt->output_section->vma
4883 + plt->output_offset
4884 + h->plt.offset + abed->plt_lazy_offset),
4885 gotplt->contents + got_offset);
4887 /* Fill in the entry in the .rela.plt section. */
4888 rela.r_offset = (gotplt->output_section->vma
4889 + gotplt->output_offset
4890 + got_offset);
4891 if (h->dynindx == -1
4892 || ((info->executable
4893 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4894 && h->def_regular
4895 && h->type == STT_GNU_IFUNC))
4897 /* If an STT_GNU_IFUNC symbol is locally defined, generate
4898 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT. */
4899 rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
4900 rela.r_addend = (h->root.u.def.value
4901 + h->root.u.def.section->output_section->vma
4902 + h->root.u.def.section->output_offset);
4903 /* R_X86_64_IRELATIVE comes last. */
4904 plt_index = htab->next_irelative_index--;
4906 else
4908 rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
4909 rela.r_addend = 0;
4910 plt_index = htab->next_jump_slot_index++;
4913 /* Don't fill PLT entry for static executables. */
4914 if (plt == htab->elf.splt)
4916 /* Put relocation index. */
4917 bfd_put_32 (output_bfd, plt_index,
4918 plt->contents + h->plt.offset + abed->plt_reloc_offset);
4919 /* Put offset for jmp .PLT0. */
4920 bfd_put_32 (output_bfd, - (h->plt.offset + plt_plt_insn_end),
4921 plt->contents + h->plt.offset + plt_plt_offset);
4924 bed = get_elf_backend_data (output_bfd);
4925 loc = relplt->contents + plt_index * bed->s->sizeof_rela;
4926 bed->s->swap_reloca_out (output_bfd, &rela, loc);
4928 if (!h->def_regular)
4930 /* Mark the symbol as undefined, rather than as defined in
4931 the .plt section. Leave the value if there were any
4932 relocations where pointer equality matters (this is a clue
4933 for the dynamic linker, to make function pointer
4934 comparisons work between an application and shared
4935 library), otherwise set it to zero. If a function is only
4936 called from a binary, there is no need to slow down
4937 shared libraries because of that. */
4938 sym->st_shndx = SHN_UNDEF;
4939 if (!h->pointer_equality_needed)
4940 sym->st_value = 0;
4944 if (h->got.offset != (bfd_vma) -1
4945 && ! GOT_TLS_GD_ANY_P (elf_x86_64_hash_entry (h)->tls_type)
4946 && elf_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE)
4948 Elf_Internal_Rela rela;
4950 /* This symbol has an entry in the global offset table. Set it
4951 up. */
4952 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
4953 abort ();
4955 rela.r_offset = (htab->elf.sgot->output_section->vma
4956 + htab->elf.sgot->output_offset
4957 + (h->got.offset &~ (bfd_vma) 1));
4959 /* If this is a static link, or it is a -Bsymbolic link and the
4960 symbol is defined locally or was forced to be local because
4961 of a version file, we just want to emit a RELATIVE reloc.
4962 The entry in the global offset table will already have been
4963 initialized in the relocate_section function. */
4964 if (h->def_regular
4965 && h->type == STT_GNU_IFUNC)
4967 if (info->shared)
4969 /* Generate R_X86_64_GLOB_DAT. */
4970 goto do_glob_dat;
4972 else
4974 asection *plt;
4976 if (!h->pointer_equality_needed)
4977 abort ();
4979 /* For non-shared object, we can't use .got.plt, which
4980 contains the real function addres if we need pointer
4981 equality. We load the GOT entry with the PLT entry. */
4982 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4983 bfd_put_64 (output_bfd, (plt->output_section->vma
4984 + plt->output_offset
4985 + h->plt.offset),
4986 htab->elf.sgot->contents + h->got.offset);
4987 return TRUE;
4990 else if (info->shared
4991 && SYMBOL_REFERENCES_LOCAL (info, h))
4993 if (!h->def_regular)
4994 return FALSE;
4995 BFD_ASSERT((h->got.offset & 1) != 0);
4996 rela.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4997 rela.r_addend = (h->root.u.def.value
4998 + h->root.u.def.section->output_section->vma
4999 + h->root.u.def.section->output_offset);
5001 else
5003 BFD_ASSERT((h->got.offset & 1) == 0);
5004 do_glob_dat:
5005 bfd_put_64 (output_bfd, (bfd_vma) 0,
5006 htab->elf.sgot->contents + h->got.offset);
5007 rela.r_info = htab->r_info (h->dynindx, R_X86_64_GLOB_DAT);
5008 rela.r_addend = 0;
5011 elf_append_rela (output_bfd, htab->elf.srelgot, &rela);
5014 if (h->needs_copy)
5016 Elf_Internal_Rela rela;
5018 /* This symbol needs a copy reloc. Set it up. */
5020 if (h->dynindx == -1
5021 || (h->root.type != bfd_link_hash_defined
5022 && h->root.type != bfd_link_hash_defweak)
5023 || htab->srelbss == NULL)
5024 abort ();
5026 rela.r_offset = (h->root.u.def.value
5027 + h->root.u.def.section->output_section->vma
5028 + h->root.u.def.section->output_offset);
5029 rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY);
5030 rela.r_addend = 0;
5031 elf_append_rela (output_bfd, htab->srelbss, &rela);
5034 return TRUE;
5037 /* Finish up local dynamic symbol handling. We set the contents of
5038 various dynamic sections here. */
5040 static bfd_boolean
5041 elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
5043 struct elf_link_hash_entry *h
5044 = (struct elf_link_hash_entry *) *slot;
5045 struct bfd_link_info *info
5046 = (struct bfd_link_info *) inf;
5048 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
5049 info, h, NULL);
5052 /* Used to decide how to sort relocs in an optimal manner for the
5053 dynamic linker, before writing them out. */
5055 static enum elf_reloc_type_class
5056 elf_x86_64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
5057 const asection *rel_sec ATTRIBUTE_UNUSED,
5058 const Elf_Internal_Rela *rela)
5060 switch ((int) ELF32_R_TYPE (rela->r_info))
5062 case R_X86_64_RELATIVE:
5063 case R_X86_64_RELATIVE64:
5064 return reloc_class_relative;
5065 case R_X86_64_JUMP_SLOT:
5066 return reloc_class_plt;
5067 case R_X86_64_COPY:
5068 return reloc_class_copy;
5069 default:
5070 return reloc_class_normal;
5074 /* Finish up the dynamic sections. */
5076 static bfd_boolean
5077 elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
5078 struct bfd_link_info *info)
5080 struct elf_x86_64_link_hash_table *htab;
5081 bfd *dynobj;
5082 asection *sdyn;
5083 const struct elf_x86_64_backend_data *abed;
5085 htab = elf_x86_64_hash_table (info);
5086 if (htab == NULL)
5087 return FALSE;
5089 /* Use MPX backend data in case of BND relocation. Use .plt_bnd
5090 section only if there is .plt section. */
5091 abed = (htab->elf.splt != NULL && htab->plt_bnd != NULL
5092 ? &elf_x86_64_bnd_arch_bed
5093 : get_elf_x86_64_backend_data (output_bfd));
5095 dynobj = htab->elf.dynobj;
5096 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5098 if (htab->elf.dynamic_sections_created)
5100 bfd_byte *dyncon, *dynconend;
5101 const struct elf_backend_data *bed;
5102 bfd_size_type sizeof_dyn;
5104 if (sdyn == NULL || htab->elf.sgot == NULL)
5105 abort ();
5107 bed = get_elf_backend_data (dynobj);
5108 sizeof_dyn = bed->s->sizeof_dyn;
5109 dyncon = sdyn->contents;
5110 dynconend = sdyn->contents + sdyn->size;
5111 for (; dyncon < dynconend; dyncon += sizeof_dyn)
5113 Elf_Internal_Dyn dyn;
5114 asection *s;
5116 (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
5118 switch (dyn.d_tag)
5120 default:
5121 continue;
5123 case DT_PLTGOT:
5124 s = htab->elf.sgotplt;
5125 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5126 break;
5128 case DT_JMPREL:
5129 dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
5130 break;
5132 case DT_PLTRELSZ:
5133 s = htab->elf.srelplt->output_section;
5134 dyn.d_un.d_val = s->size;
5135 break;
5137 case DT_RELASZ:
5138 /* The procedure linkage table relocs (DT_JMPREL) should
5139 not be included in the overall relocs (DT_RELA).
5140 Therefore, we override the DT_RELASZ entry here to
5141 make it not include the JMPREL relocs. Since the
5142 linker script arranges for .rela.plt to follow all
5143 other relocation sections, we don't have to worry
5144 about changing the DT_RELA entry. */
5145 if (htab->elf.srelplt != NULL)
5147 s = htab->elf.srelplt->output_section;
5148 dyn.d_un.d_val -= s->size;
5150 break;
5152 case DT_TLSDESC_PLT:
5153 s = htab->elf.splt;
5154 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
5155 + htab->tlsdesc_plt;
5156 break;
5158 case DT_TLSDESC_GOT:
5159 s = htab->elf.sgot;
5160 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
5161 + htab->tlsdesc_got;
5162 break;
5165 (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
5168 /* Fill in the special first entry in the procedure linkage table. */
5169 if (htab->elf.splt && htab->elf.splt->size > 0)
5171 /* Fill in the first entry in the procedure linkage table. */
5172 memcpy (htab->elf.splt->contents,
5173 abed->plt0_entry, abed->plt_entry_size);
5174 /* Add offset for pushq GOT+8(%rip), since the instruction
5175 uses 6 bytes subtract this value. */
5176 bfd_put_32 (output_bfd,
5177 (htab->elf.sgotplt->output_section->vma
5178 + htab->elf.sgotplt->output_offset
5180 - htab->elf.splt->output_section->vma
5181 - htab->elf.splt->output_offset
5182 - 6),
5183 htab->elf.splt->contents + abed->plt0_got1_offset);
5184 /* Add offset for the PC-relative instruction accessing GOT+16,
5185 subtracting the offset to the end of that instruction. */
5186 bfd_put_32 (output_bfd,
5187 (htab->elf.sgotplt->output_section->vma
5188 + htab->elf.sgotplt->output_offset
5189 + 16
5190 - htab->elf.splt->output_section->vma
5191 - htab->elf.splt->output_offset
5192 - abed->plt0_got2_insn_end),
5193 htab->elf.splt->contents + abed->plt0_got2_offset);
5195 elf_section_data (htab->elf.splt->output_section)
5196 ->this_hdr.sh_entsize = abed->plt_entry_size;
5198 if (htab->tlsdesc_plt)
5200 bfd_put_64 (output_bfd, (bfd_vma) 0,
5201 htab->elf.sgot->contents + htab->tlsdesc_got);
5203 memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
5204 abed->plt0_entry, abed->plt_entry_size);
5206 /* Add offset for pushq GOT+8(%rip), since the
5207 instruction uses 6 bytes subtract this value. */
5208 bfd_put_32 (output_bfd,
5209 (htab->elf.sgotplt->output_section->vma
5210 + htab->elf.sgotplt->output_offset
5212 - htab->elf.splt->output_section->vma
5213 - htab->elf.splt->output_offset
5214 - htab->tlsdesc_plt
5215 - 6),
5216 htab->elf.splt->contents
5217 + htab->tlsdesc_plt + abed->plt0_got1_offset);
5218 /* Add offset for the PC-relative instruction accessing GOT+TDG,
5219 where TGD stands for htab->tlsdesc_got, subtracting the offset
5220 to the end of that instruction. */
5221 bfd_put_32 (output_bfd,
5222 (htab->elf.sgot->output_section->vma
5223 + htab->elf.sgot->output_offset
5224 + htab->tlsdesc_got
5225 - htab->elf.splt->output_section->vma
5226 - htab->elf.splt->output_offset
5227 - htab->tlsdesc_plt
5228 - abed->plt0_got2_insn_end),
5229 htab->elf.splt->contents
5230 + htab->tlsdesc_plt + abed->plt0_got2_offset);
5235 if (htab->plt_bnd != NULL)
5236 elf_section_data (htab->plt_bnd->output_section)
5237 ->this_hdr.sh_entsize = sizeof (elf_x86_64_bnd_plt2_entry);
5239 if (htab->elf.sgotplt)
5241 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
5243 (*_bfd_error_handler)
5244 (_("discarded output section: `%A'"), htab->elf.sgotplt);
5245 return FALSE;
5248 /* Fill in the first three entries in the global offset table. */
5249 if (htab->elf.sgotplt->size > 0)
5251 /* Set the first entry in the global offset table to the address of
5252 the dynamic section. */
5253 if (sdyn == NULL)
5254 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents);
5255 else
5256 bfd_put_64 (output_bfd,
5257 sdyn->output_section->vma + sdyn->output_offset,
5258 htab->elf.sgotplt->contents);
5259 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
5260 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
5261 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE*2);
5264 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize =
5265 GOT_ENTRY_SIZE;
5268 /* Adjust .eh_frame for .plt section. */
5269 if (htab->plt_eh_frame != NULL
5270 && htab->plt_eh_frame->contents != NULL)
5272 if (htab->elf.splt != NULL
5273 && htab->elf.splt->size != 0
5274 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
5275 && htab->elf.splt->output_section != NULL
5276 && htab->plt_eh_frame->output_section != NULL)
5278 bfd_vma plt_start = htab->elf.splt->output_section->vma;
5279 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
5280 + htab->plt_eh_frame->output_offset
5281 + PLT_FDE_START_OFFSET;
5282 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
5283 htab->plt_eh_frame->contents
5284 + PLT_FDE_START_OFFSET);
5286 if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
5288 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
5289 htab->plt_eh_frame,
5290 htab->plt_eh_frame->contents))
5291 return FALSE;
5295 if (htab->elf.sgot && htab->elf.sgot->size > 0)
5296 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
5297 = GOT_ENTRY_SIZE;
5299 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
5300 htab_traverse (htab->loc_hash_table,
5301 elf_x86_64_finish_local_dynamic_symbol,
5302 info);
5304 return TRUE;
5307 /* Return address in section PLT for the Ith GOTPLT relocation, for
5308 relocation REL or (bfd_vma) -1 if it should not be included. */
5310 static bfd_vma
5311 elf_x86_64_plt_sym_val (bfd_vma i, const asection *plt,
5312 const arelent *rel)
5314 bfd *abfd;
5315 const struct elf_x86_64_backend_data *bed;
5316 bfd_vma plt_offset;
5318 /* Only match R_X86_64_JUMP_SLOT and R_X86_64_IRELATIVE. */
5319 if (rel->howto->type != R_X86_64_JUMP_SLOT
5320 && rel->howto->type != R_X86_64_IRELATIVE)
5321 return (bfd_vma) -1;
5323 abfd = plt->owner;
5324 bed = get_elf_x86_64_backend_data (abfd);
5325 plt_offset = bed->plt_entry_size;
5327 if (elf_elfheader (abfd)->e_ident[EI_OSABI] != ELFOSABI_GNU)
5328 return plt->vma + (i + 1) * plt_offset;
5330 while (plt_offset < plt->size)
5332 bfd_vma reloc_index;
5333 bfd_byte reloc_index_raw[4];
5335 if (!bfd_get_section_contents (abfd, (asection *) plt,
5336 reloc_index_raw,
5337 plt_offset + bed->plt_reloc_offset,
5338 sizeof (reloc_index_raw)))
5339 return (bfd_vma) -1;
5341 reloc_index = H_GET_32 (abfd, reloc_index_raw);
5342 if (reloc_index == i)
5343 return plt->vma + plt_offset;
5344 plt_offset += bed->plt_entry_size;
5347 abort ();
5350 /* Return offset in .plt.bnd section for the Ith GOTPLT relocation with
5351 PLT section, or (bfd_vma) -1 if it should not be included. */
5353 static bfd_vma
5354 elf_x86_64_plt_sym_val_offset_plt_bnd (bfd_vma i, const asection *plt)
5356 const struct elf_x86_64_backend_data *bed = &elf_x86_64_bnd_arch_bed;
5357 bfd *abfd = plt->owner;
5358 bfd_vma plt_offset = bed->plt_entry_size;
5360 if (elf_elfheader (abfd)->e_ident[EI_OSABI] != ELFOSABI_GNU)
5361 return i * sizeof (elf_x86_64_legacy_plt2_entry);
5363 while (plt_offset < plt->size)
5365 bfd_vma reloc_index;
5366 bfd_byte reloc_index_raw[4];
5368 if (!bfd_get_section_contents (abfd, (asection *) plt,
5369 reloc_index_raw,
5370 plt_offset + bed->plt_reloc_offset,
5371 sizeof (reloc_index_raw)))
5372 return (bfd_vma) -1;
5374 reloc_index = H_GET_32 (abfd, reloc_index_raw);
5375 if (reloc_index == i)
5377 /* This is the index in .plt section. */
5378 long plt_index = plt_offset / bed->plt_entry_size;
5379 /* Return the offset in .plt.bnd section. */
5380 return (plt_index - 1) * sizeof (elf_x86_64_legacy_plt2_entry);
5382 plt_offset += bed->plt_entry_size;
5385 abort ();
5388 /* Similar to _bfd_elf_get_synthetic_symtab, with .plt.bnd section
5389 support. */
5391 static long
5392 elf_x86_64_get_synthetic_symtab (bfd *abfd,
5393 long symcount,
5394 asymbol **syms,
5395 long dynsymcount,
5396 asymbol **dynsyms,
5397 asymbol **ret)
5399 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5400 asection *relplt;
5401 asymbol *s;
5402 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
5403 arelent *p;
5404 long count, i, n;
5405 size_t size;
5406 Elf_Internal_Shdr *hdr;
5407 char *names;
5408 asection *plt, *plt_push;
5410 plt_push = bfd_get_section_by_name (abfd, ".plt");
5411 if (plt_push == NULL)
5412 return 0;
5414 plt = bfd_get_section_by_name (abfd, ".plt.bnd");
5415 /* Use the generic ELF version if there is no .plt.bnd section. */
5416 if (plt == NULL)
5417 return _bfd_elf_get_synthetic_symtab (abfd, symcount, syms,
5418 dynsymcount, dynsyms, ret);
5420 *ret = NULL;
5422 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
5423 return 0;
5425 if (dynsymcount <= 0)
5426 return 0;
5428 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
5429 if (relplt == NULL)
5430 return 0;
5432 hdr = &elf_section_data (relplt)->this_hdr;
5433 if (hdr->sh_link != elf_dynsymtab (abfd)
5434 || (hdr->sh_type != SHT_REL && hdr->sh_type != SHT_RELA))
5435 return 0;
5437 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
5438 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
5439 return -1;
5441 count = relplt->size / hdr->sh_entsize;
5442 size = count * sizeof (asymbol);
5443 p = relplt->relocation;
5444 for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
5446 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
5447 if (p->addend != 0)
5448 size += sizeof ("+0x") - 1 + 8 + 8;
5451 s = *ret = (asymbol *) bfd_malloc (size);
5452 if (s == NULL)
5453 return -1;
5455 names = (char *) (s + count);
5456 p = relplt->relocation;
5457 n = 0;
5458 for (i = 0; i < count; i++, p++)
5460 bfd_vma offset;
5461 size_t len;
5463 if (p->howto->type != R_X86_64_JUMP_SLOT
5464 && p->howto->type != R_X86_64_IRELATIVE)
5465 continue;
5467 offset = elf_x86_64_plt_sym_val_offset_plt_bnd (i, plt_push);
5469 *s = **p->sym_ptr_ptr;
5470 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
5471 we are defining a symbol, ensure one of them is set. */
5472 if ((s->flags & BSF_LOCAL) == 0)
5473 s->flags |= BSF_GLOBAL;
5474 s->flags |= BSF_SYNTHETIC;
5475 s->section = plt;
5476 s->value = offset;
5477 s->name = names;
5478 s->udata.p = NULL;
5479 len = strlen ((*p->sym_ptr_ptr)->name);
5480 memcpy (names, (*p->sym_ptr_ptr)->name, len);
5481 names += len;
5482 if (p->addend != 0)
5484 char buf[30], *a;
5486 memcpy (names, "+0x", sizeof ("+0x") - 1);
5487 names += sizeof ("+0x") - 1;
5488 bfd_sprintf_vma (abfd, buf, p->addend);
5489 for (a = buf; *a == '0'; ++a)
5491 len = strlen (a);
5492 memcpy (names, a, len);
5493 names += len;
5495 memcpy (names, "@plt", sizeof ("@plt"));
5496 names += sizeof ("@plt");
5497 ++s, ++n;
5500 return n;
5503 /* Handle an x86-64 specific section when reading an object file. This
5504 is called when elfcode.h finds a section with an unknown type. */
5506 static bfd_boolean
5507 elf_x86_64_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr,
5508 const char *name, int shindex)
5510 if (hdr->sh_type != SHT_X86_64_UNWIND)
5511 return FALSE;
5513 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
5514 return FALSE;
5516 return TRUE;
5519 /* Hook called by the linker routine which adds symbols from an object
5520 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
5521 of .bss. */
5523 static bfd_boolean
5524 elf_x86_64_add_symbol_hook (bfd *abfd,
5525 struct bfd_link_info *info,
5526 Elf_Internal_Sym *sym,
5527 const char **namep ATTRIBUTE_UNUSED,
5528 flagword *flagsp ATTRIBUTE_UNUSED,
5529 asection **secp,
5530 bfd_vma *valp)
5532 asection *lcomm;
5534 switch (sym->st_shndx)
5536 case SHN_X86_64_LCOMMON:
5537 lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
5538 if (lcomm == NULL)
5540 lcomm = bfd_make_section_with_flags (abfd,
5541 "LARGE_COMMON",
5542 (SEC_ALLOC
5543 | SEC_IS_COMMON
5544 | SEC_LINKER_CREATED));
5545 if (lcomm == NULL)
5546 return FALSE;
5547 elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
5549 *secp = lcomm;
5550 *valp = sym->st_size;
5551 return TRUE;
5554 if ((ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
5555 || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE)
5556 && (abfd->flags & DYNAMIC) == 0
5557 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
5558 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
5560 return TRUE;
5564 /* Given a BFD section, try to locate the corresponding ELF section
5565 index. */
5567 static bfd_boolean
5568 elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
5569 asection *sec, int *index_return)
5571 if (sec == &_bfd_elf_large_com_section)
5573 *index_return = SHN_X86_64_LCOMMON;
5574 return TRUE;
5576 return FALSE;
5579 /* Process a symbol. */
5581 static void
5582 elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
5583 asymbol *asym)
5585 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
5587 switch (elfsym->internal_elf_sym.st_shndx)
5589 case SHN_X86_64_LCOMMON:
5590 asym->section = &_bfd_elf_large_com_section;
5591 asym->value = elfsym->internal_elf_sym.st_size;
5592 /* Common symbol doesn't set BSF_GLOBAL. */
5593 asym->flags &= ~BSF_GLOBAL;
5594 break;
5598 static bfd_boolean
5599 elf_x86_64_common_definition (Elf_Internal_Sym *sym)
5601 return (sym->st_shndx == SHN_COMMON
5602 || sym->st_shndx == SHN_X86_64_LCOMMON);
5605 static unsigned int
5606 elf_x86_64_common_section_index (asection *sec)
5608 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
5609 return SHN_COMMON;
5610 else
5611 return SHN_X86_64_LCOMMON;
5614 static asection *
5615 elf_x86_64_common_section (asection *sec)
5617 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
5618 return bfd_com_section_ptr;
5619 else
5620 return &_bfd_elf_large_com_section;
5623 static bfd_boolean
5624 elf_x86_64_merge_symbol (struct elf_link_hash_entry *h,
5625 const Elf_Internal_Sym *sym,
5626 asection **psec,
5627 bfd_boolean newdef,
5628 bfd_boolean olddef,
5629 bfd *oldbfd,
5630 const asection *oldsec)
5632 /* A normal common symbol and a large common symbol result in a
5633 normal common symbol. We turn the large common symbol into a
5634 normal one. */
5635 if (!olddef
5636 && h->root.type == bfd_link_hash_common
5637 && !newdef
5638 && bfd_is_com_section (*psec)
5639 && oldsec != *psec)
5641 if (sym->st_shndx == SHN_COMMON
5642 && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) != 0)
5644 h->root.u.c.p->section
5645 = bfd_make_section_old_way (oldbfd, "COMMON");
5646 h->root.u.c.p->section->flags = SEC_ALLOC;
5648 else if (sym->st_shndx == SHN_X86_64_LCOMMON
5649 && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) == 0)
5650 *psec = bfd_com_section_ptr;
5653 return TRUE;
5656 static int
5657 elf_x86_64_additional_program_headers (bfd *abfd,
5658 struct bfd_link_info *info ATTRIBUTE_UNUSED)
5660 asection *s;
5661 int count = 0;
5663 /* Check to see if we need a large readonly segment. */
5664 s = bfd_get_section_by_name (abfd, ".lrodata");
5665 if (s && (s->flags & SEC_LOAD))
5666 count++;
5668 /* Check to see if we need a large data segment. Since .lbss sections
5669 is placed right after the .bss section, there should be no need for
5670 a large data segment just because of .lbss. */
5671 s = bfd_get_section_by_name (abfd, ".ldata");
5672 if (s && (s->flags & SEC_LOAD))
5673 count++;
5675 return count;
5678 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
5680 static bfd_boolean
5681 elf_x86_64_hash_symbol (struct elf_link_hash_entry *h)
5683 if (h->plt.offset != (bfd_vma) -1
5684 && !h->def_regular
5685 && !h->pointer_equality_needed)
5686 return FALSE;
5688 return _bfd_elf_hash_symbol (h);
5691 /* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
5693 static bfd_boolean
5694 elf_x86_64_relocs_compatible (const bfd_target *input,
5695 const bfd_target *output)
5697 return ((xvec_get_elf_backend_data (input)->s->elfclass
5698 == xvec_get_elf_backend_data (output)->s->elfclass)
5699 && _bfd_elf_relocs_compatible (input, output));
5702 static const struct bfd_elf_special_section
5703 elf_x86_64_special_sections[]=
5705 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
5706 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
5707 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
5708 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
5709 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
5710 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
5711 { NULL, 0, 0, 0, 0 }
5714 #define TARGET_LITTLE_SYM x86_64_elf64_vec
5715 #define TARGET_LITTLE_NAME "elf64-x86-64"
5716 #define ELF_ARCH bfd_arch_i386
5717 #define ELF_TARGET_ID X86_64_ELF_DATA
5718 #define ELF_MACHINE_CODE EM_X86_64
5719 #define ELF_MAXPAGESIZE 0x200000
5720 #define ELF_MINPAGESIZE 0x1000
5721 #define ELF_COMMONPAGESIZE 0x1000
5723 #define elf_backend_can_gc_sections 1
5724 #define elf_backend_can_refcount 1
5725 #define elf_backend_want_got_plt 1
5726 #define elf_backend_plt_readonly 1
5727 #define elf_backend_want_plt_sym 0
5728 #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
5729 #define elf_backend_rela_normal 1
5730 #define elf_backend_plt_alignment 4
5732 #define elf_info_to_howto elf_x86_64_info_to_howto
5734 #define bfd_elf64_bfd_link_hash_table_create \
5735 elf_x86_64_link_hash_table_create
5736 #define bfd_elf64_bfd_reloc_type_lookup elf_x86_64_reloc_type_lookup
5737 #define bfd_elf64_bfd_reloc_name_lookup \
5738 elf_x86_64_reloc_name_lookup
5740 #define elf_backend_adjust_dynamic_symbol elf_x86_64_adjust_dynamic_symbol
5741 #define elf_backend_relocs_compatible elf_x86_64_relocs_compatible
5742 #define elf_backend_check_relocs elf_x86_64_check_relocs
5743 #define elf_backend_copy_indirect_symbol elf_x86_64_copy_indirect_symbol
5744 #define elf_backend_create_dynamic_sections elf_x86_64_create_dynamic_sections
5745 #define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
5746 #define elf_backend_finish_dynamic_symbol elf_x86_64_finish_dynamic_symbol
5747 #define elf_backend_gc_mark_hook elf_x86_64_gc_mark_hook
5748 #define elf_backend_gc_sweep_hook elf_x86_64_gc_sweep_hook
5749 #define elf_backend_grok_prstatus elf_x86_64_grok_prstatus
5750 #define elf_backend_grok_psinfo elf_x86_64_grok_psinfo
5751 #ifdef CORE_HEADER
5752 #define elf_backend_write_core_note elf_x86_64_write_core_note
5753 #endif
5754 #define elf_backend_reloc_type_class elf_x86_64_reloc_type_class
5755 #define elf_backend_relocate_section elf_x86_64_relocate_section
5756 #define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections
5757 #define elf_backend_always_size_sections elf_x86_64_always_size_sections
5758 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
5759 #define elf_backend_plt_sym_val elf_x86_64_plt_sym_val
5760 #define elf_backend_object_p elf64_x86_64_elf_object_p
5761 #define bfd_elf64_mkobject elf_x86_64_mkobject
5762 #define bfd_elf64_get_synthetic_symtab elf_x86_64_get_synthetic_symtab
5764 #define elf_backend_section_from_shdr \
5765 elf_x86_64_section_from_shdr
5767 #define elf_backend_section_from_bfd_section \
5768 elf_x86_64_elf_section_from_bfd_section
5769 #define elf_backend_add_symbol_hook \
5770 elf_x86_64_add_symbol_hook
5771 #define elf_backend_symbol_processing \
5772 elf_x86_64_symbol_processing
5773 #define elf_backend_common_section_index \
5774 elf_x86_64_common_section_index
5775 #define elf_backend_common_section \
5776 elf_x86_64_common_section
5777 #define elf_backend_common_definition \
5778 elf_x86_64_common_definition
5779 #define elf_backend_merge_symbol \
5780 elf_x86_64_merge_symbol
5781 #define elf_backend_special_sections \
5782 elf_x86_64_special_sections
5783 #define elf_backend_additional_program_headers \
5784 elf_x86_64_additional_program_headers
5785 #define elf_backend_hash_symbol \
5786 elf_x86_64_hash_symbol
5788 #include "elf64-target.h"
5790 /* FreeBSD support. */
5792 #undef TARGET_LITTLE_SYM
5793 #define TARGET_LITTLE_SYM x86_64_elf64_fbsd_vec
5794 #undef TARGET_LITTLE_NAME
5795 #define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
5797 #undef ELF_OSABI
5798 #define ELF_OSABI ELFOSABI_FREEBSD
5800 #undef elf64_bed
5801 #define elf64_bed elf64_x86_64_fbsd_bed
5803 #include "elf64-target.h"
5805 /* Solaris 2 support. */
5807 #undef TARGET_LITTLE_SYM
5808 #define TARGET_LITTLE_SYM x86_64_elf64_sol2_vec
5809 #undef TARGET_LITTLE_NAME
5810 #define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
5812 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
5813 objects won't be recognized. */
5814 #undef ELF_OSABI
5816 #undef elf64_bed
5817 #define elf64_bed elf64_x86_64_sol2_bed
5819 /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
5820 boundary. */
5821 #undef elf_backend_static_tls_alignment
5822 #define elf_backend_static_tls_alignment 16
5824 /* The Solaris 2 ABI requires a plt symbol on all platforms.
5826 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
5827 File, p.63. */
5828 #undef elf_backend_want_plt_sym
5829 #define elf_backend_want_plt_sym 1
5831 #include "elf64-target.h"
5833 #undef bfd_elf64_get_synthetic_symtab
5835 /* Native Client support. */
5837 static bfd_boolean
5838 elf64_x86_64_nacl_elf_object_p (bfd *abfd)
5840 /* Set the right machine number for a NaCl x86-64 ELF64 file. */
5841 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64_nacl);
5842 return TRUE;
5845 #undef TARGET_LITTLE_SYM
5846 #define TARGET_LITTLE_SYM x86_64_elf64_nacl_vec
5847 #undef TARGET_LITTLE_NAME
5848 #define TARGET_LITTLE_NAME "elf64-x86-64-nacl"
5849 #undef elf64_bed
5850 #define elf64_bed elf64_x86_64_nacl_bed
5852 #undef ELF_MAXPAGESIZE
5853 #undef ELF_MINPAGESIZE
5854 #undef ELF_COMMONPAGESIZE
5855 #define ELF_MAXPAGESIZE 0x10000
5856 #define ELF_MINPAGESIZE 0x10000
5857 #define ELF_COMMONPAGESIZE 0x10000
5859 /* Restore defaults. */
5860 #undef ELF_OSABI
5861 #undef elf_backend_static_tls_alignment
5862 #undef elf_backend_want_plt_sym
5863 #define elf_backend_want_plt_sym 0
5865 /* NaCl uses substantially different PLT entries for the same effects. */
5867 #undef elf_backend_plt_alignment
5868 #define elf_backend_plt_alignment 5
5869 #define NACL_PLT_ENTRY_SIZE 64
5870 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
5872 static const bfd_byte elf_x86_64_nacl_plt0_entry[NACL_PLT_ENTRY_SIZE] =
5874 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
5875 0x4c, 0x8b, 0x1d, 16, 0, 0, 0, /* mov GOT+16(%rip), %r11 */
5876 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
5877 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
5878 0x41, 0xff, 0xe3, /* jmpq *%r11 */
5880 /* 9-byte nop sequence to pad out to the next 32-byte boundary. */
5881 0x66, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw 0x0(%rax,%rax,1) */
5883 /* 32 bytes of nop to pad out to the standard size. */
5884 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5885 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5886 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5887 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5888 0x66, /* excess data32 prefix */
5889 0x90 /* nop */
5892 static const bfd_byte elf_x86_64_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
5894 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, /* mov name@GOTPCREL(%rip),%r11 */
5895 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
5896 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
5897 0x41, 0xff, 0xe3, /* jmpq *%r11 */
5899 /* 15-byte nop sequence to pad out to the next 32-byte boundary. */
5900 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5901 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5903 /* Lazy GOT entries point here (32-byte aligned). */
5904 0x68, /* pushq immediate */
5905 0, 0, 0, 0, /* replaced with index into relocation table. */
5906 0xe9, /* jmp relative */
5907 0, 0, 0, 0, /* replaced with offset to start of .plt0. */
5909 /* 22 bytes of nop to pad out to the standard size. */
5910 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5911 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5912 0x0f, 0x1f, 0x80, 0, 0, 0, 0, /* nopl 0x0(%rax) */
5915 /* .eh_frame covering the .plt section. */
5917 static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] =
5919 #if (PLT_CIE_LENGTH != 20 \
5920 || PLT_FDE_LENGTH != 36 \
5921 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
5922 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
5923 # error "Need elf_x86_64_backend_data parameters for eh_frame_plt offsets!"
5924 #endif
5925 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
5926 0, 0, 0, 0, /* CIE ID */
5927 1, /* CIE version */
5928 'z', 'R', 0, /* Augmentation string */
5929 1, /* Code alignment factor */
5930 0x78, /* Data alignment factor */
5931 16, /* Return address column */
5932 1, /* Augmentation size */
5933 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
5934 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
5935 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
5936 DW_CFA_nop, DW_CFA_nop,
5938 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
5939 PLT_CIE_LENGTH + 8, 0, 0, 0,/* CIE pointer */
5940 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
5941 0, 0, 0, 0, /* .plt size goes here */
5942 0, /* Augmentation size */
5943 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
5944 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
5945 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
5946 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
5947 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
5948 13, /* Block length */
5949 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
5950 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
5951 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
5952 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
5953 DW_CFA_nop, DW_CFA_nop
5956 static const struct elf_x86_64_backend_data elf_x86_64_nacl_arch_bed =
5958 elf_x86_64_nacl_plt0_entry, /* plt0_entry */
5959 elf_x86_64_nacl_plt_entry, /* plt_entry */
5960 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
5961 2, /* plt0_got1_offset */
5962 9, /* plt0_got2_offset */
5963 13, /* plt0_got2_insn_end */
5964 3, /* plt_got_offset */
5965 33, /* plt_reloc_offset */
5966 38, /* plt_plt_offset */
5967 7, /* plt_got_insn_size */
5968 42, /* plt_plt_insn_end */
5969 32, /* plt_lazy_offset */
5970 elf_x86_64_nacl_eh_frame_plt, /* eh_frame_plt */
5971 sizeof (elf_x86_64_nacl_eh_frame_plt), /* eh_frame_plt_size */
5974 #undef elf_backend_arch_data
5975 #define elf_backend_arch_data &elf_x86_64_nacl_arch_bed
5977 #undef elf_backend_object_p
5978 #define elf_backend_object_p elf64_x86_64_nacl_elf_object_p
5979 #undef elf_backend_modify_segment_map
5980 #define elf_backend_modify_segment_map nacl_modify_segment_map
5981 #undef elf_backend_modify_program_headers
5982 #define elf_backend_modify_program_headers nacl_modify_program_headers
5983 #undef elf_backend_final_write_processing
5984 #define elf_backend_final_write_processing nacl_final_write_processing
5986 #include "elf64-target.h"
5988 /* Native Client x32 support. */
5990 static bfd_boolean
5991 elf32_x86_64_nacl_elf_object_p (bfd *abfd)
5993 /* Set the right machine number for a NaCl x86-64 ELF32 file. */
5994 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32_nacl);
5995 return TRUE;
5998 #undef TARGET_LITTLE_SYM
5999 #define TARGET_LITTLE_SYM x86_64_elf32_nacl_vec
6000 #undef TARGET_LITTLE_NAME
6001 #define TARGET_LITTLE_NAME "elf32-x86-64-nacl"
6002 #undef elf32_bed
6003 #define elf32_bed elf32_x86_64_nacl_bed
6005 #define bfd_elf32_bfd_link_hash_table_create \
6006 elf_x86_64_link_hash_table_create
6007 #define bfd_elf32_bfd_reloc_type_lookup \
6008 elf_x86_64_reloc_type_lookup
6009 #define bfd_elf32_bfd_reloc_name_lookup \
6010 elf_x86_64_reloc_name_lookup
6011 #define bfd_elf32_mkobject \
6012 elf_x86_64_mkobject
6014 #undef elf_backend_object_p
6015 #define elf_backend_object_p \
6016 elf32_x86_64_nacl_elf_object_p
6018 #undef elf_backend_bfd_from_remote_memory
6019 #define elf_backend_bfd_from_remote_memory \
6020 _bfd_elf32_bfd_from_remote_memory
6022 #undef elf_backend_size_info
6023 #define elf_backend_size_info \
6024 _bfd_elf32_size_info
6026 #include "elf32-target.h"
6028 /* Restore defaults. */
6029 #undef elf_backend_object_p
6030 #define elf_backend_object_p elf64_x86_64_elf_object_p
6031 #undef elf_backend_bfd_from_remote_memory
6032 #undef elf_backend_size_info
6033 #undef elf_backend_modify_segment_map
6034 #undef elf_backend_modify_program_headers
6035 #undef elf_backend_final_write_processing
6037 /* Intel L1OM support. */
6039 static bfd_boolean
6040 elf64_l1om_elf_object_p (bfd *abfd)
6042 /* Set the right machine number for an L1OM elf64 file. */
6043 bfd_default_set_arch_mach (abfd, bfd_arch_l1om, bfd_mach_l1om);
6044 return TRUE;
6047 #undef TARGET_LITTLE_SYM
6048 #define TARGET_LITTLE_SYM l1om_elf64_vec
6049 #undef TARGET_LITTLE_NAME
6050 #define TARGET_LITTLE_NAME "elf64-l1om"
6051 #undef ELF_ARCH
6052 #define ELF_ARCH bfd_arch_l1om
6054 #undef ELF_MACHINE_CODE
6055 #define ELF_MACHINE_CODE EM_L1OM
6057 #undef ELF_OSABI
6059 #undef elf64_bed
6060 #define elf64_bed elf64_l1om_bed
6062 #undef elf_backend_object_p
6063 #define elf_backend_object_p elf64_l1om_elf_object_p
6065 /* Restore defaults. */
6066 #undef ELF_MAXPAGESIZE
6067 #undef ELF_MINPAGESIZE
6068 #undef ELF_COMMONPAGESIZE
6069 #define ELF_MAXPAGESIZE 0x200000
6070 #define ELF_MINPAGESIZE 0x1000
6071 #define ELF_COMMONPAGESIZE 0x1000
6072 #undef elf_backend_plt_alignment
6073 #define elf_backend_plt_alignment 4
6074 #undef elf_backend_arch_data
6075 #define elf_backend_arch_data &elf_x86_64_arch_bed
6077 #include "elf64-target.h"
6079 /* FreeBSD L1OM support. */
6081 #undef TARGET_LITTLE_SYM
6082 #define TARGET_LITTLE_SYM l1om_elf64_fbsd_vec
6083 #undef TARGET_LITTLE_NAME
6084 #define TARGET_LITTLE_NAME "elf64-l1om-freebsd"
6086 #undef ELF_OSABI
6087 #define ELF_OSABI ELFOSABI_FREEBSD
6089 #undef elf64_bed
6090 #define elf64_bed elf64_l1om_fbsd_bed
6092 #include "elf64-target.h"
6094 /* Intel K1OM support. */
6096 static bfd_boolean
6097 elf64_k1om_elf_object_p (bfd *abfd)
6099 /* Set the right machine number for an K1OM elf64 file. */
6100 bfd_default_set_arch_mach (abfd, bfd_arch_k1om, bfd_mach_k1om);
6101 return TRUE;
6104 #undef TARGET_LITTLE_SYM
6105 #define TARGET_LITTLE_SYM k1om_elf64_vec
6106 #undef TARGET_LITTLE_NAME
6107 #define TARGET_LITTLE_NAME "elf64-k1om"
6108 #undef ELF_ARCH
6109 #define ELF_ARCH bfd_arch_k1om
6111 #undef ELF_MACHINE_CODE
6112 #define ELF_MACHINE_CODE EM_K1OM
6114 #undef ELF_OSABI
6116 #undef elf64_bed
6117 #define elf64_bed elf64_k1om_bed
6119 #undef elf_backend_object_p
6120 #define elf_backend_object_p elf64_k1om_elf_object_p
6122 #undef elf_backend_static_tls_alignment
6124 #undef elf_backend_want_plt_sym
6125 #define elf_backend_want_plt_sym 0
6127 #include "elf64-target.h"
6129 /* FreeBSD K1OM support. */
6131 #undef TARGET_LITTLE_SYM
6132 #define TARGET_LITTLE_SYM k1om_elf64_fbsd_vec
6133 #undef TARGET_LITTLE_NAME
6134 #define TARGET_LITTLE_NAME "elf64-k1om-freebsd"
6136 #undef ELF_OSABI
6137 #define ELF_OSABI ELFOSABI_FREEBSD
6139 #undef elf64_bed
6140 #define elf64_bed elf64_k1om_fbsd_bed
6142 #include "elf64-target.h"
6144 /* 32bit x86-64 support. */
6146 #undef TARGET_LITTLE_SYM
6147 #define TARGET_LITTLE_SYM x86_64_elf32_vec
6148 #undef TARGET_LITTLE_NAME
6149 #define TARGET_LITTLE_NAME "elf32-x86-64"
6150 #undef elf32_bed
6152 #undef ELF_ARCH
6153 #define ELF_ARCH bfd_arch_i386
6155 #undef ELF_MACHINE_CODE
6156 #define ELF_MACHINE_CODE EM_X86_64
6158 #undef ELF_OSABI
6160 #undef elf_backend_object_p
6161 #define elf_backend_object_p \
6162 elf32_x86_64_elf_object_p
6164 #undef elf_backend_bfd_from_remote_memory
6165 #define elf_backend_bfd_from_remote_memory \
6166 _bfd_elf32_bfd_from_remote_memory
6168 #undef elf_backend_size_info
6169 #define elf_backend_size_info \
6170 _bfd_elf32_size_info
6172 #include "elf32-target.h"