Update ARC instruction data-base.
[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
1592 /* Look through the relocs for a section during the first phase, and
1593 calculate needed space in the global offset table, procedure
1594 linkage table, and dynamic reloc sections. */
1595
1596 static bfd_boolean
1597 elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
1598 asection *sec,
1599 const Elf_Internal_Rela *relocs)
1600 {
1601 struct elf_x86_64_link_hash_table *htab;
1602 Elf_Internal_Shdr *symtab_hdr;
1603 struct elf_link_hash_entry **sym_hashes;
1604 const Elf_Internal_Rela *rel;
1605 const Elf_Internal_Rela *rel_end;
1606 asection *sreloc;
1607 bfd_boolean use_plt_got;
1608
1609 if (bfd_link_relocatable (info))
1610 return TRUE;
1611
1612 BFD_ASSERT (is_x86_64_elf (abfd));
1613
1614 htab = elf_x86_64_hash_table (info);
1615 if (htab == NULL)
1616 return FALSE;
1617
1618 use_plt_got = get_elf_x86_64_backend_data (abfd) == &elf_x86_64_arch_bed;
1619
1620 symtab_hdr = &elf_symtab_hdr (abfd);
1621 sym_hashes = elf_sym_hashes (abfd);
1622
1623 sreloc = NULL;
1624
1625 rel_end = relocs + sec->reloc_count;
1626 for (rel = relocs; rel < rel_end; rel++)
1627 {
1628 unsigned int r_type;
1629 unsigned long r_symndx;
1630 struct elf_link_hash_entry *h;
1631 struct elf_x86_64_link_hash_entry *eh;
1632 Elf_Internal_Sym *isym;
1633 const char *name;
1634 bfd_boolean size_reloc;
1635
1636 r_symndx = htab->r_sym (rel->r_info);
1637 r_type = ELF32_R_TYPE (rel->r_info);
1638
1639 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1640 {
1641 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1642 abfd, r_symndx);
1643 return FALSE;
1644 }
1645
1646 if (r_symndx < symtab_hdr->sh_info)
1647 {
1648 /* A local symbol. */
1649 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1650 abfd, r_symndx);
1651 if (isym == NULL)
1652 return FALSE;
1653
1654 /* Check relocation against local STT_GNU_IFUNC symbol. */
1655 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1656 {
1657 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel,
1658 TRUE);
1659 if (h == NULL)
1660 return FALSE;
1661
1662 /* Fake a STT_GNU_IFUNC symbol. */
1663 h->type = STT_GNU_IFUNC;
1664 h->def_regular = 1;
1665 h->ref_regular = 1;
1666 h->forced_local = 1;
1667 h->root.type = bfd_link_hash_defined;
1668 }
1669 else
1670 h = NULL;
1671 }
1672 else
1673 {
1674 isym = NULL;
1675 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1676 while (h->root.type == bfd_link_hash_indirect
1677 || h->root.type == bfd_link_hash_warning)
1678 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1679 }
1680
1681 /* Check invalid x32 relocations. */
1682 if (!ABI_64_P (abfd))
1683 switch (r_type)
1684 {
1685 default:
1686 break;
1687
1688 case R_X86_64_DTPOFF64:
1689 case R_X86_64_TPOFF64:
1690 case R_X86_64_PC64:
1691 case R_X86_64_GOTOFF64:
1692 case R_X86_64_GOT64:
1693 case R_X86_64_GOTPCREL64:
1694 case R_X86_64_GOTPC64:
1695 case R_X86_64_GOTPLT64:
1696 case R_X86_64_PLTOFF64:
1697 {
1698 if (h)
1699 name = h->root.root.string;
1700 else
1701 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1702 NULL);
1703 (*_bfd_error_handler)
1704 (_("%B: relocation %s against symbol `%s' isn't "
1705 "supported in x32 mode"), abfd,
1706 x86_64_elf_howto_table[r_type].name, name);
1707 bfd_set_error (bfd_error_bad_value);
1708 return FALSE;
1709 }
1710 break;
1711 }
1712
1713 if (h != NULL)
1714 {
1715 /* Create the ifunc sections for static executables. If we
1716 never see an indirect function symbol nor we are building
1717 a static executable, those sections will be empty and
1718 won't appear in output. */
1719 switch (r_type)
1720 {
1721 default:
1722 break;
1723
1724 case R_X86_64_PC32_BND:
1725 case R_X86_64_PLT32_BND:
1726 case R_X86_64_PC32:
1727 case R_X86_64_PLT32:
1728 case R_X86_64_32:
1729 case R_X86_64_64:
1730 /* MPX PLT is supported only if elf_x86_64_arch_bed
1731 is used in 64-bit mode. */
1732 if (ABI_64_P (abfd)
1733 && info->bndplt
1734 && (get_elf_x86_64_backend_data (abfd)
1735 == &elf_x86_64_arch_bed))
1736 {
1737 elf_x86_64_hash_entry (h)->has_bnd_reloc = 1;
1738
1739 /* Create the second PLT for Intel MPX support. */
1740 if (htab->plt_bnd == NULL)
1741 {
1742 unsigned int plt_bnd_align;
1743 const struct elf_backend_data *bed;
1744
1745 bed = get_elf_backend_data (info->output_bfd);
1746 BFD_ASSERT (sizeof (elf_x86_64_bnd_plt2_entry) == 8
1747 && (sizeof (elf_x86_64_bnd_plt2_entry)
1748 == sizeof (elf_x86_64_legacy_plt2_entry)));
1749 plt_bnd_align = 3;
1750
1751 if (htab->elf.dynobj == NULL)
1752 htab->elf.dynobj = abfd;
1753 htab->plt_bnd
1754 = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
1755 ".plt.bnd",
1756 (bed->dynamic_sec_flags
1757 | SEC_ALLOC
1758 | SEC_CODE
1759 | SEC_LOAD
1760 | SEC_READONLY));
1761 if (htab->plt_bnd == NULL
1762 || !bfd_set_section_alignment (htab->elf.dynobj,
1763 htab->plt_bnd,
1764 plt_bnd_align))
1765 return FALSE;
1766 }
1767 }
1768
1769 case R_X86_64_32S:
1770 case R_X86_64_PC64:
1771 case R_X86_64_GOTPCREL:
1772 case R_X86_64_GOTPCRELX:
1773 case R_X86_64_REX_GOTPCRELX:
1774 case R_X86_64_GOTPCREL64:
1775 if (htab->elf.dynobj == NULL)
1776 htab->elf.dynobj = abfd;
1777 if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info))
1778 return FALSE;
1779 break;
1780 }
1781
1782 /* It is referenced by a non-shared object. */
1783 h->ref_regular = 1;
1784 h->root.non_ir_ref = 1;
1785
1786 if (h->type == STT_GNU_IFUNC)
1787 elf_tdata (info->output_bfd)->has_gnu_symbols
1788 |= elf_gnu_symbol_ifunc;
1789 }
1790
1791 if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
1792 symtab_hdr, sym_hashes,
1793 &r_type, GOT_UNKNOWN,
1794 rel, rel_end, h, r_symndx))
1795 return FALSE;
1796
1797 eh = (struct elf_x86_64_link_hash_entry *) h;
1798 switch (r_type)
1799 {
1800 case R_X86_64_TLSLD:
1801 htab->tls_ld_got.refcount += 1;
1802 goto create_got;
1803
1804 case R_X86_64_TPOFF32:
1805 if (!bfd_link_executable (info) && ABI_64_P (abfd))
1806 {
1807 if (h)
1808 name = h->root.root.string;
1809 else
1810 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1811 NULL);
1812 (*_bfd_error_handler)
1813 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1814 abfd,
1815 x86_64_elf_howto_table[r_type].name, name);
1816 bfd_set_error (bfd_error_bad_value);
1817 return FALSE;
1818 }
1819 if (eh != NULL)
1820 eh->has_got_reloc = 1;
1821 break;
1822
1823 case R_X86_64_GOTTPOFF:
1824 if (!bfd_link_executable (info))
1825 info->flags |= DF_STATIC_TLS;
1826 /* Fall through */
1827
1828 case R_X86_64_GOT32:
1829 case R_X86_64_GOTPCREL:
1830 case R_X86_64_GOTPCRELX:
1831 case R_X86_64_REX_GOTPCRELX:
1832 case R_X86_64_TLSGD:
1833 case R_X86_64_GOT64:
1834 case R_X86_64_GOTPCREL64:
1835 case R_X86_64_GOTPLT64:
1836 case R_X86_64_GOTPC32_TLSDESC:
1837 case R_X86_64_TLSDESC_CALL:
1838 /* This symbol requires a global offset table entry. */
1839 {
1840 int tls_type, old_tls_type;
1841
1842 switch (r_type)
1843 {
1844 default: tls_type = GOT_NORMAL; break;
1845 case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break;
1846 case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break;
1847 case R_X86_64_GOTPC32_TLSDESC:
1848 case R_X86_64_TLSDESC_CALL:
1849 tls_type = GOT_TLS_GDESC; break;
1850 }
1851
1852 if (h != NULL)
1853 {
1854 h->got.refcount += 1;
1855 old_tls_type = eh->tls_type;
1856 }
1857 else
1858 {
1859 bfd_signed_vma *local_got_refcounts;
1860
1861 /* This is a global offset table entry for a local symbol. */
1862 local_got_refcounts = elf_local_got_refcounts (abfd);
1863 if (local_got_refcounts == NULL)
1864 {
1865 bfd_size_type size;
1866
1867 size = symtab_hdr->sh_info;
1868 size *= sizeof (bfd_signed_vma)
1869 + sizeof (bfd_vma) + sizeof (char);
1870 local_got_refcounts = ((bfd_signed_vma *)
1871 bfd_zalloc (abfd, size));
1872 if (local_got_refcounts == NULL)
1873 return FALSE;
1874 elf_local_got_refcounts (abfd) = local_got_refcounts;
1875 elf_x86_64_local_tlsdesc_gotent (abfd)
1876 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
1877 elf_x86_64_local_got_tls_type (abfd)
1878 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
1879 }
1880 local_got_refcounts[r_symndx] += 1;
1881 old_tls_type
1882 = elf_x86_64_local_got_tls_type (abfd) [r_symndx];
1883 }
1884
1885 /* If a TLS symbol is accessed using IE at least once,
1886 there is no point to use dynamic model for it. */
1887 if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1888 && (! GOT_TLS_GD_ANY_P (old_tls_type)
1889 || tls_type != GOT_TLS_IE))
1890 {
1891 if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type))
1892 tls_type = old_tls_type;
1893 else if (GOT_TLS_GD_ANY_P (old_tls_type)
1894 && GOT_TLS_GD_ANY_P (tls_type))
1895 tls_type |= old_tls_type;
1896 else
1897 {
1898 if (h)
1899 name = h->root.root.string;
1900 else
1901 name = bfd_elf_sym_name (abfd, symtab_hdr,
1902 isym, NULL);
1903 (*_bfd_error_handler)
1904 (_("%B: '%s' accessed both as normal and thread local symbol"),
1905 abfd, name);
1906 bfd_set_error (bfd_error_bad_value);
1907 return FALSE;
1908 }
1909 }
1910
1911 if (old_tls_type != tls_type)
1912 {
1913 if (eh != NULL)
1914 eh->tls_type = tls_type;
1915 else
1916 elf_x86_64_local_got_tls_type (abfd) [r_symndx] = tls_type;
1917 }
1918 }
1919 /* Fall through */
1920
1921 case R_X86_64_GOTOFF64:
1922 case R_X86_64_GOTPC32:
1923 case R_X86_64_GOTPC64:
1924 create_got:
1925 if (eh != NULL)
1926 eh->has_got_reloc = 1;
1927 if (htab->elf.sgot == NULL)
1928 {
1929 if (htab->elf.dynobj == NULL)
1930 htab->elf.dynobj = abfd;
1931 if (!_bfd_elf_create_got_section (htab->elf.dynobj,
1932 info))
1933 return FALSE;
1934 }
1935 break;
1936
1937 case R_X86_64_PLT32:
1938 case R_X86_64_PLT32_BND:
1939 /* This symbol requires a procedure linkage table entry. We
1940 actually build the entry in adjust_dynamic_symbol,
1941 because this might be a case of linking PIC code which is
1942 never referenced by a dynamic object, in which case we
1943 don't need to generate a procedure linkage table entry
1944 after all. */
1945
1946 /* If this is a local symbol, we resolve it directly without
1947 creating a procedure linkage table entry. */
1948 if (h == NULL)
1949 continue;
1950
1951 eh->has_got_reloc = 1;
1952 h->needs_plt = 1;
1953 h->plt.refcount += 1;
1954 break;
1955
1956 case R_X86_64_PLTOFF64:
1957 /* This tries to form the 'address' of a function relative
1958 to GOT. For global symbols we need a PLT entry. */
1959 if (h != NULL)
1960 {
1961 h->needs_plt = 1;
1962 h->plt.refcount += 1;
1963 }
1964 goto create_got;
1965
1966 case R_X86_64_SIZE32:
1967 case R_X86_64_SIZE64:
1968 size_reloc = TRUE;
1969 goto do_size;
1970
1971 case R_X86_64_32:
1972 if (!ABI_64_P (abfd))
1973 goto pointer;
1974 case R_X86_64_8:
1975 case R_X86_64_16:
1976 case R_X86_64_32S:
1977 /* Let's help debug shared library creation. These relocs
1978 cannot be used in shared libs. Don't error out for
1979 sections we don't care about, such as debug sections or
1980 non-constant sections, or when relocation overflow check
1981 is disabled. */
1982 if (!info->no_reloc_overflow_check
1983 && bfd_link_pic (info)
1984 && (sec->flags & SEC_ALLOC) != 0
1985 && (sec->flags & SEC_READONLY) != 0)
1986 {
1987 if (h)
1988 name = h->root.root.string;
1989 else
1990 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1991 (*_bfd_error_handler)
1992 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1993 abfd, x86_64_elf_howto_table[r_type].name, name);
1994 bfd_set_error (bfd_error_bad_value);
1995 return FALSE;
1996 }
1997 /* Fall through. */
1998
1999 case R_X86_64_PC8:
2000 case R_X86_64_PC16:
2001 case R_X86_64_PC32:
2002 case R_X86_64_PC32_BND:
2003 case R_X86_64_PC64:
2004 case R_X86_64_64:
2005 pointer:
2006 if (eh != NULL && (sec->flags & SEC_CODE) != 0)
2007 eh->has_non_got_reloc = 1;
2008 /* STT_GNU_IFUNC symbol must go through PLT even if it is
2009 locally defined and undefined symbol may turn out to be
2010 a STT_GNU_IFUNC symbol later. */
2011 if (h != NULL
2012 && (bfd_link_executable (info)
2013 || ((h->type == STT_GNU_IFUNC
2014 || h->root.type == bfd_link_hash_undefweak
2015 || h->root.type == bfd_link_hash_undefined)
2016 && SYMBOLIC_BIND (info, h))))
2017 {
2018 /* If this reloc is in a read-only section, we might
2019 need a copy reloc. We can't check reliably at this
2020 stage whether the section is read-only, as input
2021 sections have not yet been mapped to output sections.
2022 Tentatively set the flag for now, and correct in
2023 adjust_dynamic_symbol. */
2024 h->non_got_ref = 1;
2025
2026 /* We may need a .plt entry if the function this reloc
2027 refers to is in a shared lib. */
2028 h->plt.refcount += 1;
2029 if (r_type == R_X86_64_PC32)
2030 {
2031 /* Since something like ".long foo - ." may be used
2032 as pointer, make sure that PLT is used if foo is
2033 a function defined in a shared library. */
2034 if ((sec->flags & SEC_CODE) == 0)
2035 h->pointer_equality_needed = 1;
2036 }
2037 else if (r_type != R_X86_64_PC32_BND
2038 && r_type != R_X86_64_PC64)
2039 {
2040 h->pointer_equality_needed = 1;
2041 /* At run-time, R_X86_64_64 can be resolved for both
2042 x86-64 and x32. But R_X86_64_32 and R_X86_64_32S
2043 can only be resolved for x32. */
2044 if ((sec->flags & SEC_READONLY) == 0
2045 && (r_type == R_X86_64_64
2046 || (!ABI_64_P (abfd)
2047 && (r_type == R_X86_64_32
2048 || r_type == R_X86_64_32S))))
2049 eh->func_pointer_refcount += 1;
2050 }
2051 }
2052
2053 size_reloc = FALSE;
2054 do_size:
2055 /* If we are creating a shared library, and this is a reloc
2056 against a global symbol, or a non PC relative reloc
2057 against a local symbol, then we need to copy the reloc
2058 into the shared library. However, if we are linking with
2059 -Bsymbolic, we do not need to copy a reloc against a
2060 global symbol which is defined in an object we are
2061 including in the link (i.e., DEF_REGULAR is set). At
2062 this point we have not seen all the input files, so it is
2063 possible that DEF_REGULAR is not set now but will be set
2064 later (it is never cleared). In case of a weak definition,
2065 DEF_REGULAR may be cleared later by a strong definition in
2066 a shared library. We account for that possibility below by
2067 storing information in the relocs_copied field of the hash
2068 table entry. A similar situation occurs when creating
2069 shared libraries and symbol visibility changes render the
2070 symbol local.
2071
2072 If on the other hand, we are creating an executable, we
2073 may need to keep relocations for symbols satisfied by a
2074 dynamic library if we manage to avoid copy relocs for the
2075 symbol. */
2076 if ((bfd_link_pic (info)
2077 && (sec->flags & SEC_ALLOC) != 0
2078 && (! IS_X86_64_PCREL_TYPE (r_type)
2079 || (h != NULL
2080 && (! (bfd_link_pie (info)
2081 || SYMBOLIC_BIND (info, h))
2082 || h->root.type == bfd_link_hash_defweak
2083 || !h->def_regular))))
2084 || (ELIMINATE_COPY_RELOCS
2085 && !bfd_link_pic (info)
2086 && (sec->flags & SEC_ALLOC) != 0
2087 && h != NULL
2088 && (h->root.type == bfd_link_hash_defweak
2089 || !h->def_regular)))
2090 {
2091 struct elf_dyn_relocs *p;
2092 struct elf_dyn_relocs **head;
2093
2094 /* We must copy these reloc types into the output file.
2095 Create a reloc section in dynobj and make room for
2096 this reloc. */
2097 if (sreloc == NULL)
2098 {
2099 if (htab->elf.dynobj == NULL)
2100 htab->elf.dynobj = abfd;
2101
2102 sreloc = _bfd_elf_make_dynamic_reloc_section
2103 (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2,
2104 abfd, /*rela?*/ TRUE);
2105
2106 if (sreloc == NULL)
2107 return FALSE;
2108 }
2109
2110 /* If this is a global symbol, we count the number of
2111 relocations we need for this symbol. */
2112 if (h != NULL)
2113 head = &eh->dyn_relocs;
2114 else
2115 {
2116 /* Track dynamic relocs needed for local syms too.
2117 We really need local syms available to do this
2118 easily. Oh well. */
2119 asection *s;
2120 void **vpp;
2121
2122 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2123 abfd, r_symndx);
2124 if (isym == NULL)
2125 return FALSE;
2126
2127 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2128 if (s == NULL)
2129 s = sec;
2130
2131 /* Beware of type punned pointers vs strict aliasing
2132 rules. */
2133 vpp = &(elf_section_data (s)->local_dynrel);
2134 head = (struct elf_dyn_relocs **)vpp;
2135 }
2136
2137 p = *head;
2138 if (p == NULL || p->sec != sec)
2139 {
2140 bfd_size_type amt = sizeof *p;
2141
2142 p = ((struct elf_dyn_relocs *)
2143 bfd_alloc (htab->elf.dynobj, amt));
2144 if (p == NULL)
2145 return FALSE;
2146 p->next = *head;
2147 *head = p;
2148 p->sec = sec;
2149 p->count = 0;
2150 p->pc_count = 0;
2151 }
2152
2153 p->count += 1;
2154 /* Count size relocation as PC-relative relocation. */
2155 if (IS_X86_64_PCREL_TYPE (r_type) || size_reloc)
2156 p->pc_count += 1;
2157 }
2158 break;
2159
2160 /* This relocation describes the C++ object vtable hierarchy.
2161 Reconstruct it for later use during GC. */
2162 case R_X86_64_GNU_VTINHERIT:
2163 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2164 return FALSE;
2165 break;
2166
2167 /* This relocation describes which C++ vtable entries are actually
2168 used. Record for later use during GC. */
2169 case R_X86_64_GNU_VTENTRY:
2170 BFD_ASSERT (h != NULL);
2171 if (h != NULL
2172 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2173 return FALSE;
2174 break;
2175
2176 default:
2177 break;
2178 }
2179
2180 if (use_plt_got
2181 && h != NULL
2182 && h->plt.refcount > 0
2183 && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
2184 || h->got.refcount > 0)
2185 && htab->plt_got == NULL)
2186 {
2187 /* Create the GOT procedure linkage table. */
2188 unsigned int plt_got_align;
2189 const struct elf_backend_data *bed;
2190
2191 bed = get_elf_backend_data (info->output_bfd);
2192 BFD_ASSERT (sizeof (elf_x86_64_legacy_plt2_entry) == 8
2193 && (sizeof (elf_x86_64_bnd_plt2_entry)
2194 == sizeof (elf_x86_64_legacy_plt2_entry)));
2195 plt_got_align = 3;
2196
2197 if (htab->elf.dynobj == NULL)
2198 htab->elf.dynobj = abfd;
2199 htab->plt_got
2200 = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2201 ".plt.got",
2202 (bed->dynamic_sec_flags
2203 | SEC_ALLOC
2204 | SEC_CODE
2205 | SEC_LOAD
2206 | SEC_READONLY));
2207 if (htab->plt_got == NULL
2208 || !bfd_set_section_alignment (htab->elf.dynobj,
2209 htab->plt_got,
2210 plt_got_align))
2211 return FALSE;
2212 }
2213
2214 if ((r_type == R_X86_64_GOTPCREL
2215 || r_type == R_X86_64_GOTPCRELX
2216 || r_type == R_X86_64_REX_GOTPCRELX)
2217 && (h == NULL || h->type != STT_GNU_IFUNC))
2218 sec->need_convert_load = 1;
2219 }
2220
2221 return TRUE;
2222 }
2223
2224 /* Return the section that should be marked against GC for a given
2225 relocation. */
2226
2227 static asection *
2228 elf_x86_64_gc_mark_hook (asection *sec,
2229 struct bfd_link_info *info,
2230 Elf_Internal_Rela *rel,
2231 struct elf_link_hash_entry *h,
2232 Elf_Internal_Sym *sym)
2233 {
2234 if (h != NULL)
2235 switch (ELF32_R_TYPE (rel->r_info))
2236 {
2237 case R_X86_64_GNU_VTINHERIT:
2238 case R_X86_64_GNU_VTENTRY:
2239 return NULL;
2240 }
2241
2242 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2243 }
2244
2245 /* Update the got entry reference counts for the section being removed. */
2246
2247 static bfd_boolean
2248 elf_x86_64_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
2249 asection *sec,
2250 const Elf_Internal_Rela *relocs)
2251 {
2252 struct elf_x86_64_link_hash_table *htab;
2253 Elf_Internal_Shdr *symtab_hdr;
2254 struct elf_link_hash_entry **sym_hashes;
2255 bfd_signed_vma *local_got_refcounts;
2256 const Elf_Internal_Rela *rel, *relend;
2257
2258 if (bfd_link_relocatable (info))
2259 return TRUE;
2260
2261 htab = elf_x86_64_hash_table (info);
2262 if (htab == NULL)
2263 return FALSE;
2264
2265 elf_section_data (sec)->local_dynrel = NULL;
2266
2267 symtab_hdr = &elf_symtab_hdr (abfd);
2268 sym_hashes = elf_sym_hashes (abfd);
2269 local_got_refcounts = elf_local_got_refcounts (abfd);
2270
2271 htab = elf_x86_64_hash_table (info);
2272 relend = relocs + sec->reloc_count;
2273 for (rel = relocs; rel < relend; rel++)
2274 {
2275 unsigned long r_symndx;
2276 unsigned int r_type;
2277 struct elf_link_hash_entry *h = NULL;
2278 bfd_boolean pointer_reloc;
2279
2280 r_symndx = htab->r_sym (rel->r_info);
2281 if (r_symndx >= symtab_hdr->sh_info)
2282 {
2283 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2284 while (h->root.type == bfd_link_hash_indirect
2285 || h->root.type == bfd_link_hash_warning)
2286 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2287 }
2288 else
2289 {
2290 /* A local symbol. */
2291 Elf_Internal_Sym *isym;
2292
2293 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2294 abfd, r_symndx);
2295
2296 /* Check relocation against local STT_GNU_IFUNC symbol. */
2297 if (isym != NULL
2298 && ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2299 {
2300 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel, FALSE);
2301 if (h == NULL)
2302 abort ();
2303 }
2304 }
2305
2306 if (h)
2307 {
2308 struct elf_x86_64_link_hash_entry *eh;
2309 struct elf_dyn_relocs **pp;
2310 struct elf_dyn_relocs *p;
2311
2312 eh = (struct elf_x86_64_link_hash_entry *) h;
2313
2314 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2315 if (p->sec == sec)
2316 {
2317 /* Everything must go for SEC. */
2318 *pp = p->next;
2319 break;
2320 }
2321 }
2322
2323 r_type = ELF32_R_TYPE (rel->r_info);
2324 if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
2325 symtab_hdr, sym_hashes,
2326 &r_type, GOT_UNKNOWN,
2327 rel, relend, h, r_symndx))
2328 return FALSE;
2329
2330 pointer_reloc = FALSE;
2331 switch (r_type)
2332 {
2333 case R_X86_64_TLSLD:
2334 if (htab->tls_ld_got.refcount > 0)
2335 htab->tls_ld_got.refcount -= 1;
2336 break;
2337
2338 case R_X86_64_TLSGD:
2339 case R_X86_64_GOTPC32_TLSDESC:
2340 case R_X86_64_TLSDESC_CALL:
2341 case R_X86_64_GOTTPOFF:
2342 case R_X86_64_GOT32:
2343 case R_X86_64_GOTPCREL:
2344 case R_X86_64_GOTPCRELX:
2345 case R_X86_64_REX_GOTPCRELX:
2346 case R_X86_64_GOT64:
2347 case R_X86_64_GOTPCREL64:
2348 case R_X86_64_GOTPLT64:
2349 if (h != NULL)
2350 {
2351 if (h->got.refcount > 0)
2352 h->got.refcount -= 1;
2353 if (h->type == STT_GNU_IFUNC)
2354 {
2355 if (h->plt.refcount > 0)
2356 h->plt.refcount -= 1;
2357 }
2358 }
2359 else if (local_got_refcounts != NULL)
2360 {
2361 if (local_got_refcounts[r_symndx] > 0)
2362 local_got_refcounts[r_symndx] -= 1;
2363 }
2364 break;
2365
2366 case R_X86_64_32:
2367 case R_X86_64_32S:
2368 pointer_reloc = !ABI_64_P (abfd);
2369 goto pointer;
2370
2371 case R_X86_64_64:
2372 pointer_reloc = TRUE;
2373 case R_X86_64_8:
2374 case R_X86_64_16:
2375 case R_X86_64_PC8:
2376 case R_X86_64_PC16:
2377 case R_X86_64_PC32:
2378 case R_X86_64_PC32_BND:
2379 case R_X86_64_PC64:
2380 case R_X86_64_SIZE32:
2381 case R_X86_64_SIZE64:
2382 pointer:
2383 if (bfd_link_pic (info)
2384 && (h == NULL || h->type != STT_GNU_IFUNC))
2385 break;
2386 /* Fall thru */
2387
2388 case R_X86_64_PLT32:
2389 case R_X86_64_PLT32_BND:
2390 case R_X86_64_PLTOFF64:
2391 if (h != NULL)
2392 {
2393 if (h->plt.refcount > 0)
2394 h->plt.refcount -= 1;
2395 if (pointer_reloc && (sec->flags & SEC_READONLY) == 0)
2396 {
2397 struct elf_x86_64_link_hash_entry *eh
2398 = (struct elf_x86_64_link_hash_entry *) h;
2399 if (eh->func_pointer_refcount > 0)
2400 eh->func_pointer_refcount -= 1;
2401 }
2402 }
2403 break;
2404
2405 default:
2406 break;
2407 }
2408 }
2409
2410 return TRUE;
2411 }
2412
2413 /* Remove undefined weak symbol from the dynamic symbol table if it
2414 is resolved to 0. */
2415
2416 static bfd_boolean
2417 elf_x86_64_fixup_symbol (struct bfd_link_info *info,
2418 struct elf_link_hash_entry *h)
2419 {
2420 if (h->dynindx != -1
2421 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
2422 elf_x86_64_hash_entry (h)))
2423 {
2424 h->dynindx = -1;
2425 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2426 h->dynstr_index);
2427 }
2428 return TRUE;
2429 }
2430
2431 /* Adjust a symbol defined by a dynamic object and referenced by a
2432 regular object. The current definition is in some section of the
2433 dynamic object, but we're not including those sections. We have to
2434 change the definition to something the rest of the link can
2435 understand. */
2436
2437 static bfd_boolean
2438 elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
2439 struct elf_link_hash_entry *h)
2440 {
2441 struct elf_x86_64_link_hash_table *htab;
2442 asection *s;
2443 struct elf_x86_64_link_hash_entry *eh;
2444 struct elf_dyn_relocs *p;
2445
2446 /* STT_GNU_IFUNC symbol must go through PLT. */
2447 if (h->type == STT_GNU_IFUNC)
2448 {
2449 /* All local STT_GNU_IFUNC references must be treate as local
2450 calls via local PLT. */
2451 if (h->ref_regular
2452 && SYMBOL_CALLS_LOCAL (info, h))
2453 {
2454 bfd_size_type pc_count = 0, count = 0;
2455 struct elf_dyn_relocs **pp;
2456
2457 eh = (struct elf_x86_64_link_hash_entry *) h;
2458 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2459 {
2460 pc_count += p->pc_count;
2461 p->count -= p->pc_count;
2462 p->pc_count = 0;
2463 count += p->count;
2464 if (p->count == 0)
2465 *pp = p->next;
2466 else
2467 pp = &p->next;
2468 }
2469
2470 if (pc_count || count)
2471 {
2472 h->needs_plt = 1;
2473 h->non_got_ref = 1;
2474 if (h->plt.refcount <= 0)
2475 h->plt.refcount = 1;
2476 else
2477 h->plt.refcount += 1;
2478 }
2479 }
2480
2481 if (h->plt.refcount <= 0)
2482 {
2483 h->plt.offset = (bfd_vma) -1;
2484 h->needs_plt = 0;
2485 }
2486 return TRUE;
2487 }
2488
2489 /* If this is a function, put it in the procedure linkage table. We
2490 will fill in the contents of the procedure linkage table later,
2491 when we know the address of the .got section. */
2492 if (h->type == STT_FUNC
2493 || h->needs_plt)
2494 {
2495 if (h->plt.refcount <= 0
2496 || SYMBOL_CALLS_LOCAL (info, h)
2497 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2498 && h->root.type == bfd_link_hash_undefweak))
2499 {
2500 /* This case can occur if we saw a PLT32 reloc in an input
2501 file, but the symbol was never referred to by a dynamic
2502 object, or if all references were garbage collected. In
2503 such a case, we don't actually need to build a procedure
2504 linkage table, and we can just do a PC32 reloc instead. */
2505 h->plt.offset = (bfd_vma) -1;
2506 h->needs_plt = 0;
2507 }
2508
2509 return TRUE;
2510 }
2511 else
2512 /* It's possible that we incorrectly decided a .plt reloc was
2513 needed for an R_X86_64_PC32 reloc to a non-function sym in
2514 check_relocs. We can't decide accurately between function and
2515 non-function syms in check-relocs; Objects loaded later in
2516 the link may change h->type. So fix it now. */
2517 h->plt.offset = (bfd_vma) -1;
2518
2519 /* If this is a weak symbol, and there is a real definition, the
2520 processor independent code will have arranged for us to see the
2521 real definition first, and we can just use the same value. */
2522 if (h->u.weakdef != NULL)
2523 {
2524 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2525 || h->u.weakdef->root.type == bfd_link_hash_defweak);
2526 h->root.u.def.section = h->u.weakdef->root.u.def.section;
2527 h->root.u.def.value = h->u.weakdef->root.u.def.value;
2528 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2529 {
2530 eh = (struct elf_x86_64_link_hash_entry *) h;
2531 h->non_got_ref = h->u.weakdef->non_got_ref;
2532 eh->needs_copy = h->u.weakdef->needs_copy;
2533 }
2534 return TRUE;
2535 }
2536
2537 /* This is a reference to a symbol defined by a dynamic object which
2538 is not a function. */
2539
2540 /* If we are creating a shared library, we must presume that the
2541 only references to the symbol are via the global offset table.
2542 For such cases we need not do anything here; the relocations will
2543 be handled correctly by relocate_section. */
2544 if (!bfd_link_executable (info))
2545 return TRUE;
2546
2547 /* If there are no references to this symbol that do not use the
2548 GOT, we don't need to generate a copy reloc. */
2549 if (!h->non_got_ref)
2550 return TRUE;
2551
2552 /* If -z nocopyreloc was given, we won't generate them either. */
2553 if (info->nocopyreloc)
2554 {
2555 h->non_got_ref = 0;
2556 return TRUE;
2557 }
2558
2559 if (ELIMINATE_COPY_RELOCS)
2560 {
2561 eh = (struct elf_x86_64_link_hash_entry *) h;
2562 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2563 {
2564 s = p->sec->output_section;
2565 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2566 break;
2567 }
2568
2569 /* If we didn't find any dynamic relocs in read-only sections, then
2570 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
2571 if (p == NULL)
2572 {
2573 h->non_got_ref = 0;
2574 return TRUE;
2575 }
2576 }
2577
2578 /* We must allocate the symbol in our .dynbss section, which will
2579 become part of the .bss section of the executable. There will be
2580 an entry for this symbol in the .dynsym section. The dynamic
2581 object will contain position independent code, so all references
2582 from the dynamic object to this symbol will go through the global
2583 offset table. The dynamic linker will use the .dynsym entry to
2584 determine the address it must put in the global offset table, so
2585 both the dynamic object and the regular object will refer to the
2586 same memory location for the variable. */
2587
2588 htab = elf_x86_64_hash_table (info);
2589 if (htab == NULL)
2590 return FALSE;
2591
2592 /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
2593 to copy the initial value out of the dynamic object and into the
2594 runtime process image. */
2595 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2596 {
2597 const struct elf_backend_data *bed;
2598 bed = get_elf_backend_data (info->output_bfd);
2599 htab->srelbss->size += bed->s->sizeof_rela;
2600 h->needs_copy = 1;
2601 }
2602
2603 s = htab->sdynbss;
2604
2605 return _bfd_elf_adjust_dynamic_copy (info, h, s);
2606 }
2607
2608 /* Allocate space in .plt, .got and associated reloc sections for
2609 dynamic relocs. */
2610
2611 static bfd_boolean
2612 elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2613 {
2614 struct bfd_link_info *info;
2615 struct elf_x86_64_link_hash_table *htab;
2616 struct elf_x86_64_link_hash_entry *eh;
2617 struct elf_dyn_relocs *p;
2618 const struct elf_backend_data *bed;
2619 unsigned int plt_entry_size;
2620 bfd_boolean resolved_to_zero;
2621
2622 if (h->root.type == bfd_link_hash_indirect)
2623 return TRUE;
2624
2625 eh = (struct elf_x86_64_link_hash_entry *) h;
2626
2627 info = (struct bfd_link_info *) inf;
2628 htab = elf_x86_64_hash_table (info);
2629 if (htab == NULL)
2630 return FALSE;
2631 bed = get_elf_backend_data (info->output_bfd);
2632 plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2633
2634 resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
2635
2636 /* We can't use the GOT PLT if pointer equality is needed since
2637 finish_dynamic_symbol won't clear symbol value and the dynamic
2638 linker won't update the GOT slot. We will get into an infinite
2639 loop at run-time. */
2640 if (htab->plt_got != NULL
2641 && h->type != STT_GNU_IFUNC
2642 && !h->pointer_equality_needed
2643 && h->plt.refcount > 0
2644 && h->got.refcount > 0)
2645 {
2646 /* Don't use the regular PLT if there are both GOT and GOTPLT
2647 reloctions. */
2648 h->plt.offset = (bfd_vma) -1;
2649
2650 /* Use the GOT PLT. */
2651 eh->plt_got.refcount = 1;
2652 }
2653
2654 /* Clear the reference count of function pointer relocations if
2655 symbol isn't a normal function. */
2656 if (h->type != STT_FUNC)
2657 eh->func_pointer_refcount = 0;
2658
2659 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2660 here if it is defined and referenced in a non-shared object. */
2661 if (h->type == STT_GNU_IFUNC
2662 && h->def_regular)
2663 {
2664 if (_bfd_elf_allocate_ifunc_dyn_relocs (info, h,
2665 &eh->dyn_relocs,
2666 &htab->readonly_dynrelocs_against_ifunc,
2667 plt_entry_size,
2668 plt_entry_size,
2669 GOT_ENTRY_SIZE))
2670 {
2671 asection *s = htab->plt_bnd;
2672 if (h->plt.offset != (bfd_vma) -1 && s != NULL)
2673 {
2674 /* Use the .plt.bnd section if it is created. */
2675 eh->plt_bnd.offset = s->size;
2676
2677 /* Make room for this entry in the .plt.bnd section. */
2678 s->size += sizeof (elf_x86_64_legacy_plt2_entry);
2679 }
2680
2681 return TRUE;
2682 }
2683 else
2684 return FALSE;
2685 }
2686 /* Don't create the PLT entry if there are only function pointer
2687 relocations which can be resolved at run-time. */
2688 else if (htab->elf.dynamic_sections_created
2689 && (h->plt.refcount > eh->func_pointer_refcount
2690 || eh->plt_got.refcount > 0))
2691 {
2692 bfd_boolean use_plt_got;
2693
2694 /* Clear the reference count of function pointer relocations
2695 if PLT is used. */
2696 eh->func_pointer_refcount = 0;
2697
2698 if ((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
2699 {
2700 /* Don't use the regular PLT for DF_BIND_NOW. */
2701 h->plt.offset = (bfd_vma) -1;
2702
2703 /* Use the GOT PLT. */
2704 h->got.refcount = 1;
2705 eh->plt_got.refcount = 1;
2706 }
2707
2708 use_plt_got = eh->plt_got.refcount > 0;
2709
2710 /* Make sure this symbol is output as a dynamic symbol.
2711 Undefined weak syms won't yet be marked as dynamic. */
2712 if (h->dynindx == -1
2713 && !h->forced_local
2714 && !resolved_to_zero)
2715 {
2716 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2717 return FALSE;
2718 }
2719
2720 if (bfd_link_pic (info)
2721 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2722 {
2723 asection *s = htab->elf.splt;
2724 asection *bnd_s = htab->plt_bnd;
2725 asection *got_s = htab->plt_got;
2726
2727 /* If this is the first .plt entry, make room for the special
2728 first entry. The .plt section is used by prelink to undo
2729 prelinking for dynamic relocations. */
2730 if (s->size == 0)
2731 s->size = plt_entry_size;
2732
2733 if (use_plt_got)
2734 eh->plt_got.offset = got_s->size;
2735 else
2736 {
2737 h->plt.offset = s->size;
2738 if (bnd_s)
2739 eh->plt_bnd.offset = bnd_s->size;
2740 }
2741
2742 /* If this symbol is not defined in a regular file, and we are
2743 not generating a shared library, then set the symbol to this
2744 location in the .plt. This is required to make function
2745 pointers compare as equal between the normal executable and
2746 the shared library. */
2747 if (! bfd_link_pic (info)
2748 && !h->def_regular)
2749 {
2750 if (use_plt_got)
2751 {
2752 /* We need to make a call to the entry of the GOT PLT
2753 instead of regular PLT entry. */
2754 h->root.u.def.section = got_s;
2755 h->root.u.def.value = eh->plt_got.offset;
2756 }
2757 else
2758 {
2759 if (bnd_s)
2760 {
2761 /* We need to make a call to the entry of the second
2762 PLT instead of regular PLT entry. */
2763 h->root.u.def.section = bnd_s;
2764 h->root.u.def.value = eh->plt_bnd.offset;
2765 }
2766 else
2767 {
2768 h->root.u.def.section = s;
2769 h->root.u.def.value = h->plt.offset;
2770 }
2771 }
2772 }
2773
2774 /* Make room for this entry. */
2775 if (use_plt_got)
2776 got_s->size += sizeof (elf_x86_64_legacy_plt2_entry);
2777 else
2778 {
2779 s->size += plt_entry_size;
2780 if (bnd_s)
2781 bnd_s->size += sizeof (elf_x86_64_legacy_plt2_entry);
2782
2783 /* We also need to make an entry in the .got.plt section,
2784 which will be placed in the .got section by the linker
2785 script. */
2786 htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
2787
2788 /* There should be no PLT relocation against resolved
2789 undefined weak symbol in executable. */
2790 if (!resolved_to_zero)
2791 {
2792 /* We also need to make an entry in the .rela.plt
2793 section. */
2794 htab->elf.srelplt->size += bed->s->sizeof_rela;
2795 htab->elf.srelplt->reloc_count++;
2796 }
2797 }
2798 }
2799 else
2800 {
2801 eh->plt_got.offset = (bfd_vma) -1;
2802 h->plt.offset = (bfd_vma) -1;
2803 h->needs_plt = 0;
2804 }
2805 }
2806 else
2807 {
2808 eh->plt_got.offset = (bfd_vma) -1;
2809 h->plt.offset = (bfd_vma) -1;
2810 h->needs_plt = 0;
2811 }
2812
2813 eh->tlsdesc_got = (bfd_vma) -1;
2814
2815 /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
2816 make it a R_X86_64_TPOFF32 requiring no GOT entry. */
2817 if (h->got.refcount > 0
2818 && bfd_link_executable (info)
2819 && h->dynindx == -1
2820 && elf_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE)
2821 {
2822 h->got.offset = (bfd_vma) -1;
2823 }
2824 else if (h->got.refcount > 0)
2825 {
2826 asection *s;
2827 bfd_boolean dyn;
2828 int tls_type = elf_x86_64_hash_entry (h)->tls_type;
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 {
2836 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2837 return FALSE;
2838 }
2839
2840 if (GOT_TLS_GDESC_P (tls_type))
2841 {
2842 eh->tlsdesc_got = htab->elf.sgotplt->size
2843 - elf_x86_64_compute_jump_table_size (htab);
2844 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
2845 h->got.offset = (bfd_vma) -2;
2846 }
2847 if (! GOT_TLS_GDESC_P (tls_type)
2848 || GOT_TLS_GD_P (tls_type))
2849 {
2850 s = htab->elf.sgot;
2851 h->got.offset = s->size;
2852 s->size += GOT_ENTRY_SIZE;
2853 if (GOT_TLS_GD_P (tls_type))
2854 s->size += GOT_ENTRY_SIZE;
2855 }
2856 dyn = htab->elf.dynamic_sections_created;
2857 /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
2858 and two if global. R_X86_64_GOTTPOFF needs one dynamic
2859 relocation. No dynamic relocation against resolved undefined
2860 weak symbol in executable. */
2861 if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2862 || tls_type == GOT_TLS_IE)
2863 htab->elf.srelgot->size += bed->s->sizeof_rela;
2864 else if (GOT_TLS_GD_P (tls_type))
2865 htab->elf.srelgot->size += 2 * bed->s->sizeof_rela;
2866 else if (! GOT_TLS_GDESC_P (tls_type)
2867 && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2868 && !resolved_to_zero)
2869 || h->root.type != bfd_link_hash_undefweak)
2870 && (bfd_link_pic (info)
2871 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2872 htab->elf.srelgot->size += bed->s->sizeof_rela;
2873 if (GOT_TLS_GDESC_P (tls_type))
2874 {
2875 htab->elf.srelplt->size += bed->s->sizeof_rela;
2876 htab->tlsdesc_plt = (bfd_vma) -1;
2877 }
2878 }
2879 else
2880 h->got.offset = (bfd_vma) -1;
2881
2882 if (eh->dyn_relocs == NULL)
2883 return TRUE;
2884
2885 /* In the shared -Bsymbolic case, discard space allocated for
2886 dynamic pc-relative relocs against symbols which turn out to be
2887 defined in regular objects. For the normal shared case, discard
2888 space for pc-relative relocs that have become local due to symbol
2889 visibility changes. */
2890
2891 if (bfd_link_pic (info))
2892 {
2893 /* Relocs that use pc_count are those that appear on a call
2894 insn, or certain REL relocs that can generated via assembly.
2895 We want calls to protected symbols to resolve directly to the
2896 function rather than going via the plt. If people want
2897 function pointer comparisons to work as expected then they
2898 should avoid writing weird assembly. */
2899 if (SYMBOL_CALLS_LOCAL (info, h))
2900 {
2901 struct elf_dyn_relocs **pp;
2902
2903 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2904 {
2905 p->count -= p->pc_count;
2906 p->pc_count = 0;
2907 if (p->count == 0)
2908 *pp = p->next;
2909 else
2910 pp = &p->next;
2911 }
2912 }
2913
2914 /* Also discard relocs on undefined weak syms with non-default
2915 visibility or in PIE. */
2916 if (eh->dyn_relocs != NULL)
2917 {
2918 if (h->root.type == bfd_link_hash_undefweak)
2919 {
2920 /* Undefined weak symbol is never bound locally in shared
2921 library. */
2922 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2923 || resolved_to_zero)
2924 eh->dyn_relocs = NULL;
2925 else if (h->dynindx == -1
2926 && ! h->forced_local
2927 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2928 return FALSE;
2929 }
2930 /* For PIE, discard space for pc-relative relocs against
2931 symbols which turn out to need copy relocs. */
2932 else if (bfd_link_executable (info)
2933 && (h->needs_copy || eh->needs_copy)
2934 && h->def_dynamic
2935 && !h->def_regular)
2936 {
2937 struct elf_dyn_relocs **pp;
2938
2939 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2940 {
2941 if (p->pc_count != 0)
2942 *pp = p->next;
2943 else
2944 pp = &p->next;
2945 }
2946 }
2947 }
2948 }
2949 else if (ELIMINATE_COPY_RELOCS)
2950 {
2951 /* For the non-shared case, discard space for relocs against
2952 symbols which turn out to need copy relocs or are not
2953 dynamic. Keep dynamic relocations for run-time function
2954 pointer initialization. */
2955
2956 if ((!h->non_got_ref
2957 || eh->func_pointer_refcount > 0
2958 || (h->root.type == bfd_link_hash_undefweak
2959 && !resolved_to_zero))
2960 && ((h->def_dynamic
2961 && !h->def_regular)
2962 || (htab->elf.dynamic_sections_created
2963 && (h->root.type == bfd_link_hash_undefweak
2964 || h->root.type == bfd_link_hash_undefined))))
2965 {
2966 /* Make sure this symbol is output as a dynamic symbol.
2967 Undefined weak syms won't yet be marked as dynamic. */
2968 if (h->dynindx == -1
2969 && ! h->forced_local
2970 && ! resolved_to_zero
2971 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2972 return FALSE;
2973
2974 /* If that succeeded, we know we'll be keeping all the
2975 relocs. */
2976 if (h->dynindx != -1)
2977 goto keep;
2978 }
2979
2980 eh->dyn_relocs = NULL;
2981 eh->func_pointer_refcount = 0;
2982
2983 keep: ;
2984 }
2985
2986 /* Finally, allocate space. */
2987 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2988 {
2989 asection * sreloc;
2990
2991 sreloc = elf_section_data (p->sec)->sreloc;
2992
2993 BFD_ASSERT (sreloc != NULL);
2994
2995 sreloc->size += p->count * bed->s->sizeof_rela;
2996 }
2997
2998 return TRUE;
2999 }
3000
3001 /* Allocate space in .plt, .got and associated reloc sections for
3002 local dynamic relocs. */
3003
3004 static bfd_boolean
3005 elf_x86_64_allocate_local_dynrelocs (void **slot, void *inf)
3006 {
3007 struct elf_link_hash_entry *h
3008 = (struct elf_link_hash_entry *) *slot;
3009
3010 if (h->type != STT_GNU_IFUNC
3011 || !h->def_regular
3012 || !h->ref_regular
3013 || !h->forced_local
3014 || h->root.type != bfd_link_hash_defined)
3015 abort ();
3016
3017 return elf_x86_64_allocate_dynrelocs (h, inf);
3018 }
3019
3020 /* Find any dynamic relocs that apply to read-only sections. */
3021
3022 static bfd_boolean
3023 elf_x86_64_readonly_dynrelocs (struct elf_link_hash_entry *h,
3024 void * inf)
3025 {
3026 struct elf_x86_64_link_hash_entry *eh;
3027 struct elf_dyn_relocs *p;
3028
3029 /* Skip local IFUNC symbols. */
3030 if (h->forced_local && h->type == STT_GNU_IFUNC)
3031 return TRUE;
3032
3033 eh = (struct elf_x86_64_link_hash_entry *) h;
3034 for (p = eh->dyn_relocs; p != NULL; p = p->next)
3035 {
3036 asection *s = p->sec->output_section;
3037
3038 if (s != NULL && (s->flags & SEC_READONLY) != 0)
3039 {
3040 struct bfd_link_info *info = (struct bfd_link_info *) inf;
3041
3042 info->flags |= DF_TEXTREL;
3043
3044 if ((info->warn_shared_textrel && bfd_link_pic (info))
3045 || info->error_textrel)
3046 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
3047 p->sec->owner, h->root.root.string,
3048 p->sec);
3049
3050 /* Not an error, just cut short the traversal. */
3051 return FALSE;
3052 }
3053 }
3054 return TRUE;
3055 }
3056
3057 /* With the local symbol, foo, we convert
3058 mov foo@GOTPCREL(%rip), %reg
3059 to
3060 lea foo(%rip), %reg
3061 and convert
3062 call/jmp *foo@GOTPCREL(%rip)
3063 to
3064 nop call foo/jmp foo nop
3065 When PIC is false, convert
3066 test %reg, foo@GOTPCREL(%rip)
3067 to
3068 test $foo, %reg
3069 and convert
3070 binop foo@GOTPCREL(%rip), %reg
3071 to
3072 binop $foo, %reg
3073 where binop is one of adc, add, and, cmp, or, sbb, sub, xor
3074 instructions. */
3075
3076 static bfd_boolean
3077 elf_x86_64_convert_load (bfd *abfd, asection *sec,
3078 struct bfd_link_info *link_info)
3079 {
3080 Elf_Internal_Shdr *symtab_hdr;
3081 Elf_Internal_Rela *internal_relocs;
3082 Elf_Internal_Rela *irel, *irelend;
3083 bfd_byte *contents;
3084 struct elf_x86_64_link_hash_table *htab;
3085 bfd_boolean changed_contents;
3086 bfd_boolean changed_relocs;
3087 bfd_signed_vma *local_got_refcounts;
3088 bfd_vma maxpagesize;
3089 bfd_boolean is_pic;
3090 bfd_boolean require_reloc_pc32;
3091
3092 /* Don't even try to convert non-ELF outputs. */
3093 if (!is_elf_hash_table (link_info->hash))
3094 return FALSE;
3095
3096 /* Nothing to do if there is no need or no output. */
3097 if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
3098 || sec->need_convert_load == 0
3099 || bfd_is_abs_section (sec->output_section))
3100 return TRUE;
3101
3102 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3103
3104 /* Load the relocations for this section. */
3105 internal_relocs = (_bfd_elf_link_read_relocs
3106 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
3107 link_info->keep_memory));
3108 if (internal_relocs == NULL)
3109 return FALSE;
3110
3111 htab = elf_x86_64_hash_table (link_info);
3112 changed_contents = FALSE;
3113 changed_relocs = FALSE;
3114 local_got_refcounts = elf_local_got_refcounts (abfd);
3115 maxpagesize = get_elf_backend_data (abfd)->maxpagesize;
3116
3117 /* Get the section contents. */
3118 if (elf_section_data (sec)->this_hdr.contents != NULL)
3119 contents = elf_section_data (sec)->this_hdr.contents;
3120 else
3121 {
3122 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
3123 goto error_return;
3124 }
3125
3126 is_pic = bfd_link_pic (link_info);
3127
3128 /* TRUE if we can convert only to R_X86_64_PC32. Enable it for
3129 --no-relax. */
3130 require_reloc_pc32
3131 = link_info->disable_target_specific_optimizations > 1;
3132
3133 irelend = internal_relocs + sec->reloc_count;
3134 for (irel = internal_relocs; irel < irelend; irel++)
3135 {
3136 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
3137 unsigned int r_symndx = htab->r_sym (irel->r_info);
3138 unsigned int indx;
3139 struct elf_link_hash_entry *h;
3140 asection *tsec;
3141 char symtype;
3142 bfd_vma toff, roff;
3143 bfd_signed_vma raddend;
3144 unsigned int opcode;
3145 unsigned int modrm;
3146 bfd_boolean relocx;
3147 bfd_boolean to_reloc_pc32;
3148
3149 relocx = (r_type == R_X86_64_GOTPCRELX
3150 || r_type == R_X86_64_REX_GOTPCRELX);
3151 if (!relocx && r_type != R_X86_64_GOTPCREL)
3152 continue;
3153
3154 roff = irel->r_offset;
3155 if (roff < (r_type == R_X86_64_REX_GOTPCRELX ? 3 : 2))
3156 continue;
3157
3158 raddend = irel->r_addend;
3159 /* Addend for 32-bit PC-relative relocation must be -4. */
3160 if (raddend != -4)
3161 continue;
3162
3163 opcode = bfd_get_8 (abfd, contents + roff - 2);
3164
3165 /* Convert mov to lea since it has been done for a while. */
3166 if (opcode != 0x8b)
3167 {
3168 /* Only convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX
3169 for call, jmp or one of adc, add, and, cmp, or, sbb, sub,
3170 test, xor instructions. */
3171 if (!relocx)
3172 continue;
3173 }
3174
3175 /* We convert only to R_X86_64_PC32:
3176 1. Branch.
3177 2. R_X86_64_GOTPCREL since we can't modify REX byte.
3178 3. require_reloc_pc32 is true.
3179 4. PIC.
3180 */
3181 to_reloc_pc32 = (opcode == 0xff
3182 || !relocx
3183 || require_reloc_pc32
3184 || is_pic);
3185
3186 /* Get the symbol referred to by the reloc. */
3187 if (r_symndx < symtab_hdr->sh_info)
3188 {
3189 Elf_Internal_Sym *isym;
3190
3191 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
3192 abfd, r_symndx);
3193
3194 symtype = ELF_ST_TYPE (isym->st_info);
3195
3196 /* STT_GNU_IFUNC must keep GOTPCREL relocations and skip
3197 relocation against undefined symbols. */
3198 if (symtype == STT_GNU_IFUNC || isym->st_shndx == SHN_UNDEF)
3199 continue;
3200
3201 if (isym->st_shndx == SHN_ABS)
3202 tsec = bfd_abs_section_ptr;
3203 else if (isym->st_shndx == SHN_COMMON)
3204 tsec = bfd_com_section_ptr;
3205 else if (isym->st_shndx == SHN_X86_64_LCOMMON)
3206 tsec = &_bfd_elf_large_com_section;
3207 else
3208 tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3209
3210 h = NULL;
3211 toff = isym->st_value;
3212 }
3213 else
3214 {
3215 indx = r_symndx - symtab_hdr->sh_info;
3216 h = elf_sym_hashes (abfd)[indx];
3217 BFD_ASSERT (h != NULL);
3218
3219 while (h->root.type == bfd_link_hash_indirect
3220 || h->root.type == bfd_link_hash_warning)
3221 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3222
3223 /* STT_GNU_IFUNC must keep GOTPCREL relocations. We also
3224 avoid optimizing GOTPCREL relocations againt _DYNAMIC
3225 since ld.so may use its link-time address. */
3226 if (h->type == STT_GNU_IFUNC)
3227 continue;
3228
3229 /* Undefined weak symbol is only bound locally in executable
3230 and its reference is resolved as 0 without relocation
3231 overflow. We can only perform this optimization for
3232 GOTPCRELX relocations since we need to modify REX byte.
3233 It is OK convert mov with R_X86_64_GOTPCREL to
3234 R_X86_64_PC32. */
3235 if ((relocx || opcode == 0x8b)
3236 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (link_info,
3237 elf_x86_64_hash_entry (h)))
3238 {
3239 if (opcode == 0xff)
3240 {
3241 /* Skip for branch instructions since R_X86_64_PC32
3242 may overflow. */
3243 if (require_reloc_pc32)
3244 continue;
3245 }
3246 else if (relocx)
3247 {
3248 /* For non-branch instructions, we can convert to
3249 R_X86_64_32/R_X86_64_32S since we know if there
3250 is a REX byte. */
3251 to_reloc_pc32 = FALSE;
3252 }
3253
3254 /* Since we don't know the current PC when PIC is true,
3255 we can't convert to R_X86_64_PC32. */
3256 if (to_reloc_pc32 && is_pic)
3257 continue;
3258
3259 goto convert;
3260 }
3261 else if ((h->def_regular
3262 || h->root.type == bfd_link_hash_defined
3263 || h->root.type == bfd_link_hash_defweak)
3264 && h != htab->elf.hdynamic
3265 && SYMBOL_REFERENCES_LOCAL (link_info, h))
3266 {
3267 /* bfd_link_hash_new or bfd_link_hash_undefined is
3268 set by an assignment in a linker script in
3269 bfd_elf_record_link_assignment. */
3270 if (h->def_regular
3271 && (h->root.type == bfd_link_hash_new
3272 || h->root.type == bfd_link_hash_undefined))
3273 {
3274 /* Skip since R_X86_64_32/R_X86_64_32S may overflow. */
3275 if (require_reloc_pc32)
3276 continue;
3277 goto convert;
3278 }
3279 tsec = h->root.u.def.section;
3280 toff = h->root.u.def.value;
3281 symtype = h->type;
3282 }
3283 else
3284 continue;
3285 }
3286
3287 /* We can only estimate relocation overflow for R_X86_64_PC32. */
3288 if (!to_reloc_pc32)
3289 goto convert;
3290
3291 if (tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
3292 {
3293 /* At this stage in linking, no SEC_MERGE symbol has been
3294 adjusted, so all references to such symbols need to be
3295 passed through _bfd_merged_section_offset. (Later, in
3296 relocate_section, all SEC_MERGE symbols *except* for
3297 section symbols have been adjusted.)
3298
3299 gas may reduce relocations against symbols in SEC_MERGE
3300 sections to a relocation against the section symbol when
3301 the original addend was zero. When the reloc is against
3302 a section symbol we should include the addend in the
3303 offset passed to _bfd_merged_section_offset, since the
3304 location of interest is the original symbol. On the
3305 other hand, an access to "sym+addend" where "sym" is not
3306 a section symbol should not include the addend; Such an
3307 access is presumed to be an offset from "sym"; The
3308 location of interest is just "sym". */
3309 if (symtype == STT_SECTION)
3310 toff += raddend;
3311
3312 toff = _bfd_merged_section_offset (abfd, &tsec,
3313 elf_section_data (tsec)->sec_info,
3314 toff);
3315
3316 if (symtype != STT_SECTION)
3317 toff += raddend;
3318 }
3319 else
3320 toff += raddend;
3321
3322 /* Don't convert if R_X86_64_PC32 relocation overflows. */
3323 if (tsec->output_section == sec->output_section)
3324 {
3325 if ((toff - roff + 0x80000000) > 0xffffffff)
3326 continue;
3327 }
3328 else
3329 {
3330 bfd_signed_vma distance;
3331
3332 /* At this point, we don't know the load addresses of TSEC
3333 section nor SEC section. We estimate the distrance between
3334 SEC and TSEC. We store the estimated distances in the
3335 compressed_size field of the output section, which is only
3336 used to decompress the compressed input section. */
3337 if (sec->output_section->compressed_size == 0)
3338 {
3339 asection *asect;
3340 bfd_size_type size = 0;
3341 for (asect = link_info->output_bfd->sections;
3342 asect != NULL;
3343 asect = asect->next)
3344 {
3345 asection *i;
3346 for (i = asect->map_head.s;
3347 i != NULL;
3348 i = i->map_head.s)
3349 {
3350 size = align_power (size, i->alignment_power);
3351 size += i->size;
3352 }
3353 asect->compressed_size = size;
3354 }
3355 }
3356
3357 /* Don't convert GOTPCREL relocations if TSEC isn't placed
3358 after SEC. */
3359 distance = (tsec->output_section->compressed_size
3360 - sec->output_section->compressed_size);
3361 if (distance < 0)
3362 continue;
3363
3364 /* Take PT_GNU_RELRO segment into account by adding
3365 maxpagesize. */
3366 if ((toff + distance + maxpagesize - roff + 0x80000000)
3367 > 0xffffffff)
3368 continue;
3369 }
3370
3371 convert:
3372 if (opcode == 0xff)
3373 {
3374 /* We have "call/jmp *foo@GOTPCREL(%rip)". */
3375 unsigned int nop;
3376 unsigned int disp;
3377 bfd_vma nop_offset;
3378
3379 /* Convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX to
3380 R_X86_64_PC32. */
3381 modrm = bfd_get_8 (abfd, contents + roff - 1);
3382 if (modrm == 0x25)
3383 {
3384 /* Convert to "jmp foo nop". */
3385 modrm = 0xe9;
3386 nop = NOP_OPCODE;
3387 nop_offset = irel->r_offset + 3;
3388 disp = bfd_get_32 (abfd, contents + irel->r_offset);
3389 irel->r_offset -= 1;
3390 bfd_put_32 (abfd, disp, contents + irel->r_offset);
3391 }
3392 else
3393 {
3394 /* Convert to "nop call foo". ADDR_PREFIX_OPCODE
3395 is a nop prefix. */
3396 modrm = 0xe8;
3397 nop = link_info->call_nop_byte;
3398 if (link_info->call_nop_as_suffix)
3399 {
3400 nop_offset = irel->r_offset + 3;
3401 disp = bfd_get_32 (abfd, contents + irel->r_offset);
3402 irel->r_offset -= 1;
3403 bfd_put_32 (abfd, disp, contents + irel->r_offset);
3404 }
3405 else
3406 nop_offset = irel->r_offset - 2;
3407 }
3408 bfd_put_8 (abfd, nop, contents + nop_offset);
3409 bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
3410 r_type = R_X86_64_PC32;
3411 }
3412 else
3413 {
3414 unsigned int rex;
3415 unsigned int rex_mask = REX_R;
3416
3417 if (r_type == R_X86_64_REX_GOTPCRELX)
3418 rex = bfd_get_8 (abfd, contents + roff - 3);
3419 else
3420 rex = 0;
3421
3422 if (opcode == 0x8b)
3423 {
3424 if (to_reloc_pc32)
3425 {
3426 /* Convert "mov foo@GOTPCREL(%rip), %reg" to
3427 "lea foo(%rip), %reg". */
3428 opcode = 0x8d;
3429 r_type = R_X86_64_PC32;
3430 }
3431 else
3432 {
3433 /* Convert "mov foo@GOTPCREL(%rip), %reg" to
3434 "mov $foo, %reg". */
3435 opcode = 0xc7;
3436 modrm = bfd_get_8 (abfd, contents + roff - 1);
3437 modrm = 0xc0 | (modrm & 0x38) >> 3;
3438 if ((rex & REX_W) != 0
3439 && ABI_64_P (link_info->output_bfd))
3440 {
3441 /* Keep the REX_W bit in REX byte for LP64. */
3442 r_type = R_X86_64_32S;
3443 goto rewrite_modrm_rex;
3444 }
3445 else
3446 {
3447 /* If the REX_W bit in REX byte isn't needed,
3448 use R_X86_64_32 and clear the W bit to avoid
3449 sign-extend imm32 to imm64. */
3450 r_type = R_X86_64_32;
3451 /* Clear the W bit in REX byte. */
3452 rex_mask |= REX_W;
3453 goto rewrite_modrm_rex;
3454 }
3455 }
3456 }
3457 else
3458 {
3459 /* R_X86_64_PC32 isn't supported. */
3460 if (to_reloc_pc32)
3461 continue;
3462
3463 modrm = bfd_get_8 (abfd, contents + roff - 1);
3464 if (opcode == 0x85)
3465 {
3466 /* Convert "test %reg, foo@GOTPCREL(%rip)" to
3467 "test $foo, %reg". */
3468 modrm = 0xc0 | (modrm & 0x38) >> 3;
3469 opcode = 0xf7;
3470 }
3471 else
3472 {
3473 /* Convert "binop foo@GOTPCREL(%rip), %reg" to
3474 "binop $foo, %reg". */
3475 modrm = 0xc0 | (modrm & 0x38) >> 3 | (opcode & 0x3c);
3476 opcode = 0x81;
3477 }
3478
3479 /* Use R_X86_64_32 with 32-bit operand to avoid relocation
3480 overflow when sign-extending imm32 to imm64. */
3481 r_type = (rex & REX_W) != 0 ? R_X86_64_32S : R_X86_64_32;
3482
3483 rewrite_modrm_rex:
3484 bfd_put_8 (abfd, modrm, contents + roff - 1);
3485
3486 if (rex)
3487 {
3488 /* Move the R bit to the B bit in REX byte. */
3489 rex = (rex & ~rex_mask) | (rex & REX_R) >> 2;
3490 bfd_put_8 (abfd, rex, contents + roff - 3);
3491 }
3492
3493 /* No addend for R_X86_64_32/R_X86_64_32S relocations. */
3494 irel->r_addend = 0;
3495 }
3496
3497 bfd_put_8 (abfd, opcode, contents + roff - 2);
3498 }
3499
3500 irel->r_info = htab->r_info (r_symndx, r_type);
3501 changed_contents = TRUE;
3502 changed_relocs = TRUE;
3503
3504 if (h)
3505 {
3506 if (h->got.refcount > 0)
3507 h->got.refcount -= 1;
3508 }
3509 else
3510 {
3511 if (local_got_refcounts != NULL
3512 && local_got_refcounts[r_symndx] > 0)
3513 local_got_refcounts[r_symndx] -= 1;
3514 }
3515 }
3516
3517 if (contents != NULL
3518 && elf_section_data (sec)->this_hdr.contents != contents)
3519 {
3520 if (!changed_contents && !link_info->keep_memory)
3521 free (contents);
3522 else
3523 {
3524 /* Cache the section contents for elf_link_input_bfd. */
3525 elf_section_data (sec)->this_hdr.contents = contents;
3526 }
3527 }
3528
3529 if (elf_section_data (sec)->relocs != internal_relocs)
3530 {
3531 if (!changed_relocs)
3532 free (internal_relocs);
3533 else
3534 elf_section_data (sec)->relocs = internal_relocs;
3535 }
3536
3537 return TRUE;
3538
3539 error_return:
3540 if (contents != NULL
3541 && elf_section_data (sec)->this_hdr.contents != contents)
3542 free (contents);
3543 if (internal_relocs != NULL
3544 && elf_section_data (sec)->relocs != internal_relocs)
3545 free (internal_relocs);
3546 return FALSE;
3547 }
3548
3549 /* Set the sizes of the dynamic sections. */
3550
3551 static bfd_boolean
3552 elf_x86_64_size_dynamic_sections (bfd *output_bfd,
3553 struct bfd_link_info *info)
3554 {
3555 struct elf_x86_64_link_hash_table *htab;
3556 bfd *dynobj;
3557 asection *s;
3558 bfd_boolean relocs;
3559 bfd *ibfd;
3560 const struct elf_backend_data *bed;
3561
3562 htab = elf_x86_64_hash_table (info);
3563 if (htab == NULL)
3564 return FALSE;
3565 bed = get_elf_backend_data (output_bfd);
3566
3567 dynobj = htab->elf.dynobj;
3568 if (dynobj == NULL)
3569 abort ();
3570
3571 if (htab->elf.dynamic_sections_created)
3572 {
3573 /* Set the contents of the .interp section to the interpreter. */
3574 if (bfd_link_executable (info) && !info->nointerp)
3575 {
3576 s = bfd_get_linker_section (dynobj, ".interp");
3577 if (s == NULL)
3578 abort ();
3579 s->size = htab->dynamic_interpreter_size;
3580 s->contents = (unsigned char *) htab->dynamic_interpreter;
3581 htab->interp = s;
3582 }
3583 }
3584
3585 /* Set up .got offsets for local syms, and space for local dynamic
3586 relocs. */
3587 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3588 {
3589 bfd_signed_vma *local_got;
3590 bfd_signed_vma *end_local_got;
3591 char *local_tls_type;
3592 bfd_vma *local_tlsdesc_gotent;
3593 bfd_size_type locsymcount;
3594 Elf_Internal_Shdr *symtab_hdr;
3595 asection *srel;
3596
3597 if (! is_x86_64_elf (ibfd))
3598 continue;
3599
3600 for (s = ibfd->sections; s != NULL; s = s->next)
3601 {
3602 struct elf_dyn_relocs *p;
3603
3604 if (!elf_x86_64_convert_load (ibfd, s, info))
3605 return FALSE;
3606
3607 for (p = (struct elf_dyn_relocs *)
3608 (elf_section_data (s)->local_dynrel);
3609 p != NULL;
3610 p = p->next)
3611 {
3612 if (!bfd_is_abs_section (p->sec)
3613 && bfd_is_abs_section (p->sec->output_section))
3614 {
3615 /* Input section has been discarded, either because
3616 it is a copy of a linkonce section or due to
3617 linker script /DISCARD/, so we'll be discarding
3618 the relocs too. */
3619 }
3620 else if (p->count != 0)
3621 {
3622 srel = elf_section_data (p->sec)->sreloc;
3623 srel->size += p->count * bed->s->sizeof_rela;
3624 if ((p->sec->output_section->flags & SEC_READONLY) != 0
3625 && (info->flags & DF_TEXTREL) == 0)
3626 {
3627 info->flags |= DF_TEXTREL;
3628 if ((info->warn_shared_textrel && bfd_link_pic (info))
3629 || info->error_textrel)
3630 info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"),
3631 p->sec->owner, p->sec);
3632 }
3633 }
3634 }
3635 }
3636
3637 local_got = elf_local_got_refcounts (ibfd);
3638 if (!local_got)
3639 continue;
3640
3641 symtab_hdr = &elf_symtab_hdr (ibfd);
3642 locsymcount = symtab_hdr->sh_info;
3643 end_local_got = local_got + locsymcount;
3644 local_tls_type = elf_x86_64_local_got_tls_type (ibfd);
3645 local_tlsdesc_gotent = elf_x86_64_local_tlsdesc_gotent (ibfd);
3646 s = htab->elf.sgot;
3647 srel = htab->elf.srelgot;
3648 for (; local_got < end_local_got;
3649 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
3650 {
3651 *local_tlsdesc_gotent = (bfd_vma) -1;
3652 if (*local_got > 0)
3653 {
3654 if (GOT_TLS_GDESC_P (*local_tls_type))
3655 {
3656 *local_tlsdesc_gotent = htab->elf.sgotplt->size
3657 - elf_x86_64_compute_jump_table_size (htab);
3658 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE;
3659 *local_got = (bfd_vma) -2;
3660 }
3661 if (! GOT_TLS_GDESC_P (*local_tls_type)
3662 || GOT_TLS_GD_P (*local_tls_type))
3663 {
3664 *local_got = s->size;
3665 s->size += GOT_ENTRY_SIZE;
3666 if (GOT_TLS_GD_P (*local_tls_type))
3667 s->size += GOT_ENTRY_SIZE;
3668 }
3669 if (bfd_link_pic (info)
3670 || GOT_TLS_GD_ANY_P (*local_tls_type)
3671 || *local_tls_type == GOT_TLS_IE)
3672 {
3673 if (GOT_TLS_GDESC_P (*local_tls_type))
3674 {
3675 htab->elf.srelplt->size
3676 += bed->s->sizeof_rela;
3677 htab->tlsdesc_plt = (bfd_vma) -1;
3678 }
3679 if (! GOT_TLS_GDESC_P (*local_tls_type)
3680 || GOT_TLS_GD_P (*local_tls_type))
3681 srel->size += bed->s->sizeof_rela;
3682 }
3683 }
3684 else
3685 *local_got = (bfd_vma) -1;
3686 }
3687 }
3688
3689 if (htab->tls_ld_got.refcount > 0)
3690 {
3691 /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
3692 relocs. */
3693 htab->tls_ld_got.offset = htab->elf.sgot->size;
3694 htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE;
3695 htab->elf.srelgot->size += bed->s->sizeof_rela;
3696 }
3697 else
3698 htab->tls_ld_got.offset = -1;
3699
3700 /* Allocate global sym .plt and .got entries, and space for global
3701 sym dynamic relocs. */
3702 elf_link_hash_traverse (&htab->elf, elf_x86_64_allocate_dynrelocs,
3703 info);
3704
3705 /* Allocate .plt and .got entries, and space for local symbols. */
3706 htab_traverse (htab->loc_hash_table,
3707 elf_x86_64_allocate_local_dynrelocs,
3708 info);
3709
3710 /* For every jump slot reserved in the sgotplt, reloc_count is
3711 incremented. However, when we reserve space for TLS descriptors,
3712 it's not incremented, so in order to compute the space reserved
3713 for them, it suffices to multiply the reloc count by the jump
3714 slot size.
3715
3716 PR ld/13302: We start next_irelative_index at the end of .rela.plt
3717 so that R_X86_64_IRELATIVE entries come last. */
3718 if (htab->elf.srelplt)
3719 {
3720 htab->sgotplt_jump_table_size
3721 = elf_x86_64_compute_jump_table_size (htab);
3722 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
3723 }
3724 else if (htab->elf.irelplt)
3725 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
3726
3727 if (htab->tlsdesc_plt)
3728 {
3729 /* If we're not using lazy TLS relocations, don't generate the
3730 PLT and GOT entries they require. */
3731 if ((info->flags & DF_BIND_NOW))
3732 htab->tlsdesc_plt = 0;
3733 else
3734 {
3735 htab->tlsdesc_got = htab->elf.sgot->size;
3736 htab->elf.sgot->size += GOT_ENTRY_SIZE;
3737 /* Reserve room for the initial entry.
3738 FIXME: we could probably do away with it in this case. */
3739 if (htab->elf.splt->size == 0)
3740 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
3741 htab->tlsdesc_plt = htab->elf.splt->size;
3742 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd);
3743 }
3744 }
3745
3746 if (htab->elf.sgotplt)
3747 {
3748 /* Don't allocate .got.plt section if there are no GOT nor PLT
3749 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
3750 if ((htab->elf.hgot == NULL
3751 || !htab->elf.hgot->ref_regular_nonweak)
3752 && (htab->elf.sgotplt->size
3753 == get_elf_backend_data (output_bfd)->got_header_size)
3754 && (htab->elf.splt == NULL
3755 || htab->elf.splt->size == 0)
3756 && (htab->elf.sgot == NULL
3757 || htab->elf.sgot->size == 0)
3758 && (htab->elf.iplt == NULL
3759 || htab->elf.iplt->size == 0)
3760 && (htab->elf.igotplt == NULL
3761 || htab->elf.igotplt->size == 0))
3762 htab->elf.sgotplt->size = 0;
3763 }
3764
3765 if (htab->plt_eh_frame != NULL
3766 && htab->elf.splt != NULL
3767 && htab->elf.splt->size != 0
3768 && !bfd_is_abs_section (htab->elf.splt->output_section)
3769 && _bfd_elf_eh_frame_present (info))
3770 {
3771 const struct elf_x86_64_backend_data *arch_data
3772 = get_elf_x86_64_arch_data (bed);
3773 htab->plt_eh_frame->size = arch_data->eh_frame_plt_size;
3774 }
3775
3776 /* We now have determined the sizes of the various dynamic sections.
3777 Allocate memory for them. */
3778 relocs = FALSE;
3779 for (s = dynobj->sections; s != NULL; s = s->next)
3780 {
3781 if ((s->flags & SEC_LINKER_CREATED) == 0)
3782 continue;
3783
3784 if (s == htab->elf.splt
3785 || s == htab->elf.sgot
3786 || s == htab->elf.sgotplt
3787 || s == htab->elf.iplt
3788 || s == htab->elf.igotplt
3789 || s == htab->plt_bnd
3790 || s == htab->plt_got
3791 || s == htab->plt_eh_frame
3792 || s == htab->sdynbss)
3793 {
3794 /* Strip this section if we don't need it; see the
3795 comment below. */
3796 }
3797 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
3798 {
3799 if (s->size != 0 && s != htab->elf.srelplt)
3800 relocs = TRUE;
3801
3802 /* We use the reloc_count field as a counter if we need
3803 to copy relocs into the output file. */
3804 if (s != htab->elf.srelplt)
3805 s->reloc_count = 0;
3806 }
3807 else
3808 {
3809 /* It's not one of our sections, so don't allocate space. */
3810 continue;
3811 }
3812
3813 if (s->size == 0)
3814 {
3815 /* If we don't need this section, strip it from the
3816 output file. This is mostly to handle .rela.bss and
3817 .rela.plt. We must create both sections in
3818 create_dynamic_sections, because they must be created
3819 before the linker maps input sections to output
3820 sections. The linker does that before
3821 adjust_dynamic_symbol is called, and it is that
3822 function which decides whether anything needs to go
3823 into these sections. */
3824
3825 s->flags |= SEC_EXCLUDE;
3826 continue;
3827 }
3828
3829 if ((s->flags & SEC_HAS_CONTENTS) == 0)
3830 continue;
3831
3832 /* Allocate memory for the section contents. We use bfd_zalloc
3833 here in case unused entries are not reclaimed before the
3834 section's contents are written out. This should not happen,
3835 but this way if it does, we get a R_X86_64_NONE reloc instead
3836 of garbage. */
3837 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
3838 if (s->contents == NULL)
3839 return FALSE;
3840 }
3841
3842 if (htab->plt_eh_frame != NULL
3843 && htab->plt_eh_frame->contents != NULL)
3844 {
3845 const struct elf_x86_64_backend_data *arch_data
3846 = get_elf_x86_64_arch_data (bed);
3847
3848 memcpy (htab->plt_eh_frame->contents,
3849 arch_data->eh_frame_plt, htab->plt_eh_frame->size);
3850 bfd_put_32 (dynobj, htab->elf.splt->size,
3851 htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
3852 }
3853
3854 if (htab->elf.dynamic_sections_created)
3855 {
3856 /* Add some entries to the .dynamic section. We fill in the
3857 values later, in elf_x86_64_finish_dynamic_sections, but we
3858 must add the entries now so that we get the correct size for
3859 the .dynamic section. The DT_DEBUG entry is filled in by the
3860 dynamic linker and used by the debugger. */
3861 #define add_dynamic_entry(TAG, VAL) \
3862 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3863
3864 if (bfd_link_executable (info))
3865 {
3866 if (!add_dynamic_entry (DT_DEBUG, 0))
3867 return FALSE;
3868 }
3869
3870 if (htab->elf.splt->size != 0)
3871 {
3872 /* DT_PLTGOT is used by prelink even if there is no PLT
3873 relocation. */
3874 if (!add_dynamic_entry (DT_PLTGOT, 0))
3875 return FALSE;
3876
3877 if (htab->elf.srelplt->size != 0)
3878 {
3879 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
3880 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3881 || !add_dynamic_entry (DT_JMPREL, 0))
3882 return FALSE;
3883 }
3884
3885 if (htab->tlsdesc_plt
3886 && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
3887 || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
3888 return FALSE;
3889 }
3890
3891 if (relocs)
3892 {
3893 if (!add_dynamic_entry (DT_RELA, 0)
3894 || !add_dynamic_entry (DT_RELASZ, 0)
3895 || !add_dynamic_entry (DT_RELAENT, bed->s->sizeof_rela))
3896 return FALSE;
3897
3898 /* If any dynamic relocs apply to a read-only section,
3899 then we need a DT_TEXTREL entry. */
3900 if ((info->flags & DF_TEXTREL) == 0)
3901 elf_link_hash_traverse (&htab->elf,
3902 elf_x86_64_readonly_dynrelocs,
3903 info);
3904
3905 if ((info->flags & DF_TEXTREL) != 0)
3906 {
3907 if (htab->readonly_dynrelocs_against_ifunc)
3908 {
3909 info->callbacks->einfo
3910 (_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n"));
3911 bfd_set_error (bfd_error_bad_value);
3912 return FALSE;
3913 }
3914
3915 if (!add_dynamic_entry (DT_TEXTREL, 0))
3916 return FALSE;
3917 }
3918 }
3919 }
3920 #undef add_dynamic_entry
3921
3922 return TRUE;
3923 }
3924
3925 static bfd_boolean
3926 elf_x86_64_always_size_sections (bfd *output_bfd,
3927 struct bfd_link_info *info)
3928 {
3929 asection *tls_sec = elf_hash_table (info)->tls_sec;
3930
3931 if (tls_sec)
3932 {
3933 struct elf_link_hash_entry *tlsbase;
3934
3935 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3936 "_TLS_MODULE_BASE_",
3937 FALSE, FALSE, FALSE);
3938
3939 if (tlsbase && tlsbase->type == STT_TLS)
3940 {
3941 struct elf_x86_64_link_hash_table *htab;
3942 struct bfd_link_hash_entry *bh = NULL;
3943 const struct elf_backend_data *bed
3944 = get_elf_backend_data (output_bfd);
3945
3946 htab = elf_x86_64_hash_table (info);
3947 if (htab == NULL)
3948 return FALSE;
3949
3950 if (!(_bfd_generic_link_add_one_symbol
3951 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3952 tls_sec, 0, NULL, FALSE,
3953 bed->collect, &bh)))
3954 return FALSE;
3955
3956 htab->tls_module_base = bh;
3957
3958 tlsbase = (struct elf_link_hash_entry *)bh;
3959 tlsbase->def_regular = 1;
3960 tlsbase->other = STV_HIDDEN;
3961 tlsbase->root.linker_def = 1;
3962 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3963 }
3964 }
3965
3966 return TRUE;
3967 }
3968
3969 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3970 executables. Rather than setting it to the beginning of the TLS
3971 section, we have to set it to the end. This function may be called
3972 multiple times, it is idempotent. */
3973
3974 static void
3975 elf_x86_64_set_tls_module_base (struct bfd_link_info *info)
3976 {
3977 struct elf_x86_64_link_hash_table *htab;
3978 struct bfd_link_hash_entry *base;
3979
3980 if (!bfd_link_executable (info))
3981 return;
3982
3983 htab = elf_x86_64_hash_table (info);
3984 if (htab == NULL)
3985 return;
3986
3987 base = htab->tls_module_base;
3988 if (base == NULL)
3989 return;
3990
3991 base->u.def.value = htab->elf.tls_size;
3992 }
3993
3994 /* Return the base VMA address which should be subtracted from real addresses
3995 when resolving @dtpoff relocation.
3996 This is PT_TLS segment p_vaddr. */
3997
3998 static bfd_vma
3999 elf_x86_64_dtpoff_base (struct bfd_link_info *info)
4000 {
4001 /* If tls_sec is NULL, we should have signalled an error already. */
4002 if (elf_hash_table (info)->tls_sec == NULL)
4003 return 0;
4004 return elf_hash_table (info)->tls_sec->vma;
4005 }
4006
4007 /* Return the relocation value for @tpoff relocation
4008 if STT_TLS virtual address is ADDRESS. */
4009
4010 static bfd_vma
4011 elf_x86_64_tpoff (struct bfd_link_info *info, bfd_vma address)
4012 {
4013 struct elf_link_hash_table *htab = elf_hash_table (info);
4014 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
4015 bfd_vma static_tls_size;
4016
4017 /* If tls_segment is NULL, we should have signalled an error already. */
4018 if (htab->tls_sec == NULL)
4019 return 0;
4020
4021 /* Consider special static TLS alignment requirements. */
4022 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
4023 return address - static_tls_size - htab->tls_sec->vma;
4024 }
4025
4026 /* Is the instruction before OFFSET in CONTENTS a 32bit relative
4027 branch? */
4028
4029 static bfd_boolean
4030 is_32bit_relative_branch (bfd_byte *contents, bfd_vma offset)
4031 {
4032 /* Opcode Instruction
4033 0xe8 call
4034 0xe9 jump
4035 0x0f 0x8x conditional jump */
4036 return ((offset > 0
4037 && (contents [offset - 1] == 0xe8
4038 || contents [offset - 1] == 0xe9))
4039 || (offset > 1
4040 && contents [offset - 2] == 0x0f
4041 && (contents [offset - 1] & 0xf0) == 0x80));
4042 }
4043
4044 static bfd_boolean
4045 elf_x86_64_need_pic (bfd *input_bfd, struct elf_link_hash_entry *h,
4046 reloc_howto_type *howto)
4047 {
4048 const char *fmt;
4049 const char *v;
4050 const char *pic = "";
4051
4052 switch (ELF_ST_VISIBILITY (h->other))
4053 {
4054 case STV_HIDDEN:
4055 v = _("hidden symbol");
4056 break;
4057 case STV_INTERNAL:
4058 v = _("internal symbol");
4059 break;
4060 case STV_PROTECTED:
4061 v = _("protected symbol");
4062 break;
4063 default:
4064 v = _("symbol");
4065 pic = _("; recompile with -fPIC");
4066 break;
4067 }
4068
4069 if (h->def_regular)
4070 fmt = _("%B: relocation %s against %s `%s' can not be used when making a shared object%s");
4071 else
4072 fmt = _("%B: relocation %s against undefined %s `%s' can not be used when making a shared object%s");
4073
4074 (*_bfd_error_handler) (fmt, input_bfd, howto->name,
4075 v, h->root.root.string, pic);
4076 bfd_set_error (bfd_error_bad_value);
4077 return FALSE;
4078 }
4079
4080 /* Relocate an x86_64 ELF section. */
4081
4082 static bfd_boolean
4083 elf_x86_64_relocate_section (bfd *output_bfd,
4084 struct bfd_link_info *info,
4085 bfd *input_bfd,
4086 asection *input_section,
4087 bfd_byte *contents,
4088 Elf_Internal_Rela *relocs,
4089 Elf_Internal_Sym *local_syms,
4090 asection **local_sections)
4091 {
4092 struct elf_x86_64_link_hash_table *htab;
4093 Elf_Internal_Shdr *symtab_hdr;
4094 struct elf_link_hash_entry **sym_hashes;
4095 bfd_vma *local_got_offsets;
4096 bfd_vma *local_tlsdesc_gotents;
4097 Elf_Internal_Rela *rel;
4098 Elf_Internal_Rela *wrel;
4099 Elf_Internal_Rela *relend;
4100 const unsigned int plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
4101
4102 BFD_ASSERT (is_x86_64_elf (input_bfd));
4103
4104 htab = elf_x86_64_hash_table (info);
4105 if (htab == NULL)
4106 return FALSE;
4107 symtab_hdr = &elf_symtab_hdr (input_bfd);
4108 sym_hashes = elf_sym_hashes (input_bfd);
4109 local_got_offsets = elf_local_got_offsets (input_bfd);
4110 local_tlsdesc_gotents = elf_x86_64_local_tlsdesc_gotent (input_bfd);
4111
4112 elf_x86_64_set_tls_module_base (info);
4113
4114 rel = wrel = relocs;
4115 relend = relocs + input_section->reloc_count;
4116 for (; rel < relend; wrel++, rel++)
4117 {
4118 unsigned int r_type;
4119 reloc_howto_type *howto;
4120 unsigned long r_symndx;
4121 struct elf_link_hash_entry *h;
4122 struct elf_x86_64_link_hash_entry *eh;
4123 Elf_Internal_Sym *sym;
4124 asection *sec;
4125 bfd_vma off, offplt, plt_offset;
4126 bfd_vma relocation;
4127 bfd_boolean unresolved_reloc;
4128 bfd_reloc_status_type r;
4129 int tls_type;
4130 asection *base_got, *resolved_plt;
4131 bfd_vma st_size;
4132 bfd_boolean resolved_to_zero;
4133
4134 r_type = ELF32_R_TYPE (rel->r_info);
4135 if (r_type == (int) R_X86_64_GNU_VTINHERIT
4136 || r_type == (int) R_X86_64_GNU_VTENTRY)
4137 {
4138 if (wrel != rel)
4139 *wrel = *rel;
4140 continue;
4141 }
4142
4143 if (r_type >= (int) R_X86_64_standard)
4144 {
4145 (*_bfd_error_handler)
4146 (_("%B: unrecognized relocation (0x%x) in section `%A'"),
4147 input_bfd, input_section, r_type);
4148 bfd_set_error (bfd_error_bad_value);
4149 return FALSE;
4150 }
4151
4152 if (r_type != (int) R_X86_64_32
4153 || ABI_64_P (output_bfd))
4154 howto = x86_64_elf_howto_table + r_type;
4155 else
4156 howto = (x86_64_elf_howto_table
4157 + ARRAY_SIZE (x86_64_elf_howto_table) - 1);
4158 r_symndx = htab->r_sym (rel->r_info);
4159 h = NULL;
4160 sym = NULL;
4161 sec = NULL;
4162 unresolved_reloc = FALSE;
4163 if (r_symndx < symtab_hdr->sh_info)
4164 {
4165 sym = local_syms + r_symndx;
4166 sec = local_sections[r_symndx];
4167
4168 relocation = _bfd_elf_rela_local_sym (output_bfd, sym,
4169 &sec, rel);
4170 st_size = sym->st_size;
4171
4172 /* Relocate against local STT_GNU_IFUNC symbol. */
4173 if (!bfd_link_relocatable (info)
4174 && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
4175 {
4176 h = elf_x86_64_get_local_sym_hash (htab, input_bfd,
4177 rel, FALSE);
4178 if (h == NULL)
4179 abort ();
4180
4181 /* Set STT_GNU_IFUNC symbol value. */
4182 h->root.u.def.value = sym->st_value;
4183 h->root.u.def.section = sec;
4184 }
4185 }
4186 else
4187 {
4188 bfd_boolean warned ATTRIBUTE_UNUSED;
4189 bfd_boolean ignored ATTRIBUTE_UNUSED;
4190
4191 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4192 r_symndx, symtab_hdr, sym_hashes,
4193 h, sec, relocation,
4194 unresolved_reloc, warned, ignored);
4195 st_size = h->size;
4196 }
4197
4198 if (sec != NULL && discarded_section (sec))
4199 {
4200 _bfd_clear_contents (howto, input_bfd, input_section,
4201 contents + rel->r_offset);
4202 wrel->r_offset = rel->r_offset;
4203 wrel->r_info = 0;
4204 wrel->r_addend = 0;
4205
4206 /* For ld -r, remove relocations in debug sections against
4207 sections defined in discarded sections. Not done for
4208 eh_frame editing code expects to be present. */
4209 if (bfd_link_relocatable (info)
4210 && (input_section->flags & SEC_DEBUGGING))
4211 wrel--;
4212
4213 continue;
4214 }
4215
4216 if (bfd_link_relocatable (info))
4217 {
4218 if (wrel != rel)
4219 *wrel = *rel;
4220 continue;
4221 }
4222
4223 if (rel->r_addend == 0 && !ABI_64_P (output_bfd))
4224 {
4225 if (r_type == R_X86_64_64)
4226 {
4227 /* For x32, treat R_X86_64_64 like R_X86_64_32 and
4228 zero-extend it to 64bit if addend is zero. */
4229 r_type = R_X86_64_32;
4230 memset (contents + rel->r_offset + 4, 0, 4);
4231 }
4232 else if (r_type == R_X86_64_SIZE64)
4233 {
4234 /* For x32, treat R_X86_64_SIZE64 like R_X86_64_SIZE32 and
4235 zero-extend it to 64bit if addend is zero. */
4236 r_type = R_X86_64_SIZE32;
4237 memset (contents + rel->r_offset + 4, 0, 4);
4238 }
4239 }
4240
4241 eh = (struct elf_x86_64_link_hash_entry *) h;
4242
4243 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
4244 it here if it is defined in a non-shared object. */
4245 if (h != NULL
4246 && h->type == STT_GNU_IFUNC
4247 && h->def_regular)
4248 {
4249 bfd_vma plt_index;
4250 const char *name;
4251
4252 if ((input_section->flags & SEC_ALLOC) == 0)
4253 {
4254 /* Dynamic relocs are not propagated for SEC_DEBUGGING
4255 sections because such sections are not SEC_ALLOC and
4256 thus ld.so will not process them. */
4257 if ((input_section->flags & SEC_DEBUGGING) != 0)
4258 continue;
4259 abort ();
4260 }
4261 else if (h->plt.offset == (bfd_vma) -1)
4262 abort ();
4263
4264 /* STT_GNU_IFUNC symbol must go through PLT. */
4265 if (htab->elf.splt != NULL)
4266 {
4267 if (htab->plt_bnd != NULL)
4268 {
4269 resolved_plt = htab->plt_bnd;
4270 plt_offset = eh->plt_bnd.offset;
4271 }
4272 else
4273 {
4274 resolved_plt = htab->elf.splt;
4275 plt_offset = h->plt.offset;
4276 }
4277 }
4278 else
4279 {
4280 resolved_plt = htab->elf.iplt;
4281 plt_offset = h->plt.offset;
4282 }
4283
4284 relocation = (resolved_plt->output_section->vma
4285 + resolved_plt->output_offset + plt_offset);
4286
4287 switch (r_type)
4288 {
4289 default:
4290 if (h->root.root.string)
4291 name = h->root.root.string;
4292 else
4293 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
4294 NULL);
4295 (*_bfd_error_handler)
4296 (_("%B: relocation %s against STT_GNU_IFUNC "
4297 "symbol `%s' isn't handled by %s"), input_bfd,
4298 howto->name, name, __FUNCTION__);
4299 bfd_set_error (bfd_error_bad_value);
4300 return FALSE;
4301
4302 case R_X86_64_32S:
4303 if (bfd_link_pic (info))
4304 abort ();
4305 goto do_relocation;
4306
4307 case R_X86_64_32:
4308 if (ABI_64_P (output_bfd))
4309 goto do_relocation;
4310 /* FALLTHROUGH */
4311 case R_X86_64_64:
4312 if (rel->r_addend != 0)
4313 {
4314 if (h->root.root.string)
4315 name = h->root.root.string;
4316 else
4317 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
4318 sym, NULL);
4319 (*_bfd_error_handler)
4320 (_("%B: relocation %s against STT_GNU_IFUNC "
4321 "symbol `%s' has non-zero addend: %d"),
4322 input_bfd, howto->name, name, rel->r_addend);
4323 bfd_set_error (bfd_error_bad_value);
4324 return FALSE;
4325 }
4326
4327 /* Generate dynamic relcoation only when there is a
4328 non-GOT reference in a shared object. */
4329 if (bfd_link_pic (info) && h->non_got_ref)
4330 {
4331 Elf_Internal_Rela outrel;
4332 asection *sreloc;
4333
4334 /* Need a dynamic relocation to get the real function
4335 address. */
4336 outrel.r_offset = _bfd_elf_section_offset (output_bfd,
4337 info,
4338 input_section,
4339 rel->r_offset);
4340 if (outrel.r_offset == (bfd_vma) -1
4341 || outrel.r_offset == (bfd_vma) -2)
4342 abort ();
4343
4344 outrel.r_offset += (input_section->output_section->vma
4345 + input_section->output_offset);
4346
4347 if (h->dynindx == -1
4348 || h->forced_local
4349 || bfd_link_executable (info))
4350 {
4351 /* This symbol is resolved locally. */
4352 outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
4353 outrel.r_addend = (h->root.u.def.value
4354 + h->root.u.def.section->output_section->vma
4355 + h->root.u.def.section->output_offset);
4356 }
4357 else
4358 {
4359 outrel.r_info = htab->r_info (h->dynindx, r_type);
4360 outrel.r_addend = 0;
4361 }
4362
4363 sreloc = htab->elf.irelifunc;
4364 elf_append_rela (output_bfd, sreloc, &outrel);
4365
4366 /* If this reloc is against an external symbol, we
4367 do not want to fiddle with the addend. Otherwise,
4368 we need to include the symbol value so that it
4369 becomes an addend for the dynamic reloc. For an
4370 internal symbol, we have updated addend. */
4371 continue;
4372 }
4373 /* FALLTHROUGH */
4374 case R_X86_64_PC32:
4375 case R_X86_64_PC32_BND:
4376 case R_X86_64_PC64:
4377 case R_X86_64_PLT32:
4378 case R_X86_64_PLT32_BND:
4379 goto do_relocation;
4380
4381 case R_X86_64_GOTPCREL:
4382 case R_X86_64_GOTPCRELX:
4383 case R_X86_64_REX_GOTPCRELX:
4384 case R_X86_64_GOTPCREL64:
4385 base_got = htab->elf.sgot;
4386 off = h->got.offset;
4387
4388 if (base_got == NULL)
4389 abort ();
4390
4391 if (off == (bfd_vma) -1)
4392 {
4393 /* We can't use h->got.offset here to save state, or
4394 even just remember the offset, as finish_dynamic_symbol
4395 would use that as offset into .got. */
4396
4397 if (htab->elf.splt != NULL)
4398 {
4399 plt_index = h->plt.offset / plt_entry_size - 1;
4400 off = (plt_index + 3) * GOT_ENTRY_SIZE;
4401 base_got = htab->elf.sgotplt;
4402 }
4403 else
4404 {
4405 plt_index = h->plt.offset / plt_entry_size;
4406 off = plt_index * GOT_ENTRY_SIZE;
4407 base_got = htab->elf.igotplt;
4408 }
4409
4410 if (h->dynindx == -1
4411 || h->forced_local
4412 || info->symbolic)
4413 {
4414 /* This references the local defitionion. We must
4415 initialize this entry in the global offset table.
4416 Since the offset must always be a multiple of 8,
4417 we use the least significant bit to record
4418 whether we have initialized it already.
4419
4420 When doing a dynamic link, we create a .rela.got
4421 relocation entry to initialize the value. This
4422 is done in the finish_dynamic_symbol routine. */
4423 if ((off & 1) != 0)
4424 off &= ~1;
4425 else
4426 {
4427 bfd_put_64 (output_bfd, relocation,
4428 base_got->contents + off);
4429 /* Note that this is harmless for the GOTPLT64
4430 case, as -1 | 1 still is -1. */
4431 h->got.offset |= 1;
4432 }
4433 }
4434 }
4435
4436 relocation = (base_got->output_section->vma
4437 + base_got->output_offset + off);
4438
4439 goto do_relocation;
4440 }
4441 }
4442
4443 resolved_to_zero = (eh != NULL
4444 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
4445
4446 /* When generating a shared object, the relocations handled here are
4447 copied into the output file to be resolved at run time. */
4448 switch (r_type)
4449 {
4450 case R_X86_64_GOT32:
4451 case R_X86_64_GOT64:
4452 /* Relocation is to the entry for this symbol in the global
4453 offset table. */
4454 case R_X86_64_GOTPCREL:
4455 case R_X86_64_GOTPCRELX:
4456 case R_X86_64_REX_GOTPCRELX:
4457 case R_X86_64_GOTPCREL64:
4458 /* Use global offset table entry as symbol value. */
4459 case R_X86_64_GOTPLT64:
4460 /* This is obsolete and treated the the same as GOT64. */
4461 base_got = htab->elf.sgot;
4462
4463 if (htab->elf.sgot == NULL)
4464 abort ();
4465
4466 if (h != NULL)
4467 {
4468 bfd_boolean dyn;
4469
4470 off = h->got.offset;
4471 if (h->needs_plt
4472 && h->plt.offset != (bfd_vma)-1
4473 && off == (bfd_vma)-1)
4474 {
4475 /* We can't use h->got.offset here to save
4476 state, or even just remember the offset, as
4477 finish_dynamic_symbol would use that as offset into
4478 .got. */
4479 bfd_vma plt_index = h->plt.offset / plt_entry_size - 1;
4480 off = (plt_index + 3) * GOT_ENTRY_SIZE;
4481 base_got = htab->elf.sgotplt;
4482 }
4483
4484 dyn = htab->elf.dynamic_sections_created;
4485
4486 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
4487 || (bfd_link_pic (info)
4488 && SYMBOL_REFERENCES_LOCAL (info, h))
4489 || (ELF_ST_VISIBILITY (h->other)
4490 && h->root.type == bfd_link_hash_undefweak))
4491 {
4492 /* This is actually a static link, or it is a -Bsymbolic
4493 link and the symbol is defined locally, or the symbol
4494 was forced to be local because of a version file. We
4495 must initialize this entry in the global offset table.
4496 Since the offset must always be a multiple of 8, we
4497 use the least significant bit to record whether we
4498 have initialized it already.
4499
4500 When doing a dynamic link, we create a .rela.got
4501 relocation entry to initialize the value. This is
4502 done in the finish_dynamic_symbol routine. */
4503 if ((off & 1) != 0)
4504 off &= ~1;
4505 else
4506 {
4507 bfd_put_64 (output_bfd, relocation,
4508 base_got->contents + off);
4509 /* Note that this is harmless for the GOTPLT64 case,
4510 as -1 | 1 still is -1. */
4511 h->got.offset |= 1;
4512 }
4513 }
4514 else
4515 unresolved_reloc = FALSE;
4516 }
4517 else
4518 {
4519 if (local_got_offsets == NULL)
4520 abort ();
4521
4522 off = local_got_offsets[r_symndx];
4523
4524 /* The offset must always be a multiple of 8. We use
4525 the least significant bit to record whether we have
4526 already generated the necessary reloc. */
4527 if ((off & 1) != 0)
4528 off &= ~1;
4529 else
4530 {
4531 bfd_put_64 (output_bfd, relocation,
4532 base_got->contents + off);
4533
4534 if (bfd_link_pic (info))
4535 {
4536 asection *s;
4537 Elf_Internal_Rela outrel;
4538
4539 /* We need to generate a R_X86_64_RELATIVE reloc
4540 for the dynamic linker. */
4541 s = htab->elf.srelgot;
4542 if (s == NULL)
4543 abort ();
4544
4545 outrel.r_offset = (base_got->output_section->vma
4546 + base_got->output_offset
4547 + off);
4548 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4549 outrel.r_addend = relocation;
4550 elf_append_rela (output_bfd, s, &outrel);
4551 }
4552
4553 local_got_offsets[r_symndx] |= 1;
4554 }
4555 }
4556
4557 if (off >= (bfd_vma) -2)
4558 abort ();
4559
4560 relocation = base_got->output_section->vma
4561 + base_got->output_offset + off;
4562 if (r_type != R_X86_64_GOTPCREL
4563 && r_type != R_X86_64_GOTPCRELX
4564 && r_type != R_X86_64_REX_GOTPCRELX
4565 && r_type != R_X86_64_GOTPCREL64)
4566 relocation -= htab->elf.sgotplt->output_section->vma
4567 - htab->elf.sgotplt->output_offset;
4568
4569 break;
4570
4571 case R_X86_64_GOTOFF64:
4572 /* Relocation is relative to the start of the global offset
4573 table. */
4574
4575 /* Check to make sure it isn't a protected function or data
4576 symbol for shared library since it may not be local when
4577 used as function address or with copy relocation. We also
4578 need to make sure that a symbol is referenced locally. */
4579 if (bfd_link_pic (info) && h)
4580 {
4581 if (!h->def_regular)
4582 {
4583 const char *v;
4584
4585 switch (ELF_ST_VISIBILITY (h->other))
4586 {
4587 case STV_HIDDEN:
4588 v = _("hidden symbol");
4589 break;
4590 case STV_INTERNAL:
4591 v = _("internal symbol");
4592 break;
4593 case STV_PROTECTED:
4594 v = _("protected symbol");
4595 break;
4596 default:
4597 v = _("symbol");
4598 break;
4599 }
4600
4601 (*_bfd_error_handler)
4602 (_("%B: relocation R_X86_64_GOTOFF64 against undefined %s `%s' can not be used when making a shared object"),
4603 input_bfd, v, h->root.root.string);
4604 bfd_set_error (bfd_error_bad_value);
4605 return FALSE;
4606 }
4607 else if (!bfd_link_executable (info)
4608 && !SYMBOL_REFERENCES_LOCAL (info, h)
4609 && (h->type == STT_FUNC
4610 || h->type == STT_OBJECT)
4611 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
4612 {
4613 (*_bfd_error_handler)
4614 (_("%B: relocation R_X86_64_GOTOFF64 against protected %s `%s' can not be used when making a shared object"),
4615 input_bfd,
4616 h->type == STT_FUNC ? "function" : "data",
4617 h->root.root.string);
4618 bfd_set_error (bfd_error_bad_value);
4619 return FALSE;
4620 }
4621 }
4622
4623 /* Note that sgot is not involved in this
4624 calculation. We always want the start of .got.plt. If we
4625 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
4626 permitted by the ABI, we might have to change this
4627 calculation. */
4628 relocation -= htab->elf.sgotplt->output_section->vma
4629 + htab->elf.sgotplt->output_offset;
4630 break;
4631
4632 case R_X86_64_GOTPC32:
4633 case R_X86_64_GOTPC64:
4634 /* Use global offset table as symbol value. */
4635 relocation = htab->elf.sgotplt->output_section->vma
4636 + htab->elf.sgotplt->output_offset;
4637 unresolved_reloc = FALSE;
4638 break;
4639
4640 case R_X86_64_PLTOFF64:
4641 /* Relocation is PLT entry relative to GOT. For local
4642 symbols it's the symbol itself relative to GOT. */
4643 if (h != NULL
4644 /* See PLT32 handling. */
4645 && h->plt.offset != (bfd_vma) -1
4646 && htab->elf.splt != NULL)
4647 {
4648 if (htab->plt_bnd != NULL)
4649 {
4650 resolved_plt = htab->plt_bnd;
4651 plt_offset = eh->plt_bnd.offset;
4652 }
4653 else
4654 {
4655 resolved_plt = htab->elf.splt;
4656 plt_offset = h->plt.offset;
4657 }
4658
4659 relocation = (resolved_plt->output_section->vma
4660 + resolved_plt->output_offset
4661 + plt_offset);
4662 unresolved_reloc = FALSE;
4663 }
4664
4665 relocation -= htab->elf.sgotplt->output_section->vma
4666 + htab->elf.sgotplt->output_offset;
4667 break;
4668
4669 case R_X86_64_PLT32:
4670 case R_X86_64_PLT32_BND:
4671 /* Relocation is to the entry for this symbol in the
4672 procedure linkage table. */
4673
4674 /* Resolve a PLT32 reloc against a local symbol directly,
4675 without using the procedure linkage table. */
4676 if (h == NULL)
4677 break;
4678
4679 if ((h->plt.offset == (bfd_vma) -1
4680 && eh->plt_got.offset == (bfd_vma) -1)
4681 || htab->elf.splt == NULL)
4682 {
4683 /* We didn't make a PLT entry for this symbol. This
4684 happens when statically linking PIC code, or when
4685 using -Bsymbolic. */
4686 break;
4687 }
4688
4689 if (h->plt.offset != (bfd_vma) -1)
4690 {
4691 if (htab->plt_bnd != NULL)
4692 {
4693 resolved_plt = htab->plt_bnd;
4694 plt_offset = eh->plt_bnd.offset;
4695 }
4696 else
4697 {
4698 resolved_plt = htab->elf.splt;
4699 plt_offset = h->plt.offset;
4700 }
4701 }
4702 else
4703 {
4704 /* Use the GOT PLT. */
4705 resolved_plt = htab->plt_got;
4706 plt_offset = eh->plt_got.offset;
4707 }
4708
4709 relocation = (resolved_plt->output_section->vma
4710 + resolved_plt->output_offset
4711 + plt_offset);
4712 unresolved_reloc = FALSE;
4713 break;
4714
4715 case R_X86_64_SIZE32:
4716 case R_X86_64_SIZE64:
4717 /* Set to symbol size. */
4718 relocation = st_size;
4719 goto direct;
4720
4721 case R_X86_64_PC8:
4722 case R_X86_64_PC16:
4723 case R_X86_64_PC32:
4724 case R_X86_64_PC32_BND:
4725 /* Don't complain about -fPIC if the symbol is undefined when
4726 building executable unless it is unresolved weak symbol. */
4727 if ((input_section->flags & SEC_ALLOC) != 0
4728 && (input_section->flags & SEC_READONLY) != 0
4729 && h != NULL
4730 && ((bfd_link_executable (info)
4731 && h->root.type == bfd_link_hash_undefweak
4732 && !resolved_to_zero)
4733 || (bfd_link_pic (info)
4734 && !(bfd_link_pie (info)
4735 && h->root.type == bfd_link_hash_undefined))))
4736 {
4737 bfd_boolean fail = FALSE;
4738 bfd_boolean branch
4739 = ((r_type == R_X86_64_PC32
4740 || r_type == R_X86_64_PC32_BND)
4741 && is_32bit_relative_branch (contents, rel->r_offset));
4742
4743 if (SYMBOL_REFERENCES_LOCAL (info, h))
4744 {
4745 /* Symbol is referenced locally. Make sure it is
4746 defined locally or for a branch. */
4747 fail = !h->def_regular && !branch;
4748 }
4749 else if (!(bfd_link_pie (info)
4750 && (h->needs_copy || eh->needs_copy)))
4751 {
4752 /* Symbol doesn't need copy reloc and isn't referenced
4753 locally. We only allow branch to symbol with
4754 non-default visibility. */
4755 fail = (!branch
4756 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT);
4757 }
4758
4759 if (fail)
4760 return elf_x86_64_need_pic (input_bfd, h, howto);
4761 }
4762 /* Fall through. */
4763
4764 case R_X86_64_8:
4765 case R_X86_64_16:
4766 case R_X86_64_32:
4767 case R_X86_64_PC64:
4768 case R_X86_64_64:
4769 /* FIXME: The ABI says the linker should make sure the value is
4770 the same when it's zeroextended to 64 bit. */
4771
4772 direct:
4773 if ((input_section->flags & SEC_ALLOC) == 0)
4774 break;
4775
4776 /* Don't copy a pc-relative relocation into the output file
4777 if the symbol needs copy reloc or the symbol is undefined
4778 when building executable. Copy dynamic function pointer
4779 relocations. Don't generate dynamic relocations against
4780 resolved undefined weak symbols in PIE. */
4781 if ((bfd_link_pic (info)
4782 && !(bfd_link_pie (info)
4783 && h != NULL
4784 && (h->needs_copy
4785 || eh->needs_copy
4786 || h->root.type == bfd_link_hash_undefined)
4787 && IS_X86_64_PCREL_TYPE (r_type))
4788 && (h == NULL
4789 || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4790 && !resolved_to_zero)
4791 || h->root.type != bfd_link_hash_undefweak))
4792 && ((! IS_X86_64_PCREL_TYPE (r_type)
4793 && r_type != R_X86_64_SIZE32
4794 && r_type != R_X86_64_SIZE64)
4795 || ! SYMBOL_CALLS_LOCAL (info, h)))
4796 || (ELIMINATE_COPY_RELOCS
4797 && !bfd_link_pic (info)
4798 && h != NULL
4799 && h->dynindx != -1
4800 && (!h->non_got_ref
4801 || eh->func_pointer_refcount > 0
4802 || (h->root.type == bfd_link_hash_undefweak
4803 && !resolved_to_zero))
4804 && ((h->def_dynamic && !h->def_regular)
4805 /* Undefined weak symbol is bound locally when
4806 PIC is false. */
4807 || h->root.type == bfd_link_hash_undefined)))
4808 {
4809 Elf_Internal_Rela outrel;
4810 bfd_boolean skip, relocate;
4811 asection *sreloc;
4812
4813 /* When generating a shared object, these relocations
4814 are copied into the output file to be resolved at run
4815 time. */
4816 skip = FALSE;
4817 relocate = FALSE;
4818
4819 outrel.r_offset =
4820 _bfd_elf_section_offset (output_bfd, info, input_section,
4821 rel->r_offset);
4822 if (outrel.r_offset == (bfd_vma) -1)
4823 skip = TRUE;
4824 else if (outrel.r_offset == (bfd_vma) -2)
4825 skip = TRUE, relocate = TRUE;
4826
4827 outrel.r_offset += (input_section->output_section->vma
4828 + input_section->output_offset);
4829
4830 if (skip)
4831 memset (&outrel, 0, sizeof outrel);
4832
4833 /* h->dynindx may be -1 if this symbol was marked to
4834 become local. */
4835 else if (h != NULL
4836 && h->dynindx != -1
4837 && (IS_X86_64_PCREL_TYPE (r_type)
4838 || !(bfd_link_executable (info)
4839 || SYMBOLIC_BIND (info, h))
4840 || ! h->def_regular))
4841 {
4842 if ((r_type != R_X86_64_PC64 && r_type != R_X86_64_64)
4843 && bfd_link_executable (info)
4844 && h->root.type == bfd_link_hash_undefweak
4845 && !resolved_to_zero)
4846 return elf_x86_64_need_pic (input_bfd, h, howto);
4847 outrel.r_info = htab->r_info (h->dynindx, r_type);
4848 outrel.r_addend = rel->r_addend;
4849 }
4850 else
4851 {
4852 /* This symbol is local, or marked to become local.
4853 When relocation overflow check is disabled, we
4854 convert R_X86_64_32 to dynamic R_X86_64_RELATIVE. */
4855 if (r_type == htab->pointer_r_type
4856 || (r_type == R_X86_64_32
4857 && info->no_reloc_overflow_check))
4858 {
4859 relocate = TRUE;
4860 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
4861 outrel.r_addend = relocation + rel->r_addend;
4862 }
4863 else if (r_type == R_X86_64_64
4864 && !ABI_64_P (output_bfd))
4865 {
4866 relocate = TRUE;
4867 outrel.r_info = htab->r_info (0,
4868 R_X86_64_RELATIVE64);
4869 outrel.r_addend = relocation + rel->r_addend;
4870 /* Check addend overflow. */
4871 if ((outrel.r_addend & 0x80000000)
4872 != (rel->r_addend & 0x80000000))
4873 {
4874 const char *name;
4875 int addend = rel->r_addend;
4876 if (h && h->root.root.string)
4877 name = h->root.root.string;
4878 else
4879 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
4880 sym, NULL);
4881 if (addend < 0)
4882 (*_bfd_error_handler)
4883 (_("%B: addend -0x%x in relocation %s against "
4884 "symbol `%s' at 0x%lx in section `%A' is "
4885 "out of range"),
4886 input_bfd, input_section, addend,
4887 howto->name, name,
4888 (unsigned long) rel->r_offset);
4889 else
4890 (*_bfd_error_handler)
4891 (_("%B: addend 0x%x in relocation %s against "
4892 "symbol `%s' at 0x%lx in section `%A' is "
4893 "out of range"),
4894 input_bfd, input_section, addend,
4895 howto->name, name,
4896 (unsigned long) rel->r_offset);
4897 bfd_set_error (bfd_error_bad_value);
4898 return FALSE;
4899 }
4900 }
4901 else
4902 {
4903 long sindx;
4904
4905 if (bfd_is_abs_section (sec))
4906 sindx = 0;
4907 else if (sec == NULL || sec->owner == NULL)
4908 {
4909 bfd_set_error (bfd_error_bad_value);
4910 return FALSE;
4911 }
4912 else
4913 {
4914 asection *osec;
4915
4916 /* We are turning this relocation into one
4917 against a section symbol. It would be
4918 proper to subtract the symbol's value,
4919 osec->vma, from the emitted reloc addend,
4920 but ld.so expects buggy relocs. */
4921 osec = sec->output_section;
4922 sindx = elf_section_data (osec)->dynindx;
4923 if (sindx == 0)
4924 {
4925 asection *oi = htab->elf.text_index_section;
4926 sindx = elf_section_data (oi)->dynindx;
4927 }
4928 BFD_ASSERT (sindx != 0);
4929 }
4930
4931 outrel.r_info = htab->r_info (sindx, r_type);
4932 outrel.r_addend = relocation + rel->r_addend;
4933 }
4934 }
4935
4936 sreloc = elf_section_data (input_section)->sreloc;
4937
4938 if (sreloc == NULL || sreloc->contents == NULL)
4939 {
4940 r = bfd_reloc_notsupported;
4941 goto check_relocation_error;
4942 }
4943
4944 elf_append_rela (output_bfd, sreloc, &outrel);
4945
4946 /* If this reloc is against an external symbol, we do
4947 not want to fiddle with the addend. Otherwise, we
4948 need to include the symbol value so that it becomes
4949 an addend for the dynamic reloc. */
4950 if (! relocate)
4951 continue;
4952 }
4953
4954 break;
4955
4956 case R_X86_64_TLSGD:
4957 case R_X86_64_GOTPC32_TLSDESC:
4958 case R_X86_64_TLSDESC_CALL:
4959 case R_X86_64_GOTTPOFF:
4960 tls_type = GOT_UNKNOWN;
4961 if (h == NULL && local_got_offsets)
4962 tls_type = elf_x86_64_local_got_tls_type (input_bfd) [r_symndx];
4963 else if (h != NULL)
4964 tls_type = elf_x86_64_hash_entry (h)->tls_type;
4965
4966 if (! elf_x86_64_tls_transition (info, input_bfd,
4967 input_section, contents,
4968 symtab_hdr, sym_hashes,
4969 &r_type, tls_type, rel,
4970 relend, h, r_symndx))
4971 return FALSE;
4972
4973 if (r_type == R_X86_64_TPOFF32)
4974 {
4975 bfd_vma roff = rel->r_offset;
4976
4977 BFD_ASSERT (! unresolved_reloc);
4978
4979 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
4980 {
4981 /* GD->LE transition. For 64bit, change
4982 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4983 .word 0x6666; rex64; call __tls_get_addr
4984 into:
4985 movq %fs:0, %rax
4986 leaq foo@tpoff(%rax), %rax
4987 For 32bit, change
4988 leaq foo@tlsgd(%rip), %rdi
4989 .word 0x6666; rex64; call __tls_get_addr
4990 into:
4991 movl %fs:0, %eax
4992 leaq foo@tpoff(%rax), %rax
4993 For largepic, change:
4994 leaq foo@tlsgd(%rip), %rdi
4995 movabsq $__tls_get_addr@pltoff, %rax
4996 addq %rbx, %rax
4997 call *%rax
4998 into:
4999 movq %fs:0, %rax
5000 leaq foo@tpoff(%rax), %rax
5001 nopw 0x0(%rax,%rax,1) */
5002 int largepic = 0;
5003 if (ABI_64_P (output_bfd)
5004 && contents[roff + 5] == (bfd_byte) '\xb8')
5005 {
5006 memcpy (contents + roff - 3,
5007 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80"
5008 "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
5009 largepic = 1;
5010 }
5011 else if (ABI_64_P (output_bfd))
5012 memcpy (contents + roff - 4,
5013 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
5014 16);
5015 else
5016 memcpy (contents + roff - 3,
5017 "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
5018 15);
5019 bfd_put_32 (output_bfd,
5020 elf_x86_64_tpoff (info, relocation),
5021 contents + roff + 8 + largepic);
5022 /* Skip R_X86_64_PC32/R_X86_64_PLT32/R_X86_64_PLTOFF64. */
5023 rel++;
5024 wrel++;
5025 continue;
5026 }
5027 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
5028 {
5029 /* GDesc -> LE transition.
5030 It's originally something like:
5031 leaq x@tlsdesc(%rip), %rax
5032
5033 Change it to:
5034 movl $x@tpoff, %rax. */
5035
5036 unsigned int val, type;
5037
5038 type = bfd_get_8 (input_bfd, contents + roff - 3);
5039 val = bfd_get_8 (input_bfd, contents + roff - 1);
5040 bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
5041 contents + roff - 3);
5042 bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
5043 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
5044 contents + roff - 1);
5045 bfd_put_32 (output_bfd,
5046 elf_x86_64_tpoff (info, relocation),
5047 contents + roff);
5048 continue;
5049 }
5050 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
5051 {
5052 /* GDesc -> LE transition.
5053 It's originally:
5054 call *(%rax)
5055 Turn it into:
5056 xchg %ax,%ax. */
5057 bfd_put_8 (output_bfd, 0x66, contents + roff);
5058 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
5059 continue;
5060 }
5061 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTTPOFF)
5062 {
5063 /* IE->LE transition:
5064 For 64bit, originally it can be one of:
5065 movq foo@gottpoff(%rip), %reg
5066 addq foo@gottpoff(%rip), %reg
5067 We change it into:
5068 movq $foo, %reg
5069 leaq foo(%reg), %reg
5070 addq $foo, %reg.
5071 For 32bit, originally it can be one of:
5072 movq foo@gottpoff(%rip), %reg
5073 addl foo@gottpoff(%rip), %reg
5074 We change it into:
5075 movq $foo, %reg
5076 leal foo(%reg), %reg
5077 addl $foo, %reg. */
5078
5079 unsigned int val, type, reg;
5080
5081 if (roff >= 3)
5082 val = bfd_get_8 (input_bfd, contents + roff - 3);
5083 else
5084 val = 0;
5085 type = bfd_get_8 (input_bfd, contents + roff - 2);
5086 reg = bfd_get_8 (input_bfd, contents + roff - 1);
5087 reg >>= 3;
5088 if (type == 0x8b)
5089 {
5090 /* movq */
5091 if (val == 0x4c)
5092 bfd_put_8 (output_bfd, 0x49,
5093 contents + roff - 3);
5094 else if (!ABI_64_P (output_bfd) && val == 0x44)
5095 bfd_put_8 (output_bfd, 0x41,
5096 contents + roff - 3);
5097 bfd_put_8 (output_bfd, 0xc7,
5098 contents + roff - 2);
5099 bfd_put_8 (output_bfd, 0xc0 | reg,
5100 contents + roff - 1);
5101 }
5102 else if (reg == 4)
5103 {
5104 /* addq/addl -> addq/addl - addressing with %rsp/%r12
5105 is special */
5106 if (val == 0x4c)
5107 bfd_put_8 (output_bfd, 0x49,
5108 contents + roff - 3);
5109 else if (!ABI_64_P (output_bfd) && val == 0x44)
5110 bfd_put_8 (output_bfd, 0x41,
5111 contents + roff - 3);
5112 bfd_put_8 (output_bfd, 0x81,
5113 contents + roff - 2);
5114 bfd_put_8 (output_bfd, 0xc0 | reg,
5115 contents + roff - 1);
5116 }
5117 else
5118 {
5119 /* addq/addl -> leaq/leal */
5120 if (val == 0x4c)
5121 bfd_put_8 (output_bfd, 0x4d,
5122 contents + roff - 3);
5123 else if (!ABI_64_P (output_bfd) && val == 0x44)
5124 bfd_put_8 (output_bfd, 0x45,
5125 contents + roff - 3);
5126 bfd_put_8 (output_bfd, 0x8d,
5127 contents + roff - 2);
5128 bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
5129 contents + roff - 1);
5130 }
5131 bfd_put_32 (output_bfd,
5132 elf_x86_64_tpoff (info, relocation),
5133 contents + roff);
5134 continue;
5135 }
5136 else
5137 BFD_ASSERT (FALSE);
5138 }
5139
5140 if (htab->elf.sgot == NULL)
5141 abort ();
5142
5143 if (h != NULL)
5144 {
5145 off = h->got.offset;
5146 offplt = elf_x86_64_hash_entry (h)->tlsdesc_got;
5147 }
5148 else
5149 {
5150 if (local_got_offsets == NULL)
5151 abort ();
5152
5153 off = local_got_offsets[r_symndx];
5154 offplt = local_tlsdesc_gotents[r_symndx];
5155 }
5156
5157 if ((off & 1) != 0)
5158 off &= ~1;
5159 else
5160 {
5161 Elf_Internal_Rela outrel;
5162 int dr_type, indx;
5163 asection *sreloc;
5164
5165 if (htab->elf.srelgot == NULL)
5166 abort ();
5167
5168 indx = h && h->dynindx != -1 ? h->dynindx : 0;
5169
5170 if (GOT_TLS_GDESC_P (tls_type))
5171 {
5172 outrel.r_info = htab->r_info (indx, R_X86_64_TLSDESC);
5173 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
5174 + 2 * GOT_ENTRY_SIZE <= htab->elf.sgotplt->size);
5175 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
5176 + htab->elf.sgotplt->output_offset
5177 + offplt
5178 + htab->sgotplt_jump_table_size);
5179 sreloc = htab->elf.srelplt;
5180 if (indx == 0)
5181 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
5182 else
5183 outrel.r_addend = 0;
5184 elf_append_rela (output_bfd, sreloc, &outrel);
5185 }
5186
5187 sreloc = htab->elf.srelgot;
5188
5189 outrel.r_offset = (htab->elf.sgot->output_section->vma
5190 + htab->elf.sgot->output_offset + off);
5191
5192 if (GOT_TLS_GD_P (tls_type))
5193 dr_type = R_X86_64_DTPMOD64;
5194 else if (GOT_TLS_GDESC_P (tls_type))
5195 goto dr_done;
5196 else
5197 dr_type = R_X86_64_TPOFF64;
5198
5199 bfd_put_64 (output_bfd, 0, htab->elf.sgot->contents + off);
5200 outrel.r_addend = 0;
5201 if ((dr_type == R_X86_64_TPOFF64
5202 || dr_type == R_X86_64_TLSDESC) && indx == 0)
5203 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
5204 outrel.r_info = htab->r_info (indx, dr_type);
5205
5206 elf_append_rela (output_bfd, sreloc, &outrel);
5207
5208 if (GOT_TLS_GD_P (tls_type))
5209 {
5210 if (indx == 0)
5211 {
5212 BFD_ASSERT (! unresolved_reloc);
5213 bfd_put_64 (output_bfd,
5214 relocation - elf_x86_64_dtpoff_base (info),
5215 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
5216 }
5217 else
5218 {
5219 bfd_put_64 (output_bfd, 0,
5220 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
5221 outrel.r_info = htab->r_info (indx,
5222 R_X86_64_DTPOFF64);
5223 outrel.r_offset += GOT_ENTRY_SIZE;
5224 elf_append_rela (output_bfd, sreloc,
5225 &outrel);
5226 }
5227 }
5228
5229 dr_done:
5230 if (h != NULL)
5231 h->got.offset |= 1;
5232 else
5233 local_got_offsets[r_symndx] |= 1;
5234 }
5235
5236 if (off >= (bfd_vma) -2
5237 && ! GOT_TLS_GDESC_P (tls_type))
5238 abort ();
5239 if (r_type == ELF32_R_TYPE (rel->r_info))
5240 {
5241 if (r_type == R_X86_64_GOTPC32_TLSDESC
5242 || r_type == R_X86_64_TLSDESC_CALL)
5243 relocation = htab->elf.sgotplt->output_section->vma
5244 + htab->elf.sgotplt->output_offset
5245 + offplt + htab->sgotplt_jump_table_size;
5246 else
5247 relocation = htab->elf.sgot->output_section->vma
5248 + htab->elf.sgot->output_offset + off;
5249 unresolved_reloc = FALSE;
5250 }
5251 else
5252 {
5253 bfd_vma roff = rel->r_offset;
5254
5255 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
5256 {
5257 /* GD->IE transition. For 64bit, change
5258 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
5259 .word 0x6666; rex64; call __tls_get_addr@plt
5260 into:
5261 movq %fs:0, %rax
5262 addq foo@gottpoff(%rip), %rax
5263 For 32bit, change
5264 leaq foo@tlsgd(%rip), %rdi
5265 .word 0x6666; rex64; call __tls_get_addr@plt
5266 into:
5267 movl %fs:0, %eax
5268 addq foo@gottpoff(%rip), %rax
5269 For largepic, change:
5270 leaq foo@tlsgd(%rip), %rdi
5271 movabsq $__tls_get_addr@pltoff, %rax
5272 addq %rbx, %rax
5273 call *%rax
5274 into:
5275 movq %fs:0, %rax
5276 addq foo@gottpoff(%rax), %rax
5277 nopw 0x0(%rax,%rax,1) */
5278 int largepic = 0;
5279 if (ABI_64_P (output_bfd)
5280 && contents[roff + 5] == (bfd_byte) '\xb8')
5281 {
5282 memcpy (contents + roff - 3,
5283 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05"
5284 "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
5285 largepic = 1;
5286 }
5287 else if (ABI_64_P (output_bfd))
5288 memcpy (contents + roff - 4,
5289 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
5290 16);
5291 else
5292 memcpy (contents + roff - 3,
5293 "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
5294 15);
5295
5296 relocation = (htab->elf.sgot->output_section->vma
5297 + htab->elf.sgot->output_offset + off
5298 - roff
5299 - largepic
5300 - input_section->output_section->vma
5301 - input_section->output_offset
5302 - 12);
5303 bfd_put_32 (output_bfd, relocation,
5304 contents + roff + 8 + largepic);
5305 /* Skip R_X86_64_PLT32/R_X86_64_PLTOFF64. */
5306 rel++;
5307 wrel++;
5308 continue;
5309 }
5310 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
5311 {
5312 /* GDesc -> IE transition.
5313 It's originally something like:
5314 leaq x@tlsdesc(%rip), %rax
5315
5316 Change it to:
5317 movq x@gottpoff(%rip), %rax # before xchg %ax,%ax. */
5318
5319 /* Now modify the instruction as appropriate. To
5320 turn a leaq into a movq in the form we use it, it
5321 suffices to change the second byte from 0x8d to
5322 0x8b. */
5323 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
5324
5325 bfd_put_32 (output_bfd,
5326 htab->elf.sgot->output_section->vma
5327 + htab->elf.sgot->output_offset + off
5328 - rel->r_offset
5329 - input_section->output_section->vma
5330 - input_section->output_offset
5331 - 4,
5332 contents + roff);
5333 continue;
5334 }
5335 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
5336 {
5337 /* GDesc -> IE transition.
5338 It's originally:
5339 call *(%rax)
5340
5341 Change it to:
5342 xchg %ax, %ax. */
5343
5344 bfd_put_8 (output_bfd, 0x66, contents + roff);
5345 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
5346 continue;
5347 }
5348 else
5349 BFD_ASSERT (FALSE);
5350 }
5351 break;
5352
5353 case R_X86_64_TLSLD:
5354 if (! elf_x86_64_tls_transition (info, input_bfd,
5355 input_section, contents,
5356 symtab_hdr, sym_hashes,
5357 &r_type, GOT_UNKNOWN,
5358 rel, relend, h, r_symndx))
5359 return FALSE;
5360
5361 if (r_type != R_X86_64_TLSLD)
5362 {
5363 /* LD->LE transition:
5364 leaq foo@tlsld(%rip), %rdi; call __tls_get_addr.
5365 For 64bit, we change it into:
5366 .word 0x6666; .byte 0x66; movq %fs:0, %rax.
5367 For 32bit, we change it into:
5368 nopl 0x0(%rax); movl %fs:0, %eax.
5369 For largepic, change:
5370 leaq foo@tlsgd(%rip), %rdi
5371 movabsq $__tls_get_addr@pltoff, %rax
5372 addq %rbx, %rax
5373 call *%rax
5374 into:
5375 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
5376 movq %fs:0, %eax */
5377
5378 BFD_ASSERT (r_type == R_X86_64_TPOFF32);
5379 if (ABI_64_P (output_bfd)
5380 && contents[rel->r_offset + 5] == (bfd_byte) '\xb8')
5381 memcpy (contents + rel->r_offset - 3,
5382 "\x66\x66\x66\x66\x2e\x0f\x1f\x84\0\0\0\0\0"
5383 "\x64\x48\x8b\x04\x25\0\0\0", 22);
5384 else if (ABI_64_P (output_bfd))
5385 memcpy (contents + rel->r_offset - 3,
5386 "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
5387 else
5388 memcpy (contents + rel->r_offset - 3,
5389 "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
5390 /* Skip R_X86_64_PC32/R_X86_64_PLT32/R_X86_64_PLTOFF64. */
5391 rel++;
5392 wrel++;
5393 continue;
5394 }
5395
5396 if (htab->elf.sgot == NULL)
5397 abort ();
5398
5399 off = htab->tls_ld_got.offset;
5400 if (off & 1)
5401 off &= ~1;
5402 else
5403 {
5404 Elf_Internal_Rela outrel;
5405
5406 if (htab->elf.srelgot == NULL)
5407 abort ();
5408
5409 outrel.r_offset = (htab->elf.sgot->output_section->vma
5410 + htab->elf.sgot->output_offset + off);
5411
5412 bfd_put_64 (output_bfd, 0,
5413 htab->elf.sgot->contents + off);
5414 bfd_put_64 (output_bfd, 0,
5415 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
5416 outrel.r_info = htab->r_info (0, R_X86_64_DTPMOD64);
5417 outrel.r_addend = 0;
5418 elf_append_rela (output_bfd, htab->elf.srelgot,
5419 &outrel);
5420 htab->tls_ld_got.offset |= 1;
5421 }
5422 relocation = htab->elf.sgot->output_section->vma
5423 + htab->elf.sgot->output_offset + off;
5424 unresolved_reloc = FALSE;
5425 break;
5426
5427 case R_X86_64_DTPOFF32:
5428 if (!bfd_link_executable (info)
5429 || (input_section->flags & SEC_CODE) == 0)
5430 relocation -= elf_x86_64_dtpoff_base (info);
5431 else
5432 relocation = elf_x86_64_tpoff (info, relocation);
5433 break;
5434
5435 case R_X86_64_TPOFF32:
5436 case R_X86_64_TPOFF64:
5437 BFD_ASSERT (bfd_link_executable (info));
5438 relocation = elf_x86_64_tpoff (info, relocation);
5439 break;
5440
5441 case R_X86_64_DTPOFF64:
5442 BFD_ASSERT ((input_section->flags & SEC_CODE) == 0);
5443 relocation -= elf_x86_64_dtpoff_base (info);
5444 break;
5445
5446 default:
5447 break;
5448 }
5449
5450 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5451 because such sections are not SEC_ALLOC and thus ld.so will
5452 not process them. */
5453 if (unresolved_reloc
5454 && !((input_section->flags & SEC_DEBUGGING) != 0
5455 && h->def_dynamic)
5456 && _bfd_elf_section_offset (output_bfd, info, input_section,
5457 rel->r_offset) != (bfd_vma) -1)
5458 {
5459 (*_bfd_error_handler)
5460 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5461 input_bfd,
5462 input_section,
5463 (long) rel->r_offset,
5464 howto->name,
5465 h->root.root.string);
5466 return FALSE;
5467 }
5468
5469 do_relocation:
5470 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5471 contents, rel->r_offset,
5472 relocation, rel->r_addend);
5473
5474 check_relocation_error:
5475 if (r != bfd_reloc_ok)
5476 {
5477 const char *name;
5478
5479 if (h != NULL)
5480 name = h->root.root.string;
5481 else
5482 {
5483 name = bfd_elf_string_from_elf_section (input_bfd,
5484 symtab_hdr->sh_link,
5485 sym->st_name);
5486 if (name == NULL)
5487 return FALSE;
5488 if (*name == '\0')
5489 name = bfd_section_name (input_bfd, sec);
5490 }
5491
5492 if (r == bfd_reloc_overflow)
5493 {
5494 if (! ((*info->callbacks->reloc_overflow)
5495 (info, (h ? &h->root : NULL), name, howto->name,
5496 (bfd_vma) 0, input_bfd, input_section,
5497 rel->r_offset)))
5498 return FALSE;
5499 }
5500 else
5501 {
5502 (*_bfd_error_handler)
5503 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
5504 input_bfd, input_section,
5505 (long) rel->r_offset, name, (int) r);
5506 return FALSE;
5507 }
5508 }
5509
5510 if (wrel != rel)
5511 *wrel = *rel;
5512 }
5513
5514 if (wrel != rel)
5515 {
5516 Elf_Internal_Shdr *rel_hdr;
5517 size_t deleted = rel - wrel;
5518
5519 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
5520 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5521 if (rel_hdr->sh_size == 0)
5522 {
5523 /* It is too late to remove an empty reloc section. Leave
5524 one NONE reloc.
5525 ??? What is wrong with an empty section??? */
5526 rel_hdr->sh_size = rel_hdr->sh_entsize;
5527 deleted -= 1;
5528 }
5529 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
5530 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5531 input_section->reloc_count -= deleted;
5532 }
5533
5534 return TRUE;
5535 }
5536
5537 /* Finish up dynamic symbol handling. We set the contents of various
5538 dynamic sections here. */
5539
5540 static bfd_boolean
5541 elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
5542 struct bfd_link_info *info,
5543 struct elf_link_hash_entry *h,
5544 Elf_Internal_Sym *sym)
5545 {
5546 struct elf_x86_64_link_hash_table *htab;
5547 const struct elf_x86_64_backend_data *abed;
5548 bfd_boolean use_plt_bnd;
5549 struct elf_x86_64_link_hash_entry *eh;
5550 bfd_boolean local_undefweak;
5551
5552 htab = elf_x86_64_hash_table (info);
5553 if (htab == NULL)
5554 return FALSE;
5555
5556 /* Use MPX backend data in case of BND relocation. Use .plt_bnd
5557 section only if there is .plt section. */
5558 use_plt_bnd = htab->elf.splt != NULL && htab->plt_bnd != NULL;
5559 abed = (use_plt_bnd
5560 ? &elf_x86_64_bnd_arch_bed
5561 : get_elf_x86_64_backend_data (output_bfd));
5562
5563 eh = (struct elf_x86_64_link_hash_entry *) h;
5564
5565 /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
5566 resolved undefined weak symbols in executable so that their
5567 references have value 0 at run-time. */
5568 local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
5569
5570 if (h->plt.offset != (bfd_vma) -1)
5571 {
5572 bfd_vma plt_index;
5573 bfd_vma got_offset, plt_offset, plt_plt_offset, plt_got_offset;
5574 bfd_vma plt_plt_insn_end, plt_got_insn_size;
5575 Elf_Internal_Rela rela;
5576 bfd_byte *loc;
5577 asection *plt, *gotplt, *relplt, *resolved_plt;
5578 const struct elf_backend_data *bed;
5579 bfd_vma plt_got_pcrel_offset;
5580
5581 /* When building a static executable, use .iplt, .igot.plt and
5582 .rela.iplt sections for STT_GNU_IFUNC symbols. */
5583 if (htab->elf.splt != NULL)
5584 {
5585 plt = htab->elf.splt;
5586 gotplt = htab->elf.sgotplt;
5587 relplt = htab->elf.srelplt;
5588 }
5589 else
5590 {
5591 plt = htab->elf.iplt;
5592 gotplt = htab->elf.igotplt;
5593 relplt = htab->elf.irelplt;
5594 }
5595
5596 /* This symbol has an entry in the procedure linkage table. Set
5597 it up. */
5598 if ((h->dynindx == -1
5599 && !local_undefweak
5600 && !((h->forced_local || bfd_link_executable (info))
5601 && h->def_regular
5602 && h->type == STT_GNU_IFUNC))
5603 || plt == NULL
5604 || gotplt == NULL
5605 || relplt == NULL)
5606 abort ();
5607
5608 /* Get the index in the procedure linkage table which
5609 corresponds to this symbol. This is the index of this symbol
5610 in all the symbols for which we are making plt entries. The
5611 first entry in the procedure linkage table is reserved.
5612
5613 Get the offset into the .got table of the entry that
5614 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
5615 bytes. The first three are reserved for the dynamic linker.
5616
5617 For static executables, we don't reserve anything. */
5618
5619 if (plt == htab->elf.splt)
5620 {
5621 got_offset = h->plt.offset / abed->plt_entry_size - 1;
5622 got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
5623 }
5624 else
5625 {
5626 got_offset = h->plt.offset / abed->plt_entry_size;
5627 got_offset = got_offset * GOT_ENTRY_SIZE;
5628 }
5629
5630 plt_plt_insn_end = abed->plt_plt_insn_end;
5631 plt_plt_offset = abed->plt_plt_offset;
5632 plt_got_insn_size = abed->plt_got_insn_size;
5633 plt_got_offset = abed->plt_got_offset;
5634 if (use_plt_bnd)
5635 {
5636 /* Use the second PLT with BND relocations. */
5637 const bfd_byte *plt_entry, *plt2_entry;
5638
5639 if (eh->has_bnd_reloc)
5640 {
5641 plt_entry = elf_x86_64_bnd_plt_entry;
5642 plt2_entry = elf_x86_64_bnd_plt2_entry;
5643 }
5644 else
5645 {
5646 plt_entry = elf_x86_64_legacy_plt_entry;
5647 plt2_entry = elf_x86_64_legacy_plt2_entry;
5648
5649 /* Subtract 1 since there is no BND prefix. */
5650 plt_plt_insn_end -= 1;
5651 plt_plt_offset -= 1;
5652 plt_got_insn_size -= 1;
5653 plt_got_offset -= 1;
5654 }
5655
5656 BFD_ASSERT (sizeof (elf_x86_64_bnd_plt_entry)
5657 == sizeof (elf_x86_64_legacy_plt_entry));
5658
5659 /* Fill in the entry in the procedure linkage table. */
5660 memcpy (plt->contents + h->plt.offset,
5661 plt_entry, sizeof (elf_x86_64_legacy_plt_entry));
5662 /* Fill in the entry in the second PLT. */
5663 memcpy (htab->plt_bnd->contents + eh->plt_bnd.offset,
5664 plt2_entry, sizeof (elf_x86_64_legacy_plt2_entry));
5665
5666 resolved_plt = htab->plt_bnd;
5667 plt_offset = eh->plt_bnd.offset;
5668 }
5669 else
5670 {
5671 /* Fill in the entry in the procedure linkage table. */
5672 memcpy (plt->contents + h->plt.offset, abed->plt_entry,
5673 abed->plt_entry_size);
5674
5675 resolved_plt = plt;
5676 plt_offset = h->plt.offset;
5677 }
5678
5679 /* Insert the relocation positions of the plt section. */
5680
5681 /* Put offset the PC-relative instruction referring to the GOT entry,
5682 subtracting the size of that instruction. */
5683 plt_got_pcrel_offset = (gotplt->output_section->vma
5684 + gotplt->output_offset
5685 + got_offset
5686 - resolved_plt->output_section->vma
5687 - resolved_plt->output_offset
5688 - plt_offset
5689 - plt_got_insn_size);
5690
5691 /* Check PC-relative offset overflow in PLT entry. */
5692 if ((plt_got_pcrel_offset + 0x80000000) > 0xffffffff)
5693 info->callbacks->einfo (_("%F%B: PC-relative offset overflow in PLT entry for `%s'\n"),
5694 output_bfd, h->root.root.string);
5695
5696 bfd_put_32 (output_bfd, plt_got_pcrel_offset,
5697 resolved_plt->contents + plt_offset + plt_got_offset);
5698
5699 /* Fill in the entry in the global offset table, initially this
5700 points to the second part of the PLT entry. Leave the entry
5701 as zero for undefined weak symbol in PIE. No PLT relocation
5702 against undefined weak symbol in PIE. */
5703 if (!local_undefweak)
5704 {
5705 bfd_put_64 (output_bfd, (plt->output_section->vma
5706 + plt->output_offset
5707 + h->plt.offset
5708 + abed->plt_lazy_offset),
5709 gotplt->contents + got_offset);
5710
5711 /* Fill in the entry in the .rela.plt section. */
5712 rela.r_offset = (gotplt->output_section->vma
5713 + gotplt->output_offset
5714 + got_offset);
5715 if (h->dynindx == -1
5716 || ((bfd_link_executable (info)
5717 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5718 && h->def_regular
5719 && h->type == STT_GNU_IFUNC))
5720 {
5721 /* If an STT_GNU_IFUNC symbol is locally defined, generate
5722 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT. */
5723 rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
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 /* R_X86_64_IRELATIVE comes last. */
5728 plt_index = htab->next_irelative_index--;
5729 }
5730 else
5731 {
5732 rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
5733 rela.r_addend = 0;
5734 plt_index = htab->next_jump_slot_index++;
5735 }
5736
5737 /* Don't fill PLT entry for static executables. */
5738 if (plt == htab->elf.splt)
5739 {
5740 bfd_vma plt0_offset = h->plt.offset + plt_plt_insn_end;
5741
5742 /* Put relocation index. */
5743 bfd_put_32 (output_bfd, plt_index,
5744 (plt->contents + h->plt.offset
5745 + abed->plt_reloc_offset));
5746
5747 /* Put offset for jmp .PLT0 and check for overflow. We don't
5748 check relocation index for overflow since branch displacement
5749 will overflow first. */
5750 if (plt0_offset > 0x80000000)
5751 info->callbacks->einfo (_("%F%B: branch displacement overflow in PLT entry for `%s'\n"),
5752 output_bfd, h->root.root.string);
5753 bfd_put_32 (output_bfd, - plt0_offset,
5754 plt->contents + h->plt.offset + plt_plt_offset);
5755 }
5756
5757 bed = get_elf_backend_data (output_bfd);
5758 loc = relplt->contents + plt_index * bed->s->sizeof_rela;
5759 bed->s->swap_reloca_out (output_bfd, &rela, loc);
5760 }
5761 }
5762 else if (eh->plt_got.offset != (bfd_vma) -1)
5763 {
5764 bfd_vma got_offset, plt_offset, plt_got_offset, plt_got_insn_size;
5765 asection *plt, *got;
5766 bfd_boolean got_after_plt;
5767 int32_t got_pcrel_offset;
5768 const bfd_byte *got_plt_entry;
5769
5770 /* Set the entry in the GOT procedure linkage table. */
5771 plt = htab->plt_got;
5772 got = htab->elf.sgot;
5773 got_offset = h->got.offset;
5774
5775 if (got_offset == (bfd_vma) -1
5776 || h->type == STT_GNU_IFUNC
5777 || plt == NULL
5778 || got == NULL)
5779 abort ();
5780
5781 /* Use the second PLT entry template for the GOT PLT since they
5782 are the identical. */
5783 plt_got_insn_size = elf_x86_64_bnd_arch_bed.plt_got_insn_size;
5784 plt_got_offset = elf_x86_64_bnd_arch_bed.plt_got_offset;
5785 if (eh->has_bnd_reloc)
5786 got_plt_entry = elf_x86_64_bnd_plt2_entry;
5787 else
5788 {
5789 got_plt_entry = elf_x86_64_legacy_plt2_entry;
5790
5791 /* Subtract 1 since there is no BND prefix. */
5792 plt_got_insn_size -= 1;
5793 plt_got_offset -= 1;
5794 }
5795
5796 /* Fill in the entry in the GOT procedure linkage table. */
5797 plt_offset = eh->plt_got.offset;
5798 memcpy (plt->contents + plt_offset,
5799 got_plt_entry, sizeof (elf_x86_64_legacy_plt2_entry));
5800
5801 /* Put offset the PC-relative instruction referring to the GOT
5802 entry, subtracting the size of that instruction. */
5803 got_pcrel_offset = (got->output_section->vma
5804 + got->output_offset
5805 + got_offset
5806 - plt->output_section->vma
5807 - plt->output_offset
5808 - plt_offset
5809 - plt_got_insn_size);
5810
5811 /* Check PC-relative offset overflow in GOT PLT entry. */
5812 got_after_plt = got->output_section->vma > plt->output_section->vma;
5813 if ((got_after_plt && got_pcrel_offset < 0)
5814 || (!got_after_plt && got_pcrel_offset > 0))
5815 info->callbacks->einfo (_("%F%B: PC-relative offset overflow in GOT PLT entry for `%s'\n"),
5816 output_bfd, h->root.root.string);
5817
5818 bfd_put_32 (output_bfd, got_pcrel_offset,
5819 plt->contents + plt_offset + plt_got_offset);
5820 }
5821
5822 if (!local_undefweak
5823 && !h->def_regular
5824 && (h->plt.offset != (bfd_vma) -1
5825 || eh->plt_got.offset != (bfd_vma) -1))
5826 {
5827 /* Mark the symbol as undefined, rather than as defined in
5828 the .plt section. Leave the value if there were any
5829 relocations where pointer equality matters (this is a clue
5830 for the dynamic linker, to make function pointer
5831 comparisons work between an application and shared
5832 library), otherwise set it to zero. If a function is only
5833 called from a binary, there is no need to slow down
5834 shared libraries because of that. */
5835 sym->st_shndx = SHN_UNDEF;
5836 if (!h->pointer_equality_needed)
5837 sym->st_value = 0;
5838 }
5839
5840 /* Don't generate dynamic GOT relocation against undefined weak
5841 symbol in executable. */
5842 if (h->got.offset != (bfd_vma) -1
5843 && ! GOT_TLS_GD_ANY_P (elf_x86_64_hash_entry (h)->tls_type)
5844 && elf_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE
5845 && !local_undefweak)
5846 {
5847 Elf_Internal_Rela rela;
5848
5849 /* This symbol has an entry in the global offset table. Set it
5850 up. */
5851 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
5852 abort ();
5853
5854 rela.r_offset = (htab->elf.sgot->output_section->vma
5855 + htab->elf.sgot->output_offset
5856 + (h->got.offset &~ (bfd_vma) 1));
5857
5858 /* If this is a static link, or it is a -Bsymbolic link and the
5859 symbol is defined locally or was forced to be local because
5860 of a version file, we just want to emit a RELATIVE reloc.
5861 The entry in the global offset table will already have been
5862 initialized in the relocate_section function. */
5863 if (h->def_regular
5864 && h->type == STT_GNU_IFUNC)
5865 {
5866 if (bfd_link_pic (info))
5867 {
5868 /* Generate R_X86_64_GLOB_DAT. */
5869 goto do_glob_dat;
5870 }
5871 else
5872 {
5873 asection *plt;
5874
5875 if (!h->pointer_equality_needed)
5876 abort ();
5877
5878 /* For non-shared object, we can't use .got.plt, which
5879 contains the real function addres if we need pointer
5880 equality. We load the GOT entry with the PLT entry. */
5881 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
5882 bfd_put_64 (output_bfd, (plt->output_section->vma
5883 + plt->output_offset
5884 + h->plt.offset),
5885 htab->elf.sgot->contents + h->got.offset);
5886 return TRUE;
5887 }
5888 }
5889 else if (bfd_link_pic (info)
5890 && SYMBOL_REFERENCES_LOCAL (info, h))
5891 {
5892 if (!h->def_regular)
5893 return FALSE;
5894 BFD_ASSERT((h->got.offset & 1) != 0);
5895 rela.r_info = htab->r_info (0, R_X86_64_RELATIVE);
5896 rela.r_addend = (h->root.u.def.value
5897 + h->root.u.def.section->output_section->vma
5898 + h->root.u.def.section->output_offset);
5899 }
5900 else
5901 {
5902 BFD_ASSERT((h->got.offset & 1) == 0);
5903 do_glob_dat:
5904 bfd_put_64 (output_bfd, (bfd_vma) 0,
5905 htab->elf.sgot->contents + h->got.offset);
5906 rela.r_info = htab->r_info (h->dynindx, R_X86_64_GLOB_DAT);
5907 rela.r_addend = 0;
5908 }
5909
5910 elf_append_rela (output_bfd, htab->elf.srelgot, &rela);
5911 }
5912
5913 if (h->needs_copy)
5914 {
5915 Elf_Internal_Rela rela;
5916
5917 /* This symbol needs a copy reloc. Set it up. */
5918
5919 if (h->dynindx == -1
5920 || (h->root.type != bfd_link_hash_defined
5921 && h->root.type != bfd_link_hash_defweak)
5922 || htab->srelbss == NULL)
5923 abort ();
5924
5925 rela.r_offset = (h->root.u.def.value
5926 + h->root.u.def.section->output_section->vma
5927 + h->root.u.def.section->output_offset);
5928 rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY);
5929 rela.r_addend = 0;
5930 elf_append_rela (output_bfd, htab->srelbss, &rela);
5931 }
5932
5933 return TRUE;
5934 }
5935
5936 /* Finish up local dynamic symbol handling. We set the contents of
5937 various dynamic sections here. */
5938
5939 static bfd_boolean
5940 elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
5941 {
5942 struct elf_link_hash_entry *h
5943 = (struct elf_link_hash_entry *) *slot;
5944 struct bfd_link_info *info
5945 = (struct bfd_link_info *) inf;
5946
5947 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
5948 info, h, NULL);
5949 }
5950
5951 /* Finish up undefined weak symbol handling in PIE. Fill its PLT entry
5952 here since undefined weak symbol may not be dynamic and may not be
5953 called for elf_x86_64_finish_dynamic_symbol. */
5954
5955 static bfd_boolean
5956 elf_x86_64_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
5957 void *inf)
5958 {
5959 struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
5960 struct bfd_link_info *info = (struct bfd_link_info *) inf;
5961
5962 if (h->root.type != bfd_link_hash_undefweak
5963 || h->dynindx != -1)
5964 return TRUE;
5965
5966 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
5967 info, h, NULL);
5968 }
5969
5970 /* Used to decide how to sort relocs in an optimal manner for the
5971 dynamic linker, before writing them out. */
5972
5973 static enum elf_reloc_type_class
5974 elf_x86_64_reloc_type_class (const struct bfd_link_info *info,
5975 const asection *rel_sec ATTRIBUTE_UNUSED,
5976 const Elf_Internal_Rela *rela)
5977 {
5978 bfd *abfd = info->output_bfd;
5979 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5980 struct elf_x86_64_link_hash_table *htab = elf_x86_64_hash_table (info);
5981
5982 if (htab->elf.dynsym != NULL
5983 && htab->elf.dynsym->contents != NULL)
5984 {
5985 /* Check relocation against STT_GNU_IFUNC symbol if there are
5986 dynamic symbols. */
5987 unsigned long r_symndx = htab->r_sym (rela->r_info);
5988 Elf_Internal_Sym sym;
5989 if (!bed->s->swap_symbol_in (abfd,
5990 (htab->elf.dynsym->contents
5991 + r_symndx * bed->s->sizeof_sym),
5992 0, &sym))
5993 abort ();
5994
5995 if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
5996 return reloc_class_ifunc;
5997 }
5998
5999 switch ((int) ELF32_R_TYPE (rela->r_info))
6000 {
6001 case R_X86_64_RELATIVE:
6002 case R_X86_64_RELATIVE64:
6003 return reloc_class_relative;
6004 case R_X86_64_JUMP_SLOT:
6005 return reloc_class_plt;
6006 case R_X86_64_COPY:
6007 return reloc_class_copy;
6008 default:
6009 return reloc_class_normal;
6010 }
6011 }
6012
6013 /* Finish up the dynamic sections. */
6014
6015 static bfd_boolean
6016 elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
6017 struct bfd_link_info *info)
6018 {
6019 struct elf_x86_64_link_hash_table *htab;
6020 bfd *dynobj;
6021 asection *sdyn;
6022 const struct elf_x86_64_backend_data *abed;
6023
6024 htab = elf_x86_64_hash_table (info);
6025 if (htab == NULL)
6026 return FALSE;
6027
6028 /* Use MPX backend data in case of BND relocation. Use .plt_bnd
6029 section only if there is .plt section. */
6030 abed = (htab->elf.splt != NULL && htab->plt_bnd != NULL
6031 ? &elf_x86_64_bnd_arch_bed
6032 : get_elf_x86_64_backend_data (output_bfd));
6033
6034 dynobj = htab->elf.dynobj;
6035 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
6036
6037 if (htab->elf.dynamic_sections_created)
6038 {
6039 bfd_byte *dyncon, *dynconend;
6040 const struct elf_backend_data *bed;
6041 bfd_size_type sizeof_dyn;
6042
6043 if (sdyn == NULL || htab->elf.sgot == NULL)
6044 abort ();
6045
6046 bed = get_elf_backend_data (dynobj);
6047 sizeof_dyn = bed->s->sizeof_dyn;
6048 dyncon = sdyn->contents;
6049 dynconend = sdyn->contents + sdyn->size;
6050 for (; dyncon < dynconend; dyncon += sizeof_dyn)
6051 {
6052 Elf_Internal_Dyn dyn;
6053 asection *s;
6054
6055 (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
6056
6057 switch (dyn.d_tag)
6058 {
6059 default:
6060 continue;
6061
6062 case DT_PLTGOT:
6063 s = htab->elf.sgotplt;
6064 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
6065 break;
6066
6067 case DT_JMPREL:
6068 dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
6069 break;
6070
6071 case DT_PLTRELSZ:
6072 s = htab->elf.srelplt->output_section;
6073 dyn.d_un.d_val = s->size;
6074 break;
6075
6076 case DT_RELASZ:
6077 /* The procedure linkage table relocs (DT_JMPREL) should
6078 not be included in the overall relocs (DT_RELA).
6079 Therefore, we override the DT_RELASZ entry here to
6080 make it not include the JMPREL relocs. Since the
6081 linker script arranges for .rela.plt to follow all
6082 other relocation sections, we don't have to worry
6083 about changing the DT_RELA entry. */
6084 if (htab->elf.srelplt != NULL)
6085 {
6086 s = htab->elf.srelplt->output_section;
6087 dyn.d_un.d_val -= s->size;
6088 }
6089 break;
6090
6091 case DT_TLSDESC_PLT:
6092 s = htab->elf.splt;
6093 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
6094 + htab->tlsdesc_plt;
6095 break;
6096
6097 case DT_TLSDESC_GOT:
6098 s = htab->elf.sgot;
6099 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
6100 + htab->tlsdesc_got;
6101 break;
6102 }
6103
6104 (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
6105 }
6106
6107 /* Fill in the special first entry in the procedure linkage table. */
6108 if (htab->elf.splt && htab->elf.splt->size > 0)
6109 {
6110 /* Fill in the first entry in the procedure linkage table. */
6111 memcpy (htab->elf.splt->contents,
6112 abed->plt0_entry, abed->plt_entry_size);
6113 /* Add offset for pushq GOT+8(%rip), since the instruction
6114 uses 6 bytes subtract this value. */
6115 bfd_put_32 (output_bfd,
6116 (htab->elf.sgotplt->output_section->vma
6117 + htab->elf.sgotplt->output_offset
6118 + 8
6119 - htab->elf.splt->output_section->vma
6120 - htab->elf.splt->output_offset
6121 - 6),
6122 htab->elf.splt->contents + abed->plt0_got1_offset);
6123 /* Add offset for the PC-relative instruction accessing GOT+16,
6124 subtracting the offset to the end of that instruction. */
6125 bfd_put_32 (output_bfd,
6126 (htab->elf.sgotplt->output_section->vma
6127 + htab->elf.sgotplt->output_offset
6128 + 16
6129 - htab->elf.splt->output_section->vma
6130 - htab->elf.splt->output_offset
6131 - abed->plt0_got2_insn_end),
6132 htab->elf.splt->contents + abed->plt0_got2_offset);
6133
6134 elf_section_data (htab->elf.splt->output_section)
6135 ->this_hdr.sh_entsize = abed->plt_entry_size;
6136
6137 if (htab->tlsdesc_plt)
6138 {
6139 bfd_put_64 (output_bfd, (bfd_vma) 0,
6140 htab->elf.sgot->contents + htab->tlsdesc_got);
6141
6142 memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
6143 abed->plt0_entry, abed->plt_entry_size);
6144
6145 /* Add offset for pushq GOT+8(%rip), since the
6146 instruction uses 6 bytes subtract this value. */
6147 bfd_put_32 (output_bfd,
6148 (htab->elf.sgotplt->output_section->vma
6149 + htab->elf.sgotplt->output_offset
6150 + 8
6151 - htab->elf.splt->output_section->vma
6152 - htab->elf.splt->output_offset
6153 - htab->tlsdesc_plt
6154 - 6),
6155 htab->elf.splt->contents
6156 + htab->tlsdesc_plt + abed->plt0_got1_offset);
6157 /* Add offset for the PC-relative instruction accessing GOT+TDG,
6158 where TGD stands for htab->tlsdesc_got, subtracting the offset
6159 to the end of that instruction. */
6160 bfd_put_32 (output_bfd,
6161 (htab->elf.sgot->output_section->vma
6162 + htab->elf.sgot->output_offset
6163 + htab->tlsdesc_got
6164 - htab->elf.splt->output_section->vma
6165 - htab->elf.splt->output_offset
6166 - htab->tlsdesc_plt
6167 - abed->plt0_got2_insn_end),
6168 htab->elf.splt->contents
6169 + htab->tlsdesc_plt + abed->plt0_got2_offset);
6170 }
6171 }
6172 }
6173
6174 if (htab->plt_bnd != NULL)
6175 elf_section_data (htab->plt_bnd->output_section)
6176 ->this_hdr.sh_entsize = sizeof (elf_x86_64_bnd_plt2_entry);
6177
6178 if (htab->elf.sgotplt)
6179 {
6180 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
6181 {
6182 (*_bfd_error_handler)
6183 (_("discarded output section: `%A'"), htab->elf.sgotplt);
6184 return FALSE;
6185 }
6186
6187 /* Fill in the first three entries in the global offset table. */
6188 if (htab->elf.sgotplt->size > 0)
6189 {
6190 /* Set the first entry in the global offset table to the address of
6191 the dynamic section. */
6192 if (sdyn == NULL)
6193 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents);
6194 else
6195 bfd_put_64 (output_bfd,
6196 sdyn->output_section->vma + sdyn->output_offset,
6197 htab->elf.sgotplt->contents);
6198 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
6199 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
6200 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE*2);
6201 }
6202
6203 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize =
6204 GOT_ENTRY_SIZE;
6205 }
6206
6207 /* Adjust .eh_frame for .plt section. */
6208 if (htab->plt_eh_frame != NULL
6209 && htab->plt_eh_frame->contents != NULL)
6210 {
6211 if (htab->elf.splt != NULL
6212 && htab->elf.splt->size != 0
6213 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
6214 && htab->elf.splt->output_section != NULL
6215 && htab->plt_eh_frame->output_section != NULL)
6216 {
6217 bfd_vma plt_start = htab->elf.splt->output_section->vma;
6218 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
6219 + htab->plt_eh_frame->output_offset
6220 + PLT_FDE_START_OFFSET;
6221 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
6222 htab->plt_eh_frame->contents
6223 + PLT_FDE_START_OFFSET);
6224 }
6225 if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
6226 {
6227 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
6228 htab->plt_eh_frame,
6229 htab->plt_eh_frame->contents))
6230 return FALSE;
6231 }
6232 }
6233
6234 if (htab->elf.sgot && htab->elf.sgot->size > 0)
6235 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
6236 = GOT_ENTRY_SIZE;
6237
6238 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
6239 htab_traverse (htab->loc_hash_table,
6240 elf_x86_64_finish_local_dynamic_symbol,
6241 info);
6242
6243 /* Fill PLT entries for undefined weak symbols in PIE. */
6244 if (bfd_link_pie (info))
6245 bfd_hash_traverse (&info->hash->table,
6246 elf_x86_64_pie_finish_undefweak_symbol,
6247 info);
6248
6249 return TRUE;
6250 }
6251
6252 /* Return an array of PLT entry symbol values. */
6253
6254 static bfd_vma *
6255 elf_x86_64_get_plt_sym_val (bfd *abfd, asymbol **dynsyms, asection *plt,
6256 asection *relplt)
6257 {
6258 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
6259 arelent *p;
6260 long count, i;
6261 bfd_vma *plt_sym_val;
6262 bfd_vma plt_offset;
6263 bfd_byte *plt_contents;
6264 const struct elf_x86_64_backend_data *bed;
6265 Elf_Internal_Shdr *hdr;
6266 asection *plt_bnd;
6267
6268 /* Get the .plt section contents. PLT passed down may point to the
6269 .plt.bnd section. Make sure that PLT always points to the .plt
6270 section. */
6271 plt_bnd = bfd_get_section_by_name (abfd, ".plt.bnd");
6272 if (plt_bnd)
6273 {
6274 if (plt != plt_bnd)
6275 abort ();
6276 plt = bfd_get_section_by_name (abfd, ".plt");
6277 if (plt == NULL)
6278 abort ();
6279 bed = &elf_x86_64_bnd_arch_bed;
6280 }
6281 else
6282 bed = get_elf_x86_64_backend_data (abfd);
6283
6284 plt_contents = (bfd_byte *) bfd_malloc (plt->size);
6285 if (plt_contents == NULL)
6286 return NULL;
6287 if (!bfd_get_section_contents (abfd, (asection *) plt,
6288 plt_contents, 0, plt->size))
6289 {
6290 bad_return:
6291 free (plt_contents);
6292 return NULL;
6293 }
6294
6295 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
6296 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
6297 goto bad_return;
6298
6299 hdr = &elf_section_data (relplt)->this_hdr;
6300 count = relplt->size / hdr->sh_entsize;
6301
6302 plt_sym_val = (bfd_vma *) bfd_malloc (sizeof (bfd_vma) * count);
6303 if (plt_sym_val == NULL)
6304 goto bad_return;
6305
6306 for (i = 0; i < count; i++)
6307 plt_sym_val[i] = -1;
6308
6309 plt_offset = bed->plt_entry_size;
6310 p = relplt->relocation;
6311 for (i = 0; i < count; i++, p++)
6312 {
6313 long reloc_index;
6314
6315 /* Skip unknown relocation. */
6316 if (p->howto == NULL)
6317 continue;
6318
6319 if (p->howto->type != R_X86_64_JUMP_SLOT
6320 && p->howto->type != R_X86_64_IRELATIVE)
6321 continue;
6322
6323 reloc_index = H_GET_32 (abfd, (plt_contents + plt_offset
6324 + bed->plt_reloc_offset));
6325 if (reloc_index < count)
6326 {
6327 if (plt_bnd)
6328 {
6329 /* This is the index in .plt section. */
6330 long plt_index = plt_offset / bed->plt_entry_size;
6331 /* Store VMA + the offset in .plt.bnd section. */
6332 plt_sym_val[reloc_index] =
6333 (plt_bnd->vma
6334 + (plt_index - 1) * sizeof (elf_x86_64_legacy_plt2_entry));
6335 }
6336 else
6337 plt_sym_val[reloc_index] = plt->vma + plt_offset;
6338 }
6339 plt_offset += bed->plt_entry_size;
6340
6341 /* PR binutils/18437: Skip extra relocations in the .rela.plt
6342 section. */
6343 if (plt_offset >= plt->size)
6344 break;
6345 }
6346
6347 free (plt_contents);
6348
6349 return plt_sym_val;
6350 }
6351
6352 /* Similar to _bfd_elf_get_synthetic_symtab, with .plt.bnd section
6353 support. */
6354
6355 static long
6356 elf_x86_64_get_synthetic_symtab (bfd *abfd,
6357 long symcount,
6358 asymbol **syms,
6359 long dynsymcount,
6360 asymbol **dynsyms,
6361 asymbol **ret)
6362 {
6363 /* Pass the .plt.bnd section to _bfd_elf_ifunc_get_synthetic_symtab
6364 as PLT if it exists. */
6365 asection *plt = bfd_get_section_by_name (abfd, ".plt.bnd");
6366 if (plt == NULL)
6367 plt = bfd_get_section_by_name (abfd, ".plt");
6368 return _bfd_elf_ifunc_get_synthetic_symtab (abfd, symcount, syms,
6369 dynsymcount, dynsyms, ret,
6370 plt,
6371 elf_x86_64_get_plt_sym_val);
6372 }
6373
6374 /* Handle an x86-64 specific section when reading an object file. This
6375 is called when elfcode.h finds a section with an unknown type. */
6376
6377 static bfd_boolean
6378 elf_x86_64_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr,
6379 const char *name, int shindex)
6380 {
6381 if (hdr->sh_type != SHT_X86_64_UNWIND)
6382 return FALSE;
6383
6384 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
6385 return FALSE;
6386
6387 return TRUE;
6388 }
6389
6390 /* Hook called by the linker routine which adds symbols from an object
6391 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
6392 of .bss. */
6393
6394 static bfd_boolean
6395 elf_x86_64_add_symbol_hook (bfd *abfd,
6396 struct bfd_link_info *info,
6397 Elf_Internal_Sym *sym,
6398 const char **namep ATTRIBUTE_UNUSED,
6399 flagword *flagsp ATTRIBUTE_UNUSED,
6400 asection **secp,
6401 bfd_vma *valp)
6402 {
6403 asection *lcomm;
6404
6405 switch (sym->st_shndx)
6406 {
6407 case SHN_X86_64_LCOMMON:
6408 lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
6409 if (lcomm == NULL)
6410 {
6411 lcomm = bfd_make_section_with_flags (abfd,
6412 "LARGE_COMMON",
6413 (SEC_ALLOC
6414 | SEC_IS_COMMON
6415 | SEC_LINKER_CREATED));
6416 if (lcomm == NULL)
6417 return FALSE;
6418 elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
6419 }
6420 *secp = lcomm;
6421 *valp = sym->st_size;
6422 return TRUE;
6423 }
6424
6425 if (ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE
6426 && (abfd->flags & DYNAMIC) == 0
6427 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
6428 elf_tdata (info->output_bfd)->has_gnu_symbols
6429 |= elf_gnu_symbol_unique;
6430
6431 return TRUE;
6432 }
6433
6434
6435 /* Given a BFD section, try to locate the corresponding ELF section
6436 index. */
6437
6438 static bfd_boolean
6439 elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
6440 asection *sec, int *index_return)
6441 {
6442 if (sec == &_bfd_elf_large_com_section)
6443 {
6444 *index_return = SHN_X86_64_LCOMMON;
6445 return TRUE;
6446 }
6447 return FALSE;
6448 }
6449
6450 /* Process a symbol. */
6451
6452 static void
6453 elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
6454 asymbol *asym)
6455 {
6456 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
6457
6458 switch (elfsym->internal_elf_sym.st_shndx)
6459 {
6460 case SHN_X86_64_LCOMMON:
6461 asym->section = &_bfd_elf_large_com_section;
6462 asym->value = elfsym->internal_elf_sym.st_size;
6463 /* Common symbol doesn't set BSF_GLOBAL. */
6464 asym->flags &= ~BSF_GLOBAL;
6465 break;
6466 }
6467 }
6468
6469 static bfd_boolean
6470 elf_x86_64_common_definition (Elf_Internal_Sym *sym)
6471 {
6472 return (sym->st_shndx == SHN_COMMON
6473 || sym->st_shndx == SHN_X86_64_LCOMMON);
6474 }
6475
6476 static unsigned int
6477 elf_x86_64_common_section_index (asection *sec)
6478 {
6479 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
6480 return SHN_COMMON;
6481 else
6482 return SHN_X86_64_LCOMMON;
6483 }
6484
6485 static asection *
6486 elf_x86_64_common_section (asection *sec)
6487 {
6488 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
6489 return bfd_com_section_ptr;
6490 else
6491 return &_bfd_elf_large_com_section;
6492 }
6493
6494 static bfd_boolean
6495 elf_x86_64_merge_symbol (struct elf_link_hash_entry *h,
6496 const Elf_Internal_Sym *sym,
6497 asection **psec,
6498 bfd_boolean newdef,
6499 bfd_boolean olddef,
6500 bfd *oldbfd,
6501 const asection *oldsec)
6502 {
6503 /* A normal common symbol and a large common symbol result in a
6504 normal common symbol. We turn the large common symbol into a
6505 normal one. */
6506 if (!olddef
6507 && h->root.type == bfd_link_hash_common
6508 && !newdef
6509 && bfd_is_com_section (*psec)
6510 && oldsec != *psec)
6511 {
6512 if (sym->st_shndx == SHN_COMMON
6513 && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) != 0)
6514 {
6515 h->root.u.c.p->section
6516 = bfd_make_section_old_way (oldbfd, "COMMON");
6517 h->root.u.c.p->section->flags = SEC_ALLOC;
6518 }
6519 else if (sym->st_shndx == SHN_X86_64_LCOMMON
6520 && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) == 0)
6521 *psec = bfd_com_section_ptr;
6522 }
6523
6524 return TRUE;
6525 }
6526
6527 static int
6528 elf_x86_64_additional_program_headers (bfd *abfd,
6529 struct bfd_link_info *info ATTRIBUTE_UNUSED)
6530 {
6531 asection *s;
6532 int count = 0;
6533
6534 /* Check to see if we need a large readonly segment. */
6535 s = bfd_get_section_by_name (abfd, ".lrodata");
6536 if (s && (s->flags & SEC_LOAD))
6537 count++;
6538
6539 /* Check to see if we need a large data segment. Since .lbss sections
6540 is placed right after the .bss section, there should be no need for
6541 a large data segment just because of .lbss. */
6542 s = bfd_get_section_by_name (abfd, ".ldata");
6543 if (s && (s->flags & SEC_LOAD))
6544 count++;
6545
6546 return count;
6547 }
6548
6549 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
6550
6551 static bfd_boolean
6552 elf_x86_64_hash_symbol (struct elf_link_hash_entry *h)
6553 {
6554 if (h->plt.offset != (bfd_vma) -1
6555 && !h->def_regular
6556 && !h->pointer_equality_needed)
6557 return FALSE;
6558
6559 return _bfd_elf_hash_symbol (h);
6560 }
6561
6562 /* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
6563
6564 static bfd_boolean
6565 elf_x86_64_relocs_compatible (const bfd_target *input,
6566 const bfd_target *output)
6567 {
6568 return ((xvec_get_elf_backend_data (input)->s->elfclass
6569 == xvec_get_elf_backend_data (output)->s->elfclass)
6570 && _bfd_elf_relocs_compatible (input, output));
6571 }
6572
6573 static const struct bfd_elf_special_section
6574 elf_x86_64_special_sections[]=
6575 {
6576 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
6577 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
6578 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
6579 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
6580 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
6581 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
6582 { NULL, 0, 0, 0, 0 }
6583 };
6584
6585 #define TARGET_LITTLE_SYM x86_64_elf64_vec
6586 #define TARGET_LITTLE_NAME "elf64-x86-64"
6587 #define ELF_ARCH bfd_arch_i386
6588 #define ELF_TARGET_ID X86_64_ELF_DATA
6589 #define ELF_MACHINE_CODE EM_X86_64
6590 #define ELF_MAXPAGESIZE 0x200000
6591 #define ELF_MINPAGESIZE 0x1000
6592 #define ELF_COMMONPAGESIZE 0x1000
6593
6594 #define elf_backend_can_gc_sections 1
6595 #define elf_backend_can_refcount 1
6596 #define elf_backend_want_got_plt 1
6597 #define elf_backend_plt_readonly 1
6598 #define elf_backend_want_plt_sym 0
6599 #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
6600 #define elf_backend_rela_normal 1
6601 #define elf_backend_plt_alignment 4
6602 #define elf_backend_extern_protected_data 1
6603
6604 #define elf_info_to_howto elf_x86_64_info_to_howto
6605
6606 #define bfd_elf64_bfd_link_hash_table_create \
6607 elf_x86_64_link_hash_table_create
6608 #define bfd_elf64_bfd_reloc_type_lookup elf_x86_64_reloc_type_lookup
6609 #define bfd_elf64_bfd_reloc_name_lookup \
6610 elf_x86_64_reloc_name_lookup
6611
6612 #define elf_backend_adjust_dynamic_symbol elf_x86_64_adjust_dynamic_symbol
6613 #define elf_backend_relocs_compatible elf_x86_64_relocs_compatible
6614 #define elf_backend_check_relocs elf_x86_64_check_relocs
6615 #define elf_backend_copy_indirect_symbol elf_x86_64_copy_indirect_symbol
6616 #define elf_backend_create_dynamic_sections elf_x86_64_create_dynamic_sections
6617 #define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
6618 #define elf_backend_finish_dynamic_symbol elf_x86_64_finish_dynamic_symbol
6619 #define elf_backend_gc_mark_hook elf_x86_64_gc_mark_hook
6620 #define elf_backend_gc_sweep_hook elf_x86_64_gc_sweep_hook
6621 #define elf_backend_grok_prstatus elf_x86_64_grok_prstatus
6622 #define elf_backend_grok_psinfo elf_x86_64_grok_psinfo
6623 #ifdef CORE_HEADER
6624 #define elf_backend_write_core_note elf_x86_64_write_core_note
6625 #endif
6626 #define elf_backend_reloc_type_class elf_x86_64_reloc_type_class
6627 #define elf_backend_relocate_section elf_x86_64_relocate_section
6628 #define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections
6629 #define elf_backend_always_size_sections elf_x86_64_always_size_sections
6630 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
6631 #define elf_backend_object_p elf64_x86_64_elf_object_p
6632 #define bfd_elf64_mkobject elf_x86_64_mkobject
6633 #define bfd_elf64_get_synthetic_symtab elf_x86_64_get_synthetic_symtab
6634
6635 #define elf_backend_section_from_shdr \
6636 elf_x86_64_section_from_shdr
6637
6638 #define elf_backend_section_from_bfd_section \
6639 elf_x86_64_elf_section_from_bfd_section
6640 #define elf_backend_add_symbol_hook \
6641 elf_x86_64_add_symbol_hook
6642 #define elf_backend_symbol_processing \
6643 elf_x86_64_symbol_processing
6644 #define elf_backend_common_section_index \
6645 elf_x86_64_common_section_index
6646 #define elf_backend_common_section \
6647 elf_x86_64_common_section
6648 #define elf_backend_common_definition \
6649 elf_x86_64_common_definition
6650 #define elf_backend_merge_symbol \
6651 elf_x86_64_merge_symbol
6652 #define elf_backend_special_sections \
6653 elf_x86_64_special_sections
6654 #define elf_backend_additional_program_headers \
6655 elf_x86_64_additional_program_headers
6656 #define elf_backend_hash_symbol \
6657 elf_x86_64_hash_symbol
6658 #define elf_backend_omit_section_dynsym \
6659 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
6660 #define elf_backend_fixup_symbol \
6661 elf_x86_64_fixup_symbol
6662
6663 #include "elf64-target.h"
6664
6665 /* CloudABI support. */
6666
6667 #undef TARGET_LITTLE_SYM
6668 #define TARGET_LITTLE_SYM x86_64_elf64_cloudabi_vec
6669 #undef TARGET_LITTLE_NAME
6670 #define TARGET_LITTLE_NAME "elf64-x86-64-cloudabi"
6671
6672 #undef ELF_OSABI
6673 #define ELF_OSABI ELFOSABI_CLOUDABI
6674
6675 #undef elf64_bed
6676 #define elf64_bed elf64_x86_64_cloudabi_bed
6677
6678 #include "elf64-target.h"
6679
6680 /* FreeBSD support. */
6681
6682 #undef TARGET_LITTLE_SYM
6683 #define TARGET_LITTLE_SYM x86_64_elf64_fbsd_vec
6684 #undef TARGET_LITTLE_NAME
6685 #define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
6686
6687 #undef ELF_OSABI
6688 #define ELF_OSABI ELFOSABI_FREEBSD
6689
6690 #undef elf64_bed
6691 #define elf64_bed elf64_x86_64_fbsd_bed
6692
6693 #include "elf64-target.h"
6694
6695 /* Solaris 2 support. */
6696
6697 #undef TARGET_LITTLE_SYM
6698 #define TARGET_LITTLE_SYM x86_64_elf64_sol2_vec
6699 #undef TARGET_LITTLE_NAME
6700 #define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
6701
6702 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
6703 objects won't be recognized. */
6704 #undef ELF_OSABI
6705
6706 #undef elf64_bed
6707 #define elf64_bed elf64_x86_64_sol2_bed
6708
6709 /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
6710 boundary. */
6711 #undef elf_backend_static_tls_alignment
6712 #define elf_backend_static_tls_alignment 16
6713
6714 /* The Solaris 2 ABI requires a plt symbol on all platforms.
6715
6716 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
6717 File, p.63. */
6718 #undef elf_backend_want_plt_sym
6719 #define elf_backend_want_plt_sym 1
6720
6721 #include "elf64-target.h"
6722
6723 /* Native Client support. */
6724
6725 static bfd_boolean
6726 elf64_x86_64_nacl_elf_object_p (bfd *abfd)
6727 {
6728 /* Set the right machine number for a NaCl x86-64 ELF64 file. */
6729 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64_nacl);
6730 return TRUE;
6731 }
6732
6733 #undef TARGET_LITTLE_SYM
6734 #define TARGET_LITTLE_SYM x86_64_elf64_nacl_vec
6735 #undef TARGET_LITTLE_NAME
6736 #define TARGET_LITTLE_NAME "elf64-x86-64-nacl"
6737 #undef elf64_bed
6738 #define elf64_bed elf64_x86_64_nacl_bed
6739
6740 #undef ELF_MAXPAGESIZE
6741 #undef ELF_MINPAGESIZE
6742 #undef ELF_COMMONPAGESIZE
6743 #define ELF_MAXPAGESIZE 0x10000
6744 #define ELF_MINPAGESIZE 0x10000
6745 #define ELF_COMMONPAGESIZE 0x10000
6746
6747 /* Restore defaults. */
6748 #undef ELF_OSABI
6749 #undef elf_backend_static_tls_alignment
6750 #undef elf_backend_want_plt_sym
6751 #define elf_backend_want_plt_sym 0
6752
6753 /* NaCl uses substantially different PLT entries for the same effects. */
6754
6755 #undef elf_backend_plt_alignment
6756 #define elf_backend_plt_alignment 5
6757 #define NACL_PLT_ENTRY_SIZE 64
6758 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
6759
6760 static const bfd_byte elf_x86_64_nacl_plt0_entry[NACL_PLT_ENTRY_SIZE] =
6761 {
6762 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
6763 0x4c, 0x8b, 0x1d, 16, 0, 0, 0, /* mov GOT+16(%rip), %r11 */
6764 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
6765 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
6766 0x41, 0xff, 0xe3, /* jmpq *%r11 */
6767
6768 /* 9-byte nop sequence to pad out to the next 32-byte boundary. */
6769 0x66, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw 0x0(%rax,%rax,1) */
6770
6771 /* 32 bytes of nop to pad out to the standard size. */
6772 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
6773 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6774 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
6775 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6776 0x66, /* excess data32 prefix */
6777 0x90 /* nop */
6778 };
6779
6780 static const bfd_byte elf_x86_64_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
6781 {
6782 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, /* mov name@GOTPCREL(%rip),%r11 */
6783 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
6784 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
6785 0x41, 0xff, 0xe3, /* jmpq *%r11 */
6786
6787 /* 15-byte nop sequence to pad out to the next 32-byte boundary. */
6788 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
6789 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6790
6791 /* Lazy GOT entries point here (32-byte aligned). */
6792 0x68, /* pushq immediate */
6793 0, 0, 0, 0, /* replaced with index into relocation table. */
6794 0xe9, /* jmp relative */
6795 0, 0, 0, 0, /* replaced with offset to start of .plt0. */
6796
6797 /* 22 bytes of nop to pad out to the standard size. */
6798 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
6799 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6800 0x0f, 0x1f, 0x80, 0, 0, 0, 0, /* nopl 0x0(%rax) */
6801 };
6802
6803 /* .eh_frame covering the .plt section. */
6804
6805 static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] =
6806 {
6807 #if (PLT_CIE_LENGTH != 20 \
6808 || PLT_FDE_LENGTH != 36 \
6809 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
6810 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
6811 # error "Need elf_x86_64_backend_data parameters for eh_frame_plt offsets!"
6812 #endif
6813 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
6814 0, 0, 0, 0, /* CIE ID */
6815 1, /* CIE version */
6816 'z', 'R', 0, /* Augmentation string */
6817 1, /* Code alignment factor */
6818 0x78, /* Data alignment factor */
6819 16, /* Return address column */
6820 1, /* Augmentation size */
6821 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
6822 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
6823 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
6824 DW_CFA_nop, DW_CFA_nop,
6825
6826 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
6827 PLT_CIE_LENGTH + 8, 0, 0, 0,/* CIE pointer */
6828 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
6829 0, 0, 0, 0, /* .plt size goes here */
6830 0, /* Augmentation size */
6831 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
6832 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
6833 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
6834 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
6835 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
6836 13, /* Block length */
6837 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
6838 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
6839 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
6840 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
6841 DW_CFA_nop, DW_CFA_nop
6842 };
6843
6844 static const struct elf_x86_64_backend_data elf_x86_64_nacl_arch_bed =
6845 {
6846 elf_x86_64_nacl_plt0_entry, /* plt0_entry */
6847 elf_x86_64_nacl_plt_entry, /* plt_entry */
6848 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
6849 2, /* plt0_got1_offset */
6850 9, /* plt0_got2_offset */
6851 13, /* plt0_got2_insn_end */
6852 3, /* plt_got_offset */
6853 33, /* plt_reloc_offset */
6854 38, /* plt_plt_offset */
6855 7, /* plt_got_insn_size */
6856 42, /* plt_plt_insn_end */
6857 32, /* plt_lazy_offset */
6858 elf_x86_64_nacl_eh_frame_plt, /* eh_frame_plt */
6859 sizeof (elf_x86_64_nacl_eh_frame_plt), /* eh_frame_plt_size */
6860 };
6861
6862 #undef elf_backend_arch_data
6863 #define elf_backend_arch_data &elf_x86_64_nacl_arch_bed
6864
6865 #undef elf_backend_object_p
6866 #define elf_backend_object_p elf64_x86_64_nacl_elf_object_p
6867 #undef elf_backend_modify_segment_map
6868 #define elf_backend_modify_segment_map nacl_modify_segment_map
6869 #undef elf_backend_modify_program_headers
6870 #define elf_backend_modify_program_headers nacl_modify_program_headers
6871 #undef elf_backend_final_write_processing
6872 #define elf_backend_final_write_processing nacl_final_write_processing
6873
6874 #include "elf64-target.h"
6875
6876 /* Native Client x32 support. */
6877
6878 static bfd_boolean
6879 elf32_x86_64_nacl_elf_object_p (bfd *abfd)
6880 {
6881 /* Set the right machine number for a NaCl x86-64 ELF32 file. */
6882 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32_nacl);
6883 return TRUE;
6884 }
6885
6886 #undef TARGET_LITTLE_SYM
6887 #define TARGET_LITTLE_SYM x86_64_elf32_nacl_vec
6888 #undef TARGET_LITTLE_NAME
6889 #define TARGET_LITTLE_NAME "elf32-x86-64-nacl"
6890 #undef elf32_bed
6891 #define elf32_bed elf32_x86_64_nacl_bed
6892
6893 #define bfd_elf32_bfd_link_hash_table_create \
6894 elf_x86_64_link_hash_table_create
6895 #define bfd_elf32_bfd_reloc_type_lookup \
6896 elf_x86_64_reloc_type_lookup
6897 #define bfd_elf32_bfd_reloc_name_lookup \
6898 elf_x86_64_reloc_name_lookup
6899 #define bfd_elf32_mkobject \
6900 elf_x86_64_mkobject
6901 #define bfd_elf32_get_synthetic_symtab \
6902 elf_x86_64_get_synthetic_symtab
6903
6904 #undef elf_backend_object_p
6905 #define elf_backend_object_p \
6906 elf32_x86_64_nacl_elf_object_p
6907
6908 #undef elf_backend_bfd_from_remote_memory
6909 #define elf_backend_bfd_from_remote_memory \
6910 _bfd_elf32_bfd_from_remote_memory
6911
6912 #undef elf_backend_size_info
6913 #define elf_backend_size_info \
6914 _bfd_elf32_size_info
6915
6916 #include "elf32-target.h"
6917
6918 /* Restore defaults. */
6919 #undef elf_backend_object_p
6920 #define elf_backend_object_p elf64_x86_64_elf_object_p
6921 #undef elf_backend_bfd_from_remote_memory
6922 #undef elf_backend_size_info
6923 #undef elf_backend_modify_segment_map
6924 #undef elf_backend_modify_program_headers
6925 #undef elf_backend_final_write_processing
6926
6927 /* Intel L1OM support. */
6928
6929 static bfd_boolean
6930 elf64_l1om_elf_object_p (bfd *abfd)
6931 {
6932 /* Set the right machine number for an L1OM elf64 file. */
6933 bfd_default_set_arch_mach (abfd, bfd_arch_l1om, bfd_mach_l1om);
6934 return TRUE;
6935 }
6936
6937 #undef TARGET_LITTLE_SYM
6938 #define TARGET_LITTLE_SYM l1om_elf64_vec
6939 #undef TARGET_LITTLE_NAME
6940 #define TARGET_LITTLE_NAME "elf64-l1om"
6941 #undef ELF_ARCH
6942 #define ELF_ARCH bfd_arch_l1om
6943
6944 #undef ELF_MACHINE_CODE
6945 #define ELF_MACHINE_CODE EM_L1OM
6946
6947 #undef ELF_OSABI
6948
6949 #undef elf64_bed
6950 #define elf64_bed elf64_l1om_bed
6951
6952 #undef elf_backend_object_p
6953 #define elf_backend_object_p elf64_l1om_elf_object_p
6954
6955 /* Restore defaults. */
6956 #undef ELF_MAXPAGESIZE
6957 #undef ELF_MINPAGESIZE
6958 #undef ELF_COMMONPAGESIZE
6959 #define ELF_MAXPAGESIZE 0x200000
6960 #define ELF_MINPAGESIZE 0x1000
6961 #define ELF_COMMONPAGESIZE 0x1000
6962 #undef elf_backend_plt_alignment
6963 #define elf_backend_plt_alignment 4
6964 #undef elf_backend_arch_data
6965 #define elf_backend_arch_data &elf_x86_64_arch_bed
6966
6967 #include "elf64-target.h"
6968
6969 /* FreeBSD L1OM support. */
6970
6971 #undef TARGET_LITTLE_SYM
6972 #define TARGET_LITTLE_SYM l1om_elf64_fbsd_vec
6973 #undef TARGET_LITTLE_NAME
6974 #define TARGET_LITTLE_NAME "elf64-l1om-freebsd"
6975
6976 #undef ELF_OSABI
6977 #define ELF_OSABI ELFOSABI_FREEBSD
6978
6979 #undef elf64_bed
6980 #define elf64_bed elf64_l1om_fbsd_bed
6981
6982 #include "elf64-target.h"
6983
6984 /* Intel K1OM support. */
6985
6986 static bfd_boolean
6987 elf64_k1om_elf_object_p (bfd *abfd)
6988 {
6989 /* Set the right machine number for an K1OM elf64 file. */
6990 bfd_default_set_arch_mach (abfd, bfd_arch_k1om, bfd_mach_k1om);
6991 return TRUE;
6992 }
6993
6994 #undef TARGET_LITTLE_SYM
6995 #define TARGET_LITTLE_SYM k1om_elf64_vec
6996 #undef TARGET_LITTLE_NAME
6997 #define TARGET_LITTLE_NAME "elf64-k1om"
6998 #undef ELF_ARCH
6999 #define ELF_ARCH bfd_arch_k1om
7000
7001 #undef ELF_MACHINE_CODE
7002 #define ELF_MACHINE_CODE EM_K1OM
7003
7004 #undef ELF_OSABI
7005
7006 #undef elf64_bed
7007 #define elf64_bed elf64_k1om_bed
7008
7009 #undef elf_backend_object_p
7010 #define elf_backend_object_p elf64_k1om_elf_object_p
7011
7012 #undef elf_backend_static_tls_alignment
7013
7014 #undef elf_backend_want_plt_sym
7015 #define elf_backend_want_plt_sym 0
7016
7017 #include "elf64-target.h"
7018
7019 /* FreeBSD K1OM support. */
7020
7021 #undef TARGET_LITTLE_SYM
7022 #define TARGET_LITTLE_SYM k1om_elf64_fbsd_vec
7023 #undef TARGET_LITTLE_NAME
7024 #define TARGET_LITTLE_NAME "elf64-k1om-freebsd"
7025
7026 #undef ELF_OSABI
7027 #define ELF_OSABI ELFOSABI_FREEBSD
7028
7029 #undef elf64_bed
7030 #define elf64_bed elf64_k1om_fbsd_bed
7031
7032 #include "elf64-target.h"
7033
7034 /* 32bit x86-64 support. */
7035
7036 #undef TARGET_LITTLE_SYM
7037 #define TARGET_LITTLE_SYM x86_64_elf32_vec
7038 #undef TARGET_LITTLE_NAME
7039 #define TARGET_LITTLE_NAME "elf32-x86-64"
7040 #undef elf32_bed
7041
7042 #undef ELF_ARCH
7043 #define ELF_ARCH bfd_arch_i386
7044
7045 #undef ELF_MACHINE_CODE
7046 #define ELF_MACHINE_CODE EM_X86_64
7047
7048 #undef ELF_OSABI
7049
7050 #undef elf_backend_object_p
7051 #define elf_backend_object_p \
7052 elf32_x86_64_elf_object_p
7053
7054 #undef elf_backend_bfd_from_remote_memory
7055 #define elf_backend_bfd_from_remote_memory \
7056 _bfd_elf32_bfd_from_remote_memory
7057
7058 #undef elf_backend_size_info
7059 #define elf_backend_size_info \
7060 _bfd_elf32_size_info
7061
7062 #include "elf32-target.h"
This page took 0.338491 seconds and 4 git commands to generate.