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