1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
4 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
27 #include "libiberty.h"
30 #include "filenames.h"
34 #include "coff/internal.h"
37 /* FIXME: See bfd/peXXigen.c for why we include an architecture specific
38 header in generic PE code. */
39 #include "coff/i386.h"
42 static bfd_vma pe_file_alignment = (bfd_vma) -1;
43 static bfd_vma pe_heap_commit = (bfd_vma) -1;
44 static bfd_vma pe_heap_reserve = (bfd_vma) -1;
45 static bfd_vma pe_image_base = (bfd_vma) -1;
46 static bfd_vma pe_section_alignment = (bfd_vma) -1;
47 static bfd_vma pe_stack_commit = (bfd_vma) -1;
48 static bfd_vma pe_stack_reserve = (bfd_vma) -1;
49 static short pe_subsystem = -1;
50 static short pe_major_subsystem_version = -1;
51 static short pe_minor_subsystem_version = -1;
53 struct is_specified_symbol_predicate_data
59 /* A list to support redefine_sym. */
64 struct redefine_node *next;
67 typedef struct section_rename
69 const char * old_name;
70 const char * new_name;
72 struct section_rename * next;
76 /* List of sections to be renamed. */
77 static section_rename *section_rename_list;
79 static asymbol **isympp = NULL; /* Input symbols. */
80 static asymbol **osympp = NULL; /* Output symbols that survive stripping. */
82 /* If `copy_byte' >= 0, copy 'copy_width' byte(s) of every `interleave' bytes. */
83 static int copy_byte = -1;
84 static int interleave = 0; /* Initialised to 4 in copy_main(). */
85 static int copy_width = 1;
87 static bfd_boolean verbose; /* Print file and target names. */
88 static bfd_boolean preserve_dates; /* Preserve input file timestamp. */
89 static int status = 0; /* Exit status. */
94 STRIP_NONE, /* Don't strip. */
95 STRIP_DEBUG, /* Strip all debugger symbols. */
96 STRIP_UNNEEDED, /* Strip unnecessary symbols. */
97 STRIP_NONDEBUG, /* Strip everything but debug info. */
98 STRIP_ALL /* Strip all symbols. */
101 /* Which symbols to remove. */
102 static enum strip_action strip_symbols;
107 LOCALS_START_L, /* Discard locals starting with L. */
108 LOCALS_ALL /* Discard all locals. */
111 /* Which local symbols to remove. Overrides STRIP_ALL. */
112 static enum locals_action discard_locals;
114 /* What kind of change to perform. */
122 /* Structure used to hold lists of sections and actions to take. */
125 struct section_list * next; /* Next section to change. */
126 const char * name; /* Section name. */
127 bfd_boolean used; /* Whether this entry was used. */
128 bfd_boolean remove; /* Whether to remove this section. */
129 bfd_boolean copy; /* Whether to copy this section. */
130 enum change_action change_vma;/* Whether to change or set VMA. */
131 bfd_vma vma_val; /* Amount to change by or set to. */
132 enum change_action change_lma;/* Whether to change or set LMA. */
133 bfd_vma lma_val; /* Amount to change by or set to. */
134 bfd_boolean set_flags; /* Whether to set the section flags. */
135 flagword flags; /* What to set the section flags to. */
138 static struct section_list *change_sections;
140 /* TRUE if some sections are to be removed. */
141 static bfd_boolean sections_removed;
143 /* TRUE if only some sections are to be copied. */
144 static bfd_boolean sections_copied;
146 /* Changes to the start address. */
147 static bfd_vma change_start = 0;
148 static bfd_boolean set_start_set = FALSE;
149 static bfd_vma set_start;
151 /* Changes to section addresses. */
152 static bfd_vma change_section_address = 0;
154 /* Filling gaps between sections. */
155 static bfd_boolean gap_fill_set = FALSE;
156 static bfd_byte gap_fill = 0;
158 /* Pad to a given address. */
159 static bfd_boolean pad_to_set = FALSE;
160 static bfd_vma pad_to;
162 /* Use alternative machine code? */
163 static unsigned long use_alt_mach_code = 0;
165 /* Output BFD flags user wants to set or clear */
166 static flagword bfd_flags_to_set;
167 static flagword bfd_flags_to_clear;
169 /* List of sections to add. */
172 /* Next section to add. */
173 struct section_add *next;
174 /* Name of section to add. */
176 /* Name of file holding section contents. */
177 const char *filename;
180 /* Contents of file. */
182 /* BFD section, after it has been added. */
186 /* List of sections to add to the output BFD. */
187 static struct section_add *add_sections;
189 /* If non-NULL the argument to --add-gnu-debuglink.
190 This should be the filename to store in the .gnu_debuglink section. */
191 static const char * gnu_debuglink_filename = NULL;
193 /* Whether to convert debugging information. */
194 static bfd_boolean convert_debugging = FALSE;
196 /* Whether to compress/decompress DWARF debug sections. */
202 } do_debug_sections = nothing;
204 /* Whether to change the leading character in symbol names. */
205 static bfd_boolean change_leading_char = FALSE;
207 /* Whether to remove the leading character from global symbol names. */
208 static bfd_boolean remove_leading_char = FALSE;
210 /* Whether to permit wildcard in symbol comparison. */
211 static bfd_boolean wildcard = FALSE;
213 /* True if --localize-hidden is in effect. */
214 static bfd_boolean localize_hidden = FALSE;
216 /* List of symbols to strip, keep, localize, keep-global, weaken,
218 static htab_t strip_specific_htab = NULL;
219 static htab_t strip_unneeded_htab = NULL;
220 static htab_t keep_specific_htab = NULL;
221 static htab_t localize_specific_htab = NULL;
222 static htab_t globalize_specific_htab = NULL;
223 static htab_t keepglobal_specific_htab = NULL;
224 static htab_t weaken_specific_htab = NULL;
225 static struct redefine_node *redefine_sym_list = NULL;
227 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
228 static bfd_boolean weaken = FALSE;
230 /* If this is TRUE, we retain BSF_FILE symbols. */
231 static bfd_boolean keep_file_symbols = FALSE;
233 /* Prefix symbols/sections. */
234 static char *prefix_symbols_string = 0;
235 static char *prefix_sections_string = 0;
236 static char *prefix_alloc_sections_string = 0;
238 /* True if --extract-symbol was passed on the command line. */
239 static bfd_boolean extract_symbol = FALSE;
241 /* If `reverse_bytes' is nonzero, then reverse the order of every chunk
242 of <reverse_bytes> bytes within each output section. */
243 static int reverse_bytes = 0;
245 /* For Coff objects, we may want to allow or disallow long section names,
246 or preserve them where found in the inputs. Debug info relies on them. */
247 enum long_section_name_handling
254 /* The default long section handling mode is to preserve them.
255 This is also the only behaviour for 'strip'. */
256 static enum long_section_name_handling long_section_names = KEEP;
258 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
259 enum command_line_switch
261 OPTION_ADD_SECTION=150,
262 OPTION_CHANGE_ADDRESSES,
263 OPTION_CHANGE_LEADING_CHAR,
265 OPTION_CHANGE_SECTION_ADDRESS,
266 OPTION_CHANGE_SECTION_LMA,
267 OPTION_CHANGE_SECTION_VMA,
268 OPTION_CHANGE_WARNINGS,
269 OPTION_COMPRESS_DEBUG_SECTIONS,
271 OPTION_DECOMPRESS_DEBUG_SECTIONS,
273 OPTION_NO_CHANGE_WARNINGS,
275 OPTION_REMOVE_LEADING_CHAR,
276 OPTION_SET_SECTION_FLAGS,
278 OPTION_STRIP_UNNEEDED,
281 OPTION_REDEFINE_SYMS,
284 OPTION_STRIP_SYMBOLS,
285 OPTION_STRIP_UNNEEDED_SYMBOL,
286 OPTION_STRIP_UNNEEDED_SYMBOLS,
288 OPTION_LOCALIZE_HIDDEN,
289 OPTION_LOCALIZE_SYMBOLS,
290 OPTION_LONG_SECTION_NAMES,
291 OPTION_GLOBALIZE_SYMBOL,
292 OPTION_GLOBALIZE_SYMBOLS,
293 OPTION_KEEPGLOBAL_SYMBOLS,
294 OPTION_WEAKEN_SYMBOLS,
295 OPTION_RENAME_SECTION,
296 OPTION_ALT_MACH_CODE,
297 OPTION_PREFIX_SYMBOLS,
298 OPTION_PREFIX_SECTIONS,
299 OPTION_PREFIX_ALLOC_SECTIONS,
301 OPTION_ADD_GNU_DEBUGLINK,
302 OPTION_ONLY_KEEP_DEBUG,
303 OPTION_KEEP_FILE_SYMBOLS,
304 OPTION_READONLY_TEXT,
305 OPTION_WRITABLE_TEXT,
308 OPTION_EXTRACT_SYMBOL,
309 OPTION_REVERSE_BYTES,
310 OPTION_FILE_ALIGNMENT,
313 OPTION_SECTION_ALIGNMENT,
315 OPTION_INTERLEAVE_WIDTH,
319 /* Options to handle if running as "strip". */
321 static struct option strip_options[] =
323 {"discard-all", no_argument, 0, 'x'},
324 {"discard-locals", no_argument, 0, 'X'},
325 {"format", required_argument, 0, 'F'}, /* Obsolete */
326 {"help", no_argument, 0, 'h'},
327 {"info", no_argument, 0, OPTION_FORMATS_INFO},
328 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
329 {"input-target", required_argument, 0, 'I'},
330 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
331 {"keep-symbol", required_argument, 0, 'K'},
332 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
333 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
334 {"output-target", required_argument, 0, 'O'},
335 {"output-file", required_argument, 0, 'o'},
336 {"preserve-dates", no_argument, 0, 'p'},
337 {"remove-section", required_argument, 0, 'R'},
338 {"strip-all", no_argument, 0, 's'},
339 {"strip-debug", no_argument, 0, 'S'},
340 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
341 {"strip-symbol", required_argument, 0, 'N'},
342 {"target", required_argument, 0, 'F'},
343 {"verbose", no_argument, 0, 'v'},
344 {"version", no_argument, 0, 'V'},
345 {"wildcard", no_argument, 0, 'w'},
346 {0, no_argument, 0, 0}
349 /* Options to handle if running as "objcopy". */
351 static struct option copy_options[] =
353 {"add-gnu-debuglink", required_argument, 0, OPTION_ADD_GNU_DEBUGLINK},
354 {"add-section", required_argument, 0, OPTION_ADD_SECTION},
355 {"adjust-start", required_argument, 0, OPTION_CHANGE_START},
356 {"adjust-vma", required_argument, 0, OPTION_CHANGE_ADDRESSES},
357 {"adjust-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
358 {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
359 {"alt-machine-code", required_argument, 0, OPTION_ALT_MACH_CODE},
360 {"binary-architecture", required_argument, 0, 'B'},
361 {"byte", required_argument, 0, 'b'},
362 {"change-addresses", required_argument, 0, OPTION_CHANGE_ADDRESSES},
363 {"change-leading-char", no_argument, 0, OPTION_CHANGE_LEADING_CHAR},
364 {"change-section-address", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
365 {"change-section-lma", required_argument, 0, OPTION_CHANGE_SECTION_LMA},
366 {"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA},
367 {"change-start", required_argument, 0, OPTION_CHANGE_START},
368 {"change-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
369 {"compress-debug-sections", no_argument, 0, OPTION_COMPRESS_DEBUG_SECTIONS},
370 {"debugging", no_argument, 0, OPTION_DEBUGGING},
371 {"decompress-debug-sections", no_argument, 0, OPTION_DECOMPRESS_DEBUG_SECTIONS},
372 {"discard-all", no_argument, 0, 'x'},
373 {"discard-locals", no_argument, 0, 'X'},
374 {"extract-symbol", no_argument, 0, OPTION_EXTRACT_SYMBOL},
375 {"format", required_argument, 0, 'F'}, /* Obsolete */
376 {"gap-fill", required_argument, 0, OPTION_GAP_FILL},
377 {"globalize-symbol", required_argument, 0, OPTION_GLOBALIZE_SYMBOL},
378 {"globalize-symbols", required_argument, 0, OPTION_GLOBALIZE_SYMBOLS},
379 {"help", no_argument, 0, 'h'},
380 {"impure", no_argument, 0, OPTION_IMPURE},
381 {"info", no_argument, 0, OPTION_FORMATS_INFO},
382 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
383 {"input-target", required_argument, 0, 'I'},
384 {"interleave", optional_argument, 0, 'i'},
385 {"interleave-width", required_argument, 0, OPTION_INTERLEAVE_WIDTH},
386 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
387 {"keep-global-symbol", required_argument, 0, 'G'},
388 {"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS},
389 {"keep-symbol", required_argument, 0, 'K'},
390 {"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS},
391 {"localize-hidden", no_argument, 0, OPTION_LOCALIZE_HIDDEN},
392 {"localize-symbol", required_argument, 0, 'L'},
393 {"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
394 {"long-section-names", required_argument, 0, OPTION_LONG_SECTION_NAMES},
395 {"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
396 {"no-change-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
397 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
398 {"only-section", required_argument, 0, 'j'},
399 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
400 {"output-target", required_argument, 0, 'O'},
401 {"pad-to", required_argument, 0, OPTION_PAD_TO},
402 {"prefix-symbols", required_argument, 0, OPTION_PREFIX_SYMBOLS},
403 {"prefix-sections", required_argument, 0, OPTION_PREFIX_SECTIONS},
404 {"prefix-alloc-sections", required_argument, 0, OPTION_PREFIX_ALLOC_SECTIONS},
405 {"preserve-dates", no_argument, 0, 'p'},
406 {"pure", no_argument, 0, OPTION_PURE},
407 {"readonly-text", no_argument, 0, OPTION_READONLY_TEXT},
408 {"redefine-sym", required_argument, 0, OPTION_REDEFINE_SYM},
409 {"redefine-syms", required_argument, 0, OPTION_REDEFINE_SYMS},
410 {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR},
411 {"remove-section", required_argument, 0, 'R'},
412 {"rename-section", required_argument, 0, OPTION_RENAME_SECTION},
413 {"reverse-bytes", required_argument, 0, OPTION_REVERSE_BYTES},
414 {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS},
415 {"set-start", required_argument, 0, OPTION_SET_START},
416 {"srec-len", required_argument, 0, OPTION_SREC_LEN},
417 {"srec-forceS3", no_argument, 0, OPTION_SREC_FORCES3},
418 {"strip-all", no_argument, 0, 'S'},
419 {"strip-debug", no_argument, 0, 'g'},
420 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
421 {"strip-unneeded-symbol", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOL},
422 {"strip-unneeded-symbols", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOLS},
423 {"strip-symbol", required_argument, 0, 'N'},
424 {"strip-symbols", required_argument, 0, OPTION_STRIP_SYMBOLS},
425 {"target", required_argument, 0, 'F'},
426 {"verbose", no_argument, 0, 'v'},
427 {"version", no_argument, 0, 'V'},
428 {"weaken", no_argument, 0, OPTION_WEAKEN},
429 {"weaken-symbol", required_argument, 0, 'W'},
430 {"weaken-symbols", required_argument, 0, OPTION_WEAKEN_SYMBOLS},
431 {"wildcard", no_argument, 0, 'w'},
432 {"writable-text", no_argument, 0, OPTION_WRITABLE_TEXT},
433 {"file-alignment", required_argument, 0, OPTION_FILE_ALIGNMENT},
434 {"heap", required_argument, 0, OPTION_HEAP},
435 {"image-base", required_argument, 0 , OPTION_IMAGE_BASE},
436 {"section-alignment", required_argument, 0, OPTION_SECTION_ALIGNMENT},
437 {"stack", required_argument, 0, OPTION_STACK},
438 {"subsystem", required_argument, 0, OPTION_SUBSYSTEM},
439 {0, no_argument, 0, 0}
443 extern char *program_name;
445 /* This flag distinguishes between strip and objcopy:
446 1 means this is 'strip'; 0 means this is 'objcopy'.
447 -1 means if we should use argv[0] to decide. */
450 /* The maximum length of an S record. This variable is declared in srec.c
451 and can be modified by the --srec-len parameter. */
452 extern unsigned int Chunk;
454 /* Restrict the generation of Srecords to type S3 only.
455 This variable is declare in bfd/srec.c and can be toggled
456 on by the --srec-forceS3 command line switch. */
457 extern bfd_boolean S3Forced;
459 /* Forward declarations. */
460 static void setup_section (bfd *, asection *, void *);
461 static void setup_bfd_headers (bfd *, bfd *);
462 static void copy_relocations_in_section (bfd *, asection *, void *);
463 static void copy_section (bfd *, asection *, void *);
464 static void get_sections (bfd *, asection *, void *);
465 static int compare_section_lma (const void *, const void *);
466 static void mark_symbols_used_in_relocations (bfd *, asection *, void *);
467 static bfd_boolean write_debugging_info (bfd *, void *, long *, asymbol ***);
468 static const char *lookup_sym_redefinition (const char *);
471 copy_usage (FILE *stream, int exit_status)
473 fprintf (stream, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name);
474 fprintf (stream, _(" Copies a binary file, possibly transforming it in the process\n"));
475 fprintf (stream, _(" The options are:\n"));
476 fprintf (stream, _("\
477 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
478 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
479 -B --binary-architecture <arch> Set output arch, when input is arch-less\n\
480 -F --target <bfdname> Set both input and output format to <bfdname>\n\
481 --debugging Convert debugging information, if possible\n\
482 -p --preserve-dates Copy modified/access timestamps to the output\n\
483 -j --only-section <name> Only copy section <name> into the output\n\
484 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
485 -R --remove-section <name> Remove section <name> from the output\n\
486 -S --strip-all Remove all symbol and relocation information\n\
487 -g --strip-debug Remove all debugging symbols & sections\n\
488 --strip-unneeded Remove all symbols not needed by relocations\n\
489 -N --strip-symbol <name> Do not copy symbol <name>\n\
490 --strip-unneeded-symbol <name>\n\
491 Do not copy symbol <name> unless needed by\n\
493 --only-keep-debug Strip everything but the debug information\n\
494 --extract-symbol Remove section contents but keep symbols\n\
495 -K --keep-symbol <name> Do not strip symbol <name>\n\
496 --keep-file-symbols Do not strip file symbol(s)\n\
497 --localize-hidden Turn all ELF hidden symbols into locals\n\
498 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
499 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
500 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
501 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
502 --weaken Force all global symbols to be marked as weak\n\
503 -w --wildcard Permit wildcard in symbol comparison\n\
504 -x --discard-all Remove all non-global symbols\n\
505 -X --discard-locals Remove any compiler-generated symbols\n\
506 -i --interleave [<number>] Only copy N out of every <number> bytes\n\
507 --interleave-width <number> Set N for --interleave\n\
508 -b --byte <num> Select byte <num> in every interleaved block\n\
509 --gap-fill <val> Fill gaps between sections with <val>\n\
510 --pad-to <addr> Pad the last section up to address <addr>\n\
511 --set-start <addr> Set the start address to <addr>\n\
512 {--change-start|--adjust-start} <incr>\n\
513 Add <incr> to the start address\n\
514 {--change-addresses|--adjust-vma} <incr>\n\
515 Add <incr> to LMA, VMA and start addresses\n\
516 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
517 Change LMA and VMA of section <name> by <val>\n\
518 --change-section-lma <name>{=|+|-}<val>\n\
519 Change the LMA of section <name> by <val>\n\
520 --change-section-vma <name>{=|+|-}<val>\n\
521 Change the VMA of section <name> by <val>\n\
522 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
523 Warn if a named section does not exist\n\
524 --set-section-flags <name>=<flags>\n\
525 Set section <name>'s properties to <flags>\n\
526 --add-section <name>=<file> Add section <name> found in <file> to output\n\
527 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
528 --long-section-names {enable|disable|keep}\n\
529 Handle long section names in Coff objects.\n\
530 --change-leading-char Force output format's leading character style\n\
531 --remove-leading-char Remove leading character from global symbols\n\
532 --reverse-bytes=<num> Reverse <num> bytes at a time, in output sections with content\n\
533 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
534 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
536 --srec-len <number> Restrict the length of generated Srecords\n\
537 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
538 --strip-symbols <file> -N for all symbols listed in <file>\n\
539 --strip-unneeded-symbols <file>\n\
540 --strip-unneeded-symbol for all symbols listed\n\
542 --keep-symbols <file> -K for all symbols listed in <file>\n\
543 --localize-symbols <file> -L for all symbols listed in <file>\n\
544 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
545 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
546 --weaken-symbols <file> -W for all symbols listed in <file>\n\
547 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
548 --writable-text Mark the output text as writable\n\
549 --readonly-text Make the output text write protected\n\
550 --pure Mark the output file as demand paged\n\
551 --impure Mark the output file as impure\n\
552 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
553 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
554 --prefix-alloc-sections <prefix>\n\
555 Add <prefix> to start of every allocatable\n\
557 --file-alignment <num> Set PE file alignment to <num>\n\
558 --heap <reserve>[,<commit>] Set PE reserve/commit heap to <reserve>/\n\
560 --image-base <address> Set PE image base to <address>\n\
561 --section-alignment <num> Set PE section alignment to <num>\n\
562 --stack <reserve>[,<commit>] Set PE reserve/commit stack to <reserve>/\n\
564 --subsystem <name>[:<version>]\n\
565 Set PE subsystem to <name> [& <version>]\n\
566 --compress-debug-sections Compress DWARF debug sections using zlib\n\
567 --decompress-debug-sections Decompress DWARF debug sections using zlib\n\
568 -v --verbose List all object files modified\n\
569 @<file> Read options from <file>\n\
570 -V --version Display this program's version number\n\
571 -h --help Display this output\n\
572 --info List object formats & architectures supported\n\
574 list_supported_targets (program_name, stream);
575 if (REPORT_BUGS_TO[0] && exit_status == 0)
576 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
581 strip_usage (FILE *stream, int exit_status)
583 fprintf (stream, _("Usage: %s <option(s)> in-file(s)\n"), program_name);
584 fprintf (stream, _(" Removes symbols and sections from files\n"));
585 fprintf (stream, _(" The options are:\n"));
586 fprintf (stream, _("\
587 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
588 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
589 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
590 -p --preserve-dates Copy modified/access timestamps to the output\n\
591 -R --remove-section=<name> Remove section <name> from the output\n\
592 -s --strip-all Remove all symbol and relocation information\n\
593 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
594 --strip-unneeded Remove all symbols not needed by relocations\n\
595 --only-keep-debug Strip everything but the debug information\n\
596 -N --strip-symbol=<name> Do not copy symbol <name>\n\
597 -K --keep-symbol=<name> Do not strip symbol <name>\n\
598 --keep-file-symbols Do not strip file symbol(s)\n\
599 -w --wildcard Permit wildcard in symbol comparison\n\
600 -x --discard-all Remove all non-global symbols\n\
601 -X --discard-locals Remove any compiler-generated symbols\n\
602 -v --verbose List all object files modified\n\
603 -V --version Display this program's version number\n\
604 -h --help Display this output\n\
605 --info List object formats & architectures supported\n\
606 -o <file> Place stripped output into <file>\n\
609 list_supported_targets (program_name, stream);
610 if (REPORT_BUGS_TO[0] && exit_status == 0)
611 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
615 /* Parse section flags into a flagword, with a fatal error if the
616 string can't be parsed. */
619 parse_flags (const char *s)
629 snext = strchr (s, ',');
639 #define PARSE_FLAG(fname,fval) \
640 else if (strncasecmp (fname, s, len) == 0) ret |= fval
641 PARSE_FLAG ("alloc", SEC_ALLOC);
642 PARSE_FLAG ("load", SEC_LOAD);
643 PARSE_FLAG ("noload", SEC_NEVER_LOAD);
644 PARSE_FLAG ("readonly", SEC_READONLY);
645 PARSE_FLAG ("debug", SEC_DEBUGGING);
646 PARSE_FLAG ("code", SEC_CODE);
647 PARSE_FLAG ("data", SEC_DATA);
648 PARSE_FLAG ("rom", SEC_ROM);
649 PARSE_FLAG ("share", SEC_COFF_SHARED);
650 PARSE_FLAG ("contents", SEC_HAS_CONTENTS);
656 copy = (char *) xmalloc (len + 1);
657 strncpy (copy, s, len);
659 non_fatal (_("unrecognized section flag `%s'"), copy);
660 fatal (_("supported flags: %s"),
661 "alloc, load, noload, readonly, debug, code, data, rom, share, contents");
671 /* Find and optionally add an entry in the change_sections list. */
673 static struct section_list *
674 find_section_list (const char *name, bfd_boolean add)
676 struct section_list *p;
678 for (p = change_sections; p != NULL; p = p->next)
679 if (strcmp (p->name, name) == 0)
685 p = (struct section_list *) xmalloc (sizeof (struct section_list));
690 p->change_vma = CHANGE_IGNORE;
691 p->change_lma = CHANGE_IGNORE;
694 p->set_flags = FALSE;
697 p->next = change_sections;
703 /* There is htab_hash_string but no htab_eq_string. Makes sense. */
706 eq_string (const void *s1, const void *s2)
708 return strcmp ((const char *) s1, (const char *) s2) == 0;
712 create_symbol_htab (void)
714 return htab_create_alloc (16, htab_hash_string, eq_string, NULL, xcalloc, free);
718 create_symbol_htabs (void)
720 strip_specific_htab = create_symbol_htab ();
721 strip_unneeded_htab = create_symbol_htab ();
722 keep_specific_htab = create_symbol_htab ();
723 localize_specific_htab = create_symbol_htab ();
724 globalize_specific_htab = create_symbol_htab ();
725 keepglobal_specific_htab = create_symbol_htab ();
726 weaken_specific_htab = create_symbol_htab ();
729 /* Add a symbol to strip_specific_list. */
732 add_specific_symbol (const char *name, htab_t htab)
734 *htab_find_slot (htab, name, INSERT) = (char *) name;
737 /* Add symbols listed in `filename' to strip_specific_list. */
739 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
740 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
743 add_specific_symbols (const char *filename, htab_t htab)
749 unsigned int line_count;
751 size = get_file_size (filename);
758 buffer = (char *) xmalloc (size + 2);
759 f = fopen (filename, FOPEN_RT);
761 fatal (_("cannot open '%s': %s"), filename, strerror (errno));
763 if (fread (buffer, 1, size, f) == 0 || ferror (f))
764 fatal (_("%s: fread failed"), filename);
767 buffer [size] = '\n';
768 buffer [size + 1] = '\0';
772 for (line = buffer; * line != '\0'; line ++)
777 int finished = FALSE;
779 for (eol = line;; eol ++)
785 /* Cope with \n\r. */
793 /* Cope with \r\n. */
804 /* Line comment, Terminate the line here, in case a
805 name is present and then allow the rest of the
806 loop to find the real end of the line. */
818 /* A name may now exist somewhere between 'line' and 'eol'.
819 Strip off leading whitespace and trailing whitespace,
820 then add it to the list. */
821 for (name = line; IS_WHITESPACE (* name); name ++)
823 for (name_end = name;
824 (! IS_WHITESPACE (* name_end))
825 && (! IS_LINE_TERMINATOR (* name_end));
829 if (! IS_LINE_TERMINATOR (* name_end))
833 for (extra = name_end + 1; IS_WHITESPACE (* extra); extra ++)
836 if (! IS_LINE_TERMINATOR (* extra))
837 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
838 filename, line_count);
844 add_specific_symbol (name, htab);
846 /* Advance line pointer to end of line. The 'eol ++' in the for
847 loop above will then advance us to the start of the next line. */
853 /* See whether a symbol should be stripped or kept
854 based on strip_specific_list and keep_symbols. */
857 is_specified_symbol_predicate (void **slot, void *data)
859 struct is_specified_symbol_predicate_data *d =
860 (struct is_specified_symbol_predicate_data *) data;
861 const char *slot_name = (char *) *slot;
863 if (*slot_name != '!')
865 if (! fnmatch (slot_name, d->name, 0))
868 /* Stop traversal. */
874 if (fnmatch (slot_name + 1, d->name, 0))
877 /* Stop traversal. */
882 /* Continue traversal. */
887 is_specified_symbol (const char *name, htab_t htab)
891 struct is_specified_symbol_predicate_data data;
896 htab_traverse (htab, is_specified_symbol_predicate, &data);
901 return htab_find (htab, name) != NULL;
904 /* Return a pointer to the symbol used as a signature for GROUP. */
907 group_signature (asection *group)
909 bfd *abfd = group->owner;
910 Elf_Internal_Shdr *ghdr;
912 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
915 ghdr = &elf_section_data (group)->this_hdr;
916 if (ghdr->sh_link < elf_numsections (abfd))
918 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
919 Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link];
921 if (symhdr->sh_type == SHT_SYMTAB
922 && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym)
923 return isympp[ghdr->sh_info - 1];
928 /* See if a non-group section is being removed. */
931 is_strip_section_1 (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
933 if (sections_removed || sections_copied)
935 struct section_list *p;
937 p = find_section_list (bfd_get_section_name (abfd, sec), FALSE);
939 if (sections_removed && p != NULL && p->remove)
941 if (sections_copied && (p == NULL || ! p->copy))
945 if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
947 if (strip_symbols == STRIP_DEBUG
948 || strip_symbols == STRIP_UNNEEDED
949 || strip_symbols == STRIP_ALL
950 || discard_locals == LOCALS_ALL
951 || convert_debugging)
954 if (strip_symbols == STRIP_NONDEBUG)
961 /* See if a section is being removed. */
964 is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
966 if (is_strip_section_1 (abfd, sec))
969 if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0)
973 asection *elt, *first;
976 If we are going to strip the group signature symbol, then
977 strip the group section too. */
978 gsym = group_signature (sec);
983 if ((strip_symbols == STRIP_ALL
984 && !is_specified_symbol (gname, keep_specific_htab))
985 || is_specified_symbol (gname, strip_specific_htab))
988 /* Remove the group section if all members are removed. */
989 first = elt = elf_next_in_group (sec);
992 if (!is_strip_section_1 (abfd, elt))
994 elt = elf_next_in_group (elt);
1005 /* Return true if SYM is a hidden symbol. */
1008 is_hidden_symbol (asymbol *sym)
1010 elf_symbol_type *elf_sym;
1012 elf_sym = elf_symbol_from (sym->the_bfd, sym);
1013 if (elf_sym != NULL)
1014 switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
1023 /* Choose which symbol entries to copy; put the result in OSYMS.
1024 We don't copy in place, because that confuses the relocs.
1025 Return the number of symbols to print. */
1028 filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
1029 asymbol **isyms, long symcount)
1031 asymbol **from = isyms, **to = osyms;
1032 long src_count = 0, dst_count = 0;
1033 int relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
1035 for (; src_count < symcount; src_count++)
1037 asymbol *sym = from[src_count];
1038 flagword flags = sym->flags;
1039 char *name = (char *) bfd_asymbol_name (sym);
1041 bfd_boolean used_in_reloc = FALSE;
1042 bfd_boolean undefined;
1043 bfd_boolean rem_leading_char;
1044 bfd_boolean add_leading_char;
1046 undefined = bfd_is_und_section (bfd_get_section (sym));
1048 if (redefine_sym_list)
1050 char *old_name, *new_name;
1052 old_name = (char *) bfd_asymbol_name (sym);
1053 new_name = (char *) lookup_sym_redefinition (old_name);
1054 bfd_asymbol_name (sym) = new_name;
1058 /* Check if we will remove the current leading character. */
1060 (name[0] == bfd_get_symbol_leading_char (abfd))
1061 && (change_leading_char
1062 || (remove_leading_char
1063 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1065 || bfd_is_com_section (bfd_get_section (sym)))));
1067 /* Check if we will add a new leading character. */
1070 && (bfd_get_symbol_leading_char (obfd) != '\0')
1071 && (bfd_get_symbol_leading_char (abfd) == '\0'
1072 || (name[0] == bfd_get_symbol_leading_char (abfd)));
1074 /* Short circuit for change_leading_char if we can do it in-place. */
1075 if (rem_leading_char && add_leading_char && !prefix_symbols_string)
1077 name[0] = bfd_get_symbol_leading_char (obfd);
1078 bfd_asymbol_name (sym) = name;
1079 rem_leading_char = FALSE;
1080 add_leading_char = FALSE;
1083 /* Remove leading char. */
1084 if (rem_leading_char)
1085 bfd_asymbol_name (sym) = ++name;
1087 /* Add new leading char and/or prefix. */
1088 if (add_leading_char || prefix_symbols_string)
1092 ptr = n = (char *) xmalloc (1 + strlen (prefix_symbols_string)
1093 + strlen (name) + 1);
1094 if (add_leading_char)
1095 *ptr++ = bfd_get_symbol_leading_char (obfd);
1097 if (prefix_symbols_string)
1099 strcpy (ptr, prefix_symbols_string);
1100 ptr += strlen (prefix_symbols_string);
1104 bfd_asymbol_name (sym) = n;
1108 if (strip_symbols == STRIP_ALL)
1110 else if ((flags & BSF_KEEP) != 0 /* Used in relocation. */
1111 || ((flags & BSF_SECTION_SYM) != 0
1112 && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
1116 used_in_reloc = TRUE;
1118 else if (relocatable /* Relocatable file. */
1119 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1120 || bfd_is_com_section (bfd_get_section (sym))))
1122 else if (bfd_decode_symclass (sym) == 'I')
1123 /* Global symbols in $idata sections need to be retained
1124 even if relocatable is FALSE. External users of the
1125 library containing the $idata section may reference these
1128 else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */
1129 || (flags & BSF_WEAK) != 0
1131 || bfd_is_com_section (bfd_get_section (sym)))
1132 keep = strip_symbols != STRIP_UNNEEDED;
1133 else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */
1134 keep = (strip_symbols != STRIP_DEBUG
1135 && strip_symbols != STRIP_UNNEEDED
1136 && ! convert_debugging);
1137 else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym)))
1138 /* COMDAT sections store special information in local
1139 symbols, so we cannot risk stripping any of them. */
1141 else /* Local symbol. */
1142 keep = (strip_symbols != STRIP_UNNEEDED
1143 && (discard_locals != LOCALS_ALL
1144 && (discard_locals != LOCALS_START_L
1145 || ! bfd_is_local_label (abfd, sym))));
1147 if (keep && is_specified_symbol (name, strip_specific_htab))
1149 /* There are multiple ways to set 'keep' above, but if it
1150 was the relocatable symbol case, then that's an error. */
1153 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name);
1161 && !(flags & BSF_KEEP)
1162 && is_specified_symbol (name, strip_unneeded_htab))
1166 && ((keep_file_symbols && (flags & BSF_FILE))
1167 || is_specified_symbol (name, keep_specific_htab)))
1170 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
1175 if ((flags & BSF_GLOBAL) != 0
1176 && (weaken || is_specified_symbol (name, weaken_specific_htab)))
1178 sym->flags &= ~ BSF_GLOBAL;
1179 sym->flags |= BSF_WEAK;
1183 && (flags & (BSF_GLOBAL | BSF_WEAK))
1184 && (is_specified_symbol (name, localize_specific_htab)
1185 || (htab_elements (keepglobal_specific_htab) != 0
1186 && ! is_specified_symbol (name, keepglobal_specific_htab))
1187 || (localize_hidden && is_hidden_symbol (sym))))
1189 sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
1190 sym->flags |= BSF_LOCAL;
1194 && (flags & BSF_LOCAL)
1195 && is_specified_symbol (name, globalize_specific_htab))
1197 sym->flags &= ~ BSF_LOCAL;
1198 sym->flags |= BSF_GLOBAL;
1201 to[dst_count++] = sym;
1205 to[dst_count] = NULL;
1210 /* Find the redefined name of symbol SOURCE. */
1213 lookup_sym_redefinition (const char *source)
1215 struct redefine_node *list;
1217 for (list = redefine_sym_list; list != NULL; list = list->next)
1218 if (strcmp (source, list->source) == 0)
1219 return list->target;
1224 /* Add a node to a symbol redefine list. */
1227 redefine_list_append (const char *cause, const char *source, const char *target)
1229 struct redefine_node **p;
1230 struct redefine_node *list;
1231 struct redefine_node *new_node;
1233 for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next)
1235 if (strcmp (source, list->source) == 0)
1236 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1239 if (strcmp (target, list->target) == 0)
1240 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1244 new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node));
1246 new_node->source = strdup (source);
1247 new_node->target = strdup (target);
1248 new_node->next = NULL;
1253 /* Handle the --redefine-syms option. Read lines containing "old new"
1254 from the file, and add them to the symbol redefine list. */
1257 add_redefine_syms_file (const char *filename)
1266 file = fopen (filename, "r");
1268 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1269 filename, strerror (errno));
1272 buf = (char *) xmalloc (bufsize + 1 /* For the terminating NUL. */);
1280 /* Collect the input symbol name. */
1281 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1289 buf = (char *) xrealloc (buf, bufsize + 1);
1297 /* Eat white space between the symbol names. */
1298 while (IS_WHITESPACE (c))
1300 if (c == '#' || IS_LINE_TERMINATOR (c))
1305 /* Collect the output symbol name. */
1307 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1315 buf = (char *) xrealloc (buf, bufsize + 1);
1323 /* Eat white space at end of line. */
1324 while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c))
1329 if ((c == '\r' && (c = getc (file)) == '\n')
1330 || c == '\n' || c == EOF)
1333 /* Append the redefinition to the list. */
1335 redefine_list_append (filename, &buf[0], &buf[outsym_off]);
1346 fatal (_("%s:%d: garbage found at end of line"), filename, lineno);
1348 if (len != 0 && (outsym_off == 0 || outsym_off == len))
1349 fatal (_("%s:%d: missing new symbol name"), filename, lineno);
1352 /* Eat the rest of the line and finish it. */
1353 while (c != '\n' && c != EOF)
1359 fatal (_("%s:%d: premature end of file"), filename, lineno);
1364 /* Copy unkown object file IBFD onto OBFD.
1365 Returns TRUE upon success, FALSE otherwise. */
1368 copy_unknown_object (bfd *ibfd, bfd *obfd)
1376 if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1378 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1385 non_fatal (_("stat returns negative size for `%s'"),
1386 bfd_get_archive_filename (ibfd));
1390 if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1392 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1397 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1398 bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1400 cbuf = (char *) xmalloc (BUFSIZE);
1402 while (ncopied < size)
1404 tocopy = size - ncopied;
1405 if (tocopy > BUFSIZE)
1408 if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1409 != (bfd_size_type) tocopy)
1411 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1416 if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1417 != (bfd_size_type) tocopy)
1419 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1427 /* We should at least to be able to read it back when copying an
1428 unknown object in an archive. */
1429 chmod (bfd_get_filename (obfd), buf.st_mode | S_IRUSR);
1434 /* Copy object file IBFD onto OBFD.
1435 Returns TRUE upon success, FALSE otherwise. */
1438 copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
1442 asection **osections = NULL;
1443 asection *gnu_debuglink_section = NULL;
1444 bfd_size_type *gaps = NULL;
1445 bfd_size_type max_gap = 0;
1448 enum bfd_architecture iarch;
1451 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1452 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
1453 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
1454 fatal (_("Unable to change endianness of input file(s)"));
1456 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1458 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1463 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
1464 bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
1465 bfd_get_filename (obfd), bfd_get_target (obfd));
1474 start = bfd_get_start_address (ibfd);
1475 start += change_start;
1478 /* Neither the start address nor the flags
1479 need to be set for a core file. */
1480 if (bfd_get_format (obfd) != bfd_core)
1484 flags = bfd_get_file_flags (ibfd);
1485 flags |= bfd_flags_to_set;
1486 flags &= ~bfd_flags_to_clear;
1487 flags &= bfd_applicable_file_flags (obfd);
1489 if (strip_symbols == STRIP_ALL)
1490 flags &= ~HAS_RELOC;
1492 if (!bfd_set_start_address (obfd, start)
1493 || !bfd_set_file_flags (obfd, flags))
1495 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1500 /* Copy architecture of input file to output file. */
1501 iarch = bfd_get_arch (ibfd);
1502 imach = bfd_get_mach (ibfd);
1505 if (bfd_get_arch_info (ibfd) == NULL
1506 || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown)
1508 iarch = input_arch->arch;
1509 imach = input_arch->mach;
1512 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
1513 bfd_get_archive_filename (ibfd));
1515 if (!bfd_set_arch_mach (obfd, iarch, imach)
1516 && (ibfd->target_defaulted
1517 || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
1519 if (bfd_get_arch (ibfd) == bfd_arch_unknown)
1520 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1521 bfd_get_archive_filename (ibfd));
1523 non_fatal (_("Output file cannot represent architecture `%s'"),
1524 bfd_printable_arch_mach (bfd_get_arch (ibfd),
1525 bfd_get_mach (ibfd)));
1529 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1531 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1535 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
1536 && bfd_pei_p (obfd))
1538 /* Set up PE parameters. */
1539 pe_data_type *pe = pe_data (obfd);
1541 /* Copy PE parameters before changing them. */
1542 if (ibfd->xvec->flavour == bfd_target_coff_flavour
1543 && bfd_pei_p (ibfd))
1544 pe->pe_opthdr = pe_data (ibfd)->pe_opthdr;
1546 if (pe_file_alignment != (bfd_vma) -1)
1547 pe->pe_opthdr.FileAlignment = pe_file_alignment;
1549 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
1551 if (pe_heap_commit != (bfd_vma) -1)
1552 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_commit;
1554 if (pe_heap_reserve != (bfd_vma) -1)
1555 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_reserve;
1557 if (pe_image_base != (bfd_vma) -1)
1558 pe->pe_opthdr.ImageBase = pe_image_base;
1560 if (pe_section_alignment != (bfd_vma) -1)
1561 pe->pe_opthdr.SectionAlignment = pe_section_alignment;
1563 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
1565 if (pe_stack_commit != (bfd_vma) -1)
1566 pe->pe_opthdr.SizeOfStackCommit = pe_stack_commit;
1568 if (pe_stack_reserve != (bfd_vma) -1)
1569 pe->pe_opthdr.SizeOfStackCommit = pe_stack_reserve;
1571 if (pe_subsystem != -1)
1572 pe->pe_opthdr.Subsystem = pe_subsystem;
1574 if (pe_major_subsystem_version != -1)
1575 pe->pe_opthdr.MajorSubsystemVersion = pe_major_subsystem_version;
1577 if (pe_minor_subsystem_version != -1)
1578 pe->pe_opthdr.MinorSubsystemVersion = pe_minor_subsystem_version;
1580 if (pe_file_alignment > pe_section_alignment)
1582 char file_alignment[20], section_alignment[20];
1584 sprintf_vma (file_alignment, pe_file_alignment);
1585 sprintf_vma (section_alignment, pe_section_alignment);
1586 non_fatal (_("warning: file alignment (0x%s) > section alignment (0x%s)"),
1588 file_alignment, section_alignment);
1595 if (osympp != isympp)
1601 symsize = bfd_get_symtab_upper_bound (ibfd);
1604 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1608 osympp = isympp = (asymbol **) xmalloc (symsize);
1609 symcount = bfd_canonicalize_symtab (ibfd, isympp);
1612 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1616 /* BFD mandates that all output sections be created and sizes set before
1617 any output is done. Thus, we traverse all sections multiple times. */
1618 bfd_map_over_sections (ibfd, setup_section, obfd);
1620 if (!extract_symbol)
1621 setup_bfd_headers (ibfd, obfd);
1623 if (add_sections != NULL)
1625 struct section_add *padd;
1626 struct section_list *pset;
1628 for (padd = add_sections; padd != NULL; padd = padd->next)
1632 pset = find_section_list (padd->name, FALSE);
1636 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
1637 if (pset != NULL && pset->set_flags)
1638 flags = pset->flags | SEC_HAS_CONTENTS;
1640 /* bfd_make_section_with_flags() does not return very helpful
1641 error codes, so check for the most likely user error first. */
1642 if (bfd_get_section_by_name (obfd, padd->name))
1644 bfd_nonfatal_message (NULL, obfd, NULL,
1645 _("can't add section '%s'"), padd->name);
1650 /* We use LINKER_CREATED here so that the backend hooks
1651 will create any special section type information,
1652 instead of presuming we know what we're doing merely
1653 because we set the flags. */
1654 padd->section = bfd_make_section_with_flags
1655 (obfd, padd->name, flags | SEC_LINKER_CREATED);
1656 if (padd->section == NULL)
1658 bfd_nonfatal_message (NULL, obfd, NULL,
1659 _("can't create section `%s'"),
1665 if (! bfd_set_section_size (obfd, padd->section, padd->size))
1667 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1673 if (pset->change_vma != CHANGE_IGNORE)
1674 if (! bfd_set_section_vma (obfd, padd->section,
1677 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1681 if (pset->change_lma != CHANGE_IGNORE)
1683 padd->section->lma = pset->lma_val;
1685 if (! bfd_set_section_alignment
1686 (obfd, padd->section,
1687 bfd_section_alignment (obfd, padd->section)))
1689 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1697 if (gnu_debuglink_filename != NULL)
1699 gnu_debuglink_section = bfd_create_gnu_debuglink_section
1700 (obfd, gnu_debuglink_filename);
1702 if (gnu_debuglink_section == NULL)
1704 bfd_nonfatal_message (NULL, obfd, NULL,
1705 _("cannot create debug link section `%s'"),
1706 gnu_debuglink_filename);
1710 /* Special processing for PE format files. We
1711 have no way to distinguish PE from COFF here. */
1712 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour)
1714 bfd_vma debuglink_vma;
1715 asection * highest_section;
1718 /* The PE spec requires that all sections be adjacent and sorted
1719 in ascending order of VMA. It also specifies that debug
1720 sections should be last. This is despite the fact that debug
1721 sections are not loaded into memory and so in theory have no
1724 This means that the debuglink section must be given a non-zero
1725 VMA which makes it contiguous with other debug sections. So
1726 walk the current section list, find the section with the
1727 highest VMA and start the debuglink section after that one. */
1728 for (sec = obfd->sections, highest_section = NULL;
1732 && (highest_section == NULL
1733 || sec->vma > highest_section->vma))
1734 highest_section = sec;
1736 if (highest_section)
1737 debuglink_vma = BFD_ALIGN (highest_section->vma
1738 + highest_section->size,
1739 /* FIXME: We ought to be using
1740 COFF_PAGE_SIZE here or maybe
1741 bfd_get_section_alignment() (if it
1742 was set) but since this is for PE
1743 and we know the required alignment
1744 it is easier just to hard code it. */
1747 /* Umm, not sure what to do in this case. */
1748 debuglink_vma = 0x1000;
1750 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
1754 if (bfd_count_sections (obfd) != 0
1755 && (gap_fill_set || pad_to_set))
1760 /* We must fill in gaps between the sections and/or we must pad
1761 the last section to a specified address. We do this by
1762 grabbing a list of the sections, sorting them by VMA, and
1763 increasing the section sizes as required to fill the gaps.
1764 We write out the gap contents below. */
1766 c = bfd_count_sections (obfd);
1767 osections = (asection **) xmalloc (c * sizeof (asection *));
1769 bfd_map_over_sections (obfd, get_sections, &set);
1771 qsort (osections, c, sizeof (asection *), compare_section_lma);
1773 gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type));
1774 memset (gaps, 0, c * sizeof (bfd_size_type));
1778 for (i = 0; i < c - 1; i++)
1782 bfd_vma gap_start, gap_stop;
1784 flags = bfd_get_section_flags (obfd, osections[i]);
1785 if ((flags & SEC_HAS_CONTENTS) == 0
1786 || (flags & SEC_LOAD) == 0)
1789 size = bfd_section_size (obfd, osections[i]);
1790 gap_start = bfd_section_lma (obfd, osections[i]) + size;
1791 gap_stop = bfd_section_lma (obfd, osections[i + 1]);
1792 if (gap_start < gap_stop)
1794 if (! bfd_set_section_size (obfd, osections[i],
1795 size + (gap_stop - gap_start)))
1797 bfd_nonfatal_message (NULL, obfd, osections[i],
1798 _("Can't fill gap after section"));
1802 gaps[i] = gap_stop - gap_start;
1803 if (max_gap < gap_stop - gap_start)
1804 max_gap = gap_stop - gap_start;
1814 lma = bfd_section_lma (obfd, osections[c - 1]);
1815 size = bfd_section_size (obfd, osections[c - 1]);
1816 if (lma + size < pad_to)
1818 if (! bfd_set_section_size (obfd, osections[c - 1],
1821 bfd_nonfatal_message (NULL, obfd, osections[c - 1],
1822 _("can't add padding"));
1827 gaps[c - 1] = pad_to - (lma + size);
1828 if (max_gap < pad_to - (lma + size))
1829 max_gap = pad_to - (lma + size);
1835 /* Symbol filtering must happen after the output sections
1836 have been created, but before their contents are set. */
1838 if (convert_debugging)
1839 dhandle = read_debugging_info (ibfd, isympp, symcount, FALSE);
1841 if (strip_symbols == STRIP_DEBUG
1842 || strip_symbols == STRIP_ALL
1843 || strip_symbols == STRIP_UNNEEDED
1844 || strip_symbols == STRIP_NONDEBUG
1845 || discard_locals != LOCALS_UNDEF
1847 || htab_elements (strip_specific_htab) != 0
1848 || htab_elements (keep_specific_htab) != 0
1849 || htab_elements (localize_specific_htab) != 0
1850 || htab_elements (globalize_specific_htab) != 0
1851 || htab_elements (keepglobal_specific_htab) != 0
1852 || htab_elements (weaken_specific_htab) != 0
1853 || prefix_symbols_string
1856 || convert_debugging
1857 || change_leading_char
1858 || remove_leading_char
1859 || redefine_sym_list
1862 /* Mark symbols used in output relocations so that they
1863 are kept, even if they are local labels or static symbols.
1865 Note we iterate over the input sections examining their
1866 relocations since the relocations for the output sections
1867 haven't been set yet. mark_symbols_used_in_relocations will
1868 ignore input sections which have no corresponding output
1870 if (strip_symbols != STRIP_ALL)
1871 bfd_map_over_sections (ibfd,
1872 mark_symbols_used_in_relocations,
1874 osympp = (asymbol **) xmalloc ((symcount + 1) * sizeof (asymbol *));
1875 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
1878 if (convert_debugging && dhandle != NULL)
1880 if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
1887 bfd_set_symtab (obfd, osympp, symcount);
1889 /* This has to happen before section positions are set. */
1890 bfd_map_over_sections (ibfd, copy_relocations_in_section, obfd);
1892 /* This has to happen after the symbol table has been set. */
1893 bfd_map_over_sections (ibfd, copy_section, obfd);
1895 if (add_sections != NULL)
1897 struct section_add *padd;
1899 for (padd = add_sections; padd != NULL; padd = padd->next)
1901 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
1904 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1910 if (gnu_debuglink_filename != NULL)
1912 if (! bfd_fill_in_gnu_debuglink_section
1913 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
1915 bfd_nonfatal_message (NULL, obfd, NULL,
1916 _("cannot fill debug link section `%s'"),
1917 gnu_debuglink_filename);
1922 if (gap_fill_set || pad_to_set)
1927 /* Fill in the gaps. */
1930 buf = (bfd_byte *) xmalloc (max_gap);
1931 memset (buf, gap_fill, max_gap);
1933 c = bfd_count_sections (obfd);
1934 for (i = 0; i < c; i++)
1942 off = bfd_section_size (obfd, osections[i]) - left;
1953 if (! bfd_set_section_contents (obfd, osections[i], buf,
1956 bfd_nonfatal_message (NULL, obfd, osections[i], NULL);
1967 /* Do not copy backend data if --extract-symbol is passed; anything
1968 that needs to look at the section contents will fail. */
1972 /* Allow the BFD backend to copy any private data it understands
1973 from the input BFD to the output BFD. This is done last to
1974 permit the routine to look at the filtered symbol table, which is
1975 important for the ECOFF code at least. */
1976 if (! bfd_copy_private_bfd_data (ibfd, obfd))
1978 bfd_nonfatal_message (NULL, obfd, NULL,
1979 _("error copying private BFD data"));
1983 /* Switch to the alternate machine code. We have to do this at the
1984 very end, because we only initialize the header when we create
1985 the first section. */
1986 if (use_alt_mach_code != 0)
1988 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
1990 non_fatal (_("this target does not support %lu alternative machine codes"),
1992 if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
1994 non_fatal (_("treating that number as an absolute e_machine value instead"));
1995 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
1998 non_fatal (_("ignoring the alternative value"));
2005 /* Read each archive element in turn from IBFD, copy the
2006 contents to temp file, and keep the temp file handle.
2007 If 'force_output_target' is TRUE then make sure that
2008 all elements in the new archive are of the type
2012 copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
2013 bfd_boolean force_output_target,
2014 const bfd_arch_info_type *input_arch)
2018 struct name_list *next;
2022 bfd **ptr = &obfd->archive_head;
2025 const char *filename;
2027 /* Make a temp directory to hold the contents. */
2028 dir = make_tempdir (bfd_get_filename (obfd));
2030 fatal (_("cannot create tempdir for archive copying (error: %s)"),
2033 obfd->has_armap = ibfd->has_armap;
2034 obfd->is_thin_archive = ibfd->is_thin_archive;
2038 this_element = bfd_openr_next_archived_file (ibfd, NULL);
2040 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2043 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
2047 while (!status && this_element != NULL)
2053 int stat_status = 0;
2054 bfd_boolean del = TRUE;
2055 bfd_boolean ok_object;
2057 /* Create an output file for this member. */
2058 output_name = concat (dir, "/",
2059 bfd_get_filename (this_element), (char *) 0);
2061 /* If the file already exists, make another temp dir. */
2062 if (stat (output_name, &buf) >= 0)
2064 output_name = make_tempdir (output_name);
2065 if (output_name == NULL)
2066 fatal (_("cannot create tempdir for archive copying (error: %s)"),
2069 l = (struct name_list *) xmalloc (sizeof (struct name_list));
2070 l->name = output_name;
2074 output_name = concat (output_name, "/",
2075 bfd_get_filename (this_element), (char *) 0);
2080 stat_status = bfd_stat_arch_elt (this_element, &buf);
2082 if (stat_status != 0)
2083 non_fatal (_("internal stat error on %s"),
2084 bfd_get_filename (this_element));
2087 l = (struct name_list *) xmalloc (sizeof (struct name_list));
2088 l->name = output_name;
2093 ok_object = bfd_check_format (this_element, bfd_object);
2095 bfd_nonfatal_message (NULL, this_element, NULL,
2096 _("Unable to recognise the format of file"));
2098 /* PR binutils/3110: Cope with archives
2099 containing multiple target types. */
2100 if (force_output_target || !ok_object)
2101 output_bfd = bfd_openw (output_name, output_target);
2103 output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
2105 if (output_bfd == NULL)
2107 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2114 del = !copy_object (this_element, output_bfd, input_arch);
2116 if (del && bfd_get_arch (this_element) == bfd_arch_unknown)
2117 /* Try again as an unknown object file. */
2119 else if (!bfd_close (output_bfd))
2121 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2122 /* Error in new object file. Don't change archive. */
2129 del = !copy_unknown_object (this_element, output_bfd);
2130 if (!bfd_close_all_done (output_bfd))
2132 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2133 /* Error in new object file. Don't change archive. */
2140 unlink (output_name);
2145 if (preserve_dates && stat_status == 0)
2146 set_times (output_name, &buf);
2148 /* Open the newly output file and attach to our list. */
2149 output_bfd = bfd_openr (output_name, output_target);
2151 l->obfd = output_bfd;
2154 ptr = &output_bfd->archive_next;
2156 last_element = this_element;
2158 this_element = bfd_openr_next_archived_file (ibfd, last_element);
2160 bfd_close (last_element);
2165 filename = bfd_get_filename (obfd);
2166 if (!bfd_close (obfd))
2169 bfd_nonfatal_message (filename, NULL, NULL, NULL);
2173 filename = bfd_get_filename (ibfd);
2174 if (!bfd_close (ibfd))
2177 bfd_nonfatal_message (filename, NULL, NULL, NULL);
2181 /* Delete all the files that we opened. */
2182 for (l = list; l != NULL; l = l->next)
2184 if (l->obfd == NULL)
2188 bfd_close (l->obfd);
2196 set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_handling style)
2198 /* This is only relevant to Coff targets. */
2199 if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
2202 && bfd_get_flavour (input_bfd) == bfd_target_coff_flavour)
2203 style = bfd_coff_long_section_names (input_bfd) ? ENABLE : DISABLE;
2204 bfd_coff_set_long_section_names (output_bfd, style != DISABLE);
2208 /* The top-level control. */
2211 copy_file (const char *input_filename, const char *output_filename,
2212 const char *input_target, const char *output_target,
2213 const bfd_arch_info_type *input_arch)
2216 char **obj_matching;
2217 char **core_matching;
2218 off_t size = get_file_size (input_filename);
2223 non_fatal (_("error: the input file '%s' is empty"),
2229 /* To allow us to do "strip *" without dying on the first
2230 non-object file, failures are nonfatal. */
2231 ibfd = bfd_openr (input_filename, input_target);
2234 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2239 switch (do_debug_sections)
2242 ibfd->flags |= BFD_COMPRESS;
2245 ibfd->flags |= BFD_DECOMPRESS;
2251 if (bfd_check_format (ibfd, bfd_archive))
2253 bfd_boolean force_output_target;
2256 /* bfd_get_target does not return the correct value until
2257 bfd_check_format succeeds. */
2258 if (output_target == NULL)
2260 output_target = bfd_get_target (ibfd);
2261 force_output_target = FALSE;
2264 force_output_target = TRUE;
2266 obfd = bfd_openw (output_filename, output_target);
2269 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2273 /* This is a no-op on non-Coff targets. */
2274 set_long_section_mode (obfd, ibfd, long_section_names);
2276 copy_archive (ibfd, obfd, output_target, force_output_target, input_arch);
2278 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
2283 /* bfd_get_target does not return the correct value until
2284 bfd_check_format succeeds. */
2285 if (output_target == NULL)
2286 output_target = bfd_get_target (ibfd);
2288 obfd = bfd_openw (output_filename, output_target);
2291 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2295 /* This is a no-op on non-Coff targets. */
2296 set_long_section_mode (obfd, ibfd, long_section_names);
2298 if (! copy_object (ibfd, obfd, input_arch))
2301 if (!bfd_close (obfd))
2304 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2308 if (!bfd_close (ibfd))
2311 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2317 bfd_error_type obj_error = bfd_get_error ();
2318 bfd_error_type core_error;
2320 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
2322 /* This probably can't happen.. */
2323 if (obj_error == bfd_error_file_ambiguously_recognized)
2324 free (obj_matching);
2328 core_error = bfd_get_error ();
2329 /* Report the object error in preference to the core error. */
2330 if (obj_error != core_error)
2331 bfd_set_error (obj_error);
2333 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2335 if (obj_error == bfd_error_file_ambiguously_recognized)
2337 list_matching_formats (obj_matching);
2338 free (obj_matching);
2340 if (core_error == bfd_error_file_ambiguously_recognized)
2342 list_matching_formats (core_matching);
2343 free (core_matching);
2350 /* Add a name to the section renaming list. */
2353 add_section_rename (const char * old_name, const char * new_name,
2356 section_rename * srename;
2358 /* Check for conflicts first. */
2359 for (srename = section_rename_list; srename != NULL; srename = srename->next)
2360 if (strcmp (srename->old_name, old_name) == 0)
2362 /* Silently ignore duplicate definitions. */
2363 if (strcmp (srename->new_name, new_name) == 0
2364 && srename->flags == flags)
2367 fatal (_("Multiple renames of section %s"), old_name);
2370 srename = (section_rename *) xmalloc (sizeof (* srename));
2372 srename->old_name = old_name;
2373 srename->new_name = new_name;
2374 srename->flags = flags;
2375 srename->next = section_rename_list;
2377 section_rename_list = srename;
2380 /* Check the section rename list for a new name of the input section
2381 ISECTION. Return the new name if one is found.
2382 Also set RETURNED_FLAGS to the flags to be used for this section. */
2385 find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection,
2386 flagword * returned_flags)
2388 const char * old_name = bfd_section_name (ibfd, isection);
2389 section_rename * srename;
2391 /* Default to using the flags of the input section. */
2392 * returned_flags = bfd_get_section_flags (ibfd, isection);
2394 for (srename = section_rename_list; srename != NULL; srename = srename->next)
2395 if (strcmp (srename->old_name, old_name) == 0)
2397 if (srename->flags != (flagword) -1)
2398 * returned_flags = srename->flags;
2400 return srename->new_name;
2406 /* Once each of the sections is copied, we may still need to do some
2407 finalization work for private section headers. Do that here. */
2410 setup_bfd_headers (bfd *ibfd, bfd *obfd)
2412 /* Allow the BFD backend to copy any private data it understands
2413 from the input section to the output section. */
2414 if (! bfd_copy_private_header_data (ibfd, obfd))
2417 bfd_nonfatal_message (NULL, ibfd, NULL,
2418 _("error in private header data"));
2422 /* All went well. */
2426 /* Create a section in OBFD with the same
2427 name and attributes as ISECTION in IBFD. */
2430 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2432 bfd *obfd = (bfd *) obfdarg;
2433 struct section_list *p;
2441 char *prefix = NULL;
2442 bfd_boolean make_nobits;
2444 if (is_strip_section (ibfd, isection))
2447 p = find_section_list (bfd_section_name (ibfd, isection), FALSE);
2451 /* Get the, possibly new, name of the output section. */
2452 name = find_section_rename (ibfd, isection, & flags);
2454 /* Prefix sections. */
2455 if ((prefix_alloc_sections_string)
2456 && (bfd_get_section_flags (ibfd, isection) & SEC_ALLOC))
2457 prefix = prefix_alloc_sections_string;
2458 else if (prefix_sections_string)
2459 prefix = prefix_sections_string;
2465 n = (char *) xmalloc (strlen (prefix) + strlen (name) + 1);
2471 make_nobits = FALSE;
2472 if (p != NULL && p->set_flags)
2473 flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
2474 else if (strip_symbols == STRIP_NONDEBUG
2475 && (flags & (SEC_ALLOC | SEC_GROUP)) != 0
2476 && !(ibfd->xvec->flavour == bfd_target_elf_flavour
2477 && elf_section_type (isection) == SHT_NOTE))
2479 flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
2480 if (obfd->xvec->flavour == bfd_target_elf_flavour)
2484 /* Twiddle the input section flags so that it seems to
2485 elf.c:copy_private_bfd_data that section flags have not
2486 changed between input and output sections. This hack
2487 prevents wholesale rewriting of the program headers. */
2488 isection->flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
2492 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
2494 if (osection == NULL)
2496 err = _("failed to create output section");
2501 elf_section_type (osection) = SHT_NOBITS;
2503 size = bfd_section_size (ibfd, isection);
2505 size = (size + interleave - 1) / interleave * copy_width;
2506 else if (extract_symbol)
2508 if (! bfd_set_section_size (obfd, osection, size))
2510 err = _("failed to set size");
2514 vma = bfd_section_vma (ibfd, isection);
2515 if (p != NULL && p->change_vma == CHANGE_MODIFY)
2517 else if (p != NULL && p->change_vma == CHANGE_SET)
2520 vma += change_section_address;
2522 if (! bfd_set_section_vma (obfd, osection, vma))
2524 err = _("failed to set vma");
2528 lma = isection->lma;
2529 if ((p != NULL) && p->change_lma != CHANGE_IGNORE)
2531 if (p->change_lma == CHANGE_MODIFY)
2533 else if (p->change_lma == CHANGE_SET)
2539 lma += change_section_address;
2541 osection->lma = lma;
2543 /* FIXME: This is probably not enough. If we change the LMA we
2544 may have to recompute the header for the file as well. */
2545 if (!bfd_set_section_alignment (obfd,
2547 bfd_section_alignment (ibfd, isection)))
2549 err = _("failed to set alignment");
2553 /* Copy merge entity size. */
2554 osection->entsize = isection->entsize;
2556 /* This used to be mangle_section; we do here to avoid using
2557 bfd_get_section_by_name since some formats allow multiple
2558 sections with the same name. */
2559 isection->output_section = osection;
2560 isection->output_offset = 0;
2562 /* Do not copy backend data if --extract-symbol is passed; anything
2563 that needs to look at the section contents will fail. */
2567 if ((isection->flags & SEC_GROUP) != 0)
2569 asymbol *gsym = group_signature (isection);
2573 gsym->flags |= BSF_KEEP;
2574 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
2575 elf_group_id (isection) = gsym;
2579 /* Allow the BFD backend to copy any private data it understands
2580 from the input section to the output section. */
2581 if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
2583 err = _("failed to copy private data");
2587 /* All went well. */
2592 bfd_nonfatal_message (NULL, obfd, osection, err);
2595 /* Return TRUE if input section ISECTION should be skipped. */
2598 skip_section (bfd *ibfd, sec_ptr isection)
2604 /* If we have already failed earlier on,
2605 do not keep on generating complaints now. */
2612 if (is_strip_section (ibfd, isection))
2615 flags = bfd_get_section_flags (ibfd, isection);
2616 if ((flags & SEC_GROUP) != 0)
2619 osection = isection->output_section;
2620 size = bfd_get_section_size (isection);
2622 if (size == 0 || osection == 0)
2628 /* Copy relocations in input section ISECTION of IBFD to an output
2629 section with the same name in OBFDARG. If stripping then don't
2630 copy any relocation info. */
2633 copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2635 bfd *obfd = (bfd *) obfdarg;
2641 if (skip_section (ibfd, isection))
2644 osection = isection->output_section;
2646 /* Core files do not need to be relocated. */
2647 if (bfd_get_format (obfd) == bfd_core)
2651 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2655 /* Do not complain if the target does not support relocations. */
2656 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2661 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
2668 bfd_set_reloc (obfd, osection, NULL, 0);
2671 relpp = (arelent **) xmalloc (relsize);
2672 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
2676 bfd_nonfatal_message (NULL, ibfd, isection,
2677 _("relocation count is negative"));
2681 if (strip_symbols == STRIP_ALL)
2683 /* Remove relocations which are not in
2684 keep_strip_specific_list. */
2685 arelent **temp_relpp;
2686 long temp_relcount = 0;
2689 temp_relpp = (arelent **) xmalloc (relsize);
2690 for (i = 0; i < relcount; i++)
2691 if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
2692 keep_specific_htab))
2693 temp_relpp [temp_relcount++] = relpp [i];
2694 relcount = temp_relcount;
2699 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
2702 osection->flags &= ~SEC_RELOC;
2708 /* Copy the data of input section ISECTION of IBFD
2709 to an output section with the same name in OBFD. */
2712 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2714 bfd *obfd = (bfd *) obfdarg;
2715 struct section_list *p;
2719 if (skip_section (ibfd, isection))
2722 osection = isection->output_section;
2723 size = bfd_get_section_size (isection);
2725 p = find_section_list (bfd_get_section_name (ibfd, isection), FALSE);
2727 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
2728 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
2730 bfd_byte *memhunk = NULL;
2732 if (!bfd_get_full_section_contents (ibfd, isection, &memhunk))
2735 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
2741 /* We don't handle leftover bytes (too many possible behaviors,
2742 and we don't know what the user wants). The section length
2743 must be a multiple of the number of bytes to swap. */
2744 if ((size % reverse_bytes) == 0)
2749 for (i = 0; i < size; i += reverse_bytes)
2750 for (j = 0; j < (unsigned long)(reverse_bytes / 2); j++)
2752 bfd_byte *m = (bfd_byte *) memhunk;
2755 m[i + j] = m[(i + reverse_bytes) - (j + 1)];
2756 m[(i + reverse_bytes) - (j + 1)] = b;
2760 /* User must pad the section up in order to do this. */
2761 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
2762 bfd_section_name (ibfd, isection), reverse_bytes);
2767 /* Keep only every `copy_byte'th byte in MEMHUNK. */
2768 char *from = (char *) memhunk + copy_byte;
2769 char *to = (char *) memhunk;
2770 char *end = (char *) memhunk + size;
2773 for (; from < end; from += interleave)
2774 for (i = 0; i < copy_width; i++)
2777 size = (size + interleave - 1 - copy_byte) / interleave * copy_width;
2778 osection->lma /= interleave;
2781 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2784 bfd_nonfatal_message (NULL, obfd, osection, NULL);
2789 else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0)
2791 void *memhunk = xmalloc (size);
2793 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
2794 flag--they can just remove the section entirely and add it
2795 back again. However, we do permit them to turn on the
2796 SEC_HAS_CONTENTS flag, and take it to mean that the section
2797 contents should be zeroed out. */
2799 memset (memhunk, 0, size);
2800 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2803 bfd_nonfatal_message (NULL, obfd, osection, NULL);
2810 /* Get all the sections. This is used when --gap-fill or --pad-to is
2814 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
2816 asection ***secppp = (asection ***) secppparg;
2818 **secppp = osection;
2822 /* Sort sections by VMA. This is called via qsort, and is used when
2823 --gap-fill or --pad-to is used. We force non loadable or empty
2824 sections to the front, where they are easier to ignore. */
2827 compare_section_lma (const void *arg1, const void *arg2)
2829 const asection *const *sec1 = (const asection * const *) arg1;
2830 const asection *const *sec2 = (const asection * const *) arg2;
2831 flagword flags1, flags2;
2833 /* Sort non loadable sections to the front. */
2834 flags1 = (*sec1)->flags;
2835 flags2 = (*sec2)->flags;
2836 if ((flags1 & SEC_HAS_CONTENTS) == 0
2837 || (flags1 & SEC_LOAD) == 0)
2839 if ((flags2 & SEC_HAS_CONTENTS) != 0
2840 && (flags2 & SEC_LOAD) != 0)
2845 if ((flags2 & SEC_HAS_CONTENTS) == 0
2846 || (flags2 & SEC_LOAD) == 0)
2850 /* Sort sections by LMA. */
2851 if ((*sec1)->lma > (*sec2)->lma)
2853 else if ((*sec1)->lma < (*sec2)->lma)
2856 /* Sort sections with the same LMA by size. */
2857 if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
2859 else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
2865 /* Mark all the symbols which will be used in output relocations with
2866 the BSF_KEEP flag so that those symbols will not be stripped.
2868 Ignore relocations which will not appear in the output file. */
2871 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
2873 asymbol **symbols = (asymbol **) symbolsarg;
2878 /* Ignore an input section with no corresponding output section. */
2879 if (isection->output_section == NULL)
2882 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2885 /* Do not complain if the target does not support relocations. */
2886 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2888 bfd_fatal (bfd_get_filename (ibfd));
2894 relpp = (arelent **) xmalloc (relsize);
2895 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
2897 bfd_fatal (bfd_get_filename (ibfd));
2899 /* Examine each symbol used in a relocation. If it's not one of the
2900 special bfd section symbols, then mark it with BSF_KEEP. */
2901 for (i = 0; i < relcount; i++)
2903 if (*relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
2904 && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
2905 && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
2906 (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
2913 /* Write out debugging information. */
2916 write_debugging_info (bfd *obfd, void *dhandle,
2917 long *symcountp ATTRIBUTE_UNUSED,
2918 asymbol ***symppp ATTRIBUTE_UNUSED)
2920 if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour)
2921 return write_ieee_debugging_info (obfd, dhandle);
2923 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2924 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
2926 bfd_byte *syms, *strings;
2927 bfd_size_type symsize, stringsize;
2928 asection *stabsec, *stabstrsec;
2931 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
2936 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
2937 stabsec = bfd_make_section_with_flags (obfd, ".stab", flags);
2938 stabstrsec = bfd_make_section_with_flags (obfd, ".stabstr", flags);
2940 || stabstrsec == NULL
2941 || ! bfd_set_section_size (obfd, stabsec, symsize)
2942 || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
2943 || ! bfd_set_section_alignment (obfd, stabsec, 2)
2944 || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
2946 bfd_nonfatal_message (NULL, obfd, NULL,
2947 _("can't create debugging section"));
2951 /* We can get away with setting the section contents now because
2952 the next thing the caller is going to do is copy over the
2953 real sections. We may someday have to split the contents
2954 setting out of this function. */
2955 if (! bfd_set_section_contents (obfd, stabsec, syms, 0, symsize)
2956 || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
2959 bfd_nonfatal_message (NULL, obfd, NULL,
2960 _("can't set debugging section contents"));
2967 bfd_nonfatal_message (NULL, obfd, NULL,
2968 _("don't know how to write debugging information for %s"),
2969 bfd_get_target (obfd));
2974 strip_main (int argc, char *argv[])
2976 char *input_target = NULL;
2977 char *output_target = NULL;
2978 bfd_boolean show_version = FALSE;
2979 bfd_boolean formats_info = FALSE;
2982 struct section_list *p;
2983 char *output_file = NULL;
2985 while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
2986 strip_options, (int *) 0)) != EOF)
2991 input_target = optarg;
2994 output_target = optarg;
2997 input_target = output_target = optarg;
3000 p = find_section_list (optarg, TRUE);
3002 sections_removed = TRUE;
3005 strip_symbols = STRIP_ALL;
3009 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
3010 strip_symbols = STRIP_DEBUG;
3012 case OPTION_STRIP_UNNEEDED:
3013 strip_symbols = STRIP_UNNEEDED;
3016 add_specific_symbol (optarg, keep_specific_htab);
3019 add_specific_symbol (optarg, strip_specific_htab);
3022 output_file = optarg;
3025 preserve_dates = TRUE;
3028 discard_locals = LOCALS_ALL;
3031 discard_locals = LOCALS_START_L;
3037 show_version = TRUE;
3039 case OPTION_FORMATS_INFO:
3040 formats_info = TRUE;
3042 case OPTION_ONLY_KEEP_DEBUG:
3043 strip_symbols = STRIP_NONDEBUG;
3045 case OPTION_KEEP_FILE_SYMBOLS:
3046 keep_file_symbols = 1;
3049 /* We've been given a long option. */
3056 strip_usage (stdout, 0);
3058 strip_usage (stderr, 1);
3069 print_version ("strip");
3071 /* Default is to strip all symbols. */
3072 if (strip_symbols == STRIP_UNDEF
3073 && discard_locals == LOCALS_UNDEF
3074 && htab_elements (strip_specific_htab) == 0)
3075 strip_symbols = STRIP_ALL;
3077 if (output_target == NULL)
3078 output_target = input_target;
3082 || (output_file != NULL && (i + 1) < argc))
3083 strip_usage (stderr, 1);
3085 for (; i < argc; i++)
3087 int hold_status = status;
3088 struct stat statbuf;
3091 if (get_file_size (argv[i]) < 1)
3098 /* No need to check the return value of stat().
3099 It has already been checked in get_file_size(). */
3100 stat (argv[i], &statbuf);
3102 if (output_file == NULL
3103 || filename_cmp (argv[i], output_file) == 0)
3104 tmpname = make_tempname (argv[i]);
3106 tmpname = output_file;
3108 if (tmpname == NULL)
3110 bfd_nonfatal_message (argv[i], NULL, NULL,
3111 _("could not create temporary file to hold stripped copy"));
3117 copy_file (argv[i], tmpname, input_target, output_target, NULL);
3121 set_times (tmpname, &statbuf);
3122 if (output_file != tmpname)
3123 status = (smart_rename (tmpname,
3124 output_file ? output_file : argv[i],
3125 preserve_dates) != 0);
3127 status = hold_status;
3130 unlink_if_ordinary (tmpname);
3131 if (output_file != tmpname)
3138 /* Set up PE subsystem. */
3141 set_pe_subsystem (const char *s)
3143 const char *version, *subsystem;
3153 { "native", 0, IMAGE_SUBSYSTEM_NATIVE },
3154 { "windows", 0, IMAGE_SUBSYSTEM_WINDOWS_GUI },
3155 { "console", 0, IMAGE_SUBSYSTEM_WINDOWS_CUI },
3156 { "posix", 0, IMAGE_SUBSYSTEM_POSIX_CUI },
3157 { "wince", 0, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI },
3158 { "efi-app", 1, IMAGE_SUBSYSTEM_EFI_APPLICATION },
3159 { "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER },
3160 { "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER },
3161 { "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER },
3162 { "xbox", 0, IMAGE_SUBSYSTEM_XBOX }
3168 /* Check for the presence of a version number. */
3169 version = strchr (s, ':');
3170 if (version == NULL)
3174 int len = version - s;
3178 version = copy + 1 + len;
3179 pe_major_subsystem_version = strtoul (version, ©, 0);
3181 pe_minor_subsystem_version = strtoul (copy + 1, ©, 0);
3183 non_fatal (_("%s: bad version in PE subsystem"), s);
3186 /* Check for numeric subsystem. */
3187 value = (short) strtol (subsystem, ©, 0);
3190 for (i = 0; i < ARRAY_SIZE (v); i++)
3191 if (v[i].value == value)
3193 pe_subsystem = value;
3194 set_def = v[i].set_def;
3200 /* Search for subsystem by name. */
3201 for (i = 0; i < ARRAY_SIZE (v); i++)
3202 if (strcmp (subsystem, v[i].name) == 0)
3204 pe_subsystem = v[i].value;
3205 set_def = v[i].set_def;
3213 fatal (_("unknown PE subsystem: %s"), s);
3218 if (pe_file_alignment == (bfd_vma) -1)
3219 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
3220 if (pe_section_alignment == (bfd_vma) -1)
3221 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
3225 free ((char *) subsystem);
3228 /* Convert EFI target to PEI target. */
3231 convert_efi_target (char *efi)
3237 if (strcmp (efi + 4, "ia32") == 0)
3239 /* Change ia32 to i386. */
3244 else if (strcmp (efi + 4, "x86_64") == 0)
3246 /* Change x86_64 to x86-64. */
3252 copy_main (int argc, char *argv[])
3254 char *input_filename = NULL;
3255 char *output_filename = NULL;
3257 char *input_target = NULL;
3258 char *output_target = NULL;
3259 bfd_boolean show_version = FALSE;
3260 bfd_boolean change_warn = TRUE;
3261 bfd_boolean formats_info = FALSE;
3263 struct section_list *p;
3264 struct stat statbuf;
3265 const bfd_arch_info_type *input_arch = NULL;
3267 while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
3268 copy_options, (int *) 0)) != EOF)
3273 copy_byte = atoi (optarg);
3275 fatal (_("byte number must be non-negative"));
3279 input_arch = bfd_scan_arch (optarg);
3280 if (input_arch == NULL)
3281 fatal (_("architecture %s unknown"), optarg);
3287 interleave = atoi (optarg);
3289 fatal (_("interleave must be positive"));
3295 case OPTION_INTERLEAVE_WIDTH:
3296 copy_width = atoi (optarg);
3298 fatal(_("interleave width must be positive"));
3302 case 's': /* "source" - 'I' is preferred */
3303 input_target = optarg;
3307 case 'd': /* "destination" - 'O' is preferred */
3308 output_target = optarg;
3312 input_target = output_target = optarg;
3316 p = find_section_list (optarg, TRUE);
3318 fatal (_("%s both copied and removed"), optarg);
3320 sections_copied = TRUE;
3324 p = find_section_list (optarg, TRUE);
3326 fatal (_("%s both copied and removed"), optarg);
3328 sections_removed = TRUE;
3332 strip_symbols = STRIP_ALL;
3336 strip_symbols = STRIP_DEBUG;
3339 case OPTION_STRIP_UNNEEDED:
3340 strip_symbols = STRIP_UNNEEDED;
3343 case OPTION_ONLY_KEEP_DEBUG:
3344 strip_symbols = STRIP_NONDEBUG;
3347 case OPTION_KEEP_FILE_SYMBOLS:
3348 keep_file_symbols = 1;
3351 case OPTION_ADD_GNU_DEBUGLINK:
3352 gnu_debuglink_filename = optarg;
3356 add_specific_symbol (optarg, keep_specific_htab);
3360 add_specific_symbol (optarg, strip_specific_htab);
3363 case OPTION_STRIP_UNNEEDED_SYMBOL:
3364 add_specific_symbol (optarg, strip_unneeded_htab);
3368 add_specific_symbol (optarg, localize_specific_htab);
3371 case OPTION_GLOBALIZE_SYMBOL:
3372 add_specific_symbol (optarg, globalize_specific_htab);
3376 add_specific_symbol (optarg, keepglobal_specific_htab);
3380 add_specific_symbol (optarg, weaken_specific_htab);
3384 preserve_dates = TRUE;
3392 discard_locals = LOCALS_ALL;
3396 discard_locals = LOCALS_START_L;
3404 show_version = TRUE;
3407 case OPTION_FORMATS_INFO:
3408 formats_info = TRUE;
3415 case OPTION_ADD_SECTION:
3419 struct section_add *pa;
3422 s = strchr (optarg, '=');
3425 fatal (_("bad format for %s"), "--add-section");
3427 pa = (struct section_add *) xmalloc (sizeof (struct section_add));
3428 pa->name = xstrndup (optarg, s - optarg);
3429 pa->filename = s + 1;
3431 /* We don't use get_file_size so that we can do
3432 --add-section .note.GNU_stack=/dev/null
3433 get_file_size doesn't work on /dev/null. */
3435 f = fopen (pa->filename, FOPEN_RB);
3437 fatal (_("cannot open: %s: %s"),
3438 pa->filename, strerror (errno));
3442 pa->contents = (bfd_byte *) xmalloc (alloc);
3450 pa->contents = (bfd_byte *) xrealloc (pa->contents, alloc);
3453 got = fread (pa->contents + off, 1, alloc - off, f);
3455 fatal (_("%s: fread failed"), pa->filename);
3464 pa->next = add_sections;
3469 case OPTION_CHANGE_START:
3470 change_start = parse_vma (optarg, "--change-start");
3473 case OPTION_CHANGE_SECTION_ADDRESS:
3474 case OPTION_CHANGE_SECTION_LMA:
3475 case OPTION_CHANGE_SECTION_VMA:
3480 char *option = NULL;
3482 enum change_action what = CHANGE_IGNORE;
3486 case OPTION_CHANGE_SECTION_ADDRESS:
3487 option = "--change-section-address";
3489 case OPTION_CHANGE_SECTION_LMA:
3490 option = "--change-section-lma";
3492 case OPTION_CHANGE_SECTION_VMA:
3493 option = "--change-section-vma";
3497 s = strchr (optarg, '=');
3500 s = strchr (optarg, '+');
3503 s = strchr (optarg, '-');
3505 fatal (_("bad format for %s"), option);
3510 name = (char *) xmalloc (len + 1);
3511 strncpy (name, optarg, len);
3514 p = find_section_list (name, TRUE);
3516 val = parse_vma (s + 1, option);
3520 case '=': what = CHANGE_SET; break;
3521 case '-': val = - val; /* Drop through. */
3522 case '+': what = CHANGE_MODIFY; break;
3527 case OPTION_CHANGE_SECTION_ADDRESS:
3528 p->change_vma = what;
3532 case OPTION_CHANGE_SECTION_LMA:
3533 p->change_lma = what;
3537 case OPTION_CHANGE_SECTION_VMA:
3538 p->change_vma = what;
3545 case OPTION_CHANGE_ADDRESSES:
3546 change_section_address = parse_vma (optarg, "--change-addresses");
3547 change_start = change_section_address;
3550 case OPTION_CHANGE_WARNINGS:
3554 case OPTION_CHANGE_LEADING_CHAR:
3555 change_leading_char = TRUE;
3558 case OPTION_COMPRESS_DEBUG_SECTIONS:
3559 do_debug_sections = compress;
3562 case OPTION_DEBUGGING:
3563 convert_debugging = TRUE;
3566 case OPTION_DECOMPRESS_DEBUG_SECTIONS:
3567 do_debug_sections = decompress;
3570 case OPTION_GAP_FILL:
3572 bfd_vma gap_fill_vma;
3574 gap_fill_vma = parse_vma (optarg, "--gap-fill");
3575 gap_fill = (bfd_byte) gap_fill_vma;
3576 if ((bfd_vma) gap_fill != gap_fill_vma)
3580 sprintf_vma (buff, gap_fill_vma);
3582 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
3585 gap_fill_set = TRUE;
3589 case OPTION_NO_CHANGE_WARNINGS:
3590 change_warn = FALSE;
3594 pad_to = parse_vma (optarg, "--pad-to");
3598 case OPTION_REMOVE_LEADING_CHAR:
3599 remove_leading_char = TRUE;
3602 case OPTION_REDEFINE_SYM:
3604 /* Push this redefinition onto redefine_symbol_list. */
3608 const char *nextarg;
3609 char *source, *target;
3611 s = strchr (optarg, '=');
3613 fatal (_("bad format for %s"), "--redefine-sym");
3616 source = (char *) xmalloc (len + 1);
3617 strncpy (source, optarg, len);
3621 len = strlen (nextarg);
3622 target = (char *) xmalloc (len + 1);
3623 strcpy (target, nextarg);
3625 redefine_list_append ("--redefine-sym", source, target);
3632 case OPTION_REDEFINE_SYMS:
3633 add_redefine_syms_file (optarg);
3636 case OPTION_SET_SECTION_FLAGS:
3642 s = strchr (optarg, '=');
3644 fatal (_("bad format for %s"), "--set-section-flags");
3647 name = (char *) xmalloc (len + 1);
3648 strncpy (name, optarg, len);
3651 p = find_section_list (name, TRUE);
3653 p->set_flags = TRUE;
3654 p->flags = parse_flags (s + 1);
3658 case OPTION_RENAME_SECTION:
3661 const char *eq, *fl;
3666 eq = strchr (optarg, '=');
3668 fatal (_("bad format for %s"), "--rename-section");
3672 fatal (_("bad format for %s"), "--rename-section");
3674 old_name = (char *) xmalloc (len + 1);
3675 strncpy (old_name, optarg, len);
3679 fl = strchr (eq, ',');
3682 flags = parse_flags (fl + 1);
3692 fatal (_("bad format for %s"), "--rename-section");
3694 new_name = (char *) xmalloc (len + 1);
3695 strncpy (new_name, eq, len);
3698 add_section_rename (old_name, new_name, flags);
3702 case OPTION_SET_START:
3703 set_start = parse_vma (optarg, "--set-start");
3704 set_start_set = TRUE;
3707 case OPTION_SREC_LEN:
3708 Chunk = parse_vma (optarg, "--srec-len");
3711 case OPTION_SREC_FORCES3:
3715 case OPTION_STRIP_SYMBOLS:
3716 add_specific_symbols (optarg, strip_specific_htab);
3719 case OPTION_STRIP_UNNEEDED_SYMBOLS:
3720 add_specific_symbols (optarg, strip_unneeded_htab);
3723 case OPTION_KEEP_SYMBOLS:
3724 add_specific_symbols (optarg, keep_specific_htab);
3727 case OPTION_LOCALIZE_HIDDEN:
3728 localize_hidden = TRUE;
3731 case OPTION_LOCALIZE_SYMBOLS:
3732 add_specific_symbols (optarg, localize_specific_htab);
3735 case OPTION_LONG_SECTION_NAMES:
3736 if (!strcmp ("enable", optarg))
3737 long_section_names = ENABLE;
3738 else if (!strcmp ("disable", optarg))
3739 long_section_names = DISABLE;
3740 else if (!strcmp ("keep", optarg))
3741 long_section_names = KEEP;
3743 fatal (_("unknown long section names option '%s'"), optarg);
3746 case OPTION_GLOBALIZE_SYMBOLS:
3747 add_specific_symbols (optarg, globalize_specific_htab);
3750 case OPTION_KEEPGLOBAL_SYMBOLS:
3751 add_specific_symbols (optarg, keepglobal_specific_htab);
3754 case OPTION_WEAKEN_SYMBOLS:
3755 add_specific_symbols (optarg, weaken_specific_htab);
3758 case OPTION_ALT_MACH_CODE:
3759 use_alt_mach_code = strtoul (optarg, NULL, 0);
3760 if (use_alt_mach_code == 0)
3761 fatal (_("unable to parse alternative machine code"));
3764 case OPTION_PREFIX_SYMBOLS:
3765 prefix_symbols_string = optarg;
3768 case OPTION_PREFIX_SECTIONS:
3769 prefix_sections_string = optarg;
3772 case OPTION_PREFIX_ALLOC_SECTIONS:
3773 prefix_alloc_sections_string = optarg;
3776 case OPTION_READONLY_TEXT:
3777 bfd_flags_to_set |= WP_TEXT;
3778 bfd_flags_to_clear &= ~WP_TEXT;
3781 case OPTION_WRITABLE_TEXT:
3782 bfd_flags_to_clear |= WP_TEXT;
3783 bfd_flags_to_set &= ~WP_TEXT;
3787 bfd_flags_to_set |= D_PAGED;
3788 bfd_flags_to_clear &= ~D_PAGED;
3792 bfd_flags_to_clear |= D_PAGED;
3793 bfd_flags_to_set &= ~D_PAGED;
3796 case OPTION_EXTRACT_SYMBOL:
3797 extract_symbol = TRUE;
3800 case OPTION_REVERSE_BYTES:
3802 int prev = reverse_bytes;
3804 reverse_bytes = atoi (optarg);
3805 if ((reverse_bytes <= 0) || ((reverse_bytes % 2) != 0))
3806 fatal (_("number of bytes to reverse must be positive and even"));
3808 if (prev && prev != reverse_bytes)
3809 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
3814 case OPTION_FILE_ALIGNMENT:
3815 pe_file_alignment = parse_vma (optarg, "--file-alignment");
3821 pe_heap_reserve = strtoul (optarg, &end, 0);
3823 || (*end != '.' && *end != '\0'))
3824 non_fatal (_("%s: invalid reserve value for --heap"),
3826 else if (*end != '\0')
3828 pe_heap_commit = strtoul (end + 1, &end, 0);
3830 non_fatal (_("%s: invalid commit value for --heap"),
3836 case OPTION_IMAGE_BASE:
3837 pe_image_base = parse_vma (optarg, "--image-base");
3840 case OPTION_SECTION_ALIGNMENT:
3841 pe_section_alignment = parse_vma (optarg,
3842 "--section-alignment");
3845 case OPTION_SUBSYSTEM:
3846 set_pe_subsystem (optarg);
3852 pe_stack_reserve = strtoul (optarg, &end, 0);
3854 || (*end != '.' && *end != '\0'))
3855 non_fatal (_("%s: invalid reserve value for --stack"),
3857 else if (*end != '\0')
3859 pe_stack_commit = strtoul (end + 1, &end, 0);
3861 non_fatal (_("%s: invalid commit value for --stack"),
3868 /* We've been given a long option. */
3873 copy_usage (stdout, 0);
3876 copy_usage (stderr, 1);
3887 print_version ("objcopy");
3889 if (interleave && copy_byte == -1)
3890 fatal (_("interleave start byte must be set with --byte"));
3892 if (copy_byte >= interleave)
3893 fatal (_("byte number must be less than interleave"));
3895 if (copy_width > interleave - copy_byte)
3896 fatal (_("interleave width must be less than or equal to interleave - byte`"));
3898 if (optind == argc || optind + 2 < argc)
3899 copy_usage (stderr, 1);
3901 input_filename = argv[optind];
3902 if (optind + 1 < argc)
3903 output_filename = argv[optind + 1];
3905 /* Default is to strip no symbols. */
3906 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
3907 strip_symbols = STRIP_NONE;
3909 if (output_target == NULL)
3910 output_target = input_target;
3912 /* Convert input EFI target to PEI target. */
3913 if (input_target != NULL
3914 && strncmp (input_target, "efi-", 4) == 0)
3918 efi = xstrdup (output_target + 4);
3919 if (strncmp (efi, "bsdrv-", 6) == 0
3920 || strncmp (efi, "rtdrv-", 6) == 0)
3922 else if (strncmp (efi, "app-", 4) != 0)
3923 fatal (_("unknown input EFI target: %s"), input_target);
3926 convert_efi_target (efi);
3929 /* Convert output EFI target to PEI target. */
3930 if (output_target != NULL
3931 && strncmp (output_target, "efi-", 4) == 0)
3935 efi = xstrdup (output_target + 4);
3936 if (strncmp (efi, "app-", 4) == 0)
3938 if (pe_subsystem == -1)
3939 pe_subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
3941 else if (strncmp (efi, "bsdrv-", 6) == 0)
3943 if (pe_subsystem == -1)
3944 pe_subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;
3947 else if (strncmp (efi, "rtdrv-", 6) == 0)
3949 if (pe_subsystem == -1)
3950 pe_subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;
3954 fatal (_("unknown output EFI target: %s"), output_target);
3956 if (pe_file_alignment == (bfd_vma) -1)
3957 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
3958 if (pe_section_alignment == (bfd_vma) -1)
3959 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
3961 output_target = efi;
3962 convert_efi_target (efi);
3966 if (stat (input_filename, & statbuf) < 0)
3967 fatal (_("warning: could not locate '%s'. System error message: %s"),
3968 input_filename, strerror (errno));
3970 /* If there is no destination file, or the source and destination files
3971 are the same, then create a temp and rename the result into the input. */
3972 if (output_filename == NULL
3973 || filename_cmp (input_filename, output_filename) == 0)
3974 tmpname = make_tempname (input_filename);
3976 tmpname = output_filename;
3978 if (tmpname == NULL)
3979 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
3980 input_filename, strerror (errno));
3982 copy_file (input_filename, tmpname, input_target, output_target, input_arch);
3986 set_times (tmpname, &statbuf);
3987 if (tmpname != output_filename)
3988 status = (smart_rename (tmpname, input_filename,
3989 preserve_dates) != 0);
3992 unlink_if_ordinary (tmpname);
3996 for (p = change_sections; p != NULL; p = p->next)
4000 if (p->change_vma != CHANGE_IGNORE)
4004 sprintf_vma (buff, p->vma_val);
4006 /* xgettext:c-format */
4007 non_fatal (_("%s %s%c0x%s never used"),
4008 "--change-section-vma",
4010 p->change_vma == CHANGE_SET ? '=' : '+',
4014 if (p->change_lma != CHANGE_IGNORE)
4018 sprintf_vma (buff, p->lma_val);
4020 /* xgettext:c-format */
4021 non_fatal (_("%s %s%c0x%s never used"),
4022 "--change-section-lma",
4024 p->change_lma == CHANGE_SET ? '=' : '+',
4035 main (int argc, char *argv[])
4037 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
4038 setlocale (LC_MESSAGES, "");
4040 #if defined (HAVE_SETLOCALE)
4041 setlocale (LC_CTYPE, "");
4043 bindtextdomain (PACKAGE, LOCALEDIR);
4044 textdomain (PACKAGE);
4046 program_name = argv[0];
4047 xmalloc_set_program_name (program_name);
4049 START_PROGRESS (program_name, 0);
4051 expandargv (&argc, &argv);
4053 strip_symbols = STRIP_UNDEF;
4054 discard_locals = LOCALS_UNDEF;
4057 set_default_bfd_target ();
4061 int i = strlen (program_name);
4062 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4063 /* Drop the .exe suffix, if any. */
4064 if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
4067 program_name[i] = '\0';
4070 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
4073 create_symbol_htabs ();
4076 strip_main (argc, argv);
4078 copy_main (argc, argv);
4080 END_PROGRESS (program_name);