1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright (C) 1991-2019 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
25 #include "libiberty.h"
28 #include "filenames.h"
31 #include "coff/internal.h"
33 #include "safe-ctype.h"
35 /* FIXME: See bfd/peXXigen.c for why we include an architecture specific
36 header in generic PE code. */
37 #include "coff/i386.h"
40 static bfd_vma pe_file_alignment = (bfd_vma) -1;
41 static bfd_vma pe_heap_commit = (bfd_vma) -1;
42 static bfd_vma pe_heap_reserve = (bfd_vma) -1;
43 static bfd_vma pe_image_base = (bfd_vma) -1;
44 static bfd_vma pe_section_alignment = (bfd_vma) -1;
45 static bfd_vma pe_stack_commit = (bfd_vma) -1;
46 static bfd_vma pe_stack_reserve = (bfd_vma) -1;
47 static short pe_subsystem = -1;
48 static short pe_major_subsystem_version = -1;
49 static short pe_minor_subsystem_version = -1;
51 struct is_specified_symbol_predicate_data
57 /* A node includes symbol name mapping to support redefine_sym. */
66 struct addsym_node *next;
74 typedef struct section_rename
76 const char * old_name;
77 const char * new_name;
79 struct section_rename * next;
83 /* List of sections to be renamed. */
84 static section_rename *section_rename_list;
86 static asymbol **isympp = NULL; /* Input symbols. */
87 static asymbol **osympp = NULL; /* Output symbols that survive stripping. */
89 /* If `copy_byte' >= 0, copy 'copy_width' byte(s) of every `interleave' bytes. */
90 static int copy_byte = -1;
91 static int interleave = 0; /* Initialised to 4 in copy_main(). */
92 static int copy_width = 1;
94 static bfd_boolean verbose; /* Print file and target names. */
95 static bfd_boolean preserve_dates; /* Preserve input file timestamp. */
96 static int deterministic = -1; /* Enable deterministic archives. */
97 static int status = 0; /* Exit status. */
99 static bfd_boolean merge_notes = FALSE; /* Merge note sections. */
100 static bfd_byte * merged_notes = NULL; /* Contents on note section undergoing a merge. */
101 static bfd_size_type merged_size = 0; /* New, smaller size of the merged note section. */
106 STRIP_NONE, /* Don't strip. */
107 STRIP_DEBUG, /* Strip all debugger symbols. */
108 STRIP_UNNEEDED, /* Strip unnecessary symbols. */
109 STRIP_NONDEBUG, /* Strip everything but debug info. */
110 STRIP_DWO, /* Strip all DWO info. */
111 STRIP_NONDWO, /* Strip everything but DWO info. */
112 STRIP_ALL /* Strip all symbols. */
115 /* Which symbols to remove. */
116 static enum strip_action strip_symbols = STRIP_UNDEF;
121 LOCALS_START_L, /* Discard locals starting with L. */
122 LOCALS_ALL /* Discard all locals. */
125 /* Which local symbols to remove. Overrides STRIP_ALL. */
126 static enum locals_action discard_locals;
128 /* Structure used to hold lists of sections and actions to take. */
131 struct section_list * next; /* Next section to change. */
132 const char * pattern; /* Section name pattern. */
133 bfd_boolean used; /* Whether this entry was used. */
135 unsigned int context; /* What to do with matching sections. */
136 /* Flag bits used in the context field.
137 COPY and REMOVE are mutually exlusive. SET and ALTER are mutually exclusive. */
138 #define SECTION_CONTEXT_REMOVE (1 << 0) /* Remove this section. */
139 #define SECTION_CONTEXT_COPY (1 << 1) /* Copy this section, delete all non-copied section. */
140 #define SECTION_CONTEXT_SET_VMA (1 << 2) /* Set the sections' VMA address. */
141 #define SECTION_CONTEXT_ALTER_VMA (1 << 3) /* Increment or decrement the section's VMA address. */
142 #define SECTION_CONTEXT_SET_LMA (1 << 4) /* Set the sections' LMA address. */
143 #define SECTION_CONTEXT_ALTER_LMA (1 << 5) /* Increment or decrement the section's LMA address. */
144 #define SECTION_CONTEXT_SET_FLAGS (1 << 6) /* Set the section's flags. */
145 #define SECTION_CONTEXT_REMOVE_RELOCS (1 << 7) /* Remove relocations for this section. */
147 bfd_vma vma_val; /* Amount to change by or set to. */
148 bfd_vma lma_val; /* Amount to change by or set to. */
149 flagword flags; /* What to set the section flags to. */
152 static struct section_list *change_sections;
154 /* TRUE if some sections are to be removed. */
155 static bfd_boolean sections_removed;
157 /* TRUE if only some sections are to be copied. */
158 static bfd_boolean sections_copied;
160 /* Changes to the start address. */
161 static bfd_vma change_start = 0;
162 static bfd_boolean set_start_set = FALSE;
163 static bfd_vma set_start;
165 /* Changes to section addresses. */
166 static bfd_vma change_section_address = 0;
168 /* Filling gaps between sections. */
169 static bfd_boolean gap_fill_set = FALSE;
170 static bfd_byte gap_fill = 0;
172 /* Pad to a given address. */
173 static bfd_boolean pad_to_set = FALSE;
174 static bfd_vma pad_to;
176 /* Use alternative machine code? */
177 static unsigned long use_alt_mach_code = 0;
179 /* Output BFD flags user wants to set or clear */
180 static flagword bfd_flags_to_set;
181 static flagword bfd_flags_to_clear;
183 /* List of sections to add. */
186 /* Next section to add. */
187 struct section_add *next;
188 /* Name of section to add. */
190 /* Name of file holding section contents. */
191 const char *filename;
194 /* Contents of file. */
196 /* BFD section, after it has been added. */
200 /* List of sections to add to the output BFD. */
201 static struct section_add *add_sections;
203 /* List of sections to update in the output BFD. */
204 static struct section_add *update_sections;
206 /* List of sections to dump from the output BFD. */
207 static struct section_add *dump_sections;
209 /* If non-NULL the argument to --add-gnu-debuglink.
210 This should be the filename to store in the .gnu_debuglink section. */
211 static const char * gnu_debuglink_filename = NULL;
213 /* Whether to convert debugging information. */
214 static bfd_boolean convert_debugging = FALSE;
216 /* Whether to compress/decompress DWARF debug sections. */
221 compress_zlib = compress | 1 << 1,
222 compress_gnu_zlib = compress | 1 << 2,
223 compress_gabi_zlib = compress | 1 << 3,
225 } do_debug_sections = nothing;
227 /* Whether to generate ELF common symbols with the STT_COMMON type. */
228 static enum bfd_link_elf_stt_common do_elf_stt_common = unchanged;
230 /* Whether to change the leading character in symbol names. */
231 static bfd_boolean change_leading_char = FALSE;
233 /* Whether to remove the leading character from global symbol names. */
234 static bfd_boolean remove_leading_char = FALSE;
236 /* Whether to permit wildcard in symbol comparison. */
237 static bfd_boolean wildcard = FALSE;
239 /* True if --localize-hidden is in effect. */
240 static bfd_boolean localize_hidden = FALSE;
242 /* List of symbols to strip, keep, localize, keep-global, weaken,
244 static htab_t strip_specific_htab = NULL;
245 static htab_t strip_unneeded_htab = NULL;
246 static htab_t keep_specific_htab = NULL;
247 static htab_t localize_specific_htab = NULL;
248 static htab_t globalize_specific_htab = NULL;
249 static htab_t keepglobal_specific_htab = NULL;
250 static htab_t weaken_specific_htab = NULL;
251 static htab_t redefine_specific_htab = NULL;
252 static htab_t redefine_specific_reverse_htab = NULL;
253 static struct addsym_node *add_sym_list = NULL, **add_sym_tail = &add_sym_list;
254 static int add_symbols = 0;
256 static char *strip_specific_buffer = NULL;
257 static char *strip_unneeded_buffer = NULL;
258 static char *keep_specific_buffer = NULL;
259 static char *localize_specific_buffer = NULL;
260 static char *globalize_specific_buffer = NULL;
261 static char *keepglobal_specific_buffer = NULL;
262 static char *weaken_specific_buffer = NULL;
264 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
265 static bfd_boolean weaken = FALSE;
267 /* If this is TRUE, we retain BSF_FILE symbols. */
268 static bfd_boolean keep_file_symbols = FALSE;
270 /* Prefix symbols/sections. */
271 static char *prefix_symbols_string = 0;
272 static char *prefix_sections_string = 0;
273 static char *prefix_alloc_sections_string = 0;
275 /* True if --extract-symbol was passed on the command line. */
276 static bfd_boolean extract_symbol = FALSE;
278 /* If `reverse_bytes' is nonzero, then reverse the order of every chunk
279 of <reverse_bytes> bytes within each output section. */
280 static int reverse_bytes = 0;
282 /* For Coff objects, we may want to allow or disallow long section names,
283 or preserve them where found in the inputs. Debug info relies on them. */
284 enum long_section_name_handling
291 /* The default long section handling mode is to preserve them.
292 This is also the only behaviour for 'strip'. */
293 static enum long_section_name_handling long_section_names = KEEP;
295 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
296 enum command_line_switch
298 OPTION_ADD_SECTION=150,
299 OPTION_ADD_GNU_DEBUGLINK,
301 OPTION_ALT_MACH_CODE,
302 OPTION_CHANGE_ADDRESSES,
303 OPTION_CHANGE_LEADING_CHAR,
304 OPTION_CHANGE_SECTION_ADDRESS,
305 OPTION_CHANGE_SECTION_LMA,
306 OPTION_CHANGE_SECTION_VMA,
308 OPTION_CHANGE_WARNINGS,
309 OPTION_COMPRESS_DEBUG_SECTIONS,
311 OPTION_DECOMPRESS_DEBUG_SECTIONS,
313 OPTION_ELF_STT_COMMON,
315 OPTION_EXTRACT_SYMBOL,
316 OPTION_FILE_ALIGNMENT,
319 OPTION_GLOBALIZE_SYMBOL,
320 OPTION_GLOBALIZE_SYMBOLS,
324 OPTION_INTERLEAVE_WIDTH,
325 OPTION_KEEPGLOBAL_SYMBOLS,
326 OPTION_KEEP_FILE_SYMBOLS,
328 OPTION_LOCALIZE_HIDDEN,
329 OPTION_LOCALIZE_SYMBOLS,
330 OPTION_LONG_SECTION_NAMES,
332 OPTION_NO_MERGE_NOTES,
333 OPTION_NO_CHANGE_WARNINGS,
334 OPTION_ONLY_KEEP_DEBUG,
336 OPTION_PREFIX_ALLOC_SECTIONS,
337 OPTION_PREFIX_SECTIONS,
338 OPTION_PREFIX_SYMBOLS,
340 OPTION_READONLY_TEXT,
342 OPTION_REDEFINE_SYMS,
343 OPTION_REMOVE_LEADING_CHAR,
344 OPTION_REMOVE_RELOCS,
345 OPTION_RENAME_SECTION,
346 OPTION_REVERSE_BYTES,
347 OPTION_SECTION_ALIGNMENT,
348 OPTION_SET_SECTION_FLAGS,
354 OPTION_STRIP_SYMBOLS,
355 OPTION_STRIP_UNNEEDED,
356 OPTION_STRIP_UNNEEDED_SYMBOL,
357 OPTION_STRIP_UNNEEDED_SYMBOLS,
359 OPTION_UPDATE_SECTION,
360 OPTION_VERILOG_DATA_WIDTH,
362 OPTION_WEAKEN_SYMBOLS,
366 /* Options to handle if running as "strip". */
368 static struct option strip_options[] =
370 {"disable-deterministic-archives", no_argument, 0, 'U'},
371 {"discard-all", no_argument, 0, 'x'},
372 {"discard-locals", no_argument, 0, 'X'},
373 {"enable-deterministic-archives", no_argument, 0, 'D'},
374 {"format", required_argument, 0, 'F'}, /* Obsolete */
375 {"help", no_argument, 0, 'h'},
376 {"info", no_argument, 0, OPTION_FORMATS_INFO},
377 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
378 {"input-target", required_argument, 0, 'I'},
379 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
380 {"keep-symbol", required_argument, 0, 'K'},
381 {"merge-notes", no_argument, 0, 'M'},
382 {"no-merge-notes", no_argument, 0, OPTION_NO_MERGE_NOTES},
383 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
384 {"output-file", required_argument, 0, 'o'},
385 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
386 {"output-target", required_argument, 0, 'O'},
387 {"preserve-dates", no_argument, 0, 'p'},
388 {"remove-section", required_argument, 0, 'R'},
389 {"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS},
390 {"strip-all", no_argument, 0, 's'},
391 {"strip-debug", no_argument, 0, 'S'},
392 {"strip-dwo", no_argument, 0, OPTION_STRIP_DWO},
393 {"strip-symbol", required_argument, 0, 'N'},
394 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
395 {"target", required_argument, 0, 'F'},
396 {"verbose", no_argument, 0, 'v'},
397 {"version", no_argument, 0, 'V'},
398 {"wildcard", no_argument, 0, 'w'},
399 {0, no_argument, 0, 0}
402 /* Options to handle if running as "objcopy". */
404 static struct option copy_options[] =
406 {"add-gnu-debuglink", required_argument, 0, OPTION_ADD_GNU_DEBUGLINK},
407 {"add-section", required_argument, 0, OPTION_ADD_SECTION},
408 {"add-symbol", required_argument, 0, OPTION_ADD_SYMBOL},
409 {"adjust-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
410 {"adjust-start", required_argument, 0, OPTION_CHANGE_START},
411 {"adjust-vma", required_argument, 0, OPTION_CHANGE_ADDRESSES},
412 {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
413 {"alt-machine-code", required_argument, 0, OPTION_ALT_MACH_CODE},
414 {"binary-architecture", required_argument, 0, 'B'},
415 {"byte", required_argument, 0, 'b'},
416 {"change-addresses", required_argument, 0, OPTION_CHANGE_ADDRESSES},
417 {"change-leading-char", no_argument, 0, OPTION_CHANGE_LEADING_CHAR},
418 {"change-section-address", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
419 {"change-section-lma", required_argument, 0, OPTION_CHANGE_SECTION_LMA},
420 {"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA},
421 {"change-start", required_argument, 0, OPTION_CHANGE_START},
422 {"change-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
423 {"compress-debug-sections", optional_argument, 0, OPTION_COMPRESS_DEBUG_SECTIONS},
424 {"debugging", no_argument, 0, OPTION_DEBUGGING},
425 {"decompress-debug-sections", no_argument, 0, OPTION_DECOMPRESS_DEBUG_SECTIONS},
426 {"disable-deterministic-archives", no_argument, 0, 'U'},
427 {"discard-all", no_argument, 0, 'x'},
428 {"discard-locals", no_argument, 0, 'X'},
429 {"dump-section", required_argument, 0, OPTION_DUMP_SECTION},
430 {"elf-stt-common", required_argument, 0, OPTION_ELF_STT_COMMON},
431 {"enable-deterministic-archives", no_argument, 0, 'D'},
432 {"extract-dwo", no_argument, 0, OPTION_EXTRACT_DWO},
433 {"extract-symbol", no_argument, 0, OPTION_EXTRACT_SYMBOL},
434 {"file-alignment", required_argument, 0, OPTION_FILE_ALIGNMENT},
435 {"format", required_argument, 0, 'F'}, /* Obsolete */
436 {"gap-fill", required_argument, 0, OPTION_GAP_FILL},
437 {"globalize-symbol", required_argument, 0, OPTION_GLOBALIZE_SYMBOL},
438 {"globalize-symbols", required_argument, 0, OPTION_GLOBALIZE_SYMBOLS},
439 {"heap", required_argument, 0, OPTION_HEAP},
440 {"help", no_argument, 0, 'h'},
441 {"image-base", required_argument, 0 , OPTION_IMAGE_BASE},
442 {"impure", no_argument, 0, OPTION_IMPURE},
443 {"info", no_argument, 0, OPTION_FORMATS_INFO},
444 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
445 {"input-target", required_argument, 0, 'I'},
446 {"interleave", optional_argument, 0, 'i'},
447 {"interleave-width", required_argument, 0, OPTION_INTERLEAVE_WIDTH},
448 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
449 {"keep-global-symbol", required_argument, 0, 'G'},
450 {"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS},
451 {"keep-symbol", required_argument, 0, 'K'},
452 {"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS},
453 {"localize-hidden", no_argument, 0, OPTION_LOCALIZE_HIDDEN},
454 {"localize-symbol", required_argument, 0, 'L'},
455 {"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
456 {"long-section-names", required_argument, 0, OPTION_LONG_SECTION_NAMES},
457 {"merge-notes", no_argument, 0, 'M'},
458 {"no-merge-notes", no_argument, 0, OPTION_NO_MERGE_NOTES},
459 {"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
460 {"no-change-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
461 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
462 {"only-section", required_argument, 0, 'j'},
463 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
464 {"output-target", required_argument, 0, 'O'},
465 {"pad-to", required_argument, 0, OPTION_PAD_TO},
466 {"prefix-alloc-sections", required_argument, 0, OPTION_PREFIX_ALLOC_SECTIONS},
467 {"prefix-sections", required_argument, 0, OPTION_PREFIX_SECTIONS},
468 {"prefix-symbols", required_argument, 0, OPTION_PREFIX_SYMBOLS},
469 {"preserve-dates", no_argument, 0, 'p'},
470 {"pure", no_argument, 0, OPTION_PURE},
471 {"readonly-text", no_argument, 0, OPTION_READONLY_TEXT},
472 {"redefine-sym", required_argument, 0, OPTION_REDEFINE_SYM},
473 {"redefine-syms", required_argument, 0, OPTION_REDEFINE_SYMS},
474 {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR},
475 {"remove-section", required_argument, 0, 'R'},
476 {"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS},
477 {"rename-section", required_argument, 0, OPTION_RENAME_SECTION},
478 {"reverse-bytes", required_argument, 0, OPTION_REVERSE_BYTES},
479 {"section-alignment", required_argument, 0, OPTION_SECTION_ALIGNMENT},
480 {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS},
481 {"set-start", required_argument, 0, OPTION_SET_START},
482 {"srec-forceS3", no_argument, 0, OPTION_SREC_FORCES3},
483 {"srec-len", required_argument, 0, OPTION_SREC_LEN},
484 {"stack", required_argument, 0, OPTION_STACK},
485 {"strip-all", no_argument, 0, 'S'},
486 {"strip-debug", no_argument, 0, 'g'},
487 {"strip-dwo", no_argument, 0, OPTION_STRIP_DWO},
488 {"strip-symbol", required_argument, 0, 'N'},
489 {"strip-symbols", required_argument, 0, OPTION_STRIP_SYMBOLS},
490 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
491 {"strip-unneeded-symbol", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOL},
492 {"strip-unneeded-symbols", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOLS},
493 {"subsystem", required_argument, 0, OPTION_SUBSYSTEM},
494 {"target", required_argument, 0, 'F'},
495 {"update-section", required_argument, 0, OPTION_UPDATE_SECTION},
496 {"verbose", no_argument, 0, 'v'},
497 {"verilog-data-width", required_argument, 0, OPTION_VERILOG_DATA_WIDTH},
498 {"version", no_argument, 0, 'V'},
499 {"weaken", no_argument, 0, OPTION_WEAKEN},
500 {"weaken-symbol", required_argument, 0, 'W'},
501 {"weaken-symbols", required_argument, 0, OPTION_WEAKEN_SYMBOLS},
502 {"wildcard", no_argument, 0, 'w'},
503 {"writable-text", no_argument, 0, OPTION_WRITABLE_TEXT},
504 {0, no_argument, 0, 0}
508 extern char *program_name;
510 /* This flag distinguishes between strip and objcopy:
511 1 means this is 'strip'; 0 means this is 'objcopy'.
512 -1 means if we should use argv[0] to decide. */
515 /* The maximum length of an S record. This variable is defined in srec.c
516 and can be modified by the --srec-len parameter. */
517 extern unsigned int _bfd_srec_len;
519 /* Restrict the generation of Srecords to type S3 only.
520 This variable is defined in bfd/srec.c and can be toggled
521 on by the --srec-forceS3 command line switch. */
522 extern bfd_boolean _bfd_srec_forceS3;
524 /* Width of data in bytes for verilog output.
525 This variable is declared in bfd/verilog.c and can be modified by
526 the --verilog-data-width parameter. */
527 extern unsigned int VerilogDataWidth;
529 /* Forward declarations. */
530 static void setup_section (bfd *, asection *, void *);
531 static void setup_bfd_headers (bfd *, bfd *);
532 static void copy_relocations_in_section (bfd *, asection *, void *);
533 static void copy_section (bfd *, asection *, void *);
534 static void get_sections (bfd *, asection *, void *);
535 static int compare_section_lma (const void *, const void *);
536 static void mark_symbols_used_in_relocations (bfd *, asection *, void *);
537 static bfd_boolean write_debugging_info (bfd *, void *, long *, asymbol ***);
538 static const char *lookup_sym_redefinition (const char *);
539 static const char *find_section_rename (const char *, flagword *);
541 ATTRIBUTE_NORETURN static void
542 copy_usage (FILE *stream, int exit_status)
544 fprintf (stream, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name);
545 fprintf (stream, _(" Copies a binary file, possibly transforming it in the process\n"));
546 fprintf (stream, _(" The options are:\n"));
547 fprintf (stream, _("\
548 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
549 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
550 -B --binary-architecture <arch> Set output arch, when input is arch-less\n\
551 -F --target <bfdname> Set both input and output format to <bfdname>\n\
552 --debugging Convert debugging information, if possible\n\
553 -p --preserve-dates Copy modified/access timestamps to the output\n"));
554 if (DEFAULT_AR_DETERMINISTIC)
555 fprintf (stream, _("\
556 -D --enable-deterministic-archives\n\
557 Produce deterministic output when stripping archives (default)\n\
558 -U --disable-deterministic-archives\n\
559 Disable -D behavior\n"));
561 fprintf (stream, _("\
562 -D --enable-deterministic-archives\n\
563 Produce deterministic output when stripping archives\n\
564 -U --disable-deterministic-archives\n\
565 Disable -D behavior (default)\n"));
566 fprintf (stream, _("\
567 -j --only-section <name> Only copy section <name> into the output\n\
568 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
569 -R --remove-section <name> Remove section <name> from the output\n\
570 --remove-relocations <name> Remove relocations from section <name>\n\
571 -S --strip-all Remove all symbol and relocation information\n\
572 -g --strip-debug Remove all debugging symbols & sections\n\
573 --strip-dwo Remove all DWO sections\n\
574 --strip-unneeded Remove all symbols not needed by relocations\n\
575 -N --strip-symbol <name> Do not copy symbol <name>\n\
576 --strip-unneeded-symbol <name>\n\
577 Do not copy symbol <name> unless needed by\n\
579 --only-keep-debug Strip everything but the debug information\n\
580 --extract-dwo Copy only DWO sections\n\
581 --extract-symbol Remove section contents but keep symbols\n\
582 -K --keep-symbol <name> Do not strip symbol <name>\n\
583 --keep-file-symbols Do not strip file symbol(s)\n\
584 --localize-hidden Turn all ELF hidden symbols into locals\n\
585 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
586 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
587 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
588 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
589 --weaken Force all global symbols to be marked as weak\n\
590 -w --wildcard Permit wildcard in symbol comparison\n\
591 -x --discard-all Remove all non-global symbols\n\
592 -X --discard-locals Remove any compiler-generated symbols\n\
593 -i --interleave[=<number>] Only copy N out of every <number> bytes\n\
594 --interleave-width <number> Set N for --interleave\n\
595 -b --byte <num> Select byte <num> in every interleaved block\n\
596 --gap-fill <val> Fill gaps between sections with <val>\n\
597 --pad-to <addr> Pad the last section up to address <addr>\n\
598 --set-start <addr> Set the start address to <addr>\n\
599 {--change-start|--adjust-start} <incr>\n\
600 Add <incr> to the start address\n\
601 {--change-addresses|--adjust-vma} <incr>\n\
602 Add <incr> to LMA, VMA and start addresses\n\
603 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
604 Change LMA and VMA of section <name> by <val>\n\
605 --change-section-lma <name>{=|+|-}<val>\n\
606 Change the LMA of section <name> by <val>\n\
607 --change-section-vma <name>{=|+|-}<val>\n\
608 Change the VMA of section <name> by <val>\n\
609 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
610 Warn if a named section does not exist\n\
611 --set-section-flags <name>=<flags>\n\
612 Set section <name>'s properties to <flags>\n\
613 --add-section <name>=<file> Add section <name> found in <file> to output\n\
614 --update-section <name>=<file>\n\
615 Update contents of section <name> with\n\
616 contents found in <file>\n\
617 --dump-section <name>=<file> Dump the contents of section <name> into <file>\n\
618 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
619 --long-section-names {enable|disable|keep}\n\
620 Handle long section names in Coff objects.\n\
621 --change-leading-char Force output format's leading character style\n\
622 --remove-leading-char Remove leading character from global symbols\n\
623 --reverse-bytes=<num> Reverse <num> bytes at a time, in output sections with content\n\
624 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
625 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
627 --srec-len <number> Restrict the length of generated Srecords\n\
628 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
629 --strip-symbols <file> -N for all symbols listed in <file>\n\
630 --strip-unneeded-symbols <file>\n\
631 --strip-unneeded-symbol for all symbols listed\n\
633 --keep-symbols <file> -K for all symbols listed in <file>\n\
634 --localize-symbols <file> -L for all symbols listed in <file>\n\
635 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
636 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
637 --weaken-symbols <file> -W for all symbols listed in <file>\n\
638 --add-symbol <name>=[<section>:]<value>[,<flags>] Add a symbol\n\
639 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
640 --writable-text Mark the output text as writable\n\
641 --readonly-text Make the output text write protected\n\
642 --pure Mark the output file as demand paged\n\
643 --impure Mark the output file as impure\n\
644 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
645 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
646 --prefix-alloc-sections <prefix>\n\
647 Add <prefix> to start of every allocatable\n\
649 --file-alignment <num> Set PE file alignment to <num>\n\
650 --heap <reserve>[,<commit>] Set PE reserve/commit heap to <reserve>/\n\
652 --image-base <address> Set PE image base to <address>\n\
653 --section-alignment <num> Set PE section alignment to <num>\n\
654 --stack <reserve>[,<commit>] Set PE reserve/commit stack to <reserve>/\n\
656 --subsystem <name>[:<version>]\n\
657 Set PE subsystem to <name> [& <version>]\n\
658 --compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi}]\n\
659 Compress DWARF debug sections using zlib\n\
660 --decompress-debug-sections Decompress DWARF debug sections using zlib\n\
661 --elf-stt-common=[yes|no] Generate ELF common symbols with STT_COMMON\n\
663 --verilog-data-width <number> Specifies data width, in bytes, for verilog output\n\
664 -M --merge-notes Remove redundant entries in note sections\n\
665 --no-merge-notes Do not attempt to remove redundant notes (default)\n\
666 -v --verbose List all object files modified\n\
667 @<file> Read options from <file>\n\
668 -V --version Display this program's version number\n\
669 -h --help Display this output\n\
670 --info List object formats & architectures supported\n\
672 list_supported_targets (program_name, stream);
673 if (REPORT_BUGS_TO[0] && exit_status == 0)
674 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
678 ATTRIBUTE_NORETURN static void
679 strip_usage (FILE *stream, int exit_status)
681 fprintf (stream, _("Usage: %s <option(s)> in-file(s)\n"), program_name);
682 fprintf (stream, _(" Removes symbols and sections from files\n"));
683 fprintf (stream, _(" The options are:\n"));
684 fprintf (stream, _("\
685 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
686 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
687 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
688 -p --preserve-dates Copy modified/access timestamps to the output\n\
690 if (DEFAULT_AR_DETERMINISTIC)
691 fprintf (stream, _("\
692 -D --enable-deterministic-archives\n\
693 Produce deterministic output when stripping archives (default)\n\
694 -U --disable-deterministic-archives\n\
695 Disable -D behavior\n"));
697 fprintf (stream, _("\
698 -D --enable-deterministic-archives\n\
699 Produce deterministic output when stripping archives\n\
700 -U --disable-deterministic-archives\n\
701 Disable -D behavior (default)\n"));
702 fprintf (stream, _("\
703 -R --remove-section=<name> Also remove section <name> from the output\n\
704 --remove-relocations <name> Remove relocations from section <name>\n\
705 -s --strip-all Remove all symbol and relocation information\n\
706 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
707 --strip-dwo Remove all DWO sections\n\
708 --strip-unneeded Remove all symbols not needed by relocations\n\
709 --only-keep-debug Strip everything but the debug information\n\
710 -M --merge-notes Remove redundant entries in note sections (default)\n\
711 --no-merge-notes Do not attempt to remove redundant notes\n\
712 -N --strip-symbol=<name> Do not copy symbol <name>\n\
713 -K --keep-symbol=<name> Do not strip symbol <name>\n\
714 --keep-file-symbols Do not strip file symbol(s)\n\
715 -w --wildcard Permit wildcard in symbol comparison\n\
716 -x --discard-all Remove all non-global symbols\n\
717 -X --discard-locals Remove any compiler-generated symbols\n\
718 -v --verbose List all object files modified\n\
719 -V --version Display this program's version number\n\
720 -h --help Display this output\n\
721 --info List object formats & architectures supported\n\
722 -o <file> Place stripped output into <file>\n\
725 list_supported_targets (program_name, stream);
726 if (REPORT_BUGS_TO[0] && exit_status == 0)
727 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
731 /* Parse section flags into a flagword, with a fatal error if the
732 string can't be parsed. */
735 parse_flags (const char *s)
745 snext = strchr (s, ',');
755 #define PARSE_FLAG(fname,fval) \
756 else if (strncasecmp (fname, s, len) == 0) ret |= fval
757 PARSE_FLAG ("alloc", SEC_ALLOC);
758 PARSE_FLAG ("load", SEC_LOAD);
759 PARSE_FLAG ("noload", SEC_NEVER_LOAD);
760 PARSE_FLAG ("readonly", SEC_READONLY);
761 PARSE_FLAG ("debug", SEC_DEBUGGING);
762 PARSE_FLAG ("code", SEC_CODE);
763 PARSE_FLAG ("data", SEC_DATA);
764 PARSE_FLAG ("rom", SEC_ROM);
765 PARSE_FLAG ("share", SEC_COFF_SHARED);
766 PARSE_FLAG ("contents", SEC_HAS_CONTENTS);
767 PARSE_FLAG ("merge", SEC_MERGE);
768 PARSE_FLAG ("strings", SEC_STRINGS);
774 copy = (char *) xmalloc (len + 1);
775 strncpy (copy, s, len);
777 non_fatal (_("unrecognized section flag `%s'"), copy);
778 fatal (_("supported flags: %s"),
779 "alloc, load, noload, readonly, debug, code, data, rom, share, contents, merge, strings");
789 /* Parse symbol flags into a flagword, with a fatal error if the
790 string can't be parsed. */
793 parse_symflags (const char *s, char **other)
803 snext = strchr (s, ',');
812 #define PARSE_FLAG(fname, fval) \
813 else if (len == sizeof fname - 1 \
814 && strncasecmp (fname, s, len) == 0) \
817 #define PARSE_OTHER(fname, fval) \
818 else if (len >= sizeof fname \
819 && strncasecmp (fname, s, sizeof fname - 1) == 0) \
820 fval = xstrndup (s + sizeof fname - 1, len - sizeof fname + 1)
823 PARSE_FLAG ("local", BSF_LOCAL);
824 PARSE_FLAG ("global", BSF_GLOBAL);
825 PARSE_FLAG ("export", BSF_EXPORT);
826 PARSE_FLAG ("debug", BSF_DEBUGGING);
827 PARSE_FLAG ("function", BSF_FUNCTION);
828 PARSE_FLAG ("weak", BSF_WEAK);
829 PARSE_FLAG ("section", BSF_SECTION_SYM);
830 PARSE_FLAG ("constructor", BSF_CONSTRUCTOR);
831 PARSE_FLAG ("warning", BSF_WARNING);
832 PARSE_FLAG ("indirect", BSF_INDIRECT);
833 PARSE_FLAG ("file", BSF_FILE);
834 PARSE_FLAG ("object", BSF_OBJECT);
835 PARSE_FLAG ("synthetic", BSF_SYNTHETIC);
836 PARSE_FLAG ("indirect-function", BSF_GNU_INDIRECT_FUNCTION | BSF_FUNCTION);
837 PARSE_FLAG ("unique-object", BSF_GNU_UNIQUE | BSF_OBJECT);
838 PARSE_OTHER ("before=", *other);
846 copy = (char *) xmalloc (len + 1);
847 strncpy (copy, s, len);
849 non_fatal (_("unrecognized symbol flag `%s'"), copy);
850 fatal (_("supported flags: %s"),
851 "local, global, export, debug, function, weak, section, "
852 "constructor, warning, indirect, file, object, synthetic, "
853 "indirect-function, unique-object, before=<othersym>");
863 /* Find and optionally add an entry in the change_sections list.
865 We need to be careful in how we match section names because of the support
866 for wildcard characters. For example suppose that the user has invoked
869 --set-section-flags .debug_*=debug
870 --set-section-flags .debug_str=readonly,debug
871 --change-section-address .debug_*ranges=0x1000
873 With the idea that all debug sections will receive the DEBUG flag, the
874 .debug_str section will also receive the READONLY flag and the
875 .debug_ranges and .debug_aranges sections will have their address set to
876 0x1000. (This may not make much sense, but it is just an example).
878 When adding the section name patterns to the section list we need to make
879 sure that previous entries do not match with the new entry, unless the
880 match is exact. (In which case we assume that the user is overriding
881 the previous entry with the new context).
883 When matching real section names to the section list we make use of the
884 wildcard characters, but we must do so in context. Eg if we are setting
885 section addresses then we match for .debug_ranges but not for .debug_info.
887 Finally, if ADD is false and we do find a match, we mark the section list
890 static struct section_list *
891 find_section_list (const char *name, bfd_boolean add, unsigned int context)
893 struct section_list *p, *match = NULL;
895 /* assert ((context & ((1 << 7) - 1)) != 0); */
897 for (p = change_sections; p != NULL; p = p->next)
901 if (strcmp (p->pattern, name) == 0)
903 /* Check for context conflicts. */
904 if (((p->context & SECTION_CONTEXT_REMOVE)
905 && (context & SECTION_CONTEXT_COPY))
906 || ((context & SECTION_CONTEXT_REMOVE)
907 && (p->context & SECTION_CONTEXT_COPY)))
908 fatal (_("error: %s both copied and removed"), name);
910 if (((p->context & SECTION_CONTEXT_SET_VMA)
911 && (context & SECTION_CONTEXT_ALTER_VMA))
912 || ((context & SECTION_CONTEXT_SET_VMA)
913 && (context & SECTION_CONTEXT_ALTER_VMA)))
914 fatal (_("error: %s both sets and alters VMA"), name);
916 if (((p->context & SECTION_CONTEXT_SET_LMA)
917 && (context & SECTION_CONTEXT_ALTER_LMA))
918 || ((context & SECTION_CONTEXT_SET_LMA)
919 && (context & SECTION_CONTEXT_ALTER_LMA)))
920 fatal (_("error: %s both sets and alters LMA"), name);
922 /* Extend the context. */
923 p->context |= context;
927 /* If we are not adding a new name/pattern then
928 only check for a match if the context applies. */
929 else if (p->context & context)
931 /* We could check for the presence of wildchar characters
932 first and choose between calling strcmp and fnmatch,
933 but is that really worth it ? */
934 if (p->pattern [0] == '!')
936 if (fnmatch (p->pattern + 1, name, 0) == 0)
944 if (fnmatch (p->pattern, name, 0) == 0)
960 p = (struct section_list *) xmalloc (sizeof (struct section_list));
963 p->context = context;
967 p->next = change_sections;
973 /* S1 is the entry node already in the table, S2 is the key node. */
976 eq_string_redefnode (const void *s1, const void *s2)
978 struct redefine_node *node1 = (struct redefine_node *) s1;
979 struct redefine_node *node2 = (struct redefine_node *) s2;
980 return !strcmp ((const char *) node1->source, (const char *) node2->source);
983 /* P is redefine node. Hash value is generated from its "source" filed. */
986 htab_hash_redefnode (const void *p)
988 struct redefine_node *redefnode = (struct redefine_node *) p;
989 return htab_hash_string (redefnode->source);
992 /* Create hashtab used for redefine node. */
995 create_symbol2redef_htab (void)
997 return htab_create_alloc (16, htab_hash_redefnode, eq_string_redefnode, NULL,
1001 /* There is htab_hash_string but no htab_eq_string. Makes sense. */
1004 eq_string (const void *s1, const void *s2)
1006 return strcmp ((const char *) s1, (const char *) s2) == 0;
1010 create_symbol_htab (void)
1012 return htab_create_alloc (16, htab_hash_string, eq_string, NULL, xcalloc, free);
1016 create_symbol_htabs (void)
1018 strip_specific_htab = create_symbol_htab ();
1019 strip_unneeded_htab = create_symbol_htab ();
1020 keep_specific_htab = create_symbol_htab ();
1021 localize_specific_htab = create_symbol_htab ();
1022 globalize_specific_htab = create_symbol_htab ();
1023 keepglobal_specific_htab = create_symbol_htab ();
1024 weaken_specific_htab = create_symbol_htab ();
1025 redefine_specific_htab = create_symbol2redef_htab ();
1026 /* As there is no bidirectional hash table in libiberty, need a reverse table
1027 to check duplicated target string. */
1028 redefine_specific_reverse_htab = create_symbol_htab ();
1031 /* Add a symbol to strip_specific_list. */
1034 add_specific_symbol (const char *name, htab_t htab)
1036 *htab_find_slot (htab, name, INSERT) = (char *) name;
1039 /* Like add_specific_symbol, but the element type is void *. */
1042 add_specific_symbol_node (const void *node, htab_t htab)
1044 *htab_find_slot (htab, node, INSERT) = (void *) node;
1047 /* Add symbols listed in `filename' to strip_specific_list. */
1049 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
1050 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
1053 add_specific_symbols (const char *filename, htab_t htab, char **buffer_p)
1059 unsigned int line_count;
1061 size = get_file_size (filename);
1068 buffer = (char *) xmalloc (size + 2);
1069 f = fopen (filename, FOPEN_RT);
1071 fatal (_("cannot open '%s': %s"), filename, strerror (errno));
1073 if (fread (buffer, 1, size, f) == 0 || ferror (f))
1074 fatal (_("%s: fread failed"), filename);
1077 buffer [size] = '\n';
1078 buffer [size + 1] = '\0';
1082 for (line = buffer; * line != '\0'; line ++)
1087 int finished = FALSE;
1089 for (eol = line;; eol ++)
1095 /* Cope with \n\r. */
1103 /* Cope with \r\n. */
1114 /* Line comment, Terminate the line here, in case a
1115 name is present and then allow the rest of the
1116 loop to find the real end of the line. */
1128 /* A name may now exist somewhere between 'line' and 'eol'.
1129 Strip off leading whitespace and trailing whitespace,
1130 then add it to the list. */
1131 for (name = line; IS_WHITESPACE (* name); name ++)
1133 for (name_end = name;
1134 (! IS_WHITESPACE (* name_end))
1135 && (! IS_LINE_TERMINATOR (* name_end));
1139 if (! IS_LINE_TERMINATOR (* name_end))
1143 for (extra = name_end + 1; IS_WHITESPACE (* extra); extra ++)
1146 if (! IS_LINE_TERMINATOR (* extra))
1147 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
1148 filename, line_count);
1153 if (name_end > name)
1154 add_specific_symbol (name, htab);
1156 /* Advance line pointer to end of line. The 'eol ++' in the for
1157 loop above will then advance us to the start of the next line. */
1162 /* Do not free the buffer. Parts of it will have been referenced
1163 in the calls to add_specific_symbol. */
1167 /* See whether a symbol should be stripped or kept
1168 based on strip_specific_list and keep_symbols. */
1171 is_specified_symbol_predicate (void **slot, void *data)
1173 struct is_specified_symbol_predicate_data *d =
1174 (struct is_specified_symbol_predicate_data *) data;
1175 const char *slot_name = (char *) *slot;
1177 if (*slot_name != '!')
1179 if (! fnmatch (slot_name, d->name, 0))
1182 /* Continue traversal, there might be a non-match rule. */
1188 if (! fnmatch (slot_name + 1, d->name, 0))
1191 /* Stop traversal. */
1196 /* Continue traversal. */
1201 is_specified_symbol (const char *name, htab_t htab)
1205 struct is_specified_symbol_predicate_data data;
1210 htab_traverse (htab, is_specified_symbol_predicate, &data);
1215 return htab_find (htab, name) != NULL;
1218 /* Return a pointer to the symbol used as a signature for GROUP. */
1221 group_signature (asection *group)
1223 bfd *abfd = group->owner;
1224 Elf_Internal_Shdr *ghdr;
1226 /* PR 20089: An earlier error may have prevented us from loading the symbol table. */
1230 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
1233 ghdr = &elf_section_data (group)->this_hdr;
1234 if (ghdr->sh_link == elf_onesymtab (abfd))
1236 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1237 Elf_Internal_Shdr *symhdr = &elf_symtab_hdr (abfd);
1239 if (ghdr->sh_info > 0
1240 && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym)
1241 return isympp[ghdr->sh_info - 1];
1246 /* Return TRUE if the section is a DWO section. */
1249 is_dwo_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1251 const char *name = bfd_get_section_name (abfd, sec);
1252 int len = strlen (name);
1254 return strncmp (name + len - 4, ".dwo", 4) == 0;
1257 /* Return TRUE if section SEC is in the update list. */
1260 is_update_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1262 if (update_sections != NULL)
1264 struct section_add *pupdate;
1266 for (pupdate = update_sections;
1268 pupdate = pupdate->next)
1270 if (strcmp (sec->name, pupdate->name) == 0)
1279 is_merged_note_section (bfd * abfd, asection * sec)
1282 && bfd_get_flavour (abfd) == bfd_target_elf_flavour
1283 && elf_section_data (sec)->this_hdr.sh_type == SHT_NOTE
1284 /* FIXME: We currently only support merging GNU_BUILD_NOTEs.
1285 We should add support for more note types. */
1286 && ((elf_section_data (sec)->this_hdr.sh_flags & SHF_GNU_BUILD_NOTE) != 0
1287 /* Old versions of GAS (prior to 2.27) could not set the section
1288 flags to OS-specific values, so we also accept sections with the
1290 || (strcmp (sec->name, GNU_BUILD_ATTRS_SECTION_NAME) == 0)))
1296 /* See if a non-group section is being removed. */
1299 is_strip_section_1 (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1301 if (sections_removed || sections_copied)
1303 struct section_list *p;
1304 struct section_list *q;
1306 p = find_section_list (bfd_get_section_name (abfd, sec), FALSE,
1307 SECTION_CONTEXT_REMOVE);
1308 q = find_section_list (bfd_get_section_name (abfd, sec), FALSE,
1309 SECTION_CONTEXT_COPY);
1312 fatal (_("error: section %s matches both remove and copy options"),
1313 bfd_get_section_name (abfd, sec));
1314 if (p && is_update_section (abfd, sec))
1315 fatal (_("error: section %s matches both update and remove options"),
1316 bfd_get_section_name (abfd, sec));
1320 if (sections_copied && q == NULL)
1324 if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
1326 if (strip_symbols == STRIP_DEBUG
1327 || strip_symbols == STRIP_UNNEEDED
1328 || strip_symbols == STRIP_ALL
1329 || discard_locals == LOCALS_ALL
1330 || convert_debugging)
1332 /* By default we don't want to strip .reloc section.
1333 This section has for pe-coff special meaning. See
1334 pe-dll.c file in ld, and peXXigen.c in bfd for details. */
1335 if (strcmp (bfd_get_section_name (abfd, sec), ".reloc") != 0)
1339 if (strip_symbols == STRIP_DWO)
1340 return is_dwo_section (abfd, sec);
1342 if (strip_symbols == STRIP_NONDEBUG)
1346 if (strip_symbols == STRIP_NONDWO)
1347 return !is_dwo_section (abfd, sec);
1352 /* See if a section is being removed. */
1355 is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1357 if (is_strip_section_1 (abfd, sec))
1360 if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0)
1364 asection *elt, *first;
1366 gsym = group_signature (sec);
1367 /* Strip groups without a valid signature. */
1372 If we are going to strip the group signature symbol, then
1373 strip the group section too. */
1375 if ((strip_symbols == STRIP_ALL
1376 && !is_specified_symbol (gname, keep_specific_htab))
1377 || is_specified_symbol (gname, strip_specific_htab))
1380 /* Remove the group section if all members are removed. */
1381 first = elt = elf_next_in_group (sec);
1384 if (!is_strip_section_1 (abfd, elt))
1386 elt = elf_next_in_group (elt);
1398 is_nondebug_keep_contents_section (bfd *ibfd, asection *isection)
1400 /* Always keep ELF note sections. */
1401 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
1402 return (elf_section_type (isection) == SHT_NOTE);
1404 /* Always keep the .buildid section for PE/COFF.
1406 Strictly, this should be written "always keep the section storing the debug
1407 directory", but that may be the .text section for objects produced by some
1408 tools, which it is not sensible to keep. */
1409 if (ibfd->xvec->flavour == bfd_target_coff_flavour)
1410 return (strcmp (bfd_get_section_name (ibfd, isection), ".buildid") == 0);
1415 /* Return true if SYM is a hidden symbol. */
1418 is_hidden_symbol (asymbol *sym)
1420 elf_symbol_type *elf_sym;
1422 elf_sym = elf_symbol_from (sym->the_bfd, sym);
1423 if (elf_sym != NULL)
1424 switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
1434 need_sym_before (struct addsym_node **node, const char *sym)
1437 struct addsym_node *ptr = add_sym_list;
1439 /* 'othersym' symbols are at the front of the list. */
1440 for (count = 0; count < add_symbols; count++)
1444 else if (strcmp (ptr->othersym, sym) == 0)
1446 free (ptr->othersym);
1447 ptr->othersym = ""; /* Empty name is hopefully never a valid symbol name. */
1457 create_new_symbol (struct addsym_node *ptr, bfd *obfd)
1459 asymbol *sym = bfd_make_empty_symbol (obfd);
1461 bfd_asymbol_name (sym) = ptr->symdef;
1462 sym->value = ptr->symval;
1463 sym->flags = ptr->flags;
1466 asection *sec = bfd_get_section_by_name (obfd, ptr->section);
1468 fatal (_("Section %s not found"), ptr->section);
1472 sym->section = bfd_abs_section_ptr;
1476 /* Choose which symbol entries to copy; put the result in OSYMS.
1477 We don't copy in place, because that confuses the relocs.
1478 Return the number of symbols to print. */
1481 filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
1482 asymbol **isyms, long symcount)
1484 asymbol **from = isyms, **to = osyms;
1485 long src_count = 0, dst_count = 0;
1486 int relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
1488 for (; src_count < symcount; src_count++)
1490 asymbol *sym = from[src_count];
1491 flagword flags = sym->flags;
1492 char *name = (char *) bfd_asymbol_name (sym);
1494 bfd_boolean used_in_reloc = FALSE;
1495 bfd_boolean undefined;
1496 bfd_boolean rem_leading_char;
1497 bfd_boolean add_leading_char;
1499 undefined = bfd_is_und_section (bfd_get_section (sym));
1503 struct addsym_node *ptr;
1505 if (need_sym_before (&ptr, name))
1506 to[dst_count++] = create_new_symbol (ptr, obfd);
1509 if (htab_elements (redefine_specific_htab) || section_rename_list)
1513 new_name = (char *) lookup_sym_redefinition (name);
1514 if (new_name == name
1515 && (flags & BSF_SECTION_SYM) != 0)
1516 new_name = (char *) find_section_rename (name, NULL);
1517 bfd_asymbol_name (sym) = new_name;
1521 /* Check if we will remove the current leading character. */
1523 (name[0] == bfd_get_symbol_leading_char (abfd))
1524 && (change_leading_char
1525 || (remove_leading_char
1526 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1528 || bfd_is_com_section (bfd_get_section (sym)))));
1530 /* Check if we will add a new leading character. */
1533 && (bfd_get_symbol_leading_char (obfd) != '\0')
1534 && (bfd_get_symbol_leading_char (abfd) == '\0'
1535 || (name[0] == bfd_get_symbol_leading_char (abfd)));
1537 /* Short circuit for change_leading_char if we can do it in-place. */
1538 if (rem_leading_char && add_leading_char && !prefix_symbols_string)
1540 name[0] = bfd_get_symbol_leading_char (obfd);
1541 bfd_asymbol_name (sym) = name;
1542 rem_leading_char = FALSE;
1543 add_leading_char = FALSE;
1546 /* Remove leading char. */
1547 if (rem_leading_char)
1548 bfd_asymbol_name (sym) = ++name;
1550 /* Add new leading char and/or prefix. */
1551 if (add_leading_char || prefix_symbols_string)
1555 ptr = n = (char *) xmalloc (1 + strlen (prefix_symbols_string)
1556 + strlen (name) + 1);
1557 if (add_leading_char)
1558 *ptr++ = bfd_get_symbol_leading_char (obfd);
1560 if (prefix_symbols_string)
1562 strcpy (ptr, prefix_symbols_string);
1563 ptr += strlen (prefix_symbols_string);
1567 bfd_asymbol_name (sym) = n;
1571 if (strip_symbols == STRIP_ALL)
1573 else if ((flags & BSF_KEEP) != 0 /* Used in relocation. */
1574 || ((flags & BSF_SECTION_SYM) != 0
1575 && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
1579 used_in_reloc = TRUE;
1581 else if (relocatable /* Relocatable file. */
1582 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1583 || bfd_is_com_section (bfd_get_section (sym))))
1585 else if (bfd_decode_symclass (sym) == 'I')
1586 /* Global symbols in $idata sections need to be retained
1587 even if relocatable is FALSE. External users of the
1588 library containing the $idata section may reference these
1591 else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */
1592 || (flags & BSF_WEAK) != 0
1594 || bfd_is_com_section (bfd_get_section (sym)))
1595 keep = strip_symbols != STRIP_UNNEEDED;
1596 else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */
1597 keep = (strip_symbols != STRIP_DEBUG
1598 && strip_symbols != STRIP_UNNEEDED
1599 && ! convert_debugging);
1600 else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym)))
1601 /* COMDAT sections store special information in local
1602 symbols, so we cannot risk stripping any of them. */
1604 else /* Local symbol. */
1605 keep = (strip_symbols != STRIP_UNNEEDED
1606 && (discard_locals != LOCALS_ALL
1607 && (discard_locals != LOCALS_START_L
1608 || ! bfd_is_local_label (abfd, sym))));
1610 if (keep && is_specified_symbol (name, strip_specific_htab))
1612 /* There are multiple ways to set 'keep' above, but if it
1613 was the relocatable symbol case, then that's an error. */
1616 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name);
1624 && !(flags & BSF_KEEP)
1625 && is_specified_symbol (name, strip_unneeded_htab))
1629 && ((keep_file_symbols && (flags & BSF_FILE))
1630 || is_specified_symbol (name, keep_specific_htab)))
1633 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
1638 if ((flags & BSF_GLOBAL) != 0
1639 && (weaken || is_specified_symbol (name, weaken_specific_htab)))
1641 sym->flags &= ~ BSF_GLOBAL;
1642 sym->flags |= BSF_WEAK;
1646 && (flags & (BSF_GLOBAL | BSF_WEAK))
1647 && (is_specified_symbol (name, localize_specific_htab)
1648 || (htab_elements (keepglobal_specific_htab) != 0
1649 && ! is_specified_symbol (name, keepglobal_specific_htab))
1650 || (localize_hidden && is_hidden_symbol (sym))))
1652 sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
1653 sym->flags |= BSF_LOCAL;
1657 && (flags & BSF_LOCAL)
1658 && is_specified_symbol (name, globalize_specific_htab))
1660 sym->flags &= ~ BSF_LOCAL;
1661 sym->flags |= BSF_GLOBAL;
1664 to[dst_count++] = sym;
1669 struct addsym_node *ptr = add_sym_list;
1671 for (src_count = 0; src_count < add_symbols; src_count++)
1675 if (strcmp (ptr->othersym, ""))
1676 fatal (_("'before=%s' not found"), ptr->othersym);
1679 to[dst_count++] = create_new_symbol (ptr, obfd);
1685 to[dst_count] = NULL;
1690 /* Find the redefined name of symbol SOURCE. */
1693 lookup_sym_redefinition (const char *source)
1695 struct redefine_node key_node = {(char *) source, NULL};
1696 struct redefine_node *redef_node
1697 = (struct redefine_node *) htab_find (redefine_specific_htab, &key_node);
1699 return redef_node == NULL ? source : redef_node->target;
1702 /* Insert a node into symbol redefine hash tabel. */
1705 add_redefine_and_check (const char *cause, const char *source,
1708 struct redefine_node *new_node
1709 = (struct redefine_node *) xmalloc (sizeof (struct redefine_node));
1711 new_node->source = strdup (source);
1712 new_node->target = strdup (target);
1714 if (htab_find (redefine_specific_htab, new_node) != HTAB_EMPTY_ENTRY)
1715 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1718 if (htab_find (redefine_specific_reverse_htab, target) != HTAB_EMPTY_ENTRY)
1719 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1722 /* Insert the NEW_NODE into hash table for quick search. */
1723 add_specific_symbol_node (new_node, redefine_specific_htab);
1725 /* Insert the target string into the reverse hash table, this is needed for
1726 duplicated target string check. */
1727 add_specific_symbol (new_node->target, redefine_specific_reverse_htab);
1731 /* Handle the --redefine-syms option. Read lines containing "old new"
1732 from the file, and add them to the symbol redefine list. */
1735 add_redefine_syms_file (const char *filename)
1744 file = fopen (filename, "r");
1746 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1747 filename, strerror (errno));
1750 buf = (char *) xmalloc (bufsize + 1 /* For the terminating NUL. */);
1758 /* Collect the input symbol name. */
1759 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1767 buf = (char *) xrealloc (buf, bufsize + 1);
1775 /* Eat white space between the symbol names. */
1776 while (IS_WHITESPACE (c))
1778 if (c == '#' || IS_LINE_TERMINATOR (c))
1783 /* Collect the output symbol name. */
1785 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1793 buf = (char *) xrealloc (buf, bufsize + 1);
1801 /* Eat white space at end of line. */
1802 while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c))
1807 if ((c == '\r' && (c = getc (file)) == '\n')
1808 || c == '\n' || c == EOF)
1811 /* Append the redefinition to the list. */
1813 add_redefine_and_check (filename, &buf[0], &buf[outsym_off]);
1824 fatal (_("%s:%d: garbage found at end of line"), filename, lineno);
1826 if (len != 0 && (outsym_off == 0 || outsym_off == len))
1827 fatal (_("%s:%d: missing new symbol name"), filename, lineno);
1830 /* Eat the rest of the line and finish it. */
1831 while (c != '\n' && c != EOF)
1837 fatal (_("%s:%d: premature end of file"), filename, lineno);
1843 /* Copy unknown object file IBFD onto OBFD.
1844 Returns TRUE upon success, FALSE otherwise. */
1847 copy_unknown_object (bfd *ibfd, bfd *obfd)
1855 if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1857 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1864 non_fatal (_("stat returns negative size for `%s'"),
1865 bfd_get_archive_filename (ibfd));
1869 if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1871 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1876 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1877 bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1879 cbuf = (char *) xmalloc (BUFSIZE);
1881 while (ncopied < size)
1883 tocopy = size - ncopied;
1884 if (tocopy > BUFSIZE)
1887 if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1888 != (bfd_size_type) tocopy)
1890 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1895 if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1896 != (bfd_size_type) tocopy)
1898 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1906 /* We should at least to be able to read it back when copying an
1907 unknown object in an archive. */
1908 chmod (bfd_get_filename (obfd), buf.st_mode | S_IRUSR);
1913 /* Returns the number of bytes needed to store VAL. */
1915 static inline unsigned int
1916 num_bytes (unsigned long val)
1918 unsigned int count = 0;
1920 /* FIXME: There must be a faster way to do this. */
1929 typedef struct objcopy_internal_note
1931 Elf_Internal_Note note;
1934 bfd_boolean modified;
1935 } objcopy_internal_note;
1937 /* Returns TRUE if a gap does, or could, exist between the address range
1938 covered by PNOTE1 and PNOTE2. */
1941 gap_exists (objcopy_internal_note * pnote1,
1942 objcopy_internal_note * pnote2)
1944 /* Without range end notes, we assume that a gap might exist. */
1945 if (pnote1->end == 0 || pnote2->end == 0)
1948 /* FIXME: Alignment of 16 bytes taken from x86_64 binaries.
1949 Really we should extract the alignment of the section covered by the notes. */
1950 return BFD_ALIGN (pnote1->end, 16) < pnote2->start;
1954 is_open_note (objcopy_internal_note * pnote)
1956 return (pnote->note.type == NT_GNU_BUILD_ATTRIBUTE_OPEN);
1960 is_func_note (objcopy_internal_note * pnote)
1962 return (pnote->note.type == NT_GNU_BUILD_ATTRIBUTE_FUNC);
1966 is_64bit (bfd * abfd)
1968 /* Should never happen, but let's be paranoid. */
1969 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
1972 return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64;
1975 /* Merge the notes on SEC, removing redundant entries.
1976 Returns the new, smaller size of the section upon success. */
1978 static bfd_size_type
1979 merge_gnu_build_notes (bfd * abfd, asection * sec, bfd_size_type size, bfd_byte * contents)
1981 objcopy_internal_note * pnotes_end;
1982 objcopy_internal_note * pnotes = NULL;
1983 objcopy_internal_note * pnote;
1984 bfd_size_type remain = size;
1985 unsigned version_1_seen = 0;
1986 unsigned version_2_seen = 0;
1987 unsigned version_3_seen = 0;
1988 bfd_boolean duplicate_found = FALSE;
1989 const char * err = NULL;
1990 bfd_byte * in = contents;
1991 int attribute_type_byte;
1993 unsigned long previous_func_start = 0;
1994 unsigned long previous_open_start = 0;
1995 unsigned long previous_func_end = 0;
1996 unsigned long previous_open_end = 0;
2000 relsize = bfd_get_reloc_upper_bound (abfd, sec);
2006 /* If there are relocs associated with this section then we
2007 cannot safely merge it. */
2008 relpp = (arelent **) xmalloc (relsize);
2009 relcount = bfd_canonicalize_reloc (abfd, sec, relpp, isympp);
2015 /* Make a copy of the notes and convert to our internal format.
2016 Minimum size of a note is 12 bytes. */
2017 pnote = pnotes = (objcopy_internal_note *) xcalloc ((size / 12), sizeof (* pnote));
2018 while (remain >= 12)
2022 pnote->note.namesz = (bfd_get_32 (abfd, in ) + 3) & ~3;
2023 pnote->note.descsz = (bfd_get_32 (abfd, in + 4) + 3) & ~3;
2024 pnote->note.type = bfd_get_32 (abfd, in + 8);
2026 if (pnote->note.type != NT_GNU_BUILD_ATTRIBUTE_OPEN
2027 && pnote->note.type != NT_GNU_BUILD_ATTRIBUTE_FUNC)
2029 err = _("corrupt GNU build attribute note: wrong note type");
2033 if (pnote->note.namesz + pnote->note.descsz + 12 > remain)
2035 err = _("corrupt GNU build attribute note: note too big");
2039 if (pnote->note.namesz < 2)
2041 err = _("corrupt GNU build attribute note: name too small");
2045 pnote->note.namedata = (char *)(in + 12);
2046 pnote->note.descdata = (char *)(in + 12 + pnote->note.namesz);
2048 remain -= 12 + pnote->note.namesz + pnote->note.descsz;
2049 in += 12 + pnote->note.namesz + pnote->note.descsz;
2051 if (pnote->note.namesz > 2
2052 && pnote->note.namedata[0] == '$'
2053 && pnote->note.namedata[1] == GNU_BUILD_ATTRIBUTE_VERSION
2054 && pnote->note.namedata[2] == '1')
2056 else if (pnote->note.namesz > 4
2057 && pnote->note.namedata[0] == 'G'
2058 && pnote->note.namedata[1] == 'A'
2059 && pnote->note.namedata[2] == '$'
2060 && pnote->note.namedata[3] == GNU_BUILD_ATTRIBUTE_VERSION)
2062 if (pnote->note.namedata[4] == '2')
2064 else if (pnote->note.namedata[4] == '3')
2068 err = _("corrupt GNU build attribute note: unsupported version");
2073 switch (pnote->note.descsz)
2080 start = bfd_get_32 (abfd, pnote->note.descdata);
2081 /* FIXME: For version 1 and 2 notes we should try to
2082 calculate the end address by finding a symbol whose
2083 value is START, and then adding in its size.
2085 For now though, since v1 and v2 was not intended to
2086 handle gaps, we chose an artificially large end
2092 if (! is_64bit (abfd))
2094 start = bfd_get_32 (abfd, pnote->note.descdata);
2095 end = bfd_get_32 (abfd, pnote->note.descdata + 4);
2099 start = bfd_get_64 (abfd, pnote->note.descdata);
2100 /* FIXME: For version 1 and 2 notes we should try to
2101 calculate the end address by finding a symbol whose
2102 value is START, and then adding in its size.
2104 For now though, since v1 and v2 was not intended to
2105 handle gaps, we chose an artificially large end
2112 start = bfd_get_64 (abfd, pnote->note.descdata);
2113 end = bfd_get_64 (abfd, pnote->note.descdata + 8);
2117 err = _("corrupt GNU build attribute note: bad description size");
2121 if (is_open_note (pnote))
2124 previous_open_start = start;
2126 pnote->start = previous_open_start;
2129 previous_open_end = end;
2131 pnote->end = previous_open_end;
2136 previous_func_start = start;
2138 pnote->start = previous_func_start;
2141 previous_func_end = end;
2143 pnote->end = previous_func_end;
2146 if (pnote->note.namedata[pnote->note.namesz - 1] != 0)
2148 err = _("corrupt GNU build attribute note: name not NUL terminated");
2157 /* Check that the notes are valid. */
2160 err = _("corrupt GNU build attribute notes: excess data at end");
2164 if (version_1_seen == 0 && version_2_seen == 0 && version_3_seen == 0)
2166 err = _("bad GNU build attribute notes: no known versions detected");
2170 if ((version_1_seen > 0 && version_2_seen > 0)
2171 || (version_1_seen > 0 && version_3_seen > 0)
2172 || (version_2_seen > 0 && version_3_seen > 0))
2174 err = _("bad GNU build attribute notes: multiple different versions");
2178 /* Merging is only needed if there is more than one version note... */
2179 if (version_1_seen == 1 || version_2_seen == 1 || version_3_seen == 1)
2182 attribute_type_byte = version_1_seen ? 1 : 3;
2183 val_start = attribute_type_byte + 1;
2185 /* The first note should be the first version note. */
2186 if (pnotes[0].note.namedata[attribute_type_byte] != GNU_BUILD_ATTRIBUTE_VERSION)
2188 err = _("bad GNU build attribute notes: first note not version note");
2192 /* Now merge the notes. The rules are:
2193 1. Preserve the ordering of the notes.
2194 2. Preserve any NT_GNU_BUILD_ATTRIBUTE_FUNC notes.
2195 3. Eliminate any NT_GNU_BUILD_ATTRIBUTE_OPEN notes that have the same
2196 full name field as the immediately preceeding note with the same type
2197 of name and whose address ranges coincide.
2198 IE - if there are gaps in the coverage of the notes, then these gaps
2200 4. Combine the numeric value of any NT_GNU_BUILD_ATTRIBUTE_OPEN notes
2201 of type GNU_BUILD_ATTRIBUTE_STACK_SIZE.
2202 5. If an NT_GNU_BUILD_ATTRIBUTE_OPEN note is going to be preserved and
2203 its description field is empty then the nearest preceeding OPEN note
2204 with a non-empty description field must also be preserved *OR* the
2205 description field of the note must be changed to contain the starting
2206 address to which it refers.
2207 6. Notes with the same start and end address can be deleted. */
2208 for (pnote = pnotes + 1; pnote < pnotes_end; pnote ++)
2211 objcopy_internal_note * back;
2212 objcopy_internal_note * prev_open_with_range = NULL;
2214 /* Rule 6 - delete 0-range notes. */
2215 if (pnote->start == pnote->end)
2217 duplicate_found = TRUE;
2218 pnote->note.type = 0;
2222 /* Rule 2 - preserve function notes. */
2223 if (! is_open_note (pnote))
2227 /* Check to see if there is an identical previous function note.
2228 This can happen with overlays for example. */
2229 for (iter = 0, back = pnote -1; back >= pnotes; back --)
2231 if (back->start == pnote->start
2232 && back->end == pnote->end
2233 && back->note.namesz == pnote->note.namesz
2234 && memcmp (back->note.namedata, pnote->note.namedata, pnote->note.namesz) == 0)
2236 fprintf (stderr, "DUP FUNXC\n");
2237 duplicate_found = TRUE;
2238 pnote->note.type = 0;
2242 /* Don't scan too far back however. */
2249 note_type = pnote->note.namedata[attribute_type_byte];
2251 /* Scan backwards from pnote, looking for duplicates.
2252 Clear the type field of any found - but do not delete them just yet. */
2253 for (back = pnote - 1; back >= pnotes; back --)
2255 int back_type = back->note.namedata[attribute_type_byte];
2257 /* If this is the first open note with an address
2258 range that we have encountered then record it. */
2259 if (prev_open_with_range == NULL
2260 && back->note.descsz > 0
2261 && ! is_func_note (back))
2262 prev_open_with_range = back;
2264 if (! is_open_note (back))
2267 /* If the two notes are different then keep on searching. */
2268 if (back_type != note_type)
2271 /* Rule 4 - combine stack size notes. */
2272 if (back_type == GNU_BUILD_ATTRIBUTE_STACK_SIZE)
2274 unsigned char * name;
2275 unsigned long note_val;
2276 unsigned long back_val;
2281 for (shift = 0, note_val = 0,
2282 bytes = pnote->note.namesz - val_start,
2283 name = (unsigned char *) pnote->note.namedata + val_start;
2286 byte = (* name ++) & 0xff;
2287 note_val |= byte << shift;
2291 for (shift = 0, back_val = 0,
2292 bytes = back->note.namesz - val_start,
2293 name = (unsigned char *) back->note.namedata + val_start;
2296 byte = (* name ++) & 0xff;
2297 back_val |= byte << shift;
2301 back_val += note_val;
2302 if (num_bytes (back_val) >= back->note.namesz - val_start)
2304 /* We have a problem - the new value requires more bytes of
2305 storage in the name field than are available. Currently
2306 we have no way of fixing this, so we just preserve both
2311 /* Write the new val into back. */
2312 name = (unsigned char *) back->note.namedata + val_start;
2313 while (name < (unsigned char *) back->note.namedata
2314 + back->note.namesz)
2316 byte = back_val & 0xff;
2323 duplicate_found = TRUE;
2324 pnote->note.type = 0;
2328 /* Rule 3 - combine identical open notes. */
2329 if (back->note.namesz == pnote->note.namesz
2330 && memcmp (back->note.namedata,
2331 pnote->note.namedata, back->note.namesz) == 0
2332 && ! gap_exists (back, pnote))
2334 duplicate_found = TRUE;
2335 pnote->note.type = 0;
2337 if (pnote->end > back->end)
2338 back->end = pnote->end;
2341 back->modified = TRUE;
2345 /* Rule 5 - Since we are keeping this note we must check to see
2346 if its description refers back to an earlier OPEN version
2347 note that has been scheduled for deletion. If so then we
2348 must make sure that version note is also preserved. */
2351 /* As of version 3 we can just
2352 move the range into the note. */
2353 pnote->modified = TRUE;
2354 pnote->note.type = NT_GNU_BUILD_ATTRIBUTE_FUNC;
2355 back->modified = TRUE;
2356 back->note.type = NT_GNU_BUILD_ATTRIBUTE_FUNC;
2360 if (pnote->note.descsz == 0
2361 && prev_open_with_range != NULL
2362 && prev_open_with_range->note.type == 0)
2363 prev_open_with_range->note.type = NT_GNU_BUILD_ATTRIBUTE_OPEN;
2366 /* We have found a similar attribute but the details do not match.
2367 Stop searching backwards. */
2372 if (duplicate_found)
2374 bfd_byte * new_contents;
2377 bfd_size_type new_size;
2378 bfd_vma prev_start = 0;
2379 bfd_vma prev_end = 0;
2381 /* Eliminate the duplicates. */
2382 new = new_contents = xmalloc (size);
2383 for (pnote = pnotes, old = contents;
2387 bfd_size_type note_size = 12 + pnote->note.namesz + pnote->note.descsz;
2389 if (pnote->note.type != 0)
2391 if (pnote->modified)
2393 /* If the note has been modified then we must copy it by
2394 hand, potentially adding in a new description field. */
2395 if (pnote->start == prev_start && pnote->end == prev_end)
2397 bfd_put_32 (abfd, pnote->note.namesz, new);
2398 bfd_put_32 (abfd, 0, new + 4);
2399 bfd_put_32 (abfd, pnote->note.type, new + 8);
2401 memcpy (new, pnote->note.namedata, pnote->note.namesz);
2402 new += pnote->note.namesz;
2406 bfd_put_32 (abfd, pnote->note.namesz, new);
2407 bfd_put_32 (abfd, is_64bit (abfd) ? 16 : 8, new + 4);
2408 bfd_put_32 (abfd, pnote->note.type, new + 8);
2410 memcpy (new, pnote->note.namedata, pnote->note.namesz);
2411 new += pnote->note.namesz;
2412 if (is_64bit (abfd))
2414 bfd_put_64 (abfd, pnote->start, new);
2415 bfd_put_64 (abfd, pnote->end, new + 8);
2420 bfd_put_32 (abfd, pnote->start, new);
2421 bfd_put_32 (abfd, pnote->end, new + 4);
2428 memcpy (new, old, note_size);
2431 prev_start = pnote->start;
2432 prev_end = pnote->end;
2438 new_size = new - new_contents;
2439 memcpy (contents, new_contents, new_size);
2441 free (new_contents);
2447 bfd_set_error (bfd_error_bad_value);
2448 bfd_nonfatal_message (NULL, abfd, sec, err);
2456 /* Copy object file IBFD onto OBFD.
2457 Returns TRUE upon success, FALSE otherwise. */
2460 copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
2464 asection **osections = NULL;
2466 asection *gnu_debuglink_section = NULL;
2467 bfd_size_type *gaps = NULL;
2468 bfd_size_type max_gap = 0;
2471 enum bfd_architecture iarch;
2475 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
2476 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
2477 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2479 /* PR 17636: Call non-fatal so that we return to our parent who
2480 may need to tidy temporary files. */
2481 non_fatal (_("Unable to change endianness of input file(s)"));
2485 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2487 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
2491 if (ibfd->sections == NULL)
2493 non_fatal (_("error: the input file '%s' has no sections"),
2494 bfd_get_archive_filename (ibfd));
2498 if (ibfd->xvec->flavour != bfd_target_elf_flavour)
2500 if ((do_debug_sections & compress) != 0
2501 && do_debug_sections != compress)
2503 non_fatal (_("--compress-debug-sections=[zlib|zlib-gnu|zlib-gabi] is unsupported on `%s'"),
2504 bfd_get_archive_filename (ibfd));
2508 if (do_elf_stt_common)
2510 non_fatal (_("--elf-stt-common=[yes|no] is unsupported on `%s'"),
2511 bfd_get_archive_filename (ibfd));
2517 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
2518 bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
2519 bfd_get_filename (obfd), bfd_get_target (obfd));
2528 start = bfd_get_start_address (ibfd);
2529 start += change_start;
2532 /* Neither the start address nor the flags
2533 need to be set for a core file. */
2534 if (bfd_get_format (obfd) != bfd_core)
2538 flags = bfd_get_file_flags (ibfd);
2539 flags |= bfd_flags_to_set;
2540 flags &= ~bfd_flags_to_clear;
2541 flags &= bfd_applicable_file_flags (obfd);
2543 if (strip_symbols == STRIP_ALL)
2544 flags &= ~HAS_RELOC;
2546 if (!bfd_set_start_address (obfd, start)
2547 || !bfd_set_file_flags (obfd, flags))
2549 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2554 /* Copy architecture of input file to output file. */
2555 iarch = bfd_get_arch (ibfd);
2556 imach = bfd_get_mach (ibfd);
2559 if (bfd_get_arch_info (ibfd) == NULL
2560 || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown)
2562 iarch = input_arch->arch;
2563 imach = input_arch->mach;
2566 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
2567 bfd_get_archive_filename (ibfd));
2569 if (!bfd_set_arch_mach (obfd, iarch, imach)
2570 && (ibfd->target_defaulted
2571 || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
2573 if (bfd_get_arch (ibfd) == bfd_arch_unknown)
2574 non_fatal (_("Unable to recognise the format of the input file `%s'"),
2575 bfd_get_archive_filename (ibfd));
2577 non_fatal (_("Output file cannot represent architecture `%s'"),
2578 bfd_printable_arch_mach (bfd_get_arch (ibfd),
2579 bfd_get_mach (ibfd)));
2583 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2585 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2589 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2590 && bfd_pei_p (obfd))
2592 /* Set up PE parameters. */
2593 pe_data_type *pe = pe_data (obfd);
2595 /* Copy PE parameters before changing them. */
2596 if (ibfd->xvec->flavour == bfd_target_coff_flavour
2597 && bfd_pei_p (ibfd))
2598 pe->pe_opthdr = pe_data (ibfd)->pe_opthdr;
2600 if (pe_file_alignment != (bfd_vma) -1)
2601 pe->pe_opthdr.FileAlignment = pe_file_alignment;
2603 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
2605 if (pe_heap_commit != (bfd_vma) -1)
2606 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_commit;
2608 if (pe_heap_reserve != (bfd_vma) -1)
2609 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_reserve;
2611 if (pe_image_base != (bfd_vma) -1)
2612 pe->pe_opthdr.ImageBase = pe_image_base;
2614 if (pe_section_alignment != (bfd_vma) -1)
2615 pe->pe_opthdr.SectionAlignment = pe_section_alignment;
2617 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
2619 if (pe_stack_commit != (bfd_vma) -1)
2620 pe->pe_opthdr.SizeOfStackCommit = pe_stack_commit;
2622 if (pe_stack_reserve != (bfd_vma) -1)
2623 pe->pe_opthdr.SizeOfStackCommit = pe_stack_reserve;
2625 if (pe_subsystem != -1)
2626 pe->pe_opthdr.Subsystem = pe_subsystem;
2628 if (pe_major_subsystem_version != -1)
2629 pe->pe_opthdr.MajorSubsystemVersion = pe_major_subsystem_version;
2631 if (pe_minor_subsystem_version != -1)
2632 pe->pe_opthdr.MinorSubsystemVersion = pe_minor_subsystem_version;
2634 if (pe_file_alignment > pe_section_alignment)
2636 char file_alignment[20], section_alignment[20];
2638 sprintf_vma (file_alignment, pe_file_alignment);
2639 sprintf_vma (section_alignment, pe_section_alignment);
2640 non_fatal (_("warning: file alignment (0x%s) > section alignment (0x%s)"),
2642 file_alignment, section_alignment);
2649 if (osympp != isympp)
2655 symsize = bfd_get_symtab_upper_bound (ibfd);
2658 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2662 osympp = isympp = (asymbol **) xmalloc (symsize);
2663 symcount = bfd_canonicalize_symtab (ibfd, isympp);
2666 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2669 /* PR 17512: file: d6323821
2670 If the symbol table could not be loaded do not pretend that we have
2671 any symbols. This trips us up later on when we load the relocs. */
2675 osympp = isympp = NULL;
2678 /* BFD mandates that all output sections be created and sizes set before
2679 any output is done. Thus, we traverse all sections multiple times. */
2680 bfd_map_over_sections (ibfd, setup_section, obfd);
2682 if (!extract_symbol)
2683 setup_bfd_headers (ibfd, obfd);
2685 if (add_sections != NULL)
2687 struct section_add *padd;
2688 struct section_list *pset;
2690 for (padd = add_sections; padd != NULL; padd = padd->next)
2694 pset = find_section_list (padd->name, FALSE,
2695 SECTION_CONTEXT_SET_FLAGS);
2697 flags = pset->flags | SEC_HAS_CONTENTS;
2699 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
2701 /* bfd_make_section_with_flags() does not return very helpful
2702 error codes, so check for the most likely user error first. */
2703 if (bfd_get_section_by_name (obfd, padd->name))
2705 bfd_nonfatal_message (NULL, obfd, NULL,
2706 _("can't add section '%s'"), padd->name);
2711 /* We use LINKER_CREATED here so that the backend hooks
2712 will create any special section type information,
2713 instead of presuming we know what we're doing merely
2714 because we set the flags. */
2715 padd->section = bfd_make_section_with_flags
2716 (obfd, padd->name, flags | SEC_LINKER_CREATED);
2717 if (padd->section == NULL)
2719 bfd_nonfatal_message (NULL, obfd, NULL,
2720 _("can't create section `%s'"),
2726 if (! bfd_set_section_size (obfd, padd->section, padd->size))
2728 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2732 pset = find_section_list (padd->name, FALSE,
2733 SECTION_CONTEXT_SET_VMA | SECTION_CONTEXT_ALTER_VMA);
2735 && ! bfd_set_section_vma (obfd, padd->section, pset->vma_val))
2737 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2741 pset = find_section_list (padd->name, FALSE,
2742 SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_ALTER_LMA);
2745 padd->section->lma = pset->lma_val;
2747 if (! bfd_set_section_alignment
2748 (obfd, padd->section,
2749 bfd_section_alignment (obfd, padd->section)))
2751 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2758 if (update_sections != NULL)
2760 struct section_add *pupdate;
2762 for (pupdate = update_sections;
2764 pupdate = pupdate->next)
2766 pupdate->section = bfd_get_section_by_name (ibfd, pupdate->name);
2767 if (pupdate->section == NULL)
2769 non_fatal (_("error: %s not found, can't be updated"), pupdate->name);
2773 osec = pupdate->section->output_section;
2774 if (! bfd_set_section_size (obfd, osec, pupdate->size))
2776 bfd_nonfatal_message (NULL, obfd, osec, NULL);
2784 /* This palaver is necessary because we must set the output
2785 section size first, before its contents are ready. */
2786 osec = bfd_get_section_by_name (ibfd, GNU_BUILD_ATTRS_SECTION_NAME);
2787 if (osec && is_merged_note_section (ibfd, osec))
2791 size = bfd_get_section_size (osec);
2794 bfd_nonfatal_message (NULL, ibfd, osec, _("warning: note section is empty"));
2795 merge_notes = FALSE;
2797 else if (! bfd_get_full_section_contents (ibfd, osec, & merged_notes))
2799 bfd_nonfatal_message (NULL, ibfd, osec, _("warning: could not load note section"));
2800 free (merged_notes);
2801 merged_notes = NULL;
2802 merge_notes = FALSE;
2806 merged_size = merge_gnu_build_notes (ibfd, osec, size, merged_notes);
2807 if (merged_size == size)
2809 /* Merging achieves nothing. */
2810 free (merged_notes);
2811 merged_notes = NULL;
2812 merge_notes = FALSE;
2817 if (osec->output_section == NULL
2818 || ! bfd_set_section_size (obfd, osec->output_section, merged_size))
2820 bfd_nonfatal_message (NULL, obfd, osec, _("warning: failed to set merged notes size"));
2821 free (merged_notes);
2822 merged_notes = NULL;
2823 merge_notes = FALSE;
2831 if (dump_sections != NULL)
2833 struct section_add * pdump;
2835 for (pdump = dump_sections; pdump != NULL; pdump = pdump->next)
2837 osec = bfd_get_section_by_name (ibfd, pdump->name);
2840 bfd_nonfatal_message (NULL, ibfd, NULL,
2841 _("can't dump section '%s' - it does not exist"),
2846 if ((bfd_get_section_flags (ibfd, osec) & SEC_HAS_CONTENTS) == 0)
2848 bfd_nonfatal_message (NULL, ibfd, osec,
2849 _("can't dump section - it has no contents"));
2853 bfd_size_type size = bfd_get_section_size (osec);
2856 bfd_nonfatal_message (NULL, ibfd, osec,
2857 _("can't dump section - it is empty"));
2862 f = fopen (pdump->filename, FOPEN_WB);
2865 bfd_nonfatal_message (pdump->filename, NULL, NULL,
2866 _("could not open section dump file"));
2871 if (bfd_malloc_and_get_section (ibfd, osec, &contents))
2873 if (fwrite (contents, 1, size, f) != size)
2875 non_fatal (_("error writing section contents to %s (error: %s)"),
2884 bfd_nonfatal_message (NULL, ibfd, osec,
2885 _("could not retrieve section contents"));
2892 if (gnu_debuglink_filename != NULL)
2894 /* PR 15125: Give a helpful warning message if
2895 the debuglink section already exists, and
2896 allow the rest of the copy to complete. */
2897 if (bfd_get_section_by_name (obfd, ".gnu_debuglink"))
2899 non_fatal (_("%s: debuglink section already exists"),
2900 bfd_get_filename (obfd));
2901 gnu_debuglink_filename = NULL;
2905 gnu_debuglink_section = bfd_create_gnu_debuglink_section
2906 (obfd, gnu_debuglink_filename);
2908 if (gnu_debuglink_section == NULL)
2910 bfd_nonfatal_message (NULL, obfd, NULL,
2911 _("cannot create debug link section `%s'"),
2912 gnu_debuglink_filename);
2916 /* Special processing for PE format files. We
2917 have no way to distinguish PE from COFF here. */
2918 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour)
2920 bfd_vma debuglink_vma;
2921 asection * highest_section;
2923 /* The PE spec requires that all sections be adjacent and sorted
2924 in ascending order of VMA. It also specifies that debug
2925 sections should be last. This is despite the fact that debug
2926 sections are not loaded into memory and so in theory have no
2929 This means that the debuglink section must be given a non-zero
2930 VMA which makes it contiguous with other debug sections. So
2931 walk the current section list, find the section with the
2932 highest VMA and start the debuglink section after that one. */
2933 for (osec = obfd->sections, highest_section = NULL;
2937 && (highest_section == NULL
2938 || osec->vma > highest_section->vma))
2939 highest_section = osec;
2941 if (highest_section)
2942 debuglink_vma = BFD_ALIGN (highest_section->vma
2943 + highest_section->size,
2944 /* FIXME: We ought to be using
2945 COFF_PAGE_SIZE here or maybe
2946 bfd_get_section_alignment() (if it
2947 was set) but since this is for PE
2948 and we know the required alignment
2949 it is easier just to hard code it. */
2952 /* Umm, not sure what to do in this case. */
2953 debuglink_vma = 0x1000;
2955 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
2960 c = bfd_count_sections (obfd);
2962 && (gap_fill_set || pad_to_set))
2966 /* We must fill in gaps between the sections and/or we must pad
2967 the last section to a specified address. We do this by
2968 grabbing a list of the sections, sorting them by VMA, and
2969 increasing the section sizes as required to fill the gaps.
2970 We write out the gap contents below. */
2972 osections = (asection **) xmalloc (c * sizeof (asection *));
2974 bfd_map_over_sections (obfd, get_sections, &set);
2976 qsort (osections, c, sizeof (asection *), compare_section_lma);
2978 gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type));
2979 memset (gaps, 0, c * sizeof (bfd_size_type));
2983 for (i = 0; i < c - 1; i++)
2987 bfd_vma gap_start, gap_stop;
2989 flags = bfd_get_section_flags (obfd, osections[i]);
2990 if ((flags & SEC_HAS_CONTENTS) == 0
2991 || (flags & SEC_LOAD) == 0)
2994 size = bfd_section_size (obfd, osections[i]);
2995 gap_start = bfd_section_lma (obfd, osections[i]) + size;
2996 gap_stop = bfd_section_lma (obfd, osections[i + 1]);
2997 if (gap_start < gap_stop)
2999 if (! bfd_set_section_size (obfd, osections[i],
3000 size + (gap_stop - gap_start)))
3002 bfd_nonfatal_message (NULL, obfd, osections[i],
3003 _("Can't fill gap after section"));
3007 gaps[i] = gap_stop - gap_start;
3008 if (max_gap < gap_stop - gap_start)
3009 max_gap = gap_stop - gap_start;
3019 lma = bfd_section_lma (obfd, osections[c - 1]);
3020 size = bfd_section_size (obfd, osections[c - 1]);
3021 if (lma + size < pad_to)
3023 if (! bfd_set_section_size (obfd, osections[c - 1],
3026 bfd_nonfatal_message (NULL, obfd, osections[c - 1],
3027 _("can't add padding"));
3032 gaps[c - 1] = pad_to - (lma + size);
3033 if (max_gap < pad_to - (lma + size))
3034 max_gap = pad_to - (lma + size);
3040 /* Symbol filtering must happen after the output sections
3041 have been created, but before their contents are set. */
3043 if (convert_debugging)
3044 dhandle = read_debugging_info (ibfd, isympp, symcount, FALSE);
3046 if (strip_symbols == STRIP_DEBUG
3047 || strip_symbols == STRIP_ALL
3048 || strip_symbols == STRIP_UNNEEDED
3049 || strip_symbols == STRIP_NONDEBUG
3050 || strip_symbols == STRIP_DWO
3051 || strip_symbols == STRIP_NONDWO
3052 || discard_locals != LOCALS_UNDEF
3054 || htab_elements (strip_specific_htab) != 0
3055 || htab_elements (keep_specific_htab) != 0
3056 || htab_elements (localize_specific_htab) != 0
3057 || htab_elements (globalize_specific_htab) != 0
3058 || htab_elements (keepglobal_specific_htab) != 0
3059 || htab_elements (weaken_specific_htab) != 0
3060 || htab_elements (redefine_specific_htab) != 0
3061 || prefix_symbols_string
3064 || convert_debugging
3065 || change_leading_char
3066 || remove_leading_char
3067 || section_rename_list
3071 /* Mark symbols used in output relocations so that they
3072 are kept, even if they are local labels or static symbols.
3074 Note we iterate over the input sections examining their
3075 relocations since the relocations for the output sections
3076 haven't been set yet. mark_symbols_used_in_relocations will
3077 ignore input sections which have no corresponding output
3079 if (strip_symbols != STRIP_ALL)
3081 bfd_set_error (bfd_error_no_error);
3082 bfd_map_over_sections (ibfd,
3083 mark_symbols_used_in_relocations,
3085 if (bfd_get_error () != bfd_error_no_error)
3092 osympp = (asymbol **) xmalloc ((symcount + add_symbols + 1) * sizeof (asymbol *));
3093 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
3096 if (convert_debugging && dhandle != NULL)
3100 res = write_debugging_info (obfd, dhandle, &symcount, &osympp);
3103 dhandle = NULL; /* Paranoia... */
3112 bfd_set_symtab (obfd, osympp, symcount);
3114 /* This has to happen before section positions are set. */
3115 bfd_map_over_sections (ibfd, copy_relocations_in_section, obfd);
3117 /* This has to happen after the symbol table has been set. */
3118 bfd_map_over_sections (ibfd, copy_section, obfd);
3120 if (add_sections != NULL)
3122 struct section_add *padd;
3124 for (padd = add_sections; padd != NULL; padd = padd->next)
3126 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
3129 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
3135 if (update_sections != NULL)
3137 struct section_add *pupdate;
3139 for (pupdate = update_sections;
3141 pupdate = pupdate->next)
3143 osec = pupdate->section->output_section;
3144 if (! bfd_set_section_contents (obfd, osec, pupdate->contents,
3147 bfd_nonfatal_message (NULL, obfd, osec, NULL);
3155 osec = bfd_get_section_by_name (obfd, GNU_BUILD_ATTRS_SECTION_NAME);
3156 if (osec && is_merged_note_section (obfd, osec))
3158 if (! bfd_set_section_contents (obfd, osec, merged_notes, 0, merged_size))
3160 bfd_nonfatal_message (NULL, obfd, osec, _("error: failed to copy merged notes into output"));
3164 else if (! is_strip)
3165 bfd_nonfatal_message (NULL, obfd, osec, _("could not find any mergeable note sections"));
3166 free (merged_notes);
3167 merged_notes = NULL;
3168 merge_notes = FALSE;
3171 if (gnu_debuglink_filename != NULL)
3173 if (! bfd_fill_in_gnu_debuglink_section
3174 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
3176 bfd_nonfatal_message (NULL, obfd, NULL,
3177 _("cannot fill debug link section `%s'"),
3178 gnu_debuglink_filename);
3183 if (gap_fill_set || pad_to_set)
3187 /* Fill in the gaps. */
3190 buf = (bfd_byte *) xmalloc (max_gap);
3191 memset (buf, gap_fill, max_gap);
3193 c = bfd_count_sections (obfd);
3194 for (i = 0; i < c; i++)
3202 off = bfd_section_size (obfd, osections[i]) - left;
3213 if (! bfd_set_section_contents (obfd, osections[i], buf,
3216 bfd_nonfatal_message (NULL, obfd, osections[i], NULL);
3232 /* Allow the BFD backend to copy any private data it understands
3233 from the input BFD to the output BFD. This is done last to
3234 permit the routine to look at the filtered symbol table, which is
3235 important for the ECOFF code at least. */
3236 if (! bfd_copy_private_bfd_data (ibfd, obfd))
3238 bfd_nonfatal_message (NULL, obfd, NULL,
3239 _("error copying private BFD data"));
3243 /* Switch to the alternate machine code. We have to do this at the
3244 very end, because we only initialize the header when we create
3245 the first section. */
3246 if (use_alt_mach_code != 0)
3248 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
3250 non_fatal (_("this target does not support %lu alternative machine codes"),
3252 if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
3254 non_fatal (_("treating that number as an absolute e_machine value instead"));
3255 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
3258 non_fatal (_("ignoring the alternative value"));
3265 /* Read each archive element in turn from IBFD, copy the
3266 contents to temp file, and keep the temp file handle.
3267 If 'force_output_target' is TRUE then make sure that
3268 all elements in the new archive are of the type
3272 copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
3273 bfd_boolean force_output_target,
3274 const bfd_arch_info_type *input_arch)
3278 struct name_list *next;
3282 bfd **ptr = &obfd->archive_head;
3285 const char *filename;
3287 /* PR 24281: It is not clear what should happen when copying a thin archive.
3288 One part is straight forward - if the output archive is in a different
3289 directory from the input archive then any relative paths in the library
3290 should be adjusted to the new location. But if any transformation
3291 options are active (eg strip, rename, add, etc) then the implication is
3292 that these should be applied to the files pointed to by the archive.
3293 But since objcopy is not destructive, this means that new files must be
3294 created, and there is no guidance for the names of the new files. (Plus
3295 this conflicts with one of the goals of thin libraries - only taking up
3296 a minimal amount of space in the file system).
3298 So for now we fail if an attempt is made to copy such libraries. */
3299 if (ibfd->is_thin_archive)
3302 bfd_set_error (bfd_error_invalid_operation);
3303 bfd_nonfatal_message (NULL, ibfd, NULL,
3304 _("sorry: copying thin archives is not currently supported"));
3308 /* Make a temp directory to hold the contents. */
3309 dir = make_tempdir (bfd_get_filename (obfd));
3311 fatal (_("cannot create tempdir for archive copying (error: %s)"),
3314 if (strip_symbols == STRIP_ALL)
3315 obfd->has_armap = FALSE;
3317 obfd->has_armap = ibfd->has_armap;
3318 obfd->is_thin_archive = ibfd->is_thin_archive;
3321 obfd->flags |= BFD_DETERMINISTIC_OUTPUT;
3325 this_element = bfd_openr_next_archived_file (ibfd, NULL);
3327 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
3330 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
3331 goto cleanup_and_exit;
3334 while (!status && this_element != NULL)
3340 int stat_status = 0;
3341 bfd_boolean del = TRUE;
3342 bfd_boolean ok_object;
3344 /* PR binutils/17533: Do not allow directory traversal
3345 outside of the current directory tree by archive members. */
3346 if (! is_valid_archive_path (bfd_get_filename (this_element)))
3348 non_fatal (_("illegal pathname found in archive member: %s"),
3349 bfd_get_filename (this_element));
3351 goto cleanup_and_exit;
3354 /* Create an output file for this member. */
3355 output_name = concat (dir, "/",
3356 bfd_get_filename (this_element), (char *) 0);
3358 /* If the file already exists, make another temp dir. */
3359 if (stat (output_name, &buf) >= 0)
3361 char * tmpdir = make_tempdir (output_name);
3366 non_fatal (_("cannot create tempdir for archive copying (error: %s)"),
3369 goto cleanup_and_exit;
3372 l = (struct name_list *) xmalloc (sizeof (struct name_list));
3377 output_name = concat (tmpdir, "/",
3378 bfd_get_filename (this_element), (char *) 0);
3383 stat_status = bfd_stat_arch_elt (this_element, &buf);
3385 if (stat_status != 0)
3386 non_fatal (_("internal stat error on %s"),
3387 bfd_get_filename (this_element));
3390 l = (struct name_list *) xmalloc (sizeof (struct name_list));
3391 l->name = output_name;
3396 ok_object = bfd_check_format (this_element, bfd_object);
3398 bfd_nonfatal_message (NULL, this_element, NULL,
3399 _("Unable to recognise the format of file"));
3401 /* PR binutils/3110: Cope with archives
3402 containing multiple target types. */
3403 if (force_output_target || !ok_object)
3404 output_bfd = bfd_openw (output_name, output_target);
3406 output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
3408 if (output_bfd == NULL)
3410 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3412 goto cleanup_and_exit;
3417 del = !copy_object (this_element, output_bfd, input_arch);
3419 if (del && bfd_get_arch (this_element) == bfd_arch_unknown)
3420 /* Try again as an unknown object file. */
3422 else if (!bfd_close (output_bfd))
3424 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3425 /* Error in new object file. Don't change archive. */
3432 del = !copy_unknown_object (this_element, output_bfd);
3433 if (!bfd_close_all_done (output_bfd))
3435 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3436 /* Error in new object file. Don't change archive. */
3443 unlink (output_name);
3448 if (preserve_dates && stat_status == 0)
3449 set_times (output_name, &buf);
3451 /* Open the newly output file and attach to our list. */
3452 output_bfd = bfd_openr (output_name, output_target);
3454 l->obfd = output_bfd;
3457 ptr = &output_bfd->archive_next;
3459 last_element = this_element;
3461 this_element = bfd_openr_next_archived_file (ibfd, last_element);
3463 bfd_close (last_element);
3468 filename = bfd_get_filename (obfd);
3469 if (!bfd_close (obfd))
3472 bfd_nonfatal_message (filename, NULL, NULL, NULL);
3475 filename = bfd_get_filename (ibfd);
3476 if (!bfd_close (ibfd))
3479 bfd_nonfatal_message (filename, NULL, NULL, NULL);
3483 /* Delete all the files that we opened. */
3485 struct name_list * next;
3487 for (l = list; l != NULL; l = next)
3489 if (l->obfd == NULL)
3493 bfd_close (l->obfd);
3505 set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_handling style)
3507 /* This is only relevant to Coff targets. */
3508 if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
3511 && bfd_get_flavour (input_bfd) == bfd_target_coff_flavour)
3512 style = bfd_coff_long_section_names (input_bfd) ? ENABLE : DISABLE;
3513 bfd_coff_set_long_section_names (output_bfd, style != DISABLE);
3517 /* The top-level control. */
3520 copy_file (const char *input_filename, const char *output_filename,
3521 const char *input_target, const char *output_target,
3522 const bfd_arch_info_type *input_arch)
3525 char **obj_matching;
3526 char **core_matching;
3527 off_t size = get_file_size (input_filename);
3532 non_fatal (_("error: the input file '%s' is empty"),
3538 /* To allow us to do "strip *" without dying on the first
3539 non-object file, failures are nonfatal. */
3540 ibfd = bfd_openr (input_filename, input_target);
3543 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3548 switch (do_debug_sections)
3552 case compress_gnu_zlib:
3553 case compress_gabi_zlib:
3554 ibfd->flags |= BFD_COMPRESS;
3555 /* Don't check if input is ELF here since this information is
3556 only available after bfd_check_format_matches is called. */
3557 if (do_debug_sections != compress_gnu_zlib)
3558 ibfd->flags |= BFD_COMPRESS_GABI;
3561 ibfd->flags |= BFD_DECOMPRESS;
3567 switch (do_elf_stt_common)
3569 case elf_stt_common:
3570 ibfd->flags |= BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON;
3573 case no_elf_stt_common:
3574 ibfd->flags |= BFD_CONVERT_ELF_COMMON;
3580 if (bfd_check_format (ibfd, bfd_archive))
3582 bfd_boolean force_output_target;
3585 /* bfd_get_target does not return the correct value until
3586 bfd_check_format succeeds. */
3587 if (output_target == NULL)
3589 output_target = bfd_get_target (ibfd);
3590 force_output_target = FALSE;
3593 force_output_target = TRUE;
3595 obfd = bfd_openw (output_filename, output_target);
3598 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3602 /* This is a no-op on non-Coff targets. */
3603 set_long_section_mode (obfd, ibfd, long_section_names);
3605 copy_archive (ibfd, obfd, output_target, force_output_target, input_arch);
3607 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
3612 /* bfd_get_target does not return the correct value until
3613 bfd_check_format succeeds. */
3614 if (output_target == NULL)
3615 output_target = bfd_get_target (ibfd);
3617 obfd = bfd_openw (output_filename, output_target);
3620 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3624 /* This is a no-op on non-Coff targets. */
3625 set_long_section_mode (obfd, ibfd, long_section_names);
3627 if (! copy_object (ibfd, obfd, input_arch))
3630 /* PR 17512: file: 0f15796a.
3631 If the file could not be copied it may not be in a writeable
3632 state. So use bfd_close_all_done to avoid the possibility of
3633 writing uninitialised data into the file. */
3634 if (! (status ? bfd_close_all_done (obfd) : bfd_close (obfd)))
3637 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3641 if (!bfd_close (ibfd))
3644 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3650 bfd_error_type obj_error = bfd_get_error ();
3651 bfd_error_type core_error;
3653 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
3655 /* This probably can't happen.. */
3656 if (obj_error == bfd_error_file_ambiguously_recognized)
3657 free (obj_matching);
3661 core_error = bfd_get_error ();
3662 /* Report the object error in preference to the core error. */
3663 if (obj_error != core_error)
3664 bfd_set_error (obj_error);
3666 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3668 if (obj_error == bfd_error_file_ambiguously_recognized)
3670 list_matching_formats (obj_matching);
3671 free (obj_matching);
3673 if (core_error == bfd_error_file_ambiguously_recognized)
3675 list_matching_formats (core_matching);
3676 free (core_matching);
3683 /* Add a name to the section renaming list. */
3686 add_section_rename (const char * old_name, const char * new_name,
3689 section_rename * srename;
3691 /* Check for conflicts first. */
3692 for (srename = section_rename_list; srename != NULL; srename = srename->next)
3693 if (strcmp (srename->old_name, old_name) == 0)
3695 /* Silently ignore duplicate definitions. */
3696 if (strcmp (srename->new_name, new_name) == 0
3697 && srename->flags == flags)
3700 fatal (_("Multiple renames of section %s"), old_name);
3703 srename = (section_rename *) xmalloc (sizeof (* srename));
3705 srename->old_name = old_name;
3706 srename->new_name = new_name;
3707 srename->flags = flags;
3708 srename->next = section_rename_list;
3710 section_rename_list = srename;
3713 /* Check the section rename list for a new name of the input section
3714 called OLD_NAME. Returns the new name if one is found and sets
3715 RETURNED_FLAGS if non-NULL to the flags to be used for this section. */
3718 find_section_rename (const char *old_name, flagword *returned_flags)
3720 const section_rename *srename;
3722 for (srename = section_rename_list; srename != NULL; srename = srename->next)
3723 if (strcmp (srename->old_name, old_name) == 0)
3725 if (returned_flags != NULL && srename->flags != (flagword) -1)
3726 *returned_flags = srename->flags;
3728 return srename->new_name;
3734 /* Once each of the sections is copied, we may still need to do some
3735 finalization work for private section headers. Do that here. */
3738 setup_bfd_headers (bfd *ibfd, bfd *obfd)
3740 /* Allow the BFD backend to copy any private data it understands
3741 from the input section to the output section. */
3742 if (! bfd_copy_private_header_data (ibfd, obfd))
3745 bfd_nonfatal_message (NULL, ibfd, NULL,
3746 _("error in private header data"));
3750 /* All went well. */
3754 /* Create a section in OBFD with the same
3755 name and attributes as ISECTION in IBFD. */
3758 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
3760 bfd *obfd = (bfd *) obfdarg;
3761 struct section_list *p;
3769 char *prefix = NULL;
3770 bfd_boolean make_nobits;
3772 if (is_strip_section (ibfd, isection))
3775 /* Get the, possibly new, name of the output section. */
3776 name = bfd_section_name (ibfd, isection);
3777 flags = bfd_get_section_flags (ibfd, isection);
3778 name = find_section_rename (name, &flags);
3780 /* Prefix sections. */
3781 if ((prefix_alloc_sections_string)
3782 && (bfd_get_section_flags (ibfd, isection) & SEC_ALLOC))
3783 prefix = prefix_alloc_sections_string;
3784 else if (prefix_sections_string)
3785 prefix = prefix_sections_string;
3791 n = (char *) xmalloc (strlen (prefix) + strlen (name) + 1);
3797 make_nobits = FALSE;
3799 p = find_section_list (bfd_section_name (ibfd, isection), FALSE,
3800 SECTION_CONTEXT_SET_FLAGS);
3802 flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
3803 else if (strip_symbols == STRIP_NONDEBUG
3804 && (flags & (SEC_ALLOC | SEC_GROUP)) != 0
3805 && !is_nondebug_keep_contents_section (ibfd, isection))
3807 flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
3808 if (obfd->xvec->flavour == bfd_target_elf_flavour)
3812 /* Twiddle the input section flags so that it seems to
3813 elf.c:copy_private_bfd_data that section flags have not
3814 changed between input and output sections. This hack
3815 prevents wholesale rewriting of the program headers. */
3816 isection->flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
3820 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
3822 if (osection == NULL)
3824 err = _("failed to create output section");
3829 elf_section_type (osection) = SHT_NOBITS;
3831 size = bfd_section_size (ibfd, isection);
3832 size = bfd_convert_section_size (ibfd, isection, obfd, size);
3834 size = (size + interleave - 1) / interleave * copy_width;
3835 else if (extract_symbol)
3837 if (! bfd_set_section_size (obfd, osection, size))
3839 err = _("failed to set size");
3843 vma = bfd_section_vma (ibfd, isection);
3844 p = find_section_list (bfd_section_name (ibfd, isection), FALSE,
3845 SECTION_CONTEXT_ALTER_VMA | SECTION_CONTEXT_SET_VMA);
3848 if (p->context & SECTION_CONTEXT_SET_VMA)
3854 vma += change_section_address;
3856 if (! bfd_set_section_vma (obfd, osection, vma))
3858 err = _("failed to set vma");
3862 lma = isection->lma;
3863 p = find_section_list (bfd_section_name (ibfd, isection), FALSE,
3864 SECTION_CONTEXT_ALTER_LMA | SECTION_CONTEXT_SET_LMA);
3867 if (p->context & SECTION_CONTEXT_ALTER_LMA)
3873 lma += change_section_address;
3875 osection->lma = lma;
3877 /* FIXME: This is probably not enough. If we change the LMA we
3878 may have to recompute the header for the file as well. */
3879 if (!bfd_set_section_alignment (obfd,
3881 bfd_section_alignment (ibfd, isection)))
3883 err = _("failed to set alignment");
3887 /* Copy merge entity size. */
3888 osection->entsize = isection->entsize;
3890 /* Copy compress status. */
3891 osection->compress_status = isection->compress_status;
3893 /* This used to be mangle_section; we do here to avoid using
3894 bfd_get_section_by_name since some formats allow multiple
3895 sections with the same name. */
3896 isection->output_section = osection;
3897 isection->output_offset = 0;
3899 if ((isection->flags & SEC_GROUP) != 0)
3901 asymbol *gsym = group_signature (isection);
3905 gsym->flags |= BSF_KEEP;
3906 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
3907 elf_group_id (isection) = gsym;
3911 /* Allow the BFD backend to copy any private data it understands
3912 from the input section to the output section. */
3913 if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
3915 err = _("failed to copy private data");
3919 /* All went well. */
3924 bfd_nonfatal_message (NULL, obfd, osection, err);
3927 /* Return TRUE if input section ISECTION should be skipped. */
3930 skip_section (bfd *ibfd, sec_ptr isection, bfd_boolean skip_copy)
3936 /* If we have already failed earlier on,
3937 do not keep on generating complaints now. */
3944 if (is_strip_section (ibfd, isection))
3947 if (is_update_section (ibfd, isection))
3950 /* When merging a note section we skip the copying of the contents,
3951 but not the copying of the relocs associated with the contents. */
3952 if (skip_copy && is_merged_note_section (ibfd, isection))
3955 flags = bfd_get_section_flags (ibfd, isection);
3956 if ((flags & SEC_GROUP) != 0)
3959 osection = isection->output_section;
3960 size = bfd_get_section_size (isection);
3962 if (size == 0 || osection == 0)
3968 /* Add section SECTION_PATTERN to the list of sections that will have their
3969 relocations removed. */
3972 handle_remove_relocations_option (const char *section_pattern)
3974 find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE_RELOCS);
3977 /* Return TRUE if ISECTION from IBFD should have its relocations removed,
3978 otherwise return FALSE. If the user has requested that relocations be
3979 removed from a section that does not have relocations then this
3980 function will still return TRUE. */
3983 discard_relocations (bfd *ibfd ATTRIBUTE_UNUSED, asection *isection)
3985 return (find_section_list (bfd_section_name (ibfd, isection), FALSE,
3986 SECTION_CONTEXT_REMOVE_RELOCS) != NULL);
3989 /* Wrapper for dealing with --remove-section (-R) command line arguments.
3990 A special case is detected here, if the user asks to remove a relocation
3991 section (one starting with ".rela" or ".rel") then this removal must
3992 be done using a different technique in a relocatable object. */
3995 handle_remove_section_option (const char *section_pattern)
3997 find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE);
3998 if (strncmp (section_pattern, ".rel", 4) == 0)
4000 section_pattern += 4;
4001 if (*section_pattern == 'a')
4003 if (*section_pattern)
4004 handle_remove_relocations_option (section_pattern);
4006 sections_removed = TRUE;
4009 /* Copy relocations in input section ISECTION of IBFD to an output
4010 section with the same name in OBFDARG. If stripping then don't
4011 copy any relocation info. */
4014 copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
4016 bfd *obfd = (bfd *) obfdarg;
4022 if (skip_section (ibfd, isection, FALSE))
4025 osection = isection->output_section;
4027 /* Core files and DWO files do not need to be relocated. */
4028 if (bfd_get_format (obfd) == bfd_core
4029 || strip_symbols == STRIP_NONDWO
4030 || discard_relocations (ibfd, isection))
4034 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
4038 /* Do not complain if the target does not support relocations. */
4039 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
4044 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
4052 bfd_set_reloc (obfd, osection, NULL, 0);
4053 osection->flags &= ~SEC_RELOC;
4057 if (isection->orelocation != NULL)
4059 /* Some other function has already set up the output relocs
4060 for us, so scan those instead of the default relocs. */
4061 relcount = isection->reloc_count;
4062 relpp = isection->orelocation;
4066 relpp = (arelent **) xmalloc (relsize);
4067 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
4071 bfd_nonfatal_message (NULL, ibfd, isection,
4072 _("relocation count is negative"));
4077 if (strip_symbols == STRIP_ALL)
4079 /* Remove relocations which are not in
4080 keep_strip_specific_list. */
4081 arelent **temp_relpp;
4082 long temp_relcount = 0;
4085 temp_relpp = (arelent **) xmalloc (relsize);
4086 for (i = 0; i < relcount; i++)
4088 /* PR 17512: file: 9e907e0c. */
4089 if (relpp[i]->sym_ptr_ptr
4091 && * relpp[i]->sym_ptr_ptr)
4092 if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
4093 keep_specific_htab))
4094 temp_relpp [temp_relcount++] = relpp [i];
4096 relcount = temp_relcount;
4097 if (isection->orelocation == NULL)
4102 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
4105 osection->flags &= ~SEC_RELOC;
4111 /* Copy the data of input section ISECTION of IBFD
4112 to an output section with the same name in OBFD. */
4115 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
4117 bfd *obfd = (bfd *) obfdarg;
4118 struct section_list *p;
4122 if (skip_section (ibfd, isection, TRUE))
4125 osection = isection->output_section;
4126 /* The output SHF_COMPRESSED section size is different from input if
4127 ELF classes of input and output aren't the same. We can't use
4128 the output section size since --interleave will shrink the output
4129 section. Size will be updated if the section is converted. */
4130 size = bfd_get_section_size (isection);
4132 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
4133 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
4135 bfd_byte *memhunk = NULL;
4137 if (!bfd_get_full_section_contents (ibfd, isection, &memhunk)
4138 || !bfd_convert_section_contents (ibfd, isection, obfd,
4142 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
4149 /* We don't handle leftover bytes (too many possible behaviors,
4150 and we don't know what the user wants). The section length
4151 must be a multiple of the number of bytes to swap. */
4152 if ((size % reverse_bytes) == 0)
4157 for (i = 0; i < size; i += reverse_bytes)
4158 for (j = 0; j < (unsigned long)(reverse_bytes / 2); j++)
4160 bfd_byte *m = (bfd_byte *) memhunk;
4163 m[i + j] = m[(i + reverse_bytes) - (j + 1)];
4164 m[(i + reverse_bytes) - (j + 1)] = b;
4168 /* User must pad the section up in order to do this. */
4169 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
4170 bfd_section_name (ibfd, isection), reverse_bytes);
4175 /* Keep only every `copy_byte'th byte in MEMHUNK. */
4176 char *from = (char *) memhunk + copy_byte;
4177 char *to = (char *) memhunk;
4178 char *end = (char *) memhunk + size;
4181 /* If the section address is not exactly divisible by the interleave,
4182 then we must bias the from address. If the copy_byte is less than
4183 the bias, then we must skip forward one interleave, and increment
4185 int extra = isection->lma % interleave;
4187 if (copy_byte < extra)
4190 for (; from < end; from += interleave)
4191 for (i = 0; i < copy_width; i++)
4193 if (&from[i] >= end)
4198 size = (size + interleave - 1 - copy_byte) / interleave * copy_width;
4199 osection->lma /= interleave;
4200 if (copy_byte < extra)
4204 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
4207 bfd_nonfatal_message (NULL, obfd, osection, NULL);
4213 else if ((p = find_section_list (bfd_get_section_name (ibfd, isection),
4214 FALSE, SECTION_CONTEXT_SET_FLAGS)) != NULL
4215 && (p->flags & SEC_HAS_CONTENTS) != 0)
4217 void *memhunk = xmalloc (size);
4219 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
4220 flag--they can just remove the section entirely and add it
4221 back again. However, we do permit them to turn on the
4222 SEC_HAS_CONTENTS flag, and take it to mean that the section
4223 contents should be zeroed out. */
4225 memset (memhunk, 0, size);
4226 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
4229 bfd_nonfatal_message (NULL, obfd, osection, NULL);
4237 /* Get all the sections. This is used when --gap-fill or --pad-to is
4241 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
4243 asection ***secppp = (asection ***) secppparg;
4245 **secppp = osection;
4249 /* Sort sections by VMA. This is called via qsort, and is used when
4250 --gap-fill or --pad-to is used. We force non loadable or empty
4251 sections to the front, where they are easier to ignore. */
4254 compare_section_lma (const void *arg1, const void *arg2)
4256 const asection *const *sec1 = (const asection * const *) arg1;
4257 const asection *const *sec2 = (const asection * const *) arg2;
4258 flagword flags1, flags2;
4260 /* Sort non loadable sections to the front. */
4261 flags1 = (*sec1)->flags;
4262 flags2 = (*sec2)->flags;
4263 if ((flags1 & SEC_HAS_CONTENTS) == 0
4264 || (flags1 & SEC_LOAD) == 0)
4266 if ((flags2 & SEC_HAS_CONTENTS) != 0
4267 && (flags2 & SEC_LOAD) != 0)
4272 if ((flags2 & SEC_HAS_CONTENTS) == 0
4273 || (flags2 & SEC_LOAD) == 0)
4277 /* Sort sections by LMA. */
4278 if ((*sec1)->lma > (*sec2)->lma)
4280 else if ((*sec1)->lma < (*sec2)->lma)
4283 /* Sort sections with the same LMA by size. */
4284 if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
4286 else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
4292 /* Mark all the symbols which will be used in output relocations with
4293 the BSF_KEEP flag so that those symbols will not be stripped.
4295 Ignore relocations which will not appear in the output file. */
4298 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
4300 asymbol **symbols = (asymbol **) symbolsarg;
4305 /* Ignore an input section with no corresponding output section. */
4306 if (isection->output_section == NULL)
4309 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
4312 /* Do not complain if the target does not support relocations. */
4313 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
4315 bfd_fatal (bfd_get_filename (ibfd));
4321 relpp = (arelent **) xmalloc (relsize);
4322 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
4324 bfd_fatal (bfd_get_filename (ibfd));
4326 /* Examine each symbol used in a relocation. If it's not one of the
4327 special bfd section symbols, then mark it with BSF_KEEP. */
4328 for (i = 0; i < relcount; i++)
4330 /* See PRs 20923 and 20930 for reproducers for the NULL tests. */
4331 if (relpp[i]->sym_ptr_ptr != NULL
4332 && * relpp[i]->sym_ptr_ptr != NULL
4333 && *relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
4334 && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
4335 && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
4336 (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
4343 /* Write out debugging information. */
4346 write_debugging_info (bfd *obfd, void *dhandle,
4347 long *symcountp ATTRIBUTE_UNUSED,
4348 asymbol ***symppp ATTRIBUTE_UNUSED)
4350 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
4351 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
4353 bfd_byte *syms, *strings = NULL;
4354 bfd_size_type symsize, stringsize;
4355 asection *stabsec, *stabstrsec;
4358 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
4363 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
4364 stabsec = bfd_make_section_with_flags (obfd, ".stab", flags);
4365 stabstrsec = bfd_make_section_with_flags (obfd, ".stabstr", flags);
4367 || stabstrsec == NULL
4368 || ! bfd_set_section_size (obfd, stabsec, symsize)
4369 || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
4370 || ! bfd_set_section_alignment (obfd, stabsec, 2)
4371 || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
4373 bfd_nonfatal_message (NULL, obfd, NULL,
4374 _("can't create debugging section"));
4379 /* We can get away with setting the section contents now because
4380 the next thing the caller is going to do is copy over the
4381 real sections. We may someday have to split the contents
4382 setting out of this function. */
4383 if (! bfd_set_section_contents (obfd, stabsec, syms, 0, symsize)
4384 || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
4387 bfd_nonfatal_message (NULL, obfd, NULL,
4388 _("can't set debugging section contents"));
4396 bfd_nonfatal_message (NULL, obfd, NULL,
4397 _("don't know how to write debugging information for %s"),
4398 bfd_get_target (obfd));
4402 /* If neither -D nor -U was specified explicitly,
4403 then use the configured default. */
4405 default_deterministic (void)
4407 if (deterministic < 0)
4408 deterministic = DEFAULT_AR_DETERMINISTIC;
4412 strip_main (int argc, char *argv[])
4414 char *input_target = NULL;
4415 char *output_target = NULL;
4416 bfd_boolean show_version = FALSE;
4417 bfd_boolean formats_info = FALSE;
4420 char *output_file = NULL;
4421 bfd_boolean merge_notes_set = FALSE;
4423 while ((c = getopt_long (argc, argv, "I:O:F:K:MN:R:o:sSpdgxXHhVvwDU",
4424 strip_options, (int *) 0)) != EOF)
4429 input_target = optarg;
4432 output_target = optarg;
4435 input_target = output_target = optarg;
4438 handle_remove_section_option (optarg);
4440 case OPTION_REMOVE_RELOCS:
4441 handle_remove_relocations_option (optarg);
4444 strip_symbols = STRIP_ALL;
4448 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
4449 strip_symbols = STRIP_DEBUG;
4451 case OPTION_STRIP_DWO:
4452 strip_symbols = STRIP_DWO;
4454 case OPTION_STRIP_UNNEEDED:
4455 strip_symbols = STRIP_UNNEEDED;
4458 add_specific_symbol (optarg, keep_specific_htab);
4462 merge_notes_set = TRUE;
4464 case OPTION_NO_MERGE_NOTES:
4465 merge_notes = FALSE;
4466 merge_notes_set = TRUE;
4469 add_specific_symbol (optarg, strip_specific_htab);
4472 output_file = optarg;
4475 preserve_dates = TRUE;
4478 deterministic = TRUE;
4481 deterministic = FALSE;
4484 discard_locals = LOCALS_ALL;
4487 discard_locals = LOCALS_START_L;
4493 show_version = TRUE;
4495 case OPTION_FORMATS_INFO:
4496 formats_info = TRUE;
4498 case OPTION_ONLY_KEEP_DEBUG:
4499 strip_symbols = STRIP_NONDEBUG;
4501 case OPTION_KEEP_FILE_SYMBOLS:
4502 keep_file_symbols = 1;
4505 /* We've been given a long option. */
4512 strip_usage (stdout, 0);
4514 strip_usage (stderr, 1);
4518 /* If the user has not expressly chosen to merge/not-merge ELF notes
4519 then enable the merging unless we are stripping debug or dwo info. */
4520 if (! merge_notes_set
4521 && (strip_symbols == STRIP_UNDEF
4522 || strip_symbols == STRIP_ALL
4523 || strip_symbols == STRIP_UNNEEDED
4524 || strip_symbols == STRIP_NONDEBUG
4525 || strip_symbols == STRIP_NONDWO))
4535 print_version ("strip");
4537 default_deterministic ();
4539 /* Default is to strip all symbols. */
4540 if (strip_symbols == STRIP_UNDEF
4541 && discard_locals == LOCALS_UNDEF
4542 && htab_elements (strip_specific_htab) == 0)
4543 strip_symbols = STRIP_ALL;
4545 if (output_target == NULL)
4546 output_target = input_target;
4550 || (output_file != NULL && (i + 1) < argc))
4551 strip_usage (stderr, 1);
4553 for (; i < argc; i++)
4555 int hold_status = status;
4556 struct stat statbuf;
4559 if (get_file_size (argv[i]) < 1)
4566 /* No need to check the return value of stat().
4567 It has already been checked in get_file_size(). */
4568 stat (argv[i], &statbuf);
4570 if (output_file == NULL
4571 || filename_cmp (argv[i], output_file) == 0)
4572 tmpname = make_tempname (argv[i]);
4574 tmpname = output_file;
4576 if (tmpname == NULL)
4578 bfd_nonfatal_message (argv[i], NULL, NULL,
4579 _("could not create temporary file to hold stripped copy"));
4585 copy_file (argv[i], tmpname, input_target, output_target, NULL);
4589 set_times (tmpname, &statbuf);
4590 if (output_file != tmpname)
4591 status = (smart_rename (tmpname,
4592 output_file ? output_file : argv[i],
4593 preserve_dates) != 0);
4595 status = hold_status;
4598 unlink_if_ordinary (tmpname);
4599 if (output_file != tmpname)
4606 /* Set up PE subsystem. */
4609 set_pe_subsystem (const char *s)
4611 const char *version, *subsystem;
4621 { "native", 0, IMAGE_SUBSYSTEM_NATIVE },
4622 { "windows", 0, IMAGE_SUBSYSTEM_WINDOWS_GUI },
4623 { "console", 0, IMAGE_SUBSYSTEM_WINDOWS_CUI },
4624 { "posix", 0, IMAGE_SUBSYSTEM_POSIX_CUI },
4625 { "wince", 0, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI },
4626 { "efi-app", 1, IMAGE_SUBSYSTEM_EFI_APPLICATION },
4627 { "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER },
4628 { "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER },
4629 { "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER },
4630 { "xbox", 0, IMAGE_SUBSYSTEM_XBOX }
4636 /* Check for the presence of a version number. */
4637 version = strchr (s, ':');
4638 if (version == NULL)
4642 int len = version - s;
4646 version = copy + 1 + len;
4647 pe_major_subsystem_version = strtoul (version, ©, 0);
4649 pe_minor_subsystem_version = strtoul (copy + 1, ©, 0);
4651 non_fatal (_("%s: bad version in PE subsystem"), s);
4654 /* Check for numeric subsystem. */
4655 value = (short) strtol (subsystem, ©, 0);
4658 for (i = 0; i < ARRAY_SIZE (v); i++)
4659 if (v[i].value == value)
4661 pe_subsystem = value;
4662 set_def = v[i].set_def;
4668 /* Search for subsystem by name. */
4669 for (i = 0; i < ARRAY_SIZE (v); i++)
4670 if (strcmp (subsystem, v[i].name) == 0)
4672 pe_subsystem = v[i].value;
4673 set_def = v[i].set_def;
4681 fatal (_("unknown PE subsystem: %s"), s);
4686 if (pe_file_alignment == (bfd_vma) -1)
4687 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
4688 if (pe_section_alignment == (bfd_vma) -1)
4689 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
4693 free ((char *) subsystem);
4696 /* Convert EFI target to PEI target. */
4699 convert_efi_target (char *efi)
4705 if (strcmp (efi + 4, "ia32") == 0)
4707 /* Change ia32 to i386. */
4712 else if (strcmp (efi + 4, "x86_64") == 0)
4714 /* Change x86_64 to x86-64. */
4719 /* Allocate and return a pointer to a struct section_add, initializing the
4720 structure using ARG, a string in the format "sectionname=filename".
4721 The returned structure will have its next pointer set to NEXT. The
4722 OPTION field is the name of the command line option currently being
4723 parsed, and is only used if an error needs to be reported. */
4725 static struct section_add *
4726 init_section_add (const char *arg,
4727 struct section_add *next,
4730 struct section_add *pa;
4733 s = strchr (arg, '=');
4735 fatal (_("bad format for %s"), option);
4737 pa = (struct section_add *) xmalloc (sizeof (struct section_add));
4738 pa->name = xstrndup (arg, s - arg);
4739 pa->filename = s + 1;
4741 pa->contents = NULL;
4747 /* Load the file specified in PA, allocating memory to hold the file
4748 contents, and store a pointer to the allocated memory in the contents
4749 field of PA. The size field of PA is also updated. All errors call
4753 section_add_load_file (struct section_add *pa)
4758 /* We don't use get_file_size so that we can do
4759 --add-section .note.GNU_stack=/dev/null
4760 get_file_size doesn't work on /dev/null. */
4762 f = fopen (pa->filename, FOPEN_RB);
4764 fatal (_("cannot open: %s: %s"),
4765 pa->filename, strerror (errno));
4769 pa->contents = (bfd_byte *) xmalloc (alloc);
4777 pa->contents = (bfd_byte *) xrealloc (pa->contents, alloc);
4780 got = fread (pa->contents + off, 1, alloc - off, f);
4782 fatal (_("%s: fread failed"), pa->filename);
4793 copy_main (int argc, char *argv[])
4795 char *input_filename = NULL;
4796 char *output_filename = NULL;
4798 char *input_target = NULL;
4799 char *output_target = NULL;
4800 bfd_boolean show_version = FALSE;
4801 bfd_boolean change_warn = TRUE;
4802 bfd_boolean formats_info = FALSE;
4803 bfd_boolean use_globalize = FALSE;
4804 bfd_boolean use_keep_global = FALSE;
4806 struct stat statbuf;
4807 const bfd_arch_info_type *input_arch = NULL;
4809 while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:MN:s:O:d:F:L:G:R:SpgxXHhVvW:wDU",
4810 copy_options, (int *) 0)) != EOF)
4815 copy_byte = atoi (optarg);
4817 fatal (_("byte number must be non-negative"));
4821 input_arch = bfd_scan_arch (optarg);
4822 if (input_arch == NULL)
4823 fatal (_("architecture %s unknown"), optarg);
4829 interleave = atoi (optarg);
4831 fatal (_("interleave must be positive"));
4837 case OPTION_INTERLEAVE_WIDTH:
4838 copy_width = atoi (optarg);
4840 fatal(_("interleave width must be positive"));
4844 case 's': /* "source" - 'I' is preferred */
4845 input_target = optarg;
4849 case 'd': /* "destination" - 'O' is preferred */
4850 output_target = optarg;
4854 input_target = output_target = optarg;
4858 find_section_list (optarg, TRUE, SECTION_CONTEXT_COPY);
4859 sections_copied = TRUE;
4863 handle_remove_section_option (optarg);
4866 case OPTION_REMOVE_RELOCS:
4867 handle_remove_relocations_option (optarg);
4871 strip_symbols = STRIP_ALL;
4875 strip_symbols = STRIP_DEBUG;
4878 case OPTION_STRIP_DWO:
4879 strip_symbols = STRIP_DWO;
4882 case OPTION_STRIP_UNNEEDED:
4883 strip_symbols = STRIP_UNNEEDED;
4886 case OPTION_ONLY_KEEP_DEBUG:
4887 strip_symbols = STRIP_NONDEBUG;
4890 case OPTION_KEEP_FILE_SYMBOLS:
4891 keep_file_symbols = 1;
4894 case OPTION_ADD_GNU_DEBUGLINK:
4895 long_section_names = ENABLE ;
4896 gnu_debuglink_filename = optarg;
4900 add_specific_symbol (optarg, keep_specific_htab);
4906 case OPTION_NO_MERGE_NOTES:
4907 merge_notes = FALSE;
4911 add_specific_symbol (optarg, strip_specific_htab);
4914 case OPTION_STRIP_UNNEEDED_SYMBOL:
4915 add_specific_symbol (optarg, strip_unneeded_htab);
4919 add_specific_symbol (optarg, localize_specific_htab);
4922 case OPTION_GLOBALIZE_SYMBOL:
4923 use_globalize = TRUE;
4924 add_specific_symbol (optarg, globalize_specific_htab);
4928 use_keep_global = TRUE;
4929 add_specific_symbol (optarg, keepglobal_specific_htab);
4933 add_specific_symbol (optarg, weaken_specific_htab);
4937 preserve_dates = TRUE;
4941 deterministic = TRUE;
4945 deterministic = FALSE;
4953 discard_locals = LOCALS_ALL;
4957 discard_locals = LOCALS_START_L;
4965 show_version = TRUE;
4968 case OPTION_FORMATS_INFO:
4969 formats_info = TRUE;
4976 case OPTION_ADD_SECTION:
4977 add_sections = init_section_add (optarg, add_sections,
4979 section_add_load_file (add_sections);
4982 case OPTION_UPDATE_SECTION:
4983 update_sections = init_section_add (optarg, update_sections,
4984 "--update-section");
4985 section_add_load_file (update_sections);
4988 case OPTION_DUMP_SECTION:
4989 dump_sections = init_section_add (optarg, dump_sections,
4993 case OPTION_ADD_SYMBOL:
4996 struct addsym_node *newsym = xmalloc (sizeof *newsym);
4998 newsym->next = NULL;
4999 s = strchr (optarg, '=');
5001 fatal (_("bad format for %s"), "--add-symbol");
5002 t = strchr (s + 1, ':');
5004 newsym->symdef = xstrndup (optarg, s - optarg);
5007 newsym->section = xstrndup (s + 1, t - (s + 1));
5008 newsym->symval = strtol (t + 1, NULL, 0);
5012 newsym->section = NULL;
5013 newsym->symval = strtol (s + 1, NULL, 0);
5017 t = strchr (t + 1, ',');
5018 newsym->othersym = NULL;
5020 newsym->flags = parse_symflags (t+1, &newsym->othersym);
5022 newsym->flags = BSF_GLOBAL;
5024 /* Keep 'othersym' symbols at the front of the list. */
5025 if (newsym->othersym)
5027 newsym->next = add_sym_list;
5029 add_sym_tail = &newsym->next;
5030 add_sym_list = newsym;
5034 *add_sym_tail = newsym;
5035 add_sym_tail = &newsym->next;
5041 case OPTION_CHANGE_START:
5042 change_start = parse_vma (optarg, "--change-start");
5045 case OPTION_CHANGE_SECTION_ADDRESS:
5046 case OPTION_CHANGE_SECTION_LMA:
5047 case OPTION_CHANGE_SECTION_VMA:
5049 struct section_list * p;
5050 unsigned int context = 0;
5054 char *option = NULL;
5059 case OPTION_CHANGE_SECTION_ADDRESS:
5060 option = "--change-section-address";
5061 context = SECTION_CONTEXT_ALTER_LMA | SECTION_CONTEXT_ALTER_VMA;
5063 case OPTION_CHANGE_SECTION_LMA:
5064 option = "--change-section-lma";
5065 context = SECTION_CONTEXT_ALTER_LMA;
5067 case OPTION_CHANGE_SECTION_VMA:
5068 option = "--change-section-vma";
5069 context = SECTION_CONTEXT_ALTER_VMA;
5073 s = strchr (optarg, '=');
5076 s = strchr (optarg, '+');
5079 s = strchr (optarg, '-');
5081 fatal (_("bad format for %s"), option);
5086 /* Correct the context. */
5089 case OPTION_CHANGE_SECTION_ADDRESS:
5090 context = SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_SET_VMA;
5092 case OPTION_CHANGE_SECTION_LMA:
5093 context = SECTION_CONTEXT_SET_LMA;
5095 case OPTION_CHANGE_SECTION_VMA:
5096 context = SECTION_CONTEXT_SET_VMA;
5102 name = (char *) xmalloc (len + 1);
5103 strncpy (name, optarg, len);
5106 p = find_section_list (name, TRUE, context);
5108 val = parse_vma (s + 1, option);
5114 case OPTION_CHANGE_SECTION_ADDRESS:
5118 case OPTION_CHANGE_SECTION_LMA:
5122 case OPTION_CHANGE_SECTION_VMA:
5129 case OPTION_CHANGE_ADDRESSES:
5130 change_section_address = parse_vma (optarg, "--change-addresses");
5131 change_start = change_section_address;
5134 case OPTION_CHANGE_WARNINGS:
5138 case OPTION_CHANGE_LEADING_CHAR:
5139 change_leading_char = TRUE;
5142 case OPTION_COMPRESS_DEBUG_SECTIONS:
5145 if (strcasecmp (optarg, "none") == 0)
5146 do_debug_sections = decompress;
5147 else if (strcasecmp (optarg, "zlib") == 0)
5148 do_debug_sections = compress_zlib;
5149 else if (strcasecmp (optarg, "zlib-gnu") == 0)
5150 do_debug_sections = compress_gnu_zlib;
5151 else if (strcasecmp (optarg, "zlib-gabi") == 0)
5152 do_debug_sections = compress_gabi_zlib;
5154 fatal (_("unrecognized --compress-debug-sections type `%s'"),
5158 do_debug_sections = compress;
5161 case OPTION_DEBUGGING:
5162 convert_debugging = TRUE;
5165 case OPTION_DECOMPRESS_DEBUG_SECTIONS:
5166 do_debug_sections = decompress;
5169 case OPTION_ELF_STT_COMMON:
5170 if (strcasecmp (optarg, "yes") == 0)
5171 do_elf_stt_common = elf_stt_common;
5172 else if (strcasecmp (optarg, "no") == 0)
5173 do_elf_stt_common = no_elf_stt_common;
5175 fatal (_("unrecognized --elf-stt-common= option `%s'"),
5179 case OPTION_GAP_FILL:
5181 bfd_vma gap_fill_vma;
5183 gap_fill_vma = parse_vma (optarg, "--gap-fill");
5184 gap_fill = (bfd_byte) gap_fill_vma;
5185 if ((bfd_vma) gap_fill != gap_fill_vma)
5189 sprintf_vma (buff, gap_fill_vma);
5191 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
5194 gap_fill_set = TRUE;
5198 case OPTION_NO_CHANGE_WARNINGS:
5199 change_warn = FALSE;
5203 pad_to = parse_vma (optarg, "--pad-to");
5207 case OPTION_REMOVE_LEADING_CHAR:
5208 remove_leading_char = TRUE;
5211 case OPTION_REDEFINE_SYM:
5213 /* Insert this redefinition onto redefine_specific_htab. */
5217 const char *nextarg;
5218 char *source, *target;
5220 s = strchr (optarg, '=');
5222 fatal (_("bad format for %s"), "--redefine-sym");
5225 source = (char *) xmalloc (len + 1);
5226 strncpy (source, optarg, len);
5230 len = strlen (nextarg);
5231 target = (char *) xmalloc (len + 1);
5232 strcpy (target, nextarg);
5234 add_redefine_and_check ("--redefine-sym", source, target);
5241 case OPTION_REDEFINE_SYMS:
5242 add_redefine_syms_file (optarg);
5245 case OPTION_SET_SECTION_FLAGS:
5247 struct section_list *p;
5252 s = strchr (optarg, '=');
5254 fatal (_("bad format for %s"), "--set-section-flags");
5257 name = (char *) xmalloc (len + 1);
5258 strncpy (name, optarg, len);
5261 p = find_section_list (name, TRUE, SECTION_CONTEXT_SET_FLAGS);
5263 p->flags = parse_flags (s + 1);
5267 case OPTION_RENAME_SECTION:
5270 const char *eq, *fl;
5275 eq = strchr (optarg, '=');
5277 fatal (_("bad format for %s"), "--rename-section");
5281 fatal (_("bad format for %s"), "--rename-section");
5283 old_name = (char *) xmalloc (len + 1);
5284 strncpy (old_name, optarg, len);
5288 fl = strchr (eq, ',');
5291 flags = parse_flags (fl + 1);
5301 fatal (_("bad format for %s"), "--rename-section");
5303 new_name = (char *) xmalloc (len + 1);
5304 strncpy (new_name, eq, len);
5307 add_section_rename (old_name, new_name, flags);
5311 case OPTION_SET_START:
5312 set_start = parse_vma (optarg, "--set-start");
5313 set_start_set = TRUE;
5316 case OPTION_SREC_LEN:
5317 _bfd_srec_len = parse_vma (optarg, "--srec-len");
5320 case OPTION_SREC_FORCES3:
5321 _bfd_srec_forceS3 = TRUE;
5324 case OPTION_STRIP_SYMBOLS:
5325 add_specific_symbols (optarg, strip_specific_htab,
5326 &strip_specific_buffer);
5329 case OPTION_STRIP_UNNEEDED_SYMBOLS:
5330 add_specific_symbols (optarg, strip_unneeded_htab,
5331 &strip_unneeded_buffer);
5334 case OPTION_KEEP_SYMBOLS:
5335 add_specific_symbols (optarg, keep_specific_htab,
5336 &keep_specific_buffer);
5339 case OPTION_LOCALIZE_HIDDEN:
5340 localize_hidden = TRUE;
5343 case OPTION_LOCALIZE_SYMBOLS:
5344 add_specific_symbols (optarg, localize_specific_htab,
5345 &localize_specific_buffer);
5348 case OPTION_LONG_SECTION_NAMES:
5349 if (!strcmp ("enable", optarg))
5350 long_section_names = ENABLE;
5351 else if (!strcmp ("disable", optarg))
5352 long_section_names = DISABLE;
5353 else if (!strcmp ("keep", optarg))
5354 long_section_names = KEEP;
5356 fatal (_("unknown long section names option '%s'"), optarg);
5359 case OPTION_GLOBALIZE_SYMBOLS:
5360 use_globalize = TRUE;
5361 add_specific_symbols (optarg, globalize_specific_htab,
5362 &globalize_specific_buffer);
5365 case OPTION_KEEPGLOBAL_SYMBOLS:
5366 use_keep_global = TRUE;
5367 add_specific_symbols (optarg, keepglobal_specific_htab,
5368 &keepglobal_specific_buffer);
5371 case OPTION_WEAKEN_SYMBOLS:
5372 add_specific_symbols (optarg, weaken_specific_htab,
5373 &weaken_specific_buffer);
5376 case OPTION_ALT_MACH_CODE:
5377 use_alt_mach_code = strtoul (optarg, NULL, 0);
5378 if (use_alt_mach_code == 0)
5379 fatal (_("unable to parse alternative machine code"));
5382 case OPTION_PREFIX_SYMBOLS:
5383 prefix_symbols_string = optarg;
5386 case OPTION_PREFIX_SECTIONS:
5387 prefix_sections_string = optarg;
5390 case OPTION_PREFIX_ALLOC_SECTIONS:
5391 prefix_alloc_sections_string = optarg;
5394 case OPTION_READONLY_TEXT:
5395 bfd_flags_to_set |= WP_TEXT;
5396 bfd_flags_to_clear &= ~WP_TEXT;
5399 case OPTION_WRITABLE_TEXT:
5400 bfd_flags_to_clear |= WP_TEXT;
5401 bfd_flags_to_set &= ~WP_TEXT;
5405 bfd_flags_to_set |= D_PAGED;
5406 bfd_flags_to_clear &= ~D_PAGED;
5410 bfd_flags_to_clear |= D_PAGED;
5411 bfd_flags_to_set &= ~D_PAGED;
5414 case OPTION_EXTRACT_DWO:
5415 strip_symbols = STRIP_NONDWO;
5418 case OPTION_EXTRACT_SYMBOL:
5419 extract_symbol = TRUE;
5422 case OPTION_REVERSE_BYTES:
5424 int prev = reverse_bytes;
5426 reverse_bytes = atoi (optarg);
5427 if ((reverse_bytes <= 0) || ((reverse_bytes % 2) != 0))
5428 fatal (_("number of bytes to reverse must be positive and even"));
5430 if (prev && prev != reverse_bytes)
5431 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
5436 case OPTION_FILE_ALIGNMENT:
5437 pe_file_alignment = parse_vma (optarg, "--file-alignment");
5443 pe_heap_reserve = strtoul (optarg, &end, 0);
5445 || (*end != '.' && *end != '\0'))
5446 non_fatal (_("%s: invalid reserve value for --heap"),
5448 else if (*end != '\0')
5450 pe_heap_commit = strtoul (end + 1, &end, 0);
5452 non_fatal (_("%s: invalid commit value for --heap"),
5458 case OPTION_IMAGE_BASE:
5459 pe_image_base = parse_vma (optarg, "--image-base");
5462 case OPTION_SECTION_ALIGNMENT:
5463 pe_section_alignment = parse_vma (optarg,
5464 "--section-alignment");
5467 case OPTION_SUBSYSTEM:
5468 set_pe_subsystem (optarg);
5474 pe_stack_reserve = strtoul (optarg, &end, 0);
5476 || (*end != '.' && *end != '\0'))
5477 non_fatal (_("%s: invalid reserve value for --stack"),
5479 else if (*end != '\0')
5481 pe_stack_commit = strtoul (end + 1, &end, 0);
5483 non_fatal (_("%s: invalid commit value for --stack"),
5489 case OPTION_VERILOG_DATA_WIDTH:
5490 VerilogDataWidth = parse_vma (optarg, "--verilog-data-width");
5491 if (VerilogDataWidth < 1)
5492 fatal (_("verilog data width must be at least 1 byte"));
5496 /* We've been given a long option. */
5501 copy_usage (stdout, 0);
5504 copy_usage (stderr, 1);
5508 if (use_globalize && use_keep_global)
5509 fatal(_("--globalize-symbol(s) is incompatible with -G/--keep-global-symbol(s)"));
5518 print_version ("objcopy");
5520 if (interleave && copy_byte == -1)
5521 fatal (_("interleave start byte must be set with --byte"));
5523 if (copy_byte >= interleave)
5524 fatal (_("byte number must be less than interleave"));
5526 if (copy_width > interleave - copy_byte)
5527 fatal (_("interleave width must be less than or equal to interleave - byte`"));
5529 if (optind == argc || optind + 2 < argc)
5530 copy_usage (stderr, 1);
5532 input_filename = argv[optind];
5533 if (optind + 1 < argc)
5534 output_filename = argv[optind + 1];
5536 default_deterministic ();
5538 /* Default is to strip no symbols. */
5539 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
5540 strip_symbols = STRIP_NONE;
5542 if (output_target == NULL)
5543 output_target = input_target;
5545 /* Convert input EFI target to PEI target. */
5546 if (input_target != NULL
5547 && strncmp (input_target, "efi-", 4) == 0)
5551 efi = xstrdup (output_target + 4);
5552 if (strncmp (efi, "bsdrv-", 6) == 0
5553 || strncmp (efi, "rtdrv-", 6) == 0)
5555 else if (strncmp (efi, "app-", 4) != 0)
5556 fatal (_("unknown input EFI target: %s"), input_target);
5559 convert_efi_target (efi);
5562 /* Convert output EFI target to PEI target. */
5563 if (output_target != NULL
5564 && strncmp (output_target, "efi-", 4) == 0)
5568 efi = xstrdup (output_target + 4);
5569 if (strncmp (efi, "app-", 4) == 0)
5571 if (pe_subsystem == -1)
5572 pe_subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
5574 else if (strncmp (efi, "bsdrv-", 6) == 0)
5576 if (pe_subsystem == -1)
5577 pe_subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;
5580 else if (strncmp (efi, "rtdrv-", 6) == 0)
5582 if (pe_subsystem == -1)
5583 pe_subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;
5587 fatal (_("unknown output EFI target: %s"), output_target);
5589 if (pe_file_alignment == (bfd_vma) -1)
5590 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
5591 if (pe_section_alignment == (bfd_vma) -1)
5592 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
5594 output_target = efi;
5595 convert_efi_target (efi);
5599 if (stat (input_filename, & statbuf) < 0)
5600 fatal (_("warning: could not locate '%s'. System error message: %s"),
5601 input_filename, strerror (errno));
5603 /* If there is no destination file, or the source and destination files
5604 are the same, then create a temp and rename the result into the input. */
5605 if (output_filename == NULL
5606 || filename_cmp (input_filename, output_filename) == 0)
5607 tmpname = make_tempname (input_filename);
5609 tmpname = output_filename;
5611 if (tmpname == NULL)
5612 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
5613 input_filename, strerror (errno));
5615 copy_file (input_filename, tmpname, input_target, output_target, input_arch);
5619 set_times (tmpname, &statbuf);
5620 if (tmpname != output_filename)
5621 status = (smart_rename (tmpname, input_filename,
5622 preserve_dates) != 0);
5625 unlink_if_ordinary (tmpname);
5627 if (tmpname != output_filename)
5632 struct section_list *p;
5634 for (p = change_sections; p != NULL; p = p->next)
5638 if (p->context & (SECTION_CONTEXT_SET_VMA | SECTION_CONTEXT_ALTER_VMA))
5642 sprintf_vma (buff, p->vma_val);
5644 /* xgettext:c-format */
5645 non_fatal (_("%s %s%c0x%s never used"),
5646 "--change-section-vma",
5648 p->context & SECTION_CONTEXT_SET_VMA ? '=' : '+',
5652 if (p->context & (SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_ALTER_LMA))
5656 sprintf_vma (buff, p->lma_val);
5658 /* xgettext:c-format */
5659 non_fatal (_("%s %s%c0x%s never used"),
5660 "--change-section-lma",
5662 p->context & SECTION_CONTEXT_SET_LMA ? '=' : '+',
5669 if (strip_specific_buffer)
5670 free (strip_specific_buffer);
5672 if (strip_unneeded_buffer)
5673 free (strip_unneeded_buffer);
5675 if (keep_specific_buffer)
5676 free (keep_specific_buffer);
5678 if (localize_specific_buffer)
5679 free (globalize_specific_buffer);
5681 if (globalize_specific_buffer)
5682 free (globalize_specific_buffer);
5684 if (keepglobal_specific_buffer)
5685 free (keepglobal_specific_buffer);
5687 if (weaken_specific_buffer)
5688 free (weaken_specific_buffer);
5694 main (int argc, char *argv[])
5696 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
5697 setlocale (LC_MESSAGES, "");
5699 #if defined (HAVE_SETLOCALE)
5700 setlocale (LC_CTYPE, "");
5702 bindtextdomain (PACKAGE, LOCALEDIR);
5703 textdomain (PACKAGE);
5705 program_name = argv[0];
5706 xmalloc_set_program_name (program_name);
5708 START_PROGRESS (program_name, 0);
5710 expandargv (&argc, &argv);
5712 strip_symbols = STRIP_UNDEF;
5713 discard_locals = LOCALS_UNDEF;
5715 if (bfd_init () != BFD_INIT_MAGIC)
5716 fatal (_("fatal error: libbfd ABI mismatch"));
5717 set_default_bfd_target ();
5721 int i = strlen (program_name);
5722 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5723 /* Drop the .exe suffix, if any. */
5724 if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
5727 program_name[i] = '\0';
5730 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
5733 create_symbol_htabs ();
5736 bfd_set_error_program_name (argv[0]);
5739 strip_main (argc, argv);
5741 copy_main (argc, argv);
5743 END_PROGRESS (program_name);