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