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