FT32B is a new FT32 family member. It has a code compression scheme, which requires...
[external/binutils.git] / bfd / elfxx-x86.c
1 /* x86 specific support for ELF
2    Copyright (C) 2017 Free Software Foundation, Inc.
3
4    This file is part of BFD, the Binary File Descriptor library.
5
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.
10
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.
15
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.  */
20
21 #include "elfxx-x86.h"
22 #include "elf-vxworks.h"
23 #include "objalloc.h"
24 #include "elf/i386.h"
25 #include "elf/x86-64.h"
26
27 /* The name of the dynamic interpreter.  This is put in the .interp
28    section.  */
29
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"
33
34 bfd_boolean
35 _bfd_x86_elf_mkobject (bfd *abfd)
36 {
37   return bfd_elf_allocate_object (abfd,
38                                   sizeof (struct elf_x86_obj_tdata),
39                                   get_elf_backend_data (abfd)->target_id);
40 }
41
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.  */
46
47 void
48 _bfd_x86_elf_set_tls_module_base (struct bfd_link_info *info)
49 {
50   struct elf_x86_link_hash_table *htab;
51   struct bfd_link_hash_entry *base;
52   const struct elf_backend_data *bed;
53
54   if (!bfd_link_executable (info))
55     return;
56
57   bed = get_elf_backend_data (info->output_bfd);
58   htab = elf_x86_hash_table (info, bed->target_id);
59   if (htab == NULL)
60     return;
61
62   base = htab->tls_module_base;
63   if (base == NULL)
64     return;
65
66   base->u.def.value = htab->elf.tls_size;
67 }
68
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.  */
72
73 bfd_vma
74 _bfd_x86_elf_dtpoff_base (struct bfd_link_info *info)
75 {
76   /* If tls_sec is NULL, we should have signalled an error already.  */
77   if (elf_hash_table (info)->tls_sec == NULL)
78     return 0;
79   return elf_hash_table (info)->tls_sec->vma;
80 }
81
82 /* Allocate space in .plt, .got and associated reloc sections for
83    dynamic relocs.  */
84
85 static bfd_boolean
86 elf_x86_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
87 {
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;
95
96   if (h->root.type == bfd_link_hash_indirect)
97     return TRUE;
98
99   eh = (struct elf_x86_link_hash_entry *) h;
100
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);
104   if (htab == NULL)
105     return FALSE;
106
107   plt_entry_size = htab->plt.plt_entry_size;
108
109   resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
110
111   /* Clear the reference count of function pointer relocations if
112      symbol isn't a normal function.  */
113   if (h->type != STT_FUNC)
114     eh->func_pointer_refcount = 0;
115
116   /* We can't use the GOT PLT if pointer equality is needed since
117      finish_dynamic_symbol won't clear symbol value and the dynamic
118      linker won't update the GOT slot.  We will get into an infinite
119      loop at run-time.  */
120   if (htab->plt_got != NULL
121       && h->type != STT_GNU_IFUNC
122       && !h->pointer_equality_needed
123       && h->plt.refcount > 0
124       && h->got.refcount > 0)
125     {
126       /* Don't use the regular PLT if there are both GOT and GOTPLT
127          reloctions.  */
128       h->plt.offset = (bfd_vma) -1;
129
130       /* Use the GOT PLT.  */
131       eh->plt_got.refcount = 1;
132     }
133
134   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
135      here if it is defined and referenced in a non-shared object.  */
136   if (h->type == STT_GNU_IFUNC
137       && h->def_regular)
138     {
139       if (_bfd_elf_allocate_ifunc_dyn_relocs (info, h, &eh->dyn_relocs,
140                                               &htab->readonly_dynrelocs_against_ifunc,
141                                               plt_entry_size,
142                                               (htab->plt.has_plt0
143                                                * plt_entry_size),
144                                                htab->got_entry_size,
145                                                TRUE))
146         {
147           asection *s = htab->plt_second;
148           if (h->plt.offset != (bfd_vma) -1 && s != NULL)
149             {
150               /* Use the second PLT section if it is created.  */
151               eh->plt_second.offset = s->size;
152
153               /* Make room for this entry in the second PLT section.  */
154               s->size += htab->non_lazy_plt->plt_entry_size;
155             }
156
157           return TRUE;
158         }
159       else
160         return FALSE;
161     }
162   /* Don't create the PLT entry if there are only function pointer
163      relocations which can be resolved at run-time.  */
164   else if (htab->elf.dynamic_sections_created
165            && (h->plt.refcount > eh->func_pointer_refcount
166                || eh->plt_got.refcount > 0))
167     {
168       bfd_boolean use_plt_got = eh->plt_got.refcount > 0;
169
170       /* Clear the reference count of function pointer relocations
171          if PLT is used.  */
172       eh->func_pointer_refcount = 0;
173
174       /* Make sure this symbol is output as a dynamic symbol.
175          Undefined weak syms won't yet be marked as dynamic.  */
176       if (h->dynindx == -1
177           && !h->forced_local
178           && !resolved_to_zero
179           && h->root.type == bfd_link_hash_undefweak)
180         {
181           if (! bfd_elf_link_record_dynamic_symbol (info, h))
182             return FALSE;
183         }
184
185       if (bfd_link_pic (info)
186           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
187         {
188           asection *s = htab->elf.splt;
189           asection *second_s = htab->plt_second;
190           asection *got_s = htab->plt_got;
191
192           /* If this is the first .plt entry, make room for the special
193              first entry.  The .plt section is used by prelink to undo
194              prelinking for dynamic relocations.  */
195           if (s->size == 0)
196             s->size = htab->plt.has_plt0 * plt_entry_size;
197
198           if (use_plt_got)
199             eh->plt_got.offset = got_s->size;
200           else
201             {
202               h->plt.offset = s->size;
203               if (second_s)
204                 eh->plt_second.offset = second_s->size;
205             }
206
207           /* If this symbol is not defined in a regular file, and we are
208              not generating a shared library, then set the symbol to this
209              location in the .plt.  This is required to make function
210              pointers compare as equal between the normal executable and
211              the shared library.  */
212           if (! bfd_link_pic (info)
213               && !h->def_regular)
214             {
215               if (use_plt_got)
216                 {
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;
221                 }
222               else
223                 {
224                   if (second_s)
225                     {
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;
230                     }
231                   else
232                     {
233                       h->root.u.def.section = s;
234                       h->root.u.def.value = h->plt.offset;
235                     }
236                 }
237             }
238
239           /* Make room for this entry.  */
240           if (use_plt_got)
241             got_s->size += htab->non_lazy_plt->plt_entry_size;
242           else
243             {
244               s->size += plt_entry_size;
245               if (second_s)
246                 second_s->size += htab->non_lazy_plt->plt_entry_size;
247
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
250                  script.  */
251               htab->elf.sgotplt->size += htab->got_entry_size;
252
253               /* There should be no PLT relocation against resolved
254                  undefined weak symbol in executable.  */
255               if (!resolved_to_zero)
256                 {
257                   /* We also need to make an entry in the .rel.plt
258                      section.  */
259                   htab->elf.srelplt->size += htab->sizeof_reloc;
260                   htab->elf.srelplt->reloc_count++;
261                 }
262             }
263
264           if (htab->target_os == is_vxworks && !bfd_link_pic (info))
265             {
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.  */
269
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.  */
273
274               asection *srelplt2 = htab->srelplt2;
275               if (h->plt.offset == plt_entry_size)
276                 srelplt2->size += (htab->sizeof_reloc * 2);
277
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.  */
281
282               srelplt2->size += (htab->sizeof_reloc * 2);
283             }
284         }
285       else
286         {
287           eh->plt_got.offset = (bfd_vma) -1;
288           h->plt.offset = (bfd_vma) -1;
289           h->needs_plt = 0;
290         }
291     }
292   else
293     {
294       eh->plt_got.offset = (bfd_vma) -1;
295       h->plt.offset = (bfd_vma) -1;
296       h->needs_plt = 0;
297     }
298
299   eh->tlsdesc_got = (bfd_vma) -1;
300
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)
307       && h->dynindx == -1
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)
311     {
312       asection *s;
313       bfd_boolean dyn;
314       int tls_type = elf_x86_hash_entry (h)->tls_type;
315
316       /* Make sure this symbol is output as a dynamic symbol.
317          Undefined weak syms won't yet be marked as dynamic.  */
318       if (h->dynindx == -1
319           && !h->forced_local
320           && !resolved_to_zero
321           && h->root.type == bfd_link_hash_undefweak)
322         {
323           if (! bfd_elf_link_record_dynamic_symbol (info, h))
324             return FALSE;
325         }
326
327       s = htab->elf.sgot;
328       if (GOT_TLS_GDESC_P (tls_type))
329         {
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;
334         }
335       if (! GOT_TLS_GDESC_P (tls_type)
336           || GOT_TLS_GD_P (tls_type))
337         {
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
341              slots.  */
342           if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH)
343             s->size += htab->got_entry_size;
344         }
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.  */
352       if (tls_type == GOT_TLS_IE_BOTH)
353         htab->elf.srelgot->size += 2 * htab->sizeof_reloc;
354       else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
355                || (tls_type & GOT_TLS_IE))
356         htab->elf.srelgot->size += htab->sizeof_reloc;
357       else if (GOT_TLS_GD_P (tls_type))
358         htab->elf.srelgot->size += 2 * htab->sizeof_reloc;
359       else if (! GOT_TLS_GDESC_P (tls_type)
360                && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
361                     && !resolved_to_zero)
362                    || h->root.type != bfd_link_hash_undefweak)
363                && (bfd_link_pic (info)
364                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
365         htab->elf.srelgot->size += htab->sizeof_reloc;
366       if (GOT_TLS_GDESC_P (tls_type))
367         {
368           htab->elf.srelplt->size += htab->sizeof_reloc;
369           if (bed->target_id == X86_64_ELF_DATA)
370             htab->tlsdesc_plt = (bfd_vma) -1;
371         }
372     }
373   else
374     h->got.offset = (bfd_vma) -1;
375
376   if (eh->dyn_relocs == NULL)
377     return TRUE;
378
379   /* In the shared -Bsymbolic case, discard space allocated for
380      dynamic pc-relative relocs against symbols which turn out to be
381      defined in regular objects.  For the normal shared case, discard
382      space for pc-relative relocs that have become local due to symbol
383      visibility changes.  */
384
385   if (bfd_link_pic (info))
386     {
387       /* Relocs that use pc_count are those that appear on a call
388          insn, or certain REL relocs that can generated via assembly.
389          We want calls to protected symbols to resolve directly to the
390          function rather than going via the plt.  If people want
391          function pointer comparisons to work as expected then they
392          should avoid writing weird assembly.  */
393       if (SYMBOL_CALLS_LOCAL (info, h))
394         {
395           struct elf_dyn_relocs **pp;
396
397           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
398             {
399               p->count -= p->pc_count;
400               p->pc_count = 0;
401               if (p->count == 0)
402                 *pp = p->next;
403               else
404                 pp = &p->next;
405             }
406         }
407
408       if (htab->target_os == is_vxworks)
409         {
410           struct elf_dyn_relocs **pp;
411           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
412             {
413               if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
414                 *pp = p->next;
415               else
416                 pp = &p->next;
417             }
418         }
419
420       /* Also discard relocs on undefined weak syms with non-default
421          visibility or in PIE.  */
422       if (eh->dyn_relocs != NULL)
423         {
424           if (h->root.type == bfd_link_hash_undefweak)
425             {
426               /* Undefined weak symbol is never bound locally in shared
427                  library.  */
428               if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
429                   || resolved_to_zero)
430                 {
431                   if (bed->target_id == I386_ELF_DATA
432                       && h->non_got_ref)
433                     {
434                       /* Keep dynamic non-GOT/non-PLT relocation so
435                          that we can branch to 0 without PLT.  */
436                       struct elf_dyn_relocs **pp;
437
438                       for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
439                         if (p->pc_count == 0)
440                           *pp = p->next;
441                         else
442                           {
443                             /* Remove non-R_386_PC32 relocation.  */
444                             p->count = p->pc_count;
445                             pp = &p->next;
446                           }
447
448                       /* Make sure undefined weak symbols are output
449                          as dynamic symbols in PIEs for dynamic non-GOT
450                          non-PLT reloations.  */
451                       if (eh->dyn_relocs != NULL
452                           && !bfd_elf_link_record_dynamic_symbol (info, h))
453                         return FALSE;
454                     }
455                   else
456                     eh->dyn_relocs = NULL;
457                 }
458               else if (h->dynindx == -1
459                        && !h->forced_local
460                        && !bfd_elf_link_record_dynamic_symbol (info, h))
461                 return FALSE;
462             }
463           else if (bfd_link_executable (info)
464                    && (h->needs_copy || eh->needs_copy)
465                    && h->def_dynamic
466                    && !h->def_regular)
467             {
468               /* NB: needs_copy is set only for x86-64.  For PIE,
469                  discard space for pc-relative relocs against symbols
470                  which turn out to need copy relocs.  */
471               struct elf_dyn_relocs **pp;
472
473               for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
474                 {
475                   if (p->pc_count != 0)
476                     *pp = p->next;
477                   else
478                     pp = &p->next;
479                 }
480             }
481         }
482     }
483   else if (ELIMINATE_COPY_RELOCS)
484     {
485       /* For the non-shared case, discard space for relocs against
486          symbols which turn out to need copy relocs or are not
487          dynamic.  Keep dynamic relocations for run-time function
488          pointer initialization.  */
489
490       if ((!h->non_got_ref
491            || eh->func_pointer_refcount > 0
492            || (h->root.type == bfd_link_hash_undefweak
493                && !resolved_to_zero))
494           && ((h->def_dynamic
495                && !h->def_regular)
496               || (htab->elf.dynamic_sections_created
497                   && (h->root.type == bfd_link_hash_undefweak
498                       || h->root.type == bfd_link_hash_undefined))))
499         {
500           /* Make sure this symbol is output as a dynamic symbol.
501              Undefined weak syms won't yet be marked as dynamic.  */
502           if (h->dynindx == -1
503               && !h->forced_local
504               && !resolved_to_zero
505               && h->root.type == bfd_link_hash_undefweak
506               && ! bfd_elf_link_record_dynamic_symbol (info, h))
507             return FALSE;
508
509           /* If that succeeded, we know we'll be keeping all the
510              relocs.  */
511           if (h->dynindx != -1)
512             goto keep;
513         }
514
515       eh->dyn_relocs = NULL;
516       eh->func_pointer_refcount = 0;
517
518     keep: ;
519     }
520
521   /* Finally, allocate space.  */
522   for (p = eh->dyn_relocs; p != NULL; p = p->next)
523     {
524       asection *sreloc;
525
526       sreloc = elf_section_data (p->sec)->sreloc;
527
528       BFD_ASSERT (sreloc != NULL);
529       sreloc->size += p->count * htab->sizeof_reloc;
530     }
531
532   return TRUE;
533 }
534
535 /* Find any dynamic relocs that apply to read-only sections.  */
536
537 bfd_boolean
538 _bfd_x86_elf_readonly_dynrelocs (struct elf_link_hash_entry *h,
539                                  void *inf)
540 {
541   struct elf_x86_link_hash_entry *eh;
542   struct elf_dyn_relocs *p;
543
544   /* Skip local IFUNC symbols. */
545   if (h->forced_local && h->type == STT_GNU_IFUNC)
546     return TRUE;
547
548   eh = (struct elf_x86_link_hash_entry *) h;
549   for (p = eh->dyn_relocs; p != NULL; p = p->next)
550     {
551       asection *s = p->sec->output_section;
552
553       if (s != NULL && (s->flags & SEC_READONLY) != 0)
554         {
555           struct bfd_link_info *info = (struct bfd_link_info *) inf;
556
557           info->flags |= DF_TEXTREL;
558
559           if ((info->warn_shared_textrel && bfd_link_pic (info))
560               || info->error_textrel)
561             /* xgettext:c-format */
562             info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
563                                     p->sec->owner, h->root.root.string,
564                                     p->sec);
565
566           /* Not an error, just cut short the traversal.  */
567           return FALSE;
568         }
569     }
570   return TRUE;
571 }
572
573 /* Allocate space in .plt, .got and associated reloc sections for
574    local dynamic relocs.  */
575
576 static bfd_boolean
577 elf_x86_allocate_local_dynreloc (void **slot, void *inf)
578 {
579   struct elf_link_hash_entry *h
580     = (struct elf_link_hash_entry *) *slot;
581
582   if (h->type != STT_GNU_IFUNC
583       || !h->def_regular
584       || !h->ref_regular
585       || !h->forced_local
586       || h->root.type != bfd_link_hash_defined)
587     abort ();
588
589   return elf_x86_allocate_dynrelocs (h, inf);
590 }
591
592 /* Find and/or create a hash entry for local symbol.  */
593
594 struct elf_link_hash_entry *
595 _bfd_elf_x86_get_local_sym_hash (struct elf_x86_link_hash_table *htab,
596                                  bfd *abfd, const Elf_Internal_Rela *rel,
597                                  bfd_boolean create)
598 {
599   struct elf_x86_link_hash_entry e, *ret;
600   asection *sec = abfd->sections;
601   hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
602                                        htab->r_sym (rel->r_info));
603   void **slot;
604
605   e.elf.indx = sec->id;
606   e.elf.dynstr_index = htab->r_sym (rel->r_info);
607   slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
608                                    create ? INSERT : NO_INSERT);
609
610   if (!slot)
611     return NULL;
612
613   if (*slot)
614     {
615       ret = (struct elf_x86_link_hash_entry *) *slot;
616       return &ret->elf;
617     }
618
619   ret = (struct elf_x86_link_hash_entry *)
620         objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
621                         sizeof (struct elf_x86_link_hash_entry));
622   if (ret)
623     {
624       memset (ret, 0, sizeof (*ret));
625       ret->elf.indx = sec->id;
626       ret->elf.dynstr_index = htab->r_sym (rel->r_info);
627       ret->elf.dynindx = -1;
628       ret->plt_got.offset = (bfd_vma) -1;
629       *slot = ret;
630     }
631   return &ret->elf;
632 }
633
634 /* Create an entry in a x86 ELF linker hash table.  NB: THIS MUST BE IN
635    SYNC WITH _bfd_elf_link_hash_newfunc.  */
636
637 struct bfd_hash_entry *
638 _bfd_x86_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
639                                 struct bfd_hash_table *table,
640                                 const char *string)
641 {
642   /* Allocate the structure if it has not already been allocated by a
643      subclass.  */
644   if (entry == NULL)
645     {
646       entry = (struct bfd_hash_entry *)
647         bfd_hash_allocate (table,
648                            sizeof (struct elf_x86_link_hash_entry));
649       if (entry == NULL)
650         return entry;
651     }
652
653   /* Call the allocation method of the superclass.  */
654   entry = _bfd_link_hash_newfunc (entry, table, string);
655   if (entry != NULL)
656     {
657       struct elf_x86_link_hash_entry *eh
658        = (struct elf_x86_link_hash_entry *) entry;
659       struct elf_link_hash_table *htab
660         = (struct elf_link_hash_table *) table;
661
662       memset (&eh->elf.size, 0,
663               (sizeof (struct elf_x86_link_hash_entry)
664                - offsetof (struct elf_link_hash_entry, size)));
665       /* Set local fields.  */
666       eh->elf.indx = -1;
667       eh->elf.dynindx = -1;
668       eh->elf.got = htab->init_got_refcount;
669       eh->elf.plt = htab->init_plt_refcount;
670       /* Assume that we have been called by a non-ELF symbol reader.
671          This flag is then reset by the code which reads an ELF input
672          file.  This ensures that a symbol created by a non-ELF symbol
673          reader will have the flag set correctly.  */
674       eh->elf.non_elf = 1;
675       eh->plt_second.offset = (bfd_vma) -1;
676       eh->plt_got.offset = (bfd_vma) -1;
677       eh->tlsdesc_got = (bfd_vma) -1;
678       eh->zero_undefweak = 1;
679     }
680
681   return entry;
682 }
683
684 /* Compute a hash of a local hash entry.  We use elf_link_hash_entry
685   for local symbol so that we can handle local STT_GNU_IFUNC symbols
686   as global symbol.  We reuse indx and dynstr_index for local symbol
687   hash since they aren't used by global symbols in this backend.  */
688
689 hashval_t
690 _bfd_x86_elf_local_htab_hash (const void *ptr)
691 {
692   struct elf_link_hash_entry *h
693     = (struct elf_link_hash_entry *) ptr;
694   return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
695 }
696
697 /* Compare local hash entries.  */
698
699 int
700 _bfd_x86_elf_local_htab_eq (const void *ptr1, const void *ptr2)
701 {
702   struct elf_link_hash_entry *h1
703      = (struct elf_link_hash_entry *) ptr1;
704   struct elf_link_hash_entry *h2
705     = (struct elf_link_hash_entry *) ptr2;
706
707   return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
708 }
709
710 /* Destroy an x86 ELF linker hash table.  */
711
712 static void
713 elf_x86_link_hash_table_free (bfd *obfd)
714 {
715   struct elf_x86_link_hash_table *htab
716     = (struct elf_x86_link_hash_table *) obfd->link.hash;
717
718   if (htab->loc_hash_table)
719     htab_delete (htab->loc_hash_table);
720   if (htab->loc_hash_memory)
721     objalloc_free ((struct objalloc *) htab->loc_hash_memory);
722   _bfd_elf_link_hash_table_free (obfd);
723 }
724
725 static bfd_boolean
726 elf_i386_is_reloc_section (const char *secname)
727 {
728   return CONST_STRNEQ (secname, ".rel");
729 }
730
731 static bfd_boolean
732 elf_x86_64_is_reloc_section (const char *secname)
733 {
734   return CONST_STRNEQ (secname, ".rela");
735 }
736
737 /* Create an x86 ELF linker hash table.  */
738
739 struct bfd_link_hash_table *
740 _bfd_x86_elf_link_hash_table_create (bfd *abfd)
741 {
742   struct elf_x86_link_hash_table *ret;
743   const struct elf_backend_data *bed;
744   bfd_size_type amt = sizeof (struct elf_x86_link_hash_table);
745
746   ret = (struct elf_x86_link_hash_table *) bfd_zmalloc (amt);
747   if (ret == NULL)
748     return NULL;
749
750   bed = get_elf_backend_data (abfd);
751   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
752                                       _bfd_x86_elf_link_hash_newfunc,
753                                       sizeof (struct elf_x86_link_hash_entry),
754                                       bed->target_id))
755     {
756       free (ret);
757       return NULL;
758     }
759
760   if (bed->target_id == X86_64_ELF_DATA)
761     {
762       ret->is_reloc_section = elf_x86_64_is_reloc_section;
763       ret->dt_reloc = DT_RELA;
764       ret->dt_reloc_sz = DT_RELASZ;
765       ret->dt_reloc_ent = DT_RELAENT;
766       ret->got_entry_size = 8;
767       ret->tls_get_addr = "__tls_get_addr";
768     }
769   if (ABI_64_P (abfd))
770     {
771       ret->sizeof_reloc = sizeof (Elf64_External_Rela);
772       ret->pointer_r_type = R_X86_64_64;
773       ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
774       ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
775     }
776   else
777     {
778       if (bed->target_id == X86_64_ELF_DATA)
779         {
780           ret->sizeof_reloc = sizeof (Elf32_External_Rela);
781           ret->pointer_r_type = R_X86_64_32;
782           ret->dynamic_interpreter = ELFX32_DYNAMIC_INTERPRETER;
783           ret->dynamic_interpreter_size
784             = sizeof ELFX32_DYNAMIC_INTERPRETER;
785         }
786       else
787         {
788           ret->is_reloc_section = elf_i386_is_reloc_section;
789           ret->dt_reloc = DT_REL;
790           ret->dt_reloc_sz = DT_RELSZ;
791           ret->dt_reloc_ent = DT_RELENT;
792           ret->sizeof_reloc = sizeof (Elf32_External_Rel);
793           ret->got_entry_size = 4;
794           ret->pointer_r_type = R_386_32;
795           ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
796           ret->dynamic_interpreter_size
797             = sizeof ELF32_DYNAMIC_INTERPRETER;
798           ret->tls_get_addr = "___tls_get_addr";
799         }
800     }
801   ret->target_id = bed->target_id;
802   ret->target_os = get_elf_x86_backend_data (abfd)->target_os;
803
804   ret->loc_hash_table = htab_try_create (1024,
805                                          _bfd_x86_elf_local_htab_hash,
806                                          _bfd_x86_elf_local_htab_eq,
807                                          NULL);
808   ret->loc_hash_memory = objalloc_create ();
809   if (!ret->loc_hash_table || !ret->loc_hash_memory)
810     {
811       elf_x86_link_hash_table_free (abfd);
812       return NULL;
813     }
814   ret->elf.root.hash_table_free = elf_x86_link_hash_table_free;
815
816   return &ret->elf.root;
817 }
818
819 /* Sort relocs into address order.  */
820
821 int
822 _bfd_x86_elf_compare_relocs (const void *ap, const void *bp)
823 {
824   const arelent *a = * (const arelent **) ap;
825   const arelent *b = * (const arelent **) bp;
826
827   if (a->address > b->address)
828     return 1;
829   else if (a->address < b->address)
830     return -1;
831   else
832     return 0;
833 }
834
835 bfd_boolean
836 _bfd_x86_elf_link_check_relocs (bfd *abfd, struct bfd_link_info *info)
837 {
838   if (!bfd_link_relocatable (info))
839     {
840       /* Check for __tls_get_addr reference.  */
841       struct elf_x86_link_hash_table *htab;
842       const struct elf_backend_data *bed = get_elf_backend_data (abfd);
843       htab = elf_x86_hash_table (info, bed->target_id);
844       if (htab)
845         {
846           struct elf_link_hash_entry *h;
847
848           h = elf_link_hash_lookup (elf_hash_table (info),
849                                     htab->tls_get_addr,
850                                     FALSE, FALSE, FALSE);
851           if (h != NULL)
852             elf_x86_hash_entry (h)->tls_get_addr = 1;
853
854           /* "__ehdr_start" will be defined by linker as a hidden symbol
855              later if it is referenced and not defined.  */
856           h = elf_link_hash_lookup (elf_hash_table (info),
857                                     "__ehdr_start",
858                                     FALSE, FALSE, FALSE);
859           if (h != NULL
860               && (h->root.type == bfd_link_hash_new
861                   || h->root.type == bfd_link_hash_undefined
862                   || h->root.type == bfd_link_hash_undefweak
863                   || h->root.type == bfd_link_hash_common))
864             {
865               elf_x86_hash_entry (h)->local_ref = 2;
866               elf_x86_hash_entry (h)->linker_def = 1;
867             }
868         }
869     }
870
871   /* Invoke the regular ELF backend linker to do all the work.  */
872   return _bfd_elf_link_check_relocs (abfd, info);
873 }
874
875 /* Set the sizes of the dynamic sections.  */
876
877 bfd_boolean
878 _bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
879                                     struct bfd_link_info *info)
880 {
881   struct elf_x86_link_hash_table *htab;
882   bfd *dynobj;
883   asection *s;
884   bfd_boolean relocs;
885   bfd *ibfd;
886   const struct elf_backend_data *bed
887     = get_elf_backend_data (output_bfd);
888
889   htab = elf_x86_hash_table (info, bed->target_id);
890   if (htab == NULL)
891     return FALSE;
892   dynobj = htab->elf.dynobj;
893   if (dynobj == NULL)
894     abort ();
895
896   /* Set up .got offsets for local syms, and space for local dynamic
897      relocs.  */
898   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
899     {
900       bfd_signed_vma *local_got;
901       bfd_signed_vma *end_local_got;
902       char *local_tls_type;
903       bfd_vma *local_tlsdesc_gotent;
904       bfd_size_type locsymcount;
905       Elf_Internal_Shdr *symtab_hdr;
906       asection *srel;
907
908       if (! is_x86_elf (ibfd, htab))
909         continue;
910
911       for (s = ibfd->sections; s != NULL; s = s->next)
912         {
913           struct elf_dyn_relocs *p;
914
915           for (p = ((struct elf_dyn_relocs *)
916                      elf_section_data (s)->local_dynrel);
917                p != NULL;
918                p = p->next)
919             {
920               if (!bfd_is_abs_section (p->sec)
921                   && bfd_is_abs_section (p->sec->output_section))
922                 {
923                   /* Input section has been discarded, either because
924                      it is a copy of a linkonce section or due to
925                      linker script /DISCARD/, so we'll be discarding
926                      the relocs too.  */
927                 }
928               else if (htab->target_os == is_vxworks
929                        && strcmp (p->sec->output_section->name,
930                                   ".tls_vars") == 0)
931                 {
932                   /* Relocations in vxworks .tls_vars sections are
933                      handled specially by the loader.  */
934                 }
935               else if (p->count != 0)
936                 {
937                   srel = elf_section_data (p->sec)->sreloc;
938                   srel->size += p->count * htab->sizeof_reloc;
939                   if ((p->sec->output_section->flags & SEC_READONLY) != 0
940                       && (info->flags & DF_TEXTREL) == 0)
941                     {
942                       info->flags |= DF_TEXTREL;
943                       if ((info->warn_shared_textrel && bfd_link_pic (info))
944                           || info->error_textrel)
945                         /* xgettext:c-format */
946                         info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"),
947                                                 p->sec->owner, p->sec);
948                     }
949                 }
950             }
951         }
952
953       local_got = elf_local_got_refcounts (ibfd);
954       if (!local_got)
955         continue;
956
957       symtab_hdr = &elf_symtab_hdr (ibfd);
958       locsymcount = symtab_hdr->sh_info;
959       end_local_got = local_got + locsymcount;
960       local_tls_type = elf_x86_local_got_tls_type (ibfd);
961       local_tlsdesc_gotent = elf_x86_local_tlsdesc_gotent (ibfd);
962       s = htab->elf.sgot;
963       srel = htab->elf.srelgot;
964       for (; local_got < end_local_got;
965            ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
966         {
967           *local_tlsdesc_gotent = (bfd_vma) -1;
968           if (*local_got > 0)
969             {
970               if (GOT_TLS_GDESC_P (*local_tls_type))
971                 {
972                   *local_tlsdesc_gotent = htab->elf.sgotplt->size
973                     - elf_x86_compute_jump_table_size (htab);
974                   htab->elf.sgotplt->size += 2 * htab->got_entry_size;
975                   *local_got = (bfd_vma) -2;
976                 }
977               if (! GOT_TLS_GDESC_P (*local_tls_type)
978                   || GOT_TLS_GD_P (*local_tls_type))
979                 {
980                   *local_got = s->size;
981                   s->size += htab->got_entry_size;
982                   if (GOT_TLS_GD_P (*local_tls_type)
983                       || *local_tls_type == GOT_TLS_IE_BOTH)
984                     s->size += htab->got_entry_size;
985                 }
986               if (bfd_link_pic (info)
987                   || GOT_TLS_GD_ANY_P (*local_tls_type)
988                   || (*local_tls_type & GOT_TLS_IE))
989                 {
990                   if (*local_tls_type == GOT_TLS_IE_BOTH)
991                     srel->size += 2 * htab->sizeof_reloc;
992                   else if (GOT_TLS_GD_P (*local_tls_type)
993                            || ! GOT_TLS_GDESC_P (*local_tls_type))
994                     srel->size += htab->sizeof_reloc;
995                   if (GOT_TLS_GDESC_P (*local_tls_type))
996                     {
997                       htab->elf.srelplt->size += htab->sizeof_reloc;
998                       if (bed->target_id == X86_64_ELF_DATA)
999                         htab->tlsdesc_plt = (bfd_vma) -1;
1000                     }
1001                 }
1002             }
1003           else
1004             *local_got = (bfd_vma) -1;
1005         }
1006     }
1007
1008   if (htab->tls_ld_or_ldm_got.refcount > 0)
1009     {
1010       /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
1011          or R_X86_64_TLSLD relocs.  */
1012       htab->tls_ld_or_ldm_got.offset = htab->elf.sgot->size;
1013       htab->elf.sgot->size += 2 * htab->got_entry_size;
1014       htab->elf.srelgot->size += htab->sizeof_reloc;
1015     }
1016   else
1017     htab->tls_ld_or_ldm_got.offset = -1;
1018
1019   /* Allocate global sym .plt and .got entries, and space for global
1020      sym dynamic relocs.  */
1021   elf_link_hash_traverse (&htab->elf, elf_x86_allocate_dynrelocs,
1022                           info);
1023
1024   /* Allocate .plt and .got entries, and space for local symbols.  */
1025   htab_traverse (htab->loc_hash_table, elf_x86_allocate_local_dynreloc,
1026                  info);
1027
1028   /* For every jump slot reserved in the sgotplt, reloc_count is
1029      incremented.  However, when we reserve space for TLS descriptors,
1030      it's not incremented, so in order to compute the space reserved
1031      for them, it suffices to multiply the reloc count by the jump
1032      slot size.
1033
1034      PR ld/13302: We start next_irelative_index at the end of .rela.plt
1035      so that R_{386,X86_64}_IRELATIVE entries come last.  */
1036   if (htab->elf.srelplt)
1037     {
1038       htab->next_tls_desc_index = htab->elf.srelplt->reloc_count;
1039       htab->sgotplt_jump_table_size
1040         = elf_x86_compute_jump_table_size (htab);
1041       htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
1042     }
1043   else if (htab->elf.irelplt)
1044     htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
1045
1046   if (htab->tlsdesc_plt)
1047     {
1048       /* NB: tlsdesc_plt is set only for x86-64.  If we're not using
1049          lazy TLS relocations, don't generate the PLT and GOT entries
1050          they require.  */
1051       if ((info->flags & DF_BIND_NOW))
1052         htab->tlsdesc_plt = 0;
1053       else
1054         {
1055           htab->tlsdesc_got = htab->elf.sgot->size;
1056           htab->elf.sgot->size += htab->got_entry_size;
1057           /* Reserve room for the initial entry.
1058              FIXME: we could probably do away with it in this case.  */
1059           if (htab->elf.splt->size == 0)
1060             htab->elf.splt->size = htab->plt.plt_entry_size;
1061           htab->tlsdesc_plt = htab->elf.splt->size;
1062           htab->elf.splt->size += htab->plt.plt_entry_size;
1063         }
1064     }
1065
1066   if (htab->elf.sgotplt)
1067     {
1068       /* Don't allocate .got.plt section if there are no GOT nor PLT
1069          entries and there is no reference to _GLOBAL_OFFSET_TABLE_.  */
1070       if ((htab->elf.hgot == NULL
1071            || !htab->elf.hgot->ref_regular_nonweak)
1072           && (htab->elf.sgotplt->size == bed->got_header_size)
1073           && (htab->elf.splt == NULL
1074               || htab->elf.splt->size == 0)
1075           && (htab->elf.sgot == NULL
1076               || htab->elf.sgot->size == 0)
1077           && (htab->elf.iplt == NULL
1078               || htab->elf.iplt->size == 0)
1079           && (htab->elf.igotplt == NULL
1080               || htab->elf.igotplt->size == 0))
1081         htab->elf.sgotplt->size = 0;
1082     }
1083
1084   if (_bfd_elf_eh_frame_present (info))
1085     {
1086       if (htab->plt_eh_frame != NULL
1087           && htab->elf.splt != NULL
1088           && htab->elf.splt->size != 0
1089           && !bfd_is_abs_section (htab->elf.splt->output_section))
1090         htab->plt_eh_frame->size = htab->plt.eh_frame_plt_size;
1091
1092       if (htab->plt_got_eh_frame != NULL
1093           && htab->plt_got != NULL
1094           && htab->plt_got->size != 0
1095           && !bfd_is_abs_section (htab->plt_got->output_section))
1096         htab->plt_got_eh_frame->size
1097           = htab->non_lazy_plt->eh_frame_plt_size;
1098
1099       /* Unwind info for the second PLT and .plt.got sections are
1100          identical.  */
1101       if (htab->plt_second_eh_frame != NULL
1102           && htab->plt_second != NULL
1103           && htab->plt_second->size != 0
1104           && !bfd_is_abs_section (htab->plt_second->output_section))
1105         htab->plt_second_eh_frame->size
1106           = htab->non_lazy_plt->eh_frame_plt_size;
1107     }
1108
1109   /* We now have determined the sizes of the various dynamic sections.
1110      Allocate memory for them.  */
1111   relocs = FALSE;
1112   for (s = dynobj->sections; s != NULL; s = s->next)
1113     {
1114       bfd_boolean strip_section = TRUE;
1115
1116       if ((s->flags & SEC_LINKER_CREATED) == 0)
1117         continue;
1118
1119       if (s == htab->elf.splt
1120           || s == htab->elf.sgot)
1121         {
1122           /* Strip this section if we don't need it; see the
1123              comment below.  */
1124           /* We'd like to strip these sections if they aren't needed, but if
1125              we've exported dynamic symbols from them we must leave them.
1126              It's too late to tell BFD to get rid of the symbols.  */
1127
1128           if (htab->elf.hplt != NULL)
1129             strip_section = FALSE;
1130         }
1131       else if (s == htab->elf.sgotplt
1132                || s == htab->elf.iplt
1133                || s == htab->elf.igotplt
1134                || s == htab->plt_second
1135                || s == htab->plt_got
1136                || s == htab->plt_eh_frame
1137                || s == htab->plt_got_eh_frame
1138                || s == htab->plt_second_eh_frame
1139                || s == htab->elf.sdynbss
1140                || s == htab->elf.sdynrelro)
1141         {
1142           /* Strip these too.  */
1143         }
1144       else if (htab->is_reloc_section (bfd_get_section_name (dynobj, s)))
1145         {
1146           if (s->size != 0
1147               && s != htab->elf.srelplt
1148               && s != htab->srelplt2)
1149             relocs = TRUE;
1150
1151           /* We use the reloc_count field as a counter if we need
1152              to copy relocs into the output file.  */
1153           if (s != htab->elf.srelplt)
1154             s->reloc_count = 0;
1155         }
1156       else
1157         {
1158           /* It's not one of our sections, so don't allocate space.  */
1159           continue;
1160         }
1161
1162       if (s->size == 0)
1163         {
1164           /* If we don't need this section, strip it from the
1165              output file.  This is mostly to handle .rel.bss and
1166              .rel.plt.  We must create both sections in
1167              create_dynamic_sections, because they must be created
1168              before the linker maps input sections to output
1169              sections.  The linker does that before
1170              adjust_dynamic_symbol is called, and it is that
1171              function which decides whether anything needs to go
1172              into these sections.  */
1173           if (strip_section)
1174             s->flags |= SEC_EXCLUDE;
1175           continue;
1176         }
1177
1178       if ((s->flags & SEC_HAS_CONTENTS) == 0)
1179         continue;
1180
1181       /* Allocate memory for the section contents.  We use bfd_zalloc
1182          here in case unused entries are not reclaimed before the
1183          section's contents are written out.  This should not happen,
1184          but this way if it does, we get a R_386_NONE or R_X86_64_NONE
1185          reloc instead of garbage.  */
1186       s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
1187       if (s->contents == NULL)
1188         return FALSE;
1189     }
1190
1191   if (htab->plt_eh_frame != NULL
1192       && htab->plt_eh_frame->contents != NULL)
1193     {
1194       memcpy (htab->plt_eh_frame->contents,
1195               htab->plt.eh_frame_plt,
1196               htab->plt_eh_frame->size);
1197       bfd_put_32 (dynobj, htab->elf.splt->size,
1198                   htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
1199     }
1200
1201   if (htab->plt_got_eh_frame != NULL
1202       && htab->plt_got_eh_frame->contents != NULL)
1203     {
1204       memcpy (htab->plt_got_eh_frame->contents,
1205               htab->non_lazy_plt->eh_frame_plt,
1206               htab->plt_got_eh_frame->size);
1207       bfd_put_32 (dynobj, htab->plt_got->size,
1208                   (htab->plt_got_eh_frame->contents
1209                    + PLT_FDE_LEN_OFFSET));
1210     }
1211
1212   if (htab->plt_second_eh_frame != NULL
1213       && htab->plt_second_eh_frame->contents != NULL)
1214     {
1215       memcpy (htab->plt_second_eh_frame->contents,
1216               htab->non_lazy_plt->eh_frame_plt,
1217               htab->plt_second_eh_frame->size);
1218       bfd_put_32 (dynobj, htab->plt_second->size,
1219                   (htab->plt_second_eh_frame->contents
1220                    + PLT_FDE_LEN_OFFSET));
1221     }
1222
1223   if (htab->elf.dynamic_sections_created)
1224     {
1225       /* Add some entries to the .dynamic section.  We fill in the
1226          values later, in elf_{i386,x86_64}_finish_dynamic_sections,
1227          but we must add the entries now so that we get the correct
1228          size for the .dynamic section.  The DT_DEBUG entry is filled
1229          in by the dynamic linker and used by the debugger.  */
1230 #define add_dynamic_entry(TAG, VAL) \
1231   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1232
1233       if (bfd_link_executable (info))
1234         {
1235           if (!add_dynamic_entry (DT_DEBUG, 0))
1236             return FALSE;
1237         }
1238
1239       if (htab->elf.splt->size != 0)
1240         {
1241           /* DT_PLTGOT is used by prelink even if there is no PLT
1242              relocation.  */
1243           if (!add_dynamic_entry (DT_PLTGOT, 0))
1244             return FALSE;
1245         }
1246
1247       if (htab->elf.srelplt->size != 0)
1248         {
1249           if (!add_dynamic_entry (DT_PLTRELSZ, 0)
1250               || !add_dynamic_entry (DT_PLTREL, htab->dt_reloc)
1251               || !add_dynamic_entry (DT_JMPREL, 0))
1252             return FALSE;
1253         }
1254
1255       if (htab->tlsdesc_plt
1256           && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
1257               || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
1258         return FALSE;
1259
1260       if (relocs)
1261         {
1262           if (!add_dynamic_entry (htab->dt_reloc, 0)
1263               || !add_dynamic_entry (htab->dt_reloc_sz, 0)
1264               || !add_dynamic_entry (htab->dt_reloc_ent,
1265                                      htab->sizeof_reloc))
1266             return FALSE;
1267
1268           /* If any dynamic relocs apply to a read-only section,
1269              then we need a DT_TEXTREL entry.  */
1270           if ((info->flags & DF_TEXTREL) == 0)
1271             elf_link_hash_traverse (&htab->elf,
1272                                     _bfd_x86_elf_readonly_dynrelocs,
1273                                     info);
1274
1275           if ((info->flags & DF_TEXTREL) != 0)
1276             {
1277               if (htab->readonly_dynrelocs_against_ifunc)
1278                 {
1279                   info->callbacks->einfo
1280                     (_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n"));
1281                   bfd_set_error (bfd_error_bad_value);
1282                   return FALSE;
1283                 }
1284
1285               if (!add_dynamic_entry (DT_TEXTREL, 0))
1286                 return FALSE;
1287             }
1288         }
1289       if (htab->target_os == is_vxworks
1290           && !elf_vxworks_add_dynamic_entries (output_bfd, info))
1291         return FALSE;
1292     }
1293 #undef add_dynamic_entry
1294
1295   return TRUE;
1296 }
1297
1298 /* Finish up the x86 dynamic sections.  */
1299
1300 struct elf_x86_link_hash_table *
1301 _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd,
1302                                       struct bfd_link_info *info)
1303 {
1304   struct elf_x86_link_hash_table *htab;
1305   const struct elf_backend_data *bed;
1306   bfd *dynobj;
1307   asection *sdyn;
1308   bfd_byte *dyncon, *dynconend;
1309   bfd_size_type sizeof_dyn;
1310
1311   bed = get_elf_backend_data (output_bfd);
1312   htab = elf_x86_hash_table (info, bed->target_id);
1313   if (htab == NULL)
1314     return htab;
1315
1316   dynobj = htab->elf.dynobj;
1317   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
1318
1319   /* GOT is always created in setup_gnu_properties.  But it may not be
1320      needed.  .got.plt section may be needed for static IFUNC.  */
1321   if (htab->elf.sgotplt && htab->elf.sgotplt->size > 0)
1322     {
1323       bfd_vma dynamic_addr;
1324
1325       if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
1326         {
1327           _bfd_error_handler
1328             (_("discarded output section: `%A'"), htab->elf.sgotplt);
1329           return NULL;
1330         }
1331
1332       elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize
1333         = htab->got_entry_size;
1334
1335       dynamic_addr = (sdyn == NULL
1336                       ? (bfd_vma) 0
1337                       : sdyn->output_section->vma + sdyn->output_offset);
1338
1339       /* Set the first entry in the global offset table to the address
1340          of the dynamic section.  Write GOT[1] and GOT[2], needed for
1341          the dynamic linker.  */
1342       if (htab->got_entry_size == 8)
1343         {
1344           bfd_put_64 (output_bfd, dynamic_addr,
1345                       htab->elf.sgotplt->contents);
1346           bfd_put_64 (output_bfd, (bfd_vma) 0,
1347                       htab->elf.sgotplt->contents + 8);
1348           bfd_put_64 (output_bfd, (bfd_vma) 0,
1349                       htab->elf.sgotplt->contents + 8*2);
1350         }
1351       else
1352         {
1353           bfd_put_32 (output_bfd, dynamic_addr,
1354                       htab->elf.sgotplt->contents);
1355           bfd_put_32 (output_bfd, 0,
1356                       htab->elf.sgotplt->contents + 4);
1357           bfd_put_32 (output_bfd, 0,
1358                       htab->elf.sgotplt->contents + 4*2);
1359         }
1360     }
1361
1362   if (!htab->elf.dynamic_sections_created)
1363     return htab;
1364
1365   if (sdyn == NULL || htab->elf.sgot == NULL)
1366     abort ();
1367
1368   sizeof_dyn = bed->s->sizeof_dyn;
1369   dyncon = sdyn->contents;
1370   dynconend = sdyn->contents + sdyn->size;
1371   for (; dyncon < dynconend; dyncon += sizeof_dyn)
1372     {
1373       Elf_Internal_Dyn dyn;
1374       asection *s;
1375
1376       (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
1377
1378       switch (dyn.d_tag)
1379         {
1380         default:
1381           if (htab->target_os == is_vxworks
1382               && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
1383             break;
1384           continue;
1385
1386         case DT_PLTGOT:
1387           s = htab->elf.sgotplt;
1388           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
1389           break;
1390
1391         case DT_JMPREL:
1392           dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
1393           break;
1394
1395         case DT_PLTRELSZ:
1396           s = htab->elf.srelplt->output_section;
1397           dyn.d_un.d_val = s->size;
1398           break;
1399
1400         case DT_TLSDESC_PLT:
1401           s = htab->elf.splt;
1402           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
1403             + htab->tlsdesc_plt;
1404           break;
1405
1406         case DT_TLSDESC_GOT:
1407           s = htab->elf.sgot;
1408           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
1409             + htab->tlsdesc_got;
1410           break;
1411         }
1412
1413       (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
1414     }
1415
1416   if (htab->plt_got != NULL && htab->plt_got->size > 0)
1417     elf_section_data (htab->plt_got->output_section)
1418       ->this_hdr.sh_entsize = htab->non_lazy_plt->plt_entry_size;
1419
1420   if (htab->plt_second != NULL && htab->plt_second->size > 0)
1421     elf_section_data (htab->plt_second->output_section)
1422       ->this_hdr.sh_entsize = htab->non_lazy_plt->plt_entry_size;
1423
1424   /* Adjust .eh_frame for .plt section.  */
1425   if (htab->plt_eh_frame != NULL
1426       && htab->plt_eh_frame->contents != NULL)
1427     {
1428       if (htab->elf.splt != NULL
1429           && htab->elf.splt->size != 0
1430           && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
1431           && htab->elf.splt->output_section != NULL
1432           && htab->plt_eh_frame->output_section != NULL)
1433         {
1434           bfd_vma plt_start = htab->elf.splt->output_section->vma;
1435           bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
1436                                    + htab->plt_eh_frame->output_offset
1437                                    + PLT_FDE_START_OFFSET;
1438           bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
1439                              htab->plt_eh_frame->contents
1440                              + PLT_FDE_START_OFFSET);
1441         }
1442
1443       if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
1444         {
1445           if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
1446                                                  htab->plt_eh_frame,
1447                                                  htab->plt_eh_frame->contents))
1448             return NULL;
1449         }
1450     }
1451
1452   /* Adjust .eh_frame for .plt.got section.  */
1453   if (htab->plt_got_eh_frame != NULL
1454       && htab->plt_got_eh_frame->contents != NULL)
1455     {
1456       if (htab->plt_got != NULL
1457           && htab->plt_got->size != 0
1458           && (htab->plt_got->flags & SEC_EXCLUDE) == 0
1459           && htab->plt_got->output_section != NULL
1460           && htab->plt_got_eh_frame->output_section != NULL)
1461         {
1462           bfd_vma plt_start = htab->plt_got->output_section->vma;
1463           bfd_vma eh_frame_start = htab->plt_got_eh_frame->output_section->vma
1464                                    + htab->plt_got_eh_frame->output_offset
1465                                    + PLT_FDE_START_OFFSET;
1466           bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
1467                              htab->plt_got_eh_frame->contents
1468                              + PLT_FDE_START_OFFSET);
1469         }
1470       if (htab->plt_got_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
1471         {
1472           if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
1473                                                  htab->plt_got_eh_frame,
1474                                                  htab->plt_got_eh_frame->contents))
1475             return NULL;
1476         }
1477     }
1478
1479   /* Adjust .eh_frame for the second PLT section.  */
1480   if (htab->plt_second_eh_frame != NULL
1481       && htab->plt_second_eh_frame->contents != NULL)
1482     {
1483       if (htab->plt_second != NULL
1484           && htab->plt_second->size != 0
1485           && (htab->plt_second->flags & SEC_EXCLUDE) == 0
1486           && htab->plt_second->output_section != NULL
1487           && htab->plt_second_eh_frame->output_section != NULL)
1488         {
1489           bfd_vma plt_start = htab->plt_second->output_section->vma;
1490           bfd_vma eh_frame_start
1491             = (htab->plt_second_eh_frame->output_section->vma
1492                + htab->plt_second_eh_frame->output_offset
1493                + PLT_FDE_START_OFFSET);
1494           bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
1495                              htab->plt_second_eh_frame->contents
1496                              + PLT_FDE_START_OFFSET);
1497         }
1498       if (htab->plt_second_eh_frame->sec_info_type
1499           == SEC_INFO_TYPE_EH_FRAME)
1500         {
1501           if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
1502                                                  htab->plt_second_eh_frame,
1503                                                  htab->plt_second_eh_frame->contents))
1504             return NULL;
1505         }
1506     }
1507
1508   if (htab->elf.sgot && htab->elf.sgot->size > 0)
1509     elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
1510       = htab->got_entry_size;
1511
1512   return htab;
1513 }
1514
1515
1516 bfd_boolean
1517 _bfd_x86_elf_always_size_sections (bfd *output_bfd,
1518                                    struct bfd_link_info *info)
1519 {
1520   asection *tls_sec = elf_hash_table (info)->tls_sec;
1521
1522   if (tls_sec)
1523     {
1524       struct elf_link_hash_entry *tlsbase;
1525
1526       tlsbase = elf_link_hash_lookup (elf_hash_table (info),
1527                                       "_TLS_MODULE_BASE_",
1528                                       FALSE, FALSE, FALSE);
1529
1530       if (tlsbase && tlsbase->type == STT_TLS)
1531         {
1532           struct elf_x86_link_hash_table *htab;
1533           struct bfd_link_hash_entry *bh = NULL;
1534           const struct elf_backend_data *bed
1535             = get_elf_backend_data (output_bfd);
1536
1537           htab = elf_x86_hash_table (info, bed->target_id);
1538           if (htab == NULL)
1539             return FALSE;
1540
1541           if (!(_bfd_generic_link_add_one_symbol
1542                 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
1543                  tls_sec, 0, NULL, FALSE,
1544                  bed->collect, &bh)))
1545             return FALSE;
1546
1547           htab->tls_module_base = bh;
1548
1549           tlsbase = (struct elf_link_hash_entry *)bh;
1550           tlsbase->def_regular = 1;
1551           tlsbase->other = STV_HIDDEN;
1552           tlsbase->root.linker_def = 1;
1553           (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
1554         }
1555     }
1556
1557   return TRUE;
1558 }
1559
1560 void
1561 _bfd_x86_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
1562                                      const Elf_Internal_Sym *isym,
1563                                      bfd_boolean definition,
1564                                      bfd_boolean dynamic ATTRIBUTE_UNUSED)
1565 {
1566   if (definition)
1567     {
1568       struct elf_x86_link_hash_entry *eh
1569         = (struct elf_x86_link_hash_entry *) h;
1570       eh->def_protected = (ELF_ST_VISIBILITY (isym->st_other)
1571                            == STV_PROTECTED);
1572     }
1573 }
1574
1575 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
1576
1577 void
1578 _bfd_x86_elf_copy_indirect_symbol (struct bfd_link_info *info,
1579                                    struct elf_link_hash_entry *dir,
1580                                    struct elf_link_hash_entry *ind)
1581 {
1582   struct elf_x86_link_hash_entry *edir, *eind;
1583
1584   edir = (struct elf_x86_link_hash_entry *) dir;
1585   eind = (struct elf_x86_link_hash_entry *) ind;
1586
1587   if (eind->dyn_relocs != NULL)
1588     {
1589       if (edir->dyn_relocs != NULL)
1590         {
1591           struct elf_dyn_relocs **pp;
1592           struct elf_dyn_relocs *p;
1593
1594           /* Add reloc counts against the indirect sym to the direct sym
1595              list.  Merge any entries against the same section.  */
1596           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1597             {
1598               struct elf_dyn_relocs *q;
1599
1600               for (q = edir->dyn_relocs; q != NULL; q = q->next)
1601                 if (q->sec == p->sec)
1602                   {
1603                     q->pc_count += p->pc_count;
1604                     q->count += p->count;
1605                     *pp = p->next;
1606                     break;
1607                   }
1608               if (q == NULL)
1609                 pp = &p->next;
1610             }
1611           *pp = edir->dyn_relocs;
1612         }
1613
1614       edir->dyn_relocs = eind->dyn_relocs;
1615       eind->dyn_relocs = NULL;
1616     }
1617
1618   if (ind->root.type == bfd_link_hash_indirect
1619       && dir->got.refcount <= 0)
1620     {
1621       edir->tls_type = eind->tls_type;
1622       eind->tls_type = GOT_UNKNOWN;
1623     }
1624
1625   /* Copy gotoff_ref so that elf_i386_adjust_dynamic_symbol will
1626      generate a R_386_COPY reloc.  */
1627   edir->gotoff_ref |= eind->gotoff_ref;
1628
1629   edir->zero_undefweak |= eind->zero_undefweak;
1630
1631   if (ELIMINATE_COPY_RELOCS
1632       && ind->root.type != bfd_link_hash_indirect
1633       && dir->dynamic_adjusted)
1634     {
1635       /* If called to transfer flags for a weakdef during processing
1636          of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1637          We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
1638       if (dir->versioned != versioned_hidden)
1639         dir->ref_dynamic |= ind->ref_dynamic;
1640       dir->ref_regular |= ind->ref_regular;
1641       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1642       dir->needs_plt |= ind->needs_plt;
1643       dir->pointer_equality_needed |= ind->pointer_equality_needed;
1644     }
1645   else
1646     {
1647       if (eind->func_pointer_refcount > 0)
1648         {
1649           edir->func_pointer_refcount += eind->func_pointer_refcount;
1650           eind->func_pointer_refcount = 0;
1651         }
1652
1653       _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1654     }
1655 }
1656
1657 /* Remove undefined weak symbol from the dynamic symbol table if it
1658    is resolved to 0.   */
1659
1660 bfd_boolean
1661 _bfd_x86_elf_fixup_symbol (struct bfd_link_info *info,
1662                            struct elf_link_hash_entry *h)
1663 {
1664   if (h->dynindx != -1
1665       && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, elf_x86_hash_entry (h)))
1666     {
1667       h->dynindx = -1;
1668       _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1669                               h->dynstr_index);
1670     }
1671   return TRUE;
1672 }
1673
1674 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
1675
1676 bfd_boolean
1677 _bfd_x86_elf_hash_symbol (struct elf_link_hash_entry *h)
1678 {
1679   if (h->plt.offset != (bfd_vma) -1
1680       && !h->def_regular
1681       && !h->pointer_equality_needed)
1682     return FALSE;
1683
1684   return _bfd_elf_hash_symbol (h);
1685 }
1686
1687 /* Adjust a symbol defined by a dynamic object and referenced by a
1688    regular object.  The current definition is in some section of the
1689    dynamic object, but we're not including those sections.  We have to
1690    change the definition to something the rest of the link can
1691    understand.  */
1692
1693 bfd_boolean
1694 _bfd_x86_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
1695                                     struct elf_link_hash_entry *h)
1696 {
1697   struct elf_x86_link_hash_table *htab;
1698   asection *s, *srel;
1699   struct elf_x86_link_hash_entry *eh;
1700   struct elf_dyn_relocs *p;
1701   const struct elf_backend_data *bed
1702     = get_elf_backend_data (info->output_bfd);
1703
1704   /* STT_GNU_IFUNC symbol must go through PLT. */
1705   if (h->type == STT_GNU_IFUNC)
1706     {
1707       /* All local STT_GNU_IFUNC references must be treate as local
1708          calls via local PLT.  */
1709       if (h->ref_regular
1710           && SYMBOL_CALLS_LOCAL (info, h))
1711         {
1712           bfd_size_type pc_count = 0, count = 0;
1713           struct elf_dyn_relocs **pp;
1714
1715           eh = (struct elf_x86_link_hash_entry *) h;
1716           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1717             {
1718               pc_count += p->pc_count;
1719               p->count -= p->pc_count;
1720               p->pc_count = 0;
1721               count += p->count;
1722               if (p->count == 0)
1723                 *pp = p->next;
1724               else
1725                 pp = &p->next;
1726             }
1727
1728           if (pc_count || count)
1729             {
1730               h->non_got_ref = 1;
1731               if (pc_count)
1732                 {
1733                   /* Increment PLT reference count only for PC-relative
1734                      references.  */
1735                   h->needs_plt = 1;
1736                   if (h->plt.refcount <= 0)
1737                     h->plt.refcount = 1;
1738                   else
1739                     h->plt.refcount += 1;
1740                 }
1741             }
1742         }
1743
1744       if (h->plt.refcount <= 0)
1745         {
1746           h->plt.offset = (bfd_vma) -1;
1747           h->needs_plt = 0;
1748         }
1749       return TRUE;
1750     }
1751
1752   /* If this is a function, put it in the procedure linkage table.  We
1753      will fill in the contents of the procedure linkage table later,
1754      when we know the address of the .got section.  */
1755   if (h->type == STT_FUNC
1756       || h->needs_plt)
1757     {
1758       if (h->plt.refcount <= 0
1759           || SYMBOL_CALLS_LOCAL (info, h)
1760           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1761               && h->root.type == bfd_link_hash_undefweak))
1762         {
1763           /* This case can occur if we saw a PLT32 reloc in an input
1764              file, but the symbol was never referred to by a dynamic
1765              object, or if all references were garbage collected.  In
1766              such a case, we don't actually need to build a procedure
1767              linkage table, and we can just do a PC32 reloc instead.  */
1768           h->plt.offset = (bfd_vma) -1;
1769           h->needs_plt = 0;
1770         }
1771
1772       return TRUE;
1773     }
1774   else
1775     /* It's possible that we incorrectly decided a .plt reloc was needed
1776      * for an R_386_PC32/R_X86_64_PC32 reloc to a non-function sym in
1777        check_relocs.  We can't decide accurately between function and
1778        non-function syms in check-relocs;  Objects loaded later in
1779        the link may change h->type.  So fix it now.  */
1780     h->plt.offset = (bfd_vma) -1;
1781
1782   eh = (struct elf_x86_link_hash_entry *) h;
1783
1784   /* If this is a weak symbol, and there is a real definition, the
1785      processor independent code will have arranged for us to see the
1786      real definition first, and we can just use the same value.  */
1787   if (h->u.weakdef != NULL)
1788     {
1789       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1790                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
1791       h->root.u.def.section = h->u.weakdef->root.u.def.section;
1792       h->root.u.def.value = h->u.weakdef->root.u.def.value;
1793       if (ELIMINATE_COPY_RELOCS
1794           || info->nocopyreloc
1795           || SYMBOL_NO_COPYRELOC (info, eh))
1796         {
1797           /* NB: needs_copy is always 0 for i386.  */
1798           h->non_got_ref = h->u.weakdef->non_got_ref;
1799           eh->needs_copy = h->u.weakdef->needs_copy;
1800         }
1801       return TRUE;
1802     }
1803
1804   /* This is a reference to a symbol defined by a dynamic object which
1805      is not a function.  */
1806
1807   /* If we are creating a shared library, we must presume that the
1808      only references to the symbol are via the global offset table.
1809      For such cases we need not do anything here; the relocations will
1810      be handled correctly by relocate_section.  */
1811   if (!bfd_link_executable (info))
1812     return TRUE;
1813
1814   /* If there are no references to this symbol that do not use the
1815      GOT nor R_386_GOTOFF relocation, we don't need to generate a copy
1816      reloc.  NB: gotoff_ref is always 0 for x86-64.  */
1817   if (!h->non_got_ref && !eh->gotoff_ref)
1818     return TRUE;
1819
1820   /* If -z nocopyreloc was given, we won't generate them either.  */
1821   if (info->nocopyreloc || SYMBOL_NO_COPYRELOC (info, eh))
1822     {
1823       h->non_got_ref = 0;
1824       return TRUE;
1825     }
1826
1827   htab = elf_x86_hash_table (info, bed->target_id);
1828   if (htab == NULL)
1829     return FALSE;
1830
1831   /* If there aren't any dynamic relocs in read-only sections nor
1832      R_386_GOTOFF relocation, then we can keep the dynamic relocs and
1833      avoid the copy reloc.  This doesn't work on VxWorks, where we can
1834      not have dynamic relocations (other than copy and jump slot
1835      relocations) in an executable.  */
1836   if (ELIMINATE_COPY_RELOCS
1837       && (bed->target_id == X86_64_ELF_DATA
1838           || (!eh->gotoff_ref
1839               && htab->target_os != is_vxworks)))
1840     {
1841       for (p = eh->dyn_relocs; p != NULL; p = p->next)
1842         {
1843           s = p->sec->output_section;
1844           if (s != NULL && (s->flags & SEC_READONLY) != 0)
1845             break;
1846         }
1847
1848       /* If we didn't find any dynamic relocs in read-only sections,
1849          then we'll be keeping the dynamic relocs and avoiding the copy
1850          reloc.  */
1851       if (p == NULL)
1852         {
1853           h->non_got_ref = 0;
1854           return TRUE;
1855         }
1856     }
1857
1858   /* We must allocate the symbol in our .dynbss section, which will
1859      become part of the .bss section of the executable.  There will be
1860      an entry for this symbol in the .dynsym section.  The dynamic
1861      object will contain position independent code, so all references
1862      from the dynamic object to this symbol will go through the global
1863      offset table.  The dynamic linker will use the .dynsym entry to
1864      determine the address it must put in the global offset table, so
1865      both the dynamic object and the regular object will refer to the
1866      same memory location for the variable.  */
1867
1868   /* We must generate a R_386_COPY/R_X86_64_COPY reloc to tell the
1869      dynamic linker to copy the initial value out of the dynamic object
1870      and into the runtime process image.  */
1871   if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
1872     {
1873       s = htab->elf.sdynrelro;
1874       srel = htab->elf.sreldynrelro;
1875     }
1876   else
1877     {
1878       s = htab->elf.sdynbss;
1879       srel = htab->elf.srelbss;
1880     }
1881   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
1882     {
1883       srel->size += htab->sizeof_reloc;
1884       h->needs_copy = 1;
1885     }
1886
1887   return _bfd_elf_adjust_dynamic_copy (info, h, s);
1888 }
1889
1890 void
1891 _bfd_x86_elf_hide_symbol (struct bfd_link_info *info,
1892                           struct elf_link_hash_entry *h,
1893                           bfd_boolean force_local)
1894 {
1895   if (h->root.type == bfd_link_hash_undefweak
1896       && info->nointerp
1897       && bfd_link_pie (info))
1898     {
1899       /* When there is no dynamic interpreter in PIE, make the undefined
1900          weak symbol dynamic so that PC relative branch to the undefined
1901          weak symbol will land to address 0.  */
1902       struct elf_x86_link_hash_entry *eh = elf_x86_hash_entry (h);
1903       if (h->plt.refcount > eh->func_pointer_refcount
1904           || eh->plt_got.refcount > 0)
1905         return;
1906     }
1907
1908   _bfd_elf_link_hash_hide_symbol (info, h, force_local);
1909 }
1910
1911 /* Return TRUE if a symbol is referenced locally.  It is similar to
1912    SYMBOL_REFERENCES_LOCAL, but it also checks version script.  It
1913    works in check_relocs.  */
1914
1915 bfd_boolean
1916 _bfd_x86_elf_link_symbol_references_local (struct bfd_link_info *info,
1917                                            struct elf_link_hash_entry *h)
1918 {
1919   struct elf_x86_link_hash_entry *eh = elf_x86_hash_entry (h);
1920   struct elf_x86_link_hash_table *htab
1921     = (struct elf_x86_link_hash_table *) info->hash;
1922
1923   if (eh->local_ref > 1)
1924     return TRUE;
1925
1926   if (eh->local_ref == 1)
1927     return FALSE;
1928
1929   /* Unversioned symbols defined in regular objects can be forced local
1930      by linker version script.  A weak undefined symbol is forced local
1931      if
1932      1. It has non-default visibility.  Or
1933      2. When building executable, there is no dynamic linker.  Or
1934      3. or "-z nodynamic-undefined-weak" is used.
1935    */
1936   if (SYMBOL_REFERENCES_LOCAL (info, h)
1937       || (h->root.type == bfd_link_hash_undefweak
1938           && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1939               || (bfd_link_executable (info)
1940                   && htab->interp == NULL)
1941               || info->dynamic_undefined_weak == 0))
1942       || ((h->def_regular || ELF_COMMON_DEF_P (h))
1943           && h->versioned == unversioned
1944           && info->version_info != NULL
1945           && bfd_hide_sym_by_version (info->version_info,
1946                                       h->root.root.string)))
1947     {
1948       eh->local_ref = 2;
1949       return TRUE;
1950     }
1951
1952   eh->local_ref = 1;
1953   return FALSE;
1954 }
1955
1956 /* Return the section that should be marked against GC for a given
1957    relocation.  */
1958
1959 asection *
1960 _bfd_x86_elf_gc_mark_hook (asection *sec,
1961                            struct bfd_link_info *info,
1962                            Elf_Internal_Rela *rel,
1963                            struct elf_link_hash_entry *h,
1964                            Elf_Internal_Sym *sym)
1965 {
1966   /* Compiler should optimize this out.  */
1967   if (((unsigned int) R_X86_64_GNU_VTINHERIT
1968        != (unsigned int) R_386_GNU_VTINHERIT)
1969       || ((unsigned int) R_X86_64_GNU_VTENTRY
1970           != (unsigned int) R_386_GNU_VTENTRY))
1971     abort ();
1972
1973   if (h != NULL)
1974     switch (ELF32_R_TYPE (rel->r_info))
1975       {
1976       case R_X86_64_GNU_VTINHERIT:
1977       case R_X86_64_GNU_VTENTRY:
1978         return NULL;
1979       }
1980
1981   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1982 }
1983
1984 static bfd_vma
1985 elf_i386_get_plt_got_vma (struct elf_x86_plt *plt_p ATTRIBUTE_UNUSED,
1986                           bfd_vma off,
1987                           bfd_vma offset ATTRIBUTE_UNUSED,
1988                           bfd_vma got_addr)
1989 {
1990   return got_addr + off;
1991 }
1992
1993 static bfd_vma
1994 elf_x86_64_get_plt_got_vma (struct elf_x86_plt *plt_p,
1995                             bfd_vma off,
1996                             bfd_vma offset,
1997                             bfd_vma got_addr ATTRIBUTE_UNUSED)
1998 {
1999   return plt_p->sec->vma + offset + off + plt_p->plt_got_insn_size;
2000 }
2001
2002 static bfd_boolean
2003 elf_i386_valid_plt_reloc_p (unsigned int type)
2004 {
2005   return (type == R_386_JUMP_SLOT
2006           || type == R_386_GLOB_DAT
2007           || type == R_386_IRELATIVE);
2008 }
2009
2010 static bfd_boolean
2011 elf_x86_64_valid_plt_reloc_p (unsigned int type)
2012 {
2013   return (type == R_X86_64_JUMP_SLOT
2014           || type == R_X86_64_GLOB_DAT
2015           || type == R_X86_64_IRELATIVE);
2016 }
2017
2018 long
2019 _bfd_x86_elf_get_synthetic_symtab (bfd *abfd,
2020                                    long count,
2021                                    long relsize,
2022                                    bfd_vma got_addr,
2023                                    struct elf_x86_plt plts[],
2024                                    asymbol **dynsyms,
2025                                    asymbol **ret)
2026 {
2027   long size, i, n, len;
2028   int j;
2029   unsigned int plt_got_offset, plt_entry_size;
2030   asymbol *s;
2031   bfd_byte *plt_contents;
2032   long dynrelcount;
2033   arelent **dynrelbuf, *p;
2034   char *names;
2035   const struct elf_backend_data *bed;
2036   bfd_vma (*get_plt_got_vma) (struct elf_x86_plt *, bfd_vma, bfd_vma,
2037                               bfd_vma);
2038   bfd_boolean (*valid_plt_reloc_p) (unsigned int);
2039
2040   if (count == 0)
2041     return -1;
2042
2043   dynrelbuf = (arelent **) bfd_malloc (relsize);
2044   if (dynrelbuf == NULL)
2045     return -1;
2046
2047   dynrelcount = bfd_canonicalize_dynamic_reloc (abfd, dynrelbuf,
2048                                                 dynsyms);
2049   if (dynrelcount <= 0)
2050     return -1;
2051
2052   /* Sort the relocs by address.  */
2053   qsort (dynrelbuf, dynrelcount, sizeof (arelent *),
2054          _bfd_x86_elf_compare_relocs);
2055
2056   size = count * sizeof (asymbol);
2057
2058   /* Allocate space for @plt suffixes.  */
2059   n = 0;
2060   for (i = 0; i < dynrelcount; i++)
2061     {
2062       p = dynrelbuf[i];
2063       size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
2064       if (p->addend != 0)
2065         size += sizeof ("+0x") - 1 + 8 + 8 * ABI_64_P (abfd);
2066     }
2067
2068   s = *ret = (asymbol *) bfd_zmalloc (size);
2069   if (s == NULL)
2070     goto bad_return;
2071
2072   bed = get_elf_backend_data (abfd);
2073
2074   if (bed->target_id == X86_64_ELF_DATA)
2075     {
2076       get_plt_got_vma = elf_x86_64_get_plt_got_vma;
2077       valid_plt_reloc_p = elf_x86_64_valid_plt_reloc_p;
2078     }
2079   else
2080     {
2081       get_plt_got_vma = elf_i386_get_plt_got_vma;
2082       valid_plt_reloc_p = elf_i386_valid_plt_reloc_p;
2083       if (got_addr)
2084         {
2085           /* Check .got.plt and then .got to get the _GLOBAL_OFFSET_TABLE_
2086              address.  */
2087           asection *sec = bfd_get_section_by_name (abfd, ".got.plt");
2088           if (sec != NULL)
2089             got_addr = sec->vma;
2090           else
2091             {
2092               sec = bfd_get_section_by_name (abfd, ".got");
2093               if (sec != NULL)
2094                 got_addr = sec->vma;
2095             }
2096
2097           if (got_addr == (bfd_vma) -1)
2098             goto bad_return;
2099         }
2100     }
2101
2102   /* Check for each PLT section.  */
2103   names = (char *) (s + count);
2104   size = 0;
2105   n = 0;
2106   for (j = 0; plts[j].name != NULL; j++)
2107     if ((plt_contents = plts[j].contents) != NULL)
2108       {
2109         long k;
2110         bfd_vma offset;
2111         asection *plt;
2112         struct elf_x86_plt *plt_p = &plts[j];
2113
2114         plt_got_offset = plt_p->plt_got_offset;
2115         plt_entry_size = plt_p->plt_entry_size;
2116
2117         plt = plt_p->sec;
2118
2119         if ((plt_p->type & plt_lazy))
2120           {
2121             /* Skip PLT0 in lazy PLT.  */
2122             k = 1;
2123             offset = plt_entry_size;
2124           }
2125         else
2126           {
2127             k = 0;
2128             offset = 0;
2129           }
2130
2131         /* Check each PLT entry against dynamic relocations.  */
2132         for (; k < plt_p->count; k++)
2133           {
2134             int off;
2135             bfd_vma got_vma;
2136             long min, max, mid;
2137
2138             /* Get the GOT offset for i386 or the PC-relative offset
2139                for x86-64, a signed 32-bit integer.  */
2140             off = H_GET_32 (abfd, (plt_contents + offset
2141                                    + plt_got_offset));
2142             got_vma = get_plt_got_vma (plt_p, off, offset, got_addr);
2143
2144             /* Binary search.  */
2145             p = dynrelbuf[0];
2146             min = 0;
2147             max = dynrelcount;
2148             while ((min + 1) < max)
2149               {
2150                 arelent *r;
2151
2152                 mid = (min + max) / 2;
2153                 r = dynrelbuf[mid];
2154                 if (got_vma > r->address)
2155                   min = mid;
2156                 else if (got_vma < r->address)
2157                   max = mid;
2158                 else
2159                   {
2160                     p = r;
2161                     break;
2162                   }
2163               }
2164
2165             /* Skip unknown relocation.  PR 17512: file: bc9d6cf5.  */
2166             if (got_vma == p->address
2167                 && p->howto != NULL
2168                 && valid_plt_reloc_p (p->howto->type))
2169               {
2170                 *s = **p->sym_ptr_ptr;
2171                 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL
2172                    set.  Since we are defining a symbol, ensure one
2173                    of them is set.  */
2174                 if ((s->flags & BSF_LOCAL) == 0)
2175                   s->flags |= BSF_GLOBAL;
2176                 s->flags |= BSF_SYNTHETIC;
2177                 /* This is no longer a section symbol.  */
2178                 s->flags &= ~BSF_SECTION_SYM;
2179                 s->section = plt;
2180                 s->the_bfd = plt->owner;
2181                 s->value = offset;
2182                 s->udata.p = NULL;
2183                 s->name = names;
2184                 len = strlen ((*p->sym_ptr_ptr)->name);
2185                 memcpy (names, (*p->sym_ptr_ptr)->name, len);
2186                 names += len;
2187                 if (p->addend != 0)
2188                   {
2189                     char buf[30], *a;
2190
2191                     memcpy (names, "+0x", sizeof ("+0x") - 1);
2192                     names += sizeof ("+0x") - 1;
2193                     bfd_sprintf_vma (abfd, buf, p->addend);
2194                     for (a = buf; *a == '0'; ++a)
2195                       ;
2196                     size = strlen (a);
2197                     memcpy (names, a, size);
2198                     names += size;
2199                   }
2200                 memcpy (names, "@plt", sizeof ("@plt"));
2201                 names += sizeof ("@plt");
2202                 n++;
2203                 s++;
2204                 /* There should be only one entry in PLT for a given
2205                    symbol.  Set howto to NULL after processing a PLT
2206                    entry to guard against corrupted PLT.  */
2207                 p->howto = NULL;
2208               }
2209             offset += plt_entry_size;
2210           }
2211       }
2212
2213   /* PLT entries with R_386_TLS_DESC relocations are skipped.  */
2214   if (n == 0)
2215     {
2216 bad_return:
2217       count = -1;
2218     }
2219   else
2220     count = n;
2221
2222   for (j = 0; plts[j].name != NULL; j++)
2223     if (plts[j].contents != NULL)
2224       free (plts[j].contents);
2225
2226   free (dynrelbuf);
2227
2228   return count;
2229 }
2230
2231 /* Parse x86 GNU properties.  */
2232
2233 enum elf_property_kind
2234 _bfd_x86_elf_parse_gnu_properties (bfd *abfd, unsigned int type,
2235                                    bfd_byte *ptr, unsigned int datasz)
2236 {
2237   elf_property *prop;
2238
2239   switch (type)
2240     {
2241     case GNU_PROPERTY_X86_ISA_1_USED:
2242     case GNU_PROPERTY_X86_ISA_1_NEEDED:
2243     case GNU_PROPERTY_X86_FEATURE_1_AND:
2244       if (datasz != 4)
2245         {
2246           _bfd_error_handler
2247             ((type == GNU_PROPERTY_X86_ISA_1_USED
2248               ? _("error: %B: <corrupt x86 ISA used size: 0x%x>")
2249               : (type == GNU_PROPERTY_X86_ISA_1_NEEDED
2250                  ? _("error: %B: <corrupt x86 ISA needed size: 0x%x>")
2251                  : _("error: %B: <corrupt x86 feature size: 0x%x>"))),
2252              abfd, datasz);
2253           return property_corrupt;
2254         }
2255       prop = _bfd_elf_get_property (abfd, type, datasz);
2256       /* Combine properties of the same type.  */
2257       prop->u.number |= bfd_h_get_32 (abfd, ptr);
2258       prop->pr_kind = property_number;
2259       break;
2260
2261     default:
2262       return property_ignored;
2263     }
2264
2265   return property_number;
2266 }
2267
2268 /* Merge x86 GNU property BPROP with APROP.  If APROP isn't NULL,
2269    return TRUE if APROP is updated.  Otherwise, return TRUE if BPROP
2270    should be merged with ABFD.  */
2271
2272 bfd_boolean
2273 _bfd_x86_elf_merge_gnu_properties (struct bfd_link_info *info,
2274                                    bfd *abfd ATTRIBUTE_UNUSED,
2275                                    elf_property *aprop,
2276                                    elf_property *bprop)
2277 {
2278   unsigned int number, features;
2279   bfd_boolean updated = FALSE;
2280   unsigned int pr_type = aprop != NULL ? aprop->pr_type : bprop->pr_type;
2281
2282   switch (pr_type)
2283     {
2284     case GNU_PROPERTY_X86_ISA_1_USED:
2285     case GNU_PROPERTY_X86_ISA_1_NEEDED:
2286       if (aprop != NULL && bprop != NULL)
2287         {
2288           number = aprop->u.number;
2289           aprop->u.number = number | bprop->u.number;
2290           updated = number != (unsigned int) aprop->u.number;
2291         }
2292       else
2293         {
2294           /* Return TRUE if APROP is NULL to indicate that BPROP should
2295              be added to ABFD.  */
2296           updated = aprop == NULL;
2297         }
2298       break;
2299
2300     case GNU_PROPERTY_X86_FEATURE_1_AND:
2301       /* Only one of APROP and BPROP can be NULL:
2302          1. APROP & BPROP when both APROP and BPROP aren't NULL.
2303          2. If APROP is NULL, remove x86 feature.
2304          3. Otherwise, do nothing.
2305        */
2306       if (aprop != NULL && bprop != NULL)
2307         {
2308           features = 0;
2309           if (info->ibt)
2310             features = GNU_PROPERTY_X86_FEATURE_1_IBT;
2311           if (info->shstk)
2312             features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
2313           number = aprop->u.number;
2314           /* Add GNU_PROPERTY_X86_FEATURE_1_IBT and
2315              GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
2316           aprop->u.number = (number & bprop->u.number) | features;
2317           updated = number != (unsigned int) aprop->u.number;
2318           /* Remove the property if all feature bits are cleared.  */
2319           if (aprop->u.number == 0)
2320             aprop->pr_kind = property_remove;
2321         }
2322       else
2323         {
2324           features = 0;
2325           if (info->ibt)
2326             features = GNU_PROPERTY_X86_FEATURE_1_IBT;
2327           if (info->shstk)
2328             features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
2329           if (features)
2330             {
2331               /* Add GNU_PROPERTY_X86_FEATURE_1_IBT and
2332                  GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
2333               if (aprop != NULL)
2334                 {
2335                   number = aprop->u.number;
2336                   aprop->u.number = number | features;
2337                   updated = number != (unsigned int) aprop->u.number;
2338                 }
2339               else
2340                 {
2341                   bprop->u.number |= features;
2342                   updated = TRUE;
2343                 }
2344             }
2345           else if (aprop != NULL)
2346             {
2347               aprop->pr_kind = property_remove;
2348               updated = TRUE;
2349             }
2350         }
2351       break;
2352
2353     default:
2354       /* Never should happen.  */
2355       abort ();
2356     }
2357
2358   return updated;
2359 }
2360
2361 /* Set up x86 GNU properties.  Return the first relocatable ELF input
2362    with GNU properties if found.  Otherwise, return NULL.  */
2363
2364 bfd *
2365 _bfd_x86_elf_link_setup_gnu_properties
2366   (struct bfd_link_info *info, struct elf_x86_init_table *init_table)
2367 {
2368   bfd_boolean normal_target;
2369   bfd_boolean lazy_plt;
2370   asection *sec, *pltsec;
2371   bfd *dynobj;
2372   bfd_boolean use_ibt_plt;
2373   unsigned int plt_alignment, features;
2374   struct elf_x86_link_hash_table *htab;
2375   bfd *pbfd;
2376   bfd *ebfd = NULL;
2377   elf_property *prop;
2378   const struct elf_backend_data *bed;
2379   unsigned int class_align = ABI_64_P (info->output_bfd) ? 3 : 2;
2380   unsigned int got_align;
2381
2382   features = 0;
2383   if (info->ibt)
2384     features = GNU_PROPERTY_X86_FEATURE_1_IBT;
2385   if (info->shstk)
2386     features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
2387
2388   /* Find a normal input file with GNU property note.  */
2389   for (pbfd = info->input_bfds;
2390        pbfd != NULL;
2391        pbfd = pbfd->link.next)
2392     if (bfd_get_flavour (pbfd) == bfd_target_elf_flavour
2393         && bfd_count_sections (pbfd) != 0)
2394       {
2395         ebfd = pbfd;
2396
2397         if (elf_properties (pbfd) != NULL)
2398           break;
2399       }
2400
2401   if (ebfd != NULL && features)
2402     {
2403       /* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT and
2404          GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
2405       prop = _bfd_elf_get_property (ebfd,
2406                                     GNU_PROPERTY_X86_FEATURE_1_AND,
2407                                     4);
2408       prop->u.number |= features;
2409       prop->pr_kind = property_number;
2410
2411       /* Create the GNU property note section if needed.  */
2412       if (pbfd == NULL)
2413         {
2414           sec = bfd_make_section_with_flags (ebfd,
2415                                              NOTE_GNU_PROPERTY_SECTION_NAME,
2416                                              (SEC_ALLOC
2417                                               | SEC_LOAD
2418                                               | SEC_IN_MEMORY
2419                                               | SEC_READONLY
2420                                               | SEC_HAS_CONTENTS
2421                                               | SEC_DATA));
2422           if (sec == NULL)
2423             info->callbacks->einfo (_("%F: failed to create GNU property section\n"));
2424
2425           if (!bfd_set_section_alignment (ebfd, sec, class_align))
2426             {
2427 error_alignment:
2428               info->callbacks->einfo (_("%F%A: failed to align section\n"),
2429                                       sec);
2430             }
2431
2432           elf_section_type (sec) = SHT_NOTE;
2433         }
2434     }
2435
2436   pbfd = _bfd_elf_link_setup_gnu_properties (info);
2437
2438   bed = get_elf_backend_data (info->output_bfd);
2439
2440   htab = elf_x86_hash_table (info, bed->target_id);
2441   if (htab == NULL)
2442     return pbfd;
2443
2444   htab->r_info = init_table->r_info;
2445   htab->r_sym = init_table->r_sym;
2446
2447   if (bfd_link_relocatable (info))
2448     return pbfd;
2449
2450   htab->plt0_pad_byte = init_table->plt0_pad_byte;
2451
2452   use_ibt_plt = info->ibtplt || info->ibt;
2453   if (!use_ibt_plt && pbfd != NULL)
2454     {
2455       /* Check if GNU_PROPERTY_X86_FEATURE_1_IBT is on.  */
2456       elf_property_list *p;
2457
2458       /* The property list is sorted in order of type.  */
2459       for (p = elf_properties (pbfd); p; p = p->next)
2460         {
2461           if (GNU_PROPERTY_X86_FEATURE_1_AND == p->property.pr_type)
2462             {
2463               use_ibt_plt = !!(p->property.u.number
2464                                & GNU_PROPERTY_X86_FEATURE_1_IBT);
2465               break;
2466             }
2467           else if (GNU_PROPERTY_X86_FEATURE_1_AND < p->property.pr_type)
2468             break;
2469         }
2470     }
2471
2472   dynobj = htab->elf.dynobj;
2473
2474   /* Set htab->elf.dynobj here so that there is no need to check and
2475      set it in check_relocs.  */
2476   if (dynobj == NULL)
2477     {
2478       if (pbfd != NULL)
2479         {
2480           htab->elf.dynobj = pbfd;
2481           dynobj = pbfd;
2482         }
2483       else
2484         {
2485           bfd *abfd;
2486
2487           /* Find a normal input file to hold linker created
2488              sections.  */
2489           for (abfd = info->input_bfds;
2490                abfd != NULL;
2491                abfd = abfd->link.next)
2492             if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2493                 && (abfd->flags
2494                     & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0)
2495               {
2496                 htab->elf.dynobj = abfd;
2497                 dynobj = abfd;
2498                 break;
2499               }
2500         }
2501     }
2502
2503   /* Return if there are no normal input files.  */
2504   if (dynobj == NULL)
2505     return pbfd;
2506
2507   /* Even when lazy binding is disabled by "-z now", the PLT0 entry may
2508      still be used with LD_AUDIT or LD_PROFILE if PLT entry is used for
2509      canonical function address.  */
2510   htab->plt.has_plt0 = 1;
2511   normal_target = htab->target_os == is_normal;
2512
2513   if (normal_target)
2514     {
2515       if (use_ibt_plt)
2516         {
2517           htab->lazy_plt = init_table->lazy_ibt_plt;
2518           htab->non_lazy_plt = init_table->non_lazy_ibt_plt;
2519         }
2520       else
2521         {
2522           htab->lazy_plt = init_table->lazy_plt;
2523           htab->non_lazy_plt = init_table->non_lazy_plt;
2524         }
2525     }
2526   else
2527     {
2528       htab->lazy_plt = init_table->lazy_plt;
2529       htab->non_lazy_plt = NULL;
2530     }
2531
2532   pltsec = htab->elf.splt;
2533
2534   /* If the non-lazy PLT is available, use it for all PLT entries if
2535      there are no PLT0 or no .plt section.  */
2536   if (htab->non_lazy_plt != NULL
2537       && (!htab->plt.has_plt0 || pltsec == NULL))
2538     {
2539       lazy_plt = FALSE;
2540       if (bfd_link_pic (info))
2541         htab->plt.plt_entry = htab->non_lazy_plt->pic_plt_entry;
2542       else
2543         htab->plt.plt_entry = htab->non_lazy_plt->plt_entry;
2544       htab->plt.plt_entry_size = htab->non_lazy_plt->plt_entry_size;
2545       htab->plt.plt_got_offset = htab->non_lazy_plt->plt_got_offset;
2546       htab->plt.plt_got_insn_size
2547         = htab->non_lazy_plt->plt_got_insn_size;
2548       htab->plt.eh_frame_plt_size
2549         = htab->non_lazy_plt->eh_frame_plt_size;
2550       htab->plt.eh_frame_plt = htab->non_lazy_plt->eh_frame_plt;
2551     }
2552   else
2553     {
2554       lazy_plt = TRUE;
2555       if (bfd_link_pic (info))
2556         {
2557           htab->plt.plt0_entry = htab->lazy_plt->pic_plt0_entry;
2558           htab->plt.plt_entry = htab->lazy_plt->pic_plt_entry;
2559         }
2560       else
2561         {
2562           htab->plt.plt0_entry = htab->lazy_plt->plt0_entry;
2563           htab->plt.plt_entry = htab->lazy_plt->plt_entry;
2564         }
2565       htab->plt.plt_entry_size = htab->lazy_plt->plt_entry_size;
2566       htab->plt.plt_got_offset = htab->lazy_plt->plt_got_offset;
2567       htab->plt.plt_got_insn_size
2568         = htab->lazy_plt->plt_got_insn_size;
2569       htab->plt.eh_frame_plt_size
2570         = htab->lazy_plt->eh_frame_plt_size;
2571       htab->plt.eh_frame_plt = htab->lazy_plt->eh_frame_plt;
2572     }
2573
2574   if (htab->target_os == is_vxworks
2575       && !elf_vxworks_create_dynamic_sections (dynobj, info,
2576                                                &htab->srelplt2))
2577     {
2578       info->callbacks->einfo (_("%F: failed to create VxWorks dynamic sections\n"));
2579       return pbfd;
2580     }
2581
2582   /* Since create_dynamic_sections isn't always called, but GOT
2583      relocations need GOT relocations, create them here so that we
2584      don't need to do it in check_relocs.  */
2585   if (htab->elf.sgot == NULL
2586       && !_bfd_elf_create_got_section (dynobj, info))
2587     info->callbacks->einfo (_("%F: failed to create GOT sections\n"));
2588
2589   got_align = (bed->target_id == X86_64_ELF_DATA) ? 3 : 2;
2590
2591   /* Align .got and .got.plt sections to their entry size.  Do it here
2592      instead of in create_dynamic_sections so that they are always
2593      properly aligned even if create_dynamic_sections isn't called.  */
2594   sec = htab->elf.sgot;
2595   if (!bfd_set_section_alignment (dynobj, sec, got_align))
2596     goto error_alignment;
2597
2598   sec = htab->elf.sgotplt;
2599   if (!bfd_set_section_alignment (dynobj, sec, got_align))
2600     goto error_alignment;
2601
2602   /* Create the ifunc sections here so that check_relocs can be
2603      simplified.  */
2604   if (!_bfd_elf_create_ifunc_sections (dynobj, info))
2605     info->callbacks->einfo (_("%F: failed to create ifunc sections\n"));
2606
2607   plt_alignment = bfd_log2 (htab->plt.plt_entry_size);
2608
2609   if (pltsec != NULL)
2610     {
2611       /* Whe creating executable, set the contents of the .interp
2612          section to the interpreter.  */
2613       if (bfd_link_executable (info) && !info->nointerp)
2614         {
2615           asection *s = bfd_get_linker_section (dynobj, ".interp");
2616           if (s == NULL)
2617             abort ();
2618           s->size = htab->dynamic_interpreter_size;
2619           s->contents = (unsigned char *) htab->dynamic_interpreter;
2620           htab->interp = s;
2621         }
2622
2623       /* Don't change PLT section alignment for NaCl since it uses
2624          64-byte PLT entry and sets PLT section alignment to 32
2625          bytes.  Don't create additional PLT sections for NaCl.  */
2626       if (normal_target)
2627         {
2628           flagword pltflags = (bed->dynamic_sec_flags
2629                                | SEC_ALLOC
2630                                | SEC_CODE
2631                                | SEC_LOAD
2632                                | SEC_READONLY);
2633           unsigned int non_lazy_plt_alignment
2634             = bfd_log2 (htab->non_lazy_plt->plt_entry_size);
2635
2636           sec = pltsec;
2637           if (!bfd_set_section_alignment (sec->owner, sec,
2638                                           plt_alignment))
2639             goto error_alignment;
2640
2641           /* Create the GOT procedure linkage table.  */
2642           sec = bfd_make_section_anyway_with_flags (dynobj,
2643                                                     ".plt.got",
2644                                                     pltflags);
2645           if (sec == NULL)
2646             info->callbacks->einfo (_("%F: failed to create GOT PLT section\n"));
2647
2648           if (!bfd_set_section_alignment (dynobj, sec,
2649                                           non_lazy_plt_alignment))
2650             goto error_alignment;
2651
2652           htab->plt_got = sec;
2653
2654           if (lazy_plt)
2655             {
2656               sec = NULL;
2657
2658               if (use_ibt_plt)
2659                 {
2660                   /* Create the second PLT for Intel IBT support.  IBT
2661                      PLT is supported only for non-NaCl target and is
2662                      is needed only for lazy binding.  */
2663                   sec = bfd_make_section_anyway_with_flags (dynobj,
2664                                                             ".plt.sec",
2665                                                             pltflags);
2666                   if (sec == NULL)
2667                     info->callbacks->einfo (_("%F: failed to create IBT-enabled PLT section\n"));
2668
2669                   if (!bfd_set_section_alignment (dynobj, sec,
2670                                                   plt_alignment))
2671                     goto error_alignment;
2672                 }
2673               else if (info->bndplt && ABI_64_P (dynobj))
2674                 {
2675                   /* Create the second PLT for Intel MPX support.  MPX
2676                      PLT is supported only for non-NaCl target in 64-bit
2677                      mode and is needed only for lazy binding.  */
2678                   sec = bfd_make_section_anyway_with_flags (dynobj,
2679                                                             ".plt.sec",
2680                                                             pltflags);
2681                   if (sec == NULL)
2682                     info->callbacks->einfo (_("%F: failed to create BND PLT section\n"));
2683
2684                   if (!bfd_set_section_alignment (dynobj, sec,
2685                                                   non_lazy_plt_alignment))
2686                     goto error_alignment;
2687                 }
2688
2689               htab->plt_second = sec;
2690             }
2691         }
2692
2693       if (!info->no_ld_generated_unwind_info)
2694         {
2695           flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
2696                             | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2697                             | SEC_LINKER_CREATED);
2698
2699           sec = bfd_make_section_anyway_with_flags (dynobj,
2700                                                     ".eh_frame",
2701                                                     flags);
2702           if (sec == NULL)
2703             info->callbacks->einfo (_("%F: failed to create PLT .eh_frame section\n"));
2704
2705           if (!bfd_set_section_alignment (dynobj, sec, class_align))
2706             goto error_alignment;
2707
2708           htab->plt_eh_frame = sec;
2709
2710           if (htab->plt_got != NULL)
2711             {
2712               sec = bfd_make_section_anyway_with_flags (dynobj,
2713                                                         ".eh_frame",
2714                                                         flags);
2715               if (sec == NULL)
2716                 info->callbacks->einfo (_("%F: failed to create GOT PLT .eh_frame section\n"));
2717
2718               if (!bfd_set_section_alignment (dynobj, sec, class_align))
2719                 goto error_alignment;
2720
2721               htab->plt_got_eh_frame = sec;
2722             }
2723
2724           if (htab->plt_second != NULL)
2725             {
2726               sec = bfd_make_section_anyway_with_flags (dynobj,
2727                                                         ".eh_frame",
2728                                                         flags);
2729               if (sec == NULL)
2730                 info->callbacks->einfo (_("%F: failed to create the second PLT .eh_frame section\n"));
2731
2732               if (!bfd_set_section_alignment (dynobj, sec, class_align))
2733                 goto error_alignment;
2734
2735               htab->plt_second_eh_frame = sec;
2736             }
2737         }
2738     }
2739
2740   if (normal_target)
2741     {
2742       /* The .iplt section is used for IFUNC symbols in static
2743          executables.  */
2744       sec = htab->elf.iplt;
2745       if (sec != NULL
2746           && !bfd_set_section_alignment (sec->owner, sec,
2747                                          plt_alignment))
2748         goto error_alignment;
2749     }
2750
2751   return pbfd;
2752 }