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