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