blob: 2b2179969e2b5f3ddda538c4f2ecf9c31a751ad0 [file] [log] [blame]
Ben Cheng25b3c042013-11-20 14:45:36 -08001/* Discard section not used at runtime from object files.
Elliott Hughes03333822015-02-18 22:19:45 -08002 Copyright (C) 2000-2012, 2014 Red Hat, Inc.
3 This file is part of elfutils.
Ben Cheng25b3c042013-11-20 14:45:36 -08004 Written by Ulrich Drepper <drepper@redhat.com>, 2000.
5
Elliott Hughes03333822015-02-18 22:19:45 -08006 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.
Ben Cheng25b3c042013-11-20 14:45:36 -080010
Elliott Hughes03333822015-02-18 22:19:45 -080011 elfutils is distributed in the hope that it will be useful, but
Ben Cheng25b3c042013-11-20 14:45:36 -080012 WITHOUT ANY WARRANTY; without even the implied warranty of
Elliott Hughes03333822015-02-18 22:19:45 -080013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
Ben Cheng25b3c042013-11-20 14:45:36 -080015
Elliott Hughes03333822015-02-18 22:19:45 -080016 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/>. */
Ben Cheng25b3c042013-11-20 14:45:36 -080018
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
48typedef uint8_t GElf_Byte;
49
50/* Name and version of program. */
51static void print_version (FILE *stream, struct argp_state *state);
52ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
53
54/* Bug report address. */
55ARGP_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. */
66static 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. */
93static const char doc[] = N_("Discard symbols from object files.");
94
95/* Strings for arguments in help texts. */
96static const char args_doc[] = N_("[FILE...]");
97
98/* Prototype for option handler. */
99static error_t parse_opt (int key, char *arg, struct argp_state *state);
100
101/* Data structure to communicate with argp functions. */
102static struct argp argp =
103{
104 options, parse_opt, args_doc, doc, NULL, NULL, NULL
105};
106
107
108/* Print symbols in file named FNAME. */
109static int process_file (const char *fname);
110
111/* Handle one ELF file. */
112static 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. */
116static 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. */
125static const char *output_fname;
126
127/* Name of the debug output file. */
128static const char *debug_fname;
129
130/* Name to pretend the debug output file has. */
131static const char *debug_fname_embed;
132
133/* If true output files shall have same date as the input file. */
134static bool preserve_dates;
135
136/* If true .comment sections will be removed. */
137static bool remove_comment;
138
139/* If true remove all debug sections. */
140static bool remove_debug;
141
142/* If true remove all section headers. */
143static bool remove_shdrs;
144
145/* If true relax some ELF rules for input files. */
146static bool permissive;
147
148/* If true perform relocations between debug sections. */
149static bool reloc_debug;
150
151
152int
153main (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 ("\
196Only 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. */
209static void
210print_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 ("\
214Copyright (C) %s Red Hat, Inc.\n\
215This is free software; see the source for copying conditions. There is NO\n\
216warranty; 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. */
223static error_t
224parse_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
302static int
303process_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
393static int
394handle_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;
Elliott Hughes03333822015-02-18 22:19:45 -0800435 void *debuglink_buf = NULL;
Ben Cheng25b3c042013-11-20 14:45:36 -0800436
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
Elliott Hughes03333822015-02-18 22:19:45 -0800505 /* 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
Ben Cheng25b3c042013-11-20 14:45:36 -0800510 /* 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
Elliott Hughes03333822015-02-18 22:19:45 -0800521 && unlikely (gelf_newphdr (newelf, phnum) == 0)))
Ben Cheng25b3c042013-11-20 14:45:36 -0800522 {
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)
Elliott Hughes03333822015-02-18 22:19:45 -0800530 for (cnt = 0; cnt < phnum; ++cnt)
Ben Cheng25b3c042013-11-20 14:45:36 -0800531 {
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
Elliott Hughes03333822015-02-18 22:19:45 -0800545 && unlikely (gelf_newphdr (debugelf, phnum) == 0)))
Ben Cheng25b3c042013-11-20 14:45:36 -0800546 {
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)
Elliott Hughes03333822015-02-18 22:19:45 -0800554 for (cnt = 0; cnt < phnum; ++cnt)
Ben Cheng25b3c042013-11-20 14:45:36 -0800555 {
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
Elliott Hughes03333822015-02-18 22:19:45 -0800573 if (shstrndx >= shnum)
574 goto illformed;
575
576#define elf_assert(test) do { if (!(test)) goto illformed; } while (0)
577
Ben Cheng25b3c042013-11-20 14:45:36 -0800578 /* 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). */
Elliott Hughes03333822015-02-18 22:19:45 -0800599 elf_assert (elf_ndxscn (scn) == cnt);
Ben Cheng25b3c042013-11-20 14:45:36 -0800600
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 {
Elliott Hughes03333822015-02-18 22:19:45 -0800612 illformed:
Ben Cheng25b3c042013-11-20 14:45:36 -0800613 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;
Elliott Hughes03333822015-02-18 22:19:45 -0800622 if (shdr_info[cnt].old_sh_link >= shnum)
623 goto illformed;
Ben Cheng25b3c042013-11-20 14:45:36 -0800624
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 {
Elliott Hughes03333822015-02-18 22:19:45 -0800636 elf_assert (shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx == 0);
Ben Cheng25b3c042013-11-20 14:45:36 -0800637 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)
Elliott Hughes03333822015-02-18 22:19:45 -0800653 {
654 if (grpref[inner] < shnum)
655 shdr_info[grpref[inner]].group_idx = cnt;
656 else
657 goto illformed;
658 }
Ben Cheng25b3c042013-11-20 14:45:36 -0800659
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 {
Elliott Hughes03333822015-02-18 22:19:45 -0800669 elf_assert (shdr_info[shdr_info[cnt].shdr.sh_link].version_idx == 0);
Ben Cheng25b3c042013-11-20 14:45:36 -0800670 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 {
Elliott Hughes03333822015-02-18 22:19:45 -0800677 elf_assert (shdr_info[cnt].group_idx != 0);
Ben Cheng25b3c042013-11-20 14:45:36 -0800678
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. */
Elliott Hughes03333822015-02-18 22:19:45 -0800753 if (shdr_info[cnt].shdr.sh_type == SHT_REL
Ben Cheng25b3c042013-11-20 14:45:36 -0800754 || shdr_info[cnt].shdr.sh_type == SHT_RELA)
Elliott Hughes03333822015-02-18 22:19:45 -0800755 {
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 }
Ben Cheng25b3c042013-11-20 14:45:36 -0800761
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 {
Elliott Hughes03333822015-02-18 22:19:45 -0800804 elf_assert (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB);
Ben Cheng25b3c042013-11-20 14:45:36 -0800805
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
Elliott Hughes03333822015-02-18 22:19:45 -0800844 if (scnidx >= shnum)
845 goto illformed;
846
Ben Cheng25b3c042013-11-20 14:45:36 -0800847 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. */
Elliott Hughes03333822015-02-18 22:19:45 -0800877 if (SH_INFO_LINK_P (&shdr_info[cnt].shdr))
Ben Cheng25b3c042013-11-20 14:45:36 -0800878 {
Elliott Hughes03333822015-02-18 22:19:45 -0800879 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 }
Ben Cheng25b3c042013-11-20 14:45:36 -0800886 }
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
Elliott Hughes03333822015-02-18 22:19:45 -08001027 elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx);
Ben Cheng25b3c042013-11-20 14:45:36 -08001028
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));
Elliott Hughes03333822015-02-18 22:19:45 -08001064 elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx);
Ben Cheng25b3c042013-11-20 14:45:36 -08001065
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;
Elliott Hughes03333822015-02-18 22:19:45 -08001079 debuglink_buf = xcalloc (1, shdr_info[cnt].data->d_size);
1080 shdr_info[cnt].data->d_buf = debuglink_buf;
Ben Cheng25b3c042013-11-20 14:45:36 -08001081
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));
Elliott Hughes03333822015-02-18 22:19:45 -08001121 elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == idx);
Ben Cheng25b3c042013-11-20 14:45:36 -08001122
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
Elliott Hughes03333822015-02-18 22:19:45 -08001211 elf_assert ((versiondata->d_size / sizeof (Elf32_Word))
Ben Cheng25b3c042013-11-20 14:45:36 -08001212 >= shdr_info[cnt].data->d_size / elsize);
1213 }
1214
1215 if (shdr_info[cnt].version_idx != 0)
1216 {
Elliott Hughes03333822015-02-18 22:19:45 -08001217 elf_assert (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM);
Ben Cheng25b3c042013-11-20 14:45:36 -08001218 /* 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
Elliott Hughes03333822015-02-18 22:19:45 -08001224 elf_assert ((versiondata->d_size / sizeof (GElf_Versym))
Ben Cheng25b3c042013-11-20 14:45:36 -08001225 >= 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 {
Elliott Hughes03333822015-02-18 22:19:45 -08001279 elf_assert (shndxdata != NULL);
Ben Cheng25b3c042013-11-20 14:45:36 -08001280
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
Elliott Hughes03333822015-02-18 22:19:45 -08001300 elf_assert (sec < SHN_LORESERVE || shndxdata != NULL);
Ben Cheng25b3c042013-11-20 14:45:36 -08001301
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);
Elliott Hughes03333822015-02-18 22:19:45 -08001327 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)));
Ben Cheng25b3c042013-11-20 14:45:36 -08001332 }
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);
Elliott Hughes03333822015-02-18 22:19:45 -08001519 elf_assert (sym != NULL);
Ben Cheng25b3c042013-11-20 14:45:36 -08001520
1521 const char *name = elf_strptr (elf, strshndx,
1522 sym->st_name);
Elliott Hughes03333822015-02-18 22:19:45 -08001523 elf_assert (name != NULL);
Ben Cheng25b3c042013-11-20 14:45:36 -08001524 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. */
Elliott Hughes03333822015-02-18 22:19:45 -08001542 elf_assert (shdr_info[cnt].shdr.sh_entsize
1543 == sizeof (Elf64_Xword));
Ben Cheng25b3c042013-11-20 14:45:36 -08001544
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);
Elliott Hughes03333822015-02-18 22:19:45 -08001573 elf_assert (sym != NULL);
Ben Cheng25b3c042013-11-20 14:45:36 -08001574
1575 const char *name = elf_strptr (elf, strshndx,
1576 sym->st_name);
Elliott Hughes03333822015-02-18 22:19:45 -08001577 elf_assert (name != NULL);
Ben Cheng25b3c042013-11-20 14:45:36 -08001578 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 ("\
1908while 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
Elliott Hughes03333822015-02-18 22:19:45 -08002049 /* Free data we allocated for the .gnu_debuglink section. */
2050 free (debuglink_buf);
2051
Ben Cheng25b3c042013-11-20 14:45:36 -08002052 /* 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 ("\
2097cannot 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
2111static int
2112handle_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 ("\
2154cannot 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"