1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright (C) 1991, 92, 93, 94 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
6 This program 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 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but 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.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
25 static void setup_section ();
26 static void copy_section ();
27 static void mark_symbols_used_in_relocations ();
29 #define nonfatal(s) {bfd_nonfatal(s); status = 1; return;}
31 static asymbol **isympp = NULL; /* Input symbols */
32 static asymbol **osympp = NULL; /* Output symbols that survive stripping */
34 /* If `copy_byte' >= 0, copy only that byte of every `interleave' bytes. */
35 static int copy_byte = -1;
36 static int interleave = 4;
38 static boolean verbose; /* Print file and target names. */
39 static int status = 0; /* Exit status. */
44 strip_none, /* don't strip */
45 strip_debug, /* strip all debugger symbols */
46 strip_all /* strip all symbols */
49 /* Which symbols to remove. */
50 static enum strip_action strip_symbols;
55 locals_start_L, /* discard locals starting with L */
56 locals_all /* discard all locals */
59 /* Which local symbols to remove. Overrides strip_all. */
60 static enum locals_action discard_locals;
62 /* Options to handle if running as "strip". */
64 static struct option strip_options[] =
66 {"discard-all", no_argument, 0, 'x'},
67 {"discard-locals", no_argument, 0, 'X'},
68 {"format", required_argument, 0, 'F'}, /* Obsolete */
69 {"help", no_argument, 0, 'h'},
70 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
71 {"input-target", required_argument, 0, 'I'},
72 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
73 {"output-target", required_argument, 0, 'O'},
74 {"strip-all", no_argument, 0, 's'},
75 {"strip-debug", no_argument, 0, 'S'},
76 {"target", required_argument, 0, 'F'},
77 {"verbose", no_argument, 0, 'v'},
78 {"version", no_argument, 0, 'V'},
79 {0, no_argument, 0, 0}
82 /* Options to handle if running as "objcopy". */
84 static struct option copy_options[] =
86 {"byte", required_argument, 0, 'b'},
87 {"discard-all", no_argument, 0, 'x'},
88 {"discard-locals", no_argument, 0, 'X'},
89 {"format", required_argument, 0, 'F'}, /* Obsolete */
90 {"help", no_argument, 0, 'h'},
91 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
92 {"input-target", required_argument, 0, 'I'},
93 {"interleave", required_argument, 0, 'i'},
94 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
95 {"output-target", required_argument, 0, 'O'},
96 {"strip-all", no_argument, 0, 'S'},
97 {"strip-debug", no_argument, 0, 'g'},
98 {"target", required_argument, 0, 'F'},
99 {"verbose", no_argument, 0, 'v'},
100 {"version", no_argument, 0, 'V'},
101 {0, no_argument, 0, 0}
105 extern char *program_name;
106 extern char *program_version;
108 /* This flag distinguishes between strip and objcopy:
109 1 means this is 'strip'; 0 means this is 'objcopy'.
110 -1 means if we should use argv[0] to decide. */
115 copy_usage (stream, status)
120 Usage: %s [-vVSgxX] [-I bfdname] [-O bfdname] [-F bfdname] [-b byte]\n\
121 [-i interleave] [--interleave=interleave] [--byte=byte]\n\
122 [--input-target=bfdname] [--output-target=bfdname] [--target=bfdname]\n\
123 [--strip-all] [--strip-debug] [--discard-all] [--discard-locals]\n\
124 [--verbose] [--version] [--help] in-file [out-file]\n",
130 strip_usage (stream, status)
135 Usage: %s [-vVsSgxX] [-I bfdname] [-O bfdname] [-F bfdname]\n\
136 [--input-target=bfdname] [--output-target=bfdname] [--target=bfdname]\n\
137 [--strip-all] [--strip-debug] [--discard-all] [--discard-locals]\n\
138 [--verbose] [--version] [--help] file...\n",
144 /* Return the name of a temporary file in the same directory as FILENAME. */
147 make_tempname (filename)
150 static char template[] = "stXXXXXX";
152 char *slash = strrchr (filename, '/');
154 if (slash != (char *) NULL)
157 tmpname = xmalloc (strlen (filename) + sizeof (template) + 1);
158 strcpy (tmpname, filename);
159 strcat (tmpname, "/");
160 strcat (tmpname, template);
166 tmpname = xmalloc (sizeof (template));
167 strcpy (tmpname, template);
173 /* Choose which symbol entries to copy; put the result in OSYMS.
174 We don't copy in place, because that confuses the relocs.
175 Return the number of symbols to print. */
178 filter_symbols (abfd, osyms, isyms, symcount)
180 asymbol **osyms, **isyms;
183 register asymbol **from = isyms, **to = osyms;
184 long src_count = 0, dst_count = 0;
186 for (; src_count < symcount; src_count++)
188 asymbol *sym = from[src_count];
189 flagword flags = sym->flags;
192 if ((flags & BSF_GLOBAL) /* Keep if external. */
193 || (flags & BSF_KEEP) /* Keep if used in a relocation. */
194 || bfd_get_section (sym) == &bfd_und_section
195 || bfd_is_com_section (bfd_get_section (sym)))
197 else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */
198 keep = strip_symbols != strip_debug;
199 else /* Local symbol. */
200 keep = discard_locals != locals_all
201 && (discard_locals != locals_start_L ||
202 ! bfd_is_local_label (abfd, sym));
204 to[dst_count++] = sym;
210 /* Keep only every `copy_byte'th byte in MEMHUNK, which is *SIZE bytes long.
214 filter_bytes (memhunk, size)
218 char *from = memhunk + copy_byte, *to = memhunk, *end = memhunk + *size;
220 for (; from < end; from += interleave)
225 /* Copy object file IBFD onto OBFD. */
228 copy_object (ibfd, obfd)
234 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
236 nonfatal (bfd_get_filename (obfd));
240 printf ("copy from %s(%s) to %s(%s)\n",
241 bfd_get_filename(ibfd), bfd_get_target(ibfd),
242 bfd_get_filename(obfd), bfd_get_target(obfd));
244 if (!bfd_set_start_address (obfd, bfd_get_start_address (ibfd))
245 || !bfd_set_file_flags (obfd,
246 (bfd_get_file_flags (ibfd)
247 & bfd_applicable_file_flags (obfd))))
249 nonfatal (bfd_get_filename (ibfd));
252 /* Copy architecture of input file to output file */
253 if (!bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
254 bfd_get_mach (ibfd)))
256 fprintf (stderr, "Output file cannot represent architecture %s\n",
257 bfd_printable_arch_mach (bfd_get_arch (ibfd),
258 bfd_get_mach (ibfd)));
260 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
262 nonfatal (bfd_get_filename(ibfd));
267 if (osympp != isympp)
270 /* bfd mandates that all output sections be created and sizes set before
271 any output is done. Thus, we traverse all sections multiple times. */
272 bfd_map_over_sections (ibfd, setup_section, (void *) obfd);
274 /* Symbol filtering must happen after the output sections have
275 been created, but before their contents are set. */
276 if (strip_symbols == strip_all && discard_locals == locals_undef)
278 osympp = isympp = NULL;
285 symsize = bfd_get_symtab_upper_bound (ibfd);
288 nonfatal (bfd_get_filename (ibfd));
291 osympp = isympp = (asymbol **) xmalloc (symsize);
292 symcount = bfd_canonicalize_symtab (ibfd, isympp);
295 nonfatal (bfd_get_filename (ibfd));
298 if (strip_symbols == strip_debug || discard_locals != locals_undef)
300 /* Mark symbols used in output relocations so that they
301 are kept, even if they are local labels or static symbols.
303 Note we iterate over the input sections examining their
304 relocations since the relocations for the output sections
305 haven't been set yet. mark_symbols_used_in_relocations will
306 ignore input sections which have no corresponding output
308 bfd_map_over_sections (ibfd,
309 mark_symbols_used_in_relocations,
311 osympp = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
312 symcount = filter_symbols (ibfd, osympp, isympp, symcount);
316 bfd_set_symtab (obfd, osympp, symcount);
318 /* This has to happen after the symbol table has been set. */
319 bfd_map_over_sections (ibfd, copy_section, (void *) obfd);
321 /* Allow the BFD backend to copy any private data it understands
322 from the input BFD to the output BFD. This is done last to
323 permit the routine to look at the filtered symbol table, which is
324 important for the ECOFF code at least. */
325 if (!bfd_copy_private_bfd_data (ibfd, obfd))
327 fprintf (stderr, "%s: %s: error copying private BFD data: %s\n",
328 program_name, bfd_get_filename (obfd),
329 bfd_errmsg (bfd_get_error ()));
341 size_t size = strlen (a) + strlen (b) + strlen (c);
342 char *r = xmalloc (size + 1);
350 /* Read each archive element in turn from IBFD, copy the
351 contents to temp file, and keep the temp file handle. */
354 copy_archive (ibfd, obfd, output_target)
359 bfd **ptr = &obfd->archive_head;
361 char *dir = make_tempname (bfd_get_filename (obfd));
363 /* Make a temp directory to hold the contents. */
365 obfd->has_armap = ibfd->has_armap;
367 this_element = bfd_openr_next_archived_file (ibfd, NULL);
368 ibfd->archive_head = this_element;
369 while (this_element != (bfd *) NULL)
371 /* Create an output file for this member. */
372 char *output_name = cat (dir, "/", bfd_get_filename(this_element));
373 bfd *output_bfd = bfd_openw (output_name, output_target);
375 if (output_bfd == (bfd *) NULL)
377 nonfatal (output_name);
379 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
381 nonfatal (bfd_get_filename (obfd));
384 if (bfd_check_format (this_element, bfd_object) == true)
386 copy_object (this_element, output_bfd);
389 bfd_close (output_bfd);
390 /* Open the newly output file and attatch to our list. */
391 output_bfd = bfd_openr (output_name, output_target);
393 /* Mark it for deletion. */
395 ptr = &output_bfd->next;
396 this_element->next = bfd_openr_next_archived_file (ibfd, this_element);
397 this_element = this_element->next;
401 if (!bfd_close (obfd))
403 nonfatal (bfd_get_filename (obfd));
406 /* Delete all the files that we opened.
407 Construct their names again, unfortunately, but
408 we're about to exit anyway. */
409 for (this_element = ibfd->archive_head;
410 this_element != (bfd *) NULL;
411 this_element = this_element->next)
413 unlink (cat (dir, "/", bfd_get_filename (this_element)));
416 if (!bfd_close (ibfd))
418 nonfatal (bfd_get_filename (ibfd));
422 /* The top-level control. */
425 copy_file (input_filename, output_filename, input_target, output_target)
426 char *input_filename;
427 char *output_filename;
434 /* To allow us to do "strip *" without dying on the first
435 non-object file, failures are nonfatal. */
437 ibfd = bfd_openr (input_filename, input_target);
440 nonfatal (input_filename);
443 if (bfd_check_format (ibfd, bfd_archive))
445 bfd *obfd = bfd_openw (output_filename, output_target);
448 nonfatal (output_filename);
450 copy_archive (ibfd, obfd, output_target);
452 else if (bfd_check_format_matches (ibfd, bfd_object, &matching))
454 bfd *obfd = bfd_openw (output_filename, output_target);
457 nonfatal (output_filename);
460 copy_object (ibfd, obfd);
462 if (!bfd_close (obfd))
464 nonfatal (output_filename);
467 if (!bfd_close (ibfd))
469 nonfatal (input_filename);
474 bfd_nonfatal (input_filename);
475 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
477 list_matching_formats (matching);
484 /* Create a section in OBFD with the same name and attributes
485 as ISECTION in IBFD. */
488 setup_section (ibfd, isection, obfd)
496 if ((bfd_get_section_flags (ibfd, isection) & SEC_DEBUGGING) != 0
497 && (strip_symbols == strip_debug
498 || strip_symbols == strip_all
499 || discard_locals == locals_all))
502 osection = bfd_make_section_anyway (obfd, bfd_section_name (ibfd, isection));
503 if (osection == NULL)
509 if (!bfd_set_section_size (obfd,
511 bfd_section_size (ibfd, isection)))
517 if (bfd_set_section_vma (obfd,
519 bfd_section_vma (ibfd, isection))
526 if (bfd_set_section_alignment (obfd,
528 bfd_section_alignment (ibfd, isection))
535 if (!bfd_set_section_flags (obfd, osection,
536 bfd_get_section_flags (ibfd, isection)))
542 /* This used to be mangle_section; we do here to avoid using
543 bfd_get_section_by_name since some formats allow multiple
544 sections with the same name. */
545 isection->output_section = osection;
546 isection->output_offset = 0;
548 /* Allow the BFD backend to copy any private data it understands
549 from the input section to the output section. */
550 if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
552 err = "private data";
560 fprintf (stderr, "%s: %s: section `%s': error in %s: %s\n",
562 bfd_get_filename (ibfd), bfd_section_name (ibfd, isection),
563 err, bfd_errmsg (bfd_get_error ()));
567 /* Copy the data of input section ISECTION of IBFD
568 to an output section with the same name in OBFD.
569 If stripping then don't copy any relocation info. */
572 copy_section (ibfd, isection, obfd)
582 if ((bfd_get_section_flags (ibfd, isection) & SEC_DEBUGGING) != 0
583 && (strip_symbols == strip_debug
584 || strip_symbols == strip_all
585 || discard_locals == locals_all))
590 osection = isection->output_section;
591 size = bfd_get_section_size_before_reloc (isection);
593 if (size == 0 || osection == 0)
596 if (strip_symbols == strip_all)
597 bfd_set_reloc (obfd, osection, (arelent **) NULL, 0);
602 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
605 nonfatal (bfd_get_filename (ibfd));
608 bfd_set_reloc (obfd, osection, (arelent **) NULL, 0);
611 relpp = (arelent **) xmalloc (relsize);
612 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
615 nonfatal (bfd_get_filename (ibfd));
617 bfd_set_reloc (obfd, osection, relpp, relcount);
621 isection->_cooked_size = isection->_raw_size;
622 isection->reloc_done = true;
624 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS)
626 PTR memhunk = (PTR) xmalloc ((unsigned) size);
628 if (!bfd_get_section_contents (ibfd, isection, memhunk, (file_ptr) 0,
631 nonfatal (bfd_get_filename (ibfd));
636 filter_bytes (memhunk, &size);
637 /* The section has gotten smaller. */
638 if (!bfd_set_section_size (obfd, osection, size))
639 nonfatal (bfd_get_filename (obfd));
642 if (!bfd_set_section_contents (obfd, osection, memhunk, (file_ptr) 0,
645 nonfatal (bfd_get_filename (obfd));
651 /* Mark all the symbols which will be used in output relocations with
652 the BSF_KEEP flag so that those symbols will not be stripped.
654 Ignore relocations which will not appear in the output file. */
657 mark_symbols_used_in_relocations (ibfd, isection, symbols)
666 /* Ignore an input section with no corresponding output section. */
667 if (isection->output_section == NULL)
670 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
672 bfd_fatal (bfd_get_filename (ibfd));
674 relpp = (arelent **) xmalloc (relsize);
675 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
677 bfd_fatal (bfd_get_filename (ibfd));
679 /* Examine each symbol used in a relocation. If it's not one of the
680 special bfd section symbols, then mark it with BSF_KEEP. */
681 for (i = 0; i < relcount; i++)
683 if (*relpp[i]->sym_ptr_ptr != bfd_com_section.symbol
684 && *relpp[i]->sym_ptr_ptr != bfd_abs_section.symbol
685 && *relpp[i]->sym_ptr_ptr != bfd_und_section.symbol)
686 (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
693 /* The number of bytes to copy at once. */
694 #define COPY_BUF 8192
696 /* Copy file FROM to file TO, performing no translations.
697 Return 0 if ok, -1 if error. */
700 simple_copy (from, to)
703 int fromfd, tofd, nread;
706 fromfd = open (from, O_RDONLY);
709 tofd = open (to, O_WRONLY | O_CREAT | O_TRUNC);
715 while ((nread = read (fromfd, buf, sizeof buf)) > 0)
717 if (write (tofd, buf, nread) != nread)
733 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
740 /* Rename FROM to TO, copying if TO is a link.
741 Assumes that TO already exists, because FROM is a temp file.
742 Return 0 if ok, -1 if error. */
745 smart_rename (from, to)
754 /* Use rename only if TO is not a symbolic link and has
755 only one hard link. */
756 if (!S_ISLNK (s.st_mode) && s.st_nlink == 1)
758 ret = rename (from, to);
761 /* Try to preserve the permission bits and ownership of TO. */
762 chmod (to, s.st_mode & 07777);
763 chown (to, s.st_uid, s.st_gid);
768 ret = simple_copy (from, to);
776 strip_main (argc, argv)
780 char *input_target = NULL, *output_target = NULL;
781 boolean show_version = false;
784 while ((c = getopt_long (argc, argv, "I:O:F:sSgxXVv",
785 strip_options, (int *) 0)) != EOF)
790 input_target = optarg;
793 output_target = optarg;
796 input_target = output_target = optarg;
799 strip_symbols = strip_all;
803 strip_symbols = strip_debug;
806 discard_locals = locals_all;
809 discard_locals = locals_start_L;
818 break; /* we've been given a long option */
820 strip_usage (stdout, 0);
822 strip_usage (stderr, 1);
828 printf ("GNU %s version %s\n", program_name, program_version);
832 /* Default is to strip all symbols. */
833 if (strip_symbols == strip_undef && discard_locals == locals_undef)
834 strip_symbols = strip_all;
836 if (output_target == (char *) NULL)
837 output_target = input_target;
841 strip_usage (stderr, 1);
843 for (; i < argc; i++)
845 int hold_status = status;
847 char *tmpname = make_tempname (argv[i]);
849 copy_file (argv[i], tmpname, input_target, output_target);
852 smart_rename (tmpname, argv[i]);
853 status = hold_status;
864 copy_main (argc, argv)
868 char *input_filename, *output_filename;
869 char *input_target = NULL, *output_target = NULL;
870 boolean show_version = false;
873 while ((c = getopt_long (argc, argv, "b:i:I:s:O:d:F:SgxXVv",
874 copy_options, (int *) 0)) != EOF)
879 copy_byte = atoi(optarg);
882 fprintf (stderr, "%s: byte number must be non-negative\n",
888 interleave = atoi(optarg);
891 fprintf(stderr, "%s: interleave must be positive\n",
897 case 's': /* "source" - 'I' is preferred */
898 input_target = optarg;
901 case 'd': /* "destination" - 'O' is preferred */
902 output_target = optarg;
905 input_target = output_target = optarg;
908 strip_symbols = strip_all;
911 strip_symbols = strip_debug;
914 discard_locals = locals_all;
917 discard_locals = locals_start_L;
926 break; /* we've been given a long option */
928 copy_usage (stdout, 0);
930 copy_usage (stderr, 1);
936 printf ("GNU %s version %s\n", program_name, program_version);
940 if (copy_byte >= interleave)
942 fprintf (stderr, "%s: byte number must be less than interleave\n",
947 if (optind == argc || optind + 2 < argc)
948 copy_usage (stderr, 1);
950 input_filename = argv[optind];
951 if (optind + 1 < argc)
952 output_filename = argv[optind + 1];
954 /* Default is to strip no symbols. */
955 if (strip_symbols == strip_undef && discard_locals == locals_undef)
956 strip_symbols = strip_none;
958 if (output_target == (char *) NULL)
959 output_target = input_target;
961 /* If there is no destination file then create a temp and rename
962 the result into the input. */
964 if (output_filename == (char *) NULL)
966 char *tmpname = make_tempname (input_filename);
967 copy_file (input_filename, tmpname, input_target, output_target);
969 smart_rename (tmpname, input_filename);
975 copy_file (input_filename, output_filename, input_target, output_target);
986 program_name = argv[0];
987 xmalloc_set_program_name (program_name);
988 strip_symbols = strip_undef;
989 discard_locals = locals_undef;
995 int i = strlen (program_name);
996 is_strip = (i >= 5 && strcmp (program_name + i - 5, "strip"));
1000 strip_main (argc, argv);
1002 copy_main (argc, argv);