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