Use int and bfd_signed_vma in x32 addend overflow check
[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)
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 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. SYM may
4503 be NULL for local symbols. */
4504 if (sym != NULL
4505 && (strcmp (h->root.root.string, "_DYNAMIC") == 0
4506 || h == htab->elf.hgot))
4507 sym->st_shndx = SHN_ABS;
4508
4509 return TRUE;
4510 }
4511
4512 /* Finish up local dynamic symbol handling. We set the contents of
4513 various dynamic sections here. */
4514
4515 static bfd_boolean
4516 elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
4517 {
4518 struct elf_link_hash_entry *h
4519 = (struct elf_link_hash_entry *) *slot;
4520 struct bfd_link_info *info
4521 = (struct bfd_link_info *) inf;
4522
4523 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
4524 info, h, NULL);
4525 }
4526
4527 /* Used to decide how to sort relocs in an optimal manner for the
4528 dynamic linker, before writing them out. */
4529
4530 static enum elf_reloc_type_class
4531 elf_x86_64_reloc_type_class (const Elf_Internal_Rela *rela)
4532 {
4533 switch ((int) ELF32_R_TYPE (rela->r_info))
4534 {
4535 case R_X86_64_RELATIVE:
4536 case R_X86_64_RELATIVE64:
4537 return reloc_class_relative;
4538 case R_X86_64_JUMP_SLOT:
4539 return reloc_class_plt;
4540 case R_X86_64_COPY:
4541 return reloc_class_copy;
4542 default:
4543 return reloc_class_normal;
4544 }
4545 }
4546
4547 /* Finish up the dynamic sections. */
4548
4549 static bfd_boolean
4550 elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
4551 struct bfd_link_info *info)
4552 {
4553 struct elf_x86_64_link_hash_table *htab;
4554 bfd *dynobj;
4555 asection *sdyn;
4556 const struct elf_x86_64_backend_data *const abed
4557 = get_elf_x86_64_backend_data (output_bfd);
4558
4559 htab = elf_x86_64_hash_table (info);
4560 if (htab == NULL)
4561 return FALSE;
4562
4563 dynobj = htab->elf.dynobj;
4564 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4565
4566 if (htab->elf.dynamic_sections_created)
4567 {
4568 bfd_byte *dyncon, *dynconend;
4569 const struct elf_backend_data *bed;
4570 bfd_size_type sizeof_dyn;
4571
4572 if (sdyn == NULL || htab->elf.sgot == NULL)
4573 abort ();
4574
4575 bed = get_elf_backend_data (dynobj);
4576 sizeof_dyn = bed->s->sizeof_dyn;
4577 dyncon = sdyn->contents;
4578 dynconend = sdyn->contents + sdyn->size;
4579 for (; dyncon < dynconend; dyncon += sizeof_dyn)
4580 {
4581 Elf_Internal_Dyn dyn;
4582 asection *s;
4583
4584 (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
4585
4586 switch (dyn.d_tag)
4587 {
4588 default:
4589 continue;
4590
4591 case DT_PLTGOT:
4592 s = htab->elf.sgotplt;
4593 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4594 break;
4595
4596 case DT_JMPREL:
4597 dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
4598 break;
4599
4600 case DT_PLTRELSZ:
4601 s = htab->elf.srelplt->output_section;
4602 dyn.d_un.d_val = s->size;
4603 break;
4604
4605 case DT_RELASZ:
4606 /* The procedure linkage table relocs (DT_JMPREL) should
4607 not be included in the overall relocs (DT_RELA).
4608 Therefore, we override the DT_RELASZ entry here to
4609 make it not include the JMPREL relocs. Since the
4610 linker script arranges for .rela.plt to follow all
4611 other relocation sections, we don't have to worry
4612 about changing the DT_RELA entry. */
4613 if (htab->elf.srelplt != NULL)
4614 {
4615 s = htab->elf.srelplt->output_section;
4616 dyn.d_un.d_val -= s->size;
4617 }
4618 break;
4619
4620 case DT_TLSDESC_PLT:
4621 s = htab->elf.splt;
4622 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
4623 + htab->tlsdesc_plt;
4624 break;
4625
4626 case DT_TLSDESC_GOT:
4627 s = htab->elf.sgot;
4628 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
4629 + htab->tlsdesc_got;
4630 break;
4631 }
4632
4633 (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
4634 }
4635
4636 /* Fill in the special first entry in the procedure linkage table. */
4637 if (htab->elf.splt && htab->elf.splt->size > 0)
4638 {
4639 /* Fill in the first entry in the procedure linkage table. */
4640 memcpy (htab->elf.splt->contents,
4641 abed->plt0_entry, abed->plt_entry_size);
4642 /* Add offset for pushq GOT+8(%rip), since the instruction
4643 uses 6 bytes subtract this value. */
4644 bfd_put_32 (output_bfd,
4645 (htab->elf.sgotplt->output_section->vma
4646 + htab->elf.sgotplt->output_offset
4647 + 8
4648 - htab->elf.splt->output_section->vma
4649 - htab->elf.splt->output_offset
4650 - 6),
4651 htab->elf.splt->contents + abed->plt0_got1_offset);
4652 /* Add offset for the PC-relative instruction accessing GOT+16,
4653 subtracting the offset to the end of that instruction. */
4654 bfd_put_32 (output_bfd,
4655 (htab->elf.sgotplt->output_section->vma
4656 + htab->elf.sgotplt->output_offset
4657 + 16
4658 - htab->elf.splt->output_section->vma
4659 - htab->elf.splt->output_offset
4660 - abed->plt0_got2_insn_end),
4661 htab->elf.splt->contents + abed->plt0_got2_offset);
4662
4663 elf_section_data (htab->elf.splt->output_section)
4664 ->this_hdr.sh_entsize = abed->plt_entry_size;
4665
4666 if (htab->tlsdesc_plt)
4667 {
4668 bfd_put_64 (output_bfd, (bfd_vma) 0,
4669 htab->elf.sgot->contents + htab->tlsdesc_got);
4670
4671 memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
4672 abed->plt0_entry, abed->plt_entry_size);
4673
4674 /* Add offset for pushq GOT+8(%rip), since the
4675 instruction uses 6 bytes subtract this value. */
4676 bfd_put_32 (output_bfd,
4677 (htab->elf.sgotplt->output_section->vma
4678 + htab->elf.sgotplt->output_offset
4679 + 8
4680 - htab->elf.splt->output_section->vma
4681 - htab->elf.splt->output_offset
4682 - htab->tlsdesc_plt
4683 - 6),
4684 htab->elf.splt->contents
4685 + htab->tlsdesc_plt + abed->plt0_got1_offset);
4686 /* Add offset for the PC-relative instruction accessing GOT+TDG,
4687 where TGD stands for htab->tlsdesc_got, subtracting the offset
4688 to the end of that instruction. */
4689 bfd_put_32 (output_bfd,
4690 (htab->elf.sgot->output_section->vma
4691 + htab->elf.sgot->output_offset
4692 + htab->tlsdesc_got
4693 - htab->elf.splt->output_section->vma
4694 - htab->elf.splt->output_offset
4695 - htab->tlsdesc_plt
4696 - abed->plt0_got2_insn_end),
4697 htab->elf.splt->contents
4698 + htab->tlsdesc_plt + abed->plt0_got2_offset);
4699 }
4700 }
4701 }
4702
4703 if (htab->elf.sgotplt)
4704 {
4705 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
4706 {
4707 (*_bfd_error_handler)
4708 (_("discarded output section: `%A'"), htab->elf.sgotplt);
4709 return FALSE;
4710 }
4711
4712 /* Fill in the first three entries in the global offset table. */
4713 if (htab->elf.sgotplt->size > 0)
4714 {
4715 /* Set the first entry in the global offset table to the address of
4716 the dynamic section. */
4717 if (sdyn == NULL)
4718 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents);
4719 else
4720 bfd_put_64 (output_bfd,
4721 sdyn->output_section->vma + sdyn->output_offset,
4722 htab->elf.sgotplt->contents);
4723 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
4724 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
4725 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE*2);
4726 }
4727
4728 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize =
4729 GOT_ENTRY_SIZE;
4730 }
4731
4732 /* Adjust .eh_frame for .plt section. */
4733 if (htab->plt_eh_frame != NULL)
4734 {
4735 if (htab->elf.splt != NULL
4736 && htab->elf.splt->size != 0
4737 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
4738 && htab->elf.splt->output_section != NULL
4739 && htab->plt_eh_frame->output_section != NULL)
4740 {
4741 bfd_vma plt_start = htab->elf.splt->output_section->vma;
4742 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
4743 + htab->plt_eh_frame->output_offset
4744 + PLT_FDE_START_OFFSET;
4745 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
4746 htab->plt_eh_frame->contents
4747 + PLT_FDE_START_OFFSET);
4748 }
4749 if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
4750 {
4751 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
4752 htab->plt_eh_frame,
4753 htab->plt_eh_frame->contents))
4754 return FALSE;
4755 }
4756 }
4757
4758 if (htab->elf.sgot && htab->elf.sgot->size > 0)
4759 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
4760 = GOT_ENTRY_SIZE;
4761
4762 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
4763 htab_traverse (htab->loc_hash_table,
4764 elf_x86_64_finish_local_dynamic_symbol,
4765 info);
4766
4767 return TRUE;
4768 }
4769
4770 /* Return address for Ith PLT stub in section PLT, for relocation REL
4771 or (bfd_vma) -1 if it should not be included. */
4772
4773 static bfd_vma
4774 elf_x86_64_plt_sym_val (bfd_vma i, const asection *plt,
4775 const arelent *rel ATTRIBUTE_UNUSED)
4776 {
4777 return plt->vma + (i + 1) * GET_PLT_ENTRY_SIZE (plt->owner);
4778 }
4779
4780 /* Handle an x86-64 specific section when reading an object file. This
4781 is called when elfcode.h finds a section with an unknown type. */
4782
4783 static bfd_boolean
4784 elf_x86_64_section_from_shdr (bfd *abfd,
4785 Elf_Internal_Shdr *hdr,
4786 const char *name,
4787 int shindex)
4788 {
4789 if (hdr->sh_type != SHT_X86_64_UNWIND)
4790 return FALSE;
4791
4792 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
4793 return FALSE;
4794
4795 return TRUE;
4796 }
4797
4798 /* Hook called by the linker routine which adds symbols from an object
4799 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
4800 of .bss. */
4801
4802 static bfd_boolean
4803 elf_x86_64_add_symbol_hook (bfd *abfd,
4804 struct bfd_link_info *info,
4805 Elf_Internal_Sym *sym,
4806 const char **namep ATTRIBUTE_UNUSED,
4807 flagword *flagsp ATTRIBUTE_UNUSED,
4808 asection **secp,
4809 bfd_vma *valp)
4810 {
4811 asection *lcomm;
4812
4813 switch (sym->st_shndx)
4814 {
4815 case SHN_X86_64_LCOMMON:
4816 lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
4817 if (lcomm == NULL)
4818 {
4819 lcomm = bfd_make_section_with_flags (abfd,
4820 "LARGE_COMMON",
4821 (SEC_ALLOC
4822 | SEC_IS_COMMON
4823 | SEC_LINKER_CREATED));
4824 if (lcomm == NULL)
4825 return FALSE;
4826 elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
4827 }
4828 *secp = lcomm;
4829 *valp = sym->st_size;
4830 return TRUE;
4831 }
4832
4833 if ((abfd->flags & DYNAMIC) == 0
4834 && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
4835 || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
4836 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4837
4838 return TRUE;
4839 }
4840
4841
4842 /* Given a BFD section, try to locate the corresponding ELF section
4843 index. */
4844
4845 static bfd_boolean
4846 elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
4847 asection *sec, int *index_return)
4848 {
4849 if (sec == &_bfd_elf_large_com_section)
4850 {
4851 *index_return = SHN_X86_64_LCOMMON;
4852 return TRUE;
4853 }
4854 return FALSE;
4855 }
4856
4857 /* Process a symbol. */
4858
4859 static void
4860 elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
4861 asymbol *asym)
4862 {
4863 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
4864
4865 switch (elfsym->internal_elf_sym.st_shndx)
4866 {
4867 case SHN_X86_64_LCOMMON:
4868 asym->section = &_bfd_elf_large_com_section;
4869 asym->value = elfsym->internal_elf_sym.st_size;
4870 /* Common symbol doesn't set BSF_GLOBAL. */
4871 asym->flags &= ~BSF_GLOBAL;
4872 break;
4873 }
4874 }
4875
4876 static bfd_boolean
4877 elf_x86_64_common_definition (Elf_Internal_Sym *sym)
4878 {
4879 return (sym->st_shndx == SHN_COMMON
4880 || sym->st_shndx == SHN_X86_64_LCOMMON);
4881 }
4882
4883 static unsigned int
4884 elf_x86_64_common_section_index (asection *sec)
4885 {
4886 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
4887 return SHN_COMMON;
4888 else
4889 return SHN_X86_64_LCOMMON;
4890 }
4891
4892 static asection *
4893 elf_x86_64_common_section (asection *sec)
4894 {
4895 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
4896 return bfd_com_section_ptr;
4897 else
4898 return &_bfd_elf_large_com_section;
4899 }
4900
4901 static bfd_boolean
4902 elf_x86_64_merge_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
4903 struct elf_link_hash_entry **sym_hash ATTRIBUTE_UNUSED,
4904 struct elf_link_hash_entry *h,
4905 Elf_Internal_Sym *sym,
4906 asection **psec,
4907 bfd_vma *pvalue ATTRIBUTE_UNUSED,
4908 unsigned int *pold_alignment ATTRIBUTE_UNUSED,
4909 bfd_boolean *skip ATTRIBUTE_UNUSED,
4910 bfd_boolean *override ATTRIBUTE_UNUSED,
4911 bfd_boolean *type_change_ok ATTRIBUTE_UNUSED,
4912 bfd_boolean *size_change_ok ATTRIBUTE_UNUSED,
4913 bfd_boolean *newdyn ATTRIBUTE_UNUSED,
4914 bfd_boolean *newdef,
4915 bfd_boolean *newdyncommon ATTRIBUTE_UNUSED,
4916 bfd_boolean *newweak ATTRIBUTE_UNUSED,
4917 bfd *abfd ATTRIBUTE_UNUSED,
4918 asection **sec,
4919 bfd_boolean *olddyn ATTRIBUTE_UNUSED,
4920 bfd_boolean *olddef,
4921 bfd_boolean *olddyncommon ATTRIBUTE_UNUSED,
4922 bfd_boolean *oldweak ATTRIBUTE_UNUSED,
4923 bfd *oldbfd,
4924 asection **oldsec)
4925 {
4926 /* A normal common symbol and a large common symbol result in a
4927 normal common symbol. We turn the large common symbol into a
4928 normal one. */
4929 if (!*olddef
4930 && h->root.type == bfd_link_hash_common
4931 && !*newdef
4932 && bfd_is_com_section (*sec)
4933 && *oldsec != *sec)
4934 {
4935 if (sym->st_shndx == SHN_COMMON
4936 && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) != 0)
4937 {
4938 h->root.u.c.p->section
4939 = bfd_make_section_old_way (oldbfd, "COMMON");
4940 h->root.u.c.p->section->flags = SEC_ALLOC;
4941 }
4942 else if (sym->st_shndx == SHN_X86_64_LCOMMON
4943 && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) == 0)
4944 *psec = *sec = bfd_com_section_ptr;
4945 }
4946
4947 return TRUE;
4948 }
4949
4950 static int
4951 elf_x86_64_additional_program_headers (bfd *abfd,
4952 struct bfd_link_info *info ATTRIBUTE_UNUSED)
4953 {
4954 asection *s;
4955 int count = 0;
4956
4957 /* Check to see if we need a large readonly segment. */
4958 s = bfd_get_section_by_name (abfd, ".lrodata");
4959 if (s && (s->flags & SEC_LOAD))
4960 count++;
4961
4962 /* Check to see if we need a large data segment. Since .lbss sections
4963 is placed right after the .bss section, there should be no need for
4964 a large data segment just because of .lbss. */
4965 s = bfd_get_section_by_name (abfd, ".ldata");
4966 if (s && (s->flags & SEC_LOAD))
4967 count++;
4968
4969 return count;
4970 }
4971
4972 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
4973
4974 static bfd_boolean
4975 elf_x86_64_hash_symbol (struct elf_link_hash_entry *h)
4976 {
4977 if (h->plt.offset != (bfd_vma) -1
4978 && !h->def_regular
4979 && !h->pointer_equality_needed)
4980 return FALSE;
4981
4982 return _bfd_elf_hash_symbol (h);
4983 }
4984
4985 /* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
4986
4987 static bfd_boolean
4988 elf_x86_64_relocs_compatible (const bfd_target *input,
4989 const bfd_target *output)
4990 {
4991 return ((xvec_get_elf_backend_data (input)->s->elfclass
4992 == xvec_get_elf_backend_data (output)->s->elfclass)
4993 && _bfd_elf_relocs_compatible (input, output));
4994 }
4995
4996 static const struct bfd_elf_special_section
4997 elf_x86_64_special_sections[]=
4998 {
4999 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
5000 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
5001 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
5002 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
5003 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
5004 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
5005 { NULL, 0, 0, 0, 0 }
5006 };
5007
5008 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_vec
5009 #define TARGET_LITTLE_NAME "elf64-x86-64"
5010 #define ELF_ARCH bfd_arch_i386
5011 #define ELF_TARGET_ID X86_64_ELF_DATA
5012 #define ELF_MACHINE_CODE EM_X86_64
5013 #define ELF_MAXPAGESIZE 0x200000
5014 #define ELF_MINPAGESIZE 0x1000
5015 #define ELF_COMMONPAGESIZE 0x1000
5016
5017 #define elf_backend_can_gc_sections 1
5018 #define elf_backend_can_refcount 1
5019 #define elf_backend_want_got_plt 1
5020 #define elf_backend_plt_readonly 1
5021 #define elf_backend_want_plt_sym 0
5022 #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
5023 #define elf_backend_rela_normal 1
5024 #define elf_backend_plt_alignment 4
5025
5026 #define elf_info_to_howto elf_x86_64_info_to_howto
5027
5028 #define bfd_elf64_bfd_link_hash_table_create \
5029 elf_x86_64_link_hash_table_create
5030 #define bfd_elf64_bfd_link_hash_table_free \
5031 elf_x86_64_link_hash_table_free
5032 #define bfd_elf64_bfd_reloc_type_lookup elf_x86_64_reloc_type_lookup
5033 #define bfd_elf64_bfd_reloc_name_lookup \
5034 elf_x86_64_reloc_name_lookup
5035
5036 #define elf_backend_adjust_dynamic_symbol elf_x86_64_adjust_dynamic_symbol
5037 #define elf_backend_relocs_compatible elf_x86_64_relocs_compatible
5038 #define elf_backend_check_relocs elf_x86_64_check_relocs
5039 #define elf_backend_copy_indirect_symbol elf_x86_64_copy_indirect_symbol
5040 #define elf_backend_create_dynamic_sections elf_x86_64_create_dynamic_sections
5041 #define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
5042 #define elf_backend_finish_dynamic_symbol elf_x86_64_finish_dynamic_symbol
5043 #define elf_backend_gc_mark_hook elf_x86_64_gc_mark_hook
5044 #define elf_backend_gc_sweep_hook elf_x86_64_gc_sweep_hook
5045 #define elf_backend_grok_prstatus elf_x86_64_grok_prstatus
5046 #define elf_backend_grok_psinfo elf_x86_64_grok_psinfo
5047 #ifdef CORE_HEADER
5048 #define elf_backend_write_core_note elf_x86_64_write_core_note
5049 #endif
5050 #define elf_backend_reloc_type_class elf_x86_64_reloc_type_class
5051 #define elf_backend_relocate_section elf_x86_64_relocate_section
5052 #define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections
5053 #define elf_backend_always_size_sections elf_x86_64_always_size_sections
5054 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
5055 #define elf_backend_plt_sym_val elf_x86_64_plt_sym_val
5056 #define elf_backend_object_p elf64_x86_64_elf_object_p
5057 #define bfd_elf64_mkobject elf_x86_64_mkobject
5058
5059 #define elf_backend_section_from_shdr \
5060 elf_x86_64_section_from_shdr
5061
5062 #define elf_backend_section_from_bfd_section \
5063 elf_x86_64_elf_section_from_bfd_section
5064 #define elf_backend_add_symbol_hook \
5065 elf_x86_64_add_symbol_hook
5066 #define elf_backend_symbol_processing \
5067 elf_x86_64_symbol_processing
5068 #define elf_backend_common_section_index \
5069 elf_x86_64_common_section_index
5070 #define elf_backend_common_section \
5071 elf_x86_64_common_section
5072 #define elf_backend_common_definition \
5073 elf_x86_64_common_definition
5074 #define elf_backend_merge_symbol \
5075 elf_x86_64_merge_symbol
5076 #define elf_backend_special_sections \
5077 elf_x86_64_special_sections
5078 #define elf_backend_additional_program_headers \
5079 elf_x86_64_additional_program_headers
5080 #define elf_backend_hash_symbol \
5081 elf_x86_64_hash_symbol
5082
5083 #define elf_backend_post_process_headers _bfd_elf_set_osabi
5084
5085 #include "elf64-target.h"
5086
5087 /* FreeBSD support. */
5088
5089 #undef TARGET_LITTLE_SYM
5090 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_freebsd_vec
5091 #undef TARGET_LITTLE_NAME
5092 #define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
5093
5094 #undef ELF_OSABI
5095 #define ELF_OSABI ELFOSABI_FREEBSD
5096
5097 #undef elf64_bed
5098 #define elf64_bed elf64_x86_64_fbsd_bed
5099
5100 #include "elf64-target.h"
5101
5102 /* Solaris 2 support. */
5103
5104 #undef TARGET_LITTLE_SYM
5105 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_sol2_vec
5106 #undef TARGET_LITTLE_NAME
5107 #define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
5108
5109 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
5110 objects won't be recognized. */
5111 #undef ELF_OSABI
5112
5113 #undef elf64_bed
5114 #define elf64_bed elf64_x86_64_sol2_bed
5115
5116 /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
5117 boundary. */
5118 #undef elf_backend_static_tls_alignment
5119 #define elf_backend_static_tls_alignment 16
5120
5121 /* The Solaris 2 ABI requires a plt symbol on all platforms.
5122
5123 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
5124 File, p.63. */
5125 #undef elf_backend_want_plt_sym
5126 #define elf_backend_want_plt_sym 1
5127
5128 #include "elf64-target.h"
5129
5130 /* Native Client support. */
5131
5132 #undef TARGET_LITTLE_SYM
5133 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_nacl_vec
5134 #undef TARGET_LITTLE_NAME
5135 #define TARGET_LITTLE_NAME "elf64-x86-64-nacl"
5136 #undef elf64_bed
5137 #define elf64_bed elf64_x86_64_nacl_bed
5138
5139 #undef ELF_MAXPAGESIZE
5140 #undef ELF_MINPAGESIZE
5141 #undef ELF_COMMONPAGESIZE
5142 #define ELF_MAXPAGESIZE 0x10000
5143 #define ELF_MINPAGESIZE 0x10000
5144 #define ELF_COMMONPAGESIZE 0x10000
5145
5146 /* Restore defaults. */
5147 #undef ELF_OSABI
5148 #undef elf_backend_static_tls_alignment
5149 #undef elf_backend_want_plt_sym
5150 #define elf_backend_want_plt_sym 0
5151
5152 /* NaCl uses substantially different PLT entries for the same effects. */
5153
5154 #undef elf_backend_plt_alignment
5155 #define elf_backend_plt_alignment 5
5156 #define NACL_PLT_ENTRY_SIZE 64
5157 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
5158
5159 static const bfd_byte elf_x86_64_nacl_plt0_entry[NACL_PLT_ENTRY_SIZE] =
5160 {
5161 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
5162 0x4c, 0x8b, 0x1d, 16, 0, 0, 0, /* mov GOT+16(%rip), %r11 */
5163 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
5164 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
5165 0x41, 0xff, 0xe3, /* jmpq *%r11 */
5166
5167 /* 9-byte nop sequence to pad out to the next 32-byte boundary. */
5168 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopl %cs:0x0(%rax,%rax,1) */
5169
5170 /* 32 bytes of nop to pad out to the standard size. */
5171 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5172 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5173 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5174 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5175 0x66, /* excess data32 prefix */
5176 0x90 /* nop */
5177 };
5178
5179 static const bfd_byte elf_x86_64_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
5180 {
5181 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, /* mov name@GOTPCREL(%rip),%r11 */
5182 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
5183 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
5184 0x41, 0xff, 0xe3, /* jmpq *%r11 */
5185
5186 /* 15-byte nop sequence to pad out to the next 32-byte boundary. */
5187 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5188 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5189
5190 /* Lazy GOT entries point here (32-byte aligned). */
5191 0x68, /* pushq immediate */
5192 0, 0, 0, 0, /* replaced with index into relocation table. */
5193 0xe9, /* jmp relative */
5194 0, 0, 0, 0, /* replaced with offset to start of .plt0. */
5195
5196 /* 22 bytes of nop to pad out to the standard size. */
5197 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5198 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5199 0x0f, 0x1f, 0x80, 0, 0, 0, 0, /* nopl 0x0(%rax) */
5200 };
5201
5202 /* .eh_frame covering the .plt section. */
5203
5204 static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] =
5205 {
5206 #if (PLT_CIE_LENGTH != 20 \
5207 || PLT_FDE_LENGTH != 36 \
5208 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
5209 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
5210 # error "Need elf_x86_64_backend_data parameters for eh_frame_plt offsets!"
5211 #endif
5212 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
5213 0, 0, 0, 0, /* CIE ID */
5214 1, /* CIE version */
5215 'z', 'R', 0, /* Augmentation string */
5216 1, /* Code alignment factor */
5217 0x78, /* Data alignment factor */
5218 16, /* Return address column */
5219 1, /* Augmentation size */
5220 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
5221 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
5222 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
5223 DW_CFA_nop, DW_CFA_nop,
5224
5225 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
5226 PLT_CIE_LENGTH + 8, 0, 0, 0,/* CIE pointer */
5227 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
5228 0, 0, 0, 0, /* .plt size goes here */
5229 0, /* Augmentation size */
5230 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
5231 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
5232 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
5233 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
5234 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
5235 13, /* Block length */
5236 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
5237 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
5238 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
5239 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
5240 DW_CFA_nop, DW_CFA_nop
5241 };
5242
5243 static const struct elf_x86_64_backend_data elf_x86_64_nacl_arch_bed =
5244 {
5245 elf_x86_64_nacl_plt0_entry, /* plt0_entry */
5246 elf_x86_64_nacl_plt_entry, /* plt_entry */
5247 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
5248 2, /* plt0_got1_offset */
5249 9, /* plt0_got2_offset */
5250 13, /* plt0_got2_insn_end */
5251 3, /* plt_got_offset */
5252 33, /* plt_reloc_offset */
5253 38, /* plt_plt_offset */
5254 7, /* plt_got_insn_size */
5255 42, /* plt_plt_insn_end */
5256 32, /* plt_lazy_offset */
5257 elf_x86_64_nacl_eh_frame_plt, /* eh_frame_plt */
5258 sizeof (elf_x86_64_nacl_eh_frame_plt), /* eh_frame_plt_size */
5259 };
5260
5261 #undef elf_backend_arch_data
5262 #define elf_backend_arch_data &elf_x86_64_nacl_arch_bed
5263
5264 #undef elf_backend_modify_segment_map
5265 #define elf_backend_modify_segment_map nacl_modify_segment_map
5266 #undef elf_backend_modify_program_headers
5267 #define elf_backend_modify_program_headers nacl_modify_program_headers
5268
5269 #include "elf64-target.h"
5270
5271 /* Native Client x32 support. */
5272
5273 #undef TARGET_LITTLE_SYM
5274 #define TARGET_LITTLE_SYM bfd_elf32_x86_64_nacl_vec
5275 #undef TARGET_LITTLE_NAME
5276 #define TARGET_LITTLE_NAME "elf32-x86-64-nacl"
5277 #undef elf32_bed
5278 #define elf32_bed elf32_x86_64_nacl_bed
5279
5280 #define bfd_elf32_bfd_link_hash_table_create \
5281 elf_x86_64_link_hash_table_create
5282 #define bfd_elf32_bfd_link_hash_table_free \
5283 elf_x86_64_link_hash_table_free
5284 #define bfd_elf32_bfd_reloc_type_lookup \
5285 elf_x86_64_reloc_type_lookup
5286 #define bfd_elf32_bfd_reloc_name_lookup \
5287 elf_x86_64_reloc_name_lookup
5288 #define bfd_elf32_mkobject \
5289 elf_x86_64_mkobject
5290
5291 #undef elf_backend_object_p
5292 #define elf_backend_object_p \
5293 elf32_x86_64_elf_object_p
5294
5295 #undef elf_backend_bfd_from_remote_memory
5296 #define elf_backend_bfd_from_remote_memory \
5297 _bfd_elf32_bfd_from_remote_memory
5298
5299 #undef elf_backend_size_info
5300 #define elf_backend_size_info \
5301 _bfd_elf32_size_info
5302
5303 #include "elf32-target.h"
5304
5305 /* Restore defaults. */
5306 #undef elf_backend_object_p
5307 #define elf_backend_object_p elf64_x86_64_elf_object_p
5308 #undef elf_backend_bfd_from_remote_memory
5309 #undef elf_backend_size_info
5310 #undef elf_backend_modify_segment_map
5311 #undef elf_backend_modify_program_headers
5312
5313 /* Intel L1OM support. */
5314
5315 static bfd_boolean
5316 elf64_l1om_elf_object_p (bfd *abfd)
5317 {
5318 /* Set the right machine number for an L1OM elf64 file. */
5319 bfd_default_set_arch_mach (abfd, bfd_arch_l1om, bfd_mach_l1om);
5320 return TRUE;
5321 }
5322
5323 #undef TARGET_LITTLE_SYM
5324 #define TARGET_LITTLE_SYM bfd_elf64_l1om_vec
5325 #undef TARGET_LITTLE_NAME
5326 #define TARGET_LITTLE_NAME "elf64-l1om"
5327 #undef ELF_ARCH
5328 #define ELF_ARCH bfd_arch_l1om
5329
5330 #undef ELF_MACHINE_CODE
5331 #define ELF_MACHINE_CODE EM_L1OM
5332
5333 #undef ELF_OSABI
5334
5335 #undef elf64_bed
5336 #define elf64_bed elf64_l1om_bed
5337
5338 #undef elf_backend_object_p
5339 #define elf_backend_object_p elf64_l1om_elf_object_p
5340
5341 /* Restore defaults. */
5342 #undef ELF_MAXPAGESIZE
5343 #undef ELF_MINPAGESIZE
5344 #undef ELF_COMMONPAGESIZE
5345 #define ELF_MAXPAGESIZE 0x200000
5346 #define ELF_MINPAGESIZE 0x1000
5347 #define ELF_COMMONPAGESIZE 0x1000
5348 #undef elf_backend_plt_alignment
5349 #define elf_backend_plt_alignment 4
5350 #undef elf_backend_arch_data
5351 #define elf_backend_arch_data &elf_x86_64_arch_bed
5352
5353 #include "elf64-target.h"
5354
5355 /* FreeBSD L1OM support. */
5356
5357 #undef TARGET_LITTLE_SYM
5358 #define TARGET_LITTLE_SYM bfd_elf64_l1om_freebsd_vec
5359 #undef TARGET_LITTLE_NAME
5360 #define TARGET_LITTLE_NAME "elf64-l1om-freebsd"
5361
5362 #undef ELF_OSABI
5363 #define ELF_OSABI ELFOSABI_FREEBSD
5364
5365 #undef elf64_bed
5366 #define elf64_bed elf64_l1om_fbsd_bed
5367
5368 #include "elf64-target.h"
5369
5370 /* Intel K1OM support. */
5371
5372 static bfd_boolean
5373 elf64_k1om_elf_object_p (bfd *abfd)
5374 {
5375 /* Set the right machine number for an K1OM elf64 file. */
5376 bfd_default_set_arch_mach (abfd, bfd_arch_k1om, bfd_mach_k1om);
5377 return TRUE;
5378 }
5379
5380 #undef TARGET_LITTLE_SYM
5381 #define TARGET_LITTLE_SYM bfd_elf64_k1om_vec
5382 #undef TARGET_LITTLE_NAME
5383 #define TARGET_LITTLE_NAME "elf64-k1om"
5384 #undef ELF_ARCH
5385 #define ELF_ARCH bfd_arch_k1om
5386
5387 #undef ELF_MACHINE_CODE
5388 #define ELF_MACHINE_CODE EM_K1OM
5389
5390 #undef ELF_OSABI
5391
5392 #undef elf64_bed
5393 #define elf64_bed elf64_k1om_bed
5394
5395 #undef elf_backend_object_p
5396 #define elf_backend_object_p elf64_k1om_elf_object_p
5397
5398 #undef elf_backend_static_tls_alignment
5399
5400 #undef elf_backend_want_plt_sym
5401 #define elf_backend_want_plt_sym 0
5402
5403 #include "elf64-target.h"
5404
5405 /* FreeBSD K1OM support. */
5406
5407 #undef TARGET_LITTLE_SYM
5408 #define TARGET_LITTLE_SYM bfd_elf64_k1om_freebsd_vec
5409 #undef TARGET_LITTLE_NAME
5410 #define TARGET_LITTLE_NAME "elf64-k1om-freebsd"
5411
5412 #undef ELF_OSABI
5413 #define ELF_OSABI ELFOSABI_FREEBSD
5414
5415 #undef elf64_bed
5416 #define elf64_bed elf64_k1om_fbsd_bed
5417
5418 #include "elf64-target.h"
5419
5420 /* 32bit x86-64 support. */
5421
5422 #undef TARGET_LITTLE_SYM
5423 #define TARGET_LITTLE_SYM bfd_elf32_x86_64_vec
5424 #undef TARGET_LITTLE_NAME
5425 #define TARGET_LITTLE_NAME "elf32-x86-64"
5426 #undef elf32_bed
5427
5428 #undef ELF_ARCH
5429 #define ELF_ARCH bfd_arch_i386
5430
5431 #undef ELF_MACHINE_CODE
5432 #define ELF_MACHINE_CODE EM_X86_64
5433
5434 #undef ELF_OSABI
5435
5436 #undef elf_backend_object_p
5437 #define elf_backend_object_p \
5438 elf32_x86_64_elf_object_p
5439
5440 #undef elf_backend_bfd_from_remote_memory
5441 #define elf_backend_bfd_from_remote_memory \
5442 _bfd_elf32_bfd_from_remote_memory
5443
5444 #undef elf_backend_size_info
5445 #define elf_backend_size_info \
5446 _bfd_elf32_size_info
5447
5448 #include "elf32-target.h"
This page took 0.152709 seconds and 5 git commands to generate.