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