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