Remove x86 gc_sweep_hook
[deliverable/binutils-gdb.git] / bfd / elf64-x86-64.c
1 /* X86-64 specific support for ELF
2 Copyright (C) 2000-2016 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka <jh@suse.cz>.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "bfdlink.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27 #include "elf-nacl.h"
28 #include "bfd_stdint.h"
29 #include "objalloc.h"
30 #include "hashtab.h"
31 #include "dwarf2.h"
32 #include "libiberty.h"
33
34 #include "opcode/i386.h"
35 #include "elf/x86-64.h"
36
37 #ifdef CORE_HEADER
38 #include <stdarg.h>
39 #include CORE_HEADER
40 #endif
41
42 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
43 #define MINUS_ONE (~ (bfd_vma) 0)
44
45 /* Since both 32-bit and 64-bit x86-64 encode relocation type in the
46 identical manner, we use ELF32_R_TYPE instead of ELF64_R_TYPE to get
47 relocation type. We also use ELF_ST_TYPE instead of ELF64_ST_TYPE
48 since they are the same. */
49
50 #define ABI_64_P(abfd) \
51 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
52
53 /* The relocation "howto" table. Order of fields:
54 type, rightshift, size, bitsize, pc_relative, bitpos, complain_on_overflow,
55 special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset. */
56 static reloc_howto_type x86_64_elf_howto_table[] =
57 {
58 HOWTO(R_X86_64_NONE, 0, 3, 0, FALSE, 0, complain_overflow_dont,
59 bfd_elf_generic_reloc, "R_X86_64_NONE", FALSE, 0x00000000, 0x00000000,
60 FALSE),
61 HOWTO(R_X86_64_64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
62 bfd_elf_generic_reloc, "R_X86_64_64", FALSE, MINUS_ONE, MINUS_ONE,
63 FALSE),
64 HOWTO(R_X86_64_PC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
65 bfd_elf_generic_reloc, "R_X86_64_PC32", FALSE, 0xffffffff, 0xffffffff,
66 TRUE),
67 HOWTO(R_X86_64_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
68 bfd_elf_generic_reloc, "R_X86_64_GOT32", FALSE, 0xffffffff, 0xffffffff,
69 FALSE),
70 HOWTO(R_X86_64_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
71 bfd_elf_generic_reloc, "R_X86_64_PLT32", FALSE, 0xffffffff, 0xffffffff,
72 TRUE),
73 HOWTO(R_X86_64_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
74 bfd_elf_generic_reloc, "R_X86_64_COPY", FALSE, 0xffffffff, 0xffffffff,
75 FALSE),
76 HOWTO(R_X86_64_GLOB_DAT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
77 bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", FALSE, MINUS_ONE,
78 MINUS_ONE, FALSE),
79 HOWTO(R_X86_64_JUMP_SLOT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
80 bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", FALSE, MINUS_ONE,
81 MINUS_ONE, FALSE),
82 HOWTO(R_X86_64_RELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
83 bfd_elf_generic_reloc, "R_X86_64_RELATIVE", FALSE, MINUS_ONE,
84 MINUS_ONE, FALSE),
85 HOWTO(R_X86_64_GOTPCREL, 0, 2, 32, TRUE, 0, complain_overflow_signed,
86 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", FALSE, 0xffffffff,
87 0xffffffff, TRUE),
88 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
89 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
90 FALSE),
91 HOWTO(R_X86_64_32S, 0, 2, 32, FALSE, 0, complain_overflow_signed,
92 bfd_elf_generic_reloc, "R_X86_64_32S", FALSE, 0xffffffff, 0xffffffff,
93 FALSE),
94 HOWTO(R_X86_64_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
95 bfd_elf_generic_reloc, "R_X86_64_16", FALSE, 0xffff, 0xffff, FALSE),
96 HOWTO(R_X86_64_PC16,0, 1, 16, TRUE, 0, complain_overflow_bitfield,
97 bfd_elf_generic_reloc, "R_X86_64_PC16", FALSE, 0xffff, 0xffff, TRUE),
98 HOWTO(R_X86_64_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
99 bfd_elf_generic_reloc, "R_X86_64_8", FALSE, 0xff, 0xff, FALSE),
100 HOWTO(R_X86_64_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
101 bfd_elf_generic_reloc, "R_X86_64_PC8", FALSE, 0xff, 0xff, TRUE),
102 HOWTO(R_X86_64_DTPMOD64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
103 bfd_elf_generic_reloc, "R_X86_64_DTPMOD64", FALSE, MINUS_ONE,
104 MINUS_ONE, FALSE),
105 HOWTO(R_X86_64_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
106 bfd_elf_generic_reloc, "R_X86_64_DTPOFF64", FALSE, MINUS_ONE,
107 MINUS_ONE, FALSE),
108 HOWTO(R_X86_64_TPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
109 bfd_elf_generic_reloc, "R_X86_64_TPOFF64", FALSE, MINUS_ONE,
110 MINUS_ONE, FALSE),
111 HOWTO(R_X86_64_TLSGD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
112 bfd_elf_generic_reloc, "R_X86_64_TLSGD", FALSE, 0xffffffff,
113 0xffffffff, TRUE),
114 HOWTO(R_X86_64_TLSLD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
115 bfd_elf_generic_reloc, "R_X86_64_TLSLD", FALSE, 0xffffffff,
116 0xffffffff, TRUE),
117 HOWTO(R_X86_64_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
118 bfd_elf_generic_reloc, "R_X86_64_DTPOFF32", FALSE, 0xffffffff,
119 0xffffffff, FALSE),
120 HOWTO(R_X86_64_GOTTPOFF, 0, 2, 32, TRUE, 0, complain_overflow_signed,
121 bfd_elf_generic_reloc, "R_X86_64_GOTTPOFF", FALSE, 0xffffffff,
122 0xffffffff, TRUE),
123 HOWTO(R_X86_64_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
124 bfd_elf_generic_reloc, "R_X86_64_TPOFF32", FALSE, 0xffffffff,
125 0xffffffff, FALSE),
126 HOWTO(R_X86_64_PC64, 0, 4, 64, TRUE, 0, complain_overflow_bitfield,
127 bfd_elf_generic_reloc, "R_X86_64_PC64", FALSE, MINUS_ONE, MINUS_ONE,
128 TRUE),
129 HOWTO(R_X86_64_GOTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
130 bfd_elf_generic_reloc, "R_X86_64_GOTOFF64",
131 FALSE, MINUS_ONE, MINUS_ONE, FALSE),
132 HOWTO(R_X86_64_GOTPC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
133 bfd_elf_generic_reloc, "R_X86_64_GOTPC32",
134 FALSE, 0xffffffff, 0xffffffff, TRUE),
135 HOWTO(R_X86_64_GOT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
136 bfd_elf_generic_reloc, "R_X86_64_GOT64", FALSE, MINUS_ONE, MINUS_ONE,
137 FALSE),
138 HOWTO(R_X86_64_GOTPCREL64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
139 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL64", FALSE, MINUS_ONE,
140 MINUS_ONE, TRUE),
141 HOWTO(R_X86_64_GOTPC64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
142 bfd_elf_generic_reloc, "R_X86_64_GOTPC64",
143 FALSE, MINUS_ONE, MINUS_ONE, TRUE),
144 HOWTO(R_X86_64_GOTPLT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
145 bfd_elf_generic_reloc, "R_X86_64_GOTPLT64", FALSE, MINUS_ONE,
146 MINUS_ONE, FALSE),
147 HOWTO(R_X86_64_PLTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
148 bfd_elf_generic_reloc, "R_X86_64_PLTOFF64", FALSE, MINUS_ONE,
149 MINUS_ONE, FALSE),
150 HOWTO(R_X86_64_SIZE32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
151 bfd_elf_generic_reloc, "R_X86_64_SIZE32", FALSE, 0xffffffff, 0xffffffff,
152 FALSE),
153 HOWTO(R_X86_64_SIZE64, 0, 4, 64, FALSE, 0, complain_overflow_unsigned,
154 bfd_elf_generic_reloc, "R_X86_64_SIZE64", FALSE, MINUS_ONE, MINUS_ONE,
155 FALSE),
156 HOWTO(R_X86_64_GOTPC32_TLSDESC, 0, 2, 32, TRUE, 0,
157 complain_overflow_bitfield, bfd_elf_generic_reloc,
158 "R_X86_64_GOTPC32_TLSDESC",
159 FALSE, 0xffffffff, 0xffffffff, TRUE),
160 HOWTO(R_X86_64_TLSDESC_CALL, 0, 0, 0, FALSE, 0,
161 complain_overflow_dont, bfd_elf_generic_reloc,
162 "R_X86_64_TLSDESC_CALL",
163 FALSE, 0, 0, FALSE),
164 HOWTO(R_X86_64_TLSDESC, 0, 4, 64, FALSE, 0,
165 complain_overflow_bitfield, bfd_elf_generic_reloc,
166 "R_X86_64_TLSDESC",
167 FALSE, MINUS_ONE, MINUS_ONE, FALSE),
168 HOWTO(R_X86_64_IRELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
169 bfd_elf_generic_reloc, "R_X86_64_IRELATIVE", FALSE, MINUS_ONE,
170 MINUS_ONE, FALSE),
171 HOWTO(R_X86_64_RELATIVE64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
172 bfd_elf_generic_reloc, "R_X86_64_RELATIVE64", FALSE, MINUS_ONE,
173 MINUS_ONE, FALSE),
174 HOWTO(R_X86_64_PC32_BND, 0, 2, 32, TRUE, 0, complain_overflow_signed,
175 bfd_elf_generic_reloc, "R_X86_64_PC32_BND", FALSE, 0xffffffff, 0xffffffff,
176 TRUE),
177 HOWTO(R_X86_64_PLT32_BND, 0, 2, 32, TRUE, 0, complain_overflow_signed,
178 bfd_elf_generic_reloc, "R_X86_64_PLT32_BND", FALSE, 0xffffffff, 0xffffffff,
179 TRUE),
180 HOWTO(R_X86_64_GOTPCRELX, 0, 2, 32, TRUE, 0, complain_overflow_signed,
181 bfd_elf_generic_reloc, "R_X86_64_GOTPCRELX", FALSE, 0xffffffff,
182 0xffffffff, TRUE),
183 HOWTO(R_X86_64_REX_GOTPCRELX, 0, 2, 32, TRUE, 0, complain_overflow_signed,
184 bfd_elf_generic_reloc, "R_X86_64_REX_GOTPCRELX", FALSE, 0xffffffff,
185 0xffffffff, TRUE),
186
187 /* We have a gap in the reloc numbers here.
188 R_X86_64_standard counts the number up to this point, and
189 R_X86_64_vt_offset is the value to subtract from a reloc type of
190 R_X86_64_GNU_VT* to form an index into this table. */
191 #define R_X86_64_standard (R_X86_64_REX_GOTPCRELX + 1)
192 #define R_X86_64_vt_offset (R_X86_64_GNU_VTINHERIT - R_X86_64_standard)
193
194 /* GNU extension to record C++ vtable hierarchy. */
195 HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, FALSE, 0, complain_overflow_dont,
196 NULL, "R_X86_64_GNU_VTINHERIT", FALSE, 0, 0, FALSE),
197
198 /* GNU extension to record C++ vtable member usage. */
199 HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, FALSE, 0, complain_overflow_dont,
200 _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", FALSE, 0, 0,
201 FALSE),
202
203 /* Use complain_overflow_bitfield on R_X86_64_32 for x32. */
204 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
205 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
206 FALSE)
207 };
208
209 #define IS_X86_64_PCREL_TYPE(TYPE) \
210 ( ((TYPE) == R_X86_64_PC8) \
211 || ((TYPE) == R_X86_64_PC16) \
212 || ((TYPE) == R_X86_64_PC32) \
213 || ((TYPE) == R_X86_64_PC32_BND) \
214 || ((TYPE) == R_X86_64_PC64))
215
216 /* Map BFD relocs to the x86_64 elf relocs. */
217 struct elf_reloc_map
218 {
219 bfd_reloc_code_real_type bfd_reloc_val;
220 unsigned char elf_reloc_val;
221 };
222
223 static const struct elf_reloc_map x86_64_reloc_map[] =
224 {
225 { BFD_RELOC_NONE, R_X86_64_NONE, },
226 { BFD_RELOC_64, R_X86_64_64, },
227 { BFD_RELOC_32_PCREL, R_X86_64_PC32, },
228 { BFD_RELOC_X86_64_GOT32, R_X86_64_GOT32,},
229 { BFD_RELOC_X86_64_PLT32, R_X86_64_PLT32,},
230 { BFD_RELOC_X86_64_COPY, R_X86_64_COPY, },
231 { BFD_RELOC_X86_64_GLOB_DAT, R_X86_64_GLOB_DAT, },
232 { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, },
233 { BFD_RELOC_X86_64_RELATIVE, R_X86_64_RELATIVE, },
234 { BFD_RELOC_X86_64_GOTPCREL, R_X86_64_GOTPCREL, },
235 { BFD_RELOC_32, R_X86_64_32, },
236 { BFD_RELOC_X86_64_32S, R_X86_64_32S, },
237 { BFD_RELOC_16, R_X86_64_16, },
238 { BFD_RELOC_16_PCREL, R_X86_64_PC16, },
239 { BFD_RELOC_8, R_X86_64_8, },
240 { BFD_RELOC_8_PCREL, R_X86_64_PC8, },
241 { BFD_RELOC_X86_64_DTPMOD64, R_X86_64_DTPMOD64, },
242 { BFD_RELOC_X86_64_DTPOFF64, R_X86_64_DTPOFF64, },
243 { BFD_RELOC_X86_64_TPOFF64, R_X86_64_TPOFF64, },
244 { BFD_RELOC_X86_64_TLSGD, R_X86_64_TLSGD, },
245 { BFD_RELOC_X86_64_TLSLD, R_X86_64_TLSLD, },
246 { BFD_RELOC_X86_64_DTPOFF32, R_X86_64_DTPOFF32, },
247 { BFD_RELOC_X86_64_GOTTPOFF, R_X86_64_GOTTPOFF, },
248 { BFD_RELOC_X86_64_TPOFF32, R_X86_64_TPOFF32, },
249 { BFD_RELOC_64_PCREL, R_X86_64_PC64, },
250 { BFD_RELOC_X86_64_GOTOFF64, R_X86_64_GOTOFF64, },
251 { BFD_RELOC_X86_64_GOTPC32, R_X86_64_GOTPC32, },
252 { BFD_RELOC_X86_64_GOT64, R_X86_64_GOT64, },
253 { BFD_RELOC_X86_64_GOTPCREL64,R_X86_64_GOTPCREL64, },
254 { BFD_RELOC_X86_64_GOTPC64, R_X86_64_GOTPC64, },
255 { BFD_RELOC_X86_64_GOTPLT64, R_X86_64_GOTPLT64, },
256 { BFD_RELOC_X86_64_PLTOFF64, R_X86_64_PLTOFF64, },
257 { BFD_RELOC_SIZE32, R_X86_64_SIZE32, },
258 { BFD_RELOC_SIZE64, R_X86_64_SIZE64, },
259 { BFD_RELOC_X86_64_GOTPC32_TLSDESC, R_X86_64_GOTPC32_TLSDESC, },
260 { BFD_RELOC_X86_64_TLSDESC_CALL, R_X86_64_TLSDESC_CALL, },
261 { BFD_RELOC_X86_64_TLSDESC, R_X86_64_TLSDESC, },
262 { BFD_RELOC_X86_64_IRELATIVE, R_X86_64_IRELATIVE, },
263 { BFD_RELOC_X86_64_PC32_BND, R_X86_64_PC32_BND, },
264 { BFD_RELOC_X86_64_PLT32_BND, R_X86_64_PLT32_BND, },
265 { BFD_RELOC_X86_64_GOTPCRELX, R_X86_64_GOTPCRELX, },
266 { BFD_RELOC_X86_64_REX_GOTPCRELX, R_X86_64_REX_GOTPCRELX, },
267 { BFD_RELOC_VTABLE_INHERIT, R_X86_64_GNU_VTINHERIT, },
268 { BFD_RELOC_VTABLE_ENTRY, R_X86_64_GNU_VTENTRY, },
269 };
270
271 static reloc_howto_type *
272 elf_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type)
273 {
274 unsigned i;
275
276 if (r_type == (unsigned int) R_X86_64_32)
277 {
278 if (ABI_64_P (abfd))
279 i = r_type;
280 else
281 i = ARRAY_SIZE (x86_64_elf_howto_table) - 1;
282 }
283 else if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT
284 || r_type >= (unsigned int) R_X86_64_max)
285 {
286 if (r_type >= (unsigned int) R_X86_64_standard)
287 {
288 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
289 abfd, (int) r_type);
290 r_type = R_X86_64_NONE;
291 }
292 i = r_type;
293 }
294 else
295 i = r_type - (unsigned int) R_X86_64_vt_offset;
296 BFD_ASSERT (x86_64_elf_howto_table[i].type == r_type);
297 return &x86_64_elf_howto_table[i];
298 }
299
300 /* Given a BFD reloc type, return a HOWTO structure. */
301 static reloc_howto_type *
302 elf_x86_64_reloc_type_lookup (bfd *abfd,
303 bfd_reloc_code_real_type code)
304 {
305 unsigned int i;
306
307 for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
308 i++)
309 {
310 if (x86_64_reloc_map[i].bfd_reloc_val == code)
311 return elf_x86_64_rtype_to_howto (abfd,
312 x86_64_reloc_map[i].elf_reloc_val);
313 }
314 return NULL;
315 }
316
317 static reloc_howto_type *
318 elf_x86_64_reloc_name_lookup (bfd *abfd,
319 const char *r_name)
320 {
321 unsigned int i;
322
323 if (!ABI_64_P (abfd) && strcasecmp (r_name, "R_X86_64_32") == 0)
324 {
325 /* Get x32 R_X86_64_32. */
326 reloc_howto_type *reloc
327 = &x86_64_elf_howto_table[ARRAY_SIZE (x86_64_elf_howto_table) - 1];
328 BFD_ASSERT (reloc->type == (unsigned int) R_X86_64_32);
329 return reloc;
330 }
331
332 for (i = 0; i < ARRAY_SIZE (x86_64_elf_howto_table); i++)
333 if (x86_64_elf_howto_table[i].name != NULL
334 && strcasecmp (x86_64_elf_howto_table[i].name, r_name) == 0)
335 return &x86_64_elf_howto_table[i];
336
337 return NULL;
338 }
339
340 /* Given an x86_64 ELF reloc type, fill in an arelent structure. */
341
342 static void
343 elf_x86_64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
344 Elf_Internal_Rela *dst)
345 {
346 unsigned r_type;
347
348 r_type = ELF32_R_TYPE (dst->r_info);
349 cache_ptr->howto = elf_x86_64_rtype_to_howto (abfd, r_type);
350 BFD_ASSERT (r_type == cache_ptr->howto->type);
351 }
352 \f
353 /* Support for core dump NOTE sections. */
354 static bfd_boolean
355 elf_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
356 {
357 int offset;
358 size_t size;
359
360 switch (note->descsz)
361 {
362 default:
363 return FALSE;
364
365 case 296: /* sizeof(istruct elf_prstatus) on Linux/x32 */
366 /* pr_cursig */
367 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
368
369 /* pr_pid */
370 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
371
372 /* pr_reg */
373 offset = 72;
374 size = 216;
375
376 break;
377
378 case 336: /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
379 /* pr_cursig */
380 elf_tdata (abfd)->core->signal
381 = bfd_get_16 (abfd, note->descdata + 12);
382
383 /* pr_pid */
384 elf_tdata (abfd)->core->lwpid
385 = bfd_get_32 (abfd, note->descdata + 32);
386
387 /* pr_reg */
388 offset = 112;
389 size = 216;
390
391 break;
392 }
393
394 /* Make a ".reg/999" section. */
395 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
396 size, note->descpos + offset);
397 }
398
399 static bfd_boolean
400 elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
401 {
402 switch (note->descsz)
403 {
404 default:
405 return FALSE;
406
407 case 124: /* sizeof(struct elf_prpsinfo) on Linux/x32 */
408 elf_tdata (abfd)->core->pid
409 = bfd_get_32 (abfd, note->descdata + 12);
410 elf_tdata (abfd)->core->program
411 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
412 elf_tdata (abfd)->core->command
413 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
414 break;
415
416 case 136: /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
417 elf_tdata (abfd)->core->pid
418 = bfd_get_32 (abfd, note->descdata + 24);
419 elf_tdata (abfd)->core->program
420 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
421 elf_tdata (abfd)->core->command
422 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
423 }
424
425 /* Note that for some reason, a spurious space is tacked
426 onto the end of the args in some (at least one anyway)
427 implementations, so strip it off if it exists. */
428
429 {
430 char *command = elf_tdata (abfd)->core->command;
431 int n = strlen (command);
432
433 if (0 < n && command[n - 1] == ' ')
434 command[n - 1] = '\0';
435 }
436
437 return TRUE;
438 }
439
440 #ifdef CORE_HEADER
441 static char *
442 elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
443 int note_type, ...)
444 {
445 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
446 va_list ap;
447 const char *fname, *psargs;
448 long pid;
449 int cursig;
450 const void *gregs;
451
452 switch (note_type)
453 {
454 default:
455 return NULL;
456
457 case NT_PRPSINFO:
458 va_start (ap, note_type);
459 fname = va_arg (ap, const char *);
460 psargs = va_arg (ap, const char *);
461 va_end (ap);
462
463 if (bed->s->elfclass == ELFCLASS32)
464 {
465 prpsinfo32_t data;
466 memset (&data, 0, sizeof (data));
467 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
468 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
469 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
470 &data, sizeof (data));
471 }
472 else
473 {
474 prpsinfo64_t data;
475 memset (&data, 0, sizeof (data));
476 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
477 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
478 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
479 &data, sizeof (data));
480 }
481 /* NOTREACHED */
482
483 case NT_PRSTATUS:
484 va_start (ap, note_type);
485 pid = va_arg (ap, long);
486 cursig = va_arg (ap, int);
487 gregs = va_arg (ap, const void *);
488 va_end (ap);
489
490 if (bed->s->elfclass == ELFCLASS32)
491 {
492 if (bed->elf_machine_code == EM_X86_64)
493 {
494 prstatusx32_t prstat;
495 memset (&prstat, 0, sizeof (prstat));
496 prstat.pr_pid = pid;
497 prstat.pr_cursig = cursig;
498 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
499 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
500 &prstat, sizeof (prstat));
501 }
502 else
503 {
504 prstatus32_t prstat;
505 memset (&prstat, 0, sizeof (prstat));
506 prstat.pr_pid = pid;
507 prstat.pr_cursig = cursig;
508 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
509 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
510 &prstat, sizeof (prstat));
511 }
512 }
513 else
514 {
515 prstatus64_t prstat;
516 memset (&prstat, 0, sizeof (prstat));
517 prstat.pr_pid = pid;
518 prstat.pr_cursig = cursig;
519 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
520 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
521 &prstat, sizeof (prstat));
522 }
523 }
524 /* NOTREACHED */
525 }
526 #endif
527 \f
528 /* Functions for the x86-64 ELF linker. */
529
530 /* The name of the dynamic interpreter. This is put in the .interp
531 section. */
532
533 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
534 #define ELF32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
535
536 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
537 copying dynamic variables from a shared lib into an app's dynbss
538 section, and instead use a dynamic relocation to point into the
539 shared lib. */
540 #define ELIMINATE_COPY_RELOCS 1
541
542 /* The size in bytes of an entry in the global offset table. */
543
544 #define GOT_ENTRY_SIZE 8
545
546 /* The size in bytes of an entry in the procedure linkage table. */
547
548 #define PLT_ENTRY_SIZE 16
549
550 /* The first entry in a procedure linkage table looks like this. See the
551 SVR4 ABI i386 supplement and the x86-64 ABI to see how this works. */
552
553 static const bfd_byte elf_x86_64_plt0_entry[PLT_ENTRY_SIZE] =
554 {
555 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
556 0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */
557 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */
558 };
559
560 /* Subsequent entries in a procedure linkage table look like this. */
561
562 static const bfd_byte elf_x86_64_plt_entry[PLT_ENTRY_SIZE] =
563 {
564 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
565 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
566 0x68, /* pushq immediate */
567 0, 0, 0, 0, /* replaced with index into relocation table. */
568 0xe9, /* jmp relative */
569 0, 0, 0, 0 /* replaced with offset to start of .plt0. */
570 };
571
572 /* The first entry in a procedure linkage table with BND relocations
573 like this. */
574
575 static const bfd_byte elf_x86_64_bnd_plt0_entry[PLT_ENTRY_SIZE] =
576 {
577 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
578 0xf2, 0xff, 0x25, 16, 0, 0, 0, /* bnd jmpq *GOT+16(%rip) */
579 0x0f, 0x1f, 0 /* nopl (%rax) */
580 };
581
582 /* Subsequent entries for legacy branches in a procedure linkage table
583 with BND relocations look like this. */
584
585 static const bfd_byte elf_x86_64_legacy_plt_entry[PLT_ENTRY_SIZE] =
586 {
587 0x68, 0, 0, 0, 0, /* pushq immediate */
588 0xe9, 0, 0, 0, 0, /* jmpq relative */
589 0x66, 0x0f, 0x1f, 0x44, 0, 0 /* nopw (%rax,%rax,1) */
590 };
591
592 /* Subsequent entries for branches with BND prefx in a procedure linkage
593 table with BND relocations look like this. */
594
595 static const bfd_byte elf_x86_64_bnd_plt_entry[PLT_ENTRY_SIZE] =
596 {
597 0x68, 0, 0, 0, 0, /* pushq immediate */
598 0xf2, 0xe9, 0, 0, 0, 0, /* bnd jmpq relative */
599 0x0f, 0x1f, 0x44, 0, 0 /* nopl 0(%rax,%rax,1) */
600 };
601
602 /* Entries for legacy branches in the second procedure linkage table
603 look like this. */
604
605 static const bfd_byte elf_x86_64_legacy_plt2_entry[8] =
606 {
607 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
608 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
609 0x66, 0x90 /* xchg %ax,%ax */
610 };
611
612 /* Entries for branches with BND prefix in the second procedure linkage
613 table look like this. */
614
615 static const bfd_byte elf_x86_64_bnd_plt2_entry[8] =
616 {
617 0xf2, 0xff, 0x25, /* bnd jmpq *name@GOTPC(%rip) */
618 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
619 0x90 /* nop */
620 };
621
622 /* .eh_frame covering the .plt section. */
623
624 static const bfd_byte elf_x86_64_eh_frame_plt[] =
625 {
626 #define PLT_CIE_LENGTH 20
627 #define PLT_FDE_LENGTH 36
628 #define PLT_FDE_START_OFFSET 4 + PLT_CIE_LENGTH + 8
629 #define PLT_FDE_LEN_OFFSET 4 + PLT_CIE_LENGTH + 12
630 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
631 0, 0, 0, 0, /* CIE ID */
632 1, /* CIE version */
633 'z', 'R', 0, /* Augmentation string */
634 1, /* Code alignment factor */
635 0x78, /* Data alignment factor */
636 16, /* Return address column */
637 1, /* Augmentation size */
638 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
639 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
640 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
641 DW_CFA_nop, DW_CFA_nop,
642
643 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
644 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
645 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
646 0, 0, 0, 0, /* .plt size goes here */
647 0, /* Augmentation size */
648 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
649 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
650 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
651 DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
652 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
653 11, /* Block length */
654 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
655 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
656 DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
657 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
658 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
659 };
660
661 /* Architecture-specific backend data for x86-64. */
662
663 struct elf_x86_64_backend_data
664 {
665 /* Templates for the initial PLT entry and for subsequent entries. */
666 const bfd_byte *plt0_entry;
667 const bfd_byte *plt_entry;
668 unsigned int plt_entry_size; /* Size of each PLT entry. */
669
670 /* Offsets into plt0_entry that are to be replaced with GOT[1] and GOT[2]. */
671 unsigned int plt0_got1_offset;
672 unsigned int plt0_got2_offset;
673
674 /* Offset of the end of the PC-relative instruction containing
675 plt0_got2_offset. */
676 unsigned int plt0_got2_insn_end;
677
678 /* Offsets into plt_entry that are to be replaced with... */
679 unsigned int plt_got_offset; /* ... address of this symbol in .got. */
680 unsigned int plt_reloc_offset; /* ... offset into relocation table. */
681 unsigned int plt_plt_offset; /* ... offset to start of .plt. */
682
683 /* Length of the PC-relative instruction containing plt_got_offset. */
684 unsigned int plt_got_insn_size;
685
686 /* Offset of the end of the PC-relative jump to plt0_entry. */
687 unsigned int plt_plt_insn_end;
688
689 /* Offset into plt_entry where the initial value of the GOT entry points. */
690 unsigned int plt_lazy_offset;
691
692 /* .eh_frame covering the .plt section. */
693 const bfd_byte *eh_frame_plt;
694 unsigned int eh_frame_plt_size;
695 };
696
697 #define get_elf_x86_64_arch_data(bed) \
698 ((const struct elf_x86_64_backend_data *) (bed)->arch_data)
699
700 #define get_elf_x86_64_backend_data(abfd) \
701 get_elf_x86_64_arch_data (get_elf_backend_data (abfd))
702
703 #define GET_PLT_ENTRY_SIZE(abfd) \
704 get_elf_x86_64_backend_data (abfd)->plt_entry_size
705
706 /* These are the standard parameters. */
707 static const struct elf_x86_64_backend_data elf_x86_64_arch_bed =
708 {
709 elf_x86_64_plt0_entry, /* plt0_entry */
710 elf_x86_64_plt_entry, /* plt_entry */
711 sizeof (elf_x86_64_plt_entry), /* plt_entry_size */
712 2, /* plt0_got1_offset */
713 8, /* plt0_got2_offset */
714 12, /* plt0_got2_insn_end */
715 2, /* plt_got_offset */
716 7, /* plt_reloc_offset */
717 12, /* plt_plt_offset */
718 6, /* plt_got_insn_size */
719 PLT_ENTRY_SIZE, /* plt_plt_insn_end */
720 6, /* plt_lazy_offset */
721 elf_x86_64_eh_frame_plt, /* eh_frame_plt */
722 sizeof (elf_x86_64_eh_frame_plt), /* eh_frame_plt_size */
723 };
724
725 static const struct elf_x86_64_backend_data elf_x86_64_bnd_arch_bed =
726 {
727 elf_x86_64_bnd_plt0_entry, /* plt0_entry */
728 elf_x86_64_bnd_plt_entry, /* plt_entry */
729 sizeof (elf_x86_64_bnd_plt_entry), /* plt_entry_size */
730 2, /* plt0_got1_offset */
731 1+8, /* plt0_got2_offset */
732 1+12, /* plt0_got2_insn_end */
733 1+2, /* plt_got_offset */
734 1, /* plt_reloc_offset */
735 7, /* plt_plt_offset */
736 1+6, /* plt_got_insn_size */
737 11, /* plt_plt_insn_end */
738 0, /* plt_lazy_offset */
739 elf_x86_64_eh_frame_plt, /* eh_frame_plt */
740 sizeof (elf_x86_64_eh_frame_plt), /* eh_frame_plt_size */
741 };
742
743 #define elf_backend_arch_data &elf_x86_64_arch_bed
744
745 /* Is a undefined weak symbol which is resolved to 0. Reference to an
746 undefined weak symbol is resolved to 0 when building executable if
747 it isn't dynamic and
748 1. Has non-GOT/non-PLT relocations in text section. Or
749 2. Has no GOT/PLT relocation.
750 */
751 #define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, EH) \
752 ((EH)->elf.root.type == bfd_link_hash_undefweak \
753 && bfd_link_executable (INFO) \
754 && (elf_x86_64_hash_table (INFO)->interp == NULL \
755 || !(EH)->has_got_reloc \
756 || (EH)->has_non_got_reloc \
757 || !(INFO)->dynamic_undefined_weak))
758
759 /* x86-64 ELF linker hash entry. */
760
761 struct elf_x86_64_link_hash_entry
762 {
763 struct elf_link_hash_entry elf;
764
765 /* Track dynamic relocs copied for this symbol. */
766 struct elf_dyn_relocs *dyn_relocs;
767
768 #define GOT_UNKNOWN 0
769 #define GOT_NORMAL 1
770 #define GOT_TLS_GD 2
771 #define GOT_TLS_IE 3
772 #define GOT_TLS_GDESC 4
773 #define GOT_TLS_GD_BOTH_P(type) \
774 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
775 #define GOT_TLS_GD_P(type) \
776 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
777 #define GOT_TLS_GDESC_P(type) \
778 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
779 #define GOT_TLS_GD_ANY_P(type) \
780 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
781 unsigned char tls_type;
782
783 /* TRUE if a weak symbol with a real definition needs a copy reloc.
784 When there is a weak symbol with a real definition, the processor
785 independent code will have arranged for us to see the real
786 definition first. We need to copy the needs_copy bit from the
787 real definition and check it when allowing copy reloc in PIE. */
788 unsigned int needs_copy : 1;
789
790 /* TRUE if symbol has at least one BND relocation. */
791 unsigned int has_bnd_reloc : 1;
792
793 /* TRUE if symbol has GOT or PLT relocations. */
794 unsigned int has_got_reloc : 1;
795
796 /* TRUE if symbol has non-GOT/non-PLT relocations in text sections. */
797 unsigned int has_non_got_reloc : 1;
798
799 /* Reference count of C/C++ function pointer relocations in read-write
800 section which can be resolved at run-time. */
801 bfd_signed_vma func_pointer_refcount;
802
803 /* Information about the GOT PLT entry. Filled when there are both
804 GOT and PLT relocations against the same function. */
805 union gotplt_union plt_got;
806
807 /* Information about the second PLT entry. Filled when has_bnd_reloc is
808 set. */
809 union gotplt_union plt_bnd;
810
811 /* Offset of the GOTPLT entry reserved for the TLS descriptor,
812 starting at the end of the jump table. */
813 bfd_vma tlsdesc_got;
814 };
815
816 #define elf_x86_64_hash_entry(ent) \
817 ((struct elf_x86_64_link_hash_entry *)(ent))
818
819 struct elf_x86_64_obj_tdata
820 {
821 struct elf_obj_tdata root;
822
823 /* tls_type for each local got entry. */
824 char *local_got_tls_type;
825
826 /* GOTPLT entries for TLS descriptors. */
827 bfd_vma *local_tlsdesc_gotent;
828 };
829
830 #define elf_x86_64_tdata(abfd) \
831 ((struct elf_x86_64_obj_tdata *) (abfd)->tdata.any)
832
833 #define elf_x86_64_local_got_tls_type(abfd) \
834 (elf_x86_64_tdata (abfd)->local_got_tls_type)
835
836 #define elf_x86_64_local_tlsdesc_gotent(abfd) \
837 (elf_x86_64_tdata (abfd)->local_tlsdesc_gotent)
838
839 #define is_x86_64_elf(bfd) \
840 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
841 && elf_tdata (bfd) != NULL \
842 && elf_object_id (bfd) == X86_64_ELF_DATA)
843
844 static bfd_boolean
845 elf_x86_64_mkobject (bfd *abfd)
846 {
847 return bfd_elf_allocate_object (abfd, sizeof (struct elf_x86_64_obj_tdata),
848 X86_64_ELF_DATA);
849 }
850
851 /* x86-64 ELF linker hash table. */
852
853 struct elf_x86_64_link_hash_table
854 {
855 struct elf_link_hash_table elf;
856
857 /* Short-cuts to get to dynamic linker sections. */
858 asection *interp;
859 asection *sdynbss;
860 asection *srelbss;
861 asection *plt_eh_frame;
862 asection *plt_bnd;
863 asection *plt_got;
864
865 union
866 {
867 bfd_signed_vma refcount;
868 bfd_vma offset;
869 } tls_ld_got;
870
871 /* The amount of space used by the jump slots in the GOT. */
872 bfd_vma sgotplt_jump_table_size;
873
874 /* Small local sym cache. */
875 struct sym_cache sym_cache;
876
877 bfd_vma (*r_info) (bfd_vma, bfd_vma);
878 bfd_vma (*r_sym) (bfd_vma);
879 unsigned int pointer_r_type;
880 const char *dynamic_interpreter;
881 int dynamic_interpreter_size;
882
883 /* _TLS_MODULE_BASE_ symbol. */
884 struct bfd_link_hash_entry *tls_module_base;
885
886 /* Used by local STT_GNU_IFUNC symbols. */
887 htab_t loc_hash_table;
888 void * loc_hash_memory;
889
890 /* The offset into splt of the PLT entry for the TLS descriptor
891 resolver. Special values are 0, if not necessary (or not found
892 to be necessary yet), and -1 if needed but not determined
893 yet. */
894 bfd_vma tlsdesc_plt;
895 /* The offset into sgot of the GOT entry used by the PLT entry
896 above. */
897 bfd_vma tlsdesc_got;
898
899 /* The index of the next R_X86_64_JUMP_SLOT entry in .rela.plt. */
900 bfd_vma next_jump_slot_index;
901 /* The index of the next R_X86_64_IRELATIVE entry in .rela.plt. */
902 bfd_vma next_irelative_index;
903
904 /* TRUE if there are dynamic relocs against IFUNC symbols that apply
905 to read-only sections. */
906 bfd_boolean readonly_dynrelocs_against_ifunc;
907 };
908
909 /* Get the x86-64 ELF linker hash table from a link_info structure. */
910
911 #define elf_x86_64_hash_table(p) \
912 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
913 == X86_64_ELF_DATA ? ((struct elf_x86_64_link_hash_table *) ((p)->hash)) : NULL)
914
915 #define elf_x86_64_compute_jump_table_size(htab) \
916 ((htab)->elf.srelplt->reloc_count * GOT_ENTRY_SIZE)
917
918 /* Create an entry in an x86-64 ELF linker hash table. */
919
920 static struct bfd_hash_entry *
921 elf_x86_64_link_hash_newfunc (struct bfd_hash_entry *entry,
922 struct bfd_hash_table *table,
923 const char *string)
924 {
925 /* Allocate the structure if it has not already been allocated by a
926 subclass. */
927 if (entry == NULL)
928 {
929 entry = (struct bfd_hash_entry *)
930 bfd_hash_allocate (table,
931 sizeof (struct elf_x86_64_link_hash_entry));
932 if (entry == NULL)
933 return entry;
934 }
935
936 /* Call the allocation method of the superclass. */
937 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
938 if (entry != NULL)
939 {
940 struct elf_x86_64_link_hash_entry *eh;
941
942 eh = (struct elf_x86_64_link_hash_entry *) entry;
943 eh->dyn_relocs = NULL;
944 eh->tls_type = GOT_UNKNOWN;
945 eh->needs_copy = 0;
946 eh->has_bnd_reloc = 0;
947 eh->has_got_reloc = 0;
948 eh->has_non_got_reloc = 0;
949 eh->func_pointer_refcount = 0;
950 eh->plt_bnd.offset = (bfd_vma) -1;
951 eh->plt_got.offset = (bfd_vma) -1;
952 eh->tlsdesc_got = (bfd_vma) -1;
953 }
954
955 return entry;
956 }
957
958 /* Compute a hash of a local hash entry. We use elf_link_hash_entry
959 for local symbol so that we can handle local STT_GNU_IFUNC symbols
960 as global symbol. We reuse indx and dynstr_index for local symbol
961 hash since they aren't used by global symbols in this backend. */
962
963 static hashval_t
964 elf_x86_64_local_htab_hash (const void *ptr)
965 {
966 struct elf_link_hash_entry *h
967 = (struct elf_link_hash_entry *) ptr;
968 return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
969 }
970
971 /* Compare local hash entries. */
972
973 static int
974 elf_x86_64_local_htab_eq (const void *ptr1, const void *ptr2)
975 {
976 struct elf_link_hash_entry *h1
977 = (struct elf_link_hash_entry *) ptr1;
978 struct elf_link_hash_entry *h2
979 = (struct elf_link_hash_entry *) ptr2;
980
981 return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
982 }
983
984 /* Find and/or create a hash entry for local symbol. */
985
986 static struct elf_link_hash_entry *
987 elf_x86_64_get_local_sym_hash (struct elf_x86_64_link_hash_table *htab,
988 bfd *abfd, const Elf_Internal_Rela *rel,
989 bfd_boolean create)
990 {
991 struct elf_x86_64_link_hash_entry e, *ret;
992 asection *sec = abfd->sections;
993 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
994 htab->r_sym (rel->r_info));
995 void **slot;
996
997 e.elf.indx = sec->id;
998 e.elf.dynstr_index = htab->r_sym (rel->r_info);
999 slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
1000 create ? INSERT : NO_INSERT);
1001
1002 if (!slot)
1003 return NULL;
1004
1005 if (*slot)
1006 {
1007 ret = (struct elf_x86_64_link_hash_entry *) *slot;
1008 return &ret->elf;
1009 }
1010
1011 ret = (struct elf_x86_64_link_hash_entry *)
1012 objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
1013 sizeof (struct elf_x86_64_link_hash_entry));
1014 if (ret)
1015 {
1016 memset (ret, 0, sizeof (*ret));
1017 ret->elf.indx = sec->id;
1018 ret->elf.dynstr_index = htab->r_sym (rel->r_info);
1019 ret->elf.dynindx = -1;
1020 ret->func_pointer_refcount = 0;
1021 ret->plt_got.offset = (bfd_vma) -1;
1022 *slot = ret;
1023 }
1024 return &ret->elf;
1025 }
1026
1027 /* Destroy an X86-64 ELF linker hash table. */
1028
1029 static void
1030 elf_x86_64_link_hash_table_free (bfd *obfd)
1031 {
1032 struct elf_x86_64_link_hash_table *htab
1033 = (struct elf_x86_64_link_hash_table *) obfd->link.hash;
1034
1035 if (htab->loc_hash_table)
1036 htab_delete (htab->loc_hash_table);
1037 if (htab->loc_hash_memory)
1038 objalloc_free ((struct objalloc *) htab->loc_hash_memory);
1039 _bfd_elf_link_hash_table_free (obfd);
1040 }
1041
1042 /* Create an X86-64 ELF linker hash table. */
1043
1044 static struct bfd_link_hash_table *
1045 elf_x86_64_link_hash_table_create (bfd *abfd)
1046 {
1047 struct elf_x86_64_link_hash_table *ret;
1048 bfd_size_type amt = sizeof (struct elf_x86_64_link_hash_table);
1049
1050 ret = (struct elf_x86_64_link_hash_table *) bfd_zmalloc (amt);
1051 if (ret == NULL)
1052 return NULL;
1053
1054 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
1055 elf_x86_64_link_hash_newfunc,
1056 sizeof (struct elf_x86_64_link_hash_entry),
1057 X86_64_ELF_DATA))
1058 {
1059 free (ret);
1060 return NULL;
1061 }
1062
1063 if (ABI_64_P (abfd))
1064 {
1065 ret->r_info = elf64_r_info;
1066 ret->r_sym = elf64_r_sym;
1067 ret->pointer_r_type = R_X86_64_64;
1068 ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
1069 ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
1070 }
1071 else
1072 {
1073 ret->r_info = elf32_r_info;
1074 ret->r_sym = elf32_r_sym;
1075 ret->pointer_r_type = R_X86_64_32;
1076 ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
1077 ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER;
1078 }
1079
1080 ret->loc_hash_table = htab_try_create (1024,
1081 elf_x86_64_local_htab_hash,
1082 elf_x86_64_local_htab_eq,
1083 NULL);
1084 ret->loc_hash_memory = objalloc_create ();
1085 if (!ret->loc_hash_table || !ret->loc_hash_memory)
1086 {
1087 elf_x86_64_link_hash_table_free (abfd);
1088 return NULL;
1089 }
1090 ret->elf.root.hash_table_free = elf_x86_64_link_hash_table_free;
1091
1092 return &ret->elf.root;
1093 }
1094
1095 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
1096 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
1097 hash table. */
1098
1099 static bfd_boolean
1100 elf_x86_64_create_dynamic_sections (bfd *dynobj,
1101 struct bfd_link_info *info)
1102 {
1103 struct elf_x86_64_link_hash_table *htab;
1104
1105 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1106 return FALSE;
1107
1108 htab = elf_x86_64_hash_table (info);
1109 if (htab == NULL)
1110 return FALSE;
1111
1112 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
1113 if (!htab->sdynbss)
1114 abort ();
1115
1116 if (bfd_link_executable (info))
1117 {
1118 /* Always allow copy relocs for building executables. */
1119 asection *s = bfd_get_linker_section (dynobj, ".rela.bss");
1120 if (s == NULL)
1121 {
1122 const struct elf_backend_data *bed = get_elf_backend_data (dynobj);
1123 s = bfd_make_section_anyway_with_flags (dynobj,
1124 ".rela.bss",
1125 (bed->dynamic_sec_flags
1126 | SEC_READONLY));
1127 if (s == NULL
1128 || ! bfd_set_section_alignment (dynobj, s,
1129 bed->s->log_file_align))
1130 return FALSE;
1131 }
1132 htab->srelbss = s;
1133 }
1134
1135 if (!info->no_ld_generated_unwind_info
1136 && htab->plt_eh_frame == NULL
1137 && htab->elf.splt != NULL)
1138 {
1139 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
1140 | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1141 | SEC_LINKER_CREATED);
1142 htab->plt_eh_frame
1143 = bfd_make_section_anyway_with_flags (dynobj, ".eh_frame", flags);
1144 if (htab->plt_eh_frame == NULL
1145 || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 3))
1146 return FALSE;
1147 }
1148 return TRUE;
1149 }
1150
1151 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1152
1153 static void
1154 elf_x86_64_copy_indirect_symbol (struct bfd_link_info *info,
1155 struct elf_link_hash_entry *dir,
1156 struct elf_link_hash_entry *ind)
1157 {
1158 struct elf_x86_64_link_hash_entry *edir, *eind;
1159
1160 edir = (struct elf_x86_64_link_hash_entry *) dir;
1161 eind = (struct elf_x86_64_link_hash_entry *) ind;
1162
1163 if (!edir->has_bnd_reloc)
1164 edir->has_bnd_reloc = eind->has_bnd_reloc;
1165
1166 if (!edir->has_got_reloc)
1167 edir->has_got_reloc = eind->has_got_reloc;
1168
1169 if (!edir->has_non_got_reloc)
1170 edir->has_non_got_reloc = eind->has_non_got_reloc;
1171
1172 if (eind->dyn_relocs != NULL)
1173 {
1174 if (edir->dyn_relocs != NULL)
1175 {
1176 struct elf_dyn_relocs **pp;
1177 struct elf_dyn_relocs *p;
1178
1179 /* Add reloc counts against the indirect sym to the direct sym
1180 list. Merge any entries against the same section. */
1181 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1182 {
1183 struct elf_dyn_relocs *q;
1184
1185 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1186 if (q->sec == p->sec)
1187 {
1188 q->pc_count += p->pc_count;
1189 q->count += p->count;
1190 *pp = p->next;
1191 break;
1192 }
1193 if (q == NULL)
1194 pp = &p->next;
1195 }
1196 *pp = edir->dyn_relocs;
1197 }
1198
1199 edir->dyn_relocs = eind->dyn_relocs;
1200 eind->dyn_relocs = NULL;
1201 }
1202
1203 if (ind->root.type == bfd_link_hash_indirect
1204 && dir->got.refcount <= 0)
1205 {
1206 edir->tls_type = eind->tls_type;
1207 eind->tls_type = GOT_UNKNOWN;
1208 }
1209
1210 if (ELIMINATE_COPY_RELOCS
1211 && ind->root.type != bfd_link_hash_indirect
1212 && dir->dynamic_adjusted)
1213 {
1214 /* If called to transfer flags for a weakdef during processing
1215 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1216 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1217 dir->ref_dynamic |= ind->ref_dynamic;
1218 dir->ref_regular |= ind->ref_regular;
1219 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1220 dir->needs_plt |= ind->needs_plt;
1221 dir->pointer_equality_needed |= ind->pointer_equality_needed;
1222 }
1223 else
1224 {
1225 if (eind->func_pointer_refcount > 0)
1226 {
1227 edir->func_pointer_refcount += eind->func_pointer_refcount;
1228 eind->func_pointer_refcount = 0;
1229 }
1230
1231 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1232 }
1233 }
1234
1235 static bfd_boolean
1236 elf64_x86_64_elf_object_p (bfd *abfd)
1237 {
1238 /* Set the right machine number for an x86-64 elf64 file. */
1239 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
1240 return TRUE;
1241 }
1242
1243 static bfd_boolean
1244 elf32_x86_64_elf_object_p (bfd *abfd)
1245 {
1246 /* Set the right machine number for an x86-64 elf32 file. */
1247 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32);
1248 return TRUE;
1249 }
1250
1251 /* Return TRUE if the TLS access code sequence support transition
1252 from R_TYPE. */
1253
1254 static bfd_boolean
1255 elf_x86_64_check_tls_transition (bfd *abfd,
1256 struct bfd_link_info *info,
1257 asection *sec,
1258 bfd_byte *contents,
1259 Elf_Internal_Shdr *symtab_hdr,
1260 struct elf_link_hash_entry **sym_hashes,
1261 unsigned int r_type,
1262 const Elf_Internal_Rela *rel,
1263 const Elf_Internal_Rela *relend)
1264 {
1265 unsigned int val;
1266 unsigned long r_symndx;
1267 bfd_boolean largepic = FALSE;
1268 struct elf_link_hash_entry *h;
1269 bfd_vma offset;
1270 struct elf_x86_64_link_hash_table *htab;
1271
1272 /* Get the section contents. */
1273 if (contents == NULL)
1274 {
1275 if (elf_section_data (sec)->this_hdr.contents != NULL)
1276 contents = elf_section_data (sec)->this_hdr.contents;
1277 else
1278 {
1279 /* FIXME: How to better handle error condition? */
1280 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1281 return FALSE;
1282
1283 /* Cache the section contents for elf_link_input_bfd. */
1284 elf_section_data (sec)->this_hdr.contents = contents;
1285 }
1286 }
1287
1288 htab = elf_x86_64_hash_table (info);
1289 offset = rel->r_offset;
1290 switch (r_type)
1291 {
1292 case R_X86_64_TLSGD:
1293 case R_X86_64_TLSLD:
1294 if ((rel + 1) >= relend)
1295 return FALSE;
1296
1297 if (r_type == R_X86_64_TLSGD)
1298 {
1299 /* Check transition from GD access model. For 64bit, only
1300 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
1301 .word 0x6666; rex64; call __tls_get_addr
1302 can transit to different access model. For 32bit, only
1303 leaq foo@tlsgd(%rip), %rdi
1304 .word 0x6666; rex64; call __tls_get_addr
1305 can transit to different access model. For largepic
1306 we also support:
1307 leaq foo@tlsgd(%rip), %rdi
1308 movabsq $__tls_get_addr@pltoff, %rax
1309 addq $rbx, %rax
1310 call *%rax. */
1311
1312 static const unsigned char call[] = { 0x66, 0x66, 0x48, 0xe8 };
1313 static const unsigned char leaq[] = { 0x66, 0x48, 0x8d, 0x3d };
1314
1315 if ((offset + 12) > sec->size)
1316 return FALSE;
1317
1318 if (memcmp (contents + offset + 4, call, 4) != 0)
1319 {
1320 if (!ABI_64_P (abfd)
1321 || (offset + 19) > sec->size
1322 || offset < 3
1323 || memcmp (contents + offset - 3, leaq + 1, 3) != 0
1324 || memcmp (contents + offset + 4, "\x48\xb8", 2) != 0
1325 || memcmp (contents + offset + 14, "\x48\x01\xd8\xff\xd0", 5)
1326 != 0)
1327 return FALSE;
1328 largepic = TRUE;
1329 }
1330 else if (ABI_64_P (abfd))
1331 {
1332 if (offset < 4
1333 || memcmp (contents + offset - 4, leaq, 4) != 0)
1334 return FALSE;
1335 }
1336 else
1337 {
1338 if (offset < 3
1339 || memcmp (contents + offset - 3, leaq + 1, 3) != 0)
1340 return FALSE;
1341 }
1342 }
1343 else
1344 {
1345 /* Check transition from LD access model. Only
1346 leaq foo@tlsld(%rip), %rdi;
1347 call __tls_get_addr
1348 can transit to different access model. For largepic
1349 we also support:
1350 leaq foo@tlsld(%rip), %rdi
1351 movabsq $__tls_get_addr@pltoff, %rax
1352 addq $rbx, %rax
1353 call *%rax. */
1354
1355 static const unsigned char lea[] = { 0x48, 0x8d, 0x3d };
1356
1357 if (offset < 3 || (offset + 9) > sec->size)
1358 return FALSE;
1359
1360 if (memcmp (contents + offset - 3, lea, 3) != 0)
1361 return FALSE;
1362
1363 if (0xe8 != *(contents + offset + 4))
1364 {
1365 if (!ABI_64_P (abfd)
1366 || (offset + 19) > sec->size
1367 || memcmp (contents + offset + 4, "\x48\xb8", 2) != 0
1368 || memcmp (contents + offset + 14, "\x48\x01\xd8\xff\xd0", 5)
1369 != 0)
1370 return FALSE;
1371 largepic = TRUE;
1372 }
1373 }
1374
1375 r_symndx = htab->r_sym (rel[1].r_info);
1376 if (r_symndx < symtab_hdr->sh_info)
1377 return FALSE;
1378
1379 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1380 /* Use strncmp to check __tls_get_addr since __tls_get_addr
1381 may be versioned. */
1382 return (h != NULL
1383 && h->root.root.string != NULL
1384 && (largepic
1385 ? ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLTOFF64
1386 : (ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PC32
1387 || ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLT32))
1388 && (strncmp (h->root.root.string,
1389 "__tls_get_addr", 14) == 0));
1390
1391 case R_X86_64_GOTTPOFF:
1392 /* Check transition from IE access model:
1393 mov foo@gottpoff(%rip), %reg
1394 add foo@gottpoff(%rip), %reg
1395 */
1396
1397 /* Check REX prefix first. */
1398 if (offset >= 3 && (offset + 4) <= sec->size)
1399 {
1400 val = bfd_get_8 (abfd, contents + offset - 3);
1401 if (val != 0x48 && val != 0x4c)
1402 {
1403 /* X32 may have 0x44 REX prefix or no REX prefix. */
1404 if (ABI_64_P (abfd))
1405 return FALSE;
1406 }
1407 }
1408 else
1409 {
1410 /* X32 may not have any REX prefix. */
1411 if (ABI_64_P (abfd))
1412 return FALSE;
1413 if (offset < 2 || (offset + 3) > sec->size)
1414 return FALSE;
1415 }
1416
1417 val = bfd_get_8 (abfd, contents + offset - 2);
1418 if (val != 0x8b && val != 0x03)
1419 return FALSE;
1420
1421 val = bfd_get_8 (abfd, contents + offset - 1);
1422 return (val & 0xc7) == 5;
1423
1424 case R_X86_64_GOTPC32_TLSDESC:
1425 /* Check transition from GDesc access model:
1426 leaq x@tlsdesc(%rip), %rax
1427
1428 Make sure it's a leaq adding rip to a 32-bit offset
1429 into any register, although it's probably almost always
1430 going to be rax. */
1431
1432 if (offset < 3 || (offset + 4) > sec->size)
1433 return FALSE;
1434
1435 val = bfd_get_8 (abfd, contents + offset - 3);
1436 if ((val & 0xfb) != 0x48)
1437 return FALSE;
1438
1439 if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1440 return FALSE;
1441
1442 val = bfd_get_8 (abfd, contents + offset - 1);
1443 return (val & 0xc7) == 0x05;
1444
1445 case R_X86_64_TLSDESC_CALL:
1446 /* Check transition from GDesc access model:
1447 call *x@tlsdesc(%rax)
1448 */
1449 if (offset + 2 <= sec->size)
1450 {
1451 /* Make sure that it's a call *x@tlsdesc(%rax). */
1452 static const unsigned char call[] = { 0xff, 0x10 };
1453 return memcmp (contents + offset, call, 2) == 0;
1454 }
1455
1456 return FALSE;
1457
1458 default:
1459 abort ();
1460 }
1461 }
1462
1463 /* Return TRUE if the TLS access transition is OK or no transition
1464 will be performed. Update R_TYPE if there is a transition. */
1465
1466 static bfd_boolean
1467 elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
1468 asection *sec, bfd_byte *contents,
1469 Elf_Internal_Shdr *symtab_hdr,
1470 struct elf_link_hash_entry **sym_hashes,
1471 unsigned int *r_type, int tls_type,
1472 const Elf_Internal_Rela *rel,
1473 const Elf_Internal_Rela *relend,
1474 struct elf_link_hash_entry *h,
1475 unsigned long r_symndx)
1476 {
1477 unsigned int from_type = *r_type;
1478 unsigned int to_type = from_type;
1479 bfd_boolean check = TRUE;
1480
1481 /* Skip TLS transition for functions. */
1482 if (h != NULL
1483 && (h->type == STT_FUNC
1484 || h->type == STT_GNU_IFUNC))
1485 return TRUE;
1486
1487 switch (from_type)
1488 {
1489 case R_X86_64_TLSGD:
1490 case R_X86_64_GOTPC32_TLSDESC:
1491 case R_X86_64_TLSDESC_CALL:
1492 case R_X86_64_GOTTPOFF:
1493 if (bfd_link_executable (info))
1494 {
1495 if (h == NULL)
1496 to_type = R_X86_64_TPOFF32;
1497 else
1498 to_type = R_X86_64_GOTTPOFF;
1499 }
1500
1501 /* When we are called from elf_x86_64_relocate_section,
1502 CONTENTS isn't NULL and there may be additional transitions
1503 based on TLS_TYPE. */
1504 if (contents != NULL)
1505 {
1506 unsigned int new_to_type = to_type;
1507
1508 if (bfd_link_executable (info)
1509 && h != NULL
1510 && h->dynindx == -1
1511 && tls_type == GOT_TLS_IE)
1512 new_to_type = R_X86_64_TPOFF32;
1513
1514 if (to_type == R_X86_64_TLSGD
1515 || to_type == R_X86_64_GOTPC32_TLSDESC
1516 || to_type == R_X86_64_TLSDESC_CALL)
1517 {
1518 if (tls_type == GOT_TLS_IE)
1519 new_to_type = R_X86_64_GOTTPOFF;
1520 }
1521
1522 /* We checked the transition before when we were called from
1523 elf_x86_64_check_relocs. We only want to check the new
1524 transition which hasn't been checked before. */
1525 check = new_to_type != to_type && from_type == to_type;
1526 to_type = new_to_type;
1527 }
1528
1529 break;
1530
1531 case R_X86_64_TLSLD:
1532 if (bfd_link_executable (info))
1533 to_type = R_X86_64_TPOFF32;
1534 break;
1535
1536 default:
1537 return TRUE;
1538 }
1539
1540 /* Return TRUE if there is no transition. */
1541 if (from_type == to_type)
1542 return TRUE;
1543
1544 /* Check if the transition can be performed. */
1545 if (check
1546 && ! elf_x86_64_check_tls_transition (abfd, info, sec, contents,
1547 symtab_hdr, sym_hashes,
1548 from_type, rel, relend))
1549 {
1550 reloc_howto_type *from, *to;
1551 const char *name;
1552
1553 from = elf_x86_64_rtype_to_howto (abfd, from_type);
1554 to = elf_x86_64_rtype_to_howto (abfd, to_type);
1555
1556 if (h)
1557 name = h->root.root.string;
1558 else
1559 {
1560 struct elf_x86_64_link_hash_table *htab;
1561
1562 htab = elf_x86_64_hash_table (info);
1563 if (htab == NULL)
1564 name = "*unknown*";
1565 else
1566 {
1567 Elf_Internal_Sym *isym;
1568
1569 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1570 abfd, r_symndx);
1571 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1572 }
1573 }
1574
1575 (*_bfd_error_handler)
1576 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1577 "in section `%A' failed"),
1578 abfd, sec, from->name, to->name, name,
1579 (unsigned long) rel->r_offset);
1580 bfd_set_error (bfd_error_bad_value);
1581 return FALSE;
1582 }
1583
1584 *r_type = to_type;
1585 return TRUE;
1586 }
1587
1588 /* Rename some of the generic section flags to better document how they
1589 are used here. */
1590 #define need_convert_load sec_flg0
1591 #define check_relocs_failed sec_flg1
1592
1593 static bfd_boolean
1594 elf_x86_64_need_pic (bfd *input_bfd, asection *sec,
1595 struct elf_link_hash_entry *h,
1596 Elf_Internal_Shdr *symtab_hdr,
1597 Elf_Internal_Sym *isym,
1598 reloc_howto_type *howto)
1599 {
1600 const char *v = "";
1601 const char *und = "";
1602 const char *pic = "";
1603
1604 const char *name;
1605 if (h)
1606 {
1607 name = h->root.root.string;
1608 switch (ELF_ST_VISIBILITY (h->other))
1609 {
1610 case STV_HIDDEN:
1611 v = _("hidden symbol ");
1612 break;
1613 case STV_INTERNAL:
1614 v = _("internal symbol ");
1615 break;
1616 case STV_PROTECTED:
1617 v = _("protected symbol ");
1618 break;
1619 default:
1620 v = _("symbol ");
1621 pic = _("; recompile with -fPIC");
1622 break;
1623 }
1624
1625 if (!h->def_regular && !h->def_dynamic)
1626 und = _("undefined ");
1627 }
1628 else
1629 {
1630 name = bfd_elf_sym_name (input_bfd, symtab_hdr, isym, NULL);
1631 pic = _("; recompile with -fPIC");
1632 }
1633
1634 (*_bfd_error_handler) (_("%B: relocation %s against %s%s`%s' can "
1635 "not be used when making a shared object%s"),
1636 input_bfd, howto->name, und, v, name, pic);
1637 bfd_set_error (bfd_error_bad_value);
1638 sec->check_relocs_failed = 1;
1639 return FALSE;
1640 }
1641
1642 /* Look through the relocs for a section during the first phase, and
1643 calculate needed space in the global offset table, procedure
1644 linkage table, and dynamic reloc sections. */
1645
1646 static bfd_boolean
1647 elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
1648 asection *sec,
1649 const Elf_Internal_Rela *relocs)
1650 {
1651 struct elf_x86_64_link_hash_table *htab;
1652 Elf_Internal_Shdr *symtab_hdr;
1653 struct elf_link_hash_entry **sym_hashes;
1654 const Elf_Internal_Rela *rel;
1655 const Elf_Internal_Rela *rel_end;
1656 asection *sreloc;
1657 bfd_boolean use_plt_got;
1658
1659 if (bfd_link_relocatable (info))
1660 return TRUE;
1661
1662 BFD_ASSERT (is_x86_64_elf (abfd));
1663
1664 htab = elf_x86_64_hash_table (info);
1665 if (htab == NULL)
1666 return FALSE;
1667
1668 use_plt_got = get_elf_x86_64_backend_data (abfd) == &elf_x86_64_arch_bed;
1669
1670 symtab_hdr = &elf_symtab_hdr (abfd);
1671 sym_hashes = elf_sym_hashes (abfd);
1672
1673 sreloc = NULL;
1674
1675 rel_end = relocs + sec->reloc_count;
1676 for (rel = relocs; rel < rel_end; rel++)
1677 {
1678 unsigned int r_type;
1679 unsigned long r_symndx;
1680 struct elf_link_hash_entry *h;
1681 struct elf_x86_64_link_hash_entry *eh;
1682 Elf_Internal_Sym *isym;
1683 const char *name;
1684 bfd_boolean size_reloc;
1685
1686 r_symndx = htab->r_sym (rel->r_info);
1687 r_type = ELF32_R_TYPE (rel->r_info);
1688
1689 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1690 {
1691 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1692 abfd, r_symndx);
1693 return FALSE;
1694 }
1695
1696 if (r_symndx < symtab_hdr->sh_info)
1697 {
1698 /* A local symbol. */
1699 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1700 abfd, r_symndx);
1701 if (isym == NULL)
1702 return FALSE;
1703
1704 /* Check relocation against local STT_GNU_IFUNC symbol. */
1705 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1706 {
1707 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel,
1708 TRUE);
1709 if (h == NULL)
1710 return FALSE;
1711
1712 /* Fake a STT_GNU_IFUNC symbol. */
1713 h->type = STT_GNU_IFUNC;
1714 h->def_regular = 1;
1715 h->ref_regular = 1;
1716 h->forced_local = 1;
1717 h->root.type = bfd_link_hash_defined;
1718 }
1719 else
1720 h = NULL;
1721 }
1722 else
1723 {
1724 isym = NULL;
1725 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1726 while (h->root.type == bfd_link_hash_indirect
1727 || h->root.type == bfd_link_hash_warning)
1728 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1729 }
1730
1731 /* Check invalid x32 relocations. */
1732 if (!ABI_64_P (abfd))
1733 switch (r_type)
1734 {
1735 default:
1736 break;
1737
1738 case R_X86_64_DTPOFF64:
1739 case R_X86_64_TPOFF64:
1740 case R_X86_64_PC64:
1741 case R_X86_64_GOTOFF64:
1742 case R_X86_64_GOT64:
1743 case R_X86_64_GOTPCREL64:
1744 case R_X86_64_GOTPC64:
1745 case R_X86_64_GOTPLT64:
1746 case R_X86_64_PLTOFF64:
1747 {
1748 if (h)
1749 name = h->root.root.string;
1750 else
1751 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1752 NULL);
1753 (*_bfd_error_handler)
1754 (_("%B: relocation %s against symbol `%s' isn't "
1755 "supported in x32 mode"), abfd,
1756 x86_64_elf_howto_table[r_type].name, name);
1757 bfd_set_error (bfd_error_bad_value);
1758 return FALSE;
1759 }
1760 break;
1761 }
1762
1763 if (h != NULL)
1764 {
1765 switch (r_type)
1766 {
1767 default:
1768 break;
1769
1770 case R_X86_64_PC32_BND:
1771 case R_X86_64_PLT32_BND:
1772 case R_X86_64_PC32:
1773 case R_X86_64_PLT32:
1774 case R_X86_64_32:
1775 case R_X86_64_64:
1776 /* MPX PLT is supported only if elf_x86_64_arch_bed
1777 is used in 64-bit mode. */
1778 if (ABI_64_P (abfd)
1779 && info->bndplt
1780 && (get_elf_x86_64_backend_data (abfd)
1781 == &elf_x86_64_arch_bed))
1782 {
1783 elf_x86_64_hash_entry (h)->has_bnd_reloc = 1;
1784
1785 /* Create the second PLT for Intel MPX support. */
1786 if (htab->plt_bnd == NULL)
1787 {
1788 unsigned int plt_bnd_align;
1789 const struct elf_backend_data *bed;
1790
1791 bed = get_elf_backend_data (info->output_bfd);
1792 BFD_ASSERT (sizeof (elf_x86_64_bnd_plt2_entry) == 8
1793 && (sizeof (elf_x86_64_bnd_plt2_entry)
1794 == sizeof (elf_x86_64_legacy_plt2_entry)));
1795 plt_bnd_align = 3;
1796
1797 if (htab->elf.dynobj == NULL)
1798 htab->elf.dynobj = abfd;
1799 htab->plt_bnd
1800 = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
1801 ".plt.bnd",
1802 (bed->dynamic_sec_flags
1803 | SEC_ALLOC
1804 | SEC_CODE
1805 | SEC_LOAD
1806 | SEC_READONLY));
1807 if (htab->plt_bnd == NULL
1808 || !bfd_set_section_alignment (htab->elf.dynobj,
1809 htab->plt_bnd,
1810 plt_bnd_align))
1811 return FALSE;
1812 }
1813 }
1814
1815 case R_X86_64_32S:
1816 case R_X86_64_PC64:
1817 case R_X86_64_GOTPCREL:
1818 case R_X86_64_GOTPCRELX:
1819 case R_X86_64_REX_GOTPCRELX:
1820 case R_X86_64_GOTPCREL64:
1821 if (htab->elf.dynobj == NULL)
1822 htab->elf.dynobj = abfd;
1823 /* Create the ifunc sections for static executables. */
1824 if (h->type == STT_GNU_IFUNC
1825 && !_bfd_elf_create_ifunc_sections (htab->elf.dynobj,
1826 info))
1827 return FALSE;
1828 break;
1829 }
1830
1831 /* It is referenced by a non-shared object. */
1832 h->ref_regular = 1;
1833 h->root.non_ir_ref = 1;
1834
1835 if (h->type == STT_GNU_IFUNC)
1836 elf_tdata (info->output_bfd)->has_gnu_symbols
1837 |= elf_gnu_symbol_ifunc;
1838 }
1839
1840 if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
1841 symtab_hdr, sym_hashes,
1842 &r_type, GOT_UNKNOWN,
1843 rel, rel_end, h, r_symndx))
1844 return FALSE;
1845
1846 eh = (struct elf_x86_64_link_hash_entry *) h;
1847 switch (r_type)
1848 {
1849 case R_X86_64_TLSLD:
1850 htab->tls_ld_got.refcount += 1;
1851 goto create_got;
1852
1853 case R_X86_64_TPOFF32:
1854 if (!bfd_link_executable (info) && ABI_64_P (abfd))
1855 return elf_x86_64_need_pic (abfd, sec, h, symtab_hdr, isym,
1856 &x86_64_elf_howto_table[r_type]);
1857 if (eh != NULL)
1858 eh->has_got_reloc = 1;
1859 break;
1860
1861 case R_X86_64_GOTTPOFF:
1862 if (!bfd_link_executable (info))
1863 info->flags |= DF_STATIC_TLS;
1864 /* Fall through */
1865
1866 case R_X86_64_GOT32:
1867 case R_X86_64_GOTPCREL:
1868 case R_X86_64_GOTPCRELX:
1869 case R_X86_64_REX_GOTPCRELX:
1870 case R_X86_64_TLSGD:
1871 case R_X86_64_GOT64:
1872 case R_X86_64_GOTPCREL64:
1873 case R_X86_64_GOTPLT64:
1874 case R_X86_64_GOTPC32_TLSDESC:
1875 case R_X86_64_TLSDESC_CALL:
1876 /* This symbol requires a global offset table entry. */
1877 {
1878 int tls_type, old_tls_type;
1879
1880 switch (r_type)
1881 {
1882 default: tls_type = GOT_NORMAL; break;
1883 case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break;
1884 case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break;
1885 case R_X86_64_GOTPC32_TLSDESC:
1886 case R_X86_64_TLSDESC_CALL:
1887 tls_type = GOT_TLS_GDESC; break;
1888 }
1889
1890 if (h != NULL)
1891 {
1892 h->got.refcount += 1;
1893 old_tls_type = eh->tls_type;
1894 }
1895 else
1896 {
1897 bfd_signed_vma *local_got_refcounts;
1898
1899 /* This is a global offset table entry for a local symbol. */
1900 local_got_refcounts = elf_local_got_refcounts (abfd);
1901 if (local_got_refcounts == NULL)
1902 {
1903 bfd_size_type size;
1904
1905 size = symtab_hdr->sh_info;
1906 size *= sizeof (bfd_signed_vma)
1907 + sizeof (bfd_vma) + sizeof (char);
1908 local_got_refcounts = ((bfd_signed_vma *)
1909 bfd_zalloc (abfd, size));
1910 if (local_got_refcounts == NULL)
1911 return FALSE;
1912 elf_local_got_refcounts (abfd) = local_got_refcounts;
1913 elf_x86_64_local_tlsdesc_gotent (abfd)
1914 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
1915 elf_x86_64_local_got_tls_type (abfd)
1916 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
1917 }
1918 local_got_refcounts[r_symndx] += 1;
1919 old_tls_type
1920 = elf_x86_64_local_got_tls_type (abfd) [r_symndx];
1921 }
1922
1923 /* If a TLS symbol is accessed using IE at least once,
1924 there is no point to use dynamic model for it. */
1925 if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1926 && (! GOT_TLS_GD_ANY_P (old_tls_type)
1927 || tls_type != GOT_TLS_IE))
1928 {
1929 if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type))
1930 tls_type = old_tls_type;
1931 else if (GOT_TLS_GD_ANY_P (old_tls_type)
1932 && GOT_TLS_GD_ANY_P (tls_type))
1933 tls_type |= old_tls_type;
1934 else
1935 {
1936 if (h)
1937 name = h->root.root.string;
1938 else
1939 name = bfd_elf_sym_name (abfd, symtab_hdr,
1940 isym, NULL);
1941 (*_bfd_error_handler)
1942 (_("%B: '%s' accessed both as normal and thread local symbol"),
1943 abfd, name);
1944 bfd_set_error (bfd_error_bad_value);
1945 return FALSE;
1946 }
1947 }
1948
1949 if (old_tls_type != tls_type)
1950 {
1951 if (eh != NULL)
1952 eh->tls_type = tls_type;
1953 else
1954 elf_x86_64_local_got_tls_type (abfd) [r_symndx] = tls_type;
1955 }
1956 }
1957 /* Fall through */
1958
1959 case R_X86_64_GOTOFF64:
1960 case R_X86_64_GOTPC32:
1961 case R_X86_64_GOTPC64:
1962 create_got:
1963 if (eh != NULL)
1964 eh->has_got_reloc = 1;
1965 if (htab->elf.sgot == NULL)
1966 {
1967 if (htab->elf.dynobj == NULL)
1968 htab->elf.dynobj = abfd;
1969 if (!_bfd_elf_create_got_section (htab->elf.dynobj,
1970 info))
1971 return FALSE;
1972 }
1973 break;
1974
1975 case R_X86_64_PLT32:
1976 case R_X86_64_PLT32_BND:
1977 /* This symbol requires a procedure linkage table entry. We
1978 actually build the entry in adjust_dynamic_symbol,
1979 because this might be a case of linking PIC code which is
1980 never referenced by a dynamic object, in which case we
1981 don't need to generate a procedure linkage table entry
1982 after all. */
1983
1984 /* If this is a local symbol, we resolve it directly without
1985 creating a procedure linkage table entry. */
1986 if (h == NULL)
1987 continue;
1988
1989 eh->has_got_reloc = 1;
1990 h->needs_plt = 1;
1991 h->plt.refcount += 1;
1992 break;
1993
1994 case R_X86_64_PLTOFF64:
1995 /* This tries to form the 'address' of a function relative
1996 to GOT. For global symbols we need a PLT entry. */
1997 if (h != NULL)
1998 {
1999 h->needs_plt = 1;
2000 h->plt.refcount += 1;
2001 }
2002 goto create_got;
2003
2004 case R_X86_64_SIZE32:
2005 case R_X86_64_SIZE64:
2006 size_reloc = TRUE;
2007 goto do_size;
2008
2009 case R_X86_64_32:
2010 if (!ABI_64_P (abfd))
2011 goto pointer;
2012 case R_X86_64_8:
2013 case R_X86_64_16:
2014 case R_X86_64_32S:
2015 /* Check relocation overflow as these relocs may lead to
2016 run-time relocation overflow. Don't error out for
2017 sections we don't care about, such as debug sections or
2018 when relocation overflow check is disabled. */
2019 if (!info->no_reloc_overflow_check
2020 && (bfd_link_pic (info)
2021 || (bfd_link_executable (info)
2022 && h != NULL
2023 && !h->def_regular
2024 && h->def_dynamic
2025 && (sec->flags & SEC_READONLY) == 0))
2026 && (sec->flags & SEC_ALLOC) != 0)
2027 return elf_x86_64_need_pic (abfd, sec, h, symtab_hdr, isym,
2028 &x86_64_elf_howto_table[r_type]);
2029 /* Fall through. */
2030
2031 case R_X86_64_PC8:
2032 case R_X86_64_PC16:
2033 case R_X86_64_PC32:
2034 case R_X86_64_PC32_BND:
2035 case R_X86_64_PC64:
2036 case R_X86_64_64:
2037 pointer:
2038 if (eh != NULL && (sec->flags & SEC_CODE) != 0)
2039 eh->has_non_got_reloc = 1;
2040 /* STT_GNU_IFUNC symbol must go through PLT even if it is
2041 locally defined and undefined symbol may turn out to be
2042 a STT_GNU_IFUNC symbol later. */
2043 if (h != NULL
2044 && (bfd_link_executable (info)
2045 || ((h->type == STT_GNU_IFUNC
2046 || h->root.type == bfd_link_hash_undefweak
2047 || h->root.type == bfd_link_hash_undefined)
2048 && SYMBOLIC_BIND (info, h))))
2049 {
2050 /* If this reloc is in a read-only section, we might
2051 need a copy reloc. We can't check reliably at this
2052 stage whether the section is read-only, as input
2053 sections have not yet been mapped to output sections.
2054 Tentatively set the flag for now, and correct in
2055 adjust_dynamic_symbol. */
2056 h->non_got_ref = 1;
2057
2058 /* We may need a .plt entry if the function this reloc
2059 refers to is in a shared lib. */
2060 h->plt.refcount += 1;
2061 if (r_type == R_X86_64_PC32)
2062 {
2063 /* Since something like ".long foo - ." may be used
2064 as pointer, make sure that PLT is used if foo is
2065 a function defined in a shared library. */
2066 if ((sec->flags & SEC_CODE) == 0)
2067 h->pointer_equality_needed = 1;
2068 }
2069 else if (r_type != R_X86_64_PC32_BND
2070 && r_type != R_X86_64_PC64)
2071 {
2072 h->pointer_equality_needed = 1;
2073 /* At run-time, R_X86_64_64 can be resolved for both
2074 x86-64 and x32. But R_X86_64_32 and R_X86_64_32S
2075 can only be resolved for x32. */
2076 if ((sec->flags & SEC_READONLY) == 0
2077 && (r_type == R_X86_64_64
2078 || (!ABI_64_P (abfd)
2079 && (r_type == R_X86_64_32
2080 || r_type == R_X86_64_32S))))
2081 eh->func_pointer_refcount += 1;
2082 }
2083 }
2084
2085 size_reloc = FALSE;
2086 do_size:
2087 /* If we are creating a shared library, and this is a reloc
2088 against a global symbol, or a non PC relative reloc
2089 against a local symbol, then we need to copy the reloc
2090 into the shared library. However, if we are linking with
2091 -Bsymbolic, we do not need to copy a reloc against a
2092 global symbol which is defined in an object we are
2093 including in the link (i.e., DEF_REGULAR is set). At
2094 this point we have not seen all the input files, so it is
2095 possible that DEF_REGULAR is not set now but will be set
2096 later (it is never cleared). In case of a weak definition,
2097 DEF_REGULAR may be cleared later by a strong definition in
2098 a shared library. We account for that possibility below by
2099 storing information in the relocs_copied field of the hash
2100 table entry. A similar situation occurs when creating
2101 shared libraries and symbol visibility changes render the
2102 symbol local.
2103
2104 If on the other hand, we are creating an executable, we
2105 may need to keep relocations for symbols satisfied by a
2106 dynamic library if we manage to avoid copy relocs for the
2107 symbol. */
2108 if ((bfd_link_pic (info)
2109 && (sec->flags & SEC_ALLOC) != 0
2110 && (! IS_X86_64_PCREL_TYPE (r_type)
2111 || (h != NULL
2112 && (! (bfd_link_pie (info)
2113 || SYMBOLIC_BIND (info, h))
2114 || h->root.type == bfd_link_hash_defweak
2115 || !h->def_regular))))
2116 || (ELIMINATE_COPY_RELOCS
2117 && !bfd_link_pic (info)
2118 && (sec->flags & SEC_ALLOC) != 0
2119 && h != NULL
2120 && (h->root.type == bfd_link_hash_defweak
2121 || !h->def_regular)))
2122 {
2123 struct elf_dyn_relocs *p;
2124 struct elf_dyn_relocs **head;
2125
2126 /* We must copy these reloc types into the output file.
2127 Create a reloc section in dynobj and make room for
2128 this reloc. */
2129 if (sreloc == NULL)
2130 {
2131 if (htab->elf.dynobj == NULL)
2132 htab->elf.dynobj = abfd;
2133
2134 sreloc = _bfd_elf_make_dynamic_reloc_section
2135 (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2,
2136 abfd, /*rela?*/ TRUE);
2137
2138 if (sreloc == NULL)
2139 return FALSE;
2140 }
2141
2142 /* If this is a global symbol, we count the number of
2143 relocations we need for this symbol. */
2144 if (h != NULL)
2145 head = &eh->dyn_relocs;
2146 else
2147 {
2148 /* Track dynamic relocs needed for local syms too.
2149 We really need local syms available to do this
2150 easily. Oh well. */
2151 asection *s;
2152 void **vpp;
2153
2154 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2155 abfd, r_symndx);
2156 if (isym == NULL)
2157 return FALSE;
2158
2159 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2160 if (s == NULL)
2161 s = sec;
2162
2163 /* Beware of type punned pointers vs strict aliasing
2164 rules. */
2165 vpp = &(elf_section_data (s)->local_dynrel);
2166 head = (struct elf_dyn_relocs **)vpp;
2167 }
2168
2169 p = *head;
2170 if (p == NULL || p->sec != sec)
2171 {
2172 bfd_size_type amt = sizeof *p;
2173
2174 p = ((struct elf_dyn_relocs *)
2175 bfd_alloc (htab->elf.dynobj, amt));
2176 if (p == NULL)
2177 return FALSE;
2178 p->next = *head;
2179 *head = p;
2180 p->sec = sec;
2181 p->count = 0;
2182 p->pc_count = 0;
2183 }
2184
2185 p->count += 1;
2186 /* Count size relocation as PC-relative relocation. */
2187 if (IS_X86_64_PCREL_TYPE (r_type) || size_reloc)
2188 p->pc_count += 1;
2189 }
2190 break;
2191
2192 /* This relocation describes the C++ object vtable hierarchy.
2193 Reconstruct it for later use during GC. */
2194 case R_X86_64_GNU_VTINHERIT:
2195 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2196 return FALSE;
2197 break;
2198
2199 /* This relocation describes which C++ vtable entries are actually
2200 used. Record for later use during GC. */
2201 case R_X86_64_GNU_VTENTRY:
2202 BFD_ASSERT (h != NULL);
2203 if (h != NULL
2204 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2205 return FALSE;
2206 break;
2207
2208 default:
2209 break;
2210 }
2211
2212 if (use_plt_got
2213 && h != NULL
2214 && h->plt.refcount > 0
2215 && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
2216 || h->got.refcount > 0)
2217 && htab->plt_got == NULL)
2218 {
2219 /* Create the GOT procedure linkage table. */
2220 unsigned int plt_got_align;
2221 const struct elf_backend_data *bed;
2222
2223 bed = get_elf_backend_data (info->output_bfd);
2224 BFD_ASSERT (sizeof (elf_x86_64_legacy_plt2_entry) == 8
2225 && (sizeof (elf_x86_64_bnd_plt2_entry)
2226 == sizeof (elf_x86_64_legacy_plt2_entry)));
2227 plt_got_align = 3;
2228
2229 if (htab->elf.dynobj == NULL)
2230 htab->elf.dynobj = abfd;
2231 htab->plt_got
2232 = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2233 ".plt.got",
2234 (bed->dynamic_sec_flags
2235 | SEC_ALLOC
2236 | SEC_CODE
2237 | SEC_LOAD
2238 | SEC_READONLY));
2239 if (htab->plt_got == NULL
2240 || !bfd_set_section_alignment (htab->elf.dynobj,
2241 htab->plt_got,
2242 plt_got_align))
2243 return FALSE;
2244 }
2245
2246 if ((r_type == R_X86_64_GOTPCREL
2247 || r_type == R_X86_64_GOTPCRELX
2248 || r_type == R_X86_64_REX_GOTPCRELX)
2249 && (h == NULL || h->type != STT_GNU_IFUNC))
2250 sec->need_convert_load = 1;
2251 }
2252
2253 return TRUE;
2254 }
2255
2256 /* Return the section that should be marked against GC for a given
2257 relocation. */
2258
2259 static asection *
2260 elf_x86_64_gc_mark_hook (asection *sec,
2261 struct bfd_link_info *info,
2262 Elf_Internal_Rela *rel,
2263 struct elf_link_hash_entry *h,
2264 Elf_Internal_Sym *sym)
2265 {
2266 if (h != NULL)
2267 switch (ELF32_R_TYPE (rel->r_info))
2268 {
2269 case R_X86_64_GNU_VTINHERIT:
2270 case R_X86_64_GNU_VTENTRY:
2271 return NULL;
2272 }
2273
2274 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2275 }
2276
2277 /* Remove undefined weak symbol from the dynamic symbol table if it
2278 is resolved to 0. */
2279
2280 static bfd_boolean
2281 elf_x86_64_fixup_symbol (struct bfd_link_info *info,
2282 struct elf_link_hash_entry *h)
2283 {
2284 if (h->dynindx != -1
2285 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
2286 elf_x86_64_hash_entry (h)))
2287 {
2288 h->dynindx = -1;
2289 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2290 h->dynstr_index);
2291 }
2292 return TRUE;
2293 }
2294
2295 /* Adjust a symbol defined by a dynamic object and referenced by a
2296 regular object. The current definition is in some section of the
2297 dynamic object, but we're not including those sections. We have to
2298 change the definition to something the rest of the link can
2299 understand. */
2300
2301 static bfd_boolean
2302 elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
2303 struct elf_link_hash_entry *h)
2304 {
2305 struct elf_x86_64_link_hash_table *htab;
2306 asection *s;
2307 struct elf_x86_64_link_hash_entry *eh;
2308 struct elf_dyn_relocs *p;
2309
2310 /* STT_GNU_IFUNC symbol must go through PLT. */
2311 if (h->type == STT_GNU_IFUNC)
2312 {
2313 /* All local STT_GNU_IFUNC references must be treate as local
2314 calls via local PLT. */
2315 if (h->ref_regular
2316 && SYMBOL_CALLS_LOCAL (info, h))
2317 {
2318 bfd_size_type pc_count = 0, count = 0;
2319 struct elf_dyn_relocs **pp;
2320
2321 eh = (struct elf_x86_64_link_hash_entry *) h;
2322 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2323 {
2324 pc_count += p->pc_count;
2325 p->count -= p->pc_count;
2326 p->pc_count = 0;
2327 count += p->count;
2328 if (p->count == 0)
2329 *pp = p->next;
2330 else
2331 pp = &p->next;
2332 }
2333
2334 if (pc_count || count)
2335 {
2336 h->needs_plt = 1;
2337 h->non_got_ref = 1;
2338 if (h->plt.refcount <= 0)
2339 h->plt.refcount = 1;
2340 else
2341 h->plt.refcount += 1;
2342 }
2343 }
2344
2345 if (h->plt.refcount <= 0)
2346 {
2347 h->plt.offset = (bfd_vma) -1;
2348 h->needs_plt = 0;
2349 }
2350 return TRUE;
2351 }
2352
2353 /* If this is a function, put it in the procedure linkage table. We
2354 will fill in the contents of the procedure linkage table later,
2355 when we know the address of the .got section. */
2356 if (h->type == STT_FUNC
2357 || h->needs_plt)
2358 {
2359 if (h->plt.refcount <= 0
2360 || SYMBOL_CALLS_LOCAL (info, h)
2361 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2362 && h->root.type == bfd_link_hash_undefweak))
2363 {
2364 /* This case can occur if we saw a PLT32 reloc in an input
2365 file, but the symbol was never referred to by a dynamic
2366 object, or if all references were garbage collected. In
2367 such a case, we don't actually need to build a procedure
2368 linkage table, and we can just do a PC32 reloc instead. */
2369 h->plt.offset = (bfd_vma) -1;
2370 h->needs_plt = 0;
2371 }
2372
2373 return TRUE;
2374 }
2375 else
2376 /* It's possible that we incorrectly decided a .plt reloc was
2377 needed for an R_X86_64_PC32 reloc to a non-function sym in
2378 check_relocs. We can't decide accurately between function and
2379 non-function syms in check-relocs; Objects loaded later in
2380 the link may change h->type. So fix it now. */
2381 h->plt.offset = (bfd_vma) -1;
2382
2383 /* If this is a weak symbol, and there is a real definition, the
2384 processor independent code will have arranged for us to see the
2385 real definition first, and we can just use the same value. */
2386 if (h->u.weakdef != NULL)
2387 {
2388 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2389 || h->u.weakdef->root.type == bfd_link_hash_defweak);
2390 h->root.u.def.section = h->u.weakdef->root.u.def.section;
2391 h->root.u.def.value = h->u.weakdef->root.u.def.value;
2392 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2393 {
2394 eh = (struct elf_x86_64_link_hash_entry *) h;
2395 h->non_got_ref = h->u.weakdef->non_got_ref;
2396 eh->needs_copy = h->u.weakdef->needs_copy;
2397 }
2398 return TRUE;
2399 }
2400
2401 /* This is a reference to a symbol defined by a dynamic object which
2402 is not a function. */
2403
2404 /* If we are creating a shared library, we must presume that the
2405 only references to the symbol are via the global offset table.
2406 For such cases we need not do anything here; the relocations will
2407 be handled correctly by relocate_section. */
2408 if (!bfd_link_executable (info))
2409 return TRUE;
2410
2411 /* If there are no references to this symbol that do not use the
2412 GOT, we don't need to generate a copy reloc. */
2413 if (!h->non_got_ref)
2414 return TRUE;
2415
2416 /* If -z nocopyreloc was given, we won't generate them either. */
2417 if (info->nocopyreloc)
2418 {
2419 h->non_got_ref = 0;
2420 return TRUE;
2421 }
2422
2423 if (ELIMINATE_COPY_RELOCS)
2424 {
2425 eh = (struct elf_x86_64_link_hash_entry *) h;
2426 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2427 {
2428 s = p->sec->output_section;
2429 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2430 break;
2431 }
2432
2433 /* If we didn't find any dynamic relocs in read-only sections, then
2434 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
2435 if (p == NULL)
2436 {
2437 h->non_got_ref = 0;
2438 return TRUE;
2439 }
2440 }
2441
2442 /* We must allocate the symbol in our .dynbss section, which will
2443 become part of the .bss section of the executable. There will be
2444 an entry for this symbol in the .dynsym section. The dynamic
2445 object will contain position independent code, so all references
2446 from the dynamic object to this symbol will go through the global
2447 offset table. The dynamic linker will use the .dynsym entry to
2448 determine the address it must put in the global offset table, so
2449 both the dynamic object and the regular object will refer to the
2450 same memory location for the variable. */
2451
2452 htab = elf_x86_64_hash_table (info);
2453 if (htab == NULL)
2454 return FALSE;
2455
2456 /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
2457 to copy the initial value out of the dynamic object and into the
2458 runtime process image. */
2459 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2460 {
2461 const struct elf_backend_data *bed;
2462 bed = get_elf_backend_data (info->output_bfd);
2463 htab->srelbss->size += bed->s->sizeof_rela;
2464 h->needs_copy = 1;
2465 }
2466
2467 s = htab->sdynbss;
2468
2469 return _bfd_elf_adjust_dynamic_copy (info, h, s);
2470 }
2471
2472 /* Allocate space in .plt, .got and associated reloc sections for
2473 dynamic relocs. */
2474
2475 static bfd_boolean
2476 elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2477 {
2478 struct bfd_link_info *info;
2479 struct elf_x86_64_link_hash_table *htab;
2480 struct elf_x86_64_link_hash_entry *eh;
2481 struct elf_dyn_relocs *p;
2482 const struct elf_backend_data *bed;
2483 unsigned int plt_entry_size;
2484 bfd_boolean resolved_to_zero;
2485
2486 if (h->root.type == bfd_link_hash_indirect)
2487 return TRUE;
2488
2489 eh = (struct elf_x86_64_link_hash_entry *) h;
2490
2491 info = (struct bfd_link_info *) inf;
2492 htab = elf_x86_64_hash_table (info);
2493 if (htab == NULL)
2494 return FALSE;
2495 bed = get_elf_backend_data (info->output_bfd);
2496 plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2497
2498 resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
2499
2500 /* We can't use the GOT PLT if pointer equality is needed since
2501 finish_dynamic_symbol won't clear symbol value and the dynamic
2502 linker won't update the GOT slot. We will get into an infinite
2503 loop at run-time. */
2504 if (htab->plt_got != NULL
2505 && h->type != STT_GNU_IFUNC
2506 && !h->pointer_equality_needed
2507 && h->plt.refcount > 0
2508 && h->got.refcount > 0)
2509 {
2510 /* Don't use the regular PLT if there are both GOT and GOTPLT
2511 reloctions. */
2512 h->plt.offset = (bfd_vma) -1;
2513
2514 /* Use the GOT PLT. */
2515 eh->plt_got.refcount = 1;
2516 }
2517
2518 /* Clear the reference count of function pointer relocations if
2519 symbol isn't a normal function. */
2520 if (h->type != STT_FUNC)
2521 eh->func_pointer_refcount = 0;
2522
2523 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2524 here if it is defined and referenced in a non-shared object. */
2525 if (h->type == STT_GNU_IFUNC
2526 && h->def_regular)
2527 {
2528 if (_bfd_elf_allocate_ifunc_dyn_relocs (info, h,
2529 &eh->dyn_relocs,
2530 &htab->readonly_dynrelocs_against_ifunc,
2531 plt_entry_size,
2532 plt_entry_size,
2533 GOT_ENTRY_SIZE))
2534 {
2535 asection *s = htab->plt_bnd;
2536 if (h->plt.offset != (bfd_vma) -1 && s != NULL)
2537 {
2538 /* Use the .plt.bnd section if it is created. */
2539 eh->plt_bnd.offset = s->size;
2540
2541 /* Make room for this entry in the .plt.bnd section. */
2542 s->size += sizeof (elf_x86_64_legacy_plt2_entry);
2543 }
2544
2545 return TRUE;
2546 }
2547 else
2548 return FALSE;
2549 }
2550 /* Don't create the PLT entry if there are only function pointer
2551 relocations which can be resolved at run-time. */
2552 else if (htab->elf.dynamic_sections_created
2553 && (h->plt.refcount > eh->func_pointer_refcount
2554 || eh->plt_got.refcount > 0))
2555 {
2556 bfd_boolean use_plt_got;
2557
2558 /* Clear the reference count of function pointer relocations
2559 if PLT is used. */
2560 eh->func_pointer_refcount = 0;
2561
2562 if ((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
2563 {
2564 /* Don't use the regular PLT for DF_BIND_NOW. */
2565 h->plt.offset = (bfd_vma) -1;
2566
2567 /* Use the GOT PLT. */
2568 h->got.refcount = 1;
2569 eh->plt_got.refcount = 1;
2570 }
2571
2572 use_plt_got = eh->plt_got.refcount > 0;
2573
2574 /* Make sure this symbol is output as a dynamic symbol.
2575 Undefined weak syms won't yet be marked as dynamic. */
2576 if (h->dynindx == -1
2577 && !h->forced_local
2578 && !resolved_to_zero)
2579 {
2580 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2581 return FALSE;
2582 }
2583
2584 if (bfd_link_pic (info)
2585 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2586 {
2587 asection *s = htab->elf.splt;
2588 asection *bnd_s = htab->plt_bnd;
2589 asection *got_s = htab->plt_got;
2590
2591 /* If this is the first .plt entry, make room for the special
2592 first entry. The .plt section is used by prelink to undo
2593 prelinking for dynamic relocations. */
2594 if (s->size == 0)
2595 s->size = plt_entry_size;
2596
2597 if (use_plt_got)
2598 eh->plt_got.offset = got_s->size;
2599 else
2600 {
2601 h->plt.offset = s->size;
2602 if (bnd_s)
2603 eh->plt_bnd.offset = bnd_s->size;
2604 }
2605
2606 /* If this symbol is not defined in a regular file, and we are
2607 not generating a shared library, then set the symbol to this
2608 location in the .plt. This is required to make function
2609 pointers compare as equal between the normal executable and
2610 the shared library. */
2611 if (! bfd_link_pic (info)
2612 && !h->def_regular)
2613 {
2614 if (use_plt_got)
2615 {
2616 /* We need to make a call to the entry of the GOT PLT
2617 instead of regular PLT entry. */
2618 h->root.u.def.section = got_s;
2619 h->root.u.def.value = eh->plt_got.offset;
2620 }
2621 else
2622 {
2623 if (bnd_s)
2624 {
2625 /* We need to make a call to the entry of the second
2626 PLT instead of regular PLT entry. */
2627 h->root.u.def.section = bnd_s;
2628 h->root.u.def.value = eh->plt_bnd.offset;
2629 }
2630 else
2631 {
2632 h->root.u.def.section = s;
2633 h->root.u.def.value = h->plt.offset;
2634 }
2635 }
2636 }
2637
2638 /* Make room for this entry. */
2639 if (use_plt_got)
2640 got_s->size += sizeof (elf_x86_64_legacy_plt2_entry);
2641 else
2642 {
2643 s->size += plt_entry_size;
2644 if (bnd_s)
2645 bnd_s->size += sizeof (elf_x86_64_legacy_plt2_entry);
2646
2647 /* We also need to make an entry in the .got.plt section,
2648 which will be placed in the .got section by the linker
2649 script. */
2650 htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
2651
2652 /* There should be no PLT relocation against resolved
2653 undefined weak symbol in executable. */
2654 if (!resolved_to_zero)
2655 {
2656 /* We also need to make an entry in the .rela.plt
2657 section. */
2658 htab->elf.srelplt->size += bed->s->sizeof_rela;
2659 htab->elf.srelplt->reloc_count++;
2660 }
2661 }
2662 }
2663 else
2664 {
2665 eh->plt_got.offset = (bfd_vma) -1;
2666 h->plt.offset = (bfd_vma) -1;
2667 h->needs_plt = 0;
2668 }
2669 }
2670 else
2671 {
2672 eh->plt_got.offset = (bfd_vma) -1;
2673 h->plt.offset = (bfd_vma) -1;
2674 h->needs_plt = 0;
2675 }
2676
2677 eh->tlsdesc_got = (bfd_vma) -1;
2678
2679 /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
2680 make it a R_X86_64_TPOFF32 requiring no GOT entry. */
2681 if (h->got.refcount > 0
2682 && bfd_link_executable (info)
2683 && h->dynindx == -1
2684 && elf_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE)
2685 {
2686 h->got.offset = (bfd_vma) -1;
2687 }
2688 else if (h->got.refcount > 0)
2689 {
2690 asection *s;
2691 bfd_boolean dyn;
2692 int tls_type = elf_x86_64_hash_entry (h)->tls_type;
2693
2694 /* Make sure this symbol is output as a dynamic symbol.
2695 Undefined weak syms won't yet be marked as dynamic. */
2696 if (h->dynindx == -1
2697 && !h->forced_local
2698 && !resolved_to_zero)
2699 {
2700 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2701 return FALSE;
2702 }
2703
2704 if (GOT_TLS_GDESC_P (tls_type))
2705 {
2706 eh->tlsdesc_got = htab->elf.sgotplt->size
2707 - elf_x86_64_compute_jump_table_size (htab);
2708 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
2709 h->got.offset = (bfd_vma) -2;
2710 }
2711 if (! GOT_TLS_GDESC_P (tls_type)
2712 || GOT_TLS_GD_P (tls_type))
2713 {
2714 s = htab->elf.sgot;
2715 h->got.offset = s->size;
2716 s->size += GOT_ENTRY_SIZE;
2717 if (GOT_TLS_GD_P (tls_type))
2718 s->size += GOT_ENTRY_SIZE;
2719 }
2720 dyn = htab->elf.dynamic_sections_created;
2721 /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
2722 and two if global. R_X86_64_GOTTPOFF needs one dynamic
2723 relocation. No dynamic relocation against resolved undefined
2724 weak symbol in executable. */
2725 if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2726 || tls_type == GOT_TLS_IE)
2727 htab->elf.srelgot->size += bed->s->sizeof_rela;
2728 else if (GOT_TLS_GD_P (tls_type))
2729 htab->elf.srelgot->size += 2 * bed->s->sizeof_rela;
2730 else if (! GOT_TLS_GDESC_P (tls_type)
2731 && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2732 && !resolved_to_zero)
2733 || h->root.type != bfd_link_hash_undefweak)
2734 && (bfd_link_pic (info)
2735 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2736 htab->elf.srelgot->size += bed->s->sizeof_rela;
2737 if (GOT_TLS_GDESC_P (tls_type))
2738 {
2739 htab->elf.srelplt->size += bed->s->sizeof_rela;
2740 htab->tlsdesc_plt = (bfd_vma) -1;
2741 }
2742 }
2743 else
2744 h->got.offset = (bfd_vma) -1;
2745
2746 if (eh->dyn_relocs == NULL)
2747 return TRUE;
2748
2749 /* In the shared -Bsymbolic case, discard space allocated for
2750 dynamic pc-relative relocs against symbols which turn out to be
2751 defined in regular objects. For the normal shared case, discard
2752 space for pc-relative relocs that have become local due to symbol
2753 visibility changes. */
2754
2755 if (bfd_link_pic (info))
2756 {
2757 /* Relocs that use pc_count are those that appear on a call
2758 insn, or certain REL relocs that can generated via assembly.
2759 We want calls to protected symbols to resolve directly to the
2760 function rather than going via the plt. If people want
2761 function pointer comparisons to work as expected then they
2762 should avoid writing weird assembly. */
2763 if (SYMBOL_CALLS_LOCAL (info, h))
2764 {
2765 struct elf_dyn_relocs **pp;
2766
2767 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2768 {
2769 p->count -= p->pc_count;
2770 p->pc_count = 0;
2771 if (p->count == 0)
2772 *pp = p->next;
2773 else
2774 pp = &p->next;
2775 }
2776 }
2777
2778 /* Also discard relocs on undefined weak syms with non-default
2779 visibility or in PIE. */
2780 if (eh->dyn_relocs != NULL)
2781 {
2782 if (h->root.type == bfd_link_hash_undefweak)
2783 {
2784 /* Undefined weak symbol is never bound locally in shared
2785 library. */
2786 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2787 || resolved_to_zero)
2788 eh->dyn_relocs = NULL;
2789 else if (h->dynindx == -1
2790 && ! h->forced_local
2791 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2792 return FALSE;
2793 }
2794 /* For PIE, discard space for pc-relative relocs against
2795 symbols which turn out to need copy relocs. */
2796 else if (bfd_link_executable (info)
2797 && (h->needs_copy || eh->needs_copy)
2798 && h->def_dynamic
2799 && !h->def_regular)
2800 {
2801 struct elf_dyn_relocs **pp;
2802
2803 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2804 {
2805 if (p->pc_count != 0)
2806 *pp = p->next;
2807 else
2808 pp = &p->next;
2809 }
2810 }
2811 }
2812 }
2813 else if (ELIMINATE_COPY_RELOCS)
2814 {
2815 /* For the non-shared case, discard space for relocs against
2816 symbols which turn out to need copy relocs or are not
2817 dynamic. Keep dynamic relocations for run-time function
2818 pointer initialization. */
2819
2820 if ((!h->non_got_ref
2821 || eh->func_pointer_refcount > 0
2822 || (h->root.type == bfd_link_hash_undefweak
2823 && !resolved_to_zero))
2824 && ((h->def_dynamic
2825 && !h->def_regular)
2826 || (htab->elf.dynamic_sections_created
2827 && (h->root.type == bfd_link_hash_undefweak
2828 || h->root.type == bfd_link_hash_undefined))))
2829 {
2830 /* Make sure this symbol is output as a dynamic symbol.
2831 Undefined weak syms won't yet be marked as dynamic. */
2832 if (h->dynindx == -1
2833 && ! h->forced_local
2834 && ! resolved_to_zero
2835 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2836 return FALSE;
2837
2838 /* If that succeeded, we know we'll be keeping all the
2839 relocs. */
2840 if (h->dynindx != -1)
2841 goto keep;
2842 }
2843
2844 eh->dyn_relocs = NULL;
2845 eh->func_pointer_refcount = 0;
2846
2847 keep: ;
2848 }
2849
2850 /* Finally, allocate space. */
2851 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2852 {
2853 asection * sreloc;
2854
2855 sreloc = elf_section_data (p->sec)->sreloc;
2856
2857 BFD_ASSERT (sreloc != NULL);
2858
2859 sreloc->size += p->count * bed->s->sizeof_rela;
2860 }
2861
2862 return TRUE;
2863 }
2864
2865 /* Allocate space in .plt, .got and associated reloc sections for
2866 local dynamic relocs. */
2867
2868 static bfd_boolean
2869 elf_x86_64_allocate_local_dynrelocs (void **slot, void *inf)
2870 {
2871 struct elf_link_hash_entry *h
2872 = (struct elf_link_hash_entry *) *slot;
2873
2874 if (h->type != STT_GNU_IFUNC
2875 || !h->def_regular
2876 || !h->ref_regular
2877 || !h->forced_local
2878 || h->root.type != bfd_link_hash_defined)
2879 abort ();
2880
2881 return elf_x86_64_allocate_dynrelocs (h, inf);
2882 }
2883
2884 /* Find any dynamic relocs that apply to read-only sections. */
2885
2886 static bfd_boolean
2887 elf_x86_64_readonly_dynrelocs (struct elf_link_hash_entry *h,
2888 void * inf)
2889 {
2890 struct elf_x86_64_link_hash_entry *eh;
2891 struct elf_dyn_relocs *p;
2892
2893 /* Skip local IFUNC symbols. */
2894 if (h->forced_local && h->type == STT_GNU_IFUNC)
2895 return TRUE;
2896
2897 eh = (struct elf_x86_64_link_hash_entry *) h;
2898 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2899 {
2900 asection *s = p->sec->output_section;
2901
2902 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2903 {
2904 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2905
2906 info->flags |= DF_TEXTREL;
2907
2908 if ((info->warn_shared_textrel && bfd_link_pic (info))
2909 || info->error_textrel)
2910 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
2911 p->sec->owner, h->root.root.string,
2912 p->sec);
2913
2914 /* Not an error, just cut short the traversal. */
2915 return FALSE;
2916 }
2917 }
2918 return TRUE;
2919 }
2920
2921 /* With the local symbol, foo, we convert
2922 mov foo@GOTPCREL(%rip), %reg
2923 to
2924 lea foo(%rip), %reg
2925 and convert
2926 call/jmp *foo@GOTPCREL(%rip)
2927 to
2928 nop call foo/jmp foo nop
2929 When PIC is false, convert
2930 test %reg, foo@GOTPCREL(%rip)
2931 to
2932 test $foo, %reg
2933 and convert
2934 binop foo@GOTPCREL(%rip), %reg
2935 to
2936 binop $foo, %reg
2937 where binop is one of adc, add, and, cmp, or, sbb, sub, xor
2938 instructions. */
2939
2940 static bfd_boolean
2941 elf_x86_64_convert_load (bfd *abfd, asection *sec,
2942 struct bfd_link_info *link_info)
2943 {
2944 Elf_Internal_Shdr *symtab_hdr;
2945 Elf_Internal_Rela *internal_relocs;
2946 Elf_Internal_Rela *irel, *irelend;
2947 bfd_byte *contents;
2948 struct elf_x86_64_link_hash_table *htab;
2949 bfd_boolean changed_contents;
2950 bfd_boolean changed_relocs;
2951 bfd_signed_vma *local_got_refcounts;
2952 bfd_vma maxpagesize;
2953 bfd_boolean is_pic;
2954 bfd_boolean require_reloc_pc32;
2955
2956 /* Don't even try to convert non-ELF outputs. */
2957 if (!is_elf_hash_table (link_info->hash))
2958 return FALSE;
2959
2960 /* Nothing to do if there is no need or no output. */
2961 if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
2962 || sec->need_convert_load == 0
2963 || bfd_is_abs_section (sec->output_section))
2964 return TRUE;
2965
2966 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2967
2968 /* Load the relocations for this section. */
2969 internal_relocs = (_bfd_elf_link_read_relocs
2970 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2971 link_info->keep_memory));
2972 if (internal_relocs == NULL)
2973 return FALSE;
2974
2975 htab = elf_x86_64_hash_table (link_info);
2976 changed_contents = FALSE;
2977 changed_relocs = FALSE;
2978 local_got_refcounts = elf_local_got_refcounts (abfd);
2979 maxpagesize = get_elf_backend_data (abfd)->maxpagesize;
2980
2981 /* Get the section contents. */
2982 if (elf_section_data (sec)->this_hdr.contents != NULL)
2983 contents = elf_section_data (sec)->this_hdr.contents;
2984 else
2985 {
2986 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2987 goto error_return;
2988 }
2989
2990 is_pic = bfd_link_pic (link_info);
2991
2992 /* TRUE if we can convert only to R_X86_64_PC32. Enable it for
2993 --no-relax. */
2994 require_reloc_pc32
2995 = link_info->disable_target_specific_optimizations > 1;
2996
2997 irelend = internal_relocs + sec->reloc_count;
2998 for (irel = internal_relocs; irel < irelend; irel++)
2999 {
3000 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
3001 unsigned int r_symndx = htab->r_sym (irel->r_info);
3002 unsigned int indx;
3003 struct elf_link_hash_entry *h;
3004 asection *tsec;
3005 char symtype;
3006 bfd_vma toff, roff;
3007 bfd_signed_vma raddend;
3008 unsigned int opcode;
3009 unsigned int modrm;
3010 bfd_boolean relocx;
3011 bfd_boolean to_reloc_pc32;
3012
3013 relocx = (r_type == R_X86_64_GOTPCRELX
3014 || r_type == R_X86_64_REX_GOTPCRELX);
3015 if (!relocx && r_type != R_X86_64_GOTPCREL)
3016 continue;
3017
3018 roff = irel->r_offset;
3019 if (roff < (r_type == R_X86_64_REX_GOTPCRELX ? 3 : 2))
3020 continue;
3021
3022 raddend = irel->r_addend;
3023 /* Addend for 32-bit PC-relative relocation must be -4. */
3024 if (raddend != -4)
3025 continue;
3026
3027 opcode = bfd_get_8 (abfd, contents + roff - 2);
3028
3029 /* Convert mov to lea since it has been done for a while. */
3030 if (opcode != 0x8b)
3031 {
3032 /* Only convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX
3033 for call, jmp or one of adc, add, and, cmp, or, sbb, sub,
3034 test, xor instructions. */
3035 if (!relocx)
3036 continue;
3037 }
3038
3039 /* We convert only to R_X86_64_PC32:
3040 1. Branch.
3041 2. R_X86_64_GOTPCREL since we can't modify REX byte.
3042 3. require_reloc_pc32 is true.
3043 4. PIC.
3044 */
3045 to_reloc_pc32 = (opcode == 0xff
3046 || !relocx
3047 || require_reloc_pc32
3048 || is_pic);
3049
3050 /* Get the symbol referred to by the reloc. */
3051 if (r_symndx < symtab_hdr->sh_info)
3052 {
3053 Elf_Internal_Sym *isym;
3054
3055 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
3056 abfd, r_symndx);
3057
3058 symtype = ELF_ST_TYPE (isym->st_info);
3059
3060 /* STT_GNU_IFUNC must keep GOTPCREL relocations and skip
3061 relocation against undefined symbols. */
3062 if (symtype == STT_GNU_IFUNC || isym->st_shndx == SHN_UNDEF)
3063 continue;
3064
3065 if (isym->st_shndx == SHN_ABS)
3066 tsec = bfd_abs_section_ptr;
3067 else if (isym->st_shndx == SHN_COMMON)
3068 tsec = bfd_com_section_ptr;
3069 else if (isym->st_shndx == SHN_X86_64_LCOMMON)
3070 tsec = &_bfd_elf_large_com_section;
3071 else
3072 tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3073
3074 h = NULL;
3075 toff = isym->st_value;
3076 }
3077 else
3078 {
3079 indx = r_symndx - symtab_hdr->sh_info;
3080 h = elf_sym_hashes (abfd)[indx];
3081 BFD_ASSERT (h != NULL);
3082
3083 while (h->root.type == bfd_link_hash_indirect
3084 || h->root.type == bfd_link_hash_warning)
3085 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3086
3087 /* STT_GNU_IFUNC must keep GOTPCREL relocations. We also
3088 avoid optimizing GOTPCREL relocations againt _DYNAMIC
3089 since ld.so may use its link-time address. */
3090 if (h->type == STT_GNU_IFUNC)
3091 continue;
3092
3093 /* Undefined weak symbol is only bound locally in executable
3094 and its reference is resolved as 0 without relocation
3095 overflow. We can only perform this optimization for
3096 GOTPCRELX relocations since we need to modify REX byte.
3097 It is OK convert mov with R_X86_64_GOTPCREL to
3098 R_X86_64_PC32. */
3099 if ((relocx || opcode == 0x8b)
3100 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (link_info,
3101 elf_x86_64_hash_entry (h)))
3102 {
3103 if (opcode == 0xff)
3104 {
3105 /* Skip for branch instructions since R_X86_64_PC32
3106 may overflow. */
3107 if (require_reloc_pc32)
3108 continue;
3109 }
3110 else if (relocx)
3111 {
3112 /* For non-branch instructions, we can convert to
3113 R_X86_64_32/R_X86_64_32S since we know if there
3114 is a REX byte. */
3115 to_reloc_pc32 = FALSE;
3116 }
3117
3118 /* Since we don't know the current PC when PIC is true,
3119 we can't convert to R_X86_64_PC32. */
3120 if (to_reloc_pc32 && is_pic)
3121 continue;
3122
3123 goto convert;
3124 }
3125 else if ((h->def_regular
3126 || h->root.type == bfd_link_hash_defined
3127 || h->root.type == bfd_link_hash_defweak)
3128 && h != htab->elf.hdynamic
3129 && SYMBOL_REFERENCES_LOCAL (link_info, h))
3130 {
3131 /* bfd_link_hash_new or bfd_link_hash_undefined is
3132 set by an assignment in a linker script in
3133 bfd_elf_record_link_assignment. */
3134 if (h->def_regular
3135 && (h->root.type == bfd_link_hash_new
3136 || h->root.type == bfd_link_hash_undefined))
3137 {
3138 /* Skip since R_X86_64_32/R_X86_64_32S may overflow. */
3139 if (require_reloc_pc32)
3140 continue;
3141 goto convert;
3142 }
3143 tsec = h->root.u.def.section;
3144 toff = h->root.u.def.value;
3145 symtype = h->type;
3146 }
3147 else
3148 continue;
3149 }
3150
3151 /* We can only estimate relocation overflow for R_X86_64_PC32. */
3152 if (!to_reloc_pc32)
3153 goto convert;
3154
3155 if (tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
3156 {
3157 /* At this stage in linking, no SEC_MERGE symbol has been
3158 adjusted, so all references to such symbols need to be
3159 passed through _bfd_merged_section_offset. (Later, in
3160 relocate_section, all SEC_MERGE symbols *except* for
3161 section symbols have been adjusted.)
3162
3163 gas may reduce relocations against symbols in SEC_MERGE
3164 sections to a relocation against the section symbol when
3165 the original addend was zero. When the reloc is against
3166 a section symbol we should include the addend in the
3167 offset passed to _bfd_merged_section_offset, since the
3168 location of interest is the original symbol. On the
3169 other hand, an access to "sym+addend" where "sym" is not
3170 a section symbol should not include the addend; Such an
3171 access is presumed to be an offset from "sym"; The
3172 location of interest is just "sym". */
3173 if (symtype == STT_SECTION)
3174 toff += raddend;
3175
3176 toff = _bfd_merged_section_offset (abfd, &tsec,
3177 elf_section_data (tsec)->sec_info,
3178 toff);
3179
3180 if (symtype != STT_SECTION)
3181 toff += raddend;
3182 }
3183 else
3184 toff += raddend;
3185
3186 /* Don't convert if R_X86_64_PC32 relocation overflows. */
3187 if (tsec->output_section == sec->output_section)
3188 {
3189 if ((toff - roff + 0x80000000) > 0xffffffff)
3190 continue;
3191 }
3192 else
3193 {
3194 bfd_signed_vma distance;
3195
3196 /* At this point, we don't know the load addresses of TSEC
3197 section nor SEC section. We estimate the distrance between
3198 SEC and TSEC. We store the estimated distances in the
3199 compressed_size field of the output section, which is only
3200 used to decompress the compressed input section. */
3201 if (sec->output_section->compressed_size == 0)
3202 {
3203 asection *asect;
3204 bfd_size_type size = 0;
3205 for (asect = link_info->output_bfd->sections;
3206 asect != NULL;
3207 asect = asect->next)
3208 {
3209 asection *i;
3210 for (i = asect->map_head.s;
3211 i != NULL;
3212 i = i->map_head.s)
3213 {
3214 size = align_power (size, i->alignment_power);
3215 size += i->size;
3216 }
3217 asect->compressed_size = size;
3218 }
3219 }
3220
3221 /* Don't convert GOTPCREL relocations if TSEC isn't placed
3222 after SEC. */
3223 distance = (tsec->output_section->compressed_size
3224 - sec->output_section->compressed_size);
3225 if (distance < 0)
3226 continue;
3227
3228 /* Take PT_GNU_RELRO segment into account by adding
3229 maxpagesize. */
3230 if ((toff + distance + maxpagesize - roff + 0x80000000)
3231 > 0xffffffff)
3232 continue;
3233 }
3234
3235 convert:
3236 if (opcode == 0xff)
3237 {
3238 /* We have "call/jmp *foo@GOTPCREL(%rip)". */
3239 unsigned int nop;
3240 unsigned int disp;
3241 bfd_vma nop_offset;
3242
3243 /* Convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX to
3244 R_X86_64_PC32. */
3245 modrm = bfd_get_8 (abfd, contents + roff - 1);
3246 if (modrm == 0x25)
3247 {
3248 /* Convert to "jmp foo nop". */
3249 modrm = 0xe9;
3250 nop = NOP_OPCODE;
3251 nop_offset = irel->r_offset + 3;
3252 disp = bfd_get_32 (abfd, contents + irel->r_offset);
3253 irel->r_offset -= 1;
3254 bfd_put_32 (abfd, disp, contents + irel->r_offset);
3255 }
3256 else
3257 {
3258 /* Convert to "nop call foo". ADDR_PREFIX_OPCODE
3259 is a nop prefix. */
3260 modrm = 0xe8;
3261 nop = link_info->call_nop_byte;
3262 if (link_info->call_nop_as_suffix)
3263 {
3264 nop_offset = irel->r_offset + 3;
3265 disp = bfd_get_32 (abfd, contents + irel->r_offset);
3266 irel->r_offset -= 1;
3267 bfd_put_32 (abfd, disp, contents + irel->r_offset);
3268 }
3269 else
3270 nop_offset = irel->r_offset - 2;
3271 }
3272 bfd_put_8 (abfd, nop, contents + nop_offset);
3273 bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
3274 r_type = R_X86_64_PC32;
3275 }
3276 else
3277 {
3278 unsigned int rex;
3279 unsigned int rex_mask = REX_R;
3280
3281 if (r_type == R_X86_64_REX_GOTPCRELX)
3282 rex = bfd_get_8 (abfd, contents + roff - 3);
3283 else
3284 rex = 0;
3285
3286 if (opcode == 0x8b)
3287 {
3288 if (to_reloc_pc32)
3289 {
3290 /* Convert "mov foo@GOTPCREL(%rip), %reg" to
3291 "lea foo(%rip), %reg". */
3292 opcode = 0x8d;
3293 r_type = R_X86_64_PC32;
3294 }
3295 else
3296 {
3297 /* Convert "mov foo@GOTPCREL(%rip), %reg" to
3298 "mov $foo, %reg". */
3299 opcode = 0xc7;
3300 modrm = bfd_get_8 (abfd, contents + roff - 1);
3301 modrm = 0xc0 | (modrm & 0x38) >> 3;
3302 if ((rex & REX_W) != 0
3303 && ABI_64_P (link_info->output_bfd))
3304 {
3305 /* Keep the REX_W bit in REX byte for LP64. */
3306 r_type = R_X86_64_32S;
3307 goto rewrite_modrm_rex;
3308 }
3309 else
3310 {
3311 /* If the REX_W bit in REX byte isn't needed,
3312 use R_X86_64_32 and clear the W bit to avoid
3313 sign-extend imm32 to imm64. */
3314 r_type = R_X86_64_32;
3315 /* Clear the W bit in REX byte. */
3316 rex_mask |= REX_W;
3317 goto rewrite_modrm_rex;
3318 }
3319 }
3320 }
3321 else
3322 {
3323 /* R_X86_64_PC32 isn't supported. */
3324 if (to_reloc_pc32)
3325 continue;
3326
3327 modrm = bfd_get_8 (abfd, contents + roff - 1);
3328 if (opcode == 0x85)
3329 {
3330 /* Convert "test %reg, foo@GOTPCREL(%rip)" to
3331 "test $foo, %reg". */
3332 modrm = 0xc0 | (modrm & 0x38) >> 3;
3333 opcode = 0xf7;
3334 }
3335 else
3336 {
3337 /* Convert "binop foo@GOTPCREL(%rip), %reg" to
3338 "binop $foo, %reg". */
3339 modrm = 0xc0 | (modrm & 0x38) >> 3 | (opcode & 0x3c);
3340 opcode = 0x81;
3341 }
3342
3343 /* Use R_X86_64_32 with 32-bit operand to avoid relocation
3344 overflow when sign-extending imm32 to imm64. */
3345 r_type = (rex & REX_W) != 0 ? R_X86_64_32S : R_X86_64_32;
3346
3347 rewrite_modrm_rex:
3348 bfd_put_8 (abfd, modrm, contents + roff - 1);
3349
3350 if (rex)
3351 {
3352 /* Move the R bit to the B bit in REX byte. */
3353 rex = (rex & ~rex_mask) | (rex & REX_R) >> 2;
3354 bfd_put_8 (abfd, rex, contents + roff - 3);
3355 }
3356
3357 /* No addend for R_X86_64_32/R_X86_64_32S relocations. */
3358 irel->r_addend = 0;
3359 }
3360
3361 bfd_put_8 (abfd, opcode, contents + roff - 2);
3362 }
3363
3364 irel->r_info = htab->r_info (r_symndx, r_type);
3365 changed_contents = TRUE;
3366 changed_relocs = TRUE;
3367
3368 if (h)
3369 {
3370 if (h->got.refcount > 0)
3371 h->got.refcount -= 1;
3372 }
3373 else
3374 {
3375 if (local_got_refcounts != NULL
3376 && local_got_refcounts[r_symndx] > 0)
3377 local_got_refcounts[r_symndx] -= 1;
3378 }
3379 }
3380
3381 if (contents != NULL
3382 && elf_section_data (sec)->this_hdr.contents != contents)
3383 {
3384 if (!changed_contents && !link_info->keep_memory)
3385 free (contents);
3386 else
3387 {
3388 /* Cache the section contents for elf_link_input_bfd. */
3389 elf_section_data (sec)->this_hdr.contents = contents;
3390 }
3391 }
3392
3393 if (elf_section_data (sec)->relocs != internal_relocs)
3394 {
3395 if (!changed_relocs)
3396 free (internal_relocs);
3397 else
3398 elf_section_data (sec)->relocs = internal_relocs;
3399 }
3400
3401 return TRUE;
3402
3403 error_return:
3404 if (contents != NULL
3405 && elf_section_data (sec)->this_hdr.contents != contents)
3406 free (contents);
3407 if (internal_relocs != NULL
3408 && elf_section_data (sec)->relocs != internal_relocs)
3409 free (internal_relocs);
3410 return FALSE;
3411 }
3412
3413 /* Set the sizes of the dynamic sections. */
3414
3415 static bfd_boolean
3416 elf_x86_64_size_dynamic_sections (bfd *output_bfd,
3417 struct bfd_link_info *info)
3418 {
3419 struct elf_x86_64_link_hash_table *htab;
3420 bfd *dynobj;
3421 asection *s;
3422 bfd_boolean relocs;
3423 bfd *ibfd;
3424 const struct elf_backend_data *bed;
3425
3426 htab = elf_x86_64_hash_table (info);
3427 if (htab == NULL)
3428 return FALSE;
3429 bed = get_elf_backend_data (output_bfd);
3430
3431 dynobj = htab->elf.dynobj;
3432 if (dynobj == NULL)
3433 abort ();
3434
3435 if (htab->elf.dynamic_sections_created)
3436 {
3437 /* Set the contents of the .interp section to the interpreter. */
3438 if (bfd_link_executable (info) && !info->nointerp)
3439 {
3440 s = bfd_get_linker_section (dynobj, ".interp");
3441 if (s == NULL)
3442 abort ();
3443 s->size = htab->dynamic_interpreter_size;
3444 s->contents = (unsigned char *) htab->dynamic_interpreter;
3445 htab->interp = s;
3446 }
3447 }
3448
3449 /* Set up .got offsets for local syms, and space for local dynamic
3450 relocs. */
3451 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3452 {
3453 bfd_signed_vma *local_got;
3454 bfd_signed_vma *end_local_got;
3455 char *local_tls_type;
3456 bfd_vma *local_tlsdesc_gotent;
3457 bfd_size_type locsymcount;
3458 Elf_Internal_Shdr *symtab_hdr;
3459 asection *srel;
3460
3461 if (! is_x86_64_elf (ibfd))
3462 continue;
3463
3464 for (s = ibfd->sections; s != NULL; s = s->next)
3465 {
3466 struct elf_dyn_relocs *p;
3467
3468 if (!elf_x86_64_convert_load (ibfd, s, info))
3469 return FALSE;
3470
3471 for (p = (struct elf_dyn_relocs *)
3472 (elf_section_data (s)->local_dynrel);
3473 p != NULL;
3474 p = p->next)
3475 {
3476 if (!bfd_is_abs_section (p->sec)
3477 && bfd_is_abs_section (p->sec->output_section))
3478 {
3479 /* Input section has been discarded, either because
3480 it is a copy of a linkonce section or due to
3481 linker script /DISCARD/, so we'll be discarding
3482 the relocs too. */
3483 }
3484 else if (p->count != 0)
3485 {
3486 srel = elf_section_data (p->sec)->sreloc;
3487 srel->size += p->count * bed->s->sizeof_rela;
3488 if ((p->sec->output_section->flags & SEC_READONLY) != 0
3489 && (info->flags & DF_TEXTREL) == 0)
3490 {
3491 info->flags |= DF_TEXTREL;
3492 if ((info->warn_shared_textrel && bfd_link_pic (info))
3493 || info->error_textrel)
3494 info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"),
3495 p->sec->owner, p->sec);
3496 }
3497 }
3498 }
3499 }
3500
3501 local_got = elf_local_got_refcounts (ibfd);
3502 if (!local_got)
3503 continue;
3504
3505 symtab_hdr = &elf_symtab_hdr (ibfd);
3506 locsymcount = symtab_hdr->sh_info;
3507 end_local_got = local_got + locsymcount;
3508 local_tls_type = elf_x86_64_local_got_tls_type (ibfd);
3509 local_tlsdesc_gotent = elf_x86_64_local_tlsdesc_gotent (ibfd);
3510 s = htab->elf.sgot;
3511 srel = htab->elf.srelgot;
3512 for (; local_got < end_local_got;
3513 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
3514 {
3515 *local_tlsdesc_gotent = (bfd_vma) -1;
3516 if (*local_got > 0)
3517 {
3518 if (GOT_TLS_GDESC_P (*local_tls_type))
3519 {
3520 *local_tlsdesc_gotent = htab->elf.sgotplt->size
3521 - elf_x86_64_compute_jump_table_size (htab);
3522 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
3523 *local_got = (bfd_vma) -2;
3524 }
3525 if (! GOT_TLS_GDESC_P (*local_tls_type)
3526 || GOT_TLS_GD_P (*local_tls_type))
3527 {
3528 *local_got = s->size;
3529 s->size += GOT_ENTRY_SIZE;
3530 if (GOT_TLS_GD_P (*local_tls_type))
3531 s->size += GOT_ENTRY_SIZE;
3532 }
3533 if (bfd_link_pic (info)
3534 || GOT_TLS_GD_ANY_P (*local_tls_type)
3535 || *local_tls_type == GOT_TLS_IE)
3536 {
3537 if (GOT_TLS_GDESC_P (*local_tls_type))
3538 {
3539 htab->elf.srelplt->size
3540 += bed->s->sizeof_rela;
3541 htab->tlsdesc_plt = (bfd_vma) -1;
3542 }
3543 if (! GOT_TLS_GDESC_P (*local_tls_type)
3544 || GOT_TLS_GD_P (*local_tls_type))
3545 srel->size += bed->s->sizeof_rela;
3546 }
3547 }
3548 else
3549 *local_got = (bfd_vma) -1;
3550 }
3551 }
3552
3553 if (htab->tls_ld_got.refcount > 0)
3554 {
3555 /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
3556 relocs. */
3557 htab->tls_ld_got.offset = htab->elf.sgot->size;
3558 htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE;
3559 htab->elf.srelgot->size += bed->s->sizeof_rela;
3560 }
3561 else
3562 htab->tls_ld_got.offset = -1;
3563
3564 /* Allocate global sym .plt and .got entries, and space for global
3565 sym dynamic relocs. */
3566 elf_link_hash_traverse (&htab->elf, elf_x86_64_allocate_dynrelocs,
3567 info);
3568
3569 /* Allocate .plt and .got entries, and space for local symbols. */
3570 htab_traverse (htab->loc_hash_table,
3571 elf_x86_64_allocate_local_dynrelocs,
3572 info);
3573
3574 /* For every jump slot reserved in the sgotplt, reloc_count is
3575 incremented. However, when we reserve space for TLS descriptors,
3576 it's not incremented, so in order to compute the space reserved
3577 for them, it suffices to multiply the reloc count by the jump
3578 slot size.
3579
3580 PR ld/13302: We start next_irelative_index at the end of .rela.plt
3581 so that R_X86_64_IRELATIVE entries come last. */
3582 if (htab->elf.srelplt)
3583 {
3584 htab->sgotplt_jump_table_size
3585 = elf_x86_64_compute_jump_table_size (htab);
3586 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
3587 }
3588 else if (htab->elf.irelplt)
3589 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
3590
3591 if (htab->tlsdesc_plt)
3592 {
3593 /* If we're not using lazy TLS relocations, don't generate the
3594 PLT and GOT entries they require. */
3595 if ((info->flags & DF_BIND_NOW))
3596 htab->tlsdesc_plt = 0;
3597 else
3598 {
3599 htab->tlsdesc_got = htab->elf.sgot->size;
3600 htab->elf.sgot->size += GOT_ENTRY_SIZE;
3601 /* Reserve room for the initial entry.
3602 FIXME: we could probably do away with it in this case. */
3603 if (htab->elf.splt->size == 0)
3604 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
3605 htab->tlsdesc_plt = htab->elf.splt->size;
3606 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
3607 }
3608 }
3609
3610 if (htab->elf.sgotplt)
3611 {
3612 /* Don't allocate .got.plt section if there are no GOT nor PLT
3613 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
3614 if ((htab->elf.hgot == NULL
3615 || !htab->elf.hgot->ref_regular_nonweak)
3616 && (htab->elf.sgotplt->size
3617 == get_elf_backend_data (output_bfd)->got_header_size)
3618 && (htab->elf.splt == NULL
3619 || htab->elf.splt->size == 0)
3620 && (htab->elf.sgot == NULL
3621 || htab->elf.sgot->size == 0)
3622 && (htab->elf.iplt == NULL
3623 || htab->elf.iplt->size == 0)
3624 && (htab->elf.igotplt == NULL
3625 || htab->elf.igotplt->size == 0))
3626 htab->elf.sgotplt->size = 0;
3627 }
3628
3629 if (htab->plt_eh_frame != NULL
3630 && htab->elf.splt != NULL
3631 && htab->elf.splt->size != 0
3632 && !bfd_is_abs_section (htab->elf.splt->output_section)
3633 && _bfd_elf_eh_frame_present (info))
3634 {
3635 const struct elf_x86_64_backend_data *arch_data
3636 = get_elf_x86_64_arch_data (bed);
3637 htab->plt_eh_frame->size = arch_data->eh_frame_plt_size;
3638 }
3639
3640 /* We now have determined the sizes of the various dynamic sections.
3641 Allocate memory for them. */
3642 relocs = FALSE;
3643 for (s = dynobj->sections; s != NULL; s = s->next)
3644 {
3645 if ((s->flags & SEC_LINKER_CREATED) == 0)
3646 continue;
3647
3648 if (s == htab->elf.splt
3649 || s == htab->elf.sgot
3650 || s == htab->elf.sgotplt
3651 || s == htab->elf.iplt
3652 || s == htab->elf.igotplt
3653 || s == htab->plt_bnd
3654 || s == htab->plt_got
3655 || s == htab->plt_eh_frame
3656 || s == htab->sdynbss)
3657 {
3658 /* Strip this section if we don't need it; see the
3659 comment below. */
3660 }
3661 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
3662 {
3663 if (s->size != 0 && s != htab->elf.srelplt)
3664 relocs = TRUE;
3665
3666 /* We use the reloc_count field as a counter if we need
3667 to copy relocs into the output file. */
3668 if (s != htab->elf.srelplt)
3669 s->reloc_count = 0;
3670 }
3671 else
3672 {
3673 /* It's not one of our sections, so don't allocate space. */
3674 continue;
3675 }
3676
3677 if (s->size == 0)
3678 {
3679 /* If we don't need this section, strip it from the
3680 output file. This is mostly to handle .rela.bss and
3681 .rela.plt. We must create both sections in
3682 create_dynamic_sections, because they must be created
3683 before the linker maps input sections to output
3684 sections. The linker does that before
3685 adjust_dynamic_symbol is called, and it is that
3686 function which decides whether anything needs to go
3687 into these sections. */
3688
3689 s->flags |= SEC_EXCLUDE;
3690 continue;
3691 }
3692
3693 if ((s->flags & SEC_HAS_CONTENTS) == 0)
3694 continue;
3695
3696 /* Allocate memory for the section contents. We use bfd_zalloc
3697 here in case unused entries are not reclaimed before the
3698 section's contents are written out. This should not happen,
3699 but this way if it does, we get a R_X86_64_NONE reloc instead
3700 of garbage. */
3701 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
3702 if (s->contents == NULL)
3703 return FALSE;
3704 }
3705
3706 if (htab->plt_eh_frame != NULL
3707 && htab->plt_eh_frame->contents != NULL)
3708 {
3709 const struct elf_x86_64_backend_data *arch_data
3710 = get_elf_x86_64_arch_data (bed);
3711
3712 memcpy (htab->plt_eh_frame->contents,
3713 arch_data->eh_frame_plt, htab->plt_eh_frame->size);
3714 bfd_put_32 (dynobj, htab->elf.splt->size,
3715 htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
3716 }
3717
3718 if (htab->elf.dynamic_sections_created)
3719 {
3720 /* Add some entries to the .dynamic section. We fill in the
3721 values later, in elf_x86_64_finish_dynamic_sections, but we
3722 must add the entries now so that we get the correct size for
3723 the .dynamic section. The DT_DEBUG entry is filled in by the
3724 dynamic linker and used by the debugger. */
3725 #define add_dynamic_entry(TAG, VAL) \
3726 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3727
3728 if (bfd_link_executable (info))
3729 {
3730 if (!add_dynamic_entry (DT_DEBUG, 0))
3731 return FALSE;
3732 }
3733
3734 if (htab->elf.splt->size != 0)
3735 {
3736 /* DT_PLTGOT is used by prelink even if there is no PLT
3737 relocation. */
3738 if (!add_dynamic_entry (DT_PLTGOT, 0))
3739 return FALSE;
3740
3741 if (htab->elf.srelplt->size != 0)
3742 {
3743 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
3744 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3745 || !add_dynamic_entry (DT_JMPREL, 0))
3746 return FALSE;
3747 }
3748
3749 if (htab->tlsdesc_plt
3750 && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
3751 || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
3752 return FALSE;
3753 }
3754
3755 if (relocs)
3756 {
3757 if (!add_dynamic_entry (DT_RELA, 0)
3758 || !add_dynamic_entry (DT_RELASZ, 0)
3759 || !add_dynamic_entry (DT_RELAENT, bed->s->sizeof_rela))
3760 return FALSE;
3761
3762 /* If any dynamic relocs apply to a read-only section,
3763 then we need a DT_TEXTREL entry. */
3764 if ((info->flags & DF_TEXTREL) == 0)
3765 elf_link_hash_traverse (&htab->elf,
3766 elf_x86_64_readonly_dynrelocs,
3767 info);
3768
3769 if ((info->flags & DF_TEXTREL) != 0)
3770 {
3771 if (htab->readonly_dynrelocs_against_ifunc)
3772 {
3773 info->callbacks->einfo
3774 (_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n"));
3775 bfd_set_error (bfd_error_bad_value);
3776 return FALSE;
3777 }
3778
3779 if (!add_dynamic_entry (DT_TEXTREL, 0))
3780 return FALSE;
3781 }
3782 }
3783 }
3784 #undef add_dynamic_entry
3785
3786 return TRUE;
3787 }
3788
3789 static bfd_boolean
3790 elf_x86_64_always_size_sections (bfd *output_bfd,
3791 struct bfd_link_info *info)
3792 {
3793 asection *tls_sec = elf_hash_table (info)->tls_sec;
3794
3795 if (tls_sec)
3796 {
3797 struct elf_link_hash_entry *tlsbase;
3798
3799 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3800 "_TLS_MODULE_BASE_",
3801 FALSE, FALSE, FALSE);
3802
3803 if (tlsbase && tlsbase->type == STT_TLS)
3804 {
3805 struct elf_x86_64_link_hash_table *htab;
3806 struct bfd_link_hash_entry *bh = NULL;
3807 const struct elf_backend_data *bed
3808 = get_elf_backend_data (output_bfd);
3809
3810 htab = elf_x86_64_hash_table (info);
3811 if (htab == NULL)
3812 return FALSE;
3813
3814 if (!(_bfd_generic_link_add_one_symbol
3815 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3816 tls_sec, 0, NULL, FALSE,
3817 bed->collect, &bh)))
3818 return FALSE;
3819
3820 htab->tls_module_base = bh;
3821
3822 tlsbase = (struct elf_link_hash_entry *)bh;
3823 tlsbase->def_regular = 1;
3824 tlsbase->other = STV_HIDDEN;
3825 tlsbase->root.linker_def = 1;
3826 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3827 }
3828 }
3829
3830 return TRUE;
3831 }
3832
3833 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3834 executables. Rather than setting it to the beginning of the TLS
3835 section, we have to set it to the end. This function may be called
3836 multiple times, it is idempotent. */
3837
3838 static void
3839 elf_x86_64_set_tls_module_base (struct bfd_link_info *info)
3840 {
3841 struct elf_x86_64_link_hash_table *htab;
3842 struct bfd_link_hash_entry *base;
3843
3844 if (!bfd_link_executable (info))
3845 return;
3846
3847 htab = elf_x86_64_hash_table (info);
3848 if (htab == NULL)
3849 return;
3850
3851 base = htab->tls_module_base;
3852 if (base == NULL)
3853 return;
3854
3855 base->u.def.value = htab->elf.tls_size;
3856 }
3857
3858 /* Return the base VMA address which should be subtracted from real addresses
3859 when resolving @dtpoff relocation.
3860 This is PT_TLS segment p_vaddr. */
3861
3862 static bfd_vma
3863 elf_x86_64_dtpoff_base (struct bfd_link_info *info)
3864 {
3865 /* If tls_sec is NULL, we should have signalled an error already. */
3866 if (elf_hash_table (info)->tls_sec == NULL)
3867 return 0;
3868 return elf_hash_table (info)->tls_sec->vma;
3869 }
3870
3871 /* Return the relocation value for @tpoff relocation
3872 if STT_TLS virtual address is ADDRESS. */
3873
3874 static bfd_vma
3875 elf_x86_64_tpoff (struct bfd_link_info *info, bfd_vma address)
3876 {
3877 struct elf_link_hash_table *htab = elf_hash_table (info);
3878 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3879 bfd_vma static_tls_size;
3880
3881 /* If tls_segment is NULL, we should have signalled an error already. */
3882 if (htab->tls_sec == NULL)
3883 return 0;
3884
3885 /* Consider special static TLS alignment requirements. */
3886 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3887 return address - static_tls_size - htab->tls_sec->vma;
3888 }
3889
3890 /* Is the instruction before OFFSET in CONTENTS a 32bit relative
3891 branch? */
3892
3893 static bfd_boolean
3894 is_32bit_relative_branch (bfd_byte *contents, bfd_vma offset)
3895 {
3896 /* Opcode Instruction
3897 0xe8 call
3898 0xe9 jump
3899 0x0f 0x8x conditional jump */
3900 return ((offset > 0
3901 && (contents [offset - 1] == 0xe8
3902 || contents [offset - 1] == 0xe9))
3903 || (offset > 1
3904 && contents [offset - 2] == 0x0f
3905 && (contents [offset - 1] & 0xf0) == 0x80));
3906 }
3907
3908 /* Relocate an x86_64 ELF section. */
3909
3910 static bfd_boolean
3911 elf_x86_64_relocate_section (bfd *output_bfd,
3912 struct bfd_link_info *info,
3913 bfd *input_bfd,
3914 asection *input_section,
3915 bfd_byte *contents,
3916 Elf_Internal_Rela *relocs,
3917 Elf_Internal_Sym *local_syms,
3918 asection **local_sections)
3919 {
3920 struct elf_x86_64_link_hash_table *htab;
3921 Elf_Internal_Shdr *symtab_hdr;
3922 struct elf_link_hash_entry **sym_hashes;
3923 bfd_vma *local_got_offsets;
3924 bfd_vma *local_tlsdesc_gotents;
3925 Elf_Internal_Rela *rel;
3926 Elf_Internal_Rela *wrel;
3927 Elf_Internal_Rela *relend;
3928 const unsigned int plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
3929
3930 BFD_ASSERT (is_x86_64_elf (input_bfd));
3931
3932 /* Skip if check_relocs failed. */
3933 if (input_section->check_relocs_failed)
3934 return FALSE;
3935
3936 htab = elf_x86_64_hash_table (info);
3937 if (htab == NULL)
3938 return FALSE;
3939 symtab_hdr = &elf_symtab_hdr (input_bfd);
3940 sym_hashes = elf_sym_hashes (input_bfd);
3941 local_got_offsets = elf_local_got_offsets (input_bfd);
3942 local_tlsdesc_gotents = elf_x86_64_local_tlsdesc_gotent (input_bfd);
3943
3944 elf_x86_64_set_tls_module_base (info);
3945
3946 rel = wrel = relocs;
3947 relend = relocs + input_section->reloc_count;
3948 for (; rel < relend; wrel++, rel++)
3949 {
3950 unsigned int r_type;
3951 reloc_howto_type *howto;
3952 unsigned long r_symndx;
3953 struct elf_link_hash_entry *h;
3954 struct elf_x86_64_link_hash_entry *eh;
3955 Elf_Internal_Sym *sym;
3956 asection *sec;
3957 bfd_vma off, offplt, plt_offset;
3958 bfd_vma relocation;
3959 bfd_boolean unresolved_reloc;
3960 bfd_reloc_status_type r;
3961 int tls_type;
3962 asection *base_got, *resolved_plt;
3963 bfd_vma st_size;
3964 bfd_boolean resolved_to_zero;
3965
3966 r_type = ELF32_R_TYPE (rel->r_info);
3967 if (r_type == (int) R_X86_64_GNU_VTINHERIT
3968 || r_type == (int) R_X86_64_GNU_VTENTRY)
3969 {
3970 if (wrel != rel)
3971 *wrel = *rel;
3972 continue;
3973 }
3974
3975 if (r_type >= (int) R_X86_64_standard)
3976 {
3977 (*_bfd_error_handler)
3978 (_("%B: unrecognized relocation (0x%x) in section `%A'"),
3979 input_bfd, input_section, r_type);
3980 bfd_set_error (bfd_error_bad_value);
3981 return FALSE;
3982 }
3983
3984 if (r_type != (int) R_X86_64_32
3985 || ABI_64_P (output_bfd))
3986 howto = x86_64_elf_howto_table + r_type;
3987 else
3988 howto = (x86_64_elf_howto_table
3989 + ARRAY_SIZE (x86_64_elf_howto_table) - 1);
3990 r_symndx = htab->r_sym (rel->r_info);
3991 h = NULL;
3992 sym = NULL;
3993 sec = NULL;
3994 unresolved_reloc = FALSE;
3995 if (r_symndx < symtab_hdr->sh_info)
3996 {
3997 sym = local_syms + r_symndx;
3998 sec = local_sections[r_symndx];
3999
4000 relocation = _bfd_elf_rela_local_sym (output_bfd, sym,
4001 &sec, rel);
4002 st_size = sym->st_size;
4003
4004 /* Relocate against local STT_GNU_IFUNC symbol. */
4005 if (!bfd_link_relocatable (info)
4006 && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
4007 {
4008 h = elf_x86_64_get_local_sym_hash (htab, input_bfd,
4009 rel, FALSE);
4010 if (h == NULL)
4011 abort ();
4012
4013 /* Set STT_GNU_IFUNC symbol value. */
4014 h->root.u.def.value = sym->st_value;
4015 h->root.u.def.section = sec;
4016 }
4017 }
4018 else
4019 {
4020 bfd_boolean warned ATTRIBUTE_UNUSED;
4021 bfd_boolean ignored ATTRIBUTE_UNUSED;
4022
4023 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4024 r_symndx, symtab_hdr, sym_hashes,
4025 h, sec, relocation,
4026 unresolved_reloc, warned, ignored);
4027 st_size = h->size;
4028 }
4029
4030 if (sec != NULL && discarded_section (sec))
4031 {
4032 _bfd_clear_contents (howto, input_bfd, input_section,
4033 contents + rel->r_offset);
4034 wrel->r_offset = rel->r_offset;
4035 wrel->r_info = 0;
4036 wrel->r_addend = 0;
4037
4038 /* For ld -r, remove relocations in debug sections against
4039 sections defined in discarded sections. Not done for
4040 eh_frame editing code expects to be present. */
4041 if (bfd_link_relocatable (info)
4042 && (input_section->flags & SEC_DEBUGGING))
4043 wrel--;
4044
4045 continue;
4046 }
4047
4048 if (bfd_link_relocatable (info))
4049 {
4050 if (wrel != rel)
4051 *wrel = *rel;
4052 continue;
4053 }
4054
4055 if (rel->r_addend == 0 && !ABI_64_P (output_bfd))
4056 {
4057 if (r_type == R_X86_64_64)
4058 {
4059 /* For x32, treat R_X86_64_64 like R_X86_64_32 and
4060 zero-extend it to 64bit if addend is zero. */
4061 r_type = R_X86_64_32;
4062 memset (contents + rel->r_offset + 4, 0, 4);
4063 }
4064 else if (r_type == R_X86_64_SIZE64)
4065 {
4066 /* For x32, treat R_X86_64_SIZE64 like R_X86_64_SIZE32 and
4067 zero-extend it to 64bit if addend is zero. */
4068 r_type = R_X86_64_SIZE32;
4069 memset (contents + rel->r_offset + 4, 0, 4);
4070 }
4071 }
4072
4073 eh = (struct elf_x86_64_link_hash_entry *) h;
4074
4075 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
4076 it here if it is defined in a non-shared object. */
4077 if (h != NULL
4078 && h->type == STT_GNU_IFUNC
4079 && h->def_regular)
4080 {
4081 bfd_vma plt_index;
4082 const char *name;
4083
4084 if ((input_section->flags & SEC_ALLOC) == 0)
4085 {
4086 /* Dynamic relocs are not propagated for SEC_DEBUGGING
4087 sections because such sections are not SEC_ALLOC and
4088 thus ld.so will not process them. */
4089 if ((input_section->flags & SEC_DEBUGGING) != 0)
4090 continue;
4091 abort ();
4092 }
4093 else if (h->plt.offset == (bfd_vma) -1)
4094 abort ();
4095
4096 /* STT_GNU_IFUNC symbol must go through PLT. */
4097 if (htab->elf.splt != NULL)
4098 {
4099 if (htab->plt_bnd != NULL)
4100 {
4101 resolved_plt = htab->plt_bnd;
4102 plt_offset = eh->plt_bnd.offset;
4103 }
4104 else
4105 {
4106 resolved_plt = htab->elf.splt;
4107 plt_offset = h->plt.offset;
4108 }
4109 }
4110 else
4111 {
4112 resolved_plt = htab->elf.iplt;
4113 plt_offset = h->plt.offset;
4114 }
4115
4116 relocation = (resolved_plt->output_section->vma
4117 + resolved_plt->output_offset + plt_offset);
4118
4119 switch (r_type)
4120 {
4121 default:
4122 if (h->root.root.string)
4123 name = h->root.root.string;
4124 else
4125 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
4126 NULL);
4127 (*_bfd_error_handler)
4128 (_("%B: relocation %s against STT_GNU_IFUNC "
4129 "symbol `%s' isn't handled by %s"), input_bfd,
4130 howto->name, name, __FUNCTION__);
4131 bfd_set_error (bfd_error_bad_value);
4132 return FALSE;
4133
4134 case R_X86_64_32S:
4135 if (bfd_link_pic (info))
4136 abort ();
4137 goto do_relocation;
4138
4139 case R_X86_64_32:
4140 if (ABI_64_P (output_bfd))
4141 goto do_relocation;
4142 /* FALLTHROUGH */
4143 case R_X86_64_64:
4144 if (rel->r_addend != 0)
4145 {
4146 if (h->root.root.string)
4147 name = h->root.root.string;
4148 else
4149 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
4150 sym, NULL);
4151 (*_bfd_error_handler)
4152 (_("%B: relocation %s against STT_GNU_IFUNC "
4153 "symbol `%s' has non-zero addend: %d"),
4154 input_bfd, howto->name, name, rel->r_addend);
4155 bfd_set_error (bfd_error_bad_value);
4156 return FALSE;
4157 }
4158
4159 /* Generate dynamic relcoation only when there is a
4160 non-GOT reference in a shared object. */
4161 if (bfd_link_pic (info) && h->non_got_ref)
4162 {
4163 Elf_Internal_Rela outrel;
4164 asection *sreloc;
4165
4166 /* Need a dynamic relocation to get the real function
4167 address. */
4168 outrel.r_offset = _bfd_elf_section_offset (output_bfd,
4169 info,
4170 input_section,
4171 rel->r_offset);
4172 if (outrel.r_offset == (bfd_vma) -1
4173 || outrel.r_offset == (bfd_vma) -2)
4174 abort ();
4175
4176 outrel.r_offset += (input_section->output_section->vma
4177 + input_section->output_offset);
4178
4179 if (h->dynindx == -1
4180 || h->forced_local
4181 || bfd_link_executable (info))
4182 {
4183 /* This symbol is resolved locally. */
4184 outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
4185 outrel.r_addend = (h->root.u.def.value
4186 + h->root.u.def.section->output_section->vma
4187 + h->root.u.def.section->output_offset);
4188 }
4189 else
4190 {
4191 outrel.r_info = htab->r_info (h->dynindx, r_type);
4192 outrel.r_addend = 0;
4193 }
4194
4195 sreloc = htab->elf.irelifunc;
4196 elf_append_rela (output_bfd, sreloc, &outrel);
4197
4198 /* If this reloc is against an external symbol, we
4199 do not want to fiddle with the addend. Otherwise,
4200 we need to include the symbol value so that it
4201 becomes an addend for the dynamic reloc. For an
4202 internal symbol, we have updated addend. */
4203 continue;
4204 }
4205 /* FALLTHROUGH */
4206 case R_X86_64_PC32:
4207 case R_X86_64_PC32_BND:
4208 case R_X86_64_PC64:
4209 case R_X86_64_PLT32:
4210 case R_X86_64_PLT32_BND:
4211 goto do_relocation;
4212
4213 case R_X86_64_GOTPCREL:
4214 case R_X86_64_GOTPCRELX:
4215 case R_X86_64_REX_GOTPCRELX:
4216 case R_X86_64_GOTPCREL64:
4217 base_got = htab->elf.sgot;
4218 off = h->got.offset;
4219
4220 if (base_got == NULL)
4221 abort ();
4222
4223 if (off == (bfd_vma) -1)
4224 {
4225 /* We can't use h->got.offset here to save state, or
4226 even just remember the offset, as finish_dynamic_symbol
4227 would use that as offset into .got. */
4228
4229 if (htab->elf.splt != NULL)
4230 {
4231 plt_index = h->plt.offset / plt_entry_size - 1;
4232 off = (plt_index + 3) * GOT_ENTRY_SIZE;
4233 base_got = htab->elf.sgotplt;
4234 }
4235 else
4236 {
4237 plt_index = h->plt.offset / plt_entry_size;
4238 off = plt_index * GOT_ENTRY_SIZE;
4239 base_got = htab->elf.igotplt;
4240 }
4241
4242 if (h->dynindx == -1
4243 || h->forced_local
4244 || info->symbolic)
4245 {
4246 /* This references the local defitionion. We must
4247 initialize this entry in the global offset table.
4248 Since the offset must always be a multiple of 8,
4249 we use the least significant bit to record
4250 whether we have initialized it already.
4251
4252 When doing a dynamic link, we create a .rela.got
4253 relocation entry to initialize the value. This
4254 is done in the finish_dynamic_symbol routine. */
4255 if ((off & 1) != 0)
4256 off &= ~1;
4257 else
4258 {
4259 bfd_put_64 (output_bfd, relocation,
4260 base_got->contents + off);
4261 /* Note that this is harmless for the GOTPLT64
4262 case, as -1 | 1 still is -1. */
4263 h->got.offset |= 1;
4264 }
4265 }
4266 }
4267
4268 relocation = (base_got->output_section->vma
4269 + base_got->output_offset + off);
4270
4271 goto do_relocation;
4272 }
4273 }
4274
4275 resolved_to_zero = (eh != NULL
4276 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
4277
4278 /* When generating a shared object, the relocations handled here are
4279 copied into the output file to be resolved at run time. */
4280 switch (r_type)
4281 {
4282 case R_X86_64_GOT32:
4283 case R_X86_64_GOT64:
4284 /* Relocation is to the entry for this symbol in the global
4285 offset table. */
4286 case R_X86_64_GOTPCREL:
4287 case R_X86_64_GOTPCRELX:
4288 case R_X86_64_REX_GOTPCRELX:
4289 case R_X86_64_GOTPCREL64:
4290 /* Use global offset table entry as symbol value. */
4291 case R_X86_64_GOTPLT64:
4292 /* This is obsolete and treated the the same as GOT64. */
4293 base_got = htab->elf.sgot;
4294
4295 if (htab->elf.sgot == NULL)
4296 abort ();
4297
4298 if (h != NULL)
4299 {
4300 bfd_boolean dyn;
4301
4302 off = h->got.offset;
4303 if (h->needs_plt
4304 && h->plt.offset != (bfd_vma)-1
4305 && off == (bfd_vma)-1)
4306 {
4307 /* We can't use h->got.offset here to save
4308 state, or even just remember the offset, as
4309 finish_dynamic_symbol would use that as offset into
4310 .got. */
4311 bfd_vma plt_index = h->plt.offset / plt_entry_size - 1;
4312 off = (plt_index + 3) * GOT_ENTRY_SIZE;
4313 base_got = htab->elf.sgotplt;
4314 }
4315
4316 dyn = htab->elf.dynamic_sections_created;
4317
4318 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
4319 || (bfd_link_pic (info)
4320 && SYMBOL_REFERENCES_LOCAL (info, h))
4321 || (ELF_ST_VISIBILITY (h->other)
4322 && h->root.type == bfd_link_hash_undefweak))
4323 {
4324 /* This is actually a static link, or it is a -Bsymbolic
4325 link and the symbol is defined locally, or the symbol
4326 was forced to be local because of a version file. We
4327 must initialize this entry in the global offset table.
4328 Since the offset must always be a multiple of 8, we
4329 use the least significant bit to record whether we
4330 have initialized it already.
4331
4332 When doing a dynamic link, we create a .rela.got
4333 relocation entry to initialize the value. This is
4334 done in the finish_dynamic_symbol routine. */
4335 if ((off & 1) != 0)
4336 off &= ~1;
4337 else
4338 {
4339 bfd_put_64 (output_bfd, relocation,
4340 base_got->contents + off);
4341 /* Note that this is harmless for the GOTPLT64 case,
4342 as -1 | 1 still is -1. */
4343 h->got.offset |= 1;
4344 }
4345 }
4346 else
4347 unresolved_reloc = FALSE;
4348 }
4349 else
4350 {
4351 if (local_got_offsets == NULL)
4352 abort ();
4353
4354 off = local_got_offsets[r_symndx];
4355
4356 /* The offset must always be a multiple of 8. We use
4357 the least significant bit to record whether we have
4358 already generated the necessary reloc. */
4359 if ((off & 1) != 0)
4360 off &= ~1;
4361 else
4362 {
4363 bfd_put_64 (output_bfd, relocation,
4364 base_got->contents + off);
4365
4366 if (bfd_link_pic (info))
4367 {
4368 asection *s;
4369 Elf_Internal_Rela outrel;
4370
4371 /* We need to generate a R_X86_64_RELATIVE reloc
4372 for the dynamic linker. */
4373 s = htab->elf.srelgot;
4374 if (s == NULL)
4375 abort ();
4376
4377 outrel.r_offset = (base_got->output_section->vma
4378 + base_got->output_offset
4379 + off);
4380 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4381 outrel.r_addend = relocation;
4382 elf_append_rela (output_bfd, s, &outrel);
4383 }
4384
4385 local_got_offsets[r_symndx] |= 1;
4386 }
4387 }
4388
4389 if (off >= (bfd_vma) -2)
4390 abort ();
4391
4392 relocation = base_got->output_section->vma
4393 + base_got->output_offset + off;
4394 if (r_type != R_X86_64_GOTPCREL
4395 && r_type != R_X86_64_GOTPCRELX
4396 && r_type != R_X86_64_REX_GOTPCRELX
4397 && r_type != R_X86_64_GOTPCREL64)
4398 relocation -= htab->elf.sgotplt->output_section->vma
4399 - htab->elf.sgotplt->output_offset;
4400
4401 break;
4402
4403 case R_X86_64_GOTOFF64:
4404 /* Relocation is relative to the start of the global offset
4405 table. */
4406
4407 /* Check to make sure it isn't a protected function or data
4408 symbol for shared library since it may not be local when
4409 used as function address or with copy relocation. We also
4410 need to make sure that a symbol is referenced locally. */
4411 if (bfd_link_pic (info) && h)
4412 {
4413 if (!h->def_regular)
4414 {
4415 const char *v;
4416
4417 switch (ELF_ST_VISIBILITY (h->other))
4418 {
4419 case STV_HIDDEN:
4420 v = _("hidden symbol");
4421 break;
4422 case STV_INTERNAL:
4423 v = _("internal symbol");
4424 break;
4425 case STV_PROTECTED:
4426 v = _("protected symbol");
4427 break;
4428 default:
4429 v = _("symbol");
4430 break;
4431 }
4432
4433 (*_bfd_error_handler)
4434 (_("%B: relocation R_X86_64_GOTOFF64 against undefined %s `%s' can not be used when making a shared object"),
4435 input_bfd, v, h->root.root.string);
4436 bfd_set_error (bfd_error_bad_value);
4437 return FALSE;
4438 }
4439 else if (!bfd_link_executable (info)
4440 && !SYMBOL_REFERENCES_LOCAL (info, h)
4441 && (h->type == STT_FUNC
4442 || h->type == STT_OBJECT)
4443 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
4444 {
4445 (*_bfd_error_handler)
4446 (_("%B: relocation R_X86_64_GOTOFF64 against protected %s `%s' can not be used when making a shared object"),
4447 input_bfd,
4448 h->type == STT_FUNC ? "function" : "data",
4449 h->root.root.string);
4450 bfd_set_error (bfd_error_bad_value);
4451 return FALSE;
4452 }
4453 }
4454
4455 /* Note that sgot is not involved in this
4456 calculation. We always want the start of .got.plt. If we
4457 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
4458 permitted by the ABI, we might have to change this
4459 calculation. */
4460 relocation -= htab->elf.sgotplt->output_section->vma
4461 + htab->elf.sgotplt->output_offset;
4462 break;
4463
4464 case R_X86_64_GOTPC32:
4465 case R_X86_64_GOTPC64:
4466 /* Use global offset table as symbol value. */
4467 relocation = htab->elf.sgotplt->output_section->vma
4468 + htab->elf.sgotplt->output_offset;
4469 unresolved_reloc = FALSE;
4470 break;
4471
4472 case R_X86_64_PLTOFF64:
4473 /* Relocation is PLT entry relative to GOT. For local
4474 symbols it's the symbol itself relative to GOT. */
4475 if (h != NULL
4476 /* See PLT32 handling. */
4477 && h->plt.offset != (bfd_vma) -1
4478 && htab->elf.splt != NULL)
4479 {
4480 if (htab->plt_bnd != NULL)
4481 {
4482 resolved_plt = htab->plt_bnd;
4483 plt_offset = eh->plt_bnd.offset;
4484 }
4485 else
4486 {
4487 resolved_plt = htab->elf.splt;
4488 plt_offset = h->plt.offset;
4489 }
4490
4491 relocation = (resolved_plt->output_section->vma
4492 + resolved_plt->output_offset
4493 + plt_offset);
4494 unresolved_reloc = FALSE;
4495 }
4496
4497 relocation -= htab->elf.sgotplt->output_section->vma
4498 + htab->elf.sgotplt->output_offset;
4499 break;
4500
4501 case R_X86_64_PLT32:
4502 case R_X86_64_PLT32_BND:
4503 /* Relocation is to the entry for this symbol in the
4504 procedure linkage table. */
4505
4506 /* Resolve a PLT32 reloc against a local symbol directly,
4507 without using the procedure linkage table. */
4508 if (h == NULL)
4509 break;
4510
4511 if ((h->plt.offset == (bfd_vma) -1
4512 && eh->plt_got.offset == (bfd_vma) -1)
4513 || htab->elf.splt == NULL)
4514 {
4515 /* We didn't make a PLT entry for this symbol. This
4516 happens when statically linking PIC code, or when
4517 using -Bsymbolic. */
4518 break;
4519 }
4520
4521 if (h->plt.offset != (bfd_vma) -1)
4522 {
4523 if (htab->plt_bnd != NULL)
4524 {
4525 resolved_plt = htab->plt_bnd;
4526 plt_offset = eh->plt_bnd.offset;
4527 }
4528 else
4529 {
4530 resolved_plt = htab->elf.splt;
4531 plt_offset = h->plt.offset;
4532 }
4533 }
4534 else
4535 {
4536 /* Use the GOT PLT. */
4537 resolved_plt = htab->plt_got;
4538 plt_offset = eh->plt_got.offset;
4539 }
4540
4541 relocation = (resolved_plt->output_section->vma
4542 + resolved_plt->output_offset
4543 + plt_offset);
4544 unresolved_reloc = FALSE;
4545 break;
4546
4547 case R_X86_64_SIZE32:
4548 case R_X86_64_SIZE64:
4549 /* Set to symbol size. */
4550 relocation = st_size;
4551 goto direct;
4552
4553 case R_X86_64_PC8:
4554 case R_X86_64_PC16:
4555 case R_X86_64_PC32:
4556 case R_X86_64_PC32_BND:
4557 /* Don't complain about -fPIC if the symbol is undefined when
4558 building executable unless it is unresolved weak symbol. */
4559 if ((input_section->flags & SEC_ALLOC) != 0
4560 && (input_section->flags & SEC_READONLY) != 0
4561 && h != NULL
4562 && ((bfd_link_executable (info)
4563 && h->root.type == bfd_link_hash_undefweak
4564 && !resolved_to_zero)
4565 || (bfd_link_pic (info)
4566 && !(bfd_link_pie (info)
4567 && h->root.type == bfd_link_hash_undefined))))
4568 {
4569 bfd_boolean fail = FALSE;
4570 bfd_boolean branch
4571 = ((r_type == R_X86_64_PC32
4572 || r_type == R_X86_64_PC32_BND)
4573 && is_32bit_relative_branch (contents, rel->r_offset));
4574
4575 if (SYMBOL_REFERENCES_LOCAL (info, h))
4576 {
4577 /* Symbol is referenced locally. Make sure it is
4578 defined locally or for a branch. */
4579 fail = !h->def_regular && !branch;
4580 }
4581 else if (!(bfd_link_pie (info)
4582 && (h->needs_copy || eh->needs_copy)))
4583 {
4584 /* Symbol doesn't need copy reloc and isn't referenced
4585 locally. We only allow branch to symbol with
4586 non-default visibility. */
4587 fail = (!branch
4588 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT);
4589 }
4590
4591 if (fail)
4592 return elf_x86_64_need_pic (input_bfd, input_section,
4593 h, NULL, NULL, howto);
4594 }
4595 /* Fall through. */
4596
4597 case R_X86_64_8:
4598 case R_X86_64_16:
4599 case R_X86_64_32:
4600 case R_X86_64_PC64:
4601 case R_X86_64_64:
4602 /* FIXME: The ABI says the linker should make sure the value is
4603 the same when it's zeroextended to 64 bit. */
4604
4605 direct:
4606 if ((input_section->flags & SEC_ALLOC) == 0)
4607 break;
4608
4609 /* Don't copy a pc-relative relocation into the output file
4610 if the symbol needs copy reloc or the symbol is undefined
4611 when building executable. Copy dynamic function pointer
4612 relocations. Don't generate dynamic relocations against
4613 resolved undefined weak symbols in PIE. */
4614 if ((bfd_link_pic (info)
4615 && !(bfd_link_pie (info)
4616 && h != NULL
4617 && (h->needs_copy
4618 || eh->needs_copy
4619 || h->root.type == bfd_link_hash_undefined)
4620 && IS_X86_64_PCREL_TYPE (r_type))
4621 && (h == NULL
4622 || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4623 && !resolved_to_zero)
4624 || h->root.type != bfd_link_hash_undefweak))
4625 && ((! IS_X86_64_PCREL_TYPE (r_type)
4626 && r_type != R_X86_64_SIZE32
4627 && r_type != R_X86_64_SIZE64)
4628 || ! SYMBOL_CALLS_LOCAL (info, h)))
4629 || (ELIMINATE_COPY_RELOCS
4630 && !bfd_link_pic (info)
4631 && h != NULL
4632 && h->dynindx != -1
4633 && (!h->non_got_ref
4634 || eh->func_pointer_refcount > 0
4635 || (h->root.type == bfd_link_hash_undefweak
4636 && !resolved_to_zero))
4637 && ((h->def_dynamic && !h->def_regular)
4638 /* Undefined weak symbol is bound locally when
4639 PIC is false. */
4640 || h->root.type == bfd_link_hash_undefined)))
4641 {
4642 Elf_Internal_Rela outrel;
4643 bfd_boolean skip, relocate;
4644 asection *sreloc;
4645
4646 /* When generating a shared object, these relocations
4647 are copied into the output file to be resolved at run
4648 time. */
4649 skip = FALSE;
4650 relocate = FALSE;
4651
4652 outrel.r_offset =
4653 _bfd_elf_section_offset (output_bfd, info, input_section,
4654 rel->r_offset);
4655 if (outrel.r_offset == (bfd_vma) -1)
4656 skip = TRUE;
4657 else if (outrel.r_offset == (bfd_vma) -2)
4658 skip = TRUE, relocate = TRUE;
4659
4660 outrel.r_offset += (input_section->output_section->vma
4661 + input_section->output_offset);
4662
4663 if (skip)
4664 memset (&outrel, 0, sizeof outrel);
4665
4666 /* h->dynindx may be -1 if this symbol was marked to
4667 become local. */
4668 else if (h != NULL
4669 && h->dynindx != -1
4670 && (IS_X86_64_PCREL_TYPE (r_type)
4671 || !(bfd_link_executable (info)
4672 || SYMBOLIC_BIND (info, h))
4673 || ! h->def_regular))
4674 {
4675 outrel.r_info = htab->r_info (h->dynindx, r_type);
4676 outrel.r_addend = rel->r_addend;
4677 }
4678 else
4679 {
4680 /* This symbol is local, or marked to become local.
4681 When relocation overflow check is disabled, we
4682 convert R_X86_64_32 to dynamic R_X86_64_RELATIVE. */
4683 if (r_type == htab->pointer_r_type
4684 || (r_type == R_X86_64_32
4685 && info->no_reloc_overflow_check))
4686 {
4687 relocate = TRUE;
4688 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4689 outrel.r_addend = relocation + rel->r_addend;
4690 }
4691 else if (r_type == R_X86_64_64
4692 && !ABI_64_P (output_bfd))
4693 {
4694 relocate = TRUE;
4695 outrel.r_info = htab->r_info (0,
4696 R_X86_64_RELATIVE64);
4697 outrel.r_addend = relocation + rel->r_addend;
4698 /* Check addend overflow. */
4699 if ((outrel.r_addend & 0x80000000)
4700 != (rel->r_addend & 0x80000000))
4701 {
4702 const char *name;
4703 int addend = rel->r_addend;
4704 if (h && h->root.root.string)
4705 name = h->root.root.string;
4706 else
4707 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
4708 sym, NULL);
4709 if (addend < 0)
4710 (*_bfd_error_handler)
4711 (_("%B: addend -0x%x in relocation %s against "
4712 "symbol `%s' at 0x%lx in section `%A' is "
4713 "out of range"),
4714 input_bfd, input_section, addend,
4715 howto->name, name,
4716 (unsigned long) rel->r_offset);
4717 else
4718 (*_bfd_error_handler)
4719 (_("%B: addend 0x%x in relocation %s against "
4720 "symbol `%s' at 0x%lx in section `%A' is "
4721 "out of range"),
4722 input_bfd, input_section, addend,
4723 howto->name, name,
4724 (unsigned long) rel->r_offset);
4725 bfd_set_error (bfd_error_bad_value);
4726 return FALSE;
4727 }
4728 }
4729 else
4730 {
4731 long sindx;
4732
4733 if (bfd_is_abs_section (sec))
4734 sindx = 0;
4735 else if (sec == NULL || sec->owner == NULL)
4736 {
4737 bfd_set_error (bfd_error_bad_value);
4738 return FALSE;
4739 }
4740 else
4741 {
4742 asection *osec;
4743
4744 /* We are turning this relocation into one
4745 against a section symbol. It would be
4746 proper to subtract the symbol's value,
4747 osec->vma, from the emitted reloc addend,
4748 but ld.so expects buggy relocs. */
4749 osec = sec->output_section;
4750 sindx = elf_section_data (osec)->dynindx;
4751 if (sindx == 0)
4752 {
4753 asection *oi = htab->elf.text_index_section;
4754 sindx = elf_section_data (oi)->dynindx;
4755 }
4756 BFD_ASSERT (sindx != 0);
4757 }
4758
4759 outrel.r_info = htab->r_info (sindx, r_type);
4760 outrel.r_addend = relocation + rel->r_addend;
4761 }
4762 }
4763
4764 sreloc = elf_section_data (input_section)->sreloc;
4765
4766 if (sreloc == NULL || sreloc->contents == NULL)
4767 {
4768 r = bfd_reloc_notsupported;
4769 goto check_relocation_error;
4770 }
4771
4772 elf_append_rela (output_bfd, sreloc, &outrel);
4773
4774 /* If this reloc is against an external symbol, we do
4775 not want to fiddle with the addend. Otherwise, we
4776 need to include the symbol value so that it becomes
4777 an addend for the dynamic reloc. */
4778 if (! relocate)
4779 continue;
4780 }
4781
4782 break;
4783
4784 case R_X86_64_TLSGD:
4785 case R_X86_64_GOTPC32_TLSDESC:
4786 case R_X86_64_TLSDESC_CALL:
4787 case R_X86_64_GOTTPOFF:
4788 tls_type = GOT_UNKNOWN;
4789 if (h == NULL && local_got_offsets)
4790 tls_type = elf_x86_64_local_got_tls_type (input_bfd) [r_symndx];
4791 else if (h != NULL)
4792 tls_type = elf_x86_64_hash_entry (h)->tls_type;
4793
4794 if (! elf_x86_64_tls_transition (info, input_bfd,
4795 input_section, contents,
4796 symtab_hdr, sym_hashes,
4797 &r_type, tls_type, rel,
4798 relend, h, r_symndx))
4799 return FALSE;
4800
4801 if (r_type == R_X86_64_TPOFF32)
4802 {
4803 bfd_vma roff = rel->r_offset;
4804
4805 BFD_ASSERT (! unresolved_reloc);
4806
4807 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
4808 {
4809 /* GD->LE transition. For 64bit, change
4810 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4811 .word 0x6666; rex64; call __tls_get_addr
4812 into:
4813 movq %fs:0, %rax
4814 leaq foo@tpoff(%rax), %rax
4815 For 32bit, change
4816 leaq foo@tlsgd(%rip), %rdi
4817 .word 0x6666; rex64; call __tls_get_addr
4818 into:
4819 movl %fs:0, %eax
4820 leaq foo@tpoff(%rax), %rax
4821 For largepic, change:
4822 leaq foo@tlsgd(%rip), %rdi
4823 movabsq $__tls_get_addr@pltoff, %rax
4824 addq %rbx, %rax
4825 call *%rax
4826 into:
4827 movq %fs:0, %rax
4828 leaq foo@tpoff(%rax), %rax
4829 nopw 0x0(%rax,%rax,1) */
4830 int largepic = 0;
4831 if (ABI_64_P (output_bfd)
4832 && contents[roff + 5] == (bfd_byte) '\xb8')
4833 {
4834 memcpy (contents + roff - 3,
4835 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80"
4836 "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
4837 largepic = 1;
4838 }
4839 else if (ABI_64_P (output_bfd))
4840 memcpy (contents + roff - 4,
4841 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
4842 16);
4843 else
4844 memcpy (contents + roff - 3,
4845 "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
4846 15);
4847 bfd_put_32 (output_bfd,
4848 elf_x86_64_tpoff (info, relocation),
4849 contents + roff + 8 + largepic);
4850 /* Skip R_X86_64_PC32/R_X86_64_PLT32/R_X86_64_PLTOFF64. */
4851 rel++;
4852 wrel++;
4853 continue;
4854 }
4855 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
4856 {
4857 /* GDesc -> LE transition.
4858 It's originally something like:
4859 leaq x@tlsdesc(%rip), %rax
4860
4861 Change it to:
4862 movl $x@tpoff, %rax. */
4863
4864 unsigned int val, type;
4865
4866 type = bfd_get_8 (input_bfd, contents + roff - 3);
4867 val = bfd_get_8 (input_bfd, contents + roff - 1);
4868 bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
4869 contents + roff - 3);
4870 bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
4871 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4872 contents + roff - 1);
4873 bfd_put_32 (output_bfd,
4874 elf_x86_64_tpoff (info, relocation),
4875 contents + roff);
4876 continue;
4877 }
4878 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
4879 {
4880 /* GDesc -> LE transition.
4881 It's originally:
4882 call *(%rax)
4883 Turn it into:
4884 xchg %ax,%ax. */
4885 bfd_put_8 (output_bfd, 0x66, contents + roff);
4886 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4887 continue;
4888 }
4889 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTTPOFF)
4890 {
4891 /* IE->LE transition:
4892 For 64bit, originally it can be one of:
4893 movq foo@gottpoff(%rip), %reg
4894 addq foo@gottpoff(%rip), %reg
4895 We change it into:
4896 movq $foo, %reg
4897 leaq foo(%reg), %reg
4898 addq $foo, %reg.
4899 For 32bit, originally it can be one of:
4900 movq foo@gottpoff(%rip), %reg
4901 addl foo@gottpoff(%rip), %reg
4902 We change it into:
4903 movq $foo, %reg
4904 leal foo(%reg), %reg
4905 addl $foo, %reg. */
4906
4907 unsigned int val, type, reg;
4908
4909 if (roff >= 3)
4910 val = bfd_get_8 (input_bfd, contents + roff - 3);
4911 else
4912 val = 0;
4913 type = bfd_get_8 (input_bfd, contents + roff - 2);
4914 reg = bfd_get_8 (input_bfd, contents + roff - 1);
4915 reg >>= 3;
4916 if (type == 0x8b)
4917 {
4918 /* movq */
4919 if (val == 0x4c)
4920 bfd_put_8 (output_bfd, 0x49,
4921 contents + roff - 3);
4922 else if (!ABI_64_P (output_bfd) && val == 0x44)
4923 bfd_put_8 (output_bfd, 0x41,
4924 contents + roff - 3);
4925 bfd_put_8 (output_bfd, 0xc7,
4926 contents + roff - 2);
4927 bfd_put_8 (output_bfd, 0xc0 | reg,
4928 contents + roff - 1);
4929 }
4930 else if (reg == 4)
4931 {
4932 /* addq/addl -> addq/addl - addressing with %rsp/%r12
4933 is special */
4934 if (val == 0x4c)
4935 bfd_put_8 (output_bfd, 0x49,
4936 contents + roff - 3);
4937 else if (!ABI_64_P (output_bfd) && val == 0x44)
4938 bfd_put_8 (output_bfd, 0x41,
4939 contents + roff - 3);
4940 bfd_put_8 (output_bfd, 0x81,
4941 contents + roff - 2);
4942 bfd_put_8 (output_bfd, 0xc0 | reg,
4943 contents + roff - 1);
4944 }
4945 else
4946 {
4947 /* addq/addl -> leaq/leal */
4948 if (val == 0x4c)
4949 bfd_put_8 (output_bfd, 0x4d,
4950 contents + roff - 3);
4951 else if (!ABI_64_P (output_bfd) && val == 0x44)
4952 bfd_put_8 (output_bfd, 0x45,
4953 contents + roff - 3);
4954 bfd_put_8 (output_bfd, 0x8d,
4955 contents + roff - 2);
4956 bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
4957 contents + roff - 1);
4958 }
4959 bfd_put_32 (output_bfd,
4960 elf_x86_64_tpoff (info, relocation),
4961 contents + roff);
4962 continue;
4963 }
4964 else
4965 BFD_ASSERT (FALSE);
4966 }
4967
4968 if (htab->elf.sgot == NULL)
4969 abort ();
4970
4971 if (h != NULL)
4972 {
4973 off = h->got.offset;
4974 offplt = elf_x86_64_hash_entry (h)->tlsdesc_got;
4975 }
4976 else
4977 {
4978 if (local_got_offsets == NULL)
4979 abort ();
4980
4981 off = local_got_offsets[r_symndx];
4982 offplt = local_tlsdesc_gotents[r_symndx];
4983 }
4984
4985 if ((off & 1) != 0)
4986 off &= ~1;
4987 else
4988 {
4989 Elf_Internal_Rela outrel;
4990 int dr_type, indx;
4991 asection *sreloc;
4992
4993 if (htab->elf.srelgot == NULL)
4994 abort ();
4995
4996 indx = h && h->dynindx != -1 ? h->dynindx : 0;
4997
4998 if (GOT_TLS_GDESC_P (tls_type))
4999 {
5000 outrel.r_info = htab->r_info (indx, R_X86_64_TLSDESC);
5001 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
5002 + 2 * GOT_ENTRY_SIZE <= htab->elf.sgotplt->size);
5003 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
5004 + htab->elf.sgotplt->output_offset
5005 + offplt
5006 + htab->sgotplt_jump_table_size);
5007 sreloc = htab->elf.srelplt;
5008 if (indx == 0)
5009 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
5010 else
5011 outrel.r_addend = 0;
5012 elf_append_rela (output_bfd, sreloc, &outrel);
5013 }
5014
5015 sreloc = htab->elf.srelgot;
5016
5017 outrel.r_offset = (htab->elf.sgot->output_section->vma
5018 + htab->elf.sgot->output_offset + off);
5019
5020 if (GOT_TLS_GD_P (tls_type))
5021 dr_type = R_X86_64_DTPMOD64;
5022 else if (GOT_TLS_GDESC_P (tls_type))
5023 goto dr_done;
5024 else
5025 dr_type = R_X86_64_TPOFF64;
5026
5027 bfd_put_64 (output_bfd, 0, htab->elf.sgot->contents + off);
5028 outrel.r_addend = 0;
5029 if ((dr_type == R_X86_64_TPOFF64
5030 || dr_type == R_X86_64_TLSDESC) && indx == 0)
5031 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
5032 outrel.r_info = htab->r_info (indx, dr_type);
5033
5034 elf_append_rela (output_bfd, sreloc, &outrel);
5035
5036 if (GOT_TLS_GD_P (tls_type))
5037 {
5038 if (indx == 0)
5039 {
5040 BFD_ASSERT (! unresolved_reloc);
5041 bfd_put_64 (output_bfd,
5042 relocation - elf_x86_64_dtpoff_base (info),
5043 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
5044 }
5045 else
5046 {
5047 bfd_put_64 (output_bfd, 0,
5048 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
5049 outrel.r_info = htab->r_info (indx,
5050 R_X86_64_DTPOFF64);
5051 outrel.r_offset += GOT_ENTRY_SIZE;
5052 elf_append_rela (output_bfd, sreloc,
5053 &outrel);
5054 }
5055 }
5056
5057 dr_done:
5058 if (h != NULL)
5059 h->got.offset |= 1;
5060 else
5061 local_got_offsets[r_symndx] |= 1;
5062 }
5063
5064 if (off >= (bfd_vma) -2
5065 && ! GOT_TLS_GDESC_P (tls_type))
5066 abort ();
5067 if (r_type == ELF32_R_TYPE (rel->r_info))
5068 {
5069 if (r_type == R_X86_64_GOTPC32_TLSDESC
5070 || r_type == R_X86_64_TLSDESC_CALL)
5071 relocation = htab->elf.sgotplt->output_section->vma
5072 + htab->elf.sgotplt->output_offset
5073 + offplt + htab->sgotplt_jump_table_size;
5074 else
5075 relocation = htab->elf.sgot->output_section->vma
5076 + htab->elf.sgot->output_offset + off;
5077 unresolved_reloc = FALSE;
5078 }
5079 else
5080 {
5081 bfd_vma roff = rel->r_offset;
5082
5083 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
5084 {
5085 /* GD->IE transition. For 64bit, change
5086 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
5087 .word 0x6666; rex64; call __tls_get_addr@plt
5088 into:
5089 movq %fs:0, %rax
5090 addq foo@gottpoff(%rip), %rax
5091 For 32bit, change
5092 leaq foo@tlsgd(%rip), %rdi
5093 .word 0x6666; rex64; call __tls_get_addr@plt
5094 into:
5095 movl %fs:0, %eax
5096 addq foo@gottpoff(%rip), %rax
5097 For largepic, change:
5098 leaq foo@tlsgd(%rip), %rdi
5099 movabsq $__tls_get_addr@pltoff, %rax
5100 addq %rbx, %rax
5101 call *%rax
5102 into:
5103 movq %fs:0, %rax
5104 addq foo@gottpoff(%rax), %rax
5105 nopw 0x0(%rax,%rax,1) */
5106 int largepic = 0;
5107 if (ABI_64_P (output_bfd)
5108 && contents[roff + 5] == (bfd_byte) '\xb8')
5109 {
5110 memcpy (contents + roff - 3,
5111 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05"
5112 "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
5113 largepic = 1;
5114 }
5115 else if (ABI_64_P (output_bfd))
5116 memcpy (contents + roff - 4,
5117 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
5118 16);
5119 else
5120 memcpy (contents + roff - 3,
5121 "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
5122 15);
5123
5124 relocation = (htab->elf.sgot->output_section->vma
5125 + htab->elf.sgot->output_offset + off
5126 - roff
5127 - largepic
5128 - input_section->output_section->vma
5129 - input_section->output_offset
5130 - 12);
5131 bfd_put_32 (output_bfd, relocation,
5132 contents + roff + 8 + largepic);
5133 /* Skip R_X86_64_PLT32/R_X86_64_PLTOFF64. */
5134 rel++;
5135 wrel++;
5136 continue;
5137 }
5138 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
5139 {
5140 /* GDesc -> IE transition.
5141 It's originally something like:
5142 leaq x@tlsdesc(%rip), %rax
5143
5144 Change it to:
5145 movq x@gottpoff(%rip), %rax # before xchg %ax,%ax. */
5146
5147 /* Now modify the instruction as appropriate. To
5148 turn a leaq into a movq in the form we use it, it
5149 suffices to change the second byte from 0x8d to
5150 0x8b. */
5151 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
5152
5153 bfd_put_32 (output_bfd,
5154 htab->elf.sgot->output_section->vma
5155 + htab->elf.sgot->output_offset + off
5156 - rel->r_offset
5157 - input_section->output_section->vma
5158 - input_section->output_offset
5159 - 4,
5160 contents + roff);
5161 continue;
5162 }
5163 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
5164 {
5165 /* GDesc -> IE transition.
5166 It's originally:
5167 call *(%rax)
5168
5169 Change it to:
5170 xchg %ax, %ax. */
5171
5172 bfd_put_8 (output_bfd, 0x66, contents + roff);
5173 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
5174 continue;
5175 }
5176 else
5177 BFD_ASSERT (FALSE);
5178 }
5179 break;
5180
5181 case R_X86_64_TLSLD:
5182 if (! elf_x86_64_tls_transition (info, input_bfd,
5183 input_section, contents,
5184 symtab_hdr, sym_hashes,
5185 &r_type, GOT_UNKNOWN,
5186 rel, relend, h, r_symndx))
5187 return FALSE;
5188
5189 if (r_type != R_X86_64_TLSLD)
5190 {
5191 /* LD->LE transition:
5192 leaq foo@tlsld(%rip), %rdi; call __tls_get_addr.
5193 For 64bit, we change it into:
5194 .word 0x6666; .byte 0x66; movq %fs:0, %rax.
5195 For 32bit, we change it into:
5196 nopl 0x0(%rax); movl %fs:0, %eax.
5197 For largepic, change:
5198 leaq foo@tlsgd(%rip), %rdi
5199 movabsq $__tls_get_addr@pltoff, %rax
5200 addq %rbx, %rax
5201 call *%rax
5202 into:
5203 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
5204 movq %fs:0, %eax */
5205
5206 BFD_ASSERT (r_type == R_X86_64_TPOFF32);
5207 if (ABI_64_P (output_bfd)
5208 && contents[rel->r_offset + 5] == (bfd_byte) '\xb8')
5209 memcpy (contents + rel->r_offset - 3,
5210 "\x66\x66\x66\x66\x2e\x0f\x1f\x84\0\0\0\0\0"
5211 "\x64\x48\x8b\x04\x25\0\0\0", 22);
5212 else if (ABI_64_P (output_bfd))
5213 memcpy (contents + rel->r_offset - 3,
5214 "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
5215 else
5216 memcpy (contents + rel->r_offset - 3,
5217 "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
5218 /* Skip R_X86_64_PC32/R_X86_64_PLT32/R_X86_64_PLTOFF64. */
5219 rel++;
5220 wrel++;
5221 continue;
5222 }
5223
5224 if (htab->elf.sgot == NULL)
5225 abort ();
5226
5227 off = htab->tls_ld_got.offset;
5228 if (off & 1)
5229 off &= ~1;
5230 else
5231 {
5232 Elf_Internal_Rela outrel;
5233
5234 if (htab->elf.srelgot == NULL)
5235 abort ();
5236
5237 outrel.r_offset = (htab->elf.sgot->output_section->vma
5238 + htab->elf.sgot->output_offset + off);
5239
5240 bfd_put_64 (output_bfd, 0,
5241 htab->elf.sgot->contents + off);
5242 bfd_put_64 (output_bfd, 0,
5243 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
5244 outrel.r_info = htab->r_info (0, R_X86_64_DTPMOD64);
5245 outrel.r_addend = 0;
5246 elf_append_rela (output_bfd, htab->elf.srelgot,
5247 &outrel);
5248 htab->tls_ld_got.offset |= 1;
5249 }
5250 relocation = htab->elf.sgot->output_section->vma
5251 + htab->elf.sgot->output_offset + off;
5252 unresolved_reloc = FALSE;
5253 break;
5254
5255 case R_X86_64_DTPOFF32:
5256 if (!bfd_link_executable (info)
5257 || (input_section->flags & SEC_CODE) == 0)
5258 relocation -= elf_x86_64_dtpoff_base (info);
5259 else
5260 relocation = elf_x86_64_tpoff (info, relocation);
5261 break;
5262
5263 case R_X86_64_TPOFF32:
5264 case R_X86_64_TPOFF64:
5265 BFD_ASSERT (bfd_link_executable (info));
5266 relocation = elf_x86_64_tpoff (info, relocation);
5267 break;
5268
5269 case R_X86_64_DTPOFF64:
5270 BFD_ASSERT ((input_section->flags & SEC_CODE) == 0);
5271 relocation -= elf_x86_64_dtpoff_base (info);
5272 break;
5273
5274 default:
5275 break;
5276 }
5277
5278 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5279 because such sections are not SEC_ALLOC and thus ld.so will
5280 not process them. */
5281 if (unresolved_reloc
5282 && !((input_section->flags & SEC_DEBUGGING) != 0
5283 && h->def_dynamic)
5284 && _bfd_elf_section_offset (output_bfd, info, input_section,
5285 rel->r_offset) != (bfd_vma) -1)
5286 {
5287 (*_bfd_error_handler)
5288 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5289 input_bfd,
5290 input_section,
5291 (long) rel->r_offset,
5292 howto->name,
5293 h->root.root.string);
5294 return FALSE;
5295 }
5296
5297 do_relocation:
5298 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5299 contents, rel->r_offset,
5300 relocation, rel->r_addend);
5301
5302 check_relocation_error:
5303 if (r != bfd_reloc_ok)
5304 {
5305 const char *name;
5306
5307 if (h != NULL)
5308 name = h->root.root.string;
5309 else
5310 {
5311 name = bfd_elf_string_from_elf_section (input_bfd,
5312 symtab_hdr->sh_link,
5313 sym->st_name);
5314 if (name == NULL)
5315 return FALSE;
5316 if (*name == '\0')
5317 name = bfd_section_name (input_bfd, sec);
5318 }
5319
5320 if (r == bfd_reloc_overflow)
5321 {
5322 if (! ((*info->callbacks->reloc_overflow)
5323 (info, (h ? &h->root : NULL), name, howto->name,
5324 (bfd_vma) 0, input_bfd, input_section,
5325 rel->r_offset)))
5326 return FALSE;
5327 }
5328 else
5329 {
5330 (*_bfd_error_handler)
5331 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
5332 input_bfd, input_section,
5333 (long) rel->r_offset, name, (int) r);
5334 return FALSE;
5335 }
5336 }
5337
5338 if (wrel != rel)
5339 *wrel = *rel;
5340 }
5341
5342 if (wrel != rel)
5343 {
5344 Elf_Internal_Shdr *rel_hdr;
5345 size_t deleted = rel - wrel;
5346
5347 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
5348 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5349 if (rel_hdr->sh_size == 0)
5350 {
5351 /* It is too late to remove an empty reloc section. Leave
5352 one NONE reloc.
5353 ??? What is wrong with an empty section??? */
5354 rel_hdr->sh_size = rel_hdr->sh_entsize;
5355 deleted -= 1;
5356 }
5357 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
5358 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5359 input_section->reloc_count -= deleted;
5360 }
5361
5362 return TRUE;
5363 }
5364
5365 /* Finish up dynamic symbol handling. We set the contents of various
5366 dynamic sections here. */
5367
5368 static bfd_boolean
5369 elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
5370 struct bfd_link_info *info,
5371 struct elf_link_hash_entry *h,
5372 Elf_Internal_Sym *sym)
5373 {
5374 struct elf_x86_64_link_hash_table *htab;
5375 const struct elf_x86_64_backend_data *abed;
5376 bfd_boolean use_plt_bnd;
5377 struct elf_x86_64_link_hash_entry *eh;
5378 bfd_boolean local_undefweak;
5379
5380 htab = elf_x86_64_hash_table (info);
5381 if (htab == NULL)
5382 return FALSE;
5383
5384 /* Use MPX backend data in case of BND relocation. Use .plt_bnd
5385 section only if there is .plt section. */
5386 use_plt_bnd = htab->elf.splt != NULL && htab->plt_bnd != NULL;
5387 abed = (use_plt_bnd
5388 ? &elf_x86_64_bnd_arch_bed
5389 : get_elf_x86_64_backend_data (output_bfd));
5390
5391 eh = (struct elf_x86_64_link_hash_entry *) h;
5392
5393 /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
5394 resolved undefined weak symbols in executable so that their
5395 references have value 0 at run-time. */
5396 local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
5397
5398 if (h->plt.offset != (bfd_vma) -1)
5399 {
5400 bfd_vma plt_index;
5401 bfd_vma got_offset, plt_offset, plt_plt_offset, plt_got_offset;
5402 bfd_vma plt_plt_insn_end, plt_got_insn_size;
5403 Elf_Internal_Rela rela;
5404 bfd_byte *loc;
5405 asection *plt, *gotplt, *relplt, *resolved_plt;
5406 const struct elf_backend_data *bed;
5407 bfd_vma plt_got_pcrel_offset;
5408
5409 /* When building a static executable, use .iplt, .igot.plt and
5410 .rela.iplt sections for STT_GNU_IFUNC symbols. */
5411 if (htab->elf.splt != NULL)
5412 {
5413 plt = htab->elf.splt;
5414 gotplt = htab->elf.sgotplt;
5415 relplt = htab->elf.srelplt;
5416 }
5417 else
5418 {
5419 plt = htab->elf.iplt;
5420 gotplt = htab->elf.igotplt;
5421 relplt = htab->elf.irelplt;
5422 }
5423
5424 /* This symbol has an entry in the procedure linkage table. Set
5425 it up. */
5426 if ((h->dynindx == -1
5427 && !local_undefweak
5428 && !((h->forced_local || bfd_link_executable (info))
5429 && h->def_regular
5430 && h->type == STT_GNU_IFUNC))
5431 || plt == NULL
5432 || gotplt == NULL
5433 || relplt == NULL)
5434 abort ();
5435
5436 /* Get the index in the procedure linkage table which
5437 corresponds to this symbol. This is the index of this symbol
5438 in all the symbols for which we are making plt entries. The
5439 first entry in the procedure linkage table is reserved.
5440
5441 Get the offset into the .got table of the entry that
5442 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
5443 bytes. The first three are reserved for the dynamic linker.
5444
5445 For static executables, we don't reserve anything. */
5446
5447 if (plt == htab->elf.splt)
5448 {
5449 got_offset = h->plt.offset / abed->plt_entry_size - 1;
5450 got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
5451 }
5452 else
5453 {
5454 got_offset = h->plt.offset / abed->plt_entry_size;
5455 got_offset = got_offset * GOT_ENTRY_SIZE;
5456 }
5457
5458 plt_plt_insn_end = abed->plt_plt_insn_end;
5459 plt_plt_offset = abed->plt_plt_offset;
5460 plt_got_insn_size = abed->plt_got_insn_size;
5461 plt_got_offset = abed->plt_got_offset;
5462 if (use_plt_bnd)
5463 {
5464 /* Use the second PLT with BND relocations. */
5465 const bfd_byte *plt_entry, *plt2_entry;
5466
5467 if (eh->has_bnd_reloc)
5468 {
5469 plt_entry = elf_x86_64_bnd_plt_entry;
5470 plt2_entry = elf_x86_64_bnd_plt2_entry;
5471 }
5472 else
5473 {
5474 plt_entry = elf_x86_64_legacy_plt_entry;
5475 plt2_entry = elf_x86_64_legacy_plt2_entry;
5476
5477 /* Subtract 1 since there is no BND prefix. */
5478 plt_plt_insn_end -= 1;
5479 plt_plt_offset -= 1;
5480 plt_got_insn_size -= 1;
5481 plt_got_offset -= 1;
5482 }
5483
5484 BFD_ASSERT (sizeof (elf_x86_64_bnd_plt_entry)
5485 == sizeof (elf_x86_64_legacy_plt_entry));
5486
5487 /* Fill in the entry in the procedure linkage table. */
5488 memcpy (plt->contents + h->plt.offset,
5489 plt_entry, sizeof (elf_x86_64_legacy_plt_entry));
5490 /* Fill in the entry in the second PLT. */
5491 memcpy (htab->plt_bnd->contents + eh->plt_bnd.offset,
5492 plt2_entry, sizeof (elf_x86_64_legacy_plt2_entry));
5493
5494 resolved_plt = htab->plt_bnd;
5495 plt_offset = eh->plt_bnd.offset;
5496 }
5497 else
5498 {
5499 /* Fill in the entry in the procedure linkage table. */
5500 memcpy (plt->contents + h->plt.offset, abed->plt_entry,
5501 abed->plt_entry_size);
5502
5503 resolved_plt = plt;
5504 plt_offset = h->plt.offset;
5505 }
5506
5507 /* Insert the relocation positions of the plt section. */
5508
5509 /* Put offset the PC-relative instruction referring to the GOT entry,
5510 subtracting the size of that instruction. */
5511 plt_got_pcrel_offset = (gotplt->output_section->vma
5512 + gotplt->output_offset
5513 + got_offset
5514 - resolved_plt->output_section->vma
5515 - resolved_plt->output_offset
5516 - plt_offset
5517 - plt_got_insn_size);
5518
5519 /* Check PC-relative offset overflow in PLT entry. */
5520 if ((plt_got_pcrel_offset + 0x80000000) > 0xffffffff)
5521 info->callbacks->einfo (_("%F%B: PC-relative offset overflow in PLT entry for `%s'\n"),
5522 output_bfd, h->root.root.string);
5523
5524 bfd_put_32 (output_bfd, plt_got_pcrel_offset,
5525 resolved_plt->contents + plt_offset + plt_got_offset);
5526
5527 /* Fill in the entry in the global offset table, initially this
5528 points to the second part of the PLT entry. Leave the entry
5529 as zero for undefined weak symbol in PIE. No PLT relocation
5530 against undefined weak symbol in PIE. */
5531 if (!local_undefweak)
5532 {
5533 bfd_put_64 (output_bfd, (plt->output_section->vma
5534 + plt->output_offset
5535 + h->plt.offset
5536 + abed->plt_lazy_offset),
5537 gotplt->contents + got_offset);
5538
5539 /* Fill in the entry in the .rela.plt section. */
5540 rela.r_offset = (gotplt->output_section->vma
5541 + gotplt->output_offset
5542 + got_offset);
5543 if (h->dynindx == -1
5544 || ((bfd_link_executable (info)
5545 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5546 && h->def_regular
5547 && h->type == STT_GNU_IFUNC))
5548 {
5549 /* If an STT_GNU_IFUNC symbol is locally defined, generate
5550 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT. */
5551 rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
5552 rela.r_addend = (h->root.u.def.value
5553 + h->root.u.def.section->output_section->vma
5554 + h->root.u.def.section->output_offset);
5555 /* R_X86_64_IRELATIVE comes last. */
5556 plt_index = htab->next_irelative_index--;
5557 }
5558 else
5559 {
5560 rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
5561 rela.r_addend = 0;
5562 plt_index = htab->next_jump_slot_index++;
5563 }
5564
5565 /* Don't fill PLT entry for static executables. */
5566 if (plt == htab->elf.splt)
5567 {
5568 bfd_vma plt0_offset = h->plt.offset + plt_plt_insn_end;
5569
5570 /* Put relocation index. */
5571 bfd_put_32 (output_bfd, plt_index,
5572 (plt->contents + h->plt.offset
5573 + abed->plt_reloc_offset));
5574
5575 /* Put offset for jmp .PLT0 and check for overflow. We don't
5576 check relocation index for overflow since branch displacement
5577 will overflow first. */
5578 if (plt0_offset > 0x80000000)
5579 info->callbacks->einfo (_("%F%B: branch displacement overflow in PLT entry for `%s'\n"),
5580 output_bfd, h->root.root.string);
5581 bfd_put_32 (output_bfd, - plt0_offset,
5582 plt->contents + h->plt.offset + plt_plt_offset);
5583 }
5584
5585 bed = get_elf_backend_data (output_bfd);
5586 loc = relplt->contents + plt_index * bed->s->sizeof_rela;
5587 bed->s->swap_reloca_out (output_bfd, &rela, loc);
5588 }
5589 }
5590 else if (eh->plt_got.offset != (bfd_vma) -1)
5591 {
5592 bfd_vma got_offset, plt_offset, plt_got_offset, plt_got_insn_size;
5593 asection *plt, *got;
5594 bfd_boolean got_after_plt;
5595 int32_t got_pcrel_offset;
5596 const bfd_byte *got_plt_entry;
5597
5598 /* Set the entry in the GOT procedure linkage table. */
5599 plt = htab->plt_got;
5600 got = htab->elf.sgot;
5601 got_offset = h->got.offset;
5602
5603 if (got_offset == (bfd_vma) -1
5604 || h->type == STT_GNU_IFUNC
5605 || plt == NULL
5606 || got == NULL)
5607 abort ();
5608
5609 /* Use the second PLT entry template for the GOT PLT since they
5610 are the identical. */
5611 plt_got_insn_size = elf_x86_64_bnd_arch_bed.plt_got_insn_size;
5612 plt_got_offset = elf_x86_64_bnd_arch_bed.plt_got_offset;
5613 if (eh->has_bnd_reloc)
5614 got_plt_entry = elf_x86_64_bnd_plt2_entry;
5615 else
5616 {
5617 got_plt_entry = elf_x86_64_legacy_plt2_entry;
5618
5619 /* Subtract 1 since there is no BND prefix. */
5620 plt_got_insn_size -= 1;
5621 plt_got_offset -= 1;
5622 }
5623
5624 /* Fill in the entry in the GOT procedure linkage table. */
5625 plt_offset = eh->plt_got.offset;
5626 memcpy (plt->contents + plt_offset,
5627 got_plt_entry, sizeof (elf_x86_64_legacy_plt2_entry));
5628
5629 /* Put offset the PC-relative instruction referring to the GOT
5630 entry, subtracting the size of that instruction. */
5631 got_pcrel_offset = (got->output_section->vma
5632 + got->output_offset
5633 + got_offset
5634 - plt->output_section->vma
5635 - plt->output_offset
5636 - plt_offset
5637 - plt_got_insn_size);
5638
5639 /* Check PC-relative offset overflow in GOT PLT entry. */
5640 got_after_plt = got->output_section->vma > plt->output_section->vma;
5641 if ((got_after_plt && got_pcrel_offset < 0)
5642 || (!got_after_plt && got_pcrel_offset > 0))
5643 info->callbacks->einfo (_("%F%B: PC-relative offset overflow in GOT PLT entry for `%s'\n"),
5644 output_bfd, h->root.root.string);
5645
5646 bfd_put_32 (output_bfd, got_pcrel_offset,
5647 plt->contents + plt_offset + plt_got_offset);
5648 }
5649
5650 if (!local_undefweak
5651 && !h->def_regular
5652 && (h->plt.offset != (bfd_vma) -1
5653 || eh->plt_got.offset != (bfd_vma) -1))
5654 {
5655 /* Mark the symbol as undefined, rather than as defined in
5656 the .plt section. Leave the value if there were any
5657 relocations where pointer equality matters (this is a clue
5658 for the dynamic linker, to make function pointer
5659 comparisons work between an application and shared
5660 library), otherwise set it to zero. If a function is only
5661 called from a binary, there is no need to slow down
5662 shared libraries because of that. */
5663 sym->st_shndx = SHN_UNDEF;
5664 if (!h->pointer_equality_needed)
5665 sym->st_value = 0;
5666 }
5667
5668 /* Don't generate dynamic GOT relocation against undefined weak
5669 symbol in executable. */
5670 if (h->got.offset != (bfd_vma) -1
5671 && ! GOT_TLS_GD_ANY_P (elf_x86_64_hash_entry (h)->tls_type)
5672 && elf_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE
5673 && !local_undefweak)
5674 {
5675 Elf_Internal_Rela rela;
5676
5677 /* This symbol has an entry in the global offset table. Set it
5678 up. */
5679 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
5680 abort ();
5681
5682 rela.r_offset = (htab->elf.sgot->output_section->vma
5683 + htab->elf.sgot->output_offset
5684 + (h->got.offset &~ (bfd_vma) 1));
5685
5686 /* If this is a static link, or it is a -Bsymbolic link and the
5687 symbol is defined locally or was forced to be local because
5688 of a version file, we just want to emit a RELATIVE reloc.
5689 The entry in the global offset table will already have been
5690 initialized in the relocate_section function. */
5691 if (h->def_regular
5692 && h->type == STT_GNU_IFUNC)
5693 {
5694 if (bfd_link_pic (info))
5695 {
5696 /* Generate R_X86_64_GLOB_DAT. */
5697 goto do_glob_dat;
5698 }
5699 else
5700 {
5701 asection *plt;
5702
5703 if (!h->pointer_equality_needed)
5704 abort ();
5705
5706 /* For non-shared object, we can't use .got.plt, which
5707 contains the real function addres if we need pointer
5708 equality. We load the GOT entry with the PLT entry. */
5709 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
5710 bfd_put_64 (output_bfd, (plt->output_section->vma
5711 + plt->output_offset
5712 + h->plt.offset),
5713 htab->elf.sgot->contents + h->got.offset);
5714 return TRUE;
5715 }
5716 }
5717 else if (bfd_link_pic (info)
5718 && SYMBOL_REFERENCES_LOCAL (info, h))
5719 {
5720 if (!h->def_regular)
5721 return FALSE;
5722 BFD_ASSERT((h->got.offset & 1) != 0);
5723 rela.r_info = htab->r_info (0, R_X86_64_RELATIVE);
5724 rela.r_addend = (h->root.u.def.value
5725 + h->root.u.def.section->output_section->vma
5726 + h->root.u.def.section->output_offset);
5727 }
5728 else
5729 {
5730 BFD_ASSERT((h->got.offset & 1) == 0);
5731 do_glob_dat:
5732 bfd_put_64 (output_bfd, (bfd_vma) 0,
5733 htab->elf.sgot->contents + h->got.offset);
5734 rela.r_info = htab->r_info (h->dynindx, R_X86_64_GLOB_DAT);
5735 rela.r_addend = 0;
5736 }
5737
5738 elf_append_rela (output_bfd, htab->elf.srelgot, &rela);
5739 }
5740
5741 if (h->needs_copy)
5742 {
5743 Elf_Internal_Rela rela;
5744
5745 /* This symbol needs a copy reloc. Set it up. */
5746
5747 if (h->dynindx == -1
5748 || (h->root.type != bfd_link_hash_defined
5749 && h->root.type != bfd_link_hash_defweak)
5750 || htab->srelbss == NULL)
5751 abort ();
5752
5753 rela.r_offset = (h->root.u.def.value
5754 + h->root.u.def.section->output_section->vma
5755 + h->root.u.def.section->output_offset);
5756 rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY);
5757 rela.r_addend = 0;
5758 elf_append_rela (output_bfd, htab->srelbss, &rela);
5759 }
5760
5761 return TRUE;
5762 }
5763
5764 /* Finish up local dynamic symbol handling. We set the contents of
5765 various dynamic sections here. */
5766
5767 static bfd_boolean
5768 elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
5769 {
5770 struct elf_link_hash_entry *h
5771 = (struct elf_link_hash_entry *) *slot;
5772 struct bfd_link_info *info
5773 = (struct bfd_link_info *) inf;
5774
5775 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
5776 info, h, NULL);
5777 }
5778
5779 /* Finish up undefined weak symbol handling in PIE. Fill its PLT entry
5780 here since undefined weak symbol may not be dynamic and may not be
5781 called for elf_x86_64_finish_dynamic_symbol. */
5782
5783 static bfd_boolean
5784 elf_x86_64_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
5785 void *inf)
5786 {
5787 struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
5788 struct bfd_link_info *info = (struct bfd_link_info *) inf;
5789
5790 if (h->root.type != bfd_link_hash_undefweak
5791 || h->dynindx != -1)
5792 return TRUE;
5793
5794 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
5795 info, h, NULL);
5796 }
5797
5798 /* Used to decide how to sort relocs in an optimal manner for the
5799 dynamic linker, before writing them out. */
5800
5801 static enum elf_reloc_type_class
5802 elf_x86_64_reloc_type_class (const struct bfd_link_info *info,
5803 const asection *rel_sec ATTRIBUTE_UNUSED,
5804 const Elf_Internal_Rela *rela)
5805 {
5806 bfd *abfd = info->output_bfd;
5807 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5808 struct elf_x86_64_link_hash_table *htab = elf_x86_64_hash_table (info);
5809
5810 if (htab->elf.dynsym != NULL
5811 && htab->elf.dynsym->contents != NULL)
5812 {
5813 /* Check relocation against STT_GNU_IFUNC symbol if there are
5814 dynamic symbols. */
5815 unsigned long r_symndx = htab->r_sym (rela->r_info);
5816 Elf_Internal_Sym sym;
5817 if (!bed->s->swap_symbol_in (abfd,
5818 (htab->elf.dynsym->contents
5819 + r_symndx * bed->s->sizeof_sym),
5820 0, &sym))
5821 abort ();
5822
5823 if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
5824 return reloc_class_ifunc;
5825 }
5826
5827 switch ((int) ELF32_R_TYPE (rela->r_info))
5828 {
5829 case R_X86_64_RELATIVE:
5830 case R_X86_64_RELATIVE64:
5831 return reloc_class_relative;
5832 case R_X86_64_JUMP_SLOT:
5833 return reloc_class_plt;
5834 case R_X86_64_COPY:
5835 return reloc_class_copy;
5836 default:
5837 return reloc_class_normal;
5838 }
5839 }
5840
5841 /* Finish up the dynamic sections. */
5842
5843 static bfd_boolean
5844 elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
5845 struct bfd_link_info *info)
5846 {
5847 struct elf_x86_64_link_hash_table *htab;
5848 bfd *dynobj;
5849 asection *sdyn;
5850 const struct elf_x86_64_backend_data *abed;
5851
5852 htab = elf_x86_64_hash_table (info);
5853 if (htab == NULL)
5854 return FALSE;
5855
5856 /* Use MPX backend data in case of BND relocation. Use .plt_bnd
5857 section only if there is .plt section. */
5858 abed = (htab->elf.splt != NULL && htab->plt_bnd != NULL
5859 ? &elf_x86_64_bnd_arch_bed
5860 : get_elf_x86_64_backend_data (output_bfd));
5861
5862 dynobj = htab->elf.dynobj;
5863 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5864
5865 if (htab->elf.dynamic_sections_created)
5866 {
5867 bfd_byte *dyncon, *dynconend;
5868 const struct elf_backend_data *bed;
5869 bfd_size_type sizeof_dyn;
5870
5871 if (sdyn == NULL || htab->elf.sgot == NULL)
5872 abort ();
5873
5874 bed = get_elf_backend_data (dynobj);
5875 sizeof_dyn = bed->s->sizeof_dyn;
5876 dyncon = sdyn->contents;
5877 dynconend = sdyn->contents + sdyn->size;
5878 for (; dyncon < dynconend; dyncon += sizeof_dyn)
5879 {
5880 Elf_Internal_Dyn dyn;
5881 asection *s;
5882
5883 (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
5884
5885 switch (dyn.d_tag)
5886 {
5887 default:
5888 continue;
5889
5890 case DT_PLTGOT:
5891 s = htab->elf.sgotplt;
5892 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5893 break;
5894
5895 case DT_JMPREL:
5896 dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
5897 break;
5898
5899 case DT_PLTRELSZ:
5900 s = htab->elf.srelplt->output_section;
5901 dyn.d_un.d_val = s->size;
5902 break;
5903
5904 case DT_RELASZ:
5905 /* The procedure linkage table relocs (DT_JMPREL) should
5906 not be included in the overall relocs (DT_RELA).
5907 Therefore, we override the DT_RELASZ entry here to
5908 make it not include the JMPREL relocs. Since the
5909 linker script arranges for .rela.plt to follow all
5910 other relocation sections, we don't have to worry
5911 about changing the DT_RELA entry. */
5912 if (htab->elf.srelplt != NULL)
5913 {
5914 s = htab->elf.srelplt->output_section;
5915 dyn.d_un.d_val -= s->size;
5916 }
5917 break;
5918
5919 case DT_TLSDESC_PLT:
5920 s = htab->elf.splt;
5921 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
5922 + htab->tlsdesc_plt;
5923 break;
5924
5925 case DT_TLSDESC_GOT:
5926 s = htab->elf.sgot;
5927 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
5928 + htab->tlsdesc_got;
5929 break;
5930 }
5931
5932 (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
5933 }
5934
5935 /* Fill in the special first entry in the procedure linkage table. */
5936 if (htab->elf.splt && htab->elf.splt->size > 0)
5937 {
5938 /* Fill in the first entry in the procedure linkage table. */
5939 memcpy (htab->elf.splt->contents,
5940 abed->plt0_entry, abed->plt_entry_size);
5941 /* Add offset for pushq GOT+8(%rip), since the instruction
5942 uses 6 bytes subtract this value. */
5943 bfd_put_32 (output_bfd,
5944 (htab->elf.sgotplt->output_section->vma
5945 + htab->elf.sgotplt->output_offset
5946 + 8
5947 - htab->elf.splt->output_section->vma
5948 - htab->elf.splt->output_offset
5949 - 6),
5950 htab->elf.splt->contents + abed->plt0_got1_offset);
5951 /* Add offset for the PC-relative instruction accessing GOT+16,
5952 subtracting the offset to the end of that instruction. */
5953 bfd_put_32 (output_bfd,
5954 (htab->elf.sgotplt->output_section->vma
5955 + htab->elf.sgotplt->output_offset
5956 + 16
5957 - htab->elf.splt->output_section->vma
5958 - htab->elf.splt->output_offset
5959 - abed->plt0_got2_insn_end),
5960 htab->elf.splt->contents + abed->plt0_got2_offset);
5961
5962 elf_section_data (htab->elf.splt->output_section)
5963 ->this_hdr.sh_entsize = abed->plt_entry_size;
5964
5965 if (htab->tlsdesc_plt)
5966 {
5967 bfd_put_64 (output_bfd, (bfd_vma) 0,
5968 htab->elf.sgot->contents + htab->tlsdesc_got);
5969
5970 memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
5971 abed->plt0_entry, abed->plt_entry_size);
5972
5973 /* Add offset for pushq GOT+8(%rip), since the
5974 instruction uses 6 bytes subtract this value. */
5975 bfd_put_32 (output_bfd,
5976 (htab->elf.sgotplt->output_section->vma
5977 + htab->elf.sgotplt->output_offset
5978 + 8
5979 - htab->elf.splt->output_section->vma
5980 - htab->elf.splt->output_offset
5981 - htab->tlsdesc_plt
5982 - 6),
5983 htab->elf.splt->contents
5984 + htab->tlsdesc_plt + abed->plt0_got1_offset);
5985 /* Add offset for the PC-relative instruction accessing GOT+TDG,
5986 where TGD stands for htab->tlsdesc_got, subtracting the offset
5987 to the end of that instruction. */
5988 bfd_put_32 (output_bfd,
5989 (htab->elf.sgot->output_section->vma
5990 + htab->elf.sgot->output_offset
5991 + htab->tlsdesc_got
5992 - htab->elf.splt->output_section->vma
5993 - htab->elf.splt->output_offset
5994 - htab->tlsdesc_plt
5995 - abed->plt0_got2_insn_end),
5996 htab->elf.splt->contents
5997 + htab->tlsdesc_plt + abed->plt0_got2_offset);
5998 }
5999 }
6000 }
6001
6002 if (htab->plt_bnd != NULL)
6003 elf_section_data (htab->plt_bnd->output_section)
6004 ->this_hdr.sh_entsize = sizeof (elf_x86_64_bnd_plt2_entry);
6005
6006 if (htab->elf.sgotplt)
6007 {
6008 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
6009 {
6010 (*_bfd_error_handler)
6011 (_("discarded output section: `%A'"), htab->elf.sgotplt);
6012 return FALSE;
6013 }
6014
6015 /* Fill in the first three entries in the global offset table. */
6016 if (htab->elf.sgotplt->size > 0)
6017 {
6018 /* Set the first entry in the global offset table to the address of
6019 the dynamic section. */
6020 if (sdyn == NULL)
6021 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents);
6022 else
6023 bfd_put_64 (output_bfd,
6024 sdyn->output_section->vma + sdyn->output_offset,
6025 htab->elf.sgotplt->contents);
6026 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
6027 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
6028 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE*2);
6029 }
6030
6031 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize =
6032 GOT_ENTRY_SIZE;
6033 }
6034
6035 /* Adjust .eh_frame for .plt section. */
6036 if (htab->plt_eh_frame != NULL
6037 && htab->plt_eh_frame->contents != NULL)
6038 {
6039 if (htab->elf.splt != NULL
6040 && htab->elf.splt->size != 0
6041 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
6042 && htab->elf.splt->output_section != NULL
6043 && htab->plt_eh_frame->output_section != NULL)
6044 {
6045 bfd_vma plt_start = htab->elf.splt->output_section->vma;
6046 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
6047 + htab->plt_eh_frame->output_offset
6048 + PLT_FDE_START_OFFSET;
6049 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
6050 htab->plt_eh_frame->contents
6051 + PLT_FDE_START_OFFSET);
6052 }
6053 if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
6054 {
6055 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
6056 htab->plt_eh_frame,
6057 htab->plt_eh_frame->contents))
6058 return FALSE;
6059 }
6060 }
6061
6062 if (htab->elf.sgot && htab->elf.sgot->size > 0)
6063 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
6064 = GOT_ENTRY_SIZE;
6065
6066 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
6067 htab_traverse (htab->loc_hash_table,
6068 elf_x86_64_finish_local_dynamic_symbol,
6069 info);
6070
6071 /* Fill PLT entries for undefined weak symbols in PIE. */
6072 if (bfd_link_pie (info))
6073 bfd_hash_traverse (&info->hash->table,
6074 elf_x86_64_pie_finish_undefweak_symbol,
6075 info);
6076
6077 return TRUE;
6078 }
6079
6080 /* Return an array of PLT entry symbol values. */
6081
6082 static bfd_vma *
6083 elf_x86_64_get_plt_sym_val (bfd *abfd, asymbol **dynsyms, asection *plt,
6084 asection *relplt)
6085 {
6086 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
6087 arelent *p;
6088 long count, i;
6089 bfd_vma *plt_sym_val;
6090 bfd_vma plt_offset;
6091 bfd_byte *plt_contents;
6092 const struct elf_x86_64_backend_data *bed;
6093 Elf_Internal_Shdr *hdr;
6094 asection *plt_bnd;
6095
6096 /* Get the .plt section contents. PLT passed down may point to the
6097 .plt.bnd section. Make sure that PLT always points to the .plt
6098 section. */
6099 plt_bnd = bfd_get_section_by_name (abfd, ".plt.bnd");
6100 if (plt_bnd)
6101 {
6102 if (plt != plt_bnd)
6103 abort ();
6104 plt = bfd_get_section_by_name (abfd, ".plt");
6105 if (plt == NULL)
6106 abort ();
6107 bed = &elf_x86_64_bnd_arch_bed;
6108 }
6109 else
6110 bed = get_elf_x86_64_backend_data (abfd);
6111
6112 plt_contents = (bfd_byte *) bfd_malloc (plt->size);
6113 if (plt_contents == NULL)
6114 return NULL;
6115 if (!bfd_get_section_contents (abfd, (asection *) plt,
6116 plt_contents, 0, plt->size))
6117 {
6118 bad_return:
6119 free (plt_contents);
6120 return NULL;
6121 }
6122
6123 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
6124 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
6125 goto bad_return;
6126
6127 hdr = &elf_section_data (relplt)->this_hdr;
6128 count = relplt->size / hdr->sh_entsize;
6129
6130 plt_sym_val = (bfd_vma *) bfd_malloc (sizeof (bfd_vma) * count);
6131 if (plt_sym_val == NULL)
6132 goto bad_return;
6133
6134 for (i = 0; i < count; i++)
6135 plt_sym_val[i] = -1;
6136
6137 plt_offset = bed->plt_entry_size;
6138 p = relplt->relocation;
6139 for (i = 0; i < count; i++, p++)
6140 {
6141 long reloc_index;
6142
6143 /* Skip unknown relocation. */
6144 if (p->howto == NULL)
6145 continue;
6146
6147 if (p->howto->type != R_X86_64_JUMP_SLOT
6148 && p->howto->type != R_X86_64_IRELATIVE)
6149 continue;
6150
6151 reloc_index = H_GET_32 (abfd, (plt_contents + plt_offset
6152 + bed->plt_reloc_offset));
6153 if (reloc_index < count)
6154 {
6155 if (plt_bnd)
6156 {
6157 /* This is the index in .plt section. */
6158 long plt_index = plt_offset / bed->plt_entry_size;
6159 /* Store VMA + the offset in .plt.bnd section. */
6160 plt_sym_val[reloc_index] =
6161 (plt_bnd->vma
6162 + (plt_index - 1) * sizeof (elf_x86_64_legacy_plt2_entry));
6163 }
6164 else
6165 plt_sym_val[reloc_index] = plt->vma + plt_offset;
6166 }
6167 plt_offset += bed->plt_entry_size;
6168
6169 /* PR binutils/18437: Skip extra relocations in the .rela.plt
6170 section. */
6171 if (plt_offset >= plt->size)
6172 break;
6173 }
6174
6175 free (plt_contents);
6176
6177 return plt_sym_val;
6178 }
6179
6180 /* Similar to _bfd_elf_get_synthetic_symtab, with .plt.bnd section
6181 support. */
6182
6183 static long
6184 elf_x86_64_get_synthetic_symtab (bfd *abfd,
6185 long symcount,
6186 asymbol **syms,
6187 long dynsymcount,
6188 asymbol **dynsyms,
6189 asymbol **ret)
6190 {
6191 /* Pass the .plt.bnd section to _bfd_elf_ifunc_get_synthetic_symtab
6192 as PLT if it exists. */
6193 asection *plt = bfd_get_section_by_name (abfd, ".plt.bnd");
6194 if (plt == NULL)
6195 plt = bfd_get_section_by_name (abfd, ".plt");
6196 return _bfd_elf_ifunc_get_synthetic_symtab (abfd, symcount, syms,
6197 dynsymcount, dynsyms, ret,
6198 plt,
6199 elf_x86_64_get_plt_sym_val);
6200 }
6201
6202 /* Handle an x86-64 specific section when reading an object file. This
6203 is called when elfcode.h finds a section with an unknown type. */
6204
6205 static bfd_boolean
6206 elf_x86_64_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr,
6207 const char *name, int shindex)
6208 {
6209 if (hdr->sh_type != SHT_X86_64_UNWIND)
6210 return FALSE;
6211
6212 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
6213 return FALSE;
6214
6215 return TRUE;
6216 }
6217
6218 /* Hook called by the linker routine which adds symbols from an object
6219 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
6220 of .bss. */
6221
6222 static bfd_boolean
6223 elf_x86_64_add_symbol_hook (bfd *abfd,
6224 struct bfd_link_info *info,
6225 Elf_Internal_Sym *sym,
6226 const char **namep ATTRIBUTE_UNUSED,
6227 flagword *flagsp ATTRIBUTE_UNUSED,
6228 asection **secp,
6229 bfd_vma *valp)
6230 {
6231 asection *lcomm;
6232
6233 switch (sym->st_shndx)
6234 {
6235 case SHN_X86_64_LCOMMON:
6236 lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
6237 if (lcomm == NULL)
6238 {
6239 lcomm = bfd_make_section_with_flags (abfd,
6240 "LARGE_COMMON",
6241 (SEC_ALLOC
6242 | SEC_IS_COMMON
6243 | SEC_LINKER_CREATED));
6244 if (lcomm == NULL)
6245 return FALSE;
6246 elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
6247 }
6248 *secp = lcomm;
6249 *valp = sym->st_size;
6250 return TRUE;
6251 }
6252
6253 if (ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE
6254 && (abfd->flags & DYNAMIC) == 0
6255 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
6256 elf_tdata (info->output_bfd)->has_gnu_symbols
6257 |= elf_gnu_symbol_unique;
6258
6259 return TRUE;
6260 }
6261
6262
6263 /* Given a BFD section, try to locate the corresponding ELF section
6264 index. */
6265
6266 static bfd_boolean
6267 elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
6268 asection *sec, int *index_return)
6269 {
6270 if (sec == &_bfd_elf_large_com_section)
6271 {
6272 *index_return = SHN_X86_64_LCOMMON;
6273 return TRUE;
6274 }
6275 return FALSE;
6276 }
6277
6278 /* Process a symbol. */
6279
6280 static void
6281 elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
6282 asymbol *asym)
6283 {
6284 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
6285
6286 switch (elfsym->internal_elf_sym.st_shndx)
6287 {
6288 case SHN_X86_64_LCOMMON:
6289 asym->section = &_bfd_elf_large_com_section;
6290 asym->value = elfsym->internal_elf_sym.st_size;
6291 /* Common symbol doesn't set BSF_GLOBAL. */
6292 asym->flags &= ~BSF_GLOBAL;
6293 break;
6294 }
6295 }
6296
6297 static bfd_boolean
6298 elf_x86_64_common_definition (Elf_Internal_Sym *sym)
6299 {
6300 return (sym->st_shndx == SHN_COMMON
6301 || sym->st_shndx == SHN_X86_64_LCOMMON);
6302 }
6303
6304 static unsigned int
6305 elf_x86_64_common_section_index (asection *sec)
6306 {
6307 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
6308 return SHN_COMMON;
6309 else
6310 return SHN_X86_64_LCOMMON;
6311 }
6312
6313 static asection *
6314 elf_x86_64_common_section (asection *sec)
6315 {
6316 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
6317 return bfd_com_section_ptr;
6318 else
6319 return &_bfd_elf_large_com_section;
6320 }
6321
6322 static bfd_boolean
6323 elf_x86_64_merge_symbol (struct elf_link_hash_entry *h,
6324 const Elf_Internal_Sym *sym,
6325 asection **psec,
6326 bfd_boolean newdef,
6327 bfd_boolean olddef,
6328 bfd *oldbfd,
6329 const asection *oldsec)
6330 {
6331 /* A normal common symbol and a large common symbol result in a
6332 normal common symbol. We turn the large common symbol into a
6333 normal one. */
6334 if (!olddef
6335 && h->root.type == bfd_link_hash_common
6336 && !newdef
6337 && bfd_is_com_section (*psec)
6338 && oldsec != *psec)
6339 {
6340 if (sym->st_shndx == SHN_COMMON
6341 && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) != 0)
6342 {
6343 h->root.u.c.p->section
6344 = bfd_make_section_old_way (oldbfd, "COMMON");
6345 h->root.u.c.p->section->flags = SEC_ALLOC;
6346 }
6347 else if (sym->st_shndx == SHN_X86_64_LCOMMON
6348 && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) == 0)
6349 *psec = bfd_com_section_ptr;
6350 }
6351
6352 return TRUE;
6353 }
6354
6355 static int
6356 elf_x86_64_additional_program_headers (bfd *abfd,
6357 struct bfd_link_info *info ATTRIBUTE_UNUSED)
6358 {
6359 asection *s;
6360 int count = 0;
6361
6362 /* Check to see if we need a large readonly segment. */
6363 s = bfd_get_section_by_name (abfd, ".lrodata");
6364 if (s && (s->flags & SEC_LOAD))
6365 count++;
6366
6367 /* Check to see if we need a large data segment. Since .lbss sections
6368 is placed right after the .bss section, there should be no need for
6369 a large data segment just because of .lbss. */
6370 s = bfd_get_section_by_name (abfd, ".ldata");
6371 if (s && (s->flags & SEC_LOAD))
6372 count++;
6373
6374 return count;
6375 }
6376
6377 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
6378
6379 static bfd_boolean
6380 elf_x86_64_hash_symbol (struct elf_link_hash_entry *h)
6381 {
6382 if (h->plt.offset != (bfd_vma) -1
6383 && !h->def_regular
6384 && !h->pointer_equality_needed)
6385 return FALSE;
6386
6387 return _bfd_elf_hash_symbol (h);
6388 }
6389
6390 /* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
6391
6392 static bfd_boolean
6393 elf_x86_64_relocs_compatible (const bfd_target *input,
6394 const bfd_target *output)
6395 {
6396 return ((xvec_get_elf_backend_data (input)->s->elfclass
6397 == xvec_get_elf_backend_data (output)->s->elfclass)
6398 && _bfd_elf_relocs_compatible (input, output));
6399 }
6400
6401 static const struct bfd_elf_special_section
6402 elf_x86_64_special_sections[]=
6403 {
6404 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
6405 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
6406 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
6407 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
6408 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
6409 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
6410 { NULL, 0, 0, 0, 0 }
6411 };
6412
6413 #define TARGET_LITTLE_SYM x86_64_elf64_vec
6414 #define TARGET_LITTLE_NAME "elf64-x86-64"
6415 #define ELF_ARCH bfd_arch_i386
6416 #define ELF_TARGET_ID X86_64_ELF_DATA
6417 #define ELF_MACHINE_CODE EM_X86_64
6418 #define ELF_MAXPAGESIZE 0x200000
6419 #define ELF_MINPAGESIZE 0x1000
6420 #define ELF_COMMONPAGESIZE 0x1000
6421
6422 #define elf_backend_can_gc_sections 1
6423 #define elf_backend_can_refcount 1
6424 #define elf_backend_want_got_plt 1
6425 #define elf_backend_plt_readonly 1
6426 #define elf_backend_want_plt_sym 0
6427 #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
6428 #define elf_backend_rela_normal 1
6429 #define elf_backend_plt_alignment 4
6430 #define elf_backend_extern_protected_data 1
6431
6432 #define elf_info_to_howto elf_x86_64_info_to_howto
6433
6434 #define bfd_elf64_bfd_link_hash_table_create \
6435 elf_x86_64_link_hash_table_create
6436 #define bfd_elf64_bfd_reloc_type_lookup elf_x86_64_reloc_type_lookup
6437 #define bfd_elf64_bfd_reloc_name_lookup \
6438 elf_x86_64_reloc_name_lookup
6439
6440 #define elf_backend_adjust_dynamic_symbol elf_x86_64_adjust_dynamic_symbol
6441 #define elf_backend_relocs_compatible elf_x86_64_relocs_compatible
6442 #define elf_backend_check_relocs elf_x86_64_check_relocs
6443 #define elf_backend_copy_indirect_symbol elf_x86_64_copy_indirect_symbol
6444 #define elf_backend_create_dynamic_sections elf_x86_64_create_dynamic_sections
6445 #define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
6446 #define elf_backend_finish_dynamic_symbol elf_x86_64_finish_dynamic_symbol
6447 #define elf_backend_gc_mark_hook elf_x86_64_gc_mark_hook
6448 #define elf_backend_grok_prstatus elf_x86_64_grok_prstatus
6449 #define elf_backend_grok_psinfo elf_x86_64_grok_psinfo
6450 #ifdef CORE_HEADER
6451 #define elf_backend_write_core_note elf_x86_64_write_core_note
6452 #endif
6453 #define elf_backend_reloc_type_class elf_x86_64_reloc_type_class
6454 #define elf_backend_relocate_section elf_x86_64_relocate_section
6455 #define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections
6456 #define elf_backend_always_size_sections elf_x86_64_always_size_sections
6457 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
6458 #define elf_backend_object_p elf64_x86_64_elf_object_p
6459 #define bfd_elf64_mkobject elf_x86_64_mkobject
6460 #define bfd_elf64_get_synthetic_symtab elf_x86_64_get_synthetic_symtab
6461
6462 #define elf_backend_section_from_shdr \
6463 elf_x86_64_section_from_shdr
6464
6465 #define elf_backend_section_from_bfd_section \
6466 elf_x86_64_elf_section_from_bfd_section
6467 #define elf_backend_add_symbol_hook \
6468 elf_x86_64_add_symbol_hook
6469 #define elf_backend_symbol_processing \
6470 elf_x86_64_symbol_processing
6471 #define elf_backend_common_section_index \
6472 elf_x86_64_common_section_index
6473 #define elf_backend_common_section \
6474 elf_x86_64_common_section
6475 #define elf_backend_common_definition \
6476 elf_x86_64_common_definition
6477 #define elf_backend_merge_symbol \
6478 elf_x86_64_merge_symbol
6479 #define elf_backend_special_sections \
6480 elf_x86_64_special_sections
6481 #define elf_backend_additional_program_headers \
6482 elf_x86_64_additional_program_headers
6483 #define elf_backend_hash_symbol \
6484 elf_x86_64_hash_symbol
6485 #define elf_backend_omit_section_dynsym \
6486 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
6487 #define elf_backend_fixup_symbol \
6488 elf_x86_64_fixup_symbol
6489
6490 #include "elf64-target.h"
6491
6492 /* CloudABI support. */
6493
6494 #undef TARGET_LITTLE_SYM
6495 #define TARGET_LITTLE_SYM x86_64_elf64_cloudabi_vec
6496 #undef TARGET_LITTLE_NAME
6497 #define TARGET_LITTLE_NAME "elf64-x86-64-cloudabi"
6498
6499 #undef ELF_OSABI
6500 #define ELF_OSABI ELFOSABI_CLOUDABI
6501
6502 #undef elf64_bed
6503 #define elf64_bed elf64_x86_64_cloudabi_bed
6504
6505 #include "elf64-target.h"
6506
6507 /* FreeBSD support. */
6508
6509 #undef TARGET_LITTLE_SYM
6510 #define TARGET_LITTLE_SYM x86_64_elf64_fbsd_vec
6511 #undef TARGET_LITTLE_NAME
6512 #define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
6513
6514 #undef ELF_OSABI
6515 #define ELF_OSABI ELFOSABI_FREEBSD
6516
6517 #undef elf64_bed
6518 #define elf64_bed elf64_x86_64_fbsd_bed
6519
6520 #include "elf64-target.h"
6521
6522 /* Solaris 2 support. */
6523
6524 #undef TARGET_LITTLE_SYM
6525 #define TARGET_LITTLE_SYM x86_64_elf64_sol2_vec
6526 #undef TARGET_LITTLE_NAME
6527 #define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
6528
6529 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
6530 objects won't be recognized. */
6531 #undef ELF_OSABI
6532
6533 #undef elf64_bed
6534 #define elf64_bed elf64_x86_64_sol2_bed
6535
6536 /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
6537 boundary. */
6538 #undef elf_backend_static_tls_alignment
6539 #define elf_backend_static_tls_alignment 16
6540
6541 /* The Solaris 2 ABI requires a plt symbol on all platforms.
6542
6543 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
6544 File, p.63. */
6545 #undef elf_backend_want_plt_sym
6546 #define elf_backend_want_plt_sym 1
6547
6548 #undef elf_backend_strtab_flags
6549 #define elf_backend_strtab_flags SHF_STRINGS
6550
6551 static bfd_boolean
6552 elf64_x86_64_set_special_info_link (const bfd *ibfd ATTRIBUTE_UNUSED,
6553 bfd *obfd ATTRIBUTE_UNUSED,
6554 const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
6555 Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
6556 {
6557 /* PR 19938: FIXME: Need to add code for setting the sh_info
6558 and sh_link fields of Solaris specific section types. */
6559 return FALSE;
6560 }
6561
6562 #undef elf_backend_set_special_section_info_and_link
6563 #define elf_backend_set_special_section_info_and_link elf64_x86_64_set_special_info_link
6564
6565 #include "elf64-target.h"
6566
6567 /* Native Client support. */
6568
6569 static bfd_boolean
6570 elf64_x86_64_nacl_elf_object_p (bfd *abfd)
6571 {
6572 /* Set the right machine number for a NaCl x86-64 ELF64 file. */
6573 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64_nacl);
6574 return TRUE;
6575 }
6576
6577 #undef TARGET_LITTLE_SYM
6578 #define TARGET_LITTLE_SYM x86_64_elf64_nacl_vec
6579 #undef TARGET_LITTLE_NAME
6580 #define TARGET_LITTLE_NAME "elf64-x86-64-nacl"
6581 #undef elf64_bed
6582 #define elf64_bed elf64_x86_64_nacl_bed
6583
6584 #undef ELF_MAXPAGESIZE
6585 #undef ELF_MINPAGESIZE
6586 #undef ELF_COMMONPAGESIZE
6587 #define ELF_MAXPAGESIZE 0x10000
6588 #define ELF_MINPAGESIZE 0x10000
6589 #define ELF_COMMONPAGESIZE 0x10000
6590
6591 /* Restore defaults. */
6592 #undef ELF_OSABI
6593 #undef elf_backend_static_tls_alignment
6594 #undef elf_backend_want_plt_sym
6595 #define elf_backend_want_plt_sym 0
6596 #undef elf_backend_strtab_flags
6597 #undef elf_backend_set_special_section_info_and_link
6598
6599 /* NaCl uses substantially different PLT entries for the same effects. */
6600
6601 #undef elf_backend_plt_alignment
6602 #define elf_backend_plt_alignment 5
6603 #define NACL_PLT_ENTRY_SIZE 64
6604 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
6605
6606 static const bfd_byte elf_x86_64_nacl_plt0_entry[NACL_PLT_ENTRY_SIZE] =
6607 {
6608 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
6609 0x4c, 0x8b, 0x1d, 16, 0, 0, 0, /* mov GOT+16(%rip), %r11 */
6610 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
6611 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
6612 0x41, 0xff, 0xe3, /* jmpq *%r11 */
6613
6614 /* 9-byte nop sequence to pad out to the next 32-byte boundary. */
6615 0x66, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw 0x0(%rax,%rax,1) */
6616
6617 /* 32 bytes of nop to pad out to the standard size. */
6618 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
6619 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6620 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
6621 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6622 0x66, /* excess data32 prefix */
6623 0x90 /* nop */
6624 };
6625
6626 static const bfd_byte elf_x86_64_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
6627 {
6628 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, /* mov name@GOTPCREL(%rip),%r11 */
6629 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
6630 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
6631 0x41, 0xff, 0xe3, /* jmpq *%r11 */
6632
6633 /* 15-byte nop sequence to pad out to the next 32-byte boundary. */
6634 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
6635 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6636
6637 /* Lazy GOT entries point here (32-byte aligned). */
6638 0x68, /* pushq immediate */
6639 0, 0, 0, 0, /* replaced with index into relocation table. */
6640 0xe9, /* jmp relative */
6641 0, 0, 0, 0, /* replaced with offset to start of .plt0. */
6642
6643 /* 22 bytes of nop to pad out to the standard size. */
6644 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
6645 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6646 0x0f, 0x1f, 0x80, 0, 0, 0, 0, /* nopl 0x0(%rax) */
6647 };
6648
6649 /* .eh_frame covering the .plt section. */
6650
6651 static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] =
6652 {
6653 #if (PLT_CIE_LENGTH != 20 \
6654 || PLT_FDE_LENGTH != 36 \
6655 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
6656 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
6657 # error "Need elf_x86_64_backend_data parameters for eh_frame_plt offsets!"
6658 #endif
6659 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
6660 0, 0, 0, 0, /* CIE ID */
6661 1, /* CIE version */
6662 'z', 'R', 0, /* Augmentation string */
6663 1, /* Code alignment factor */
6664 0x78, /* Data alignment factor */
6665 16, /* Return address column */
6666 1, /* Augmentation size */
6667 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
6668 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
6669 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
6670 DW_CFA_nop, DW_CFA_nop,
6671
6672 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
6673 PLT_CIE_LENGTH + 8, 0, 0, 0,/* CIE pointer */
6674 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
6675 0, 0, 0, 0, /* .plt size goes here */
6676 0, /* Augmentation size */
6677 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
6678 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
6679 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
6680 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
6681 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
6682 13, /* Block length */
6683 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
6684 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
6685 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
6686 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
6687 DW_CFA_nop, DW_CFA_nop
6688 };
6689
6690 static const struct elf_x86_64_backend_data elf_x86_64_nacl_arch_bed =
6691 {
6692 elf_x86_64_nacl_plt0_entry, /* plt0_entry */
6693 elf_x86_64_nacl_plt_entry, /* plt_entry */
6694 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
6695 2, /* plt0_got1_offset */
6696 9, /* plt0_got2_offset */
6697 13, /* plt0_got2_insn_end */
6698 3, /* plt_got_offset */
6699 33, /* plt_reloc_offset */
6700 38, /* plt_plt_offset */
6701 7, /* plt_got_insn_size */
6702 42, /* plt_plt_insn_end */
6703 32, /* plt_lazy_offset */
6704 elf_x86_64_nacl_eh_frame_plt, /* eh_frame_plt */
6705 sizeof (elf_x86_64_nacl_eh_frame_plt), /* eh_frame_plt_size */
6706 };
6707
6708 #undef elf_backend_arch_data
6709 #define elf_backend_arch_data &elf_x86_64_nacl_arch_bed
6710
6711 #undef elf_backend_object_p
6712 #define elf_backend_object_p elf64_x86_64_nacl_elf_object_p
6713 #undef elf_backend_modify_segment_map
6714 #define elf_backend_modify_segment_map nacl_modify_segment_map
6715 #undef elf_backend_modify_program_headers
6716 #define elf_backend_modify_program_headers nacl_modify_program_headers
6717 #undef elf_backend_final_write_processing
6718 #define elf_backend_final_write_processing nacl_final_write_processing
6719
6720 #include "elf64-target.h"
6721
6722 /* Native Client x32 support. */
6723
6724 static bfd_boolean
6725 elf32_x86_64_nacl_elf_object_p (bfd *abfd)
6726 {
6727 /* Set the right machine number for a NaCl x86-64 ELF32 file. */
6728 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32_nacl);
6729 return TRUE;
6730 }
6731
6732 #undef TARGET_LITTLE_SYM
6733 #define TARGET_LITTLE_SYM x86_64_elf32_nacl_vec
6734 #undef TARGET_LITTLE_NAME
6735 #define TARGET_LITTLE_NAME "elf32-x86-64-nacl"
6736 #undef elf32_bed
6737 #define elf32_bed elf32_x86_64_nacl_bed
6738
6739 #define bfd_elf32_bfd_link_hash_table_create \
6740 elf_x86_64_link_hash_table_create
6741 #define bfd_elf32_bfd_reloc_type_lookup \
6742 elf_x86_64_reloc_type_lookup
6743 #define bfd_elf32_bfd_reloc_name_lookup \
6744 elf_x86_64_reloc_name_lookup
6745 #define bfd_elf32_mkobject \
6746 elf_x86_64_mkobject
6747 #define bfd_elf32_get_synthetic_symtab \
6748 elf_x86_64_get_synthetic_symtab
6749
6750 #undef elf_backend_object_p
6751 #define elf_backend_object_p \
6752 elf32_x86_64_nacl_elf_object_p
6753
6754 #undef elf_backend_bfd_from_remote_memory
6755 #define elf_backend_bfd_from_remote_memory \
6756 _bfd_elf32_bfd_from_remote_memory
6757
6758 #undef elf_backend_size_info
6759 #define elf_backend_size_info \
6760 _bfd_elf32_size_info
6761
6762 #include "elf32-target.h"
6763
6764 /* Restore defaults. */
6765 #undef elf_backend_object_p
6766 #define elf_backend_object_p elf64_x86_64_elf_object_p
6767 #undef elf_backend_bfd_from_remote_memory
6768 #undef elf_backend_size_info
6769 #undef elf_backend_modify_segment_map
6770 #undef elf_backend_modify_program_headers
6771 #undef elf_backend_final_write_processing
6772
6773 /* Intel L1OM support. */
6774
6775 static bfd_boolean
6776 elf64_l1om_elf_object_p (bfd *abfd)
6777 {
6778 /* Set the right machine number for an L1OM elf64 file. */
6779 bfd_default_set_arch_mach (abfd, bfd_arch_l1om, bfd_mach_l1om);
6780 return TRUE;
6781 }
6782
6783 #undef TARGET_LITTLE_SYM
6784 #define TARGET_LITTLE_SYM l1om_elf64_vec
6785 #undef TARGET_LITTLE_NAME
6786 #define TARGET_LITTLE_NAME "elf64-l1om"
6787 #undef ELF_ARCH
6788 #define ELF_ARCH bfd_arch_l1om
6789
6790 #undef ELF_MACHINE_CODE
6791 #define ELF_MACHINE_CODE EM_L1OM
6792
6793 #undef ELF_OSABI
6794
6795 #undef elf64_bed
6796 #define elf64_bed elf64_l1om_bed
6797
6798 #undef elf_backend_object_p
6799 #define elf_backend_object_p elf64_l1om_elf_object_p
6800
6801 /* Restore defaults. */
6802 #undef ELF_MAXPAGESIZE
6803 #undef ELF_MINPAGESIZE
6804 #undef ELF_COMMONPAGESIZE
6805 #define ELF_MAXPAGESIZE 0x200000
6806 #define ELF_MINPAGESIZE 0x1000
6807 #define ELF_COMMONPAGESIZE 0x1000
6808 #undef elf_backend_plt_alignment
6809 #define elf_backend_plt_alignment 4
6810 #undef elf_backend_arch_data
6811 #define elf_backend_arch_data &elf_x86_64_arch_bed
6812
6813 #include "elf64-target.h"
6814
6815 /* FreeBSD L1OM support. */
6816
6817 #undef TARGET_LITTLE_SYM
6818 #define TARGET_LITTLE_SYM l1om_elf64_fbsd_vec
6819 #undef TARGET_LITTLE_NAME
6820 #define TARGET_LITTLE_NAME "elf64-l1om-freebsd"
6821
6822 #undef ELF_OSABI
6823 #define ELF_OSABI ELFOSABI_FREEBSD
6824
6825 #undef elf64_bed
6826 #define elf64_bed elf64_l1om_fbsd_bed
6827
6828 #include "elf64-target.h"
6829
6830 /* Intel K1OM support. */
6831
6832 static bfd_boolean
6833 elf64_k1om_elf_object_p (bfd *abfd)
6834 {
6835 /* Set the right machine number for an K1OM elf64 file. */
6836 bfd_default_set_arch_mach (abfd, bfd_arch_k1om, bfd_mach_k1om);
6837 return TRUE;
6838 }
6839
6840 #undef TARGET_LITTLE_SYM
6841 #define TARGET_LITTLE_SYM k1om_elf64_vec
6842 #undef TARGET_LITTLE_NAME
6843 #define TARGET_LITTLE_NAME "elf64-k1om"
6844 #undef ELF_ARCH
6845 #define ELF_ARCH bfd_arch_k1om
6846
6847 #undef ELF_MACHINE_CODE
6848 #define ELF_MACHINE_CODE EM_K1OM
6849
6850 #undef ELF_OSABI
6851
6852 #undef elf64_bed
6853 #define elf64_bed elf64_k1om_bed
6854
6855 #undef elf_backend_object_p
6856 #define elf_backend_object_p elf64_k1om_elf_object_p
6857
6858 #undef elf_backend_static_tls_alignment
6859
6860 #undef elf_backend_want_plt_sym
6861 #define elf_backend_want_plt_sym 0
6862
6863 #include "elf64-target.h"
6864
6865 /* FreeBSD K1OM support. */
6866
6867 #undef TARGET_LITTLE_SYM
6868 #define TARGET_LITTLE_SYM k1om_elf64_fbsd_vec
6869 #undef TARGET_LITTLE_NAME
6870 #define TARGET_LITTLE_NAME "elf64-k1om-freebsd"
6871
6872 #undef ELF_OSABI
6873 #define ELF_OSABI ELFOSABI_FREEBSD
6874
6875 #undef elf64_bed
6876 #define elf64_bed elf64_k1om_fbsd_bed
6877
6878 #include "elf64-target.h"
6879
6880 /* 32bit x86-64 support. */
6881
6882 #undef TARGET_LITTLE_SYM
6883 #define TARGET_LITTLE_SYM x86_64_elf32_vec
6884 #undef TARGET_LITTLE_NAME
6885 #define TARGET_LITTLE_NAME "elf32-x86-64"
6886 #undef elf32_bed
6887
6888 #undef ELF_ARCH
6889 #define ELF_ARCH bfd_arch_i386
6890
6891 #undef ELF_MACHINE_CODE
6892 #define ELF_MACHINE_CODE EM_X86_64
6893
6894 #undef ELF_OSABI
6895
6896 #undef elf_backend_object_p
6897 #define elf_backend_object_p \
6898 elf32_x86_64_elf_object_p
6899
6900 #undef elf_backend_bfd_from_remote_memory
6901 #define elf_backend_bfd_from_remote_memory \
6902 _bfd_elf32_bfd_from_remote_memory
6903
6904 #undef elf_backend_size_info
6905 #define elf_backend_size_info \
6906 _bfd_elf32_size_info
6907
6908 #include "elf32-target.h"
This page took 0.176392 seconds and 4 git commands to generate.