PR 3182
[external/binutils.git] / binutils / objcopy.c
1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3    2001, 2002, 2003, 2004, 2005, 2006
4    Free Software Foundation, Inc.
5
6    This file is part of GNU Binutils.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, USA.  */
22 \f
23 #include "bfd.h"
24 #include "progress.h"
25 #include "bucomm.h"
26 #include "getopt.h"
27 #include "libiberty.h"
28 #include "budbg.h"
29 #include "filenames.h"
30 #include "fnmatch.h"
31 #include "elf-bfd.h"
32 #include <sys/stat.h>
33 #include "libbfd.h"
34
35 /* A list of symbols to explicitly strip out, or to keep.  A linked
36    list is good enough for a small number from the command line, but
37    this will slow things down a lot if many symbols are being
38    deleted.  */
39
40 struct symlist
41 {
42   const char *name;
43   struct symlist *next;
44 };
45
46 /* A list to support redefine_sym.  */
47 struct redefine_node
48 {
49   char *source;
50   char *target;
51   struct redefine_node *next;
52 };
53
54 typedef struct section_rename
55 {
56   const char *            old_name;
57   const char *            new_name;
58   flagword                flags;
59   struct section_rename * next;
60 }
61 section_rename;
62
63 /* List of sections to be renamed.  */
64 static section_rename *section_rename_list;
65
66 #define RETURN_NONFATAL(s) {bfd_nonfatal (s); status = 1; return;}
67
68 static asymbol **isympp = NULL; /* Input symbols.  */
69 static asymbol **osympp = NULL; /* Output symbols that survive stripping.  */
70
71 /* If `copy_byte' >= 0, copy only that byte of every `interleave' bytes.  */
72 static int copy_byte = -1;
73 static int interleave = 4;
74
75 static bfd_boolean verbose;             /* Print file and target names.  */
76 static bfd_boolean preserve_dates;      /* Preserve input file timestamp.  */
77 static int status = 0;          /* Exit status.  */
78
79 enum strip_action
80   {
81     STRIP_UNDEF,
82     STRIP_NONE,                 /* Don't strip.  */
83     STRIP_DEBUG,                /* Strip all debugger symbols.  */
84     STRIP_UNNEEDED,             /* Strip unnecessary symbols.  */
85     STRIP_NONDEBUG,             /* Strip everything but debug info.  */
86     STRIP_ALL                   /* Strip all symbols.  */
87   };
88
89 /* Which symbols to remove.  */
90 static enum strip_action strip_symbols;
91
92 enum locals_action
93   {
94     LOCALS_UNDEF,
95     LOCALS_START_L,             /* Discard locals starting with L.  */
96     LOCALS_ALL                  /* Discard all locals.  */
97   };
98
99 /* Which local symbols to remove.  Overrides STRIP_ALL.  */
100 static enum locals_action discard_locals;
101
102 /* What kind of change to perform.  */
103 enum change_action
104 {
105   CHANGE_IGNORE,
106   CHANGE_MODIFY,
107   CHANGE_SET
108 };
109
110 /* Structure used to hold lists of sections and actions to take.  */
111 struct section_list
112 {
113   struct section_list * next;      /* Next section to change.  */
114   const char *          name;      /* Section name.  */
115   bfd_boolean           used;      /* Whether this entry was used.  */
116   bfd_boolean           remove;    /* Whether to remove this section.  */
117   bfd_boolean           copy;      /* Whether to copy this section.  */
118   enum change_action    change_vma;/* Whether to change or set VMA.  */
119   bfd_vma               vma_val;   /* Amount to change by or set to.  */
120   enum change_action    change_lma;/* Whether to change or set LMA.  */
121   bfd_vma               lma_val;   /* Amount to change by or set to.  */
122   bfd_boolean           set_flags; /* Whether to set the section flags.  */
123   flagword              flags;     /* What to set the section flags to.  */
124 };
125
126 static struct section_list *change_sections;
127
128 /* TRUE if some sections are to be removed.  */
129 static bfd_boolean sections_removed;
130
131 /* TRUE if only some sections are to be copied.  */
132 static bfd_boolean sections_copied;
133
134 /* Changes to the start address.  */
135 static bfd_vma change_start = 0;
136 static bfd_boolean set_start_set = FALSE;
137 static bfd_vma set_start;
138
139 /* Changes to section addresses.  */
140 static bfd_vma change_section_address = 0;
141
142 /* Filling gaps between sections.  */
143 static bfd_boolean gap_fill_set = FALSE;
144 static bfd_byte gap_fill = 0;
145
146 /* Pad to a given address.  */
147 static bfd_boolean pad_to_set = FALSE;
148 static bfd_vma pad_to;
149
150 /* Use alternative machine code?  */
151 static unsigned long use_alt_mach_code = 0;
152
153 /* Output BFD flags user wants to set or clear */
154 static flagword bfd_flags_to_set;
155 static flagword bfd_flags_to_clear;
156
157 /* List of sections to add.  */
158 struct section_add
159 {
160   /* Next section to add.  */
161   struct section_add *next;
162   /* Name of section to add.  */
163   const char *name;
164   /* Name of file holding section contents.  */
165   const char *filename;
166   /* Size of file.  */
167   size_t size;
168   /* Contents of file.  */
169   bfd_byte *contents;
170   /* BFD section, after it has been added.  */
171   asection *section;
172 };
173
174 /* List of sections to add to the output BFD.  */
175 static struct section_add *add_sections;
176
177 /* If non-NULL the argument to --add-gnu-debuglink.
178    This should be the filename to store in the .gnu_debuglink section.  */
179 static const char * gnu_debuglink_filename = NULL;
180
181 /* Whether to convert debugging information.  */
182 static bfd_boolean convert_debugging = FALSE;
183
184 /* Whether to change the leading character in symbol names.  */
185 static bfd_boolean change_leading_char = FALSE;
186
187 /* Whether to remove the leading character from global symbol names.  */
188 static bfd_boolean remove_leading_char = FALSE;
189
190 /* Whether to permit wildcard in symbol comparison.  */
191 static bfd_boolean wildcard = FALSE;
192
193 /* True if --localize-hidden is in effect.  */
194 static bfd_boolean localize_hidden = FALSE;
195
196 /* List of symbols to strip, keep, localize, keep-global, weaken,
197    or redefine.  */
198 static struct symlist *strip_specific_list = NULL;
199 static struct symlist *strip_unneeded_list = NULL;
200 static struct symlist *keep_specific_list = NULL;
201 static struct symlist *localize_specific_list = NULL;
202 static struct symlist *globalize_specific_list = NULL;
203 static struct symlist *keepglobal_specific_list = NULL;
204 static struct symlist *weaken_specific_list = NULL;
205 static struct redefine_node *redefine_sym_list = NULL;
206
207 /* If this is TRUE, we weaken global symbols (set BSF_WEAK).  */
208 static bfd_boolean weaken = FALSE;
209
210 /* If this is TRUE, we retain BSF_FILE symbols.  */
211 static bfd_boolean keep_file_symbols = FALSE;
212
213 /* Prefix symbols/sections.  */
214 static char *prefix_symbols_string = 0;
215 static char *prefix_sections_string = 0;
216 static char *prefix_alloc_sections_string = 0;
217
218 /* 150 isn't special; it's just an arbitrary non-ASCII char value.  */
219 enum command_line_switch
220   {
221     OPTION_ADD_SECTION=150,
222     OPTION_CHANGE_ADDRESSES,
223     OPTION_CHANGE_LEADING_CHAR,
224     OPTION_CHANGE_START,
225     OPTION_CHANGE_SECTION_ADDRESS,
226     OPTION_CHANGE_SECTION_LMA,
227     OPTION_CHANGE_SECTION_VMA,
228     OPTION_CHANGE_WARNINGS,
229     OPTION_DEBUGGING,
230     OPTION_GAP_FILL,
231     OPTION_NO_CHANGE_WARNINGS,
232     OPTION_PAD_TO,
233     OPTION_REMOVE_LEADING_CHAR,
234     OPTION_SET_SECTION_FLAGS,
235     OPTION_SET_START,
236     OPTION_STRIP_UNNEEDED,
237     OPTION_WEAKEN,
238     OPTION_REDEFINE_SYM,
239     OPTION_REDEFINE_SYMS,
240     OPTION_SREC_LEN,
241     OPTION_SREC_FORCES3,
242     OPTION_STRIP_SYMBOLS,
243     OPTION_STRIP_UNNEEDED_SYMBOL,
244     OPTION_STRIP_UNNEEDED_SYMBOLS,
245     OPTION_KEEP_SYMBOLS,
246     OPTION_LOCALIZE_HIDDEN,
247     OPTION_LOCALIZE_SYMBOLS,
248     OPTION_GLOBALIZE_SYMBOL,
249     OPTION_GLOBALIZE_SYMBOLS,
250     OPTION_KEEPGLOBAL_SYMBOLS,
251     OPTION_WEAKEN_SYMBOLS,
252     OPTION_RENAME_SECTION,
253     OPTION_ALT_MACH_CODE,
254     OPTION_PREFIX_SYMBOLS,
255     OPTION_PREFIX_SECTIONS,
256     OPTION_PREFIX_ALLOC_SECTIONS,
257     OPTION_FORMATS_INFO,
258     OPTION_ADD_GNU_DEBUGLINK,
259     OPTION_ONLY_KEEP_DEBUG,
260     OPTION_KEEP_FILE_SYMBOLS,
261     OPTION_READONLY_TEXT,
262     OPTION_WRITABLE_TEXT,
263     OPTION_PURE,
264     OPTION_IMPURE
265   };
266
267 /* Options to handle if running as "strip".  */
268
269 static struct option strip_options[] =
270 {
271   {"discard-all", no_argument, 0, 'x'},
272   {"discard-locals", no_argument, 0, 'X'},
273   {"format", required_argument, 0, 'F'}, /* Obsolete */
274   {"help", no_argument, 0, 'h'},
275   {"info", no_argument, 0, OPTION_FORMATS_INFO},
276   {"input-format", required_argument, 0, 'I'}, /* Obsolete */
277   {"input-target", required_argument, 0, 'I'},
278   {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
279   {"keep-symbol", required_argument, 0, 'K'},
280   {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
281   {"output-format", required_argument, 0, 'O'}, /* Obsolete */
282   {"output-target", required_argument, 0, 'O'},
283   {"output-file", required_argument, 0, 'o'},
284   {"preserve-dates", no_argument, 0, 'p'},
285   {"remove-section", required_argument, 0, 'R'},
286   {"strip-all", no_argument, 0, 's'},
287   {"strip-debug", no_argument, 0, 'S'},
288   {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
289   {"strip-symbol", required_argument, 0, 'N'},
290   {"target", required_argument, 0, 'F'},
291   {"verbose", no_argument, 0, 'v'},
292   {"version", no_argument, 0, 'V'},
293   {"wildcard", no_argument, 0, 'w'},
294   {0, no_argument, 0, 0}
295 };
296
297 /* Options to handle if running as "objcopy".  */
298
299 static struct option copy_options[] =
300 {
301   {"add-gnu-debuglink", required_argument, 0, OPTION_ADD_GNU_DEBUGLINK},
302   {"add-section", required_argument, 0, OPTION_ADD_SECTION},
303   {"adjust-start", required_argument, 0, OPTION_CHANGE_START},
304   {"adjust-vma", required_argument, 0, OPTION_CHANGE_ADDRESSES},
305   {"adjust-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
306   {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
307   {"alt-machine-code", required_argument, 0, OPTION_ALT_MACH_CODE},
308   {"binary-architecture", required_argument, 0, 'B'},
309   {"byte", required_argument, 0, 'b'},
310   {"change-addresses", required_argument, 0, OPTION_CHANGE_ADDRESSES},
311   {"change-leading-char", no_argument, 0, OPTION_CHANGE_LEADING_CHAR},
312   {"change-section-address", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
313   {"change-section-lma", required_argument, 0, OPTION_CHANGE_SECTION_LMA},
314   {"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA},
315   {"change-start", required_argument, 0, OPTION_CHANGE_START},
316   {"change-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
317   {"debugging", no_argument, 0, OPTION_DEBUGGING},
318   {"discard-all", no_argument, 0, 'x'},
319   {"discard-locals", no_argument, 0, 'X'},
320   {"format", required_argument, 0, 'F'}, /* Obsolete */
321   {"gap-fill", required_argument, 0, OPTION_GAP_FILL},
322   {"globalize-symbol", required_argument, 0, OPTION_GLOBALIZE_SYMBOL},
323   {"globalize-symbols", required_argument, 0, OPTION_GLOBALIZE_SYMBOLS},
324   {"help", no_argument, 0, 'h'},
325   {"impure", no_argument, 0, OPTION_IMPURE},
326   {"info", no_argument, 0, OPTION_FORMATS_INFO},
327   {"input-format", required_argument, 0, 'I'}, /* Obsolete */
328   {"input-target", required_argument, 0, 'I'},
329   {"interleave", required_argument, 0, 'i'},
330   {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
331   {"keep-global-symbol", required_argument, 0, 'G'},
332   {"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS},
333   {"keep-symbol", required_argument, 0, 'K'},
334   {"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS},
335   {"localize-hidden", no_argument, 0, OPTION_LOCALIZE_HIDDEN},
336   {"localize-symbol", required_argument, 0, 'L'},
337   {"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
338   {"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
339   {"no-change-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
340   {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
341   {"only-section", required_argument, 0, 'j'},
342   {"output-format", required_argument, 0, 'O'}, /* Obsolete */
343   {"output-target", required_argument, 0, 'O'},
344   {"pad-to", required_argument, 0, OPTION_PAD_TO},
345   {"prefix-symbols", required_argument, 0, OPTION_PREFIX_SYMBOLS},
346   {"prefix-sections", required_argument, 0, OPTION_PREFIX_SECTIONS},
347   {"prefix-alloc-sections", required_argument, 0, OPTION_PREFIX_ALLOC_SECTIONS},
348   {"preserve-dates", no_argument, 0, 'p'},
349   {"pure", no_argument, 0, OPTION_PURE},
350   {"readonly-text", no_argument, 0, OPTION_READONLY_TEXT},
351   {"redefine-sym", required_argument, 0, OPTION_REDEFINE_SYM},
352   {"redefine-syms", required_argument, 0, OPTION_REDEFINE_SYMS},
353   {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR},
354   {"remove-section", required_argument, 0, 'R'},
355   {"rename-section", required_argument, 0, OPTION_RENAME_SECTION},
356   {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS},
357   {"set-start", required_argument, 0, OPTION_SET_START},
358   {"srec-len", required_argument, 0, OPTION_SREC_LEN},
359   {"srec-forceS3", no_argument, 0, OPTION_SREC_FORCES3},
360   {"strip-all", no_argument, 0, 'S'},
361   {"strip-debug", no_argument, 0, 'g'},
362   {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
363   {"strip-unneeded-symbol", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOL},
364   {"strip-unneeded-symbols", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOLS},
365   {"strip-symbol", required_argument, 0, 'N'},
366   {"strip-symbols", required_argument, 0, OPTION_STRIP_SYMBOLS},
367   {"target", required_argument, 0, 'F'},
368   {"verbose", no_argument, 0, 'v'},
369   {"version", no_argument, 0, 'V'},
370   {"weaken", no_argument, 0, OPTION_WEAKEN},
371   {"weaken-symbol", required_argument, 0, 'W'},
372   {"weaken-symbols", required_argument, 0, OPTION_WEAKEN_SYMBOLS},
373   {"wildcard", no_argument, 0, 'w'},
374   {"writable-text", no_argument, 0, OPTION_WRITABLE_TEXT},
375   {0, no_argument, 0, 0}
376 };
377
378 /* IMPORTS */
379 extern char *program_name;
380
381 /* This flag distinguishes between strip and objcopy:
382    1 means this is 'strip'; 0 means this is 'objcopy'.
383    -1 means if we should use argv[0] to decide.  */
384 extern int is_strip;
385
386 /* The maximum length of an S record.  This variable is declared in srec.c
387    and can be modified by the --srec-len parameter.  */
388 extern unsigned int Chunk;
389
390 /* Restrict the generation of Srecords to type S3 only.
391    This variable is declare in bfd/srec.c and can be toggled
392    on by the --srec-forceS3 command line switch.  */
393 extern bfd_boolean S3Forced;
394
395 /* Defined in bfd/binary.c.  Used to set architecture and machine of input
396    binary files.  */
397 extern enum bfd_architecture  bfd_external_binary_architecture;
398 extern unsigned long          bfd_external_machine;
399
400 /* Forward declarations.  */
401 static void setup_section (bfd *, asection *, void *);
402 static void setup_bfd_headers (bfd *, bfd *);
403 static void copy_section (bfd *, asection *, void *);
404 static void get_sections (bfd *, asection *, void *);
405 static int compare_section_lma (const void *, const void *);
406 static void mark_symbols_used_in_relocations (bfd *, asection *, void *);
407 static bfd_boolean write_debugging_info (bfd *, void *, long *, asymbol ***);
408 static const char *lookup_sym_redefinition (const char *);
409 \f
410 static void
411 copy_usage (FILE *stream, int exit_status)
412 {
413   fprintf (stream, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name);
414   fprintf (stream, _(" Copies a binary file, possibly transforming it in the process\n"));
415   fprintf (stream, _(" The options are:\n"));
416   fprintf (stream, _("\
417   -I --input-target <bfdname>      Assume input file is in format <bfdname>\n\
418   -O --output-target <bfdname>     Create an output file in format <bfdname>\n\
419   -B --binary-architecture <arch>  Set arch of output file, when input is binary\n\
420   -F --target <bfdname>            Set both input and output format to <bfdname>\n\
421      --debugging                   Convert debugging information, if possible\n\
422   -p --preserve-dates              Copy modified/access timestamps to the output\n\
423   -j --only-section <name>         Only copy section <name> into the output\n\
424      --add-gnu-debuglink=<file>    Add section .gnu_debuglink linking to <file>\n\
425   -R --remove-section <name>       Remove section <name> from the output\n\
426   -S --strip-all                   Remove all symbol and relocation information\n\
427   -g --strip-debug                 Remove all debugging symbols & sections\n\
428      --strip-unneeded              Remove all symbols not needed by relocations\n\
429   -N --strip-symbol <name>         Do not copy symbol <name>\n\
430      --strip-unneeded-symbol <name>\n\
431                                    Do not copy symbol <name> unless needed by\n\
432                                      relocations\n\
433      --only-keep-debug             Strip everything but the debug information\n\
434   -K --keep-symbol <name>          Do not strip symbol <name>\n\
435      --keep-file-symbols           Do not strip file symbol(s)\n\
436      --localize-hidden             Turn all ELF hidden symbols into locals\n\
437   -L --localize-symbol <name>      Force symbol <name> to be marked as a local\n\
438      --globalize-symbol <name>     Force symbol <name> to be marked as a global\n\
439   -G --keep-global-symbol <name>   Localize all symbols except <name>\n\
440   -W --weaken-symbol <name>        Force symbol <name> to be marked as a weak\n\
441      --weaken                      Force all global symbols to be marked as weak\n\
442   -w --wildcard                    Permit wildcard in symbol comparison\n\
443   -x --discard-all                 Remove all non-global symbols\n\
444   -X --discard-locals              Remove any compiler-generated symbols\n\
445   -i --interleave <number>         Only copy one out of every <number> bytes\n\
446   -b --byte <num>                  Select byte <num> in every interleaved block\n\
447      --gap-fill <val>              Fill gaps between sections with <val>\n\
448      --pad-to <addr>               Pad the last section up to address <addr>\n\
449      --set-start <addr>            Set the start address to <addr>\n\
450     {--change-start|--adjust-start} <incr>\n\
451                                    Add <incr> to the start address\n\
452     {--change-addresses|--adjust-vma} <incr>\n\
453                                    Add <incr> to LMA, VMA and start addresses\n\
454     {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
455                                    Change LMA and VMA of section <name> by <val>\n\
456      --change-section-lma <name>{=|+|-}<val>\n\
457                                    Change the LMA of section <name> by <val>\n\
458      --change-section-vma <name>{=|+|-}<val>\n\
459                                    Change the VMA of section <name> by <val>\n\
460     {--[no-]change-warnings|--[no-]adjust-warnings}\n\
461                                    Warn if a named section does not exist\n\
462      --set-section-flags <name>=<flags>\n\
463                                    Set section <name>'s properties to <flags>\n\
464      --add-section <name>=<file>   Add section <name> found in <file> to output\n\
465      --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
466      --change-leading-char         Force output format's leading character style\n\
467      --remove-leading-char         Remove leading character from global symbols\n\
468      --redefine-sym <old>=<new>    Redefine symbol name <old> to <new>\n\
469      --redefine-syms <file>        --redefine-sym for all symbol pairs \n\
470                                      listed in <file>\n\
471      --srec-len <number>           Restrict the length of generated Srecords\n\
472      --srec-forceS3                Restrict the type of generated Srecords to S3\n\
473      --strip-symbols <file>        -N for all symbols listed in <file>\n\
474      --strip-unneeded-symbols <file>\n\
475                                    --strip-unneeded-symbol for all symbols listed\n\
476                                      in <file>\n\
477      --keep-symbols <file>         -K for all symbols listed in <file>\n\
478      --localize-symbols <file>     -L for all symbols listed in <file>\n\
479      --globalize-symbols <file>    --globalize-symbol for all in <file>\n\
480      --keep-global-symbols <file>  -G for all symbols listed in <file>\n\
481      --weaken-symbols <file>       -W for all symbols listed in <file>\n\
482      --alt-machine-code <index>    Use the target's <index>'th alternative machine\n\
483      --writable-text               Mark the output text as writable\n\
484      --readonly-text               Make the output text write protected\n\
485      --pure                        Mark the output file as demand paged\n\
486      --impure                      Mark the output file as impure\n\
487      --prefix-symbols <prefix>     Add <prefix> to start of every symbol name\n\
488      --prefix-sections <prefix>    Add <prefix> to start of every section name\n\
489      --prefix-alloc-sections <prefix>\n\
490                                    Add <prefix> to start of every allocatable\n\
491                                      section name\n\
492   -v --verbose                     List all object files modified\n\
493   @<file>                          Read options from <file>\n\
494   -V --version                     Display this program's version number\n\
495   -h --help                        Display this output\n\
496      --info                        List object formats & architectures supported\n\
497 "));
498   list_supported_targets (program_name, stream);
499   if (exit_status == 0)
500     fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
501   exit (exit_status);
502 }
503
504 static void
505 strip_usage (FILE *stream, int exit_status)
506 {
507   fprintf (stream, _("Usage: %s <option(s)> in-file(s)\n"), program_name);
508   fprintf (stream, _(" Removes symbols and sections from files\n"));
509   fprintf (stream, _(" The options are:\n"));
510   fprintf (stream, _("\
511   -I --input-target=<bfdname>      Assume input file is in format <bfdname>\n\
512   -O --output-target=<bfdname>     Create an output file in format <bfdname>\n\
513   -F --target=<bfdname>            Set both input and output format to <bfdname>\n\
514   -p --preserve-dates              Copy modified/access timestamps to the output\n\
515   -R --remove-section=<name>       Remove section <name> from the output\n\
516   -s --strip-all                   Remove all symbol and relocation information\n\
517   -g -S -d --strip-debug           Remove all debugging symbols & sections\n\
518      --strip-unneeded              Remove all symbols not needed by relocations\n\
519      --only-keep-debug             Strip everything but the debug information\n\
520   -N --strip-symbol=<name>         Do not copy symbol <name>\n\
521   -K --keep-symbol=<name>          Do not strip symbol <name>\n\
522      --keep-file-symbols           Do not strip file symbol(s)\n\
523   -w --wildcard                    Permit wildcard in symbol comparison\n\
524   -x --discard-all                 Remove all non-global symbols\n\
525   -X --discard-locals              Remove any compiler-generated symbols\n\
526   -v --verbose                     List all object files modified\n\
527   -V --version                     Display this program's version number\n\
528   -h --help                        Display this output\n\
529      --info                        List object formats & architectures supported\n\
530   -o <file>                        Place stripped output into <file>\n\
531 "));
532
533   list_supported_targets (program_name, stream);
534   if (exit_status == 0)
535     fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
536   exit (exit_status);
537 }
538
539 /* Parse section flags into a flagword, with a fatal error if the
540    string can't be parsed.  */
541
542 static flagword
543 parse_flags (const char *s)
544 {
545   flagword ret;
546   const char *snext;
547   int len;
548
549   ret = SEC_NO_FLAGS;
550
551   do
552     {
553       snext = strchr (s, ',');
554       if (snext == NULL)
555         len = strlen (s);
556       else
557         {
558           len = snext - s;
559           ++snext;
560         }
561
562       if (0) ;
563 #define PARSE_FLAG(fname,fval) \
564   else if (strncasecmp (fname, s, len) == 0) ret |= fval
565       PARSE_FLAG ("alloc", SEC_ALLOC);
566       PARSE_FLAG ("load", SEC_LOAD);
567       PARSE_FLAG ("noload", SEC_NEVER_LOAD);
568       PARSE_FLAG ("readonly", SEC_READONLY);
569       PARSE_FLAG ("debug", SEC_DEBUGGING);
570       PARSE_FLAG ("code", SEC_CODE);
571       PARSE_FLAG ("data", SEC_DATA);
572       PARSE_FLAG ("rom", SEC_ROM);
573       PARSE_FLAG ("share", SEC_COFF_SHARED);
574       PARSE_FLAG ("contents", SEC_HAS_CONTENTS);
575 #undef PARSE_FLAG
576       else
577         {
578           char *copy;
579
580           copy = xmalloc (len + 1);
581           strncpy (copy, s, len);
582           copy[len] = '\0';
583           non_fatal (_("unrecognized section flag `%s'"), copy);
584           fatal (_("supported flags: %s"),
585                  "alloc, load, noload, readonly, debug, code, data, rom, share, contents");
586         }
587
588       s = snext;
589     }
590   while (s != NULL);
591
592   return ret;
593 }
594
595 /* Find and optionally add an entry in the change_sections list.  */
596
597 static struct section_list *
598 find_section_list (const char *name, bfd_boolean add)
599 {
600   struct section_list *p;
601
602   for (p = change_sections; p != NULL; p = p->next)
603     if (strcmp (p->name, name) == 0)
604       return p;
605
606   if (! add)
607     return NULL;
608
609   p = xmalloc (sizeof (struct section_list));
610   p->name = name;
611   p->used = FALSE;
612   p->remove = FALSE;
613   p->copy = FALSE;
614   p->change_vma = CHANGE_IGNORE;
615   p->change_lma = CHANGE_IGNORE;
616   p->vma_val = 0;
617   p->lma_val = 0;
618   p->set_flags = FALSE;
619   p->flags = 0;
620
621   p->next = change_sections;
622   change_sections = p;
623
624   return p;
625 }
626
627 /* Add a symbol to strip_specific_list.  */
628
629 static void
630 add_specific_symbol (const char *name, struct symlist **list)
631 {
632   struct symlist *tmp_list;
633
634   tmp_list = xmalloc (sizeof (struct symlist));
635   tmp_list->name = name;
636   tmp_list->next = *list;
637   *list = tmp_list;
638 }
639
640 /* Add symbols listed in `filename' to strip_specific_list.  */
641
642 #define IS_WHITESPACE(c)      ((c) == ' ' || (c) == '\t')
643 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
644
645 static void
646 add_specific_symbols (const char *filename, struct symlist **list)
647 {
648   off_t  size;
649   FILE * f;
650   char * line;
651   char * buffer;
652   unsigned int line_count;
653
654   size = get_file_size (filename);
655   if (size == 0)
656     {
657       status = 1;
658       return;
659     }
660
661   buffer = xmalloc (size + 2);
662   f = fopen (filename, FOPEN_RT);
663   if (f == NULL)
664     fatal (_("cannot open '%s': %s"), filename, strerror (errno));
665
666   if (fread (buffer, 1, size, f) == 0 || ferror (f))
667     fatal (_("%s: fread failed"), filename);
668
669   fclose (f);
670   buffer [size] = '\n';
671   buffer [size + 1] = '\0';
672
673   line_count = 1;
674
675   for (line = buffer; * line != '\0'; line ++)
676     {
677       char * eol;
678       char * name;
679       char * name_end;
680       int finished = FALSE;
681
682       for (eol = line;; eol ++)
683         {
684           switch (* eol)
685             {
686             case '\n':
687               * eol = '\0';
688               /* Cope with \n\r.  */
689               if (eol[1] == '\r')
690                 ++ eol;
691               finished = TRUE;
692               break;
693
694             case '\r':
695               * eol = '\0';
696               /* Cope with \r\n.  */
697               if (eol[1] == '\n')
698                 ++ eol;
699               finished = TRUE;
700               break;
701
702             case 0:
703               finished = TRUE;
704               break;
705
706             case '#':
707               /* Line comment, Terminate the line here, in case a
708                  name is present and then allow the rest of the
709                  loop to find the real end of the line.  */
710               * eol = '\0';
711               break;
712
713             default:
714               break;
715             }
716
717           if (finished)
718             break;
719         }
720
721       /* A name may now exist somewhere between 'line' and 'eol'.
722          Strip off leading whitespace and trailing whitespace,
723          then add it to the list.  */
724       for (name = line; IS_WHITESPACE (* name); name ++)
725         ;
726       for (name_end = name;
727            (! IS_WHITESPACE (* name_end))
728            && (! IS_LINE_TERMINATOR (* name_end));
729            name_end ++)
730         ;
731
732       if (! IS_LINE_TERMINATOR (* name_end))
733         {
734           char * extra;
735
736           for (extra = name_end + 1; IS_WHITESPACE (* extra); extra ++)
737             ;
738
739           if (! IS_LINE_TERMINATOR (* extra))
740             non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
741                        filename, line_count);
742         }
743
744       * name_end = '\0';
745
746       if (name_end > name)
747         add_specific_symbol (name, list);
748
749       /* Advance line pointer to end of line.  The 'eol ++' in the for
750          loop above will then advance us to the start of the next line.  */
751       line = eol;
752       line_count ++;
753     }
754 }
755
756 /* See whether a symbol should be stripped or kept based on
757    strip_specific_list and keep_symbols.  */
758
759 static bfd_boolean
760 is_specified_symbol (const char *name, struct symlist *list)
761 {
762   struct symlist *tmp_list;
763
764   if (wildcard)
765     {
766       for (tmp_list = list; tmp_list; tmp_list = tmp_list->next)
767         if (*(tmp_list->name) != '!')
768           {
769             if (!fnmatch (tmp_list->name, name, 0))
770               return TRUE;
771           }
772         else
773           {
774             if (fnmatch (tmp_list->name + 1, name, 0))
775               return TRUE;
776           }
777     }
778   else
779     {
780       for (tmp_list = list; tmp_list; tmp_list = tmp_list->next)
781         if (strcmp (name, tmp_list->name) == 0)
782           return TRUE;
783     }
784
785   return FALSE;
786 }
787
788 /* Return a pointer to the symbol used as a signature for GROUP.  */
789
790 static asymbol *
791 group_signature (asection *group)
792 {
793   bfd *abfd = group->owner;
794   Elf_Internal_Shdr *ghdr;
795
796   if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
797     return NULL;
798
799   ghdr = &elf_section_data (group)->this_hdr;
800   if (ghdr->sh_link < elf_numsections (abfd))
801     {
802       const struct elf_backend_data *bed = get_elf_backend_data (abfd);
803       Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link];
804
805       if (symhdr->sh_type == SHT_SYMTAB
806           && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym)
807         return isympp[ghdr->sh_info];
808     }
809   return NULL;
810 }
811
812 /* See if a section is being removed.  */
813
814 static bfd_boolean
815 is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
816 {
817   if (sections_removed || sections_copied)
818     {
819       struct section_list *p;
820
821       p = find_section_list (bfd_get_section_name (abfd, sec), FALSE);
822
823       if (sections_removed && p != NULL && p->remove)
824         return TRUE;
825       if (sections_copied && (p == NULL || ! p->copy))
826         return TRUE;
827     }
828
829   if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
830     {
831       if (strip_symbols == STRIP_DEBUG
832           || strip_symbols == STRIP_UNNEEDED
833           || strip_symbols == STRIP_ALL
834           || discard_locals == LOCALS_ALL
835           || convert_debugging)
836         return TRUE;
837
838       if (strip_symbols == STRIP_NONDEBUG)
839         return FALSE;
840     }
841
842   if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0)
843     {
844       asymbol *gsym;
845       const char *gname;
846
847       /* PR binutils/3166
848          Group sections look like debugging sections but they are not.
849          (They have a non-zero size but they are not ALLOCated).  */
850       if (strip_symbols == STRIP_NONDEBUG)
851         return TRUE;
852
853       /* PR binutils/3181
854          If we are going to strip the group signature symbol, then
855          strip the group section too.  */
856       gsym = group_signature (sec);
857       if (gsym != NULL)
858         gname = gsym->name;
859       else
860         gname = sec->name;
861       if ((strip_symbols == STRIP_ALL
862            && !is_specified_symbol (gname, keep_specific_list))
863           || is_specified_symbol (gname, strip_specific_list))
864         return TRUE;
865     }
866
867   return FALSE;
868 }
869
870 /* Return true if SYM is a hidden symbol.  */
871
872 static bfd_boolean
873 is_hidden_symbol (asymbol *sym)
874 {
875   elf_symbol_type *elf_sym;
876
877   elf_sym = elf_symbol_from (sym->the_bfd, sym);
878   if (elf_sym != NULL)
879     switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
880       {
881       case STV_HIDDEN:
882       case STV_INTERNAL:
883         return TRUE;
884       }
885   return FALSE;
886 }
887
888 /* Choose which symbol entries to copy; put the result in OSYMS.
889    We don't copy in place, because that confuses the relocs.
890    Return the number of symbols to print.  */
891
892 static unsigned int
893 filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
894                 asymbol **isyms, long symcount)
895 {
896   asymbol **from = isyms, **to = osyms;
897   long src_count = 0, dst_count = 0;
898   int relocatable = (abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC))
899                     == HAS_RELOC;
900
901   for (; src_count < symcount; src_count++)
902     {
903       asymbol *sym = from[src_count];
904       flagword flags = sym->flags;
905       char *name = (char *) bfd_asymbol_name (sym);
906       int keep;
907       bfd_boolean undefined;
908       bfd_boolean rem_leading_char;
909       bfd_boolean add_leading_char;
910
911       undefined = bfd_is_und_section (bfd_get_section (sym));
912
913       if (redefine_sym_list)
914         {
915           char *old_name, *new_name;
916
917           old_name = (char *) bfd_asymbol_name (sym);
918           new_name = (char *) lookup_sym_redefinition (old_name);
919           bfd_asymbol_name (sym) = new_name;
920           name = new_name;
921         }
922
923       /* Check if we will remove the current leading character.  */
924       rem_leading_char =
925         (name[0] == bfd_get_symbol_leading_char (abfd))
926         && (change_leading_char
927             || (remove_leading_char
928                 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
929                     || undefined
930                     || bfd_is_com_section (bfd_get_section (sym)))));
931
932       /* Check if we will add a new leading character.  */
933       add_leading_char =
934         change_leading_char
935         && (bfd_get_symbol_leading_char (obfd) != '\0')
936         && (bfd_get_symbol_leading_char (abfd) == '\0'
937             || (name[0] == bfd_get_symbol_leading_char (abfd)));
938
939       /* Short circuit for change_leading_char if we can do it in-place.  */
940       if (rem_leading_char && add_leading_char && !prefix_symbols_string)
941         {
942           name[0] = bfd_get_symbol_leading_char (obfd);
943           bfd_asymbol_name (sym) = name;
944           rem_leading_char = FALSE;
945           add_leading_char = FALSE;
946         }
947
948       /* Remove leading char.  */
949       if (rem_leading_char)
950         bfd_asymbol_name (sym) = ++name;
951
952       /* Add new leading char and/or prefix.  */
953       if (add_leading_char || prefix_symbols_string)
954         {
955           char *n, *ptr;
956
957           ptr = n = xmalloc (1 + strlen (prefix_symbols_string)
958                              + strlen (name) + 1);
959           if (add_leading_char)
960             *ptr++ = bfd_get_symbol_leading_char (obfd);
961
962           if (prefix_symbols_string)
963             {
964               strcpy (ptr, prefix_symbols_string);
965               ptr += strlen (prefix_symbols_string);
966            }
967
968           strcpy (ptr, name);
969           bfd_asymbol_name (sym) = n;
970           name = n;
971         }
972
973       if (strip_symbols == STRIP_ALL)
974         keep = 0;
975       else if ((flags & BSF_KEEP) != 0          /* Used in relocation.  */
976                || ((flags & BSF_SECTION_SYM) != 0
977                    && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
978                        & BSF_KEEP) != 0))
979         keep = 1;
980       else if (relocatable                      /* Relocatable file.  */
981                && (flags & (BSF_GLOBAL | BSF_WEAK)) != 0)
982         keep = 1;
983       else if (bfd_decode_symclass (sym) == 'I')
984         /* Global symbols in $idata sections need to be retained
985            even if relocatable is FALSE.  External users of the
986            library containing the $idata section may reference these
987            symbols.  */
988         keep = 1;
989       else if ((flags & BSF_GLOBAL) != 0        /* Global symbol.  */
990                || (flags & BSF_WEAK) != 0
991                || undefined
992                || bfd_is_com_section (bfd_get_section (sym)))
993         keep = strip_symbols != STRIP_UNNEEDED;
994       else if ((flags & BSF_DEBUGGING) != 0)    /* Debugging symbol.  */
995         keep = (strip_symbols != STRIP_DEBUG
996                 && strip_symbols != STRIP_UNNEEDED
997                 && ! convert_debugging);
998       else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym)))
999         /* COMDAT sections store special information in local
1000            symbols, so we cannot risk stripping any of them.  */
1001         keep = 1;
1002       else                      /* Local symbol.  */
1003         keep = (strip_symbols != STRIP_UNNEEDED
1004                 && (discard_locals != LOCALS_ALL
1005                     && (discard_locals != LOCALS_START_L
1006                         || ! bfd_is_local_label (abfd, sym))));
1007
1008       if (keep && is_specified_symbol (name, strip_specific_list))
1009         keep = 0;
1010       if (keep
1011           && !(flags & BSF_KEEP)
1012           && is_specified_symbol (name, strip_unneeded_list))
1013         keep = 0;
1014       if (!keep
1015           && ((keep_file_symbols && (flags & BSF_FILE))
1016               || is_specified_symbol (name, keep_specific_list)))
1017         keep = 1;
1018       if (keep && is_strip_section (abfd, bfd_get_section (sym)))
1019         keep = 0;
1020
1021       if (keep)
1022         {
1023           if ((flags & BSF_GLOBAL) != 0
1024               && (weaken || is_specified_symbol (name, weaken_specific_list)))
1025             {
1026               sym->flags &= ~ BSF_GLOBAL;
1027               sym->flags |= BSF_WEAK;
1028             }
1029
1030           if (!undefined
1031               && (flags & (BSF_GLOBAL | BSF_WEAK))
1032               && (is_specified_symbol (name, localize_specific_list)
1033                   || (keepglobal_specific_list != NULL
1034                       && ! is_specified_symbol (name, keepglobal_specific_list))
1035                   || (localize_hidden && is_hidden_symbol (sym))))
1036             {
1037               sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
1038               sym->flags |= BSF_LOCAL;
1039             }
1040
1041           if (!undefined
1042               && (flags & BSF_LOCAL) 
1043               && is_specified_symbol (name, globalize_specific_list))
1044             {
1045               sym->flags &= ~ BSF_LOCAL;
1046               sym->flags |= BSF_GLOBAL;
1047             }
1048
1049           to[dst_count++] = sym;
1050         }
1051     }
1052
1053   to[dst_count] = NULL;
1054
1055   return dst_count;
1056 }
1057
1058 /* Find the redefined name of symbol SOURCE.  */
1059
1060 static const char *
1061 lookup_sym_redefinition (const char *source)
1062 {
1063   struct redefine_node *list;
1064
1065   for (list = redefine_sym_list; list != NULL; list = list->next)
1066     if (strcmp (source, list->source) == 0)
1067       return list->target;
1068
1069   return source;
1070 }
1071
1072 /* Add a node to a symbol redefine list.  */
1073
1074 static void
1075 redefine_list_append (const char *cause, const char *source, const char *target)
1076 {
1077   struct redefine_node **p;
1078   struct redefine_node *list;
1079   struct redefine_node *new_node;
1080
1081   for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next)
1082     {
1083       if (strcmp (source, list->source) == 0)
1084         fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1085                cause, source);
1086
1087       if (strcmp (target, list->target) == 0)
1088         fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1089                cause, target);
1090     }
1091
1092   new_node = xmalloc (sizeof (struct redefine_node));
1093
1094   new_node->source = strdup (source);
1095   new_node->target = strdup (target);
1096   new_node->next = NULL;
1097
1098   *p = new_node;
1099 }
1100
1101 /* Handle the --redefine-syms option.  Read lines containing "old new"
1102    from the file, and add them to the symbol redefine list.  */
1103
1104 static void
1105 add_redefine_syms_file (const char *filename)
1106 {
1107   FILE *file;
1108   char *buf;
1109   size_t bufsize;
1110   size_t len;
1111   size_t outsym_off;
1112   int c, lineno;
1113
1114   file = fopen (filename, "r");
1115   if (file == NULL)
1116     fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1117            filename, strerror (errno));
1118
1119   bufsize = 100;
1120   buf = xmalloc (bufsize);
1121
1122   lineno = 1;
1123   c = getc (file);
1124   len = 0;
1125   outsym_off = 0;
1126   while (c != EOF)
1127     {
1128       /* Collect the input symbol name.  */
1129       while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1130         {
1131           if (c == '#')
1132             goto comment;
1133           buf[len++] = c;
1134           if (len >= bufsize)
1135             {
1136               bufsize *= 2;
1137               buf = xrealloc (buf, bufsize);
1138             }
1139           c = getc (file);
1140         }
1141       buf[len++] = '\0';
1142       if (c == EOF)
1143         break;
1144
1145       /* Eat white space between the symbol names.  */
1146       while (IS_WHITESPACE (c))
1147         c = getc (file);
1148       if (c == '#' || IS_LINE_TERMINATOR (c))
1149         goto comment;
1150       if (c == EOF)
1151         break;
1152
1153       /* Collect the output symbol name.  */
1154       outsym_off = len;
1155       while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1156         {
1157           if (c == '#')
1158             goto comment;
1159           buf[len++] = c;
1160           if (len >= bufsize)
1161             {
1162               bufsize *= 2;
1163               buf = xrealloc (buf, bufsize);
1164             }
1165           c = getc (file);
1166         }
1167       buf[len++] = '\0';
1168       if (c == EOF)
1169         break;
1170
1171       /* Eat white space at end of line.  */
1172       while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c))
1173         c = getc (file);
1174       if (c == '#')
1175         goto comment;
1176       /* Handle \r\n.  */
1177       if ((c == '\r' && (c = getc (file)) == '\n')
1178           || c == '\n' || c == EOF)
1179         {
1180  end_of_line:
1181           /* Append the redefinition to the list.  */
1182           if (buf[0] != '\0')
1183             redefine_list_append (filename, &buf[0], &buf[outsym_off]);
1184
1185           lineno++;     
1186           len = 0;
1187           outsym_off = 0;
1188           if (c == EOF)
1189             break;
1190           c = getc (file);
1191           continue;
1192         }
1193       else
1194         fatal (_("%s:%d: garbage found at end of line"), filename, lineno);
1195  comment:
1196       if (len != 0 && (outsym_off == 0 || outsym_off == len))
1197         fatal (_("%s:%d: missing new symbol name"), filename, lineno);
1198       buf[len++] = '\0';
1199
1200       /* Eat the rest of the line and finish it.  */
1201       while (c != '\n' && c != EOF)
1202         c = getc (file);
1203       goto end_of_line;
1204     }
1205
1206   if (len != 0)
1207     fatal (_("%s:%d: premature end of file"), filename, lineno);
1208
1209   free (buf);
1210 }
1211
1212 /* Copy unkown object file IBFD onto OBFD.
1213    Returns TRUE upon success, FALSE otherwise.  */
1214
1215 static bfd_boolean
1216 copy_unknown_object (bfd *ibfd, bfd *obfd)
1217 {
1218   char *cbuf;
1219   int tocopy;
1220   long ncopied;
1221   long size;
1222   struct stat buf;
1223
1224   if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1225     {
1226       bfd_nonfatal (bfd_get_archive_filename (ibfd));
1227       return FALSE;
1228     }
1229
1230   size = buf.st_size;
1231   if (size < 0)
1232     {
1233       non_fatal (_("stat returns negative size for `%s'"),
1234                  bfd_get_archive_filename (ibfd));
1235       return FALSE;
1236     }
1237
1238   if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1239     {
1240       bfd_nonfatal (bfd_get_archive_filename (ibfd));
1241       return FALSE;
1242     }
1243
1244   if (verbose)
1245     printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1246             bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1247
1248   cbuf = xmalloc (BUFSIZE);
1249   ncopied = 0;
1250   while (ncopied < size)
1251     {
1252       tocopy = size - ncopied;
1253       if (tocopy > BUFSIZE)
1254         tocopy = BUFSIZE;
1255
1256       if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1257           != (bfd_size_type) tocopy)
1258         {
1259           bfd_nonfatal (bfd_get_archive_filename (ibfd));
1260           free (cbuf);
1261           return FALSE;
1262         }
1263
1264       if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1265           != (bfd_size_type) tocopy)
1266         {
1267           bfd_nonfatal (bfd_get_filename (obfd));
1268           free (cbuf);
1269           return FALSE;
1270         }
1271
1272       ncopied += tocopy;
1273     }
1274
1275   chmod (bfd_get_filename (obfd), buf.st_mode);
1276   free (cbuf);
1277   return TRUE;
1278 }
1279
1280 /* Copy object file IBFD onto OBFD.
1281    Returns TRUE upon success, FALSE otherwise.  */
1282
1283 static bfd_boolean
1284 copy_object (bfd *ibfd, bfd *obfd)
1285 {
1286   bfd_vma start;
1287   long symcount;
1288   asection **osections = NULL;
1289   asection *gnu_debuglink_section = NULL;
1290   bfd_size_type *gaps = NULL;
1291   bfd_size_type max_gap = 0;
1292   long symsize;
1293   void *dhandle;
1294   enum bfd_architecture iarch;
1295   unsigned int imach;
1296
1297   if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1298       && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
1299       && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
1300     fatal (_("Unable to change endianness of input file(s)"));
1301
1302   if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1303     {
1304       bfd_nonfatal (bfd_get_filename (obfd));
1305       return FALSE;
1306     }
1307
1308   if (verbose)
1309     printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
1310             bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
1311             bfd_get_filename (obfd), bfd_get_target (obfd));
1312
1313   if (set_start_set)
1314     start = set_start;
1315   else
1316     start = bfd_get_start_address (ibfd);
1317   start += change_start;
1318
1319   /* Neither the start address nor the flags
1320      need to be set for a core file.  */
1321   if (bfd_get_format (obfd) != bfd_core)
1322     {
1323       flagword flags;
1324
1325       flags = bfd_get_file_flags (ibfd);
1326       flags |= bfd_flags_to_set;
1327       flags &= ~bfd_flags_to_clear;
1328       flags &= bfd_applicable_file_flags (obfd);
1329
1330       if (!bfd_set_start_address (obfd, start)
1331           || !bfd_set_file_flags (obfd, flags))
1332         {
1333           bfd_nonfatal (bfd_get_archive_filename (ibfd));
1334           return FALSE;
1335         }
1336     }
1337
1338   /* Copy architecture of input file to output file.  */
1339   iarch = bfd_get_arch (ibfd);
1340   imach = bfd_get_mach (ibfd);
1341   if (!bfd_set_arch_mach (obfd, iarch, imach)
1342       && (ibfd->target_defaulted
1343           || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
1344     {
1345       if (bfd_get_arch (ibfd) == bfd_arch_unknown)
1346         non_fatal (_("Unable to recognise the format of the input file `%s'"),
1347                    bfd_get_archive_filename (ibfd));
1348       else
1349         non_fatal (_("Warning: Output file cannot represent architecture `%s'"),
1350                    bfd_printable_arch_mach (bfd_get_arch (ibfd),
1351                                             bfd_get_mach (ibfd)));
1352       return FALSE;
1353     }
1354
1355   if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1356     {
1357       bfd_nonfatal (bfd_get_archive_filename (ibfd));
1358       return FALSE;
1359     }
1360
1361   if (isympp)
1362     free (isympp);
1363
1364   if (osympp != isympp)
1365     free (osympp);
1366
1367   isympp = NULL;
1368   osympp = NULL;
1369
1370   symsize = bfd_get_symtab_upper_bound (ibfd);
1371   if (symsize < 0)
1372     {
1373       bfd_nonfatal (bfd_get_archive_filename (ibfd));
1374       return FALSE;
1375     }
1376
1377   osympp = isympp = xmalloc (symsize);
1378   symcount = bfd_canonicalize_symtab (ibfd, isympp);
1379   if (symcount < 0)
1380     {
1381       bfd_nonfatal (bfd_get_filename (ibfd));
1382       return FALSE;
1383     }
1384
1385   /* BFD mandates that all output sections be created and sizes set before
1386      any output is done.  Thus, we traverse all sections multiple times.  */
1387   bfd_map_over_sections (ibfd, setup_section, obfd);
1388
1389   setup_bfd_headers (ibfd, obfd);
1390
1391   if (add_sections != NULL)
1392     {
1393       struct section_add *padd;
1394       struct section_list *pset;
1395
1396       for (padd = add_sections; padd != NULL; padd = padd->next)
1397         {
1398           flagword flags;
1399
1400           pset = find_section_list (padd->name, FALSE);
1401           if (pset != NULL)
1402             pset->used = TRUE;
1403
1404           flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
1405           if (pset != NULL && pset->set_flags)
1406             flags = pset->flags | SEC_HAS_CONTENTS;
1407
1408           /* bfd_make_section_with_flags() does not return very helpful
1409              error codes, so check for the most likely user error first.  */
1410           if (bfd_get_section_by_name (obfd, padd->name))
1411             {
1412               non_fatal (_("can't add section '%s' - it already exists!"), padd->name);
1413               return FALSE;
1414             }
1415           else
1416             {
1417               padd->section = bfd_make_section_with_flags (obfd, padd->name, flags);
1418               if (padd->section == NULL)
1419                 {
1420                   non_fatal (_("can't create section `%s': %s"),
1421                              padd->name, bfd_errmsg (bfd_get_error ()));
1422                   return FALSE;
1423                 }
1424             }
1425
1426           if (! bfd_set_section_size (obfd, padd->section, padd->size))
1427             {
1428               bfd_nonfatal (bfd_get_filename (obfd));
1429               return FALSE;
1430             }
1431
1432           if (pset != NULL)
1433             {
1434               if (pset->change_vma != CHANGE_IGNORE)
1435                 if (! bfd_set_section_vma (obfd, padd->section,
1436                                            pset->vma_val))
1437                   {
1438                     bfd_nonfatal (bfd_get_filename (obfd));
1439                     return FALSE;
1440                   }
1441
1442               if (pset->change_lma != CHANGE_IGNORE)
1443                 {
1444                   padd->section->lma = pset->lma_val;
1445
1446                   if (! bfd_set_section_alignment
1447                       (obfd, padd->section,
1448                        bfd_section_alignment (obfd, padd->section)))
1449                     {
1450                       bfd_nonfatal (bfd_get_filename (obfd));
1451                       return FALSE;
1452                     }
1453                 }
1454             }
1455         }
1456     }
1457
1458   if (gnu_debuglink_filename != NULL)
1459     {
1460       gnu_debuglink_section = bfd_create_gnu_debuglink_section
1461         (obfd, gnu_debuglink_filename);
1462
1463       if (gnu_debuglink_section == NULL)
1464         {
1465           bfd_nonfatal (gnu_debuglink_filename);
1466           return FALSE;
1467         }
1468
1469       /* Special processing for PE format files.  We
1470          have no way to distinguish PE from COFF here.  */
1471       if (bfd_get_flavour (obfd) == bfd_target_coff_flavour)
1472         {
1473           bfd_vma debuglink_vma;
1474           asection * highest_section;
1475           asection * sec;
1476
1477           /* The PE spec requires that all sections be adjacent and sorted
1478              in ascending order of VMA.  It also specifies that debug
1479              sections should be last.  This is despite the fact that debug
1480              sections are not loaded into memory and so in theory have no
1481              use for a VMA.
1482
1483              This means that the debuglink section must be given a non-zero
1484              VMA which makes it contiguous with other debug sections.  So
1485              walk the current section list, find the section with the
1486              highest VMA and start the debuglink section after that one.  */
1487           for (sec = obfd->sections, highest_section = NULL;
1488                sec != NULL;
1489                sec = sec->next)
1490             if (sec->vma > 0
1491                 && (highest_section == NULL
1492                     || sec->vma > highest_section->vma))
1493               highest_section = sec;
1494
1495           if (highest_section)
1496             debuglink_vma = BFD_ALIGN (highest_section->vma
1497                                        + highest_section->size,
1498                                        /* FIXME: We ought to be using
1499                                           COFF_PAGE_SIZE here or maybe
1500                                           bfd_get_section_alignment() (if it
1501                                           was set) but since this is for PE
1502                                           and we know the required alignment
1503                                           it is easier just to hard code it.  */
1504                                        0x1000);
1505           else
1506             /* Umm, not sure what to do in this case.  */
1507             debuglink_vma = 0x1000;
1508
1509           bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
1510         }
1511     }
1512
1513   if (bfd_count_sections (obfd) == 0)
1514     {
1515       non_fatal (_("there are no sections to be copied!"));
1516       return FALSE;
1517     }
1518
1519   if (gap_fill_set || pad_to_set)
1520     {
1521       asection **set;
1522       unsigned int c, i;
1523
1524       /* We must fill in gaps between the sections and/or we must pad
1525          the last section to a specified address.  We do this by
1526          grabbing a list of the sections, sorting them by VMA, and
1527          increasing the section sizes as required to fill the gaps.
1528          We write out the gap contents below.  */
1529
1530       c = bfd_count_sections (obfd);
1531       osections = xmalloc (c * sizeof (asection *));
1532       set = osections;
1533       bfd_map_over_sections (obfd, get_sections, &set);
1534
1535       qsort (osections, c, sizeof (asection *), compare_section_lma);
1536
1537       gaps = xmalloc (c * sizeof (bfd_size_type));
1538       memset (gaps, 0, c * sizeof (bfd_size_type));
1539
1540       if (gap_fill_set)
1541         {
1542           for (i = 0; i < c - 1; i++)
1543             {
1544               flagword flags;
1545               bfd_size_type size;
1546               bfd_vma gap_start, gap_stop;
1547
1548               flags = bfd_get_section_flags (obfd, osections[i]);
1549               if ((flags & SEC_HAS_CONTENTS) == 0
1550                   || (flags & SEC_LOAD) == 0)
1551                 continue;
1552
1553               size = bfd_section_size (obfd, osections[i]);
1554               gap_start = bfd_section_lma (obfd, osections[i]) + size;
1555               gap_stop = bfd_section_lma (obfd, osections[i + 1]);
1556               if (gap_start < gap_stop)
1557                 {
1558                   if (! bfd_set_section_size (obfd, osections[i],
1559                                               size + (gap_stop - gap_start)))
1560                     {
1561                       non_fatal (_("Can't fill gap after %s: %s"),
1562                                  bfd_get_section_name (obfd, osections[i]),
1563                                  bfd_errmsg (bfd_get_error ()));
1564                       status = 1;
1565                       break;
1566                     }
1567                   gaps[i] = gap_stop - gap_start;
1568                   if (max_gap < gap_stop - gap_start)
1569                     max_gap = gap_stop - gap_start;
1570                 }
1571             }
1572         }
1573
1574       if (pad_to_set)
1575         {
1576           bfd_vma lma;
1577           bfd_size_type size;
1578
1579           lma = bfd_section_lma (obfd, osections[c - 1]);
1580           size = bfd_section_size (obfd, osections[c - 1]);
1581           if (lma + size < pad_to)
1582             {
1583               if (! bfd_set_section_size (obfd, osections[c - 1],
1584                                           pad_to - lma))
1585                 {
1586                   non_fatal (_("Can't add padding to %s: %s"),
1587                              bfd_get_section_name (obfd, osections[c - 1]),
1588                              bfd_errmsg (bfd_get_error ()));
1589                   status = 1;
1590                 }
1591               else
1592                 {
1593                   gaps[c - 1] = pad_to - (lma + size);
1594                   if (max_gap < pad_to - (lma + size))
1595                     max_gap = pad_to - (lma + size);
1596                 }
1597             }
1598         }
1599     }
1600
1601   /* Symbol filtering must happen after the output sections
1602      have been created, but before their contents are set.  */
1603   dhandle = NULL;
1604   if (convert_debugging)
1605     dhandle = read_debugging_info (ibfd, isympp, symcount);
1606
1607   if (strip_symbols == STRIP_DEBUG
1608       || strip_symbols == STRIP_ALL
1609       || strip_symbols == STRIP_UNNEEDED
1610       || strip_symbols == STRIP_NONDEBUG
1611       || discard_locals != LOCALS_UNDEF
1612       || localize_hidden
1613       || strip_specific_list != NULL
1614       || keep_specific_list != NULL
1615       || localize_specific_list != NULL
1616       || globalize_specific_list != NULL
1617       || keepglobal_specific_list != NULL
1618       || weaken_specific_list != NULL
1619       || prefix_symbols_string
1620       || sections_removed
1621       || sections_copied
1622       || convert_debugging
1623       || change_leading_char
1624       || remove_leading_char
1625       || redefine_sym_list
1626       || weaken)
1627     {
1628       /* Mark symbols used in output relocations so that they
1629          are kept, even if they are local labels or static symbols.
1630
1631          Note we iterate over the input sections examining their
1632          relocations since the relocations for the output sections
1633          haven't been set yet.  mark_symbols_used_in_relocations will
1634          ignore input sections which have no corresponding output
1635          section.  */
1636       if (strip_symbols != STRIP_ALL)
1637         bfd_map_over_sections (ibfd,
1638                                mark_symbols_used_in_relocations,
1639                                isympp);
1640       osympp = xmalloc ((symcount + 1) * sizeof (asymbol *));
1641       symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
1642     }
1643
1644   if (convert_debugging && dhandle != NULL)
1645     {
1646       if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
1647         {
1648           status = 1;
1649           return FALSE;
1650         }
1651     }
1652
1653   bfd_set_symtab (obfd, osympp, symcount);
1654
1655   /* This has to happen after the symbol table has been set.  */
1656   bfd_map_over_sections (ibfd, copy_section, obfd);
1657
1658   if (add_sections != NULL)
1659     {
1660       struct section_add *padd;
1661
1662       for (padd = add_sections; padd != NULL; padd = padd->next)
1663         {
1664           if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
1665                                           0, padd->size))
1666             {
1667               bfd_nonfatal (bfd_get_filename (obfd));
1668               return FALSE;
1669             }
1670         }
1671     }
1672
1673   if (gnu_debuglink_filename != NULL)
1674     {
1675       if (! bfd_fill_in_gnu_debuglink_section
1676           (obfd, gnu_debuglink_section, gnu_debuglink_filename))
1677         {
1678           bfd_nonfatal (gnu_debuglink_filename);
1679           return FALSE;
1680         }
1681     }
1682
1683   if (gap_fill_set || pad_to_set)
1684     {
1685       bfd_byte *buf;
1686       int c, i;
1687
1688       /* Fill in the gaps.  */
1689       if (max_gap > 8192)
1690         max_gap = 8192;
1691       buf = xmalloc (max_gap);
1692       memset (buf, gap_fill, max_gap);
1693
1694       c = bfd_count_sections (obfd);
1695       for (i = 0; i < c; i++)
1696         {
1697           if (gaps[i] != 0)
1698             {
1699               bfd_size_type left;
1700               file_ptr off;
1701
1702               left = gaps[i];
1703               off = bfd_section_size (obfd, osections[i]) - left;
1704
1705               while (left > 0)
1706                 {
1707                   bfd_size_type now;
1708
1709                   if (left > 8192)
1710                     now = 8192;
1711                   else
1712                     now = left;
1713
1714                   if (! bfd_set_section_contents (obfd, osections[i], buf,
1715                                                   off, now))
1716                     {
1717                       bfd_nonfatal (bfd_get_filename (obfd));
1718                       return FALSE;
1719                     }
1720
1721                   left -= now;
1722                   off += now;
1723                 }
1724             }
1725         }
1726     }
1727
1728   /* Allow the BFD backend to copy any private data it understands
1729      from the input BFD to the output BFD.  This is done last to
1730      permit the routine to look at the filtered symbol table, which is
1731      important for the ECOFF code at least.  */
1732   if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour
1733       && strip_symbols == STRIP_NONDEBUG)
1734     /* Do not copy the private data when creating an ELF format
1735        debug info file.  We do not want the program headers.  */
1736     ;
1737   else if (! bfd_copy_private_bfd_data (ibfd, obfd))
1738     {
1739       non_fatal (_("%s: error copying private BFD data: %s"),
1740                  bfd_get_filename (obfd),
1741                  bfd_errmsg (bfd_get_error ()));
1742       return FALSE;
1743     }
1744
1745   /* Switch to the alternate machine code.  We have to do this at the
1746      very end, because we only initialize the header when we create
1747      the first section.  */
1748   if (use_alt_mach_code != 0)
1749     {
1750       if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
1751         {
1752           non_fatal (_("this target does not support %lu alternative machine codes"),
1753                      use_alt_mach_code);
1754           if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
1755             {
1756               non_fatal (_("treating that number as an absolute e_machine value instead"));
1757               elf_elfheader (obfd)->e_machine = use_alt_mach_code;
1758             }
1759           else
1760             non_fatal (_("ignoring the alternative value"));
1761         }
1762     }
1763
1764   return TRUE;
1765 }
1766
1767 #undef MKDIR
1768 #if defined (_WIN32) && !defined (__CYGWIN32__)
1769 #define MKDIR(DIR, MODE) mkdir (DIR)
1770 #else
1771 #define MKDIR(DIR, MODE) mkdir (DIR, MODE)
1772 #endif
1773
1774 /* Read each archive element in turn from IBFD, copy the
1775    contents to temp file, and keep the temp file handle.
1776    If 'force_output_target' is TRUE then make sure that
1777    all elements in the new archive are of the type
1778    'output_target'.  */
1779
1780 static void
1781 copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
1782               bfd_boolean force_output_target)
1783 {
1784   struct name_list
1785     {
1786       struct name_list *next;
1787       const char *name;
1788       bfd *obfd;
1789     } *list, *l;
1790   bfd **ptr = &obfd->archive_head;
1791   bfd *this_element;
1792   char *dir = make_tempname (bfd_get_filename (obfd));
1793
1794   /* Make a temp directory to hold the contents.  */
1795   if (MKDIR (dir, 0700) != 0)
1796     fatal (_("cannot mkdir %s for archive copying (error: %s)"),
1797            dir, strerror (errno));
1798
1799   obfd->has_armap = ibfd->has_armap;
1800
1801   list = NULL;
1802
1803   this_element = bfd_openr_next_archived_file (ibfd, NULL);
1804
1805   if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1806     RETURN_NONFATAL (bfd_get_filename (obfd));
1807
1808   while (!status && this_element != NULL)
1809     {
1810       char *output_name;
1811       bfd *output_bfd;
1812       bfd *last_element;
1813       struct stat buf;
1814       int stat_status = 0;
1815       bfd_boolean delete = TRUE;
1816
1817       /* Create an output file for this member.  */
1818       output_name = concat (dir, "/",
1819                             bfd_get_filename (this_element), (char *) 0);
1820
1821       /* If the file already exists, make another temp dir.  */
1822       if (stat (output_name, &buf) >= 0)
1823         {
1824           output_name = make_tempname (output_name);
1825           if (MKDIR (output_name, 0700) != 0)
1826             fatal (_("cannot mkdir %s for archive copying (error: %s)"),
1827                    output_name, strerror (errno));
1828
1829           l = xmalloc (sizeof (struct name_list));
1830           l->name = output_name;
1831           l->next = list;
1832           l->obfd = NULL;
1833           list = l;
1834           output_name = concat (output_name, "/",
1835                                 bfd_get_filename (this_element), (char *) 0);
1836         }
1837
1838       if (preserve_dates)
1839         {
1840           stat_status = bfd_stat_arch_elt (this_element, &buf);
1841
1842           if (stat_status != 0)
1843             non_fatal (_("internal stat error on %s"),
1844                        bfd_get_filename (this_element));
1845         }
1846
1847       l = xmalloc (sizeof (struct name_list));
1848       l->name = output_name;
1849       l->next = list;
1850       l->obfd = NULL;
1851       list = l;
1852
1853       if (bfd_check_format (this_element, bfd_object))
1854         {
1855           /* PR binutils/3110: Cope with archives
1856              containing multiple target types.  */
1857           if (force_output_target)
1858             output_bfd = bfd_openw (output_name, output_target);
1859           else
1860             output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
1861
1862           if (output_bfd == NULL)
1863             RETURN_NONFATAL (output_name);
1864
1865           delete = ! copy_object (this_element, output_bfd);
1866
1867           if (! delete
1868               || bfd_get_arch (this_element) != bfd_arch_unknown)
1869             {
1870               if (!bfd_close (output_bfd))
1871                 {
1872                   bfd_nonfatal (bfd_get_filename (output_bfd));
1873                   /* Error in new object file. Don't change archive.  */
1874                   status = 1;
1875                 }
1876             }
1877           else
1878             goto copy_unknown_element;
1879         }
1880       else
1881         {
1882           non_fatal (_("Unable to recognise the format of the input file `%s'"),
1883                      bfd_get_archive_filename (this_element));
1884
1885           output_bfd = bfd_openw (output_name, output_target);
1886 copy_unknown_element:
1887           delete = !copy_unknown_object (this_element, output_bfd);
1888           if (!bfd_close_all_done (output_bfd))
1889             {
1890               bfd_nonfatal (bfd_get_filename (output_bfd));
1891               /* Error in new object file. Don't change archive.  */
1892               status = 1;
1893             }
1894         }
1895
1896       if (delete)
1897         {
1898           unlink (output_name);
1899           status = 1;
1900         }
1901       else
1902         {
1903           if (preserve_dates && stat_status == 0)
1904             set_times (output_name, &buf);
1905
1906           /* Open the newly output file and attach to our list.  */
1907           output_bfd = bfd_openr (output_name, output_target);
1908
1909           l->obfd = output_bfd;
1910
1911           *ptr = output_bfd;
1912           ptr = &output_bfd->next;
1913
1914           last_element = this_element;
1915
1916           this_element = bfd_openr_next_archived_file (ibfd, last_element);
1917
1918           bfd_close (last_element);
1919         }
1920     }
1921   *ptr = NULL;
1922
1923   if (!bfd_close (obfd))
1924     RETURN_NONFATAL (bfd_get_filename (obfd));
1925
1926   if (!bfd_close (ibfd))
1927     RETURN_NONFATAL (bfd_get_filename (ibfd));
1928
1929   /* Delete all the files that we opened.  */
1930   for (l = list; l != NULL; l = l->next)
1931     {
1932       if (l->obfd == NULL)
1933         rmdir (l->name);
1934       else
1935         {
1936           bfd_close (l->obfd);
1937           unlink (l->name);
1938         }
1939     }
1940   rmdir (dir);
1941 }
1942
1943 /* The top-level control.  */
1944
1945 static void
1946 copy_file (const char *input_filename, const char *output_filename,
1947            const char *input_target,   const char *output_target)
1948 {
1949   bfd *ibfd;
1950   char **obj_matching;
1951   char **core_matching;
1952
1953   if (get_file_size (input_filename) < 1)
1954     {
1955       status = 1;
1956       return;
1957     }
1958
1959   /* To allow us to do "strip *" without dying on the first
1960      non-object file, failures are nonfatal.  */
1961   ibfd = bfd_openr (input_filename, input_target);
1962   if (ibfd == NULL)
1963     RETURN_NONFATAL (input_filename);
1964
1965   if (bfd_check_format (ibfd, bfd_archive))
1966     {
1967       bfd_boolean force_output_target;
1968       bfd *obfd;
1969
1970       /* bfd_get_target does not return the correct value until
1971          bfd_check_format succeeds.  */
1972       if (output_target == NULL)
1973         {
1974           output_target = bfd_get_target (ibfd);
1975           force_output_target = FALSE;
1976         }
1977       else
1978         force_output_target = TRUE;
1979
1980       obfd = bfd_openw (output_filename, output_target);
1981       if (obfd == NULL)
1982         RETURN_NONFATAL (output_filename);
1983
1984       copy_archive (ibfd, obfd, output_target, force_output_target);
1985     }
1986   else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
1987     {
1988       bfd *obfd;
1989     do_copy:
1990
1991       /* bfd_get_target does not return the correct value until
1992          bfd_check_format succeeds.  */
1993       if (output_target == NULL)
1994         output_target = bfd_get_target (ibfd);
1995
1996       obfd = bfd_openw (output_filename, output_target);
1997       if (obfd == NULL)
1998         RETURN_NONFATAL (output_filename);
1999
2000       if (! copy_object (ibfd, obfd))
2001         status = 1;
2002
2003       if (!bfd_close (obfd))
2004         RETURN_NONFATAL (output_filename);
2005
2006       if (!bfd_close (ibfd))
2007         RETURN_NONFATAL (input_filename);
2008
2009     }
2010   else
2011     {
2012       bfd_error_type obj_error = bfd_get_error ();
2013       bfd_error_type core_error;
2014
2015       if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
2016         {
2017           /* This probably can't happen..  */
2018           if (obj_error == bfd_error_file_ambiguously_recognized)
2019             free (obj_matching);
2020           goto do_copy;
2021         }
2022
2023       core_error = bfd_get_error ();
2024       /* Report the object error in preference to the core error.  */
2025       if (obj_error != core_error)
2026         bfd_set_error (obj_error);
2027
2028       bfd_nonfatal (input_filename);
2029
2030       if (obj_error == bfd_error_file_ambiguously_recognized)
2031         {
2032           list_matching_formats (obj_matching);
2033           free (obj_matching);
2034         }
2035       if (core_error == bfd_error_file_ambiguously_recognized)
2036         {
2037           list_matching_formats (core_matching);
2038           free (core_matching);
2039         }
2040
2041       status = 1;
2042     }
2043 }
2044
2045 /* Add a name to the section renaming list.  */
2046
2047 static void
2048 add_section_rename (const char * old_name, const char * new_name,
2049                     flagword flags)
2050 {
2051   section_rename * rename;
2052
2053   /* Check for conflicts first.  */
2054   for (rename = section_rename_list; rename != NULL; rename = rename->next)
2055     if (strcmp (rename->old_name, old_name) == 0)
2056       {
2057         /* Silently ignore duplicate definitions.  */
2058         if (strcmp (rename->new_name, new_name) == 0
2059             && rename->flags == flags)
2060           return;
2061
2062         fatal (_("Multiple renames of section %s"), old_name);
2063       }
2064
2065   rename = xmalloc (sizeof (* rename));
2066
2067   rename->old_name = old_name;
2068   rename->new_name = new_name;
2069   rename->flags    = flags;
2070   rename->next     = section_rename_list;
2071
2072   section_rename_list = rename;
2073 }
2074
2075 /* Check the section rename list for a new name of the input section
2076    ISECTION.  Return the new name if one is found.
2077    Also set RETURNED_FLAGS to the flags to be used for this section.  */
2078
2079 static const char *
2080 find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection,
2081                      flagword * returned_flags)
2082 {
2083   const char * old_name = bfd_section_name (ibfd, isection);
2084   section_rename * rename;
2085
2086   /* Default to using the flags of the input section.  */
2087   * returned_flags = bfd_get_section_flags (ibfd, isection);
2088
2089   for (rename = section_rename_list; rename != NULL; rename = rename->next)
2090     if (strcmp (rename->old_name, old_name) == 0)
2091       {
2092         if (rename->flags != (flagword) -1)
2093           * returned_flags = rename->flags;
2094
2095         return rename->new_name;
2096       }
2097
2098   return old_name;
2099 }
2100
2101 /* Once each of the sections is copied, we may still need to do some
2102    finalization work for private section headers.  Do that here.  */
2103
2104 static void
2105 setup_bfd_headers (bfd *ibfd, bfd *obfd)
2106 {
2107   const char *err;
2108
2109   /* Allow the BFD backend to copy any private data it understands
2110      from the input section to the output section.  */
2111   if (! bfd_copy_private_header_data (ibfd, obfd))
2112     {
2113       err = _("private header data");
2114       goto loser;
2115     }
2116
2117   /* All went well.  */
2118   return;
2119
2120 loser:
2121   non_fatal (_("%s: error in %s: %s"),
2122              bfd_get_filename (ibfd),
2123              err, bfd_errmsg (bfd_get_error ()));
2124   status = 1;
2125 }
2126
2127 /* Create a section in OBFD with the same
2128    name and attributes as ISECTION in IBFD.  */
2129
2130 static void
2131 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2132 {
2133   bfd *obfd = obfdarg;
2134   struct section_list *p;
2135   sec_ptr osection;
2136   bfd_size_type size;
2137   bfd_vma vma;
2138   bfd_vma lma;
2139   flagword flags;
2140   const char *err;
2141   const char * name;
2142   char *prefix = NULL;
2143
2144   if (is_strip_section (ibfd, isection))
2145     return;
2146
2147   p = find_section_list (bfd_section_name (ibfd, isection), FALSE);
2148   if (p != NULL)
2149     p->used = TRUE;
2150
2151   /* Get the, possibly new, name of the output section.  */
2152   name = find_section_rename (ibfd, isection, & flags);
2153
2154   /* Prefix sections.  */
2155   if ((prefix_alloc_sections_string)
2156       && (bfd_get_section_flags (ibfd, isection) & SEC_ALLOC))
2157     prefix = prefix_alloc_sections_string;
2158   else if (prefix_sections_string)
2159     prefix = prefix_sections_string;
2160
2161   if (prefix)
2162     {
2163       char *n;
2164
2165       n = xmalloc (strlen (prefix) + strlen (name) + 1);
2166       strcpy (n, prefix);
2167       strcat (n, name);
2168       name = n;
2169     }
2170
2171   if (p != NULL && p->set_flags)
2172     flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
2173   else if (strip_symbols == STRIP_NONDEBUG && (flags & SEC_ALLOC) != 0)
2174     flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD);
2175
2176   osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
2177
2178   if (osection == NULL)
2179     {
2180       err = _("making");
2181       goto loser;
2182     }
2183
2184   if (strip_symbols == STRIP_NONDEBUG
2185       && obfd->xvec->flavour == bfd_target_elf_flavour
2186       && (flags & SEC_ALLOC) != 0
2187       && (p == NULL || !p->set_flags))
2188     elf_section_type (osection) = SHT_NOBITS;
2189
2190   size = bfd_section_size (ibfd, isection);
2191   if (copy_byte >= 0)
2192     size = (size + interleave - 1) / interleave;
2193   if (! bfd_set_section_size (obfd, osection, size))
2194     {
2195       err = _("size");
2196       goto loser;
2197     }
2198
2199   vma = bfd_section_vma (ibfd, isection);
2200   if (p != NULL && p->change_vma == CHANGE_MODIFY)
2201     vma += p->vma_val;
2202   else if (p != NULL && p->change_vma == CHANGE_SET)
2203     vma = p->vma_val;
2204   else
2205     vma += change_section_address;
2206
2207   if (! bfd_set_section_vma (obfd, osection, vma))
2208     {
2209       err = _("vma");
2210       goto loser;
2211     }
2212
2213   lma = isection->lma;
2214   if ((p != NULL) && p->change_lma != CHANGE_IGNORE)
2215     {
2216       if (p->change_lma == CHANGE_MODIFY)
2217         lma += p->lma_val;
2218       else if (p->change_lma == CHANGE_SET)
2219         lma = p->lma_val;
2220       else
2221         abort ();
2222     }
2223   else
2224     lma += change_section_address;
2225
2226   osection->lma = lma;
2227
2228   /* FIXME: This is probably not enough.  If we change the LMA we
2229      may have to recompute the header for the file as well.  */
2230   if (!bfd_set_section_alignment (obfd,
2231                                   osection,
2232                                   bfd_section_alignment (ibfd, isection)))
2233     {
2234       err = _("alignment");
2235       goto loser;
2236     }
2237
2238   /* Copy merge entity size.  */
2239   osection->entsize = isection->entsize;
2240
2241   /* This used to be mangle_section; we do here to avoid using
2242      bfd_get_section_by_name since some formats allow multiple
2243      sections with the same name.  */
2244   isection->output_section = osection;
2245   isection->output_offset = 0;
2246
2247   /* Allow the BFD backend to copy any private data it understands
2248      from the input section to the output section.  */
2249   if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour
2250       && strip_symbols == STRIP_NONDEBUG)
2251     /* Do not copy the private data when creating an ELF format
2252        debug info file.  We do not want the program headers.  */
2253     ;
2254   else if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
2255     {
2256       err = _("private data");
2257       goto loser;
2258     }
2259   else if ((isection->flags & SEC_GROUP) != 0)
2260     {
2261       asymbol *gsym = group_signature (isection);
2262
2263       if (gsym != NULL)
2264         gsym->flags |= BSF_KEEP;
2265     }
2266
2267   /* All went well.  */
2268   return;
2269
2270 loser:
2271   non_fatal (_("%s: section `%s': error in %s: %s"),
2272              bfd_get_filename (ibfd),
2273              bfd_section_name (ibfd, isection),
2274              err, bfd_errmsg (bfd_get_error ()));
2275   status = 1;
2276 }
2277
2278 /* Copy the data of input section ISECTION of IBFD
2279    to an output section with the same name in OBFD.
2280    If stripping then don't copy any relocation info.  */
2281
2282 static void
2283 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2284 {
2285   bfd *obfd = obfdarg;
2286   struct section_list *p;
2287   arelent **relpp;
2288   long relcount;
2289   sec_ptr osection;
2290   bfd_size_type size;
2291   long relsize;
2292   flagword flags;
2293
2294   /* If we have already failed earlier on,
2295      do not keep on generating complaints now.  */
2296   if (status != 0)
2297     return;
2298
2299   if (is_strip_section (ibfd, isection))
2300     return;
2301
2302   flags = bfd_get_section_flags (ibfd, isection);
2303   if ((flags & SEC_GROUP) != 0)
2304     return;
2305
2306   osection = isection->output_section;
2307   size = bfd_get_section_size (isection);
2308
2309   if (size == 0 || osection == 0)
2310     return;
2311
2312   p = find_section_list (bfd_get_section_name (ibfd, isection), FALSE);
2313
2314   /* Core files do not need to be relocated.  */
2315   if (bfd_get_format (obfd) == bfd_core)
2316     relsize = 0;
2317   else
2318     {
2319       relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2320
2321       if (relsize < 0)
2322         {
2323           /* Do not complain if the target does not support relocations.  */
2324           if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2325             relsize = 0;
2326           else
2327             RETURN_NONFATAL (bfd_get_filename (ibfd));
2328         }
2329     }
2330
2331   if (relsize == 0)
2332     bfd_set_reloc (obfd, osection, NULL, 0);
2333   else
2334     {
2335       relpp = xmalloc (relsize);
2336       relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
2337       if (relcount < 0)
2338         RETURN_NONFATAL (bfd_get_filename (ibfd));
2339
2340       if (strip_symbols == STRIP_ALL)
2341         {
2342           /* Remove relocations which are not in
2343              keep_strip_specific_list.  */
2344           arelent **temp_relpp;
2345           long temp_relcount = 0;
2346           long i;
2347
2348           temp_relpp = xmalloc (relsize);
2349           for (i = 0; i < relcount; i++)
2350             if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
2351                                      keep_specific_list))
2352               temp_relpp [temp_relcount++] = relpp [i];
2353           relcount = temp_relcount;
2354           free (relpp);
2355           relpp = temp_relpp;
2356         }
2357
2358       bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
2359       if (relcount == 0)
2360         free (relpp);
2361     }
2362
2363   if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
2364       && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
2365     {
2366       void *memhunk = xmalloc (size);
2367
2368       if (!bfd_get_section_contents (ibfd, isection, memhunk, 0, size))
2369         RETURN_NONFATAL (bfd_get_filename (ibfd));
2370
2371       if (copy_byte >= 0)
2372         {
2373           /* Keep only every `copy_byte'th byte in MEMHUNK.  */
2374           char *from = (char *) memhunk + copy_byte;
2375           char *to = memhunk;
2376           char *end = (char *) memhunk + size;
2377
2378           for (; from < end; from += interleave)
2379             *to++ = *from;
2380
2381           size = (size + interleave - 1 - copy_byte) / interleave;
2382           osection->lma /= interleave;
2383         }
2384
2385       if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2386         RETURN_NONFATAL (bfd_get_filename (obfd));
2387
2388       free (memhunk);
2389     }
2390   else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0)
2391     {
2392       void *memhunk = xmalloc (size);
2393
2394       /* We don't permit the user to turn off the SEC_HAS_CONTENTS
2395          flag--they can just remove the section entirely and add it
2396          back again.  However, we do permit them to turn on the
2397          SEC_HAS_CONTENTS flag, and take it to mean that the section
2398          contents should be zeroed out.  */
2399
2400       memset (memhunk, 0, size);
2401       if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2402         RETURN_NONFATAL (bfd_get_filename (obfd));
2403       free (memhunk);
2404     }
2405 }
2406
2407 /* Get all the sections.  This is used when --gap-fill or --pad-to is
2408    used.  */
2409
2410 static void
2411 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
2412 {
2413   asection ***secppp = secppparg;
2414
2415   **secppp = osection;
2416   ++(*secppp);
2417 }
2418
2419 /* Sort sections by VMA.  This is called via qsort, and is used when
2420    --gap-fill or --pad-to is used.  We force non loadable or empty
2421    sections to the front, where they are easier to ignore.  */
2422
2423 static int
2424 compare_section_lma (const void *arg1, const void *arg2)
2425 {
2426   const asection *const *sec1 = arg1;
2427   const asection *const *sec2 = arg2;
2428   flagword flags1, flags2;
2429
2430   /* Sort non loadable sections to the front.  */
2431   flags1 = (*sec1)->flags;
2432   flags2 = (*sec2)->flags;
2433   if ((flags1 & SEC_HAS_CONTENTS) == 0
2434       || (flags1 & SEC_LOAD) == 0)
2435     {
2436       if ((flags2 & SEC_HAS_CONTENTS) != 0
2437           && (flags2 & SEC_LOAD) != 0)
2438         return -1;
2439     }
2440   else
2441     {
2442       if ((flags2 & SEC_HAS_CONTENTS) == 0
2443           || (flags2 & SEC_LOAD) == 0)
2444         return 1;
2445     }
2446
2447   /* Sort sections by LMA.  */
2448   if ((*sec1)->lma > (*sec2)->lma)
2449     return 1;
2450   else if ((*sec1)->lma < (*sec2)->lma)
2451     return -1;
2452
2453   /* Sort sections with the same LMA by size.  */
2454   if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
2455     return 1;
2456   else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
2457     return -1;
2458
2459   return 0;
2460 }
2461
2462 /* Mark all the symbols which will be used in output relocations with
2463    the BSF_KEEP flag so that those symbols will not be stripped.
2464
2465    Ignore relocations which will not appear in the output file.  */
2466
2467 static void
2468 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
2469 {
2470   asymbol **symbols = symbolsarg;
2471   long relsize;
2472   arelent **relpp;
2473   long relcount, i;
2474
2475   /* Ignore an input section with no corresponding output section.  */
2476   if (isection->output_section == NULL)
2477     return;
2478
2479   relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2480   if (relsize < 0)
2481     {
2482       /* Do not complain if the target does not support relocations.  */
2483       if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2484         return;
2485       bfd_fatal (bfd_get_filename (ibfd));
2486     }
2487
2488   if (relsize == 0)
2489     return;
2490
2491   relpp = xmalloc (relsize);
2492   relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
2493   if (relcount < 0)
2494     bfd_fatal (bfd_get_filename (ibfd));
2495
2496   /* Examine each symbol used in a relocation.  If it's not one of the
2497      special bfd section symbols, then mark it with BSF_KEEP.  */
2498   for (i = 0; i < relcount; i++)
2499     {
2500       if (*relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
2501           && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
2502           && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
2503         (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
2504     }
2505
2506   if (relpp != NULL)
2507     free (relpp);
2508 }
2509
2510 /* Write out debugging information.  */
2511
2512 static bfd_boolean
2513 write_debugging_info (bfd *obfd, void *dhandle,
2514                       long *symcountp ATTRIBUTE_UNUSED,
2515                       asymbol ***symppp ATTRIBUTE_UNUSED)
2516 {
2517   if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour)
2518     return write_ieee_debugging_info (obfd, dhandle);
2519
2520   if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2521       || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
2522     {
2523       bfd_byte *syms, *strings;
2524       bfd_size_type symsize, stringsize;
2525       asection *stabsec, *stabstrsec;
2526       flagword flags;
2527
2528       if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
2529                                                     &symsize, &strings,
2530                                                     &stringsize))
2531         return FALSE;
2532
2533       flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
2534       stabsec = bfd_make_section_with_flags (obfd, ".stab", flags);
2535       stabstrsec = bfd_make_section_with_flags (obfd, ".stabstr", flags);
2536       if (stabsec == NULL
2537           || stabstrsec == NULL
2538           || ! bfd_set_section_size (obfd, stabsec, symsize)
2539           || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
2540           || ! bfd_set_section_alignment (obfd, stabsec, 2)
2541           || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
2542         {
2543           non_fatal (_("%s: can't create debugging section: %s"),
2544                      bfd_get_filename (obfd),
2545                      bfd_errmsg (bfd_get_error ()));
2546           return FALSE;
2547         }
2548
2549       /* We can get away with setting the section contents now because
2550          the next thing the caller is going to do is copy over the
2551          real sections.  We may someday have to split the contents
2552          setting out of this function.  */
2553       if (! bfd_set_section_contents (obfd, stabsec, syms, 0, symsize)
2554           || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
2555                                          stringsize))
2556         {
2557           non_fatal (_("%s: can't set debugging section contents: %s"),
2558                      bfd_get_filename (obfd),
2559                      bfd_errmsg (bfd_get_error ()));
2560           return FALSE;
2561         }
2562
2563       return TRUE;
2564     }
2565
2566   non_fatal (_("%s: don't know how to write debugging information for %s"),
2567              bfd_get_filename (obfd), bfd_get_target (obfd));
2568   return FALSE;
2569 }
2570
2571 static int
2572 strip_main (int argc, char *argv[])
2573 {
2574   char *input_target = NULL;
2575   char *output_target = NULL;
2576   bfd_boolean show_version = FALSE;
2577   bfd_boolean formats_info = FALSE;
2578   int c;
2579   int i;
2580   struct section_list *p;
2581   char *output_file = NULL;
2582
2583   while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
2584                            strip_options, (int *) 0)) != EOF)
2585     {
2586       switch (c)
2587         {
2588         case 'I':
2589           input_target = optarg;
2590           break;
2591         case 'O':
2592           output_target = optarg;
2593           break;
2594         case 'F':
2595           input_target = output_target = optarg;
2596           break;
2597         case 'R':
2598           p = find_section_list (optarg, TRUE);
2599           p->remove = TRUE;
2600           sections_removed = TRUE;
2601           break;
2602         case 's':
2603           strip_symbols = STRIP_ALL;
2604           break;
2605         case 'S':
2606         case 'g':
2607         case 'd':       /* Historic BSD alias for -g.  Used by early NetBSD.  */
2608           strip_symbols = STRIP_DEBUG;
2609           break;
2610         case OPTION_STRIP_UNNEEDED:
2611           strip_symbols = STRIP_UNNEEDED;
2612           break;
2613         case 'K':
2614           add_specific_symbol (optarg, &keep_specific_list);
2615           break;
2616         case 'N':
2617           add_specific_symbol (optarg, &strip_specific_list);
2618           break;
2619         case 'o':
2620           output_file = optarg;
2621           break;
2622         case 'p':
2623           preserve_dates = TRUE;
2624           break;
2625         case 'x':
2626           discard_locals = LOCALS_ALL;
2627           break;
2628         case 'X':
2629           discard_locals = LOCALS_START_L;
2630           break;
2631         case 'v':
2632           verbose = TRUE;
2633           break;
2634         case 'V':
2635           show_version = TRUE;
2636           break;
2637         case OPTION_FORMATS_INFO:
2638           formats_info = TRUE;
2639           break;
2640         case OPTION_ONLY_KEEP_DEBUG:
2641           strip_symbols = STRIP_NONDEBUG;
2642           break;
2643         case OPTION_KEEP_FILE_SYMBOLS:
2644           keep_file_symbols = 1;
2645           break;
2646         case 0:
2647           /* We've been given a long option.  */
2648           break;
2649         case 'w':
2650           wildcard = TRUE;
2651           break;
2652         case 'H':
2653         case 'h':
2654           strip_usage (stdout, 0);
2655         default:
2656           strip_usage (stderr, 1);
2657         }
2658     }
2659
2660   if (formats_info)
2661     {
2662       display_info ();
2663       return 0;
2664     }
2665  
2666   if (show_version)
2667     print_version ("strip");
2668
2669   /* Default is to strip all symbols.  */
2670   if (strip_symbols == STRIP_UNDEF
2671       && discard_locals == LOCALS_UNDEF
2672       && strip_specific_list == NULL)
2673     strip_symbols = STRIP_ALL;
2674
2675   if (output_target == NULL)
2676     output_target = input_target;
2677
2678   i = optind;
2679   if (i == argc
2680       || (output_file != NULL && (i + 1) < argc))
2681     strip_usage (stderr, 1);
2682
2683   for (; i < argc; i++)
2684     {
2685       int hold_status = status;
2686       struct stat statbuf;
2687       char *tmpname;
2688
2689       if (get_file_size (argv[i]) < 1)
2690         {
2691           status = 1;
2692           continue;
2693         }
2694
2695       if (preserve_dates)
2696         /* No need to check the return value of stat().
2697            It has already been checked in get_file_size().  */
2698         stat (argv[i], &statbuf);
2699
2700       if (output_file != NULL)
2701         tmpname = output_file;
2702       else
2703         tmpname = make_tempname (argv[i]);
2704
2705       status = 0;
2706       copy_file (argv[i], tmpname, input_target, output_target);
2707       if (status == 0)
2708         {
2709           if (preserve_dates)
2710             set_times (tmpname, &statbuf);
2711           if (output_file == NULL)
2712             smart_rename (tmpname, argv[i], preserve_dates);
2713           status = hold_status;
2714         }
2715       else
2716         unlink_if_ordinary (tmpname);
2717       if (output_file == NULL)
2718         free (tmpname);
2719     }
2720
2721   return status;
2722 }
2723
2724 static int
2725 copy_main (int argc, char *argv[])
2726 {
2727   char * binary_architecture = NULL;
2728   char *input_filename = NULL;
2729   char *output_filename = NULL;
2730   char *input_target = NULL;
2731   char *output_target = NULL;
2732   bfd_boolean show_version = FALSE;
2733   bfd_boolean change_warn = TRUE;
2734   bfd_boolean formats_info = FALSE;
2735   int c;
2736   struct section_list *p;
2737   struct stat statbuf;
2738
2739   while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
2740                            copy_options, (int *) 0)) != EOF)
2741     {
2742       switch (c)
2743         {
2744         case 'b':
2745           copy_byte = atoi (optarg);
2746           if (copy_byte < 0)
2747             fatal (_("byte number must be non-negative"));
2748           break;
2749
2750         case 'B':
2751           binary_architecture = optarg;
2752           break;
2753
2754         case 'i':
2755           interleave = atoi (optarg);
2756           if (interleave < 1)
2757             fatal (_("interleave must be positive"));
2758           break;
2759
2760         case 'I':
2761         case 's':               /* "source" - 'I' is preferred */
2762           input_target = optarg;
2763           break;
2764
2765         case 'O':
2766         case 'd':               /* "destination" - 'O' is preferred */
2767           output_target = optarg;
2768           break;
2769
2770         case 'F':
2771           input_target = output_target = optarg;
2772           break;
2773
2774         case 'j':
2775           p = find_section_list (optarg, TRUE);
2776           if (p->remove)
2777             fatal (_("%s both copied and removed"), optarg);
2778           p->copy = TRUE;
2779           sections_copied = TRUE;
2780           break;
2781
2782         case 'R':
2783           p = find_section_list (optarg, TRUE);
2784           if (p->copy)
2785             fatal (_("%s both copied and removed"), optarg);
2786           p->remove = TRUE;
2787           sections_removed = TRUE;
2788           break;
2789
2790         case 'S':
2791           strip_symbols = STRIP_ALL;
2792           break;
2793
2794         case 'g':
2795           strip_symbols = STRIP_DEBUG;
2796           break;
2797
2798         case OPTION_STRIP_UNNEEDED:
2799           strip_symbols = STRIP_UNNEEDED;
2800           break;
2801
2802         case OPTION_ONLY_KEEP_DEBUG:
2803           strip_symbols = STRIP_NONDEBUG;
2804           break;
2805
2806         case OPTION_KEEP_FILE_SYMBOLS:
2807           keep_file_symbols = 1;
2808           break;
2809
2810         case OPTION_ADD_GNU_DEBUGLINK:
2811           gnu_debuglink_filename = optarg;
2812           break;
2813
2814         case 'K':
2815           add_specific_symbol (optarg, &keep_specific_list);
2816           break;
2817
2818         case 'N':
2819           add_specific_symbol (optarg, &strip_specific_list);
2820           break;
2821
2822         case OPTION_STRIP_UNNEEDED_SYMBOL:
2823           add_specific_symbol (optarg, &strip_unneeded_list);
2824           break;
2825
2826         case 'L':
2827           add_specific_symbol (optarg, &localize_specific_list);
2828           break;
2829
2830         case OPTION_GLOBALIZE_SYMBOL:
2831           add_specific_symbol (optarg, &globalize_specific_list);
2832           break;
2833
2834         case 'G':
2835           add_specific_symbol (optarg, &keepglobal_specific_list);
2836           break;
2837
2838         case 'W':
2839           add_specific_symbol (optarg, &weaken_specific_list);
2840           break;
2841
2842         case 'p':
2843           preserve_dates = TRUE;
2844           break;
2845
2846         case 'w':
2847           wildcard = TRUE;
2848           break;
2849
2850         case 'x':
2851           discard_locals = LOCALS_ALL;
2852           break;
2853
2854         case 'X':
2855           discard_locals = LOCALS_START_L;
2856           break;
2857
2858         case 'v':
2859           verbose = TRUE;
2860           break;
2861
2862         case 'V':
2863           show_version = TRUE;
2864           break;
2865
2866         case OPTION_FORMATS_INFO:
2867           formats_info = TRUE;
2868           break;
2869
2870         case OPTION_WEAKEN:
2871           weaken = TRUE;
2872           break;
2873
2874         case OPTION_ADD_SECTION:
2875           {
2876             const char *s;
2877             off_t size;
2878             struct section_add *pa;
2879             int len;
2880             char *name;
2881             FILE *f;
2882
2883             s = strchr (optarg, '=');
2884
2885             if (s == NULL)
2886               fatal (_("bad format for %s"), "--add-section");
2887
2888             size = get_file_size (s + 1);
2889             if (size < 1)
2890               {
2891                 status = 1;
2892                 break;
2893               }
2894
2895             pa = xmalloc (sizeof (struct section_add));
2896
2897             len = s - optarg;
2898             name = xmalloc (len + 1);
2899             strncpy (name, optarg, len);
2900             name[len] = '\0';
2901             pa->name = name;
2902
2903             pa->filename = s + 1;
2904             pa->size = size;
2905             pa->contents = xmalloc (size);
2906
2907             f = fopen (pa->filename, FOPEN_RB);
2908
2909             if (f == NULL)
2910               fatal (_("cannot open: %s: %s"),
2911                      pa->filename, strerror (errno));
2912
2913             if (fread (pa->contents, 1, pa->size, f) == 0
2914                 || ferror (f))
2915               fatal (_("%s: fread failed"), pa->filename);
2916
2917             fclose (f);
2918
2919             pa->next = add_sections;
2920             add_sections = pa;
2921           }
2922           break;
2923
2924         case OPTION_CHANGE_START:
2925           change_start = parse_vma (optarg, "--change-start");
2926           break;
2927
2928         case OPTION_CHANGE_SECTION_ADDRESS:
2929         case OPTION_CHANGE_SECTION_LMA:
2930         case OPTION_CHANGE_SECTION_VMA:
2931           {
2932             const char *s;
2933             int len;
2934             char *name;
2935             char *option = NULL;
2936             bfd_vma val;
2937             enum change_action what = CHANGE_IGNORE;
2938
2939             switch (c)
2940               {
2941               case OPTION_CHANGE_SECTION_ADDRESS:
2942                 option = "--change-section-address";
2943                 break;
2944               case OPTION_CHANGE_SECTION_LMA:
2945                 option = "--change-section-lma";
2946                 break;
2947               case OPTION_CHANGE_SECTION_VMA:
2948                 option = "--change-section-vma";
2949                 break;
2950               }
2951
2952             s = strchr (optarg, '=');
2953             if (s == NULL)
2954               {
2955                 s = strchr (optarg, '+');
2956                 if (s == NULL)
2957                   {
2958                     s = strchr (optarg, '-');
2959                     if (s == NULL)
2960                       fatal (_("bad format for %s"), option);
2961                   }
2962               }
2963
2964             len = s - optarg;
2965             name = xmalloc (len + 1);
2966             strncpy (name, optarg, len);
2967             name[len] = '\0';
2968
2969             p = find_section_list (name, TRUE);
2970
2971             val = parse_vma (s + 1, option);
2972
2973             switch (*s)
2974               {
2975               case '=': what = CHANGE_SET; break;
2976               case '-': val  = - val; /* Drop through.  */
2977               case '+': what = CHANGE_MODIFY; break;
2978               }
2979
2980             switch (c)
2981               {
2982               case OPTION_CHANGE_SECTION_ADDRESS:
2983                 p->change_vma = what;
2984                 p->vma_val    = val;
2985                 /* Drop through.  */
2986
2987               case OPTION_CHANGE_SECTION_LMA:
2988                 p->change_lma = what;
2989                 p->lma_val    = val;
2990                 break;
2991
2992               case OPTION_CHANGE_SECTION_VMA:
2993                 p->change_vma = what;
2994                 p->vma_val    = val;
2995                 break;
2996               }
2997           }
2998           break;
2999
3000         case OPTION_CHANGE_ADDRESSES:
3001           change_section_address = parse_vma (optarg, "--change-addresses");
3002           change_start = change_section_address;
3003           break;
3004
3005         case OPTION_CHANGE_WARNINGS:
3006           change_warn = TRUE;
3007           break;
3008
3009         case OPTION_CHANGE_LEADING_CHAR:
3010           change_leading_char = TRUE;
3011           break;
3012
3013         case OPTION_DEBUGGING:
3014           convert_debugging = TRUE;
3015           break;
3016
3017         case OPTION_GAP_FILL:
3018           {
3019             bfd_vma gap_fill_vma;
3020
3021             gap_fill_vma = parse_vma (optarg, "--gap-fill");
3022             gap_fill = (bfd_byte) gap_fill_vma;
3023             if ((bfd_vma) gap_fill != gap_fill_vma)
3024               {
3025                 char buff[20];
3026
3027                 sprintf_vma (buff, gap_fill_vma);
3028
3029                 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
3030                            buff, gap_fill);
3031               }
3032             gap_fill_set = TRUE;
3033           }
3034           break;
3035
3036         case OPTION_NO_CHANGE_WARNINGS:
3037           change_warn = FALSE;
3038           break;
3039
3040         case OPTION_PAD_TO:
3041           pad_to = parse_vma (optarg, "--pad-to");
3042           pad_to_set = TRUE;
3043           break;
3044
3045         case OPTION_REMOVE_LEADING_CHAR:
3046           remove_leading_char = TRUE;
3047           break;
3048
3049         case OPTION_REDEFINE_SYM:
3050           {
3051             /* Push this redefinition onto redefine_symbol_list.  */
3052
3053             int len;
3054             const char *s;
3055             const char *nextarg;
3056             char *source, *target;
3057
3058             s = strchr (optarg, '=');
3059             if (s == NULL)
3060               fatal (_("bad format for %s"), "--redefine-sym");
3061
3062             len = s - optarg;
3063             source = xmalloc (len + 1);
3064             strncpy (source, optarg, len);
3065             source[len] = '\0';
3066
3067             nextarg = s + 1;
3068             len = strlen (nextarg);
3069             target = xmalloc (len + 1);
3070             strcpy (target, nextarg);
3071
3072             redefine_list_append ("--redefine-sym", source, target);
3073
3074             free (source);
3075             free (target);
3076           }
3077           break;
3078
3079         case OPTION_REDEFINE_SYMS:
3080           add_redefine_syms_file (optarg);
3081           break;
3082
3083         case OPTION_SET_SECTION_FLAGS:
3084           {
3085             const char *s;
3086             int len;
3087             char *name;
3088
3089             s = strchr (optarg, '=');
3090             if (s == NULL)
3091               fatal (_("bad format for %s"), "--set-section-flags");
3092
3093             len = s - optarg;
3094             name = xmalloc (len + 1);
3095             strncpy (name, optarg, len);
3096             name[len] = '\0';
3097
3098             p = find_section_list (name, TRUE);
3099
3100             p->set_flags = TRUE;
3101             p->flags = parse_flags (s + 1);
3102           }
3103           break;
3104
3105         case OPTION_RENAME_SECTION:
3106           {
3107             flagword flags;
3108             const char *eq, *fl;
3109             char *old_name;
3110             char *new_name;
3111             unsigned int len;
3112
3113             eq = strchr (optarg, '=');
3114             if (eq == NULL)
3115               fatal (_("bad format for %s"), "--rename-section");
3116
3117             len = eq - optarg;
3118             if (len == 0)
3119               fatal (_("bad format for %s"), "--rename-section");
3120
3121             old_name = xmalloc (len + 1);
3122             strncpy (old_name, optarg, len);
3123             old_name[len] = 0;
3124
3125             eq++;
3126             fl = strchr (eq, ',');
3127             if (fl)
3128               {
3129                 flags = parse_flags (fl + 1);
3130                 len = fl - eq;
3131               }
3132             else
3133               {
3134                 flags = -1;
3135                 len = strlen (eq);
3136               }
3137
3138             if (len == 0)
3139               fatal (_("bad format for %s"), "--rename-section");
3140
3141             new_name = xmalloc (len + 1);
3142             strncpy (new_name, eq, len);
3143             new_name[len] = 0;
3144
3145             add_section_rename (old_name, new_name, flags);
3146           }
3147           break;
3148
3149         case OPTION_SET_START:
3150           set_start = parse_vma (optarg, "--set-start");
3151           set_start_set = TRUE;
3152           break;
3153
3154         case OPTION_SREC_LEN:
3155           Chunk = parse_vma (optarg, "--srec-len");
3156           break;
3157
3158         case OPTION_SREC_FORCES3:
3159           S3Forced = TRUE;
3160           break;
3161
3162         case OPTION_STRIP_SYMBOLS:
3163           add_specific_symbols (optarg, &strip_specific_list);
3164           break;
3165
3166         case OPTION_STRIP_UNNEEDED_SYMBOLS:
3167           add_specific_symbols (optarg, &strip_unneeded_list);
3168           break;
3169
3170         case OPTION_KEEP_SYMBOLS:
3171           add_specific_symbols (optarg, &keep_specific_list);
3172           break;
3173
3174         case OPTION_LOCALIZE_HIDDEN:
3175           localize_hidden = TRUE;
3176           break;
3177
3178         case OPTION_LOCALIZE_SYMBOLS:
3179           add_specific_symbols (optarg, &localize_specific_list);
3180           break;
3181
3182         case OPTION_GLOBALIZE_SYMBOLS:
3183           add_specific_symbols (optarg, &globalize_specific_list);
3184           break;
3185
3186         case OPTION_KEEPGLOBAL_SYMBOLS:
3187           add_specific_symbols (optarg, &keepglobal_specific_list);
3188           break;
3189
3190         case OPTION_WEAKEN_SYMBOLS:
3191           add_specific_symbols (optarg, &weaken_specific_list);
3192           break;
3193
3194         case OPTION_ALT_MACH_CODE:
3195           use_alt_mach_code = strtoul (optarg, NULL, 0);
3196           if (use_alt_mach_code == 0)
3197             fatal (_("unable to parse alternative machine code"));
3198           break;
3199
3200         case OPTION_PREFIX_SYMBOLS:
3201           prefix_symbols_string = optarg;
3202           break;
3203
3204         case OPTION_PREFIX_SECTIONS:
3205           prefix_sections_string = optarg;
3206           break;
3207
3208         case OPTION_PREFIX_ALLOC_SECTIONS:
3209           prefix_alloc_sections_string = optarg;
3210           break;
3211
3212         case OPTION_READONLY_TEXT:
3213           bfd_flags_to_set |= WP_TEXT;
3214           bfd_flags_to_clear &= ~WP_TEXT;
3215           break;
3216
3217         case OPTION_WRITABLE_TEXT:
3218           bfd_flags_to_clear |= WP_TEXT;
3219           bfd_flags_to_set &= ~WP_TEXT;
3220           break;
3221
3222         case OPTION_PURE:
3223           bfd_flags_to_set |= D_PAGED;
3224           bfd_flags_to_clear &= ~D_PAGED;
3225           break;
3226
3227         case OPTION_IMPURE:
3228           bfd_flags_to_clear |= D_PAGED;
3229           bfd_flags_to_set &= ~D_PAGED;
3230           break;
3231
3232         case 0:
3233           /* We've been given a long option.  */
3234           break;
3235
3236         case 'H':
3237         case 'h':
3238           copy_usage (stdout, 0);
3239
3240         default:
3241           copy_usage (stderr, 1);
3242         }
3243     }
3244
3245   if (formats_info)
3246     {
3247       display_info ();
3248       return 0;
3249     }
3250  
3251   if (show_version)
3252     print_version ("objcopy");
3253
3254   if (copy_byte >= interleave)
3255     fatal (_("byte number must be less than interleave"));
3256
3257   if (optind == argc || optind + 2 < argc)
3258     copy_usage (stderr, 1);
3259
3260   input_filename = argv[optind];
3261   if (optind + 1 < argc)
3262     output_filename = argv[optind + 1];
3263
3264   /* Default is to strip no symbols.  */
3265   if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
3266     strip_symbols = STRIP_NONE;
3267
3268   if (output_target == NULL)
3269     output_target = input_target;
3270
3271   if (binary_architecture != NULL)
3272     {
3273       if (input_target && strcmp (input_target, "binary") == 0)
3274         {
3275           const bfd_arch_info_type * temp_arch_info;
3276
3277           temp_arch_info = bfd_scan_arch (binary_architecture);
3278
3279           if (temp_arch_info != NULL)
3280             {
3281               bfd_external_binary_architecture = temp_arch_info->arch;
3282               bfd_external_machine             = temp_arch_info->mach;
3283             }
3284           else
3285             fatal (_("architecture %s unknown"), binary_architecture);
3286         }
3287       else
3288         {
3289           non_fatal (_("Warning: input target 'binary' required for binary architecture parameter."));
3290           non_fatal (_(" Argument %s ignored"), binary_architecture);
3291         }
3292     }
3293
3294   if (preserve_dates)
3295     if (stat (input_filename, & statbuf) < 0)
3296       fatal (_("warning: could not locate '%s'.  System error message: %s"),
3297              input_filename, strerror (errno));
3298
3299   /* If there is no destination file, or the source and destination files
3300      are the same, then create a temp and rename the result into the input.  */
3301   if (output_filename == NULL || strcmp (input_filename, output_filename) == 0)
3302     {
3303       char *tmpname = make_tempname (input_filename);
3304
3305       copy_file (input_filename, tmpname, input_target, output_target);
3306       if (status == 0)
3307         {
3308           if (preserve_dates)
3309             set_times (tmpname, &statbuf);
3310           smart_rename (tmpname, input_filename, preserve_dates);
3311         }
3312       else
3313         unlink (tmpname);
3314     }
3315   else
3316     {
3317       copy_file (input_filename, output_filename, input_target, output_target);
3318
3319       if (status == 0 && preserve_dates)
3320         set_times (output_filename, &statbuf);
3321       else if (status != 0)
3322         unlink_if_ordinary (output_filename);
3323     }
3324
3325   if (change_warn)
3326     {
3327       for (p = change_sections; p != NULL; p = p->next)
3328         {
3329           if (! p->used)
3330             {
3331               if (p->change_vma != CHANGE_IGNORE)
3332                 {
3333                   char buff [20];
3334
3335                   sprintf_vma (buff, p->vma_val);
3336
3337                   /* xgettext:c-format */
3338                   non_fatal (_("%s %s%c0x%s never used"),
3339                              "--change-section-vma",
3340                              p->name,
3341                              p->change_vma == CHANGE_SET ? '=' : '+',
3342                              buff);
3343                 }
3344
3345               if (p->change_lma != CHANGE_IGNORE)
3346                 {
3347                   char buff [20];
3348
3349                   sprintf_vma (buff, p->lma_val);
3350
3351                   /* xgettext:c-format */
3352                   non_fatal (_("%s %s%c0x%s never used"),
3353                              "--change-section-lma",
3354                              p->name,
3355                              p->change_lma == CHANGE_SET ? '=' : '+',
3356                              buff);
3357                 }
3358             }
3359         }
3360     }
3361
3362   return 0;
3363 }
3364
3365 int
3366 main (int argc, char *argv[])
3367 {
3368 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
3369   setlocale (LC_MESSAGES, "");
3370 #endif
3371 #if defined (HAVE_SETLOCALE)
3372   setlocale (LC_CTYPE, "");
3373 #endif
3374   bindtextdomain (PACKAGE, LOCALEDIR);
3375   textdomain (PACKAGE);
3376
3377   program_name = argv[0];
3378   xmalloc_set_program_name (program_name);
3379
3380   START_PROGRESS (program_name, 0);
3381
3382   expandargv (&argc, &argv);
3383
3384   strip_symbols = STRIP_UNDEF;
3385   discard_locals = LOCALS_UNDEF;
3386
3387   bfd_init ();
3388   set_default_bfd_target ();
3389
3390   if (is_strip < 0)
3391     {
3392       int i = strlen (program_name);
3393 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3394       /* Drop the .exe suffix, if any.  */
3395       if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
3396         {
3397           i -= 4;
3398           program_name[i] = '\0';
3399         }
3400 #endif
3401       is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
3402     }
3403
3404   if (is_strip)
3405     strip_main (argc, argv);
3406   else
3407     copy_main (argc, argv);
3408
3409   END_PROGRESS (program_name);
3410
3411   return status;
3412 }