Use elf_getphdrnum instead of accessing ehdr->e_phnum directly.
[platform/upstream/elfutils.git] / src / strip.c
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
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
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
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
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
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
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"