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
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"
35 #include "coff/internal.h"
38 /* FIXME: See bfd/peXXigen.c for why we include an architecture specific
39 header in generic PE code. */
40 #include "coff/i386.h"
43 static bfd_vma pe_file_alignment
= (bfd_vma
) -1;
44 static bfd_vma pe_heap_commit
= (bfd_vma
) -1;
45 static bfd_vma pe_heap_reserve
= (bfd_vma
) -1;
46 static bfd_vma pe_image_base
= (bfd_vma
) -1;
47 static bfd_vma pe_section_alignment
= (bfd_vma
) -1;
48 static bfd_vma pe_stack_commit
= (bfd_vma
) -1;
49 static bfd_vma pe_stack_reserve
= (bfd_vma
) -1;
50 static short pe_subsystem
= -1;
51 static short pe_major_subsystem_version
= -1;
52 static short pe_minor_subsystem_version
= -1;
54 struct is_specified_symbol_predicate_data
60 /* A list to support redefine_sym. */
65 struct redefine_node
*next
;
68 typedef struct section_rename
70 const char * old_name
;
71 const char * new_name
;
73 struct section_rename
* next
;
77 /* List of sections to be renamed. */
78 static section_rename
*section_rename_list
;
80 static asymbol
**isympp
= NULL
; /* Input symbols. */
81 static asymbol
**osympp
= NULL
; /* Output symbols that survive stripping. */
83 /* If `copy_byte' >= 0, copy only that byte of every `interleave' bytes. */
84 static int copy_byte
= -1;
85 static int interleave
= 4;
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 change the leading character in symbol names. */
197 static bfd_boolean change_leading_char
= FALSE
;
199 /* Whether to remove the leading character from global symbol names. */
200 static bfd_boolean remove_leading_char
= FALSE
;
202 /* Whether to permit wildcard in symbol comparison. */
203 static bfd_boolean wildcard
= FALSE
;
205 /* True if --localize-hidden is in effect. */
206 static bfd_boolean localize_hidden
= FALSE
;
208 /* List of symbols to strip, keep, localize, keep-global, weaken,
210 static htab_t strip_specific_htab
= NULL
;
211 static htab_t strip_unneeded_htab
= NULL
;
212 static htab_t keep_specific_htab
= NULL
;
213 static htab_t localize_specific_htab
= NULL
;
214 static htab_t globalize_specific_htab
= NULL
;
215 static htab_t keepglobal_specific_htab
= NULL
;
216 static htab_t weaken_specific_htab
= NULL
;
217 static struct redefine_node
*redefine_sym_list
= NULL
;
219 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
220 static bfd_boolean weaken
= FALSE
;
222 /* If this is TRUE, we retain BSF_FILE symbols. */
223 static bfd_boolean keep_file_symbols
= FALSE
;
225 /* Prefix symbols/sections. */
226 static char *prefix_symbols_string
= 0;
227 static char *prefix_sections_string
= 0;
228 static char *prefix_alloc_sections_string
= 0;
230 /* True if --extract-symbol was passed on the command line. */
231 static bfd_boolean extract_symbol
= FALSE
;
233 /* If `reverse_bytes' is nonzero, then reverse the order of every chunk
234 of <reverse_bytes> bytes within each output section. */
235 static int reverse_bytes
= 0;
237 /* For Coff objects, we may want to allow or disallow long section names,
238 or preserve them where found in the inputs. Debug info relies on them. */
239 enum long_section_name_handling
246 /* The default long section handling mode is to preserve them.
247 This is also the only behaviour for 'strip'. */
248 static enum long_section_name_handling long_section_names
= KEEP
;
250 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
251 enum command_line_switch
253 OPTION_ADD_SECTION
=150,
254 OPTION_CHANGE_ADDRESSES
,
255 OPTION_CHANGE_LEADING_CHAR
,
257 OPTION_CHANGE_SECTION_ADDRESS
,
258 OPTION_CHANGE_SECTION_LMA
,
259 OPTION_CHANGE_SECTION_VMA
,
260 OPTION_CHANGE_WARNINGS
,
263 OPTION_NO_CHANGE_WARNINGS
,
265 OPTION_REMOVE_LEADING_CHAR
,
266 OPTION_SET_SECTION_FLAGS
,
268 OPTION_STRIP_UNNEEDED
,
271 OPTION_REDEFINE_SYMS
,
274 OPTION_STRIP_SYMBOLS
,
275 OPTION_STRIP_UNNEEDED_SYMBOL
,
276 OPTION_STRIP_UNNEEDED_SYMBOLS
,
278 OPTION_LOCALIZE_HIDDEN
,
279 OPTION_LOCALIZE_SYMBOLS
,
280 OPTION_LONG_SECTION_NAMES
,
281 OPTION_GLOBALIZE_SYMBOL
,
282 OPTION_GLOBALIZE_SYMBOLS
,
283 OPTION_KEEPGLOBAL_SYMBOLS
,
284 OPTION_WEAKEN_SYMBOLS
,
285 OPTION_RENAME_SECTION
,
286 OPTION_ALT_MACH_CODE
,
287 OPTION_PREFIX_SYMBOLS
,
288 OPTION_PREFIX_SECTIONS
,
289 OPTION_PREFIX_ALLOC_SECTIONS
,
291 OPTION_ADD_GNU_DEBUGLINK
,
292 OPTION_ONLY_KEEP_DEBUG
,
293 OPTION_KEEP_FILE_SYMBOLS
,
294 OPTION_READONLY_TEXT
,
295 OPTION_WRITABLE_TEXT
,
298 OPTION_EXTRACT_SYMBOL
,
299 OPTION_REVERSE_BYTES
,
300 OPTION_FILE_ALIGNMENT
,
303 OPTION_SECTION_ALIGNMENT
,
308 /* Options to handle if running as "strip". */
310 static struct option strip_options
[] =
312 {"discard-all", no_argument
, 0, 'x'},
313 {"discard-locals", no_argument
, 0, 'X'},
314 {"format", required_argument
, 0, 'F'}, /* Obsolete */
315 {"help", no_argument
, 0, 'h'},
316 {"info", no_argument
, 0, OPTION_FORMATS_INFO
},
317 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
318 {"input-target", required_argument
, 0, 'I'},
319 {"keep-file-symbols", no_argument
, 0, OPTION_KEEP_FILE_SYMBOLS
},
320 {"keep-symbol", required_argument
, 0, 'K'},
321 {"only-keep-debug", no_argument
, 0, OPTION_ONLY_KEEP_DEBUG
},
322 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
323 {"output-target", required_argument
, 0, 'O'},
324 {"output-file", required_argument
, 0, 'o'},
325 {"preserve-dates", no_argument
, 0, 'p'},
326 {"remove-section", required_argument
, 0, 'R'},
327 {"strip-all", no_argument
, 0, 's'},
328 {"strip-debug", no_argument
, 0, 'S'},
329 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
330 {"strip-symbol", required_argument
, 0, 'N'},
331 {"target", required_argument
, 0, 'F'},
332 {"verbose", no_argument
, 0, 'v'},
333 {"version", no_argument
, 0, 'V'},
334 {"wildcard", no_argument
, 0, 'w'},
335 {0, no_argument
, 0, 0}
338 /* Options to handle if running as "objcopy". */
340 static struct option copy_options
[] =
342 {"add-gnu-debuglink", required_argument
, 0, OPTION_ADD_GNU_DEBUGLINK
},
343 {"add-section", required_argument
, 0, OPTION_ADD_SECTION
},
344 {"adjust-start", required_argument
, 0, OPTION_CHANGE_START
},
345 {"adjust-vma", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
346 {"adjust-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
347 {"adjust-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
348 {"alt-machine-code", required_argument
, 0, OPTION_ALT_MACH_CODE
},
349 {"binary-architecture", required_argument
, 0, 'B'},
350 {"byte", required_argument
, 0, 'b'},
351 {"change-addresses", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
352 {"change-leading-char", no_argument
, 0, OPTION_CHANGE_LEADING_CHAR
},
353 {"change-section-address", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
354 {"change-section-lma", required_argument
, 0, OPTION_CHANGE_SECTION_LMA
},
355 {"change-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_VMA
},
356 {"change-start", required_argument
, 0, OPTION_CHANGE_START
},
357 {"change-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
358 {"debugging", no_argument
, 0, OPTION_DEBUGGING
},
359 {"discard-all", no_argument
, 0, 'x'},
360 {"discard-locals", no_argument
, 0, 'X'},
361 {"extract-symbol", no_argument
, 0, OPTION_EXTRACT_SYMBOL
},
362 {"format", required_argument
, 0, 'F'}, /* Obsolete */
363 {"gap-fill", required_argument
, 0, OPTION_GAP_FILL
},
364 {"globalize-symbol", required_argument
, 0, OPTION_GLOBALIZE_SYMBOL
},
365 {"globalize-symbols", required_argument
, 0, OPTION_GLOBALIZE_SYMBOLS
},
366 {"help", no_argument
, 0, 'h'},
367 {"impure", no_argument
, 0, OPTION_IMPURE
},
368 {"info", no_argument
, 0, OPTION_FORMATS_INFO
},
369 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
370 {"input-target", required_argument
, 0, 'I'},
371 {"interleave", required_argument
, 0, 'i'},
372 {"keep-file-symbols", no_argument
, 0, OPTION_KEEP_FILE_SYMBOLS
},
373 {"keep-global-symbol", required_argument
, 0, 'G'},
374 {"keep-global-symbols", required_argument
, 0, OPTION_KEEPGLOBAL_SYMBOLS
},
375 {"keep-symbol", required_argument
, 0, 'K'},
376 {"keep-symbols", required_argument
, 0, OPTION_KEEP_SYMBOLS
},
377 {"localize-hidden", no_argument
, 0, OPTION_LOCALIZE_HIDDEN
},
378 {"localize-symbol", required_argument
, 0, 'L'},
379 {"localize-symbols", required_argument
, 0, OPTION_LOCALIZE_SYMBOLS
},
380 {"long-section-names", required_argument
, 0, OPTION_LONG_SECTION_NAMES
},
381 {"no-adjust-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
382 {"no-change-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
383 {"only-keep-debug", no_argument
, 0, OPTION_ONLY_KEEP_DEBUG
},
384 {"only-section", required_argument
, 0, 'j'},
385 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
386 {"output-target", required_argument
, 0, 'O'},
387 {"pad-to", required_argument
, 0, OPTION_PAD_TO
},
388 {"prefix-symbols", required_argument
, 0, OPTION_PREFIX_SYMBOLS
},
389 {"prefix-sections", required_argument
, 0, OPTION_PREFIX_SECTIONS
},
390 {"prefix-alloc-sections", required_argument
, 0, OPTION_PREFIX_ALLOC_SECTIONS
},
391 {"preserve-dates", no_argument
, 0, 'p'},
392 {"pure", no_argument
, 0, OPTION_PURE
},
393 {"readonly-text", no_argument
, 0, OPTION_READONLY_TEXT
},
394 {"redefine-sym", required_argument
, 0, OPTION_REDEFINE_SYM
},
395 {"redefine-syms", required_argument
, 0, OPTION_REDEFINE_SYMS
},
396 {"remove-leading-char", no_argument
, 0, OPTION_REMOVE_LEADING_CHAR
},
397 {"remove-section", required_argument
, 0, 'R'},
398 {"rename-section", required_argument
, 0, OPTION_RENAME_SECTION
},
399 {"reverse-bytes", required_argument
, 0, OPTION_REVERSE_BYTES
},
400 {"set-section-flags", required_argument
, 0, OPTION_SET_SECTION_FLAGS
},
401 {"set-start", required_argument
, 0, OPTION_SET_START
},
402 {"srec-len", required_argument
, 0, OPTION_SREC_LEN
},
403 {"srec-forceS3", no_argument
, 0, OPTION_SREC_FORCES3
},
404 {"strip-all", no_argument
, 0, 'S'},
405 {"strip-debug", no_argument
, 0, 'g'},
406 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
407 {"strip-unneeded-symbol", required_argument
, 0, OPTION_STRIP_UNNEEDED_SYMBOL
},
408 {"strip-unneeded-symbols", required_argument
, 0, OPTION_STRIP_UNNEEDED_SYMBOLS
},
409 {"strip-symbol", required_argument
, 0, 'N'},
410 {"strip-symbols", required_argument
, 0, OPTION_STRIP_SYMBOLS
},
411 {"target", required_argument
, 0, 'F'},
412 {"verbose", no_argument
, 0, 'v'},
413 {"version", no_argument
, 0, 'V'},
414 {"weaken", no_argument
, 0, OPTION_WEAKEN
},
415 {"weaken-symbol", required_argument
, 0, 'W'},
416 {"weaken-symbols", required_argument
, 0, OPTION_WEAKEN_SYMBOLS
},
417 {"wildcard", no_argument
, 0, 'w'},
418 {"writable-text", no_argument
, 0, OPTION_WRITABLE_TEXT
},
419 {"file-alignment", required_argument
, 0, OPTION_FILE_ALIGNMENT
},
420 {"heap", required_argument
, 0, OPTION_HEAP
},
421 {"image-base", required_argument
, 0 , OPTION_IMAGE_BASE
},
422 {"section-alignment", required_argument
, 0, OPTION_SECTION_ALIGNMENT
},
423 {"stack", required_argument
, 0, OPTION_STACK
},
424 {"subsystem", required_argument
, 0, OPTION_SUBSYSTEM
},
425 {0, no_argument
, 0, 0}
429 extern char *program_name
;
431 /* This flag distinguishes between strip and objcopy:
432 1 means this is 'strip'; 0 means this is 'objcopy'.
433 -1 means if we should use argv[0] to decide. */
436 /* The maximum length of an S record. This variable is declared in srec.c
437 and can be modified by the --srec-len parameter. */
438 extern unsigned int Chunk
;
440 /* Restrict the generation of Srecords to type S3 only.
441 This variable is declare in bfd/srec.c and can be toggled
442 on by the --srec-forceS3 command line switch. */
443 extern bfd_boolean S3Forced
;
445 /* Forward declarations. */
446 static void setup_section (bfd
*, asection
*, void *);
447 static void setup_bfd_headers (bfd
*, bfd
*);
448 static void copy_section (bfd
*, asection
*, void *);
449 static void get_sections (bfd
*, asection
*, void *);
450 static int compare_section_lma (const void *, const void *);
451 static void mark_symbols_used_in_relocations (bfd
*, asection
*, void *);
452 static bfd_boolean
write_debugging_info (bfd
*, void *, long *, asymbol
***);
453 static const char *lookup_sym_redefinition (const char *);
456 copy_usage (FILE *stream
, int exit_status
)
458 fprintf (stream
, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name
);
459 fprintf (stream
, _(" Copies a binary file, possibly transforming it in the process\n"));
460 fprintf (stream
, _(" The options are:\n"));
461 fprintf (stream
, _("\
462 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
463 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
464 -B --binary-architecture <arch> Set output arch, when input is arch-less\n\
465 -F --target <bfdname> Set both input and output format to <bfdname>\n\
466 --debugging Convert debugging information, if possible\n\
467 -p --preserve-dates Copy modified/access timestamps to the output\n\
468 -j --only-section <name> Only copy section <name> into the output\n\
469 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
470 -R --remove-section <name> Remove section <name> from the output\n\
471 -S --strip-all Remove all symbol and relocation information\n\
472 -g --strip-debug Remove all debugging symbols & sections\n\
473 --strip-unneeded Remove all symbols not needed by relocations\n\
474 -N --strip-symbol <name> Do not copy symbol <name>\n\
475 --strip-unneeded-symbol <name>\n\
476 Do not copy symbol <name> unless needed by\n\
478 --only-keep-debug Strip everything but the debug information\n\
479 --extract-symbol Remove section contents but keep symbols\n\
480 -K --keep-symbol <name> Do not strip symbol <name>\n\
481 --keep-file-symbols Do not strip file symbol(s)\n\
482 --localize-hidden Turn all ELF hidden symbols into locals\n\
483 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
484 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
485 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
486 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
487 --weaken Force all global symbols to be marked as weak\n\
488 -w --wildcard Permit wildcard in symbol comparison\n\
489 -x --discard-all Remove all non-global symbols\n\
490 -X --discard-locals Remove any compiler-generated symbols\n\
491 -i --interleave <number> Only copy one out of every <number> bytes\n\
492 -b --byte <num> Select byte <num> in every interleaved block\n\
493 --gap-fill <val> Fill gaps between sections with <val>\n\
494 --pad-to <addr> Pad the last section up to address <addr>\n\
495 --set-start <addr> Set the start address to <addr>\n\
496 {--change-start|--adjust-start} <incr>\n\
497 Add <incr> to the start address\n\
498 {--change-addresses|--adjust-vma} <incr>\n\
499 Add <incr> to LMA, VMA and start addresses\n\
500 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
501 Change LMA and VMA of section <name> by <val>\n\
502 --change-section-lma <name>{=|+|-}<val>\n\
503 Change the LMA of section <name> by <val>\n\
504 --change-section-vma <name>{=|+|-}<val>\n\
505 Change the VMA of section <name> by <val>\n\
506 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
507 Warn if a named section does not exist\n\
508 --set-section-flags <name>=<flags>\n\
509 Set section <name>'s properties to <flags>\n\
510 --add-section <name>=<file> Add section <name> found in <file> to output\n\
511 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
512 --long-section-names {enable|disable|keep}\n\
513 Handle long section names in Coff objects.\n\
514 --change-leading-char Force output format's leading character style\n\
515 --remove-leading-char Remove leading character from global symbols\n\
516 --reverse-bytes=<num> Reverse <num> bytes at a time, in output sections with content\n\
517 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
518 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
520 --srec-len <number> Restrict the length of generated Srecords\n\
521 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
522 --strip-symbols <file> -N for all symbols listed in <file>\n\
523 --strip-unneeded-symbols <file>\n\
524 --strip-unneeded-symbol for all symbols listed\n\
526 --keep-symbols <file> -K for all symbols listed in <file>\n\
527 --localize-symbols <file> -L for all symbols listed in <file>\n\
528 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
529 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
530 --weaken-symbols <file> -W for all symbols listed in <file>\n\
531 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
532 --writable-text Mark the output text as writable\n\
533 --readonly-text Make the output text write protected\n\
534 --pure Mark the output file as demand paged\n\
535 --impure Mark the output file as impure\n\
536 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
537 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
538 --prefix-alloc-sections <prefix>\n\
539 Add <prefix> to start of every allocatable\n\
541 --file-alignment <num> Set PE file alignment to <num>\n\
542 --heap <reserve>[,<commit>] Set PE reserve/commit heap to <reserve>/\n\
544 --image-base <address> Set PE image base to <address>\n\
545 --section-alignment <num> Set PE section alignment to <num>\n\
546 --stack <reserve>[,<commit>] Set PE reserve/commit stack to <reserve>/\n\
548 --subsystem <name>[:<version>]\n\
549 Set PE subsystem to <name> [& <version>]\n]\
550 -v --verbose List all object files modified\n\
551 @<file> Read options from <file>\n\
552 -V --version Display this program's version number\n\
553 -h --help Display this output\n\
554 --info List object formats & architectures supported\n\
556 list_supported_targets (program_name
, stream
);
557 if (REPORT_BUGS_TO
[0] && exit_status
== 0)
558 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
563 strip_usage (FILE *stream
, int exit_status
)
565 fprintf (stream
, _("Usage: %s <option(s)> in-file(s)\n"), program_name
);
566 fprintf (stream
, _(" Removes symbols and sections from files\n"));
567 fprintf (stream
, _(" The options are:\n"));
568 fprintf (stream
, _("\
569 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
570 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
571 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
572 -p --preserve-dates Copy modified/access timestamps to the output\n\
573 -R --remove-section=<name> Remove section <name> from the output\n\
574 -s --strip-all Remove all symbol and relocation information\n\
575 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
576 --strip-unneeded Remove all symbols not needed by relocations\n\
577 --only-keep-debug Strip everything but the debug information\n\
578 -N --strip-symbol=<name> Do not copy symbol <name>\n\
579 -K --keep-symbol=<name> Do not strip symbol <name>\n\
580 --keep-file-symbols Do not strip file symbol(s)\n\
581 -w --wildcard Permit wildcard in symbol comparison\n\
582 -x --discard-all Remove all non-global symbols\n\
583 -X --discard-locals Remove any compiler-generated symbols\n\
584 -v --verbose List all object files modified\n\
585 -V --version Display this program's version number\n\
586 -h --help Display this output\n\
587 --info List object formats & architectures supported\n\
588 -o <file> Place stripped output into <file>\n\
591 list_supported_targets (program_name
, stream
);
592 if (REPORT_BUGS_TO
[0] && exit_status
== 0)
593 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
597 /* Parse section flags into a flagword, with a fatal error if the
598 string can't be parsed. */
601 parse_flags (const char *s
)
611 snext
= strchr (s
, ',');
621 #define PARSE_FLAG(fname,fval) \
622 else if (strncasecmp (fname, s, len) == 0) ret |= fval
623 PARSE_FLAG ("alloc", SEC_ALLOC
);
624 PARSE_FLAG ("load", SEC_LOAD
);
625 PARSE_FLAG ("noload", SEC_NEVER_LOAD
);
626 PARSE_FLAG ("readonly", SEC_READONLY
);
627 PARSE_FLAG ("debug", SEC_DEBUGGING
);
628 PARSE_FLAG ("code", SEC_CODE
);
629 PARSE_FLAG ("data", SEC_DATA
);
630 PARSE_FLAG ("rom", SEC_ROM
);
631 PARSE_FLAG ("share", SEC_COFF_SHARED
);
632 PARSE_FLAG ("contents", SEC_HAS_CONTENTS
);
638 copy
= (char *) xmalloc (len
+ 1);
639 strncpy (copy
, s
, len
);
641 non_fatal (_("unrecognized section flag `%s'"), copy
);
642 fatal (_("supported flags: %s"),
643 "alloc, load, noload, readonly, debug, code, data, rom, share, contents");
653 /* Find and optionally add an entry in the change_sections list. */
655 static struct section_list
*
656 find_section_list (const char *name
, bfd_boolean add
)
658 struct section_list
*p
;
660 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
661 if (strcmp (p
->name
, name
) == 0)
667 p
= (struct section_list
*) xmalloc (sizeof (struct section_list
));
672 p
->change_vma
= CHANGE_IGNORE
;
673 p
->change_lma
= CHANGE_IGNORE
;
676 p
->set_flags
= FALSE
;
679 p
->next
= change_sections
;
685 /* There is htab_hash_string but no htab_eq_string. Makes sense. */
688 eq_string (const void *s1
, const void *s2
)
690 return strcmp ((const char *) s1
, (const char *) s2
) == 0;
694 create_symbol_htab (void)
696 return htab_create_alloc (16, htab_hash_string
, eq_string
, NULL
, xcalloc
, free
);
700 create_symbol_htabs (void)
702 strip_specific_htab
= create_symbol_htab ();
703 strip_unneeded_htab
= create_symbol_htab ();
704 keep_specific_htab
= create_symbol_htab ();
705 localize_specific_htab
= create_symbol_htab ();
706 globalize_specific_htab
= create_symbol_htab ();
707 keepglobal_specific_htab
= create_symbol_htab ();
708 weaken_specific_htab
= create_symbol_htab ();
711 /* Add a symbol to strip_specific_list. */
714 add_specific_symbol (const char *name
, htab_t htab
)
716 *htab_find_slot (htab
, name
, INSERT
) = (char *) name
;
719 /* Add symbols listed in `filename' to strip_specific_list. */
721 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
722 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
725 add_specific_symbols (const char *filename
, htab_t htab
)
731 unsigned int line_count
;
733 size
= get_file_size (filename
);
740 buffer
= (char *) xmalloc (size
+ 2);
741 f
= fopen (filename
, FOPEN_RT
);
743 fatal (_("cannot open '%s': %s"), filename
, strerror (errno
));
745 if (fread (buffer
, 1, size
, f
) == 0 || ferror (f
))
746 fatal (_("%s: fread failed"), filename
);
749 buffer
[size
] = '\n';
750 buffer
[size
+ 1] = '\0';
754 for (line
= buffer
; * line
!= '\0'; line
++)
759 int finished
= FALSE
;
761 for (eol
= line
;; eol
++)
767 /* Cope with \n\r. */
775 /* Cope with \r\n. */
786 /* Line comment, Terminate the line here, in case a
787 name is present and then allow the rest of the
788 loop to find the real end of the line. */
800 /* A name may now exist somewhere between 'line' and 'eol'.
801 Strip off leading whitespace and trailing whitespace,
802 then add it to the list. */
803 for (name
= line
; IS_WHITESPACE (* name
); name
++)
805 for (name_end
= name
;
806 (! IS_WHITESPACE (* name_end
))
807 && (! IS_LINE_TERMINATOR (* name_end
));
811 if (! IS_LINE_TERMINATOR (* name_end
))
815 for (extra
= name_end
+ 1; IS_WHITESPACE (* extra
); extra
++)
818 if (! IS_LINE_TERMINATOR (* extra
))
819 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
820 filename
, line_count
);
826 add_specific_symbol (name
, htab
);
828 /* Advance line pointer to end of line. The 'eol ++' in the for
829 loop above will then advance us to the start of the next line. */
835 /* See whether a symbol should be stripped or kept
836 based on strip_specific_list and keep_symbols. */
839 is_specified_symbol_predicate (void **slot
, void *data
)
841 struct is_specified_symbol_predicate_data
*d
=
842 (struct is_specified_symbol_predicate_data
*) data
;
843 const char *slot_name
= (char *) *slot
;
845 if (*slot_name
!= '!')
847 if (! fnmatch (slot_name
, d
->name
, 0))
850 /* Stop traversal. */
856 if (fnmatch (slot_name
+ 1, d
->name
, 0))
859 /* Stop traversal. */
864 /* Continue traversal. */
869 is_specified_symbol (const char *name
, htab_t htab
)
873 struct is_specified_symbol_predicate_data data
;
878 htab_traverse (htab
, is_specified_symbol_predicate
, &data
);
883 return htab_find (htab
, name
) != NULL
;
886 /* Return a pointer to the symbol used as a signature for GROUP. */
889 group_signature (asection
*group
)
891 bfd
*abfd
= group
->owner
;
892 Elf_Internal_Shdr
*ghdr
;
894 if (bfd_get_flavour (abfd
) != bfd_target_elf_flavour
)
897 ghdr
= &elf_section_data (group
)->this_hdr
;
898 if (ghdr
->sh_link
< elf_numsections (abfd
))
900 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
901 Elf_Internal_Shdr
*symhdr
= elf_elfsections (abfd
) [ghdr
->sh_link
];
903 if (symhdr
->sh_type
== SHT_SYMTAB
904 && ghdr
->sh_info
< symhdr
->sh_size
/ bed
->s
->sizeof_sym
)
905 return isympp
[ghdr
->sh_info
- 1];
910 /* See if a section is being removed. */
913 is_strip_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
)
915 if (sections_removed
|| sections_copied
)
917 struct section_list
*p
;
919 p
= find_section_list (bfd_get_section_name (abfd
, sec
), FALSE
);
921 if (sections_removed
&& p
!= NULL
&& p
->remove
)
923 if (sections_copied
&& (p
== NULL
|| ! p
->copy
))
927 if ((bfd_get_section_flags (abfd
, sec
) & SEC_DEBUGGING
) != 0)
929 if (strip_symbols
== STRIP_DEBUG
930 || strip_symbols
== STRIP_UNNEEDED
931 || strip_symbols
== STRIP_ALL
932 || discard_locals
== LOCALS_ALL
933 || convert_debugging
)
936 if (strip_symbols
== STRIP_NONDEBUG
)
940 if ((bfd_get_section_flags (abfd
, sec
) & SEC_GROUP
) != 0)
946 Group sections look like debugging sections but they are not.
947 (They have a non-zero size but they are not ALLOCated). */
948 if (strip_symbols
== STRIP_NONDEBUG
)
952 If we are going to strip the group signature symbol, then
953 strip the group section too. */
954 gsym
= group_signature (sec
);
959 if ((strip_symbols
== STRIP_ALL
960 && !is_specified_symbol (gname
, keep_specific_htab
))
961 || is_specified_symbol (gname
, strip_specific_htab
))
968 /* Return true if SYM is a hidden symbol. */
971 is_hidden_symbol (asymbol
*sym
)
973 elf_symbol_type
*elf_sym
;
975 elf_sym
= elf_symbol_from (sym
->the_bfd
, sym
);
977 switch (ELF_ST_VISIBILITY (elf_sym
->internal_elf_sym
.st_other
))
986 /* Choose which symbol entries to copy; put the result in OSYMS.
987 We don't copy in place, because that confuses the relocs.
988 Return the number of symbols to print. */
991 filter_symbols (bfd
*abfd
, bfd
*obfd
, asymbol
**osyms
,
992 asymbol
**isyms
, long symcount
)
994 asymbol
**from
= isyms
, **to
= osyms
;
995 long src_count
= 0, dst_count
= 0;
996 int relocatable
= (abfd
->flags
& (EXEC_P
| DYNAMIC
)) == 0;
998 for (; src_count
< symcount
; src_count
++)
1000 asymbol
*sym
= from
[src_count
];
1001 flagword flags
= sym
->flags
;
1002 char *name
= (char *) bfd_asymbol_name (sym
);
1004 bfd_boolean used_in_reloc
= FALSE
;
1005 bfd_boolean undefined
;
1006 bfd_boolean rem_leading_char
;
1007 bfd_boolean add_leading_char
;
1009 undefined
= bfd_is_und_section (bfd_get_section (sym
));
1011 if (redefine_sym_list
)
1013 char *old_name
, *new_name
;
1015 old_name
= (char *) bfd_asymbol_name (sym
);
1016 new_name
= (char *) lookup_sym_redefinition (old_name
);
1017 bfd_asymbol_name (sym
) = new_name
;
1021 /* Check if we will remove the current leading character. */
1023 (name
[0] == bfd_get_symbol_leading_char (abfd
))
1024 && (change_leading_char
1025 || (remove_leading_char
1026 && ((flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0
1028 || bfd_is_com_section (bfd_get_section (sym
)))));
1030 /* Check if we will add a new leading character. */
1033 && (bfd_get_symbol_leading_char (obfd
) != '\0')
1034 && (bfd_get_symbol_leading_char (abfd
) == '\0'
1035 || (name
[0] == bfd_get_symbol_leading_char (abfd
)));
1037 /* Short circuit for change_leading_char if we can do it in-place. */
1038 if (rem_leading_char
&& add_leading_char
&& !prefix_symbols_string
)
1040 name
[0] = bfd_get_symbol_leading_char (obfd
);
1041 bfd_asymbol_name (sym
) = name
;
1042 rem_leading_char
= FALSE
;
1043 add_leading_char
= FALSE
;
1046 /* Remove leading char. */
1047 if (rem_leading_char
)
1048 bfd_asymbol_name (sym
) = ++name
;
1050 /* Add new leading char and/or prefix. */
1051 if (add_leading_char
|| prefix_symbols_string
)
1055 ptr
= n
= (char *) xmalloc (1 + strlen (prefix_symbols_string
)
1056 + strlen (name
) + 1);
1057 if (add_leading_char
)
1058 *ptr
++ = bfd_get_symbol_leading_char (obfd
);
1060 if (prefix_symbols_string
)
1062 strcpy (ptr
, prefix_symbols_string
);
1063 ptr
+= strlen (prefix_symbols_string
);
1067 bfd_asymbol_name (sym
) = n
;
1071 if (strip_symbols
== STRIP_ALL
)
1073 else if ((flags
& BSF_KEEP
) != 0 /* Used in relocation. */
1074 || ((flags
& BSF_SECTION_SYM
) != 0
1075 && ((*bfd_get_section (sym
)->symbol_ptr_ptr
)->flags
1079 used_in_reloc
= TRUE
;
1081 else if (relocatable
/* Relocatable file. */
1082 && ((flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0
1083 || bfd_is_com_section (bfd_get_section (sym
))))
1085 else if (bfd_decode_symclass (sym
) == 'I')
1086 /* Global symbols in $idata sections need to be retained
1087 even if relocatable is FALSE. External users of the
1088 library containing the $idata section may reference these
1091 else if ((flags
& BSF_GLOBAL
) != 0 /* Global symbol. */
1092 || (flags
& BSF_WEAK
) != 0
1094 || bfd_is_com_section (bfd_get_section (sym
)))
1095 keep
= strip_symbols
!= STRIP_UNNEEDED
;
1096 else if ((flags
& BSF_DEBUGGING
) != 0) /* Debugging symbol. */
1097 keep
= (strip_symbols
!= STRIP_DEBUG
1098 && strip_symbols
!= STRIP_UNNEEDED
1099 && ! convert_debugging
);
1100 else if (bfd_coff_get_comdat_section (abfd
, bfd_get_section (sym
)))
1101 /* COMDAT sections store special information in local
1102 symbols, so we cannot risk stripping any of them. */
1104 else /* Local symbol. */
1105 keep
= (strip_symbols
!= STRIP_UNNEEDED
1106 && (discard_locals
!= LOCALS_ALL
1107 && (discard_locals
!= LOCALS_START_L
1108 || ! bfd_is_local_label (abfd
, sym
))));
1110 if (keep
&& is_specified_symbol (name
, strip_specific_htab
))
1112 /* There are multiple ways to set 'keep' above, but if it
1113 was the relocatable symbol case, then that's an error. */
1116 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name
);
1124 && !(flags
& BSF_KEEP
)
1125 && is_specified_symbol (name
, strip_unneeded_htab
))
1129 && ((keep_file_symbols
&& (flags
& BSF_FILE
))
1130 || is_specified_symbol (name
, keep_specific_htab
)))
1133 if (keep
&& is_strip_section (abfd
, bfd_get_section (sym
)))
1138 if ((flags
& BSF_GLOBAL
) != 0
1139 && (weaken
|| is_specified_symbol (name
, weaken_specific_htab
)))
1141 sym
->flags
&= ~ BSF_GLOBAL
;
1142 sym
->flags
|= BSF_WEAK
;
1146 && (flags
& (BSF_GLOBAL
| BSF_WEAK
))
1147 && (is_specified_symbol (name
, localize_specific_htab
)
1148 || (htab_elements (keepglobal_specific_htab
) != 0
1149 && ! is_specified_symbol (name
, keepglobal_specific_htab
))
1150 || (localize_hidden
&& is_hidden_symbol (sym
))))
1152 sym
->flags
&= ~ (BSF_GLOBAL
| BSF_WEAK
);
1153 sym
->flags
|= BSF_LOCAL
;
1157 && (flags
& BSF_LOCAL
)
1158 && is_specified_symbol (name
, globalize_specific_htab
))
1160 sym
->flags
&= ~ BSF_LOCAL
;
1161 sym
->flags
|= BSF_GLOBAL
;
1164 to
[dst_count
++] = sym
;
1168 to
[dst_count
] = NULL
;
1173 /* Find the redefined name of symbol SOURCE. */
1176 lookup_sym_redefinition (const char *source
)
1178 struct redefine_node
*list
;
1180 for (list
= redefine_sym_list
; list
!= NULL
; list
= list
->next
)
1181 if (strcmp (source
, list
->source
) == 0)
1182 return list
->target
;
1187 /* Add a node to a symbol redefine list. */
1190 redefine_list_append (const char *cause
, const char *source
, const char *target
)
1192 struct redefine_node
**p
;
1193 struct redefine_node
*list
;
1194 struct redefine_node
*new_node
;
1196 for (p
= &redefine_sym_list
; (list
= *p
) != NULL
; p
= &list
->next
)
1198 if (strcmp (source
, list
->source
) == 0)
1199 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1202 if (strcmp (target
, list
->target
) == 0)
1203 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1207 new_node
= (struct redefine_node
*) xmalloc (sizeof (struct redefine_node
));
1209 new_node
->source
= strdup (source
);
1210 new_node
->target
= strdup (target
);
1211 new_node
->next
= NULL
;
1216 /* Handle the --redefine-syms option. Read lines containing "old new"
1217 from the file, and add them to the symbol redefine list. */
1220 add_redefine_syms_file (const char *filename
)
1229 file
= fopen (filename
, "r");
1231 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1232 filename
, strerror (errno
));
1235 buf
= (char *) xmalloc (bufsize
+ 1 /* For the terminating NUL. */);
1243 /* Collect the input symbol name. */
1244 while (! IS_WHITESPACE (c
) && ! IS_LINE_TERMINATOR (c
) && c
!= EOF
)
1252 buf
= (char *) xrealloc (buf
, bufsize
+ 1);
1260 /* Eat white space between the symbol names. */
1261 while (IS_WHITESPACE (c
))
1263 if (c
== '#' || IS_LINE_TERMINATOR (c
))
1268 /* Collect the output symbol name. */
1270 while (! IS_WHITESPACE (c
) && ! IS_LINE_TERMINATOR (c
) && c
!= EOF
)
1278 buf
= (char *) xrealloc (buf
, bufsize
+ 1);
1286 /* Eat white space at end of line. */
1287 while (! IS_LINE_TERMINATOR(c
) && c
!= EOF
&& IS_WHITESPACE (c
))
1292 if ((c
== '\r' && (c
= getc (file
)) == '\n')
1293 || c
== '\n' || c
== EOF
)
1296 /* Append the redefinition to the list. */
1298 redefine_list_append (filename
, &buf
[0], &buf
[outsym_off
]);
1309 fatal (_("%s:%d: garbage found at end of line"), filename
, lineno
);
1311 if (len
!= 0 && (outsym_off
== 0 || outsym_off
== len
))
1312 fatal (_("%s:%d: missing new symbol name"), filename
, lineno
);
1315 /* Eat the rest of the line and finish it. */
1316 while (c
!= '\n' && c
!= EOF
)
1322 fatal (_("%s:%d: premature end of file"), filename
, lineno
);
1327 /* Copy unkown object file IBFD onto OBFD.
1328 Returns TRUE upon success, FALSE otherwise. */
1331 copy_unknown_object (bfd
*ibfd
, bfd
*obfd
)
1339 if (bfd_stat_arch_elt (ibfd
, &buf
) != 0)
1341 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
1348 non_fatal (_("stat returns negative size for `%s'"),
1349 bfd_get_archive_filename (ibfd
));
1353 if (bfd_seek (ibfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1355 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1360 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1361 bfd_get_archive_filename (ibfd
), bfd_get_filename (obfd
));
1363 cbuf
= (char *) xmalloc (BUFSIZE
);
1365 while (ncopied
< size
)
1367 tocopy
= size
- ncopied
;
1368 if (tocopy
> BUFSIZE
)
1371 if (bfd_bread (cbuf
, (bfd_size_type
) tocopy
, ibfd
)
1372 != (bfd_size_type
) tocopy
)
1374 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
1379 if (bfd_bwrite (cbuf
, (bfd_size_type
) tocopy
, obfd
)
1380 != (bfd_size_type
) tocopy
)
1382 bfd_nonfatal_message (NULL
, obfd
, NULL
, NULL
);
1390 chmod (bfd_get_filename (obfd
), buf
.st_mode
);
1395 /* Copy object file IBFD onto OBFD.
1396 Returns TRUE upon success, FALSE otherwise. */
1399 copy_object (bfd
*ibfd
, bfd
*obfd
, const bfd_arch_info_type
*input_arch
)
1403 asection
**osections
= NULL
;
1404 asection
*gnu_debuglink_section
= NULL
;
1405 bfd_size_type
*gaps
= NULL
;
1406 bfd_size_type max_gap
= 0;
1409 enum bfd_architecture iarch
;
1412 if (ibfd
->xvec
->byteorder
!= obfd
->xvec
->byteorder
1413 && ibfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
1414 && obfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
)
1415 fatal (_("Unable to change endianness of input file(s)"));
1417 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1419 bfd_nonfatal_message (NULL
, obfd
, NULL
, NULL
);
1424 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
1425 bfd_get_archive_filename (ibfd
), bfd_get_target (ibfd
),
1426 bfd_get_filename (obfd
), bfd_get_target (obfd
));
1435 start
= bfd_get_start_address (ibfd
);
1436 start
+= change_start
;
1439 /* Neither the start address nor the flags
1440 need to be set for a core file. */
1441 if (bfd_get_format (obfd
) != bfd_core
)
1445 flags
= bfd_get_file_flags (ibfd
);
1446 flags
|= bfd_flags_to_set
;
1447 flags
&= ~bfd_flags_to_clear
;
1448 flags
&= bfd_applicable_file_flags (obfd
);
1450 if (strip_symbols
== STRIP_ALL
)
1451 flags
&= ~HAS_RELOC
;
1453 if (!bfd_set_start_address (obfd
, start
)
1454 || !bfd_set_file_flags (obfd
, flags
))
1456 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
1461 /* Copy architecture of input file to output file. */
1462 iarch
= bfd_get_arch (ibfd
);
1463 imach
= bfd_get_mach (ibfd
);
1466 if (bfd_get_arch_info (ibfd
) == NULL
1467 || bfd_get_arch_info (ibfd
)->arch
== bfd_arch_unknown
)
1469 iarch
= input_arch
->arch
;
1470 imach
= input_arch
->mach
;
1473 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
1474 bfd_get_archive_filename (ibfd
));
1476 if (!bfd_set_arch_mach (obfd
, iarch
, imach
)
1477 && (ibfd
->target_defaulted
1478 || bfd_get_arch (ibfd
) != bfd_get_arch (obfd
)))
1480 if (bfd_get_arch (ibfd
) == bfd_arch_unknown
)
1481 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1482 bfd_get_archive_filename (ibfd
));
1484 non_fatal (_("Output file cannot represent architecture `%s'"),
1485 bfd_printable_arch_mach (bfd_get_arch (ibfd
),
1486 bfd_get_mach (ibfd
)));
1490 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1492 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
1496 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
1497 && bfd_pei_p (obfd
))
1499 /* Set up PE parameters. */
1500 pe_data_type
*pe
= pe_data (obfd
);
1502 /* Copy PE parameters before changing them. */
1503 if (ibfd
->xvec
->flavour
== bfd_target_coff_flavour
1504 && bfd_pei_p (ibfd
))
1505 pe
->pe_opthdr
= pe_data (ibfd
)->pe_opthdr
;
1507 if (pe_file_alignment
!= (bfd_vma
) -1)
1508 pe
->pe_opthdr
.FileAlignment
= pe_file_alignment
;
1510 pe_file_alignment
= PE_DEF_FILE_ALIGNMENT
;
1512 if (pe_heap_commit
!= (bfd_vma
) -1)
1513 pe
->pe_opthdr
.SizeOfHeapCommit
= pe_heap_commit
;
1515 if (pe_heap_reserve
!= (bfd_vma
) -1)
1516 pe
->pe_opthdr
.SizeOfHeapCommit
= pe_heap_reserve
;
1518 if (pe_image_base
!= (bfd_vma
) -1)
1519 pe
->pe_opthdr
.ImageBase
= pe_image_base
;
1521 if (pe_section_alignment
!= (bfd_vma
) -1)
1522 pe
->pe_opthdr
.SectionAlignment
= pe_section_alignment
;
1524 pe_section_alignment
= PE_DEF_SECTION_ALIGNMENT
;
1526 if (pe_stack_commit
!= (bfd_vma
) -1)
1527 pe
->pe_opthdr
.SizeOfStackCommit
= pe_stack_commit
;
1529 if (pe_stack_reserve
!= (bfd_vma
) -1)
1530 pe
->pe_opthdr
.SizeOfStackCommit
= pe_stack_reserve
;
1532 if (pe_subsystem
!= -1)
1533 pe
->pe_opthdr
.Subsystem
= pe_subsystem
;
1535 if (pe_major_subsystem_version
!= -1)
1536 pe
->pe_opthdr
.MajorSubsystemVersion
= pe_major_subsystem_version
;
1538 if (pe_minor_subsystem_version
!= -1)
1539 pe
->pe_opthdr
.MinorSubsystemVersion
= pe_minor_subsystem_version
;
1541 if (pe_file_alignment
> pe_section_alignment
)
1543 char file_alignment
[20], section_alignment
[20];
1545 sprintf_vma (file_alignment
, pe_file_alignment
);
1546 sprintf_vma (section_alignment
, pe_section_alignment
);
1547 non_fatal (_("warning: file alignment (0x%s) > section alignment (0x%s)"),
1549 file_alignment
, section_alignment
);
1556 if (osympp
!= isympp
)
1562 symsize
= bfd_get_symtab_upper_bound (ibfd
);
1565 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
1569 osympp
= isympp
= (asymbol
**) xmalloc (symsize
);
1570 symcount
= bfd_canonicalize_symtab (ibfd
, isympp
);
1573 bfd_nonfatal_message (NULL
, ibfd
, NULL
, NULL
);
1577 /* BFD mandates that all output sections be created and sizes set before
1578 any output is done. Thus, we traverse all sections multiple times. */
1579 bfd_map_over_sections (ibfd
, setup_section
, obfd
);
1581 if (!extract_symbol
)
1582 setup_bfd_headers (ibfd
, obfd
);
1584 if (add_sections
!= NULL
)
1586 struct section_add
*padd
;
1587 struct section_list
*pset
;
1589 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
1593 pset
= find_section_list (padd
->name
, FALSE
);
1597 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DATA
;
1598 if (pset
!= NULL
&& pset
->set_flags
)
1599 flags
= pset
->flags
| SEC_HAS_CONTENTS
;
1601 /* bfd_make_section_with_flags() does not return very helpful
1602 error codes, so check for the most likely user error first. */
1603 if (bfd_get_section_by_name (obfd
, padd
->name
))
1605 bfd_nonfatal_message (NULL
, obfd
, NULL
,
1606 _("can't add section '%s'"), padd
->name
);
1611 padd
->section
= bfd_make_section_with_flags (obfd
, padd
->name
, flags
);
1612 if (padd
->section
== NULL
)
1614 bfd_nonfatal_message (NULL
, obfd
, NULL
,
1615 _("can't create section `%s'"),
1621 if (! bfd_set_section_size (obfd
, padd
->section
, padd
->size
))
1623 bfd_nonfatal_message (NULL
, obfd
, padd
->section
, NULL
);
1629 if (pset
->change_vma
!= CHANGE_IGNORE
)
1630 if (! bfd_set_section_vma (obfd
, padd
->section
,
1633 bfd_nonfatal_message (NULL
, obfd
, padd
->section
, NULL
);
1637 if (pset
->change_lma
!= CHANGE_IGNORE
)
1639 padd
->section
->lma
= pset
->lma_val
;
1641 if (! bfd_set_section_alignment
1642 (obfd
, padd
->section
,
1643 bfd_section_alignment (obfd
, padd
->section
)))
1645 bfd_nonfatal_message (NULL
, obfd
, padd
->section
, NULL
);
1653 if (gnu_debuglink_filename
!= NULL
)
1655 gnu_debuglink_section
= bfd_create_gnu_debuglink_section
1656 (obfd
, gnu_debuglink_filename
);
1658 if (gnu_debuglink_section
== NULL
)
1660 bfd_nonfatal_message (NULL
, obfd
, NULL
,
1661 _("cannot create debug link section `%s'"),
1662 gnu_debuglink_filename
);
1666 /* Special processing for PE format files. We
1667 have no way to distinguish PE from COFF here. */
1668 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
)
1670 bfd_vma debuglink_vma
;
1671 asection
* highest_section
;
1674 /* The PE spec requires that all sections be adjacent and sorted
1675 in ascending order of VMA. It also specifies that debug
1676 sections should be last. This is despite the fact that debug
1677 sections are not loaded into memory and so in theory have no
1680 This means that the debuglink section must be given a non-zero
1681 VMA which makes it contiguous with other debug sections. So
1682 walk the current section list, find the section with the
1683 highest VMA and start the debuglink section after that one. */
1684 for (sec
= obfd
->sections
, highest_section
= NULL
;
1688 && (highest_section
== NULL
1689 || sec
->vma
> highest_section
->vma
))
1690 highest_section
= sec
;
1692 if (highest_section
)
1693 debuglink_vma
= BFD_ALIGN (highest_section
->vma
1694 + highest_section
->size
,
1695 /* FIXME: We ought to be using
1696 COFF_PAGE_SIZE here or maybe
1697 bfd_get_section_alignment() (if it
1698 was set) but since this is for PE
1699 and we know the required alignment
1700 it is easier just to hard code it. */
1703 /* Umm, not sure what to do in this case. */
1704 debuglink_vma
= 0x1000;
1706 bfd_set_section_vma (obfd
, gnu_debuglink_section
, debuglink_vma
);
1710 if (bfd_count_sections (obfd
) != 0
1711 && (gap_fill_set
|| pad_to_set
))
1716 /* We must fill in gaps between the sections and/or we must pad
1717 the last section to a specified address. We do this by
1718 grabbing a list of the sections, sorting them by VMA, and
1719 increasing the section sizes as required to fill the gaps.
1720 We write out the gap contents below. */
1722 c
= bfd_count_sections (obfd
);
1723 osections
= (asection
**) xmalloc (c
* sizeof (asection
*));
1725 bfd_map_over_sections (obfd
, get_sections
, &set
);
1727 qsort (osections
, c
, sizeof (asection
*), compare_section_lma
);
1729 gaps
= (bfd_size_type
*) xmalloc (c
* sizeof (bfd_size_type
));
1730 memset (gaps
, 0, c
* sizeof (bfd_size_type
));
1734 for (i
= 0; i
< c
- 1; i
++)
1738 bfd_vma gap_start
, gap_stop
;
1740 flags
= bfd_get_section_flags (obfd
, osections
[i
]);
1741 if ((flags
& SEC_HAS_CONTENTS
) == 0
1742 || (flags
& SEC_LOAD
) == 0)
1745 size
= bfd_section_size (obfd
, osections
[i
]);
1746 gap_start
= bfd_section_lma (obfd
, osections
[i
]) + size
;
1747 gap_stop
= bfd_section_lma (obfd
, osections
[i
+ 1]);
1748 if (gap_start
< gap_stop
)
1750 if (! bfd_set_section_size (obfd
, osections
[i
],
1751 size
+ (gap_stop
- gap_start
)))
1753 bfd_nonfatal_message (NULL
, obfd
, osections
[i
],
1754 _("Can't fill gap after section"));
1758 gaps
[i
] = gap_stop
- gap_start
;
1759 if (max_gap
< gap_stop
- gap_start
)
1760 max_gap
= gap_stop
- gap_start
;
1770 lma
= bfd_section_lma (obfd
, osections
[c
- 1]);
1771 size
= bfd_section_size (obfd
, osections
[c
- 1]);
1772 if (lma
+ size
< pad_to
)
1774 if (! bfd_set_section_size (obfd
, osections
[c
- 1],
1777 bfd_nonfatal_message (NULL
, obfd
, osections
[c
- 1],
1778 _("can't add padding"));
1783 gaps
[c
- 1] = pad_to
- (lma
+ size
);
1784 if (max_gap
< pad_to
- (lma
+ size
))
1785 max_gap
= pad_to
- (lma
+ size
);
1791 /* Symbol filtering must happen after the output sections
1792 have been created, but before their contents are set. */
1794 if (convert_debugging
)
1795 dhandle
= read_debugging_info (ibfd
, isympp
, symcount
, FALSE
);
1797 if (strip_symbols
== STRIP_DEBUG
1798 || strip_symbols
== STRIP_ALL
1799 || strip_symbols
== STRIP_UNNEEDED
1800 || strip_symbols
== STRIP_NONDEBUG
1801 || discard_locals
!= LOCALS_UNDEF
1803 || htab_elements (strip_specific_htab
) != 0
1804 || htab_elements (keep_specific_htab
) != 0
1805 || htab_elements (localize_specific_htab
) != 0
1806 || htab_elements (globalize_specific_htab
) != 0
1807 || htab_elements (keepglobal_specific_htab
) != 0
1808 || htab_elements (weaken_specific_htab
) != 0
1809 || prefix_symbols_string
1812 || convert_debugging
1813 || change_leading_char
1814 || remove_leading_char
1815 || redefine_sym_list
1818 /* Mark symbols used in output relocations so that they
1819 are kept, even if they are local labels or static symbols.
1821 Note we iterate over the input sections examining their
1822 relocations since the relocations for the output sections
1823 haven't been set yet. mark_symbols_used_in_relocations will
1824 ignore input sections which have no corresponding output
1826 if (strip_symbols
!= STRIP_ALL
)
1827 bfd_map_over_sections (ibfd
,
1828 mark_symbols_used_in_relocations
,
1830 osympp
= (asymbol
**) xmalloc ((symcount
+ 1) * sizeof (asymbol
*));
1831 symcount
= filter_symbols (ibfd
, obfd
, osympp
, isympp
, symcount
);
1834 if (convert_debugging
&& dhandle
!= NULL
)
1836 if (! write_debugging_info (obfd
, dhandle
, &symcount
, &osympp
))
1843 bfd_set_symtab (obfd
, osympp
, symcount
);
1845 /* This has to happen after the symbol table has been set. */
1846 bfd_map_over_sections (ibfd
, copy_section
, obfd
);
1848 if (add_sections
!= NULL
)
1850 struct section_add
*padd
;
1852 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
1854 if (! bfd_set_section_contents (obfd
, padd
->section
, padd
->contents
,
1857 bfd_nonfatal_message (NULL
, obfd
, padd
->section
, NULL
);
1863 if (gnu_debuglink_filename
!= NULL
)
1865 if (! bfd_fill_in_gnu_debuglink_section
1866 (obfd
, gnu_debuglink_section
, gnu_debuglink_filename
))
1868 bfd_nonfatal_message (NULL
, obfd
, NULL
,
1869 _("cannot fill debug link section `%s'"),
1870 gnu_debuglink_filename
);
1875 if (gap_fill_set
|| pad_to_set
)
1880 /* Fill in the gaps. */
1883 buf
= (bfd_byte
*) xmalloc (max_gap
);
1884 memset (buf
, gap_fill
, max_gap
);
1886 c
= bfd_count_sections (obfd
);
1887 for (i
= 0; i
< c
; i
++)
1895 off
= bfd_section_size (obfd
, osections
[i
]) - left
;
1906 if (! bfd_set_section_contents (obfd
, osections
[i
], buf
,
1909 bfd_nonfatal_message (NULL
, obfd
, osections
[i
], NULL
);
1920 /* Do not copy backend data if --extract-symbol is passed; anything
1921 that needs to look at the section contents will fail. */
1925 /* Allow the BFD backend to copy any private data it understands
1926 from the input BFD to the output BFD. This is done last to
1927 permit the routine to look at the filtered symbol table, which is
1928 important for the ECOFF code at least. */
1929 if (! bfd_copy_private_bfd_data (ibfd
, obfd
))
1931 bfd_nonfatal_message (NULL
, obfd
, NULL
,
1932 _("error copying private BFD data"));
1936 /* Switch to the alternate machine code. We have to do this at the
1937 very end, because we only initialize the header when we create
1938 the first section. */
1939 if (use_alt_mach_code
!= 0)
1941 if (! bfd_alt_mach_code (obfd
, use_alt_mach_code
))
1943 non_fatal (_("this target does not support %lu alternative machine codes"),
1945 if (bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
1947 non_fatal (_("treating that number as an absolute e_machine value instead"));
1948 elf_elfheader (obfd
)->e_machine
= use_alt_mach_code
;
1951 non_fatal (_("ignoring the alternative value"));
1958 /* Read each archive element in turn from IBFD, copy the
1959 contents to temp file, and keep the temp file handle.
1960 If 'force_output_target' is TRUE then make sure that
1961 all elements in the new archive are of the type
1965 copy_archive (bfd
*ibfd
, bfd
*obfd
, const char *output_target
,
1966 bfd_boolean force_output_target
,
1967 const bfd_arch_info_type
*input_arch
)
1971 struct name_list
*next
;
1975 bfd
**ptr
= &obfd
->archive_head
;
1978 const char *filename
;
1980 /* Make a temp directory to hold the contents. */
1981 dir
= make_tempdir (bfd_get_filename (obfd
));
1983 fatal (_("cannot create tempdir for archive copying (error: %s)"),
1986 obfd
->has_armap
= ibfd
->has_armap
;
1987 obfd
->is_thin_archive
= ibfd
->is_thin_archive
;
1991 this_element
= bfd_openr_next_archived_file (ibfd
, NULL
);
1993 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1996 bfd_nonfatal_message (NULL
, obfd
, NULL
, NULL
);
2000 while (!status
&& this_element
!= NULL
)
2006 int stat_status
= 0;
2007 bfd_boolean del
= TRUE
;
2009 /* Create an output file for this member. */
2010 output_name
= concat (dir
, "/",
2011 bfd_get_filename (this_element
), (char *) 0);
2013 /* If the file already exists, make another temp dir. */
2014 if (stat (output_name
, &buf
) >= 0)
2016 output_name
= make_tempdir (output_name
);
2017 if (output_name
== NULL
)
2018 fatal (_("cannot create tempdir for archive copying (error: %s)"),
2021 l
= (struct name_list
*) xmalloc (sizeof (struct name_list
));
2022 l
->name
= output_name
;
2026 output_name
= concat (output_name
, "/",
2027 bfd_get_filename (this_element
), (char *) 0);
2032 stat_status
= bfd_stat_arch_elt (this_element
, &buf
);
2034 if (stat_status
!= 0)
2035 non_fatal (_("internal stat error on %s"),
2036 bfd_get_filename (this_element
));
2039 l
= (struct name_list
*) xmalloc (sizeof (struct name_list
));
2040 l
->name
= output_name
;
2045 if (bfd_check_format (this_element
, bfd_object
))
2047 /* PR binutils/3110: Cope with archives
2048 containing multiple target types. */
2049 if (force_output_target
)
2050 output_bfd
= bfd_openw (output_name
, output_target
);
2052 output_bfd
= bfd_openw (output_name
, bfd_get_target (this_element
));
2054 if (output_bfd
== NULL
)
2056 bfd_nonfatal_message (output_name
, NULL
, NULL
, NULL
);
2061 del
= ! copy_object (this_element
, output_bfd
, input_arch
);
2064 || bfd_get_arch (this_element
) != bfd_arch_unknown
)
2066 if (!bfd_close (output_bfd
))
2068 bfd_nonfatal_message (output_name
, NULL
, NULL
, NULL
);
2069 /* Error in new object file. Don't change archive. */
2074 goto copy_unknown_element
;
2078 bfd_nonfatal_message (NULL
, this_element
, NULL
,
2079 _("Unable to recognise the format of file"));
2081 output_bfd
= bfd_openw (output_name
, output_target
);
2082 copy_unknown_element
:
2083 del
= !copy_unknown_object (this_element
, output_bfd
);
2084 if (!bfd_close_all_done (output_bfd
))
2086 bfd_nonfatal_message (output_name
, NULL
, NULL
, NULL
);
2087 /* Error in new object file. Don't change archive. */
2094 unlink (output_name
);
2099 if (preserve_dates
&& stat_status
== 0)
2100 set_times (output_name
, &buf
);
2102 /* Open the newly output file and attach to our list. */
2103 output_bfd
= bfd_openr (output_name
, output_target
);
2105 l
->obfd
= output_bfd
;
2108 ptr
= &output_bfd
->archive_next
;
2110 last_element
= this_element
;
2112 this_element
= bfd_openr_next_archived_file (ibfd
, last_element
);
2114 bfd_close (last_element
);
2119 filename
= bfd_get_filename (obfd
);
2120 if (!bfd_close (obfd
))
2123 bfd_nonfatal_message (filename
, NULL
, NULL
, NULL
);
2127 filename
= bfd_get_filename (ibfd
);
2128 if (!bfd_close (ibfd
))
2131 bfd_nonfatal_message (filename
, NULL
, NULL
, NULL
);
2135 /* Delete all the files that we opened. */
2136 for (l
= list
; l
!= NULL
; l
= l
->next
)
2138 if (l
->obfd
== NULL
)
2142 bfd_close (l
->obfd
);
2150 set_long_section_mode (bfd
*output_bfd
, bfd
*input_bfd
, enum long_section_name_handling style
)
2152 /* This is only relevant to Coff targets. */
2153 if (bfd_get_flavour (output_bfd
) == bfd_target_coff_flavour
)
2156 && bfd_get_flavour (input_bfd
) == bfd_target_coff_flavour
)
2157 style
= bfd_coff_long_section_names (input_bfd
) ? ENABLE
: DISABLE
;
2158 bfd_coff_set_long_section_names (output_bfd
, style
!= DISABLE
);
2162 /* The top-level control. */
2165 copy_file (const char *input_filename
, const char *output_filename
,
2166 const char *input_target
, const char *output_target
,
2167 const bfd_arch_info_type
*input_arch
)
2170 char **obj_matching
;
2171 char **core_matching
;
2172 off_t size
= get_file_size (input_filename
);
2177 non_fatal (_("error: the input file '%s' is empty"),
2183 /* To allow us to do "strip *" without dying on the first
2184 non-object file, failures are nonfatal. */
2185 ibfd
= bfd_openr (input_filename
, input_target
);
2188 bfd_nonfatal_message (input_filename
, NULL
, NULL
, NULL
);
2193 if (bfd_check_format (ibfd
, bfd_archive
))
2195 bfd_boolean force_output_target
;
2198 /* bfd_get_target does not return the correct value until
2199 bfd_check_format succeeds. */
2200 if (output_target
== NULL
)
2202 output_target
= bfd_get_target (ibfd
);
2203 force_output_target
= FALSE
;
2206 force_output_target
= TRUE
;
2208 obfd
= bfd_openw (output_filename
, output_target
);
2211 bfd_nonfatal_message (output_filename
, NULL
, NULL
, NULL
);
2215 /* This is a no-op on non-Coff targets. */
2216 set_long_section_mode (obfd
, ibfd
, long_section_names
);
2218 copy_archive (ibfd
, obfd
, output_target
, force_output_target
, input_arch
);
2220 else if (bfd_check_format_matches (ibfd
, bfd_object
, &obj_matching
))
2225 /* bfd_get_target does not return the correct value until
2226 bfd_check_format succeeds. */
2227 if (output_target
== NULL
)
2228 output_target
= bfd_get_target (ibfd
);
2230 obfd
= bfd_openw (output_filename
, output_target
);
2233 bfd_nonfatal_message (output_filename
, NULL
, NULL
, NULL
);
2237 /* This is a no-op on non-Coff targets. */
2238 set_long_section_mode (obfd
, ibfd
, long_section_names
);
2240 if (! copy_object (ibfd
, obfd
, input_arch
))
2243 if (!bfd_close (obfd
))
2246 bfd_nonfatal_message (output_filename
, NULL
, NULL
, NULL
);
2250 if (!bfd_close (ibfd
))
2253 bfd_nonfatal_message (input_filename
, NULL
, NULL
, NULL
);
2259 bfd_error_type obj_error
= bfd_get_error ();
2260 bfd_error_type core_error
;
2262 if (bfd_check_format_matches (ibfd
, bfd_core
, &core_matching
))
2264 /* This probably can't happen.. */
2265 if (obj_error
== bfd_error_file_ambiguously_recognized
)
2266 free (obj_matching
);
2270 core_error
= bfd_get_error ();
2271 /* Report the object error in preference to the core error. */
2272 if (obj_error
!= core_error
)
2273 bfd_set_error (obj_error
);
2275 bfd_nonfatal_message (input_filename
, NULL
, NULL
, NULL
);
2277 if (obj_error
== bfd_error_file_ambiguously_recognized
)
2279 list_matching_formats (obj_matching
);
2280 free (obj_matching
);
2282 if (core_error
== bfd_error_file_ambiguously_recognized
)
2284 list_matching_formats (core_matching
);
2285 free (core_matching
);
2292 /* Add a name to the section renaming list. */
2295 add_section_rename (const char * old_name
, const char * new_name
,
2298 section_rename
* srename
;
2300 /* Check for conflicts first. */
2301 for (srename
= section_rename_list
; srename
!= NULL
; srename
= srename
->next
)
2302 if (strcmp (srename
->old_name
, old_name
) == 0)
2304 /* Silently ignore duplicate definitions. */
2305 if (strcmp (srename
->new_name
, new_name
) == 0
2306 && srename
->flags
== flags
)
2309 fatal (_("Multiple renames of section %s"), old_name
);
2312 srename
= (section_rename
*) xmalloc (sizeof (* srename
));
2314 srename
->old_name
= old_name
;
2315 srename
->new_name
= new_name
;
2316 srename
->flags
= flags
;
2317 srename
->next
= section_rename_list
;
2319 section_rename_list
= srename
;
2322 /* Check the section rename list for a new name of the input section
2323 ISECTION. Return the new name if one is found.
2324 Also set RETURNED_FLAGS to the flags to be used for this section. */
2327 find_section_rename (bfd
* ibfd ATTRIBUTE_UNUSED
, sec_ptr isection
,
2328 flagword
* returned_flags
)
2330 const char * old_name
= bfd_section_name (ibfd
, isection
);
2331 section_rename
* srename
;
2333 /* Default to using the flags of the input section. */
2334 * returned_flags
= bfd_get_section_flags (ibfd
, isection
);
2336 for (srename
= section_rename_list
; srename
!= NULL
; srename
= srename
->next
)
2337 if (strcmp (srename
->old_name
, old_name
) == 0)
2339 if (srename
->flags
!= (flagword
) -1)
2340 * returned_flags
= srename
->flags
;
2342 return srename
->new_name
;
2348 /* Once each of the sections is copied, we may still need to do some
2349 finalization work for private section headers. Do that here. */
2352 setup_bfd_headers (bfd
*ibfd
, bfd
*obfd
)
2354 /* Allow the BFD backend to copy any private data it understands
2355 from the input section to the output section. */
2356 if (! bfd_copy_private_header_data (ibfd
, obfd
))
2359 bfd_nonfatal_message (NULL
, ibfd
, NULL
,
2360 _("error in private header data"));
2364 /* All went well. */
2368 /* Create a section in OBFD with the same
2369 name and attributes as ISECTION in IBFD. */
2372 setup_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
2374 bfd
*obfd
= (bfd
*) obfdarg
;
2375 struct section_list
*p
;
2383 char *prefix
= NULL
;
2384 bfd_boolean make_nobits
;
2386 if (is_strip_section (ibfd
, isection
))
2389 p
= find_section_list (bfd_section_name (ibfd
, isection
), FALSE
);
2393 /* Get the, possibly new, name of the output section. */
2394 name
= find_section_rename (ibfd
, isection
, & flags
);
2396 /* Prefix sections. */
2397 if ((prefix_alloc_sections_string
)
2398 && (bfd_get_section_flags (ibfd
, isection
) & SEC_ALLOC
))
2399 prefix
= prefix_alloc_sections_string
;
2400 else if (prefix_sections_string
)
2401 prefix
= prefix_sections_string
;
2407 n
= (char *) xmalloc (strlen (prefix
) + strlen (name
) + 1);
2413 make_nobits
= FALSE
;
2414 if (p
!= NULL
&& p
->set_flags
)
2415 flags
= p
->flags
| (flags
& (SEC_HAS_CONTENTS
| SEC_RELOC
));
2416 else if (strip_symbols
== STRIP_NONDEBUG
2417 && (flags
& SEC_ALLOC
) != 0
2418 && (ibfd
->xvec
->flavour
!= bfd_target_elf_flavour
2419 || elf_section_type (isection
) != SHT_NOTE
))
2421 flags
&= ~(SEC_HAS_CONTENTS
| SEC_LOAD
);
2422 if (obfd
->xvec
->flavour
== bfd_target_elf_flavour
)
2426 /* Twiddle the input section flags so that it seems to
2427 elf.c:copy_private_bfd_data that section flags have not
2428 changed between input and output sections. This hack
2429 prevents wholesale rewriting of the program headers. */
2430 isection
->flags
&= ~(SEC_HAS_CONTENTS
| SEC_LOAD
);
2434 osection
= bfd_make_section_anyway_with_flags (obfd
, name
, flags
);
2436 if (osection
== NULL
)
2438 err
= _("failed to create output section");
2443 elf_section_type (osection
) = SHT_NOBITS
;
2445 size
= bfd_section_size (ibfd
, isection
);
2447 size
= (size
+ interleave
- 1) / interleave
;
2448 else if (extract_symbol
)
2450 if (! bfd_set_section_size (obfd
, osection
, size
))
2452 err
= _("failed to set size");
2456 vma
= bfd_section_vma (ibfd
, isection
);
2457 if (p
!= NULL
&& p
->change_vma
== CHANGE_MODIFY
)
2459 else if (p
!= NULL
&& p
->change_vma
== CHANGE_SET
)
2462 vma
+= change_section_address
;
2464 if (! bfd_set_section_vma (obfd
, osection
, vma
))
2466 err
= _("failed to set vma");
2470 lma
= isection
->lma
;
2471 if ((p
!= NULL
) && p
->change_lma
!= CHANGE_IGNORE
)
2473 if (p
->change_lma
== CHANGE_MODIFY
)
2475 else if (p
->change_lma
== CHANGE_SET
)
2481 lma
+= change_section_address
;
2483 osection
->lma
= lma
;
2485 /* FIXME: This is probably not enough. If we change the LMA we
2486 may have to recompute the header for the file as well. */
2487 if (!bfd_set_section_alignment (obfd
,
2489 bfd_section_alignment (ibfd
, isection
)))
2491 err
= _("failed to set alignment");
2495 /* Copy merge entity size. */
2496 osection
->entsize
= isection
->entsize
;
2498 /* This used to be mangle_section; we do here to avoid using
2499 bfd_get_section_by_name since some formats allow multiple
2500 sections with the same name. */
2501 isection
->output_section
= osection
;
2502 isection
->output_offset
= 0;
2504 /* Do not copy backend data if --extract-symbol is passed; anything
2505 that needs to look at the section contents will fail. */
2509 if ((isection
->flags
& SEC_GROUP
) != 0)
2511 asymbol
*gsym
= group_signature (isection
);
2515 gsym
->flags
|= BSF_KEEP
;
2516 if (ibfd
->xvec
->flavour
== bfd_target_elf_flavour
)
2517 elf_group_id (isection
) = gsym
;
2521 /* Allow the BFD backend to copy any private data it understands
2522 from the input section to the output section. */
2523 if (!bfd_copy_private_section_data (ibfd
, isection
, obfd
, osection
))
2525 err
= _("failed to copy private data");
2529 /* All went well. */
2534 bfd_nonfatal_message (NULL
, obfd
, osection
, err
);
2537 /* Copy the data of input section ISECTION of IBFD
2538 to an output section with the same name in OBFD.
2539 If stripping then don't copy any relocation info. */
2542 copy_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
2544 bfd
*obfd
= (bfd
*) obfdarg
;
2545 struct section_list
*p
;
2553 /* If we have already failed earlier on,
2554 do not keep on generating complaints now. */
2558 if (is_strip_section (ibfd
, isection
))
2561 flags
= bfd_get_section_flags (ibfd
, isection
);
2562 if ((flags
& SEC_GROUP
) != 0)
2565 osection
= isection
->output_section
;
2566 size
= bfd_get_section_size (isection
);
2568 if (size
== 0 || osection
== 0)
2574 p
= find_section_list (bfd_get_section_name (ibfd
, isection
), FALSE
);
2576 /* Core files do not need to be relocated. */
2577 if (bfd_get_format (obfd
) == bfd_core
)
2581 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
2585 /* Do not complain if the target does not support relocations. */
2586 if (relsize
== -1 && bfd_get_error () == bfd_error_invalid_operation
)
2591 bfd_nonfatal_message (NULL
, ibfd
, isection
, NULL
);
2598 bfd_set_reloc (obfd
, osection
, NULL
, 0);
2601 relpp
= (arelent
**) xmalloc (relsize
);
2602 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, isympp
);
2606 bfd_nonfatal_message (NULL
, ibfd
, isection
,
2607 _("relocation count is negative"));
2611 if (strip_symbols
== STRIP_ALL
)
2613 /* Remove relocations which are not in
2614 keep_strip_specific_list. */
2615 arelent
**temp_relpp
;
2616 long temp_relcount
= 0;
2619 temp_relpp
= (arelent
**) xmalloc (relsize
);
2620 for (i
= 0; i
< relcount
; i
++)
2621 if (is_specified_symbol (bfd_asymbol_name (*relpp
[i
]->sym_ptr_ptr
),
2622 keep_specific_htab
))
2623 temp_relpp
[temp_relcount
++] = relpp
[i
];
2624 relcount
= temp_relcount
;
2629 bfd_set_reloc (obfd
, osection
, relcount
== 0 ? NULL
: relpp
, relcount
);
2634 if (bfd_get_section_flags (ibfd
, isection
) & SEC_HAS_CONTENTS
2635 && bfd_get_section_flags (obfd
, osection
) & SEC_HAS_CONTENTS
)
2637 void *memhunk
= xmalloc (size
);
2639 if (!bfd_get_section_contents (ibfd
, isection
, memhunk
, 0, size
))
2642 bfd_nonfatal_message (NULL
, ibfd
, isection
, NULL
);
2648 /* We don't handle leftover bytes (too many possible behaviors,
2649 and we don't know what the user wants). The section length
2650 must be a multiple of the number of bytes to swap. */
2651 if ((size
% reverse_bytes
) == 0)
2656 for (i
= 0; i
< size
; i
+= reverse_bytes
)
2657 for (j
= 0; j
< (unsigned long)(reverse_bytes
/ 2); j
++)
2659 bfd_byte
*m
= (bfd_byte
*) memhunk
;
2662 m
[i
+ j
] = m
[(i
+ reverse_bytes
) - (j
+ 1)];
2663 m
[(i
+ reverse_bytes
) - (j
+ 1)] = b
;
2667 /* User must pad the section up in order to do this. */
2668 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
2669 bfd_section_name (ibfd
, isection
), reverse_bytes
);
2674 /* Keep only every `copy_byte'th byte in MEMHUNK. */
2675 char *from
= (char *) memhunk
+ copy_byte
;
2676 char *to
= (char *) memhunk
;
2677 char *end
= (char *) memhunk
+ size
;
2679 for (; from
< end
; from
+= interleave
)
2682 size
= (size
+ interleave
- 1 - copy_byte
) / interleave
;
2683 osection
->lma
/= interleave
;
2686 if (!bfd_set_section_contents (obfd
, osection
, memhunk
, 0, size
))
2689 bfd_nonfatal_message (NULL
, obfd
, osection
, NULL
);
2694 else if (p
!= NULL
&& p
->set_flags
&& (p
->flags
& SEC_HAS_CONTENTS
) != 0)
2696 void *memhunk
= xmalloc (size
);
2698 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
2699 flag--they can just remove the section entirely and add it
2700 back again. However, we do permit them to turn on the
2701 SEC_HAS_CONTENTS flag, and take it to mean that the section
2702 contents should be zeroed out. */
2704 memset (memhunk
, 0, size
);
2705 if (! bfd_set_section_contents (obfd
, osection
, memhunk
, 0, size
))
2708 bfd_nonfatal_message (NULL
, obfd
, osection
, NULL
);
2715 /* Get all the sections. This is used when --gap-fill or --pad-to is
2719 get_sections (bfd
*obfd ATTRIBUTE_UNUSED
, asection
*osection
, void *secppparg
)
2721 asection
***secppp
= (asection
***) secppparg
;
2723 **secppp
= osection
;
2727 /* Sort sections by VMA. This is called via qsort, and is used when
2728 --gap-fill or --pad-to is used. We force non loadable or empty
2729 sections to the front, where they are easier to ignore. */
2732 compare_section_lma (const void *arg1
, const void *arg2
)
2734 const asection
*const *sec1
= (const asection
* const *) arg1
;
2735 const asection
*const *sec2
= (const asection
* const *) arg2
;
2736 flagword flags1
, flags2
;
2738 /* Sort non loadable sections to the front. */
2739 flags1
= (*sec1
)->flags
;
2740 flags2
= (*sec2
)->flags
;
2741 if ((flags1
& SEC_HAS_CONTENTS
) == 0
2742 || (flags1
& SEC_LOAD
) == 0)
2744 if ((flags2
& SEC_HAS_CONTENTS
) != 0
2745 && (flags2
& SEC_LOAD
) != 0)
2750 if ((flags2
& SEC_HAS_CONTENTS
) == 0
2751 || (flags2
& SEC_LOAD
) == 0)
2755 /* Sort sections by LMA. */
2756 if ((*sec1
)->lma
> (*sec2
)->lma
)
2758 else if ((*sec1
)->lma
< (*sec2
)->lma
)
2761 /* Sort sections with the same LMA by size. */
2762 if (bfd_get_section_size (*sec1
) > bfd_get_section_size (*sec2
))
2764 else if (bfd_get_section_size (*sec1
) < bfd_get_section_size (*sec2
))
2770 /* Mark all the symbols which will be used in output relocations with
2771 the BSF_KEEP flag so that those symbols will not be stripped.
2773 Ignore relocations which will not appear in the output file. */
2776 mark_symbols_used_in_relocations (bfd
*ibfd
, sec_ptr isection
, void *symbolsarg
)
2778 asymbol
**symbols
= (asymbol
**) symbolsarg
;
2783 /* Ignore an input section with no corresponding output section. */
2784 if (isection
->output_section
== NULL
)
2787 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
2790 /* Do not complain if the target does not support relocations. */
2791 if (relsize
== -1 && bfd_get_error () == bfd_error_invalid_operation
)
2793 bfd_fatal (bfd_get_filename (ibfd
));
2799 relpp
= (arelent
**) xmalloc (relsize
);
2800 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, symbols
);
2802 bfd_fatal (bfd_get_filename (ibfd
));
2804 /* Examine each symbol used in a relocation. If it's not one of the
2805 special bfd section symbols, then mark it with BSF_KEEP. */
2806 for (i
= 0; i
< relcount
; i
++)
2808 if (*relpp
[i
]->sym_ptr_ptr
!= bfd_com_section_ptr
->symbol
2809 && *relpp
[i
]->sym_ptr_ptr
!= bfd_abs_section_ptr
->symbol
2810 && *relpp
[i
]->sym_ptr_ptr
!= bfd_und_section_ptr
->symbol
)
2811 (*relpp
[i
]->sym_ptr_ptr
)->flags
|= BSF_KEEP
;
2818 /* Write out debugging information. */
2821 write_debugging_info (bfd
*obfd
, void *dhandle
,
2822 long *symcountp ATTRIBUTE_UNUSED
,
2823 asymbol
***symppp ATTRIBUTE_UNUSED
)
2825 if (bfd_get_flavour (obfd
) == bfd_target_ieee_flavour
)
2826 return write_ieee_debugging_info (obfd
, dhandle
);
2828 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
2829 || bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
2831 bfd_byte
*syms
, *strings
;
2832 bfd_size_type symsize
, stringsize
;
2833 asection
*stabsec
, *stabstrsec
;
2836 if (! write_stabs_in_sections_debugging_info (obfd
, dhandle
, &syms
,
2841 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DEBUGGING
;
2842 stabsec
= bfd_make_section_with_flags (obfd
, ".stab", flags
);
2843 stabstrsec
= bfd_make_section_with_flags (obfd
, ".stabstr", flags
);
2845 || stabstrsec
== NULL
2846 || ! bfd_set_section_size (obfd
, stabsec
, symsize
)
2847 || ! bfd_set_section_size (obfd
, stabstrsec
, stringsize
)
2848 || ! bfd_set_section_alignment (obfd
, stabsec
, 2)
2849 || ! bfd_set_section_alignment (obfd
, stabstrsec
, 0))
2851 bfd_nonfatal_message (NULL
, obfd
, NULL
,
2852 _("can't create debugging section"));
2856 /* We can get away with setting the section contents now because
2857 the next thing the caller is going to do is copy over the
2858 real sections. We may someday have to split the contents
2859 setting out of this function. */
2860 if (! bfd_set_section_contents (obfd
, stabsec
, syms
, 0, symsize
)
2861 || ! bfd_set_section_contents (obfd
, stabstrsec
, strings
, 0,
2864 bfd_nonfatal_message (NULL
, obfd
, NULL
,
2865 _("can't set debugging section contents"));
2872 bfd_nonfatal_message (NULL
, obfd
, NULL
,
2873 _("don't know how to write debugging information for %s"),
2874 bfd_get_target (obfd
));
2879 strip_main (int argc
, char *argv
[])
2881 char *input_target
= NULL
;
2882 char *output_target
= NULL
;
2883 bfd_boolean show_version
= FALSE
;
2884 bfd_boolean formats_info
= FALSE
;
2887 struct section_list
*p
;
2888 char *output_file
= NULL
;
2890 while ((c
= getopt_long (argc
, argv
, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
2891 strip_options
, (int *) 0)) != EOF
)
2896 input_target
= optarg
;
2899 output_target
= optarg
;
2902 input_target
= output_target
= optarg
;
2905 p
= find_section_list (optarg
, TRUE
);
2907 sections_removed
= TRUE
;
2910 strip_symbols
= STRIP_ALL
;
2914 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
2915 strip_symbols
= STRIP_DEBUG
;
2917 case OPTION_STRIP_UNNEEDED
:
2918 strip_symbols
= STRIP_UNNEEDED
;
2921 add_specific_symbol (optarg
, keep_specific_htab
);
2924 add_specific_symbol (optarg
, strip_specific_htab
);
2927 output_file
= optarg
;
2930 preserve_dates
= TRUE
;
2933 discard_locals
= LOCALS_ALL
;
2936 discard_locals
= LOCALS_START_L
;
2942 show_version
= TRUE
;
2944 case OPTION_FORMATS_INFO
:
2945 formats_info
= TRUE
;
2947 case OPTION_ONLY_KEEP_DEBUG
:
2948 strip_symbols
= STRIP_NONDEBUG
;
2950 case OPTION_KEEP_FILE_SYMBOLS
:
2951 keep_file_symbols
= 1;
2954 /* We've been given a long option. */
2961 strip_usage (stdout
, 0);
2963 strip_usage (stderr
, 1);
2974 print_version ("strip");
2976 /* Default is to strip all symbols. */
2977 if (strip_symbols
== STRIP_UNDEF
2978 && discard_locals
== LOCALS_UNDEF
2979 && htab_elements (strip_specific_htab
) == 0)
2980 strip_symbols
= STRIP_ALL
;
2982 if (output_target
== NULL
)
2983 output_target
= input_target
;
2987 || (output_file
!= NULL
&& (i
+ 1) < argc
))
2988 strip_usage (stderr
, 1);
2990 for (; i
< argc
; i
++)
2992 int hold_status
= status
;
2993 struct stat statbuf
;
2996 if (get_file_size (argv
[i
]) < 1)
3003 /* No need to check the return value of stat().
3004 It has already been checked in get_file_size(). */
3005 stat (argv
[i
], &statbuf
);
3007 if (output_file
== NULL
|| strcmp (argv
[i
], output_file
) == 0)
3008 tmpname
= make_tempname (argv
[i
]);
3010 tmpname
= output_file
;
3012 if (tmpname
== NULL
)
3014 bfd_nonfatal_message (argv
[i
], NULL
, NULL
,
3015 _("could not create temporary file to hold stripped copy"));
3021 copy_file (argv
[i
], tmpname
, input_target
, output_target
, NULL
);
3025 set_times (tmpname
, &statbuf
);
3026 if (output_file
!= tmpname
)
3027 status
= (smart_rename (tmpname
,
3028 output_file
? output_file
: argv
[i
],
3029 preserve_dates
) != 0);
3031 status
= hold_status
;
3034 unlink_if_ordinary (tmpname
);
3035 if (output_file
!= tmpname
)
3042 /* Set up PE subsystem. */
3045 set_pe_subsystem (const char *s
)
3047 const char *version
, *subsystem
;
3057 { "native", 0, IMAGE_SUBSYSTEM_NATIVE
},
3058 { "windows", 0, IMAGE_SUBSYSTEM_WINDOWS_GUI
},
3059 { "console", 0, IMAGE_SUBSYSTEM_WINDOWS_CUI
},
3060 { "posix", 0, IMAGE_SUBSYSTEM_POSIX_CUI
},
3061 { "wince", 0, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
},
3062 { "efi-app", 1, IMAGE_SUBSYSTEM_EFI_APPLICATION
},
3063 { "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
},
3064 { "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
},
3065 { "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER
},
3066 { "xbox", 0, IMAGE_SUBSYSTEM_XBOX
}
3072 /* Check for the presence of a version number. */
3073 version
= strchr (s
, ':');
3074 if (version
== NULL
)
3078 int len
= version
- s
;
3082 version
= copy
+ 1 + len
;
3083 pe_major_subsystem_version
= strtoul (version
, ©
, 0);
3085 pe_minor_subsystem_version
= strtoul (copy
+ 1, ©
, 0);
3087 non_fatal (_("%s: bad version in PE subsystem"), s
);
3090 /* Check for numeric subsystem. */
3091 value
= (short) strtol (subsystem
, ©
, 0);
3094 for (i
= 0; i
< ARRAY_SIZE (v
); i
++)
3095 if (v
[i
].value
== value
)
3097 pe_subsystem
= value
;
3098 set_def
= v
[i
].set_def
;
3104 /* Search for subsystem by name. */
3105 for (i
= 0; i
< ARRAY_SIZE (v
); i
++)
3106 if (strcmp (subsystem
, v
[i
].name
) == 0)
3108 pe_subsystem
= v
[i
].value
;
3109 set_def
= v
[i
].set_def
;
3117 fatal (_("unknown PE subsystem: %s"), s
);
3122 if (pe_file_alignment
== (bfd_vma
) -1)
3123 pe_file_alignment
= PE_DEF_FILE_ALIGNMENT
;
3124 if (pe_section_alignment
== (bfd_vma
) -1)
3125 pe_section_alignment
= PE_DEF_SECTION_ALIGNMENT
;
3130 /* Convert EFI target to PEI target. */
3133 convert_efi_target (char *efi
)
3139 if (strcmp (efi
+ 4, "ia32") == 0)
3141 /* Change ia32 to i386. */
3146 else if (strcmp (efi
+ 4, "x86_64") == 0)
3148 /* Change x86_64 to x86-64. */
3154 copy_main (int argc
, char *argv
[])
3156 char *input_filename
= NULL
;
3157 char *output_filename
= NULL
;
3159 char *input_target
= NULL
;
3160 char *output_target
= NULL
;
3161 bfd_boolean show_version
= FALSE
;
3162 bfd_boolean change_warn
= TRUE
;
3163 bfd_boolean formats_info
= FALSE
;
3165 struct section_list
*p
;
3166 struct stat statbuf
;
3167 const bfd_arch_info_type
*input_arch
= NULL
;
3169 while ((c
= getopt_long (argc
, argv
, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
3170 copy_options
, (int *) 0)) != EOF
)
3175 copy_byte
= atoi (optarg
);
3177 fatal (_("byte number must be non-negative"));
3181 input_arch
= bfd_scan_arch (optarg
);
3182 if (input_arch
== NULL
)
3183 fatal (_("architecture %s unknown"), optarg
);
3187 interleave
= atoi (optarg
);
3189 fatal (_("interleave must be positive"));
3193 case 's': /* "source" - 'I' is preferred */
3194 input_target
= optarg
;
3198 case 'd': /* "destination" - 'O' is preferred */
3199 output_target
= optarg
;
3203 input_target
= output_target
= optarg
;
3207 p
= find_section_list (optarg
, TRUE
);
3209 fatal (_("%s both copied and removed"), optarg
);
3211 sections_copied
= TRUE
;
3215 p
= find_section_list (optarg
, TRUE
);
3217 fatal (_("%s both copied and removed"), optarg
);
3219 sections_removed
= TRUE
;
3223 strip_symbols
= STRIP_ALL
;
3227 strip_symbols
= STRIP_DEBUG
;
3230 case OPTION_STRIP_UNNEEDED
:
3231 strip_symbols
= STRIP_UNNEEDED
;
3234 case OPTION_ONLY_KEEP_DEBUG
:
3235 strip_symbols
= STRIP_NONDEBUG
;
3238 case OPTION_KEEP_FILE_SYMBOLS
:
3239 keep_file_symbols
= 1;
3242 case OPTION_ADD_GNU_DEBUGLINK
:
3243 gnu_debuglink_filename
= optarg
;
3247 add_specific_symbol (optarg
, keep_specific_htab
);
3251 add_specific_symbol (optarg
, strip_specific_htab
);
3254 case OPTION_STRIP_UNNEEDED_SYMBOL
:
3255 add_specific_symbol (optarg
, strip_unneeded_htab
);
3259 add_specific_symbol (optarg
, localize_specific_htab
);
3262 case OPTION_GLOBALIZE_SYMBOL
:
3263 add_specific_symbol (optarg
, globalize_specific_htab
);
3267 add_specific_symbol (optarg
, keepglobal_specific_htab
);
3271 add_specific_symbol (optarg
, weaken_specific_htab
);
3275 preserve_dates
= TRUE
;
3283 discard_locals
= LOCALS_ALL
;
3287 discard_locals
= LOCALS_START_L
;
3295 show_version
= TRUE
;
3298 case OPTION_FORMATS_INFO
:
3299 formats_info
= TRUE
;
3306 case OPTION_ADD_SECTION
:
3310 struct section_add
*pa
;
3313 s
= strchr (optarg
, '=');
3316 fatal (_("bad format for %s"), "--add-section");
3318 pa
= (struct section_add
*) xmalloc (sizeof (struct section_add
));
3319 pa
->name
= xstrndup (optarg
, s
- optarg
);
3320 pa
->filename
= s
+ 1;
3322 /* We don't use get_file_size so that we can do
3323 --add-section .note.GNU_stack=/dev/null
3324 get_file_size doesn't work on /dev/null. */
3326 f
= fopen (pa
->filename
, FOPEN_RB
);
3328 fatal (_("cannot open: %s: %s"),
3329 pa
->filename
, strerror (errno
));
3333 pa
->contents
= (bfd_byte
*) xmalloc (alloc
);
3341 pa
->contents
= (bfd_byte
*) xrealloc (pa
->contents
, alloc
);
3344 got
= fread (pa
->contents
+ off
, 1, alloc
- off
, f
);
3346 fatal (_("%s: fread failed"), pa
->filename
);
3355 pa
->next
= add_sections
;
3360 case OPTION_CHANGE_START
:
3361 change_start
= parse_vma (optarg
, "--change-start");
3364 case OPTION_CHANGE_SECTION_ADDRESS
:
3365 case OPTION_CHANGE_SECTION_LMA
:
3366 case OPTION_CHANGE_SECTION_VMA
:
3371 char *option
= NULL
;
3373 enum change_action what
= CHANGE_IGNORE
;
3377 case OPTION_CHANGE_SECTION_ADDRESS
:
3378 option
= "--change-section-address";
3380 case OPTION_CHANGE_SECTION_LMA
:
3381 option
= "--change-section-lma";
3383 case OPTION_CHANGE_SECTION_VMA
:
3384 option
= "--change-section-vma";
3388 s
= strchr (optarg
, '=');
3391 s
= strchr (optarg
, '+');
3394 s
= strchr (optarg
, '-');
3396 fatal (_("bad format for %s"), option
);
3401 name
= (char *) xmalloc (len
+ 1);
3402 strncpy (name
, optarg
, len
);
3405 p
= find_section_list (name
, TRUE
);
3407 val
= parse_vma (s
+ 1, option
);
3411 case '=': what
= CHANGE_SET
; break;
3412 case '-': val
= - val
; /* Drop through. */
3413 case '+': what
= CHANGE_MODIFY
; break;
3418 case OPTION_CHANGE_SECTION_ADDRESS
:
3419 p
->change_vma
= what
;
3423 case OPTION_CHANGE_SECTION_LMA
:
3424 p
->change_lma
= what
;
3428 case OPTION_CHANGE_SECTION_VMA
:
3429 p
->change_vma
= what
;
3436 case OPTION_CHANGE_ADDRESSES
:
3437 change_section_address
= parse_vma (optarg
, "--change-addresses");
3438 change_start
= change_section_address
;
3441 case OPTION_CHANGE_WARNINGS
:
3445 case OPTION_CHANGE_LEADING_CHAR
:
3446 change_leading_char
= TRUE
;
3449 case OPTION_DEBUGGING
:
3450 convert_debugging
= TRUE
;
3453 case OPTION_GAP_FILL
:
3455 bfd_vma gap_fill_vma
;
3457 gap_fill_vma
= parse_vma (optarg
, "--gap-fill");
3458 gap_fill
= (bfd_byte
) gap_fill_vma
;
3459 if ((bfd_vma
) gap_fill
!= gap_fill_vma
)
3463 sprintf_vma (buff
, gap_fill_vma
);
3465 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
3468 gap_fill_set
= TRUE
;
3472 case OPTION_NO_CHANGE_WARNINGS
:
3473 change_warn
= FALSE
;
3477 pad_to
= parse_vma (optarg
, "--pad-to");
3481 case OPTION_REMOVE_LEADING_CHAR
:
3482 remove_leading_char
= TRUE
;
3485 case OPTION_REDEFINE_SYM
:
3487 /* Push this redefinition onto redefine_symbol_list. */
3491 const char *nextarg
;
3492 char *source
, *target
;
3494 s
= strchr (optarg
, '=');
3496 fatal (_("bad format for %s"), "--redefine-sym");
3499 source
= (char *) xmalloc (len
+ 1);
3500 strncpy (source
, optarg
, len
);
3504 len
= strlen (nextarg
);
3505 target
= (char *) xmalloc (len
+ 1);
3506 strcpy (target
, nextarg
);
3508 redefine_list_append ("--redefine-sym", source
, target
);
3515 case OPTION_REDEFINE_SYMS
:
3516 add_redefine_syms_file (optarg
);
3519 case OPTION_SET_SECTION_FLAGS
:
3525 s
= strchr (optarg
, '=');
3527 fatal (_("bad format for %s"), "--set-section-flags");
3530 name
= (char *) xmalloc (len
+ 1);
3531 strncpy (name
, optarg
, len
);
3534 p
= find_section_list (name
, TRUE
);
3536 p
->set_flags
= TRUE
;
3537 p
->flags
= parse_flags (s
+ 1);
3541 case OPTION_RENAME_SECTION
:
3544 const char *eq
, *fl
;
3549 eq
= strchr (optarg
, '=');
3551 fatal (_("bad format for %s"), "--rename-section");
3555 fatal (_("bad format for %s"), "--rename-section");
3557 old_name
= (char *) xmalloc (len
+ 1);
3558 strncpy (old_name
, optarg
, len
);
3562 fl
= strchr (eq
, ',');
3565 flags
= parse_flags (fl
+ 1);
3575 fatal (_("bad format for %s"), "--rename-section");
3577 new_name
= (char *) xmalloc (len
+ 1);
3578 strncpy (new_name
, eq
, len
);
3581 add_section_rename (old_name
, new_name
, flags
);
3585 case OPTION_SET_START
:
3586 set_start
= parse_vma (optarg
, "--set-start");
3587 set_start_set
= TRUE
;
3590 case OPTION_SREC_LEN
:
3591 Chunk
= parse_vma (optarg
, "--srec-len");
3594 case OPTION_SREC_FORCES3
:
3598 case OPTION_STRIP_SYMBOLS
:
3599 add_specific_symbols (optarg
, strip_specific_htab
);
3602 case OPTION_STRIP_UNNEEDED_SYMBOLS
:
3603 add_specific_symbols (optarg
, strip_unneeded_htab
);
3606 case OPTION_KEEP_SYMBOLS
:
3607 add_specific_symbols (optarg
, keep_specific_htab
);
3610 case OPTION_LOCALIZE_HIDDEN
:
3611 localize_hidden
= TRUE
;
3614 case OPTION_LOCALIZE_SYMBOLS
:
3615 add_specific_symbols (optarg
, localize_specific_htab
);
3618 case OPTION_LONG_SECTION_NAMES
:
3619 if (!strcmp ("enable", optarg
))
3620 long_section_names
= ENABLE
;
3621 else if (!strcmp ("disable", optarg
))
3622 long_section_names
= DISABLE
;
3623 else if (!strcmp ("keep", optarg
))
3624 long_section_names
= KEEP
;
3626 fatal (_("unknown long section names option '%s'"), optarg
);
3629 case OPTION_GLOBALIZE_SYMBOLS
:
3630 add_specific_symbols (optarg
, globalize_specific_htab
);
3633 case OPTION_KEEPGLOBAL_SYMBOLS
:
3634 add_specific_symbols (optarg
, keepglobal_specific_htab
);
3637 case OPTION_WEAKEN_SYMBOLS
:
3638 add_specific_symbols (optarg
, weaken_specific_htab
);
3641 case OPTION_ALT_MACH_CODE
:
3642 use_alt_mach_code
= strtoul (optarg
, NULL
, 0);
3643 if (use_alt_mach_code
== 0)
3644 fatal (_("unable to parse alternative machine code"));
3647 case OPTION_PREFIX_SYMBOLS
:
3648 prefix_symbols_string
= optarg
;
3651 case OPTION_PREFIX_SECTIONS
:
3652 prefix_sections_string
= optarg
;
3655 case OPTION_PREFIX_ALLOC_SECTIONS
:
3656 prefix_alloc_sections_string
= optarg
;
3659 case OPTION_READONLY_TEXT
:
3660 bfd_flags_to_set
|= WP_TEXT
;
3661 bfd_flags_to_clear
&= ~WP_TEXT
;
3664 case OPTION_WRITABLE_TEXT
:
3665 bfd_flags_to_clear
|= WP_TEXT
;
3666 bfd_flags_to_set
&= ~WP_TEXT
;
3670 bfd_flags_to_set
|= D_PAGED
;
3671 bfd_flags_to_clear
&= ~D_PAGED
;
3675 bfd_flags_to_clear
|= D_PAGED
;
3676 bfd_flags_to_set
&= ~D_PAGED
;
3679 case OPTION_EXTRACT_SYMBOL
:
3680 extract_symbol
= TRUE
;
3683 case OPTION_REVERSE_BYTES
:
3685 int prev
= reverse_bytes
;
3687 reverse_bytes
= atoi (optarg
);
3688 if ((reverse_bytes
<= 0) || ((reverse_bytes
% 2) != 0))
3689 fatal (_("number of bytes to reverse must be positive and even"));
3691 if (prev
&& prev
!= reverse_bytes
)
3692 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
3697 case OPTION_FILE_ALIGNMENT
:
3698 pe_file_alignment
= parse_vma (optarg
, "--file-alignment");
3704 pe_heap_reserve
= strtoul (optarg
, &end
, 0);
3706 || (*end
!= '.' && *end
!= '\0'))
3707 non_fatal (_("%s: invalid reserve value for --heap"),
3709 else if (*end
!= '\0')
3711 pe_heap_commit
= strtoul (end
+ 1, &end
, 0);
3713 non_fatal (_("%s: invalid commit value for --heap"),
3719 case OPTION_IMAGE_BASE
:
3720 pe_image_base
= parse_vma (optarg
, "--image-base");
3723 case OPTION_SECTION_ALIGNMENT
:
3724 pe_section_alignment
= parse_vma (optarg
,
3725 "--section-alignment");
3728 case OPTION_SUBSYSTEM
:
3729 set_pe_subsystem (optarg
);
3735 pe_stack_reserve
= strtoul (optarg
, &end
, 0);
3737 || (*end
!= '.' && *end
!= '\0'))
3738 non_fatal (_("%s: invalid reserve value for --stack"),
3740 else if (*end
!= '\0')
3742 pe_stack_commit
= strtoul (end
+ 1, &end
, 0);
3744 non_fatal (_("%s: invalid commit value for --stack"),
3751 /* We've been given a long option. */
3756 copy_usage (stdout
, 0);
3759 copy_usage (stderr
, 1);
3770 print_version ("objcopy");
3772 if (copy_byte
>= interleave
)
3773 fatal (_("byte number must be less than interleave"));
3775 if (optind
== argc
|| optind
+ 2 < argc
)
3776 copy_usage (stderr
, 1);
3778 input_filename
= argv
[optind
];
3779 if (optind
+ 1 < argc
)
3780 output_filename
= argv
[optind
+ 1];
3782 /* Default is to strip no symbols. */
3783 if (strip_symbols
== STRIP_UNDEF
&& discard_locals
== LOCALS_UNDEF
)
3784 strip_symbols
= STRIP_NONE
;
3786 if (output_target
== NULL
)
3787 output_target
= input_target
;
3789 /* Convert input EFI target to PEI target. */
3790 if (input_target
!= NULL
3791 && strncmp (input_target
, "efi-", 4) == 0)
3795 efi
= xstrdup (output_target
+ 4);
3796 if (strncmp (efi
, "bsdrv-", 6) == 0
3797 || strncmp (efi
, "rtdrv-", 6) == 0)
3799 else if (strncmp (efi
, "app-", 4) != 0)
3800 fatal (_("unknown input EFI target: %s"), input_target
);
3803 convert_efi_target (efi
);
3806 /* Convert output EFI target to PEI target. */
3807 if (output_target
!= NULL
3808 && strncmp (output_target
, "efi-", 4) == 0)
3812 efi
= xstrdup (output_target
+ 4);
3813 if (strncmp (efi
, "app-", 4) == 0)
3815 if (pe_subsystem
== -1)
3816 pe_subsystem
= IMAGE_SUBSYSTEM_EFI_APPLICATION
;
3818 else if (strncmp (efi
, "bsdrv-", 6) == 0)
3820 if (pe_subsystem
== -1)
3821 pe_subsystem
= IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
;
3824 else if (strncmp (efi
, "rtdrv-", 6) == 0)
3826 if (pe_subsystem
== -1)
3827 pe_subsystem
= IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
;
3831 fatal (_("unknown output EFI target: %s"), output_target
);
3833 if (pe_file_alignment
== (bfd_vma
) -1)
3834 pe_file_alignment
= PE_DEF_FILE_ALIGNMENT
;
3835 if (pe_section_alignment
== (bfd_vma
) -1)
3836 pe_section_alignment
= PE_DEF_SECTION_ALIGNMENT
;
3838 output_target
= efi
;
3839 convert_efi_target (efi
);
3843 if (stat (input_filename
, & statbuf
) < 0)
3844 fatal (_("warning: could not locate '%s'. System error message: %s"),
3845 input_filename
, strerror (errno
));
3847 /* If there is no destination file, or the source and destination files
3848 are the same, then create a temp and rename the result into the input. */
3849 if (output_filename
== NULL
|| strcmp (input_filename
, output_filename
) == 0)
3850 tmpname
= make_tempname (input_filename
);
3852 tmpname
= output_filename
;
3854 if (tmpname
== NULL
)
3855 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
3856 input_filename
, strerror (errno
));
3858 copy_file (input_filename
, tmpname
, input_target
, output_target
, input_arch
);
3862 set_times (tmpname
, &statbuf
);
3863 if (tmpname
!= output_filename
)
3864 status
= (smart_rename (tmpname
, input_filename
,
3865 preserve_dates
) != 0);
3868 unlink_if_ordinary (tmpname
);
3872 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
3876 if (p
->change_vma
!= CHANGE_IGNORE
)
3880 sprintf_vma (buff
, p
->vma_val
);
3882 /* xgettext:c-format */
3883 non_fatal (_("%s %s%c0x%s never used"),
3884 "--change-section-vma",
3886 p
->change_vma
== CHANGE_SET
? '=' : '+',
3890 if (p
->change_lma
!= CHANGE_IGNORE
)
3894 sprintf_vma (buff
, p
->lma_val
);
3896 /* xgettext:c-format */
3897 non_fatal (_("%s %s%c0x%s never used"),
3898 "--change-section-lma",
3900 p
->change_lma
== CHANGE_SET
? '=' : '+',
3911 main (int argc
, char *argv
[])
3913 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
3914 setlocale (LC_MESSAGES
, "");
3916 #if defined (HAVE_SETLOCALE)
3917 setlocale (LC_CTYPE
, "");
3919 bindtextdomain (PACKAGE
, LOCALEDIR
);
3920 textdomain (PACKAGE
);
3922 program_name
= argv
[0];
3923 xmalloc_set_program_name (program_name
);
3925 START_PROGRESS (program_name
, 0);
3927 expandargv (&argc
, &argv
);
3929 strip_symbols
= STRIP_UNDEF
;
3930 discard_locals
= LOCALS_UNDEF
;
3933 set_default_bfd_target ();
3937 int i
= strlen (program_name
);
3938 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3939 /* Drop the .exe suffix, if any. */
3940 if (i
> 4 && FILENAME_CMP (program_name
+ i
- 4, ".exe") == 0)
3943 program_name
[i
] = '\0';
3946 is_strip
= (i
>= 5 && FILENAME_CMP (program_name
+ i
- 5, "strip") == 0);
3949 create_symbol_htabs ();
3952 strip_main (argc
, argv
);
3954 copy_main (argc
, argv
);
3956 END_PROGRESS (program_name
);