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