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