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