1 /* x86 specific support for ELF
2 Copyright (C) 2017-2018 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 #include "elf/x86-64.h"
27 /* The name of the dynamic interpreter. This is put in the .interp
30 #define ELF32_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
31 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
32 #define ELFX32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
35 _bfd_x86_elf_mkobject (bfd *abfd)
37 return bfd_elf_allocate_object (abfd,
38 sizeof (struct elf_x86_obj_tdata),
39 get_elf_backend_data (abfd)->target_id);
42 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
43 executables. Rather than setting it to the beginning of the TLS
44 section, we have to set it to the end. This function may be called
45 multiple times, it is idempotent. */
48 _bfd_x86_elf_set_tls_module_base (struct bfd_link_info *info)
50 struct elf_x86_link_hash_table *htab;
51 struct bfd_link_hash_entry *base;
52 const struct elf_backend_data *bed;
54 if (!bfd_link_executable (info))
57 bed = get_elf_backend_data (info->output_bfd);
58 htab = elf_x86_hash_table (info, bed->target_id);
62 base = htab->tls_module_base;
66 base->u.def.value = htab->elf.tls_size;
69 /* Return the base VMA address which should be subtracted from real addresses
70 when resolving @dtpoff relocation.
71 This is PT_TLS segment p_vaddr. */
74 _bfd_x86_elf_dtpoff_base (struct bfd_link_info *info)
76 /* If tls_sec is NULL, we should have signalled an error already. */
77 if (elf_hash_table (info)->tls_sec == NULL)
79 return elf_hash_table (info)->tls_sec->vma;
82 /* Allocate space in .plt, .got and associated reloc sections for
86 elf_x86_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
88 struct bfd_link_info *info;
89 struct elf_x86_link_hash_table *htab;
90 struct elf_x86_link_hash_entry *eh;
91 struct elf_dyn_relocs *p;
92 unsigned int plt_entry_size;
93 bfd_boolean resolved_to_zero;
94 const struct elf_backend_data *bed;
96 if (h->root.type == bfd_link_hash_indirect)
99 eh = (struct elf_x86_link_hash_entry *) h;
101 info = (struct bfd_link_info *) inf;
102 bed = get_elf_backend_data (info->output_bfd);
103 htab = elf_x86_hash_table (info, bed->target_id);
107 plt_entry_size = htab->plt.plt_entry_size;
109 resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
111 /* We can't use the GOT PLT if pointer equality is needed since
112 finish_dynamic_symbol won't clear symbol value and the dynamic
113 linker won't update the GOT slot. We will get into an infinite
115 if (htab->plt_got != NULL
116 && h->type != STT_GNU_IFUNC
117 && !h->pointer_equality_needed
118 && h->plt.refcount > 0
119 && h->got.refcount > 0)
121 /* Don't use the regular PLT if there are both GOT and GOTPLT
123 h->plt.offset = (bfd_vma) -1;
125 /* Use the GOT PLT. */
126 eh->plt_got.refcount = 1;
129 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
130 here if it is defined and referenced in a non-shared object. */
131 if (h->type == STT_GNU_IFUNC
134 if (_bfd_elf_allocate_ifunc_dyn_relocs (info, h, &eh->dyn_relocs,
135 &htab->readonly_dynrelocs_against_ifunc,
139 htab->got_entry_size,
142 asection *s = htab->plt_second;
143 if (h->plt.offset != (bfd_vma) -1 && s != NULL)
145 /* Use the second PLT section if it is created. */
146 eh->plt_second.offset = s->size;
148 /* Make room for this entry in the second PLT section. */
149 s->size += htab->non_lazy_plt->plt_entry_size;
157 /* Don't create the PLT entry if there are only function pointer
158 relocations which can be resolved at run-time. */
159 else if (htab->elf.dynamic_sections_created
160 && (h->plt.refcount > 0
161 || eh->plt_got.refcount > 0))
163 bfd_boolean use_plt_got = eh->plt_got.refcount > 0;
165 /* Make sure this symbol is output as a dynamic symbol.
166 Undefined weak syms won't yet be marked as dynamic. */
170 && h->root.type == bfd_link_hash_undefweak)
172 if (! bfd_elf_link_record_dynamic_symbol (info, h))
176 if (bfd_link_pic (info)
177 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
179 asection *s = htab->elf.splt;
180 asection *second_s = htab->plt_second;
181 asection *got_s = htab->plt_got;
183 /* If this is the first .plt entry, make room for the special
184 first entry. The .plt section is used by prelink to undo
185 prelinking for dynamic relocations. */
187 s->size = htab->plt.has_plt0 * plt_entry_size;
190 eh->plt_got.offset = got_s->size;
193 h->plt.offset = s->size;
195 eh->plt_second.offset = second_s->size;
198 /* If this symbol is not defined in a regular file, and we are
199 not generating a shared library, then set the symbol to this
200 location in the .plt. This is required to make function
201 pointers compare as equal between the normal executable and
202 the shared library. */
203 if (! bfd_link_pic (info)
208 /* We need to make a call to the entry of the GOT PLT
209 instead of regular PLT entry. */
210 h->root.u.def.section = got_s;
211 h->root.u.def.value = eh->plt_got.offset;
217 /* We need to make a call to the entry of the
218 second PLT instead of regular PLT entry. */
219 h->root.u.def.section = second_s;
220 h->root.u.def.value = eh->plt_second.offset;
224 h->root.u.def.section = s;
225 h->root.u.def.value = h->plt.offset;
230 /* Make room for this entry. */
232 got_s->size += htab->non_lazy_plt->plt_entry_size;
235 s->size += plt_entry_size;
237 second_s->size += htab->non_lazy_plt->plt_entry_size;
239 /* We also need to make an entry in the .got.plt section,
240 which will be placed in the .got section by the linker
242 htab->elf.sgotplt->size += htab->got_entry_size;
244 /* There should be no PLT relocation against resolved
245 undefined weak symbol in executable. */
246 if (!resolved_to_zero)
248 /* We also need to make an entry in the .rel.plt
250 htab->elf.srelplt->size += htab->sizeof_reloc;
251 htab->elf.srelplt->reloc_count++;
255 if (htab->target_os == is_vxworks && !bfd_link_pic (info))
257 /* VxWorks has a second set of relocations for each PLT entry
258 in executables. They go in a separate relocation section,
259 which is processed by the kernel loader. */
261 /* There are two relocations for the initial PLT entry: an
262 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
263 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
265 asection *srelplt2 = htab->srelplt2;
266 if (h->plt.offset == plt_entry_size)
267 srelplt2->size += (htab->sizeof_reloc * 2);
269 /* There are two extra relocations for each subsequent PLT entry:
270 an R_386_32 relocation for the GOT entry, and an R_386_32
271 relocation for the PLT entry. */
273 srelplt2->size += (htab->sizeof_reloc * 2);
278 eh->plt_got.offset = (bfd_vma) -1;
279 h->plt.offset = (bfd_vma) -1;
285 eh->plt_got.offset = (bfd_vma) -1;
286 h->plt.offset = (bfd_vma) -1;
290 eh->tlsdesc_got = (bfd_vma) -1;
292 /* For i386, if R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the
293 binary, make it a R_386_TLS_LE_32 requiring no TLS entry. For
294 x86-64, if R_X86_64_GOTTPOFF symbol is now local to the binary,
295 make it a R_X86_64_TPOFF32 requiring no GOT entry. */
296 if (h->got.refcount > 0
297 && bfd_link_executable (info)
299 && (elf_x86_hash_entry (h)->tls_type & GOT_TLS_IE))
300 h->got.offset = (bfd_vma) -1;
301 else if (h->got.refcount > 0)
305 int tls_type = elf_x86_hash_entry (h)->tls_type;
307 /* Make sure this symbol is output as a dynamic symbol.
308 Undefined weak syms won't yet be marked as dynamic. */
312 && h->root.type == bfd_link_hash_undefweak)
314 if (! bfd_elf_link_record_dynamic_symbol (info, h))
319 if (GOT_TLS_GDESC_P (tls_type))
321 eh->tlsdesc_got = htab->elf.sgotplt->size
322 - elf_x86_compute_jump_table_size (htab);
323 htab->elf.sgotplt->size += 2 * htab->got_entry_size;
324 h->got.offset = (bfd_vma) -2;
326 if (! GOT_TLS_GDESC_P (tls_type)
327 || GOT_TLS_GD_P (tls_type))
329 h->got.offset = s->size;
330 s->size += htab->got_entry_size;
331 /* R_386_TLS_GD and R_X86_64_TLSGD need 2 consecutive GOT
333 if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH)
334 s->size += htab->got_entry_size;
336 dyn = htab->elf.dynamic_sections_created;
337 /* R_386_TLS_IE_32 needs one dynamic relocation,
338 R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
339 (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
340 need two), R_386_TLS_GD and R_X86_64_TLSGD need one if local
341 symbol and two if global. No dynamic relocation against
342 resolved undefined weak symbol in executable. */
343 if (tls_type == GOT_TLS_IE_BOTH)
344 htab->elf.srelgot->size += 2 * htab->sizeof_reloc;
345 else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
346 || (tls_type & GOT_TLS_IE))
347 htab->elf.srelgot->size += htab->sizeof_reloc;
348 else if (GOT_TLS_GD_P (tls_type))
349 htab->elf.srelgot->size += 2 * htab->sizeof_reloc;
350 else if (! GOT_TLS_GDESC_P (tls_type)
351 && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
352 && !resolved_to_zero)
353 || h->root.type != bfd_link_hash_undefweak)
354 && (bfd_link_pic (info)
355 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
356 htab->elf.srelgot->size += htab->sizeof_reloc;
357 if (GOT_TLS_GDESC_P (tls_type))
359 htab->elf.srelplt->size += htab->sizeof_reloc;
360 if (bed->target_id == X86_64_ELF_DATA)
361 htab->tlsdesc_plt = (bfd_vma) -1;
365 h->got.offset = (bfd_vma) -1;
367 if (eh->dyn_relocs == NULL)
370 /* In the shared -Bsymbolic case, discard space allocated for
371 dynamic pc-relative relocs against symbols which turn out to be
372 defined in regular objects. For the normal shared case, discard
373 space for pc-relative relocs that have become local due to symbol
374 visibility changes. */
376 if (bfd_link_pic (info))
378 /* Relocs that use pc_count are those that appear on a call
379 insn, or certain REL relocs that can generated via assembly.
380 We want calls to protected symbols to resolve directly to the
381 function rather than going via the plt. If people want
382 function pointer comparisons to work as expected then they
383 should avoid writing weird assembly. */
384 if (SYMBOL_CALLS_LOCAL (info, h))
386 struct elf_dyn_relocs **pp;
388 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
390 p->count -= p->pc_count;
399 if (htab->target_os == is_vxworks)
401 struct elf_dyn_relocs **pp;
402 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
404 if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
411 /* Also discard relocs on undefined weak syms with non-default
412 visibility or in PIE. */
413 if (eh->dyn_relocs != NULL)
415 if (h->root.type == bfd_link_hash_undefweak)
417 /* Undefined weak symbol is never bound locally in shared
419 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
422 if (bed->target_id == I386_ELF_DATA
425 /* Keep dynamic non-GOT/non-PLT relocation so
426 that we can branch to 0 without PLT. */
427 struct elf_dyn_relocs **pp;
429 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
430 if (p->pc_count == 0)
434 /* Remove non-R_386_PC32 relocation. */
435 p->count = p->pc_count;
439 /* Make sure undefined weak symbols are output
440 as dynamic symbols in PIEs for dynamic non-GOT
441 non-PLT reloations. */
442 if (eh->dyn_relocs != NULL
443 && !bfd_elf_link_record_dynamic_symbol (info, h))
447 eh->dyn_relocs = NULL;
449 else if (h->dynindx == -1
451 && !bfd_elf_link_record_dynamic_symbol (info, h))
454 else if (bfd_link_executable (info)
455 && (h->needs_copy || eh->needs_copy)
459 /* NB: needs_copy is set only for x86-64. For PIE,
460 discard space for pc-relative relocs against symbols
461 which turn out to need copy relocs. */
462 struct elf_dyn_relocs **pp;
464 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
466 if (p->pc_count != 0)
474 else if (ELIMINATE_COPY_RELOCS)
476 /* For the non-shared case, discard space for relocs against
477 symbols which turn out to need copy relocs or are not
478 dynamic. Keep dynamic relocations for run-time function
479 pointer initialization. */
482 || (h->root.type == bfd_link_hash_undefweak
483 && !resolved_to_zero))
486 || (htab->elf.dynamic_sections_created
487 && (h->root.type == bfd_link_hash_undefweak
488 || h->root.type == bfd_link_hash_undefined))))
490 /* Make sure this symbol is output as a dynamic symbol.
491 Undefined weak syms won't yet be marked as dynamic. */
495 && h->root.type == bfd_link_hash_undefweak
496 && ! bfd_elf_link_record_dynamic_symbol (info, h))
499 /* If that succeeded, we know we'll be keeping all the
501 if (h->dynindx != -1)
505 eh->dyn_relocs = NULL;
510 /* Finally, allocate space. */
511 for (p = eh->dyn_relocs; p != NULL; p = p->next)
515 sreloc = elf_section_data (p->sec)->sreloc;
517 BFD_ASSERT (sreloc != NULL);
518 sreloc->size += p->count * htab->sizeof_reloc;
524 /* Find dynamic relocs for H that apply to read-only sections. */
527 readonly_dynrelocs (struct elf_link_hash_entry *h)
529 struct elf_dyn_relocs *p;
531 for (p = elf_x86_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
533 asection *s = p->sec->output_section;
535 if (s != NULL && (s->flags & SEC_READONLY) != 0)
541 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
542 read-only sections. */
545 maybe_set_textrel (struct elf_link_hash_entry *h, void *inf)
549 if (h->root.type == bfd_link_hash_indirect)
552 /* Skip local IFUNC symbols. */
553 if (h->forced_local && h->type == STT_GNU_IFUNC)
556 sec = readonly_dynrelocs (h);
559 struct bfd_link_info *info = (struct bfd_link_info *) inf;
561 info->flags |= DF_TEXTREL;
562 /* xgettext:c-format */
563 info->callbacks->minfo (_("%B: dynamic relocation against `%T' "
564 "in read-only section `%A'\n"),
565 sec->owner, h->root.root.string, sec);
567 if ((info->warn_shared_textrel && bfd_link_pic (info))
568 || info->error_textrel)
569 /* xgettext:c-format */
570 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' "
571 "in read-only section `%A'\n"),
572 sec->owner, h->root.root.string, sec);
574 /* Not an error, just cut short the traversal. */
580 /* Allocate space in .plt, .got and associated reloc sections for
581 local dynamic relocs. */
584 elf_x86_allocate_local_dynreloc (void **slot, void *inf)
586 struct elf_link_hash_entry *h
587 = (struct elf_link_hash_entry *) *slot;
589 if (h->type != STT_GNU_IFUNC
593 || h->root.type != bfd_link_hash_defined)
596 return elf_x86_allocate_dynrelocs (h, inf);
599 /* Find and/or create a hash entry for local symbol. */
601 struct elf_link_hash_entry *
602 _bfd_elf_x86_get_local_sym_hash (struct elf_x86_link_hash_table *htab,
603 bfd *abfd, const Elf_Internal_Rela *rel,
606 struct elf_x86_link_hash_entry e, *ret;
607 asection *sec = abfd->sections;
608 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
609 htab->r_sym (rel->r_info));
612 e.elf.indx = sec->id;
613 e.elf.dynstr_index = htab->r_sym (rel->r_info);
614 slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
615 create ? INSERT : NO_INSERT);
622 ret = (struct elf_x86_link_hash_entry *) *slot;
626 ret = (struct elf_x86_link_hash_entry *)
627 objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
628 sizeof (struct elf_x86_link_hash_entry));
631 memset (ret, 0, sizeof (*ret));
632 ret->elf.indx = sec->id;
633 ret->elf.dynstr_index = htab->r_sym (rel->r_info);
634 ret->elf.dynindx = -1;
635 ret->plt_got.offset = (bfd_vma) -1;
641 /* Create an entry in a x86 ELF linker hash table. NB: THIS MUST BE IN
642 SYNC WITH _bfd_elf_link_hash_newfunc. */
644 struct bfd_hash_entry *
645 _bfd_x86_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
646 struct bfd_hash_table *table,
649 /* Allocate the structure if it has not already been allocated by a
653 entry = (struct bfd_hash_entry *)
654 bfd_hash_allocate (table,
655 sizeof (struct elf_x86_link_hash_entry));
660 /* Call the allocation method of the superclass. */
661 entry = _bfd_link_hash_newfunc (entry, table, string);
664 struct elf_x86_link_hash_entry *eh
665 = (struct elf_x86_link_hash_entry *) entry;
666 struct elf_link_hash_table *htab
667 = (struct elf_link_hash_table *) table;
669 memset (&eh->elf.size, 0,
670 (sizeof (struct elf_x86_link_hash_entry)
671 - offsetof (struct elf_link_hash_entry, size)));
672 /* Set local fields. */
674 eh->elf.dynindx = -1;
675 eh->elf.got = htab->init_got_refcount;
676 eh->elf.plt = htab->init_plt_refcount;
677 /* Assume that we have been called by a non-ELF symbol reader.
678 This flag is then reset by the code which reads an ELF input
679 file. This ensures that a symbol created by a non-ELF symbol
680 reader will have the flag set correctly. */
682 eh->plt_second.offset = (bfd_vma) -1;
683 eh->plt_got.offset = (bfd_vma) -1;
684 eh->tlsdesc_got = (bfd_vma) -1;
685 eh->zero_undefweak = 1;
691 /* Compute a hash of a local hash entry. We use elf_link_hash_entry
692 for local symbol so that we can handle local STT_GNU_IFUNC symbols
693 as global symbol. We reuse indx and dynstr_index for local symbol
694 hash since they aren't used by global symbols in this backend. */
697 _bfd_x86_elf_local_htab_hash (const void *ptr)
699 struct elf_link_hash_entry *h
700 = (struct elf_link_hash_entry *) ptr;
701 return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
704 /* Compare local hash entries. */
707 _bfd_x86_elf_local_htab_eq (const void *ptr1, const void *ptr2)
709 struct elf_link_hash_entry *h1
710 = (struct elf_link_hash_entry *) ptr1;
711 struct elf_link_hash_entry *h2
712 = (struct elf_link_hash_entry *) ptr2;
714 return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
717 /* Destroy an x86 ELF linker hash table. */
720 elf_x86_link_hash_table_free (bfd *obfd)
722 struct elf_x86_link_hash_table *htab
723 = (struct elf_x86_link_hash_table *) obfd->link.hash;
725 if (htab->loc_hash_table)
726 htab_delete (htab->loc_hash_table);
727 if (htab->loc_hash_memory)
728 objalloc_free ((struct objalloc *) htab->loc_hash_memory);
729 _bfd_elf_link_hash_table_free (obfd);
733 elf_i386_is_reloc_section (const char *secname)
735 return CONST_STRNEQ (secname, ".rel");
739 elf_x86_64_is_reloc_section (const char *secname)
741 return CONST_STRNEQ (secname, ".rela");
744 /* Create an x86 ELF linker hash table. */
746 struct bfd_link_hash_table *
747 _bfd_x86_elf_link_hash_table_create (bfd *abfd)
749 struct elf_x86_link_hash_table *ret;
750 const struct elf_backend_data *bed;
751 bfd_size_type amt = sizeof (struct elf_x86_link_hash_table);
753 ret = (struct elf_x86_link_hash_table *) bfd_zmalloc (amt);
757 bed = get_elf_backend_data (abfd);
758 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
759 _bfd_x86_elf_link_hash_newfunc,
760 sizeof (struct elf_x86_link_hash_entry),
767 if (bed->target_id == X86_64_ELF_DATA)
769 ret->is_reloc_section = elf_x86_64_is_reloc_section;
770 ret->dt_reloc = DT_RELA;
771 ret->dt_reloc_sz = DT_RELASZ;
772 ret->dt_reloc_ent = DT_RELAENT;
773 ret->got_entry_size = 8;
774 ret->tls_get_addr = "__tls_get_addr";
778 ret->sizeof_reloc = sizeof (Elf64_External_Rela);
779 ret->pointer_r_type = R_X86_64_64;
780 ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
781 ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
785 if (bed->target_id == X86_64_ELF_DATA)
787 ret->sizeof_reloc = sizeof (Elf32_External_Rela);
788 ret->pointer_r_type = R_X86_64_32;
789 ret->dynamic_interpreter = ELFX32_DYNAMIC_INTERPRETER;
790 ret->dynamic_interpreter_size
791 = sizeof ELFX32_DYNAMIC_INTERPRETER;
795 ret->is_reloc_section = elf_i386_is_reloc_section;
796 ret->dt_reloc = DT_REL;
797 ret->dt_reloc_sz = DT_RELSZ;
798 ret->dt_reloc_ent = DT_RELENT;
799 ret->sizeof_reloc = sizeof (Elf32_External_Rel);
800 ret->got_entry_size = 4;
801 ret->pointer_r_type = R_386_32;
802 ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
803 ret->dynamic_interpreter_size
804 = sizeof ELF32_DYNAMIC_INTERPRETER;
805 ret->tls_get_addr = "___tls_get_addr";
808 ret->target_id = bed->target_id;
809 ret->target_os = get_elf_x86_backend_data (abfd)->target_os;
811 ret->loc_hash_table = htab_try_create (1024,
812 _bfd_x86_elf_local_htab_hash,
813 _bfd_x86_elf_local_htab_eq,
815 ret->loc_hash_memory = objalloc_create ();
816 if (!ret->loc_hash_table || !ret->loc_hash_memory)
818 elf_x86_link_hash_table_free (abfd);
821 ret->elf.root.hash_table_free = elf_x86_link_hash_table_free;
823 return &ret->elf.root;
826 /* Sort relocs into address order. */
829 _bfd_x86_elf_compare_relocs (const void *ap, const void *bp)
831 const arelent *a = * (const arelent **) ap;
832 const arelent *b = * (const arelent **) bp;
834 if (a->address > b->address)
836 else if (a->address < b->address)
843 _bfd_x86_elf_link_check_relocs (bfd *abfd, struct bfd_link_info *info)
845 if (!bfd_link_relocatable (info))
847 /* Check for __tls_get_addr reference. */
848 struct elf_x86_link_hash_table *htab;
849 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
850 htab = elf_x86_hash_table (info, bed->target_id);
853 struct elf_link_hash_entry *h;
855 h = elf_link_hash_lookup (elf_hash_table (info),
857 FALSE, FALSE, FALSE);
860 elf_x86_hash_entry (h)->tls_get_addr = 1;
862 /* Check the versioned __tls_get_addr symbol. */
863 while (h->root.type == bfd_link_hash_indirect)
865 h = (struct elf_link_hash_entry *) h->root.u.i.link;
866 elf_x86_hash_entry (h)->tls_get_addr = 1;
870 /* "__ehdr_start" will be defined by linker as a hidden symbol
871 later if it is referenced and not defined. */
872 h = elf_link_hash_lookup (elf_hash_table (info),
874 FALSE, FALSE, FALSE);
876 && (h->root.type == bfd_link_hash_new
877 || h->root.type == bfd_link_hash_undefined
878 || h->root.type == bfd_link_hash_undefweak
879 || h->root.type == bfd_link_hash_common))
881 elf_x86_hash_entry (h)->local_ref = 2;
882 elf_x86_hash_entry (h)->linker_def = 1;
887 /* Invoke the regular ELF backend linker to do all the work. */
888 return _bfd_elf_link_check_relocs (abfd, info);
891 /* Set the sizes of the dynamic sections. */
894 _bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
895 struct bfd_link_info *info)
897 struct elf_x86_link_hash_table *htab;
902 const struct elf_backend_data *bed
903 = get_elf_backend_data (output_bfd);
905 htab = elf_x86_hash_table (info, bed->target_id);
908 dynobj = htab->elf.dynobj;
912 /* Set up .got offsets for local syms, and space for local dynamic
914 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
916 bfd_signed_vma *local_got;
917 bfd_signed_vma *end_local_got;
918 char *local_tls_type;
919 bfd_vma *local_tlsdesc_gotent;
920 bfd_size_type locsymcount;
921 Elf_Internal_Shdr *symtab_hdr;
924 if (! is_x86_elf (ibfd, htab))
927 for (s = ibfd->sections; s != NULL; s = s->next)
929 struct elf_dyn_relocs *p;
931 for (p = ((struct elf_dyn_relocs *)
932 elf_section_data (s)->local_dynrel);
936 if (!bfd_is_abs_section (p->sec)
937 && bfd_is_abs_section (p->sec->output_section))
939 /* Input section has been discarded, either because
940 it is a copy of a linkonce section or due to
941 linker script /DISCARD/, so we'll be discarding
944 else if (htab->target_os == is_vxworks
945 && strcmp (p->sec->output_section->name,
948 /* Relocations in vxworks .tls_vars sections are
949 handled specially by the loader. */
951 else if (p->count != 0)
953 srel = elf_section_data (p->sec)->sreloc;
954 srel->size += p->count * htab->sizeof_reloc;
955 if ((p->sec->output_section->flags & SEC_READONLY) != 0
956 && (info->flags & DF_TEXTREL) == 0)
958 info->flags |= DF_TEXTREL;
959 if ((info->warn_shared_textrel && bfd_link_pic (info))
960 || info->error_textrel)
961 /* xgettext:c-format */
962 info->callbacks->einfo
963 (_("%P: %B: warning: relocation "
964 "in read-only section `%A'\n"),
965 p->sec->owner, p->sec);
971 local_got = elf_local_got_refcounts (ibfd);
975 symtab_hdr = &elf_symtab_hdr (ibfd);
976 locsymcount = symtab_hdr->sh_info;
977 end_local_got = local_got + locsymcount;
978 local_tls_type = elf_x86_local_got_tls_type (ibfd);
979 local_tlsdesc_gotent = elf_x86_local_tlsdesc_gotent (ibfd);
981 srel = htab->elf.srelgot;
982 for (; local_got < end_local_got;
983 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
985 *local_tlsdesc_gotent = (bfd_vma) -1;
988 if (GOT_TLS_GDESC_P (*local_tls_type))
990 *local_tlsdesc_gotent = htab->elf.sgotplt->size
991 - elf_x86_compute_jump_table_size (htab);
992 htab->elf.sgotplt->size += 2 * htab->got_entry_size;
993 *local_got = (bfd_vma) -2;
995 if (! GOT_TLS_GDESC_P (*local_tls_type)
996 || GOT_TLS_GD_P (*local_tls_type))
998 *local_got = s->size;
999 s->size += htab->got_entry_size;
1000 if (GOT_TLS_GD_P (*local_tls_type)
1001 || *local_tls_type == GOT_TLS_IE_BOTH)
1002 s->size += htab->got_entry_size;
1004 if (bfd_link_pic (info)
1005 || GOT_TLS_GD_ANY_P (*local_tls_type)
1006 || (*local_tls_type & GOT_TLS_IE))
1008 if (*local_tls_type == GOT_TLS_IE_BOTH)
1009 srel->size += 2 * htab->sizeof_reloc;
1010 else if (GOT_TLS_GD_P (*local_tls_type)
1011 || ! GOT_TLS_GDESC_P (*local_tls_type))
1012 srel->size += htab->sizeof_reloc;
1013 if (GOT_TLS_GDESC_P (*local_tls_type))
1015 htab->elf.srelplt->size += htab->sizeof_reloc;
1016 if (bed->target_id == X86_64_ELF_DATA)
1017 htab->tlsdesc_plt = (bfd_vma) -1;
1022 *local_got = (bfd_vma) -1;
1026 if (htab->tls_ld_or_ldm_got.refcount > 0)
1028 /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
1029 or R_X86_64_TLSLD relocs. */
1030 htab->tls_ld_or_ldm_got.offset = htab->elf.sgot->size;
1031 htab->elf.sgot->size += 2 * htab->got_entry_size;
1032 htab->elf.srelgot->size += htab->sizeof_reloc;
1035 htab->tls_ld_or_ldm_got.offset = -1;
1037 /* Allocate global sym .plt and .got entries, and space for global
1038 sym dynamic relocs. */
1039 elf_link_hash_traverse (&htab->elf, elf_x86_allocate_dynrelocs,
1042 /* Allocate .plt and .got entries, and space for local symbols. */
1043 htab_traverse (htab->loc_hash_table, elf_x86_allocate_local_dynreloc,
1046 /* For every jump slot reserved in the sgotplt, reloc_count is
1047 incremented. However, when we reserve space for TLS descriptors,
1048 it's not incremented, so in order to compute the space reserved
1049 for them, it suffices to multiply the reloc count by the jump
1052 PR ld/13302: We start next_irelative_index at the end of .rela.plt
1053 so that R_{386,X86_64}_IRELATIVE entries come last. */
1054 if (htab->elf.srelplt)
1056 htab->next_tls_desc_index = htab->elf.srelplt->reloc_count;
1057 htab->sgotplt_jump_table_size
1058 = elf_x86_compute_jump_table_size (htab);
1059 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
1061 else if (htab->elf.irelplt)
1062 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
1064 if (htab->tlsdesc_plt)
1066 /* NB: tlsdesc_plt is set only for x86-64. If we're not using
1067 lazy TLS relocations, don't generate the PLT and GOT entries
1069 if ((info->flags & DF_BIND_NOW))
1070 htab->tlsdesc_plt = 0;
1073 htab->tlsdesc_got = htab->elf.sgot->size;
1074 htab->elf.sgot->size += htab->got_entry_size;
1075 /* Reserve room for the initial entry.
1076 FIXME: we could probably do away with it in this case. */
1077 if (htab->elf.splt->size == 0)
1078 htab->elf.splt->size = htab->plt.plt_entry_size;
1079 htab->tlsdesc_plt = htab->elf.splt->size;
1080 htab->elf.splt->size += htab->plt.plt_entry_size;
1084 if (htab->elf.sgotplt)
1086 /* Don't allocate .got.plt section if there are no GOT nor PLT
1087 entries and there is no reference to _GLOBAL_OFFSET_TABLE_. */
1088 if ((htab->elf.hgot == NULL
1089 || !htab->got_referenced)
1090 && (htab->elf.sgotplt->size == bed->got_header_size)
1091 && (htab->elf.splt == NULL
1092 || htab->elf.splt->size == 0)
1093 && (htab->elf.sgot == NULL
1094 || htab->elf.sgot->size == 0)
1095 && (htab->elf.iplt == NULL
1096 || htab->elf.iplt->size == 0)
1097 && (htab->elf.igotplt == NULL
1098 || htab->elf.igotplt->size == 0))
1100 htab->elf.sgotplt->size = 0;
1101 if (htab->elf.hgot != NULL)
1103 /* Remove the unused _GLOBAL_OFFSET_TABLE_ from symbol
1105 htab->elf.hgot->root.type = bfd_link_hash_undefined;
1106 htab->elf.hgot->root.u.undef.abfd
1107 = htab->elf.hgot->root.u.def.section->owner;
1108 htab->elf.hgot->root.linker_def = 0;
1109 htab->elf.hgot->ref_regular = 0;
1110 htab->elf.hgot->def_regular = 0;
1115 if (_bfd_elf_eh_frame_present (info))
1117 if (htab->plt_eh_frame != NULL
1118 && htab->elf.splt != NULL
1119 && htab->elf.splt->size != 0
1120 && !bfd_is_abs_section (htab->elf.splt->output_section))
1121 htab->plt_eh_frame->size = htab->plt.eh_frame_plt_size;
1123 if (htab->plt_got_eh_frame != NULL
1124 && htab->plt_got != NULL
1125 && htab->plt_got->size != 0
1126 && !bfd_is_abs_section (htab->plt_got->output_section))
1127 htab->plt_got_eh_frame->size
1128 = htab->non_lazy_plt->eh_frame_plt_size;
1130 /* Unwind info for the second PLT and .plt.got sections are
1132 if (htab->plt_second_eh_frame != NULL
1133 && htab->plt_second != NULL
1134 && htab->plt_second->size != 0
1135 && !bfd_is_abs_section (htab->plt_second->output_section))
1136 htab->plt_second_eh_frame->size
1137 = htab->non_lazy_plt->eh_frame_plt_size;
1140 /* We now have determined the sizes of the various dynamic sections.
1141 Allocate memory for them. */
1143 for (s = dynobj->sections; s != NULL; s = s->next)
1145 bfd_boolean strip_section = TRUE;
1147 if ((s->flags & SEC_LINKER_CREATED) == 0)
1150 if (s == htab->elf.splt
1151 || s == htab->elf.sgot)
1153 /* Strip this section if we don't need it; see the
1155 /* We'd like to strip these sections if they aren't needed, but if
1156 we've exported dynamic symbols from them we must leave them.
1157 It's too late to tell BFD to get rid of the symbols. */
1159 if (htab->elf.hplt != NULL)
1160 strip_section = FALSE;
1162 else if (s == htab->elf.sgotplt
1163 || s == htab->elf.iplt
1164 || s == htab->elf.igotplt
1165 || s == htab->plt_second
1166 || s == htab->plt_got
1167 || s == htab->plt_eh_frame
1168 || s == htab->plt_got_eh_frame
1169 || s == htab->plt_second_eh_frame
1170 || s == htab->elf.sdynbss
1171 || s == htab->elf.sdynrelro)
1173 /* Strip these too. */
1175 else if (htab->is_reloc_section (bfd_get_section_name (dynobj, s)))
1178 && s != htab->elf.srelplt
1179 && s != htab->srelplt2)
1182 /* We use the reloc_count field as a counter if we need
1183 to copy relocs into the output file. */
1184 if (s != htab->elf.srelplt)
1189 /* It's not one of our sections, so don't allocate space. */
1195 /* If we don't need this section, strip it from the
1196 output file. This is mostly to handle .rel.bss and
1197 .rel.plt. We must create both sections in
1198 create_dynamic_sections, because they must be created
1199 before the linker maps input sections to output
1200 sections. The linker does that before
1201 adjust_dynamic_symbol is called, and it is that
1202 function which decides whether anything needs to go
1203 into these sections. */
1205 s->flags |= SEC_EXCLUDE;
1209 if ((s->flags & SEC_HAS_CONTENTS) == 0)
1212 /* Allocate memory for the section contents. We use bfd_zalloc
1213 here in case unused entries are not reclaimed before the
1214 section's contents are written out. This should not happen,
1215 but this way if it does, we get a R_386_NONE or R_X86_64_NONE
1216 reloc instead of garbage. */
1217 s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
1218 if (s->contents == NULL)
1222 if (htab->plt_eh_frame != NULL
1223 && htab->plt_eh_frame->contents != NULL)
1225 memcpy (htab->plt_eh_frame->contents,
1226 htab->plt.eh_frame_plt,
1227 htab->plt_eh_frame->size);
1228 bfd_put_32 (dynobj, htab->elf.splt->size,
1229 htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
1232 if (htab->plt_got_eh_frame != NULL
1233 && htab->plt_got_eh_frame->contents != NULL)
1235 memcpy (htab->plt_got_eh_frame->contents,
1236 htab->non_lazy_plt->eh_frame_plt,
1237 htab->plt_got_eh_frame->size);
1238 bfd_put_32 (dynobj, htab->plt_got->size,
1239 (htab->plt_got_eh_frame->contents
1240 + PLT_FDE_LEN_OFFSET));
1243 if (htab->plt_second_eh_frame != NULL
1244 && htab->plt_second_eh_frame->contents != NULL)
1246 memcpy (htab->plt_second_eh_frame->contents,
1247 htab->non_lazy_plt->eh_frame_plt,
1248 htab->plt_second_eh_frame->size);
1249 bfd_put_32 (dynobj, htab->plt_second->size,
1250 (htab->plt_second_eh_frame->contents
1251 + PLT_FDE_LEN_OFFSET));
1254 if (htab->elf.dynamic_sections_created)
1256 /* Add some entries to the .dynamic section. We fill in the
1257 values later, in elf_{i386,x86_64}_finish_dynamic_sections,
1258 but we must add the entries now so that we get the correct
1259 size for the .dynamic section. The DT_DEBUG entry is filled
1260 in by the dynamic linker and used by the debugger. */
1261 #define add_dynamic_entry(TAG, VAL) \
1262 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1264 if (bfd_link_executable (info))
1266 if (!add_dynamic_entry (DT_DEBUG, 0))
1270 if (htab->elf.splt->size != 0)
1272 /* DT_PLTGOT is used by prelink even if there is no PLT
1274 if (!add_dynamic_entry (DT_PLTGOT, 0))
1278 if (htab->elf.srelplt->size != 0)
1280 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
1281 || !add_dynamic_entry (DT_PLTREL, htab->dt_reloc)
1282 || !add_dynamic_entry (DT_JMPREL, 0))
1286 if (htab->tlsdesc_plt
1287 && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
1288 || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
1293 if (!add_dynamic_entry (htab->dt_reloc, 0)
1294 || !add_dynamic_entry (htab->dt_reloc_sz, 0)
1295 || !add_dynamic_entry (htab->dt_reloc_ent,
1296 htab->sizeof_reloc))
1299 /* If any dynamic relocs apply to a read-only section,
1300 then we need a DT_TEXTREL entry. */
1301 if ((info->flags & DF_TEXTREL) == 0)
1302 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
1304 if ((info->flags & DF_TEXTREL) != 0)
1306 if (htab->readonly_dynrelocs_against_ifunc)
1308 info->callbacks->einfo
1309 (_("%P%X: read-only segment has dynamic IFUNC relocations;"
1310 " recompile with -fPIC\n"));
1311 bfd_set_error (bfd_error_bad_value);
1315 if (!add_dynamic_entry (DT_TEXTREL, 0))
1319 if (htab->target_os == is_vxworks
1320 && !elf_vxworks_add_dynamic_entries (output_bfd, info))
1323 #undef add_dynamic_entry
1328 /* Finish up the x86 dynamic sections. */
1330 struct elf_x86_link_hash_table *
1331 _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd,
1332 struct bfd_link_info *info)
1334 struct elf_x86_link_hash_table *htab;
1335 const struct elf_backend_data *bed;
1338 bfd_byte *dyncon, *dynconend;
1339 bfd_size_type sizeof_dyn;
1341 bed = get_elf_backend_data (output_bfd);
1342 htab = elf_x86_hash_table (info, bed->target_id);
1346 dynobj = htab->elf.dynobj;
1347 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
1349 /* GOT is always created in setup_gnu_properties. But it may not be
1350 needed. .got.plt section may be needed for static IFUNC. */
1351 if (htab->elf.sgotplt && htab->elf.sgotplt->size > 0)
1353 bfd_vma dynamic_addr;
1355 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
1358 (_("discarded output section: `%A'"), htab->elf.sgotplt);
1362 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize
1363 = htab->got_entry_size;
1365 dynamic_addr = (sdyn == NULL
1367 : sdyn->output_section->vma + sdyn->output_offset);
1369 /* Set the first entry in the global offset table to the address
1370 of the dynamic section. Write GOT[1] and GOT[2], needed for
1371 the dynamic linker. */
1372 if (htab->got_entry_size == 8)
1374 bfd_put_64 (output_bfd, dynamic_addr,
1375 htab->elf.sgotplt->contents);
1376 bfd_put_64 (output_bfd, (bfd_vma) 0,
1377 htab->elf.sgotplt->contents + 8);
1378 bfd_put_64 (output_bfd, (bfd_vma) 0,
1379 htab->elf.sgotplt->contents + 8*2);
1383 bfd_put_32 (output_bfd, dynamic_addr,
1384 htab->elf.sgotplt->contents);
1385 bfd_put_32 (output_bfd, 0,
1386 htab->elf.sgotplt->contents + 4);
1387 bfd_put_32 (output_bfd, 0,
1388 htab->elf.sgotplt->contents + 4*2);
1392 if (!htab->elf.dynamic_sections_created)
1395 if (sdyn == NULL || htab->elf.sgot == NULL)
1398 sizeof_dyn = bed->s->sizeof_dyn;
1399 dyncon = sdyn->contents;
1400 dynconend = sdyn->contents + sdyn->size;
1401 for (; dyncon < dynconend; dyncon += sizeof_dyn)
1403 Elf_Internal_Dyn dyn;
1406 (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
1411 if (htab->target_os == is_vxworks
1412 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
1417 s = htab->elf.sgotplt;
1418 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
1422 dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
1426 s = htab->elf.srelplt->output_section;
1427 dyn.d_un.d_val = s->size;
1430 case DT_TLSDESC_PLT:
1432 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
1433 + htab->tlsdesc_plt;
1436 case DT_TLSDESC_GOT:
1438 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
1439 + htab->tlsdesc_got;
1443 (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
1446 if (htab->plt_got != NULL && htab->plt_got->size > 0)
1447 elf_section_data (htab->plt_got->output_section)
1448 ->this_hdr.sh_entsize = htab->non_lazy_plt->plt_entry_size;
1450 if (htab->plt_second != NULL && htab->plt_second->size > 0)
1451 elf_section_data (htab->plt_second->output_section)
1452 ->this_hdr.sh_entsize = htab->non_lazy_plt->plt_entry_size;
1454 /* Adjust .eh_frame for .plt section. */
1455 if (htab->plt_eh_frame != NULL
1456 && htab->plt_eh_frame->contents != NULL)
1458 if (htab->elf.splt != NULL
1459 && htab->elf.splt->size != 0
1460 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
1461 && htab->elf.splt->output_section != NULL
1462 && htab->plt_eh_frame->output_section != NULL)
1464 bfd_vma plt_start = htab->elf.splt->output_section->vma;
1465 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
1466 + htab->plt_eh_frame->output_offset
1467 + PLT_FDE_START_OFFSET;
1468 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
1469 htab->plt_eh_frame->contents
1470 + PLT_FDE_START_OFFSET);
1473 if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
1475 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
1477 htab->plt_eh_frame->contents))
1482 /* Adjust .eh_frame for .plt.got section. */
1483 if (htab->plt_got_eh_frame != NULL
1484 && htab->plt_got_eh_frame->contents != NULL)
1486 if (htab->plt_got != NULL
1487 && htab->plt_got->size != 0
1488 && (htab->plt_got->flags & SEC_EXCLUDE) == 0
1489 && htab->plt_got->output_section != NULL
1490 && htab->plt_got_eh_frame->output_section != NULL)
1492 bfd_vma plt_start = htab->plt_got->output_section->vma;
1493 bfd_vma eh_frame_start = htab->plt_got_eh_frame->output_section->vma
1494 + htab->plt_got_eh_frame->output_offset
1495 + PLT_FDE_START_OFFSET;
1496 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
1497 htab->plt_got_eh_frame->contents
1498 + PLT_FDE_START_OFFSET);
1500 if (htab->plt_got_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
1502 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
1503 htab->plt_got_eh_frame,
1504 htab->plt_got_eh_frame->contents))
1509 /* Adjust .eh_frame for the second PLT section. */
1510 if (htab->plt_second_eh_frame != NULL
1511 && htab->plt_second_eh_frame->contents != NULL)
1513 if (htab->plt_second != NULL
1514 && htab->plt_second->size != 0
1515 && (htab->plt_second->flags & SEC_EXCLUDE) == 0
1516 && htab->plt_second->output_section != NULL
1517 && htab->plt_second_eh_frame->output_section != NULL)
1519 bfd_vma plt_start = htab->plt_second->output_section->vma;
1520 bfd_vma eh_frame_start
1521 = (htab->plt_second_eh_frame->output_section->vma
1522 + htab->plt_second_eh_frame->output_offset
1523 + PLT_FDE_START_OFFSET);
1524 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
1525 htab->plt_second_eh_frame->contents
1526 + PLT_FDE_START_OFFSET);
1528 if (htab->plt_second_eh_frame->sec_info_type
1529 == SEC_INFO_TYPE_EH_FRAME)
1531 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
1532 htab->plt_second_eh_frame,
1533 htab->plt_second_eh_frame->contents))
1538 if (htab->elf.sgot && htab->elf.sgot->size > 0)
1539 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
1540 = htab->got_entry_size;
1547 _bfd_x86_elf_always_size_sections (bfd *output_bfd,
1548 struct bfd_link_info *info)
1550 asection *tls_sec = elf_hash_table (info)->tls_sec;
1554 struct elf_link_hash_entry *tlsbase;
1556 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
1557 "_TLS_MODULE_BASE_",
1558 FALSE, FALSE, FALSE);
1560 if (tlsbase && tlsbase->type == STT_TLS)
1562 struct elf_x86_link_hash_table *htab;
1563 struct bfd_link_hash_entry *bh = NULL;
1564 const struct elf_backend_data *bed
1565 = get_elf_backend_data (output_bfd);
1567 htab = elf_x86_hash_table (info, bed->target_id);
1571 if (!(_bfd_generic_link_add_one_symbol
1572 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
1573 tls_sec, 0, NULL, FALSE,
1574 bed->collect, &bh)))
1577 htab->tls_module_base = bh;
1579 tlsbase = (struct elf_link_hash_entry *)bh;
1580 tlsbase->def_regular = 1;
1581 tlsbase->other = STV_HIDDEN;
1582 tlsbase->root.linker_def = 1;
1583 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
1591 _bfd_x86_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
1592 const Elf_Internal_Sym *isym,
1593 bfd_boolean definition,
1594 bfd_boolean dynamic ATTRIBUTE_UNUSED)
1598 struct elf_x86_link_hash_entry *eh
1599 = (struct elf_x86_link_hash_entry *) h;
1600 eh->def_protected = (ELF_ST_VISIBILITY (isym->st_other)
1605 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1608 _bfd_x86_elf_copy_indirect_symbol (struct bfd_link_info *info,
1609 struct elf_link_hash_entry *dir,
1610 struct elf_link_hash_entry *ind)
1612 struct elf_x86_link_hash_entry *edir, *eind;
1614 edir = (struct elf_x86_link_hash_entry *) dir;
1615 eind = (struct elf_x86_link_hash_entry *) ind;
1617 if (eind->dyn_relocs != NULL)
1619 if (edir->dyn_relocs != NULL)
1621 struct elf_dyn_relocs **pp;
1622 struct elf_dyn_relocs *p;
1624 /* Add reloc counts against the indirect sym to the direct sym
1625 list. Merge any entries against the same section. */
1626 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1628 struct elf_dyn_relocs *q;
1630 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1631 if (q->sec == p->sec)
1633 q->pc_count += p->pc_count;
1634 q->count += p->count;
1641 *pp = edir->dyn_relocs;
1644 edir->dyn_relocs = eind->dyn_relocs;
1645 eind->dyn_relocs = NULL;
1648 if (ind->root.type == bfd_link_hash_indirect
1649 && dir->got.refcount <= 0)
1651 edir->tls_type = eind->tls_type;
1652 eind->tls_type = GOT_UNKNOWN;
1655 /* Copy gotoff_ref so that elf_i386_adjust_dynamic_symbol will
1656 generate a R_386_COPY reloc. */
1657 edir->gotoff_ref |= eind->gotoff_ref;
1659 edir->zero_undefweak |= eind->zero_undefweak;
1661 if (ELIMINATE_COPY_RELOCS
1662 && ind->root.type != bfd_link_hash_indirect
1663 && dir->dynamic_adjusted)
1665 /* If called to transfer flags for a weakdef during processing
1666 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1667 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1668 if (dir->versioned != versioned_hidden)
1669 dir->ref_dynamic |= ind->ref_dynamic;
1670 dir->ref_regular |= ind->ref_regular;
1671 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1672 dir->needs_plt |= ind->needs_plt;
1673 dir->pointer_equality_needed |= ind->pointer_equality_needed;
1676 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1679 /* Remove undefined weak symbol from the dynamic symbol table if it
1680 is resolved to 0. */
1683 _bfd_x86_elf_fixup_symbol (struct bfd_link_info *info,
1684 struct elf_link_hash_entry *h)
1686 if (h->dynindx != -1
1687 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, elf_x86_hash_entry (h)))
1690 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1696 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
1699 _bfd_x86_elf_hash_symbol (struct elf_link_hash_entry *h)
1701 if (h->plt.offset != (bfd_vma) -1
1703 && !h->pointer_equality_needed)
1706 return _bfd_elf_hash_symbol (h);
1709 /* Adjust a symbol defined by a dynamic object and referenced by a
1710 regular object. The current definition is in some section of the
1711 dynamic object, but we're not including those sections. We have to
1712 change the definition to something the rest of the link can
1716 _bfd_x86_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
1717 struct elf_link_hash_entry *h)
1719 struct elf_x86_link_hash_table *htab;
1721 struct elf_x86_link_hash_entry *eh;
1722 struct elf_dyn_relocs *p;
1723 const struct elf_backend_data *bed
1724 = get_elf_backend_data (info->output_bfd);
1726 /* STT_GNU_IFUNC symbol must go through PLT. */
1727 if (h->type == STT_GNU_IFUNC)
1729 /* All local STT_GNU_IFUNC references must be treate as local
1730 calls via local PLT. */
1732 && SYMBOL_CALLS_LOCAL (info, h))
1734 bfd_size_type pc_count = 0, count = 0;
1735 struct elf_dyn_relocs **pp;
1737 eh = (struct elf_x86_link_hash_entry *) h;
1738 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1740 pc_count += p->pc_count;
1741 p->count -= p->pc_count;
1750 if (pc_count || count)
1755 /* Increment PLT reference count only for PC-relative
1758 if (h->plt.refcount <= 0)
1759 h->plt.refcount = 1;
1761 h->plt.refcount += 1;
1766 if (h->plt.refcount <= 0)
1768 h->plt.offset = (bfd_vma) -1;
1774 /* If this is a function, put it in the procedure linkage table. We
1775 will fill in the contents of the procedure linkage table later,
1776 when we know the address of the .got section. */
1777 if (h->type == STT_FUNC
1780 if (h->plt.refcount <= 0
1781 || SYMBOL_CALLS_LOCAL (info, h)
1782 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1783 && h->root.type == bfd_link_hash_undefweak))
1785 /* This case can occur if we saw a PLT32 reloc in an input
1786 file, but the symbol was never referred to by a dynamic
1787 object, or if all references were garbage collected. In
1788 such a case, we don't actually need to build a procedure
1789 linkage table, and we can just do a PC32 reloc instead. */
1790 h->plt.offset = (bfd_vma) -1;
1797 /* It's possible that we incorrectly decided a .plt reloc was needed
1798 * for an R_386_PC32/R_X86_64_PC32 reloc to a non-function sym in
1799 check_relocs. We can't decide accurately between function and
1800 non-function syms in check-relocs; Objects loaded later in
1801 the link may change h->type. So fix it now. */
1802 h->plt.offset = (bfd_vma) -1;
1804 eh = (struct elf_x86_link_hash_entry *) h;
1806 /* If this is a weak symbol, and there is a real definition, the
1807 processor independent code will have arranged for us to see the
1808 real definition first, and we can just use the same value. */
1809 if (h->is_weakalias)
1811 struct elf_link_hash_entry *def = weakdef (h);
1812 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
1813 h->root.u.def.section = def->root.u.def.section;
1814 h->root.u.def.value = def->root.u.def.value;
1815 if (ELIMINATE_COPY_RELOCS
1816 || info->nocopyreloc
1817 || SYMBOL_NO_COPYRELOC (info, eh))
1819 /* NB: needs_copy is always 0 for i386. */
1820 h->non_got_ref = def->non_got_ref;
1821 eh->needs_copy = def->needs_copy;
1826 /* This is a reference to a symbol defined by a dynamic object which
1827 is not a function. */
1829 /* If we are creating a shared library, we must presume that the
1830 only references to the symbol are via the global offset table.
1831 For such cases we need not do anything here; the relocations will
1832 be handled correctly by relocate_section. */
1833 if (!bfd_link_executable (info))
1836 /* If there are no references to this symbol that do not use the
1837 GOT nor R_386_GOTOFF relocation, we don't need to generate a copy
1838 reloc. NB: gotoff_ref is always 0 for x86-64. */
1839 if (!h->non_got_ref && !eh->gotoff_ref)
1842 /* If -z nocopyreloc was given, we won't generate them either. */
1843 if (info->nocopyreloc || SYMBOL_NO_COPYRELOC (info, eh))
1849 htab = elf_x86_hash_table (info, bed->target_id);
1853 /* If there aren't any dynamic relocs in read-only sections nor
1854 R_386_GOTOFF relocation, then we can keep the dynamic relocs and
1855 avoid the copy reloc. This doesn't work on VxWorks, where we can
1856 not have dynamic relocations (other than copy and jump slot
1857 relocations) in an executable. */
1858 if (ELIMINATE_COPY_RELOCS
1859 && (bed->target_id == X86_64_ELF_DATA
1861 && htab->target_os != is_vxworks)))
1863 /* If we don't find any dynamic relocs in read-only sections,
1864 then we'll be keeping the dynamic relocs and avoiding the copy
1866 if (!readonly_dynrelocs (h))
1873 /* We must allocate the symbol in our .dynbss section, which will
1874 become part of the .bss section of the executable. There will be
1875 an entry for this symbol in the .dynsym section. The dynamic
1876 object will contain position independent code, so all references
1877 from the dynamic object to this symbol will go through the global
1878 offset table. The dynamic linker will use the .dynsym entry to
1879 determine the address it must put in the global offset table, so
1880 both the dynamic object and the regular object will refer to the
1881 same memory location for the variable. */
1883 /* We must generate a R_386_COPY/R_X86_64_COPY reloc to tell the
1884 dynamic linker to copy the initial value out of the dynamic object
1885 and into the runtime process image. */
1886 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
1888 s = htab->elf.sdynrelro;
1889 srel = htab->elf.sreldynrelro;
1893 s = htab->elf.sdynbss;
1894 srel = htab->elf.srelbss;
1896 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
1898 srel->size += htab->sizeof_reloc;
1902 return _bfd_elf_adjust_dynamic_copy (info, h, s);
1906 _bfd_x86_elf_hide_symbol (struct bfd_link_info *info,
1907 struct elf_link_hash_entry *h,
1908 bfd_boolean force_local)
1910 if (h->root.type == bfd_link_hash_undefweak
1912 && bfd_link_pie (info))
1914 /* When there is no dynamic interpreter in PIE, make the undefined
1915 weak symbol dynamic so that PC relative branch to the undefined
1916 weak symbol will land to address 0. */
1917 struct elf_x86_link_hash_entry *eh = elf_x86_hash_entry (h);
1918 if (h->plt.refcount > 0
1919 || eh->plt_got.refcount > 0)
1923 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
1926 /* Return TRUE if a symbol is referenced locally. It is similar to
1927 SYMBOL_REFERENCES_LOCAL, but it also checks version script. It
1928 works in check_relocs. */
1931 _bfd_x86_elf_link_symbol_references_local (struct bfd_link_info *info,
1932 struct elf_link_hash_entry *h)
1934 struct elf_x86_link_hash_entry *eh = elf_x86_hash_entry (h);
1935 struct elf_x86_link_hash_table *htab
1936 = (struct elf_x86_link_hash_table *) info->hash;
1938 if (eh->local_ref > 1)
1941 if (eh->local_ref == 1)
1944 /* Unversioned symbols defined in regular objects can be forced local
1945 by linker version script. A weak undefined symbol is forced local
1947 1. It has non-default visibility. Or
1948 2. When building executable, there is no dynamic linker. Or
1949 3. or "-z nodynamic-undefined-weak" is used.
1951 if (SYMBOL_REFERENCES_LOCAL (info, h)
1952 || (h->root.type == bfd_link_hash_undefweak
1953 && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1954 || (bfd_link_executable (info)
1955 && htab->interp == NULL)
1956 || info->dynamic_undefined_weak == 0))
1957 || ((h->def_regular || ELF_COMMON_DEF_P (h))
1958 && h->versioned == unversioned
1959 && info->version_info != NULL
1960 && bfd_hide_sym_by_version (info->version_info,
1961 h->root.root.string)))
1971 /* Return the section that should be marked against GC for a given
1975 _bfd_x86_elf_gc_mark_hook (asection *sec,
1976 struct bfd_link_info *info,
1977 Elf_Internal_Rela *rel,
1978 struct elf_link_hash_entry *h,
1979 Elf_Internal_Sym *sym)
1981 /* Compiler should optimize this out. */
1982 if (((unsigned int) R_X86_64_GNU_VTINHERIT
1983 != (unsigned int) R_386_GNU_VTINHERIT)
1984 || ((unsigned int) R_X86_64_GNU_VTENTRY
1985 != (unsigned int) R_386_GNU_VTENTRY))
1989 switch (ELF32_R_TYPE (rel->r_info))
1991 case R_X86_64_GNU_VTINHERIT:
1992 case R_X86_64_GNU_VTENTRY:
1996 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2000 elf_i386_get_plt_got_vma (struct elf_x86_plt *plt_p ATTRIBUTE_UNUSED,
2002 bfd_vma offset ATTRIBUTE_UNUSED,
2005 return got_addr + off;
2009 elf_x86_64_get_plt_got_vma (struct elf_x86_plt *plt_p,
2012 bfd_vma got_addr ATTRIBUTE_UNUSED)
2014 return plt_p->sec->vma + offset + off + plt_p->plt_got_insn_size;
2018 elf_i386_valid_plt_reloc_p (unsigned int type)
2020 return (type == R_386_JUMP_SLOT
2021 || type == R_386_GLOB_DAT
2022 || type == R_386_IRELATIVE);
2026 elf_x86_64_valid_plt_reloc_p (unsigned int type)
2028 return (type == R_X86_64_JUMP_SLOT
2029 || type == R_X86_64_GLOB_DAT
2030 || type == R_X86_64_IRELATIVE);
2034 _bfd_x86_elf_get_synthetic_symtab (bfd *abfd,
2038 struct elf_x86_plt plts[],
2042 long size, i, n, len;
2044 unsigned int plt_got_offset, plt_entry_size;
2046 bfd_byte *plt_contents;
2048 arelent **dynrelbuf, *p;
2050 const struct elf_backend_data *bed;
2051 bfd_vma (*get_plt_got_vma) (struct elf_x86_plt *, bfd_vma, bfd_vma,
2053 bfd_boolean (*valid_plt_reloc_p) (unsigned int);
2058 dynrelbuf = (arelent **) bfd_malloc (relsize);
2059 if (dynrelbuf == NULL)
2062 dynrelcount = bfd_canonicalize_dynamic_reloc (abfd, dynrelbuf,
2064 if (dynrelcount <= 0)
2067 /* Sort the relocs by address. */
2068 qsort (dynrelbuf, dynrelcount, sizeof (arelent *),
2069 _bfd_x86_elf_compare_relocs);
2071 size = count * sizeof (asymbol);
2073 /* Allocate space for @plt suffixes. */
2075 for (i = 0; i < dynrelcount; i++)
2078 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
2080 size += sizeof ("+0x") - 1 + 8 + 8 * ABI_64_P (abfd);
2083 s = *ret = (asymbol *) bfd_zmalloc (size);
2087 bed = get_elf_backend_data (abfd);
2089 if (bed->target_id == X86_64_ELF_DATA)
2091 get_plt_got_vma = elf_x86_64_get_plt_got_vma;
2092 valid_plt_reloc_p = elf_x86_64_valid_plt_reloc_p;
2096 get_plt_got_vma = elf_i386_get_plt_got_vma;
2097 valid_plt_reloc_p = elf_i386_valid_plt_reloc_p;
2100 /* Check .got.plt and then .got to get the _GLOBAL_OFFSET_TABLE_
2102 asection *sec = bfd_get_section_by_name (abfd, ".got.plt");
2104 got_addr = sec->vma;
2107 sec = bfd_get_section_by_name (abfd, ".got");
2109 got_addr = sec->vma;
2112 if (got_addr == (bfd_vma) -1)
2117 /* Check for each PLT section. */
2118 names = (char *) (s + count);
2121 for (j = 0; plts[j].name != NULL; j++)
2122 if ((plt_contents = plts[j].contents) != NULL)
2127 struct elf_x86_plt *plt_p = &plts[j];
2129 plt_got_offset = plt_p->plt_got_offset;
2130 plt_entry_size = plt_p->plt_entry_size;
2134 if ((plt_p->type & plt_lazy))
2136 /* Skip PLT0 in lazy PLT. */
2138 offset = plt_entry_size;
2146 /* Check each PLT entry against dynamic relocations. */
2147 for (; k < plt_p->count; k++)
2153 /* Get the GOT offset for i386 or the PC-relative offset
2154 for x86-64, a signed 32-bit integer. */
2155 off = H_GET_32 (abfd, (plt_contents + offset
2157 got_vma = get_plt_got_vma (plt_p, off, offset, got_addr);
2159 /* Binary search. */
2163 while ((min + 1) < max)
2167 mid = (min + max) / 2;
2169 if (got_vma > r->address)
2171 else if (got_vma < r->address)
2180 /* Skip unknown relocation. PR 17512: file: bc9d6cf5. */
2181 if (got_vma == p->address
2183 && valid_plt_reloc_p (p->howto->type))
2185 *s = **p->sym_ptr_ptr;
2186 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL
2187 set. Since we are defining a symbol, ensure one
2189 if ((s->flags & BSF_LOCAL) == 0)
2190 s->flags |= BSF_GLOBAL;
2191 s->flags |= BSF_SYNTHETIC;
2192 /* This is no longer a section symbol. */
2193 s->flags &= ~BSF_SECTION_SYM;
2195 s->the_bfd = plt->owner;
2199 len = strlen ((*p->sym_ptr_ptr)->name);
2200 memcpy (names, (*p->sym_ptr_ptr)->name, len);
2206 memcpy (names, "+0x", sizeof ("+0x") - 1);
2207 names += sizeof ("+0x") - 1;
2208 bfd_sprintf_vma (abfd, buf, p->addend);
2209 for (a = buf; *a == '0'; ++a)
2212 memcpy (names, a, size);
2215 memcpy (names, "@plt", sizeof ("@plt"));
2216 names += sizeof ("@plt");
2219 /* There should be only one entry in PLT for a given
2220 symbol. Set howto to NULL after processing a PLT
2221 entry to guard against corrupted PLT. */
2224 offset += plt_entry_size;
2228 /* PLT entries with R_386_TLS_DESC relocations are skipped. */
2237 for (j = 0; plts[j].name != NULL; j++)
2238 if (plts[j].contents != NULL)
2239 free (plts[j].contents);
2246 /* Parse x86 GNU properties. */
2248 enum elf_property_kind
2249 _bfd_x86_elf_parse_gnu_properties (bfd *abfd, unsigned int type,
2250 bfd_byte *ptr, unsigned int datasz)
2256 case GNU_PROPERTY_X86_ISA_1_USED:
2257 case GNU_PROPERTY_X86_ISA_1_NEEDED:
2258 case GNU_PROPERTY_X86_FEATURE_1_AND:
2262 ((type == GNU_PROPERTY_X86_ISA_1_USED
2263 ? _("error: %B: <corrupt x86 ISA used size: 0x%x>")
2264 : (type == GNU_PROPERTY_X86_ISA_1_NEEDED
2265 ? _("error: %B: <corrupt x86 ISA needed size: 0x%x>")
2266 : _("error: %B: <corrupt x86 feature size: 0x%x>"))),
2268 return property_corrupt;
2270 prop = _bfd_elf_get_property (abfd, type, datasz);
2271 /* Combine properties of the same type. */
2272 prop->u.number |= bfd_h_get_32 (abfd, ptr);
2273 prop->pr_kind = property_number;
2277 return property_ignored;
2280 return property_number;
2283 /* Merge x86 GNU property BPROP with APROP. If APROP isn't NULL,
2284 return TRUE if APROP is updated. Otherwise, return TRUE if BPROP
2285 should be merged with ABFD. */
2288 _bfd_x86_elf_merge_gnu_properties (struct bfd_link_info *info,
2289 bfd *abfd ATTRIBUTE_UNUSED,
2290 elf_property *aprop,
2291 elf_property *bprop)
2293 unsigned int number, features;
2294 bfd_boolean updated = FALSE;
2295 unsigned int pr_type = aprop != NULL ? aprop->pr_type : bprop->pr_type;
2299 case GNU_PROPERTY_X86_ISA_1_USED:
2300 case GNU_PROPERTY_X86_ISA_1_NEEDED:
2301 if (aprop != NULL && bprop != NULL)
2303 number = aprop->u.number;
2304 aprop->u.number = number | bprop->u.number;
2305 updated = number != (unsigned int) aprop->u.number;
2309 /* Return TRUE if APROP is NULL to indicate that BPROP should
2310 be added to ABFD. */
2311 updated = aprop == NULL;
2315 case GNU_PROPERTY_X86_FEATURE_1_AND:
2316 /* Only one of APROP and BPROP can be NULL:
2317 1. APROP & BPROP when both APROP and BPROP aren't NULL.
2318 2. If APROP is NULL, remove x86 feature.
2319 3. Otherwise, do nothing.
2321 if (aprop != NULL && bprop != NULL)
2325 features = GNU_PROPERTY_X86_FEATURE_1_IBT;
2327 features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
2328 number = aprop->u.number;
2329 /* Add GNU_PROPERTY_X86_FEATURE_1_IBT and
2330 GNU_PROPERTY_X86_FEATURE_1_SHSTK. */
2331 aprop->u.number = (number & bprop->u.number) | features;
2332 updated = number != (unsigned int) aprop->u.number;
2333 /* Remove the property if all feature bits are cleared. */
2334 if (aprop->u.number == 0)
2335 aprop->pr_kind = property_remove;
2341 features = GNU_PROPERTY_X86_FEATURE_1_IBT;
2343 features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
2346 /* Add GNU_PROPERTY_X86_FEATURE_1_IBT and
2347 GNU_PROPERTY_X86_FEATURE_1_SHSTK. */
2350 number = aprop->u.number;
2351 aprop->u.number = number | features;
2352 updated = number != (unsigned int) aprop->u.number;
2356 bprop->u.number |= features;
2360 else if (aprop != NULL)
2362 aprop->pr_kind = property_remove;
2369 /* Never should happen. */
2376 /* Set up x86 GNU properties. Return the first relocatable ELF input
2377 with GNU properties if found. Otherwise, return NULL. */
2380 _bfd_x86_elf_link_setup_gnu_properties
2381 (struct bfd_link_info *info, struct elf_x86_init_table *init_table)
2383 bfd_boolean normal_target;
2384 bfd_boolean lazy_plt;
2385 asection *sec, *pltsec;
2387 bfd_boolean use_ibt_plt;
2388 unsigned int plt_alignment, features;
2389 struct elf_x86_link_hash_table *htab;
2393 const struct elf_backend_data *bed;
2394 unsigned int class_align = ABI_64_P (info->output_bfd) ? 3 : 2;
2395 unsigned int got_align;
2399 features = GNU_PROPERTY_X86_FEATURE_1_IBT;
2401 features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
2403 /* Find a normal input file with GNU property note. */
2404 for (pbfd = info->input_bfds;
2406 pbfd = pbfd->link.next)
2407 if (bfd_get_flavour (pbfd) == bfd_target_elf_flavour
2408 && bfd_count_sections (pbfd) != 0)
2412 if (elf_properties (pbfd) != NULL)
2416 if (ebfd != NULL && features)
2418 /* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT and
2419 GNU_PROPERTY_X86_FEATURE_1_SHSTK. */
2420 prop = _bfd_elf_get_property (ebfd,
2421 GNU_PROPERTY_X86_FEATURE_1_AND,
2423 prop->u.number |= features;
2424 prop->pr_kind = property_number;
2426 /* Create the GNU property note section if needed. */
2429 sec = bfd_make_section_with_flags (ebfd,
2430 NOTE_GNU_PROPERTY_SECTION_NAME,
2438 info->callbacks->einfo (_("%F%P: failed to create GNU property section\n"));
2440 if (!bfd_set_section_alignment (ebfd, sec, class_align))
2443 info->callbacks->einfo (_("%F%A: failed to align section\n"),
2447 elf_section_type (sec) = SHT_NOTE;
2451 pbfd = _bfd_elf_link_setup_gnu_properties (info);
2453 bed = get_elf_backend_data (info->output_bfd);
2455 htab = elf_x86_hash_table (info, bed->target_id);
2459 htab->r_info = init_table->r_info;
2460 htab->r_sym = init_table->r_sym;
2462 if (bfd_link_relocatable (info))
2465 htab->plt0_pad_byte = init_table->plt0_pad_byte;
2467 use_ibt_plt = info->ibtplt || info->ibt;
2468 if (!use_ibt_plt && pbfd != NULL)
2470 /* Check if GNU_PROPERTY_X86_FEATURE_1_IBT is on. */
2471 elf_property_list *p;
2473 /* The property list is sorted in order of type. */
2474 for (p = elf_properties (pbfd); p; p = p->next)
2476 if (GNU_PROPERTY_X86_FEATURE_1_AND == p->property.pr_type)
2478 use_ibt_plt = !!(p->property.u.number
2479 & GNU_PROPERTY_X86_FEATURE_1_IBT);
2482 else if (GNU_PROPERTY_X86_FEATURE_1_AND < p->property.pr_type)
2487 dynobj = htab->elf.dynobj;
2489 /* Set htab->elf.dynobj here so that there is no need to check and
2490 set it in check_relocs. */
2495 htab->elf.dynobj = pbfd;
2502 /* Find a normal input file to hold linker created
2504 for (abfd = info->input_bfds;
2506 abfd = abfd->link.next)
2507 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2509 & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0)
2511 htab->elf.dynobj = abfd;
2518 /* Return if there are no normal input files. */
2522 /* Even when lazy binding is disabled by "-z now", the PLT0 entry may
2523 still be used with LD_AUDIT or LD_PROFILE if PLT entry is used for
2524 canonical function address. */
2525 htab->plt.has_plt0 = 1;
2526 normal_target = htab->target_os == is_normal;
2532 htab->lazy_plt = init_table->lazy_ibt_plt;
2533 htab->non_lazy_plt = init_table->non_lazy_ibt_plt;
2537 htab->lazy_plt = init_table->lazy_plt;
2538 htab->non_lazy_plt = init_table->non_lazy_plt;
2543 htab->lazy_plt = init_table->lazy_plt;
2544 htab->non_lazy_plt = NULL;
2547 pltsec = htab->elf.splt;
2549 /* If the non-lazy PLT is available, use it for all PLT entries if
2550 there are no PLT0 or no .plt section. */
2551 if (htab->non_lazy_plt != NULL
2552 && (!htab->plt.has_plt0 || pltsec == NULL))
2555 if (bfd_link_pic (info))
2556 htab->plt.plt_entry = htab->non_lazy_plt->pic_plt_entry;
2558 htab->plt.plt_entry = htab->non_lazy_plt->plt_entry;
2559 htab->plt.plt_entry_size = htab->non_lazy_plt->plt_entry_size;
2560 htab->plt.plt_got_offset = htab->non_lazy_plt->plt_got_offset;
2561 htab->plt.plt_got_insn_size
2562 = htab->non_lazy_plt->plt_got_insn_size;
2563 htab->plt.eh_frame_plt_size
2564 = htab->non_lazy_plt->eh_frame_plt_size;
2565 htab->plt.eh_frame_plt = htab->non_lazy_plt->eh_frame_plt;
2570 if (bfd_link_pic (info))
2572 htab->plt.plt0_entry = htab->lazy_plt->pic_plt0_entry;
2573 htab->plt.plt_entry = htab->lazy_plt->pic_plt_entry;
2577 htab->plt.plt0_entry = htab->lazy_plt->plt0_entry;
2578 htab->plt.plt_entry = htab->lazy_plt->plt_entry;
2580 htab->plt.plt_entry_size = htab->lazy_plt->plt_entry_size;
2581 htab->plt.plt_got_offset = htab->lazy_plt->plt_got_offset;
2582 htab->plt.plt_got_insn_size
2583 = htab->lazy_plt->plt_got_insn_size;
2584 htab->plt.eh_frame_plt_size
2585 = htab->lazy_plt->eh_frame_plt_size;
2586 htab->plt.eh_frame_plt = htab->lazy_plt->eh_frame_plt;
2589 if (htab->target_os == is_vxworks
2590 && !elf_vxworks_create_dynamic_sections (dynobj, info,
2593 info->callbacks->einfo (_("%F%P: failed to create VxWorks dynamic sections\n"));
2597 /* Since create_dynamic_sections isn't always called, but GOT
2598 relocations need GOT relocations, create them here so that we
2599 don't need to do it in check_relocs. */
2600 if (htab->elf.sgot == NULL
2601 && !_bfd_elf_create_got_section (dynobj, info))
2602 info->callbacks->einfo (_("%F%P: failed to create GOT sections\n"));
2604 got_align = (bed->target_id == X86_64_ELF_DATA) ? 3 : 2;
2606 /* Align .got and .got.plt sections to their entry size. Do it here
2607 instead of in create_dynamic_sections so that they are always
2608 properly aligned even if create_dynamic_sections isn't called. */
2609 sec = htab->elf.sgot;
2610 if (!bfd_set_section_alignment (dynobj, sec, got_align))
2611 goto error_alignment;
2613 sec = htab->elf.sgotplt;
2614 if (!bfd_set_section_alignment (dynobj, sec, got_align))
2615 goto error_alignment;
2617 /* Create the ifunc sections here so that check_relocs can be
2619 if (!_bfd_elf_create_ifunc_sections (dynobj, info))
2620 info->callbacks->einfo (_("%F%P: failed to create ifunc sections\n"));
2622 plt_alignment = bfd_log2 (htab->plt.plt_entry_size);
2626 /* Whe creating executable, set the contents of the .interp
2627 section to the interpreter. */
2628 if (bfd_link_executable (info) && !info->nointerp)
2630 asection *s = bfd_get_linker_section (dynobj, ".interp");
2633 s->size = htab->dynamic_interpreter_size;
2634 s->contents = (unsigned char *) htab->dynamic_interpreter;
2638 /* Don't change PLT section alignment for NaCl since it uses
2639 64-byte PLT entry and sets PLT section alignment to 32
2640 bytes. Don't create additional PLT sections for NaCl. */
2643 flagword pltflags = (bed->dynamic_sec_flags
2648 unsigned int non_lazy_plt_alignment
2649 = bfd_log2 (htab->non_lazy_plt->plt_entry_size);
2652 if (!bfd_set_section_alignment (sec->owner, sec,
2654 goto error_alignment;
2656 /* Create the GOT procedure linkage table. */
2657 sec = bfd_make_section_anyway_with_flags (dynobj,
2661 info->callbacks->einfo (_("%F%P: failed to create GOT PLT section\n"));
2663 if (!bfd_set_section_alignment (dynobj, sec,
2664 non_lazy_plt_alignment))
2665 goto error_alignment;
2667 htab->plt_got = sec;
2675 /* Create the second PLT for Intel IBT support. IBT
2676 PLT is supported only for non-NaCl target and is
2677 is needed only for lazy binding. */
2678 sec = bfd_make_section_anyway_with_flags (dynobj,
2682 info->callbacks->einfo (_("%F%P: failed to create IBT-enabled PLT section\n"));
2684 if (!bfd_set_section_alignment (dynobj, sec,
2686 goto error_alignment;
2688 else if (info->bndplt && ABI_64_P (dynobj))
2690 /* Create the second PLT for Intel MPX support. MPX
2691 PLT is supported only for non-NaCl target in 64-bit
2692 mode and is needed only for lazy binding. */
2693 sec = bfd_make_section_anyway_with_flags (dynobj,
2697 info->callbacks->einfo (_("%F%P: failed to create BND PLT section\n"));
2699 if (!bfd_set_section_alignment (dynobj, sec,
2700 non_lazy_plt_alignment))
2701 goto error_alignment;
2704 htab->plt_second = sec;
2708 if (!info->no_ld_generated_unwind_info)
2710 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
2711 | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2712 | SEC_LINKER_CREATED);
2714 sec = bfd_make_section_anyway_with_flags (dynobj,
2718 info->callbacks->einfo (_("%F%P: failed to create PLT .eh_frame section\n"));
2720 if (!bfd_set_section_alignment (dynobj, sec, class_align))
2721 goto error_alignment;
2723 htab->plt_eh_frame = sec;
2725 if (htab->plt_got != NULL)
2727 sec = bfd_make_section_anyway_with_flags (dynobj,
2731 info->callbacks->einfo (_("%F%P: failed to create GOT PLT .eh_frame section\n"));
2733 if (!bfd_set_section_alignment (dynobj, sec, class_align))
2734 goto error_alignment;
2736 htab->plt_got_eh_frame = sec;
2739 if (htab->plt_second != NULL)
2741 sec = bfd_make_section_anyway_with_flags (dynobj,
2745 info->callbacks->einfo (_("%F%P: failed to create the second PLT .eh_frame section\n"));
2747 if (!bfd_set_section_alignment (dynobj, sec, class_align))
2748 goto error_alignment;
2750 htab->plt_second_eh_frame = sec;
2757 /* The .iplt section is used for IFUNC symbols in static
2759 sec = htab->elf.iplt;
2761 && !bfd_set_section_alignment (sec->owner, sec,
2763 goto error_alignment;