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
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 2 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"
29 #include "filenames.h"
35 /* A list of symbols to explicitly strip out, or to keep. A linked
36 list is good enough for a small number from the command line, but
37 this will slow things down a lot if many symbols are being
46 /* A list to support redefine_sym. */
51 struct redefine_node
*next
;
54 typedef struct section_rename
56 const char * old_name
;
57 const char * new_name
;
59 struct section_rename
* next
;
63 /* List of sections to be renamed. */
64 static section_rename
*section_rename_list
;
66 #define RETURN_NONFATAL(s) {bfd_nonfatal (s); status = 1; return;}
68 static asymbol
**isympp
= NULL
; /* Input symbols. */
69 static asymbol
**osympp
= NULL
; /* Output symbols that survive stripping. */
71 /* If `copy_byte' >= 0, copy only that byte of every `interleave' bytes. */
72 static int copy_byte
= -1;
73 static int interleave
= 4;
75 static bfd_boolean verbose
; /* Print file and target names. */
76 static bfd_boolean preserve_dates
; /* Preserve input file timestamp. */
77 static int status
= 0; /* Exit status. */
82 STRIP_NONE
, /* Don't strip. */
83 STRIP_DEBUG
, /* Strip all debugger symbols. */
84 STRIP_UNNEEDED
, /* Strip unnecessary symbols. */
85 STRIP_NONDEBUG
, /* Strip everything but debug info. */
86 STRIP_ALL
/* Strip all symbols. */
89 /* Which symbols to remove. */
90 static enum strip_action strip_symbols
;
95 LOCALS_START_L
, /* Discard locals starting with L. */
96 LOCALS_ALL
/* Discard all locals. */
99 /* Which local symbols to remove. Overrides STRIP_ALL. */
100 static enum locals_action discard_locals
;
102 /* What kind of change to perform. */
110 /* Structure used to hold lists of sections and actions to take. */
113 struct section_list
* next
; /* Next section to change. */
114 const char * name
; /* Section name. */
115 bfd_boolean used
; /* Whether this entry was used. */
116 bfd_boolean remove
; /* Whether to remove this section. */
117 bfd_boolean copy
; /* Whether to copy this section. */
118 enum change_action change_vma
;/* Whether to change or set VMA. */
119 bfd_vma vma_val
; /* Amount to change by or set to. */
120 enum change_action change_lma
;/* Whether to change or set LMA. */
121 bfd_vma lma_val
; /* Amount to change by or set to. */
122 bfd_boolean set_flags
; /* Whether to set the section flags. */
123 flagword flags
; /* What to set the section flags to. */
126 static struct section_list
*change_sections
;
128 /* TRUE if some sections are to be removed. */
129 static bfd_boolean sections_removed
;
131 /* TRUE if only some sections are to be copied. */
132 static bfd_boolean sections_copied
;
134 /* Changes to the start address. */
135 static bfd_vma change_start
= 0;
136 static bfd_boolean set_start_set
= FALSE
;
137 static bfd_vma set_start
;
139 /* Changes to section addresses. */
140 static bfd_vma change_section_address
= 0;
142 /* Filling gaps between sections. */
143 static bfd_boolean gap_fill_set
= FALSE
;
144 static bfd_byte gap_fill
= 0;
146 /* Pad to a given address. */
147 static bfd_boolean pad_to_set
= FALSE
;
148 static bfd_vma pad_to
;
150 /* Use alternative machine code? */
151 static unsigned long use_alt_mach_code
= 0;
153 /* Output BFD flags user wants to set or clear */
154 static flagword bfd_flags_to_set
;
155 static flagword bfd_flags_to_clear
;
157 /* List of sections to add. */
160 /* Next section to add. */
161 struct section_add
*next
;
162 /* Name of section to add. */
164 /* Name of file holding section contents. */
165 const char *filename
;
168 /* Contents of file. */
170 /* BFD section, after it has been added. */
174 /* List of sections to add to the output BFD. */
175 static struct section_add
*add_sections
;
177 /* If non-NULL the argument to --add-gnu-debuglink.
178 This should be the filename to store in the .gnu_debuglink section. */
179 static const char * gnu_debuglink_filename
= NULL
;
181 /* Whether to convert debugging information. */
182 static bfd_boolean convert_debugging
= FALSE
;
184 /* Whether to change the leading character in symbol names. */
185 static bfd_boolean change_leading_char
= FALSE
;
187 /* Whether to remove the leading character from global symbol names. */
188 static bfd_boolean remove_leading_char
= FALSE
;
190 /* Whether to permit wildcard in symbol comparison. */
191 static bfd_boolean wildcard
= FALSE
;
193 /* True if --localize-hidden is in effect. */
194 static bfd_boolean localize_hidden
= FALSE
;
196 /* List of symbols to strip, keep, localize, keep-global, weaken,
198 static struct symlist
*strip_specific_list
= NULL
;
199 static struct symlist
*strip_unneeded_list
= NULL
;
200 static struct symlist
*keep_specific_list
= NULL
;
201 static struct symlist
*localize_specific_list
= NULL
;
202 static struct symlist
*globalize_specific_list
= NULL
;
203 static struct symlist
*keepglobal_specific_list
= NULL
;
204 static struct symlist
*weaken_specific_list
= NULL
;
205 static struct redefine_node
*redefine_sym_list
= NULL
;
207 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
208 static bfd_boolean weaken
= FALSE
;
210 /* If this is TRUE, we retain BSF_FILE symbols. */
211 static bfd_boolean keep_file_symbols
= FALSE
;
213 /* Prefix symbols/sections. */
214 static char *prefix_symbols_string
= 0;
215 static char *prefix_sections_string
= 0;
216 static char *prefix_alloc_sections_string
= 0;
218 /* True if --extract-symbol was passed on the command line. */
219 static bfd_boolean extract_symbol
= FALSE
;
221 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
222 enum command_line_switch
224 OPTION_ADD_SECTION
=150,
225 OPTION_CHANGE_ADDRESSES
,
226 OPTION_CHANGE_LEADING_CHAR
,
228 OPTION_CHANGE_SECTION_ADDRESS
,
229 OPTION_CHANGE_SECTION_LMA
,
230 OPTION_CHANGE_SECTION_VMA
,
231 OPTION_CHANGE_WARNINGS
,
234 OPTION_NO_CHANGE_WARNINGS
,
236 OPTION_REMOVE_LEADING_CHAR
,
237 OPTION_SET_SECTION_FLAGS
,
239 OPTION_STRIP_UNNEEDED
,
242 OPTION_REDEFINE_SYMS
,
245 OPTION_STRIP_SYMBOLS
,
246 OPTION_STRIP_UNNEEDED_SYMBOL
,
247 OPTION_STRIP_UNNEEDED_SYMBOLS
,
249 OPTION_LOCALIZE_HIDDEN
,
250 OPTION_LOCALIZE_SYMBOLS
,
251 OPTION_GLOBALIZE_SYMBOL
,
252 OPTION_GLOBALIZE_SYMBOLS
,
253 OPTION_KEEPGLOBAL_SYMBOLS
,
254 OPTION_WEAKEN_SYMBOLS
,
255 OPTION_RENAME_SECTION
,
256 OPTION_ALT_MACH_CODE
,
257 OPTION_PREFIX_SYMBOLS
,
258 OPTION_PREFIX_SECTIONS
,
259 OPTION_PREFIX_ALLOC_SECTIONS
,
261 OPTION_ADD_GNU_DEBUGLINK
,
262 OPTION_ONLY_KEEP_DEBUG
,
263 OPTION_KEEP_FILE_SYMBOLS
,
264 OPTION_READONLY_TEXT
,
265 OPTION_WRITABLE_TEXT
,
268 OPTION_EXTRACT_SYMBOL
271 /* Options to handle if running as "strip". */
273 static struct option strip_options
[] =
275 {"discard-all", no_argument
, 0, 'x'},
276 {"discard-locals", no_argument
, 0, 'X'},
277 {"format", required_argument
, 0, 'F'}, /* Obsolete */
278 {"help", no_argument
, 0, 'h'},
279 {"info", no_argument
, 0, OPTION_FORMATS_INFO
},
280 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
281 {"input-target", required_argument
, 0, 'I'},
282 {"keep-file-symbols", no_argument
, 0, OPTION_KEEP_FILE_SYMBOLS
},
283 {"keep-symbol", required_argument
, 0, 'K'},
284 {"only-keep-debug", no_argument
, 0, OPTION_ONLY_KEEP_DEBUG
},
285 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
286 {"output-target", required_argument
, 0, 'O'},
287 {"output-file", required_argument
, 0, 'o'},
288 {"preserve-dates", no_argument
, 0, 'p'},
289 {"remove-section", required_argument
, 0, 'R'},
290 {"strip-all", no_argument
, 0, 's'},
291 {"strip-debug", no_argument
, 0, 'S'},
292 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
293 {"strip-symbol", required_argument
, 0, 'N'},
294 {"target", required_argument
, 0, 'F'},
295 {"verbose", no_argument
, 0, 'v'},
296 {"version", no_argument
, 0, 'V'},
297 {"wildcard", no_argument
, 0, 'w'},
298 {0, no_argument
, 0, 0}
301 /* Options to handle if running as "objcopy". */
303 static struct option copy_options
[] =
305 {"add-gnu-debuglink", required_argument
, 0, OPTION_ADD_GNU_DEBUGLINK
},
306 {"add-section", required_argument
, 0, OPTION_ADD_SECTION
},
307 {"adjust-start", required_argument
, 0, OPTION_CHANGE_START
},
308 {"adjust-vma", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
309 {"adjust-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
310 {"adjust-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
311 {"alt-machine-code", required_argument
, 0, OPTION_ALT_MACH_CODE
},
312 {"binary-architecture", required_argument
, 0, 'B'},
313 {"byte", required_argument
, 0, 'b'},
314 {"change-addresses", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
315 {"change-leading-char", no_argument
, 0, OPTION_CHANGE_LEADING_CHAR
},
316 {"change-section-address", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
317 {"change-section-lma", required_argument
, 0, OPTION_CHANGE_SECTION_LMA
},
318 {"change-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_VMA
},
319 {"change-start", required_argument
, 0, OPTION_CHANGE_START
},
320 {"change-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
321 {"debugging", no_argument
, 0, OPTION_DEBUGGING
},
322 {"discard-all", no_argument
, 0, 'x'},
323 {"discard-locals", no_argument
, 0, 'X'},
324 {"extract-symbol", no_argument
, 0, OPTION_EXTRACT_SYMBOL
},
325 {"format", required_argument
, 0, 'F'}, /* Obsolete */
326 {"gap-fill", required_argument
, 0, OPTION_GAP_FILL
},
327 {"globalize-symbol", required_argument
, 0, OPTION_GLOBALIZE_SYMBOL
},
328 {"globalize-symbols", required_argument
, 0, OPTION_GLOBALIZE_SYMBOLS
},
329 {"help", no_argument
, 0, 'h'},
330 {"impure", no_argument
, 0, OPTION_IMPURE
},
331 {"info", no_argument
, 0, OPTION_FORMATS_INFO
},
332 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
333 {"input-target", required_argument
, 0, 'I'},
334 {"interleave", required_argument
, 0, 'i'},
335 {"keep-file-symbols", no_argument
, 0, OPTION_KEEP_FILE_SYMBOLS
},
336 {"keep-global-symbol", required_argument
, 0, 'G'},
337 {"keep-global-symbols", required_argument
, 0, OPTION_KEEPGLOBAL_SYMBOLS
},
338 {"keep-symbol", required_argument
, 0, 'K'},
339 {"keep-symbols", required_argument
, 0, OPTION_KEEP_SYMBOLS
},
340 {"localize-hidden", no_argument
, 0, OPTION_LOCALIZE_HIDDEN
},
341 {"localize-symbol", required_argument
, 0, 'L'},
342 {"localize-symbols", required_argument
, 0, OPTION_LOCALIZE_SYMBOLS
},
343 {"no-adjust-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
344 {"no-change-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
345 {"only-keep-debug", no_argument
, 0, OPTION_ONLY_KEEP_DEBUG
},
346 {"only-section", required_argument
, 0, 'j'},
347 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
348 {"output-target", required_argument
, 0, 'O'},
349 {"pad-to", required_argument
, 0, OPTION_PAD_TO
},
350 {"prefix-symbols", required_argument
, 0, OPTION_PREFIX_SYMBOLS
},
351 {"prefix-sections", required_argument
, 0, OPTION_PREFIX_SECTIONS
},
352 {"prefix-alloc-sections", required_argument
, 0, OPTION_PREFIX_ALLOC_SECTIONS
},
353 {"preserve-dates", no_argument
, 0, 'p'},
354 {"pure", no_argument
, 0, OPTION_PURE
},
355 {"readonly-text", no_argument
, 0, OPTION_READONLY_TEXT
},
356 {"redefine-sym", required_argument
, 0, OPTION_REDEFINE_SYM
},
357 {"redefine-syms", required_argument
, 0, OPTION_REDEFINE_SYMS
},
358 {"remove-leading-char", no_argument
, 0, OPTION_REMOVE_LEADING_CHAR
},
359 {"remove-section", required_argument
, 0, 'R'},
360 {"rename-section", required_argument
, 0, OPTION_RENAME_SECTION
},
361 {"set-section-flags", required_argument
, 0, OPTION_SET_SECTION_FLAGS
},
362 {"set-start", required_argument
, 0, OPTION_SET_START
},
363 {"srec-len", required_argument
, 0, OPTION_SREC_LEN
},
364 {"srec-forceS3", no_argument
, 0, OPTION_SREC_FORCES3
},
365 {"strip-all", no_argument
, 0, 'S'},
366 {"strip-debug", no_argument
, 0, 'g'},
367 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
368 {"strip-unneeded-symbol", required_argument
, 0, OPTION_STRIP_UNNEEDED_SYMBOL
},
369 {"strip-unneeded-symbols", required_argument
, 0, OPTION_STRIP_UNNEEDED_SYMBOLS
},
370 {"strip-symbol", required_argument
, 0, 'N'},
371 {"strip-symbols", required_argument
, 0, OPTION_STRIP_SYMBOLS
},
372 {"target", required_argument
, 0, 'F'},
373 {"verbose", no_argument
, 0, 'v'},
374 {"version", no_argument
, 0, 'V'},
375 {"weaken", no_argument
, 0, OPTION_WEAKEN
},
376 {"weaken-symbol", required_argument
, 0, 'W'},
377 {"weaken-symbols", required_argument
, 0, OPTION_WEAKEN_SYMBOLS
},
378 {"wildcard", no_argument
, 0, 'w'},
379 {"writable-text", no_argument
, 0, OPTION_WRITABLE_TEXT
},
380 {0, no_argument
, 0, 0}
384 extern char *program_name
;
386 /* This flag distinguishes between strip and objcopy:
387 1 means this is 'strip'; 0 means this is 'objcopy'.
388 -1 means if we should use argv[0] to decide. */
391 /* The maximum length of an S record. This variable is declared in srec.c
392 and can be modified by the --srec-len parameter. */
393 extern unsigned int Chunk
;
395 /* Restrict the generation of Srecords to type S3 only.
396 This variable is declare in bfd/srec.c and can be toggled
397 on by the --srec-forceS3 command line switch. */
398 extern bfd_boolean S3Forced
;
400 /* Defined in bfd/binary.c. Used to set architecture and machine of input
402 extern enum bfd_architecture bfd_external_binary_architecture
;
403 extern unsigned long bfd_external_machine
;
405 /* Forward declarations. */
406 static void setup_section (bfd
*, asection
*, void *);
407 static void setup_bfd_headers (bfd
*, bfd
*);
408 static void copy_section (bfd
*, asection
*, void *);
409 static void get_sections (bfd
*, asection
*, void *);
410 static int compare_section_lma (const void *, const void *);
411 static void mark_symbols_used_in_relocations (bfd
*, asection
*, void *);
412 static bfd_boolean
write_debugging_info (bfd
*, void *, long *, asymbol
***);
413 static const char *lookup_sym_redefinition (const char *);
416 copy_usage (FILE *stream
, int exit_status
)
418 fprintf (stream
, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name
);
419 fprintf (stream
, _(" Copies a binary file, possibly transforming it in the process\n"));
420 fprintf (stream
, _(" The options are:\n"));
421 fprintf (stream
, _("\
422 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
423 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
424 -B --binary-architecture <arch> Set arch of output file, when input is binary\n\
425 -F --target <bfdname> Set both input and output format to <bfdname>\n\
426 --debugging Convert debugging information, if possible\n\
427 -p --preserve-dates Copy modified/access timestamps to the output\n\
428 -j --only-section <name> Only copy section <name> into the output\n\
429 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
430 -R --remove-section <name> Remove section <name> from the output\n\
431 -S --strip-all Remove all symbol and relocation information\n\
432 -g --strip-debug Remove all debugging symbols & sections\n\
433 --strip-unneeded Remove all symbols not needed by relocations\n\
434 -N --strip-symbol <name> Do not copy symbol <name>\n\
435 --strip-unneeded-symbol <name>\n\
436 Do not copy symbol <name> unless needed by\n\
438 --only-keep-debug Strip everything but the debug information\n\
439 --extract-symbol Remove section contents but keep symbols\n\
440 -K --keep-symbol <name> Do not strip symbol <name>\n\
441 --keep-file-symbols Do not strip file symbol(s)\n\
442 --localize-hidden Turn all ELF hidden symbols into locals\n\
443 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
444 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
445 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
446 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
447 --weaken Force all global symbols to be marked as weak\n\
448 -w --wildcard Permit wildcard in symbol comparison\n\
449 -x --discard-all Remove all non-global symbols\n\
450 -X --discard-locals Remove any compiler-generated symbols\n\
451 -i --interleave <number> Only copy one out of every <number> bytes\n\
452 -b --byte <num> Select byte <num> in every interleaved block\n\
453 --gap-fill <val> Fill gaps between sections with <val>\n\
454 --pad-to <addr> Pad the last section up to address <addr>\n\
455 --set-start <addr> Set the start address to <addr>\n\
456 {--change-start|--adjust-start} <incr>\n\
457 Add <incr> to the start address\n\
458 {--change-addresses|--adjust-vma} <incr>\n\
459 Add <incr> to LMA, VMA and start addresses\n\
460 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
461 Change LMA and VMA of section <name> by <val>\n\
462 --change-section-lma <name>{=|+|-}<val>\n\
463 Change the LMA of section <name> by <val>\n\
464 --change-section-vma <name>{=|+|-}<val>\n\
465 Change the VMA of section <name> by <val>\n\
466 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
467 Warn if a named section does not exist\n\
468 --set-section-flags <name>=<flags>\n\
469 Set section <name>'s properties to <flags>\n\
470 --add-section <name>=<file> Add section <name> found in <file> to output\n\
471 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
472 --change-leading-char Force output format's leading character style\n\
473 --remove-leading-char Remove leading character from global symbols\n\
474 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
475 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
477 --srec-len <number> Restrict the length of generated Srecords\n\
478 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
479 --strip-symbols <file> -N for all symbols listed in <file>\n\
480 --strip-unneeded-symbols <file>\n\
481 --strip-unneeded-symbol for all symbols listed\n\
483 --keep-symbols <file> -K for all symbols listed in <file>\n\
484 --localize-symbols <file> -L for all symbols listed in <file>\n\
485 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
486 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
487 --weaken-symbols <file> -W for all symbols listed in <file>\n\
488 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
489 --writable-text Mark the output text as writable\n\
490 --readonly-text Make the output text write protected\n\
491 --pure Mark the output file as demand paged\n\
492 --impure Mark the output file as impure\n\
493 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
494 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
495 --prefix-alloc-sections <prefix>\n\
496 Add <prefix> to start of every allocatable\n\
498 -v --verbose List all object files modified\n\
499 @<file> Read options from <file>\n\
500 -V --version Display this program's version number\n\
501 -h --help Display this output\n\
502 --info List object formats & architectures supported\n\
504 list_supported_targets (program_name
, stream
);
505 if (REPORT_BUGS_TO
[0] && exit_status
== 0)
506 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
511 strip_usage (FILE *stream
, int exit_status
)
513 fprintf (stream
, _("Usage: %s <option(s)> in-file(s)\n"), program_name
);
514 fprintf (stream
, _(" Removes symbols and sections from files\n"));
515 fprintf (stream
, _(" The options are:\n"));
516 fprintf (stream
, _("\
517 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
518 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
519 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
520 -p --preserve-dates Copy modified/access timestamps to the output\n\
521 -R --remove-section=<name> Remove section <name> from the output\n\
522 -s --strip-all Remove all symbol and relocation information\n\
523 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
524 --strip-unneeded Remove all symbols not needed by relocations\n\
525 --only-keep-debug Strip everything but the debug information\n\
526 -N --strip-symbol=<name> Do not copy symbol <name>\n\
527 -K --keep-symbol=<name> Do not strip symbol <name>\n\
528 --keep-file-symbols Do not strip file symbol(s)\n\
529 -w --wildcard Permit wildcard in symbol comparison\n\
530 -x --discard-all Remove all non-global symbols\n\
531 -X --discard-locals Remove any compiler-generated symbols\n\
532 -v --verbose List all object files modified\n\
533 -V --version Display this program's version number\n\
534 -h --help Display this output\n\
535 --info List object formats & architectures supported\n\
536 -o <file> Place stripped output into <file>\n\
539 list_supported_targets (program_name
, stream
);
540 if (REPORT_BUGS_TO
[0] && exit_status
== 0)
541 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
545 /* Parse section flags into a flagword, with a fatal error if the
546 string can't be parsed. */
549 parse_flags (const char *s
)
559 snext
= strchr (s
, ',');
569 #define PARSE_FLAG(fname,fval) \
570 else if (strncasecmp (fname, s, len) == 0) ret |= fval
571 PARSE_FLAG ("alloc", SEC_ALLOC
);
572 PARSE_FLAG ("load", SEC_LOAD
);
573 PARSE_FLAG ("noload", SEC_NEVER_LOAD
);
574 PARSE_FLAG ("readonly", SEC_READONLY
);
575 PARSE_FLAG ("debug", SEC_DEBUGGING
);
576 PARSE_FLAG ("code", SEC_CODE
);
577 PARSE_FLAG ("data", SEC_DATA
);
578 PARSE_FLAG ("rom", SEC_ROM
);
579 PARSE_FLAG ("share", SEC_COFF_SHARED
);
580 PARSE_FLAG ("contents", SEC_HAS_CONTENTS
);
586 copy
= xmalloc (len
+ 1);
587 strncpy (copy
, s
, len
);
589 non_fatal (_("unrecognized section flag `%s'"), copy
);
590 fatal (_("supported flags: %s"),
591 "alloc, load, noload, readonly, debug, code, data, rom, share, contents");
601 /* Find and optionally add an entry in the change_sections list. */
603 static struct section_list
*
604 find_section_list (const char *name
, bfd_boolean add
)
606 struct section_list
*p
;
608 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
609 if (strcmp (p
->name
, name
) == 0)
615 p
= xmalloc (sizeof (struct section_list
));
620 p
->change_vma
= CHANGE_IGNORE
;
621 p
->change_lma
= CHANGE_IGNORE
;
624 p
->set_flags
= FALSE
;
627 p
->next
= change_sections
;
633 /* Add a symbol to strip_specific_list. */
636 add_specific_symbol (const char *name
, struct symlist
**list
)
638 struct symlist
*tmp_list
;
640 tmp_list
= xmalloc (sizeof (struct symlist
));
641 tmp_list
->name
= name
;
642 tmp_list
->next
= *list
;
646 /* Add symbols listed in `filename' to strip_specific_list. */
648 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
649 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
652 add_specific_symbols (const char *filename
, struct symlist
**list
)
658 unsigned int line_count
;
660 size
= get_file_size (filename
);
667 buffer
= xmalloc (size
+ 2);
668 f
= fopen (filename
, FOPEN_RT
);
670 fatal (_("cannot open '%s': %s"), filename
, strerror (errno
));
672 if (fread (buffer
, 1, size
, f
) == 0 || ferror (f
))
673 fatal (_("%s: fread failed"), filename
);
676 buffer
[size
] = '\n';
677 buffer
[size
+ 1] = '\0';
681 for (line
= buffer
; * line
!= '\0'; line
++)
686 int finished
= FALSE
;
688 for (eol
= line
;; eol
++)
694 /* Cope with \n\r. */
702 /* Cope with \r\n. */
713 /* Line comment, Terminate the line here, in case a
714 name is present and then allow the rest of the
715 loop to find the real end of the line. */
727 /* A name may now exist somewhere between 'line' and 'eol'.
728 Strip off leading whitespace and trailing whitespace,
729 then add it to the list. */
730 for (name
= line
; IS_WHITESPACE (* name
); name
++)
732 for (name_end
= name
;
733 (! IS_WHITESPACE (* name_end
))
734 && (! IS_LINE_TERMINATOR (* name_end
));
738 if (! IS_LINE_TERMINATOR (* name_end
))
742 for (extra
= name_end
+ 1; IS_WHITESPACE (* extra
); extra
++)
745 if (! IS_LINE_TERMINATOR (* extra
))
746 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
747 filename
, line_count
);
753 add_specific_symbol (name
, list
);
755 /* Advance line pointer to end of line. The 'eol ++' in the for
756 loop above will then advance us to the start of the next line. */
762 /* See whether a symbol should be stripped or kept based on
763 strip_specific_list and keep_symbols. */
766 is_specified_symbol (const char *name
, struct symlist
*list
)
768 struct symlist
*tmp_list
;
772 for (tmp_list
= list
; tmp_list
; tmp_list
= tmp_list
->next
)
773 if (*(tmp_list
->name
) != '!')
775 if (!fnmatch (tmp_list
->name
, name
, 0))
780 if (fnmatch (tmp_list
->name
+ 1, name
, 0))
786 for (tmp_list
= list
; tmp_list
; tmp_list
= tmp_list
->next
)
787 if (strcmp (name
, tmp_list
->name
) == 0)
794 /* Return a pointer to the symbol used as a signature for GROUP. */
797 group_signature (asection
*group
)
799 bfd
*abfd
= group
->owner
;
800 Elf_Internal_Shdr
*ghdr
;
802 if (bfd_get_flavour (abfd
) != bfd_target_elf_flavour
)
805 ghdr
= &elf_section_data (group
)->this_hdr
;
806 if (ghdr
->sh_link
< elf_numsections (abfd
))
808 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
809 Elf_Internal_Shdr
*symhdr
= elf_elfsections (abfd
) [ghdr
->sh_link
];
811 if (symhdr
->sh_type
== SHT_SYMTAB
812 && ghdr
->sh_info
< symhdr
->sh_size
/ bed
->s
->sizeof_sym
)
813 return isympp
[ghdr
->sh_info
- 1];
818 /* See if a section is being removed. */
821 is_strip_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
)
823 if (sections_removed
|| sections_copied
)
825 struct section_list
*p
;
827 p
= find_section_list (bfd_get_section_name (abfd
, sec
), FALSE
);
829 if (sections_removed
&& p
!= NULL
&& p
->remove
)
831 if (sections_copied
&& (p
== NULL
|| ! p
->copy
))
835 if ((bfd_get_section_flags (abfd
, sec
) & SEC_DEBUGGING
) != 0)
837 if (strip_symbols
== STRIP_DEBUG
838 || strip_symbols
== STRIP_UNNEEDED
839 || strip_symbols
== STRIP_ALL
840 || discard_locals
== LOCALS_ALL
841 || convert_debugging
)
844 if (strip_symbols
== STRIP_NONDEBUG
)
848 if ((bfd_get_section_flags (abfd
, sec
) & SEC_GROUP
) != 0)
854 Group sections look like debugging sections but they are not.
855 (They have a non-zero size but they are not ALLOCated). */
856 if (strip_symbols
== STRIP_NONDEBUG
)
860 If we are going to strip the group signature symbol, then
861 strip the group section too. */
862 gsym
= group_signature (sec
);
867 if ((strip_symbols
== STRIP_ALL
868 && !is_specified_symbol (gname
, keep_specific_list
))
869 || is_specified_symbol (gname
, strip_specific_list
))
876 /* Return true if SYM is a hidden symbol. */
879 is_hidden_symbol (asymbol
*sym
)
881 elf_symbol_type
*elf_sym
;
883 elf_sym
= elf_symbol_from (sym
->the_bfd
, sym
);
885 switch (ELF_ST_VISIBILITY (elf_sym
->internal_elf_sym
.st_other
))
894 /* Choose which symbol entries to copy; put the result in OSYMS.
895 We don't copy in place, because that confuses the relocs.
896 Return the number of symbols to print. */
899 filter_symbols (bfd
*abfd
, bfd
*obfd
, asymbol
**osyms
,
900 asymbol
**isyms
, long symcount
)
902 asymbol
**from
= isyms
, **to
= osyms
;
903 long src_count
= 0, dst_count
= 0;
904 int relocatable
= (abfd
->flags
& (HAS_RELOC
| EXEC_P
| DYNAMIC
))
907 for (; src_count
< symcount
; src_count
++)
909 asymbol
*sym
= from
[src_count
];
910 flagword flags
= sym
->flags
;
911 char *name
= (char *) bfd_asymbol_name (sym
);
913 bfd_boolean undefined
;
914 bfd_boolean rem_leading_char
;
915 bfd_boolean add_leading_char
;
917 undefined
= bfd_is_und_section (bfd_get_section (sym
));
919 if (redefine_sym_list
)
921 char *old_name
, *new_name
;
923 old_name
= (char *) bfd_asymbol_name (sym
);
924 new_name
= (char *) lookup_sym_redefinition (old_name
);
925 bfd_asymbol_name (sym
) = new_name
;
929 /* Check if we will remove the current leading character. */
931 (name
[0] == bfd_get_symbol_leading_char (abfd
))
932 && (change_leading_char
933 || (remove_leading_char
934 && ((flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0
936 || bfd_is_com_section (bfd_get_section (sym
)))));
938 /* Check if we will add a new leading character. */
941 && (bfd_get_symbol_leading_char (obfd
) != '\0')
942 && (bfd_get_symbol_leading_char (abfd
) == '\0'
943 || (name
[0] == bfd_get_symbol_leading_char (abfd
)));
945 /* Short circuit for change_leading_char if we can do it in-place. */
946 if (rem_leading_char
&& add_leading_char
&& !prefix_symbols_string
)
948 name
[0] = bfd_get_symbol_leading_char (obfd
);
949 bfd_asymbol_name (sym
) = name
;
950 rem_leading_char
= FALSE
;
951 add_leading_char
= FALSE
;
954 /* Remove leading char. */
955 if (rem_leading_char
)
956 bfd_asymbol_name (sym
) = ++name
;
958 /* Add new leading char and/or prefix. */
959 if (add_leading_char
|| prefix_symbols_string
)
963 ptr
= n
= xmalloc (1 + strlen (prefix_symbols_string
)
964 + strlen (name
) + 1);
965 if (add_leading_char
)
966 *ptr
++ = bfd_get_symbol_leading_char (obfd
);
968 if (prefix_symbols_string
)
970 strcpy (ptr
, prefix_symbols_string
);
971 ptr
+= strlen (prefix_symbols_string
);
975 bfd_asymbol_name (sym
) = n
;
979 if (strip_symbols
== STRIP_ALL
)
981 else if ((flags
& BSF_KEEP
) != 0 /* Used in relocation. */
982 || ((flags
& BSF_SECTION_SYM
) != 0
983 && ((*bfd_get_section (sym
)->symbol_ptr_ptr
)->flags
986 else if (relocatable
/* Relocatable file. */
987 && (flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0)
989 else if (bfd_decode_symclass (sym
) == 'I')
990 /* Global symbols in $idata sections need to be retained
991 even if relocatable is FALSE. External users of the
992 library containing the $idata section may reference these
995 else if ((flags
& BSF_GLOBAL
) != 0 /* Global symbol. */
996 || (flags
& BSF_WEAK
) != 0
998 || bfd_is_com_section (bfd_get_section (sym
)))
999 keep
= strip_symbols
!= STRIP_UNNEEDED
;
1000 else if ((flags
& BSF_DEBUGGING
) != 0) /* Debugging symbol. */
1001 keep
= (strip_symbols
!= STRIP_DEBUG
1002 && strip_symbols
!= STRIP_UNNEEDED
1003 && ! convert_debugging
);
1004 else if (bfd_coff_get_comdat_section (abfd
, bfd_get_section (sym
)))
1005 /* COMDAT sections store special information in local
1006 symbols, so we cannot risk stripping any of them. */
1008 else /* Local symbol. */
1009 keep
= (strip_symbols
!= STRIP_UNNEEDED
1010 && (discard_locals
!= LOCALS_ALL
1011 && (discard_locals
!= LOCALS_START_L
1012 || ! bfd_is_local_label (abfd
, sym
))));
1014 if (keep
&& is_specified_symbol (name
, strip_specific_list
))
1017 && !(flags
& BSF_KEEP
)
1018 && is_specified_symbol (name
, strip_unneeded_list
))
1021 && ((keep_file_symbols
&& (flags
& BSF_FILE
))
1022 || is_specified_symbol (name
, keep_specific_list
)))
1024 if (keep
&& is_strip_section (abfd
, bfd_get_section (sym
)))
1029 if ((flags
& BSF_GLOBAL
) != 0
1030 && (weaken
|| is_specified_symbol (name
, weaken_specific_list
)))
1032 sym
->flags
&= ~ BSF_GLOBAL
;
1033 sym
->flags
|= BSF_WEAK
;
1037 && (flags
& (BSF_GLOBAL
| BSF_WEAK
))
1038 && (is_specified_symbol (name
, localize_specific_list
)
1039 || (keepglobal_specific_list
!= NULL
1040 && ! is_specified_symbol (name
, keepglobal_specific_list
))
1041 || (localize_hidden
&& is_hidden_symbol (sym
))))
1043 sym
->flags
&= ~ (BSF_GLOBAL
| BSF_WEAK
);
1044 sym
->flags
|= BSF_LOCAL
;
1048 && (flags
& BSF_LOCAL
)
1049 && is_specified_symbol (name
, globalize_specific_list
))
1051 sym
->flags
&= ~ BSF_LOCAL
;
1052 sym
->flags
|= BSF_GLOBAL
;
1055 to
[dst_count
++] = sym
;
1059 to
[dst_count
] = NULL
;
1064 /* Find the redefined name of symbol SOURCE. */
1067 lookup_sym_redefinition (const char *source
)
1069 struct redefine_node
*list
;
1071 for (list
= redefine_sym_list
; list
!= NULL
; list
= list
->next
)
1072 if (strcmp (source
, list
->source
) == 0)
1073 return list
->target
;
1078 /* Add a node to a symbol redefine list. */
1081 redefine_list_append (const char *cause
, const char *source
, const char *target
)
1083 struct redefine_node
**p
;
1084 struct redefine_node
*list
;
1085 struct redefine_node
*new_node
;
1087 for (p
= &redefine_sym_list
; (list
= *p
) != NULL
; p
= &list
->next
)
1089 if (strcmp (source
, list
->source
) == 0)
1090 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1093 if (strcmp (target
, list
->target
) == 0)
1094 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1098 new_node
= xmalloc (sizeof (struct redefine_node
));
1100 new_node
->source
= strdup (source
);
1101 new_node
->target
= strdup (target
);
1102 new_node
->next
= NULL
;
1107 /* Handle the --redefine-syms option. Read lines containing "old new"
1108 from the file, and add them to the symbol redefine list. */
1111 add_redefine_syms_file (const char *filename
)
1120 file
= fopen (filename
, "r");
1122 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1123 filename
, strerror (errno
));
1126 buf
= xmalloc (bufsize
);
1134 /* Collect the input symbol name. */
1135 while (! IS_WHITESPACE (c
) && ! IS_LINE_TERMINATOR (c
) && c
!= EOF
)
1143 buf
= xrealloc (buf
, bufsize
);
1151 /* Eat white space between the symbol names. */
1152 while (IS_WHITESPACE (c
))
1154 if (c
== '#' || IS_LINE_TERMINATOR (c
))
1159 /* Collect the output symbol name. */
1161 while (! IS_WHITESPACE (c
) && ! IS_LINE_TERMINATOR (c
) && c
!= EOF
)
1169 buf
= xrealloc (buf
, bufsize
);
1177 /* Eat white space at end of line. */
1178 while (! IS_LINE_TERMINATOR(c
) && c
!= EOF
&& IS_WHITESPACE (c
))
1183 if ((c
== '\r' && (c
= getc (file
)) == '\n')
1184 || c
== '\n' || c
== EOF
)
1187 /* Append the redefinition to the list. */
1189 redefine_list_append (filename
, &buf
[0], &buf
[outsym_off
]);
1200 fatal (_("%s:%d: garbage found at end of line"), filename
, lineno
);
1202 if (len
!= 0 && (outsym_off
== 0 || outsym_off
== len
))
1203 fatal (_("%s:%d: missing new symbol name"), filename
, lineno
);
1206 /* Eat the rest of the line and finish it. */
1207 while (c
!= '\n' && c
!= EOF
)
1213 fatal (_("%s:%d: premature end of file"), filename
, lineno
);
1218 /* Copy unkown object file IBFD onto OBFD.
1219 Returns TRUE upon success, FALSE otherwise. */
1222 copy_unknown_object (bfd
*ibfd
, bfd
*obfd
)
1230 if (bfd_stat_arch_elt (ibfd
, &buf
) != 0)
1232 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1239 non_fatal (_("stat returns negative size for `%s'"),
1240 bfd_get_archive_filename (ibfd
));
1244 if (bfd_seek (ibfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1246 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1251 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1252 bfd_get_archive_filename (ibfd
), bfd_get_filename (obfd
));
1254 cbuf
= xmalloc (BUFSIZE
);
1256 while (ncopied
< size
)
1258 tocopy
= size
- ncopied
;
1259 if (tocopy
> BUFSIZE
)
1262 if (bfd_bread (cbuf
, (bfd_size_type
) tocopy
, ibfd
)
1263 != (bfd_size_type
) tocopy
)
1265 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1270 if (bfd_bwrite (cbuf
, (bfd_size_type
) tocopy
, obfd
)
1271 != (bfd_size_type
) tocopy
)
1273 bfd_nonfatal (bfd_get_filename (obfd
));
1281 chmod (bfd_get_filename (obfd
), buf
.st_mode
);
1286 /* Copy object file IBFD onto OBFD.
1287 Returns TRUE upon success, FALSE otherwise. */
1290 copy_object (bfd
*ibfd
, bfd
*obfd
)
1294 asection
**osections
= NULL
;
1295 asection
*gnu_debuglink_section
= NULL
;
1296 bfd_size_type
*gaps
= NULL
;
1297 bfd_size_type max_gap
= 0;
1300 enum bfd_architecture iarch
;
1303 if (ibfd
->xvec
->byteorder
!= obfd
->xvec
->byteorder
1304 && ibfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
1305 && obfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
)
1306 fatal (_("Unable to change endianness of input file(s)"));
1308 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1310 bfd_nonfatal (bfd_get_filename (obfd
));
1315 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
1316 bfd_get_archive_filename (ibfd
), bfd_get_target (ibfd
),
1317 bfd_get_filename (obfd
), bfd_get_target (obfd
));
1326 start
= bfd_get_start_address (ibfd
);
1327 start
+= change_start
;
1330 /* Neither the start address nor the flags
1331 need to be set for a core file. */
1332 if (bfd_get_format (obfd
) != bfd_core
)
1336 flags
= bfd_get_file_flags (ibfd
);
1337 flags
|= bfd_flags_to_set
;
1338 flags
&= ~bfd_flags_to_clear
;
1339 flags
&= bfd_applicable_file_flags (obfd
);
1341 if (!bfd_set_start_address (obfd
, start
)
1342 || !bfd_set_file_flags (obfd
, flags
))
1344 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1349 /* Copy architecture of input file to output file. */
1350 iarch
= bfd_get_arch (ibfd
);
1351 imach
= bfd_get_mach (ibfd
);
1352 if (!bfd_set_arch_mach (obfd
, iarch
, imach
)
1353 && (ibfd
->target_defaulted
1354 || bfd_get_arch (ibfd
) != bfd_get_arch (obfd
)))
1356 if (bfd_get_arch (ibfd
) == bfd_arch_unknown
)
1357 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1358 bfd_get_archive_filename (ibfd
));
1360 non_fatal (_("Warning: Output file cannot represent architecture `%s'"),
1361 bfd_printable_arch_mach (bfd_get_arch (ibfd
),
1362 bfd_get_mach (ibfd
)));
1366 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1368 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1375 if (osympp
!= isympp
)
1381 symsize
= bfd_get_symtab_upper_bound (ibfd
);
1384 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1388 osympp
= isympp
= xmalloc (symsize
);
1389 symcount
= bfd_canonicalize_symtab (ibfd
, isympp
);
1392 bfd_nonfatal (bfd_get_filename (ibfd
));
1396 /* BFD mandates that all output sections be created and sizes set before
1397 any output is done. Thus, we traverse all sections multiple times. */
1398 bfd_map_over_sections (ibfd
, setup_section
, obfd
);
1400 setup_bfd_headers (ibfd
, obfd
);
1402 if (add_sections
!= NULL
)
1404 struct section_add
*padd
;
1405 struct section_list
*pset
;
1407 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
1411 pset
= find_section_list (padd
->name
, FALSE
);
1415 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DATA
;
1416 if (pset
!= NULL
&& pset
->set_flags
)
1417 flags
= pset
->flags
| SEC_HAS_CONTENTS
;
1419 /* bfd_make_section_with_flags() does not return very helpful
1420 error codes, so check for the most likely user error first. */
1421 if (bfd_get_section_by_name (obfd
, padd
->name
))
1423 non_fatal (_("can't add section '%s' - it already exists!"), padd
->name
);
1428 padd
->section
= bfd_make_section_with_flags (obfd
, padd
->name
, flags
);
1429 if (padd
->section
== NULL
)
1431 non_fatal (_("can't create section `%s': %s"),
1432 padd
->name
, bfd_errmsg (bfd_get_error ()));
1437 if (! bfd_set_section_size (obfd
, padd
->section
, padd
->size
))
1439 bfd_nonfatal (bfd_get_filename (obfd
));
1445 if (pset
->change_vma
!= CHANGE_IGNORE
)
1446 if (! bfd_set_section_vma (obfd
, padd
->section
,
1449 bfd_nonfatal (bfd_get_filename (obfd
));
1453 if (pset
->change_lma
!= CHANGE_IGNORE
)
1455 padd
->section
->lma
= pset
->lma_val
;
1457 if (! bfd_set_section_alignment
1458 (obfd
, padd
->section
,
1459 bfd_section_alignment (obfd
, padd
->section
)))
1461 bfd_nonfatal (bfd_get_filename (obfd
));
1469 if (gnu_debuglink_filename
!= NULL
)
1471 gnu_debuglink_section
= bfd_create_gnu_debuglink_section
1472 (obfd
, gnu_debuglink_filename
);
1474 if (gnu_debuglink_section
== NULL
)
1476 bfd_nonfatal (gnu_debuglink_filename
);
1480 /* Special processing for PE format files. We
1481 have no way to distinguish PE from COFF here. */
1482 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
)
1484 bfd_vma debuglink_vma
;
1485 asection
* highest_section
;
1488 /* The PE spec requires that all sections be adjacent and sorted
1489 in ascending order of VMA. It also specifies that debug
1490 sections should be last. This is despite the fact that debug
1491 sections are not loaded into memory and so in theory have no
1494 This means that the debuglink section must be given a non-zero
1495 VMA which makes it contiguous with other debug sections. So
1496 walk the current section list, find the section with the
1497 highest VMA and start the debuglink section after that one. */
1498 for (sec
= obfd
->sections
, highest_section
= NULL
;
1502 && (highest_section
== NULL
1503 || sec
->vma
> highest_section
->vma
))
1504 highest_section
= sec
;
1506 if (highest_section
)
1507 debuglink_vma
= BFD_ALIGN (highest_section
->vma
1508 + highest_section
->size
,
1509 /* FIXME: We ought to be using
1510 COFF_PAGE_SIZE here or maybe
1511 bfd_get_section_alignment() (if it
1512 was set) but since this is for PE
1513 and we know the required alignment
1514 it is easier just to hard code it. */
1517 /* Umm, not sure what to do in this case. */
1518 debuglink_vma
= 0x1000;
1520 bfd_set_section_vma (obfd
, gnu_debuglink_section
, debuglink_vma
);
1524 if (bfd_count_sections (obfd
) == 0)
1526 non_fatal (_("there are no sections to be copied!"));
1530 if (gap_fill_set
|| pad_to_set
)
1535 /* We must fill in gaps between the sections and/or we must pad
1536 the last section to a specified address. We do this by
1537 grabbing a list of the sections, sorting them by VMA, and
1538 increasing the section sizes as required to fill the gaps.
1539 We write out the gap contents below. */
1541 c
= bfd_count_sections (obfd
);
1542 osections
= xmalloc (c
* sizeof (asection
*));
1544 bfd_map_over_sections (obfd
, get_sections
, &set
);
1546 qsort (osections
, c
, sizeof (asection
*), compare_section_lma
);
1548 gaps
= xmalloc (c
* sizeof (bfd_size_type
));
1549 memset (gaps
, 0, c
* sizeof (bfd_size_type
));
1553 for (i
= 0; i
< c
- 1; i
++)
1557 bfd_vma gap_start
, gap_stop
;
1559 flags
= bfd_get_section_flags (obfd
, osections
[i
]);
1560 if ((flags
& SEC_HAS_CONTENTS
) == 0
1561 || (flags
& SEC_LOAD
) == 0)
1564 size
= bfd_section_size (obfd
, osections
[i
]);
1565 gap_start
= bfd_section_lma (obfd
, osections
[i
]) + size
;
1566 gap_stop
= bfd_section_lma (obfd
, osections
[i
+ 1]);
1567 if (gap_start
< gap_stop
)
1569 if (! bfd_set_section_size (obfd
, osections
[i
],
1570 size
+ (gap_stop
- gap_start
)))
1572 non_fatal (_("Can't fill gap after %s: %s"),
1573 bfd_get_section_name (obfd
, osections
[i
]),
1574 bfd_errmsg (bfd_get_error ()));
1578 gaps
[i
] = gap_stop
- gap_start
;
1579 if (max_gap
< gap_stop
- gap_start
)
1580 max_gap
= gap_stop
- gap_start
;
1590 lma
= bfd_section_lma (obfd
, osections
[c
- 1]);
1591 size
= bfd_section_size (obfd
, osections
[c
- 1]);
1592 if (lma
+ size
< pad_to
)
1594 if (! bfd_set_section_size (obfd
, osections
[c
- 1],
1597 non_fatal (_("Can't add padding to %s: %s"),
1598 bfd_get_section_name (obfd
, osections
[c
- 1]),
1599 bfd_errmsg (bfd_get_error ()));
1604 gaps
[c
- 1] = pad_to
- (lma
+ size
);
1605 if (max_gap
< pad_to
- (lma
+ size
))
1606 max_gap
= pad_to
- (lma
+ size
);
1612 /* Symbol filtering must happen after the output sections
1613 have been created, but before their contents are set. */
1615 if (convert_debugging
)
1616 dhandle
= read_debugging_info (ibfd
, isympp
, symcount
);
1618 if (strip_symbols
== STRIP_DEBUG
1619 || strip_symbols
== STRIP_ALL
1620 || strip_symbols
== STRIP_UNNEEDED
1621 || strip_symbols
== STRIP_NONDEBUG
1622 || discard_locals
!= LOCALS_UNDEF
1624 || strip_specific_list
!= NULL
1625 || keep_specific_list
!= NULL
1626 || localize_specific_list
!= NULL
1627 || globalize_specific_list
!= NULL
1628 || keepglobal_specific_list
!= NULL
1629 || weaken_specific_list
!= NULL
1630 || prefix_symbols_string
1633 || convert_debugging
1634 || change_leading_char
1635 || remove_leading_char
1636 || redefine_sym_list
1639 /* Mark symbols used in output relocations so that they
1640 are kept, even if they are local labels or static symbols.
1642 Note we iterate over the input sections examining their
1643 relocations since the relocations for the output sections
1644 haven't been set yet. mark_symbols_used_in_relocations will
1645 ignore input sections which have no corresponding output
1647 if (strip_symbols
!= STRIP_ALL
)
1648 bfd_map_over_sections (ibfd
,
1649 mark_symbols_used_in_relocations
,
1651 osympp
= xmalloc ((symcount
+ 1) * sizeof (asymbol
*));
1652 symcount
= filter_symbols (ibfd
, obfd
, osympp
, isympp
, symcount
);
1655 if (convert_debugging
&& dhandle
!= NULL
)
1657 if (! write_debugging_info (obfd
, dhandle
, &symcount
, &osympp
))
1664 bfd_set_symtab (obfd
, osympp
, symcount
);
1666 /* This has to happen after the symbol table has been set. */
1667 bfd_map_over_sections (ibfd
, copy_section
, obfd
);
1669 if (add_sections
!= NULL
)
1671 struct section_add
*padd
;
1673 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
1675 if (! bfd_set_section_contents (obfd
, padd
->section
, padd
->contents
,
1678 bfd_nonfatal (bfd_get_filename (obfd
));
1684 if (gnu_debuglink_filename
!= NULL
)
1686 if (! bfd_fill_in_gnu_debuglink_section
1687 (obfd
, gnu_debuglink_section
, gnu_debuglink_filename
))
1689 bfd_nonfatal (gnu_debuglink_filename
);
1694 if (gap_fill_set
|| pad_to_set
)
1699 /* Fill in the gaps. */
1702 buf
= xmalloc (max_gap
);
1703 memset (buf
, gap_fill
, max_gap
);
1705 c
= bfd_count_sections (obfd
);
1706 for (i
= 0; i
< c
; i
++)
1714 off
= bfd_section_size (obfd
, osections
[i
]) - left
;
1725 if (! bfd_set_section_contents (obfd
, osections
[i
], buf
,
1728 bfd_nonfatal (bfd_get_filename (obfd
));
1739 /* Do not copy backend data if --extract-symbol is passed; anything
1740 that needs to look at the section contents will fail. */
1744 /* Allow the BFD backend to copy any private data it understands
1745 from the input BFD to the output BFD. This is done last to
1746 permit the routine to look at the filtered symbol table, which is
1747 important for the ECOFF code at least. */
1748 if (bfd_get_flavour (ibfd
) == bfd_target_elf_flavour
1749 && strip_symbols
== STRIP_NONDEBUG
)
1750 /* Do not copy the private data when creating an ELF format
1751 debug info file. We do not want the program headers. */
1753 else if (! bfd_copy_private_bfd_data (ibfd
, obfd
))
1755 non_fatal (_("%s: error copying private BFD data: %s"),
1756 bfd_get_filename (obfd
),
1757 bfd_errmsg (bfd_get_error ()));
1761 /* Switch to the alternate machine code. We have to do this at the
1762 very end, because we only initialize the header when we create
1763 the first section. */
1764 if (use_alt_mach_code
!= 0)
1766 if (! bfd_alt_mach_code (obfd
, use_alt_mach_code
))
1768 non_fatal (_("this target does not support %lu alternative machine codes"),
1770 if (bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
1772 non_fatal (_("treating that number as an absolute e_machine value instead"));
1773 elf_elfheader (obfd
)->e_machine
= use_alt_mach_code
;
1776 non_fatal (_("ignoring the alternative value"));
1783 /* Read each archive element in turn from IBFD, copy the
1784 contents to temp file, and keep the temp file handle.
1785 If 'force_output_target' is TRUE then make sure that
1786 all elements in the new archive are of the type
1790 copy_archive (bfd
*ibfd
, bfd
*obfd
, const char *output_target
,
1791 bfd_boolean force_output_target
)
1795 struct name_list
*next
;
1799 bfd
**ptr
= &obfd
->archive_head
;
1803 /* Make a temp directory to hold the contents. */
1804 dir
= make_tempdir (bfd_get_filename (obfd
));
1806 fatal (_("cannot create tempdir for archive copying (error: %s)"),
1809 obfd
->has_armap
= ibfd
->has_armap
;
1813 this_element
= bfd_openr_next_archived_file (ibfd
, NULL
);
1815 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1816 RETURN_NONFATAL (bfd_get_filename (obfd
));
1818 while (!status
&& this_element
!= NULL
)
1824 int stat_status
= 0;
1825 bfd_boolean
delete = TRUE
;
1827 /* Create an output file for this member. */
1828 output_name
= concat (dir
, "/",
1829 bfd_get_filename (this_element
), (char *) 0);
1831 /* If the file already exists, make another temp dir. */
1832 if (stat (output_name
, &buf
) >= 0)
1834 output_name
= make_tempdir (output_name
);
1835 if (output_name
== NULL
)
1836 fatal (_("cannot create tempdir for archive copying (error: %s)"),
1839 l
= xmalloc (sizeof (struct name_list
));
1840 l
->name
= output_name
;
1844 output_name
= concat (output_name
, "/",
1845 bfd_get_filename (this_element
), (char *) 0);
1850 stat_status
= bfd_stat_arch_elt (this_element
, &buf
);
1852 if (stat_status
!= 0)
1853 non_fatal (_("internal stat error on %s"),
1854 bfd_get_filename (this_element
));
1857 l
= xmalloc (sizeof (struct name_list
));
1858 l
->name
= output_name
;
1863 if (bfd_check_format (this_element
, bfd_object
))
1865 /* PR binutils/3110: Cope with archives
1866 containing multiple target types. */
1867 if (force_output_target
)
1868 output_bfd
= bfd_openw (output_name
, output_target
);
1870 output_bfd
= bfd_openw (output_name
, bfd_get_target (this_element
));
1872 if (output_bfd
== NULL
)
1873 RETURN_NONFATAL (output_name
);
1875 delete = ! copy_object (this_element
, output_bfd
);
1878 || bfd_get_arch (this_element
) != bfd_arch_unknown
)
1880 if (!bfd_close (output_bfd
))
1882 bfd_nonfatal (bfd_get_filename (output_bfd
));
1883 /* Error in new object file. Don't change archive. */
1888 goto copy_unknown_element
;
1892 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1893 bfd_get_archive_filename (this_element
));
1895 output_bfd
= bfd_openw (output_name
, output_target
);
1896 copy_unknown_element
:
1897 delete = !copy_unknown_object (this_element
, output_bfd
);
1898 if (!bfd_close_all_done (output_bfd
))
1900 bfd_nonfatal (bfd_get_filename (output_bfd
));
1901 /* Error in new object file. Don't change archive. */
1908 unlink (output_name
);
1913 if (preserve_dates
&& stat_status
== 0)
1914 set_times (output_name
, &buf
);
1916 /* Open the newly output file and attach to our list. */
1917 output_bfd
= bfd_openr (output_name
, output_target
);
1919 l
->obfd
= output_bfd
;
1922 ptr
= &output_bfd
->next
;
1924 last_element
= this_element
;
1926 this_element
= bfd_openr_next_archived_file (ibfd
, last_element
);
1928 bfd_close (last_element
);
1933 if (!bfd_close (obfd
))
1934 RETURN_NONFATAL (bfd_get_filename (obfd
));
1936 if (!bfd_close (ibfd
))
1937 RETURN_NONFATAL (bfd_get_filename (ibfd
));
1939 /* Delete all the files that we opened. */
1940 for (l
= list
; l
!= NULL
; l
= l
->next
)
1942 if (l
->obfd
== NULL
)
1946 bfd_close (l
->obfd
);
1953 /* The top-level control. */
1956 copy_file (const char *input_filename
, const char *output_filename
,
1957 const char *input_target
, const char *output_target
)
1960 char **obj_matching
;
1961 char **core_matching
;
1963 if (get_file_size (input_filename
) < 1)
1969 /* To allow us to do "strip *" without dying on the first
1970 non-object file, failures are nonfatal. */
1971 ibfd
= bfd_openr (input_filename
, input_target
);
1973 RETURN_NONFATAL (input_filename
);
1975 if (bfd_check_format (ibfd
, bfd_archive
))
1977 bfd_boolean force_output_target
;
1980 /* bfd_get_target does not return the correct value until
1981 bfd_check_format succeeds. */
1982 if (output_target
== NULL
)
1984 output_target
= bfd_get_target (ibfd
);
1985 force_output_target
= FALSE
;
1988 force_output_target
= TRUE
;
1990 obfd
= bfd_openw (output_filename
, output_target
);
1992 RETURN_NONFATAL (output_filename
);
1994 copy_archive (ibfd
, obfd
, output_target
, force_output_target
);
1996 else if (bfd_check_format_matches (ibfd
, bfd_object
, &obj_matching
))
2001 /* bfd_get_target does not return the correct value until
2002 bfd_check_format succeeds. */
2003 if (output_target
== NULL
)
2004 output_target
= bfd_get_target (ibfd
);
2006 obfd
= bfd_openw (output_filename
, output_target
);
2008 RETURN_NONFATAL (output_filename
);
2010 if (! copy_object (ibfd
, obfd
))
2013 if (!bfd_close (obfd
))
2014 RETURN_NONFATAL (output_filename
);
2016 if (!bfd_close (ibfd
))
2017 RETURN_NONFATAL (input_filename
);
2022 bfd_error_type obj_error
= bfd_get_error ();
2023 bfd_error_type core_error
;
2025 if (bfd_check_format_matches (ibfd
, bfd_core
, &core_matching
))
2027 /* This probably can't happen.. */
2028 if (obj_error
== bfd_error_file_ambiguously_recognized
)
2029 free (obj_matching
);
2033 core_error
= bfd_get_error ();
2034 /* Report the object error in preference to the core error. */
2035 if (obj_error
!= core_error
)
2036 bfd_set_error (obj_error
);
2038 bfd_nonfatal (input_filename
);
2040 if (obj_error
== bfd_error_file_ambiguously_recognized
)
2042 list_matching_formats (obj_matching
);
2043 free (obj_matching
);
2045 if (core_error
== bfd_error_file_ambiguously_recognized
)
2047 list_matching_formats (core_matching
);
2048 free (core_matching
);
2055 /* Add a name to the section renaming list. */
2058 add_section_rename (const char * old_name
, const char * new_name
,
2061 section_rename
* rename
;
2063 /* Check for conflicts first. */
2064 for (rename
= section_rename_list
; rename
!= NULL
; rename
= rename
->next
)
2065 if (strcmp (rename
->old_name
, old_name
) == 0)
2067 /* Silently ignore duplicate definitions. */
2068 if (strcmp (rename
->new_name
, new_name
) == 0
2069 && rename
->flags
== flags
)
2072 fatal (_("Multiple renames of section %s"), old_name
);
2075 rename
= xmalloc (sizeof (* rename
));
2077 rename
->old_name
= old_name
;
2078 rename
->new_name
= new_name
;
2079 rename
->flags
= flags
;
2080 rename
->next
= section_rename_list
;
2082 section_rename_list
= rename
;
2085 /* Check the section rename list for a new name of the input section
2086 ISECTION. Return the new name if one is found.
2087 Also set RETURNED_FLAGS to the flags to be used for this section. */
2090 find_section_rename (bfd
* ibfd ATTRIBUTE_UNUSED
, sec_ptr isection
,
2091 flagword
* returned_flags
)
2093 const char * old_name
= bfd_section_name (ibfd
, isection
);
2094 section_rename
* rename
;
2096 /* Default to using the flags of the input section. */
2097 * returned_flags
= bfd_get_section_flags (ibfd
, isection
);
2099 for (rename
= section_rename_list
; rename
!= NULL
; rename
= rename
->next
)
2100 if (strcmp (rename
->old_name
, old_name
) == 0)
2102 if (rename
->flags
!= (flagword
) -1)
2103 * returned_flags
= rename
->flags
;
2105 return rename
->new_name
;
2111 /* Once each of the sections is copied, we may still need to do some
2112 finalization work for private section headers. Do that here. */
2115 setup_bfd_headers (bfd
*ibfd
, bfd
*obfd
)
2119 /* Allow the BFD backend to copy any private data it understands
2120 from the input section to the output section. */
2121 if (! bfd_copy_private_header_data (ibfd
, obfd
))
2123 err
= _("private header data");
2127 /* All went well. */
2131 non_fatal (_("%s: error in %s: %s"),
2132 bfd_get_filename (ibfd
),
2133 err
, bfd_errmsg (bfd_get_error ()));
2137 /* Create a section in OBFD with the same
2138 name and attributes as ISECTION in IBFD. */
2141 setup_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
2143 bfd
*obfd
= obfdarg
;
2144 struct section_list
*p
;
2152 char *prefix
= NULL
;
2154 if (is_strip_section (ibfd
, isection
))
2157 p
= find_section_list (bfd_section_name (ibfd
, isection
), FALSE
);
2161 /* Get the, possibly new, name of the output section. */
2162 name
= find_section_rename (ibfd
, isection
, & flags
);
2164 /* Prefix sections. */
2165 if ((prefix_alloc_sections_string
)
2166 && (bfd_get_section_flags (ibfd
, isection
) & SEC_ALLOC
))
2167 prefix
= prefix_alloc_sections_string
;
2168 else if (prefix_sections_string
)
2169 prefix
= prefix_sections_string
;
2175 n
= xmalloc (strlen (prefix
) + strlen (name
) + 1);
2181 if (p
!= NULL
&& p
->set_flags
)
2182 flags
= p
->flags
| (flags
& (SEC_HAS_CONTENTS
| SEC_RELOC
));
2183 else if (strip_symbols
== STRIP_NONDEBUG
&& (flags
& SEC_ALLOC
) != 0)
2184 flags
&= ~(SEC_HAS_CONTENTS
| SEC_LOAD
);
2186 osection
= bfd_make_section_anyway_with_flags (obfd
, name
, flags
);
2188 if (osection
== NULL
)
2194 if (strip_symbols
== STRIP_NONDEBUG
2195 && obfd
->xvec
->flavour
== bfd_target_elf_flavour
2196 && (flags
& SEC_ALLOC
) != 0
2197 && (p
== NULL
|| !p
->set_flags
))
2198 elf_section_type (osection
) = SHT_NOBITS
;
2200 size
= bfd_section_size (ibfd
, isection
);
2202 size
= (size
+ interleave
- 1) / interleave
;
2203 else if (extract_symbol
)
2205 if (! bfd_set_section_size (obfd
, osection
, size
))
2211 vma
= bfd_section_vma (ibfd
, isection
);
2212 if (p
!= NULL
&& p
->change_vma
== CHANGE_MODIFY
)
2214 else if (p
!= NULL
&& p
->change_vma
== CHANGE_SET
)
2217 vma
+= change_section_address
;
2219 if (! bfd_set_section_vma (obfd
, osection
, extract_symbol
? 0 : vma
))
2225 lma
= isection
->lma
;
2226 if ((p
!= NULL
) && p
->change_lma
!= CHANGE_IGNORE
)
2228 if (p
->change_lma
== CHANGE_MODIFY
)
2230 else if (p
->change_lma
== CHANGE_SET
)
2236 lma
+= change_section_address
;
2238 osection
->lma
= extract_symbol
? 0 : lma
;
2240 /* FIXME: This is probably not enough. If we change the LMA we
2241 may have to recompute the header for the file as well. */
2242 if (!bfd_set_section_alignment (obfd
,
2244 bfd_section_alignment (ibfd
, isection
)))
2246 err
= _("alignment");
2250 /* Copy merge entity size. */
2251 osection
->entsize
= isection
->entsize
;
2253 /* This used to be mangle_section; we do here to avoid using
2254 bfd_get_section_by_name since some formats allow multiple
2255 sections with the same name. */
2256 isection
->output_section
= osection
;
2257 isection
->output_offset
= extract_symbol
? vma
: 0;
2259 /* Do not copy backend data if --extract-symbol is passed; anything
2260 that needs to look at the section contents will fail. */
2264 /* Allow the BFD backend to copy any private data it understands
2265 from the input section to the output section. */
2266 if (bfd_get_flavour (ibfd
) == bfd_target_elf_flavour
2267 && strip_symbols
== STRIP_NONDEBUG
)
2268 /* Do not copy the private data when creating an ELF format
2269 debug info file. We do not want the program headers. */
2271 else if (!bfd_copy_private_section_data (ibfd
, isection
, obfd
, osection
))
2273 err
= _("private data");
2276 else if ((isection
->flags
& SEC_GROUP
) != 0)
2278 asymbol
*gsym
= group_signature (isection
);
2281 gsym
->flags
|= BSF_KEEP
;
2284 /* All went well. */
2288 non_fatal (_("%s: section `%s': error in %s: %s"),
2289 bfd_get_filename (ibfd
),
2290 bfd_section_name (ibfd
, isection
),
2291 err
, bfd_errmsg (bfd_get_error ()));
2295 /* Copy the data of input section ISECTION of IBFD
2296 to an output section with the same name in OBFD.
2297 If stripping then don't copy any relocation info. */
2300 copy_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
2302 bfd
*obfd
= obfdarg
;
2303 struct section_list
*p
;
2311 /* If we have already failed earlier on,
2312 do not keep on generating complaints now. */
2316 if (is_strip_section (ibfd
, isection
))
2319 flags
= bfd_get_section_flags (ibfd
, isection
);
2320 if ((flags
& SEC_GROUP
) != 0)
2323 osection
= isection
->output_section
;
2324 size
= bfd_get_section_size (isection
);
2326 if (size
== 0 || osection
== 0)
2329 p
= find_section_list (bfd_get_section_name (ibfd
, isection
), FALSE
);
2331 /* Core files do not need to be relocated. */
2332 if (bfd_get_format (obfd
) == bfd_core
)
2336 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
2340 /* Do not complain if the target does not support relocations. */
2341 if (relsize
== -1 && bfd_get_error () == bfd_error_invalid_operation
)
2344 RETURN_NONFATAL (bfd_get_filename (ibfd
));
2349 bfd_set_reloc (obfd
, osection
, NULL
, 0);
2352 relpp
= xmalloc (relsize
);
2353 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, isympp
);
2355 RETURN_NONFATAL (bfd_get_filename (ibfd
));
2357 if (strip_symbols
== STRIP_ALL
)
2359 /* Remove relocations which are not in
2360 keep_strip_specific_list. */
2361 arelent
**temp_relpp
;
2362 long temp_relcount
= 0;
2365 temp_relpp
= xmalloc (relsize
);
2366 for (i
= 0; i
< relcount
; i
++)
2367 if (is_specified_symbol (bfd_asymbol_name (*relpp
[i
]->sym_ptr_ptr
),
2368 keep_specific_list
))
2369 temp_relpp
[temp_relcount
++] = relpp
[i
];
2370 relcount
= temp_relcount
;
2375 bfd_set_reloc (obfd
, osection
, relcount
== 0 ? NULL
: relpp
, relcount
);
2383 if (bfd_get_section_flags (ibfd
, isection
) & SEC_HAS_CONTENTS
2384 && bfd_get_section_flags (obfd
, osection
) & SEC_HAS_CONTENTS
)
2386 void *memhunk
= xmalloc (size
);
2388 if (!bfd_get_section_contents (ibfd
, isection
, memhunk
, 0, size
))
2389 RETURN_NONFATAL (bfd_get_filename (ibfd
));
2393 /* Keep only every `copy_byte'th byte in MEMHUNK. */
2394 char *from
= (char *) memhunk
+ copy_byte
;
2396 char *end
= (char *) memhunk
+ size
;
2398 for (; from
< end
; from
+= interleave
)
2401 size
= (size
+ interleave
- 1 - copy_byte
) / interleave
;
2402 osection
->lma
/= interleave
;
2405 if (!bfd_set_section_contents (obfd
, osection
, memhunk
, 0, size
))
2406 RETURN_NONFATAL (bfd_get_filename (obfd
));
2410 else if (p
!= NULL
&& p
->set_flags
&& (p
->flags
& SEC_HAS_CONTENTS
) != 0)
2412 void *memhunk
= xmalloc (size
);
2414 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
2415 flag--they can just remove the section entirely and add it
2416 back again. However, we do permit them to turn on the
2417 SEC_HAS_CONTENTS flag, and take it to mean that the section
2418 contents should be zeroed out. */
2420 memset (memhunk
, 0, size
);
2421 if (! bfd_set_section_contents (obfd
, osection
, memhunk
, 0, size
))
2422 RETURN_NONFATAL (bfd_get_filename (obfd
));
2427 /* Get all the sections. This is used when --gap-fill or --pad-to is
2431 get_sections (bfd
*obfd ATTRIBUTE_UNUSED
, asection
*osection
, void *secppparg
)
2433 asection
***secppp
= secppparg
;
2435 **secppp
= osection
;
2439 /* Sort sections by VMA. This is called via qsort, and is used when
2440 --gap-fill or --pad-to is used. We force non loadable or empty
2441 sections to the front, where they are easier to ignore. */
2444 compare_section_lma (const void *arg1
, const void *arg2
)
2446 const asection
*const *sec1
= arg1
;
2447 const asection
*const *sec2
= arg2
;
2448 flagword flags1
, flags2
;
2450 /* Sort non loadable sections to the front. */
2451 flags1
= (*sec1
)->flags
;
2452 flags2
= (*sec2
)->flags
;
2453 if ((flags1
& SEC_HAS_CONTENTS
) == 0
2454 || (flags1
& SEC_LOAD
) == 0)
2456 if ((flags2
& SEC_HAS_CONTENTS
) != 0
2457 && (flags2
& SEC_LOAD
) != 0)
2462 if ((flags2
& SEC_HAS_CONTENTS
) == 0
2463 || (flags2
& SEC_LOAD
) == 0)
2467 /* Sort sections by LMA. */
2468 if ((*sec1
)->lma
> (*sec2
)->lma
)
2470 else if ((*sec1
)->lma
< (*sec2
)->lma
)
2473 /* Sort sections with the same LMA by size. */
2474 if (bfd_get_section_size (*sec1
) > bfd_get_section_size (*sec2
))
2476 else if (bfd_get_section_size (*sec1
) < bfd_get_section_size (*sec2
))
2482 /* Mark all the symbols which will be used in output relocations with
2483 the BSF_KEEP flag so that those symbols will not be stripped.
2485 Ignore relocations which will not appear in the output file. */
2488 mark_symbols_used_in_relocations (bfd
*ibfd
, sec_ptr isection
, void *symbolsarg
)
2490 asymbol
**symbols
= symbolsarg
;
2495 /* Ignore an input section with no corresponding output section. */
2496 if (isection
->output_section
== NULL
)
2499 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
2502 /* Do not complain if the target does not support relocations. */
2503 if (relsize
== -1 && bfd_get_error () == bfd_error_invalid_operation
)
2505 bfd_fatal (bfd_get_filename (ibfd
));
2511 relpp
= xmalloc (relsize
);
2512 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, symbols
);
2514 bfd_fatal (bfd_get_filename (ibfd
));
2516 /* Examine each symbol used in a relocation. If it's not one of the
2517 special bfd section symbols, then mark it with BSF_KEEP. */
2518 for (i
= 0; i
< relcount
; i
++)
2520 if (*relpp
[i
]->sym_ptr_ptr
!= bfd_com_section_ptr
->symbol
2521 && *relpp
[i
]->sym_ptr_ptr
!= bfd_abs_section_ptr
->symbol
2522 && *relpp
[i
]->sym_ptr_ptr
!= bfd_und_section_ptr
->symbol
)
2523 (*relpp
[i
]->sym_ptr_ptr
)->flags
|= BSF_KEEP
;
2530 /* Write out debugging information. */
2533 write_debugging_info (bfd
*obfd
, void *dhandle
,
2534 long *symcountp ATTRIBUTE_UNUSED
,
2535 asymbol
***symppp ATTRIBUTE_UNUSED
)
2537 if (bfd_get_flavour (obfd
) == bfd_target_ieee_flavour
)
2538 return write_ieee_debugging_info (obfd
, dhandle
);
2540 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
2541 || bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
2543 bfd_byte
*syms
, *strings
;
2544 bfd_size_type symsize
, stringsize
;
2545 asection
*stabsec
, *stabstrsec
;
2548 if (! write_stabs_in_sections_debugging_info (obfd
, dhandle
, &syms
,
2553 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DEBUGGING
;
2554 stabsec
= bfd_make_section_with_flags (obfd
, ".stab", flags
);
2555 stabstrsec
= bfd_make_section_with_flags (obfd
, ".stabstr", flags
);
2557 || stabstrsec
== NULL
2558 || ! bfd_set_section_size (obfd
, stabsec
, symsize
)
2559 || ! bfd_set_section_size (obfd
, stabstrsec
, stringsize
)
2560 || ! bfd_set_section_alignment (obfd
, stabsec
, 2)
2561 || ! bfd_set_section_alignment (obfd
, stabstrsec
, 0))
2563 non_fatal (_("%s: can't create debugging section: %s"),
2564 bfd_get_filename (obfd
),
2565 bfd_errmsg (bfd_get_error ()));
2569 /* We can get away with setting the section contents now because
2570 the next thing the caller is going to do is copy over the
2571 real sections. We may someday have to split the contents
2572 setting out of this function. */
2573 if (! bfd_set_section_contents (obfd
, stabsec
, syms
, 0, symsize
)
2574 || ! bfd_set_section_contents (obfd
, stabstrsec
, strings
, 0,
2577 non_fatal (_("%s: can't set debugging section contents: %s"),
2578 bfd_get_filename (obfd
),
2579 bfd_errmsg (bfd_get_error ()));
2586 non_fatal (_("%s: don't know how to write debugging information for %s"),
2587 bfd_get_filename (obfd
), bfd_get_target (obfd
));
2592 strip_main (int argc
, char *argv
[])
2594 char *input_target
= NULL
;
2595 char *output_target
= NULL
;
2596 bfd_boolean show_version
= FALSE
;
2597 bfd_boolean formats_info
= FALSE
;
2600 struct section_list
*p
;
2601 char *output_file
= NULL
;
2603 while ((c
= getopt_long (argc
, argv
, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
2604 strip_options
, (int *) 0)) != EOF
)
2609 input_target
= optarg
;
2612 output_target
= optarg
;
2615 input_target
= output_target
= optarg
;
2618 p
= find_section_list (optarg
, TRUE
);
2620 sections_removed
= TRUE
;
2623 strip_symbols
= STRIP_ALL
;
2627 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
2628 strip_symbols
= STRIP_DEBUG
;
2630 case OPTION_STRIP_UNNEEDED
:
2631 strip_symbols
= STRIP_UNNEEDED
;
2634 add_specific_symbol (optarg
, &keep_specific_list
);
2637 add_specific_symbol (optarg
, &strip_specific_list
);
2640 output_file
= optarg
;
2643 preserve_dates
= TRUE
;
2646 discard_locals
= LOCALS_ALL
;
2649 discard_locals
= LOCALS_START_L
;
2655 show_version
= TRUE
;
2657 case OPTION_FORMATS_INFO
:
2658 formats_info
= TRUE
;
2660 case OPTION_ONLY_KEEP_DEBUG
:
2661 strip_symbols
= STRIP_NONDEBUG
;
2663 case OPTION_KEEP_FILE_SYMBOLS
:
2664 keep_file_symbols
= 1;
2667 /* We've been given a long option. */
2674 strip_usage (stdout
, 0);
2676 strip_usage (stderr
, 1);
2687 print_version ("strip");
2689 /* Default is to strip all symbols. */
2690 if (strip_symbols
== STRIP_UNDEF
2691 && discard_locals
== LOCALS_UNDEF
2692 && strip_specific_list
== NULL
)
2693 strip_symbols
= STRIP_ALL
;
2695 if (output_target
== NULL
)
2696 output_target
= input_target
;
2700 || (output_file
!= NULL
&& (i
+ 1) < argc
))
2701 strip_usage (stderr
, 1);
2703 for (; i
< argc
; i
++)
2705 int hold_status
= status
;
2706 struct stat statbuf
;
2709 if (get_file_size (argv
[i
]) < 1)
2716 /* No need to check the return value of stat().
2717 It has already been checked in get_file_size(). */
2718 stat (argv
[i
], &statbuf
);
2720 if (output_file
!= NULL
)
2721 tmpname
= output_file
;
2723 tmpname
= make_tempname (argv
[i
]);
2725 if (tmpname
== NULL
)
2727 non_fatal (_("could not create temporary file to hold stripped copy of '%s'"),
2734 copy_file (argv
[i
], tmpname
, input_target
, output_target
);
2738 set_times (tmpname
, &statbuf
);
2739 if (output_file
== NULL
)
2740 smart_rename (tmpname
, argv
[i
], preserve_dates
);
2741 status
= hold_status
;
2744 unlink_if_ordinary (tmpname
);
2745 if (output_file
== NULL
)
2753 copy_main (int argc
, char *argv
[])
2755 char * binary_architecture
= NULL
;
2756 char *input_filename
= NULL
;
2757 char *output_filename
= NULL
;
2758 char *input_target
= NULL
;
2759 char *output_target
= NULL
;
2760 bfd_boolean show_version
= FALSE
;
2761 bfd_boolean change_warn
= TRUE
;
2762 bfd_boolean formats_info
= FALSE
;
2764 struct section_list
*p
;
2765 struct stat statbuf
;
2767 while ((c
= getopt_long (argc
, argv
, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
2768 copy_options
, (int *) 0)) != EOF
)
2773 copy_byte
= atoi (optarg
);
2775 fatal (_("byte number must be non-negative"));
2779 binary_architecture
= optarg
;
2783 interleave
= atoi (optarg
);
2785 fatal (_("interleave must be positive"));
2789 case 's': /* "source" - 'I' is preferred */
2790 input_target
= optarg
;
2794 case 'd': /* "destination" - 'O' is preferred */
2795 output_target
= optarg
;
2799 input_target
= output_target
= optarg
;
2803 p
= find_section_list (optarg
, TRUE
);
2805 fatal (_("%s both copied and removed"), optarg
);
2807 sections_copied
= TRUE
;
2811 p
= find_section_list (optarg
, TRUE
);
2813 fatal (_("%s both copied and removed"), optarg
);
2815 sections_removed
= TRUE
;
2819 strip_symbols
= STRIP_ALL
;
2823 strip_symbols
= STRIP_DEBUG
;
2826 case OPTION_STRIP_UNNEEDED
:
2827 strip_symbols
= STRIP_UNNEEDED
;
2830 case OPTION_ONLY_KEEP_DEBUG
:
2831 strip_symbols
= STRIP_NONDEBUG
;
2834 case OPTION_KEEP_FILE_SYMBOLS
:
2835 keep_file_symbols
= 1;
2838 case OPTION_ADD_GNU_DEBUGLINK
:
2839 gnu_debuglink_filename
= optarg
;
2843 add_specific_symbol (optarg
, &keep_specific_list
);
2847 add_specific_symbol (optarg
, &strip_specific_list
);
2850 case OPTION_STRIP_UNNEEDED_SYMBOL
:
2851 add_specific_symbol (optarg
, &strip_unneeded_list
);
2855 add_specific_symbol (optarg
, &localize_specific_list
);
2858 case OPTION_GLOBALIZE_SYMBOL
:
2859 add_specific_symbol (optarg
, &globalize_specific_list
);
2863 add_specific_symbol (optarg
, &keepglobal_specific_list
);
2867 add_specific_symbol (optarg
, &weaken_specific_list
);
2871 preserve_dates
= TRUE
;
2879 discard_locals
= LOCALS_ALL
;
2883 discard_locals
= LOCALS_START_L
;
2891 show_version
= TRUE
;
2894 case OPTION_FORMATS_INFO
:
2895 formats_info
= TRUE
;
2902 case OPTION_ADD_SECTION
:
2906 struct section_add
*pa
;
2911 s
= strchr (optarg
, '=');
2914 fatal (_("bad format for %s"), "--add-section");
2916 size
= get_file_size (s
+ 1);
2923 pa
= xmalloc (sizeof (struct section_add
));
2926 name
= xmalloc (len
+ 1);
2927 strncpy (name
, optarg
, len
);
2931 pa
->filename
= s
+ 1;
2933 pa
->contents
= xmalloc (size
);
2935 f
= fopen (pa
->filename
, FOPEN_RB
);
2938 fatal (_("cannot open: %s: %s"),
2939 pa
->filename
, strerror (errno
));
2941 if (fread (pa
->contents
, 1, pa
->size
, f
) == 0
2943 fatal (_("%s: fread failed"), pa
->filename
);
2947 pa
->next
= add_sections
;
2952 case OPTION_CHANGE_START
:
2953 change_start
= parse_vma (optarg
, "--change-start");
2956 case OPTION_CHANGE_SECTION_ADDRESS
:
2957 case OPTION_CHANGE_SECTION_LMA
:
2958 case OPTION_CHANGE_SECTION_VMA
:
2963 char *option
= NULL
;
2965 enum change_action what
= CHANGE_IGNORE
;
2969 case OPTION_CHANGE_SECTION_ADDRESS
:
2970 option
= "--change-section-address";
2972 case OPTION_CHANGE_SECTION_LMA
:
2973 option
= "--change-section-lma";
2975 case OPTION_CHANGE_SECTION_VMA
:
2976 option
= "--change-section-vma";
2980 s
= strchr (optarg
, '=');
2983 s
= strchr (optarg
, '+');
2986 s
= strchr (optarg
, '-');
2988 fatal (_("bad format for %s"), option
);
2993 name
= xmalloc (len
+ 1);
2994 strncpy (name
, optarg
, len
);
2997 p
= find_section_list (name
, TRUE
);
2999 val
= parse_vma (s
+ 1, option
);
3003 case '=': what
= CHANGE_SET
; break;
3004 case '-': val
= - val
; /* Drop through. */
3005 case '+': what
= CHANGE_MODIFY
; break;
3010 case OPTION_CHANGE_SECTION_ADDRESS
:
3011 p
->change_vma
= what
;
3015 case OPTION_CHANGE_SECTION_LMA
:
3016 p
->change_lma
= what
;
3020 case OPTION_CHANGE_SECTION_VMA
:
3021 p
->change_vma
= what
;
3028 case OPTION_CHANGE_ADDRESSES
:
3029 change_section_address
= parse_vma (optarg
, "--change-addresses");
3030 change_start
= change_section_address
;
3033 case OPTION_CHANGE_WARNINGS
:
3037 case OPTION_CHANGE_LEADING_CHAR
:
3038 change_leading_char
= TRUE
;
3041 case OPTION_DEBUGGING
:
3042 convert_debugging
= TRUE
;
3045 case OPTION_GAP_FILL
:
3047 bfd_vma gap_fill_vma
;
3049 gap_fill_vma
= parse_vma (optarg
, "--gap-fill");
3050 gap_fill
= (bfd_byte
) gap_fill_vma
;
3051 if ((bfd_vma
) gap_fill
!= gap_fill_vma
)
3055 sprintf_vma (buff
, gap_fill_vma
);
3057 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
3060 gap_fill_set
= TRUE
;
3064 case OPTION_NO_CHANGE_WARNINGS
:
3065 change_warn
= FALSE
;
3069 pad_to
= parse_vma (optarg
, "--pad-to");
3073 case OPTION_REMOVE_LEADING_CHAR
:
3074 remove_leading_char
= TRUE
;
3077 case OPTION_REDEFINE_SYM
:
3079 /* Push this redefinition onto redefine_symbol_list. */
3083 const char *nextarg
;
3084 char *source
, *target
;
3086 s
= strchr (optarg
, '=');
3088 fatal (_("bad format for %s"), "--redefine-sym");
3091 source
= xmalloc (len
+ 1);
3092 strncpy (source
, optarg
, len
);
3096 len
= strlen (nextarg
);
3097 target
= xmalloc (len
+ 1);
3098 strcpy (target
, nextarg
);
3100 redefine_list_append ("--redefine-sym", source
, target
);
3107 case OPTION_REDEFINE_SYMS
:
3108 add_redefine_syms_file (optarg
);
3111 case OPTION_SET_SECTION_FLAGS
:
3117 s
= strchr (optarg
, '=');
3119 fatal (_("bad format for %s"), "--set-section-flags");
3122 name
= xmalloc (len
+ 1);
3123 strncpy (name
, optarg
, len
);
3126 p
= find_section_list (name
, TRUE
);
3128 p
->set_flags
= TRUE
;
3129 p
->flags
= parse_flags (s
+ 1);
3133 case OPTION_RENAME_SECTION
:
3136 const char *eq
, *fl
;
3141 eq
= strchr (optarg
, '=');
3143 fatal (_("bad format for %s"), "--rename-section");
3147 fatal (_("bad format for %s"), "--rename-section");
3149 old_name
= xmalloc (len
+ 1);
3150 strncpy (old_name
, optarg
, len
);
3154 fl
= strchr (eq
, ',');
3157 flags
= parse_flags (fl
+ 1);
3167 fatal (_("bad format for %s"), "--rename-section");
3169 new_name
= xmalloc (len
+ 1);
3170 strncpy (new_name
, eq
, len
);
3173 add_section_rename (old_name
, new_name
, flags
);
3177 case OPTION_SET_START
:
3178 set_start
= parse_vma (optarg
, "--set-start");
3179 set_start_set
= TRUE
;
3182 case OPTION_SREC_LEN
:
3183 Chunk
= parse_vma (optarg
, "--srec-len");
3186 case OPTION_SREC_FORCES3
:
3190 case OPTION_STRIP_SYMBOLS
:
3191 add_specific_symbols (optarg
, &strip_specific_list
);
3194 case OPTION_STRIP_UNNEEDED_SYMBOLS
:
3195 add_specific_symbols (optarg
, &strip_unneeded_list
);
3198 case OPTION_KEEP_SYMBOLS
:
3199 add_specific_symbols (optarg
, &keep_specific_list
);
3202 case OPTION_LOCALIZE_HIDDEN
:
3203 localize_hidden
= TRUE
;
3206 case OPTION_LOCALIZE_SYMBOLS
:
3207 add_specific_symbols (optarg
, &localize_specific_list
);
3210 case OPTION_GLOBALIZE_SYMBOLS
:
3211 add_specific_symbols (optarg
, &globalize_specific_list
);
3214 case OPTION_KEEPGLOBAL_SYMBOLS
:
3215 add_specific_symbols (optarg
, &keepglobal_specific_list
);
3218 case OPTION_WEAKEN_SYMBOLS
:
3219 add_specific_symbols (optarg
, &weaken_specific_list
);
3222 case OPTION_ALT_MACH_CODE
:
3223 use_alt_mach_code
= strtoul (optarg
, NULL
, 0);
3224 if (use_alt_mach_code
== 0)
3225 fatal (_("unable to parse alternative machine code"));
3228 case OPTION_PREFIX_SYMBOLS
:
3229 prefix_symbols_string
= optarg
;
3232 case OPTION_PREFIX_SECTIONS
:
3233 prefix_sections_string
= optarg
;
3236 case OPTION_PREFIX_ALLOC_SECTIONS
:
3237 prefix_alloc_sections_string
= optarg
;
3240 case OPTION_READONLY_TEXT
:
3241 bfd_flags_to_set
|= WP_TEXT
;
3242 bfd_flags_to_clear
&= ~WP_TEXT
;
3245 case OPTION_WRITABLE_TEXT
:
3246 bfd_flags_to_clear
|= WP_TEXT
;
3247 bfd_flags_to_set
&= ~WP_TEXT
;
3251 bfd_flags_to_set
|= D_PAGED
;
3252 bfd_flags_to_clear
&= ~D_PAGED
;
3256 bfd_flags_to_clear
|= D_PAGED
;
3257 bfd_flags_to_set
&= ~D_PAGED
;
3260 case OPTION_EXTRACT_SYMBOL
:
3261 extract_symbol
= TRUE
;
3265 /* We've been given a long option. */
3270 copy_usage (stdout
, 0);
3273 copy_usage (stderr
, 1);
3284 print_version ("objcopy");
3286 if (copy_byte
>= interleave
)
3287 fatal (_("byte number must be less than interleave"));
3289 if (optind
== argc
|| optind
+ 2 < argc
)
3290 copy_usage (stderr
, 1);
3292 input_filename
= argv
[optind
];
3293 if (optind
+ 1 < argc
)
3294 output_filename
= argv
[optind
+ 1];
3296 /* Default is to strip no symbols. */
3297 if (strip_symbols
== STRIP_UNDEF
&& discard_locals
== LOCALS_UNDEF
)
3298 strip_symbols
= STRIP_NONE
;
3300 if (output_target
== NULL
)
3301 output_target
= input_target
;
3303 if (binary_architecture
!= NULL
)
3305 if (input_target
&& strcmp (input_target
, "binary") == 0)
3307 const bfd_arch_info_type
* temp_arch_info
;
3309 temp_arch_info
= bfd_scan_arch (binary_architecture
);
3311 if (temp_arch_info
!= NULL
)
3313 bfd_external_binary_architecture
= temp_arch_info
->arch
;
3314 bfd_external_machine
= temp_arch_info
->mach
;
3317 fatal (_("architecture %s unknown"), binary_architecture
);
3321 non_fatal (_("Warning: input target 'binary' required for binary architecture parameter."));
3322 non_fatal (_(" Argument %s ignored"), binary_architecture
);
3327 if (stat (input_filename
, & statbuf
) < 0)
3328 fatal (_("warning: could not locate '%s'. System error message: %s"),
3329 input_filename
, strerror (errno
));
3331 /* If there is no destination file, or the source and destination files
3332 are the same, then create a temp and rename the result into the input. */
3333 if (output_filename
== NULL
|| strcmp (input_filename
, output_filename
) == 0)
3335 char *tmpname
= make_tempname (input_filename
);
3337 if (tmpname
== NULL
)
3338 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
3339 input_filename
, strerror (errno
));
3341 copy_file (input_filename
, tmpname
, input_target
, output_target
);
3345 set_times (tmpname
, &statbuf
);
3346 smart_rename (tmpname
, input_filename
, preserve_dates
);
3353 copy_file (input_filename
, output_filename
, input_target
, output_target
);
3355 if (status
== 0 && preserve_dates
)
3356 set_times (output_filename
, &statbuf
);
3357 else if (status
!= 0)
3358 unlink_if_ordinary (output_filename
);
3363 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
3367 if (p
->change_vma
!= CHANGE_IGNORE
)
3371 sprintf_vma (buff
, p
->vma_val
);
3373 /* xgettext:c-format */
3374 non_fatal (_("%s %s%c0x%s never used"),
3375 "--change-section-vma",
3377 p
->change_vma
== CHANGE_SET
? '=' : '+',
3381 if (p
->change_lma
!= CHANGE_IGNORE
)
3385 sprintf_vma (buff
, p
->lma_val
);
3387 /* xgettext:c-format */
3388 non_fatal (_("%s %s%c0x%s never used"),
3389 "--change-section-lma",
3391 p
->change_lma
== CHANGE_SET
? '=' : '+',
3402 main (int argc
, char *argv
[])
3404 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
3405 setlocale (LC_MESSAGES
, "");
3407 #if defined (HAVE_SETLOCALE)
3408 setlocale (LC_CTYPE
, "");
3410 bindtextdomain (PACKAGE
, LOCALEDIR
);
3411 textdomain (PACKAGE
);
3413 program_name
= argv
[0];
3414 xmalloc_set_program_name (program_name
);
3416 START_PROGRESS (program_name
, 0);
3418 expandargv (&argc
, &argv
);
3420 strip_symbols
= STRIP_UNDEF
;
3421 discard_locals
= LOCALS_UNDEF
;
3424 set_default_bfd_target ();
3428 int i
= strlen (program_name
);
3429 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3430 /* Drop the .exe suffix, if any. */
3431 if (i
> 4 && FILENAME_CMP (program_name
+ i
- 4, ".exe") == 0)
3434 program_name
[i
] = '\0';
3437 is_strip
= (i
>= 5 && FILENAME_CMP (program_name
+ i
- 5, "strip") == 0);
3441 strip_main (argc
, argv
);
3443 copy_main (argc
, argv
);
3445 END_PROGRESS (program_name
);