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 /* See if a section is being removed.  */
789
790 static bfd_boolean
791 is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
792 {
793   if (sections_removed || sections_copied)
794     {
795       struct section_list *p;
796
797       p = find_section_list (bfd_get_section_name (abfd, sec), FALSE);
798
799       if (sections_removed && p != NULL && p->remove)
800         return TRUE;
801       if (sections_copied && (p == NULL || ! p->copy))
802         return TRUE;
803     }
804
805   if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
806     {
807       if (strip_symbols == STRIP_DEBUG
808           || strip_symbols == STRIP_UNNEEDED
809           || strip_symbols == STRIP_ALL
810           || discard_locals == LOCALS_ALL
811           || convert_debugging)
812         return TRUE;
813
814       if (strip_symbols == STRIP_NONDEBUG)
815         return FALSE;
816     }
817
818   /* PR binutils/3166
819      Group sections look like debugging sections but they are not.
820      (They have a non-zero size but they are not ALLOCated).  */
821   if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0
822       && strip_symbols == STRIP_NONDEBUG)
823     return TRUE;
824
825   return FALSE;
826 }
827
828 /* Return true if SYM is a hidden symbol.  */
829
830 static bfd_boolean
831 is_hidden_symbol (asymbol *sym)
832 {
833   elf_symbol_type *elf_sym;
834
835   elf_sym = elf_symbol_from (sym->the_bfd, sym);
836   if (elf_sym != NULL)
837     switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
838       {
839       case STV_HIDDEN:
840       case STV_INTERNAL:
841         return TRUE;
842       }
843   return FALSE;
844 }
845
846 /* Choose which symbol entries to copy; put the result in OSYMS.
847    We don't copy in place, because that confuses the relocs.
848    Return the number of symbols to print.  */
849
850 static unsigned int
851 filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
852                 asymbol **isyms, long symcount)
853 {
854   asymbol **from = isyms, **to = osyms;
855   long src_count = 0, dst_count = 0;
856   int relocatable = (abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC))
857                     == HAS_RELOC;
858
859   for (; src_count < symcount; src_count++)
860     {
861       asymbol *sym = from[src_count];
862       flagword flags = sym->flags;
863       char *name = (char *) bfd_asymbol_name (sym);
864       int keep;
865       bfd_boolean undefined;
866       bfd_boolean rem_leading_char;
867       bfd_boolean add_leading_char;
868
869       undefined = bfd_is_und_section (bfd_get_section (sym));
870
871       if (redefine_sym_list)
872         {
873           char *old_name, *new_name;
874
875           old_name = (char *) bfd_asymbol_name (sym);
876           new_name = (char *) lookup_sym_redefinition (old_name);
877           bfd_asymbol_name (sym) = new_name;
878           name = new_name;
879         }
880
881       /* Check if we will remove the current leading character.  */
882       rem_leading_char =
883         (name[0] == bfd_get_symbol_leading_char (abfd))
884         && (change_leading_char
885             || (remove_leading_char
886                 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
887                     || undefined
888                     || bfd_is_com_section (bfd_get_section (sym)))));
889
890       /* Check if we will add a new leading character.  */
891       add_leading_char =
892         change_leading_char
893         && (bfd_get_symbol_leading_char (obfd) != '\0')
894         && (bfd_get_symbol_leading_char (abfd) == '\0'
895             || (name[0] == bfd_get_symbol_leading_char (abfd)));
896
897       /* Short circuit for change_leading_char if we can do it in-place.  */
898       if (rem_leading_char && add_leading_char && !prefix_symbols_string)
899         {
900           name[0] = bfd_get_symbol_leading_char (obfd);
901           bfd_asymbol_name (sym) = name;
902           rem_leading_char = FALSE;
903           add_leading_char = FALSE;
904         }
905
906       /* Remove leading char.  */
907       if (rem_leading_char)
908         bfd_asymbol_name (sym) = ++name;
909
910       /* Add new leading char and/or prefix.  */
911       if (add_leading_char || prefix_symbols_string)
912         {
913           char *n, *ptr;
914
915           ptr = n = xmalloc (1 + strlen (prefix_symbols_string)
916                              + strlen (name) + 1);
917           if (add_leading_char)
918             *ptr++ = bfd_get_symbol_leading_char (obfd);
919
920           if (prefix_symbols_string)
921             {
922               strcpy (ptr, prefix_symbols_string);
923               ptr += strlen (prefix_symbols_string);
924            }
925
926           strcpy (ptr, name);
927           bfd_asymbol_name (sym) = n;
928           name = n;
929         }
930
931       if (strip_symbols == STRIP_ALL)
932         keep = 0;
933       else if ((flags & BSF_KEEP) != 0          /* Used in relocation.  */
934                || ((flags & BSF_SECTION_SYM) != 0
935                    && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
936                        & BSF_KEEP) != 0))
937         keep = 1;
938       else if (relocatable                      /* Relocatable file.  */
939                && (flags & (BSF_GLOBAL | BSF_WEAK)) != 0)
940         keep = 1;
941       else if (bfd_decode_symclass (sym) == 'I')
942         /* Global symbols in $idata sections need to be retained
943            even if relocatable is FALSE.  External users of the
944            library containing the $idata section may reference these
945            symbols.  */
946         keep = 1;
947       else if ((flags & BSF_GLOBAL) != 0        /* Global symbol.  */
948                || (flags & BSF_WEAK) != 0
949                || undefined
950                || bfd_is_com_section (bfd_get_section (sym)))
951         keep = strip_symbols != STRIP_UNNEEDED;
952       else if ((flags & BSF_DEBUGGING) != 0)    /* Debugging symbol.  */
953         keep = (strip_symbols != STRIP_DEBUG
954                 && strip_symbols != STRIP_UNNEEDED
955                 && ! convert_debugging);
956       else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym)))
957         /* COMDAT sections store special information in local
958            symbols, so we cannot risk stripping any of them.  */
959         keep = 1;
960       else                      /* Local symbol.  */
961         keep = (strip_symbols != STRIP_UNNEEDED
962                 && (discard_locals != LOCALS_ALL
963                     && (discard_locals != LOCALS_START_L
964                         || ! bfd_is_local_label (abfd, sym))));
965
966       if (keep && is_specified_symbol (name, strip_specific_list))
967         keep = 0;
968       if (keep
969           && !(flags & BSF_KEEP)
970           && is_specified_symbol (name, strip_unneeded_list))
971         keep = 0;
972       if (!keep
973           && ((keep_file_symbols && (flags & BSF_FILE))
974               || is_specified_symbol (name, keep_specific_list)))
975         keep = 1;
976       if (keep && is_strip_section (abfd, bfd_get_section (sym)))
977         keep = 0;
978
979       if (keep)
980         {
981           if ((flags & BSF_GLOBAL) != 0
982               && (weaken || is_specified_symbol (name, weaken_specific_list)))
983             {
984               sym->flags &= ~ BSF_GLOBAL;
985               sym->flags |= BSF_WEAK;
986             }
987
988           if (!undefined
989               && (flags & (BSF_GLOBAL | BSF_WEAK))
990               && (is_specified_symbol (name, localize_specific_list)
991                   || (keepglobal_specific_list != NULL
992                       && ! is_specified_symbol (name, keepglobal_specific_list))
993                   || (localize_hidden && is_hidden_symbol (sym))))
994             {
995               sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
996               sym->flags |= BSF_LOCAL;
997             }
998
999           if (!undefined
1000               && (flags & BSF_LOCAL) 
1001               && is_specified_symbol (name, globalize_specific_list))
1002             {
1003               sym->flags &= ~ BSF_LOCAL;
1004               sym->flags |= BSF_GLOBAL;
1005             }
1006
1007           to[dst_count++] = sym;
1008         }
1009     }
1010
1011   to[dst_count] = NULL;
1012
1013   return dst_count;
1014 }
1015
1016 /* Find the redefined name of symbol SOURCE.  */
1017
1018 static const char *
1019 lookup_sym_redefinition (const char *source)
1020 {
1021   struct redefine_node *list;
1022
1023   for (list = redefine_sym_list; list != NULL; list = list->next)
1024     if (strcmp (source, list->source) == 0)
1025       return list->target;
1026
1027   return source;
1028 }
1029
1030 /* Add a node to a symbol redefine list.  */
1031
1032 static void
1033 redefine_list_append (const char *cause, const char *source, const char *target)
1034 {
1035   struct redefine_node **p;
1036   struct redefine_node *list;
1037   struct redefine_node *new_node;
1038
1039   for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next)
1040     {
1041       if (strcmp (source, list->source) == 0)
1042         fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1043                cause, source);
1044
1045       if (strcmp (target, list->target) == 0)
1046         fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1047                cause, target);
1048     }
1049
1050   new_node = xmalloc (sizeof (struct redefine_node));
1051
1052   new_node->source = strdup (source);
1053   new_node->target = strdup (target);
1054   new_node->next = NULL;
1055
1056   *p = new_node;
1057 }
1058
1059 /* Handle the --redefine-syms option.  Read lines containing "old new"
1060    from the file, and add them to the symbol redefine list.  */
1061
1062 static void
1063 add_redefine_syms_file (const char *filename)
1064 {
1065   FILE *file;
1066   char *buf;
1067   size_t bufsize;
1068   size_t len;
1069   size_t outsym_off;
1070   int c, lineno;
1071
1072   file = fopen (filename, "r");
1073   if (file == NULL)
1074     fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1075            filename, strerror (errno));
1076
1077   bufsize = 100;
1078   buf = xmalloc (bufsize);
1079
1080   lineno = 1;
1081   c = getc (file);
1082   len = 0;
1083   outsym_off = 0;
1084   while (c != EOF)
1085     {
1086       /* Collect the input symbol name.  */
1087       while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1088         {
1089           if (c == '#')
1090             goto comment;
1091           buf[len++] = c;
1092           if (len >= bufsize)
1093             {
1094               bufsize *= 2;
1095               buf = xrealloc (buf, bufsize);
1096             }
1097           c = getc (file);
1098         }
1099       buf[len++] = '\0';
1100       if (c == EOF)
1101         break;
1102
1103       /* Eat white space between the symbol names.  */
1104       while (IS_WHITESPACE (c))
1105         c = getc (file);
1106       if (c == '#' || IS_LINE_TERMINATOR (c))
1107         goto comment;
1108       if (c == EOF)
1109         break;
1110
1111       /* Collect the output symbol name.  */
1112       outsym_off = len;
1113       while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1114         {
1115           if (c == '#')
1116             goto comment;
1117           buf[len++] = c;
1118           if (len >= bufsize)
1119             {
1120               bufsize *= 2;
1121               buf = xrealloc (buf, bufsize);
1122             }
1123           c = getc (file);
1124         }
1125       buf[len++] = '\0';
1126       if (c == EOF)
1127         break;
1128
1129       /* Eat white space at end of line.  */
1130       while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c))
1131         c = getc (file);
1132       if (c == '#')
1133         goto comment;
1134       /* Handle \r\n.  */
1135       if ((c == '\r' && (c = getc (file)) == '\n')
1136           || c == '\n' || c == EOF)
1137         {
1138  end_of_line:
1139           /* Append the redefinition to the list.  */
1140           if (buf[0] != '\0')
1141             redefine_list_append (filename, &buf[0], &buf[outsym_off]);
1142
1143           lineno++;     
1144           len = 0;
1145           outsym_off = 0;
1146           if (c == EOF)
1147             break;
1148           c = getc (file);
1149           continue;
1150         }
1151       else
1152         fatal (_("%s:%d: garbage found at end of line"), filename, lineno);
1153  comment:
1154       if (len != 0 && (outsym_off == 0 || outsym_off == len))
1155         fatal (_("%s:%d: missing new symbol name"), filename, lineno);
1156       buf[len++] = '\0';
1157
1158       /* Eat the rest of the line and finish it.  */
1159       while (c != '\n' && c != EOF)
1160         c = getc (file);
1161       goto end_of_line;
1162     }
1163
1164   if (len != 0)
1165     fatal (_("%s:%d: premature end of file"), filename, lineno);
1166
1167   free (buf);
1168 }
1169
1170 /* Copy unkown object file IBFD onto OBFD.
1171    Returns TRUE upon success, FALSE otherwise.  */
1172
1173 static bfd_boolean
1174 copy_unknown_object (bfd *ibfd, bfd *obfd)
1175 {
1176   char *cbuf;
1177   int tocopy;
1178   long ncopied;
1179   long size;
1180   struct stat buf;
1181
1182   if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1183     {
1184       bfd_nonfatal (bfd_get_archive_filename (ibfd));
1185       return FALSE;
1186     }
1187
1188   size = buf.st_size;
1189   if (size < 0)
1190     {
1191       non_fatal (_("stat returns negative size for `%s'"),
1192                  bfd_get_archive_filename (ibfd));
1193       return FALSE;
1194     }
1195
1196   if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1197     {
1198       bfd_nonfatal (bfd_get_archive_filename (ibfd));
1199       return FALSE;
1200     }
1201
1202   if (verbose)
1203     printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1204             bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1205
1206   cbuf = xmalloc (BUFSIZE);
1207   ncopied = 0;
1208   while (ncopied < size)
1209     {
1210       tocopy = size - ncopied;
1211       if (tocopy > BUFSIZE)
1212         tocopy = BUFSIZE;
1213
1214       if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1215           != (bfd_size_type) tocopy)
1216         {
1217           bfd_nonfatal (bfd_get_archive_filename (ibfd));
1218           free (cbuf);
1219           return FALSE;
1220         }
1221
1222       if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1223           != (bfd_size_type) tocopy)
1224         {
1225           bfd_nonfatal (bfd_get_filename (obfd));
1226           free (cbuf);
1227           return FALSE;
1228         }
1229
1230       ncopied += tocopy;
1231     }
1232
1233   chmod (bfd_get_filename (obfd), buf.st_mode);
1234   free (cbuf);
1235   return TRUE;
1236 }
1237
1238 /* Copy object file IBFD onto OBFD.
1239    Returns TRUE upon success, FALSE otherwise.  */
1240
1241 static bfd_boolean
1242 copy_object (bfd *ibfd, bfd *obfd)
1243 {
1244   bfd_vma start;
1245   long symcount;
1246   asection **osections = NULL;
1247   asection *gnu_debuglink_section = NULL;
1248   bfd_size_type *gaps = NULL;
1249   bfd_size_type max_gap = 0;
1250   long symsize;
1251   void *dhandle;
1252   enum bfd_architecture iarch;
1253   unsigned int imach;
1254
1255   if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1256       && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
1257       && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
1258     fatal (_("Unable to change endianness of input file(s)"));
1259
1260   if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1261     {
1262       bfd_nonfatal (bfd_get_filename (obfd));
1263       return FALSE;
1264     }
1265
1266   if (verbose)
1267     printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
1268             bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
1269             bfd_get_filename (obfd), bfd_get_target (obfd));
1270
1271   if (set_start_set)
1272     start = set_start;
1273   else
1274     start = bfd_get_start_address (ibfd);
1275   start += change_start;
1276
1277   /* Neither the start address nor the flags
1278      need to be set for a core file.  */
1279   if (bfd_get_format (obfd) != bfd_core)
1280     {
1281       flagword flags;
1282
1283       flags = bfd_get_file_flags (ibfd);
1284       flags |= bfd_flags_to_set;
1285       flags &= ~bfd_flags_to_clear;
1286       flags &= bfd_applicable_file_flags (obfd);
1287
1288       if (!bfd_set_start_address (obfd, start)
1289           || !bfd_set_file_flags (obfd, flags))
1290         {
1291           bfd_nonfatal (bfd_get_archive_filename (ibfd));
1292           return FALSE;
1293         }
1294     }
1295
1296   /* Copy architecture of input file to output file.  */
1297   iarch = bfd_get_arch (ibfd);
1298   imach = bfd_get_mach (ibfd);
1299   if (!bfd_set_arch_mach (obfd, iarch, imach)
1300       && (ibfd->target_defaulted
1301           || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
1302     {
1303       if (bfd_get_arch (ibfd) == bfd_arch_unknown)
1304         non_fatal (_("Unable to recognise the format of the input file `%s'"),
1305                    bfd_get_archive_filename (ibfd));
1306       else
1307         non_fatal (_("Warning: Output file cannot represent architecture `%s'"),
1308                    bfd_printable_arch_mach (bfd_get_arch (ibfd),
1309                                             bfd_get_mach (ibfd)));
1310       return FALSE;
1311     }
1312
1313   if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1314     {
1315       bfd_nonfatal (bfd_get_archive_filename (ibfd));
1316       return FALSE;
1317     }
1318
1319   if (isympp)
1320     free (isympp);
1321
1322   if (osympp != isympp)
1323     free (osympp);
1324
1325   isympp = NULL;
1326   osympp = NULL;
1327
1328   symsize = bfd_get_symtab_upper_bound (ibfd);
1329   if (symsize < 0)
1330     {
1331       bfd_nonfatal (bfd_get_archive_filename (ibfd));
1332       return FALSE;
1333     }
1334
1335   osympp = isympp = xmalloc (symsize);
1336   symcount = bfd_canonicalize_symtab (ibfd, isympp);
1337   if (symcount < 0)
1338     {
1339       bfd_nonfatal (bfd_get_filename (ibfd));
1340       return FALSE;
1341     }
1342
1343   /* BFD mandates that all output sections be created and sizes set before
1344      any output is done.  Thus, we traverse all sections multiple times.  */
1345   bfd_map_over_sections (ibfd, setup_section, obfd);
1346
1347   setup_bfd_headers (ibfd, obfd);
1348
1349   if (add_sections != NULL)
1350     {
1351       struct section_add *padd;
1352       struct section_list *pset;
1353
1354       for (padd = add_sections; padd != NULL; padd = padd->next)
1355         {
1356           flagword flags;
1357
1358           pset = find_section_list (padd->name, FALSE);
1359           if (pset != NULL)
1360             pset->used = TRUE;
1361
1362           flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
1363           if (pset != NULL && pset->set_flags)
1364             flags = pset->flags | SEC_HAS_CONTENTS;
1365
1366           /* bfd_make_section_with_flags() does not return very helpful
1367              error codes, so check for the most likely user error first.  */
1368           if (bfd_get_section_by_name (obfd, padd->name))
1369             {
1370               non_fatal (_("can't add section '%s' - it already exists!"), padd->name);
1371               return FALSE;
1372             }
1373           else
1374             {
1375               padd->section = bfd_make_section_with_flags (obfd, padd->name, flags);
1376               if (padd->section == NULL)
1377                 {
1378                   non_fatal (_("can't create section `%s': %s"),
1379                              padd->name, bfd_errmsg (bfd_get_error ()));
1380                   return FALSE;
1381                 }
1382             }
1383
1384           if (! bfd_set_section_size (obfd, padd->section, padd->size))
1385             {
1386               bfd_nonfatal (bfd_get_filename (obfd));
1387               return FALSE;
1388             }
1389
1390           if (pset != NULL)
1391             {
1392               if (pset->change_vma != CHANGE_IGNORE)
1393                 if (! bfd_set_section_vma (obfd, padd->section,
1394                                            pset->vma_val))
1395                   {
1396                     bfd_nonfatal (bfd_get_filename (obfd));
1397                     return FALSE;
1398                   }
1399
1400               if (pset->change_lma != CHANGE_IGNORE)
1401                 {
1402                   padd->section->lma = pset->lma_val;
1403
1404                   if (! bfd_set_section_alignment
1405                       (obfd, padd->section,
1406                        bfd_section_alignment (obfd, padd->section)))
1407                     {
1408                       bfd_nonfatal (bfd_get_filename (obfd));
1409                       return FALSE;
1410                     }
1411                 }
1412             }
1413         }
1414     }
1415
1416   if (gnu_debuglink_filename != NULL)
1417     {
1418       gnu_debuglink_section = bfd_create_gnu_debuglink_section
1419         (obfd, gnu_debuglink_filename);
1420
1421       if (gnu_debuglink_section == NULL)
1422         {
1423           bfd_nonfatal (gnu_debuglink_filename);
1424           return FALSE;
1425         }
1426
1427       /* Special processing for PE format files.  We
1428          have no way to distinguish PE from COFF here.  */
1429       if (bfd_get_flavour (obfd) == bfd_target_coff_flavour)
1430         {
1431           bfd_vma debuglink_vma;
1432           asection * highest_section;
1433           asection * sec;
1434
1435           /* The PE spec requires that all sections be adjacent and sorted
1436              in ascending order of VMA.  It also specifies that debug
1437              sections should be last.  This is despite the fact that debug
1438              sections are not loaded into memory and so in theory have no
1439              use for a VMA.
1440
1441              This means that the debuglink section must be given a non-zero
1442              VMA which makes it contiguous with other debug sections.  So
1443              walk the current section list, find the section with the
1444              highest VMA and start the debuglink section after that one.  */
1445           for (sec = obfd->sections, highest_section = NULL;
1446                sec != NULL;
1447                sec = sec->next)
1448             if (sec->vma > 0
1449                 && (highest_section == NULL
1450                     || sec->vma > highest_section->vma))
1451               highest_section = sec;
1452
1453           if (highest_section)
1454             debuglink_vma = BFD_ALIGN (highest_section->vma
1455                                        + highest_section->size,
1456                                        /* FIXME: We ought to be using
1457                                           COFF_PAGE_SIZE here or maybe
1458                                           bfd_get_section_alignment() (if it
1459                                           was set) but since this is for PE
1460                                           and we know the required alignment
1461                                           it is easier just to hard code it.  */
1462                                        0x1000);
1463           else
1464             /* Umm, not sure what to do in this case.  */
1465             debuglink_vma = 0x1000;
1466
1467           bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
1468         }
1469     }
1470
1471   if (bfd_count_sections (obfd) == 0)
1472     {
1473       non_fatal (_("there are no sections to be copied!"));
1474       return FALSE;
1475     }
1476
1477   if (gap_fill_set || pad_to_set)
1478     {
1479       asection **set;
1480       unsigned int c, i;
1481
1482       /* We must fill in gaps between the sections and/or we must pad
1483          the last section to a specified address.  We do this by
1484          grabbing a list of the sections, sorting them by VMA, and
1485          increasing the section sizes as required to fill the gaps.
1486          We write out the gap contents below.  */
1487
1488       c = bfd_count_sections (obfd);
1489       osections = xmalloc (c * sizeof (asection *));
1490       set = osections;
1491       bfd_map_over_sections (obfd, get_sections, &set);
1492
1493       qsort (osections, c, sizeof (asection *), compare_section_lma);
1494
1495       gaps = xmalloc (c * sizeof (bfd_size_type));
1496       memset (gaps, 0, c * sizeof (bfd_size_type));
1497
1498       if (gap_fill_set)
1499         {
1500           for (i = 0; i < c - 1; i++)
1501             {
1502               flagword flags;
1503               bfd_size_type size;
1504               bfd_vma gap_start, gap_stop;
1505
1506               flags = bfd_get_section_flags (obfd, osections[i]);
1507               if ((flags & SEC_HAS_CONTENTS) == 0
1508                   || (flags & SEC_LOAD) == 0)
1509                 continue;
1510
1511               size = bfd_section_size (obfd, osections[i]);
1512               gap_start = bfd_section_lma (obfd, osections[i]) + size;
1513               gap_stop = bfd_section_lma (obfd, osections[i + 1]);
1514               if (gap_start < gap_stop)
1515                 {
1516                   if (! bfd_set_section_size (obfd, osections[i],
1517                                               size + (gap_stop - gap_start)))
1518                     {
1519                       non_fatal (_("Can't fill gap after %s: %s"),
1520                                  bfd_get_section_name (obfd, osections[i]),
1521                                  bfd_errmsg (bfd_get_error ()));
1522                       status = 1;
1523                       break;
1524                     }
1525                   gaps[i] = gap_stop - gap_start;
1526                   if (max_gap < gap_stop - gap_start)
1527                     max_gap = gap_stop - gap_start;
1528                 }
1529             }
1530         }
1531
1532       if (pad_to_set)
1533         {
1534           bfd_vma lma;
1535           bfd_size_type size;
1536
1537           lma = bfd_section_lma (obfd, osections[c - 1]);
1538           size = bfd_section_size (obfd, osections[c - 1]);
1539           if (lma + size < pad_to)
1540             {
1541               if (! bfd_set_section_size (obfd, osections[c - 1],
1542                                           pad_to - lma))
1543                 {
1544                   non_fatal (_("Can't add padding to %s: %s"),
1545                              bfd_get_section_name (obfd, osections[c - 1]),
1546                              bfd_errmsg (bfd_get_error ()));
1547                   status = 1;
1548                 }
1549               else
1550                 {
1551                   gaps[c - 1] = pad_to - (lma + size);
1552                   if (max_gap < pad_to - (lma + size))
1553                     max_gap = pad_to - (lma + size);
1554                 }
1555             }
1556         }
1557     }
1558
1559   /* Symbol filtering must happen after the output sections
1560      have been created, but before their contents are set.  */
1561   dhandle = NULL;
1562   if (convert_debugging)
1563     dhandle = read_debugging_info (ibfd, isympp, symcount);
1564
1565   if (strip_symbols == STRIP_DEBUG
1566       || strip_symbols == STRIP_ALL
1567       || strip_symbols == STRIP_UNNEEDED
1568       || strip_symbols == STRIP_NONDEBUG
1569       || discard_locals != LOCALS_UNDEF
1570       || localize_hidden
1571       || strip_specific_list != NULL
1572       || keep_specific_list != NULL
1573       || localize_specific_list != NULL
1574       || globalize_specific_list != NULL
1575       || keepglobal_specific_list != NULL
1576       || weaken_specific_list != NULL
1577       || prefix_symbols_string
1578       || sections_removed
1579       || sections_copied
1580       || convert_debugging
1581       || change_leading_char
1582       || remove_leading_char
1583       || redefine_sym_list
1584       || weaken)
1585     {
1586       /* Mark symbols used in output relocations so that they
1587          are kept, even if they are local labels or static symbols.
1588
1589          Note we iterate over the input sections examining their
1590          relocations since the relocations for the output sections
1591          haven't been set yet.  mark_symbols_used_in_relocations will
1592          ignore input sections which have no corresponding output
1593          section.  */
1594       if (strip_symbols != STRIP_ALL)
1595         bfd_map_over_sections (ibfd,
1596                                mark_symbols_used_in_relocations,
1597                                isympp);
1598       osympp = xmalloc ((symcount + 1) * sizeof (asymbol *));
1599       symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
1600     }
1601
1602   if (convert_debugging && dhandle != NULL)
1603     {
1604       if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
1605         {
1606           status = 1;
1607           return FALSE;
1608         }
1609     }
1610
1611   bfd_set_symtab (obfd, osympp, symcount);
1612
1613   /* This has to happen after the symbol table has been set.  */
1614   bfd_map_over_sections (ibfd, copy_section, obfd);
1615
1616   if (add_sections != NULL)
1617     {
1618       struct section_add *padd;
1619
1620       for (padd = add_sections; padd != NULL; padd = padd->next)
1621         {
1622           if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
1623                                           0, padd->size))
1624             {
1625               bfd_nonfatal (bfd_get_filename (obfd));
1626               return FALSE;
1627             }
1628         }
1629     }
1630
1631   if (gnu_debuglink_filename != NULL)
1632     {
1633       if (! bfd_fill_in_gnu_debuglink_section
1634           (obfd, gnu_debuglink_section, gnu_debuglink_filename))
1635         {
1636           bfd_nonfatal (gnu_debuglink_filename);
1637           return FALSE;
1638         }
1639     }
1640
1641   if (gap_fill_set || pad_to_set)
1642     {
1643       bfd_byte *buf;
1644       int c, i;
1645
1646       /* Fill in the gaps.  */
1647       if (max_gap > 8192)
1648         max_gap = 8192;
1649       buf = xmalloc (max_gap);
1650       memset (buf, gap_fill, max_gap);
1651
1652       c = bfd_count_sections (obfd);
1653       for (i = 0; i < c; i++)
1654         {
1655           if (gaps[i] != 0)
1656             {
1657               bfd_size_type left;
1658               file_ptr off;
1659
1660               left = gaps[i];
1661               off = bfd_section_size (obfd, osections[i]) - left;
1662
1663               while (left > 0)
1664                 {
1665                   bfd_size_type now;
1666
1667                   if (left > 8192)
1668                     now = 8192;
1669                   else
1670                     now = left;
1671
1672                   if (! bfd_set_section_contents (obfd, osections[i], buf,
1673                                                   off, now))
1674                     {
1675                       bfd_nonfatal (bfd_get_filename (obfd));
1676                       return FALSE;
1677                     }
1678
1679                   left -= now;
1680                   off += now;
1681                 }
1682             }
1683         }
1684     }
1685
1686   /* Allow the BFD backend to copy any private data it understands
1687      from the input BFD to the output BFD.  This is done last to
1688      permit the routine to look at the filtered symbol table, which is
1689      important for the ECOFF code at least.  */
1690   if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour
1691       && strip_symbols == STRIP_NONDEBUG)
1692     /* Do not copy the private data when creating an ELF format
1693        debug info file.  We do not want the program headers.  */
1694     ;
1695   else if (! bfd_copy_private_bfd_data (ibfd, obfd))
1696     {
1697       non_fatal (_("%s: error copying private BFD data: %s"),
1698                  bfd_get_filename (obfd),
1699                  bfd_errmsg (bfd_get_error ()));
1700       return FALSE;
1701     }
1702
1703   /* Switch to the alternate machine code.  We have to do this at the
1704      very end, because we only initialize the header when we create
1705      the first section.  */
1706   if (use_alt_mach_code != 0)
1707     {
1708       if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
1709         {
1710           non_fatal (_("this target does not support %lu alternative machine codes"),
1711                      use_alt_mach_code);
1712           if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
1713             {
1714               non_fatal (_("treating that number as an absolute e_machine value instead"));
1715               elf_elfheader (obfd)->e_machine = use_alt_mach_code;
1716             }
1717           else
1718             non_fatal (_("ignoring the alternative value"));
1719         }
1720     }
1721
1722   return TRUE;
1723 }
1724
1725 #undef MKDIR
1726 #if defined (_WIN32) && !defined (__CYGWIN32__)
1727 #define MKDIR(DIR, MODE) mkdir (DIR)
1728 #else
1729 #define MKDIR(DIR, MODE) mkdir (DIR, MODE)
1730 #endif
1731
1732 /* Read each archive element in turn from IBFD, copy the
1733    contents to temp file, and keep the temp file handle.
1734    If 'force_output_target' is TRUE then make sure that
1735    all elements in the new archive are of the type
1736    'output_target'.  */
1737
1738 static void
1739 copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
1740               bfd_boolean force_output_target)
1741 {
1742   struct name_list
1743     {
1744       struct name_list *next;
1745       const char *name;
1746       bfd *obfd;
1747     } *list, *l;
1748   bfd **ptr = &obfd->archive_head;
1749   bfd *this_element;
1750   char *dir = make_tempname (bfd_get_filename (obfd));
1751
1752   /* Make a temp directory to hold the contents.  */
1753   if (MKDIR (dir, 0700) != 0)
1754     fatal (_("cannot mkdir %s for archive copying (error: %s)"),
1755            dir, strerror (errno));
1756
1757   obfd->has_armap = ibfd->has_armap;
1758
1759   list = NULL;
1760
1761   this_element = bfd_openr_next_archived_file (ibfd, NULL);
1762
1763   if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1764     RETURN_NONFATAL (bfd_get_filename (obfd));
1765
1766   while (!status && this_element != NULL)
1767     {
1768       char *output_name;
1769       bfd *output_bfd;
1770       bfd *last_element;
1771       struct stat buf;
1772       int stat_status = 0;
1773       bfd_boolean delete = TRUE;
1774
1775       /* Create an output file for this member.  */
1776       output_name = concat (dir, "/",
1777                             bfd_get_filename (this_element), (char *) 0);
1778
1779       /* If the file already exists, make another temp dir.  */
1780       if (stat (output_name, &buf) >= 0)
1781         {
1782           output_name = make_tempname (output_name);
1783           if (MKDIR (output_name, 0700) != 0)
1784             fatal (_("cannot mkdir %s for archive copying (error: %s)"),
1785                    output_name, strerror (errno));
1786
1787           l = xmalloc (sizeof (struct name_list));
1788           l->name = output_name;
1789           l->next = list;
1790           l->obfd = NULL;
1791           list = l;
1792           output_name = concat (output_name, "/",
1793                                 bfd_get_filename (this_element), (char *) 0);
1794         }
1795
1796       if (preserve_dates)
1797         {
1798           stat_status = bfd_stat_arch_elt (this_element, &buf);
1799
1800           if (stat_status != 0)
1801             non_fatal (_("internal stat error on %s"),
1802                        bfd_get_filename (this_element));
1803         }
1804
1805       l = xmalloc (sizeof (struct name_list));
1806       l->name = output_name;
1807       l->next = list;
1808       l->obfd = NULL;
1809       list = l;
1810
1811       if (bfd_check_format (this_element, bfd_object))
1812         {
1813           /* PR binutils/3110: Cope with archives
1814              containing multiple target types.  */
1815           if (force_output_target)
1816             output_bfd = bfd_openw (output_name, output_target);
1817           else
1818             output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
1819
1820           if (output_bfd == NULL)
1821             RETURN_NONFATAL (output_name);
1822
1823           delete = ! copy_object (this_element, output_bfd);
1824
1825           if (! delete
1826               || bfd_get_arch (this_element) != bfd_arch_unknown)
1827             {
1828               if (!bfd_close (output_bfd))
1829                 {
1830                   bfd_nonfatal (bfd_get_filename (output_bfd));
1831                   /* Error in new object file. Don't change archive.  */
1832                   status = 1;
1833                 }
1834             }
1835           else
1836             goto copy_unknown_element;
1837         }
1838       else
1839         {
1840           non_fatal (_("Unable to recognise the format of the input file `%s'"),
1841                      bfd_get_archive_filename (this_element));
1842
1843           output_bfd = bfd_openw (output_name, output_target);
1844 copy_unknown_element:
1845           delete = !copy_unknown_object (this_element, output_bfd);
1846           if (!bfd_close_all_done (output_bfd))
1847             {
1848               bfd_nonfatal (bfd_get_filename (output_bfd));
1849               /* Error in new object file. Don't change archive.  */
1850               status = 1;
1851             }
1852         }
1853
1854       if (delete)
1855         {
1856           unlink (output_name);
1857           status = 1;
1858         }
1859       else
1860         {
1861           if (preserve_dates && stat_status == 0)
1862             set_times (output_name, &buf);
1863
1864           /* Open the newly output file and attach to our list.  */
1865           output_bfd = bfd_openr (output_name, output_target);
1866
1867           l->obfd = output_bfd;
1868
1869           *ptr = output_bfd;
1870           ptr = &output_bfd->next;
1871
1872           last_element = this_element;
1873
1874           this_element = bfd_openr_next_archived_file (ibfd, last_element);
1875
1876           bfd_close (last_element);
1877         }
1878     }
1879   *ptr = NULL;
1880
1881   if (!bfd_close (obfd))
1882     RETURN_NONFATAL (bfd_get_filename (obfd));
1883
1884   if (!bfd_close (ibfd))
1885     RETURN_NONFATAL (bfd_get_filename (ibfd));
1886
1887   /* Delete all the files that we opened.  */
1888   for (l = list; l != NULL; l = l->next)
1889     {
1890       if (l->obfd == NULL)
1891         rmdir (l->name);
1892       else
1893         {
1894           bfd_close (l->obfd);
1895           unlink (l->name);
1896         }
1897     }
1898   rmdir (dir);
1899 }
1900
1901 /* The top-level control.  */
1902
1903 static void
1904 copy_file (const char *input_filename, const char *output_filename,
1905            const char *input_target,   const char *output_target)
1906 {
1907   bfd *ibfd;
1908   char **obj_matching;
1909   char **core_matching;
1910
1911   if (get_file_size (input_filename) < 1)
1912     {
1913       status = 1;
1914       return;
1915     }
1916
1917   /* To allow us to do "strip *" without dying on the first
1918      non-object file, failures are nonfatal.  */
1919   ibfd = bfd_openr (input_filename, input_target);
1920   if (ibfd == NULL)
1921     RETURN_NONFATAL (input_filename);
1922
1923   if (bfd_check_format (ibfd, bfd_archive))
1924     {
1925       bfd_boolean force_output_target;
1926       bfd *obfd;
1927
1928       /* bfd_get_target does not return the correct value until
1929          bfd_check_format succeeds.  */
1930       if (output_target == NULL)
1931         {
1932           output_target = bfd_get_target (ibfd);
1933           force_output_target = FALSE;
1934         }
1935       else
1936         force_output_target = TRUE;
1937
1938       obfd = bfd_openw (output_filename, output_target);
1939       if (obfd == NULL)
1940         RETURN_NONFATAL (output_filename);
1941
1942       copy_archive (ibfd, obfd, output_target, force_output_target);
1943     }
1944   else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
1945     {
1946       bfd *obfd;
1947     do_copy:
1948
1949       /* bfd_get_target does not return the correct value until
1950          bfd_check_format succeeds.  */
1951       if (output_target == NULL)
1952         output_target = bfd_get_target (ibfd);
1953
1954       obfd = bfd_openw (output_filename, output_target);
1955       if (obfd == NULL)
1956         RETURN_NONFATAL (output_filename);
1957
1958       if (! copy_object (ibfd, obfd))
1959         status = 1;
1960
1961       if (!bfd_close (obfd))
1962         RETURN_NONFATAL (output_filename);
1963
1964       if (!bfd_close (ibfd))
1965         RETURN_NONFATAL (input_filename);
1966
1967     }
1968   else
1969     {
1970       bfd_error_type obj_error = bfd_get_error ();
1971       bfd_error_type core_error;
1972
1973       if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
1974         {
1975           /* This probably can't happen..  */
1976           if (obj_error == bfd_error_file_ambiguously_recognized)
1977             free (obj_matching);
1978           goto do_copy;
1979         }
1980
1981       core_error = bfd_get_error ();
1982       /* Report the object error in preference to the core error.  */
1983       if (obj_error != core_error)
1984         bfd_set_error (obj_error);
1985
1986       bfd_nonfatal (input_filename);
1987
1988       if (obj_error == bfd_error_file_ambiguously_recognized)
1989         {
1990           list_matching_formats (obj_matching);
1991           free (obj_matching);
1992         }
1993       if (core_error == bfd_error_file_ambiguously_recognized)
1994         {
1995           list_matching_formats (core_matching);
1996           free (core_matching);
1997         }
1998
1999       status = 1;
2000     }
2001 }
2002
2003 /* Add a name to the section renaming list.  */
2004
2005 static void
2006 add_section_rename (const char * old_name, const char * new_name,
2007                     flagword flags)
2008 {
2009   section_rename * rename;
2010
2011   /* Check for conflicts first.  */
2012   for (rename = section_rename_list; rename != NULL; rename = rename->next)
2013     if (strcmp (rename->old_name, old_name) == 0)
2014       {
2015         /* Silently ignore duplicate definitions.  */
2016         if (strcmp (rename->new_name, new_name) == 0
2017             && rename->flags == flags)
2018           return;
2019
2020         fatal (_("Multiple renames of section %s"), old_name);
2021       }
2022
2023   rename = xmalloc (sizeof (* rename));
2024
2025   rename->old_name = old_name;
2026   rename->new_name = new_name;
2027   rename->flags    = flags;
2028   rename->next     = section_rename_list;
2029
2030   section_rename_list = rename;
2031 }
2032
2033 /* Check the section rename list for a new name of the input section
2034    ISECTION.  Return the new name if one is found.
2035    Also set RETURNED_FLAGS to the flags to be used for this section.  */
2036
2037 static const char *
2038 find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection,
2039                      flagword * returned_flags)
2040 {
2041   const char * old_name = bfd_section_name (ibfd, isection);
2042   section_rename * rename;
2043
2044   /* Default to using the flags of the input section.  */
2045   * returned_flags = bfd_get_section_flags (ibfd, isection);
2046
2047   for (rename = section_rename_list; rename != NULL; rename = rename->next)
2048     if (strcmp (rename->old_name, old_name) == 0)
2049       {
2050         if (rename->flags != (flagword) -1)
2051           * returned_flags = rename->flags;
2052
2053         return rename->new_name;
2054       }
2055
2056   return old_name;
2057 }
2058
2059 /* Once each of the sections is copied, we may still need to do some
2060    finalization work for private section headers.  Do that here.  */
2061
2062 static void
2063 setup_bfd_headers (bfd *ibfd, bfd *obfd)
2064 {
2065   const char *err;
2066
2067   /* Allow the BFD backend to copy any private data it understands
2068      from the input section to the output section.  */
2069   if (! bfd_copy_private_header_data (ibfd, obfd))
2070     {
2071       err = _("private header data");
2072       goto loser;
2073     }
2074
2075   /* All went well.  */
2076   return;
2077
2078 loser:
2079   non_fatal (_("%s: error in %s: %s"),
2080              bfd_get_filename (ibfd),
2081              err, bfd_errmsg (bfd_get_error ()));
2082   status = 1;
2083 }
2084
2085 /* Create a section in OBFD with the same
2086    name and attributes as ISECTION in IBFD.  */
2087
2088 static void
2089 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2090 {
2091   bfd *obfd = obfdarg;
2092   struct section_list *p;
2093   sec_ptr osection;
2094   bfd_size_type size;
2095   bfd_vma vma;
2096   bfd_vma lma;
2097   flagword flags;
2098   const char *err;
2099   const char * name;
2100   char *prefix = NULL;
2101
2102   if (is_strip_section (ibfd, isection))
2103     return;
2104
2105   p = find_section_list (bfd_section_name (ibfd, isection), FALSE);
2106   if (p != NULL)
2107     p->used = TRUE;
2108
2109   /* Get the, possibly new, name of the output section.  */
2110   name = find_section_rename (ibfd, isection, & flags);
2111
2112   /* Prefix sections.  */
2113   if ((prefix_alloc_sections_string)
2114       && (bfd_get_section_flags (ibfd, isection) & SEC_ALLOC))
2115     prefix = prefix_alloc_sections_string;
2116   else if (prefix_sections_string)
2117     prefix = prefix_sections_string;
2118
2119   if (prefix)
2120     {
2121       char *n;
2122
2123       n = xmalloc (strlen (prefix) + strlen (name) + 1);
2124       strcpy (n, prefix);
2125       strcat (n, name);
2126       name = n;
2127     }
2128
2129   if (p != NULL && p->set_flags)
2130     flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
2131   else if (strip_symbols == STRIP_NONDEBUG && (flags & SEC_ALLOC) != 0)
2132     flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD);
2133
2134   osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
2135
2136   if (osection == NULL)
2137     {
2138       err = _("making");
2139       goto loser;
2140     }
2141
2142   if (strip_symbols == STRIP_NONDEBUG
2143       && obfd->xvec->flavour == bfd_target_elf_flavour
2144       && (flags & SEC_ALLOC) != 0
2145       && (p == NULL || !p->set_flags))
2146     elf_section_type (osection) = SHT_NOBITS;
2147
2148   size = bfd_section_size (ibfd, isection);
2149   if (copy_byte >= 0)
2150     size = (size + interleave - 1) / interleave;
2151   if (! bfd_set_section_size (obfd, osection, size))
2152     {
2153       err = _("size");
2154       goto loser;
2155     }
2156
2157   vma = bfd_section_vma (ibfd, isection);
2158   if (p != NULL && p->change_vma == CHANGE_MODIFY)
2159     vma += p->vma_val;
2160   else if (p != NULL && p->change_vma == CHANGE_SET)
2161     vma = p->vma_val;
2162   else
2163     vma += change_section_address;
2164
2165   if (! bfd_set_section_vma (obfd, osection, vma))
2166     {
2167       err = _("vma");
2168       goto loser;
2169     }
2170
2171   lma = isection->lma;
2172   if ((p != NULL) && p->change_lma != CHANGE_IGNORE)
2173     {
2174       if (p->change_lma == CHANGE_MODIFY)
2175         lma += p->lma_val;
2176       else if (p->change_lma == CHANGE_SET)
2177         lma = p->lma_val;
2178       else
2179         abort ();
2180     }
2181   else
2182     lma += change_section_address;
2183
2184   osection->lma = lma;
2185
2186   /* FIXME: This is probably not enough.  If we change the LMA we
2187      may have to recompute the header for the file as well.  */
2188   if (!bfd_set_section_alignment (obfd,
2189                                   osection,
2190                                   bfd_section_alignment (ibfd, isection)))
2191     {
2192       err = _("alignment");
2193       goto loser;
2194     }
2195
2196   /* Copy merge entity size.  */
2197   osection->entsize = isection->entsize;
2198
2199   /* This used to be mangle_section; we do here to avoid using
2200      bfd_get_section_by_name since some formats allow multiple
2201      sections with the same name.  */
2202   isection->output_section = osection;
2203   isection->output_offset = 0;
2204
2205   /* Allow the BFD backend to copy any private data it understands
2206      from the input section to the output section.  */
2207   if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour
2208       && strip_symbols == STRIP_NONDEBUG)
2209     /* Do not copy the private data when creating an ELF format
2210        debug info file.  We do not want the program headers.  */
2211     ;
2212   else if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
2213     {
2214       err = _("private data");
2215       goto loser;
2216     }
2217   else if ((isection->flags & SEC_GROUP) != 0
2218            && bfd_get_flavour (ibfd) == bfd_target_elf_flavour)
2219     {
2220       Elf_Internal_Shdr *ghdr;
2221
2222       ghdr = &elf_section_data (isection)->this_hdr;
2223       if (ghdr->sh_link < elf_numsections (ibfd))
2224         {
2225           const struct elf_backend_data *bed = get_elf_backend_data (ibfd);
2226           Elf_Internal_Shdr *symhdr = elf_elfsections (ibfd) [ghdr->sh_link];
2227
2228           if (symhdr->sh_type == SHT_SYMTAB
2229               && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym)
2230             isympp[ghdr->sh_info]->flags |= BSF_KEEP;
2231         }
2232     }
2233
2234   /* All went well.  */
2235   return;
2236
2237 loser:
2238   non_fatal (_("%s: section `%s': error in %s: %s"),
2239              bfd_get_filename (ibfd),
2240              bfd_section_name (ibfd, isection),
2241              err, bfd_errmsg (bfd_get_error ()));
2242   status = 1;
2243 }
2244
2245 /* Copy the data of input section ISECTION of IBFD
2246    to an output section with the same name in OBFD.
2247    If stripping then don't copy any relocation info.  */
2248
2249 static void
2250 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2251 {
2252   bfd *obfd = obfdarg;
2253   struct section_list *p;
2254   arelent **relpp;
2255   long relcount;
2256   sec_ptr osection;
2257   bfd_size_type size;
2258   long relsize;
2259   flagword flags;
2260
2261   /* If we have already failed earlier on,
2262      do not keep on generating complaints now.  */
2263   if (status != 0)
2264     return;
2265
2266   if (is_strip_section (ibfd, isection))
2267     return;
2268
2269   flags = bfd_get_section_flags (ibfd, isection);
2270   if ((flags & SEC_GROUP) != 0)
2271     return;
2272
2273   osection = isection->output_section;
2274   size = bfd_get_section_size (isection);
2275
2276   if (size == 0 || osection == 0)
2277     return;
2278
2279   p = find_section_list (bfd_get_section_name (ibfd, isection), FALSE);
2280
2281   /* Core files do not need to be relocated.  */
2282   if (bfd_get_format (obfd) == bfd_core)
2283     relsize = 0;
2284   else
2285     {
2286       relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2287
2288       if (relsize < 0)
2289         {
2290           /* Do not complain if the target does not support relocations.  */
2291           if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2292             relsize = 0;
2293           else
2294             RETURN_NONFATAL (bfd_get_filename (ibfd));
2295         }
2296     }
2297
2298   if (relsize == 0)
2299     bfd_set_reloc (obfd, osection, NULL, 0);
2300   else
2301     {
2302       relpp = xmalloc (relsize);
2303       relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
2304       if (relcount < 0)
2305         RETURN_NONFATAL (bfd_get_filename (ibfd));
2306
2307       if (strip_symbols == STRIP_ALL)
2308         {
2309           /* Remove relocations which are not in
2310              keep_strip_specific_list.  */
2311           arelent **temp_relpp;
2312           long temp_relcount = 0;
2313           long i;
2314
2315           temp_relpp = xmalloc (relsize);
2316           for (i = 0; i < relcount; i++)
2317             if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
2318                                      keep_specific_list))
2319               temp_relpp [temp_relcount++] = relpp [i];
2320           relcount = temp_relcount;
2321           free (relpp);
2322           relpp = temp_relpp;
2323         }
2324
2325       bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
2326       if (relcount == 0)
2327         free (relpp);
2328     }
2329
2330   if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
2331       && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
2332     {
2333       void *memhunk = xmalloc (size);
2334
2335       if (!bfd_get_section_contents (ibfd, isection, memhunk, 0, size))
2336         RETURN_NONFATAL (bfd_get_filename (ibfd));
2337
2338       if (copy_byte >= 0)
2339         {
2340           /* Keep only every `copy_byte'th byte in MEMHUNK.  */
2341           char *from = (char *) memhunk + copy_byte;
2342           char *to = memhunk;
2343           char *end = (char *) memhunk + size;
2344
2345           for (; from < end; from += interleave)
2346             *to++ = *from;
2347
2348           size = (size + interleave - 1 - copy_byte) / interleave;
2349           osection->lma /= interleave;
2350         }
2351
2352       if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2353         RETURN_NONFATAL (bfd_get_filename (obfd));
2354
2355       free (memhunk);
2356     }
2357   else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0)
2358     {
2359       void *memhunk = xmalloc (size);
2360
2361       /* We don't permit the user to turn off the SEC_HAS_CONTENTS
2362          flag--they can just remove the section entirely and add it
2363          back again.  However, we do permit them to turn on the
2364          SEC_HAS_CONTENTS flag, and take it to mean that the section
2365          contents should be zeroed out.  */
2366
2367       memset (memhunk, 0, size);
2368       if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2369         RETURN_NONFATAL (bfd_get_filename (obfd));
2370       free (memhunk);
2371     }
2372 }
2373
2374 /* Get all the sections.  This is used when --gap-fill or --pad-to is
2375    used.  */
2376
2377 static void
2378 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
2379 {
2380   asection ***secppp = secppparg;
2381
2382   **secppp = osection;
2383   ++(*secppp);
2384 }
2385
2386 /* Sort sections by VMA.  This is called via qsort, and is used when
2387    --gap-fill or --pad-to is used.  We force non loadable or empty
2388    sections to the front, where they are easier to ignore.  */
2389
2390 static int
2391 compare_section_lma (const void *arg1, const void *arg2)
2392 {
2393   const asection *const *sec1 = arg1;
2394   const asection *const *sec2 = arg2;
2395   flagword flags1, flags2;
2396
2397   /* Sort non loadable sections to the front.  */
2398   flags1 = (*sec1)->flags;
2399   flags2 = (*sec2)->flags;
2400   if ((flags1 & SEC_HAS_CONTENTS) == 0
2401       || (flags1 & SEC_LOAD) == 0)
2402     {
2403       if ((flags2 & SEC_HAS_CONTENTS) != 0
2404           && (flags2 & SEC_LOAD) != 0)
2405         return -1;
2406     }
2407   else
2408     {
2409       if ((flags2 & SEC_HAS_CONTENTS) == 0
2410           || (flags2 & SEC_LOAD) == 0)
2411         return 1;
2412     }
2413
2414   /* Sort sections by LMA.  */
2415   if ((*sec1)->lma > (*sec2)->lma)
2416     return 1;
2417   else if ((*sec1)->lma < (*sec2)->lma)
2418     return -1;
2419
2420   /* Sort sections with the same LMA by size.  */
2421   if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
2422     return 1;
2423   else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
2424     return -1;
2425
2426   return 0;
2427 }
2428
2429 /* Mark all the symbols which will be used in output relocations with
2430    the BSF_KEEP flag so that those symbols will not be stripped.
2431
2432    Ignore relocations which will not appear in the output file.  */
2433
2434 static void
2435 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
2436 {
2437   asymbol **symbols = symbolsarg;
2438   long relsize;
2439   arelent **relpp;
2440   long relcount, i;
2441
2442   /* Ignore an input section with no corresponding output section.  */
2443   if (isection->output_section == NULL)
2444     return;
2445
2446   relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2447   if (relsize < 0)
2448     {
2449       /* Do not complain if the target does not support relocations.  */
2450       if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2451         return;
2452       bfd_fatal (bfd_get_filename (ibfd));
2453     }
2454
2455   if (relsize == 0)
2456     return;
2457
2458   relpp = xmalloc (relsize);
2459   relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
2460   if (relcount < 0)
2461     bfd_fatal (bfd_get_filename (ibfd));
2462
2463   /* Examine each symbol used in a relocation.  If it's not one of the
2464      special bfd section symbols, then mark it with BSF_KEEP.  */
2465   for (i = 0; i < relcount; i++)
2466     {
2467       if (*relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
2468           && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
2469           && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
2470         (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
2471     }
2472
2473   if (relpp != NULL)
2474     free (relpp);
2475 }
2476
2477 /* Write out debugging information.  */
2478
2479 static bfd_boolean
2480 write_debugging_info (bfd *obfd, void *dhandle,
2481                       long *symcountp ATTRIBUTE_UNUSED,
2482                       asymbol ***symppp ATTRIBUTE_UNUSED)
2483 {
2484   if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour)
2485     return write_ieee_debugging_info (obfd, dhandle);
2486
2487   if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2488       || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
2489     {
2490       bfd_byte *syms, *strings;
2491       bfd_size_type symsize, stringsize;
2492       asection *stabsec, *stabstrsec;
2493       flagword flags;
2494
2495       if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
2496                                                     &symsize, &strings,
2497                                                     &stringsize))
2498         return FALSE;
2499
2500       flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
2501       stabsec = bfd_make_section_with_flags (obfd, ".stab", flags);
2502       stabstrsec = bfd_make_section_with_flags (obfd, ".stabstr", flags);
2503       if (stabsec == NULL
2504           || stabstrsec == NULL
2505           || ! bfd_set_section_size (obfd, stabsec, symsize)
2506           || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
2507           || ! bfd_set_section_alignment (obfd, stabsec, 2)
2508           || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
2509         {
2510           non_fatal (_("%s: can't create debugging section: %s"),
2511                      bfd_get_filename (obfd),
2512                      bfd_errmsg (bfd_get_error ()));
2513           return FALSE;
2514         }
2515
2516       /* We can get away with setting the section contents now because
2517          the next thing the caller is going to do is copy over the
2518          real sections.  We may someday have to split the contents
2519          setting out of this function.  */
2520       if (! bfd_set_section_contents (obfd, stabsec, syms, 0, symsize)
2521           || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
2522                                          stringsize))
2523         {
2524           non_fatal (_("%s: can't set debugging section contents: %s"),
2525                      bfd_get_filename (obfd),
2526                      bfd_errmsg (bfd_get_error ()));
2527           return FALSE;
2528         }
2529
2530       return TRUE;
2531     }
2532
2533   non_fatal (_("%s: don't know how to write debugging information for %s"),
2534              bfd_get_filename (obfd), bfd_get_target (obfd));
2535   return FALSE;
2536 }
2537
2538 static int
2539 strip_main (int argc, char *argv[])
2540 {
2541   char *input_target = NULL;
2542   char *output_target = NULL;
2543   bfd_boolean show_version = FALSE;
2544   bfd_boolean formats_info = FALSE;
2545   int c;
2546   int i;
2547   struct section_list *p;
2548   char *output_file = NULL;
2549
2550   while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
2551                            strip_options, (int *) 0)) != EOF)
2552     {
2553       switch (c)
2554         {
2555         case 'I':
2556           input_target = optarg;
2557           break;
2558         case 'O':
2559           output_target = optarg;
2560           break;
2561         case 'F':
2562           input_target = output_target = optarg;
2563           break;
2564         case 'R':
2565           p = find_section_list (optarg, TRUE);
2566           p->remove = TRUE;
2567           sections_removed = TRUE;
2568           break;
2569         case 's':
2570           strip_symbols = STRIP_ALL;
2571           break;
2572         case 'S':
2573         case 'g':
2574         case 'd':       /* Historic BSD alias for -g.  Used by early NetBSD.  */
2575           strip_symbols = STRIP_DEBUG;
2576           break;
2577         case OPTION_STRIP_UNNEEDED:
2578           strip_symbols = STRIP_UNNEEDED;
2579           break;
2580         case 'K':
2581           add_specific_symbol (optarg, &keep_specific_list);
2582           break;
2583         case 'N':
2584           add_specific_symbol (optarg, &strip_specific_list);
2585           break;
2586         case 'o':
2587           output_file = optarg;
2588           break;
2589         case 'p':
2590           preserve_dates = TRUE;
2591           break;
2592         case 'x':
2593           discard_locals = LOCALS_ALL;
2594           break;
2595         case 'X':
2596           discard_locals = LOCALS_START_L;
2597           break;
2598         case 'v':
2599           verbose = TRUE;
2600           break;
2601         case 'V':
2602           show_version = TRUE;
2603           break;
2604         case OPTION_FORMATS_INFO:
2605           formats_info = TRUE;
2606           break;
2607         case OPTION_ONLY_KEEP_DEBUG:
2608           strip_symbols = STRIP_NONDEBUG;
2609           break;
2610         case OPTION_KEEP_FILE_SYMBOLS:
2611           keep_file_symbols = 1;
2612           break;
2613         case 0:
2614           /* We've been given a long option.  */
2615           break;
2616         case 'w':
2617           wildcard = TRUE;
2618           break;
2619         case 'H':
2620         case 'h':
2621           strip_usage (stdout, 0);
2622         default:
2623           strip_usage (stderr, 1);
2624         }
2625     }
2626
2627   if (formats_info)
2628     {
2629       display_info ();
2630       return 0;
2631     }
2632  
2633   if (show_version)
2634     print_version ("strip");
2635
2636   /* Default is to strip all symbols.  */
2637   if (strip_symbols == STRIP_UNDEF
2638       && discard_locals == LOCALS_UNDEF
2639       && strip_specific_list == NULL)
2640     strip_symbols = STRIP_ALL;
2641
2642   if (output_target == NULL)
2643     output_target = input_target;
2644
2645   i = optind;
2646   if (i == argc
2647       || (output_file != NULL && (i + 1) < argc))
2648     strip_usage (stderr, 1);
2649
2650   for (; i < argc; i++)
2651     {
2652       int hold_status = status;
2653       struct stat statbuf;
2654       char *tmpname;
2655
2656       if (get_file_size (argv[i]) < 1)
2657         {
2658           status = 1;
2659           continue;
2660         }
2661
2662       if (preserve_dates)
2663         /* No need to check the return value of stat().
2664            It has already been checked in get_file_size().  */
2665         stat (argv[i], &statbuf);
2666
2667       if (output_file != NULL)
2668         tmpname = output_file;
2669       else
2670         tmpname = make_tempname (argv[i]);
2671
2672       status = 0;
2673       copy_file (argv[i], tmpname, input_target, output_target);
2674       if (status == 0)
2675         {
2676           if (preserve_dates)
2677             set_times (tmpname, &statbuf);
2678           if (output_file == NULL)
2679             smart_rename (tmpname, argv[i], preserve_dates);
2680           status = hold_status;
2681         }
2682       else
2683         unlink_if_ordinary (tmpname);
2684       if (output_file == NULL)
2685         free (tmpname);
2686     }
2687
2688   return status;
2689 }
2690
2691 static int
2692 copy_main (int argc, char *argv[])
2693 {
2694   char * binary_architecture = NULL;
2695   char *input_filename = NULL;
2696   char *output_filename = NULL;
2697   char *input_target = NULL;
2698   char *output_target = NULL;
2699   bfd_boolean show_version = FALSE;
2700   bfd_boolean change_warn = TRUE;
2701   bfd_boolean formats_info = FALSE;
2702   int c;
2703   struct section_list *p;
2704   struct stat statbuf;
2705
2706   while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
2707                            copy_options, (int *) 0)) != EOF)
2708     {
2709       switch (c)
2710         {
2711         case 'b':
2712           copy_byte = atoi (optarg);
2713           if (copy_byte < 0)
2714             fatal (_("byte number must be non-negative"));
2715           break;
2716
2717         case 'B':
2718           binary_architecture = optarg;
2719           break;
2720
2721         case 'i':
2722           interleave = atoi (optarg);
2723           if (interleave < 1)
2724             fatal (_("interleave must be positive"));
2725           break;
2726
2727         case 'I':
2728         case 's':               /* "source" - 'I' is preferred */
2729           input_target = optarg;
2730           break;
2731
2732         case 'O':
2733         case 'd':               /* "destination" - 'O' is preferred */
2734           output_target = optarg;
2735           break;
2736
2737         case 'F':
2738           input_target = output_target = optarg;
2739           break;
2740
2741         case 'j':
2742           p = find_section_list (optarg, TRUE);
2743           if (p->remove)
2744             fatal (_("%s both copied and removed"), optarg);
2745           p->copy = TRUE;
2746           sections_copied = TRUE;
2747           break;
2748
2749         case 'R':
2750           p = find_section_list (optarg, TRUE);
2751           if (p->copy)
2752             fatal (_("%s both copied and removed"), optarg);
2753           p->remove = TRUE;
2754           sections_removed = TRUE;
2755           break;
2756
2757         case 'S':
2758           strip_symbols = STRIP_ALL;
2759           break;
2760
2761         case 'g':
2762           strip_symbols = STRIP_DEBUG;
2763           break;
2764
2765         case OPTION_STRIP_UNNEEDED:
2766           strip_symbols = STRIP_UNNEEDED;
2767           break;
2768
2769         case OPTION_ONLY_KEEP_DEBUG:
2770           strip_symbols = STRIP_NONDEBUG;
2771           break;
2772
2773         case OPTION_KEEP_FILE_SYMBOLS:
2774           keep_file_symbols = 1;
2775           break;
2776
2777         case OPTION_ADD_GNU_DEBUGLINK:
2778           gnu_debuglink_filename = optarg;
2779           break;
2780
2781         case 'K':
2782           add_specific_symbol (optarg, &keep_specific_list);
2783           break;
2784
2785         case 'N':
2786           add_specific_symbol (optarg, &strip_specific_list);
2787           break;
2788
2789         case OPTION_STRIP_UNNEEDED_SYMBOL:
2790           add_specific_symbol (optarg, &strip_unneeded_list);
2791           break;
2792
2793         case 'L':
2794           add_specific_symbol (optarg, &localize_specific_list);
2795           break;
2796
2797         case OPTION_GLOBALIZE_SYMBOL:
2798           add_specific_symbol (optarg, &globalize_specific_list);
2799           break;
2800
2801         case 'G':
2802           add_specific_symbol (optarg, &keepglobal_specific_list);
2803           break;
2804
2805         case 'W':
2806           add_specific_symbol (optarg, &weaken_specific_list);
2807           break;
2808
2809         case 'p':
2810           preserve_dates = TRUE;
2811           break;
2812
2813         case 'w':
2814           wildcard = TRUE;
2815           break;
2816
2817         case 'x':
2818           discard_locals = LOCALS_ALL;
2819           break;
2820
2821         case 'X':
2822           discard_locals = LOCALS_START_L;
2823           break;
2824
2825         case 'v':
2826           verbose = TRUE;
2827           break;
2828
2829         case 'V':
2830           show_version = TRUE;
2831           break;
2832
2833         case OPTION_FORMATS_INFO:
2834           formats_info = TRUE;
2835           break;
2836
2837         case OPTION_WEAKEN:
2838           weaken = TRUE;
2839           break;
2840
2841         case OPTION_ADD_SECTION:
2842           {
2843             const char *s;
2844             off_t size;
2845             struct section_add *pa;
2846             int len;
2847             char *name;
2848             FILE *f;
2849
2850             s = strchr (optarg, '=');
2851
2852             if (s == NULL)
2853               fatal (_("bad format for %s"), "--add-section");
2854
2855             size = get_file_size (s + 1);
2856             if (size < 1)
2857               {
2858                 status = 1;
2859                 break;
2860               }
2861
2862             pa = xmalloc (sizeof (struct section_add));
2863
2864             len = s - optarg;
2865             name = xmalloc (len + 1);
2866             strncpy (name, optarg, len);
2867             name[len] = '\0';
2868             pa->name = name;
2869
2870             pa->filename = s + 1;
2871             pa->size = size;
2872             pa->contents = xmalloc (size);
2873
2874             f = fopen (pa->filename, FOPEN_RB);
2875
2876             if (f == NULL)
2877               fatal (_("cannot open: %s: %s"),
2878                      pa->filename, strerror (errno));
2879
2880             if (fread (pa->contents, 1, pa->size, f) == 0
2881                 || ferror (f))
2882               fatal (_("%s: fread failed"), pa->filename);
2883
2884             fclose (f);
2885
2886             pa->next = add_sections;
2887             add_sections = pa;
2888           }
2889           break;
2890
2891         case OPTION_CHANGE_START:
2892           change_start = parse_vma (optarg, "--change-start");
2893           break;
2894
2895         case OPTION_CHANGE_SECTION_ADDRESS:
2896         case OPTION_CHANGE_SECTION_LMA:
2897         case OPTION_CHANGE_SECTION_VMA:
2898           {
2899             const char *s;
2900             int len;
2901             char *name;
2902             char *option = NULL;
2903             bfd_vma val;
2904             enum change_action what = CHANGE_IGNORE;
2905
2906             switch (c)
2907               {
2908               case OPTION_CHANGE_SECTION_ADDRESS:
2909                 option = "--change-section-address";
2910                 break;
2911               case OPTION_CHANGE_SECTION_LMA:
2912                 option = "--change-section-lma";
2913                 break;
2914               case OPTION_CHANGE_SECTION_VMA:
2915                 option = "--change-section-vma";
2916                 break;
2917               }
2918
2919             s = strchr (optarg, '=');
2920             if (s == NULL)
2921               {
2922                 s = strchr (optarg, '+');
2923                 if (s == NULL)
2924                   {
2925                     s = strchr (optarg, '-');
2926                     if (s == NULL)
2927                       fatal (_("bad format for %s"), option);
2928                   }
2929               }
2930
2931             len = s - optarg;
2932             name = xmalloc (len + 1);
2933             strncpy (name, optarg, len);
2934             name[len] = '\0';
2935
2936             p = find_section_list (name, TRUE);
2937
2938             val = parse_vma (s + 1, option);
2939
2940             switch (*s)
2941               {
2942               case '=': what = CHANGE_SET; break;
2943               case '-': val  = - val; /* Drop through.  */
2944               case '+': what = CHANGE_MODIFY; break;
2945               }
2946
2947             switch (c)
2948               {
2949               case OPTION_CHANGE_SECTION_ADDRESS:
2950                 p->change_vma = what;
2951                 p->vma_val    = val;
2952                 /* Drop through.  */
2953
2954               case OPTION_CHANGE_SECTION_LMA:
2955                 p->change_lma = what;
2956                 p->lma_val    = val;
2957                 break;
2958
2959               case OPTION_CHANGE_SECTION_VMA:
2960                 p->change_vma = what;
2961                 p->vma_val    = val;
2962                 break;
2963               }
2964           }
2965           break;
2966
2967         case OPTION_CHANGE_ADDRESSES:
2968           change_section_address = parse_vma (optarg, "--change-addresses");
2969           change_start = change_section_address;
2970           break;
2971
2972         case OPTION_CHANGE_WARNINGS:
2973           change_warn = TRUE;
2974           break;
2975
2976         case OPTION_CHANGE_LEADING_CHAR:
2977           change_leading_char = TRUE;
2978           break;
2979
2980         case OPTION_DEBUGGING:
2981           convert_debugging = TRUE;
2982           break;
2983
2984         case OPTION_GAP_FILL:
2985           {
2986             bfd_vma gap_fill_vma;
2987
2988             gap_fill_vma = parse_vma (optarg, "--gap-fill");
2989             gap_fill = (bfd_byte) gap_fill_vma;
2990             if ((bfd_vma) gap_fill != gap_fill_vma)
2991               {
2992                 char buff[20];
2993
2994                 sprintf_vma (buff, gap_fill_vma);
2995
2996                 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
2997                            buff, gap_fill);
2998               }
2999             gap_fill_set = TRUE;
3000           }
3001           break;
3002
3003         case OPTION_NO_CHANGE_WARNINGS:
3004           change_warn = FALSE;
3005           break;
3006
3007         case OPTION_PAD_TO:
3008           pad_to = parse_vma (optarg, "--pad-to");
3009           pad_to_set = TRUE;
3010           break;
3011
3012         case OPTION_REMOVE_LEADING_CHAR:
3013           remove_leading_char = TRUE;
3014           break;
3015
3016         case OPTION_REDEFINE_SYM:
3017           {
3018             /* Push this redefinition onto redefine_symbol_list.  */
3019
3020             int len;
3021             const char *s;
3022             const char *nextarg;
3023             char *source, *target;
3024
3025             s = strchr (optarg, '=');
3026             if (s == NULL)
3027               fatal (_("bad format for %s"), "--redefine-sym");
3028
3029             len = s - optarg;
3030             source = xmalloc (len + 1);
3031             strncpy (source, optarg, len);
3032             source[len] = '\0';
3033
3034             nextarg = s + 1;
3035             len = strlen (nextarg);
3036             target = xmalloc (len + 1);
3037             strcpy (target, nextarg);
3038
3039             redefine_list_append ("--redefine-sym", source, target);
3040
3041             free (source);
3042             free (target);
3043           }
3044           break;
3045
3046         case OPTION_REDEFINE_SYMS:
3047           add_redefine_syms_file (optarg);
3048           break;
3049
3050         case OPTION_SET_SECTION_FLAGS:
3051           {
3052             const char *s;
3053             int len;
3054             char *name;
3055
3056             s = strchr (optarg, '=');
3057             if (s == NULL)
3058               fatal (_("bad format for %s"), "--set-section-flags");
3059
3060             len = s - optarg;
3061             name = xmalloc (len + 1);
3062             strncpy (name, optarg, len);
3063             name[len] = '\0';
3064
3065             p = find_section_list (name, TRUE);
3066
3067             p->set_flags = TRUE;
3068             p->flags = parse_flags (s + 1);
3069           }
3070           break;
3071
3072         case OPTION_RENAME_SECTION:
3073           {
3074             flagword flags;
3075             const char *eq, *fl;
3076             char *old_name;
3077             char *new_name;
3078             unsigned int len;
3079
3080             eq = strchr (optarg, '=');
3081             if (eq == NULL)
3082               fatal (_("bad format for %s"), "--rename-section");
3083
3084             len = eq - optarg;
3085             if (len == 0)
3086               fatal (_("bad format for %s"), "--rename-section");
3087
3088             old_name = xmalloc (len + 1);
3089             strncpy (old_name, optarg, len);
3090             old_name[len] = 0;
3091
3092             eq++;
3093             fl = strchr (eq, ',');
3094             if (fl)
3095               {
3096                 flags = parse_flags (fl + 1);
3097                 len = fl - eq;
3098               }
3099             else
3100               {
3101                 flags = -1;
3102                 len = strlen (eq);
3103               }
3104
3105             if (len == 0)
3106               fatal (_("bad format for %s"), "--rename-section");
3107
3108             new_name = xmalloc (len + 1);
3109             strncpy (new_name, eq, len);
3110             new_name[len] = 0;
3111
3112             add_section_rename (old_name, new_name, flags);
3113           }
3114           break;
3115
3116         case OPTION_SET_START:
3117           set_start = parse_vma (optarg, "--set-start");
3118           set_start_set = TRUE;
3119           break;
3120
3121         case OPTION_SREC_LEN:
3122           Chunk = parse_vma (optarg, "--srec-len");
3123           break;
3124
3125         case OPTION_SREC_FORCES3:
3126           S3Forced = TRUE;
3127           break;
3128
3129         case OPTION_STRIP_SYMBOLS:
3130           add_specific_symbols (optarg, &strip_specific_list);
3131           break;
3132
3133         case OPTION_STRIP_UNNEEDED_SYMBOLS:
3134           add_specific_symbols (optarg, &strip_unneeded_list);
3135           break;
3136
3137         case OPTION_KEEP_SYMBOLS:
3138           add_specific_symbols (optarg, &keep_specific_list);
3139           break;
3140
3141         case OPTION_LOCALIZE_HIDDEN:
3142           localize_hidden = TRUE;
3143           break;
3144
3145         case OPTION_LOCALIZE_SYMBOLS:
3146           add_specific_symbols (optarg, &localize_specific_list);
3147           break;
3148
3149         case OPTION_GLOBALIZE_SYMBOLS:
3150           add_specific_symbols (optarg, &globalize_specific_list);
3151           break;
3152
3153         case OPTION_KEEPGLOBAL_SYMBOLS:
3154           add_specific_symbols (optarg, &keepglobal_specific_list);
3155           break;
3156
3157         case OPTION_WEAKEN_SYMBOLS:
3158           add_specific_symbols (optarg, &weaken_specific_list);
3159           break;
3160
3161         case OPTION_ALT_MACH_CODE:
3162           use_alt_mach_code = strtoul (optarg, NULL, 0);
3163           if (use_alt_mach_code == 0)
3164             fatal (_("unable to parse alternative machine code"));
3165           break;
3166
3167         case OPTION_PREFIX_SYMBOLS:
3168           prefix_symbols_string = optarg;
3169           break;
3170
3171         case OPTION_PREFIX_SECTIONS:
3172           prefix_sections_string = optarg;
3173           break;
3174
3175         case OPTION_PREFIX_ALLOC_SECTIONS:
3176           prefix_alloc_sections_string = optarg;
3177           break;
3178
3179         case OPTION_READONLY_TEXT:
3180           bfd_flags_to_set |= WP_TEXT;
3181           bfd_flags_to_clear &= ~WP_TEXT;
3182           break;
3183
3184         case OPTION_WRITABLE_TEXT:
3185           bfd_flags_to_clear |= WP_TEXT;
3186           bfd_flags_to_set &= ~WP_TEXT;
3187           break;
3188
3189         case OPTION_PURE:
3190           bfd_flags_to_set |= D_PAGED;
3191           bfd_flags_to_clear &= ~D_PAGED;
3192           break;
3193
3194         case OPTION_IMPURE:
3195           bfd_flags_to_clear |= D_PAGED;
3196           bfd_flags_to_set &= ~D_PAGED;
3197           break;
3198
3199         case 0:
3200           /* We've been given a long option.  */
3201           break;
3202
3203         case 'H':
3204         case 'h':
3205           copy_usage (stdout, 0);
3206
3207         default:
3208           copy_usage (stderr, 1);
3209         }
3210     }
3211
3212   if (formats_info)
3213     {
3214       display_info ();
3215       return 0;
3216     }
3217  
3218   if (show_version)
3219     print_version ("objcopy");
3220
3221   if (copy_byte >= interleave)
3222     fatal (_("byte number must be less than interleave"));
3223
3224   if (optind == argc || optind + 2 < argc)
3225     copy_usage (stderr, 1);
3226
3227   input_filename = argv[optind];
3228   if (optind + 1 < argc)
3229     output_filename = argv[optind + 1];
3230
3231   /* Default is to strip no symbols.  */
3232   if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
3233     strip_symbols = STRIP_NONE;
3234
3235   if (output_target == NULL)
3236     output_target = input_target;
3237
3238   if (binary_architecture != NULL)
3239     {
3240       if (input_target && strcmp (input_target, "binary") == 0)
3241         {
3242           const bfd_arch_info_type * temp_arch_info;
3243
3244           temp_arch_info = bfd_scan_arch (binary_architecture);
3245
3246           if (temp_arch_info != NULL)
3247             {
3248               bfd_external_binary_architecture = temp_arch_info->arch;
3249               bfd_external_machine             = temp_arch_info->mach;
3250             }
3251           else
3252             fatal (_("architecture %s unknown"), binary_architecture);
3253         }
3254       else
3255         {
3256           non_fatal (_("Warning: input target 'binary' required for binary architecture parameter."));
3257           non_fatal (_(" Argument %s ignored"), binary_architecture);
3258         }
3259     }
3260
3261   if (preserve_dates)
3262     if (stat (input_filename, & statbuf) < 0)
3263       fatal (_("warning: could not locate '%s'.  System error message: %s"),
3264              input_filename, strerror (errno));
3265
3266   /* If there is no destination file, or the source and destination files
3267      are the same, then create a temp and rename the result into the input.  */
3268   if (output_filename == NULL || strcmp (input_filename, output_filename) == 0)
3269     {
3270       char *tmpname = make_tempname (input_filename);
3271
3272       copy_file (input_filename, tmpname, input_target, output_target);
3273       if (status == 0)
3274         {
3275           if (preserve_dates)
3276             set_times (tmpname, &statbuf);
3277           smart_rename (tmpname, input_filename, preserve_dates);
3278         }
3279       else
3280         unlink (tmpname);
3281     }
3282   else
3283     {
3284       copy_file (input_filename, output_filename, input_target, output_target);
3285
3286       if (status == 0 && preserve_dates)
3287         set_times (output_filename, &statbuf);
3288       else if (status != 0)
3289         unlink_if_ordinary (output_filename);
3290     }
3291
3292   if (change_warn)
3293     {
3294       for (p = change_sections; p != NULL; p = p->next)
3295         {
3296           if (! p->used)
3297             {
3298               if (p->change_vma != CHANGE_IGNORE)
3299                 {
3300                   char buff [20];
3301
3302                   sprintf_vma (buff, p->vma_val);
3303
3304                   /* xgettext:c-format */
3305                   non_fatal (_("%s %s%c0x%s never used"),
3306                              "--change-section-vma",
3307                              p->name,
3308                              p->change_vma == CHANGE_SET ? '=' : '+',
3309                              buff);
3310                 }
3311
3312               if (p->change_lma != CHANGE_IGNORE)
3313                 {
3314                   char buff [20];
3315
3316                   sprintf_vma (buff, p->lma_val);
3317
3318                   /* xgettext:c-format */
3319                   non_fatal (_("%s %s%c0x%s never used"),
3320                              "--change-section-lma",
3321                              p->name,
3322                              p->change_lma == CHANGE_SET ? '=' : '+',
3323                              buff);
3324                 }
3325             }
3326         }
3327     }
3328
3329   return 0;
3330 }
3331
3332 int
3333 main (int argc, char *argv[])
3334 {
3335 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
3336   setlocale (LC_MESSAGES, "");
3337 #endif
3338 #if defined (HAVE_SETLOCALE)
3339   setlocale (LC_CTYPE, "");
3340 #endif
3341   bindtextdomain (PACKAGE, LOCALEDIR);
3342   textdomain (PACKAGE);
3343
3344   program_name = argv[0];
3345   xmalloc_set_program_name (program_name);
3346
3347   START_PROGRESS (program_name, 0);
3348
3349   expandargv (&argc, &argv);
3350
3351   strip_symbols = STRIP_UNDEF;
3352   discard_locals = LOCALS_UNDEF;
3353
3354   bfd_init ();
3355   set_default_bfd_target ();
3356
3357   if (is_strip < 0)
3358     {
3359       int i = strlen (program_name);
3360 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3361       /* Drop the .exe suffix, if any.  */
3362       if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
3363         {
3364           i -= 4;
3365           program_name[i] = '\0';
3366         }
3367 #endif
3368       is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
3369     }
3370
3371   if (is_strip)
3372     strip_main (argc, argv);
3373   else
3374     copy_main (argc, argv);
3375
3376   END_PROGRESS (program_name);
3377
3378   return status;
3379 }