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