1 /* .eh_frame section optimization. 2 Copyright (C) 2001-2026 Free Software Foundation, Inc. 3 Written by Jakub Jelinek <jakub (at) redhat.com>. 4 5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 MA 02110-1301, USA. */ 21 22 #include "sysdep.h" 23 #include "bfd.h" 24 #include "libbfd.h" 25 #include "elf-bfd.h" 26 #include "dwarf2.h" 27 28 #define EH_FRAME_HDR_SIZE 8 29 30 struct cie 31 { 32 unsigned int length; 33 unsigned int hash; 34 unsigned char version; 35 unsigned char local_personality; 36 char augmentation[20]; 37 bfd_vma code_align; 38 bfd_signed_vma data_align; 39 bfd_vma ra_column; 40 bfd_vma augmentation_size; 41 union { 42 struct elf_link_hash_entry *h; 43 struct { 44 unsigned int bfd_id; 45 unsigned int index; 46 } sym; 47 unsigned int reloc_index; 48 } personality; 49 struct eh_cie_fde *cie_inf; 50 unsigned char per_encoding; 51 unsigned char lsda_encoding; 52 unsigned char fde_encoding; 53 unsigned char initial_insn_length; 54 unsigned char can_make_lsda_relative; 55 unsigned char initial_instructions[50]; 56 }; 57 58 59 60 /* If *ITER hasn't reached END yet, read the next byte into *RESULT and 61 move onto the next byte. Return true on success. */ 62 63 static inline bool 64 read_byte (bfd_byte **iter, bfd_byte *end, unsigned char *result) 65 { 66 if (*iter >= end) 67 return false; 68 *result = *((*iter)++); 69 return true; 70 } 71 72 /* Move *ITER over LENGTH bytes, or up to END, whichever is closer. 73 Return true it was possible to move LENGTH bytes. */ 74 75 static inline bool 76 skip_bytes (bfd_byte **iter, bfd_byte *end, bfd_size_type length) 77 { 78 if ((bfd_size_type) (end - *iter) < length) 79 { 80 *iter = end; 81 return false; 82 } 83 *iter += length; 84 return true; 85 } 86 87 /* Move *ITER over an leb128, stopping at END. Return true if the end 88 of the leb128 was found. */ 89 90 static bool 91 skip_leb128 (bfd_byte **iter, bfd_byte *end) 92 { 93 unsigned char byte; 94 do 95 if (!read_byte (iter, end, &byte)) 96 return false; 97 while (byte & 0x80); 98 return true; 99 } 100 101 /* Like skip_leb128, but treat the leb128 as an unsigned value and 102 store it in *VALUE. */ 103 104 static bool 105 read_uleb128 (bfd_byte **iter, bfd_byte *end, bfd_vma *value) 106 { 107 bfd_byte *start, *p; 108 109 start = *iter; 110 if (!skip_leb128 (iter, end)) 111 return false; 112 113 p = *iter; 114 *value = *--p; 115 while (p > start) 116 *value = (*value << 7) | (*--p & 0x7f); 117 118 return true; 119 } 120 121 /* Like read_uleb128, but for signed values. */ 122 123 static bool 124 read_sleb128 (bfd_byte **iter, bfd_byte *end, bfd_signed_vma *value) 125 { 126 bfd_byte *start, *p; 127 128 start = *iter; 129 if (!skip_leb128 (iter, end)) 130 return false; 131 132 p = *iter; 133 *value = ((*--p & 0x7f) ^ 0x40) - 0x40; 134 while (p > start) 135 *value = (*value << 7) | (*--p & 0x7f); 136 137 return true; 138 } 139 140 /* Return 0 if either encoding is variable width, or not yet known to bfd. */ 141 142 static 143 int get_DW_EH_PE_width (int encoding, int ptr_size) 144 { 145 /* DW_EH_PE_ values of 0x60 and 0x70 weren't defined at the time .eh_frame 146 was added to bfd. */ 147 if ((encoding & 0x60) == 0x60) 148 return 0; 149 150 switch (encoding & 7) 151 { 152 case DW_EH_PE_udata2: return 2; 153 case DW_EH_PE_udata4: return 4; 154 case DW_EH_PE_udata8: return 8; 155 case DW_EH_PE_absptr: return ptr_size; 156 default: 157 break; 158 } 159 160 return 0; 161 } 162 163 #define get_DW_EH_PE_signed(encoding) (((encoding) & DW_EH_PE_signed) != 0) 164 165 /* Read a width sized value from memory. */ 166 167 static bfd_vma 168 read_value (bfd *abfd, bfd_byte *buf, int width, int is_signed) 169 { 170 bfd_vma value; 171 172 switch (width) 173 { 174 case 2: 175 if (is_signed) 176 value = bfd_get_signed_16 (abfd, buf); 177 else 178 value = bfd_get_16 (abfd, buf); 179 break; 180 case 4: 181 if (is_signed) 182 value = bfd_get_signed_32 (abfd, buf); 183 else 184 value = bfd_get_32 (abfd, buf); 185 break; 186 case 8: 187 if (is_signed) 188 value = bfd_get_signed_64 (abfd, buf); 189 else 190 value = bfd_get_64 (abfd, buf); 191 break; 192 default: 193 BFD_FAIL (); 194 return 0; 195 } 196 197 return value; 198 } 199 200 /* Store a width sized value to memory. */ 201 202 static void 203 write_value (bfd *abfd, bfd_byte *buf, bfd_vma value, int width) 204 { 205 switch (width) 206 { 207 case 2: bfd_put_16 (abfd, value, buf); break; 208 case 4: bfd_put_32 (abfd, value, buf); break; 209 case 8: bfd_put_64 (abfd, value, buf); break; 210 default: BFD_FAIL (); 211 } 212 } 213 214 /* Return one if C1 and C2 CIEs can be merged. */ 215 216 static int 217 cie_eq (const void *e1, const void *e2) 218 { 219 const struct cie *c1 = (const struct cie *) e1; 220 const struct cie *c2 = (const struct cie *) e2; 221 222 if (c1->hash == c2->hash 223 && c1->length == c2->length 224 && c1->version == c2->version 225 && c1->local_personality == c2->local_personality 226 && strcmp (c1->augmentation, c2->augmentation) == 0 227 && strcmp (c1->augmentation, "eh") != 0 228 && c1->code_align == c2->code_align 229 && c1->data_align == c2->data_align 230 && c1->ra_column == c2->ra_column 231 && c1->augmentation_size == c2->augmentation_size 232 && memcmp (&c1->personality, &c2->personality, 233 sizeof (c1->personality)) == 0 234 && (c1->cie_inf->u.cie.u.sec->output_section 235 == c2->cie_inf->u.cie.u.sec->output_section) 236 && c1->per_encoding == c2->per_encoding 237 && c1->lsda_encoding == c2->lsda_encoding 238 && c1->fde_encoding == c2->fde_encoding 239 && c1->initial_insn_length == c2->initial_insn_length 240 && c1->initial_insn_length <= sizeof (c1->initial_instructions) 241 && memcmp (c1->initial_instructions, 242 c2->initial_instructions, 243 c1->initial_insn_length) == 0) 244 return 1; 245 246 return 0; 247 } 248 249 static hashval_t 250 cie_hash (const void *e) 251 { 252 const struct cie *c = (const struct cie *) e; 253 return c->hash; 254 } 255 256 static hashval_t 257 cie_compute_hash (struct cie *c) 258 { 259 hashval_t h = 0; 260 size_t len; 261 h = iterative_hash_object (c->length, h); 262 h = iterative_hash_object (c->version, h); 263 h = iterative_hash (c->augmentation, strlen (c->augmentation) + 1, h); 264 h = iterative_hash_object (c->code_align, h); 265 h = iterative_hash_object (c->data_align, h); 266 h = iterative_hash_object (c->ra_column, h); 267 h = iterative_hash_object (c->augmentation_size, h); 268 h = iterative_hash_object (c->personality, h); 269 h = iterative_hash_object (c->cie_inf->u.cie.u.sec->output_section, h); 270 h = iterative_hash_object (c->per_encoding, h); 271 h = iterative_hash_object (c->lsda_encoding, h); 272 h = iterative_hash_object (c->fde_encoding, h); 273 h = iterative_hash_object (c->initial_insn_length, h); 274 len = c->initial_insn_length; 275 if (len > sizeof (c->initial_instructions)) 276 len = sizeof (c->initial_instructions); 277 h = iterative_hash (c->initial_instructions, len, h); 278 c->hash = h; 279 return h; 280 } 281 282 /* Return the number of extra bytes that we'll be inserting into 283 ENTRY's augmentation string. */ 284 285 static inline unsigned int 286 extra_augmentation_string_bytes (struct eh_cie_fde *entry) 287 { 288 unsigned int size = 0; 289 if (entry->cie) 290 { 291 if (entry->add_augmentation_size) 292 size++; 293 if (entry->u.cie.add_fde_encoding) 294 size++; 295 } 296 return size; 297 } 298 299 /* Likewise ENTRY's augmentation data. */ 300 301 static inline unsigned int 302 extra_augmentation_data_bytes (struct eh_cie_fde *entry) 303 { 304 unsigned int size = 0; 305 if (entry->add_augmentation_size) 306 size++; 307 if (entry->cie && entry->u.cie.add_fde_encoding) 308 size++; 309 return size; 310 } 311 312 /* Return the size that ENTRY will have in the output. */ 313 314 static unsigned int 315 size_of_output_cie_fde (struct eh_cie_fde *entry) 316 { 317 if (entry->removed) 318 return 0; 319 if (entry->size == 4) 320 return 4; 321 return (entry->size 322 + extra_augmentation_string_bytes (entry) 323 + extra_augmentation_data_bytes (entry)); 324 } 325 326 /* Return the offset of the FDE or CIE after ENT. */ 327 328 static unsigned int 329 next_cie_fde_offset (const struct eh_cie_fde *ent, 330 const struct eh_cie_fde *last, 331 const asection *sec) 332 { 333 while (++ent < last) 334 { 335 if (!ent->removed) 336 return ent->new_offset; 337 } 338 return sec->size; 339 } 340 341 /* Assume that the bytes between *ITER and END are CFA instructions. 342 Try to move *ITER past the first instruction and return true on 343 success. ENCODED_PTR_WIDTH gives the width of pointer entries. */ 344 345 static bool 346 skip_cfa_op (bfd_byte **iter, bfd_byte *end, unsigned int encoded_ptr_width) 347 { 348 bfd_byte op = 0; 349 bfd_vma length; 350 351 if (!read_byte (iter, end, &op)) 352 return false; 353 354 switch (op & 0xc0 ? op & 0xc0 : op) 355 { 356 case DW_CFA_nop: 357 case DW_CFA_advance_loc: 358 case DW_CFA_restore: 359 case DW_CFA_remember_state: 360 case DW_CFA_restore_state: 361 case DW_CFA_GNU_window_save: 362 case DW_CFA_AARCH64_negate_ra_state_with_pc: 363 /* No arguments. */ 364 return true; 365 366 case DW_CFA_offset: 367 case DW_CFA_restore_extended: 368 case DW_CFA_undefined: 369 case DW_CFA_same_value: 370 case DW_CFA_def_cfa_register: 371 case DW_CFA_def_cfa_offset: 372 case DW_CFA_def_cfa_offset_sf: 373 case DW_CFA_GNU_args_size: 374 /* One leb128 argument. */ 375 return skip_leb128 (iter, end); 376 377 case DW_CFA_val_offset: 378 case DW_CFA_val_offset_sf: 379 case DW_CFA_offset_extended: 380 case DW_CFA_register: 381 case DW_CFA_def_cfa: 382 case DW_CFA_offset_extended_sf: 383 case DW_CFA_GNU_negative_offset_extended: 384 case DW_CFA_def_cfa_sf: 385 /* Two leb128 arguments. */ 386 return (skip_leb128 (iter, end) 387 && skip_leb128 (iter, end)); 388 389 case DW_CFA_def_cfa_expression: 390 /* A variable-length argument. */ 391 return (read_uleb128 (iter, end, &length) 392 && skip_bytes (iter, end, length)); 393 394 case DW_CFA_expression: 395 case DW_CFA_val_expression: 396 /* A leb128 followed by a variable-length argument. */ 397 return (skip_leb128 (iter, end) 398 && read_uleb128 (iter, end, &length) 399 && skip_bytes (iter, end, length)); 400 401 case DW_CFA_set_loc: 402 return skip_bytes (iter, end, encoded_ptr_width); 403 404 case DW_CFA_advance_loc1: 405 return skip_bytes (iter, end, 1); 406 407 case DW_CFA_advance_loc2: 408 return skip_bytes (iter, end, 2); 409 410 case DW_CFA_advance_loc4: 411 return skip_bytes (iter, end, 4); 412 413 case DW_CFA_MIPS_advance_loc8: 414 return skip_bytes (iter, end, 8); 415 416 default: 417 return false; 418 } 419 } 420 421 /* Try to interpret the bytes between BUF and END as CFA instructions. 422 If every byte makes sense, return a pointer to the first DW_CFA_nop 423 padding byte, or END if there is no padding. Return null otherwise. 424 ENCODED_PTR_WIDTH is as for skip_cfa_op. */ 425 426 static bfd_byte * 427 skip_non_nops (bfd_byte *buf, bfd_byte *end, unsigned int encoded_ptr_width, 428 unsigned int *set_loc_count) 429 { 430 bfd_byte *last; 431 432 last = buf; 433 while (buf < end) 434 if (*buf == DW_CFA_nop) 435 buf++; 436 else 437 { 438 if (*buf == DW_CFA_set_loc) 439 ++*set_loc_count; 440 if (!skip_cfa_op (&buf, end, encoded_ptr_width)) 441 return 0; 442 last = buf; 443 } 444 return last; 445 } 446 447 /* Convert absolute encoding ENCODING into PC-relative form. 448 SIZE is the size of a pointer. */ 449 450 static unsigned char 451 make_pc_relative (unsigned char encoding, unsigned int ptr_size) 452 { 453 if ((encoding & 0x7f) == DW_EH_PE_absptr) 454 switch (ptr_size) 455 { 456 case 2: 457 encoding |= DW_EH_PE_sdata2; 458 break; 459 case 4: 460 encoding |= DW_EH_PE_sdata4; 461 break; 462 case 8: 463 encoding |= DW_EH_PE_sdata8; 464 break; 465 } 466 return encoding | DW_EH_PE_pcrel; 467 } 468 469 /* Examine each .eh_frame_entry section and discard those 470 those that are marked SEC_EXCLUDE. */ 471 472 static void 473 bfd_elf_discard_eh_frame_entry (struct eh_frame_hdr_info *hdr_info) 474 { 475 unsigned int i; 476 for (i = 0; i < hdr_info->array_count; i++) 477 { 478 if (hdr_info->u.compact.entries[i]->flags & SEC_EXCLUDE) 479 { 480 unsigned int j; 481 for (j = i + 1; j < hdr_info->array_count; j++) 482 hdr_info->u.compact.entries[j-1] = hdr_info->u.compact.entries[j]; 483 484 hdr_info->array_count--; 485 hdr_info->u.compact.entries[hdr_info->array_count] = NULL; 486 i--; 487 } 488 } 489 } 490 491 /* Add a .eh_frame_entry section. */ 492 493 static void 494 bfd_elf_record_eh_frame_entry (struct eh_frame_hdr_info *hdr_info, 495 asection *sec) 496 { 497 if (hdr_info->array_count == hdr_info->u.compact.allocated_entries) 498 { 499 if (hdr_info->u.compact.allocated_entries == 0) 500 { 501 hdr_info->frame_hdr_is_compact = true; 502 hdr_info->u.compact.allocated_entries = 2; 503 hdr_info->u.compact.entries = 504 bfd_malloc (hdr_info->u.compact.allocated_entries 505 * sizeof (hdr_info->u.compact.entries[0])); 506 } 507 else 508 { 509 hdr_info->u.compact.allocated_entries *= 2; 510 hdr_info->u.compact.entries = 511 bfd_realloc (hdr_info->u.compact.entries, 512 hdr_info->u.compact.allocated_entries 513 * sizeof (hdr_info->u.compact.entries[0])); 514 } 515 516 BFD_ASSERT (hdr_info->u.compact.entries); 517 } 518 519 hdr_info->u.compact.entries[hdr_info->array_count++] = sec; 520 } 521 522 /* Parse a .eh_frame_entry section. Figure out which text section it 523 references. */ 524 525 bool 526 _bfd_elf_parse_eh_frame_entry (struct bfd_link_info *info, 527 asection *sec, struct elf_reloc_cookie *cookie) 528 { 529 struct elf_link_hash_table *htab; 530 struct eh_frame_hdr_info *hdr_info; 531 unsigned long r_symndx; 532 asection *text_sec; 533 534 htab = elf_hash_table (info); 535 hdr_info = &htab->eh_info; 536 537 if (sec->size == 0 538 || sec->sec_info_type != SEC_INFO_TYPE_NONE) 539 { 540 return true; 541 } 542 543 if (sec->output_section && bfd_is_abs_section (sec->output_section)) 544 { 545 /* At least one of the sections is being discarded from the 546 link, so we should just ignore them. */ 547 return true; 548 } 549 550 if (cookie->rel == cookie->relend) 551 return false; 552 553 /* The first relocation is the function start. */ 554 r_symndx = cookie->rel->r_info >> cookie->r_sym_shift; 555 if (r_symndx == STN_UNDEF) 556 return false; 557 558 text_sec = _bfd_elf_section_for_symbol (cookie, r_symndx); 559 560 if (text_sec == NULL) 561 return false; 562 563 elf_section_eh_frame_entry (text_sec) = sec; 564 if (text_sec->output_section 565 && bfd_is_abs_section (text_sec->output_section)) 566 sec->flags |= SEC_EXCLUDE; 567 568 sec->sec_info_type = SEC_INFO_TYPE_EH_FRAME_ENTRY; 569 sec->sec_info = text_sec; 570 bfd_elf_record_eh_frame_entry (hdr_info, sec); 571 return true; 572 } 573 574 /* Try to parse .eh_frame section SEC, which belongs to ABFD. Store the 575 information in the section's sec_info field on success. COOKIE 576 describes the relocations in SEC. */ 577 578 void 579 _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info, 580 asection *sec, struct elf_reloc_cookie *cookie) 581 { 582 #define REQUIRE(COND) \ 583 do \ 584 if (!(COND)) \ 585 goto free_no_table; \ 586 while (0) 587 588 bfd_byte *ehbuf = NULL, *buf, *end; 589 bfd_byte *last_fde; 590 struct eh_cie_fde *this_inf; 591 unsigned int hdr_length, hdr_id; 592 unsigned int cie_count; 593 struct cie *cie, *local_cies = NULL; 594 struct elf_link_hash_table *htab; 595 struct eh_frame_hdr_info *hdr_info; 596 struct eh_frame_sec_info *sec_info = NULL; 597 unsigned int ptr_size; 598 unsigned int num_cies; 599 unsigned int num_entries; 600 elf_gc_mark_hook_fn gc_mark_hook; 601 602 htab = elf_hash_table (info); 603 hdr_info = &htab->eh_info; 604 605 if (sec->size == 0 606 || (sec->flags & SEC_HAS_CONTENTS) == 0 607 || sec->sec_info_type != SEC_INFO_TYPE_NONE) 608 { 609 /* This file does not contain .eh_frame information or 610 .eh_frame has already been parsed, as can happen with 611 --gc-sections. */ 612 return; 613 } 614 615 if (bfd_is_abs_section (sec->output_section)) 616 { 617 /* At least one of the sections is being discarded from the 618 link, so we should just ignore them. */ 619 return; 620 } 621 622 /* Read the frame unwind information from abfd. */ 623 624 REQUIRE (_bfd_elf_mmap_section_contents (abfd, sec, &ehbuf)); 625 626 /* If .eh_frame section size doesn't fit into int, we cannot handle 627 it (it would need to use 64-bit .eh_frame format anyway). */ 628 REQUIRE (sec->size == (unsigned int) sec->size); 629 630 ptr_size = (get_elf_backend_data (abfd) 631 ->elf_backend_eh_frame_address_size (abfd, sec)); 632 REQUIRE (ptr_size != 0); 633 634 /* Go through the section contents and work out how many FDEs and 635 CIEs there are. */ 636 buf = ehbuf; 637 end = ehbuf + sec->size; 638 num_cies = 0; 639 num_entries = 0; 640 while (buf != end) 641 { 642 num_entries++; 643 644 /* Read the length of the entry. */ 645 REQUIRE (skip_bytes (&buf, end, 4)); 646 hdr_length = bfd_get_32 (abfd, buf - 4); 647 648 /* 64-bit .eh_frame is not supported. */ 649 REQUIRE (hdr_length != 0xffffffff); 650 if (hdr_length == 0) 651 break; 652 653 REQUIRE (skip_bytes (&buf, end, 4)); 654 hdr_id = bfd_get_32 (abfd, buf - 4); 655 if (hdr_id == 0) 656 num_cies++; 657 658 REQUIRE (skip_bytes (&buf, end, hdr_length - 4)); 659 } 660 661 sec_info = bfd_zalloc (abfd, 662 (sizeof (struct eh_frame_sec_info) 663 + (num_entries - 1) * sizeof (struct eh_cie_fde))); 664 REQUIRE (sec_info); 665 666 /* We need to have a "struct cie" for each CIE in this section. */ 667 if (num_cies) 668 { 669 local_cies = (struct cie *) bfd_zmalloc (num_cies * sizeof (*local_cies)); 670 REQUIRE (local_cies); 671 } 672 673 /* FIXME: octets_per_byte. */ 674 #define ENSURE_NO_RELOCS(buf) \ 675 while (cookie->rel < cookie->relend \ 676 && (cookie->rel->r_offset \ 677 < (bfd_size_type) ((buf) - ehbuf))) \ 678 { \ 679 REQUIRE (cookie->rel->r_info == 0); \ 680 cookie->rel++; \ 681 } 682 683 /* FIXME: octets_per_byte. */ 684 #define SKIP_RELOCS(buf) \ 685 while (cookie->rel < cookie->relend \ 686 && (cookie->rel->r_offset \ 687 < (bfd_size_type) ((buf) - ehbuf))) \ 688 cookie->rel++ 689 690 /* FIXME: octets_per_byte. */ 691 #define GET_RELOC(buf) \ 692 ((cookie->rel < cookie->relend \ 693 && (cookie->rel->r_offset \ 694 == (bfd_size_type) ((buf) - ehbuf))) \ 695 ? cookie->rel : NULL) 696 697 buf = ehbuf; 698 cie_count = 0; 699 gc_mark_hook = get_elf_backend_data (abfd)->gc_mark_hook; 700 while ((bfd_size_type) (buf - ehbuf) != sec->size) 701 { 702 char *aug; 703 bfd_byte *start, *insns, *insns_end; 704 bfd_size_type length; 705 unsigned int set_loc_count; 706 707 this_inf = sec_info->entry + sec_info->count; 708 last_fde = buf; 709 710 /* Read the length of the entry. */ 711 REQUIRE (skip_bytes (&buf, ehbuf + sec->size, 4)); 712 hdr_length = bfd_get_32 (abfd, buf - 4); 713 714 /* The CIE/FDE must be fully contained in this input section. */ 715 REQUIRE ((bfd_size_type) (buf - ehbuf) + hdr_length <= sec->size); 716 end = buf + hdr_length; 717 718 this_inf->offset = last_fde - ehbuf; 719 this_inf->size = 4 + hdr_length; 720 this_inf->reloc_index = cookie->rel - cookie->rels; 721 722 if (hdr_length == 0) 723 { 724 /* A zero-length CIE should only be found at the end of 725 the section, but allow multiple terminators. */ 726 while (skip_bytes (&buf, ehbuf + sec->size, 4)) 727 REQUIRE (bfd_get_32 (abfd, buf - 4) == 0); 728 REQUIRE ((bfd_size_type) (buf - ehbuf) == sec->size); 729 ENSURE_NO_RELOCS (buf); 730 sec_info->count++; 731 break; 732 } 733 734 REQUIRE (skip_bytes (&buf, end, 4)); 735 hdr_id = bfd_get_32 (abfd, buf - 4); 736 737 if (hdr_id == 0) 738 { 739 unsigned int initial_insn_length; 740 char *null_byte; 741 742 /* CIE */ 743 this_inf->cie = 1; 744 745 /* Point CIE to one of the section-local cie structures. */ 746 cie = local_cies + cie_count++; 747 748 cie->cie_inf = this_inf; 749 cie->length = hdr_length; 750 start = buf; 751 REQUIRE (read_byte (&buf, end, &cie->version)); 752 753 /* Cannot handle unknown versions. */ 754 REQUIRE (cie->version == 1 755 || cie->version == 3 756 || cie->version == 4); 757 null_byte = memchr ((char *) buf, 0, end - buf); 758 REQUIRE (null_byte != NULL); 759 REQUIRE ((size_t) (null_byte - (char *) buf) 760 < sizeof (cie->augmentation)); 761 762 strcpy (cie->augmentation, (char *) buf); 763 buf = (bfd_byte *) null_byte + 1; 764 REQUIRE (buf + 1 < end); 765 this_inf->u.cie.aug_str_len = buf - start - 1; 766 ENSURE_NO_RELOCS (buf); 767 if (buf[0] == 'e' && buf[1] == 'h') 768 { 769 /* GCC < 3.0 .eh_frame CIE */ 770 /* We cannot merge "eh" CIEs because __EXCEPTION_TABLE__ 771 is private to each CIE, so we don't need it for anything. 772 Just skip it. */ 773 REQUIRE (skip_bytes (&buf, end, ptr_size)); 774 SKIP_RELOCS (buf); 775 } 776 if (cie->version >= 4) 777 { 778 REQUIRE (buf + 1 < end); 779 REQUIRE (buf[0] == ptr_size); 780 REQUIRE (buf[1] == 0); 781 buf += 2; 782 } 783 REQUIRE (read_uleb128 (&buf, end, &cie->code_align)); 784 REQUIRE (read_sleb128 (&buf, end, &cie->data_align)); 785 if (cie->version == 1) 786 { 787 REQUIRE (buf < end); 788 cie->ra_column = *buf++; 789 } 790 else 791 REQUIRE (read_uleb128 (&buf, end, &cie->ra_column)); 792 ENSURE_NO_RELOCS (buf); 793 cie->lsda_encoding = DW_EH_PE_omit; 794 cie->fde_encoding = DW_EH_PE_omit; 795 cie->per_encoding = DW_EH_PE_omit; 796 aug = cie->augmentation; 797 if (aug[0] != 'e' || aug[1] != 'h') 798 { 799 if (*aug == 'z') 800 { 801 aug++; 802 REQUIRE (read_uleb128 (&buf, end, &cie->augmentation_size)); 803 ENSURE_NO_RELOCS (buf); 804 } 805 806 while (*aug != '\0') 807 switch (*aug++) 808 { 809 case 'B': 810 case 'G': 811 if (abfd->arch_info->arch != bfd_arch_aarch64) 812 goto unrecognized; 813 break; 814 case 'L': 815 REQUIRE (read_byte (&buf, end, &cie->lsda_encoding)); 816 ENSURE_NO_RELOCS (buf); 817 REQUIRE (get_DW_EH_PE_width (cie->lsda_encoding, ptr_size)); 818 break; 819 case 'R': 820 REQUIRE (read_byte (&buf, end, &cie->fde_encoding)); 821 ENSURE_NO_RELOCS (buf); 822 REQUIRE (get_DW_EH_PE_width (cie->fde_encoding, ptr_size)); 823 break; 824 case 'S': 825 break; 826 case 'P': 827 { 828 int per_width; 829 830 REQUIRE (read_byte (&buf, end, &cie->per_encoding)); 831 per_width = get_DW_EH_PE_width (cie->per_encoding, 832 ptr_size); 833 REQUIRE (per_width); 834 if ((cie->per_encoding & 0x70) == DW_EH_PE_aligned) 835 { 836 length = -(buf - ehbuf) & (per_width - 1); 837 REQUIRE (skip_bytes (&buf, end, length)); 838 if (per_width == 8) 839 this_inf->u.cie.per_encoding_aligned8 = 1; 840 } 841 this_inf->u.cie.personality_offset = buf - start; 842 ENSURE_NO_RELOCS (buf); 843 /* Ensure we have a reloc here. */ 844 REQUIRE (GET_RELOC (buf)); 845 cie->personality.reloc_index 846 = cookie->rel - cookie->rels; 847 /* Cope with MIPS-style composite relocations. */ 848 do 849 cookie->rel++; 850 while (GET_RELOC (buf) != NULL); 851 REQUIRE (skip_bytes (&buf, end, per_width)); 852 } 853 break; 854 unrecognized: 855 default: 856 /* Unrecognized augmentation. Better bail out. */ 857 goto free_no_table; 858 } 859 } 860 this_inf->u.cie.aug_data_len 861 = buf - start - 1 - this_inf->u.cie.aug_str_len; 862 863 /* For shared libraries, try to get rid of as many RELATIVE relocs 864 as possible. */ 865 if (bfd_link_pic (info) 866 && (get_elf_backend_data (abfd) 867 ->elf_backend_can_make_relative_eh_frame 868 (abfd, info, sec))) 869 { 870 if ((cie->fde_encoding & 0x70) == DW_EH_PE_absptr) 871 this_inf->make_relative = 1; 872 /* If the CIE doesn't already have an 'R' entry, it's fairly 873 easy to add one, provided that there's no aligned data 874 after the augmentation string. */ 875 else if (cie->fde_encoding == DW_EH_PE_omit 876 && (cie->per_encoding & 0x70) != DW_EH_PE_aligned) 877 { 878 if (*cie->augmentation == 0) 879 this_inf->add_augmentation_size = 1; 880 this_inf->u.cie.add_fde_encoding = 1; 881 this_inf->make_relative = 1; 882 } 883 884 if ((cie->lsda_encoding & 0x70) == DW_EH_PE_absptr) 885 cie->can_make_lsda_relative = 1; 886 } 887 888 /* If FDE encoding was not specified, it defaults to 889 DW_EH_absptr. */ 890 if (cie->fde_encoding == DW_EH_PE_omit) 891 cie->fde_encoding = DW_EH_PE_absptr; 892 893 initial_insn_length = end - buf; 894 cie->initial_insn_length = initial_insn_length; 895 memcpy (cie->initial_instructions, buf, 896 initial_insn_length <= sizeof (cie->initial_instructions) 897 ? initial_insn_length : sizeof (cie->initial_instructions)); 898 insns = buf; 899 buf += initial_insn_length; 900 ENSURE_NO_RELOCS (buf); 901 902 if (!bfd_link_relocatable (info)) 903 { 904 /* Keep info for merging cies. */ 905 this_inf->u.cie.u.full_cie = cie; 906 this_inf->u.cie.per_encoding_relative 907 = (cie->per_encoding & 0x70) == DW_EH_PE_pcrel; 908 } 909 } 910 else 911 { 912 /* Find the corresponding CIE. */ 913 unsigned int cie_offset = this_inf->offset + 4 - hdr_id; 914 for (cie = local_cies; cie < local_cies + cie_count; cie++) 915 if (cie_offset == cie->cie_inf->offset) 916 break; 917 918 /* Ensure this FDE references one of the CIEs in this input 919 section. */ 920 REQUIRE (cie != local_cies + cie_count); 921 this_inf->u.fde.cie_inf = cie->cie_inf; 922 this_inf->make_relative = cie->cie_inf->make_relative; 923 this_inf->add_augmentation_size 924 = cie->cie_inf->add_augmentation_size; 925 926 ENSURE_NO_RELOCS (buf); 927 if ((sec->flags & SEC_LINKER_CREATED) == 0 || cookie->rels != NULL) 928 { 929 asection *rsec; 930 931 REQUIRE (GET_RELOC (buf)); 932 933 /* Chain together the FDEs for each section. */ 934 rsec = _bfd_elf_gc_mark_rsec (info, sec, gc_mark_hook, 935 cookie, NULL); 936 /* RSEC will be NULL if FDE was cleared out as it was belonging to 937 a discarded SHT_GROUP. */ 938 if (rsec) 939 { 940 REQUIRE (rsec->owner == abfd); 941 this_inf->u.fde.next_for_section = elf_fde_list (rsec); 942 elf_fde_list (rsec) = this_inf; 943 } 944 } 945 946 /* Skip the initial location and address range. */ 947 start = buf; 948 length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size); 949 REQUIRE (skip_bytes (&buf, end, 2 * length)); 950 951 SKIP_RELOCS (buf - length); 952 if (!GET_RELOC (buf - length) 953 && read_value (abfd, buf - length, length, false) == 0) 954 { 955 (*info->callbacks->minfo) 956 /* xgettext:c-format */ 957 (_("discarding zero address range FDE in %pB(%pA).\n"), 958 abfd, sec); 959 this_inf->u.fde.cie_inf = NULL; 960 } 961 962 /* Skip the augmentation size, if present. */ 963 if (cie->augmentation[0] == 'z') 964 REQUIRE (read_uleb128 (&buf, end, &length)); 965 else 966 length = 0; 967 968 /* Of the supported augmentation characters above, only 'L' 969 adds augmentation data to the FDE. This code would need to 970 be adjusted if any future augmentations do the same thing. */ 971 if (cie->lsda_encoding != DW_EH_PE_omit) 972 { 973 SKIP_RELOCS (buf); 974 if (cie->can_make_lsda_relative && GET_RELOC (buf)) 975 cie->cie_inf->u.cie.make_lsda_relative = 1; 976 this_inf->lsda_offset = buf - start; 977 /* If there's no 'z' augmentation, we don't know where the 978 CFA insns begin. Assume no padding. */ 979 if (cie->augmentation[0] != 'z') 980 length = end - buf; 981 } 982 983 /* Skip over the augmentation data. */ 984 REQUIRE (skip_bytes (&buf, end, length)); 985 insns = buf; 986 987 buf = last_fde + 4 + hdr_length; 988 989 /* For NULL RSEC (cleared FDE belonging to a discarded section) 990 the relocations are commonly cleared. We do not sanity check if 991 all these relocations are cleared as (1) relocations to 992 .gcc_except_table will remain uncleared (they will get dropped 993 with the drop of this unused FDE) and (2) BFD already safely drops 994 relocations of any type to .eh_frame by 995 elf_section_ignore_discarded_relocs. 996 TODO: The .gcc_except_table entries should be also filtered as 997 .eh_frame entries; or GCC could rather use COMDAT for them. */ 998 SKIP_RELOCS (buf); 999 } 1000 1001 /* Try to interpret the CFA instructions and find the first 1002 padding nop. Shrink this_inf's size so that it doesn't 1003 include the padding. */ 1004 length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size); 1005 set_loc_count = 0; 1006 insns_end = skip_non_nops (insns, end, length, &set_loc_count); 1007 /* If we don't understand the CFA instructions, we can't know 1008 what needs to be adjusted there. */ 1009 if (insns_end == NULL 1010 /* For the time being we don't support DW_CFA_set_loc in 1011 CIE instructions. */ 1012 || (set_loc_count && this_inf->cie)) 1013 goto free_no_table; 1014 this_inf->size -= end - insns_end; 1015 if (insns_end != end && this_inf->cie) 1016 { 1017 cie->initial_insn_length -= end - insns_end; 1018 cie->length -= end - insns_end; 1019 } 1020 if (set_loc_count 1021 && ((cie->fde_encoding & 0x70) == DW_EH_PE_pcrel 1022 || this_inf->make_relative)) 1023 { 1024 unsigned int cnt; 1025 bfd_byte *p; 1026 1027 this_inf->set_loc 1028 = bfd_alloc (abfd, (set_loc_count + 1) * sizeof (unsigned int)); 1029 REQUIRE (this_inf->set_loc); 1030 this_inf->set_loc[0] = set_loc_count; 1031 p = insns; 1032 cnt = 0; 1033 while (p < end) 1034 { 1035 if (*p == DW_CFA_set_loc) 1036 this_inf->set_loc[++cnt] = p + 1 - start; 1037 REQUIRE (skip_cfa_op (&p, end, length)); 1038 } 1039 } 1040 1041 this_inf->removed = 1; 1042 this_inf->fde_encoding = cie->fde_encoding; 1043 this_inf->lsda_encoding = cie->lsda_encoding; 1044 sec_info->count++; 1045 } 1046 BFD_ASSERT (sec_info->count == num_entries); 1047 BFD_ASSERT (cie_count == num_cies); 1048 1049 sec->sec_info = sec_info; 1050 sec->sec_info_type = SEC_INFO_TYPE_EH_FRAME; 1051 if (!bfd_link_relocatable (info)) 1052 { 1053 /* Keep info for merging cies. */ 1054 sec_info->cies = local_cies; 1055 local_cies = NULL; 1056 } 1057 goto success; 1058 1059 free_no_table: 1060 _bfd_error_handler 1061 /* xgettext:c-format */ 1062 (_("error in %pB(%pA); no .eh_frame_hdr table will be created"), 1063 abfd, sec); 1064 hdr_info->u.dwarf.table = false; 1065 success: 1066 _bfd_elf_munmap_section_contents (sec, ehbuf); 1067 free (local_cies); 1068 #undef REQUIRE 1069 } 1070 1071 /* Order eh_frame_hdr entries by the VMA of their text section. */ 1072 1073 static int 1074 cmp_eh_frame_hdr (const void *a, const void *b) 1075 { 1076 bfd_vma text_a; 1077 bfd_vma text_b; 1078 asection *sec; 1079 1080 sec = *(asection *const *)a; 1081 sec = sec->sec_info; 1082 text_a = sec->output_section->vma + sec->output_offset; 1083 sec = *(asection *const *)b; 1084 sec = sec->sec_info; 1085 text_b = sec->output_section->vma + sec->output_offset; 1086 1087 if (text_a < text_b) 1088 return -1; 1089 return text_a > text_b; 1090 1091 } 1092 1093 /* Add space for a CANTUNWIND terminator to SEC if the text sections 1094 referenced by it and NEXT are not contiguous, or NEXT is NULL. */ 1095 1096 static void 1097 add_eh_frame_hdr_terminator (asection *sec, 1098 asection *next) 1099 { 1100 bfd_vma end; 1101 bfd_vma next_start; 1102 asection *text_sec; 1103 1104 if (next) 1105 { 1106 /* See if there is a gap (presumably a text section without unwind info) 1107 between these two entries. */ 1108 text_sec = sec->sec_info; 1109 end = text_sec->output_section->vma + text_sec->output_offset 1110 + text_sec->size; 1111 text_sec = next->sec_info; 1112 next_start = text_sec->output_section->vma + text_sec->output_offset; 1113 if (end == next_start) 1114 return; 1115 } 1116 1117 /* Add space for a CANTUNWIND terminator. */ 1118 if (!sec->rawsize) 1119 sec->rawsize = sec->size; 1120 1121 bfd_set_section_size (sec, sec->size + 8); 1122 } 1123 1124 /* Finish a pass over all .eh_frame_entry sections. */ 1125 1126 bool 1127 _bfd_elf_end_eh_frame_parsing (struct bfd_link_info *info) 1128 { 1129 struct eh_frame_hdr_info *hdr_info; 1130 unsigned int i; 1131 1132 hdr_info = &elf_hash_table (info)->eh_info; 1133 1134 if (info->eh_frame_hdr_type != COMPACT_EH_HDR 1135 || hdr_info->array_count == 0) 1136 return false; 1137 1138 bfd_elf_discard_eh_frame_entry (hdr_info); 1139 1140 qsort (hdr_info->u.compact.entries, hdr_info->array_count, 1141 sizeof (asection *), cmp_eh_frame_hdr); 1142 1143 for (i = 0; i < hdr_info->array_count - 1; i++) 1144 { 1145 add_eh_frame_hdr_terminator (hdr_info->u.compact.entries[i], 1146 hdr_info->u.compact.entries[i + 1]); 1147 } 1148 1149 /* Add a CANTUNWIND terminator after the last entry. */ 1150 add_eh_frame_hdr_terminator (hdr_info->u.compact.entries[i], NULL); 1151 return true; 1152 } 1153 1154 /* Mark all relocations against CIE or FDE ENT, which occurs in 1155 .eh_frame section SEC. COOKIE describes the relocations in SEC; 1156 its "rel" field can be changed freely. */ 1157 1158 static bool 1159 mark_entry (struct bfd_link_info *info, asection *sec, 1160 struct eh_cie_fde *ent, elf_gc_mark_hook_fn gc_mark_hook, 1161 struct elf_reloc_cookie *cookie) 1162 { 1163 /* FIXME: octets_per_byte. */ 1164 for (cookie->rel = cookie->rels + ent->reloc_index; 1165 cookie->rel < cookie->relend 1166 && cookie->rel->r_offset < ent->offset + ent->size; 1167 cookie->rel++) 1168 if (!_bfd_elf_gc_mark_reloc (info, sec, gc_mark_hook, cookie)) 1169 return false; 1170 1171 return true; 1172 } 1173 1174 /* Mark all the relocations against FDEs that relate to code in input 1175 section SEC. The FDEs belong to .eh_frame section EH_FRAME, whose 1176 relocations are described by COOKIE. */ 1177 1178 bool 1179 _bfd_elf_gc_mark_fdes (struct bfd_link_info *info, asection *sec, 1180 asection *eh_frame, elf_gc_mark_hook_fn gc_mark_hook, 1181 struct elf_reloc_cookie *cookie) 1182 { 1183 struct eh_cie_fde *fde, *cie; 1184 1185 for (fde = elf_fde_list (sec); fde; fde = fde->u.fde.next_for_section) 1186 { 1187 if (!mark_entry (info, eh_frame, fde, gc_mark_hook, cookie)) 1188 return false; 1189 1190 /* At this stage, all cie_inf fields point to local CIEs, so we 1191 can use the same cookie to refer to them. */ 1192 cie = fde->u.fde.cie_inf; 1193 if (cie != NULL && !cie->u.cie.gc_mark) 1194 { 1195 cie->u.cie.gc_mark = 1; 1196 if (!mark_entry (info, eh_frame, cie, gc_mark_hook, cookie)) 1197 return false; 1198 } 1199 } 1200 return true; 1201 } 1202 1203 /* Input section SEC of ABFD is an .eh_frame section that contains the 1204 CIE described by CIE_INF. Return a version of CIE_INF that is going 1205 to be kept in the output, adding CIE_INF to the output if necessary. 1206 1207 HDR_INFO is the .eh_frame_hdr information and COOKIE describes the 1208 relocations in REL. */ 1209 1210 static struct eh_cie_fde * 1211 find_merged_cie (bfd *abfd, struct bfd_link_info *info, asection *sec, 1212 struct eh_frame_hdr_info *hdr_info, 1213 struct elf_reloc_cookie *cookie, 1214 struct eh_cie_fde *cie_inf) 1215 { 1216 unsigned long r_symndx; 1217 struct cie *cie, *new_cie; 1218 Elf_Internal_Rela *rel; 1219 void **loc; 1220 1221 /* Use CIE_INF if we have already decided to keep it. */ 1222 if (!cie_inf->removed) 1223 return cie_inf; 1224 1225 /* If we have merged CIE_INF with another CIE, use that CIE instead. */ 1226 if (cie_inf->u.cie.merged) 1227 return cie_inf->u.cie.u.merged_with; 1228 1229 cie = cie_inf->u.cie.u.full_cie; 1230 1231 /* Assume we will need to keep CIE_INF. */ 1232 cie_inf->removed = 0; 1233 cie_inf->u.cie.u.sec = sec; 1234 1235 /* If we are not merging CIEs, use CIE_INF. */ 1236 if (cie == NULL) 1237 return cie_inf; 1238 1239 if (cie->per_encoding != DW_EH_PE_omit) 1240 { 1241 struct elf_link_hash_entry *h; 1242 bool per_binds_local; 1243 1244 /* Work out the address of personality routine, or at least 1245 enough info that we could calculate the address had we made a 1246 final section layout. The symbol on the reloc is enough, 1247 either the hash for a global, or (bfd id, index) pair for a 1248 local. The assumption here is that no one uses addends on 1249 the reloc. */ 1250 rel = cookie->rels + cie->personality.reloc_index; 1251 memset (&cie->personality, 0, sizeof (cie->personality)); 1252 #ifdef BFD64 1253 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64) 1254 r_symndx = ELF64_R_SYM (rel->r_info); 1255 else 1256 #endif 1257 r_symndx = ELF32_R_SYM (rel->r_info); 1258 1259 if (r_symndx > cookie->num_sym) 1260 return cie_inf; 1261 h = NULL; 1262 if (r_symndx >= cookie->extsymoff) 1263 h = elf_sym_hashes (cookie->abfd)[r_symndx - cookie->extsymoff]; 1264 1265 if (h != NULL) 1266 { 1267 while (h->root.type == bfd_link_hash_indirect 1268 || h->root.type == bfd_link_hash_warning) 1269 h = (struct elf_link_hash_entry *) h->root.u.i.link; 1270 1271 cie->personality.h = h; 1272 per_binds_local = SYMBOL_REFERENCES_LOCAL (info, h); 1273 } 1274 else 1275 { 1276 asection *sym_sec = _bfd_get_local_sym_section (cookie, r_symndx); 1277 if (sym_sec == NULL) 1278 return cie_inf; 1279 1280 if (sym_sec->kept_section != NULL) 1281 sym_sec = sym_sec->kept_section; 1282 if (sym_sec->output_section == NULL) 1283 return cie_inf; 1284 1285 cie->local_personality = 1; 1286 cie->personality.sym.bfd_id = abfd->id; 1287 cie->personality.sym.index = r_symndx; 1288 per_binds_local = true; 1289 } 1290 1291 if (per_binds_local 1292 && bfd_link_pic (info) 1293 && (cie->per_encoding & 0x70) == DW_EH_PE_absptr 1294 && (get_elf_backend_data (abfd) 1295 ->elf_backend_can_make_relative_eh_frame (abfd, info, sec))) 1296 { 1297 cie_inf->u.cie.make_per_encoding_relative = 1; 1298 cie_inf->u.cie.per_encoding_relative = 1; 1299 } 1300 } 1301 1302 /* See if we can merge this CIE with an earlier one. */ 1303 cie_compute_hash (cie); 1304 if (hdr_info->u.dwarf.cies == NULL) 1305 { 1306 hdr_info->u.dwarf.cies = htab_try_create (1, cie_hash, cie_eq, free); 1307 if (hdr_info->u.dwarf.cies == NULL) 1308 return cie_inf; 1309 } 1310 loc = htab_find_slot_with_hash (hdr_info->u.dwarf.cies, cie, 1311 cie->hash, INSERT); 1312 if (loc == NULL) 1313 return cie_inf; 1314 1315 new_cie = (struct cie *) *loc; 1316 if (new_cie == NULL) 1317 { 1318 /* Keep CIE_INF and record it in the hash table. */ 1319 new_cie = bfd_malloc (sizeof (*new_cie)); 1320 if (new_cie == NULL) 1321 return cie_inf; 1322 1323 memcpy (new_cie, cie, sizeof (struct cie)); 1324 *loc = new_cie; 1325 } 1326 else 1327 { 1328 /* Merge CIE_INF with NEW_CIE->CIE_INF. */ 1329 cie_inf->removed = 1; 1330 cie_inf->u.cie.merged = 1; 1331 cie_inf->u.cie.u.merged_with = new_cie->cie_inf; 1332 if (cie_inf->u.cie.make_lsda_relative) 1333 new_cie->cie_inf->u.cie.make_lsda_relative = 1; 1334 } 1335 return new_cie->cie_inf; 1336 } 1337 1338 /* For a given OFFSET in SEC, return the delta to the new location 1339 after .eh_frame editing. */ 1340 1341 static bfd_signed_vma 1342 offset_adjust (bfd_vma offset, const asection *sec) 1343 { 1344 struct eh_frame_sec_info *sec_info = sec->sec_info; 1345 unsigned int lo, hi, mid; 1346 struct eh_cie_fde *ent = NULL; 1347 bfd_signed_vma delta; 1348 1349 lo = 0; 1350 hi = sec_info->count; 1351 if (hi == 0) 1352 return 0; 1353 1354 while (lo < hi) 1355 { 1356 mid = (lo + hi) / 2; 1357 ent = &sec_info->entry[mid]; 1358 if (offset < ent->offset) 1359 hi = mid; 1360 else if (mid + 1 >= hi) 1361 break; 1362 else if (offset >= ent[1].offset) 1363 lo = mid + 1; 1364 else 1365 break; 1366 } 1367 1368 if (!ent->removed) 1369 delta = (bfd_vma) ent->new_offset - (bfd_vma) ent->offset; 1370 else if (ent->cie && ent->u.cie.merged) 1371 { 1372 struct eh_cie_fde *cie = ent->u.cie.u.merged_with; 1373 delta = ((bfd_vma) cie->new_offset + cie->u.cie.u.sec->output_offset 1374 - (bfd_vma) ent->offset - sec->output_offset); 1375 } 1376 else 1377 { 1378 /* Is putting the symbol on the next entry best for a deleted 1379 CIE/FDE? */ 1380 struct eh_cie_fde *last = sec_info->entry + sec_info->count; 1381 delta = ((bfd_vma) next_cie_fde_offset (ent, last, sec) 1382 - (bfd_vma) ent->offset); 1383 return delta; 1384 } 1385 1386 /* Account for editing within this CIE/FDE. */ 1387 offset -= ent->offset; 1388 if (ent->cie) 1389 { 1390 unsigned int extra 1391 = ent->add_augmentation_size + ent->u.cie.add_fde_encoding; 1392 if (extra == 0 1393 || offset <= 9u + ent->u.cie.aug_str_len) 1394 return delta; 1395 delta += extra; 1396 if (offset <= 9u + ent->u.cie.aug_str_len + ent->u.cie.aug_data_len) 1397 return delta; 1398 delta += extra; 1399 } 1400 else 1401 { 1402 unsigned int ptr_size, width, extra = ent->add_augmentation_size; 1403 if (offset <= 12 || extra == 0) 1404 return delta; 1405 ptr_size = (get_elf_backend_data (sec->owner) 1406 ->elf_backend_eh_frame_address_size (sec->owner, sec)); 1407 width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size); 1408 if (offset <= 8 + 2 * width) 1409 return delta; 1410 delta += extra; 1411 } 1412 1413 return delta; 1414 } 1415 1416 /* Adjust a global symbol defined in .eh_frame, so that it stays 1417 relative to its original CIE/FDE. It is assumed that a symbol 1418 defined at the beginning of a CIE/FDE belongs to that CIE/FDE 1419 rather than marking the end of the previous CIE/FDE. This matters 1420 when a CIE is merged with a previous CIE, since the symbol is 1421 moved to the merged CIE. */ 1422 1423 bool 1424 _bfd_elf_adjust_eh_frame_global_symbol (struct elf_link_hash_entry *h, 1425 void *arg ATTRIBUTE_UNUSED) 1426 { 1427 asection *sym_sec; 1428 bfd_signed_vma delta; 1429 1430 if (h->root.type != bfd_link_hash_defined 1431 && h->root.type != bfd_link_hash_defweak) 1432 return true; 1433 1434 sym_sec = h->root.u.def.section; 1435 if (sym_sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME 1436 || sym_sec->sec_info == NULL) 1437 return true; 1438 1439 delta = offset_adjust (h->root.u.def.value, sym_sec); 1440 h->root.u.def.value += delta; 1441 1442 return true; 1443 } 1444 1445 /* The same for all local symbols defined in .eh_frame. Returns the 1446 local symbols if any symbol was changed. */ 1447 1448 static Elf_Internal_Sym * 1449 adjust_eh_frame_local_symbols (const asection *sec, 1450 struct elf_reloc_cookie *cookie) 1451 { 1452 bfd *abfd = cookie->abfd; 1453 unsigned int *loc_shndx = elf_loc_shndx (abfd); 1454 unsigned int shndx = elf_section_data (sec)->this_idx; 1455 1456 if (loc_shndx != NULL) 1457 { 1458 unsigned int i; 1459 1460 for (i = 1; i < cookie->locsymcount; i++) 1461 if (loc_shndx[i] == shndx) 1462 break; 1463 if (i >= cookie->locsymcount) 1464 return NULL; 1465 } 1466 1467 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd); 1468 Elf_Internal_Sym *locsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, 1469 cookie->locsymcount, 0, 1470 NULL, NULL, NULL); 1471 if (locsyms == NULL) 1472 return NULL; 1473 1474 bool adjusted = false; 1475 Elf_Internal_Sym *sym; 1476 Elf_Internal_Sym *end_sym = locsyms + cookie->locsymcount; 1477 for (sym = locsyms + 1; sym < end_sym; ++sym) 1478 if (sym->st_info <= ELF_ST_INFO (STB_LOCAL, STT_OBJECT) 1479 && sym->st_shndx == shndx) 1480 { 1481 bfd_signed_vma delta = offset_adjust (sym->st_value, sec); 1482 1483 if (delta != 0) 1484 { 1485 adjusted = true; 1486 sym->st_value += delta; 1487 } 1488 } 1489 if (adjusted) 1490 return locsyms; 1491 free (locsyms); 1492 return NULL; 1493 } 1494 1495 /* This function is called for each input file before the .eh_frame 1496 section is relocated. It discards duplicate CIEs and FDEs for 1497 discarded functions. The function returns 0 when no changes are 1498 made, 1 when .eh_frame data has been edited and 2 when the editing 1499 results in a section size change. */ 1500 1501 int 1502 _bfd_elf_discard_section_eh_frame 1503 (bfd *abfd, struct bfd_link_info *info, asection *sec, 1504 bool (*reloc_symbol_deleted_p) (bfd_vma, void *), 1505 struct elf_reloc_cookie *cookie) 1506 { 1507 struct eh_cie_fde *ent; 1508 struct eh_frame_sec_info *sec_info; 1509 struct eh_frame_hdr_info *hdr_info; 1510 unsigned int ptr_size, offset, eh_alignment; 1511 int changed; 1512 1513 if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME) 1514 return false; 1515 1516 sec_info = sec->sec_info; 1517 if (sec_info == NULL) 1518 return false; 1519 1520 ptr_size = (get_elf_backend_data (sec->owner) 1521 ->elf_backend_eh_frame_address_size (sec->owner, sec)); 1522 1523 hdr_info = &elf_hash_table (info)->eh_info; 1524 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent) 1525 if (ent->size == 4) 1526 /* There should only be one zero terminator, on the last input 1527 file supplying .eh_frame (crtend.o). Remove any others. */ 1528 ent->removed = sec->map_head.s != NULL; 1529 else if (!ent->cie && ent->u.fde.cie_inf != NULL) 1530 { 1531 bool keep; 1532 if ((sec->flags & SEC_LINKER_CREATED) != 0 && cookie->rels == NULL) 1533 { 1534 unsigned int width 1535 = get_DW_EH_PE_width (ent->fde_encoding, ptr_size); 1536 bfd_vma value 1537 = read_value (abfd, sec->contents + ent->offset + 8 + width, 1538 width, get_DW_EH_PE_signed (ent->fde_encoding)); 1539 keep = value != 0; 1540 } 1541 else 1542 { 1543 cookie->rel = cookie->rels + ent->reloc_index; 1544 /* FIXME: octets_per_byte. */ 1545 BFD_ASSERT (cookie->rel < cookie->relend 1546 && cookie->rel->r_offset == ent->offset + 8); 1547 keep = !(*reloc_symbol_deleted_p) (ent->offset + 8, cookie); 1548 } 1549 if (keep) 1550 { 1551 if (bfd_link_pic (info) 1552 && (((ent->fde_encoding & 0x70) == DW_EH_PE_absptr 1553 && ent->make_relative == 0) 1554 || (ent->fde_encoding & 0x70) == DW_EH_PE_aligned)) 1555 { 1556 static int num_warnings_issued = 0; 1557 1558 /* If a shared library uses absolute pointers 1559 which we cannot turn into PC relative, 1560 don't create the binary search table, 1561 since it is affected by runtime relocations. */ 1562 hdr_info->u.dwarf.table = false; 1563 /* Only warn if --eh-frame-hdr was specified. */ 1564 if (info->eh_frame_hdr_type != 0) 1565 { 1566 if (num_warnings_issued < 10) 1567 { 1568 _bfd_error_handler 1569 /* xgettext:c-format */ 1570 (_("FDE encoding in %pB(%pA) prevents .eh_frame_hdr" 1571 " table being created"), abfd, sec); 1572 num_warnings_issued ++; 1573 } 1574 else if (num_warnings_issued == 10) 1575 { 1576 _bfd_error_handler 1577 (_("further warnings about FDE encoding preventing .eh_frame_hdr generation dropped")); 1578 num_warnings_issued ++; 1579 } 1580 } 1581 } 1582 ent->removed = 0; 1583 hdr_info->u.dwarf.fde_count++; 1584 ent->u.fde.cie_inf = find_merged_cie (abfd, info, sec, hdr_info, 1585 cookie, ent->u.fde.cie_inf); 1586 } 1587 } 1588 1589 free (sec_info->cies); 1590 sec_info->cies = NULL; 1591 1592 /* It may be that some .eh_frame input section has greater alignment 1593 than other .eh_frame sections. In that case we run the risk of 1594 padding with zeros before that section, which would be seen as a 1595 zero terminator. Alignment padding must be added *inside* the 1596 last FDE instead. For other FDEs we align according to their 1597 encoding, in order to align FDE address range entries naturally. */ 1598 offset = 0; 1599 changed = 0; 1600 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent) 1601 if (!ent->removed) 1602 { 1603 eh_alignment = 4; 1604 if (ent->size == 4) 1605 ; 1606 else if (ent->cie) 1607 { 1608 if (ent->u.cie.per_encoding_aligned8) 1609 eh_alignment = 8; 1610 } 1611 else 1612 { 1613 eh_alignment = get_DW_EH_PE_width (ent->fde_encoding, ptr_size); 1614 if (eh_alignment < 4) 1615 eh_alignment = 4; 1616 } 1617 offset = (offset + eh_alignment - 1) & -eh_alignment; 1618 ent->new_offset = offset; 1619 if (ent->new_offset != ent->offset) 1620 changed = 1; 1621 offset += size_of_output_cie_fde (ent); 1622 } 1623 1624 eh_alignment = 4; 1625 offset = (offset + eh_alignment - 1) & -eh_alignment; 1626 if (sec->rawsize == 0) 1627 sec->rawsize = sec->size; 1628 if (sec->size != offset) 1629 changed = 2; 1630 sec->size = offset; 1631 1632 if (changed) 1633 { 1634 Elf_Internal_Sym *locsyms = adjust_eh_frame_local_symbols (sec, cookie); 1635 if (locsyms != NULL) 1636 { 1637 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd); 1638 symtab_hdr->contents = (unsigned char *) locsyms; 1639 } 1640 } 1641 return changed; 1642 } 1643 1644 /* This function is called for .eh_frame_hdr section after 1645 _bfd_elf_discard_section_eh_frame has been called on all .eh_frame 1646 input sections. It finalizes the size of .eh_frame_hdr section. */ 1647 1648 bool 1649 _bfd_elf_discard_section_eh_frame_hdr (struct bfd_link_info *info) 1650 { 1651 struct elf_link_hash_table *htab; 1652 struct eh_frame_hdr_info *hdr_info; 1653 asection *sec; 1654 1655 htab = elf_hash_table (info); 1656 hdr_info = &htab->eh_info; 1657 1658 if (!hdr_info->frame_hdr_is_compact && hdr_info->u.dwarf.cies != NULL) 1659 { 1660 htab_delete (hdr_info->u.dwarf.cies); 1661 hdr_info->u.dwarf.cies = NULL; 1662 } 1663 1664 if (info->eh_frame_hdr_type == 0 1665 || bfd_link_relocatable (info)) 1666 return false; 1667 1668 sec = hdr_info->hdr_sec; 1669 if (sec == NULL) 1670 return false; 1671 1672 if (info->eh_frame_hdr_type == COMPACT_EH_HDR) 1673 { 1674 /* For compact frames we only add the header. The actual table comes 1675 from the .eh_frame_entry sections. */ 1676 sec->size = 8; 1677 } 1678 else 1679 { 1680 sec->size = EH_FRAME_HDR_SIZE; 1681 if (hdr_info->u.dwarf.table) 1682 sec->size += 4 + hdr_info->u.dwarf.fde_count * 8; 1683 } 1684 1685 return true; 1686 } 1687 1688 /* Return true if there is at least one non-empty .eh_frame section in 1689 input files. Can only be called after ld has mapped input to 1690 output sections, and before sections are stripped. */ 1691 1692 bool 1693 _bfd_elf_eh_frame_present (struct bfd_link_info *info) 1694 { 1695 asection *eh = bfd_get_section_by_name (info->output_bfd, ".eh_frame"); 1696 1697 if (eh == NULL) 1698 return false; 1699 1700 /* Count only sections which have at least a single CIE or FDE. 1701 There cannot be any CIE or FDE <= 8 bytes. */ 1702 for (eh = eh->map_head.s; eh != NULL; eh = eh->map_head.s) 1703 if (eh->size > 8) 1704 return true; 1705 1706 return false; 1707 } 1708 1709 /* Return true if there is at least one .eh_frame_entry section in 1710 input files. */ 1711 1712 bool 1713 _bfd_elf_eh_frame_entry_present (struct bfd_link_info *info) 1714 { 1715 asection *o; 1716 bfd *abfd; 1717 1718 for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next) 1719 { 1720 for (o = abfd->sections; o; o = o->next) 1721 { 1722 const char *name = bfd_section_name (o); 1723 1724 if (strcmp (name, ".eh_frame_entry") 1725 && !bfd_is_abs_section (o->output_section)) 1726 return true; 1727 } 1728 } 1729 return false; 1730 } 1731 1732 /* This function is called from size_dynamic_sections. 1733 It needs to decide whether .eh_frame_hdr should be output or not, 1734 because when the dynamic symbol table has been sized it is too late 1735 to strip sections. */ 1736 1737 bool 1738 _bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info) 1739 { 1740 struct elf_link_hash_table *htab; 1741 struct eh_frame_hdr_info *hdr_info; 1742 struct bfd_link_hash_entry *bh = NULL; 1743 struct elf_link_hash_entry *h; 1744 1745 htab = elf_hash_table (info); 1746 hdr_info = &htab->eh_info; 1747 if (hdr_info->hdr_sec == NULL) 1748 return true; 1749 1750 if (bfd_is_abs_section (hdr_info->hdr_sec->output_section) 1751 || info->eh_frame_hdr_type == 0 1752 || (info->eh_frame_hdr_type == DWARF2_EH_HDR 1753 && !_bfd_elf_eh_frame_present (info)) 1754 || (info->eh_frame_hdr_type == COMPACT_EH_HDR 1755 && !_bfd_elf_eh_frame_entry_present (info))) 1756 { 1757 hdr_info->hdr_sec->flags |= SEC_EXCLUDE; 1758 hdr_info->hdr_sec = NULL; 1759 return true; 1760 } 1761 1762 /* Add a hidden symbol so that systems without access to PHDRs can 1763 find the table. */ 1764 if (! (_bfd_generic_link_add_one_symbol 1765 (info, info->output_bfd, "__GNU_EH_FRAME_HDR", BSF_LOCAL, 1766 hdr_info->hdr_sec, 0, NULL, false, false, &bh))) 1767 return false; 1768 1769 h = (struct elf_link_hash_entry *) bh; 1770 h->def_regular = 1; 1771 h->other = STV_HIDDEN; 1772 get_elf_backend_data 1773 (info->output_bfd)->elf_backend_hide_symbol (info, h, true); 1774 1775 if (!hdr_info->frame_hdr_is_compact) 1776 hdr_info->u.dwarf.table = true; 1777 return true; 1778 } 1779 1780 /* Adjust an address in the .eh_frame section. Given OFFSET within 1781 SEC, this returns the new offset in the adjusted .eh_frame section, 1782 or -1 if the address refers to a CIE/FDE which has been removed 1783 or to offset with dynamic relocation which is no longer needed. */ 1784 1785 bfd_vma 1786 _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED, 1787 struct bfd_link_info *info ATTRIBUTE_UNUSED, 1788 asection *sec, 1789 bfd_vma offset) 1790 { 1791 struct eh_frame_sec_info *sec_info; 1792 unsigned int lo, hi, mid; 1793 1794 if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME) 1795 return offset; 1796 sec_info = sec->sec_info; 1797 1798 if (offset >= sec->rawsize) 1799 return offset - sec->rawsize + sec->size; 1800 1801 lo = 0; 1802 hi = sec_info->count; 1803 mid = 0; 1804 while (lo < hi) 1805 { 1806 mid = (lo + hi) / 2; 1807 if (offset < sec_info->entry[mid].offset) 1808 hi = mid; 1809 else if (offset 1810 >= sec_info->entry[mid].offset + sec_info->entry[mid].size) 1811 lo = mid + 1; 1812 else 1813 break; 1814 } 1815 1816 BFD_ASSERT (lo < hi); 1817 1818 /* FDE or CIE was removed. */ 1819 if (sec_info->entry[mid].removed) 1820 return (bfd_vma) -1; 1821 1822 /* If converting personality pointers to DW_EH_PE_pcrel, there will be 1823 no need for run-time relocation against the personality field. */ 1824 if (sec_info->entry[mid].cie 1825 && sec_info->entry[mid].u.cie.make_per_encoding_relative 1826 && offset == (sec_info->entry[mid].offset + 8 1827 + sec_info->entry[mid].u.cie.personality_offset)) 1828 return (bfd_vma) -2; 1829 1830 /* If converting to DW_EH_PE_pcrel, there will be no need for run-time 1831 relocation against FDE's initial_location field. */ 1832 if (!sec_info->entry[mid].cie 1833 && sec_info->entry[mid].make_relative 1834 && offset == sec_info->entry[mid].offset + 8) 1835 return (bfd_vma) -2; 1836 1837 /* If converting LSDA pointers to DW_EH_PE_pcrel, there will be no need 1838 for run-time relocation against LSDA field. */ 1839 if (!sec_info->entry[mid].cie 1840 && sec_info->entry[mid].u.fde.cie_inf->u.cie.make_lsda_relative 1841 && offset == (sec_info->entry[mid].offset + 8 1842 + sec_info->entry[mid].lsda_offset)) 1843 return (bfd_vma) -2; 1844 1845 /* If converting to DW_EH_PE_pcrel, there will be no need for run-time 1846 relocation against DW_CFA_set_loc's arguments. */ 1847 if (sec_info->entry[mid].set_loc 1848 && sec_info->entry[mid].make_relative 1849 && (offset >= sec_info->entry[mid].offset + 8 1850 + sec_info->entry[mid].set_loc[1])) 1851 { 1852 unsigned int cnt; 1853 1854 for (cnt = 1; cnt <= sec_info->entry[mid].set_loc[0]; cnt++) 1855 if (offset == sec_info->entry[mid].offset + 8 1856 + sec_info->entry[mid].set_loc[cnt]) 1857 return (bfd_vma) -2; 1858 } 1859 1860 /* Any new augmentation bytes go before the first relocation. */ 1861 return (offset + sec_info->entry[mid].new_offset 1862 - sec_info->entry[mid].offset 1863 + extra_augmentation_string_bytes (sec_info->entry + mid) 1864 + extra_augmentation_data_bytes (sec_info->entry + mid)); 1865 } 1866 1867 /* Write out .eh_frame_entry section. Add CANTUNWIND terminator if needed. 1868 Also check that the contents look sane. */ 1869 1870 bool 1871 _bfd_elf_write_section_eh_frame_entry (bfd *abfd, struct bfd_link_info *info, 1872 asection *sec, bfd_byte *contents) 1873 { 1874 elf_backend_data *bed; 1875 bfd_byte cantunwind[8]; 1876 bfd_vma addr; 1877 bfd_vma last_addr; 1878 bfd_vma offset; 1879 asection *text_sec = sec->sec_info; 1880 1881 if (!sec->rawsize) 1882 sec->rawsize = sec->size; 1883 1884 BFD_ASSERT (sec->sec_info_type == SEC_INFO_TYPE_EH_FRAME_ENTRY); 1885 1886 /* Check to make sure that the text section corresponding to this eh_frame_entry 1887 section has not been excluded. In particular, mips16 stub entries will be 1888 excluded outside of the normal process. */ 1889 if (sec->flags & SEC_EXCLUDE 1890 || text_sec->flags & SEC_EXCLUDE) 1891 return true; 1892 1893 if (!bfd_set_section_contents (abfd, sec->output_section, contents, 1894 sec->output_offset, sec->rawsize)) 1895 return false; 1896 1897 last_addr = bfd_get_signed_32 (abfd, contents); 1898 /* Check that all the entries are in order. */ 1899 for (offset = 8; offset < sec->rawsize; offset += 8) 1900 { 1901 addr = bfd_get_signed_32 (abfd, contents + offset) + offset; 1902 if (addr <= last_addr) 1903 { 1904 /* xgettext:c-format */ 1905 _bfd_error_handler (_("%pB: %pA not in order"), sec->owner, sec); 1906 return false; 1907 } 1908 1909 last_addr = addr; 1910 } 1911 1912 addr = text_sec->output_section->vma + text_sec->output_offset 1913 + text_sec->size; 1914 addr &= ~1; 1915 addr -= (sec->output_section->vma + sec->output_offset + sec->rawsize); 1916 if (addr & 1) 1917 { 1918 /* xgettext:c-format */ 1919 _bfd_error_handler (_("%pB: %pA invalid input section size"), 1920 sec->owner, sec); 1921 bfd_set_error (bfd_error_bad_value); 1922 return false; 1923 } 1924 if (last_addr >= addr + sec->rawsize) 1925 { 1926 /* xgettext:c-format */ 1927 _bfd_error_handler (_("%pB: %pA points past end of text section"), 1928 sec->owner, sec); 1929 bfd_set_error (bfd_error_bad_value); 1930 return false; 1931 } 1932 1933 if (sec->size == sec->rawsize) 1934 return true; 1935 1936 bed = get_elf_backend_data (abfd); 1937 BFD_ASSERT (sec->size == sec->rawsize + 8); 1938 BFD_ASSERT ((addr & 1) == 0); 1939 BFD_ASSERT (bed->cant_unwind_opcode); 1940 1941 bfd_put_32 (abfd, addr, cantunwind); 1942 bfd_put_32 (abfd, (*bed->cant_unwind_opcode) (info), cantunwind + 4); 1943 return bfd_set_section_contents (abfd, sec->output_section, cantunwind, 1944 sec->output_offset + sec->rawsize, 8); 1945 } 1946 1947 /* Write out .eh_frame section. This is called with the relocated 1948 contents. */ 1949 1950 bool 1951 _bfd_elf_write_section_eh_frame (bfd *abfd, 1952 struct bfd_link_info *info, 1953 asection *sec, 1954 bfd_byte *contents) 1955 { 1956 struct eh_frame_sec_info *sec_info; 1957 struct elf_link_hash_table *htab; 1958 struct eh_frame_hdr_info *hdr_info; 1959 unsigned int ptr_size; 1960 struct eh_cie_fde *ent, *last_ent; 1961 1962 if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME) 1963 /* FIXME: octets_per_byte. */ 1964 return bfd_set_section_contents (abfd, sec->output_section, contents, 1965 sec->output_offset, sec->size); 1966 1967 ptr_size = (get_elf_backend_data (abfd) 1968 ->elf_backend_eh_frame_address_size (abfd, sec)); 1969 BFD_ASSERT (ptr_size != 0); 1970 1971 sec_info = sec->sec_info; 1972 htab = elf_hash_table (info); 1973 hdr_info = &htab->eh_info; 1974 1975 if (hdr_info->u.dwarf.table && hdr_info->u.dwarf.array == NULL) 1976 { 1977 hdr_info->frame_hdr_is_compact = false; 1978 hdr_info->u.dwarf.array = (struct eh_frame_array_ent *) 1979 bfd_malloc (hdr_info->u.dwarf.fde_count 1980 * sizeof (*hdr_info->u.dwarf.array)); 1981 } 1982 if (hdr_info->u.dwarf.array == NULL) 1983 hdr_info = NULL; 1984 1985 /* The new offsets can be bigger or smaller than the original offsets. 1986 We therefore need to make two passes over the section: one backward 1987 pass to move entries up and one forward pass to move entries down. 1988 The two passes won't interfere with each other because entries are 1989 not reordered */ 1990 for (ent = sec_info->entry + sec_info->count; ent-- != sec_info->entry;) 1991 if (!ent->removed && ent->new_offset > ent->offset) 1992 memmove (contents + ent->new_offset, contents + ent->offset, ent->size); 1993 1994 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent) 1995 if (!ent->removed && ent->new_offset < ent->offset) 1996 memmove (contents + ent->new_offset, contents + ent->offset, ent->size); 1997 1998 last_ent = sec_info->entry + sec_info->count; 1999 for (ent = sec_info->entry; ent < last_ent; ++ent) 2000 { 2001 unsigned char *buf, *end; 2002 unsigned int new_size; 2003 2004 if (ent->removed) 2005 continue; 2006 2007 if (ent->size == 4) 2008 { 2009 /* Any terminating FDE must be at the end of the section. */ 2010 BFD_ASSERT (ent == last_ent - 1); 2011 continue; 2012 } 2013 2014 buf = contents + ent->new_offset; 2015 end = buf + ent->size; 2016 new_size = next_cie_fde_offset (ent, last_ent, sec) - ent->new_offset; 2017 2018 /* Update the size. It may be shrinked. */ 2019 bfd_put_32 (abfd, new_size - 4, buf); 2020 2021 /* Filling the extra bytes with DW_CFA_nops. */ 2022 if (new_size != ent->size) 2023 memset (end, 0, new_size - ent->size); 2024 2025 if (ent->cie) 2026 { 2027 /* CIE */ 2028 if (ent->make_relative 2029 || ent->u.cie.make_lsda_relative 2030 || ent->u.cie.per_encoding_relative) 2031 { 2032 char *aug; 2033 unsigned int version, action, extra_string, extra_data; 2034 unsigned int per_width, per_encoding; 2035 2036 /* Need to find 'R' or 'L' augmentation's argument and modify 2037 DW_EH_PE_* value. */ 2038 action = ((ent->make_relative ? 1 : 0) 2039 | (ent->u.cie.make_lsda_relative ? 2 : 0) 2040 | (ent->u.cie.per_encoding_relative ? 4 : 0)); 2041 extra_string = extra_augmentation_string_bytes (ent); 2042 extra_data = extra_augmentation_data_bytes (ent); 2043 2044 /* Skip length, id. */ 2045 buf += 8; 2046 version = *buf++; 2047 aug = (char *) buf; 2048 buf += strlen (aug) + 1; 2049 skip_leb128 (&buf, end); 2050 skip_leb128 (&buf, end); 2051 if (version == 1) 2052 skip_bytes (&buf, end, 1); 2053 else 2054 skip_leb128 (&buf, end); 2055 if (*aug == 'z') 2056 { 2057 /* The uleb128 will always be a single byte for the kind 2058 of augmentation strings that we're prepared to handle. */ 2059 *buf++ += extra_data; 2060 aug++; 2061 } 2062 2063 /* Make room for the new augmentation string and data bytes. */ 2064 memmove (buf + extra_string + extra_data, buf, end - buf); 2065 memmove (aug + extra_string, aug, buf - (bfd_byte *) aug); 2066 buf += extra_string; 2067 end += extra_string + extra_data; 2068 2069 if (ent->add_augmentation_size) 2070 { 2071 *aug++ = 'z'; 2072 *buf++ = extra_data - 1; 2073 } 2074 if (ent->u.cie.add_fde_encoding) 2075 { 2076 BFD_ASSERT (action & 1); 2077 *aug++ = 'R'; 2078 *buf++ = make_pc_relative (DW_EH_PE_absptr, ptr_size); 2079 action &= ~1; 2080 } 2081 2082 while (action) 2083 switch (*aug++) 2084 { 2085 case 'L': 2086 if (action & 2) 2087 { 2088 BFD_ASSERT (*buf == ent->lsda_encoding); 2089 *buf = make_pc_relative (*buf, ptr_size); 2090 action &= ~2; 2091 } 2092 buf++; 2093 break; 2094 case 'P': 2095 if (ent->u.cie.make_per_encoding_relative) 2096 *buf = make_pc_relative (*buf, ptr_size); 2097 per_encoding = *buf++; 2098 per_width = get_DW_EH_PE_width (per_encoding, ptr_size); 2099 BFD_ASSERT (per_width != 0); 2100 BFD_ASSERT (((per_encoding & 0x70) == DW_EH_PE_pcrel) 2101 == ent->u.cie.per_encoding_relative); 2102 if ((per_encoding & 0x70) == DW_EH_PE_aligned) 2103 buf = (contents 2104 + ((buf - contents + per_width - 1) 2105 & ~((bfd_size_type) per_width - 1))); 2106 if (action & 4) 2107 { 2108 bfd_vma val; 2109 2110 val = read_value (abfd, buf, per_width, 2111 get_DW_EH_PE_signed (per_encoding)); 2112 if (ent->u.cie.make_per_encoding_relative) 2113 val -= (sec->output_section->vma 2114 + sec->output_offset 2115 + (buf - contents)); 2116 else 2117 { 2118 val += (bfd_vma) ent->offset - ent->new_offset; 2119 val -= extra_string + extra_data; 2120 } 2121 write_value (abfd, buf, val, per_width); 2122 action &= ~4; 2123 } 2124 buf += per_width; 2125 break; 2126 case 'R': 2127 if (action & 1) 2128 { 2129 BFD_ASSERT (*buf == ent->fde_encoding); 2130 *buf = make_pc_relative (*buf, ptr_size); 2131 action &= ~1; 2132 } 2133 buf++; 2134 break; 2135 case 'S': 2136 break; 2137 default: 2138 BFD_FAIL (); 2139 } 2140 } 2141 } 2142 else 2143 { 2144 /* FDE */ 2145 bfd_vma value, address; 2146 unsigned int width; 2147 bfd_byte *start; 2148 struct eh_cie_fde *cie; 2149 2150 /* Skip length. */ 2151 cie = ent->u.fde.cie_inf; 2152 buf += 4; 2153 value = ((ent->new_offset + sec->output_offset + 4) 2154 - (cie->new_offset + cie->u.cie.u.sec->output_offset)); 2155 bfd_put_32 (abfd, value, buf); 2156 if (bfd_link_relocatable (info)) 2157 continue; 2158 buf += 4; 2159 width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size); 2160 value = read_value (abfd, buf, width, 2161 get_DW_EH_PE_signed (ent->fde_encoding)); 2162 address = value; 2163 if (value) 2164 { 2165 switch (ent->fde_encoding & 0x70) 2166 { 2167 case DW_EH_PE_textrel: 2168 BFD_ASSERT (hdr_info == NULL); 2169 break; 2170 case DW_EH_PE_datarel: 2171 { 2172 switch (abfd->arch_info->arch) 2173 { 2174 case bfd_arch_ia64: 2175 BFD_ASSERT (elf_gp (abfd) != 0); 2176 address += elf_gp (abfd); 2177 break; 2178 default: 2179 _bfd_error_handler 2180 (_("DW_EH_PE_datarel unspecified" 2181 " for this architecture")); 2182 /* Fall thru */ 2183 case bfd_arch_frv: 2184 case bfd_arch_i386: 2185 BFD_ASSERT (htab->hgot != NULL 2186 && ((htab->hgot->root.type 2187 == bfd_link_hash_defined) 2188 || (htab->hgot->root.type 2189 == bfd_link_hash_defweak))); 2190 address 2191 += (htab->hgot->root.u.def.value 2192 + htab->hgot->root.u.def.section->output_offset 2193 + (htab->hgot->root.u.def.section->output_section 2194 ->vma)); 2195 break; 2196 } 2197 } 2198 break; 2199 case DW_EH_PE_pcrel: 2200 value += (bfd_vma) ent->offset - ent->new_offset; 2201 address += (sec->output_section->vma 2202 + sec->output_offset 2203 + ent->offset + 8); 2204 break; 2205 } 2206 if (ent->make_relative) 2207 value -= (sec->output_section->vma 2208 + sec->output_offset 2209 + ent->new_offset + 8); 2210 write_value (abfd, buf, value, width); 2211 } 2212 2213 start = buf; 2214 2215 if (hdr_info) 2216 { 2217 /* The address calculation may overflow, giving us a 2218 value greater than 4G on a 32-bit target when 2219 dwarf_vma is 64-bit. */ 2220 if (sizeof (address) > 4 && ptr_size == 4) 2221 address &= 0xffffffff; 2222 hdr_info->u.dwarf.array[hdr_info->array_count].initial_loc 2223 = address; 2224 hdr_info->u.dwarf.array[hdr_info->array_count].range 2225 = read_value (abfd, buf + width, width, false); 2226 hdr_info->u.dwarf.array[hdr_info->array_count++].fde 2227 = (sec->output_section->vma 2228 + sec->output_offset 2229 + ent->new_offset); 2230 } 2231 2232 if ((ent->lsda_encoding & 0x70) == DW_EH_PE_pcrel 2233 || cie->u.cie.make_lsda_relative) 2234 { 2235 buf += ent->lsda_offset; 2236 width = get_DW_EH_PE_width (ent->lsda_encoding, ptr_size); 2237 value = read_value (abfd, buf, width, 2238 get_DW_EH_PE_signed (ent->lsda_encoding)); 2239 if (value) 2240 { 2241 if ((ent->lsda_encoding & 0x70) == DW_EH_PE_pcrel) 2242 value += (bfd_vma) ent->offset - ent->new_offset; 2243 else if (cie->u.cie.make_lsda_relative) 2244 value -= (sec->output_section->vma 2245 + sec->output_offset 2246 + ent->new_offset + 8 + ent->lsda_offset); 2247 write_value (abfd, buf, value, width); 2248 } 2249 } 2250 else if (ent->add_augmentation_size) 2251 { 2252 /* Skip the PC and length and insert a zero byte for the 2253 augmentation size. */ 2254 buf += width * 2; 2255 memmove (buf + 1, buf, end - buf); 2256 *buf = 0; 2257 } 2258 2259 if (ent->set_loc) 2260 { 2261 /* Adjust DW_CFA_set_loc. */ 2262 unsigned int cnt; 2263 bfd_vma new_offset; 2264 2265 width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size); 2266 new_offset = ent->new_offset + 8 2267 + extra_augmentation_string_bytes (ent) 2268 + extra_augmentation_data_bytes (ent); 2269 2270 for (cnt = 1; cnt <= ent->set_loc[0]; cnt++) 2271 { 2272 buf = start + ent->set_loc[cnt]; 2273 2274 value = read_value (abfd, buf, width, 2275 get_DW_EH_PE_signed (ent->fde_encoding)); 2276 if (!value) 2277 continue; 2278 2279 if ((ent->fde_encoding & 0x70) == DW_EH_PE_pcrel) 2280 value += (bfd_vma) ent->offset + 8 - new_offset; 2281 if (ent->make_relative) 2282 value -= (sec->output_section->vma 2283 + sec->output_offset 2284 + new_offset + ent->set_loc[cnt]); 2285 write_value (abfd, buf, value, width); 2286 } 2287 } 2288 } 2289 } 2290 2291 /* FIXME: octets_per_byte. */ 2292 return bfd_set_section_contents (abfd, sec->output_section, 2293 contents, (file_ptr) sec->output_offset, 2294 sec->size); 2295 } 2296 2297 /* A handy wrapper for writing linker generated .eh_frame sections 2298 with contents that may need to be extended beyond the initial size 2299 allocated. */ 2300 2301 bool 2302 _bfd_elf_write_linker_section_eh_frame (bfd *obfd, struct bfd_link_info *info, 2303 asection *sec, bfd_byte *bigbuf) 2304 { 2305 bfd_size_type initial_size = sec->rawsize != 0 ? sec->rawsize : sec->size; 2306 memcpy (bigbuf, sec->contents, initial_size); 2307 if (!_bfd_elf_write_section_eh_frame (obfd, info, sec, bigbuf)) 2308 return false; 2309 if (sec->size > initial_size) 2310 { 2311 if (sec->alloced) 2312 sec->contents = bfd_alloc (sec->owner, sec->size); 2313 else 2314 { 2315 free (sec->contents); 2316 sec->contents = bfd_malloc (sec->size); 2317 } 2318 if (sec->contents == NULL) 2319 return false; 2320 } 2321 memcpy (sec->contents, bigbuf, sec->size); 2322 return true; 2323 } 2324 2325 /* Helper function used to sort .eh_frame_hdr search table by increasing 2326 VMA of FDE initial location. */ 2327 2328 static int 2329 vma_compare (const void *a, const void *b) 2330 { 2331 const struct eh_frame_array_ent *p = (const struct eh_frame_array_ent *) a; 2332 const struct eh_frame_array_ent *q = (const struct eh_frame_array_ent *) b; 2333 if (p->initial_loc > q->initial_loc) 2334 return 1; 2335 if (p->initial_loc < q->initial_loc) 2336 return -1; 2337 if (p->range > q->range) 2338 return 1; 2339 if (p->range < q->range) 2340 return -1; 2341 return 0; 2342 } 2343 2344 /* Reorder .eh_frame_entry sections to match the associated text sections. 2345 This routine is called during the final linking step, just before writing 2346 the contents. At this stage, sections in the eh_frame_hdr_info are already 2347 sorted in order of increasing text section address and so we simply need 2348 to make the .eh_frame_entrys follow that same order. Note that it is 2349 invalid for a linker script to try to force a particular order of 2350 .eh_frame_entry sections. */ 2351 2352 bool 2353 _bfd_elf_fixup_eh_frame_hdr (struct bfd_link_info *info) 2354 { 2355 asection *sec = NULL; 2356 asection *osec; 2357 struct eh_frame_hdr_info *hdr_info; 2358 unsigned int i; 2359 bfd_vma offset; 2360 struct bfd_link_order *p; 2361 2362 hdr_info = &elf_hash_table (info)->eh_info; 2363 2364 if (hdr_info->hdr_sec == NULL 2365 || info->eh_frame_hdr_type != COMPACT_EH_HDR 2366 || hdr_info->array_count == 0) 2367 return true; 2368 2369 /* Change section output offsets to be in text section order. */ 2370 offset = 8; 2371 osec = hdr_info->u.compact.entries[0]->output_section; 2372 for (i = 0; i < hdr_info->array_count; i++) 2373 { 2374 sec = hdr_info->u.compact.entries[i]; 2375 if (sec->output_section != osec) 2376 { 2377 _bfd_error_handler 2378 (_("invalid output section for .eh_frame_entry: %pA"), 2379 sec->output_section); 2380 return false; 2381 } 2382 sec->output_offset = offset; 2383 offset += sec->size; 2384 } 2385 2386 2387 /* Fix the link_order to match. */ 2388 for (p = sec->output_section->map_head.link_order; p != NULL; p = p->next) 2389 { 2390 if (p->type != bfd_indirect_link_order) 2391 abort(); 2392 2393 p->offset = p->u.indirect.section->output_offset; 2394 if (p->next != NULL) 2395 i--; 2396 } 2397 2398 if (i != 0) 2399 { 2400 _bfd_error_handler 2401 (_("invalid contents in %pA section"), osec); 2402 return false; 2403 } 2404 2405 return true; 2406 } 2407 2408 /* The .eh_frame_hdr format for Compact EH frames: 2409 ubyte version (2) 2410 ubyte eh_ref_enc (DW_EH_PE_* encoding of typinfo references) 2411 uint32_t count (Number of entries in table) 2412 [array from .eh_frame_entry sections] */ 2413 2414 static bool 2415 write_compact_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info) 2416 { 2417 struct elf_link_hash_table *htab; 2418 struct eh_frame_hdr_info *hdr_info; 2419 asection *sec; 2420 elf_backend_data *bed; 2421 bfd_vma count; 2422 bfd_byte contents[8]; 2423 unsigned int i; 2424 2425 htab = elf_hash_table (info); 2426 hdr_info = &htab->eh_info; 2427 sec = hdr_info->hdr_sec; 2428 2429 if (sec->size != 8) 2430 abort(); 2431 2432 for (i = 0; i < sizeof (contents); i++) 2433 contents[i] = 0; 2434 2435 contents[0] = COMPACT_EH_HDR; 2436 bed = get_elf_backend_data (abfd); 2437 2438 BFD_ASSERT (bed->compact_eh_encoding); 2439 contents[1] = (*bed->compact_eh_encoding) (info); 2440 2441 count = (sec->output_section->size - 8) / 8; 2442 bfd_put_32 (abfd, count, contents + 4); 2443 return bfd_set_section_contents (abfd, sec->output_section, contents, 2444 (file_ptr) sec->output_offset, sec->size); 2445 } 2446 2447 /* The .eh_frame_hdr format for DWARF frames: 2448 2449 ubyte version (currently 1) 2450 ubyte eh_frame_ptr_enc (DW_EH_PE_* encoding of pointer to start of 2451 .eh_frame section) 2452 ubyte fde_count_enc (DW_EH_PE_* encoding of total FDE count 2453 number (or DW_EH_PE_omit if there is no 2454 binary search table computed)) 2455 ubyte table_enc (DW_EH_PE_* encoding of binary search table, 2456 or DW_EH_PE_omit if not present. 2457 DW_EH_PE_datarel is using address of 2458 .eh_frame_hdr section start as base) 2459 [encoded] eh_frame_ptr (pointer to start of .eh_frame section) 2460 optionally followed by: 2461 [encoded] fde_count (total number of FDEs in .eh_frame section) 2462 fde_count x [encoded] initial_loc, fde 2463 (array of encoded pairs containing 2464 FDE initial_location field and FDE address, 2465 sorted by increasing initial_loc). */ 2466 2467 static bool 2468 write_dwarf_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info) 2469 { 2470 struct elf_link_hash_table *htab; 2471 struct eh_frame_hdr_info *hdr_info; 2472 asection *sec; 2473 bool retval = false; 2474 2475 htab = elf_hash_table (info); 2476 hdr_info = &htab->eh_info; 2477 sec = hdr_info->hdr_sec; 2478 bfd_byte *contents; 2479 asection *eh_frame_sec; 2480 bfd_size_type size; 2481 bfd_vma encoded_eh_frame; 2482 2483 size = EH_FRAME_HDR_SIZE; 2484 if (hdr_info->u.dwarf.array 2485 && hdr_info->array_count == hdr_info->u.dwarf.fde_count) 2486 size += 4 + hdr_info->u.dwarf.fde_count * 8; 2487 contents = (bfd_byte *) bfd_malloc (size); 2488 if (contents == NULL) 2489 goto out; 2490 2491 eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame"); 2492 if (eh_frame_sec == NULL) 2493 goto out; 2494 2495 memset (contents, 0, EH_FRAME_HDR_SIZE); 2496 /* Version. */ 2497 contents[0] = 1; 2498 /* .eh_frame offset. */ 2499 contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address 2500 (abfd, info, eh_frame_sec, 0, sec, 4, &encoded_eh_frame); 2501 2502 if (hdr_info->u.dwarf.array 2503 && hdr_info->array_count == hdr_info->u.dwarf.fde_count) 2504 { 2505 /* FDE count encoding. */ 2506 contents[2] = DW_EH_PE_udata4; 2507 /* Search table encoding. */ 2508 contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4; 2509 } 2510 else 2511 { 2512 contents[2] = DW_EH_PE_omit; 2513 contents[3] = DW_EH_PE_omit; 2514 } 2515 bfd_put_32 (abfd, encoded_eh_frame, contents + 4); 2516 2517 retval = true; 2518 if (contents[2] != DW_EH_PE_omit) 2519 { 2520 unsigned int i; 2521 bool overlap, overflow; 2522 2523 bfd_put_32 (abfd, hdr_info->u.dwarf.fde_count, 2524 contents + EH_FRAME_HDR_SIZE); 2525 qsort (hdr_info->u.dwarf.array, hdr_info->u.dwarf.fde_count, 2526 sizeof (*hdr_info->u.dwarf.array), vma_compare); 2527 overlap = false; 2528 overflow = false; 2529 for (i = 0; i < hdr_info->u.dwarf.fde_count; i++) 2530 { 2531 bfd_vma val; 2532 2533 val = hdr_info->u.dwarf.array[i].initial_loc 2534 - sec->output_section->vma; 2535 val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000; 2536 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 2537 && (hdr_info->u.dwarf.array[i].initial_loc 2538 != sec->output_section->vma + val)) 2539 overflow = true; 2540 bfd_put_32 (abfd, val, contents + EH_FRAME_HDR_SIZE + i * 8 + 4); 2541 val = hdr_info->u.dwarf.array[i].fde - sec->output_section->vma; 2542 val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000; 2543 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 2544 && (hdr_info->u.dwarf.array[i].fde 2545 != sec->output_section->vma + val)) 2546 overflow = true; 2547 bfd_put_32 (abfd, val, contents + EH_FRAME_HDR_SIZE + i * 8 + 8); 2548 if (i != 0 2549 && (hdr_info->u.dwarf.array[i].initial_loc 2550 < (hdr_info->u.dwarf.array[i - 1].initial_loc 2551 + hdr_info->u.dwarf.array[i - 1].range))) 2552 overlap = true; 2553 } 2554 if (overflow) 2555 _bfd_error_handler (_(".eh_frame_hdr entry overflow")); 2556 if (overlap) 2557 _bfd_error_handler (_(".eh_frame_hdr refers to overlapping FDEs")); 2558 if (overflow || overlap) 2559 { 2560 bfd_set_error (bfd_error_bad_value); 2561 retval = false; 2562 } 2563 } 2564 2565 /* FIXME: octets_per_byte. */ 2566 if (!bfd_set_section_contents (abfd, sec->output_section, contents, 2567 (file_ptr) sec->output_offset, 2568 size)) 2569 retval = false; 2570 out: 2571 free (contents); 2572 free (hdr_info->u.dwarf.array); 2573 hdr_info->u.dwarf.array = NULL; 2574 return retval; 2575 } 2576 2577 /* Write out .eh_frame_hdr section. This must be called after 2578 _bfd_elf_write_section_eh_frame has been called on all input 2579 .eh_frame sections. */ 2580 2581 bool 2582 _bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info) 2583 { 2584 struct elf_link_hash_table *htab; 2585 struct eh_frame_hdr_info *hdr_info; 2586 asection *sec; 2587 2588 htab = elf_hash_table (info); 2589 hdr_info = &htab->eh_info; 2590 sec = hdr_info->hdr_sec; 2591 2592 if (info->eh_frame_hdr_type == 0 || sec == NULL) 2593 return true; 2594 2595 if (info->eh_frame_hdr_type == COMPACT_EH_HDR) 2596 return write_compact_eh_frame_hdr (abfd, info); 2597 else 2598 return write_dwarf_eh_frame_hdr (abfd, info); 2599 } 2600 2601 /* Return the width of FDE addresses. This is the default implementation. */ 2602 2603 unsigned int 2604 _bfd_elf_eh_frame_address_size (bfd *abfd, const asection *sec ATTRIBUTE_UNUSED) 2605 { 2606 return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 ? 8 : 4; 2607 } 2608 2609 /* Decide whether we can use a PC-relative encoding within the given 2610 EH frame section. This is the default implementation. */ 2611 2612 bool 2613 _bfd_elf_can_make_relative (bfd *input_bfd ATTRIBUTE_UNUSED, 2614 struct bfd_link_info *info ATTRIBUTE_UNUSED, 2615 asection *eh_frame_section ATTRIBUTE_UNUSED) 2616 { 2617 return true; 2618 } 2619 2620 /* Select an encoding for the given address. Preference is given to 2621 PC-relative addressing modes. */ 2622 2623 bfd_byte 2624 _bfd_elf_encode_eh_address (bfd *abfd ATTRIBUTE_UNUSED, 2625 struct bfd_link_info *info ATTRIBUTE_UNUSED, 2626 asection *osec, bfd_vma offset, 2627 asection *loc_sec, bfd_vma loc_offset, 2628 bfd_vma *encoded) 2629 { 2630 *encoded = osec->vma + offset - 2631 (loc_sec->output_section->vma + loc_sec->output_offset + loc_offset); 2632 return DW_EH_PE_pcrel | DW_EH_PE_sdata4; 2633 } 2634