Don't make _DYNAMIC/_GLOBAL_OFFSET_TABLE_ absolute
[deliverable/binutils-gdb.git] / bfd / elf64-x86-64.c
1 /* X86-64 specific support for ELF
2 Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010, 2011, 2012
4 Free Software Foundation, Inc.
5 Contributed by Jan Hubicka <jh@suse.cz>.
6
7 This file is part of BFD, the Binary File Descriptor library.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22 MA 02110-1301, USA. */
23
24 #include "sysdep.h"
25 #include "bfd.h"
26 #include "bfdlink.h"
27 #include "libbfd.h"
28 #include "elf-bfd.h"
29 #include "elf-nacl.h"
30 #include "bfd_stdint.h"
31 #include "objalloc.h"
32 #include "hashtab.h"
33 #include "dwarf2.h"
34 #include "libiberty.h"
35
36 #include "elf/x86-64.h"
37
38 #ifdef CORE_HEADER
39 #include <stdarg.h>
40 #include CORE_HEADER
41 #endif
42
43 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
44 #define MINUS_ONE (~ (bfd_vma) 0)
45
46 /* Since both 32-bit and 64-bit x86-64 encode relocation type in the
47 identical manner, we use ELF32_R_TYPE instead of ELF64_R_TYPE to get
48 relocation type. We also use ELF_ST_TYPE instead of ELF64_ST_TYPE
49 since they are the same. */
50
51 #define ABI_64_P(abfd) \
52 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
53
54 /* The relocation "howto" table. Order of fields:
55 type, rightshift, size, bitsize, pc_relative, bitpos, complain_on_overflow,
56 special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset. */
57 static reloc_howto_type x86_64_elf_howto_table[] =
58 {
59 HOWTO(R_X86_64_NONE, 0, 0, 0, FALSE, 0, complain_overflow_dont,
60 bfd_elf_generic_reloc, "R_X86_64_NONE", FALSE, 0x00000000, 0x00000000,
61 FALSE),
62 HOWTO(R_X86_64_64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
63 bfd_elf_generic_reloc, "R_X86_64_64", FALSE, MINUS_ONE, MINUS_ONE,
64 FALSE),
65 HOWTO(R_X86_64_PC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
66 bfd_elf_generic_reloc, "R_X86_64_PC32", FALSE, 0xffffffff, 0xffffffff,
67 TRUE),
68 HOWTO(R_X86_64_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
69 bfd_elf_generic_reloc, "R_X86_64_GOT32", FALSE, 0xffffffff, 0xffffffff,
70 FALSE),
71 HOWTO(R_X86_64_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
72 bfd_elf_generic_reloc, "R_X86_64_PLT32", FALSE, 0xffffffff, 0xffffffff,
73 TRUE),
74 HOWTO(R_X86_64_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
75 bfd_elf_generic_reloc, "R_X86_64_COPY", FALSE, 0xffffffff, 0xffffffff,
76 FALSE),
77 HOWTO(R_X86_64_GLOB_DAT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
78 bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", FALSE, MINUS_ONE,
79 MINUS_ONE, FALSE),
80 HOWTO(R_X86_64_JUMP_SLOT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
81 bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", FALSE, MINUS_ONE,
82 MINUS_ONE, FALSE),
83 HOWTO(R_X86_64_RELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
84 bfd_elf_generic_reloc, "R_X86_64_RELATIVE", FALSE, MINUS_ONE,
85 MINUS_ONE, FALSE),
86 HOWTO(R_X86_64_GOTPCREL, 0, 2, 32, TRUE, 0, complain_overflow_signed,
87 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", FALSE, 0xffffffff,
88 0xffffffff, TRUE),
89 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
90 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
91 FALSE),
92 HOWTO(R_X86_64_32S, 0, 2, 32, FALSE, 0, complain_overflow_signed,
93 bfd_elf_generic_reloc, "R_X86_64_32S", FALSE, 0xffffffff, 0xffffffff,
94 FALSE),
95 HOWTO(R_X86_64_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
96 bfd_elf_generic_reloc, "R_X86_64_16", FALSE, 0xffff, 0xffff, FALSE),
97 HOWTO(R_X86_64_PC16,0, 1, 16, TRUE, 0, complain_overflow_bitfield,
98 bfd_elf_generic_reloc, "R_X86_64_PC16", FALSE, 0xffff, 0xffff, TRUE),
99 HOWTO(R_X86_64_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
100 bfd_elf_generic_reloc, "R_X86_64_8", FALSE, 0xff, 0xff, FALSE),
101 HOWTO(R_X86_64_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
102 bfd_elf_generic_reloc, "R_X86_64_PC8", FALSE, 0xff, 0xff, TRUE),
103 HOWTO(R_X86_64_DTPMOD64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
104 bfd_elf_generic_reloc, "R_X86_64_DTPMOD64", FALSE, MINUS_ONE,
105 MINUS_ONE, FALSE),
106 HOWTO(R_X86_64_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
107 bfd_elf_generic_reloc, "R_X86_64_DTPOFF64", FALSE, MINUS_ONE,
108 MINUS_ONE, FALSE),
109 HOWTO(R_X86_64_TPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
110 bfd_elf_generic_reloc, "R_X86_64_TPOFF64", FALSE, MINUS_ONE,
111 MINUS_ONE, FALSE),
112 HOWTO(R_X86_64_TLSGD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
113 bfd_elf_generic_reloc, "R_X86_64_TLSGD", FALSE, 0xffffffff,
114 0xffffffff, TRUE),
115 HOWTO(R_X86_64_TLSLD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
116 bfd_elf_generic_reloc, "R_X86_64_TLSLD", FALSE, 0xffffffff,
117 0xffffffff, TRUE),
118 HOWTO(R_X86_64_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
119 bfd_elf_generic_reloc, "R_X86_64_DTPOFF32", FALSE, 0xffffffff,
120 0xffffffff, FALSE),
121 HOWTO(R_X86_64_GOTTPOFF, 0, 2, 32, TRUE, 0, complain_overflow_signed,
122 bfd_elf_generic_reloc, "R_X86_64_GOTTPOFF", FALSE, 0xffffffff,
123 0xffffffff, TRUE),
124 HOWTO(R_X86_64_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
125 bfd_elf_generic_reloc, "R_X86_64_TPOFF32", FALSE, 0xffffffff,
126 0xffffffff, FALSE),
127 HOWTO(R_X86_64_PC64, 0, 4, 64, TRUE, 0, complain_overflow_bitfield,
128 bfd_elf_generic_reloc, "R_X86_64_PC64", FALSE, MINUS_ONE, MINUS_ONE,
129 TRUE),
130 HOWTO(R_X86_64_GOTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
131 bfd_elf_generic_reloc, "R_X86_64_GOTOFF64",
132 FALSE, MINUS_ONE, MINUS_ONE, FALSE),
133 HOWTO(R_X86_64_GOTPC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
134 bfd_elf_generic_reloc, "R_X86_64_GOTPC32",
135 FALSE, 0xffffffff, 0xffffffff, TRUE),
136 HOWTO(R_X86_64_GOT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
137 bfd_elf_generic_reloc, "R_X86_64_GOT64", FALSE, MINUS_ONE, MINUS_ONE,
138 FALSE),
139 HOWTO(R_X86_64_GOTPCREL64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
140 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL64", FALSE, MINUS_ONE,
141 MINUS_ONE, TRUE),
142 HOWTO(R_X86_64_GOTPC64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
143 bfd_elf_generic_reloc, "R_X86_64_GOTPC64",
144 FALSE, MINUS_ONE, MINUS_ONE, TRUE),
145 HOWTO(R_X86_64_GOTPLT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
146 bfd_elf_generic_reloc, "R_X86_64_GOTPLT64", FALSE, MINUS_ONE,
147 MINUS_ONE, FALSE),
148 HOWTO(R_X86_64_PLTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
149 bfd_elf_generic_reloc, "R_X86_64_PLTOFF64", FALSE, MINUS_ONE,
150 MINUS_ONE, FALSE),
151 EMPTY_HOWTO (32),
152 EMPTY_HOWTO (33),
153 HOWTO(R_X86_64_GOTPC32_TLSDESC, 0, 2, 32, TRUE, 0,
154 complain_overflow_bitfield, bfd_elf_generic_reloc,
155 "R_X86_64_GOTPC32_TLSDESC",
156 FALSE, 0xffffffff, 0xffffffff, TRUE),
157 HOWTO(R_X86_64_TLSDESC_CALL, 0, 0, 0, FALSE, 0,
158 complain_overflow_dont, bfd_elf_generic_reloc,
159 "R_X86_64_TLSDESC_CALL",
160 FALSE, 0, 0, FALSE),
161 HOWTO(R_X86_64_TLSDESC, 0, 4, 64, FALSE, 0,
162 complain_overflow_bitfield, bfd_elf_generic_reloc,
163 "R_X86_64_TLSDESC",
164 FALSE, MINUS_ONE, MINUS_ONE, FALSE),
165 HOWTO(R_X86_64_IRELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
166 bfd_elf_generic_reloc, "R_X86_64_IRELATIVE", FALSE, MINUS_ONE,
167 MINUS_ONE, FALSE),
168 HOWTO(R_X86_64_RELATIVE64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
169 bfd_elf_generic_reloc, "R_X86_64_RELATIVE64", FALSE, MINUS_ONE,
170 MINUS_ONE, FALSE),
171
172 /* We have a gap in the reloc numbers here.
173 R_X86_64_standard counts the number up to this point, and
174 R_X86_64_vt_offset is the value to subtract from a reloc type of
175 R_X86_64_GNU_VT* to form an index into this table. */
176 #define R_X86_64_standard (R_X86_64_IRELATIVE + 1)
177 #define R_X86_64_vt_offset (R_X86_64_GNU_VTINHERIT - R_X86_64_standard)
178
179 /* GNU extension to record C++ vtable hierarchy. */
180 HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, FALSE, 0, complain_overflow_dont,
181 NULL, "R_X86_64_GNU_VTINHERIT", FALSE, 0, 0, FALSE),
182
183 /* GNU extension to record C++ vtable member usage. */
184 HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, FALSE, 0, complain_overflow_dont,
185 _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", FALSE, 0, 0,
186 FALSE),
187
188 /* Use complain_overflow_bitfield on R_X86_64_32 for x32. */
189 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
190 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
191 FALSE)
192 };
193
194 #define IS_X86_64_PCREL_TYPE(TYPE) \
195 ( ((TYPE) == R_X86_64_PC8) \
196 || ((TYPE) == R_X86_64_PC16) \
197 || ((TYPE) == R_X86_64_PC32) \
198 || ((TYPE) == R_X86_64_PC64))
199
200 /* Map BFD relocs to the x86_64 elf relocs. */
201 struct elf_reloc_map
202 {
203 bfd_reloc_code_real_type bfd_reloc_val;
204 unsigned char elf_reloc_val;
205 };
206
207 static const struct elf_reloc_map x86_64_reloc_map[] =
208 {
209 { BFD_RELOC_NONE, R_X86_64_NONE, },
210 { BFD_RELOC_64, R_X86_64_64, },
211 { BFD_RELOC_32_PCREL, R_X86_64_PC32, },
212 { BFD_RELOC_X86_64_GOT32, R_X86_64_GOT32,},
213 { BFD_RELOC_X86_64_PLT32, R_X86_64_PLT32,},
214 { BFD_RELOC_X86_64_COPY, R_X86_64_COPY, },
215 { BFD_RELOC_X86_64_GLOB_DAT, R_X86_64_GLOB_DAT, },
216 { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, },
217 { BFD_RELOC_X86_64_RELATIVE, R_X86_64_RELATIVE, },
218 { BFD_RELOC_X86_64_GOTPCREL, R_X86_64_GOTPCREL, },
219 { BFD_RELOC_32, R_X86_64_32, },
220 { BFD_RELOC_X86_64_32S, R_X86_64_32S, },
221 { BFD_RELOC_16, R_X86_64_16, },
222 { BFD_RELOC_16_PCREL, R_X86_64_PC16, },
223 { BFD_RELOC_8, R_X86_64_8, },
224 { BFD_RELOC_8_PCREL, R_X86_64_PC8, },
225 { BFD_RELOC_X86_64_DTPMOD64, R_X86_64_DTPMOD64, },
226 { BFD_RELOC_X86_64_DTPOFF64, R_X86_64_DTPOFF64, },
227 { BFD_RELOC_X86_64_TPOFF64, R_X86_64_TPOFF64, },
228 { BFD_RELOC_X86_64_TLSGD, R_X86_64_TLSGD, },
229 { BFD_RELOC_X86_64_TLSLD, R_X86_64_TLSLD, },
230 { BFD_RELOC_X86_64_DTPOFF32, R_X86_64_DTPOFF32, },
231 { BFD_RELOC_X86_64_GOTTPOFF, R_X86_64_GOTTPOFF, },
232 { BFD_RELOC_X86_64_TPOFF32, R_X86_64_TPOFF32, },
233 { BFD_RELOC_64_PCREL, R_X86_64_PC64, },
234 { BFD_RELOC_X86_64_GOTOFF64, R_X86_64_GOTOFF64, },
235 { BFD_RELOC_X86_64_GOTPC32, R_X86_64_GOTPC32, },
236 { BFD_RELOC_X86_64_GOT64, R_X86_64_GOT64, },
237 { BFD_RELOC_X86_64_GOTPCREL64,R_X86_64_GOTPCREL64, },
238 { BFD_RELOC_X86_64_GOTPC64, R_X86_64_GOTPC64, },
239 { BFD_RELOC_X86_64_GOTPLT64, R_X86_64_GOTPLT64, },
240 { BFD_RELOC_X86_64_PLTOFF64, R_X86_64_PLTOFF64, },
241 { BFD_RELOC_X86_64_GOTPC32_TLSDESC, R_X86_64_GOTPC32_TLSDESC, },
242 { BFD_RELOC_X86_64_TLSDESC_CALL, R_X86_64_TLSDESC_CALL, },
243 { BFD_RELOC_X86_64_TLSDESC, R_X86_64_TLSDESC, },
244 { BFD_RELOC_X86_64_IRELATIVE, R_X86_64_IRELATIVE, },
245 { BFD_RELOC_VTABLE_INHERIT, R_X86_64_GNU_VTINHERIT, },
246 { BFD_RELOC_VTABLE_ENTRY, R_X86_64_GNU_VTENTRY, },
247 };
248
249 static reloc_howto_type *
250 elf_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type)
251 {
252 unsigned i;
253
254 if (r_type == (unsigned int) R_X86_64_32)
255 {
256 if (ABI_64_P (abfd))
257 i = r_type;
258 else
259 i = ARRAY_SIZE (x86_64_elf_howto_table) - 1;
260 }
261 else if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT
262 || r_type >= (unsigned int) R_X86_64_max)
263 {
264 if (r_type >= (unsigned int) R_X86_64_standard)
265 {
266 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
267 abfd, (int) r_type);
268 r_type = R_X86_64_NONE;
269 }
270 i = r_type;
271 }
272 else
273 i = r_type - (unsigned int) R_X86_64_vt_offset;
274 BFD_ASSERT (x86_64_elf_howto_table[i].type == r_type);
275 return &x86_64_elf_howto_table[i];
276 }
277
278 /* Given a BFD reloc type, return a HOWTO structure. */
279 static reloc_howto_type *
280 elf_x86_64_reloc_type_lookup (bfd *abfd,
281 bfd_reloc_code_real_type code)
282 {
283 unsigned int i;
284
285 for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
286 i++)
287 {
288 if (x86_64_reloc_map[i].bfd_reloc_val == code)
289 return elf_x86_64_rtype_to_howto (abfd,
290 x86_64_reloc_map[i].elf_reloc_val);
291 }
292 return 0;
293 }
294
295 static reloc_howto_type *
296 elf_x86_64_reloc_name_lookup (bfd *abfd,
297 const char *r_name)
298 {
299 unsigned int i;
300
301 if (!ABI_64_P (abfd) && strcasecmp (r_name, "R_X86_64_32") == 0)
302 {
303 /* Get x32 R_X86_64_32. */
304 reloc_howto_type *reloc
305 = &x86_64_elf_howto_table[ARRAY_SIZE (x86_64_elf_howto_table) - 1];
306 BFD_ASSERT (reloc->type == (unsigned int) R_X86_64_32);
307 return reloc;
308 }
309
310 for (i = 0; i < ARRAY_SIZE (x86_64_elf_howto_table); i++)
311 if (x86_64_elf_howto_table[i].name != NULL
312 && strcasecmp (x86_64_elf_howto_table[i].name, r_name) == 0)
313 return &x86_64_elf_howto_table[i];
314
315 return NULL;
316 }
317
318 /* Given an x86_64 ELF reloc type, fill in an arelent structure. */
319
320 static void
321 elf_x86_64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
322 Elf_Internal_Rela *dst)
323 {
324 unsigned r_type;
325
326 r_type = ELF32_R_TYPE (dst->r_info);
327 cache_ptr->howto = elf_x86_64_rtype_to_howto (abfd, r_type);
328 BFD_ASSERT (r_type == cache_ptr->howto->type);
329 }
330 \f
331 /* Support for core dump NOTE sections. */
332 static bfd_boolean
333 elf_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
334 {
335 int offset;
336 size_t size;
337
338 switch (note->descsz)
339 {
340 default:
341 return FALSE;
342
343 case 296: /* sizeof(istruct elf_prstatus) on Linux/x32 */
344 /* pr_cursig */
345 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
346
347 /* pr_pid */
348 elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
349
350 /* pr_reg */
351 offset = 72;
352 size = 216;
353
354 break;
355
356 case 336: /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
357 /* pr_cursig */
358 elf_tdata (abfd)->core_signal
359 = bfd_get_16 (abfd, note->descdata + 12);
360
361 /* pr_pid */
362 elf_tdata (abfd)->core_lwpid
363 = bfd_get_32 (abfd, note->descdata + 32);
364
365 /* pr_reg */
366 offset = 112;
367 size = 216;
368
369 break;
370 }
371
372 /* Make a ".reg/999" section. */
373 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
374 size, note->descpos + offset);
375 }
376
377 static bfd_boolean
378 elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
379 {
380 switch (note->descsz)
381 {
382 default:
383 return FALSE;
384
385 case 124: /* sizeof(struct elf_prpsinfo) on Linux/x32 */
386 elf_tdata (abfd)->core_pid
387 = bfd_get_32 (abfd, note->descdata + 12);
388 elf_tdata (abfd)->core_program
389 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
390 elf_tdata (abfd)->core_command
391 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
392 break;
393
394 case 136: /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
395 elf_tdata (abfd)->core_pid
396 = bfd_get_32 (abfd, note->descdata + 24);
397 elf_tdata (abfd)->core_program
398 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
399 elf_tdata (abfd)->core_command
400 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
401 }
402
403 /* Note that for some reason, a spurious space is tacked
404 onto the end of the args in some (at least one anyway)
405 implementations, so strip it off if it exists. */
406
407 {
408 char *command = elf_tdata (abfd)->core_command;
409 int n = strlen (command);
410
411 if (0 < n && command[n - 1] == ' ')
412 command[n - 1] = '\0';
413 }
414
415 return TRUE;
416 }
417
418 #ifdef CORE_HEADER
419 static char *
420 elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
421 int note_type, ...)
422 {
423 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
424 va_list ap;
425 const char *fname, *psargs;
426 long pid;
427 int cursig;
428 const void *gregs;
429
430 switch (note_type)
431 {
432 default:
433 return NULL;
434
435 case NT_PRPSINFO:
436 va_start (ap, note_type);
437 fname = va_arg (ap, const char *);
438 psargs = va_arg (ap, const char *);
439 va_end (ap);
440
441 if (bed->s->elfclass == ELFCLASS32)
442 {
443 prpsinfo32_t data;
444 memset (&data, 0, sizeof (data));
445 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
446 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
447 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
448 &data, sizeof (data));
449 }
450 else
451 {
452 prpsinfo_t data;
453 memset (&data, 0, sizeof (data));
454 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
455 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
456 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
457 &data, sizeof (data));
458 }
459 /* NOTREACHED */
460
461 case NT_PRSTATUS:
462 va_start (ap, note_type);
463 pid = va_arg (ap, long);
464 cursig = va_arg (ap, int);
465 gregs = va_arg (ap, const void *);
466 va_end (ap);
467
468 if (bed->s->elfclass == ELFCLASS32)
469 {
470 if (bed->elf_machine_code == EM_X86_64)
471 {
472 prstatusx32_t prstat;
473 memset (&prstat, 0, sizeof (prstat));
474 prstat.pr_pid = pid;
475 prstat.pr_cursig = cursig;
476 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
477 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
478 &prstat, sizeof (prstat));
479 }
480 else
481 {
482 prstatus32_t prstat;
483 memset (&prstat, 0, sizeof (prstat));
484 prstat.pr_pid = pid;
485 prstat.pr_cursig = cursig;
486 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
487 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
488 &prstat, sizeof (prstat));
489 }
490 }
491 else
492 {
493 prstatus_t prstat;
494 memset (&prstat, 0, sizeof (prstat));
495 prstat.pr_pid = pid;
496 prstat.pr_cursig = cursig;
497 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
498 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
499 &prstat, sizeof (prstat));
500 }
501 }
502 /* NOTREACHED */
503 }
504 #endif
505 \f
506 /* Functions for the x86-64 ELF linker. */
507
508 /* The name of the dynamic interpreter. This is put in the .interp
509 section. */
510
511 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
512 #define ELF32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
513
514 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
515 copying dynamic variables from a shared lib into an app's dynbss
516 section, and instead use a dynamic relocation to point into the
517 shared lib. */
518 #define ELIMINATE_COPY_RELOCS 1
519
520 /* The size in bytes of an entry in the global offset table. */
521
522 #define GOT_ENTRY_SIZE 8
523
524 /* The size in bytes of an entry in the procedure linkage table. */
525
526 #define PLT_ENTRY_SIZE 16
527
528 /* The first entry in a procedure linkage table looks like this. See the
529 SVR4 ABI i386 supplement and the x86-64 ABI to see how this works. */
530
531 static const bfd_byte elf_x86_64_plt0_entry[PLT_ENTRY_SIZE] =
532 {
533 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
534 0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */
535 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */
536 };
537
538 /* Subsequent entries in a procedure linkage table look like this. */
539
540 static const bfd_byte elf_x86_64_plt_entry[PLT_ENTRY_SIZE] =
541 {
542 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
543 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
544 0x68, /* pushq immediate */
545 0, 0, 0, 0, /* replaced with index into relocation table. */
546 0xe9, /* jmp relative */
547 0, 0, 0, 0 /* replaced with offset to start of .plt0. */
548 };
549
550 /* .eh_frame covering the .plt section. */
551
552 static const bfd_byte elf_x86_64_eh_frame_plt[] =
553 {
554 #define PLT_CIE_LENGTH 20
555 #define PLT_FDE_LENGTH 36
556 #define PLT_FDE_START_OFFSET 4 + PLT_CIE_LENGTH + 8
557 #define PLT_FDE_LEN_OFFSET 4 + PLT_CIE_LENGTH + 12
558 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
559 0, 0, 0, 0, /* CIE ID */
560 1, /* CIE version */
561 'z', 'R', 0, /* Augmentation string */
562 1, /* Code alignment factor */
563 0x78, /* Data alignment factor */
564 16, /* Return address column */
565 1, /* Augmentation size */
566 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
567 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
568 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
569 DW_CFA_nop, DW_CFA_nop,
570
571 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
572 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
573 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
574 0, 0, 0, 0, /* .plt size goes here */
575 0, /* Augmentation size */
576 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
577 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
578 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
579 DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
580 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
581 11, /* Block length */
582 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
583 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
584 DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
585 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
586 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
587 };
588
589 /* Architecture-specific backend data for x86-64. */
590
591 struct elf_x86_64_backend_data
592 {
593 /* Templates for the initial PLT entry and for subsequent entries. */
594 const bfd_byte *plt0_entry;
595 const bfd_byte *plt_entry;
596 unsigned int plt_entry_size; /* Size of each PLT entry. */
597
598 /* Offsets into plt0_entry that are to be replaced with GOT[1] and GOT[2]. */
599 unsigned int plt0_got1_offset;
600 unsigned int plt0_got2_offset;
601
602 /* Offset of the end of the PC-relative instruction containing
603 plt0_got2_offset. */
604 unsigned int plt0_got2_insn_end;
605
606 /* Offsets into plt_entry that are to be replaced with... */
607 unsigned int plt_got_offset; /* ... address of this symbol in .got. */
608 unsigned int plt_reloc_offset; /* ... offset into relocation table. */
609 unsigned int plt_plt_offset; /* ... offset to start of .plt. */
610
611 /* Length of the PC-relative instruction containing plt_got_offset. */
612 unsigned int plt_got_insn_size;
613
614 /* Offset of the end of the PC-relative jump to plt0_entry. */
615 unsigned int plt_plt_insn_end;
616
617 /* Offset into plt_entry where the initial value of the GOT entry points. */
618 unsigned int plt_lazy_offset;
619
620 /* .eh_frame covering the .plt section. */
621 const bfd_byte *eh_frame_plt;
622 unsigned int eh_frame_plt_size;
623 };
624
625 #define get_elf_x86_64_backend_data(abfd) \
626 ((const struct elf_x86_64_backend_data *) \
627 get_elf_backend_data (abfd)->arch_data)
628
629 #define GET_PLT_ENTRY_SIZE(abfd) \
630 get_elf_x86_64_backend_data (abfd)->plt_entry_size
631
632 /* These are the standard parameters. */
633 static const struct elf_x86_64_backend_data elf_x86_64_arch_bed =
634 {
635 elf_x86_64_plt0_entry, /* plt0_entry */
636 elf_x86_64_plt_entry, /* plt_entry */
637 sizeof (elf_x86_64_plt_entry), /* plt_entry_size */
638 2, /* plt0_got1_offset */
639 8, /* plt0_got2_offset */
640 12, /* plt0_got2_insn_end */
641 2, /* plt_got_offset */
642 7, /* plt_reloc_offset */
643 12, /* plt_plt_offset */
644 6, /* plt_got_insn_size */
645 PLT_ENTRY_SIZE, /* plt_plt_insn_end */
646 6, /* plt_lazy_offset */
647 elf_x86_64_eh_frame_plt, /* eh_frame_plt */
648 sizeof (elf_x86_64_eh_frame_plt), /* eh_frame_plt_size */
649 };
650
651 #define elf_backend_arch_data &elf_x86_64_arch_bed
652
653 /* x86-64 ELF linker hash entry. */
654
655 struct elf_x86_64_link_hash_entry
656 {
657 struct elf_link_hash_entry elf;
658
659 /* Track dynamic relocs copied for this symbol. */
660 struct elf_dyn_relocs *dyn_relocs;
661
662 #define GOT_UNKNOWN 0
663 #define GOT_NORMAL 1
664 #define GOT_TLS_GD 2
665 #define GOT_TLS_IE 3
666 #define GOT_TLS_GDESC 4
667 #define GOT_TLS_GD_BOTH_P(type) \
668 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
669 #define GOT_TLS_GD_P(type) \
670 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
671 #define GOT_TLS_GDESC_P(type) \
672 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
673 #define GOT_TLS_GD_ANY_P(type) \
674 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
675 unsigned char tls_type;
676
677 /* Offset of the GOTPLT entry reserved for the TLS descriptor,
678 starting at the end of the jump table. */
679 bfd_vma tlsdesc_got;
680 };
681
682 #define elf_x86_64_hash_entry(ent) \
683 ((struct elf_x86_64_link_hash_entry *)(ent))
684
685 struct elf_x86_64_obj_tdata
686 {
687 struct elf_obj_tdata root;
688
689 /* tls_type for each local got entry. */
690 char *local_got_tls_type;
691
692 /* GOTPLT entries for TLS descriptors. */
693 bfd_vma *local_tlsdesc_gotent;
694 };
695
696 #define elf_x86_64_tdata(abfd) \
697 ((struct elf_x86_64_obj_tdata *) (abfd)->tdata.any)
698
699 #define elf_x86_64_local_got_tls_type(abfd) \
700 (elf_x86_64_tdata (abfd)->local_got_tls_type)
701
702 #define elf_x86_64_local_tlsdesc_gotent(abfd) \
703 (elf_x86_64_tdata (abfd)->local_tlsdesc_gotent)
704
705 #define is_x86_64_elf(bfd) \
706 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
707 && elf_tdata (bfd) != NULL \
708 && elf_object_id (bfd) == X86_64_ELF_DATA)
709
710 static bfd_boolean
711 elf_x86_64_mkobject (bfd *abfd)
712 {
713 return bfd_elf_allocate_object (abfd, sizeof (struct elf_x86_64_obj_tdata),
714 X86_64_ELF_DATA);
715 }
716
717 /* x86-64 ELF linker hash table. */
718
719 struct elf_x86_64_link_hash_table
720 {
721 struct elf_link_hash_table elf;
722
723 /* Short-cuts to get to dynamic linker sections. */
724 asection *sdynbss;
725 asection *srelbss;
726 asection *plt_eh_frame;
727
728 union
729 {
730 bfd_signed_vma refcount;
731 bfd_vma offset;
732 } tls_ld_got;
733
734 /* The amount of space used by the jump slots in the GOT. */
735 bfd_vma sgotplt_jump_table_size;
736
737 /* Small local sym cache. */
738 struct sym_cache sym_cache;
739
740 bfd_vma (*r_info) (bfd_vma, bfd_vma);
741 bfd_vma (*r_sym) (bfd_vma);
742 unsigned int pointer_r_type;
743 const char *dynamic_interpreter;
744 int dynamic_interpreter_size;
745
746 /* _TLS_MODULE_BASE_ symbol. */
747 struct bfd_link_hash_entry *tls_module_base;
748
749 /* Used by local STT_GNU_IFUNC symbols. */
750 htab_t loc_hash_table;
751 void * loc_hash_memory;
752
753 /* The offset into splt of the PLT entry for the TLS descriptor
754 resolver. Special values are 0, if not necessary (or not found
755 to be necessary yet), and -1 if needed but not determined
756 yet. */
757 bfd_vma tlsdesc_plt;
758 /* The offset into sgot of the GOT entry used by the PLT entry
759 above. */
760 bfd_vma tlsdesc_got;
761
762 /* The index of the next R_X86_64_JUMP_SLOT entry in .rela.plt. */
763 bfd_vma next_jump_slot_index;
764 /* The index of the next R_X86_64_IRELATIVE entry in .rela.plt. */
765 bfd_vma next_irelative_index;
766 };
767
768 /* Get the x86-64 ELF linker hash table from a link_info structure. */
769
770 #define elf_x86_64_hash_table(p) \
771 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
772 == X86_64_ELF_DATA ? ((struct elf_x86_64_link_hash_table *) ((p)->hash)) : NULL)
773
774 #define elf_x86_64_compute_jump_table_size(htab) \
775 ((htab)->elf.srelplt->reloc_count * GOT_ENTRY_SIZE)
776
777 /* Create an entry in an x86-64 ELF linker hash table. */
778
779 static struct bfd_hash_entry *
780 elf_x86_64_link_hash_newfunc (struct bfd_hash_entry *entry,
781 struct bfd_hash_table *table,
782 const char *string)
783 {
784 /* Allocate the structure if it has not already been allocated by a
785 subclass. */
786 if (entry == NULL)
787 {
788 entry = (struct bfd_hash_entry *)
789 bfd_hash_allocate (table,
790 sizeof (struct elf_x86_64_link_hash_entry));
791 if (entry == NULL)
792 return entry;
793 }
794
795 /* Call the allocation method of the superclass. */
796 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
797 if (entry != NULL)
798 {
799 struct elf_x86_64_link_hash_entry *eh;
800
801 eh = (struct elf_x86_64_link_hash_entry *) entry;
802 eh->dyn_relocs = NULL;
803 eh->tls_type = GOT_UNKNOWN;
804 eh->tlsdesc_got = (bfd_vma) -1;
805 }
806
807 return entry;
808 }
809
810 /* Compute a hash of a local hash entry. We use elf_link_hash_entry
811 for local symbol so that we can handle local STT_GNU_IFUNC symbols
812 as global symbol. We reuse indx and dynstr_index for local symbol
813 hash since they aren't used by global symbols in this backend. */
814
815 static hashval_t
816 elf_x86_64_local_htab_hash (const void *ptr)
817 {
818 struct elf_link_hash_entry *h
819 = (struct elf_link_hash_entry *) ptr;
820 return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
821 }
822
823 /* Compare local hash entries. */
824
825 static int
826 elf_x86_64_local_htab_eq (const void *ptr1, const void *ptr2)
827 {
828 struct elf_link_hash_entry *h1
829 = (struct elf_link_hash_entry *) ptr1;
830 struct elf_link_hash_entry *h2
831 = (struct elf_link_hash_entry *) ptr2;
832
833 return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
834 }
835
836 /* Find and/or create a hash entry for local symbol. */
837
838 static struct elf_link_hash_entry *
839 elf_x86_64_get_local_sym_hash (struct elf_x86_64_link_hash_table *htab,
840 bfd *abfd, const Elf_Internal_Rela *rel,
841 bfd_boolean create)
842 {
843 struct elf_x86_64_link_hash_entry e, *ret;
844 asection *sec = abfd->sections;
845 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
846 htab->r_sym (rel->r_info));
847 void **slot;
848
849 e.elf.indx = sec->id;
850 e.elf.dynstr_index = htab->r_sym (rel->r_info);
851 slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
852 create ? INSERT : NO_INSERT);
853
854 if (!slot)
855 return NULL;
856
857 if (*slot)
858 {
859 ret = (struct elf_x86_64_link_hash_entry *) *slot;
860 return &ret->elf;
861 }
862
863 ret = (struct elf_x86_64_link_hash_entry *)
864 objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
865 sizeof (struct elf_x86_64_link_hash_entry));
866 if (ret)
867 {
868 memset (ret, 0, sizeof (*ret));
869 ret->elf.indx = sec->id;
870 ret->elf.dynstr_index = htab->r_sym (rel->r_info);
871 ret->elf.dynindx = -1;
872 *slot = ret;
873 }
874 return &ret->elf;
875 }
876
877 /* Create an X86-64 ELF linker hash table. */
878
879 static struct bfd_link_hash_table *
880 elf_x86_64_link_hash_table_create (bfd *abfd)
881 {
882 struct elf_x86_64_link_hash_table *ret;
883 bfd_size_type amt = sizeof (struct elf_x86_64_link_hash_table);
884
885 ret = (struct elf_x86_64_link_hash_table *) bfd_malloc (amt);
886 if (ret == NULL)
887 return NULL;
888
889 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
890 elf_x86_64_link_hash_newfunc,
891 sizeof (struct elf_x86_64_link_hash_entry),
892 X86_64_ELF_DATA))
893 {
894 free (ret);
895 return NULL;
896 }
897
898 ret->sdynbss = NULL;
899 ret->srelbss = NULL;
900 ret->plt_eh_frame = NULL;
901 ret->sym_cache.abfd = NULL;
902 ret->tlsdesc_plt = 0;
903 ret->tlsdesc_got = 0;
904 ret->tls_ld_got.refcount = 0;
905 ret->sgotplt_jump_table_size = 0;
906 ret->tls_module_base = NULL;
907 ret->next_jump_slot_index = 0;
908 ret->next_irelative_index = 0;
909
910 if (ABI_64_P (abfd))
911 {
912 ret->r_info = elf64_r_info;
913 ret->r_sym = elf64_r_sym;
914 ret->pointer_r_type = R_X86_64_64;
915 ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
916 ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
917 }
918 else
919 {
920 ret->r_info = elf32_r_info;
921 ret->r_sym = elf32_r_sym;
922 ret->pointer_r_type = R_X86_64_32;
923 ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
924 ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER;
925 }
926
927 ret->loc_hash_table = htab_try_create (1024,
928 elf_x86_64_local_htab_hash,
929 elf_x86_64_local_htab_eq,
930 NULL);
931 ret->loc_hash_memory = objalloc_create ();
932 if (!ret->loc_hash_table || !ret->loc_hash_memory)
933 {
934 free (ret);
935 return NULL;
936 }
937
938 return &ret->elf.root;
939 }
940
941 /* Destroy an X86-64 ELF linker hash table. */
942
943 static void
944 elf_x86_64_link_hash_table_free (struct bfd_link_hash_table *hash)
945 {
946 struct elf_x86_64_link_hash_table *htab
947 = (struct elf_x86_64_link_hash_table *) hash;
948
949 if (htab->loc_hash_table)
950 htab_delete (htab->loc_hash_table);
951 if (htab->loc_hash_memory)
952 objalloc_free ((struct objalloc *) htab->loc_hash_memory);
953 _bfd_generic_link_hash_table_free (hash);
954 }
955
956 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
957 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
958 hash table. */
959
960 static bfd_boolean
961 elf_x86_64_create_dynamic_sections (bfd *dynobj,
962 struct bfd_link_info *info)
963 {
964 struct elf_x86_64_link_hash_table *htab;
965
966 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
967 return FALSE;
968
969 htab = elf_x86_64_hash_table (info);
970 if (htab == NULL)
971 return FALSE;
972
973 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
974 if (!info->shared)
975 htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
976
977 if (!htab->sdynbss
978 || (!info->shared && !htab->srelbss))
979 abort ();
980
981 if (!info->no_ld_generated_unwind_info
982 && bfd_get_section_by_name (dynobj, ".eh_frame") == NULL
983 && htab->elf.splt != NULL)
984 {
985 const struct elf_x86_64_backend_data *const abed
986 = get_elf_x86_64_backend_data (dynobj);
987 flagword flags = get_elf_backend_data (dynobj)->dynamic_sec_flags;
988 htab->plt_eh_frame
989 = bfd_make_section_with_flags (dynobj, ".eh_frame",
990 flags | SEC_READONLY);
991 if (htab->plt_eh_frame == NULL
992 || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 3))
993 return FALSE;
994
995 htab->plt_eh_frame->size = abed->eh_frame_plt_size;
996 htab->plt_eh_frame->contents
997 = bfd_alloc (dynobj, htab->plt_eh_frame->size);
998 memcpy (htab->plt_eh_frame->contents,
999 abed->eh_frame_plt, abed->eh_frame_plt_size);
1000 }
1001 return TRUE;
1002 }
1003
1004 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1005
1006 static void
1007 elf_x86_64_copy_indirect_symbol (struct bfd_link_info *info,
1008 struct elf_link_hash_entry *dir,
1009 struct elf_link_hash_entry *ind)
1010 {
1011 struct elf_x86_64_link_hash_entry *edir, *eind;
1012
1013 edir = (struct elf_x86_64_link_hash_entry *) dir;
1014 eind = (struct elf_x86_64_link_hash_entry *) ind;
1015
1016 if (eind->dyn_relocs != NULL)
1017 {
1018 if (edir->dyn_relocs != NULL)
1019 {
1020 struct elf_dyn_relocs **pp;
1021 struct elf_dyn_relocs *p;
1022
1023 /* Add reloc counts against the indirect sym to the direct sym
1024 list. Merge any entries against the same section. */
1025 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1026 {
1027 struct elf_dyn_relocs *q;
1028
1029 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1030 if (q->sec == p->sec)
1031 {
1032 q->pc_count += p->pc_count;
1033 q->count += p->count;
1034 *pp = p->next;
1035 break;
1036 }
1037 if (q == NULL)
1038 pp = &p->next;
1039 }
1040 *pp = edir->dyn_relocs;
1041 }
1042
1043 edir->dyn_relocs = eind->dyn_relocs;
1044 eind->dyn_relocs = NULL;
1045 }
1046
1047 if (ind->root.type == bfd_link_hash_indirect
1048 && dir->got.refcount <= 0)
1049 {
1050 edir->tls_type = eind->tls_type;
1051 eind->tls_type = GOT_UNKNOWN;
1052 }
1053
1054 if (ELIMINATE_COPY_RELOCS
1055 && ind->root.type != bfd_link_hash_indirect
1056 && dir->dynamic_adjusted)
1057 {
1058 /* If called to transfer flags for a weakdef during processing
1059 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1060 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1061 dir->ref_dynamic |= ind->ref_dynamic;
1062 dir->ref_regular |= ind->ref_regular;
1063 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1064 dir->needs_plt |= ind->needs_plt;
1065 dir->pointer_equality_needed |= ind->pointer_equality_needed;
1066 }
1067 else
1068 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1069 }
1070
1071 static bfd_boolean
1072 elf64_x86_64_elf_object_p (bfd *abfd)
1073 {
1074 /* Set the right machine number for an x86-64 elf64 file. */
1075 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
1076 return TRUE;
1077 }
1078
1079 static bfd_boolean
1080 elf32_x86_64_elf_object_p (bfd *abfd)
1081 {
1082 /* Set the right machine number for an x86-64 elf32 file. */
1083 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32);
1084 return TRUE;
1085 }
1086
1087 /* Return TRUE if the TLS access code sequence support transition
1088 from R_TYPE. */
1089
1090 static bfd_boolean
1091 elf_x86_64_check_tls_transition (bfd *abfd,
1092 struct bfd_link_info *info,
1093 asection *sec,
1094 bfd_byte *contents,
1095 Elf_Internal_Shdr *symtab_hdr,
1096 struct elf_link_hash_entry **sym_hashes,
1097 unsigned int r_type,
1098 const Elf_Internal_Rela *rel,
1099 const Elf_Internal_Rela *relend)
1100 {
1101 unsigned int val;
1102 unsigned long r_symndx;
1103 struct elf_link_hash_entry *h;
1104 bfd_vma offset;
1105 struct elf_x86_64_link_hash_table *htab;
1106
1107 /* Get the section contents. */
1108 if (contents == NULL)
1109 {
1110 if (elf_section_data (sec)->this_hdr.contents != NULL)
1111 contents = elf_section_data (sec)->this_hdr.contents;
1112 else
1113 {
1114 /* FIXME: How to better handle error condition? */
1115 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1116 return FALSE;
1117
1118 /* Cache the section contents for elf_link_input_bfd. */
1119 elf_section_data (sec)->this_hdr.contents = contents;
1120 }
1121 }
1122
1123 htab = elf_x86_64_hash_table (info);
1124 offset = rel->r_offset;
1125 switch (r_type)
1126 {
1127 case R_X86_64_TLSGD:
1128 case R_X86_64_TLSLD:
1129 if ((rel + 1) >= relend)
1130 return FALSE;
1131
1132 if (r_type == R_X86_64_TLSGD)
1133 {
1134 /* Check transition from GD access model. For 64bit, only
1135 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
1136 .word 0x6666; rex64; call __tls_get_addr
1137 can transit to different access model. For 32bit, only
1138 leaq foo@tlsgd(%rip), %rdi
1139 .word 0x6666; rex64; call __tls_get_addr
1140 can transit to different access model. */
1141
1142 static const unsigned char call[] = { 0x66, 0x66, 0x48, 0xe8 };
1143 static const unsigned char leaq[] = { 0x66, 0x48, 0x8d, 0x3d };
1144
1145 if ((offset + 12) > sec->size
1146 || memcmp (contents + offset + 4, call, 4) != 0)
1147 return FALSE;
1148
1149 if (ABI_64_P (abfd))
1150 {
1151 if (offset < 4
1152 || memcmp (contents + offset - 4, leaq, 4) != 0)
1153 return FALSE;
1154 }
1155 else
1156 {
1157 if (offset < 3
1158 || memcmp (contents + offset - 3, leaq + 1, 3) != 0)
1159 return FALSE;
1160 }
1161 }
1162 else
1163 {
1164 /* Check transition from LD access model. Only
1165 leaq foo@tlsld(%rip), %rdi;
1166 call __tls_get_addr
1167 can transit to different access model. */
1168
1169 static const unsigned char lea[] = { 0x48, 0x8d, 0x3d };
1170
1171 if (offset < 3 || (offset + 9) > sec->size)
1172 return FALSE;
1173
1174 if (memcmp (contents + offset - 3, lea, 3) != 0
1175 || 0xe8 != *(contents + offset + 4))
1176 return FALSE;
1177 }
1178
1179 r_symndx = htab->r_sym (rel[1].r_info);
1180 if (r_symndx < symtab_hdr->sh_info)
1181 return FALSE;
1182
1183 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1184 /* Use strncmp to check __tls_get_addr since __tls_get_addr
1185 may be versioned. */
1186 return (h != NULL
1187 && h->root.root.string != NULL
1188 && (ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PC32
1189 || ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLT32)
1190 && (strncmp (h->root.root.string,
1191 "__tls_get_addr", 14) == 0));
1192
1193 case R_X86_64_GOTTPOFF:
1194 /* Check transition from IE access model:
1195 mov foo@gottpoff(%rip), %reg
1196 add foo@gottpoff(%rip), %reg
1197 */
1198
1199 /* Check REX prefix first. */
1200 if (offset >= 3 && (offset + 4) <= sec->size)
1201 {
1202 val = bfd_get_8 (abfd, contents + offset - 3);
1203 if (val != 0x48 && val != 0x4c)
1204 {
1205 /* X32 may have 0x44 REX prefix or no REX prefix. */
1206 if (ABI_64_P (abfd))
1207 return FALSE;
1208 }
1209 }
1210 else
1211 {
1212 /* X32 may not have any REX prefix. */
1213 if (ABI_64_P (abfd))
1214 return FALSE;
1215 if (offset < 2 || (offset + 3) > sec->size)
1216 return FALSE;
1217 }
1218
1219 val = bfd_get_8 (abfd, contents + offset - 2);
1220 if (val != 0x8b && val != 0x03)
1221 return FALSE;
1222
1223 val = bfd_get_8 (abfd, contents + offset - 1);
1224 return (val & 0xc7) == 5;
1225
1226 case R_X86_64_GOTPC32_TLSDESC:
1227 /* Check transition from GDesc access model:
1228 leaq x@tlsdesc(%rip), %rax
1229
1230 Make sure it's a leaq adding rip to a 32-bit offset
1231 into any register, although it's probably almost always
1232 going to be rax. */
1233
1234 if (offset < 3 || (offset + 4) > sec->size)
1235 return FALSE;
1236
1237 val = bfd_get_8 (abfd, contents + offset - 3);
1238 if ((val & 0xfb) != 0x48)
1239 return FALSE;
1240
1241 if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1242 return FALSE;
1243
1244 val = bfd_get_8 (abfd, contents + offset - 1);
1245 return (val & 0xc7) == 0x05;
1246
1247 case R_X86_64_TLSDESC_CALL:
1248 /* Check transition from GDesc access model:
1249 call *x@tlsdesc(%rax)
1250 */
1251 if (offset + 2 <= sec->size)
1252 {
1253 /* Make sure that it's a call *x@tlsdesc(%rax). */
1254 static const unsigned char call[] = { 0xff, 0x10 };
1255 return memcmp (contents + offset, call, 2) == 0;
1256 }
1257
1258 return FALSE;
1259
1260 default:
1261 abort ();
1262 }
1263 }
1264
1265 /* Return TRUE if the TLS access transition is OK or no transition
1266 will be performed. Update R_TYPE if there is a transition. */
1267
1268 static bfd_boolean
1269 elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
1270 asection *sec, bfd_byte *contents,
1271 Elf_Internal_Shdr *symtab_hdr,
1272 struct elf_link_hash_entry **sym_hashes,
1273 unsigned int *r_type, int tls_type,
1274 const Elf_Internal_Rela *rel,
1275 const Elf_Internal_Rela *relend,
1276 struct elf_link_hash_entry *h,
1277 unsigned long r_symndx)
1278 {
1279 unsigned int from_type = *r_type;
1280 unsigned int to_type = from_type;
1281 bfd_boolean check = TRUE;
1282
1283 /* Skip TLS transition for functions. */
1284 if (h != NULL
1285 && (h->type == STT_FUNC
1286 || h->type == STT_GNU_IFUNC))
1287 return TRUE;
1288
1289 switch (from_type)
1290 {
1291 case R_X86_64_TLSGD:
1292 case R_X86_64_GOTPC32_TLSDESC:
1293 case R_X86_64_TLSDESC_CALL:
1294 case R_X86_64_GOTTPOFF:
1295 if (info->executable)
1296 {
1297 if (h == NULL)
1298 to_type = R_X86_64_TPOFF32;
1299 else
1300 to_type = R_X86_64_GOTTPOFF;
1301 }
1302
1303 /* When we are called from elf_x86_64_relocate_section,
1304 CONTENTS isn't NULL and there may be additional transitions
1305 based on TLS_TYPE. */
1306 if (contents != NULL)
1307 {
1308 unsigned int new_to_type = to_type;
1309
1310 if (info->executable
1311 && h != NULL
1312 && h->dynindx == -1
1313 && tls_type == GOT_TLS_IE)
1314 new_to_type = R_X86_64_TPOFF32;
1315
1316 if (to_type == R_X86_64_TLSGD
1317 || to_type == R_X86_64_GOTPC32_TLSDESC
1318 || to_type == R_X86_64_TLSDESC_CALL)
1319 {
1320 if (tls_type == GOT_TLS_IE)
1321 new_to_type = R_X86_64_GOTTPOFF;
1322 }
1323
1324 /* We checked the transition before when we were called from
1325 elf_x86_64_check_relocs. We only want to check the new
1326 transition which hasn't been checked before. */
1327 check = new_to_type != to_type && from_type == to_type;
1328 to_type = new_to_type;
1329 }
1330
1331 break;
1332
1333 case R_X86_64_TLSLD:
1334 if (info->executable)
1335 to_type = R_X86_64_TPOFF32;
1336 break;
1337
1338 default:
1339 return TRUE;
1340 }
1341
1342 /* Return TRUE if there is no transition. */
1343 if (from_type == to_type)
1344 return TRUE;
1345
1346 /* Check if the transition can be performed. */
1347 if (check
1348 && ! elf_x86_64_check_tls_transition (abfd, info, sec, contents,
1349 symtab_hdr, sym_hashes,
1350 from_type, rel, relend))
1351 {
1352 reloc_howto_type *from, *to;
1353 const char *name;
1354
1355 from = elf_x86_64_rtype_to_howto (abfd, from_type);
1356 to = elf_x86_64_rtype_to_howto (abfd, to_type);
1357
1358 if (h)
1359 name = h->root.root.string;
1360 else
1361 {
1362 struct elf_x86_64_link_hash_table *htab;
1363
1364 htab = elf_x86_64_hash_table (info);
1365 if (htab == NULL)
1366 name = "*unknown*";
1367 else
1368 {
1369 Elf_Internal_Sym *isym;
1370
1371 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1372 abfd, r_symndx);
1373 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1374 }
1375 }
1376
1377 (*_bfd_error_handler)
1378 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1379 "in section `%A' failed"),
1380 abfd, sec, from->name, to->name, name,
1381 (unsigned long) rel->r_offset);
1382 bfd_set_error (bfd_error_bad_value);
1383 return FALSE;
1384 }
1385
1386 *r_type = to_type;
1387 return TRUE;
1388 }
1389
1390 /* Look through the relocs for a section during the first phase, and
1391 calculate needed space in the global offset table, procedure
1392 linkage table, and dynamic reloc sections. */
1393
1394 static bfd_boolean
1395 elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
1396 asection *sec,
1397 const Elf_Internal_Rela *relocs)
1398 {
1399 struct elf_x86_64_link_hash_table *htab;
1400 Elf_Internal_Shdr *symtab_hdr;
1401 struct elf_link_hash_entry **sym_hashes;
1402 const Elf_Internal_Rela *rel;
1403 const Elf_Internal_Rela *rel_end;
1404 asection *sreloc;
1405
1406 if (info->relocatable)
1407 return TRUE;
1408
1409 BFD_ASSERT (is_x86_64_elf (abfd));
1410
1411 htab = elf_x86_64_hash_table (info);
1412 if (htab == NULL)
1413 return FALSE;
1414
1415 symtab_hdr = &elf_symtab_hdr (abfd);
1416 sym_hashes = elf_sym_hashes (abfd);
1417
1418 sreloc = NULL;
1419
1420 rel_end = relocs + sec->reloc_count;
1421 for (rel = relocs; rel < rel_end; rel++)
1422 {
1423 unsigned int r_type;
1424 unsigned long r_symndx;
1425 struct elf_link_hash_entry *h;
1426 Elf_Internal_Sym *isym;
1427 const char *name;
1428
1429 r_symndx = htab->r_sym (rel->r_info);
1430 r_type = ELF32_R_TYPE (rel->r_info);
1431
1432 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1433 {
1434 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1435 abfd, r_symndx);
1436 return FALSE;
1437 }
1438
1439 if (r_symndx < symtab_hdr->sh_info)
1440 {
1441 /* A local symbol. */
1442 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1443 abfd, r_symndx);
1444 if (isym == NULL)
1445 return FALSE;
1446
1447 /* Check relocation against local STT_GNU_IFUNC symbol. */
1448 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1449 {
1450 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel,
1451 TRUE);
1452 if (h == NULL)
1453 return FALSE;
1454
1455 /* Fake a STT_GNU_IFUNC symbol. */
1456 h->type = STT_GNU_IFUNC;
1457 h->def_regular = 1;
1458 h->ref_regular = 1;
1459 h->forced_local = 1;
1460 h->root.type = bfd_link_hash_defined;
1461 }
1462 else
1463 h = NULL;
1464 }
1465 else
1466 {
1467 isym = NULL;
1468 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1469 while (h->root.type == bfd_link_hash_indirect
1470 || h->root.type == bfd_link_hash_warning)
1471 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1472 }
1473
1474 /* Check invalid x32 relocations. */
1475 if (!ABI_64_P (abfd))
1476 switch (r_type)
1477 {
1478 default:
1479 break;
1480
1481 case R_X86_64_DTPOFF64:
1482 case R_X86_64_TPOFF64:
1483 case R_X86_64_PC64:
1484 case R_X86_64_GOTOFF64:
1485 case R_X86_64_GOT64:
1486 case R_X86_64_GOTPCREL64:
1487 case R_X86_64_GOTPC64:
1488 case R_X86_64_GOTPLT64:
1489 case R_X86_64_PLTOFF64:
1490 {
1491 if (h)
1492 name = h->root.root.string;
1493 else
1494 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1495 NULL);
1496 (*_bfd_error_handler)
1497 (_("%B: relocation %s against symbol `%s' isn't "
1498 "supported in x32 mode"), abfd,
1499 x86_64_elf_howto_table[r_type].name, name);
1500 bfd_set_error (bfd_error_bad_value);
1501 return FALSE;
1502 }
1503 break;
1504 }
1505
1506 if (h != NULL)
1507 {
1508 /* Create the ifunc sections for static executables. If we
1509 never see an indirect function symbol nor we are building
1510 a static executable, those sections will be empty and
1511 won't appear in output. */
1512 switch (r_type)
1513 {
1514 default:
1515 break;
1516
1517 case R_X86_64_32S:
1518 case R_X86_64_32:
1519 case R_X86_64_64:
1520 case R_X86_64_PC32:
1521 case R_X86_64_PC64:
1522 case R_X86_64_PLT32:
1523 case R_X86_64_GOTPCREL:
1524 case R_X86_64_GOTPCREL64:
1525 if (htab->elf.dynobj == NULL)
1526 htab->elf.dynobj = abfd;
1527 if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info))
1528 return FALSE;
1529 break;
1530 }
1531
1532 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
1533 it here if it is defined in a non-shared object. */
1534 if (h->type == STT_GNU_IFUNC
1535 && h->def_regular)
1536 {
1537 /* It is referenced by a non-shared object. */
1538 h->ref_regular = 1;
1539 h->needs_plt = 1;
1540
1541 /* STT_GNU_IFUNC symbol must go through PLT. */
1542 h->plt.refcount += 1;
1543
1544 /* STT_GNU_IFUNC needs dynamic sections. */
1545 if (htab->elf.dynobj == NULL)
1546 htab->elf.dynobj = abfd;
1547
1548 switch (r_type)
1549 {
1550 default:
1551 if (h->root.root.string)
1552 name = h->root.root.string;
1553 else
1554 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1555 NULL);
1556 (*_bfd_error_handler)
1557 (_("%B: relocation %s against STT_GNU_IFUNC "
1558 "symbol `%s' isn't handled by %s"), abfd,
1559 x86_64_elf_howto_table[r_type].name,
1560 name, __FUNCTION__);
1561 bfd_set_error (bfd_error_bad_value);
1562 return FALSE;
1563
1564 case R_X86_64_32:
1565 if (ABI_64_P (abfd))
1566 goto not_pointer;
1567 case R_X86_64_64:
1568 h->non_got_ref = 1;
1569 h->pointer_equality_needed = 1;
1570 if (info->shared)
1571 {
1572 /* We must copy these reloc types into the output
1573 file. Create a reloc section in dynobj and
1574 make room for this reloc. */
1575 sreloc = _bfd_elf_create_ifunc_dyn_reloc
1576 (abfd, info, sec, sreloc,
1577 &((struct elf_x86_64_link_hash_entry *) h)->dyn_relocs);
1578 if (sreloc == NULL)
1579 return FALSE;
1580 }
1581 break;
1582
1583 case R_X86_64_32S:
1584 case R_X86_64_PC32:
1585 case R_X86_64_PC64:
1586 not_pointer:
1587 h->non_got_ref = 1;
1588 if (r_type != R_X86_64_PC32
1589 && r_type != R_X86_64_PC64)
1590 h->pointer_equality_needed = 1;
1591 break;
1592
1593 case R_X86_64_PLT32:
1594 break;
1595
1596 case R_X86_64_GOTPCREL:
1597 case R_X86_64_GOTPCREL64:
1598 h->got.refcount += 1;
1599 if (htab->elf.sgot == NULL
1600 && !_bfd_elf_create_got_section (htab->elf.dynobj,
1601 info))
1602 return FALSE;
1603 break;
1604 }
1605
1606 continue;
1607 }
1608 }
1609
1610 if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
1611 symtab_hdr, sym_hashes,
1612 &r_type, GOT_UNKNOWN,
1613 rel, rel_end, h, r_symndx))
1614 return FALSE;
1615
1616 switch (r_type)
1617 {
1618 case R_X86_64_TLSLD:
1619 htab->tls_ld_got.refcount += 1;
1620 goto create_got;
1621
1622 case R_X86_64_TPOFF32:
1623 if (!info->executable && ABI_64_P (abfd))
1624 {
1625 if (h)
1626 name = h->root.root.string;
1627 else
1628 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1629 NULL);
1630 (*_bfd_error_handler)
1631 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1632 abfd,
1633 x86_64_elf_howto_table[r_type].name, name);
1634 bfd_set_error (bfd_error_bad_value);
1635 return FALSE;
1636 }
1637 break;
1638
1639 case R_X86_64_GOTTPOFF:
1640 if (!info->executable)
1641 info->flags |= DF_STATIC_TLS;
1642 /* Fall through */
1643
1644 case R_X86_64_GOT32:
1645 case R_X86_64_GOTPCREL:
1646 case R_X86_64_TLSGD:
1647 case R_X86_64_GOT64:
1648 case R_X86_64_GOTPCREL64:
1649 case R_X86_64_GOTPLT64:
1650 case R_X86_64_GOTPC32_TLSDESC:
1651 case R_X86_64_TLSDESC_CALL:
1652 /* This symbol requires a global offset table entry. */
1653 {
1654 int tls_type, old_tls_type;
1655
1656 switch (r_type)
1657 {
1658 default: tls_type = GOT_NORMAL; break;
1659 case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break;
1660 case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break;
1661 case R_X86_64_GOTPC32_TLSDESC:
1662 case R_X86_64_TLSDESC_CALL:
1663 tls_type = GOT_TLS_GDESC; break;
1664 }
1665
1666 if (h != NULL)
1667 {
1668 if (r_type == R_X86_64_GOTPLT64)
1669 {
1670 /* This relocation indicates that we also need
1671 a PLT entry, as this is a function. We don't need
1672 a PLT entry for local symbols. */
1673 h->needs_plt = 1;
1674 h->plt.refcount += 1;
1675 }
1676 h->got.refcount += 1;
1677 old_tls_type = elf_x86_64_hash_entry (h)->tls_type;
1678 }
1679 else
1680 {
1681 bfd_signed_vma *local_got_refcounts;
1682
1683 /* This is a global offset table entry for a local symbol. */
1684 local_got_refcounts = elf_local_got_refcounts (abfd);
1685 if (local_got_refcounts == NULL)
1686 {
1687 bfd_size_type size;
1688
1689 size = symtab_hdr->sh_info;
1690 size *= sizeof (bfd_signed_vma)
1691 + sizeof (bfd_vma) + sizeof (char);
1692 local_got_refcounts = ((bfd_signed_vma *)
1693 bfd_zalloc (abfd, size));
1694 if (local_got_refcounts == NULL)
1695 return FALSE;
1696 elf_local_got_refcounts (abfd) = local_got_refcounts;
1697 elf_x86_64_local_tlsdesc_gotent (abfd)
1698 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
1699 elf_x86_64_local_got_tls_type (abfd)
1700 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
1701 }
1702 local_got_refcounts[r_symndx] += 1;
1703 old_tls_type
1704 = elf_x86_64_local_got_tls_type (abfd) [r_symndx];
1705 }
1706
1707 /* If a TLS symbol is accessed using IE at least once,
1708 there is no point to use dynamic model for it. */
1709 if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1710 && (! GOT_TLS_GD_ANY_P (old_tls_type)
1711 || tls_type != GOT_TLS_IE))
1712 {
1713 if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type))
1714 tls_type = old_tls_type;
1715 else if (GOT_TLS_GD_ANY_P (old_tls_type)
1716 && GOT_TLS_GD_ANY_P (tls_type))
1717 tls_type |= old_tls_type;
1718 else
1719 {
1720 if (h)
1721 name = h->root.root.string;
1722 else
1723 name = bfd_elf_sym_name (abfd, symtab_hdr,
1724 isym, NULL);
1725 (*_bfd_error_handler)
1726 (_("%B: '%s' accessed both as normal and thread local symbol"),
1727 abfd, name);
1728 return FALSE;
1729 }
1730 }
1731
1732 if (old_tls_type != tls_type)
1733 {
1734 if (h != NULL)
1735 elf_x86_64_hash_entry (h)->tls_type = tls_type;
1736 else
1737 elf_x86_64_local_got_tls_type (abfd) [r_symndx] = tls_type;
1738 }
1739 }
1740 /* Fall through */
1741
1742 case R_X86_64_GOTOFF64:
1743 case R_X86_64_GOTPC32:
1744 case R_X86_64_GOTPC64:
1745 create_got:
1746 if (htab->elf.sgot == NULL)
1747 {
1748 if (htab->elf.dynobj == NULL)
1749 htab->elf.dynobj = abfd;
1750 if (!_bfd_elf_create_got_section (htab->elf.dynobj,
1751 info))
1752 return FALSE;
1753 }
1754 break;
1755
1756 case R_X86_64_PLT32:
1757 /* This symbol requires a procedure linkage table entry. We
1758 actually build the entry in adjust_dynamic_symbol,
1759 because this might be a case of linking PIC code which is
1760 never referenced by a dynamic object, in which case we
1761 don't need to generate a procedure linkage table entry
1762 after all. */
1763
1764 /* If this is a local symbol, we resolve it directly without
1765 creating a procedure linkage table entry. */
1766 if (h == NULL)
1767 continue;
1768
1769 h->needs_plt = 1;
1770 h->plt.refcount += 1;
1771 break;
1772
1773 case R_X86_64_PLTOFF64:
1774 /* This tries to form the 'address' of a function relative
1775 to GOT. For global symbols we need a PLT entry. */
1776 if (h != NULL)
1777 {
1778 h->needs_plt = 1;
1779 h->plt.refcount += 1;
1780 }
1781 goto create_got;
1782
1783 case R_X86_64_32:
1784 if (!ABI_64_P (abfd))
1785 goto pointer;
1786 case R_X86_64_8:
1787 case R_X86_64_16:
1788 case R_X86_64_32S:
1789 /* Let's help debug shared library creation. These relocs
1790 cannot be used in shared libs. Don't error out for
1791 sections we don't care about, such as debug sections or
1792 non-constant sections. */
1793 if (info->shared
1794 && (sec->flags & SEC_ALLOC) != 0
1795 && (sec->flags & SEC_READONLY) != 0)
1796 {
1797 if (h)
1798 name = h->root.root.string;
1799 else
1800 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1801 (*_bfd_error_handler)
1802 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1803 abfd, x86_64_elf_howto_table[r_type].name, name);
1804 bfd_set_error (bfd_error_bad_value);
1805 return FALSE;
1806 }
1807 /* Fall through. */
1808
1809 case R_X86_64_PC8:
1810 case R_X86_64_PC16:
1811 case R_X86_64_PC32:
1812 case R_X86_64_PC64:
1813 case R_X86_64_64:
1814 pointer:
1815 if (h != NULL && info->executable)
1816 {
1817 /* If this reloc is in a read-only section, we might
1818 need a copy reloc. We can't check reliably at this
1819 stage whether the section is read-only, as input
1820 sections have not yet been mapped to output sections.
1821 Tentatively set the flag for now, and correct in
1822 adjust_dynamic_symbol. */
1823 h->non_got_ref = 1;
1824
1825 /* We may need a .plt entry if the function this reloc
1826 refers to is in a shared lib. */
1827 h->plt.refcount += 1;
1828 if (r_type != R_X86_64_PC32 && r_type != R_X86_64_PC64)
1829 h->pointer_equality_needed = 1;
1830 }
1831
1832 /* If we are creating a shared library, and this is a reloc
1833 against a global symbol, or a non PC relative reloc
1834 against a local symbol, then we need to copy the reloc
1835 into the shared library. However, if we are linking with
1836 -Bsymbolic, we do not need to copy a reloc against a
1837 global symbol which is defined in an object we are
1838 including in the link (i.e., DEF_REGULAR is set). At
1839 this point we have not seen all the input files, so it is
1840 possible that DEF_REGULAR is not set now but will be set
1841 later (it is never cleared). In case of a weak definition,
1842 DEF_REGULAR may be cleared later by a strong definition in
1843 a shared library. We account for that possibility below by
1844 storing information in the relocs_copied field of the hash
1845 table entry. A similar situation occurs when creating
1846 shared libraries and symbol visibility changes render the
1847 symbol local.
1848
1849 If on the other hand, we are creating an executable, we
1850 may need to keep relocations for symbols satisfied by a
1851 dynamic library if we manage to avoid copy relocs for the
1852 symbol. */
1853 if ((info->shared
1854 && (sec->flags & SEC_ALLOC) != 0
1855 && (! IS_X86_64_PCREL_TYPE (r_type)
1856 || (h != NULL
1857 && (! SYMBOLIC_BIND (info, h)
1858 || h->root.type == bfd_link_hash_defweak
1859 || !h->def_regular))))
1860 || (ELIMINATE_COPY_RELOCS
1861 && !info->shared
1862 && (sec->flags & SEC_ALLOC) != 0
1863 && h != NULL
1864 && (h->root.type == bfd_link_hash_defweak
1865 || !h->def_regular)))
1866 {
1867 struct elf_dyn_relocs *p;
1868 struct elf_dyn_relocs **head;
1869
1870 /* We must copy these reloc types into the output file.
1871 Create a reloc section in dynobj and make room for
1872 this reloc. */
1873 if (sreloc == NULL)
1874 {
1875 if (htab->elf.dynobj == NULL)
1876 htab->elf.dynobj = abfd;
1877
1878 sreloc = _bfd_elf_make_dynamic_reloc_section
1879 (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2,
1880 abfd, /*rela?*/ TRUE);
1881
1882 if (sreloc == NULL)
1883 return FALSE;
1884 }
1885
1886 /* If this is a global symbol, we count the number of
1887 relocations we need for this symbol. */
1888 if (h != NULL)
1889 {
1890 head = &((struct elf_x86_64_link_hash_entry *) h)->dyn_relocs;
1891 }
1892 else
1893 {
1894 /* Track dynamic relocs needed for local syms too.
1895 We really need local syms available to do this
1896 easily. Oh well. */
1897 asection *s;
1898 void **vpp;
1899
1900 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1901 abfd, r_symndx);
1902 if (isym == NULL)
1903 return FALSE;
1904
1905 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1906 if (s == NULL)
1907 s = sec;
1908
1909 /* Beware of type punned pointers vs strict aliasing
1910 rules. */
1911 vpp = &(elf_section_data (s)->local_dynrel);
1912 head = (struct elf_dyn_relocs **)vpp;
1913 }
1914
1915 p = *head;
1916 if (p == NULL || p->sec != sec)
1917 {
1918 bfd_size_type amt = sizeof *p;
1919
1920 p = ((struct elf_dyn_relocs *)
1921 bfd_alloc (htab->elf.dynobj, amt));
1922 if (p == NULL)
1923 return FALSE;
1924 p->next = *head;
1925 *head = p;
1926 p->sec = sec;
1927 p->count = 0;
1928 p->pc_count = 0;
1929 }
1930
1931 p->count += 1;
1932 if (IS_X86_64_PCREL_TYPE (r_type))
1933 p->pc_count += 1;
1934 }
1935 break;
1936
1937 /* This relocation describes the C++ object vtable hierarchy.
1938 Reconstruct it for later use during GC. */
1939 case R_X86_64_GNU_VTINHERIT:
1940 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1941 return FALSE;
1942 break;
1943
1944 /* This relocation describes which C++ vtable entries are actually
1945 used. Record for later use during GC. */
1946 case R_X86_64_GNU_VTENTRY:
1947 BFD_ASSERT (h != NULL);
1948 if (h != NULL
1949 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1950 return FALSE;
1951 break;
1952
1953 default:
1954 break;
1955 }
1956 }
1957
1958 return TRUE;
1959 }
1960
1961 /* Return the section that should be marked against GC for a given
1962 relocation. */
1963
1964 static asection *
1965 elf_x86_64_gc_mark_hook (asection *sec,
1966 struct bfd_link_info *info,
1967 Elf_Internal_Rela *rel,
1968 struct elf_link_hash_entry *h,
1969 Elf_Internal_Sym *sym)
1970 {
1971 if (h != NULL)
1972 switch (ELF32_R_TYPE (rel->r_info))
1973 {
1974 case R_X86_64_GNU_VTINHERIT:
1975 case R_X86_64_GNU_VTENTRY:
1976 return NULL;
1977 }
1978
1979 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1980 }
1981
1982 /* Update the got entry reference counts for the section being removed. */
1983
1984 static bfd_boolean
1985 elf_x86_64_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
1986 asection *sec,
1987 const Elf_Internal_Rela *relocs)
1988 {
1989 struct elf_x86_64_link_hash_table *htab;
1990 Elf_Internal_Shdr *symtab_hdr;
1991 struct elf_link_hash_entry **sym_hashes;
1992 bfd_signed_vma *local_got_refcounts;
1993 const Elf_Internal_Rela *rel, *relend;
1994
1995 if (info->relocatable)
1996 return TRUE;
1997
1998 htab = elf_x86_64_hash_table (info);
1999 if (htab == NULL)
2000 return FALSE;
2001
2002 elf_section_data (sec)->local_dynrel = NULL;
2003
2004 symtab_hdr = &elf_symtab_hdr (abfd);
2005 sym_hashes = elf_sym_hashes (abfd);
2006 local_got_refcounts = elf_local_got_refcounts (abfd);
2007
2008 htab = elf_x86_64_hash_table (info);
2009 relend = relocs + sec->reloc_count;
2010 for (rel = relocs; rel < relend; rel++)
2011 {
2012 unsigned long r_symndx;
2013 unsigned int r_type;
2014 struct elf_link_hash_entry *h = NULL;
2015
2016 r_symndx = htab->r_sym (rel->r_info);
2017 if (r_symndx >= symtab_hdr->sh_info)
2018 {
2019 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2020 while (h->root.type == bfd_link_hash_indirect
2021 || h->root.type == bfd_link_hash_warning)
2022 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2023 }
2024 else
2025 {
2026 /* A local symbol. */
2027 Elf_Internal_Sym *isym;
2028
2029 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2030 abfd, r_symndx);
2031
2032 /* Check relocation against local STT_GNU_IFUNC symbol. */
2033 if (isym != NULL
2034 && ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2035 {
2036 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel, FALSE);
2037 if (h == NULL)
2038 abort ();
2039 }
2040 }
2041
2042 if (h)
2043 {
2044 struct elf_x86_64_link_hash_entry *eh;
2045 struct elf_dyn_relocs **pp;
2046 struct elf_dyn_relocs *p;
2047
2048 eh = (struct elf_x86_64_link_hash_entry *) h;
2049
2050 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2051 if (p->sec == sec)
2052 {
2053 /* Everything must go for SEC. */
2054 *pp = p->next;
2055 break;
2056 }
2057 }
2058
2059 r_type = ELF32_R_TYPE (rel->r_info);
2060 if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
2061 symtab_hdr, sym_hashes,
2062 &r_type, GOT_UNKNOWN,
2063 rel, relend, h, r_symndx))
2064 return FALSE;
2065
2066 switch (r_type)
2067 {
2068 case R_X86_64_TLSLD:
2069 if (htab->tls_ld_got.refcount > 0)
2070 htab->tls_ld_got.refcount -= 1;
2071 break;
2072
2073 case R_X86_64_TLSGD:
2074 case R_X86_64_GOTPC32_TLSDESC:
2075 case R_X86_64_TLSDESC_CALL:
2076 case R_X86_64_GOTTPOFF:
2077 case R_X86_64_GOT32:
2078 case R_X86_64_GOTPCREL:
2079 case R_X86_64_GOT64:
2080 case R_X86_64_GOTPCREL64:
2081 case R_X86_64_GOTPLT64:
2082 if (h != NULL)
2083 {
2084 if (r_type == R_X86_64_GOTPLT64 && h->plt.refcount > 0)
2085 h->plt.refcount -= 1;
2086 if (h->got.refcount > 0)
2087 h->got.refcount -= 1;
2088 if (h->type == STT_GNU_IFUNC)
2089 {
2090 if (h->plt.refcount > 0)
2091 h->plt.refcount -= 1;
2092 }
2093 }
2094 else if (local_got_refcounts != NULL)
2095 {
2096 if (local_got_refcounts[r_symndx] > 0)
2097 local_got_refcounts[r_symndx] -= 1;
2098 }
2099 break;
2100
2101 case R_X86_64_8:
2102 case R_X86_64_16:
2103 case R_X86_64_32:
2104 case R_X86_64_64:
2105 case R_X86_64_32S:
2106 case R_X86_64_PC8:
2107 case R_X86_64_PC16:
2108 case R_X86_64_PC32:
2109 case R_X86_64_PC64:
2110 if (info->shared
2111 && (h == NULL || h->type != STT_GNU_IFUNC))
2112 break;
2113 /* Fall thru */
2114
2115 case R_X86_64_PLT32:
2116 case R_X86_64_PLTOFF64:
2117 if (h != NULL)
2118 {
2119 if (h->plt.refcount > 0)
2120 h->plt.refcount -= 1;
2121 }
2122 break;
2123
2124 default:
2125 break;
2126 }
2127 }
2128
2129 return TRUE;
2130 }
2131
2132 /* Adjust a symbol defined by a dynamic object and referenced by a
2133 regular object. The current definition is in some section of the
2134 dynamic object, but we're not including those sections. We have to
2135 change the definition to something the rest of the link can
2136 understand. */
2137
2138 static bfd_boolean
2139 elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
2140 struct elf_link_hash_entry *h)
2141 {
2142 struct elf_x86_64_link_hash_table *htab;
2143 asection *s;
2144
2145 /* STT_GNU_IFUNC symbol must go through PLT. */
2146 if (h->type == STT_GNU_IFUNC)
2147 {
2148 if (h->plt.refcount <= 0)
2149 {
2150 h->plt.offset = (bfd_vma) -1;
2151 h->needs_plt = 0;
2152 }
2153 return TRUE;
2154 }
2155
2156 /* If this is a function, put it in the procedure linkage table. We
2157 will fill in the contents of the procedure linkage table later,
2158 when we know the address of the .got section. */
2159 if (h->type == STT_FUNC
2160 || h->needs_plt)
2161 {
2162 if (h->plt.refcount <= 0
2163 || SYMBOL_CALLS_LOCAL (info, h)
2164 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2165 && h->root.type == bfd_link_hash_undefweak))
2166 {
2167 /* This case can occur if we saw a PLT32 reloc in an input
2168 file, but the symbol was never referred to by a dynamic
2169 object, or if all references were garbage collected. In
2170 such a case, we don't actually need to build a procedure
2171 linkage table, and we can just do a PC32 reloc instead. */
2172 h->plt.offset = (bfd_vma) -1;
2173 h->needs_plt = 0;
2174 }
2175
2176 return TRUE;
2177 }
2178 else
2179 /* It's possible that we incorrectly decided a .plt reloc was
2180 needed for an R_X86_64_PC32 reloc to a non-function sym in
2181 check_relocs. We can't decide accurately between function and
2182 non-function syms in check-relocs; Objects loaded later in
2183 the link may change h->type. So fix it now. */
2184 h->plt.offset = (bfd_vma) -1;
2185
2186 /* If this is a weak symbol, and there is a real definition, the
2187 processor independent code will have arranged for us to see the
2188 real definition first, and we can just use the same value. */
2189 if (h->u.weakdef != NULL)
2190 {
2191 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2192 || h->u.weakdef->root.type == bfd_link_hash_defweak);
2193 h->root.u.def.section = h->u.weakdef->root.u.def.section;
2194 h->root.u.def.value = h->u.weakdef->root.u.def.value;
2195 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2196 h->non_got_ref = h->u.weakdef->non_got_ref;
2197 return TRUE;
2198 }
2199
2200 /* This is a reference to a symbol defined by a dynamic object which
2201 is not a function. */
2202
2203 /* If we are creating a shared library, we must presume that the
2204 only references to the symbol are via the global offset table.
2205 For such cases we need not do anything here; the relocations will
2206 be handled correctly by relocate_section. */
2207 if (info->shared)
2208 return TRUE;
2209
2210 /* If there are no references to this symbol that do not use the
2211 GOT, we don't need to generate a copy reloc. */
2212 if (!h->non_got_ref)
2213 return TRUE;
2214
2215 /* If -z nocopyreloc was given, we won't generate them either. */
2216 if (info->nocopyreloc)
2217 {
2218 h->non_got_ref = 0;
2219 return TRUE;
2220 }
2221
2222 if (ELIMINATE_COPY_RELOCS)
2223 {
2224 struct elf_x86_64_link_hash_entry * eh;
2225 struct elf_dyn_relocs *p;
2226
2227 eh = (struct elf_x86_64_link_hash_entry *) h;
2228 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2229 {
2230 s = p->sec->output_section;
2231 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2232 break;
2233 }
2234
2235 /* If we didn't find any dynamic relocs in read-only sections, then
2236 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
2237 if (p == NULL)
2238 {
2239 h->non_got_ref = 0;
2240 return TRUE;
2241 }
2242 }
2243
2244 /* We must allocate the symbol in our .dynbss section, which will
2245 become part of the .bss section of the executable. There will be
2246 an entry for this symbol in the .dynsym section. The dynamic
2247 object will contain position independent code, so all references
2248 from the dynamic object to this symbol will go through the global
2249 offset table. The dynamic linker will use the .dynsym entry to
2250 determine the address it must put in the global offset table, so
2251 both the dynamic object and the regular object will refer to the
2252 same memory location for the variable. */
2253
2254 htab = elf_x86_64_hash_table (info);
2255 if (htab == NULL)
2256 return FALSE;
2257
2258 /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
2259 to copy the initial value out of the dynamic object and into the
2260 runtime process image. */
2261 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2262 {
2263 const struct elf_backend_data *bed;
2264 bed = get_elf_backend_data (info->output_bfd);
2265 htab->srelbss->size += bed->s->sizeof_rela;
2266 h->needs_copy = 1;
2267 }
2268
2269 s = htab->sdynbss;
2270
2271 return _bfd_elf_adjust_dynamic_copy (h, s);
2272 }
2273
2274 /* Allocate space in .plt, .got and associated reloc sections for
2275 dynamic relocs. */
2276
2277 static bfd_boolean
2278 elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2279 {
2280 struct bfd_link_info *info;
2281 struct elf_x86_64_link_hash_table *htab;
2282 struct elf_x86_64_link_hash_entry *eh;
2283 struct elf_dyn_relocs *p;
2284 const struct elf_backend_data *bed;
2285 unsigned int plt_entry_size;
2286
2287 if (h->root.type == bfd_link_hash_indirect)
2288 return TRUE;
2289
2290 eh = (struct elf_x86_64_link_hash_entry *) h;
2291
2292 info = (struct bfd_link_info *) inf;
2293 htab = elf_x86_64_hash_table (info);
2294 if (htab == NULL)
2295 return FALSE;
2296 bed = get_elf_backend_data (info->output_bfd);
2297 plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2298
2299 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2300 here if it is defined and referenced in a non-shared object. */
2301 if (h->type == STT_GNU_IFUNC
2302 && h->def_regular)
2303 return _bfd_elf_allocate_ifunc_dyn_relocs (info, h,
2304 &eh->dyn_relocs,
2305 plt_entry_size,
2306 GOT_ENTRY_SIZE);
2307 else if (htab->elf.dynamic_sections_created
2308 && h->plt.refcount > 0)
2309 {
2310 /* Make sure this symbol is output as a dynamic symbol.
2311 Undefined weak syms won't yet be marked as dynamic. */
2312 if (h->dynindx == -1
2313 && !h->forced_local)
2314 {
2315 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2316 return FALSE;
2317 }
2318
2319 if (info->shared
2320 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2321 {
2322 asection *s = htab->elf.splt;
2323
2324 /* If this is the first .plt entry, make room for the special
2325 first entry. */
2326 if (s->size == 0)
2327 s->size += plt_entry_size;
2328
2329 h->plt.offset = s->size;
2330
2331 /* If this symbol is not defined in a regular file, and we are
2332 not generating a shared library, then set the symbol to this
2333 location in the .plt. This is required to make function
2334 pointers compare as equal between the normal executable and
2335 the shared library. */
2336 if (! info->shared
2337 && !h->def_regular)
2338 {
2339 h->root.u.def.section = s;
2340 h->root.u.def.value = h->plt.offset;
2341 }
2342
2343 /* Make room for this entry. */
2344 s->size += plt_entry_size;
2345
2346 /* We also need to make an entry in the .got.plt section, which
2347 will be placed in the .got section by the linker script. */
2348 htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
2349
2350 /* We also need to make an entry in the .rela.plt section. */
2351 htab->elf.srelplt->size += bed->s->sizeof_rela;
2352 htab->elf.srelplt->reloc_count++;
2353 }
2354 else
2355 {
2356 h->plt.offset = (bfd_vma) -1;
2357 h->needs_plt = 0;
2358 }
2359 }
2360 else
2361 {
2362 h->plt.offset = (bfd_vma) -1;
2363 h->needs_plt = 0;
2364 }
2365
2366 eh->tlsdesc_got = (bfd_vma) -1;
2367
2368 /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
2369 make it a R_X86_64_TPOFF32 requiring no GOT entry. */
2370 if (h->got.refcount > 0
2371 && info->executable
2372 && h->dynindx == -1
2373 && elf_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE)
2374 {
2375 h->got.offset = (bfd_vma) -1;
2376 }
2377 else if (h->got.refcount > 0)
2378 {
2379 asection *s;
2380 bfd_boolean dyn;
2381 int tls_type = elf_x86_64_hash_entry (h)->tls_type;
2382
2383 /* Make sure this symbol is output as a dynamic symbol.
2384 Undefined weak syms won't yet be marked as dynamic. */
2385 if (h->dynindx == -1
2386 && !h->forced_local)
2387 {
2388 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2389 return FALSE;
2390 }
2391
2392 if (GOT_TLS_GDESC_P (tls_type))
2393 {
2394 eh->tlsdesc_got = htab->elf.sgotplt->size
2395 - elf_x86_64_compute_jump_table_size (htab);
2396 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
2397 h->got.offset = (bfd_vma) -2;
2398 }
2399 if (! GOT_TLS_GDESC_P (tls_type)
2400 || GOT_TLS_GD_P (tls_type))
2401 {
2402 s = htab->elf.sgot;
2403 h->got.offset = s->size;
2404 s->size += GOT_ENTRY_SIZE;
2405 if (GOT_TLS_GD_P (tls_type))
2406 s->size += GOT_ENTRY_SIZE;
2407 }
2408 dyn = htab->elf.dynamic_sections_created;
2409 /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
2410 and two if global.
2411 R_X86_64_GOTTPOFF needs one dynamic relocation. */
2412 if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2413 || tls_type == GOT_TLS_IE)
2414 htab->elf.srelgot->size += bed->s->sizeof_rela;
2415 else if (GOT_TLS_GD_P (tls_type))
2416 htab->elf.srelgot->size += 2 * bed->s->sizeof_rela;
2417 else if (! GOT_TLS_GDESC_P (tls_type)
2418 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2419 || h->root.type != bfd_link_hash_undefweak)
2420 && (info->shared
2421 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2422 htab->elf.srelgot->size += bed->s->sizeof_rela;
2423 if (GOT_TLS_GDESC_P (tls_type))
2424 {
2425 htab->elf.srelplt->size += bed->s->sizeof_rela;
2426 htab->tlsdesc_plt = (bfd_vma) -1;
2427 }
2428 }
2429 else
2430 h->got.offset = (bfd_vma) -1;
2431
2432 if (eh->dyn_relocs == NULL)
2433 return TRUE;
2434
2435 /* In the shared -Bsymbolic case, discard space allocated for
2436 dynamic pc-relative relocs against symbols which turn out to be
2437 defined in regular objects. For the normal shared case, discard
2438 space for pc-relative relocs that have become local due to symbol
2439 visibility changes. */
2440
2441 if (info->shared)
2442 {
2443 /* Relocs that use pc_count are those that appear on a call
2444 insn, or certain REL relocs that can generated via assembly.
2445 We want calls to protected symbols to resolve directly to the
2446 function rather than going via the plt. If people want
2447 function pointer comparisons to work as expected then they
2448 should avoid writing weird assembly. */
2449 if (SYMBOL_CALLS_LOCAL (info, h))
2450 {
2451 struct elf_dyn_relocs **pp;
2452
2453 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2454 {
2455 p->count -= p->pc_count;
2456 p->pc_count = 0;
2457 if (p->count == 0)
2458 *pp = p->next;
2459 else
2460 pp = &p->next;
2461 }
2462 }
2463
2464 /* Also discard relocs on undefined weak syms with non-default
2465 visibility. */
2466 if (eh->dyn_relocs != NULL
2467 && h->root.type == bfd_link_hash_undefweak)
2468 {
2469 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2470 eh->dyn_relocs = NULL;
2471
2472 /* Make sure undefined weak symbols are output as a dynamic
2473 symbol in PIEs. */
2474 else if (h->dynindx == -1
2475 && ! h->forced_local
2476 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2477 return FALSE;
2478 }
2479
2480 }
2481 else if (ELIMINATE_COPY_RELOCS)
2482 {
2483 /* For the non-shared case, discard space for relocs against
2484 symbols which turn out to need copy relocs or are not
2485 dynamic. */
2486
2487 if (!h->non_got_ref
2488 && ((h->def_dynamic
2489 && !h->def_regular)
2490 || (htab->elf.dynamic_sections_created
2491 && (h->root.type == bfd_link_hash_undefweak
2492 || h->root.type == bfd_link_hash_undefined))))
2493 {
2494 /* Make sure this symbol is output as a dynamic symbol.
2495 Undefined weak syms won't yet be marked as dynamic. */
2496 if (h->dynindx == -1
2497 && ! h->forced_local
2498 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2499 return FALSE;
2500
2501 /* If that succeeded, we know we'll be keeping all the
2502 relocs. */
2503 if (h->dynindx != -1)
2504 goto keep;
2505 }
2506
2507 eh->dyn_relocs = NULL;
2508
2509 keep: ;
2510 }
2511
2512 /* Finally, allocate space. */
2513 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2514 {
2515 asection * sreloc;
2516
2517 sreloc = elf_section_data (p->sec)->sreloc;
2518
2519 BFD_ASSERT (sreloc != NULL);
2520
2521 sreloc->size += p->count * bed->s->sizeof_rela;
2522 }
2523
2524 return TRUE;
2525 }
2526
2527 /* Allocate space in .plt, .got and associated reloc sections for
2528 local dynamic relocs. */
2529
2530 static bfd_boolean
2531 elf_x86_64_allocate_local_dynrelocs (void **slot, void *inf)
2532 {
2533 struct elf_link_hash_entry *h
2534 = (struct elf_link_hash_entry *) *slot;
2535
2536 if (h->type != STT_GNU_IFUNC
2537 || !h->def_regular
2538 || !h->ref_regular
2539 || !h->forced_local
2540 || h->root.type != bfd_link_hash_defined)
2541 abort ();
2542
2543 return elf_x86_64_allocate_dynrelocs (h, inf);
2544 }
2545
2546 /* Find any dynamic relocs that apply to read-only sections. */
2547
2548 static bfd_boolean
2549 elf_x86_64_readonly_dynrelocs (struct elf_link_hash_entry *h,
2550 void * inf)
2551 {
2552 struct elf_x86_64_link_hash_entry *eh;
2553 struct elf_dyn_relocs *p;
2554
2555 /* Skip local IFUNC symbols. */
2556 if (h->forced_local && h->type == STT_GNU_IFUNC)
2557 return TRUE;
2558
2559 eh = (struct elf_x86_64_link_hash_entry *) h;
2560 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2561 {
2562 asection *s = p->sec->output_section;
2563
2564 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2565 {
2566 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2567
2568 info->flags |= DF_TEXTREL;
2569
2570 if (info->warn_shared_textrel && info->shared)
2571 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'.\n"),
2572 p->sec->owner, h->root.root.string,
2573 p->sec);
2574
2575 /* Not an error, just cut short the traversal. */
2576 return FALSE;
2577 }
2578 }
2579 return TRUE;
2580 }
2581
2582 /* Set the sizes of the dynamic sections. */
2583
2584 static bfd_boolean
2585 elf_x86_64_size_dynamic_sections (bfd *output_bfd,
2586 struct bfd_link_info *info)
2587 {
2588 struct elf_x86_64_link_hash_table *htab;
2589 bfd *dynobj;
2590 asection *s;
2591 bfd_boolean relocs;
2592 bfd *ibfd;
2593 const struct elf_backend_data *bed;
2594
2595 htab = elf_x86_64_hash_table (info);
2596 if (htab == NULL)
2597 return FALSE;
2598 bed = get_elf_backend_data (output_bfd);
2599
2600 dynobj = htab->elf.dynobj;
2601 if (dynobj == NULL)
2602 abort ();
2603
2604 if (htab->elf.dynamic_sections_created)
2605 {
2606 /* Set the contents of the .interp section to the interpreter. */
2607 if (info->executable)
2608 {
2609 s = bfd_get_section_by_name (dynobj, ".interp");
2610 if (s == NULL)
2611 abort ();
2612 s->size = htab->dynamic_interpreter_size;
2613 s->contents = (unsigned char *) htab->dynamic_interpreter;
2614 }
2615 }
2616
2617 /* Set up .got offsets for local syms, and space for local dynamic
2618 relocs. */
2619 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2620 {
2621 bfd_signed_vma *local_got;
2622 bfd_signed_vma *end_local_got;
2623 char *local_tls_type;
2624 bfd_vma *local_tlsdesc_gotent;
2625 bfd_size_type locsymcount;
2626 Elf_Internal_Shdr *symtab_hdr;
2627 asection *srel;
2628
2629 if (! is_x86_64_elf (ibfd))
2630 continue;
2631
2632 for (s = ibfd->sections; s != NULL; s = s->next)
2633 {
2634 struct elf_dyn_relocs *p;
2635
2636 for (p = (struct elf_dyn_relocs *)
2637 (elf_section_data (s)->local_dynrel);
2638 p != NULL;
2639 p = p->next)
2640 {
2641 if (!bfd_is_abs_section (p->sec)
2642 && bfd_is_abs_section (p->sec->output_section))
2643 {
2644 /* Input section has been discarded, either because
2645 it is a copy of a linkonce section or due to
2646 linker script /DISCARD/, so we'll be discarding
2647 the relocs too. */
2648 }
2649 else if (p->count != 0)
2650 {
2651 srel = elf_section_data (p->sec)->sreloc;
2652 srel->size += p->count * bed->s->sizeof_rela;
2653 if ((p->sec->output_section->flags & SEC_READONLY) != 0
2654 && (info->flags & DF_TEXTREL) == 0)
2655 {
2656 info->flags |= DF_TEXTREL;
2657 if (info->warn_shared_textrel && info->shared)
2658 info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'.\n"),
2659 p->sec->owner, p->sec);
2660 }
2661 }
2662 }
2663 }
2664
2665 local_got = elf_local_got_refcounts (ibfd);
2666 if (!local_got)
2667 continue;
2668
2669 symtab_hdr = &elf_symtab_hdr (ibfd);
2670 locsymcount = symtab_hdr->sh_info;
2671 end_local_got = local_got + locsymcount;
2672 local_tls_type = elf_x86_64_local_got_tls_type (ibfd);
2673 local_tlsdesc_gotent = elf_x86_64_local_tlsdesc_gotent (ibfd);
2674 s = htab->elf.sgot;
2675 srel = htab->elf.srelgot;
2676 for (; local_got < end_local_got;
2677 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
2678 {
2679 *local_tlsdesc_gotent = (bfd_vma) -1;
2680 if (*local_got > 0)
2681 {
2682 if (GOT_TLS_GDESC_P (*local_tls_type))
2683 {
2684 *local_tlsdesc_gotent = htab->elf.sgotplt->size
2685 - elf_x86_64_compute_jump_table_size (htab);
2686 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
2687 *local_got = (bfd_vma) -2;
2688 }
2689 if (! GOT_TLS_GDESC_P (*local_tls_type)
2690 || GOT_TLS_GD_P (*local_tls_type))
2691 {
2692 *local_got = s->size;
2693 s->size += GOT_ENTRY_SIZE;
2694 if (GOT_TLS_GD_P (*local_tls_type))
2695 s->size += GOT_ENTRY_SIZE;
2696 }
2697 if (info->shared
2698 || GOT_TLS_GD_ANY_P (*local_tls_type)
2699 || *local_tls_type == GOT_TLS_IE)
2700 {
2701 if (GOT_TLS_GDESC_P (*local_tls_type))
2702 {
2703 htab->elf.srelplt->size
2704 += bed->s->sizeof_rela;
2705 htab->tlsdesc_plt = (bfd_vma) -1;
2706 }
2707 if (! GOT_TLS_GDESC_P (*local_tls_type)
2708 || GOT_TLS_GD_P (*local_tls_type))
2709 srel->size += bed->s->sizeof_rela;
2710 }
2711 }
2712 else
2713 *local_got = (bfd_vma) -1;
2714 }
2715 }
2716
2717 if (htab->tls_ld_got.refcount > 0)
2718 {
2719 /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
2720 relocs. */
2721 htab->tls_ld_got.offset = htab->elf.sgot->size;
2722 htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE;
2723 htab->elf.srelgot->size += bed->s->sizeof_rela;
2724 }
2725 else
2726 htab->tls_ld_got.offset = -1;
2727
2728 /* Allocate global sym .plt and .got entries, and space for global
2729 sym dynamic relocs. */
2730 elf_link_hash_traverse (&htab->elf, elf_x86_64_allocate_dynrelocs,
2731 info);
2732
2733 /* Allocate .plt and .got entries, and space for local symbols. */
2734 htab_traverse (htab->loc_hash_table,
2735 elf_x86_64_allocate_local_dynrelocs,
2736 info);
2737
2738 /* For every jump slot reserved in the sgotplt, reloc_count is
2739 incremented. However, when we reserve space for TLS descriptors,
2740 it's not incremented, so in order to compute the space reserved
2741 for them, it suffices to multiply the reloc count by the jump
2742 slot size.
2743
2744 PR ld/13302: We start next_irelative_index at the end of .rela.plt
2745 so that R_X86_64_IRELATIVE entries come last. */
2746 if (htab->elf.srelplt)
2747 {
2748 htab->sgotplt_jump_table_size
2749 = elf_x86_64_compute_jump_table_size (htab);
2750 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
2751 }
2752 else if (htab->elf.irelplt)
2753 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
2754
2755 if (htab->tlsdesc_plt)
2756 {
2757 /* If we're not using lazy TLS relocations, don't generate the
2758 PLT and GOT entries they require. */
2759 if ((info->flags & DF_BIND_NOW))
2760 htab->tlsdesc_plt = 0;
2761 else
2762 {
2763 htab->tlsdesc_got = htab->elf.sgot->size;
2764 htab->elf.sgot->size += GOT_ENTRY_SIZE;
2765 /* Reserve room for the initial entry.
2766 FIXME: we could probably do away with it in this case. */
2767 if (htab->elf.splt->size == 0)
2768 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
2769 htab->tlsdesc_plt = htab->elf.splt->size;
2770 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
2771 }
2772 }
2773
2774 if (htab->elf.sgotplt)
2775 {
2776 struct elf_link_hash_entry *got;
2777 got = elf_link_hash_lookup (elf_hash_table (info),
2778 "_GLOBAL_OFFSET_TABLE_",
2779 FALSE, FALSE, FALSE);
2780
2781 /* Don't allocate .got.plt section if there are no GOT nor PLT
2782 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
2783 if ((got == NULL
2784 || !got->ref_regular_nonweak)
2785 && (htab->elf.sgotplt->size
2786 == get_elf_backend_data (output_bfd)->got_header_size)
2787 && (htab->elf.splt == NULL
2788 || htab->elf.splt->size == 0)
2789 && (htab->elf.sgot == NULL
2790 || htab->elf.sgot->size == 0)
2791 && (htab->elf.iplt == NULL
2792 || htab->elf.iplt->size == 0)
2793 && (htab->elf.igotplt == NULL
2794 || htab->elf.igotplt->size == 0))
2795 htab->elf.sgotplt->size = 0;
2796 }
2797
2798 /* We now have determined the sizes of the various dynamic sections.
2799 Allocate memory for them. */
2800 relocs = FALSE;
2801 for (s = dynobj->sections; s != NULL; s = s->next)
2802 {
2803 if ((s->flags & SEC_LINKER_CREATED) == 0)
2804 continue;
2805
2806 if (s == htab->elf.splt
2807 || s == htab->elf.sgot
2808 || s == htab->elf.sgotplt
2809 || s == htab->elf.iplt
2810 || s == htab->elf.igotplt
2811 || s == htab->sdynbss)
2812 {
2813 /* Strip this section if we don't need it; see the
2814 comment below. */
2815 }
2816 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2817 {
2818 if (s->size != 0 && s != htab->elf.srelplt)
2819 relocs = TRUE;
2820
2821 /* We use the reloc_count field as a counter if we need
2822 to copy relocs into the output file. */
2823 if (s != htab->elf.srelplt)
2824 s->reloc_count = 0;
2825 }
2826 else
2827 {
2828 /* It's not one of our sections, so don't allocate space. */
2829 continue;
2830 }
2831
2832 if (s->size == 0)
2833 {
2834 /* If we don't need this section, strip it from the
2835 output file. This is mostly to handle .rela.bss and
2836 .rela.plt. We must create both sections in
2837 create_dynamic_sections, because they must be created
2838 before the linker maps input sections to output
2839 sections. The linker does that before
2840 adjust_dynamic_symbol is called, and it is that
2841 function which decides whether anything needs to go
2842 into these sections. */
2843
2844 s->flags |= SEC_EXCLUDE;
2845 continue;
2846 }
2847
2848 if ((s->flags & SEC_HAS_CONTENTS) == 0)
2849 continue;
2850
2851 /* Allocate memory for the section contents. We use bfd_zalloc
2852 here in case unused entries are not reclaimed before the
2853 section's contents are written out. This should not happen,
2854 but this way if it does, we get a R_X86_64_NONE reloc instead
2855 of garbage. */
2856 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2857 if (s->contents == NULL)
2858 return FALSE;
2859 }
2860
2861 if (htab->plt_eh_frame != NULL
2862 && htab->elf.splt != NULL
2863 && htab->elf.splt->size != 0
2864 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0)
2865 bfd_put_32 (dynobj, htab->elf.splt->size,
2866 htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
2867
2868 if (htab->elf.dynamic_sections_created)
2869 {
2870 /* Add some entries to the .dynamic section. We fill in the
2871 values later, in elf_x86_64_finish_dynamic_sections, but we
2872 must add the entries now so that we get the correct size for
2873 the .dynamic section. The DT_DEBUG entry is filled in by the
2874 dynamic linker and used by the debugger. */
2875 #define add_dynamic_entry(TAG, VAL) \
2876 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2877
2878 if (info->executable)
2879 {
2880 if (!add_dynamic_entry (DT_DEBUG, 0))
2881 return FALSE;
2882 }
2883
2884 if (htab->elf.splt->size != 0)
2885 {
2886 if (!add_dynamic_entry (DT_PLTGOT, 0)
2887 || !add_dynamic_entry (DT_PLTRELSZ, 0)
2888 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2889 || !add_dynamic_entry (DT_JMPREL, 0))
2890 return FALSE;
2891
2892 if (htab->tlsdesc_plt
2893 && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
2894 || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
2895 return FALSE;
2896 }
2897
2898 if (relocs)
2899 {
2900 if (!add_dynamic_entry (DT_RELA, 0)
2901 || !add_dynamic_entry (DT_RELASZ, 0)
2902 || !add_dynamic_entry (DT_RELAENT, bed->s->sizeof_rela))
2903 return FALSE;
2904
2905 /* If any dynamic relocs apply to a read-only section,
2906 then we need a DT_TEXTREL entry. */
2907 if ((info->flags & DF_TEXTREL) == 0)
2908 elf_link_hash_traverse (&htab->elf,
2909 elf_x86_64_readonly_dynrelocs,
2910 info);
2911
2912 if ((info->flags & DF_TEXTREL) != 0)
2913 {
2914 if (!add_dynamic_entry (DT_TEXTREL, 0))
2915 return FALSE;
2916 }
2917 }
2918 }
2919 #undef add_dynamic_entry
2920
2921 return TRUE;
2922 }
2923
2924 static bfd_boolean
2925 elf_x86_64_always_size_sections (bfd *output_bfd,
2926 struct bfd_link_info *info)
2927 {
2928 asection *tls_sec = elf_hash_table (info)->tls_sec;
2929
2930 if (tls_sec)
2931 {
2932 struct elf_link_hash_entry *tlsbase;
2933
2934 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
2935 "_TLS_MODULE_BASE_",
2936 FALSE, FALSE, FALSE);
2937
2938 if (tlsbase && tlsbase->type == STT_TLS)
2939 {
2940 struct elf_x86_64_link_hash_table *htab;
2941 struct bfd_link_hash_entry *bh = NULL;
2942 const struct elf_backend_data *bed
2943 = get_elf_backend_data (output_bfd);
2944
2945 htab = elf_x86_64_hash_table (info);
2946 if (htab == NULL)
2947 return FALSE;
2948
2949 if (!(_bfd_generic_link_add_one_symbol
2950 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
2951 tls_sec, 0, NULL, FALSE,
2952 bed->collect, &bh)))
2953 return FALSE;
2954
2955 htab->tls_module_base = bh;
2956
2957 tlsbase = (struct elf_link_hash_entry *)bh;
2958 tlsbase->def_regular = 1;
2959 tlsbase->other = STV_HIDDEN;
2960 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
2961 }
2962 }
2963
2964 return TRUE;
2965 }
2966
2967 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
2968 executables. Rather than setting it to the beginning of the TLS
2969 section, we have to set it to the end. This function may be called
2970 multiple times, it is idempotent. */
2971
2972 static void
2973 elf_x86_64_set_tls_module_base (struct bfd_link_info *info)
2974 {
2975 struct elf_x86_64_link_hash_table *htab;
2976 struct bfd_link_hash_entry *base;
2977
2978 if (!info->executable)
2979 return;
2980
2981 htab = elf_x86_64_hash_table (info);
2982 if (htab == NULL)
2983 return;
2984
2985 base = htab->tls_module_base;
2986 if (base == NULL)
2987 return;
2988
2989 base->u.def.value = htab->elf.tls_size;
2990 }
2991
2992 /* Return the base VMA address which should be subtracted from real addresses
2993 when resolving @dtpoff relocation.
2994 This is PT_TLS segment p_vaddr. */
2995
2996 static bfd_vma
2997 elf_x86_64_dtpoff_base (struct bfd_link_info *info)
2998 {
2999 /* If tls_sec is NULL, we should have signalled an error already. */
3000 if (elf_hash_table (info)->tls_sec == NULL)
3001 return 0;
3002 return elf_hash_table (info)->tls_sec->vma;
3003 }
3004
3005 /* Return the relocation value for @tpoff relocation
3006 if STT_TLS virtual address is ADDRESS. */
3007
3008 static bfd_vma
3009 elf_x86_64_tpoff (struct bfd_link_info *info, bfd_vma address)
3010 {
3011 struct elf_link_hash_table *htab = elf_hash_table (info);
3012 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3013 bfd_vma static_tls_size;
3014
3015 /* If tls_segment is NULL, we should have signalled an error already. */
3016 if (htab->tls_sec == NULL)
3017 return 0;
3018
3019 /* Consider special static TLS alignment requirements. */
3020 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3021 return address - static_tls_size - htab->tls_sec->vma;
3022 }
3023
3024 /* Is the instruction before OFFSET in CONTENTS a 32bit relative
3025 branch? */
3026
3027 static bfd_boolean
3028 is_32bit_relative_branch (bfd_byte *contents, bfd_vma offset)
3029 {
3030 /* Opcode Instruction
3031 0xe8 call
3032 0xe9 jump
3033 0x0f 0x8x conditional jump */
3034 return ((offset > 0
3035 && (contents [offset - 1] == 0xe8
3036 || contents [offset - 1] == 0xe9))
3037 || (offset > 1
3038 && contents [offset - 2] == 0x0f
3039 && (contents [offset - 1] & 0xf0) == 0x80));
3040 }
3041
3042 /* Relocate an x86_64 ELF section. */
3043
3044 static bfd_boolean
3045 elf_x86_64_relocate_section (bfd *output_bfd,
3046 struct bfd_link_info *info,
3047 bfd *input_bfd,
3048 asection *input_section,
3049 bfd_byte *contents,
3050 Elf_Internal_Rela *relocs,
3051 Elf_Internal_Sym *local_syms,
3052 asection **local_sections)
3053 {
3054 struct elf_x86_64_link_hash_table *htab;
3055 Elf_Internal_Shdr *symtab_hdr;
3056 struct elf_link_hash_entry **sym_hashes;
3057 bfd_vma *local_got_offsets;
3058 bfd_vma *local_tlsdesc_gotents;
3059 Elf_Internal_Rela *rel;
3060 Elf_Internal_Rela *relend;
3061 const unsigned int plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
3062
3063 BFD_ASSERT (is_x86_64_elf (input_bfd));
3064
3065 htab = elf_x86_64_hash_table (info);
3066 if (htab == NULL)
3067 return FALSE;
3068 symtab_hdr = &elf_symtab_hdr (input_bfd);
3069 sym_hashes = elf_sym_hashes (input_bfd);
3070 local_got_offsets = elf_local_got_offsets (input_bfd);
3071 local_tlsdesc_gotents = elf_x86_64_local_tlsdesc_gotent (input_bfd);
3072
3073 elf_x86_64_set_tls_module_base (info);
3074
3075 rel = relocs;
3076 relend = relocs + input_section->reloc_count;
3077 for (; rel < relend; rel++)
3078 {
3079 unsigned int r_type;
3080 reloc_howto_type *howto;
3081 unsigned long r_symndx;
3082 struct elf_link_hash_entry *h;
3083 Elf_Internal_Sym *sym;
3084 asection *sec;
3085 bfd_vma off, offplt;
3086 bfd_vma relocation;
3087 bfd_boolean unresolved_reloc;
3088 bfd_reloc_status_type r;
3089 int tls_type;
3090 asection *base_got;
3091
3092 r_type = ELF32_R_TYPE (rel->r_info);
3093 if (r_type == (int) R_X86_64_GNU_VTINHERIT
3094 || r_type == (int) R_X86_64_GNU_VTENTRY)
3095 continue;
3096
3097 if (r_type >= R_X86_64_max)
3098 {
3099 bfd_set_error (bfd_error_bad_value);
3100 return FALSE;
3101 }
3102
3103 if (r_type != (int) R_X86_64_32
3104 || ABI_64_P (output_bfd))
3105 howto = x86_64_elf_howto_table + r_type;
3106 else
3107 howto = (x86_64_elf_howto_table
3108 + ARRAY_SIZE (x86_64_elf_howto_table) - 1);
3109 r_symndx = htab->r_sym (rel->r_info);
3110 h = NULL;
3111 sym = NULL;
3112 sec = NULL;
3113 unresolved_reloc = FALSE;
3114 if (r_symndx < symtab_hdr->sh_info)
3115 {
3116 sym = local_syms + r_symndx;
3117 sec = local_sections[r_symndx];
3118
3119 relocation = _bfd_elf_rela_local_sym (output_bfd, sym,
3120 &sec, rel);
3121
3122 /* Relocate against local STT_GNU_IFUNC symbol. */
3123 if (!info->relocatable
3124 && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3125 {
3126 h = elf_x86_64_get_local_sym_hash (htab, input_bfd,
3127 rel, FALSE);
3128 if (h == NULL)
3129 abort ();
3130
3131 /* Set STT_GNU_IFUNC symbol value. */
3132 h->root.u.def.value = sym->st_value;
3133 h->root.u.def.section = sec;
3134 }
3135 }
3136 else
3137 {
3138 bfd_boolean warned ATTRIBUTE_UNUSED;
3139
3140 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3141 r_symndx, symtab_hdr, sym_hashes,
3142 h, sec, relocation,
3143 unresolved_reloc, warned);
3144 }
3145
3146 if (sec != NULL && discarded_section (sec))
3147 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3148 rel, 1, relend, howto, 0, contents);
3149
3150 if (info->relocatable)
3151 continue;
3152
3153 if (rel->r_addend == 0
3154 && r_type == R_X86_64_64
3155 && !ABI_64_P (output_bfd))
3156 {
3157 /* For x32, treat R_X86_64_64 like R_X86_64_32 and zero-extend
3158 it to 64bit if addend is zero. */
3159 r_type = R_X86_64_32;
3160 memset (contents + rel->r_offset + 4, 0, 4);
3161 }
3162
3163 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
3164 it here if it is defined in a non-shared object. */
3165 if (h != NULL
3166 && h->type == STT_GNU_IFUNC
3167 && h->def_regular)
3168 {
3169 asection *plt;
3170 bfd_vma plt_index;
3171 const char *name;
3172
3173 if ((input_section->flags & SEC_ALLOC) == 0
3174 || h->plt.offset == (bfd_vma) -1)
3175 abort ();
3176
3177 /* STT_GNU_IFUNC symbol must go through PLT. */
3178 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
3179 relocation = (plt->output_section->vma
3180 + plt->output_offset + h->plt.offset);
3181
3182 switch (r_type)
3183 {
3184 default:
3185 if (h->root.root.string)
3186 name = h->root.root.string;
3187 else
3188 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3189 NULL);
3190 (*_bfd_error_handler)
3191 (_("%B: relocation %s against STT_GNU_IFUNC "
3192 "symbol `%s' isn't handled by %s"), input_bfd,
3193 x86_64_elf_howto_table[r_type].name,
3194 name, __FUNCTION__);
3195 bfd_set_error (bfd_error_bad_value);
3196 return FALSE;
3197
3198 case R_X86_64_32S:
3199 if (info->shared)
3200 abort ();
3201 goto do_relocation;
3202
3203 case R_X86_64_32:
3204 if (ABI_64_P (output_bfd))
3205 goto do_relocation;
3206 /* FALLTHROUGH */
3207 case R_X86_64_64:
3208 if (rel->r_addend != 0)
3209 {
3210 if (h->root.root.string)
3211 name = h->root.root.string;
3212 else
3213 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
3214 sym, NULL);
3215 (*_bfd_error_handler)
3216 (_("%B: relocation %s against STT_GNU_IFUNC "
3217 "symbol `%s' has non-zero addend: %d"),
3218 input_bfd, x86_64_elf_howto_table[r_type].name,
3219 name, rel->r_addend);
3220 bfd_set_error (bfd_error_bad_value);
3221 return FALSE;
3222 }
3223
3224 /* Generate dynamic relcoation only when there is a
3225 non-GOT reference in a shared object. */
3226 if (info->shared && h->non_got_ref)
3227 {
3228 Elf_Internal_Rela outrel;
3229 asection *sreloc;
3230
3231 /* Need a dynamic relocation to get the real function
3232 address. */
3233 outrel.r_offset = _bfd_elf_section_offset (output_bfd,
3234 info,
3235 input_section,
3236 rel->r_offset);
3237 if (outrel.r_offset == (bfd_vma) -1
3238 || outrel.r_offset == (bfd_vma) -2)
3239 abort ();
3240
3241 outrel.r_offset += (input_section->output_section->vma
3242 + input_section->output_offset);
3243
3244 if (h->dynindx == -1
3245 || h->forced_local
3246 || info->executable)
3247 {
3248 /* This symbol is resolved locally. */
3249 outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
3250 outrel.r_addend = (h->root.u.def.value
3251 + h->root.u.def.section->output_section->vma
3252 + h->root.u.def.section->output_offset);
3253 }
3254 else
3255 {
3256 outrel.r_info = htab->r_info (h->dynindx, r_type);
3257 outrel.r_addend = 0;
3258 }
3259
3260 sreloc = htab->elf.irelifunc;
3261 elf_append_rela (output_bfd, sreloc, &outrel);
3262
3263 /* If this reloc is against an external symbol, we
3264 do not want to fiddle with the addend. Otherwise,
3265 we need to include the symbol value so that it
3266 becomes an addend for the dynamic reloc. For an
3267 internal symbol, we have updated addend. */
3268 continue;
3269 }
3270 /* FALLTHROUGH */
3271 case R_X86_64_PC32:
3272 case R_X86_64_PC64:
3273 case R_X86_64_PLT32:
3274 goto do_relocation;
3275
3276 case R_X86_64_GOTPCREL:
3277 case R_X86_64_GOTPCREL64:
3278 base_got = htab->elf.sgot;
3279 off = h->got.offset;
3280
3281 if (base_got == NULL)
3282 abort ();
3283
3284 if (off == (bfd_vma) -1)
3285 {
3286 /* We can't use h->got.offset here to save state, or
3287 even just remember the offset, as finish_dynamic_symbol
3288 would use that as offset into .got. */
3289
3290 if (htab->elf.splt != NULL)
3291 {
3292 plt_index = h->plt.offset / plt_entry_size - 1;
3293 off = (plt_index + 3) * GOT_ENTRY_SIZE;
3294 base_got = htab->elf.sgotplt;
3295 }
3296 else
3297 {
3298 plt_index = h->plt.offset / plt_entry_size;
3299 off = plt_index * GOT_ENTRY_SIZE;
3300 base_got = htab->elf.igotplt;
3301 }
3302
3303 if (h->dynindx == -1
3304 || h->forced_local
3305 || info->symbolic)
3306 {
3307 /* This references the local defitionion. We must
3308 initialize this entry in the global offset table.
3309 Since the offset must always be a multiple of 8,
3310 we use the least significant bit to record
3311 whether we have initialized it already.
3312
3313 When doing a dynamic link, we create a .rela.got
3314 relocation entry to initialize the value. This
3315 is done in the finish_dynamic_symbol routine. */
3316 if ((off & 1) != 0)
3317 off &= ~1;
3318 else
3319 {
3320 bfd_put_64 (output_bfd, relocation,
3321 base_got->contents + off);
3322 /* Note that this is harmless for the GOTPLT64
3323 case, as -1 | 1 still is -1. */
3324 h->got.offset |= 1;
3325 }
3326 }
3327 }
3328
3329 relocation = (base_got->output_section->vma
3330 + base_got->output_offset + off);
3331
3332 goto do_relocation;
3333 }
3334 }
3335
3336 /* When generating a shared object, the relocations handled here are
3337 copied into the output file to be resolved at run time. */
3338 switch (r_type)
3339 {
3340 case R_X86_64_GOT32:
3341 case R_X86_64_GOT64:
3342 /* Relocation is to the entry for this symbol in the global
3343 offset table. */
3344 case R_X86_64_GOTPCREL:
3345 case R_X86_64_GOTPCREL64:
3346 /* Use global offset table entry as symbol value. */
3347 case R_X86_64_GOTPLT64:
3348 /* This is the same as GOT64 for relocation purposes, but
3349 indicates the existence of a PLT entry. The difficulty is,
3350 that we must calculate the GOT slot offset from the PLT
3351 offset, if this symbol got a PLT entry (it was global).
3352 Additionally if it's computed from the PLT entry, then that
3353 GOT offset is relative to .got.plt, not to .got. */
3354 base_got = htab->elf.sgot;
3355
3356 if (htab->elf.sgot == NULL)
3357 abort ();
3358
3359 if (h != NULL)
3360 {
3361 bfd_boolean dyn;
3362
3363 off = h->got.offset;
3364 if (h->needs_plt
3365 && h->plt.offset != (bfd_vma)-1
3366 && off == (bfd_vma)-1)
3367 {
3368 /* We can't use h->got.offset here to save
3369 state, or even just remember the offset, as
3370 finish_dynamic_symbol would use that as offset into
3371 .got. */
3372 bfd_vma plt_index = h->plt.offset / plt_entry_size - 1;
3373 off = (plt_index + 3) * GOT_ENTRY_SIZE;
3374 base_got = htab->elf.sgotplt;
3375 }
3376
3377 dyn = htab->elf.dynamic_sections_created;
3378
3379 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3380 || (info->shared
3381 && SYMBOL_REFERENCES_LOCAL (info, h))
3382 || (ELF_ST_VISIBILITY (h->other)
3383 && h->root.type == bfd_link_hash_undefweak))
3384 {
3385 /* This is actually a static link, or it is a -Bsymbolic
3386 link and the symbol is defined locally, or the symbol
3387 was forced to be local because of a version file. We
3388 must initialize this entry in the global offset table.
3389 Since the offset must always be a multiple of 8, we
3390 use the least significant bit to record whether we
3391 have initialized it already.
3392
3393 When doing a dynamic link, we create a .rela.got
3394 relocation entry to initialize the value. This is
3395 done in the finish_dynamic_symbol routine. */
3396 if ((off & 1) != 0)
3397 off &= ~1;
3398 else
3399 {
3400 bfd_put_64 (output_bfd, relocation,
3401 base_got->contents + off);
3402 /* Note that this is harmless for the GOTPLT64 case,
3403 as -1 | 1 still is -1. */
3404 h->got.offset |= 1;
3405 }
3406 }
3407 else
3408 unresolved_reloc = FALSE;
3409 }
3410 else
3411 {
3412 if (local_got_offsets == NULL)
3413 abort ();
3414
3415 off = local_got_offsets[r_symndx];
3416
3417 /* The offset must always be a multiple of 8. We use
3418 the least significant bit to record whether we have
3419 already generated the necessary reloc. */
3420 if ((off & 1) != 0)
3421 off &= ~1;
3422 else
3423 {
3424 bfd_put_64 (output_bfd, relocation,
3425 base_got->contents + off);
3426
3427 if (info->shared)
3428 {
3429 asection *s;
3430 Elf_Internal_Rela outrel;
3431
3432 /* We need to generate a R_X86_64_RELATIVE reloc
3433 for the dynamic linker. */
3434 s = htab->elf.srelgot;
3435 if (s == NULL)
3436 abort ();
3437
3438 outrel.r_offset = (base_got->output_section->vma
3439 + base_got->output_offset
3440 + off);
3441 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
3442 outrel.r_addend = relocation;
3443 elf_append_rela (output_bfd, s, &outrel);
3444 }
3445
3446 local_got_offsets[r_symndx] |= 1;
3447 }
3448 }
3449
3450 if (off >= (bfd_vma) -2)
3451 abort ();
3452
3453 relocation = base_got->output_section->vma
3454 + base_got->output_offset + off;
3455 if (r_type != R_X86_64_GOTPCREL && r_type != R_X86_64_GOTPCREL64)
3456 relocation -= htab->elf.sgotplt->output_section->vma
3457 - htab->elf.sgotplt->output_offset;
3458
3459 break;
3460
3461 case R_X86_64_GOTOFF64:
3462 /* Relocation is relative to the start of the global offset
3463 table. */
3464
3465 /* Check to make sure it isn't a protected function symbol
3466 for shared library since it may not be local when used
3467 as function address. */
3468 if (!info->executable
3469 && h
3470 && !SYMBOLIC_BIND (info, h)
3471 && h->def_regular
3472 && h->type == STT_FUNC
3473 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
3474 {
3475 (*_bfd_error_handler)
3476 (_("%B: relocation R_X86_64_GOTOFF64 against protected function `%s' can not be used when making a shared object"),
3477 input_bfd, h->root.root.string);
3478 bfd_set_error (bfd_error_bad_value);
3479 return FALSE;
3480 }
3481
3482 /* Note that sgot is not involved in this
3483 calculation. We always want the start of .got.plt. If we
3484 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
3485 permitted by the ABI, we might have to change this
3486 calculation. */
3487 relocation -= htab->elf.sgotplt->output_section->vma
3488 + htab->elf.sgotplt->output_offset;
3489 break;
3490
3491 case R_X86_64_GOTPC32:
3492 case R_X86_64_GOTPC64:
3493 /* Use global offset table as symbol value. */
3494 relocation = htab->elf.sgotplt->output_section->vma
3495 + htab->elf.sgotplt->output_offset;
3496 unresolved_reloc = FALSE;
3497 break;
3498
3499 case R_X86_64_PLTOFF64:
3500 /* Relocation is PLT entry relative to GOT. For local
3501 symbols it's the symbol itself relative to GOT. */
3502 if (h != NULL
3503 /* See PLT32 handling. */
3504 && h->plt.offset != (bfd_vma) -1
3505 && htab->elf.splt != NULL)
3506 {
3507 relocation = (htab->elf.splt->output_section->vma
3508 + htab->elf.splt->output_offset
3509 + h->plt.offset);
3510 unresolved_reloc = FALSE;
3511 }
3512
3513 relocation -= htab->elf.sgotplt->output_section->vma
3514 + htab->elf.sgotplt->output_offset;
3515 break;
3516
3517 case R_X86_64_PLT32:
3518 /* Relocation is to the entry for this symbol in the
3519 procedure linkage table. */
3520
3521 /* Resolve a PLT32 reloc against a local symbol directly,
3522 without using the procedure linkage table. */
3523 if (h == NULL)
3524 break;
3525
3526 if (h->plt.offset == (bfd_vma) -1
3527 || htab->elf.splt == NULL)
3528 {
3529 /* We didn't make a PLT entry for this symbol. This
3530 happens when statically linking PIC code, or when
3531 using -Bsymbolic. */
3532 break;
3533 }
3534
3535 relocation = (htab->elf.splt->output_section->vma
3536 + htab->elf.splt->output_offset
3537 + h->plt.offset);
3538 unresolved_reloc = FALSE;
3539 break;
3540
3541 case R_X86_64_PC8:
3542 case R_X86_64_PC16:
3543 case R_X86_64_PC32:
3544 if (info->shared
3545 && (input_section->flags & SEC_ALLOC) != 0
3546 && (input_section->flags & SEC_READONLY) != 0
3547 && h != NULL)
3548 {
3549 bfd_boolean fail = FALSE;
3550 bfd_boolean branch
3551 = (r_type == R_X86_64_PC32
3552 && is_32bit_relative_branch (contents, rel->r_offset));
3553
3554 if (SYMBOL_REFERENCES_LOCAL (info, h))
3555 {
3556 /* Symbol is referenced locally. Make sure it is
3557 defined locally or for a branch. */
3558 fail = !h->def_regular && !branch;
3559 }
3560 else
3561 {
3562 /* Symbol isn't referenced locally. We only allow
3563 branch to symbol with non-default visibility. */
3564 fail = (!branch
3565 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT);
3566 }
3567
3568 if (fail)
3569 {
3570 const char *fmt;
3571 const char *v;
3572 const char *pic = "";
3573
3574 switch (ELF_ST_VISIBILITY (h->other))
3575 {
3576 case STV_HIDDEN:
3577 v = _("hidden symbol");
3578 break;
3579 case STV_INTERNAL:
3580 v = _("internal symbol");
3581 break;
3582 case STV_PROTECTED:
3583 v = _("protected symbol");
3584 break;
3585 default:
3586 v = _("symbol");
3587 pic = _("; recompile with -fPIC");
3588 break;
3589 }
3590
3591 if (h->def_regular)
3592 fmt = _("%B: relocation %s against %s `%s' can not be used when making a shared object%s");
3593 else
3594 fmt = _("%B: relocation %s against undefined %s `%s' can not be used when making a shared object%s");
3595
3596 (*_bfd_error_handler) (fmt, input_bfd,
3597 x86_64_elf_howto_table[r_type].name,
3598 v, h->root.root.string, pic);
3599 bfd_set_error (bfd_error_bad_value);
3600 return FALSE;
3601 }
3602 }
3603 /* Fall through. */
3604
3605 case R_X86_64_8:
3606 case R_X86_64_16:
3607 case R_X86_64_32:
3608 case R_X86_64_PC64:
3609 case R_X86_64_64:
3610 /* FIXME: The ABI says the linker should make sure the value is
3611 the same when it's zeroextended to 64 bit. */
3612
3613 if ((input_section->flags & SEC_ALLOC) == 0)
3614 break;
3615
3616 if ((info->shared
3617 && (h == NULL
3618 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3619 || h->root.type != bfd_link_hash_undefweak)
3620 && (! IS_X86_64_PCREL_TYPE (r_type)
3621 || ! SYMBOL_CALLS_LOCAL (info, h)))
3622 || (ELIMINATE_COPY_RELOCS
3623 && !info->shared
3624 && h != NULL
3625 && h->dynindx != -1
3626 && !h->non_got_ref
3627 && ((h->def_dynamic
3628 && !h->def_regular)
3629 || h->root.type == bfd_link_hash_undefweak
3630 || h->root.type == bfd_link_hash_undefined)))
3631 {
3632 Elf_Internal_Rela outrel;
3633 bfd_boolean skip, relocate;
3634 asection *sreloc;
3635
3636 /* When generating a shared object, these relocations
3637 are copied into the output file to be resolved at run
3638 time. */
3639 skip = FALSE;
3640 relocate = FALSE;
3641
3642 outrel.r_offset =
3643 _bfd_elf_section_offset (output_bfd, info, input_section,
3644 rel->r_offset);
3645 if (outrel.r_offset == (bfd_vma) -1)
3646 skip = TRUE;
3647 else if (outrel.r_offset == (bfd_vma) -2)
3648 skip = TRUE, relocate = TRUE;
3649
3650 outrel.r_offset += (input_section->output_section->vma
3651 + input_section->output_offset);
3652
3653 if (skip)
3654 memset (&outrel, 0, sizeof outrel);
3655
3656 /* h->dynindx may be -1 if this symbol was marked to
3657 become local. */
3658 else if (h != NULL
3659 && h->dynindx != -1
3660 && (IS_X86_64_PCREL_TYPE (r_type)
3661 || ! info->shared
3662 || ! SYMBOLIC_BIND (info, h)
3663 || ! h->def_regular))
3664 {
3665 outrel.r_info = htab->r_info (h->dynindx, r_type);
3666 outrel.r_addend = rel->r_addend;
3667 }
3668 else
3669 {
3670 /* This symbol is local, or marked to become local. */
3671 if (r_type == htab->pointer_r_type)
3672 {
3673 relocate = TRUE;
3674 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
3675 outrel.r_addend = relocation + rel->r_addend;
3676 }
3677 else if (r_type == R_X86_64_64
3678 && !ABI_64_P (output_bfd))
3679 {
3680 relocate = TRUE;
3681 outrel.r_info = htab->r_info (0,
3682 R_X86_64_RELATIVE64);
3683 outrel.r_addend = relocation + rel->r_addend;
3684 /* Check addend overflow. */
3685 if ((outrel.r_addend & 0x80000000)
3686 != (rel->r_addend & 0x80000000))
3687 {
3688 const char *name;
3689 int addend = rel->r_addend;
3690 if (h && h->root.root.string)
3691 name = h->root.root.string;
3692 else
3693 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
3694 sym, NULL);
3695 if (addend < 0)
3696 (*_bfd_error_handler)
3697 (_("%B: addend -0x%x in relocation %s against "
3698 "symbol `%s' at 0x%lx in section `%A' is "
3699 "out of range"),
3700 input_bfd, input_section, addend,
3701 x86_64_elf_howto_table[r_type].name,
3702 name, (unsigned long) rel->r_offset);
3703 else
3704 (*_bfd_error_handler)
3705 (_("%B: addend 0x%x in relocation %s against "
3706 "symbol `%s' at 0x%lx in section `%A' is "
3707 "out of range"),
3708 input_bfd, input_section, addend,
3709 x86_64_elf_howto_table[r_type].name,
3710 name, (unsigned long) rel->r_offset);
3711 bfd_set_error (bfd_error_bad_value);
3712 return FALSE;
3713 }
3714 }
3715 else
3716 {
3717 long sindx;
3718
3719 if (bfd_is_abs_section (sec))
3720 sindx = 0;
3721 else if (sec == NULL || sec->owner == NULL)
3722 {
3723 bfd_set_error (bfd_error_bad_value);
3724 return FALSE;
3725 }
3726 else
3727 {
3728 asection *osec;
3729
3730 /* We are turning this relocation into one
3731 against a section symbol. It would be
3732 proper to subtract the symbol's value,
3733 osec->vma, from the emitted reloc addend,
3734 but ld.so expects buggy relocs. */
3735 osec = sec->output_section;
3736 sindx = elf_section_data (osec)->dynindx;
3737 if (sindx == 0)
3738 {
3739 asection *oi = htab->elf.text_index_section;
3740 sindx = elf_section_data (oi)->dynindx;
3741 }
3742 BFD_ASSERT (sindx != 0);
3743 }
3744
3745 outrel.r_info = htab->r_info (sindx, r_type);
3746 outrel.r_addend = relocation + rel->r_addend;
3747 }
3748 }
3749
3750 sreloc = elf_section_data (input_section)->sreloc;
3751
3752 if (sreloc == NULL || sreloc->contents == NULL)
3753 {
3754 r = bfd_reloc_notsupported;
3755 goto check_relocation_error;
3756 }
3757
3758 elf_append_rela (output_bfd, sreloc, &outrel);
3759
3760 /* If this reloc is against an external symbol, we do
3761 not want to fiddle with the addend. Otherwise, we
3762 need to include the symbol value so that it becomes
3763 an addend for the dynamic reloc. */
3764 if (! relocate)
3765 continue;
3766 }
3767
3768 break;
3769
3770 case R_X86_64_TLSGD:
3771 case R_X86_64_GOTPC32_TLSDESC:
3772 case R_X86_64_TLSDESC_CALL:
3773 case R_X86_64_GOTTPOFF:
3774 tls_type = GOT_UNKNOWN;
3775 if (h == NULL && local_got_offsets)
3776 tls_type = elf_x86_64_local_got_tls_type (input_bfd) [r_symndx];
3777 else if (h != NULL)
3778 tls_type = elf_x86_64_hash_entry (h)->tls_type;
3779
3780 if (! elf_x86_64_tls_transition (info, input_bfd,
3781 input_section, contents,
3782 symtab_hdr, sym_hashes,
3783 &r_type, tls_type, rel,
3784 relend, h, r_symndx))
3785 return FALSE;
3786
3787 if (r_type == R_X86_64_TPOFF32)
3788 {
3789 bfd_vma roff = rel->r_offset;
3790
3791 BFD_ASSERT (! unresolved_reloc);
3792
3793 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
3794 {
3795 /* GD->LE transition. For 64bit, change
3796 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
3797 .word 0x6666; rex64; call __tls_get_addr
3798 into:
3799 movq %fs:0, %rax
3800 leaq foo@tpoff(%rax), %rax
3801 For 32bit, change
3802 leaq foo@tlsgd(%rip), %rdi
3803 .word 0x6666; rex64; call __tls_get_addr
3804 into:
3805 movl %fs:0, %eax
3806 leaq foo@tpoff(%rax), %rax */
3807 if (ABI_64_P (output_bfd))
3808 memcpy (contents + roff - 4,
3809 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
3810 16);
3811 else
3812 memcpy (contents + roff - 3,
3813 "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
3814 15);
3815 bfd_put_32 (output_bfd,
3816 elf_x86_64_tpoff (info, relocation),
3817 contents + roff + 8);
3818 /* Skip R_X86_64_PC32/R_X86_64_PLT32. */
3819 rel++;
3820 continue;
3821 }
3822 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
3823 {
3824 /* GDesc -> LE transition.
3825 It's originally something like:
3826 leaq x@tlsdesc(%rip), %rax
3827
3828 Change it to:
3829 movl $x@tpoff, %rax. */
3830
3831 unsigned int val, type;
3832
3833 type = bfd_get_8 (input_bfd, contents + roff - 3);
3834 val = bfd_get_8 (input_bfd, contents + roff - 1);
3835 bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
3836 contents + roff - 3);
3837 bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
3838 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
3839 contents + roff - 1);
3840 bfd_put_32 (output_bfd,
3841 elf_x86_64_tpoff (info, relocation),
3842 contents + roff);
3843 continue;
3844 }
3845 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
3846 {
3847 /* GDesc -> LE transition.
3848 It's originally:
3849 call *(%rax)
3850 Turn it into:
3851 xchg %ax,%ax. */
3852 bfd_put_8 (output_bfd, 0x66, contents + roff);
3853 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3854 continue;
3855 }
3856 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTTPOFF)
3857 {
3858 /* IE->LE transition:
3859 Originally it can be one of:
3860 movq foo@gottpoff(%rip), %reg
3861 addq foo@gottpoff(%rip), %reg
3862 We change it into:
3863 movq $foo, %reg
3864 leaq foo(%reg), %reg
3865 addq $foo, %reg. */
3866
3867 unsigned int val, type, reg;
3868
3869 val = bfd_get_8 (input_bfd, contents + roff - 3);
3870 type = bfd_get_8 (input_bfd, contents + roff - 2);
3871 reg = bfd_get_8 (input_bfd, contents + roff - 1);
3872 reg >>= 3;
3873 if (type == 0x8b)
3874 {
3875 /* movq */
3876 if (val == 0x4c)
3877 bfd_put_8 (output_bfd, 0x49,
3878 contents + roff - 3);
3879 else if (!ABI_64_P (output_bfd) && val == 0x44)
3880 bfd_put_8 (output_bfd, 0x41,
3881 contents + roff - 3);
3882 bfd_put_8 (output_bfd, 0xc7,
3883 contents + roff - 2);
3884 bfd_put_8 (output_bfd, 0xc0 | reg,
3885 contents + roff - 1);
3886 }
3887 else if (reg == 4)
3888 {
3889 /* addq -> addq - addressing with %rsp/%r12 is
3890 special */
3891 if (val == 0x4c)
3892 bfd_put_8 (output_bfd, 0x49,
3893 contents + roff - 3);
3894 else if (!ABI_64_P (output_bfd) && val == 0x44)
3895 bfd_put_8 (output_bfd, 0x41,
3896 contents + roff - 3);
3897 bfd_put_8 (output_bfd, 0x81,
3898 contents + roff - 2);
3899 bfd_put_8 (output_bfd, 0xc0 | reg,
3900 contents + roff - 1);
3901 }
3902 else
3903 {
3904 /* addq -> leaq */
3905 if (val == 0x4c)
3906 bfd_put_8 (output_bfd, 0x4d,
3907 contents + roff - 3);
3908 else if (!ABI_64_P (output_bfd) && val == 0x44)
3909 bfd_put_8 (output_bfd, 0x45,
3910 contents + roff - 3);
3911 bfd_put_8 (output_bfd, 0x8d,
3912 contents + roff - 2);
3913 bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
3914 contents + roff - 1);
3915 }
3916 bfd_put_32 (output_bfd,
3917 elf_x86_64_tpoff (info, relocation),
3918 contents + roff);
3919 continue;
3920 }
3921 else
3922 BFD_ASSERT (FALSE);
3923 }
3924
3925 if (htab->elf.sgot == NULL)
3926 abort ();
3927
3928 if (h != NULL)
3929 {
3930 off = h->got.offset;
3931 offplt = elf_x86_64_hash_entry (h)->tlsdesc_got;
3932 }
3933 else
3934 {
3935 if (local_got_offsets == NULL)
3936 abort ();
3937
3938 off = local_got_offsets[r_symndx];
3939 offplt = local_tlsdesc_gotents[r_symndx];
3940 }
3941
3942 if ((off & 1) != 0)
3943 off &= ~1;
3944 else
3945 {
3946 Elf_Internal_Rela outrel;
3947 int dr_type, indx;
3948 asection *sreloc;
3949
3950 if (htab->elf.srelgot == NULL)
3951 abort ();
3952
3953 indx = h && h->dynindx != -1 ? h->dynindx : 0;
3954
3955 if (GOT_TLS_GDESC_P (tls_type))
3956 {
3957 outrel.r_info = htab->r_info (indx, R_X86_64_TLSDESC);
3958 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
3959 + 2 * GOT_ENTRY_SIZE <= htab->elf.sgotplt->size);
3960 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
3961 + htab->elf.sgotplt->output_offset
3962 + offplt
3963 + htab->sgotplt_jump_table_size);
3964 sreloc = htab->elf.srelplt;
3965 if (indx == 0)
3966 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
3967 else
3968 outrel.r_addend = 0;
3969 elf_append_rela (output_bfd, sreloc, &outrel);
3970 }
3971
3972 sreloc = htab->elf.srelgot;
3973
3974 outrel.r_offset = (htab->elf.sgot->output_section->vma
3975 + htab->elf.sgot->output_offset + off);
3976
3977 if (GOT_TLS_GD_P (tls_type))
3978 dr_type = R_X86_64_DTPMOD64;
3979 else if (GOT_TLS_GDESC_P (tls_type))
3980 goto dr_done;
3981 else
3982 dr_type = R_X86_64_TPOFF64;
3983
3984 bfd_put_64 (output_bfd, 0, htab->elf.sgot->contents + off);
3985 outrel.r_addend = 0;
3986 if ((dr_type == R_X86_64_TPOFF64
3987 || dr_type == R_X86_64_TLSDESC) && indx == 0)
3988 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
3989 outrel.r_info = htab->r_info (indx, dr_type);
3990
3991 elf_append_rela (output_bfd, sreloc, &outrel);
3992
3993 if (GOT_TLS_GD_P (tls_type))
3994 {
3995 if (indx == 0)
3996 {
3997 BFD_ASSERT (! unresolved_reloc);
3998 bfd_put_64 (output_bfd,
3999 relocation - elf_x86_64_dtpoff_base (info),
4000 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4001 }
4002 else
4003 {
4004 bfd_put_64 (output_bfd, 0,
4005 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4006 outrel.r_info = htab->r_info (indx,
4007 R_X86_64_DTPOFF64);
4008 outrel.r_offset += GOT_ENTRY_SIZE;
4009 elf_append_rela (output_bfd, sreloc,
4010 &outrel);
4011 }
4012 }
4013
4014 dr_done:
4015 if (h != NULL)
4016 h->got.offset |= 1;
4017 else
4018 local_got_offsets[r_symndx] |= 1;
4019 }
4020
4021 if (off >= (bfd_vma) -2
4022 && ! GOT_TLS_GDESC_P (tls_type))
4023 abort ();
4024 if (r_type == ELF32_R_TYPE (rel->r_info))
4025 {
4026 if (r_type == R_X86_64_GOTPC32_TLSDESC
4027 || r_type == R_X86_64_TLSDESC_CALL)
4028 relocation = htab->elf.sgotplt->output_section->vma
4029 + htab->elf.sgotplt->output_offset
4030 + offplt + htab->sgotplt_jump_table_size;
4031 else
4032 relocation = htab->elf.sgot->output_section->vma
4033 + htab->elf.sgot->output_offset + off;
4034 unresolved_reloc = FALSE;
4035 }
4036 else
4037 {
4038 bfd_vma roff = rel->r_offset;
4039
4040 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
4041 {
4042 /* GD->IE transition. For 64bit, change
4043 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4044 .word 0x6666; rex64; call __tls_get_addr@plt
4045 into:
4046 movq %fs:0, %rax
4047 addq foo@gottpoff(%rip), %rax
4048 For 32bit, change
4049 leaq foo@tlsgd(%rip), %rdi
4050 .word 0x6666; rex64; call __tls_get_addr@plt
4051 into:
4052 movl %fs:0, %eax
4053 addq foo@gottpoff(%rip), %rax */
4054 if (ABI_64_P (output_bfd))
4055 memcpy (contents + roff - 4,
4056 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
4057 16);
4058 else
4059 memcpy (contents + roff - 3,
4060 "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
4061 15);
4062
4063 relocation = (htab->elf.sgot->output_section->vma
4064 + htab->elf.sgot->output_offset + off
4065 - roff
4066 - input_section->output_section->vma
4067 - input_section->output_offset
4068 - 12);
4069 bfd_put_32 (output_bfd, relocation,
4070 contents + roff + 8);
4071 /* Skip R_X86_64_PLT32. */
4072 rel++;
4073 continue;
4074 }
4075 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
4076 {
4077 /* GDesc -> IE transition.
4078 It's originally something like:
4079 leaq x@tlsdesc(%rip), %rax
4080
4081 Change it to:
4082 movq x@gottpoff(%rip), %rax # before xchg %ax,%ax. */
4083
4084 /* Now modify the instruction as appropriate. To
4085 turn a leaq into a movq in the form we use it, it
4086 suffices to change the second byte from 0x8d to
4087 0x8b. */
4088 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4089
4090 bfd_put_32 (output_bfd,
4091 htab->elf.sgot->output_section->vma
4092 + htab->elf.sgot->output_offset + off
4093 - rel->r_offset
4094 - input_section->output_section->vma
4095 - input_section->output_offset
4096 - 4,
4097 contents + roff);
4098 continue;
4099 }
4100 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
4101 {
4102 /* GDesc -> IE transition.
4103 It's originally:
4104 call *(%rax)
4105
4106 Change it to:
4107 xchg %ax, %ax. */
4108
4109 bfd_put_8 (output_bfd, 0x66, contents + roff);
4110 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4111 continue;
4112 }
4113 else
4114 BFD_ASSERT (FALSE);
4115 }
4116 break;
4117
4118 case R_X86_64_TLSLD:
4119 if (! elf_x86_64_tls_transition (info, input_bfd,
4120 input_section, contents,
4121 symtab_hdr, sym_hashes,
4122 &r_type, GOT_UNKNOWN,
4123 rel, relend, h, r_symndx))
4124 return FALSE;
4125
4126 if (r_type != R_X86_64_TLSLD)
4127 {
4128 /* LD->LE transition:
4129 leaq foo@tlsld(%rip), %rdi; call __tls_get_addr.
4130 For 64bit, we change it into:
4131 .word 0x6666; .byte 0x66; movq %fs:0, %rax.
4132 For 32bit, we change it into:
4133 nopl 0x0(%rax); movl %fs:0, %eax. */
4134
4135 BFD_ASSERT (r_type == R_X86_64_TPOFF32);
4136 if (ABI_64_P (output_bfd))
4137 memcpy (contents + rel->r_offset - 3,
4138 "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
4139 else
4140 memcpy (contents + rel->r_offset - 3,
4141 "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
4142 /* Skip R_X86_64_PC32/R_X86_64_PLT32. */
4143 rel++;
4144 continue;
4145 }
4146
4147 if (htab->elf.sgot == NULL)
4148 abort ();
4149
4150 off = htab->tls_ld_got.offset;
4151 if (off & 1)
4152 off &= ~1;
4153 else
4154 {
4155 Elf_Internal_Rela outrel;
4156
4157 if (htab->elf.srelgot == NULL)
4158 abort ();
4159
4160 outrel.r_offset = (htab->elf.sgot->output_section->vma
4161 + htab->elf.sgot->output_offset + off);
4162
4163 bfd_put_64 (output_bfd, 0,
4164 htab->elf.sgot->contents + off);
4165 bfd_put_64 (output_bfd, 0,
4166 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4167 outrel.r_info = htab->r_info (0, R_X86_64_DTPMOD64);
4168 outrel.r_addend = 0;
4169 elf_append_rela (output_bfd, htab->elf.srelgot,
4170 &outrel);
4171 htab->tls_ld_got.offset |= 1;
4172 }
4173 relocation = htab->elf.sgot->output_section->vma
4174 + htab->elf.sgot->output_offset + off;
4175 unresolved_reloc = FALSE;
4176 break;
4177
4178 case R_X86_64_DTPOFF32:
4179 if (!info->executable|| (input_section->flags & SEC_CODE) == 0)
4180 relocation -= elf_x86_64_dtpoff_base (info);
4181 else
4182 relocation = elf_x86_64_tpoff (info, relocation);
4183 break;
4184
4185 case R_X86_64_TPOFF32:
4186 case R_X86_64_TPOFF64:
4187 BFD_ASSERT (info->executable);
4188 relocation = elf_x86_64_tpoff (info, relocation);
4189 break;
4190
4191 default:
4192 break;
4193 }
4194
4195 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4196 because such sections are not SEC_ALLOC and thus ld.so will
4197 not process them. */
4198 if (unresolved_reloc
4199 && !((input_section->flags & SEC_DEBUGGING) != 0
4200 && h->def_dynamic)
4201 && _bfd_elf_section_offset (output_bfd, info, input_section,
4202 rel->r_offset) != (bfd_vma) -1)
4203 (*_bfd_error_handler)
4204 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
4205 input_bfd,
4206 input_section,
4207 (long) rel->r_offset,
4208 howto->name,
4209 h->root.root.string);
4210
4211 do_relocation:
4212 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4213 contents, rel->r_offset,
4214 relocation, rel->r_addend);
4215
4216 check_relocation_error:
4217 if (r != bfd_reloc_ok)
4218 {
4219 const char *name;
4220
4221 if (h != NULL)
4222 name = h->root.root.string;
4223 else
4224 {
4225 name = bfd_elf_string_from_elf_section (input_bfd,
4226 symtab_hdr->sh_link,
4227 sym->st_name);
4228 if (name == NULL)
4229 return FALSE;
4230 if (*name == '\0')
4231 name = bfd_section_name (input_bfd, sec);
4232 }
4233
4234 if (r == bfd_reloc_overflow)
4235 {
4236 if (! ((*info->callbacks->reloc_overflow)
4237 (info, (h ? &h->root : NULL), name, howto->name,
4238 (bfd_vma) 0, input_bfd, input_section,
4239 rel->r_offset)))
4240 return FALSE;
4241 }
4242 else
4243 {
4244 (*_bfd_error_handler)
4245 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
4246 input_bfd, input_section,
4247 (long) rel->r_offset, name, (int) r);
4248 return FALSE;
4249 }
4250 }
4251 }
4252
4253 return TRUE;
4254 }
4255
4256 /* Finish up dynamic symbol handling. We set the contents of various
4257 dynamic sections here. */
4258
4259 static bfd_boolean
4260 elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
4261 struct bfd_link_info *info,
4262 struct elf_link_hash_entry *h,
4263 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
4264 {
4265 struct elf_x86_64_link_hash_table *htab;
4266 const struct elf_x86_64_backend_data *const abed
4267 = get_elf_x86_64_backend_data (output_bfd);
4268
4269 htab = elf_x86_64_hash_table (info);
4270 if (htab == NULL)
4271 return FALSE;
4272
4273 if (h->plt.offset != (bfd_vma) -1)
4274 {
4275 bfd_vma plt_index;
4276 bfd_vma got_offset;
4277 Elf_Internal_Rela rela;
4278 bfd_byte *loc;
4279 asection *plt, *gotplt, *relplt;
4280 const struct elf_backend_data *bed;
4281
4282 /* When building a static executable, use .iplt, .igot.plt and
4283 .rela.iplt sections for STT_GNU_IFUNC symbols. */
4284 if (htab->elf.splt != NULL)
4285 {
4286 plt = htab->elf.splt;
4287 gotplt = htab->elf.sgotplt;
4288 relplt = htab->elf.srelplt;
4289 }
4290 else
4291 {
4292 plt = htab->elf.iplt;
4293 gotplt = htab->elf.igotplt;
4294 relplt = htab->elf.irelplt;
4295 }
4296
4297 /* This symbol has an entry in the procedure linkage table. Set
4298 it up. */
4299 if ((h->dynindx == -1
4300 && !((h->forced_local || info->executable)
4301 && h->def_regular
4302 && h->type == STT_GNU_IFUNC))
4303 || plt == NULL
4304 || gotplt == NULL
4305 || relplt == NULL)
4306 return FALSE;
4307
4308 /* Get the index in the procedure linkage table which
4309 corresponds to this symbol. This is the index of this symbol
4310 in all the symbols for which we are making plt entries. The
4311 first entry in the procedure linkage table is reserved.
4312
4313 Get the offset into the .got table of the entry that
4314 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
4315 bytes. The first three are reserved for the dynamic linker.
4316
4317 For static executables, we don't reserve anything. */
4318
4319 if (plt == htab->elf.splt)
4320 {
4321 got_offset = h->plt.offset / abed->plt_entry_size - 1;
4322 got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
4323 }
4324 else
4325 {
4326 got_offset = h->plt.offset / abed->plt_entry_size;
4327 got_offset = got_offset * GOT_ENTRY_SIZE;
4328 }
4329
4330 /* Fill in the entry in the procedure linkage table. */
4331 memcpy (plt->contents + h->plt.offset, abed->plt_entry,
4332 abed->plt_entry_size);
4333
4334 /* Insert the relocation positions of the plt section. */
4335
4336 /* Put offset the PC-relative instruction referring to the GOT entry,
4337 subtracting the size of that instruction. */
4338 bfd_put_32 (output_bfd,
4339 (gotplt->output_section->vma
4340 + gotplt->output_offset
4341 + got_offset
4342 - plt->output_section->vma
4343 - plt->output_offset
4344 - h->plt.offset
4345 - abed->plt_got_insn_size),
4346 plt->contents + h->plt.offset + abed->plt_got_offset);
4347
4348 /* Fill in the entry in the global offset table, initially this
4349 points to the second part of the PLT entry. */
4350 bfd_put_64 (output_bfd, (plt->output_section->vma
4351 + plt->output_offset
4352 + h->plt.offset + abed->plt_lazy_offset),
4353 gotplt->contents + got_offset);
4354
4355 /* Fill in the entry in the .rela.plt section. */
4356 rela.r_offset = (gotplt->output_section->vma
4357 + gotplt->output_offset
4358 + got_offset);
4359 if (h->dynindx == -1
4360 || ((info->executable
4361 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4362 && h->def_regular
4363 && h->type == STT_GNU_IFUNC))
4364 {
4365 /* If an STT_GNU_IFUNC symbol is locally defined, generate
4366 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT. */
4367 rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
4368 rela.r_addend = (h->root.u.def.value
4369 + h->root.u.def.section->output_section->vma
4370 + h->root.u.def.section->output_offset);
4371 /* R_X86_64_IRELATIVE comes last. */
4372 plt_index = htab->next_irelative_index--;
4373 }
4374 else
4375 {
4376 rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
4377 rela.r_addend = 0;
4378 plt_index = htab->next_jump_slot_index++;
4379 }
4380
4381 /* Don't fill PLT entry for static executables. */
4382 if (plt == htab->elf.splt)
4383 {
4384 /* Put relocation index. */
4385 bfd_put_32 (output_bfd, plt_index,
4386 plt->contents + h->plt.offset + abed->plt_reloc_offset);
4387 /* Put offset for jmp .PLT0. */
4388 bfd_put_32 (output_bfd, - (h->plt.offset + abed->plt_plt_insn_end),
4389 plt->contents + h->plt.offset + abed->plt_plt_offset);
4390 }
4391
4392 bed = get_elf_backend_data (output_bfd);
4393 loc = relplt->contents + plt_index * bed->s->sizeof_rela;
4394 bed->s->swap_reloca_out (output_bfd, &rela, loc);
4395
4396 if (!h->def_regular)
4397 {
4398 /* Mark the symbol as undefined, rather than as defined in
4399 the .plt section. Leave the value if there were any
4400 relocations where pointer equality matters (this is a clue
4401 for the dynamic linker, to make function pointer
4402 comparisons work between an application and shared
4403 library), otherwise set it to zero. If a function is only
4404 called from a binary, there is no need to slow down
4405 shared libraries because of that. */
4406 sym->st_shndx = SHN_UNDEF;
4407 if (!h->pointer_equality_needed)
4408 sym->st_value = 0;
4409 }
4410 }
4411
4412 if (h->got.offset != (bfd_vma) -1
4413 && ! GOT_TLS_GD_ANY_P (elf_x86_64_hash_entry (h)->tls_type)
4414 && elf_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE)
4415 {
4416 Elf_Internal_Rela rela;
4417
4418 /* This symbol has an entry in the global offset table. Set it
4419 up. */
4420 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
4421 abort ();
4422
4423 rela.r_offset = (htab->elf.sgot->output_section->vma
4424 + htab->elf.sgot->output_offset
4425 + (h->got.offset &~ (bfd_vma) 1));
4426
4427 /* If this is a static link, or it is a -Bsymbolic link and the
4428 symbol is defined locally or was forced to be local because
4429 of a version file, we just want to emit a RELATIVE reloc.
4430 The entry in the global offset table will already have been
4431 initialized in the relocate_section function. */
4432 if (h->def_regular
4433 && h->type == STT_GNU_IFUNC)
4434 {
4435 if (info->shared)
4436 {
4437 /* Generate R_X86_64_GLOB_DAT. */
4438 goto do_glob_dat;
4439 }
4440 else
4441 {
4442 asection *plt;
4443
4444 if (!h->pointer_equality_needed)
4445 abort ();
4446
4447 /* For non-shared object, we can't use .got.plt, which
4448 contains the real function addres if we need pointer
4449 equality. We load the GOT entry with the PLT entry. */
4450 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4451 bfd_put_64 (output_bfd, (plt->output_section->vma
4452 + plt->output_offset
4453 + h->plt.offset),
4454 htab->elf.sgot->contents + h->got.offset);
4455 return TRUE;
4456 }
4457 }
4458 else if (info->shared
4459 && SYMBOL_REFERENCES_LOCAL (info, h))
4460 {
4461 if (!h->def_regular)
4462 return FALSE;
4463 BFD_ASSERT((h->got.offset & 1) != 0);
4464 rela.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4465 rela.r_addend = (h->root.u.def.value
4466 + h->root.u.def.section->output_section->vma
4467 + h->root.u.def.section->output_offset);
4468 }
4469 else
4470 {
4471 BFD_ASSERT((h->got.offset & 1) == 0);
4472 do_glob_dat:
4473 bfd_put_64 (output_bfd, (bfd_vma) 0,
4474 htab->elf.sgot->contents + h->got.offset);
4475 rela.r_info = htab->r_info (h->dynindx, R_X86_64_GLOB_DAT);
4476 rela.r_addend = 0;
4477 }
4478
4479 elf_append_rela (output_bfd, htab->elf.srelgot, &rela);
4480 }
4481
4482 if (h->needs_copy)
4483 {
4484 Elf_Internal_Rela rela;
4485
4486 /* This symbol needs a copy reloc. Set it up. */
4487
4488 if (h->dynindx == -1
4489 || (h->root.type != bfd_link_hash_defined
4490 && h->root.type != bfd_link_hash_defweak)
4491 || htab->srelbss == NULL)
4492 abort ();
4493
4494 rela.r_offset = (h->root.u.def.value
4495 + h->root.u.def.section->output_section->vma
4496 + h->root.u.def.section->output_offset);
4497 rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY);
4498 rela.r_addend = 0;
4499 elf_append_rela (output_bfd, htab->srelbss, &rela);
4500 }
4501
4502 return TRUE;
4503 }
4504
4505 /* Finish up local dynamic symbol handling. We set the contents of
4506 various dynamic sections here. */
4507
4508 static bfd_boolean
4509 elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
4510 {
4511 struct elf_link_hash_entry *h
4512 = (struct elf_link_hash_entry *) *slot;
4513 struct bfd_link_info *info
4514 = (struct bfd_link_info *) inf;
4515
4516 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
4517 info, h, NULL);
4518 }
4519
4520 /* Used to decide how to sort relocs in an optimal manner for the
4521 dynamic linker, before writing them out. */
4522
4523 static enum elf_reloc_type_class
4524 elf_x86_64_reloc_type_class (const Elf_Internal_Rela *rela)
4525 {
4526 switch ((int) ELF32_R_TYPE (rela->r_info))
4527 {
4528 case R_X86_64_RELATIVE:
4529 case R_X86_64_RELATIVE64:
4530 return reloc_class_relative;
4531 case R_X86_64_JUMP_SLOT:
4532 return reloc_class_plt;
4533 case R_X86_64_COPY:
4534 return reloc_class_copy;
4535 default:
4536 return reloc_class_normal;
4537 }
4538 }
4539
4540 /* Finish up the dynamic sections. */
4541
4542 static bfd_boolean
4543 elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
4544 struct bfd_link_info *info)
4545 {
4546 struct elf_x86_64_link_hash_table *htab;
4547 bfd *dynobj;
4548 asection *sdyn;
4549 const struct elf_x86_64_backend_data *const abed
4550 = get_elf_x86_64_backend_data (output_bfd);
4551
4552 htab = elf_x86_64_hash_table (info);
4553 if (htab == NULL)
4554 return FALSE;
4555
4556 dynobj = htab->elf.dynobj;
4557 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4558
4559 if (htab->elf.dynamic_sections_created)
4560 {
4561 bfd_byte *dyncon, *dynconend;
4562 const struct elf_backend_data *bed;
4563 bfd_size_type sizeof_dyn;
4564
4565 if (sdyn == NULL || htab->elf.sgot == NULL)
4566 abort ();
4567
4568 bed = get_elf_backend_data (dynobj);
4569 sizeof_dyn = bed->s->sizeof_dyn;
4570 dyncon = sdyn->contents;
4571 dynconend = sdyn->contents + sdyn->size;
4572 for (; dyncon < dynconend; dyncon += sizeof_dyn)
4573 {
4574 Elf_Internal_Dyn dyn;
4575 asection *s;
4576
4577 (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
4578
4579 switch (dyn.d_tag)
4580 {
4581 default:
4582 continue;
4583
4584 case DT_PLTGOT:
4585 s = htab->elf.sgotplt;
4586 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4587 break;
4588
4589 case DT_JMPREL:
4590 dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
4591 break;
4592
4593 case DT_PLTRELSZ:
4594 s = htab->elf.srelplt->output_section;
4595 dyn.d_un.d_val = s->size;
4596 break;
4597
4598 case DT_RELASZ:
4599 /* The procedure linkage table relocs (DT_JMPREL) should
4600 not be included in the overall relocs (DT_RELA).
4601 Therefore, we override the DT_RELASZ entry here to
4602 make it not include the JMPREL relocs. Since the
4603 linker script arranges for .rela.plt to follow all
4604 other relocation sections, we don't have to worry
4605 about changing the DT_RELA entry. */
4606 if (htab->elf.srelplt != NULL)
4607 {
4608 s = htab->elf.srelplt->output_section;
4609 dyn.d_un.d_val -= s->size;
4610 }
4611 break;
4612
4613 case DT_TLSDESC_PLT:
4614 s = htab->elf.splt;
4615 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
4616 + htab->tlsdesc_plt;
4617 break;
4618
4619 case DT_TLSDESC_GOT:
4620 s = htab->elf.sgot;
4621 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
4622 + htab->tlsdesc_got;
4623 break;
4624 }
4625
4626 (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
4627 }
4628
4629 /* Fill in the special first entry in the procedure linkage table. */
4630 if (htab->elf.splt && htab->elf.splt->size > 0)
4631 {
4632 /* Fill in the first entry in the procedure linkage table. */
4633 memcpy (htab->elf.splt->contents,
4634 abed->plt0_entry, abed->plt_entry_size);
4635 /* Add offset for pushq GOT+8(%rip), since the instruction
4636 uses 6 bytes subtract this value. */
4637 bfd_put_32 (output_bfd,
4638 (htab->elf.sgotplt->output_section->vma
4639 + htab->elf.sgotplt->output_offset
4640 + 8
4641 - htab->elf.splt->output_section->vma
4642 - htab->elf.splt->output_offset
4643 - 6),
4644 htab->elf.splt->contents + abed->plt0_got1_offset);
4645 /* Add offset for the PC-relative instruction accessing GOT+16,
4646 subtracting the offset to the end of that instruction. */
4647 bfd_put_32 (output_bfd,
4648 (htab->elf.sgotplt->output_section->vma
4649 + htab->elf.sgotplt->output_offset
4650 + 16
4651 - htab->elf.splt->output_section->vma
4652 - htab->elf.splt->output_offset
4653 - abed->plt0_got2_insn_end),
4654 htab->elf.splt->contents + abed->plt0_got2_offset);
4655
4656 elf_section_data (htab->elf.splt->output_section)
4657 ->this_hdr.sh_entsize = abed->plt_entry_size;
4658
4659 if (htab->tlsdesc_plt)
4660 {
4661 bfd_put_64 (output_bfd, (bfd_vma) 0,
4662 htab->elf.sgot->contents + htab->tlsdesc_got);
4663
4664 memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
4665 abed->plt0_entry, abed->plt_entry_size);
4666
4667 /* Add offset for pushq GOT+8(%rip), since the
4668 instruction uses 6 bytes subtract this value. */
4669 bfd_put_32 (output_bfd,
4670 (htab->elf.sgotplt->output_section->vma
4671 + htab->elf.sgotplt->output_offset
4672 + 8
4673 - htab->elf.splt->output_section->vma
4674 - htab->elf.splt->output_offset
4675 - htab->tlsdesc_plt
4676 - 6),
4677 htab->elf.splt->contents
4678 + htab->tlsdesc_plt + abed->plt0_got1_offset);
4679 /* Add offset for the PC-relative instruction accessing GOT+TDG,
4680 where TGD stands for htab->tlsdesc_got, subtracting the offset
4681 to the end of that instruction. */
4682 bfd_put_32 (output_bfd,
4683 (htab->elf.sgot->output_section->vma
4684 + htab->elf.sgot->output_offset
4685 + htab->tlsdesc_got
4686 - htab->elf.splt->output_section->vma
4687 - htab->elf.splt->output_offset
4688 - htab->tlsdesc_plt
4689 - abed->plt0_got2_insn_end),
4690 htab->elf.splt->contents
4691 + htab->tlsdesc_plt + abed->plt0_got2_offset);
4692 }
4693 }
4694 }
4695
4696 if (htab->elf.sgotplt)
4697 {
4698 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
4699 {
4700 (*_bfd_error_handler)
4701 (_("discarded output section: `%A'"), htab->elf.sgotplt);
4702 return FALSE;
4703 }
4704
4705 /* Fill in the first three entries in the global offset table. */
4706 if (htab->elf.sgotplt->size > 0)
4707 {
4708 /* Set the first entry in the global offset table to the address of
4709 the dynamic section. */
4710 if (sdyn == NULL)
4711 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents);
4712 else
4713 bfd_put_64 (output_bfd,
4714 sdyn->output_section->vma + sdyn->output_offset,
4715 htab->elf.sgotplt->contents);
4716 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
4717 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
4718 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE*2);
4719 }
4720
4721 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize =
4722 GOT_ENTRY_SIZE;
4723 }
4724
4725 /* Adjust .eh_frame for .plt section. */
4726 if (htab->plt_eh_frame != NULL)
4727 {
4728 if (htab->elf.splt != NULL
4729 && htab->elf.splt->size != 0
4730 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
4731 && htab->elf.splt->output_section != NULL
4732 && htab->plt_eh_frame->output_section != NULL)
4733 {
4734 bfd_vma plt_start = htab->elf.splt->output_section->vma;
4735 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
4736 + htab->plt_eh_frame->output_offset
4737 + PLT_FDE_START_OFFSET;
4738 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
4739 htab->plt_eh_frame->contents
4740 + PLT_FDE_START_OFFSET);
4741 }
4742 if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
4743 {
4744 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
4745 htab->plt_eh_frame,
4746 htab->plt_eh_frame->contents))
4747 return FALSE;
4748 }
4749 }
4750
4751 if (htab->elf.sgot && htab->elf.sgot->size > 0)
4752 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
4753 = GOT_ENTRY_SIZE;
4754
4755 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
4756 htab_traverse (htab->loc_hash_table,
4757 elf_x86_64_finish_local_dynamic_symbol,
4758 info);
4759
4760 return TRUE;
4761 }
4762
4763 /* Return address for Ith PLT stub in section PLT, for relocation REL
4764 or (bfd_vma) -1 if it should not be included. */
4765
4766 static bfd_vma
4767 elf_x86_64_plt_sym_val (bfd_vma i, const asection *plt,
4768 const arelent *rel ATTRIBUTE_UNUSED)
4769 {
4770 return plt->vma + (i + 1) * GET_PLT_ENTRY_SIZE (plt->owner);
4771 }
4772
4773 /* Handle an x86-64 specific section when reading an object file. This
4774 is called when elfcode.h finds a section with an unknown type. */
4775
4776 static bfd_boolean
4777 elf_x86_64_section_from_shdr (bfd *abfd,
4778 Elf_Internal_Shdr *hdr,
4779 const char *name,
4780 int shindex)
4781 {
4782 if (hdr->sh_type != SHT_X86_64_UNWIND)
4783 return FALSE;
4784
4785 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
4786 return FALSE;
4787
4788 return TRUE;
4789 }
4790
4791 /* Hook called by the linker routine which adds symbols from an object
4792 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
4793 of .bss. */
4794
4795 static bfd_boolean
4796 elf_x86_64_add_symbol_hook (bfd *abfd,
4797 struct bfd_link_info *info,
4798 Elf_Internal_Sym *sym,
4799 const char **namep ATTRIBUTE_UNUSED,
4800 flagword *flagsp ATTRIBUTE_UNUSED,
4801 asection **secp,
4802 bfd_vma *valp)
4803 {
4804 asection *lcomm;
4805
4806 switch (sym->st_shndx)
4807 {
4808 case SHN_X86_64_LCOMMON:
4809 lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
4810 if (lcomm == NULL)
4811 {
4812 lcomm = bfd_make_section_with_flags (abfd,
4813 "LARGE_COMMON",
4814 (SEC_ALLOC
4815 | SEC_IS_COMMON
4816 | SEC_LINKER_CREATED));
4817 if (lcomm == NULL)
4818 return FALSE;
4819 elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
4820 }
4821 *secp = lcomm;
4822 *valp = sym->st_size;
4823 return TRUE;
4824 }
4825
4826 if ((abfd->flags & DYNAMIC) == 0
4827 && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
4828 || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
4829 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4830
4831 return TRUE;
4832 }
4833
4834
4835 /* Given a BFD section, try to locate the corresponding ELF section
4836 index. */
4837
4838 static bfd_boolean
4839 elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
4840 asection *sec, int *index_return)
4841 {
4842 if (sec == &_bfd_elf_large_com_section)
4843 {
4844 *index_return = SHN_X86_64_LCOMMON;
4845 return TRUE;
4846 }
4847 return FALSE;
4848 }
4849
4850 /* Process a symbol. */
4851
4852 static void
4853 elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
4854 asymbol *asym)
4855 {
4856 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
4857
4858 switch (elfsym->internal_elf_sym.st_shndx)
4859 {
4860 case SHN_X86_64_LCOMMON:
4861 asym->section = &_bfd_elf_large_com_section;
4862 asym->value = elfsym->internal_elf_sym.st_size;
4863 /* Common symbol doesn't set BSF_GLOBAL. */
4864 asym->flags &= ~BSF_GLOBAL;
4865 break;
4866 }
4867 }
4868
4869 static bfd_boolean
4870 elf_x86_64_common_definition (Elf_Internal_Sym *sym)
4871 {
4872 return (sym->st_shndx == SHN_COMMON
4873 || sym->st_shndx == SHN_X86_64_LCOMMON);
4874 }
4875
4876 static unsigned int
4877 elf_x86_64_common_section_index (asection *sec)
4878 {
4879 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
4880 return SHN_COMMON;
4881 else
4882 return SHN_X86_64_LCOMMON;
4883 }
4884
4885 static asection *
4886 elf_x86_64_common_section (asection *sec)
4887 {
4888 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
4889 return bfd_com_section_ptr;
4890 else
4891 return &_bfd_elf_large_com_section;
4892 }
4893
4894 static bfd_boolean
4895 elf_x86_64_merge_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
4896 struct elf_link_hash_entry **sym_hash ATTRIBUTE_UNUSED,
4897 struct elf_link_hash_entry *h,
4898 Elf_Internal_Sym *sym,
4899 asection **psec,
4900 bfd_vma *pvalue ATTRIBUTE_UNUSED,
4901 unsigned int *pold_alignment ATTRIBUTE_UNUSED,
4902 bfd_boolean *skip ATTRIBUTE_UNUSED,
4903 bfd_boolean *override ATTRIBUTE_UNUSED,
4904 bfd_boolean *type_change_ok ATTRIBUTE_UNUSED,
4905 bfd_boolean *size_change_ok ATTRIBUTE_UNUSED,
4906 bfd_boolean *newdyn ATTRIBUTE_UNUSED,
4907 bfd_boolean *newdef,
4908 bfd_boolean *newdyncommon ATTRIBUTE_UNUSED,
4909 bfd_boolean *newweak ATTRIBUTE_UNUSED,
4910 bfd *abfd ATTRIBUTE_UNUSED,
4911 asection **sec,
4912 bfd_boolean *olddyn ATTRIBUTE_UNUSED,
4913 bfd_boolean *olddef,
4914 bfd_boolean *olddyncommon ATTRIBUTE_UNUSED,
4915 bfd_boolean *oldweak ATTRIBUTE_UNUSED,
4916 bfd *oldbfd,
4917 asection **oldsec)
4918 {
4919 /* A normal common symbol and a large common symbol result in a
4920 normal common symbol. We turn the large common symbol into a
4921 normal one. */
4922 if (!*olddef
4923 && h->root.type == bfd_link_hash_common
4924 && !*newdef
4925 && bfd_is_com_section (*sec)
4926 && *oldsec != *sec)
4927 {
4928 if (sym->st_shndx == SHN_COMMON
4929 && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) != 0)
4930 {
4931 h->root.u.c.p->section
4932 = bfd_make_section_old_way (oldbfd, "COMMON");
4933 h->root.u.c.p->section->flags = SEC_ALLOC;
4934 }
4935 else if (sym->st_shndx == SHN_X86_64_LCOMMON
4936 && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) == 0)
4937 *psec = *sec = bfd_com_section_ptr;
4938 }
4939
4940 return TRUE;
4941 }
4942
4943 static int
4944 elf_x86_64_additional_program_headers (bfd *abfd,
4945 struct bfd_link_info *info ATTRIBUTE_UNUSED)
4946 {
4947 asection *s;
4948 int count = 0;
4949
4950 /* Check to see if we need a large readonly segment. */
4951 s = bfd_get_section_by_name (abfd, ".lrodata");
4952 if (s && (s->flags & SEC_LOAD))
4953 count++;
4954
4955 /* Check to see if we need a large data segment. Since .lbss sections
4956 is placed right after the .bss section, there should be no need for
4957 a large data segment just because of .lbss. */
4958 s = bfd_get_section_by_name (abfd, ".ldata");
4959 if (s && (s->flags & SEC_LOAD))
4960 count++;
4961
4962 return count;
4963 }
4964
4965 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
4966
4967 static bfd_boolean
4968 elf_x86_64_hash_symbol (struct elf_link_hash_entry *h)
4969 {
4970 if (h->plt.offset != (bfd_vma) -1
4971 && !h->def_regular
4972 && !h->pointer_equality_needed)
4973 return FALSE;
4974
4975 return _bfd_elf_hash_symbol (h);
4976 }
4977
4978 /* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
4979
4980 static bfd_boolean
4981 elf_x86_64_relocs_compatible (const bfd_target *input,
4982 const bfd_target *output)
4983 {
4984 return ((xvec_get_elf_backend_data (input)->s->elfclass
4985 == xvec_get_elf_backend_data (output)->s->elfclass)
4986 && _bfd_elf_relocs_compatible (input, output));
4987 }
4988
4989 static const struct bfd_elf_special_section
4990 elf_x86_64_special_sections[]=
4991 {
4992 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
4993 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
4994 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
4995 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
4996 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
4997 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
4998 { NULL, 0, 0, 0, 0 }
4999 };
5000
5001 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_vec
5002 #define TARGET_LITTLE_NAME "elf64-x86-64"
5003 #define ELF_ARCH bfd_arch_i386
5004 #define ELF_TARGET_ID X86_64_ELF_DATA
5005 #define ELF_MACHINE_CODE EM_X86_64
5006 #define ELF_MAXPAGESIZE 0x200000
5007 #define ELF_MINPAGESIZE 0x1000
5008 #define ELF_COMMONPAGESIZE 0x1000
5009
5010 #define elf_backend_can_gc_sections 1
5011 #define elf_backend_can_refcount 1
5012 #define elf_backend_want_got_plt 1
5013 #define elf_backend_plt_readonly 1
5014 #define elf_backend_want_plt_sym 0
5015 #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
5016 #define elf_backend_rela_normal 1
5017 #define elf_backend_plt_alignment 4
5018
5019 #define elf_info_to_howto elf_x86_64_info_to_howto
5020
5021 #define bfd_elf64_bfd_link_hash_table_create \
5022 elf_x86_64_link_hash_table_create
5023 #define bfd_elf64_bfd_link_hash_table_free \
5024 elf_x86_64_link_hash_table_free
5025 #define bfd_elf64_bfd_reloc_type_lookup elf_x86_64_reloc_type_lookup
5026 #define bfd_elf64_bfd_reloc_name_lookup \
5027 elf_x86_64_reloc_name_lookup
5028
5029 #define elf_backend_adjust_dynamic_symbol elf_x86_64_adjust_dynamic_symbol
5030 #define elf_backend_relocs_compatible elf_x86_64_relocs_compatible
5031 #define elf_backend_check_relocs elf_x86_64_check_relocs
5032 #define elf_backend_copy_indirect_symbol elf_x86_64_copy_indirect_symbol
5033 #define elf_backend_create_dynamic_sections elf_x86_64_create_dynamic_sections
5034 #define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
5035 #define elf_backend_finish_dynamic_symbol elf_x86_64_finish_dynamic_symbol
5036 #define elf_backend_gc_mark_hook elf_x86_64_gc_mark_hook
5037 #define elf_backend_gc_sweep_hook elf_x86_64_gc_sweep_hook
5038 #define elf_backend_grok_prstatus elf_x86_64_grok_prstatus
5039 #define elf_backend_grok_psinfo elf_x86_64_grok_psinfo
5040 #ifdef CORE_HEADER
5041 #define elf_backend_write_core_note elf_x86_64_write_core_note
5042 #endif
5043 #define elf_backend_reloc_type_class elf_x86_64_reloc_type_class
5044 #define elf_backend_relocate_section elf_x86_64_relocate_section
5045 #define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections
5046 #define elf_backend_always_size_sections elf_x86_64_always_size_sections
5047 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
5048 #define elf_backend_plt_sym_val elf_x86_64_plt_sym_val
5049 #define elf_backend_object_p elf64_x86_64_elf_object_p
5050 #define bfd_elf64_mkobject elf_x86_64_mkobject
5051
5052 #define elf_backend_section_from_shdr \
5053 elf_x86_64_section_from_shdr
5054
5055 #define elf_backend_section_from_bfd_section \
5056 elf_x86_64_elf_section_from_bfd_section
5057 #define elf_backend_add_symbol_hook \
5058 elf_x86_64_add_symbol_hook
5059 #define elf_backend_symbol_processing \
5060 elf_x86_64_symbol_processing
5061 #define elf_backend_common_section_index \
5062 elf_x86_64_common_section_index
5063 #define elf_backend_common_section \
5064 elf_x86_64_common_section
5065 #define elf_backend_common_definition \
5066 elf_x86_64_common_definition
5067 #define elf_backend_merge_symbol \
5068 elf_x86_64_merge_symbol
5069 #define elf_backend_special_sections \
5070 elf_x86_64_special_sections
5071 #define elf_backend_additional_program_headers \
5072 elf_x86_64_additional_program_headers
5073 #define elf_backend_hash_symbol \
5074 elf_x86_64_hash_symbol
5075
5076 #define elf_backend_post_process_headers _bfd_elf_set_osabi
5077
5078 #include "elf64-target.h"
5079
5080 /* FreeBSD support. */
5081
5082 #undef TARGET_LITTLE_SYM
5083 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_freebsd_vec
5084 #undef TARGET_LITTLE_NAME
5085 #define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
5086
5087 #undef ELF_OSABI
5088 #define ELF_OSABI ELFOSABI_FREEBSD
5089
5090 #undef elf64_bed
5091 #define elf64_bed elf64_x86_64_fbsd_bed
5092
5093 #include "elf64-target.h"
5094
5095 /* Solaris 2 support. */
5096
5097 #undef TARGET_LITTLE_SYM
5098 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_sol2_vec
5099 #undef TARGET_LITTLE_NAME
5100 #define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
5101
5102 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
5103 objects won't be recognized. */
5104 #undef ELF_OSABI
5105
5106 #undef elf64_bed
5107 #define elf64_bed elf64_x86_64_sol2_bed
5108
5109 /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
5110 boundary. */
5111 #undef elf_backend_static_tls_alignment
5112 #define elf_backend_static_tls_alignment 16
5113
5114 /* The Solaris 2 ABI requires a plt symbol on all platforms.
5115
5116 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
5117 File, p.63. */
5118 #undef elf_backend_want_plt_sym
5119 #define elf_backend_want_plt_sym 1
5120
5121 #include "elf64-target.h"
5122
5123 /* Native Client support. */
5124
5125 #undef TARGET_LITTLE_SYM
5126 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_nacl_vec
5127 #undef TARGET_LITTLE_NAME
5128 #define TARGET_LITTLE_NAME "elf64-x86-64-nacl"
5129 #undef elf64_bed
5130 #define elf64_bed elf64_x86_64_nacl_bed
5131
5132 #undef ELF_MAXPAGESIZE
5133 #undef ELF_MINPAGESIZE
5134 #undef ELF_COMMONPAGESIZE
5135 #define ELF_MAXPAGESIZE 0x10000
5136 #define ELF_MINPAGESIZE 0x10000
5137 #define ELF_COMMONPAGESIZE 0x10000
5138
5139 /* Restore defaults. */
5140 #undef ELF_OSABI
5141 #undef elf_backend_static_tls_alignment
5142 #undef elf_backend_want_plt_sym
5143 #define elf_backend_want_plt_sym 0
5144
5145 /* NaCl uses substantially different PLT entries for the same effects. */
5146
5147 #undef elf_backend_plt_alignment
5148 #define elf_backend_plt_alignment 5
5149 #define NACL_PLT_ENTRY_SIZE 64
5150 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
5151
5152 static const bfd_byte elf_x86_64_nacl_plt0_entry[NACL_PLT_ENTRY_SIZE] =
5153 {
5154 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
5155 0x4c, 0x8b, 0x1d, 16, 0, 0, 0, /* mov GOT+16(%rip), %r11 */
5156 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
5157 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
5158 0x41, 0xff, 0xe3, /* jmpq *%r11 */
5159
5160 /* 9-byte nop sequence to pad out to the next 32-byte boundary. */
5161 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopl %cs:0x0(%rax,%rax,1) */
5162
5163 /* 32 bytes of nop to pad out to the standard size. */
5164 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5165 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5166 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5167 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5168 0x66, /* excess data32 prefix */
5169 0x90 /* nop */
5170 };
5171
5172 static const bfd_byte elf_x86_64_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
5173 {
5174 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, /* mov name@GOTPCREL(%rip),%r11 */
5175 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
5176 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
5177 0x41, 0xff, 0xe3, /* jmpq *%r11 */
5178
5179 /* 15-byte nop sequence to pad out to the next 32-byte boundary. */
5180 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5181 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5182
5183 /* Lazy GOT entries point here (32-byte aligned). */
5184 0x68, /* pushq immediate */
5185 0, 0, 0, 0, /* replaced with index into relocation table. */
5186 0xe9, /* jmp relative */
5187 0, 0, 0, 0, /* replaced with offset to start of .plt0. */
5188
5189 /* 22 bytes of nop to pad out to the standard size. */
5190 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5191 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5192 0x0f, 0x1f, 0x80, 0, 0, 0, 0, /* nopl 0x0(%rax) */
5193 };
5194
5195 /* .eh_frame covering the .plt section. */
5196
5197 static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] =
5198 {
5199 #if (PLT_CIE_LENGTH != 20 \
5200 || PLT_FDE_LENGTH != 36 \
5201 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
5202 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
5203 # error "Need elf_x86_64_backend_data parameters for eh_frame_plt offsets!"
5204 #endif
5205 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
5206 0, 0, 0, 0, /* CIE ID */
5207 1, /* CIE version */
5208 'z', 'R', 0, /* Augmentation string */
5209 1, /* Code alignment factor */
5210 0x78, /* Data alignment factor */
5211 16, /* Return address column */
5212 1, /* Augmentation size */
5213 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
5214 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
5215 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
5216 DW_CFA_nop, DW_CFA_nop,
5217
5218 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
5219 PLT_CIE_LENGTH + 8, 0, 0, 0,/* CIE pointer */
5220 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
5221 0, 0, 0, 0, /* .plt size goes here */
5222 0, /* Augmentation size */
5223 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
5224 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
5225 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
5226 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
5227 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
5228 13, /* Block length */
5229 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
5230 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
5231 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
5232 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
5233 DW_CFA_nop, DW_CFA_nop
5234 };
5235
5236 static const struct elf_x86_64_backend_data elf_x86_64_nacl_arch_bed =
5237 {
5238 elf_x86_64_nacl_plt0_entry, /* plt0_entry */
5239 elf_x86_64_nacl_plt_entry, /* plt_entry */
5240 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
5241 2, /* plt0_got1_offset */
5242 9, /* plt0_got2_offset */
5243 13, /* plt0_got2_insn_end */
5244 3, /* plt_got_offset */
5245 33, /* plt_reloc_offset */
5246 38, /* plt_plt_offset */
5247 7, /* plt_got_insn_size */
5248 42, /* plt_plt_insn_end */
5249 32, /* plt_lazy_offset */
5250 elf_x86_64_nacl_eh_frame_plt, /* eh_frame_plt */
5251 sizeof (elf_x86_64_nacl_eh_frame_plt), /* eh_frame_plt_size */
5252 };
5253
5254 #undef elf_backend_arch_data
5255 #define elf_backend_arch_data &elf_x86_64_nacl_arch_bed
5256
5257 #undef elf_backend_modify_segment_map
5258 #define elf_backend_modify_segment_map nacl_modify_segment_map
5259 #undef elf_backend_modify_program_headers
5260 #define elf_backend_modify_program_headers nacl_modify_program_headers
5261
5262 #include "elf64-target.h"
5263
5264 /* Native Client x32 support. */
5265
5266 #undef TARGET_LITTLE_SYM
5267 #define TARGET_LITTLE_SYM bfd_elf32_x86_64_nacl_vec
5268 #undef TARGET_LITTLE_NAME
5269 #define TARGET_LITTLE_NAME "elf32-x86-64-nacl"
5270 #undef elf32_bed
5271 #define elf32_bed elf32_x86_64_nacl_bed
5272
5273 #define bfd_elf32_bfd_link_hash_table_create \
5274 elf_x86_64_link_hash_table_create
5275 #define bfd_elf32_bfd_link_hash_table_free \
5276 elf_x86_64_link_hash_table_free
5277 #define bfd_elf32_bfd_reloc_type_lookup \
5278 elf_x86_64_reloc_type_lookup
5279 #define bfd_elf32_bfd_reloc_name_lookup \
5280 elf_x86_64_reloc_name_lookup
5281 #define bfd_elf32_mkobject \
5282 elf_x86_64_mkobject
5283
5284 #undef elf_backend_object_p
5285 #define elf_backend_object_p \
5286 elf32_x86_64_elf_object_p
5287
5288 #undef elf_backend_bfd_from_remote_memory
5289 #define elf_backend_bfd_from_remote_memory \
5290 _bfd_elf32_bfd_from_remote_memory
5291
5292 #undef elf_backend_size_info
5293 #define elf_backend_size_info \
5294 _bfd_elf32_size_info
5295
5296 #include "elf32-target.h"
5297
5298 /* Restore defaults. */
5299 #undef elf_backend_object_p
5300 #define elf_backend_object_p elf64_x86_64_elf_object_p
5301 #undef elf_backend_bfd_from_remote_memory
5302 #undef elf_backend_size_info
5303 #undef elf_backend_modify_segment_map
5304 #undef elf_backend_modify_program_headers
5305
5306 /* Intel L1OM support. */
5307
5308 static bfd_boolean
5309 elf64_l1om_elf_object_p (bfd *abfd)
5310 {
5311 /* Set the right machine number for an L1OM elf64 file. */
5312 bfd_default_set_arch_mach (abfd, bfd_arch_l1om, bfd_mach_l1om);
5313 return TRUE;
5314 }
5315
5316 #undef TARGET_LITTLE_SYM
5317 #define TARGET_LITTLE_SYM bfd_elf64_l1om_vec
5318 #undef TARGET_LITTLE_NAME
5319 #define TARGET_LITTLE_NAME "elf64-l1om"
5320 #undef ELF_ARCH
5321 #define ELF_ARCH bfd_arch_l1om
5322
5323 #undef ELF_MACHINE_CODE
5324 #define ELF_MACHINE_CODE EM_L1OM
5325
5326 #undef ELF_OSABI
5327
5328 #undef elf64_bed
5329 #define elf64_bed elf64_l1om_bed
5330
5331 #undef elf_backend_object_p
5332 #define elf_backend_object_p elf64_l1om_elf_object_p
5333
5334 /* Restore defaults. */
5335 #undef ELF_MAXPAGESIZE
5336 #undef ELF_MINPAGESIZE
5337 #undef ELF_COMMONPAGESIZE
5338 #define ELF_MAXPAGESIZE 0x200000
5339 #define ELF_MINPAGESIZE 0x1000
5340 #define ELF_COMMONPAGESIZE 0x1000
5341 #undef elf_backend_plt_alignment
5342 #define elf_backend_plt_alignment 4
5343 #undef elf_backend_arch_data
5344 #define elf_backend_arch_data &elf_x86_64_arch_bed
5345
5346 #include "elf64-target.h"
5347
5348 /* FreeBSD L1OM support. */
5349
5350 #undef TARGET_LITTLE_SYM
5351 #define TARGET_LITTLE_SYM bfd_elf64_l1om_freebsd_vec
5352 #undef TARGET_LITTLE_NAME
5353 #define TARGET_LITTLE_NAME "elf64-l1om-freebsd"
5354
5355 #undef ELF_OSABI
5356 #define ELF_OSABI ELFOSABI_FREEBSD
5357
5358 #undef elf64_bed
5359 #define elf64_bed elf64_l1om_fbsd_bed
5360
5361 #include "elf64-target.h"
5362
5363 /* Intel K1OM support. */
5364
5365 static bfd_boolean
5366 elf64_k1om_elf_object_p (bfd *abfd)
5367 {
5368 /* Set the right machine number for an K1OM elf64 file. */
5369 bfd_default_set_arch_mach (abfd, bfd_arch_k1om, bfd_mach_k1om);
5370 return TRUE;
5371 }
5372
5373 #undef TARGET_LITTLE_SYM
5374 #define TARGET_LITTLE_SYM bfd_elf64_k1om_vec
5375 #undef TARGET_LITTLE_NAME
5376 #define TARGET_LITTLE_NAME "elf64-k1om"
5377 #undef ELF_ARCH
5378 #define ELF_ARCH bfd_arch_k1om
5379
5380 #undef ELF_MACHINE_CODE
5381 #define ELF_MACHINE_CODE EM_K1OM
5382
5383 #undef ELF_OSABI
5384
5385 #undef elf64_bed
5386 #define elf64_bed elf64_k1om_bed
5387
5388 #undef elf_backend_object_p
5389 #define elf_backend_object_p elf64_k1om_elf_object_p
5390
5391 #undef elf_backend_static_tls_alignment
5392
5393 #undef elf_backend_want_plt_sym
5394 #define elf_backend_want_plt_sym 0
5395
5396 #include "elf64-target.h"
5397
5398 /* FreeBSD K1OM support. */
5399
5400 #undef TARGET_LITTLE_SYM
5401 #define TARGET_LITTLE_SYM bfd_elf64_k1om_freebsd_vec
5402 #undef TARGET_LITTLE_NAME
5403 #define TARGET_LITTLE_NAME "elf64-k1om-freebsd"
5404
5405 #undef ELF_OSABI
5406 #define ELF_OSABI ELFOSABI_FREEBSD
5407
5408 #undef elf64_bed
5409 #define elf64_bed elf64_k1om_fbsd_bed
5410
5411 #include "elf64-target.h"
5412
5413 /* 32bit x86-64 support. */
5414
5415 #undef TARGET_LITTLE_SYM
5416 #define TARGET_LITTLE_SYM bfd_elf32_x86_64_vec
5417 #undef TARGET_LITTLE_NAME
5418 #define TARGET_LITTLE_NAME "elf32-x86-64"
5419 #undef elf32_bed
5420
5421 #undef ELF_ARCH
5422 #define ELF_ARCH bfd_arch_i386
5423
5424 #undef ELF_MACHINE_CODE
5425 #define ELF_MACHINE_CODE EM_X86_64
5426
5427 #undef ELF_OSABI
5428
5429 #undef elf_backend_object_p
5430 #define elf_backend_object_p \
5431 elf32_x86_64_elf_object_p
5432
5433 #undef elf_backend_bfd_from_remote_memory
5434 #define elf_backend_bfd_from_remote_memory \
5435 _bfd_elf32_bfd_from_remote_memory
5436
5437 #undef elf_backend_size_info
5438 #define elf_backend_size_info \
5439 _bfd_elf32_size_info
5440
5441 #include "elf32-target.h"
This page took 0.149121 seconds and 5 git commands to generate.