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