1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright (C) 1991-2017 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 list to support redefine_sym. */
62 struct redefine_node *next;
67 struct addsym_node *next;
75 typedef struct section_rename
77 const char * old_name;
78 const char * new_name;
80 struct section_rename * next;
84 /* List of sections to be renamed. */
85 static section_rename *section_rename_list;
87 static asymbol **isympp = NULL; /* Input symbols. */
88 static asymbol **osympp = NULL; /* Output symbols that survive stripping. */
90 /* If `copy_byte' >= 0, copy 'copy_width' byte(s) of every `interleave' bytes. */
91 static int copy_byte = -1;
92 static int interleave = 0; /* Initialised to 4 in copy_main(). */
93 static int copy_width = 1;
95 static bfd_boolean verbose; /* Print file and target names. */
96 static bfd_boolean preserve_dates; /* Preserve input file timestamp. */
97 static int deterministic = -1; /* Enable deterministic archives. */
98 static int status = 0; /* Exit status. */
100 static bfd_boolean merge_notes = FALSE; /* Merge note sections. */
101 static bfd_byte * merged_notes = NULL; /* Contents on note section undergoing a merge. */
102 static bfd_size_type merged_size = 0; /* New, smaller size of the merged note section. */
107 STRIP_NONE, /* Don't strip. */
108 STRIP_DEBUG, /* Strip all debugger symbols. */
109 STRIP_UNNEEDED, /* Strip unnecessary symbols. */
110 STRIP_NONDEBUG, /* Strip everything but debug info. */
111 STRIP_DWO, /* Strip all DWO info. */
112 STRIP_NONDWO, /* Strip everything but DWO info. */
113 STRIP_ALL /* Strip all symbols. */
116 /* Which symbols to remove. */
117 static enum strip_action strip_symbols = STRIP_UNDEF;
122 LOCALS_START_L, /* Discard locals starting with L. */
123 LOCALS_ALL /* Discard all locals. */
126 /* Which local symbols to remove. Overrides STRIP_ALL. */
127 static enum locals_action discard_locals;
129 /* Structure used to hold lists of sections and actions to take. */
132 struct section_list * next; /* Next section to change. */
133 const char * pattern; /* Section name pattern. */
134 bfd_boolean used; /* Whether this entry was used. */
136 unsigned int context; /* What to do with matching sections. */
137 /* Flag bits used in the context field.
138 COPY and REMOVE are mutually exlusive. SET and ALTER are mutually exclusive. */
139 #define SECTION_CONTEXT_REMOVE (1 << 0) /* Remove this section. */
140 #define SECTION_CONTEXT_COPY (1 << 1) /* Copy this section, delete all non-copied section. */
141 #define SECTION_CONTEXT_SET_VMA (1 << 2) /* Set the sections' VMA address. */
142 #define SECTION_CONTEXT_ALTER_VMA (1 << 3) /* Increment or decrement the section's VMA address. */
143 #define SECTION_CONTEXT_SET_LMA (1 << 4) /* Set the sections' LMA address. */
144 #define SECTION_CONTEXT_ALTER_LMA (1 << 5) /* Increment or decrement the section's LMA address. */
145 #define SECTION_CONTEXT_SET_FLAGS (1 << 6) /* Set the section's flags. */
146 #define SECTION_CONTEXT_REMOVE_RELOCS (1 << 7) /* Remove relocations for this section. */
148 bfd_vma vma_val; /* Amount to change by or set to. */
149 bfd_vma lma_val; /* Amount to change by or set to. */
150 flagword flags; /* What to set the section flags to. */
153 static struct section_list *change_sections;
155 /* TRUE if some sections are to be removed. */
156 static bfd_boolean sections_removed;
158 /* TRUE if only some sections are to be copied. */
159 static bfd_boolean sections_copied;
161 /* Changes to the start address. */
162 static bfd_vma change_start = 0;
163 static bfd_boolean set_start_set = FALSE;
164 static bfd_vma set_start;
166 /* Changes to section addresses. */
167 static bfd_vma change_section_address = 0;
169 /* Filling gaps between sections. */
170 static bfd_boolean gap_fill_set = FALSE;
171 static bfd_byte gap_fill = 0;
173 /* Pad to a given address. */
174 static bfd_boolean pad_to_set = FALSE;
175 static bfd_vma pad_to;
177 /* Use alternative machine code? */
178 static unsigned long use_alt_mach_code = 0;
180 /* Output BFD flags user wants to set or clear */
181 static flagword bfd_flags_to_set;
182 static flagword bfd_flags_to_clear;
184 /* List of sections to add. */
187 /* Next section to add. */
188 struct section_add *next;
189 /* Name of section to add. */
191 /* Name of file holding section contents. */
192 const char *filename;
195 /* Contents of file. */
197 /* BFD section, after it has been added. */
201 /* List of sections to add to the output BFD. */
202 static struct section_add *add_sections;
204 /* List of sections to update in the output BFD. */
205 static struct section_add *update_sections;
207 /* List of sections to dump from the output BFD. */
208 static struct section_add *dump_sections;
210 /* If non-NULL the argument to --add-gnu-debuglink.
211 This should be the filename to store in the .gnu_debuglink section. */
212 static const char * gnu_debuglink_filename = NULL;
214 /* Whether to convert debugging information. */
215 static bfd_boolean convert_debugging = FALSE;
217 /* Whether to compress/decompress DWARF debug sections. */
222 compress_zlib = compress | 1 << 1,
223 compress_gnu_zlib = compress | 1 << 2,
224 compress_gabi_zlib = compress | 1 << 3,
226 } do_debug_sections = nothing;
228 /* Whether to generate ELF common symbols with the STT_COMMON type. */
229 static enum bfd_link_elf_stt_common do_elf_stt_common = unchanged;
231 /* Whether to change the leading character in symbol names. */
232 static bfd_boolean change_leading_char = FALSE;
234 /* Whether to remove the leading character from global symbol names. */
235 static bfd_boolean remove_leading_char = FALSE;
237 /* Whether to permit wildcard in symbol comparison. */
238 static bfd_boolean wildcard = FALSE;
240 /* True if --localize-hidden is in effect. */
241 static bfd_boolean localize_hidden = FALSE;
243 /* List of symbols to strip, keep, localize, keep-global, weaken,
245 static htab_t strip_specific_htab = NULL;
246 static htab_t strip_unneeded_htab = NULL;
247 static htab_t keep_specific_htab = NULL;
248 static htab_t localize_specific_htab = NULL;
249 static htab_t globalize_specific_htab = NULL;
250 static htab_t keepglobal_specific_htab = NULL;
251 static htab_t weaken_specific_htab = NULL;
252 static struct redefine_node *redefine_sym_list = NULL;
253 static struct addsym_node *add_sym_list = NULL, **add_sym_tail = &add_sym_list;
254 static int add_symbols = 0;
256 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
257 static bfd_boolean weaken = FALSE;
259 /* If this is TRUE, we retain BSF_FILE symbols. */
260 static bfd_boolean keep_file_symbols = FALSE;
262 /* Prefix symbols/sections. */
263 static char *prefix_symbols_string = 0;
264 static char *prefix_sections_string = 0;
265 static char *prefix_alloc_sections_string = 0;
267 /* True if --extract-symbol was passed on the command line. */
268 static bfd_boolean extract_symbol = FALSE;
270 /* If `reverse_bytes' is nonzero, then reverse the order of every chunk
271 of <reverse_bytes> bytes within each output section. */
272 static int reverse_bytes = 0;
274 /* For Coff objects, we may want to allow or disallow long section names,
275 or preserve them where found in the inputs. Debug info relies on them. */
276 enum long_section_name_handling
283 /* The default long section handling mode is to preserve them.
284 This is also the only behaviour for 'strip'. */
285 static enum long_section_name_handling long_section_names = KEEP;
287 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
288 enum command_line_switch
290 OPTION_ADD_SECTION=150,
291 OPTION_ADD_GNU_DEBUGLINK,
293 OPTION_ALT_MACH_CODE,
294 OPTION_CHANGE_ADDRESSES,
295 OPTION_CHANGE_LEADING_CHAR,
296 OPTION_CHANGE_SECTION_ADDRESS,
297 OPTION_CHANGE_SECTION_LMA,
298 OPTION_CHANGE_SECTION_VMA,
300 OPTION_CHANGE_WARNINGS,
301 OPTION_COMPRESS_DEBUG_SECTIONS,
303 OPTION_DECOMPRESS_DEBUG_SECTIONS,
305 OPTION_ELF_STT_COMMON,
307 OPTION_EXTRACT_SYMBOL,
308 OPTION_FILE_ALIGNMENT,
311 OPTION_GLOBALIZE_SYMBOL,
312 OPTION_GLOBALIZE_SYMBOLS,
316 OPTION_INTERLEAVE_WIDTH,
317 OPTION_KEEPGLOBAL_SYMBOLS,
318 OPTION_KEEP_FILE_SYMBOLS,
320 OPTION_LOCALIZE_HIDDEN,
321 OPTION_LOCALIZE_SYMBOLS,
322 OPTION_LONG_SECTION_NAMES,
324 OPTION_NO_CHANGE_WARNINGS,
325 OPTION_ONLY_KEEP_DEBUG,
327 OPTION_PREFIX_ALLOC_SECTIONS,
328 OPTION_PREFIX_SECTIONS,
329 OPTION_PREFIX_SYMBOLS,
331 OPTION_READONLY_TEXT,
333 OPTION_REDEFINE_SYMS,
334 OPTION_REMOVE_LEADING_CHAR,
335 OPTION_REMOVE_RELOCS,
336 OPTION_RENAME_SECTION,
337 OPTION_REVERSE_BYTES,
338 OPTION_SECTION_ALIGNMENT,
339 OPTION_SET_SECTION_FLAGS,
345 OPTION_STRIP_SYMBOLS,
346 OPTION_STRIP_UNNEEDED,
347 OPTION_STRIP_UNNEEDED_SYMBOL,
348 OPTION_STRIP_UNNEEDED_SYMBOLS,
350 OPTION_UPDATE_SECTION,
352 OPTION_WEAKEN_SYMBOLS,
356 /* Options to handle if running as "strip". */
358 static struct option strip_options[] =
360 {"disable-deterministic-archives", no_argument, 0, 'U'},
361 {"discard-all", no_argument, 0, 'x'},
362 {"discard-locals", no_argument, 0, 'X'},
363 {"enable-deterministic-archives", no_argument, 0, 'D'},
364 {"format", required_argument, 0, 'F'}, /* Obsolete */
365 {"help", no_argument, 0, 'h'},
366 {"info", no_argument, 0, OPTION_FORMATS_INFO},
367 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
368 {"input-target", required_argument, 0, 'I'},
369 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
370 {"keep-symbol", required_argument, 0, 'K'},
371 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
372 {"output-file", required_argument, 0, 'o'},
373 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
374 {"output-target", required_argument, 0, 'O'},
375 {"preserve-dates", no_argument, 0, 'p'},
376 {"remove-section", required_argument, 0, 'R'},
377 {"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS},
378 {"strip-all", no_argument, 0, 's'},
379 {"strip-debug", no_argument, 0, 'S'},
380 {"strip-dwo", no_argument, 0, OPTION_STRIP_DWO},
381 {"strip-symbol", required_argument, 0, 'N'},
382 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
383 {"target", required_argument, 0, 'F'},
384 {"verbose", no_argument, 0, 'v'},
385 {"version", no_argument, 0, 'V'},
386 {"wildcard", no_argument, 0, 'w'},
387 {0, no_argument, 0, 0}
390 /* Options to handle if running as "objcopy". */
392 static struct option copy_options[] =
394 {"add-gnu-debuglink", required_argument, 0, OPTION_ADD_GNU_DEBUGLINK},
395 {"add-section", required_argument, 0, OPTION_ADD_SECTION},
396 {"add-symbol", required_argument, 0, OPTION_ADD_SYMBOL},
397 {"adjust-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
398 {"adjust-start", required_argument, 0, OPTION_CHANGE_START},
399 {"adjust-vma", required_argument, 0, OPTION_CHANGE_ADDRESSES},
400 {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
401 {"alt-machine-code", required_argument, 0, OPTION_ALT_MACH_CODE},
402 {"binary-architecture", required_argument, 0, 'B'},
403 {"byte", required_argument, 0, 'b'},
404 {"change-addresses", required_argument, 0, OPTION_CHANGE_ADDRESSES},
405 {"change-leading-char", no_argument, 0, OPTION_CHANGE_LEADING_CHAR},
406 {"change-section-address", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
407 {"change-section-lma", required_argument, 0, OPTION_CHANGE_SECTION_LMA},
408 {"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA},
409 {"change-start", required_argument, 0, OPTION_CHANGE_START},
410 {"change-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
411 {"compress-debug-sections", optional_argument, 0, OPTION_COMPRESS_DEBUG_SECTIONS},
412 {"debugging", no_argument, 0, OPTION_DEBUGGING},
413 {"decompress-debug-sections", no_argument, 0, OPTION_DECOMPRESS_DEBUG_SECTIONS},
414 {"disable-deterministic-archives", no_argument, 0, 'U'},
415 {"discard-all", no_argument, 0, 'x'},
416 {"discard-locals", no_argument, 0, 'X'},
417 {"dump-section", required_argument, 0, OPTION_DUMP_SECTION},
418 {"elf-stt-common", required_argument, 0, OPTION_ELF_STT_COMMON},
419 {"enable-deterministic-archives", no_argument, 0, 'D'},
420 {"extract-dwo", no_argument, 0, OPTION_EXTRACT_DWO},
421 {"extract-symbol", no_argument, 0, OPTION_EXTRACT_SYMBOL},
422 {"file-alignment", required_argument, 0, OPTION_FILE_ALIGNMENT},
423 {"format", required_argument, 0, 'F'}, /* Obsolete */
424 {"gap-fill", required_argument, 0, OPTION_GAP_FILL},
425 {"globalize-symbol", required_argument, 0, OPTION_GLOBALIZE_SYMBOL},
426 {"globalize-symbols", required_argument, 0, OPTION_GLOBALIZE_SYMBOLS},
427 {"heap", required_argument, 0, OPTION_HEAP},
428 {"help", no_argument, 0, 'h'},
429 {"image-base", required_argument, 0 , OPTION_IMAGE_BASE},
430 {"impure", no_argument, 0, OPTION_IMPURE},
431 {"info", no_argument, 0, OPTION_FORMATS_INFO},
432 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
433 {"input-target", required_argument, 0, 'I'},
434 {"interleave", optional_argument, 0, 'i'},
435 {"interleave-width", required_argument, 0, OPTION_INTERLEAVE_WIDTH},
436 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
437 {"keep-global-symbol", required_argument, 0, 'G'},
438 {"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS},
439 {"keep-symbol", required_argument, 0, 'K'},
440 {"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS},
441 {"localize-hidden", no_argument, 0, OPTION_LOCALIZE_HIDDEN},
442 {"localize-symbol", required_argument, 0, 'L'},
443 {"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
444 {"long-section-names", required_argument, 0, OPTION_LONG_SECTION_NAMES},
445 {"merge-notes", no_argument, 0, 'M'},
446 {"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
447 {"no-change-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
448 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
449 {"only-section", required_argument, 0, 'j'},
450 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
451 {"output-target", required_argument, 0, 'O'},
452 {"pad-to", required_argument, 0, OPTION_PAD_TO},
453 {"prefix-alloc-sections", required_argument, 0, OPTION_PREFIX_ALLOC_SECTIONS},
454 {"prefix-sections", required_argument, 0, OPTION_PREFIX_SECTIONS},
455 {"prefix-symbols", required_argument, 0, OPTION_PREFIX_SYMBOLS},
456 {"preserve-dates", no_argument, 0, 'p'},
457 {"pure", no_argument, 0, OPTION_PURE},
458 {"readonly-text", no_argument, 0, OPTION_READONLY_TEXT},
459 {"redefine-sym", required_argument, 0, OPTION_REDEFINE_SYM},
460 {"redefine-syms", required_argument, 0, OPTION_REDEFINE_SYMS},
461 {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR},
462 {"remove-section", required_argument, 0, 'R'},
463 {"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS},
464 {"rename-section", required_argument, 0, OPTION_RENAME_SECTION},
465 {"reverse-bytes", required_argument, 0, OPTION_REVERSE_BYTES},
466 {"section-alignment", required_argument, 0, OPTION_SECTION_ALIGNMENT},
467 {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS},
468 {"set-start", required_argument, 0, OPTION_SET_START},
469 {"srec-forceS3", no_argument, 0, OPTION_SREC_FORCES3},
470 {"srec-len", required_argument, 0, OPTION_SREC_LEN},
471 {"stack", required_argument, 0, OPTION_STACK},
472 {"strip-all", no_argument, 0, 'S'},
473 {"strip-debug", no_argument, 0, 'g'},
474 {"strip-dwo", no_argument, 0, OPTION_STRIP_DWO},
475 {"strip-symbol", required_argument, 0, 'N'},
476 {"strip-symbols", required_argument, 0, OPTION_STRIP_SYMBOLS},
477 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
478 {"strip-unneeded-symbol", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOL},
479 {"strip-unneeded-symbols", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOLS},
480 {"subsystem", required_argument, 0, OPTION_SUBSYSTEM},
481 {"target", required_argument, 0, 'F'},
482 {"update-section", required_argument, 0, OPTION_UPDATE_SECTION},
483 {"verbose", no_argument, 0, 'v'},
484 {"version", no_argument, 0, 'V'},
485 {"weaken", no_argument, 0, OPTION_WEAKEN},
486 {"weaken-symbol", required_argument, 0, 'W'},
487 {"weaken-symbols", required_argument, 0, OPTION_WEAKEN_SYMBOLS},
488 {"wildcard", no_argument, 0, 'w'},
489 {"writable-text", no_argument, 0, OPTION_WRITABLE_TEXT},
490 {0, no_argument, 0, 0}
494 extern char *program_name;
496 /* This flag distinguishes between strip and objcopy:
497 1 means this is 'strip'; 0 means this is 'objcopy'.
498 -1 means if we should use argv[0] to decide. */
501 /* The maximum length of an S record. This variable is defined in srec.c
502 and can be modified by the --srec-len parameter. */
503 extern unsigned int _bfd_srec_len;
505 /* Restrict the generation of Srecords to type S3 only.
506 This variable is defined in bfd/srec.c and can be toggled
507 on by the --srec-forceS3 command line switch. */
508 extern bfd_boolean _bfd_srec_forceS3;
510 /* Forward declarations. */
511 static void setup_section (bfd *, asection *, void *);
512 static void setup_bfd_headers (bfd *, bfd *);
513 static void copy_relocations_in_section (bfd *, asection *, void *);
514 static void copy_section (bfd *, asection *, void *);
515 static void get_sections (bfd *, asection *, void *);
516 static int compare_section_lma (const void *, const void *);
517 static void mark_symbols_used_in_relocations (bfd *, asection *, void *);
518 static bfd_boolean write_debugging_info (bfd *, void *, long *, asymbol ***);
519 static const char *lookup_sym_redefinition (const char *);
520 static const char *find_section_rename (const char *, flagword *);
522 ATTRIBUTE_NORETURN static void
523 copy_usage (FILE *stream, int exit_status)
525 fprintf (stream, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name);
526 fprintf (stream, _(" Copies a binary file, possibly transforming it in the process\n"));
527 fprintf (stream, _(" The options are:\n"));
528 fprintf (stream, _("\
529 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
530 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
531 -B --binary-architecture <arch> Set output arch, when input is arch-less\n\
532 -F --target <bfdname> Set both input and output format to <bfdname>\n\
533 --debugging Convert debugging information, if possible\n\
534 -p --preserve-dates Copy modified/access timestamps to the output\n"));
535 if (DEFAULT_AR_DETERMINISTIC)
536 fprintf (stream, _("\
537 -D --enable-deterministic-archives\n\
538 Produce deterministic output when stripping archives (default)\n\
539 -U --disable-deterministic-archives\n\
540 Disable -D behavior\n"));
542 fprintf (stream, _("\
543 -D --enable-deterministic-archives\n\
544 Produce deterministic output when stripping archives\n\
545 -U --disable-deterministic-archives\n\
546 Disable -D behavior (default)\n"));
547 fprintf (stream, _("\
548 -j --only-section <name> Only copy section <name> into the output\n\
549 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
550 -R --remove-section <name> Remove section <name> from the output\n\
551 --remove-relocations <name> Remove relocations from section <name>\n\
552 -S --strip-all Remove all symbol and relocation information\n\
553 -g --strip-debug Remove all debugging symbols & sections\n\
554 --strip-dwo Remove all DWO sections\n\
555 --strip-unneeded Remove all symbols not needed by relocations\n\
556 -N --strip-symbol <name> Do not copy symbol <name>\n\
557 --strip-unneeded-symbol <name>\n\
558 Do not copy symbol <name> unless needed by\n\
560 --only-keep-debug Strip everything but the debug information\n\
561 --extract-dwo Copy only DWO sections\n\
562 --extract-symbol Remove section contents but keep symbols\n\
563 -K --keep-symbol <name> Do not strip symbol <name>\n\
564 --keep-file-symbols Do not strip file symbol(s)\n\
565 --localize-hidden Turn all ELF hidden symbols into locals\n\
566 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
567 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
568 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
569 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
570 --weaken Force all global symbols to be marked as weak\n\
571 -w --wildcard Permit wildcard in symbol comparison\n\
572 -x --discard-all Remove all non-global symbols\n\
573 -X --discard-locals Remove any compiler-generated symbols\n\
574 -i --interleave[=<number>] Only copy N out of every <number> bytes\n\
575 --interleave-width <number> Set N for --interleave\n\
576 -b --byte <num> Select byte <num> in every interleaved block\n\
577 --gap-fill <val> Fill gaps between sections with <val>\n\
578 --pad-to <addr> Pad the last section up to address <addr>\n\
579 --set-start <addr> Set the start address to <addr>\n\
580 {--change-start|--adjust-start} <incr>\n\
581 Add <incr> to the start address\n\
582 {--change-addresses|--adjust-vma} <incr>\n\
583 Add <incr> to LMA, VMA and start addresses\n\
584 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
585 Change LMA and VMA of section <name> by <val>\n\
586 --change-section-lma <name>{=|+|-}<val>\n\
587 Change the LMA of section <name> by <val>\n\
588 --change-section-vma <name>{=|+|-}<val>\n\
589 Change the VMA of section <name> by <val>\n\
590 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
591 Warn if a named section does not exist\n\
592 --set-section-flags <name>=<flags>\n\
593 Set section <name>'s properties to <flags>\n\
594 --add-section <name>=<file> Add section <name> found in <file> to output\n\
595 --update-section <name>=<file>\n\
596 Update contents of section <name> with\n\
597 contents found in <file>\n\
598 --dump-section <name>=<file> Dump the contents of section <name> into <file>\n\
599 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
600 --long-section-names {enable|disable|keep}\n\
601 Handle long section names in Coff objects.\n\
602 --change-leading-char Force output format's leading character style\n\
603 --remove-leading-char Remove leading character from global symbols\n\
604 --reverse-bytes=<num> Reverse <num> bytes at a time, in output sections with content\n\
605 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
606 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
608 --srec-len <number> Restrict the length of generated Srecords\n\
609 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
610 --strip-symbols <file> -N for all symbols listed in <file>\n\
611 --strip-unneeded-symbols <file>\n\
612 --strip-unneeded-symbol for all symbols listed\n\
614 --keep-symbols <file> -K for all symbols listed in <file>\n\
615 --localize-symbols <file> -L for all symbols listed in <file>\n\
616 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
617 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
618 --weaken-symbols <file> -W for all symbols listed in <file>\n\
619 --add-symbol <name>=[<section>:]<value>[,<flags>] Add a symbol\n\
620 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
621 --writable-text Mark the output text as writable\n\
622 --readonly-text Make the output text write protected\n\
623 --pure Mark the output file as demand paged\n\
624 --impure Mark the output file as impure\n\
625 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
626 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
627 --prefix-alloc-sections <prefix>\n\
628 Add <prefix> to start of every allocatable\n\
630 --file-alignment <num> Set PE file alignment to <num>\n\
631 --heap <reserve>[,<commit>] Set PE reserve/commit heap to <reserve>/\n\
633 --image-base <address> Set PE image base to <address>\n\
634 --section-alignment <num> Set PE section alignment to <num>\n\
635 --stack <reserve>[,<commit>] Set PE reserve/commit stack to <reserve>/\n\
637 --subsystem <name>[:<version>]\n\
638 Set PE subsystem to <name> [& <version>]\n\
639 --compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi}]\n\
640 Compress DWARF debug sections using zlib\n\
641 --decompress-debug-sections Decompress DWARF debug sections using zlib\n\
642 --elf-stt-common=[yes|no] Generate ELF common symbols with STT_COMMON\n\
644 -M --merge-notes Remove redundant entries in note sections\n\
645 -v --verbose List all object files modified\n\
646 @<file> Read options from <file>\n\
647 -V --version Display this program's version number\n\
648 -h --help Display this output\n\
649 --info List object formats & architectures supported\n\
651 list_supported_targets (program_name, stream);
652 if (REPORT_BUGS_TO[0] && exit_status == 0)
653 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
657 ATTRIBUTE_NORETURN static void
658 strip_usage (FILE *stream, int exit_status)
660 fprintf (stream, _("Usage: %s <option(s)> in-file(s)\n"), program_name);
661 fprintf (stream, _(" Removes symbols and sections from files\n"));
662 fprintf (stream, _(" The options are:\n"));
663 fprintf (stream, _("\
664 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
665 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
666 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
667 -p --preserve-dates Copy modified/access timestamps to the output\n\
669 if (DEFAULT_AR_DETERMINISTIC)
670 fprintf (stream, _("\
671 -D --enable-deterministic-archives\n\
672 Produce deterministic output when stripping archives (default)\n\
673 -U --disable-deterministic-archives\n\
674 Disable -D behavior\n"));
676 fprintf (stream, _("\
677 -D --enable-deterministic-archives\n\
678 Produce deterministic output when stripping archives\n\
679 -U --disable-deterministic-archives\n\
680 Disable -D behavior (default)\n"));
681 fprintf (stream, _("\
682 -R --remove-section=<name> Also remove section <name> from the output\n\
683 --remove-relocations <name> Remove relocations from section <name>\n\
684 -s --strip-all Remove all symbol and relocation information\n\
685 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
686 --strip-dwo Remove all DWO sections\n\
687 --strip-unneeded Remove all symbols not needed by relocations\n\
688 --only-keep-debug Strip everything but the debug information\n\
689 -N --strip-symbol=<name> Do not copy symbol <name>\n\
690 -K --keep-symbol=<name> Do not strip symbol <name>\n\
691 --keep-file-symbols Do not strip file symbol(s)\n\
692 -w --wildcard Permit wildcard in symbol comparison\n\
693 -x --discard-all Remove all non-global symbols\n\
694 -X --discard-locals Remove any compiler-generated symbols\n\
695 -v --verbose List all object files modified\n\
696 -V --version Display this program's version number\n\
697 -h --help Display this output\n\
698 --info List object formats & architectures supported\n\
699 -o <file> Place stripped output into <file>\n\
702 list_supported_targets (program_name, stream);
703 if (REPORT_BUGS_TO[0] && exit_status == 0)
704 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
708 /* Parse section flags into a flagword, with a fatal error if the
709 string can't be parsed. */
712 parse_flags (const char *s)
722 snext = strchr (s, ',');
732 #define PARSE_FLAG(fname,fval) \
733 else if (strncasecmp (fname, s, len) == 0) ret |= fval
734 PARSE_FLAG ("alloc", SEC_ALLOC);
735 PARSE_FLAG ("load", SEC_LOAD);
736 PARSE_FLAG ("noload", SEC_NEVER_LOAD);
737 PARSE_FLAG ("readonly", SEC_READONLY);
738 PARSE_FLAG ("debug", SEC_DEBUGGING);
739 PARSE_FLAG ("code", SEC_CODE);
740 PARSE_FLAG ("data", SEC_DATA);
741 PARSE_FLAG ("rom", SEC_ROM);
742 PARSE_FLAG ("share", SEC_COFF_SHARED);
743 PARSE_FLAG ("contents", SEC_HAS_CONTENTS);
744 PARSE_FLAG ("merge", SEC_MERGE);
745 PARSE_FLAG ("strings", SEC_STRINGS);
751 copy = (char *) xmalloc (len + 1);
752 strncpy (copy, s, len);
754 non_fatal (_("unrecognized section flag `%s'"), copy);
755 fatal (_("supported flags: %s"),
756 "alloc, load, noload, readonly, debug, code, data, rom, share, contents, merge, strings");
766 /* Parse symbol flags into a flagword, with a fatal error if the
767 string can't be parsed. */
770 parse_symflags (const char *s, char **other)
780 snext = strchr (s, ',');
789 #define PARSE_FLAG(fname, fval) \
790 else if (len == sizeof fname - 1 \
791 && strncasecmp (fname, s, len) == 0) \
794 #define PARSE_OTHER(fname, fval) \
795 else if (len >= sizeof fname \
796 && strncasecmp (fname, s, sizeof fname - 1) == 0) \
797 fval = xstrndup (s + sizeof fname - 1, len - sizeof fname + 1)
800 PARSE_FLAG ("local", BSF_LOCAL);
801 PARSE_FLAG ("global", BSF_GLOBAL);
802 PARSE_FLAG ("export", BSF_EXPORT);
803 PARSE_FLAG ("debug", BSF_DEBUGGING);
804 PARSE_FLAG ("function", BSF_FUNCTION);
805 PARSE_FLAG ("weak", BSF_WEAK);
806 PARSE_FLAG ("section", BSF_SECTION_SYM);
807 PARSE_FLAG ("constructor", BSF_CONSTRUCTOR);
808 PARSE_FLAG ("warning", BSF_WARNING);
809 PARSE_FLAG ("indirect", BSF_INDIRECT);
810 PARSE_FLAG ("file", BSF_FILE);
811 PARSE_FLAG ("object", BSF_OBJECT);
812 PARSE_FLAG ("synthetic", BSF_SYNTHETIC);
813 PARSE_FLAG ("indirect-function", BSF_GNU_INDIRECT_FUNCTION | BSF_FUNCTION);
814 PARSE_FLAG ("unique-object", BSF_GNU_UNIQUE | BSF_OBJECT);
815 PARSE_OTHER ("before=", *other);
823 copy = (char *) xmalloc (len + 1);
824 strncpy (copy, s, len);
826 non_fatal (_("unrecognized symbol flag `%s'"), copy);
827 fatal (_("supported flags: %s"),
828 "local, global, export, debug, function, weak, section, "
829 "constructor, warning, indirect, file, object, synthetic, "
830 "indirect-function, unique-object, before=<othersym>");
840 /* Find and optionally add an entry in the change_sections list.
842 We need to be careful in how we match section names because of the support
843 for wildcard characters. For example suppose that the user has invoked
846 --set-section-flags .debug_*=debug
847 --set-section-flags .debug_str=readonly,debug
848 --change-section-address .debug_*ranges=0x1000
850 With the idea that all debug sections will receive the DEBUG flag, the
851 .debug_str section will also receive the READONLY flag and the
852 .debug_ranges and .debug_aranges sections will have their address set to
853 0x1000. (This may not make much sense, but it is just an example).
855 When adding the section name patterns to the section list we need to make
856 sure that previous entries do not match with the new entry, unless the
857 match is exact. (In which case we assume that the user is overriding
858 the previous entry with the new context).
860 When matching real section names to the section list we make use of the
861 wildcard characters, but we must do so in context. Eg if we are setting
862 section addresses then we match for .debug_ranges but not for .debug_info.
864 Finally, if ADD is false and we do find a match, we mark the section list
867 static struct section_list *
868 find_section_list (const char *name, bfd_boolean add, unsigned int context)
870 struct section_list *p, *match = NULL;
872 /* assert ((context & ((1 << 7) - 1)) != 0); */
874 for (p = change_sections; p != NULL; p = p->next)
878 if (strcmp (p->pattern, name) == 0)
880 /* Check for context conflicts. */
881 if (((p->context & SECTION_CONTEXT_REMOVE)
882 && (context & SECTION_CONTEXT_COPY))
883 || ((context & SECTION_CONTEXT_REMOVE)
884 && (p->context & SECTION_CONTEXT_COPY)))
885 fatal (_("error: %s both copied and removed"), name);
887 if (((p->context & SECTION_CONTEXT_SET_VMA)
888 && (context & SECTION_CONTEXT_ALTER_VMA))
889 || ((context & SECTION_CONTEXT_SET_VMA)
890 && (context & SECTION_CONTEXT_ALTER_VMA)))
891 fatal (_("error: %s both sets and alters VMA"), name);
893 if (((p->context & SECTION_CONTEXT_SET_LMA)
894 && (context & SECTION_CONTEXT_ALTER_LMA))
895 || ((context & SECTION_CONTEXT_SET_LMA)
896 && (context & SECTION_CONTEXT_ALTER_LMA)))
897 fatal (_("error: %s both sets and alters LMA"), name);
899 /* Extend the context. */
900 p->context |= context;
904 /* If we are not adding a new name/pattern then
905 only check for a match if the context applies. */
906 else if (p->context & context)
908 /* We could check for the presence of wildchar characters
909 first and choose between calling strcmp and fnmatch,
910 but is that really worth it ? */
911 if (p->pattern [0] == '!')
913 if (fnmatch (p->pattern + 1, name, 0) == 0)
921 if (fnmatch (p->pattern, name, 0) == 0)
937 p = (struct section_list *) xmalloc (sizeof (struct section_list));
940 p->context = context;
944 p->next = change_sections;
950 /* There is htab_hash_string but no htab_eq_string. Makes sense. */
953 eq_string (const void *s1, const void *s2)
955 return strcmp ((const char *) s1, (const char *) s2) == 0;
959 create_symbol_htab (void)
961 return htab_create_alloc (16, htab_hash_string, eq_string, NULL, xcalloc, free);
965 create_symbol_htabs (void)
967 strip_specific_htab = create_symbol_htab ();
968 strip_unneeded_htab = create_symbol_htab ();
969 keep_specific_htab = create_symbol_htab ();
970 localize_specific_htab = create_symbol_htab ();
971 globalize_specific_htab = create_symbol_htab ();
972 keepglobal_specific_htab = create_symbol_htab ();
973 weaken_specific_htab = create_symbol_htab ();
976 /* Add a symbol to strip_specific_list. */
979 add_specific_symbol (const char *name, htab_t htab)
981 *htab_find_slot (htab, name, INSERT) = (char *) name;
984 /* Add symbols listed in `filename' to strip_specific_list. */
986 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
987 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
990 add_specific_symbols (const char *filename, htab_t htab)
996 unsigned int line_count;
998 size = get_file_size (filename);
1005 buffer = (char *) xmalloc (size + 2);
1006 f = fopen (filename, FOPEN_RT);
1008 fatal (_("cannot open '%s': %s"), filename, strerror (errno));
1010 if (fread (buffer, 1, size, f) == 0 || ferror (f))
1011 fatal (_("%s: fread failed"), filename);
1014 buffer [size] = '\n';
1015 buffer [size + 1] = '\0';
1019 for (line = buffer; * line != '\0'; line ++)
1024 int finished = FALSE;
1026 for (eol = line;; eol ++)
1032 /* Cope with \n\r. */
1040 /* Cope with \r\n. */
1051 /* Line comment, Terminate the line here, in case a
1052 name is present and then allow the rest of the
1053 loop to find the real end of the line. */
1065 /* A name may now exist somewhere between 'line' and 'eol'.
1066 Strip off leading whitespace and trailing whitespace,
1067 then add it to the list. */
1068 for (name = line; IS_WHITESPACE (* name); name ++)
1070 for (name_end = name;
1071 (! IS_WHITESPACE (* name_end))
1072 && (! IS_LINE_TERMINATOR (* name_end));
1076 if (! IS_LINE_TERMINATOR (* name_end))
1080 for (extra = name_end + 1; IS_WHITESPACE (* extra); extra ++)
1083 if (! IS_LINE_TERMINATOR (* extra))
1084 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
1085 filename, line_count);
1090 if (name_end > name)
1091 add_specific_symbol (name, htab);
1093 /* Advance line pointer to end of line. The 'eol ++' in the for
1094 loop above will then advance us to the start of the next line. */
1100 /* See whether a symbol should be stripped or kept
1101 based on strip_specific_list and keep_symbols. */
1104 is_specified_symbol_predicate (void **slot, void *data)
1106 struct is_specified_symbol_predicate_data *d =
1107 (struct is_specified_symbol_predicate_data *) data;
1108 const char *slot_name = (char *) *slot;
1110 if (*slot_name != '!')
1112 if (! fnmatch (slot_name, d->name, 0))
1115 /* Continue traversal, there might be a non-match rule. */
1121 if (! fnmatch (slot_name + 1, d->name, 0))
1124 /* Stop traversal. */
1129 /* Continue traversal. */
1134 is_specified_symbol (const char *name, htab_t htab)
1138 struct is_specified_symbol_predicate_data data;
1143 htab_traverse (htab, is_specified_symbol_predicate, &data);
1148 return htab_find (htab, name) != NULL;
1151 /* Return a pointer to the symbol used as a signature for GROUP. */
1154 group_signature (asection *group)
1156 bfd *abfd = group->owner;
1157 Elf_Internal_Shdr *ghdr;
1159 /* PR 20089: An earlier error may have prevented us from loading the symbol table. */
1163 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
1166 ghdr = &elf_section_data (group)->this_hdr;
1167 if (ghdr->sh_link < elf_numsections (abfd))
1169 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1170 Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link];
1172 if (symhdr->sh_type == SHT_SYMTAB
1173 && ghdr->sh_info > 0
1174 && ghdr->sh_info < (symhdr->sh_size / bed->s->sizeof_sym))
1175 return isympp[ghdr->sh_info - 1];
1180 /* Return TRUE if the section is a DWO section. */
1183 is_dwo_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1185 const char *name = bfd_get_section_name (abfd, sec);
1186 int len = strlen (name);
1188 return strncmp (name + len - 4, ".dwo", 4) == 0;
1191 /* Return TRUE if section SEC is in the update list. */
1194 is_update_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1196 if (update_sections != NULL)
1198 struct section_add *pupdate;
1200 for (pupdate = update_sections;
1202 pupdate = pupdate->next)
1204 if (strcmp (sec->name, pupdate->name) == 0)
1213 is_merged_note_section (bfd * abfd, asection * sec)
1216 && bfd_get_flavour (abfd) == bfd_target_elf_flavour
1217 && elf_section_data (sec)->this_hdr.sh_type == SHT_NOTE
1218 /* FIXME: We currently only support merging GNU_BUILD_NOTEs.
1219 We should add support for more note types. */
1220 && elf_section_data (sec)->this_hdr.sh_flags & SHF_GNU_BUILD_NOTE)
1226 /* See if a non-group section is being removed. */
1229 is_strip_section_1 (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1231 if (sections_removed || sections_copied)
1233 struct section_list *p;
1234 struct section_list *q;
1236 p = find_section_list (bfd_get_section_name (abfd, sec), FALSE,
1237 SECTION_CONTEXT_REMOVE);
1238 q = find_section_list (bfd_get_section_name (abfd, sec), FALSE,
1239 SECTION_CONTEXT_COPY);
1242 fatal (_("error: section %s matches both remove and copy options"),
1243 bfd_get_section_name (abfd, sec));
1244 if (p && is_update_section (abfd, sec))
1245 fatal (_("error: section %s matches both update and remove options"),
1246 bfd_get_section_name (abfd, sec));
1250 if (sections_copied && q == NULL)
1254 if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
1256 if (strip_symbols == STRIP_DEBUG
1257 || strip_symbols == STRIP_UNNEEDED
1258 || strip_symbols == STRIP_ALL
1259 || discard_locals == LOCALS_ALL
1260 || convert_debugging)
1262 /* By default we don't want to strip .reloc section.
1263 This section has for pe-coff special meaning. See
1264 pe-dll.c file in ld, and peXXigen.c in bfd for details. */
1265 if (strcmp (bfd_get_section_name (abfd, sec), ".reloc") != 0)
1269 if (strip_symbols == STRIP_DWO)
1270 return is_dwo_section (abfd, sec);
1272 if (strip_symbols == STRIP_NONDEBUG)
1276 if (strip_symbols == STRIP_NONDWO)
1277 return !is_dwo_section (abfd, sec);
1282 /* See if a section is being removed. */
1285 is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1287 if (is_strip_section_1 (abfd, sec))
1290 if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0)
1294 asection *elt, *first;
1297 If we are going to strip the group signature symbol, then
1298 strip the group section too. */
1299 gsym = group_signature (sec);
1304 if ((strip_symbols == STRIP_ALL
1305 && !is_specified_symbol (gname, keep_specific_htab))
1306 || is_specified_symbol (gname, strip_specific_htab))
1309 /* Remove the group section if all members are removed. */
1310 first = elt = elf_next_in_group (sec);
1313 if (!is_strip_section_1 (abfd, elt))
1315 elt = elf_next_in_group (elt);
1327 is_nondebug_keep_contents_section (bfd *ibfd, asection *isection)
1329 /* Always keep ELF note sections. */
1330 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
1331 return (elf_section_type (isection) == SHT_NOTE);
1333 /* Always keep the .buildid section for PE/COFF.
1335 Strictly, this should be written "always keep the section storing the debug
1336 directory", but that may be the .text section for objects produced by some
1337 tools, which it is not sensible to keep. */
1338 if (ibfd->xvec->flavour == bfd_target_coff_flavour)
1339 return (strcmp (bfd_get_section_name (ibfd, isection), ".buildid") == 0);
1344 /* Return true if SYM is a hidden symbol. */
1347 is_hidden_symbol (asymbol *sym)
1349 elf_symbol_type *elf_sym;
1351 elf_sym = elf_symbol_from (sym->the_bfd, sym);
1352 if (elf_sym != NULL)
1353 switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
1363 need_sym_before (struct addsym_node **node, const char *sym)
1366 struct addsym_node *ptr = add_sym_list;
1368 /* 'othersym' symbols are at the front of the list. */
1369 for (count = 0; count < add_symbols; count++)
1373 else if (strcmp (ptr->othersym, sym) == 0)
1375 free (ptr->othersym);
1376 ptr->othersym = ""; /* Empty name is hopefully never a valid symbol name. */
1386 create_new_symbol (struct addsym_node *ptr, bfd *obfd)
1388 asymbol *sym = bfd_make_empty_symbol (obfd);
1390 bfd_asymbol_name (sym) = ptr->symdef;
1391 sym->value = ptr->symval;
1392 sym->flags = ptr->flags;
1395 asection *sec = bfd_get_section_by_name (obfd, ptr->section);
1397 fatal (_("Section %s not found"), ptr->section);
1401 sym->section = bfd_abs_section_ptr;
1405 /* Choose which symbol entries to copy; put the result in OSYMS.
1406 We don't copy in place, because that confuses the relocs.
1407 Return the number of symbols to print. */
1410 filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
1411 asymbol **isyms, long symcount)
1413 asymbol **from = isyms, **to = osyms;
1414 long src_count = 0, dst_count = 0;
1415 int relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
1417 for (; src_count < symcount; src_count++)
1419 asymbol *sym = from[src_count];
1420 flagword flags = sym->flags;
1421 char *name = (char *) bfd_asymbol_name (sym);
1423 bfd_boolean used_in_reloc = FALSE;
1424 bfd_boolean undefined;
1425 bfd_boolean rem_leading_char;
1426 bfd_boolean add_leading_char;
1428 undefined = bfd_is_und_section (bfd_get_section (sym));
1432 struct addsym_node *ptr;
1434 if (need_sym_before (&ptr, name))
1435 to[dst_count++] = create_new_symbol (ptr, obfd);
1438 if (redefine_sym_list || section_rename_list)
1442 new_name = (char *) lookup_sym_redefinition (name);
1443 if (new_name == name
1444 && (flags & BSF_SECTION_SYM) != 0)
1445 new_name = (char *) find_section_rename (name, NULL);
1446 bfd_asymbol_name (sym) = new_name;
1450 /* Check if we will remove the current leading character. */
1452 (name[0] == bfd_get_symbol_leading_char (abfd))
1453 && (change_leading_char
1454 || (remove_leading_char
1455 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1457 || bfd_is_com_section (bfd_get_section (sym)))));
1459 /* Check if we will add a new leading character. */
1462 && (bfd_get_symbol_leading_char (obfd) != '\0')
1463 && (bfd_get_symbol_leading_char (abfd) == '\0'
1464 || (name[0] == bfd_get_symbol_leading_char (abfd)));
1466 /* Short circuit for change_leading_char if we can do it in-place. */
1467 if (rem_leading_char && add_leading_char && !prefix_symbols_string)
1469 name[0] = bfd_get_symbol_leading_char (obfd);
1470 bfd_asymbol_name (sym) = name;
1471 rem_leading_char = FALSE;
1472 add_leading_char = FALSE;
1475 /* Remove leading char. */
1476 if (rem_leading_char)
1477 bfd_asymbol_name (sym) = ++name;
1479 /* Add new leading char and/or prefix. */
1480 if (add_leading_char || prefix_symbols_string)
1484 ptr = n = (char *) xmalloc (1 + strlen (prefix_symbols_string)
1485 + strlen (name) + 1);
1486 if (add_leading_char)
1487 *ptr++ = bfd_get_symbol_leading_char (obfd);
1489 if (prefix_symbols_string)
1491 strcpy (ptr, prefix_symbols_string);
1492 ptr += strlen (prefix_symbols_string);
1496 bfd_asymbol_name (sym) = n;
1500 if (strip_symbols == STRIP_ALL)
1502 else if ((flags & BSF_KEEP) != 0 /* Used in relocation. */
1503 || ((flags & BSF_SECTION_SYM) != 0
1504 && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
1508 used_in_reloc = TRUE;
1510 else if (relocatable /* Relocatable file. */
1511 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1512 || bfd_is_com_section (bfd_get_section (sym))))
1514 else if (bfd_decode_symclass (sym) == 'I')
1515 /* Global symbols in $idata sections need to be retained
1516 even if relocatable is FALSE. External users of the
1517 library containing the $idata section may reference these
1520 else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */
1521 || (flags & BSF_WEAK) != 0
1523 || bfd_is_com_section (bfd_get_section (sym)))
1524 keep = strip_symbols != STRIP_UNNEEDED;
1525 else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */
1526 keep = (strip_symbols != STRIP_DEBUG
1527 && strip_symbols != STRIP_UNNEEDED
1528 && ! convert_debugging);
1529 else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym)))
1530 /* COMDAT sections store special information in local
1531 symbols, so we cannot risk stripping any of them. */
1533 else /* Local symbol. */
1534 keep = (strip_symbols != STRIP_UNNEEDED
1535 && (discard_locals != LOCALS_ALL
1536 && (discard_locals != LOCALS_START_L
1537 || ! bfd_is_local_label (abfd, sym))));
1539 if (keep && is_specified_symbol (name, strip_specific_htab))
1541 /* There are multiple ways to set 'keep' above, but if it
1542 was the relocatable symbol case, then that's an error. */
1545 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name);
1553 && !(flags & BSF_KEEP)
1554 && is_specified_symbol (name, strip_unneeded_htab))
1558 && ((keep_file_symbols && (flags & BSF_FILE))
1559 || is_specified_symbol (name, keep_specific_htab)))
1562 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
1567 if ((flags & BSF_GLOBAL) != 0
1568 && (weaken || is_specified_symbol (name, weaken_specific_htab)))
1570 sym->flags &= ~ BSF_GLOBAL;
1571 sym->flags |= BSF_WEAK;
1575 && (flags & (BSF_GLOBAL | BSF_WEAK))
1576 && (is_specified_symbol (name, localize_specific_htab)
1577 || (htab_elements (keepglobal_specific_htab) != 0
1578 && ! is_specified_symbol (name, keepglobal_specific_htab))
1579 || (localize_hidden && is_hidden_symbol (sym))))
1581 sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
1582 sym->flags |= BSF_LOCAL;
1586 && (flags & BSF_LOCAL)
1587 && is_specified_symbol (name, globalize_specific_htab))
1589 sym->flags &= ~ BSF_LOCAL;
1590 sym->flags |= BSF_GLOBAL;
1593 to[dst_count++] = sym;
1598 struct addsym_node *ptr = add_sym_list;
1600 for (src_count = 0; src_count < add_symbols; src_count++)
1604 if (strcmp (ptr->othersym, ""))
1605 fatal (_("'before=%s' not found"), ptr->othersym);
1608 to[dst_count++] = create_new_symbol (ptr, obfd);
1614 to[dst_count] = NULL;
1619 /* Find the redefined name of symbol SOURCE. */
1622 lookup_sym_redefinition (const char *source)
1624 struct redefine_node *list;
1626 for (list = redefine_sym_list; list != NULL; list = list->next)
1627 if (strcmp (source, list->source) == 0)
1628 return list->target;
1633 /* Add a node to a symbol redefine list. */
1636 redefine_list_append (const char *cause, const char *source, const char *target)
1638 struct redefine_node **p;
1639 struct redefine_node *list;
1640 struct redefine_node *new_node;
1642 for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next)
1644 if (strcmp (source, list->source) == 0)
1645 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1648 if (strcmp (target, list->target) == 0)
1649 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1653 new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node));
1655 new_node->source = strdup (source);
1656 new_node->target = strdup (target);
1657 new_node->next = NULL;
1662 /* Handle the --redefine-syms option. Read lines containing "old new"
1663 from the file, and add them to the symbol redefine list. */
1666 add_redefine_syms_file (const char *filename)
1675 file = fopen (filename, "r");
1677 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1678 filename, strerror (errno));
1681 buf = (char *) xmalloc (bufsize + 1 /* For the terminating NUL. */);
1689 /* Collect the input symbol name. */
1690 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1698 buf = (char *) xrealloc (buf, bufsize + 1);
1706 /* Eat white space between the symbol names. */
1707 while (IS_WHITESPACE (c))
1709 if (c == '#' || IS_LINE_TERMINATOR (c))
1714 /* Collect the output symbol name. */
1716 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1724 buf = (char *) xrealloc (buf, bufsize + 1);
1732 /* Eat white space at end of line. */
1733 while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c))
1738 if ((c == '\r' && (c = getc (file)) == '\n')
1739 || c == '\n' || c == EOF)
1742 /* Append the redefinition to the list. */
1744 redefine_list_append (filename, &buf[0], &buf[outsym_off]);
1755 fatal (_("%s:%d: garbage found at end of line"), filename, lineno);
1757 if (len != 0 && (outsym_off == 0 || outsym_off == len))
1758 fatal (_("%s:%d: missing new symbol name"), filename, lineno);
1761 /* Eat the rest of the line and finish it. */
1762 while (c != '\n' && c != EOF)
1768 fatal (_("%s:%d: premature end of file"), filename, lineno);
1773 /* Copy unknown object file IBFD onto OBFD.
1774 Returns TRUE upon success, FALSE otherwise. */
1777 copy_unknown_object (bfd *ibfd, bfd *obfd)
1785 if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1787 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1794 non_fatal (_("stat returns negative size for `%s'"),
1795 bfd_get_archive_filename (ibfd));
1799 if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1801 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1806 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1807 bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1809 cbuf = (char *) xmalloc (BUFSIZE);
1811 while (ncopied < size)
1813 tocopy = size - ncopied;
1814 if (tocopy > BUFSIZE)
1817 if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1818 != (bfd_size_type) tocopy)
1820 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1825 if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1826 != (bfd_size_type) tocopy)
1828 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1836 /* We should at least to be able to read it back when copying an
1837 unknown object in an archive. */
1838 chmod (bfd_get_filename (obfd), buf.st_mode | S_IRUSR);
1843 /* Merge the notes on SEC, removing redundant entries.
1844 Returns the new, smaller size of the section upon success. */
1846 static bfd_size_type
1847 merge_gnu_build_notes (bfd * abfd, asection * sec, bfd_size_type size, bfd_byte * contents)
1849 Elf_Internal_Note * pnotes_end;
1850 Elf_Internal_Note * pnotes;
1851 Elf_Internal_Note * pnote;
1852 bfd_size_type remain = size;
1853 unsigned version_notes_seen = 0;
1854 bfd_boolean duplicate_found = FALSE;
1855 const char * err = NULL;
1856 bfd_byte * in = contents;
1858 /* Make a copy of the notes.
1859 Minimum size of a note is 12 bytes. */
1860 pnote = pnotes = (Elf_Internal_Note *) xmalloc ((size / 12) * sizeof (Elf_Internal_Note));
1861 while (remain >= 12)
1863 pnote->namesz = (bfd_get_32 (abfd, in ) + 3) & ~3;
1864 pnote->descsz = (bfd_get_32 (abfd, in + 4) + 3) & ~3;
1865 pnote->type = bfd_get_32 (abfd, in + 8);
1867 if (pnote->type != NT_GNU_BUILD_ATTRIBUTE_OPEN
1868 && pnote->type != NT_GNU_BUILD_ATTRIBUTE_FUNC)
1870 err = _("corrupt GNU build attribute note: wrong note type");
1874 if (pnote->namesz + pnote->descsz + 12 > remain)
1876 err = _("corrupt GNU build attribute note: note too big");
1880 if (pnote->namesz < 2)
1882 err = _("corrupt GNU build attribute note: name too small");
1886 if (pnote->descsz != 0
1887 && pnote->descsz != 4
1888 && pnote->descsz != 8)
1890 err = _("corrupt GNU build attribute note: bad description size");
1894 pnote->namedata = (char *)(in + 12);
1895 pnote->descdata = (char *)(in + 12 + pnote->namesz);
1897 remain -= 12 + pnote->namesz + pnote->descsz;
1898 in += 12 + pnote->namesz + pnote->descsz;
1900 if (pnote->namesz > 1 && pnote->namedata[1] == GNU_BUILD_ATTRIBUTE_VERSION)
1901 ++ version_notes_seen;
1907 /* Check that the notes are valid. */
1910 err = _("corrupt GNU build attribute notes: data at end");
1914 if (version_notes_seen == 0)
1916 err = _("bad GNU build attribute notes: no version note");
1920 /* Merging is only needed if there is more than one version note... */
1921 if (version_notes_seen == 1)
1924 /* The first note should be the first version note. */
1925 if (pnotes[0].namedata[1] != GNU_BUILD_ATTRIBUTE_VERSION)
1927 err = _("bad GNU build attribute notes: first note not version note");
1931 if (pnotes[0].namedata[0] != GNU_BUILD_ATTRIBUTE_TYPE_STRING
1932 || strcmp (pnotes[0].namedata + 2, "1") != 0)
1934 err = _("bad GNU build attribute notes: version note not v1");
1938 /* Now merge the notes. The rules are:
1939 1. Preserve the ordering of the notes.
1940 2. Preserve any NT_GNU_BUILD_ATTRIBUTE_FUNC notes.
1941 3. Eliminate any NT_GNU_BUILD_ATTRIBUTE_OPEN notes that have the same
1942 full name field as the immediately preceeding note with the same type
1944 4. If an NT_GNU_BUILD_ATTRIBUTE_OPEN note is going to be preserved and
1945 its description field is empty then the nearest preceeding OPEN note
1946 with a non-empty description field must also be preserved *OR* the
1947 description field of the note must be changed to contain the starting
1948 address to which it refers. */
1949 for (pnote = pnotes + 1; pnote < pnotes_end; pnote ++)
1951 Elf_Internal_Note * back;
1952 Elf_Internal_Note * prev_open = NULL;
1954 if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC)
1957 /* Scan for duplicates. Clear the type field of any found - but do not
1958 delete them just yet. */
1959 for (back = pnote - 1; back >= pnotes; back --)
1961 if (back->descsz > 0
1962 && back->type != NT_GNU_BUILD_ATTRIBUTE_FUNC
1963 && prev_open == NULL)
1966 if (back->type == pnote->type
1967 && back->namedata[1] == pnote->namedata[1])
1969 if (back->namesz == pnote->namesz
1970 && memcmp (back->namedata, pnote->namedata, back->namesz) == 0)
1972 duplicate_found = TRUE;
1977 /* If we have found an attribute match then stop searching backwards. */
1978 if (! ISPRINT (back->namedata[1])
1979 || strcmp (back->namedata + 2, pnote->namedata + 2) == 0)
1981 /* Since we are keeping this note we must check to see if its
1982 description refers back to an earlier OPEN note. If so
1983 then we must make sure that version note is also preserved. */
1984 if (pnote->descsz == 0
1985 && prev_open != NULL
1986 && prev_open->type == 0)
1987 prev_open->type = NT_GNU_BUILD_ATTRIBUTE_FUNC;
1995 if (duplicate_found)
1997 bfd_byte * new_contents;
2000 bfd_size_type new_size;
2001 arelent ** relpp = NULL;
2005 relsize = bfd_get_reloc_upper_bound (abfd, sec);
2008 /* If there are relocs associated with this section then we may
2009 have to adjust them as well, as we remove notes. */
2010 relpp = (arelent **) xmalloc (relsize);
2011 relcount = bfd_canonicalize_reloc (abfd, sec, relpp, isympp);
2013 /* Do not bother complaining here - copy_relocations_in_section
2014 will do that for us. */
2018 /* Eliminate the duplicates. */
2019 new = new_contents = xmalloc (size);
2020 for (pnote = pnotes, old = contents;
2024 bfd_size_type note_size = 12 + pnote->namesz + pnote->descsz;
2026 if (pnote->type == 0)
2032 /* If there is a reloc at the current offset, delete it.
2033 Adjust the location of any relocs above the current
2034 location downwards by the size of the note being deleted.
2035 FIXME: We could optimize this loop by retaining a pointer to
2036 the last reloc below the current note. */
2037 for (rel = relpp; rel < relpp + relcount; rel ++)
2039 if ((* rel)->howto == NULL)
2041 if ((* rel)->address < (bfd_vma) (new - new_contents))
2043 if ((* rel)->address >= (bfd_vma) ((new + note_size) - new_contents))
2044 (* rel)->address -= note_size;
2046 (* rel)->howto = NULL;
2052 memcpy (new, old, note_size);
2059 new_size = new - new_contents;
2060 memcpy (contents, new_contents, new_size);
2062 free (new_contents);
2068 for (rel = relpp; rel < relpp + relcount; rel ++)
2069 if ((* rel)->howto == NULL)
2071 /* Delete eliminated relocs.
2072 FIXME: There are better ways to do this. */
2073 memmove (rel, rel + 1, ((relcount - (rel - relpp)) - 1) * sizeof (* rel));
2076 bfd_set_reloc (abfd, sec, relpp, relcount);
2083 bfd_set_error (bfd_error_bad_value);
2084 bfd_nonfatal_message (NULL, abfd, sec, err);
2092 /* Copy object file IBFD onto OBFD.
2093 Returns TRUE upon success, FALSE otherwise. */
2096 copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
2100 asection **osections = NULL;
2102 asection *gnu_debuglink_section = NULL;
2103 bfd_size_type *gaps = NULL;
2104 bfd_size_type max_gap = 0;
2107 enum bfd_architecture iarch;
2111 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
2112 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
2113 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2115 /* PR 17636: Call non-fatal so that we return to our parent who
2116 may need to tidy temporary files. */
2117 non_fatal (_("Unable to change endianness of input file(s)"));
2121 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2123 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
2127 if (ibfd->sections == NULL)
2129 non_fatal (_("error: the input file '%s' has no sections"),
2130 bfd_get_archive_filename (ibfd));
2134 if (ibfd->xvec->flavour != bfd_target_elf_flavour)
2136 if ((do_debug_sections & compress) != 0
2137 && do_debug_sections != compress)
2139 non_fatal (_("--compress-debug-sections=[zlib|zlib-gnu|zlib-gabi] is unsupported on `%s'"),
2140 bfd_get_archive_filename (ibfd));
2144 if (do_elf_stt_common)
2146 non_fatal (_("--elf-stt-common=[yes|no] is unsupported on `%s'"),
2147 bfd_get_archive_filename (ibfd));
2153 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
2154 bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
2155 bfd_get_filename (obfd), bfd_get_target (obfd));
2164 start = bfd_get_start_address (ibfd);
2165 start += change_start;
2168 /* Neither the start address nor the flags
2169 need to be set for a core file. */
2170 if (bfd_get_format (obfd) != bfd_core)
2174 flags = bfd_get_file_flags (ibfd);
2175 flags |= bfd_flags_to_set;
2176 flags &= ~bfd_flags_to_clear;
2177 flags &= bfd_applicable_file_flags (obfd);
2179 if (strip_symbols == STRIP_ALL)
2180 flags &= ~HAS_RELOC;
2182 if (!bfd_set_start_address (obfd, start)
2183 || !bfd_set_file_flags (obfd, flags))
2185 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2190 /* Copy architecture of input file to output file. */
2191 iarch = bfd_get_arch (ibfd);
2192 imach = bfd_get_mach (ibfd);
2195 if (bfd_get_arch_info (ibfd) == NULL
2196 || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown)
2198 iarch = input_arch->arch;
2199 imach = input_arch->mach;
2202 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
2203 bfd_get_archive_filename (ibfd));
2205 if (!bfd_set_arch_mach (obfd, iarch, imach)
2206 && (ibfd->target_defaulted
2207 || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
2209 if (bfd_get_arch (ibfd) == bfd_arch_unknown)
2210 non_fatal (_("Unable to recognise the format of the input file `%s'"),
2211 bfd_get_archive_filename (ibfd));
2213 non_fatal (_("Output file cannot represent architecture `%s'"),
2214 bfd_printable_arch_mach (bfd_get_arch (ibfd),
2215 bfd_get_mach (ibfd)));
2219 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2221 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2225 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2226 && bfd_pei_p (obfd))
2228 /* Set up PE parameters. */
2229 pe_data_type *pe = pe_data (obfd);
2231 /* Copy PE parameters before changing them. */
2232 if (ibfd->xvec->flavour == bfd_target_coff_flavour
2233 && bfd_pei_p (ibfd))
2234 pe->pe_opthdr = pe_data (ibfd)->pe_opthdr;
2236 if (pe_file_alignment != (bfd_vma) -1)
2237 pe->pe_opthdr.FileAlignment = pe_file_alignment;
2239 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
2241 if (pe_heap_commit != (bfd_vma) -1)
2242 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_commit;
2244 if (pe_heap_reserve != (bfd_vma) -1)
2245 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_reserve;
2247 if (pe_image_base != (bfd_vma) -1)
2248 pe->pe_opthdr.ImageBase = pe_image_base;
2250 if (pe_section_alignment != (bfd_vma) -1)
2251 pe->pe_opthdr.SectionAlignment = pe_section_alignment;
2253 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
2255 if (pe_stack_commit != (bfd_vma) -1)
2256 pe->pe_opthdr.SizeOfStackCommit = pe_stack_commit;
2258 if (pe_stack_reserve != (bfd_vma) -1)
2259 pe->pe_opthdr.SizeOfStackCommit = pe_stack_reserve;
2261 if (pe_subsystem != -1)
2262 pe->pe_opthdr.Subsystem = pe_subsystem;
2264 if (pe_major_subsystem_version != -1)
2265 pe->pe_opthdr.MajorSubsystemVersion = pe_major_subsystem_version;
2267 if (pe_minor_subsystem_version != -1)
2268 pe->pe_opthdr.MinorSubsystemVersion = pe_minor_subsystem_version;
2270 if (pe_file_alignment > pe_section_alignment)
2272 char file_alignment[20], section_alignment[20];
2274 sprintf_vma (file_alignment, pe_file_alignment);
2275 sprintf_vma (section_alignment, pe_section_alignment);
2276 non_fatal (_("warning: file alignment (0x%s) > section alignment (0x%s)"),
2278 file_alignment, section_alignment);
2285 if (osympp != isympp)
2291 symsize = bfd_get_symtab_upper_bound (ibfd);
2294 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2298 osympp = isympp = (asymbol **) xmalloc (symsize);
2299 symcount = bfd_canonicalize_symtab (ibfd, isympp);
2302 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2305 /* PR 17512: file: d6323821
2306 If the symbol table could not be loaded do not pretend that we have
2307 any symbols. This trips us up later on when we load the relocs. */
2311 osympp = isympp = NULL;
2314 /* BFD mandates that all output sections be created and sizes set before
2315 any output is done. Thus, we traverse all sections multiple times. */
2316 bfd_map_over_sections (ibfd, setup_section, obfd);
2318 if (!extract_symbol)
2319 setup_bfd_headers (ibfd, obfd);
2321 if (add_sections != NULL)
2323 struct section_add *padd;
2324 struct section_list *pset;
2326 for (padd = add_sections; padd != NULL; padd = padd->next)
2330 pset = find_section_list (padd->name, FALSE,
2331 SECTION_CONTEXT_SET_FLAGS);
2333 flags = pset->flags | SEC_HAS_CONTENTS;
2335 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
2337 /* bfd_make_section_with_flags() does not return very helpful
2338 error codes, so check for the most likely user error first. */
2339 if (bfd_get_section_by_name (obfd, padd->name))
2341 bfd_nonfatal_message (NULL, obfd, NULL,
2342 _("can't add section '%s'"), padd->name);
2347 /* We use LINKER_CREATED here so that the backend hooks
2348 will create any special section type information,
2349 instead of presuming we know what we're doing merely
2350 because we set the flags. */
2351 padd->section = bfd_make_section_with_flags
2352 (obfd, padd->name, flags | SEC_LINKER_CREATED);
2353 if (padd->section == NULL)
2355 bfd_nonfatal_message (NULL, obfd, NULL,
2356 _("can't create section `%s'"),
2362 if (! bfd_set_section_size (obfd, padd->section, padd->size))
2364 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2368 pset = find_section_list (padd->name, FALSE,
2369 SECTION_CONTEXT_SET_VMA | SECTION_CONTEXT_ALTER_VMA);
2371 && ! bfd_set_section_vma (obfd, padd->section, pset->vma_val))
2373 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2377 pset = find_section_list (padd->name, FALSE,
2378 SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_ALTER_LMA);
2381 padd->section->lma = pset->lma_val;
2383 if (! bfd_set_section_alignment
2384 (obfd, padd->section,
2385 bfd_section_alignment (obfd, padd->section)))
2387 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2394 if (update_sections != NULL)
2396 struct section_add *pupdate;
2398 for (pupdate = update_sections;
2400 pupdate = pupdate->next)
2402 pupdate->section = bfd_get_section_by_name (ibfd, pupdate->name);
2403 if (pupdate->section == NULL)
2405 non_fatal (_("error: %s not found, can't be updated"), pupdate->name);
2409 osec = pupdate->section->output_section;
2410 if (! bfd_set_section_size (obfd, osec, pupdate->size))
2412 bfd_nonfatal_message (NULL, obfd, osec, NULL);
2420 /* This palaver is necessary because we must set the output
2421 section size first, before its contents are ready. */
2422 osec = bfd_get_section_by_name (ibfd, GNU_BUILD_ATTRS_SECTION_NAME);
2423 if (osec && is_merged_note_section (ibfd, osec))
2427 size = bfd_get_section_size (osec);
2430 bfd_nonfatal_message (NULL, ibfd, osec, _("warning: note section is empty"));
2431 merge_notes = FALSE;
2433 else if (! bfd_get_full_section_contents (ibfd, osec, & merged_notes))
2435 bfd_nonfatal_message (NULL, ibfd, osec, _("warning: could not load note section"));
2436 free (merged_notes);
2437 merged_notes = NULL;
2438 merge_notes = FALSE;
2442 merged_size = merge_gnu_build_notes (ibfd, osec, size, merged_notes);
2443 if (merged_size == size)
2445 /* Merging achieves nothing. */
2446 free (merged_notes);
2447 merged_notes = NULL;
2448 merge_notes = FALSE;
2453 if (osec->output_section == NULL
2454 || ! bfd_set_section_size (obfd, osec->output_section, merged_size))
2456 bfd_nonfatal_message (NULL, obfd, osec, _("warning: failed to set merged notes size"));
2457 free (merged_notes);
2458 merged_notes = NULL;
2459 merge_notes = FALSE;
2467 if (dump_sections != NULL)
2469 struct section_add * pdump;
2471 for (pdump = dump_sections; pdump != NULL; pdump = pdump->next)
2473 osec = bfd_get_section_by_name (ibfd, pdump->name);
2476 bfd_nonfatal_message (NULL, ibfd, NULL,
2477 _("can't dump section '%s' - it does not exist"),
2482 if ((bfd_get_section_flags (ibfd, osec) & SEC_HAS_CONTENTS) == 0)
2484 bfd_nonfatal_message (NULL, ibfd, osec,
2485 _("can't dump section - it has no contents"));
2489 bfd_size_type size = bfd_get_section_size (osec);
2492 bfd_nonfatal_message (NULL, ibfd, osec,
2493 _("can't dump section - it is empty"));
2498 f = fopen (pdump->filename, FOPEN_WB);
2501 bfd_nonfatal_message (pdump->filename, NULL, NULL,
2502 _("could not open section dump file"));
2506 bfd_byte * contents = xmalloc (size);
2507 if (bfd_get_section_contents (ibfd, osec, contents, 0, size))
2509 if (fwrite (contents, 1, size, f) != size)
2511 non_fatal (_("error writing section contents to %s (error: %s)"),
2518 bfd_nonfatal_message (NULL, ibfd, osec,
2519 _("could not retrieve section contents"));
2526 if (gnu_debuglink_filename != NULL)
2528 /* PR 15125: Give a helpful warning message if
2529 the debuglink section already exists, and
2530 allow the rest of the copy to complete. */
2531 if (bfd_get_section_by_name (obfd, ".gnu_debuglink"))
2533 non_fatal (_("%s: debuglink section already exists"),
2534 bfd_get_filename (obfd));
2535 gnu_debuglink_filename = NULL;
2539 gnu_debuglink_section = bfd_create_gnu_debuglink_section
2540 (obfd, gnu_debuglink_filename);
2542 if (gnu_debuglink_section == NULL)
2544 bfd_nonfatal_message (NULL, obfd, NULL,
2545 _("cannot create debug link section `%s'"),
2546 gnu_debuglink_filename);
2550 /* Special processing for PE format files. We
2551 have no way to distinguish PE from COFF here. */
2552 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour)
2554 bfd_vma debuglink_vma;
2555 asection * highest_section;
2557 /* The PE spec requires that all sections be adjacent and sorted
2558 in ascending order of VMA. It also specifies that debug
2559 sections should be last. This is despite the fact that debug
2560 sections are not loaded into memory and so in theory have no
2563 This means that the debuglink section must be given a non-zero
2564 VMA which makes it contiguous with other debug sections. So
2565 walk the current section list, find the section with the
2566 highest VMA and start the debuglink section after that one. */
2567 for (osec = obfd->sections, highest_section = NULL;
2571 && (highest_section == NULL
2572 || osec->vma > highest_section->vma))
2573 highest_section = osec;
2575 if (highest_section)
2576 debuglink_vma = BFD_ALIGN (highest_section->vma
2577 + highest_section->size,
2578 /* FIXME: We ought to be using
2579 COFF_PAGE_SIZE here or maybe
2580 bfd_get_section_alignment() (if it
2581 was set) but since this is for PE
2582 and we know the required alignment
2583 it is easier just to hard code it. */
2586 /* Umm, not sure what to do in this case. */
2587 debuglink_vma = 0x1000;
2589 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
2594 c = bfd_count_sections (obfd);
2596 && (gap_fill_set || pad_to_set))
2600 /* We must fill in gaps between the sections and/or we must pad
2601 the last section to a specified address. We do this by
2602 grabbing a list of the sections, sorting them by VMA, and
2603 increasing the section sizes as required to fill the gaps.
2604 We write out the gap contents below. */
2606 osections = (asection **) xmalloc (c * sizeof (asection *));
2608 bfd_map_over_sections (obfd, get_sections, &set);
2610 qsort (osections, c, sizeof (asection *), compare_section_lma);
2612 gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type));
2613 memset (gaps, 0, c * sizeof (bfd_size_type));
2617 for (i = 0; i < c - 1; i++)
2621 bfd_vma gap_start, gap_stop;
2623 flags = bfd_get_section_flags (obfd, osections[i]);
2624 if ((flags & SEC_HAS_CONTENTS) == 0
2625 || (flags & SEC_LOAD) == 0)
2628 size = bfd_section_size (obfd, osections[i]);
2629 gap_start = bfd_section_lma (obfd, osections[i]) + size;
2630 gap_stop = bfd_section_lma (obfd, osections[i + 1]);
2631 if (gap_start < gap_stop)
2633 if (! bfd_set_section_size (obfd, osections[i],
2634 size + (gap_stop - gap_start)))
2636 bfd_nonfatal_message (NULL, obfd, osections[i],
2637 _("Can't fill gap after section"));
2641 gaps[i] = gap_stop - gap_start;
2642 if (max_gap < gap_stop - gap_start)
2643 max_gap = gap_stop - gap_start;
2653 lma = bfd_section_lma (obfd, osections[c - 1]);
2654 size = bfd_section_size (obfd, osections[c - 1]);
2655 if (lma + size < pad_to)
2657 if (! bfd_set_section_size (obfd, osections[c - 1],
2660 bfd_nonfatal_message (NULL, obfd, osections[c - 1],
2661 _("can't add padding"));
2666 gaps[c - 1] = pad_to - (lma + size);
2667 if (max_gap < pad_to - (lma + size))
2668 max_gap = pad_to - (lma + size);
2674 /* Symbol filtering must happen after the output sections
2675 have been created, but before their contents are set. */
2677 if (convert_debugging)
2678 dhandle = read_debugging_info (ibfd, isympp, symcount, FALSE);
2680 if (strip_symbols == STRIP_DEBUG
2681 || strip_symbols == STRIP_ALL
2682 || strip_symbols == STRIP_UNNEEDED
2683 || strip_symbols == STRIP_NONDEBUG
2684 || strip_symbols == STRIP_DWO
2685 || strip_symbols == STRIP_NONDWO
2686 || discard_locals != LOCALS_UNDEF
2688 || htab_elements (strip_specific_htab) != 0
2689 || htab_elements (keep_specific_htab) != 0
2690 || htab_elements (localize_specific_htab) != 0
2691 || htab_elements (globalize_specific_htab) != 0
2692 || htab_elements (keepglobal_specific_htab) != 0
2693 || htab_elements (weaken_specific_htab) != 0
2694 || prefix_symbols_string
2697 || convert_debugging
2698 || change_leading_char
2699 || remove_leading_char
2700 || redefine_sym_list
2701 || section_rename_list
2705 /* Mark symbols used in output relocations so that they
2706 are kept, even if they are local labels or static symbols.
2708 Note we iterate over the input sections examining their
2709 relocations since the relocations for the output sections
2710 haven't been set yet. mark_symbols_used_in_relocations will
2711 ignore input sections which have no corresponding output
2713 if (strip_symbols != STRIP_ALL)
2714 bfd_map_over_sections (ibfd,
2715 mark_symbols_used_in_relocations,
2717 osympp = (asymbol **) xmalloc ((symcount + add_symbols + 1) * sizeof (asymbol *));
2718 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
2721 if (convert_debugging && dhandle != NULL)
2723 if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
2730 bfd_set_symtab (obfd, osympp, symcount);
2732 /* This has to happen before section positions are set. */
2733 bfd_map_over_sections (ibfd, copy_relocations_in_section, obfd);
2735 /* This has to happen after the symbol table has been set. */
2736 bfd_map_over_sections (ibfd, copy_section, obfd);
2738 if (add_sections != NULL)
2740 struct section_add *padd;
2742 for (padd = add_sections; padd != NULL; padd = padd->next)
2744 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
2747 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2753 if (update_sections != NULL)
2755 struct section_add *pupdate;
2757 for (pupdate = update_sections;
2759 pupdate = pupdate->next)
2761 osec = pupdate->section->output_section;
2762 if (! bfd_set_section_contents (obfd, osec, pupdate->contents,
2765 bfd_nonfatal_message (NULL, obfd, osec, NULL);
2773 osec = bfd_get_section_by_name (obfd, GNU_BUILD_ATTRS_SECTION_NAME);
2774 if (osec && is_merged_note_section (obfd, osec))
2776 if (! bfd_set_section_contents (obfd, osec, merged_notes, 0, merged_size))
2778 bfd_nonfatal_message (NULL, obfd, osec, _("error: failed to copy merged notes into output"));
2783 bfd_nonfatal_message (NULL, obfd, osec, _("ICE: lost merged note section"));
2784 free (merged_notes);
2785 merged_notes = NULL;
2786 merge_notes = FALSE;
2789 if (gnu_debuglink_filename != NULL)
2791 if (! bfd_fill_in_gnu_debuglink_section
2792 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
2794 bfd_nonfatal_message (NULL, obfd, NULL,
2795 _("cannot fill debug link section `%s'"),
2796 gnu_debuglink_filename);
2801 if (gap_fill_set || pad_to_set)
2805 /* Fill in the gaps. */
2808 buf = (bfd_byte *) xmalloc (max_gap);
2809 memset (buf, gap_fill, max_gap);
2811 c = bfd_count_sections (obfd);
2812 for (i = 0; i < c; i++)
2820 off = bfd_section_size (obfd, osections[i]) - left;
2831 if (! bfd_set_section_contents (obfd, osections[i], buf,
2834 bfd_nonfatal_message (NULL, obfd, osections[i], NULL);
2845 /* Allow the BFD backend to copy any private data it understands
2846 from the input BFD to the output BFD. This is done last to
2847 permit the routine to look at the filtered symbol table, which is
2848 important for the ECOFF code at least. */
2849 if (! bfd_copy_private_bfd_data (ibfd, obfd))
2851 bfd_nonfatal_message (NULL, obfd, NULL,
2852 _("error copying private BFD data"));
2856 /* Switch to the alternate machine code. We have to do this at the
2857 very end, because we only initialize the header when we create
2858 the first section. */
2859 if (use_alt_mach_code != 0)
2861 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
2863 non_fatal (_("this target does not support %lu alternative machine codes"),
2865 if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
2867 non_fatal (_("treating that number as an absolute e_machine value instead"));
2868 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
2871 non_fatal (_("ignoring the alternative value"));
2878 /* Read each archive element in turn from IBFD, copy the
2879 contents to temp file, and keep the temp file handle.
2880 If 'force_output_target' is TRUE then make sure that
2881 all elements in the new archive are of the type
2885 copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
2886 bfd_boolean force_output_target,
2887 const bfd_arch_info_type *input_arch)
2891 struct name_list *next;
2895 bfd **ptr = &obfd->archive_head;
2898 const char *filename;
2900 /* Make a temp directory to hold the contents. */
2901 dir = make_tempdir (bfd_get_filename (obfd));
2903 fatal (_("cannot create tempdir for archive copying (error: %s)"),
2906 if (strip_symbols == STRIP_ALL)
2907 obfd->has_armap = FALSE;
2909 obfd->has_armap = ibfd->has_armap;
2910 obfd->is_thin_archive = ibfd->is_thin_archive;
2913 obfd->flags |= BFD_DETERMINISTIC_OUTPUT;
2917 this_element = bfd_openr_next_archived_file (ibfd, NULL);
2919 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2922 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
2923 goto cleanup_and_exit;
2926 while (!status && this_element != NULL)
2932 int stat_status = 0;
2933 bfd_boolean del = TRUE;
2934 bfd_boolean ok_object;
2936 /* PR binutils/17533: Do not allow directory traversal
2937 outside of the current directory tree by archive members. */
2938 if (! is_valid_archive_path (bfd_get_filename (this_element)))
2940 non_fatal (_("illegal pathname found in archive member: %s"),
2941 bfd_get_filename (this_element));
2943 goto cleanup_and_exit;
2946 /* Create an output file for this member. */
2947 output_name = concat (dir, "/",
2948 bfd_get_filename (this_element), (char *) 0);
2950 /* If the file already exists, make another temp dir. */
2951 if (stat (output_name, &buf) >= 0)
2953 output_name = make_tempdir (output_name);
2954 if (output_name == NULL)
2956 non_fatal (_("cannot create tempdir for archive copying (error: %s)"),
2959 goto cleanup_and_exit;
2962 l = (struct name_list *) xmalloc (sizeof (struct name_list));
2963 l->name = output_name;
2967 output_name = concat (output_name, "/",
2968 bfd_get_filename (this_element), (char *) 0);
2973 stat_status = bfd_stat_arch_elt (this_element, &buf);
2975 if (stat_status != 0)
2976 non_fatal (_("internal stat error on %s"),
2977 bfd_get_filename (this_element));
2980 l = (struct name_list *) xmalloc (sizeof (struct name_list));
2981 l->name = output_name;
2986 ok_object = bfd_check_format (this_element, bfd_object);
2988 bfd_nonfatal_message (NULL, this_element, NULL,
2989 _("Unable to recognise the format of file"));
2991 /* PR binutils/3110: Cope with archives
2992 containing multiple target types. */
2993 if (force_output_target || !ok_object)
2994 output_bfd = bfd_openw (output_name, output_target);
2996 output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
2998 if (output_bfd == NULL)
3000 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3002 goto cleanup_and_exit;
3007 del = !copy_object (this_element, output_bfd, input_arch);
3009 if (del && bfd_get_arch (this_element) == bfd_arch_unknown)
3010 /* Try again as an unknown object file. */
3012 else if (!bfd_close (output_bfd))
3014 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3015 /* Error in new object file. Don't change archive. */
3022 del = !copy_unknown_object (this_element, output_bfd);
3023 if (!bfd_close_all_done (output_bfd))
3025 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3026 /* Error in new object file. Don't change archive. */
3033 unlink (output_name);
3038 if (preserve_dates && stat_status == 0)
3039 set_times (output_name, &buf);
3041 /* Open the newly output file and attach to our list. */
3042 output_bfd = bfd_openr (output_name, output_target);
3044 l->obfd = output_bfd;
3047 ptr = &output_bfd->archive_next;
3049 last_element = this_element;
3051 this_element = bfd_openr_next_archived_file (ibfd, last_element);
3053 bfd_close (last_element);
3058 filename = bfd_get_filename (obfd);
3059 if (!bfd_close (obfd))
3062 bfd_nonfatal_message (filename, NULL, NULL, NULL);
3065 filename = bfd_get_filename (ibfd);
3066 if (!bfd_close (ibfd))
3069 bfd_nonfatal_message (filename, NULL, NULL, NULL);
3073 /* Delete all the files that we opened. */
3074 for (l = list; l != NULL; l = l->next)
3076 if (l->obfd == NULL)
3080 bfd_close (l->obfd);
3089 set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_handling style)
3091 /* This is only relevant to Coff targets. */
3092 if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
3095 && bfd_get_flavour (input_bfd) == bfd_target_coff_flavour)
3096 style = bfd_coff_long_section_names (input_bfd) ? ENABLE : DISABLE;
3097 bfd_coff_set_long_section_names (output_bfd, style != DISABLE);
3101 /* The top-level control. */
3104 copy_file (const char *input_filename, const char *output_filename,
3105 const char *input_target, const char *output_target,
3106 const bfd_arch_info_type *input_arch)
3109 char **obj_matching;
3110 char **core_matching;
3111 off_t size = get_file_size (input_filename);
3116 non_fatal (_("error: the input file '%s' is empty"),
3122 /* To allow us to do "strip *" without dying on the first
3123 non-object file, failures are nonfatal. */
3124 ibfd = bfd_openr (input_filename, input_target);
3127 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3132 switch (do_debug_sections)
3136 case compress_gnu_zlib:
3137 case compress_gabi_zlib:
3138 ibfd->flags |= BFD_COMPRESS;
3139 /* Don't check if input is ELF here since this information is
3140 only available after bfd_check_format_matches is called. */
3141 if (do_debug_sections != compress_gnu_zlib)
3142 ibfd->flags |= BFD_COMPRESS_GABI;
3145 ibfd->flags |= BFD_DECOMPRESS;
3151 switch (do_elf_stt_common)
3153 case elf_stt_common:
3154 ibfd->flags |= BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON;
3157 case no_elf_stt_common:
3158 ibfd->flags |= BFD_CONVERT_ELF_COMMON;
3164 if (bfd_check_format (ibfd, bfd_archive))
3166 bfd_boolean force_output_target;
3169 /* bfd_get_target does not return the correct value until
3170 bfd_check_format succeeds. */
3171 if (output_target == NULL)
3173 output_target = bfd_get_target (ibfd);
3174 force_output_target = FALSE;
3177 force_output_target = TRUE;
3179 obfd = bfd_openw (output_filename, output_target);
3182 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3186 /* This is a no-op on non-Coff targets. */
3187 set_long_section_mode (obfd, ibfd, long_section_names);
3189 copy_archive (ibfd, obfd, output_target, force_output_target, input_arch);
3191 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
3196 /* bfd_get_target does not return the correct value until
3197 bfd_check_format succeeds. */
3198 if (output_target == NULL)
3199 output_target = bfd_get_target (ibfd);
3201 obfd = bfd_openw (output_filename, output_target);
3204 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3208 /* This is a no-op on non-Coff targets. */
3209 set_long_section_mode (obfd, ibfd, long_section_names);
3211 if (! copy_object (ibfd, obfd, input_arch))
3214 /* PR 17512: file: 0f15796a.
3215 If the file could not be copied it may not be in a writeable
3216 state. So use bfd_close_all_done to avoid the possibility of
3217 writing uninitialised data into the file. */
3218 if (! (status ? bfd_close_all_done (obfd) : bfd_close (obfd)))
3221 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3225 if (!bfd_close (ibfd))
3228 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3234 bfd_error_type obj_error = bfd_get_error ();
3235 bfd_error_type core_error;
3237 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
3239 /* This probably can't happen.. */
3240 if (obj_error == bfd_error_file_ambiguously_recognized)
3241 free (obj_matching);
3245 core_error = bfd_get_error ();
3246 /* Report the object error in preference to the core error. */
3247 if (obj_error != core_error)
3248 bfd_set_error (obj_error);
3250 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3252 if (obj_error == bfd_error_file_ambiguously_recognized)
3254 list_matching_formats (obj_matching);
3255 free (obj_matching);
3257 if (core_error == bfd_error_file_ambiguously_recognized)
3259 list_matching_formats (core_matching);
3260 free (core_matching);
3267 /* Add a name to the section renaming list. */
3270 add_section_rename (const char * old_name, const char * new_name,
3273 section_rename * srename;
3275 /* Check for conflicts first. */
3276 for (srename = section_rename_list; srename != NULL; srename = srename->next)
3277 if (strcmp (srename->old_name, old_name) == 0)
3279 /* Silently ignore duplicate definitions. */
3280 if (strcmp (srename->new_name, new_name) == 0
3281 && srename->flags == flags)
3284 fatal (_("Multiple renames of section %s"), old_name);
3287 srename = (section_rename *) xmalloc (sizeof (* srename));
3289 srename->old_name = old_name;
3290 srename->new_name = new_name;
3291 srename->flags = flags;
3292 srename->next = section_rename_list;
3294 section_rename_list = srename;
3297 /* Check the section rename list for a new name of the input section
3298 called OLD_NAME. Returns the new name if one is found and sets
3299 RETURNED_FLAGS if non-NULL to the flags to be used for this section. */
3302 find_section_rename (const char *old_name, flagword *returned_flags)
3304 const section_rename *srename;
3306 for (srename = section_rename_list; srename != NULL; srename = srename->next)
3307 if (strcmp (srename->old_name, old_name) == 0)
3309 if (returned_flags != NULL && srename->flags != (flagword) -1)
3310 *returned_flags = srename->flags;
3312 return srename->new_name;
3318 /* Once each of the sections is copied, we may still need to do some
3319 finalization work for private section headers. Do that here. */
3322 setup_bfd_headers (bfd *ibfd, bfd *obfd)
3324 /* Allow the BFD backend to copy any private data it understands
3325 from the input section to the output section. */
3326 if (! bfd_copy_private_header_data (ibfd, obfd))
3329 bfd_nonfatal_message (NULL, ibfd, NULL,
3330 _("error in private header data"));
3334 /* All went well. */
3338 /* Create a section in OBFD with the same
3339 name and attributes as ISECTION in IBFD. */
3342 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
3344 bfd *obfd = (bfd *) obfdarg;
3345 struct section_list *p;
3353 char *prefix = NULL;
3354 bfd_boolean make_nobits;
3356 if (is_strip_section (ibfd, isection))
3359 /* Get the, possibly new, name of the output section. */
3360 name = bfd_section_name (ibfd, isection);
3361 flags = bfd_get_section_flags (ibfd, isection);
3362 name = find_section_rename (name, &flags);
3364 /* Prefix sections. */
3365 if ((prefix_alloc_sections_string)
3366 && (bfd_get_section_flags (ibfd, isection) & SEC_ALLOC))
3367 prefix = prefix_alloc_sections_string;
3368 else if (prefix_sections_string)
3369 prefix = prefix_sections_string;
3375 n = (char *) xmalloc (strlen (prefix) + strlen (name) + 1);
3381 make_nobits = FALSE;
3383 p = find_section_list (bfd_section_name (ibfd, isection), FALSE,
3384 SECTION_CONTEXT_SET_FLAGS);
3386 flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
3387 else if (strip_symbols == STRIP_NONDEBUG
3388 && (flags & (SEC_ALLOC | SEC_GROUP)) != 0
3389 && !is_nondebug_keep_contents_section (ibfd, isection))
3391 flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
3392 if (obfd->xvec->flavour == bfd_target_elf_flavour)
3396 /* Twiddle the input section flags so that it seems to
3397 elf.c:copy_private_bfd_data that section flags have not
3398 changed between input and output sections. This hack
3399 prevents wholesale rewriting of the program headers. */
3400 isection->flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
3404 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
3406 if (osection == NULL)
3408 err = _("failed to create output section");
3413 elf_section_type (osection) = SHT_NOBITS;
3415 size = bfd_section_size (ibfd, isection);
3416 size = bfd_convert_section_size (ibfd, isection, obfd, size);
3418 size = (size + interleave - 1) / interleave * copy_width;
3419 else if (extract_symbol)
3421 if (! bfd_set_section_size (obfd, osection, size))
3423 err = _("failed to set size");
3427 vma = bfd_section_vma (ibfd, isection);
3428 p = find_section_list (bfd_section_name (ibfd, isection), FALSE,
3429 SECTION_CONTEXT_ALTER_VMA | SECTION_CONTEXT_SET_VMA);
3432 if (p->context & SECTION_CONTEXT_SET_VMA)
3438 vma += change_section_address;
3440 if (! bfd_set_section_vma (obfd, osection, vma))
3442 err = _("failed to set vma");
3446 lma = isection->lma;
3447 p = find_section_list (bfd_section_name (ibfd, isection), FALSE,
3448 SECTION_CONTEXT_ALTER_LMA | SECTION_CONTEXT_SET_LMA);
3451 if (p->context & SECTION_CONTEXT_ALTER_LMA)
3457 lma += change_section_address;
3459 osection->lma = lma;
3461 /* FIXME: This is probably not enough. If we change the LMA we
3462 may have to recompute the header for the file as well. */
3463 if (!bfd_set_section_alignment (obfd,
3465 bfd_section_alignment (ibfd, isection)))
3467 err = _("failed to set alignment");
3471 /* Copy merge entity size. */
3472 osection->entsize = isection->entsize;
3474 /* Copy compress status. */
3475 osection->compress_status = isection->compress_status;
3477 /* This used to be mangle_section; we do here to avoid using
3478 bfd_get_section_by_name since some formats allow multiple
3479 sections with the same name. */
3480 isection->output_section = osection;
3481 isection->output_offset = 0;
3483 if ((isection->flags & SEC_GROUP) != 0)
3485 asymbol *gsym = group_signature (isection);
3489 gsym->flags |= BSF_KEEP;
3490 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
3491 elf_group_id (isection) = gsym;
3495 /* Allow the BFD backend to copy any private data it understands
3496 from the input section to the output section. */
3497 if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
3499 err = _("failed to copy private data");
3503 /* All went well. */
3508 bfd_nonfatal_message (NULL, obfd, osection, err);
3511 /* Return TRUE if input section ISECTION should be skipped. */
3514 skip_section (bfd *ibfd, sec_ptr isection, bfd_boolean skip_copy)
3520 /* If we have already failed earlier on,
3521 do not keep on generating complaints now. */
3528 if (is_strip_section (ibfd, isection))
3531 if (is_update_section (ibfd, isection))
3534 /* When merging a note section we skip the copying of the contents,
3535 but not the copying of the relocs associated with the contents. */
3536 if (skip_copy && is_merged_note_section (ibfd, isection))
3539 flags = bfd_get_section_flags (ibfd, isection);
3540 if ((flags & SEC_GROUP) != 0)
3543 osection = isection->output_section;
3544 size = bfd_get_section_size (isection);
3546 if (size == 0 || osection == 0)
3552 /* Add section SECTION_PATTERN to the list of sections that will have their
3553 relocations removed. */
3556 handle_remove_relocations_option (const char *section_pattern)
3558 find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE_RELOCS);
3561 /* Return TRUE if ISECTION from IBFD should have its relocations removed,
3562 otherwise return FALSE. If the user has requested that relocations be
3563 removed from a section that does not have relocations then this
3564 function will still return TRUE. */
3567 discard_relocations (bfd *ibfd ATTRIBUTE_UNUSED, asection *isection)
3569 return (find_section_list (bfd_section_name (ibfd, isection), FALSE,
3570 SECTION_CONTEXT_REMOVE_RELOCS) != NULL);
3573 /* Wrapper for dealing with --remove-section (-R) command line arguments.
3574 A special case is detected here, if the user asks to remove a relocation
3575 section (one starting with ".rela." or ".rel.") then this removal must
3576 be done using a different technique. */
3579 handle_remove_section_option (const char *section_pattern)
3581 if (strncmp (section_pattern, ".rela.", 6) == 0)
3582 handle_remove_relocations_option (section_pattern + 5);
3583 else if (strncmp (section_pattern, ".rel.", 5) == 0)
3584 handle_remove_relocations_option (section_pattern + 4);
3587 find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE);
3588 sections_removed = TRUE;
3592 /* Copy relocations in input section ISECTION of IBFD to an output
3593 section with the same name in OBFDARG. If stripping then don't
3594 copy any relocation info. */
3597 copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
3599 bfd *obfd = (bfd *) obfdarg;
3605 if (skip_section (ibfd, isection, FALSE))
3608 osection = isection->output_section;
3610 /* Core files and DWO files do not need to be relocated. */
3611 if (bfd_get_format (obfd) == bfd_core
3612 || strip_symbols == STRIP_NONDWO
3613 || discard_relocations (ibfd, isection))
3617 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
3621 /* Do not complain if the target does not support relocations. */
3622 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
3627 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
3635 bfd_set_reloc (obfd, osection, NULL, 0);
3636 osection->flags &= ~SEC_RELOC;
3640 relpp = (arelent **) xmalloc (relsize);
3641 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
3645 bfd_nonfatal_message (NULL, ibfd, isection,
3646 _("relocation count is negative"));
3650 if (strip_symbols == STRIP_ALL)
3652 /* Remove relocations which are not in
3653 keep_strip_specific_list. */
3654 arelent **temp_relpp;
3655 long temp_relcount = 0;
3658 temp_relpp = (arelent **) xmalloc (relsize);
3659 for (i = 0; i < relcount; i++)
3661 /* PR 17512: file: 9e907e0c. */
3662 if (relpp[i]->sym_ptr_ptr
3664 && * relpp[i]->sym_ptr_ptr)
3665 if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
3666 keep_specific_htab))
3667 temp_relpp [temp_relcount++] = relpp [i];
3669 relcount = temp_relcount;
3674 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
3677 osection->flags &= ~SEC_RELOC;
3683 /* Copy the data of input section ISECTION of IBFD
3684 to an output section with the same name in OBFD. */
3687 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
3689 bfd *obfd = (bfd *) obfdarg;
3690 struct section_list *p;
3694 if (skip_section (ibfd, isection, TRUE))
3697 osection = isection->output_section;
3698 /* The output SHF_COMPRESSED section size is different from input if
3699 ELF classes of input and output aren't the same. We can't use
3700 the output section size since --interleave will shrink the output
3701 section. Size will be updated if the section is converted. */
3702 size = bfd_get_section_size (isection);
3704 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
3705 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
3707 bfd_byte *memhunk = NULL;
3709 if (!bfd_get_full_section_contents (ibfd, isection, &memhunk)
3710 || !bfd_convert_section_contents (ibfd, isection, obfd,
3714 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
3721 /* We don't handle leftover bytes (too many possible behaviors,
3722 and we don't know what the user wants). The section length
3723 must be a multiple of the number of bytes to swap. */
3724 if ((size % reverse_bytes) == 0)
3729 for (i = 0; i < size; i += reverse_bytes)
3730 for (j = 0; j < (unsigned long)(reverse_bytes / 2); j++)
3732 bfd_byte *m = (bfd_byte *) memhunk;
3735 m[i + j] = m[(i + reverse_bytes) - (j + 1)];
3736 m[(i + reverse_bytes) - (j + 1)] = b;
3740 /* User must pad the section up in order to do this. */
3741 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
3742 bfd_section_name (ibfd, isection), reverse_bytes);
3747 /* Keep only every `copy_byte'th byte in MEMHUNK. */
3748 char *from = (char *) memhunk + copy_byte;
3749 char *to = (char *) memhunk;
3750 char *end = (char *) memhunk + size;
3753 for (; from < end; from += interleave)
3754 for (i = 0; i < copy_width; i++)
3756 if (&from[i] >= end)
3761 size = (size + interleave - 1 - copy_byte) / interleave * copy_width;
3762 osection->lma /= interleave;
3765 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
3768 bfd_nonfatal_message (NULL, obfd, osection, NULL);
3774 else if ((p = find_section_list (bfd_get_section_name (ibfd, isection),
3775 FALSE, SECTION_CONTEXT_SET_FLAGS)) != NULL
3776 && (p->flags & SEC_HAS_CONTENTS) != 0)
3778 void *memhunk = xmalloc (size);
3780 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
3781 flag--they can just remove the section entirely and add it
3782 back again. However, we do permit them to turn on the
3783 SEC_HAS_CONTENTS flag, and take it to mean that the section
3784 contents should be zeroed out. */
3786 memset (memhunk, 0, size);
3787 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
3790 bfd_nonfatal_message (NULL, obfd, osection, NULL);
3798 /* Get all the sections. This is used when --gap-fill or --pad-to is
3802 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
3804 asection ***secppp = (asection ***) secppparg;
3806 **secppp = osection;
3810 /* Sort sections by VMA. This is called via qsort, and is used when
3811 --gap-fill or --pad-to is used. We force non loadable or empty
3812 sections to the front, where they are easier to ignore. */
3815 compare_section_lma (const void *arg1, const void *arg2)
3817 const asection *const *sec1 = (const asection * const *) arg1;
3818 const asection *const *sec2 = (const asection * const *) arg2;
3819 flagword flags1, flags2;
3821 /* Sort non loadable sections to the front. */
3822 flags1 = (*sec1)->flags;
3823 flags2 = (*sec2)->flags;
3824 if ((flags1 & SEC_HAS_CONTENTS) == 0
3825 || (flags1 & SEC_LOAD) == 0)
3827 if ((flags2 & SEC_HAS_CONTENTS) != 0
3828 && (flags2 & SEC_LOAD) != 0)
3833 if ((flags2 & SEC_HAS_CONTENTS) == 0
3834 || (flags2 & SEC_LOAD) == 0)
3838 /* Sort sections by LMA. */
3839 if ((*sec1)->lma > (*sec2)->lma)
3841 else if ((*sec1)->lma < (*sec2)->lma)
3844 /* Sort sections with the same LMA by size. */
3845 if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
3847 else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
3853 /* Mark all the symbols which will be used in output relocations with
3854 the BSF_KEEP flag so that those symbols will not be stripped.
3856 Ignore relocations which will not appear in the output file. */
3859 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
3861 asymbol **symbols = (asymbol **) symbolsarg;
3866 /* Ignore an input section with no corresponding output section. */
3867 if (isection->output_section == NULL)
3870 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
3873 /* Do not complain if the target does not support relocations. */
3874 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
3876 bfd_fatal (bfd_get_filename (ibfd));
3882 relpp = (arelent **) xmalloc (relsize);
3883 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
3885 bfd_fatal (bfd_get_filename (ibfd));
3887 /* Examine each symbol used in a relocation. If it's not one of the
3888 special bfd section symbols, then mark it with BSF_KEEP. */
3889 for (i = 0; i < relcount; i++)
3891 /* See PRs 20923 and 20930 for reproducers for the NULL tests. */
3892 if (relpp[i]->sym_ptr_ptr != NULL
3893 && * relpp[i]->sym_ptr_ptr != NULL
3894 && *relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
3895 && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
3896 && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
3897 (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
3904 /* Write out debugging information. */
3907 write_debugging_info (bfd *obfd, void *dhandle,
3908 long *symcountp ATTRIBUTE_UNUSED,
3909 asymbol ***symppp ATTRIBUTE_UNUSED)
3911 if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour)
3912 return write_ieee_debugging_info (obfd, dhandle);
3914 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
3915 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
3917 bfd_byte *syms, *strings;
3918 bfd_size_type symsize, stringsize;
3919 asection *stabsec, *stabstrsec;
3922 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
3927 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
3928 stabsec = bfd_make_section_with_flags (obfd, ".stab", flags);
3929 stabstrsec = bfd_make_section_with_flags (obfd, ".stabstr", flags);
3931 || stabstrsec == NULL
3932 || ! bfd_set_section_size (obfd, stabsec, symsize)
3933 || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
3934 || ! bfd_set_section_alignment (obfd, stabsec, 2)
3935 || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
3937 bfd_nonfatal_message (NULL, obfd, NULL,
3938 _("can't create debugging section"));
3942 /* We can get away with setting the section contents now because
3943 the next thing the caller is going to do is copy over the
3944 real sections. We may someday have to split the contents
3945 setting out of this function. */
3946 if (! bfd_set_section_contents (obfd, stabsec, syms, 0, symsize)
3947 || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
3950 bfd_nonfatal_message (NULL, obfd, NULL,
3951 _("can't set debugging section contents"));
3958 bfd_nonfatal_message (NULL, obfd, NULL,
3959 _("don't know how to write debugging information for %s"),
3960 bfd_get_target (obfd));
3964 /* If neither -D nor -U was specified explicitly,
3965 then use the configured default. */
3967 default_deterministic (void)
3969 if (deterministic < 0)
3970 deterministic = DEFAULT_AR_DETERMINISTIC;
3974 strip_main (int argc, char *argv[])
3976 char *input_target = NULL;
3977 char *output_target = NULL;
3978 bfd_boolean show_version = FALSE;
3979 bfd_boolean formats_info = FALSE;
3982 char *output_file = NULL;
3984 while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpdgxXHhVvwDU",
3985 strip_options, (int *) 0)) != EOF)
3990 input_target = optarg;
3993 output_target = optarg;
3996 input_target = output_target = optarg;
3999 handle_remove_section_option (optarg);
4001 case OPTION_REMOVE_RELOCS:
4002 handle_remove_relocations_option (optarg);
4005 strip_symbols = STRIP_ALL;
4009 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
4010 strip_symbols = STRIP_DEBUG;
4012 case OPTION_STRIP_DWO:
4013 strip_symbols = STRIP_DWO;
4015 case OPTION_STRIP_UNNEEDED:
4016 strip_symbols = STRIP_UNNEEDED;
4019 add_specific_symbol (optarg, keep_specific_htab);
4022 add_specific_symbol (optarg, strip_specific_htab);
4025 output_file = optarg;
4028 preserve_dates = TRUE;
4031 deterministic = TRUE;
4034 deterministic = FALSE;
4037 discard_locals = LOCALS_ALL;
4040 discard_locals = LOCALS_START_L;
4046 show_version = TRUE;
4048 case OPTION_FORMATS_INFO:
4049 formats_info = TRUE;
4051 case OPTION_ONLY_KEEP_DEBUG:
4052 strip_symbols = STRIP_NONDEBUG;
4054 case OPTION_KEEP_FILE_SYMBOLS:
4055 keep_file_symbols = 1;
4058 /* We've been given a long option. */
4065 strip_usage (stdout, 0);
4067 strip_usage (stderr, 1);
4078 print_version ("strip");
4080 default_deterministic ();
4082 /* Default is to strip all symbols. */
4083 if (strip_symbols == STRIP_UNDEF
4084 && discard_locals == LOCALS_UNDEF
4085 && htab_elements (strip_specific_htab) == 0)
4086 strip_symbols = STRIP_ALL;
4088 if (output_target == NULL)
4089 output_target = input_target;
4093 || (output_file != NULL && (i + 1) < argc))
4094 strip_usage (stderr, 1);
4096 for (; i < argc; i++)
4098 int hold_status = status;
4099 struct stat statbuf;
4102 if (get_file_size (argv[i]) < 1)
4109 /* No need to check the return value of stat().
4110 It has already been checked in get_file_size(). */
4111 stat (argv[i], &statbuf);
4113 if (output_file == NULL
4114 || filename_cmp (argv[i], output_file) == 0)
4115 tmpname = make_tempname (argv[i]);
4117 tmpname = output_file;
4119 if (tmpname == NULL)
4121 bfd_nonfatal_message (argv[i], NULL, NULL,
4122 _("could not create temporary file to hold stripped copy"));
4128 copy_file (argv[i], tmpname, input_target, output_target, NULL);
4132 set_times (tmpname, &statbuf);
4133 if (output_file != tmpname)
4134 status = (smart_rename (tmpname,
4135 output_file ? output_file : argv[i],
4136 preserve_dates) != 0);
4138 status = hold_status;
4141 unlink_if_ordinary (tmpname);
4142 if (output_file != tmpname)
4149 /* Set up PE subsystem. */
4152 set_pe_subsystem (const char *s)
4154 const char *version, *subsystem;
4164 { "native", 0, IMAGE_SUBSYSTEM_NATIVE },
4165 { "windows", 0, IMAGE_SUBSYSTEM_WINDOWS_GUI },
4166 { "console", 0, IMAGE_SUBSYSTEM_WINDOWS_CUI },
4167 { "posix", 0, IMAGE_SUBSYSTEM_POSIX_CUI },
4168 { "wince", 0, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI },
4169 { "efi-app", 1, IMAGE_SUBSYSTEM_EFI_APPLICATION },
4170 { "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER },
4171 { "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER },
4172 { "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER },
4173 { "xbox", 0, IMAGE_SUBSYSTEM_XBOX }
4179 /* Check for the presence of a version number. */
4180 version = strchr (s, ':');
4181 if (version == NULL)
4185 int len = version - s;
4189 version = copy + 1 + len;
4190 pe_major_subsystem_version = strtoul (version, ©, 0);
4192 pe_minor_subsystem_version = strtoul (copy + 1, ©, 0);
4194 non_fatal (_("%s: bad version in PE subsystem"), s);
4197 /* Check for numeric subsystem. */
4198 value = (short) strtol (subsystem, ©, 0);
4201 for (i = 0; i < ARRAY_SIZE (v); i++)
4202 if (v[i].value == value)
4204 pe_subsystem = value;
4205 set_def = v[i].set_def;
4211 /* Search for subsystem by name. */
4212 for (i = 0; i < ARRAY_SIZE (v); i++)
4213 if (strcmp (subsystem, v[i].name) == 0)
4215 pe_subsystem = v[i].value;
4216 set_def = v[i].set_def;
4224 fatal (_("unknown PE subsystem: %s"), s);
4229 if (pe_file_alignment == (bfd_vma) -1)
4230 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
4231 if (pe_section_alignment == (bfd_vma) -1)
4232 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
4236 free ((char *) subsystem);
4239 /* Convert EFI target to PEI target. */
4242 convert_efi_target (char *efi)
4248 if (strcmp (efi + 4, "ia32") == 0)
4250 /* Change ia32 to i386. */
4255 else if (strcmp (efi + 4, "x86_64") == 0)
4257 /* Change x86_64 to x86-64. */
4262 /* Allocate and return a pointer to a struct section_add, initializing the
4263 structure using ARG, a string in the format "sectionname=filename".
4264 The returned structure will have its next pointer set to NEXT. The
4265 OPTION field is the name of the command line option currently being
4266 parsed, and is only used if an error needs to be reported. */
4268 static struct section_add *
4269 init_section_add (const char *arg,
4270 struct section_add *next,
4273 struct section_add *pa;
4276 s = strchr (arg, '=');
4278 fatal (_("bad format for %s"), option);
4280 pa = (struct section_add *) xmalloc (sizeof (struct section_add));
4281 pa->name = xstrndup (arg, s - arg);
4282 pa->filename = s + 1;
4284 pa->contents = NULL;
4290 /* Load the file specified in PA, allocating memory to hold the file
4291 contents, and store a pointer to the allocated memory in the contents
4292 field of PA. The size field of PA is also updated. All errors call
4296 section_add_load_file (struct section_add *pa)
4301 /* We don't use get_file_size so that we can do
4302 --add-section .note.GNU_stack=/dev/null
4303 get_file_size doesn't work on /dev/null. */
4305 f = fopen (pa->filename, FOPEN_RB);
4307 fatal (_("cannot open: %s: %s"),
4308 pa->filename, strerror (errno));
4312 pa->contents = (bfd_byte *) xmalloc (alloc);
4320 pa->contents = (bfd_byte *) xrealloc (pa->contents, alloc);
4323 got = fread (pa->contents + off, 1, alloc - off, f);
4325 fatal (_("%s: fread failed"), pa->filename);
4336 copy_main (int argc, char *argv[])
4338 char *input_filename = NULL;
4339 char *output_filename = NULL;
4341 char *input_target = NULL;
4342 char *output_target = NULL;
4343 bfd_boolean show_version = FALSE;
4344 bfd_boolean change_warn = TRUE;
4345 bfd_boolean formats_info = FALSE;
4347 struct stat statbuf;
4348 const bfd_arch_info_type *input_arch = NULL;
4350 while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:MN:s:O:d:F:L:G:R:SpgxXHhVvW:wDU",
4351 copy_options, (int *) 0)) != EOF)
4356 copy_byte = atoi (optarg);
4358 fatal (_("byte number must be non-negative"));
4362 input_arch = bfd_scan_arch (optarg);
4363 if (input_arch == NULL)
4364 fatal (_("architecture %s unknown"), optarg);
4370 interleave = atoi (optarg);
4372 fatal (_("interleave must be positive"));
4378 case OPTION_INTERLEAVE_WIDTH:
4379 copy_width = atoi (optarg);
4381 fatal(_("interleave width must be positive"));
4385 case 's': /* "source" - 'I' is preferred */
4386 input_target = optarg;
4390 case 'd': /* "destination" - 'O' is preferred */
4391 output_target = optarg;
4395 input_target = output_target = optarg;
4399 find_section_list (optarg, TRUE, SECTION_CONTEXT_COPY);
4400 sections_copied = TRUE;
4404 handle_remove_section_option (optarg);
4407 case OPTION_REMOVE_RELOCS:
4408 handle_remove_relocations_option (optarg);
4412 strip_symbols = STRIP_ALL;
4416 strip_symbols = STRIP_DEBUG;
4419 case OPTION_STRIP_DWO:
4420 strip_symbols = STRIP_DWO;
4423 case OPTION_STRIP_UNNEEDED:
4424 strip_symbols = STRIP_UNNEEDED;
4427 case OPTION_ONLY_KEEP_DEBUG:
4428 strip_symbols = STRIP_NONDEBUG;
4431 case OPTION_KEEP_FILE_SYMBOLS:
4432 keep_file_symbols = 1;
4435 case OPTION_ADD_GNU_DEBUGLINK:
4436 long_section_names = ENABLE ;
4437 gnu_debuglink_filename = optarg;
4441 add_specific_symbol (optarg, keep_specific_htab);
4449 add_specific_symbol (optarg, strip_specific_htab);
4452 case OPTION_STRIP_UNNEEDED_SYMBOL:
4453 add_specific_symbol (optarg, strip_unneeded_htab);
4457 add_specific_symbol (optarg, localize_specific_htab);
4460 case OPTION_GLOBALIZE_SYMBOL:
4461 add_specific_symbol (optarg, globalize_specific_htab);
4465 add_specific_symbol (optarg, keepglobal_specific_htab);
4469 add_specific_symbol (optarg, weaken_specific_htab);
4473 preserve_dates = TRUE;
4477 deterministic = TRUE;
4481 deterministic = FALSE;
4489 discard_locals = LOCALS_ALL;
4493 discard_locals = LOCALS_START_L;
4501 show_version = TRUE;
4504 case OPTION_FORMATS_INFO:
4505 formats_info = TRUE;
4512 case OPTION_ADD_SECTION:
4513 add_sections = init_section_add (optarg, add_sections,
4515 section_add_load_file (add_sections);
4518 case OPTION_UPDATE_SECTION:
4519 update_sections = init_section_add (optarg, update_sections,
4520 "--update-section");
4521 section_add_load_file (update_sections);
4524 case OPTION_DUMP_SECTION:
4525 dump_sections = init_section_add (optarg, dump_sections,
4529 case OPTION_ADD_SYMBOL:
4532 struct addsym_node *newsym = xmalloc (sizeof *newsym);
4534 newsym->next = NULL;
4535 s = strchr (optarg, '=');
4537 fatal (_("bad format for %s"), "--add-symbol");
4538 t = strchr (s + 1, ':');
4540 newsym->symdef = xstrndup (optarg, s - optarg);
4543 newsym->section = xstrndup (s + 1, t - (s + 1));
4544 newsym->symval = strtol (t + 1, NULL, 0);
4548 newsym->section = NULL;
4549 newsym->symval = strtol (s + 1, NULL, 0);
4553 t = strchr (t + 1, ',');
4554 newsym->othersym = NULL;
4556 newsym->flags = parse_symflags (t+1, &newsym->othersym);
4558 newsym->flags = BSF_GLOBAL;
4560 /* Keep 'othersym' symbols at the front of the list. */
4561 if (newsym->othersym)
4563 newsym->next = add_sym_list;
4565 add_sym_tail = &newsym->next;
4566 add_sym_list = newsym;
4570 *add_sym_tail = newsym;
4571 add_sym_tail = &newsym->next;
4577 case OPTION_CHANGE_START:
4578 change_start = parse_vma (optarg, "--change-start");
4581 case OPTION_CHANGE_SECTION_ADDRESS:
4582 case OPTION_CHANGE_SECTION_LMA:
4583 case OPTION_CHANGE_SECTION_VMA:
4585 struct section_list * p;
4586 unsigned int context = 0;
4590 char *option = NULL;
4595 case OPTION_CHANGE_SECTION_ADDRESS:
4596 option = "--change-section-address";
4597 context = SECTION_CONTEXT_ALTER_LMA | SECTION_CONTEXT_ALTER_VMA;
4599 case OPTION_CHANGE_SECTION_LMA:
4600 option = "--change-section-lma";
4601 context = SECTION_CONTEXT_ALTER_LMA;
4603 case OPTION_CHANGE_SECTION_VMA:
4604 option = "--change-section-vma";
4605 context = SECTION_CONTEXT_ALTER_VMA;
4609 s = strchr (optarg, '=');
4612 s = strchr (optarg, '+');
4615 s = strchr (optarg, '-');
4617 fatal (_("bad format for %s"), option);
4622 /* Correct the context. */
4625 case OPTION_CHANGE_SECTION_ADDRESS:
4626 context = SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_SET_VMA;
4628 case OPTION_CHANGE_SECTION_LMA:
4629 context = SECTION_CONTEXT_SET_LMA;
4631 case OPTION_CHANGE_SECTION_VMA:
4632 context = SECTION_CONTEXT_SET_VMA;
4638 name = (char *) xmalloc (len + 1);
4639 strncpy (name, optarg, len);
4642 p = find_section_list (name, TRUE, context);
4644 val = parse_vma (s + 1, option);
4650 case OPTION_CHANGE_SECTION_ADDRESS:
4654 case OPTION_CHANGE_SECTION_LMA:
4658 case OPTION_CHANGE_SECTION_VMA:
4665 case OPTION_CHANGE_ADDRESSES:
4666 change_section_address = parse_vma (optarg, "--change-addresses");
4667 change_start = change_section_address;
4670 case OPTION_CHANGE_WARNINGS:
4674 case OPTION_CHANGE_LEADING_CHAR:
4675 change_leading_char = TRUE;
4678 case OPTION_COMPRESS_DEBUG_SECTIONS:
4681 if (strcasecmp (optarg, "none") == 0)
4682 do_debug_sections = decompress;
4683 else if (strcasecmp (optarg, "zlib") == 0)
4684 do_debug_sections = compress_zlib;
4685 else if (strcasecmp (optarg, "zlib-gnu") == 0)
4686 do_debug_sections = compress_gnu_zlib;
4687 else if (strcasecmp (optarg, "zlib-gabi") == 0)
4688 do_debug_sections = compress_gabi_zlib;
4690 fatal (_("unrecognized --compress-debug-sections type `%s'"),
4694 do_debug_sections = compress;
4697 case OPTION_DEBUGGING:
4698 convert_debugging = TRUE;
4701 case OPTION_DECOMPRESS_DEBUG_SECTIONS:
4702 do_debug_sections = decompress;
4705 case OPTION_ELF_STT_COMMON:
4706 if (strcasecmp (optarg, "yes") == 0)
4707 do_elf_stt_common = elf_stt_common;
4708 else if (strcasecmp (optarg, "no") == 0)
4709 do_elf_stt_common = no_elf_stt_common;
4711 fatal (_("unrecognized --elf-stt-common= option `%s'"),
4715 case OPTION_GAP_FILL:
4717 bfd_vma gap_fill_vma;
4719 gap_fill_vma = parse_vma (optarg, "--gap-fill");
4720 gap_fill = (bfd_byte) gap_fill_vma;
4721 if ((bfd_vma) gap_fill != gap_fill_vma)
4725 sprintf_vma (buff, gap_fill_vma);
4727 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
4730 gap_fill_set = TRUE;
4734 case OPTION_NO_CHANGE_WARNINGS:
4735 change_warn = FALSE;
4739 pad_to = parse_vma (optarg, "--pad-to");
4743 case OPTION_REMOVE_LEADING_CHAR:
4744 remove_leading_char = TRUE;
4747 case OPTION_REDEFINE_SYM:
4749 /* Push this redefinition onto redefine_symbol_list. */
4753 const char *nextarg;
4754 char *source, *target;
4756 s = strchr (optarg, '=');
4758 fatal (_("bad format for %s"), "--redefine-sym");
4761 source = (char *) xmalloc (len + 1);
4762 strncpy (source, optarg, len);
4766 len = strlen (nextarg);
4767 target = (char *) xmalloc (len + 1);
4768 strcpy (target, nextarg);
4770 redefine_list_append ("--redefine-sym", source, target);
4777 case OPTION_REDEFINE_SYMS:
4778 add_redefine_syms_file (optarg);
4781 case OPTION_SET_SECTION_FLAGS:
4783 struct section_list *p;
4788 s = strchr (optarg, '=');
4790 fatal (_("bad format for %s"), "--set-section-flags");
4793 name = (char *) xmalloc (len + 1);
4794 strncpy (name, optarg, len);
4797 p = find_section_list (name, TRUE, SECTION_CONTEXT_SET_FLAGS);
4799 p->flags = parse_flags (s + 1);
4803 case OPTION_RENAME_SECTION:
4806 const char *eq, *fl;
4811 eq = strchr (optarg, '=');
4813 fatal (_("bad format for %s"), "--rename-section");
4817 fatal (_("bad format for %s"), "--rename-section");
4819 old_name = (char *) xmalloc (len + 1);
4820 strncpy (old_name, optarg, len);
4824 fl = strchr (eq, ',');
4827 flags = parse_flags (fl + 1);
4837 fatal (_("bad format for %s"), "--rename-section");
4839 new_name = (char *) xmalloc (len + 1);
4840 strncpy (new_name, eq, len);
4843 add_section_rename (old_name, new_name, flags);
4847 case OPTION_SET_START:
4848 set_start = parse_vma (optarg, "--set-start");
4849 set_start_set = TRUE;
4852 case OPTION_SREC_LEN:
4853 _bfd_srec_len = parse_vma (optarg, "--srec-len");
4856 case OPTION_SREC_FORCES3:
4857 _bfd_srec_forceS3 = TRUE;
4860 case OPTION_STRIP_SYMBOLS:
4861 add_specific_symbols (optarg, strip_specific_htab);
4864 case OPTION_STRIP_UNNEEDED_SYMBOLS:
4865 add_specific_symbols (optarg, strip_unneeded_htab);
4868 case OPTION_KEEP_SYMBOLS:
4869 add_specific_symbols (optarg, keep_specific_htab);
4872 case OPTION_LOCALIZE_HIDDEN:
4873 localize_hidden = TRUE;
4876 case OPTION_LOCALIZE_SYMBOLS:
4877 add_specific_symbols (optarg, localize_specific_htab);
4880 case OPTION_LONG_SECTION_NAMES:
4881 if (!strcmp ("enable", optarg))
4882 long_section_names = ENABLE;
4883 else if (!strcmp ("disable", optarg))
4884 long_section_names = DISABLE;
4885 else if (!strcmp ("keep", optarg))
4886 long_section_names = KEEP;
4888 fatal (_("unknown long section names option '%s'"), optarg);
4891 case OPTION_GLOBALIZE_SYMBOLS:
4892 add_specific_symbols (optarg, globalize_specific_htab);
4895 case OPTION_KEEPGLOBAL_SYMBOLS:
4896 add_specific_symbols (optarg, keepglobal_specific_htab);
4899 case OPTION_WEAKEN_SYMBOLS:
4900 add_specific_symbols (optarg, weaken_specific_htab);
4903 case OPTION_ALT_MACH_CODE:
4904 use_alt_mach_code = strtoul (optarg, NULL, 0);
4905 if (use_alt_mach_code == 0)
4906 fatal (_("unable to parse alternative machine code"));
4909 case OPTION_PREFIX_SYMBOLS:
4910 prefix_symbols_string = optarg;
4913 case OPTION_PREFIX_SECTIONS:
4914 prefix_sections_string = optarg;
4917 case OPTION_PREFIX_ALLOC_SECTIONS:
4918 prefix_alloc_sections_string = optarg;
4921 case OPTION_READONLY_TEXT:
4922 bfd_flags_to_set |= WP_TEXT;
4923 bfd_flags_to_clear &= ~WP_TEXT;
4926 case OPTION_WRITABLE_TEXT:
4927 bfd_flags_to_clear |= WP_TEXT;
4928 bfd_flags_to_set &= ~WP_TEXT;
4932 bfd_flags_to_set |= D_PAGED;
4933 bfd_flags_to_clear &= ~D_PAGED;
4937 bfd_flags_to_clear |= D_PAGED;
4938 bfd_flags_to_set &= ~D_PAGED;
4941 case OPTION_EXTRACT_DWO:
4942 strip_symbols = STRIP_NONDWO;
4945 case OPTION_EXTRACT_SYMBOL:
4946 extract_symbol = TRUE;
4949 case OPTION_REVERSE_BYTES:
4951 int prev = reverse_bytes;
4953 reverse_bytes = atoi (optarg);
4954 if ((reverse_bytes <= 0) || ((reverse_bytes % 2) != 0))
4955 fatal (_("number of bytes to reverse must be positive and even"));
4957 if (prev && prev != reverse_bytes)
4958 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
4963 case OPTION_FILE_ALIGNMENT:
4964 pe_file_alignment = parse_vma (optarg, "--file-alignment");
4970 pe_heap_reserve = strtoul (optarg, &end, 0);
4972 || (*end != '.' && *end != '\0'))
4973 non_fatal (_("%s: invalid reserve value for --heap"),
4975 else if (*end != '\0')
4977 pe_heap_commit = strtoul (end + 1, &end, 0);
4979 non_fatal (_("%s: invalid commit value for --heap"),
4985 case OPTION_IMAGE_BASE:
4986 pe_image_base = parse_vma (optarg, "--image-base");
4989 case OPTION_SECTION_ALIGNMENT:
4990 pe_section_alignment = parse_vma (optarg,
4991 "--section-alignment");
4994 case OPTION_SUBSYSTEM:
4995 set_pe_subsystem (optarg);
5001 pe_stack_reserve = strtoul (optarg, &end, 0);
5003 || (*end != '.' && *end != '\0'))
5004 non_fatal (_("%s: invalid reserve value for --stack"),
5006 else if (*end != '\0')
5008 pe_stack_commit = strtoul (end + 1, &end, 0);
5010 non_fatal (_("%s: invalid commit value for --stack"),
5017 /* We've been given a long option. */
5022 copy_usage (stdout, 0);
5025 copy_usage (stderr, 1);
5036 print_version ("objcopy");
5038 if (interleave && copy_byte == -1)
5039 fatal (_("interleave start byte must be set with --byte"));
5041 if (copy_byte >= interleave)
5042 fatal (_("byte number must be less than interleave"));
5044 if (copy_width > interleave - copy_byte)
5045 fatal (_("interleave width must be less than or equal to interleave - byte`"));
5047 if (optind == argc || optind + 2 < argc)
5048 copy_usage (stderr, 1);
5050 input_filename = argv[optind];
5051 if (optind + 1 < argc)
5052 output_filename = argv[optind + 1];
5054 default_deterministic ();
5056 /* Default is to strip no symbols. */
5057 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
5058 strip_symbols = STRIP_NONE;
5060 if (output_target == NULL)
5061 output_target = input_target;
5063 /* Convert input EFI target to PEI target. */
5064 if (input_target != NULL
5065 && strncmp (input_target, "efi-", 4) == 0)
5069 efi = xstrdup (output_target + 4);
5070 if (strncmp (efi, "bsdrv-", 6) == 0
5071 || strncmp (efi, "rtdrv-", 6) == 0)
5073 else if (strncmp (efi, "app-", 4) != 0)
5074 fatal (_("unknown input EFI target: %s"), input_target);
5077 convert_efi_target (efi);
5080 /* Convert output EFI target to PEI target. */
5081 if (output_target != NULL
5082 && strncmp (output_target, "efi-", 4) == 0)
5086 efi = xstrdup (output_target + 4);
5087 if (strncmp (efi, "app-", 4) == 0)
5089 if (pe_subsystem == -1)
5090 pe_subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
5092 else if (strncmp (efi, "bsdrv-", 6) == 0)
5094 if (pe_subsystem == -1)
5095 pe_subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;
5098 else if (strncmp (efi, "rtdrv-", 6) == 0)
5100 if (pe_subsystem == -1)
5101 pe_subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;
5105 fatal (_("unknown output EFI target: %s"), output_target);
5107 if (pe_file_alignment == (bfd_vma) -1)
5108 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
5109 if (pe_section_alignment == (bfd_vma) -1)
5110 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
5112 output_target = efi;
5113 convert_efi_target (efi);
5117 if (stat (input_filename, & statbuf) < 0)
5118 fatal (_("warning: could not locate '%s'. System error message: %s"),
5119 input_filename, strerror (errno));
5121 /* If there is no destination file, or the source and destination files
5122 are the same, then create a temp and rename the result into the input. */
5123 if (output_filename == NULL
5124 || filename_cmp (input_filename, output_filename) == 0)
5125 tmpname = make_tempname (input_filename);
5127 tmpname = output_filename;
5129 if (tmpname == NULL)
5130 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
5131 input_filename, strerror (errno));
5133 copy_file (input_filename, tmpname, input_target, output_target, input_arch);
5137 set_times (tmpname, &statbuf);
5138 if (tmpname != output_filename)
5139 status = (smart_rename (tmpname, input_filename,
5140 preserve_dates) != 0);
5143 unlink_if_ordinary (tmpname);
5147 struct section_list *p;
5149 for (p = change_sections; p != NULL; p = p->next)
5153 if (p->context & (SECTION_CONTEXT_SET_VMA | SECTION_CONTEXT_ALTER_VMA))
5157 sprintf_vma (buff, p->vma_val);
5159 /* xgettext:c-format */
5160 non_fatal (_("%s %s%c0x%s never used"),
5161 "--change-section-vma",
5163 p->context & SECTION_CONTEXT_SET_VMA ? '=' : '+',
5167 if (p->context & (SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_ALTER_LMA))
5171 sprintf_vma (buff, p->lma_val);
5173 /* xgettext:c-format */
5174 non_fatal (_("%s %s%c0x%s never used"),
5175 "--change-section-lma",
5177 p->context & SECTION_CONTEXT_SET_LMA ? '=' : '+',
5188 main (int argc, char *argv[])
5190 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
5191 setlocale (LC_MESSAGES, "");
5193 #if defined (HAVE_SETLOCALE)
5194 setlocale (LC_CTYPE, "");
5196 bindtextdomain (PACKAGE, LOCALEDIR);
5197 textdomain (PACKAGE);
5199 program_name = argv[0];
5200 xmalloc_set_program_name (program_name);
5202 START_PROGRESS (program_name, 0);
5204 expandargv (&argc, &argv);
5206 strip_symbols = STRIP_UNDEF;
5207 discard_locals = LOCALS_UNDEF;
5210 set_default_bfd_target ();
5214 int i = strlen (program_name);
5215 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5216 /* Drop the .exe suffix, if any. */
5217 if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
5220 program_name[i] = '\0';
5223 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
5226 create_symbol_htabs ();
5229 bfd_set_error_program_name (argv[0]);
5232 strip_main (argc, argv);
5234 copy_main (argc, argv);
5236 END_PROGRESS (program_name);