1 /* X86-64 specific support for ELF
2 Copyright (C) 2000-2017 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka <jh@suse.cz>.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
28 #include "bfd_stdint.h"
32 #include "libiberty.h"
34 #include "opcode/i386.h"
35 #include "elf/x86-64.h"
42 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
43 #define MINUS_ONE (~ (bfd_vma) 0)
45 /* Since both 32-bit and 64-bit x86-64 encode relocation type in the
46 identical manner, we use ELF32_R_TYPE instead of ELF64_R_TYPE to get
47 relocation type. We also use ELF_ST_TYPE instead of ELF64_ST_TYPE
48 since they are the same. */
50 #define ABI_64_P(abfd) \
51 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
53 /* The relocation "howto" table. Order of fields:
54 type, rightshift, size, bitsize, pc_relative, bitpos, complain_on_overflow,
55 special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset. */
56 static reloc_howto_type x86_64_elf_howto_table
[] =
58 HOWTO(R_X86_64_NONE
, 0, 3, 0, FALSE
, 0, complain_overflow_dont
,
59 bfd_elf_generic_reloc
, "R_X86_64_NONE", FALSE
, 0x00000000, 0x00000000,
61 HOWTO(R_X86_64_64
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
62 bfd_elf_generic_reloc
, "R_X86_64_64", FALSE
, MINUS_ONE
, MINUS_ONE
,
64 HOWTO(R_X86_64_PC32
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
65 bfd_elf_generic_reloc
, "R_X86_64_PC32", FALSE
, 0xffffffff, 0xffffffff,
67 HOWTO(R_X86_64_GOT32
, 0, 2, 32, FALSE
, 0, complain_overflow_signed
,
68 bfd_elf_generic_reloc
, "R_X86_64_GOT32", FALSE
, 0xffffffff, 0xffffffff,
70 HOWTO(R_X86_64_PLT32
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
71 bfd_elf_generic_reloc
, "R_X86_64_PLT32", FALSE
, 0xffffffff, 0xffffffff,
73 HOWTO(R_X86_64_COPY
, 0, 2, 32, FALSE
, 0, complain_overflow_bitfield
,
74 bfd_elf_generic_reloc
, "R_X86_64_COPY", FALSE
, 0xffffffff, 0xffffffff,
76 HOWTO(R_X86_64_GLOB_DAT
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
77 bfd_elf_generic_reloc
, "R_X86_64_GLOB_DAT", FALSE
, MINUS_ONE
,
79 HOWTO(R_X86_64_JUMP_SLOT
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
80 bfd_elf_generic_reloc
, "R_X86_64_JUMP_SLOT", FALSE
, MINUS_ONE
,
82 HOWTO(R_X86_64_RELATIVE
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
83 bfd_elf_generic_reloc
, "R_X86_64_RELATIVE", FALSE
, MINUS_ONE
,
85 HOWTO(R_X86_64_GOTPCREL
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
86 bfd_elf_generic_reloc
, "R_X86_64_GOTPCREL", FALSE
, 0xffffffff,
88 HOWTO(R_X86_64_32
, 0, 2, 32, FALSE
, 0, complain_overflow_unsigned
,
89 bfd_elf_generic_reloc
, "R_X86_64_32", FALSE
, 0xffffffff, 0xffffffff,
91 HOWTO(R_X86_64_32S
, 0, 2, 32, FALSE
, 0, complain_overflow_signed
,
92 bfd_elf_generic_reloc
, "R_X86_64_32S", FALSE
, 0xffffffff, 0xffffffff,
94 HOWTO(R_X86_64_16
, 0, 1, 16, FALSE
, 0, complain_overflow_bitfield
,
95 bfd_elf_generic_reloc
, "R_X86_64_16", FALSE
, 0xffff, 0xffff, FALSE
),
96 HOWTO(R_X86_64_PC16
,0, 1, 16, TRUE
, 0, complain_overflow_bitfield
,
97 bfd_elf_generic_reloc
, "R_X86_64_PC16", FALSE
, 0xffff, 0xffff, TRUE
),
98 HOWTO(R_X86_64_8
, 0, 0, 8, FALSE
, 0, complain_overflow_bitfield
,
99 bfd_elf_generic_reloc
, "R_X86_64_8", FALSE
, 0xff, 0xff, FALSE
),
100 HOWTO(R_X86_64_PC8
, 0, 0, 8, TRUE
, 0, complain_overflow_signed
,
101 bfd_elf_generic_reloc
, "R_X86_64_PC8", FALSE
, 0xff, 0xff, TRUE
),
102 HOWTO(R_X86_64_DTPMOD64
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
103 bfd_elf_generic_reloc
, "R_X86_64_DTPMOD64", FALSE
, MINUS_ONE
,
105 HOWTO(R_X86_64_DTPOFF64
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
106 bfd_elf_generic_reloc
, "R_X86_64_DTPOFF64", FALSE
, MINUS_ONE
,
108 HOWTO(R_X86_64_TPOFF64
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
109 bfd_elf_generic_reloc
, "R_X86_64_TPOFF64", FALSE
, MINUS_ONE
,
111 HOWTO(R_X86_64_TLSGD
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
112 bfd_elf_generic_reloc
, "R_X86_64_TLSGD", FALSE
, 0xffffffff,
114 HOWTO(R_X86_64_TLSLD
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
115 bfd_elf_generic_reloc
, "R_X86_64_TLSLD", FALSE
, 0xffffffff,
117 HOWTO(R_X86_64_DTPOFF32
, 0, 2, 32, FALSE
, 0, complain_overflow_signed
,
118 bfd_elf_generic_reloc
, "R_X86_64_DTPOFF32", FALSE
, 0xffffffff,
120 HOWTO(R_X86_64_GOTTPOFF
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
121 bfd_elf_generic_reloc
, "R_X86_64_GOTTPOFF", FALSE
, 0xffffffff,
123 HOWTO(R_X86_64_TPOFF32
, 0, 2, 32, FALSE
, 0, complain_overflow_signed
,
124 bfd_elf_generic_reloc
, "R_X86_64_TPOFF32", FALSE
, 0xffffffff,
126 HOWTO(R_X86_64_PC64
, 0, 4, 64, TRUE
, 0, complain_overflow_bitfield
,
127 bfd_elf_generic_reloc
, "R_X86_64_PC64", FALSE
, MINUS_ONE
, MINUS_ONE
,
129 HOWTO(R_X86_64_GOTOFF64
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
130 bfd_elf_generic_reloc
, "R_X86_64_GOTOFF64",
131 FALSE
, MINUS_ONE
, MINUS_ONE
, FALSE
),
132 HOWTO(R_X86_64_GOTPC32
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
133 bfd_elf_generic_reloc
, "R_X86_64_GOTPC32",
134 FALSE
, 0xffffffff, 0xffffffff, TRUE
),
135 HOWTO(R_X86_64_GOT64
, 0, 4, 64, FALSE
, 0, complain_overflow_signed
,
136 bfd_elf_generic_reloc
, "R_X86_64_GOT64", FALSE
, MINUS_ONE
, MINUS_ONE
,
138 HOWTO(R_X86_64_GOTPCREL64
, 0, 4, 64, TRUE
, 0, complain_overflow_signed
,
139 bfd_elf_generic_reloc
, "R_X86_64_GOTPCREL64", FALSE
, MINUS_ONE
,
141 HOWTO(R_X86_64_GOTPC64
, 0, 4, 64, TRUE
, 0, complain_overflow_signed
,
142 bfd_elf_generic_reloc
, "R_X86_64_GOTPC64",
143 FALSE
, MINUS_ONE
, MINUS_ONE
, TRUE
),
144 HOWTO(R_X86_64_GOTPLT64
, 0, 4, 64, FALSE
, 0, complain_overflow_signed
,
145 bfd_elf_generic_reloc
, "R_X86_64_GOTPLT64", FALSE
, MINUS_ONE
,
147 HOWTO(R_X86_64_PLTOFF64
, 0, 4, 64, FALSE
, 0, complain_overflow_signed
,
148 bfd_elf_generic_reloc
, "R_X86_64_PLTOFF64", FALSE
, MINUS_ONE
,
150 HOWTO(R_X86_64_SIZE32
, 0, 2, 32, FALSE
, 0, complain_overflow_unsigned
,
151 bfd_elf_generic_reloc
, "R_X86_64_SIZE32", FALSE
, 0xffffffff, 0xffffffff,
153 HOWTO(R_X86_64_SIZE64
, 0, 4, 64, FALSE
, 0, complain_overflow_unsigned
,
154 bfd_elf_generic_reloc
, "R_X86_64_SIZE64", FALSE
, MINUS_ONE
, MINUS_ONE
,
156 HOWTO(R_X86_64_GOTPC32_TLSDESC
, 0, 2, 32, TRUE
, 0,
157 complain_overflow_bitfield
, bfd_elf_generic_reloc
,
158 "R_X86_64_GOTPC32_TLSDESC",
159 FALSE
, 0xffffffff, 0xffffffff, TRUE
),
160 HOWTO(R_X86_64_TLSDESC_CALL
, 0, 0, 0, FALSE
, 0,
161 complain_overflow_dont
, bfd_elf_generic_reloc
,
162 "R_X86_64_TLSDESC_CALL",
164 HOWTO(R_X86_64_TLSDESC
, 0, 4, 64, FALSE
, 0,
165 complain_overflow_bitfield
, bfd_elf_generic_reloc
,
167 FALSE
, MINUS_ONE
, MINUS_ONE
, FALSE
),
168 HOWTO(R_X86_64_IRELATIVE
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
169 bfd_elf_generic_reloc
, "R_X86_64_IRELATIVE", FALSE
, MINUS_ONE
,
171 HOWTO(R_X86_64_RELATIVE64
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
172 bfd_elf_generic_reloc
, "R_X86_64_RELATIVE64", FALSE
, MINUS_ONE
,
174 HOWTO(R_X86_64_PC32_BND
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
175 bfd_elf_generic_reloc
, "R_X86_64_PC32_BND", FALSE
, 0xffffffff, 0xffffffff,
177 HOWTO(R_X86_64_PLT32_BND
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
178 bfd_elf_generic_reloc
, "R_X86_64_PLT32_BND", FALSE
, 0xffffffff, 0xffffffff,
180 HOWTO(R_X86_64_GOTPCRELX
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
181 bfd_elf_generic_reloc
, "R_X86_64_GOTPCRELX", FALSE
, 0xffffffff,
183 HOWTO(R_X86_64_REX_GOTPCRELX
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
184 bfd_elf_generic_reloc
, "R_X86_64_REX_GOTPCRELX", FALSE
, 0xffffffff,
187 /* We have a gap in the reloc numbers here.
188 R_X86_64_standard counts the number up to this point, and
189 R_X86_64_vt_offset is the value to subtract from a reloc type of
190 R_X86_64_GNU_VT* to form an index into this table. */
191 #define R_X86_64_standard (R_X86_64_REX_GOTPCRELX + 1)
192 #define R_X86_64_vt_offset (R_X86_64_GNU_VTINHERIT - R_X86_64_standard)
194 /* GNU extension to record C++ vtable hierarchy. */
195 HOWTO (R_X86_64_GNU_VTINHERIT
, 0, 4, 0, FALSE
, 0, complain_overflow_dont
,
196 NULL
, "R_X86_64_GNU_VTINHERIT", FALSE
, 0, 0, FALSE
),
198 /* GNU extension to record C++ vtable member usage. */
199 HOWTO (R_X86_64_GNU_VTENTRY
, 0, 4, 0, FALSE
, 0, complain_overflow_dont
,
200 _bfd_elf_rel_vtable_reloc_fn
, "R_X86_64_GNU_VTENTRY", FALSE
, 0, 0,
203 /* Use complain_overflow_bitfield on R_X86_64_32 for x32. */
204 HOWTO(R_X86_64_32
, 0, 2, 32, FALSE
, 0, complain_overflow_bitfield
,
205 bfd_elf_generic_reloc
, "R_X86_64_32", FALSE
, 0xffffffff, 0xffffffff,
209 #define IS_X86_64_PCREL_TYPE(TYPE) \
210 ( ((TYPE) == R_X86_64_PC8) \
211 || ((TYPE) == R_X86_64_PC16) \
212 || ((TYPE) == R_X86_64_PC32) \
213 || ((TYPE) == R_X86_64_PC32_BND) \
214 || ((TYPE) == R_X86_64_PC64))
216 /* Map BFD relocs to the x86_64 elf relocs. */
219 bfd_reloc_code_real_type bfd_reloc_val
;
220 unsigned char elf_reloc_val
;
223 static const struct elf_reloc_map x86_64_reloc_map
[] =
225 { BFD_RELOC_NONE
, R_X86_64_NONE
, },
226 { BFD_RELOC_64
, R_X86_64_64
, },
227 { BFD_RELOC_32_PCREL
, R_X86_64_PC32
, },
228 { BFD_RELOC_X86_64_GOT32
, R_X86_64_GOT32
,},
229 { BFD_RELOC_X86_64_PLT32
, R_X86_64_PLT32
,},
230 { BFD_RELOC_X86_64_COPY
, R_X86_64_COPY
, },
231 { BFD_RELOC_X86_64_GLOB_DAT
, R_X86_64_GLOB_DAT
, },
232 { BFD_RELOC_X86_64_JUMP_SLOT
, R_X86_64_JUMP_SLOT
, },
233 { BFD_RELOC_X86_64_RELATIVE
, R_X86_64_RELATIVE
, },
234 { BFD_RELOC_X86_64_GOTPCREL
, R_X86_64_GOTPCREL
, },
235 { BFD_RELOC_32
, R_X86_64_32
, },
236 { BFD_RELOC_X86_64_32S
, R_X86_64_32S
, },
237 { BFD_RELOC_16
, R_X86_64_16
, },
238 { BFD_RELOC_16_PCREL
, R_X86_64_PC16
, },
239 { BFD_RELOC_8
, R_X86_64_8
, },
240 { BFD_RELOC_8_PCREL
, R_X86_64_PC8
, },
241 { BFD_RELOC_X86_64_DTPMOD64
, R_X86_64_DTPMOD64
, },
242 { BFD_RELOC_X86_64_DTPOFF64
, R_X86_64_DTPOFF64
, },
243 { BFD_RELOC_X86_64_TPOFF64
, R_X86_64_TPOFF64
, },
244 { BFD_RELOC_X86_64_TLSGD
, R_X86_64_TLSGD
, },
245 { BFD_RELOC_X86_64_TLSLD
, R_X86_64_TLSLD
, },
246 { BFD_RELOC_X86_64_DTPOFF32
, R_X86_64_DTPOFF32
, },
247 { BFD_RELOC_X86_64_GOTTPOFF
, R_X86_64_GOTTPOFF
, },
248 { BFD_RELOC_X86_64_TPOFF32
, R_X86_64_TPOFF32
, },
249 { BFD_RELOC_64_PCREL
, R_X86_64_PC64
, },
250 { BFD_RELOC_X86_64_GOTOFF64
, R_X86_64_GOTOFF64
, },
251 { BFD_RELOC_X86_64_GOTPC32
, R_X86_64_GOTPC32
, },
252 { BFD_RELOC_X86_64_GOT64
, R_X86_64_GOT64
, },
253 { BFD_RELOC_X86_64_GOTPCREL64
,R_X86_64_GOTPCREL64
, },
254 { BFD_RELOC_X86_64_GOTPC64
, R_X86_64_GOTPC64
, },
255 { BFD_RELOC_X86_64_GOTPLT64
, R_X86_64_GOTPLT64
, },
256 { BFD_RELOC_X86_64_PLTOFF64
, R_X86_64_PLTOFF64
, },
257 { BFD_RELOC_SIZE32
, R_X86_64_SIZE32
, },
258 { BFD_RELOC_SIZE64
, R_X86_64_SIZE64
, },
259 { BFD_RELOC_X86_64_GOTPC32_TLSDESC
, R_X86_64_GOTPC32_TLSDESC
, },
260 { BFD_RELOC_X86_64_TLSDESC_CALL
, R_X86_64_TLSDESC_CALL
, },
261 { BFD_RELOC_X86_64_TLSDESC
, R_X86_64_TLSDESC
, },
262 { BFD_RELOC_X86_64_IRELATIVE
, R_X86_64_IRELATIVE
, },
263 { BFD_RELOC_X86_64_PC32_BND
, R_X86_64_PC32_BND
, },
264 { BFD_RELOC_X86_64_PLT32_BND
, R_X86_64_PLT32_BND
, },
265 { BFD_RELOC_X86_64_GOTPCRELX
, R_X86_64_GOTPCRELX
, },
266 { BFD_RELOC_X86_64_REX_GOTPCRELX
, R_X86_64_REX_GOTPCRELX
, },
267 { BFD_RELOC_VTABLE_INHERIT
, R_X86_64_GNU_VTINHERIT
, },
268 { BFD_RELOC_VTABLE_ENTRY
, R_X86_64_GNU_VTENTRY
, },
271 static reloc_howto_type
*
272 elf_x86_64_rtype_to_howto (bfd
*abfd
, unsigned r_type
)
276 if (r_type
== (unsigned int) R_X86_64_32
)
281 i
= ARRAY_SIZE (x86_64_elf_howto_table
) - 1;
283 else if (r_type
< (unsigned int) R_X86_64_GNU_VTINHERIT
284 || r_type
>= (unsigned int) R_X86_64_max
)
286 if (r_type
>= (unsigned int) R_X86_64_standard
)
288 /* xgettext:c-format */
289 _bfd_error_handler (_("%B: invalid relocation type %d"),
291 r_type
= R_X86_64_NONE
;
296 i
= r_type
- (unsigned int) R_X86_64_vt_offset
;
297 BFD_ASSERT (x86_64_elf_howto_table
[i
].type
== r_type
);
298 return &x86_64_elf_howto_table
[i
];
301 /* Given a BFD reloc type, return a HOWTO structure. */
302 static reloc_howto_type
*
303 elf_x86_64_reloc_type_lookup (bfd
*abfd
,
304 bfd_reloc_code_real_type code
)
308 for (i
= 0; i
< sizeof (x86_64_reloc_map
) / sizeof (struct elf_reloc_map
);
311 if (x86_64_reloc_map
[i
].bfd_reloc_val
== code
)
312 return elf_x86_64_rtype_to_howto (abfd
,
313 x86_64_reloc_map
[i
].elf_reloc_val
);
318 static reloc_howto_type
*
319 elf_x86_64_reloc_name_lookup (bfd
*abfd
,
324 if (!ABI_64_P (abfd
) && strcasecmp (r_name
, "R_X86_64_32") == 0)
326 /* Get x32 R_X86_64_32. */
327 reloc_howto_type
*reloc
328 = &x86_64_elf_howto_table
[ARRAY_SIZE (x86_64_elf_howto_table
) - 1];
329 BFD_ASSERT (reloc
->type
== (unsigned int) R_X86_64_32
);
333 for (i
= 0; i
< ARRAY_SIZE (x86_64_elf_howto_table
); i
++)
334 if (x86_64_elf_howto_table
[i
].name
!= NULL
335 && strcasecmp (x86_64_elf_howto_table
[i
].name
, r_name
) == 0)
336 return &x86_64_elf_howto_table
[i
];
341 /* Given an x86_64 ELF reloc type, fill in an arelent structure. */
344 elf_x86_64_info_to_howto (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*cache_ptr
,
345 Elf_Internal_Rela
*dst
)
349 r_type
= ELF32_R_TYPE (dst
->r_info
);
350 cache_ptr
->howto
= elf_x86_64_rtype_to_howto (abfd
, r_type
);
351 BFD_ASSERT (r_type
== cache_ptr
->howto
->type
);
354 /* Support for core dump NOTE sections. */
356 elf_x86_64_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
361 switch (note
->descsz
)
366 case 296: /* sizeof(istruct elf_prstatus) on Linux/x32 */
368 elf_tdata (abfd
)->core
->signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
371 elf_tdata (abfd
)->core
->lwpid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
379 case 336: /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
381 elf_tdata (abfd
)->core
->signal
382 = bfd_get_16 (abfd
, note
->descdata
+ 12);
385 elf_tdata (abfd
)->core
->lwpid
386 = bfd_get_32 (abfd
, note
->descdata
+ 32);
395 /* Make a ".reg/999" section. */
396 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
397 size
, note
->descpos
+ offset
);
401 elf_x86_64_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
403 switch (note
->descsz
)
408 case 124: /* sizeof(struct elf_prpsinfo) on Linux/x32 */
409 elf_tdata (abfd
)->core
->pid
410 = bfd_get_32 (abfd
, note
->descdata
+ 12);
411 elf_tdata (abfd
)->core
->program
412 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 28, 16);
413 elf_tdata (abfd
)->core
->command
414 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 44, 80);
417 case 136: /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
418 elf_tdata (abfd
)->core
->pid
419 = bfd_get_32 (abfd
, note
->descdata
+ 24);
420 elf_tdata (abfd
)->core
->program
421 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 40, 16);
422 elf_tdata (abfd
)->core
->command
423 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 56, 80);
426 /* Note that for some reason, a spurious space is tacked
427 onto the end of the args in some (at least one anyway)
428 implementations, so strip it off if it exists. */
431 char *command
= elf_tdata (abfd
)->core
->command
;
432 int n
= strlen (command
);
434 if (0 < n
&& command
[n
- 1] == ' ')
435 command
[n
- 1] = '\0';
443 elf_x86_64_write_core_note (bfd
*abfd
, char *buf
, int *bufsiz
,
446 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
448 const char *fname
, *psargs
;
459 va_start (ap
, note_type
);
460 fname
= va_arg (ap
, const char *);
461 psargs
= va_arg (ap
, const char *);
464 if (bed
->s
->elfclass
== ELFCLASS32
)
467 memset (&data
, 0, sizeof (data
));
468 strncpy (data
.pr_fname
, fname
, sizeof (data
.pr_fname
));
469 strncpy (data
.pr_psargs
, psargs
, sizeof (data
.pr_psargs
));
470 return elfcore_write_note (abfd
, buf
, bufsiz
, "CORE", note_type
,
471 &data
, sizeof (data
));
476 memset (&data
, 0, sizeof (data
));
477 strncpy (data
.pr_fname
, fname
, sizeof (data
.pr_fname
));
478 strncpy (data
.pr_psargs
, psargs
, sizeof (data
.pr_psargs
));
479 return elfcore_write_note (abfd
, buf
, bufsiz
, "CORE", note_type
,
480 &data
, sizeof (data
));
485 va_start (ap
, note_type
);
486 pid
= va_arg (ap
, long);
487 cursig
= va_arg (ap
, int);
488 gregs
= va_arg (ap
, const void *);
491 if (bed
->s
->elfclass
== ELFCLASS32
)
493 if (bed
->elf_machine_code
== EM_X86_64
)
495 prstatusx32_t prstat
;
496 memset (&prstat
, 0, sizeof (prstat
));
498 prstat
.pr_cursig
= cursig
;
499 memcpy (&prstat
.pr_reg
, gregs
, sizeof (prstat
.pr_reg
));
500 return elfcore_write_note (abfd
, buf
, bufsiz
, "CORE", note_type
,
501 &prstat
, sizeof (prstat
));
506 memset (&prstat
, 0, sizeof (prstat
));
508 prstat
.pr_cursig
= cursig
;
509 memcpy (&prstat
.pr_reg
, gregs
, sizeof (prstat
.pr_reg
));
510 return elfcore_write_note (abfd
, buf
, bufsiz
, "CORE", note_type
,
511 &prstat
, sizeof (prstat
));
517 memset (&prstat
, 0, sizeof (prstat
));
519 prstat
.pr_cursig
= cursig
;
520 memcpy (&prstat
.pr_reg
, gregs
, sizeof (prstat
.pr_reg
));
521 return elfcore_write_note (abfd
, buf
, bufsiz
, "CORE", note_type
,
522 &prstat
, sizeof (prstat
));
529 /* Functions for the x86-64 ELF linker. */
531 /* The name of the dynamic interpreter. This is put in the .interp
534 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
535 #define ELF32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
537 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
538 copying dynamic variables from a shared lib into an app's dynbss
539 section, and instead use a dynamic relocation to point into the
541 #define ELIMINATE_COPY_RELOCS 1
543 /* The size in bytes of an entry in the global offset table. */
545 #define GOT_ENTRY_SIZE 8
547 /* The size in bytes of an entry in the procedure linkage table. */
549 #define PLT_ENTRY_SIZE 16
551 /* The first entry in a procedure linkage table looks like this. See the
552 SVR4 ABI i386 supplement and the x86-64 ABI to see how this works. */
554 static const bfd_byte elf_x86_64_plt0_entry
[PLT_ENTRY_SIZE
] =
556 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
557 0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */
558 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */
561 /* Subsequent entries in a procedure linkage table look like this. */
563 static const bfd_byte elf_x86_64_plt_entry
[PLT_ENTRY_SIZE
] =
565 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
566 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
567 0x68, /* pushq immediate */
568 0, 0, 0, 0, /* replaced with index into relocation table. */
569 0xe9, /* jmp relative */
570 0, 0, 0, 0 /* replaced with offset to start of .plt0. */
573 /* The first entry in a procedure linkage table with BND relocations
576 static const bfd_byte elf_x86_64_bnd_plt0_entry
[PLT_ENTRY_SIZE
] =
578 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
579 0xf2, 0xff, 0x25, 16, 0, 0, 0, /* bnd jmpq *GOT+16(%rip) */
580 0x0f, 0x1f, 0 /* nopl (%rax) */
583 /* Subsequent entries for legacy branches in a procedure linkage table
584 with BND relocations look like this. */
586 static const bfd_byte elf_x86_64_legacy_plt_entry
[PLT_ENTRY_SIZE
] =
588 0x68, 0, 0, 0, 0, /* pushq immediate */
589 0xe9, 0, 0, 0, 0, /* jmpq relative */
590 0x66, 0x0f, 0x1f, 0x44, 0, 0 /* nopw (%rax,%rax,1) */
593 /* Subsequent entries for branches with BND prefx in a procedure linkage
594 table with BND relocations look like this. */
596 static const bfd_byte elf_x86_64_bnd_plt_entry
[PLT_ENTRY_SIZE
] =
598 0x68, 0, 0, 0, 0, /* pushq immediate */
599 0xf2, 0xe9, 0, 0, 0, 0, /* bnd jmpq relative */
600 0x0f, 0x1f, 0x44, 0, 0 /* nopl 0(%rax,%rax,1) */
603 /* Entries for legacy branches in the second procedure linkage table
606 static const bfd_byte elf_x86_64_legacy_plt2_entry
[8] =
608 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
609 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
610 0x66, 0x90 /* xchg %ax,%ax */
613 /* Entries for branches with BND prefix in the second procedure linkage
614 table look like this. */
616 static const bfd_byte elf_x86_64_bnd_plt2_entry
[8] =
618 0xf2, 0xff, 0x25, /* bnd jmpq *name@GOTPC(%rip) */
619 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
623 /* .eh_frame covering the .plt section. */
625 static const bfd_byte elf_x86_64_eh_frame_plt
[] =
627 #define PLT_CIE_LENGTH 20
628 #define PLT_FDE_LENGTH 36
629 #define PLT_FDE_START_OFFSET 4 + PLT_CIE_LENGTH + 8
630 #define PLT_FDE_LEN_OFFSET 4 + PLT_CIE_LENGTH + 12
631 PLT_CIE_LENGTH
, 0, 0, 0, /* CIE length */
632 0, 0, 0, 0, /* CIE ID */
634 'z', 'R', 0, /* Augmentation string */
635 1, /* Code alignment factor */
636 0x78, /* Data alignment factor */
637 16, /* Return address column */
638 1, /* Augmentation size */
639 DW_EH_PE_pcrel
| DW_EH_PE_sdata4
, /* FDE encoding */
640 DW_CFA_def_cfa
, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
641 DW_CFA_offset
+ 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
642 DW_CFA_nop
, DW_CFA_nop
,
644 PLT_FDE_LENGTH
, 0, 0, 0, /* FDE length */
645 PLT_CIE_LENGTH
+ 8, 0, 0, 0, /* CIE pointer */
646 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
647 0, 0, 0, 0, /* .plt size goes here */
648 0, /* Augmentation size */
649 DW_CFA_def_cfa_offset
, 16, /* DW_CFA_def_cfa_offset: 16 */
650 DW_CFA_advance_loc
+ 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
651 DW_CFA_def_cfa_offset
, 24, /* DW_CFA_def_cfa_offset: 24 */
652 DW_CFA_advance_loc
+ 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
653 DW_CFA_def_cfa_expression
, /* DW_CFA_def_cfa_expression */
654 11, /* Block length */
655 DW_OP_breg7
, 8, /* DW_OP_breg7 (rsp): 8 */
656 DW_OP_breg16
, 0, /* DW_OP_breg16 (rip): 0 */
657 DW_OP_lit15
, DW_OP_and
, DW_OP_lit11
, DW_OP_ge
,
658 DW_OP_lit3
, DW_OP_shl
, DW_OP_plus
,
659 DW_CFA_nop
, DW_CFA_nop
, DW_CFA_nop
, DW_CFA_nop
662 /* Architecture-specific backend data for x86-64. */
664 struct elf_x86_64_backend_data
666 /* Templates for the initial PLT entry and for subsequent entries. */
667 const bfd_byte
*plt0_entry
;
668 const bfd_byte
*plt_entry
;
669 unsigned int plt_entry_size
; /* Size of each PLT entry. */
671 /* Offsets into plt0_entry that are to be replaced with GOT[1] and GOT[2]. */
672 unsigned int plt0_got1_offset
;
673 unsigned int plt0_got2_offset
;
675 /* Offset of the end of the PC-relative instruction containing
677 unsigned int plt0_got2_insn_end
;
679 /* Offsets into plt_entry that are to be replaced with... */
680 unsigned int plt_got_offset
; /* ... address of this symbol in .got. */
681 unsigned int plt_reloc_offset
; /* ... offset into relocation table. */
682 unsigned int plt_plt_offset
; /* ... offset to start of .plt. */
684 /* Length of the PC-relative instruction containing plt_got_offset. */
685 unsigned int plt_got_insn_size
;
687 /* Offset of the end of the PC-relative jump to plt0_entry. */
688 unsigned int plt_plt_insn_end
;
690 /* Offset into plt_entry where the initial value of the GOT entry points. */
691 unsigned int plt_lazy_offset
;
693 /* .eh_frame covering the .plt section. */
694 const bfd_byte
*eh_frame_plt
;
695 unsigned int eh_frame_plt_size
;
698 #define get_elf_x86_64_arch_data(bed) \
699 ((const struct elf_x86_64_backend_data *) (bed)->arch_data)
701 #define get_elf_x86_64_backend_data(abfd) \
702 get_elf_x86_64_arch_data (get_elf_backend_data (abfd))
704 #define GET_PLT_ENTRY_SIZE(abfd) \
705 get_elf_x86_64_backend_data (abfd)->plt_entry_size
707 /* These are the standard parameters. */
708 static const struct elf_x86_64_backend_data elf_x86_64_arch_bed
=
710 elf_x86_64_plt0_entry
, /* plt0_entry */
711 elf_x86_64_plt_entry
, /* plt_entry */
712 sizeof (elf_x86_64_plt_entry
), /* plt_entry_size */
713 2, /* plt0_got1_offset */
714 8, /* plt0_got2_offset */
715 12, /* plt0_got2_insn_end */
716 2, /* plt_got_offset */
717 7, /* plt_reloc_offset */
718 12, /* plt_plt_offset */
719 6, /* plt_got_insn_size */
720 PLT_ENTRY_SIZE
, /* plt_plt_insn_end */
721 6, /* plt_lazy_offset */
722 elf_x86_64_eh_frame_plt
, /* eh_frame_plt */
723 sizeof (elf_x86_64_eh_frame_plt
), /* eh_frame_plt_size */
726 static const struct elf_x86_64_backend_data elf_x86_64_bnd_arch_bed
=
728 elf_x86_64_bnd_plt0_entry
, /* plt0_entry */
729 elf_x86_64_bnd_plt_entry
, /* plt_entry */
730 sizeof (elf_x86_64_bnd_plt_entry
), /* plt_entry_size */
731 2, /* plt0_got1_offset */
732 1+8, /* plt0_got2_offset */
733 1+12, /* plt0_got2_insn_end */
734 1+2, /* plt_got_offset */
735 1, /* plt_reloc_offset */
736 7, /* plt_plt_offset */
737 1+6, /* plt_got_insn_size */
738 11, /* plt_plt_insn_end */
739 0, /* plt_lazy_offset */
740 elf_x86_64_eh_frame_plt
, /* eh_frame_plt */
741 sizeof (elf_x86_64_eh_frame_plt
), /* eh_frame_plt_size */
744 #define elf_backend_arch_data &elf_x86_64_arch_bed
746 /* Is a undefined weak symbol which is resolved to 0. Reference to an
747 undefined weak symbol is resolved to 0 when building executable if
749 1. Has non-GOT/non-PLT relocations in text section. Or
750 2. Has no GOT/PLT relocation.
752 #define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, GOT_RELOC, EH) \
753 ((EH)->elf.root.type == bfd_link_hash_undefweak \
754 && bfd_link_executable (INFO) \
755 && (elf_x86_64_hash_table (INFO)->interp == NULL \
757 || (EH)->has_non_got_reloc \
758 || !(INFO)->dynamic_undefined_weak))
760 /* x86-64 ELF linker hash entry. */
762 struct elf_x86_64_link_hash_entry
764 struct elf_link_hash_entry elf
;
766 /* Track dynamic relocs copied for this symbol. */
767 struct elf_dyn_relocs
*dyn_relocs
;
769 #define GOT_UNKNOWN 0
773 #define GOT_TLS_GDESC 4
774 #define GOT_TLS_GD_BOTH_P(type) \
775 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
776 #define GOT_TLS_GD_P(type) \
777 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
778 #define GOT_TLS_GDESC_P(type) \
779 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
780 #define GOT_TLS_GD_ANY_P(type) \
781 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
782 unsigned char tls_type
;
784 /* TRUE if a weak symbol with a real definition needs a copy reloc.
785 When there is a weak symbol with a real definition, the processor
786 independent code will have arranged for us to see the real
787 definition first. We need to copy the needs_copy bit from the
788 real definition and check it when allowing copy reloc in PIE. */
789 unsigned int needs_copy
: 1;
791 /* TRUE if symbol has at least one BND relocation. */
792 unsigned int has_bnd_reloc
: 1;
794 /* TRUE if symbol has GOT or PLT relocations. */
795 unsigned int has_got_reloc
: 1;
797 /* TRUE if symbol has non-GOT/non-PLT relocations in text sections. */
798 unsigned int has_non_got_reloc
: 1;
800 /* 0: symbol isn't __tls_get_addr.
801 1: symbol is __tls_get_addr.
802 2: symbol is unknown. */
803 unsigned int tls_get_addr
: 2;
805 /* Reference count of C/C++ function pointer relocations in read-write
806 section which can be resolved at run-time. */
807 bfd_signed_vma func_pointer_refcount
;
809 /* Information about the GOT PLT entry. Filled when there are both
810 GOT and PLT relocations against the same function. */
811 union gotplt_union plt_got
;
813 /* Information about the second PLT entry. Filled when has_bnd_reloc is
815 union gotplt_union plt_bnd
;
817 /* Offset of the GOTPLT entry reserved for the TLS descriptor,
818 starting at the end of the jump table. */
822 #define elf_x86_64_hash_entry(ent) \
823 ((struct elf_x86_64_link_hash_entry *)(ent))
825 struct elf_x86_64_obj_tdata
827 struct elf_obj_tdata root
;
829 /* tls_type for each local got entry. */
830 char *local_got_tls_type
;
832 /* GOTPLT entries for TLS descriptors. */
833 bfd_vma
*local_tlsdesc_gotent
;
836 #define elf_x86_64_tdata(abfd) \
837 ((struct elf_x86_64_obj_tdata *) (abfd)->tdata.any)
839 #define elf_x86_64_local_got_tls_type(abfd) \
840 (elf_x86_64_tdata (abfd)->local_got_tls_type)
842 #define elf_x86_64_local_tlsdesc_gotent(abfd) \
843 (elf_x86_64_tdata (abfd)->local_tlsdesc_gotent)
845 #define is_x86_64_elf(bfd) \
846 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
847 && elf_tdata (bfd) != NULL \
848 && elf_object_id (bfd) == X86_64_ELF_DATA)
851 elf_x86_64_mkobject (bfd
*abfd
)
853 return bfd_elf_allocate_object (abfd
, sizeof (struct elf_x86_64_obj_tdata
),
857 /* x86-64 ELF linker hash table. */
859 struct elf_x86_64_link_hash_table
861 struct elf_link_hash_table elf
;
863 /* Short-cuts to get to dynamic linker sections. */
865 asection
*plt_eh_frame
;
871 bfd_signed_vma refcount
;
875 /* The amount of space used by the jump slots in the GOT. */
876 bfd_vma sgotplt_jump_table_size
;
878 /* Small local sym cache. */
879 struct sym_cache sym_cache
;
881 bfd_vma (*r_info
) (bfd_vma
, bfd_vma
);
882 bfd_vma (*r_sym
) (bfd_vma
);
883 unsigned int pointer_r_type
;
884 const char *dynamic_interpreter
;
885 int dynamic_interpreter_size
;
887 /* _TLS_MODULE_BASE_ symbol. */
888 struct bfd_link_hash_entry
*tls_module_base
;
890 /* Used by local STT_GNU_IFUNC symbols. */
891 htab_t loc_hash_table
;
892 void * loc_hash_memory
;
894 /* The offset into splt of the PLT entry for the TLS descriptor
895 resolver. Special values are 0, if not necessary (or not found
896 to be necessary yet), and -1 if needed but not determined
899 /* The offset into sgot of the GOT entry used by the PLT entry
903 /* The index of the next R_X86_64_JUMP_SLOT entry in .rela.plt. */
904 bfd_vma next_jump_slot_index
;
905 /* The index of the next R_X86_64_IRELATIVE entry in .rela.plt. */
906 bfd_vma next_irelative_index
;
908 /* TRUE if there are dynamic relocs against IFUNC symbols that apply
909 to read-only sections. */
910 bfd_boolean readonly_dynrelocs_against_ifunc
;
913 /* Get the x86-64 ELF linker hash table from a link_info structure. */
915 #define elf_x86_64_hash_table(p) \
916 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
917 == X86_64_ELF_DATA ? ((struct elf_x86_64_link_hash_table *) ((p)->hash)) : NULL)
919 #define elf_x86_64_compute_jump_table_size(htab) \
920 ((htab)->elf.srelplt->reloc_count * GOT_ENTRY_SIZE)
922 /* Create an entry in an x86-64 ELF linker hash table. */
924 static struct bfd_hash_entry
*
925 elf_x86_64_link_hash_newfunc (struct bfd_hash_entry
*entry
,
926 struct bfd_hash_table
*table
,
929 /* Allocate the structure if it has not already been allocated by a
933 entry
= (struct bfd_hash_entry
*)
934 bfd_hash_allocate (table
,
935 sizeof (struct elf_x86_64_link_hash_entry
));
940 /* Call the allocation method of the superclass. */
941 entry
= _bfd_elf_link_hash_newfunc (entry
, table
, string
);
944 struct elf_x86_64_link_hash_entry
*eh
;
946 eh
= (struct elf_x86_64_link_hash_entry
*) entry
;
947 eh
->dyn_relocs
= NULL
;
948 eh
->tls_type
= GOT_UNKNOWN
;
950 eh
->has_bnd_reloc
= 0;
951 eh
->has_got_reloc
= 0;
952 eh
->has_non_got_reloc
= 0;
953 eh
->tls_get_addr
= 2;
954 eh
->func_pointer_refcount
= 0;
955 eh
->plt_bnd
.offset
= (bfd_vma
) -1;
956 eh
->plt_got
.offset
= (bfd_vma
) -1;
957 eh
->tlsdesc_got
= (bfd_vma
) -1;
963 /* Compute a hash of a local hash entry. We use elf_link_hash_entry
964 for local symbol so that we can handle local STT_GNU_IFUNC symbols
965 as global symbol. We reuse indx and dynstr_index for local symbol
966 hash since they aren't used by global symbols in this backend. */
969 elf_x86_64_local_htab_hash (const void *ptr
)
971 struct elf_link_hash_entry
*h
972 = (struct elf_link_hash_entry
*) ptr
;
973 return ELF_LOCAL_SYMBOL_HASH (h
->indx
, h
->dynstr_index
);
976 /* Compare local hash entries. */
979 elf_x86_64_local_htab_eq (const void *ptr1
, const void *ptr2
)
981 struct elf_link_hash_entry
*h1
982 = (struct elf_link_hash_entry
*) ptr1
;
983 struct elf_link_hash_entry
*h2
984 = (struct elf_link_hash_entry
*) ptr2
;
986 return h1
->indx
== h2
->indx
&& h1
->dynstr_index
== h2
->dynstr_index
;
989 /* Find and/or create a hash entry for local symbol. */
991 static struct elf_link_hash_entry
*
992 elf_x86_64_get_local_sym_hash (struct elf_x86_64_link_hash_table
*htab
,
993 bfd
*abfd
, const Elf_Internal_Rela
*rel
,
996 struct elf_x86_64_link_hash_entry e
, *ret
;
997 asection
*sec
= abfd
->sections
;
998 hashval_t h
= ELF_LOCAL_SYMBOL_HASH (sec
->id
,
999 htab
->r_sym (rel
->r_info
));
1002 e
.elf
.indx
= sec
->id
;
1003 e
.elf
.dynstr_index
= htab
->r_sym (rel
->r_info
);
1004 slot
= htab_find_slot_with_hash (htab
->loc_hash_table
, &e
, h
,
1005 create
? INSERT
: NO_INSERT
);
1012 ret
= (struct elf_x86_64_link_hash_entry
*) *slot
;
1016 ret
= (struct elf_x86_64_link_hash_entry
*)
1017 objalloc_alloc ((struct objalloc
*) htab
->loc_hash_memory
,
1018 sizeof (struct elf_x86_64_link_hash_entry
));
1021 memset (ret
, 0, sizeof (*ret
));
1022 ret
->elf
.indx
= sec
->id
;
1023 ret
->elf
.dynstr_index
= htab
->r_sym (rel
->r_info
);
1024 ret
->elf
.dynindx
= -1;
1025 ret
->func_pointer_refcount
= 0;
1026 ret
->plt_got
.offset
= (bfd_vma
) -1;
1032 /* Destroy an X86-64 ELF linker hash table. */
1035 elf_x86_64_link_hash_table_free (bfd
*obfd
)
1037 struct elf_x86_64_link_hash_table
*htab
1038 = (struct elf_x86_64_link_hash_table
*) obfd
->link
.hash
;
1040 if (htab
->loc_hash_table
)
1041 htab_delete (htab
->loc_hash_table
);
1042 if (htab
->loc_hash_memory
)
1043 objalloc_free ((struct objalloc
*) htab
->loc_hash_memory
);
1044 _bfd_elf_link_hash_table_free (obfd
);
1047 /* Create an X86-64 ELF linker hash table. */
1049 static struct bfd_link_hash_table
*
1050 elf_x86_64_link_hash_table_create (bfd
*abfd
)
1052 struct elf_x86_64_link_hash_table
*ret
;
1053 bfd_size_type amt
= sizeof (struct elf_x86_64_link_hash_table
);
1055 ret
= (struct elf_x86_64_link_hash_table
*) bfd_zmalloc (amt
);
1059 if (!_bfd_elf_link_hash_table_init (&ret
->elf
, abfd
,
1060 elf_x86_64_link_hash_newfunc
,
1061 sizeof (struct elf_x86_64_link_hash_entry
),
1068 if (ABI_64_P (abfd
))
1070 ret
->r_info
= elf64_r_info
;
1071 ret
->r_sym
= elf64_r_sym
;
1072 ret
->pointer_r_type
= R_X86_64_64
;
1073 ret
->dynamic_interpreter
= ELF64_DYNAMIC_INTERPRETER
;
1074 ret
->dynamic_interpreter_size
= sizeof ELF64_DYNAMIC_INTERPRETER
;
1078 ret
->r_info
= elf32_r_info
;
1079 ret
->r_sym
= elf32_r_sym
;
1080 ret
->pointer_r_type
= R_X86_64_32
;
1081 ret
->dynamic_interpreter
= ELF32_DYNAMIC_INTERPRETER
;
1082 ret
->dynamic_interpreter_size
= sizeof ELF32_DYNAMIC_INTERPRETER
;
1085 ret
->loc_hash_table
= htab_try_create (1024,
1086 elf_x86_64_local_htab_hash
,
1087 elf_x86_64_local_htab_eq
,
1089 ret
->loc_hash_memory
= objalloc_create ();
1090 if (!ret
->loc_hash_table
|| !ret
->loc_hash_memory
)
1092 elf_x86_64_link_hash_table_free (abfd
);
1095 ret
->elf
.root
.hash_table_free
= elf_x86_64_link_hash_table_free
;
1097 return &ret
->elf
.root
;
1100 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
1101 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
1105 elf_x86_64_create_dynamic_sections (bfd
*dynobj
,
1106 struct bfd_link_info
*info
)
1108 struct elf_x86_64_link_hash_table
*htab
;
1110 if (!_bfd_elf_create_dynamic_sections (dynobj
, info
))
1113 htab
= elf_x86_64_hash_table (info
);
1117 /* Set the contents of the .interp section to the interpreter. */
1118 if (bfd_link_executable (info
) && !info
->nointerp
)
1120 asection
*s
= bfd_get_linker_section (dynobj
, ".interp");
1123 s
->size
= htab
->dynamic_interpreter_size
;
1124 s
->contents
= (unsigned char *) htab
->dynamic_interpreter
;
1128 if (!info
->no_ld_generated_unwind_info
1129 && htab
->plt_eh_frame
== NULL
1130 && htab
->elf
.splt
!= NULL
)
1132 flagword flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
1133 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
1134 | SEC_LINKER_CREATED
);
1136 = bfd_make_section_anyway_with_flags (dynobj
, ".eh_frame", flags
);
1137 if (htab
->plt_eh_frame
== NULL
1138 || !bfd_set_section_alignment (dynobj
, htab
->plt_eh_frame
, 3))
1142 /* Align .got section to its entry size. */
1143 if (htab
->elf
.sgot
!= NULL
1144 && !bfd_set_section_alignment (dynobj
, htab
->elf
.sgot
, 3))
1147 /* Align .got.plt section to its entry size. */
1148 if (htab
->elf
.sgotplt
!= NULL
1149 && !bfd_set_section_alignment (dynobj
, htab
->elf
.sgotplt
, 3))
1155 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1158 elf_x86_64_copy_indirect_symbol (struct bfd_link_info
*info
,
1159 struct elf_link_hash_entry
*dir
,
1160 struct elf_link_hash_entry
*ind
)
1162 struct elf_x86_64_link_hash_entry
*edir
, *eind
;
1164 edir
= (struct elf_x86_64_link_hash_entry
*) dir
;
1165 eind
= (struct elf_x86_64_link_hash_entry
*) ind
;
1167 edir
->has_bnd_reloc
|= eind
->has_bnd_reloc
;
1168 edir
->has_got_reloc
|= eind
->has_got_reloc
;
1169 edir
->has_non_got_reloc
|= eind
->has_non_got_reloc
;
1171 if (eind
->dyn_relocs
!= NULL
)
1173 if (edir
->dyn_relocs
!= NULL
)
1175 struct elf_dyn_relocs
**pp
;
1176 struct elf_dyn_relocs
*p
;
1178 /* Add reloc counts against the indirect sym to the direct sym
1179 list. Merge any entries against the same section. */
1180 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
; )
1182 struct elf_dyn_relocs
*q
;
1184 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
1185 if (q
->sec
== p
->sec
)
1187 q
->pc_count
+= p
->pc_count
;
1188 q
->count
+= p
->count
;
1195 *pp
= edir
->dyn_relocs
;
1198 edir
->dyn_relocs
= eind
->dyn_relocs
;
1199 eind
->dyn_relocs
= NULL
;
1202 if (ind
->root
.type
== bfd_link_hash_indirect
1203 && dir
->got
.refcount
<= 0)
1205 edir
->tls_type
= eind
->tls_type
;
1206 eind
->tls_type
= GOT_UNKNOWN
;
1209 if (ELIMINATE_COPY_RELOCS
1210 && ind
->root
.type
!= bfd_link_hash_indirect
1211 && dir
->dynamic_adjusted
)
1213 /* If called to transfer flags for a weakdef during processing
1214 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1215 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1216 if (dir
->versioned
!= versioned_hidden
)
1217 dir
->ref_dynamic
|= ind
->ref_dynamic
;
1218 dir
->ref_regular
|= ind
->ref_regular
;
1219 dir
->ref_regular_nonweak
|= ind
->ref_regular_nonweak
;
1220 dir
->needs_plt
|= ind
->needs_plt
;
1221 dir
->pointer_equality_needed
|= ind
->pointer_equality_needed
;
1225 if (eind
->func_pointer_refcount
> 0)
1227 edir
->func_pointer_refcount
+= eind
->func_pointer_refcount
;
1228 eind
->func_pointer_refcount
= 0;
1231 _bfd_elf_link_hash_copy_indirect (info
, dir
, ind
);
1236 elf64_x86_64_elf_object_p (bfd
*abfd
)
1238 /* Set the right machine number for an x86-64 elf64 file. */
1239 bfd_default_set_arch_mach (abfd
, bfd_arch_i386
, bfd_mach_x86_64
);
1244 elf32_x86_64_elf_object_p (bfd
*abfd
)
1246 /* Set the right machine number for an x86-64 elf32 file. */
1247 bfd_default_set_arch_mach (abfd
, bfd_arch_i386
, bfd_mach_x64_32
);
1251 /* Return TRUE if the TLS access code sequence support transition
1255 elf_x86_64_check_tls_transition (bfd
*abfd
,
1256 struct bfd_link_info
*info
,
1259 Elf_Internal_Shdr
*symtab_hdr
,
1260 struct elf_link_hash_entry
**sym_hashes
,
1261 unsigned int r_type
,
1262 const Elf_Internal_Rela
*rel
,
1263 const Elf_Internal_Rela
*relend
)
1266 unsigned long r_symndx
;
1267 bfd_boolean largepic
= FALSE
;
1268 struct elf_link_hash_entry
*h
;
1270 struct elf_x86_64_link_hash_table
*htab
;
1272 bfd_boolean indirect_call
, tls_get_addr
;
1274 htab
= elf_x86_64_hash_table (info
);
1275 offset
= rel
->r_offset
;
1278 case R_X86_64_TLSGD
:
1279 case R_X86_64_TLSLD
:
1280 if ((rel
+ 1) >= relend
)
1283 if (r_type
== R_X86_64_TLSGD
)
1285 /* Check transition from GD access model. For 64bit, only
1286 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
1287 .word 0x6666; rex64; call __tls_get_addr@PLT
1289 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
1291 call *__tls_get_addr@GOTPCREL(%rip)
1292 which may be converted to
1293 addr32 call __tls_get_addr
1294 can transit to different access model. For 32bit, only
1295 leaq foo@tlsgd(%rip), %rdi
1296 .word 0x6666; rex64; call __tls_get_addr@PLT
1298 leaq foo@tlsgd(%rip), %rdi
1300 call *__tls_get_addr@GOTPCREL(%rip)
1301 which may be converted to
1302 addr32 call __tls_get_addr
1303 can transit to different access model. For largepic,
1305 leaq foo@tlsgd(%rip), %rdi
1306 movabsq $__tls_get_addr@pltoff, %rax
1310 leaq foo@tlsgd(%rip), %rdi
1311 movabsq $__tls_get_addr@pltoff, %rax
1315 static const unsigned char leaq
[] = { 0x66, 0x48, 0x8d, 0x3d };
1317 if ((offset
+ 12) > sec
->size
)
1320 call
= contents
+ offset
+ 4;
1322 || !((call
[1] == 0x48
1330 && call
[3] == 0xe8)))
1332 if (!ABI_64_P (abfd
)
1333 || (offset
+ 19) > sec
->size
1335 || memcmp (call
- 7, leaq
+ 1, 3) != 0
1336 || memcmp (call
, "\x48\xb8", 2) != 0
1340 || !((call
[10] == 0x48 && call
[12] == 0xd8)
1341 || (call
[10] == 0x4c && call
[12] == 0xf8)))
1345 else if (ABI_64_P (abfd
))
1348 || memcmp (contents
+ offset
- 4, leaq
, 4) != 0)
1354 || memcmp (contents
+ offset
- 3, leaq
+ 1, 3) != 0)
1357 indirect_call
= call
[2] == 0xff;
1361 /* Check transition from LD access model. Only
1362 leaq foo@tlsld(%rip), %rdi;
1363 call __tls_get_addr@PLT
1365 leaq foo@tlsld(%rip), %rdi;
1366 call *__tls_get_addr@GOTPCREL(%rip)
1367 which may be converted to
1368 addr32 call __tls_get_addr
1369 can transit to different access model. For largepic
1371 leaq foo@tlsld(%rip), %rdi
1372 movabsq $__tls_get_addr@pltoff, %rax
1376 leaq foo@tlsld(%rip), %rdi
1377 movabsq $__tls_get_addr@pltoff, %rax
1381 static const unsigned char lea
[] = { 0x48, 0x8d, 0x3d };
1383 if (offset
< 3 || (offset
+ 9) > sec
->size
)
1386 if (memcmp (contents
+ offset
- 3, lea
, 3) != 0)
1389 call
= contents
+ offset
+ 4;
1390 if (!(call
[0] == 0xe8
1391 || (call
[0] == 0xff && call
[1] == 0x15)
1392 || (call
[0] == 0x67 && call
[1] == 0xe8)))
1394 if (!ABI_64_P (abfd
)
1395 || (offset
+ 19) > sec
->size
1396 || memcmp (call
, "\x48\xb8", 2) != 0
1400 || !((call
[10] == 0x48 && call
[12] == 0xd8)
1401 || (call
[10] == 0x4c && call
[12] == 0xf8)))
1405 indirect_call
= call
[0] == 0xff;
1408 r_symndx
= htab
->r_sym (rel
[1].r_info
);
1409 if (r_symndx
< symtab_hdr
->sh_info
)
1412 tls_get_addr
= FALSE
;
1413 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1414 if (h
!= NULL
&& h
->root
.root
.string
!= NULL
)
1416 struct elf_x86_64_link_hash_entry
*eh
1417 = (struct elf_x86_64_link_hash_entry
*) h
;
1418 tls_get_addr
= eh
->tls_get_addr
== 1;
1419 if (eh
->tls_get_addr
> 1)
1421 /* Use strncmp to check __tls_get_addr since
1422 __tls_get_addr may be versioned. */
1423 if (strncmp (h
->root
.root
.string
, "__tls_get_addr", 14)
1426 eh
->tls_get_addr
= 1;
1427 tls_get_addr
= TRUE
;
1430 eh
->tls_get_addr
= 0;
1437 return ELF32_R_TYPE (rel
[1].r_info
) == R_X86_64_PLTOFF64
;
1438 else if (indirect_call
)
1439 return ELF32_R_TYPE (rel
[1].r_info
) == R_X86_64_GOTPCRELX
;
1441 return (ELF32_R_TYPE (rel
[1].r_info
) == R_X86_64_PC32
1442 || ELF32_R_TYPE (rel
[1].r_info
) == R_X86_64_PLT32
);
1444 case R_X86_64_GOTTPOFF
:
1445 /* Check transition from IE access model:
1446 mov foo@gottpoff(%rip), %reg
1447 add foo@gottpoff(%rip), %reg
1450 /* Check REX prefix first. */
1451 if (offset
>= 3 && (offset
+ 4) <= sec
->size
)
1453 val
= bfd_get_8 (abfd
, contents
+ offset
- 3);
1454 if (val
!= 0x48 && val
!= 0x4c)
1456 /* X32 may have 0x44 REX prefix or no REX prefix. */
1457 if (ABI_64_P (abfd
))
1463 /* X32 may not have any REX prefix. */
1464 if (ABI_64_P (abfd
))
1466 if (offset
< 2 || (offset
+ 3) > sec
->size
)
1470 val
= bfd_get_8 (abfd
, contents
+ offset
- 2);
1471 if (val
!= 0x8b && val
!= 0x03)
1474 val
= bfd_get_8 (abfd
, contents
+ offset
- 1);
1475 return (val
& 0xc7) == 5;
1477 case R_X86_64_GOTPC32_TLSDESC
:
1478 /* Check transition from GDesc access model:
1479 leaq x@tlsdesc(%rip), %rax
1481 Make sure it's a leaq adding rip to a 32-bit offset
1482 into any register, although it's probably almost always
1485 if (offset
< 3 || (offset
+ 4) > sec
->size
)
1488 val
= bfd_get_8 (abfd
, contents
+ offset
- 3);
1489 if ((val
& 0xfb) != 0x48)
1492 if (bfd_get_8 (abfd
, contents
+ offset
- 2) != 0x8d)
1495 val
= bfd_get_8 (abfd
, contents
+ offset
- 1);
1496 return (val
& 0xc7) == 0x05;
1498 case R_X86_64_TLSDESC_CALL
:
1499 /* Check transition from GDesc access model:
1500 call *x@tlsdesc(%rax)
1502 if (offset
+ 2 <= sec
->size
)
1504 /* Make sure that it's a call *x@tlsdesc(%rax). */
1505 call
= contents
+ offset
;
1506 return call
[0] == 0xff && call
[1] == 0x10;
1516 /* Return TRUE if the TLS access transition is OK or no transition
1517 will be performed. Update R_TYPE if there is a transition. */
1520 elf_x86_64_tls_transition (struct bfd_link_info
*info
, bfd
*abfd
,
1521 asection
*sec
, bfd_byte
*contents
,
1522 Elf_Internal_Shdr
*symtab_hdr
,
1523 struct elf_link_hash_entry
**sym_hashes
,
1524 unsigned int *r_type
, int tls_type
,
1525 const Elf_Internal_Rela
*rel
,
1526 const Elf_Internal_Rela
*relend
,
1527 struct elf_link_hash_entry
*h
,
1528 unsigned long r_symndx
,
1529 bfd_boolean from_relocate_section
)
1531 unsigned int from_type
= *r_type
;
1532 unsigned int to_type
= from_type
;
1533 bfd_boolean check
= TRUE
;
1535 /* Skip TLS transition for functions. */
1537 && (h
->type
== STT_FUNC
1538 || h
->type
== STT_GNU_IFUNC
))
1543 case R_X86_64_TLSGD
:
1544 case R_X86_64_GOTPC32_TLSDESC
:
1545 case R_X86_64_TLSDESC_CALL
:
1546 case R_X86_64_GOTTPOFF
:
1547 if (bfd_link_executable (info
))
1550 to_type
= R_X86_64_TPOFF32
;
1552 to_type
= R_X86_64_GOTTPOFF
;
1555 /* When we are called from elf_x86_64_relocate_section, there may
1556 be additional transitions based on TLS_TYPE. */
1557 if (from_relocate_section
)
1559 unsigned int new_to_type
= to_type
;
1561 if (bfd_link_executable (info
)
1564 && tls_type
== GOT_TLS_IE
)
1565 new_to_type
= R_X86_64_TPOFF32
;
1567 if (to_type
== R_X86_64_TLSGD
1568 || to_type
== R_X86_64_GOTPC32_TLSDESC
1569 || to_type
== R_X86_64_TLSDESC_CALL
)
1571 if (tls_type
== GOT_TLS_IE
)
1572 new_to_type
= R_X86_64_GOTTPOFF
;
1575 /* We checked the transition before when we were called from
1576 elf_x86_64_check_relocs. We only want to check the new
1577 transition which hasn't been checked before. */
1578 check
= new_to_type
!= to_type
&& from_type
== to_type
;
1579 to_type
= new_to_type
;
1584 case R_X86_64_TLSLD
:
1585 if (bfd_link_executable (info
))
1586 to_type
= R_X86_64_TPOFF32
;
1593 /* Return TRUE if there is no transition. */
1594 if (from_type
== to_type
)
1597 /* Check if the transition can be performed. */
1599 && ! elf_x86_64_check_tls_transition (abfd
, info
, sec
, contents
,
1600 symtab_hdr
, sym_hashes
,
1601 from_type
, rel
, relend
))
1603 reloc_howto_type
*from
, *to
;
1606 from
= elf_x86_64_rtype_to_howto (abfd
, from_type
);
1607 to
= elf_x86_64_rtype_to_howto (abfd
, to_type
);
1610 name
= h
->root
.root
.string
;
1613 struct elf_x86_64_link_hash_table
*htab
;
1615 htab
= elf_x86_64_hash_table (info
);
1620 Elf_Internal_Sym
*isym
;
1622 isym
= bfd_sym_from_r_symndx (&htab
->sym_cache
,
1624 name
= bfd_elf_sym_name (abfd
, symtab_hdr
, isym
, NULL
);
1629 /* xgettext:c-format */
1630 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1631 "in section `%A' failed"),
1632 abfd
, sec
, from
->name
, to
->name
, name
,
1633 (unsigned long) rel
->r_offset
);
1634 bfd_set_error (bfd_error_bad_value
);
1642 /* Rename some of the generic section flags to better document how they
1644 #define need_convert_load sec_flg0
1645 #define check_relocs_failed sec_flg1
1648 elf_x86_64_need_pic (bfd
*input_bfd
, asection
*sec
,
1649 struct elf_link_hash_entry
*h
,
1650 Elf_Internal_Shdr
*symtab_hdr
,
1651 Elf_Internal_Sym
*isym
,
1652 reloc_howto_type
*howto
)
1655 const char *und
= "";
1656 const char *pic
= "";
1661 name
= h
->root
.root
.string
;
1662 switch (ELF_ST_VISIBILITY (h
->other
))
1665 v
= _("hidden symbol ");
1668 v
= _("internal symbol ");
1671 v
= _("protected symbol ");
1675 pic
= _("; recompile with -fPIC");
1679 if (!h
->def_regular
&& !h
->def_dynamic
)
1680 und
= _("undefined ");
1684 name
= bfd_elf_sym_name (input_bfd
, symtab_hdr
, isym
, NULL
);
1685 pic
= _("; recompile with -fPIC");
1688 /* xgettext:c-format */
1689 _bfd_error_handler (_("%B: relocation %s against %s%s`%s' can "
1690 "not be used when making a shared object%s"),
1691 input_bfd
, howto
->name
, und
, v
, name
, pic
);
1692 bfd_set_error (bfd_error_bad_value
);
1693 sec
->check_relocs_failed
= 1;
1697 /* With the local symbol, foo, we convert
1698 mov foo@GOTPCREL(%rip), %reg
1702 call/jmp *foo@GOTPCREL(%rip)
1704 nop call foo/jmp foo nop
1705 When PIC is false, convert
1706 test %reg, foo@GOTPCREL(%rip)
1710 binop foo@GOTPCREL(%rip), %reg
1713 where binop is one of adc, add, and, cmp, or, sbb, sub, xor
1717 elf_x86_64_convert_load_reloc (bfd
*abfd
, asection
*sec
,
1719 Elf_Internal_Rela
*irel
,
1720 struct elf_link_hash_entry
*h
,
1721 bfd_boolean
*converted
,
1722 struct bfd_link_info
*link_info
)
1724 struct elf_x86_64_link_hash_table
*htab
;
1726 bfd_boolean require_reloc_pc32
;
1728 bfd_boolean to_reloc_pc32
;
1731 bfd_signed_vma raddend
;
1732 unsigned int opcode
;
1734 unsigned int r_type
= ELF32_R_TYPE (irel
->r_info
);
1735 unsigned int r_symndx
;
1737 bfd_vma roff
= irel
->r_offset
;
1739 if (roff
< (r_type
== R_X86_64_REX_GOTPCRELX
? 3 : 2))
1742 raddend
= irel
->r_addend
;
1743 /* Addend for 32-bit PC-relative relocation must be -4. */
1747 htab
= elf_x86_64_hash_table (link_info
);
1748 is_pic
= bfd_link_pic (link_info
);
1750 relocx
= (r_type
== R_X86_64_GOTPCRELX
1751 || r_type
== R_X86_64_REX_GOTPCRELX
);
1753 /* TRUE if we can convert only to R_X86_64_PC32. Enable it for
1756 = link_info
->disable_target_specific_optimizations
> 1;
1758 r_symndx
= htab
->r_sym (irel
->r_info
);
1760 opcode
= bfd_get_8 (abfd
, contents
+ roff
- 2);
1762 /* Convert mov to lea since it has been done for a while. */
1765 /* Only convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX
1766 for call, jmp or one of adc, add, and, cmp, or, sbb, sub,
1767 test, xor instructions. */
1772 /* We convert only to R_X86_64_PC32:
1774 2. R_X86_64_GOTPCREL since we can't modify REX byte.
1775 3. require_reloc_pc32 is true.
1778 to_reloc_pc32
= (opcode
== 0xff
1780 || require_reloc_pc32
1783 /* Get the symbol referred to by the reloc. */
1786 Elf_Internal_Sym
*isym
1787 = bfd_sym_from_r_symndx (&htab
->sym_cache
, abfd
, r_symndx
);
1789 /* Skip relocation against undefined symbols. */
1790 if (isym
->st_shndx
== SHN_UNDEF
)
1793 symtype
= ELF_ST_TYPE (isym
->st_info
);
1795 if (isym
->st_shndx
== SHN_ABS
)
1796 tsec
= bfd_abs_section_ptr
;
1797 else if (isym
->st_shndx
== SHN_COMMON
)
1798 tsec
= bfd_com_section_ptr
;
1799 else if (isym
->st_shndx
== SHN_X86_64_LCOMMON
)
1800 tsec
= &_bfd_elf_large_com_section
;
1802 tsec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1804 toff
= isym
->st_value
;
1808 /* Undefined weak symbol is only bound locally in executable
1809 and its reference is resolved as 0 without relocation
1810 overflow. We can only perform this optimization for
1811 GOTPCRELX relocations since we need to modify REX byte.
1812 It is OK convert mov with R_X86_64_GOTPCREL to
1814 if ((relocx
|| opcode
== 0x8b)
1815 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (link_info
,
1817 elf_x86_64_hash_entry (h
)))
1821 /* Skip for branch instructions since R_X86_64_PC32
1823 if (require_reloc_pc32
)
1828 /* For non-branch instructions, we can convert to
1829 R_X86_64_32/R_X86_64_32S since we know if there
1831 to_reloc_pc32
= FALSE
;
1834 /* Since we don't know the current PC when PIC is true,
1835 we can't convert to R_X86_64_PC32. */
1836 if (to_reloc_pc32
&& is_pic
)
1841 /* Avoid optimizing GOTPCREL relocations againt _DYNAMIC since
1842 ld.so may use its link-time address. */
1843 else if ((h
->def_regular
1844 || h
->root
.type
== bfd_link_hash_defined
1845 || h
->root
.type
== bfd_link_hash_defweak
)
1846 && h
!= htab
->elf
.hdynamic
1847 && SYMBOL_REFERENCES_LOCAL (link_info
, h
))
1849 /* bfd_link_hash_new or bfd_link_hash_undefined is
1850 set by an assignment in a linker script in
1851 bfd_elf_record_link_assignment. */
1853 && (h
->root
.type
== bfd_link_hash_new
1854 || h
->root
.type
== bfd_link_hash_undefined
1855 || ((h
->root
.type
== bfd_link_hash_defined
1856 || h
->root
.type
== bfd_link_hash_defweak
)
1857 && h
->root
.u
.def
.section
== bfd_und_section_ptr
)))
1859 /* Skip since R_X86_64_32/R_X86_64_32S may overflow. */
1860 if (require_reloc_pc32
)
1864 tsec
= h
->root
.u
.def
.section
;
1865 toff
= h
->root
.u
.def
.value
;
1872 /* Don't convert GOTPCREL relocation against large section. */
1873 if (elf_section_data (tsec
) != NULL
1874 && (elf_section_flags (tsec
) & SHF_X86_64_LARGE
) != 0)
1877 /* We can only estimate relocation overflow for R_X86_64_PC32. */
1881 if (tsec
->sec_info_type
== SEC_INFO_TYPE_MERGE
)
1883 /* At this stage in linking, no SEC_MERGE symbol has been
1884 adjusted, so all references to such symbols need to be
1885 passed through _bfd_merged_section_offset. (Later, in
1886 relocate_section, all SEC_MERGE symbols *except* for
1887 section symbols have been adjusted.)
1889 gas may reduce relocations against symbols in SEC_MERGE
1890 sections to a relocation against the section symbol when
1891 the original addend was zero. When the reloc is against
1892 a section symbol we should include the addend in the
1893 offset passed to _bfd_merged_section_offset, since the
1894 location of interest is the original symbol. On the
1895 other hand, an access to "sym+addend" where "sym" is not
1896 a section symbol should not include the addend; Such an
1897 access is presumed to be an offset from "sym"; The
1898 location of interest is just "sym". */
1899 if (symtype
== STT_SECTION
)
1902 toff
= _bfd_merged_section_offset (abfd
, &tsec
,
1903 elf_section_data (tsec
)->sec_info
,
1906 if (symtype
!= STT_SECTION
)
1912 /* Don't convert if R_X86_64_PC32 relocation overflows. */
1913 if (tsec
->output_section
== sec
->output_section
)
1915 if ((toff
- roff
+ 0x80000000) > 0xffffffff)
1920 bfd_signed_vma distance
;
1922 /* At this point, we don't know the load addresses of TSEC
1923 section nor SEC section. We estimate the distrance between
1924 SEC and TSEC. We store the estimated distances in the
1925 compressed_size field of the output section, which is only
1926 used to decompress the compressed input section. */
1927 if (sec
->output_section
->compressed_size
== 0)
1930 bfd_size_type size
= 0;
1931 for (asect
= link_info
->output_bfd
->sections
;
1933 asect
= asect
->next
)
1934 /* Skip debug sections since compressed_size is used to
1935 compress debug sections. */
1936 if ((asect
->flags
& SEC_DEBUGGING
) == 0)
1939 for (i
= asect
->map_head
.s
;
1943 size
= align_power (size
, i
->alignment_power
);
1946 asect
->compressed_size
= size
;
1950 /* Don't convert GOTPCREL relocations if TSEC isn't placed
1952 distance
= (tsec
->output_section
->compressed_size
1953 - sec
->output_section
->compressed_size
);
1957 /* Take PT_GNU_RELRO segment into account by adding
1959 if ((toff
+ distance
+ get_elf_backend_data (abfd
)->maxpagesize
1960 - roff
+ 0x80000000) > 0xffffffff)
1967 /* We have "call/jmp *foo@GOTPCREL(%rip)". */
1972 /* Convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX to
1974 modrm
= bfd_get_8 (abfd
, contents
+ roff
- 1);
1977 /* Convert to "jmp foo nop". */
1980 nop_offset
= irel
->r_offset
+ 3;
1981 disp
= bfd_get_32 (abfd
, contents
+ irel
->r_offset
);
1982 irel
->r_offset
-= 1;
1983 bfd_put_32 (abfd
, disp
, contents
+ irel
->r_offset
);
1987 struct elf_x86_64_link_hash_entry
*eh
1988 = (struct elf_x86_64_link_hash_entry
*) h
;
1990 /* Convert to "nop call foo". ADDR_PREFIX_OPCODE
1993 /* To support TLS optimization, always use addr32 prefix for
1994 "call *__tls_get_addr@GOTPCREL(%rip)". */
1995 if (eh
&& eh
->tls_get_addr
== 1)
1998 nop_offset
= irel
->r_offset
- 2;
2002 nop
= link_info
->call_nop_byte
;
2003 if (link_info
->call_nop_as_suffix
)
2005 nop_offset
= irel
->r_offset
+ 3;
2006 disp
= bfd_get_32 (abfd
, contents
+ irel
->r_offset
);
2007 irel
->r_offset
-= 1;
2008 bfd_put_32 (abfd
, disp
, contents
+ irel
->r_offset
);
2011 nop_offset
= irel
->r_offset
- 2;
2014 bfd_put_8 (abfd
, nop
, contents
+ nop_offset
);
2015 bfd_put_8 (abfd
, modrm
, contents
+ irel
->r_offset
- 1);
2016 r_type
= R_X86_64_PC32
;
2021 unsigned int rex_mask
= REX_R
;
2023 if (r_type
== R_X86_64_REX_GOTPCRELX
)
2024 rex
= bfd_get_8 (abfd
, contents
+ roff
- 3);
2032 /* Convert "mov foo@GOTPCREL(%rip), %reg" to
2033 "lea foo(%rip), %reg". */
2035 r_type
= R_X86_64_PC32
;
2039 /* Convert "mov foo@GOTPCREL(%rip), %reg" to
2040 "mov $foo, %reg". */
2042 modrm
= bfd_get_8 (abfd
, contents
+ roff
- 1);
2043 modrm
= 0xc0 | (modrm
& 0x38) >> 3;
2044 if ((rex
& REX_W
) != 0
2045 && ABI_64_P (link_info
->output_bfd
))
2047 /* Keep the REX_W bit in REX byte for LP64. */
2048 r_type
= R_X86_64_32S
;
2049 goto rewrite_modrm_rex
;
2053 /* If the REX_W bit in REX byte isn't needed,
2054 use R_X86_64_32 and clear the W bit to avoid
2055 sign-extend imm32 to imm64. */
2056 r_type
= R_X86_64_32
;
2057 /* Clear the W bit in REX byte. */
2059 goto rewrite_modrm_rex
;
2065 /* R_X86_64_PC32 isn't supported. */
2069 modrm
= bfd_get_8 (abfd
, contents
+ roff
- 1);
2072 /* Convert "test %reg, foo@GOTPCREL(%rip)" to
2073 "test $foo, %reg". */
2074 modrm
= 0xc0 | (modrm
& 0x38) >> 3;
2079 /* Convert "binop foo@GOTPCREL(%rip), %reg" to
2080 "binop $foo, %reg". */
2081 modrm
= 0xc0 | (modrm
& 0x38) >> 3 | (opcode
& 0x3c);
2085 /* Use R_X86_64_32 with 32-bit operand to avoid relocation
2086 overflow when sign-extending imm32 to imm64. */
2087 r_type
= (rex
& REX_W
) != 0 ? R_X86_64_32S
: R_X86_64_32
;
2090 bfd_put_8 (abfd
, modrm
, contents
+ roff
- 1);
2094 /* Move the R bit to the B bit in REX byte. */
2095 rex
= (rex
& ~rex_mask
) | (rex
& REX_R
) >> 2;
2096 bfd_put_8 (abfd
, rex
, contents
+ roff
- 3);
2099 /* No addend for R_X86_64_32/R_X86_64_32S relocations. */
2103 bfd_put_8 (abfd
, opcode
, contents
+ roff
- 2);
2106 irel
->r_info
= htab
->r_info (r_symndx
, r_type
);
2113 /* Look through the relocs for a section during the first phase, and
2114 calculate needed space in the global offset table, procedure
2115 linkage table, and dynamic reloc sections. */
2118 elf_x86_64_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
,
2120 const Elf_Internal_Rela
*relocs
)
2122 struct elf_x86_64_link_hash_table
*htab
;
2123 Elf_Internal_Shdr
*symtab_hdr
;
2124 struct elf_link_hash_entry
**sym_hashes
;
2125 const Elf_Internal_Rela
*rel
;
2126 const Elf_Internal_Rela
*rel_end
;
2129 bfd_boolean use_plt_got
;
2131 if (bfd_link_relocatable (info
))
2134 /* Don't do anything special with non-loaded, non-alloced sections.
2135 In particular, any relocs in such sections should not affect GOT
2136 and PLT reference counting (ie. we don't allow them to create GOT
2137 or PLT entries), there's no possibility or desire to optimize TLS
2138 relocs, and there's not much point in propagating relocs to shared
2139 libs that the dynamic linker won't relocate. */
2140 if ((sec
->flags
& SEC_ALLOC
) == 0)
2143 BFD_ASSERT (is_x86_64_elf (abfd
));
2145 htab
= elf_x86_64_hash_table (info
);
2148 sec
->check_relocs_failed
= 1;
2152 /* Get the section contents. */
2153 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
2154 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2155 else if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
2157 sec
->check_relocs_failed
= 1;
2161 use_plt_got
= get_elf_x86_64_backend_data (abfd
) == &elf_x86_64_arch_bed
;
2163 symtab_hdr
= &elf_symtab_hdr (abfd
);
2164 sym_hashes
= elf_sym_hashes (abfd
);
2168 rel_end
= relocs
+ sec
->reloc_count
;
2169 for (rel
= relocs
; rel
< rel_end
; rel
++)
2171 unsigned int r_type
;
2172 unsigned long r_symndx
;
2173 struct elf_link_hash_entry
*h
;
2174 struct elf_x86_64_link_hash_entry
*eh
;
2175 Elf_Internal_Sym
*isym
;
2177 bfd_boolean size_reloc
;
2179 r_symndx
= htab
->r_sym (rel
->r_info
);
2180 r_type
= ELF32_R_TYPE (rel
->r_info
);
2182 if (r_symndx
>= NUM_SHDR_ENTRIES (symtab_hdr
))
2184 /* xgettext:c-format */
2185 _bfd_error_handler (_("%B: bad symbol index: %d"),
2190 if (r_symndx
< symtab_hdr
->sh_info
)
2192 /* A local symbol. */
2193 isym
= bfd_sym_from_r_symndx (&htab
->sym_cache
,
2198 /* Check relocation against local STT_GNU_IFUNC symbol. */
2199 if (ELF_ST_TYPE (isym
->st_info
) == STT_GNU_IFUNC
)
2201 h
= elf_x86_64_get_local_sym_hash (htab
, abfd
, rel
,
2206 /* Fake a STT_GNU_IFUNC symbol. */
2207 h
->type
= STT_GNU_IFUNC
;
2210 h
->forced_local
= 1;
2211 h
->root
.type
= bfd_link_hash_defined
;
2219 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
2220 while (h
->root
.type
== bfd_link_hash_indirect
2221 || h
->root
.type
== bfd_link_hash_warning
)
2222 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
2225 /* Check invalid x32 relocations. */
2226 if (!ABI_64_P (abfd
))
2232 case R_X86_64_DTPOFF64
:
2233 case R_X86_64_TPOFF64
:
2235 case R_X86_64_GOTOFF64
:
2236 case R_X86_64_GOT64
:
2237 case R_X86_64_GOTPCREL64
:
2238 case R_X86_64_GOTPC64
:
2239 case R_X86_64_GOTPLT64
:
2240 case R_X86_64_PLTOFF64
:
2243 name
= h
->root
.root
.string
;
2245 name
= bfd_elf_sym_name (abfd
, symtab_hdr
, isym
,
2248 /* xgettext:c-format */
2249 (_("%B: relocation %s against symbol `%s' isn't "
2250 "supported in x32 mode"), abfd
,
2251 x86_64_elf_howto_table
[r_type
].name
, name
);
2252 bfd_set_error (bfd_error_bad_value
);
2265 case R_X86_64_PC32_BND
:
2266 case R_X86_64_PLT32_BND
:
2268 case R_X86_64_PLT32
:
2271 /* MPX PLT is supported only if elf_x86_64_arch_bed
2272 is used in 64-bit mode. */
2275 && (get_elf_x86_64_backend_data (abfd
)
2276 == &elf_x86_64_arch_bed
))
2278 elf_x86_64_hash_entry (h
)->has_bnd_reloc
= 1;
2280 /* Create the second PLT for Intel MPX support. */
2281 if (htab
->plt_bnd
== NULL
)
2283 unsigned int plt_bnd_align
;
2284 const struct elf_backend_data
*bed
;
2286 bed
= get_elf_backend_data (info
->output_bfd
);
2287 BFD_ASSERT (sizeof (elf_x86_64_bnd_plt2_entry
) == 8
2288 && (sizeof (elf_x86_64_bnd_plt2_entry
)
2289 == sizeof (elf_x86_64_legacy_plt2_entry
)));
2292 if (htab
->elf
.dynobj
== NULL
)
2293 htab
->elf
.dynobj
= abfd
;
2295 = bfd_make_section_anyway_with_flags (htab
->elf
.dynobj
,
2297 (bed
->dynamic_sec_flags
2302 if (htab
->plt_bnd
== NULL
2303 || !bfd_set_section_alignment (htab
->elf
.dynobj
,
2313 case R_X86_64_GOTPCREL
:
2314 case R_X86_64_GOTPCRELX
:
2315 case R_X86_64_REX_GOTPCRELX
:
2316 case R_X86_64_GOTPCREL64
:
2317 if (htab
->elf
.dynobj
== NULL
)
2318 htab
->elf
.dynobj
= abfd
;
2319 /* Create the ifunc sections for static executables. */
2320 if (h
->type
== STT_GNU_IFUNC
2321 && !_bfd_elf_create_ifunc_sections (htab
->elf
.dynobj
,
2327 /* It is referenced by a non-shared object. */
2329 h
->root
.non_ir_ref
= 1;
2331 if (h
->type
== STT_GNU_IFUNC
)
2332 elf_tdata (info
->output_bfd
)->has_gnu_symbols
2333 |= elf_gnu_symbol_ifunc
;
2336 if (! elf_x86_64_tls_transition (info
, abfd
, sec
, contents
,
2337 symtab_hdr
, sym_hashes
,
2338 &r_type
, GOT_UNKNOWN
,
2339 rel
, rel_end
, h
, r_symndx
, FALSE
))
2342 eh
= (struct elf_x86_64_link_hash_entry
*) h
;
2345 case R_X86_64_TLSLD
:
2346 htab
->tls_ld_got
.refcount
+= 1;
2349 case R_X86_64_TPOFF32
:
2350 if (!bfd_link_executable (info
) && ABI_64_P (abfd
))
2351 return elf_x86_64_need_pic (abfd
, sec
, h
, symtab_hdr
, isym
,
2352 &x86_64_elf_howto_table
[r_type
]);
2354 eh
->has_got_reloc
= 1;
2357 case R_X86_64_GOTTPOFF
:
2358 if (!bfd_link_executable (info
))
2359 info
->flags
|= DF_STATIC_TLS
;
2362 case R_X86_64_GOT32
:
2363 case R_X86_64_GOTPCREL
:
2364 case R_X86_64_GOTPCRELX
:
2365 case R_X86_64_REX_GOTPCRELX
:
2366 case R_X86_64_TLSGD
:
2367 case R_X86_64_GOT64
:
2368 case R_X86_64_GOTPCREL64
:
2369 case R_X86_64_GOTPLT64
:
2370 case R_X86_64_GOTPC32_TLSDESC
:
2371 case R_X86_64_TLSDESC_CALL
:
2372 /* This symbol requires a global offset table entry. */
2374 int tls_type
, old_tls_type
;
2378 default: tls_type
= GOT_NORMAL
; break;
2379 case R_X86_64_TLSGD
: tls_type
= GOT_TLS_GD
; break;
2380 case R_X86_64_GOTTPOFF
: tls_type
= GOT_TLS_IE
; break;
2381 case R_X86_64_GOTPC32_TLSDESC
:
2382 case R_X86_64_TLSDESC_CALL
:
2383 tls_type
= GOT_TLS_GDESC
; break;
2388 h
->got
.refcount
+= 1;
2389 old_tls_type
= eh
->tls_type
;
2393 bfd_signed_vma
*local_got_refcounts
;
2395 /* This is a global offset table entry for a local symbol. */
2396 local_got_refcounts
= elf_local_got_refcounts (abfd
);
2397 if (local_got_refcounts
== NULL
)
2401 size
= symtab_hdr
->sh_info
;
2402 size
*= sizeof (bfd_signed_vma
)
2403 + sizeof (bfd_vma
) + sizeof (char);
2404 local_got_refcounts
= ((bfd_signed_vma
*)
2405 bfd_zalloc (abfd
, size
));
2406 if (local_got_refcounts
== NULL
)
2408 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
2409 elf_x86_64_local_tlsdesc_gotent (abfd
)
2410 = (bfd_vma
*) (local_got_refcounts
+ symtab_hdr
->sh_info
);
2411 elf_x86_64_local_got_tls_type (abfd
)
2412 = (char *) (local_got_refcounts
+ 2 * symtab_hdr
->sh_info
);
2414 local_got_refcounts
[r_symndx
] += 1;
2416 = elf_x86_64_local_got_tls_type (abfd
) [r_symndx
];
2419 /* If a TLS symbol is accessed using IE at least once,
2420 there is no point to use dynamic model for it. */
2421 if (old_tls_type
!= tls_type
&& old_tls_type
!= GOT_UNKNOWN
2422 && (! GOT_TLS_GD_ANY_P (old_tls_type
)
2423 || tls_type
!= GOT_TLS_IE
))
2425 if (old_tls_type
== GOT_TLS_IE
&& GOT_TLS_GD_ANY_P (tls_type
))
2426 tls_type
= old_tls_type
;
2427 else if (GOT_TLS_GD_ANY_P (old_tls_type
)
2428 && GOT_TLS_GD_ANY_P (tls_type
))
2429 tls_type
|= old_tls_type
;
2433 name
= h
->root
.root
.string
;
2435 name
= bfd_elf_sym_name (abfd
, symtab_hdr
,
2438 /* xgettext:c-format */
2439 (_("%B: '%s' accessed both as normal and thread local symbol"),
2441 bfd_set_error (bfd_error_bad_value
);
2446 if (old_tls_type
!= tls_type
)
2449 eh
->tls_type
= tls_type
;
2451 elf_x86_64_local_got_tls_type (abfd
) [r_symndx
] = tls_type
;
2456 case R_X86_64_GOTOFF64
:
2457 case R_X86_64_GOTPC32
:
2458 case R_X86_64_GOTPC64
:
2461 eh
->has_got_reloc
= 1;
2462 if (htab
->elf
.sgot
== NULL
)
2464 if (htab
->elf
.dynobj
== NULL
)
2465 htab
->elf
.dynobj
= abfd
;
2466 if (!_bfd_elf_create_got_section (htab
->elf
.dynobj
,
2472 case R_X86_64_PLT32
:
2473 case R_X86_64_PLT32_BND
:
2474 /* This symbol requires a procedure linkage table entry. We
2475 actually build the entry in adjust_dynamic_symbol,
2476 because this might be a case of linking PIC code which is
2477 never referenced by a dynamic object, in which case we
2478 don't need to generate a procedure linkage table entry
2481 /* If this is a local symbol, we resolve it directly without
2482 creating a procedure linkage table entry. */
2486 eh
->has_got_reloc
= 1;
2488 h
->plt
.refcount
+= 1;
2491 case R_X86_64_PLTOFF64
:
2492 /* This tries to form the 'address' of a function relative
2493 to GOT. For global symbols we need a PLT entry. */
2497 h
->plt
.refcount
+= 1;
2501 case R_X86_64_SIZE32
:
2502 case R_X86_64_SIZE64
:
2507 if (!ABI_64_P (abfd
))
2513 /* Check relocation overflow as these relocs may lead to
2514 run-time relocation overflow. Don't error out for
2515 sections we don't care about, such as debug sections or
2516 when relocation overflow check is disabled. */
2517 if (!info
->no_reloc_overflow_check
2518 && (bfd_link_pic (info
)
2519 || (bfd_link_executable (info
)
2523 && (sec
->flags
& SEC_READONLY
) == 0)))
2524 return elf_x86_64_need_pic (abfd
, sec
, h
, symtab_hdr
, isym
,
2525 &x86_64_elf_howto_table
[r_type
]);
2531 case R_X86_64_PC32_BND
:
2535 if (eh
!= NULL
&& (sec
->flags
& SEC_CODE
) != 0)
2536 eh
->has_non_got_reloc
= 1;
2537 /* We are called after all symbols have been resolved. Only
2538 relocation against STT_GNU_IFUNC symbol must go through
2541 && (bfd_link_executable (info
)
2542 || h
->type
== STT_GNU_IFUNC
))
2544 /* If this reloc is in a read-only section, we might
2545 need a copy reloc. We can't check reliably at this
2546 stage whether the section is read-only, as input
2547 sections have not yet been mapped to output sections.
2548 Tentatively set the flag for now, and correct in
2549 adjust_dynamic_symbol. */
2552 /* We may need a .plt entry if the symbol is a function
2553 defined in a shared lib or is a STT_GNU_IFUNC function
2554 referenced from the code or read-only section. */
2556 || (sec
->flags
& (SEC_CODE
| SEC_READONLY
)) != 0)
2557 h
->plt
.refcount
+= 1;
2559 if (r_type
== R_X86_64_PC32
)
2561 /* Since something like ".long foo - ." may be used
2562 as pointer, make sure that PLT is used if foo is
2563 a function defined in a shared library. */
2564 if ((sec
->flags
& SEC_CODE
) == 0)
2565 h
->pointer_equality_needed
= 1;
2567 else if (r_type
!= R_X86_64_PC32_BND
2568 && r_type
!= R_X86_64_PC64
)
2570 h
->pointer_equality_needed
= 1;
2571 /* At run-time, R_X86_64_64 can be resolved for both
2572 x86-64 and x32. But R_X86_64_32 and R_X86_64_32S
2573 can only be resolved for x32. */
2574 if ((sec
->flags
& SEC_READONLY
) == 0
2575 && (r_type
== R_X86_64_64
2576 || (!ABI_64_P (abfd
)
2577 && (r_type
== R_X86_64_32
2578 || r_type
== R_X86_64_32S
))))
2579 eh
->func_pointer_refcount
+= 1;
2585 /* If we are creating a shared library, and this is a reloc
2586 against a global symbol, or a non PC relative reloc
2587 against a local symbol, then we need to copy the reloc
2588 into the shared library. However, if we are linking with
2589 -Bsymbolic, we do not need to copy a reloc against a
2590 global symbol which is defined in an object we are
2591 including in the link (i.e., DEF_REGULAR is set). At
2592 this point we have not seen all the input files, so it is
2593 possible that DEF_REGULAR is not set now but will be set
2594 later (it is never cleared). In case of a weak definition,
2595 DEF_REGULAR may be cleared later by a strong definition in
2596 a shared library. We account for that possibility below by
2597 storing information in the relocs_copied field of the hash
2598 table entry. A similar situation occurs when creating
2599 shared libraries and symbol visibility changes render the
2602 If on the other hand, we are creating an executable, we
2603 may need to keep relocations for symbols satisfied by a
2604 dynamic library if we manage to avoid copy relocs for the
2607 Generate dynamic pointer relocation against STT_GNU_IFUNC
2608 symbol in the non-code section. */
2609 if ((bfd_link_pic (info
)
2610 && (! IS_X86_64_PCREL_TYPE (r_type
)
2612 && (! (bfd_link_pie (info
)
2613 || SYMBOLIC_BIND (info
, h
))
2614 || h
->root
.type
== bfd_link_hash_defweak
2615 || !h
->def_regular
))))
2617 && h
->type
== STT_GNU_IFUNC
2618 && r_type
== htab
->pointer_r_type
2619 && (sec
->flags
& SEC_CODE
) == 0)
2620 || (ELIMINATE_COPY_RELOCS
2621 && !bfd_link_pic (info
)
2623 && (h
->root
.type
== bfd_link_hash_defweak
2624 || !h
->def_regular
)))
2626 struct elf_dyn_relocs
*p
;
2627 struct elf_dyn_relocs
**head
;
2629 /* We must copy these reloc types into the output file.
2630 Create a reloc section in dynobj and make room for
2634 if (htab
->elf
.dynobj
== NULL
)
2635 htab
->elf
.dynobj
= abfd
;
2637 sreloc
= _bfd_elf_make_dynamic_reloc_section
2638 (sec
, htab
->elf
.dynobj
, ABI_64_P (abfd
) ? 3 : 2,
2639 abfd
, /*rela?*/ TRUE
);
2645 /* If this is a global symbol, we count the number of
2646 relocations we need for this symbol. */
2648 head
= &eh
->dyn_relocs
;
2651 /* Track dynamic relocs needed for local syms too.
2652 We really need local syms available to do this
2657 isym
= bfd_sym_from_r_symndx (&htab
->sym_cache
,
2662 s
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
2666 /* Beware of type punned pointers vs strict aliasing
2668 vpp
= &(elf_section_data (s
)->local_dynrel
);
2669 head
= (struct elf_dyn_relocs
**)vpp
;
2673 if (p
== NULL
|| p
->sec
!= sec
)
2675 bfd_size_type amt
= sizeof *p
;
2677 p
= ((struct elf_dyn_relocs
*)
2678 bfd_alloc (htab
->elf
.dynobj
, amt
));
2689 /* Count size relocation as PC-relative relocation. */
2690 if (IS_X86_64_PCREL_TYPE (r_type
) || size_reloc
)
2695 /* This relocation describes the C++ object vtable hierarchy.
2696 Reconstruct it for later use during GC. */
2697 case R_X86_64_GNU_VTINHERIT
:
2698 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
2702 /* This relocation describes which C++ vtable entries are actually
2703 used. Record for later use during GC. */
2704 case R_X86_64_GNU_VTENTRY
:
2705 BFD_ASSERT (h
!= NULL
);
2707 && !bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
2717 && h
->plt
.refcount
> 0
2718 && (((info
->flags
& DF_BIND_NOW
) && !h
->pointer_equality_needed
)
2719 || h
->got
.refcount
> 0)
2720 && htab
->plt_got
== NULL
)
2722 /* Create the GOT procedure linkage table. */
2723 unsigned int plt_got_align
;
2724 const struct elf_backend_data
*bed
;
2726 bed
= get_elf_backend_data (info
->output_bfd
);
2727 BFD_ASSERT (sizeof (elf_x86_64_legacy_plt2_entry
) == 8
2728 && (sizeof (elf_x86_64_bnd_plt2_entry
)
2729 == sizeof (elf_x86_64_legacy_plt2_entry
)));
2732 if (htab
->elf
.dynobj
== NULL
)
2733 htab
->elf
.dynobj
= abfd
;
2735 = bfd_make_section_anyway_with_flags (htab
->elf
.dynobj
,
2737 (bed
->dynamic_sec_flags
2742 if (htab
->plt_got
== NULL
2743 || !bfd_set_section_alignment (htab
->elf
.dynobj
,
2749 if ((r_type
== R_X86_64_GOTPCREL
2750 || r_type
== R_X86_64_GOTPCRELX
2751 || r_type
== R_X86_64_REX_GOTPCRELX
)
2752 && (h
== NULL
|| h
->type
!= STT_GNU_IFUNC
))
2753 sec
->need_convert_load
= 1;
2756 if (elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2758 if (!info
->keep_memory
)
2762 /* Cache the section contents for elf_link_input_bfd. */
2763 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2770 if (elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2772 sec
->check_relocs_failed
= 1;
2776 /* Return the section that should be marked against GC for a given
2780 elf_x86_64_gc_mark_hook (asection
*sec
,
2781 struct bfd_link_info
*info
,
2782 Elf_Internal_Rela
*rel
,
2783 struct elf_link_hash_entry
*h
,
2784 Elf_Internal_Sym
*sym
)
2787 switch (ELF32_R_TYPE (rel
->r_info
))
2789 case R_X86_64_GNU_VTINHERIT
:
2790 case R_X86_64_GNU_VTENTRY
:
2794 return _bfd_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
);
2797 /* Remove undefined weak symbol from the dynamic symbol table if it
2798 is resolved to 0. */
2801 elf_x86_64_fixup_symbol (struct bfd_link_info
*info
,
2802 struct elf_link_hash_entry
*h
)
2804 if (h
->dynindx
!= -1
2805 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info
,
2806 elf_x86_64_hash_entry (h
)->has_got_reloc
,
2807 elf_x86_64_hash_entry (h
)))
2810 _bfd_elf_strtab_delref (elf_hash_table (info
)->dynstr
,
2816 /* Adjust a symbol defined by a dynamic object and referenced by a
2817 regular object. The current definition is in some section of the
2818 dynamic object, but we're not including those sections. We have to
2819 change the definition to something the rest of the link can
2823 elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info
*info
,
2824 struct elf_link_hash_entry
*h
)
2826 struct elf_x86_64_link_hash_table
*htab
;
2828 struct elf_x86_64_link_hash_entry
*eh
;
2829 struct elf_dyn_relocs
*p
;
2831 /* STT_GNU_IFUNC symbol must go through PLT. */
2832 if (h
->type
== STT_GNU_IFUNC
)
2834 /* All local STT_GNU_IFUNC references must be treate as local
2835 calls via local PLT. */
2837 && SYMBOL_CALLS_LOCAL (info
, h
))
2839 bfd_size_type pc_count
= 0, count
= 0;
2840 struct elf_dyn_relocs
**pp
;
2842 eh
= (struct elf_x86_64_link_hash_entry
*) h
;
2843 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
2845 pc_count
+= p
->pc_count
;
2846 p
->count
-= p
->pc_count
;
2855 if (pc_count
|| count
)
2860 /* Increment PLT reference count only for PC-relative
2863 if (h
->plt
.refcount
<= 0)
2864 h
->plt
.refcount
= 1;
2866 h
->plt
.refcount
+= 1;
2871 if (h
->plt
.refcount
<= 0)
2873 h
->plt
.offset
= (bfd_vma
) -1;
2879 /* If this is a function, put it in the procedure linkage table. We
2880 will fill in the contents of the procedure linkage table later,
2881 when we know the address of the .got section. */
2882 if (h
->type
== STT_FUNC
2885 if (h
->plt
.refcount
<= 0
2886 || SYMBOL_CALLS_LOCAL (info
, h
)
2887 || (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
2888 && h
->root
.type
== bfd_link_hash_undefweak
))
2890 /* This case can occur if we saw a PLT32 reloc in an input
2891 file, but the symbol was never referred to by a dynamic
2892 object, or if all references were garbage collected. In
2893 such a case, we don't actually need to build a procedure
2894 linkage table, and we can just do a PC32 reloc instead. */
2895 h
->plt
.offset
= (bfd_vma
) -1;
2902 /* It's possible that we incorrectly decided a .plt reloc was
2903 needed for an R_X86_64_PC32 reloc to a non-function sym in
2904 check_relocs. We can't decide accurately between function and
2905 non-function syms in check-relocs; Objects loaded later in
2906 the link may change h->type. So fix it now. */
2907 h
->plt
.offset
= (bfd_vma
) -1;
2909 /* If this is a weak symbol, and there is a real definition, the
2910 processor independent code will have arranged for us to see the
2911 real definition first, and we can just use the same value. */
2912 if (h
->u
.weakdef
!= NULL
)
2914 BFD_ASSERT (h
->u
.weakdef
->root
.type
== bfd_link_hash_defined
2915 || h
->u
.weakdef
->root
.type
== bfd_link_hash_defweak
);
2916 h
->root
.u
.def
.section
= h
->u
.weakdef
->root
.u
.def
.section
;
2917 h
->root
.u
.def
.value
= h
->u
.weakdef
->root
.u
.def
.value
;
2918 if (ELIMINATE_COPY_RELOCS
|| info
->nocopyreloc
)
2920 eh
= (struct elf_x86_64_link_hash_entry
*) h
;
2921 h
->non_got_ref
= h
->u
.weakdef
->non_got_ref
;
2922 eh
->needs_copy
= h
->u
.weakdef
->needs_copy
;
2927 /* This is a reference to a symbol defined by a dynamic object which
2928 is not a function. */
2930 /* If we are creating a shared library, we must presume that the
2931 only references to the symbol are via the global offset table.
2932 For such cases we need not do anything here; the relocations will
2933 be handled correctly by relocate_section. */
2934 if (!bfd_link_executable (info
))
2937 /* If there are no references to this symbol that do not use the
2938 GOT, we don't need to generate a copy reloc. */
2939 if (!h
->non_got_ref
)
2942 /* If -z nocopyreloc was given, we won't generate them either. */
2943 if (info
->nocopyreloc
)
2949 if (ELIMINATE_COPY_RELOCS
)
2951 eh
= (struct elf_x86_64_link_hash_entry
*) h
;
2952 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
2954 s
= p
->sec
->output_section
;
2955 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
2959 /* If we didn't find any dynamic relocs in read-only sections, then
2960 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
2968 /* We must allocate the symbol in our .dynbss section, which will
2969 become part of the .bss section of the executable. There will be
2970 an entry for this symbol in the .dynsym section. The dynamic
2971 object will contain position independent code, so all references
2972 from the dynamic object to this symbol will go through the global
2973 offset table. The dynamic linker will use the .dynsym entry to
2974 determine the address it must put in the global offset table, so
2975 both the dynamic object and the regular object will refer to the
2976 same memory location for the variable. */
2978 htab
= elf_x86_64_hash_table (info
);
2982 /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
2983 to copy the initial value out of the dynamic object and into the
2984 runtime process image. */
2985 if ((h
->root
.u
.def
.section
->flags
& SEC_READONLY
) != 0)
2987 s
= htab
->elf
.sdynrelro
;
2988 srel
= htab
->elf
.sreldynrelro
;
2992 s
= htab
->elf
.sdynbss
;
2993 srel
= htab
->elf
.srelbss
;
2995 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0 && h
->size
!= 0)
2997 const struct elf_backend_data
*bed
;
2998 bed
= get_elf_backend_data (info
->output_bfd
);
2999 srel
->size
+= bed
->s
->sizeof_rela
;
3003 return _bfd_elf_adjust_dynamic_copy (info
, h
, s
);
3006 /* Allocate space in .plt, .got and associated reloc sections for
3010 elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry
*h
, void * inf
)
3012 struct bfd_link_info
*info
;
3013 struct elf_x86_64_link_hash_table
*htab
;
3014 struct elf_x86_64_link_hash_entry
*eh
;
3015 struct elf_dyn_relocs
*p
;
3016 const struct elf_backend_data
*bed
;
3017 unsigned int plt_entry_size
;
3018 bfd_boolean resolved_to_zero
;
3020 if (h
->root
.type
== bfd_link_hash_indirect
)
3023 eh
= (struct elf_x86_64_link_hash_entry
*) h
;
3025 info
= (struct bfd_link_info
*) inf
;
3026 htab
= elf_x86_64_hash_table (info
);
3029 bed
= get_elf_backend_data (info
->output_bfd
);
3030 plt_entry_size
= GET_PLT_ENTRY_SIZE (info
->output_bfd
);
3032 resolved_to_zero
= UNDEFINED_WEAK_RESOLVED_TO_ZERO (info
,
3036 /* We can't use the GOT PLT if pointer equality is needed since
3037 finish_dynamic_symbol won't clear symbol value and the dynamic
3038 linker won't update the GOT slot. We will get into an infinite
3039 loop at run-time. */
3040 if (htab
->plt_got
!= NULL
3041 && h
->type
!= STT_GNU_IFUNC
3042 && !h
->pointer_equality_needed
3043 && h
->plt
.refcount
> 0
3044 && h
->got
.refcount
> 0)
3046 /* Don't use the regular PLT if there are both GOT and GOTPLT
3048 h
->plt
.offset
= (bfd_vma
) -1;
3050 /* Use the GOT PLT. */
3051 eh
->plt_got
.refcount
= 1;
3054 /* Clear the reference count of function pointer relocations if
3055 symbol isn't a normal function. */
3056 if (h
->type
!= STT_FUNC
)
3057 eh
->func_pointer_refcount
= 0;
3059 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
3060 here if it is defined and referenced in a non-shared object. */
3061 if (h
->type
== STT_GNU_IFUNC
3064 if (_bfd_elf_allocate_ifunc_dyn_relocs (info
, h
,
3066 &htab
->readonly_dynrelocs_against_ifunc
,
3069 GOT_ENTRY_SIZE
, TRUE
))
3071 asection
*s
= htab
->plt_bnd
;
3072 if (h
->plt
.offset
!= (bfd_vma
) -1 && s
!= NULL
)
3074 /* Use the .plt.bnd section if it is created. */
3075 eh
->plt_bnd
.offset
= s
->size
;
3077 /* Make room for this entry in the .plt.bnd section. */
3078 s
->size
+= sizeof (elf_x86_64_legacy_plt2_entry
);
3086 /* Don't create the PLT entry if there are only function pointer
3087 relocations which can be resolved at run-time. */
3088 else if (htab
->elf
.dynamic_sections_created
3089 && (h
->plt
.refcount
> eh
->func_pointer_refcount
3090 || eh
->plt_got
.refcount
> 0))
3092 bfd_boolean use_plt_got
;
3094 /* Clear the reference count of function pointer relocations
3096 eh
->func_pointer_refcount
= 0;
3098 if ((info
->flags
& DF_BIND_NOW
) && !h
->pointer_equality_needed
)
3100 /* Don't use the regular PLT for DF_BIND_NOW. */
3101 h
->plt
.offset
= (bfd_vma
) -1;
3103 /* Use the GOT PLT. */
3104 h
->got
.refcount
= 1;
3105 eh
->plt_got
.refcount
= 1;
3108 use_plt_got
= eh
->plt_got
.refcount
> 0;
3110 /* Make sure this symbol is output as a dynamic symbol.
3111 Undefined weak syms won't yet be marked as dynamic. */
3112 if (h
->dynindx
== -1
3114 && !resolved_to_zero
)
3116 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
3120 if (bfd_link_pic (info
)
3121 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h
))
3123 asection
*s
= htab
->elf
.splt
;
3124 asection
*bnd_s
= htab
->plt_bnd
;
3125 asection
*got_s
= htab
->plt_got
;
3127 /* If this is the first .plt entry, make room for the special
3128 first entry. The .plt section is used by prelink to undo
3129 prelinking for dynamic relocations. */
3131 s
->size
= plt_entry_size
;
3134 eh
->plt_got
.offset
= got_s
->size
;
3137 h
->plt
.offset
= s
->size
;
3139 eh
->plt_bnd
.offset
= bnd_s
->size
;
3142 /* If this symbol is not defined in a regular file, and we are
3143 not generating a shared library, then set the symbol to this
3144 location in the .plt. This is required to make function
3145 pointers compare as equal between the normal executable and
3146 the shared library. */
3147 if (! bfd_link_pic (info
)
3152 /* We need to make a call to the entry of the GOT PLT
3153 instead of regular PLT entry. */
3154 h
->root
.u
.def
.section
= got_s
;
3155 h
->root
.u
.def
.value
= eh
->plt_got
.offset
;
3161 /* We need to make a call to the entry of the second
3162 PLT instead of regular PLT entry. */
3163 h
->root
.u
.def
.section
= bnd_s
;
3164 h
->root
.u
.def
.value
= eh
->plt_bnd
.offset
;
3168 h
->root
.u
.def
.section
= s
;
3169 h
->root
.u
.def
.value
= h
->plt
.offset
;
3174 /* Make room for this entry. */
3176 got_s
->size
+= sizeof (elf_x86_64_legacy_plt2_entry
);
3179 s
->size
+= plt_entry_size
;
3181 bnd_s
->size
+= sizeof (elf_x86_64_legacy_plt2_entry
);
3183 /* We also need to make an entry in the .got.plt section,
3184 which will be placed in the .got section by the linker
3186 htab
->elf
.sgotplt
->size
+= GOT_ENTRY_SIZE
;
3188 /* There should be no PLT relocation against resolved
3189 undefined weak symbol in executable. */
3190 if (!resolved_to_zero
)
3192 /* We also need to make an entry in the .rela.plt
3194 htab
->elf
.srelplt
->size
+= bed
->s
->sizeof_rela
;
3195 htab
->elf
.srelplt
->reloc_count
++;
3201 eh
->plt_got
.offset
= (bfd_vma
) -1;
3202 h
->plt
.offset
= (bfd_vma
) -1;
3208 eh
->plt_got
.offset
= (bfd_vma
) -1;
3209 h
->plt
.offset
= (bfd_vma
) -1;
3213 eh
->tlsdesc_got
= (bfd_vma
) -1;
3215 /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
3216 make it a R_X86_64_TPOFF32 requiring no GOT entry. */
3217 if (h
->got
.refcount
> 0
3218 && bfd_link_executable (info
)
3220 && elf_x86_64_hash_entry (h
)->tls_type
== GOT_TLS_IE
)
3222 h
->got
.offset
= (bfd_vma
) -1;
3224 else if (h
->got
.refcount
> 0)
3228 int tls_type
= elf_x86_64_hash_entry (h
)->tls_type
;
3230 /* Make sure this symbol is output as a dynamic symbol.
3231 Undefined weak syms won't yet be marked as dynamic. */
3232 if (h
->dynindx
== -1
3234 && !resolved_to_zero
)
3236 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
3240 if (GOT_TLS_GDESC_P (tls_type
))
3242 eh
->tlsdesc_got
= htab
->elf
.sgotplt
->size
3243 - elf_x86_64_compute_jump_table_size (htab
);
3244 htab
->elf
.sgotplt
->size
+= 2 * GOT_ENTRY_SIZE
;
3245 h
->got
.offset
= (bfd_vma
) -2;
3247 if (! GOT_TLS_GDESC_P (tls_type
)
3248 || GOT_TLS_GD_P (tls_type
))
3251 h
->got
.offset
= s
->size
;
3252 s
->size
+= GOT_ENTRY_SIZE
;
3253 if (GOT_TLS_GD_P (tls_type
))
3254 s
->size
+= GOT_ENTRY_SIZE
;
3256 dyn
= htab
->elf
.dynamic_sections_created
;
3257 /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
3258 and two if global. R_X86_64_GOTTPOFF needs one dynamic
3259 relocation. No dynamic relocation against resolved undefined
3260 weak symbol in executable. */
3261 if ((GOT_TLS_GD_P (tls_type
) && h
->dynindx
== -1)
3262 || tls_type
== GOT_TLS_IE
)
3263 htab
->elf
.srelgot
->size
+= bed
->s
->sizeof_rela
;
3264 else if (GOT_TLS_GD_P (tls_type
))
3265 htab
->elf
.srelgot
->size
+= 2 * bed
->s
->sizeof_rela
;
3266 else if (! GOT_TLS_GDESC_P (tls_type
)
3267 && ((ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
3268 && !resolved_to_zero
)
3269 || h
->root
.type
!= bfd_link_hash_undefweak
)
3270 && (bfd_link_pic (info
)
3271 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, 0, h
)))
3272 htab
->elf
.srelgot
->size
+= bed
->s
->sizeof_rela
;
3273 if (GOT_TLS_GDESC_P (tls_type
))
3275 htab
->elf
.srelplt
->size
+= bed
->s
->sizeof_rela
;
3276 htab
->tlsdesc_plt
= (bfd_vma
) -1;
3280 h
->got
.offset
= (bfd_vma
) -1;
3282 if (eh
->dyn_relocs
== NULL
)
3285 /* In the shared -Bsymbolic case, discard space allocated for
3286 dynamic pc-relative relocs against symbols which turn out to be
3287 defined in regular objects. For the normal shared case, discard
3288 space for pc-relative relocs that have become local due to symbol
3289 visibility changes. */
3291 if (bfd_link_pic (info
))
3293 /* Relocs that use pc_count are those that appear on a call
3294 insn, or certain REL relocs that can generated via assembly.
3295 We want calls to protected symbols to resolve directly to the
3296 function rather than going via the plt. If people want
3297 function pointer comparisons to work as expected then they
3298 should avoid writing weird assembly. */
3299 if (SYMBOL_CALLS_LOCAL (info
, h
))
3301 struct elf_dyn_relocs
**pp
;
3303 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
3305 p
->count
-= p
->pc_count
;
3314 /* Also discard relocs on undefined weak syms with non-default
3315 visibility or in PIE. */
3316 if (eh
->dyn_relocs
!= NULL
)
3318 if (h
->root
.type
== bfd_link_hash_undefweak
)
3320 /* Undefined weak symbol is never bound locally in shared
3322 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
3323 || resolved_to_zero
)
3324 eh
->dyn_relocs
= NULL
;
3325 else if (h
->dynindx
== -1
3326 && ! h
->forced_local
3327 && ! bfd_elf_link_record_dynamic_symbol (info
, h
))
3330 /* For PIE, discard space for pc-relative relocs against
3331 symbols which turn out to need copy relocs. */
3332 else if (bfd_link_executable (info
)
3333 && (h
->needs_copy
|| eh
->needs_copy
)
3337 struct elf_dyn_relocs
**pp
;
3339 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
3341 if (p
->pc_count
!= 0)
3349 else if (ELIMINATE_COPY_RELOCS
)
3351 /* For the non-shared case, discard space for relocs against
3352 symbols which turn out to need copy relocs or are not
3353 dynamic. Keep dynamic relocations for run-time function
3354 pointer initialization. */
3356 if ((!h
->non_got_ref
3357 || eh
->func_pointer_refcount
> 0
3358 || (h
->root
.type
== bfd_link_hash_undefweak
3359 && !resolved_to_zero
))
3362 || (htab
->elf
.dynamic_sections_created
3363 && (h
->root
.type
== bfd_link_hash_undefweak
3364 || h
->root
.type
== bfd_link_hash_undefined
))))
3366 /* Make sure this symbol is output as a dynamic symbol.
3367 Undefined weak syms won't yet be marked as dynamic. */
3368 if (h
->dynindx
== -1
3369 && ! h
->forced_local
3370 && ! resolved_to_zero
3371 && ! bfd_elf_link_record_dynamic_symbol (info
, h
))
3374 /* If that succeeded, we know we'll be keeping all the
3376 if (h
->dynindx
!= -1)
3380 eh
->dyn_relocs
= NULL
;
3381 eh
->func_pointer_refcount
= 0;
3386 /* Finally, allocate space. */
3387 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
3391 sreloc
= elf_section_data (p
->sec
)->sreloc
;
3393 BFD_ASSERT (sreloc
!= NULL
);
3395 sreloc
->size
+= p
->count
* bed
->s
->sizeof_rela
;
3401 /* Allocate space in .plt, .got and associated reloc sections for
3402 local dynamic relocs. */
3405 elf_x86_64_allocate_local_dynrelocs (void **slot
, void *inf
)
3407 struct elf_link_hash_entry
*h
3408 = (struct elf_link_hash_entry
*) *slot
;
3410 if (h
->type
!= STT_GNU_IFUNC
3414 || h
->root
.type
!= bfd_link_hash_defined
)
3417 return elf_x86_64_allocate_dynrelocs (h
, inf
);
3420 /* Find any dynamic relocs that apply to read-only sections. */
3423 elf_x86_64_readonly_dynrelocs (struct elf_link_hash_entry
*h
,
3426 struct elf_x86_64_link_hash_entry
*eh
;
3427 struct elf_dyn_relocs
*p
;
3429 /* Skip local IFUNC symbols. */
3430 if (h
->forced_local
&& h
->type
== STT_GNU_IFUNC
)
3433 eh
= (struct elf_x86_64_link_hash_entry
*) h
;
3434 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
3436 asection
*s
= p
->sec
->output_section
;
3438 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
3440 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
3442 info
->flags
|= DF_TEXTREL
;
3444 if ((info
->warn_shared_textrel
&& bfd_link_pic (info
))
3445 || info
->error_textrel
)
3446 /* xgettext:c-format */
3447 info
->callbacks
->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
3448 p
->sec
->owner
, h
->root
.root
.string
,
3451 /* Not an error, just cut short the traversal. */
3458 /* Convert load via the GOT slot to load immediate. */
3461 elf_x86_64_convert_load (bfd
*abfd
, asection
*sec
,
3462 struct bfd_link_info
*link_info
)
3464 Elf_Internal_Shdr
*symtab_hdr
;
3465 Elf_Internal_Rela
*internal_relocs
;
3466 Elf_Internal_Rela
*irel
, *irelend
;
3468 struct elf_x86_64_link_hash_table
*htab
;
3469 bfd_boolean changed
;
3470 bfd_signed_vma
*local_got_refcounts
;
3472 /* Don't even try to convert non-ELF outputs. */
3473 if (!is_elf_hash_table (link_info
->hash
))
3476 /* Nothing to do if there is no need or no output. */
3477 if ((sec
->flags
& (SEC_CODE
| SEC_RELOC
)) != (SEC_CODE
| SEC_RELOC
)
3478 || sec
->need_convert_load
== 0
3479 || bfd_is_abs_section (sec
->output_section
))
3482 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
3484 /* Load the relocations for this section. */
3485 internal_relocs
= (_bfd_elf_link_read_relocs
3486 (abfd
, sec
, NULL
, (Elf_Internal_Rela
*) NULL
,
3487 link_info
->keep_memory
));
3488 if (internal_relocs
== NULL
)
3492 htab
= elf_x86_64_hash_table (link_info
);
3493 local_got_refcounts
= elf_local_got_refcounts (abfd
);
3495 /* Get the section contents. */
3496 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
3497 contents
= elf_section_data (sec
)->this_hdr
.contents
;
3500 if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
3504 irelend
= internal_relocs
+ sec
->reloc_count
;
3505 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
3507 unsigned int r_type
= ELF32_R_TYPE (irel
->r_info
);
3508 unsigned int r_symndx
;
3509 struct elf_link_hash_entry
*h
;
3510 bfd_boolean converted
;
3512 if (r_type
!= R_X86_64_GOTPCRELX
3513 && r_type
!= R_X86_64_REX_GOTPCRELX
3514 && r_type
!= R_X86_64_GOTPCREL
)
3517 r_symndx
= htab
->r_sym (irel
->r_info
);
3518 if (r_symndx
< symtab_hdr
->sh_info
)
3519 h
= elf_x86_64_get_local_sym_hash (htab
, sec
->owner
,
3520 (const Elf_Internal_Rela
*) irel
,
3524 h
= elf_sym_hashes (abfd
)[r_symndx
- symtab_hdr
->sh_info
];
3525 while (h
->root
.type
== bfd_link_hash_indirect
3526 || h
->root
.type
== bfd_link_hash_warning
)
3527 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
3530 /* STT_GNU_IFUNC must keep GOTPCREL relocations. */
3531 if (h
!= NULL
&& h
->type
== STT_GNU_IFUNC
)
3535 if (!elf_x86_64_convert_load_reloc (abfd
, sec
, contents
, irel
, h
,
3536 &converted
, link_info
))
3541 changed
= converted
;
3544 if (h
->got
.refcount
> 0)
3545 h
->got
.refcount
-= 1;
3549 if (local_got_refcounts
!= NULL
3550 && local_got_refcounts
[r_symndx
] > 0)
3551 local_got_refcounts
[r_symndx
] -= 1;
3556 if (contents
!= NULL
3557 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
3559 if (!changed
&& !link_info
->keep_memory
)
3563 /* Cache the section contents for elf_link_input_bfd. */
3564 elf_section_data (sec
)->this_hdr
.contents
= contents
;
3568 if (elf_section_data (sec
)->relocs
!= internal_relocs
)
3571 free (internal_relocs
);
3573 elf_section_data (sec
)->relocs
= internal_relocs
;
3579 if (contents
!= NULL
3580 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
3582 if (internal_relocs
!= NULL
3583 && elf_section_data (sec
)->relocs
!= internal_relocs
)
3584 free (internal_relocs
);
3588 /* Set the sizes of the dynamic sections. */
3591 elf_x86_64_size_dynamic_sections (bfd
*output_bfd
,
3592 struct bfd_link_info
*info
)
3594 struct elf_x86_64_link_hash_table
*htab
;
3599 const struct elf_backend_data
*bed
;
3601 htab
= elf_x86_64_hash_table (info
);
3604 bed
= get_elf_backend_data (output_bfd
);
3606 dynobj
= htab
->elf
.dynobj
;
3610 /* Set up .got offsets for local syms, and space for local dynamic
3612 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
3614 bfd_signed_vma
*local_got
;
3615 bfd_signed_vma
*end_local_got
;
3616 char *local_tls_type
;
3617 bfd_vma
*local_tlsdesc_gotent
;
3618 bfd_size_type locsymcount
;
3619 Elf_Internal_Shdr
*symtab_hdr
;
3622 if (! is_x86_64_elf (ibfd
))
3625 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
3627 struct elf_dyn_relocs
*p
;
3629 if (!elf_x86_64_convert_load (ibfd
, s
, info
))
3632 for (p
= (struct elf_dyn_relocs
*)
3633 (elf_section_data (s
)->local_dynrel
);
3637 if (!bfd_is_abs_section (p
->sec
)
3638 && bfd_is_abs_section (p
->sec
->output_section
))
3640 /* Input section has been discarded, either because
3641 it is a copy of a linkonce section or due to
3642 linker script /DISCARD/, so we'll be discarding
3645 else if (p
->count
!= 0)
3647 srel
= elf_section_data (p
->sec
)->sreloc
;
3648 srel
->size
+= p
->count
* bed
->s
->sizeof_rela
;
3649 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0
3650 && (info
->flags
& DF_TEXTREL
) == 0)
3652 info
->flags
|= DF_TEXTREL
;
3653 if ((info
->warn_shared_textrel
&& bfd_link_pic (info
))
3654 || info
->error_textrel
)
3655 /* xgettext:c-format */
3656 info
->callbacks
->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"),
3657 p
->sec
->owner
, p
->sec
);
3663 local_got
= elf_local_got_refcounts (ibfd
);
3667 symtab_hdr
= &elf_symtab_hdr (ibfd
);
3668 locsymcount
= symtab_hdr
->sh_info
;
3669 end_local_got
= local_got
+ locsymcount
;
3670 local_tls_type
= elf_x86_64_local_got_tls_type (ibfd
);
3671 local_tlsdesc_gotent
= elf_x86_64_local_tlsdesc_gotent (ibfd
);
3673 srel
= htab
->elf
.srelgot
;
3674 for (; local_got
< end_local_got
;
3675 ++local_got
, ++local_tls_type
, ++local_tlsdesc_gotent
)
3677 *local_tlsdesc_gotent
= (bfd_vma
) -1;
3680 if (GOT_TLS_GDESC_P (*local_tls_type
))
3682 *local_tlsdesc_gotent
= htab
->elf
.sgotplt
->size
3683 - elf_x86_64_compute_jump_table_size (htab
);
3684 htab
->elf
.sgotplt
->size
+= 2 * GOT_ENTRY_SIZE
;
3685 *local_got
= (bfd_vma
) -2;
3687 if (! GOT_TLS_GDESC_P (*local_tls_type
)
3688 || GOT_TLS_GD_P (*local_tls_type
))
3690 *local_got
= s
->size
;
3691 s
->size
+= GOT_ENTRY_SIZE
;
3692 if (GOT_TLS_GD_P (*local_tls_type
))
3693 s
->size
+= GOT_ENTRY_SIZE
;
3695 if (bfd_link_pic (info
)
3696 || GOT_TLS_GD_ANY_P (*local_tls_type
)
3697 || *local_tls_type
== GOT_TLS_IE
)
3699 if (GOT_TLS_GDESC_P (*local_tls_type
))
3701 htab
->elf
.srelplt
->size
3702 += bed
->s
->sizeof_rela
;
3703 htab
->tlsdesc_plt
= (bfd_vma
) -1;
3705 if (! GOT_TLS_GDESC_P (*local_tls_type
)
3706 || GOT_TLS_GD_P (*local_tls_type
))
3707 srel
->size
+= bed
->s
->sizeof_rela
;
3711 *local_got
= (bfd_vma
) -1;
3715 if (htab
->tls_ld_got
.refcount
> 0)
3717 /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
3719 htab
->tls_ld_got
.offset
= htab
->elf
.sgot
->size
;
3720 htab
->elf
.sgot
->size
+= 2 * GOT_ENTRY_SIZE
;
3721 htab
->elf
.srelgot
->size
+= bed
->s
->sizeof_rela
;
3724 htab
->tls_ld_got
.offset
= -1;
3726 /* Allocate global sym .plt and .got entries, and space for global
3727 sym dynamic relocs. */
3728 elf_link_hash_traverse (&htab
->elf
, elf_x86_64_allocate_dynrelocs
,
3731 /* Allocate .plt and .got entries, and space for local symbols. */
3732 htab_traverse (htab
->loc_hash_table
,
3733 elf_x86_64_allocate_local_dynrelocs
,
3736 /* For every jump slot reserved in the sgotplt, reloc_count is
3737 incremented. However, when we reserve space for TLS descriptors,
3738 it's not incremented, so in order to compute the space reserved
3739 for them, it suffices to multiply the reloc count by the jump
3742 PR ld/13302: We start next_irelative_index at the end of .rela.plt
3743 so that R_X86_64_IRELATIVE entries come last. */
3744 if (htab
->elf
.srelplt
)
3746 htab
->sgotplt_jump_table_size
3747 = elf_x86_64_compute_jump_table_size (htab
);
3748 htab
->next_irelative_index
= htab
->elf
.srelplt
->reloc_count
- 1;
3750 else if (htab
->elf
.irelplt
)
3751 htab
->next_irelative_index
= htab
->elf
.irelplt
->reloc_count
- 1;
3753 if (htab
->tlsdesc_plt
)
3755 /* If we're not using lazy TLS relocations, don't generate the
3756 PLT and GOT entries they require. */
3757 if ((info
->flags
& DF_BIND_NOW
))
3758 htab
->tlsdesc_plt
= 0;
3761 htab
->tlsdesc_got
= htab
->elf
.sgot
->size
;
3762 htab
->elf
.sgot
->size
+= GOT_ENTRY_SIZE
;
3763 /* Reserve room for the initial entry.
3764 FIXME: we could probably do away with it in this case. */
3765 if (htab
->elf
.splt
->size
== 0)
3766 htab
->elf
.splt
->size
+= GET_PLT_ENTRY_SIZE (output_bfd
);
3767 htab
->tlsdesc_plt
= htab
->elf
.splt
->size
;
3768 htab
->elf
.splt
->size
+= GET_PLT_ENTRY_SIZE (output_bfd
);
3772 if (htab
->elf
.sgotplt
)
3774 /* Don't allocate .got.plt section if there are no GOT nor PLT
3775 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
3776 if ((htab
->elf
.hgot
== NULL
3777 || !htab
->elf
.hgot
->ref_regular_nonweak
)
3778 && (htab
->elf
.sgotplt
->size
3779 == get_elf_backend_data (output_bfd
)->got_header_size
)
3780 && (htab
->elf
.splt
== NULL
3781 || htab
->elf
.splt
->size
== 0)
3782 && (htab
->elf
.sgot
== NULL
3783 || htab
->elf
.sgot
->size
== 0)
3784 && (htab
->elf
.iplt
== NULL
3785 || htab
->elf
.iplt
->size
== 0)
3786 && (htab
->elf
.igotplt
== NULL
3787 || htab
->elf
.igotplt
->size
== 0))
3788 htab
->elf
.sgotplt
->size
= 0;
3791 if (htab
->plt_eh_frame
!= NULL
3792 && htab
->elf
.splt
!= NULL
3793 && htab
->elf
.splt
->size
!= 0
3794 && !bfd_is_abs_section (htab
->elf
.splt
->output_section
)
3795 && _bfd_elf_eh_frame_present (info
))
3797 const struct elf_x86_64_backend_data
*arch_data
3798 = get_elf_x86_64_arch_data (bed
);
3799 htab
->plt_eh_frame
->size
= arch_data
->eh_frame_plt_size
;
3802 /* We now have determined the sizes of the various dynamic sections.
3803 Allocate memory for them. */
3805 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
3807 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
3810 if (s
== htab
->elf
.splt
3811 || s
== htab
->elf
.sgot
3812 || s
== htab
->elf
.sgotplt
3813 || s
== htab
->elf
.iplt
3814 || s
== htab
->elf
.igotplt
3815 || s
== htab
->plt_bnd
3816 || s
== htab
->plt_got
3817 || s
== htab
->plt_eh_frame
3818 || s
== htab
->elf
.sdynbss
3819 || s
== htab
->elf
.sdynrelro
)
3821 /* Strip this section if we don't need it; see the
3824 else if (CONST_STRNEQ (bfd_get_section_name (dynobj
, s
), ".rela"))
3826 if (s
->size
!= 0 && s
!= htab
->elf
.srelplt
)
3829 /* We use the reloc_count field as a counter if we need
3830 to copy relocs into the output file. */
3831 if (s
!= htab
->elf
.srelplt
)
3836 /* It's not one of our sections, so don't allocate space. */
3842 /* If we don't need this section, strip it from the
3843 output file. This is mostly to handle .rela.bss and
3844 .rela.plt. We must create both sections in
3845 create_dynamic_sections, because they must be created
3846 before the linker maps input sections to output
3847 sections. The linker does that before
3848 adjust_dynamic_symbol is called, and it is that
3849 function which decides whether anything needs to go
3850 into these sections. */
3852 s
->flags
|= SEC_EXCLUDE
;
3856 if ((s
->flags
& SEC_HAS_CONTENTS
) == 0)
3859 /* Allocate memory for the section contents. We use bfd_zalloc
3860 here in case unused entries are not reclaimed before the
3861 section's contents are written out. This should not happen,
3862 but this way if it does, we get a R_X86_64_NONE reloc instead
3864 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->size
);
3865 if (s
->contents
== NULL
)
3869 if (htab
->plt_eh_frame
!= NULL
3870 && htab
->plt_eh_frame
->contents
!= NULL
)
3872 const struct elf_x86_64_backend_data
*arch_data
3873 = get_elf_x86_64_arch_data (bed
);
3875 memcpy (htab
->plt_eh_frame
->contents
,
3876 arch_data
->eh_frame_plt
, htab
->plt_eh_frame
->size
);
3877 bfd_put_32 (dynobj
, htab
->elf
.splt
->size
,
3878 htab
->plt_eh_frame
->contents
+ PLT_FDE_LEN_OFFSET
);
3881 if (htab
->elf
.dynamic_sections_created
)
3883 /* Add some entries to the .dynamic section. We fill in the
3884 values later, in elf_x86_64_finish_dynamic_sections, but we
3885 must add the entries now so that we get the correct size for
3886 the .dynamic section. The DT_DEBUG entry is filled in by the
3887 dynamic linker and used by the debugger. */
3888 #define add_dynamic_entry(TAG, VAL) \
3889 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3891 if (bfd_link_executable (info
))
3893 if (!add_dynamic_entry (DT_DEBUG
, 0))
3897 if (htab
->elf
.splt
->size
!= 0)
3899 /* DT_PLTGOT is used by prelink even if there is no PLT
3901 if (!add_dynamic_entry (DT_PLTGOT
, 0))
3904 if (htab
->elf
.srelplt
->size
!= 0)
3906 if (!add_dynamic_entry (DT_PLTRELSZ
, 0)
3907 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
3908 || !add_dynamic_entry (DT_JMPREL
, 0))
3912 if (htab
->tlsdesc_plt
3913 && (!add_dynamic_entry (DT_TLSDESC_PLT
, 0)
3914 || !add_dynamic_entry (DT_TLSDESC_GOT
, 0)))
3920 if (!add_dynamic_entry (DT_RELA
, 0)
3921 || !add_dynamic_entry (DT_RELASZ
, 0)
3922 || !add_dynamic_entry (DT_RELAENT
, bed
->s
->sizeof_rela
))
3925 /* If any dynamic relocs apply to a read-only section,
3926 then we need a DT_TEXTREL entry. */
3927 if ((info
->flags
& DF_TEXTREL
) == 0)
3928 elf_link_hash_traverse (&htab
->elf
,
3929 elf_x86_64_readonly_dynrelocs
,
3932 if ((info
->flags
& DF_TEXTREL
) != 0)
3934 if (htab
->readonly_dynrelocs_against_ifunc
)
3936 info
->callbacks
->einfo
3937 (_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n"));
3938 bfd_set_error (bfd_error_bad_value
);
3942 if (!add_dynamic_entry (DT_TEXTREL
, 0))
3947 #undef add_dynamic_entry
3953 elf_x86_64_always_size_sections (bfd
*output_bfd
,
3954 struct bfd_link_info
*info
)
3956 asection
*tls_sec
= elf_hash_table (info
)->tls_sec
;
3960 struct elf_link_hash_entry
*tlsbase
;
3962 tlsbase
= elf_link_hash_lookup (elf_hash_table (info
),
3963 "_TLS_MODULE_BASE_",
3964 FALSE
, FALSE
, FALSE
);
3966 if (tlsbase
&& tlsbase
->type
== STT_TLS
)
3968 struct elf_x86_64_link_hash_table
*htab
;
3969 struct bfd_link_hash_entry
*bh
= NULL
;
3970 const struct elf_backend_data
*bed
3971 = get_elf_backend_data (output_bfd
);
3973 htab
= elf_x86_64_hash_table (info
);
3977 if (!(_bfd_generic_link_add_one_symbol
3978 (info
, output_bfd
, "_TLS_MODULE_BASE_", BSF_LOCAL
,
3979 tls_sec
, 0, NULL
, FALSE
,
3980 bed
->collect
, &bh
)))
3983 htab
->tls_module_base
= bh
;
3985 tlsbase
= (struct elf_link_hash_entry
*)bh
;
3986 tlsbase
->def_regular
= 1;
3987 tlsbase
->other
= STV_HIDDEN
;
3988 tlsbase
->root
.linker_def
= 1;
3989 (*bed
->elf_backend_hide_symbol
) (info
, tlsbase
, TRUE
);
3996 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3997 executables. Rather than setting it to the beginning of the TLS
3998 section, we have to set it to the end. This function may be called
3999 multiple times, it is idempotent. */
4002 elf_x86_64_set_tls_module_base (struct bfd_link_info
*info
)
4004 struct elf_x86_64_link_hash_table
*htab
;
4005 struct bfd_link_hash_entry
*base
;
4007 if (!bfd_link_executable (info
))
4010 htab
= elf_x86_64_hash_table (info
);
4014 base
= htab
->tls_module_base
;
4018 base
->u
.def
.value
= htab
->elf
.tls_size
;
4021 /* Return the base VMA address which should be subtracted from real addresses
4022 when resolving @dtpoff relocation.
4023 This is PT_TLS segment p_vaddr. */
4026 elf_x86_64_dtpoff_base (struct bfd_link_info
*info
)
4028 /* If tls_sec is NULL, we should have signalled an error already. */
4029 if (elf_hash_table (info
)->tls_sec
== NULL
)
4031 return elf_hash_table (info
)->tls_sec
->vma
;
4034 /* Return the relocation value for @tpoff relocation
4035 if STT_TLS virtual address is ADDRESS. */
4038 elf_x86_64_tpoff (struct bfd_link_info
*info
, bfd_vma address
)
4040 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
4041 const struct elf_backend_data
*bed
= get_elf_backend_data (info
->output_bfd
);
4042 bfd_vma static_tls_size
;
4044 /* If tls_segment is NULL, we should have signalled an error already. */
4045 if (htab
->tls_sec
== NULL
)
4048 /* Consider special static TLS alignment requirements. */
4049 static_tls_size
= BFD_ALIGN (htab
->tls_size
, bed
->static_tls_alignment
);
4050 return address
- static_tls_size
- htab
->tls_sec
->vma
;
4053 /* Is the instruction before OFFSET in CONTENTS a 32bit relative
4057 is_32bit_relative_branch (bfd_byte
*contents
, bfd_vma offset
)
4059 /* Opcode Instruction
4062 0x0f 0x8x conditional jump */
4064 && (contents
[offset
- 1] == 0xe8
4065 || contents
[offset
- 1] == 0xe9))
4067 && contents
[offset
- 2] == 0x0f
4068 && (contents
[offset
- 1] & 0xf0) == 0x80));
4071 /* Relocate an x86_64 ELF section. */
4074 elf_x86_64_relocate_section (bfd
*output_bfd
,
4075 struct bfd_link_info
*info
,
4077 asection
*input_section
,
4079 Elf_Internal_Rela
*relocs
,
4080 Elf_Internal_Sym
*local_syms
,
4081 asection
**local_sections
)
4083 struct elf_x86_64_link_hash_table
*htab
;
4084 Elf_Internal_Shdr
*symtab_hdr
;
4085 struct elf_link_hash_entry
**sym_hashes
;
4086 bfd_vma
*local_got_offsets
;
4087 bfd_vma
*local_tlsdesc_gotents
;
4088 Elf_Internal_Rela
*rel
;
4089 Elf_Internal_Rela
*wrel
;
4090 Elf_Internal_Rela
*relend
;
4091 const unsigned int plt_entry_size
= GET_PLT_ENTRY_SIZE (info
->output_bfd
);
4093 BFD_ASSERT (is_x86_64_elf (input_bfd
));
4095 /* Skip if check_relocs failed. */
4096 if (input_section
->check_relocs_failed
)
4099 htab
= elf_x86_64_hash_table (info
);
4102 symtab_hdr
= &elf_symtab_hdr (input_bfd
);
4103 sym_hashes
= elf_sym_hashes (input_bfd
);
4104 local_got_offsets
= elf_local_got_offsets (input_bfd
);
4105 local_tlsdesc_gotents
= elf_x86_64_local_tlsdesc_gotent (input_bfd
);
4107 elf_x86_64_set_tls_module_base (info
);
4109 rel
= wrel
= relocs
;
4110 relend
= relocs
+ input_section
->reloc_count
;
4111 for (; rel
< relend
; wrel
++, rel
++)
4113 unsigned int r_type
;
4114 reloc_howto_type
*howto
;
4115 unsigned long r_symndx
;
4116 struct elf_link_hash_entry
*h
;
4117 struct elf_x86_64_link_hash_entry
*eh
;
4118 Elf_Internal_Sym
*sym
;
4120 bfd_vma off
, offplt
, plt_offset
;
4122 bfd_boolean unresolved_reloc
;
4123 bfd_reloc_status_type r
;
4125 asection
*base_got
, *resolved_plt
;
4127 bfd_boolean resolved_to_zero
;
4129 r_type
= ELF32_R_TYPE (rel
->r_info
);
4130 if (r_type
== (int) R_X86_64_GNU_VTINHERIT
4131 || r_type
== (int) R_X86_64_GNU_VTENTRY
)
4138 if (r_type
>= (int) R_X86_64_standard
)
4141 /* xgettext:c-format */
4142 (_("%B: unrecognized relocation (0x%x) in section `%A'"),
4143 input_bfd
, input_section
, r_type
);
4144 bfd_set_error (bfd_error_bad_value
);
4148 if (r_type
!= (int) R_X86_64_32
4149 || ABI_64_P (output_bfd
))
4150 howto
= x86_64_elf_howto_table
+ r_type
;
4152 howto
= (x86_64_elf_howto_table
4153 + ARRAY_SIZE (x86_64_elf_howto_table
) - 1);
4154 r_symndx
= htab
->r_sym (rel
->r_info
);
4158 unresolved_reloc
= FALSE
;
4159 if (r_symndx
< symtab_hdr
->sh_info
)
4161 sym
= local_syms
+ r_symndx
;
4162 sec
= local_sections
[r_symndx
];
4164 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
,
4166 st_size
= sym
->st_size
;
4168 /* Relocate against local STT_GNU_IFUNC symbol. */
4169 if (!bfd_link_relocatable (info
)
4170 && ELF_ST_TYPE (sym
->st_info
) == STT_GNU_IFUNC
)
4172 h
= elf_x86_64_get_local_sym_hash (htab
, input_bfd
,
4177 /* Set STT_GNU_IFUNC symbol value. */
4178 h
->root
.u
.def
.value
= sym
->st_value
;
4179 h
->root
.u
.def
.section
= sec
;
4184 bfd_boolean warned ATTRIBUTE_UNUSED
;
4185 bfd_boolean ignored ATTRIBUTE_UNUSED
;
4187 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
4188 r_symndx
, symtab_hdr
, sym_hashes
,
4190 unresolved_reloc
, warned
, ignored
);
4194 if (sec
!= NULL
&& discarded_section (sec
))
4196 _bfd_clear_contents (howto
, input_bfd
, input_section
,
4197 contents
+ rel
->r_offset
);
4198 wrel
->r_offset
= rel
->r_offset
;
4202 /* For ld -r, remove relocations in debug sections against
4203 sections defined in discarded sections. Not done for
4204 eh_frame editing code expects to be present. */
4205 if (bfd_link_relocatable (info
)
4206 && (input_section
->flags
& SEC_DEBUGGING
))
4212 if (bfd_link_relocatable (info
))
4219 if (rel
->r_addend
== 0 && !ABI_64_P (output_bfd
))
4221 if (r_type
== R_X86_64_64
)
4223 /* For x32, treat R_X86_64_64 like R_X86_64_32 and
4224 zero-extend it to 64bit if addend is zero. */
4225 r_type
= R_X86_64_32
;
4226 memset (contents
+ rel
->r_offset
+ 4, 0, 4);
4228 else if (r_type
== R_X86_64_SIZE64
)
4230 /* For x32, treat R_X86_64_SIZE64 like R_X86_64_SIZE32 and
4231 zero-extend it to 64bit if addend is zero. */
4232 r_type
= R_X86_64_SIZE32
;
4233 memset (contents
+ rel
->r_offset
+ 4, 0, 4);
4237 eh
= (struct elf_x86_64_link_hash_entry
*) h
;
4239 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
4240 it here if it is defined in a non-shared object. */
4242 && h
->type
== STT_GNU_IFUNC
4248 if ((input_section
->flags
& SEC_ALLOC
) == 0)
4250 /* Dynamic relocs are not propagated for SEC_DEBUGGING
4251 sections because such sections are not SEC_ALLOC and
4252 thus ld.so will not process them. */
4253 if ((input_section
->flags
& SEC_DEBUGGING
) != 0)
4263 case R_X86_64_GOTPCREL
:
4264 case R_X86_64_GOTPCRELX
:
4265 case R_X86_64_REX_GOTPCRELX
:
4266 case R_X86_64_GOTPCREL64
:
4267 base_got
= htab
->elf
.sgot
;
4268 off
= h
->got
.offset
;
4270 if (base_got
== NULL
)
4273 if (off
== (bfd_vma
) -1)
4275 /* We can't use h->got.offset here to save state, or
4276 even just remember the offset, as finish_dynamic_symbol
4277 would use that as offset into .got. */
4279 if (h
->plt
.offset
== (bfd_vma
) -1)
4282 if (htab
->elf
.splt
!= NULL
)
4284 plt_index
= h
->plt
.offset
/ plt_entry_size
- 1;
4285 off
= (plt_index
+ 3) * GOT_ENTRY_SIZE
;
4286 base_got
= htab
->elf
.sgotplt
;
4290 plt_index
= h
->plt
.offset
/ plt_entry_size
;
4291 off
= plt_index
* GOT_ENTRY_SIZE
;
4292 base_got
= htab
->elf
.igotplt
;
4295 if (h
->dynindx
== -1
4299 /* This references the local defitionion. We must
4300 initialize this entry in the global offset table.
4301 Since the offset must always be a multiple of 8,
4302 we use the least significant bit to record
4303 whether we have initialized it already.
4305 When doing a dynamic link, we create a .rela.got
4306 relocation entry to initialize the value. This
4307 is done in the finish_dynamic_symbol routine. */
4312 bfd_put_64 (output_bfd
, relocation
,
4313 base_got
->contents
+ off
);
4314 /* Note that this is harmless for the GOTPLT64
4315 case, as -1 | 1 still is -1. */
4321 relocation
= (base_got
->output_section
->vma
4322 + base_got
->output_offset
+ off
);
4327 if (h
->plt
.offset
== (bfd_vma
) -1)
4329 /* Handle static pointers of STT_GNU_IFUNC symbols. */
4330 if (r_type
== htab
->pointer_r_type
4331 && (input_section
->flags
& SEC_CODE
) == 0)
4332 goto do_ifunc_pointer
;
4333 goto bad_ifunc_reloc
;
4336 /* STT_GNU_IFUNC symbol must go through PLT. */
4337 if (htab
->elf
.splt
!= NULL
)
4339 if (htab
->plt_bnd
!= NULL
)
4341 resolved_plt
= htab
->plt_bnd
;
4342 plt_offset
= eh
->plt_bnd
.offset
;
4346 resolved_plt
= htab
->elf
.splt
;
4347 plt_offset
= h
->plt
.offset
;
4352 resolved_plt
= htab
->elf
.iplt
;
4353 plt_offset
= h
->plt
.offset
;
4356 relocation
= (resolved_plt
->output_section
->vma
4357 + resolved_plt
->output_offset
+ plt_offset
);
4363 if (h
->root
.root
.string
)
4364 name
= h
->root
.root
.string
;
4366 name
= bfd_elf_sym_name (input_bfd
, symtab_hdr
, sym
,
4369 /* xgettext:c-format */
4370 (_("%B: relocation %s against STT_GNU_IFUNC "
4371 "symbol `%s' isn't supported"), input_bfd
,
4373 bfd_set_error (bfd_error_bad_value
);
4377 if (bfd_link_pic (info
))
4382 if (ABI_64_P (output_bfd
))
4387 if (rel
->r_addend
!= 0)
4389 if (h
->root
.root
.string
)
4390 name
= h
->root
.root
.string
;
4392 name
= bfd_elf_sym_name (input_bfd
, symtab_hdr
,
4395 /* xgettext:c-format */
4396 (_("%B: relocation %s against STT_GNU_IFUNC "
4397 "symbol `%s' has non-zero addend: %d"),
4398 input_bfd
, howto
->name
, name
, rel
->r_addend
);
4399 bfd_set_error (bfd_error_bad_value
);
4403 /* Generate dynamic relcoation only when there is a
4404 non-GOT reference in a shared object or there is no
4406 if ((bfd_link_pic (info
) && h
->non_got_ref
)
4407 || h
->plt
.offset
== (bfd_vma
) -1)
4409 Elf_Internal_Rela outrel
;
4412 /* Need a dynamic relocation to get the real function
4414 outrel
.r_offset
= _bfd_elf_section_offset (output_bfd
,
4418 if (outrel
.r_offset
== (bfd_vma
) -1
4419 || outrel
.r_offset
== (bfd_vma
) -2)
4422 outrel
.r_offset
+= (input_section
->output_section
->vma
4423 + input_section
->output_offset
);
4425 if (h
->dynindx
== -1
4427 || bfd_link_executable (info
))
4429 /* This symbol is resolved locally. */
4430 outrel
.r_info
= htab
->r_info (0, R_X86_64_IRELATIVE
);
4431 outrel
.r_addend
= (h
->root
.u
.def
.value
4432 + h
->root
.u
.def
.section
->output_section
->vma
4433 + h
->root
.u
.def
.section
->output_offset
);
4437 outrel
.r_info
= htab
->r_info (h
->dynindx
, r_type
);
4438 outrel
.r_addend
= 0;
4441 /* Dynamic relocations are stored in
4442 1. .rela.ifunc section in PIC object.
4443 2. .rela.got section in dynamic executable.
4444 3. .rela.iplt section in static executable. */
4445 if (bfd_link_pic (info
))
4446 sreloc
= htab
->elf
.irelifunc
;
4447 else if (htab
->elf
.splt
!= NULL
)
4448 sreloc
= htab
->elf
.srelgot
;
4450 sreloc
= htab
->elf
.irelplt
;
4451 elf_append_rela (output_bfd
, sreloc
, &outrel
);
4453 /* If this reloc is against an external symbol, we
4454 do not want to fiddle with the addend. Otherwise,
4455 we need to include the symbol value so that it
4456 becomes an addend for the dynamic reloc. For an
4457 internal symbol, we have updated addend. */
4462 case R_X86_64_PC32_BND
:
4464 case R_X86_64_PLT32
:
4465 case R_X86_64_PLT32_BND
:
4470 resolved_to_zero
= (eh
!= NULL
4471 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info
,
4475 /* When generating a shared object, the relocations handled here are
4476 copied into the output file to be resolved at run time. */
4479 case R_X86_64_GOT32
:
4480 case R_X86_64_GOT64
:
4481 /* Relocation is to the entry for this symbol in the global
4483 case R_X86_64_GOTPCREL
:
4484 case R_X86_64_GOTPCRELX
:
4485 case R_X86_64_REX_GOTPCRELX
:
4486 case R_X86_64_GOTPCREL64
:
4487 /* Use global offset table entry as symbol value. */
4488 case R_X86_64_GOTPLT64
:
4489 /* This is obsolete and treated the the same as GOT64. */
4490 base_got
= htab
->elf
.sgot
;
4492 if (htab
->elf
.sgot
== NULL
)
4499 off
= h
->got
.offset
;
4501 && h
->plt
.offset
!= (bfd_vma
)-1
4502 && off
== (bfd_vma
)-1)
4504 /* We can't use h->got.offset here to save
4505 state, or even just remember the offset, as
4506 finish_dynamic_symbol would use that as offset into
4508 bfd_vma plt_index
= h
->plt
.offset
/ plt_entry_size
- 1;
4509 off
= (plt_index
+ 3) * GOT_ENTRY_SIZE
;
4510 base_got
= htab
->elf
.sgotplt
;
4513 dyn
= htab
->elf
.dynamic_sections_created
;
4515 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, bfd_link_pic (info
), h
)
4516 || (bfd_link_pic (info
)
4517 && SYMBOL_REFERENCES_LOCAL (info
, h
))
4518 || (ELF_ST_VISIBILITY (h
->other
)
4519 && h
->root
.type
== bfd_link_hash_undefweak
))
4521 /* This is actually a static link, or it is a -Bsymbolic
4522 link and the symbol is defined locally, or the symbol
4523 was forced to be local because of a version file. We
4524 must initialize this entry in the global offset table.
4525 Since the offset must always be a multiple of 8, we
4526 use the least significant bit to record whether we
4527 have initialized it already.
4529 When doing a dynamic link, we create a .rela.got
4530 relocation entry to initialize the value. This is
4531 done in the finish_dynamic_symbol routine. */
4536 bfd_put_64 (output_bfd
, relocation
,
4537 base_got
->contents
+ off
);
4538 /* Note that this is harmless for the GOTPLT64 case,
4539 as -1 | 1 still is -1. */
4544 unresolved_reloc
= FALSE
;
4548 if (local_got_offsets
== NULL
)
4551 off
= local_got_offsets
[r_symndx
];
4553 /* The offset must always be a multiple of 8. We use
4554 the least significant bit to record whether we have
4555 already generated the necessary reloc. */
4560 bfd_put_64 (output_bfd
, relocation
,
4561 base_got
->contents
+ off
);
4563 if (bfd_link_pic (info
))
4566 Elf_Internal_Rela outrel
;
4568 /* We need to generate a R_X86_64_RELATIVE reloc
4569 for the dynamic linker. */
4570 s
= htab
->elf
.srelgot
;
4574 outrel
.r_offset
= (base_got
->output_section
->vma
4575 + base_got
->output_offset
4577 outrel
.r_info
= htab
->r_info (0, R_X86_64_RELATIVE
);
4578 outrel
.r_addend
= relocation
;
4579 elf_append_rela (output_bfd
, s
, &outrel
);
4582 local_got_offsets
[r_symndx
] |= 1;
4586 if (off
>= (bfd_vma
) -2)
4589 relocation
= base_got
->output_section
->vma
4590 + base_got
->output_offset
+ off
;
4591 if (r_type
!= R_X86_64_GOTPCREL
4592 && r_type
!= R_X86_64_GOTPCRELX
4593 && r_type
!= R_X86_64_REX_GOTPCRELX
4594 && r_type
!= R_X86_64_GOTPCREL64
)
4595 relocation
-= htab
->elf
.sgotplt
->output_section
->vma
4596 - htab
->elf
.sgotplt
->output_offset
;
4600 case R_X86_64_GOTOFF64
:
4601 /* Relocation is relative to the start of the global offset
4604 /* Check to make sure it isn't a protected function or data
4605 symbol for shared library since it may not be local when
4606 used as function address or with copy relocation. We also
4607 need to make sure that a symbol is referenced locally. */
4608 if (bfd_link_pic (info
) && h
)
4610 if (!h
->def_regular
)
4614 switch (ELF_ST_VISIBILITY (h
->other
))
4617 v
= _("hidden symbol");
4620 v
= _("internal symbol");
4623 v
= _("protected symbol");
4631 /* xgettext:c-format */
4632 (_("%B: relocation R_X86_64_GOTOFF64 against undefined %s `%s' can not be used when making a shared object"),
4633 input_bfd
, v
, h
->root
.root
.string
);
4634 bfd_set_error (bfd_error_bad_value
);
4637 else if (!bfd_link_executable (info
)
4638 && !SYMBOL_REFERENCES_LOCAL (info
, h
)
4639 && (h
->type
== STT_FUNC
4640 || h
->type
== STT_OBJECT
)
4641 && ELF_ST_VISIBILITY (h
->other
) == STV_PROTECTED
)
4644 /* xgettext:c-format */
4645 (_("%B: relocation R_X86_64_GOTOFF64 against protected %s `%s' can not be used when making a shared object"),
4647 h
->type
== STT_FUNC
? "function" : "data",
4648 h
->root
.root
.string
);
4649 bfd_set_error (bfd_error_bad_value
);
4654 /* Note that sgot is not involved in this
4655 calculation. We always want the start of .got.plt. If we
4656 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
4657 permitted by the ABI, we might have to change this
4659 relocation
-= htab
->elf
.sgotplt
->output_section
->vma
4660 + htab
->elf
.sgotplt
->output_offset
;
4663 case R_X86_64_GOTPC32
:
4664 case R_X86_64_GOTPC64
:
4665 /* Use global offset table as symbol value. */
4666 relocation
= htab
->elf
.sgotplt
->output_section
->vma
4667 + htab
->elf
.sgotplt
->output_offset
;
4668 unresolved_reloc
= FALSE
;
4671 case R_X86_64_PLTOFF64
:
4672 /* Relocation is PLT entry relative to GOT. For local
4673 symbols it's the symbol itself relative to GOT. */
4675 /* See PLT32 handling. */
4676 && (h
->plt
.offset
!= (bfd_vma
) -1
4677 || eh
->plt_got
.offset
!= (bfd_vma
) -1)
4678 && htab
->elf
.splt
!= NULL
)
4680 if (eh
->plt_got
.offset
!= (bfd_vma
) -1)
4682 /* Use the GOT PLT. */
4683 resolved_plt
= htab
->plt_got
;
4684 plt_offset
= eh
->plt_got
.offset
;
4686 else if (htab
->plt_bnd
!= NULL
)
4688 resolved_plt
= htab
->plt_bnd
;
4689 plt_offset
= eh
->plt_bnd
.offset
;
4693 resolved_plt
= htab
->elf
.splt
;
4694 plt_offset
= h
->plt
.offset
;
4697 relocation
= (resolved_plt
->output_section
->vma
4698 + resolved_plt
->output_offset
4700 unresolved_reloc
= FALSE
;
4703 relocation
-= htab
->elf
.sgotplt
->output_section
->vma
4704 + htab
->elf
.sgotplt
->output_offset
;
4707 case R_X86_64_PLT32
:
4708 case R_X86_64_PLT32_BND
:
4709 /* Relocation is to the entry for this symbol in the
4710 procedure linkage table. */
4712 /* Resolve a PLT32 reloc against a local symbol directly,
4713 without using the procedure linkage table. */
4717 if ((h
->plt
.offset
== (bfd_vma
) -1
4718 && eh
->plt_got
.offset
== (bfd_vma
) -1)
4719 || htab
->elf
.splt
== NULL
)
4721 /* We didn't make a PLT entry for this symbol. This
4722 happens when statically linking PIC code, or when
4723 using -Bsymbolic. */
4727 if (h
->plt
.offset
!= (bfd_vma
) -1)
4729 if (htab
->plt_bnd
!= NULL
)
4731 resolved_plt
= htab
->plt_bnd
;
4732 plt_offset
= eh
->plt_bnd
.offset
;
4736 resolved_plt
= htab
->elf
.splt
;
4737 plt_offset
= h
->plt
.offset
;
4742 /* Use the GOT PLT. */
4743 resolved_plt
= htab
->plt_got
;
4744 plt_offset
= eh
->plt_got
.offset
;
4747 relocation
= (resolved_plt
->output_section
->vma
4748 + resolved_plt
->output_offset
4750 unresolved_reloc
= FALSE
;
4753 case R_X86_64_SIZE32
:
4754 case R_X86_64_SIZE64
:
4755 /* Set to symbol size. */
4756 relocation
= st_size
;
4762 case R_X86_64_PC32_BND
:
4763 /* Don't complain about -fPIC if the symbol is undefined when
4764 building executable unless it is unresolved weak symbol. */
4765 if ((input_section
->flags
& SEC_ALLOC
) != 0
4766 && (input_section
->flags
& SEC_READONLY
) != 0
4768 && ((bfd_link_executable (info
)
4769 && h
->root
.type
== bfd_link_hash_undefweak
4770 && !resolved_to_zero
)
4771 || (bfd_link_pic (info
)
4772 && !(bfd_link_pie (info
)
4773 && h
->root
.type
== bfd_link_hash_undefined
))))
4775 bfd_boolean fail
= FALSE
;
4777 = ((r_type
== R_X86_64_PC32
4778 || r_type
== R_X86_64_PC32_BND
)
4779 && is_32bit_relative_branch (contents
, rel
->r_offset
));
4781 if (SYMBOL_REFERENCES_LOCAL (info
, h
))
4783 /* Symbol is referenced locally. Make sure it is
4784 defined locally or for a branch. */
4785 fail
= !h
->def_regular
&& !branch
;
4787 else if (!(bfd_link_pie (info
)
4788 && (h
->needs_copy
|| eh
->needs_copy
)))
4790 /* Symbol doesn't need copy reloc and isn't referenced
4791 locally. We only allow branch to symbol with
4792 non-default visibility. */
4794 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
);
4798 return elf_x86_64_need_pic (input_bfd
, input_section
,
4799 h
, NULL
, NULL
, howto
);
4808 /* FIXME: The ABI says the linker should make sure the value is
4809 the same when it's zeroextended to 64 bit. */
4812 if ((input_section
->flags
& SEC_ALLOC
) == 0)
4815 /* Don't copy a pc-relative relocation into the output file
4816 if the symbol needs copy reloc or the symbol is undefined
4817 when building executable. Copy dynamic function pointer
4818 relocations. Don't generate dynamic relocations against
4819 resolved undefined weak symbols in PIE. */
4820 if ((bfd_link_pic (info
)
4821 && !(bfd_link_pie (info
)
4825 || h
->root
.type
== bfd_link_hash_undefined
)
4826 && (IS_X86_64_PCREL_TYPE (r_type
)
4827 || r_type
== R_X86_64_SIZE32
4828 || r_type
== R_X86_64_SIZE64
))
4830 || ((ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
4831 && !resolved_to_zero
)
4832 || h
->root
.type
!= bfd_link_hash_undefweak
))
4833 && ((! IS_X86_64_PCREL_TYPE (r_type
)
4834 && r_type
!= R_X86_64_SIZE32
4835 && r_type
!= R_X86_64_SIZE64
)
4836 || ! SYMBOL_CALLS_LOCAL (info
, h
)))
4837 || (ELIMINATE_COPY_RELOCS
4838 && !bfd_link_pic (info
)
4842 || eh
->func_pointer_refcount
> 0
4843 || (h
->root
.type
== bfd_link_hash_undefweak
4844 && !resolved_to_zero
))
4845 && ((h
->def_dynamic
&& !h
->def_regular
)
4846 /* Undefined weak symbol is bound locally when
4848 || h
->root
.type
== bfd_link_hash_undefined
)))
4850 Elf_Internal_Rela outrel
;
4851 bfd_boolean skip
, relocate
;
4854 /* When generating a shared object, these relocations
4855 are copied into the output file to be resolved at run
4861 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
4863 if (outrel
.r_offset
== (bfd_vma
) -1)
4865 else if (outrel
.r_offset
== (bfd_vma
) -2)
4866 skip
= TRUE
, relocate
= TRUE
;
4868 outrel
.r_offset
+= (input_section
->output_section
->vma
4869 + input_section
->output_offset
);
4872 memset (&outrel
, 0, sizeof outrel
);
4874 /* h->dynindx may be -1 if this symbol was marked to
4878 && (IS_X86_64_PCREL_TYPE (r_type
)
4879 || !(bfd_link_executable (info
)
4880 || SYMBOLIC_BIND (info
, h
))
4881 || ! h
->def_regular
))
4883 outrel
.r_info
= htab
->r_info (h
->dynindx
, r_type
);
4884 outrel
.r_addend
= rel
->r_addend
;
4888 /* This symbol is local, or marked to become local.
4889 When relocation overflow check is disabled, we
4890 convert R_X86_64_32 to dynamic R_X86_64_RELATIVE. */
4891 if (r_type
== htab
->pointer_r_type
4892 || (r_type
== R_X86_64_32
4893 && info
->no_reloc_overflow_check
))
4896 outrel
.r_info
= htab
->r_info (0, R_X86_64_RELATIVE
);
4897 outrel
.r_addend
= relocation
+ rel
->r_addend
;
4899 else if (r_type
== R_X86_64_64
4900 && !ABI_64_P (output_bfd
))
4903 outrel
.r_info
= htab
->r_info (0,
4904 R_X86_64_RELATIVE64
);
4905 outrel
.r_addend
= relocation
+ rel
->r_addend
;
4906 /* Check addend overflow. */
4907 if ((outrel
.r_addend
& 0x80000000)
4908 != (rel
->r_addend
& 0x80000000))
4911 int addend
= rel
->r_addend
;
4912 if (h
&& h
->root
.root
.string
)
4913 name
= h
->root
.root
.string
;
4915 name
= bfd_elf_sym_name (input_bfd
, symtab_hdr
,
4919 /* xgettext:c-format */
4920 (_("%B: addend -0x%x in relocation %s against "
4921 "symbol `%s' at 0x%lx in section `%A' is "
4923 input_bfd
, input_section
, addend
,
4925 (unsigned long) rel
->r_offset
);
4928 /* xgettext:c-format */
4929 (_("%B: addend 0x%x in relocation %s against "
4930 "symbol `%s' at 0x%lx in section `%A' is "
4932 input_bfd
, input_section
, addend
,
4934 (unsigned long) rel
->r_offset
);
4935 bfd_set_error (bfd_error_bad_value
);
4943 if (bfd_is_abs_section (sec
))
4945 else if (sec
== NULL
|| sec
->owner
== NULL
)
4947 bfd_set_error (bfd_error_bad_value
);
4954 /* We are turning this relocation into one
4955 against a section symbol. It would be
4956 proper to subtract the symbol's value,
4957 osec->vma, from the emitted reloc addend,
4958 but ld.so expects buggy relocs. */
4959 osec
= sec
->output_section
;
4960 sindx
= elf_section_data (osec
)->dynindx
;
4963 asection
*oi
= htab
->elf
.text_index_section
;
4964 sindx
= elf_section_data (oi
)->dynindx
;
4966 BFD_ASSERT (sindx
!= 0);
4969 outrel
.r_info
= htab
->r_info (sindx
, r_type
);
4970 outrel
.r_addend
= relocation
+ rel
->r_addend
;
4974 sreloc
= elf_section_data (input_section
)->sreloc
;
4976 if (sreloc
== NULL
|| sreloc
->contents
== NULL
)
4978 r
= bfd_reloc_notsupported
;
4979 goto check_relocation_error
;
4982 elf_append_rela (output_bfd
, sreloc
, &outrel
);
4984 /* If this reloc is against an external symbol, we do
4985 not want to fiddle with the addend. Otherwise, we
4986 need to include the symbol value so that it becomes
4987 an addend for the dynamic reloc. */
4994 case R_X86_64_TLSGD
:
4995 case R_X86_64_GOTPC32_TLSDESC
:
4996 case R_X86_64_TLSDESC_CALL
:
4997 case R_X86_64_GOTTPOFF
:
4998 tls_type
= GOT_UNKNOWN
;
4999 if (h
== NULL
&& local_got_offsets
)
5000 tls_type
= elf_x86_64_local_got_tls_type (input_bfd
) [r_symndx
];
5002 tls_type
= elf_x86_64_hash_entry (h
)->tls_type
;
5004 if (! elf_x86_64_tls_transition (info
, input_bfd
,
5005 input_section
, contents
,
5006 symtab_hdr
, sym_hashes
,
5007 &r_type
, tls_type
, rel
,
5008 relend
, h
, r_symndx
, TRUE
))
5011 if (r_type
== R_X86_64_TPOFF32
)
5013 bfd_vma roff
= rel
->r_offset
;
5015 BFD_ASSERT (! unresolved_reloc
);
5017 if (ELF32_R_TYPE (rel
->r_info
) == R_X86_64_TLSGD
)
5019 /* GD->LE transition. For 64bit, change
5020 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
5021 .word 0x6666; rex64; call __tls_get_addr@PLT
5023 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
5025 call *__tls_get_addr@GOTPCREL(%rip)
5026 which may be converted to
5027 addr32 call __tls_get_addr
5030 leaq foo@tpoff(%rax), %rax
5032 leaq foo@tlsgd(%rip), %rdi
5033 .word 0x6666; rex64; call __tls_get_addr@PLT
5035 leaq foo@tlsgd(%rip), %rdi
5037 call *__tls_get_addr@GOTPCREL(%rip)
5038 which may be converted to
5039 addr32 call __tls_get_addr
5042 leaq foo@tpoff(%rax), %rax
5043 For largepic, change:
5044 leaq foo@tlsgd(%rip), %rdi
5045 movabsq $__tls_get_addr@pltoff, %rax
5050 leaq foo@tpoff(%rax), %rax
5051 nopw 0x0(%rax,%rax,1) */
5053 if (ABI_64_P (output_bfd
))
5055 if (contents
[roff
+ 5] == 0xb8)
5057 memcpy (contents
+ roff
- 3,
5058 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80"
5059 "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
5063 memcpy (contents
+ roff
- 4,
5064 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
5068 memcpy (contents
+ roff
- 3,
5069 "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
5071 bfd_put_32 (output_bfd
,
5072 elf_x86_64_tpoff (info
, relocation
),
5073 contents
+ roff
+ 8 + largepic
);
5074 /* Skip R_X86_64_PC32, R_X86_64_PLT32,
5075 R_X86_64_GOTPCRELX and R_X86_64_PLTOFF64. */
5080 else if (ELF32_R_TYPE (rel
->r_info
) == R_X86_64_GOTPC32_TLSDESC
)
5082 /* GDesc -> LE transition.
5083 It's originally something like:
5084 leaq x@tlsdesc(%rip), %rax
5087 movl $x@tpoff, %rax. */
5089 unsigned int val
, type
;
5091 type
= bfd_get_8 (input_bfd
, contents
+ roff
- 3);
5092 val
= bfd_get_8 (input_bfd
, contents
+ roff
- 1);
5093 bfd_put_8 (output_bfd
, 0x48 | ((type
>> 2) & 1),
5094 contents
+ roff
- 3);
5095 bfd_put_8 (output_bfd
, 0xc7, contents
+ roff
- 2);
5096 bfd_put_8 (output_bfd
, 0xc0 | ((val
>> 3) & 7),
5097 contents
+ roff
- 1);
5098 bfd_put_32 (output_bfd
,
5099 elf_x86_64_tpoff (info
, relocation
),
5103 else if (ELF32_R_TYPE (rel
->r_info
) == R_X86_64_TLSDESC_CALL
)
5105 /* GDesc -> LE transition.
5110 bfd_put_8 (output_bfd
, 0x66, contents
+ roff
);
5111 bfd_put_8 (output_bfd
, 0x90, contents
+ roff
+ 1);
5114 else if (ELF32_R_TYPE (rel
->r_info
) == R_X86_64_GOTTPOFF
)
5116 /* IE->LE transition:
5117 For 64bit, originally it can be one of:
5118 movq foo@gottpoff(%rip), %reg
5119 addq foo@gottpoff(%rip), %reg
5122 leaq foo(%reg), %reg
5124 For 32bit, originally it can be one of:
5125 movq foo@gottpoff(%rip), %reg
5126 addl foo@gottpoff(%rip), %reg
5129 leal foo(%reg), %reg
5132 unsigned int val
, type
, reg
;
5135 val
= bfd_get_8 (input_bfd
, contents
+ roff
- 3);
5138 type
= bfd_get_8 (input_bfd
, contents
+ roff
- 2);
5139 reg
= bfd_get_8 (input_bfd
, contents
+ roff
- 1);
5145 bfd_put_8 (output_bfd
, 0x49,
5146 contents
+ roff
- 3);
5147 else if (!ABI_64_P (output_bfd
) && val
== 0x44)
5148 bfd_put_8 (output_bfd
, 0x41,
5149 contents
+ roff
- 3);
5150 bfd_put_8 (output_bfd
, 0xc7,
5151 contents
+ roff
- 2);
5152 bfd_put_8 (output_bfd
, 0xc0 | reg
,
5153 contents
+ roff
- 1);
5157 /* addq/addl -> addq/addl - addressing with %rsp/%r12
5160 bfd_put_8 (output_bfd
, 0x49,
5161 contents
+ roff
- 3);
5162 else if (!ABI_64_P (output_bfd
) && val
== 0x44)
5163 bfd_put_8 (output_bfd
, 0x41,
5164 contents
+ roff
- 3);
5165 bfd_put_8 (output_bfd
, 0x81,
5166 contents
+ roff
- 2);
5167 bfd_put_8 (output_bfd
, 0xc0 | reg
,
5168 contents
+ roff
- 1);
5172 /* addq/addl -> leaq/leal */
5174 bfd_put_8 (output_bfd
, 0x4d,
5175 contents
+ roff
- 3);
5176 else if (!ABI_64_P (output_bfd
) && val
== 0x44)
5177 bfd_put_8 (output_bfd
, 0x45,
5178 contents
+ roff
- 3);
5179 bfd_put_8 (output_bfd
, 0x8d,
5180 contents
+ roff
- 2);
5181 bfd_put_8 (output_bfd
, 0x80 | reg
| (reg
<< 3),
5182 contents
+ roff
- 1);
5184 bfd_put_32 (output_bfd
,
5185 elf_x86_64_tpoff (info
, relocation
),
5193 if (htab
->elf
.sgot
== NULL
)
5198 off
= h
->got
.offset
;
5199 offplt
= elf_x86_64_hash_entry (h
)->tlsdesc_got
;
5203 if (local_got_offsets
== NULL
)
5206 off
= local_got_offsets
[r_symndx
];
5207 offplt
= local_tlsdesc_gotents
[r_symndx
];
5214 Elf_Internal_Rela outrel
;
5218 if (htab
->elf
.srelgot
== NULL
)
5221 indx
= h
&& h
->dynindx
!= -1 ? h
->dynindx
: 0;
5223 if (GOT_TLS_GDESC_P (tls_type
))
5225 outrel
.r_info
= htab
->r_info (indx
, R_X86_64_TLSDESC
);
5226 BFD_ASSERT (htab
->sgotplt_jump_table_size
+ offplt
5227 + 2 * GOT_ENTRY_SIZE
<= htab
->elf
.sgotplt
->size
);
5228 outrel
.r_offset
= (htab
->elf
.sgotplt
->output_section
->vma
5229 + htab
->elf
.sgotplt
->output_offset
5231 + htab
->sgotplt_jump_table_size
);
5232 sreloc
= htab
->elf
.srelplt
;
5234 outrel
.r_addend
= relocation
- elf_x86_64_dtpoff_base (info
);
5236 outrel
.r_addend
= 0;
5237 elf_append_rela (output_bfd
, sreloc
, &outrel
);
5240 sreloc
= htab
->elf
.srelgot
;
5242 outrel
.r_offset
= (htab
->elf
.sgot
->output_section
->vma
5243 + htab
->elf
.sgot
->output_offset
+ off
);
5245 if (GOT_TLS_GD_P (tls_type
))
5246 dr_type
= R_X86_64_DTPMOD64
;
5247 else if (GOT_TLS_GDESC_P (tls_type
))
5250 dr_type
= R_X86_64_TPOFF64
;
5252 bfd_put_64 (output_bfd
, 0, htab
->elf
.sgot
->contents
+ off
);
5253 outrel
.r_addend
= 0;
5254 if ((dr_type
== R_X86_64_TPOFF64
5255 || dr_type
== R_X86_64_TLSDESC
) && indx
== 0)
5256 outrel
.r_addend
= relocation
- elf_x86_64_dtpoff_base (info
);
5257 outrel
.r_info
= htab
->r_info (indx
, dr_type
);
5259 elf_append_rela (output_bfd
, sreloc
, &outrel
);
5261 if (GOT_TLS_GD_P (tls_type
))
5265 BFD_ASSERT (! unresolved_reloc
);
5266 bfd_put_64 (output_bfd
,
5267 relocation
- elf_x86_64_dtpoff_base (info
),
5268 htab
->elf
.sgot
->contents
+ off
+ GOT_ENTRY_SIZE
);
5272 bfd_put_64 (output_bfd
, 0,
5273 htab
->elf
.sgot
->contents
+ off
+ GOT_ENTRY_SIZE
);
5274 outrel
.r_info
= htab
->r_info (indx
,
5276 outrel
.r_offset
+= GOT_ENTRY_SIZE
;
5277 elf_append_rela (output_bfd
, sreloc
,
5286 local_got_offsets
[r_symndx
] |= 1;
5289 if (off
>= (bfd_vma
) -2
5290 && ! GOT_TLS_GDESC_P (tls_type
))
5292 if (r_type
== ELF32_R_TYPE (rel
->r_info
))
5294 if (r_type
== R_X86_64_GOTPC32_TLSDESC
5295 || r_type
== R_X86_64_TLSDESC_CALL
)
5296 relocation
= htab
->elf
.sgotplt
->output_section
->vma
5297 + htab
->elf
.sgotplt
->output_offset
5298 + offplt
+ htab
->sgotplt_jump_table_size
;
5300 relocation
= htab
->elf
.sgot
->output_section
->vma
5301 + htab
->elf
.sgot
->output_offset
+ off
;
5302 unresolved_reloc
= FALSE
;
5306 bfd_vma roff
= rel
->r_offset
;
5308 if (ELF32_R_TYPE (rel
->r_info
) == R_X86_64_TLSGD
)
5310 /* GD->IE transition. For 64bit, change
5311 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
5312 .word 0x6666; rex64; call __tls_get_addr@PLT
5314 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
5316 call *__tls_get_addr@GOTPCREL(%rip
5317 which may be converted to
5318 addr32 call __tls_get_addr
5321 addq foo@gottpoff(%rip), %rax
5323 leaq foo@tlsgd(%rip), %rdi
5324 .word 0x6666; rex64; call __tls_get_addr@PLT
5326 leaq foo@tlsgd(%rip), %rdi
5328 call *__tls_get_addr@GOTPCREL(%rip)
5329 which may be converted to
5330 addr32 call __tls_get_addr
5333 addq foo@gottpoff(%rip), %rax
5334 For largepic, change:
5335 leaq foo@tlsgd(%rip), %rdi
5336 movabsq $__tls_get_addr@pltoff, %rax
5341 addq foo@gottpoff(%rax), %rax
5342 nopw 0x0(%rax,%rax,1) */
5344 if (ABI_64_P (output_bfd
))
5346 if (contents
[roff
+ 5] == 0xb8)
5348 memcpy (contents
+ roff
- 3,
5349 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05"
5350 "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
5354 memcpy (contents
+ roff
- 4,
5355 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
5359 memcpy (contents
+ roff
- 3,
5360 "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
5363 relocation
= (htab
->elf
.sgot
->output_section
->vma
5364 + htab
->elf
.sgot
->output_offset
+ off
5367 - input_section
->output_section
->vma
5368 - input_section
->output_offset
5370 bfd_put_32 (output_bfd
, relocation
,
5371 contents
+ roff
+ 8 + largepic
);
5372 /* Skip R_X86_64_PLT32/R_X86_64_PLTOFF64. */
5377 else if (ELF32_R_TYPE (rel
->r_info
) == R_X86_64_GOTPC32_TLSDESC
)
5379 /* GDesc -> IE transition.
5380 It's originally something like:
5381 leaq x@tlsdesc(%rip), %rax
5384 movq x@gottpoff(%rip), %rax # before xchg %ax,%ax. */
5386 /* Now modify the instruction as appropriate. To
5387 turn a leaq into a movq in the form we use it, it
5388 suffices to change the second byte from 0x8d to
5390 bfd_put_8 (output_bfd
, 0x8b, contents
+ roff
- 2);
5392 bfd_put_32 (output_bfd
,
5393 htab
->elf
.sgot
->output_section
->vma
5394 + htab
->elf
.sgot
->output_offset
+ off
5396 - input_section
->output_section
->vma
5397 - input_section
->output_offset
5402 else if (ELF32_R_TYPE (rel
->r_info
) == R_X86_64_TLSDESC_CALL
)
5404 /* GDesc -> IE transition.
5411 bfd_put_8 (output_bfd
, 0x66, contents
+ roff
);
5412 bfd_put_8 (output_bfd
, 0x90, contents
+ roff
+ 1);
5420 case R_X86_64_TLSLD
:
5421 if (! elf_x86_64_tls_transition (info
, input_bfd
,
5422 input_section
, contents
,
5423 symtab_hdr
, sym_hashes
,
5424 &r_type
, GOT_UNKNOWN
, rel
,
5425 relend
, h
, r_symndx
, TRUE
))
5428 if (r_type
!= R_X86_64_TLSLD
)
5430 /* LD->LE transition:
5431 leaq foo@tlsld(%rip), %rdi
5432 call __tls_get_addr@PLT
5433 For 64bit, we change it into:
5434 .word 0x6666; .byte 0x66; movq %fs:0, %rax
5435 For 32bit, we change it into:
5436 nopl 0x0(%rax); movl %fs:0, %eax
5438 leaq foo@tlsld(%rip), %rdi;
5439 call *__tls_get_addr@GOTPCREL(%rip)
5440 which may be converted to
5441 addr32 call __tls_get_addr
5442 For 64bit, we change it into:
5443 .word 0x6666; .word 0x6666; movq %fs:0, %rax
5444 For 32bit, we change it into:
5445 nopw 0x0(%rax); movl %fs:0, %eax
5446 For largepic, change:
5447 leaq foo@tlsgd(%rip), %rdi
5448 movabsq $__tls_get_addr@pltoff, %rax
5452 data16 data16 data16 nopw %cs:0x0(%rax,%rax,1)
5455 BFD_ASSERT (r_type
== R_X86_64_TPOFF32
);
5456 if (ABI_64_P (output_bfd
))
5458 if (contents
[rel
->r_offset
+ 5] == 0xb8)
5459 memcpy (contents
+ rel
->r_offset
- 3,
5460 "\x66\x66\x66\x66\x2e\x0f\x1f\x84\0\0\0\0\0"
5461 "\x64\x48\x8b\x04\x25\0\0\0", 22);
5462 else if (contents
[rel
->r_offset
+ 4] == 0xff
5463 || contents
[rel
->r_offset
+ 4] == 0x67)
5464 memcpy (contents
+ rel
->r_offset
- 3,
5465 "\x66\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0",
5468 memcpy (contents
+ rel
->r_offset
- 3,
5469 "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
5473 if (contents
[rel
->r_offset
+ 4] == 0xff)
5474 memcpy (contents
+ rel
->r_offset
- 3,
5475 "\x66\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0",
5478 memcpy (contents
+ rel
->r_offset
- 3,
5479 "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
5481 /* Skip R_X86_64_PC32, R_X86_64_PLT32, R_X86_64_GOTPCRELX
5482 and R_X86_64_PLTOFF64. */
5488 if (htab
->elf
.sgot
== NULL
)
5491 off
= htab
->tls_ld_got
.offset
;
5496 Elf_Internal_Rela outrel
;
5498 if (htab
->elf
.srelgot
== NULL
)
5501 outrel
.r_offset
= (htab
->elf
.sgot
->output_section
->vma
5502 + htab
->elf
.sgot
->output_offset
+ off
);
5504 bfd_put_64 (output_bfd
, 0,
5505 htab
->elf
.sgot
->contents
+ off
);
5506 bfd_put_64 (output_bfd
, 0,
5507 htab
->elf
.sgot
->contents
+ off
+ GOT_ENTRY_SIZE
);
5508 outrel
.r_info
= htab
->r_info (0, R_X86_64_DTPMOD64
);
5509 outrel
.r_addend
= 0;
5510 elf_append_rela (output_bfd
, htab
->elf
.srelgot
,
5512 htab
->tls_ld_got
.offset
|= 1;
5514 relocation
= htab
->elf
.sgot
->output_section
->vma
5515 + htab
->elf
.sgot
->output_offset
+ off
;
5516 unresolved_reloc
= FALSE
;
5519 case R_X86_64_DTPOFF32
:
5520 if (!bfd_link_executable (info
)
5521 || (input_section
->flags
& SEC_CODE
) == 0)
5522 relocation
-= elf_x86_64_dtpoff_base (info
);
5524 relocation
= elf_x86_64_tpoff (info
, relocation
);
5527 case R_X86_64_TPOFF32
:
5528 case R_X86_64_TPOFF64
:
5529 BFD_ASSERT (bfd_link_executable (info
));
5530 relocation
= elf_x86_64_tpoff (info
, relocation
);
5533 case R_X86_64_DTPOFF64
:
5534 BFD_ASSERT ((input_section
->flags
& SEC_CODE
) == 0);
5535 relocation
-= elf_x86_64_dtpoff_base (info
);
5542 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5543 because such sections are not SEC_ALLOC and thus ld.so will
5544 not process them. */
5545 if (unresolved_reloc
5546 && !((input_section
->flags
& SEC_DEBUGGING
) != 0
5548 && _bfd_elf_section_offset (output_bfd
, info
, input_section
,
5549 rel
->r_offset
) != (bfd_vma
) -1)
5552 /* xgettext:c-format */
5553 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5556 (long) rel
->r_offset
,
5558 h
->root
.root
.string
);
5563 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
5564 contents
, rel
->r_offset
,
5565 relocation
, rel
->r_addend
);
5567 check_relocation_error
:
5568 if (r
!= bfd_reloc_ok
)
5573 name
= h
->root
.root
.string
;
5576 name
= bfd_elf_string_from_elf_section (input_bfd
,
5577 symtab_hdr
->sh_link
,
5582 name
= bfd_section_name (input_bfd
, sec
);
5585 if (r
== bfd_reloc_overflow
)
5586 (*info
->callbacks
->reloc_overflow
)
5587 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
5588 (bfd_vma
) 0, input_bfd
, input_section
, rel
->r_offset
);
5592 /* xgettext:c-format */
5593 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
5594 input_bfd
, input_section
,
5595 (long) rel
->r_offset
, name
, (int) r
);
5606 Elf_Internal_Shdr
*rel_hdr
;
5607 size_t deleted
= rel
- wrel
;
5609 rel_hdr
= _bfd_elf_single_rel_hdr (input_section
->output_section
);
5610 rel_hdr
->sh_size
-= rel_hdr
->sh_entsize
* deleted
;
5611 if (rel_hdr
->sh_size
== 0)
5613 /* It is too late to remove an empty reloc section. Leave
5615 ??? What is wrong with an empty section??? */
5616 rel_hdr
->sh_size
= rel_hdr
->sh_entsize
;
5619 rel_hdr
= _bfd_elf_single_rel_hdr (input_section
);
5620 rel_hdr
->sh_size
-= rel_hdr
->sh_entsize
* deleted
;
5621 input_section
->reloc_count
-= deleted
;
5627 /* Finish up dynamic symbol handling. We set the contents of various
5628 dynamic sections here. */
5631 elf_x86_64_finish_dynamic_symbol (bfd
*output_bfd
,
5632 struct bfd_link_info
*info
,
5633 struct elf_link_hash_entry
*h
,
5634 Elf_Internal_Sym
*sym
)
5636 struct elf_x86_64_link_hash_table
*htab
;
5637 const struct elf_x86_64_backend_data
*abed
;
5638 bfd_boolean use_plt_bnd
;
5639 struct elf_x86_64_link_hash_entry
*eh
;
5640 bfd_boolean local_undefweak
;
5642 htab
= elf_x86_64_hash_table (info
);
5646 /* Use MPX backend data in case of BND relocation. Use .plt_bnd
5647 section only if there is .plt section. */
5648 use_plt_bnd
= htab
->elf
.splt
!= NULL
&& htab
->plt_bnd
!= NULL
;
5650 ? &elf_x86_64_bnd_arch_bed
5651 : get_elf_x86_64_backend_data (output_bfd
));
5653 eh
= (struct elf_x86_64_link_hash_entry
*) h
;
5655 /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
5656 resolved undefined weak symbols in executable so that their
5657 references have value 0 at run-time. */
5658 local_undefweak
= UNDEFINED_WEAK_RESOLVED_TO_ZERO (info
,
5662 if (h
->plt
.offset
!= (bfd_vma
) -1)
5665 bfd_vma got_offset
, plt_offset
, plt_plt_offset
, plt_got_offset
;
5666 bfd_vma plt_plt_insn_end
, plt_got_insn_size
;
5667 Elf_Internal_Rela rela
;
5669 asection
*plt
, *gotplt
, *relplt
, *resolved_plt
;
5670 const struct elf_backend_data
*bed
;
5671 bfd_vma plt_got_pcrel_offset
;
5673 /* When building a static executable, use .iplt, .igot.plt and
5674 .rela.iplt sections for STT_GNU_IFUNC symbols. */
5675 if (htab
->elf
.splt
!= NULL
)
5677 plt
= htab
->elf
.splt
;
5678 gotplt
= htab
->elf
.sgotplt
;
5679 relplt
= htab
->elf
.srelplt
;
5683 plt
= htab
->elf
.iplt
;
5684 gotplt
= htab
->elf
.igotplt
;
5685 relplt
= htab
->elf
.irelplt
;
5688 /* This symbol has an entry in the procedure linkage table. Set
5690 if ((h
->dynindx
== -1
5692 && !((h
->forced_local
|| bfd_link_executable (info
))
5694 && h
->type
== STT_GNU_IFUNC
))
5700 /* Get the index in the procedure linkage table which
5701 corresponds to this symbol. This is the index of this symbol
5702 in all the symbols for which we are making plt entries. The
5703 first entry in the procedure linkage table is reserved.
5705 Get the offset into the .got table of the entry that
5706 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
5707 bytes. The first three are reserved for the dynamic linker.
5709 For static executables, we don't reserve anything. */
5711 if (plt
== htab
->elf
.splt
)
5713 got_offset
= h
->plt
.offset
/ abed
->plt_entry_size
- 1;
5714 got_offset
= (got_offset
+ 3) * GOT_ENTRY_SIZE
;
5718 got_offset
= h
->plt
.offset
/ abed
->plt_entry_size
;
5719 got_offset
= got_offset
* GOT_ENTRY_SIZE
;
5722 plt_plt_insn_end
= abed
->plt_plt_insn_end
;
5723 plt_plt_offset
= abed
->plt_plt_offset
;
5724 plt_got_insn_size
= abed
->plt_got_insn_size
;
5725 plt_got_offset
= abed
->plt_got_offset
;
5728 /* Use the second PLT with BND relocations. */
5729 const bfd_byte
*plt_entry
, *plt2_entry
;
5731 if (eh
->has_bnd_reloc
)
5733 plt_entry
= elf_x86_64_bnd_plt_entry
;
5734 plt2_entry
= elf_x86_64_bnd_plt2_entry
;
5738 plt_entry
= elf_x86_64_legacy_plt_entry
;
5739 plt2_entry
= elf_x86_64_legacy_plt2_entry
;
5741 /* Subtract 1 since there is no BND prefix. */
5742 plt_plt_insn_end
-= 1;
5743 plt_plt_offset
-= 1;
5744 plt_got_insn_size
-= 1;
5745 plt_got_offset
-= 1;
5748 BFD_ASSERT (sizeof (elf_x86_64_bnd_plt_entry
)
5749 == sizeof (elf_x86_64_legacy_plt_entry
));
5751 /* Fill in the entry in the procedure linkage table. */
5752 memcpy (plt
->contents
+ h
->plt
.offset
,
5753 plt_entry
, sizeof (elf_x86_64_legacy_plt_entry
));
5754 /* Fill in the entry in the second PLT. */
5755 memcpy (htab
->plt_bnd
->contents
+ eh
->plt_bnd
.offset
,
5756 plt2_entry
, sizeof (elf_x86_64_legacy_plt2_entry
));
5758 resolved_plt
= htab
->plt_bnd
;
5759 plt_offset
= eh
->plt_bnd
.offset
;
5763 /* Fill in the entry in the procedure linkage table. */
5764 memcpy (plt
->contents
+ h
->plt
.offset
, abed
->plt_entry
,
5765 abed
->plt_entry_size
);
5768 plt_offset
= h
->plt
.offset
;
5771 /* Insert the relocation positions of the plt section. */
5773 /* Put offset the PC-relative instruction referring to the GOT entry,
5774 subtracting the size of that instruction. */
5775 plt_got_pcrel_offset
= (gotplt
->output_section
->vma
5776 + gotplt
->output_offset
5778 - resolved_plt
->output_section
->vma
5779 - resolved_plt
->output_offset
5781 - plt_got_insn_size
);
5783 /* Check PC-relative offset overflow in PLT entry. */
5784 if ((plt_got_pcrel_offset
+ 0x80000000) > 0xffffffff)
5785 /* xgettext:c-format */
5786 info
->callbacks
->einfo (_("%F%B: PC-relative offset overflow in PLT entry for `%s'\n"),
5787 output_bfd
, h
->root
.root
.string
);
5789 bfd_put_32 (output_bfd
, plt_got_pcrel_offset
,
5790 resolved_plt
->contents
+ plt_offset
+ plt_got_offset
);
5792 /* Fill in the entry in the global offset table, initially this
5793 points to the second part of the PLT entry. Leave the entry
5794 as zero for undefined weak symbol in PIE. No PLT relocation
5795 against undefined weak symbol in PIE. */
5796 if (!local_undefweak
)
5798 bfd_put_64 (output_bfd
, (plt
->output_section
->vma
5799 + plt
->output_offset
5801 + abed
->plt_lazy_offset
),
5802 gotplt
->contents
+ got_offset
);
5804 /* Fill in the entry in the .rela.plt section. */
5805 rela
.r_offset
= (gotplt
->output_section
->vma
5806 + gotplt
->output_offset
5808 if (h
->dynindx
== -1
5809 || ((bfd_link_executable (info
)
5810 || ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
)
5812 && h
->type
== STT_GNU_IFUNC
))
5814 /* If an STT_GNU_IFUNC symbol is locally defined, generate
5815 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT. */
5816 rela
.r_info
= htab
->r_info (0, R_X86_64_IRELATIVE
);
5817 rela
.r_addend
= (h
->root
.u
.def
.value
5818 + h
->root
.u
.def
.section
->output_section
->vma
5819 + h
->root
.u
.def
.section
->output_offset
);
5820 /* R_X86_64_IRELATIVE comes last. */
5821 plt_index
= htab
->next_irelative_index
--;
5825 rela
.r_info
= htab
->r_info (h
->dynindx
, R_X86_64_JUMP_SLOT
);
5827 plt_index
= htab
->next_jump_slot_index
++;
5830 /* Don't fill PLT entry for static executables. */
5831 if (plt
== htab
->elf
.splt
)
5833 bfd_vma plt0_offset
= h
->plt
.offset
+ plt_plt_insn_end
;
5835 /* Put relocation index. */
5836 bfd_put_32 (output_bfd
, plt_index
,
5837 (plt
->contents
+ h
->plt
.offset
5838 + abed
->plt_reloc_offset
));
5840 /* Put offset for jmp .PLT0 and check for overflow. We don't
5841 check relocation index for overflow since branch displacement
5842 will overflow first. */
5843 if (plt0_offset
> 0x80000000)
5844 /* xgettext:c-format */
5845 info
->callbacks
->einfo (_("%F%B: branch displacement overflow in PLT entry for `%s'\n"),
5846 output_bfd
, h
->root
.root
.string
);
5847 bfd_put_32 (output_bfd
, - plt0_offset
,
5848 plt
->contents
+ h
->plt
.offset
+ plt_plt_offset
);
5851 bed
= get_elf_backend_data (output_bfd
);
5852 loc
= relplt
->contents
+ plt_index
* bed
->s
->sizeof_rela
;
5853 bed
->s
->swap_reloca_out (output_bfd
, &rela
, loc
);
5856 else if (eh
->plt_got
.offset
!= (bfd_vma
) -1)
5858 bfd_vma got_offset
, plt_offset
, plt_got_offset
, plt_got_insn_size
;
5859 asection
*plt
, *got
;
5860 bfd_boolean got_after_plt
;
5861 int32_t got_pcrel_offset
;
5862 const bfd_byte
*got_plt_entry
;
5864 /* Set the entry in the GOT procedure linkage table. */
5865 plt
= htab
->plt_got
;
5866 got
= htab
->elf
.sgot
;
5867 got_offset
= h
->got
.offset
;
5869 if (got_offset
== (bfd_vma
) -1
5870 || h
->type
== STT_GNU_IFUNC
5875 /* Use the second PLT entry template for the GOT PLT since they
5876 are the identical. */
5877 plt_got_insn_size
= elf_x86_64_bnd_arch_bed
.plt_got_insn_size
;
5878 plt_got_offset
= elf_x86_64_bnd_arch_bed
.plt_got_offset
;
5879 if (eh
->has_bnd_reloc
)
5880 got_plt_entry
= elf_x86_64_bnd_plt2_entry
;
5883 got_plt_entry
= elf_x86_64_legacy_plt2_entry
;
5885 /* Subtract 1 since there is no BND prefix. */
5886 plt_got_insn_size
-= 1;
5887 plt_got_offset
-= 1;
5890 /* Fill in the entry in the GOT procedure linkage table. */
5891 plt_offset
= eh
->plt_got
.offset
;
5892 memcpy (plt
->contents
+ plt_offset
,
5893 got_plt_entry
, sizeof (elf_x86_64_legacy_plt2_entry
));
5895 /* Put offset the PC-relative instruction referring to the GOT
5896 entry, subtracting the size of that instruction. */
5897 got_pcrel_offset
= (got
->output_section
->vma
5898 + got
->output_offset
5900 - plt
->output_section
->vma
5901 - plt
->output_offset
5903 - plt_got_insn_size
);
5905 /* Check PC-relative offset overflow in GOT PLT entry. */
5906 got_after_plt
= got
->output_section
->vma
> plt
->output_section
->vma
;
5907 if ((got_after_plt
&& got_pcrel_offset
< 0)
5908 || (!got_after_plt
&& got_pcrel_offset
> 0))
5909 /* xgettext:c-format */
5910 info
->callbacks
->einfo (_("%F%B: PC-relative offset overflow in GOT PLT entry for `%s'\n"),
5911 output_bfd
, h
->root
.root
.string
);
5913 bfd_put_32 (output_bfd
, got_pcrel_offset
,
5914 plt
->contents
+ plt_offset
+ plt_got_offset
);
5917 if (!local_undefweak
5919 && (h
->plt
.offset
!= (bfd_vma
) -1
5920 || eh
->plt_got
.offset
!= (bfd_vma
) -1))
5922 /* Mark the symbol as undefined, rather than as defined in
5923 the .plt section. Leave the value if there were any
5924 relocations where pointer equality matters (this is a clue
5925 for the dynamic linker, to make function pointer
5926 comparisons work between an application and shared
5927 library), otherwise set it to zero. If a function is only
5928 called from a binary, there is no need to slow down
5929 shared libraries because of that. */
5930 sym
->st_shndx
= SHN_UNDEF
;
5931 if (!h
->pointer_equality_needed
)
5935 /* Don't generate dynamic GOT relocation against undefined weak
5936 symbol in executable. */
5937 if (h
->got
.offset
!= (bfd_vma
) -1
5938 && ! GOT_TLS_GD_ANY_P (elf_x86_64_hash_entry (h
)->tls_type
)
5939 && elf_x86_64_hash_entry (h
)->tls_type
!= GOT_TLS_IE
5940 && !local_undefweak
)
5942 Elf_Internal_Rela rela
;
5943 asection
*relgot
= htab
->elf
.srelgot
;
5945 /* This symbol has an entry in the global offset table. Set it
5947 if (htab
->elf
.sgot
== NULL
|| htab
->elf
.srelgot
== NULL
)
5950 rela
.r_offset
= (htab
->elf
.sgot
->output_section
->vma
5951 + htab
->elf
.sgot
->output_offset
5952 + (h
->got
.offset
&~ (bfd_vma
) 1));
5954 /* If this is a static link, or it is a -Bsymbolic link and the
5955 symbol is defined locally or was forced to be local because
5956 of a version file, we just want to emit a RELATIVE reloc.
5957 The entry in the global offset table will already have been
5958 initialized in the relocate_section function. */
5960 && h
->type
== STT_GNU_IFUNC
)
5962 if (h
->plt
.offset
== (bfd_vma
) -1)
5964 /* STT_GNU_IFUNC is referenced without PLT. */
5965 if (htab
->elf
.splt
== NULL
)
5967 /* use .rel[a].iplt section to store .got relocations
5968 in static executable. */
5969 relgot
= htab
->elf
.irelplt
;
5971 if (SYMBOL_REFERENCES_LOCAL (info
, h
))
5973 rela
.r_info
= htab
->r_info (0,
5974 R_X86_64_IRELATIVE
);
5975 rela
.r_addend
= (h
->root
.u
.def
.value
5976 + h
->root
.u
.def
.section
->output_section
->vma
5977 + h
->root
.u
.def
.section
->output_offset
);
5982 else if (bfd_link_pic (info
))
5984 /* Generate R_X86_64_GLOB_DAT. */
5991 if (!h
->pointer_equality_needed
)
5994 /* For non-shared object, we can't use .got.plt, which
5995 contains the real function addres if we need pointer
5996 equality. We load the GOT entry with the PLT entry. */
5997 plt
= htab
->elf
.splt
? htab
->elf
.splt
: htab
->elf
.iplt
;
5998 bfd_put_64 (output_bfd
, (plt
->output_section
->vma
5999 + plt
->output_offset
6001 htab
->elf
.sgot
->contents
+ h
->got
.offset
);
6005 else if (bfd_link_pic (info
)
6006 && SYMBOL_REFERENCES_LOCAL (info
, h
))
6008 if (!h
->def_regular
)
6010 BFD_ASSERT((h
->got
.offset
& 1) != 0);
6011 rela
.r_info
= htab
->r_info (0, R_X86_64_RELATIVE
);
6012 rela
.r_addend
= (h
->root
.u
.def
.value
6013 + h
->root
.u
.def
.section
->output_section
->vma
6014 + h
->root
.u
.def
.section
->output_offset
);
6018 BFD_ASSERT((h
->got
.offset
& 1) == 0);
6020 bfd_put_64 (output_bfd
, (bfd_vma
) 0,
6021 htab
->elf
.sgot
->contents
+ h
->got
.offset
);
6022 rela
.r_info
= htab
->r_info (h
->dynindx
, R_X86_64_GLOB_DAT
);
6026 elf_append_rela (output_bfd
, relgot
, &rela
);
6031 Elf_Internal_Rela rela
;
6034 /* This symbol needs a copy reloc. Set it up. */
6036 if (h
->dynindx
== -1
6037 || (h
->root
.type
!= bfd_link_hash_defined
6038 && h
->root
.type
!= bfd_link_hash_defweak
)
6039 || htab
->elf
.srelbss
== NULL
6040 || htab
->elf
.sreldynrelro
== NULL
)
6043 rela
.r_offset
= (h
->root
.u
.def
.value
6044 + h
->root
.u
.def
.section
->output_section
->vma
6045 + h
->root
.u
.def
.section
->output_offset
);
6046 rela
.r_info
= htab
->r_info (h
->dynindx
, R_X86_64_COPY
);
6048 if ((h
->root
.u
.def
.section
->flags
& SEC_READONLY
) != 0)
6049 s
= htab
->elf
.sreldynrelro
;
6051 s
= htab
->elf
.srelbss
;
6052 elf_append_rela (output_bfd
, s
, &rela
);
6058 /* Finish up local dynamic symbol handling. We set the contents of
6059 various dynamic sections here. */
6062 elf_x86_64_finish_local_dynamic_symbol (void **slot
, void *inf
)
6064 struct elf_link_hash_entry
*h
6065 = (struct elf_link_hash_entry
*) *slot
;
6066 struct bfd_link_info
*info
6067 = (struct bfd_link_info
*) inf
;
6069 return elf_x86_64_finish_dynamic_symbol (info
->output_bfd
,
6073 /* Finish up undefined weak symbol handling in PIE. Fill its PLT entry
6074 here since undefined weak symbol may not be dynamic and may not be
6075 called for elf_x86_64_finish_dynamic_symbol. */
6078 elf_x86_64_pie_finish_undefweak_symbol (struct bfd_hash_entry
*bh
,
6081 struct elf_link_hash_entry
*h
= (struct elf_link_hash_entry
*) bh
;
6082 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
6084 if (h
->root
.type
!= bfd_link_hash_undefweak
6085 || h
->dynindx
!= -1)
6088 return elf_x86_64_finish_dynamic_symbol (info
->output_bfd
,
6092 /* Used to decide how to sort relocs in an optimal manner for the
6093 dynamic linker, before writing them out. */
6095 static enum elf_reloc_type_class
6096 elf_x86_64_reloc_type_class (const struct bfd_link_info
*info
,
6097 const asection
*rel_sec ATTRIBUTE_UNUSED
,
6098 const Elf_Internal_Rela
*rela
)
6100 bfd
*abfd
= info
->output_bfd
;
6101 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
6102 struct elf_x86_64_link_hash_table
*htab
= elf_x86_64_hash_table (info
);
6104 if (htab
->elf
.dynsym
!= NULL
6105 && htab
->elf
.dynsym
->contents
!= NULL
)
6107 /* Check relocation against STT_GNU_IFUNC symbol if there are
6109 unsigned long r_symndx
= htab
->r_sym (rela
->r_info
);
6110 if (r_symndx
!= STN_UNDEF
)
6112 Elf_Internal_Sym sym
;
6113 if (!bed
->s
->swap_symbol_in (abfd
,
6114 (htab
->elf
.dynsym
->contents
6115 + r_symndx
* bed
->s
->sizeof_sym
),
6119 if (ELF_ST_TYPE (sym
.st_info
) == STT_GNU_IFUNC
)
6120 return reloc_class_ifunc
;
6124 switch ((int) ELF32_R_TYPE (rela
->r_info
))
6126 case R_X86_64_IRELATIVE
:
6127 return reloc_class_ifunc
;
6128 case R_X86_64_RELATIVE
:
6129 case R_X86_64_RELATIVE64
:
6130 return reloc_class_relative
;
6131 case R_X86_64_JUMP_SLOT
:
6132 return reloc_class_plt
;
6134 return reloc_class_copy
;
6136 return reloc_class_normal
;
6140 /* Finish up the dynamic sections. */
6143 elf_x86_64_finish_dynamic_sections (bfd
*output_bfd
,
6144 struct bfd_link_info
*info
)
6146 struct elf_x86_64_link_hash_table
*htab
;
6149 const struct elf_x86_64_backend_data
*abed
;
6151 htab
= elf_x86_64_hash_table (info
);
6155 /* Use MPX backend data in case of BND relocation. Use .plt_bnd
6156 section only if there is .plt section. */
6157 abed
= (htab
->elf
.splt
!= NULL
&& htab
->plt_bnd
!= NULL
6158 ? &elf_x86_64_bnd_arch_bed
6159 : get_elf_x86_64_backend_data (output_bfd
));
6161 dynobj
= htab
->elf
.dynobj
;
6162 sdyn
= bfd_get_linker_section (dynobj
, ".dynamic");
6164 if (htab
->elf
.dynamic_sections_created
)
6166 bfd_byte
*dyncon
, *dynconend
;
6167 const struct elf_backend_data
*bed
;
6168 bfd_size_type sizeof_dyn
;
6170 if (sdyn
== NULL
|| htab
->elf
.sgot
== NULL
)
6173 bed
= get_elf_backend_data (dynobj
);
6174 sizeof_dyn
= bed
->s
->sizeof_dyn
;
6175 dyncon
= sdyn
->contents
;
6176 dynconend
= sdyn
->contents
+ sdyn
->size
;
6177 for (; dyncon
< dynconend
; dyncon
+= sizeof_dyn
)
6179 Elf_Internal_Dyn dyn
;
6182 (*bed
->s
->swap_dyn_in
) (dynobj
, dyncon
, &dyn
);
6190 s
= htab
->elf
.sgotplt
;
6191 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
6195 dyn
.d_un
.d_ptr
= htab
->elf
.srelplt
->output_section
->vma
;
6199 s
= htab
->elf
.srelplt
->output_section
;
6200 dyn
.d_un
.d_val
= s
->size
;
6203 case DT_TLSDESC_PLT
:
6205 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
6206 + htab
->tlsdesc_plt
;
6209 case DT_TLSDESC_GOT
:
6211 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
6212 + htab
->tlsdesc_got
;
6216 (*bed
->s
->swap_dyn_out
) (output_bfd
, &dyn
, dyncon
);
6219 /* Fill in the special first entry in the procedure linkage table. */
6220 if (htab
->elf
.splt
&& htab
->elf
.splt
->size
> 0)
6222 /* Fill in the first entry in the procedure linkage table. */
6223 memcpy (htab
->elf
.splt
->contents
,
6224 abed
->plt0_entry
, abed
->plt_entry_size
);
6225 /* Add offset for pushq GOT+8(%rip), since the instruction
6226 uses 6 bytes subtract this value. */
6227 bfd_put_32 (output_bfd
,
6228 (htab
->elf
.sgotplt
->output_section
->vma
6229 + htab
->elf
.sgotplt
->output_offset
6231 - htab
->elf
.splt
->output_section
->vma
6232 - htab
->elf
.splt
->output_offset
6234 htab
->elf
.splt
->contents
+ abed
->plt0_got1_offset
);
6235 /* Add offset for the PC-relative instruction accessing GOT+16,
6236 subtracting the offset to the end of that instruction. */
6237 bfd_put_32 (output_bfd
,
6238 (htab
->elf
.sgotplt
->output_section
->vma
6239 + htab
->elf
.sgotplt
->output_offset
6241 - htab
->elf
.splt
->output_section
->vma
6242 - htab
->elf
.splt
->output_offset
6243 - abed
->plt0_got2_insn_end
),
6244 htab
->elf
.splt
->contents
+ abed
->plt0_got2_offset
);
6246 elf_section_data (htab
->elf
.splt
->output_section
)
6247 ->this_hdr
.sh_entsize
= abed
->plt_entry_size
;
6249 if (htab
->tlsdesc_plt
)
6251 bfd_put_64 (output_bfd
, (bfd_vma
) 0,
6252 htab
->elf
.sgot
->contents
+ htab
->tlsdesc_got
);
6254 memcpy (htab
->elf
.splt
->contents
+ htab
->tlsdesc_plt
,
6255 abed
->plt0_entry
, abed
->plt_entry_size
);
6257 /* Add offset for pushq GOT+8(%rip), since the
6258 instruction uses 6 bytes subtract this value. */
6259 bfd_put_32 (output_bfd
,
6260 (htab
->elf
.sgotplt
->output_section
->vma
6261 + htab
->elf
.sgotplt
->output_offset
6263 - htab
->elf
.splt
->output_section
->vma
6264 - htab
->elf
.splt
->output_offset
6267 htab
->elf
.splt
->contents
6268 + htab
->tlsdesc_plt
+ abed
->plt0_got1_offset
);
6269 /* Add offset for the PC-relative instruction accessing GOT+TDG,
6270 where TGD stands for htab->tlsdesc_got, subtracting the offset
6271 to the end of that instruction. */
6272 bfd_put_32 (output_bfd
,
6273 (htab
->elf
.sgot
->output_section
->vma
6274 + htab
->elf
.sgot
->output_offset
6276 - htab
->elf
.splt
->output_section
->vma
6277 - htab
->elf
.splt
->output_offset
6279 - abed
->plt0_got2_insn_end
),
6280 htab
->elf
.splt
->contents
6281 + htab
->tlsdesc_plt
+ abed
->plt0_got2_offset
);
6286 if (htab
->plt_bnd
!= NULL
)
6287 elf_section_data (htab
->plt_bnd
->output_section
)
6288 ->this_hdr
.sh_entsize
= sizeof (elf_x86_64_bnd_plt2_entry
);
6290 if (htab
->elf
.sgotplt
)
6292 if (bfd_is_abs_section (htab
->elf
.sgotplt
->output_section
))
6295 (_("discarded output section: `%A'"), htab
->elf
.sgotplt
);
6299 /* Fill in the first three entries in the global offset table. */
6300 if (htab
->elf
.sgotplt
->size
> 0)
6302 /* Set the first entry in the global offset table to the address of
6303 the dynamic section. */
6305 bfd_put_64 (output_bfd
, (bfd_vma
) 0, htab
->elf
.sgotplt
->contents
);
6307 bfd_put_64 (output_bfd
,
6308 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
6309 htab
->elf
.sgotplt
->contents
);
6310 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
6311 bfd_put_64 (output_bfd
, (bfd_vma
) 0, htab
->elf
.sgotplt
->contents
+ GOT_ENTRY_SIZE
);
6312 bfd_put_64 (output_bfd
, (bfd_vma
) 0, htab
->elf
.sgotplt
->contents
+ GOT_ENTRY_SIZE
*2);
6315 elf_section_data (htab
->elf
.sgotplt
->output_section
)->this_hdr
.sh_entsize
=
6319 /* Adjust .eh_frame for .plt section. */
6320 if (htab
->plt_eh_frame
!= NULL
6321 && htab
->plt_eh_frame
->contents
!= NULL
)
6323 if (htab
->elf
.splt
!= NULL
6324 && htab
->elf
.splt
->size
!= 0
6325 && (htab
->elf
.splt
->flags
& SEC_EXCLUDE
) == 0
6326 && htab
->elf
.splt
->output_section
!= NULL
6327 && htab
->plt_eh_frame
->output_section
!= NULL
)
6329 bfd_vma plt_start
= htab
->elf
.splt
->output_section
->vma
;
6330 bfd_vma eh_frame_start
= htab
->plt_eh_frame
->output_section
->vma
6331 + htab
->plt_eh_frame
->output_offset
6332 + PLT_FDE_START_OFFSET
;
6333 bfd_put_signed_32 (dynobj
, plt_start
- eh_frame_start
,
6334 htab
->plt_eh_frame
->contents
6335 + PLT_FDE_START_OFFSET
);
6337 if (htab
->plt_eh_frame
->sec_info_type
== SEC_INFO_TYPE_EH_FRAME
)
6339 if (! _bfd_elf_write_section_eh_frame (output_bfd
, info
,
6341 htab
->plt_eh_frame
->contents
))
6346 if (htab
->elf
.sgot
&& htab
->elf
.sgot
->size
> 0)
6347 elf_section_data (htab
->elf
.sgot
->output_section
)->this_hdr
.sh_entsize
6350 /* Fill PLT entries for undefined weak symbols in PIE. */
6351 if (bfd_link_pie (info
))
6352 bfd_hash_traverse (&info
->hash
->table
,
6353 elf_x86_64_pie_finish_undefweak_symbol
,
6359 /* Fill PLT/GOT entries and allocate dynamic relocations for local
6360 STT_GNU_IFUNC symbols, which aren't in the ELF linker hash table.
6361 It has to be done before elf_link_sort_relocs is called so that
6362 dynamic relocations are properly sorted. */
6365 elf_x86_64_output_arch_local_syms
6366 (bfd
*output_bfd ATTRIBUTE_UNUSED
,
6367 struct bfd_link_info
*info
,
6368 void *flaginfo ATTRIBUTE_UNUSED
,
6369 int (*func
) (void *, const char *,
6372 struct elf_link_hash_entry
*) ATTRIBUTE_UNUSED
)
6374 struct elf_x86_64_link_hash_table
*htab
= elf_x86_64_hash_table (info
);
6378 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
6379 htab_traverse (htab
->loc_hash_table
,
6380 elf_x86_64_finish_local_dynamic_symbol
,
6386 /* Return an array of PLT entry symbol values. */
6389 elf_x86_64_get_plt_sym_val (bfd
*abfd
, asymbol
**dynsyms
, asection
*plt
,
6392 bfd_boolean (*slurp_relocs
) (bfd
*, asection
*, asymbol
**, bfd_boolean
);
6395 bfd_vma
*plt_sym_val
;
6397 bfd_byte
*plt_contents
;
6398 const struct elf_x86_64_backend_data
*bed
;
6399 Elf_Internal_Shdr
*hdr
;
6402 /* Get the .plt section contents. PLT passed down may point to the
6403 .plt.bnd section. Make sure that PLT always points to the .plt
6405 plt_bnd
= bfd_get_section_by_name (abfd
, ".plt.bnd");
6410 plt
= bfd_get_section_by_name (abfd
, ".plt");
6413 bed
= &elf_x86_64_bnd_arch_bed
;
6416 bed
= get_elf_x86_64_backend_data (abfd
);
6418 plt_contents
= (bfd_byte
*) bfd_malloc (plt
->size
);
6419 if (plt_contents
== NULL
)
6421 if (!bfd_get_section_contents (abfd
, (asection
*) plt
,
6422 plt_contents
, 0, plt
->size
))
6425 free (plt_contents
);
6429 slurp_relocs
= get_elf_backend_data (abfd
)->s
->slurp_reloc_table
;
6430 if (! (*slurp_relocs
) (abfd
, relplt
, dynsyms
, TRUE
))
6433 hdr
= &elf_section_data (relplt
)->this_hdr
;
6434 count
= relplt
->size
/ hdr
->sh_entsize
;
6436 plt_sym_val
= (bfd_vma
*) bfd_malloc (sizeof (bfd_vma
) * count
);
6437 if (plt_sym_val
== NULL
)
6440 for (i
= 0; i
< count
; i
++)
6441 plt_sym_val
[i
] = -1;
6443 plt_offset
= bed
->plt_entry_size
;
6444 p
= relplt
->relocation
;
6445 for (i
= 0; i
< count
; i
++, p
++)
6449 /* Skip unknown relocation. */
6450 if (p
->howto
== NULL
)
6453 if (p
->howto
->type
!= R_X86_64_JUMP_SLOT
6454 && p
->howto
->type
!= R_X86_64_IRELATIVE
)
6457 reloc_index
= H_GET_32 (abfd
, (plt_contents
+ plt_offset
6458 + bed
->plt_reloc_offset
));
6459 if (reloc_index
< count
)
6463 /* This is the index in .plt section. */
6464 long plt_index
= plt_offset
/ bed
->plt_entry_size
;
6465 /* Store VMA + the offset in .plt.bnd section. */
6466 plt_sym_val
[reloc_index
] =
6468 + (plt_index
- 1) * sizeof (elf_x86_64_legacy_plt2_entry
));
6471 plt_sym_val
[reloc_index
] = plt
->vma
+ plt_offset
;
6473 plt_offset
+= bed
->plt_entry_size
;
6475 /* PR binutils/18437: Skip extra relocations in the .rela.plt
6477 if (plt_offset
>= plt
->size
)
6481 free (plt_contents
);
6486 /* Similar to _bfd_elf_get_synthetic_symtab, with .plt.bnd section
6490 elf_x86_64_get_synthetic_symtab (bfd
*abfd
,
6497 /* Pass the .plt.bnd section to _bfd_elf_ifunc_get_synthetic_symtab
6498 as PLT if it exists. */
6499 asection
*plt
= bfd_get_section_by_name (abfd
, ".plt.bnd");
6501 plt
= bfd_get_section_by_name (abfd
, ".plt");
6502 return _bfd_elf_ifunc_get_synthetic_symtab (abfd
, symcount
, syms
,
6503 dynsymcount
, dynsyms
, ret
,
6505 elf_x86_64_get_plt_sym_val
);
6508 /* Handle an x86-64 specific section when reading an object file. This
6509 is called when elfcode.h finds a section with an unknown type. */
6512 elf_x86_64_section_from_shdr (bfd
*abfd
, Elf_Internal_Shdr
*hdr
,
6513 const char *name
, int shindex
)
6515 if (hdr
->sh_type
!= SHT_X86_64_UNWIND
)
6518 if (! _bfd_elf_make_section_from_shdr (abfd
, hdr
, name
, shindex
))
6524 /* Hook called by the linker routine which adds symbols from an object
6525 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
6529 elf_x86_64_add_symbol_hook (bfd
*abfd
,
6530 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
6531 Elf_Internal_Sym
*sym
,
6532 const char **namep ATTRIBUTE_UNUSED
,
6533 flagword
*flagsp ATTRIBUTE_UNUSED
,
6539 switch (sym
->st_shndx
)
6541 case SHN_X86_64_LCOMMON
:
6542 lcomm
= bfd_get_section_by_name (abfd
, "LARGE_COMMON");
6545 lcomm
= bfd_make_section_with_flags (abfd
,
6549 | SEC_LINKER_CREATED
));
6552 elf_section_flags (lcomm
) |= SHF_X86_64_LARGE
;
6555 *valp
= sym
->st_size
;
6563 /* Given a BFD section, try to locate the corresponding ELF section
6567 elf_x86_64_elf_section_from_bfd_section (bfd
*abfd ATTRIBUTE_UNUSED
,
6568 asection
*sec
, int *index_return
)
6570 if (sec
== &_bfd_elf_large_com_section
)
6572 *index_return
= SHN_X86_64_LCOMMON
;
6578 /* Process a symbol. */
6581 elf_x86_64_symbol_processing (bfd
*abfd ATTRIBUTE_UNUSED
,
6584 elf_symbol_type
*elfsym
= (elf_symbol_type
*) asym
;
6586 switch (elfsym
->internal_elf_sym
.st_shndx
)
6588 case SHN_X86_64_LCOMMON
:
6589 asym
->section
= &_bfd_elf_large_com_section
;
6590 asym
->value
= elfsym
->internal_elf_sym
.st_size
;
6591 /* Common symbol doesn't set BSF_GLOBAL. */
6592 asym
->flags
&= ~BSF_GLOBAL
;
6598 elf_x86_64_common_definition (Elf_Internal_Sym
*sym
)
6600 return (sym
->st_shndx
== SHN_COMMON
6601 || sym
->st_shndx
== SHN_X86_64_LCOMMON
);
6605 elf_x86_64_common_section_index (asection
*sec
)
6607 if ((elf_section_flags (sec
) & SHF_X86_64_LARGE
) == 0)
6610 return SHN_X86_64_LCOMMON
;
6614 elf_x86_64_common_section (asection
*sec
)
6616 if ((elf_section_flags (sec
) & SHF_X86_64_LARGE
) == 0)
6617 return bfd_com_section_ptr
;
6619 return &_bfd_elf_large_com_section
;
6623 elf_x86_64_merge_symbol (struct elf_link_hash_entry
*h
,
6624 const Elf_Internal_Sym
*sym
,
6629 const asection
*oldsec
)
6631 /* A normal common symbol and a large common symbol result in a
6632 normal common symbol. We turn the large common symbol into a
6635 && h
->root
.type
== bfd_link_hash_common
6637 && bfd_is_com_section (*psec
)
6640 if (sym
->st_shndx
== SHN_COMMON
6641 && (elf_section_flags (oldsec
) & SHF_X86_64_LARGE
) != 0)
6643 h
->root
.u
.c
.p
->section
6644 = bfd_make_section_old_way (oldbfd
, "COMMON");
6645 h
->root
.u
.c
.p
->section
->flags
= SEC_ALLOC
;
6647 else if (sym
->st_shndx
== SHN_X86_64_LCOMMON
6648 && (elf_section_flags (oldsec
) & SHF_X86_64_LARGE
) == 0)
6649 *psec
= bfd_com_section_ptr
;
6656 elf_x86_64_additional_program_headers (bfd
*abfd
,
6657 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
6662 /* Check to see if we need a large readonly segment. */
6663 s
= bfd_get_section_by_name (abfd
, ".lrodata");
6664 if (s
&& (s
->flags
& SEC_LOAD
))
6667 /* Check to see if we need a large data segment. Since .lbss sections
6668 is placed right after the .bss section, there should be no need for
6669 a large data segment just because of .lbss. */
6670 s
= bfd_get_section_by_name (abfd
, ".ldata");
6671 if (s
&& (s
->flags
& SEC_LOAD
))
6677 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
6680 elf_x86_64_hash_symbol (struct elf_link_hash_entry
*h
)
6682 if (h
->plt
.offset
!= (bfd_vma
) -1
6684 && !h
->pointer_equality_needed
)
6687 return _bfd_elf_hash_symbol (h
);
6690 /* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
6693 elf_x86_64_relocs_compatible (const bfd_target
*input
,
6694 const bfd_target
*output
)
6696 return ((xvec_get_elf_backend_data (input
)->s
->elfclass
6697 == xvec_get_elf_backend_data (output
)->s
->elfclass
)
6698 && _bfd_elf_relocs_compatible (input
, output
));
6701 static const struct bfd_elf_special_section
6702 elf_x86_64_special_sections
[]=
6704 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS
, SHF_ALLOC
+ SHF_WRITE
+ SHF_X86_64_LARGE
},
6705 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS
, SHF_ALLOC
+ SHF_X86_64_LARGE
},
6706 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS
, SHF_ALLOC
+ SHF_EXECINSTR
+ SHF_X86_64_LARGE
},
6707 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS
, SHF_ALLOC
+ SHF_WRITE
+ SHF_X86_64_LARGE
},
6708 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
+ SHF_X86_64_LARGE
},
6709 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS
, SHF_ALLOC
+ SHF_X86_64_LARGE
},
6710 { NULL
, 0, 0, 0, 0 }
6713 #define TARGET_LITTLE_SYM x86_64_elf64_vec
6714 #define TARGET_LITTLE_NAME "elf64-x86-64"
6715 #define ELF_ARCH bfd_arch_i386
6716 #define ELF_TARGET_ID X86_64_ELF_DATA
6717 #define ELF_MACHINE_CODE EM_X86_64
6718 #define ELF_MAXPAGESIZE 0x200000
6719 #define ELF_MINPAGESIZE 0x1000
6720 #define ELF_COMMONPAGESIZE 0x1000
6722 #define elf_backend_can_gc_sections 1
6723 #define elf_backend_can_refcount 1
6724 #define elf_backend_want_got_plt 1
6725 #define elf_backend_plt_readonly 1
6726 #define elf_backend_want_plt_sym 0
6727 #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
6728 #define elf_backend_rela_normal 1
6729 #define elf_backend_plt_alignment 4
6730 #define elf_backend_extern_protected_data 1
6731 #define elf_backend_caches_rawsize 1
6732 #define elf_backend_dtrel_excludes_plt 1
6733 #define elf_backend_want_dynrelro 1
6735 #define elf_info_to_howto elf_x86_64_info_to_howto
6737 #define bfd_elf64_bfd_link_hash_table_create \
6738 elf_x86_64_link_hash_table_create
6739 #define bfd_elf64_bfd_reloc_type_lookup elf_x86_64_reloc_type_lookup
6740 #define bfd_elf64_bfd_reloc_name_lookup \
6741 elf_x86_64_reloc_name_lookup
6743 #define elf_backend_adjust_dynamic_symbol elf_x86_64_adjust_dynamic_symbol
6744 #define elf_backend_relocs_compatible elf_x86_64_relocs_compatible
6745 #define elf_backend_check_relocs elf_x86_64_check_relocs
6746 #define elf_backend_copy_indirect_symbol elf_x86_64_copy_indirect_symbol
6747 #define elf_backend_create_dynamic_sections elf_x86_64_create_dynamic_sections
6748 #define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
6749 #define elf_backend_finish_dynamic_symbol elf_x86_64_finish_dynamic_symbol
6750 #define elf_backend_output_arch_local_syms elf_x86_64_output_arch_local_syms
6751 #define elf_backend_gc_mark_hook elf_x86_64_gc_mark_hook
6752 #define elf_backend_grok_prstatus elf_x86_64_grok_prstatus
6753 #define elf_backend_grok_psinfo elf_x86_64_grok_psinfo
6755 #define elf_backend_write_core_note elf_x86_64_write_core_note
6757 #define elf_backend_reloc_type_class elf_x86_64_reloc_type_class
6758 #define elf_backend_relocate_section elf_x86_64_relocate_section
6759 #define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections
6760 #define elf_backend_always_size_sections elf_x86_64_always_size_sections
6761 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
6762 #define elf_backend_object_p elf64_x86_64_elf_object_p
6763 #define bfd_elf64_mkobject elf_x86_64_mkobject
6764 #define bfd_elf64_get_synthetic_symtab elf_x86_64_get_synthetic_symtab
6766 #define elf_backend_section_from_shdr \
6767 elf_x86_64_section_from_shdr
6769 #define elf_backend_section_from_bfd_section \
6770 elf_x86_64_elf_section_from_bfd_section
6771 #define elf_backend_add_symbol_hook \
6772 elf_x86_64_add_symbol_hook
6773 #define elf_backend_symbol_processing \
6774 elf_x86_64_symbol_processing
6775 #define elf_backend_common_section_index \
6776 elf_x86_64_common_section_index
6777 #define elf_backend_common_section \
6778 elf_x86_64_common_section
6779 #define elf_backend_common_definition \
6780 elf_x86_64_common_definition
6781 #define elf_backend_merge_symbol \
6782 elf_x86_64_merge_symbol
6783 #define elf_backend_special_sections \
6784 elf_x86_64_special_sections
6785 #define elf_backend_additional_program_headers \
6786 elf_x86_64_additional_program_headers
6787 #define elf_backend_hash_symbol \
6788 elf_x86_64_hash_symbol
6789 #define elf_backend_omit_section_dynsym \
6790 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
6791 #define elf_backend_fixup_symbol \
6792 elf_x86_64_fixup_symbol
6794 #include "elf64-target.h"
6796 /* CloudABI support. */
6798 #undef TARGET_LITTLE_SYM
6799 #define TARGET_LITTLE_SYM x86_64_elf64_cloudabi_vec
6800 #undef TARGET_LITTLE_NAME
6801 #define TARGET_LITTLE_NAME "elf64-x86-64-cloudabi"
6804 #define ELF_OSABI ELFOSABI_CLOUDABI
6807 #define elf64_bed elf64_x86_64_cloudabi_bed
6809 #include "elf64-target.h"
6811 /* FreeBSD support. */
6813 #undef TARGET_LITTLE_SYM
6814 #define TARGET_LITTLE_SYM x86_64_elf64_fbsd_vec
6815 #undef TARGET_LITTLE_NAME
6816 #define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
6819 #define ELF_OSABI ELFOSABI_FREEBSD
6822 #define elf64_bed elf64_x86_64_fbsd_bed
6824 #include "elf64-target.h"
6826 /* Solaris 2 support. */
6828 #undef TARGET_LITTLE_SYM
6829 #define TARGET_LITTLE_SYM x86_64_elf64_sol2_vec
6830 #undef TARGET_LITTLE_NAME
6831 #define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
6833 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
6834 objects won't be recognized. */
6838 #define elf64_bed elf64_x86_64_sol2_bed
6840 /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
6842 #undef elf_backend_static_tls_alignment
6843 #define elf_backend_static_tls_alignment 16
6845 /* The Solaris 2 ABI requires a plt symbol on all platforms.
6847 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
6849 #undef elf_backend_want_plt_sym
6850 #define elf_backend_want_plt_sym 1
6852 #undef elf_backend_strtab_flags
6853 #define elf_backend_strtab_flags SHF_STRINGS
6856 elf64_x86_64_copy_solaris_special_section_fields (const bfd
*ibfd ATTRIBUTE_UNUSED
,
6857 bfd
*obfd ATTRIBUTE_UNUSED
,
6858 const Elf_Internal_Shdr
*isection ATTRIBUTE_UNUSED
,
6859 Elf_Internal_Shdr
*osection ATTRIBUTE_UNUSED
)
6861 /* PR 19938: FIXME: Need to add code for setting the sh_info
6862 and sh_link fields of Solaris specific section types. */
6866 #undef elf_backend_copy_special_section_fields
6867 #define elf_backend_copy_special_section_fields elf64_x86_64_copy_solaris_special_section_fields
6869 #include "elf64-target.h"
6871 /* Native Client support. */
6874 elf64_x86_64_nacl_elf_object_p (bfd
*abfd
)
6876 /* Set the right machine number for a NaCl x86-64 ELF64 file. */
6877 bfd_default_set_arch_mach (abfd
, bfd_arch_i386
, bfd_mach_x86_64_nacl
);
6881 #undef TARGET_LITTLE_SYM
6882 #define TARGET_LITTLE_SYM x86_64_elf64_nacl_vec
6883 #undef TARGET_LITTLE_NAME
6884 #define TARGET_LITTLE_NAME "elf64-x86-64-nacl"
6886 #define elf64_bed elf64_x86_64_nacl_bed
6888 #undef ELF_MAXPAGESIZE
6889 #undef ELF_MINPAGESIZE
6890 #undef ELF_COMMONPAGESIZE
6891 #define ELF_MAXPAGESIZE 0x10000
6892 #define ELF_MINPAGESIZE 0x10000
6893 #define ELF_COMMONPAGESIZE 0x10000
6895 /* Restore defaults. */
6897 #undef elf_backend_static_tls_alignment
6898 #undef elf_backend_want_plt_sym
6899 #define elf_backend_want_plt_sym 0
6900 #undef elf_backend_strtab_flags
6901 #undef elf_backend_copy_special_section_fields
6903 /* NaCl uses substantially different PLT entries for the same effects. */
6905 #undef elf_backend_plt_alignment
6906 #define elf_backend_plt_alignment 5
6907 #define NACL_PLT_ENTRY_SIZE 64
6908 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
6910 static const bfd_byte elf_x86_64_nacl_plt0_entry
[NACL_PLT_ENTRY_SIZE
] =
6912 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
6913 0x4c, 0x8b, 0x1d, 16, 0, 0, 0, /* mov GOT+16(%rip), %r11 */
6914 0x41, 0x83, 0xe3, NACLMASK
, /* and $-32, %r11d */
6915 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
6916 0x41, 0xff, 0xe3, /* jmpq *%r11 */
6918 /* 9-byte nop sequence to pad out to the next 32-byte boundary. */
6919 0x66, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw 0x0(%rax,%rax,1) */
6921 /* 32 bytes of nop to pad out to the standard size. */
6922 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data16 prefixes */
6923 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6924 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data16 prefixes */
6925 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6926 0x66, /* excess data16 prefix */
6930 static const bfd_byte elf_x86_64_nacl_plt_entry
[NACL_PLT_ENTRY_SIZE
] =
6932 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, /* mov name@GOTPCREL(%rip),%r11 */
6933 0x41, 0x83, 0xe3, NACLMASK
, /* and $-32, %r11d */
6934 0x4d, 0x01, 0xfb, /* add %r15, %r11 */
6935 0x41, 0xff, 0xe3, /* jmpq *%r11 */
6937 /* 15-byte nop sequence to pad out to the next 32-byte boundary. */
6938 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data16 prefixes */
6939 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6941 /* Lazy GOT entries point here (32-byte aligned). */
6942 0x68, /* pushq immediate */
6943 0, 0, 0, 0, /* replaced with index into relocation table. */
6944 0xe9, /* jmp relative */
6945 0, 0, 0, 0, /* replaced with offset to start of .plt0. */
6947 /* 22 bytes of nop to pad out to the standard size. */
6948 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data16 prefixes */
6949 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */
6950 0x0f, 0x1f, 0x80, 0, 0, 0, 0, /* nopl 0x0(%rax) */
6953 /* .eh_frame covering the .plt section. */
6955 static const bfd_byte elf_x86_64_nacl_eh_frame_plt
[] =
6957 #if (PLT_CIE_LENGTH != 20 \
6958 || PLT_FDE_LENGTH != 36 \
6959 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
6960 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
6961 # error "Need elf_x86_64_backend_data parameters for eh_frame_plt offsets!"
6963 PLT_CIE_LENGTH
, 0, 0, 0, /* CIE length */
6964 0, 0, 0, 0, /* CIE ID */
6965 1, /* CIE version */
6966 'z', 'R', 0, /* Augmentation string */
6967 1, /* Code alignment factor */
6968 0x78, /* Data alignment factor */
6969 16, /* Return address column */
6970 1, /* Augmentation size */
6971 DW_EH_PE_pcrel
| DW_EH_PE_sdata4
, /* FDE encoding */
6972 DW_CFA_def_cfa
, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
6973 DW_CFA_offset
+ 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
6974 DW_CFA_nop
, DW_CFA_nop
,
6976 PLT_FDE_LENGTH
, 0, 0, 0, /* FDE length */
6977 PLT_CIE_LENGTH
+ 8, 0, 0, 0,/* CIE pointer */
6978 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
6979 0, 0, 0, 0, /* .plt size goes here */
6980 0, /* Augmentation size */
6981 DW_CFA_def_cfa_offset
, 16, /* DW_CFA_def_cfa_offset: 16 */
6982 DW_CFA_advance_loc
+ 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
6983 DW_CFA_def_cfa_offset
, 24, /* DW_CFA_def_cfa_offset: 24 */
6984 DW_CFA_advance_loc
+ 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
6985 DW_CFA_def_cfa_expression
, /* DW_CFA_def_cfa_expression */
6986 13, /* Block length */
6987 DW_OP_breg7
, 8, /* DW_OP_breg7 (rsp): 8 */
6988 DW_OP_breg16
, 0, /* DW_OP_breg16 (rip): 0 */
6989 DW_OP_const1u
, 63, DW_OP_and
, DW_OP_const1u
, 37, DW_OP_ge
,
6990 DW_OP_lit3
, DW_OP_shl
, DW_OP_plus
,
6991 DW_CFA_nop
, DW_CFA_nop
6994 static const struct elf_x86_64_backend_data elf_x86_64_nacl_arch_bed
=
6996 elf_x86_64_nacl_plt0_entry
, /* plt0_entry */
6997 elf_x86_64_nacl_plt_entry
, /* plt_entry */
6998 NACL_PLT_ENTRY_SIZE
, /* plt_entry_size */
6999 2, /* plt0_got1_offset */
7000 9, /* plt0_got2_offset */
7001 13, /* plt0_got2_insn_end */
7002 3, /* plt_got_offset */
7003 33, /* plt_reloc_offset */
7004 38, /* plt_plt_offset */
7005 7, /* plt_got_insn_size */
7006 42, /* plt_plt_insn_end */
7007 32, /* plt_lazy_offset */
7008 elf_x86_64_nacl_eh_frame_plt
, /* eh_frame_plt */
7009 sizeof (elf_x86_64_nacl_eh_frame_plt
), /* eh_frame_plt_size */
7012 #undef elf_backend_arch_data
7013 #define elf_backend_arch_data &elf_x86_64_nacl_arch_bed
7015 #undef elf_backend_object_p
7016 #define elf_backend_object_p elf64_x86_64_nacl_elf_object_p
7017 #undef elf_backend_modify_segment_map
7018 #define elf_backend_modify_segment_map nacl_modify_segment_map
7019 #undef elf_backend_modify_program_headers
7020 #define elf_backend_modify_program_headers nacl_modify_program_headers
7021 #undef elf_backend_final_write_processing
7022 #define elf_backend_final_write_processing nacl_final_write_processing
7024 #include "elf64-target.h"
7026 /* Native Client x32 support. */
7029 elf32_x86_64_nacl_elf_object_p (bfd
*abfd
)
7031 /* Set the right machine number for a NaCl x86-64 ELF32 file. */
7032 bfd_default_set_arch_mach (abfd
, bfd_arch_i386
, bfd_mach_x64_32_nacl
);
7036 #undef TARGET_LITTLE_SYM
7037 #define TARGET_LITTLE_SYM x86_64_elf32_nacl_vec
7038 #undef TARGET_LITTLE_NAME
7039 #define TARGET_LITTLE_NAME "elf32-x86-64-nacl"
7041 #define elf32_bed elf32_x86_64_nacl_bed
7043 #define bfd_elf32_bfd_link_hash_table_create \
7044 elf_x86_64_link_hash_table_create
7045 #define bfd_elf32_bfd_reloc_type_lookup \
7046 elf_x86_64_reloc_type_lookup
7047 #define bfd_elf32_bfd_reloc_name_lookup \
7048 elf_x86_64_reloc_name_lookup
7049 #define bfd_elf32_mkobject \
7051 #define bfd_elf32_get_synthetic_symtab \
7052 elf_x86_64_get_synthetic_symtab
7054 #undef elf_backend_object_p
7055 #define elf_backend_object_p \
7056 elf32_x86_64_nacl_elf_object_p
7058 #undef elf_backend_bfd_from_remote_memory
7059 #define elf_backend_bfd_from_remote_memory \
7060 _bfd_elf32_bfd_from_remote_memory
7062 #undef elf_backend_size_info
7063 #define elf_backend_size_info \
7064 _bfd_elf32_size_info
7066 #include "elf32-target.h"
7068 /* Restore defaults. */
7069 #undef elf_backend_object_p
7070 #define elf_backend_object_p elf64_x86_64_elf_object_p
7071 #undef elf_backend_bfd_from_remote_memory
7072 #undef elf_backend_size_info
7073 #undef elf_backend_modify_segment_map
7074 #undef elf_backend_modify_program_headers
7075 #undef elf_backend_final_write_processing
7077 /* Intel L1OM support. */
7080 elf64_l1om_elf_object_p (bfd
*abfd
)
7082 /* Set the right machine number for an L1OM elf64 file. */
7083 bfd_default_set_arch_mach (abfd
, bfd_arch_l1om
, bfd_mach_l1om
);
7087 #undef TARGET_LITTLE_SYM
7088 #define TARGET_LITTLE_SYM l1om_elf64_vec
7089 #undef TARGET_LITTLE_NAME
7090 #define TARGET_LITTLE_NAME "elf64-l1om"
7092 #define ELF_ARCH bfd_arch_l1om
7094 #undef ELF_MACHINE_CODE
7095 #define ELF_MACHINE_CODE EM_L1OM
7100 #define elf64_bed elf64_l1om_bed
7102 #undef elf_backend_object_p
7103 #define elf_backend_object_p elf64_l1om_elf_object_p
7105 /* Restore defaults. */
7106 #undef ELF_MAXPAGESIZE
7107 #undef ELF_MINPAGESIZE
7108 #undef ELF_COMMONPAGESIZE
7109 #define ELF_MAXPAGESIZE 0x200000
7110 #define ELF_MINPAGESIZE 0x1000
7111 #define ELF_COMMONPAGESIZE 0x1000
7112 #undef elf_backend_plt_alignment
7113 #define elf_backend_plt_alignment 4
7114 #undef elf_backend_arch_data
7115 #define elf_backend_arch_data &elf_x86_64_arch_bed
7117 #include "elf64-target.h"
7119 /* FreeBSD L1OM support. */
7121 #undef TARGET_LITTLE_SYM
7122 #define TARGET_LITTLE_SYM l1om_elf64_fbsd_vec
7123 #undef TARGET_LITTLE_NAME
7124 #define TARGET_LITTLE_NAME "elf64-l1om-freebsd"
7127 #define ELF_OSABI ELFOSABI_FREEBSD
7130 #define elf64_bed elf64_l1om_fbsd_bed
7132 #include "elf64-target.h"
7134 /* Intel K1OM support. */
7137 elf64_k1om_elf_object_p (bfd
*abfd
)
7139 /* Set the right machine number for an K1OM elf64 file. */
7140 bfd_default_set_arch_mach (abfd
, bfd_arch_k1om
, bfd_mach_k1om
);
7144 #undef TARGET_LITTLE_SYM
7145 #define TARGET_LITTLE_SYM k1om_elf64_vec
7146 #undef TARGET_LITTLE_NAME
7147 #define TARGET_LITTLE_NAME "elf64-k1om"
7149 #define ELF_ARCH bfd_arch_k1om
7151 #undef ELF_MACHINE_CODE
7152 #define ELF_MACHINE_CODE EM_K1OM
7157 #define elf64_bed elf64_k1om_bed
7159 #undef elf_backend_object_p
7160 #define elf_backend_object_p elf64_k1om_elf_object_p
7162 #undef elf_backend_static_tls_alignment
7164 #undef elf_backend_want_plt_sym
7165 #define elf_backend_want_plt_sym 0
7167 #include "elf64-target.h"
7169 /* FreeBSD K1OM support. */
7171 #undef TARGET_LITTLE_SYM
7172 #define TARGET_LITTLE_SYM k1om_elf64_fbsd_vec
7173 #undef TARGET_LITTLE_NAME
7174 #define TARGET_LITTLE_NAME "elf64-k1om-freebsd"
7177 #define ELF_OSABI ELFOSABI_FREEBSD
7180 #define elf64_bed elf64_k1om_fbsd_bed
7182 #include "elf64-target.h"
7184 /* 32bit x86-64 support. */
7186 #undef TARGET_LITTLE_SYM
7187 #define TARGET_LITTLE_SYM x86_64_elf32_vec
7188 #undef TARGET_LITTLE_NAME
7189 #define TARGET_LITTLE_NAME "elf32-x86-64"
7193 #define ELF_ARCH bfd_arch_i386
7195 #undef ELF_MACHINE_CODE
7196 #define ELF_MACHINE_CODE EM_X86_64
7200 #undef elf_backend_object_p
7201 #define elf_backend_object_p \
7202 elf32_x86_64_elf_object_p
7204 #undef elf_backend_bfd_from_remote_memory
7205 #define elf_backend_bfd_from_remote_memory \
7206 _bfd_elf32_bfd_from_remote_memory
7208 #undef elf_backend_size_info
7209 #define elf_backend_size_info \
7210 _bfd_elf32_size_info
7212 #include "elf32-target.h"