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