xref: /netbsd-src/external/gpl3/gdb/dist/bfd/elfxx-x86.c (revision 22ebeae4b2252475e0ebe332f69734639cb946ea)
1 /* x86 specific support for ELF
2    Copyright (C) 2017-2024 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 
25 /* The name of the dynamic interpreter.  This is put in the .interp
26    section.  */
27 
28 #define ELF32_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
29 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
30 #define ELFX32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
31 
32 bool
33 _bfd_x86_elf_mkobject (bfd *abfd)
34 {
35   return bfd_elf_allocate_object (abfd,
36 				  sizeof (struct elf_x86_obj_tdata),
37 				  get_elf_backend_data (abfd)->target_id);
38 }
39 
40 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
41    executables.  Rather than setting it to the beginning of the TLS
42    section, we have to set it to the end.    This function may be called
43    multiple times, it is idempotent.  */
44 
45 void
46 _bfd_x86_elf_set_tls_module_base (struct bfd_link_info *info)
47 {
48   struct elf_x86_link_hash_table *htab;
49   struct bfd_link_hash_entry *base;
50   const struct elf_backend_data *bed;
51 
52   if (!bfd_link_executable (info))
53     return;
54 
55   bed = get_elf_backend_data (info->output_bfd);
56   htab = elf_x86_hash_table (info, bed->target_id);
57   if (htab == NULL)
58     return;
59 
60   base = htab->tls_module_base;
61   if (base == NULL)
62     return;
63 
64   base->u.def.value = htab->elf.tls_size;
65 }
66 
67 /* Return the base VMA address which should be subtracted from real addresses
68    when resolving @dtpoff relocation.
69    This is PT_TLS segment p_vaddr.  */
70 
71 bfd_vma
72 _bfd_x86_elf_dtpoff_base (struct bfd_link_info *info)
73 {
74   /* If tls_sec is NULL, we should have signalled an error already.  */
75   if (elf_hash_table (info)->tls_sec == NULL)
76     return 0;
77   return elf_hash_table (info)->tls_sec->vma;
78 }
79 
80 /* Allocate space in .plt, .got and associated reloc sections for
81    dynamic relocs.  */
82 
83 static bool
84 elf_x86_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
85 {
86   struct bfd_link_info *info;
87   struct elf_x86_link_hash_table *htab;
88   struct elf_x86_link_hash_entry *eh;
89   struct elf_dyn_relocs *p;
90   unsigned int plt_entry_size;
91   bool resolved_to_zero;
92   const struct elf_backend_data *bed;
93 
94   if (h->root.type == bfd_link_hash_indirect)
95     return true;
96 
97   eh = (struct elf_x86_link_hash_entry *) h;
98 
99   info = (struct bfd_link_info *) inf;
100   bed = get_elf_backend_data (info->output_bfd);
101   htab = elf_x86_hash_table (info, bed->target_id);
102   if (htab == NULL)
103     return false;
104 
105   plt_entry_size = htab->plt.plt_entry_size;
106 
107   resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
108 
109   /* We can't use the GOT PLT if pointer equality is needed since
110      finish_dynamic_symbol won't clear symbol value and the dynamic
111      linker won't update the GOT slot.  We will get into an infinite
112      loop at run-time.  */
113   if (htab->plt_got != NULL
114       && h->type != STT_GNU_IFUNC
115       && !h->pointer_equality_needed
116       && h->plt.refcount > 0
117       && h->got.refcount > 0)
118     {
119       /* Don't use the regular PLT if there are both GOT and GOTPLT
120 	 reloctions.  */
121       h->plt.offset = (bfd_vma) -1;
122 
123       /* Use the GOT PLT.  */
124       eh->plt_got.refcount = 1;
125     }
126 
127   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
128      here if it is defined and referenced in a non-shared object.  */
129   if (h->type == STT_GNU_IFUNC
130       && h->def_regular)
131     {
132       /* GOTOFF relocation needs PLT.  */
133       if (eh->gotoff_ref)
134 	h->plt.refcount = 1;
135 
136       if (_bfd_elf_allocate_ifunc_dyn_relocs (info, h, &h->dyn_relocs,
137 					      plt_entry_size,
138 					      (htab->plt.has_plt0
139 					       * plt_entry_size),
140 					       htab->got_entry_size,
141 					       true))
142 	{
143 	  asection *s = htab->plt_second;
144 	  if (h->plt.offset != (bfd_vma) -1 && s != NULL)
145 	    {
146 	      /* Use the second PLT section if it is created.  */
147 	      eh->plt_second.offset = s->size;
148 
149 	      /* Make room for this entry in the second PLT section.  */
150 	      s->size += htab->non_lazy_plt->plt_entry_size;
151 	    }
152 
153 	  return true;
154 	}
155       else
156 	return false;
157     }
158   /* Don't create the PLT entry if there are only function pointer
159      relocations which can be resolved at run-time.  */
160   else if (htab->elf.dynamic_sections_created
161 	   && (h->plt.refcount > 0
162 	       || eh->plt_got.refcount > 0))
163     {
164       bool use_plt_got = eh->plt_got.refcount > 0;
165 
166       /* Make sure this symbol is output as a dynamic symbol.
167 	 Undefined weak syms won't yet be marked as dynamic.  */
168       if (h->dynindx == -1
169 	  && !h->forced_local
170 	  && !resolved_to_zero
171 	  && h->root.type == bfd_link_hash_undefweak)
172 	{
173 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
174 	    return false;
175 	}
176 
177       if (bfd_link_pic (info)
178 	  || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
179 	{
180 	  asection *s = htab->elf.splt;
181 	  asection *second_s = htab->plt_second;
182 	  asection *got_s = htab->plt_got;
183 	  bool use_plt;
184 
185 	  /* If this is the first .plt entry, make room for the special
186 	     first entry.  The .plt section is used by prelink to undo
187 	     prelinking for dynamic relocations.  */
188 	  if (s->size == 0)
189 	    s->size = htab->plt.has_plt0 * plt_entry_size;
190 
191 	  if (use_plt_got)
192 	    eh->plt_got.offset = got_s->size;
193 	  else
194 	    {
195 	      h->plt.offset = s->size;
196 	      if (second_s)
197 		eh->plt_second.offset = second_s->size;
198 	    }
199 
200 	  /* If this symbol is not defined in a regular file, and we are
201 	     generating PDE, then set the symbol to this location in the
202 	     .plt.  This is required to make function pointers compare
203 	     as equal between PDE and the shared library.
204 
205 	     NB: If PLT is PC-relative, we can use the .plt in PIE for
206 	     function address. */
207 	  if (h->def_regular)
208 	    use_plt = false;
209 	  else if (htab->pcrel_plt)
210 	    use_plt = ! bfd_link_dll (info);
211 	  else
212 	    use_plt = bfd_link_pde (info);
213 	  if (use_plt)
214 	    {
215 	      if (use_plt_got)
216 		{
217 		  /* We need to make a call to the entry of the GOT PLT
218 		     instead of regular PLT entry.  */
219 		  h->root.u.def.section = got_s;
220 		  h->root.u.def.value = eh->plt_got.offset;
221 		}
222 	      else
223 		{
224 		  if (second_s)
225 		    {
226 		      /* We need to make a call to the entry of the
227 			 second PLT instead of regular PLT entry.  */
228 		      h->root.u.def.section = second_s;
229 		      h->root.u.def.value = eh->plt_second.offset;
230 		    }
231 		  else
232 		    {
233 		      h->root.u.def.section = s;
234 		      h->root.u.def.value = h->plt.offset;
235 		    }
236 		}
237 	    }
238 
239 	  /* Make room for this entry.  */
240 	  if (use_plt_got)
241 	    got_s->size += htab->non_lazy_plt->plt_entry_size;
242 	  else
243 	    {
244 	      s->size += plt_entry_size;
245 	      if (second_s)
246 		second_s->size += htab->non_lazy_plt->plt_entry_size;
247 
248 	      /* We also need to make an entry in the .got.plt section,
249 		 which will be placed in the .got section by the linker
250 		 script.  */
251 	      htab->elf.sgotplt->size += htab->got_entry_size;
252 
253 	      /* There should be no PLT relocation against resolved
254 		 undefined weak symbol in executable.  */
255 	      if (!resolved_to_zero)
256 		{
257 		  /* We also need to make an entry in the .rel.plt
258 		     section.  */
259 		  htab->elf.srelplt->size += htab->sizeof_reloc;
260 		  htab->elf.srelplt->reloc_count++;
261 		}
262 	    }
263 
264 	  if (htab->elf.target_os == is_vxworks && !bfd_link_pic (info))
265 	    {
266 	      /* VxWorks has a second set of relocations for each PLT entry
267 		 in executables.  They go in a separate relocation section,
268 		 which is processed by the kernel loader.  */
269 
270 	      /* There are two relocations for the initial PLT entry: an
271 		 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
272 		 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8.  */
273 
274 	      asection *srelplt2 = htab->srelplt2;
275 	      if (h->plt.offset == plt_entry_size)
276 		srelplt2->size += (htab->sizeof_reloc * 2);
277 
278 	      /* There are two extra relocations for each subsequent PLT entry:
279 		 an R_386_32 relocation for the GOT entry, and an R_386_32
280 		 relocation for the PLT entry.  */
281 
282 	      srelplt2->size += (htab->sizeof_reloc * 2);
283 	    }
284 	}
285       else
286 	{
287 	  eh->plt_got.offset = (bfd_vma) -1;
288 	  h->plt.offset = (bfd_vma) -1;
289 	  h->needs_plt = 0;
290 	}
291     }
292   else
293     {
294       eh->plt_got.offset = (bfd_vma) -1;
295       h->plt.offset = (bfd_vma) -1;
296       h->needs_plt = 0;
297     }
298 
299   eh->tlsdesc_got = (bfd_vma) -1;
300 
301   /* For i386, if R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the
302      binary, make it a R_386_TLS_LE_32 requiring no TLS entry.  For
303      x86-64, if R_X86_64_GOTTPOFF symbol is now local to the binary,
304      make it a R_X86_64_TPOFF32 requiring no GOT entry.  */
305   if (h->got.refcount > 0
306       && bfd_link_executable (info)
307       && h->dynindx == -1
308       && (elf_x86_hash_entry (h)->tls_type & GOT_TLS_IE))
309     h->got.offset = (bfd_vma) -1;
310   else if (h->got.refcount > 0)
311     {
312       asection *s;
313       bool dyn;
314       int tls_type = elf_x86_hash_entry (h)->tls_type;
315 
316       /* Make sure this symbol is output as a dynamic symbol.
317 	 Undefined weak syms won't yet be marked as dynamic.  */
318       if (h->dynindx == -1
319 	  && !h->forced_local
320 	  && !resolved_to_zero
321 	  && h->root.type == bfd_link_hash_undefweak)
322 	{
323 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
324 	    return false;
325 	}
326 
327       s = htab->elf.sgot;
328       if (GOT_TLS_GDESC_P (tls_type))
329 	{
330 	  eh->tlsdesc_got = htab->elf.sgotplt->size
331 	    - elf_x86_compute_jump_table_size (htab);
332 	  htab->elf.sgotplt->size += 2 * htab->got_entry_size;
333 	  h->got.offset = (bfd_vma) -2;
334 	}
335       if (! GOT_TLS_GDESC_P (tls_type)
336 	  || GOT_TLS_GD_P (tls_type))
337 	{
338 	  h->got.offset = s->size;
339 	  s->size += htab->got_entry_size;
340 	  /* R_386_TLS_GD and R_X86_64_TLSGD need 2 consecutive GOT
341 	     slots.  */
342 	  if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH)
343 	    s->size += htab->got_entry_size;
344 	}
345       dyn = htab->elf.dynamic_sections_created;
346       /* R_386_TLS_IE_32 needs one dynamic relocation,
347 	 R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
348 	 (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
349 	 need two), R_386_TLS_GD and R_X86_64_TLSGD need one if local
350 	 symbol and two if global.  No dynamic relocation against
351 	 resolved undefined weak symbol in executable.  No dynamic
352 	 relocation against non-preemptible absolute symbol.  */
353       if (tls_type == GOT_TLS_IE_BOTH)
354 	htab->elf.srelgot->size += 2 * htab->sizeof_reloc;
355       else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
356 	       || (tls_type & GOT_TLS_IE))
357 	htab->elf.srelgot->size += htab->sizeof_reloc;
358       else if (GOT_TLS_GD_P (tls_type))
359 	htab->elf.srelgot->size += 2 * htab->sizeof_reloc;
360       else if (! GOT_TLS_GDESC_P (tls_type)
361 	       && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
362 		    && !resolved_to_zero)
363 		   || h->root.type != bfd_link_hash_undefweak)
364 	       && ((bfd_link_pic (info)
365 		    && !(h->dynindx == -1
366 			 && ABS_SYMBOL_P (h)))
367 		   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
368 	htab->elf.srelgot->size += htab->sizeof_reloc;
369       if (GOT_TLS_GDESC_P (tls_type))
370 	{
371 	  htab->elf.srelplt->size += htab->sizeof_reloc;
372 	  if (bed->target_id == X86_64_ELF_DATA)
373 	    htab->elf.tlsdesc_plt = (bfd_vma) -1;
374 	}
375     }
376   else
377     h->got.offset = (bfd_vma) -1;
378 
379   if (h->dyn_relocs == NULL)
380     return true;
381 
382   /* In the shared -Bsymbolic case, discard space allocated for
383      dynamic pc-relative relocs against symbols which turn out to be
384      defined in regular objects.  For the normal shared case, discard
385      space for pc-relative relocs that have become local due to symbol
386      visibility changes.  */
387 
388   if (bfd_link_pic (info))
389     {
390       /* Relocs that use pc_count are those that appear on a call
391 	 insn, or certain REL relocs that can generated via assembly.
392 	 We want calls to protected symbols to resolve directly to the
393 	 function rather than going via the plt.  If people want
394 	 function pointer comparisons to work as expected then they
395 	 should avoid writing weird assembly.  */
396       if (SYMBOL_CALLS_LOCAL (info, h))
397 	{
398 	  struct elf_dyn_relocs **pp;
399 
400 	  for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
401 	    {
402 	      p->count -= p->pc_count;
403 	      p->pc_count = 0;
404 	      if (p->count == 0)
405 		*pp = p->next;
406 	      else
407 		pp = &p->next;
408 	    }
409 	}
410 
411       if (htab->elf.target_os == is_vxworks)
412 	{
413 	  struct elf_dyn_relocs **pp;
414 	  for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
415 	    {
416 	      if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
417 		*pp = p->next;
418 	      else
419 		pp = &p->next;
420 	    }
421 	}
422 
423       /* Also discard relocs on undefined weak syms with non-default
424 	 visibility or in PIE.  */
425       if (h->dyn_relocs != NULL)
426 	{
427 	  if (h->root.type == bfd_link_hash_undefweak)
428 	    {
429 	      /* Undefined weak symbol is never bound locally in shared
430 		 library.  */
431 	      if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
432 		  || resolved_to_zero)
433 		{
434 		  if (bed->target_id == I386_ELF_DATA
435 		      && h->non_got_ref)
436 		    {
437 		      /* Keep dynamic non-GOT/non-PLT relocation so
438 			 that we can branch to 0 without PLT.  */
439 		      struct elf_dyn_relocs **pp;
440 
441 		      for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
442 			if (p->pc_count == 0)
443 			  *pp = p->next;
444 			else
445 			  {
446 			    /* Remove non-R_386_PC32 relocation.  */
447 			    p->count = p->pc_count;
448 			    pp = &p->next;
449 			  }
450 
451 		      /* Make sure undefined weak symbols are output
452 			 as dynamic symbols in PIEs for dynamic non-GOT
453 			 non-PLT reloations.  */
454 		      if (h->dyn_relocs != NULL
455 			  && !bfd_elf_link_record_dynamic_symbol (info, h))
456 			return false;
457 		    }
458 		  else
459 		    h->dyn_relocs = NULL;
460 		}
461 	      else if (h->dynindx == -1
462 		       && !h->forced_local
463 		       && !bfd_elf_link_record_dynamic_symbol (info, h))
464 		return false;
465 	    }
466 	  else if (bfd_link_executable (info)
467 		   && (h->needs_copy || eh->needs_copy)
468 		   && h->def_dynamic
469 		   && !h->def_regular)
470 	    {
471 	      /* NB: needs_copy is set only for x86-64.  For PIE,
472 		 discard space for pc-relative relocs against symbols
473 		 which turn out to need copy relocs.  */
474 	      struct elf_dyn_relocs **pp;
475 
476 	      for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
477 		{
478 		  if (p->pc_count != 0)
479 		    *pp = p->next;
480 		  else
481 		    pp = &p->next;
482 		}
483 	    }
484 	}
485     }
486   else if (ELIMINATE_COPY_RELOCS)
487     {
488       /* For the non-shared case, discard space for relocs against
489 	 symbols which turn out to need copy relocs or are not
490 	 dynamic.  Keep dynamic relocations for run-time function
491 	 pointer initialization.  */
492 
493       if ((!h->non_got_ref
494 	   || (h->root.type == bfd_link_hash_undefweak
495 	       && !resolved_to_zero))
496 	  && ((h->def_dynamic
497 	       && !h->def_regular)
498 	      || (htab->elf.dynamic_sections_created
499 		  && (h->root.type == bfd_link_hash_undefweak
500 		      || h->root.type == bfd_link_hash_undefined))))
501 	{
502 	  /* Make sure this symbol is output as a dynamic symbol.
503 	     Undefined weak syms won't yet be marked as dynamic.  */
504 	  if (h->dynindx == -1
505 	      && !h->forced_local
506 	      && !resolved_to_zero
507 	      && h->root.type == bfd_link_hash_undefweak
508 	      && ! bfd_elf_link_record_dynamic_symbol (info, h))
509 	    return false;
510 
511 	  /* If that succeeded, we know we'll be keeping all the
512 	     relocs.  */
513 	  if (h->dynindx != -1)
514 	    goto keep;
515 	}
516 
517       h->dyn_relocs = NULL;
518 
519     keep: ;
520     }
521 
522   /* Finally, allocate space.  */
523   for (p = h->dyn_relocs; p != NULL; p = p->next)
524     {
525       asection *sreloc;
526 
527       if (eh->def_protected && bfd_link_executable (info))
528 	{
529 	  /* Disallow copy relocation against non-copyable protected
530 	     symbol.  */
531 	  asection *s = p->sec->output_section;
532 	  if (s != NULL && (s->flags & SEC_READONLY) != 0)
533 	    {
534 	      info->callbacks->einfo
535 		/* xgettext:c-format */
536 		(_("%F%P: %pB: copy relocation against non-copyable "
537 		   "protected symbol `%s' in %pB\n"),
538 		 p->sec->owner, h->root.root.string,
539 		 h->root.u.def.section->owner);
540 	      return false;
541 	    }
542 	}
543 
544       sreloc = elf_section_data (p->sec)->sreloc;
545 
546       BFD_ASSERT (sreloc != NULL);
547       sreloc->size += p->count * htab->sizeof_reloc;
548     }
549 
550   return true;
551 }
552 
553 /* Allocate space in .plt, .got and associated reloc sections for
554    local dynamic relocs.  */
555 
556 static int
557 elf_x86_allocate_local_dynreloc (void **slot, void *inf)
558 {
559   struct elf_link_hash_entry *h
560     = (struct elf_link_hash_entry *) *slot;
561 
562   if (h->type != STT_GNU_IFUNC
563       || !h->def_regular
564       || !h->ref_regular
565       || !h->forced_local
566       || h->root.type != bfd_link_hash_defined)
567     abort ();
568 
569   return elf_x86_allocate_dynrelocs (h, inf);
570 }
571 
572 /* Find and/or create a hash entry for local symbol.  */
573 
574 struct elf_link_hash_entry *
575 _bfd_elf_x86_get_local_sym_hash (struct elf_x86_link_hash_table *htab,
576 				 bfd *abfd, const Elf_Internal_Rela *rel,
577 				 bool create)
578 {
579   struct elf_x86_link_hash_entry e, *ret;
580   asection *sec = abfd->sections;
581   hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
582 				       htab->r_sym (rel->r_info));
583   void **slot;
584 
585   e.elf.indx = sec->id;
586   e.elf.dynstr_index = htab->r_sym (rel->r_info);
587   slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
588 				   create ? INSERT : NO_INSERT);
589 
590   if (!slot)
591     return NULL;
592 
593   if (*slot)
594     {
595       ret = (struct elf_x86_link_hash_entry *) *slot;
596       return &ret->elf;
597     }
598 
599   ret = (struct elf_x86_link_hash_entry *)
600 	objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
601 			sizeof (struct elf_x86_link_hash_entry));
602   if (ret)
603     {
604       memset (ret, 0, sizeof (*ret));
605       ret->elf.indx = sec->id;
606       ret->elf.dynstr_index = htab->r_sym (rel->r_info);
607       ret->elf.dynindx = -1;
608       ret->plt_got.offset = (bfd_vma) -1;
609       *slot = ret;
610     }
611   return &ret->elf;
612 }
613 
614 /* Create an entry in a x86 ELF linker hash table.  NB: THIS MUST BE IN
615    SYNC WITH _bfd_elf_link_hash_newfunc.  */
616 
617 struct bfd_hash_entry *
618 _bfd_x86_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
619 				struct bfd_hash_table *table,
620 				const char *string)
621 {
622   /* Allocate the structure if it has not already been allocated by a
623      subclass.  */
624   if (entry == NULL)
625     {
626       entry = (struct bfd_hash_entry *)
627 	bfd_hash_allocate (table,
628 			   sizeof (struct elf_x86_link_hash_entry));
629       if (entry == NULL)
630 	return entry;
631     }
632 
633   /* Call the allocation method of the superclass.  */
634   entry = _bfd_link_hash_newfunc (entry, table, string);
635   if (entry != NULL)
636     {
637       struct elf_x86_link_hash_entry *eh
638        = (struct elf_x86_link_hash_entry *) entry;
639       struct elf_link_hash_table *htab
640 	= (struct elf_link_hash_table *) table;
641 
642       memset (&eh->elf.size, 0,
643 	      (sizeof (struct elf_x86_link_hash_entry)
644 	       - offsetof (struct elf_link_hash_entry, size)));
645       /* Set local fields.  */
646       eh->elf.indx = -1;
647       eh->elf.dynindx = -1;
648       eh->elf.got = htab->init_got_refcount;
649       eh->elf.plt = htab->init_plt_refcount;
650       /* Assume that we have been called by a non-ELF symbol reader.
651 	 This flag is then reset by the code which reads an ELF input
652 	 file.  This ensures that a symbol created by a non-ELF symbol
653 	 reader will have the flag set correctly.  */
654       eh->elf.non_elf = 1;
655       eh->plt_second.offset = (bfd_vma) -1;
656       eh->plt_got.offset = (bfd_vma) -1;
657       eh->tlsdesc_got = (bfd_vma) -1;
658       eh->zero_undefweak = 1;
659     }
660 
661   return entry;
662 }
663 
664 /* Compute a hash of a local hash entry.  We use elf_link_hash_entry
665   for local symbol so that we can handle local STT_GNU_IFUNC symbols
666   as global symbol.  We reuse indx and dynstr_index for local symbol
667   hash since they aren't used by global symbols in this backend.  */
668 
669 hashval_t
670 _bfd_x86_elf_local_htab_hash (const void *ptr)
671 {
672   struct elf_link_hash_entry *h
673     = (struct elf_link_hash_entry *) ptr;
674   return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
675 }
676 
677 /* Compare local hash entries.  */
678 
679 int
680 _bfd_x86_elf_local_htab_eq (const void *ptr1, const void *ptr2)
681 {
682   struct elf_link_hash_entry *h1
683      = (struct elf_link_hash_entry *) ptr1;
684   struct elf_link_hash_entry *h2
685     = (struct elf_link_hash_entry *) ptr2;
686 
687   return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
688 }
689 
690 /* Destroy an x86 ELF linker hash table.  */
691 
692 static void
693 elf_x86_link_hash_table_free (bfd *obfd)
694 {
695   struct elf_x86_link_hash_table *htab
696     = (struct elf_x86_link_hash_table *) obfd->link.hash;
697 
698   if (htab->loc_hash_table)
699     htab_delete (htab->loc_hash_table);
700   if (htab->loc_hash_memory)
701     objalloc_free ((struct objalloc *) htab->loc_hash_memory);
702   _bfd_elf_link_hash_table_free (obfd);
703 }
704 
705 static bool
706 elf_i386_is_reloc_section (const char *secname)
707 {
708   return startswith (secname, ".rel");
709 }
710 
711 static bool
712 elf_x86_64_is_reloc_section (const char *secname)
713 {
714   return startswith (secname, ".rela");
715 }
716 
717 /* Create an x86 ELF linker hash table.  */
718 
719 struct bfd_link_hash_table *
720 _bfd_x86_elf_link_hash_table_create (bfd *abfd)
721 {
722   struct elf_x86_link_hash_table *ret;
723   const struct elf_backend_data *bed;
724   size_t amt = sizeof (struct elf_x86_link_hash_table);
725 
726   ret = (struct elf_x86_link_hash_table *) bfd_zmalloc (amt);
727   if (ret == NULL)
728     return NULL;
729 
730   bed = get_elf_backend_data (abfd);
731   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
732 				      _bfd_x86_elf_link_hash_newfunc,
733 				      sizeof (struct elf_x86_link_hash_entry),
734 				      bed->target_id))
735     {
736       free (ret);
737       return NULL;
738     }
739 
740   if (bed->target_id == X86_64_ELF_DATA)
741     {
742       ret->is_reloc_section = elf_x86_64_is_reloc_section;
743       ret->got_entry_size = 8;
744       ret->pcrel_plt = true;
745       ret->tls_get_addr = "__tls_get_addr";
746       ret->relative_r_type = R_X86_64_RELATIVE;
747       ret->relative_r_name = "R_X86_64_RELATIVE";
748       ret->elf_append_reloc = elf_append_rela;
749       ret->elf_write_addend_in_got = _bfd_elf64_write_addend;
750     }
751   if (ABI_64_P (abfd))
752     {
753       ret->sizeof_reloc = sizeof (Elf64_External_Rela);
754       ret->pointer_r_type = R_X86_64_64;
755       ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
756       ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
757       ret->elf_write_addend = _bfd_elf64_write_addend;
758     }
759   else
760     {
761       if (bed->target_id == X86_64_ELF_DATA)
762 	{
763 	  ret->sizeof_reloc = sizeof (Elf32_External_Rela);
764 	  ret->pointer_r_type = R_X86_64_32;
765 	  ret->dynamic_interpreter = ELFX32_DYNAMIC_INTERPRETER;
766 	  ret->dynamic_interpreter_size
767 	    = sizeof ELFX32_DYNAMIC_INTERPRETER;
768 	  ret->elf_write_addend = _bfd_elf32_write_addend;
769 	}
770       else
771 	{
772 	  ret->is_reloc_section = elf_i386_is_reloc_section;
773 	  ret->sizeof_reloc = sizeof (Elf32_External_Rel);
774 	  ret->got_entry_size = 4;
775 	  ret->pcrel_plt = false;
776 	  ret->pointer_r_type = R_386_32;
777 	  ret->relative_r_type = R_386_RELATIVE;
778 	  ret->relative_r_name = "R_386_RELATIVE";
779 	  ret->elf_append_reloc = elf_append_rel;
780 	  ret->elf_write_addend = _bfd_elf32_write_addend;
781 	  ret->elf_write_addend_in_got = _bfd_elf32_write_addend;
782 	  ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
783 	  ret->dynamic_interpreter_size
784 	    = sizeof ELF32_DYNAMIC_INTERPRETER;
785 	  ret->tls_get_addr = "___tls_get_addr";
786 	}
787     }
788 
789   ret->loc_hash_table = htab_try_create (1024,
790 					 _bfd_x86_elf_local_htab_hash,
791 					 _bfd_x86_elf_local_htab_eq,
792 					 NULL);
793   ret->loc_hash_memory = objalloc_create ();
794   if (!ret->loc_hash_table || !ret->loc_hash_memory)
795     {
796       elf_x86_link_hash_table_free (abfd);
797       return NULL;
798     }
799   ret->elf.root.hash_table_free = elf_x86_link_hash_table_free;
800 
801   return &ret->elf.root;
802 }
803 
804 /* Sort relocs into address order.  */
805 
806 int
807 _bfd_x86_elf_compare_relocs (const void *ap, const void *bp)
808 {
809   const arelent *a = * (const arelent **) ap;
810   const arelent *b = * (const arelent **) bp;
811 
812   if (a->address > b->address)
813     return 1;
814   else if (a->address < b->address)
815     return -1;
816   else
817     return 0;
818 }
819 
820 /* Mark symbol, NAME, as locally defined by linker if it is referenced
821    and not defined in a relocatable object file.  */
822 
823 static void
824 elf_x86_linker_defined (struct bfd_link_info *info, const char *name)
825 {
826   struct elf_link_hash_entry *h;
827 
828   h = elf_link_hash_lookup (elf_hash_table (info), name,
829 			    false, false, false);
830   if (h == NULL)
831     return;
832 
833   while (h->root.type == bfd_link_hash_indirect)
834     h = (struct elf_link_hash_entry *) h->root.u.i.link;
835 
836   if (h->root.type == bfd_link_hash_new
837       || h->root.type == bfd_link_hash_undefined
838       || h->root.type == bfd_link_hash_undefweak
839       || h->root.type == bfd_link_hash_common
840       || (!h->def_regular && h->def_dynamic))
841     {
842       elf_x86_hash_entry (h)->local_ref = 2;
843       elf_x86_hash_entry (h)->linker_def = 1;
844     }
845 }
846 
847 /* Hide a linker-defined symbol, NAME, with hidden visibility.  */
848 
849 static void
850 elf_x86_hide_linker_defined (struct bfd_link_info *info,
851 			     const char *name)
852 {
853   struct elf_link_hash_entry *h;
854 
855   h = elf_link_hash_lookup (elf_hash_table (info), name,
856 			    false, false, false);
857   if (h == NULL)
858     return;
859 
860   while (h->root.type == bfd_link_hash_indirect)
861     h = (struct elf_link_hash_entry *) h->root.u.i.link;
862 
863   if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
864       || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
865     _bfd_elf_link_hash_hide_symbol (info, h, true);
866 }
867 
868 bool
869 _bfd_x86_elf_link_check_relocs (bfd *abfd, struct bfd_link_info *info)
870 {
871   if (!bfd_link_relocatable (info))
872     {
873       /* Check for __tls_get_addr reference.  */
874       struct elf_x86_link_hash_table *htab;
875       const struct elf_backend_data *bed = get_elf_backend_data (abfd);
876       htab = elf_x86_hash_table (info, bed->target_id);
877       if (htab)
878 	{
879 	  struct elf_link_hash_entry *h;
880 
881 	  h = elf_link_hash_lookup (elf_hash_table (info),
882 				    htab->tls_get_addr,
883 				    false, false, false);
884 	  if (h != NULL)
885 	    {
886 	      elf_x86_hash_entry (h)->tls_get_addr = 1;
887 
888 	      /* Check the versioned __tls_get_addr symbol.  */
889 	      while (h->root.type == bfd_link_hash_indirect)
890 		{
891 		  h = (struct elf_link_hash_entry *) h->root.u.i.link;
892 		  elf_x86_hash_entry (h)->tls_get_addr = 1;
893 		}
894 	    }
895 
896 	  /* "__ehdr_start" will be defined by linker as a hidden symbol
897 	     later if it is referenced and not defined.  */
898 	  elf_x86_linker_defined (info, "__ehdr_start");
899 
900 	  if (bfd_link_executable (info))
901 	    {
902 	      /* References to __bss_start, _end and _edata should be
903 		 locally resolved within executables.  */
904 	      elf_x86_linker_defined (info, "__bss_start");
905 	      elf_x86_linker_defined (info, "_end");
906 	      elf_x86_linker_defined (info, "_edata");
907 	    }
908 	  else
909 	    {
910 	      /* Hide hidden __bss_start, _end and _edata in shared
911 		 libraries.  */
912 	      elf_x86_hide_linker_defined (info, "__bss_start");
913 	      elf_x86_hide_linker_defined (info, "_end");
914 	      elf_x86_hide_linker_defined (info, "_edata");
915 	    }
916 	}
917     }
918 
919   /* Invoke the regular ELF backend linker to do all the work.  */
920   return _bfd_elf_link_check_relocs (abfd, info);
921 }
922 
923 /* Look through the relocs for a section before allocation to make the
924    dynamic reloc section.  */
925 
926 bool
927 _bfd_x86_elf_check_relocs (bfd *abfd,
928 			   struct bfd_link_info *info,
929 			   asection *sec,
930 			   const Elf_Internal_Rela *relocs)
931 {
932   struct elf_x86_link_hash_table *htab;
933   Elf_Internal_Shdr *symtab_hdr;
934   struct elf_link_hash_entry **sym_hashes;
935   const Elf_Internal_Rela *rel;
936   const Elf_Internal_Rela *rel_end;
937   asection *sreloc;
938   const struct elf_backend_data *bed;
939   bool is_x86_64;
940 
941   if (bfd_link_relocatable (info))
942     return true;
943 
944   bed = get_elf_backend_data (abfd);
945   htab = elf_x86_hash_table (info, bed->target_id);
946   if (htab == NULL)
947     {
948       sec->check_relocs_failed = 1;
949       return false;
950     }
951 
952   is_x86_64 = bed->target_id == X86_64_ELF_DATA;
953 
954   symtab_hdr = &elf_symtab_hdr (abfd);
955   sym_hashes = elf_sym_hashes (abfd);
956 
957   rel_end = relocs + sec->reloc_count;
958   for (rel = relocs; rel < rel_end; rel++)
959     {
960       unsigned int r_type;
961       unsigned int r_symndx;
962       struct elf_link_hash_entry *h;
963 
964       r_symndx = htab->r_sym (rel->r_info);
965       r_type = ELF32_R_TYPE (rel->r_info);
966 
967       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
968 	{
969 	  /* xgettext:c-format */
970 	  _bfd_error_handler (_("%pB: bad symbol index: %d"),
971 			      abfd, r_symndx);
972 	  goto error_return;
973 	}
974 
975       if (r_symndx < symtab_hdr->sh_info)
976 	h = NULL;
977       else
978 	{
979 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
980 	  while (h->root.type == bfd_link_hash_indirect
981 		 || h->root.type == bfd_link_hash_warning)
982 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
983 	}
984 
985       if (X86_NEED_DYNAMIC_RELOC_TYPE_P (is_x86_64, r_type)
986 	  && NEED_DYNAMIC_RELOCATION_P (is_x86_64, info, true, h, sec,
987 					r_type, htab->pointer_r_type))
988 	{
989 	  /* We may copy these reloc types into the output file.
990 	     Create a reloc section in dynobj and make room for
991 	     this reloc.  */
992 	  sreloc = _bfd_elf_make_dynamic_reloc_section
993 	    (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2,
994 	     abfd, sec->use_rela_p);
995 
996 	  if (sreloc != NULL)
997 	    return true;
998 
999   error_return:
1000 	  sec->check_relocs_failed = 1;
1001 	  return false;
1002 	}
1003     }
1004 
1005   return true;
1006 }
1007 
1008 /* Add an entry to the relative reloc record.  */
1009 
1010 static bool
1011 elf_x86_relative_reloc_record_add
1012   (struct bfd_link_info *info,
1013    struct elf_x86_relative_reloc_data *relative_reloc,
1014    Elf_Internal_Rela *rel, asection *sec,
1015    asection *sym_sec, struct elf_link_hash_entry *h,
1016    Elf_Internal_Sym *sym, bfd_vma offset, bool *keep_symbuf_p)
1017 {
1018   bfd_size_type newidx;
1019 
1020   if (relative_reloc->data == NULL)
1021     {
1022       relative_reloc->data = bfd_malloc
1023 	(sizeof (struct elf_x86_relative_reloc_record));
1024       relative_reloc->count = 0;
1025       relative_reloc->size = 1;
1026     }
1027 
1028   newidx = relative_reloc->count++;
1029 
1030   if (relative_reloc->count > relative_reloc->size)
1031     {
1032       relative_reloc->size <<= 1;
1033       relative_reloc->data = bfd_realloc
1034 	(relative_reloc->data,
1035 	 (relative_reloc->size
1036 	  * sizeof (struct elf_x86_relative_reloc_record)));
1037     }
1038 
1039   if (relative_reloc->data == NULL)
1040     {
1041       info->callbacks->einfo
1042 	/* xgettext:c-format */
1043 	(_("%F%P: %pB: failed to allocate relative reloc record\n"),
1044 	 info->output_bfd);
1045       return false;
1046     }
1047 
1048   relative_reloc->data[newidx].rel = *rel;
1049   relative_reloc->data[newidx].sec = sec;
1050   if (h != NULL)
1051     {
1052       /* Set SYM to NULL to indicate a global symbol.  */
1053       relative_reloc->data[newidx].sym = NULL;
1054       relative_reloc->data[newidx].u.h = h;
1055     }
1056   else
1057     {
1058       relative_reloc->data[newidx].sym = sym;
1059       relative_reloc->data[newidx].u.sym_sec = sym_sec;
1060       /* We must keep the symbol buffer since SYM will be used later.  */
1061       *keep_symbuf_p = true;
1062     }
1063   relative_reloc->data[newidx].offset = offset;
1064   relative_reloc->data[newidx].address = 0;
1065   return true;
1066 }
1067 
1068 /* After input sections have been mapped to output sections and
1069    addresses of output sections are set initiallly, scan input
1070    relocations with the same logic in relocate_section to determine
1071    if a relative relocation should be generated.  Save the relative
1072    relocation candidate information for sizing the DT_RELR section
1073    later after all symbols addresses can be determined.  */
1074 
1075 bool
1076 _bfd_x86_elf_link_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
1077 				 asection *input_section,
1078 				 struct bfd_link_info *info,
1079 				 bool *again)
1080 {
1081   Elf_Internal_Shdr *symtab_hdr;
1082   Elf_Internal_Rela *internal_relocs;
1083   Elf_Internal_Rela *irel, *irelend;
1084   Elf_Internal_Sym *isymbuf = NULL;
1085   struct elf_link_hash_entry **sym_hashes;
1086   const struct elf_backend_data *bed;
1087   struct elf_x86_link_hash_table *htab;
1088   bfd_vma *local_got_offsets;
1089   bool is_x86_64;
1090   bool unaligned_section;
1091   bool return_status = false;
1092   bool keep_symbuf = false;
1093 
1094   if (bfd_link_relocatable (info))
1095     return true;
1096 
1097   /* Assume we're not going to change any sizes, and we'll only need
1098      one pass.  */
1099   *again = false;
1100 
1101   bed = get_elf_backend_data (abfd);
1102   htab = elf_x86_hash_table (info, bed->target_id);
1103   if (htab == NULL)
1104     return true;
1105 
1106   /* Nothing to do if there are no relocations or relative relocations
1107      have been packed.  */
1108   if (input_section == htab->elf.srelrdyn
1109       || input_section->relative_reloc_packed
1110       || ((input_section->flags & (SEC_RELOC | SEC_ALLOC))
1111 	  != (SEC_RELOC | SEC_ALLOC))
1112       || (input_section->flags & SEC_DEBUGGING) != 0
1113       || input_section->reloc_count == 0)
1114     return true;
1115 
1116   /* Skip if the section isn't aligned.  */
1117   unaligned_section = input_section->alignment_power == 0;
1118 
1119   is_x86_64 = bed->target_id == X86_64_ELF_DATA;
1120 
1121   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1122   sym_hashes = elf_sym_hashes (abfd);
1123   local_got_offsets = elf_local_got_offsets (abfd);
1124 
1125   /* Load the relocations for this section.  */
1126   internal_relocs =
1127     _bfd_elf_link_info_read_relocs (abfd, info, input_section, NULL,
1128 				    (Elf_Internal_Rela *) NULL,
1129 				    info->keep_memory);
1130   if (internal_relocs == NULL)
1131     return false;
1132 
1133   irelend = internal_relocs + input_section->reloc_count;
1134   for (irel = internal_relocs; irel < irelend; irel++)
1135     {
1136       unsigned int r_type;
1137       unsigned int r_symndx;
1138       Elf_Internal_Sym *isym;
1139       struct elf_link_hash_entry *h;
1140       struct elf_x86_link_hash_entry *eh;
1141       bfd_vma offset;
1142       bool resolved_to_zero;
1143       bool need_copy_reloc_in_pie;
1144       bool pc32_reloc;
1145       asection *sec;
1146       /* Offset must be a multiple of 2.  */
1147       bool unaligned_offset = (irel->r_offset & 1) != 0;
1148       /* True if there is a relative relocation against a dynamic
1149 	 symbol.  */
1150       bool dynamic_relative_reloc_p;
1151 
1152       /* Get the value of the symbol referred to by the reloc.  */
1153       r_symndx = htab->r_sym (irel->r_info);
1154 
1155       r_type = ELF32_R_TYPE (irel->r_info);
1156       /* Clear the R_X86_64_converted_reloc_bit bit.  */
1157       r_type &= ~R_X86_64_converted_reloc_bit;
1158 
1159       sec = NULL;
1160       h = NULL;
1161       dynamic_relative_reloc_p = false;
1162 
1163       if (r_symndx < symtab_hdr->sh_info)
1164 	{
1165 	  /* Read this BFD's local symbols.  */
1166 	  if (isymbuf == NULL)
1167 	    {
1168 	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1169 	      if (isymbuf == NULL)
1170 		{
1171 		  isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1172 						  symtab_hdr->sh_info,
1173 						  0, NULL, NULL, NULL);
1174 		  if (isymbuf == NULL)
1175 		    goto error_return;
1176 		}
1177 	    }
1178 
1179 	  isym = isymbuf + r_symndx;
1180 	  switch (isym->st_shndx)
1181 	    {
1182 	    case SHN_ABS:
1183 	      sec = bfd_abs_section_ptr;
1184 	      break;
1185 	    case SHN_COMMON:
1186 	      sec = bfd_com_section_ptr;
1187 	      break;
1188 	    case SHN_X86_64_LCOMMON:
1189 	      if (!is_x86_64)
1190 		abort ();
1191 	      sec = &_bfd_elf_large_com_section;
1192 	      break;
1193 	    default:
1194 	      sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1195 	      break;
1196 	    }
1197 
1198 	  /* Skip relocation against local STT_GNU_IFUNC symbol.  */
1199 	  if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1200 	    continue;
1201 
1202 	  eh = (struct elf_x86_link_hash_entry *) h;
1203 	  resolved_to_zero = false;
1204 	}
1205       else
1206 	{
1207 	  /* Get H and SEC for GENERATE_DYNAMIC_RELOCATION_P below.  */
1208 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1209 	  while (h->root.type == bfd_link_hash_indirect
1210 		 || h->root.type == bfd_link_hash_warning)
1211 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1212 
1213 	  if (h->root.type == bfd_link_hash_defined
1214 	      || h->root.type == bfd_link_hash_defweak)
1215 	    sec = h->root.u.def.section;
1216 
1217 	  /* Skip relocation against STT_GNU_IFUNC symbol.  */
1218 	  if (h->type == STT_GNU_IFUNC)
1219 	    continue;
1220 
1221 	  eh = (struct elf_x86_link_hash_entry *) h;
1222 	  resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
1223 
1224 	  /* NB: See how elf_backend_finish_dynamic_symbol is called
1225 	     from elf_link_output_extsym.  */
1226 	  if ((h->dynindx != -1 || h->forced_local)
1227 	      && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1228 		   || h->root.type != bfd_link_hash_undefweak)
1229 		  || !h->forced_local)
1230 	      && h->got.offset != (bfd_vma) -1
1231 	      && ! GOT_TLS_GD_ANY_P (elf_x86_hash_entry (h)->tls_type)
1232 	      && elf_x86_hash_entry (h)->tls_type != GOT_TLS_IE
1233 	      && !resolved_to_zero
1234 	      && SYMBOL_REFERENCES_LOCAL_P (info, h)
1235 	      && SYMBOL_DEFINED_NON_SHARED_P (h))
1236 	    dynamic_relative_reloc_p = true;
1237 
1238 	  isym = NULL;
1239 	}
1240 
1241       if (X86_GOT_TYPE_P (is_x86_64, r_type))
1242 	{
1243 	  /* Pack GOT relative relocations.  There should be only a
1244 	     single R_*_RELATIVE relocation in GOT.  */
1245 	  if (eh != NULL)
1246 	    {
1247 	      if (eh->got_relative_reloc_done)
1248 		continue;
1249 
1250 	      if (!(dynamic_relative_reloc_p
1251 		    || (RESOLVED_LOCALLY_P (info, h, htab)
1252 			&& GENERATE_RELATIVE_RELOC_P (info, h))))
1253 		continue;
1254 
1255 	      if (!dynamic_relative_reloc_p)
1256 		eh->no_finish_dynamic_symbol = 1;
1257 	      eh->got_relative_reloc_done = 1;
1258 	      offset = h->got.offset;
1259 	    }
1260 	  else
1261 	    {
1262 	      if (elf_x86_relative_reloc_done (abfd)[r_symndx])
1263 		continue;
1264 
1265 	      if (!X86_LOCAL_GOT_RELATIVE_RELOC_P (is_x86_64, info,
1266 						   isym))
1267 		continue;
1268 
1269 	      elf_x86_relative_reloc_done (abfd)[r_symndx] = 1;
1270 	      offset = local_got_offsets[r_symndx];
1271 	    }
1272 
1273 	  if (!elf_x86_relative_reloc_record_add (info,
1274 						  &htab->relative_reloc,
1275 						  irel, htab->elf.sgot,
1276 						  sec, h, isym, offset,
1277 						  &keep_symbuf))
1278 	    goto error_return;
1279 
1280 	  continue;
1281 	}
1282 
1283       if (is_x86_64
1284 	  && irel->r_addend == 0
1285 	  && !ABI_64_P (info->output_bfd))
1286 	{
1287 	  /* For x32, if addend is zero, treat R_X86_64_64 like
1288 	     R_X86_64_32 and R_X86_64_SIZE64 like R_X86_64_SIZE32.  */
1289 	  if (r_type == R_X86_64_64)
1290 	    r_type = R_X86_64_32;
1291 	  else if (r_type == R_X86_64_SIZE64)
1292 	    r_type = R_X86_64_SIZE32;
1293 	}
1294 
1295       if (!X86_RELATIVE_RELOC_TYPE_P (is_x86_64, r_type))
1296 	continue;
1297 
1298       /* Pack non-GOT relative relocations.  */
1299       if (is_x86_64)
1300 	{
1301 	  need_copy_reloc_in_pie =
1302 	    (bfd_link_pie (info)
1303 	     && h != NULL
1304 	     && (h->needs_copy
1305 		 || eh->needs_copy
1306 		 || (h->root.type == bfd_link_hash_undefined))
1307 	     && (X86_PCREL_TYPE_P (true, r_type)
1308 		 || X86_SIZE_TYPE_P (true, r_type)));
1309 	  pc32_reloc = false;
1310 	}
1311       else
1312 	{
1313 	  need_copy_reloc_in_pie = false;
1314 	  pc32_reloc = r_type == R_386_PC32;
1315 	}
1316 
1317       if (GENERATE_DYNAMIC_RELOCATION_P (is_x86_64, info, eh, r_type,
1318 					 sec, need_copy_reloc_in_pie,
1319 					 resolved_to_zero, pc32_reloc))
1320 	{
1321 	  /* When generating a shared object, these relocations
1322 	     are copied into the output file to be resolved at run
1323 	     time.	*/
1324 	  offset = _bfd_elf_section_offset (info->output_bfd, info,
1325 					    input_section,
1326 					    irel->r_offset);
1327 	  if (offset == (bfd_vma) -1
1328 	      || offset == (bfd_vma) -2
1329 	      || COPY_INPUT_RELOC_P (is_x86_64, info, h, r_type))
1330 	    continue;
1331 
1332 	  /* This symbol is local, or marked to become local.  When
1333 	     relocation overflow check is disabled, we convert
1334 	     R_X86_64_32 to dynamic R_X86_64_RELATIVE.  */
1335 	  if (is_x86_64
1336 	      && !(r_type == htab->pointer_r_type
1337 		   || (r_type == R_X86_64_32
1338 		       && htab->params->no_reloc_overflow_check)))
1339 	    continue;
1340 
1341 	  if (!elf_x86_relative_reloc_record_add
1342 	        (info,
1343 		 ((unaligned_section || unaligned_offset)
1344 		  ? &htab->unaligned_relative_reloc
1345 		  : &htab->relative_reloc),
1346 		 irel, input_section, sec, h, isym, offset,
1347 		 &keep_symbuf))
1348 	    goto error_return;
1349 	}
1350     }
1351 
1352   input_section->relative_reloc_packed = 1;
1353 
1354   return_status = true;
1355 
1356 error_return:
1357   if ((unsigned char *) isymbuf != symtab_hdr->contents)
1358     {
1359       /* Cache the symbol buffer if it must be kept.  */
1360       if (keep_symbuf)
1361 	symtab_hdr->contents = (unsigned char *) isymbuf;
1362       else
1363 	free (isymbuf);
1364     }
1365   if (elf_section_data (input_section)->relocs != internal_relocs)
1366     free (internal_relocs);
1367   return return_status;
1368 }
1369 
1370 /* Add an entry to the 64-bit DT_RELR bitmap.  */
1371 
1372 static void
1373 elf64_dt_relr_bitmap_add
1374   (struct bfd_link_info *info, struct elf_dt_relr_bitmap *bitmap,
1375    uint64_t entry)
1376 {
1377   bfd_size_type newidx;
1378 
1379   if (bitmap->u.elf64 == NULL)
1380     {
1381       bitmap->u.elf64 = bfd_malloc (sizeof (uint64_t));
1382       bitmap->count = 0;
1383       bitmap->size = 1;
1384     }
1385 
1386   newidx = bitmap->count++;
1387 
1388   if (bitmap->count > bitmap->size)
1389     {
1390       bitmap->size <<= 1;
1391       bitmap->u.elf64 = bfd_realloc (bitmap->u.elf64,
1392 				     (bitmap->size * sizeof (uint64_t)));
1393     }
1394 
1395   if (bitmap->u.elf64 == NULL)
1396     {
1397       info->callbacks->einfo
1398 	/* xgettext:c-format */
1399 	(_("%F%P: %pB: failed to allocate 64-bit DT_RELR bitmap\n"),
1400 	 info->output_bfd);
1401     }
1402 
1403   bitmap->u.elf64[newidx] = entry;
1404 }
1405 
1406 /* Add an entry to the 32-bit DT_RELR bitmap.  */
1407 
1408 static void
1409 elf32_dt_relr_bitmap_add
1410   (struct bfd_link_info *info, struct elf_dt_relr_bitmap *bitmap,
1411    uint32_t entry)
1412 {
1413   bfd_size_type newidx;
1414 
1415   if (bitmap->u.elf32 == NULL)
1416     {
1417       bitmap->u.elf32 = bfd_malloc (sizeof (uint32_t));
1418       bitmap->count = 0;
1419       bitmap->size = 1;
1420     }
1421 
1422   newidx = bitmap->count++;
1423 
1424   if (bitmap->count > bitmap->size)
1425     {
1426       bitmap->size <<= 1;
1427       bitmap->u.elf32 = bfd_realloc (bitmap->u.elf32,
1428 				     (bitmap->size * sizeof (uint32_t)));
1429     }
1430 
1431   if (bitmap->u.elf32 == NULL)
1432     {
1433       info->callbacks->einfo
1434 	/* xgettext:c-format */
1435 	(_("%F%P: %pB: failed to allocate 32-bit DT_RELR bitmap\n"),
1436 	 info->output_bfd);
1437     }
1438 
1439   bitmap->u.elf32[newidx] = entry;
1440 }
1441 
1442 void
1443 _bfd_elf32_write_addend (bfd *abfd, uint64_t value, void *addr)
1444 {
1445   bfd_put_32 (abfd, value, addr);
1446 }
1447 
1448 void
1449 _bfd_elf64_write_addend (bfd *abfd, uint64_t value, void *addr)
1450 {
1451   bfd_put_64 (abfd, value, addr);
1452 }
1453 
1454 /* Size or finish relative relocations to determine the run-time
1455    addresses for DT_RELR bitmap computation later.  OUTREL is set
1456    to NULL in the sizing phase and non-NULL in the finising phase
1457    where the regular relative relocations will be written out.  */
1458 
1459 static void
1460 elf_x86_size_or_finish_relative_reloc
1461   (bool is_x86_64, struct bfd_link_info *info,
1462    struct elf_x86_link_hash_table *htab, bool unaligned,
1463    Elf_Internal_Rela *outrel)
1464 {
1465   unsigned int align_mask;
1466   bfd_size_type i, count;
1467   asection *sec, *srel;
1468   struct elf_link_hash_entry *h;
1469   bfd_vma offset;
1470   Elf_Internal_Sym *sym;
1471   asection *sym_sec;
1472   asection *sgot = htab->elf.sgot;
1473   asection *srelgot = htab->elf.srelgot;
1474   struct elf_x86_relative_reloc_data *relative_reloc;
1475 
1476   if (unaligned)
1477     {
1478       align_mask = 0;
1479       relative_reloc = &htab->unaligned_relative_reloc;
1480     }
1481   else
1482     {
1483       align_mask = 1;
1484       relative_reloc = &htab->relative_reloc;
1485     }
1486 
1487   count = relative_reloc->count;
1488   for (i = 0; i < count; i++)
1489     {
1490       sec = relative_reloc->data[i].sec;
1491       sym = relative_reloc->data[i].sym;
1492 
1493       /* If SYM is NULL, it must be a global symbol.  */
1494       if (sym == NULL)
1495 	h = relative_reloc->data[i].u.h;
1496       else
1497 	h = NULL;
1498 
1499       if (is_x86_64)
1500 	{
1501 	  bfd_vma relocation;
1502 	  /* This function may be called more than once and REL may be
1503 	     updated by _bfd_elf_rela_local_sym below.  */
1504 	  Elf_Internal_Rela rel = relative_reloc->data[i].rel;
1505 
1506 	  if (h != NULL)
1507 	    {
1508 	      if (h->root.type == bfd_link_hash_defined
1509 		  || h->root.type == bfd_link_hash_defweak)
1510 		{
1511 		  sym_sec = h->root.u.def.section;
1512 		  relocation = (h->root.u.def.value
1513 				+ sym_sec->output_section->vma
1514 				+ sym_sec->output_offset);
1515 		}
1516 	      else
1517 		{
1518 		  /* Allow undefined symbol only at the sizing phase.
1519 		     Otherwise skip undefined symbol here.  Undefined
1520 		     symbol will be reported by relocate_section.  */
1521 		  if (outrel == NULL)
1522 		    relocation = 0;
1523 		  else
1524 		    continue;
1525 		}
1526 	    }
1527 	  else
1528 	    {
1529 	      sym_sec = relative_reloc->data[i].u.sym_sec;
1530 	      relocation = _bfd_elf_rela_local_sym
1531 		(info->output_bfd, sym, &sym_sec, &rel);
1532 	    }
1533 
1534 	  if (outrel != NULL)
1535 	    {
1536 	      outrel->r_addend = relocation;
1537 	      if (sec == sgot)
1538 		{
1539 		  if (h != NULL && h->needs_plt)
1540 		    abort ();
1541 		}
1542 	      else
1543 		outrel->r_addend += rel.r_addend;
1544 
1545 	      /* Write the implicit addend if ALIGN_MASK isn't 0.  */
1546 	      if (align_mask)
1547 		{
1548 		  if (sec == sgot)
1549 		    {
1550 		      if (relative_reloc->data[i].offset >= sec->size)
1551 			abort ();
1552 		      htab->elf_write_addend_in_got
1553 			(info->output_bfd, outrel->r_addend,
1554 			 sec->contents + relative_reloc->data[i].offset);
1555 		    }
1556 		  else
1557 		    {
1558 		      bfd_byte *contents;
1559 
1560 		      if (rel.r_offset >= sec->size)
1561 			abort ();
1562 
1563 		      if (elf_section_data (sec)->this_hdr.contents
1564 			  != NULL)
1565 			contents
1566 			  = elf_section_data (sec)->this_hdr.contents;
1567 		      else
1568 			{
1569 			  if (!_bfd_elf_mmap_section_contents (sec->owner,
1570 							       sec,
1571 							       &contents))
1572 			    info->callbacks->einfo
1573 			      /* xgettext:c-format */
1574 			      (_("%F%P: %pB: failed to allocate memory for section `%pA'\n"),
1575 			       info->output_bfd, sec);
1576 
1577 			  /* Cache the section contents for
1578 			     elf_link_input_bfd.  */
1579 			  elf_section_data (sec)->this_hdr.contents
1580 			    = contents;
1581 			}
1582 		      htab->elf_write_addend
1583 			(info->output_bfd, outrel->r_addend,
1584 			 contents + rel.r_offset);
1585 		    }
1586 		}
1587 	    }
1588 	}
1589 
1590       if (sec == sgot)
1591 	srel = srelgot;
1592       else
1593 	srel = elf_section_data (sec)->sreloc;
1594       offset = (sec->output_section->vma + sec->output_offset
1595 		+ relative_reloc->data[i].offset);
1596       relative_reloc->data[i].address = offset;
1597       if (outrel != NULL)
1598 	{
1599 	  outrel->r_offset = offset;
1600 
1601 	  if ((outrel->r_offset & align_mask) != 0)
1602 	    abort ();
1603 
1604 	  if (htab->params->report_relative_reloc)
1605 	    _bfd_x86_elf_link_report_relative_reloc
1606 	      (info, sec, h, sym, htab->relative_r_name, outrel);
1607 
1608 	  /* Generate regular relative relocation if ALIGN_MASK is 0.  */
1609 	  if (align_mask == 0)
1610 	    htab->elf_append_reloc (info->output_bfd, srel, outrel);
1611 	}
1612     }
1613 }
1614 
1615 /* Compute the DT_RELR section size.  Set NEED_PLAYOUT to true if
1616    the DT_RELR section size has been increased.  */
1617 
1618 static void
1619 elf_x86_compute_dl_relr_bitmap
1620   (struct bfd_link_info *info, struct elf_x86_link_hash_table *htab,
1621    bool *need_layout)
1622 {
1623   bfd_vma base;
1624   bfd_size_type i, count, new_count;
1625   struct elf_x86_relative_reloc_data *relative_reloc =
1626     &htab->relative_reloc;
1627   /* Save the old DT_RELR bitmap count.  Don't shrink the DT_RELR bitmap
1628      if the new DT_RELR bitmap count is smaller than the old one.  Pad
1629      with trailing 1s which won't be decoded to more relocations.  */
1630   bfd_size_type dt_relr_bitmap_count = htab->dt_relr_bitmap.count;
1631 
1632   /* Clear the DT_RELR bitmap count.  */
1633   htab->dt_relr_bitmap.count = 0;
1634 
1635   count = relative_reloc->count;
1636 
1637   if (ABI_64_P (info->output_bfd))
1638     {
1639       /* Compute the 64-bit DT_RELR bitmap.  */
1640       i = 0;
1641       while (i < count)
1642 	{
1643 	  if ((relative_reloc->data[i].address % 1) != 0)
1644 	    abort ();
1645 
1646 	  elf64_dt_relr_bitmap_add (info, &htab->dt_relr_bitmap,
1647 				    relative_reloc->data[i].address);
1648 
1649 	  base = relative_reloc->data[i].address + 8;
1650 	  i++;
1651 
1652 	  while (i < count)
1653 	    {
1654 	      uint64_t bitmap = 0;
1655 	      for (; i < count; i++)
1656 		{
1657 		  bfd_vma delta = (relative_reloc->data[i].address
1658 				   - base);
1659 		  /* Stop if it is too far from base.  */
1660 		  if (delta >= 63 * 8)
1661 		    break;
1662 		  /* Stop if it isn't a multiple of 8.  */
1663 		  if ((delta % 8) != 0)
1664 		    break;
1665 		  bitmap |= 1ULL << (delta / 8);
1666 		}
1667 
1668 	      if (bitmap == 0)
1669 		break;
1670 
1671 	      elf64_dt_relr_bitmap_add (info, &htab->dt_relr_bitmap,
1672 					(bitmap << 1) | 1);
1673 
1674 	      base += 63 * 8;
1675 	    }
1676 	}
1677 
1678       new_count = htab->dt_relr_bitmap.count;
1679       if (dt_relr_bitmap_count > new_count)
1680 	{
1681 	  /* Don't shrink the DT_RELR section size to avoid section
1682 	     layout oscillation.  Instead, pad the DT_RELR bitmap with
1683 	     1s which do not decode to more relocations.  */
1684 
1685 	  htab->dt_relr_bitmap.count = dt_relr_bitmap_count;
1686 	  count = dt_relr_bitmap_count - new_count;
1687 	  for (i = 0; i < count; i++)
1688 	    htab->dt_relr_bitmap.u.elf64[new_count + i] = 1;
1689 	}
1690     }
1691   else
1692     {
1693       /* Compute the 32-bit DT_RELR bitmap.  */
1694       i = 0;
1695       while (i < count)
1696 	{
1697 	  if ((relative_reloc->data[i].address % 1) != 0)
1698 	    abort ();
1699 
1700 	  elf32_dt_relr_bitmap_add (info, &htab->dt_relr_bitmap,
1701 				    relative_reloc->data[i].address);
1702 
1703 	  base = relative_reloc->data[i].address + 4;
1704 	  i++;
1705 
1706 	  while (i < count)
1707 	    {
1708 	      uint32_t bitmap = 0;
1709 	      for (; i < count; i++)
1710 		{
1711 		  bfd_vma delta = (relative_reloc->data[i].address
1712 				   - base);
1713 		  /* Stop if it is too far from base.  */
1714 		  if (delta >= 31 * 4)
1715 		    break;
1716 		  /* Stop if it isn't a multiple of 4.  */
1717 		  if ((delta % 4) != 0)
1718 		    break;
1719 		  bitmap |= 1ULL << (delta / 4);
1720 		}
1721 
1722 	      if (bitmap == 0)
1723 		break;
1724 
1725 	      elf32_dt_relr_bitmap_add (info, &htab->dt_relr_bitmap,
1726 					(bitmap << 1) | 1);
1727 
1728 	      base += 31 * 4;
1729 	    }
1730 	}
1731 
1732       new_count = htab->dt_relr_bitmap.count;
1733       if (dt_relr_bitmap_count > new_count)
1734 	{
1735 	  /* Don't shrink the DT_RELR section size to avoid section
1736 	     layout oscillation.  Instead, pad the DT_RELR bitmap with
1737 	     1s which do not decode to more relocations.  */
1738 
1739 	  htab->dt_relr_bitmap.count = dt_relr_bitmap_count;
1740 	  count = dt_relr_bitmap_count - new_count;
1741 	  for (i = 0; i < count; i++)
1742 	    htab->dt_relr_bitmap.u.elf32[new_count + i] = 1;
1743 	}
1744     }
1745 
1746   if (htab->dt_relr_bitmap.count != dt_relr_bitmap_count)
1747     {
1748       if (need_layout)
1749 	{
1750 	  /* The .relr.dyn section size is changed.  Update the section
1751 	     size and tell linker to layout sections again.  */
1752 	  htab->elf.srelrdyn->size =
1753 	    (htab->dt_relr_bitmap.count
1754 	     * (ABI_64_P (info->output_bfd) ? 8 : 4));
1755 
1756 	  *need_layout = true;
1757 	}
1758       else
1759 	info->callbacks->einfo
1760 	  /* xgettext:c-format */
1761 	  (_("%F%P: %pB: size of compact relative reloc section is "
1762 	     "changed: new (%lu) != old (%lu)\n"),
1763 	   info->output_bfd, htab->dt_relr_bitmap.count,
1764 	   dt_relr_bitmap_count);
1765     }
1766 }
1767 
1768 /* Write out the DT_RELR section.  */
1769 
1770 static void
1771 elf_x86_write_dl_relr_bitmap (struct bfd_link_info *info,
1772 			      struct elf_x86_link_hash_table *htab)
1773 {
1774   asection *sec = htab->elf.srelrdyn;
1775   bfd_size_type size = sec->size;
1776   bfd_size_type i;
1777   unsigned char *contents;
1778 
1779   contents = (unsigned char *) bfd_alloc (sec->owner, size);
1780   if (contents == NULL)
1781     info->callbacks->einfo
1782       /* xgettext:c-format */
1783       (_("%F%P: %pB: failed to allocate compact relative reloc section\n"),
1784        info->output_bfd);
1785 
1786   /* Cache the section contents for elf_link_input_bfd.  */
1787   sec->contents = contents;
1788 
1789   if (ABI_64_P (info->output_bfd))
1790     for (i = 0; i < htab->dt_relr_bitmap.count; i++, contents += 8)
1791       bfd_put_64 (info->output_bfd, htab->dt_relr_bitmap.u.elf64[i],
1792 		  contents);
1793   else
1794     for (i = 0; i < htab->dt_relr_bitmap.count; i++, contents += 4)
1795       bfd_put_32 (info->output_bfd, htab->dt_relr_bitmap.u.elf32[i],
1796 		  contents);
1797 }
1798 
1799 /* Sort relative relocations by address.  */
1800 
1801 static int
1802 elf_x86_relative_reloc_compare (const void *pa, const void *pb)
1803 {
1804   struct elf_x86_relative_reloc_record *a =
1805     (struct elf_x86_relative_reloc_record *) pa;
1806   struct elf_x86_relative_reloc_record *b =
1807     (struct elf_x86_relative_reloc_record *) pb;
1808   if (a->address < b->address)
1809     return -1;
1810   if (a->address > b->address)
1811     return 1;
1812   return 0;
1813 }
1814 
1815 enum dynobj_sframe_plt_type
1816 {
1817   SFRAME_PLT = 1,
1818   SFRAME_PLT_SEC = 2
1819 };
1820 
1821 /* Create SFrame stack trace info for the plt entries in the .plt section
1822    of type PLT_SEC_TYPE.  */
1823 
1824 static bool
1825 _bfd_x86_elf_create_sframe_plt (bfd *output_bfd,
1826 				struct bfd_link_info *info,
1827 				unsigned int plt_sec_type)
1828 {
1829   struct elf_x86_link_hash_table *htab;
1830   const struct elf_backend_data *bed;
1831 
1832   bool plt0_generated_p;
1833   unsigned int plt0_entry_size;
1834   unsigned char func_info;
1835   uint32_t fre_type;
1836   /* The dynamic plt section for which .sframe stack trace information is being
1837      created.  */
1838   asection *dpltsec;
1839 
1840   int err = 0;
1841 
1842   sframe_encoder_ctx **ectx = NULL;
1843   unsigned plt_entry_size = 0;
1844   unsigned int num_pltn_fres = 0;
1845   unsigned int num_pltn_entries = 0;
1846 
1847   bed = get_elf_backend_data (output_bfd);
1848   htab = elf_x86_hash_table (info, bed->target_id);
1849   /* Whether SFrame stack trace info for plt0 is to be generated.  */
1850   plt0_generated_p = htab->plt.has_plt0;
1851   plt0_entry_size
1852     = (plt0_generated_p) ? htab->sframe_plt->plt0_entry_size : 0;
1853 
1854   switch (plt_sec_type)
1855     {
1856     case SFRAME_PLT:
1857 	{
1858 	  ectx = &htab->plt_cfe_ctx;
1859 	  dpltsec = htab->elf.splt;
1860 
1861 	  plt_entry_size = htab->plt.plt_entry_size;
1862 	  num_pltn_fres = htab->sframe_plt->pltn_num_fres;
1863 	  num_pltn_entries
1864 	    = (dpltsec->size - plt0_entry_size) / plt_entry_size;
1865 
1866 	  break;
1867 	}
1868     case SFRAME_PLT_SEC:
1869 	{
1870 	  ectx = &htab->plt_second_cfe_ctx;
1871 	  /* FIXME - this or htab->plt_second_sframe ?  */
1872 	  dpltsec = htab->plt_second_eh_frame;
1873 
1874 	  plt_entry_size = htab->sframe_plt->sec_pltn_entry_size;
1875 	  num_pltn_fres = htab->sframe_plt->sec_pltn_num_fres;
1876 	  num_pltn_entries = dpltsec->size / plt_entry_size;
1877 	  break;
1878 	}
1879     default:
1880       /* No other value is possible.  */
1881       return false;
1882       break;
1883     }
1884 
1885   *ectx = sframe_encode (SFRAME_VERSION_2,
1886 			 0,
1887 			 SFRAME_ABI_AMD64_ENDIAN_LITTLE,
1888 			 SFRAME_CFA_FIXED_FP_INVALID,
1889 			 -8, /*  Fixed RA offset.  */
1890 			 &err);
1891 
1892   /* FRE type is dependent on the size of the function.  */
1893   fre_type = sframe_calc_fre_type (dpltsec->size);
1894   func_info = sframe_fde_create_func_info (fre_type, SFRAME_FDE_TYPE_PCINC);
1895 
1896   /* Add SFrame FDE and the associated FREs for plt0 if plt0 has been
1897      generated.  */
1898   if (plt0_generated_p)
1899     {
1900       /* Add SFrame FDE for plt0, the function start address is updated later
1901 	 at _bfd_elf_merge_section_sframe time.  */
1902       sframe_encoder_add_funcdesc_v2 (*ectx,
1903 				      0, /* func start addr.  */
1904 				      plt0_entry_size,
1905 				      func_info,
1906 				      16,
1907 				      0 /* Num FREs.  */);
1908       sframe_frame_row_entry plt0_fre;
1909       unsigned int num_plt0_fres = htab->sframe_plt->plt0_num_fres;
1910       for (unsigned int j = 0; j < num_plt0_fres; j++)
1911 	{
1912 	  plt0_fre = *(htab->sframe_plt->plt0_fres[j]);
1913 	  sframe_encoder_add_fre (*ectx, 0, &plt0_fre);
1914 	}
1915     }
1916 
1917 
1918   if (num_pltn_entries)
1919     {
1920       /* pltn entries use an SFrame FDE of type
1921 	 SFRAME_FDE_TYPE_PCMASK to exploit the repetitive
1922 	 pattern of the instructions in these entries.  Using this SFrame FDE
1923 	 type helps in keeping the SFrame stack trace info for pltn entries
1924 	 compact.  */
1925       func_info	= sframe_fde_create_func_info (fre_type,
1926 					       SFRAME_FDE_TYPE_PCMASK);
1927       /* Add the SFrame FDE for all PCs starting at the first pltn entry (hence,
1928 	 function start address = plt0_entry_size.  As usual, this will be
1929 	 updated later at _bfd_elf_merge_section_sframe, by when the
1930 	 sections are relocated.  */
1931       sframe_encoder_add_funcdesc_v2 (*ectx,
1932 				      plt0_entry_size, /* func start addr.  */
1933 				      dpltsec->size - plt0_entry_size,
1934 				      func_info,
1935 				      16,
1936 				      0 /* Num FREs.  */);
1937 
1938       sframe_frame_row_entry pltn_fre;
1939       /* Now add the FREs for pltn.  Simply adding the two FREs suffices due
1940 	 to the usage of SFRAME_FDE_TYPE_PCMASK above.  */
1941       for (unsigned int j = 0; j < num_pltn_fres; j++)
1942 	{
1943 	  pltn_fre = *(htab->sframe_plt->pltn_fres[j]);
1944 	  sframe_encoder_add_fre (*ectx, 1, &pltn_fre);
1945 	}
1946     }
1947 
1948   return true;
1949 }
1950 
1951 /* Put contents of the .sframe section corresponding to the specified
1952    PLT_SEC_TYPE.  */
1953 
1954 static bool
1955 _bfd_x86_elf_write_sframe_plt (bfd *output_bfd,
1956 			       struct bfd_link_info *info,
1957 			       unsigned int plt_sec_type)
1958 {
1959   struct elf_x86_link_hash_table *htab;
1960   const struct elf_backend_data *bed;
1961   sframe_encoder_ctx *ectx;
1962   size_t sec_size;
1963   asection *sec;
1964   bfd *dynobj;
1965 
1966   int err = 0;
1967 
1968   bed = get_elf_backend_data (output_bfd);
1969   htab = elf_x86_hash_table (info, bed->target_id);
1970   dynobj = htab->elf.dynobj;
1971 
1972   switch (plt_sec_type)
1973     {
1974     case SFRAME_PLT:
1975       ectx = htab->plt_cfe_ctx;
1976       sec = htab->plt_sframe;
1977       break;
1978     case SFRAME_PLT_SEC:
1979       ectx = htab->plt_second_cfe_ctx;
1980       sec = htab->plt_second_sframe;
1981       break;
1982     default:
1983       /* No other value is possible.  */
1984       return false;
1985       break;
1986     }
1987 
1988   BFD_ASSERT (ectx);
1989 
1990   void *contents = sframe_encoder_write (ectx, &sec_size, &err);
1991 
1992   sec->size = (bfd_size_type) sec_size;
1993   sec->contents = (unsigned char *) bfd_zalloc (dynobj, sec->size);
1994   memcpy (sec->contents, contents, sec_size);
1995 
1996   sframe_encoder_free (&ectx);
1997 
1998   return true;
1999 }
2000 
2001 bool
2002 _bfd_elf_x86_size_relative_relocs (struct bfd_link_info *info,
2003 				   bool *need_layout)
2004 {
2005   struct elf_x86_link_hash_table *htab;
2006   const struct elf_backend_data *bed;
2007   bool is_x86_64;
2008   bfd_size_type i, count, unaligned_count;
2009   asection *sec, *srel;
2010 
2011   /* Do nothing for ld -r.  */
2012   if (bfd_link_relocatable (info))
2013     return true;
2014 
2015   bed = get_elf_backend_data (info->output_bfd);
2016   htab = elf_x86_hash_table (info, bed->target_id);
2017   if (htab == NULL)
2018     return false;
2019 
2020   count = htab->relative_reloc.count;
2021   unaligned_count = htab->unaligned_relative_reloc.count;
2022   if (count == 0)
2023     {
2024       if (htab->generate_relative_reloc_pass == 0
2025 	  && htab->elf.srelrdyn != NULL)
2026 	{
2027 	  /* Remove the empty .relr.dyn sections now.  */
2028 	  if (!bfd_is_abs_section (htab->elf.srelrdyn->output_section))
2029 	    {
2030 	      bfd_section_list_remove
2031 		(info->output_bfd, htab->elf.srelrdyn->output_section);
2032 	      info->output_bfd->section_count--;
2033 	    }
2034 	  bfd_section_list_remove (htab->elf.srelrdyn->owner,
2035 				   htab->elf.srelrdyn);
2036 	  htab->elf.srelrdyn->owner->section_count--;
2037 	}
2038       if (unaligned_count == 0)
2039 	{
2040 	  htab->generate_relative_reloc_pass++;
2041 	  return true;
2042 	}
2043     }
2044 
2045   is_x86_64 = bed->target_id == X86_64_ELF_DATA;
2046 
2047   /* Size relative relocations.  */
2048   if (htab->generate_relative_reloc_pass)
2049     {
2050       /* Reset the regular relative relocation count.  */
2051       for (i = 0; i < unaligned_count; i++)
2052 	{
2053 	  sec = htab->unaligned_relative_reloc.data[i].sec;
2054 	  srel = elf_section_data (sec)->sreloc;
2055 	  srel->reloc_count = 0;
2056 	}
2057     }
2058   else
2059     {
2060       /* Remove the reserved space for compact relative relocations.  */
2061       if (count)
2062 	{
2063 	  asection *sgot = htab->elf.sgot;
2064 	  asection *srelgot = htab->elf.srelgot;
2065 
2066 	  for (i = 0; i < count; i++)
2067 	    {
2068 	      sec = htab->relative_reloc.data[i].sec;
2069 	      if (sec == sgot)
2070 		srel = srelgot;
2071 	      else
2072 		srel = elf_section_data (sec)->sreloc;
2073 	      srel->size -= htab->sizeof_reloc;
2074 	    }
2075 	}
2076     }
2077 
2078   /* Size unaligned relative relocations.  */
2079   if (unaligned_count)
2080     elf_x86_size_or_finish_relative_reloc (is_x86_64, info, htab,
2081 					   true, NULL);
2082 
2083   if (count)
2084     {
2085       elf_x86_size_or_finish_relative_reloc (is_x86_64, info, htab,
2086 					     false, NULL);
2087 
2088       /* Sort relative relocations by addresses.  We only need to
2089 	 sort them in the first pass since the relative positions
2090 	 won't change.  */
2091       if (htab->generate_relative_reloc_pass == 0)
2092 	qsort (htab->relative_reloc.data, count,
2093 	       sizeof (struct elf_x86_relative_reloc_record),
2094 	       elf_x86_relative_reloc_compare);
2095 
2096       elf_x86_compute_dl_relr_bitmap (info, htab, need_layout);
2097     }
2098 
2099   htab->generate_relative_reloc_pass++;
2100 
2101   return true;
2102 }
2103 
2104 bool
2105 _bfd_elf_x86_finish_relative_relocs (struct bfd_link_info *info)
2106 {
2107   struct elf_x86_link_hash_table *htab;
2108   const struct elf_backend_data *bed;
2109   Elf_Internal_Rela outrel;
2110   bool is_x86_64;
2111   bfd_size_type count;
2112 
2113   /* Do nothing for ld -r.  */
2114   if (bfd_link_relocatable (info))
2115     return true;
2116 
2117   bed = get_elf_backend_data (info->output_bfd);
2118   htab = elf_x86_hash_table (info, bed->target_id);
2119   if (htab == NULL)
2120     return false;
2121 
2122   is_x86_64 = bed->target_id == X86_64_ELF_DATA;
2123 
2124   outrel.r_info = htab->r_info (0, htab->relative_r_type);
2125 
2126   if (htab->unaligned_relative_reloc.count)
2127     elf_x86_size_or_finish_relative_reloc (is_x86_64, info, htab,
2128 					   true, &outrel);
2129 
2130   count = htab->relative_reloc.count;
2131   if (count)
2132     {
2133       elf_x86_size_or_finish_relative_reloc (is_x86_64, info, htab,
2134 					     false, &outrel);
2135 
2136       elf_x86_compute_dl_relr_bitmap (info, htab, NULL);
2137 
2138       elf_x86_write_dl_relr_bitmap (info, htab);
2139     }
2140 
2141   return true;
2142 }
2143 
2144 bool
2145 _bfd_elf_x86_valid_reloc_p (asection *input_section,
2146 			    struct bfd_link_info *info,
2147 			    struct elf_x86_link_hash_table *htab,
2148 			    const Elf_Internal_Rela *rel,
2149 			    struct elf_link_hash_entry *h,
2150 			    Elf_Internal_Sym *sym,
2151 			    Elf_Internal_Shdr *symtab_hdr,
2152 			    bool *no_dynreloc_p)
2153 {
2154   bool valid_p = true;
2155 
2156   *no_dynreloc_p = false;
2157 
2158   /* Check If relocation against non-preemptible absolute symbol is
2159      valid in PIC.  FIXME: Can't use SYMBOL_REFERENCES_LOCAL_P since
2160      it may call _bfd_elf_link_hide_sym_by_version and result in
2161      ld-elfvers/ vers21 test failure.  */
2162   if (bfd_link_pic (info)
2163       && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, h)))
2164     {
2165       const struct elf_backend_data *bed;
2166       unsigned int r_type;
2167       Elf_Internal_Rela irel;
2168 
2169       /* Skip non-absolute symbol.  */
2170       if (h)
2171 	{
2172 	  if (!ABS_SYMBOL_P (h))
2173 	    return valid_p;
2174 	}
2175       else if (sym->st_shndx != SHN_ABS)
2176 	return valid_p;
2177 
2178       bed = get_elf_backend_data (input_section->owner);
2179       r_type = ELF32_R_TYPE (rel->r_info);
2180       irel = *rel;
2181 
2182       /* Only allow relocations against absolute symbol, which can be
2183 	 resolved as absolute value + addend.  GOTPCREL and GOT32
2184 	 relocations are allowed since absolute value + addend is
2185 	 stored in the GOT slot.  */
2186       if (bed->target_id == X86_64_ELF_DATA)
2187 	{
2188 	  r_type &= ~R_X86_64_converted_reloc_bit;
2189 	  valid_p = (r_type == R_X86_64_64
2190 		     || r_type == R_X86_64_32
2191 		     || r_type == R_X86_64_32S
2192 		     || r_type == R_X86_64_16
2193 		     || r_type == R_X86_64_8
2194 		     || r_type == R_X86_64_GOTPCREL
2195 		     || r_type == R_X86_64_GOTPCRELX
2196 		     || r_type == R_X86_64_REX_GOTPCRELX);
2197 	  if (!valid_p)
2198 	    {
2199 	      unsigned int r_symndx = htab->r_sym (rel->r_info);
2200 	      irel.r_info = htab->r_info (r_symndx, r_type);
2201 	    }
2202 	}
2203       else
2204 	valid_p = (r_type == R_386_32
2205 		   || r_type == R_386_16
2206 		   || r_type == R_386_8
2207 		   || r_type == R_386_GOT32
2208 		   || r_type == R_386_GOT32X);
2209 
2210       if (valid_p)
2211 	*no_dynreloc_p = true;
2212       else
2213 	{
2214 	  const char *name;
2215 	  arelent internal_reloc;
2216 
2217 	  if (!bed->elf_info_to_howto (input_section->owner,
2218 				       &internal_reloc, &irel)
2219 	      || internal_reloc.howto == NULL)
2220 	    abort ();
2221 
2222 	  if (h)
2223 	    name = h->root.root.string;
2224 	  else
2225 	    name = bfd_elf_sym_name (input_section->owner, symtab_hdr,
2226 				     sym, NULL);
2227 	  info->callbacks->einfo
2228 	    /* xgettext:c-format */
2229 	    (_("%F%P: %pB: relocation %s against absolute symbol "
2230 	       "`%s' in section `%pA' is disallowed\n"),
2231 	     input_section->owner, internal_reloc.howto->name, name,
2232 	     input_section);
2233 	  bfd_set_error (bfd_error_bad_value);
2234 	}
2235     }
2236 
2237   return valid_p;
2238 }
2239 
2240 /* Set the sizes of the dynamic sections.  */
2241 
2242 bool
2243 _bfd_x86_elf_late_size_sections (bfd *output_bfd,
2244 				    struct bfd_link_info *info)
2245 {
2246   struct elf_x86_link_hash_table *htab;
2247   bfd *dynobj;
2248   asection *s;
2249   bool relocs;
2250   bfd *ibfd;
2251   const struct elf_backend_data *bed
2252     = get_elf_backend_data (output_bfd);
2253 
2254   htab = elf_x86_hash_table (info, bed->target_id);
2255   if (htab == NULL)
2256     return false;
2257   dynobj = htab->elf.dynobj;
2258   if (dynobj == NULL)
2259     return true;
2260 
2261   /* Set up .got offsets for local syms, and space for local dynamic
2262      relocs.  */
2263   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2264     {
2265       bfd_signed_vma *local_got;
2266       bfd_signed_vma *end_local_got;
2267       char *local_tls_type;
2268       bfd_vma *local_tlsdesc_gotent;
2269       bfd_size_type locsymcount;
2270       Elf_Internal_Shdr *symtab_hdr;
2271       asection *srel;
2272 
2273       if (! is_x86_elf (ibfd, htab))
2274 	continue;
2275 
2276       for (s = ibfd->sections; s != NULL; s = s->next)
2277 	{
2278 	  struct elf_dyn_relocs *p;
2279 
2280 	  for (p = ((struct elf_dyn_relocs *)
2281 		     elf_section_data (s)->local_dynrel);
2282 	       p != NULL;
2283 	       p = p->next)
2284 	    {
2285 	      if (!bfd_is_abs_section (p->sec)
2286 		  && bfd_is_abs_section (p->sec->output_section))
2287 		{
2288 		  /* Input section has been discarded, either because
2289 		     it is a copy of a linkonce section or due to
2290 		     linker script /DISCARD/, so we'll be discarding
2291 		     the relocs too.  */
2292 		}
2293 	      else if (htab->elf.target_os == is_vxworks
2294 		       && strcmp (p->sec->output_section->name,
2295 				  ".tls_vars") == 0)
2296 		{
2297 		  /* Relocations in vxworks .tls_vars sections are
2298 		     handled specially by the loader.  */
2299 		}
2300 	      else if (p->count != 0)
2301 		{
2302 		  srel = elf_section_data (p->sec)->sreloc;
2303 		  srel->size += p->count * htab->sizeof_reloc;
2304 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0
2305 		      && (info->flags & DF_TEXTREL) == 0)
2306 		    {
2307 		      info->flags |= DF_TEXTREL;
2308 		      if (bfd_link_textrel_check (info))
2309 			/* xgettext:c-format */
2310 			info->callbacks->einfo
2311 			  (_("%P: %pB: warning: relocation "
2312 			     "in read-only section `%pA'\n"),
2313 			   p->sec->owner, p->sec);
2314 		    }
2315 		}
2316 	    }
2317 	}
2318 
2319       local_got = elf_local_got_refcounts (ibfd);
2320       if (!local_got)
2321 	continue;
2322 
2323       symtab_hdr = &elf_symtab_hdr (ibfd);
2324       locsymcount = symtab_hdr->sh_info;
2325       end_local_got = local_got + locsymcount;
2326       local_tls_type = elf_x86_local_got_tls_type (ibfd);
2327       local_tlsdesc_gotent = elf_x86_local_tlsdesc_gotent (ibfd);
2328       s = htab->elf.sgot;
2329       srel = htab->elf.srelgot;
2330       for (; local_got < end_local_got;
2331 	   ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
2332 	{
2333 	  *local_tlsdesc_gotent = (bfd_vma) -1;
2334 	  if (*local_got > 0)
2335 	    {
2336 	      if (GOT_TLS_GDESC_P (*local_tls_type))
2337 		{
2338 		  *local_tlsdesc_gotent = htab->elf.sgotplt->size
2339 		    - elf_x86_compute_jump_table_size (htab);
2340 		  htab->elf.sgotplt->size += 2 * htab->got_entry_size;
2341 		  *local_got = (bfd_vma) -2;
2342 		}
2343 	      if (! GOT_TLS_GDESC_P (*local_tls_type)
2344 		  || GOT_TLS_GD_P (*local_tls_type))
2345 		{
2346 		  *local_got = s->size;
2347 		  s->size += htab->got_entry_size;
2348 		  if (GOT_TLS_GD_P (*local_tls_type)
2349 		      || *local_tls_type == GOT_TLS_IE_BOTH)
2350 		    s->size += htab->got_entry_size;
2351 		}
2352 	      if ((bfd_link_pic (info) && *local_tls_type != GOT_ABS)
2353 		  || GOT_TLS_GD_ANY_P (*local_tls_type)
2354 		  || (*local_tls_type & GOT_TLS_IE))
2355 		{
2356 		  if (*local_tls_type == GOT_TLS_IE_BOTH)
2357 		    srel->size += 2 * htab->sizeof_reloc;
2358 		  else if (GOT_TLS_GD_P (*local_tls_type)
2359 			   || ! GOT_TLS_GDESC_P (*local_tls_type))
2360 		    srel->size += htab->sizeof_reloc;
2361 		  if (GOT_TLS_GDESC_P (*local_tls_type))
2362 		    {
2363 		      htab->elf.srelplt->size += htab->sizeof_reloc;
2364 		      if (bed->target_id == X86_64_ELF_DATA)
2365 			htab->elf.tlsdesc_plt = (bfd_vma) -1;
2366 		    }
2367 		}
2368 	    }
2369 	  else
2370 	    *local_got = (bfd_vma) -1;
2371 	}
2372     }
2373 
2374   if (htab->tls_ld_or_ldm_got.refcount > 0)
2375     {
2376       /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
2377 	 or R_X86_64_TLSLD relocs.  */
2378       htab->tls_ld_or_ldm_got.offset = htab->elf.sgot->size;
2379       htab->elf.sgot->size += 2 * htab->got_entry_size;
2380       htab->elf.srelgot->size += htab->sizeof_reloc;
2381     }
2382   else
2383     htab->tls_ld_or_ldm_got.offset = -1;
2384 
2385   /* Allocate global sym .plt and .got entries, and space for global
2386      sym dynamic relocs.  */
2387   elf_link_hash_traverse (&htab->elf, elf_x86_allocate_dynrelocs,
2388 			  info);
2389 
2390   /* Allocate .plt and .got entries, and space for local symbols.  */
2391   htab_traverse (htab->loc_hash_table, elf_x86_allocate_local_dynreloc,
2392 		 info);
2393 
2394   /* For every jump slot reserved in the sgotplt, reloc_count is
2395      incremented.  However, when we reserve space for TLS descriptors,
2396      it's not incremented, so in order to compute the space reserved
2397      for them, it suffices to multiply the reloc count by the jump
2398      slot size.
2399 
2400      PR ld/13302: We start next_irelative_index at the end of .rela.plt
2401      so that R_{386,X86_64}_IRELATIVE entries come last.  */
2402   if (htab->elf.srelplt)
2403     {
2404       htab->next_tls_desc_index = htab->elf.srelplt->reloc_count;
2405       htab->sgotplt_jump_table_size
2406 	= elf_x86_compute_jump_table_size (htab);
2407       htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
2408     }
2409   else if (htab->elf.irelplt)
2410     htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
2411 
2412   if (htab->elf.tlsdesc_plt)
2413     {
2414       /* NB: tlsdesc_plt is set only for x86-64.  If we're not using
2415 	 lazy TLS relocations, don't generate the PLT and GOT entries
2416 	 they require.  */
2417       if ((info->flags & DF_BIND_NOW))
2418 	htab->elf.tlsdesc_plt = 0;
2419       else
2420 	{
2421 	  htab->elf.tlsdesc_got = htab->elf.sgot->size;
2422 	  htab->elf.sgot->size += htab->got_entry_size;
2423 	  /* Reserve room for the initial entry.
2424 	     FIXME: we could probably do away with it in this case.  */
2425 	  if (htab->elf.splt->size == 0)
2426 	    htab->elf.splt->size = htab->plt.plt_entry_size;
2427 	  htab->elf.tlsdesc_plt = htab->elf.splt->size;
2428 	  htab->elf.splt->size += htab->plt.plt_entry_size;
2429 	}
2430     }
2431 
2432   if (htab->elf.sgotplt)
2433     {
2434       /* Don't allocate .got.plt section if there are no GOT nor PLT
2435 	 entries and there is no reference to _GLOBAL_OFFSET_TABLE_.  */
2436       if ((htab->elf.hgot == NULL
2437 	   || !htab->got_referenced)
2438 	  && (htab->elf.sgotplt->size == bed->got_header_size)
2439 	  && (htab->elf.splt == NULL
2440 	      || htab->elf.splt->size == 0)
2441 	  && (htab->elf.sgot == NULL
2442 	      || htab->elf.sgot->size == 0)
2443 	  && (htab->elf.iplt == NULL
2444 	      || htab->elf.iplt->size == 0)
2445 	  && (htab->elf.igotplt == NULL
2446 	      || htab->elf.igotplt->size == 0))
2447 	{
2448 	  htab->elf.sgotplt->size = 0;
2449 	  /* Solaris requires to keep _GLOBAL_OFFSET_TABLE_ even if it
2450 	     isn't used.  */
2451 	  if (htab->elf.hgot != NULL
2452 	      && htab->elf.target_os != is_solaris)
2453 	    {
2454 	      /* Remove the unused _GLOBAL_OFFSET_TABLE_ from symbol
2455 		 table. */
2456 	      htab->elf.hgot->root.type = bfd_link_hash_undefined;
2457 	      htab->elf.hgot->root.u.undef.abfd
2458 		= htab->elf.hgot->root.u.def.section->owner;
2459 	      htab->elf.hgot->root.linker_def = 0;
2460 	      htab->elf.hgot->ref_regular = 0;
2461 	      htab->elf.hgot->def_regular = 0;
2462 	    }
2463 	}
2464     }
2465 
2466   if (_bfd_elf_eh_frame_present (info))
2467     {
2468       if (htab->plt_eh_frame != NULL
2469 	  && htab->elf.splt != NULL
2470 	  && htab->elf.splt->size != 0
2471 	  && !bfd_is_abs_section (htab->elf.splt->output_section))
2472 	htab->plt_eh_frame->size = htab->plt.eh_frame_plt_size;
2473 
2474       if (htab->plt_got_eh_frame != NULL
2475 	  && htab->plt_got != NULL
2476 	  && htab->plt_got->size != 0
2477 	  && !bfd_is_abs_section (htab->plt_got->output_section))
2478 	htab->plt_got_eh_frame->size
2479 	  = htab->non_lazy_plt->eh_frame_plt_size;
2480 
2481       /* Unwind info for the second PLT and .plt.got sections are
2482 	 identical.  */
2483       if (htab->plt_second_eh_frame != NULL
2484 	  && htab->plt_second != NULL
2485 	  && htab->plt_second->size != 0
2486 	  && !bfd_is_abs_section (htab->plt_second->output_section))
2487 	htab->plt_second_eh_frame->size
2488 	  = htab->non_lazy_plt->eh_frame_plt_size;
2489     }
2490 
2491   /* No need to size the .sframe section explicitly because the write-out
2492      mechanism is different.  Simply prep up the FDE/FRE for the
2493      .plt section.  */
2494   if (_bfd_elf_sframe_present (info))
2495     {
2496       if (htab->plt_sframe != NULL
2497 	  && htab->elf.splt != NULL
2498 	  && htab->elf.splt->size != 0
2499 	  && !bfd_is_abs_section (htab->elf.splt->output_section))
2500 	{
2501 	  _bfd_x86_elf_create_sframe_plt (output_bfd, info, SFRAME_PLT);
2502 	  /* FIXME - Dirty Hack.  Set the size to something non-zero for now,
2503 	     so that the section does not get stripped out below.  The precise
2504 	     size of this section is known only when the contents are
2505 	     serialized in _bfd_x86_elf_write_sframe_plt.  */
2506 	  htab->plt_sframe->size = sizeof (sframe_header) + 1;
2507 	}
2508 
2509       /* FIXME - generate for .plt.got ?  */
2510 
2511       if (htab->plt_second_sframe != NULL
2512 	  && htab->plt_second != NULL
2513 	  && htab->plt_second->size != 0
2514 	  && !bfd_is_abs_section (htab->plt_second->output_section))
2515 	{
2516 	  /* SFrame stack trace info for the second PLT.  */
2517 	  _bfd_x86_elf_create_sframe_plt (output_bfd, info, SFRAME_PLT_SEC);
2518 	  /* FIXME - Dirty Hack.  Set the size to something non-zero for now,
2519 	     so that the section does not get stripped out below.  The precise
2520 	     size of this section is known only when the contents are
2521 	     serialized in _bfd_x86_elf_write_sframe_plt.  */
2522 	  htab->plt_second_sframe->size = sizeof (sframe_header) + 1;
2523 	}
2524     }
2525 
2526   asection *resolved_plt = NULL;
2527 
2528   if (htab->params->mark_plt && htab->elf.dynamic_sections_created)
2529     {
2530       if (htab->plt_second != NULL)
2531 	resolved_plt = htab->plt_second;
2532       else
2533 	resolved_plt = htab->elf.splt;
2534 
2535       if (resolved_plt != NULL && resolved_plt->size == 0)
2536 	resolved_plt = NULL;
2537     }
2538 
2539   /* We now have determined the sizes of the various dynamic sections.
2540      Allocate memory for them.  */
2541   relocs = false;
2542   for (s = dynobj->sections; s != NULL; s = s->next)
2543     {
2544       bool strip_section = true;
2545 
2546       if ((s->flags & SEC_LINKER_CREATED) == 0)
2547 	continue;
2548 
2549       /* The .relr.dyn section for compact relative relocation will
2550 	 be filled later.  */
2551       if (s == htab->elf.srelrdyn)
2552 	continue;
2553 
2554       if (s == htab->elf.splt
2555 	  || s == htab->elf.sgot)
2556 	{
2557 	  /* Strip this section if we don't need it; see the
2558 	     comment below.  */
2559 	  /* We'd like to strip these sections if they aren't needed, but if
2560 	     we've exported dynamic symbols from them we must leave them.
2561 	     It's too late to tell BFD to get rid of the symbols.  */
2562 
2563 	  if (htab->elf.hplt != NULL)
2564 	    strip_section = false;
2565 	}
2566       else if (s == htab->elf.sgotplt
2567 	       || s == htab->elf.iplt
2568 	       || s == htab->elf.igotplt
2569 	       || s == htab->plt_second
2570 	       || s == htab->plt_got
2571 	       || s == htab->plt_eh_frame
2572 	       || s == htab->plt_got_eh_frame
2573 	       || s == htab->plt_second_eh_frame
2574 	       || s == htab->plt_sframe
2575 	       || s == htab->plt_second_sframe
2576 	       || s == htab->elf.sdynbss
2577 	       || s == htab->elf.sdynrelro)
2578 	{
2579 	  /* Strip these too.  */
2580 	}
2581       else if (htab->is_reloc_section (bfd_section_name (s)))
2582 	{
2583 	  if (s->size != 0
2584 	      && s != htab->elf.srelplt
2585 	      && s != htab->srelplt2)
2586 	    relocs = true;
2587 
2588 	  /* We use the reloc_count field as a counter if we need
2589 	     to copy relocs into the output file.  */
2590 	  if (s != htab->elf.srelplt)
2591 	    s->reloc_count = 0;
2592 	}
2593       else
2594 	{
2595 	  /* It's not one of our sections, so don't allocate space.  */
2596 	  continue;
2597 	}
2598 
2599       if (s->size == 0)
2600 	{
2601 	  /* If we don't need this section, strip it from the
2602 	     output file.  This is mostly to handle .rel.bss and
2603 	     .rel.plt.  We must create both sections in
2604 	     create_dynamic_sections, because they must be created
2605 	     before the linker maps input sections to output
2606 	     sections.  The linker does that before
2607 	     adjust_dynamic_symbol is called, and it is that
2608 	     function which decides whether anything needs to go
2609 	     into these sections.  */
2610 	  if (strip_section)
2611 	    s->flags |= SEC_EXCLUDE;
2612 	  continue;
2613 	}
2614 
2615       if ((s->flags & SEC_HAS_CONTENTS) == 0)
2616 	continue;
2617 
2618       /* Skip allocating contents for .sframe section as it is written
2619 	 out differently.  See below.  */
2620       if ((s == htab->plt_sframe) || (s == htab->plt_second_sframe))
2621 	continue;
2622 
2623       /* NB: Initially, the iplt section has minimal alignment to
2624 	 avoid moving dot of the following section backwards when
2625 	 it is empty.  Update its section alignment now since it
2626 	 is non-empty.  */
2627       if (s == htab->elf.iplt)
2628 	bfd_set_section_alignment (s, htab->plt.iplt_alignment);
2629 
2630       /* Allocate memory for the section contents.  We use bfd_zalloc
2631 	 here in case unused entries are not reclaimed before the
2632 	 section's contents are written out.  This should not happen,
2633 	 but this way if it does, we get a R_386_NONE or R_X86_64_NONE
2634 	 reloc instead of garbage.  */
2635       s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
2636       if (s->contents == NULL)
2637 	return false;
2638     }
2639 
2640   if (htab->plt_eh_frame != NULL
2641       && htab->plt_eh_frame->contents != NULL)
2642     {
2643       memcpy (htab->plt_eh_frame->contents,
2644 	      htab->plt.eh_frame_plt,
2645 	      htab->plt_eh_frame->size);
2646       bfd_put_32 (dynobj, htab->elf.splt->size,
2647 		  htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
2648     }
2649 
2650   if (htab->plt_got_eh_frame != NULL
2651       && htab->plt_got_eh_frame->contents != NULL)
2652     {
2653       memcpy (htab->plt_got_eh_frame->contents,
2654 	      htab->non_lazy_plt->eh_frame_plt,
2655 	      htab->plt_got_eh_frame->size);
2656       bfd_put_32 (dynobj, htab->plt_got->size,
2657 		  (htab->plt_got_eh_frame->contents
2658 		   + PLT_FDE_LEN_OFFSET));
2659     }
2660 
2661   if (htab->plt_second_eh_frame != NULL
2662       && htab->plt_second_eh_frame->contents != NULL)
2663     {
2664       memcpy (htab->plt_second_eh_frame->contents,
2665 	      htab->non_lazy_plt->eh_frame_plt,
2666 	      htab->plt_second_eh_frame->size);
2667       bfd_put_32 (dynobj, htab->plt_second->size,
2668 		  (htab->plt_second_eh_frame->contents
2669 		   + PLT_FDE_LEN_OFFSET));
2670     }
2671 
2672   if (_bfd_elf_sframe_present (info))
2673     {
2674       if (htab->plt_sframe != NULL
2675 	  && htab->elf.splt != NULL
2676 	  && htab->elf.splt->size != 0
2677 	  && htab->plt_sframe->contents == NULL)
2678 	_bfd_x86_elf_write_sframe_plt (output_bfd, info, SFRAME_PLT);
2679 
2680       if (htab->plt_second_sframe != NULL
2681 	  && htab->elf.splt != NULL
2682 	  && htab->elf.splt->size != 0
2683 	  && htab->plt_second_sframe->contents == NULL)
2684 	_bfd_x86_elf_write_sframe_plt (output_bfd, info, SFRAME_PLT_SEC);
2685     }
2686 
2687   if (resolved_plt != NULL
2688       && (!_bfd_elf_add_dynamic_entry (info, DT_X86_64_PLT, 0)
2689 	  || !_bfd_elf_add_dynamic_entry (info, DT_X86_64_PLTSZ, 0)
2690 	  || !_bfd_elf_add_dynamic_entry (info, DT_X86_64_PLTENT, 0)))
2691     return false;
2692 
2693   return _bfd_elf_maybe_vxworks_add_dynamic_tags (output_bfd, info,
2694 						  relocs);
2695 }
2696 
2697 /* Finish up the x86 dynamic sections.  */
2698 
2699 struct elf_x86_link_hash_table *
2700 _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd,
2701 				      struct bfd_link_info *info)
2702 {
2703   struct elf_x86_link_hash_table *htab;
2704   const struct elf_backend_data *bed;
2705   bfd *dynobj;
2706   asection *sdyn;
2707   bfd_byte *dyncon, *dynconend;
2708   bfd_size_type sizeof_dyn;
2709 
2710   bed = get_elf_backend_data (output_bfd);
2711   htab = elf_x86_hash_table (info, bed->target_id);
2712   if (htab == NULL)
2713     return htab;
2714 
2715   dynobj = htab->elf.dynobj;
2716   sdyn = htab->elf.dynamic;
2717 
2718   /* GOT is always created in setup_gnu_properties.  But it may not be
2719      needed.  .got.plt section may be needed for static IFUNC.  */
2720   if (htab->elf.sgotplt && htab->elf.sgotplt->size > 0)
2721     {
2722       bfd_vma dynamic_addr;
2723 
2724       if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
2725 	{
2726 	  _bfd_error_handler
2727 	    (_("discarded output section: `%pA'"), htab->elf.sgotplt);
2728 	  return NULL;
2729 	}
2730 
2731       elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize
2732 	= htab->got_entry_size;
2733 
2734       dynamic_addr = (sdyn == NULL
2735 		      ? (bfd_vma) 0
2736 		      : sdyn->output_section->vma + sdyn->output_offset);
2737 
2738       /* Set the first entry in the global offset table to the address
2739 	 of the dynamic section.  Write GOT[1] and GOT[2], needed for
2740 	 the dynamic linker.  */
2741       if (htab->got_entry_size == 8)
2742 	{
2743 	  bfd_put_64 (output_bfd, dynamic_addr,
2744 		      htab->elf.sgotplt->contents);
2745 	  bfd_put_64 (output_bfd, (bfd_vma) 0,
2746 		      htab->elf.sgotplt->contents + 8);
2747 	  bfd_put_64 (output_bfd, (bfd_vma) 0,
2748 		      htab->elf.sgotplt->contents + 8*2);
2749 	}
2750       else
2751 	{
2752 	  bfd_put_32 (output_bfd, dynamic_addr,
2753 		      htab->elf.sgotplt->contents);
2754 	  bfd_put_32 (output_bfd, 0,
2755 		      htab->elf.sgotplt->contents + 4);
2756 	  bfd_put_32 (output_bfd, 0,
2757 		      htab->elf.sgotplt->contents + 4*2);
2758 	}
2759     }
2760 
2761   if (!htab->elf.dynamic_sections_created)
2762     return htab;
2763 
2764   if (sdyn == NULL || htab->elf.sgot == NULL)
2765     abort ();
2766 
2767   asection *resolved_plt;
2768   if (htab->plt_second != NULL)
2769     resolved_plt = htab->plt_second;
2770   else
2771     resolved_plt = htab->elf.splt;
2772 
2773   sizeof_dyn = bed->s->sizeof_dyn;
2774   dyncon = sdyn->contents;
2775   dynconend = sdyn->contents + sdyn->size;
2776   for (; dyncon < dynconend; dyncon += sizeof_dyn)
2777     {
2778       Elf_Internal_Dyn dyn;
2779       asection *s;
2780 
2781       (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
2782 
2783       switch (dyn.d_tag)
2784 	{
2785 	default:
2786 	  if (htab->elf.target_os == is_vxworks
2787 	      && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
2788 	    break;
2789 	  continue;
2790 
2791 	case DT_PLTGOT:
2792 	  s = htab->elf.sgotplt;
2793 	  dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2794 	  break;
2795 
2796 	case DT_JMPREL:
2797 	  s = htab->elf.srelplt;
2798 	  dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2799 	  break;
2800 
2801 	case DT_PLTRELSZ:
2802 	  s = htab->elf.srelplt;
2803 	  dyn.d_un.d_val = s->size;
2804 	  break;
2805 
2806 	case DT_TLSDESC_PLT:
2807 	  s = htab->elf.splt;
2808 	  dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
2809 	    + htab->elf.tlsdesc_plt;
2810 	  break;
2811 
2812 	case DT_TLSDESC_GOT:
2813 	  s = htab->elf.sgot;
2814 	  dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
2815 	    + htab->elf.tlsdesc_got;
2816 	  break;
2817 
2818 	case DT_X86_64_PLT:
2819 	  s = resolved_plt->output_section;
2820 	  dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2821 	  break;
2822 
2823 	case DT_X86_64_PLTSZ:
2824 	  dyn.d_un.d_val = resolved_plt->size;
2825 	  break;
2826 
2827 	case DT_X86_64_PLTENT:
2828 	  dyn.d_un.d_ptr = htab->plt.plt_entry_size;
2829 	  break;
2830 	}
2831 
2832       (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
2833     }
2834 
2835   if (htab->plt_got != NULL && htab->plt_got->size > 0)
2836     elf_section_data (htab->plt_got->output_section)
2837       ->this_hdr.sh_entsize = htab->non_lazy_plt->plt_entry_size;
2838 
2839   if (htab->plt_second != NULL && htab->plt_second->size > 0)
2840     elf_section_data (htab->plt_second->output_section)
2841       ->this_hdr.sh_entsize = htab->non_lazy_plt->plt_entry_size;
2842 
2843   /* Adjust .eh_frame for .plt section.  */
2844   if (htab->plt_eh_frame != NULL
2845       && htab->plt_eh_frame->contents != NULL)
2846     {
2847       if (htab->elf.splt != NULL
2848 	  && htab->elf.splt->size != 0
2849 	  && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
2850 	  && htab->elf.splt->output_section != NULL
2851 	  && htab->plt_eh_frame->output_section != NULL)
2852 	{
2853 	  bfd_vma plt_start = htab->elf.splt->output_section->vma;
2854 	  bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
2855 				   + htab->plt_eh_frame->output_offset
2856 				   + PLT_FDE_START_OFFSET;
2857 	  bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
2858 			     htab->plt_eh_frame->contents
2859 			     + PLT_FDE_START_OFFSET);
2860 	}
2861 
2862       if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
2863 	{
2864 	  if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
2865 						 htab->plt_eh_frame,
2866 						 htab->plt_eh_frame->contents))
2867 	    return NULL;
2868 	}
2869     }
2870 
2871   /* Adjust .eh_frame for .plt.got section.  */
2872   if (htab->plt_got_eh_frame != NULL
2873       && htab->plt_got_eh_frame->contents != NULL)
2874     {
2875       if (htab->plt_got != NULL
2876 	  && htab->plt_got->size != 0
2877 	  && (htab->plt_got->flags & SEC_EXCLUDE) == 0
2878 	  && htab->plt_got->output_section != NULL
2879 	  && htab->plt_got_eh_frame->output_section != NULL)
2880 	{
2881 	  bfd_vma plt_start = htab->plt_got->output_section->vma;
2882 	  bfd_vma eh_frame_start = htab->plt_got_eh_frame->output_section->vma
2883 				   + htab->plt_got_eh_frame->output_offset
2884 				   + PLT_FDE_START_OFFSET;
2885 	  bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
2886 			     htab->plt_got_eh_frame->contents
2887 			     + PLT_FDE_START_OFFSET);
2888 	}
2889       if (htab->plt_got_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
2890 	{
2891 	  if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
2892 						 htab->plt_got_eh_frame,
2893 						 htab->plt_got_eh_frame->contents))
2894 	    return NULL;
2895 	}
2896     }
2897 
2898   /* Adjust .eh_frame for the second PLT section.  */
2899   if (htab->plt_second_eh_frame != NULL
2900       && htab->plt_second_eh_frame->contents != NULL)
2901     {
2902       if (htab->plt_second != NULL
2903 	  && htab->plt_second->size != 0
2904 	  && (htab->plt_second->flags & SEC_EXCLUDE) == 0
2905 	  && htab->plt_second->output_section != NULL
2906 	  && htab->plt_second_eh_frame->output_section != NULL)
2907 	{
2908 	  bfd_vma plt_start = htab->plt_second->output_section->vma;
2909 	  bfd_vma eh_frame_start
2910 	    = (htab->plt_second_eh_frame->output_section->vma
2911 	       + htab->plt_second_eh_frame->output_offset
2912 	       + PLT_FDE_START_OFFSET);
2913 	  bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
2914 			     htab->plt_second_eh_frame->contents
2915 			     + PLT_FDE_START_OFFSET);
2916 	}
2917       if (htab->plt_second_eh_frame->sec_info_type
2918 	  == SEC_INFO_TYPE_EH_FRAME)
2919 	{
2920 	  if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
2921 						 htab->plt_second_eh_frame,
2922 						 htab->plt_second_eh_frame->contents))
2923 	    return NULL;
2924 	}
2925     }
2926 
2927   /* Make any adjustment if necessary and merge .sframe section to
2928      create the final .sframe section for output_bfd.  */
2929   if (htab->plt_sframe != NULL
2930       && htab->plt_sframe->contents != NULL)
2931     {
2932       if (htab->elf.splt != NULL
2933 	  && htab->elf.splt->size != 0
2934 	  && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
2935 	  && htab->elf.splt->output_section != NULL
2936 	  && htab->plt_sframe->output_section != NULL)
2937 	{
2938 	  bfd_vma plt_start = htab->elf.splt->output_section->vma;
2939 	  bfd_vma sframe_start = htab->plt_sframe->output_section->vma
2940 				   + htab->plt_sframe->output_offset
2941 				   + PLT_SFRAME_FDE_START_OFFSET;
2942 #if 0 /* FIXME Testing only. Remove before review.  */
2943 	  bfd_vma test_value = (plt_start - sframe_start)
2944 	    + htab->plt_sframe->output_section->vma
2945 	    + htab->plt_sframe->output_offset
2946 	    + PLT_SFRAME_FDE_START_OFFSET;
2947 	  bfd_put_signed_32 (dynobj, test_value,
2948 #endif
2949 	  bfd_put_signed_32 (dynobj, plt_start - sframe_start,
2950 			     htab->plt_sframe->contents
2951 			     + PLT_SFRAME_FDE_START_OFFSET);
2952 	}
2953       if (htab->plt_sframe->sec_info_type == SEC_INFO_TYPE_SFRAME)
2954 	{
2955 	  if (! _bfd_elf_merge_section_sframe (output_bfd, info,
2956 					       htab->plt_sframe,
2957 					       htab->plt_sframe->contents))
2958 	    return NULL;
2959 	}
2960     }
2961 
2962   if (htab->plt_second_sframe != NULL
2963       && htab->plt_second_sframe->contents != NULL)
2964     {
2965       if (htab->plt_second != NULL
2966 	  && htab->plt_second->size != 0
2967 	  && (htab->plt_second->flags & SEC_EXCLUDE) == 0
2968 	  && htab->plt_second->output_section != NULL
2969 	  && htab->plt_second_sframe->output_section != NULL)
2970 	{
2971 	  bfd_vma plt_start = htab->plt_second->output_section->vma;
2972 	  bfd_vma sframe_start
2973 	    = (htab->plt_second_sframe->output_section->vma
2974 	       + htab->plt_second_sframe->output_offset
2975 	       + PLT_SFRAME_FDE_START_OFFSET);
2976 #if 0 /* FIXME Testing only. Remove before review.  */
2977 	  bfd_vma test_value = (plt_start - sframe_start)
2978 	    + htab->plt_second_sframe->output_section->vma
2979 	    + htab->plt_second_sframe->output_offset
2980 	    + PLT_SFRAME_FDE_START_OFFSET;
2981 	  bfd_put_signed_32 (dynobj, test_value,
2982 #endif
2983 	  bfd_put_signed_32 (dynobj, plt_start - sframe_start,
2984 			     htab->plt_second_sframe->contents
2985 			     + PLT_SFRAME_FDE_START_OFFSET);
2986 	}
2987       if (htab->plt_second_sframe->sec_info_type == SEC_INFO_TYPE_SFRAME)
2988 	{
2989 	  if (! _bfd_elf_merge_section_sframe (output_bfd, info,
2990 					       htab->plt_second_sframe,
2991 					       htab->plt_second_sframe->contents))
2992 	    return NULL;
2993 	}
2994     }
2995   if (htab->elf.sgot && htab->elf.sgot->size > 0)
2996     elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
2997       = htab->got_entry_size;
2998 
2999   return htab;
3000 }
3001 
3002 
3003 bool
3004 _bfd_x86_elf_early_size_sections (bfd *output_bfd,
3005 				  struct bfd_link_info *info)
3006 {
3007   asection *tls_sec = elf_hash_table (info)->tls_sec;
3008 
3009   if (tls_sec && !bfd_link_relocatable (info))
3010     {
3011       struct elf_link_hash_entry *tlsbase;
3012 
3013       tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3014 				      "_TLS_MODULE_BASE_",
3015 				      false, false, false);
3016 
3017       if (tlsbase && tlsbase->type == STT_TLS)
3018 	{
3019 	  struct elf_x86_link_hash_table *htab;
3020 	  struct bfd_link_hash_entry *bh = NULL;
3021 	  const struct elf_backend_data *bed
3022 	    = get_elf_backend_data (output_bfd);
3023 
3024 	  htab = elf_x86_hash_table (info, bed->target_id);
3025 	  if (htab == NULL)
3026 	    return false;
3027 
3028 	  if (!(_bfd_generic_link_add_one_symbol
3029 		(info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3030 		 tls_sec, 0, NULL, false,
3031 		 bed->collect, &bh)))
3032 	    return false;
3033 
3034 	  htab->tls_module_base = bh;
3035 
3036 	  tlsbase = (struct elf_link_hash_entry *)bh;
3037 	  tlsbase->def_regular = 1;
3038 	  tlsbase->other = STV_HIDDEN;
3039 	  tlsbase->root.linker_def = 1;
3040 	  (*bed->elf_backend_hide_symbol) (info, tlsbase, true);
3041 	}
3042     }
3043 
3044   return true;
3045 }
3046 
3047 void
3048 _bfd_x86_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
3049 				     unsigned int st_other,
3050 				     bool definition,
3051 				     bool dynamic ATTRIBUTE_UNUSED)
3052 {
3053   if (definition)
3054     {
3055       struct elf_x86_link_hash_entry *eh
3056 	= (struct elf_x86_link_hash_entry *) h;
3057       eh->def_protected = ELF_ST_VISIBILITY (st_other) == STV_PROTECTED;
3058     }
3059 }
3060 
3061 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
3062 
3063 void
3064 _bfd_x86_elf_copy_indirect_symbol (struct bfd_link_info *info,
3065 				   struct elf_link_hash_entry *dir,
3066 				   struct elf_link_hash_entry *ind)
3067 {
3068   struct elf_x86_link_hash_entry *edir, *eind;
3069 
3070   edir = (struct elf_x86_link_hash_entry *) dir;
3071   eind = (struct elf_x86_link_hash_entry *) ind;
3072 
3073   if (ind->root.type == bfd_link_hash_indirect
3074       && dir->got.refcount <= 0)
3075     {
3076       edir->tls_type = eind->tls_type;
3077       eind->tls_type = GOT_UNKNOWN;
3078     }
3079 
3080   /* Copy gotoff_ref so that elf_i386_adjust_dynamic_symbol will
3081      generate a R_386_COPY reloc.  */
3082   edir->gotoff_ref |= eind->gotoff_ref;
3083 
3084   edir->zero_undefweak |= eind->zero_undefweak;
3085 
3086   if (ELIMINATE_COPY_RELOCS
3087       && ind->root.type != bfd_link_hash_indirect
3088       && dir->dynamic_adjusted)
3089     {
3090       /* If called to transfer flags for a weakdef during processing
3091 	 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
3092 	 We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
3093       if (dir->versioned != versioned_hidden)
3094 	dir->ref_dynamic |= ind->ref_dynamic;
3095       dir->ref_regular |= ind->ref_regular;
3096       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
3097       dir->needs_plt |= ind->needs_plt;
3098       dir->pointer_equality_needed |= ind->pointer_equality_needed;
3099     }
3100   else
3101     _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3102 }
3103 
3104 /* Remove undefined weak symbol from the dynamic symbol table if it
3105    is resolved to 0.   */
3106 
3107 bool
3108 _bfd_x86_elf_fixup_symbol (struct bfd_link_info *info,
3109 			   struct elf_link_hash_entry *h)
3110 {
3111   if (h->dynindx != -1
3112       && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, elf_x86_hash_entry (h)))
3113     {
3114       h->dynindx = -1;
3115       _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
3116 			      h->dynstr_index);
3117     }
3118   return true;
3119 }
3120 
3121 /* Change the STT_GNU_IFUNC symbol defined in position-dependent
3122    executable into the normal function symbol and set its address
3123    to its PLT entry, which should be resolved by R_*_IRELATIVE at
3124    run-time.  */
3125 
3126 void
3127 _bfd_x86_elf_link_fixup_ifunc_symbol (struct bfd_link_info *info,
3128 				      struct elf_x86_link_hash_table *htab,
3129 				      struct elf_link_hash_entry *h,
3130 				      Elf_Internal_Sym *sym)
3131 {
3132   if (bfd_link_pde (info)
3133       && h->def_regular
3134       && h->dynindx != -1
3135       && h->plt.offset != (bfd_vma) -1
3136       && h->type == STT_GNU_IFUNC)
3137     {
3138       asection *plt_s;
3139       bfd_vma plt_offset;
3140       bfd *output_bfd = info->output_bfd;
3141 
3142       if (htab->plt_second)
3143 	{
3144 	  struct elf_x86_link_hash_entry *eh
3145 	    = (struct elf_x86_link_hash_entry *) h;
3146 
3147 	  plt_s = htab->plt_second;
3148 	  plt_offset = eh->plt_second.offset;
3149 	}
3150       else
3151 	{
3152 	  plt_s = htab->elf.splt;
3153 	  plt_offset = h->plt.offset;
3154 	}
3155 
3156       sym->st_size = 0;
3157       sym->st_info = ELF_ST_INFO (ELF_ST_BIND (sym->st_info), STT_FUNC);
3158       sym->st_shndx
3159 	= _bfd_elf_section_from_bfd_section (output_bfd,
3160 					     plt_s->output_section);
3161       sym->st_value = (plt_s->output_section->vma
3162 		       + plt_s->output_offset + plt_offset);
3163     }
3164 }
3165 
3166 /* Report relative relocation.  */
3167 
3168 void
3169 _bfd_x86_elf_link_report_relative_reloc
3170   (struct bfd_link_info *info, asection *asect,
3171    struct elf_link_hash_entry *h, Elf_Internal_Sym *sym,
3172    const char *reloc_name, const void *reloc)
3173 {
3174   const char *name;
3175   bfd *abfd;
3176   const Elf_Internal_Rela *rel = (const Elf_Internal_Rela *) reloc;
3177 
3178   /* Use the output BFD for linker created sections.  */
3179   if ((asect->flags & SEC_LINKER_CREATED) != 0)
3180     abfd = info->output_bfd;
3181   else
3182     abfd = asect->owner;
3183 
3184   if (h != NULL && h->root.root.string != NULL)
3185     name = h->root.root.string;
3186   else
3187     name = bfd_elf_sym_name (abfd, &elf_symtab_hdr (abfd), sym, NULL);
3188 
3189   if (asect->use_rela_p)
3190     info->callbacks->einfo
3191       (_("%pB: %s (offset: 0x%v, info: 0x%v, addend: 0x%v) against "
3192 	 "'%s' " "for section '%pA' in %pB\n"),
3193        info->output_bfd, reloc_name, rel->r_offset, rel->r_info,
3194        rel->r_addend, name, asect, abfd);
3195   else
3196     info->callbacks->einfo
3197       (_("%pB: %s (offset: 0x%v, info: 0x%v) against '%s' for section "
3198 	 "'%pA' in %pB\n"),
3199        info->output_bfd, reloc_name, rel->r_offset, rel->r_info, name,
3200        asect, abfd);
3201 }
3202 
3203 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
3204 
3205 bool
3206 _bfd_x86_elf_hash_symbol (struct elf_link_hash_entry *h)
3207 {
3208   if (h->plt.offset != (bfd_vma) -1
3209       && !h->def_regular
3210       && !h->pointer_equality_needed)
3211     return false;
3212 
3213   return _bfd_elf_hash_symbol (h);
3214 }
3215 
3216 /* Adjust a symbol defined by a dynamic object and referenced by a
3217    regular object.  The current definition is in some section of the
3218    dynamic object, but we're not including those sections.  We have to
3219    change the definition to something the rest of the link can
3220    understand.  */
3221 
3222 bool
3223 _bfd_x86_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
3224 				    struct elf_link_hash_entry *h)
3225 {
3226   struct elf_x86_link_hash_table *htab;
3227   asection *s, *srel;
3228   struct elf_x86_link_hash_entry *eh;
3229   struct elf_dyn_relocs *p;
3230   const struct elf_backend_data *bed
3231     = get_elf_backend_data (info->output_bfd);
3232 
3233   eh = (struct elf_x86_link_hash_entry *) h;
3234 
3235   /* Clear GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS if it is turned
3236      on by an input relocatable file and there is a non-GOT/non-PLT
3237      reference from another relocatable file without it.
3238      NB: There can be non-GOT reference in data sections in input with
3239      GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS.  */
3240   if (eh->non_got_ref_without_indirect_extern_access
3241       && info->indirect_extern_access == 1
3242       && bfd_link_executable (info))
3243     {
3244       unsigned int needed_1;
3245       info->indirect_extern_access = 0;
3246       /* Turn off nocopyreloc if implied by indirect_extern_access.  */
3247       if (info->nocopyreloc == 2)
3248 	info->nocopyreloc = 0;
3249       needed_1 = bfd_h_get_32 (info->output_bfd, info->needed_1_p);
3250       needed_1 &= ~GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS;
3251       bfd_h_put_32 (info->output_bfd, needed_1, info->needed_1_p);
3252     }
3253 
3254   /* STT_GNU_IFUNC symbol must go through PLT. */
3255   if (h->type == STT_GNU_IFUNC)
3256     {
3257       /* All local STT_GNU_IFUNC references must be treate as local
3258 	 calls via local PLT.  */
3259       if (h->ref_regular
3260 	  && SYMBOL_CALLS_LOCAL (info, h))
3261 	{
3262 	  bfd_size_type pc_count = 0, count = 0;
3263 	  struct elf_dyn_relocs **pp;
3264 
3265 	  eh = (struct elf_x86_link_hash_entry *) h;
3266 	  for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
3267 	    {
3268 	      pc_count += p->pc_count;
3269 	      p->count -= p->pc_count;
3270 	      p->pc_count = 0;
3271 	      count += p->count;
3272 	      if (p->count == 0)
3273 		*pp = p->next;
3274 	      else
3275 		pp = &p->next;
3276 	    }
3277 
3278 	  if (pc_count || count)
3279 	    {
3280 	      h->non_got_ref = 1;
3281 	      if (pc_count)
3282 		{
3283 		  /* Increment PLT reference count only for PC-relative
3284 		     references.  */
3285 		  h->needs_plt = 1;
3286 		  if (h->plt.refcount <= 0)
3287 		    h->plt.refcount = 1;
3288 		  else
3289 		    h->plt.refcount += 1;
3290 		}
3291 	    }
3292 
3293 	  /* GOTOFF relocation needs PLT.  */
3294 	  if (eh->gotoff_ref)
3295 	    h->plt.refcount = 1;
3296 	}
3297 
3298       if (h->plt.refcount <= 0)
3299 	{
3300 	  h->plt.offset = (bfd_vma) -1;
3301 	  h->needs_plt = 0;
3302 	}
3303       return true;
3304     }
3305 
3306   /* If this is a function, put it in the procedure linkage table.  We
3307      will fill in the contents of the procedure linkage table later,
3308      when we know the address of the .got section.  */
3309   if (h->type == STT_FUNC
3310       || h->needs_plt)
3311     {
3312       if (h->plt.refcount <= 0
3313 	  || SYMBOL_CALLS_LOCAL (info, h)
3314 	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3315 	      && h->root.type == bfd_link_hash_undefweak))
3316 	{
3317 	  /* This case can occur if we saw a PLT32 reloc in an input
3318 	     file, but the symbol was never referred to by a dynamic
3319 	     object, or if all references were garbage collected.  In
3320 	     such a case, we don't actually need to build a procedure
3321 	     linkage table, and we can just do a PC32 reloc instead.  */
3322 	  h->plt.offset = (bfd_vma) -1;
3323 	  h->needs_plt = 0;
3324 	}
3325 
3326       return true;
3327     }
3328   else
3329     /* It's possible that we incorrectly decided a .plt reloc was needed
3330      * for an R_386_PC32/R_X86_64_PC32 reloc to a non-function sym in
3331        check_relocs.  We can't decide accurately between function and
3332        non-function syms in check-relocs;  Objects loaded later in
3333        the link may change h->type.  So fix it now.  */
3334     h->plt.offset = (bfd_vma) -1;
3335 
3336   /* If this is a weak symbol, and there is a real definition, the
3337      processor independent code will have arranged for us to see the
3338      real definition first, and we can just use the same value.  */
3339   if (h->is_weakalias)
3340     {
3341       struct elf_link_hash_entry *def = weakdef (h);
3342       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
3343       h->root.u.def.section = def->root.u.def.section;
3344       h->root.u.def.value = def->root.u.def.value;
3345       if (ELIMINATE_COPY_RELOCS
3346 	  || info->nocopyreloc
3347 	  || SYMBOL_NO_COPYRELOC (info, eh))
3348 	{
3349 	  /* NB: needs_copy is always 0 for i386.  */
3350 	  h->non_got_ref = def->non_got_ref;
3351 	  eh->needs_copy = def->needs_copy;
3352 	}
3353       return true;
3354     }
3355 
3356   /* This is a reference to a symbol defined by a dynamic object which
3357      is not a function.  */
3358 
3359   /* If we are creating a shared library, we must presume that the
3360      only references to the symbol are via the global offset table.
3361      For such cases we need not do anything here; the relocations will
3362      be handled correctly by relocate_section.  */
3363   if (!bfd_link_executable (info))
3364     return true;
3365 
3366   /* If there are no references to this symbol that do not use the
3367      GOT nor R_386_GOTOFF relocation, we don't need to generate a copy
3368      reloc.  NB: gotoff_ref is always 0 for x86-64.  */
3369   if (!h->non_got_ref && !eh->gotoff_ref)
3370     return true;
3371 
3372   /* If -z nocopyreloc was given, we won't generate them either.  */
3373   if (info->nocopyreloc || SYMBOL_NO_COPYRELOC (info, eh))
3374     {
3375       h->non_got_ref = 0;
3376       return true;
3377     }
3378 
3379   htab = elf_x86_hash_table (info, bed->target_id);
3380   if (htab == NULL)
3381     return false;
3382 
3383   /* If there aren't any dynamic relocs in read-only sections nor
3384      R_386_GOTOFF relocation, then we can keep the dynamic relocs and
3385      avoid the copy reloc.  This doesn't work on VxWorks, where we can
3386      not have dynamic relocations (other than copy and jump slot
3387      relocations) in an executable.  */
3388   if (ELIMINATE_COPY_RELOCS
3389       && (bed->target_id == X86_64_ELF_DATA
3390 	  || (!eh->gotoff_ref
3391 	      && htab->elf.target_os != is_vxworks)))
3392     {
3393       /* If we don't find any dynamic relocs in read-only sections,
3394 	 then we'll be keeping the dynamic relocs and avoiding the copy
3395 	 reloc.  */
3396       if (!_bfd_elf_readonly_dynrelocs (h))
3397 	{
3398 	  h->non_got_ref = 0;
3399 	  return true;
3400 	}
3401     }
3402 
3403   /* We must allocate the symbol in our .dynbss section, which will
3404      become part of the .bss section of the executable.  There will be
3405      an entry for this symbol in the .dynsym section.  The dynamic
3406      object will contain position independent code, so all references
3407      from the dynamic object to this symbol will go through the global
3408      offset table.  The dynamic linker will use the .dynsym entry to
3409      determine the address it must put in the global offset table, so
3410      both the dynamic object and the regular object will refer to the
3411      same memory location for the variable.  */
3412 
3413   /* We must generate a R_386_COPY/R_X86_64_COPY reloc to tell the
3414      dynamic linker to copy the initial value out of the dynamic object
3415      and into the runtime process image.  */
3416   if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
3417     {
3418       s = htab->elf.sdynrelro;
3419       srel = htab->elf.sreldynrelro;
3420     }
3421   else
3422     {
3423       s = htab->elf.sdynbss;
3424       srel = htab->elf.srelbss;
3425     }
3426   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
3427     {
3428       if (eh->def_protected && bfd_link_executable (info))
3429 	for (p = h->dyn_relocs; p != NULL; p = p->next)
3430 	  {
3431 	    /* Disallow copy relocation against non-copyable protected
3432 	       symbol.  */
3433 	    s = p->sec->output_section;
3434 	    if (s != NULL && (s->flags & SEC_READONLY) != 0)
3435 	      {
3436 		info->callbacks->einfo
3437 		  /* xgettext:c-format */
3438 		  (_("%F%P: %pB: copy relocation against non-copyable "
3439 		     "protected symbol `%s' in %pB\n"),
3440 		   p->sec->owner, h->root.root.string,
3441 		   h->root.u.def.section->owner);
3442 		return false;
3443 	      }
3444 	  }
3445 
3446       srel->size += htab->sizeof_reloc;
3447       h->needs_copy = 1;
3448     }
3449 
3450   return _bfd_elf_adjust_dynamic_copy (info, h, s);
3451 }
3452 
3453 void
3454 _bfd_x86_elf_hide_symbol (struct bfd_link_info *info,
3455 			  struct elf_link_hash_entry *h,
3456 			  bool force_local)
3457 {
3458   if (h->root.type == bfd_link_hash_undefweak
3459       && info->nointerp
3460       && bfd_link_pie (info))
3461     {
3462       /* When there is no dynamic interpreter in PIE, make the undefined
3463 	 weak symbol dynamic so that PC relative branch to the undefined
3464 	 weak symbol will land to address 0.  */
3465       struct elf_x86_link_hash_entry *eh = elf_x86_hash_entry (h);
3466       if (h->plt.refcount > 0
3467 	  || eh->plt_got.refcount > 0)
3468 	return;
3469     }
3470 
3471   _bfd_elf_link_hash_hide_symbol (info, h, force_local);
3472 }
3473 
3474 /* Return TRUE if a symbol is referenced locally.  It is similar to
3475    SYMBOL_REFERENCES_LOCAL, but it also checks version script.  It
3476    works in check_relocs.  */
3477 
3478 bool
3479 _bfd_x86_elf_link_symbol_references_local (struct bfd_link_info *info,
3480 					   struct elf_link_hash_entry *h)
3481 {
3482   struct elf_x86_link_hash_entry *eh = elf_x86_hash_entry (h);
3483   struct elf_x86_link_hash_table *htab
3484     = (struct elf_x86_link_hash_table *) info->hash;
3485 
3486   if (eh->local_ref > 1)
3487     return true;
3488 
3489   if (eh->local_ref == 1)
3490     return false;
3491 
3492   /* Unversioned symbols defined in regular objects can be forced local
3493      by linker version script.  A weak undefined symbol is forced local
3494      if
3495      1. It has non-default visibility.  Or
3496      2. When building executable, there is no dynamic linker.  Or
3497      3. or "-z nodynamic-undefined-weak" is used.
3498    */
3499   if (_bfd_elf_symbol_refs_local_p (h, info, 1)
3500       || (h->root.type == bfd_link_hash_undefweak
3501 	  && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3502 	      || (bfd_link_executable (info)
3503 		  && htab->interp == NULL)
3504 	      || info->dynamic_undefined_weak == 0))
3505       || ((h->def_regular || ELF_COMMON_DEF_P (h))
3506 	  && info->version_info != NULL
3507 	  && _bfd_elf_link_hide_sym_by_version (info, h)))
3508     {
3509       eh->local_ref = 2;
3510       return true;
3511     }
3512 
3513   eh->local_ref = 1;
3514   return false;
3515 }
3516 
3517 /* Return the section that should be marked against GC for a given
3518    relocation.	*/
3519 
3520 asection *
3521 _bfd_x86_elf_gc_mark_hook (asection *sec,
3522 			   struct bfd_link_info *info,
3523 			   Elf_Internal_Rela *rel,
3524 			   struct elf_link_hash_entry *h,
3525 			   Elf_Internal_Sym *sym)
3526 {
3527   /* Compiler should optimize this out.  */
3528   if (((unsigned int) R_X86_64_GNU_VTINHERIT
3529        != (unsigned int) R_386_GNU_VTINHERIT)
3530       || ((unsigned int) R_X86_64_GNU_VTENTRY
3531 	  != (unsigned int) R_386_GNU_VTENTRY))
3532     abort ();
3533 
3534   if (h != NULL)
3535     switch (ELF32_R_TYPE (rel->r_info))
3536       {
3537       case R_X86_64_GNU_VTINHERIT:
3538       case R_X86_64_GNU_VTENTRY:
3539 	return NULL;
3540       }
3541 
3542   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
3543 }
3544 
3545 static bfd_vma
3546 elf_i386_get_plt_got_vma (struct elf_x86_plt *plt_p ATTRIBUTE_UNUSED,
3547 			  bfd_vma off,
3548 			  bfd_vma offset ATTRIBUTE_UNUSED,
3549 			  bfd_vma got_addr)
3550 {
3551   return got_addr + off;
3552 }
3553 
3554 static bfd_vma
3555 elf_x86_64_get_plt_got_vma (struct elf_x86_plt *plt_p,
3556 			    bfd_vma off,
3557 			    bfd_vma offset,
3558 			    bfd_vma got_addr ATTRIBUTE_UNUSED)
3559 {
3560   return plt_p->sec->vma + offset + off + plt_p->plt_got_insn_size;
3561 }
3562 
3563 static bool
3564 elf_i386_valid_plt_reloc_p (unsigned int type)
3565 {
3566   return (type == R_386_JUMP_SLOT
3567 	  || type == R_386_GLOB_DAT
3568 	  || type == R_386_IRELATIVE);
3569 }
3570 
3571 static bool
3572 elf_x86_64_valid_plt_reloc_p (unsigned int type)
3573 {
3574   return (type == R_X86_64_JUMP_SLOT
3575 	  || type == R_X86_64_GLOB_DAT
3576 	  || type == R_X86_64_IRELATIVE);
3577 }
3578 
3579 long
3580 _bfd_x86_elf_get_synthetic_symtab (bfd *abfd,
3581 				   long count,
3582 				   long relsize,
3583 				   bfd_vma got_addr,
3584 				   struct elf_x86_plt plts[],
3585 				   asymbol **dynsyms,
3586 				   asymbol **ret)
3587 {
3588   long size, i, n, len;
3589   int j;
3590   unsigned int plt_got_offset, plt_entry_size;
3591   asymbol *s;
3592   bfd_byte *plt_contents;
3593   long dynrelcount;
3594   arelent **dynrelbuf, *p;
3595   char *names;
3596   const struct elf_backend_data *bed;
3597   bfd_vma (*get_plt_got_vma) (struct elf_x86_plt *, bfd_vma, bfd_vma,
3598 			      bfd_vma);
3599   bool (*valid_plt_reloc_p) (unsigned int);
3600   unsigned int jump_slot_reloc;
3601 
3602   dynrelbuf = NULL;
3603   if (count == 0)
3604     goto bad_return;
3605 
3606   dynrelbuf = (arelent **) bfd_malloc (relsize);
3607   if (dynrelbuf == NULL)
3608     goto bad_return;
3609 
3610   dynrelcount = bfd_canonicalize_dynamic_reloc (abfd, dynrelbuf,
3611 						dynsyms);
3612   if (dynrelcount <= 0)
3613     goto bad_return;
3614 
3615   /* Sort the relocs by address.  */
3616   qsort (dynrelbuf, dynrelcount, sizeof (arelent *),
3617 	 _bfd_x86_elf_compare_relocs);
3618 
3619   size = count * sizeof (asymbol);
3620 
3621   /* Allocate space for @plt suffixes.  */
3622   n = 0;
3623   for (i = 0; i < dynrelcount; i++)
3624     {
3625       p = dynrelbuf[i];
3626       size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3627       if (p->addend != 0)
3628 	size += sizeof ("+0x") - 1 + 8 + 8 * ABI_64_P (abfd);
3629     }
3630 
3631   s = *ret = (asymbol *) bfd_zmalloc (size);
3632   if (s == NULL)
3633     goto bad_return;
3634 
3635   bed = get_elf_backend_data (abfd);
3636 
3637   if (bed->target_id == X86_64_ELF_DATA)
3638     {
3639       get_plt_got_vma = elf_x86_64_get_plt_got_vma;
3640       valid_plt_reloc_p = elf_x86_64_valid_plt_reloc_p;
3641       jump_slot_reloc = R_X86_64_JUMP_SLOT;
3642     }
3643   else
3644     {
3645       get_plt_got_vma = elf_i386_get_plt_got_vma;
3646       valid_plt_reloc_p = elf_i386_valid_plt_reloc_p;
3647       jump_slot_reloc = R_386_JUMP_SLOT;
3648       if (got_addr)
3649 	{
3650 	  /* Check .got.plt and then .got to get the _GLOBAL_OFFSET_TABLE_
3651 	     address.  */
3652 	  asection *sec = bfd_get_section_by_name (abfd, ".got.plt");
3653 	  if (sec != NULL)
3654 	    got_addr = sec->vma;
3655 	  else
3656 	    {
3657 	      sec = bfd_get_section_by_name (abfd, ".got");
3658 	      if (sec != NULL)
3659 		got_addr = sec->vma;
3660 	    }
3661 
3662 	  if (got_addr == (bfd_vma) -1)
3663 	    goto bad_return;
3664 	}
3665     }
3666 
3667   /* Check for each PLT section.  */
3668   names = (char *) (s + count);
3669   size = 0;
3670   n = 0;
3671   for (j = 0; plts[j].name != NULL; j++)
3672     if ((plt_contents = plts[j].contents) != NULL)
3673       {
3674 	long k;
3675 	bfd_vma offset;
3676 	asection *plt;
3677 	struct elf_x86_plt *plt_p = &plts[j];
3678 
3679 	plt_got_offset = plt_p->plt_got_offset;
3680 	plt_entry_size = plt_p->plt_entry_size;
3681 
3682 	plt = plt_p->sec;
3683 
3684 	if ((plt_p->type & plt_lazy))
3685 	  {
3686 	    /* Skip PLT0 in lazy PLT.  */
3687 	    k = 1;
3688 	    offset = plt_entry_size;
3689 	  }
3690 	else
3691 	  {
3692 	    k = 0;
3693 	    offset = 0;
3694 	  }
3695 
3696 	/* Check each PLT entry against dynamic relocations.  */
3697 	for (; k < plt_p->count; k++)
3698 	  {
3699 	    int off;
3700 	    bfd_vma got_vma;
3701 	    long min, max, mid;
3702 
3703 	    /* Get the GOT offset for i386 or the PC-relative offset
3704 	       for x86-64, a signed 32-bit integer.  */
3705 	    off = H_GET_32 (abfd, (plt_contents + offset
3706 				   + plt_got_offset));
3707 	    got_vma = get_plt_got_vma (plt_p, off, offset, got_addr);
3708 
3709 	    /* Binary search.  */
3710 	    p = dynrelbuf[0];
3711 	    min = 0;
3712 	    max = dynrelcount;
3713 	    while ((min + 1) < max)
3714 	      {
3715 		arelent *r;
3716 
3717 		mid = (min + max) / 2;
3718 		r = dynrelbuf[mid];
3719 		if (got_vma > r->address)
3720 		  min = mid;
3721 		else if (got_vma < r->address)
3722 		  max = mid;
3723 		else
3724 		  {
3725 		    p = r;
3726 		    break;
3727 		  }
3728 	      }
3729 
3730 	    /* Skip unknown relocation.  PR 17512: file: bc9d6cf5.  */
3731 	    if (got_vma == p->address
3732 		&& p->howto != NULL
3733 		&& valid_plt_reloc_p (p->howto->type))
3734 	      {
3735 		*s = **p->sym_ptr_ptr;
3736 		/* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL
3737 		   set.  Since we are defining a symbol, ensure one
3738 		   of them is set.  */
3739 		if ((s->flags & BSF_LOCAL) == 0)
3740 		  s->flags |= BSF_GLOBAL;
3741 		s->flags |= BSF_SYNTHETIC;
3742 		/* This is no longer a section symbol.  */
3743 		s->flags &= ~BSF_SECTION_SYM;
3744 		s->section = plt;
3745 		s->the_bfd = plt->owner;
3746 		s->value = offset;
3747 		s->udata.p = NULL;
3748 		s->name = names;
3749 		len = strlen ((*p->sym_ptr_ptr)->name);
3750 		memcpy (names, (*p->sym_ptr_ptr)->name, len);
3751 		names += len;
3752 		/* There may be JUMP_SLOT and IRELATIVE relocations.
3753 		   JUMP_SLOT r_addend should be ignored.  */
3754 		if (p->addend != 0 && p->howto->type != jump_slot_reloc)
3755 		  {
3756 		    char buf[30], *a;
3757 
3758 		    memcpy (names, "+0x", sizeof ("+0x") - 1);
3759 		    names += sizeof ("+0x") - 1;
3760 		    bfd_sprintf_vma (abfd, buf, p->addend);
3761 		    for (a = buf; *a == '0'; ++a)
3762 		      ;
3763 		    size = strlen (a);
3764 		    memcpy (names, a, size);
3765 		    names += size;
3766 		  }
3767 		memcpy (names, "@plt", sizeof ("@plt"));
3768 		names += sizeof ("@plt");
3769 		n++;
3770 		s++;
3771 		/* There should be only one entry in PLT for a given
3772 		   symbol.  Set howto to NULL after processing a PLT
3773 		   entry to guard against corrupted PLT.  */
3774 		p->howto = NULL;
3775 	      }
3776 	    offset += plt_entry_size;
3777 	  }
3778       }
3779 
3780   /* PLT entries with R_386_TLS_DESC relocations are skipped.  */
3781   if (n == 0)
3782     {
3783     bad_return:
3784       count = -1;
3785     }
3786   else
3787     count = n;
3788 
3789   for (j = 0; plts[j].name != NULL; j++)
3790     _bfd_elf_munmap_section_contents (plts[j].sec, plts[j].contents);
3791 
3792   free (dynrelbuf);
3793 
3794   return count;
3795 }
3796 
3797 /* Parse x86 GNU properties.  */
3798 
3799 enum elf_property_kind
3800 _bfd_x86_elf_parse_gnu_properties (bfd *abfd, unsigned int type,
3801 				   bfd_byte *ptr, unsigned int datasz)
3802 {
3803   elf_property *prop;
3804 
3805   if (type == GNU_PROPERTY_X86_COMPAT_ISA_1_USED
3806       || type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
3807       || (type >= GNU_PROPERTY_X86_UINT32_AND_LO
3808 	  && type <= GNU_PROPERTY_X86_UINT32_AND_HI)
3809       || (type >= GNU_PROPERTY_X86_UINT32_OR_LO
3810 	  && type <= GNU_PROPERTY_X86_UINT32_OR_HI)
3811       || (type >= GNU_PROPERTY_X86_UINT32_OR_AND_LO
3812 	  && type <= GNU_PROPERTY_X86_UINT32_OR_AND_HI))
3813     {
3814       if (datasz != 4)
3815 	{
3816 	  _bfd_error_handler
3817 	    (_("error: %pB: <corrupt x86 property (0x%x) size: 0x%x>"),
3818 	     abfd, type, datasz);
3819 	  return property_corrupt;
3820 	}
3821       prop = _bfd_elf_get_property (abfd, type, datasz);
3822       prop->u.number |= bfd_h_get_32 (abfd, ptr);
3823       prop->pr_kind = property_number;
3824       return property_number;
3825     }
3826 
3827   return property_ignored;
3828 }
3829 
3830 /* Merge x86 GNU property BPROP with APROP.  If APROP isn't NULL,
3831    return TRUE if APROP is updated.  Otherwise, return TRUE if BPROP
3832    should be merged with ABFD.  */
3833 
3834 bool
3835 _bfd_x86_elf_merge_gnu_properties (struct bfd_link_info *info,
3836 				   bfd *abfd ATTRIBUTE_UNUSED,
3837 				   bfd *bbfd ATTRIBUTE_UNUSED,
3838 				   elf_property *aprop,
3839 				   elf_property *bprop)
3840 {
3841   unsigned int number, features;
3842   bool updated = false;
3843   const struct elf_backend_data *bed;
3844   struct elf_x86_link_hash_table *htab;
3845   unsigned int pr_type = aprop != NULL ? aprop->pr_type : bprop->pr_type;
3846 
3847   if (pr_type == GNU_PROPERTY_X86_COMPAT_ISA_1_USED
3848       || (pr_type >= GNU_PROPERTY_X86_UINT32_OR_AND_LO
3849 	  && pr_type <= GNU_PROPERTY_X86_UINT32_OR_AND_HI))
3850     {
3851       if (aprop == NULL || bprop == NULL)
3852 	{
3853 	  /* Only one of APROP and BPROP can be NULL.  */
3854 	  if (aprop != NULL)
3855 	    {
3856 	      /* Remove this property since the other input file doesn't
3857 		 have it.  */
3858 	      aprop->pr_kind = property_remove;
3859 	      updated = true;
3860 	    }
3861 	}
3862       else
3863 	{
3864 	  number = aprop->u.number;
3865 	  aprop->u.number = number | bprop->u.number;
3866 	  updated = number != (unsigned int) aprop->u.number;
3867 	}
3868       return updated;
3869     }
3870   else if (pr_type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
3871 	   || (pr_type >= GNU_PROPERTY_X86_UINT32_OR_LO
3872 	       && pr_type <= GNU_PROPERTY_X86_UINT32_OR_HI))
3873     {
3874       features = 0;
3875       if (pr_type == GNU_PROPERTY_X86_ISA_1_NEEDED)
3876 	{
3877 	  bed = get_elf_backend_data (info->output_bfd);
3878 	  htab = elf_x86_hash_table (info, bed->target_id);
3879 	  switch (htab->params->isa_level)
3880 	    {
3881 	    case 0:
3882 	      break;
3883 	    case 2:
3884 	      features = GNU_PROPERTY_X86_ISA_1_V2;
3885 	      break;
3886 	    case 3:
3887 	      features = GNU_PROPERTY_X86_ISA_1_V3;
3888 	      break;
3889 	    case 4:
3890 	      features = GNU_PROPERTY_X86_ISA_1_V4;
3891 	      break;
3892 	    default:
3893 	      abort ();
3894 	    }
3895 	}
3896       if (aprop != NULL && bprop != NULL)
3897 	{
3898 	  number = aprop->u.number;
3899 	  aprop->u.number = number | bprop->u.number | features;
3900 	  /* Remove the property if all bits are empty.  */
3901 	  if (aprop->u.number == 0)
3902 	    {
3903 	      aprop->pr_kind = property_remove;
3904 	      updated = true;
3905 	    }
3906 	  else
3907 	    updated = number != (unsigned int) aprop->u.number;
3908 	}
3909       else
3910 	{
3911 	  /* Only one of APROP and BPROP can be NULL.  */
3912 	  if (aprop != NULL)
3913 	    {
3914 	      aprop->u.number |= features;
3915 	      if (aprop->u.number == 0)
3916 		{
3917 		  /* Remove APROP if all bits are empty.  */
3918 		  aprop->pr_kind = property_remove;
3919 		  updated = true;
3920 		}
3921 	    }
3922 	  else
3923 	    {
3924 	      /* Return TRUE if APROP is NULL and all bits of BPROP
3925 		 aren't empty to indicate that BPROP should be added
3926 		 to ABFD.  */
3927 	      bprop->u.number |= features;
3928 	      updated = bprop->u.number != 0;
3929 	    }
3930 	}
3931       return updated;
3932     }
3933   else if (pr_type >= GNU_PROPERTY_X86_UINT32_AND_LO
3934 	   && pr_type <= GNU_PROPERTY_X86_UINT32_AND_HI)
3935     {
3936       /* Only one of APROP and BPROP can be NULL:
3937 	 1. APROP & BPROP when both APROP and BPROP aren't NULL.
3938 	 2. If APROP is NULL, remove x86 feature.
3939 	 3. Otherwise, do nothing.
3940        */
3941       bed = get_elf_backend_data (info->output_bfd);
3942       htab = elf_x86_hash_table (info, bed->target_id);
3943       if (!htab)
3944 	abort ();
3945       if (aprop != NULL && bprop != NULL)
3946 	{
3947 	  number = aprop->u.number;
3948 	  aprop->u.number = number & bprop->u.number;
3949 	  if (pr_type == GNU_PROPERTY_X86_FEATURE_1_AND)
3950 	    {
3951 	      features = 0;
3952 	      if (htab->params->ibt)
3953 		features = GNU_PROPERTY_X86_FEATURE_1_IBT;
3954 	      if (htab->params->shstk)
3955 		features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
3956 	      if (htab->params->lam_u48)
3957 		features |= (GNU_PROPERTY_X86_FEATURE_1_LAM_U48
3958 			     | GNU_PROPERTY_X86_FEATURE_1_LAM_U57);
3959 	      else if (htab->params->lam_u57)
3960 		features |= GNU_PROPERTY_X86_FEATURE_1_LAM_U57;
3961 	      /* Add GNU_PROPERTY_X86_FEATURE_1_IBT,
3962 		 GNU_PROPERTY_X86_FEATURE_1_SHSTK,
3963 		 GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and
3964 		 GNU_PROPERTY_X86_FEATURE_1_LAM_U57.  */
3965 	      aprop->u.number |= features;
3966 	    }
3967 	  updated = number != (unsigned int) aprop->u.number;
3968 	  /* Remove the property if all feature bits are cleared.  */
3969 	  if (aprop->u.number == 0)
3970 	    aprop->pr_kind = property_remove;
3971 	}
3972       else
3973 	{
3974 	  /* There should be no AND properties since some input doesn't
3975 	     have them.  Set IBT and SHSTK properties for -z ibt and -z
3976 	     shstk if needed.  */
3977 	  features = 0;
3978 	  if (pr_type == GNU_PROPERTY_X86_FEATURE_1_AND)
3979 	    {
3980 	      if (htab->params->ibt)
3981 		features = GNU_PROPERTY_X86_FEATURE_1_IBT;
3982 	      if (htab->params->shstk)
3983 		features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
3984 	      if (htab->params->lam_u48)
3985 		features |= (GNU_PROPERTY_X86_FEATURE_1_LAM_U48
3986 			     | GNU_PROPERTY_X86_FEATURE_1_LAM_U57);
3987 	      else if (htab->params->lam_u57)
3988 		features |= GNU_PROPERTY_X86_FEATURE_1_LAM_U57;
3989 	    }
3990 	  if (features)
3991 	    {
3992 	      if (aprop != NULL)
3993 		{
3994 		  updated = features != (unsigned int) aprop->u.number;
3995 		  aprop->u.number = features;
3996 		}
3997 	      else
3998 		{
3999 		  updated = true;
4000 		  bprop->u.number = features;
4001 		}
4002 	    }
4003 	  else if (aprop != NULL)
4004 	    {
4005 	      aprop->pr_kind = property_remove;
4006 	      updated = true;
4007 	    }
4008 	}
4009       return updated;
4010     }
4011   else
4012     {
4013       /* Never should happen.  */
4014       abort ();
4015     }
4016 
4017   return updated;
4018 }
4019 
4020 /* Set up x86 GNU properties.  Return the first relocatable ELF input
4021    with GNU properties if found.  Otherwise, return NULL.  */
4022 
4023 bfd *
4024 _bfd_x86_elf_link_setup_gnu_properties
4025   (struct bfd_link_info *info, struct elf_x86_init_table *init_table)
4026 {
4027   bool normal_target;
4028   bool lazy_plt;
4029   asection *sec, *pltsec;
4030   bfd *dynobj;
4031   bool use_ibt_plt;
4032   unsigned int plt_alignment, features, isa_level;
4033   struct elf_x86_link_hash_table *htab;
4034   bfd *pbfd;
4035   bfd *ebfd = NULL;
4036   elf_property *prop;
4037   const struct elf_backend_data *bed;
4038   unsigned int class_align = ABI_64_P (info->output_bfd) ? 3 : 2;
4039   unsigned int got_align;
4040 
4041   /* Find a normal input file with GNU property note.  */
4042   for (pbfd = info->input_bfds;
4043        pbfd != NULL;
4044        pbfd = pbfd->link.next)
4045     if (bfd_get_flavour (pbfd) == bfd_target_elf_flavour
4046 	&& bfd_count_sections (pbfd) != 0)
4047       {
4048 	ebfd = pbfd;
4049 
4050 	if (elf_properties (pbfd) != NULL)
4051 	  break;
4052       }
4053 
4054   bed = get_elf_backend_data (info->output_bfd);
4055 
4056   htab = elf_x86_hash_table (info, bed->target_id);
4057   if (htab == NULL)
4058     return pbfd;
4059 
4060   features = 0;
4061   if (htab->params->ibt)
4062     {
4063       features = GNU_PROPERTY_X86_FEATURE_1_IBT;
4064       htab->params->cet_report &= ~prop_report_ibt;
4065     }
4066   if (htab->params->shstk)
4067     {
4068       features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
4069       htab->params->cet_report &= ~prop_report_shstk;
4070     }
4071   if (!(htab->params->cet_report & (prop_report_ibt | prop_report_shstk)))
4072     htab->params->cet_report = prop_report_none;
4073   if (htab->params->lam_u48)
4074     {
4075       features |= (GNU_PROPERTY_X86_FEATURE_1_LAM_U48
4076 		   | GNU_PROPERTY_X86_FEATURE_1_LAM_U57);
4077       htab->params->lam_u48_report = prop_report_none;
4078       htab->params->lam_u57_report = prop_report_none;
4079     }
4080   else if (htab->params->lam_u57)
4081     {
4082       features |= GNU_PROPERTY_X86_FEATURE_1_LAM_U57;
4083       htab->params->lam_u57_report = prop_report_none;
4084     }
4085 
4086   switch (htab->params->isa_level)
4087     {
4088     case 0:
4089       isa_level = 0;
4090       break;
4091     case 1:
4092       isa_level = GNU_PROPERTY_X86_ISA_1_BASELINE;
4093       break;
4094     case 2:
4095       isa_level = GNU_PROPERTY_X86_ISA_1_V2;
4096       break;
4097     case 3:
4098       isa_level = GNU_PROPERTY_X86_ISA_1_V3;
4099       break;
4100     case 4:
4101       isa_level = GNU_PROPERTY_X86_ISA_1_V4;
4102       break;
4103     default:
4104       abort ();
4105     }
4106 
4107   if (ebfd != NULL)
4108     {
4109       prop = NULL;
4110       if (features)
4111 	{
4112 	  /* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT,
4113 	     GNU_PROPERTY_X86_FEATURE_1_SHSTK,
4114 	     GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and
4115 	     GNU_PROPERTY_X86_FEATURE_1_LAM_U57.  */
4116 	  prop = _bfd_elf_get_property (ebfd,
4117 					GNU_PROPERTY_X86_FEATURE_1_AND,
4118 					4);
4119 	  prop->u.number |= features;
4120 	  prop->pr_kind = property_number;
4121 	}
4122 
4123       if (isa_level)
4124 	{
4125 	  /* If ISA level is set, add GNU_PROPERTY_X86_ISA_1_NEEDED.  */
4126 	  prop = _bfd_elf_get_property (ebfd,
4127 					GNU_PROPERTY_X86_ISA_1_NEEDED,
4128 					4);
4129 	  prop->u.number |= isa_level;
4130 	  prop->pr_kind = property_number;
4131 	}
4132 
4133       /* Create the GNU property note section if needed.  */
4134       if (prop != NULL && pbfd == NULL)
4135 	{
4136 	  sec = bfd_make_section_with_flags (ebfd,
4137 					     NOTE_GNU_PROPERTY_SECTION_NAME,
4138 					     (SEC_ALLOC
4139 					      | SEC_LOAD
4140 					      | SEC_IN_MEMORY
4141 					      | SEC_READONLY
4142 					      | SEC_HAS_CONTENTS
4143 					      | SEC_DATA));
4144 	  if (sec == NULL)
4145 	    info->callbacks->einfo (_("%F%P: failed to create GNU property section\n"));
4146 
4147 	  if (!bfd_set_section_alignment (sec, class_align))
4148 	    {
4149 	    error_alignment:
4150 	      info->callbacks->einfo (_("%F%pA: failed to align section\n"),
4151 				      sec);
4152 	    }
4153 
4154 	  elf_section_type (sec) = SHT_NOTE;
4155 	}
4156     }
4157 
4158   if (htab->params->cet_report
4159       || htab->params->lam_u48_report
4160       || htab->params->lam_u57_report)
4161     {
4162       /* Report missing IBT, SHSTK and LAM properties.  */
4163       bfd *abfd;
4164       const char *warning_msg = _("%P: %pB: warning: missing %s\n");
4165       const char *error_msg = _("%X%P: %pB: error: missing %s\n");
4166       const char *cet_msg = NULL;
4167       const char *lam_u48_msg = NULL;
4168       const char *lam_u57_msg = NULL;
4169       const char *missing;
4170       elf_property_list *p;
4171       bool missing_ibt, missing_shstk;
4172       bool missing_lam_u48, missing_lam_u57;
4173       bool check_ibt
4174 	= (htab->params->cet_report
4175 	   && (htab->params->cet_report & prop_report_ibt));
4176       bool check_shstk
4177 	= (htab->params->cet_report
4178 	   && (htab->params->cet_report & prop_report_shstk));
4179 
4180       if (htab->params->cet_report)
4181 	{
4182 	  if ((htab->params->cet_report & prop_report_warning))
4183 	    cet_msg = warning_msg;
4184 	  else
4185 	    cet_msg = error_msg;
4186 	}
4187       if (htab->params->lam_u48_report)
4188 	{
4189 	  if ((htab->params->lam_u48_report & prop_report_warning))
4190 	    lam_u48_msg = warning_msg;
4191 	  else
4192 	    lam_u48_msg = error_msg;
4193 	}
4194       if (htab->params->lam_u57_report)
4195 	{
4196 	  if ((htab->params->lam_u57_report & prop_report_warning))
4197 	    lam_u57_msg = warning_msg;
4198 	  else
4199 	    lam_u57_msg = error_msg;
4200 	}
4201 
4202       for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
4203 	if (!(abfd->flags & (DYNAMIC | BFD_PLUGIN | BFD_LINKER_CREATED))
4204 	    && bfd_get_flavour (abfd) == bfd_target_elf_flavour)
4205 	  {
4206 	    for (p = elf_properties (abfd); p; p = p->next)
4207 	      if (p->property.pr_type == GNU_PROPERTY_X86_FEATURE_1_AND)
4208 		break;
4209 
4210 	    missing_ibt = check_ibt;
4211 	    missing_shstk = check_shstk;
4212 	    missing_lam_u48 = !!lam_u48_msg;
4213 	    missing_lam_u57 = !!lam_u57_msg;
4214 	    if (p)
4215 	      {
4216 		missing_ibt &= !(p->property.u.number
4217 				 & GNU_PROPERTY_X86_FEATURE_1_IBT);
4218 		missing_shstk &= !(p->property.u.number
4219 				   & GNU_PROPERTY_X86_FEATURE_1_SHSTK);
4220 		missing_lam_u48 &= !(p->property.u.number
4221 				     & GNU_PROPERTY_X86_FEATURE_1_LAM_U48);
4222 		missing_lam_u57 &= !(p->property.u.number
4223 				     & GNU_PROPERTY_X86_FEATURE_1_LAM_U57);
4224 	      }
4225 	    if (missing_ibt || missing_shstk)
4226 	      {
4227 		if (missing_ibt && missing_shstk)
4228 		  missing = _("IBT and SHSTK properties");
4229 		else if (missing_ibt)
4230 		  missing = _("IBT property");
4231 		else
4232 		  missing = _("SHSTK property");
4233 		info->callbacks->einfo (cet_msg, abfd, missing);
4234 	      }
4235 	    if (missing_lam_u48)
4236 	      {
4237 		missing = _("LAM_U48 property");
4238 		info->callbacks->einfo (lam_u48_msg, abfd, missing);
4239 	      }
4240 	    if (missing_lam_u57)
4241 	      {
4242 		missing = _("LAM_U57 property");
4243 		info->callbacks->einfo (lam_u57_msg, abfd, missing);
4244 	      }
4245 	  }
4246     }
4247 
4248   pbfd = _bfd_elf_link_setup_gnu_properties (info);
4249 
4250   htab->r_info = init_table->r_info;
4251   htab->r_sym = init_table->r_sym;
4252 
4253   if (bfd_link_relocatable (info))
4254     return pbfd;
4255 
4256   htab->plt0_pad_byte = init_table->plt0_pad_byte;
4257 
4258   use_ibt_plt = htab->params->ibtplt || htab->params->ibt;
4259   if (!use_ibt_plt && pbfd != NULL)
4260     {
4261       /* Check if GNU_PROPERTY_X86_FEATURE_1_IBT is on.  */
4262       elf_property_list *p;
4263 
4264       /* The property list is sorted in order of type.  */
4265       for (p = elf_properties (pbfd); p; p = p->next)
4266 	{
4267 	  if (GNU_PROPERTY_X86_FEATURE_1_AND == p->property.pr_type)
4268 	    {
4269 	      use_ibt_plt = !!(p->property.u.number
4270 			       & GNU_PROPERTY_X86_FEATURE_1_IBT);
4271 	      break;
4272 	    }
4273 	  else if (GNU_PROPERTY_X86_FEATURE_1_AND < p->property.pr_type)
4274 	    break;
4275 	}
4276     }
4277 
4278   dynobj = htab->elf.dynobj;
4279 
4280   /* Set htab->elf.dynobj here so that there is no need to check and
4281      set it in check_relocs.  */
4282   if (dynobj == NULL)
4283     {
4284       if (pbfd != NULL)
4285 	{
4286 	  htab->elf.dynobj = pbfd;
4287 	  dynobj = pbfd;
4288 	}
4289       else
4290 	{
4291 	  bfd *abfd;
4292 
4293 	  /* Find a normal input file to hold linker created
4294 	     sections.  */
4295 	  for (abfd = info->input_bfds;
4296 	       abfd != NULL;
4297 	       abfd = abfd->link.next)
4298 	    if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
4299 		&& (abfd->flags
4300 		    & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0
4301 		&& bed->relocs_compatible (abfd->xvec,
4302 					   info->output_bfd->xvec))
4303 	      {
4304 		htab->elf.dynobj = abfd;
4305 		dynobj = abfd;
4306 		break;
4307 	      }
4308 	}
4309     }
4310 
4311   /* Return if there are no normal input files.  */
4312   if (dynobj == NULL)
4313     return pbfd;
4314 
4315   /* Even when lazy binding is disabled by "-z now", the PLT0 entry may
4316      still be used with LD_AUDIT or LD_PROFILE if PLT entry is used for
4317      canonical function address.  */
4318   htab->plt.has_plt0 = 1;
4319   htab->plt.plt_indirect_branch_offset = 0;
4320   normal_target = htab->elf.target_os == is_normal;
4321 
4322   if (normal_target)
4323     {
4324       if (use_ibt_plt)
4325 	{
4326 	  htab->lazy_plt = init_table->lazy_ibt_plt;
4327 	  htab->non_lazy_plt = init_table->non_lazy_ibt_plt;
4328 	  htab->plt.plt_indirect_branch_offset = 4;
4329 	}
4330       else
4331 	{
4332 	  htab->lazy_plt = init_table->lazy_plt;
4333 	  htab->non_lazy_plt = init_table->non_lazy_plt;
4334 	}
4335     }
4336   else
4337     {
4338       htab->lazy_plt = init_table->lazy_plt;
4339       htab->non_lazy_plt = NULL;
4340     }
4341 
4342   pltsec = htab->elf.splt;
4343 
4344   if (htab->non_lazy_plt != NULL
4345       && (!htab->plt.has_plt0 || pltsec == NULL))
4346     lazy_plt = false;
4347   else
4348     lazy_plt = true;
4349 
4350   if (normal_target)
4351     {
4352       if (use_ibt_plt)
4353 	{
4354 	  if (lazy_plt)
4355 	    htab->sframe_plt = init_table->sframe_lazy_ibt_plt;
4356 	  else
4357 	    htab->sframe_plt = init_table->sframe_non_lazy_ibt_plt;
4358 	}
4359       else
4360 	{
4361 	  if (lazy_plt)
4362 	    htab->sframe_plt = init_table->sframe_lazy_plt;
4363 	  else
4364 	    htab->sframe_plt = init_table->sframe_non_lazy_plt;
4365 	}
4366     }
4367   else
4368     htab->sframe_plt = NULL;
4369 
4370   /* If the non-lazy PLT is available, use it for all PLT entries if
4371      there are no PLT0 or no .plt section.  */
4372   if (!lazy_plt)
4373     {
4374       if (bfd_link_pic (info))
4375 	htab->plt.plt_entry = htab->non_lazy_plt->pic_plt_entry;
4376       else
4377 	htab->plt.plt_entry = htab->non_lazy_plt->plt_entry;
4378       htab->plt.plt_entry_size = htab->non_lazy_plt->plt_entry_size;
4379       htab->plt.plt_got_offset = htab->non_lazy_plt->plt_got_offset;
4380       htab->plt.plt_got_insn_size
4381 	= htab->non_lazy_plt->plt_got_insn_size;
4382       htab->plt.eh_frame_plt_size
4383 	= htab->non_lazy_plt->eh_frame_plt_size;
4384       htab->plt.eh_frame_plt = htab->non_lazy_plt->eh_frame_plt;
4385     }
4386   else
4387     {
4388       if (bfd_link_pic (info))
4389 	{
4390 	  htab->plt.plt0_entry = htab->lazy_plt->pic_plt0_entry;
4391 	  htab->plt.plt_entry = htab->lazy_plt->pic_plt_entry;
4392 	}
4393       else
4394 	{
4395 	  htab->plt.plt0_entry = htab->lazy_plt->plt0_entry;
4396 	  htab->plt.plt_entry = htab->lazy_plt->plt_entry;
4397 	}
4398       htab->plt.plt_entry_size = htab->lazy_plt->plt_entry_size;
4399       htab->plt.plt_got_offset = htab->lazy_plt->plt_got_offset;
4400       htab->plt.plt_got_insn_size
4401 	= htab->lazy_plt->plt_got_insn_size;
4402       htab->plt.eh_frame_plt_size
4403 	= htab->lazy_plt->eh_frame_plt_size;
4404       htab->plt.eh_frame_plt = htab->lazy_plt->eh_frame_plt;
4405     }
4406 
4407   if (htab->elf.target_os == is_vxworks
4408       && !elf_vxworks_create_dynamic_sections (dynobj, info,
4409 					       &htab->srelplt2))
4410     {
4411       info->callbacks->einfo (_("%F%P: failed to create VxWorks dynamic sections\n"));
4412       return pbfd;
4413     }
4414 
4415   /* Since create_dynamic_sections isn't always called, but GOT
4416      relocations need GOT relocations, create them here so that we
4417      don't need to do it in check_relocs.  */
4418   if (htab->elf.sgot == NULL
4419       && !_bfd_elf_create_got_section (dynobj, info))
4420     info->callbacks->einfo (_("%F%P: failed to create GOT sections\n"));
4421 
4422   got_align = (bed->target_id == X86_64_ELF_DATA) ? 3 : 2;
4423 
4424   /* Align .got and .got.plt sections to their entry size.  Do it here
4425      instead of in create_dynamic_sections so that they are always
4426      properly aligned even if create_dynamic_sections isn't called.  */
4427   sec = htab->elf.sgot;
4428   if (!bfd_set_section_alignment (sec, got_align))
4429     goto error_alignment;
4430 
4431   sec = htab->elf.sgotplt;
4432   if (!bfd_set_section_alignment (sec, got_align))
4433     goto error_alignment;
4434 
4435   /* Create the ifunc sections here so that check_relocs can be
4436      simplified.  */
4437   if (!_bfd_elf_create_ifunc_sections (dynobj, info))
4438     info->callbacks->einfo (_("%F%P: failed to create ifunc sections\n"));
4439 
4440   plt_alignment = bfd_log2 (htab->plt.plt_entry_size);
4441 
4442   if (pltsec != NULL)
4443     {
4444       /* Whe creating executable, set the contents of the .interp
4445 	 section to the interpreter.  */
4446       if (bfd_link_executable (info) && !info->nointerp)
4447 	{
4448 	  asection *s = bfd_get_linker_section (dynobj, ".interp");
4449 	  if (s == NULL)
4450 	    abort ();
4451 	  s->size = htab->dynamic_interpreter_size;
4452 	  s->contents = (unsigned char *) htab->dynamic_interpreter;
4453 	  htab->interp = s;
4454 	}
4455 
4456       if (normal_target)
4457 	{
4458 	  flagword pltflags = (bed->dynamic_sec_flags
4459 			       | SEC_ALLOC
4460 			       | SEC_CODE
4461 			       | SEC_LOAD
4462 			       | SEC_READONLY);
4463 	  unsigned int non_lazy_plt_alignment
4464 	    = bfd_log2 (htab->non_lazy_plt->plt_entry_size);
4465 
4466 	  sec = pltsec;
4467 	  if (!bfd_set_section_alignment (sec, plt_alignment))
4468 	    goto error_alignment;
4469 
4470 	  /* Create the GOT procedure linkage table.  */
4471 	  sec = bfd_make_section_anyway_with_flags (dynobj,
4472 						    ".plt.got",
4473 						    pltflags);
4474 	  if (sec == NULL)
4475 	    info->callbacks->einfo (_("%F%P: failed to create GOT PLT section\n"));
4476 
4477 	  if (!bfd_set_section_alignment (sec, non_lazy_plt_alignment))
4478 	    goto error_alignment;
4479 
4480 	  htab->plt_got = sec;
4481 
4482 	  if (lazy_plt)
4483 	    {
4484 	      sec = NULL;
4485 
4486 	      if (use_ibt_plt)
4487 		{
4488 		  /* Create the second PLT for Intel IBT support.  IBT
4489 		     PLT is needed only for lazy binding.  */
4490 		  sec = bfd_make_section_anyway_with_flags (dynobj,
4491 							    ".plt.sec",
4492 							    pltflags);
4493 		  if (sec == NULL)
4494 		    info->callbacks->einfo (_("%F%P: failed to create IBT-enabled PLT section\n"));
4495 
4496 		  if (!bfd_set_section_alignment (sec, plt_alignment))
4497 		    goto error_alignment;
4498 		}
4499 
4500 	      htab->plt_second = sec;
4501 	    }
4502 	}
4503 
4504       if (!info->no_ld_generated_unwind_info)
4505 	{
4506 	  flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4507 			    | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4508 			    | SEC_LINKER_CREATED);
4509 
4510 	  sec = bfd_make_section_anyway_with_flags (dynobj,
4511 						    ".eh_frame",
4512 						    flags);
4513 	  if (sec == NULL)
4514 	    info->callbacks->einfo (_("%F%P: failed to create PLT .eh_frame section\n"));
4515 
4516 	  if (!bfd_set_section_alignment (sec, class_align))
4517 	    goto error_alignment;
4518 
4519 	  htab->plt_eh_frame = sec;
4520 
4521 	  if (htab->plt_got != NULL)
4522 	    {
4523 	      sec = bfd_make_section_anyway_with_flags (dynobj,
4524 							".eh_frame",
4525 							flags);
4526 	      if (sec == NULL)
4527 		info->callbacks->einfo (_("%F%P: failed to create GOT PLT .eh_frame section\n"));
4528 
4529 	      if (!bfd_set_section_alignment (sec, class_align))
4530 		goto error_alignment;
4531 
4532 	      htab->plt_got_eh_frame = sec;
4533 	    }
4534 
4535 	  if (htab->plt_second != NULL)
4536 	    {
4537 	      sec = bfd_make_section_anyway_with_flags (dynobj,
4538 							".eh_frame",
4539 							flags);
4540 	      if (sec == NULL)
4541 		info->callbacks->einfo (_("%F%P: failed to create the second PLT .eh_frame section\n"));
4542 
4543 	      if (!bfd_set_section_alignment (sec, class_align))
4544 		goto error_alignment;
4545 
4546 	      htab->plt_second_eh_frame = sec;
4547 	    }
4548 	}
4549 
4550       /* .sframe sections are emitted for AMD64 ABI only.  */
4551       if (ABI_64_P (info->output_bfd) && !info->no_ld_generated_unwind_info)
4552 	{
4553 	  flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4554 			    | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4555 			    | SEC_LINKER_CREATED);
4556 
4557 	  sec = bfd_make_section_anyway_with_flags (dynobj,
4558 						    ".sframe",
4559 						    flags);
4560 	  if (sec == NULL)
4561 	    info->callbacks->einfo (_("%F%P: failed to create PLT .sframe section\n"));
4562 
4563 	  // FIXME check this
4564 	  // if (!bfd_set_section_alignment (sec, class_align))
4565 	  //  goto error_alignment;
4566 
4567 	  htab->plt_sframe = sec;
4568 
4569 	  /* Second PLT is generated for Intel IBT + lazy plt.  */
4570 	  if (htab->plt_second != NULL)
4571 	    {
4572 	      sec = bfd_make_section_anyway_with_flags (dynobj,
4573 							".sframe",
4574 							flags);
4575 	      if (sec == NULL)
4576 		info->callbacks->einfo (_("%F%P: failed to create second PLT .sframe section\n"));
4577 
4578 	      htab->plt_second_sframe = sec;
4579 	    }
4580 	  /* FIXME - add later for plt_got. */
4581 	}
4582     }
4583 
4584   /* The .iplt section is used for IFUNC symbols in static
4585      executables.  */
4586   sec = htab->elf.iplt;
4587   if (sec != NULL)
4588     {
4589       /* NB: Delay setting its alignment until we know it is non-empty.
4590 	 Otherwise an empty iplt section may change vma and lma of the
4591 	 following sections, which triggers moving dot of the following
4592 	 section backwards, resulting in a warning and section lma not
4593 	 being set properly.  It later leads to a "File truncated"
4594 	 error.  */
4595       if (!bfd_set_section_alignment (sec, 0))
4596 	goto error_alignment;
4597 
4598       htab->plt.iplt_alignment = (normal_target
4599 				  ? plt_alignment
4600 				  : bed->plt_alignment);
4601     }
4602 
4603   if (bfd_link_executable (info)
4604       && !info->nointerp
4605       && !htab->params->has_dynamic_linker
4606       && htab->params->static_before_all_inputs)
4607     {
4608       /* Report error for dynamic input objects if -static is passed at
4609 	 command-line before all input files without --dynamic-linker
4610 	 unless --no-dynamic-linker is used.  */
4611       bfd *abfd;
4612 
4613       for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
4614 	if ((abfd->flags & DYNAMIC))
4615 	  info->callbacks->einfo
4616 	    (_("%X%P: attempted static link of dynamic object `%pB'\n"),
4617 	     abfd);
4618     }
4619 
4620   return pbfd;
4621 }
4622 
4623 /* Fix up x86 GNU properties.  */
4624 
4625 void
4626 _bfd_x86_elf_link_fixup_gnu_properties
4627   (struct bfd_link_info *info, elf_property_list **listp)
4628 {
4629   elf_property_list *p;
4630 
4631   for (p = *listp; p; p = p->next)
4632     {
4633       unsigned int type = p->property.pr_type;
4634       if (type == GNU_PROPERTY_X86_COMPAT_ISA_1_USED
4635 	  || type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
4636 	  || (type >= GNU_PROPERTY_X86_UINT32_AND_LO
4637 	      && type <= GNU_PROPERTY_X86_UINT32_AND_HI)
4638 	  || (type >= GNU_PROPERTY_X86_UINT32_OR_LO
4639 	      && type <= GNU_PROPERTY_X86_UINT32_OR_HI)
4640 	  || (type >= GNU_PROPERTY_X86_UINT32_OR_AND_LO
4641 	      && type <= GNU_PROPERTY_X86_UINT32_OR_AND_HI))
4642 	{
4643 	  if (p->property.u.number == 0
4644 	      && (type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
4645 		  || (type >= GNU_PROPERTY_X86_UINT32_AND_LO
4646 		      && type <= GNU_PROPERTY_X86_UINT32_AND_HI)
4647 		  || (type >= GNU_PROPERTY_X86_UINT32_OR_LO
4648 		      && type <= GNU_PROPERTY_X86_UINT32_OR_HI)))
4649 	    {
4650 	      /* Remove empty property.  */
4651 	      *listp = p->next;
4652 	      continue;
4653 	    }
4654 
4655 	  /* Keep LAM features only for 64-bit output.  */
4656 	  if (type == GNU_PROPERTY_X86_FEATURE_1_AND
4657 	      && !ABI_64_P (info->output_bfd))
4658 	    p->property.u.number &= ~(GNU_PROPERTY_X86_FEATURE_1_LAM_U48
4659 				      | GNU_PROPERTY_X86_FEATURE_1_LAM_U57);
4660 
4661 	  listp = &p->next;
4662 	}
4663       else if (type > GNU_PROPERTY_HIPROC)
4664 	{
4665 	  /* The property list is sorted in order of type.  */
4666 	  break;
4667 	}
4668     }
4669 }
4670 
4671 void
4672 _bfd_elf_linker_x86_set_options (struct bfd_link_info * info,
4673 				 struct elf_linker_x86_params *params)
4674 {
4675   const struct elf_backend_data *bed
4676     = get_elf_backend_data (info->output_bfd);
4677   struct elf_x86_link_hash_table *htab
4678     = elf_x86_hash_table (info, bed->target_id);
4679   if (htab != NULL)
4680     htab->params = params;
4681 }
4682