xref: /netbsd-src/external/gpl3/gdb.old/dist/bfd/elfxx-x86.c (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
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 
34 bfd_boolean
35 _bfd_x86_elf_mkobject (bfd *abfd)
36 {
37   return bfd_elf_allocate_object (abfd,
38 				  sizeof (struct elf_x86_obj_tdata),
39 				  get_elf_backend_data (abfd)->target_id);
40 }
41 
42 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
43    executables.  Rather than setting it to the beginning of the TLS
44    section, we have to set it to the end.    This function may be called
45    multiple times, it is idempotent.  */
46 
47 void
48 _bfd_x86_elf_set_tls_module_base (struct bfd_link_info *info)
49 {
50   struct elf_x86_link_hash_table *htab;
51   struct bfd_link_hash_entry *base;
52   const struct elf_backend_data *bed;
53 
54   if (!bfd_link_executable (info))
55     return;
56 
57   bed = get_elf_backend_data (info->output_bfd);
58   htab = elf_x86_hash_table (info, bed->target_id);
59   if (htab == NULL)
60     return;
61 
62   base = htab->tls_module_base;
63   if (base == NULL)
64     return;
65 
66   base->u.def.value = htab->elf.tls_size;
67 }
68 
69 /* Return the base VMA address which should be subtracted from real addresses
70    when resolving @dtpoff relocation.
71    This is PT_TLS segment p_vaddr.  */
72 
73 bfd_vma
74 _bfd_x86_elf_dtpoff_base (struct bfd_link_info *info)
75 {
76   /* If tls_sec is NULL, we should have signalled an error already.  */
77   if (elf_hash_table (info)->tls_sec == NULL)
78     return 0;
79   return elf_hash_table (info)->tls_sec->vma;
80 }
81 
82 /* Allocate space in .plt, .got and associated reloc sections for
83    dynamic relocs.  */
84 
85 static bfd_boolean
86 elf_x86_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
87 {
88   struct bfd_link_info *info;
89   struct elf_x86_link_hash_table *htab;
90   struct elf_x86_link_hash_entry *eh;
91   struct elf_dyn_relocs *p;
92   unsigned int plt_entry_size;
93   bfd_boolean resolved_to_zero;
94   const struct elf_backend_data *bed;
95 
96   if (h->root.type == bfd_link_hash_indirect)
97     return TRUE;
98 
99   eh = (struct elf_x86_link_hash_entry *) h;
100 
101   info = (struct bfd_link_info *) inf;
102   bed = get_elf_backend_data (info->output_bfd);
103   htab = elf_x86_hash_table (info, bed->target_id);
104   if (htab == NULL)
105     return FALSE;
106 
107   plt_entry_size = htab->plt.plt_entry_size;
108 
109   resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
110 
111   /* We can't use the GOT PLT if pointer equality is needed since
112      finish_dynamic_symbol won't clear symbol value and the dynamic
113      linker won't update the GOT slot.  We will get into an infinite
114      loop at run-time.  */
115   if (htab->plt_got != NULL
116       && h->type != STT_GNU_IFUNC
117       && !h->pointer_equality_needed
118       && h->plt.refcount > 0
119       && h->got.refcount > 0)
120     {
121       /* Don't use the regular PLT if there are both GOT and GOTPLT
122 	 reloctions.  */
123       h->plt.offset = (bfd_vma) -1;
124 
125       /* Use the GOT PLT.  */
126       eh->plt_got.refcount = 1;
127     }
128 
129   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
130      here if it is defined and referenced in a non-shared object.  */
131   if (h->type == STT_GNU_IFUNC
132       && h->def_regular)
133     {
134       if (_bfd_elf_allocate_ifunc_dyn_relocs (info, h, &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 
537 static bfd_boolean
538 elf_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 
555 struct 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 
598 struct 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 
650 hashval_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 
660 int
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 
673 static void
674 elf_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 
686 static bfd_boolean
687 elf_i386_is_reloc_section (const char *secname)
688 {
689   return CONST_STRNEQ (secname, ".rel");
690 }
691 
692 static bfd_boolean
693 elf_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 
700 struct 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 
776 int
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 
793 static void
794 elf_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 
819 static void
820 elf_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 
838 bfd_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 
893 bfd_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 
989 bfd_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 
1365 struct 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 
1581 bfd_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 
1625 void
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 
1642 void
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 
1686 bfd_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 
1705 void
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 
1748 bfd_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 
1765 bfd_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 
1955 void
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 
1980 bfd_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 
2022 asection *
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 
2047 static bfd_vma
2048 elf_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 
2056 static bfd_vma
2057 elf_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 
2065 static bfd_boolean
2066 elf_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 
2073 static bfd_boolean
2074 elf_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 
2081 long
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 
2296 enum 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 
2331 bfd_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 
2477 bfd *
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 
2948 void
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 
2989 void
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