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