1 /* X86-64 specific support for 64-bit ELF
2 Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Contributed by Jan Hubicka <jh@suse.cz>.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
28 #include "bfd_stdint.h"
30 #include "elf/x86-64.h"
32 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
33 #define MINUS_ONE (~ (bfd_vma) 0)
35 /* The relocation "howto" table. Order of fields:
36 type, rightshift, size, bitsize, pc_relative, bitpos, complain_on_overflow,
37 special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset. */
38 static reloc_howto_type x86_64_elf_howto_table
[] =
40 HOWTO(R_X86_64_NONE
, 0, 0, 0, FALSE
, 0, complain_overflow_dont
,
41 bfd_elf_generic_reloc
, "R_X86_64_NONE", FALSE
, 0x00000000, 0x00000000,
43 HOWTO(R_X86_64_64
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
44 bfd_elf_generic_reloc
, "R_X86_64_64", FALSE
, MINUS_ONE
, MINUS_ONE
,
46 HOWTO(R_X86_64_PC32
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
47 bfd_elf_generic_reloc
, "R_X86_64_PC32", FALSE
, 0xffffffff, 0xffffffff,
49 HOWTO(R_X86_64_GOT32
, 0, 2, 32, FALSE
, 0, complain_overflow_signed
,
50 bfd_elf_generic_reloc
, "R_X86_64_GOT32", FALSE
, 0xffffffff, 0xffffffff,
52 HOWTO(R_X86_64_PLT32
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
53 bfd_elf_generic_reloc
, "R_X86_64_PLT32", FALSE
, 0xffffffff, 0xffffffff,
55 HOWTO(R_X86_64_COPY
, 0, 2, 32, FALSE
, 0, complain_overflow_bitfield
,
56 bfd_elf_generic_reloc
, "R_X86_64_COPY", FALSE
, 0xffffffff, 0xffffffff,
58 HOWTO(R_X86_64_GLOB_DAT
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
59 bfd_elf_generic_reloc
, "R_X86_64_GLOB_DAT", FALSE
, MINUS_ONE
,
61 HOWTO(R_X86_64_JUMP_SLOT
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
62 bfd_elf_generic_reloc
, "R_X86_64_JUMP_SLOT", FALSE
, MINUS_ONE
,
64 HOWTO(R_X86_64_RELATIVE
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
65 bfd_elf_generic_reloc
, "R_X86_64_RELATIVE", FALSE
, MINUS_ONE
,
67 HOWTO(R_X86_64_GOTPCREL
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
68 bfd_elf_generic_reloc
, "R_X86_64_GOTPCREL", FALSE
, 0xffffffff,
70 HOWTO(R_X86_64_32
, 0, 2, 32, FALSE
, 0, complain_overflow_unsigned
,
71 bfd_elf_generic_reloc
, "R_X86_64_32", FALSE
, 0xffffffff, 0xffffffff,
73 HOWTO(R_X86_64_32S
, 0, 2, 32, FALSE
, 0, complain_overflow_signed
,
74 bfd_elf_generic_reloc
, "R_X86_64_32S", FALSE
, 0xffffffff, 0xffffffff,
76 HOWTO(R_X86_64_16
, 0, 1, 16, FALSE
, 0, complain_overflow_bitfield
,
77 bfd_elf_generic_reloc
, "R_X86_64_16", FALSE
, 0xffff, 0xffff, FALSE
),
78 HOWTO(R_X86_64_PC16
,0, 1, 16, TRUE
, 0, complain_overflow_bitfield
,
79 bfd_elf_generic_reloc
, "R_X86_64_PC16", FALSE
, 0xffff, 0xffff, TRUE
),
80 HOWTO(R_X86_64_8
, 0, 0, 8, FALSE
, 0, complain_overflow_bitfield
,
81 bfd_elf_generic_reloc
, "R_X86_64_8", FALSE
, 0xff, 0xff, FALSE
),
82 HOWTO(R_X86_64_PC8
, 0, 0, 8, TRUE
, 0, complain_overflow_signed
,
83 bfd_elf_generic_reloc
, "R_X86_64_PC8", FALSE
, 0xff, 0xff, TRUE
),
84 HOWTO(R_X86_64_DTPMOD64
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
85 bfd_elf_generic_reloc
, "R_X86_64_DTPMOD64", FALSE
, MINUS_ONE
,
87 HOWTO(R_X86_64_DTPOFF64
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
88 bfd_elf_generic_reloc
, "R_X86_64_DTPOFF64", FALSE
, MINUS_ONE
,
90 HOWTO(R_X86_64_TPOFF64
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
91 bfd_elf_generic_reloc
, "R_X86_64_TPOFF64", FALSE
, MINUS_ONE
,
93 HOWTO(R_X86_64_TLSGD
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
94 bfd_elf_generic_reloc
, "R_X86_64_TLSGD", FALSE
, 0xffffffff,
96 HOWTO(R_X86_64_TLSLD
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
97 bfd_elf_generic_reloc
, "R_X86_64_TLSLD", FALSE
, 0xffffffff,
99 HOWTO(R_X86_64_DTPOFF32
, 0, 2, 32, FALSE
, 0, complain_overflow_signed
,
100 bfd_elf_generic_reloc
, "R_X86_64_DTPOFF32", FALSE
, 0xffffffff,
102 HOWTO(R_X86_64_GOTTPOFF
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
103 bfd_elf_generic_reloc
, "R_X86_64_GOTTPOFF", FALSE
, 0xffffffff,
105 HOWTO(R_X86_64_TPOFF32
, 0, 2, 32, FALSE
, 0, complain_overflow_signed
,
106 bfd_elf_generic_reloc
, "R_X86_64_TPOFF32", FALSE
, 0xffffffff,
108 HOWTO(R_X86_64_PC64
, 0, 4, 64, TRUE
, 0, complain_overflow_bitfield
,
109 bfd_elf_generic_reloc
, "R_X86_64_PC64", FALSE
, MINUS_ONE
, MINUS_ONE
,
111 HOWTO(R_X86_64_GOTOFF64
, 0, 4, 64, FALSE
, 0, complain_overflow_bitfield
,
112 bfd_elf_generic_reloc
, "R_X86_64_GOTOFF64",
113 FALSE
, MINUS_ONE
, MINUS_ONE
, FALSE
),
114 HOWTO(R_X86_64_GOTPC32
, 0, 2, 32, TRUE
, 0, complain_overflow_signed
,
115 bfd_elf_generic_reloc
, "R_X86_64_GOTPC32",
116 FALSE
, 0xffffffff, 0xffffffff, TRUE
),
117 HOWTO(R_X86_64_GOT64
, 0, 4, 64, FALSE
, 0, complain_overflow_signed
,
118 bfd_elf_generic_reloc
, "R_X86_64_GOT64", FALSE
, MINUS_ONE
, MINUS_ONE
,
120 HOWTO(R_X86_64_GOTPCREL64
, 0, 4, 64, TRUE
, 0, complain_overflow_signed
,
121 bfd_elf_generic_reloc
, "R_X86_64_GOTPCREL64", FALSE
, MINUS_ONE
,
123 HOWTO(R_X86_64_GOTPC64
, 0, 4, 64, TRUE
, 0, complain_overflow_signed
,
124 bfd_elf_generic_reloc
, "R_X86_64_GOTPC64",
125 FALSE
, MINUS_ONE
, MINUS_ONE
, TRUE
),
126 HOWTO(R_X86_64_GOTPLT64
, 0, 4, 64, FALSE
, 0, complain_overflow_signed
,
127 bfd_elf_generic_reloc
, "R_X86_64_GOTPLT64", FALSE
, MINUS_ONE
,
129 HOWTO(R_X86_64_PLTOFF64
, 0, 4, 64, FALSE
, 0, complain_overflow_signed
,
130 bfd_elf_generic_reloc
, "R_X86_64_PLTOFF64", FALSE
, MINUS_ONE
,
134 HOWTO(R_X86_64_GOTPC32_TLSDESC
, 0, 2, 32, TRUE
, 0,
135 complain_overflow_bitfield
, bfd_elf_generic_reloc
,
136 "R_X86_64_GOTPC32_TLSDESC",
137 FALSE
, 0xffffffff, 0xffffffff, TRUE
),
138 HOWTO(R_X86_64_TLSDESC_CALL
, 0, 0, 0, FALSE
, 0,
139 complain_overflow_dont
, bfd_elf_generic_reloc
,
140 "R_X86_64_TLSDESC_CALL",
142 HOWTO(R_X86_64_TLSDESC
, 0, 4, 64, FALSE
, 0,
143 complain_overflow_bitfield
, bfd_elf_generic_reloc
,
145 FALSE
, MINUS_ONE
, MINUS_ONE
, FALSE
),
147 /* We have a gap in the reloc numbers here.
148 R_X86_64_standard counts the number up to this point, and
149 R_X86_64_vt_offset is the value to subtract from a reloc type of
150 R_X86_64_GNU_VT* to form an index into this table. */
151 #define R_X86_64_standard (R_X86_64_TLSDESC + 1)
152 #define R_X86_64_vt_offset (R_X86_64_GNU_VTINHERIT - R_X86_64_standard)
154 /* GNU extension to record C++ vtable hierarchy. */
155 HOWTO (R_X86_64_GNU_VTINHERIT
, 0, 4, 0, FALSE
, 0, complain_overflow_dont
,
156 NULL
, "R_X86_64_GNU_VTINHERIT", FALSE
, 0, 0, FALSE
),
158 /* GNU extension to record C++ vtable member usage. */
159 HOWTO (R_X86_64_GNU_VTENTRY
, 0, 4, 0, FALSE
, 0, complain_overflow_dont
,
160 _bfd_elf_rel_vtable_reloc_fn
, "R_X86_64_GNU_VTENTRY", FALSE
, 0, 0,
164 /* Map BFD relocs to the x86_64 elf relocs. */
167 bfd_reloc_code_real_type bfd_reloc_val
;
168 unsigned char elf_reloc_val
;
171 static const struct elf_reloc_map x86_64_reloc_map
[] =
173 { BFD_RELOC_NONE
, R_X86_64_NONE
, },
174 { BFD_RELOC_64
, R_X86_64_64
, },
175 { BFD_RELOC_32_PCREL
, R_X86_64_PC32
, },
176 { BFD_RELOC_X86_64_GOT32
, R_X86_64_GOT32
,},
177 { BFD_RELOC_X86_64_PLT32
, R_X86_64_PLT32
,},
178 { BFD_RELOC_X86_64_COPY
, R_X86_64_COPY
, },
179 { BFD_RELOC_X86_64_GLOB_DAT
, R_X86_64_GLOB_DAT
, },
180 { BFD_RELOC_X86_64_JUMP_SLOT
, R_X86_64_JUMP_SLOT
, },
181 { BFD_RELOC_X86_64_RELATIVE
, R_X86_64_RELATIVE
, },
182 { BFD_RELOC_X86_64_GOTPCREL
, R_X86_64_GOTPCREL
, },
183 { BFD_RELOC_32
, R_X86_64_32
, },
184 { BFD_RELOC_X86_64_32S
, R_X86_64_32S
, },
185 { BFD_RELOC_16
, R_X86_64_16
, },
186 { BFD_RELOC_16_PCREL
, R_X86_64_PC16
, },
187 { BFD_RELOC_8
, R_X86_64_8
, },
188 { BFD_RELOC_8_PCREL
, R_X86_64_PC8
, },
189 { BFD_RELOC_X86_64_DTPMOD64
, R_X86_64_DTPMOD64
, },
190 { BFD_RELOC_X86_64_DTPOFF64
, R_X86_64_DTPOFF64
, },
191 { BFD_RELOC_X86_64_TPOFF64
, R_X86_64_TPOFF64
, },
192 { BFD_RELOC_X86_64_TLSGD
, R_X86_64_TLSGD
, },
193 { BFD_RELOC_X86_64_TLSLD
, R_X86_64_TLSLD
, },
194 { BFD_RELOC_X86_64_DTPOFF32
, R_X86_64_DTPOFF32
, },
195 { BFD_RELOC_X86_64_GOTTPOFF
, R_X86_64_GOTTPOFF
, },
196 { BFD_RELOC_X86_64_TPOFF32
, R_X86_64_TPOFF32
, },
197 { BFD_RELOC_64_PCREL
, R_X86_64_PC64
, },
198 { BFD_RELOC_X86_64_GOTOFF64
, R_X86_64_GOTOFF64
, },
199 { BFD_RELOC_X86_64_GOTPC32
, R_X86_64_GOTPC32
, },
200 { BFD_RELOC_X86_64_GOT64
, R_X86_64_GOT64
, },
201 { BFD_RELOC_X86_64_GOTPCREL64
,R_X86_64_GOTPCREL64
, },
202 { BFD_RELOC_X86_64_GOTPC64
, R_X86_64_GOTPC64
, },
203 { BFD_RELOC_X86_64_GOTPLT64
, R_X86_64_GOTPLT64
, },
204 { BFD_RELOC_X86_64_PLTOFF64
, R_X86_64_PLTOFF64
, },
205 { BFD_RELOC_X86_64_GOTPC32_TLSDESC
, R_X86_64_GOTPC32_TLSDESC
, },
206 { BFD_RELOC_X86_64_TLSDESC_CALL
, R_X86_64_TLSDESC_CALL
, },
207 { BFD_RELOC_X86_64_TLSDESC
, R_X86_64_TLSDESC
, },
208 { BFD_RELOC_VTABLE_INHERIT
, R_X86_64_GNU_VTINHERIT
, },
209 { BFD_RELOC_VTABLE_ENTRY
, R_X86_64_GNU_VTENTRY
, },
212 static reloc_howto_type
*
213 elf64_x86_64_rtype_to_howto (bfd
*abfd
, unsigned r_type
)
217 if (r_type
< (unsigned int) R_X86_64_GNU_VTINHERIT
218 || r_type
>= (unsigned int) R_X86_64_max
)
220 if (r_type
>= (unsigned int) R_X86_64_standard
)
222 (*_bfd_error_handler
) (_("%B: invalid relocation type %d"),
224 r_type
= R_X86_64_NONE
;
229 i
= r_type
- (unsigned int) R_X86_64_vt_offset
;
230 BFD_ASSERT (x86_64_elf_howto_table
[i
].type
== r_type
);
231 return &x86_64_elf_howto_table
[i
];
234 /* Given a BFD reloc type, return a HOWTO structure. */
235 static reloc_howto_type
*
236 elf64_x86_64_reloc_type_lookup (bfd
*abfd
,
237 bfd_reloc_code_real_type code
)
241 for (i
= 0; i
< sizeof (x86_64_reloc_map
) / sizeof (struct elf_reloc_map
);
244 if (x86_64_reloc_map
[i
].bfd_reloc_val
== code
)
245 return elf64_x86_64_rtype_to_howto (abfd
,
246 x86_64_reloc_map
[i
].elf_reloc_val
);
251 static reloc_howto_type
*
252 elf64_x86_64_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
258 i
< (sizeof (x86_64_elf_howto_table
)
259 / sizeof (x86_64_elf_howto_table
[0]));
261 if (x86_64_elf_howto_table
[i
].name
!= NULL
262 && strcasecmp (x86_64_elf_howto_table
[i
].name
, r_name
) == 0)
263 return &x86_64_elf_howto_table
[i
];
268 /* Given an x86_64 ELF reloc type, fill in an arelent structure. */
271 elf64_x86_64_info_to_howto (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*cache_ptr
,
272 Elf_Internal_Rela
*dst
)
276 r_type
= ELF64_R_TYPE (dst
->r_info
);
277 cache_ptr
->howto
= elf64_x86_64_rtype_to_howto (abfd
, r_type
);
278 BFD_ASSERT (r_type
== cache_ptr
->howto
->type
);
281 /* Support for core dump NOTE sections. */
283 elf64_x86_64_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
288 switch (note
->descsz
)
293 case 336: /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
295 elf_tdata (abfd
)->core_signal
296 = bfd_get_16 (abfd
, note
->descdata
+ 12);
299 elf_tdata (abfd
)->core_pid
300 = bfd_get_32 (abfd
, note
->descdata
+ 32);
309 /* Make a ".reg/999" section. */
310 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
311 size
, note
->descpos
+ offset
);
315 elf64_x86_64_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
317 switch (note
->descsz
)
322 case 136: /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
323 elf_tdata (abfd
)->core_program
324 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 40, 16);
325 elf_tdata (abfd
)->core_command
326 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 56, 80);
329 /* Note that for some reason, a spurious space is tacked
330 onto the end of the args in some (at least one anyway)
331 implementations, so strip it off if it exists. */
334 char *command
= elf_tdata (abfd
)->core_command
;
335 int n
= strlen (command
);
337 if (0 < n
&& command
[n
- 1] == ' ')
338 command
[n
- 1] = '\0';
344 /* Functions for the x86-64 ELF linker. */
346 /* The name of the dynamic interpreter. This is put in the .interp
349 #define ELF_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
351 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
352 copying dynamic variables from a shared lib into an app's dynbss
353 section, and instead use a dynamic relocation to point into the
355 #define ELIMINATE_COPY_RELOCS 1
357 /* The size in bytes of an entry in the global offset table. */
359 #define GOT_ENTRY_SIZE 8
361 /* The size in bytes of an entry in the procedure linkage table. */
363 #define PLT_ENTRY_SIZE 16
365 /* The first entry in a procedure linkage table looks like this. See the
366 SVR4 ABI i386 supplement and the x86-64 ABI to see how this works. */
368 static const bfd_byte elf64_x86_64_plt0_entry
[PLT_ENTRY_SIZE
] =
370 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
371 0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */
372 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */
375 /* Subsequent entries in a procedure linkage table look like this. */
377 static const bfd_byte elf64_x86_64_plt_entry
[PLT_ENTRY_SIZE
] =
379 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
380 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
381 0x68, /* pushq immediate */
382 0, 0, 0, 0, /* replaced with index into relocation table. */
383 0xe9, /* jmp relative */
384 0, 0, 0, 0 /* replaced with offset to start of .plt0. */
387 /* The x86-64 linker needs to keep track of the number of relocs that
388 it decides to copy as dynamic relocs in check_relocs for each symbol.
389 This is so that it can later discard them if they are found to be
390 unnecessary. We store the information in a field extending the
391 regular ELF linker hash table. */
393 struct elf64_x86_64_dyn_relocs
396 struct elf64_x86_64_dyn_relocs
*next
;
398 /* The input section of the reloc. */
401 /* Total number of relocs copied for the input section. */
404 /* Number of pc-relative relocs copied for the input section. */
405 bfd_size_type pc_count
;
408 /* x86-64 ELF linker hash entry. */
410 struct elf64_x86_64_link_hash_entry
412 struct elf_link_hash_entry elf
;
414 /* Track dynamic relocs copied for this symbol. */
415 struct elf64_x86_64_dyn_relocs
*dyn_relocs
;
417 #define GOT_UNKNOWN 0
421 #define GOT_TLS_GDESC 4
422 #define GOT_TLS_GD_BOTH_P(type) \
423 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
424 #define GOT_TLS_GD_P(type) \
425 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
426 #define GOT_TLS_GDESC_P(type) \
427 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
428 #define GOT_TLS_GD_ANY_P(type) \
429 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
430 unsigned char tls_type
;
432 /* Offset of the GOTPLT entry reserved for the TLS descriptor,
433 starting at the end of the jump table. */
437 #define elf64_x86_64_hash_entry(ent) \
438 ((struct elf64_x86_64_link_hash_entry *)(ent))
440 struct elf64_x86_64_obj_tdata
442 struct elf_obj_tdata root
;
444 /* tls_type for each local got entry. */
445 char *local_got_tls_type
;
447 /* GOTPLT entries for TLS descriptors. */
448 bfd_vma
*local_tlsdesc_gotent
;
451 #define elf64_x86_64_tdata(abfd) \
452 ((struct elf64_x86_64_obj_tdata *) (abfd)->tdata.any)
454 #define elf64_x86_64_local_got_tls_type(abfd) \
455 (elf64_x86_64_tdata (abfd)->local_got_tls_type)
457 #define elf64_x86_64_local_tlsdesc_gotent(abfd) \
458 (elf64_x86_64_tdata (abfd)->local_tlsdesc_gotent)
460 #define is_x86_64_elf(bfd) \
461 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
462 && elf_tdata (bfd) != NULL \
463 && elf_object_id (bfd) == X86_64_ELF_TDATA)
466 elf64_x86_64_mkobject (bfd
*abfd
)
468 return bfd_elf_allocate_object (abfd
, sizeof (struct elf64_x86_64_obj_tdata
),
472 /* x86-64 ELF linker hash table. */
474 struct elf64_x86_64_link_hash_table
476 struct elf_link_hash_table elf
;
478 /* Short-cuts to get to dynamic linker sections. */
487 /* The offset into splt of the PLT entry for the TLS descriptor
488 resolver. Special values are 0, if not necessary (or not found
489 to be necessary yet), and -1 if needed but not determined
492 /* The offset into sgot of the GOT entry used by the PLT entry
497 bfd_signed_vma refcount
;
501 /* The amount of space used by the jump slots in the GOT. */
502 bfd_vma sgotplt_jump_table_size
;
504 /* Small local sym to section mapping cache. */
505 struct sym_sec_cache sym_sec
;
507 /* _TLS_MODULE_BASE_ symbol. */
508 struct bfd_link_hash_entry
*tls_module_base
;
511 /* Get the x86-64 ELF linker hash table from a link_info structure. */
513 #define elf64_x86_64_hash_table(p) \
514 ((struct elf64_x86_64_link_hash_table *) ((p)->hash))
516 #define elf64_x86_64_compute_jump_table_size(htab) \
517 ((htab)->srelplt->reloc_count * GOT_ENTRY_SIZE)
519 /* Create an entry in an x86-64 ELF linker hash table. */
521 static struct bfd_hash_entry
*
522 link_hash_newfunc (struct bfd_hash_entry
*entry
, struct bfd_hash_table
*table
,
525 /* Allocate the structure if it has not already been allocated by a
529 entry
= bfd_hash_allocate (table
,
530 sizeof (struct elf64_x86_64_link_hash_entry
));
535 /* Call the allocation method of the superclass. */
536 entry
= _bfd_elf_link_hash_newfunc (entry
, table
, string
);
539 struct elf64_x86_64_link_hash_entry
*eh
;
541 eh
= (struct elf64_x86_64_link_hash_entry
*) entry
;
542 eh
->dyn_relocs
= NULL
;
543 eh
->tls_type
= GOT_UNKNOWN
;
544 eh
->tlsdesc_got
= (bfd_vma
) -1;
550 /* Create an X86-64 ELF linker hash table. */
552 static struct bfd_link_hash_table
*
553 elf64_x86_64_link_hash_table_create (bfd
*abfd
)
555 struct elf64_x86_64_link_hash_table
*ret
;
556 bfd_size_type amt
= sizeof (struct elf64_x86_64_link_hash_table
);
558 ret
= (struct elf64_x86_64_link_hash_table
*) bfd_malloc (amt
);
562 if (!_bfd_elf_link_hash_table_init (&ret
->elf
, abfd
, link_hash_newfunc
,
563 sizeof (struct elf64_x86_64_link_hash_entry
)))
576 ret
->sym_sec
.abfd
= NULL
;
577 ret
->tlsdesc_plt
= 0;
578 ret
->tlsdesc_got
= 0;
579 ret
->tls_ld_got
.refcount
= 0;
580 ret
->sgotplt_jump_table_size
= 0;
581 ret
->tls_module_base
= NULL
;
583 return &ret
->elf
.root
;
586 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
587 shortcuts to them in our hash table. */
590 create_got_section (bfd
*dynobj
, struct bfd_link_info
*info
)
592 struct elf64_x86_64_link_hash_table
*htab
;
594 if (! _bfd_elf_create_got_section (dynobj
, info
))
597 htab
= elf64_x86_64_hash_table (info
);
598 htab
->sgot
= bfd_get_section_by_name (dynobj
, ".got");
599 htab
->sgotplt
= bfd_get_section_by_name (dynobj
, ".got.plt");
600 if (!htab
->sgot
|| !htab
->sgotplt
)
603 htab
->srelgot
= bfd_make_section_with_flags (dynobj
, ".rela.got",
604 (SEC_ALLOC
| SEC_LOAD
609 if (htab
->srelgot
== NULL
610 || ! bfd_set_section_alignment (dynobj
, htab
->srelgot
, 3))
615 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
616 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
620 elf64_x86_64_create_dynamic_sections (bfd
*dynobj
, struct bfd_link_info
*info
)
622 struct elf64_x86_64_link_hash_table
*htab
;
624 htab
= elf64_x86_64_hash_table (info
);
625 if (!htab
->sgot
&& !create_got_section (dynobj
, info
))
628 if (!_bfd_elf_create_dynamic_sections (dynobj
, info
))
631 htab
->splt
= bfd_get_section_by_name (dynobj
, ".plt");
632 htab
->srelplt
= bfd_get_section_by_name (dynobj
, ".rela.plt");
633 htab
->sdynbss
= bfd_get_section_by_name (dynobj
, ".dynbss");
635 htab
->srelbss
= bfd_get_section_by_name (dynobj
, ".rela.bss");
637 if (!htab
->splt
|| !htab
->srelplt
|| !htab
->sdynbss
638 || (!info
->shared
&& !htab
->srelbss
))
644 /* Copy the extra info we tack onto an elf_link_hash_entry. */
647 elf64_x86_64_copy_indirect_symbol (struct bfd_link_info
*info
,
648 struct elf_link_hash_entry
*dir
,
649 struct elf_link_hash_entry
*ind
)
651 struct elf64_x86_64_link_hash_entry
*edir
, *eind
;
653 edir
= (struct elf64_x86_64_link_hash_entry
*) dir
;
654 eind
= (struct elf64_x86_64_link_hash_entry
*) ind
;
656 if (eind
->dyn_relocs
!= NULL
)
658 if (edir
->dyn_relocs
!= NULL
)
660 struct elf64_x86_64_dyn_relocs
**pp
;
661 struct elf64_x86_64_dyn_relocs
*p
;
663 /* Add reloc counts against the indirect sym to the direct sym
664 list. Merge any entries against the same section. */
665 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
; )
667 struct elf64_x86_64_dyn_relocs
*q
;
669 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
670 if (q
->sec
== p
->sec
)
672 q
->pc_count
+= p
->pc_count
;
673 q
->count
+= p
->count
;
680 *pp
= edir
->dyn_relocs
;
683 edir
->dyn_relocs
= eind
->dyn_relocs
;
684 eind
->dyn_relocs
= NULL
;
687 if (ind
->root
.type
== bfd_link_hash_indirect
688 && dir
->got
.refcount
<= 0)
690 edir
->tls_type
= eind
->tls_type
;
691 eind
->tls_type
= GOT_UNKNOWN
;
694 if (ELIMINATE_COPY_RELOCS
695 && ind
->root
.type
!= bfd_link_hash_indirect
696 && dir
->dynamic_adjusted
)
698 /* If called to transfer flags for a weakdef during processing
699 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
700 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
701 dir
->ref_dynamic
|= ind
->ref_dynamic
;
702 dir
->ref_regular
|= ind
->ref_regular
;
703 dir
->ref_regular_nonweak
|= ind
->ref_regular_nonweak
;
704 dir
->needs_plt
|= ind
->needs_plt
;
705 dir
->pointer_equality_needed
|= ind
->pointer_equality_needed
;
708 _bfd_elf_link_hash_copy_indirect (info
, dir
, ind
);
712 elf64_x86_64_elf_object_p (bfd
*abfd
)
714 /* Set the right machine number for an x86-64 elf64 file. */
715 bfd_default_set_arch_mach (abfd
, bfd_arch_i386
, bfd_mach_x86_64
);
733 /* Return TRUE if the TLS access code sequence support transition
737 elf64_x86_64_check_tls_transition (bfd
*abfd
, asection
*sec
,
739 Elf_Internal_Shdr
*symtab_hdr
,
740 struct elf_link_hash_entry
**sym_hashes
,
742 const Elf_Internal_Rela
*rel
,
743 const Elf_Internal_Rela
*relend
)
746 unsigned long r_symndx
;
747 struct elf_link_hash_entry
*h
;
750 /* Get the section contents. */
751 if (contents
== NULL
)
753 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
754 contents
= elf_section_data (sec
)->this_hdr
.contents
;
757 /* FIXME: How to better handle error condition? */
758 if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
761 /* Cache the section contents for elf_link_input_bfd. */
762 elf_section_data (sec
)->this_hdr
.contents
= contents
;
766 offset
= rel
->r_offset
;
771 if ((rel
+ 1) >= relend
)
774 if (r_type
== R_X86_64_TLSGD
)
776 /* Check transition from GD access model. Only
777 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
778 .word 0x6666; rex64; call __tls_get_addr
779 can transit to different access model. */
781 static x86_64_opcode32 leaq
= { { 0x66, 0x48, 0x8d, 0x3d } },
782 call
= { { 0x66, 0x66, 0x48, 0xe8 } };
784 || (offset
+ 12) > sec
->size
785 || bfd_get_32 (abfd
, contents
+ offset
- 4) != leaq
.i
786 || bfd_get_32 (abfd
, contents
+ offset
+ 4) != call
.i
)
791 /* Check transition from LD access model. Only
792 leaq foo@tlsld(%rip), %rdi;
794 can transit to different access model. */
796 static x86_64_opcode32 ld
= { { 0x48, 0x8d, 0x3d, 0xe8 } };
799 if (offset
< 3 || (offset
+ 9) > sec
->size
)
802 op
.i
= bfd_get_32 (abfd
, contents
+ offset
- 3);
803 op
.c
[3] = bfd_get_8 (abfd
, contents
+ offset
+ 4);
808 r_symndx
= ELF64_R_SYM (rel
[1].r_info
);
809 if (r_symndx
< symtab_hdr
->sh_info
)
812 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
814 && h
->root
.root
.string
!= NULL
815 && (ELF64_R_TYPE (rel
[1].r_info
) == R_X86_64_PC32
816 || ELF64_R_TYPE (rel
[1].r_info
) == R_X86_64_PLT32
)
817 && (strcmp (h
->root
.root
.string
, "__tls_get_addr") == 0));
819 case R_X86_64_GOTTPOFF
:
820 /* Check transition from IE access model:
821 movq foo@gottpoff(%rip), %reg
822 addq foo@gottpoff(%rip), %reg
825 if (offset
< 3 || (offset
+ 4) > sec
->size
)
828 val
= bfd_get_8 (abfd
, contents
+ offset
- 3);
829 if (val
!= 0x48 && val
!= 0x4c)
832 val
= bfd_get_8 (abfd
, contents
+ offset
- 2);
833 if (val
!= 0x8b && val
!= 0x03)
836 val
= bfd_get_8 (abfd
, contents
+ offset
- 1);
837 return (val
& 0xc7) == 5;
839 case R_X86_64_GOTPC32_TLSDESC
:
840 /* Check transition from GDesc access model:
841 leaq x@tlsdesc(%rip), %rax
843 Make sure it's a leaq adding rip to a 32-bit offset
844 into any register, although it's probably almost always
847 if (offset
< 3 || (offset
+ 4) > sec
->size
)
850 val
= bfd_get_8 (abfd
, contents
+ offset
- 3);
851 if ((val
& 0xfb) != 0x48)
854 if (bfd_get_8 (abfd
, contents
+ offset
- 2) != 0x8d)
857 val
= bfd_get_8 (abfd
, contents
+ offset
- 1);
858 return (val
& 0xc7) == 0x05;
860 case R_X86_64_TLSDESC_CALL
:
861 /* Check transition from GDesc access model:
862 call *x@tlsdesc(%rax)
864 if (offset
+ 2 <= sec
->size
)
866 /* Make sure that it's a call *x@tlsdesc(%rax). */
867 static x86_64_opcode16 call
= { { 0xff, 0x10 } };
868 return bfd_get_16 (abfd
, contents
+ offset
) == call
.i
;
878 /* Return TRUE if the TLS access transition is OK or no transition
879 will be performed. Update R_TYPE if there is a transition. */
882 elf64_x86_64_tls_transition (struct bfd_link_info
*info
, bfd
*abfd
,
883 asection
*sec
, bfd_byte
*contents
,
884 Elf_Internal_Shdr
*symtab_hdr
,
885 struct elf_link_hash_entry
**sym_hashes
,
886 unsigned int *r_type
, int tls_type
,
887 const Elf_Internal_Rela
*rel
,
888 const Elf_Internal_Rela
*relend
,
889 struct elf_link_hash_entry
*h
)
891 unsigned int from_type
= *r_type
;
892 unsigned int to_type
= from_type
;
893 bfd_boolean check
= TRUE
;
898 case R_X86_64_GOTPC32_TLSDESC
:
899 case R_X86_64_TLSDESC_CALL
:
900 case R_X86_64_GOTTPOFF
:
904 to_type
= R_X86_64_TPOFF32
;
906 to_type
= R_X86_64_GOTTPOFF
;
909 /* When we are called from elf64_x86_64_relocate_section,
910 CONTENTS isn't NULL and there may be additional transitions
911 based on TLS_TYPE. */
912 if (contents
!= NULL
)
914 unsigned int new_to_type
= to_type
;
919 && tls_type
== GOT_TLS_IE
)
920 new_to_type
= R_X86_64_TPOFF32
;
922 if (to_type
== R_X86_64_TLSGD
923 || to_type
== R_X86_64_GOTPC32_TLSDESC
924 || to_type
== R_X86_64_TLSDESC_CALL
)
926 if (tls_type
== GOT_TLS_IE
)
927 new_to_type
= R_X86_64_GOTTPOFF
;
930 /* We checked the transition before when we were called from
931 elf64_x86_64_check_relocs. We only want to check the new
932 transition which hasn't been checked before. */
933 check
= new_to_type
!= to_type
&& from_type
== to_type
;
934 to_type
= new_to_type
;
941 to_type
= R_X86_64_TPOFF32
;
948 /* Return TRUE if there is no transition. */
949 if (from_type
== to_type
)
952 /* Check if the transition can be performed. */
954 && ! elf64_x86_64_check_tls_transition (abfd
, sec
, contents
,
955 symtab_hdr
, sym_hashes
,
956 from_type
, rel
, relend
))
958 reloc_howto_type
*from
, *to
;
960 from
= elf64_x86_64_rtype_to_howto (abfd
, from_type
);
961 to
= elf64_x86_64_rtype_to_howto (abfd
, to_type
);
963 (*_bfd_error_handler
)
964 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
965 "in section `%A' failed"),
966 abfd
, sec
, from
->name
, to
->name
,
967 h
? h
->root
.root
.string
: "a local symbol",
968 (unsigned long) rel
->r_offset
);
969 bfd_set_error (bfd_error_bad_value
);
977 /* Look through the relocs for a section during the first phase, and
978 calculate needed space in the global offset table, procedure
979 linkage table, and dynamic reloc sections. */
982 elf64_x86_64_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
,
984 const Elf_Internal_Rela
*relocs
)
986 struct elf64_x86_64_link_hash_table
*htab
;
987 Elf_Internal_Shdr
*symtab_hdr
;
988 struct elf_link_hash_entry
**sym_hashes
;
989 const Elf_Internal_Rela
*rel
;
990 const Elf_Internal_Rela
*rel_end
;
993 if (info
->relocatable
)
996 BFD_ASSERT (is_x86_64_elf (abfd
));
998 htab
= elf64_x86_64_hash_table (info
);
999 symtab_hdr
= &elf_symtab_hdr (abfd
);
1000 sym_hashes
= elf_sym_hashes (abfd
);
1004 rel_end
= relocs
+ sec
->reloc_count
;
1005 for (rel
= relocs
; rel
< rel_end
; rel
++)
1007 unsigned int r_type
;
1008 unsigned long r_symndx
;
1009 struct elf_link_hash_entry
*h
;
1011 r_symndx
= ELF64_R_SYM (rel
->r_info
);
1012 r_type
= ELF64_R_TYPE (rel
->r_info
);
1014 if (r_symndx
>= NUM_SHDR_ENTRIES (symtab_hdr
))
1016 (*_bfd_error_handler
) (_("%B: bad symbol index: %d"),
1021 if (r_symndx
< symtab_hdr
->sh_info
)
1025 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1026 while (h
->root
.type
== bfd_link_hash_indirect
1027 || h
->root
.type
== bfd_link_hash_warning
)
1028 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1031 if (! elf64_x86_64_tls_transition (info
, abfd
, sec
, NULL
,
1032 symtab_hdr
, sym_hashes
,
1033 &r_type
, GOT_UNKNOWN
,
1039 case R_X86_64_TLSLD
:
1040 htab
->tls_ld_got
.refcount
+= 1;
1043 case R_X86_64_TPOFF32
:
1046 (*_bfd_error_handler
)
1047 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1049 x86_64_elf_howto_table
[r_type
].name
,
1050 (h
) ? h
->root
.root
.string
: "a local symbol");
1051 bfd_set_error (bfd_error_bad_value
);
1056 case R_X86_64_GOTTPOFF
:
1058 info
->flags
|= DF_STATIC_TLS
;
1061 case R_X86_64_GOT32
:
1062 case R_X86_64_GOTPCREL
:
1063 case R_X86_64_TLSGD
:
1064 case R_X86_64_GOT64
:
1065 case R_X86_64_GOTPCREL64
:
1066 case R_X86_64_GOTPLT64
:
1067 case R_X86_64_GOTPC32_TLSDESC
:
1068 case R_X86_64_TLSDESC_CALL
:
1069 /* This symbol requires a global offset table entry. */
1071 int tls_type
, old_tls_type
;
1075 default: tls_type
= GOT_NORMAL
; break;
1076 case R_X86_64_TLSGD
: tls_type
= GOT_TLS_GD
; break;
1077 case R_X86_64_GOTTPOFF
: tls_type
= GOT_TLS_IE
; break;
1078 case R_X86_64_GOTPC32_TLSDESC
:
1079 case R_X86_64_TLSDESC_CALL
:
1080 tls_type
= GOT_TLS_GDESC
; break;
1085 if (r_type
== R_X86_64_GOTPLT64
)
1087 /* This relocation indicates that we also need
1088 a PLT entry, as this is a function. We don't need
1089 a PLT entry for local symbols. */
1091 h
->plt
.refcount
+= 1;
1093 h
->got
.refcount
+= 1;
1094 old_tls_type
= elf64_x86_64_hash_entry (h
)->tls_type
;
1098 bfd_signed_vma
*local_got_refcounts
;
1100 /* This is a global offset table entry for a local symbol. */
1101 local_got_refcounts
= elf_local_got_refcounts (abfd
);
1102 if (local_got_refcounts
== NULL
)
1106 size
= symtab_hdr
->sh_info
;
1107 size
*= sizeof (bfd_signed_vma
)
1108 + sizeof (bfd_vma
) + sizeof (char);
1109 local_got_refcounts
= ((bfd_signed_vma
*)
1110 bfd_zalloc (abfd
, size
));
1111 if (local_got_refcounts
== NULL
)
1113 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
1114 elf64_x86_64_local_tlsdesc_gotent (abfd
)
1115 = (bfd_vma
*) (local_got_refcounts
+ symtab_hdr
->sh_info
);
1116 elf64_x86_64_local_got_tls_type (abfd
)
1117 = (char *) (local_got_refcounts
+ 2 * symtab_hdr
->sh_info
);
1119 local_got_refcounts
[r_symndx
] += 1;
1121 = elf64_x86_64_local_got_tls_type (abfd
) [r_symndx
];
1124 /* If a TLS symbol is accessed using IE at least once,
1125 there is no point to use dynamic model for it. */
1126 if (old_tls_type
!= tls_type
&& old_tls_type
!= GOT_UNKNOWN
1127 && (! GOT_TLS_GD_ANY_P (old_tls_type
)
1128 || tls_type
!= GOT_TLS_IE
))
1130 if (old_tls_type
== GOT_TLS_IE
&& GOT_TLS_GD_ANY_P (tls_type
))
1131 tls_type
= old_tls_type
;
1132 else if (GOT_TLS_GD_ANY_P (old_tls_type
)
1133 && GOT_TLS_GD_ANY_P (tls_type
))
1134 tls_type
|= old_tls_type
;
1137 (*_bfd_error_handler
)
1138 (_("%B: '%s' accessed both as normal and thread local symbol"),
1139 abfd
, h
? h
->root
.root
.string
: "<local>");
1144 if (old_tls_type
!= tls_type
)
1147 elf64_x86_64_hash_entry (h
)->tls_type
= tls_type
;
1149 elf64_x86_64_local_got_tls_type (abfd
) [r_symndx
] = tls_type
;
1154 case R_X86_64_GOTOFF64
:
1155 case R_X86_64_GOTPC32
:
1156 case R_X86_64_GOTPC64
:
1158 if (htab
->sgot
== NULL
)
1160 if (htab
->elf
.dynobj
== NULL
)
1161 htab
->elf
.dynobj
= abfd
;
1162 if (!create_got_section (htab
->elf
.dynobj
, info
))
1167 case R_X86_64_PLT32
:
1168 /* This symbol requires a procedure linkage table entry. We
1169 actually build the entry in adjust_dynamic_symbol,
1170 because this might be a case of linking PIC code which is
1171 never referenced by a dynamic object, in which case we
1172 don't need to generate a procedure linkage table entry
1175 /* If this is a local symbol, we resolve it directly without
1176 creating a procedure linkage table entry. */
1181 h
->plt
.refcount
+= 1;
1184 case R_X86_64_PLTOFF64
:
1185 /* This tries to form the 'address' of a function relative
1186 to GOT. For global symbols we need a PLT entry. */
1190 h
->plt
.refcount
+= 1;
1198 /* Let's help debug shared library creation. These relocs
1199 cannot be used in shared libs. Don't error out for
1200 sections we don't care about, such as debug sections or
1201 non-constant sections. */
1203 && (sec
->flags
& SEC_ALLOC
) != 0
1204 && (sec
->flags
& SEC_READONLY
) != 0)
1206 (*_bfd_error_handler
)
1207 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1209 x86_64_elf_howto_table
[r_type
].name
,
1210 (h
) ? h
->root
.root
.string
: "a local symbol");
1211 bfd_set_error (bfd_error_bad_value
);
1221 if (h
!= NULL
&& !info
->shared
)
1223 /* If this reloc is in a read-only section, we might
1224 need a copy reloc. We can't check reliably at this
1225 stage whether the section is read-only, as input
1226 sections have not yet been mapped to output sections.
1227 Tentatively set the flag for now, and correct in
1228 adjust_dynamic_symbol. */
1231 /* We may need a .plt entry if the function this reloc
1232 refers to is in a shared lib. */
1233 h
->plt
.refcount
+= 1;
1234 if (r_type
!= R_X86_64_PC32
&& r_type
!= R_X86_64_PC64
)
1235 h
->pointer_equality_needed
= 1;
1238 /* If we are creating a shared library, and this is a reloc
1239 against a global symbol, or a non PC relative reloc
1240 against a local symbol, then we need to copy the reloc
1241 into the shared library. However, if we are linking with
1242 -Bsymbolic, we do not need to copy a reloc against a
1243 global symbol which is defined in an object we are
1244 including in the link (i.e., DEF_REGULAR is set). At
1245 this point we have not seen all the input files, so it is
1246 possible that DEF_REGULAR is not set now but will be set
1247 later (it is never cleared). In case of a weak definition,
1248 DEF_REGULAR may be cleared later by a strong definition in
1249 a shared library. We account for that possibility below by
1250 storing information in the relocs_copied field of the hash
1251 table entry. A similar situation occurs when creating
1252 shared libraries and symbol visibility changes render the
1255 If on the other hand, we are creating an executable, we
1256 may need to keep relocations for symbols satisfied by a
1257 dynamic library if we manage to avoid copy relocs for the
1260 && (sec
->flags
& SEC_ALLOC
) != 0
1261 && (((r_type
!= R_X86_64_PC8
)
1262 && (r_type
!= R_X86_64_PC16
)
1263 && (r_type
!= R_X86_64_PC32
)
1264 && (r_type
!= R_X86_64_PC64
))
1266 && (! SYMBOLIC_BIND (info
, h
)
1267 || h
->root
.type
== bfd_link_hash_defweak
1268 || !h
->def_regular
))))
1269 || (ELIMINATE_COPY_RELOCS
1271 && (sec
->flags
& SEC_ALLOC
) != 0
1273 && (h
->root
.type
== bfd_link_hash_defweak
1274 || !h
->def_regular
)))
1276 struct elf64_x86_64_dyn_relocs
*p
;
1277 struct elf64_x86_64_dyn_relocs
**head
;
1279 /* We must copy these reloc types into the output file.
1280 Create a reloc section in dynobj and make room for
1287 name
= (bfd_elf_string_from_elf_section
1289 elf_elfheader (abfd
)->e_shstrndx
,
1290 elf_section_data (sec
)->rel_hdr
.sh_name
));
1294 if (! CONST_STRNEQ (name
, ".rela")
1295 || strcmp (bfd_get_section_name (abfd
, sec
),
1298 (*_bfd_error_handler
)
1299 (_("%B: bad relocation section name `%s\'"),
1303 if (htab
->elf
.dynobj
== NULL
)
1304 htab
->elf
.dynobj
= abfd
;
1306 dynobj
= htab
->elf
.dynobj
;
1308 sreloc
= bfd_get_section_by_name (dynobj
, name
);
1313 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
1314 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
1315 if ((sec
->flags
& SEC_ALLOC
) != 0)
1316 flags
|= SEC_ALLOC
| SEC_LOAD
;
1317 sreloc
= bfd_make_section_with_flags (dynobj
,
1321 || ! bfd_set_section_alignment (dynobj
, sreloc
, 3))
1324 elf_section_data (sec
)->sreloc
= sreloc
;
1327 /* If this is a global symbol, we count the number of
1328 relocations we need for this symbol. */
1331 head
= &((struct elf64_x86_64_link_hash_entry
*) h
)->dyn_relocs
;
1336 /* Track dynamic relocs needed for local syms too.
1337 We really need local syms available to do this
1341 s
= bfd_section_from_r_symndx (abfd
, &htab
->sym_sec
,
1346 /* Beware of type punned pointers vs strict aliasing
1348 vpp
= &(elf_section_data (s
)->local_dynrel
);
1349 head
= (struct elf64_x86_64_dyn_relocs
**)vpp
;
1353 if (p
== NULL
|| p
->sec
!= sec
)
1355 bfd_size_type amt
= sizeof *p
;
1356 p
= ((struct elf64_x86_64_dyn_relocs
*)
1357 bfd_alloc (htab
->elf
.dynobj
, amt
));
1368 if (r_type
== R_X86_64_PC8
1369 || r_type
== R_X86_64_PC16
1370 || r_type
== R_X86_64_PC32
1371 || r_type
== R_X86_64_PC64
)
1376 /* This relocation describes the C++ object vtable hierarchy.
1377 Reconstruct it for later use during GC. */
1378 case R_X86_64_GNU_VTINHERIT
:
1379 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
1383 /* This relocation describes which C++ vtable entries are actually
1384 used. Record for later use during GC. */
1385 case R_X86_64_GNU_VTENTRY
:
1386 BFD_ASSERT (h
!= NULL
);
1388 && !bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
1400 /* Return the section that should be marked against GC for a given
1404 elf64_x86_64_gc_mark_hook (asection
*sec
,
1405 struct bfd_link_info
*info
,
1406 Elf_Internal_Rela
*rel
,
1407 struct elf_link_hash_entry
*h
,
1408 Elf_Internal_Sym
*sym
)
1411 switch (ELF64_R_TYPE (rel
->r_info
))
1413 case R_X86_64_GNU_VTINHERIT
:
1414 case R_X86_64_GNU_VTENTRY
:
1418 return _bfd_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
);
1421 /* Update the got entry reference counts for the section being removed. */
1424 elf64_x86_64_gc_sweep_hook (bfd
*abfd
, struct bfd_link_info
*info
,
1426 const Elf_Internal_Rela
*relocs
)
1428 Elf_Internal_Shdr
*symtab_hdr
;
1429 struct elf_link_hash_entry
**sym_hashes
;
1430 bfd_signed_vma
*local_got_refcounts
;
1431 const Elf_Internal_Rela
*rel
, *relend
;
1433 if (info
->relocatable
)
1436 elf_section_data (sec
)->local_dynrel
= NULL
;
1438 symtab_hdr
= &elf_symtab_hdr (abfd
);
1439 sym_hashes
= elf_sym_hashes (abfd
);
1440 local_got_refcounts
= elf_local_got_refcounts (abfd
);
1442 relend
= relocs
+ sec
->reloc_count
;
1443 for (rel
= relocs
; rel
< relend
; rel
++)
1445 unsigned long r_symndx
;
1446 unsigned int r_type
;
1447 struct elf_link_hash_entry
*h
= NULL
;
1449 r_symndx
= ELF64_R_SYM (rel
->r_info
);
1450 if (r_symndx
>= symtab_hdr
->sh_info
)
1452 struct elf64_x86_64_link_hash_entry
*eh
;
1453 struct elf64_x86_64_dyn_relocs
**pp
;
1454 struct elf64_x86_64_dyn_relocs
*p
;
1456 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1457 while (h
->root
.type
== bfd_link_hash_indirect
1458 || h
->root
.type
== bfd_link_hash_warning
)
1459 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1460 eh
= (struct elf64_x86_64_link_hash_entry
*) h
;
1462 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; pp
= &p
->next
)
1465 /* Everything must go for SEC. */
1471 r_type
= ELF64_R_TYPE (rel
->r_info
);
1472 if (! elf64_x86_64_tls_transition (info
, abfd
, sec
, NULL
,
1473 symtab_hdr
, sym_hashes
,
1474 &r_type
, GOT_UNKNOWN
,
1480 case R_X86_64_TLSLD
:
1481 if (elf64_x86_64_hash_table (info
)->tls_ld_got
.refcount
> 0)
1482 elf64_x86_64_hash_table (info
)->tls_ld_got
.refcount
-= 1;
1485 case R_X86_64_TLSGD
:
1486 case R_X86_64_GOTPC32_TLSDESC
:
1487 case R_X86_64_TLSDESC_CALL
:
1488 case R_X86_64_GOTTPOFF
:
1489 case R_X86_64_GOT32
:
1490 case R_X86_64_GOTPCREL
:
1491 case R_X86_64_GOT64
:
1492 case R_X86_64_GOTPCREL64
:
1493 case R_X86_64_GOTPLT64
:
1496 if (r_type
== R_X86_64_GOTPLT64
&& h
->plt
.refcount
> 0)
1497 h
->plt
.refcount
-= 1;
1498 if (h
->got
.refcount
> 0)
1499 h
->got
.refcount
-= 1;
1501 else if (local_got_refcounts
!= NULL
)
1503 if (local_got_refcounts
[r_symndx
] > 0)
1504 local_got_refcounts
[r_symndx
] -= 1;
1521 case R_X86_64_PLT32
:
1522 case R_X86_64_PLTOFF64
:
1525 if (h
->plt
.refcount
> 0)
1526 h
->plt
.refcount
-= 1;
1538 /* Adjust a symbol defined by a dynamic object and referenced by a
1539 regular object. The current definition is in some section of the
1540 dynamic object, but we're not including those sections. We have to
1541 change the definition to something the rest of the link can
1545 elf64_x86_64_adjust_dynamic_symbol (struct bfd_link_info
*info
,
1546 struct elf_link_hash_entry
*h
)
1548 struct elf64_x86_64_link_hash_table
*htab
;
1551 /* If this is a function, put it in the procedure linkage table. We
1552 will fill in the contents of the procedure linkage table later,
1553 when we know the address of the .got section. */
1554 if (h
->type
== STT_FUNC
1557 if (h
->plt
.refcount
<= 0
1558 || SYMBOL_CALLS_LOCAL (info
, h
)
1559 || (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
1560 && h
->root
.type
== bfd_link_hash_undefweak
))
1562 /* This case can occur if we saw a PLT32 reloc in an input
1563 file, but the symbol was never referred to by a dynamic
1564 object, or if all references were garbage collected. In
1565 such a case, we don't actually need to build a procedure
1566 linkage table, and we can just do a PC32 reloc instead. */
1567 h
->plt
.offset
= (bfd_vma
) -1;
1574 /* It's possible that we incorrectly decided a .plt reloc was
1575 needed for an R_X86_64_PC32 reloc to a non-function sym in
1576 check_relocs. We can't decide accurately between function and
1577 non-function syms in check-relocs; Objects loaded later in
1578 the link may change h->type. So fix it now. */
1579 h
->plt
.offset
= (bfd_vma
) -1;
1581 /* If this is a weak symbol, and there is a real definition, the
1582 processor independent code will have arranged for us to see the
1583 real definition first, and we can just use the same value. */
1584 if (h
->u
.weakdef
!= NULL
)
1586 BFD_ASSERT (h
->u
.weakdef
->root
.type
== bfd_link_hash_defined
1587 || h
->u
.weakdef
->root
.type
== bfd_link_hash_defweak
);
1588 h
->root
.u
.def
.section
= h
->u
.weakdef
->root
.u
.def
.section
;
1589 h
->root
.u
.def
.value
= h
->u
.weakdef
->root
.u
.def
.value
;
1590 if (ELIMINATE_COPY_RELOCS
|| info
->nocopyreloc
)
1591 h
->non_got_ref
= h
->u
.weakdef
->non_got_ref
;
1595 /* This is a reference to a symbol defined by a dynamic object which
1596 is not a function. */
1598 /* If we are creating a shared library, we must presume that the
1599 only references to the symbol are via the global offset table.
1600 For such cases we need not do anything here; the relocations will
1601 be handled correctly by relocate_section. */
1605 /* If there are no references to this symbol that do not use the
1606 GOT, we don't need to generate a copy reloc. */
1607 if (!h
->non_got_ref
)
1610 /* If -z nocopyreloc was given, we won't generate them either. */
1611 if (info
->nocopyreloc
)
1617 if (ELIMINATE_COPY_RELOCS
)
1619 struct elf64_x86_64_link_hash_entry
* eh
;
1620 struct elf64_x86_64_dyn_relocs
*p
;
1622 eh
= (struct elf64_x86_64_link_hash_entry
*) h
;
1623 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
1625 s
= p
->sec
->output_section
;
1626 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
1630 /* If we didn't find any dynamic relocs in read-only sections, then
1631 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1641 (*_bfd_error_handler
) (_("dynamic variable `%s' is zero size"),
1642 h
->root
.root
.string
);
1646 /* We must allocate the symbol in our .dynbss section, which will
1647 become part of the .bss section of the executable. There will be
1648 an entry for this symbol in the .dynsym section. The dynamic
1649 object will contain position independent code, so all references
1650 from the dynamic object to this symbol will go through the global
1651 offset table. The dynamic linker will use the .dynsym entry to
1652 determine the address it must put in the global offset table, so
1653 both the dynamic object and the regular object will refer to the
1654 same memory location for the variable. */
1656 htab
= elf64_x86_64_hash_table (info
);
1658 /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
1659 to copy the initial value out of the dynamic object and into the
1660 runtime process image. */
1661 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
1663 htab
->srelbss
->size
+= sizeof (Elf64_External_Rela
);
1669 return _bfd_elf_adjust_dynamic_copy (h
, s
);
1672 /* Allocate space in .plt, .got and associated reloc sections for
1676 allocate_dynrelocs (struct elf_link_hash_entry
*h
, void * inf
)
1678 struct bfd_link_info
*info
;
1679 struct elf64_x86_64_link_hash_table
*htab
;
1680 struct elf64_x86_64_link_hash_entry
*eh
;
1681 struct elf64_x86_64_dyn_relocs
*p
;
1683 if (h
->root
.type
== bfd_link_hash_indirect
)
1686 if (h
->root
.type
== bfd_link_hash_warning
)
1687 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1689 info
= (struct bfd_link_info
*) inf
;
1690 htab
= elf64_x86_64_hash_table (info
);
1692 if (htab
->elf
.dynamic_sections_created
1693 && h
->plt
.refcount
> 0)
1695 /* Make sure this symbol is output as a dynamic symbol.
1696 Undefined weak syms won't yet be marked as dynamic. */
1697 if (h
->dynindx
== -1
1698 && !h
->forced_local
)
1700 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
1705 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h
))
1707 asection
*s
= htab
->splt
;
1709 /* If this is the first .plt entry, make room for the special
1712 s
->size
+= PLT_ENTRY_SIZE
;
1714 h
->plt
.offset
= s
->size
;
1716 /* If this symbol is not defined in a regular file, and we are
1717 not generating a shared library, then set the symbol to this
1718 location in the .plt. This is required to make function
1719 pointers compare as equal between the normal executable and
1720 the shared library. */
1724 h
->root
.u
.def
.section
= s
;
1725 h
->root
.u
.def
.value
= h
->plt
.offset
;
1728 /* Make room for this entry. */
1729 s
->size
+= PLT_ENTRY_SIZE
;
1731 /* We also need to make an entry in the .got.plt section, which
1732 will be placed in the .got section by the linker script. */
1733 htab
->sgotplt
->size
+= GOT_ENTRY_SIZE
;
1735 /* We also need to make an entry in the .rela.plt section. */
1736 htab
->srelplt
->size
+= sizeof (Elf64_External_Rela
);
1737 htab
->srelplt
->reloc_count
++;
1741 h
->plt
.offset
= (bfd_vma
) -1;
1747 h
->plt
.offset
= (bfd_vma
) -1;
1751 eh
= (struct elf64_x86_64_link_hash_entry
*) h
;
1752 eh
->tlsdesc_got
= (bfd_vma
) -1;
1754 /* If R_X86_64_GOTTPOFF symbol is now local to the binary,
1755 make it a R_X86_64_TPOFF32 requiring no GOT entry. */
1756 if (h
->got
.refcount
> 0
1759 && elf64_x86_64_hash_entry (h
)->tls_type
== GOT_TLS_IE
)
1760 h
->got
.offset
= (bfd_vma
) -1;
1761 else if (h
->got
.refcount
> 0)
1765 int tls_type
= elf64_x86_64_hash_entry (h
)->tls_type
;
1767 /* Make sure this symbol is output as a dynamic symbol.
1768 Undefined weak syms won't yet be marked as dynamic. */
1769 if (h
->dynindx
== -1
1770 && !h
->forced_local
)
1772 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
1776 if (GOT_TLS_GDESC_P (tls_type
))
1778 eh
->tlsdesc_got
= htab
->sgotplt
->size
1779 - elf64_x86_64_compute_jump_table_size (htab
);
1780 htab
->sgotplt
->size
+= 2 * GOT_ENTRY_SIZE
;
1781 h
->got
.offset
= (bfd_vma
) -2;
1783 if (! GOT_TLS_GDESC_P (tls_type
)
1784 || GOT_TLS_GD_P (tls_type
))
1787 h
->got
.offset
= s
->size
;
1788 s
->size
+= GOT_ENTRY_SIZE
;
1789 if (GOT_TLS_GD_P (tls_type
))
1790 s
->size
+= GOT_ENTRY_SIZE
;
1792 dyn
= htab
->elf
.dynamic_sections_created
;
1793 /* R_X86_64_TLSGD needs one dynamic relocation if local symbol
1795 R_X86_64_GOTTPOFF needs one dynamic relocation. */
1796 if ((GOT_TLS_GD_P (tls_type
) && h
->dynindx
== -1)
1797 || tls_type
== GOT_TLS_IE
)
1798 htab
->srelgot
->size
+= sizeof (Elf64_External_Rela
);
1799 else if (GOT_TLS_GD_P (tls_type
))
1800 htab
->srelgot
->size
+= 2 * sizeof (Elf64_External_Rela
);
1801 else if (! GOT_TLS_GDESC_P (tls_type
)
1802 && (ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
1803 || h
->root
.type
!= bfd_link_hash_undefweak
)
1805 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, 0, h
)))
1806 htab
->srelgot
->size
+= sizeof (Elf64_External_Rela
);
1807 if (GOT_TLS_GDESC_P (tls_type
))
1809 htab
->srelplt
->size
+= sizeof (Elf64_External_Rela
);
1810 htab
->tlsdesc_plt
= (bfd_vma
) -1;
1814 h
->got
.offset
= (bfd_vma
) -1;
1816 if (eh
->dyn_relocs
== NULL
)
1819 /* In the shared -Bsymbolic case, discard space allocated for
1820 dynamic pc-relative relocs against symbols which turn out to be
1821 defined in regular objects. For the normal shared case, discard
1822 space for pc-relative relocs that have become local due to symbol
1823 visibility changes. */
1827 /* Relocs that use pc_count are those that appear on a call
1828 insn, or certain REL relocs that can generated via assembly.
1829 We want calls to protected symbols to resolve directly to the
1830 function rather than going via the plt. If people want
1831 function pointer comparisons to work as expected then they
1832 should avoid writing weird assembly. */
1833 if (SYMBOL_CALLS_LOCAL (info
, h
))
1835 struct elf64_x86_64_dyn_relocs
**pp
;
1837 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
1839 p
->count
-= p
->pc_count
;
1848 /* Also discard relocs on undefined weak syms with non-default
1850 if (eh
->dyn_relocs
!= NULL
1851 && h
->root
.type
== bfd_link_hash_undefweak
)
1853 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
)
1854 eh
->dyn_relocs
= NULL
;
1856 /* Make sure undefined weak symbols are output as a dynamic
1858 else if (h
->dynindx
== -1
1859 && !h
->forced_local
)
1861 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
1866 else if (ELIMINATE_COPY_RELOCS
)
1868 /* For the non-shared case, discard space for relocs against
1869 symbols which turn out to need copy relocs or are not
1875 || (htab
->elf
.dynamic_sections_created
1876 && (h
->root
.type
== bfd_link_hash_undefweak
1877 || h
->root
.type
== bfd_link_hash_undefined
))))
1879 /* Make sure this symbol is output as a dynamic symbol.
1880 Undefined weak syms won't yet be marked as dynamic. */
1881 if (h
->dynindx
== -1
1882 && !h
->forced_local
)
1884 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
1888 /* If that succeeded, we know we'll be keeping all the
1890 if (h
->dynindx
!= -1)
1894 eh
->dyn_relocs
= NULL
;
1899 /* Finally, allocate space. */
1900 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
1902 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
1903 sreloc
->size
+= p
->count
* sizeof (Elf64_External_Rela
);
1909 /* Find any dynamic relocs that apply to read-only sections. */
1912 readonly_dynrelocs (struct elf_link_hash_entry
*h
, void * inf
)
1914 struct elf64_x86_64_link_hash_entry
*eh
;
1915 struct elf64_x86_64_dyn_relocs
*p
;
1917 if (h
->root
.type
== bfd_link_hash_warning
)
1918 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1920 eh
= (struct elf64_x86_64_link_hash_entry
*) h
;
1921 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
1923 asection
*s
= p
->sec
->output_section
;
1925 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
1927 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
1929 info
->flags
|= DF_TEXTREL
;
1931 /* Not an error, just cut short the traversal. */
1938 /* Set the sizes of the dynamic sections. */
1941 elf64_x86_64_size_dynamic_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
1942 struct bfd_link_info
*info
)
1944 struct elf64_x86_64_link_hash_table
*htab
;
1950 htab
= elf64_x86_64_hash_table (info
);
1951 dynobj
= htab
->elf
.dynobj
;
1955 if (htab
->elf
.dynamic_sections_created
)
1957 /* Set the contents of the .interp section to the interpreter. */
1958 if (info
->executable
)
1960 s
= bfd_get_section_by_name (dynobj
, ".interp");
1963 s
->size
= sizeof ELF_DYNAMIC_INTERPRETER
;
1964 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
1968 /* Set up .got offsets for local syms, and space for local dynamic
1970 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
1972 bfd_signed_vma
*local_got
;
1973 bfd_signed_vma
*end_local_got
;
1974 char *local_tls_type
;
1975 bfd_vma
*local_tlsdesc_gotent
;
1976 bfd_size_type locsymcount
;
1977 Elf_Internal_Shdr
*symtab_hdr
;
1980 if (! is_x86_64_elf (ibfd
))
1983 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
1985 struct elf64_x86_64_dyn_relocs
*p
;
1987 for (p
= (struct elf64_x86_64_dyn_relocs
*)
1988 (elf_section_data (s
)->local_dynrel
);
1992 if (!bfd_is_abs_section (p
->sec
)
1993 && bfd_is_abs_section (p
->sec
->output_section
))
1995 /* Input section has been discarded, either because
1996 it is a copy of a linkonce section or due to
1997 linker script /DISCARD/, so we'll be discarding
2000 else if (p
->count
!= 0)
2002 srel
= elf_section_data (p
->sec
)->sreloc
;
2003 srel
->size
+= p
->count
* sizeof (Elf64_External_Rela
);
2004 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0)
2005 info
->flags
|= DF_TEXTREL
;
2011 local_got
= elf_local_got_refcounts (ibfd
);
2015 symtab_hdr
= &elf_symtab_hdr (ibfd
);
2016 locsymcount
= symtab_hdr
->sh_info
;
2017 end_local_got
= local_got
+ locsymcount
;
2018 local_tls_type
= elf64_x86_64_local_got_tls_type (ibfd
);
2019 local_tlsdesc_gotent
= elf64_x86_64_local_tlsdesc_gotent (ibfd
);
2021 srel
= htab
->srelgot
;
2022 for (; local_got
< end_local_got
;
2023 ++local_got
, ++local_tls_type
, ++local_tlsdesc_gotent
)
2025 *local_tlsdesc_gotent
= (bfd_vma
) -1;
2028 if (GOT_TLS_GDESC_P (*local_tls_type
))
2030 *local_tlsdesc_gotent
= htab
->sgotplt
->size
2031 - elf64_x86_64_compute_jump_table_size (htab
);
2032 htab
->sgotplt
->size
+= 2 * GOT_ENTRY_SIZE
;
2033 *local_got
= (bfd_vma
) -2;
2035 if (! GOT_TLS_GDESC_P (*local_tls_type
)
2036 || GOT_TLS_GD_P (*local_tls_type
))
2038 *local_got
= s
->size
;
2039 s
->size
+= GOT_ENTRY_SIZE
;
2040 if (GOT_TLS_GD_P (*local_tls_type
))
2041 s
->size
+= GOT_ENTRY_SIZE
;
2044 || GOT_TLS_GD_ANY_P (*local_tls_type
)
2045 || *local_tls_type
== GOT_TLS_IE
)
2047 if (GOT_TLS_GDESC_P (*local_tls_type
))
2049 htab
->srelplt
->size
+= sizeof (Elf64_External_Rela
);
2050 htab
->tlsdesc_plt
= (bfd_vma
) -1;
2052 if (! GOT_TLS_GDESC_P (*local_tls_type
)
2053 || GOT_TLS_GD_P (*local_tls_type
))
2054 srel
->size
+= sizeof (Elf64_External_Rela
);
2058 *local_got
= (bfd_vma
) -1;
2062 if (htab
->tls_ld_got
.refcount
> 0)
2064 /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD
2066 htab
->tls_ld_got
.offset
= htab
->sgot
->size
;
2067 htab
->sgot
->size
+= 2 * GOT_ENTRY_SIZE
;
2068 htab
->srelgot
->size
+= sizeof (Elf64_External_Rela
);
2071 htab
->tls_ld_got
.offset
= -1;
2073 /* Allocate global sym .plt and .got entries, and space for global
2074 sym dynamic relocs. */
2075 elf_link_hash_traverse (&htab
->elf
, allocate_dynrelocs
, (PTR
) info
);
2077 /* For every jump slot reserved in the sgotplt, reloc_count is
2078 incremented. However, when we reserve space for TLS descriptors,
2079 it's not incremented, so in order to compute the space reserved
2080 for them, it suffices to multiply the reloc count by the jump
2083 htab
->sgotplt_jump_table_size
2084 = elf64_x86_64_compute_jump_table_size (htab
);
2086 if (htab
->tlsdesc_plt
)
2088 /* If we're not using lazy TLS relocations, don't generate the
2089 PLT and GOT entries they require. */
2090 if ((info
->flags
& DF_BIND_NOW
))
2091 htab
->tlsdesc_plt
= 0;
2094 htab
->tlsdesc_got
= htab
->sgot
->size
;
2095 htab
->sgot
->size
+= GOT_ENTRY_SIZE
;
2096 /* Reserve room for the initial entry.
2097 FIXME: we could probably do away with it in this case. */
2098 if (htab
->splt
->size
== 0)
2099 htab
->splt
->size
+= PLT_ENTRY_SIZE
;
2100 htab
->tlsdesc_plt
= htab
->splt
->size
;
2101 htab
->splt
->size
+= PLT_ENTRY_SIZE
;
2105 /* We now have determined the sizes of the various dynamic sections.
2106 Allocate memory for them. */
2108 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
2110 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
2115 || s
== htab
->sgotplt
2116 || s
== htab
->sdynbss
)
2118 /* Strip this section if we don't need it; see the
2121 else if (CONST_STRNEQ (bfd_get_section_name (dynobj
, s
), ".rela"))
2123 if (s
->size
!= 0 && s
!= htab
->srelplt
)
2126 /* We use the reloc_count field as a counter if we need
2127 to copy relocs into the output file. */
2128 if (s
!= htab
->srelplt
)
2133 /* It's not one of our sections, so don't allocate space. */
2139 /* If we don't need this section, strip it from the
2140 output file. This is mostly to handle .rela.bss and
2141 .rela.plt. We must create both sections in
2142 create_dynamic_sections, because they must be created
2143 before the linker maps input sections to output
2144 sections. The linker does that before
2145 adjust_dynamic_symbol is called, and it is that
2146 function which decides whether anything needs to go
2147 into these sections. */
2149 s
->flags
|= SEC_EXCLUDE
;
2153 if ((s
->flags
& SEC_HAS_CONTENTS
) == 0)
2156 /* Allocate memory for the section contents. We use bfd_zalloc
2157 here in case unused entries are not reclaimed before the
2158 section's contents are written out. This should not happen,
2159 but this way if it does, we get a R_X86_64_NONE reloc instead
2161 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->size
);
2162 if (s
->contents
== NULL
)
2166 if (htab
->elf
.dynamic_sections_created
)
2168 /* Add some entries to the .dynamic section. We fill in the
2169 values later, in elf64_x86_64_finish_dynamic_sections, but we
2170 must add the entries now so that we get the correct size for
2171 the .dynamic section. The DT_DEBUG entry is filled in by the
2172 dynamic linker and used by the debugger. */
2173 #define add_dynamic_entry(TAG, VAL) \
2174 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2176 if (info
->executable
)
2178 if (!add_dynamic_entry (DT_DEBUG
, 0))
2182 if (htab
->splt
->size
!= 0)
2184 if (!add_dynamic_entry (DT_PLTGOT
, 0)
2185 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
2186 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
2187 || !add_dynamic_entry (DT_JMPREL
, 0))
2190 if (htab
->tlsdesc_plt
2191 && (!add_dynamic_entry (DT_TLSDESC_PLT
, 0)
2192 || !add_dynamic_entry (DT_TLSDESC_GOT
, 0)))
2198 if (!add_dynamic_entry (DT_RELA
, 0)
2199 || !add_dynamic_entry (DT_RELASZ
, 0)
2200 || !add_dynamic_entry (DT_RELAENT
, sizeof (Elf64_External_Rela
)))
2203 /* If any dynamic relocs apply to a read-only section,
2204 then we need a DT_TEXTREL entry. */
2205 if ((info
->flags
& DF_TEXTREL
) == 0)
2206 elf_link_hash_traverse (&htab
->elf
, readonly_dynrelocs
,
2209 if ((info
->flags
& DF_TEXTREL
) != 0)
2211 if (!add_dynamic_entry (DT_TEXTREL
, 0))
2216 #undef add_dynamic_entry
2222 elf64_x86_64_always_size_sections (bfd
*output_bfd
,
2223 struct bfd_link_info
*info
)
2225 asection
*tls_sec
= elf_hash_table (info
)->tls_sec
;
2229 struct elf_link_hash_entry
*tlsbase
;
2231 tlsbase
= elf_link_hash_lookup (elf_hash_table (info
),
2232 "_TLS_MODULE_BASE_",
2233 FALSE
, FALSE
, FALSE
);
2235 if (tlsbase
&& tlsbase
->type
== STT_TLS
)
2237 struct bfd_link_hash_entry
*bh
= NULL
;
2238 const struct elf_backend_data
*bed
2239 = get_elf_backend_data (output_bfd
);
2241 if (!(_bfd_generic_link_add_one_symbol
2242 (info
, output_bfd
, "_TLS_MODULE_BASE_", BSF_LOCAL
,
2243 tls_sec
, 0, NULL
, FALSE
,
2244 bed
->collect
, &bh
)))
2247 elf64_x86_64_hash_table (info
)->tls_module_base
= bh
;
2249 tlsbase
= (struct elf_link_hash_entry
*)bh
;
2250 tlsbase
->def_regular
= 1;
2251 tlsbase
->other
= STV_HIDDEN
;
2252 (*bed
->elf_backend_hide_symbol
) (info
, tlsbase
, TRUE
);
2259 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
2260 executables. Rather than setting it to the beginning of the TLS
2261 section, we have to set it to the end. This function may be called
2262 multiple times, it is idempotent. */
2265 set_tls_module_base (struct bfd_link_info
*info
)
2267 struct bfd_link_hash_entry
*base
;
2269 if (!info
->executable
)
2272 base
= elf64_x86_64_hash_table (info
)->tls_module_base
;
2277 base
->u
.def
.value
= elf_hash_table (info
)->tls_size
;
2280 /* Return the base VMA address which should be subtracted from real addresses
2281 when resolving @dtpoff relocation.
2282 This is PT_TLS segment p_vaddr. */
2285 dtpoff_base (struct bfd_link_info
*info
)
2287 /* If tls_sec is NULL, we should have signalled an error already. */
2288 if (elf_hash_table (info
)->tls_sec
== NULL
)
2290 return elf_hash_table (info
)->tls_sec
->vma
;
2293 /* Return the relocation value for @tpoff relocation
2294 if STT_TLS virtual address is ADDRESS. */
2297 tpoff (struct bfd_link_info
*info
, bfd_vma address
)
2299 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
2301 /* If tls_segment is NULL, we should have signalled an error already. */
2302 if (htab
->tls_sec
== NULL
)
2304 return address
- htab
->tls_size
- htab
->tls_sec
->vma
;
2307 /* Is the instruction before OFFSET in CONTENTS a 32bit relative
2311 is_32bit_relative_branch (bfd_byte
*contents
, bfd_vma offset
)
2313 /* Opcode Instruction
2316 0x0f 0x8x conditional jump */
2318 && (contents
[offset
- 1] == 0xe8
2319 || contents
[offset
- 1] == 0xe9))
2321 && contents
[offset
- 2] == 0x0f
2322 && (contents
[offset
- 1] & 0xf0) == 0x80));
2325 /* Relocate an x86_64 ELF section. */
2328 elf64_x86_64_relocate_section (bfd
*output_bfd
, struct bfd_link_info
*info
,
2329 bfd
*input_bfd
, asection
*input_section
,
2330 bfd_byte
*contents
, Elf_Internal_Rela
*relocs
,
2331 Elf_Internal_Sym
*local_syms
,
2332 asection
**local_sections
)
2334 struct elf64_x86_64_link_hash_table
*htab
;
2335 Elf_Internal_Shdr
*symtab_hdr
;
2336 struct elf_link_hash_entry
**sym_hashes
;
2337 bfd_vma
*local_got_offsets
;
2338 bfd_vma
*local_tlsdesc_gotents
;
2339 Elf_Internal_Rela
*rel
;
2340 Elf_Internal_Rela
*relend
;
2342 BFD_ASSERT (is_x86_64_elf (input_bfd
));
2344 htab
= elf64_x86_64_hash_table (info
);
2345 symtab_hdr
= &elf_symtab_hdr (input_bfd
);
2346 sym_hashes
= elf_sym_hashes (input_bfd
);
2347 local_got_offsets
= elf_local_got_offsets (input_bfd
);
2348 local_tlsdesc_gotents
= elf64_x86_64_local_tlsdesc_gotent (input_bfd
);
2350 set_tls_module_base (info
);
2353 relend
= relocs
+ input_section
->reloc_count
;
2354 for (; rel
< relend
; rel
++)
2356 unsigned int r_type
;
2357 reloc_howto_type
*howto
;
2358 unsigned long r_symndx
;
2359 struct elf_link_hash_entry
*h
;
2360 Elf_Internal_Sym
*sym
;
2362 bfd_vma off
, offplt
;
2364 bfd_boolean unresolved_reloc
;
2365 bfd_reloc_status_type r
;
2368 r_type
= ELF64_R_TYPE (rel
->r_info
);
2369 if (r_type
== (int) R_X86_64_GNU_VTINHERIT
2370 || r_type
== (int) R_X86_64_GNU_VTENTRY
)
2373 if (r_type
>= R_X86_64_max
)
2375 bfd_set_error (bfd_error_bad_value
);
2379 howto
= x86_64_elf_howto_table
+ r_type
;
2380 r_symndx
= ELF64_R_SYM (rel
->r_info
);
2384 unresolved_reloc
= FALSE
;
2385 if (r_symndx
< symtab_hdr
->sh_info
)
2387 sym
= local_syms
+ r_symndx
;
2388 sec
= local_sections
[r_symndx
];
2390 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
2396 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
2397 r_symndx
, symtab_hdr
, sym_hashes
,
2399 unresolved_reloc
, warned
);
2402 if (sec
!= NULL
&& elf_discarded_section (sec
))
2404 /* For relocs against symbols from removed linkonce sections,
2405 or sections discarded by a linker script, we just want the
2406 section contents zeroed. Avoid any special processing. */
2407 _bfd_clear_contents (howto
, input_bfd
, contents
+ rel
->r_offset
);
2413 if (info
->relocatable
)
2416 /* When generating a shared object, the relocations handled here are
2417 copied into the output file to be resolved at run time. */
2421 case R_X86_64_GOT32
:
2422 case R_X86_64_GOT64
:
2423 /* Relocation is to the entry for this symbol in the global
2425 case R_X86_64_GOTPCREL
:
2426 case R_X86_64_GOTPCREL64
:
2427 /* Use global offset table entry as symbol value. */
2428 case R_X86_64_GOTPLT64
:
2429 /* This is the same as GOT64 for relocation purposes, but
2430 indicates the existence of a PLT entry. The difficulty is,
2431 that we must calculate the GOT slot offset from the PLT
2432 offset, if this symbol got a PLT entry (it was global).
2433 Additionally if it's computed from the PLT entry, then that
2434 GOT offset is relative to .got.plt, not to .got. */
2435 base_got
= htab
->sgot
;
2437 if (htab
->sgot
== NULL
)
2444 off
= h
->got
.offset
;
2446 && h
->plt
.offset
!= (bfd_vma
)-1
2447 && off
== (bfd_vma
)-1)
2449 /* We can't use h->got.offset here to save
2450 state, or even just remember the offset, as
2451 finish_dynamic_symbol would use that as offset into
2453 bfd_vma plt_index
= h
->plt
.offset
/ PLT_ENTRY_SIZE
- 1;
2454 off
= (plt_index
+ 3) * GOT_ENTRY_SIZE
;
2455 base_got
= htab
->sgotplt
;
2458 dyn
= htab
->elf
.dynamic_sections_created
;
2460 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
2462 && SYMBOL_REFERENCES_LOCAL (info
, h
))
2463 || (ELF_ST_VISIBILITY (h
->other
)
2464 && h
->root
.type
== bfd_link_hash_undefweak
))
2466 /* This is actually a static link, or it is a -Bsymbolic
2467 link and the symbol is defined locally, or the symbol
2468 was forced to be local because of a version file. We
2469 must initialize this entry in the global offset table.
2470 Since the offset must always be a multiple of 8, we
2471 use the least significant bit to record whether we
2472 have initialized it already.
2474 When doing a dynamic link, we create a .rela.got
2475 relocation entry to initialize the value. This is
2476 done in the finish_dynamic_symbol routine. */
2481 bfd_put_64 (output_bfd
, relocation
,
2482 base_got
->contents
+ off
);
2483 /* Note that this is harmless for the GOTPLT64 case,
2484 as -1 | 1 still is -1. */
2489 unresolved_reloc
= FALSE
;
2493 if (local_got_offsets
== NULL
)
2496 off
= local_got_offsets
[r_symndx
];
2498 /* The offset must always be a multiple of 8. We use
2499 the least significant bit to record whether we have
2500 already generated the necessary reloc. */
2505 bfd_put_64 (output_bfd
, relocation
,
2506 base_got
->contents
+ off
);
2511 Elf_Internal_Rela outrel
;
2514 /* We need to generate a R_X86_64_RELATIVE reloc
2515 for the dynamic linker. */
2520 outrel
.r_offset
= (base_got
->output_section
->vma
2521 + base_got
->output_offset
2523 outrel
.r_info
= ELF64_R_INFO (0, R_X86_64_RELATIVE
);
2524 outrel
.r_addend
= relocation
;
2526 loc
+= s
->reloc_count
++ * sizeof (Elf64_External_Rela
);
2527 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
2530 local_got_offsets
[r_symndx
] |= 1;
2534 if (off
>= (bfd_vma
) -2)
2537 relocation
= base_got
->output_section
->vma
2538 + base_got
->output_offset
+ off
;
2539 if (r_type
!= R_X86_64_GOTPCREL
&& r_type
!= R_X86_64_GOTPCREL64
)
2540 relocation
-= htab
->sgotplt
->output_section
->vma
2541 - htab
->sgotplt
->output_offset
;
2545 case R_X86_64_GOTOFF64
:
2546 /* Relocation is relative to the start of the global offset
2549 /* Check to make sure it isn't a protected function symbol
2550 for shared library since it may not be local when used
2551 as function address. */
2555 && h
->type
== STT_FUNC
2556 && ELF_ST_VISIBILITY (h
->other
) == STV_PROTECTED
)
2558 (*_bfd_error_handler
)
2559 (_("%B: relocation R_X86_64_GOTOFF64 against protected function `%s' can not be used when making a shared object"),
2560 input_bfd
, h
->root
.root
.string
);
2561 bfd_set_error (bfd_error_bad_value
);
2565 /* Note that sgot is not involved in this
2566 calculation. We always want the start of .got.plt. If we
2567 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
2568 permitted by the ABI, we might have to change this
2570 relocation
-= htab
->sgotplt
->output_section
->vma
2571 + htab
->sgotplt
->output_offset
;
2574 case R_X86_64_GOTPC32
:
2575 case R_X86_64_GOTPC64
:
2576 /* Use global offset table as symbol value. */
2577 relocation
= htab
->sgotplt
->output_section
->vma
2578 + htab
->sgotplt
->output_offset
;
2579 unresolved_reloc
= FALSE
;
2582 case R_X86_64_PLTOFF64
:
2583 /* Relocation is PLT entry relative to GOT. For local
2584 symbols it's the symbol itself relative to GOT. */
2586 /* See PLT32 handling. */
2587 && h
->plt
.offset
!= (bfd_vma
) -1
2588 && htab
->splt
!= NULL
)
2590 relocation
= (htab
->splt
->output_section
->vma
2591 + htab
->splt
->output_offset
2593 unresolved_reloc
= FALSE
;
2596 relocation
-= htab
->sgotplt
->output_section
->vma
2597 + htab
->sgotplt
->output_offset
;
2600 case R_X86_64_PLT32
:
2601 /* Relocation is to the entry for this symbol in the
2602 procedure linkage table. */
2604 /* Resolve a PLT32 reloc against a local symbol directly,
2605 without using the procedure linkage table. */
2609 if (h
->plt
.offset
== (bfd_vma
) -1
2610 || htab
->splt
== NULL
)
2612 /* We didn't make a PLT entry for this symbol. This
2613 happens when statically linking PIC code, or when
2614 using -Bsymbolic. */
2618 relocation
= (htab
->splt
->output_section
->vma
2619 + htab
->splt
->output_offset
2621 unresolved_reloc
= FALSE
;
2628 && (input_section
->flags
& SEC_ALLOC
) != 0
2629 && (input_section
->flags
& SEC_READONLY
) != 0
2632 bfd_boolean fail
= FALSE
;
2634 = (r_type
== R_X86_64_PC32
2635 && is_32bit_relative_branch (contents
, rel
->r_offset
));
2637 if (SYMBOL_REFERENCES_LOCAL (info
, h
))
2639 /* Symbol is referenced locally. Make sure it is
2640 defined locally or for a branch. */
2641 fail
= !h
->def_regular
&& !branch
;
2645 /* Symbol isn't referenced locally. We only allow
2646 branch to symbol with non-default visibility. */
2648 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
);
2655 const char *pic
= "";
2657 switch (ELF_ST_VISIBILITY (h
->other
))
2660 v
= _("hidden symbol");
2663 v
= _("internal symbol");
2666 v
= _("protected symbol");
2670 pic
= _("; recompile with -fPIC");
2675 fmt
= _("%B: relocation %s against %s `%s' can not be used when making a shared object%s");
2677 fmt
= _("%B: relocation %s against undefined %s `%s' can not be used when making a shared object%s");
2679 (*_bfd_error_handler
) (fmt
, input_bfd
,
2680 x86_64_elf_howto_table
[r_type
].name
,
2681 v
, h
->root
.root
.string
, pic
);
2682 bfd_set_error (bfd_error_bad_value
);
2693 /* FIXME: The ABI says the linker should make sure the value is
2694 the same when it's zeroextended to 64 bit. */
2696 if ((input_section
->flags
& SEC_ALLOC
) == 0)
2701 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
2702 || h
->root
.type
!= bfd_link_hash_undefweak
)
2703 && ((r_type
!= R_X86_64_PC8
2704 && r_type
!= R_X86_64_PC16
2705 && r_type
!= R_X86_64_PC32
2706 && r_type
!= R_X86_64_PC64
)
2707 || !SYMBOL_CALLS_LOCAL (info
, h
)))
2708 || (ELIMINATE_COPY_RELOCS
2715 || h
->root
.type
== bfd_link_hash_undefweak
2716 || h
->root
.type
== bfd_link_hash_undefined
)))
2718 Elf_Internal_Rela outrel
;
2720 bfd_boolean skip
, relocate
;
2723 /* When generating a shared object, these relocations
2724 are copied into the output file to be resolved at run
2730 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
2732 if (outrel
.r_offset
== (bfd_vma
) -1)
2734 else if (outrel
.r_offset
== (bfd_vma
) -2)
2735 skip
= TRUE
, relocate
= TRUE
;
2737 outrel
.r_offset
+= (input_section
->output_section
->vma
2738 + input_section
->output_offset
);
2741 memset (&outrel
, 0, sizeof outrel
);
2743 /* h->dynindx may be -1 if this symbol was marked to
2747 && (r_type
== R_X86_64_PC8
2748 || r_type
== R_X86_64_PC16
2749 || r_type
== R_X86_64_PC32
2750 || r_type
== R_X86_64_PC64
2752 || !SYMBOLIC_BIND (info
, h
)
2753 || !h
->def_regular
))
2755 outrel
.r_info
= ELF64_R_INFO (h
->dynindx
, r_type
);
2756 outrel
.r_addend
= rel
->r_addend
;
2760 /* This symbol is local, or marked to become local. */
2761 if (r_type
== R_X86_64_64
)
2764 outrel
.r_info
= ELF64_R_INFO (0, R_X86_64_RELATIVE
);
2765 outrel
.r_addend
= relocation
+ rel
->r_addend
;
2771 if (bfd_is_abs_section (sec
))
2773 else if (sec
== NULL
|| sec
->owner
== NULL
)
2775 bfd_set_error (bfd_error_bad_value
);
2782 /* We are turning this relocation into one
2783 against a section symbol. It would be
2784 proper to subtract the symbol's value,
2785 osec->vma, from the emitted reloc addend,
2786 but ld.so expects buggy relocs. */
2787 osec
= sec
->output_section
;
2788 sindx
= elf_section_data (osec
)->dynindx
;
2791 asection
*oi
= htab
->elf
.text_index_section
;
2792 sindx
= elf_section_data (oi
)->dynindx
;
2794 BFD_ASSERT (sindx
!= 0);
2797 outrel
.r_info
= ELF64_R_INFO (sindx
, r_type
);
2798 outrel
.r_addend
= relocation
+ rel
->r_addend
;
2802 sreloc
= elf_section_data (input_section
)->sreloc
;
2806 loc
= sreloc
->contents
;
2807 loc
+= sreloc
->reloc_count
++ * sizeof (Elf64_External_Rela
);
2808 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
2810 /* If this reloc is against an external symbol, we do
2811 not want to fiddle with the addend. Otherwise, we
2812 need to include the symbol value so that it becomes
2813 an addend for the dynamic reloc. */
2820 case R_X86_64_TLSGD
:
2821 case R_X86_64_GOTPC32_TLSDESC
:
2822 case R_X86_64_TLSDESC_CALL
:
2823 case R_X86_64_GOTTPOFF
:
2824 tls_type
= GOT_UNKNOWN
;
2825 if (h
== NULL
&& local_got_offsets
)
2826 tls_type
= elf64_x86_64_local_got_tls_type (input_bfd
) [r_symndx
];
2828 tls_type
= elf64_x86_64_hash_entry (h
)->tls_type
;
2830 if (! elf64_x86_64_tls_transition (info
, input_bfd
,
2831 input_section
, contents
,
2832 symtab_hdr
, sym_hashes
,
2833 &r_type
, tls_type
, rel
,
2837 if (r_type
== R_X86_64_TPOFF32
)
2839 bfd_vma roff
= rel
->r_offset
;
2841 BFD_ASSERT (! unresolved_reloc
);
2843 if (ELF64_R_TYPE (rel
->r_info
) == R_X86_64_TLSGD
)
2845 /* GD->LE transition.
2846 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
2847 .word 0x6666; rex64; call __tls_get_addr
2850 leaq foo@tpoff(%rax), %rax */
2851 memcpy (contents
+ roff
- 4,
2852 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
2854 bfd_put_32 (output_bfd
, tpoff (info
, relocation
),
2855 contents
+ roff
+ 8);
2856 /* Skip R_X86_64_PC32/R_X86_64_PLT32. */
2860 else if (ELF64_R_TYPE (rel
->r_info
) == R_X86_64_GOTPC32_TLSDESC
)
2862 /* GDesc -> LE transition.
2863 It's originally something like:
2864 leaq x@tlsdesc(%rip), %rax
2870 unsigned int val
, type
, type2
;
2872 type
= bfd_get_8 (input_bfd
, contents
+ roff
- 3);
2873 type2
= bfd_get_8 (input_bfd
, contents
+ roff
- 2);
2874 val
= bfd_get_8 (input_bfd
, contents
+ roff
- 1);
2875 bfd_put_8 (output_bfd
, 0x48 | ((type
>> 2) & 1),
2876 contents
+ roff
- 3);
2877 bfd_put_8 (output_bfd
, 0xc7, contents
+ roff
- 2);
2878 bfd_put_8 (output_bfd
, 0xc0 | ((val
>> 3) & 7),
2879 contents
+ roff
- 1);
2880 bfd_put_32 (output_bfd
, tpoff (info
, relocation
),
2884 else if (ELF64_R_TYPE (rel
->r_info
) == R_X86_64_TLSDESC_CALL
)
2886 /* GDesc -> LE transition.
2891 bfd_put_8 (output_bfd
, 0x66, contents
+ roff
);
2892 bfd_put_8 (output_bfd
, 0x90, contents
+ roff
+ 1);
2895 else if (ELF64_R_TYPE (rel
->r_info
) == R_X86_64_GOTTPOFF
)
2897 /* IE->LE transition:
2898 Originally it can be one of:
2899 movq foo@gottpoff(%rip), %reg
2900 addq foo@gottpoff(%rip), %reg
2903 leaq foo(%reg), %reg
2906 unsigned int val
, type
, reg
;
2908 val
= bfd_get_8 (input_bfd
, contents
+ roff
- 3);
2909 type
= bfd_get_8 (input_bfd
, contents
+ roff
- 2);
2910 reg
= bfd_get_8 (input_bfd
, contents
+ roff
- 1);
2916 bfd_put_8 (output_bfd
, 0x49,
2917 contents
+ roff
- 3);
2918 bfd_put_8 (output_bfd
, 0xc7,
2919 contents
+ roff
- 2);
2920 bfd_put_8 (output_bfd
, 0xc0 | reg
,
2921 contents
+ roff
- 1);
2925 /* addq -> addq - addressing with %rsp/%r12 is
2928 bfd_put_8 (output_bfd
, 0x49,
2929 contents
+ roff
- 3);
2930 bfd_put_8 (output_bfd
, 0x81,
2931 contents
+ roff
- 2);
2932 bfd_put_8 (output_bfd
, 0xc0 | reg
,
2933 contents
+ roff
- 1);
2939 bfd_put_8 (output_bfd
, 0x4d,
2940 contents
+ roff
- 3);
2941 bfd_put_8 (output_bfd
, 0x8d,
2942 contents
+ roff
- 2);
2943 bfd_put_8 (output_bfd
, 0x80 | reg
| (reg
<< 3),
2944 contents
+ roff
- 1);
2946 bfd_put_32 (output_bfd
, tpoff (info
, relocation
),
2954 if (htab
->sgot
== NULL
)
2959 off
= h
->got
.offset
;
2960 offplt
= elf64_x86_64_hash_entry (h
)->tlsdesc_got
;
2964 if (local_got_offsets
== NULL
)
2967 off
= local_got_offsets
[r_symndx
];
2968 offplt
= local_tlsdesc_gotents
[r_symndx
];
2975 Elf_Internal_Rela outrel
;
2980 if (htab
->srelgot
== NULL
)
2983 indx
= h
&& h
->dynindx
!= -1 ? h
->dynindx
: 0;
2985 if (GOT_TLS_GDESC_P (tls_type
))
2987 outrel
.r_info
= ELF64_R_INFO (indx
, R_X86_64_TLSDESC
);
2988 BFD_ASSERT (htab
->sgotplt_jump_table_size
+ offplt
2989 + 2 * GOT_ENTRY_SIZE
<= htab
->sgotplt
->size
);
2990 outrel
.r_offset
= (htab
->sgotplt
->output_section
->vma
2991 + htab
->sgotplt
->output_offset
2993 + htab
->sgotplt_jump_table_size
);
2994 sreloc
= htab
->srelplt
;
2995 loc
= sreloc
->contents
;
2996 loc
+= sreloc
->reloc_count
++
2997 * sizeof (Elf64_External_Rela
);
2998 BFD_ASSERT (loc
+ sizeof (Elf64_External_Rela
)
2999 <= sreloc
->contents
+ sreloc
->size
);
3001 outrel
.r_addend
= relocation
- dtpoff_base (info
);
3003 outrel
.r_addend
= 0;
3004 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
3007 sreloc
= htab
->srelgot
;
3009 outrel
.r_offset
= (htab
->sgot
->output_section
->vma
3010 + htab
->sgot
->output_offset
+ off
);
3012 if (GOT_TLS_GD_P (tls_type
))
3013 dr_type
= R_X86_64_DTPMOD64
;
3014 else if (GOT_TLS_GDESC_P (tls_type
))
3017 dr_type
= R_X86_64_TPOFF64
;
3019 bfd_put_64 (output_bfd
, 0, htab
->sgot
->contents
+ off
);
3020 outrel
.r_addend
= 0;
3021 if ((dr_type
== R_X86_64_TPOFF64
3022 || dr_type
== R_X86_64_TLSDESC
) && indx
== 0)
3023 outrel
.r_addend
= relocation
- dtpoff_base (info
);
3024 outrel
.r_info
= ELF64_R_INFO (indx
, dr_type
);
3026 loc
= sreloc
->contents
;
3027 loc
+= sreloc
->reloc_count
++ * sizeof (Elf64_External_Rela
);
3028 BFD_ASSERT (loc
+ sizeof (Elf64_External_Rela
)
3029 <= sreloc
->contents
+ sreloc
->size
);
3030 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
3032 if (GOT_TLS_GD_P (tls_type
))
3036 BFD_ASSERT (! unresolved_reloc
);
3037 bfd_put_64 (output_bfd
,
3038 relocation
- dtpoff_base (info
),
3039 htab
->sgot
->contents
+ off
+ GOT_ENTRY_SIZE
);
3043 bfd_put_64 (output_bfd
, 0,
3044 htab
->sgot
->contents
+ off
+ GOT_ENTRY_SIZE
);
3045 outrel
.r_info
= ELF64_R_INFO (indx
,
3047 outrel
.r_offset
+= GOT_ENTRY_SIZE
;
3048 sreloc
->reloc_count
++;
3049 loc
+= sizeof (Elf64_External_Rela
);
3050 BFD_ASSERT (loc
+ sizeof (Elf64_External_Rela
)
3051 <= sreloc
->contents
+ sreloc
->size
);
3052 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
3060 local_got_offsets
[r_symndx
] |= 1;
3063 if (off
>= (bfd_vma
) -2
3064 && ! GOT_TLS_GDESC_P (tls_type
))
3066 if (r_type
== ELF64_R_TYPE (rel
->r_info
))
3068 if (r_type
== R_X86_64_GOTPC32_TLSDESC
3069 || r_type
== R_X86_64_TLSDESC_CALL
)
3070 relocation
= htab
->sgotplt
->output_section
->vma
3071 + htab
->sgotplt
->output_offset
3072 + offplt
+ htab
->sgotplt_jump_table_size
;
3074 relocation
= htab
->sgot
->output_section
->vma
3075 + htab
->sgot
->output_offset
+ off
;
3076 unresolved_reloc
= FALSE
;
3080 bfd_vma roff
= rel
->r_offset
;
3082 if (ELF64_R_TYPE (rel
->r_info
) == R_X86_64_TLSGD
)
3084 /* GD->IE transition.
3085 .byte 0x66; leaq foo@tlsgd(%rip), %rdi
3086 .word 0x6666; rex64; call __tls_get_addr@plt
3089 addq foo@gottpoff(%rip), %rax */
3090 memcpy (contents
+ roff
- 4,
3091 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
3094 relocation
= (htab
->sgot
->output_section
->vma
3095 + htab
->sgot
->output_offset
+ off
3097 - input_section
->output_section
->vma
3098 - input_section
->output_offset
3100 bfd_put_32 (output_bfd
, relocation
,
3101 contents
+ roff
+ 8);
3102 /* Skip R_X86_64_PLT32. */
3106 else if (ELF64_R_TYPE (rel
->r_info
) == R_X86_64_GOTPC32_TLSDESC
)
3108 /* GDesc -> IE transition.
3109 It's originally something like:
3110 leaq x@tlsdesc(%rip), %rax
3113 movq x@gottpoff(%rip), %rax # before xchg %ax,%ax
3116 unsigned int val
, type
, type2
;
3118 type
= bfd_get_8 (input_bfd
, contents
+ roff
- 3);
3119 type2
= bfd_get_8 (input_bfd
, contents
+ roff
- 2);
3120 val
= bfd_get_8 (input_bfd
, contents
+ roff
- 1);
3122 /* Now modify the instruction as appropriate. To
3123 turn a leaq into a movq in the form we use it, it
3124 suffices to change the second byte from 0x8d to
3126 bfd_put_8 (output_bfd
, 0x8b, contents
+ roff
- 2);
3128 bfd_put_32 (output_bfd
,
3129 htab
->sgot
->output_section
->vma
3130 + htab
->sgot
->output_offset
+ off
3132 - input_section
->output_section
->vma
3133 - input_section
->output_offset
3138 else if (ELF64_R_TYPE (rel
->r_info
) == R_X86_64_TLSDESC_CALL
)
3140 /* GDesc -> IE transition.
3147 unsigned int val
, type
;
3149 type
= bfd_get_8 (input_bfd
, contents
+ roff
);
3150 val
= bfd_get_8 (input_bfd
, contents
+ roff
+ 1);
3151 bfd_put_8 (output_bfd
, 0x66, contents
+ roff
);
3152 bfd_put_8 (output_bfd
, 0x90, contents
+ roff
+ 1);
3160 case R_X86_64_TLSLD
:
3161 if (! elf64_x86_64_tls_transition (info
, input_bfd
,
3162 input_section
, contents
,
3163 symtab_hdr
, sym_hashes
,
3164 &r_type
, GOT_UNKNOWN
,
3168 if (r_type
!= R_X86_64_TLSLD
)
3170 /* LD->LE transition:
3171 leaq foo@tlsld(%rip), %rdi; call __tls_get_addr.
3173 .word 0x6666; .byte 0x66; movl %fs:0, %rax. */
3175 BFD_ASSERT (r_type
== R_X86_64_TPOFF32
);
3176 memcpy (contents
+ rel
->r_offset
- 3,
3177 "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
3178 /* Skip R_X86_64_PC32/R_X86_64_PLT32. */
3183 if (htab
->sgot
== NULL
)
3186 off
= htab
->tls_ld_got
.offset
;
3191 Elf_Internal_Rela outrel
;
3194 if (htab
->srelgot
== NULL
)
3197 outrel
.r_offset
= (htab
->sgot
->output_section
->vma
3198 + htab
->sgot
->output_offset
+ off
);
3200 bfd_put_64 (output_bfd
, 0,
3201 htab
->sgot
->contents
+ off
);
3202 bfd_put_64 (output_bfd
, 0,
3203 htab
->sgot
->contents
+ off
+ GOT_ENTRY_SIZE
);
3204 outrel
.r_info
= ELF64_R_INFO (0, R_X86_64_DTPMOD64
);
3205 outrel
.r_addend
= 0;
3206 loc
= htab
->srelgot
->contents
;
3207 loc
+= htab
->srelgot
->reloc_count
++ * sizeof (Elf64_External_Rela
);
3208 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
3209 htab
->tls_ld_got
.offset
|= 1;
3211 relocation
= htab
->sgot
->output_section
->vma
3212 + htab
->sgot
->output_offset
+ off
;
3213 unresolved_reloc
= FALSE
;
3216 case R_X86_64_DTPOFF32
:
3217 if (info
->shared
|| (input_section
->flags
& SEC_CODE
) == 0)
3218 relocation
-= dtpoff_base (info
);
3220 relocation
= tpoff (info
, relocation
);
3223 case R_X86_64_TPOFF32
:
3224 BFD_ASSERT (! info
->shared
);
3225 relocation
= tpoff (info
, relocation
);
3232 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3233 because such sections are not SEC_ALLOC and thus ld.so will
3234 not process them. */
3235 if (unresolved_reloc
3236 && !((input_section
->flags
& SEC_DEBUGGING
) != 0
3238 (*_bfd_error_handler
)
3239 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3242 (long) rel
->r_offset
,
3244 h
->root
.root
.string
);
3246 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
3247 contents
, rel
->r_offset
,
3248 relocation
, rel
->r_addend
);
3250 if (r
!= bfd_reloc_ok
)
3255 name
= h
->root
.root
.string
;
3258 name
= bfd_elf_string_from_elf_section (input_bfd
,
3259 symtab_hdr
->sh_link
,
3264 name
= bfd_section_name (input_bfd
, sec
);
3267 if (r
== bfd_reloc_overflow
)
3269 if (! ((*info
->callbacks
->reloc_overflow
)
3270 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
3271 (bfd_vma
) 0, input_bfd
, input_section
,
3277 (*_bfd_error_handler
)
3278 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
3279 input_bfd
, input_section
,
3280 (long) rel
->r_offset
, name
, (int) r
);
3289 /* Finish up dynamic symbol handling. We set the contents of various
3290 dynamic sections here. */
3293 elf64_x86_64_finish_dynamic_symbol (bfd
*output_bfd
,
3294 struct bfd_link_info
*info
,
3295 struct elf_link_hash_entry
*h
,
3296 Elf_Internal_Sym
*sym
)
3298 struct elf64_x86_64_link_hash_table
*htab
;
3300 htab
= elf64_x86_64_hash_table (info
);
3302 if (h
->plt
.offset
!= (bfd_vma
) -1)
3306 Elf_Internal_Rela rela
;
3309 /* This symbol has an entry in the procedure linkage table. Set
3311 if (h
->dynindx
== -1
3312 || htab
->splt
== NULL
3313 || htab
->sgotplt
== NULL
3314 || htab
->srelplt
== NULL
)
3317 /* Get the index in the procedure linkage table which
3318 corresponds to this symbol. This is the index of this symbol
3319 in all the symbols for which we are making plt entries. The
3320 first entry in the procedure linkage table is reserved. */
3321 plt_index
= h
->plt
.offset
/ PLT_ENTRY_SIZE
- 1;
3323 /* Get the offset into the .got table of the entry that
3324 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
3325 bytes. The first three are reserved for the dynamic linker. */
3326 got_offset
= (plt_index
+ 3) * GOT_ENTRY_SIZE
;
3328 /* Fill in the entry in the procedure linkage table. */
3329 memcpy (htab
->splt
->contents
+ h
->plt
.offset
, elf64_x86_64_plt_entry
,
3332 /* Insert the relocation positions of the plt section. The magic
3333 numbers at the end of the statements are the positions of the
3334 relocations in the plt section. */
3335 /* Put offset for jmp *name@GOTPCREL(%rip), since the
3336 instruction uses 6 bytes, subtract this value. */
3337 bfd_put_32 (output_bfd
,
3338 (htab
->sgotplt
->output_section
->vma
3339 + htab
->sgotplt
->output_offset
3341 - htab
->splt
->output_section
->vma
3342 - htab
->splt
->output_offset
3345 htab
->splt
->contents
+ h
->plt
.offset
+ 2);
3346 /* Put relocation index. */
3347 bfd_put_32 (output_bfd
, plt_index
,
3348 htab
->splt
->contents
+ h
->plt
.offset
+ 7);
3349 /* Put offset for jmp .PLT0. */
3350 bfd_put_32 (output_bfd
, - (h
->plt
.offset
+ PLT_ENTRY_SIZE
),
3351 htab
->splt
->contents
+ h
->plt
.offset
+ 12);
3353 /* Fill in the entry in the global offset table, initially this
3354 points to the pushq instruction in the PLT which is at offset 6. */
3355 bfd_put_64 (output_bfd
, (htab
->splt
->output_section
->vma
3356 + htab
->splt
->output_offset
3357 + h
->plt
.offset
+ 6),
3358 htab
->sgotplt
->contents
+ got_offset
);
3360 /* Fill in the entry in the .rela.plt section. */
3361 rela
.r_offset
= (htab
->sgotplt
->output_section
->vma
3362 + htab
->sgotplt
->output_offset
3364 rela
.r_info
= ELF64_R_INFO (h
->dynindx
, R_X86_64_JUMP_SLOT
);
3366 loc
= htab
->srelplt
->contents
+ plt_index
* sizeof (Elf64_External_Rela
);
3367 bfd_elf64_swap_reloca_out (output_bfd
, &rela
, loc
);
3369 if (!h
->def_regular
)
3371 /* Mark the symbol as undefined, rather than as defined in
3372 the .plt section. Leave the value if there were any
3373 relocations where pointer equality matters (this is a clue
3374 for the dynamic linker, to make function pointer
3375 comparisons work between an application and shared
3376 library), otherwise set it to zero. If a function is only
3377 called from a binary, there is no need to slow down
3378 shared libraries because of that. */
3379 sym
->st_shndx
= SHN_UNDEF
;
3380 if (!h
->pointer_equality_needed
)
3385 if (h
->got
.offset
!= (bfd_vma
) -1
3386 && ! GOT_TLS_GD_ANY_P (elf64_x86_64_hash_entry (h
)->tls_type
)
3387 && elf64_x86_64_hash_entry (h
)->tls_type
!= GOT_TLS_IE
)
3389 Elf_Internal_Rela rela
;
3392 /* This symbol has an entry in the global offset table. Set it
3394 if (htab
->sgot
== NULL
|| htab
->srelgot
== NULL
)
3397 rela
.r_offset
= (htab
->sgot
->output_section
->vma
3398 + htab
->sgot
->output_offset
3399 + (h
->got
.offset
&~ (bfd_vma
) 1));
3401 /* If this is a static link, or it is a -Bsymbolic link and the
3402 symbol is defined locally or was forced to be local because
3403 of a version file, we just want to emit a RELATIVE reloc.
3404 The entry in the global offset table will already have been
3405 initialized in the relocate_section function. */
3407 && SYMBOL_REFERENCES_LOCAL (info
, h
))
3409 if (!h
->def_regular
)
3411 BFD_ASSERT((h
->got
.offset
& 1) != 0);
3412 rela
.r_info
= ELF64_R_INFO (0, R_X86_64_RELATIVE
);
3413 rela
.r_addend
= (h
->root
.u
.def
.value
3414 + h
->root
.u
.def
.section
->output_section
->vma
3415 + h
->root
.u
.def
.section
->output_offset
);
3419 BFD_ASSERT((h
->got
.offset
& 1) == 0);
3420 bfd_put_64 (output_bfd
, (bfd_vma
) 0,
3421 htab
->sgot
->contents
+ h
->got
.offset
);
3422 rela
.r_info
= ELF64_R_INFO (h
->dynindx
, R_X86_64_GLOB_DAT
);
3426 loc
= htab
->srelgot
->contents
;
3427 loc
+= htab
->srelgot
->reloc_count
++ * sizeof (Elf64_External_Rela
);
3428 bfd_elf64_swap_reloca_out (output_bfd
, &rela
, loc
);
3433 Elf_Internal_Rela rela
;
3436 /* This symbol needs a copy reloc. Set it up. */
3438 if (h
->dynindx
== -1
3439 || (h
->root
.type
!= bfd_link_hash_defined
3440 && h
->root
.type
!= bfd_link_hash_defweak
)
3441 || htab
->srelbss
== NULL
)
3444 rela
.r_offset
= (h
->root
.u
.def
.value
3445 + h
->root
.u
.def
.section
->output_section
->vma
3446 + h
->root
.u
.def
.section
->output_offset
);
3447 rela
.r_info
= ELF64_R_INFO (h
->dynindx
, R_X86_64_COPY
);
3449 loc
= htab
->srelbss
->contents
;
3450 loc
+= htab
->srelbss
->reloc_count
++ * sizeof (Elf64_External_Rela
);
3451 bfd_elf64_swap_reloca_out (output_bfd
, &rela
, loc
);
3454 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
3455 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
3456 || h
== htab
->elf
.hgot
)
3457 sym
->st_shndx
= SHN_ABS
;
3462 /* Used to decide how to sort relocs in an optimal manner for the
3463 dynamic linker, before writing them out. */
3465 static enum elf_reloc_type_class
3466 elf64_x86_64_reloc_type_class (const Elf_Internal_Rela
*rela
)
3468 switch ((int) ELF64_R_TYPE (rela
->r_info
))
3470 case R_X86_64_RELATIVE
:
3471 return reloc_class_relative
;
3472 case R_X86_64_JUMP_SLOT
:
3473 return reloc_class_plt
;
3475 return reloc_class_copy
;
3477 return reloc_class_normal
;
3481 /* Finish up the dynamic sections. */
3484 elf64_x86_64_finish_dynamic_sections (bfd
*output_bfd
, struct bfd_link_info
*info
)
3486 struct elf64_x86_64_link_hash_table
*htab
;
3490 htab
= elf64_x86_64_hash_table (info
);
3491 dynobj
= htab
->elf
.dynobj
;
3492 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
3494 if (htab
->elf
.dynamic_sections_created
)
3496 Elf64_External_Dyn
*dyncon
, *dynconend
;
3498 if (sdyn
== NULL
|| htab
->sgot
== NULL
)
3501 dyncon
= (Elf64_External_Dyn
*) sdyn
->contents
;
3502 dynconend
= (Elf64_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
3503 for (; dyncon
< dynconend
; dyncon
++)
3505 Elf_Internal_Dyn dyn
;
3508 bfd_elf64_swap_dyn_in (dynobj
, dyncon
, &dyn
);
3517 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
3521 dyn
.d_un
.d_ptr
= htab
->srelplt
->output_section
->vma
;
3525 s
= htab
->srelplt
->output_section
;
3526 dyn
.d_un
.d_val
= s
->size
;
3530 /* The procedure linkage table relocs (DT_JMPREL) should
3531 not be included in the overall relocs (DT_RELA).
3532 Therefore, we override the DT_RELASZ entry here to
3533 make it not include the JMPREL relocs. Since the
3534 linker script arranges for .rela.plt to follow all
3535 other relocation sections, we don't have to worry
3536 about changing the DT_RELA entry. */
3537 if (htab
->srelplt
!= NULL
)
3539 s
= htab
->srelplt
->output_section
;
3540 dyn
.d_un
.d_val
-= s
->size
;
3544 case DT_TLSDESC_PLT
:
3546 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
3547 + htab
->tlsdesc_plt
;
3550 case DT_TLSDESC_GOT
:
3552 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
3553 + htab
->tlsdesc_got
;
3557 bfd_elf64_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
3560 /* Fill in the special first entry in the procedure linkage table. */
3561 if (htab
->splt
&& htab
->splt
->size
> 0)
3563 /* Fill in the first entry in the procedure linkage table. */
3564 memcpy (htab
->splt
->contents
, elf64_x86_64_plt0_entry
,
3566 /* Add offset for pushq GOT+8(%rip), since the instruction
3567 uses 6 bytes subtract this value. */
3568 bfd_put_32 (output_bfd
,
3569 (htab
->sgotplt
->output_section
->vma
3570 + htab
->sgotplt
->output_offset
3572 - htab
->splt
->output_section
->vma
3573 - htab
->splt
->output_offset
3575 htab
->splt
->contents
+ 2);
3576 /* Add offset for jmp *GOT+16(%rip). The 12 is the offset to
3577 the end of the instruction. */
3578 bfd_put_32 (output_bfd
,
3579 (htab
->sgotplt
->output_section
->vma
3580 + htab
->sgotplt
->output_offset
3582 - htab
->splt
->output_section
->vma
3583 - htab
->splt
->output_offset
3585 htab
->splt
->contents
+ 8);
3587 elf_section_data (htab
->splt
->output_section
)->this_hdr
.sh_entsize
=
3590 if (htab
->tlsdesc_plt
)
3592 bfd_put_64 (output_bfd
, (bfd_vma
) 0,
3593 htab
->sgot
->contents
+ htab
->tlsdesc_got
);
3595 memcpy (htab
->splt
->contents
+ htab
->tlsdesc_plt
,
3596 elf64_x86_64_plt0_entry
,
3599 /* Add offset for pushq GOT+8(%rip), since the
3600 instruction uses 6 bytes subtract this value. */
3601 bfd_put_32 (output_bfd
,
3602 (htab
->sgotplt
->output_section
->vma
3603 + htab
->sgotplt
->output_offset
3605 - htab
->splt
->output_section
->vma
3606 - htab
->splt
->output_offset
3609 htab
->splt
->contents
+ htab
->tlsdesc_plt
+ 2);
3610 /* Add offset for jmp *GOT+TDG(%rip), where TGD stands for
3611 htab->tlsdesc_got. The 12 is the offset to the end of
3613 bfd_put_32 (output_bfd
,
3614 (htab
->sgot
->output_section
->vma
3615 + htab
->sgot
->output_offset
3617 - htab
->splt
->output_section
->vma
3618 - htab
->splt
->output_offset
3621 htab
->splt
->contents
+ htab
->tlsdesc_plt
+ 8);
3628 /* Fill in the first three entries in the global offset table. */
3629 if (htab
->sgotplt
->size
> 0)
3631 /* Set the first entry in the global offset table to the address of
3632 the dynamic section. */
3634 bfd_put_64 (output_bfd
, (bfd_vma
) 0, htab
->sgotplt
->contents
);
3636 bfd_put_64 (output_bfd
,
3637 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
3638 htab
->sgotplt
->contents
);
3639 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
3640 bfd_put_64 (output_bfd
, (bfd_vma
) 0, htab
->sgotplt
->contents
+ GOT_ENTRY_SIZE
);
3641 bfd_put_64 (output_bfd
, (bfd_vma
) 0, htab
->sgotplt
->contents
+ GOT_ENTRY_SIZE
*2);
3644 elf_section_data (htab
->sgotplt
->output_section
)->this_hdr
.sh_entsize
=
3648 if (htab
->sgot
&& htab
->sgot
->size
> 0)
3649 elf_section_data (htab
->sgot
->output_section
)->this_hdr
.sh_entsize
3655 /* Return address for Ith PLT stub in section PLT, for relocation REL
3656 or (bfd_vma) -1 if it should not be included. */
3659 elf64_x86_64_plt_sym_val (bfd_vma i
, const asection
*plt
,
3660 const arelent
*rel ATTRIBUTE_UNUSED
)
3662 return plt
->vma
+ (i
+ 1) * PLT_ENTRY_SIZE
;
3665 /* Handle an x86-64 specific section when reading an object file. This
3666 is called when elfcode.h finds a section with an unknown type. */
3669 elf64_x86_64_section_from_shdr (bfd
*abfd
,
3670 Elf_Internal_Shdr
*hdr
,
3674 if (hdr
->sh_type
!= SHT_X86_64_UNWIND
)
3677 if (! _bfd_elf_make_section_from_shdr (abfd
, hdr
, name
, shindex
))
3683 /* Hook called by the linker routine which adds symbols from an object
3684 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
3688 elf64_x86_64_add_symbol_hook (bfd
*abfd
,
3689 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
3690 Elf_Internal_Sym
*sym
,
3691 const char **namep ATTRIBUTE_UNUSED
,
3692 flagword
*flagsp ATTRIBUTE_UNUSED
,
3693 asection
**secp
, bfd_vma
*valp
)
3697 switch (sym
->st_shndx
)
3699 case SHN_X86_64_LCOMMON
:
3700 lcomm
= bfd_get_section_by_name (abfd
, "LARGE_COMMON");
3703 lcomm
= bfd_make_section_with_flags (abfd
,
3707 | SEC_LINKER_CREATED
));
3710 elf_section_flags (lcomm
) |= SHF_X86_64_LARGE
;
3713 *valp
= sym
->st_size
;
3720 /* Given a BFD section, try to locate the corresponding ELF section
3724 elf64_x86_64_elf_section_from_bfd_section (bfd
*abfd ATTRIBUTE_UNUSED
,
3725 asection
*sec
, int *index
)
3727 if (sec
== &_bfd_elf_large_com_section
)
3729 *index
= SHN_X86_64_LCOMMON
;
3735 /* Process a symbol. */
3738 elf64_x86_64_symbol_processing (bfd
*abfd ATTRIBUTE_UNUSED
,
3741 elf_symbol_type
*elfsym
= (elf_symbol_type
*) asym
;
3743 switch (elfsym
->internal_elf_sym
.st_shndx
)
3745 case SHN_X86_64_LCOMMON
:
3746 asym
->section
= &_bfd_elf_large_com_section
;
3747 asym
->value
= elfsym
->internal_elf_sym
.st_size
;
3748 /* Common symbol doesn't set BSF_GLOBAL. */
3749 asym
->flags
&= ~BSF_GLOBAL
;
3755 elf64_x86_64_common_definition (Elf_Internal_Sym
*sym
)
3757 return (sym
->st_shndx
== SHN_COMMON
3758 || sym
->st_shndx
== SHN_X86_64_LCOMMON
);
3762 elf64_x86_64_common_section_index (asection
*sec
)
3764 if ((elf_section_flags (sec
) & SHF_X86_64_LARGE
) == 0)
3767 return SHN_X86_64_LCOMMON
;
3771 elf64_x86_64_common_section (asection
*sec
)
3773 if ((elf_section_flags (sec
) & SHF_X86_64_LARGE
) == 0)
3774 return bfd_com_section_ptr
;
3776 return &_bfd_elf_large_com_section
;
3780 elf64_x86_64_merge_symbol (struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
3781 struct elf_link_hash_entry
**sym_hash ATTRIBUTE_UNUSED
,
3782 struct elf_link_hash_entry
*h
,
3783 Elf_Internal_Sym
*sym
,
3785 bfd_vma
*pvalue ATTRIBUTE_UNUSED
,
3786 unsigned int *pold_alignment ATTRIBUTE_UNUSED
,
3787 bfd_boolean
*skip ATTRIBUTE_UNUSED
,
3788 bfd_boolean
*override ATTRIBUTE_UNUSED
,
3789 bfd_boolean
*type_change_ok ATTRIBUTE_UNUSED
,
3790 bfd_boolean
*size_change_ok ATTRIBUTE_UNUSED
,
3791 bfd_boolean
*newdef ATTRIBUTE_UNUSED
,
3792 bfd_boolean
*newdyn
,
3793 bfd_boolean
*newdyncommon ATTRIBUTE_UNUSED
,
3794 bfd_boolean
*newweak ATTRIBUTE_UNUSED
,
3795 bfd
*abfd ATTRIBUTE_UNUSED
,
3797 bfd_boolean
*olddef ATTRIBUTE_UNUSED
,
3798 bfd_boolean
*olddyn
,
3799 bfd_boolean
*olddyncommon ATTRIBUTE_UNUSED
,
3800 bfd_boolean
*oldweak ATTRIBUTE_UNUSED
,
3804 /* A normal common symbol and a large common symbol result in a
3805 normal common symbol. We turn the large common symbol into a
3808 && h
->root
.type
== bfd_link_hash_common
3810 && bfd_is_com_section (*sec
)
3813 if (sym
->st_shndx
== SHN_COMMON
3814 && (elf_section_flags (*oldsec
) & SHF_X86_64_LARGE
) != 0)
3816 h
->root
.u
.c
.p
->section
3817 = bfd_make_section_old_way (oldbfd
, "COMMON");
3818 h
->root
.u
.c
.p
->section
->flags
= SEC_ALLOC
;
3820 else if (sym
->st_shndx
== SHN_X86_64_LCOMMON
3821 && (elf_section_flags (*oldsec
) & SHF_X86_64_LARGE
) == 0)
3822 *psec
= *sec
= bfd_com_section_ptr
;
3829 elf64_x86_64_additional_program_headers (bfd
*abfd
,
3830 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
3835 /* Check to see if we need a large readonly segment. */
3836 s
= bfd_get_section_by_name (abfd
, ".lrodata");
3837 if (s
&& (s
->flags
& SEC_LOAD
))
3840 /* Check to see if we need a large data segment. Since .lbss sections
3841 is placed right after the .bss section, there should be no need for
3842 a large data segment just because of .lbss. */
3843 s
= bfd_get_section_by_name (abfd
, ".ldata");
3844 if (s
&& (s
->flags
& SEC_LOAD
))
3850 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
3853 elf64_x86_64_hash_symbol (struct elf_link_hash_entry
*h
)
3855 if (h
->plt
.offset
!= (bfd_vma
) -1
3857 && !h
->pointer_equality_needed
)
3860 return _bfd_elf_hash_symbol (h
);
3863 static const struct bfd_elf_special_section
3864 elf64_x86_64_special_sections
[]=
3866 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS
, SHF_ALLOC
+ SHF_WRITE
+ SHF_X86_64_LARGE
},
3867 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS
, SHF_ALLOC
+ SHF_X86_64_LARGE
},
3868 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS
, SHF_ALLOC
+ SHF_EXECINSTR
+ SHF_X86_64_LARGE
},
3869 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS
, SHF_ALLOC
+ SHF_WRITE
+ SHF_X86_64_LARGE
},
3870 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
+ SHF_X86_64_LARGE
},
3871 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS
, SHF_ALLOC
+ SHF_X86_64_LARGE
},
3872 { NULL
, 0, 0, 0, 0 }
3875 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_vec
3876 #define TARGET_LITTLE_NAME "elf64-x86-64"
3877 #define ELF_ARCH bfd_arch_i386
3878 #define ELF_MACHINE_CODE EM_X86_64
3879 #define ELF_MAXPAGESIZE 0x200000
3880 #define ELF_MINPAGESIZE 0x1000
3881 #define ELF_COMMONPAGESIZE 0x1000
3883 #define elf_backend_can_gc_sections 1
3884 #define elf_backend_can_refcount 1
3885 #define elf_backend_want_got_plt 1
3886 #define elf_backend_plt_readonly 1
3887 #define elf_backend_want_plt_sym 0
3888 #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
3889 #define elf_backend_rela_normal 1
3891 #define elf_info_to_howto elf64_x86_64_info_to_howto
3893 #define bfd_elf64_bfd_link_hash_table_create \
3894 elf64_x86_64_link_hash_table_create
3895 #define bfd_elf64_bfd_reloc_type_lookup elf64_x86_64_reloc_type_lookup
3896 #define bfd_elf64_bfd_reloc_name_lookup \
3897 elf64_x86_64_reloc_name_lookup
3899 #define elf_backend_adjust_dynamic_symbol elf64_x86_64_adjust_dynamic_symbol
3900 #define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
3901 #define elf_backend_check_relocs elf64_x86_64_check_relocs
3902 #define elf_backend_copy_indirect_symbol elf64_x86_64_copy_indirect_symbol
3903 #define elf_backend_create_dynamic_sections elf64_x86_64_create_dynamic_sections
3904 #define elf_backend_finish_dynamic_sections elf64_x86_64_finish_dynamic_sections
3905 #define elf_backend_finish_dynamic_symbol elf64_x86_64_finish_dynamic_symbol
3906 #define elf_backend_gc_mark_hook elf64_x86_64_gc_mark_hook
3907 #define elf_backend_gc_sweep_hook elf64_x86_64_gc_sweep_hook
3908 #define elf_backend_grok_prstatus elf64_x86_64_grok_prstatus
3909 #define elf_backend_grok_psinfo elf64_x86_64_grok_psinfo
3910 #define elf_backend_reloc_type_class elf64_x86_64_reloc_type_class
3911 #define elf_backend_relocate_section elf64_x86_64_relocate_section
3912 #define elf_backend_size_dynamic_sections elf64_x86_64_size_dynamic_sections
3913 #define elf_backend_always_size_sections elf64_x86_64_always_size_sections
3914 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
3915 #define elf_backend_plt_sym_val elf64_x86_64_plt_sym_val
3916 #define elf_backend_object_p elf64_x86_64_elf_object_p
3917 #define bfd_elf64_mkobject elf64_x86_64_mkobject
3919 #define elf_backend_section_from_shdr \
3920 elf64_x86_64_section_from_shdr
3922 #define elf_backend_section_from_bfd_section \
3923 elf64_x86_64_elf_section_from_bfd_section
3924 #define elf_backend_add_symbol_hook \
3925 elf64_x86_64_add_symbol_hook
3926 #define elf_backend_symbol_processing \
3927 elf64_x86_64_symbol_processing
3928 #define elf_backend_common_section_index \
3929 elf64_x86_64_common_section_index
3930 #define elf_backend_common_section \
3931 elf64_x86_64_common_section
3932 #define elf_backend_common_definition \
3933 elf64_x86_64_common_definition
3934 #define elf_backend_merge_symbol \
3935 elf64_x86_64_merge_symbol
3936 #define elf_backend_special_sections \
3937 elf64_x86_64_special_sections
3938 #define elf_backend_additional_program_headers \
3939 elf64_x86_64_additional_program_headers
3940 #define elf_backend_hash_symbol \
3941 elf64_x86_64_hash_symbol
3943 #include "elf64-target.h"
3945 /* FreeBSD support. */
3947 #undef TARGET_LITTLE_SYM
3948 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_freebsd_vec
3949 #undef TARGET_LITTLE_NAME
3950 #define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
3953 #define ELF_OSABI ELFOSABI_FREEBSD
3955 #undef elf_backend_post_process_headers
3956 #define elf_backend_post_process_headers _bfd_elf_set_osabi
3959 #define elf64_bed elf64_x86_64_fbsd_bed
3961 #include "elf64-target.h"