OSDN Git Service

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