1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright (C) 1991-2019 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
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.
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.
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
25 #include "libiberty.h"
28 #include "filenames.h"
31 #include "coff/internal.h"
33 #include "safe-ctype.h"
35 /* FIXME: See bfd/peXXigen.c for why we include an architecture specific
36 header in generic PE code. */
37 #include "coff/i386.h"
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;
51 struct is_specified_symbol_predicate_data
57 /* A node includes symbol name mapping to support redefine_sym. */
66 struct addsym_node
*next
;
74 typedef struct section_rename
76 const char * old_name
;
77 const char * new_name
;
79 struct section_rename
* next
;
83 /* List of sections to be renamed. */
84 static section_rename
*section_rename_list
;
86 static asymbol
**isympp
= NULL
; /* Input symbols. */
87 static asymbol
**osympp
= NULL
; /* Output symbols that survive stripping. */
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;
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. */
99 static bfd_boolean merge_notes
= FALSE
; /* Merge note sections. */
100 static bfd_byte
* merged_notes
= NULL
; /* Contents on note section undergoing a merge. */
101 static bfd_size_type merged_size
= 0; /* New, smaller size of the merged note section. */
106 STRIP_NONE
, /* Don't strip. */
107 STRIP_DEBUG
, /* Strip all debugger symbols. */
108 STRIP_UNNEEDED
, /* Strip unnecessary symbols. */
109 STRIP_NONDEBUG
, /* Strip everything but debug info. */
110 STRIP_DWO
, /* Strip all DWO info. */
111 STRIP_NONDWO
, /* Strip everything but DWO info. */
112 STRIP_ALL
/* Strip all symbols. */
115 /* Which symbols to remove. */
116 static enum strip_action strip_symbols
= STRIP_UNDEF
;
121 LOCALS_START_L
, /* Discard locals starting with L. */
122 LOCALS_ALL
/* Discard all locals. */
125 /* Which local symbols to remove. Overrides STRIP_ALL. */
126 static enum locals_action discard_locals
;
128 /* Structure used to hold lists of sections and actions to take. */
131 struct section_list
* next
; /* Next section to change. */
132 const char * pattern
; /* Section name pattern. */
133 bfd_boolean used
; /* Whether this entry was used. */
135 unsigned int context
; /* What to do with matching sections. */
136 /* Flag bits used in the context field.
137 COPY and REMOVE are mutually exlusive. SET and ALTER are mutually exclusive. */
138 #define SECTION_CONTEXT_REMOVE (1 << 0) /* Remove this section. */
139 #define SECTION_CONTEXT_COPY (1 << 1) /* Copy this section, delete all non-copied section. */
140 #define SECTION_CONTEXT_SET_VMA (1 << 2) /* Set the sections' VMA address. */
141 #define SECTION_CONTEXT_ALTER_VMA (1 << 3) /* Increment or decrement the section's VMA address. */
142 #define SECTION_CONTEXT_SET_LMA (1 << 4) /* Set the sections' LMA address. */
143 #define SECTION_CONTEXT_ALTER_LMA (1 << 5) /* Increment or decrement the section's LMA address. */
144 #define SECTION_CONTEXT_SET_FLAGS (1 << 6) /* Set the section's flags. */
145 #define SECTION_CONTEXT_REMOVE_RELOCS (1 << 7) /* Remove relocations for this section. */
147 bfd_vma vma_val
; /* Amount to change by or set to. */
148 bfd_vma lma_val
; /* Amount to change by or set to. */
149 flagword flags
; /* What to set the section flags to. */
152 static struct section_list
*change_sections
;
154 /* TRUE if some sections are to be removed. */
155 static bfd_boolean sections_removed
;
157 /* TRUE if only some sections are to be copied. */
158 static bfd_boolean sections_copied
;
160 /* Changes to the start address. */
161 static bfd_vma change_start
= 0;
162 static bfd_boolean set_start_set
= FALSE
;
163 static bfd_vma set_start
;
165 /* Changes to section addresses. */
166 static bfd_vma change_section_address
= 0;
168 /* Filling gaps between sections. */
169 static bfd_boolean gap_fill_set
= FALSE
;
170 static bfd_byte gap_fill
= 0;
172 /* Pad to a given address. */
173 static bfd_boolean pad_to_set
= FALSE
;
174 static bfd_vma pad_to
;
176 /* Use alternative machine code? */
177 static unsigned long use_alt_mach_code
= 0;
179 /* Output BFD flags user wants to set or clear */
180 static flagword bfd_flags_to_set
;
181 static flagword bfd_flags_to_clear
;
183 /* List of sections to add. */
186 /* Next section to add. */
187 struct section_add
*next
;
188 /* Name of section to add. */
190 /* Name of file holding section contents. */
191 const char *filename
;
194 /* Contents of file. */
196 /* BFD section, after it has been added. */
200 /* List of sections to add to the output BFD. */
201 static struct section_add
*add_sections
;
203 /* List of sections to update in the output BFD. */
204 static struct section_add
*update_sections
;
206 /* List of sections to dump from the output BFD. */
207 static struct section_add
*dump_sections
;
209 /* If non-NULL the argument to --add-gnu-debuglink.
210 This should be the filename to store in the .gnu_debuglink section. */
211 static const char * gnu_debuglink_filename
= NULL
;
213 /* Whether to convert debugging information. */
214 static bfd_boolean convert_debugging
= FALSE
;
216 /* Whether to compress/decompress DWARF debug sections. */
221 compress_zlib
= compress
| 1 << 1,
222 compress_gnu_zlib
= compress
| 1 << 2,
223 compress_gabi_zlib
= compress
| 1 << 3,
225 } do_debug_sections
= nothing
;
227 /* Whether to generate ELF common symbols with the STT_COMMON type. */
228 static enum bfd_link_elf_stt_common do_elf_stt_common
= unchanged
;
230 /* Whether to change the leading character in symbol names. */
231 static bfd_boolean change_leading_char
= FALSE
;
233 /* Whether to remove the leading character from global symbol names. */
234 static bfd_boolean remove_leading_char
= FALSE
;
236 /* Whether to permit wildcard in symbol comparison. */
237 static bfd_boolean wildcard
= FALSE
;
239 /* True if --localize-hidden is in effect. */
240 static bfd_boolean localize_hidden
= FALSE
;
242 /* List of symbols to strip, keep, localize, keep-global, weaken,
244 static htab_t strip_specific_htab
= NULL
;
245 static htab_t strip_unneeded_htab
= NULL
;
246 static htab_t keep_specific_htab
= NULL
;
247 static htab_t localize_specific_htab
= NULL
;
248 static htab_t globalize_specific_htab
= NULL
;
249 static htab_t keepglobal_specific_htab
= NULL
;
250 static htab_t weaken_specific_htab
= NULL
;
251 static htab_t redefine_specific_htab
= NULL
;
252 static htab_t redefine_specific_reverse_htab
= NULL
;
253 static struct addsym_node
*add_sym_list
= NULL
, **add_sym_tail
= &add_sym_list
;
254 static int add_symbols
= 0;
256 static char *strip_specific_buffer
= NULL
;
257 static char *strip_unneeded_buffer
= NULL
;
258 static char *keep_specific_buffer
= NULL
;
259 static char *localize_specific_buffer
= NULL
;
260 static char *globalize_specific_buffer
= NULL
;
261 static char *keepglobal_specific_buffer
= NULL
;
262 static char *weaken_specific_buffer
= NULL
;
264 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
265 static bfd_boolean weaken
= FALSE
;
267 /* If this is TRUE, we retain BSF_FILE symbols. */
268 static bfd_boolean keep_file_symbols
= FALSE
;
270 /* Prefix symbols/sections. */
271 static char *prefix_symbols_string
= 0;
272 static char *prefix_sections_string
= 0;
273 static char *prefix_alloc_sections_string
= 0;
275 /* True if --extract-symbol was passed on the command line. */
276 static bfd_boolean extract_symbol
= FALSE
;
278 /* If `reverse_bytes' is nonzero, then reverse the order of every chunk
279 of <reverse_bytes> bytes within each output section. */
280 static int reverse_bytes
= 0;
282 /* For Coff objects, we may want to allow or disallow long section names,
283 or preserve them where found in the inputs. Debug info relies on them. */
284 enum long_section_name_handling
291 /* The default long section handling mode is to preserve them.
292 This is also the only behaviour for 'strip'. */
293 static enum long_section_name_handling long_section_names
= KEEP
;
295 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
296 enum command_line_switch
298 OPTION_ADD_SECTION
=150,
299 OPTION_ADD_GNU_DEBUGLINK
,
301 OPTION_ALT_MACH_CODE
,
302 OPTION_CHANGE_ADDRESSES
,
303 OPTION_CHANGE_LEADING_CHAR
,
304 OPTION_CHANGE_SECTION_ADDRESS
,
305 OPTION_CHANGE_SECTION_LMA
,
306 OPTION_CHANGE_SECTION_VMA
,
308 OPTION_CHANGE_WARNINGS
,
309 OPTION_COMPRESS_DEBUG_SECTIONS
,
311 OPTION_DECOMPRESS_DEBUG_SECTIONS
,
313 OPTION_ELF_STT_COMMON
,
315 OPTION_EXTRACT_SYMBOL
,
316 OPTION_FILE_ALIGNMENT
,
319 OPTION_GLOBALIZE_SYMBOL
,
320 OPTION_GLOBALIZE_SYMBOLS
,
324 OPTION_INTERLEAVE_WIDTH
,
325 OPTION_KEEPGLOBAL_SYMBOLS
,
326 OPTION_KEEP_FILE_SYMBOLS
,
328 OPTION_LOCALIZE_HIDDEN
,
329 OPTION_LOCALIZE_SYMBOLS
,
330 OPTION_LONG_SECTION_NAMES
,
332 OPTION_NO_MERGE_NOTES
,
333 OPTION_NO_CHANGE_WARNINGS
,
334 OPTION_ONLY_KEEP_DEBUG
,
336 OPTION_PREFIX_ALLOC_SECTIONS
,
337 OPTION_PREFIX_SECTIONS
,
338 OPTION_PREFIX_SYMBOLS
,
340 OPTION_READONLY_TEXT
,
342 OPTION_REDEFINE_SYMS
,
343 OPTION_REMOVE_LEADING_CHAR
,
344 OPTION_REMOVE_RELOCS
,
345 OPTION_RENAME_SECTION
,
346 OPTION_REVERSE_BYTES
,
347 OPTION_SECTION_ALIGNMENT
,
348 OPTION_SET_SECTION_FLAGS
,
354 OPTION_STRIP_SYMBOLS
,
355 OPTION_STRIP_UNNEEDED
,
356 OPTION_STRIP_UNNEEDED_SYMBOL
,
357 OPTION_STRIP_UNNEEDED_SYMBOLS
,
359 OPTION_UPDATE_SECTION
,
360 OPTION_VERILOG_DATA_WIDTH
,
362 OPTION_WEAKEN_SYMBOLS
,
366 /* Options to handle if running as "strip". */
368 static struct option strip_options
[] =
370 {"disable-deterministic-archives", no_argument
, 0, 'U'},
371 {"discard-all", no_argument
, 0, 'x'},
372 {"discard-locals", no_argument
, 0, 'X'},
373 {"enable-deterministic-archives", no_argument
, 0, 'D'},
374 {"format", required_argument
, 0, 'F'}, /* Obsolete */
375 {"help", no_argument
, 0, 'h'},
376 {"info", no_argument
, 0, OPTION_FORMATS_INFO
},
377 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
378 {"input-target", required_argument
, 0, 'I'},
379 {"keep-file-symbols", no_argument
, 0, OPTION_KEEP_FILE_SYMBOLS
},
380 {"keep-symbol", required_argument
, 0, 'K'},
381 {"merge-notes", no_argument
, 0, 'M'},
382 {"no-merge-notes", no_argument
, 0, OPTION_NO_MERGE_NOTES
},
383 {"only-keep-debug", no_argument
, 0, OPTION_ONLY_KEEP_DEBUG
},
384 {"output-file", required_argument
, 0, 'o'},
385 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
386 {"output-target", required_argument
, 0, 'O'},
387 {"preserve-dates", no_argument
, 0, 'p'},
388 {"remove-section", required_argument
, 0, 'R'},
389 {"remove-relocations", required_argument
, 0, OPTION_REMOVE_RELOCS
},
390 {"strip-all", no_argument
, 0, 's'},
391 {"strip-debug", no_argument
, 0, 'S'},
392 {"strip-dwo", no_argument
, 0, OPTION_STRIP_DWO
},
393 {"strip-symbol", required_argument
, 0, 'N'},
394 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
395 {"target", required_argument
, 0, 'F'},
396 {"verbose", no_argument
, 0, 'v'},
397 {"version", no_argument
, 0, 'V'},
398 {"wildcard", no_argument
, 0, 'w'},
399 {0, no_argument
, 0, 0}
402 /* Options to handle if running as "objcopy". */
404 static struct option copy_options
[] =
406 {"add-gnu-debuglink", required_argument
, 0, OPTION_ADD_GNU_DEBUGLINK
},
407 {"add-section", required_argument
, 0, OPTION_ADD_SECTION
},
408 {"add-symbol", required_argument
, 0, OPTION_ADD_SYMBOL
},
409 {"adjust-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
410 {"adjust-start", required_argument
, 0, OPTION_CHANGE_START
},
411 {"adjust-vma", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
412 {"adjust-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
413 {"alt-machine-code", required_argument
, 0, OPTION_ALT_MACH_CODE
},
414 {"binary-architecture", required_argument
, 0, 'B'},
415 {"byte", required_argument
, 0, 'b'},
416 {"change-addresses", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
417 {"change-leading-char", no_argument
, 0, OPTION_CHANGE_LEADING_CHAR
},
418 {"change-section-address", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
419 {"change-section-lma", required_argument
, 0, OPTION_CHANGE_SECTION_LMA
},
420 {"change-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_VMA
},
421 {"change-start", required_argument
, 0, OPTION_CHANGE_START
},
422 {"change-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
423 {"compress-debug-sections", optional_argument
, 0, OPTION_COMPRESS_DEBUG_SECTIONS
},
424 {"debugging", no_argument
, 0, OPTION_DEBUGGING
},
425 {"decompress-debug-sections", no_argument
, 0, OPTION_DECOMPRESS_DEBUG_SECTIONS
},
426 {"disable-deterministic-archives", no_argument
, 0, 'U'},
427 {"discard-all", no_argument
, 0, 'x'},
428 {"discard-locals", no_argument
, 0, 'X'},
429 {"dump-section", required_argument
, 0, OPTION_DUMP_SECTION
},
430 {"elf-stt-common", required_argument
, 0, OPTION_ELF_STT_COMMON
},
431 {"enable-deterministic-archives", no_argument
, 0, 'D'},
432 {"extract-dwo", no_argument
, 0, OPTION_EXTRACT_DWO
},
433 {"extract-symbol", no_argument
, 0, OPTION_EXTRACT_SYMBOL
},
434 {"file-alignment", required_argument
, 0, OPTION_FILE_ALIGNMENT
},
435 {"format", required_argument
, 0, 'F'}, /* Obsolete */
436 {"gap-fill", required_argument
, 0, OPTION_GAP_FILL
},
437 {"globalize-symbol", required_argument
, 0, OPTION_GLOBALIZE_SYMBOL
},
438 {"globalize-symbols", required_argument
, 0, OPTION_GLOBALIZE_SYMBOLS
},
439 {"heap", required_argument
, 0, OPTION_HEAP
},
440 {"help", no_argument
, 0, 'h'},
441 {"image-base", required_argument
, 0 , OPTION_IMAGE_BASE
},
442 {"impure", no_argument
, 0, OPTION_IMPURE
},
443 {"info", no_argument
, 0, OPTION_FORMATS_INFO
},
444 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
445 {"input-target", required_argument
, 0, 'I'},
446 {"interleave", optional_argument
, 0, 'i'},
447 {"interleave-width", required_argument
, 0, OPTION_INTERLEAVE_WIDTH
},
448 {"keep-file-symbols", no_argument
, 0, OPTION_KEEP_FILE_SYMBOLS
},
449 {"keep-global-symbol", required_argument
, 0, 'G'},
450 {"keep-global-symbols", required_argument
, 0, OPTION_KEEPGLOBAL_SYMBOLS
},
451 {"keep-symbol", required_argument
, 0, 'K'},
452 {"keep-symbols", required_argument
, 0, OPTION_KEEP_SYMBOLS
},
453 {"localize-hidden", no_argument
, 0, OPTION_LOCALIZE_HIDDEN
},
454 {"localize-symbol", required_argument
, 0, 'L'},
455 {"localize-symbols", required_argument
, 0, OPTION_LOCALIZE_SYMBOLS
},
456 {"long-section-names", required_argument
, 0, OPTION_LONG_SECTION_NAMES
},
457 {"merge-notes", no_argument
, 0, 'M'},
458 {"no-merge-notes", no_argument
, 0, OPTION_NO_MERGE_NOTES
},
459 {"no-adjust-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
460 {"no-change-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
461 {"only-keep-debug", no_argument
, 0, OPTION_ONLY_KEEP_DEBUG
},
462 {"only-section", required_argument
, 0, 'j'},
463 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
464 {"output-target", required_argument
, 0, 'O'},
465 {"pad-to", required_argument
, 0, OPTION_PAD_TO
},
466 {"prefix-alloc-sections", required_argument
, 0, OPTION_PREFIX_ALLOC_SECTIONS
},
467 {"prefix-sections", required_argument
, 0, OPTION_PREFIX_SECTIONS
},
468 {"prefix-symbols", required_argument
, 0, OPTION_PREFIX_SYMBOLS
},
469 {"preserve-dates", no_argument
, 0, 'p'},
470 {"pure", no_argument
, 0, OPTION_PURE
},
471 {"readonly-text", no_argument
, 0, OPTION_READONLY_TEXT
},
472 {"redefine-sym", required_argument
, 0, OPTION_REDEFINE_SYM
},
473 {"redefine-syms", required_argument
, 0, OPTION_REDEFINE_SYMS
},
474 {"remove-leading-char", no_argument
, 0, OPTION_REMOVE_LEADING_CHAR
},
475 {"remove-section", required_argument
, 0, 'R'},
476 {"remove-relocations", required_argument
, 0, OPTION_REMOVE_RELOCS
},
477 {"rename-section", required_argument
, 0, OPTION_RENAME_SECTION
},
478 {"reverse-bytes", required_argument
, 0, OPTION_REVERSE_BYTES
},
479 {"section-alignment", required_argument
, 0, OPTION_SECTION_ALIGNMENT
},
480 {"set-section-flags", required_argument
, 0, OPTION_SET_SECTION_FLAGS
},
481 {"set-start", required_argument
, 0, OPTION_SET_START
},
482 {"srec-forceS3", no_argument
, 0, OPTION_SREC_FORCES3
},
483 {"srec-len", required_argument
, 0, OPTION_SREC_LEN
},
484 {"stack", required_argument
, 0, OPTION_STACK
},
485 {"strip-all", no_argument
, 0, 'S'},
486 {"strip-debug", no_argument
, 0, 'g'},
487 {"strip-dwo", no_argument
, 0, OPTION_STRIP_DWO
},
488 {"strip-symbol", required_argument
, 0, 'N'},
489 {"strip-symbols", required_argument
, 0, OPTION_STRIP_SYMBOLS
},
490 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
491 {"strip-unneeded-symbol", required_argument
, 0, OPTION_STRIP_UNNEEDED_SYMBOL
},
492 {"strip-unneeded-symbols", required_argument
, 0, OPTION_STRIP_UNNEEDED_SYMBOLS
},
493 {"subsystem", required_argument
, 0, OPTION_SUBSYSTEM
},
494 {"target", required_argument
, 0, 'F'},
495 {"update-section", required_argument
, 0, OPTION_UPDATE_SECTION
},
496 {"verbose", no_argument
, 0, 'v'},
497 {"verilog-data-width", required_argument
, 0, OPTION_VERILOG_DATA_WIDTH
},
498 {"version", no_argument
, 0, 'V'},
499 {"weaken", no_argument
, 0, OPTION_WEAKEN
},
500 {"weaken-symbol", required_argument
, 0, 'W'},
501 {"weaken-symbols", required_argument
, 0, OPTION_WEAKEN_SYMBOLS
},
502 {"wildcard", no_argument
, 0, 'w'},
503 {"writable-text", no_argument
, 0, OPTION_WRITABLE_TEXT
},
504 {0, no_argument
, 0, 0}
508 extern char *program_name
;
510 /* This flag distinguishes between strip and objcopy:
511 1 means this is 'strip'; 0 means this is 'objcopy'.
512 -1 means if we should use argv[0] to decide. */
515 /* The maximum length of an S record. This variable is defined in srec.c
516 and can be modified by the --srec-len parameter. */
517 extern unsigned int _bfd_srec_len
;
519 /* Restrict the generation of Srecords to type S3 only.
520 This variable is defined in bfd/srec.c and can be toggled
521 on by the --srec-forceS3 command line switch. */
522 extern bfd_boolean _bfd_srec_forceS3
;
524 /* Width of data in bytes for verilog output.
525 This variable is declared in bfd/verilog.c and can be modified by
526 the --verilog-data-width parameter. */
527 extern unsigned int VerilogDataWidth
;
529 /* Forward declarations. */
530 static void setup_section (bfd
*, asection
*, void *);
531 static void setup_bfd_headers (bfd
*, bfd
*);
532 static void copy_relocations_in_section (bfd
*, asection
*, void *);
533 static void copy_section (bfd
*, asection
*, void *);
534 static void get_sections (bfd
*, asection
*, void *);
535 static int compare_section_lma (const void *, const void *);
536 static void mark_symbols_used_in_relocations (bfd
*, asection
*, void *);
537 static bfd_boolean
write_debugging_info (bfd
*, void *, long *, asymbol
***);
538 static const char *lookup_sym_redefinition (const char *);
539 static const char *find_section_rename (const char *, flagword
*);
541 ATTRIBUTE_NORETURN
static void
542 copy_usage (FILE *stream
, int exit_status
)
544 fprintf (stream
, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name
);
545 fprintf (stream
, _(" Copies a binary file, possibly transforming it in the process\n"));
546 fprintf (stream
, _(" The options are:\n"));
547 fprintf (stream
, _("\
548 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
549 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
550 -B --binary-architecture <arch> Set output arch, when input is arch-less\n\
551 -F --target <bfdname> Set both input and output format to <bfdname>\n\
552 --debugging Convert debugging information, if possible\n\
553 -p --preserve-dates Copy modified/access timestamps to the output\n"));
554 if (DEFAULT_AR_DETERMINISTIC
)
555 fprintf (stream
, _("\
556 -D --enable-deterministic-archives\n\
557 Produce deterministic output when stripping archives (default)\n\
558 -U --disable-deterministic-archives\n\
559 Disable -D behavior\n"));
561 fprintf (stream
, _("\
562 -D --enable-deterministic-archives\n\
563 Produce deterministic output when stripping archives\n\
564 -U --disable-deterministic-archives\n\
565 Disable -D behavior (default)\n"));
566 fprintf (stream
, _("\
567 -j --only-section <name> Only copy section <name> into the output\n\
568 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
569 -R --remove-section <name> Remove section <name> from the output\n\
570 --remove-relocations <name> Remove relocations from section <name>\n\
571 -S --strip-all Remove all symbol and relocation information\n\
572 -g --strip-debug Remove all debugging symbols & sections\n\
573 --strip-dwo Remove all DWO sections\n\
574 --strip-unneeded Remove all symbols not needed by relocations\n\
575 -N --strip-symbol <name> Do not copy symbol <name>\n\
576 --strip-unneeded-symbol <name>\n\
577 Do not copy symbol <name> unless needed by\n\
579 --only-keep-debug Strip everything but the debug information\n\
580 --extract-dwo Copy only DWO sections\n\
581 --extract-symbol Remove section contents but keep symbols\n\
582 -K --keep-symbol <name> Do not strip symbol <name>\n\
583 --keep-file-symbols Do not strip file symbol(s)\n\
584 --localize-hidden Turn all ELF hidden symbols into locals\n\
585 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
586 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
587 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
588 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
589 --weaken Force all global symbols to be marked as weak\n\
590 -w --wildcard Permit wildcard in symbol comparison\n\
591 -x --discard-all Remove all non-global symbols\n\
592 -X --discard-locals Remove any compiler-generated symbols\n\
593 -i --interleave[=<number>] Only copy N out of every <number> bytes\n\
594 --interleave-width <number> Set N for --interleave\n\
595 -b --byte <num> Select byte <num> in every interleaved block\n\
596 --gap-fill <val> Fill gaps between sections with <val>\n\
597 --pad-to <addr> Pad the last section up to address <addr>\n\
598 --set-start <addr> Set the start address to <addr>\n\
599 {--change-start|--adjust-start} <incr>\n\
600 Add <incr> to the start address\n\
601 {--change-addresses|--adjust-vma} <incr>\n\
602 Add <incr> to LMA, VMA and start addresses\n\
603 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
604 Change LMA and VMA of section <name> by <val>\n\
605 --change-section-lma <name>{=|+|-}<val>\n\
606 Change the LMA of section <name> by <val>\n\
607 --change-section-vma <name>{=|+|-}<val>\n\
608 Change the VMA of section <name> by <val>\n\
609 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
610 Warn if a named section does not exist\n\
611 --set-section-flags <name>=<flags>\n\
612 Set section <name>'s properties to <flags>\n\
613 --add-section <name>=<file> Add section <name> found in <file> to output\n\
614 --update-section <name>=<file>\n\
615 Update contents of section <name> with\n\
616 contents found in <file>\n\
617 --dump-section <name>=<file> Dump the contents of section <name> into <file>\n\
618 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
619 --long-section-names {enable|disable|keep}\n\
620 Handle long section names in Coff objects.\n\
621 --change-leading-char Force output format's leading character style\n\
622 --remove-leading-char Remove leading character from global symbols\n\
623 --reverse-bytes=<num> Reverse <num> bytes at a time, in output sections with content\n\
624 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
625 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
627 --srec-len <number> Restrict the length of generated Srecords\n\
628 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
629 --strip-symbols <file> -N for all symbols listed in <file>\n\
630 --strip-unneeded-symbols <file>\n\
631 --strip-unneeded-symbol for all symbols listed\n\
633 --keep-symbols <file> -K for all symbols listed in <file>\n\
634 --localize-symbols <file> -L for all symbols listed in <file>\n\
635 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
636 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
637 --weaken-symbols <file> -W for all symbols listed in <file>\n\
638 --add-symbol <name>=[<section>:]<value>[,<flags>] Add a symbol\n\
639 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
640 --writable-text Mark the output text as writable\n\
641 --readonly-text Make the output text write protected\n\
642 --pure Mark the output file as demand paged\n\
643 --impure Mark the output file as impure\n\
644 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
645 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
646 --prefix-alloc-sections <prefix>\n\
647 Add <prefix> to start of every allocatable\n\
649 --file-alignment <num> Set PE file alignment to <num>\n\
650 --heap <reserve>[,<commit>] Set PE reserve/commit heap to <reserve>/\n\
652 --image-base <address> Set PE image base to <address>\n\
653 --section-alignment <num> Set PE section alignment to <num>\n\
654 --stack <reserve>[,<commit>] Set PE reserve/commit stack to <reserve>/\n\
656 --subsystem <name>[:<version>]\n\
657 Set PE subsystem to <name> [& <version>]\n\
658 --compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi}]\n\
659 Compress DWARF debug sections using zlib\n\
660 --decompress-debug-sections Decompress DWARF debug sections using zlib\n\
661 --elf-stt-common=[yes|no] Generate ELF common symbols with STT_COMMON\n\
663 --verilog-data-width <number> Specifies data width, in bytes, for verilog output\n\
664 -M --merge-notes Remove redundant entries in note sections\n\
665 --no-merge-notes Do not attempt to remove redundant notes (default)\n\
666 -v --verbose List all object files modified\n\
667 @<file> Read options from <file>\n\
668 -V --version Display this program's version number\n\
669 -h --help Display this output\n\
670 --info List object formats & architectures supported\n\
672 list_supported_targets (program_name
, stream
);
673 if (REPORT_BUGS_TO
[0] && exit_status
== 0)
674 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
678 ATTRIBUTE_NORETURN
static void
679 strip_usage (FILE *stream
, int exit_status
)
681 fprintf (stream
, _("Usage: %s <option(s)> in-file(s)\n"), program_name
);
682 fprintf (stream
, _(" Removes symbols and sections from files\n"));
683 fprintf (stream
, _(" The options are:\n"));
684 fprintf (stream
, _("\
685 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
686 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
687 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
688 -p --preserve-dates Copy modified/access timestamps to the output\n\
690 if (DEFAULT_AR_DETERMINISTIC
)
691 fprintf (stream
, _("\
692 -D --enable-deterministic-archives\n\
693 Produce deterministic output when stripping archives (default)\n\
694 -U --disable-deterministic-archives\n\
695 Disable -D behavior\n"));
697 fprintf (stream
, _("\
698 -D --enable-deterministic-archives\n\
699 Produce deterministic output when stripping archives\n\
700 -U --disable-deterministic-archives\n\
701 Disable -D behavior (default)\n"));
702 fprintf (stream
, _("\
703 -R --remove-section=<name> Also remove section <name> from the output\n\
704 --remove-relocations <name> Remove relocations from section <name>\n\
705 -s --strip-all Remove all symbol and relocation information\n\
706 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
707 --strip-dwo Remove all DWO sections\n\
708 --strip-unneeded Remove all symbols not needed by relocations\n\
709 --only-keep-debug Strip everything but the debug information\n\
710 -M --merge-notes Remove redundant entries in note sections (default)\n\
711 --no-merge-notes Do not attempt to remove redundant notes\n\
712 -N --strip-symbol=<name> Do not copy symbol <name>\n\
713 -K --keep-symbol=<name> Do not strip symbol <name>\n\
714 --keep-file-symbols Do not strip file symbol(s)\n\
715 -w --wildcard Permit wildcard in symbol comparison\n\
716 -x --discard-all Remove all non-global symbols\n\
717 -X --discard-locals Remove any compiler-generated symbols\n\
718 -v --verbose List all object files modified\n\
719 -V --version Display this program's version number\n\
720 -h --help Display this output\n\
721 --info List object formats & architectures supported\n\
722 -o <file> Place stripped output into <file>\n\
725 list_supported_targets (program_name
, stream
);
726 if (REPORT_BUGS_TO
[0] && exit_status
== 0)
727 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
731 /* Parse section flags into a flagword, with a fatal error if the
732 string can't be parsed. */
735 parse_flags (const char *s
)
745 snext
= strchr (s
, ',');
755 #define PARSE_FLAG(fname,fval) \
756 else if (strncasecmp (fname, s, len) == 0) ret |= fval
757 PARSE_FLAG ("alloc", SEC_ALLOC
);
758 PARSE_FLAG ("load", SEC_LOAD
);
759 PARSE_FLAG ("noload", SEC_NEVER_LOAD
);
760 PARSE_FLAG ("readonly", SEC_READONLY
);
761 PARSE_FLAG ("debug", SEC_DEBUGGING
);
762 PARSE_FLAG ("code", SEC_CODE
);
763 PARSE_FLAG ("data", SEC_DATA
);
764 PARSE_FLAG ("rom", SEC_ROM
);
765 PARSE_FLAG ("share", SEC_COFF_SHARED
);
766 PARSE_FLAG ("contents", SEC_HAS_CONTENTS
);
767 PARSE_FLAG ("merge", SEC_MERGE
);
768 PARSE_FLAG ("strings", SEC_STRINGS
);
774 copy
= (char *) xmalloc (len
+ 1);
775 strncpy (copy
, s
, len
);
777 non_fatal (_("unrecognized section flag `%s'"), copy
);
778 fatal (_("supported flags: %s"),
779 "alloc, load, noload, readonly, debug, code, data, rom, share, contents, merge, strings");
789 /* Parse symbol flags into a flagword, with a fatal error if the
790 string can't be parsed. */
793 parse_symflags (const char *s
, char **other
)
803 snext
= strchr (s
, ',');
812 #define PARSE_FLAG(fname, fval) \
813 else if (len == sizeof fname - 1 \
814 && strncasecmp (fname, s, len) == 0) \
817 #define PARSE_OTHER(fname, fval) \
818 else if (len >= sizeof fname \
819 && strncasecmp (fname, s, sizeof fname - 1) == 0) \
820 fval = xstrndup (s + sizeof fname - 1, len - sizeof fname + 1)
823 PARSE_FLAG ("local", BSF_LOCAL
);
824 PARSE_FLAG ("global", BSF_GLOBAL
);
825 PARSE_FLAG ("export", BSF_EXPORT
);
826 PARSE_FLAG ("debug", BSF_DEBUGGING
);
827 PARSE_FLAG ("function", BSF_FUNCTION
);
828 PARSE_FLAG ("weak", BSF_WEAK
);
829 PARSE_FLAG ("section", BSF_SECTION_SYM
);
830 PARSE_FLAG ("constructor", BSF_CONSTRUCTOR
);
831 PARSE_FLAG ("warning", BSF_WARNING
);
832 PARSE_FLAG ("indirect", BSF_INDIRECT
);
833 PARSE_FLAG ("file", BSF_FILE
);
834 PARSE_FLAG ("object", BSF_OBJECT
);
835 PARSE_FLAG ("synthetic", BSF_SYNTHETIC
);
836 PARSE_FLAG ("indirect-function", BSF_GNU_INDIRECT_FUNCTION
| BSF_FUNCTION
);
837 PARSE_FLAG ("unique-object", BSF_GNU_UNIQUE
| BSF_OBJECT
);
838 PARSE_OTHER ("before=", *other
);
846 copy
= (char *) xmalloc (len
+ 1);
847 strncpy (copy
, s
, len
);
849 non_fatal (_("unrecognized symbol flag `%s'"), copy
);
850 fatal (_("supported flags: %s"),
851 "local, global, export, debug, function, weak, section, "
852 "constructor, warning, indirect, file, object, synthetic, "
853 "indirect-function, unique-object, before=<othersym>");
863 /* Find and optionally add an entry in the change_sections list.
865 We need to be careful in how we match section names because of the support
866 for wildcard characters. For example suppose that the user has invoked
869 --set-section-flags .debug_*=debug
870 --set-section-flags .debug_str=readonly,debug
871 --change-section-address .debug_*ranges=0x1000
873 With the idea that all debug sections will receive the DEBUG flag, the
874 .debug_str section will also receive the READONLY flag and the
875 .debug_ranges and .debug_aranges sections will have their address set to
876 0x1000. (This may not make much sense, but it is just an example).
878 When adding the section name patterns to the section list we need to make
879 sure that previous entries do not match with the new entry, unless the
880 match is exact. (In which case we assume that the user is overriding
881 the previous entry with the new context).
883 When matching real section names to the section list we make use of the
884 wildcard characters, but we must do so in context. Eg if we are setting
885 section addresses then we match for .debug_ranges but not for .debug_info.
887 Finally, if ADD is false and we do find a match, we mark the section list
890 static struct section_list
*
891 find_section_list (const char *name
, bfd_boolean add
, unsigned int context
)
893 struct section_list
*p
, *match
= NULL
;
895 /* assert ((context & ((1 << 7) - 1)) != 0); */
897 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
901 if (strcmp (p
->pattern
, name
) == 0)
903 /* Check for context conflicts. */
904 if (((p
->context
& SECTION_CONTEXT_REMOVE
)
905 && (context
& SECTION_CONTEXT_COPY
))
906 || ((context
& SECTION_CONTEXT_REMOVE
)
907 && (p
->context
& SECTION_CONTEXT_COPY
)))
908 fatal (_("error: %s both copied and removed"), name
);
910 if (((p
->context
& SECTION_CONTEXT_SET_VMA
)
911 && (context
& SECTION_CONTEXT_ALTER_VMA
))
912 || ((context
& SECTION_CONTEXT_SET_VMA
)
913 && (context
& SECTION_CONTEXT_ALTER_VMA
)))
914 fatal (_("error: %s both sets and alters VMA"), name
);
916 if (((p
->context
& SECTION_CONTEXT_SET_LMA
)
917 && (context
& SECTION_CONTEXT_ALTER_LMA
))
918 || ((context
& SECTION_CONTEXT_SET_LMA
)
919 && (context
& SECTION_CONTEXT_ALTER_LMA
)))
920 fatal (_("error: %s both sets and alters LMA"), name
);
922 /* Extend the context. */
923 p
->context
|= context
;
927 /* If we are not adding a new name/pattern then
928 only check for a match if the context applies. */
929 else if (p
->context
& context
)
931 /* We could check for the presence of wildchar characters
932 first and choose between calling strcmp and fnmatch,
933 but is that really worth it ? */
934 if (p
->pattern
[0] == '!')
936 if (fnmatch (p
->pattern
+ 1, name
, 0) == 0)
944 if (fnmatch (p
->pattern
, name
, 0) == 0)
960 p
= (struct section_list
*) xmalloc (sizeof (struct section_list
));
963 p
->context
= context
;
967 p
->next
= change_sections
;
973 /* S1 is the entry node already in the table, S2 is the key node. */
976 eq_string_redefnode (const void *s1
, const void *s2
)
978 struct redefine_node
*node1
= (struct redefine_node
*) s1
;
979 struct redefine_node
*node2
= (struct redefine_node
*) s2
;
980 return !strcmp ((const char *) node1
->source
, (const char *) node2
->source
);
983 /* P is redefine node. Hash value is generated from its "source" filed. */
986 htab_hash_redefnode (const void *p
)
988 struct redefine_node
*redefnode
= (struct redefine_node
*) p
;
989 return htab_hash_string (redefnode
->source
);
992 /* Create hashtab used for redefine node. */
995 create_symbol2redef_htab (void)
997 return htab_create_alloc (16, htab_hash_redefnode
, eq_string_redefnode
, NULL
,
1001 /* There is htab_hash_string but no htab_eq_string. Makes sense. */
1004 eq_string (const void *s1
, const void *s2
)
1006 return strcmp ((const char *) s1
, (const char *) s2
) == 0;
1010 create_symbol_htab (void)
1012 return htab_create_alloc (16, htab_hash_string
, eq_string
, NULL
, xcalloc
, free
);
1016 create_symbol_htabs (void)
1018 strip_specific_htab
= create_symbol_htab ();
1019 strip_unneeded_htab
= create_symbol_htab ();
1020 keep_specific_htab
= create_symbol_htab ();
1021 localize_specific_htab
= create_symbol_htab ();
1022 globalize_specific_htab
= create_symbol_htab ();
1023 keepglobal_specific_htab
= create_symbol_htab ();
1024 weaken_specific_htab
= create_symbol_htab ();
1025 redefine_specific_htab
= create_symbol2redef_htab ();
1026 /* As there is no bidirectional hash table in libiberty, need a reverse table
1027 to check duplicated target string. */
1028 redefine_specific_reverse_htab
= create_symbol_htab ();
1031 /* Add a symbol to strip_specific_list. */
1034 add_specific_symbol (const char *name
, htab_t htab
)
1036 *htab_find_slot (htab
, name
, INSERT
) = (char *) name
;
1039 /* Like add_specific_symbol, but the element type is void *. */
1042 add_specific_symbol_node (const void *node
, htab_t htab
)
1044 *htab_find_slot (htab
, node
, INSERT
) = (void *) node
;
1047 /* Add symbols listed in `filename' to strip_specific_list. */
1049 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
1050 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
1053 add_specific_symbols (const char *filename
, htab_t htab
, char **buffer_p
)
1059 unsigned int line_count
;
1061 size
= get_file_size (filename
);
1068 buffer
= (char *) xmalloc (size
+ 2);
1069 f
= fopen (filename
, FOPEN_RT
);
1071 fatal (_("cannot open '%s': %s"), filename
, strerror (errno
));
1073 if (fread (buffer
, 1, size
, f
) == 0 || ferror (f
))
1074 fatal (_("%s: fread failed"), filename
);
1077 buffer
[size
] = '\n';
1078 buffer
[size
+ 1] = '\0';
1082 for (line
= buffer
; * line
!= '\0'; line
++)
1087 int finished
= FALSE
;
1089 for (eol
= line
;; eol
++)
1095 /* Cope with \n\r. */
1103 /* Cope with \r\n. */
1114 /* Line comment, Terminate the line here, in case a
1115 name is present and then allow the rest of the
1116 loop to find the real end of the line. */
1128 /* A name may now exist somewhere between 'line' and 'eol'.
1129 Strip off leading whitespace and trailing whitespace,
1130 then add it to the list. */
1131 for (name
= line
; IS_WHITESPACE (* name
); name
++)
1133 for (name_end
= name
;
1134 (! IS_WHITESPACE (* name_end
))
1135 && (! IS_LINE_TERMINATOR (* name_end
));
1139 if (! IS_LINE_TERMINATOR (* name_end
))
1143 for (extra
= name_end
+ 1; IS_WHITESPACE (* extra
); extra
++)
1146 if (! IS_LINE_TERMINATOR (* extra
))
1147 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
1148 filename
, line_count
);
1153 if (name_end
> name
)
1154 add_specific_symbol (name
, htab
);
1156 /* Advance line pointer to end of line. The 'eol ++' in the for
1157 loop above will then advance us to the start of the next line. */
1162 /* Do not free the buffer. Parts of it will have been referenced
1163 in the calls to add_specific_symbol. */
1167 /* See whether a symbol should be stripped or kept
1168 based on strip_specific_list and keep_symbols. */
1171 is_specified_symbol_predicate (void **slot
, void *data
)
1173 struct is_specified_symbol_predicate_data
*d
=
1174 (struct is_specified_symbol_predicate_data
*) data
;
1175 const char *slot_name
= (char *) *slot
;
1177 if (*slot_name
!= '!')
1179 if (! fnmatch (slot_name
, d
->name
, 0))
1182 /* Continue traversal, there might be a non-match rule. */
1188 if (! fnmatch (slot_name
+ 1, d
->name
, 0))
1191 /* Stop traversal. */
1196 /* Continue traversal. */
1201 is_specified_symbol (const char *name
, htab_t htab
)
1205 struct is_specified_symbol_predicate_data data
;
1210 htab_traverse (htab
, is_specified_symbol_predicate
, &data
);
1215 return htab_find (htab
, name
) != NULL
;
1218 /* Return a pointer to the symbol used as a signature for GROUP. */
1221 group_signature (asection
*group
)
1223 bfd
*abfd
= group
->owner
;
1224 Elf_Internal_Shdr
*ghdr
;
1226 /* PR 20089: An earlier error may have prevented us from loading the symbol table. */
1230 if (bfd_get_flavour (abfd
) != bfd_target_elf_flavour
)
1233 ghdr
= &elf_section_data (group
)->this_hdr
;
1234 if (ghdr
->sh_link
== elf_onesymtab (abfd
))
1236 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
1237 Elf_Internal_Shdr
*symhdr
= &elf_symtab_hdr (abfd
);
1239 if (ghdr
->sh_info
> 0
1240 && ghdr
->sh_info
< symhdr
->sh_size
/ bed
->s
->sizeof_sym
)
1241 return isympp
[ghdr
->sh_info
- 1];
1246 /* Return TRUE if the section is a DWO section. */
1249 is_dwo_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
)
1251 const char *name
= bfd_get_section_name (abfd
, sec
);
1252 int len
= strlen (name
);
1254 return strncmp (name
+ len
- 4, ".dwo", 4) == 0;
1257 /* Return TRUE if section SEC is in the update list. */
1260 is_update_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
)
1262 if (update_sections
!= NULL
)
1264 struct section_add
*pupdate
;
1266 for (pupdate
= update_sections
;
1268 pupdate
= pupdate
->next
)
1270 if (strcmp (sec
->name
, pupdate
->name
) == 0)
1279 is_merged_note_section (bfd
* abfd
, asection
* sec
)
1282 && bfd_get_flavour (abfd
) == bfd_target_elf_flavour
1283 && elf_section_data (sec
)->this_hdr
.sh_type
== SHT_NOTE
1284 /* FIXME: We currently only support merging GNU_BUILD_NOTEs.
1285 We should add support for more note types. */
1286 && ((elf_section_data (sec
)->this_hdr
.sh_flags
& SHF_GNU_BUILD_NOTE
) != 0
1287 /* Old versions of GAS (prior to 2.27) could not set the section
1288 flags to OS-specific values, so we also accept sections with the
1290 || (strcmp (sec
->name
, GNU_BUILD_ATTRS_SECTION_NAME
) == 0)))
1296 /* See if a non-group section is being removed. */
1299 is_strip_section_1 (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
)
1301 if (sections_removed
|| sections_copied
)
1303 struct section_list
*p
;
1304 struct section_list
*q
;
1306 p
= find_section_list (bfd_get_section_name (abfd
, sec
), FALSE
,
1307 SECTION_CONTEXT_REMOVE
);
1308 q
= find_section_list (bfd_get_section_name (abfd
, sec
), FALSE
,
1309 SECTION_CONTEXT_COPY
);
1312 fatal (_("error: section %s matches both remove and copy options"),
1313 bfd_get_section_name (abfd
, sec
));
1314 if (p
&& is_update_section (abfd
, sec
))
1315 fatal (_("error: section %s matches both update and remove options"),
1316 bfd_get_section_name (abfd
, sec
));
1320 if (sections_copied
&& q
== NULL
)
1324 if ((bfd_get_section_flags (abfd
, sec
) & SEC_DEBUGGING
) != 0)
1326 if (strip_symbols
== STRIP_DEBUG
1327 || strip_symbols
== STRIP_UNNEEDED
1328 || strip_symbols
== STRIP_ALL
1329 || discard_locals
== LOCALS_ALL
1330 || convert_debugging
)
1332 /* By default we don't want to strip .reloc section.
1333 This section has for pe-coff special meaning. See
1334 pe-dll.c file in ld, and peXXigen.c in bfd for details. */
1335 if (strcmp (bfd_get_section_name (abfd
, sec
), ".reloc") != 0)
1339 if (strip_symbols
== STRIP_DWO
)
1340 return is_dwo_section (abfd
, sec
);
1342 if (strip_symbols
== STRIP_NONDEBUG
)
1346 if (strip_symbols
== STRIP_NONDWO
)
1347 return !is_dwo_section (abfd
, sec
);
1352 /* See if a section is being removed. */
1355 is_strip_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
)
1357 if (is_strip_section_1 (abfd
, sec
))
1360 if ((bfd_get_section_flags (abfd
, sec
) & SEC_GROUP
) != 0)
1364 asection
*elt
, *first
;
1366 gsym
= group_signature (sec
);
1367 /* Strip groups without a valid signature. */
1372 If we are going to strip the group signature symbol, then
1373 strip the group section too. */
1375 if ((strip_symbols
== STRIP_ALL
1376 && !is_specified_symbol (gname
, keep_specific_htab
))
1377 || is_specified_symbol (gname
, strip_specific_htab
))
1380 /* Remove the group section if all members are removed. */
1381 first
= elt
= elf_next_in_group (sec
);
1384 if (!is_strip_section_1 (abfd
, elt
))
1386 elt
= elf_next_in_group (elt
);
1398 is_nondebug_keep_contents_section (bfd
*ibfd
, asection
*isection
)
1400 /* Always keep ELF note sections. */
1401 if (ibfd
->xvec
->flavour
== bfd_target_elf_flavour
)
1402 return (elf_section_type (isection
) == SHT_NOTE
);
1404 /* Always keep the .buildid section for PE/COFF.
1406 Strictly, this should be written "always keep the section storing the debug
1407 directory", but that may be the .text section for objects produced by some
1408 tools, which it is not sensible to keep. */
1409 if (ibfd
->xvec
->flavour
== bfd_target_coff_flavour
)
1410 return (strcmp (bfd_get_section_name (ibfd
, isection
), ".buildid") == 0);
1415 /* Return true if SYM is a hidden symbol. */
1418 is_hidden_symbol (asymbol
*sym
)
1420 elf_symbol_type
*elf_sym
;
1422 elf_sym
= elf_symbol_from (sym
->the_bfd
, sym
);
1423 if (elf_sym
!= NULL
)
1424 switch (ELF_ST_VISIBILITY (elf_sym
->internal_elf_sym
.st_other
))
1434 need_sym_before (struct addsym_node
**node
, const char *sym
)
1437 struct addsym_node
*ptr
= add_sym_list
;
1439 /* 'othersym' symbols are at the front of the list. */
1440 for (count
= 0; count
< add_symbols
; count
++)
1444 else if (strcmp (ptr
->othersym
, sym
) == 0)
1446 free (ptr
->othersym
);
1447 ptr
->othersym
= ""; /* Empty name is hopefully never a valid symbol name. */
1457 create_new_symbol (struct addsym_node
*ptr
, bfd
*obfd
)
1459 asymbol
*sym
= bfd_make_empty_symbol (obfd
);
1461 bfd_asymbol_name (sym
) = ptr
->symdef
;
1462 sym
->value
= ptr
->symval
;
1463 sym
->flags
= ptr
->flags
;
1466 asection
*sec
= bfd_get_section_by_name (obfd
, ptr
->section
);
1468 fatal (_("Section %s not found"), ptr
->section
);
1472 sym
->section
= bfd_abs_section_ptr
;
1476 /* Choose which symbol entries to copy; put the result in OSYMS.
1477 We don't copy in place, because that confuses the relocs.
1478 Return the number of symbols to print. */
1481 filter_symbols (bfd
*abfd
, bfd
*obfd
, asymbol
**osyms
,
1482 asymbol
**isyms
, long symcount
)
1484 asymbol
**from
= isyms
, **to
= osyms
;
1485 long src_count
= 0, dst_count
= 0;
1486 int relocatable
= (abfd
->flags
& (EXEC_P
| DYNAMIC
)) == 0;
1488 for (; src_count
< symcount
; src_count
++)
1490 asymbol
*sym
= from
[src_count
];
1491 flagword flags
= sym
->flags
;
1492 char *name
= (char *) bfd_asymbol_name (sym
);
1494 bfd_boolean used_in_reloc
= FALSE
;
1495 bfd_boolean undefined
;
1496 bfd_boolean rem_leading_char
;
1497 bfd_boolean add_leading_char
;
1499 undefined
= bfd_is_und_section (bfd_get_section (sym
));
1503 struct addsym_node
*ptr
;
1505 if (need_sym_before (&ptr
, name
))
1506 to
[dst_count
++] = create_new_symbol (ptr
, obfd
);
1509 if (htab_elements (redefine_specific_htab
) || section_rename_list
)
1513 new_name
= (char *) lookup_sym_redefinition (name
);
1514 if (new_name
== name
1515 && (flags
& BSF_SECTION_SYM
) != 0)
1516 new_name
= (char *) find_section_rename (name
, NULL
);
1517 bfd_asymbol_name (sym
) = new_name
;
1521 /* Check if we will remove the current leading character. */
1523 (name
[0] == bfd_get_symbol_leading_char (abfd
))
1524 && (change_leading_char
1525 || (remove_leading_char
1526 && ((flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0
1528 || bfd_is_com_section (bfd_get_section (sym
)))));
1530 /* Check if we will add a new leading character. */
1533 && (bfd_get_symbol_leading_char (obfd
) != '\0')
1534 && (bfd_get_symbol_leading_char (abfd
) == '\0'
1535 || (name
[0] == bfd_get_symbol_leading_char (abfd
)));
1537 /* Short circuit for change_leading_char if we can do it in-place. */
1538 if (rem_leading_char
&& add_leading_char
&& !prefix_symbols_string
)
1540 name
[0] = bfd_get_symbol_leading_char (obfd
);
1541 bfd_asymbol_name (sym
) = name
;
1542 rem_leading_char
= FALSE
;
1543 add_leading_char
= FALSE
;
1546 /* Remove leading char. */
1547 if (rem_leading_char
)
1548 bfd_asymbol_name (sym
) = ++name
;
1550 /* Add new leading char and/or prefix. */
1551 if (add_leading_char
|| prefix_symbols_string
)
1555 ptr
= n
= (char *) xmalloc (1 + strlen (prefix_symbols_string
)
1556 + strlen (name
) + 1);
1557 if (add_leading_char
)
1558 *ptr
++ = bfd_get_symbol_leading_char (obfd
);
1560 if (prefix_symbols_string
)
1562 strcpy (ptr
, prefix_symbols_string
);
1563 ptr
+= strlen (prefix_symbols_string
);
1567 bfd_asymbol_name (sym
) = n
;
1571 if (strip_symbols
== STRIP_ALL
)
1573 else if ((flags
& BSF_KEEP
) != 0 /* Used in relocation. */
1574 || ((flags
& BSF_SECTION_SYM
) != 0
1575 && ((*bfd_get_section (sym
)->symbol_ptr_ptr
)->flags
1579 used_in_reloc
= TRUE
;
1581 else if (relocatable
/* Relocatable file. */
1582 && ((flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0
1583 || bfd_is_com_section (bfd_get_section (sym
))))
1585 else if (bfd_decode_symclass (sym
) == 'I')
1586 /* Global symbols in $idata sections need to be retained
1587 even if relocatable is FALSE. External users of the
1588 library containing the $idata section may reference these
1591 else if ((flags
& BSF_GLOBAL
) != 0 /* Global symbol. */
1592 || (flags
& BSF_WEAK
) != 0
1594 || bfd_is_com_section (bfd_get_section (sym
)))
1595 keep
= strip_symbols
!= STRIP_UNNEEDED
;
1596 else if ((flags
& BSF_DEBUGGING
) != 0) /* Debugging symbol. */
1597 keep
= (strip_symbols
!= STRIP_DEBUG
1598 && strip_symbols
!= STRIP_UNNEEDED
1599 && ! convert_debugging
);
1600 else if (bfd_coff_get_comdat_section (abfd
, bfd_get_section (sym
)))
1601 /* COMDAT sections store special information in local
1602 symbols, so we cannot risk stripping any of them. */
1604 else /* Local symbol. */
1605 keep
= (strip_symbols
!= STRIP_UNNEEDED
1606 && (discard_locals
!= LOCALS_ALL
1607 && (discard_locals
!= LOCALS_START_L
1608 || ! bfd_is_local_label (abfd
, sym
))));
1610 if (keep
&& is_specified_symbol (name
, strip_specific_htab
))
1612 /* There are multiple ways to set 'keep' above, but if it
1613 was the relocatable symbol case, then that's an error. */
1616 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name
);
1624 && !(flags
& BSF_KEEP
)
1625 && is_specified_symbol (name
, strip_unneeded_htab
))
1629 && ((keep_file_symbols
&& (flags
& BSF_FILE
))
1630 || is_specified_symbol (name
, keep_specific_htab
)))
1633 if (keep
&& is_strip_section (abfd
, bfd_get_section (sym
)))
1638 if ((flags
& BSF_GLOBAL
) != 0
1639 && (weaken
|| is_specified_symbol (name
, weaken_specific_htab
)))
1641 sym
->flags
&= ~ BSF_GLOBAL
;
1642 sym
->flags
|= BSF_WEAK
;
1646 && (flags
& (BSF_GLOBAL
| BSF_WEAK
))
1647 && (is_specified_symbol (name
, localize_specific_htab
)
1648 || (htab_elements (keepglobal_specific_htab
) != 0
1649 && ! is_specified_symbol (name
, keepglobal_specific_htab
))
1650 || (localize_hidden
&& is_hidden_symbol (sym
))))
1652 sym
->flags
&= ~ (BSF_GLOBAL
| BSF_WEAK
);
1653 sym
->flags
|= BSF_LOCAL
;
1657 && (flags
& BSF_LOCAL
)
1658 && is_specified_symbol (name
, globalize_specific_htab
))
1660 sym
->flags
&= ~ BSF_LOCAL
;
1661 sym
->flags
|= BSF_GLOBAL
;
1664 to
[dst_count
++] = sym
;
1669 struct addsym_node
*ptr
= add_sym_list
;
1671 for (src_count
= 0; src_count
< add_symbols
; src_count
++)
1675 if (strcmp (ptr
->othersym
, ""))
1676 fatal (_("'before=%s' not found"), ptr
->othersym
);
1679 to
[dst_count
++] = create_new_symbol (ptr
, obfd
);
1685 to
[dst_count
] = NULL
;
1690 /* Find the redefined name of symbol SOURCE. */
1693 lookup_sym_redefinition (const char *source
)
1695 struct redefine_node key_node
= {(char *) source
, NULL
};
1696 struct redefine_node
*redef_node
1697 = (struct redefine_node
*) htab_find (redefine_specific_htab
, &key_node
);
1699 return redef_node
== NULL
? source
: redef_node
->target
;
1702 /* Insert a node into symbol redefine hash tabel. */
1705 add_redefine_and_check (const char *cause
, const char *source
,
1708 struct redefine_node
*new_node
1709 = (struct redefine_node
*) xmalloc (sizeof (struct redefine_node
));
1711 new_node
->source
= strdup (source
);
1712 new_node
->target
= strdup (target
);
1714 if (htab_find (redefine_specific_htab
, new_node
) != HTAB_EMPTY_ENTRY
)
1715 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1718 if (htab_find (redefine_specific_reverse_htab
, target
) != HTAB_EMPTY_ENTRY
)
1719 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1722 /* Insert the NEW_NODE into hash table for quick search. */
1723 add_specific_symbol_node (new_node
, redefine_specific_htab
);
1725 /* Insert the target string into the reverse hash table, this is needed for
1726 duplicated target string check. */
1727 add_specific_symbol (new_node
->target
, redefine_specific_reverse_htab
);
1731 /* Handle the --redefine-syms option. Read lines containing "old new"
1732 from the file, and add them to the symbol redefine list. */
1735 add_redefine_syms_file (const char *filename
)
1744 file
= fopen (filename
, "r");
1746 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1747 filename
, strerror (errno
));
1750 buf
= (char *) xmalloc (bufsize
+ 1 /* For the terminating NUL. */);
1758 /* Collect the input symbol name. */
1759 while (! IS_WHITESPACE (c
) && ! IS_LINE_TERMINATOR (c
) && c
!= EOF
)
1767 buf
= (char *) xrealloc (buf
, bufsize
+ 1);
1775 /* Eat white space between the symbol names. */
1776 while (IS_WHITESPACE (c
))
1778 if (c
== '#' || IS_LINE_TERMINATOR (c
))
1783 /* Collect the output symbol name. */
1785 while (! IS_WHITESPACE (c
) && ! IS_LINE_TERMINATOR (c
) && c
!= EOF
)
1793 buf
= (char *) xrealloc (buf
, bufsize
+ 1);
1801 /* Eat white space at end of line. */
1802 while (! IS_LINE_TERMINATOR(c
) && c
!= EOF
&& IS_WHITESPACE (c
))
1807 if ((c
== '\r' && (c
= getc (file
)) == '\n')
1808 || c
== '\n' || c
== EOF
)
1811 /* Append the redefinition to the list. */
1813 add_redefine_and_check (filename
, &buf
[0], &buf
[outsym_off
]);
1824 fatal (_("%s:%d: garbage found at end of line"), filename
, lineno
);
1826 if (len
!= 0 && (outsym_off
== 0 || outsym_off
== len
))
1827 fatal (_("%s:%d: missing new symbol name"), filename
, lineno
);
1830 /* Eat the rest of the line and finish it. */
1831 while (c
!= '\n' && c
!= EOF
)
1837 fatal (_("%s:%d: premature end of file"), filename
, lineno
);
1843 /* Copy unknown object file IBFD onto OBFD.
1844 Returns TRUE upon success, FALSE otherwise. */
1847 copy_unknown_object (bfd
*ibfd
, bfd
*obfd
)
1855 if (bfd_stat_arch_elt (ibfd
, &buf
) != 0)
1857 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
1864 non_fatal (_("stat returns negative size for `%s'"),
1865 bfd_get_archive_filename (ibfd
));
1869 if (bfd_seek (ibfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1871 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1876 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1877 bfd_get_archive_filename (ibfd
), bfd_get_filename (obfd
));
1879 cbuf
= (char *) xmalloc (BUFSIZE
);
1881 while (ncopied
< size
)
1883 tocopy
= size
- ncopied
;
1884 if (tocopy
> BUFSIZE
)
1887 if (bfd_bread (cbuf
, (bfd_size_type
) tocopy
, ibfd
)
1888 != (bfd_size_type
) tocopy
)
1890 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
1895 if (bfd_bwrite (cbuf
, (bfd_size_type
) tocopy
, obfd
)
1896 != (bfd_size_type
) tocopy
)
1898 bfd_nonfatal_message (NULL
, obfd
, NULL
, NULL
);
1906 /* We should at least to be able to read it back when copying an
1907 unknown object in an archive. */
1908 chmod (bfd_get_filename (obfd
), buf
.st_mode
| S_IRUSR
);
1913 /* Returns the number of bytes needed to store VAL. */
1915 static inline unsigned int
1916 num_bytes (unsigned long val
)
1918 unsigned int count
= 0;
1920 /* FIXME: There must be a faster way to do this. */
1929 typedef struct objcopy_internal_note
1931 Elf_Internal_Note note
;
1934 bfd_boolean modified
;
1935 } objcopy_internal_note
;
1937 /* Returns TRUE if a gap does, or could, exist between the address range
1938 covered by PNOTE1 and PNOTE2. */
1941 gap_exists (objcopy_internal_note
* pnote1
,
1942 objcopy_internal_note
* pnote2
)
1944 /* Without range end notes, we assume that a gap might exist. */
1945 if (pnote1
->end
== 0 || pnote2
->end
== 0)
1948 /* FIXME: Alignment of 16 bytes taken from x86_64 binaries.
1949 Really we should extract the alignment of the section covered by the notes. */
1950 return BFD_ALIGN (pnote1
->end
, 16) < pnote2
->start
;
1954 is_open_note (objcopy_internal_note
* pnote
)
1956 return (pnote
->note
.type
== NT_GNU_BUILD_ATTRIBUTE_OPEN
);
1960 is_func_note (objcopy_internal_note
* pnote
)
1962 return (pnote
->note
.type
== NT_GNU_BUILD_ATTRIBUTE_FUNC
);
1966 is_64bit (bfd
* abfd
)
1968 /* Should never happen, but let's be paranoid. */
1969 if (bfd_get_flavour (abfd
) != bfd_target_elf_flavour
)
1972 return elf_elfheader (abfd
)->e_ident
[EI_CLASS
] == ELFCLASS64
;
1975 /* Merge the notes on SEC, removing redundant entries.
1976 Returns the new, smaller size of the section upon success. */
1978 static bfd_size_type
1979 merge_gnu_build_notes (bfd
* abfd
, asection
* sec
, bfd_size_type size
, bfd_byte
* contents
)
1981 objcopy_internal_note
* pnotes_end
;
1982 objcopy_internal_note
* pnotes
= NULL
;
1983 objcopy_internal_note
* pnote
;
1984 bfd_size_type remain
= size
;
1985 unsigned version_1_seen
= 0;
1986 unsigned version_2_seen
= 0;
1987 unsigned version_3_seen
= 0;
1988 bfd_boolean duplicate_found
= FALSE
;
1989 const char * err
= NULL
;
1990 bfd_byte
* in
= contents
;
1991 int attribute_type_byte
;
1993 unsigned long previous_func_start
= 0;
1994 unsigned long previous_open_start
= 0;
1995 unsigned long previous_func_end
= 0;
1996 unsigned long previous_open_end
= 0;
1999 relsize
= bfd_get_reloc_upper_bound (abfd
, sec
);
2005 /* If there are relocs associated with this section then we
2006 cannot safely merge it. */
2007 relpp
= (arelent
**) xmalloc (relsize
);
2008 relcount
= bfd_canonicalize_reloc (abfd
, sec
, relpp
, isympp
);
2014 /* Make a copy of the notes and convert to our internal format.
2015 Minimum size of a note is 12 bytes. Also locate the version
2016 notes and check them. */
2017 pnote
= pnotes
= (objcopy_internal_note
*) xcalloc ((size
/ 12), sizeof (* pnote
));
2018 while (remain
>= 12)
2022 pnote
->note
.namesz
= (bfd_get_32 (abfd
, in
) + 3) & ~3;
2023 pnote
->note
.descsz
= (bfd_get_32 (abfd
, in
+ 4) + 3) & ~3;
2024 pnote
->note
.type
= bfd_get_32 (abfd
, in
+ 8);
2026 if (pnote
->note
.type
!= NT_GNU_BUILD_ATTRIBUTE_OPEN
2027 && pnote
->note
.type
!= NT_GNU_BUILD_ATTRIBUTE_FUNC
)
2029 err
= _("corrupt GNU build attribute note: wrong note type");
2033 if (pnote
->note
.namesz
+ pnote
->note
.descsz
+ 12 > remain
)
2035 err
= _("corrupt GNU build attribute note: note too big");
2039 if (pnote
->note
.namesz
< 2)
2041 err
= _("corrupt GNU build attribute note: name too small");
2045 pnote
->note
.namedata
= (char *)(in
+ 12);
2046 pnote
->note
.descdata
= (char *)(in
+ 12 + pnote
->note
.namesz
);
2048 remain
-= 12 + pnote
->note
.namesz
+ pnote
->note
.descsz
;
2049 in
+= 12 + pnote
->note
.namesz
+ pnote
->note
.descsz
;
2051 if (pnote
->note
.namesz
> 2
2052 && pnote
->note
.namedata
[0] == '$'
2053 && pnote
->note
.namedata
[1] == GNU_BUILD_ATTRIBUTE_VERSION
2054 && pnote
->note
.namedata
[2] == '1')
2056 else if (pnote
->note
.namesz
> 4
2057 && pnote
->note
.namedata
[0] == 'G'
2058 && pnote
->note
.namedata
[1] == 'A'
2059 && pnote
->note
.namedata
[2] == '$'
2060 && pnote
->note
.namedata
[3] == GNU_BUILD_ATTRIBUTE_VERSION
)
2062 if (pnote
->note
.namedata
[4] == '2')
2064 else if (pnote
->note
.namedata
[4] == '3')
2068 err
= _("corrupt GNU build attribute note: unsupported version");
2073 switch (pnote
->note
.descsz
)
2080 start
= bfd_get_32 (abfd
, pnote
->note
.descdata
);
2081 /* FIXME: For version 1 and 2 notes we should try to
2082 calculate the end address by finding a symbol whose
2083 value is START, and then adding in its size.
2085 For now though, since v1 and v2 was not intended to
2086 handle gaps, we chose an artificially large end
2092 if (! is_64bit (abfd
))
2094 start
= bfd_get_32 (abfd
, pnote
->note
.descdata
);
2095 end
= bfd_get_32 (abfd
, pnote
->note
.descdata
+ 4);
2099 start
= bfd_get_64 (abfd
, pnote
->note
.descdata
);
2100 /* FIXME: For version 1 and 2 notes we should try to
2101 calculate the end address by finding a symbol whose
2102 value is START, and then adding in its size.
2104 For now though, since v1 and v2 was not intended to
2105 handle gaps, we chose an artificially large end
2112 start
= bfd_get_64 (abfd
, pnote
->note
.descdata
);
2113 end
= bfd_get_64 (abfd
, pnote
->note
.descdata
+ 8);
2117 err
= _("corrupt GNU build attribute note: bad description size");
2121 if (is_open_note (pnote
))
2124 previous_open_start
= start
;
2126 pnote
->start
= previous_open_start
;
2129 previous_open_end
= end
;
2131 pnote
->end
= previous_open_end
;
2136 previous_func_start
= start
;
2138 pnote
->start
= previous_func_start
;
2141 previous_func_end
= end
;
2143 pnote
->end
= previous_func_end
;
2146 if (pnote
->note
.namedata
[pnote
->note
.namesz
- 1] != 0)
2148 err
= _("corrupt GNU build attribute note: name not NUL terminated");
2157 /* Check that the notes are valid. */
2160 err
= _("corrupt GNU build attribute notes: excess data at end");
2164 if (version_1_seen
== 0 && version_2_seen
== 0 && version_3_seen
== 0)
2166 err
= _("bad GNU build attribute notes: no known versions detected");
2170 if ((version_1_seen
> 0 && version_2_seen
> 0)
2171 || (version_1_seen
> 0 && version_3_seen
> 0)
2172 || (version_2_seen
> 0 && version_3_seen
> 0))
2174 err
= _("bad GNU build attribute notes: multiple different versions");
2178 /* Merging is only needed if there is more than one version note... */
2179 if (version_1_seen
== 1 || version_2_seen
== 1 || version_3_seen
== 1)
2182 attribute_type_byte
= version_1_seen
? 1 : 3;
2183 val_start
= attribute_type_byte
+ 1;
2185 /* We used to require that the first note be a version note,
2186 but this is no longer enforced. Due to the problems with
2187 linking sections with the same name (eg .gnu.build.note.hot)
2188 we cannot guarantee that the first note will be a version note. */
2190 /* Now merge the notes. The rules are:
2191 1. Preserve the ordering of the notes.
2192 2. Preserve any NT_GNU_BUILD_ATTRIBUTE_FUNC notes.
2193 3. Eliminate any NT_GNU_BUILD_ATTRIBUTE_OPEN notes that have the same
2194 full name field as the immediately preceeding note with the same type
2195 of name and whose address ranges coincide.
2196 IE - if there are gaps in the coverage of the notes, then these gaps
2198 4. Combine the numeric value of any NT_GNU_BUILD_ATTRIBUTE_OPEN notes
2199 of type GNU_BUILD_ATTRIBUTE_STACK_SIZE.
2200 5. If an NT_GNU_BUILD_ATTRIBUTE_OPEN note is going to be preserved and
2201 its description field is empty then the nearest preceeding OPEN note
2202 with a non-empty description field must also be preserved *OR* the
2203 description field of the note must be changed to contain the starting
2204 address to which it refers.
2205 6. Notes with the same start and end address can be deleted.
2206 7. FIXME: Elminate duplicate version notes - even function specific ones ? */
2207 for (pnote
= pnotes
; pnote
< pnotes_end
; pnote
++)
2210 objcopy_internal_note
* back
;
2211 objcopy_internal_note
* prev_open_with_range
= NULL
;
2213 /* Rule 6 - delete 0-range notes. */
2214 if (pnote
->start
== pnote
->end
)
2216 duplicate_found
= TRUE
;
2217 pnote
->note
.type
= 0;
2221 /* Rule 2 - preserve function notes. */
2222 if (! is_open_note (pnote
))
2226 /* Check to see if there is an identical previous function note.
2227 This can happen with overlays for example. */
2228 for (iter
= 0, back
= pnote
-1; back
>= pnotes
; back
--)
2230 if (back
->start
== pnote
->start
2231 && back
->end
== pnote
->end
2232 && back
->note
.namesz
== pnote
->note
.namesz
2233 && memcmp (back
->note
.namedata
, pnote
->note
.namedata
, pnote
->note
.namesz
) == 0)
2235 duplicate_found
= TRUE
;
2236 pnote
->note
.type
= 0;
2240 /* Don't scan too far back however. */
2247 note_type
= pnote
->note
.namedata
[attribute_type_byte
];
2249 /* Scan backwards from pnote, looking for duplicates.
2250 Clear the type field of any found - but do not delete them just yet. */
2251 for (back
= pnote
- 1; back
>= pnotes
; back
--)
2253 int back_type
= back
->note
.namedata
[attribute_type_byte
];
2255 /* If this is the first open note with an address
2256 range that we have encountered then record it. */
2257 if (prev_open_with_range
== NULL
2258 && back
->note
.descsz
> 0
2259 && ! is_func_note (back
))
2260 prev_open_with_range
= back
;
2262 if (! is_open_note (back
))
2265 /* If the two notes are different then keep on searching. */
2266 if (back_type
!= note_type
)
2269 /* Rule 4 - combine stack size notes. */
2270 if (back_type
== GNU_BUILD_ATTRIBUTE_STACK_SIZE
)
2272 unsigned char * name
;
2273 unsigned long note_val
;
2274 unsigned long back_val
;
2279 for (shift
= 0, note_val
= 0,
2280 bytes
= pnote
->note
.namesz
- val_start
,
2281 name
= (unsigned char *) pnote
->note
.namedata
+ val_start
;
2284 byte
= (* name
++) & 0xff;
2285 note_val
|= byte
<< shift
;
2289 for (shift
= 0, back_val
= 0,
2290 bytes
= back
->note
.namesz
- val_start
,
2291 name
= (unsigned char *) back
->note
.namedata
+ val_start
;
2294 byte
= (* name
++) & 0xff;
2295 back_val
|= byte
<< shift
;
2299 back_val
+= note_val
;
2300 if (num_bytes (back_val
) >= back
->note
.namesz
- val_start
)
2302 /* We have a problem - the new value requires more bytes of
2303 storage in the name field than are available. Currently
2304 we have no way of fixing this, so we just preserve both
2309 /* Write the new val into back. */
2310 name
= (unsigned char *) back
->note
.namedata
+ val_start
;
2311 while (name
< (unsigned char *) back
->note
.namedata
2312 + back
->note
.namesz
)
2314 byte
= back_val
& 0xff;
2321 duplicate_found
= TRUE
;
2322 pnote
->note
.type
= 0;
2326 /* Rule 3 - combine identical open notes. */
2327 if (back
->note
.namesz
== pnote
->note
.namesz
2328 && memcmp (back
->note
.namedata
,
2329 pnote
->note
.namedata
, back
->note
.namesz
) == 0
2330 && ! gap_exists (back
, pnote
))
2332 duplicate_found
= TRUE
;
2333 pnote
->note
.type
= 0;
2335 if (pnote
->end
> back
->end
)
2336 back
->end
= pnote
->end
;
2339 back
->modified
= TRUE
;
2343 /* Rule 5 - Since we are keeping this note we must check to see
2344 if its description refers back to an earlier OPEN version
2345 note that has been scheduled for deletion. If so then we
2346 must make sure that version note is also preserved. */
2349 /* As of version 3 we can just
2350 move the range into the note. */
2351 pnote
->modified
= TRUE
;
2352 pnote
->note
.type
= NT_GNU_BUILD_ATTRIBUTE_FUNC
;
2353 back
->modified
= TRUE
;
2354 back
->note
.type
= NT_GNU_BUILD_ATTRIBUTE_FUNC
;
2358 if (pnote
->note
.descsz
== 0
2359 && prev_open_with_range
!= NULL
2360 && prev_open_with_range
->note
.type
== 0)
2361 prev_open_with_range
->note
.type
= NT_GNU_BUILD_ATTRIBUTE_OPEN
;
2364 /* We have found a similar attribute but the details do not match.
2365 Stop searching backwards. */
2370 if (duplicate_found
)
2372 bfd_byte
* new_contents
;
2375 bfd_size_type new_size
;
2376 bfd_vma prev_start
= 0;
2377 bfd_vma prev_end
= 0;
2379 /* Eliminate the duplicates. */
2380 new = new_contents
= xmalloc (size
);
2381 for (pnote
= pnotes
, old
= contents
;
2385 bfd_size_type note_size
= 12 + pnote
->note
.namesz
+ pnote
->note
.descsz
;
2387 if (pnote
->note
.type
!= 0)
2389 if (pnote
->modified
)
2391 /* If the note has been modified then we must copy it by
2392 hand, potentially adding in a new description field. */
2393 if (pnote
->start
== prev_start
&& pnote
->end
== prev_end
)
2395 bfd_put_32 (abfd
, pnote
->note
.namesz
, new);
2396 bfd_put_32 (abfd
, 0, new + 4);
2397 bfd_put_32 (abfd
, pnote
->note
.type
, new + 8);
2399 memcpy (new, pnote
->note
.namedata
, pnote
->note
.namesz
);
2400 new += pnote
->note
.namesz
;
2404 bfd_put_32 (abfd
, pnote
->note
.namesz
, new);
2405 bfd_put_32 (abfd
, is_64bit (abfd
) ? 16 : 8, new + 4);
2406 bfd_put_32 (abfd
, pnote
->note
.type
, new + 8);
2408 memcpy (new, pnote
->note
.namedata
, pnote
->note
.namesz
);
2409 new += pnote
->note
.namesz
;
2410 if (is_64bit (abfd
))
2412 bfd_put_64 (abfd
, pnote
->start
, new);
2413 bfd_put_64 (abfd
, pnote
->end
, new + 8);
2418 bfd_put_32 (abfd
, pnote
->start
, new);
2419 bfd_put_32 (abfd
, pnote
->end
, new + 4);
2426 memcpy (new, old
, note_size
);
2429 prev_start
= pnote
->start
;
2430 prev_end
= pnote
->end
;
2436 new_size
= new - new_contents
;
2437 memcpy (contents
, new_contents
, new_size
);
2439 free (new_contents
);
2445 bfd_set_error (bfd_error_bad_value
);
2446 bfd_nonfatal_message (NULL
, abfd
, sec
, err
);
2454 /* Copy object file IBFD onto OBFD.
2455 Returns TRUE upon success, FALSE otherwise. */
2458 copy_object (bfd
*ibfd
, bfd
*obfd
, const bfd_arch_info_type
*input_arch
)
2462 asection
**osections
= NULL
;
2464 asection
*gnu_debuglink_section
= NULL
;
2465 bfd_size_type
*gaps
= NULL
;
2466 bfd_size_type max_gap
= 0;
2469 enum bfd_architecture iarch
;
2473 if (ibfd
->xvec
->byteorder
!= obfd
->xvec
->byteorder
2474 && ibfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
2475 && obfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
)
2477 /* PR 17636: Call non-fatal so that we return to our parent who
2478 may need to tidy temporary files. */
2479 non_fatal (_("Unable to change endianness of input file(s)"));
2483 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
2485 bfd_nonfatal_message (NULL
, obfd
, NULL
, NULL
);
2489 if (ibfd
->sections
== NULL
)
2491 non_fatal (_("error: the input file '%s' has no sections"),
2492 bfd_get_archive_filename (ibfd
));
2496 if (ibfd
->xvec
->flavour
!= bfd_target_elf_flavour
)
2498 if ((do_debug_sections
& compress
) != 0
2499 && do_debug_sections
!= compress
)
2501 non_fatal (_("--compress-debug-sections=[zlib|zlib-gnu|zlib-gabi] is unsupported on `%s'"),
2502 bfd_get_archive_filename (ibfd
));
2506 if (do_elf_stt_common
)
2508 non_fatal (_("--elf-stt-common=[yes|no] is unsupported on `%s'"),
2509 bfd_get_archive_filename (ibfd
));
2515 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
2516 bfd_get_archive_filename (ibfd
), bfd_get_target (ibfd
),
2517 bfd_get_filename (obfd
), bfd_get_target (obfd
));
2526 start
= bfd_get_start_address (ibfd
);
2527 start
+= change_start
;
2530 /* Neither the start address nor the flags
2531 need to be set for a core file. */
2532 if (bfd_get_format (obfd
) != bfd_core
)
2536 flags
= bfd_get_file_flags (ibfd
);
2537 flags
|= bfd_flags_to_set
;
2538 flags
&= ~bfd_flags_to_clear
;
2539 flags
&= bfd_applicable_file_flags (obfd
);
2541 if (strip_symbols
== STRIP_ALL
)
2542 flags
&= ~HAS_RELOC
;
2544 if (!bfd_set_start_address (obfd
, start
)
2545 || !bfd_set_file_flags (obfd
, flags
))
2547 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
2552 /* Copy architecture of input file to output file. */
2553 iarch
= bfd_get_arch (ibfd
);
2554 imach
= bfd_get_mach (ibfd
);
2557 if (bfd_get_arch_info (ibfd
) == NULL
2558 || bfd_get_arch_info (ibfd
)->arch
== bfd_arch_unknown
)
2560 iarch
= input_arch
->arch
;
2561 imach
= input_arch
->mach
;
2564 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
2565 bfd_get_archive_filename (ibfd
));
2567 if (!bfd_set_arch_mach (obfd
, iarch
, imach
)
2568 && (ibfd
->target_defaulted
2569 || bfd_get_arch (ibfd
) != bfd_get_arch (obfd
)))
2571 if (bfd_get_arch (ibfd
) == bfd_arch_unknown
)
2572 non_fatal (_("Unable to recognise the format of the input file `%s'"),
2573 bfd_get_archive_filename (ibfd
));
2575 non_fatal (_("Output file cannot represent architecture `%s'"),
2576 bfd_printable_arch_mach (bfd_get_arch (ibfd
),
2577 bfd_get_mach (ibfd
)));
2581 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
2583 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
2587 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
2588 && bfd_pei_p (obfd
))
2590 /* Set up PE parameters. */
2591 pe_data_type
*pe
= pe_data (obfd
);
2593 /* Copy PE parameters before changing them. */
2594 if (ibfd
->xvec
->flavour
== bfd_target_coff_flavour
2595 && bfd_pei_p (ibfd
))
2596 pe
->pe_opthdr
= pe_data (ibfd
)->pe_opthdr
;
2598 if (pe_file_alignment
!= (bfd_vma
) -1)
2599 pe
->pe_opthdr
.FileAlignment
= pe_file_alignment
;
2601 pe_file_alignment
= PE_DEF_FILE_ALIGNMENT
;
2603 if (pe_heap_commit
!= (bfd_vma
) -1)
2604 pe
->pe_opthdr
.SizeOfHeapCommit
= pe_heap_commit
;
2606 if (pe_heap_reserve
!= (bfd_vma
) -1)
2607 pe
->pe_opthdr
.SizeOfHeapCommit
= pe_heap_reserve
;
2609 if (pe_image_base
!= (bfd_vma
) -1)
2610 pe
->pe_opthdr
.ImageBase
= pe_image_base
;
2612 if (pe_section_alignment
!= (bfd_vma
) -1)
2613 pe
->pe_opthdr
.SectionAlignment
= pe_section_alignment
;
2615 pe_section_alignment
= PE_DEF_SECTION_ALIGNMENT
;
2617 if (pe_stack_commit
!= (bfd_vma
) -1)
2618 pe
->pe_opthdr
.SizeOfStackCommit
= pe_stack_commit
;
2620 if (pe_stack_reserve
!= (bfd_vma
) -1)
2621 pe
->pe_opthdr
.SizeOfStackCommit
= pe_stack_reserve
;
2623 if (pe_subsystem
!= -1)
2624 pe
->pe_opthdr
.Subsystem
= pe_subsystem
;
2626 if (pe_major_subsystem_version
!= -1)
2627 pe
->pe_opthdr
.MajorSubsystemVersion
= pe_major_subsystem_version
;
2629 if (pe_minor_subsystem_version
!= -1)
2630 pe
->pe_opthdr
.MinorSubsystemVersion
= pe_minor_subsystem_version
;
2632 if (pe_file_alignment
> pe_section_alignment
)
2634 char file_alignment
[20], section_alignment
[20];
2636 sprintf_vma (file_alignment
, pe_file_alignment
);
2637 sprintf_vma (section_alignment
, pe_section_alignment
);
2638 non_fatal (_("warning: file alignment (0x%s) > section alignment (0x%s)"),
2640 file_alignment
, section_alignment
);
2647 if (osympp
!= isympp
)
2653 symsize
= bfd_get_symtab_upper_bound (ibfd
);
2656 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
2660 osympp
= isympp
= (asymbol
**) xmalloc (symsize
);
2661 symcount
= bfd_canonicalize_symtab (ibfd
, isympp
);
2664 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
2667 /* PR 17512: file: d6323821
2668 If the symbol table could not be loaded do not pretend that we have
2669 any symbols. This trips us up later on when we load the relocs. */
2673 osympp
= isympp
= NULL
;
2676 /* BFD mandates that all output sections be created and sizes set before
2677 any output is done. Thus, we traverse all sections multiple times. */
2678 bfd_map_over_sections (ibfd
, setup_section
, obfd
);
2680 if (!extract_symbol
)
2681 setup_bfd_headers (ibfd
, obfd
);
2683 if (add_sections
!= NULL
)
2685 struct section_add
*padd
;
2686 struct section_list
*pset
;
2688 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
2692 pset
= find_section_list (padd
->name
, FALSE
,
2693 SECTION_CONTEXT_SET_FLAGS
);
2695 flags
= pset
->flags
| SEC_HAS_CONTENTS
;
2697 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DATA
;
2699 /* bfd_make_section_with_flags() does not return very helpful
2700 error codes, so check for the most likely user error first. */
2701 if (bfd_get_section_by_name (obfd
, padd
->name
))
2703 bfd_nonfatal_message (NULL
, obfd
, NULL
,
2704 _("can't add section '%s'"), padd
->name
);
2709 /* We use LINKER_CREATED here so that the backend hooks
2710 will create any special section type information,
2711 instead of presuming we know what we're doing merely
2712 because we set the flags. */
2713 padd
->section
= bfd_make_section_with_flags
2714 (obfd
, padd
->name
, flags
| SEC_LINKER_CREATED
);
2715 if (padd
->section
== NULL
)
2717 bfd_nonfatal_message (NULL
, obfd
, NULL
,
2718 _("can't create section `%s'"),
2724 if (! bfd_set_section_size (obfd
, padd
->section
, padd
->size
))
2726 bfd_nonfatal_message (NULL
, obfd
, padd
->section
, NULL
);
2730 pset
= find_section_list (padd
->name
, FALSE
,
2731 SECTION_CONTEXT_SET_VMA
| SECTION_CONTEXT_ALTER_VMA
);
2733 && ! bfd_set_section_vma (obfd
, padd
->section
, pset
->vma_val
))
2735 bfd_nonfatal_message (NULL
, obfd
, padd
->section
, NULL
);
2739 pset
= find_section_list (padd
->name
, FALSE
,
2740 SECTION_CONTEXT_SET_LMA
| SECTION_CONTEXT_ALTER_LMA
);
2743 padd
->section
->lma
= pset
->lma_val
;
2745 if (! bfd_set_section_alignment
2746 (obfd
, padd
->section
,
2747 bfd_section_alignment (obfd
, padd
->section
)))
2749 bfd_nonfatal_message (NULL
, obfd
, padd
->section
, NULL
);
2756 if (update_sections
!= NULL
)
2758 struct section_add
*pupdate
;
2760 for (pupdate
= update_sections
;
2762 pupdate
= pupdate
->next
)
2764 pupdate
->section
= bfd_get_section_by_name (ibfd
, pupdate
->name
);
2765 if (pupdate
->section
== NULL
)
2767 non_fatal (_("error: %s not found, can't be updated"), pupdate
->name
);
2771 osec
= pupdate
->section
->output_section
;
2772 if (! bfd_set_section_size (obfd
, osec
, pupdate
->size
))
2774 bfd_nonfatal_message (NULL
, obfd
, osec
, NULL
);
2782 /* This palaver is necessary because we must set the output
2783 section size first, before its contents are ready. */
2784 osec
= bfd_get_section_by_name (ibfd
, GNU_BUILD_ATTRS_SECTION_NAME
);
2785 if (osec
&& is_merged_note_section (ibfd
, osec
))
2789 size
= bfd_get_section_size (osec
);
2792 bfd_nonfatal_message (NULL
, ibfd
, osec
, _("warning: note section is empty"));
2793 merge_notes
= FALSE
;
2795 else if (! bfd_get_full_section_contents (ibfd
, osec
, & merged_notes
))
2797 bfd_nonfatal_message (NULL
, ibfd
, osec
, _("warning: could not load note section"));
2798 free (merged_notes
);
2799 merged_notes
= NULL
;
2800 merge_notes
= FALSE
;
2804 merged_size
= merge_gnu_build_notes (ibfd
, osec
, size
, merged_notes
);
2805 if (merged_size
== size
)
2807 /* Merging achieves nothing. */
2808 free (merged_notes
);
2809 merged_notes
= NULL
;
2810 merge_notes
= FALSE
;
2815 if (osec
->output_section
== NULL
2816 || ! bfd_set_section_size (obfd
, osec
->output_section
, merged_size
))
2818 bfd_nonfatal_message (NULL
, obfd
, osec
, _("warning: failed to set merged notes size"));
2819 free (merged_notes
);
2820 merged_notes
= NULL
;
2821 merge_notes
= FALSE
;
2829 if (dump_sections
!= NULL
)
2831 struct section_add
* pdump
;
2833 for (pdump
= dump_sections
; pdump
!= NULL
; pdump
= pdump
->next
)
2835 osec
= bfd_get_section_by_name (ibfd
, pdump
->name
);
2838 bfd_nonfatal_message (NULL
, ibfd
, NULL
,
2839 _("can't dump section '%s' - it does not exist"),
2844 if ((bfd_get_section_flags (ibfd
, osec
) & SEC_HAS_CONTENTS
) == 0)
2846 bfd_nonfatal_message (NULL
, ibfd
, osec
,
2847 _("can't dump section - it has no contents"));
2851 bfd_size_type size
= bfd_get_section_size (osec
);
2854 bfd_nonfatal_message (NULL
, ibfd
, osec
,
2855 _("can't dump section - it is empty"));
2860 f
= fopen (pdump
->filename
, FOPEN_WB
);
2863 bfd_nonfatal_message (pdump
->filename
, NULL
, NULL
,
2864 _("could not open section dump file"));
2869 if (bfd_malloc_and_get_section (ibfd
, osec
, &contents
))
2871 if (fwrite (contents
, 1, size
, f
) != size
)
2873 non_fatal (_("error writing section contents to %s (error: %s)"),
2882 bfd_nonfatal_message (NULL
, ibfd
, osec
,
2883 _("could not retrieve section contents"));
2890 if (gnu_debuglink_filename
!= NULL
)
2892 /* PR 15125: Give a helpful warning message if
2893 the debuglink section already exists, and
2894 allow the rest of the copy to complete. */
2895 if (bfd_get_section_by_name (obfd
, ".gnu_debuglink"))
2897 non_fatal (_("%s: debuglink section already exists"),
2898 bfd_get_filename (obfd
));
2899 gnu_debuglink_filename
= NULL
;
2903 gnu_debuglink_section
= bfd_create_gnu_debuglink_section
2904 (obfd
, gnu_debuglink_filename
);
2906 if (gnu_debuglink_section
== NULL
)
2908 bfd_nonfatal_message (NULL
, obfd
, NULL
,
2909 _("cannot create debug link section `%s'"),
2910 gnu_debuglink_filename
);
2914 /* Special processing for PE format files. We
2915 have no way to distinguish PE from COFF here. */
2916 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
)
2918 bfd_vma debuglink_vma
;
2919 asection
* highest_section
;
2921 /* The PE spec requires that all sections be adjacent and sorted
2922 in ascending order of VMA. It also specifies that debug
2923 sections should be last. This is despite the fact that debug
2924 sections are not loaded into memory and so in theory have no
2927 This means that the debuglink section must be given a non-zero
2928 VMA which makes it contiguous with other debug sections. So
2929 walk the current section list, find the section with the
2930 highest VMA and start the debuglink section after that one. */
2931 for (osec
= obfd
->sections
, highest_section
= NULL
;
2935 && (highest_section
== NULL
2936 || osec
->vma
> highest_section
->vma
))
2937 highest_section
= osec
;
2939 if (highest_section
)
2940 debuglink_vma
= BFD_ALIGN (highest_section
->vma
2941 + highest_section
->size
,
2942 /* FIXME: We ought to be using
2943 COFF_PAGE_SIZE here or maybe
2944 bfd_get_section_alignment() (if it
2945 was set) but since this is for PE
2946 and we know the required alignment
2947 it is easier just to hard code it. */
2950 /* Umm, not sure what to do in this case. */
2951 debuglink_vma
= 0x1000;
2953 bfd_set_section_vma (obfd
, gnu_debuglink_section
, debuglink_vma
);
2958 c
= bfd_count_sections (obfd
);
2960 && (gap_fill_set
|| pad_to_set
))
2964 /* We must fill in gaps between the sections and/or we must pad
2965 the last section to a specified address. We do this by
2966 grabbing a list of the sections, sorting them by VMA, and
2967 increasing the section sizes as required to fill the gaps.
2968 We write out the gap contents below. */
2970 osections
= (asection
**) xmalloc (c
* sizeof (asection
*));
2972 bfd_map_over_sections (obfd
, get_sections
, &set
);
2974 qsort (osections
, c
, sizeof (asection
*), compare_section_lma
);
2976 gaps
= (bfd_size_type
*) xmalloc (c
* sizeof (bfd_size_type
));
2977 memset (gaps
, 0, c
* sizeof (bfd_size_type
));
2981 for (i
= 0; i
< c
- 1; i
++)
2985 bfd_vma gap_start
, gap_stop
;
2987 flags
= bfd_get_section_flags (obfd
, osections
[i
]);
2988 if ((flags
& SEC_HAS_CONTENTS
) == 0
2989 || (flags
& SEC_LOAD
) == 0)
2992 size
= bfd_section_size (obfd
, osections
[i
]);
2993 gap_start
= bfd_section_lma (obfd
, osections
[i
]) + size
;
2994 gap_stop
= bfd_section_lma (obfd
, osections
[i
+ 1]);
2995 if (gap_start
< gap_stop
)
2997 if (! bfd_set_section_size (obfd
, osections
[i
],
2998 size
+ (gap_stop
- gap_start
)))
3000 bfd_nonfatal_message (NULL
, obfd
, osections
[i
],
3001 _("Can't fill gap after section"));
3005 gaps
[i
] = gap_stop
- gap_start
;
3006 if (max_gap
< gap_stop
- gap_start
)
3007 max_gap
= gap_stop
- gap_start
;
3017 lma
= bfd_section_lma (obfd
, osections
[c
- 1]);
3018 size
= bfd_section_size (obfd
, osections
[c
- 1]);
3019 if (lma
+ size
< pad_to
)
3021 if (! bfd_set_section_size (obfd
, osections
[c
- 1],
3024 bfd_nonfatal_message (NULL
, obfd
, osections
[c
- 1],
3025 _("can't add padding"));
3030 gaps
[c
- 1] = pad_to
- (lma
+ size
);
3031 if (max_gap
< pad_to
- (lma
+ size
))
3032 max_gap
= pad_to
- (lma
+ size
);
3038 /* Symbol filtering must happen after the output sections
3039 have been created, but before their contents are set. */
3041 if (convert_debugging
)
3042 dhandle
= read_debugging_info (ibfd
, isympp
, symcount
, FALSE
);
3044 if (strip_symbols
== STRIP_DEBUG
3045 || strip_symbols
== STRIP_ALL
3046 || strip_symbols
== STRIP_UNNEEDED
3047 || strip_symbols
== STRIP_NONDEBUG
3048 || strip_symbols
== STRIP_DWO
3049 || strip_symbols
== STRIP_NONDWO
3050 || discard_locals
!= LOCALS_UNDEF
3052 || htab_elements (strip_specific_htab
) != 0
3053 || htab_elements (keep_specific_htab
) != 0
3054 || htab_elements (localize_specific_htab
) != 0
3055 || htab_elements (globalize_specific_htab
) != 0
3056 || htab_elements (keepglobal_specific_htab
) != 0
3057 || htab_elements (weaken_specific_htab
) != 0
3058 || htab_elements (redefine_specific_htab
) != 0
3059 || prefix_symbols_string
3062 || convert_debugging
3063 || change_leading_char
3064 || remove_leading_char
3065 || section_rename_list
3069 /* Mark symbols used in output relocations so that they
3070 are kept, even if they are local labels or static symbols.
3072 Note we iterate over the input sections examining their
3073 relocations since the relocations for the output sections
3074 haven't been set yet. mark_symbols_used_in_relocations will
3075 ignore input sections which have no corresponding output
3077 if (strip_symbols
!= STRIP_ALL
)
3079 bfd_set_error (bfd_error_no_error
);
3080 bfd_map_over_sections (ibfd
,
3081 mark_symbols_used_in_relocations
,
3083 if (bfd_get_error () != bfd_error_no_error
)
3090 osympp
= (asymbol
**) xmalloc ((symcount
+ add_symbols
+ 1) * sizeof (asymbol
*));
3091 symcount
= filter_symbols (ibfd
, obfd
, osympp
, isympp
, symcount
);
3094 if (convert_debugging
&& dhandle
!= NULL
)
3098 res
= write_debugging_info (obfd
, dhandle
, &symcount
, &osympp
);
3101 dhandle
= NULL
; /* Paranoia... */
3110 bfd_set_symtab (obfd
, osympp
, symcount
);
3112 /* This has to happen before section positions are set. */
3113 bfd_map_over_sections (ibfd
, copy_relocations_in_section
, obfd
);
3115 /* This has to happen after the symbol table has been set. */
3116 bfd_map_over_sections (ibfd
, copy_section
, obfd
);
3118 if (add_sections
!= NULL
)
3120 struct section_add
*padd
;
3122 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
3124 if (! bfd_set_section_contents (obfd
, padd
->section
, padd
->contents
,
3127 bfd_nonfatal_message (NULL
, obfd
, padd
->section
, NULL
);
3133 if (update_sections
!= NULL
)
3135 struct section_add
*pupdate
;
3137 for (pupdate
= update_sections
;
3139 pupdate
= pupdate
->next
)
3141 osec
= pupdate
->section
->output_section
;
3142 if (! bfd_set_section_contents (obfd
, osec
, pupdate
->contents
,
3145 bfd_nonfatal_message (NULL
, obfd
, osec
, NULL
);
3153 osec
= bfd_get_section_by_name (obfd
, GNU_BUILD_ATTRS_SECTION_NAME
);
3154 if (osec
&& is_merged_note_section (obfd
, osec
))
3156 if (! bfd_set_section_contents (obfd
, osec
, merged_notes
, 0, merged_size
))
3158 bfd_nonfatal_message (NULL
, obfd
, osec
, _("error: failed to copy merged notes into output"));
3162 else if (! is_strip
)
3163 bfd_nonfatal_message (NULL
, obfd
, osec
, _("could not find any mergeable note sections"));
3164 free (merged_notes
);
3165 merged_notes
= NULL
;
3166 merge_notes
= FALSE
;
3169 if (gnu_debuglink_filename
!= NULL
)
3171 if (! bfd_fill_in_gnu_debuglink_section
3172 (obfd
, gnu_debuglink_section
, gnu_debuglink_filename
))
3174 bfd_nonfatal_message (NULL
, obfd
, NULL
,
3175 _("cannot fill debug link section `%s'"),
3176 gnu_debuglink_filename
);
3181 if (gap_fill_set
|| pad_to_set
)
3185 /* Fill in the gaps. */
3188 buf
= (bfd_byte
*) xmalloc (max_gap
);
3189 memset (buf
, gap_fill
, max_gap
);
3191 c
= bfd_count_sections (obfd
);
3192 for (i
= 0; i
< c
; i
++)
3200 off
= bfd_section_size (obfd
, osections
[i
]) - left
;
3211 if (! bfd_set_section_contents (obfd
, osections
[i
], buf
,
3214 bfd_nonfatal_message (NULL
, obfd
, osections
[i
], NULL
);
3230 /* Allow the BFD backend to copy any private data it understands
3231 from the input BFD to the output BFD. This is done last to
3232 permit the routine to look at the filtered symbol table, which is
3233 important for the ECOFF code at least. */
3234 if (! bfd_copy_private_bfd_data (ibfd
, obfd
))
3236 bfd_nonfatal_message (NULL
, obfd
, NULL
,
3237 _("error copying private BFD data"));
3241 /* Switch to the alternate machine code. We have to do this at the
3242 very end, because we only initialize the header when we create
3243 the first section. */
3244 if (use_alt_mach_code
!= 0)
3246 if (! bfd_alt_mach_code (obfd
, use_alt_mach_code
))
3248 non_fatal (_("this target does not support %lu alternative machine codes"),
3250 if (bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
3252 non_fatal (_("treating that number as an absolute e_machine value instead"));
3253 elf_elfheader (obfd
)->e_machine
= use_alt_mach_code
;
3256 non_fatal (_("ignoring the alternative value"));
3263 /* Read each archive element in turn from IBFD, copy the
3264 contents to temp file, and keep the temp file handle.
3265 If 'force_output_target' is TRUE then make sure that
3266 all elements in the new archive are of the type
3270 copy_archive (bfd
*ibfd
, bfd
*obfd
, const char *output_target
,
3271 bfd_boolean force_output_target
,
3272 const bfd_arch_info_type
*input_arch
)
3276 struct name_list
*next
;
3280 bfd
**ptr
= &obfd
->archive_head
;
3283 const char *filename
;
3285 /* PR 24281: It is not clear what should happen when copying a thin archive.
3286 One part is straight forward - if the output archive is in a different
3287 directory from the input archive then any relative paths in the library
3288 should be adjusted to the new location. But if any transformation
3289 options are active (eg strip, rename, add, etc) then the implication is
3290 that these should be applied to the files pointed to by the archive.
3291 But since objcopy is not destructive, this means that new files must be
3292 created, and there is no guidance for the names of the new files. (Plus
3293 this conflicts with one of the goals of thin libraries - only taking up
3294 a minimal amount of space in the file system).
3296 So for now we fail if an attempt is made to copy such libraries. */
3297 if (ibfd
->is_thin_archive
)
3300 bfd_set_error (bfd_error_invalid_operation
);
3301 bfd_nonfatal_message (NULL
, ibfd
, NULL
,
3302 _("sorry: copying thin archives is not currently supported"));
3306 /* Make a temp directory to hold the contents. */
3307 dir
= make_tempdir (bfd_get_filename (obfd
));
3309 fatal (_("cannot create tempdir for archive copying (error: %s)"),
3312 if (strip_symbols
== STRIP_ALL
)
3313 obfd
->has_armap
= FALSE
;
3315 obfd
->has_armap
= ibfd
->has_armap
;
3316 obfd
->is_thin_archive
= ibfd
->is_thin_archive
;
3319 obfd
->flags
|= BFD_DETERMINISTIC_OUTPUT
;
3323 this_element
= bfd_openr_next_archived_file (ibfd
, NULL
);
3325 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
3328 bfd_nonfatal_message (NULL
, obfd
, NULL
, NULL
);
3329 goto cleanup_and_exit
;
3332 while (!status
&& this_element
!= NULL
)
3338 int stat_status
= 0;
3339 bfd_boolean del
= TRUE
;
3340 bfd_boolean ok_object
;
3342 /* PR binutils/17533: Do not allow directory traversal
3343 outside of the current directory tree by archive members. */
3344 if (! is_valid_archive_path (bfd_get_filename (this_element
)))
3346 non_fatal (_("illegal pathname found in archive member: %s"),
3347 bfd_get_filename (this_element
));
3349 goto cleanup_and_exit
;
3352 /* Create an output file for this member. */
3353 output_name
= concat (dir
, "/",
3354 bfd_get_filename (this_element
), (char *) 0);
3356 /* If the file already exists, make another temp dir. */
3357 if (stat (output_name
, &buf
) >= 0)
3359 char * tmpdir
= make_tempdir (output_name
);
3364 non_fatal (_("cannot create tempdir for archive copying (error: %s)"),
3367 goto cleanup_and_exit
;
3370 l
= (struct name_list
*) xmalloc (sizeof (struct name_list
));
3375 output_name
= concat (tmpdir
, "/",
3376 bfd_get_filename (this_element
), (char *) 0);
3381 stat_status
= bfd_stat_arch_elt (this_element
, &buf
);
3383 if (stat_status
!= 0)
3384 non_fatal (_("internal stat error on %s"),
3385 bfd_get_filename (this_element
));
3388 l
= (struct name_list
*) xmalloc (sizeof (struct name_list
));
3389 l
->name
= output_name
;
3394 ok_object
= bfd_check_format (this_element
, bfd_object
);
3396 bfd_nonfatal_message (NULL
, this_element
, NULL
,
3397 _("Unable to recognise the format of file"));
3399 /* PR binutils/3110: Cope with archives
3400 containing multiple target types. */
3401 if (force_output_target
|| !ok_object
)
3402 output_bfd
= bfd_openw (output_name
, output_target
);
3404 output_bfd
= bfd_openw (output_name
, bfd_get_target (this_element
));
3406 if (output_bfd
== NULL
)
3408 bfd_nonfatal_message (output_name
, NULL
, NULL
, NULL
);
3410 goto cleanup_and_exit
;
3415 del
= !copy_object (this_element
, output_bfd
, input_arch
);
3417 if (del
&& bfd_get_arch (this_element
) == bfd_arch_unknown
)
3418 /* Try again as an unknown object file. */
3420 else if (!bfd_close (output_bfd
))
3422 bfd_nonfatal_message (output_name
, NULL
, NULL
, NULL
);
3423 /* Error in new object file. Don't change archive. */
3430 del
= !copy_unknown_object (this_element
, output_bfd
);
3431 if (!bfd_close_all_done (output_bfd
))
3433 bfd_nonfatal_message (output_name
, NULL
, NULL
, NULL
);
3434 /* Error in new object file. Don't change archive. */
3441 unlink (output_name
);
3446 if (preserve_dates
&& stat_status
== 0)
3447 set_times (output_name
, &buf
);
3449 /* Open the newly output file and attach to our list. */
3450 output_bfd
= bfd_openr (output_name
, output_target
);
3452 l
->obfd
= output_bfd
;
3455 ptr
= &output_bfd
->archive_next
;
3457 last_element
= this_element
;
3459 this_element
= bfd_openr_next_archived_file (ibfd
, last_element
);
3461 bfd_close (last_element
);
3466 filename
= bfd_get_filename (obfd
);
3467 if (!bfd_close (obfd
))
3470 bfd_nonfatal_message (filename
, NULL
, NULL
, NULL
);
3473 filename
= bfd_get_filename (ibfd
);
3474 if (!bfd_close (ibfd
))
3477 bfd_nonfatal_message (filename
, NULL
, NULL
, NULL
);
3481 /* Delete all the files that we opened. */
3483 struct name_list
* next
;
3485 for (l
= list
; l
!= NULL
; l
= next
)
3487 if (l
->obfd
== NULL
)
3491 bfd_close (l
->obfd
);
3503 set_long_section_mode (bfd
*output_bfd
, bfd
*input_bfd
, enum long_section_name_handling style
)
3505 /* This is only relevant to Coff targets. */
3506 if (bfd_get_flavour (output_bfd
) == bfd_target_coff_flavour
)
3509 && bfd_get_flavour (input_bfd
) == bfd_target_coff_flavour
)
3510 style
= bfd_coff_long_section_names (input_bfd
) ? ENABLE
: DISABLE
;
3511 bfd_coff_set_long_section_names (output_bfd
, style
!= DISABLE
);
3515 /* The top-level control. */
3518 copy_file (const char *input_filename
, const char *output_filename
,
3519 const char *input_target
, const char *output_target
,
3520 const bfd_arch_info_type
*input_arch
)
3523 char **obj_matching
;
3524 char **core_matching
;
3525 off_t size
= get_file_size (input_filename
);
3530 non_fatal (_("error: the input file '%s' is empty"),
3536 /* To allow us to do "strip *" without dying on the first
3537 non-object file, failures are nonfatal. */
3538 ibfd
= bfd_openr (input_filename
, input_target
);
3541 bfd_nonfatal_message (input_filename
, NULL
, NULL
, NULL
);
3546 switch (do_debug_sections
)
3550 case compress_gnu_zlib
:
3551 case compress_gabi_zlib
:
3552 ibfd
->flags
|= BFD_COMPRESS
;
3553 /* Don't check if input is ELF here since this information is
3554 only available after bfd_check_format_matches is called. */
3555 if (do_debug_sections
!= compress_gnu_zlib
)
3556 ibfd
->flags
|= BFD_COMPRESS_GABI
;
3559 ibfd
->flags
|= BFD_DECOMPRESS
;
3565 switch (do_elf_stt_common
)
3567 case elf_stt_common
:
3568 ibfd
->flags
|= BFD_CONVERT_ELF_COMMON
| BFD_USE_ELF_STT_COMMON
;
3571 case no_elf_stt_common
:
3572 ibfd
->flags
|= BFD_CONVERT_ELF_COMMON
;
3578 if (bfd_check_format (ibfd
, bfd_archive
))
3580 bfd_boolean force_output_target
;
3583 /* bfd_get_target does not return the correct value until
3584 bfd_check_format succeeds. */
3585 if (output_target
== NULL
)
3587 output_target
= bfd_get_target (ibfd
);
3588 force_output_target
= FALSE
;
3591 force_output_target
= TRUE
;
3593 obfd
= bfd_openw (output_filename
, output_target
);
3596 bfd_nonfatal_message (output_filename
, NULL
, NULL
, NULL
);
3600 /* This is a no-op on non-Coff targets. */
3601 set_long_section_mode (obfd
, ibfd
, long_section_names
);
3603 copy_archive (ibfd
, obfd
, output_target
, force_output_target
, input_arch
);
3605 else if (bfd_check_format_matches (ibfd
, bfd_object
, &obj_matching
))
3610 /* bfd_get_target does not return the correct value until
3611 bfd_check_format succeeds. */
3612 if (output_target
== NULL
)
3613 output_target
= bfd_get_target (ibfd
);
3615 obfd
= bfd_openw (output_filename
, output_target
);
3618 bfd_nonfatal_message (output_filename
, NULL
, NULL
, NULL
);
3622 /* This is a no-op on non-Coff targets. */
3623 set_long_section_mode (obfd
, ibfd
, long_section_names
);
3625 if (! copy_object (ibfd
, obfd
, input_arch
))
3628 /* PR 17512: file: 0f15796a.
3629 If the file could not be copied it may not be in a writeable
3630 state. So use bfd_close_all_done to avoid the possibility of
3631 writing uninitialised data into the file. */
3632 if (! (status
? bfd_close_all_done (obfd
) : bfd_close (obfd
)))
3635 bfd_nonfatal_message (output_filename
, NULL
, NULL
, NULL
);
3639 if (!bfd_close (ibfd
))
3642 bfd_nonfatal_message (input_filename
, NULL
, NULL
, NULL
);
3648 bfd_error_type obj_error
= bfd_get_error ();
3649 bfd_error_type core_error
;
3651 if (bfd_check_format_matches (ibfd
, bfd_core
, &core_matching
))
3653 /* This probably can't happen.. */
3654 if (obj_error
== bfd_error_file_ambiguously_recognized
)
3655 free (obj_matching
);
3659 core_error
= bfd_get_error ();
3660 /* Report the object error in preference to the core error. */
3661 if (obj_error
!= core_error
)
3662 bfd_set_error (obj_error
);
3664 bfd_nonfatal_message (input_filename
, NULL
, NULL
, NULL
);
3666 if (obj_error
== bfd_error_file_ambiguously_recognized
)
3668 list_matching_formats (obj_matching
);
3669 free (obj_matching
);
3671 if (core_error
== bfd_error_file_ambiguously_recognized
)
3673 list_matching_formats (core_matching
);
3674 free (core_matching
);
3681 /* Add a name to the section renaming list. */
3684 add_section_rename (const char * old_name
, const char * new_name
,
3687 section_rename
* srename
;
3689 /* Check for conflicts first. */
3690 for (srename
= section_rename_list
; srename
!= NULL
; srename
= srename
->next
)
3691 if (strcmp (srename
->old_name
, old_name
) == 0)
3693 /* Silently ignore duplicate definitions. */
3694 if (strcmp (srename
->new_name
, new_name
) == 0
3695 && srename
->flags
== flags
)
3698 fatal (_("Multiple renames of section %s"), old_name
);
3701 srename
= (section_rename
*) xmalloc (sizeof (* srename
));
3703 srename
->old_name
= old_name
;
3704 srename
->new_name
= new_name
;
3705 srename
->flags
= flags
;
3706 srename
->next
= section_rename_list
;
3708 section_rename_list
= srename
;
3711 /* Check the section rename list for a new name of the input section
3712 called OLD_NAME. Returns the new name if one is found and sets
3713 RETURNED_FLAGS if non-NULL to the flags to be used for this section. */
3716 find_section_rename (const char *old_name
, flagword
*returned_flags
)
3718 const section_rename
*srename
;
3720 for (srename
= section_rename_list
; srename
!= NULL
; srename
= srename
->next
)
3721 if (strcmp (srename
->old_name
, old_name
) == 0)
3723 if (returned_flags
!= NULL
&& srename
->flags
!= (flagword
) -1)
3724 *returned_flags
= srename
->flags
;
3726 return srename
->new_name
;
3732 /* Once each of the sections is copied, we may still need to do some
3733 finalization work for private section headers. Do that here. */
3736 setup_bfd_headers (bfd
*ibfd
, bfd
*obfd
)
3738 /* Allow the BFD backend to copy any private data it understands
3739 from the input section to the output section. */
3740 if (! bfd_copy_private_header_data (ibfd
, obfd
))
3743 bfd_nonfatal_message (NULL
, ibfd
, NULL
,
3744 _("error in private header data"));
3748 /* All went well. */
3752 /* Create a section in OBFD with the same
3753 name and attributes as ISECTION in IBFD. */
3756 setup_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
3758 bfd
*obfd
= (bfd
*) obfdarg
;
3759 struct section_list
*p
;
3767 char *prefix
= NULL
;
3768 bfd_boolean make_nobits
;
3770 if (is_strip_section (ibfd
, isection
))
3773 /* Get the, possibly new, name of the output section. */
3774 name
= bfd_section_name (ibfd
, isection
);
3775 flags
= bfd_get_section_flags (ibfd
, isection
);
3776 name
= find_section_rename (name
, &flags
);
3778 /* Prefix sections. */
3779 if ((prefix_alloc_sections_string
)
3780 && (bfd_get_section_flags (ibfd
, isection
) & SEC_ALLOC
))
3781 prefix
= prefix_alloc_sections_string
;
3782 else if (prefix_sections_string
)
3783 prefix
= prefix_sections_string
;
3789 n
= (char *) xmalloc (strlen (prefix
) + strlen (name
) + 1);
3795 make_nobits
= FALSE
;
3797 p
= find_section_list (bfd_section_name (ibfd
, isection
), FALSE
,
3798 SECTION_CONTEXT_SET_FLAGS
);
3800 flags
= p
->flags
| (flags
& (SEC_HAS_CONTENTS
| SEC_RELOC
));
3801 else if (strip_symbols
== STRIP_NONDEBUG
3802 && (flags
& (SEC_ALLOC
| SEC_GROUP
)) != 0
3803 && !is_nondebug_keep_contents_section (ibfd
, isection
))
3805 flags
&= ~(SEC_HAS_CONTENTS
| SEC_LOAD
| SEC_GROUP
);
3806 if (obfd
->xvec
->flavour
== bfd_target_elf_flavour
)
3810 /* Twiddle the input section flags so that it seems to
3811 elf.c:copy_private_bfd_data that section flags have not
3812 changed between input and output sections. This hack
3813 prevents wholesale rewriting of the program headers. */
3814 isection
->flags
&= ~(SEC_HAS_CONTENTS
| SEC_LOAD
| SEC_GROUP
);
3818 osection
= bfd_make_section_anyway_with_flags (obfd
, name
, flags
);
3820 if (osection
== NULL
)
3822 err
= _("failed to create output section");
3827 elf_section_type (osection
) = SHT_NOBITS
;
3829 size
= bfd_section_size (ibfd
, isection
);
3830 size
= bfd_convert_section_size (ibfd
, isection
, obfd
, size
);
3832 size
= (size
+ interleave
- 1) / interleave
* copy_width
;
3833 else if (extract_symbol
)
3835 if (! bfd_set_section_size (obfd
, osection
, size
))
3837 err
= _("failed to set size");
3841 vma
= bfd_section_vma (ibfd
, isection
);
3842 p
= find_section_list (bfd_section_name (ibfd
, isection
), FALSE
,
3843 SECTION_CONTEXT_ALTER_VMA
| SECTION_CONTEXT_SET_VMA
);
3846 if (p
->context
& SECTION_CONTEXT_SET_VMA
)
3852 vma
+= change_section_address
;
3854 if (! bfd_set_section_vma (obfd
, osection
, vma
))
3856 err
= _("failed to set vma");
3860 lma
= isection
->lma
;
3861 p
= find_section_list (bfd_section_name (ibfd
, isection
), FALSE
,
3862 SECTION_CONTEXT_ALTER_LMA
| SECTION_CONTEXT_SET_LMA
);
3865 if (p
->context
& SECTION_CONTEXT_ALTER_LMA
)
3871 lma
+= change_section_address
;
3873 osection
->lma
= lma
;
3875 /* FIXME: This is probably not enough. If we change the LMA we
3876 may have to recompute the header for the file as well. */
3877 if (!bfd_set_section_alignment (obfd
,
3879 bfd_section_alignment (ibfd
, isection
)))
3881 err
= _("failed to set alignment");
3885 /* Copy merge entity size. */
3886 osection
->entsize
= isection
->entsize
;
3888 /* Copy compress status. */
3889 osection
->compress_status
= isection
->compress_status
;
3891 /* This used to be mangle_section; we do here to avoid using
3892 bfd_get_section_by_name since some formats allow multiple
3893 sections with the same name. */
3894 isection
->output_section
= osection
;
3895 isection
->output_offset
= 0;
3897 if ((isection
->flags
& SEC_GROUP
) != 0)
3899 asymbol
*gsym
= group_signature (isection
);
3903 gsym
->flags
|= BSF_KEEP
;
3904 if (ibfd
->xvec
->flavour
== bfd_target_elf_flavour
)
3905 elf_group_id (isection
) = gsym
;
3909 /* Allow the BFD backend to copy any private data it understands
3910 from the input section to the output section. */
3911 if (!bfd_copy_private_section_data (ibfd
, isection
, obfd
, osection
))
3913 err
= _("failed to copy private data");
3917 /* All went well. */
3922 bfd_nonfatal_message (NULL
, obfd
, osection
, err
);
3925 /* Return TRUE if input section ISECTION should be skipped. */
3928 skip_section (bfd
*ibfd
, sec_ptr isection
, bfd_boolean skip_copy
)
3934 /* If we have already failed earlier on,
3935 do not keep on generating complaints now. */
3942 if (is_strip_section (ibfd
, isection
))
3945 if (is_update_section (ibfd
, isection
))
3948 /* When merging a note section we skip the copying of the contents,
3949 but not the copying of the relocs associated with the contents. */
3950 if (skip_copy
&& is_merged_note_section (ibfd
, isection
))
3953 flags
= bfd_get_section_flags (ibfd
, isection
);
3954 if ((flags
& SEC_GROUP
) != 0)
3957 osection
= isection
->output_section
;
3958 size
= bfd_get_section_size (isection
);
3960 if (size
== 0 || osection
== 0)
3966 /* Add section SECTION_PATTERN to the list of sections that will have their
3967 relocations removed. */
3970 handle_remove_relocations_option (const char *section_pattern
)
3972 find_section_list (section_pattern
, TRUE
, SECTION_CONTEXT_REMOVE_RELOCS
);
3975 /* Return TRUE if ISECTION from IBFD should have its relocations removed,
3976 otherwise return FALSE. If the user has requested that relocations be
3977 removed from a section that does not have relocations then this
3978 function will still return TRUE. */
3981 discard_relocations (bfd
*ibfd ATTRIBUTE_UNUSED
, asection
*isection
)
3983 return (find_section_list (bfd_section_name (ibfd
, isection
), FALSE
,
3984 SECTION_CONTEXT_REMOVE_RELOCS
) != NULL
);
3987 /* Wrapper for dealing with --remove-section (-R) command line arguments.
3988 A special case is detected here, if the user asks to remove a relocation
3989 section (one starting with ".rela" or ".rel") then this removal must
3990 be done using a different technique in a relocatable object. */
3993 handle_remove_section_option (const char *section_pattern
)
3995 find_section_list (section_pattern
, TRUE
, SECTION_CONTEXT_REMOVE
);
3996 if (strncmp (section_pattern
, ".rel", 4) == 0)
3998 section_pattern
+= 4;
3999 if (*section_pattern
== 'a')
4001 if (*section_pattern
)
4002 handle_remove_relocations_option (section_pattern
);
4004 sections_removed
= TRUE
;
4007 /* Copy relocations in input section ISECTION of IBFD to an output
4008 section with the same name in OBFDARG. If stripping then don't
4009 copy any relocation info. */
4012 copy_relocations_in_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
4014 bfd
*obfd
= (bfd
*) obfdarg
;
4020 if (skip_section (ibfd
, isection
, FALSE
))
4023 osection
= isection
->output_section
;
4025 /* Core files and DWO files do not need to be relocated. */
4026 if (bfd_get_format (obfd
) == bfd_core
4027 || strip_symbols
== STRIP_NONDWO
4028 || discard_relocations (ibfd
, isection
))
4032 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
4036 /* Do not complain if the target does not support relocations. */
4037 if (relsize
== -1 && bfd_get_error () == bfd_error_invalid_operation
)
4042 bfd_nonfatal_message (NULL
, ibfd
, isection
, NULL
);
4050 bfd_set_reloc (obfd
, osection
, NULL
, 0);
4051 osection
->flags
&= ~SEC_RELOC
;
4055 if (isection
->orelocation
!= NULL
)
4057 /* Some other function has already set up the output relocs
4058 for us, so scan those instead of the default relocs. */
4059 relcount
= isection
->reloc_count
;
4060 relpp
= isection
->orelocation
;
4064 relpp
= (arelent
**) xmalloc (relsize
);
4065 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, isympp
);
4069 bfd_nonfatal_message (NULL
, ibfd
, isection
,
4070 _("relocation count is negative"));
4075 if (strip_symbols
== STRIP_ALL
)
4077 /* Remove relocations which are not in
4078 keep_strip_specific_list. */
4079 arelent
**temp_relpp
;
4080 long temp_relcount
= 0;
4083 temp_relpp
= (arelent
**) xmalloc (relsize
);
4084 for (i
= 0; i
< relcount
; i
++)
4086 /* PR 17512: file: 9e907e0c. */
4087 if (relpp
[i
]->sym_ptr_ptr
4089 && * relpp
[i
]->sym_ptr_ptr
)
4090 if (is_specified_symbol (bfd_asymbol_name (*relpp
[i
]->sym_ptr_ptr
),
4091 keep_specific_htab
))
4092 temp_relpp
[temp_relcount
++] = relpp
[i
];
4094 relcount
= temp_relcount
;
4095 if (isection
->orelocation
== NULL
)
4100 bfd_set_reloc (obfd
, osection
, relcount
== 0 ? NULL
: relpp
, relcount
);
4103 osection
->flags
&= ~SEC_RELOC
;
4109 /* Copy the data of input section ISECTION of IBFD
4110 to an output section with the same name in OBFD. */
4113 copy_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
4115 bfd
*obfd
= (bfd
*) obfdarg
;
4116 struct section_list
*p
;
4120 if (skip_section (ibfd
, isection
, TRUE
))
4123 osection
= isection
->output_section
;
4124 /* The output SHF_COMPRESSED section size is different from input if
4125 ELF classes of input and output aren't the same. We can't use
4126 the output section size since --interleave will shrink the output
4127 section. Size will be updated if the section is converted. */
4128 size
= bfd_get_section_size (isection
);
4130 if (bfd_get_section_flags (ibfd
, isection
) & SEC_HAS_CONTENTS
4131 && bfd_get_section_flags (obfd
, osection
) & SEC_HAS_CONTENTS
)
4133 bfd_byte
*memhunk
= NULL
;
4135 if (!bfd_get_full_section_contents (ibfd
, isection
, &memhunk
)
4136 || !bfd_convert_section_contents (ibfd
, isection
, obfd
,
4140 bfd_nonfatal_message (NULL
, ibfd
, isection
, NULL
);
4147 /* We don't handle leftover bytes (too many possible behaviors,
4148 and we don't know what the user wants). The section length
4149 must be a multiple of the number of bytes to swap. */
4150 if ((size
% reverse_bytes
) == 0)
4155 for (i
= 0; i
< size
; i
+= reverse_bytes
)
4156 for (j
= 0; j
< (unsigned long)(reverse_bytes
/ 2); j
++)
4158 bfd_byte
*m
= (bfd_byte
*) memhunk
;
4161 m
[i
+ j
] = m
[(i
+ reverse_bytes
) - (j
+ 1)];
4162 m
[(i
+ reverse_bytes
) - (j
+ 1)] = b
;
4166 /* User must pad the section up in order to do this. */
4167 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
4168 bfd_section_name (ibfd
, isection
), reverse_bytes
);
4173 /* Keep only every `copy_byte'th byte in MEMHUNK. */
4174 char *from
= (char *) memhunk
+ copy_byte
;
4175 char *to
= (char *) memhunk
;
4176 char *end
= (char *) memhunk
+ size
;
4179 /* If the section address is not exactly divisible by the interleave,
4180 then we must bias the from address. If the copy_byte is less than
4181 the bias, then we must skip forward one interleave, and increment
4183 int extra
= isection
->lma
% interleave
;
4185 if (copy_byte
< extra
)
4188 for (; from
< end
; from
+= interleave
)
4189 for (i
= 0; i
< copy_width
; i
++)
4191 if (&from
[i
] >= end
)
4196 size
= (size
+ interleave
- 1 - copy_byte
) / interleave
* copy_width
;
4197 osection
->lma
/= interleave
;
4198 if (copy_byte
< extra
)
4202 if (!bfd_set_section_contents (obfd
, osection
, memhunk
, 0, size
))
4205 bfd_nonfatal_message (NULL
, obfd
, osection
, NULL
);
4211 else if ((p
= find_section_list (bfd_get_section_name (ibfd
, isection
),
4212 FALSE
, SECTION_CONTEXT_SET_FLAGS
)) != NULL
4213 && (p
->flags
& SEC_HAS_CONTENTS
) != 0)
4215 void *memhunk
= xmalloc (size
);
4217 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
4218 flag--they can just remove the section entirely and add it
4219 back again. However, we do permit them to turn on the
4220 SEC_HAS_CONTENTS flag, and take it to mean that the section
4221 contents should be zeroed out. */
4223 memset (memhunk
, 0, size
);
4224 if (! bfd_set_section_contents (obfd
, osection
, memhunk
, 0, size
))
4227 bfd_nonfatal_message (NULL
, obfd
, osection
, NULL
);
4235 /* Get all the sections. This is used when --gap-fill or --pad-to is
4239 get_sections (bfd
*obfd ATTRIBUTE_UNUSED
, asection
*osection
, void *secppparg
)
4241 asection
***secppp
= (asection
***) secppparg
;
4243 **secppp
= osection
;
4247 /* Sort sections by VMA. This is called via qsort, and is used when
4248 --gap-fill or --pad-to is used. We force non loadable or empty
4249 sections to the front, where they are easier to ignore. */
4252 compare_section_lma (const void *arg1
, const void *arg2
)
4254 const asection
*const *sec1
= (const asection
* const *) arg1
;
4255 const asection
*const *sec2
= (const asection
* const *) arg2
;
4256 flagword flags1
, flags2
;
4258 /* Sort non loadable sections to the front. */
4259 flags1
= (*sec1
)->flags
;
4260 flags2
= (*sec2
)->flags
;
4261 if ((flags1
& SEC_HAS_CONTENTS
) == 0
4262 || (flags1
& SEC_LOAD
) == 0)
4264 if ((flags2
& SEC_HAS_CONTENTS
) != 0
4265 && (flags2
& SEC_LOAD
) != 0)
4270 if ((flags2
& SEC_HAS_CONTENTS
) == 0
4271 || (flags2
& SEC_LOAD
) == 0)
4275 /* Sort sections by LMA. */
4276 if ((*sec1
)->lma
> (*sec2
)->lma
)
4278 else if ((*sec1
)->lma
< (*sec2
)->lma
)
4281 /* Sort sections with the same LMA by size. */
4282 if (bfd_get_section_size (*sec1
) > bfd_get_section_size (*sec2
))
4284 else if (bfd_get_section_size (*sec1
) < bfd_get_section_size (*sec2
))
4290 /* Mark all the symbols which will be used in output relocations with
4291 the BSF_KEEP flag so that those symbols will not be stripped.
4293 Ignore relocations which will not appear in the output file. */
4296 mark_symbols_used_in_relocations (bfd
*ibfd
, sec_ptr isection
, void *symbolsarg
)
4298 asymbol
**symbols
= (asymbol
**) symbolsarg
;
4303 /* Ignore an input section with no corresponding output section. */
4304 if (isection
->output_section
== NULL
)
4307 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
4310 /* Do not complain if the target does not support relocations. */
4311 if (relsize
== -1 && bfd_get_error () == bfd_error_invalid_operation
)
4313 bfd_fatal (bfd_get_filename (ibfd
));
4319 relpp
= (arelent
**) xmalloc (relsize
);
4320 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, symbols
);
4322 bfd_fatal (bfd_get_filename (ibfd
));
4324 /* Examine each symbol used in a relocation. If it's not one of the
4325 special bfd section symbols, then mark it with BSF_KEEP. */
4326 for (i
= 0; i
< relcount
; i
++)
4328 /* See PRs 20923 and 20930 for reproducers for the NULL tests. */
4329 if (relpp
[i
]->sym_ptr_ptr
!= NULL
4330 && * relpp
[i
]->sym_ptr_ptr
!= NULL
4331 && *relpp
[i
]->sym_ptr_ptr
!= bfd_com_section_ptr
->symbol
4332 && *relpp
[i
]->sym_ptr_ptr
!= bfd_abs_section_ptr
->symbol
4333 && *relpp
[i
]->sym_ptr_ptr
!= bfd_und_section_ptr
->symbol
)
4334 (*relpp
[i
]->sym_ptr_ptr
)->flags
|= BSF_KEEP
;
4341 /* Write out debugging information. */
4344 write_debugging_info (bfd
*obfd
, void *dhandle
,
4345 long *symcountp ATTRIBUTE_UNUSED
,
4346 asymbol
***symppp ATTRIBUTE_UNUSED
)
4348 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
4349 || bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
4351 bfd_byte
*syms
, *strings
= NULL
;
4352 bfd_size_type symsize
, stringsize
;
4353 asection
*stabsec
, *stabstrsec
;
4356 if (! write_stabs_in_sections_debugging_info (obfd
, dhandle
, &syms
,
4361 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DEBUGGING
;
4362 stabsec
= bfd_make_section_with_flags (obfd
, ".stab", flags
);
4363 stabstrsec
= bfd_make_section_with_flags (obfd
, ".stabstr", flags
);
4365 || stabstrsec
== NULL
4366 || ! bfd_set_section_size (obfd
, stabsec
, symsize
)
4367 || ! bfd_set_section_size (obfd
, stabstrsec
, stringsize
)
4368 || ! bfd_set_section_alignment (obfd
, stabsec
, 2)
4369 || ! bfd_set_section_alignment (obfd
, stabstrsec
, 0))
4371 bfd_nonfatal_message (NULL
, obfd
, NULL
,
4372 _("can't create debugging section"));
4377 /* We can get away with setting the section contents now because
4378 the next thing the caller is going to do is copy over the
4379 real sections. We may someday have to split the contents
4380 setting out of this function. */
4381 if (! bfd_set_section_contents (obfd
, stabsec
, syms
, 0, symsize
)
4382 || ! bfd_set_section_contents (obfd
, stabstrsec
, strings
, 0,
4385 bfd_nonfatal_message (NULL
, obfd
, NULL
,
4386 _("can't set debugging section contents"));
4394 bfd_nonfatal_message (NULL
, obfd
, NULL
,
4395 _("don't know how to write debugging information for %s"),
4396 bfd_get_target (obfd
));
4400 /* If neither -D nor -U was specified explicitly,
4401 then use the configured default. */
4403 default_deterministic (void)
4405 if (deterministic
< 0)
4406 deterministic
= DEFAULT_AR_DETERMINISTIC
;
4410 strip_main (int argc
, char *argv
[])
4412 char *input_target
= NULL
;
4413 char *output_target
= NULL
;
4414 bfd_boolean show_version
= FALSE
;
4415 bfd_boolean formats_info
= FALSE
;
4418 char *output_file
= NULL
;
4419 bfd_boolean merge_notes_set
= FALSE
;
4421 while ((c
= getopt_long (argc
, argv
, "I:O:F:K:MN:R:o:sSpdgxXHhVvwDU",
4422 strip_options
, (int *) 0)) != EOF
)
4427 input_target
= optarg
;
4430 output_target
= optarg
;
4433 input_target
= output_target
= optarg
;
4436 handle_remove_section_option (optarg
);
4438 case OPTION_REMOVE_RELOCS
:
4439 handle_remove_relocations_option (optarg
);
4442 strip_symbols
= STRIP_ALL
;
4446 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
4447 strip_symbols
= STRIP_DEBUG
;
4449 case OPTION_STRIP_DWO
:
4450 strip_symbols
= STRIP_DWO
;
4452 case OPTION_STRIP_UNNEEDED
:
4453 strip_symbols
= STRIP_UNNEEDED
;
4456 add_specific_symbol (optarg
, keep_specific_htab
);
4460 merge_notes_set
= TRUE
;
4462 case OPTION_NO_MERGE_NOTES
:
4463 merge_notes
= FALSE
;
4464 merge_notes_set
= TRUE
;
4467 add_specific_symbol (optarg
, strip_specific_htab
);
4470 output_file
= optarg
;
4473 preserve_dates
= TRUE
;
4476 deterministic
= TRUE
;
4479 deterministic
= FALSE
;
4482 discard_locals
= LOCALS_ALL
;
4485 discard_locals
= LOCALS_START_L
;
4491 show_version
= TRUE
;
4493 case OPTION_FORMATS_INFO
:
4494 formats_info
= TRUE
;
4496 case OPTION_ONLY_KEEP_DEBUG
:
4497 strip_symbols
= STRIP_NONDEBUG
;
4499 case OPTION_KEEP_FILE_SYMBOLS
:
4500 keep_file_symbols
= 1;
4503 /* We've been given a long option. */
4510 strip_usage (stdout
, 0);
4512 strip_usage (stderr
, 1);
4516 /* If the user has not expressly chosen to merge/not-merge ELF notes
4517 then enable the merging unless we are stripping debug or dwo info. */
4518 if (! merge_notes_set
4519 && (strip_symbols
== STRIP_UNDEF
4520 || strip_symbols
== STRIP_ALL
4521 || strip_symbols
== STRIP_UNNEEDED
4522 || strip_symbols
== STRIP_NONDEBUG
4523 || strip_symbols
== STRIP_NONDWO
))
4533 print_version ("strip");
4535 default_deterministic ();
4537 /* Default is to strip all symbols. */
4538 if (strip_symbols
== STRIP_UNDEF
4539 && discard_locals
== LOCALS_UNDEF
4540 && htab_elements (strip_specific_htab
) == 0)
4541 strip_symbols
= STRIP_ALL
;
4543 if (output_target
== NULL
)
4544 output_target
= input_target
;
4548 || (output_file
!= NULL
&& (i
+ 1) < argc
))
4549 strip_usage (stderr
, 1);
4551 for (; i
< argc
; i
++)
4553 int hold_status
= status
;
4554 struct stat statbuf
;
4557 if (get_file_size (argv
[i
]) < 1)
4564 /* No need to check the return value of stat().
4565 It has already been checked in get_file_size(). */
4566 stat (argv
[i
], &statbuf
);
4568 if (output_file
== NULL
4569 || filename_cmp (argv
[i
], output_file
) == 0)
4570 tmpname
= make_tempname (argv
[i
]);
4572 tmpname
= output_file
;
4574 if (tmpname
== NULL
)
4576 bfd_nonfatal_message (argv
[i
], NULL
, NULL
,
4577 _("could not create temporary file to hold stripped copy"));
4583 copy_file (argv
[i
], tmpname
, input_target
, output_target
, NULL
);
4587 set_times (tmpname
, &statbuf
);
4588 if (output_file
!= tmpname
)
4589 status
= (smart_rename (tmpname
,
4590 output_file
? output_file
: argv
[i
],
4591 preserve_dates
) != 0);
4593 status
= hold_status
;
4596 unlink_if_ordinary (tmpname
);
4597 if (output_file
!= tmpname
)
4604 /* Set up PE subsystem. */
4607 set_pe_subsystem (const char *s
)
4609 const char *version
, *subsystem
;
4619 { "native", 0, IMAGE_SUBSYSTEM_NATIVE
},
4620 { "windows", 0, IMAGE_SUBSYSTEM_WINDOWS_GUI
},
4621 { "console", 0, IMAGE_SUBSYSTEM_WINDOWS_CUI
},
4622 { "posix", 0, IMAGE_SUBSYSTEM_POSIX_CUI
},
4623 { "wince", 0, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
},
4624 { "efi-app", 1, IMAGE_SUBSYSTEM_EFI_APPLICATION
},
4625 { "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
},
4626 { "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
},
4627 { "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER
},
4628 { "xbox", 0, IMAGE_SUBSYSTEM_XBOX
}
4634 /* Check for the presence of a version number. */
4635 version
= strchr (s
, ':');
4636 if (version
== NULL
)
4640 int len
= version
- s
;
4644 version
= copy
+ 1 + len
;
4645 pe_major_subsystem_version
= strtoul (version
, ©
, 0);
4647 pe_minor_subsystem_version
= strtoul (copy
+ 1, ©
, 0);
4649 non_fatal (_("%s: bad version in PE subsystem"), s
);
4652 /* Check for numeric subsystem. */
4653 value
= (short) strtol (subsystem
, ©
, 0);
4656 for (i
= 0; i
< ARRAY_SIZE (v
); i
++)
4657 if (v
[i
].value
== value
)
4659 pe_subsystem
= value
;
4660 set_def
= v
[i
].set_def
;
4666 /* Search for subsystem by name. */
4667 for (i
= 0; i
< ARRAY_SIZE (v
); i
++)
4668 if (strcmp (subsystem
, v
[i
].name
) == 0)
4670 pe_subsystem
= v
[i
].value
;
4671 set_def
= v
[i
].set_def
;
4679 fatal (_("unknown PE subsystem: %s"), s
);
4684 if (pe_file_alignment
== (bfd_vma
) -1)
4685 pe_file_alignment
= PE_DEF_FILE_ALIGNMENT
;
4686 if (pe_section_alignment
== (bfd_vma
) -1)
4687 pe_section_alignment
= PE_DEF_SECTION_ALIGNMENT
;
4691 free ((char *) subsystem
);
4694 /* Convert EFI target to PEI target. */
4697 convert_efi_target (char *efi
)
4703 if (strcmp (efi
+ 4, "ia32") == 0)
4705 /* Change ia32 to i386. */
4710 else if (strcmp (efi
+ 4, "x86_64") == 0)
4712 /* Change x86_64 to x86-64. */
4717 /* Allocate and return a pointer to a struct section_add, initializing the
4718 structure using ARG, a string in the format "sectionname=filename".
4719 The returned structure will have its next pointer set to NEXT. The
4720 OPTION field is the name of the command line option currently being
4721 parsed, and is only used if an error needs to be reported. */
4723 static struct section_add
*
4724 init_section_add (const char *arg
,
4725 struct section_add
*next
,
4728 struct section_add
*pa
;
4731 s
= strchr (arg
, '=');
4733 fatal (_("bad format for %s"), option
);
4735 pa
= (struct section_add
*) xmalloc (sizeof (struct section_add
));
4736 pa
->name
= xstrndup (arg
, s
- arg
);
4737 pa
->filename
= s
+ 1;
4739 pa
->contents
= NULL
;
4745 /* Load the file specified in PA, allocating memory to hold the file
4746 contents, and store a pointer to the allocated memory in the contents
4747 field of PA. The size field of PA is also updated. All errors call
4751 section_add_load_file (struct section_add
*pa
)
4756 /* We don't use get_file_size so that we can do
4757 --add-section .note.GNU_stack=/dev/null
4758 get_file_size doesn't work on /dev/null. */
4760 f
= fopen (pa
->filename
, FOPEN_RB
);
4762 fatal (_("cannot open: %s: %s"),
4763 pa
->filename
, strerror (errno
));
4767 pa
->contents
= (bfd_byte
*) xmalloc (alloc
);
4775 pa
->contents
= (bfd_byte
*) xrealloc (pa
->contents
, alloc
);
4778 got
= fread (pa
->contents
+ off
, 1, alloc
- off
, f
);
4780 fatal (_("%s: fread failed"), pa
->filename
);
4791 copy_main (int argc
, char *argv
[])
4793 char *input_filename
= NULL
;
4794 char *output_filename
= NULL
;
4796 char *input_target
= NULL
;
4797 char *output_target
= NULL
;
4798 bfd_boolean show_version
= FALSE
;
4799 bfd_boolean change_warn
= TRUE
;
4800 bfd_boolean formats_info
= FALSE
;
4801 bfd_boolean use_globalize
= FALSE
;
4802 bfd_boolean use_keep_global
= FALSE
;
4804 struct stat statbuf
;
4805 const bfd_arch_info_type
*input_arch
= NULL
;
4807 while ((c
= getopt_long (argc
, argv
, "b:B:i:I:j:K:MN:s:O:d:F:L:G:R:SpgxXHhVvW:wDU",
4808 copy_options
, (int *) 0)) != EOF
)
4813 copy_byte
= atoi (optarg
);
4815 fatal (_("byte number must be non-negative"));
4819 input_arch
= bfd_scan_arch (optarg
);
4820 if (input_arch
== NULL
)
4821 fatal (_("architecture %s unknown"), optarg
);
4827 interleave
= atoi (optarg
);
4829 fatal (_("interleave must be positive"));
4835 case OPTION_INTERLEAVE_WIDTH
:
4836 copy_width
= atoi (optarg
);
4838 fatal(_("interleave width must be positive"));
4842 case 's': /* "source" - 'I' is preferred */
4843 input_target
= optarg
;
4847 case 'd': /* "destination" - 'O' is preferred */
4848 output_target
= optarg
;
4852 input_target
= output_target
= optarg
;
4856 find_section_list (optarg
, TRUE
, SECTION_CONTEXT_COPY
);
4857 sections_copied
= TRUE
;
4861 handle_remove_section_option (optarg
);
4864 case OPTION_REMOVE_RELOCS
:
4865 handle_remove_relocations_option (optarg
);
4869 strip_symbols
= STRIP_ALL
;
4873 strip_symbols
= STRIP_DEBUG
;
4876 case OPTION_STRIP_DWO
:
4877 strip_symbols
= STRIP_DWO
;
4880 case OPTION_STRIP_UNNEEDED
:
4881 strip_symbols
= STRIP_UNNEEDED
;
4884 case OPTION_ONLY_KEEP_DEBUG
:
4885 strip_symbols
= STRIP_NONDEBUG
;
4888 case OPTION_KEEP_FILE_SYMBOLS
:
4889 keep_file_symbols
= 1;
4892 case OPTION_ADD_GNU_DEBUGLINK
:
4893 long_section_names
= ENABLE
;
4894 gnu_debuglink_filename
= optarg
;
4898 add_specific_symbol (optarg
, keep_specific_htab
);
4904 case OPTION_NO_MERGE_NOTES
:
4905 merge_notes
= FALSE
;
4909 add_specific_symbol (optarg
, strip_specific_htab
);
4912 case OPTION_STRIP_UNNEEDED_SYMBOL
:
4913 add_specific_symbol (optarg
, strip_unneeded_htab
);
4917 add_specific_symbol (optarg
, localize_specific_htab
);
4920 case OPTION_GLOBALIZE_SYMBOL
:
4921 use_globalize
= TRUE
;
4922 add_specific_symbol (optarg
, globalize_specific_htab
);
4926 use_keep_global
= TRUE
;
4927 add_specific_symbol (optarg
, keepglobal_specific_htab
);
4931 add_specific_symbol (optarg
, weaken_specific_htab
);
4935 preserve_dates
= TRUE
;
4939 deterministic
= TRUE
;
4943 deterministic
= FALSE
;
4951 discard_locals
= LOCALS_ALL
;
4955 discard_locals
= LOCALS_START_L
;
4963 show_version
= TRUE
;
4966 case OPTION_FORMATS_INFO
:
4967 formats_info
= TRUE
;
4974 case OPTION_ADD_SECTION
:
4975 add_sections
= init_section_add (optarg
, add_sections
,
4977 section_add_load_file (add_sections
);
4980 case OPTION_UPDATE_SECTION
:
4981 update_sections
= init_section_add (optarg
, update_sections
,
4982 "--update-section");
4983 section_add_load_file (update_sections
);
4986 case OPTION_DUMP_SECTION
:
4987 dump_sections
= init_section_add (optarg
, dump_sections
,
4991 case OPTION_ADD_SYMBOL
:
4994 struct addsym_node
*newsym
= xmalloc (sizeof *newsym
);
4996 newsym
->next
= NULL
;
4997 s
= strchr (optarg
, '=');
4999 fatal (_("bad format for %s"), "--add-symbol");
5000 t
= strchr (s
+ 1, ':');
5002 newsym
->symdef
= xstrndup (optarg
, s
- optarg
);
5005 newsym
->section
= xstrndup (s
+ 1, t
- (s
+ 1));
5006 newsym
->symval
= strtol (t
+ 1, NULL
, 0);
5010 newsym
->section
= NULL
;
5011 newsym
->symval
= strtol (s
+ 1, NULL
, 0);
5015 t
= strchr (t
+ 1, ',');
5016 newsym
->othersym
= NULL
;
5018 newsym
->flags
= parse_symflags (t
+1, &newsym
->othersym
);
5020 newsym
->flags
= BSF_GLOBAL
;
5022 /* Keep 'othersym' symbols at the front of the list. */
5023 if (newsym
->othersym
)
5025 newsym
->next
= add_sym_list
;
5027 add_sym_tail
= &newsym
->next
;
5028 add_sym_list
= newsym
;
5032 *add_sym_tail
= newsym
;
5033 add_sym_tail
= &newsym
->next
;
5039 case OPTION_CHANGE_START
:
5040 change_start
= parse_vma (optarg
, "--change-start");
5043 case OPTION_CHANGE_SECTION_ADDRESS
:
5044 case OPTION_CHANGE_SECTION_LMA
:
5045 case OPTION_CHANGE_SECTION_VMA
:
5047 struct section_list
* p
;
5048 unsigned int context
= 0;
5052 char *option
= NULL
;
5057 case OPTION_CHANGE_SECTION_ADDRESS
:
5058 option
= "--change-section-address";
5059 context
= SECTION_CONTEXT_ALTER_LMA
| SECTION_CONTEXT_ALTER_VMA
;
5061 case OPTION_CHANGE_SECTION_LMA
:
5062 option
= "--change-section-lma";
5063 context
= SECTION_CONTEXT_ALTER_LMA
;
5065 case OPTION_CHANGE_SECTION_VMA
:
5066 option
= "--change-section-vma";
5067 context
= SECTION_CONTEXT_ALTER_VMA
;
5071 s
= strchr (optarg
, '=');
5074 s
= strchr (optarg
, '+');
5077 s
= strchr (optarg
, '-');
5079 fatal (_("bad format for %s"), option
);
5084 /* Correct the context. */
5087 case OPTION_CHANGE_SECTION_ADDRESS
:
5088 context
= SECTION_CONTEXT_SET_LMA
| SECTION_CONTEXT_SET_VMA
;
5090 case OPTION_CHANGE_SECTION_LMA
:
5091 context
= SECTION_CONTEXT_SET_LMA
;
5093 case OPTION_CHANGE_SECTION_VMA
:
5094 context
= SECTION_CONTEXT_SET_VMA
;
5100 name
= (char *) xmalloc (len
+ 1);
5101 strncpy (name
, optarg
, len
);
5104 p
= find_section_list (name
, TRUE
, context
);
5106 val
= parse_vma (s
+ 1, option
);
5112 case OPTION_CHANGE_SECTION_ADDRESS
:
5116 case OPTION_CHANGE_SECTION_LMA
:
5120 case OPTION_CHANGE_SECTION_VMA
:
5127 case OPTION_CHANGE_ADDRESSES
:
5128 change_section_address
= parse_vma (optarg
, "--change-addresses");
5129 change_start
= change_section_address
;
5132 case OPTION_CHANGE_WARNINGS
:
5136 case OPTION_CHANGE_LEADING_CHAR
:
5137 change_leading_char
= TRUE
;
5140 case OPTION_COMPRESS_DEBUG_SECTIONS
:
5143 if (strcasecmp (optarg
, "none") == 0)
5144 do_debug_sections
= decompress
;
5145 else if (strcasecmp (optarg
, "zlib") == 0)
5146 do_debug_sections
= compress_zlib
;
5147 else if (strcasecmp (optarg
, "zlib-gnu") == 0)
5148 do_debug_sections
= compress_gnu_zlib
;
5149 else if (strcasecmp (optarg
, "zlib-gabi") == 0)
5150 do_debug_sections
= compress_gabi_zlib
;
5152 fatal (_("unrecognized --compress-debug-sections type `%s'"),
5156 do_debug_sections
= compress
;
5159 case OPTION_DEBUGGING
:
5160 convert_debugging
= TRUE
;
5163 case OPTION_DECOMPRESS_DEBUG_SECTIONS
:
5164 do_debug_sections
= decompress
;
5167 case OPTION_ELF_STT_COMMON
:
5168 if (strcasecmp (optarg
, "yes") == 0)
5169 do_elf_stt_common
= elf_stt_common
;
5170 else if (strcasecmp (optarg
, "no") == 0)
5171 do_elf_stt_common
= no_elf_stt_common
;
5173 fatal (_("unrecognized --elf-stt-common= option `%s'"),
5177 case OPTION_GAP_FILL
:
5179 bfd_vma gap_fill_vma
;
5181 gap_fill_vma
= parse_vma (optarg
, "--gap-fill");
5182 gap_fill
= (bfd_byte
) gap_fill_vma
;
5183 if ((bfd_vma
) gap_fill
!= gap_fill_vma
)
5187 sprintf_vma (buff
, gap_fill_vma
);
5189 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
5192 gap_fill_set
= TRUE
;
5196 case OPTION_NO_CHANGE_WARNINGS
:
5197 change_warn
= FALSE
;
5201 pad_to
= parse_vma (optarg
, "--pad-to");
5205 case OPTION_REMOVE_LEADING_CHAR
:
5206 remove_leading_char
= TRUE
;
5209 case OPTION_REDEFINE_SYM
:
5211 /* Insert this redefinition onto redefine_specific_htab. */
5215 const char *nextarg
;
5216 char *source
, *target
;
5218 s
= strchr (optarg
, '=');
5220 fatal (_("bad format for %s"), "--redefine-sym");
5223 source
= (char *) xmalloc (len
+ 1);
5224 strncpy (source
, optarg
, len
);
5228 len
= strlen (nextarg
);
5229 target
= (char *) xmalloc (len
+ 1);
5230 strcpy (target
, nextarg
);
5232 add_redefine_and_check ("--redefine-sym", source
, target
);
5239 case OPTION_REDEFINE_SYMS
:
5240 add_redefine_syms_file (optarg
);
5243 case OPTION_SET_SECTION_FLAGS
:
5245 struct section_list
*p
;
5250 s
= strchr (optarg
, '=');
5252 fatal (_("bad format for %s"), "--set-section-flags");
5255 name
= (char *) xmalloc (len
+ 1);
5256 strncpy (name
, optarg
, len
);
5259 p
= find_section_list (name
, TRUE
, SECTION_CONTEXT_SET_FLAGS
);
5261 p
->flags
= parse_flags (s
+ 1);
5265 case OPTION_RENAME_SECTION
:
5268 const char *eq
, *fl
;
5273 eq
= strchr (optarg
, '=');
5275 fatal (_("bad format for %s"), "--rename-section");
5279 fatal (_("bad format for %s"), "--rename-section");
5281 old_name
= (char *) xmalloc (len
+ 1);
5282 strncpy (old_name
, optarg
, len
);
5286 fl
= strchr (eq
, ',');
5289 flags
= parse_flags (fl
+ 1);
5299 fatal (_("bad format for %s"), "--rename-section");
5301 new_name
= (char *) xmalloc (len
+ 1);
5302 strncpy (new_name
, eq
, len
);
5305 add_section_rename (old_name
, new_name
, flags
);
5309 case OPTION_SET_START
:
5310 set_start
= parse_vma (optarg
, "--set-start");
5311 set_start_set
= TRUE
;
5314 case OPTION_SREC_LEN
:
5315 _bfd_srec_len
= parse_vma (optarg
, "--srec-len");
5318 case OPTION_SREC_FORCES3
:
5319 _bfd_srec_forceS3
= TRUE
;
5322 case OPTION_STRIP_SYMBOLS
:
5323 add_specific_symbols (optarg
, strip_specific_htab
,
5324 &strip_specific_buffer
);
5327 case OPTION_STRIP_UNNEEDED_SYMBOLS
:
5328 add_specific_symbols (optarg
, strip_unneeded_htab
,
5329 &strip_unneeded_buffer
);
5332 case OPTION_KEEP_SYMBOLS
:
5333 add_specific_symbols (optarg
, keep_specific_htab
,
5334 &keep_specific_buffer
);
5337 case OPTION_LOCALIZE_HIDDEN
:
5338 localize_hidden
= TRUE
;
5341 case OPTION_LOCALIZE_SYMBOLS
:
5342 add_specific_symbols (optarg
, localize_specific_htab
,
5343 &localize_specific_buffer
);
5346 case OPTION_LONG_SECTION_NAMES
:
5347 if (!strcmp ("enable", optarg
))
5348 long_section_names
= ENABLE
;
5349 else if (!strcmp ("disable", optarg
))
5350 long_section_names
= DISABLE
;
5351 else if (!strcmp ("keep", optarg
))
5352 long_section_names
= KEEP
;
5354 fatal (_("unknown long section names option '%s'"), optarg
);
5357 case OPTION_GLOBALIZE_SYMBOLS
:
5358 use_globalize
= TRUE
;
5359 add_specific_symbols (optarg
, globalize_specific_htab
,
5360 &globalize_specific_buffer
);
5363 case OPTION_KEEPGLOBAL_SYMBOLS
:
5364 use_keep_global
= TRUE
;
5365 add_specific_symbols (optarg
, keepglobal_specific_htab
,
5366 &keepglobal_specific_buffer
);
5369 case OPTION_WEAKEN_SYMBOLS
:
5370 add_specific_symbols (optarg
, weaken_specific_htab
,
5371 &weaken_specific_buffer
);
5374 case OPTION_ALT_MACH_CODE
:
5375 use_alt_mach_code
= strtoul (optarg
, NULL
, 0);
5376 if (use_alt_mach_code
== 0)
5377 fatal (_("unable to parse alternative machine code"));
5380 case OPTION_PREFIX_SYMBOLS
:
5381 prefix_symbols_string
= optarg
;
5384 case OPTION_PREFIX_SECTIONS
:
5385 prefix_sections_string
= optarg
;
5388 case OPTION_PREFIX_ALLOC_SECTIONS
:
5389 prefix_alloc_sections_string
= optarg
;
5392 case OPTION_READONLY_TEXT
:
5393 bfd_flags_to_set
|= WP_TEXT
;
5394 bfd_flags_to_clear
&= ~WP_TEXT
;
5397 case OPTION_WRITABLE_TEXT
:
5398 bfd_flags_to_clear
|= WP_TEXT
;
5399 bfd_flags_to_set
&= ~WP_TEXT
;
5403 bfd_flags_to_set
|= D_PAGED
;
5404 bfd_flags_to_clear
&= ~D_PAGED
;
5408 bfd_flags_to_clear
|= D_PAGED
;
5409 bfd_flags_to_set
&= ~D_PAGED
;
5412 case OPTION_EXTRACT_DWO
:
5413 strip_symbols
= STRIP_NONDWO
;
5416 case OPTION_EXTRACT_SYMBOL
:
5417 extract_symbol
= TRUE
;
5420 case OPTION_REVERSE_BYTES
:
5422 int prev
= reverse_bytes
;
5424 reverse_bytes
= atoi (optarg
);
5425 if ((reverse_bytes
<= 0) || ((reverse_bytes
% 2) != 0))
5426 fatal (_("number of bytes to reverse must be positive and even"));
5428 if (prev
&& prev
!= reverse_bytes
)
5429 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
5434 case OPTION_FILE_ALIGNMENT
:
5435 pe_file_alignment
= parse_vma (optarg
, "--file-alignment");
5441 pe_heap_reserve
= strtoul (optarg
, &end
, 0);
5443 || (*end
!= '.' && *end
!= '\0'))
5444 non_fatal (_("%s: invalid reserve value for --heap"),
5446 else if (*end
!= '\0')
5448 pe_heap_commit
= strtoul (end
+ 1, &end
, 0);
5450 non_fatal (_("%s: invalid commit value for --heap"),
5456 case OPTION_IMAGE_BASE
:
5457 pe_image_base
= parse_vma (optarg
, "--image-base");
5460 case OPTION_SECTION_ALIGNMENT
:
5461 pe_section_alignment
= parse_vma (optarg
,
5462 "--section-alignment");
5465 case OPTION_SUBSYSTEM
:
5466 set_pe_subsystem (optarg
);
5472 pe_stack_reserve
= strtoul (optarg
, &end
, 0);
5474 || (*end
!= '.' && *end
!= '\0'))
5475 non_fatal (_("%s: invalid reserve value for --stack"),
5477 else if (*end
!= '\0')
5479 pe_stack_commit
= strtoul (end
+ 1, &end
, 0);
5481 non_fatal (_("%s: invalid commit value for --stack"),
5487 case OPTION_VERILOG_DATA_WIDTH
:
5488 VerilogDataWidth
= parse_vma (optarg
, "--verilog-data-width");
5489 if (VerilogDataWidth
< 1)
5490 fatal (_("verilog data width must be at least 1 byte"));
5494 /* We've been given a long option. */
5499 copy_usage (stdout
, 0);
5502 copy_usage (stderr
, 1);
5506 if (use_globalize
&& use_keep_global
)
5507 fatal(_("--globalize-symbol(s) is incompatible with -G/--keep-global-symbol(s)"));
5516 print_version ("objcopy");
5518 if (interleave
&& copy_byte
== -1)
5519 fatal (_("interleave start byte must be set with --byte"));
5521 if (copy_byte
>= interleave
)
5522 fatal (_("byte number must be less than interleave"));
5524 if (copy_width
> interleave
- copy_byte
)
5525 fatal (_("interleave width must be less than or equal to interleave - byte`"));
5527 if (optind
== argc
|| optind
+ 2 < argc
)
5528 copy_usage (stderr
, 1);
5530 input_filename
= argv
[optind
];
5531 if (optind
+ 1 < argc
)
5532 output_filename
= argv
[optind
+ 1];
5534 default_deterministic ();
5536 /* Default is to strip no symbols. */
5537 if (strip_symbols
== STRIP_UNDEF
&& discard_locals
== LOCALS_UNDEF
)
5538 strip_symbols
= STRIP_NONE
;
5540 if (output_target
== NULL
)
5541 output_target
= input_target
;
5543 /* Convert input EFI target to PEI target. */
5544 if (input_target
!= NULL
5545 && strncmp (input_target
, "efi-", 4) == 0)
5549 efi
= xstrdup (output_target
+ 4);
5550 if (strncmp (efi
, "bsdrv-", 6) == 0
5551 || strncmp (efi
, "rtdrv-", 6) == 0)
5553 else if (strncmp (efi
, "app-", 4) != 0)
5554 fatal (_("unknown input EFI target: %s"), input_target
);
5557 convert_efi_target (efi
);
5560 /* Convert output EFI target to PEI target. */
5561 if (output_target
!= NULL
5562 && strncmp (output_target
, "efi-", 4) == 0)
5566 efi
= xstrdup (output_target
+ 4);
5567 if (strncmp (efi
, "app-", 4) == 0)
5569 if (pe_subsystem
== -1)
5570 pe_subsystem
= IMAGE_SUBSYSTEM_EFI_APPLICATION
;
5572 else if (strncmp (efi
, "bsdrv-", 6) == 0)
5574 if (pe_subsystem
== -1)
5575 pe_subsystem
= IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
;
5578 else if (strncmp (efi
, "rtdrv-", 6) == 0)
5580 if (pe_subsystem
== -1)
5581 pe_subsystem
= IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
;
5585 fatal (_("unknown output EFI target: %s"), output_target
);
5587 if (pe_file_alignment
== (bfd_vma
) -1)
5588 pe_file_alignment
= PE_DEF_FILE_ALIGNMENT
;
5589 if (pe_section_alignment
== (bfd_vma
) -1)
5590 pe_section_alignment
= PE_DEF_SECTION_ALIGNMENT
;
5592 output_target
= efi
;
5593 convert_efi_target (efi
);
5597 if (stat (input_filename
, & statbuf
) < 0)
5598 fatal (_("warning: could not locate '%s'. System error message: %s"),
5599 input_filename
, strerror (errno
));
5601 /* If there is no destination file, or the source and destination files
5602 are the same, then create a temp and rename the result into the input. */
5603 if (output_filename
== NULL
5604 || filename_cmp (input_filename
, output_filename
) == 0)
5605 tmpname
= make_tempname (input_filename
);
5607 tmpname
= output_filename
;
5609 if (tmpname
== NULL
)
5610 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
5611 input_filename
, strerror (errno
));
5613 copy_file (input_filename
, tmpname
, input_target
, output_target
, input_arch
);
5617 set_times (tmpname
, &statbuf
);
5618 if (tmpname
!= output_filename
)
5619 status
= (smart_rename (tmpname
, input_filename
,
5620 preserve_dates
) != 0);
5623 unlink_if_ordinary (tmpname
);
5625 if (tmpname
!= output_filename
)
5630 struct section_list
*p
;
5632 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
5636 if (p
->context
& (SECTION_CONTEXT_SET_VMA
| SECTION_CONTEXT_ALTER_VMA
))
5640 sprintf_vma (buff
, p
->vma_val
);
5642 /* xgettext:c-format */
5643 non_fatal (_("%s %s%c0x%s never used"),
5644 "--change-section-vma",
5646 p
->context
& SECTION_CONTEXT_SET_VMA
? '=' : '+',
5650 if (p
->context
& (SECTION_CONTEXT_SET_LMA
| SECTION_CONTEXT_ALTER_LMA
))
5654 sprintf_vma (buff
, p
->lma_val
);
5656 /* xgettext:c-format */
5657 non_fatal (_("%s %s%c0x%s never used"),
5658 "--change-section-lma",
5660 p
->context
& SECTION_CONTEXT_SET_LMA
? '=' : '+',
5667 if (strip_specific_buffer
)
5668 free (strip_specific_buffer
);
5670 if (strip_unneeded_buffer
)
5671 free (strip_unneeded_buffer
);
5673 if (keep_specific_buffer
)
5674 free (keep_specific_buffer
);
5676 if (localize_specific_buffer
)
5677 free (globalize_specific_buffer
);
5679 if (globalize_specific_buffer
)
5680 free (globalize_specific_buffer
);
5682 if (keepglobal_specific_buffer
)
5683 free (keepglobal_specific_buffer
);
5685 if (weaken_specific_buffer
)
5686 free (weaken_specific_buffer
);
5692 main (int argc
, char *argv
[])
5694 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
5695 setlocale (LC_MESSAGES
, "");
5697 #if defined (HAVE_SETLOCALE)
5698 setlocale (LC_CTYPE
, "");
5700 bindtextdomain (PACKAGE
, LOCALEDIR
);
5701 textdomain (PACKAGE
);
5703 program_name
= argv
[0];
5704 xmalloc_set_program_name (program_name
);
5706 START_PROGRESS (program_name
, 0);
5708 expandargv (&argc
, &argv
);
5710 strip_symbols
= STRIP_UNDEF
;
5711 discard_locals
= LOCALS_UNDEF
;
5713 if (bfd_init () != BFD_INIT_MAGIC
)
5714 fatal (_("fatal error: libbfd ABI mismatch"));
5715 set_default_bfd_target ();
5719 int i
= strlen (program_name
);
5720 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5721 /* Drop the .exe suffix, if any. */
5722 if (i
> 4 && FILENAME_CMP (program_name
+ i
- 4, ".exe") == 0)
5725 program_name
[i
] = '\0';
5728 is_strip
= (i
>= 5 && FILENAME_CMP (program_name
+ i
- 5, "strip") == 0);
5731 create_symbol_htabs ();
5734 bfd_set_error_program_name (argv
[0]);
5737 strip_main (argc
, argv
);
5739 copy_main (argc
, argv
);
5741 END_PROGRESS (program_name
);