Add print 'file'::var testcase with two libs defining the same global variable
[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;
3689 if (h && h->root.root.string)
3690 name = h->root.root.string;
3691 else
3692 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
3693 sym, NULL);
3694 (*_bfd_error_handler)
3695 (_("%B: addend %ld in relocation %s against "
3696 "symbol `%s' at 0x%lx in section `%A' is "
3697 "out of range"),
3698 input_bfd, input_section,
3699 (long) rel->r_addend,
3700 x86_64_elf_howto_table[r_type].name,
3701 name, (unsigned long) rel->r_offset);
3702 bfd_set_error (bfd_error_bad_value);
3703 return FALSE;
3704 }
64d25c44 3705 }
607c0e09
AS
3706 else
3707 {
3708 long sindx;
3709
8517fae7 3710 if (bfd_is_abs_section (sec))
607c0e09
AS
3711 sindx = 0;
3712 else if (sec == NULL || sec->owner == NULL)
3713 {
3714 bfd_set_error (bfd_error_bad_value);
b34976b6 3715 return FALSE;
607c0e09
AS
3716 }
3717 else
3718 {
3719 asection *osec;
3720
74541ad4
AM
3721 /* We are turning this relocation into one
3722 against a section symbol. It would be
3723 proper to subtract the symbol's value,
3724 osec->vma, from the emitted reloc addend,
3725 but ld.so expects buggy relocs. */
607c0e09
AS
3726 osec = sec->output_section;
3727 sindx = elf_section_data (osec)->dynindx;
74541ad4
AM
3728 if (sindx == 0)
3729 {
3730 asection *oi = htab->elf.text_index_section;
3731 sindx = elf_section_data (oi)->dynindx;
3732 }
3733 BFD_ASSERT (sindx != 0);
607c0e09
AS
3734 }
3735
351f65ca 3736 outrel.r_info = htab->r_info (sindx, r_type);
607c0e09
AS
3737 outrel.r_addend = relocation + rel->r_addend;
3738 }
70256ad8
AJ
3739 }
3740
cbe950e9 3741 sreloc = elf_section_data (input_section)->sreloc;
d8045f23 3742
62d78908
L
3743 if (sreloc == NULL || sreloc->contents == NULL)
3744 {
3745 r = bfd_reloc_notsupported;
3746 goto check_relocation_error;
3747 }
c434dee6 3748
351f65ca 3749 elf_append_rela (output_bfd, sreloc, &outrel);
70256ad8
AJ
3750
3751 /* If this reloc is against an external symbol, we do
3752 not want to fiddle with the addend. Otherwise, we
3753 need to include the symbol value so that it becomes
3754 an addend for the dynamic reloc. */
0f88be7a 3755 if (! relocate)
70256ad8
AJ
3756 continue;
3757 }
3758
3759 break;
3760
bffbf940 3761 case R_X86_64_TLSGD:
67a4f2b7
AO
3762 case R_X86_64_GOTPC32_TLSDESC:
3763 case R_X86_64_TLSDESC_CALL:
bffbf940 3764 case R_X86_64_GOTTPOFF:
bffbf940
JJ
3765 tls_type = GOT_UNKNOWN;
3766 if (h == NULL && local_got_offsets)
351f65ca 3767 tls_type = elf_x86_64_local_got_tls_type (input_bfd) [r_symndx];
bffbf940 3768 else if (h != NULL)
351f65ca 3769 tls_type = elf_x86_64_hash_entry (h)->tls_type;
142411ca 3770
351f65ca
L
3771 if (! elf_x86_64_tls_transition (info, input_bfd,
3772 input_section, contents,
3773 symtab_hdr, sym_hashes,
3774 &r_type, tls_type, rel,
3775 relend, h, r_symndx))
534a31f6 3776 return FALSE;
bffbf940
JJ
3777
3778 if (r_type == R_X86_64_TPOFF32)
3779 {
142411ca
L
3780 bfd_vma roff = rel->r_offset;
3781
bffbf940 3782 BFD_ASSERT (! unresolved_reloc);
142411ca 3783
351f65ca 3784 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
bffbf940 3785 {
52bc799a 3786 /* GD->LE transition. For 64bit, change
abcf1d52 3787 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
a3fadc9a 3788 .word 0x6666; rex64; call __tls_get_addr
52bc799a 3789 into:
bffbf940 3790 movq %fs:0, %rax
52bc799a
L
3791 leaq foo@tpoff(%rax), %rax
3792 For 32bit, change
3793 leaq foo@tlsgd(%rip), %rdi
3794 .word 0x6666; rex64; call __tls_get_addr
3795 into:
3796 movl %fs:0, %eax
bffbf940 3797 leaq foo@tpoff(%rax), %rax */
52bc799a
L
3798 if (ABI_64_P (output_bfd))
3799 memcpy (contents + roff - 4,
3800 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
3801 16);
3802 else
3803 memcpy (contents + roff - 3,
3804 "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
3805 15);
eb4ff4d6 3806 bfd_put_32 (output_bfd,
351f65ca 3807 elf_x86_64_tpoff (info, relocation),
142411ca 3808 contents + roff + 8);
a3fadc9a 3809 /* Skip R_X86_64_PC32/R_X86_64_PLT32. */
bffbf940
JJ
3810 rel++;
3811 continue;
3812 }
351f65ca 3813 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
67a4f2b7
AO
3814 {
3815 /* GDesc -> LE transition.
3816 It's originally something like:
3817 leaq x@tlsdesc(%rip), %rax
3818
3819 Change it to:
c9736ba0 3820 movl $x@tpoff, %rax. */
67a4f2b7 3821
c9736ba0 3822 unsigned int val, type;
67a4f2b7 3823
67a4f2b7 3824 type = bfd_get_8 (input_bfd, contents + roff - 3);
67a4f2b7 3825 val = bfd_get_8 (input_bfd, contents + roff - 1);
67a4f2b7
AO
3826 bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1),
3827 contents + roff - 3);
3828 bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
3829 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
3830 contents + roff - 1);
eb4ff4d6 3831 bfd_put_32 (output_bfd,
351f65ca 3832 elf_x86_64_tpoff (info, relocation),
67a4f2b7
AO
3833 contents + roff);
3834 continue;
3835 }
351f65ca 3836 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
67a4f2b7
AO
3837 {
3838 /* GDesc -> LE transition.
3839 It's originally:
3840 call *(%rax)
3841 Turn it into:
142411ca 3842 xchg %ax,%ax. */
10efb593 3843 bfd_put_8 (output_bfd, 0x66, contents + roff);
67a4f2b7
AO
3844 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3845 continue;
3846 }
351f65ca 3847 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTTPOFF)
bffbf940 3848 {
bffbf940
JJ
3849 /* IE->LE transition:
3850 Originally it can be one of:
3851 movq foo@gottpoff(%rip), %reg
3852 addq foo@gottpoff(%rip), %reg
3853 We change it into:
3854 movq $foo, %reg
3855 leaq foo(%reg), %reg
3856 addq $foo, %reg. */
142411ca
L
3857
3858 unsigned int val, type, reg;
3859
3860 val = bfd_get_8 (input_bfd, contents + roff - 3);
3861 type = bfd_get_8 (input_bfd, contents + roff - 2);
3862 reg = bfd_get_8 (input_bfd, contents + roff - 1);
bffbf940 3863 reg >>= 3;
bffbf940
JJ
3864 if (type == 0x8b)
3865 {
3866 /* movq */
3867 if (val == 0x4c)
3868 bfd_put_8 (output_bfd, 0x49,
142411ca 3869 contents + roff - 3);
4a4c5f25
L
3870 else if (!ABI_64_P (output_bfd) && val == 0x44)
3871 bfd_put_8 (output_bfd, 0x41,
3872 contents + roff - 3);
bffbf940 3873 bfd_put_8 (output_bfd, 0xc7,
142411ca 3874 contents + roff - 2);
bffbf940 3875 bfd_put_8 (output_bfd, 0xc0 | reg,
142411ca 3876 contents + roff - 1);
bffbf940
JJ
3877 }
3878 else if (reg == 4)
3879 {
3880 /* addq -> addq - addressing with %rsp/%r12 is
3881 special */
3882 if (val == 0x4c)
3883 bfd_put_8 (output_bfd, 0x49,
142411ca 3884 contents + roff - 3);
4a4c5f25
L
3885 else if (!ABI_64_P (output_bfd) && val == 0x44)
3886 bfd_put_8 (output_bfd, 0x41,
3887 contents + roff - 3);
bffbf940 3888 bfd_put_8 (output_bfd, 0x81,
142411ca 3889 contents + roff - 2);
bffbf940 3890 bfd_put_8 (output_bfd, 0xc0 | reg,
142411ca 3891 contents + roff - 1);
bffbf940
JJ
3892 }
3893 else
3894 {
3895 /* addq -> leaq */
3896 if (val == 0x4c)
3897 bfd_put_8 (output_bfd, 0x4d,
142411ca 3898 contents + roff - 3);
4a4c5f25
L
3899 else if (!ABI_64_P (output_bfd) && val == 0x44)
3900 bfd_put_8 (output_bfd, 0x45,
3901 contents + roff - 3);
bffbf940 3902 bfd_put_8 (output_bfd, 0x8d,
142411ca 3903 contents + roff - 2);
bffbf940 3904 bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
142411ca 3905 contents + roff - 1);
bffbf940 3906 }
eb4ff4d6 3907 bfd_put_32 (output_bfd,
351f65ca 3908 elf_x86_64_tpoff (info, relocation),
142411ca 3909 contents + roff);
bffbf940
JJ
3910 continue;
3911 }
142411ca
L
3912 else
3913 BFD_ASSERT (FALSE);
bffbf940
JJ
3914 }
3915
6de2ae4a 3916 if (htab->elf.sgot == NULL)
bffbf940
JJ
3917 abort ();
3918
3919 if (h != NULL)
67a4f2b7
AO
3920 {
3921 off = h->got.offset;
351f65ca 3922 offplt = elf_x86_64_hash_entry (h)->tlsdesc_got;
67a4f2b7 3923 }
bffbf940
JJ
3924 else
3925 {
3926 if (local_got_offsets == NULL)
3927 abort ();
3928
3929 off = local_got_offsets[r_symndx];
67a4f2b7 3930 offplt = local_tlsdesc_gotents[r_symndx];
bffbf940
JJ
3931 }
3932
3933 if ((off & 1) != 0)
3934 off &= ~1;
26e41594 3935 else
bffbf940
JJ
3936 {
3937 Elf_Internal_Rela outrel;
bffbf940 3938 int dr_type, indx;
67a4f2b7 3939 asection *sreloc;
bffbf940 3940
6de2ae4a 3941 if (htab->elf.srelgot == NULL)
bffbf940
JJ
3942 abort ();
3943
67a4f2b7
AO
3944 indx = h && h->dynindx != -1 ? h->dynindx : 0;
3945
3946 if (GOT_TLS_GDESC_P (tls_type))
3947 {
351f65ca 3948 outrel.r_info = htab->r_info (indx, R_X86_64_TLSDESC);
67a4f2b7 3949 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
6de2ae4a
L
3950 + 2 * GOT_ENTRY_SIZE <= htab->elf.sgotplt->size);
3951 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
3952 + htab->elf.sgotplt->output_offset
67a4f2b7
AO
3953 + offplt
3954 + htab->sgotplt_jump_table_size);
6de2ae4a 3955 sreloc = htab->elf.srelplt;
67a4f2b7 3956 if (indx == 0)
351f65ca 3957 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
67a4f2b7
AO
3958 else
3959 outrel.r_addend = 0;
351f65ca 3960 elf_append_rela (output_bfd, sreloc, &outrel);
67a4f2b7
AO
3961 }
3962
6de2ae4a 3963 sreloc = htab->elf.srelgot;
67a4f2b7 3964
6de2ae4a
L
3965 outrel.r_offset = (htab->elf.sgot->output_section->vma
3966 + htab->elf.sgot->output_offset + off);
bffbf940 3967
67a4f2b7 3968 if (GOT_TLS_GD_P (tls_type))
bffbf940 3969 dr_type = R_X86_64_DTPMOD64;
67a4f2b7
AO
3970 else if (GOT_TLS_GDESC_P (tls_type))
3971 goto dr_done;
bffbf940
JJ
3972 else
3973 dr_type = R_X86_64_TPOFF64;
3974
6de2ae4a 3975 bfd_put_64 (output_bfd, 0, htab->elf.sgot->contents + off);
bffbf940 3976 outrel.r_addend = 0;
67a4f2b7
AO
3977 if ((dr_type == R_X86_64_TPOFF64
3978 || dr_type == R_X86_64_TLSDESC) && indx == 0)
351f65ca
L
3979 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info);
3980 outrel.r_info = htab->r_info (indx, dr_type);
bffbf940 3981
351f65ca 3982 elf_append_rela (output_bfd, sreloc, &outrel);
bffbf940 3983
67a4f2b7 3984 if (GOT_TLS_GD_P (tls_type))
bffbf940
JJ
3985 {
3986 if (indx == 0)
3987 {
d40d037c 3988 BFD_ASSERT (! unresolved_reloc);
bffbf940 3989 bfd_put_64 (output_bfd,
351f65ca 3990 relocation - elf_x86_64_dtpoff_base (info),
6de2ae4a 3991 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
bffbf940
JJ
3992 }
3993 else
3994 {
3995 bfd_put_64 (output_bfd, 0,
6de2ae4a 3996 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
351f65ca 3997 outrel.r_info = htab->r_info (indx,
bffbf940
JJ
3998 R_X86_64_DTPOFF64);
3999 outrel.r_offset += GOT_ENTRY_SIZE;
351f65ca 4000 elf_append_rela (output_bfd, sreloc,
464d3bd4 4001 &outrel);
bffbf940
JJ
4002 }
4003 }
4004
67a4f2b7 4005 dr_done:
bffbf940
JJ
4006 if (h != NULL)
4007 h->got.offset |= 1;
4008 else
4009 local_got_offsets[r_symndx] |= 1;
4010 }
4011
67a4f2b7
AO
4012 if (off >= (bfd_vma) -2
4013 && ! GOT_TLS_GDESC_P (tls_type))
bffbf940 4014 abort ();
351f65ca 4015 if (r_type == ELF32_R_TYPE (rel->r_info))
bffbf940 4016 {
67a4f2b7
AO
4017 if (r_type == R_X86_64_GOTPC32_TLSDESC
4018 || r_type == R_X86_64_TLSDESC_CALL)
6de2ae4a
L
4019 relocation = htab->elf.sgotplt->output_section->vma
4020 + htab->elf.sgotplt->output_offset
67a4f2b7
AO
4021 + offplt + htab->sgotplt_jump_table_size;
4022 else
6de2ae4a
L
4023 relocation = htab->elf.sgot->output_section->vma
4024 + htab->elf.sgot->output_offset + off;
b34976b6 4025 unresolved_reloc = FALSE;
bffbf940 4026 }
142411ca 4027 else
67a4f2b7 4028 {
142411ca 4029 bfd_vma roff = rel->r_offset;
67a4f2b7 4030
351f65ca 4031 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD)
142411ca 4032 {
52bc799a 4033 /* GD->IE transition. For 64bit, change
142411ca
L
4034 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4035 .word 0x6666; rex64; call __tls_get_addr@plt
52bc799a 4036 into:
142411ca 4037 movq %fs:0, %rax
52bc799a
L
4038 addq foo@gottpoff(%rip), %rax
4039 For 32bit, change
4040 leaq foo@tlsgd(%rip), %rdi
4041 .word 0x6666; rex64; call __tls_get_addr@plt
4042 into:
4043 movl %fs:0, %eax
142411ca 4044 addq foo@gottpoff(%rip), %rax */
52bc799a
L
4045 if (ABI_64_P (output_bfd))
4046 memcpy (contents + roff - 4,
4047 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
4048 16);
4049 else
4050 memcpy (contents + roff - 3,
4051 "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
4052 15);
142411ca 4053
6de2ae4a
L
4054 relocation = (htab->elf.sgot->output_section->vma
4055 + htab->elf.sgot->output_offset + off
142411ca
L
4056 - roff
4057 - input_section->output_section->vma
4058 - input_section->output_offset
4059 - 12);
4060 bfd_put_32 (output_bfd, relocation,
4061 contents + roff + 8);
4062 /* Skip R_X86_64_PLT32. */
4063 rel++;
4064 continue;
4065 }
351f65ca 4066 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC)
142411ca
L
4067 {
4068 /* GDesc -> IE transition.
4069 It's originally something like:
4070 leaq x@tlsdesc(%rip), %rax
67a4f2b7 4071
142411ca 4072 Change it to:
c9736ba0 4073 movq x@gottpoff(%rip), %rax # before xchg %ax,%ax. */
67a4f2b7 4074
142411ca
L
4075 /* Now modify the instruction as appropriate. To
4076 turn a leaq into a movq in the form we use it, it
4077 suffices to change the second byte from 0x8d to
4078 0x8b. */
4079 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4080
4081 bfd_put_32 (output_bfd,
6de2ae4a
L
4082 htab->elf.sgot->output_section->vma
4083 + htab->elf.sgot->output_offset + off
142411ca
L
4084 - rel->r_offset
4085 - input_section->output_section->vma
4086 - input_section->output_offset
4087 - 4,
4088 contents + roff);
4089 continue;
4090 }
351f65ca 4091 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL)
142411ca
L
4092 {
4093 /* GDesc -> IE transition.
4094 It's originally:
4095 call *(%rax)
4096
4097 Change it to:
c9736ba0 4098 xchg %ax, %ax. */
142411ca 4099
142411ca
L
4100 bfd_put_8 (output_bfd, 0x66, contents + roff);
4101 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4102 continue;
4103 }
4104 else
4105 BFD_ASSERT (FALSE);
67a4f2b7 4106 }
bffbf940
JJ
4107 break;
4108
4109 case R_X86_64_TLSLD:
351f65ca
L
4110 if (! elf_x86_64_tls_transition (info, input_bfd,
4111 input_section, contents,
4112 symtab_hdr, sym_hashes,
4113 &r_type, GOT_UNKNOWN,
4114 rel, relend, h, r_symndx))
142411ca 4115 return FALSE;
a3fadc9a 4116
142411ca
L
4117 if (r_type != R_X86_64_TLSLD)
4118 {
bffbf940 4119 /* LD->LE transition:
a3fadc9a 4120 leaq foo@tlsld(%rip), %rdi; call __tls_get_addr.
52bc799a
L
4121 For 64bit, we change it into:
4122 .word 0x6666; .byte 0x66; movq %fs:0, %rax.
4123 For 32bit, we change it into:
4124 nopl 0x0(%rax); movl %fs:0, %eax. */
142411ca
L
4125
4126 BFD_ASSERT (r_type == R_X86_64_TPOFF32);
52bc799a
L
4127 if (ABI_64_P (output_bfd))
4128 memcpy (contents + rel->r_offset - 3,
4129 "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
4130 else
4131 memcpy (contents + rel->r_offset - 3,
4132 "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
a3fadc9a 4133 /* Skip R_X86_64_PC32/R_X86_64_PLT32. */
bffbf940
JJ
4134 rel++;
4135 continue;
4136 }
4137
6de2ae4a 4138 if (htab->elf.sgot == NULL)
bffbf940
JJ
4139 abort ();
4140
4141 off = htab->tls_ld_got.offset;
4142 if (off & 1)
4143 off &= ~1;
4144 else
4145 {
4146 Elf_Internal_Rela outrel;
bffbf940 4147
6de2ae4a 4148 if (htab->elf.srelgot == NULL)
bffbf940
JJ
4149 abort ();
4150
6de2ae4a
L
4151 outrel.r_offset = (htab->elf.sgot->output_section->vma
4152 + htab->elf.sgot->output_offset + off);
bffbf940
JJ
4153
4154 bfd_put_64 (output_bfd, 0,
6de2ae4a 4155 htab->elf.sgot->contents + off);
bffbf940 4156 bfd_put_64 (output_bfd, 0,
6de2ae4a 4157 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
351f65ca 4158 outrel.r_info = htab->r_info (0, R_X86_64_DTPMOD64);
bffbf940 4159 outrel.r_addend = 0;
351f65ca 4160 elf_append_rela (output_bfd, htab->elf.srelgot,
464d3bd4 4161 &outrel);
bffbf940
JJ
4162 htab->tls_ld_got.offset |= 1;
4163 }
6de2ae4a
L
4164 relocation = htab->elf.sgot->output_section->vma
4165 + htab->elf.sgot->output_offset + off;
b34976b6 4166 unresolved_reloc = FALSE;
bffbf940
JJ
4167 break;
4168
4169 case R_X86_64_DTPOFF32:
1d85728f 4170 if (!info->executable|| (input_section->flags & SEC_CODE) == 0)
351f65ca 4171 relocation -= elf_x86_64_dtpoff_base (info);
bffbf940 4172 else
351f65ca 4173 relocation = elf_x86_64_tpoff (info, relocation);
bffbf940
JJ
4174 break;
4175
4176 case R_X86_64_TPOFF32:
6769d501 4177 case R_X86_64_TPOFF64:
9b769489 4178 BFD_ASSERT (info->executable);
351f65ca 4179 relocation = elf_x86_64_tpoff (info, relocation);
bffbf940
JJ
4180 break;
4181
70256ad8
AJ
4182 default:
4183 break;
4184 }
8d88c4ca 4185
239e1f3a
AM
4186 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4187 because such sections are not SEC_ALLOC and thus ld.so will
4188 not process them. */
c434dee6 4189 if (unresolved_reloc
239e1f3a 4190 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
4191 && h->def_dynamic)
4192 && _bfd_elf_section_offset (output_bfd, info, input_section,
4193 rel->r_offset) != (bfd_vma) -1)
c434dee6 4194 (*_bfd_error_handler)
843fe662 4195 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
d003868e
AM
4196 input_bfd,
4197 input_section,
c434dee6 4198 (long) rel->r_offset,
843fe662 4199 howto->name,
c434dee6
AJ
4200 h->root.root.string);
4201
cbe950e9 4202do_relocation:
8d88c4ca 4203 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
c434dee6
AJ
4204 contents, rel->r_offset,
4205 relocation, rel->r_addend);
8d88c4ca 4206
62d78908 4207check_relocation_error:
8d88c4ca 4208 if (r != bfd_reloc_ok)
8da6118f 4209 {
c434dee6
AJ
4210 const char *name;
4211
4212 if (h != NULL)
4213 name = h->root.root.string;
4214 else
8da6118f 4215 {
c434dee6
AJ
4216 name = bfd_elf_string_from_elf_section (input_bfd,
4217 symtab_hdr->sh_link,
4218 sym->st_name);
4219 if (name == NULL)
b34976b6 4220 return FALSE;
c434dee6
AJ
4221 if (*name == '\0')
4222 name = bfd_section_name (input_bfd, sec);
4223 }
4224
4225 if (r == bfd_reloc_overflow)
4226 {
c434dee6 4227 if (! ((*info->callbacks->reloc_overflow)
dfeffb9f
L
4228 (info, (h ? &h->root : NULL), name, howto->name,
4229 (bfd_vma) 0, input_bfd, input_section,
4230 rel->r_offset)))
b34976b6 4231 return FALSE;
c434dee6
AJ
4232 }
4233 else
4234 {
4235 (*_bfd_error_handler)
bb95161d 4236 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
d003868e 4237 input_bfd, input_section,
c434dee6 4238 (long) rel->r_offset, name, (int) r);
b34976b6 4239 return FALSE;
8da6118f
KH
4240 }
4241 }
8d88c4ca 4242 }
70256ad8 4243
b34976b6 4244 return TRUE;
70256ad8
AJ
4245}
4246
4247/* Finish up dynamic symbol handling. We set the contents of various
4248 dynamic sections here. */
4249
b34976b6 4250static bfd_boolean
351f65ca
L
4251elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
4252 struct bfd_link_info *info,
4253 struct elf_link_hash_entry *h,
4254 Elf_Internal_Sym *sym)
70256ad8 4255{
351f65ca 4256 struct elf_x86_64_link_hash_table *htab;
eed180f8
RM
4257 const struct elf_x86_64_backend_data *const abed
4258 = get_elf_x86_64_backend_data (output_bfd);
70256ad8 4259
351f65ca 4260 htab = elf_x86_64_hash_table (info);
4dfe6ac6
NC
4261 if (htab == NULL)
4262 return FALSE;
70256ad8
AJ
4263
4264 if (h->plt.offset != (bfd_vma) -1)
4265 {
70256ad8
AJ
4266 bfd_vma plt_index;
4267 bfd_vma got_offset;
4268 Elf_Internal_Rela rela;
947216bf 4269 bfd_byte *loc;
cbe950e9 4270 asection *plt, *gotplt, *relplt;
351f65ca 4271 const struct elf_backend_data *bed;
cbe950e9
L
4272
4273 /* When building a static executable, use .iplt, .igot.plt and
4274 .rela.iplt sections for STT_GNU_IFUNC symbols. */
6de2ae4a 4275 if (htab->elf.splt != NULL)
cbe950e9 4276 {
6de2ae4a
L
4277 plt = htab->elf.splt;
4278 gotplt = htab->elf.sgotplt;
4279 relplt = htab->elf.srelplt;
cbe950e9
L
4280 }
4281 else
4282 {
6de2ae4a
L
4283 plt = htab->elf.iplt;
4284 gotplt = htab->elf.igotplt;
4285 relplt = htab->elf.irelplt;
cbe950e9 4286 }
70256ad8
AJ
4287
4288 /* This symbol has an entry in the procedure linkage table. Set
407443a3 4289 it up. */
cbe950e9
L
4290 if ((h->dynindx == -1
4291 && !((h->forced_local || info->executable)
4292 && h->def_regular
4293 && h->type == STT_GNU_IFUNC))
4294 || plt == NULL
4295 || gotplt == NULL
4296 || relplt == NULL)
f6df62c8 4297 return FALSE;
70256ad8
AJ
4298
4299 /* Get the index in the procedure linkage table which
4300 corresponds to this symbol. This is the index of this symbol
4301 in all the symbols for which we are making plt entries. The
cbe950e9 4302 first entry in the procedure linkage table is reserved.
6bbec505 4303
cbe950e9 4304 Get the offset into the .got table of the entry that
407443a3 4305 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
cbe950e9
L
4306 bytes. The first three are reserved for the dynamic linker.
4307
4308 For static executables, we don't reserve anything. */
4309
6de2ae4a 4310 if (plt == htab->elf.splt)
cbe950e9 4311 {
eed180f8 4312 got_offset = h->plt.offset / abed->plt_entry_size - 1;
e1f98742 4313 got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
cbe950e9
L
4314 }
4315 else
4316 {
eed180f8 4317 got_offset = h->plt.offset / abed->plt_entry_size;
e1f98742 4318 got_offset = got_offset * GOT_ENTRY_SIZE;
cbe950e9 4319 }
70256ad8
AJ
4320
4321 /* Fill in the entry in the procedure linkage table. */
eed180f8
RM
4322 memcpy (plt->contents + h->plt.offset, abed->plt_entry,
4323 abed->plt_entry_size);
4324
4325 /* Insert the relocation positions of the plt section. */
4326
4327 /* Put offset the PC-relative instruction referring to the GOT entry,
4328 subtracting the size of that instruction. */
653165cc 4329 bfd_put_32 (output_bfd,
eed180f8
RM
4330 (gotplt->output_section->vma
4331 + gotplt->output_offset
4332 + got_offset
4333 - plt->output_section->vma
4334 - plt->output_offset
4335 - h->plt.offset
4336 - abed->plt_got_insn_size),
4337 plt->contents + h->plt.offset + abed->plt_got_offset);
cbe950e9 4338
653165cc 4339 /* Fill in the entry in the global offset table, initially this
eed180f8 4340 points to the second part of the PLT entry. */
cbe950e9
L
4341 bfd_put_64 (output_bfd, (plt->output_section->vma
4342 + plt->output_offset
eed180f8 4343 + h->plt.offset + abed->plt_lazy_offset),
cbe950e9 4344 gotplt->contents + got_offset);
70256ad8
AJ
4345
4346 /* Fill in the entry in the .rela.plt section. */
cbe950e9
L
4347 rela.r_offset = (gotplt->output_section->vma
4348 + gotplt->output_offset
70256ad8 4349 + got_offset);
cbe950e9
L
4350 if (h->dynindx == -1
4351 || ((info->executable
4352 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4353 && h->def_regular
4354 && h->type == STT_GNU_IFUNC))
4355 {
4356 /* If an STT_GNU_IFUNC symbol is locally defined, generate
4357 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT. */
351f65ca 4358 rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
cbe950e9
L
4359 rela.r_addend = (h->root.u.def.value
4360 + h->root.u.def.section->output_section->vma
4361 + h->root.u.def.section->output_offset);
e1f98742
L
4362 /* R_X86_64_IRELATIVE comes last. */
4363 plt_index = htab->next_irelative_index--;
cbe950e9
L
4364 }
4365 else
4366 {
351f65ca 4367 rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
cbe950e9 4368 rela.r_addend = 0;
e1f98742
L
4369 plt_index = htab->next_jump_slot_index++;
4370 }
4371
4372 /* Don't fill PLT entry for static executables. */
4373 if (plt == htab->elf.splt)
4374 {
4375 /* Put relocation index. */
4376 bfd_put_32 (output_bfd, plt_index,
eed180f8 4377 plt->contents + h->plt.offset + abed->plt_reloc_offset);
e1f98742 4378 /* Put offset for jmp .PLT0. */
eed180f8
RM
4379 bfd_put_32 (output_bfd, - (h->plt.offset + abed->plt_plt_insn_end),
4380 plt->contents + h->plt.offset + abed->plt_plt_offset);
cbe950e9 4381 }
351f65ca
L
4382
4383 bed = get_elf_backend_data (output_bfd);
4384 loc = relplt->contents + plt_index * bed->s->sizeof_rela;
82e96e07 4385 bed->s->swap_reloca_out (output_bfd, &rela, loc);
70256ad8 4386
f5385ebf 4387 if (!h->def_regular)
70256ad8
AJ
4388 {
4389 /* Mark the symbol as undefined, rather than as defined in
47a9f7b3
JJ
4390 the .plt section. Leave the value if there were any
4391 relocations where pointer equality matters (this is a clue
c434dee6
AJ
4392 for the dynamic linker, to make function pointer
4393 comparisons work between an application and shared
47a9f7b3
JJ
4394 library), otherwise set it to zero. If a function is only
4395 called from a binary, there is no need to slow down
4396 shared libraries because of that. */
70256ad8 4397 sym->st_shndx = SHN_UNDEF;
f5385ebf 4398 if (!h->pointer_equality_needed)
47a9f7b3 4399 sym->st_value = 0;
70256ad8
AJ
4400 }
4401 }
4402
bffbf940 4403 if (h->got.offset != (bfd_vma) -1
351f65ca
L
4404 && ! GOT_TLS_GD_ANY_P (elf_x86_64_hash_entry (h)->tls_type)
4405 && elf_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE)
053579d7 4406 {
053579d7
AJ
4407 Elf_Internal_Rela rela;
4408
4409 /* This symbol has an entry in the global offset table. Set it
bffbf940 4410 up. */
6de2ae4a 4411 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
c434dee6 4412 abort ();
053579d7 4413
6de2ae4a
L
4414 rela.r_offset = (htab->elf.sgot->output_section->vma
4415 + htab->elf.sgot->output_offset
dc810e39 4416 + (h->got.offset &~ (bfd_vma) 1));
053579d7
AJ
4417
4418 /* If this is a static link, or it is a -Bsymbolic link and the
4419 symbol is defined locally or was forced to be local because
4420 of a version file, we just want to emit a RELATIVE reloc.
4421 The entry in the global offset table will already have been
4422 initialized in the relocate_section function. */
710ab287 4423 if (h->def_regular
0018b0a3
L
4424 && h->type == STT_GNU_IFUNC)
4425 {
710ab287
L
4426 if (info->shared)
4427 {
4428 /* Generate R_X86_64_GLOB_DAT. */
4429 goto do_glob_dat;
4430 }
4431 else
4432 {
90d60710
L
4433 asection *plt;
4434
710ab287
L
4435 if (!h->pointer_equality_needed)
4436 abort ();
4437
4438 /* For non-shared object, we can't use .got.plt, which
4439 contains the real function addres if we need pointer
4440 equality. We load the GOT entry with the PLT entry. */
90d60710 4441 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
710ab287
L
4442 bfd_put_64 (output_bfd, (plt->output_section->vma
4443 + plt->output_offset
4444 + h->plt.offset),
6de2ae4a 4445 htab->elf.sgot->contents + h->got.offset);
710ab287
L
4446 return TRUE;
4447 }
0018b0a3
L
4448 }
4449 else if (info->shared
4450 && SYMBOL_REFERENCES_LOCAL (info, h))
053579d7 4451 {
41bed6dd
L
4452 if (!h->def_regular)
4453 return FALSE;
cc78d0af 4454 BFD_ASSERT((h->got.offset & 1) != 0);
351f65ca 4455 rela.r_info = htab->r_info (0, R_X86_64_RELATIVE);
053579d7
AJ
4456 rela.r_addend = (h->root.u.def.value
4457 + h->root.u.def.section->output_section->vma
4458 + h->root.u.def.section->output_offset);
4459 }
4460 else
4461 {
4462 BFD_ASSERT((h->got.offset & 1) == 0);
710ab287 4463do_glob_dat:
c434dee6 4464 bfd_put_64 (output_bfd, (bfd_vma) 0,
6de2ae4a 4465 htab->elf.sgot->contents + h->got.offset);
351f65ca 4466 rela.r_info = htab->r_info (h->dynindx, R_X86_64_GLOB_DAT);
053579d7
AJ
4467 rela.r_addend = 0;
4468 }
4469
351f65ca 4470 elf_append_rela (output_bfd, htab->elf.srelgot, &rela);
053579d7
AJ
4471 }
4472
f5385ebf 4473 if (h->needs_copy)
70256ad8 4474 {
70256ad8
AJ
4475 Elf_Internal_Rela rela;
4476
4477 /* This symbol needs a copy reloc. Set it up. */
4478
c434dee6
AJ
4479 if (h->dynindx == -1
4480 || (h->root.type != bfd_link_hash_defined
4481 && h->root.type != bfd_link_hash_defweak)
4482 || htab->srelbss == NULL)
4483 abort ();
70256ad8
AJ
4484
4485 rela.r_offset = (h->root.u.def.value
4486 + h->root.u.def.section->output_section->vma
4487 + h->root.u.def.section->output_offset);
351f65ca 4488 rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY);
70256ad8 4489 rela.r_addend = 0;
351f65ca 4490 elf_append_rela (output_bfd, htab->srelbss, &rela);
70256ad8
AJ
4491 }
4492
c25bc9fc
L
4493 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. SYM may
4494 be NULL for local symbols. */
4495 if (sym != NULL
4496 && (strcmp (h->root.root.string, "_DYNAMIC") == 0
4497 || h == htab->elf.hgot))
70256ad8
AJ
4498 sym->st_shndx = SHN_ABS;
4499
b34976b6 4500 return TRUE;
70256ad8
AJ
4501}
4502
c25bc9fc
L
4503/* Finish up local dynamic symbol handling. We set the contents of
4504 various dynamic sections here. */
4505
4506static bfd_boolean
351f65ca 4507elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
c25bc9fc
L
4508{
4509 struct elf_link_hash_entry *h
4510 = (struct elf_link_hash_entry *) *slot;
4511 struct bfd_link_info *info
eed180f8 4512 = (struct bfd_link_info *) inf;
c25bc9fc 4513
351f65ca 4514 return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
c25bc9fc
L
4515 info, h, NULL);
4516}
4517
c434dee6
AJ
4518/* Used to decide how to sort relocs in an optimal manner for the
4519 dynamic linker, before writing them out. */
4520
4521static enum elf_reloc_type_class
351f65ca 4522elf_x86_64_reloc_type_class (const Elf_Internal_Rela *rela)
c434dee6 4523{
351f65ca 4524 switch ((int) ELF32_R_TYPE (rela->r_info))
c434dee6
AJ
4525 {
4526 case R_X86_64_RELATIVE:
4527 return reloc_class_relative;
4528 case R_X86_64_JUMP_SLOT:
4529 return reloc_class_plt;
4530 case R_X86_64_COPY:
4531 return reloc_class_copy;
4532 default:
4533 return reloc_class_normal;
4534 }
4535}
4536
70256ad8
AJ
4537/* Finish up the dynamic sections. */
4538
b34976b6 4539static bfd_boolean
351f65ca
L
4540elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
4541 struct bfd_link_info *info)
70256ad8 4542{
351f65ca 4543 struct elf_x86_64_link_hash_table *htab;
70256ad8
AJ
4544 bfd *dynobj;
4545 asection *sdyn;
eed180f8
RM
4546 const struct elf_x86_64_backend_data *const abed
4547 = get_elf_x86_64_backend_data (output_bfd);
70256ad8 4548
351f65ca 4549 htab = elf_x86_64_hash_table (info);
4dfe6ac6
NC
4550 if (htab == NULL)
4551 return FALSE;
4552
c434dee6 4553 dynobj = htab->elf.dynobj;
70256ad8
AJ
4554 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4555
c434dee6 4556 if (htab->elf.dynamic_sections_created)
70256ad8 4557 {
82e96e07
L
4558 bfd_byte *dyncon, *dynconend;
4559 const struct elf_backend_data *bed;
4560 bfd_size_type sizeof_dyn;
70256ad8 4561
6de2ae4a 4562 if (sdyn == NULL || htab->elf.sgot == NULL)
c434dee6 4563 abort ();
70256ad8 4564
82e96e07
L
4565 bed = get_elf_backend_data (dynobj);
4566 sizeof_dyn = bed->s->sizeof_dyn;
4567 dyncon = sdyn->contents;
4568 dynconend = sdyn->contents + sdyn->size;
4569 for (; dyncon < dynconend; dyncon += sizeof_dyn)
70256ad8
AJ
4570 {
4571 Elf_Internal_Dyn dyn;
70256ad8
AJ
4572 asection *s;
4573
82e96e07 4574 (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
70256ad8
AJ
4575
4576 switch (dyn.d_tag)
4577 {
4578 default:
053579d7 4579 continue;
70256ad8
AJ
4580
4581 case DT_PLTGOT:
6de2ae4a 4582 s = htab->elf.sgotplt;
8c37241b 4583 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
c434dee6 4584 break;
70256ad8
AJ
4585
4586 case DT_JMPREL:
6de2ae4a 4587 dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
c434dee6 4588 break;
70256ad8 4589
c434dee6 4590 case DT_PLTRELSZ:
6de2ae4a 4591 s = htab->elf.srelplt->output_section;
eea6121a 4592 dyn.d_un.d_val = s->size;
70256ad8
AJ
4593 break;
4594
4595 case DT_RELASZ:
c434dee6
AJ
4596 /* The procedure linkage table relocs (DT_JMPREL) should
4597 not be included in the overall relocs (DT_RELA).
4598 Therefore, we override the DT_RELASZ entry here to
4599 make it not include the JMPREL relocs. Since the
4600 linker script arranges for .rela.plt to follow all
4601 other relocation sections, we don't have to worry
4602 about changing the DT_RELA entry. */
6de2ae4a 4603 if (htab->elf.srelplt != NULL)
70256ad8 4604 {
6de2ae4a 4605 s = htab->elf.srelplt->output_section;
eea6121a 4606 dyn.d_un.d_val -= s->size;
70256ad8
AJ
4607 }
4608 break;
67a4f2b7
AO
4609
4610 case DT_TLSDESC_PLT:
6de2ae4a 4611 s = htab->elf.splt;
67a4f2b7
AO
4612 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
4613 + htab->tlsdesc_plt;
4614 break;
4615
4616 case DT_TLSDESC_GOT:
6de2ae4a 4617 s = htab->elf.sgot;
67a4f2b7
AO
4618 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
4619 + htab->tlsdesc_got;
4620 break;
70256ad8 4621 }
c434dee6 4622
82e96e07 4623 (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
70256ad8
AJ
4624 }
4625
c434dee6 4626 /* Fill in the special first entry in the procedure linkage table. */
6de2ae4a 4627 if (htab->elf.splt && htab->elf.splt->size > 0)
70256ad8 4628 {
653165cc 4629 /* Fill in the first entry in the procedure linkage table. */
eed180f8
RM
4630 memcpy (htab->elf.splt->contents,
4631 abed->plt0_entry, abed->plt_entry_size);
653165cc
AJ
4632 /* Add offset for pushq GOT+8(%rip), since the instruction
4633 uses 6 bytes subtract this value. */
4634 bfd_put_32 (output_bfd,
6de2ae4a
L
4635 (htab->elf.sgotplt->output_section->vma
4636 + htab->elf.sgotplt->output_offset
653165cc 4637 + 8
6de2ae4a
L
4638 - htab->elf.splt->output_section->vma
4639 - htab->elf.splt->output_offset
653165cc 4640 - 6),
eed180f8
RM
4641 htab->elf.splt->contents + abed->plt0_got1_offset);
4642 /* Add offset for the PC-relative instruction accessing GOT+16,
4643 subtracting the offset to the end of that instruction. */
653165cc 4644 bfd_put_32 (output_bfd,
6de2ae4a
L
4645 (htab->elf.sgotplt->output_section->vma
4646 + htab->elf.sgotplt->output_offset
653165cc 4647 + 16
6de2ae4a
L
4648 - htab->elf.splt->output_section->vma
4649 - htab->elf.splt->output_offset
eed180f8
RM
4650 - abed->plt0_got2_insn_end),
4651 htab->elf.splt->contents + abed->plt0_got2_offset);
653165cc 4652
eed180f8
RM
4653 elf_section_data (htab->elf.splt->output_section)
4654 ->this_hdr.sh_entsize = abed->plt_entry_size;
67a4f2b7
AO
4655
4656 if (htab->tlsdesc_plt)
4657 {
4658 bfd_put_64 (output_bfd, (bfd_vma) 0,
6de2ae4a 4659 htab->elf.sgot->contents + htab->tlsdesc_got);
67a4f2b7 4660
6de2ae4a 4661 memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
eed180f8 4662 abed->plt0_entry, abed->plt_entry_size);
67a4f2b7
AO
4663
4664 /* Add offset for pushq GOT+8(%rip), since the
4665 instruction uses 6 bytes subtract this value. */
4666 bfd_put_32 (output_bfd,
6de2ae4a
L
4667 (htab->elf.sgotplt->output_section->vma
4668 + htab->elf.sgotplt->output_offset
67a4f2b7 4669 + 8
6de2ae4a
L
4670 - htab->elf.splt->output_section->vma
4671 - htab->elf.splt->output_offset
67a4f2b7
AO
4672 - htab->tlsdesc_plt
4673 - 6),
eed180f8
RM
4674 htab->elf.splt->contents
4675 + htab->tlsdesc_plt + abed->plt0_got1_offset);
4676 /* Add offset for the PC-relative instruction accessing GOT+TDG,
4677 where TGD stands for htab->tlsdesc_got, subtracting the offset
4678 to the end of that instruction. */
67a4f2b7 4679 bfd_put_32 (output_bfd,
6de2ae4a
L
4680 (htab->elf.sgot->output_section->vma
4681 + htab->elf.sgot->output_offset
67a4f2b7 4682 + htab->tlsdesc_got
6de2ae4a
L
4683 - htab->elf.splt->output_section->vma
4684 - htab->elf.splt->output_offset
67a4f2b7 4685 - htab->tlsdesc_plt
eed180f8
RM
4686 - abed->plt0_got2_insn_end),
4687 htab->elf.splt->contents
4688 + htab->tlsdesc_plt + abed->plt0_got2_offset);
67a4f2b7 4689 }
70256ad8 4690 }
70256ad8
AJ
4691 }
4692
6de2ae4a 4693 if (htab->elf.sgotplt)
70256ad8 4694 {
56d4289c
L
4695 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
4696 {
4697 (*_bfd_error_handler)
4698 (_("discarded output section: `%A'"), htab->elf.sgotplt);
4699 return FALSE;
4700 }
4701
c434dee6 4702 /* Fill in the first three entries in the global offset table. */
6de2ae4a 4703 if (htab->elf.sgotplt->size > 0)
c434dee6
AJ
4704 {
4705 /* Set the first entry in the global offset table to the address of
4706 the dynamic section. */
4707 if (sdyn == NULL)
6de2ae4a 4708 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents);
c434dee6
AJ
4709 else
4710 bfd_put_64 (output_bfd,
4711 sdyn->output_section->vma + sdyn->output_offset,
6de2ae4a 4712 htab->elf.sgotplt->contents);
c434dee6 4713 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
6de2ae4a
L
4714 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
4715 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE*2);
c434dee6 4716 }
70256ad8 4717
6de2ae4a 4718 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize =
c434dee6
AJ
4719 GOT_ENTRY_SIZE;
4720 }
70256ad8 4721
e41b3a13
JJ
4722 /* Adjust .eh_frame for .plt section. */
4723 if (htab->plt_eh_frame != NULL)
4724 {
4725 if (htab->elf.splt != NULL
4726 && htab->elf.splt->size != 0
4727 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
4728 && htab->elf.splt->output_section != NULL
4729 && htab->plt_eh_frame->output_section != NULL)
4730 {
4731 bfd_vma plt_start = htab->elf.splt->output_section->vma;
4732 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
4733 + htab->plt_eh_frame->output_offset
4734 + PLT_FDE_START_OFFSET;
4735 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
4736 htab->plt_eh_frame->contents
4737 + PLT_FDE_START_OFFSET);
4738 }
dbaa2011 4739 if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
e41b3a13
JJ
4740 {
4741 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
4742 htab->plt_eh_frame,
4743 htab->plt_eh_frame->contents))
4744 return FALSE;
4745 }
4746 }
4747
6de2ae4a
L
4748 if (htab->elf.sgot && htab->elf.sgot->size > 0)
4749 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
8c37241b
JJ
4750 = GOT_ENTRY_SIZE;
4751
c25bc9fc
L
4752 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
4753 htab_traverse (htab->loc_hash_table,
351f65ca 4754 elf_x86_64_finish_local_dynamic_symbol,
c25bc9fc
L
4755 info);
4756
b34976b6 4757 return TRUE;
8d88c4ca
NC
4758}
4759
4c45e5c9
JJ
4760/* Return address for Ith PLT stub in section PLT, for relocation REL
4761 or (bfd_vma) -1 if it should not be included. */
4762
4763static bfd_vma
351f65ca
L
4764elf_x86_64_plt_sym_val (bfd_vma i, const asection *plt,
4765 const arelent *rel ATTRIBUTE_UNUSED)
4c45e5c9 4766{
eed180f8 4767 return plt->vma + (i + 1) * GET_PLT_ENTRY_SIZE (plt->owner);
4c45e5c9 4768}
8df9fc9d 4769
d2b2c203
DJ
4770/* Handle an x86-64 specific section when reading an object file. This
4771 is called when elfcode.h finds a section with an unknown type. */
4772
4773static bfd_boolean
351f65ca 4774elf_x86_64_section_from_shdr (bfd *abfd,
6dc132d9
L
4775 Elf_Internal_Shdr *hdr,
4776 const char *name,
4777 int shindex)
d2b2c203
DJ
4778{
4779 if (hdr->sh_type != SHT_X86_64_UNWIND)
4780 return FALSE;
4781
6dc132d9 4782 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
d2b2c203
DJ
4783 return FALSE;
4784
4785 return TRUE;
4786}
4787
3b22753a
L
4788/* Hook called by the linker routine which adds symbols from an object
4789 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
4790 of .bss. */
4791
4792static bfd_boolean
351f65ca
L
4793elf_x86_64_add_symbol_hook (bfd *abfd,
4794 struct bfd_link_info *info,
4795 Elf_Internal_Sym *sym,
4796 const char **namep ATTRIBUTE_UNUSED,
4797 flagword *flagsp ATTRIBUTE_UNUSED,
4798 asection **secp,
4799 bfd_vma *valp)
3b22753a
L
4800{
4801 asection *lcomm;
4802
4803 switch (sym->st_shndx)
4804 {
4805 case SHN_X86_64_LCOMMON:
4806 lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
4807 if (lcomm == NULL)
4808 {
4809 lcomm = bfd_make_section_with_flags (abfd,
4810 "LARGE_COMMON",
4811 (SEC_ALLOC
4812 | SEC_IS_COMMON
4813 | SEC_LINKER_CREATED));
4814 if (lcomm == NULL)
4815 return FALSE;
4816 elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
4817 }
4818 *secp = lcomm;
4819 *valp = sym->st_size;
c35bdf6e 4820 return TRUE;
3b22753a 4821 }
d8045f23 4822
c16153ae 4823 if ((abfd->flags & DYNAMIC) == 0
f64b2e8d
NC
4824 && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
4825 || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
4826 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
d8045f23 4827
3b22753a
L
4828 return TRUE;
4829}
4830
4831
4832/* Given a BFD section, try to locate the corresponding ELF section
4833 index. */
4834
4835static bfd_boolean
351f65ca
L
4836elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
4837 asection *sec, int *index_return)
3b22753a
L
4838{
4839 if (sec == &_bfd_elf_large_com_section)
4840 {
91d6fa6a 4841 *index_return = SHN_X86_64_LCOMMON;
3b22753a
L
4842 return TRUE;
4843 }
4844 return FALSE;
4845}
4846
4847/* Process a symbol. */
4848
4849static void
351f65ca
L
4850elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
4851 asymbol *asym)
3b22753a
L
4852{
4853 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
4854
4855 switch (elfsym->internal_elf_sym.st_shndx)
4856 {
4857 case SHN_X86_64_LCOMMON:
4858 asym->section = &_bfd_elf_large_com_section;
4859 asym->value = elfsym->internal_elf_sym.st_size;
4860 /* Common symbol doesn't set BSF_GLOBAL. */
4861 asym->flags &= ~BSF_GLOBAL;
4862 break;
4863 }
4864}
4865
4866static bfd_boolean
351f65ca 4867elf_x86_64_common_definition (Elf_Internal_Sym *sym)
3b22753a
L
4868{
4869 return (sym->st_shndx == SHN_COMMON
4870 || sym->st_shndx == SHN_X86_64_LCOMMON);
4871}
4872
4873static unsigned int
351f65ca 4874elf_x86_64_common_section_index (asection *sec)
3b22753a
L
4875{
4876 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
4877 return SHN_COMMON;
4878 else
4879 return SHN_X86_64_LCOMMON;
4880}
4881
4882static asection *
351f65ca 4883elf_x86_64_common_section (asection *sec)
3b22753a
L
4884{
4885 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
4886 return bfd_com_section_ptr;
4887 else
4888 return &_bfd_elf_large_com_section;
4889}
4890
4891static bfd_boolean
351f65ca
L
4892elf_x86_64_merge_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
4893 struct elf_link_hash_entry **sym_hash ATTRIBUTE_UNUSED,
4894 struct elf_link_hash_entry *h,
4895 Elf_Internal_Sym *sym,
4896 asection **psec,
4897 bfd_vma *pvalue ATTRIBUTE_UNUSED,
4898 unsigned int *pold_alignment ATTRIBUTE_UNUSED,
4899 bfd_boolean *skip ATTRIBUTE_UNUSED,
4900 bfd_boolean *override ATTRIBUTE_UNUSED,
4901 bfd_boolean *type_change_ok ATTRIBUTE_UNUSED,
4902 bfd_boolean *size_change_ok ATTRIBUTE_UNUSED,
71e7aa7d
L
4903 bfd_boolean *newdyn ATTRIBUTE_UNUSED,
4904 bfd_boolean *newdef,
351f65ca
L
4905 bfd_boolean *newdyncommon ATTRIBUTE_UNUSED,
4906 bfd_boolean *newweak ATTRIBUTE_UNUSED,
4907 bfd *abfd ATTRIBUTE_UNUSED,
4908 asection **sec,
71e7aa7d
L
4909 bfd_boolean *olddyn ATTRIBUTE_UNUSED,
4910 bfd_boolean *olddef,
351f65ca
L
4911 bfd_boolean *olddyncommon ATTRIBUTE_UNUSED,
4912 bfd_boolean *oldweak ATTRIBUTE_UNUSED,
4913 bfd *oldbfd,
4914 asection **oldsec)
3b22753a
L
4915{
4916 /* A normal common symbol and a large common symbol result in a
00492999
L
4917 normal common symbol. We turn the large common symbol into a
4918 normal one. */
71e7aa7d 4919 if (!*olddef
3b22753a 4920 && h->root.type == bfd_link_hash_common
71e7aa7d 4921 && !*newdef
3b22753a 4922 && bfd_is_com_section (*sec)
00492999 4923 && *oldsec != *sec)
3b22753a 4924 {
00492999
L
4925 if (sym->st_shndx == SHN_COMMON
4926 && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) != 0)
4927 {
4928 h->root.u.c.p->section
4929 = bfd_make_section_old_way (oldbfd, "COMMON");
4930 h->root.u.c.p->section->flags = SEC_ALLOC;
4931 }
4932 else if (sym->st_shndx == SHN_X86_64_LCOMMON
4933 && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) == 0)
9a2e389a 4934 *psec = *sec = bfd_com_section_ptr;
3b22753a
L
4935 }
4936
4937 return TRUE;
4938}
4939
4940static int
351f65ca
L
4941elf_x86_64_additional_program_headers (bfd *abfd,
4942 struct bfd_link_info *info ATTRIBUTE_UNUSED)
3b22753a
L
4943{
4944 asection *s;
9a2e389a 4945 int count = 0;
3b22753a
L
4946
4947 /* Check to see if we need a large readonly segment. */
4948 s = bfd_get_section_by_name (abfd, ".lrodata");
4949 if (s && (s->flags & SEC_LOAD))
4950 count++;
4951
4952 /* Check to see if we need a large data segment. Since .lbss sections
4953 is placed right after the .bss section, there should be no need for
4954 a large data segment just because of .lbss. */
4955 s = bfd_get_section_by_name (abfd, ".ldata");
4956 if (s && (s->flags & SEC_LOAD))
4957 count++;
4958
4959 return count;
4960}
4961
fdc90cb4
JJ
4962/* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
4963
4964static bfd_boolean
351f65ca 4965elf_x86_64_hash_symbol (struct elf_link_hash_entry *h)
fdc90cb4
JJ
4966{
4967 if (h->plt.offset != (bfd_vma) -1
4968 && !h->def_regular
4969 && !h->pointer_equality_needed)
4970 return FALSE;
4971
4972 return _bfd_elf_hash_symbol (h);
4973}
4974
c543bf9a
L
4975/* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
4976
4977static bfd_boolean
4978elf_x86_64_relocs_compatible (const bfd_target *input,
4979 const bfd_target *output)
4980{
4981 return ((xvec_get_elf_backend_data (input)->s->elfclass
4982 == xvec_get_elf_backend_data (output)->s->elfclass)
4983 && _bfd_elf_relocs_compatible (input, output));
4984}
4985
9a2e389a 4986static const struct bfd_elf_special_section
351f65ca 4987 elf_x86_64_special_sections[]=
3b22753a 4988{
0112cd26
NC
4989 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
4990 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
4991 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
4992 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
4993 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
4994 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
4995 { NULL, 0, 0, 0, 0 }
3b22753a
L
4996};
4997
70256ad8
AJ
4998#define TARGET_LITTLE_SYM bfd_elf64_x86_64_vec
4999#define TARGET_LITTLE_NAME "elf64-x86-64"
5000#define ELF_ARCH bfd_arch_i386
ae95ffa6 5001#define ELF_TARGET_ID X86_64_ELF_DATA
70256ad8 5002#define ELF_MACHINE_CODE EM_X86_64
f7661549 5003#define ELF_MAXPAGESIZE 0x200000
2043964e 5004#define ELF_MINPAGESIZE 0x1000
24718e3b 5005#define ELF_COMMONPAGESIZE 0x1000
70256ad8
AJ
5006
5007#define elf_backend_can_gc_sections 1
51b64d56 5008#define elf_backend_can_refcount 1
70256ad8
AJ
5009#define elf_backend_want_got_plt 1
5010#define elf_backend_plt_readonly 1
5011#define elf_backend_want_plt_sym 0
5012#define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
b491616a 5013#define elf_backend_rela_normal 1
e41b3a13 5014#define elf_backend_plt_alignment 4
70256ad8 5015
351f65ca 5016#define elf_info_to_howto elf_x86_64_info_to_howto
70256ad8 5017
70256ad8 5018#define bfd_elf64_bfd_link_hash_table_create \
351f65ca 5019 elf_x86_64_link_hash_table_create
c25bc9fc 5020#define bfd_elf64_bfd_link_hash_table_free \
351f65ca
L
5021 elf_x86_64_link_hash_table_free
5022#define bfd_elf64_bfd_reloc_type_lookup elf_x86_64_reloc_type_lookup
157090f7 5023#define bfd_elf64_bfd_reloc_name_lookup \
351f65ca 5024 elf_x86_64_reloc_name_lookup
70256ad8 5025
351f65ca 5026#define elf_backend_adjust_dynamic_symbol elf_x86_64_adjust_dynamic_symbol
c543bf9a 5027#define elf_backend_relocs_compatible elf_x86_64_relocs_compatible
351f65ca
L
5028#define elf_backend_check_relocs elf_x86_64_check_relocs
5029#define elf_backend_copy_indirect_symbol elf_x86_64_copy_indirect_symbol
5030#define elf_backend_create_dynamic_sections elf_x86_64_create_dynamic_sections
5031#define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
5032#define elf_backend_finish_dynamic_symbol elf_x86_64_finish_dynamic_symbol
5033#define elf_backend_gc_mark_hook elf_x86_64_gc_mark_hook
5034#define elf_backend_gc_sweep_hook elf_x86_64_gc_sweep_hook
5035#define elf_backend_grok_prstatus elf_x86_64_grok_prstatus
5036#define elf_backend_grok_psinfo elf_x86_64_grok_psinfo
8fd79e71
L
5037#ifdef CORE_HEADER
5038#define elf_backend_write_core_note elf_x86_64_write_core_note
5039#endif
351f65ca
L
5040#define elf_backend_reloc_type_class elf_x86_64_reloc_type_class
5041#define elf_backend_relocate_section elf_x86_64_relocate_section
5042#define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections
5043#define elf_backend_always_size_sections elf_x86_64_always_size_sections
74541ad4 5044#define elf_backend_init_index_section _bfd_elf_init_1_index_section
351f65ca 5045#define elf_backend_plt_sym_val elf_x86_64_plt_sym_val
407443a3 5046#define elf_backend_object_p elf64_x86_64_elf_object_p
351f65ca 5047#define bfd_elf64_mkobject elf_x86_64_mkobject
8d88c4ca 5048
d2b2c203 5049#define elf_backend_section_from_shdr \
351f65ca 5050 elf_x86_64_section_from_shdr
d2b2c203 5051
3b22753a 5052#define elf_backend_section_from_bfd_section \
351f65ca 5053 elf_x86_64_elf_section_from_bfd_section
3b22753a 5054#define elf_backend_add_symbol_hook \
351f65ca 5055 elf_x86_64_add_symbol_hook
3b22753a 5056#define elf_backend_symbol_processing \
351f65ca 5057 elf_x86_64_symbol_processing
3b22753a 5058#define elf_backend_common_section_index \
351f65ca 5059 elf_x86_64_common_section_index
3b22753a 5060#define elf_backend_common_section \
351f65ca 5061 elf_x86_64_common_section
3b22753a 5062#define elf_backend_common_definition \
351f65ca 5063 elf_x86_64_common_definition
3b22753a 5064#define elf_backend_merge_symbol \
351f65ca 5065 elf_x86_64_merge_symbol
3b22753a 5066#define elf_backend_special_sections \
351f65ca 5067 elf_x86_64_special_sections
3b22753a 5068#define elf_backend_additional_program_headers \
351f65ca 5069 elf_x86_64_additional_program_headers
fdc90cb4 5070#define elf_backend_hash_symbol \
351f65ca 5071 elf_x86_64_hash_symbol
3b22753a 5072
d8045f23
NC
5073#define elf_backend_post_process_headers _bfd_elf_set_osabi
5074
8d88c4ca 5075#include "elf64-target.h"
9d7cbccd
NC
5076
5077/* FreeBSD support. */
5078
5079#undef TARGET_LITTLE_SYM
5080#define TARGET_LITTLE_SYM bfd_elf64_x86_64_freebsd_vec
5081#undef TARGET_LITTLE_NAME
5082#define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
5083
d1036acb
L
5084#undef ELF_OSABI
5085#define ELF_OSABI ELFOSABI_FREEBSD
9d7cbccd 5086
9d7cbccd
NC
5087#undef elf64_bed
5088#define elf64_bed elf64_x86_64_fbsd_bed
5089
5090#include "elf64-target.h"
8a9036a4 5091
a6cc6b3b
RO
5092/* Solaris 2 support. */
5093
5094#undef TARGET_LITTLE_SYM
5095#define TARGET_LITTLE_SYM bfd_elf64_x86_64_sol2_vec
5096#undef TARGET_LITTLE_NAME
5097#define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
5098
5099/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
5100 objects won't be recognized. */
5101#undef ELF_OSABI
5102
5103#undef elf64_bed
5104#define elf64_bed elf64_x86_64_sol2_bed
5105
7dc98aea
RO
5106/* The 64-bit static TLS arena size is rounded to the nearest 16-byte
5107 boundary. */
5108#undef elf_backend_static_tls_alignment
5109#define elf_backend_static_tls_alignment 16
5110
a6cc6b3b
RO
5111/* The Solaris 2 ABI requires a plt symbol on all platforms.
5112
5113 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
5114 File, p.63. */
5115#undef elf_backend_want_plt_sym
5116#define elf_backend_want_plt_sym 1
5117
5118#include "elf64-target.h"
5119
8059fb19
RM
5120/* Native Client support. */
5121
5122#undef TARGET_LITTLE_SYM
5123#define TARGET_LITTLE_SYM bfd_elf64_x86_64_nacl_vec
5124#undef TARGET_LITTLE_NAME
5125#define TARGET_LITTLE_NAME "elf64-x86-64-nacl"
5126#undef elf64_bed
5127#define elf64_bed elf64_x86_64_nacl_bed
5128
5129#undef ELF_MAXPAGESIZE
5130#undef ELF_MINPAGESIZE
5131#undef ELF_COMMONPAGESIZE
5132#define ELF_MAXPAGESIZE 0x10000
5133#define ELF_MINPAGESIZE 0x10000
5134#define ELF_COMMONPAGESIZE 0x10000
5135
5136/* Restore defaults. */
5137#undef ELF_OSABI
5138#undef elf_backend_static_tls_alignment
5139#undef elf_backend_want_plt_sym
5140#define elf_backend_want_plt_sym 0
5141
5142/* NaCl uses substantially different PLT entries for the same effects. */
5143
5144#undef elf_backend_plt_alignment
5145#define elf_backend_plt_alignment 5
5146#define NACL_PLT_ENTRY_SIZE 64
5147#define NACLMASK 0xe0 /* 32-byte alignment mask. */
5148
5149static const bfd_byte elf_x86_64_nacl_plt0_entry[NACL_PLT_ENTRY_SIZE] =
5150 {
5151 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
5152 0x4c, 0x8b, 0x1d, 16, 0, 0, 0, /* mov GOT+16(%rip), %r11 */
5153 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
5154 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
5155 0x41, 0xff, 0xe3, /* jmpq *%r11 */
5156
ea2d813e
RM
5157 /* 9-byte nop sequence to pad out to the next 32-byte boundary. */
5158 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopl %cs:0x0(%rax,%rax,1) */
5159
5160 /* 32 bytes of nop to pad out to the standard size. */
8059fb19
RM
5161 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5162 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5163 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5164 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
ea2d813e
RM
5165 0x66, /* excess data32 prefix */
5166 0x90 /* nop */
8059fb19
RM
5167 };
5168
5169static const bfd_byte elf_x86_64_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
5170 {
5171 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, /* mov name@GOTPCREL(%rip),%r11 */
5172 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */
5173 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
5174 0x41, 0xff, 0xe3, /* jmpq *%r11 */
5175
5176 /* 15-byte nop sequence to pad out to the next 32-byte boundary. */
5177 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data32 prefixes */
5178 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
5179
5180 /* Lazy GOT entries point here (32-byte aligned). */
5181 0x68, /* pushq immediate */
5182 0, 0, 0, 0, /* replaced with index into relocation table. */
5183 0xe9, /* jmp relative */
5184 0, 0, 0, 0, /* replaced with offset to start of .plt0. */
5185
5186 /* 22 bytes of nop to pad out to the standard size. */
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 0x0f, 0x1f, 0x80, 0, 0, 0, 0, /* nopl 0x0(%rax) */
5190 };
5191
5192/* .eh_frame covering the .plt section. */
5193
5194static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] =
5195 {
5196#if (PLT_CIE_LENGTH != 20 \
5197 || PLT_FDE_LENGTH != 36 \
5198 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
5199 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
5200# error "Need elf_x86_64_backend_data parameters for eh_frame_plt offsets!"
5201#endif
5202 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
5203 0, 0, 0, 0, /* CIE ID */
5204 1, /* CIE version */
5205 'z', 'R', 0, /* Augmentation string */
5206 1, /* Code alignment factor */
5207 0x78, /* Data alignment factor */
5208 16, /* Return address column */
5209 1, /* Augmentation size */
5210 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
5211 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
5212 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
5213 DW_CFA_nop, DW_CFA_nop,
5214
5215 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
5216 PLT_CIE_LENGTH + 8, 0, 0, 0,/* CIE pointer */
5217 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
5218 0, 0, 0, 0, /* .plt size goes here */
5219 0, /* Augmentation size */
5220 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
5221 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
5222 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
5223 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
5224 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
5225 13, /* Block length */
5226 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
5227 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
5228 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
5229 DW_OP_lit3, DW_OP_shl, DW_OP_plus,
5230 DW_CFA_nop, DW_CFA_nop
5231 };
5232
5233static const struct elf_x86_64_backend_data elf_x86_64_nacl_arch_bed =
5234 {
5235 elf_x86_64_nacl_plt0_entry, /* plt0_entry */
5236 elf_x86_64_nacl_plt_entry, /* plt_entry */
5237 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
5238 2, /* plt0_got1_offset */
5239 9, /* plt0_got2_offset */
5240 13, /* plt0_got2_insn_end */
5241 3, /* plt_got_offset */
5242 33, /* plt_reloc_offset */
5243 38, /* plt_plt_offset */
5244 7, /* plt_got_insn_size */
5245 42, /* plt_plt_insn_end */
5246 32, /* plt_lazy_offset */
5247 elf_x86_64_nacl_eh_frame_plt, /* eh_frame_plt */
5248 sizeof (elf_x86_64_nacl_eh_frame_plt), /* eh_frame_plt_size */
5249 };
5250
5251#undef elf_backend_arch_data
5252#define elf_backend_arch_data &elf_x86_64_nacl_arch_bed
5253
5a68afcf
RM
5254#undef elf_backend_modify_segment_map
5255#define elf_backend_modify_segment_map nacl_modify_segment_map
5256#undef elf_backend_modify_program_headers
5257#define elf_backend_modify_program_headers nacl_modify_program_headers
5258
8059fb19
RM
5259#include "elf64-target.h"
5260
5261/* Native Client x32 support. */
5262
5263#undef TARGET_LITTLE_SYM
5264#define TARGET_LITTLE_SYM bfd_elf32_x86_64_nacl_vec
5265#undef TARGET_LITTLE_NAME
5266#define TARGET_LITTLE_NAME "elf32-x86-64-nacl"
5267#undef elf32_bed
5268#define elf32_bed elf32_x86_64_nacl_bed
5269
5270#define bfd_elf32_bfd_link_hash_table_create \
5271 elf_x86_64_link_hash_table_create
5272#define bfd_elf32_bfd_link_hash_table_free \
5273 elf_x86_64_link_hash_table_free
5274#define bfd_elf32_bfd_reloc_type_lookup \
5275 elf_x86_64_reloc_type_lookup
5276#define bfd_elf32_bfd_reloc_name_lookup \
5277 elf_x86_64_reloc_name_lookup
5278#define bfd_elf32_mkobject \
5279 elf_x86_64_mkobject
5280
5281#undef elf_backend_object_p
5282#define elf_backend_object_p \
5283 elf32_x86_64_elf_object_p
5284
5285#undef elf_backend_bfd_from_remote_memory
5286#define elf_backend_bfd_from_remote_memory \
5287 _bfd_elf32_bfd_from_remote_memory
5288
5289#undef elf_backend_size_info
5290#define elf_backend_size_info \
5291 _bfd_elf32_size_info
5292
5293#include "elf32-target.h"
5294
5295/* Restore defaults. */
5a68afcf 5296#undef elf_backend_object_p
8059fb19 5297#define elf_backend_object_p elf64_x86_64_elf_object_p
5a68afcf
RM
5298#undef elf_backend_bfd_from_remote_memory
5299#undef elf_backend_size_info
5300#undef elf_backend_modify_segment_map
5301#undef elf_backend_modify_program_headers
8059fb19 5302
8a9036a4
L
5303/* Intel L1OM support. */
5304
5305static bfd_boolean
5306elf64_l1om_elf_object_p (bfd *abfd)
5307{
5308 /* Set the right machine number for an L1OM elf64 file. */
5309 bfd_default_set_arch_mach (abfd, bfd_arch_l1om, bfd_mach_l1om);
5310 return TRUE;
5311}
5312
5313#undef TARGET_LITTLE_SYM
5314#define TARGET_LITTLE_SYM bfd_elf64_l1om_vec
5315#undef TARGET_LITTLE_NAME
5316#define TARGET_LITTLE_NAME "elf64-l1om"
5317#undef ELF_ARCH
5318#define ELF_ARCH bfd_arch_l1om
5319
5320#undef ELF_MACHINE_CODE
5321#define ELF_MACHINE_CODE EM_L1OM
5322
5323#undef ELF_OSABI
5324
5325#undef elf64_bed
5326#define elf64_bed elf64_l1om_bed
5327
5328#undef elf_backend_object_p
5329#define elf_backend_object_p elf64_l1om_elf_object_p
5330
8059fb19
RM
5331/* Restore defaults. */
5332#undef ELF_MAXPAGESIZE
5333#undef ELF_MINPAGESIZE
5334#undef ELF_COMMONPAGESIZE
5335#define ELF_MAXPAGESIZE 0x200000
5336#define ELF_MINPAGESIZE 0x1000
5337#define ELF_COMMONPAGESIZE 0x1000
5338#undef elf_backend_plt_alignment
5339#define elf_backend_plt_alignment 4
5340#undef elf_backend_arch_data
5341#define elf_backend_arch_data &elf_x86_64_arch_bed
1a0c107f 5342
8a9036a4
L
5343#include "elf64-target.h"
5344
5345/* FreeBSD L1OM support. */
5346
5347#undef TARGET_LITTLE_SYM
5348#define TARGET_LITTLE_SYM bfd_elf64_l1om_freebsd_vec
5349#undef TARGET_LITTLE_NAME
5350#define TARGET_LITTLE_NAME "elf64-l1om-freebsd"
5351
5352#undef ELF_OSABI
5353#define ELF_OSABI ELFOSABI_FREEBSD
5354
5355#undef elf64_bed
5356#define elf64_bed elf64_l1om_fbsd_bed
5357
8a9036a4 5358#include "elf64-target.h"
351f65ca 5359
7a9068fe
L
5360/* Intel K1OM support. */
5361
5362static bfd_boolean
5363elf64_k1om_elf_object_p (bfd *abfd)
5364{
5365 /* Set the right machine number for an K1OM elf64 file. */
5366 bfd_default_set_arch_mach (abfd, bfd_arch_k1om, bfd_mach_k1om);
5367 return TRUE;
5368}
5369
5370#undef TARGET_LITTLE_SYM
5371#define TARGET_LITTLE_SYM bfd_elf64_k1om_vec
5372#undef TARGET_LITTLE_NAME
5373#define TARGET_LITTLE_NAME "elf64-k1om"
5374#undef ELF_ARCH
5375#define ELF_ARCH bfd_arch_k1om
5376
5377#undef ELF_MACHINE_CODE
5378#define ELF_MACHINE_CODE EM_K1OM
5379
5380#undef ELF_OSABI
5381
5382#undef elf64_bed
5383#define elf64_bed elf64_k1om_bed
5384
5385#undef elf_backend_object_p
5386#define elf_backend_object_p elf64_k1om_elf_object_p
5387
5388#undef elf_backend_static_tls_alignment
5389
5390#undef elf_backend_want_plt_sym
5391#define elf_backend_want_plt_sym 0
5392
5393#include "elf64-target.h"
5394
5395/* FreeBSD K1OM support. */
5396
5397#undef TARGET_LITTLE_SYM
5398#define TARGET_LITTLE_SYM bfd_elf64_k1om_freebsd_vec
5399#undef TARGET_LITTLE_NAME
5400#define TARGET_LITTLE_NAME "elf64-k1om-freebsd"
5401
5402#undef ELF_OSABI
5403#define ELF_OSABI ELFOSABI_FREEBSD
5404
5405#undef elf64_bed
5406#define elf64_bed elf64_k1om_fbsd_bed
5407
5408#include "elf64-target.h"
5409
351f65ca
L
5410/* 32bit x86-64 support. */
5411
351f65ca
L
5412#undef TARGET_LITTLE_SYM
5413#define TARGET_LITTLE_SYM bfd_elf32_x86_64_vec
5414#undef TARGET_LITTLE_NAME
5415#define TARGET_LITTLE_NAME "elf32-x86-64"
8059fb19 5416#undef elf32_bed
351f65ca
L
5417
5418#undef ELF_ARCH
5419#define ELF_ARCH bfd_arch_i386
5420
5421#undef ELF_MACHINE_CODE
5422#define ELF_MACHINE_CODE EM_X86_64
5423
351f65ca
L
5424#undef ELF_OSABI
5425
351f65ca
L
5426#undef elf_backend_object_p
5427#define elf_backend_object_p \
5428 elf32_x86_64_elf_object_p
5429
5430#undef elf_backend_bfd_from_remote_memory
5431#define elf_backend_bfd_from_remote_memory \
5432 _bfd_elf32_bfd_from_remote_memory
5433
5434#undef elf_backend_size_info
5435#define elf_backend_size_info \
5436 _bfd_elf32_size_info
5437
5438#include "elf32-target.h"
This page took 0.965937 seconds and 4 git commands to generate.