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 #include "libiberty.h"
27 static bfd_vma parse_vma
PARAMS ((const char *, const char *));
28 static flagword parse_flags
PARAMS ((const char *));
29 static char *make_tempname
PARAMS ((char *));
30 static struct section_list
*find_section_list
PARAMS ((const char *, boolean
));
31 static void setup_section
PARAMS ((bfd
*, asection
*, PTR
));
32 static void copy_section
PARAMS ((bfd
*, asection
*, PTR
));
33 static void get_sections
PARAMS ((bfd
*, asection
*, PTR
));
34 static int compare_section_vma
PARAMS ((const PTR
, const PTR
));
35 static void add_strip_symbol
PARAMS ((const char *));
36 static boolean is_strip_symbol
PARAMS ((const char *));
37 static boolean is_strip_section
PARAMS ((bfd
*, asection
*));
38 static unsigned int filter_symbols
39 PARAMS ((bfd
*, asymbol
**, asymbol
**, long));
40 static void mark_symbols_used_in_relocations
PARAMS ((bfd
*, asection
*, PTR
));
42 #define nonfatal(s) {bfd_nonfatal(s); status = 1; return;}
44 static asymbol
**isympp
= NULL
; /* Input symbols */
45 static asymbol
**osympp
= NULL
; /* Output symbols that survive stripping */
47 /* If `copy_byte' >= 0, copy only that byte of every `interleave' bytes. */
48 static int copy_byte
= -1;
49 static int interleave
= 4;
51 static boolean verbose
; /* Print file and target names. */
52 static int status
= 0; /* Exit status. */
57 strip_none
, /* don't strip */
58 strip_debug
, /* strip all debugger symbols */
59 strip_all
/* strip all symbols */
62 /* Which symbols to remove. */
63 static enum strip_action strip_symbols
;
68 locals_start_L
, /* discard locals starting with L */
69 locals_all
/* discard all locals */
72 /* Which local symbols to remove. Overrides strip_all. */
73 static enum locals_action discard_locals
;
75 /* Structure used to hold lists of sections and actions to take. */
79 /* Next section to adjust. */
80 struct section_list
*next
;
83 /* Whether this entry was used. */
85 /* Whether to remove this section. */
87 /* Whether to adjust or set VMA. */
88 enum { ignore_vma
, adjust_vma
, set_vma
} adjust
;
89 /* Amount to adjust by or set to. */
91 /* Whether to set the section flags. */
93 /* What to set the section flags to. */
97 static struct section_list
*adjust_sections
;
98 static boolean sections_removed
;
100 /* Adjustments to the start address. */
101 static bfd_vma adjust_start
= 0;
102 static boolean set_start_set
= false;
103 static bfd_vma set_start
;
105 /* Adjustments to section VMA's. */
106 static bfd_vma adjust_section_vma
= 0;
108 /* Filling gaps between sections. */
109 static boolean gap_fill_set
= false;
110 static bfd_byte gap_fill
= 0;
112 /* Pad to a given address. */
113 static boolean pad_to_set
= false;
114 static bfd_vma pad_to
;
116 /* List of sections to add. */
120 /* Next section to add. */
121 struct section_add
*next
;
122 /* Name of section to add. */
124 /* Name of file holding section contents. */
125 const char *filename
;
128 /* Contents of file. */
130 /* BFD section, after it has been added. */
134 static struct section_add
*add_sections
;
136 /* Options to handle if running as "strip". */
138 static struct option strip_options
[] =
140 {"discard-all", no_argument
, 0, 'x'},
141 {"discard-locals", no_argument
, 0, 'X'},
142 {"format", required_argument
, 0, 'F'}, /* Obsolete */
143 {"help", no_argument
, 0, 'h'},
144 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
145 {"input-target", required_argument
, 0, 'I'},
146 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
147 {"output-target", required_argument
, 0, 'O'},
148 {"remove-section", required_argument
, 0, 'R'},
149 {"strip-all", no_argument
, 0, 's'},
150 {"strip-debug", no_argument
, 0, 'S'},
151 {"strip-symbol", required_argument
, 0, 'N'},
152 {"target", required_argument
, 0, 'F'},
153 {"verbose", no_argument
, 0, 'v'},
154 {"version", no_argument
, 0, 'V'},
155 {0, no_argument
, 0, 0}
158 /* Options to handle if running as "objcopy". */
160 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
162 #define OPTION_ADD_SECTION 150
163 #define OPTION_ADJUST_START (OPTION_ADD_SECTION + 1)
164 #define OPTION_ADJUST_VMA (OPTION_ADJUST_START + 1)
165 #define OPTION_ADJUST_SECTION_VMA (OPTION_ADJUST_VMA + 1)
166 #define OPTION_ADJUST_WARNINGS (OPTION_ADJUST_SECTION_VMA + 1)
167 #define OPTION_GAP_FILL (OPTION_ADJUST_WARNINGS + 1)
168 #define OPTION_NO_ADJUST_WARNINGS (OPTION_GAP_FILL + 1)
169 #define OPTION_PAD_TO (OPTION_NO_ADJUST_WARNINGS + 1)
170 #define OPTION_SET_SECTION_FLAGS (OPTION_PAD_TO + 1)
171 #define OPTION_SET_START (OPTION_SET_SECTION_FLAGS + 1)
173 static struct option copy_options
[] =
175 {"add-section", required_argument
, 0, OPTION_ADD_SECTION
},
176 {"adjust-start", required_argument
, 0, OPTION_ADJUST_START
},
177 {"adjust-vma", required_argument
, 0, OPTION_ADJUST_VMA
},
178 {"adjust-section-vma", required_argument
, 0, OPTION_ADJUST_SECTION_VMA
},
179 {"adjust-warnings", no_argument
, 0, OPTION_ADJUST_WARNINGS
},
180 {"byte", required_argument
, 0, 'b'},
181 {"discard-all", no_argument
, 0, 'x'},
182 {"discard-locals", no_argument
, 0, 'X'},
183 {"format", required_argument
, 0, 'F'}, /* Obsolete */
184 {"gap-fill", required_argument
, 0, OPTION_GAP_FILL
},
185 {"help", no_argument
, 0, 'h'},
186 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
187 {"input-target", required_argument
, 0, 'I'},
188 {"interleave", required_argument
, 0, 'i'},
189 {"no-adjust-warnings", no_argument
, 0, OPTION_NO_ADJUST_WARNINGS
},
190 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
191 {"output-target", required_argument
, 0, 'O'},
192 {"pad-to", required_argument
, 0, OPTION_PAD_TO
},
193 {"remove-section", required_argument
, 0, 'R'},
194 {"set-section-flags", required_argument
, 0, OPTION_SET_SECTION_FLAGS
},
195 {"set-start", required_argument
, 0, OPTION_SET_START
},
196 {"strip-all", no_argument
, 0, 'S'},
197 {"strip-debug", no_argument
, 0, 'g'},
198 {"strip-symbol", required_argument
, 0, 'N'},
199 {"target", required_argument
, 0, 'F'},
200 {"verbose", no_argument
, 0, 'v'},
201 {"version", no_argument
, 0, 'V'},
202 {0, no_argument
, 0, 0}
206 extern char *program_name
;
207 extern char *program_version
;
209 /* This flag distinguishes between strip and objcopy:
210 1 means this is 'strip'; 0 means this is 'objcopy'.
211 -1 means if we should use argv[0] to decide. */
216 copy_usage (stream
, exit_status
)
221 Usage: %s [-vVSgxX] [-I bfdname] [-O bfdname] [-F bfdname] [-b byte]\n\
222 [-R section] [-i interleave] [--interleave=interleave] [--byte=byte]\n\
223 [--input-target=bfdname] [--output-target=bfdname] [--target=bfdname]\n\
224 [--strip-all] [--strip-debug] [--discard-all] [--discard-locals]\n\
225 [--remove-section=section] [--gap-fill=val] [--pad-to=address]\n",
228 [--set-start=val] [--adjust-start=incr] [--adjust-vma=incr]\n\
229 [--adjust-section-vma=section{=,+,-}val] [--adjust-warnings]\n\
230 [--no-adjust-warnings] [--set-section-flags=section=flags]\n\
231 [--add-section=sectionname=filename]\n\
232 [--strip-symbol symbol] [-N symbol] [--verbose]\n\
233 [--version] [--help]\n\
234 in-file [out-file]\n");
239 strip_usage (stream
, exit_status
)
244 Usage: %s [-vVsSgxX] [-I bfdname] [-O bfdname] [-F bfdname] [-R section]\n\
245 [--input-target=bfdname] [--output-target=bfdname] [--target=bfdname]\n\
246 [--strip-all] [--strip-debug] [--discard-all] [--discard-locals]\n\
247 [--strip-symbol symbol] [-N symbol]\n\
248 [--remove-section=section] [--verbose] [--version] [--help] file...\n",
253 /* Parse a string into a VMA, with a fatal error if it can't be
264 ret
= bfd_scan_vma (s
, &end
, 0);
267 fprintf (stderr
, "%s: %s: bad number: %s\n", program_name
, arg
, s
);
273 /* Parse section flags into a flagword, with a fatal error if the
274 string can't be parsed. */
288 snext
= strchr (s
, ',');
297 #define PARSE_FLAG(fname,fval) if (strncmp (fname, s, len) == 0) ret |= fval;
298 PARSE_FLAG ("alloc", SEC_ALLOC
);
299 PARSE_FLAG ("load", SEC_LOAD
);
300 PARSE_FLAG ("readonly", SEC_READONLY
);
301 PARSE_FLAG ("code", SEC_CODE
);
302 PARSE_FLAG ("data", SEC_DATA
);
303 PARSE_FLAG ("rom", SEC_ROM
);
313 /* Return the name of a temporary file in the same directory as FILENAME. */
316 make_tempname (filename
)
319 static char template[] = "stXXXXXX";
321 char *slash
= strrchr (filename
, '/');
323 if (slash
!= (char *) NULL
)
326 tmpname
= xmalloc (strlen (filename
) + sizeof (template) + 1);
327 strcpy (tmpname
, filename
);
328 strcat (tmpname
, "/");
329 strcat (tmpname
, template);
335 tmpname
= xmalloc (sizeof (template));
336 strcpy (tmpname
, template);
342 /* Find and optionally add an entry in the adjust_sections list. */
344 static struct section_list
*
345 find_section_list (name
, add
)
349 register struct section_list
*p
;
351 for (p
= adjust_sections
; p
!= NULL
; p
= p
->next
)
352 if (strcmp (p
->name
, name
) == 0)
358 p
= (struct section_list
*) xmalloc (sizeof (struct section_list
));
362 p
->adjust
= ignore_vma
;
364 p
->set_flags
= false;
367 p
->next
= adjust_sections
;
373 /* Make a list of symbols to explicitly strip out. A linked list is
374 good enough for a small number from the command line, but this will
375 slow things down a lot if many symbols are being deleted. */
380 struct symlist
*next
;
383 static struct symlist
*strip_specific_list
= NULL
;
386 add_strip_symbol (name
)
389 struct symlist
*tmp_list
;
391 tmp_list
= (struct symlist
*) xmalloc (sizeof (struct symlist
));
392 tmp_list
->name
= name
;
393 tmp_list
->next
= strip_specific_list
;
394 strip_specific_list
= tmp_list
;
398 is_strip_symbol (name
)
401 struct symlist
*tmp_list
;
403 for (tmp_list
= strip_specific_list
; tmp_list
; tmp_list
= tmp_list
->next
)
405 if (strcmp (name
, tmp_list
->name
) == 0)
411 /* See if a section is being removed. */
414 is_strip_section (abfd
, sec
)
418 struct section_list
*p
;
420 if (! sections_removed
)
422 p
= find_section_list (bfd_get_section_name (abfd
, sec
), false);
423 return p
!= NULL
&& p
->remove
? true : false;
426 /* Choose which symbol entries to copy; put the result in OSYMS.
427 We don't copy in place, because that confuses the relocs.
428 Return the number of symbols to print. */
431 filter_symbols (abfd
, osyms
, isyms
, symcount
)
433 asymbol
**osyms
, **isyms
;
436 register asymbol
**from
= isyms
, **to
= osyms
;
437 long src_count
= 0, dst_count
= 0;
439 for (; src_count
< symcount
; src_count
++)
441 asymbol
*sym
= from
[src_count
];
442 flagword flags
= sym
->flags
;
445 if ((flags
& BSF_GLOBAL
) /* Keep if external. */
446 || (flags
& BSF_KEEP
) /* Keep if used in a relocation. */
447 || bfd_is_und_section (bfd_get_section (sym
))
448 || bfd_is_com_section (bfd_get_section (sym
)))
450 else if ((flags
& BSF_DEBUGGING
) != 0) /* Debugging symbol. */
451 keep
= strip_symbols
!= strip_debug
;
452 else /* Local symbol. */
453 keep
= discard_locals
!= locals_all
454 && (discard_locals
!= locals_start_L
||
455 ! bfd_is_local_label (abfd
, sym
));
457 if (keep
&& is_strip_symbol (bfd_asymbol_name (sym
)))
459 if (keep
&& is_strip_section (abfd
, bfd_get_section (sym
)))
463 to
[dst_count
++] = sym
;
469 /* Keep only every `copy_byte'th byte in MEMHUNK, which is *SIZE bytes long.
473 filter_bytes (memhunk
, size
)
477 char *from
= memhunk
+ copy_byte
, *to
= memhunk
, *end
= memhunk
+ *size
;
479 for (; from
< end
; from
+= interleave
)
484 /* Copy object file IBFD onto OBFD. */
487 copy_object (ibfd
, obfd
)
493 asection
**osections
= NULL
;
494 bfd_size_type
*gaps
= NULL
;
495 bfd_size_type max_gap
= 0;
497 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
499 nonfatal (bfd_get_filename (obfd
));
503 printf ("copy from %s(%s) to %s(%s)\n",
504 bfd_get_filename(ibfd
), bfd_get_target(ibfd
),
505 bfd_get_filename(obfd
), bfd_get_target(obfd
));
510 start
= bfd_get_start_address (ibfd
);
511 start
+= adjust_start
;
513 if (!bfd_set_start_address (obfd
, start
)
514 || !bfd_set_file_flags (obfd
,
515 (bfd_get_file_flags (ibfd
)
516 & bfd_applicable_file_flags (obfd
))))
518 nonfatal (bfd_get_filename (ibfd
));
521 /* Copy architecture of input file to output file */
522 if (!bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
),
523 bfd_get_mach (ibfd
)))
525 fprintf (stderr
, "Output file cannot represent architecture %s\n",
526 bfd_printable_arch_mach (bfd_get_arch (ibfd
),
527 bfd_get_mach (ibfd
)));
529 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
531 nonfatal (bfd_get_filename(ibfd
));
536 if (osympp
!= isympp
)
539 /* bfd mandates that all output sections be created and sizes set before
540 any output is done. Thus, we traverse all sections multiple times. */
541 bfd_map_over_sections (ibfd
, setup_section
, (void *) obfd
);
543 if (add_sections
!= NULL
)
545 struct section_add
*padd
;
546 struct section_list
*pset
;
548 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
550 padd
->section
= bfd_make_section (obfd
, padd
->name
);
551 if (padd
->section
== NULL
)
553 fprintf (stderr
, "%s: can't create section `%s': %s\n",
554 program_name
, padd
->name
,
555 bfd_errmsg (bfd_get_error ()));
563 if (! bfd_set_section_size (obfd
, padd
->section
, padd
->size
))
564 nonfatal (bfd_get_filename (obfd
));
566 pset
= find_section_list (padd
->name
, false);
570 if (pset
!= NULL
&& pset
->set_flags
)
571 flags
= pset
->flags
| SEC_HAS_CONTENTS
;
573 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DATA
;
574 if (! bfd_set_section_flags (obfd
, padd
->section
, flags
))
575 nonfatal (bfd_get_filename (obfd
));
578 && (pset
->adjust
== adjust_vma
579 || pset
->adjust
== set_vma
))
581 if (! bfd_set_section_vma (obfd
, padd
->section
, pset
->val
))
582 nonfatal (bfd_get_filename (obfd
));
588 if (gap_fill_set
|| pad_to_set
)
593 /* We must fill in gaps between the sections and/or we must pad
594 the last section to a specified address. We do this by
595 grabbing a list of the sections, sorting them by VMA, and
596 increasing the section sizes as required to fill the gaps.
597 We write out the gap contents below. */
599 c
= bfd_count_sections (obfd
);
600 osections
= (asection
**) xmalloc (c
* sizeof (asection
*));
602 bfd_map_over_sections (obfd
, get_sections
, (void *) &set
);
604 qsort (osections
, c
, sizeof (asection
*), compare_section_vma
);
606 gaps
= (bfd_size_type
*) xmalloc (c
* sizeof (bfd_size_type
));
607 memset (gaps
, 0, c
* sizeof (bfd_size_type
));
611 for (i
= 0; i
< c
- 1; i
++)
615 bfd_vma gap_start
, gap_stop
;
617 flags
= bfd_get_section_flags (obfd
, osections
[i
]);
618 if ((flags
& SEC_HAS_CONTENTS
) == 0
619 || (flags
& SEC_LOAD
) == 0)
622 size
= bfd_section_size (obfd
, osections
[i
]);
623 gap_start
= bfd_section_vma (obfd
, osections
[i
]) + size
;
624 gap_stop
= bfd_section_vma (obfd
, osections
[i
+ 1]);
625 if (gap_start
< gap_stop
)
627 if (! bfd_set_section_size (obfd
, osections
[i
],
628 size
+ (gap_stop
- gap_start
)))
630 fprintf (stderr
, "%s: Can't fill gap after %s: %s\n",
632 bfd_get_section_name (obfd
, osections
[i
]),
633 bfd_errmsg (bfd_get_error()));
637 gaps
[i
] = gap_stop
- gap_start
;
638 if (max_gap
< gap_stop
- gap_start
)
639 max_gap
= gap_stop
- gap_start
;
649 vma
= bfd_section_vma (obfd
, osections
[c
- 1]);
650 size
= bfd_section_size (obfd
, osections
[c
- 1]);
651 if (vma
+ size
< pad_to
)
653 if (! bfd_set_section_size (obfd
, osections
[c
- 1],
656 fprintf (stderr
, "%s: Can't add padding to %s: %s\n",
658 bfd_get_section_name (obfd
, osections
[c
- 1]),
659 bfd_errmsg (bfd_get_error ()));
664 gaps
[c
- 1] = pad_to
- (vma
+ size
);
665 if (max_gap
< pad_to
- (vma
+ size
))
666 max_gap
= pad_to
- (vma
+ size
);
672 /* Symbol filtering must happen after the output sections have
673 been created, but before their contents are set. */
674 if (strip_symbols
== strip_all
&& discard_locals
== locals_undef
)
676 osympp
= isympp
= NULL
;
683 symsize
= bfd_get_symtab_upper_bound (ibfd
);
686 nonfatal (bfd_get_filename (ibfd
));
689 osympp
= isympp
= (asymbol
**) xmalloc (symsize
);
690 symcount
= bfd_canonicalize_symtab (ibfd
, isympp
);
693 nonfatal (bfd_get_filename (ibfd
));
696 if (strip_symbols
== strip_debug
697 || discard_locals
!= locals_undef
698 || strip_specific_list
701 /* Mark symbols used in output relocations so that they
702 are kept, even if they are local labels or static symbols.
704 Note we iterate over the input sections examining their
705 relocations since the relocations for the output sections
706 haven't been set yet. mark_symbols_used_in_relocations will
707 ignore input sections which have no corresponding output
709 bfd_map_over_sections (ibfd
,
710 mark_symbols_used_in_relocations
,
712 osympp
= (asymbol
**) xmalloc (symcount
* sizeof (asymbol
*));
713 symcount
= filter_symbols (ibfd
, osympp
, isympp
, symcount
);
717 bfd_set_symtab (obfd
, osympp
, symcount
);
719 /* This has to happen after the symbol table has been set. */
720 bfd_map_over_sections (ibfd
, copy_section
, (void *) obfd
);
722 if (add_sections
!= NULL
)
724 struct section_add
*padd
;
726 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
728 if (! bfd_set_section_contents (obfd
, padd
->section
,
729 (PTR
) padd
->contents
,
731 (bfd_size_type
) padd
->size
))
732 nonfatal (bfd_get_filename (obfd
));
736 if (gap_fill_set
|| pad_to_set
)
741 /* Fill in the gaps. */
745 buf
= (bfd_byte
*) xmalloc (max_gap
);
746 memset (buf
, gap_fill
, max_gap
);
748 c
= bfd_count_sections (obfd
);
749 for (i
= 0; i
< c
; i
++)
757 off
= bfd_section_size (obfd
, osections
[i
]) - left
;
766 if (! bfd_set_section_contents (obfd
, osections
[i
], buf
,
769 nonfatal (bfd_get_filename (obfd
));
778 /* Allow the BFD backend to copy any private data it understands
779 from the input BFD to the output BFD. This is done last to
780 permit the routine to look at the filtered symbol table, which is
781 important for the ECOFF code at least. */
782 if (!bfd_copy_private_bfd_data (ibfd
, obfd
))
784 fprintf (stderr
, "%s: %s: error copying private BFD data: %s\n",
785 program_name
, bfd_get_filename (obfd
),
786 bfd_errmsg (bfd_get_error ()));
798 size_t size
= strlen (a
) + strlen (b
) + strlen (c
);
799 char *r
= xmalloc (size
+ 1);
807 /* Read each archive element in turn from IBFD, copy the
808 contents to temp file, and keep the temp file handle. */
811 copy_archive (ibfd
, obfd
, output_target
)
818 struct name_list
*next
;
821 bfd
**ptr
= &obfd
->archive_head
;
823 char *dir
= make_tempname (bfd_get_filename (obfd
));
825 /* Make a temp directory to hold the contents. */
827 obfd
->has_armap
= ibfd
->has_armap
;
831 this_element
= bfd_openr_next_archived_file (ibfd
, NULL
);
832 while (this_element
!= (bfd
*) NULL
)
834 /* Create an output file for this member. */
835 char *output_name
= cat (dir
, "/", bfd_get_filename(this_element
));
836 bfd
*output_bfd
= bfd_openw (output_name
, output_target
);
839 l
= (struct name_list
*) xmalloc (sizeof (struct name_list
));
840 l
->name
= output_name
;
844 if (output_bfd
== (bfd
*) NULL
)
846 nonfatal (output_name
);
848 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
850 nonfatal (bfd_get_filename (obfd
));
853 if (bfd_check_format (this_element
, bfd_object
) == true)
855 copy_object (this_element
, output_bfd
);
858 bfd_close (output_bfd
);
860 /* Open the newly output file and attach to our list. */
861 output_bfd
= bfd_openr (output_name
, output_target
);
864 ptr
= &output_bfd
->next
;
866 last_element
= this_element
;
868 this_element
= bfd_openr_next_archived_file (ibfd
, last_element
);
870 bfd_close (last_element
);
874 if (!bfd_close (obfd
))
876 nonfatal (bfd_get_filename (obfd
));
879 /* Delete all the files that we opened. */
880 for (l
= list
; l
!= NULL
; l
= l
->next
)
884 if (!bfd_close (ibfd
))
886 nonfatal (bfd_get_filename (ibfd
));
890 /* The top-level control. */
893 copy_file (input_filename
, output_filename
, input_target
, output_target
)
894 char *input_filename
;
895 char *output_filename
;
902 /* To allow us to do "strip *" without dying on the first
903 non-object file, failures are nonfatal. */
905 ibfd
= bfd_openr (input_filename
, input_target
);
908 nonfatal (input_filename
);
911 if (bfd_check_format (ibfd
, bfd_archive
))
915 /* bfd_get_target does not return the correct value until
916 bfd_check_format succeeds. */
917 if (output_target
== NULL
)
918 output_target
= bfd_get_target (ibfd
);
920 obfd
= bfd_openw (output_filename
, output_target
);
923 nonfatal (output_filename
);
925 copy_archive (ibfd
, obfd
, output_target
);
927 else if (bfd_check_format_matches (ibfd
, bfd_object
, &matching
))
931 /* bfd_get_target does not return the correct value until
932 bfd_check_format succeeds. */
933 if (output_target
== NULL
)
934 output_target
= bfd_get_target (ibfd
);
936 obfd
= bfd_openw (output_filename
, output_target
);
939 nonfatal (output_filename
);
942 copy_object (ibfd
, obfd
);
944 if (!bfd_close (obfd
))
946 nonfatal (output_filename
);
949 if (!bfd_close (ibfd
))
951 nonfatal (input_filename
);
956 bfd_nonfatal (input_filename
);
957 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
959 list_matching_formats (matching
);
966 /* Create a section in OBFD with the same name and attributes
967 as ISECTION in IBFD. */
970 setup_section (ibfd
, isection
, obfdarg
)
975 bfd
*obfd
= (bfd
*) obfdarg
;
976 struct section_list
*p
;
982 if ((bfd_get_section_flags (ibfd
, isection
) & SEC_DEBUGGING
) != 0
983 && (strip_symbols
== strip_debug
984 || strip_symbols
== strip_all
985 || discard_locals
== locals_all
))
988 p
= find_section_list (bfd_section_name (ibfd
, isection
), false);
992 if (p
!= NULL
&& p
->remove
)
995 osection
= bfd_make_section_anyway (obfd
, bfd_section_name (ibfd
, isection
));
996 if (osection
== NULL
)
1002 if (!bfd_set_section_size (obfd
,
1004 bfd_section_size (ibfd
, isection
)))
1010 vma
= bfd_section_vma (ibfd
, isection
);
1011 if (p
!= NULL
&& p
->adjust
== adjust_vma
)
1013 else if (p
!= NULL
&& p
->adjust
== set_vma
)
1016 vma
+= adjust_section_vma
;
1017 if (! bfd_set_section_vma (obfd
, osection
, vma
))
1023 if (bfd_set_section_alignment (obfd
,
1025 bfd_section_alignment (ibfd
, isection
))
1032 flags
= bfd_get_section_flags (ibfd
, isection
);
1033 if (p
!= NULL
&& p
->set_flags
)
1034 flags
= p
->flags
| (flags
& SEC_HAS_CONTENTS
);
1035 if (!bfd_set_section_flags (obfd
, osection
, flags
))
1041 /* This used to be mangle_section; we do here to avoid using
1042 bfd_get_section_by_name since some formats allow multiple
1043 sections with the same name. */
1044 isection
->output_section
= osection
;
1045 isection
->output_offset
= 0;
1047 /* Allow the BFD backend to copy any private data it understands
1048 from the input section to the output section. */
1049 if (!bfd_copy_private_section_data (ibfd
, isection
, obfd
, osection
))
1051 err
= "private data";
1059 fprintf (stderr
, "%s: %s: section `%s': error in %s: %s\n",
1061 bfd_get_filename (ibfd
), bfd_section_name (ibfd
, isection
),
1062 err
, bfd_errmsg (bfd_get_error ()));
1066 /* Copy the data of input section ISECTION of IBFD
1067 to an output section with the same name in OBFD.
1068 If stripping then don't copy any relocation info. */
1071 copy_section (ibfd
, isection
, obfdarg
)
1076 bfd
*obfd
= (bfd
*) obfdarg
;
1077 struct section_list
*p
;
1083 if ((bfd_get_section_flags (ibfd
, isection
) & SEC_DEBUGGING
) != 0
1084 && (strip_symbols
== strip_debug
1085 || strip_symbols
== strip_all
1086 || discard_locals
== locals_all
))
1091 p
= find_section_list (bfd_section_name (ibfd
, isection
), false);
1093 if (p
!= NULL
&& p
->remove
)
1096 osection
= isection
->output_section
;
1097 size
= bfd_get_section_size_before_reloc (isection
);
1099 if (size
== 0 || osection
== 0)
1102 if (strip_symbols
== strip_all
)
1103 bfd_set_reloc (obfd
, osection
, (arelent
**) NULL
, 0);
1108 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
1111 nonfatal (bfd_get_filename (ibfd
));
1114 bfd_set_reloc (obfd
, osection
, (arelent
**) NULL
, 0);
1117 relpp
= (arelent
**) xmalloc (relsize
);
1118 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, isympp
);
1121 nonfatal (bfd_get_filename (ibfd
));
1123 bfd_set_reloc (obfd
, osection
, relpp
, relcount
);
1127 isection
->_cooked_size
= isection
->_raw_size
;
1128 isection
->reloc_done
= true;
1130 if (bfd_get_section_flags (ibfd
, isection
) & SEC_HAS_CONTENTS
)
1132 PTR memhunk
= (PTR
) xmalloc ((unsigned) size
);
1134 if (!bfd_get_section_contents (ibfd
, isection
, memhunk
, (file_ptr
) 0,
1137 nonfatal (bfd_get_filename (ibfd
));
1142 filter_bytes (memhunk
, &size
);
1143 /* The section has gotten smaller. */
1144 if (!bfd_set_section_size (obfd
, osection
, size
))
1145 nonfatal (bfd_get_filename (obfd
));
1148 if (!bfd_set_section_contents (obfd
, osection
, memhunk
, (file_ptr
) 0,
1151 nonfatal (bfd_get_filename (obfd
));
1157 /* Get all the sections. This is used when --gap-fill or --pad-to is
1161 get_sections (obfd
, osection
, secppparg
)
1166 asection
***secppp
= (asection
***) secppparg
;
1168 **secppp
= osection
;
1172 /* Sort sections by VMA. This is called via qsort, and is used when
1173 --gap-fill or --pad-to is used. We force non loadable or empty
1174 sections to the front, where they are easier to ignore. */
1177 compare_section_vma (arg1
, arg2
)
1181 const asection
**sec1
= (const asection
**) arg1
;
1182 const asection
**sec2
= (const asection
**) arg2
;
1183 flagword flags1
, flags2
;
1185 /* Sort non loadable sections to the front. */
1186 flags1
= (*sec1
)->flags
;
1187 flags2
= (*sec2
)->flags
;
1188 if ((flags1
& SEC_HAS_CONTENTS
) == 0
1189 || (flags1
& SEC_LOAD
) == 0)
1191 if ((flags2
& SEC_HAS_CONTENTS
) != 0
1192 && (flags2
& SEC_LOAD
) != 0)
1197 if ((flags2
& SEC_HAS_CONTENTS
) == 0
1198 || (flags2
& SEC_LOAD
) == 0)
1202 /* Sort sections by VMA. */
1203 if ((*sec1
)->vma
> (*sec2
)->vma
)
1205 else if ((*sec1
)->vma
< (*sec2
)->vma
)
1208 /* Sort sections with the same VMA by size. */
1209 if ((*sec1
)->_raw_size
> (*sec2
)->_raw_size
)
1211 else if ((*sec1
)->_raw_size
< (*sec2
)->_raw_size
)
1217 /* Mark all the symbols which will be used in output relocations with
1218 the BSF_KEEP flag so that those symbols will not be stripped.
1220 Ignore relocations which will not appear in the output file. */
1223 mark_symbols_used_in_relocations (ibfd
, isection
, symbolsarg
)
1228 asymbol
**symbols
= (asymbol
**) symbolsarg
;
1233 /* Ignore an input section with no corresponding output section. */
1234 if (isection
->output_section
== NULL
)
1237 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
1239 bfd_fatal (bfd_get_filename (ibfd
));
1241 relpp
= (arelent
**) xmalloc (relsize
);
1242 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, symbols
);
1244 bfd_fatal (bfd_get_filename (ibfd
));
1246 /* Examine each symbol used in a relocation. If it's not one of the
1247 special bfd section symbols, then mark it with BSF_KEEP. */
1248 for (i
= 0; i
< relcount
; i
++)
1250 if (*relpp
[i
]->sym_ptr_ptr
!= bfd_com_section_ptr
->symbol
1251 && *relpp
[i
]->sym_ptr_ptr
!= bfd_abs_section_ptr
->symbol
1252 && *relpp
[i
]->sym_ptr_ptr
!= bfd_und_section_ptr
->symbol
)
1253 (*relpp
[i
]->sym_ptr_ptr
)->flags
|= BSF_KEEP
;
1260 /* The number of bytes to copy at once. */
1261 #define COPY_BUF 8192
1263 /* Copy file FROM to file TO, performing no translations.
1264 Return 0 if ok, -1 if error. */
1267 simple_copy (from
, to
)
1270 int fromfd
, tofd
, nread
;
1273 fromfd
= open (from
, O_RDONLY
);
1276 tofd
= open (to
, O_WRONLY
| O_CREAT
| O_TRUNC
);
1282 while ((nread
= read (fromfd
, buf
, sizeof buf
)) > 0)
1284 if (write (tofd
, buf
, nread
) != nread
)
1300 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
1302 #define S_ISLNK(m) 0
1307 /* Rename FROM to TO, copying if TO is a link.
1308 Assumes that TO already exists, because FROM is a temp file.
1309 Return 0 if ok, -1 if error. */
1312 smart_rename (from
, to
)
1321 /* Use rename only if TO is not a symbolic link and has
1322 only one hard link. */
1323 if (!S_ISLNK (s
.st_mode
) && s
.st_nlink
== 1)
1325 ret
= rename (from
, to
);
1328 /* Try to preserve the permission bits and ownership of TO. */
1329 chmod (to
, s
.st_mode
& 07777);
1330 chown (to
, s
.st_uid
, s
.st_gid
);
1335 ret
= simple_copy (from
, to
);
1343 strip_main (argc
, argv
)
1347 char *input_target
= NULL
, *output_target
= NULL
;
1348 boolean show_version
= false;
1350 struct section_list
*p
;
1352 while ((c
= getopt_long (argc
, argv
, "I:O:F:R:sSgxXVvN:",
1353 strip_options
, (int *) 0)) != EOF
)
1358 input_target
= optarg
;
1361 output_target
= optarg
;
1364 input_target
= output_target
= optarg
;
1367 p
= find_section_list (optarg
, true);
1369 sections_removed
= true;
1372 strip_symbols
= strip_all
;
1376 strip_symbols
= strip_debug
;
1379 add_strip_symbol (optarg
);
1382 discard_locals
= locals_all
;
1385 discard_locals
= locals_start_L
;
1391 show_version
= true;
1394 break; /* we've been given a long option */
1396 strip_usage (stdout
, 0);
1398 strip_usage (stderr
, 1);
1404 printf ("GNU %s version %s\n", program_name
, program_version
);
1408 /* Default is to strip all symbols. */
1409 if (strip_symbols
== strip_undef
1410 && discard_locals
== locals_undef
1411 && strip_specific_list
== NULL
)
1412 strip_symbols
= strip_all
;
1414 if (output_target
== (char *) NULL
)
1415 output_target
= input_target
;
1419 strip_usage (stderr
, 1);
1421 for (; i
< argc
; i
++)
1423 int hold_status
= status
;
1425 char *tmpname
= make_tempname (argv
[i
]);
1427 copy_file (argv
[i
], tmpname
, input_target
, output_target
);
1430 smart_rename (tmpname
, argv
[i
]);
1431 status
= hold_status
;
1442 copy_main (argc
, argv
)
1446 char *input_filename
= NULL
, *output_filename
= NULL
;
1447 char *input_target
= NULL
, *output_target
= NULL
;
1448 boolean show_version
= false;
1449 boolean adjust_warn
= true;
1451 struct section_list
*p
;
1453 while ((c
= getopt_long (argc
, argv
, "b:i:I:s:O:d:F:R:SgxXVvN:",
1454 copy_options
, (int *) 0)) != EOF
)
1459 copy_byte
= atoi(optarg
);
1462 fprintf (stderr
, "%s: byte number must be non-negative\n",
1468 interleave
= atoi(optarg
);
1471 fprintf(stderr
, "%s: interleave must be positive\n",
1477 case 's': /* "source" - 'I' is preferred */
1478 input_target
= optarg
;
1481 case 'd': /* "destination" - 'O' is preferred */
1482 output_target
= optarg
;
1485 input_target
= output_target
= optarg
;
1488 p
= find_section_list (optarg
, true);
1490 sections_removed
= true;
1493 strip_symbols
= strip_all
;
1496 strip_symbols
= strip_debug
;
1499 add_strip_symbol (optarg
);
1502 discard_locals
= locals_all
;
1505 discard_locals
= locals_start_L
;
1511 show_version
= true;
1513 case OPTION_ADD_SECTION
:
1517 struct section_add
*pa
;
1522 s
= strchr (optarg
, '=');
1526 "%s: bad format for --add-section NAME=FILENAME\n",
1531 if (stat (s
+ 1, &st
) < 0)
1533 fprintf (stderr
, "%s: ", program_name
);
1538 pa
= (struct section_add
*) xmalloc (sizeof (struct section_add
));
1541 name
= (char *) xmalloc (len
+ 1);
1542 strncpy (name
, optarg
, len
);
1546 pa
->filename
= s
+ 1;
1548 pa
->size
= st
.st_size
;
1550 pa
->contents
= xmalloc (pa
->size
);
1551 f
= fopen (pa
->filename
, FOPEN_RB
);
1554 fprintf (stderr
, "%s: ", program_name
);
1555 perror (pa
->filename
);
1558 if (fread (pa
->contents
, 1, pa
->size
, f
) == 0
1561 fprintf (stderr
, "%s: %s: fread failed\n",
1562 program_name
, pa
->filename
);
1567 pa
->next
= add_sections
;
1571 case OPTION_ADJUST_START
:
1572 adjust_start
= parse_vma (optarg
, "--adjust-start");
1574 case OPTION_ADJUST_SECTION_VMA
:
1580 s
= strchr (optarg
, '=');
1583 s
= strchr (optarg
, '+');
1586 s
= strchr (optarg
, '-');
1590 "%s: bad format for --adjust-section-vma\n",
1598 name
= (char *) xmalloc (len
+ 1);
1599 strncpy (name
, optarg
, len
);
1602 p
= find_section_list (name
, true);
1604 p
->val
= parse_vma (s
+ 1, "--adjust-section-vma");
1607 p
->adjust
= set_vma
;
1610 p
->adjust
= adjust_vma
;
1616 case OPTION_ADJUST_VMA
:
1617 adjust_section_vma
= parse_vma (optarg
, "--adjust-vma");
1618 adjust_start
= adjust_section_vma
;
1620 case OPTION_ADJUST_WARNINGS
:
1623 case OPTION_GAP_FILL
:
1625 bfd_vma gap_fill_vma
;
1627 gap_fill_vma
= parse_vma (optarg
, "--gap-fill");
1628 gap_fill
= (bfd_byte
) gap_fill_vma
;
1629 if ((bfd_vma
) gap_fill
!= gap_fill_vma
)
1631 fprintf (stderr
, "%s: warning: truncating gap-fill from 0x",
1633 fprintf_vma (stderr
, gap_fill_vma
);
1634 fprintf (stderr
, "to 0x%x\n", (unsigned int) gap_fill
);
1636 gap_fill_set
= true;
1639 case OPTION_NO_ADJUST_WARNINGS
:
1640 adjust_warn
= false;
1643 pad_to
= parse_vma (optarg
, "--pad-to");
1646 case OPTION_SET_SECTION_FLAGS
:
1652 s
= strchr (optarg
, '=');
1655 fprintf (stderr
, "%s: bad format for --set-section-flags\n",
1661 name
= (char *) xmalloc (len
+ 1);
1662 strncpy (name
, optarg
, len
);
1665 p
= find_section_list (name
, true);
1667 p
->set_flags
= true;
1668 p
->flags
= parse_flags (s
+ 1);
1671 case OPTION_SET_START
:
1672 set_start
= parse_vma (optarg
, "--set-start");
1673 set_start_set
= true;
1676 break; /* we've been given a long option */
1678 copy_usage (stdout
, 0);
1680 copy_usage (stderr
, 1);
1686 printf ("GNU %s version %s\n", program_name
, program_version
);
1690 if (copy_byte
>= interleave
)
1692 fprintf (stderr
, "%s: byte number must be less than interleave\n",
1697 if (optind
== argc
|| optind
+ 2 < argc
)
1698 copy_usage (stderr
, 1);
1700 input_filename
= argv
[optind
];
1701 if (optind
+ 1 < argc
)
1702 output_filename
= argv
[optind
+ 1];
1704 /* Default is to strip no symbols. */
1705 if (strip_symbols
== strip_undef
&& discard_locals
== locals_undef
)
1706 strip_symbols
= strip_none
;
1708 if (output_target
== (char *) NULL
)
1709 output_target
= input_target
;
1711 /* If there is no destination file then create a temp and rename
1712 the result into the input. */
1714 if (output_filename
== (char *) NULL
)
1716 char *tmpname
= make_tempname (input_filename
);
1717 copy_file (input_filename
, tmpname
, input_target
, output_target
);
1719 smart_rename (tmpname
, input_filename
);
1725 copy_file (input_filename
, output_filename
, input_target
, output_target
);
1730 for (p
= adjust_sections
; p
!= NULL
; p
= p
->next
)
1732 if (! p
->used
&& p
->adjust
!= ignore_vma
)
1734 fprintf (stderr
, "%s: warning: --adjust-section-vma %s%c0x",
1735 program_name
, p
->name
,
1736 p
->adjust
== set_vma
? '=' : '+');
1737 fprintf_vma (stderr
, p
->val
);
1738 fprintf (stderr
, " never used\n");
1751 program_name
= argv
[0];
1752 xmalloc_set_program_name (program_name
);
1754 START_PROGRESS (program_name
, 0);
1756 strip_symbols
= strip_undef
;
1757 discard_locals
= locals_undef
;
1763 int i
= strlen (program_name
);
1764 is_strip
= (i
>= 5 && strcmp (program_name
+ i
- 5, "strip") == 0);
1768 strip_main (argc
, argv
);
1770 copy_main (argc
, argv
);
1772 END_PROGRESS (program_name
);