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