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