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