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