1 /* x86 specific support for ELF
2 Copyright (C) 2017-2022 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
21 #include "elfxx-x86.h"
22 #include "elf-vxworks.h"
25 /* The name of the dynamic interpreter. This is put in the .interp
28 #define ELF32_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
29 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
30 #define ELFX32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
33 _bfd_x86_elf_mkobject (bfd
*abfd
)
35 return bfd_elf_allocate_object (abfd
,
36 sizeof (struct elf_x86_obj_tdata
),
37 get_elf_backend_data (abfd
)->target_id
);
40 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
41 executables. Rather than setting it to the beginning of the TLS
42 section, we have to set it to the end. This function may be called
43 multiple times, it is idempotent. */
46 _bfd_x86_elf_set_tls_module_base (struct bfd_link_info
*info
)
48 struct elf_x86_link_hash_table
*htab
;
49 struct bfd_link_hash_entry
*base
;
50 const struct elf_backend_data
*bed
;
52 if (!bfd_link_executable (info
))
55 bed
= get_elf_backend_data (info
->output_bfd
);
56 htab
= elf_x86_hash_table (info
, bed
->target_id
);
60 base
= htab
->tls_module_base
;
64 base
->u
.def
.value
= htab
->elf
.tls_size
;
67 /* Return the base VMA address which should be subtracted from real addresses
68 when resolving @dtpoff relocation.
69 This is PT_TLS segment p_vaddr. */
72 _bfd_x86_elf_dtpoff_base (struct bfd_link_info
*info
)
74 /* If tls_sec is NULL, we should have signalled an error already. */
75 if (elf_hash_table (info
)->tls_sec
== NULL
)
77 return elf_hash_table (info
)->tls_sec
->vma
;
80 /* Allocate space in .plt, .got and associated reloc sections for
84 elf_x86_allocate_dynrelocs (struct elf_link_hash_entry
*h
, void *inf
)
86 struct bfd_link_info
*info
;
87 struct elf_x86_link_hash_table
*htab
;
88 struct elf_x86_link_hash_entry
*eh
;
89 struct elf_dyn_relocs
*p
;
90 unsigned int plt_entry_size
;
91 bool resolved_to_zero
;
92 const struct elf_backend_data
*bed
;
94 if (h
->root
.type
== bfd_link_hash_indirect
)
97 eh
= (struct elf_x86_link_hash_entry
*) h
;
99 info
= (struct bfd_link_info
*) inf
;
100 bed
= get_elf_backend_data (info
->output_bfd
);
101 htab
= elf_x86_hash_table (info
, bed
->target_id
);
105 plt_entry_size
= htab
->plt
.plt_entry_size
;
107 resolved_to_zero
= UNDEFINED_WEAK_RESOLVED_TO_ZERO (info
, eh
);
109 /* We can't use the GOT PLT if pointer equality is needed since
110 finish_dynamic_symbol won't clear symbol value and the dynamic
111 linker won't update the GOT slot. We will get into an infinite
113 if (htab
->plt_got
!= NULL
114 && h
->type
!= STT_GNU_IFUNC
115 && !h
->pointer_equality_needed
116 && h
->plt
.refcount
> 0
117 && h
->got
.refcount
> 0)
119 /* Don't use the regular PLT if there are both GOT and GOTPLT
121 h
->plt
.offset
= (bfd_vma
) -1;
123 /* Use the GOT PLT. */
124 eh
->plt_got
.refcount
= 1;
127 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
128 here if it is defined and referenced in a non-shared object. */
129 if (h
->type
== STT_GNU_IFUNC
132 /* GOTOFF relocation needs PLT. */
136 if (_bfd_elf_allocate_ifunc_dyn_relocs (info
, h
, &h
->dyn_relocs
,
140 htab
->got_entry_size
,
143 asection
*s
= htab
->plt_second
;
144 if (h
->plt
.offset
!= (bfd_vma
) -1 && s
!= NULL
)
146 /* Use the second PLT section if it is created. */
147 eh
->plt_second
.offset
= s
->size
;
149 /* Make room for this entry in the second PLT section. */
150 s
->size
+= htab
->non_lazy_plt
->plt_entry_size
;
158 /* Don't create the PLT entry if there are only function pointer
159 relocations which can be resolved at run-time. */
160 else if (htab
->elf
.dynamic_sections_created
161 && (h
->plt
.refcount
> 0
162 || eh
->plt_got
.refcount
> 0))
164 bool use_plt_got
= eh
->plt_got
.refcount
> 0;
166 /* Make sure this symbol is output as a dynamic symbol.
167 Undefined weak syms won't yet be marked as dynamic. */
171 && h
->root
.type
== bfd_link_hash_undefweak
)
173 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
177 if (bfd_link_pic (info
)
178 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h
))
180 asection
*s
= htab
->elf
.splt
;
181 asection
*second_s
= htab
->plt_second
;
182 asection
*got_s
= htab
->plt_got
;
185 /* If this is the first .plt entry, make room for the special
186 first entry. The .plt section is used by prelink to undo
187 prelinking for dynamic relocations. */
189 s
->size
= htab
->plt
.has_plt0
* plt_entry_size
;
192 eh
->plt_got
.offset
= got_s
->size
;
195 h
->plt
.offset
= s
->size
;
197 eh
->plt_second
.offset
= second_s
->size
;
200 /* If this symbol is not defined in a regular file, and we are
201 generating PDE, then set the symbol to this location in the
202 .plt. This is required to make function pointers compare
203 as equal between PDE and the shared library.
205 NB: If PLT is PC-relative, we can use the .plt in PIE for
209 else if (htab
->pcrel_plt
)
210 use_plt
= ! bfd_link_dll (info
);
212 use_plt
= bfd_link_pde (info
);
217 /* We need to make a call to the entry of the GOT PLT
218 instead of regular PLT entry. */
219 h
->root
.u
.def
.section
= got_s
;
220 h
->root
.u
.def
.value
= eh
->plt_got
.offset
;
226 /* We need to make a call to the entry of the
227 second PLT instead of regular PLT entry. */
228 h
->root
.u
.def
.section
= second_s
;
229 h
->root
.u
.def
.value
= eh
->plt_second
.offset
;
233 h
->root
.u
.def
.section
= s
;
234 h
->root
.u
.def
.value
= h
->plt
.offset
;
239 /* Make room for this entry. */
241 got_s
->size
+= htab
->non_lazy_plt
->plt_entry_size
;
244 s
->size
+= plt_entry_size
;
246 second_s
->size
+= htab
->non_lazy_plt
->plt_entry_size
;
248 /* We also need to make an entry in the .got.plt section,
249 which will be placed in the .got section by the linker
251 htab
->elf
.sgotplt
->size
+= htab
->got_entry_size
;
253 /* There should be no PLT relocation against resolved
254 undefined weak symbol in executable. */
255 if (!resolved_to_zero
)
257 /* We also need to make an entry in the .rel.plt
259 htab
->elf
.srelplt
->size
+= htab
->sizeof_reloc
;
260 htab
->elf
.srelplt
->reloc_count
++;
264 if (htab
->elf
.target_os
== is_vxworks
&& !bfd_link_pic (info
))
266 /* VxWorks has a second set of relocations for each PLT entry
267 in executables. They go in a separate relocation section,
268 which is processed by the kernel loader. */
270 /* There are two relocations for the initial PLT entry: an
271 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
272 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
274 asection
*srelplt2
= htab
->srelplt2
;
275 if (h
->plt
.offset
== plt_entry_size
)
276 srelplt2
->size
+= (htab
->sizeof_reloc
* 2);
278 /* There are two extra relocations for each subsequent PLT entry:
279 an R_386_32 relocation for the GOT entry, and an R_386_32
280 relocation for the PLT entry. */
282 srelplt2
->size
+= (htab
->sizeof_reloc
* 2);
287 eh
->plt_got
.offset
= (bfd_vma
) -1;
288 h
->plt
.offset
= (bfd_vma
) -1;
294 eh
->plt_got
.offset
= (bfd_vma
) -1;
295 h
->plt
.offset
= (bfd_vma
) -1;
299 eh
->tlsdesc_got
= (bfd_vma
) -1;
301 /* For i386, if R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the
302 binary, make it a R_386_TLS_LE_32 requiring no TLS entry. For
303 x86-64, if R_X86_64_GOTTPOFF symbol is now local to the binary,
304 make it a R_X86_64_TPOFF32 requiring no GOT entry. */
305 if (h
->got
.refcount
> 0
306 && bfd_link_executable (info
)
308 && (elf_x86_hash_entry (h
)->tls_type
& GOT_TLS_IE
))
309 h
->got
.offset
= (bfd_vma
) -1;
310 else if (h
->got
.refcount
> 0)
314 int tls_type
= elf_x86_hash_entry (h
)->tls_type
;
316 /* Make sure this symbol is output as a dynamic symbol.
317 Undefined weak syms won't yet be marked as dynamic. */
321 && h
->root
.type
== bfd_link_hash_undefweak
)
323 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
328 if (GOT_TLS_GDESC_P (tls_type
))
330 eh
->tlsdesc_got
= htab
->elf
.sgotplt
->size
331 - elf_x86_compute_jump_table_size (htab
);
332 htab
->elf
.sgotplt
->size
+= 2 * htab
->got_entry_size
;
333 h
->got
.offset
= (bfd_vma
) -2;
335 if (! GOT_TLS_GDESC_P (tls_type
)
336 || GOT_TLS_GD_P (tls_type
))
338 h
->got
.offset
= s
->size
;
339 s
->size
+= htab
->got_entry_size
;
340 /* R_386_TLS_GD and R_X86_64_TLSGD need 2 consecutive GOT
342 if (GOT_TLS_GD_P (tls_type
) || tls_type
== GOT_TLS_IE_BOTH
)
343 s
->size
+= htab
->got_entry_size
;
345 dyn
= htab
->elf
.dynamic_sections_created
;
346 /* R_386_TLS_IE_32 needs one dynamic relocation,
347 R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
348 (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
349 need two), R_386_TLS_GD and R_X86_64_TLSGD need one if local
350 symbol and two if global. No dynamic relocation against
351 resolved undefined weak symbol in executable. No dynamic
352 relocation against non-preemptible absolute symbol. */
353 if (tls_type
== GOT_TLS_IE_BOTH
)
354 htab
->elf
.srelgot
->size
+= 2 * htab
->sizeof_reloc
;
355 else if ((GOT_TLS_GD_P (tls_type
) && h
->dynindx
== -1)
356 || (tls_type
& GOT_TLS_IE
))
357 htab
->elf
.srelgot
->size
+= htab
->sizeof_reloc
;
358 else if (GOT_TLS_GD_P (tls_type
))
359 htab
->elf
.srelgot
->size
+= 2 * htab
->sizeof_reloc
;
360 else if (! GOT_TLS_GDESC_P (tls_type
)
361 && ((ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
362 && !resolved_to_zero
)
363 || h
->root
.type
!= bfd_link_hash_undefweak
)
364 && ((bfd_link_pic (info
)
365 && !(h
->dynindx
== -1
366 && ABS_SYMBOL_P (h
)))
367 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, 0, h
)))
368 htab
->elf
.srelgot
->size
+= htab
->sizeof_reloc
;
369 if (GOT_TLS_GDESC_P (tls_type
))
371 htab
->elf
.srelplt
->size
+= htab
->sizeof_reloc
;
372 if (bed
->target_id
== X86_64_ELF_DATA
)
373 htab
->elf
.tlsdesc_plt
= (bfd_vma
) -1;
377 h
->got
.offset
= (bfd_vma
) -1;
379 if (h
->dyn_relocs
== NULL
)
382 /* In the shared -Bsymbolic case, discard space allocated for
383 dynamic pc-relative relocs against symbols which turn out to be
384 defined in regular objects. For the normal shared case, discard
385 space for pc-relative relocs that have become local due to symbol
386 visibility changes. */
388 if (bfd_link_pic (info
))
390 /* Relocs that use pc_count are those that appear on a call
391 insn, or certain REL relocs that can generated via assembly.
392 We want calls to protected symbols to resolve directly to the
393 function rather than going via the plt. If people want
394 function pointer comparisons to work as expected then they
395 should avoid writing weird assembly. */
396 if (SYMBOL_CALLS_LOCAL (info
, h
))
398 struct elf_dyn_relocs
**pp
;
400 for (pp
= &h
->dyn_relocs
; (p
= *pp
) != NULL
; )
402 p
->count
-= p
->pc_count
;
411 if (htab
->elf
.target_os
== is_vxworks
)
413 struct elf_dyn_relocs
**pp
;
414 for (pp
= &h
->dyn_relocs
; (p
= *pp
) != NULL
; )
416 if (strcmp (p
->sec
->output_section
->name
, ".tls_vars") == 0)
423 /* Also discard relocs on undefined weak syms with non-default
424 visibility or in PIE. */
425 if (h
->dyn_relocs
!= NULL
)
427 if (h
->root
.type
== bfd_link_hash_undefweak
)
429 /* Undefined weak symbol is never bound locally in shared
431 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
434 if (bed
->target_id
== I386_ELF_DATA
437 /* Keep dynamic non-GOT/non-PLT relocation so
438 that we can branch to 0 without PLT. */
439 struct elf_dyn_relocs
**pp
;
441 for (pp
= &h
->dyn_relocs
; (p
= *pp
) != NULL
; )
442 if (p
->pc_count
== 0)
446 /* Remove non-R_386_PC32 relocation. */
447 p
->count
= p
->pc_count
;
451 /* Make sure undefined weak symbols are output
452 as dynamic symbols in PIEs for dynamic non-GOT
453 non-PLT reloations. */
454 if (h
->dyn_relocs
!= NULL
455 && !bfd_elf_link_record_dynamic_symbol (info
, h
))
459 h
->dyn_relocs
= NULL
;
461 else if (h
->dynindx
== -1
463 && !bfd_elf_link_record_dynamic_symbol (info
, h
))
466 else if (bfd_link_executable (info
)
467 && (h
->needs_copy
|| eh
->needs_copy
)
471 /* NB: needs_copy is set only for x86-64. For PIE,
472 discard space for pc-relative relocs against symbols
473 which turn out to need copy relocs. */
474 struct elf_dyn_relocs
**pp
;
476 for (pp
= &h
->dyn_relocs
; (p
= *pp
) != NULL
; )
478 if (p
->pc_count
!= 0)
486 else if (ELIMINATE_COPY_RELOCS
)
488 /* For the non-shared case, discard space for relocs against
489 symbols which turn out to need copy relocs or are not
490 dynamic. Keep dynamic relocations for run-time function
491 pointer initialization. */
494 || (h
->root
.type
== bfd_link_hash_undefweak
495 && !resolved_to_zero
))
498 || (htab
->elf
.dynamic_sections_created
499 && (h
->root
.type
== bfd_link_hash_undefweak
500 || h
->root
.type
== bfd_link_hash_undefined
))))
502 /* Make sure this symbol is output as a dynamic symbol.
503 Undefined weak syms won't yet be marked as dynamic. */
507 && h
->root
.type
== bfd_link_hash_undefweak
508 && ! bfd_elf_link_record_dynamic_symbol (info
, h
))
511 /* If that succeeded, we know we'll be keeping all the
513 if (h
->dynindx
!= -1)
517 h
->dyn_relocs
= NULL
;
522 /* Finally, allocate space. */
523 for (p
= h
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
527 if (eh
->def_protected
528 && elf_has_no_copy_on_protected (h
->root
.u
.def
.section
->owner
))
530 /* Disallow copy relocation against non-copyable protected
532 asection
*s
= p
->sec
->output_section
;
533 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
535 info
->callbacks
->einfo
536 /* xgettext:c-format */
537 (_("%F%P: %pB: copy relocation against non-copyable "
538 "protected symbol `%s' in %pB\n"),
539 p
->sec
->owner
, h
->root
.root
.string
,
540 h
->root
.u
.def
.section
->owner
);
545 sreloc
= elf_section_data (p
->sec
)->sreloc
;
547 BFD_ASSERT (sreloc
!= NULL
);
548 sreloc
->size
+= p
->count
* htab
->sizeof_reloc
;
554 /* Allocate space in .plt, .got and associated reloc sections for
555 local dynamic relocs. */
558 elf_x86_allocate_local_dynreloc (void **slot
, void *inf
)
560 struct elf_link_hash_entry
*h
561 = (struct elf_link_hash_entry
*) *slot
;
563 if (h
->type
!= STT_GNU_IFUNC
567 || h
->root
.type
!= bfd_link_hash_defined
)
570 return elf_x86_allocate_dynrelocs (h
, inf
);
573 /* Find and/or create a hash entry for local symbol. */
575 struct elf_link_hash_entry
*
576 _bfd_elf_x86_get_local_sym_hash (struct elf_x86_link_hash_table
*htab
,
577 bfd
*abfd
, const Elf_Internal_Rela
*rel
,
580 struct elf_x86_link_hash_entry e
, *ret
;
581 asection
*sec
= abfd
->sections
;
582 hashval_t h
= ELF_LOCAL_SYMBOL_HASH (sec
->id
,
583 htab
->r_sym (rel
->r_info
));
586 e
.elf
.indx
= sec
->id
;
587 e
.elf
.dynstr_index
= htab
->r_sym (rel
->r_info
);
588 slot
= htab_find_slot_with_hash (htab
->loc_hash_table
, &e
, h
,
589 create
? INSERT
: NO_INSERT
);
596 ret
= (struct elf_x86_link_hash_entry
*) *slot
;
600 ret
= (struct elf_x86_link_hash_entry
*)
601 objalloc_alloc ((struct objalloc
*) htab
->loc_hash_memory
,
602 sizeof (struct elf_x86_link_hash_entry
));
605 memset (ret
, 0, sizeof (*ret
));
606 ret
->elf
.indx
= sec
->id
;
607 ret
->elf
.dynstr_index
= htab
->r_sym (rel
->r_info
);
608 ret
->elf
.dynindx
= -1;
609 ret
->plt_got
.offset
= (bfd_vma
) -1;
615 /* Create an entry in a x86 ELF linker hash table. NB: THIS MUST BE IN
616 SYNC WITH _bfd_elf_link_hash_newfunc. */
618 struct bfd_hash_entry
*
619 _bfd_x86_elf_link_hash_newfunc (struct bfd_hash_entry
*entry
,
620 struct bfd_hash_table
*table
,
623 /* Allocate the structure if it has not already been allocated by a
627 entry
= (struct bfd_hash_entry
*)
628 bfd_hash_allocate (table
,
629 sizeof (struct elf_x86_link_hash_entry
));
634 /* Call the allocation method of the superclass. */
635 entry
= _bfd_link_hash_newfunc (entry
, table
, string
);
638 struct elf_x86_link_hash_entry
*eh
639 = (struct elf_x86_link_hash_entry
*) entry
;
640 struct elf_link_hash_table
*htab
641 = (struct elf_link_hash_table
*) table
;
643 memset (&eh
->elf
.size
, 0,
644 (sizeof (struct elf_x86_link_hash_entry
)
645 - offsetof (struct elf_link_hash_entry
, size
)));
646 /* Set local fields. */
648 eh
->elf
.dynindx
= -1;
649 eh
->elf
.got
= htab
->init_got_refcount
;
650 eh
->elf
.plt
= htab
->init_plt_refcount
;
651 /* Assume that we have been called by a non-ELF symbol reader.
652 This flag is then reset by the code which reads an ELF input
653 file. This ensures that a symbol created by a non-ELF symbol
654 reader will have the flag set correctly. */
656 eh
->plt_second
.offset
= (bfd_vma
) -1;
657 eh
->plt_got
.offset
= (bfd_vma
) -1;
658 eh
->tlsdesc_got
= (bfd_vma
) -1;
659 eh
->zero_undefweak
= 1;
665 /* Compute a hash of a local hash entry. We use elf_link_hash_entry
666 for local symbol so that we can handle local STT_GNU_IFUNC symbols
667 as global symbol. We reuse indx and dynstr_index for local symbol
668 hash since they aren't used by global symbols in this backend. */
671 _bfd_x86_elf_local_htab_hash (const void *ptr
)
673 struct elf_link_hash_entry
*h
674 = (struct elf_link_hash_entry
*) ptr
;
675 return ELF_LOCAL_SYMBOL_HASH (h
->indx
, h
->dynstr_index
);
678 /* Compare local hash entries. */
681 _bfd_x86_elf_local_htab_eq (const void *ptr1
, const void *ptr2
)
683 struct elf_link_hash_entry
*h1
684 = (struct elf_link_hash_entry
*) ptr1
;
685 struct elf_link_hash_entry
*h2
686 = (struct elf_link_hash_entry
*) ptr2
;
688 return h1
->indx
== h2
->indx
&& h1
->dynstr_index
== h2
->dynstr_index
;
691 /* Destroy an x86 ELF linker hash table. */
694 elf_x86_link_hash_table_free (bfd
*obfd
)
696 struct elf_x86_link_hash_table
*htab
697 = (struct elf_x86_link_hash_table
*) obfd
->link
.hash
;
699 if (htab
->loc_hash_table
)
700 htab_delete (htab
->loc_hash_table
);
701 if (htab
->loc_hash_memory
)
702 objalloc_free ((struct objalloc
*) htab
->loc_hash_memory
);
703 _bfd_elf_link_hash_table_free (obfd
);
707 elf_i386_is_reloc_section (const char *secname
)
709 return startswith (secname
, ".rel");
713 elf_x86_64_is_reloc_section (const char *secname
)
715 return startswith (secname
, ".rela");
718 /* Create an x86 ELF linker hash table. */
720 struct bfd_link_hash_table
*
721 _bfd_x86_elf_link_hash_table_create (bfd
*abfd
)
723 struct elf_x86_link_hash_table
*ret
;
724 const struct elf_backend_data
*bed
;
725 size_t amt
= sizeof (struct elf_x86_link_hash_table
);
727 ret
= (struct elf_x86_link_hash_table
*) bfd_zmalloc (amt
);
731 bed
= get_elf_backend_data (abfd
);
732 if (!_bfd_elf_link_hash_table_init (&ret
->elf
, abfd
,
733 _bfd_x86_elf_link_hash_newfunc
,
734 sizeof (struct elf_x86_link_hash_entry
),
741 if (bed
->target_id
== X86_64_ELF_DATA
)
743 ret
->is_reloc_section
= elf_x86_64_is_reloc_section
;
744 ret
->got_entry_size
= 8;
745 ret
->pcrel_plt
= true;
746 ret
->tls_get_addr
= "__tls_get_addr";
747 ret
->relative_r_type
= R_X86_64_RELATIVE
;
748 ret
->relative_r_name
= "R_X86_64_RELATIVE";
749 ret
->elf_append_reloc
= elf_append_rela
;
750 ret
->elf_write_addend_in_got
= _bfd_elf64_write_addend
;
754 ret
->sizeof_reloc
= sizeof (Elf64_External_Rela
);
755 ret
->pointer_r_type
= R_X86_64_64
;
756 ret
->dynamic_interpreter
= ELF64_DYNAMIC_INTERPRETER
;
757 ret
->dynamic_interpreter_size
= sizeof ELF64_DYNAMIC_INTERPRETER
;
758 ret
->elf_write_addend
= _bfd_elf64_write_addend
;
762 if (bed
->target_id
== X86_64_ELF_DATA
)
764 ret
->sizeof_reloc
= sizeof (Elf32_External_Rela
);
765 ret
->pointer_r_type
= R_X86_64_32
;
766 ret
->dynamic_interpreter
= ELFX32_DYNAMIC_INTERPRETER
;
767 ret
->dynamic_interpreter_size
768 = sizeof ELFX32_DYNAMIC_INTERPRETER
;
769 ret
->elf_write_addend
= _bfd_elf32_write_addend
;
773 ret
->is_reloc_section
= elf_i386_is_reloc_section
;
774 ret
->sizeof_reloc
= sizeof (Elf32_External_Rel
);
775 ret
->got_entry_size
= 4;
776 ret
->pcrel_plt
= false;
777 ret
->pointer_r_type
= R_386_32
;
778 ret
->relative_r_type
= R_386_RELATIVE
;
779 ret
->relative_r_name
= "R_386_RELATIVE";
780 ret
->elf_append_reloc
= elf_append_rel
;
781 ret
->elf_write_addend
= _bfd_elf32_write_addend
;
782 ret
->elf_write_addend_in_got
= _bfd_elf32_write_addend
;
783 ret
->dynamic_interpreter
= ELF32_DYNAMIC_INTERPRETER
;
784 ret
->dynamic_interpreter_size
785 = sizeof ELF32_DYNAMIC_INTERPRETER
;
786 ret
->tls_get_addr
= "___tls_get_addr";
790 ret
->loc_hash_table
= htab_try_create (1024,
791 _bfd_x86_elf_local_htab_hash
,
792 _bfd_x86_elf_local_htab_eq
,
794 ret
->loc_hash_memory
= objalloc_create ();
795 if (!ret
->loc_hash_table
|| !ret
->loc_hash_memory
)
797 elf_x86_link_hash_table_free (abfd
);
800 ret
->elf
.root
.hash_table_free
= elf_x86_link_hash_table_free
;
802 return &ret
->elf
.root
;
805 /* Sort relocs into address order. */
808 _bfd_x86_elf_compare_relocs (const void *ap
, const void *bp
)
810 const arelent
*a
= * (const arelent
**) ap
;
811 const arelent
*b
= * (const arelent
**) bp
;
813 if (a
->address
> b
->address
)
815 else if (a
->address
< b
->address
)
821 /* Mark symbol, NAME, as locally defined by linker if it is referenced
822 and not defined in a relocatable object file. */
825 elf_x86_linker_defined (struct bfd_link_info
*info
, const char *name
)
827 struct elf_link_hash_entry
*h
;
829 h
= elf_link_hash_lookup (elf_hash_table (info
), name
,
830 false, false, false);
834 while (h
->root
.type
== bfd_link_hash_indirect
)
835 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
837 if (h
->root
.type
== bfd_link_hash_new
838 || h
->root
.type
== bfd_link_hash_undefined
839 || h
->root
.type
== bfd_link_hash_undefweak
840 || h
->root
.type
== bfd_link_hash_common
841 || (!h
->def_regular
&& h
->def_dynamic
))
843 elf_x86_hash_entry (h
)->local_ref
= 2;
844 elf_x86_hash_entry (h
)->linker_def
= 1;
848 /* Hide a linker-defined symbol, NAME, with hidden visibility. */
851 elf_x86_hide_linker_defined (struct bfd_link_info
*info
,
854 struct elf_link_hash_entry
*h
;
856 h
= elf_link_hash_lookup (elf_hash_table (info
), name
,
857 false, false, false);
861 while (h
->root
.type
== bfd_link_hash_indirect
)
862 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
864 if (ELF_ST_VISIBILITY (h
->other
) == STV_INTERNAL
865 || ELF_ST_VISIBILITY (h
->other
) == STV_HIDDEN
)
866 _bfd_elf_link_hash_hide_symbol (info
, h
, true);
870 _bfd_x86_elf_link_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
)
872 if (!bfd_link_relocatable (info
))
874 /* Check for __tls_get_addr reference. */
875 struct elf_x86_link_hash_table
*htab
;
876 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
877 htab
= elf_x86_hash_table (info
, bed
->target_id
);
880 struct elf_link_hash_entry
*h
;
882 h
= elf_link_hash_lookup (elf_hash_table (info
),
884 false, false, false);
887 elf_x86_hash_entry (h
)->tls_get_addr
= 1;
889 /* Check the versioned __tls_get_addr symbol. */
890 while (h
->root
.type
== bfd_link_hash_indirect
)
892 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
893 elf_x86_hash_entry (h
)->tls_get_addr
= 1;
897 /* "__ehdr_start" will be defined by linker as a hidden symbol
898 later if it is referenced and not defined. */
899 elf_x86_linker_defined (info
, "__ehdr_start");
901 if (bfd_link_executable (info
))
903 /* References to __bss_start, _end and _edata should be
904 locally resolved within executables. */
905 elf_x86_linker_defined (info
, "__bss_start");
906 elf_x86_linker_defined (info
, "_end");
907 elf_x86_linker_defined (info
, "_edata");
911 /* Hide hidden __bss_start, _end and _edata in shared
913 elf_x86_hide_linker_defined (info
, "__bss_start");
914 elf_x86_hide_linker_defined (info
, "_end");
915 elf_x86_hide_linker_defined (info
, "_edata");
920 /* Invoke the regular ELF backend linker to do all the work. */
921 return _bfd_elf_link_check_relocs (abfd
, info
);
924 /* Look through the relocs for a section before allocation to make the
925 dynamic reloc section. */
928 _bfd_x86_elf_check_relocs (bfd
*abfd
,
929 struct bfd_link_info
*info
,
931 const Elf_Internal_Rela
*relocs
)
933 struct elf_x86_link_hash_table
*htab
;
934 Elf_Internal_Shdr
*symtab_hdr
;
935 struct elf_link_hash_entry
**sym_hashes
;
936 const Elf_Internal_Rela
*rel
;
937 const Elf_Internal_Rela
*rel_end
;
939 const struct elf_backend_data
*bed
;
942 if (bfd_link_relocatable (info
))
945 bed
= get_elf_backend_data (abfd
);
946 htab
= elf_x86_hash_table (info
, bed
->target_id
);
949 sec
->check_relocs_failed
= 1;
953 is_x86_64
= bed
->target_id
== X86_64_ELF_DATA
;
955 symtab_hdr
= &elf_symtab_hdr (abfd
);
956 sym_hashes
= elf_sym_hashes (abfd
);
958 rel_end
= relocs
+ sec
->reloc_count
;
959 for (rel
= relocs
; rel
< rel_end
; rel
++)
962 unsigned int r_symndx
;
963 struct elf_link_hash_entry
*h
;
965 r_symndx
= htab
->r_sym (rel
->r_info
);
966 r_type
= ELF32_R_TYPE (rel
->r_info
);
968 if (r_symndx
>= NUM_SHDR_ENTRIES (symtab_hdr
))
970 /* xgettext:c-format */
971 _bfd_error_handler (_("%pB: bad symbol index: %d"),
976 if (r_symndx
< symtab_hdr
->sh_info
)
980 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
981 while (h
->root
.type
== bfd_link_hash_indirect
982 || h
->root
.type
== bfd_link_hash_warning
)
983 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
986 if (X86_NEED_DYNAMIC_RELOC_TYPE_P (is_x86_64
, r_type
)
987 && NEED_DYNAMIC_RELOCATION_P (is_x86_64
, info
, true, h
, sec
,
988 r_type
, htab
->pointer_r_type
))
990 /* We may copy these reloc types into the output file.
991 Create a reloc section in dynobj and make room for
993 sreloc
= _bfd_elf_make_dynamic_reloc_section
994 (sec
, htab
->elf
.dynobj
, ABI_64_P (abfd
) ? 3 : 2,
995 abfd
, sec
->use_rela_p
);
1001 sec
->check_relocs_failed
= 1;
1009 /* Add an entry to the relative reloc record. */
1012 elf_x86_relative_reloc_record_add
1013 (struct bfd_link_info
*info
,
1014 struct elf_x86_relative_reloc_data
*relative_reloc
,
1015 Elf_Internal_Rela
*rel
, asection
*sec
,
1016 asection
*sym_sec
, struct elf_link_hash_entry
*h
,
1017 Elf_Internal_Sym
*sym
, bfd_vma offset
)
1019 bfd_size_type newidx
;
1021 if (relative_reloc
->data
== NULL
)
1023 relative_reloc
->data
= bfd_malloc
1024 (sizeof (struct elf_x86_relative_reloc_record
));
1025 relative_reloc
->count
= 0;
1026 relative_reloc
->size
= 1;
1029 newidx
= relative_reloc
->count
++;
1031 if (relative_reloc
->count
> relative_reloc
->size
)
1033 relative_reloc
->size
<<= 1;
1034 relative_reloc
->data
= bfd_realloc
1035 (relative_reloc
->data
,
1036 (relative_reloc
->size
1037 * sizeof (struct elf_x86_relative_reloc_record
)));
1040 if (relative_reloc
->data
== NULL
)
1042 info
->callbacks
->einfo
1043 /* xgettext:c-format */
1044 (_("%F%P: %pB: failed to allocate relative reloc record\n"),
1049 relative_reloc
->data
[newidx
].rel
= *rel
;
1050 relative_reloc
->data
[newidx
].sec
= sec
;
1053 /* Set SYM to NULL to indicate a global symbol. */
1054 relative_reloc
->data
[newidx
].sym
= NULL
;
1055 relative_reloc
->data
[newidx
].u
.h
= h
;
1059 relative_reloc
->data
[newidx
].sym
= sym
;
1060 relative_reloc
->data
[newidx
].u
.sym_sec
= sym_sec
;
1062 relative_reloc
->data
[newidx
].offset
= offset
;
1063 relative_reloc
->data
[newidx
].address
= 0;
1067 /* After input sections have been mapped to output sections and
1068 addresses of output sections are set initiallly, scan input
1069 relocations with the same logic in relocate_section to determine
1070 if a relative relocation should be generated. Save the relative
1071 relocation candidate information for sizing the DT_RELR section
1072 later after all symbols addresses can be determined. */
1075 _bfd_x86_elf_link_relax_section (bfd
*abfd ATTRIBUTE_UNUSED
,
1076 asection
*input_section
,
1077 struct bfd_link_info
*info
,
1080 Elf_Internal_Shdr
*symtab_hdr
;
1081 Elf_Internal_Rela
*internal_relocs
;
1082 Elf_Internal_Rela
*irel
, *irelend
;
1083 Elf_Internal_Sym
*isymbuf
= NULL
;
1084 struct elf_link_hash_entry
**sym_hashes
;
1085 const struct elf_backend_data
*bed
;
1086 struct elf_x86_link_hash_table
*htab
;
1087 bfd_vma
*local_got_offsets
;
1089 bool unaligned_section
;
1091 if (bfd_link_relocatable (info
))
1094 /* Assume we're not going to change any sizes, and we'll only need
1098 bed
= get_elf_backend_data (abfd
);
1099 htab
= elf_x86_hash_table (info
, bed
->target_id
);
1103 /* Nothing to do if there are no relocations or relative relocations
1104 have been packed. */
1105 if (input_section
== htab
->elf
.srelrdyn
1106 || input_section
->relative_reloc_packed
1107 || ((input_section
->flags
& (SEC_RELOC
| SEC_ALLOC
))
1108 != (SEC_RELOC
| SEC_ALLOC
))
1109 || (input_section
->flags
& SEC_DEBUGGING
) != 0
1110 || input_section
->reloc_count
== 0)
1113 /* Skip if the section isn't aligned. */
1114 unaligned_section
= input_section
->alignment_power
== 0;
1116 is_x86_64
= bed
->target_id
== X86_64_ELF_DATA
;
1118 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1119 sym_hashes
= elf_sym_hashes (abfd
);
1120 local_got_offsets
= elf_local_got_offsets (abfd
);
1122 /* Load the relocations for this section. */
1124 _bfd_elf_link_read_relocs (abfd
, input_section
, NULL
,
1125 (Elf_Internal_Rela
*) NULL
,
1127 if (internal_relocs
== NULL
)
1130 irelend
= internal_relocs
+ input_section
->reloc_count
;
1131 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
1133 unsigned int r_type
;
1134 unsigned int r_symndx
;
1135 Elf_Internal_Sym
*isym
;
1136 struct elf_link_hash_entry
*h
;
1137 struct elf_x86_link_hash_entry
*eh
;
1139 bool resolved_to_zero
;
1140 bool need_copy_reloc_in_pie
;
1143 /* Offset must be a multiple of 2. */
1144 bool unaligned_offset
= (irel
->r_offset
& 1) != 0;
1145 /* True if there is a relative relocation against a dynamic
1147 bool dynamic_relative_reloc_p
;
1149 /* Get the value of the symbol referred to by the reloc. */
1150 r_symndx
= htab
->r_sym (irel
->r_info
);
1152 r_type
= ELF32_R_TYPE (irel
->r_info
);
1153 /* Clear the R_X86_64_converted_reloc_bit bit. */
1154 r_type
&= ~R_X86_64_converted_reloc_bit
;
1158 dynamic_relative_reloc_p
= false;
1160 if (r_symndx
< symtab_hdr
->sh_info
)
1162 /* Read this BFD's local symbols. */
1163 if (isymbuf
== NULL
)
1165 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1166 if (isymbuf
== NULL
)
1167 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
1168 symtab_hdr
->sh_info
, 0,
1170 if (isymbuf
== NULL
)
1174 isym
= isymbuf
+ r_symndx
;
1175 switch (isym
->st_shndx
)
1178 sec
= bfd_abs_section_ptr
;
1181 sec
= bfd_com_section_ptr
;
1183 case SHN_X86_64_LCOMMON
:
1186 sec
= &_bfd_elf_large_com_section
;
1189 sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1193 /* Skip relocation against local STT_GNU_IFUNC symbol. */
1194 if (ELF32_ST_TYPE (isym
->st_info
) == STT_GNU_IFUNC
)
1197 eh
= (struct elf_x86_link_hash_entry
*) h
;
1198 resolved_to_zero
= false;
1202 /* Get H and SEC for GENERATE_DYNAMIC_RELOCATION_P below. */
1203 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1204 while (h
->root
.type
== bfd_link_hash_indirect
1205 || h
->root
.type
== bfd_link_hash_warning
)
1206 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1208 if (h
->root
.type
== bfd_link_hash_defined
1209 || h
->root
.type
== bfd_link_hash_defweak
)
1210 sec
= h
->root
.u
.def
.section
;
1212 /* Skip relocation against STT_GNU_IFUNC symbol. */
1213 if (h
->type
== STT_GNU_IFUNC
)
1216 eh
= (struct elf_x86_link_hash_entry
*) h
;
1217 resolved_to_zero
= UNDEFINED_WEAK_RESOLVED_TO_ZERO (info
, eh
);
1219 /* NB: See how elf_backend_finish_dynamic_symbol is called
1220 from elf_link_output_extsym. */
1221 if ((h
->dynindx
!= -1 || h
->forced_local
)
1222 && ((ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
1223 || h
->root
.type
!= bfd_link_hash_undefweak
)
1224 || !h
->forced_local
)
1225 && h
->got
.offset
!= (bfd_vma
) -1
1226 && ! GOT_TLS_GD_ANY_P (elf_x86_hash_entry (h
)->tls_type
)
1227 && elf_x86_hash_entry (h
)->tls_type
!= GOT_TLS_IE
1228 && !resolved_to_zero
1229 && SYMBOL_REFERENCES_LOCAL_P (info
, h
)
1230 && SYMBOL_DEFINED_NON_SHARED_P (h
))
1231 dynamic_relative_reloc_p
= true;
1236 if (X86_GOT_TYPE_P (is_x86_64
, r_type
))
1238 /* Pack GOT relative relocations. There should be only a
1239 single R_*_RELATIVE relocation in GOT. */
1242 if (eh
->got_relative_reloc_done
)
1245 if (!(dynamic_relative_reloc_p
1246 || (RESOLVED_LOCALLY_P (info
, h
, htab
)
1247 && GENERATE_RELATIVE_RELOC_P (info
, h
))))
1250 if (!dynamic_relative_reloc_p
)
1251 eh
->no_finish_dynamic_symbol
= 1;
1252 eh
->got_relative_reloc_done
= 1;
1253 offset
= h
->got
.offset
;
1257 if (elf_x86_relative_reloc_done (abfd
)[r_symndx
])
1260 if (!X86_LOCAL_GOT_RELATIVE_RELOC_P (is_x86_64
, info
,
1264 elf_x86_relative_reloc_done (abfd
)[r_symndx
] = 1;
1265 offset
= local_got_offsets
[r_symndx
];
1268 if (!elf_x86_relative_reloc_record_add (info
,
1269 &htab
->relative_reloc
,
1270 irel
, htab
->elf
.sgot
,
1271 sec
, h
, isym
, offset
))
1278 && irel
->r_addend
== 0
1279 && !ABI_64_P (info
->output_bfd
))
1281 /* For x32, if addend is zero, treat R_X86_64_64 like
1282 R_X86_64_32 and R_X86_64_SIZE64 like R_X86_64_SIZE32. */
1283 if (r_type
== R_X86_64_64
)
1284 r_type
= R_X86_64_32
;
1285 else if (r_type
== R_X86_64_SIZE64
)
1286 r_type
= R_X86_64_SIZE32
;
1289 if (!X86_RELATIVE_RELOC_TYPE_P (is_x86_64
, r_type
))
1292 /* Pack non-GOT relative relocations. */
1295 need_copy_reloc_in_pie
=
1296 (bfd_link_pie (info
)
1300 || (h
->root
.type
== bfd_link_hash_undefined
))
1301 && (X86_PCREL_TYPE_P (true, r_type
)
1302 || X86_SIZE_TYPE_P (true, r_type
)));
1307 need_copy_reloc_in_pie
= false;
1308 pc32_reloc
= r_type
== R_386_PC32
;
1311 if (GENERATE_DYNAMIC_RELOCATION_P (is_x86_64
, info
, eh
, r_type
,
1312 sec
, need_copy_reloc_in_pie
,
1313 resolved_to_zero
, pc32_reloc
))
1315 /* When generating a shared object, these relocations
1316 are copied into the output file to be resolved at run
1318 offset
= _bfd_elf_section_offset (info
->output_bfd
, info
,
1321 if (offset
== (bfd_vma
) -1
1322 || offset
== (bfd_vma
) -2
1323 || COPY_INPUT_RELOC_P (is_x86_64
, info
, h
, r_type
))
1326 /* This symbol is local, or marked to become local. When
1327 relocation overflow check is disabled, we convert
1328 R_X86_64_32 to dynamic R_X86_64_RELATIVE. */
1330 && !(r_type
== htab
->pointer_r_type
1331 || (r_type
== R_X86_64_32
1332 && htab
->params
->no_reloc_overflow_check
)))
1335 if (!elf_x86_relative_reloc_record_add
1337 ((unaligned_section
|| unaligned_offset
)
1338 ? &htab
->unaligned_relative_reloc
1339 : &htab
->relative_reloc
),
1340 irel
, input_section
, sec
, h
, isym
, offset
))
1345 input_section
->relative_reloc_packed
= 1;
1350 if ((unsigned char *) isymbuf
!= symtab_hdr
->contents
)
1352 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
1353 free (internal_relocs
);
1357 /* Add an entry to the 64-bit DT_RELR bitmap. */
1360 elf64_dt_relr_bitmap_add
1361 (struct bfd_link_info
*info
, struct elf_dt_relr_bitmap
*bitmap
,
1364 bfd_size_type newidx
;
1366 if (bitmap
->u
.elf64
== NULL
)
1368 bitmap
->u
.elf64
= bfd_malloc (sizeof (uint64_t));
1373 newidx
= bitmap
->count
++;
1375 if (bitmap
->count
> bitmap
->size
)
1378 bitmap
->u
.elf64
= bfd_realloc (bitmap
->u
.elf64
,
1379 (bitmap
->size
* sizeof (uint64_t)));
1382 if (bitmap
->u
.elf64
== NULL
)
1384 info
->callbacks
->einfo
1385 /* xgettext:c-format */
1386 (_("%F%P: %pB: failed to allocate 64-bit DT_RELR bitmap\n"),
1390 bitmap
->u
.elf64
[newidx
] = entry
;
1393 /* Add an entry to the 32-bit DT_RELR bitmap. */
1396 elf32_dt_relr_bitmap_add
1397 (struct bfd_link_info
*info
, struct elf_dt_relr_bitmap
*bitmap
,
1400 bfd_size_type newidx
;
1402 if (bitmap
->u
.elf32
== NULL
)
1404 bitmap
->u
.elf32
= bfd_malloc (sizeof (uint32_t));
1409 newidx
= bitmap
->count
++;
1411 if (bitmap
->count
> bitmap
->size
)
1414 bitmap
->u
.elf32
= bfd_realloc (bitmap
->u
.elf32
,
1415 (bitmap
->size
* sizeof (uint32_t)));
1418 if (bitmap
->u
.elf32
== NULL
)
1420 info
->callbacks
->einfo
1421 /* xgettext:c-format */
1422 (_("%F%P: %pB: failed to allocate 32-bit DT_RELR bitmap\n"),
1426 bitmap
->u
.elf32
[newidx
] = entry
;
1430 _bfd_elf32_write_addend (bfd
*abfd
, uint64_t value
, void *addr
)
1432 bfd_put_32 (abfd
, value
, addr
);
1436 _bfd_elf64_write_addend (bfd
*abfd
, uint64_t value
, void *addr
)
1438 bfd_put_64 (abfd
, value
, addr
);
1441 /* Size or finish relative relocations to determine the run-time
1442 addresses for DT_RELR bitmap computation later. OUTREL is set
1443 to NULL in the sizing phase and non-NULL in the finising phase
1444 where the regular relative relocations will be written out. */
1447 elf_x86_size_or_finish_relative_reloc
1448 (bool is_x86_64
, struct bfd_link_info
*info
,
1449 struct elf_x86_link_hash_table
*htab
, bool unaligned
,
1450 Elf_Internal_Rela
*outrel
)
1452 unsigned int align_mask
;
1453 bfd_size_type i
, count
;
1454 asection
*sec
, *srel
;
1455 struct elf_link_hash_entry
*h
;
1457 Elf_Internal_Sym
*sym
;
1459 asection
*sgot
= htab
->elf
.sgot
;
1460 asection
*srelgot
= htab
->elf
.srelgot
;
1461 struct elf_x86_relative_reloc_data
*relative_reloc
;
1466 relative_reloc
= &htab
->unaligned_relative_reloc
;
1471 relative_reloc
= &htab
->relative_reloc
;
1474 count
= relative_reloc
->count
;
1475 for (i
= 0; i
< count
; i
++)
1477 sec
= relative_reloc
->data
[i
].sec
;
1478 sym
= relative_reloc
->data
[i
].sym
;
1480 /* If SYM is NULL, it must be a global symbol. */
1482 h
= relative_reloc
->data
[i
].u
.h
;
1489 /* This function may be called more than once and REL may be
1490 updated by _bfd_elf_rela_local_sym below. */
1491 Elf_Internal_Rela rel
= relative_reloc
->data
[i
].rel
;
1495 if (h
->root
.type
== bfd_link_hash_defined
1496 || h
->root
.type
== bfd_link_hash_defweak
)
1498 sym_sec
= h
->root
.u
.def
.section
;
1499 relocation
= (h
->root
.u
.def
.value
1500 + sym_sec
->output_section
->vma
1501 + sym_sec
->output_offset
);
1505 /* Allow undefined symbol only at the sizing phase.
1506 Otherwise skip undefined symbol here. Undefined
1507 symbol will be reported by relocate_section. */
1516 sym_sec
= relative_reloc
->data
[i
].u
.sym_sec
;
1517 relocation
= _bfd_elf_rela_local_sym
1518 (info
->output_bfd
, sym
, &sym_sec
, &rel
);
1523 outrel
->r_addend
= relocation
;
1526 if (h
!= NULL
&& h
->needs_plt
)
1530 outrel
->r_addend
+= rel
.r_addend
;
1532 /* Write the implicit addend if ALIGN_MASK isn't 0. */
1537 if (relative_reloc
->data
[i
].offset
>= sec
->size
)
1539 htab
->elf_write_addend_in_got
1540 (info
->output_bfd
, outrel
->r_addend
,
1541 sec
->contents
+ relative_reloc
->data
[i
].offset
);
1545 if (rel
.r_offset
>= sec
->size
)
1547 htab
->elf_write_addend
1548 (info
->output_bfd
, outrel
->r_addend
,
1549 (elf_section_data (sec
)->this_hdr
.contents
1559 srel
= elf_section_data (sec
)->sreloc
;
1560 offset
= (sec
->output_section
->vma
+ sec
->output_offset
1561 + relative_reloc
->data
[i
].offset
);
1562 relative_reloc
->data
[i
].address
= offset
;
1565 outrel
->r_offset
= offset
;
1567 if ((outrel
->r_offset
& align_mask
) != 0)
1570 if (htab
->params
->report_relative_reloc
)
1571 _bfd_x86_elf_link_report_relative_reloc
1572 (info
, sec
, h
, sym
, htab
->relative_r_name
, outrel
);
1574 /* Generate regular relative relocation if ALIGN_MASK is 0. */
1575 if (align_mask
== 0)
1576 htab
->elf_append_reloc (info
->output_bfd
, srel
, outrel
);
1581 /* Compute the DT_RELR section size. Set NEED_PLAYOUT to true if
1582 the DT_RELR section size has been increased. */
1585 elf_x86_compute_dl_relr_bitmap
1586 (struct bfd_link_info
*info
, struct elf_x86_link_hash_table
*htab
,
1590 bfd_size_type i
, count
, new_count
;
1591 struct elf_x86_relative_reloc_data
*relative_reloc
=
1592 &htab
->relative_reloc
;
1593 /* Save the old DT_RELR bitmap count. Don't shrink the DT_RELR bitmap
1594 if the new DT_RELR bitmap count is smaller than the old one. Pad
1595 with trailing 1s which won't be decoded to more relocations. */
1596 bfd_size_type dt_relr_bitmap_count
= htab
->dt_relr_bitmap
.count
;
1598 /* Clear the DT_RELR bitmap count. */
1599 htab
->dt_relr_bitmap
.count
= 0;
1601 count
= relative_reloc
->count
;
1603 if (ABI_64_P (info
->output_bfd
))
1605 /* Compute the 64-bit DT_RELR bitmap. */
1609 if ((relative_reloc
->data
[i
].address
% 1) != 0)
1612 elf64_dt_relr_bitmap_add (info
, &htab
->dt_relr_bitmap
,
1613 relative_reloc
->data
[i
].address
);
1615 base
= relative_reloc
->data
[i
].address
+ 8;
1620 uint64_t bitmap
= 0;
1621 for (; i
< count
; i
++)
1623 bfd_vma delta
= (relative_reloc
->data
[i
].address
1625 /* Stop if it is too far from base. */
1626 if (delta
>= 63 * 8)
1628 /* Stop if it isn't a multiple of 8. */
1629 if ((delta
% 8) != 0)
1631 bitmap
|= 1ULL << (delta
/ 8);
1637 elf64_dt_relr_bitmap_add (info
, &htab
->dt_relr_bitmap
,
1644 new_count
= htab
->dt_relr_bitmap
.count
;
1645 if (dt_relr_bitmap_count
> new_count
)
1647 /* Don't shrink the DT_RELR section size to avoid section
1648 layout oscillation. Instead, pad the DT_RELR bitmap with
1649 1s which do not decode to more relocations. */
1651 htab
->dt_relr_bitmap
.count
= dt_relr_bitmap_count
;
1652 count
= dt_relr_bitmap_count
- new_count
;
1653 for (i
= 0; i
< count
; i
++)
1654 htab
->dt_relr_bitmap
.u
.elf64
[new_count
+ i
] = 1;
1659 /* Compute the 32-bit DT_RELR bitmap. */
1663 if ((relative_reloc
->data
[i
].address
% 1) != 0)
1666 elf32_dt_relr_bitmap_add (info
, &htab
->dt_relr_bitmap
,
1667 relative_reloc
->data
[i
].address
);
1669 base
= relative_reloc
->data
[i
].address
+ 4;
1674 uint32_t bitmap
= 0;
1675 for (; i
< count
; i
++)
1677 bfd_vma delta
= (relative_reloc
->data
[i
].address
1679 /* Stop if it is too far from base. */
1680 if (delta
>= 31 * 4)
1682 /* Stop if it isn't a multiple of 4. */
1683 if ((delta
% 4) != 0)
1685 bitmap
|= 1ULL << (delta
/ 4);
1691 elf32_dt_relr_bitmap_add (info
, &htab
->dt_relr_bitmap
,
1698 new_count
= htab
->dt_relr_bitmap
.count
;
1699 if (dt_relr_bitmap_count
> new_count
)
1701 /* Don't shrink the DT_RELR section size to avoid section
1702 layout oscillation. Instead, pad the DT_RELR bitmap with
1703 1s which do not decode to more relocations. */
1705 htab
->dt_relr_bitmap
.count
= dt_relr_bitmap_count
;
1706 count
= dt_relr_bitmap_count
- new_count
;
1707 for (i
= 0; i
< count
; i
++)
1708 htab
->dt_relr_bitmap
.u
.elf32
[new_count
+ i
] = 1;
1712 if (htab
->dt_relr_bitmap
.count
!= dt_relr_bitmap_count
)
1716 /* The .relr.dyn section size is changed. Update the section
1717 size and tell linker to layout sections again. */
1718 htab
->elf
.srelrdyn
->size
=
1719 (htab
->dt_relr_bitmap
.count
1720 * (ABI_64_P (info
->output_bfd
) ? 8 : 4));
1722 *need_layout
= true;
1725 info
->callbacks
->einfo
1726 /* xgettext:c-format */
1727 (_("%F%P: %pB: size of compact relative reloc section is "
1728 "changed: new (%lu) != old (%lu)\n"),
1729 info
->output_bfd
, htab
->dt_relr_bitmap
.count
,
1730 dt_relr_bitmap_count
);
1734 /* Write out the DT_RELR section. */
1737 elf_x86_write_dl_relr_bitmap (struct bfd_link_info
*info
,
1738 struct elf_x86_link_hash_table
*htab
)
1740 asection
*sec
= htab
->elf
.srelrdyn
;
1741 bfd_size_type size
= sec
->size
;
1743 unsigned char *contents
;
1745 contents
= (unsigned char *) bfd_alloc (sec
->owner
, size
);
1746 if (contents
== NULL
)
1747 info
->callbacks
->einfo
1748 /* xgettext:c-format */
1749 (_("%F%P: %pB: failed to allocate compact relative reloc section\n"),
1752 /* Cache the section contents for elf_link_input_bfd. */
1753 sec
->contents
= contents
;
1755 if (ABI_64_P (info
->output_bfd
))
1756 for (i
= 0; i
< htab
->dt_relr_bitmap
.count
; i
++, contents
+= 8)
1757 bfd_put_64 (info
->output_bfd
, htab
->dt_relr_bitmap
.u
.elf64
[i
],
1760 for (i
= 0; i
< htab
->dt_relr_bitmap
.count
; i
++, contents
+= 4)
1761 bfd_put_32 (info
->output_bfd
, htab
->dt_relr_bitmap
.u
.elf32
[i
],
1765 /* Sort relative relocations by address. */
1768 elf_x86_relative_reloc_compare (const void *pa
, const void *pb
)
1770 struct elf_x86_relative_reloc_record
*a
=
1771 (struct elf_x86_relative_reloc_record
*) pa
;
1772 struct elf_x86_relative_reloc_record
*b
=
1773 (struct elf_x86_relative_reloc_record
*) pb
;
1774 if (a
->address
< b
->address
)
1776 if (a
->address
> b
->address
)
1782 _bfd_elf_x86_size_relative_relocs (struct bfd_link_info
*info
,
1785 struct elf_x86_link_hash_table
*htab
;
1786 const struct elf_backend_data
*bed
;
1788 bfd_size_type i
, count
, unaligned_count
;
1789 asection
*sec
, *srel
;
1791 /* Do nothing for ld -r. */
1792 if (bfd_link_relocatable (info
))
1795 bed
= get_elf_backend_data (info
->output_bfd
);
1796 htab
= elf_x86_hash_table (info
, bed
->target_id
);
1800 count
= htab
->relative_reloc
.count
;
1801 unaligned_count
= htab
->unaligned_relative_reloc
.count
;
1804 if (htab
->generate_relative_reloc_pass
== 0
1805 && htab
->elf
.srelrdyn
!= NULL
)
1807 /* Remove the empty .relr.dyn sections now. */
1808 if (!bfd_is_abs_section (htab
->elf
.srelrdyn
->output_section
))
1810 bfd_section_list_remove
1811 (info
->output_bfd
, htab
->elf
.srelrdyn
->output_section
);
1812 info
->output_bfd
->section_count
--;
1814 bfd_section_list_remove (htab
->elf
.srelrdyn
->owner
,
1815 htab
->elf
.srelrdyn
);
1816 htab
->elf
.srelrdyn
->owner
->section_count
--;
1818 if (unaligned_count
== 0)
1820 htab
->generate_relative_reloc_pass
++;
1825 is_x86_64
= bed
->target_id
== X86_64_ELF_DATA
;
1827 /* Size relative relocations. */
1828 if (htab
->generate_relative_reloc_pass
)
1830 /* Reset the regular relative relocation count. */
1831 for (i
= 0; i
< unaligned_count
; i
++)
1833 sec
= htab
->unaligned_relative_reloc
.data
[i
].sec
;
1834 srel
= elf_section_data (sec
)->sreloc
;
1835 srel
->reloc_count
= 0;
1840 /* Remove the reserved space for compact relative relocations. */
1843 asection
*sgot
= htab
->elf
.sgot
;
1844 asection
*srelgot
= htab
->elf
.srelgot
;
1846 for (i
= 0; i
< count
; i
++)
1848 sec
= htab
->relative_reloc
.data
[i
].sec
;
1852 srel
= elf_section_data (sec
)->sreloc
;
1853 srel
->size
-= htab
->sizeof_reloc
;
1858 /* Size unaligned relative relocations. */
1859 if (unaligned_count
)
1860 elf_x86_size_or_finish_relative_reloc (is_x86_64
, info
, htab
,
1865 elf_x86_size_or_finish_relative_reloc (is_x86_64
, info
, htab
,
1868 /* Sort relative relocations by addresses. We only need to
1869 sort them in the first pass since the relative positions
1871 if (htab
->generate_relative_reloc_pass
== 0)
1872 qsort (htab
->relative_reloc
.data
, count
,
1873 sizeof (struct elf_x86_relative_reloc_record
),
1874 elf_x86_relative_reloc_compare
);
1876 elf_x86_compute_dl_relr_bitmap (info
, htab
, need_layout
);
1879 htab
->generate_relative_reloc_pass
++;
1885 _bfd_elf_x86_finish_relative_relocs (struct bfd_link_info
*info
)
1887 struct elf_x86_link_hash_table
*htab
;
1888 const struct elf_backend_data
*bed
;
1889 Elf_Internal_Rela outrel
;
1891 bfd_size_type count
;
1893 /* Do nothing for ld -r. */
1894 if (bfd_link_relocatable (info
))
1897 bed
= get_elf_backend_data (info
->output_bfd
);
1898 htab
= elf_x86_hash_table (info
, bed
->target_id
);
1902 is_x86_64
= bed
->target_id
== X86_64_ELF_DATA
;
1904 outrel
.r_info
= htab
->r_info (0, htab
->relative_r_type
);
1906 if (htab
->unaligned_relative_reloc
.count
)
1907 elf_x86_size_or_finish_relative_reloc (is_x86_64
, info
, htab
,
1910 count
= htab
->relative_reloc
.count
;
1913 elf_x86_size_or_finish_relative_reloc (is_x86_64
, info
, htab
,
1916 elf_x86_compute_dl_relr_bitmap (info
, htab
, NULL
);
1918 elf_x86_write_dl_relr_bitmap (info
, htab
);
1925 _bfd_elf_x86_valid_reloc_p (asection
*input_section
,
1926 struct bfd_link_info
*info
,
1927 struct elf_x86_link_hash_table
*htab
,
1928 const Elf_Internal_Rela
*rel
,
1929 struct elf_link_hash_entry
*h
,
1930 Elf_Internal_Sym
*sym
,
1931 Elf_Internal_Shdr
*symtab_hdr
,
1932 bool *no_dynreloc_p
)
1934 bool valid_p
= true;
1936 *no_dynreloc_p
= false;
1938 /* Check If relocation against non-preemptible absolute symbol is
1939 valid in PIC. FIXME: Can't use SYMBOL_REFERENCES_LOCAL_P since
1940 it may call _bfd_elf_link_hide_sym_by_version and result in
1941 ld-elfvers/ vers21 test failure. */
1942 if (bfd_link_pic (info
)
1943 && (h
== NULL
|| SYMBOL_REFERENCES_LOCAL (info
, h
)))
1945 const struct elf_backend_data
*bed
;
1946 unsigned int r_type
;
1947 Elf_Internal_Rela irel
;
1949 /* Skip non-absolute symbol. */
1952 if (!ABS_SYMBOL_P (h
))
1955 else if (sym
->st_shndx
!= SHN_ABS
)
1958 bed
= get_elf_backend_data (input_section
->owner
);
1959 r_type
= ELF32_R_TYPE (rel
->r_info
);
1962 /* Only allow relocations against absolute symbol, which can be
1963 resolved as absolute value + addend. GOTPCREL and GOT32
1964 relocations are allowed since absolute value + addend is
1965 stored in the GOT slot. */
1966 if (bed
->target_id
== X86_64_ELF_DATA
)
1968 r_type
&= ~R_X86_64_converted_reloc_bit
;
1969 valid_p
= (r_type
== R_X86_64_64
1970 || r_type
== R_X86_64_32
1971 || r_type
== R_X86_64_32S
1972 || r_type
== R_X86_64_16
1973 || r_type
== R_X86_64_8
1974 || r_type
== R_X86_64_GOTPCREL
1975 || r_type
== R_X86_64_GOTPCRELX
1976 || r_type
== R_X86_64_REX_GOTPCRELX
);
1979 unsigned int r_symndx
= htab
->r_sym (rel
->r_info
);
1980 irel
.r_info
= htab
->r_info (r_symndx
, r_type
);
1984 valid_p
= (r_type
== R_386_32
1985 || r_type
== R_386_16
1986 || r_type
== R_386_8
1987 || r_type
== R_386_GOT32
1988 || r_type
== R_386_GOT32X
);
1991 *no_dynreloc_p
= true;
1995 arelent internal_reloc
;
1997 if (!bed
->elf_info_to_howto (input_section
->owner
,
1998 &internal_reloc
, &irel
)
1999 || internal_reloc
.howto
== NULL
)
2003 name
= h
->root
.root
.string
;
2005 name
= bfd_elf_sym_name (input_section
->owner
, symtab_hdr
,
2007 info
->callbacks
->einfo
2008 /* xgettext:c-format */
2009 (_("%F%P: %pB: relocation %s against absolute symbol "
2010 "`%s' in section `%pA' is disallowed\n"),
2011 input_section
->owner
, internal_reloc
.howto
->name
, name
,
2013 bfd_set_error (bfd_error_bad_value
);
2020 /* Set the sizes of the dynamic sections. */
2023 _bfd_x86_elf_size_dynamic_sections (bfd
*output_bfd
,
2024 struct bfd_link_info
*info
)
2026 struct elf_x86_link_hash_table
*htab
;
2031 const struct elf_backend_data
*bed
2032 = get_elf_backend_data (output_bfd
);
2034 htab
= elf_x86_hash_table (info
, bed
->target_id
);
2037 dynobj
= htab
->elf
.dynobj
;
2041 /* Set up .got offsets for local syms, and space for local dynamic
2043 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
2045 bfd_signed_vma
*local_got
;
2046 bfd_signed_vma
*end_local_got
;
2047 char *local_tls_type
;
2048 bfd_vma
*local_tlsdesc_gotent
;
2049 bfd_size_type locsymcount
;
2050 Elf_Internal_Shdr
*symtab_hdr
;
2053 if (! is_x86_elf (ibfd
, htab
))
2056 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
2058 struct elf_dyn_relocs
*p
;
2060 for (p
= ((struct elf_dyn_relocs
*)
2061 elf_section_data (s
)->local_dynrel
);
2065 if (!bfd_is_abs_section (p
->sec
)
2066 && bfd_is_abs_section (p
->sec
->output_section
))
2068 /* Input section has been discarded, either because
2069 it is a copy of a linkonce section or due to
2070 linker script /DISCARD/, so we'll be discarding
2073 else if (htab
->elf
.target_os
== is_vxworks
2074 && strcmp (p
->sec
->output_section
->name
,
2077 /* Relocations in vxworks .tls_vars sections are
2078 handled specially by the loader. */
2080 else if (p
->count
!= 0)
2082 srel
= elf_section_data (p
->sec
)->sreloc
;
2083 srel
->size
+= p
->count
* htab
->sizeof_reloc
;
2084 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0
2085 && (info
->flags
& DF_TEXTREL
) == 0)
2087 info
->flags
|= DF_TEXTREL
;
2088 if (bfd_link_textrel_check (info
))
2089 /* xgettext:c-format */
2090 info
->callbacks
->einfo
2091 (_("%P: %pB: warning: relocation "
2092 "in read-only section `%pA'\n"),
2093 p
->sec
->owner
, p
->sec
);
2099 local_got
= elf_local_got_refcounts (ibfd
);
2103 symtab_hdr
= &elf_symtab_hdr (ibfd
);
2104 locsymcount
= symtab_hdr
->sh_info
;
2105 end_local_got
= local_got
+ locsymcount
;
2106 local_tls_type
= elf_x86_local_got_tls_type (ibfd
);
2107 local_tlsdesc_gotent
= elf_x86_local_tlsdesc_gotent (ibfd
);
2109 srel
= htab
->elf
.srelgot
;
2110 for (; local_got
< end_local_got
;
2111 ++local_got
, ++local_tls_type
, ++local_tlsdesc_gotent
)
2113 *local_tlsdesc_gotent
= (bfd_vma
) -1;
2116 if (GOT_TLS_GDESC_P (*local_tls_type
))
2118 *local_tlsdesc_gotent
= htab
->elf
.sgotplt
->size
2119 - elf_x86_compute_jump_table_size (htab
);
2120 htab
->elf
.sgotplt
->size
+= 2 * htab
->got_entry_size
;
2121 *local_got
= (bfd_vma
) -2;
2123 if (! GOT_TLS_GDESC_P (*local_tls_type
)
2124 || GOT_TLS_GD_P (*local_tls_type
))
2126 *local_got
= s
->size
;
2127 s
->size
+= htab
->got_entry_size
;
2128 if (GOT_TLS_GD_P (*local_tls_type
)
2129 || *local_tls_type
== GOT_TLS_IE_BOTH
)
2130 s
->size
+= htab
->got_entry_size
;
2132 if ((bfd_link_pic (info
) && *local_tls_type
!= GOT_ABS
)
2133 || GOT_TLS_GD_ANY_P (*local_tls_type
)
2134 || (*local_tls_type
& GOT_TLS_IE
))
2136 if (*local_tls_type
== GOT_TLS_IE_BOTH
)
2137 srel
->size
+= 2 * htab
->sizeof_reloc
;
2138 else if (GOT_TLS_GD_P (*local_tls_type
)
2139 || ! GOT_TLS_GDESC_P (*local_tls_type
))
2140 srel
->size
+= htab
->sizeof_reloc
;
2141 if (GOT_TLS_GDESC_P (*local_tls_type
))
2143 htab
->elf
.srelplt
->size
+= htab
->sizeof_reloc
;
2144 if (bed
->target_id
== X86_64_ELF_DATA
)
2145 htab
->elf
.tlsdesc_plt
= (bfd_vma
) -1;
2150 *local_got
= (bfd_vma
) -1;
2154 if (htab
->tls_ld_or_ldm_got
.refcount
> 0)
2156 /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
2157 or R_X86_64_TLSLD relocs. */
2158 htab
->tls_ld_or_ldm_got
.offset
= htab
->elf
.sgot
->size
;
2159 htab
->elf
.sgot
->size
+= 2 * htab
->got_entry_size
;
2160 htab
->elf
.srelgot
->size
+= htab
->sizeof_reloc
;
2163 htab
->tls_ld_or_ldm_got
.offset
= -1;
2165 /* Allocate global sym .plt and .got entries, and space for global
2166 sym dynamic relocs. */
2167 elf_link_hash_traverse (&htab
->elf
, elf_x86_allocate_dynrelocs
,
2170 /* Allocate .plt and .got entries, and space for local symbols. */
2171 htab_traverse (htab
->loc_hash_table
, elf_x86_allocate_local_dynreloc
,
2174 /* For every jump slot reserved in the sgotplt, reloc_count is
2175 incremented. However, when we reserve space for TLS descriptors,
2176 it's not incremented, so in order to compute the space reserved
2177 for them, it suffices to multiply the reloc count by the jump
2180 PR ld/13302: We start next_irelative_index at the end of .rela.plt
2181 so that R_{386,X86_64}_IRELATIVE entries come last. */
2182 if (htab
->elf
.srelplt
)
2184 htab
->next_tls_desc_index
= htab
->elf
.srelplt
->reloc_count
;
2185 htab
->sgotplt_jump_table_size
2186 = elf_x86_compute_jump_table_size (htab
);
2187 htab
->next_irelative_index
= htab
->elf
.srelplt
->reloc_count
- 1;
2189 else if (htab
->elf
.irelplt
)
2190 htab
->next_irelative_index
= htab
->elf
.irelplt
->reloc_count
- 1;
2192 if (htab
->elf
.tlsdesc_plt
)
2194 /* NB: tlsdesc_plt is set only for x86-64. If we're not using
2195 lazy TLS relocations, don't generate the PLT and GOT entries
2197 if ((info
->flags
& DF_BIND_NOW
))
2198 htab
->elf
.tlsdesc_plt
= 0;
2201 htab
->elf
.tlsdesc_got
= htab
->elf
.sgot
->size
;
2202 htab
->elf
.sgot
->size
+= htab
->got_entry_size
;
2203 /* Reserve room for the initial entry.
2204 FIXME: we could probably do away with it in this case. */
2205 if (htab
->elf
.splt
->size
== 0)
2206 htab
->elf
.splt
->size
= htab
->plt
.plt_entry_size
;
2207 htab
->elf
.tlsdesc_plt
= htab
->elf
.splt
->size
;
2208 htab
->elf
.splt
->size
+= htab
->plt
.plt_entry_size
;
2212 if (htab
->elf
.sgotplt
)
2214 /* Don't allocate .got.plt section if there are no GOT nor PLT
2215 entries and there is no reference to _GLOBAL_OFFSET_TABLE_. */
2216 if ((htab
->elf
.hgot
== NULL
2217 || !htab
->got_referenced
)
2218 && (htab
->elf
.sgotplt
->size
== bed
->got_header_size
)
2219 && (htab
->elf
.splt
== NULL
2220 || htab
->elf
.splt
->size
== 0)
2221 && (htab
->elf
.sgot
== NULL
2222 || htab
->elf
.sgot
->size
== 0)
2223 && (htab
->elf
.iplt
== NULL
2224 || htab
->elf
.iplt
->size
== 0)
2225 && (htab
->elf
.igotplt
== NULL
2226 || htab
->elf
.igotplt
->size
== 0))
2228 htab
->elf
.sgotplt
->size
= 0;
2229 /* Solaris requires to keep _GLOBAL_OFFSET_TABLE_ even if it
2231 if (htab
->elf
.hgot
!= NULL
2232 && htab
->elf
.target_os
!= is_solaris
)
2234 /* Remove the unused _GLOBAL_OFFSET_TABLE_ from symbol
2236 htab
->elf
.hgot
->root
.type
= bfd_link_hash_undefined
;
2237 htab
->elf
.hgot
->root
.u
.undef
.abfd
2238 = htab
->elf
.hgot
->root
.u
.def
.section
->owner
;
2239 htab
->elf
.hgot
->root
.linker_def
= 0;
2240 htab
->elf
.hgot
->ref_regular
= 0;
2241 htab
->elf
.hgot
->def_regular
= 0;
2246 if (_bfd_elf_eh_frame_present (info
))
2248 if (htab
->plt_eh_frame
!= NULL
2249 && htab
->elf
.splt
!= NULL
2250 && htab
->elf
.splt
->size
!= 0
2251 && !bfd_is_abs_section (htab
->elf
.splt
->output_section
))
2252 htab
->plt_eh_frame
->size
= htab
->plt
.eh_frame_plt_size
;
2254 if (htab
->plt_got_eh_frame
!= NULL
2255 && htab
->plt_got
!= NULL
2256 && htab
->plt_got
->size
!= 0
2257 && !bfd_is_abs_section (htab
->plt_got
->output_section
))
2258 htab
->plt_got_eh_frame
->size
2259 = htab
->non_lazy_plt
->eh_frame_plt_size
;
2261 /* Unwind info for the second PLT and .plt.got sections are
2263 if (htab
->plt_second_eh_frame
!= NULL
2264 && htab
->plt_second
!= NULL
2265 && htab
->plt_second
->size
!= 0
2266 && !bfd_is_abs_section (htab
->plt_second
->output_section
))
2267 htab
->plt_second_eh_frame
->size
2268 = htab
->non_lazy_plt
->eh_frame_plt_size
;
2271 /* We now have determined the sizes of the various dynamic sections.
2272 Allocate memory for them. */
2274 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
2276 bool strip_section
= true;
2278 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
2281 /* The .relr.dyn section for compact relative relocation will
2283 if (s
== htab
->elf
.srelrdyn
)
2286 if (s
== htab
->elf
.splt
2287 || s
== htab
->elf
.sgot
)
2289 /* Strip this section if we don't need it; see the
2291 /* We'd like to strip these sections if they aren't needed, but if
2292 we've exported dynamic symbols from them we must leave them.
2293 It's too late to tell BFD to get rid of the symbols. */
2295 if (htab
->elf
.hplt
!= NULL
)
2296 strip_section
= false;
2298 else if (s
== htab
->elf
.sgotplt
2299 || s
== htab
->elf
.iplt
2300 || s
== htab
->elf
.igotplt
2301 || s
== htab
->plt_second
2302 || s
== htab
->plt_got
2303 || s
== htab
->plt_eh_frame
2304 || s
== htab
->plt_got_eh_frame
2305 || s
== htab
->plt_second_eh_frame
2306 || s
== htab
->elf
.sdynbss
2307 || s
== htab
->elf
.sdynrelro
)
2309 /* Strip these too. */
2311 else if (htab
->is_reloc_section (bfd_section_name (s
)))
2314 && s
!= htab
->elf
.srelplt
2315 && s
!= htab
->srelplt2
)
2318 /* We use the reloc_count field as a counter if we need
2319 to copy relocs into the output file. */
2320 if (s
!= htab
->elf
.srelplt
)
2325 /* It's not one of our sections, so don't allocate space. */
2331 /* If we don't need this section, strip it from the
2332 output file. This is mostly to handle .rel.bss and
2333 .rel.plt. We must create both sections in
2334 create_dynamic_sections, because they must be created
2335 before the linker maps input sections to output
2336 sections. The linker does that before
2337 adjust_dynamic_symbol is called, and it is that
2338 function which decides whether anything needs to go
2339 into these sections. */
2341 s
->flags
|= SEC_EXCLUDE
;
2345 if ((s
->flags
& SEC_HAS_CONTENTS
) == 0)
2348 /* NB: Initially, the iplt section has minimal alignment to
2349 avoid moving dot of the following section backwards when
2350 it is empty. Update its section alignment now since it
2352 if (s
== htab
->elf
.iplt
)
2353 bfd_set_section_alignment (s
, htab
->plt
.iplt_alignment
);
2355 /* Allocate memory for the section contents. We use bfd_zalloc
2356 here in case unused entries are not reclaimed before the
2357 section's contents are written out. This should not happen,
2358 but this way if it does, we get a R_386_NONE or R_X86_64_NONE
2359 reloc instead of garbage. */
2360 s
->contents
= (unsigned char *) bfd_zalloc (dynobj
, s
->size
);
2361 if (s
->contents
== NULL
)
2365 if (htab
->plt_eh_frame
!= NULL
2366 && htab
->plt_eh_frame
->contents
!= NULL
)
2368 memcpy (htab
->plt_eh_frame
->contents
,
2369 htab
->plt
.eh_frame_plt
,
2370 htab
->plt_eh_frame
->size
);
2371 bfd_put_32 (dynobj
, htab
->elf
.splt
->size
,
2372 htab
->plt_eh_frame
->contents
+ PLT_FDE_LEN_OFFSET
);
2375 if (htab
->plt_got_eh_frame
!= NULL
2376 && htab
->plt_got_eh_frame
->contents
!= NULL
)
2378 memcpy (htab
->plt_got_eh_frame
->contents
,
2379 htab
->non_lazy_plt
->eh_frame_plt
,
2380 htab
->plt_got_eh_frame
->size
);
2381 bfd_put_32 (dynobj
, htab
->plt_got
->size
,
2382 (htab
->plt_got_eh_frame
->contents
2383 + PLT_FDE_LEN_OFFSET
));
2386 if (htab
->plt_second_eh_frame
!= NULL
2387 && htab
->plt_second_eh_frame
->contents
!= NULL
)
2389 memcpy (htab
->plt_second_eh_frame
->contents
,
2390 htab
->non_lazy_plt
->eh_frame_plt
,
2391 htab
->plt_second_eh_frame
->size
);
2392 bfd_put_32 (dynobj
, htab
->plt_second
->size
,
2393 (htab
->plt_second_eh_frame
->contents
2394 + PLT_FDE_LEN_OFFSET
));
2397 return _bfd_elf_maybe_vxworks_add_dynamic_tags (output_bfd
, info
,
2401 /* Finish up the x86 dynamic sections. */
2403 struct elf_x86_link_hash_table
*
2404 _bfd_x86_elf_finish_dynamic_sections (bfd
*output_bfd
,
2405 struct bfd_link_info
*info
)
2407 struct elf_x86_link_hash_table
*htab
;
2408 const struct elf_backend_data
*bed
;
2411 bfd_byte
*dyncon
, *dynconend
;
2412 bfd_size_type sizeof_dyn
;
2414 bed
= get_elf_backend_data (output_bfd
);
2415 htab
= elf_x86_hash_table (info
, bed
->target_id
);
2419 dynobj
= htab
->elf
.dynobj
;
2420 sdyn
= bfd_get_linker_section (dynobj
, ".dynamic");
2422 /* GOT is always created in setup_gnu_properties. But it may not be
2423 needed. .got.plt section may be needed for static IFUNC. */
2424 if (htab
->elf
.sgotplt
&& htab
->elf
.sgotplt
->size
> 0)
2426 bfd_vma dynamic_addr
;
2428 if (bfd_is_abs_section (htab
->elf
.sgotplt
->output_section
))
2431 (_("discarded output section: `%pA'"), htab
->elf
.sgotplt
);
2435 elf_section_data (htab
->elf
.sgotplt
->output_section
)->this_hdr
.sh_entsize
2436 = htab
->got_entry_size
;
2438 dynamic_addr
= (sdyn
== NULL
2440 : sdyn
->output_section
->vma
+ sdyn
->output_offset
);
2442 /* Set the first entry in the global offset table to the address
2443 of the dynamic section. Write GOT[1] and GOT[2], needed for
2444 the dynamic linker. */
2445 if (htab
->got_entry_size
== 8)
2447 bfd_put_64 (output_bfd
, dynamic_addr
,
2448 htab
->elf
.sgotplt
->contents
);
2449 bfd_put_64 (output_bfd
, (bfd_vma
) 0,
2450 htab
->elf
.sgotplt
->contents
+ 8);
2451 bfd_put_64 (output_bfd
, (bfd_vma
) 0,
2452 htab
->elf
.sgotplt
->contents
+ 8*2);
2456 bfd_put_32 (output_bfd
, dynamic_addr
,
2457 htab
->elf
.sgotplt
->contents
);
2458 bfd_put_32 (output_bfd
, 0,
2459 htab
->elf
.sgotplt
->contents
+ 4);
2460 bfd_put_32 (output_bfd
, 0,
2461 htab
->elf
.sgotplt
->contents
+ 4*2);
2465 if (!htab
->elf
.dynamic_sections_created
)
2468 if (sdyn
== NULL
|| htab
->elf
.sgot
== NULL
)
2471 sizeof_dyn
= bed
->s
->sizeof_dyn
;
2472 dyncon
= sdyn
->contents
;
2473 dynconend
= sdyn
->contents
+ sdyn
->size
;
2474 for (; dyncon
< dynconend
; dyncon
+= sizeof_dyn
)
2476 Elf_Internal_Dyn dyn
;
2479 (*bed
->s
->swap_dyn_in
) (dynobj
, dyncon
, &dyn
);
2484 if (htab
->elf
.target_os
== is_vxworks
2485 && elf_vxworks_finish_dynamic_entry (output_bfd
, &dyn
))
2490 s
= htab
->elf
.sgotplt
;
2491 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
2495 dyn
.d_un
.d_ptr
= htab
->elf
.srelplt
->output_section
->vma
;
2499 s
= htab
->elf
.srelplt
->output_section
;
2500 dyn
.d_un
.d_val
= s
->size
;
2503 case DT_TLSDESC_PLT
:
2505 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
2506 + htab
->elf
.tlsdesc_plt
;
2509 case DT_TLSDESC_GOT
:
2511 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
2512 + htab
->elf
.tlsdesc_got
;
2516 (*bed
->s
->swap_dyn_out
) (output_bfd
, &dyn
, dyncon
);
2519 if (htab
->plt_got
!= NULL
&& htab
->plt_got
->size
> 0)
2520 elf_section_data (htab
->plt_got
->output_section
)
2521 ->this_hdr
.sh_entsize
= htab
->non_lazy_plt
->plt_entry_size
;
2523 if (htab
->plt_second
!= NULL
&& htab
->plt_second
->size
> 0)
2524 elf_section_data (htab
->plt_second
->output_section
)
2525 ->this_hdr
.sh_entsize
= htab
->non_lazy_plt
->plt_entry_size
;
2527 /* Adjust .eh_frame for .plt section. */
2528 if (htab
->plt_eh_frame
!= NULL
2529 && htab
->plt_eh_frame
->contents
!= NULL
)
2531 if (htab
->elf
.splt
!= NULL
2532 && htab
->elf
.splt
->size
!= 0
2533 && (htab
->elf
.splt
->flags
& SEC_EXCLUDE
) == 0
2534 && htab
->elf
.splt
->output_section
!= NULL
2535 && htab
->plt_eh_frame
->output_section
!= NULL
)
2537 bfd_vma plt_start
= htab
->elf
.splt
->output_section
->vma
;
2538 bfd_vma eh_frame_start
= htab
->plt_eh_frame
->output_section
->vma
2539 + htab
->plt_eh_frame
->output_offset
2540 + PLT_FDE_START_OFFSET
;
2541 bfd_put_signed_32 (dynobj
, plt_start
- eh_frame_start
,
2542 htab
->plt_eh_frame
->contents
2543 + PLT_FDE_START_OFFSET
);
2546 if (htab
->plt_eh_frame
->sec_info_type
== SEC_INFO_TYPE_EH_FRAME
)
2548 if (! _bfd_elf_write_section_eh_frame (output_bfd
, info
,
2550 htab
->plt_eh_frame
->contents
))
2555 /* Adjust .eh_frame for .plt.got section. */
2556 if (htab
->plt_got_eh_frame
!= NULL
2557 && htab
->plt_got_eh_frame
->contents
!= NULL
)
2559 if (htab
->plt_got
!= NULL
2560 && htab
->plt_got
->size
!= 0
2561 && (htab
->plt_got
->flags
& SEC_EXCLUDE
) == 0
2562 && htab
->plt_got
->output_section
!= NULL
2563 && htab
->plt_got_eh_frame
->output_section
!= NULL
)
2565 bfd_vma plt_start
= htab
->plt_got
->output_section
->vma
;
2566 bfd_vma eh_frame_start
= htab
->plt_got_eh_frame
->output_section
->vma
2567 + htab
->plt_got_eh_frame
->output_offset
2568 + PLT_FDE_START_OFFSET
;
2569 bfd_put_signed_32 (dynobj
, plt_start
- eh_frame_start
,
2570 htab
->plt_got_eh_frame
->contents
2571 + PLT_FDE_START_OFFSET
);
2573 if (htab
->plt_got_eh_frame
->sec_info_type
== SEC_INFO_TYPE_EH_FRAME
)
2575 if (! _bfd_elf_write_section_eh_frame (output_bfd
, info
,
2576 htab
->plt_got_eh_frame
,
2577 htab
->plt_got_eh_frame
->contents
))
2582 /* Adjust .eh_frame for the second PLT section. */
2583 if (htab
->plt_second_eh_frame
!= NULL
2584 && htab
->plt_second_eh_frame
->contents
!= NULL
)
2586 if (htab
->plt_second
!= NULL
2587 && htab
->plt_second
->size
!= 0
2588 && (htab
->plt_second
->flags
& SEC_EXCLUDE
) == 0
2589 && htab
->plt_second
->output_section
!= NULL
2590 && htab
->plt_second_eh_frame
->output_section
!= NULL
)
2592 bfd_vma plt_start
= htab
->plt_second
->output_section
->vma
;
2593 bfd_vma eh_frame_start
2594 = (htab
->plt_second_eh_frame
->output_section
->vma
2595 + htab
->plt_second_eh_frame
->output_offset
2596 + PLT_FDE_START_OFFSET
);
2597 bfd_put_signed_32 (dynobj
, plt_start
- eh_frame_start
,
2598 htab
->plt_second_eh_frame
->contents
2599 + PLT_FDE_START_OFFSET
);
2601 if (htab
->plt_second_eh_frame
->sec_info_type
2602 == SEC_INFO_TYPE_EH_FRAME
)
2604 if (! _bfd_elf_write_section_eh_frame (output_bfd
, info
,
2605 htab
->plt_second_eh_frame
,
2606 htab
->plt_second_eh_frame
->contents
))
2611 if (htab
->elf
.sgot
&& htab
->elf
.sgot
->size
> 0)
2612 elf_section_data (htab
->elf
.sgot
->output_section
)->this_hdr
.sh_entsize
2613 = htab
->got_entry_size
;
2620 _bfd_x86_elf_always_size_sections (bfd
*output_bfd
,
2621 struct bfd_link_info
*info
)
2623 asection
*tls_sec
= elf_hash_table (info
)->tls_sec
;
2627 struct elf_link_hash_entry
*tlsbase
;
2629 tlsbase
= elf_link_hash_lookup (elf_hash_table (info
),
2630 "_TLS_MODULE_BASE_",
2631 false, false, false);
2633 if (tlsbase
&& tlsbase
->type
== STT_TLS
)
2635 struct elf_x86_link_hash_table
*htab
;
2636 struct bfd_link_hash_entry
*bh
= NULL
;
2637 const struct elf_backend_data
*bed
2638 = get_elf_backend_data (output_bfd
);
2640 htab
= elf_x86_hash_table (info
, bed
->target_id
);
2644 if (!(_bfd_generic_link_add_one_symbol
2645 (info
, output_bfd
, "_TLS_MODULE_BASE_", BSF_LOCAL
,
2646 tls_sec
, 0, NULL
, false,
2647 bed
->collect
, &bh
)))
2650 htab
->tls_module_base
= bh
;
2652 tlsbase
= (struct elf_link_hash_entry
*)bh
;
2653 tlsbase
->def_regular
= 1;
2654 tlsbase
->other
= STV_HIDDEN
;
2655 tlsbase
->root
.linker_def
= 1;
2656 (*bed
->elf_backend_hide_symbol
) (info
, tlsbase
, true);
2664 _bfd_x86_elf_merge_symbol_attribute (struct elf_link_hash_entry
*h
,
2665 unsigned int st_other
,
2667 bool dynamic ATTRIBUTE_UNUSED
)
2671 struct elf_x86_link_hash_entry
*eh
2672 = (struct elf_x86_link_hash_entry
*) h
;
2673 eh
->def_protected
= ELF_ST_VISIBILITY (st_other
) == STV_PROTECTED
;
2677 /* Copy the extra info we tack onto an elf_link_hash_entry. */
2680 _bfd_x86_elf_copy_indirect_symbol (struct bfd_link_info
*info
,
2681 struct elf_link_hash_entry
*dir
,
2682 struct elf_link_hash_entry
*ind
)
2684 struct elf_x86_link_hash_entry
*edir
, *eind
;
2686 edir
= (struct elf_x86_link_hash_entry
*) dir
;
2687 eind
= (struct elf_x86_link_hash_entry
*) ind
;
2689 if (ind
->root
.type
== bfd_link_hash_indirect
2690 && dir
->got
.refcount
<= 0)
2692 edir
->tls_type
= eind
->tls_type
;
2693 eind
->tls_type
= GOT_UNKNOWN
;
2696 /* Copy gotoff_ref so that elf_i386_adjust_dynamic_symbol will
2697 generate a R_386_COPY reloc. */
2698 edir
->gotoff_ref
|= eind
->gotoff_ref
;
2700 edir
->zero_undefweak
|= eind
->zero_undefweak
;
2702 if (ELIMINATE_COPY_RELOCS
2703 && ind
->root
.type
!= bfd_link_hash_indirect
2704 && dir
->dynamic_adjusted
)
2706 /* If called to transfer flags for a weakdef during processing
2707 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
2708 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
2709 if (dir
->versioned
!= versioned_hidden
)
2710 dir
->ref_dynamic
|= ind
->ref_dynamic
;
2711 dir
->ref_regular
|= ind
->ref_regular
;
2712 dir
->ref_regular_nonweak
|= ind
->ref_regular_nonweak
;
2713 dir
->needs_plt
|= ind
->needs_plt
;
2714 dir
->pointer_equality_needed
|= ind
->pointer_equality_needed
;
2717 _bfd_elf_link_hash_copy_indirect (info
, dir
, ind
);
2720 /* Remove undefined weak symbol from the dynamic symbol table if it
2721 is resolved to 0. */
2724 _bfd_x86_elf_fixup_symbol (struct bfd_link_info
*info
,
2725 struct elf_link_hash_entry
*h
)
2727 if (h
->dynindx
!= -1
2728 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info
, elf_x86_hash_entry (h
)))
2731 _bfd_elf_strtab_delref (elf_hash_table (info
)->dynstr
,
2737 /* Change the STT_GNU_IFUNC symbol defined in position-dependent
2738 executable into the normal function symbol and set its address
2739 to its PLT entry, which should be resolved by R_*_IRELATIVE at
2743 _bfd_x86_elf_link_fixup_ifunc_symbol (struct bfd_link_info
*info
,
2744 struct elf_x86_link_hash_table
*htab
,
2745 struct elf_link_hash_entry
*h
,
2746 Elf_Internal_Sym
*sym
)
2748 if (bfd_link_pde (info
)
2751 && h
->plt
.offset
!= (bfd_vma
) -1
2752 && h
->type
== STT_GNU_IFUNC
)
2756 bfd
*output_bfd
= info
->output_bfd
;
2758 if (htab
->plt_second
)
2760 struct elf_x86_link_hash_entry
*eh
2761 = (struct elf_x86_link_hash_entry
*) h
;
2763 plt_s
= htab
->plt_second
;
2764 plt_offset
= eh
->plt_second
.offset
;
2768 plt_s
= htab
->elf
.splt
;
2769 plt_offset
= h
->plt
.offset
;
2773 sym
->st_info
= ELF_ST_INFO (ELF_ST_BIND (sym
->st_info
), STT_FUNC
);
2775 = _bfd_elf_section_from_bfd_section (output_bfd
,
2776 plt_s
->output_section
);
2777 sym
->st_value
= (plt_s
->output_section
->vma
2778 + plt_s
->output_offset
+ plt_offset
);
2782 /* Report relative relocation. */
2785 _bfd_x86_elf_link_report_relative_reloc
2786 (struct bfd_link_info
*info
, asection
*asect
,
2787 struct elf_link_hash_entry
*h
, Elf_Internal_Sym
*sym
,
2788 const char *reloc_name
, const void *reloc
)
2792 const Elf_Internal_Rela
*rel
= (const Elf_Internal_Rela
*) reloc
;
2794 /* Use the output BFD for linker created sections. */
2795 if ((asect
->flags
& SEC_LINKER_CREATED
) != 0)
2796 abfd
= info
->output_bfd
;
2798 abfd
= asect
->owner
;
2800 if (h
!= NULL
&& h
->root
.root
.string
!= NULL
)
2801 name
= h
->root
.root
.string
;
2803 name
= bfd_elf_sym_name (abfd
, &elf_symtab_hdr (abfd
), sym
, NULL
);
2805 if (asect
->use_rela_p
)
2806 info
->callbacks
->einfo
2807 (_("%pB: %s (offset: 0x%v, info: 0x%v, addend: 0x%v) against "
2808 "'%s' " "for section '%pA' in %pB\n"),
2809 info
->output_bfd
, reloc_name
, rel
->r_offset
, rel
->r_info
,
2810 rel
->r_addend
, name
, asect
, abfd
);
2812 info
->callbacks
->einfo
2813 (_("%pB: %s (offset: 0x%v, info: 0x%v) against '%s' for section "
2815 info
->output_bfd
, reloc_name
, rel
->r_offset
, rel
->r_info
, name
,
2819 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
2822 _bfd_x86_elf_hash_symbol (struct elf_link_hash_entry
*h
)
2824 if (h
->plt
.offset
!= (bfd_vma
) -1
2826 && !h
->pointer_equality_needed
)
2829 return _bfd_elf_hash_symbol (h
);
2832 /* Adjust a symbol defined by a dynamic object and referenced by a
2833 regular object. The current definition is in some section of the
2834 dynamic object, but we're not including those sections. We have to
2835 change the definition to something the rest of the link can
2839 _bfd_x86_elf_adjust_dynamic_symbol (struct bfd_link_info
*info
,
2840 struct elf_link_hash_entry
*h
)
2842 struct elf_x86_link_hash_table
*htab
;
2844 struct elf_x86_link_hash_entry
*eh
;
2845 struct elf_dyn_relocs
*p
;
2846 const struct elf_backend_data
*bed
2847 = get_elf_backend_data (info
->output_bfd
);
2849 eh
= (struct elf_x86_link_hash_entry
*) h
;
2851 /* Clear GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS if it is turned
2852 on by an input relocatable file and there is a non-GOT/non-PLT
2853 reference from another relocatable file without it.
2854 NB: There can be non-GOT reference in data sections in input with
2855 GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS. */
2856 if (eh
->non_got_ref_without_indirect_extern_access
2857 && info
->indirect_extern_access
== 1
2858 && bfd_link_executable (info
))
2860 unsigned int needed_1
;
2861 info
->indirect_extern_access
= 0;
2862 /* Turn off nocopyreloc if implied by indirect_extern_access. */
2863 if (info
->nocopyreloc
== 2)
2864 info
->nocopyreloc
= 0;
2865 needed_1
= bfd_h_get_32 (info
->output_bfd
, info
->needed_1_p
);
2866 needed_1
&= ~GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS
;
2867 bfd_h_put_32 (info
->output_bfd
, needed_1
, info
->needed_1_p
);
2870 /* STT_GNU_IFUNC symbol must go through PLT. */
2871 if (h
->type
== STT_GNU_IFUNC
)
2873 /* All local STT_GNU_IFUNC references must be treate as local
2874 calls via local PLT. */
2876 && SYMBOL_CALLS_LOCAL (info
, h
))
2878 bfd_size_type pc_count
= 0, count
= 0;
2879 struct elf_dyn_relocs
**pp
;
2881 eh
= (struct elf_x86_link_hash_entry
*) h
;
2882 for (pp
= &h
->dyn_relocs
; (p
= *pp
) != NULL
; )
2884 pc_count
+= p
->pc_count
;
2885 p
->count
-= p
->pc_count
;
2894 if (pc_count
|| count
)
2899 /* Increment PLT reference count only for PC-relative
2902 if (h
->plt
.refcount
<= 0)
2903 h
->plt
.refcount
= 1;
2905 h
->plt
.refcount
+= 1;
2909 /* GOTOFF relocation needs PLT. */
2911 h
->plt
.refcount
= 1;
2914 if (h
->plt
.refcount
<= 0)
2916 h
->plt
.offset
= (bfd_vma
) -1;
2922 /* If this is a function, put it in the procedure linkage table. We
2923 will fill in the contents of the procedure linkage table later,
2924 when we know the address of the .got section. */
2925 if (h
->type
== STT_FUNC
2928 if (h
->plt
.refcount
<= 0
2929 || SYMBOL_CALLS_LOCAL (info
, h
)
2930 || (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
2931 && h
->root
.type
== bfd_link_hash_undefweak
))
2933 /* This case can occur if we saw a PLT32 reloc in an input
2934 file, but the symbol was never referred to by a dynamic
2935 object, or if all references were garbage collected. In
2936 such a case, we don't actually need to build a procedure
2937 linkage table, and we can just do a PC32 reloc instead. */
2938 h
->plt
.offset
= (bfd_vma
) -1;
2945 /* It's possible that we incorrectly decided a .plt reloc was needed
2946 * for an R_386_PC32/R_X86_64_PC32 reloc to a non-function sym in
2947 check_relocs. We can't decide accurately between function and
2948 non-function syms in check-relocs; Objects loaded later in
2949 the link may change h->type. So fix it now. */
2950 h
->plt
.offset
= (bfd_vma
) -1;
2952 /* If this is a weak symbol, and there is a real definition, the
2953 processor independent code will have arranged for us to see the
2954 real definition first, and we can just use the same value. */
2955 if (h
->is_weakalias
)
2957 struct elf_link_hash_entry
*def
= weakdef (h
);
2958 BFD_ASSERT (def
->root
.type
== bfd_link_hash_defined
);
2959 h
->root
.u
.def
.section
= def
->root
.u
.def
.section
;
2960 h
->root
.u
.def
.value
= def
->root
.u
.def
.value
;
2961 if (ELIMINATE_COPY_RELOCS
2962 || info
->nocopyreloc
2963 || SYMBOL_NO_COPYRELOC (info
, eh
))
2965 /* NB: needs_copy is always 0 for i386. */
2966 h
->non_got_ref
= def
->non_got_ref
;
2967 eh
->needs_copy
= def
->needs_copy
;
2972 /* This is a reference to a symbol defined by a dynamic object which
2973 is not a function. */
2975 /* If we are creating a shared library, we must presume that the
2976 only references to the symbol are via the global offset table.
2977 For such cases we need not do anything here; the relocations will
2978 be handled correctly by relocate_section. */
2979 if (!bfd_link_executable (info
))
2982 /* If there are no references to this symbol that do not use the
2983 GOT nor R_386_GOTOFF relocation, we don't need to generate a copy
2984 reloc. NB: gotoff_ref is always 0 for x86-64. */
2985 if (!h
->non_got_ref
&& !eh
->gotoff_ref
)
2988 /* If -z nocopyreloc was given, we won't generate them either. */
2989 if (info
->nocopyreloc
|| SYMBOL_NO_COPYRELOC (info
, eh
))
2995 htab
= elf_x86_hash_table (info
, bed
->target_id
);
2999 /* If there aren't any dynamic relocs in read-only sections nor
3000 R_386_GOTOFF relocation, then we can keep the dynamic relocs and
3001 avoid the copy reloc. This doesn't work on VxWorks, where we can
3002 not have dynamic relocations (other than copy and jump slot
3003 relocations) in an executable. */
3004 if (ELIMINATE_COPY_RELOCS
3005 && (bed
->target_id
== X86_64_ELF_DATA
3007 && htab
->elf
.target_os
!= is_vxworks
)))
3009 /* If we don't find any dynamic relocs in read-only sections,
3010 then we'll be keeping the dynamic relocs and avoiding the copy
3012 if (!_bfd_elf_readonly_dynrelocs (h
))
3019 /* We must allocate the symbol in our .dynbss section, which will
3020 become part of the .bss section of the executable. There will be
3021 an entry for this symbol in the .dynsym section. The dynamic
3022 object will contain position independent code, so all references
3023 from the dynamic object to this symbol will go through the global
3024 offset table. The dynamic linker will use the .dynsym entry to
3025 determine the address it must put in the global offset table, so
3026 both the dynamic object and the regular object will refer to the
3027 same memory location for the variable. */
3029 /* We must generate a R_386_COPY/R_X86_64_COPY reloc to tell the
3030 dynamic linker to copy the initial value out of the dynamic object
3031 and into the runtime process image. */
3032 if ((h
->root
.u
.def
.section
->flags
& SEC_READONLY
) != 0)
3034 s
= htab
->elf
.sdynrelro
;
3035 srel
= htab
->elf
.sreldynrelro
;
3039 s
= htab
->elf
.sdynbss
;
3040 srel
= htab
->elf
.srelbss
;
3042 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0 && h
->size
!= 0)
3044 srel
->size
+= htab
->sizeof_reloc
;
3048 return _bfd_elf_adjust_dynamic_copy (info
, h
, s
);
3052 _bfd_x86_elf_hide_symbol (struct bfd_link_info
*info
,
3053 struct elf_link_hash_entry
*h
,
3056 if (h
->root
.type
== bfd_link_hash_undefweak
3058 && bfd_link_pie (info
))
3060 /* When there is no dynamic interpreter in PIE, make the undefined
3061 weak symbol dynamic so that PC relative branch to the undefined
3062 weak symbol will land to address 0. */
3063 struct elf_x86_link_hash_entry
*eh
= elf_x86_hash_entry (h
);
3064 if (h
->plt
.refcount
> 0
3065 || eh
->plt_got
.refcount
> 0)
3069 _bfd_elf_link_hash_hide_symbol (info
, h
, force_local
);
3072 /* Return TRUE if a symbol is referenced locally. It is similar to
3073 SYMBOL_REFERENCES_LOCAL, but it also checks version script. It
3074 works in check_relocs. */
3077 _bfd_x86_elf_link_symbol_references_local (struct bfd_link_info
*info
,
3078 struct elf_link_hash_entry
*h
)
3080 struct elf_x86_link_hash_entry
*eh
= elf_x86_hash_entry (h
);
3081 struct elf_x86_link_hash_table
*htab
3082 = (struct elf_x86_link_hash_table
*) info
->hash
;
3084 if (eh
->local_ref
> 1)
3087 if (eh
->local_ref
== 1)
3090 /* Unversioned symbols defined in regular objects can be forced local
3091 by linker version script. A weak undefined symbol is forced local
3093 1. It has non-default visibility. Or
3094 2. When building executable, there is no dynamic linker. Or
3095 3. or "-z nodynamic-undefined-weak" is used.
3097 if (SYMBOL_REFERENCES_LOCAL (info
, h
)
3098 || (h
->root
.type
== bfd_link_hash_undefweak
3099 && (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
3100 || (bfd_link_executable (info
)
3101 && htab
->interp
== NULL
)
3102 || info
->dynamic_undefined_weak
== 0))
3103 || ((h
->def_regular
|| ELF_COMMON_DEF_P (h
))
3104 && info
->version_info
!= NULL
3105 && _bfd_elf_link_hide_sym_by_version (info
, h
)))
3115 /* Return the section that should be marked against GC for a given
3119 _bfd_x86_elf_gc_mark_hook (asection
*sec
,
3120 struct bfd_link_info
*info
,
3121 Elf_Internal_Rela
*rel
,
3122 struct elf_link_hash_entry
*h
,
3123 Elf_Internal_Sym
*sym
)
3125 /* Compiler should optimize this out. */
3126 if (((unsigned int) R_X86_64_GNU_VTINHERIT
3127 != (unsigned int) R_386_GNU_VTINHERIT
)
3128 || ((unsigned int) R_X86_64_GNU_VTENTRY
3129 != (unsigned int) R_386_GNU_VTENTRY
))
3133 switch (ELF32_R_TYPE (rel
->r_info
))
3135 case R_X86_64_GNU_VTINHERIT
:
3136 case R_X86_64_GNU_VTENTRY
:
3140 return _bfd_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
);
3144 elf_i386_get_plt_got_vma (struct elf_x86_plt
*plt_p ATTRIBUTE_UNUSED
,
3146 bfd_vma offset ATTRIBUTE_UNUSED
,
3149 return got_addr
+ off
;
3153 elf_x86_64_get_plt_got_vma (struct elf_x86_plt
*plt_p
,
3156 bfd_vma got_addr ATTRIBUTE_UNUSED
)
3158 return plt_p
->sec
->vma
+ offset
+ off
+ plt_p
->plt_got_insn_size
;
3162 elf_i386_valid_plt_reloc_p (unsigned int type
)
3164 return (type
== R_386_JUMP_SLOT
3165 || type
== R_386_GLOB_DAT
3166 || type
== R_386_IRELATIVE
);
3170 elf_x86_64_valid_plt_reloc_p (unsigned int type
)
3172 return (type
== R_X86_64_JUMP_SLOT
3173 || type
== R_X86_64_GLOB_DAT
3174 || type
== R_X86_64_IRELATIVE
);
3178 _bfd_x86_elf_get_synthetic_symtab (bfd
*abfd
,
3182 struct elf_x86_plt plts
[],
3186 long size
, i
, n
, len
;
3188 unsigned int plt_got_offset
, plt_entry_size
;
3190 bfd_byte
*plt_contents
;
3192 arelent
**dynrelbuf
, *p
;
3194 const struct elf_backend_data
*bed
;
3195 bfd_vma (*get_plt_got_vma
) (struct elf_x86_plt
*, bfd_vma
, bfd_vma
,
3197 bool (*valid_plt_reloc_p
) (unsigned int);
3203 dynrelbuf
= (arelent
**) bfd_malloc (relsize
);
3204 if (dynrelbuf
== NULL
)
3207 dynrelcount
= bfd_canonicalize_dynamic_reloc (abfd
, dynrelbuf
,
3209 if (dynrelcount
<= 0)
3212 /* Sort the relocs by address. */
3213 qsort (dynrelbuf
, dynrelcount
, sizeof (arelent
*),
3214 _bfd_x86_elf_compare_relocs
);
3216 size
= count
* sizeof (asymbol
);
3218 /* Allocate space for @plt suffixes. */
3220 for (i
= 0; i
< dynrelcount
; i
++)
3223 size
+= strlen ((*p
->sym_ptr_ptr
)->name
) + sizeof ("@plt");
3225 size
+= sizeof ("+0x") - 1 + 8 + 8 * ABI_64_P (abfd
);
3228 s
= *ret
= (asymbol
*) bfd_zmalloc (size
);
3232 bed
= get_elf_backend_data (abfd
);
3234 if (bed
->target_id
== X86_64_ELF_DATA
)
3236 get_plt_got_vma
= elf_x86_64_get_plt_got_vma
;
3237 valid_plt_reloc_p
= elf_x86_64_valid_plt_reloc_p
;
3241 get_plt_got_vma
= elf_i386_get_plt_got_vma
;
3242 valid_plt_reloc_p
= elf_i386_valid_plt_reloc_p
;
3245 /* Check .got.plt and then .got to get the _GLOBAL_OFFSET_TABLE_
3247 asection
*sec
= bfd_get_section_by_name (abfd
, ".got.plt");
3249 got_addr
= sec
->vma
;
3252 sec
= bfd_get_section_by_name (abfd
, ".got");
3254 got_addr
= sec
->vma
;
3257 if (got_addr
== (bfd_vma
) -1)
3262 /* Check for each PLT section. */
3263 names
= (char *) (s
+ count
);
3266 for (j
= 0; plts
[j
].name
!= NULL
; j
++)
3267 if ((plt_contents
= plts
[j
].contents
) != NULL
)
3272 struct elf_x86_plt
*plt_p
= &plts
[j
];
3274 plt_got_offset
= plt_p
->plt_got_offset
;
3275 plt_entry_size
= plt_p
->plt_entry_size
;
3279 if ((plt_p
->type
& plt_lazy
))
3281 /* Skip PLT0 in lazy PLT. */
3283 offset
= plt_entry_size
;
3291 /* Check each PLT entry against dynamic relocations. */
3292 for (; k
< plt_p
->count
; k
++)
3298 /* Get the GOT offset for i386 or the PC-relative offset
3299 for x86-64, a signed 32-bit integer. */
3300 off
= H_GET_32 (abfd
, (plt_contents
+ offset
3302 got_vma
= get_plt_got_vma (plt_p
, off
, offset
, got_addr
);
3304 /* Binary search. */
3308 while ((min
+ 1) < max
)
3312 mid
= (min
+ max
) / 2;
3314 if (got_vma
> r
->address
)
3316 else if (got_vma
< r
->address
)
3325 /* Skip unknown relocation. PR 17512: file: bc9d6cf5. */
3326 if (got_vma
== p
->address
3328 && valid_plt_reloc_p (p
->howto
->type
))
3330 *s
= **p
->sym_ptr_ptr
;
3331 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL
3332 set. Since we are defining a symbol, ensure one
3334 if ((s
->flags
& BSF_LOCAL
) == 0)
3335 s
->flags
|= BSF_GLOBAL
;
3336 s
->flags
|= BSF_SYNTHETIC
;
3337 /* This is no longer a section symbol. */
3338 s
->flags
&= ~BSF_SECTION_SYM
;
3340 s
->the_bfd
= plt
->owner
;
3344 len
= strlen ((*p
->sym_ptr_ptr
)->name
);
3345 memcpy (names
, (*p
->sym_ptr_ptr
)->name
, len
);
3351 memcpy (names
, "+0x", sizeof ("+0x") - 1);
3352 names
+= sizeof ("+0x") - 1;
3353 bfd_sprintf_vma (abfd
, buf
, p
->addend
);
3354 for (a
= buf
; *a
== '0'; ++a
)
3357 memcpy (names
, a
, size
);
3360 memcpy (names
, "@plt", sizeof ("@plt"));
3361 names
+= sizeof ("@plt");
3364 /* There should be only one entry in PLT for a given
3365 symbol. Set howto to NULL after processing a PLT
3366 entry to guard against corrupted PLT. */
3369 offset
+= plt_entry_size
;
3373 /* PLT entries with R_386_TLS_DESC relocations are skipped. */
3382 for (j
= 0; plts
[j
].name
!= NULL
; j
++)
3383 free (plts
[j
].contents
);
3390 /* Parse x86 GNU properties. */
3392 enum elf_property_kind
3393 _bfd_x86_elf_parse_gnu_properties (bfd
*abfd
, unsigned int type
,
3394 bfd_byte
*ptr
, unsigned int datasz
)
3398 if (type
== GNU_PROPERTY_X86_COMPAT_ISA_1_USED
3399 || type
== GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
3400 || (type
>= GNU_PROPERTY_X86_UINT32_AND_LO
3401 && type
<= GNU_PROPERTY_X86_UINT32_AND_HI
)
3402 || (type
>= GNU_PROPERTY_X86_UINT32_OR_LO
3403 && type
<= GNU_PROPERTY_X86_UINT32_OR_HI
)
3404 || (type
>= GNU_PROPERTY_X86_UINT32_OR_AND_LO
3405 && type
<= GNU_PROPERTY_X86_UINT32_OR_AND_HI
))
3410 (_("error: %pB: <corrupt x86 property (0x%x) size: 0x%x>"),
3411 abfd
, type
, datasz
);
3412 return property_corrupt
;
3414 prop
= _bfd_elf_get_property (abfd
, type
, datasz
);
3415 prop
->u
.number
|= bfd_h_get_32 (abfd
, ptr
);
3416 prop
->pr_kind
= property_number
;
3417 return property_number
;
3420 return property_ignored
;
3423 /* Merge x86 GNU property BPROP with APROP. If APROP isn't NULL,
3424 return TRUE if APROP is updated. Otherwise, return TRUE if BPROP
3425 should be merged with ABFD. */
3428 _bfd_x86_elf_merge_gnu_properties (struct bfd_link_info
*info
,
3429 bfd
*abfd ATTRIBUTE_UNUSED
,
3430 bfd
*bbfd ATTRIBUTE_UNUSED
,
3431 elf_property
*aprop
,
3432 elf_property
*bprop
)
3434 unsigned int number
, features
;
3435 bool updated
= false;
3436 const struct elf_backend_data
*bed
;
3437 struct elf_x86_link_hash_table
*htab
;
3438 unsigned int pr_type
= aprop
!= NULL
? aprop
->pr_type
: bprop
->pr_type
;
3440 if (pr_type
== GNU_PROPERTY_X86_COMPAT_ISA_1_USED
3441 || (pr_type
>= GNU_PROPERTY_X86_UINT32_OR_AND_LO
3442 && pr_type
<= GNU_PROPERTY_X86_UINT32_OR_AND_HI
))
3444 if (aprop
== NULL
|| bprop
== NULL
)
3446 /* Only one of APROP and BPROP can be NULL. */
3449 /* Remove this property since the other input file doesn't
3451 aprop
->pr_kind
= property_remove
;
3457 number
= aprop
->u
.number
;
3458 aprop
->u
.number
= number
| bprop
->u
.number
;
3459 updated
= number
!= (unsigned int) aprop
->u
.number
;
3463 else if (pr_type
== GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
3464 || (pr_type
>= GNU_PROPERTY_X86_UINT32_OR_LO
3465 && pr_type
<= GNU_PROPERTY_X86_UINT32_OR_HI
))
3468 if (pr_type
== GNU_PROPERTY_X86_ISA_1_NEEDED
)
3470 bed
= get_elf_backend_data (info
->output_bfd
);
3471 htab
= elf_x86_hash_table (info
, bed
->target_id
);
3472 switch (htab
->params
->isa_level
)
3477 features
= GNU_PROPERTY_X86_ISA_1_V2
;
3480 features
= GNU_PROPERTY_X86_ISA_1_V3
;
3483 features
= GNU_PROPERTY_X86_ISA_1_V4
;
3489 if (aprop
!= NULL
&& bprop
!= NULL
)
3491 number
= aprop
->u
.number
;
3492 aprop
->u
.number
= number
| bprop
->u
.number
| features
;
3493 /* Remove the property if all bits are empty. */
3494 if (aprop
->u
.number
== 0)
3496 aprop
->pr_kind
= property_remove
;
3500 updated
= number
!= (unsigned int) aprop
->u
.number
;
3504 /* Only one of APROP and BPROP can be NULL. */
3507 aprop
->u
.number
|= features
;
3508 if (aprop
->u
.number
== 0)
3510 /* Remove APROP if all bits are empty. */
3511 aprop
->pr_kind
= property_remove
;
3517 /* Return TRUE if APROP is NULL and all bits of BPROP
3518 aren't empty to indicate that BPROP should be added
3520 bprop
->u
.number
|= features
;
3521 updated
= bprop
->u
.number
!= 0;
3526 else if (pr_type
>= GNU_PROPERTY_X86_UINT32_AND_LO
3527 && pr_type
<= GNU_PROPERTY_X86_UINT32_AND_HI
)
3529 /* Only one of APROP and BPROP can be NULL:
3530 1. APROP & BPROP when both APROP and BPROP aren't NULL.
3531 2. If APROP is NULL, remove x86 feature.
3532 3. Otherwise, do nothing.
3534 bed
= get_elf_backend_data (info
->output_bfd
);
3535 htab
= elf_x86_hash_table (info
, bed
->target_id
);
3538 if (aprop
!= NULL
&& bprop
!= NULL
)
3540 number
= aprop
->u
.number
;
3541 aprop
->u
.number
= number
& bprop
->u
.number
;
3542 if (pr_type
== GNU_PROPERTY_X86_FEATURE_1_AND
)
3545 if (htab
->params
->ibt
)
3546 features
= GNU_PROPERTY_X86_FEATURE_1_IBT
;
3547 if (htab
->params
->shstk
)
3548 features
|= GNU_PROPERTY_X86_FEATURE_1_SHSTK
;
3549 if (htab
->params
->lam_u48
)
3550 features
|= (GNU_PROPERTY_X86_FEATURE_1_LAM_U48
3551 | GNU_PROPERTY_X86_FEATURE_1_LAM_U57
);
3552 else if (htab
->params
->lam_u57
)
3553 features
|= GNU_PROPERTY_X86_FEATURE_1_LAM_U57
;
3554 /* Add GNU_PROPERTY_X86_FEATURE_1_IBT,
3555 GNU_PROPERTY_X86_FEATURE_1_SHSTK,
3556 GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and
3557 GNU_PROPERTY_X86_FEATURE_1_LAM_U57. */
3558 aprop
->u
.number
|= features
;
3560 updated
= number
!= (unsigned int) aprop
->u
.number
;
3561 /* Remove the property if all feature bits are cleared. */
3562 if (aprop
->u
.number
== 0)
3563 aprop
->pr_kind
= property_remove
;
3567 /* There should be no AND properties since some input doesn't
3568 have them. Set IBT and SHSTK properties for -z ibt and -z
3571 if (pr_type
== GNU_PROPERTY_X86_FEATURE_1_AND
)
3573 if (htab
->params
->ibt
)
3574 features
= GNU_PROPERTY_X86_FEATURE_1_IBT
;
3575 if (htab
->params
->shstk
)
3576 features
|= GNU_PROPERTY_X86_FEATURE_1_SHSTK
;
3577 if (htab
->params
->lam_u48
)
3578 features
|= (GNU_PROPERTY_X86_FEATURE_1_LAM_U48
3579 | GNU_PROPERTY_X86_FEATURE_1_LAM_U57
);
3580 else if (htab
->params
->lam_u57
)
3581 features
|= GNU_PROPERTY_X86_FEATURE_1_LAM_U57
;
3587 updated
= features
!= (unsigned int) aprop
->u
.number
;
3588 aprop
->u
.number
= features
;
3593 bprop
->u
.number
= features
;
3596 else if (aprop
!= NULL
)
3598 aprop
->pr_kind
= property_remove
;
3606 /* Never should happen. */
3613 /* Set up x86 GNU properties. Return the first relocatable ELF input
3614 with GNU properties if found. Otherwise, return NULL. */
3617 _bfd_x86_elf_link_setup_gnu_properties
3618 (struct bfd_link_info
*info
, struct elf_x86_init_table
*init_table
)
3622 asection
*sec
, *pltsec
;
3625 unsigned int plt_alignment
, features
, isa_level
;
3626 struct elf_x86_link_hash_table
*htab
;
3630 const struct elf_backend_data
*bed
;
3631 unsigned int class_align
= ABI_64_P (info
->output_bfd
) ? 3 : 2;
3632 unsigned int got_align
;
3634 /* Find a normal input file with GNU property note. */
3635 for (pbfd
= info
->input_bfds
;
3637 pbfd
= pbfd
->link
.next
)
3638 if (bfd_get_flavour (pbfd
) == bfd_target_elf_flavour
3639 && bfd_count_sections (pbfd
) != 0)
3643 if (elf_properties (pbfd
) != NULL
)
3647 bed
= get_elf_backend_data (info
->output_bfd
);
3649 htab
= elf_x86_hash_table (info
, bed
->target_id
);
3654 if (htab
->params
->ibt
)
3656 features
= GNU_PROPERTY_X86_FEATURE_1_IBT
;
3657 htab
->params
->cet_report
&= ~prop_report_ibt
;
3659 if (htab
->params
->shstk
)
3661 features
|= GNU_PROPERTY_X86_FEATURE_1_SHSTK
;
3662 htab
->params
->cet_report
&= ~prop_report_shstk
;
3664 if (!(htab
->params
->cet_report
& (prop_report_ibt
| prop_report_shstk
)))
3665 htab
->params
->cet_report
= prop_report_none
;
3666 if (htab
->params
->lam_u48
)
3668 features
|= (GNU_PROPERTY_X86_FEATURE_1_LAM_U48
3669 | GNU_PROPERTY_X86_FEATURE_1_LAM_U57
);
3670 htab
->params
->lam_u48_report
= prop_report_none
;
3671 htab
->params
->lam_u57_report
= prop_report_none
;
3673 else if (htab
->params
->lam_u57
)
3675 features
|= GNU_PROPERTY_X86_FEATURE_1_LAM_U57
;
3676 htab
->params
->lam_u57_report
= prop_report_none
;
3679 switch (htab
->params
->isa_level
)
3685 isa_level
= GNU_PROPERTY_X86_ISA_1_BASELINE
;
3688 isa_level
= GNU_PROPERTY_X86_ISA_1_V2
;
3691 isa_level
= GNU_PROPERTY_X86_ISA_1_V3
;
3694 isa_level
= GNU_PROPERTY_X86_ISA_1_V4
;
3705 /* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT,
3706 GNU_PROPERTY_X86_FEATURE_1_SHSTK,
3707 GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and
3708 GNU_PROPERTY_X86_FEATURE_1_LAM_U57. */
3709 prop
= _bfd_elf_get_property (ebfd
,
3710 GNU_PROPERTY_X86_FEATURE_1_AND
,
3712 prop
->u
.number
|= features
;
3713 prop
->pr_kind
= property_number
;
3718 /* If ISA level is set, add GNU_PROPERTY_X86_ISA_1_NEEDED. */
3719 prop
= _bfd_elf_get_property (ebfd
,
3720 GNU_PROPERTY_X86_ISA_1_NEEDED
,
3722 prop
->u
.number
|= isa_level
;
3723 prop
->pr_kind
= property_number
;
3726 /* Create the GNU property note section if needed. */
3727 if (prop
!= NULL
&& pbfd
== NULL
)
3729 sec
= bfd_make_section_with_flags (ebfd
,
3730 NOTE_GNU_PROPERTY_SECTION_NAME
,
3738 info
->callbacks
->einfo (_("%F%P: failed to create GNU property section\n"));
3740 if (!bfd_set_section_alignment (sec
, class_align
))
3743 info
->callbacks
->einfo (_("%F%pA: failed to align section\n"),
3747 elf_section_type (sec
) = SHT_NOTE
;
3751 if (htab
->params
->cet_report
3752 || htab
->params
->lam_u48_report
3753 || htab
->params
->lam_u57_report
)
3755 /* Report missing IBT, SHSTK and LAM properties. */
3757 const char *warning_msg
= _("%P: %pB: warning: missing %s\n");
3758 const char *error_msg
= _("%X%P: %pB: error: missing %s\n");
3759 const char *cet_msg
= NULL
;
3760 const char *lam_u48_msg
= NULL
;
3761 const char *lam_u57_msg
= NULL
;
3762 const char *missing
;
3763 elf_property_list
*p
;
3764 bool missing_ibt
, missing_shstk
;
3765 bool missing_lam_u48
, missing_lam_u57
;
3767 = (htab
->params
->cet_report
3768 && (htab
->params
->cet_report
& prop_report_ibt
));
3770 = (htab
->params
->cet_report
3771 && (htab
->params
->cet_report
& prop_report_shstk
));
3773 if (htab
->params
->cet_report
)
3775 if ((htab
->params
->cet_report
& prop_report_warning
))
3776 cet_msg
= warning_msg
;
3778 cet_msg
= error_msg
;
3780 if (htab
->params
->lam_u48_report
)
3782 if ((htab
->params
->lam_u48_report
& prop_report_warning
))
3783 lam_u48_msg
= warning_msg
;
3785 lam_u48_msg
= error_msg
;
3787 if (htab
->params
->lam_u57_report
)
3789 if ((htab
->params
->lam_u57_report
& prop_report_warning
))
3790 lam_u57_msg
= warning_msg
;
3792 lam_u57_msg
= error_msg
;
3795 for (abfd
= info
->input_bfds
; abfd
!= NULL
; abfd
= abfd
->link
.next
)
3796 if (!(abfd
->flags
& (DYNAMIC
| BFD_PLUGIN
| BFD_LINKER_CREATED
))
3797 && bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
3799 for (p
= elf_properties (abfd
); p
; p
= p
->next
)
3800 if (p
->property
.pr_type
== GNU_PROPERTY_X86_FEATURE_1_AND
)
3803 missing_ibt
= check_ibt
;
3804 missing_shstk
= check_shstk
;
3805 missing_lam_u48
= !!lam_u48_msg
;
3806 missing_lam_u57
= !!lam_u57_msg
;
3809 missing_ibt
&= !(p
->property
.u
.number
3810 & GNU_PROPERTY_X86_FEATURE_1_IBT
);
3811 missing_shstk
&= !(p
->property
.u
.number
3812 & GNU_PROPERTY_X86_FEATURE_1_SHSTK
);
3813 missing_lam_u48
&= !(p
->property
.u
.number
3814 & GNU_PROPERTY_X86_FEATURE_1_LAM_U48
);
3815 missing_lam_u57
&= !(p
->property
.u
.number
3816 & GNU_PROPERTY_X86_FEATURE_1_LAM_U57
);
3818 if (missing_ibt
|| missing_shstk
)
3820 if (missing_ibt
&& missing_shstk
)
3821 missing
= _("IBT and SHSTK properties");
3822 else if (missing_ibt
)
3823 missing
= _("IBT property");
3825 missing
= _("SHSTK property");
3826 info
->callbacks
->einfo (cet_msg
, abfd
, missing
);
3828 if (missing_lam_u48
)
3830 missing
= _("LAM_U48 property");
3831 info
->callbacks
->einfo (lam_u48_msg
, abfd
, missing
);
3833 if (missing_lam_u57
)
3835 missing
= _("LAM_U57 property");
3836 info
->callbacks
->einfo (lam_u57_msg
, abfd
, missing
);
3841 pbfd
= _bfd_elf_link_setup_gnu_properties (info
);
3843 htab
->r_info
= init_table
->r_info
;
3844 htab
->r_sym
= init_table
->r_sym
;
3846 if (bfd_link_relocatable (info
))
3849 htab
->plt0_pad_byte
= init_table
->plt0_pad_byte
;
3851 use_ibt_plt
= htab
->params
->ibtplt
|| htab
->params
->ibt
;
3852 if (!use_ibt_plt
&& pbfd
!= NULL
)
3854 /* Check if GNU_PROPERTY_X86_FEATURE_1_IBT is on. */
3855 elf_property_list
*p
;
3857 /* The property list is sorted in order of type. */
3858 for (p
= elf_properties (pbfd
); p
; p
= p
->next
)
3860 if (GNU_PROPERTY_X86_FEATURE_1_AND
== p
->property
.pr_type
)
3862 use_ibt_plt
= !!(p
->property
.u
.number
3863 & GNU_PROPERTY_X86_FEATURE_1_IBT
);
3866 else if (GNU_PROPERTY_X86_FEATURE_1_AND
< p
->property
.pr_type
)
3871 dynobj
= htab
->elf
.dynobj
;
3873 /* Set htab->elf.dynobj here so that there is no need to check and
3874 set it in check_relocs. */
3879 htab
->elf
.dynobj
= pbfd
;
3886 /* Find a normal input file to hold linker created
3888 for (abfd
= info
->input_bfds
;
3890 abfd
= abfd
->link
.next
)
3891 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
3893 & (DYNAMIC
| BFD_LINKER_CREATED
| BFD_PLUGIN
)) == 0
3894 && bed
->relocs_compatible (abfd
->xvec
,
3895 info
->output_bfd
->xvec
))
3897 htab
->elf
.dynobj
= abfd
;
3904 /* Return if there are no normal input files. */
3908 /* Even when lazy binding is disabled by "-z now", the PLT0 entry may
3909 still be used with LD_AUDIT or LD_PROFILE if PLT entry is used for
3910 canonical function address. */
3911 htab
->plt
.has_plt0
= 1;
3912 normal_target
= htab
->elf
.target_os
== is_normal
;
3918 htab
->lazy_plt
= init_table
->lazy_ibt_plt
;
3919 htab
->non_lazy_plt
= init_table
->non_lazy_ibt_plt
;
3923 htab
->lazy_plt
= init_table
->lazy_plt
;
3924 htab
->non_lazy_plt
= init_table
->non_lazy_plt
;
3929 htab
->lazy_plt
= init_table
->lazy_plt
;
3930 htab
->non_lazy_plt
= NULL
;
3933 pltsec
= htab
->elf
.splt
;
3935 /* If the non-lazy PLT is available, use it for all PLT entries if
3936 there are no PLT0 or no .plt section. */
3937 if (htab
->non_lazy_plt
!= NULL
3938 && (!htab
->plt
.has_plt0
|| pltsec
== NULL
))
3941 if (bfd_link_pic (info
))
3942 htab
->plt
.plt_entry
= htab
->non_lazy_plt
->pic_plt_entry
;
3944 htab
->plt
.plt_entry
= htab
->non_lazy_plt
->plt_entry
;
3945 htab
->plt
.plt_entry_size
= htab
->non_lazy_plt
->plt_entry_size
;
3946 htab
->plt
.plt_got_offset
= htab
->non_lazy_plt
->plt_got_offset
;
3947 htab
->plt
.plt_got_insn_size
3948 = htab
->non_lazy_plt
->plt_got_insn_size
;
3949 htab
->plt
.eh_frame_plt_size
3950 = htab
->non_lazy_plt
->eh_frame_plt_size
;
3951 htab
->plt
.eh_frame_plt
= htab
->non_lazy_plt
->eh_frame_plt
;
3956 if (bfd_link_pic (info
))
3958 htab
->plt
.plt0_entry
= htab
->lazy_plt
->pic_plt0_entry
;
3959 htab
->plt
.plt_entry
= htab
->lazy_plt
->pic_plt_entry
;
3963 htab
->plt
.plt0_entry
= htab
->lazy_plt
->plt0_entry
;
3964 htab
->plt
.plt_entry
= htab
->lazy_plt
->plt_entry
;
3966 htab
->plt
.plt_entry_size
= htab
->lazy_plt
->plt_entry_size
;
3967 htab
->plt
.plt_got_offset
= htab
->lazy_plt
->plt_got_offset
;
3968 htab
->plt
.plt_got_insn_size
3969 = htab
->lazy_plt
->plt_got_insn_size
;
3970 htab
->plt
.eh_frame_plt_size
3971 = htab
->lazy_plt
->eh_frame_plt_size
;
3972 htab
->plt
.eh_frame_plt
= htab
->lazy_plt
->eh_frame_plt
;
3975 if (htab
->elf
.target_os
== is_vxworks
3976 && !elf_vxworks_create_dynamic_sections (dynobj
, info
,
3979 info
->callbacks
->einfo (_("%F%P: failed to create VxWorks dynamic sections\n"));
3983 /* Since create_dynamic_sections isn't always called, but GOT
3984 relocations need GOT relocations, create them here so that we
3985 don't need to do it in check_relocs. */
3986 if (htab
->elf
.sgot
== NULL
3987 && !_bfd_elf_create_got_section (dynobj
, info
))
3988 info
->callbacks
->einfo (_("%F%P: failed to create GOT sections\n"));
3990 got_align
= (bed
->target_id
== X86_64_ELF_DATA
) ? 3 : 2;
3992 /* Align .got and .got.plt sections to their entry size. Do it here
3993 instead of in create_dynamic_sections so that they are always
3994 properly aligned even if create_dynamic_sections isn't called. */
3995 sec
= htab
->elf
.sgot
;
3996 if (!bfd_set_section_alignment (sec
, got_align
))
3997 goto error_alignment
;
3999 sec
= htab
->elf
.sgotplt
;
4000 if (!bfd_set_section_alignment (sec
, got_align
))
4001 goto error_alignment
;
4003 /* Create the ifunc sections here so that check_relocs can be
4005 if (!_bfd_elf_create_ifunc_sections (dynobj
, info
))
4006 info
->callbacks
->einfo (_("%F%P: failed to create ifunc sections\n"));
4008 plt_alignment
= bfd_log2 (htab
->plt
.plt_entry_size
);
4012 /* Whe creating executable, set the contents of the .interp
4013 section to the interpreter. */
4014 if (bfd_link_executable (info
) && !info
->nointerp
)
4016 asection
*s
= bfd_get_linker_section (dynobj
, ".interp");
4019 s
->size
= htab
->dynamic_interpreter_size
;
4020 s
->contents
= (unsigned char *) htab
->dynamic_interpreter
;
4026 flagword pltflags
= (bed
->dynamic_sec_flags
4031 unsigned int non_lazy_plt_alignment
4032 = bfd_log2 (htab
->non_lazy_plt
->plt_entry_size
);
4035 if (!bfd_set_section_alignment (sec
, plt_alignment
))
4036 goto error_alignment
;
4038 /* Create the GOT procedure linkage table. */
4039 sec
= bfd_make_section_anyway_with_flags (dynobj
,
4043 info
->callbacks
->einfo (_("%F%P: failed to create GOT PLT section\n"));
4045 if (!bfd_set_section_alignment (sec
, non_lazy_plt_alignment
))
4046 goto error_alignment
;
4048 htab
->plt_got
= sec
;
4056 /* Create the second PLT for Intel IBT support. IBT
4057 PLT is needed only for lazy binding. */
4058 sec
= bfd_make_section_anyway_with_flags (dynobj
,
4062 info
->callbacks
->einfo (_("%F%P: failed to create IBT-enabled PLT section\n"));
4064 if (!bfd_set_section_alignment (sec
, plt_alignment
))
4065 goto error_alignment
;
4067 else if (htab
->params
->bndplt
&& ABI_64_P (dynobj
))
4069 /* Create the second PLT for Intel MPX support. MPX
4070 PLT is supported only in 64-bit mode and is needed
4071 only for lazy binding. */
4072 sec
= bfd_make_section_anyway_with_flags (dynobj
,
4076 info
->callbacks
->einfo (_("%F%P: failed to create BND PLT section\n"));
4078 if (!bfd_set_section_alignment (sec
, non_lazy_plt_alignment
))
4079 goto error_alignment
;
4082 htab
->plt_second
= sec
;
4086 if (!info
->no_ld_generated_unwind_info
)
4088 flagword flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
4089 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
4090 | SEC_LINKER_CREATED
);
4092 sec
= bfd_make_section_anyway_with_flags (dynobj
,
4096 info
->callbacks
->einfo (_("%F%P: failed to create PLT .eh_frame section\n"));
4098 if (!bfd_set_section_alignment (sec
, class_align
))
4099 goto error_alignment
;
4101 htab
->plt_eh_frame
= sec
;
4103 if (htab
->plt_got
!= NULL
)
4105 sec
= bfd_make_section_anyway_with_flags (dynobj
,
4109 info
->callbacks
->einfo (_("%F%P: failed to create GOT PLT .eh_frame section\n"));
4111 if (!bfd_set_section_alignment (sec
, class_align
))
4112 goto error_alignment
;
4114 htab
->plt_got_eh_frame
= sec
;
4117 if (htab
->plt_second
!= NULL
)
4119 sec
= bfd_make_section_anyway_with_flags (dynobj
,
4123 info
->callbacks
->einfo (_("%F%P: failed to create the second PLT .eh_frame section\n"));
4125 if (!bfd_set_section_alignment (sec
, class_align
))
4126 goto error_alignment
;
4128 htab
->plt_second_eh_frame
= sec
;
4133 /* The .iplt section is used for IFUNC symbols in static
4135 sec
= htab
->elf
.iplt
;
4138 /* NB: Delay setting its alignment until we know it is non-empty.
4139 Otherwise an empty iplt section may change vma and lma of the
4140 following sections, which triggers moving dot of the following
4141 section backwards, resulting in a warning and section lma not
4142 being set properly. It later leads to a "File truncated"
4144 if (!bfd_set_section_alignment (sec
, 0))
4145 goto error_alignment
;
4147 htab
->plt
.iplt_alignment
= (normal_target
4149 : bed
->plt_alignment
);
4152 if (bfd_link_executable (info
)
4154 && !htab
->params
->has_dynamic_linker
4155 && htab
->params
->static_before_all_inputs
)
4157 /* Report error for dynamic input objects if -static is passed at
4158 command-line before all input files without --dynamic-linker
4159 unless --no-dynamic-linker is used. */
4162 for (abfd
= info
->input_bfds
; abfd
!= NULL
; abfd
= abfd
->link
.next
)
4163 if ((abfd
->flags
& DYNAMIC
))
4164 info
->callbacks
->einfo
4165 (_("%X%P: attempted static link of dynamic object `%pB'\n"),
4172 /* Fix up x86 GNU properties. */
4175 _bfd_x86_elf_link_fixup_gnu_properties
4176 (struct bfd_link_info
*info
, elf_property_list
**listp
)
4178 elf_property_list
*p
;
4180 for (p
= *listp
; p
; p
= p
->next
)
4182 unsigned int type
= p
->property
.pr_type
;
4183 if (type
== GNU_PROPERTY_X86_COMPAT_ISA_1_USED
4184 || type
== GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
4185 || (type
>= GNU_PROPERTY_X86_UINT32_AND_LO
4186 && type
<= GNU_PROPERTY_X86_UINT32_AND_HI
)
4187 || (type
>= GNU_PROPERTY_X86_UINT32_OR_LO
4188 && type
<= GNU_PROPERTY_X86_UINT32_OR_HI
)
4189 || (type
>= GNU_PROPERTY_X86_UINT32_OR_AND_LO
4190 && type
<= GNU_PROPERTY_X86_UINT32_OR_AND_HI
))
4192 if (p
->property
.u
.number
== 0
4193 && (type
== GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
4194 || (type
>= GNU_PROPERTY_X86_UINT32_AND_LO
4195 && type
<= GNU_PROPERTY_X86_UINT32_AND_HI
)
4196 || (type
>= GNU_PROPERTY_X86_UINT32_OR_LO
4197 && type
<= GNU_PROPERTY_X86_UINT32_OR_HI
)))
4199 /* Remove empty property. */
4204 /* Keep LAM features only for 64-bit output. */
4205 if (type
== GNU_PROPERTY_X86_FEATURE_1_AND
4206 && !ABI_64_P (info
->output_bfd
))
4207 p
->property
.u
.number
&= ~(GNU_PROPERTY_X86_FEATURE_1_LAM_U48
4208 | GNU_PROPERTY_X86_FEATURE_1_LAM_U57
);
4212 else if (type
> GNU_PROPERTY_HIPROC
)
4214 /* The property list is sorted in order of type. */
4221 _bfd_elf_linker_x86_set_options (struct bfd_link_info
* info
,
4222 struct elf_linker_x86_params
*params
)
4224 const struct elf_backend_data
*bed
4225 = get_elf_backend_data (info
->output_bfd
);
4226 struct elf_x86_link_hash_table
*htab
4227 = elf_x86_hash_table (info
, bed
->target_id
);
4229 htab
->params
= params
;