1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright (C) 1991-2021 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
;
71 const char * othersym
;
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 keep_section_symbols
= FALSE
;/* True if section symbols should be retained. */
95 static bfd_boolean verbose
; /* Print file and target names. */
96 static bfd_boolean preserve_dates
; /* Preserve input file timestamp. */
97 static int deterministic
= -1; /* Enable deterministic archives. */
98 static int status
= 0; /* Exit status. */
100 static bfd_boolean merge_notes
= FALSE
; /* Merge note sections. */
102 typedef struct merged_note_section
104 asection
* sec
; /* The section that is being merged. */
105 bfd_byte
* contents
;/* New contents of the section. */
106 bfd_size_type size
; /* New size of the section. */
107 struct merged_note_section
* next
; /* Link to next merged note section. */
108 } merged_note_section
;
113 STRIP_NONE
, /* Don't strip. */
114 STRIP_DEBUG
, /* Strip all debugger symbols. */
115 STRIP_UNNEEDED
, /* Strip unnecessary symbols. */
116 STRIP_NONDEBUG
, /* Strip everything but debug info. */
117 STRIP_DWO
, /* Strip all DWO info. */
118 STRIP_NONDWO
, /* Strip everything but DWO info. */
119 STRIP_ALL
/* Strip all symbols. */
122 /* Which symbols to remove. */
123 static enum strip_action strip_symbols
= STRIP_UNDEF
;
128 LOCALS_START_L
, /* Discard locals starting with L. */
129 LOCALS_ALL
/* Discard all locals. */
132 /* Which local symbols to remove. Overrides STRIP_ALL. */
133 static enum locals_action discard_locals
;
135 /* Structure used to hold lists of sections and actions to take. */
138 struct section_list
* next
; /* Next section to change. */
139 const char * pattern
; /* Section name pattern. */
140 bfd_boolean used
; /* Whether this entry was used. */
142 unsigned int context
; /* What to do with matching sections. */
143 /* Flag bits used in the context field.
144 COPY and REMOVE are mutually exlusive. SET and ALTER are mutually exclusive. */
145 #define SECTION_CONTEXT_REMOVE (1 << 0) /* Remove this section. */
146 #define SECTION_CONTEXT_COPY (1 << 1) /* Copy this section, delete all non-copied section. */
147 #define SECTION_CONTEXT_KEEP (1 << 2) /* Keep this section. */
148 #define SECTION_CONTEXT_SET_VMA (1 << 3) /* Set the sections' VMA address. */
149 #define SECTION_CONTEXT_ALTER_VMA (1 << 4) /* Increment or decrement the section's VMA address. */
150 #define SECTION_CONTEXT_SET_LMA (1 << 5) /* Set the sections' LMA address. */
151 #define SECTION_CONTEXT_ALTER_LMA (1 << 6) /* Increment or decrement the section's LMA address. */
152 #define SECTION_CONTEXT_SET_FLAGS (1 << 7) /* Set the section's flags. */
153 #define SECTION_CONTEXT_REMOVE_RELOCS (1 << 8) /* Remove relocations for this section. */
154 #define SECTION_CONTEXT_SET_ALIGNMENT (1 << 9) /* Set alignment for section. */
156 bfd_vma vma_val
; /* Amount to change by or set to. */
157 bfd_vma lma_val
; /* Amount to change by or set to. */
158 flagword flags
; /* What to set the section flags to. */
159 unsigned int alignment
; /* Alignment of output section. */
162 static struct section_list
*change_sections
;
164 /* TRUE if some sections are to be removed. */
165 static bfd_boolean sections_removed
;
167 /* TRUE if only some sections are to be copied. */
168 static bfd_boolean sections_copied
;
170 /* Changes to the start address. */
171 static bfd_vma change_start
= 0;
172 static bfd_boolean set_start_set
= FALSE
;
173 static bfd_vma set_start
;
175 /* Changes to section addresses. */
176 static bfd_vma change_section_address
= 0;
178 /* Filling gaps between sections. */
179 static bfd_boolean gap_fill_set
= FALSE
;
180 static bfd_byte gap_fill
= 0;
182 /* Pad to a given address. */
183 static bfd_boolean pad_to_set
= FALSE
;
184 static bfd_vma pad_to
;
186 /* Use alternative machine code? */
187 static unsigned long use_alt_mach_code
= 0;
189 /* Output BFD flags user wants to set or clear */
190 static flagword bfd_flags_to_set
;
191 static flagword bfd_flags_to_clear
;
193 /* List of sections to add. */
196 /* Next section to add. */
197 struct section_add
*next
;
198 /* Name of section to add. */
200 /* Name of file holding section contents. */
201 const char *filename
;
204 /* Contents of file. */
206 /* BFD section, after it has been added. */
210 /* List of sections to add to the output BFD. */
211 static struct section_add
*add_sections
;
213 /* List of sections to update in the output BFD. */
214 static struct section_add
*update_sections
;
216 /* List of sections to dump from the output BFD. */
217 static struct section_add
*dump_sections
;
219 /* If non-NULL the argument to --add-gnu-debuglink.
220 This should be the filename to store in the .gnu_debuglink section. */
221 static const char * gnu_debuglink_filename
= NULL
;
223 /* Whether to convert debugging information. */
224 static bfd_boolean convert_debugging
= FALSE
;
226 /* Whether to compress/decompress DWARF debug sections. */
231 compress_zlib
= compress
| 1 << 1,
232 compress_gnu_zlib
= compress
| 1 << 2,
233 compress_gabi_zlib
= compress
| 1 << 3,
235 } do_debug_sections
= nothing
;
237 /* Whether to generate ELF common symbols with the STT_COMMON type. */
238 static enum bfd_link_elf_stt_common do_elf_stt_common
= unchanged
;
240 /* Whether to change the leading character in symbol names. */
241 static bfd_boolean change_leading_char
= FALSE
;
243 /* Whether to remove the leading character from global symbol names. */
244 static bfd_boolean remove_leading_char
= FALSE
;
246 /* Whether to permit wildcard in symbol comparison. */
247 static bfd_boolean wildcard
= FALSE
;
249 /* True if --localize-hidden is in effect. */
250 static bfd_boolean localize_hidden
= FALSE
;
252 /* List of symbols to strip, keep, localize, keep-global, weaken,
254 static htab_t strip_specific_htab
= NULL
;
255 static htab_t strip_unneeded_htab
= NULL
;
256 static htab_t keep_specific_htab
= NULL
;
257 static htab_t localize_specific_htab
= NULL
;
258 static htab_t globalize_specific_htab
= NULL
;
259 static htab_t keepglobal_specific_htab
= NULL
;
260 static htab_t weaken_specific_htab
= NULL
;
261 static htab_t redefine_specific_htab
= NULL
;
262 static htab_t redefine_specific_reverse_htab
= NULL
;
263 static struct addsym_node
*add_sym_list
= NULL
, **add_sym_tail
= &add_sym_list
;
264 static int add_symbols
= 0;
266 static char *strip_specific_buffer
= NULL
;
267 static char *strip_unneeded_buffer
= NULL
;
268 static char *keep_specific_buffer
= NULL
;
269 static char *localize_specific_buffer
= NULL
;
270 static char *globalize_specific_buffer
= NULL
;
271 static char *keepglobal_specific_buffer
= NULL
;
272 static char *weaken_specific_buffer
= NULL
;
274 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
275 static bfd_boolean weaken
= FALSE
;
277 /* If this is TRUE, we retain BSF_FILE symbols. */
278 static bfd_boolean keep_file_symbols
= FALSE
;
280 /* Prefix symbols/sections. */
281 static char *prefix_symbols_string
= 0;
282 static char *prefix_sections_string
= 0;
283 static char *prefix_alloc_sections_string
= 0;
285 /* True if --extract-symbol was passed on the command line. */
286 static bfd_boolean extract_symbol
= FALSE
;
288 /* If `reverse_bytes' is nonzero, then reverse the order of every chunk
289 of <reverse_bytes> bytes within each output section. */
290 static int reverse_bytes
= 0;
292 /* For Coff objects, we may want to allow or disallow long section names,
293 or preserve them where found in the inputs. Debug info relies on them. */
294 enum long_section_name_handling
301 /* The default long section handling mode is to preserve them.
302 This is also the only behaviour for 'strip'. */
303 static enum long_section_name_handling long_section_names
= KEEP
;
305 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
306 enum command_line_switch
308 OPTION_ADD_SECTION
=150,
309 OPTION_ADD_GNU_DEBUGLINK
,
311 OPTION_ALT_MACH_CODE
,
312 OPTION_CHANGE_ADDRESSES
,
313 OPTION_CHANGE_LEADING_CHAR
,
314 OPTION_CHANGE_SECTION_ADDRESS
,
315 OPTION_CHANGE_SECTION_LMA
,
316 OPTION_CHANGE_SECTION_VMA
,
318 OPTION_CHANGE_WARNINGS
,
319 OPTION_COMPRESS_DEBUG_SECTIONS
,
321 OPTION_DECOMPRESS_DEBUG_SECTIONS
,
323 OPTION_ELF_STT_COMMON
,
325 OPTION_EXTRACT_SYMBOL
,
326 OPTION_FILE_ALIGNMENT
,
329 OPTION_GLOBALIZE_SYMBOL
,
330 OPTION_GLOBALIZE_SYMBOLS
,
334 OPTION_INTERLEAVE_WIDTH
,
335 OPTION_KEEPGLOBAL_SYMBOLS
,
336 OPTION_KEEP_FILE_SYMBOLS
,
339 OPTION_KEEP_SECTION_SYMBOLS
,
340 OPTION_LOCALIZE_HIDDEN
,
341 OPTION_LOCALIZE_SYMBOLS
,
342 OPTION_LONG_SECTION_NAMES
,
344 OPTION_NO_MERGE_NOTES
,
345 OPTION_NO_CHANGE_WARNINGS
,
346 OPTION_ONLY_KEEP_DEBUG
,
348 OPTION_PREFIX_ALLOC_SECTIONS
,
349 OPTION_PREFIX_SECTIONS
,
350 OPTION_PREFIX_SYMBOLS
,
352 OPTION_READONLY_TEXT
,
354 OPTION_REDEFINE_SYMS
,
355 OPTION_REMOVE_LEADING_CHAR
,
356 OPTION_REMOVE_RELOCS
,
357 OPTION_RENAME_SECTION
,
358 OPTION_REVERSE_BYTES
,
359 OPTION_PE_SECTION_ALIGNMENT
,
360 OPTION_SET_SECTION_FLAGS
,
361 OPTION_SET_SECTION_ALIGNMENT
,
367 OPTION_STRIP_SYMBOLS
,
368 OPTION_STRIP_UNNEEDED
,
369 OPTION_STRIP_UNNEEDED_SYMBOL
,
370 OPTION_STRIP_UNNEEDED_SYMBOLS
,
372 OPTION_UPDATE_SECTION
,
373 OPTION_VERILOG_DATA_WIDTH
,
375 OPTION_WEAKEN_SYMBOLS
,
379 /* Options to handle if running as "strip". */
381 static struct option strip_options
[] =
383 {"disable-deterministic-archives", no_argument
, 0, 'U'},
384 {"discard-all", no_argument
, 0, 'x'},
385 {"discard-locals", no_argument
, 0, 'X'},
386 {"enable-deterministic-archives", no_argument
, 0, 'D'},
387 {"format", required_argument
, 0, 'F'}, /* Obsolete */
388 {"help", no_argument
, 0, 'h'},
389 {"info", no_argument
, 0, OPTION_FORMATS_INFO
},
390 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
391 {"input-target", required_argument
, 0, 'I'},
392 {"keep-section-symbols", no_argument
, 0, OPTION_KEEP_SECTION_SYMBOLS
},
393 {"keep-file-symbols", no_argument
, 0, OPTION_KEEP_FILE_SYMBOLS
},
394 {"keep-section", required_argument
, 0, OPTION_KEEP_SECTION
},
395 {"keep-symbol", required_argument
, 0, 'K'},
396 {"merge-notes", no_argument
, 0, 'M'},
397 {"no-merge-notes", no_argument
, 0, OPTION_NO_MERGE_NOTES
},
398 {"only-keep-debug", no_argument
, 0, OPTION_ONLY_KEEP_DEBUG
},
399 {"output-file", required_argument
, 0, 'o'},
400 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
401 {"output-target", required_argument
, 0, 'O'},
402 {"preserve-dates", no_argument
, 0, 'p'},
403 {"remove-section", required_argument
, 0, 'R'},
404 {"remove-relocations", required_argument
, 0, OPTION_REMOVE_RELOCS
},
405 {"strip-all", no_argument
, 0, 's'},
406 {"strip-debug", no_argument
, 0, 'S'},
407 {"strip-dwo", no_argument
, 0, OPTION_STRIP_DWO
},
408 {"strip-symbol", required_argument
, 0, 'N'},
409 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
410 {"target", required_argument
, 0, 'F'},
411 {"verbose", no_argument
, 0, 'v'},
412 {"version", no_argument
, 0, 'V'},
413 {"wildcard", no_argument
, 0, 'w'},
414 {0, no_argument
, 0, 0}
417 /* Options to handle if running as "objcopy". */
419 static struct option copy_options
[] =
421 {"add-gnu-debuglink", required_argument
, 0, OPTION_ADD_GNU_DEBUGLINK
},
422 {"add-section", required_argument
, 0, OPTION_ADD_SECTION
},
423 {"add-symbol", required_argument
, 0, OPTION_ADD_SYMBOL
},
424 {"adjust-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
425 {"adjust-start", required_argument
, 0, OPTION_CHANGE_START
},
426 {"adjust-vma", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
427 {"adjust-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
428 {"alt-machine-code", required_argument
, 0, OPTION_ALT_MACH_CODE
},
429 {"binary-architecture", required_argument
, 0, 'B'},
430 {"byte", required_argument
, 0, 'b'},
431 {"change-addresses", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
432 {"change-leading-char", no_argument
, 0, OPTION_CHANGE_LEADING_CHAR
},
433 {"change-section-address", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
434 {"change-section-lma", required_argument
, 0, OPTION_CHANGE_SECTION_LMA
},
435 {"change-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_VMA
},
436 {"change-start", required_argument
, 0, OPTION_CHANGE_START
},
437 {"change-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
438 {"compress-debug-sections", optional_argument
, 0, OPTION_COMPRESS_DEBUG_SECTIONS
},
439 {"debugging", no_argument
, 0, OPTION_DEBUGGING
},
440 {"decompress-debug-sections", no_argument
, 0, OPTION_DECOMPRESS_DEBUG_SECTIONS
},
441 {"disable-deterministic-archives", no_argument
, 0, 'U'},
442 {"discard-all", no_argument
, 0, 'x'},
443 {"discard-locals", no_argument
, 0, 'X'},
444 {"dump-section", required_argument
, 0, OPTION_DUMP_SECTION
},
445 {"elf-stt-common", required_argument
, 0, OPTION_ELF_STT_COMMON
},
446 {"enable-deterministic-archives", no_argument
, 0, 'D'},
447 {"extract-dwo", no_argument
, 0, OPTION_EXTRACT_DWO
},
448 {"extract-symbol", no_argument
, 0, OPTION_EXTRACT_SYMBOL
},
449 {"file-alignment", required_argument
, 0, OPTION_FILE_ALIGNMENT
},
450 {"format", required_argument
, 0, 'F'}, /* Obsolete */
451 {"gap-fill", required_argument
, 0, OPTION_GAP_FILL
},
452 {"globalize-symbol", required_argument
, 0, OPTION_GLOBALIZE_SYMBOL
},
453 {"globalize-symbols", required_argument
, 0, OPTION_GLOBALIZE_SYMBOLS
},
454 {"heap", required_argument
, 0, OPTION_HEAP
},
455 {"help", no_argument
, 0, 'h'},
456 {"image-base", required_argument
, 0 , OPTION_IMAGE_BASE
},
457 {"impure", no_argument
, 0, OPTION_IMPURE
},
458 {"info", no_argument
, 0, OPTION_FORMATS_INFO
},
459 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
460 {"input-target", required_argument
, 0, 'I'},
461 {"interleave", optional_argument
, 0, 'i'},
462 {"interleave-width", required_argument
, 0, OPTION_INTERLEAVE_WIDTH
},
463 {"keep-file-symbols", no_argument
, 0, OPTION_KEEP_FILE_SYMBOLS
},
464 {"keep-global-symbol", required_argument
, 0, 'G'},
465 {"keep-global-symbols", required_argument
, 0, OPTION_KEEPGLOBAL_SYMBOLS
},
466 {"keep-section", required_argument
, 0, OPTION_KEEP_SECTION
},
467 {"keep-symbol", required_argument
, 0, 'K'},
468 {"keep-symbols", required_argument
, 0, OPTION_KEEP_SYMBOLS
},
469 {"keep-section-symbols", required_argument
, 0, OPTION_KEEP_SECTION_SYMBOLS
},
470 {"localize-hidden", no_argument
, 0, OPTION_LOCALIZE_HIDDEN
},
471 {"localize-symbol", required_argument
, 0, 'L'},
472 {"localize-symbols", required_argument
, 0, OPTION_LOCALIZE_SYMBOLS
},
473 {"long-section-names", required_argument
, 0, OPTION_LONG_SECTION_NAMES
},
474 {"merge-notes", no_argument
, 0, 'M'},
475 {"no-merge-notes", no_argument
, 0, OPTION_NO_MERGE_NOTES
},
476 {"no-adjust-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
477 {"no-change-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
478 {"only-keep-debug", no_argument
, 0, OPTION_ONLY_KEEP_DEBUG
},
479 {"only-section", required_argument
, 0, 'j'},
480 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
481 {"output-target", required_argument
, 0, 'O'},
482 {"pad-to", required_argument
, 0, OPTION_PAD_TO
},
483 {"prefix-alloc-sections", required_argument
, 0, OPTION_PREFIX_ALLOC_SECTIONS
},
484 {"prefix-sections", required_argument
, 0, OPTION_PREFIX_SECTIONS
},
485 {"prefix-symbols", required_argument
, 0, OPTION_PREFIX_SYMBOLS
},
486 {"preserve-dates", no_argument
, 0, 'p'},
487 {"pure", no_argument
, 0, OPTION_PURE
},
488 {"readonly-text", no_argument
, 0, OPTION_READONLY_TEXT
},
489 {"redefine-sym", required_argument
, 0, OPTION_REDEFINE_SYM
},
490 {"redefine-syms", required_argument
, 0, OPTION_REDEFINE_SYMS
},
491 {"remove-leading-char", no_argument
, 0, OPTION_REMOVE_LEADING_CHAR
},
492 {"remove-section", required_argument
, 0, 'R'},
493 {"remove-relocations", required_argument
, 0, OPTION_REMOVE_RELOCS
},
494 {"rename-section", required_argument
, 0, OPTION_RENAME_SECTION
},
495 {"reverse-bytes", required_argument
, 0, OPTION_REVERSE_BYTES
},
496 {"section-alignment", required_argument
, 0, OPTION_PE_SECTION_ALIGNMENT
},
497 {"set-section-flags", required_argument
, 0, OPTION_SET_SECTION_FLAGS
},
498 {"set-section-alignment", required_argument
, 0, OPTION_SET_SECTION_ALIGNMENT
},
499 {"set-start", required_argument
, 0, OPTION_SET_START
},
500 {"srec-forceS3", no_argument
, 0, OPTION_SREC_FORCES3
},
501 {"srec-len", required_argument
, 0, OPTION_SREC_LEN
},
502 {"stack", required_argument
, 0, OPTION_STACK
},
503 {"strip-all", no_argument
, 0, 'S'},
504 {"strip-debug", no_argument
, 0, 'g'},
505 {"strip-dwo", no_argument
, 0, OPTION_STRIP_DWO
},
506 {"strip-symbol", required_argument
, 0, 'N'},
507 {"strip-symbols", required_argument
, 0, OPTION_STRIP_SYMBOLS
},
508 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
509 {"strip-unneeded-symbol", required_argument
, 0, OPTION_STRIP_UNNEEDED_SYMBOL
},
510 {"strip-unneeded-symbols", required_argument
, 0, OPTION_STRIP_UNNEEDED_SYMBOLS
},
511 {"subsystem", required_argument
, 0, OPTION_SUBSYSTEM
},
512 {"target", required_argument
, 0, 'F'},
513 {"update-section", required_argument
, 0, OPTION_UPDATE_SECTION
},
514 {"verbose", no_argument
, 0, 'v'},
515 {"verilog-data-width", required_argument
, 0, OPTION_VERILOG_DATA_WIDTH
},
516 {"version", no_argument
, 0, 'V'},
517 {"weaken", no_argument
, 0, OPTION_WEAKEN
},
518 {"weaken-symbol", required_argument
, 0, 'W'},
519 {"weaken-symbols", required_argument
, 0, OPTION_WEAKEN_SYMBOLS
},
520 {"wildcard", no_argument
, 0, 'w'},
521 {"writable-text", no_argument
, 0, OPTION_WRITABLE_TEXT
},
522 {0, no_argument
, 0, 0}
526 extern char *program_name
;
528 /* This flag distinguishes between strip and objcopy:
529 1 means this is 'strip'; 0 means this is 'objcopy'.
530 -1 means if we should use argv[0] to decide. */
533 /* The maximum length of an S record. This variable is defined in srec.c
534 and can be modified by the --srec-len parameter. */
535 extern unsigned int _bfd_srec_len
;
537 /* Restrict the generation of Srecords to type S3 only.
538 This variable is defined in bfd/srec.c and can be toggled
539 on by the --srec-forceS3 command line switch. */
540 extern bfd_boolean _bfd_srec_forceS3
;
542 /* Width of data in bytes for verilog output.
543 This variable is declared in bfd/verilog.c and can be modified by
544 the --verilog-data-width parameter. */
545 extern unsigned int VerilogDataWidth
;
547 /* Forward declarations. */
548 static void setup_section (bfd
*, asection
*, void *);
549 static void setup_bfd_headers (bfd
*, bfd
*);
550 static void copy_relocations_in_section (bfd
*, asection
*, void *);
551 static void copy_section (bfd
*, asection
*, void *);
552 static void get_sections (bfd
*, asection
*, void *);
553 static int compare_section_lma (const void *, const void *);
554 static void mark_symbols_used_in_relocations (bfd
*, asection
*, void *);
555 static bfd_boolean
write_debugging_info (bfd
*, void *, long *, asymbol
***);
556 static const char *lookup_sym_redefinition (const char *);
557 static const char *find_section_rename (const char *, flagword
*);
559 ATTRIBUTE_NORETURN
static void
560 copy_usage (FILE *stream
, int exit_status
)
562 fprintf (stream
, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name
);
563 fprintf (stream
, _(" Copies a binary file, possibly transforming it in the process\n"));
564 fprintf (stream
, _(" The options are:\n"));
565 fprintf (stream
, _("\
566 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
567 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
568 -B --binary-architecture <arch> Set output arch, when input is arch-less\n\
569 -F --target <bfdname> Set both input and output format to <bfdname>\n\
570 --debugging Convert debugging information, if possible\n\
571 -p --preserve-dates Copy modified/access timestamps to the output\n"));
572 if (DEFAULT_AR_DETERMINISTIC
)
573 fprintf (stream
, _("\
574 -D --enable-deterministic-archives\n\
575 Produce deterministic output when stripping archives (default)\n\
576 -U --disable-deterministic-archives\n\
577 Disable -D behavior\n"));
579 fprintf (stream
, _("\
580 -D --enable-deterministic-archives\n\
581 Produce deterministic output when stripping archives\n\
582 -U --disable-deterministic-archives\n\
583 Disable -D behavior (default)\n"));
584 fprintf (stream
, _("\
585 -j --only-section <name> Only copy section <name> into the output\n\
586 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
587 -R --remove-section <name> Remove section <name> from the output\n\
588 --remove-relocations <name> Remove relocations from section <name>\n\
589 -S --strip-all Remove all symbol and relocation information\n\
590 -g --strip-debug Remove all debugging symbols & sections\n\
591 --strip-dwo Remove all DWO sections\n\
592 --strip-unneeded Remove all symbols not needed by relocations\n\
593 -N --strip-symbol <name> Do not copy symbol <name>\n\
594 --strip-unneeded-symbol <name>\n\
595 Do not copy symbol <name> unless needed by\n\
597 --only-keep-debug Strip everything but the debug information\n\
598 --extract-dwo Copy only DWO sections\n\
599 --extract-symbol Remove section contents but keep symbols\n\
600 --keep-section <name> Do not strip section <name>\n\
601 -K --keep-symbol <name> Do not strip symbol <name>\n\
602 --keep-section-symbols Do not strip section symbols\n\
603 --keep-file-symbols Do not strip file symbol(s)\n\
604 --localize-hidden Turn all ELF hidden symbols into locals\n\
605 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
606 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
607 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
608 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
609 --weaken Force all global symbols to be marked as weak\n\
610 -w --wildcard Permit wildcard in symbol comparison\n\
611 -x --discard-all Remove all non-global symbols\n\
612 -X --discard-locals Remove any compiler-generated symbols\n\
613 -i --interleave[=<number>] Only copy N out of every <number> bytes\n\
614 --interleave-width <number> Set N for --interleave\n\
615 -b --byte <num> Select byte <num> in every interleaved block\n\
616 --gap-fill <val> Fill gaps between sections with <val>\n\
617 --pad-to <addr> Pad the last section up to address <addr>\n\
618 --set-start <addr> Set the start address to <addr>\n\
619 {--change-start|--adjust-start} <incr>\n\
620 Add <incr> to the start address\n\
621 {--change-addresses|--adjust-vma} <incr>\n\
622 Add <incr> to LMA, VMA and start addresses\n\
623 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
624 Change LMA and VMA of section <name> by <val>\n\
625 --change-section-lma <name>{=|+|-}<val>\n\
626 Change the LMA of section <name> by <val>\n\
627 --change-section-vma <name>{=|+|-}<val>\n\
628 Change the VMA of section <name> by <val>\n\
629 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
630 Warn if a named section does not exist\n\
631 --set-section-flags <name>=<flags>\n\
632 Set section <name>'s properties to <flags>\n\
633 --set-section-alignment <name>=<align>\n\
634 Set section <name>'s alignment to <align> bytes\n\
635 --add-section <name>=<file> Add section <name> found in <file> to output\n\
636 --update-section <name>=<file>\n\
637 Update contents of section <name> with\n\
638 contents found in <file>\n\
639 --dump-section <name>=<file> Dump the contents of section <name> into <file>\n\
640 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
641 --long-section-names {enable|disable|keep}\n\
642 Handle long section names in Coff objects.\n\
643 --change-leading-char Force output format's leading character style\n\
644 --remove-leading-char Remove leading character from global symbols\n\
645 --reverse-bytes=<num> Reverse <num> bytes at a time, in output sections with content\n\
646 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
647 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
649 --srec-len <number> Restrict the length of generated Srecords\n\
650 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
651 --strip-symbols <file> -N for all symbols listed in <file>\n\
652 --strip-unneeded-symbols <file>\n\
653 --strip-unneeded-symbol for all symbols listed\n\
655 --keep-symbols <file> -K for all symbols listed in <file>\n\
656 --localize-symbols <file> -L for all symbols listed in <file>\n\
657 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
658 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
659 --weaken-symbols <file> -W for all symbols listed in <file>\n\
660 --add-symbol <name>=[<section>:]<value>[,<flags>] Add a symbol\n\
661 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
662 --writable-text Mark the output text as writable\n\
663 --readonly-text Make the output text write protected\n\
664 --pure Mark the output file as demand paged\n\
665 --impure Mark the output file as impure\n\
666 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
667 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
668 --prefix-alloc-sections <prefix>\n\
669 Add <prefix> to start of every allocatable\n\
671 --file-alignment <num> Set PE file alignment to <num>\n\
672 --heap <reserve>[,<commit>] Set PE reserve/commit heap to <reserve>/\n\
674 --image-base <address> Set PE image base to <address>\n\
675 --section-alignment <num> Set PE section alignment to <num>\n\
676 --stack <reserve>[,<commit>] Set PE reserve/commit stack to <reserve>/\n\
678 --subsystem <name>[:<version>]\n\
679 Set PE subsystem to <name> [& <version>]\n\
680 --compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi}]\n\
681 Compress DWARF debug sections using zlib\n\
682 --decompress-debug-sections Decompress DWARF debug sections using zlib\n\
683 --elf-stt-common=[yes|no] Generate ELF common symbols with STT_COMMON\n\
685 --verilog-data-width <number> Specifies data width, in bytes, for verilog output\n\
686 -M --merge-notes Remove redundant entries in note sections\n\
687 --no-merge-notes Do not attempt to remove redundant notes (default)\n\
688 -v --verbose List all object files modified\n\
689 @<file> Read options from <file>\n\
690 -V --version Display this program's version number\n\
691 -h --help Display this output\n\
692 --info List object formats & architectures supported\n\
694 list_supported_targets (program_name
, stream
);
695 if (REPORT_BUGS_TO
[0] && exit_status
== 0)
696 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
700 ATTRIBUTE_NORETURN
static void
701 strip_usage (FILE *stream
, int exit_status
)
703 fprintf (stream
, _("Usage: %s <option(s)> in-file(s)\n"), program_name
);
704 fprintf (stream
, _(" Removes symbols and sections from files\n"));
705 fprintf (stream
, _(" The options are:\n"));
706 fprintf (stream
, _("\
707 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
708 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
709 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
710 -p --preserve-dates Copy modified/access timestamps to the output\n\
712 if (DEFAULT_AR_DETERMINISTIC
)
713 fprintf (stream
, _("\
714 -D --enable-deterministic-archives\n\
715 Produce deterministic output when stripping archives (default)\n\
716 -U --disable-deterministic-archives\n\
717 Disable -D behavior\n"));
719 fprintf (stream
, _("\
720 -D --enable-deterministic-archives\n\
721 Produce deterministic output when stripping archives\n\
722 -U --disable-deterministic-archives\n\
723 Disable -D behavior (default)\n"));
724 fprintf (stream
, _("\
725 -R --remove-section=<name> Also remove section <name> from the output\n\
726 --remove-relocations <name> Remove relocations from section <name>\n\
727 -s --strip-all Remove all symbol and relocation information\n\
728 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
729 --strip-dwo Remove all DWO sections\n\
730 --strip-unneeded Remove all symbols not needed by relocations\n\
731 --only-keep-debug Strip everything but the debug information\n\
732 -M --merge-notes Remove redundant entries in note sections (default)\n\
733 --no-merge-notes Do not attempt to remove redundant notes\n\
734 -N --strip-symbol=<name> Do not copy symbol <name>\n\
735 --keep-section=<name> Do not strip section <name>\n\
736 -K --keep-symbol=<name> Do not strip symbol <name>\n\
737 --keep-section-symbols Do not strip section symbols\n\
738 --keep-file-symbols Do not strip file symbol(s)\n\
739 -w --wildcard Permit wildcard in symbol comparison\n\
740 -x --discard-all Remove all non-global symbols\n\
741 -X --discard-locals Remove any compiler-generated symbols\n\
742 -v --verbose List all object files modified\n\
743 -V --version Display this program's version number\n\
744 -h --help Display this output\n\
745 --info List object formats & architectures supported\n\
746 -o <file> Place stripped output into <file>\n\
749 list_supported_targets (program_name
, stream
);
750 if (REPORT_BUGS_TO
[0] && exit_status
== 0)
751 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
755 /* Parse section flags into a flagword, with a fatal error if the
756 string can't be parsed. */
759 parse_flags (const char *s
)
769 snext
= strchr (s
, ',');
779 #define PARSE_FLAG(fname,fval) \
780 else if (strncasecmp (fname, s, len) == 0) ret |= fval
781 PARSE_FLAG ("alloc", SEC_ALLOC
);
782 PARSE_FLAG ("load", SEC_LOAD
);
783 PARSE_FLAG ("noload", SEC_NEVER_LOAD
);
784 PARSE_FLAG ("readonly", SEC_READONLY
);
785 PARSE_FLAG ("debug", SEC_DEBUGGING
);
786 PARSE_FLAG ("code", SEC_CODE
);
787 PARSE_FLAG ("data", SEC_DATA
);
788 PARSE_FLAG ("rom", SEC_ROM
);
789 PARSE_FLAG ("exclude", SEC_EXCLUDE
);
790 PARSE_FLAG ("share", SEC_COFF_SHARED
);
791 PARSE_FLAG ("contents", SEC_HAS_CONTENTS
);
792 PARSE_FLAG ("merge", SEC_MERGE
);
793 PARSE_FLAG ("strings", SEC_STRINGS
);
799 copy
= (char *) xmalloc (len
+ 1);
800 strncpy (copy
, s
, len
);
802 non_fatal (_("unrecognized section flag `%s'"), copy
);
803 fatal (_("supported flags: %s"),
804 "alloc, load, noload, readonly, debug, code, data, rom, exclude, share, contents, merge, strings");
814 /* Parse symbol flags into a flagword, with a fatal error if the
815 string can't be parsed. */
818 parse_symflags (const char *s
, const char **other
)
828 snext
= strchr (s
, ',');
837 #define PARSE_FLAG(fname, fval) \
838 else if (len == sizeof fname - 1 \
839 && strncasecmp (fname, s, len) == 0) \
842 #define PARSE_OTHER(fname, fval) \
843 else if (len >= sizeof fname \
844 && strncasecmp (fname, s, sizeof fname - 1) == 0) \
845 fval = xstrndup (s + sizeof fname - 1, len - sizeof fname + 1)
848 PARSE_FLAG ("local", BSF_LOCAL
);
849 PARSE_FLAG ("global", BSF_GLOBAL
);
850 PARSE_FLAG ("export", BSF_EXPORT
);
851 PARSE_FLAG ("debug", BSF_DEBUGGING
);
852 PARSE_FLAG ("function", BSF_FUNCTION
);
853 PARSE_FLAG ("weak", BSF_WEAK
);
854 PARSE_FLAG ("section", BSF_SECTION_SYM
);
855 PARSE_FLAG ("constructor", BSF_CONSTRUCTOR
);
856 PARSE_FLAG ("warning", BSF_WARNING
);
857 PARSE_FLAG ("indirect", BSF_INDIRECT
);
858 PARSE_FLAG ("file", BSF_FILE
);
859 PARSE_FLAG ("object", BSF_OBJECT
);
860 PARSE_FLAG ("synthetic", BSF_SYNTHETIC
);
861 PARSE_FLAG ("indirect-function", BSF_GNU_INDIRECT_FUNCTION
| BSF_FUNCTION
);
862 PARSE_FLAG ("unique-object", BSF_GNU_UNIQUE
| BSF_OBJECT
);
863 PARSE_OTHER ("before=", *other
);
871 copy
= (char *) xmalloc (len
+ 1);
872 strncpy (copy
, s
, len
);
874 non_fatal (_("unrecognized symbol flag `%s'"), copy
);
875 fatal (_("supported flags: %s"),
876 "local, global, export, debug, function, weak, section, "
877 "constructor, warning, indirect, file, object, synthetic, "
878 "indirect-function, unique-object, before=<othersym>");
888 /* Find and optionally add an entry in the change_sections list.
890 We need to be careful in how we match section names because of the support
891 for wildcard characters. For example suppose that the user has invoked
894 --set-section-flags .debug_*=debug
895 --set-section-flags .debug_str=readonly,debug
896 --change-section-address .debug_*ranges=0x1000
898 With the idea that all debug sections will receive the DEBUG flag, the
899 .debug_str section will also receive the READONLY flag and the
900 .debug_ranges and .debug_aranges sections will have their address set to
901 0x1000. (This may not make much sense, but it is just an example).
903 When adding the section name patterns to the section list we need to make
904 sure that previous entries do not match with the new entry, unless the
905 match is exact. (In which case we assume that the user is overriding
906 the previous entry with the new context).
908 When matching real section names to the section list we make use of the
909 wildcard characters, but we must do so in context. Eg if we are setting
910 section addresses then we match for .debug_ranges but not for .debug_info.
912 Finally, if ADD is false and we do find a match, we mark the section list
915 static struct section_list
*
916 find_section_list (const char *name
, bfd_boolean add
, unsigned int context
)
918 struct section_list
*p
, *match
= NULL
;
920 /* assert ((context & ((1 << 7) - 1)) != 0); */
922 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
926 if (strcmp (p
->pattern
, name
) == 0)
928 /* Check for context conflicts. */
929 if (((p
->context
& SECTION_CONTEXT_REMOVE
)
930 && (context
& SECTION_CONTEXT_COPY
))
931 || ((context
& SECTION_CONTEXT_REMOVE
)
932 && (p
->context
& SECTION_CONTEXT_COPY
)))
933 fatal (_("error: %s both copied and removed"), name
);
935 if (((p
->context
& SECTION_CONTEXT_SET_VMA
)
936 && (context
& SECTION_CONTEXT_ALTER_VMA
))
937 || ((context
& SECTION_CONTEXT_SET_VMA
)
938 && (context
& SECTION_CONTEXT_ALTER_VMA
)))
939 fatal (_("error: %s both sets and alters VMA"), name
);
941 if (((p
->context
& SECTION_CONTEXT_SET_LMA
)
942 && (context
& SECTION_CONTEXT_ALTER_LMA
))
943 || ((context
& SECTION_CONTEXT_SET_LMA
)
944 && (context
& SECTION_CONTEXT_ALTER_LMA
)))
945 fatal (_("error: %s both sets and alters LMA"), name
);
947 /* Extend the context. */
948 p
->context
|= context
;
952 /* If we are not adding a new name/pattern then
953 only check for a match if the context applies. */
954 else if (p
->context
& context
)
956 /* We could check for the presence of wildchar characters
957 first and choose between calling strcmp and fnmatch,
958 but is that really worth it ? */
959 if (p
->pattern
[0] == '!')
961 if (fnmatch (p
->pattern
+ 1, name
, 0) == 0)
969 if (fnmatch (p
->pattern
, name
, 0) == 0)
985 p
= (struct section_list
*) xmalloc (sizeof (struct section_list
));
988 p
->context
= context
;
993 p
->next
= change_sections
;
999 /* S1 is the entry node already in the table, S2 is the key node. */
1002 eq_string_redefnode (const void *s1
, const void *s2
)
1004 struct redefine_node
*node1
= (struct redefine_node
*) s1
;
1005 struct redefine_node
*node2
= (struct redefine_node
*) s2
;
1006 return !strcmp ((const char *) node1
->source
, (const char *) node2
->source
);
1009 /* P is redefine node. Hash value is generated from its "source" filed. */
1012 htab_hash_redefnode (const void *p
)
1014 struct redefine_node
*redefnode
= (struct redefine_node
*) p
;
1015 return htab_hash_string (redefnode
->source
);
1018 /* Create hashtab used for redefine node. */
1021 create_symbol2redef_htab (void)
1023 return htab_create_alloc (16, htab_hash_redefnode
, eq_string_redefnode
, NULL
,
1027 /* There is htab_hash_string but no htab_eq_string. Makes sense. */
1030 eq_string (const void *s1
, const void *s2
)
1032 return strcmp ((const char *) s1
, (const char *) s2
) == 0;
1036 create_symbol_htab (void)
1038 return htab_create_alloc (16, htab_hash_string
, eq_string
, NULL
, xcalloc
, free
);
1042 create_symbol_htabs (void)
1044 strip_specific_htab
= create_symbol_htab ();
1045 strip_unneeded_htab
= create_symbol_htab ();
1046 keep_specific_htab
= create_symbol_htab ();
1047 localize_specific_htab
= create_symbol_htab ();
1048 globalize_specific_htab
= create_symbol_htab ();
1049 keepglobal_specific_htab
= create_symbol_htab ();
1050 weaken_specific_htab
= create_symbol_htab ();
1051 redefine_specific_htab
= create_symbol2redef_htab ();
1052 /* As there is no bidirectional hash table in libiberty, need a reverse table
1053 to check duplicated target string. */
1054 redefine_specific_reverse_htab
= create_symbol_htab ();
1057 /* Add a symbol to strip_specific_list. */
1060 add_specific_symbol (const char *name
, htab_t htab
)
1062 *htab_find_slot (htab
, name
, INSERT
) = (char *) name
;
1065 /* Like add_specific_symbol, but the element type is void *. */
1068 add_specific_symbol_node (const void *node
, htab_t htab
)
1070 *htab_find_slot (htab
, node
, INSERT
) = (void *) node
;
1073 /* Add symbols listed in `filename' to strip_specific_list. */
1075 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
1076 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
1079 add_specific_symbols (const char *filename
, htab_t htab
, char **buffer_p
)
1085 unsigned int line_count
;
1087 size
= get_file_size (filename
);
1094 buffer
= (char *) xmalloc (size
+ 2);
1095 f
= fopen (filename
, FOPEN_RT
);
1097 fatal (_("cannot open '%s': %s"), filename
, strerror (errno
));
1099 if (fread (buffer
, 1, size
, f
) == 0 || ferror (f
))
1100 fatal (_("%s: fread failed"), filename
);
1103 buffer
[size
] = '\n';
1104 buffer
[size
+ 1] = '\0';
1108 for (line
= buffer
; * line
!= '\0'; line
++)
1113 int finished
= FALSE
;
1115 for (eol
= line
;; eol
++)
1121 /* Cope with \n\r. */
1129 /* Cope with \r\n. */
1140 /* Line comment, Terminate the line here, in case a
1141 name is present and then allow the rest of the
1142 loop to find the real end of the line. */
1154 /* A name may now exist somewhere between 'line' and 'eol'.
1155 Strip off leading whitespace and trailing whitespace,
1156 then add it to the list. */
1157 for (name
= line
; IS_WHITESPACE (* name
); name
++)
1159 for (name_end
= name
;
1160 (! IS_WHITESPACE (* name_end
))
1161 && (! IS_LINE_TERMINATOR (* name_end
));
1165 if (! IS_LINE_TERMINATOR (* name_end
))
1169 for (extra
= name_end
+ 1; IS_WHITESPACE (* extra
); extra
++)
1172 if (! IS_LINE_TERMINATOR (* extra
))
1173 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
1174 filename
, line_count
);
1179 if (name_end
> name
)
1180 add_specific_symbol (name
, htab
);
1182 /* Advance line pointer to end of line. The 'eol ++' in the for
1183 loop above will then advance us to the start of the next line. */
1188 /* Do not free the buffer. Parts of it will have been referenced
1189 in the calls to add_specific_symbol. */
1193 /* See whether a symbol should be stripped or kept
1194 based on strip_specific_list and keep_symbols. */
1197 is_specified_symbol_predicate (void **slot
, void *data
)
1199 struct is_specified_symbol_predicate_data
*d
=
1200 (struct is_specified_symbol_predicate_data
*) data
;
1201 const char *slot_name
= (char *) *slot
;
1203 if (*slot_name
!= '!')
1205 if (! fnmatch (slot_name
, d
->name
, 0))
1208 /* Continue traversal, there might be a non-match rule. */
1214 if (! fnmatch (slot_name
+ 1, d
->name
, 0))
1217 /* Stop traversal. */
1222 /* Continue traversal. */
1227 is_specified_symbol (const char *name
, htab_t htab
)
1231 struct is_specified_symbol_predicate_data data
;
1236 htab_traverse (htab
, is_specified_symbol_predicate
, &data
);
1241 return htab_find (htab
, name
) != NULL
;
1244 /* Return a pointer to the symbol used as a signature for GROUP. */
1247 group_signature (asection
*group
)
1249 bfd
*abfd
= group
->owner
;
1250 Elf_Internal_Shdr
*ghdr
;
1252 /* PR 20089: An earlier error may have prevented us from loading the symbol table. */
1256 if (bfd_get_flavour (abfd
) != bfd_target_elf_flavour
)
1259 ghdr
= &elf_section_data (group
)->this_hdr
;
1260 if (ghdr
->sh_link
== elf_onesymtab (abfd
))
1262 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
1263 Elf_Internal_Shdr
*symhdr
= &elf_symtab_hdr (abfd
);
1265 if (ghdr
->sh_info
> 0
1266 && ghdr
->sh_info
< symhdr
->sh_size
/ bed
->s
->sizeof_sym
)
1267 return isympp
[ghdr
->sh_info
- 1];
1272 /* Return TRUE if the section is a DWO section. */
1275 is_dwo_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
)
1280 if (sec
== NULL
|| (name
= bfd_section_name (sec
)) == NULL
)
1283 len
= strlen (name
);
1287 return strncmp (name
+ len
- 4, ".dwo", 4) == 0;
1290 /* Return TRUE if section SEC is in the update list. */
1293 is_update_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
)
1295 if (update_sections
!= NULL
)
1297 struct section_add
*pupdate
;
1299 for (pupdate
= update_sections
;
1301 pupdate
= pupdate
->next
)
1303 if (strcmp (sec
->name
, pupdate
->name
) == 0)
1312 is_mergeable_note_section (bfd
* abfd
, asection
* sec
)
1315 && bfd_get_flavour (abfd
) == bfd_target_elf_flavour
1316 && elf_section_data (sec
)->this_hdr
.sh_type
== SHT_NOTE
1317 /* FIXME: We currently only support merging GNU_BUILD_NOTEs.
1318 We should add support for more note types. */
1319 && (CONST_STRNEQ (sec
->name
, GNU_BUILD_ATTRS_SECTION_NAME
)))
1325 /* See if a non-group section is being removed. */
1328 is_strip_section_1 (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
)
1330 if (find_section_list (bfd_section_name (sec
), FALSE
, SECTION_CONTEXT_KEEP
)
1334 if (sections_removed
|| sections_copied
)
1336 struct section_list
*p
;
1337 struct section_list
*q
;
1339 p
= find_section_list (bfd_section_name (sec
), FALSE
,
1340 SECTION_CONTEXT_REMOVE
);
1341 q
= find_section_list (bfd_section_name (sec
), FALSE
,
1342 SECTION_CONTEXT_COPY
);
1345 fatal (_("error: section %s matches both remove and copy options"),
1346 bfd_section_name (sec
));
1347 if (p
&& is_update_section (abfd
, sec
))
1348 fatal (_("error: section %s matches both update and remove options"),
1349 bfd_section_name (sec
));
1353 if (sections_copied
&& q
== NULL
)
1357 if ((bfd_section_flags (sec
) & SEC_DEBUGGING
) != 0)
1359 if (strip_symbols
== STRIP_DEBUG
1360 || strip_symbols
== STRIP_UNNEEDED
1361 || strip_symbols
== STRIP_ALL
1362 || discard_locals
== LOCALS_ALL
1363 || convert_debugging
)
1365 /* By default we don't want to strip .reloc section.
1366 This section has for pe-coff special meaning. See
1367 pe-dll.c file in ld, and peXXigen.c in bfd for details. */
1368 if (strcmp (bfd_section_name (sec
), ".reloc") != 0)
1372 if (strip_symbols
== STRIP_DWO
)
1373 return is_dwo_section (abfd
, sec
);
1375 if (strip_symbols
== STRIP_NONDEBUG
)
1379 if (strip_symbols
== STRIP_NONDWO
)
1380 return !is_dwo_section (abfd
, sec
);
1385 /* See if a section is being removed. */
1388 is_strip_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
)
1390 if (is_strip_section_1 (abfd
, sec
))
1393 if ((bfd_section_flags (sec
) & SEC_GROUP
) != 0)
1397 asection
*elt
, *first
;
1399 gsym
= group_signature (sec
);
1400 /* Strip groups without a valid signature. */
1405 If we are going to strip the group signature symbol, then
1406 strip the group section too. */
1408 if ((strip_symbols
== STRIP_ALL
1409 && !is_specified_symbol (gname
, keep_specific_htab
))
1410 || is_specified_symbol (gname
, strip_specific_htab
))
1413 /* Remove the group section if all members are removed. */
1414 first
= elt
= elf_next_in_group (sec
);
1417 if (!is_strip_section_1 (abfd
, elt
))
1419 elt
= elf_next_in_group (elt
);
1431 is_nondebug_keep_contents_section (bfd
*ibfd
, asection
*isection
)
1433 /* Always keep ELF note sections. */
1434 if (bfd_get_flavour (ibfd
) == bfd_target_elf_flavour
)
1435 return elf_section_type (isection
) == SHT_NOTE
;
1437 /* Always keep the .buildid section for PE/COFF.
1439 Strictly, this should be written "always keep the section storing the debug
1440 directory", but that may be the .text section for objects produced by some
1441 tools, which it is not sensible to keep. */
1442 if (bfd_get_flavour (ibfd
) == bfd_target_coff_flavour
)
1443 return strcmp (bfd_section_name (isection
), ".buildid") == 0;
1448 /* Return true if SYM is a hidden symbol. */
1451 is_hidden_symbol (asymbol
*sym
)
1453 elf_symbol_type
*elf_sym
;
1455 elf_sym
= elf_symbol_from (sym
);
1456 if (elf_sym
!= NULL
)
1457 switch (ELF_ST_VISIBILITY (elf_sym
->internal_elf_sym
.st_other
))
1466 /* Empty name is hopefully never a valid symbol name. */
1467 static const char * empty_name
= "";
1470 need_sym_before (struct addsym_node
**node
, const char *sym
)
1473 struct addsym_node
*ptr
= add_sym_list
;
1475 /* 'othersym' symbols are at the front of the list. */
1476 for (count
= 0; count
< add_symbols
; count
++)
1480 if (ptr
->othersym
== empty_name
)
1482 else if (strcmp (ptr
->othersym
, sym
) == 0)
1484 free ((char *) ptr
->othersym
);
1485 ptr
->othersym
= empty_name
;
1495 create_new_symbol (struct addsym_node
*ptr
, bfd
*obfd
)
1497 asymbol
*sym
= bfd_make_empty_symbol (obfd
);
1499 bfd_set_asymbol_name (sym
, ptr
->symdef
);
1500 sym
->value
= ptr
->symval
;
1501 sym
->flags
= ptr
->flags
;
1504 asection
*sec
= bfd_get_section_by_name (obfd
, ptr
->section
);
1506 fatal (_("Section %s not found"), ptr
->section
);
1510 sym
->section
= bfd_abs_section_ptr
;
1514 /* Choose which symbol entries to copy; put the result in OSYMS.
1515 We don't copy in place, because that confuses the relocs.
1516 Return the number of symbols to print. */
1519 filter_symbols (bfd
*abfd
, bfd
*obfd
, asymbol
**osyms
,
1520 asymbol
**isyms
, long symcount
)
1522 asymbol
**from
= isyms
, **to
= osyms
;
1523 long src_count
= 0, dst_count
= 0;
1524 int relocatable
= (abfd
->flags
& (EXEC_P
| DYNAMIC
)) == 0;
1526 for (; src_count
< symcount
; src_count
++)
1528 asymbol
*sym
= from
[src_count
];
1529 flagword flags
= sym
->flags
;
1530 char *name
= (char *) bfd_asymbol_name (sym
);
1532 bfd_boolean used_in_reloc
= FALSE
;
1533 bfd_boolean undefined
;
1534 bfd_boolean rem_leading_char
;
1535 bfd_boolean add_leading_char
;
1537 undefined
= bfd_is_und_section (bfd_asymbol_section (sym
));
1541 struct addsym_node
*ptr
;
1543 if (need_sym_before (&ptr
, name
))
1544 to
[dst_count
++] = create_new_symbol (ptr
, obfd
);
1547 if (htab_elements (redefine_specific_htab
) || section_rename_list
)
1551 new_name
= (char *) lookup_sym_redefinition (name
);
1552 if (new_name
== name
1553 && (flags
& BSF_SECTION_SYM
) != 0)
1554 new_name
= (char *) find_section_rename (name
, NULL
);
1555 bfd_set_asymbol_name (sym
, new_name
);
1559 /* Check if we will remove the current leading character. */
1562 && name
[0] == bfd_get_symbol_leading_char (abfd
)
1563 && (change_leading_char
1564 || (remove_leading_char
1565 && ((flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0
1567 || bfd_is_com_section (bfd_asymbol_section (sym
))))));
1569 /* Check if we will add a new leading character. */
1572 && (bfd_get_symbol_leading_char (obfd
) != '\0')
1573 && (bfd_get_symbol_leading_char (abfd
) == '\0'
1574 || (name
[0] == bfd_get_symbol_leading_char (abfd
)));
1576 /* Short circuit for change_leading_char if we can do it in-place. */
1577 if (rem_leading_char
&& add_leading_char
&& !prefix_symbols_string
)
1579 name
[0] = bfd_get_symbol_leading_char (obfd
);
1580 bfd_set_asymbol_name (sym
, name
);
1581 rem_leading_char
= FALSE
;
1582 add_leading_char
= FALSE
;
1585 /* Remove leading char. */
1586 if (rem_leading_char
)
1587 bfd_set_asymbol_name (sym
, ++name
);
1589 /* Add new leading char and/or prefix. */
1590 if (add_leading_char
|| prefix_symbols_string
)
1593 size_t len
= strlen (name
) + 1;
1595 if (add_leading_char
)
1597 if (prefix_symbols_string
)
1598 len
+= strlen (prefix_symbols_string
);
1600 ptr
= n
= (char *) xmalloc (len
);
1601 if (add_leading_char
)
1602 *ptr
++ = bfd_get_symbol_leading_char (obfd
);
1604 if (prefix_symbols_string
)
1606 strcpy (ptr
, prefix_symbols_string
);
1607 ptr
+= strlen (prefix_symbols_string
);
1611 bfd_set_asymbol_name (sym
, n
);
1615 if (strip_symbols
== STRIP_ALL
)
1617 else if ((flags
& BSF_KEEP
) != 0 /* Used in relocation. */
1618 || ((flags
& BSF_SECTION_SYM
) != 0
1619 && ((*bfd_asymbol_section (sym
)->symbol_ptr_ptr
)->flags
1623 used_in_reloc
= TRUE
;
1625 else if (relocatable
/* Relocatable file. */
1626 && ((flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0
1627 || bfd_is_com_section (bfd_asymbol_section (sym
))))
1629 else if (bfd_decode_symclass (sym
) == 'I')
1630 /* Global symbols in $idata sections need to be retained
1631 even if relocatable is FALSE. External users of the
1632 library containing the $idata section may reference these
1635 else if ((flags
& BSF_GLOBAL
) != 0 /* Global symbol. */
1636 || (flags
& BSF_WEAK
) != 0
1638 || bfd_is_com_section (bfd_asymbol_section (sym
)))
1639 keep
= strip_symbols
!= STRIP_UNNEEDED
;
1640 else if ((flags
& BSF_DEBUGGING
) != 0) /* Debugging symbol. */
1641 keep
= (strip_symbols
!= STRIP_DEBUG
1642 && strip_symbols
!= STRIP_UNNEEDED
1643 && ! convert_debugging
);
1644 else if (bfd_coff_get_comdat_section (abfd
, bfd_asymbol_section (sym
)))
1645 /* COMDAT sections store special information in local
1646 symbols, so we cannot risk stripping any of them. */
1648 else /* Local symbol. */
1649 keep
= (strip_symbols
!= STRIP_UNNEEDED
1650 && (discard_locals
!= LOCALS_ALL
1651 && (discard_locals
!= LOCALS_START_L
1652 || ! bfd_is_local_label (abfd
, sym
))));
1654 if (keep
&& is_specified_symbol (name
, strip_specific_htab
))
1656 /* There are multiple ways to set 'keep' above, but if it
1657 was the relocatable symbol case, then that's an error. */
1660 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name
);
1668 && !(flags
& BSF_KEEP
)
1669 && is_specified_symbol (name
, strip_unneeded_htab
))
1673 && ((keep_file_symbols
&& (flags
& BSF_FILE
))
1674 || is_specified_symbol (name
, keep_specific_htab
)))
1677 if (keep
&& is_strip_section (abfd
, bfd_asymbol_section (sym
)))
1682 if (((flags
& BSF_GLOBAL
) != 0
1684 && (weaken
|| is_specified_symbol (name
, weaken_specific_htab
)))
1686 sym
->flags
&= ~ BSF_GLOBAL
;
1687 sym
->flags
|= BSF_WEAK
;
1691 && (flags
& (BSF_GLOBAL
| BSF_WEAK
))
1692 && (is_specified_symbol (name
, localize_specific_htab
)
1693 || (htab_elements (keepglobal_specific_htab
) != 0
1694 && ! is_specified_symbol (name
, keepglobal_specific_htab
))
1695 || (localize_hidden
&& is_hidden_symbol (sym
))))
1697 sym
->flags
&= ~ (BSF_GLOBAL
| BSF_WEAK
);
1698 sym
->flags
|= BSF_LOCAL
;
1702 && (flags
& BSF_LOCAL
)
1703 && is_specified_symbol (name
, globalize_specific_htab
))
1705 sym
->flags
&= ~ BSF_LOCAL
;
1706 sym
->flags
|= BSF_GLOBAL
;
1709 to
[dst_count
++] = sym
;
1714 struct addsym_node
*ptr
= add_sym_list
;
1716 for (src_count
= 0; src_count
< add_symbols
; src_count
++)
1720 if (ptr
->othersym
!= empty_name
)
1721 fatal (_("'before=%s' not found"), ptr
->othersym
);
1724 to
[dst_count
++] = create_new_symbol (ptr
, obfd
);
1730 to
[dst_count
] = NULL
;
1735 /* Find the redefined name of symbol SOURCE. */
1738 lookup_sym_redefinition (const char *source
)
1740 struct redefine_node key_node
= {(char *) source
, NULL
};
1741 struct redefine_node
*redef_node
1742 = (struct redefine_node
*) htab_find (redefine_specific_htab
, &key_node
);
1744 return redef_node
== NULL
? source
: redef_node
->target
;
1747 /* Insert a node into symbol redefine hash tabel. */
1750 add_redefine_and_check (const char *cause
, const char *source
,
1753 struct redefine_node
*new_node
1754 = (struct redefine_node
*) xmalloc (sizeof (struct redefine_node
));
1756 new_node
->source
= strdup (source
);
1757 new_node
->target
= strdup (target
);
1759 if (htab_find (redefine_specific_htab
, new_node
) != HTAB_EMPTY_ENTRY
)
1760 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1763 if (htab_find (redefine_specific_reverse_htab
, target
) != HTAB_EMPTY_ENTRY
)
1764 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1767 /* Insert the NEW_NODE into hash table for quick search. */
1768 add_specific_symbol_node (new_node
, redefine_specific_htab
);
1770 /* Insert the target string into the reverse hash table, this is needed for
1771 duplicated target string check. */
1772 add_specific_symbol (new_node
->target
, redefine_specific_reverse_htab
);
1776 /* Handle the --redefine-syms option. Read lines containing "old new"
1777 from the file, and add them to the symbol redefine list. */
1780 add_redefine_syms_file (const char *filename
)
1789 file
= fopen (filename
, "r");
1791 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1792 filename
, strerror (errno
));
1795 buf
= (char *) xmalloc (bufsize
+ 1 /* For the terminating NUL. */);
1803 /* Collect the input symbol name. */
1804 while (! IS_WHITESPACE (c
) && ! IS_LINE_TERMINATOR (c
) && c
!= EOF
)
1812 buf
= (char *) xrealloc (buf
, bufsize
+ 1);
1820 /* Eat white space between the symbol names. */
1821 while (IS_WHITESPACE (c
))
1823 if (c
== '#' || IS_LINE_TERMINATOR (c
))
1828 /* Collect the output symbol name. */
1830 while (! IS_WHITESPACE (c
) && ! IS_LINE_TERMINATOR (c
) && c
!= EOF
)
1838 buf
= (char *) xrealloc (buf
, bufsize
+ 1);
1846 /* Eat white space at end of line. */
1847 while (! IS_LINE_TERMINATOR(c
) && c
!= EOF
&& IS_WHITESPACE (c
))
1852 if ((c
== '\r' && (c
= getc (file
)) == '\n')
1853 || c
== '\n' || c
== EOF
)
1856 /* Append the redefinition to the list. */
1858 add_redefine_and_check (filename
, &buf
[0], &buf
[outsym_off
]);
1869 fatal (_("%s:%d: garbage found at end of line"), filename
, lineno
);
1871 if (len
!= 0 && (outsym_off
== 0 || outsym_off
== len
))
1872 fatal (_("%s:%d: missing new symbol name"), filename
, lineno
);
1875 /* Eat the rest of the line and finish it. */
1876 while (c
!= '\n' && c
!= EOF
)
1882 fatal (_("%s:%d: premature end of file"), filename
, lineno
);
1888 /* Copy unknown object file IBFD onto OBFD.
1889 Returns TRUE upon success, FALSE otherwise. */
1892 copy_unknown_object (bfd
*ibfd
, bfd
*obfd
)
1900 if (bfd_stat_arch_elt (ibfd
, &buf
) != 0)
1902 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
1909 non_fatal (_("stat returns negative size for `%s'"),
1910 bfd_get_archive_filename (ibfd
));
1914 if (bfd_seek (ibfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1916 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1921 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1922 bfd_get_archive_filename (ibfd
), bfd_get_filename (obfd
));
1924 cbuf
= (char *) xmalloc (BUFSIZE
);
1926 while (ncopied
< size
)
1928 tocopy
= size
- ncopied
;
1929 if (tocopy
> BUFSIZE
)
1932 if (bfd_bread (cbuf
, (bfd_size_type
) tocopy
, ibfd
)
1933 != (bfd_size_type
) tocopy
)
1935 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
1940 if (bfd_bwrite (cbuf
, (bfd_size_type
) tocopy
, obfd
)
1941 != (bfd_size_type
) tocopy
)
1943 bfd_nonfatal_message (NULL
, obfd
, NULL
, NULL
);
1951 /* We should at least to be able to read it back when copying an
1952 unknown object in an archive. */
1953 chmod (bfd_get_filename (obfd
), buf
.st_mode
| S_IRUSR
);
1958 typedef struct objcopy_internal_note
1960 Elf_Internal_Note note
;
1961 unsigned long padded_namesz
;
1964 } objcopy_internal_note
;
1966 #define DEBUG_MERGE 0
1969 #define merge_debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
1971 #define merge_debug(format, ...)
1974 /* Returns TRUE iff PNOTE1 overlaps or adjoins PNOTE2. */
1977 overlaps_or_adjoins (objcopy_internal_note
* pnote1
,
1978 objcopy_internal_note
* pnote2
)
1980 if (pnote1
->end
< pnote2
->start
)
1981 /* FIXME: Alignment of 16 bytes taken from x86_64 binaries.
1982 Really we should extract the alignment of the section
1983 covered by the notes. */
1984 return BFD_ALIGN (pnote1
->end
, 16) < pnote2
->start
;
1986 if (pnote2
->end
< pnote2
->start
)
1987 return BFD_ALIGN (pnote2
->end
, 16) < pnote1
->start
;
1989 if (pnote1
->end
< pnote2
->end
)
1992 if (pnote2
->end
< pnote1
->end
)
1998 /* Returns TRUE iff NEEDLE is fully contained by HAYSTACK. */
2001 contained_by (objcopy_internal_note
* needle
,
2002 objcopy_internal_note
* haystack
)
2004 return needle
->start
>= haystack
->start
&& needle
->end
<= haystack
->end
;
2008 is_open_note (objcopy_internal_note
* pnote
)
2010 return pnote
->note
.type
== NT_GNU_BUILD_ATTRIBUTE_OPEN
;
2014 is_func_note (objcopy_internal_note
* pnote
)
2016 return pnote
->note
.type
== NT_GNU_BUILD_ATTRIBUTE_FUNC
;
2020 is_deleted_note (objcopy_internal_note
* pnote
)
2022 return pnote
->note
.type
== 0;
2026 is_version_note (objcopy_internal_note
* pnote
)
2028 return (pnote
->note
.namesz
> 4
2029 && pnote
->note
.namedata
[0] == 'G'
2030 && pnote
->note
.namedata
[1] == 'A'
2031 && pnote
->note
.namedata
[2] == '$'
2032 && pnote
->note
.namedata
[3] == GNU_BUILD_ATTRIBUTE_VERSION
);
2036 is_64bit (bfd
* abfd
)
2038 /* Should never happen, but let's be paranoid. */
2039 if (bfd_get_flavour (abfd
) != bfd_target_elf_flavour
)
2042 return elf_elfheader (abfd
)->e_ident
[EI_CLASS
] == ELFCLASS64
;
2045 /* This sorting function is used to get the notes into an order
2046 that makes merging easy. */
2049 compare_gnu_build_notes (const void * data1
, const void * data2
)
2051 objcopy_internal_note
* pnote1
= (objcopy_internal_note
*) data1
;
2052 objcopy_internal_note
* pnote2
= (objcopy_internal_note
*) data2
;
2054 /* Sort notes based upon the attribute they record. */
2055 int cmp
= memcmp (pnote1
->note
.namedata
+ 3,
2056 pnote2
->note
.namedata
+ 3,
2057 pnote1
->note
.namesz
< pnote2
->note
.namesz
?
2058 pnote1
->note
.namesz
- 3 : pnote2
->note
.namesz
- 3);
2062 if (pnote1
->end
< pnote2
->start
)
2064 if (pnote1
->start
> pnote2
->end
)
2067 /* Overlaps - we should merge the two ranges. */
2068 if (pnote1
->start
< pnote2
->start
)
2070 if (pnote1
->end
> pnote2
->end
)
2072 if (pnote1
->end
< pnote2
->end
)
2075 /* Put OPEN notes before function notes. */
2076 if (is_open_note (pnote1
) && ! is_open_note (pnote2
))
2078 if (! is_open_note (pnote1
) && is_open_note (pnote2
))
2084 /* This sorting function is used to get the notes into an order
2085 that makes eliminating address ranges easier. */
2088 sort_gnu_build_notes (const void * data1
, const void * data2
)
2090 objcopy_internal_note
* pnote1
= (objcopy_internal_note
*) data1
;
2091 objcopy_internal_note
* pnote2
= (objcopy_internal_note
*) data2
;
2093 if (pnote1
->note
.type
!= pnote2
->note
.type
)
2095 /* Move deleted notes to the end. */
2096 if (is_deleted_note (pnote1
)) /* 1: OFD 2: OFD */
2099 /* Move OPEN notes to the start. */
2100 if (is_open_note (pnote1
)) /* 1: OF 2: OFD */
2103 if (is_deleted_note (pnote2
)) /* 1: F 2: O D */
2106 return 1; /* 1: F 2: O */
2109 /* Sort by starting address. */
2110 if (pnote1
->start
< pnote2
->start
)
2112 if (pnote1
->start
> pnote2
->start
)
2115 /* Then by end address (bigger range first). */
2116 if (pnote1
->end
> pnote2
->end
)
2118 if (pnote1
->end
< pnote2
->end
)
2121 /* Then by attribute type. */
2122 if (pnote1
->note
.namesz
> 4
2123 && pnote2
->note
.namesz
> 4
2124 && pnote1
->note
.namedata
[3] != pnote2
->note
.namedata
[3])
2125 return pnote1
->note
.namedata
[3] - pnote2
->note
.namedata
[3];
2130 /* Merge the notes on SEC, removing redundant entries.
2131 Returns the new, smaller size of the section upon success. */
2133 static bfd_size_type
2134 merge_gnu_build_notes (bfd
* abfd
,
2137 bfd_byte
* contents
)
2139 objcopy_internal_note
* pnotes_end
;
2140 objcopy_internal_note
* pnotes
= NULL
;
2141 objcopy_internal_note
* pnote
;
2142 bfd_size_type remain
= size
;
2143 unsigned version_1_seen
= 0;
2144 unsigned version_2_seen
= 0;
2145 unsigned version_3_seen
= 0;
2146 const char * err
= NULL
;
2147 bfd_byte
* in
= contents
;
2148 unsigned long previous_func_start
= 0;
2149 unsigned long previous_open_start
= 0;
2150 unsigned long previous_func_end
= 0;
2151 unsigned long previous_open_end
= 0;
2154 relsize
= bfd_get_reloc_upper_bound (abfd
, sec
);
2160 /* If there are relocs associated with this section then we
2161 cannot safely merge it. */
2162 relpp
= (arelent
**) xmalloc (relsize
);
2163 relcount
= bfd_canonicalize_reloc (abfd
, sec
, relpp
, isympp
);
2168 non_fatal (_("%s[%s]: Cannot merge - there are relocations against this section"),
2169 bfd_get_filename (abfd
), bfd_section_name (sec
));
2174 /* Make a copy of the notes and convert to our internal format.
2175 Minimum size of a note is 12 bytes. Also locate the version
2176 notes and check them. */
2177 pnote
= pnotes
= (objcopy_internal_note
*)
2178 xcalloc ((size
/ 12), sizeof (* pnote
));
2179 while (remain
>= 12)
2183 pnote
->note
.namesz
= bfd_get_32 (abfd
, in
);
2184 pnote
->note
.descsz
= bfd_get_32 (abfd
, in
+ 4);
2185 pnote
->note
.type
= bfd_get_32 (abfd
, in
+ 8);
2186 pnote
->padded_namesz
= (pnote
->note
.namesz
+ 3) & ~3;
2188 if (((pnote
->note
.descsz
+ 3) & ~3) != pnote
->note
.descsz
)
2190 err
= _("corrupt GNU build attribute note: description size not a factor of 4");
2194 if (pnote
->note
.type
!= NT_GNU_BUILD_ATTRIBUTE_OPEN
2195 && pnote
->note
.type
!= NT_GNU_BUILD_ATTRIBUTE_FUNC
)
2197 err
= _("corrupt GNU build attribute note: wrong note type");
2201 if (pnote
->padded_namesz
+ pnote
->note
.descsz
+ 12 > remain
)
2203 err
= _("corrupt GNU build attribute note: note too big");
2207 if (pnote
->note
.namesz
< 2)
2209 err
= _("corrupt GNU build attribute note: name too small");
2213 pnote
->note
.namedata
= (char *)(in
+ 12);
2214 pnote
->note
.descdata
= (char *)(in
+ 12 + pnote
->padded_namesz
);
2216 remain
-= 12 + pnote
->padded_namesz
+ pnote
->note
.descsz
;
2217 in
+= 12 + pnote
->padded_namesz
+ pnote
->note
.descsz
;
2219 if (pnote
->note
.namesz
> 2
2220 && pnote
->note
.namedata
[0] == '$'
2221 && pnote
->note
.namedata
[1] == GNU_BUILD_ATTRIBUTE_VERSION
2222 && pnote
->note
.namedata
[2] == '1')
2224 else if (is_version_note (pnote
))
2226 if (pnote
->note
.namedata
[4] == '2')
2228 else if (pnote
->note
.namedata
[4] == '3')
2232 err
= _("corrupt GNU build attribute note: unsupported version");
2237 switch (pnote
->note
.descsz
)
2244 start
= bfd_get_32 (abfd
, pnote
->note
.descdata
);
2245 /* FIXME: For version 1 and 2 notes we should try to
2246 calculate the end address by finding a symbol whose
2247 value is START, and then adding in its size.
2249 For now though, since v1 and v2 was not intended to
2250 handle gaps, we chose an artificially large end
2256 start
= bfd_get_32 (abfd
, pnote
->note
.descdata
);
2257 end
= bfd_get_32 (abfd
, pnote
->note
.descdata
+ 4);
2261 start
= bfd_get_64 (abfd
, pnote
->note
.descdata
);
2262 end
= bfd_get_64 (abfd
, pnote
->note
.descdata
+ 8);
2266 err
= _("corrupt GNU build attribute note: bad description size");
2271 /* This can happen with PPC64LE binaries where empty notes are
2272 encoded as start = end + 4. */
2275 if (is_open_note (pnote
))
2278 previous_open_start
= start
;
2280 pnote
->start
= previous_open_start
;
2283 previous_open_end
= end
;
2285 pnote
->end
= previous_open_end
;
2290 previous_func_start
= start
;
2292 pnote
->start
= previous_func_start
;
2295 previous_func_end
= end
;
2297 pnote
->end
= previous_func_end
;
2300 if (pnote
->note
.namedata
[pnote
->note
.namesz
- 1] != 0)
2302 err
= _("corrupt GNU build attribute note: name not NUL terminated");
2311 /* Check that the notes are valid. */
2314 err
= _("corrupt GNU build attribute notes: excess data at end");
2318 if (version_1_seen
== 0 && version_2_seen
== 0 && version_3_seen
== 0)
2321 err
= _("bad GNU build attribute notes: no known versions detected");
2324 /* This happens with glibc. No idea why. */
2325 non_fatal (_("%s[%s]: Warning: version note missing - assuming version 3"),
2326 bfd_get_filename (abfd
), bfd_section_name (sec
));
2331 if ( (version_1_seen
> 0 && version_2_seen
> 0)
2332 || (version_1_seen
> 0 && version_3_seen
> 0)
2333 || (version_2_seen
> 0 && version_3_seen
> 0))
2335 err
= _("bad GNU build attribute notes: multiple different versions");
2339 /* We are now only supporting the merging v3+ notes
2340 - it makes things much simpler. */
2341 if (version_3_seen
== 0)
2343 merge_debug ("%s: skipping merge - not using v3 notes", bfd_section_name (sec
));
2347 merge_debug ("Merging section %s which contains %ld notes\n",
2348 sec
->name
, pnotes_end
- pnotes
);
2350 /* Sort the notes. */
2351 qsort (pnotes
, pnotes_end
- pnotes
, sizeof (* pnotes
),
2352 compare_gnu_build_notes
);
2355 merge_debug ("Results of initial sort:\n");
2356 for (pnote
= pnotes
; pnote
< pnotes_end
; pnote
++)
2357 merge_debug ("offset %#08lx range %#08lx..%#08lx type %ld attribute %d namesz %ld\n",
2358 (pnote
->note
.namedata
- (char *) contents
) - 12,
2359 pnote
->start
, pnote
->end
,
2361 pnote
->note
.namedata
[3],
2366 /* Now merge the notes. The rules are:
2367 1. If a note has a zero range, it can be eliminated.
2368 2. If two notes have the same namedata then:
2369 2a. If one note's range is fully covered by the other note
2370 then it can be deleted.
2371 2b. If one note's range partially overlaps or adjoins the
2372 other note then if they are both of the same type (open
2373 or func) then they can be merged and one deleted. If
2374 they are of different types then they cannot be merged. */
2375 for (pnote
= pnotes
; pnote
< pnotes_end
; pnote
++)
2377 /* Skip already deleted notes.
2378 FIXME: Can this happen ? We are scanning forwards and
2379 deleting backwards after all. */
2380 if (is_deleted_note (pnote
))
2383 /* Rule 1 - delete 0-range notes. */
2384 if (pnote
->start
== pnote
->end
)
2386 merge_debug ("Delete note at offset %#08lx - empty range\n",
2387 (pnote
->note
.namedata
- (char *) contents
) - 12);
2388 pnote
->note
.type
= 0;
2393 objcopy_internal_note
* back
;
2395 /* Rule 2: Check to see if there is an identical previous note. */
2396 for (iter
= 0, back
= pnote
- 1; back
>= pnotes
; back
--)
2398 if (is_deleted_note (back
))
2401 /* Our sorting function should have placed all identically
2402 attributed notes together, so if we see a note of a different
2403 attribute type stop searching. */
2404 if (back
->note
.namesz
!= pnote
->note
.namesz
2405 || memcmp (back
->note
.namedata
,
2406 pnote
->note
.namedata
, pnote
->note
.namesz
) != 0)
2409 if (back
->start
== pnote
->start
2410 && back
->end
== pnote
->end
)
2412 merge_debug ("Delete note at offset %#08lx - duplicate of note at offset %#08lx\n",
2413 (pnote
->note
.namedata
- (char *) contents
) - 12,
2414 (back
->note
.namedata
- (char *) contents
) - 12);
2415 pnote
->note
.type
= 0;
2420 if (contained_by (pnote
, back
))
2422 merge_debug ("Delete note at offset %#08lx - fully contained by note at %#08lx\n",
2423 (pnote
->note
.namedata
- (char *) contents
) - 12,
2424 (back
->note
.namedata
- (char *) contents
) - 12);
2425 pnote
->note
.type
= 0;
2430 /* This should not happen as we have sorted the
2431 notes with earlier starting addresses first. */
2432 if (contained_by (back
, pnote
))
2433 merge_debug ("ERROR: UNEXPECTED CONTAINMENT\n");
2437 if (overlaps_or_adjoins (back
, pnote
)
2438 && is_func_note (back
) == is_func_note (pnote
))
2440 merge_debug ("Delete note at offset %#08lx - merge into note at %#08lx\n",
2441 (pnote
->note
.namedata
- (char *) contents
) - 12,
2442 (back
->note
.namedata
- (char *) contents
) - 12);
2444 back
->end
= back
->end
> pnote
->end
? back
->end
: pnote
->end
;
2445 back
->start
= back
->start
< pnote
->start
? back
->start
: pnote
->start
;
2446 pnote
->note
.type
= 0;
2450 /* Don't scan too far back however. */
2453 /* FIXME: Not sure if this can ever be triggered. */
2454 merge_debug ("ITERATION LIMIT REACHED\n");
2459 if (! is_deleted_note (pnote
))
2460 merge_debug ("Unable to do anything with note at %#08lx\n",
2461 (pnote
->note
.namedata
- (char *) contents
) - 12);
2465 /* Resort the notes. */
2466 merge_debug ("Final sorting of notes\n");
2467 qsort (pnotes
, pnotes_end
- pnotes
, sizeof (* pnotes
), sort_gnu_build_notes
);
2469 /* Reconstruct the ELF notes. */
2470 bfd_byte
* new_contents
;
2473 bfd_size_type new_size
;
2474 bfd_vma prev_start
= 0;
2475 bfd_vma prev_end
= 0;
2477 /* Not sure how, but the notes might grow in size.
2478 (eg see PR 1774507). Allow for this here. */
2479 new = new_contents
= xmalloc (size
* 2);
2480 for (pnote
= pnotes
, old
= contents
;
2484 bfd_size_type note_size
= 12 + pnote
->padded_namesz
+ pnote
->note
.descsz
;
2486 if (! is_deleted_note (pnote
))
2488 /* Create the note, potentially using the
2489 address range of the previous note. */
2490 if (pnote
->start
== prev_start
&& pnote
->end
== prev_end
)
2492 bfd_put_32 (abfd
, pnote
->note
.namesz
, new);
2493 bfd_put_32 (abfd
, 0, new + 4);
2494 bfd_put_32 (abfd
, pnote
->note
.type
, new + 8);
2496 memcpy (new, pnote
->note
.namedata
, pnote
->note
.namesz
);
2497 if (pnote
->note
.namesz
< pnote
->padded_namesz
)
2498 memset (new + pnote
->note
.namesz
, 0, pnote
->padded_namesz
- pnote
->note
.namesz
);
2499 new += pnote
->padded_namesz
;
2503 bfd_put_32 (abfd
, pnote
->note
.namesz
, new);
2504 bfd_put_32 (abfd
, is_64bit (abfd
) ? 16 : 8, new + 4);
2505 bfd_put_32 (abfd
, pnote
->note
.type
, new + 8);
2507 memcpy (new, pnote
->note
.namedata
, pnote
->note
.namesz
);
2508 if (pnote
->note
.namesz
< pnote
->padded_namesz
)
2509 memset (new + pnote
->note
.namesz
, 0, pnote
->padded_namesz
- pnote
->note
.namesz
);
2510 new += pnote
->padded_namesz
;
2511 if (is_64bit (abfd
))
2513 bfd_put_64 (abfd
, pnote
->start
, new);
2514 bfd_put_64 (abfd
, pnote
->end
, new + 8);
2519 bfd_put_32 (abfd
, pnote
->start
, new);
2520 bfd_put_32 (abfd
, pnote
->end
, new + 4);
2524 prev_start
= pnote
->start
;
2525 prev_end
= pnote
->end
;
2533 merge_debug ("Results of merge:\n");
2534 for (pnote
= pnotes
; pnote
< pnotes_end
; pnote
++)
2535 if (! is_deleted_note (pnote
))
2536 merge_debug ("offset %#08lx range %#08lx..%#08lx type %ld attribute %d namesz %ld\n",
2537 (pnote
->note
.namedata
- (char *) contents
) - 12,
2538 pnote
->start
, pnote
->end
,
2540 pnote
->note
.namedata
[3],
2545 new_size
= new - new_contents
;
2546 if (new_size
< size
)
2548 memcpy (contents
, new_contents
, new_size
);
2551 free (new_contents
);
2556 bfd_set_error (bfd_error_bad_value
);
2557 bfd_nonfatal_message (NULL
, abfd
, sec
, err
);
2566 check_new_section_flags (flagword flags
, bfd
* abfd
, const char * secname
)
2568 /* Only set the SEC_COFF_SHARED flag on COFF files.
2569 The same bit value is used by ELF targets to indicate
2570 compressed sections, and setting that flag here breaks
2572 if ((flags
& SEC_COFF_SHARED
)
2573 && bfd_get_flavour (abfd
) != bfd_target_coff_flavour
)
2575 non_fatal (_("%s[%s]: Note - dropping 'share' flag as output format is not COFF"),
2576 bfd_get_filename (abfd
), secname
);
2577 flags
&= ~ SEC_COFF_SHARED
;
2582 /* Copy object file IBFD onto OBFD.
2583 Returns TRUE upon success, FALSE otherwise. */
2586 copy_object (bfd
*ibfd
, bfd
*obfd
, const bfd_arch_info_type
*input_arch
)
2590 asection
**osections
= NULL
;
2592 asection
*gnu_debuglink_section
= NULL
;
2593 bfd_size_type
*gaps
= NULL
;
2594 bfd_size_type max_gap
= 0;
2597 enum bfd_architecture iarch
;
2599 unsigned int num_sec
, i
;
2601 if (ibfd
->xvec
->byteorder
!= obfd
->xvec
->byteorder
2602 && ibfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
2603 && obfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
)
2605 /* PR 17636: Call non-fatal so that we return to our parent who
2606 may need to tidy temporary files. */
2607 non_fatal (_("unable to change endianness of '%s'"),
2608 bfd_get_archive_filename (ibfd
));
2612 if (ibfd
->read_only
)
2614 non_fatal (_("unable to modify '%s' due to errors"),
2615 bfd_get_archive_filename (ibfd
));
2619 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
2621 bfd_nonfatal_message (NULL
, obfd
, NULL
, NULL
);
2625 if (ibfd
->sections
== NULL
)
2627 non_fatal (_("error: the input file '%s' has no sections"),
2628 bfd_get_archive_filename (ibfd
));
2632 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
2634 if ((do_debug_sections
& compress
) != 0
2635 && do_debug_sections
!= compress
)
2637 non_fatal (_("--compress-debug-sections=[zlib|zlib-gnu|zlib-gabi] is unsupported on `%s'"),
2638 bfd_get_archive_filename (ibfd
));
2642 if (do_elf_stt_common
)
2644 non_fatal (_("--elf-stt-common=[yes|no] is unsupported on `%s'"),
2645 bfd_get_archive_filename (ibfd
));
2651 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
2652 bfd_get_archive_filename (ibfd
), bfd_get_target (ibfd
),
2653 bfd_get_filename (obfd
), bfd_get_target (obfd
));
2662 start
= bfd_get_start_address (ibfd
);
2663 start
+= change_start
;
2666 /* Neither the start address nor the flags
2667 need to be set for a core file. */
2668 if (bfd_get_format (obfd
) != bfd_core
)
2672 flags
= bfd_get_file_flags (ibfd
);
2673 flags
|= bfd_flags_to_set
;
2674 flags
&= ~bfd_flags_to_clear
;
2675 flags
&= bfd_applicable_file_flags (obfd
);
2677 if (strip_symbols
== STRIP_ALL
)
2678 flags
&= ~HAS_RELOC
;
2680 if (!bfd_set_start_address (obfd
, start
)
2681 || !bfd_set_file_flags (obfd
, flags
))
2683 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
2688 /* Copy architecture of input file to output file. */
2689 iarch
= bfd_get_arch (ibfd
);
2690 imach
= bfd_get_mach (ibfd
);
2693 if (iarch
== bfd_arch_unknown
)
2695 iarch
= input_arch
->arch
;
2696 imach
= input_arch
->mach
;
2699 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
2700 bfd_get_archive_filename (ibfd
));
2702 if (iarch
== bfd_arch_unknown
2703 && bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
2704 && bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
2706 const struct elf_backend_data
*bed
= get_elf_backend_data (obfd
);
2710 if (!bfd_set_arch_mach (obfd
, iarch
, imach
)
2711 && (ibfd
->target_defaulted
2712 || bfd_get_arch (ibfd
) != bfd_get_arch (obfd
)))
2714 if (bfd_get_arch (ibfd
) == bfd_arch_unknown
)
2715 non_fatal (_("Unable to recognise the format of the input file `%s'"),
2716 bfd_get_archive_filename (ibfd
));
2718 non_fatal (_("Output file cannot represent architecture `%s'"),
2719 bfd_printable_arch_mach (bfd_get_arch (ibfd
),
2720 bfd_get_mach (ibfd
)));
2724 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
2726 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
2730 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
2731 && bfd_pei_p (obfd
))
2733 /* Set up PE parameters. */
2734 pe_data_type
*pe
= pe_data (obfd
);
2736 /* Copy PE parameters before changing them. */
2737 if (bfd_get_flavour (ibfd
) == bfd_target_coff_flavour
2738 && bfd_pei_p (ibfd
))
2739 pe
->pe_opthdr
= pe_data (ibfd
)->pe_opthdr
;
2741 if (pe_file_alignment
!= (bfd_vma
) -1)
2742 pe
->pe_opthdr
.FileAlignment
= pe_file_alignment
;
2744 pe_file_alignment
= PE_DEF_FILE_ALIGNMENT
;
2746 if (pe_heap_commit
!= (bfd_vma
) -1)
2747 pe
->pe_opthdr
.SizeOfHeapCommit
= pe_heap_commit
;
2749 if (pe_heap_reserve
!= (bfd_vma
) -1)
2750 pe
->pe_opthdr
.SizeOfHeapCommit
= pe_heap_reserve
;
2752 if (pe_image_base
!= (bfd_vma
) -1)
2753 pe
->pe_opthdr
.ImageBase
= pe_image_base
;
2755 if (pe_section_alignment
!= (bfd_vma
) -1)
2756 pe
->pe_opthdr
.SectionAlignment
= pe_section_alignment
;
2758 pe_section_alignment
= PE_DEF_SECTION_ALIGNMENT
;
2760 if (pe_stack_commit
!= (bfd_vma
) -1)
2761 pe
->pe_opthdr
.SizeOfStackCommit
= pe_stack_commit
;
2763 if (pe_stack_reserve
!= (bfd_vma
) -1)
2764 pe
->pe_opthdr
.SizeOfStackCommit
= pe_stack_reserve
;
2766 if (pe_subsystem
!= -1)
2767 pe
->pe_opthdr
.Subsystem
= pe_subsystem
;
2769 if (pe_major_subsystem_version
!= -1)
2770 pe
->pe_opthdr
.MajorSubsystemVersion
= pe_major_subsystem_version
;
2772 if (pe_minor_subsystem_version
!= -1)
2773 pe
->pe_opthdr
.MinorSubsystemVersion
= pe_minor_subsystem_version
;
2775 if (pe_file_alignment
> pe_section_alignment
)
2777 char file_alignment
[20], section_alignment
[20];
2779 sprintf_vma (file_alignment
, pe_file_alignment
);
2780 sprintf_vma (section_alignment
, pe_section_alignment
);
2781 non_fatal (_("warning: file alignment (0x%s) > section alignment (0x%s)"),
2783 file_alignment
, section_alignment
);
2787 && bfd_get_flavour (ibfd
) == bfd_target_coff_flavour
2788 && bfd_pei_p (ibfd
))
2789 pe
->timestamp
= pe_data (ibfd
)->coff
.timestamp
;
2794 if (osympp
!= isympp
)
2800 symsize
= bfd_get_symtab_upper_bound (ibfd
);
2803 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
2807 osympp
= isympp
= (asymbol
**) xmalloc (symsize
);
2808 symcount
= bfd_canonicalize_symtab (ibfd
, isympp
);
2811 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
2814 /* PR 17512: file: d6323821
2815 If the symbol table could not be loaded do not pretend that we have
2816 any symbols. This trips us up later on when we load the relocs. */
2820 osympp
= isympp
= NULL
;
2823 /* BFD mandates that all output sections be created and sizes set before
2824 any output is done. Thus, we traverse all sections multiple times. */
2825 bfd_map_over_sections (ibfd
, setup_section
, obfd
);
2827 if (!extract_symbol
)
2828 setup_bfd_headers (ibfd
, obfd
);
2830 if (add_sections
!= NULL
)
2832 struct section_add
*padd
;
2833 struct section_list
*pset
;
2835 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
2839 pset
= find_section_list (padd
->name
, FALSE
,
2840 SECTION_CONTEXT_SET_FLAGS
);
2843 flags
= pset
->flags
| SEC_HAS_CONTENTS
;
2844 flags
= check_new_section_flags (flags
, obfd
, padd
->name
);
2847 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DATA
;
2849 /* bfd_make_section_with_flags() does not return very helpful
2850 error codes, so check for the most likely user error first. */
2851 if (bfd_get_section_by_name (obfd
, padd
->name
))
2853 bfd_nonfatal_message (NULL
, obfd
, NULL
,
2854 _("can't add section '%s'"), padd
->name
);
2859 /* We use LINKER_CREATED here so that the backend hooks
2860 will create any special section type information,
2861 instead of presuming we know what we're doing merely
2862 because we set the flags. */
2863 padd
->section
= bfd_make_section_with_flags
2864 (obfd
, padd
->name
, flags
| SEC_LINKER_CREATED
);
2865 if (padd
->section
== NULL
)
2867 bfd_nonfatal_message (NULL
, obfd
, NULL
,
2868 _("can't create section `%s'"),
2874 if (!bfd_set_section_size (padd
->section
, padd
->size
))
2876 bfd_nonfatal_message (NULL
, obfd
, padd
->section
, NULL
);
2880 pset
= find_section_list (padd
->name
, FALSE
,
2881 SECTION_CONTEXT_SET_VMA
| SECTION_CONTEXT_ALTER_VMA
);
2883 && !bfd_set_section_vma (padd
->section
, pset
->vma_val
))
2885 bfd_nonfatal_message (NULL
, obfd
, padd
->section
, NULL
);
2889 pset
= find_section_list (padd
->name
, FALSE
,
2890 SECTION_CONTEXT_SET_LMA
| SECTION_CONTEXT_ALTER_LMA
);
2893 padd
->section
->lma
= pset
->lma_val
;
2895 if (!bfd_set_section_alignment
2896 (padd
->section
, bfd_section_alignment (padd
->section
)))
2898 bfd_nonfatal_message (NULL
, obfd
, padd
->section
, NULL
);
2905 if (update_sections
!= NULL
)
2907 struct section_add
*pupdate
;
2909 for (pupdate
= update_sections
;
2911 pupdate
= pupdate
->next
)
2913 pupdate
->section
= bfd_get_section_by_name (ibfd
, pupdate
->name
);
2914 if (pupdate
->section
== NULL
)
2916 non_fatal (_("error: %s not found, can't be updated"), pupdate
->name
);
2920 osec
= pupdate
->section
->output_section
;
2921 if (!bfd_set_section_size (osec
, pupdate
->size
))
2923 bfd_nonfatal_message (NULL
, obfd
, osec
, NULL
);
2929 merged_note_section
* merged_note_sections
= NULL
;
2932 /* This palaver is necessary because we must set the output
2933 section size first, before its contents are ready. */
2934 for (osec
= ibfd
->sections
; osec
!= NULL
; osec
= osec
->next
)
2936 if (! is_mergeable_note_section (ibfd
, osec
))
2939 /* If the section is going to be completly deleted then
2940 do not bother to merge it. */
2941 if (osec
->output_section
== NULL
)
2944 bfd_size_type size
= bfd_section_size (osec
);
2948 bfd_nonfatal_message (NULL
, ibfd
, osec
,
2949 _("warning: note section is empty"));
2953 merged_note_section
* merged
= xmalloc (sizeof * merged
);
2954 merged
->contents
= NULL
;
2955 if (! bfd_get_full_section_contents (ibfd
, osec
, & merged
->contents
))
2957 bfd_nonfatal_message (NULL
, ibfd
, osec
,
2958 _("warning: could not load note section"));
2963 merged
->size
= merge_gnu_build_notes (ibfd
, osec
, size
,
2966 /* FIXME: Once we have read the contents in, we must write
2967 them out again. So even if the mergeing has achieved
2968 nothing we still add this entry to the merge list. */
2970 if (size
!= merged
->size
2971 && !bfd_set_section_size (osec
->output_section
, merged
->size
))
2973 bfd_nonfatal_message (NULL
, obfd
, osec
,
2974 _("warning: failed to set merged notes size"));
2975 free (merged
->contents
);
2980 /* Add section to list of merged sections. */
2982 merged
->next
= merged_note_sections
;
2983 merged_note_sections
= merged
;
2987 if (dump_sections
!= NULL
)
2989 struct section_add
* pdump
;
2991 for (pdump
= dump_sections
; pdump
!= NULL
; pdump
= pdump
->next
)
2996 osec
= bfd_get_section_by_name (ibfd
, pdump
->name
);
2999 bfd_nonfatal_message (NULL
, ibfd
, NULL
,
3000 _("can't dump section '%s' - it does not exist"),
3005 if ((bfd_section_flags (osec
) & SEC_HAS_CONTENTS
) == 0)
3007 bfd_nonfatal_message (NULL
, ibfd
, osec
,
3008 _("can't dump section - it has no contents"));
3012 bfd_size_type size
= bfd_section_size (osec
);
3013 /* Note - we allow the dumping of zero-sized sections,
3014 creating an empty file. */
3016 f
= fopen (pdump
->filename
, FOPEN_WB
);
3019 bfd_nonfatal_message (pdump
->filename
, NULL
, NULL
,
3020 _("could not open section dump file"));
3024 if (bfd_malloc_and_get_section (ibfd
, osec
, &contents
))
3026 if (size
!= 0 && fwrite (contents
, 1, size
, f
) != size
)
3028 non_fatal (_("error writing section contents to %s (error: %s)"),
3037 bfd_nonfatal_message (NULL
, ibfd
, osec
,
3038 _("could not retrieve section contents"));
3045 if (gnu_debuglink_filename
!= NULL
)
3047 /* PR 15125: Give a helpful warning message if
3048 the debuglink section already exists, and
3049 allow the rest of the copy to complete. */
3050 if (bfd_get_section_by_name (obfd
, ".gnu_debuglink"))
3052 non_fatal (_("%s: debuglink section already exists"),
3053 bfd_get_filename (obfd
));
3054 gnu_debuglink_filename
= NULL
;
3058 gnu_debuglink_section
= bfd_create_gnu_debuglink_section
3059 (obfd
, gnu_debuglink_filename
);
3061 if (gnu_debuglink_section
== NULL
)
3063 bfd_nonfatal_message (NULL
, obfd
, NULL
,
3064 _("cannot create debug link section `%s'"),
3065 gnu_debuglink_filename
);
3069 /* Special processing for PE format files. We
3070 have no way to distinguish PE from COFF here. */
3071 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
)
3073 bfd_vma debuglink_vma
;
3074 asection
* highest_section
;
3076 /* The PE spec requires that all sections be adjacent and sorted
3077 in ascending order of VMA. It also specifies that debug
3078 sections should be last. This is despite the fact that debug
3079 sections are not loaded into memory and so in theory have no
3082 This means that the debuglink section must be given a non-zero
3083 VMA which makes it contiguous with other debug sections. So
3084 walk the current section list, find the section with the
3085 highest VMA and start the debuglink section after that one. */
3086 for (osec
= obfd
->sections
, highest_section
= NULL
;
3090 && (highest_section
== NULL
3091 || osec
->vma
> highest_section
->vma
))
3092 highest_section
= osec
;
3094 if (highest_section
)
3095 debuglink_vma
= BFD_ALIGN (highest_section
->vma
3096 + highest_section
->size
,
3097 /* FIXME: We ought to be using
3098 COFF_PAGE_SIZE here or maybe
3099 bfd_section_alignment() (if it
3100 was set) but since this is for PE
3101 and we know the required alignment
3102 it is easier just to hard code it. */
3105 /* Umm, not sure what to do in this case. */
3106 debuglink_vma
= 0x1000;
3108 bfd_set_section_vma (gnu_debuglink_section
, debuglink_vma
);
3113 num_sec
= bfd_count_sections (obfd
);
3115 && (gap_fill_set
|| pad_to_set
))
3119 /* We must fill in gaps between the sections and/or we must pad
3120 the last section to a specified address. We do this by
3121 grabbing a list of the sections, sorting them by VMA, and
3122 increasing the section sizes as required to fill the gaps.
3123 We write out the gap contents below. */
3125 osections
= xmalloc (num_sec
* sizeof (*osections
));
3127 bfd_map_over_sections (obfd
, get_sections
, &set
);
3129 qsort (osections
, num_sec
, sizeof (*osections
), compare_section_lma
);
3131 gaps
= xmalloc (num_sec
* sizeof (*gaps
));
3132 memset (gaps
, 0, num_sec
* sizeof (*gaps
));
3136 for (i
= 0; i
< num_sec
- 1; i
++)
3139 bfd_size_type size
; /* Octets. */
3140 bfd_vma gap_start
, gap_stop
; /* Octets. */
3141 unsigned int opb1
= bfd_octets_per_byte (obfd
, osections
[i
]);
3142 unsigned int opb2
= bfd_octets_per_byte (obfd
, osections
[i
+1]);
3144 flags
= bfd_section_flags (osections
[i
]);
3145 if ((flags
& SEC_HAS_CONTENTS
) == 0
3146 || (flags
& SEC_LOAD
) == 0)
3149 size
= bfd_section_size (osections
[i
]);
3150 gap_start
= bfd_section_lma (osections
[i
]) * opb1
+ size
;
3151 gap_stop
= bfd_section_lma (osections
[i
+ 1]) * opb2
;
3152 if (gap_start
< gap_stop
)
3154 if (!bfd_set_section_size (osections
[i
],
3155 size
+ (gap_stop
- gap_start
)))
3157 bfd_nonfatal_message (NULL
, obfd
, osections
[i
],
3158 _("Can't fill gap after section"));
3162 gaps
[i
] = gap_stop
- gap_start
;
3163 if (max_gap
< gap_stop
- gap_start
)
3164 max_gap
= gap_stop
- gap_start
;
3171 bfd_vma lma
; /* Octets. */
3172 bfd_size_type size
; /* Octets. */
3173 unsigned int opb
= bfd_octets_per_byte (obfd
, osections
[num_sec
- 1]);
3174 bfd_vma _pad_to
= pad_to
* opb
;
3176 lma
= bfd_section_lma (osections
[num_sec
- 1]) * opb
;
3177 size
= bfd_section_size (osections
[num_sec
- 1]);
3178 if (lma
+ size
< _pad_to
)
3180 if (!bfd_set_section_size (osections
[num_sec
- 1], _pad_to
- lma
))
3182 bfd_nonfatal_message (NULL
, obfd
, osections
[num_sec
- 1],
3183 _("can't add padding"));
3188 gaps
[num_sec
- 1] = _pad_to
- (lma
+ size
);
3189 if (max_gap
< _pad_to
- (lma
+ size
))
3190 max_gap
= _pad_to
- (lma
+ size
);
3196 /* Symbol filtering must happen after the output sections
3197 have been created, but before their contents are set. */
3199 if (convert_debugging
)
3200 dhandle
= read_debugging_info (ibfd
, isympp
, symcount
, FALSE
);
3202 if ((obfd
->flags
& (EXEC_P
| DYNAMIC
)) != 0
3203 && (obfd
->flags
& HAS_RELOC
) == 0)
3205 if (bfd_keep_unused_section_symbols (obfd
) || keep_section_symbols
)
3207 /* Non-relocatable inputs may not have the unused section
3208 symbols. Mark all section symbols as used to generate
3211 for (asect
= obfd
->sections
; asect
!= NULL
; asect
= asect
->next
)
3213 asect
->symbol
->flags
|= BSF_SECTION_SYM_USED
;
3217 /* Non-relocatable inputs may have the unused section symbols.
3218 Mark all section symbols as unused to excluded them. */
3220 for (s
= 0; s
< symcount
; s
++)
3221 if ((isympp
[s
]->flags
& BSF_SECTION_SYM_USED
))
3222 isympp
[s
]->flags
&= ~BSF_SECTION_SYM_USED
;
3226 if (strip_symbols
== STRIP_DEBUG
3227 || strip_symbols
== STRIP_ALL
3228 || strip_symbols
== STRIP_UNNEEDED
3229 || strip_symbols
== STRIP_NONDEBUG
3230 || strip_symbols
== STRIP_DWO
3231 || strip_symbols
== STRIP_NONDWO
3232 || discard_locals
!= LOCALS_UNDEF
3234 || htab_elements (strip_specific_htab
) != 0
3235 || htab_elements (keep_specific_htab
) != 0
3236 || htab_elements (localize_specific_htab
) != 0
3237 || htab_elements (globalize_specific_htab
) != 0
3238 || htab_elements (keepglobal_specific_htab
) != 0
3239 || htab_elements (weaken_specific_htab
) != 0
3240 || htab_elements (redefine_specific_htab
) != 0
3241 || prefix_symbols_string
3244 || convert_debugging
3245 || change_leading_char
3246 || remove_leading_char
3247 || section_rename_list
3251 /* Mark symbols used in output relocations so that they
3252 are kept, even if they are local labels or static symbols.
3254 Note we iterate over the input sections examining their
3255 relocations since the relocations for the output sections
3256 haven't been set yet. mark_symbols_used_in_relocations will
3257 ignore input sections which have no corresponding output
3259 if (strip_symbols
!= STRIP_ALL
)
3261 bfd_set_error (bfd_error_no_error
);
3262 bfd_map_over_sections (ibfd
,
3263 mark_symbols_used_in_relocations
,
3265 if (bfd_get_error () != bfd_error_no_error
)
3272 osympp
= (asymbol
**) xmalloc ((symcount
+ add_symbols
+ 1) * sizeof (asymbol
*));
3273 symcount
= filter_symbols (ibfd
, obfd
, osympp
, isympp
, symcount
);
3276 if (convert_debugging
&& dhandle
!= NULL
)
3280 res
= write_debugging_info (obfd
, dhandle
, &symcount
, &osympp
);
3283 dhandle
= NULL
; /* Paranoia... */
3292 bfd_set_symtab (obfd
, osympp
, symcount
);
3294 /* This has to happen before section positions are set. */
3295 bfd_map_over_sections (ibfd
, copy_relocations_in_section
, obfd
);
3297 /* This has to happen after the symbol table has been set. */
3298 bfd_map_over_sections (ibfd
, copy_section
, obfd
);
3300 if (add_sections
!= NULL
)
3302 struct section_add
*padd
;
3304 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
3306 if (! bfd_set_section_contents (obfd
, padd
->section
, padd
->contents
,
3309 bfd_nonfatal_message (NULL
, obfd
, padd
->section
, NULL
);
3315 if (update_sections
!= NULL
)
3317 struct section_add
*pupdate
;
3319 for (pupdate
= update_sections
;
3321 pupdate
= pupdate
->next
)
3323 osec
= pupdate
->section
->output_section
;
3324 if (! bfd_set_section_contents (obfd
, osec
, pupdate
->contents
,
3327 bfd_nonfatal_message (NULL
, obfd
, osec
, NULL
);
3333 if (merged_note_sections
!= NULL
)
3335 merged_note_section
* merged
= NULL
;
3337 for (osec
= obfd
->sections
; osec
!= NULL
; osec
= osec
->next
)
3339 if (! is_mergeable_note_section (obfd
, osec
))
3343 merged
= merged_note_sections
;
3345 /* It is likely that output sections are in the same order
3346 as the input sections, but do not assume that this is
3348 if (merged
->sec
->output_section
!= osec
)
3350 for (merged
= merged_note_sections
;
3352 merged
= merged
->next
)
3353 if (merged
->sec
->output_section
== osec
)
3358 bfd_nonfatal_message
3360 _("error: failed to locate merged notes"));
3365 if (merged
->contents
== NULL
)
3367 bfd_nonfatal_message
3369 _("error: failed to merge notes"));
3373 if (! bfd_set_section_contents (obfd
, osec
, merged
->contents
, 0,
3376 bfd_nonfatal_message
3378 _("error: failed to copy merged notes into output"));
3382 merged
= merged
->next
;
3385 /* Free the memory. */
3386 merged_note_section
* next
;
3387 for (merged
= merged_note_sections
; merged
!= NULL
; merged
= next
)
3389 next
= merged
->next
;
3390 free (merged
->contents
);
3394 else if (merge_notes
&& ! is_strip
)
3395 non_fatal (_("%s: Could not find any mergeable note sections"),
3396 bfd_get_filename (ibfd
));
3398 if (gnu_debuglink_filename
!= NULL
)
3400 if (! bfd_fill_in_gnu_debuglink_section
3401 (obfd
, gnu_debuglink_section
, gnu_debuglink_filename
))
3403 bfd_nonfatal_message (NULL
, obfd
, NULL
,
3404 _("cannot fill debug link section `%s'"),
3405 gnu_debuglink_filename
);
3414 /* Fill in the gaps. */
3417 buf
= (bfd_byte
*) xmalloc (max_gap
);
3418 memset (buf
, gap_fill
, max_gap
);
3420 for (i
= 0; i
< num_sec
; i
++)
3428 off
= bfd_section_size (osections
[i
]) - left
;
3439 if (! bfd_set_section_contents (obfd
, osections
[i
], buf
,
3442 bfd_nonfatal_message (NULL
, obfd
, osections
[i
], NULL
);
3458 /* Allow the BFD backend to copy any private data it understands
3459 from the input BFD to the output BFD. This is done last to
3460 permit the routine to look at the filtered symbol table, which is
3461 important for the ECOFF code at least. */
3462 if (! bfd_copy_private_bfd_data (ibfd
, obfd
))
3464 bfd_nonfatal_message (NULL
, obfd
, NULL
,
3465 _("error copying private BFD data"));
3469 /* Switch to the alternate machine code. We have to do this at the
3470 very end, because we only initialize the header when we create
3471 the first section. */
3472 if (use_alt_mach_code
!= 0)
3474 if (! bfd_alt_mach_code (obfd
, use_alt_mach_code
))
3476 non_fatal (_("this target does not support %lu alternative machine codes"),
3478 if (bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
3480 non_fatal (_("treating that number as an absolute e_machine value instead"));
3481 elf_elfheader (obfd
)->e_machine
= use_alt_mach_code
;
3484 non_fatal (_("ignoring the alternative value"));
3491 /* Read each archive element in turn from IBFD, copy the
3492 contents to temp file, and keep the temp file handle.
3493 If 'force_output_target' is TRUE then make sure that
3494 all elements in the new archive are of the type
3498 copy_archive (bfd
*ibfd
, bfd
*obfd
, const char *output_target
,
3499 bfd_boolean force_output_target
,
3500 const bfd_arch_info_type
*input_arch
)
3504 struct name_list
*next
;
3508 bfd
**ptr
= &obfd
->archive_head
;
3511 const char *filename
;
3513 /* PR 24281: It is not clear what should happen when copying a thin archive.
3514 One part is straight forward - if the output archive is in a different
3515 directory from the input archive then any relative paths in the library
3516 should be adjusted to the new location. But if any transformation
3517 options are active (eg strip, rename, add, etc) then the implication is
3518 that these should be applied to the files pointed to by the archive.
3519 But since objcopy is not destructive, this means that new files must be
3520 created, and there is no guidance for the names of the new files. (Plus
3521 this conflicts with one of the goals of thin libraries - only taking up
3522 a minimal amount of space in the file system).
3524 So for now we fail if an attempt is made to copy such libraries. */
3525 if (ibfd
->is_thin_archive
)
3528 bfd_set_error (bfd_error_invalid_operation
);
3529 bfd_nonfatal_message (NULL
, ibfd
, NULL
,
3530 _("sorry: copying thin archives is not currently supported"));
3534 /* Make a temp directory to hold the contents. */
3535 dir
= make_tempdir (bfd_get_filename (obfd
));
3537 fatal (_("cannot create tempdir for archive copying (error: %s)"),
3540 if (strip_symbols
== STRIP_ALL
)
3541 obfd
->has_armap
= FALSE
;
3543 obfd
->has_armap
= ibfd
->has_armap
;
3544 obfd
->is_thin_archive
= ibfd
->is_thin_archive
;
3547 obfd
->flags
|= BFD_DETERMINISTIC_OUTPUT
;
3551 this_element
= bfd_openr_next_archived_file (ibfd
, NULL
);
3553 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
3556 bfd_nonfatal_message (NULL
, obfd
, NULL
, NULL
);
3557 goto cleanup_and_exit
;
3560 while (!status
&& this_element
!= NULL
)
3566 int stat_status
= 0;
3567 bfd_boolean del
= TRUE
;
3568 bfd_boolean ok_object
;
3570 /* PR binutils/17533: Do not allow directory traversal
3571 outside of the current directory tree by archive members. */
3572 if (! is_valid_archive_path (bfd_get_filename (this_element
)))
3574 non_fatal (_("illegal pathname found in archive member: %s"),
3575 bfd_get_filename (this_element
));
3577 goto cleanup_and_exit
;
3580 /* Create an output file for this member. */
3581 output_name
= concat (dir
, "/",
3582 bfd_get_filename (this_element
), (char *) 0);
3584 /* If the file already exists, make another temp dir. */
3585 if (stat (output_name
, &buf
) >= 0)
3587 char * tmpdir
= make_tempdir (output_name
);
3592 non_fatal (_("cannot create tempdir for archive copying (error: %s)"),
3595 goto cleanup_and_exit
;
3598 l
= (struct name_list
*) xmalloc (sizeof (struct name_list
));
3603 output_name
= concat (tmpdir
, "/",
3604 bfd_get_filename (this_element
), (char *) 0);
3609 stat_status
= bfd_stat_arch_elt (this_element
, &buf
);
3611 if (stat_status
!= 0)
3612 non_fatal (_("internal stat error on %s"),
3613 bfd_get_filename (this_element
));
3616 l
= (struct name_list
*) xmalloc (sizeof (struct name_list
));
3617 l
->name
= output_name
;
3622 ok_object
= bfd_check_format (this_element
, bfd_object
);
3624 bfd_nonfatal_message (NULL
, this_element
, NULL
,
3625 _("Unable to recognise the format of file"));
3627 /* PR binutils/3110: Cope with archives
3628 containing multiple target types. */
3629 if (force_output_target
|| !ok_object
)
3630 output_bfd
= bfd_openw (output_name
, output_target
);
3632 output_bfd
= bfd_openw (output_name
, bfd_get_target (this_element
));
3634 if (output_bfd
== NULL
)
3636 bfd_nonfatal_message (output_name
, NULL
, NULL
, NULL
);
3638 goto cleanup_and_exit
;
3643 del
= !copy_object (this_element
, output_bfd
, input_arch
);
3645 if (del
&& bfd_get_arch (this_element
) == bfd_arch_unknown
)
3646 /* Try again as an unknown object file. */
3648 else if (!bfd_close (output_bfd
))
3650 bfd_nonfatal_message (output_name
, NULL
, NULL
, NULL
);
3651 /* Error in new object file. Don't change archive. */
3658 del
= !copy_unknown_object (this_element
, output_bfd
);
3659 if (!bfd_close_all_done (output_bfd
))
3661 bfd_nonfatal_message (output_name
, NULL
, NULL
, NULL
);
3662 /* Error in new object file. Don't change archive. */
3669 unlink (output_name
);
3674 if (preserve_dates
&& stat_status
== 0)
3675 set_times (output_name
, &buf
);
3677 /* Open the newly output file and attach to our list. */
3678 output_bfd
= bfd_openr (output_name
, output_target
);
3680 l
->obfd
= output_bfd
;
3683 ptr
= &output_bfd
->archive_next
;
3685 last_element
= this_element
;
3687 this_element
= bfd_openr_next_archived_file (ibfd
, last_element
);
3689 bfd_close (last_element
);
3694 filename
= bfd_get_filename (obfd
);
3695 if (!bfd_close (obfd
))
3698 bfd_nonfatal_message (filename
, NULL
, NULL
, NULL
);
3701 filename
= bfd_get_filename (ibfd
);
3702 if (!bfd_close (ibfd
))
3705 bfd_nonfatal_message (filename
, NULL
, NULL
, NULL
);
3709 /* Delete all the files that we opened. */
3711 struct name_list
* next
;
3713 for (l
= list
; l
!= NULL
; l
= next
)
3715 if (l
->obfd
== NULL
)
3719 bfd_close (l
->obfd
);
3731 set_long_section_mode (bfd
*output_bfd
, bfd
*input_bfd
, enum long_section_name_handling style
)
3733 /* This is only relevant to Coff targets. */
3734 if (bfd_get_flavour (output_bfd
) == bfd_target_coff_flavour
)
3737 && bfd_get_flavour (input_bfd
) == bfd_target_coff_flavour
)
3738 style
= bfd_coff_long_section_names (input_bfd
) ? ENABLE
: DISABLE
;
3739 bfd_coff_set_long_section_names (output_bfd
, style
!= DISABLE
);
3743 /* The top-level control. */
3746 copy_file (const char *input_filename
, const char *output_filename
, int ofd
,
3747 struct stat
*in_stat
, const char *input_target
,
3748 const char *output_target
, const bfd_arch_info_type
*input_arch
)
3751 char **obj_matching
;
3752 char **core_matching
;
3753 off_t size
= get_file_size (input_filename
);
3758 non_fatal (_("error: the input file '%s' is empty"),
3764 /* To allow us to do "strip *" without dying on the first
3765 non-object file, failures are nonfatal. */
3766 ibfd
= bfd_openr (input_filename
, input_target
);
3767 if (ibfd
== NULL
|| bfd_stat (ibfd
, in_stat
) != 0)
3769 bfd_nonfatal_message (input_filename
, NULL
, NULL
, NULL
);
3774 switch (do_debug_sections
)
3778 case compress_gnu_zlib
:
3779 case compress_gabi_zlib
:
3780 ibfd
->flags
|= BFD_COMPRESS
;
3781 /* Don't check if input is ELF here since this information is
3782 only available after bfd_check_format_matches is called. */
3783 if (do_debug_sections
!= compress_gnu_zlib
)
3784 ibfd
->flags
|= BFD_COMPRESS_GABI
;
3787 ibfd
->flags
|= BFD_DECOMPRESS
;
3793 switch (do_elf_stt_common
)
3795 case elf_stt_common
:
3796 ibfd
->flags
|= BFD_CONVERT_ELF_COMMON
| BFD_USE_ELF_STT_COMMON
;
3799 case no_elf_stt_common
:
3800 ibfd
->flags
|= BFD_CONVERT_ELF_COMMON
;
3806 if (bfd_check_format (ibfd
, bfd_archive
))
3808 bfd_boolean force_output_target
;
3811 /* bfd_get_target does not return the correct value until
3812 bfd_check_format succeeds. */
3813 if (output_target
== NULL
)
3815 output_target
= bfd_get_target (ibfd
);
3816 force_output_target
= FALSE
;
3819 force_output_target
= TRUE
;
3822 obfd
= bfd_fdopenw (output_filename
, output_target
, ofd
);
3824 obfd
= bfd_openw (output_filename
, output_target
);
3829 bfd_nonfatal_message (output_filename
, NULL
, NULL
, NULL
);
3834 if (gnu_debuglink_filename
!= NULL
)
3836 non_fatal (_("--add-gnu-debuglink ignored for archive %s"),
3837 bfd_get_filename (ibfd
));
3838 gnu_debuglink_filename
= NULL
;
3841 /* This is a no-op on non-Coff targets. */
3842 set_long_section_mode (obfd
, ibfd
, long_section_names
);
3844 copy_archive (ibfd
, obfd
, output_target
, force_output_target
, input_arch
);
3846 else if (bfd_check_format_matches (ibfd
, bfd_object
, &obj_matching
))
3851 /* bfd_get_target does not return the correct value until
3852 bfd_check_format succeeds. */
3853 if (output_target
== NULL
)
3854 output_target
= bfd_get_target (ibfd
);
3857 obfd
= bfd_fdopenw (output_filename
, output_target
, ofd
);
3859 obfd
= bfd_openw (output_filename
, output_target
);
3864 bfd_nonfatal_message (output_filename
, NULL
, NULL
, NULL
);
3869 /* This is a no-op on non-Coff targets. */
3870 set_long_section_mode (obfd
, ibfd
, long_section_names
);
3872 if (! copy_object (ibfd
, obfd
, input_arch
))
3875 /* PR 17512: file: 0f15796a.
3876 If the file could not be copied it may not be in a writeable
3877 state. So use bfd_close_all_done to avoid the possibility of
3878 writing uninitialised data into the file. */
3879 if (! (status
? bfd_close_all_done (obfd
) : bfd_close (obfd
)))
3882 bfd_nonfatal_message (output_filename
, NULL
, NULL
, NULL
);
3886 if (!bfd_close (ibfd
))
3889 bfd_nonfatal_message (input_filename
, NULL
, NULL
, NULL
);
3895 bfd_error_type obj_error
= bfd_get_error ();
3896 bfd_error_type core_error
;
3898 if (bfd_check_format_matches (ibfd
, bfd_core
, &core_matching
))
3900 /* This probably can't happen.. */
3901 if (obj_error
== bfd_error_file_ambiguously_recognized
)
3902 free (obj_matching
);
3906 core_error
= bfd_get_error ();
3907 /* Report the object error in preference to the core error. */
3908 if (obj_error
!= core_error
)
3909 bfd_set_error (obj_error
);
3911 bfd_nonfatal_message (input_filename
, NULL
, NULL
, NULL
);
3913 if (obj_error
== bfd_error_file_ambiguously_recognized
)
3915 list_matching_formats (obj_matching
);
3916 free (obj_matching
);
3918 if (core_error
== bfd_error_file_ambiguously_recognized
)
3920 list_matching_formats (core_matching
);
3921 free (core_matching
);
3928 /* Add a name to the section renaming list. */
3931 add_section_rename (const char * old_name
, const char * new_name
,
3934 section_rename
* srename
;
3936 /* Check for conflicts first. */
3937 for (srename
= section_rename_list
; srename
!= NULL
; srename
= srename
->next
)
3938 if (strcmp (srename
->old_name
, old_name
) == 0)
3940 /* Silently ignore duplicate definitions. */
3941 if (strcmp (srename
->new_name
, new_name
) == 0
3942 && srename
->flags
== flags
)
3945 fatal (_("Multiple renames of section %s"), old_name
);
3948 srename
= (section_rename
*) xmalloc (sizeof (* srename
));
3950 srename
->old_name
= old_name
;
3951 srename
->new_name
= new_name
;
3952 srename
->flags
= flags
;
3953 srename
->next
= section_rename_list
;
3955 section_rename_list
= srename
;
3958 /* Check the section rename list for a new name of the input section
3959 called OLD_NAME. Returns the new name if one is found and sets
3960 RETURNED_FLAGS if non-NULL to the flags to be used for this section. */
3963 find_section_rename (const char *old_name
, flagword
*returned_flags
)
3965 const section_rename
*srename
;
3967 for (srename
= section_rename_list
; srename
!= NULL
; srename
= srename
->next
)
3968 if (strcmp (srename
->old_name
, old_name
) == 0)
3970 if (returned_flags
!= NULL
&& srename
->flags
!= (flagword
) -1)
3971 *returned_flags
= srename
->flags
;
3973 return srename
->new_name
;
3979 /* Once each of the sections is copied, we may still need to do some
3980 finalization work for private section headers. Do that here. */
3983 setup_bfd_headers (bfd
*ibfd
, bfd
*obfd
)
3985 /* Allow the BFD backend to copy any private data it understands
3986 from the input section to the output section. */
3987 if (! bfd_copy_private_header_data (ibfd
, obfd
))
3990 bfd_nonfatal_message (NULL
, ibfd
, NULL
,
3991 _("error in private header data"));
3995 /* All went well. */
3999 /* Create a section in OBFD with the same
4000 name and attributes as ISECTION in IBFD. */
4003 setup_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
4005 bfd
*obfd
= (bfd
*) obfdarg
;
4006 struct section_list
*p
;
4014 const char * new_name
;
4015 char *prefix
= NULL
;
4016 bfd_boolean make_nobits
;
4017 unsigned int alignment
;
4019 if (is_strip_section (ibfd
, isection
))
4022 /* Get the, possibly new, name of the output section. */
4023 name
= bfd_section_name (isection
);
4024 flags
= bfd_section_flags (isection
);
4025 if (bfd_get_flavour (ibfd
) != bfd_get_flavour (obfd
))
4027 flags
&= bfd_applicable_section_flags (ibfd
);
4028 flags
&= bfd_applicable_section_flags (obfd
);
4030 new_name
= find_section_rename (name
, &flags
);
4031 if (new_name
!= name
)
4034 flags
= check_new_section_flags (flags
, obfd
, name
);
4037 /* Prefix sections. */
4038 if (prefix_alloc_sections_string
4039 && (bfd_section_flags (isection
) & SEC_ALLOC
) != 0)
4040 prefix
= prefix_alloc_sections_string
;
4041 else if (prefix_sections_string
)
4042 prefix
= prefix_sections_string
;
4048 n
= (char *) xmalloc (strlen (prefix
) + strlen (name
) + 1);
4054 make_nobits
= FALSE
;
4056 p
= find_section_list (bfd_section_name (isection
), FALSE
,
4057 SECTION_CONTEXT_SET_FLAGS
);
4060 flags
= p
->flags
| (flags
& (SEC_HAS_CONTENTS
| SEC_RELOC
));
4061 flags
= check_new_section_flags (flags
, obfd
, bfd_section_name (isection
));
4063 else if (strip_symbols
== STRIP_NONDEBUG
4064 && (flags
& (SEC_ALLOC
| SEC_GROUP
)) != 0
4065 && !is_nondebug_keep_contents_section (ibfd
, isection
))
4067 flags
&= ~(SEC_HAS_CONTENTS
| SEC_LOAD
| SEC_GROUP
);
4068 if (bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
4072 /* Twiddle the input section flags so that it seems to
4073 elf.c:copy_private_bfd_data that section flags have not
4074 changed between input and output sections. This hack
4075 prevents wholesale rewriting of the program headers. */
4076 isection
->flags
&= ~(SEC_HAS_CONTENTS
| SEC_LOAD
| SEC_GROUP
);
4080 osection
= bfd_make_section_anyway_with_flags (obfd
, name
, flags
);
4082 if (osection
== NULL
)
4084 err
= _("failed to create output section");
4089 elf_section_type (osection
) = SHT_NOBITS
;
4091 size
= bfd_section_size (isection
);
4092 size
= bfd_convert_section_size (ibfd
, isection
, obfd
, size
);
4094 size
= (size
+ interleave
- 1) / interleave
* copy_width
;
4095 else if (extract_symbol
)
4097 if (!bfd_set_section_size (osection
, size
))
4099 err
= _("failed to set size");
4103 vma
= bfd_section_vma (isection
);
4104 p
= find_section_list (bfd_section_name (isection
), FALSE
,
4105 SECTION_CONTEXT_ALTER_VMA
| SECTION_CONTEXT_SET_VMA
);
4108 if (p
->context
& SECTION_CONTEXT_SET_VMA
)
4114 vma
+= change_section_address
;
4116 if (!bfd_set_section_vma (osection
, vma
))
4118 err
= _("failed to set vma");
4122 lma
= isection
->lma
;
4123 p
= find_section_list (bfd_section_name (isection
), FALSE
,
4124 SECTION_CONTEXT_ALTER_LMA
| SECTION_CONTEXT_SET_LMA
);
4127 if (p
->context
& SECTION_CONTEXT_ALTER_LMA
)
4133 lma
+= change_section_address
;
4135 osection
->lma
= lma
;
4137 p
= find_section_list (bfd_section_name (isection
), FALSE
,
4138 SECTION_CONTEXT_SET_ALIGNMENT
);
4140 alignment
= p
->alignment
;
4142 alignment
= bfd_section_alignment (isection
);
4144 /* FIXME: This is probably not enough. If we change the LMA we
4145 may have to recompute the header for the file as well. */
4146 if (!bfd_set_section_alignment (osection
, alignment
))
4148 err
= _("failed to set alignment");
4152 /* Copy merge entity size. */
4153 osection
->entsize
= isection
->entsize
;
4155 /* Copy compress status. */
4156 osection
->compress_status
= isection
->compress_status
;
4158 /* This used to be mangle_section; we do here to avoid using
4159 bfd_get_section_by_name since some formats allow multiple
4160 sections with the same name. */
4161 isection
->output_section
= osection
;
4162 isection
->output_offset
= 0;
4164 if ((isection
->flags
& SEC_GROUP
) != 0)
4166 asymbol
*gsym
= group_signature (isection
);
4170 gsym
->flags
|= BSF_KEEP
;
4171 if (bfd_get_flavour (ibfd
) == bfd_target_elf_flavour
)
4172 elf_group_id (isection
) = gsym
;
4176 /* Allow the BFD backend to copy any private data it understands
4177 from the input section to the output section. */
4178 if (!bfd_copy_private_section_data (ibfd
, isection
, obfd
, osection
))
4180 err
= _("failed to copy private data");
4184 /* All went well. */
4189 bfd_nonfatal_message (NULL
, obfd
, osection
, err
);
4192 /* Return TRUE if input section ISECTION should be skipped. */
4195 skip_section (bfd
*ibfd
, sec_ptr isection
, bfd_boolean skip_copy
)
4201 /* If we have already failed earlier on,
4202 do not keep on generating complaints now. */
4209 if (is_strip_section (ibfd
, isection
))
4212 if (is_update_section (ibfd
, isection
))
4215 /* When merging a note section we skip the copying of the contents,
4216 but not the copying of the relocs associated with the contents. */
4217 if (skip_copy
&& is_mergeable_note_section (ibfd
, isection
))
4220 flags
= bfd_section_flags (isection
);
4221 if ((flags
& SEC_GROUP
) != 0)
4224 osection
= isection
->output_section
;
4225 size
= bfd_section_size (isection
);
4227 if (size
== 0 || osection
== 0)
4233 /* Add section SECTION_PATTERN to the list of sections that will have their
4234 relocations removed. */
4237 handle_remove_relocations_option (const char *section_pattern
)
4239 find_section_list (section_pattern
, TRUE
, SECTION_CONTEXT_REMOVE_RELOCS
);
4242 /* Return TRUE if ISECTION from IBFD should have its relocations removed,
4243 otherwise return FALSE. If the user has requested that relocations be
4244 removed from a section that does not have relocations then this
4245 function will still return TRUE. */
4248 discard_relocations (bfd
*ibfd ATTRIBUTE_UNUSED
, asection
*isection
)
4250 return (find_section_list (bfd_section_name (isection
), FALSE
,
4251 SECTION_CONTEXT_REMOVE_RELOCS
) != NULL
);
4254 /* Wrapper for dealing with --remove-section (-R) command line arguments.
4255 A special case is detected here, if the user asks to remove a relocation
4256 section (one starting with ".rela" or ".rel") then this removal must
4257 be done using a different technique in a relocatable object. */
4260 handle_remove_section_option (const char *section_pattern
)
4262 find_section_list (section_pattern
, TRUE
, SECTION_CONTEXT_REMOVE
);
4263 if (strncmp (section_pattern
, ".rel", 4) == 0)
4265 section_pattern
+= 4;
4266 if (*section_pattern
== 'a')
4268 if (*section_pattern
)
4269 handle_remove_relocations_option (section_pattern
);
4271 sections_removed
= TRUE
;
4274 /* Copy relocations in input section ISECTION of IBFD to an output
4275 section with the same name in OBFDARG. If stripping then don't
4276 copy any relocation info. */
4279 copy_relocations_in_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
4281 bfd
*obfd
= (bfd
*) obfdarg
;
4287 if (skip_section (ibfd
, isection
, FALSE
))
4290 osection
= isection
->output_section
;
4292 /* Core files and DWO files do not need to be relocated. */
4293 if (bfd_get_format (obfd
) == bfd_core
4294 || strip_symbols
== STRIP_NONDWO
4295 || discard_relocations (ibfd
, isection
))
4299 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
4303 /* Do not complain if the target does not support relocations. */
4304 if (relsize
== -1 && bfd_get_error () == bfd_error_invalid_operation
)
4309 bfd_nonfatal_message (NULL
, ibfd
, isection
, NULL
);
4317 bfd_set_reloc (obfd
, osection
, NULL
, 0);
4318 osection
->flags
&= ~SEC_RELOC
;
4322 if (isection
->orelocation
!= NULL
)
4324 /* Some other function has already set up the output relocs
4325 for us, so scan those instead of the default relocs. */
4326 relcount
= isection
->reloc_count
;
4327 relpp
= isection
->orelocation
;
4331 relpp
= (arelent
**) xmalloc (relsize
);
4332 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, isympp
);
4336 bfd_nonfatal_message (NULL
, ibfd
, isection
,
4337 _("relocation count is negative"));
4343 if (strip_symbols
== STRIP_ALL
)
4345 /* Remove relocations which are not in
4346 keep_strip_specific_list. */
4347 arelent
**temp_relpp
;
4348 long temp_relcount
= 0;
4351 temp_relpp
= (arelent
**) xmalloc (relsize
);
4352 for (i
= 0; i
< relcount
; i
++)
4354 /* PR 17512: file: 9e907e0c. */
4355 if (relpp
[i
]->sym_ptr_ptr
4357 && * relpp
[i
]->sym_ptr_ptr
)
4358 if (is_specified_symbol (bfd_asymbol_name (*relpp
[i
]->sym_ptr_ptr
),
4359 keep_specific_htab
))
4360 temp_relpp
[temp_relcount
++] = relpp
[i
];
4362 relcount
= temp_relcount
;
4363 if (relpp
!= isection
->orelocation
)
4368 bfd_set_reloc (obfd
, osection
, relcount
== 0 ? NULL
: relpp
, relcount
);
4371 osection
->flags
&= ~SEC_RELOC
;
4372 if (relpp
!= isection
->orelocation
)
4378 /* Copy the data of input section ISECTION of IBFD
4379 to an output section with the same name in OBFD. */
4382 copy_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
4384 bfd
*obfd
= (bfd
*) obfdarg
;
4385 struct section_list
*p
;
4389 if (skip_section (ibfd
, isection
, TRUE
))
4392 osection
= isection
->output_section
;
4393 /* The output SHF_COMPRESSED section size is different from input if
4394 ELF classes of input and output aren't the same. We can't use
4395 the output section size since --interleave will shrink the output
4396 section. Size will be updated if the section is converted. */
4397 size
= bfd_section_size (isection
);
4399 if (bfd_section_flags (isection
) & SEC_HAS_CONTENTS
4400 && bfd_section_flags (osection
) & SEC_HAS_CONTENTS
)
4402 bfd_byte
*memhunk
= NULL
;
4404 if (!bfd_get_full_section_contents (ibfd
, isection
, &memhunk
)
4405 || !bfd_convert_section_contents (ibfd
, isection
, obfd
,
4409 bfd_nonfatal_message (NULL
, ibfd
, isection
, NULL
);
4416 /* We don't handle leftover bytes (too many possible behaviors,
4417 and we don't know what the user wants). The section length
4418 must be a multiple of the number of bytes to swap. */
4419 if ((size
% reverse_bytes
) == 0)
4424 for (i
= 0; i
< size
; i
+= reverse_bytes
)
4425 for (j
= 0; j
< (unsigned long)(reverse_bytes
/ 2); j
++)
4427 bfd_byte
*m
= (bfd_byte
*) memhunk
;
4430 m
[i
+ j
] = m
[(i
+ reverse_bytes
) - (j
+ 1)];
4431 m
[(i
+ reverse_bytes
) - (j
+ 1)] = b
;
4435 /* User must pad the section up in order to do this. */
4436 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
4437 bfd_section_name (isection
), reverse_bytes
);
4442 /* Keep only every `copy_byte'th byte in MEMHUNK. */
4443 char *from
= (char *) memhunk
+ copy_byte
;
4444 char *to
= (char *) memhunk
;
4445 char *end
= (char *) memhunk
+ size
;
4448 /* If the section address is not exactly divisible by the interleave,
4449 then we must bias the from address. If the copy_byte is less than
4450 the bias, then we must skip forward one interleave, and increment
4452 int extra
= isection
->lma
% interleave
;
4454 if (copy_byte
< extra
)
4457 for (; from
< end
; from
+= interleave
)
4458 for (i
= 0; i
< copy_width
; i
++)
4460 if (&from
[i
] >= end
)
4465 size
= (size
+ interleave
- 1 - copy_byte
) / interleave
* copy_width
;
4466 osection
->lma
/= interleave
;
4467 if (copy_byte
< extra
)
4471 if (!bfd_set_section_contents (obfd
, osection
, memhunk
, 0, size
))
4474 bfd_nonfatal_message (NULL
, obfd
, osection
, NULL
);
4480 else if ((p
= find_section_list (bfd_section_name (isection
),
4481 FALSE
, SECTION_CONTEXT_SET_FLAGS
)) != NULL
4482 && (p
->flags
& SEC_HAS_CONTENTS
) != 0)
4484 void *memhunk
= xmalloc (size
);
4486 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
4487 flag--they can just remove the section entirely and add it
4488 back again. However, we do permit them to turn on the
4489 SEC_HAS_CONTENTS flag, and take it to mean that the section
4490 contents should be zeroed out. */
4492 memset (memhunk
, 0, size
);
4493 if (! bfd_set_section_contents (obfd
, osection
, memhunk
, 0, size
))
4496 bfd_nonfatal_message (NULL
, obfd
, osection
, NULL
);
4504 /* Get all the sections. This is used when --gap-fill or --pad-to is
4508 get_sections (bfd
*obfd ATTRIBUTE_UNUSED
, asection
*osection
, void *secppparg
)
4510 asection
***secppp
= (asection
***) secppparg
;
4512 **secppp
= osection
;
4516 /* Sort sections by LMA. This is called via qsort, and is used when
4517 --gap-fill or --pad-to is used. We force non loadable or empty
4518 sections to the front, where they are easier to ignore. */
4521 compare_section_lma (const void *arg1
, const void *arg2
)
4523 const asection
*sec1
= *(const asection
**) arg1
;
4524 const asection
*sec2
= *(const asection
**) arg2
;
4525 flagword flags1
, flags2
;
4527 /* Sort non loadable sections to the front. */
4528 flags1
= sec1
->flags
;
4529 flags2
= sec2
->flags
;
4530 if ((flags1
& SEC_HAS_CONTENTS
) == 0
4531 || (flags1
& SEC_LOAD
) == 0)
4533 if ((flags2
& SEC_HAS_CONTENTS
) != 0
4534 && (flags2
& SEC_LOAD
) != 0)
4539 if ((flags2
& SEC_HAS_CONTENTS
) == 0
4540 || (flags2
& SEC_LOAD
) == 0)
4544 /* Sort sections by LMA. */
4545 if (sec1
->lma
> sec2
->lma
)
4547 if (sec1
->lma
< sec2
->lma
)
4550 /* Sort sections with the same LMA by size. */
4551 if (bfd_section_size (sec1
) > bfd_section_size (sec2
))
4553 if (bfd_section_size (sec1
) < bfd_section_size (sec2
))
4556 if (sec1
->id
> sec2
->id
)
4558 if (sec1
->id
< sec2
->id
)
4563 /* Mark all the symbols which will be used in output relocations with
4564 the BSF_KEEP flag so that those symbols will not be stripped.
4566 Ignore relocations which will not appear in the output file. */
4569 mark_symbols_used_in_relocations (bfd
*ibfd
, sec_ptr isection
, void *symbolsarg
)
4571 asymbol
**symbols
= (asymbol
**) symbolsarg
;
4576 /* Ignore an input section with no corresponding output section. */
4577 if (isection
->output_section
== NULL
)
4580 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
4583 /* Do not complain if the target does not support relocations. */
4584 if (relsize
== -1 && bfd_get_error () == bfd_error_invalid_operation
)
4586 bfd_fatal (bfd_get_filename (ibfd
));
4592 relpp
= (arelent
**) xmalloc (relsize
);
4593 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, symbols
);
4595 bfd_fatal (bfd_get_filename (ibfd
));
4597 /* Examine each symbol used in a relocation. If it's not one of the
4598 special bfd section symbols, then mark it with BSF_KEEP. */
4599 for (i
= 0; i
< relcount
; i
++)
4601 /* See PRs 20923 and 20930 for reproducers for the NULL tests. */
4602 if (relpp
[i
]->sym_ptr_ptr
!= NULL
4603 && * relpp
[i
]->sym_ptr_ptr
!= NULL
4604 && *relpp
[i
]->sym_ptr_ptr
!= bfd_com_section_ptr
->symbol
4605 && *relpp
[i
]->sym_ptr_ptr
!= bfd_abs_section_ptr
->symbol
4606 && *relpp
[i
]->sym_ptr_ptr
!= bfd_und_section_ptr
->symbol
)
4607 (*relpp
[i
]->sym_ptr_ptr
)->flags
|= BSF_KEEP
;
4613 /* Write out debugging information. */
4616 write_debugging_info (bfd
*obfd
, void *dhandle
,
4617 long *symcountp ATTRIBUTE_UNUSED
,
4618 asymbol
***symppp ATTRIBUTE_UNUSED
)
4620 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
4621 || bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
4623 bfd_byte
*syms
, *strings
= NULL
;
4624 bfd_size_type symsize
, stringsize
;
4625 asection
*stabsec
, *stabstrsec
;
4628 if (! write_stabs_in_sections_debugging_info (obfd
, dhandle
, &syms
,
4633 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DEBUGGING
;
4634 stabsec
= bfd_make_section_with_flags (obfd
, ".stab", flags
);
4635 stabstrsec
= bfd_make_section_with_flags (obfd
, ".stabstr", flags
);
4637 || stabstrsec
== NULL
4638 || !bfd_set_section_size (stabsec
, symsize
)
4639 || !bfd_set_section_size (stabstrsec
, stringsize
)
4640 || !bfd_set_section_alignment (stabsec
, 2)
4641 || !bfd_set_section_alignment (stabstrsec
, 0))
4643 bfd_nonfatal_message (NULL
, obfd
, NULL
,
4644 _("can't create debugging section"));
4649 /* We can get away with setting the section contents now because
4650 the next thing the caller is going to do is copy over the
4651 real sections. We may someday have to split the contents
4652 setting out of this function. */
4653 if (! bfd_set_section_contents (obfd
, stabsec
, syms
, 0, symsize
)
4654 || ! bfd_set_section_contents (obfd
, stabstrsec
, strings
, 0,
4657 bfd_nonfatal_message (NULL
, obfd
, NULL
,
4658 _("can't set debugging section contents"));
4666 bfd_nonfatal_message (NULL
, obfd
, NULL
,
4667 _("don't know how to write debugging information for %s"),
4668 bfd_get_target (obfd
));
4672 /* If neither -D nor -U was specified explicitly,
4673 then use the configured default. */
4675 default_deterministic (void)
4677 if (deterministic
< 0)
4678 deterministic
= DEFAULT_AR_DETERMINISTIC
;
4682 strip_main (int argc
, char *argv
[])
4684 char *input_target
= NULL
;
4685 char *output_target
= NULL
;
4686 bfd_boolean show_version
= FALSE
;
4687 bfd_boolean formats_info
= FALSE
;
4690 char *output_file
= NULL
;
4691 bfd_boolean merge_notes_set
= FALSE
;
4693 while ((c
= getopt_long (argc
, argv
, "I:O:F:K:MN:R:o:sSpdgxXHhVvwDU",
4694 strip_options
, (int *) 0)) != EOF
)
4699 input_target
= optarg
;
4702 output_target
= optarg
;
4705 input_target
= output_target
= optarg
;
4708 handle_remove_section_option (optarg
);
4710 case OPTION_KEEP_SECTION
:
4711 find_section_list (optarg
, TRUE
, SECTION_CONTEXT_KEEP
);
4713 case OPTION_REMOVE_RELOCS
:
4714 handle_remove_relocations_option (optarg
);
4717 strip_symbols
= STRIP_ALL
;
4721 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
4722 strip_symbols
= STRIP_DEBUG
;
4724 case OPTION_STRIP_DWO
:
4725 strip_symbols
= STRIP_DWO
;
4727 case OPTION_STRIP_UNNEEDED
:
4728 strip_symbols
= STRIP_UNNEEDED
;
4731 add_specific_symbol (optarg
, keep_specific_htab
);
4735 merge_notes_set
= TRUE
;
4737 case OPTION_NO_MERGE_NOTES
:
4738 merge_notes
= FALSE
;
4739 merge_notes_set
= TRUE
;
4742 add_specific_symbol (optarg
, strip_specific_htab
);
4745 output_file
= optarg
;
4748 preserve_dates
= TRUE
;
4751 deterministic
= TRUE
;
4754 deterministic
= FALSE
;
4757 discard_locals
= LOCALS_ALL
;
4760 discard_locals
= LOCALS_START_L
;
4766 show_version
= TRUE
;
4768 case OPTION_FORMATS_INFO
:
4769 formats_info
= TRUE
;
4771 case OPTION_ONLY_KEEP_DEBUG
:
4772 strip_symbols
= STRIP_NONDEBUG
;
4774 case OPTION_KEEP_FILE_SYMBOLS
:
4775 keep_file_symbols
= 1;
4777 case OPTION_KEEP_SECTION_SYMBOLS
:
4778 keep_section_symbols
= TRUE
;
4781 /* We've been given a long option. */
4788 strip_usage (stdout
, 0);
4790 strip_usage (stderr
, 1);
4794 /* If the user has not expressly chosen to merge/not-merge ELF notes
4795 then enable the merging unless we are stripping debug or dwo info. */
4796 if (! merge_notes_set
4797 && (strip_symbols
== STRIP_UNDEF
4798 || strip_symbols
== STRIP_ALL
4799 || strip_symbols
== STRIP_UNNEEDED
4800 || strip_symbols
== STRIP_NONDEBUG
4801 || strip_symbols
== STRIP_NONDWO
))
4811 print_version ("strip");
4813 default_deterministic ();
4815 /* Default is to strip all symbols. */
4816 if (strip_symbols
== STRIP_UNDEF
4817 && discard_locals
== LOCALS_UNDEF
4818 && htab_elements (strip_specific_htab
) == 0)
4819 strip_symbols
= STRIP_ALL
;
4821 if (output_target
== NULL
)
4822 output_target
= input_target
;
4826 || (output_file
!= NULL
&& (i
+ 1) < argc
))
4827 strip_usage (stderr
, 1);
4829 for (; i
< argc
; i
++)
4831 int hold_status
= status
;
4832 struct stat statbuf
;
4837 if (get_file_size (argv
[i
]) < 1)
4843 if (output_file
== NULL
4844 || filename_cmp (argv
[i
], output_file
) == 0)
4846 tmpname
= make_tempname (argv
[i
], &tmpfd
);
4848 copyfd
= dup (tmpfd
);
4851 tmpname
= output_file
;
4853 if (tmpname
== NULL
)
4855 bfd_nonfatal_message (argv
[i
], NULL
, NULL
,
4856 _("could not create temporary file to hold stripped copy"));
4862 copy_file (argv
[i
], tmpname
, tmpfd
, &statbuf
, input_target
,
4863 output_target
, NULL
);
4866 if (output_file
!= tmpname
)
4867 status
= smart_rename (tmpname
,
4868 output_file
? output_file
: argv
[i
],
4869 copyfd
, &statbuf
, preserve_dates
) != 0;
4871 status
= hold_status
;
4877 unlink_if_ordinary (tmpname
);
4879 if (output_file
!= tmpname
)
4886 /* Set up PE subsystem. */
4889 set_pe_subsystem (const char *s
)
4891 const char *version
, *subsystem
;
4901 { "native", 0, IMAGE_SUBSYSTEM_NATIVE
},
4902 { "windows", 0, IMAGE_SUBSYSTEM_WINDOWS_GUI
},
4903 { "console", 0, IMAGE_SUBSYSTEM_WINDOWS_CUI
},
4904 { "posix", 0, IMAGE_SUBSYSTEM_POSIX_CUI
},
4905 { "wince", 0, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
},
4906 { "efi-app", 1, IMAGE_SUBSYSTEM_EFI_APPLICATION
},
4907 { "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
},
4908 { "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
},
4909 { "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER
},
4910 { "xbox", 0, IMAGE_SUBSYSTEM_XBOX
}
4916 /* Check for the presence of a version number. */
4917 version
= strchr (s
, ':');
4918 if (version
== NULL
)
4922 int len
= version
- s
;
4926 version
= copy
+ 1 + len
;
4927 pe_major_subsystem_version
= strtoul (version
, ©
, 0);
4929 pe_minor_subsystem_version
= strtoul (copy
+ 1, ©
, 0);
4931 non_fatal (_("%s: bad version in PE subsystem"), s
);
4934 /* Check for numeric subsystem. */
4935 value
= (short) strtol (subsystem
, ©
, 0);
4938 for (i
= 0; i
< ARRAY_SIZE (v
); i
++)
4939 if (v
[i
].value
== value
)
4941 pe_subsystem
= value
;
4942 set_def
= v
[i
].set_def
;
4948 /* Search for subsystem by name. */
4949 for (i
= 0; i
< ARRAY_SIZE (v
); i
++)
4950 if (strcmp (subsystem
, v
[i
].name
) == 0)
4952 pe_subsystem
= v
[i
].value
;
4953 set_def
= v
[i
].set_def
;
4961 fatal (_("unknown PE subsystem: %s"), s
);
4966 if (pe_file_alignment
== (bfd_vma
) -1)
4967 pe_file_alignment
= PE_DEF_FILE_ALIGNMENT
;
4968 if (pe_section_alignment
== (bfd_vma
) -1)
4969 pe_section_alignment
= PE_DEF_SECTION_ALIGNMENT
;
4973 free ((char *) subsystem
);
4976 /* Convert EFI target to PEI target. */
4979 convert_efi_target (char *efi
)
4985 if (strcmp (efi
+ 4, "ia32") == 0)
4987 /* Change ia32 to i386. */
4992 else if (strcmp (efi
+ 4, "x86_64") == 0)
4994 /* Change x86_64 to x86-64. */
4999 /* Allocate and return a pointer to a struct section_add, initializing the
5000 structure using ARG, a string in the format "sectionname=filename".
5001 The returned structure will have its next pointer set to NEXT. The
5002 OPTION field is the name of the command line option currently being
5003 parsed, and is only used if an error needs to be reported. */
5005 static struct section_add
*
5006 init_section_add (const char *arg
,
5007 struct section_add
*next
,
5010 struct section_add
*pa
;
5013 s
= strchr (arg
, '=');
5015 fatal (_("bad format for %s"), option
);
5017 pa
= (struct section_add
*) xmalloc (sizeof (struct section_add
));
5018 pa
->name
= xstrndup (arg
, s
- arg
);
5019 pa
->filename
= s
+ 1;
5021 pa
->contents
= NULL
;
5027 /* Load the file specified in PA, allocating memory to hold the file
5028 contents, and store a pointer to the allocated memory in the contents
5029 field of PA. The size field of PA is also updated. All errors call
5033 section_add_load_file (struct section_add
*pa
)
5038 /* We don't use get_file_size so that we can do
5039 --add-section .note.GNU_stack=/dev/null
5040 get_file_size doesn't work on /dev/null. */
5042 f
= fopen (pa
->filename
, FOPEN_RB
);
5044 fatal (_("cannot open: %s: %s"),
5045 pa
->filename
, strerror (errno
));
5049 pa
->contents
= (bfd_byte
*) xmalloc (alloc
);
5057 pa
->contents
= (bfd_byte
*) xrealloc (pa
->contents
, alloc
);
5060 got
= fread (pa
->contents
+ off
, 1, alloc
- off
, f
);
5062 fatal (_("%s: fread failed"), pa
->filename
);
5073 copy_main (int argc
, char *argv
[])
5075 char *input_filename
= NULL
;
5076 char *output_filename
= NULL
;
5078 char *input_target
= NULL
;
5079 char *output_target
= NULL
;
5080 bfd_boolean show_version
= FALSE
;
5081 bfd_boolean change_warn
= TRUE
;
5082 bfd_boolean formats_info
= FALSE
;
5083 bfd_boolean use_globalize
= FALSE
;
5084 bfd_boolean use_keep_global
= FALSE
;
5088 struct stat statbuf
;
5089 const bfd_arch_info_type
*input_arch
= NULL
;
5091 while ((c
= getopt_long (argc
, argv
, "b:B:i:I:j:K:MN:s:O:d:F:L:G:R:SpgxXHhVvW:wDU",
5092 copy_options
, (int *) 0)) != EOF
)
5097 copy_byte
= atoi (optarg
);
5099 fatal (_("byte number must be non-negative"));
5103 input_arch
= bfd_scan_arch (optarg
);
5104 if (input_arch
== NULL
)
5105 fatal (_("architecture %s unknown"), optarg
);
5111 interleave
= atoi (optarg
);
5113 fatal (_("interleave must be positive"));
5119 case OPTION_INTERLEAVE_WIDTH
:
5120 copy_width
= atoi (optarg
);
5122 fatal(_("interleave width must be positive"));
5126 case 's': /* "source" - 'I' is preferred */
5127 input_target
= optarg
;
5131 case 'd': /* "destination" - 'O' is preferred */
5132 output_target
= optarg
;
5136 input_target
= output_target
= optarg
;
5140 find_section_list (optarg
, TRUE
, SECTION_CONTEXT_COPY
);
5141 sections_copied
= TRUE
;
5145 handle_remove_section_option (optarg
);
5148 case OPTION_KEEP_SECTION
:
5149 find_section_list (optarg
, TRUE
, SECTION_CONTEXT_KEEP
);
5152 case OPTION_REMOVE_RELOCS
:
5153 handle_remove_relocations_option (optarg
);
5157 strip_symbols
= STRIP_ALL
;
5161 strip_symbols
= STRIP_DEBUG
;
5164 case OPTION_STRIP_DWO
:
5165 strip_symbols
= STRIP_DWO
;
5168 case OPTION_STRIP_UNNEEDED
:
5169 strip_symbols
= STRIP_UNNEEDED
;
5172 case OPTION_ONLY_KEEP_DEBUG
:
5173 strip_symbols
= STRIP_NONDEBUG
;
5176 case OPTION_KEEP_FILE_SYMBOLS
:
5177 keep_file_symbols
= 1;
5180 case OPTION_ADD_GNU_DEBUGLINK
:
5181 long_section_names
= ENABLE
;
5182 gnu_debuglink_filename
= optarg
;
5186 add_specific_symbol (optarg
, keep_specific_htab
);
5192 case OPTION_NO_MERGE_NOTES
:
5193 merge_notes
= FALSE
;
5197 add_specific_symbol (optarg
, strip_specific_htab
);
5200 case OPTION_STRIP_UNNEEDED_SYMBOL
:
5201 add_specific_symbol (optarg
, strip_unneeded_htab
);
5205 add_specific_symbol (optarg
, localize_specific_htab
);
5208 case OPTION_GLOBALIZE_SYMBOL
:
5209 use_globalize
= TRUE
;
5210 add_specific_symbol (optarg
, globalize_specific_htab
);
5214 use_keep_global
= TRUE
;
5215 add_specific_symbol (optarg
, keepglobal_specific_htab
);
5219 add_specific_symbol (optarg
, weaken_specific_htab
);
5223 preserve_dates
= TRUE
;
5227 deterministic
= TRUE
;
5231 deterministic
= FALSE
;
5239 discard_locals
= LOCALS_ALL
;
5243 discard_locals
= LOCALS_START_L
;
5251 show_version
= TRUE
;
5254 case OPTION_FORMATS_INFO
:
5255 formats_info
= TRUE
;
5262 case OPTION_ADD_SECTION
:
5263 add_sections
= init_section_add (optarg
, add_sections
,
5265 section_add_load_file (add_sections
);
5268 case OPTION_UPDATE_SECTION
:
5269 update_sections
= init_section_add (optarg
, update_sections
,
5270 "--update-section");
5271 section_add_load_file (update_sections
);
5274 case OPTION_DUMP_SECTION
:
5275 dump_sections
= init_section_add (optarg
, dump_sections
,
5279 case OPTION_ADD_SYMBOL
:
5282 struct addsym_node
*newsym
= xmalloc (sizeof *newsym
);
5284 newsym
->next
= NULL
;
5285 s
= strchr (optarg
, '=');
5287 fatal (_("bad format for %s"), "--add-symbol");
5288 t
= strchr (s
+ 1, ':');
5290 newsym
->symdef
= xstrndup (optarg
, s
- optarg
);
5293 newsym
->section
= xstrndup (s
+ 1, t
- (s
+ 1));
5294 newsym
->symval
= strtol (t
+ 1, NULL
, 0);
5298 newsym
->section
= NULL
;
5299 newsym
->symval
= strtol (s
+ 1, NULL
, 0);
5303 t
= strchr (t
+ 1, ',');
5304 newsym
->othersym
= NULL
;
5306 newsym
->flags
= parse_symflags (t
+1, &newsym
->othersym
);
5308 newsym
->flags
= BSF_GLOBAL
;
5310 /* Keep 'othersym' symbols at the front of the list. */
5311 if (newsym
->othersym
)
5313 newsym
->next
= add_sym_list
;
5315 add_sym_tail
= &newsym
->next
;
5316 add_sym_list
= newsym
;
5320 *add_sym_tail
= newsym
;
5321 add_sym_tail
= &newsym
->next
;
5327 case OPTION_CHANGE_START
:
5328 change_start
= parse_vma (optarg
, "--change-start");
5331 case OPTION_CHANGE_SECTION_ADDRESS
:
5332 case OPTION_CHANGE_SECTION_LMA
:
5333 case OPTION_CHANGE_SECTION_VMA
:
5335 struct section_list
* p
;
5336 unsigned int context
= 0;
5340 char *option
= NULL
;
5345 case OPTION_CHANGE_SECTION_ADDRESS
:
5346 option
= "--change-section-address";
5347 context
= SECTION_CONTEXT_ALTER_LMA
| SECTION_CONTEXT_ALTER_VMA
;
5349 case OPTION_CHANGE_SECTION_LMA
:
5350 option
= "--change-section-lma";
5351 context
= SECTION_CONTEXT_ALTER_LMA
;
5353 case OPTION_CHANGE_SECTION_VMA
:
5354 option
= "--change-section-vma";
5355 context
= SECTION_CONTEXT_ALTER_VMA
;
5359 s
= strchr (optarg
, '=');
5362 s
= strchr (optarg
, '+');
5365 s
= strchr (optarg
, '-');
5367 fatal (_("bad format for %s"), option
);
5372 /* Correct the context. */
5375 case OPTION_CHANGE_SECTION_ADDRESS
:
5376 context
= SECTION_CONTEXT_SET_LMA
| SECTION_CONTEXT_SET_VMA
;
5378 case OPTION_CHANGE_SECTION_LMA
:
5379 context
= SECTION_CONTEXT_SET_LMA
;
5381 case OPTION_CHANGE_SECTION_VMA
:
5382 context
= SECTION_CONTEXT_SET_VMA
;
5388 name
= (char *) xmalloc (len
+ 1);
5389 strncpy (name
, optarg
, len
);
5392 p
= find_section_list (name
, TRUE
, context
);
5394 val
= parse_vma (s
+ 1, option
);
5400 case OPTION_CHANGE_SECTION_ADDRESS
:
5404 case OPTION_CHANGE_SECTION_LMA
:
5408 case OPTION_CHANGE_SECTION_VMA
:
5415 case OPTION_CHANGE_ADDRESSES
:
5416 change_section_address
= parse_vma (optarg
, "--change-addresses");
5417 change_start
= change_section_address
;
5420 case OPTION_CHANGE_WARNINGS
:
5424 case OPTION_CHANGE_LEADING_CHAR
:
5425 change_leading_char
= TRUE
;
5428 case OPTION_COMPRESS_DEBUG_SECTIONS
:
5431 if (strcasecmp (optarg
, "none") == 0)
5432 do_debug_sections
= decompress
;
5433 else if (strcasecmp (optarg
, "zlib") == 0)
5434 do_debug_sections
= compress_zlib
;
5435 else if (strcasecmp (optarg
, "zlib-gnu") == 0)
5436 do_debug_sections
= compress_gnu_zlib
;
5437 else if (strcasecmp (optarg
, "zlib-gabi") == 0)
5438 do_debug_sections
= compress_gabi_zlib
;
5440 fatal (_("unrecognized --compress-debug-sections type `%s'"),
5444 do_debug_sections
= compress
;
5447 case OPTION_DEBUGGING
:
5448 convert_debugging
= TRUE
;
5451 case OPTION_DECOMPRESS_DEBUG_SECTIONS
:
5452 do_debug_sections
= decompress
;
5455 case OPTION_ELF_STT_COMMON
:
5456 if (strcasecmp (optarg
, "yes") == 0)
5457 do_elf_stt_common
= elf_stt_common
;
5458 else if (strcasecmp (optarg
, "no") == 0)
5459 do_elf_stt_common
= no_elf_stt_common
;
5461 fatal (_("unrecognized --elf-stt-common= option `%s'"),
5465 case OPTION_GAP_FILL
:
5467 bfd_vma gap_fill_vma
;
5469 gap_fill_vma
= parse_vma (optarg
, "--gap-fill");
5470 gap_fill
= (bfd_byte
) gap_fill_vma
;
5471 if ((bfd_vma
) gap_fill
!= gap_fill_vma
)
5475 sprintf_vma (buff
, gap_fill_vma
);
5477 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
5480 gap_fill_set
= TRUE
;
5484 case OPTION_NO_CHANGE_WARNINGS
:
5485 change_warn
= FALSE
;
5489 pad_to
= parse_vma (optarg
, "--pad-to");
5493 case OPTION_REMOVE_LEADING_CHAR
:
5494 remove_leading_char
= TRUE
;
5497 case OPTION_REDEFINE_SYM
:
5499 /* Insert this redefinition onto redefine_specific_htab. */
5503 const char *nextarg
;
5504 char *source
, *target
;
5506 s
= strchr (optarg
, '=');
5508 fatal (_("bad format for %s"), "--redefine-sym");
5511 source
= (char *) xmalloc (len
+ 1);
5512 strncpy (source
, optarg
, len
);
5516 len
= strlen (nextarg
);
5517 target
= (char *) xmalloc (len
+ 1);
5518 strcpy (target
, nextarg
);
5520 add_redefine_and_check ("--redefine-sym", source
, target
);
5527 case OPTION_REDEFINE_SYMS
:
5528 add_redefine_syms_file (optarg
);
5531 case OPTION_SET_SECTION_FLAGS
:
5533 struct section_list
*p
;
5538 s
= strchr (optarg
, '=');
5540 fatal (_("bad format for %s"), "--set-section-flags");
5543 name
= (char *) xmalloc (len
+ 1);
5544 strncpy (name
, optarg
, len
);
5547 p
= find_section_list (name
, TRUE
, SECTION_CONTEXT_SET_FLAGS
);
5549 p
->flags
= parse_flags (s
+ 1);
5553 case OPTION_SET_SECTION_ALIGNMENT
:
5555 struct section_list
*p
;
5561 s
= strchr (optarg
, '=');
5563 fatal (_("bad format for --set-section-alignment: argument needed"));
5565 align
= atoi (s
+ 1);
5567 fatal (_("bad format for --set-section-alignment: numeric argument needed"));
5569 /* Convert integer alignment into a power-of-two alignment. */
5571 while ((align
& 1) == 0)
5578 /* Number has more than on 1, i.e. wasn't a power of 2. */
5579 fatal (_("bad format for --set-section-alignment: alignment is not a power of two"));
5581 /* Add the alignment setting to the section list. */
5583 name
= (char *) xmalloc (len
+ 1);
5584 strncpy (name
, optarg
, len
);
5587 p
= find_section_list (name
, TRUE
, SECTION_CONTEXT_SET_ALIGNMENT
);
5589 p
->alignment
= palign
;
5593 case OPTION_RENAME_SECTION
:
5596 const char *eq
, *fl
;
5601 eq
= strchr (optarg
, '=');
5603 fatal (_("bad format for %s"), "--rename-section");
5607 fatal (_("bad format for %s"), "--rename-section");
5609 old_name
= (char *) xmalloc (len
+ 1);
5610 strncpy (old_name
, optarg
, len
);
5614 fl
= strchr (eq
, ',');
5617 flags
= parse_flags (fl
+ 1);
5627 fatal (_("bad format for %s"), "--rename-section");
5629 new_name
= (char *) xmalloc (len
+ 1);
5630 strncpy (new_name
, eq
, len
);
5633 add_section_rename (old_name
, new_name
, flags
);
5637 case OPTION_SET_START
:
5638 set_start
= parse_vma (optarg
, "--set-start");
5639 set_start_set
= TRUE
;
5642 case OPTION_SREC_LEN
:
5643 _bfd_srec_len
= parse_vma (optarg
, "--srec-len");
5646 case OPTION_SREC_FORCES3
:
5647 _bfd_srec_forceS3
= TRUE
;
5650 case OPTION_STRIP_SYMBOLS
:
5651 add_specific_symbols (optarg
, strip_specific_htab
,
5652 &strip_specific_buffer
);
5655 case OPTION_STRIP_UNNEEDED_SYMBOLS
:
5656 add_specific_symbols (optarg
, strip_unneeded_htab
,
5657 &strip_unneeded_buffer
);
5660 case OPTION_KEEP_SYMBOLS
:
5661 add_specific_symbols (optarg
, keep_specific_htab
,
5662 &keep_specific_buffer
);
5665 case OPTION_KEEP_SECTION_SYMBOLS
:
5666 keep_section_symbols
= TRUE
;
5669 case OPTION_LOCALIZE_HIDDEN
:
5670 localize_hidden
= TRUE
;
5673 case OPTION_LOCALIZE_SYMBOLS
:
5674 add_specific_symbols (optarg
, localize_specific_htab
,
5675 &localize_specific_buffer
);
5678 case OPTION_LONG_SECTION_NAMES
:
5679 if (!strcmp ("enable", optarg
))
5680 long_section_names
= ENABLE
;
5681 else if (!strcmp ("disable", optarg
))
5682 long_section_names
= DISABLE
;
5683 else if (!strcmp ("keep", optarg
))
5684 long_section_names
= KEEP
;
5686 fatal (_("unknown long section names option '%s'"), optarg
);
5689 case OPTION_GLOBALIZE_SYMBOLS
:
5690 use_globalize
= TRUE
;
5691 add_specific_symbols (optarg
, globalize_specific_htab
,
5692 &globalize_specific_buffer
);
5695 case OPTION_KEEPGLOBAL_SYMBOLS
:
5696 use_keep_global
= TRUE
;
5697 add_specific_symbols (optarg
, keepglobal_specific_htab
,
5698 &keepglobal_specific_buffer
);
5701 case OPTION_WEAKEN_SYMBOLS
:
5702 add_specific_symbols (optarg
, weaken_specific_htab
,
5703 &weaken_specific_buffer
);
5706 case OPTION_ALT_MACH_CODE
:
5707 use_alt_mach_code
= strtoul (optarg
, NULL
, 0);
5708 if (use_alt_mach_code
== 0)
5709 fatal (_("unable to parse alternative machine code"));
5712 case OPTION_PREFIX_SYMBOLS
:
5713 prefix_symbols_string
= optarg
;
5716 case OPTION_PREFIX_SECTIONS
:
5717 prefix_sections_string
= optarg
;
5720 case OPTION_PREFIX_ALLOC_SECTIONS
:
5721 prefix_alloc_sections_string
= optarg
;
5724 case OPTION_READONLY_TEXT
:
5725 bfd_flags_to_set
|= WP_TEXT
;
5726 bfd_flags_to_clear
&= ~WP_TEXT
;
5729 case OPTION_WRITABLE_TEXT
:
5730 bfd_flags_to_clear
|= WP_TEXT
;
5731 bfd_flags_to_set
&= ~WP_TEXT
;
5735 bfd_flags_to_set
|= D_PAGED
;
5736 bfd_flags_to_clear
&= ~D_PAGED
;
5740 bfd_flags_to_clear
|= D_PAGED
;
5741 bfd_flags_to_set
&= ~D_PAGED
;
5744 case OPTION_EXTRACT_DWO
:
5745 strip_symbols
= STRIP_NONDWO
;
5748 case OPTION_EXTRACT_SYMBOL
:
5749 extract_symbol
= TRUE
;
5752 case OPTION_REVERSE_BYTES
:
5754 int prev
= reverse_bytes
;
5756 reverse_bytes
= atoi (optarg
);
5757 if ((reverse_bytes
<= 0) || ((reverse_bytes
% 2) != 0))
5758 fatal (_("number of bytes to reverse must be positive and even"));
5760 if (prev
&& prev
!= reverse_bytes
)
5761 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
5766 case OPTION_FILE_ALIGNMENT
:
5767 pe_file_alignment
= parse_vma (optarg
, "--file-alignment");
5773 pe_heap_reserve
= strtoul (optarg
, &end
, 0);
5775 || (*end
!= '.' && *end
!= '\0'))
5776 non_fatal (_("%s: invalid reserve value for --heap"),
5778 else if (*end
!= '\0')
5780 pe_heap_commit
= strtoul (end
+ 1, &end
, 0);
5782 non_fatal (_("%s: invalid commit value for --heap"),
5788 case OPTION_IMAGE_BASE
:
5789 pe_image_base
= parse_vma (optarg
, "--image-base");
5792 case OPTION_PE_SECTION_ALIGNMENT
:
5793 pe_section_alignment
= parse_vma (optarg
,
5794 "--section-alignment");
5797 case OPTION_SUBSYSTEM
:
5798 set_pe_subsystem (optarg
);
5804 pe_stack_reserve
= strtoul (optarg
, &end
, 0);
5806 || (*end
!= '.' && *end
!= '\0'))
5807 non_fatal (_("%s: invalid reserve value for --stack"),
5809 else if (*end
!= '\0')
5811 pe_stack_commit
= strtoul (end
+ 1, &end
, 0);
5813 non_fatal (_("%s: invalid commit value for --stack"),
5819 case OPTION_VERILOG_DATA_WIDTH
:
5820 VerilogDataWidth
= parse_vma (optarg
, "--verilog-data-width");
5821 if (VerilogDataWidth
< 1)
5822 fatal (_("verilog data width must be at least 1 byte"));
5826 /* We've been given a long option. */
5831 copy_usage (stdout
, 0);
5834 copy_usage (stderr
, 1);
5838 if (use_globalize
&& use_keep_global
)
5839 fatal(_("--globalize-symbol(s) is incompatible with -G/--keep-global-symbol(s)"));
5848 print_version ("objcopy");
5850 if (interleave
&& copy_byte
== -1)
5851 fatal (_("interleave start byte must be set with --byte"));
5853 if (copy_byte
>= interleave
)
5854 fatal (_("byte number must be less than interleave"));
5856 if (copy_width
> interleave
- copy_byte
)
5857 fatal (_("interleave width must be less than or equal to interleave - byte`"));
5859 if (optind
== argc
|| optind
+ 2 < argc
)
5860 copy_usage (stderr
, 1);
5862 input_filename
= argv
[optind
];
5863 if (optind
+ 1 < argc
)
5864 output_filename
= argv
[optind
+ 1];
5866 default_deterministic ();
5868 /* Default is to strip no symbols. */
5869 if (strip_symbols
== STRIP_UNDEF
&& discard_locals
== LOCALS_UNDEF
)
5870 strip_symbols
= STRIP_NONE
;
5872 if (output_target
== NULL
)
5873 output_target
= input_target
;
5875 /* Convert input EFI target to PEI target. */
5876 if (input_target
!= NULL
5877 && strncmp (input_target
, "efi-", 4) == 0)
5881 efi
= xstrdup (output_target
+ 4);
5882 if (strncmp (efi
, "bsdrv-", 6) == 0
5883 || strncmp (efi
, "rtdrv-", 6) == 0)
5885 else if (strncmp (efi
, "app-", 4) != 0)
5886 fatal (_("unknown input EFI target: %s"), input_target
);
5889 convert_efi_target (efi
);
5892 /* Convert output EFI target to PEI target. */
5893 if (output_target
!= NULL
5894 && strncmp (output_target
, "efi-", 4) == 0)
5898 efi
= xstrdup (output_target
+ 4);
5899 if (strncmp (efi
, "app-", 4) == 0)
5901 if (pe_subsystem
== -1)
5902 pe_subsystem
= IMAGE_SUBSYSTEM_EFI_APPLICATION
;
5904 else if (strncmp (efi
, "bsdrv-", 6) == 0)
5906 if (pe_subsystem
== -1)
5907 pe_subsystem
= IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
;
5910 else if (strncmp (efi
, "rtdrv-", 6) == 0)
5912 if (pe_subsystem
== -1)
5913 pe_subsystem
= IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
;
5917 fatal (_("unknown output EFI target: %s"), output_target
);
5919 if (pe_file_alignment
== (bfd_vma
) -1)
5920 pe_file_alignment
= PE_DEF_FILE_ALIGNMENT
;
5921 if (pe_section_alignment
== (bfd_vma
) -1)
5922 pe_section_alignment
= PE_DEF_SECTION_ALIGNMENT
;
5924 output_target
= efi
;
5925 convert_efi_target (efi
);
5928 /* If there is no destination file, or the source and destination files
5929 are the same, then create a temp and copy the result into the input. */
5931 if (output_filename
== NULL
5932 || filename_cmp (input_filename
, output_filename
) == 0)
5934 tmpname
= make_tempname (input_filename
, &tmpfd
);
5936 copyfd
= dup (tmpfd
);
5939 tmpname
= output_filename
;
5941 if (tmpname
== NULL
)
5943 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
5944 input_filename
, strerror (errno
));
5947 copy_file (input_filename
, tmpname
, tmpfd
, &statbuf
, input_target
,
5948 output_target
, input_arch
);
5951 if (tmpname
!= output_filename
)
5952 status
= smart_rename (tmpname
, input_filename
, copyfd
,
5953 &statbuf
, preserve_dates
) != 0;
5959 unlink_if_ordinary (tmpname
);
5962 if (tmpname
!= output_filename
)
5967 struct section_list
*p
;
5969 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
5973 if (p
->context
& (SECTION_CONTEXT_SET_VMA
| SECTION_CONTEXT_ALTER_VMA
))
5977 sprintf_vma (buff
, p
->vma_val
);
5979 /* xgettext:c-format */
5980 non_fatal (_("%s %s%c0x%s never used"),
5981 "--change-section-vma",
5983 p
->context
& SECTION_CONTEXT_SET_VMA
? '=' : '+',
5987 if (p
->context
& (SECTION_CONTEXT_SET_LMA
| SECTION_CONTEXT_ALTER_LMA
))
5991 sprintf_vma (buff
, p
->lma_val
);
5993 /* xgettext:c-format */
5994 non_fatal (_("%s %s%c0x%s never used"),
5995 "--change-section-lma",
5997 p
->context
& SECTION_CONTEXT_SET_LMA
? '=' : '+',
6004 free (strip_specific_buffer
);
6005 free (strip_unneeded_buffer
);
6006 free (keep_specific_buffer
);
6007 free (localize_specific_buffer
);
6008 free (globalize_specific_buffer
);
6009 free (keepglobal_specific_buffer
);
6010 free (weaken_specific_buffer
);
6016 main (int argc
, char *argv
[])
6018 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
6019 setlocale (LC_MESSAGES
, "");
6021 #if defined (HAVE_SETLOCALE)
6022 setlocale (LC_CTYPE
, "");
6024 bindtextdomain (PACKAGE
, LOCALEDIR
);
6025 textdomain (PACKAGE
);
6027 program_name
= argv
[0];
6028 xmalloc_set_program_name (program_name
);
6030 START_PROGRESS (program_name
, 0);
6032 expandargv (&argc
, &argv
);
6034 strip_symbols
= STRIP_UNDEF
;
6035 discard_locals
= LOCALS_UNDEF
;
6037 if (bfd_init () != BFD_INIT_MAGIC
)
6038 fatal (_("fatal error: libbfd ABI mismatch"));
6039 set_default_bfd_target ();
6043 int i
= strlen (program_name
);
6044 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
6045 /* Drop the .exe suffix, if any. */
6046 if (i
> 4 && FILENAME_CMP (program_name
+ i
- 4, ".exe") == 0)
6049 program_name
[i
] = '\0';
6052 is_strip
= (i
>= 5 && FILENAME_CMP (program_name
+ i
- 5, "strip") == 0);
6055 create_symbol_htabs ();
6058 bfd_set_error_program_name (argv
[0]);
6061 strip_main (argc
, argv
);
6063 copy_main (argc
, argv
);
6065 END_PROGRESS (program_name
);