1 /* Discard section not used at runtime from object files. 2 Copyright (C) 2000-2012 Red Hat, Inc. 3 This file is part of Red Hat elfutils. 4 Written by Ulrich Drepper <drepper (at) redhat.com>, 2000. 5 6 Red Hat elfutils is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by the 8 Free Software Foundation; version 2 of the License. 9 10 Red Hat elfutils is distributed in the hope that it will be useful, but 11 WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 General Public License for more details. 14 15 You should have received a copy of the GNU General Public License along 16 with Red Hat elfutils; if not, write to the Free Software Foundation, 17 Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. 18 19 Red Hat elfutils is an included package of the Open Invention Network. 20 An included package of the Open Invention Network is a package for which 21 Open Invention Network licensees cross-license their patents. No patent 22 license is granted, either expressly or impliedly, by designation as an 23 included package. Should you wish to participate in the Open Invention 24 Network licensing program, please visit www.openinventionnetwork.com 25 <http://www.openinventionnetwork.com>. */ 26 27 #ifdef HAVE_CONFIG_H 28 # include <config.h> 29 #endif 30 31 #include <argp.h> 32 #include <assert.h> 33 #include <byteswap.h> 34 #include <endian.h> 35 #include <error.h> 36 #include <fcntl.h> 37 #include <gelf.h> 38 #include <libelf.h> 39 #include <libintl.h> 40 #include <locale.h> 41 #include <mcheck.h> 42 #include <stdbool.h> 43 #include <stdio.h> 44 #include <stdio_ext.h> 45 #include <stdlib.h> 46 #include <string.h> 47 #include <unistd.h> 48 #include <sys/param.h> 49 #include <sys/stat.h> 50 #include <sys/time.h> 51 52 #include <elf-knowledge.h> 53 #include <libebl.h> 54 #include <system.h> 55 56 typedef uint8_t GElf_Byte; 57 58 /* Name and version of program. */ 59 static void print_version (FILE *stream, struct argp_state *state); 60 ARGP_PROGRAM_VERSION_HOOK_DEF = print_version; 61 62 /* Bug report address. */ 63 ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT; 64 65 66 /* Values for the parameters which have no short form. */ 67 #define OPT_REMOVE_COMMENT 0x100 68 #define OPT_PERMISSIVE 0x101 69 #define OPT_STRIP_SECTIONS 0x102 70 #define OPT_RELOC_DEBUG 0x103 71 72 73 /* Definitions of arguments for argp functions. */ 74 static const struct argp_option options[] = 75 { 76 { NULL, 0, NULL, 0, N_("Output selection:"), 0 }, 77 { "output", 'o', "FILE", 0, N_("Place stripped output into FILE"), 0 }, 78 { NULL, 'f', "FILE", 0, N_("Extract the removed sections into FILE"), 0 }, 79 { NULL, 'F', "FILE", 0, N_("Embed name FILE instead of -f argument"), 0 }, 80 81 { NULL, 0, NULL, 0, N_("Output options:"), 0 }, 82 { "strip-all", 's', NULL, OPTION_HIDDEN, NULL, 0 }, 83 { "strip-debug", 'g', NULL, 0, N_("Remove all debugging symbols"), 0 }, 84 { NULL, 'd', NULL, OPTION_ALIAS, NULL, 0 }, 85 { NULL, 'S', NULL, OPTION_ALIAS, NULL, 0 }, 86 { "strip-sections", OPT_STRIP_SECTIONS, NULL, 0, 87 N_("Remove section headers (not recommended)"), 0 }, 88 { "preserve-dates", 'p', NULL, 0, 89 N_("Copy modified/access timestamps to the output"), 0 }, 90 { "reloc-debug-sections", OPT_RELOC_DEBUG, NULL, 0, 91 N_("Resolve all trivial relocations between debug sections if the removed sections are placed in a debug file (only relevant for ET_REL files, operation is not reversable, needs -f)"), 0 }, 92 { "remove-comment", OPT_REMOVE_COMMENT, NULL, 0, 93 N_("Remove .comment section"), 0 }, 94 { "remove-section", 'R', "SECTION", OPTION_HIDDEN, NULL, 0 }, 95 { "permissive", OPT_PERMISSIVE, NULL, 0, 96 N_("Relax a few rules to handle slightly broken ELF files"), 0 }, 97 { NULL, 0, NULL, 0, NULL, 0 } 98 }; 99 100 /* Short description of program. */ 101 static const char doc[] = N_("Discard symbols from object files."); 102 103 /* Strings for arguments in help texts. */ 104 static const char args_doc[] = N_("[FILE...]"); 105 106 /* Prototype for option handler. */ 107 static error_t parse_opt (int key, char *arg, struct argp_state *state); 108 109 /* Data structure to communicate with argp functions. */ 110 static struct argp argp = 111 { 112 options, parse_opt, args_doc, doc, NULL, NULL, NULL 113 }; 114 115 116 /* Print symbols in file named FNAME. */ 117 static int process_file (const char *fname); 118 119 /* Handle one ELF file. */ 120 static int handle_elf (int fd, Elf *elf, const char *prefix, 121 const char *fname, mode_t mode, struct timeval tvp[2]); 122 123 /* Handle all files contained in the archive. */ 124 static int handle_ar (int fd, Elf *elf, const char *prefix, const char *fname, 125 struct timeval tvp[2]); 126 127 #define INTERNAL_ERROR(fname) \ 128 error (EXIT_FAILURE, 0, gettext ("%s: INTERNAL ERROR %d (%s-%s): %s"), \ 129 fname, __LINE__, PACKAGE_VERSION, __DATE__, elf_errmsg (-1)) 130 131 132 /* Name of the output file. */ 133 static const char *output_fname; 134 135 /* Name of the debug output file. */ 136 static const char *debug_fname; 137 138 /* Name to pretend the debug output file has. */ 139 static const char *debug_fname_embed; 140 141 /* If true output files shall have same date as the input file. */ 142 static bool preserve_dates; 143 144 /* If true .comment sections will be removed. */ 145 static bool remove_comment; 146 147 /* If true remove all debug sections. */ 148 static bool remove_debug; 149 150 /* If true remove all section headers. */ 151 static bool remove_shdrs; 152 153 /* If true relax some ELF rules for input files. */ 154 static bool permissive; 155 156 /* If true perform relocations between debug sections. */ 157 static bool reloc_debug; 158 159 160 int 161 main (int argc, char *argv[]) 162 { 163 int remaining; 164 int result = 0; 165 166 /* Make memory leak detection possible. */ 167 mtrace (); 168 169 /* We use no threads here which can interfere with handling a stream. */ 170 __fsetlocking (stdin, FSETLOCKING_BYCALLER); 171 __fsetlocking (stdout, FSETLOCKING_BYCALLER); 172 __fsetlocking (stderr, FSETLOCKING_BYCALLER); 173 174 /* Set locale. */ 175 setlocale (LC_ALL, ""); 176 177 /* Make sure the message catalog can be found. */ 178 bindtextdomain (PACKAGE_TARNAME, LOCALEDIR); 179 180 /* Initialize the message catalog. */ 181 textdomain (PACKAGE_TARNAME); 182 183 /* Parse and process arguments. */ 184 if (argp_parse (&argp, argc, argv, 0, &remaining, NULL) != 0) 185 return EXIT_FAILURE; 186 187 if (reloc_debug && debug_fname == NULL) 188 error (EXIT_FAILURE, 0, 189 gettext ("--reloc-debug-sections used without -f")); 190 191 /* Tell the library which version we are expecting. */ 192 elf_version (EV_CURRENT); 193 194 if (remaining == argc) 195 /* The user didn't specify a name so we use a.out. */ 196 result = process_file ("a.out"); 197 else 198 { 199 /* If we have seen the '-o' or '-f' option there must be exactly one 200 input file. */ 201 if ((output_fname != NULL || debug_fname != NULL) 202 && remaining + 1 < argc) 203 error (EXIT_FAILURE, 0, gettext ("\ 204 Only one input file allowed together with '-o' and '-f'")); 205 206 /* Process all the remaining files. */ 207 do 208 result |= process_file (argv[remaining]); 209 while (++remaining < argc); 210 } 211 212 return result; 213 } 214 215 216 /* Print the version information. */ 217 static void 218 print_version (FILE *stream, struct argp_state *state __attribute__ ((unused))) 219 { 220 fprintf (stream, "strip (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION); 221 fprintf (stream, gettext ("\ 222 Copyright (C) %s Red Hat, Inc.\n\ 223 This is free software; see the source for copying conditions. There is NO\n\ 224 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ 225 "), "2012"); 226 fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper"); 227 } 228 229 230 /* Handle program arguments. */ 231 static error_t 232 parse_opt (int key, char *arg, struct argp_state *state) 233 { 234 switch (key) 235 { 236 case 'f': 237 if (debug_fname != NULL) 238 { 239 error (0, 0, gettext ("-f option specified twice")); 240 return EINVAL; 241 } 242 debug_fname = arg; 243 break; 244 245 case 'F': 246 if (debug_fname_embed != NULL) 247 { 248 error (0, 0, gettext ("-F option specified twice")); 249 return EINVAL; 250 } 251 debug_fname_embed = arg; 252 break; 253 254 case 'o': 255 if (output_fname != NULL) 256 { 257 error (0, 0, gettext ("-o option specified twice")); 258 return EINVAL; 259 } 260 output_fname = arg; 261 break; 262 263 case 'p': 264 preserve_dates = true; 265 break; 266 267 case OPT_RELOC_DEBUG: 268 reloc_debug = true; 269 break; 270 271 case OPT_REMOVE_COMMENT: 272 remove_comment = true; 273 break; 274 275 case 'R': 276 if (!strcmp (arg, ".comment")) 277 remove_comment = true; 278 else 279 { 280 argp_error (state, 281 gettext ("-R option supports only .comment section")); 282 return EINVAL; 283 } 284 break; 285 286 case 'g': 287 case 'd': 288 case 'S': 289 remove_debug = true; 290 break; 291 292 case OPT_STRIP_SECTIONS: 293 remove_shdrs = true; 294 break; 295 296 case OPT_PERMISSIVE: 297 permissive = true; 298 break; 299 300 case 's': /* Ignored for compatibility. */ 301 break; 302 303 default: 304 return ARGP_ERR_UNKNOWN; 305 } 306 return 0; 307 } 308 309 310 static int 311 process_file (const char *fname) 312 { 313 /* If we have to preserve the modify and access timestamps get them 314 now. We cannot use fstat() after opening the file since the open 315 would change the access time. */ 316 struct stat64 pre_st; 317 struct timeval tv[2]; 318 again: 319 if (preserve_dates) 320 { 321 if (stat64 (fname, &pre_st) != 0) 322 { 323 error (0, errno, gettext ("cannot stat input file '%s'"), fname); 324 return 1; 325 } 326 327 /* If we have to preserve the timestamp, we need it in the 328 format utimes() understands. */ 329 TIMESPEC_TO_TIMEVAL (&tv[0], &pre_st.st_atim); 330 TIMESPEC_TO_TIMEVAL (&tv[1], &pre_st.st_mtim); 331 } 332 333 /* Open the file. */ 334 int fd = open (fname, output_fname == NULL ? O_RDWR : O_RDONLY); 335 if (fd == -1) 336 { 337 error (0, errno, gettext ("while opening '%s'"), fname); 338 return 1; 339 } 340 341 /* We always use fstat() even if we called stat() before. This is 342 done to make sure the information returned by stat() is for the 343 same file. */ 344 struct stat64 st; 345 if (fstat64 (fd, &st) != 0) 346 { 347 error (0, errno, gettext ("cannot stat input file '%s'"), fname); 348 return 1; 349 } 350 /* Paranoid mode on. */ 351 if (preserve_dates 352 && (st.st_ino != pre_st.st_ino || st.st_dev != pre_st.st_dev)) 353 { 354 /* We detected a race. Try again. */ 355 close (fd); 356 goto again; 357 } 358 359 /* Now get the ELF descriptor. */ 360 Elf *elf = elf_begin (fd, output_fname == NULL ? ELF_C_RDWR : ELF_C_READ, 361 NULL); 362 int result; 363 switch (elf_kind (elf)) 364 { 365 case ELF_K_ELF: 366 result = handle_elf (fd, elf, NULL, fname, st.st_mode & ACCESSPERMS, 367 preserve_dates ? tv : NULL); 368 break; 369 370 case ELF_K_AR: 371 /* It is not possible to strip the content of an archive direct 372 the output to a specific file. */ 373 if (unlikely (output_fname != NULL || debug_fname != NULL)) 374 { 375 error (0, 0, gettext ("%s: cannot use -o or -f when stripping archive"), 376 fname); 377 result = 1; 378 } 379 else 380 result = handle_ar (fd, elf, NULL, fname, preserve_dates ? tv : NULL); 381 break; 382 383 default: 384 error (0, 0, gettext ("%s: File format not recognized"), fname); 385 result = 1; 386 break; 387 } 388 389 if (unlikely (elf_end (elf) != 0)) 390 INTERNAL_ERROR (fname); 391 392 close (fd); 393 394 return result; 395 } 396 397 398 /* Maximum size of array allocated on stack. */ 399 #define MAX_STACK_ALLOC (400 * 1024) 400 401 static int 402 handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, 403 mode_t mode, struct timeval tvp[2]) 404 { 405 size_t prefix_len = prefix == NULL ? 0 : strlen (prefix); 406 size_t fname_len = strlen (fname) + 1; 407 char *fullname = alloca (prefix_len + 1 + fname_len); 408 char *cp = fullname; 409 Elf *debugelf = NULL; 410 char *tmp_debug_fname = NULL; 411 int result = 0; 412 size_t shdridx = 0; 413 size_t shstrndx; 414 struct shdr_info 415 { 416 Elf_Scn *scn; 417 GElf_Shdr shdr; 418 Elf_Data *data; 419 Elf_Data *debug_data; 420 const char *name; 421 Elf32_Word idx; /* Index in new file. */ 422 Elf32_Word old_sh_link; /* Original value of shdr.sh_link. */ 423 Elf32_Word symtab_idx; 424 Elf32_Word version_idx; 425 Elf32_Word group_idx; 426 Elf32_Word group_cnt; 427 Elf_Scn *newscn; 428 struct Ebl_Strent *se; 429 Elf32_Word *newsymidx; 430 } *shdr_info = NULL; 431 Elf_Scn *scn; 432 size_t cnt; 433 size_t idx; 434 bool changes; 435 GElf_Ehdr newehdr_mem; 436 GElf_Ehdr *newehdr; 437 GElf_Ehdr debugehdr_mem; 438 GElf_Ehdr *debugehdr; 439 struct Ebl_Strtab *shst = NULL; 440 Elf_Data debuglink_crc_data; 441 bool any_symtab_changes = false; 442 Elf_Data *shstrtab_data = NULL; 443 444 /* Create the full name of the file. */ 445 if (prefix != NULL) 446 { 447 cp = mempcpy (cp, prefix, prefix_len); 448 *cp++ = ':'; 449 } 450 memcpy (cp, fname, fname_len); 451 452 /* If we are not replacing the input file open a new file here. */ 453 if (output_fname != NULL) 454 { 455 fd = open (output_fname, O_RDWR | O_CREAT, mode); 456 if (unlikely (fd == -1)) 457 { 458 error (0, errno, gettext ("cannot open '%s'"), output_fname); 459 return 1; 460 } 461 } 462 463 int debug_fd = -1; 464 465 /* Get the EBL handling. Removing all debugging symbols with the -g 466 option or resolving all relocations between debug sections with 467 the --reloc-debug-sections option are currently the only reasons 468 we need EBL so don't open the backend unless necessary. */ 469 Ebl *ebl = NULL; 470 if (remove_debug || reloc_debug) 471 { 472 ebl = ebl_openbackend (elf); 473 if (ebl == NULL) 474 { 475 error (0, errno, gettext ("cannot open EBL backend")); 476 result = 1; 477 goto fail; 478 } 479 } 480 481 /* Open the additional file the debug information will be stored in. */ 482 if (debug_fname != NULL) 483 { 484 /* Create a temporary file name. We do not want to overwrite 485 the debug file if the file would not contain any 486 information. */ 487 size_t debug_fname_len = strlen (debug_fname); 488 tmp_debug_fname = (char *) alloca (debug_fname_len + sizeof (".XXXXXX")); 489 strcpy (mempcpy (tmp_debug_fname, debug_fname, debug_fname_len), 490 ".XXXXXX"); 491 492 debug_fd = mkstemp (tmp_debug_fname); 493 if (unlikely (debug_fd == -1)) 494 { 495 error (0, errno, gettext ("cannot open '%s'"), debug_fname); 496 result = 1; 497 goto fail; 498 } 499 } 500 501 /* Get the information from the old file. */ 502 GElf_Ehdr ehdr_mem; 503 GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem); 504 if (ehdr == NULL) 505 INTERNAL_ERROR (fname); 506 507 /* Get the section header string table index. */ 508 if (unlikely (elf_getshdrstrndx (elf, &shstrndx) < 0)) 509 error (EXIT_FAILURE, 0, 510 gettext ("cannot get section header string table index")); 511 512 /* We now create a new ELF descriptor for the same file. We 513 construct it almost exactly in the same way with some information 514 dropped. */ 515 Elf *newelf; 516 if (output_fname != NULL) 517 newelf = elf_begin (fd, ELF_C_WRITE_MMAP, NULL); 518 else 519 newelf = elf_clone (elf, ELF_C_EMPTY); 520 521 if (unlikely (gelf_newehdr (newelf, gelf_getclass (elf)) == 0) 522 || (ehdr->e_type != ET_REL 523 && unlikely (gelf_newphdr (newelf, ehdr->e_phnum) == 0))) 524 { 525 error (0, 0, gettext ("cannot create new file '%s': %s"), 526 output_fname, elf_errmsg (-1)); 527 goto fail; 528 } 529 530 /* Copy over the old program header if needed. */ 531 if (ehdr->e_type != ET_REL) 532 for (cnt = 0; cnt < ehdr->e_phnum; ++cnt) 533 { 534 GElf_Phdr phdr_mem; 535 GElf_Phdr *phdr = gelf_getphdr (elf, cnt, &phdr_mem); 536 if (phdr == NULL 537 || unlikely (gelf_update_phdr (newelf, cnt, phdr) == 0)) 538 INTERNAL_ERROR (fname); 539 } 540 541 if (debug_fname != NULL) 542 { 543 /* Also create an ELF descriptor for the debug file */ 544 debugelf = elf_begin (debug_fd, ELF_C_WRITE_MMAP, NULL); 545 if (unlikely (gelf_newehdr (debugelf, gelf_getclass (elf)) == 0) 546 || (ehdr->e_type != ET_REL 547 && unlikely (gelf_newphdr (debugelf, ehdr->e_phnum) == 0))) 548 { 549 error (0, 0, gettext ("cannot create new file '%s': %s"), 550 debug_fname, elf_errmsg (-1)); 551 goto fail_close; 552 } 553 554 /* Copy over the old program header if needed. */ 555 if (ehdr->e_type != ET_REL) 556 for (cnt = 0; cnt < ehdr->e_phnum; ++cnt) 557 { 558 GElf_Phdr phdr_mem; 559 GElf_Phdr *phdr = gelf_getphdr (elf, cnt, &phdr_mem); 560 if (phdr == NULL 561 || unlikely (gelf_update_phdr (debugelf, cnt, phdr) == 0)) 562 INTERNAL_ERROR (fname); 563 } 564 } 565 566 /* Number of sections. */ 567 size_t shnum; 568 if (unlikely (elf_getshdrnum (elf, &shnum) < 0)) 569 { 570 error (0, 0, gettext ("cannot determine number of sections: %s"), 571 elf_errmsg (-1)); 572 goto fail_close; 573 } 574 575 /* Storage for section information. We leave room for two more 576 entries since we unconditionally create a section header string 577 table. Maybe some weird tool created an ELF file without one. 578 The other one is used for the debug link section. */ 579 if ((shnum + 2) * sizeof (struct shdr_info) > MAX_STACK_ALLOC) 580 shdr_info = (struct shdr_info *) xcalloc (shnum + 2, 581 sizeof (struct shdr_info)); 582 else 583 { 584 shdr_info = (struct shdr_info *) alloca ((shnum + 2) 585 * sizeof (struct shdr_info)); 586 memset (shdr_info, '\0', (shnum + 2) * sizeof (struct shdr_info)); 587 } 588 589 /* Prepare section information data structure. */ 590 scn = NULL; 591 cnt = 1; 592 while ((scn = elf_nextscn (elf, scn)) != NULL) 593 { 594 /* This should always be true (i.e., there should not be any 595 holes in the numbering). */ 596 assert (elf_ndxscn (scn) == cnt); 597 598 shdr_info[cnt].scn = scn; 599 600 /* Get the header. */ 601 if (gelf_getshdr (scn, &shdr_info[cnt].shdr) == NULL) 602 INTERNAL_ERROR (fname); 603 604 /* Get the name of the section. */ 605 shdr_info[cnt].name = elf_strptr (elf, shstrndx, 606 shdr_info[cnt].shdr.sh_name); 607 if (shdr_info[cnt].name == NULL) 608 { 609 error (0, 0, gettext ("illformed file '%s'"), fname); 610 goto fail_close; 611 } 612 613 /* Mark them as present but not yet investigated. */ 614 shdr_info[cnt].idx = 1; 615 616 /* Remember the shdr.sh_link value. */ 617 shdr_info[cnt].old_sh_link = shdr_info[cnt].shdr.sh_link; 618 619 /* Sections in files other than relocatable object files which 620 are not loaded can be freely moved by us. In relocatable 621 object files everything can be moved. */ 622 if (ehdr->e_type == ET_REL 623 || (shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) == 0) 624 shdr_info[cnt].shdr.sh_offset = 0; 625 626 /* If this is an extended section index table store an 627 appropriate reference. */ 628 if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB_SHNDX)) 629 { 630 assert (shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx == 0); 631 shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx = cnt; 632 } 633 else if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_GROUP)) 634 { 635 /* Cross-reference the sections contained in the section 636 group. */ 637 shdr_info[cnt].data = elf_getdata (shdr_info[cnt].scn, NULL); 638 if (shdr_info[cnt].data == NULL) 639 INTERNAL_ERROR (fname); 640 641 /* XXX Fix for unaligned access. */ 642 Elf32_Word *grpref = (Elf32_Word *) shdr_info[cnt].data->d_buf; 643 size_t inner; 644 for (inner = 1; 645 inner < shdr_info[cnt].data->d_size / sizeof (Elf32_Word); 646 ++inner) 647 shdr_info[grpref[inner]].group_idx = cnt; 648 649 if (inner == 1 || (inner == 2 && (grpref[0] & GRP_COMDAT) == 0)) 650 /* If the section group contains only one element and this 651 is n COMDAT section we can drop it right away. */ 652 shdr_info[cnt].idx = 0; 653 else 654 shdr_info[cnt].group_cnt = inner - 1; 655 } 656 else if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_GNU_versym)) 657 { 658 assert (shdr_info[shdr_info[cnt].shdr.sh_link].version_idx == 0); 659 shdr_info[shdr_info[cnt].shdr.sh_link].version_idx = cnt; 660 } 661 662 /* If this section is part of a group make sure it is not 663 discarded right away. */ 664 if ((shdr_info[cnt].shdr.sh_flags & SHF_GROUP) != 0) 665 { 666 assert (shdr_info[cnt].group_idx != 0); 667 668 if (shdr_info[shdr_info[cnt].group_idx].idx == 0) 669 { 670 /* The section group section will be removed. */ 671 shdr_info[cnt].group_idx = 0; 672 shdr_info[cnt].shdr.sh_flags &= ~SHF_GROUP; 673 } 674 } 675 676 /* Increment the counter. */ 677 ++cnt; 678 } 679 680 /* Now determine which sections can go away. The general rule is that 681 all sections which are not used at runtime are stripped out. But 682 there are a few exceptions: 683 684 - special sections named ".comment" and ".note" are kept 685 - OS or architecture specific sections are kept since we might not 686 know how to handle them 687 - if a section is referred to from a section which is not removed 688 in the sh_link or sh_info element it cannot be removed either 689 */ 690 for (cnt = 1; cnt < shnum; ++cnt) 691 /* Check whether the section can be removed. */ 692 if (remove_shdrs ? !(shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) 693 : ebl_section_strip_p (ebl, ehdr, &shdr_info[cnt].shdr, 694 shdr_info[cnt].name, remove_comment, 695 remove_debug)) 696 { 697 /* For now assume this section will be removed. */ 698 shdr_info[cnt].idx = 0; 699 700 idx = shdr_info[cnt].group_idx; 701 while (idx != 0) 702 { 703 /* The section group data is already loaded. */ 704 assert (shdr_info[idx].data != NULL); 705 706 /* If the references section group is a normal section 707 group and has one element remaining, or if it is an 708 empty COMDAT section group it is removed. */ 709 bool is_comdat = (((Elf32_Word *) shdr_info[idx].data->d_buf)[0] 710 & GRP_COMDAT) != 0; 711 712 --shdr_info[idx].group_cnt; 713 if ((!is_comdat && shdr_info[idx].group_cnt == 1) 714 || (is_comdat && shdr_info[idx].group_cnt == 0)) 715 { 716 shdr_info[idx].idx = 0; 717 /* Continue recursively. */ 718 idx = shdr_info[idx].group_idx; 719 } 720 else 721 break; 722 } 723 } 724 725 /* Mark the SHT_NULL section as handled. */ 726 shdr_info[0].idx = 2; 727 728 729 /* Handle exceptions: section groups and cross-references. We might 730 have to repeat this a few times since the resetting of the flag 731 might propagate. */ 732 do 733 { 734 changes = false; 735 736 for (cnt = 1; cnt < shnum; ++cnt) 737 { 738 if (shdr_info[cnt].idx == 0) 739 { 740 /* If a relocation section is marked as being removed make 741 sure the section it is relocating is removed, too. */ 742 if ((shdr_info[cnt].shdr.sh_type == SHT_REL 743 || shdr_info[cnt].shdr.sh_type == SHT_RELA) 744 && shdr_info[shdr_info[cnt].shdr.sh_info].idx != 0) 745 shdr_info[cnt].idx = 1; 746 747 /* If a group section is marked as being removed make 748 sure all the sections it contains are being removed, too. */ 749 if (shdr_info[cnt].shdr.sh_type == SHT_GROUP) 750 { 751 Elf32_Word *grpref; 752 grpref = (Elf32_Word *) shdr_info[cnt].data->d_buf; 753 for (size_t in = 1; 754 in < shdr_info[cnt].data->d_size / sizeof (Elf32_Word); 755 ++in) 756 if (shdr_info[grpref[in]].idx != 0) 757 { 758 shdr_info[cnt].idx = 1; 759 break; 760 } 761 } 762 } 763 764 if (shdr_info[cnt].idx == 1) 765 { 766 /* The content of symbol tables we don't remove must not 767 reference any section which we do remove. Otherwise 768 we cannot remove the section. */ 769 if (debug_fname != NULL 770 && shdr_info[cnt].debug_data == NULL 771 && (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM 772 || shdr_info[cnt].shdr.sh_type == SHT_SYMTAB)) 773 { 774 /* Make sure the data is loaded. */ 775 if (shdr_info[cnt].data == NULL) 776 { 777 shdr_info[cnt].data 778 = elf_getdata (shdr_info[cnt].scn, NULL); 779 if (shdr_info[cnt].data == NULL) 780 INTERNAL_ERROR (fname); 781 } 782 Elf_Data *symdata = shdr_info[cnt].data; 783 784 /* If there is an extended section index table load it 785 as well. */ 786 if (shdr_info[cnt].symtab_idx != 0 787 && shdr_info[shdr_info[cnt].symtab_idx].data == NULL) 788 { 789 assert (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB); 790 791 shdr_info[shdr_info[cnt].symtab_idx].data 792 = elf_getdata (shdr_info[shdr_info[cnt].symtab_idx].scn, 793 NULL); 794 if (shdr_info[shdr_info[cnt].symtab_idx].data == NULL) 795 INTERNAL_ERROR (fname); 796 } 797 Elf_Data *xndxdata 798 = shdr_info[shdr_info[cnt].symtab_idx].data; 799 800 /* Go through all symbols and make sure the section they 801 reference is not removed. */ 802 size_t elsize = gelf_fsize (elf, ELF_T_SYM, 1, 803 ehdr->e_version); 804 805 for (size_t inner = 0; 806 inner < shdr_info[cnt].data->d_size / elsize; 807 ++inner) 808 { 809 GElf_Sym sym_mem; 810 Elf32_Word xndx; 811 GElf_Sym *sym = gelf_getsymshndx (symdata, xndxdata, 812 inner, &sym_mem, 813 &xndx); 814 if (sym == NULL) 815 INTERNAL_ERROR (fname); 816 817 size_t scnidx = sym->st_shndx; 818 if (scnidx == SHN_UNDEF || scnidx >= shnum 819 || (scnidx >= SHN_LORESERVE 820 && scnidx <= SHN_HIRESERVE 821 && scnidx != SHN_XINDEX) 822 /* Don't count in the section symbols. */ 823 || GELF_ST_TYPE (sym->st_info) == STT_SECTION) 824 /* This is no section index, leave it alone. */ 825 continue; 826 else if (scnidx == SHN_XINDEX) 827 scnidx = xndx; 828 829 if (shdr_info[scnidx].idx == 0) 830 /* This symbol table has a real symbol in 831 a discarded section. So preserve the 832 original table in the debug file. */ 833 shdr_info[cnt].debug_data = symdata; 834 } 835 } 836 837 /* Cross referencing happens: 838 - for the cases the ELF specification says. That are 839 + SHT_DYNAMIC in sh_link to string table 840 + SHT_HASH in sh_link to symbol table 841 + SHT_REL and SHT_RELA in sh_link to symbol table 842 + SHT_SYMTAB and SHT_DYNSYM in sh_link to string table 843 + SHT_GROUP in sh_link to symbol table 844 + SHT_SYMTAB_SHNDX in sh_link to symbol table 845 Other (OS or architecture-specific) sections might as 846 well use this field so we process it unconditionally. 847 - references inside section groups 848 - specially marked references in sh_info if the SHF_INFO_LINK 849 flag is set 850 */ 851 852 if (shdr_info[shdr_info[cnt].shdr.sh_link].idx == 0) 853 { 854 shdr_info[shdr_info[cnt].shdr.sh_link].idx = 1; 855 changes |= shdr_info[cnt].shdr.sh_link < cnt; 856 } 857 858 /* Handle references through sh_info. */ 859 if (SH_INFO_LINK_P (&shdr_info[cnt].shdr) 860 && shdr_info[shdr_info[cnt].shdr.sh_info].idx == 0) 861 { 862 shdr_info[shdr_info[cnt].shdr.sh_info].idx = 1; 863 changes |= shdr_info[cnt].shdr.sh_info < cnt; 864 } 865 866 /* Mark the section as investigated. */ 867 shdr_info[cnt].idx = 2; 868 } 869 870 if (debug_fname != NULL 871 && (shdr_info[cnt].idx == 0 || shdr_info[cnt].debug_data != NULL)) 872 { 873 /* This section is being preserved in the debug file. 874 Sections it refers to must be preserved there too. 875 876 In this pass we mark sections to be preserved in both 877 files by setting the .debug_data pointer to the original 878 file's .data pointer. Below, we'll copy the section 879 contents. */ 880 881 inline void check_preserved (size_t i) 882 { 883 if (i != 0 && shdr_info[i].idx != 0 884 && shdr_info[i].debug_data == NULL) 885 { 886 if (shdr_info[i].data == NULL) 887 shdr_info[i].data = elf_getdata (shdr_info[i].scn, NULL); 888 if (shdr_info[i].data == NULL) 889 INTERNAL_ERROR (fname); 890 891 shdr_info[i].debug_data = shdr_info[i].data; 892 changes |= i < cnt; 893 } 894 } 895 896 check_preserved (shdr_info[cnt].shdr.sh_link); 897 if (SH_INFO_LINK_P (&shdr_info[cnt].shdr)) 898 check_preserved (shdr_info[cnt].shdr.sh_info); 899 } 900 } 901 } 902 while (changes); 903 904 /* Copy the removed sections to the debug output file. 905 The ones that are not removed in the stripped file are SHT_NOBITS. */ 906 if (debug_fname != NULL) 907 { 908 for (cnt = 1; cnt < shnum; ++cnt) 909 { 910 scn = elf_newscn (debugelf); 911 if (scn == NULL) 912 error (EXIT_FAILURE, 0, 913 gettext ("while generating output file: %s"), 914 elf_errmsg (-1)); 915 916 bool discard_section = (shdr_info[cnt].idx > 0 917 && shdr_info[cnt].debug_data == NULL 918 && shdr_info[cnt].shdr.sh_type != SHT_NOTE 919 && shdr_info[cnt].shdr.sh_type != SHT_GROUP 920 && cnt != ehdr->e_shstrndx); 921 922 /* Set the section header in the new file. */ 923 GElf_Shdr debugshdr = shdr_info[cnt].shdr; 924 if (discard_section) 925 debugshdr.sh_type = SHT_NOBITS; 926 927 if (unlikely (gelf_update_shdr (scn, &debugshdr) == 0)) 928 /* There cannot be any overflows. */ 929 INTERNAL_ERROR (fname); 930 931 /* Get the data from the old file if necessary. */ 932 if (shdr_info[cnt].data == NULL) 933 { 934 shdr_info[cnt].data = elf_getdata (shdr_info[cnt].scn, NULL); 935 if (shdr_info[cnt].data == NULL) 936 INTERNAL_ERROR (fname); 937 } 938 939 /* Set the data. This is done by copying from the old file. */ 940 Elf_Data *debugdata = elf_newdata (scn); 941 if (debugdata == NULL) 942 INTERNAL_ERROR (fname); 943 944 /* Copy the structure. This data may be modified in place 945 before we write out the file. */ 946 *debugdata = *shdr_info[cnt].data; 947 if (discard_section) 948 debugdata->d_buf = NULL; 949 else if (shdr_info[cnt].debug_data != NULL 950 || shdr_info[cnt].shdr.sh_type == SHT_GROUP) 951 { 952 /* Copy the original data before it gets modified. */ 953 shdr_info[cnt].debug_data = debugdata; 954 debugdata->d_buf = memcpy (xmalloc (debugdata->d_size), 955 debugdata->d_buf, debugdata->d_size); 956 } 957 } 958 959 /* Finish the ELF header. Fill in the fields not handled by 960 libelf from the old file. */ 961 debugehdr = gelf_getehdr (debugelf, &debugehdr_mem); 962 if (debugehdr == NULL) 963 INTERNAL_ERROR (fname); 964 965 memcpy (debugehdr->e_ident, ehdr->e_ident, EI_NIDENT); 966 debugehdr->e_type = ehdr->e_type; 967 debugehdr->e_machine = ehdr->e_machine; 968 debugehdr->e_version = ehdr->e_version; 969 debugehdr->e_entry = ehdr->e_entry; 970 debugehdr->e_flags = ehdr->e_flags; 971 debugehdr->e_shstrndx = ehdr->e_shstrndx; 972 973 if (unlikely (gelf_update_ehdr (debugelf, debugehdr) == 0)) 974 { 975 error (0, 0, gettext ("%s: error while creating ELF header: %s"), 976 debug_fname, elf_errmsg (-1)); 977 result = 1; 978 goto fail_close; 979 } 980 } 981 982 /* Mark the section header string table as unused, we will create 983 a new one. */ 984 shdr_info[shstrndx].idx = 0; 985 986 /* We need a string table for the section headers. */ 987 shst = ebl_strtabinit (true); 988 if (shst == NULL) 989 error (EXIT_FAILURE, errno, gettext ("while preparing output for '%s'"), 990 output_fname ?: fname); 991 992 /* Assign new section numbers. */ 993 shdr_info[0].idx = 0; 994 for (cnt = idx = 1; cnt < shnum; ++cnt) 995 if (shdr_info[cnt].idx > 0) 996 { 997 shdr_info[cnt].idx = idx++; 998 999 /* Create a new section. */ 1000 shdr_info[cnt].newscn = elf_newscn (newelf); 1001 if (shdr_info[cnt].newscn == NULL) 1002 error (EXIT_FAILURE, 0, gettext ("while generating output file: %s"), 1003 elf_errmsg (-1)); 1004 1005 assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx); 1006 1007 /* Add this name to the section header string table. */ 1008 shdr_info[cnt].se = ebl_strtabadd (shst, shdr_info[cnt].name, 0); 1009 } 1010 1011 /* Test whether we are doing anything at all. */ 1012 if (cnt == idx) 1013 /* Nope, all removable sections are already gone. */ 1014 goto fail_close; 1015 1016 /* Create the reference to the file with the debug info. */ 1017 if (debug_fname != NULL && !remove_shdrs) 1018 { 1019 /* Add the section header string table section name. */ 1020 shdr_info[cnt].se = ebl_strtabadd (shst, ".gnu_debuglink", 15); 1021 shdr_info[cnt].idx = idx++; 1022 1023 /* Create the section header. */ 1024 shdr_info[cnt].shdr.sh_type = SHT_PROGBITS; 1025 shdr_info[cnt].shdr.sh_flags = 0; 1026 shdr_info[cnt].shdr.sh_addr = 0; 1027 shdr_info[cnt].shdr.sh_link = SHN_UNDEF; 1028 shdr_info[cnt].shdr.sh_info = SHN_UNDEF; 1029 shdr_info[cnt].shdr.sh_entsize = 0; 1030 shdr_info[cnt].shdr.sh_addralign = 4; 1031 /* We set the offset to zero here. Before we write the ELF file the 1032 field must have the correct value. This is done in the final 1033 loop over all section. Then we have all the information needed. */ 1034 shdr_info[cnt].shdr.sh_offset = 0; 1035 1036 /* Create the section. */ 1037 shdr_info[cnt].newscn = elf_newscn (newelf); 1038 if (shdr_info[cnt].newscn == NULL) 1039 error (EXIT_FAILURE, 0, 1040 gettext ("while create section header section: %s"), 1041 elf_errmsg (-1)); 1042 assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx); 1043 1044 shdr_info[cnt].data = elf_newdata (shdr_info[cnt].newscn); 1045 if (shdr_info[cnt].data == NULL) 1046 error (EXIT_FAILURE, 0, gettext ("cannot allocate section data: %s"), 1047 elf_errmsg (-1)); 1048 1049 char *debug_basename = basename (debug_fname_embed ?: debug_fname); 1050 off_t crc_offset = strlen (debug_basename) + 1; 1051 /* Align to 4 byte boundary */ 1052 crc_offset = ((crc_offset - 1) & ~3) + 4; 1053 1054 shdr_info[cnt].data->d_align = 4; 1055 shdr_info[cnt].shdr.sh_size = shdr_info[cnt].data->d_size 1056 = crc_offset + 4; 1057 shdr_info[cnt].data->d_buf = xcalloc (1, shdr_info[cnt].data->d_size); 1058 1059 strcpy (shdr_info[cnt].data->d_buf, debug_basename); 1060 1061 /* Cache this Elf_Data describing the CRC32 word in the section. 1062 We'll fill this in when we have written the debug file. */ 1063 debuglink_crc_data = *shdr_info[cnt].data; 1064 debuglink_crc_data.d_buf = ((char *) debuglink_crc_data.d_buf 1065 + crc_offset); 1066 debuglink_crc_data.d_size = 4; 1067 1068 /* One more section done. */ 1069 ++cnt; 1070 } 1071 1072 /* Index of the section header table in the shdr_info array. */ 1073 shdridx = cnt; 1074 1075 /* Add the section header string table section name. */ 1076 shdr_info[cnt].se = ebl_strtabadd (shst, ".shstrtab", 10); 1077 shdr_info[cnt].idx = idx; 1078 1079 /* Create the section header. */ 1080 shdr_info[cnt].shdr.sh_type = SHT_STRTAB; 1081 shdr_info[cnt].shdr.sh_flags = 0; 1082 shdr_info[cnt].shdr.sh_addr = 0; 1083 shdr_info[cnt].shdr.sh_link = SHN_UNDEF; 1084 shdr_info[cnt].shdr.sh_info = SHN_UNDEF; 1085 shdr_info[cnt].shdr.sh_entsize = 0; 1086 /* We set the offset to zero here. Before we write the ELF file the 1087 field must have the correct value. This is done in the final 1088 loop over all section. Then we have all the information needed. */ 1089 shdr_info[cnt].shdr.sh_offset = 0; 1090 shdr_info[cnt].shdr.sh_addralign = 1; 1091 1092 /* Create the section. */ 1093 shdr_info[cnt].newscn = elf_newscn (newelf); 1094 if (shdr_info[cnt].newscn == NULL) 1095 error (EXIT_FAILURE, 0, 1096 gettext ("while create section header section: %s"), 1097 elf_errmsg (-1)); 1098 assert (elf_ndxscn (shdr_info[cnt].newscn) == idx); 1099 1100 /* Finalize the string table and fill in the correct indices in the 1101 section headers. */ 1102 shstrtab_data = elf_newdata (shdr_info[cnt].newscn); 1103 if (shstrtab_data == NULL) 1104 error (EXIT_FAILURE, 0, 1105 gettext ("while create section header string table: %s"), 1106 elf_errmsg (-1)); 1107 ebl_strtabfinalize (shst, shstrtab_data); 1108 1109 /* We have to set the section size. */ 1110 shdr_info[cnt].shdr.sh_size = shstrtab_data->d_size; 1111 1112 /* Update the section information. */ 1113 GElf_Off lastoffset = 0; 1114 for (cnt = 1; cnt <= shdridx; ++cnt) 1115 if (shdr_info[cnt].idx > 0) 1116 { 1117 Elf_Data *newdata; 1118 1119 scn = elf_getscn (newelf, shdr_info[cnt].idx); 1120 assert (scn != NULL); 1121 1122 /* Update the name. */ 1123 shdr_info[cnt].shdr.sh_name = ebl_strtaboffset (shdr_info[cnt].se); 1124 1125 /* Update the section header from the input file. Some fields 1126 might be section indeces which now have to be adjusted. */ 1127 if (shdr_info[cnt].shdr.sh_link != 0) 1128 shdr_info[cnt].shdr.sh_link = 1129 shdr_info[shdr_info[cnt].shdr.sh_link].idx; 1130 1131 if (shdr_info[cnt].shdr.sh_type == SHT_GROUP) 1132 { 1133 assert (shdr_info[cnt].data != NULL); 1134 1135 Elf32_Word *grpref = (Elf32_Word *) shdr_info[cnt].data->d_buf; 1136 for (size_t inner = 0; 1137 inner < shdr_info[cnt].data->d_size / sizeof (Elf32_Word); 1138 ++inner) 1139 grpref[inner] = shdr_info[grpref[inner]].idx; 1140 } 1141 1142 /* Handle the SHT_REL, SHT_RELA, and SHF_INFO_LINK flag. */ 1143 if (SH_INFO_LINK_P (&shdr_info[cnt].shdr)) 1144 shdr_info[cnt].shdr.sh_info = 1145 shdr_info[shdr_info[cnt].shdr.sh_info].idx; 1146 1147 /* Get the data from the old file if necessary. We already 1148 created the data for the section header string table. */ 1149 if (cnt < shnum) 1150 { 1151 if (shdr_info[cnt].data == NULL) 1152 { 1153 shdr_info[cnt].data = elf_getdata (shdr_info[cnt].scn, NULL); 1154 if (shdr_info[cnt].data == NULL) 1155 INTERNAL_ERROR (fname); 1156 } 1157 1158 /* Set the data. This is done by copying from the old file. */ 1159 newdata = elf_newdata (scn); 1160 if (newdata == NULL) 1161 INTERNAL_ERROR (fname); 1162 1163 /* Copy the structure. */ 1164 *newdata = *shdr_info[cnt].data; 1165 1166 /* We know the size. */ 1167 shdr_info[cnt].shdr.sh_size = shdr_info[cnt].data->d_size; 1168 1169 /* We have to adjust symbol tables. The st_shndx member might 1170 have to be updated. */ 1171 if (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM 1172 || shdr_info[cnt].shdr.sh_type == SHT_SYMTAB) 1173 { 1174 Elf_Data *versiondata = NULL; 1175 Elf_Data *shndxdata = NULL; 1176 1177 size_t elsize = gelf_fsize (elf, ELF_T_SYM, 1, 1178 ehdr->e_version); 1179 1180 if (shdr_info[cnt].symtab_idx != 0) 1181 { 1182 assert (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB_SHNDX); 1183 /* This section has extended section information. 1184 We have to modify that information, too. */ 1185 shndxdata = elf_getdata (shdr_info[shdr_info[cnt].symtab_idx].scn, 1186 NULL); 1187 1188 assert ((versiondata->d_size / sizeof (Elf32_Word)) 1189 >= shdr_info[cnt].data->d_size / elsize); 1190 } 1191 1192 if (shdr_info[cnt].version_idx != 0) 1193 { 1194 assert (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM); 1195 /* This section has associated version 1196 information. We have to modify that 1197 information, too. */ 1198 versiondata = elf_getdata (shdr_info[shdr_info[cnt].version_idx].scn, 1199 NULL); 1200 1201 assert ((versiondata->d_size / sizeof (GElf_Versym)) 1202 >= shdr_info[cnt].data->d_size / elsize); 1203 } 1204 1205 shdr_info[cnt].newsymidx 1206 = (Elf32_Word *) xcalloc (shdr_info[cnt].data->d_size 1207 / elsize, sizeof (Elf32_Word)); 1208 1209 bool last_was_local = true; 1210 size_t destidx; 1211 size_t inner; 1212 for (destidx = inner = 1; 1213 inner < shdr_info[cnt].data->d_size / elsize; 1214 ++inner) 1215 { 1216 Elf32_Word sec; 1217 GElf_Sym sym_mem; 1218 Elf32_Word xshndx; 1219 GElf_Sym *sym = gelf_getsymshndx (shdr_info[cnt].data, 1220 shndxdata, inner, 1221 &sym_mem, &xshndx); 1222 if (sym == NULL) 1223 INTERNAL_ERROR (fname); 1224 1225 if (sym->st_shndx == SHN_UNDEF 1226 || (sym->st_shndx >= shnum 1227 && sym->st_shndx != SHN_XINDEX)) 1228 { 1229 /* This is no section index, leave it alone 1230 unless it is moved. */ 1231 if (destidx != inner 1232 && gelf_update_symshndx (shdr_info[cnt].data, 1233 shndxdata, 1234 destidx, sym, 1235 xshndx) == 0) 1236 INTERNAL_ERROR (fname); 1237 1238 shdr_info[cnt].newsymidx[inner] = destidx++; 1239 1240 if (last_was_local 1241 && GELF_ST_BIND (sym->st_info) != STB_LOCAL) 1242 { 1243 last_was_local = false; 1244 shdr_info[cnt].shdr.sh_info = destidx - 1; 1245 } 1246 1247 continue; 1248 } 1249 1250 /* Get the full section index, if necessary from the 1251 XINDEX table. */ 1252 if (sym->st_shndx != SHN_XINDEX) 1253 sec = shdr_info[sym->st_shndx].idx; 1254 else 1255 { 1256 assert (shndxdata != NULL); 1257 1258 sec = shdr_info[xshndx].idx; 1259 } 1260 1261 if (sec != 0) 1262 { 1263 GElf_Section nshndx; 1264 Elf32_Word nxshndx; 1265 1266 if (sec < SHN_LORESERVE) 1267 { 1268 nshndx = sec; 1269 nxshndx = 0; 1270 } 1271 else 1272 { 1273 nshndx = SHN_XINDEX; 1274 nxshndx = sec; 1275 } 1276 1277 assert (sec < SHN_LORESERVE || shndxdata != NULL); 1278 1279 if ((inner != destidx || nshndx != sym->st_shndx 1280 || (shndxdata != NULL && nxshndx != xshndx)) 1281 && (sym->st_shndx = nshndx, 1282 gelf_update_symshndx (shdr_info[cnt].data, 1283 shndxdata, 1284 destidx, sym, 1285 nxshndx) == 0)) 1286 INTERNAL_ERROR (fname); 1287 1288 shdr_info[cnt].newsymidx[inner] = destidx++; 1289 1290 if (last_was_local 1291 && GELF_ST_BIND (sym->st_info) != STB_LOCAL) 1292 { 1293 last_was_local = false; 1294 shdr_info[cnt].shdr.sh_info = destidx - 1; 1295 } 1296 } 1297 else if (debug_fname == NULL 1298 || shdr_info[cnt].debug_data == NULL) 1299 /* This is a section or group signature symbol 1300 for a section which has been removed. */ 1301 { 1302 size_t sidx = (sym->st_shndx != SHN_XINDEX 1303 ? sym->st_shndx : xshndx); 1304 assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION 1305 || (shdr_info[sidx].shdr.sh_type == SHT_GROUP 1306 && shdr_info[sidx].shdr.sh_info == inner)); 1307 } 1308 } 1309 1310 if (destidx != inner) 1311 { 1312 /* The size of the symbol table changed. */ 1313 shdr_info[cnt].shdr.sh_size = newdata->d_size 1314 = destidx * elsize; 1315 any_symtab_changes = true; 1316 } 1317 else 1318 { 1319 /* The symbol table didn't really change. */ 1320 free (shdr_info[cnt].newsymidx); 1321 shdr_info[cnt].newsymidx = NULL; 1322 } 1323 } 1324 } 1325 1326 /* If we have to, compute the offset of the section. */ 1327 if (shdr_info[cnt].shdr.sh_offset == 0) 1328 shdr_info[cnt].shdr.sh_offset 1329 = ((lastoffset + shdr_info[cnt].shdr.sh_addralign - 1) 1330 & ~((GElf_Off) (shdr_info[cnt].shdr.sh_addralign - 1))); 1331 1332 /* Set the section header in the new file. */ 1333 if (unlikely (gelf_update_shdr (scn, &shdr_info[cnt].shdr) == 0)) 1334 /* There cannot be any overflows. */ 1335 INTERNAL_ERROR (fname); 1336 1337 /* Remember the last section written so far. */ 1338 GElf_Off filesz = (shdr_info[cnt].shdr.sh_type != SHT_NOBITS 1339 ? shdr_info[cnt].shdr.sh_size : 0); 1340 if (lastoffset < shdr_info[cnt].shdr.sh_offset + filesz) 1341 lastoffset = shdr_info[cnt].shdr.sh_offset + filesz; 1342 } 1343 1344 /* Adjust symbol references if symbol tables changed. */ 1345 if (any_symtab_changes) 1346 /* Find all relocation sections which use this symbol table. */ 1347 for (cnt = 1; cnt <= shdridx; ++cnt) 1348 { 1349 /* Update section headers when the data size has changed. 1350 We also update the SHT_NOBITS section in the debug 1351 file so that the section headers match in sh_size. */ 1352 inline void update_section_size (const Elf_Data *newdata) 1353 { 1354 GElf_Shdr shdr_mem; 1355 GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); 1356 shdr->sh_size = newdata->d_size; 1357 (void) gelf_update_shdr (scn, shdr); 1358 if (debugelf != NULL) 1359 { 1360 /* libelf will use d_size to set sh_size. */ 1361 Elf_Data *debugdata = elf_getdata (elf_getscn (debugelf, 1362 cnt), NULL); 1363 debugdata->d_size = newdata->d_size; 1364 } 1365 } 1366 1367 if (shdr_info[cnt].idx == 0 && debug_fname == NULL) 1368 /* Ignore sections which are discarded. When we are saving a 1369 relocation section in a separate debug file, we must fix up 1370 the symbol table references. */ 1371 continue; 1372 1373 const Elf32_Word symtabidx = shdr_info[cnt].old_sh_link; 1374 const Elf32_Word *const newsymidx = shdr_info[symtabidx].newsymidx; 1375 switch (shdr_info[cnt].shdr.sh_type) 1376 { 1377 inline bool no_symtab_updates (void) 1378 { 1379 /* If the symbol table hasn't changed, do not do anything. */ 1380 if (shdr_info[symtabidx].newsymidx == NULL) 1381 return true; 1382 1383 /* If the symbol table is not discarded, but additionally 1384 duplicated in the separate debug file and this section 1385 is discarded, don't adjust anything. */ 1386 return (shdr_info[cnt].idx == 0 1387 && shdr_info[symtabidx].debug_data != NULL); 1388 } 1389 1390 case SHT_REL: 1391 case SHT_RELA: 1392 if (no_symtab_updates ()) 1393 break; 1394 1395 Elf_Data *d = elf_getdata (shdr_info[cnt].idx == 0 1396 ? elf_getscn (debugelf, cnt) 1397 : elf_getscn (newelf, 1398 shdr_info[cnt].idx), 1399 NULL); 1400 assert (d != NULL); 1401 size_t nrels = (shdr_info[cnt].shdr.sh_size 1402 / shdr_info[cnt].shdr.sh_entsize); 1403 1404 if (shdr_info[cnt].shdr.sh_type == SHT_REL) 1405 for (size_t relidx = 0; relidx < nrels; ++relidx) 1406 { 1407 GElf_Rel rel_mem; 1408 if (gelf_getrel (d, relidx, &rel_mem) == NULL) 1409 INTERNAL_ERROR (fname); 1410 1411 size_t symidx = GELF_R_SYM (rel_mem.r_info); 1412 if (newsymidx[symidx] != symidx) 1413 { 1414 rel_mem.r_info 1415 = GELF_R_INFO (newsymidx[symidx], 1416 GELF_R_TYPE (rel_mem.r_info)); 1417 1418 if (gelf_update_rel (d, relidx, &rel_mem) == 0) 1419 INTERNAL_ERROR (fname); 1420 } 1421 } 1422 else 1423 for (size_t relidx = 0; relidx < nrels; ++relidx) 1424 { 1425 GElf_Rela rel_mem; 1426 if (gelf_getrela (d, relidx, &rel_mem) == NULL) 1427 INTERNAL_ERROR (fname); 1428 1429 size_t symidx = GELF_R_SYM (rel_mem.r_info); 1430 if (newsymidx[symidx] != symidx) 1431 { 1432 rel_mem.r_info 1433 = GELF_R_INFO (newsymidx[symidx], 1434 GELF_R_TYPE (rel_mem.r_info)); 1435 1436 if (gelf_update_rela (d, relidx, &rel_mem) == 0) 1437 INTERNAL_ERROR (fname); 1438 } 1439 } 1440 break; 1441 1442 case SHT_HASH: 1443 if (no_symtab_updates ()) 1444 break; 1445 1446 /* We have to recompute the hash table. */ 1447 1448 assert (shdr_info[cnt].idx > 0); 1449 1450 /* The hash section in the new file. */ 1451 scn = elf_getscn (newelf, shdr_info[cnt].idx); 1452 1453 /* The symbol table data. */ 1454 Elf_Data *symd = elf_getdata (elf_getscn (newelf, 1455 shdr_info[symtabidx].idx), 1456 NULL); 1457 assert (symd != NULL); 1458 1459 /* The hash table data. */ 1460 Elf_Data *hashd = elf_getdata (scn, NULL); 1461 assert (hashd != NULL); 1462 1463 if (shdr_info[cnt].shdr.sh_entsize == sizeof (Elf32_Word)) 1464 { 1465 /* Sane arches first. */ 1466 Elf32_Word *bucket = (Elf32_Word *) hashd->d_buf; 1467 1468 size_t strshndx = shdr_info[symtabidx].old_sh_link; 1469 size_t elsize = gelf_fsize (elf, ELF_T_SYM, 1, 1470 ehdr->e_version); 1471 1472 /* Adjust the nchain value. The symbol table size 1473 changed. We keep the same size for the bucket array. */ 1474 bucket[1] = symd->d_size / elsize; 1475 Elf32_Word nbucket = bucket[0]; 1476 bucket += 2; 1477 Elf32_Word *chain = bucket + nbucket; 1478 1479 /* New size of the section. */ 1480 hashd->d_size = ((2 + symd->d_size / elsize + nbucket) 1481 * sizeof (Elf32_Word)); 1482 update_section_size (hashd); 1483 1484 /* Clear the arrays. */ 1485 memset (bucket, '\0', 1486 (symd->d_size / elsize + nbucket) 1487 * sizeof (Elf32_Word)); 1488 1489 for (size_t inner = shdr_info[symtabidx].shdr.sh_info; 1490 inner < symd->d_size / elsize; ++inner) 1491 { 1492 GElf_Sym sym_mem; 1493 GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem); 1494 assert (sym != NULL); 1495 1496 const char *name = elf_strptr (elf, strshndx, 1497 sym->st_name); 1498 assert (name != NULL); 1499 size_t hidx = elf_hash (name) % nbucket; 1500 1501 if (bucket[hidx] == 0) 1502 bucket[hidx] = inner; 1503 else 1504 { 1505 hidx = bucket[hidx]; 1506 1507 while (chain[hidx] != 0) 1508 hidx = chain[hidx]; 1509 1510 chain[hidx] = inner; 1511 } 1512 } 1513 } 1514 else 1515 { 1516 /* Alpha and S390 64-bit use 64-bit SHT_HASH entries. */ 1517 assert (shdr_info[cnt].shdr.sh_entsize 1518 == sizeof (Elf64_Xword)); 1519 1520 Elf64_Xword *bucket = (Elf64_Xword *) hashd->d_buf; 1521 1522 size_t strshndx = shdr_info[symtabidx].old_sh_link; 1523 size_t elsize = gelf_fsize (elf, ELF_T_SYM, 1, 1524 ehdr->e_version); 1525 1526 /* Adjust the nchain value. The symbol table size 1527 changed. We keep the same size for the bucket array. */ 1528 bucket[1] = symd->d_size / elsize; 1529 Elf64_Xword nbucket = bucket[0]; 1530 bucket += 2; 1531 Elf64_Xword *chain = bucket + nbucket; 1532 1533 /* New size of the section. */ 1534 hashd->d_size = ((2 + symd->d_size / elsize + nbucket) 1535 * sizeof (Elf64_Xword)); 1536 update_section_size (hashd); 1537 1538 /* Clear the arrays. */ 1539 memset (bucket, '\0', 1540 (symd->d_size / elsize + nbucket) 1541 * sizeof (Elf64_Xword)); 1542 1543 for (size_t inner = shdr_info[symtabidx].shdr.sh_info; 1544 inner < symd->d_size / elsize; ++inner) 1545 { 1546 GElf_Sym sym_mem; 1547 GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem); 1548 assert (sym != NULL); 1549 1550 const char *name = elf_strptr (elf, strshndx, 1551 sym->st_name); 1552 assert (name != NULL); 1553 size_t hidx = elf_hash (name) % nbucket; 1554 1555 if (bucket[hidx] == 0) 1556 bucket[hidx] = inner; 1557 else 1558 { 1559 hidx = bucket[hidx]; 1560 1561 while (chain[hidx] != 0) 1562 hidx = chain[hidx]; 1563 1564 chain[hidx] = inner; 1565 } 1566 } 1567 } 1568 break; 1569 1570 case SHT_GNU_versym: 1571 /* If the symbol table changed we have to adjust the entries. */ 1572 if (no_symtab_updates ()) 1573 break; 1574 1575 assert (shdr_info[cnt].idx > 0); 1576 1577 /* The symbol version section in the new file. */ 1578 scn = elf_getscn (newelf, shdr_info[cnt].idx); 1579 1580 /* The symbol table data. */ 1581 symd = elf_getdata (elf_getscn (newelf, shdr_info[symtabidx].idx), 1582 NULL); 1583 assert (symd != NULL); 1584 1585 /* The version symbol data. */ 1586 Elf_Data *verd = elf_getdata (scn, NULL); 1587 assert (verd != NULL); 1588 1589 /* The symbol version array. */ 1590 GElf_Half *verstab = (GElf_Half *) verd->d_buf; 1591 1592 /* Walk through the list and */ 1593 size_t elsize = gelf_fsize (elf, verd->d_type, 1, 1594 ehdr->e_version); 1595 for (size_t inner = 1; inner < verd->d_size / elsize; ++inner) 1596 if (newsymidx[inner] != 0) 1597 /* Overwriting the same array works since the 1598 reordering can only move entries to lower indices 1599 in the array. */ 1600 verstab[newsymidx[inner]] = verstab[inner]; 1601 1602 /* New size of the section. */ 1603 verd->d_size = gelf_fsize (newelf, verd->d_type, 1604 symd->d_size 1605 / gelf_fsize (elf, symd->d_type, 1, 1606 ehdr->e_version), 1607 ehdr->e_version); 1608 update_section_size (verd); 1609 break; 1610 1611 case SHT_GROUP: 1612 if (no_symtab_updates ()) 1613 break; 1614 1615 /* Yes, the symbol table changed. 1616 Update the section header of the section group. */ 1617 scn = elf_getscn (newelf, shdr_info[cnt].idx); 1618 GElf_Shdr shdr_mem; 1619 GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); 1620 assert (shdr != NULL); 1621 1622 shdr->sh_info = newsymidx[shdr->sh_info]; 1623 1624 (void) gelf_update_shdr (scn, shdr); 1625 break; 1626 } 1627 } 1628 1629 /* Remove any relocations between debug sections in ET_REL 1630 for the debug file when requested. These relocations are always 1631 zero based between the unallocated sections. */ 1632 if (debug_fname != NULL && reloc_debug && ehdr->e_type == ET_REL) 1633 { 1634 scn = NULL; 1635 cnt = 0; 1636 while ((scn = elf_nextscn (debugelf, scn)) != NULL) 1637 { 1638 cnt++; 1639 /* We need the actual section and header from the debugelf 1640 not just the cached original in shdr_info because we 1641 might want to change the size. */ 1642 GElf_Shdr shdr_mem; 1643 GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); 1644 if (shdr->sh_type == SHT_REL || shdr->sh_type == SHT_RELA) 1645 { 1646 /* Make sure that this relocation section points to a 1647 section to relocate with contents, that isn't 1648 allocated and that is a debug section. */ 1649 Elf_Scn *tscn = elf_getscn (debugelf, shdr->sh_info); 1650 GElf_Shdr tshdr_mem; 1651 GElf_Shdr *tshdr = gelf_getshdr (tscn, &tshdr_mem); 1652 if (tshdr->sh_type == SHT_NOBITS 1653 || tshdr->sh_size == 0 1654 || (tshdr->sh_flags & SHF_ALLOC) != 0) 1655 continue; 1656 1657 const char *tname = elf_strptr (debugelf, shstrndx, 1658 tshdr->sh_name); 1659 if (! tname || ! ebl_debugscn_p (ebl, tname)) 1660 continue; 1661 1662 /* OK, lets relocate all trivial cross debug section 1663 relocations. */ 1664 Elf_Data *reldata = elf_getdata (scn, NULL); 1665 /* We actually wanted the rawdata, but since we already 1666 accessed it earlier as elf_getdata () that won't 1667 work. But debug sections are all ELF_T_BYTE, so it 1668 doesn't really matter. */ 1669 Elf_Data *tdata = elf_getdata (tscn, NULL); 1670 if (tdata->d_type != ELF_T_BYTE) 1671 INTERNAL_ERROR (fname); 1672 1673 /* Pick up the symbol table and shndx table to 1674 resolve relocation symbol indexes. */ 1675 Elf64_Word symt = shdr->sh_link; 1676 Elf_Data *symdata, *xndxdata; 1677 symdata = (shdr_info[symt].debug_data 1678 ?: shdr_info[symt].data); 1679 xndxdata = (shdr_info[shdr_info[symt].symtab_idx].debug_data 1680 ?: shdr_info[shdr_info[symt].symtab_idx].data); 1681 1682 /* Apply one relocation. Returns true when trivial 1683 relocation actually done. */ 1684 bool relocate (GElf_Addr offset, const GElf_Sxword addend, 1685 bool is_rela, int rtype, int symndx) 1686 { 1687 /* R_*_NONE relocs can always just be removed. */ 1688 if (rtype == 0) 1689 return true; 1690 1691 /* We only do simple absolute relocations. */ 1692 Elf_Type type = ebl_reloc_simple_type (ebl, rtype); 1693 if (type == ELF_T_NUM) 1694 return false; 1695 1696 /* These are the types we can relocate. */ 1697 #define TYPES DO_TYPE (BYTE, Byte); DO_TYPE (HALF, Half); \ 1698 DO_TYPE (WORD, Word); DO_TYPE (SWORD, Sword); \ 1699 DO_TYPE (XWORD, Xword); DO_TYPE (SXWORD, Sxword) 1700 1701 /* And only for relocations against other debug sections. */ 1702 GElf_Sym sym_mem; 1703 Elf32_Word xndx; 1704 GElf_Sym *sym = gelf_getsymshndx (symdata, xndxdata, 1705 symndx, &sym_mem, 1706 &xndx); 1707 Elf32_Word sec = (sym->st_shndx == SHN_XINDEX 1708 ? xndx : sym->st_shndx); 1709 if (ebl_debugscn_p (ebl, shdr_info[sec].name)) 1710 { 1711 size_t size; 1712 1713 #define DO_TYPE(NAME, Name) GElf_##Name Name; 1714 union { TYPES; } tmpbuf; 1715 #undef DO_TYPE 1716 1717 switch (type) 1718 { 1719 #define DO_TYPE(NAME, Name) \ 1720 case ELF_T_##NAME: \ 1721 size = sizeof (GElf_##Name); \ 1722 tmpbuf.Name = 0; \ 1723 break; 1724 TYPES; 1725 #undef DO_TYPE 1726 default: 1727 return false; 1728 } 1729 1730 if (offset > tdata->d_size 1731 || tdata->d_size - offset < size) 1732 error (0, 0, gettext ("bad relocation")); 1733 1734 /* When the symbol value is zero then for SHT_REL 1735 sections this is all that needs to be checked. 1736 The addend is contained in the original data at 1737 the offset already. So if the (section) symbol 1738 address is zero and the given addend is zero 1739 just remove the relocation, it isn't needed 1740 anymore. */ 1741 if (addend == 0 && sym->st_value == 0) 1742 return true; 1743 1744 Elf_Data tmpdata = 1745 { 1746 .d_type = type, 1747 .d_buf = &tmpbuf, 1748 .d_size = size, 1749 .d_version = EV_CURRENT, 1750 }; 1751 Elf_Data rdata = 1752 { 1753 .d_type = type, 1754 .d_buf = tdata->d_buf + offset, 1755 .d_size = size, 1756 .d_version = EV_CURRENT, 1757 }; 1758 1759 GElf_Addr value = sym->st_value; 1760 if (is_rela) 1761 { 1762 /* For SHT_RELA sections we just take the 1763 given addend and add it to the value. */ 1764 value += addend; 1765 } 1766 else 1767 { 1768 /* For SHT_REL sections we have to peek at 1769 what is already in the section at the given 1770 offset to get the addend. */ 1771 Elf_Data *d = gelf_xlatetom (debugelf, &tmpdata, 1772 &rdata, 1773 ehdr->e_ident[EI_DATA]); 1774 if (d == NULL) 1775 INTERNAL_ERROR (fname); 1776 assert (d == &tmpdata); 1777 } 1778 1779 switch (type) 1780 { 1781 #define DO_TYPE(NAME, Name) \ 1782 case ELF_T_##NAME: \ 1783 tmpbuf.Name += (GElf_##Name) value; \ 1784 break; 1785 TYPES; 1786 #undef DO_TYPE 1787 default: 1788 abort (); 1789 } 1790 1791 /* Now finally put in the new value. */ 1792 Elf_Data *s = gelf_xlatetof (debugelf, &rdata, 1793 &tmpdata, 1794 ehdr->e_ident[EI_DATA]); 1795 if (s == NULL) 1796 INTERNAL_ERROR (fname); 1797 assert (s == &rdata); 1798 1799 return true; 1800 } 1801 return false; 1802 } 1803 1804 size_t nrels = shdr->sh_size / shdr->sh_entsize; 1805 size_t next = 0; 1806 if (shdr->sh_type == SHT_REL) 1807 for (size_t relidx = 0; relidx < nrels; ++relidx) 1808 { 1809 GElf_Rel rel_mem; 1810 GElf_Rel *r = gelf_getrel (reldata, relidx, &rel_mem); 1811 if (! relocate (r->r_offset, 0, false, 1812 GELF_R_TYPE (r->r_info), 1813 GELF_R_SYM (r->r_info))) 1814 { 1815 if (relidx != next) 1816 gelf_update_rel (reldata, next, r); 1817 ++next; 1818 } 1819 } 1820 else 1821 for (size_t relidx = 0; relidx < nrels; ++relidx) 1822 { 1823 GElf_Rela rela_mem; 1824 GElf_Rela *r = gelf_getrela (reldata, relidx, &rela_mem); 1825 if (! relocate (r->r_offset, r->r_addend, true, 1826 GELF_R_TYPE (r->r_info), 1827 GELF_R_SYM (r->r_info))) 1828 { 1829 if (relidx != next) 1830 gelf_update_rela (reldata, next, r); 1831 ++next; 1832 } 1833 } 1834 1835 nrels = next; 1836 shdr->sh_size = reldata->d_size = nrels * shdr->sh_entsize; 1837 gelf_update_shdr (scn, shdr); 1838 } 1839 } 1840 } 1841 1842 /* Now that we have done all adjustments to the data, 1843 we can actually write out the debug file. */ 1844 if (debug_fname != NULL) 1845 { 1846 /* Finally write the file. */ 1847 if (unlikely (elf_update (debugelf, ELF_C_WRITE) == -1)) 1848 { 1849 error (0, 0, gettext ("while writing '%s': %s"), 1850 debug_fname, elf_errmsg (-1)); 1851 result = 1; 1852 goto fail_close; 1853 } 1854 1855 /* Create the real output file. First rename, then change the 1856 mode. */ 1857 if (rename (tmp_debug_fname, debug_fname) != 0 1858 || fchmod (debug_fd, mode) != 0) 1859 { 1860 error (0, errno, gettext ("while creating '%s'"), debug_fname); 1861 result = 1; 1862 goto fail_close; 1863 } 1864 1865 /* The temporary file does not exist anymore. */ 1866 tmp_debug_fname = NULL; 1867 1868 if (!remove_shdrs) 1869 { 1870 uint32_t debug_crc; 1871 Elf_Data debug_crc_data = 1872 { 1873 .d_type = ELF_T_WORD, 1874 .d_buf = &debug_crc, 1875 .d_size = sizeof (debug_crc), 1876 .d_version = EV_CURRENT 1877 }; 1878 1879 /* Compute the checksum which we will add to the executable. */ 1880 if (crc32_file (debug_fd, &debug_crc) != 0) 1881 { 1882 error (0, errno, gettext ("\ 1883 while computing checksum for debug information")); 1884 unlink (debug_fname); 1885 result = 1; 1886 goto fail_close; 1887 } 1888 1889 /* Store it in the debuglink section data. */ 1890 if (unlikely (gelf_xlatetof (newelf, &debuglink_crc_data, 1891 &debug_crc_data, ehdr->e_ident[EI_DATA]) 1892 != &debuglink_crc_data)) 1893 INTERNAL_ERROR (fname); 1894 } 1895 } 1896 1897 /* Finally finish the ELF header. Fill in the fields not handled by 1898 libelf from the old file. */ 1899 newehdr = gelf_getehdr (newelf, &newehdr_mem); 1900 if (newehdr == NULL) 1901 INTERNAL_ERROR (fname); 1902 1903 memcpy (newehdr->e_ident, ehdr->e_ident, EI_NIDENT); 1904 newehdr->e_type = ehdr->e_type; 1905 newehdr->e_machine = ehdr->e_machine; 1906 newehdr->e_version = ehdr->e_version; 1907 newehdr->e_entry = ehdr->e_entry; 1908 newehdr->e_flags = ehdr->e_flags; 1909 newehdr->e_phoff = ehdr->e_phoff; 1910 1911 /* We need to position the section header table. */ 1912 const size_t offsize = gelf_fsize (elf, ELF_T_OFF, 1, EV_CURRENT); 1913 newehdr->e_shoff = ((shdr_info[shdridx].shdr.sh_offset 1914 + shdr_info[shdridx].shdr.sh_size + offsize - 1) 1915 & ~((GElf_Off) (offsize - 1))); 1916 newehdr->e_shentsize = gelf_fsize (elf, ELF_T_SHDR, 1, EV_CURRENT); 1917 1918 /* The new section header string table index. */ 1919 if (likely (idx < SHN_HIRESERVE) && likely (idx != SHN_XINDEX)) 1920 newehdr->e_shstrndx = idx; 1921 else 1922 { 1923 /* The index does not fit in the ELF header field. */ 1924 shdr_info[0].scn = elf_getscn (elf, 0); 1925 1926 if (gelf_getshdr (shdr_info[0].scn, &shdr_info[0].shdr) == NULL) 1927 INTERNAL_ERROR (fname); 1928 1929 shdr_info[0].shdr.sh_link = idx; 1930 (void) gelf_update_shdr (shdr_info[0].scn, &shdr_info[0].shdr); 1931 1932 newehdr->e_shstrndx = SHN_XINDEX; 1933 } 1934 1935 if (gelf_update_ehdr (newelf, newehdr) == 0) 1936 { 1937 error (0, 0, gettext ("%s: error while creating ELF header: %s"), 1938 fname, elf_errmsg (-1)); 1939 return 1; 1940 } 1941 1942 /* We have everything from the old file. */ 1943 if (elf_cntl (elf, ELF_C_FDDONE) != 0) 1944 { 1945 error (0, 0, gettext ("%s: error while reading the file: %s"), 1946 fname, elf_errmsg (-1)); 1947 return 1; 1948 } 1949 1950 /* The ELF library better follows our layout when this is not a 1951 relocatable object file. */ 1952 elf_flagelf (newelf, ELF_C_SET, 1953 (ehdr->e_type != ET_REL ? ELF_F_LAYOUT : 0) 1954 | (permissive ? ELF_F_PERMISSIVE : 0)); 1955 1956 /* Finally write the file. */ 1957 if (elf_update (newelf, ELF_C_WRITE) == -1) 1958 { 1959 error (0, 0, gettext ("while writing '%s': %s"), 1960 fname, elf_errmsg (-1)); 1961 result = 1; 1962 } 1963 1964 if (remove_shdrs) 1965 { 1966 /* libelf can't cope without the section headers being properly intact. 1967 So we just let it write them normally, and then we nuke them later. */ 1968 1969 if (newehdr->e_ident[EI_CLASS] == ELFCLASS32) 1970 { 1971 assert (offsetof (Elf32_Ehdr, e_shentsize) + sizeof (Elf32_Half) 1972 == offsetof (Elf32_Ehdr, e_shnum)); 1973 assert (offsetof (Elf32_Ehdr, e_shnum) + sizeof (Elf32_Half) 1974 == offsetof (Elf32_Ehdr, e_shstrndx)); 1975 const Elf32_Off zero_off = 0; 1976 const Elf32_Half zero[3] = { 0, 0, SHN_UNDEF }; 1977 if (pwrite_retry (fd, &zero_off, sizeof zero_off, 1978 offsetof (Elf32_Ehdr, e_shoff)) != sizeof zero_off 1979 || (pwrite_retry (fd, zero, sizeof zero, 1980 offsetof (Elf32_Ehdr, e_shentsize)) 1981 != sizeof zero) 1982 || ftruncate64 (fd, shdr_info[shdridx].shdr.sh_offset) < 0) 1983 { 1984 error (0, errno, gettext ("while writing '%s'"), 1985 fname); 1986 result = 1; 1987 } 1988 } 1989 else 1990 { 1991 assert (offsetof (Elf64_Ehdr, e_shentsize) + sizeof (Elf64_Half) 1992 == offsetof (Elf64_Ehdr, e_shnum)); 1993 assert (offsetof (Elf64_Ehdr, e_shnum) + sizeof (Elf64_Half) 1994 == offsetof (Elf64_Ehdr, e_shstrndx)); 1995 const Elf64_Off zero_off = 0; 1996 const Elf64_Half zero[3] = { 0, 0, SHN_UNDEF }; 1997 if (pwrite_retry (fd, &zero_off, sizeof zero_off, 1998 offsetof (Elf64_Ehdr, e_shoff)) != sizeof zero_off 1999 || (pwrite_retry (fd, zero, sizeof zero, 2000 offsetof (Elf64_Ehdr, e_shentsize)) 2001 != sizeof zero) 2002 || ftruncate64 (fd, shdr_info[shdridx].shdr.sh_offset) < 0) 2003 { 2004 error (0, errno, gettext ("while writing '%s'"), 2005 fname); 2006 result = 1; 2007 } 2008 } 2009 } 2010 2011 fail_close: 2012 if (shdr_info != NULL) 2013 { 2014 /* For some sections we might have created an table to map symbol 2015 table indices. */ 2016 if (any_symtab_changes) 2017 for (cnt = 1; cnt <= shdridx; ++cnt) 2018 { 2019 free (shdr_info[cnt].newsymidx); 2020 if (shdr_info[cnt].debug_data != NULL) 2021 free (shdr_info[cnt].debug_data->d_buf); 2022 } 2023 2024 /* Free the memory. */ 2025 if ((shnum + 2) * sizeof (struct shdr_info) > MAX_STACK_ALLOC) 2026 free (shdr_info); 2027 } 2028 2029 /* Free other resources. */ 2030 if (shstrtab_data != NULL) 2031 free (shstrtab_data->d_buf); 2032 if (shst != NULL) 2033 ebl_strtabfree (shst); 2034 2035 /* That was it. Close the descriptors. */ 2036 if (elf_end (newelf) != 0) 2037 { 2038 error (0, 0, gettext ("error while finishing '%s': %s"), fname, 2039 elf_errmsg (-1)); 2040 result = 1; 2041 } 2042 2043 if (debugelf != NULL && elf_end (debugelf) != 0) 2044 { 2045 error (0, 0, gettext ("error while finishing '%s': %s"), debug_fname, 2046 elf_errmsg (-1)); 2047 result = 1; 2048 } 2049 2050 fail: 2051 /* Close the EBL backend. */ 2052 if (ebl != NULL) 2053 ebl_closebackend (ebl); 2054 2055 /* Close debug file descriptor, if opened */ 2056 if (debug_fd >= 0) 2057 { 2058 if (tmp_debug_fname != NULL) 2059 unlink (tmp_debug_fname); 2060 close (debug_fd); 2061 } 2062 2063 /* If requested, preserve the timestamp. */ 2064 if (tvp != NULL) 2065 { 2066 if (futimes (fd, tvp) != 0) 2067 { 2068 error (0, errno, gettext ("\ 2069 cannot set access and modification date of '%s'"), 2070 output_fname ?: fname); 2071 result = 1; 2072 } 2073 } 2074 2075 /* Close the file descriptor if we created a new file. */ 2076 if (output_fname != NULL) 2077 close (fd); 2078 2079 return result; 2080 } 2081 2082 2083 static int 2084 handle_ar (int fd, Elf *elf, const char *prefix, const char *fname, 2085 struct timeval tvp[2]) 2086 { 2087 size_t prefix_len = prefix == NULL ? 0 : strlen (prefix); 2088 size_t fname_len = strlen (fname) + 1; 2089 char new_prefix[prefix_len + 1 + fname_len]; 2090 char *cp = new_prefix; 2091 2092 /* Create the full name of the file. */ 2093 if (prefix != NULL) 2094 { 2095 cp = mempcpy (cp, prefix, prefix_len); 2096 *cp++ = ':'; 2097 } 2098 memcpy (cp, fname, fname_len); 2099 2100 2101 /* Process all the files contained in the archive. */ 2102 Elf *subelf; 2103 Elf_Cmd cmd = ELF_C_RDWR; 2104 int result = 0; 2105 while ((subelf = elf_begin (fd, cmd, elf)) != NULL) 2106 { 2107 /* The the header for this element. */ 2108 Elf_Arhdr *arhdr = elf_getarhdr (subelf); 2109 2110 if (elf_kind (subelf) == ELF_K_ELF) 2111 result |= handle_elf (fd, subelf, new_prefix, arhdr->ar_name, 0, NULL); 2112 else if (elf_kind (subelf) == ELF_K_AR) 2113 result |= handle_ar (fd, subelf, new_prefix, arhdr->ar_name, NULL); 2114 2115 /* Get next archive element. */ 2116 cmd = elf_next (subelf); 2117 if (unlikely (elf_end (subelf) != 0)) 2118 INTERNAL_ERROR (fname); 2119 } 2120 2121 if (tvp != NULL) 2122 { 2123 if (unlikely (futimes (fd, tvp) != 0)) 2124 { 2125 error (0, errno, gettext ("\ 2126 cannot set access and modification date of '%s'"), fname); 2127 result = 1; 2128 } 2129 } 2130 2131 if (unlikely (close (fd) != 0)) 2132 error (EXIT_FAILURE, errno, gettext ("while closing '%s'"), fname); 2133 2134 return result; 2135 } 2136 2137 2138 #include "debugpred.h" 2139