6819b34c5af1a141335b8caa915e10e4d023397e
[deliverable/binutils-gdb.git] / bfd / elf64-x86-64.c
1 /* X86-64 specific support for 64-bit ELF
2 Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Contributed by Jan Hubicka <jh@suse.cz>.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "bfdlink.h"
26 #include "libbfd.h"
27 #include "elf-bfd.h"
28 #include "bfd_stdint.h"
29
30 #include "elf/x86-64.h"
31
32 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
33 #define MINUS_ONE (~ (bfd_vma) 0)
34
35 /* The relocation "howto" table. Order of fields:
36 type, rightshift, size, bitsize, pc_relative, bitpos, complain_on_overflow,
37 special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset. */
38 static reloc_howto_type x86_64_elf_howto_table[] =
39 {
40 HOWTO(R_X86_64_NONE, 0, 0, 0, FALSE, 0, complain_overflow_dont,
41 bfd_elf_generic_reloc, "R_X86_64_NONE", FALSE, 0x00000000, 0x00000000,
42 FALSE),
43 HOWTO(R_X86_64_64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
44 bfd_elf_generic_reloc, "R_X86_64_64", FALSE, MINUS_ONE, MINUS_ONE,
45 FALSE),
46 HOWTO(R_X86_64_PC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
47 bfd_elf_generic_reloc, "R_X86_64_PC32", FALSE, 0xffffffff, 0xffffffff,
48 TRUE),
49 HOWTO(R_X86_64_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
50 bfd_elf_generic_reloc, "R_X86_64_GOT32", FALSE, 0xffffffff, 0xffffffff,
51 FALSE),
52 HOWTO(R_X86_64_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
53 bfd_elf_generic_reloc, "R_X86_64_PLT32", FALSE, 0xffffffff, 0xffffffff,
54 TRUE),
55 HOWTO(R_X86_64_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
56 bfd_elf_generic_reloc, "R_X86_64_COPY", FALSE, 0xffffffff, 0xffffffff,
57 FALSE),
58 HOWTO(R_X86_64_GLOB_DAT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
59 bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", FALSE, MINUS_ONE,
60 MINUS_ONE, FALSE),
61 HOWTO(R_X86_64_JUMP_SLOT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
62 bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", FALSE, MINUS_ONE,
63 MINUS_ONE, FALSE),
64 HOWTO(R_X86_64_RELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
65 bfd_elf_generic_reloc, "R_X86_64_RELATIVE", FALSE, MINUS_ONE,
66 MINUS_ONE, FALSE),
67 HOWTO(R_X86_64_GOTPCREL, 0, 2, 32, TRUE, 0, complain_overflow_signed,
68 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", FALSE, 0xffffffff,
69 0xffffffff, TRUE),
70 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
71 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
72 FALSE),
73 HOWTO(R_X86_64_32S, 0, 2, 32, FALSE, 0, complain_overflow_signed,
74 bfd_elf_generic_reloc, "R_X86_64_32S", FALSE, 0xffffffff, 0xffffffff,
75 FALSE),
76 HOWTO(R_X86_64_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
77 bfd_elf_generic_reloc, "R_X86_64_16", FALSE, 0xffff, 0xffff, FALSE),
78 HOWTO(R_X86_64_PC16,0, 1, 16, TRUE, 0, complain_overflow_bitfield,
79 bfd_elf_generic_reloc, "R_X86_64_PC16", FALSE, 0xffff, 0xffff, TRUE),
80 HOWTO(R_X86_64_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
81 bfd_elf_generic_reloc, "R_X86_64_8", FALSE, 0xff, 0xff, FALSE),
82 HOWTO(R_X86_64_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
83 bfd_elf_generic_reloc, "R_X86_64_PC8", FALSE, 0xff, 0xff, TRUE),
84 HOWTO(R_X86_64_DTPMOD64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
85 bfd_elf_generic_reloc, "R_X86_64_DTPMOD64", FALSE, MINUS_ONE,
86 MINUS_ONE, FALSE),
87 HOWTO(R_X86_64_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
88 bfd_elf_generic_reloc, "R_X86_64_DTPOFF64", FALSE, MINUS_ONE,
89 MINUS_ONE, FALSE),
90 HOWTO(R_X86_64_TPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
91 bfd_elf_generic_reloc, "R_X86_64_TPOFF64", FALSE, MINUS_ONE,
92 MINUS_ONE, FALSE),
93 HOWTO(R_X86_64_TLSGD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
94 bfd_elf_generic_reloc, "R_X86_64_TLSGD", FALSE, 0xffffffff,
95 0xffffffff, TRUE),
96 HOWTO(R_X86_64_TLSLD, 0, 2, 32, TRUE, 0, complain_overflow_signed,
97 bfd_elf_generic_reloc, "R_X86_64_TLSLD", FALSE, 0xffffffff,
98 0xffffffff, TRUE),
99 HOWTO(R_X86_64_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
100 bfd_elf_generic_reloc, "R_X86_64_DTPOFF32", FALSE, 0xffffffff,
101 0xffffffff, FALSE),
102 HOWTO(R_X86_64_GOTTPOFF, 0, 2, 32, TRUE, 0, complain_overflow_signed,
103 bfd_elf_generic_reloc, "R_X86_64_GOTTPOFF", FALSE, 0xffffffff,
104 0xffffffff, TRUE),
105 HOWTO(R_X86_64_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
106 bfd_elf_generic_reloc, "R_X86_64_TPOFF32", FALSE, 0xffffffff,
107 0xffffffff, FALSE),
108 HOWTO(R_X86_64_PC64, 0, 4, 64, TRUE, 0, complain_overflow_bitfield,
109 bfd_elf_generic_reloc, "R_X86_64_PC64", FALSE, MINUS_ONE, MINUS_ONE,
110 TRUE),
111 HOWTO(R_X86_64_GOTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
112 bfd_elf_generic_reloc, "R_X86_64_GOTOFF64",
113 FALSE, MINUS_ONE, MINUS_ONE, FALSE),
114 HOWTO(R_X86_64_GOTPC32, 0, 2, 32, TRUE, 0, complain_overflow_signed,
115 bfd_elf_generic_reloc, "R_X86_64_GOTPC32",
116 FALSE, 0xffffffff, 0xffffffff, TRUE),
117 HOWTO(R_X86_64_GOT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
118 bfd_elf_generic_reloc, "R_X86_64_GOT64", FALSE, MINUS_ONE, MINUS_ONE,
119 FALSE),
120 HOWTO(R_X86_64_GOTPCREL64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
121 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL64", FALSE, MINUS_ONE,
122 MINUS_ONE, TRUE),
123 HOWTO(R_X86_64_GOTPC64, 0, 4, 64, TRUE, 0, complain_overflow_signed,
124 bfd_elf_generic_reloc, "R_X86_64_GOTPC64",
125 FALSE, MINUS_ONE, MINUS_ONE, TRUE),
126 HOWTO(R_X86_64_GOTPLT64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
127 bfd_elf_generic_reloc, "R_X86_64_GOTPLT64", FALSE, MINUS_ONE,
128 MINUS_ONE, FALSE),
129 HOWTO(R_X86_64_PLTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_signed,
130 bfd_elf_generic_reloc, "R_X86_64_PLTOFF64", FALSE, MINUS_ONE,
131 MINUS_ONE, FALSE),
132 EMPTY_HOWTO (32),
133 EMPTY_HOWTO (33),
134 HOWTO(R_X86_64_GOTPC32_TLSDESC, 0, 2, 32, TRUE, 0,
135 complain_overflow_bitfield, bfd_elf_generic_reloc,
136 "R_X86_64_GOTPC32_TLSDESC",
137 FALSE, 0xffffffff, 0xffffffff, TRUE),
138 HOWTO(R_X86_64_TLSDESC_CALL, 0, 0, 0, FALSE, 0,
139 complain_overflow_dont, bfd_elf_generic_reloc,
140 "R_X86_64_TLSDESC_CALL",
141 FALSE, 0, 0, FALSE),
142 HOWTO(R_X86_64_TLSDESC, 0, 4, 64, FALSE, 0,
143 complain_overflow_bitfield, bfd_elf_generic_reloc,
144 "R_X86_64_TLSDESC",
145 FALSE, MINUS_ONE, MINUS_ONE, FALSE),
146 HOWTO(R_X86_64_IRELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
147 bfd_elf_generic_reloc, "R_X86_64_IRELATIVE", FALSE, MINUS_ONE,
148 MINUS_ONE, FALSE),
149
150 /* We have a gap in the reloc numbers here.
151 R_X86_64_standard counts the number up to this point, and
152 R_X86_64_vt_offset is the value to subtract from a reloc type of
153 R_X86_64_GNU_VT* to form an index into this table. */
154 #define R_X86_64_standard (R_X86_64_IRELATIVE + 1)
155 #define R_X86_64_vt_offset (R_X86_64_GNU_VTINHERIT - R_X86_64_standard)
156
157 /* GNU extension to record C++ vtable hierarchy. */
158 HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, FALSE, 0, complain_overflow_dont,
159 NULL, "R_X86_64_GNU_VTINHERIT", FALSE, 0, 0, FALSE),
160
161 /* GNU extension to record C++ vtable member usage. */
162 HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, FALSE, 0, complain_overflow_dont,
163 _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", FALSE, 0, 0,
164 FALSE)
165 };
166
167 #define IS_X86_64_PCREL_TYPE(TYPE) \
168 ( ((TYPE) == R_X86_64_PC8) \
169 || ((TYPE) == R_X86_64_PC16) \
170 || ((TYPE) == R_X86_64_PC32) \
171 || ((TYPE) == R_X86_64_PC64))
172
173 /* Map BFD relocs to the x86_64 elf relocs. */
174 struct elf_reloc_map
175 {
176 bfd_reloc_code_real_type bfd_reloc_val;
177 unsigned char elf_reloc_val;
178 };
179
180 static const struct elf_reloc_map x86_64_reloc_map[] =
181 {
182 { BFD_RELOC_NONE, R_X86_64_NONE, },
183 { BFD_RELOC_64, R_X86_64_64, },
184 { BFD_RELOC_32_PCREL, R_X86_64_PC32, },
185 { BFD_RELOC_X86_64_GOT32, R_X86_64_GOT32,},
186 { BFD_RELOC_X86_64_PLT32, R_X86_64_PLT32,},
187 { BFD_RELOC_X86_64_COPY, R_X86_64_COPY, },
188 { BFD_RELOC_X86_64_GLOB_DAT, R_X86_64_GLOB_DAT, },
189 { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, },
190 { BFD_RELOC_X86_64_RELATIVE, R_X86_64_RELATIVE, },
191 { BFD_RELOC_X86_64_GOTPCREL, R_X86_64_GOTPCREL, },
192 { BFD_RELOC_32, R_X86_64_32, },
193 { BFD_RELOC_X86_64_32S, R_X86_64_32S, },
194 { BFD_RELOC_16, R_X86_64_16, },
195 { BFD_RELOC_16_PCREL, R_X86_64_PC16, },
196 { BFD_RELOC_8, R_X86_64_8, },
197 { BFD_RELOC_8_PCREL, R_X86_64_PC8, },
198 { BFD_RELOC_X86_64_DTPMOD64, R_X86_64_DTPMOD64, },
199 { BFD_RELOC_X86_64_DTPOFF64, R_X86_64_DTPOFF64, },
200 { BFD_RELOC_X86_64_TPOFF64, R_X86_64_TPOFF64, },
201 { BFD_RELOC_X86_64_TLSGD, R_X86_64_TLSGD, },
202 { BFD_RELOC_X86_64_TLSLD, R_X86_64_TLSLD, },
203 { BFD_RELOC_X86_64_DTPOFF32, R_X86_64_DTPOFF32, },
204 { BFD_RELOC_X86_64_GOTTPOFF, R_X86_64_GOTTPOFF, },
205 { BFD_RELOC_X86_64_TPOFF32, R_X86_64_TPOFF32, },
206 { BFD_RELOC_64_PCREL, R_X86_64_PC64, },
207 { BFD_RELOC_X86_64_GOTOFF64, R_X86_64_GOTOFF64, },
208 { BFD_RELOC_X86_64_GOTPC32, R_X86_64_GOTPC32, },
209 { BFD_RELOC_X86_64_GOT64, R_X86_64_GOT64, },
210 { BFD_RELOC_X86_64_GOTPCREL64,R_X86_64_GOTPCREL64, },
211 { BFD_RELOC_X86_64_GOTPC64, R_X86_64_GOTPC64, },
212 { BFD_RELOC_X86_64_GOTPLT64, R_X86_64_GOTPLT64, },
213 { BFD_RELOC_X86_64_PLTOFF64, R_X86_64_PLTOFF64, },
214 { BFD_RELOC_X86_64_GOTPC32_TLSDESC, R_X86_64_GOTPC32_TLSDESC, },
215 { BFD_RELOC_X86_64_TLSDESC_CALL, R_X86_64_TLSDESC_CALL, },
216 { BFD_RELOC_X86_64_TLSDESC, R_X86_64_TLSDESC, },
217 { BFD_RELOC_X86_64_IRELATIVE, R_X86_64_IRELATIVE, },
218 { BFD_RELOC_VTABLE_INHERIT, R_X86_64_GNU_VTINHERIT, },
219 { BFD_RELOC_VTABLE_ENTRY, R_X86_64_GNU_VTENTRY, },
220 };
221
222 static reloc_howto_type *
223 elf64_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type)
224 {
225 unsigned i;
226
227 if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT
228 || r_type >= (unsigned int) R_X86_64_max)
229 {
230 if (r_type >= (unsigned int) R_X86_64_standard)
231 {
232 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
233 abfd, (int) r_type);
234 r_type = R_X86_64_NONE;
235 }
236 i = r_type;
237 }
238 else
239 i = r_type - (unsigned int) R_X86_64_vt_offset;
240 BFD_ASSERT (x86_64_elf_howto_table[i].type == r_type);
241 return &x86_64_elf_howto_table[i];
242 }
243
244 /* Given a BFD reloc type, return a HOWTO structure. */
245 static reloc_howto_type *
246 elf64_x86_64_reloc_type_lookup (bfd *abfd,
247 bfd_reloc_code_real_type code)
248 {
249 unsigned int i;
250
251 for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
252 i++)
253 {
254 if (x86_64_reloc_map[i].bfd_reloc_val == code)
255 return elf64_x86_64_rtype_to_howto (abfd,
256 x86_64_reloc_map[i].elf_reloc_val);
257 }
258 return 0;
259 }
260
261 static reloc_howto_type *
262 elf64_x86_64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
263 const char *r_name)
264 {
265 unsigned int i;
266
267 for (i = 0;
268 i < (sizeof (x86_64_elf_howto_table)
269 / sizeof (x86_64_elf_howto_table[0]));
270 i++)
271 if (x86_64_elf_howto_table[i].name != NULL
272 && strcasecmp (x86_64_elf_howto_table[i].name, r_name) == 0)
273 return &x86_64_elf_howto_table[i];
274
275 return NULL;
276 }
277
278 /* Given an x86_64 ELF reloc type, fill in an arelent structure. */
279
280 static void
281 elf64_x86_64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
282 Elf_Internal_Rela *dst)
283 {
284 unsigned r_type;
285
286 r_type = ELF64_R_TYPE (dst->r_info);
287 cache_ptr->howto = elf64_x86_64_rtype_to_howto (abfd, r_type);
288 BFD_ASSERT (r_type == cache_ptr->howto->type);
289 }
290 \f
291 /* Support for core dump NOTE sections. */
292 static bfd_boolean
293 elf64_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
294 {
295 int offset;
296 size_t size;
297
298 switch (note->descsz)
299 {
300 default:
301 return FALSE;
302
303 case 336: /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
304 /* pr_cursig */
305 elf_tdata (abfd)->core_signal
306 = bfd_get_16 (abfd, note->descdata + 12);
307
308 /* pr_pid */
309 elf_tdata (abfd)->core_pid
310 = bfd_get_32 (abfd, note->descdata + 32);
311
312 /* pr_reg */
313 offset = 112;
314 size = 216;
315
316 break;
317 }
318
319 /* Make a ".reg/999" section. */
320 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
321 size, note->descpos + offset);
322 }
323
324 static bfd_boolean
325 elf64_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
326 {
327 switch (note->descsz)
328 {
329 default:
330 return FALSE;
331
332 case 136: /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
333 elf_tdata (abfd)->core_program
334 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
335 elf_tdata (abfd)->core_command
336 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
337 }
338
339 /* Note that for some reason, a spurious space is tacked
340 onto the end of the args in some (at least one anyway)
341 implementations, so strip it off if it exists. */
342
343 {
344 char *command = elf_tdata (abfd)->core_command;
345 int n = strlen (command);
346
347 if (0 < n && command[n - 1] == ' ')
348 command[n - 1] = '\0';
349 }
350
351 return TRUE;
352 }
353 \f
354 /* Functions for the x86-64 ELF linker. */
355
356 /* The name of the dynamic interpreter. This is put in the .interp
357 section. */
358
359 #define ELF_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
360
361 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
362 copying dynamic variables from a shared lib into an app's dynbss
363 section, and instead use a dynamic relocation to point into the
364 shared lib. */
365 #define ELIMINATE_COPY_RELOCS 1
366
367 /* The size in bytes of an entry in the global offset table. */
368
369 #define GOT_ENTRY_SIZE 8
370
371 /* The size in bytes of an entry in the procedure linkage table. */
372
373 #define PLT_ENTRY_SIZE 16
374
375 /* The first entry in a procedure linkage table looks like this. See the
376 SVR4 ABI i386 supplement and the x86-64 ABI to see how this works. */
377
378 static const bfd_byte elf64_x86_64_plt0_entry[PLT_ENTRY_SIZE] =
379 {
380 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
381 0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */
382 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */
383 };
384
385 /* Subsequent entries in a procedure linkage table look like this. */
386
387 static const bfd_byte elf64_x86_64_plt_entry[PLT_ENTRY_SIZE] =
388 {
389 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
390 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
391 0x68, /* pushq immediate */
392 0, 0, 0, 0, /* replaced with index into relocation table. */
393 0xe9, /* jmp relative */
394 0, 0, 0, 0 /* replaced with offset to start of .plt0. */
395 };
396
397 /* The x86-64 linker needs to keep track of the number of relocs that
398 it decides to copy as dynamic relocs in check_relocs for each symbol.
399 This is so that it can later discard them if they are found to be
400 unnecessary. We store the information in a field extending the
401 regular ELF linker hash table. */
402
403 struct elf64_x86_64_dyn_relocs
404 {
405 /* Next section. */
406 struct elf64_x86_64_dyn_relocs *next;
407
408 /* The input section of the reloc. */
409 asection *sec;
410
411 /* Total number of relocs copied for the input section. */
412 bfd_size_type count;
413
414 /* Number of pc-relative relocs copied for the input section. */
415 bfd_size_type pc_count;
416 };
417
418 /* x86-64 ELF linker hash entry. */
419
420 struct elf64_x86_64_link_hash_entry
421 {
422 struct elf_link_hash_entry elf;
423
424 /* Track dynamic relocs copied for this symbol. */
425 struct elf64_x86_64_dyn_relocs *dyn_relocs;
426
427 #define GOT_UNKNOWN 0
428 #define GOT_NORMAL 1
429 #define GOT_TLS_GD 2
430 #define GOT_TLS_IE 3
431 #define GOT_TLS_GDESC 4
432 #define GOT_TLS_GD_BOTH_P(type) \
433 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
434 #define GOT_TLS_GD_P(type) \
435 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
436 #define GOT_TLS_GDESC_P(type) \
437 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
438 #define GOT_TLS_GD_ANY_P(type) \
439 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
440 unsigned char tls_type;
441
442 /* Offset of the GOTPLT entry reserved for the TLS descriptor,
443 starting at the end of the jump table. */
444 bfd_vma tlsdesc_got;
445 };
446
447 #define elf64_x86_64_hash_entry(ent) \
448 ((struct elf64_x86_64_link_hash_entry *)(ent))
449
450 struct elf64_x86_64_obj_tdata
451 {
452 struct elf_obj_tdata root;
453
454 /* tls_type for each local got entry. */
455 char *local_got_tls_type;
456
457 /* GOTPLT entries for TLS descriptors. */
458 bfd_vma *local_tlsdesc_gotent;
459 };
460
461 #define elf64_x86_64_tdata(abfd) \
462 ((struct elf64_x86_64_obj_tdata *) (abfd)->tdata.any)
463
464 #define elf64_x86_64_local_got_tls_type(abfd) \
465 (elf64_x86_64_tdata (abfd)->local_got_tls_type)
466
467 #define elf64_x86_64_local_tlsdesc_gotent(abfd) \
468 (elf64_x86_64_tdata (abfd)->local_tlsdesc_gotent)
469
470 #define is_x86_64_elf(bfd) \
471 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
472 && elf_tdata (bfd) != NULL \
473 && elf_object_id (bfd) == X86_64_ELF_TDATA)
474
475 static bfd_boolean
476 elf64_x86_64_mkobject (bfd *abfd)
477 {
478 return bfd_elf_allocate_object (abfd, sizeof (struct elf64_x86_64_obj_tdata),
479 X86_64_ELF_TDATA);
480 }
481
482 /* x86-64 ELF linker hash table. */
483
484 struct elf64_x86_64_link_hash_table
485 {
486 struct elf_link_hash_table elf;
487
488 /* Short-cuts to get to dynamic linker sections. */
489 asection *sgot;
490 asection *sgotplt;
491 asection *srelgot;
492 asection *splt;
493 asection *srelplt;
494 asection *sdynbss;
495 asection *srelbss;
496 asection *igotplt;
497 asection *iplt;
498 asection *irelplt;
499 asection *irelifunc;
500
501 /* The offset into splt of the PLT entry for the TLS descriptor
502 resolver. Special values are 0, if not necessary (or not found
503 to be necessary yet), and -1 if needed but not determined
504 yet. */
505 bfd_vma tlsdesc_plt;
506 /* The offset into sgot of the GOT entry used by the PLT entry
507 above. */
508 bfd_vma tlsdesc_got;
509
510 union {
511 bfd_signed_vma refcount;
512 bfd_vma offset;
513 } tls_ld_got;
514
515 /* The amount of space used by the jump slots in the GOT. */
516 bfd_vma sgotplt_jump_table_size;
517
518 /* Small local sym to section mapping cache. */
519 struct sym_sec_cache sym_sec;
520
521 /* _TLS_MODULE_BASE_ symbol. */
522 struct bfd_link_hash_entry *tls_module_base;
523 };
524
525 /* Get the x86-64 ELF linker hash table from a link_info structure. */
526
527 #define elf64_x86_64_hash_table(p) \
528 ((struct elf64_x86_64_link_hash_table *) ((p)->hash))
529
530 #define elf64_x86_64_compute_jump_table_size(htab) \
531 ((htab)->srelplt->reloc_count * GOT_ENTRY_SIZE)
532
533 /* Create an entry in an x86-64 ELF linker hash table. */
534
535 static struct bfd_hash_entry *
536 elf64_x86_64_link_hash_newfunc (struct bfd_hash_entry *entry,
537 struct bfd_hash_table *table,
538 const char *string)
539 {
540 /* Allocate the structure if it has not already been allocated by a
541 subclass. */
542 if (entry == NULL)
543 {
544 entry = bfd_hash_allocate (table,
545 sizeof (struct elf64_x86_64_link_hash_entry));
546 if (entry == NULL)
547 return entry;
548 }
549
550 /* Call the allocation method of the superclass. */
551 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
552 if (entry != NULL)
553 {
554 struct elf64_x86_64_link_hash_entry *eh;
555
556 eh = (struct elf64_x86_64_link_hash_entry *) entry;
557 eh->dyn_relocs = NULL;
558 eh->tls_type = GOT_UNKNOWN;
559 eh->tlsdesc_got = (bfd_vma) -1;
560 }
561
562 return entry;
563 }
564
565 /* Create an X86-64 ELF linker hash table. */
566
567 static struct bfd_link_hash_table *
568 elf64_x86_64_link_hash_table_create (bfd *abfd)
569 {
570 struct elf64_x86_64_link_hash_table *ret;
571 bfd_size_type amt = sizeof (struct elf64_x86_64_link_hash_table);
572
573 ret = (struct elf64_x86_64_link_hash_table *) bfd_malloc (amt);
574 if (ret == NULL)
575 return NULL;
576
577 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
578 elf64_x86_64_link_hash_newfunc,
579 sizeof (struct elf64_x86_64_link_hash_entry)))
580 {
581 free (ret);
582 return NULL;
583 }
584
585 ret->sgot = NULL;
586 ret->sgotplt = NULL;
587 ret->srelgot = NULL;
588 ret->splt = NULL;
589 ret->srelplt = NULL;
590 ret->sdynbss = NULL;
591 ret->srelbss = NULL;
592 ret->igotplt= NULL;
593 ret->iplt = NULL;
594 ret->irelplt= NULL;
595 ret->irelifunc = NULL;
596 ret->sym_sec.abfd = NULL;
597 ret->tlsdesc_plt = 0;
598 ret->tlsdesc_got = 0;
599 ret->tls_ld_got.refcount = 0;
600 ret->sgotplt_jump_table_size = 0;
601 ret->tls_module_base = NULL;
602
603 return &ret->elf.root;
604 }
605
606 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
607 shortcuts to them in our hash table. */
608
609 static bfd_boolean
610 elf64_x86_64_create_got_section (bfd *dynobj, struct bfd_link_info *info)
611 {
612 struct elf64_x86_64_link_hash_table *htab;
613
614 if (! _bfd_elf_create_got_section (dynobj, info))
615 return FALSE;
616
617 htab = elf64_x86_64_hash_table (info);
618 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
619 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
620 if (!htab->sgot || !htab->sgotplt)
621 abort ();
622
623 htab->srelgot = bfd_make_section_with_flags (dynobj, ".rela.got",
624 (SEC_ALLOC | SEC_LOAD
625 | SEC_HAS_CONTENTS
626 | SEC_IN_MEMORY
627 | SEC_LINKER_CREATED
628 | SEC_READONLY));
629 if (htab->srelgot == NULL
630 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3))
631 return FALSE;
632 return TRUE;
633 }
634
635 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
636 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
637 hash table. */
638
639 static bfd_boolean
640 elf64_x86_64_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
641 {
642 struct elf64_x86_64_link_hash_table *htab;
643
644 htab = elf64_x86_64_hash_table (info);
645 if (!htab->sgot && !elf64_x86_64_create_got_section (dynobj, info))
646 return FALSE;
647
648 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
649 return FALSE;
650
651 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
652 htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
653 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
654 if (!info->shared)
655 htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
656
657 if (!htab->splt || !htab->srelplt || !htab->sdynbss
658 || (!info->shared && !htab->srelbss))
659 abort ();
660
661 return TRUE;
662 }
663
664 /* Copy the extra info we tack onto an elf_link_hash_entry. */
665
666 static void
667 elf64_x86_64_copy_indirect_symbol (struct bfd_link_info *info,
668 struct elf_link_hash_entry *dir,
669 struct elf_link_hash_entry *ind)
670 {
671 struct elf64_x86_64_link_hash_entry *edir, *eind;
672
673 edir = (struct elf64_x86_64_link_hash_entry *) dir;
674 eind = (struct elf64_x86_64_link_hash_entry *) ind;
675
676 if (eind->dyn_relocs != NULL)
677 {
678 if (edir->dyn_relocs != NULL)
679 {
680 struct elf64_x86_64_dyn_relocs **pp;
681 struct elf64_x86_64_dyn_relocs *p;
682
683 /* Add reloc counts against the indirect sym to the direct sym
684 list. Merge any entries against the same section. */
685 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
686 {
687 struct elf64_x86_64_dyn_relocs *q;
688
689 for (q = edir->dyn_relocs; q != NULL; q = q->next)
690 if (q->sec == p->sec)
691 {
692 q->pc_count += p->pc_count;
693 q->count += p->count;
694 *pp = p->next;
695 break;
696 }
697 if (q == NULL)
698 pp = &p->next;
699 }
700 *pp = edir->dyn_relocs;
701 }
702
703 edir->dyn_relocs = eind->dyn_relocs;
704 eind->dyn_relocs = NULL;
705 }
706
707 if (ind->root.type == bfd_link_hash_indirect
708 && dir->got.refcount <= 0)
709 {
710 edir->tls_type = eind->tls_type;
711 eind->tls_type = GOT_UNKNOWN;
712 }
713
714 if (ELIMINATE_COPY_RELOCS
715 && ind->root.type != bfd_link_hash_indirect
716 && dir->dynamic_adjusted)
717 {
718 /* If called to transfer flags for a weakdef during processing
719 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
720 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
721 dir->ref_dynamic |= ind->ref_dynamic;
722 dir->ref_regular |= ind->ref_regular;
723 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
724 dir->needs_plt |= ind->needs_plt;
725 dir->pointer_equality_needed |= ind->pointer_equality_needed;
726 }
727 else
728 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
729 }
730
731 static bfd_boolean
732 elf64_x86_64_elf_object_p (bfd *abfd)
733 {
734 /* Set the right machine number for an x86-64 elf64 file. */
735 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
736 return TRUE;
737 }
738
739 typedef union
740 {
741 unsigned char c[2];
742 uint16_t i;
743 }
744 x86_64_opcode16;
745
746 typedef union
747 {
748 unsigned char c[4];
749 uint32_t i;
750 }
751 x86_64_opcode32;
752
753 /* Return TRUE if the TLS access code sequence support transition
754 from R_TYPE. */
755
756 static bfd_boolean
757 elf64_x86_64_check_tls_transition (bfd *abfd, asection *sec,
758 bfd_byte *contents,
759 Elf_Internal_Shdr *symtab_hdr,
760 struct elf_link_hash_entry **sym_hashes,
761 unsigned int r_type,
762 const Elf_Internal_Rela *rel,
763 const Elf_Internal_Rela *relend)
764 {
765 unsigned int val;
766 unsigned long r_symndx;
767 struct elf_link_hash_entry *h;
768 bfd_vma offset;
769
770 /* Get the section contents. */
771 if (contents == NULL)
772 {
773 if (elf_section_data (sec)->this_hdr.contents != NULL)
774 contents = elf_section_data (sec)->this_hdr.contents;
775 else
776 {
777 /* FIXME: How to better handle error condition? */
778 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
779 return FALSE;
780
781 /* Cache the section contents for elf_link_input_bfd. */
782 elf_section_data (sec)->this_hdr.contents = contents;
783 }
784 }
785
786 offset = rel->r_offset;
787 switch (r_type)
788 {
789 case R_X86_64_TLSGD:
790 case R_X86_64_TLSLD:
791 if ((rel + 1) >= relend)
792 return FALSE;
793
794 if (r_type == R_X86_64_TLSGD)
795 {
796 /* Check transition from GD access model. Only
797 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
798 .word 0x6666; rex64; call __tls_get_addr
799 can transit to different access model. */
800
801 static x86_64_opcode32 leaq = { { 0x66, 0x48, 0x8d, 0x3d } },
802 call = { { 0x66, 0x66, 0x48, 0xe8 } };
803 if (offset < 4
804 || (offset + 12) > sec->size
805 || bfd_get_32 (abfd, contents + offset - 4) != leaq.i
806 || bfd_get_32 (abfd, contents + offset + 4) != call.i)
807 return FALSE;
808 }
809 else
810 {
811 /* Check transition from LD access model. Only
812 leaq foo@tlsld(%rip), %rdi;
813 call __tls_get_addr
814 can transit to different access model. */
815
816 static x86_64_opcode32 ld = { { 0x48, 0x8d, 0x3d, 0xe8 } };
817 x86_64_opcode32 op;
818
819 if (offset < 3 || (offset + 9) > sec->size)
820 return FALSE;
821
822 op.i = bfd_get_32 (abfd, contents + offset - 3);
823 op.c[3] = bfd_get_8 (abfd, contents + offset + 4);
824 if (op.i != ld.i)
825 return FALSE;
826 }
827
828 r_symndx = ELF64_R_SYM (rel[1].r_info);
829 if (r_symndx < symtab_hdr->sh_info)
830 return FALSE;
831
832 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
833 /* Use strncmp to check __tls_get_addr since __tls_get_addr
834 may be versioned. */
835 return (h != NULL
836 && h->root.root.string != NULL
837 && (ELF64_R_TYPE (rel[1].r_info) == R_X86_64_PC32
838 || ELF64_R_TYPE (rel[1].r_info) == R_X86_64_PLT32)
839 && (strncmp (h->root.root.string,
840 "__tls_get_addr", 14) == 0));
841
842 case R_X86_64_GOTTPOFF:
843 /* Check transition from IE access model:
844 movq foo@gottpoff(%rip), %reg
845 addq foo@gottpoff(%rip), %reg
846 */
847
848 if (offset < 3 || (offset + 4) > sec->size)
849 return FALSE;
850
851 val = bfd_get_8 (abfd, contents + offset - 3);
852 if (val != 0x48 && val != 0x4c)
853 return FALSE;
854
855 val = bfd_get_8 (abfd, contents + offset - 2);
856 if (val != 0x8b && val != 0x03)
857 return FALSE;
858
859 val = bfd_get_8 (abfd, contents + offset - 1);
860 return (val & 0xc7) == 5;
861
862 case R_X86_64_GOTPC32_TLSDESC:
863 /* Check transition from GDesc access model:
864 leaq x@tlsdesc(%rip), %rax
865
866 Make sure it's a leaq adding rip to a 32-bit offset
867 into any register, although it's probably almost always
868 going to be rax. */
869
870 if (offset < 3 || (offset + 4) > sec->size)
871 return FALSE;
872
873 val = bfd_get_8 (abfd, contents + offset - 3);
874 if ((val & 0xfb) != 0x48)
875 return FALSE;
876
877 if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
878 return FALSE;
879
880 val = bfd_get_8 (abfd, contents + offset - 1);
881 return (val & 0xc7) == 0x05;
882
883 case R_X86_64_TLSDESC_CALL:
884 /* Check transition from GDesc access model:
885 call *x@tlsdesc(%rax)
886 */
887 if (offset + 2 <= sec->size)
888 {
889 /* Make sure that it's a call *x@tlsdesc(%rax). */
890 static x86_64_opcode16 call = { { 0xff, 0x10 } };
891 return bfd_get_16 (abfd, contents + offset) == call.i;
892 }
893
894 return FALSE;
895
896 default:
897 abort ();
898 }
899 }
900
901 /* Return TRUE if the TLS access transition is OK or no transition
902 will be performed. Update R_TYPE if there is a transition. */
903
904 static bfd_boolean
905 elf64_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
906 asection *sec, bfd_byte *contents,
907 Elf_Internal_Shdr *symtab_hdr,
908 struct elf_link_hash_entry **sym_hashes,
909 unsigned int *r_type, int tls_type,
910 const Elf_Internal_Rela *rel,
911 const Elf_Internal_Rela *relend,
912 struct elf_link_hash_entry *h)
913 {
914 unsigned int from_type = *r_type;
915 unsigned int to_type = from_type;
916 bfd_boolean check = TRUE;
917
918 switch (from_type)
919 {
920 case R_X86_64_TLSGD:
921 case R_X86_64_GOTPC32_TLSDESC:
922 case R_X86_64_TLSDESC_CALL:
923 case R_X86_64_GOTTPOFF:
924 if (!info->shared)
925 {
926 if (h == NULL)
927 to_type = R_X86_64_TPOFF32;
928 else
929 to_type = R_X86_64_GOTTPOFF;
930 }
931
932 /* When we are called from elf64_x86_64_relocate_section,
933 CONTENTS isn't NULL and there may be additional transitions
934 based on TLS_TYPE. */
935 if (contents != NULL)
936 {
937 unsigned int new_to_type = to_type;
938
939 if (!info->shared
940 && h != NULL
941 && h->dynindx == -1
942 && tls_type == GOT_TLS_IE)
943 new_to_type = R_X86_64_TPOFF32;
944
945 if (to_type == R_X86_64_TLSGD
946 || to_type == R_X86_64_GOTPC32_TLSDESC
947 || to_type == R_X86_64_TLSDESC_CALL)
948 {
949 if (tls_type == GOT_TLS_IE)
950 new_to_type = R_X86_64_GOTTPOFF;
951 }
952
953 /* We checked the transition before when we were called from
954 elf64_x86_64_check_relocs. We only want to check the new
955 transition which hasn't been checked before. */
956 check = new_to_type != to_type && from_type == to_type;
957 to_type = new_to_type;
958 }
959
960 break;
961
962 case R_X86_64_TLSLD:
963 if (!info->shared)
964 to_type = R_X86_64_TPOFF32;
965 break;
966
967 default:
968 return TRUE;
969 }
970
971 /* Return TRUE if there is no transition. */
972 if (from_type == to_type)
973 return TRUE;
974
975 /* Check if the transition can be performed. */
976 if (check
977 && ! elf64_x86_64_check_tls_transition (abfd, sec, contents,
978 symtab_hdr, sym_hashes,
979 from_type, rel, relend))
980 {
981 reloc_howto_type *from, *to;
982
983 from = elf64_x86_64_rtype_to_howto (abfd, from_type);
984 to = elf64_x86_64_rtype_to_howto (abfd, to_type);
985
986 (*_bfd_error_handler)
987 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
988 "in section `%A' failed"),
989 abfd, sec, from->name, to->name,
990 h ? h->root.root.string : "a local symbol",
991 (unsigned long) rel->r_offset);
992 bfd_set_error (bfd_error_bad_value);
993 return FALSE;
994 }
995
996 *r_type = to_type;
997 return TRUE;
998 }
999
1000 /* Look through the relocs for a section during the first phase, and
1001 calculate needed space in the global offset table, procedure
1002 linkage table, and dynamic reloc sections. */
1003
1004 static bfd_boolean
1005 elf64_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
1006 asection *sec,
1007 const Elf_Internal_Rela *relocs)
1008 {
1009 struct elf64_x86_64_link_hash_table *htab;
1010 Elf_Internal_Shdr *symtab_hdr;
1011 struct elf_link_hash_entry **sym_hashes;
1012 const Elf_Internal_Rela *rel;
1013 const Elf_Internal_Rela *rel_end;
1014 asection *sreloc;
1015
1016 if (info->relocatable)
1017 return TRUE;
1018
1019 BFD_ASSERT (is_x86_64_elf (abfd));
1020
1021 htab = elf64_x86_64_hash_table (info);
1022 symtab_hdr = &elf_symtab_hdr (abfd);
1023 sym_hashes = elf_sym_hashes (abfd);
1024
1025 sreloc = NULL;
1026
1027 rel_end = relocs + sec->reloc_count;
1028 for (rel = relocs; rel < rel_end; rel++)
1029 {
1030 unsigned int r_type;
1031 unsigned long r_symndx;
1032 struct elf_link_hash_entry *h;
1033
1034 r_symndx = ELF64_R_SYM (rel->r_info);
1035 r_type = ELF64_R_TYPE (rel->r_info);
1036
1037 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1038 {
1039 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1040 abfd, r_symndx);
1041 return FALSE;
1042 }
1043
1044 if (r_symndx < symtab_hdr->sh_info)
1045 h = NULL;
1046 else
1047 {
1048 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1049 while (h->root.type == bfd_link_hash_indirect
1050 || h->root.type == bfd_link_hash_warning)
1051 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1052
1053 /* Create the ifunc sections for static executables. If we
1054 never see an indirect function symbol nor we are building
1055 a static executable, those sections will be empty and
1056 won't appear in output. */
1057 switch (r_type)
1058 {
1059 default:
1060 break;
1061
1062 case R_X86_64_32S:
1063 case R_X86_64_32:
1064 case R_X86_64_64:
1065 case R_X86_64_PC32:
1066 case R_X86_64_PC64:
1067 case R_X86_64_PLT32:
1068 case R_X86_64_GOTPCREL:
1069 case R_X86_64_GOTPCREL64:
1070 if (htab->irelifunc == NULL && htab->iplt == NULL)
1071 {
1072 if (!_bfd_elf_create_ifunc_sections (abfd, info))
1073 return FALSE;
1074
1075 if (info->shared)
1076 {
1077 htab->irelifunc = bfd_get_section_by_name (abfd,
1078 ".rela.ifunc");
1079 if (!htab->irelifunc)
1080 abort ();
1081 }
1082 else
1083 {
1084 htab->iplt = bfd_get_section_by_name (abfd, ".iplt");
1085 htab->irelplt = bfd_get_section_by_name (abfd,
1086 ".rela.iplt");
1087 htab->igotplt = bfd_get_section_by_name (abfd,
1088 ".igot.plt");
1089 if (!htab->iplt
1090 || !htab->irelplt
1091 || !htab->igotplt)
1092 abort ();
1093 }
1094 }
1095 break;
1096 }
1097
1098 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
1099 it here if it is defined in a non-shared object. */
1100 if (h->type == STT_GNU_IFUNC
1101 && h->def_regular)
1102 {
1103 /* It is referenced by a non-shared object. */
1104 h->ref_regular = 1;
1105
1106 /* STT_GNU_IFUNC symbol must go through PLT. */
1107 h->plt.refcount += 1;
1108
1109 /* STT_GNU_IFUNC needs dynamic sections. */
1110 if (htab->elf.dynobj == NULL)
1111 htab->elf.dynobj = abfd;
1112
1113 switch (r_type)
1114 {
1115 default:
1116 (*_bfd_error_handler)
1117 (_("%B: relocation %s against STT_GNU_IFUNC "
1118 "symbol `%s' isn't handled by %s"), abfd,
1119 x86_64_elf_howto_table[r_type].name,
1120 h->root.root.string, __FUNCTION__);
1121 bfd_set_error (bfd_error_bad_value);
1122 return FALSE;
1123
1124 case R_X86_64_64:
1125 h->non_got_ref = 1;
1126 h->pointer_equality_needed = 1;
1127 if (info->shared)
1128 {
1129 struct elf64_x86_64_dyn_relocs *p;
1130 struct elf64_x86_64_dyn_relocs **head;
1131
1132 /* We must copy these reloc types into the output
1133 file. Create a reloc section in dynobj and
1134 make room for this reloc. */
1135 if (sreloc == NULL)
1136 {
1137 if (htab->elf.dynobj == NULL)
1138 htab->elf.dynobj = abfd;
1139
1140 sreloc = _bfd_elf_make_dynamic_reloc_section
1141 (sec, htab->elf.dynobj, 3, abfd, TRUE);
1142
1143 if (sreloc == NULL)
1144 return FALSE;
1145 }
1146
1147 head = &((struct elf64_x86_64_link_hash_entry *) h)->dyn_relocs;
1148 p = *head;
1149 if (p == NULL || p->sec != sec)
1150 {
1151 bfd_size_type amt = sizeof *p;
1152
1153 p = ((struct elf64_x86_64_dyn_relocs *)
1154 bfd_alloc (htab->elf.dynobj, amt));
1155 if (p == NULL)
1156 return FALSE;
1157 p->next = *head;
1158 *head = p;
1159 p->sec = sec;
1160 p->count = 0;
1161 p->pc_count = 0;
1162 }
1163 p->count += 1;
1164 }
1165 break;
1166
1167 case R_X86_64_32S:
1168 case R_X86_64_32:
1169 case R_X86_64_PC32:
1170 case R_X86_64_PC64:
1171 h->non_got_ref = 1;
1172 if (r_type != R_X86_64_PC32
1173 && r_type != R_X86_64_PC64)
1174 h->pointer_equality_needed = 1;
1175 break;
1176
1177 case R_X86_64_PLT32:
1178 break;
1179
1180 case R_X86_64_GOTPCREL:
1181 case R_X86_64_GOTPCREL64:
1182 h->got.refcount += 1;
1183 if (htab->sgot == NULL
1184 && !elf64_x86_64_create_got_section (htab->elf.dynobj,
1185 info))
1186 return FALSE;
1187 break;
1188 }
1189
1190 continue;
1191 }
1192 }
1193
1194 if (! elf64_x86_64_tls_transition (info, abfd, sec, NULL,
1195 symtab_hdr, sym_hashes,
1196 &r_type, GOT_UNKNOWN,
1197 rel, rel_end, h))
1198 return FALSE;
1199
1200 switch (r_type)
1201 {
1202 case R_X86_64_TLSLD:
1203 htab->tls_ld_got.refcount += 1;
1204 goto create_got;
1205
1206 case R_X86_64_TPOFF32:
1207 if (info->shared)
1208 {
1209 (*_bfd_error_handler)
1210 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1211 abfd,
1212 x86_64_elf_howto_table[r_type].name,
1213 (h) ? h->root.root.string : "a local symbol");
1214 bfd_set_error (bfd_error_bad_value);
1215 return FALSE;
1216 }
1217 break;
1218
1219 case R_X86_64_GOTTPOFF:
1220 if (info->shared)
1221 info->flags |= DF_STATIC_TLS;
1222 /* Fall through */
1223
1224 case R_X86_64_GOT32:
1225 case R_X86_64_GOTPCREL:
1226 case R_X86_64_TLSGD:
1227 case R_X86_64_GOT64:
1228 case R_X86_64_GOTPCREL64:
1229 case R_X86_64_GOTPLT64:
1230 case R_X86_64_GOTPC32_TLSDESC:
1231 case R_X86_64_TLSDESC_CALL:
1232 /* This symbol requires a global offset table entry. */
1233 {
1234 int tls_type, old_tls_type;
1235
1236 switch (r_type)
1237 {
1238 default: tls_type = GOT_NORMAL; break;
1239 case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break;
1240 case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break;
1241 case R_X86_64_GOTPC32_TLSDESC:
1242 case R_X86_64_TLSDESC_CALL:
1243 tls_type = GOT_TLS_GDESC; break;
1244 }
1245
1246 if (h != NULL)
1247 {
1248 if (r_type == R_X86_64_GOTPLT64)
1249 {
1250 /* This relocation indicates that we also need
1251 a PLT entry, as this is a function. We don't need
1252 a PLT entry for local symbols. */
1253 h->needs_plt = 1;
1254 h->plt.refcount += 1;
1255 }
1256 h->got.refcount += 1;
1257 old_tls_type = elf64_x86_64_hash_entry (h)->tls_type;
1258 }
1259 else
1260 {
1261 bfd_signed_vma *local_got_refcounts;
1262
1263 /* This is a global offset table entry for a local symbol. */
1264 local_got_refcounts = elf_local_got_refcounts (abfd);
1265 if (local_got_refcounts == NULL)
1266 {
1267 bfd_size_type size;
1268
1269 size = symtab_hdr->sh_info;
1270 size *= sizeof (bfd_signed_vma)
1271 + sizeof (bfd_vma) + sizeof (char);
1272 local_got_refcounts = ((bfd_signed_vma *)
1273 bfd_zalloc (abfd, size));
1274 if (local_got_refcounts == NULL)
1275 return FALSE;
1276 elf_local_got_refcounts (abfd) = local_got_refcounts;
1277 elf64_x86_64_local_tlsdesc_gotent (abfd)
1278 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
1279 elf64_x86_64_local_got_tls_type (abfd)
1280 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
1281 }
1282 local_got_refcounts[r_symndx] += 1;
1283 old_tls_type
1284 = elf64_x86_64_local_got_tls_type (abfd) [r_symndx];
1285 }
1286
1287 /* If a TLS symbol is accessed using IE at least once,
1288 there is no point to use dynamic model for it. */
1289 if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1290 && (! GOT_TLS_GD_ANY_P (old_tls_type)
1291 || tls_type != GOT_TLS_IE))
1292 {
1293 if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type))
1294 tls_type = old_tls_type;
1295 else if (GOT_TLS_GD_ANY_P (old_tls_type)
1296 && GOT_TLS_GD_ANY_P (tls_type))
1297 tls_type |= old_tls_type;
1298 else
1299 {
1300 (*_bfd_error_handler)
1301 (_("%B: '%s' accessed both as normal and thread local symbol"),
1302 abfd, h ? h->root.root.string : "<local>");
1303 return FALSE;
1304 }
1305 }
1306
1307 if (old_tls_type != tls_type)
1308 {
1309 if (h != NULL)
1310 elf64_x86_64_hash_entry (h)->tls_type = tls_type;
1311 else
1312 elf64_x86_64_local_got_tls_type (abfd) [r_symndx] = tls_type;
1313 }
1314 }
1315 /* Fall through */
1316
1317 case R_X86_64_GOTOFF64:
1318 case R_X86_64_GOTPC32:
1319 case R_X86_64_GOTPC64:
1320 create_got:
1321 if (htab->sgot == NULL)
1322 {
1323 if (htab->elf.dynobj == NULL)
1324 htab->elf.dynobj = abfd;
1325 if (!elf64_x86_64_create_got_section (htab->elf.dynobj,
1326 info))
1327 return FALSE;
1328 }
1329 break;
1330
1331 case R_X86_64_PLT32:
1332 /* This symbol requires a procedure linkage table entry. We
1333 actually build the entry in adjust_dynamic_symbol,
1334 because this might be a case of linking PIC code which is
1335 never referenced by a dynamic object, in which case we
1336 don't need to generate a procedure linkage table entry
1337 after all. */
1338
1339 /* If this is a local symbol, we resolve it directly without
1340 creating a procedure linkage table entry. */
1341 if (h == NULL)
1342 continue;
1343
1344 h->needs_plt = 1;
1345 h->plt.refcount += 1;
1346 break;
1347
1348 case R_X86_64_PLTOFF64:
1349 /* This tries to form the 'address' of a function relative
1350 to GOT. For global symbols we need a PLT entry. */
1351 if (h != NULL)
1352 {
1353 h->needs_plt = 1;
1354 h->plt.refcount += 1;
1355 }
1356 goto create_got;
1357
1358 case R_X86_64_8:
1359 case R_X86_64_16:
1360 case R_X86_64_32:
1361 case R_X86_64_32S:
1362 /* Let's help debug shared library creation. These relocs
1363 cannot be used in shared libs. Don't error out for
1364 sections we don't care about, such as debug sections or
1365 non-constant sections. */
1366 if (info->shared
1367 && (sec->flags & SEC_ALLOC) != 0
1368 && (sec->flags & SEC_READONLY) != 0)
1369 {
1370 (*_bfd_error_handler)
1371 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1372 abfd,
1373 x86_64_elf_howto_table[r_type].name,
1374 (h) ? h->root.root.string : "a local symbol");
1375 bfd_set_error (bfd_error_bad_value);
1376 return FALSE;
1377 }
1378 /* Fall through. */
1379
1380 case R_X86_64_PC8:
1381 case R_X86_64_PC16:
1382 case R_X86_64_PC32:
1383 case R_X86_64_PC64:
1384 case R_X86_64_64:
1385 if (h != NULL && info->executable)
1386 {
1387 /* If this reloc is in a read-only section, we might
1388 need a copy reloc. We can't check reliably at this
1389 stage whether the section is read-only, as input
1390 sections have not yet been mapped to output sections.
1391 Tentatively set the flag for now, and correct in
1392 adjust_dynamic_symbol. */
1393 h->non_got_ref = 1;
1394
1395 /* We may need a .plt entry if the function this reloc
1396 refers to is in a shared lib. */
1397 h->plt.refcount += 1;
1398 if (r_type != R_X86_64_PC32 && r_type != R_X86_64_PC64)
1399 h->pointer_equality_needed = 1;
1400 }
1401
1402 /* If we are creating a shared library, and this is a reloc
1403 against a global symbol, or a non PC relative reloc
1404 against a local symbol, then we need to copy the reloc
1405 into the shared library. However, if we are linking with
1406 -Bsymbolic, we do not need to copy a reloc against a
1407 global symbol which is defined in an object we are
1408 including in the link (i.e., DEF_REGULAR is set). At
1409 this point we have not seen all the input files, so it is
1410 possible that DEF_REGULAR is not set now but will be set
1411 later (it is never cleared). In case of a weak definition,
1412 DEF_REGULAR may be cleared later by a strong definition in
1413 a shared library. We account for that possibility below by
1414 storing information in the relocs_copied field of the hash
1415 table entry. A similar situation occurs when creating
1416 shared libraries and symbol visibility changes render the
1417 symbol local.
1418
1419 If on the other hand, we are creating an executable, we
1420 may need to keep relocations for symbols satisfied by a
1421 dynamic library if we manage to avoid copy relocs for the
1422 symbol. */
1423 if ((info->shared
1424 && (sec->flags & SEC_ALLOC) != 0
1425 && (! IS_X86_64_PCREL_TYPE (r_type)
1426 || (h != NULL
1427 && (! SYMBOLIC_BIND (info, h)
1428 || h->root.type == bfd_link_hash_defweak
1429 || !h->def_regular))))
1430 || (ELIMINATE_COPY_RELOCS
1431 && !info->shared
1432 && (sec->flags & SEC_ALLOC) != 0
1433 && h != NULL
1434 && (h->root.type == bfd_link_hash_defweak
1435 || !h->def_regular)))
1436 {
1437 struct elf64_x86_64_dyn_relocs *p;
1438 struct elf64_x86_64_dyn_relocs **head;
1439
1440 /* We must copy these reloc types into the output file.
1441 Create a reloc section in dynobj and make room for
1442 this reloc. */
1443 if (sreloc == NULL)
1444 {
1445 if (htab->elf.dynobj == NULL)
1446 htab->elf.dynobj = abfd;
1447
1448 sreloc = _bfd_elf_make_dynamic_reloc_section
1449 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
1450
1451 if (sreloc == NULL)
1452 return FALSE;
1453 }
1454
1455 /* If this is a global symbol, we count the number of
1456 relocations we need for this symbol. */
1457 if (h != NULL)
1458 {
1459 head = &((struct elf64_x86_64_link_hash_entry *) h)->dyn_relocs;
1460 }
1461 else
1462 {
1463 void **vpp;
1464 /* Track dynamic relocs needed for local syms too.
1465 We really need local syms available to do this
1466 easily. Oh well. */
1467
1468 asection *s;
1469 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
1470 sec, r_symndx);
1471 if (s == NULL)
1472 return FALSE;
1473
1474 /* Beware of type punned pointers vs strict aliasing
1475 rules. */
1476 vpp = &(elf_section_data (s)->local_dynrel);
1477 head = (struct elf64_x86_64_dyn_relocs **)vpp;
1478 }
1479
1480 p = *head;
1481 if (p == NULL || p->sec != sec)
1482 {
1483 bfd_size_type amt = sizeof *p;
1484
1485 p = ((struct elf64_x86_64_dyn_relocs *)
1486 bfd_alloc (htab->elf.dynobj, amt));
1487 if (p == NULL)
1488 return FALSE;
1489 p->next = *head;
1490 *head = p;
1491 p->sec = sec;
1492 p->count = 0;
1493 p->pc_count = 0;
1494 }
1495
1496 p->count += 1;
1497 if (IS_X86_64_PCREL_TYPE (r_type))
1498 p->pc_count += 1;
1499 }
1500 break;
1501
1502 /* This relocation describes the C++ object vtable hierarchy.
1503 Reconstruct it for later use during GC. */
1504 case R_X86_64_GNU_VTINHERIT:
1505 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1506 return FALSE;
1507 break;
1508
1509 /* This relocation describes which C++ vtable entries are actually
1510 used. Record for later use during GC. */
1511 case R_X86_64_GNU_VTENTRY:
1512 BFD_ASSERT (h != NULL);
1513 if (h != NULL
1514 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1515 return FALSE;
1516 break;
1517
1518 default:
1519 break;
1520 }
1521 }
1522
1523 return TRUE;
1524 }
1525
1526 /* Return the section that should be marked against GC for a given
1527 relocation. */
1528
1529 static asection *
1530 elf64_x86_64_gc_mark_hook (asection *sec,
1531 struct bfd_link_info *info,
1532 Elf_Internal_Rela *rel,
1533 struct elf_link_hash_entry *h,
1534 Elf_Internal_Sym *sym)
1535 {
1536 if (h != NULL)
1537 switch (ELF64_R_TYPE (rel->r_info))
1538 {
1539 case R_X86_64_GNU_VTINHERIT:
1540 case R_X86_64_GNU_VTENTRY:
1541 return NULL;
1542 }
1543
1544 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1545 }
1546
1547 /* Update the got entry reference counts for the section being removed. */
1548
1549 static bfd_boolean
1550 elf64_x86_64_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
1551 asection *sec,
1552 const Elf_Internal_Rela *relocs)
1553 {
1554 Elf_Internal_Shdr *symtab_hdr;
1555 struct elf_link_hash_entry **sym_hashes;
1556 bfd_signed_vma *local_got_refcounts;
1557 const Elf_Internal_Rela *rel, *relend;
1558
1559 if (info->relocatable)
1560 return TRUE;
1561
1562 elf_section_data (sec)->local_dynrel = NULL;
1563
1564 symtab_hdr = &elf_symtab_hdr (abfd);
1565 sym_hashes = elf_sym_hashes (abfd);
1566 local_got_refcounts = elf_local_got_refcounts (abfd);
1567
1568 relend = relocs + sec->reloc_count;
1569 for (rel = relocs; rel < relend; rel++)
1570 {
1571 unsigned long r_symndx;
1572 unsigned int r_type;
1573 struct elf_link_hash_entry *h = NULL;
1574
1575 r_symndx = ELF64_R_SYM (rel->r_info);
1576 if (r_symndx >= symtab_hdr->sh_info)
1577 {
1578 struct elf64_x86_64_link_hash_entry *eh;
1579 struct elf64_x86_64_dyn_relocs **pp;
1580 struct elf64_x86_64_dyn_relocs *p;
1581
1582 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1583 while (h->root.type == bfd_link_hash_indirect
1584 || h->root.type == bfd_link_hash_warning)
1585 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1586 eh = (struct elf64_x86_64_link_hash_entry *) h;
1587
1588 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1589 if (p->sec == sec)
1590 {
1591 /* Everything must go for SEC. */
1592 *pp = p->next;
1593 break;
1594 }
1595 }
1596
1597 r_type = ELF64_R_TYPE (rel->r_info);
1598 if (! elf64_x86_64_tls_transition (info, abfd, sec, NULL,
1599 symtab_hdr, sym_hashes,
1600 &r_type, GOT_UNKNOWN,
1601 rel, relend, h))
1602 return FALSE;
1603
1604 switch (r_type)
1605 {
1606 case R_X86_64_TLSLD:
1607 if (elf64_x86_64_hash_table (info)->tls_ld_got.refcount > 0)
1608 elf64_x86_64_hash_table (info)->tls_ld_got.refcount -= 1;
1609 break;
1610
1611 case R_X86_64_TLSGD:
1612 case R_X86_64_GOTPC32_TLSDESC:
1613 case R_X86_64_TLSDESC_CALL:
1614 case R_X86_64_GOTTPOFF:
1615 case R_X86_64_GOT32:
1616 case R_X86_64_GOTPCREL:
1617 case R_X86_64_GOT64:
1618 case R_X86_64_GOTPCREL64:
1619 case R_X86_64_GOTPLT64:
1620 if (h != NULL)
1621 {
1622 if (r_type == R_X86_64_GOTPLT64 && h->plt.refcount > 0)
1623 h->plt.refcount -= 1;
1624 if (h->got.refcount > 0)
1625 h->got.refcount -= 1;
1626 }
1627 else if (local_got_refcounts != NULL)
1628 {
1629 if (local_got_refcounts[r_symndx] > 0)
1630 local_got_refcounts[r_symndx] -= 1;
1631 }
1632 break;
1633
1634 case R_X86_64_8:
1635 case R_X86_64_16:
1636 case R_X86_64_32:
1637 case R_X86_64_64:
1638 case R_X86_64_32S:
1639 case R_X86_64_PC8:
1640 case R_X86_64_PC16:
1641 case R_X86_64_PC32:
1642 case R_X86_64_PC64:
1643 if (info->shared)
1644 break;
1645 /* Fall thru */
1646
1647 case R_X86_64_PLT32:
1648 case R_X86_64_PLTOFF64:
1649 if (h != NULL)
1650 {
1651 if (h->plt.refcount > 0)
1652 h->plt.refcount -= 1;
1653 }
1654 break;
1655
1656 default:
1657 break;
1658 }
1659 }
1660
1661 return TRUE;
1662 }
1663
1664 /* Adjust a symbol defined by a dynamic object and referenced by a
1665 regular object. The current definition is in some section of the
1666 dynamic object, but we're not including those sections. We have to
1667 change the definition to something the rest of the link can
1668 understand. */
1669
1670 static bfd_boolean
1671 elf64_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
1672 struct elf_link_hash_entry *h)
1673 {
1674 struct elf64_x86_64_link_hash_table *htab;
1675 asection *s;
1676
1677 /* STT_GNU_IFUNC symbol must go through PLT. */
1678 if (h->type == STT_GNU_IFUNC)
1679 {
1680 if (h->plt.refcount <= 0)
1681 {
1682 h->plt.offset = (bfd_vma) -1;
1683 h->needs_plt = 0;
1684 }
1685 return TRUE;
1686 }
1687
1688 /* If this is a function, put it in the procedure linkage table. We
1689 will fill in the contents of the procedure linkage table later,
1690 when we know the address of the .got section. */
1691 if (h->type == STT_FUNC
1692 || h->needs_plt)
1693 {
1694 if (h->plt.refcount <= 0
1695 || SYMBOL_CALLS_LOCAL (info, h)
1696 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1697 && h->root.type == bfd_link_hash_undefweak))
1698 {
1699 /* This case can occur if we saw a PLT32 reloc in an input
1700 file, but the symbol was never referred to by a dynamic
1701 object, or if all references were garbage collected. In
1702 such a case, we don't actually need to build a procedure
1703 linkage table, and we can just do a PC32 reloc instead. */
1704 h->plt.offset = (bfd_vma) -1;
1705 h->needs_plt = 0;
1706 }
1707
1708 return TRUE;
1709 }
1710 else
1711 /* It's possible that we incorrectly decided a .plt reloc was
1712 needed for an R_X86_64_PC32 reloc to a non-function sym in
1713 check_relocs. We can't decide accurately between function and
1714 non-function syms in check-relocs; Objects loaded later in
1715 the link may change h->type. So fix it now. */
1716 h->plt.offset = (bfd_vma) -1;
1717
1718 /* If this is a weak symbol, and there is a real definition, the
1719 processor independent code will have arranged for us to see the
1720 real definition first, and we can just use the same value. */
1721 if (h->u.weakdef != NULL)
1722 {
1723 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1724 || h->u.weakdef->root.type == bfd_link_hash_defweak);
1725 h->root.u.def.section = h->u.weakdef->root.u.def.section;
1726 h->root.u.def.value = h->u.weakdef->root.u.def.value;
1727 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
1728 h->non_got_ref = h->u.weakdef->non_got_ref;
1729 return TRUE;
1730 }
1731
1732 /* This is a reference to a symbol defined by a dynamic object which
1733 is not a function. */
1734
1735 /* If we are creating a shared library, we must presume that the
1736 only references to the symbol are via the global offset table.
1737 For such cases we need not do anything here; the relocations will
1738 be handled correctly by relocate_section. */
1739 if (info->shared)
1740 return TRUE;
1741
1742 /* If there are no references to this symbol that do not use the
1743 GOT, we don't need to generate a copy reloc. */
1744 if (!h->non_got_ref)
1745 return TRUE;
1746
1747 /* If -z nocopyreloc was given, we won't generate them either. */
1748 if (info->nocopyreloc)
1749 {
1750 h->non_got_ref = 0;
1751 return TRUE;
1752 }
1753
1754 if (ELIMINATE_COPY_RELOCS)
1755 {
1756 struct elf64_x86_64_link_hash_entry * eh;
1757 struct elf64_x86_64_dyn_relocs *p;
1758
1759 eh = (struct elf64_x86_64_link_hash_entry *) h;
1760 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1761 {
1762 s = p->sec->output_section;
1763 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1764 break;
1765 }
1766
1767 /* If we didn't find any dynamic relocs in read-only sections, then
1768 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1769 if (p == NULL)
1770 {
1771 h->non_got_ref = 0;
1772 return TRUE;
1773 }
1774 }
1775
1776 if (h->size == 0)
1777 {
1778 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1779 h->root.root.string);
1780 return TRUE;
1781 }
1782
1783 /* We must allocate the symbol in our .dynbss section, which will
1784 become part of the .bss section of the executable. There will be
1785 an entry for this symbol in the .dynsym section. The dynamic
1786 object will contain position independent code, so all references
1787 from the dynamic object to this symbol will go through the global
1788 offset table. The dynamic linker will use the .dynsym entry to
1789 determine the address it must put in the global offset table, so
1790 both the dynamic object and the regular object will refer to the
1791 same memory location for the variable. */
1792
1793 htab = elf64_x86_64_hash_table (info);
1794
1795 /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
1796 to copy the initial value out of the dynamic object and into the
1797 runtime process image. */
1798 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1799 {
1800 htab->srelbss->size += sizeof (Elf64_External_Rela);
1801 h->needs_copy = 1;
1802 }
1803
1804 s = htab->sdynbss;
1805
1806 return _bfd_elf_adjust_dynamic_copy (h, s);
1807 }
1808
1809 /* Allocate space in .plt, .got and associated reloc sections for
1810 dynamic relocs. */
1811
1812 static bfd_boolean
1813 elf64_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
1814 {
1815 struct bfd_link_info *info;
1816 struct elf64_x86_64_link_hash_table *htab;
1817 struct elf64_x86_64_link_hash_entry *eh;
1818 struct elf64_x86_64_dyn_relocs *p;
1819
1820 if (h->root.type == bfd_link_hash_indirect)
1821 return TRUE;
1822
1823 if (h->root.type == bfd_link_hash_warning)
1824 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1825 eh = (struct elf64_x86_64_link_hash_entry *) h;
1826
1827 info = (struct bfd_link_info *) inf;
1828 htab = elf64_x86_64_hash_table (info);
1829
1830 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
1831 here if it is defined and referenced in a non-shared object. */
1832 if (h->type == STT_GNU_IFUNC
1833 && h->def_regular)
1834 {
1835 asection *plt, *gotplt, *relplt;
1836
1837 /* Return and discard space for dynamic relocations against it if
1838 it is never referenced in a non-shared object. */
1839 if (!h->ref_regular)
1840 {
1841 if (h->plt.refcount > 0
1842 || h->got.refcount > 0)
1843 abort ();
1844 h->got.offset = (bfd_vma) -1;
1845 eh->dyn_relocs = NULL;
1846 return TRUE;
1847 }
1848
1849 /* When building a static executable, use .iplt, .igot.plt and
1850 .rela.iplt sections for STT_GNU_IFUNC symbols. */
1851 if (htab->splt != NULL)
1852 {
1853 plt = htab->splt;
1854 gotplt = htab->sgotplt;
1855 relplt = htab->srelplt;
1856
1857 /* If this is the first .plt entry, make room for the special
1858 first entry. */
1859 if (plt->size == 0)
1860 plt->size += PLT_ENTRY_SIZE;
1861 }
1862 else
1863 {
1864 plt = htab->iplt;
1865 gotplt = htab->igotplt;
1866 relplt = htab->irelplt;
1867 }
1868
1869 /* Don't update value of STT_GNU_IFUNC symbol to PLT. We need
1870 the original value for R_X86_64_IRELATIVE. */
1871 h->plt.offset = plt->size;
1872
1873 /* Make room for this entry in the .plt/.iplt section. */
1874 plt->size += PLT_ENTRY_SIZE;
1875
1876 /* We also need to make an entry in the .got.plt/.got.iplt
1877 section, which will be placed in the .got section by the
1878 linker script. */
1879 gotplt->size += GOT_ENTRY_SIZE;
1880
1881 /* We also need to make an entry in the .rela.plt/.rela.iplt
1882 section. */
1883 relplt->size += sizeof (Elf64_External_Rela);
1884 relplt->reloc_count++;
1885
1886 /* We need dynamic relocation for STT_GNU_IFUNC symbol only
1887 when there is a non-GOT reference in a shared object. */
1888 if (!info->shared
1889 || !h->non_got_ref)
1890 eh->dyn_relocs = NULL;
1891
1892 /* Finally, allocate space. */
1893 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1894 htab->irelifunc->size += p->count * sizeof (Elf64_External_Rela);
1895
1896 /* For STT_GNU_IFUNC symbol, .got.plt has the real function
1897 addres and .got has the PLT entry adddress. We will load
1898 the GOT entry with the PLT entry in finish_dynamic_symbol if
1899 it is used. For branch, it uses .got.plt. For symbol value,
1900 1. Use .got.plt in a shared object if it is forced local or
1901 not dynamic.
1902 2. Use .got.plt in a non-shared object if pointer equality
1903 isn't needed.
1904 3. Use .got.plt if .got isn't used.
1905 4. Otherwise use .got so that it can be shared among different
1906 objects at run-time.
1907 We only need to relocate .got entry in shared object. */
1908 if ((info->shared
1909 && (h->dynindx == -1
1910 || h->forced_local))
1911 || (!info->shared
1912 && !h->pointer_equality_needed)
1913 || htab->sgot == NULL)
1914 {
1915 /* Use .got.plt. */
1916 h->got.offset = (bfd_vma) -1;
1917 }
1918 else
1919 {
1920 h->got.offset = htab->sgot->size;
1921 htab->sgot->size += GOT_ENTRY_SIZE;
1922 if (info->shared)
1923 htab->srelgot->size += sizeof (Elf64_External_Rela);
1924 }
1925
1926 return TRUE;
1927 }
1928 else if (htab->elf.dynamic_sections_created
1929 && h->plt.refcount > 0)
1930 {
1931 /* Make sure this symbol is output as a dynamic symbol.
1932 Undefined weak syms won't yet be marked as dynamic. */
1933 if (h->dynindx == -1
1934 && !h->forced_local)
1935 {
1936 if (! bfd_elf_link_record_dynamic_symbol (info, h))
1937 return FALSE;
1938 }
1939
1940 if (info->shared
1941 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
1942 {
1943 asection *s = htab->splt;
1944
1945 /* If this is the first .plt entry, make room for the special
1946 first entry. */
1947 if (s->size == 0)
1948 s->size += PLT_ENTRY_SIZE;
1949
1950 h->plt.offset = s->size;
1951
1952 /* If this symbol is not defined in a regular file, and we are
1953 not generating a shared library, then set the symbol to this
1954 location in the .plt. This is required to make function
1955 pointers compare as equal between the normal executable and
1956 the shared library. */
1957 if (! info->shared
1958 && !h->def_regular)
1959 {
1960 h->root.u.def.section = s;
1961 h->root.u.def.value = h->plt.offset;
1962 }
1963
1964 /* Make room for this entry. */
1965 s->size += PLT_ENTRY_SIZE;
1966
1967 /* We also need to make an entry in the .got.plt section, which
1968 will be placed in the .got section by the linker script. */
1969 htab->sgotplt->size += GOT_ENTRY_SIZE;
1970
1971 /* We also need to make an entry in the .rela.plt section. */
1972 htab->srelplt->size += sizeof (Elf64_External_Rela);
1973 htab->srelplt->reloc_count++;
1974 }
1975 else
1976 {
1977 h->plt.offset = (bfd_vma) -1;
1978 h->needs_plt = 0;
1979 }
1980 }
1981 else
1982 {
1983 h->plt.offset = (bfd_vma) -1;
1984 h->needs_plt = 0;
1985 }
1986
1987 eh->tlsdesc_got = (bfd_vma) -1;
1988
1989 /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
1990 make it a R_X86_64_TPOFF32 requiring no GOT entry. */
1991 if (h->got.refcount > 0
1992 && !info->shared
1993 && h->dynindx == -1
1994 && elf64_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE)
1995 {
1996 h->got.offset = (bfd_vma) -1;
1997 }
1998 else if (h->got.refcount > 0)
1999 {
2000 asection *s;
2001 bfd_boolean dyn;
2002 int tls_type = elf64_x86_64_hash_entry (h)->tls_type;
2003
2004 /* Make sure this symbol is output as a dynamic symbol.
2005 Undefined weak syms won't yet be marked as dynamic. */
2006 if (h->dynindx == -1
2007 && !h->forced_local)
2008 {
2009 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2010 return FALSE;
2011 }
2012
2013 if (GOT_TLS_GDESC_P (tls_type))
2014 {
2015 eh->tlsdesc_got = htab->sgotplt->size
2016 - elf64_x86_64_compute_jump_table_size (htab);
2017 htab->sgotplt->size += 2 * GOT_ENTRY_SIZE;
2018 h->got.offset = (bfd_vma) -2;
2019 }
2020 if (! GOT_TLS_GDESC_P (tls_type)
2021 || GOT_TLS_GD_P (tls_type))
2022 {
2023 s = htab->sgot;
2024 h->got.offset = s->size;
2025 s->size += GOT_ENTRY_SIZE;
2026 if (GOT_TLS_GD_P (tls_type))
2027 s->size += GOT_ENTRY_SIZE;
2028 }
2029 dyn = htab->elf.dynamic_sections_created;
2030 /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
2031 and two if global.
2032 R_X86_64_GOTTPOFF needs one dynamic relocation. */
2033 if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2034 || tls_type == GOT_TLS_IE)
2035 htab->srelgot->size += sizeof (Elf64_External_Rela);
2036 else if (GOT_TLS_GD_P (tls_type))
2037 htab->srelgot->size += 2 * sizeof (Elf64_External_Rela);
2038 else if (! GOT_TLS_GDESC_P (tls_type)
2039 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2040 || h->root.type != bfd_link_hash_undefweak)
2041 && (info->shared
2042 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2043 htab->srelgot->size += sizeof (Elf64_External_Rela);
2044 if (GOT_TLS_GDESC_P (tls_type))
2045 {
2046 htab->srelplt->size += sizeof (Elf64_External_Rela);
2047 htab->tlsdesc_plt = (bfd_vma) -1;
2048 }
2049 }
2050 else
2051 h->got.offset = (bfd_vma) -1;
2052
2053 if (eh->dyn_relocs == NULL)
2054 return TRUE;
2055
2056 /* In the shared -Bsymbolic case, discard space allocated for
2057 dynamic pc-relative relocs against symbols which turn out to be
2058 defined in regular objects. For the normal shared case, discard
2059 space for pc-relative relocs that have become local due to symbol
2060 visibility changes. */
2061
2062 if (info->shared)
2063 {
2064 /* Relocs that use pc_count are those that appear on a call
2065 insn, or certain REL relocs that can generated via assembly.
2066 We want calls to protected symbols to resolve directly to the
2067 function rather than going via the plt. If people want
2068 function pointer comparisons to work as expected then they
2069 should avoid writing weird assembly. */
2070 if (SYMBOL_CALLS_LOCAL (info, h))
2071 {
2072 struct elf64_x86_64_dyn_relocs **pp;
2073
2074 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2075 {
2076 p->count -= p->pc_count;
2077 p->pc_count = 0;
2078 if (p->count == 0)
2079 *pp = p->next;
2080 else
2081 pp = &p->next;
2082 }
2083 }
2084
2085 /* Also discard relocs on undefined weak syms with non-default
2086 visibility. */
2087 if (eh->dyn_relocs != NULL
2088 && h->root.type == bfd_link_hash_undefweak)
2089 {
2090 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2091 eh->dyn_relocs = NULL;
2092
2093 /* Make sure undefined weak symbols are output as a dynamic
2094 symbol in PIEs. */
2095 else if (h->dynindx == -1
2096 && ! h->forced_local
2097 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2098 return FALSE;
2099 }
2100
2101 }
2102 else if (ELIMINATE_COPY_RELOCS)
2103 {
2104 /* For the non-shared case, discard space for relocs against
2105 symbols which turn out to need copy relocs or are not
2106 dynamic. */
2107
2108 if (!h->non_got_ref
2109 && ((h->def_dynamic
2110 && !h->def_regular)
2111 || (htab->elf.dynamic_sections_created
2112 && (h->root.type == bfd_link_hash_undefweak
2113 || h->root.type == bfd_link_hash_undefined))))
2114 {
2115 /* Make sure this symbol is output as a dynamic symbol.
2116 Undefined weak syms won't yet be marked as dynamic. */
2117 if (h->dynindx == -1
2118 && ! h->forced_local
2119 && ! bfd_elf_link_record_dynamic_symbol (info, h))
2120 return FALSE;
2121
2122 /* If that succeeded, we know we'll be keeping all the
2123 relocs. */
2124 if (h->dynindx != -1)
2125 goto keep;
2126 }
2127
2128 eh->dyn_relocs = NULL;
2129
2130 keep: ;
2131 }
2132
2133 /* Finally, allocate space. */
2134 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2135 {
2136 asection * sreloc;
2137
2138 sreloc = elf_section_data (p->sec)->sreloc;
2139
2140 BFD_ASSERT (sreloc != NULL);
2141
2142 sreloc->size += p->count * sizeof (Elf64_External_Rela);
2143 }
2144
2145 return TRUE;
2146 }
2147
2148 /* Find any dynamic relocs that apply to read-only sections. */
2149
2150 static bfd_boolean
2151 elf64_x86_64_readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2152 {
2153 struct elf64_x86_64_link_hash_entry *eh;
2154 struct elf64_x86_64_dyn_relocs *p;
2155
2156 if (h->root.type == bfd_link_hash_warning)
2157 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2158
2159 eh = (struct elf64_x86_64_link_hash_entry *) h;
2160 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2161 {
2162 asection *s = p->sec->output_section;
2163
2164 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2165 {
2166 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2167
2168 info->flags |= DF_TEXTREL;
2169
2170 /* Not an error, just cut short the traversal. */
2171 return FALSE;
2172 }
2173 }
2174 return TRUE;
2175 }
2176
2177 /* Set the sizes of the dynamic sections. */
2178
2179 static bfd_boolean
2180 elf64_x86_64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2181 struct bfd_link_info *info)
2182 {
2183 struct elf64_x86_64_link_hash_table *htab;
2184 bfd *dynobj;
2185 asection *s;
2186 bfd_boolean relocs;
2187 bfd *ibfd;
2188
2189 htab = elf64_x86_64_hash_table (info);
2190 dynobj = htab->elf.dynobj;
2191 if (dynobj == NULL)
2192 abort ();
2193
2194 if (htab->elf.dynamic_sections_created)
2195 {
2196 /* Set the contents of the .interp section to the interpreter. */
2197 if (info->executable)
2198 {
2199 s = bfd_get_section_by_name (dynobj, ".interp");
2200 if (s == NULL)
2201 abort ();
2202 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2203 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2204 }
2205 }
2206
2207 /* Set up .got offsets for local syms, and space for local dynamic
2208 relocs. */
2209 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2210 {
2211 bfd_signed_vma *local_got;
2212 bfd_signed_vma *end_local_got;
2213 char *local_tls_type;
2214 bfd_vma *local_tlsdesc_gotent;
2215 bfd_size_type locsymcount;
2216 Elf_Internal_Shdr *symtab_hdr;
2217 asection *srel;
2218
2219 if (! is_x86_64_elf (ibfd))
2220 continue;
2221
2222 for (s = ibfd->sections; s != NULL; s = s->next)
2223 {
2224 struct elf64_x86_64_dyn_relocs *p;
2225
2226 for (p = (struct elf64_x86_64_dyn_relocs *)
2227 (elf_section_data (s)->local_dynrel);
2228 p != NULL;
2229 p = p->next)
2230 {
2231 if (!bfd_is_abs_section (p->sec)
2232 && bfd_is_abs_section (p->sec->output_section))
2233 {
2234 /* Input section has been discarded, either because
2235 it is a copy of a linkonce section or due to
2236 linker script /DISCARD/, so we'll be discarding
2237 the relocs too. */
2238 }
2239 else if (p->count != 0)
2240 {
2241 srel = elf_section_data (p->sec)->sreloc;
2242 srel->size += p->count * sizeof (Elf64_External_Rela);
2243 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2244 info->flags |= DF_TEXTREL;
2245 }
2246 }
2247 }
2248
2249 local_got = elf_local_got_refcounts (ibfd);
2250 if (!local_got)
2251 continue;
2252
2253 symtab_hdr = &elf_symtab_hdr (ibfd);
2254 locsymcount = symtab_hdr->sh_info;
2255 end_local_got = local_got + locsymcount;
2256 local_tls_type = elf64_x86_64_local_got_tls_type (ibfd);
2257 local_tlsdesc_gotent = elf64_x86_64_local_tlsdesc_gotent (ibfd);
2258 s = htab->sgot;
2259 srel = htab->srelgot;
2260 for (; local_got < end_local_got;
2261 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
2262 {
2263 *local_tlsdesc_gotent = (bfd_vma) -1;
2264 if (*local_got > 0)
2265 {
2266 if (GOT_TLS_GDESC_P (*local_tls_type))
2267 {
2268 *local_tlsdesc_gotent = htab->sgotplt->size
2269 - elf64_x86_64_compute_jump_table_size (htab);
2270 htab->sgotplt->size += 2 * GOT_ENTRY_SIZE;
2271 *local_got = (bfd_vma) -2;
2272 }
2273 if (! GOT_TLS_GDESC_P (*local_tls_type)
2274 || GOT_TLS_GD_P (*local_tls_type))
2275 {
2276 *local_got = s->size;
2277 s->size += GOT_ENTRY_SIZE;
2278 if (GOT_TLS_GD_P (*local_tls_type))
2279 s->size += GOT_ENTRY_SIZE;
2280 }
2281 if (info->shared
2282 || GOT_TLS_GD_ANY_P (*local_tls_type)
2283 || *local_tls_type == GOT_TLS_IE)
2284 {
2285 if (GOT_TLS_GDESC_P (*local_tls_type))
2286 {
2287 htab->srelplt->size += sizeof (Elf64_External_Rela);
2288 htab->tlsdesc_plt = (bfd_vma) -1;
2289 }
2290 if (! GOT_TLS_GDESC_P (*local_tls_type)
2291 || GOT_TLS_GD_P (*local_tls_type))
2292 srel->size += sizeof (Elf64_External_Rela);
2293 }
2294 }
2295 else
2296 *local_got = (bfd_vma) -1;
2297 }
2298 }
2299
2300 if (htab->tls_ld_got.refcount > 0)
2301 {
2302 /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
2303 relocs. */
2304 htab->tls_ld_got.offset = htab->sgot->size;
2305 htab->sgot->size += 2 * GOT_ENTRY_SIZE;
2306 htab->srelgot->size += sizeof (Elf64_External_Rela);
2307 }
2308 else
2309 htab->tls_ld_got.offset = -1;
2310
2311 /* Allocate global sym .plt and .got entries, and space for global
2312 sym dynamic relocs. */
2313 elf_link_hash_traverse (&htab->elf, elf64_x86_64_allocate_dynrelocs,
2314 info);
2315
2316 /* For every jump slot reserved in the sgotplt, reloc_count is
2317 incremented. However, when we reserve space for TLS descriptors,
2318 it's not incremented, so in order to compute the space reserved
2319 for them, it suffices to multiply the reloc count by the jump
2320 slot size. */
2321 if (htab->srelplt)
2322 htab->sgotplt_jump_table_size
2323 = elf64_x86_64_compute_jump_table_size (htab);
2324
2325 if (htab->tlsdesc_plt)
2326 {
2327 /* If we're not using lazy TLS relocations, don't generate the
2328 PLT and GOT entries they require. */
2329 if ((info->flags & DF_BIND_NOW))
2330 htab->tlsdesc_plt = 0;
2331 else
2332 {
2333 htab->tlsdesc_got = htab->sgot->size;
2334 htab->sgot->size += GOT_ENTRY_SIZE;
2335 /* Reserve room for the initial entry.
2336 FIXME: we could probably do away with it in this case. */
2337 if (htab->splt->size == 0)
2338 htab->splt->size += PLT_ENTRY_SIZE;
2339 htab->tlsdesc_plt = htab->splt->size;
2340 htab->splt->size += PLT_ENTRY_SIZE;
2341 }
2342 }
2343
2344 /* We now have determined the sizes of the various dynamic sections.
2345 Allocate memory for them. */
2346 relocs = FALSE;
2347 for (s = dynobj->sections; s != NULL; s = s->next)
2348 {
2349 if ((s->flags & SEC_LINKER_CREATED) == 0)
2350 continue;
2351
2352 if (s == htab->splt
2353 || s == htab->sgot
2354 || s == htab->sgotplt
2355 || s == htab->iplt
2356 || s == htab->igotplt
2357 || s == htab->sdynbss)
2358 {
2359 /* Strip this section if we don't need it; see the
2360 comment below. */
2361 }
2362 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2363 {
2364 if (s->size != 0 && s != htab->srelplt)
2365 relocs = TRUE;
2366
2367 /* We use the reloc_count field as a counter if we need
2368 to copy relocs into the output file. */
2369 if (s != htab->srelplt)
2370 s->reloc_count = 0;
2371 }
2372 else
2373 {
2374 /* It's not one of our sections, so don't allocate space. */
2375 continue;
2376 }
2377
2378 if (s->size == 0)
2379 {
2380 /* If we don't need this section, strip it from the
2381 output file. This is mostly to handle .rela.bss and
2382 .rela.plt. We must create both sections in
2383 create_dynamic_sections, because they must be created
2384 before the linker maps input sections to output
2385 sections. The linker does that before
2386 adjust_dynamic_symbol is called, and it is that
2387 function which decides whether anything needs to go
2388 into these sections. */
2389
2390 s->flags |= SEC_EXCLUDE;
2391 continue;
2392 }
2393
2394 if ((s->flags & SEC_HAS_CONTENTS) == 0)
2395 continue;
2396
2397 /* Allocate memory for the section contents. We use bfd_zalloc
2398 here in case unused entries are not reclaimed before the
2399 section's contents are written out. This should not happen,
2400 but this way if it does, we get a R_X86_64_NONE reloc instead
2401 of garbage. */
2402 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2403 if (s->contents == NULL)
2404 return FALSE;
2405 }
2406
2407 if (htab->elf.dynamic_sections_created)
2408 {
2409 /* Add some entries to the .dynamic section. We fill in the
2410 values later, in elf64_x86_64_finish_dynamic_sections, but we
2411 must add the entries now so that we get the correct size for
2412 the .dynamic section. The DT_DEBUG entry is filled in by the
2413 dynamic linker and used by the debugger. */
2414 #define add_dynamic_entry(TAG, VAL) \
2415 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2416
2417 if (info->executable)
2418 {
2419 if (!add_dynamic_entry (DT_DEBUG, 0))
2420 return FALSE;
2421 }
2422
2423 if (htab->splt->size != 0)
2424 {
2425 if (!add_dynamic_entry (DT_PLTGOT, 0)
2426 || !add_dynamic_entry (DT_PLTRELSZ, 0)
2427 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2428 || !add_dynamic_entry (DT_JMPREL, 0))
2429 return FALSE;
2430
2431 if (htab->tlsdesc_plt
2432 && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
2433 || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
2434 return FALSE;
2435 }
2436
2437 if (relocs)
2438 {
2439 if (!add_dynamic_entry (DT_RELA, 0)
2440 || !add_dynamic_entry (DT_RELASZ, 0)
2441 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
2442 return FALSE;
2443
2444 /* If any dynamic relocs apply to a read-only section,
2445 then we need a DT_TEXTREL entry. */
2446 if ((info->flags & DF_TEXTREL) == 0)
2447 elf_link_hash_traverse (&htab->elf,
2448 elf64_x86_64_readonly_dynrelocs,
2449 info);
2450
2451 if ((info->flags & DF_TEXTREL) != 0)
2452 {
2453 if (!add_dynamic_entry (DT_TEXTREL, 0))
2454 return FALSE;
2455 }
2456 }
2457 }
2458 #undef add_dynamic_entry
2459
2460 return TRUE;
2461 }
2462
2463 static bfd_boolean
2464 elf64_x86_64_always_size_sections (bfd *output_bfd,
2465 struct bfd_link_info *info)
2466 {
2467 asection *tls_sec = elf_hash_table (info)->tls_sec;
2468
2469 if (tls_sec)
2470 {
2471 struct elf_link_hash_entry *tlsbase;
2472
2473 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
2474 "_TLS_MODULE_BASE_",
2475 FALSE, FALSE, FALSE);
2476
2477 if (tlsbase && tlsbase->type == STT_TLS)
2478 {
2479 struct bfd_link_hash_entry *bh = NULL;
2480 const struct elf_backend_data *bed
2481 = get_elf_backend_data (output_bfd);
2482
2483 if (!(_bfd_generic_link_add_one_symbol
2484 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
2485 tls_sec, 0, NULL, FALSE,
2486 bed->collect, &bh)))
2487 return FALSE;
2488
2489 elf64_x86_64_hash_table (info)->tls_module_base = bh;
2490
2491 tlsbase = (struct elf_link_hash_entry *)bh;
2492 tlsbase->def_regular = 1;
2493 tlsbase->other = STV_HIDDEN;
2494 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
2495 }
2496 }
2497
2498 return TRUE;
2499 }
2500
2501 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
2502 executables. Rather than setting it to the beginning of the TLS
2503 section, we have to set it to the end. This function may be called
2504 multiple times, it is idempotent. */
2505
2506 static void
2507 elf64_x86_64_set_tls_module_base (struct bfd_link_info *info)
2508 {
2509 struct bfd_link_hash_entry *base;
2510
2511 if (!info->executable)
2512 return;
2513
2514 base = elf64_x86_64_hash_table (info)->tls_module_base;
2515
2516 if (!base)
2517 return;
2518
2519 base->u.def.value = elf_hash_table (info)->tls_size;
2520 }
2521
2522 /* Return the base VMA address which should be subtracted from real addresses
2523 when resolving @dtpoff relocation.
2524 This is PT_TLS segment p_vaddr. */
2525
2526 static bfd_vma
2527 elf64_x86_64_dtpoff_base (struct bfd_link_info *info)
2528 {
2529 /* If tls_sec is NULL, we should have signalled an error already. */
2530 if (elf_hash_table (info)->tls_sec == NULL)
2531 return 0;
2532 return elf_hash_table (info)->tls_sec->vma;
2533 }
2534
2535 /* Return the relocation value for @tpoff relocation
2536 if STT_TLS virtual address is ADDRESS. */
2537
2538 static bfd_vma
2539 elf64_x86_64_tpoff (struct bfd_link_info *info, bfd_vma address)
2540 {
2541 struct elf_link_hash_table *htab = elf_hash_table (info);
2542
2543 /* If tls_segment is NULL, we should have signalled an error already. */
2544 if (htab->tls_sec == NULL)
2545 return 0;
2546 return address - htab->tls_size - htab->tls_sec->vma;
2547 }
2548
2549 /* Is the instruction before OFFSET in CONTENTS a 32bit relative
2550 branch? */
2551
2552 static bfd_boolean
2553 is_32bit_relative_branch (bfd_byte *contents, bfd_vma offset)
2554 {
2555 /* Opcode Instruction
2556 0xe8 call
2557 0xe9 jump
2558 0x0f 0x8x conditional jump */
2559 return ((offset > 0
2560 && (contents [offset - 1] == 0xe8
2561 || contents [offset - 1] == 0xe9))
2562 || (offset > 1
2563 && contents [offset - 2] == 0x0f
2564 && (contents [offset - 1] & 0xf0) == 0x80));
2565 }
2566
2567 /* Relocate an x86_64 ELF section. */
2568
2569 static bfd_boolean
2570 elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
2571 bfd *input_bfd, asection *input_section,
2572 bfd_byte *contents, Elf_Internal_Rela *relocs,
2573 Elf_Internal_Sym *local_syms,
2574 asection **local_sections)
2575 {
2576 struct elf64_x86_64_link_hash_table *htab;
2577 Elf_Internal_Shdr *symtab_hdr;
2578 struct elf_link_hash_entry **sym_hashes;
2579 bfd_vma *local_got_offsets;
2580 bfd_vma *local_tlsdesc_gotents;
2581 Elf_Internal_Rela *rel;
2582 Elf_Internal_Rela *relend;
2583
2584 BFD_ASSERT (is_x86_64_elf (input_bfd));
2585
2586 htab = elf64_x86_64_hash_table (info);
2587 symtab_hdr = &elf_symtab_hdr (input_bfd);
2588 sym_hashes = elf_sym_hashes (input_bfd);
2589 local_got_offsets = elf_local_got_offsets (input_bfd);
2590 local_tlsdesc_gotents = elf64_x86_64_local_tlsdesc_gotent (input_bfd);
2591
2592 elf64_x86_64_set_tls_module_base (info);
2593
2594 rel = relocs;
2595 relend = relocs + input_section->reloc_count;
2596 for (; rel < relend; rel++)
2597 {
2598 unsigned int r_type;
2599 reloc_howto_type *howto;
2600 unsigned long r_symndx;
2601 struct elf_link_hash_entry *h;
2602 Elf_Internal_Sym *sym;
2603 asection *sec;
2604 bfd_vma off, offplt;
2605 bfd_vma relocation;
2606 bfd_boolean unresolved_reloc;
2607 bfd_reloc_status_type r;
2608 int tls_type;
2609 asection *base_got;
2610
2611 r_type = ELF64_R_TYPE (rel->r_info);
2612 if (r_type == (int) R_X86_64_GNU_VTINHERIT
2613 || r_type == (int) R_X86_64_GNU_VTENTRY)
2614 continue;
2615
2616 if (r_type >= R_X86_64_max)
2617 {
2618 bfd_set_error (bfd_error_bad_value);
2619 return FALSE;
2620 }
2621
2622 howto = x86_64_elf_howto_table + r_type;
2623 r_symndx = ELF64_R_SYM (rel->r_info);
2624 h = NULL;
2625 sym = NULL;
2626 sec = NULL;
2627 unresolved_reloc = FALSE;
2628 if (r_symndx < symtab_hdr->sh_info)
2629 {
2630 sym = local_syms + r_symndx;
2631 sec = local_sections[r_symndx];
2632
2633 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2634 }
2635 else
2636 {
2637 bfd_boolean warned;
2638
2639 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2640 r_symndx, symtab_hdr, sym_hashes,
2641 h, sec, relocation,
2642 unresolved_reloc, warned);
2643 }
2644
2645 if (sec != NULL && elf_discarded_section (sec))
2646 {
2647 /* For relocs against symbols from removed linkonce sections,
2648 or sections discarded by a linker script, we just want the
2649 section contents zeroed. Avoid any special processing. */
2650 _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
2651 rel->r_info = 0;
2652 rel->r_addend = 0;
2653 continue;
2654 }
2655
2656 if (info->relocatable)
2657 continue;
2658
2659 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
2660 it here if it is defined in a non-shared object. */
2661 if (h != NULL
2662 && h->type == STT_GNU_IFUNC
2663 && h->def_regular)
2664 {
2665 asection *plt;
2666 bfd_vma plt_index;
2667
2668 if ((input_section->flags & SEC_ALLOC) == 0
2669 || h->plt.offset == (bfd_vma) -1)
2670 abort ();
2671
2672 /* STT_GNU_IFUNC symbol must go through PLT. */
2673 plt = htab->splt ? htab->splt : htab->iplt;
2674 relocation = (plt->output_section->vma
2675 + plt->output_offset + h->plt.offset);
2676
2677 switch (r_type)
2678 {
2679 default:
2680 (*_bfd_error_handler)
2681 (_("%B: relocation %s against STT_GNU_IFUNC "
2682 "symbol `%s' isn't handled by %s"), input_bfd,
2683 x86_64_elf_howto_table[r_type].name,
2684 h->root.root.string, __FUNCTION__);
2685 bfd_set_error (bfd_error_bad_value);
2686 return FALSE;
2687
2688 case R_X86_64_32S:
2689 if (info->shared)
2690 abort ();
2691 goto do_relocation;
2692
2693 case R_X86_64_64:
2694 if (rel->r_addend != 0)
2695 {
2696 (*_bfd_error_handler)
2697 (_("%B: relocation %s against STT_GNU_IFUNC "
2698 "symbol `%s' has non-zero addend: %d"),
2699 input_bfd, x86_64_elf_howto_table[r_type].name,
2700 h->root.root.string, rel->r_addend);
2701 bfd_set_error (bfd_error_bad_value);
2702 return FALSE;
2703 }
2704
2705 /* Generate dynamic relcoation only when there is a
2706 non-GOF reference in a shared object. */
2707 if (info->shared && h->non_got_ref)
2708 {
2709 Elf_Internal_Rela outrel;
2710 bfd_byte *loc;
2711 asection *sreloc;
2712
2713 /* Need a dynamic relocation get the the real
2714 function address. */
2715 outrel.r_offset = _bfd_elf_section_offset (output_bfd,
2716 info,
2717 input_section,
2718 rel->r_offset);
2719 if (outrel.r_offset == (bfd_vma) -1
2720 || outrel.r_offset == (bfd_vma) -2)
2721 abort ();
2722
2723 outrel.r_offset += (input_section->output_section->vma
2724 + input_section->output_offset);
2725
2726 if (h->dynindx == -1
2727 || h->forced_local)
2728 {
2729 /* This symbol is resolved locally. */
2730 outrel.r_info = ELF64_R_INFO (0, R_X86_64_IRELATIVE);
2731 outrel.r_addend = (h->root.u.def.value
2732 + h->root.u.def.section->output_section->vma
2733 + h->root.u.def.section->output_offset);
2734 }
2735 else
2736 {
2737 outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
2738 outrel.r_addend = 0;
2739 }
2740
2741 sreloc = htab->irelifunc;
2742 loc = sreloc->contents;
2743 loc += (sreloc->reloc_count++
2744 * sizeof (Elf64_External_Rela));
2745 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2746
2747 /* If this reloc is against an external symbol, we
2748 do not want to fiddle with the addend. Otherwise,
2749 we need to include the symbol value so that it
2750 becomes an addend for the dynamic reloc. For an
2751 internal symbol, we have updated addend. */
2752 continue;
2753 }
2754
2755 case R_X86_64_32:
2756 case R_X86_64_PC32:
2757 case R_X86_64_PC64:
2758 case R_X86_64_PLT32:
2759 goto do_relocation;
2760
2761 case R_X86_64_GOTPCREL:
2762 case R_X86_64_GOTPCREL64:
2763 base_got = htab->sgot;
2764 off = h->got.offset;
2765
2766 if (base_got == NULL)
2767 abort ();
2768
2769 if (off == (bfd_vma) -1)
2770 {
2771 /* We can't use h->got.offset here to save state, or
2772 even just remember the offset, as finish_dynamic_symbol
2773 would use that as offset into .got. */
2774
2775 if (htab->splt != NULL)
2776 {
2777 plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
2778 off = (plt_index + 3) * GOT_ENTRY_SIZE;
2779 base_got = htab->sgotplt;
2780 }
2781 else
2782 {
2783 plt_index = h->plt.offset / PLT_ENTRY_SIZE;
2784 off = plt_index * GOT_ENTRY_SIZE;
2785 base_got = htab->igotplt;
2786 }
2787
2788 if (h->dynindx == -1
2789 || h->forced_local
2790 || info->symbolic)
2791 {
2792 /* This references the local defitionion. We must
2793 initialize this entry in the global offset table.
2794 Since the offset must always be a multiple of 8,
2795 we use the least significant bit to record
2796 whether we have initialized it already.
2797
2798 When doing a dynamic link, we create a .rela.got
2799 relocation entry to initialize the value. This
2800 is done in the finish_dynamic_symbol routine. */
2801 if ((off & 1) != 0)
2802 off &= ~1;
2803 else
2804 {
2805 bfd_put_64 (output_bfd, relocation,
2806 base_got->contents + off);
2807 /* Note that this is harmless for the GOTPLT64
2808 case, as -1 | 1 still is -1. */
2809 h->got.offset |= 1;
2810 }
2811 }
2812 }
2813
2814 relocation = (base_got->output_section->vma
2815 + base_got->output_offset + off);
2816
2817 if (r_type != R_X86_64_GOTPCREL
2818 && r_type != R_X86_64_GOTPCREL64)
2819 {
2820 asection *gotplt;
2821 if (htab->splt != NULL)
2822 gotplt = htab->sgotplt;
2823 else
2824 gotplt = htab->igotplt;
2825 relocation -= (gotplt->output_section->vma
2826 - gotplt->output_offset);
2827 }
2828
2829 goto do_relocation;
2830 }
2831 }
2832
2833 /* When generating a shared object, the relocations handled here are
2834 copied into the output file to be resolved at run time. */
2835 switch (r_type)
2836 {
2837 case R_X86_64_GOT32:
2838 case R_X86_64_GOT64:
2839 /* Relocation is to the entry for this symbol in the global
2840 offset table. */
2841 case R_X86_64_GOTPCREL:
2842 case R_X86_64_GOTPCREL64:
2843 /* Use global offset table entry as symbol value. */
2844 case R_X86_64_GOTPLT64:
2845 /* This is the same as GOT64 for relocation purposes, but
2846 indicates the existence of a PLT entry. The difficulty is,
2847 that we must calculate the GOT slot offset from the PLT
2848 offset, if this symbol got a PLT entry (it was global).
2849 Additionally if it's computed from the PLT entry, then that
2850 GOT offset is relative to .got.plt, not to .got. */
2851 base_got = htab->sgot;
2852
2853 if (htab->sgot == NULL)
2854 abort ();
2855
2856 if (h != NULL)
2857 {
2858 bfd_boolean dyn;
2859
2860 off = h->got.offset;
2861 if (h->needs_plt
2862 && h->plt.offset != (bfd_vma)-1
2863 && off == (bfd_vma)-1)
2864 {
2865 /* We can't use h->got.offset here to save
2866 state, or even just remember the offset, as
2867 finish_dynamic_symbol would use that as offset into
2868 .got. */
2869 bfd_vma plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
2870 off = (plt_index + 3) * GOT_ENTRY_SIZE;
2871 base_got = htab->sgotplt;
2872 }
2873
2874 dyn = htab->elf.dynamic_sections_created;
2875
2876 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2877 || (info->shared
2878 && SYMBOL_REFERENCES_LOCAL (info, h))
2879 || (ELF_ST_VISIBILITY (h->other)
2880 && h->root.type == bfd_link_hash_undefweak))
2881 {
2882 /* This is actually a static link, or it is a -Bsymbolic
2883 link and the symbol is defined locally, or the symbol
2884 was forced to be local because of a version file. We
2885 must initialize this entry in the global offset table.
2886 Since the offset must always be a multiple of 8, we
2887 use the least significant bit to record whether we
2888 have initialized it already.
2889
2890 When doing a dynamic link, we create a .rela.got
2891 relocation entry to initialize the value. This is
2892 done in the finish_dynamic_symbol routine. */
2893 if ((off & 1) != 0)
2894 off &= ~1;
2895 else
2896 {
2897 bfd_put_64 (output_bfd, relocation,
2898 base_got->contents + off);
2899 /* Note that this is harmless for the GOTPLT64 case,
2900 as -1 | 1 still is -1. */
2901 h->got.offset |= 1;
2902 }
2903 }
2904 else
2905 unresolved_reloc = FALSE;
2906 }
2907 else
2908 {
2909 if (local_got_offsets == NULL)
2910 abort ();
2911
2912 off = local_got_offsets[r_symndx];
2913
2914 /* The offset must always be a multiple of 8. We use
2915 the least significant bit to record whether we have
2916 already generated the necessary reloc. */
2917 if ((off & 1) != 0)
2918 off &= ~1;
2919 else
2920 {
2921 bfd_put_64 (output_bfd, relocation,
2922 base_got->contents + off);
2923
2924 if (info->shared)
2925 {
2926 asection *s;
2927 Elf_Internal_Rela outrel;
2928 bfd_byte *loc;
2929
2930 /* We need to generate a R_X86_64_RELATIVE reloc
2931 for the dynamic linker. */
2932 s = htab->srelgot;
2933 if (s == NULL)
2934 abort ();
2935
2936 outrel.r_offset = (base_got->output_section->vma
2937 + base_got->output_offset
2938 + off);
2939 outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
2940 outrel.r_addend = relocation;
2941 loc = s->contents;
2942 loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
2943 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2944 }
2945
2946 local_got_offsets[r_symndx] |= 1;
2947 }
2948 }
2949
2950 if (off >= (bfd_vma) -2)
2951 abort ();
2952
2953 relocation = base_got->output_section->vma
2954 + base_got->output_offset + off;
2955 if (r_type != R_X86_64_GOTPCREL && r_type != R_X86_64_GOTPCREL64)
2956 relocation -= htab->sgotplt->output_section->vma
2957 - htab->sgotplt->output_offset;
2958
2959 break;
2960
2961 case R_X86_64_GOTOFF64:
2962 /* Relocation is relative to the start of the global offset
2963 table. */
2964
2965 /* Check to make sure it isn't a protected function symbol
2966 for shared library since it may not be local when used
2967 as function address. */
2968 if (info->shared
2969 && h
2970 && h->def_regular
2971 && h->type == STT_FUNC
2972 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
2973 {
2974 (*_bfd_error_handler)
2975 (_("%B: relocation R_X86_64_GOTOFF64 against protected function `%s' can not be used when making a shared object"),
2976 input_bfd, h->root.root.string);
2977 bfd_set_error (bfd_error_bad_value);
2978 return FALSE;
2979 }
2980
2981 /* Note that sgot is not involved in this
2982 calculation. We always want the start of .got.plt. If we
2983 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
2984 permitted by the ABI, we might have to change this
2985 calculation. */
2986 relocation -= htab->sgotplt->output_section->vma
2987 + htab->sgotplt->output_offset;
2988 break;
2989
2990 case R_X86_64_GOTPC32:
2991 case R_X86_64_GOTPC64:
2992 /* Use global offset table as symbol value. */
2993 relocation = htab->sgotplt->output_section->vma
2994 + htab->sgotplt->output_offset;
2995 unresolved_reloc = FALSE;
2996 break;
2997
2998 case R_X86_64_PLTOFF64:
2999 /* Relocation is PLT entry relative to GOT. For local
3000 symbols it's the symbol itself relative to GOT. */
3001 if (h != NULL
3002 /* See PLT32 handling. */
3003 && h->plt.offset != (bfd_vma) -1
3004 && htab->splt != NULL)
3005 {
3006 relocation = (htab->splt->output_section->vma
3007 + htab->splt->output_offset
3008 + h->plt.offset);
3009 unresolved_reloc = FALSE;
3010 }
3011
3012 relocation -= htab->sgotplt->output_section->vma
3013 + htab->sgotplt->output_offset;
3014 break;
3015
3016 case R_X86_64_PLT32:
3017 /* Relocation is to the entry for this symbol in the
3018 procedure linkage table. */
3019
3020 /* Resolve a PLT32 reloc against a local symbol directly,
3021 without using the procedure linkage table. */
3022 if (h == NULL)
3023 break;
3024
3025 if (h->plt.offset == (bfd_vma) -1
3026 || htab->splt == NULL)
3027 {
3028 /* We didn't make a PLT entry for this symbol. This
3029 happens when statically linking PIC code, or when
3030 using -Bsymbolic. */
3031 break;
3032 }
3033
3034 relocation = (htab->splt->output_section->vma
3035 + htab->splt->output_offset
3036 + h->plt.offset);
3037 unresolved_reloc = FALSE;
3038 break;
3039
3040 case R_X86_64_PC8:
3041 case R_X86_64_PC16:
3042 case R_X86_64_PC32:
3043 if (info->shared
3044 && (input_section->flags & SEC_ALLOC) != 0
3045 && (input_section->flags & SEC_READONLY) != 0
3046 && h != NULL)
3047 {
3048 bfd_boolean fail = FALSE;
3049 bfd_boolean branch
3050 = (r_type == R_X86_64_PC32
3051 && is_32bit_relative_branch (contents, rel->r_offset));
3052
3053 if (SYMBOL_REFERENCES_LOCAL (info, h))
3054 {
3055 /* Symbol is referenced locally. Make sure it is
3056 defined locally or for a branch. */
3057 fail = !h->def_regular && !branch;
3058 }
3059 else
3060 {
3061 /* Symbol isn't referenced locally. We only allow
3062 branch to symbol with non-default visibility. */
3063 fail = (!branch
3064 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT);
3065 }
3066
3067 if (fail)
3068 {
3069 const char *fmt;
3070 const char *v;
3071 const char *pic = "";
3072
3073 switch (ELF_ST_VISIBILITY (h->other))
3074 {
3075 case STV_HIDDEN:
3076 v = _("hidden symbol");
3077 break;
3078 case STV_INTERNAL:
3079 v = _("internal symbol");
3080 break;
3081 case STV_PROTECTED:
3082 v = _("protected symbol");
3083 break;
3084 default:
3085 v = _("symbol");
3086 pic = _("; recompile with -fPIC");
3087 break;
3088 }
3089
3090 if (h->def_regular)
3091 fmt = _("%B: relocation %s against %s `%s' can not be used when making a shared object%s");
3092 else
3093 fmt = _("%B: relocation %s against undefined %s `%s' can not be used when making a shared object%s");
3094
3095 (*_bfd_error_handler) (fmt, input_bfd,
3096 x86_64_elf_howto_table[r_type].name,
3097 v, h->root.root.string, pic);
3098 bfd_set_error (bfd_error_bad_value);
3099 return FALSE;
3100 }
3101 }
3102 /* Fall through. */
3103
3104 case R_X86_64_8:
3105 case R_X86_64_16:
3106 case R_X86_64_32:
3107 case R_X86_64_PC64:
3108 case R_X86_64_64:
3109 /* FIXME: The ABI says the linker should make sure the value is
3110 the same when it's zeroextended to 64 bit. */
3111
3112 if ((input_section->flags & SEC_ALLOC) == 0)
3113 break;
3114
3115 if ((info->shared
3116 && (h == NULL
3117 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3118 || h->root.type != bfd_link_hash_undefweak)
3119 && (! IS_X86_64_PCREL_TYPE (r_type)
3120 || ! SYMBOL_CALLS_LOCAL (info, h)))
3121 || (ELIMINATE_COPY_RELOCS
3122 && !info->shared
3123 && h != NULL
3124 && h->dynindx != -1
3125 && !h->non_got_ref
3126 && ((h->def_dynamic
3127 && !h->def_regular)
3128 || h->root.type == bfd_link_hash_undefweak
3129 || h->root.type == bfd_link_hash_undefined)))
3130 {
3131 Elf_Internal_Rela outrel;
3132 bfd_byte *loc;
3133 bfd_boolean skip, relocate;
3134 asection *sreloc;
3135
3136 /* When generating a shared object, these relocations
3137 are copied into the output file to be resolved at run
3138 time. */
3139 skip = FALSE;
3140 relocate = FALSE;
3141
3142 outrel.r_offset =
3143 _bfd_elf_section_offset (output_bfd, info, input_section,
3144 rel->r_offset);
3145 if (outrel.r_offset == (bfd_vma) -1)
3146 skip = TRUE;
3147 else if (outrel.r_offset == (bfd_vma) -2)
3148 skip = TRUE, relocate = TRUE;
3149
3150 outrel.r_offset += (input_section->output_section->vma
3151 + input_section->output_offset);
3152
3153 if (skip)
3154 memset (&outrel, 0, sizeof outrel);
3155
3156 /* h->dynindx may be -1 if this symbol was marked to
3157 become local. */
3158 else if (h != NULL
3159 && h->dynindx != -1
3160 && (IS_X86_64_PCREL_TYPE (r_type)
3161 || ! info->shared
3162 || ! SYMBOLIC_BIND (info, h)
3163 || ! h->def_regular))
3164 {
3165 outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
3166 outrel.r_addend = rel->r_addend;
3167 }
3168 else
3169 {
3170 /* This symbol is local, or marked to become local. */
3171 if (r_type == R_X86_64_64)
3172 {
3173 relocate = TRUE;
3174 outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
3175 outrel.r_addend = relocation + rel->r_addend;
3176 }
3177 else
3178 {
3179 long sindx;
3180
3181 if (bfd_is_abs_section (sec))
3182 sindx = 0;
3183 else if (sec == NULL || sec->owner == NULL)
3184 {
3185 bfd_set_error (bfd_error_bad_value);
3186 return FALSE;
3187 }
3188 else
3189 {
3190 asection *osec;
3191
3192 /* We are turning this relocation into one
3193 against a section symbol. It would be
3194 proper to subtract the symbol's value,
3195 osec->vma, from the emitted reloc addend,
3196 but ld.so expects buggy relocs. */
3197 osec = sec->output_section;
3198 sindx = elf_section_data (osec)->dynindx;
3199 if (sindx == 0)
3200 {
3201 asection *oi = htab->elf.text_index_section;
3202 sindx = elf_section_data (oi)->dynindx;
3203 }
3204 BFD_ASSERT (sindx != 0);
3205 }
3206
3207 outrel.r_info = ELF64_R_INFO (sindx, r_type);
3208 outrel.r_addend = relocation + rel->r_addend;
3209 }
3210 }
3211
3212 sreloc = elf_section_data (input_section)->sreloc;
3213
3214 BFD_ASSERT (sreloc != NULL && sreloc->contents != NULL);
3215
3216 loc = sreloc->contents;
3217 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
3218 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3219
3220 /* If this reloc is against an external symbol, we do
3221 not want to fiddle with the addend. Otherwise, we
3222 need to include the symbol value so that it becomes
3223 an addend for the dynamic reloc. */
3224 if (! relocate)
3225 continue;
3226 }
3227
3228 break;
3229
3230 case R_X86_64_TLSGD:
3231 case R_X86_64_GOTPC32_TLSDESC:
3232 case R_X86_64_TLSDESC_CALL:
3233 case R_X86_64_GOTTPOFF:
3234 tls_type = GOT_UNKNOWN;
3235 if (h == NULL && local_got_offsets)
3236 tls_type = elf64_x86_64_local_got_tls_type (input_bfd) [r_symndx];
3237 else if (h != NULL)
3238 tls_type = elf64_x86_64_hash_entry (h)->tls_type;
3239
3240 if (! elf64_x86_64_tls_transition (info, input_bfd,
3241 input_section, contents,
3242 symtab_hdr, sym_hashes,
3243 &r_type, tls_type, rel,
3244 relend, h))
3245 return FALSE;
3246
3247 if (r_type == R_X86_64_TPOFF32)
3248 {
3249 bfd_vma roff = rel->r_offset;
3250
3251 BFD_ASSERT (! unresolved_reloc);
3252
3253 if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
3254 {
3255 /* GD->LE transition.
3256 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
3257 .word 0x6666; rex64; call __tls_get_addr
3258 Change it into:
3259 movq %fs:0, %rax
3260 leaq foo@tpoff(%rax), %rax */
3261 memcpy (contents + roff - 4,
3262 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
3263 16);
3264 bfd_put_32 (output_bfd,
3265 elf64_x86_64_tpoff (info, relocation),
3266 contents + roff + 8);
3267 /* Skip R_X86_64_PC32/R_X86_64_PLT32. */
3268 rel++;
3269 continue;
3270 }
3271 else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
3272 {
3273 /* GDesc -> LE transition.
3274 It's originally something like:
3275 leaq x@tlsdesc(%rip), %rax
3276
3277 Change it to:
3278 movl $x@tpoff, %rax
3279 */
3280
3281 unsigned int val, type, type2;
3282
3283 type = bfd_get_8 (input_bfd, contents + roff - 3);
3284 type2 = bfd_get_8 (input_bfd, contents + roff - 2);
3285 val = bfd_get_8 (input_bfd, contents + roff - 1);
3286 bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
3287 contents + roff - 3);
3288 bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
3289 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
3290 contents + roff - 1);
3291 bfd_put_32 (output_bfd,
3292 elf64_x86_64_tpoff (info, relocation),
3293 contents + roff);
3294 continue;
3295 }
3296 else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
3297 {
3298 /* GDesc -> LE transition.
3299 It's originally:
3300 call *(%rax)
3301 Turn it into:
3302 xchg %ax,%ax. */
3303 bfd_put_8 (output_bfd, 0x66, contents + roff);
3304 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3305 continue;
3306 }
3307 else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_GOTTPOFF)
3308 {
3309 /* IE->LE transition:
3310 Originally it can be one of:
3311 movq foo@gottpoff(%rip), %reg
3312 addq foo@gottpoff(%rip), %reg
3313 We change it into:
3314 movq $foo, %reg
3315 leaq foo(%reg), %reg
3316 addq $foo, %reg. */
3317
3318 unsigned int val, type, reg;
3319
3320 val = bfd_get_8 (input_bfd, contents + roff - 3);
3321 type = bfd_get_8 (input_bfd, contents + roff - 2);
3322 reg = bfd_get_8 (input_bfd, contents + roff - 1);
3323 reg >>= 3;
3324 if (type == 0x8b)
3325 {
3326 /* movq */
3327 if (val == 0x4c)
3328 bfd_put_8 (output_bfd, 0x49,
3329 contents + roff - 3);
3330 bfd_put_8 (output_bfd, 0xc7,
3331 contents + roff - 2);
3332 bfd_put_8 (output_bfd, 0xc0 | reg,
3333 contents + roff - 1);
3334 }
3335 else if (reg == 4)
3336 {
3337 /* addq -> addq - addressing with %rsp/%r12 is
3338 special */
3339 if (val == 0x4c)
3340 bfd_put_8 (output_bfd, 0x49,
3341 contents + roff - 3);
3342 bfd_put_8 (output_bfd, 0x81,
3343 contents + roff - 2);
3344 bfd_put_8 (output_bfd, 0xc0 | reg,
3345 contents + roff - 1);
3346 }
3347 else
3348 {
3349 /* addq -> leaq */
3350 if (val == 0x4c)
3351 bfd_put_8 (output_bfd, 0x4d,
3352 contents + roff - 3);
3353 bfd_put_8 (output_bfd, 0x8d,
3354 contents + roff - 2);
3355 bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
3356 contents + roff - 1);
3357 }
3358 bfd_put_32 (output_bfd,
3359 elf64_x86_64_tpoff (info, relocation),
3360 contents + roff);
3361 continue;
3362 }
3363 else
3364 BFD_ASSERT (FALSE);
3365 }
3366
3367 if (htab->sgot == NULL)
3368 abort ();
3369
3370 if (h != NULL)
3371 {
3372 off = h->got.offset;
3373 offplt = elf64_x86_64_hash_entry (h)->tlsdesc_got;
3374 }
3375 else
3376 {
3377 if (local_got_offsets == NULL)
3378 abort ();
3379
3380 off = local_got_offsets[r_symndx];
3381 offplt = local_tlsdesc_gotents[r_symndx];
3382 }
3383
3384 if ((off & 1) != 0)
3385 off &= ~1;
3386 else
3387 {
3388 Elf_Internal_Rela outrel;
3389 bfd_byte *loc;
3390 int dr_type, indx;
3391 asection *sreloc;
3392
3393 if (htab->srelgot == NULL)
3394 abort ();
3395
3396 indx = h && h->dynindx != -1 ? h->dynindx : 0;
3397
3398 if (GOT_TLS_GDESC_P (tls_type))
3399 {
3400 outrel.r_info = ELF64_R_INFO (indx, R_X86_64_TLSDESC);
3401 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
3402 + 2 * GOT_ENTRY_SIZE <= htab->sgotplt->size);
3403 outrel.r_offset = (htab->sgotplt->output_section->vma
3404 + htab->sgotplt->output_offset
3405 + offplt
3406 + htab->sgotplt_jump_table_size);
3407 sreloc = htab->srelplt;
3408 loc = sreloc->contents;
3409 loc += sreloc->reloc_count++
3410 * sizeof (Elf64_External_Rela);
3411 BFD_ASSERT (loc + sizeof (Elf64_External_Rela)
3412 <= sreloc->contents + sreloc->size);
3413 if (indx == 0)
3414 outrel.r_addend = relocation - elf64_x86_64_dtpoff_base (info);
3415 else
3416 outrel.r_addend = 0;
3417 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3418 }
3419
3420 sreloc = htab->srelgot;
3421
3422 outrel.r_offset = (htab->sgot->output_section->vma
3423 + htab->sgot->output_offset + off);
3424
3425 if (GOT_TLS_GD_P (tls_type))
3426 dr_type = R_X86_64_DTPMOD64;
3427 else if (GOT_TLS_GDESC_P (tls_type))
3428 goto dr_done;
3429 else
3430 dr_type = R_X86_64_TPOFF64;
3431
3432 bfd_put_64 (output_bfd, 0, htab->sgot->contents + off);
3433 outrel.r_addend = 0;
3434 if ((dr_type == R_X86_64_TPOFF64
3435 || dr_type == R_X86_64_TLSDESC) && indx == 0)
3436 outrel.r_addend = relocation - elf64_x86_64_dtpoff_base (info);
3437 outrel.r_info = ELF64_R_INFO (indx, dr_type);
3438
3439 loc = sreloc->contents;
3440 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
3441 BFD_ASSERT (loc + sizeof (Elf64_External_Rela)
3442 <= sreloc->contents + sreloc->size);
3443 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3444
3445 if (GOT_TLS_GD_P (tls_type))
3446 {
3447 if (indx == 0)
3448 {
3449 BFD_ASSERT (! unresolved_reloc);
3450 bfd_put_64 (output_bfd,
3451 relocation - elf64_x86_64_dtpoff_base (info),
3452 htab->sgot->contents + off + GOT_ENTRY_SIZE);
3453 }
3454 else
3455 {
3456 bfd_put_64 (output_bfd, 0,
3457 htab->sgot->contents + off + GOT_ENTRY_SIZE);
3458 outrel.r_info = ELF64_R_INFO (indx,
3459 R_X86_64_DTPOFF64);
3460 outrel.r_offset += GOT_ENTRY_SIZE;
3461 sreloc->reloc_count++;
3462 loc += sizeof (Elf64_External_Rela);
3463 BFD_ASSERT (loc + sizeof (Elf64_External_Rela)
3464 <= sreloc->contents + sreloc->size);
3465 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3466 }
3467 }
3468
3469 dr_done:
3470 if (h != NULL)
3471 h->got.offset |= 1;
3472 else
3473 local_got_offsets[r_symndx] |= 1;
3474 }
3475
3476 if (off >= (bfd_vma) -2
3477 && ! GOT_TLS_GDESC_P (tls_type))
3478 abort ();
3479 if (r_type == ELF64_R_TYPE (rel->r_info))
3480 {
3481 if (r_type == R_X86_64_GOTPC32_TLSDESC
3482 || r_type == R_X86_64_TLSDESC_CALL)
3483 relocation = htab->sgotplt->output_section->vma
3484 + htab->sgotplt->output_offset
3485 + offplt + htab->sgotplt_jump_table_size;
3486 else
3487 relocation = htab->sgot->output_section->vma
3488 + htab->sgot->output_offset + off;
3489 unresolved_reloc = FALSE;
3490 }
3491 else
3492 {
3493 bfd_vma roff = rel->r_offset;
3494
3495 if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
3496 {
3497 /* GD->IE transition.
3498 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
3499 .word 0x6666; rex64; call __tls_get_addr@plt
3500 Change it into:
3501 movq %fs:0, %rax
3502 addq foo@gottpoff(%rip), %rax */
3503 memcpy (contents + roff - 4,
3504 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
3505 16);
3506
3507 relocation = (htab->sgot->output_section->vma
3508 + htab->sgot->output_offset + off
3509 - roff
3510 - input_section->output_section->vma
3511 - input_section->output_offset
3512 - 12);
3513 bfd_put_32 (output_bfd, relocation,
3514 contents + roff + 8);
3515 /* Skip R_X86_64_PLT32. */
3516 rel++;
3517 continue;
3518 }
3519 else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
3520 {
3521 /* GDesc -> IE transition.
3522 It's originally something like:
3523 leaq x@tlsdesc(%rip), %rax
3524
3525 Change it to:
3526 movq x@gottpoff(%rip), %rax # before xchg %ax,%ax
3527 */
3528
3529 unsigned int val, type, type2;
3530
3531 type = bfd_get_8 (input_bfd, contents + roff - 3);
3532 type2 = bfd_get_8 (input_bfd, contents + roff - 2);
3533 val = bfd_get_8 (input_bfd, contents + roff - 1);
3534
3535 /* Now modify the instruction as appropriate. To
3536 turn a leaq into a movq in the form we use it, it
3537 suffices to change the second byte from 0x8d to
3538 0x8b. */
3539 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
3540
3541 bfd_put_32 (output_bfd,
3542 htab->sgot->output_section->vma
3543 + htab->sgot->output_offset + off
3544 - rel->r_offset
3545 - input_section->output_section->vma
3546 - input_section->output_offset
3547 - 4,
3548 contents + roff);
3549 continue;
3550 }
3551 else if (ELF64_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
3552 {
3553 /* GDesc -> IE transition.
3554 It's originally:
3555 call *(%rax)
3556
3557 Change it to:
3558 xchg %ax,%ax. */
3559
3560 unsigned int val, type;
3561
3562 type = bfd_get_8 (input_bfd, contents + roff);
3563 val = bfd_get_8 (input_bfd, contents + roff + 1);
3564 bfd_put_8 (output_bfd, 0x66, contents + roff);
3565 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3566 continue;
3567 }
3568 else
3569 BFD_ASSERT (FALSE);
3570 }
3571 break;
3572
3573 case R_X86_64_TLSLD:
3574 if (! elf64_x86_64_tls_transition (info, input_bfd,
3575 input_section, contents,
3576 symtab_hdr, sym_hashes,
3577 &r_type, GOT_UNKNOWN,
3578 rel, relend, h))
3579 return FALSE;
3580
3581 if (r_type != R_X86_64_TLSLD)
3582 {
3583 /* LD->LE transition:
3584 leaq foo@tlsld(%rip), %rdi; call __tls_get_addr.
3585 We change it into:
3586 .word 0x6666; .byte 0x66; movl %fs:0, %rax. */
3587
3588 BFD_ASSERT (r_type == R_X86_64_TPOFF32);
3589 memcpy (contents + rel->r_offset - 3,
3590 "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
3591 /* Skip R_X86_64_PC32/R_X86_64_PLT32. */
3592 rel++;
3593 continue;
3594 }
3595
3596 if (htab->sgot == NULL)
3597 abort ();
3598
3599 off = htab->tls_ld_got.offset;
3600 if (off & 1)
3601 off &= ~1;
3602 else
3603 {
3604 Elf_Internal_Rela outrel;
3605 bfd_byte *loc;
3606
3607 if (htab->srelgot == NULL)
3608 abort ();
3609
3610 outrel.r_offset = (htab->sgot->output_section->vma
3611 + htab->sgot->output_offset + off);
3612
3613 bfd_put_64 (output_bfd, 0,
3614 htab->sgot->contents + off);
3615 bfd_put_64 (output_bfd, 0,
3616 htab->sgot->contents + off + GOT_ENTRY_SIZE);
3617 outrel.r_info = ELF64_R_INFO (0, R_X86_64_DTPMOD64);
3618 outrel.r_addend = 0;
3619 loc = htab->srelgot->contents;
3620 loc += htab->srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
3621 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3622 htab->tls_ld_got.offset |= 1;
3623 }
3624 relocation = htab->sgot->output_section->vma
3625 + htab->sgot->output_offset + off;
3626 unresolved_reloc = FALSE;
3627 break;
3628
3629 case R_X86_64_DTPOFF32:
3630 if (info->shared || (input_section->flags & SEC_CODE) == 0)
3631 relocation -= elf64_x86_64_dtpoff_base (info);
3632 else
3633 relocation = elf64_x86_64_tpoff (info, relocation);
3634 break;
3635
3636 case R_X86_64_TPOFF32:
3637 BFD_ASSERT (! info->shared);
3638 relocation = elf64_x86_64_tpoff (info, relocation);
3639 break;
3640
3641 default:
3642 break;
3643 }
3644
3645 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3646 because such sections are not SEC_ALLOC and thus ld.so will
3647 not process them. */
3648 if (unresolved_reloc
3649 && !((input_section->flags & SEC_DEBUGGING) != 0
3650 && h->def_dynamic))
3651 (*_bfd_error_handler)
3652 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3653 input_bfd,
3654 input_section,
3655 (long) rel->r_offset,
3656 howto->name,
3657 h->root.root.string);
3658
3659 do_relocation:
3660 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3661 contents, rel->r_offset,
3662 relocation, rel->r_addend);
3663
3664 if (r != bfd_reloc_ok)
3665 {
3666 const char *name;
3667
3668 if (h != NULL)
3669 name = h->root.root.string;
3670 else
3671 {
3672 name = bfd_elf_string_from_elf_section (input_bfd,
3673 symtab_hdr->sh_link,
3674 sym->st_name);
3675 if (name == NULL)
3676 return FALSE;
3677 if (*name == '\0')
3678 name = bfd_section_name (input_bfd, sec);
3679 }
3680
3681 if (r == bfd_reloc_overflow)
3682 {
3683 if (! ((*info->callbacks->reloc_overflow)
3684 (info, (h ? &h->root : NULL), name, howto->name,
3685 (bfd_vma) 0, input_bfd, input_section,
3686 rel->r_offset)))
3687 return FALSE;
3688 }
3689 else
3690 {
3691 (*_bfd_error_handler)
3692 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
3693 input_bfd, input_section,
3694 (long) rel->r_offset, name, (int) r);
3695 return FALSE;
3696 }
3697 }
3698 }
3699
3700 return TRUE;
3701 }
3702
3703 /* Finish up dynamic symbol handling. We set the contents of various
3704 dynamic sections here. */
3705
3706 static bfd_boolean
3707 elf64_x86_64_finish_dynamic_symbol (bfd *output_bfd,
3708 struct bfd_link_info *info,
3709 struct elf_link_hash_entry *h,
3710 Elf_Internal_Sym *sym)
3711 {
3712 struct elf64_x86_64_link_hash_table *htab;
3713
3714 htab = elf64_x86_64_hash_table (info);
3715
3716 if (h->plt.offset != (bfd_vma) -1)
3717 {
3718 bfd_vma plt_index;
3719 bfd_vma got_offset;
3720 Elf_Internal_Rela rela;
3721 bfd_byte *loc;
3722 asection *plt, *gotplt, *relplt;
3723
3724 /* When building a static executable, use .iplt, .igot.plt and
3725 .rela.iplt sections for STT_GNU_IFUNC symbols. */
3726 if (htab->splt != NULL)
3727 {
3728 plt = htab->splt;
3729 gotplt = htab->sgotplt;
3730 relplt = htab->srelplt;
3731 }
3732 else
3733 {
3734 plt = htab->iplt;
3735 gotplt = htab->igotplt;
3736 relplt = htab->irelplt;
3737 }
3738
3739 /* This symbol has an entry in the procedure linkage table. Set
3740 it up. */
3741 if ((h->dynindx == -1
3742 && !((h->forced_local || info->executable)
3743 && h->def_regular
3744 && h->type == STT_GNU_IFUNC))
3745 || plt == NULL
3746 || gotplt == NULL
3747 || relplt == NULL)
3748 abort ();
3749
3750 /* Get the index in the procedure linkage table which
3751 corresponds to this symbol. This is the index of this symbol
3752 in all the symbols for which we are making plt entries. The
3753 first entry in the procedure linkage table is reserved.
3754
3755 Get the offset into the .got table of the entry that
3756 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
3757 bytes. The first three are reserved for the dynamic linker.
3758
3759 For static executables, we don't reserve anything. */
3760
3761 if (plt == htab->splt)
3762 {
3763 plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
3764 got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
3765 }
3766 else
3767 {
3768 plt_index = h->plt.offset / PLT_ENTRY_SIZE;
3769 got_offset = plt_index * GOT_ENTRY_SIZE;
3770 }
3771
3772 /* Fill in the entry in the procedure linkage table. */
3773 memcpy (plt->contents + h->plt.offset, elf64_x86_64_plt_entry,
3774 PLT_ENTRY_SIZE);
3775
3776 /* Insert the relocation positions of the plt section. The magic
3777 numbers at the end of the statements are the positions of the
3778 relocations in the plt section. */
3779 /* Put offset for jmp *name@GOTPCREL(%rip), since the
3780 instruction uses 6 bytes, subtract this value. */
3781 bfd_put_32 (output_bfd,
3782 (gotplt->output_section->vma
3783 + gotplt->output_offset
3784 + got_offset
3785 - plt->output_section->vma
3786 - plt->output_offset
3787 - h->plt.offset
3788 - 6),
3789 plt->contents + h->plt.offset + 2);
3790
3791 /* Don't fill PLT entry for static executables. */
3792 if (plt == htab->splt)
3793 {
3794 /* Put relocation index. */
3795 bfd_put_32 (output_bfd, plt_index,
3796 plt->contents + h->plt.offset + 7);
3797 /* Put offset for jmp .PLT0. */
3798 bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
3799 plt->contents + h->plt.offset + 12);
3800 }
3801
3802 /* Fill in the entry in the global offset table, initially this
3803 points to the pushq instruction in the PLT which is at offset 6. */
3804 bfd_put_64 (output_bfd, (plt->output_section->vma
3805 + plt->output_offset
3806 + h->plt.offset + 6),
3807 gotplt->contents + got_offset);
3808
3809 /* Fill in the entry in the .rela.plt section. */
3810 rela.r_offset = (gotplt->output_section->vma
3811 + gotplt->output_offset
3812 + got_offset);
3813 if (h->dynindx == -1
3814 || ((info->executable
3815 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
3816 && h->def_regular
3817 && h->type == STT_GNU_IFUNC))
3818 {
3819 /* If an STT_GNU_IFUNC symbol is locally defined, generate
3820 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT. */
3821 rela.r_info = ELF64_R_INFO (0, R_X86_64_IRELATIVE);
3822 rela.r_addend = (h->root.u.def.value
3823 + h->root.u.def.section->output_section->vma
3824 + h->root.u.def.section->output_offset);
3825 }
3826 else
3827 {
3828 rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_JUMP_SLOT);
3829 rela.r_addend = 0;
3830 }
3831 loc = relplt->contents + plt_index * sizeof (Elf64_External_Rela);
3832 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3833
3834 if (!h->def_regular)
3835 {
3836 /* Mark the symbol as undefined, rather than as defined in
3837 the .plt section. Leave the value if there were any
3838 relocations where pointer equality matters (this is a clue
3839 for the dynamic linker, to make function pointer
3840 comparisons work between an application and shared
3841 library), otherwise set it to zero. If a function is only
3842 called from a binary, there is no need to slow down
3843 shared libraries because of that. */
3844 sym->st_shndx = SHN_UNDEF;
3845 if (!h->pointer_equality_needed)
3846 sym->st_value = 0;
3847 }
3848 }
3849
3850 if (h->got.offset != (bfd_vma) -1
3851 && ! GOT_TLS_GD_ANY_P (elf64_x86_64_hash_entry (h)->tls_type)
3852 && elf64_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE)
3853 {
3854 Elf_Internal_Rela rela;
3855 bfd_byte *loc;
3856
3857 /* This symbol has an entry in the global offset table. Set it
3858 up. */
3859 if (htab->sgot == NULL || htab->srelgot == NULL)
3860 abort ();
3861
3862 rela.r_offset = (htab->sgot->output_section->vma
3863 + htab->sgot->output_offset
3864 + (h->got.offset &~ (bfd_vma) 1));
3865
3866 /* If this is a static link, or it is a -Bsymbolic link and the
3867 symbol is defined locally or was forced to be local because
3868 of a version file, we just want to emit a RELATIVE reloc.
3869 The entry in the global offset table will already have been
3870 initialized in the relocate_section function. */
3871 if (h->def_regular
3872 && h->type == STT_GNU_IFUNC)
3873 {
3874 if (info->shared)
3875 {
3876 /* Generate R_X86_64_GLOB_DAT. */
3877 goto do_glob_dat;
3878 }
3879 else
3880 {
3881 if (!h->pointer_equality_needed)
3882 abort ();
3883
3884 /* For non-shared object, we can't use .got.plt, which
3885 contains the real function addres if we need pointer
3886 equality. We load the GOT entry with the PLT entry. */
3887 asection *plt = htab->splt ? htab->splt : htab->iplt;
3888 bfd_put_64 (output_bfd, (plt->output_section->vma
3889 + plt->output_offset
3890 + h->plt.offset),
3891 htab->sgot->contents + h->got.offset);
3892 return TRUE;
3893 }
3894 }
3895 else if (info->shared
3896 && SYMBOL_REFERENCES_LOCAL (info, h))
3897 {
3898 if (!h->def_regular)
3899 return FALSE;
3900 BFD_ASSERT((h->got.offset & 1) != 0);
3901 rela.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
3902 rela.r_addend = (h->root.u.def.value
3903 + h->root.u.def.section->output_section->vma
3904 + h->root.u.def.section->output_offset);
3905 }
3906 else
3907 {
3908 BFD_ASSERT((h->got.offset & 1) == 0);
3909 do_glob_dat:
3910 bfd_put_64 (output_bfd, (bfd_vma) 0,
3911 htab->sgot->contents + h->got.offset);
3912 rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_GLOB_DAT);
3913 rela.r_addend = 0;
3914 }
3915
3916 loc = htab->srelgot->contents;
3917 loc += htab->srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
3918 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3919 }
3920
3921 if (h->needs_copy)
3922 {
3923 Elf_Internal_Rela rela;
3924 bfd_byte *loc;
3925
3926 /* This symbol needs a copy reloc. Set it up. */
3927
3928 if (h->dynindx == -1
3929 || (h->root.type != bfd_link_hash_defined
3930 && h->root.type != bfd_link_hash_defweak)
3931 || htab->srelbss == NULL)
3932 abort ();
3933
3934 rela.r_offset = (h->root.u.def.value
3935 + h->root.u.def.section->output_section->vma
3936 + h->root.u.def.section->output_offset);
3937 rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_COPY);
3938 rela.r_addend = 0;
3939 loc = htab->srelbss->contents;
3940 loc += htab->srelbss->reloc_count++ * sizeof (Elf64_External_Rela);
3941 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3942 }
3943
3944 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
3945 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3946 || h == htab->elf.hgot)
3947 sym->st_shndx = SHN_ABS;
3948
3949 return TRUE;
3950 }
3951
3952 /* Used to decide how to sort relocs in an optimal manner for the
3953 dynamic linker, before writing them out. */
3954
3955 static enum elf_reloc_type_class
3956 elf64_x86_64_reloc_type_class (const Elf_Internal_Rela *rela)
3957 {
3958 switch ((int) ELF64_R_TYPE (rela->r_info))
3959 {
3960 case R_X86_64_RELATIVE:
3961 return reloc_class_relative;
3962 case R_X86_64_JUMP_SLOT:
3963 return reloc_class_plt;
3964 case R_X86_64_COPY:
3965 return reloc_class_copy;
3966 default:
3967 return reloc_class_normal;
3968 }
3969 }
3970
3971 /* Finish up the dynamic sections. */
3972
3973 static bfd_boolean
3974 elf64_x86_64_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
3975 {
3976 struct elf64_x86_64_link_hash_table *htab;
3977 bfd *dynobj;
3978 asection *sdyn;
3979
3980 htab = elf64_x86_64_hash_table (info);
3981 dynobj = htab->elf.dynobj;
3982 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3983
3984 if (htab->elf.dynamic_sections_created)
3985 {
3986 Elf64_External_Dyn *dyncon, *dynconend;
3987
3988 if (sdyn == NULL || htab->sgot == NULL)
3989 abort ();
3990
3991 dyncon = (Elf64_External_Dyn *) sdyn->contents;
3992 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
3993 for (; dyncon < dynconend; dyncon++)
3994 {
3995 Elf_Internal_Dyn dyn;
3996 asection *s;
3997
3998 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3999
4000 switch (dyn.d_tag)
4001 {
4002 default:
4003 continue;
4004
4005 case DT_PLTGOT:
4006 s = htab->sgotplt;
4007 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4008 break;
4009
4010 case DT_JMPREL:
4011 dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
4012 break;
4013
4014 case DT_PLTRELSZ:
4015 s = htab->srelplt->output_section;
4016 dyn.d_un.d_val = s->size;
4017 break;
4018
4019 case DT_RELASZ:
4020 /* The procedure linkage table relocs (DT_JMPREL) should
4021 not be included in the overall relocs (DT_RELA).
4022 Therefore, we override the DT_RELASZ entry here to
4023 make it not include the JMPREL relocs. Since the
4024 linker script arranges for .rela.plt to follow all
4025 other relocation sections, we don't have to worry
4026 about changing the DT_RELA entry. */
4027 if (htab->srelplt != NULL)
4028 {
4029 s = htab->srelplt->output_section;
4030 dyn.d_un.d_val -= s->size;
4031 }
4032 break;
4033
4034 case DT_TLSDESC_PLT:
4035 s = htab->splt;
4036 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
4037 + htab->tlsdesc_plt;
4038 break;
4039
4040 case DT_TLSDESC_GOT:
4041 s = htab->sgot;
4042 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
4043 + htab->tlsdesc_got;
4044 break;
4045 }
4046
4047 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
4048 }
4049
4050 /* Fill in the special first entry in the procedure linkage table. */
4051 if (htab->splt && htab->splt->size > 0)
4052 {
4053 /* Fill in the first entry in the procedure linkage table. */
4054 memcpy (htab->splt->contents, elf64_x86_64_plt0_entry,
4055 PLT_ENTRY_SIZE);
4056 /* Add offset for pushq GOT+8(%rip), since the instruction
4057 uses 6 bytes subtract this value. */
4058 bfd_put_32 (output_bfd,
4059 (htab->sgotplt->output_section->vma
4060 + htab->sgotplt->output_offset
4061 + 8
4062 - htab->splt->output_section->vma
4063 - htab->splt->output_offset
4064 - 6),
4065 htab->splt->contents + 2);
4066 /* Add offset for jmp *GOT+16(%rip). The 12 is the offset to
4067 the end of the instruction. */
4068 bfd_put_32 (output_bfd,
4069 (htab->sgotplt->output_section->vma
4070 + htab->sgotplt->output_offset
4071 + 16
4072 - htab->splt->output_section->vma
4073 - htab->splt->output_offset
4074 - 12),
4075 htab->splt->contents + 8);
4076
4077 elf_section_data (htab->splt->output_section)->this_hdr.sh_entsize =
4078 PLT_ENTRY_SIZE;
4079
4080 if (htab->tlsdesc_plt)
4081 {
4082 bfd_put_64 (output_bfd, (bfd_vma) 0,
4083 htab->sgot->contents + htab->tlsdesc_got);
4084
4085 memcpy (htab->splt->contents + htab->tlsdesc_plt,
4086 elf64_x86_64_plt0_entry,
4087 PLT_ENTRY_SIZE);
4088
4089 /* Add offset for pushq GOT+8(%rip), since the
4090 instruction uses 6 bytes subtract this value. */
4091 bfd_put_32 (output_bfd,
4092 (htab->sgotplt->output_section->vma
4093 + htab->sgotplt->output_offset
4094 + 8
4095 - htab->splt->output_section->vma
4096 - htab->splt->output_offset
4097 - htab->tlsdesc_plt
4098 - 6),
4099 htab->splt->contents + htab->tlsdesc_plt + 2);
4100 /* Add offset for jmp *GOT+TDG(%rip), where TGD stands for
4101 htab->tlsdesc_got. The 12 is the offset to the end of
4102 the instruction. */
4103 bfd_put_32 (output_bfd,
4104 (htab->sgot->output_section->vma
4105 + htab->sgot->output_offset
4106 + htab->tlsdesc_got
4107 - htab->splt->output_section->vma
4108 - htab->splt->output_offset
4109 - htab->tlsdesc_plt
4110 - 12),
4111 htab->splt->contents + htab->tlsdesc_plt + 8);
4112 }
4113 }
4114 }
4115
4116 if (htab->sgotplt)
4117 {
4118 /* Fill in the first three entries in the global offset table. */
4119 if (htab->sgotplt->size > 0)
4120 {
4121 /* Set the first entry in the global offset table to the address of
4122 the dynamic section. */
4123 if (sdyn == NULL)
4124 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents);
4125 else
4126 bfd_put_64 (output_bfd,
4127 sdyn->output_section->vma + sdyn->output_offset,
4128 htab->sgotplt->contents);
4129 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
4130 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + GOT_ENTRY_SIZE);
4131 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + GOT_ENTRY_SIZE*2);
4132 }
4133
4134 elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize =
4135 GOT_ENTRY_SIZE;
4136 }
4137
4138 if (htab->sgot && htab->sgot->size > 0)
4139 elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize
4140 = GOT_ENTRY_SIZE;
4141
4142 return TRUE;
4143 }
4144
4145 /* Return address for Ith PLT stub in section PLT, for relocation REL
4146 or (bfd_vma) -1 if it should not be included. */
4147
4148 static bfd_vma
4149 elf64_x86_64_plt_sym_val (bfd_vma i, const asection *plt,
4150 const arelent *rel ATTRIBUTE_UNUSED)
4151 {
4152 return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
4153 }
4154
4155 /* Handle an x86-64 specific section when reading an object file. This
4156 is called when elfcode.h finds a section with an unknown type. */
4157
4158 static bfd_boolean
4159 elf64_x86_64_section_from_shdr (bfd *abfd,
4160 Elf_Internal_Shdr *hdr,
4161 const char *name,
4162 int shindex)
4163 {
4164 if (hdr->sh_type != SHT_X86_64_UNWIND)
4165 return FALSE;
4166
4167 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
4168 return FALSE;
4169
4170 return TRUE;
4171 }
4172
4173 /* Hook called by the linker routine which adds symbols from an object
4174 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
4175 of .bss. */
4176
4177 static bfd_boolean
4178 elf64_x86_64_add_symbol_hook (bfd *abfd,
4179 struct bfd_link_info *info,
4180 Elf_Internal_Sym *sym,
4181 const char **namep ATTRIBUTE_UNUSED,
4182 flagword *flagsp ATTRIBUTE_UNUSED,
4183 asection **secp,
4184 bfd_vma *valp)
4185 {
4186 asection *lcomm;
4187
4188 switch (sym->st_shndx)
4189 {
4190 case SHN_X86_64_LCOMMON:
4191 lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
4192 if (lcomm == NULL)
4193 {
4194 lcomm = bfd_make_section_with_flags (abfd,
4195 "LARGE_COMMON",
4196 (SEC_ALLOC
4197 | SEC_IS_COMMON
4198 | SEC_LINKER_CREATED));
4199 if (lcomm == NULL)
4200 return FALSE;
4201 elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
4202 }
4203 *secp = lcomm;
4204 *valp = sym->st_size;
4205 break;
4206 }
4207
4208 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
4209 elf_tdata (info->output_bfd)->has_ifunc_symbols = TRUE;
4210
4211 return TRUE;
4212 }
4213
4214
4215 /* Given a BFD section, try to locate the corresponding ELF section
4216 index. */
4217
4218 static bfd_boolean
4219 elf64_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
4220 asection *sec, int *index)
4221 {
4222 if (sec == &_bfd_elf_large_com_section)
4223 {
4224 *index = SHN_X86_64_LCOMMON;
4225 return TRUE;
4226 }
4227 return FALSE;
4228 }
4229
4230 /* Process a symbol. */
4231
4232 static void
4233 elf64_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
4234 asymbol *asym)
4235 {
4236 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
4237
4238 switch (elfsym->internal_elf_sym.st_shndx)
4239 {
4240 case SHN_X86_64_LCOMMON:
4241 asym->section = &_bfd_elf_large_com_section;
4242 asym->value = elfsym->internal_elf_sym.st_size;
4243 /* Common symbol doesn't set BSF_GLOBAL. */
4244 asym->flags &= ~BSF_GLOBAL;
4245 break;
4246 }
4247 }
4248
4249 static bfd_boolean
4250 elf64_x86_64_common_definition (Elf_Internal_Sym *sym)
4251 {
4252 return (sym->st_shndx == SHN_COMMON
4253 || sym->st_shndx == SHN_X86_64_LCOMMON);
4254 }
4255
4256 static unsigned int
4257 elf64_x86_64_common_section_index (asection *sec)
4258 {
4259 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
4260 return SHN_COMMON;
4261 else
4262 return SHN_X86_64_LCOMMON;
4263 }
4264
4265 static asection *
4266 elf64_x86_64_common_section (asection *sec)
4267 {
4268 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
4269 return bfd_com_section_ptr;
4270 else
4271 return &_bfd_elf_large_com_section;
4272 }
4273
4274 static bfd_boolean
4275 elf64_x86_64_merge_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
4276 struct elf_link_hash_entry **sym_hash ATTRIBUTE_UNUSED,
4277 struct elf_link_hash_entry *h,
4278 Elf_Internal_Sym *sym,
4279 asection **psec,
4280 bfd_vma *pvalue ATTRIBUTE_UNUSED,
4281 unsigned int *pold_alignment ATTRIBUTE_UNUSED,
4282 bfd_boolean *skip ATTRIBUTE_UNUSED,
4283 bfd_boolean *override ATTRIBUTE_UNUSED,
4284 bfd_boolean *type_change_ok ATTRIBUTE_UNUSED,
4285 bfd_boolean *size_change_ok ATTRIBUTE_UNUSED,
4286 bfd_boolean *newdef ATTRIBUTE_UNUSED,
4287 bfd_boolean *newdyn,
4288 bfd_boolean *newdyncommon ATTRIBUTE_UNUSED,
4289 bfd_boolean *newweak ATTRIBUTE_UNUSED,
4290 bfd *abfd ATTRIBUTE_UNUSED,
4291 asection **sec,
4292 bfd_boolean *olddef ATTRIBUTE_UNUSED,
4293 bfd_boolean *olddyn,
4294 bfd_boolean *olddyncommon ATTRIBUTE_UNUSED,
4295 bfd_boolean *oldweak ATTRIBUTE_UNUSED,
4296 bfd *oldbfd,
4297 asection **oldsec)
4298 {
4299 /* A normal common symbol and a large common symbol result in a
4300 normal common symbol. We turn the large common symbol into a
4301 normal one. */
4302 if (!*olddyn
4303 && h->root.type == bfd_link_hash_common
4304 && !*newdyn
4305 && bfd_is_com_section (*sec)
4306 && *oldsec != *sec)
4307 {
4308 if (sym->st_shndx == SHN_COMMON
4309 && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) != 0)
4310 {
4311 h->root.u.c.p->section
4312 = bfd_make_section_old_way (oldbfd, "COMMON");
4313 h->root.u.c.p->section->flags = SEC_ALLOC;
4314 }
4315 else if (sym->st_shndx == SHN_X86_64_LCOMMON
4316 && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) == 0)
4317 *psec = *sec = bfd_com_section_ptr;
4318 }
4319
4320 return TRUE;
4321 }
4322
4323 static int
4324 elf64_x86_64_additional_program_headers (bfd *abfd,
4325 struct bfd_link_info *info ATTRIBUTE_UNUSED)
4326 {
4327 asection *s;
4328 int count = 0;
4329
4330 /* Check to see if we need a large readonly segment. */
4331 s = bfd_get_section_by_name (abfd, ".lrodata");
4332 if (s && (s->flags & SEC_LOAD))
4333 count++;
4334
4335 /* Check to see if we need a large data segment. Since .lbss sections
4336 is placed right after the .bss section, there should be no need for
4337 a large data segment just because of .lbss. */
4338 s = bfd_get_section_by_name (abfd, ".ldata");
4339 if (s && (s->flags & SEC_LOAD))
4340 count++;
4341
4342 return count;
4343 }
4344
4345 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
4346
4347 static bfd_boolean
4348 elf64_x86_64_hash_symbol (struct elf_link_hash_entry *h)
4349 {
4350 if (h->plt.offset != (bfd_vma) -1
4351 && !h->def_regular
4352 && !h->pointer_equality_needed)
4353 return FALSE;
4354
4355 return _bfd_elf_hash_symbol (h);
4356 }
4357
4358 static const struct bfd_elf_special_section
4359 elf64_x86_64_special_sections[]=
4360 {
4361 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
4362 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
4363 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
4364 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
4365 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
4366 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
4367 { NULL, 0, 0, 0, 0 }
4368 };
4369
4370 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_vec
4371 #define TARGET_LITTLE_NAME "elf64-x86-64"
4372 #define ELF_ARCH bfd_arch_i386
4373 #define ELF_MACHINE_CODE EM_X86_64
4374 #define ELF_MAXPAGESIZE 0x200000
4375 #define ELF_MINPAGESIZE 0x1000
4376 #define ELF_COMMONPAGESIZE 0x1000
4377
4378 #define elf_backend_can_gc_sections 1
4379 #define elf_backend_can_refcount 1
4380 #define elf_backend_want_got_plt 1
4381 #define elf_backend_plt_readonly 1
4382 #define elf_backend_want_plt_sym 0
4383 #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
4384 #define elf_backend_rela_normal 1
4385
4386 #define elf_info_to_howto elf64_x86_64_info_to_howto
4387
4388 #define bfd_elf64_bfd_link_hash_table_create \
4389 elf64_x86_64_link_hash_table_create
4390 #define bfd_elf64_bfd_reloc_type_lookup elf64_x86_64_reloc_type_lookup
4391 #define bfd_elf64_bfd_reloc_name_lookup \
4392 elf64_x86_64_reloc_name_lookup
4393
4394 #define elf_backend_adjust_dynamic_symbol elf64_x86_64_adjust_dynamic_symbol
4395 #define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
4396 #define elf_backend_check_relocs elf64_x86_64_check_relocs
4397 #define elf_backend_copy_indirect_symbol elf64_x86_64_copy_indirect_symbol
4398 #define elf_backend_create_dynamic_sections elf64_x86_64_create_dynamic_sections
4399 #define elf_backend_finish_dynamic_sections elf64_x86_64_finish_dynamic_sections
4400 #define elf_backend_finish_dynamic_symbol elf64_x86_64_finish_dynamic_symbol
4401 #define elf_backend_gc_mark_hook elf64_x86_64_gc_mark_hook
4402 #define elf_backend_gc_sweep_hook elf64_x86_64_gc_sweep_hook
4403 #define elf_backend_grok_prstatus elf64_x86_64_grok_prstatus
4404 #define elf_backend_grok_psinfo elf64_x86_64_grok_psinfo
4405 #define elf_backend_reloc_type_class elf64_x86_64_reloc_type_class
4406 #define elf_backend_relocate_section elf64_x86_64_relocate_section
4407 #define elf_backend_size_dynamic_sections elf64_x86_64_size_dynamic_sections
4408 #define elf_backend_always_size_sections elf64_x86_64_always_size_sections
4409 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
4410 #define elf_backend_plt_sym_val elf64_x86_64_plt_sym_val
4411 #define elf_backend_object_p elf64_x86_64_elf_object_p
4412 #define bfd_elf64_mkobject elf64_x86_64_mkobject
4413
4414 #define elf_backend_section_from_shdr \
4415 elf64_x86_64_section_from_shdr
4416
4417 #define elf_backend_section_from_bfd_section \
4418 elf64_x86_64_elf_section_from_bfd_section
4419 #define elf_backend_add_symbol_hook \
4420 elf64_x86_64_add_symbol_hook
4421 #define elf_backend_symbol_processing \
4422 elf64_x86_64_symbol_processing
4423 #define elf_backend_common_section_index \
4424 elf64_x86_64_common_section_index
4425 #define elf_backend_common_section \
4426 elf64_x86_64_common_section
4427 #define elf_backend_common_definition \
4428 elf64_x86_64_common_definition
4429 #define elf_backend_merge_symbol \
4430 elf64_x86_64_merge_symbol
4431 #define elf_backend_special_sections \
4432 elf64_x86_64_special_sections
4433 #define elf_backend_additional_program_headers \
4434 elf64_x86_64_additional_program_headers
4435 #define elf_backend_hash_symbol \
4436 elf64_x86_64_hash_symbol
4437
4438 #undef elf_backend_post_process_headers
4439 #define elf_backend_post_process_headers _bfd_elf_set_osabi
4440
4441 #include "elf64-target.h"
4442
4443 /* FreeBSD support. */
4444
4445 #undef TARGET_LITTLE_SYM
4446 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_freebsd_vec
4447 #undef TARGET_LITTLE_NAME
4448 #define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
4449
4450 #undef ELF_OSABI
4451 #define ELF_OSABI ELFOSABI_FREEBSD
4452
4453 #undef elf64_bed
4454 #define elf64_bed elf64_x86_64_fbsd_bed
4455
4456 #include "elf64-target.h"
This page took 0.121115 seconds and 4 git commands to generate.