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