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