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 /* If `reverse_bytes' is nonzero, then reverse the order of every chunk
222 of <reverse_bytes> bytes within each output section. */
223 static int reverse_bytes
= 0;
226 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
227 enum command_line_switch
229 OPTION_ADD_SECTION
=150,
230 OPTION_CHANGE_ADDRESSES
,
231 OPTION_CHANGE_LEADING_CHAR
,
233 OPTION_CHANGE_SECTION_ADDRESS
,
234 OPTION_CHANGE_SECTION_LMA
,
235 OPTION_CHANGE_SECTION_VMA
,
236 OPTION_CHANGE_WARNINGS
,
239 OPTION_NO_CHANGE_WARNINGS
,
241 OPTION_REMOVE_LEADING_CHAR
,
242 OPTION_SET_SECTION_FLAGS
,
244 OPTION_STRIP_UNNEEDED
,
247 OPTION_REDEFINE_SYMS
,
250 OPTION_STRIP_SYMBOLS
,
251 OPTION_STRIP_UNNEEDED_SYMBOL
,
252 OPTION_STRIP_UNNEEDED_SYMBOLS
,
254 OPTION_LOCALIZE_HIDDEN
,
255 OPTION_LOCALIZE_SYMBOLS
,
256 OPTION_GLOBALIZE_SYMBOL
,
257 OPTION_GLOBALIZE_SYMBOLS
,
258 OPTION_KEEPGLOBAL_SYMBOLS
,
259 OPTION_WEAKEN_SYMBOLS
,
260 OPTION_RENAME_SECTION
,
261 OPTION_ALT_MACH_CODE
,
262 OPTION_PREFIX_SYMBOLS
,
263 OPTION_PREFIX_SECTIONS
,
264 OPTION_PREFIX_ALLOC_SECTIONS
,
266 OPTION_ADD_GNU_DEBUGLINK
,
267 OPTION_ONLY_KEEP_DEBUG
,
268 OPTION_KEEP_FILE_SYMBOLS
,
269 OPTION_READONLY_TEXT
,
270 OPTION_WRITABLE_TEXT
,
273 OPTION_EXTRACT_SYMBOL
,
277 /* Options to handle if running as "strip". */
279 static struct option strip_options
[] =
281 {"discard-all", no_argument
, 0, 'x'},
282 {"discard-locals", no_argument
, 0, 'X'},
283 {"format", required_argument
, 0, 'F'}, /* Obsolete */
284 {"help", no_argument
, 0, 'h'},
285 {"info", no_argument
, 0, OPTION_FORMATS_INFO
},
286 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
287 {"input-target", required_argument
, 0, 'I'},
288 {"keep-file-symbols", no_argument
, 0, OPTION_KEEP_FILE_SYMBOLS
},
289 {"keep-symbol", required_argument
, 0, 'K'},
290 {"only-keep-debug", no_argument
, 0, OPTION_ONLY_KEEP_DEBUG
},
291 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
292 {"output-target", required_argument
, 0, 'O'},
293 {"output-file", required_argument
, 0, 'o'},
294 {"preserve-dates", no_argument
, 0, 'p'},
295 {"remove-section", required_argument
, 0, 'R'},
296 {"strip-all", no_argument
, 0, 's'},
297 {"strip-debug", no_argument
, 0, 'S'},
298 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
299 {"strip-symbol", required_argument
, 0, 'N'},
300 {"target", required_argument
, 0, 'F'},
301 {"verbose", no_argument
, 0, 'v'},
302 {"version", no_argument
, 0, 'V'},
303 {"wildcard", no_argument
, 0, 'w'},
304 {0, no_argument
, 0, 0}
307 /* Options to handle if running as "objcopy". */
309 static struct option copy_options
[] =
311 {"add-gnu-debuglink", required_argument
, 0, OPTION_ADD_GNU_DEBUGLINK
},
312 {"add-section", required_argument
, 0, OPTION_ADD_SECTION
},
313 {"adjust-start", required_argument
, 0, OPTION_CHANGE_START
},
314 {"adjust-vma", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
315 {"adjust-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
316 {"adjust-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
317 {"alt-machine-code", required_argument
, 0, OPTION_ALT_MACH_CODE
},
318 {"binary-architecture", required_argument
, 0, 'B'},
319 {"byte", required_argument
, 0, 'b'},
320 {"change-addresses", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
321 {"change-leading-char", no_argument
, 0, OPTION_CHANGE_LEADING_CHAR
},
322 {"change-section-address", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
323 {"change-section-lma", required_argument
, 0, OPTION_CHANGE_SECTION_LMA
},
324 {"change-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_VMA
},
325 {"change-start", required_argument
, 0, OPTION_CHANGE_START
},
326 {"change-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
327 {"debugging", no_argument
, 0, OPTION_DEBUGGING
},
328 {"discard-all", no_argument
, 0, 'x'},
329 {"discard-locals", no_argument
, 0, 'X'},
330 {"extract-symbol", no_argument
, 0, OPTION_EXTRACT_SYMBOL
},
331 {"format", required_argument
, 0, 'F'}, /* Obsolete */
332 {"gap-fill", required_argument
, 0, OPTION_GAP_FILL
},
333 {"globalize-symbol", required_argument
, 0, OPTION_GLOBALIZE_SYMBOL
},
334 {"globalize-symbols", required_argument
, 0, OPTION_GLOBALIZE_SYMBOLS
},
335 {"help", no_argument
, 0, 'h'},
336 {"impure", no_argument
, 0, OPTION_IMPURE
},
337 {"info", no_argument
, 0, OPTION_FORMATS_INFO
},
338 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
339 {"input-target", required_argument
, 0, 'I'},
340 {"interleave", required_argument
, 0, 'i'},
341 {"keep-file-symbols", no_argument
, 0, OPTION_KEEP_FILE_SYMBOLS
},
342 {"keep-global-symbol", required_argument
, 0, 'G'},
343 {"keep-global-symbols", required_argument
, 0, OPTION_KEEPGLOBAL_SYMBOLS
},
344 {"keep-symbol", required_argument
, 0, 'K'},
345 {"keep-symbols", required_argument
, 0, OPTION_KEEP_SYMBOLS
},
346 {"localize-hidden", no_argument
, 0, OPTION_LOCALIZE_HIDDEN
},
347 {"localize-symbol", required_argument
, 0, 'L'},
348 {"localize-symbols", required_argument
, 0, OPTION_LOCALIZE_SYMBOLS
},
349 {"no-adjust-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
350 {"no-change-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
351 {"only-keep-debug", no_argument
, 0, OPTION_ONLY_KEEP_DEBUG
},
352 {"only-section", required_argument
, 0, 'j'},
353 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
354 {"output-target", required_argument
, 0, 'O'},
355 {"pad-to", required_argument
, 0, OPTION_PAD_TO
},
356 {"prefix-symbols", required_argument
, 0, OPTION_PREFIX_SYMBOLS
},
357 {"prefix-sections", required_argument
, 0, OPTION_PREFIX_SECTIONS
},
358 {"prefix-alloc-sections", required_argument
, 0, OPTION_PREFIX_ALLOC_SECTIONS
},
359 {"preserve-dates", no_argument
, 0, 'p'},
360 {"pure", no_argument
, 0, OPTION_PURE
},
361 {"readonly-text", no_argument
, 0, OPTION_READONLY_TEXT
},
362 {"redefine-sym", required_argument
, 0, OPTION_REDEFINE_SYM
},
363 {"redefine-syms", required_argument
, 0, OPTION_REDEFINE_SYMS
},
364 {"remove-leading-char", no_argument
, 0, OPTION_REMOVE_LEADING_CHAR
},
365 {"remove-section", required_argument
, 0, 'R'},
366 {"rename-section", required_argument
, 0, OPTION_RENAME_SECTION
},
367 {"reverse-bytes", required_argument
, 0, OPTION_REVERSE_BYTES
},
368 {"set-section-flags", required_argument
, 0, OPTION_SET_SECTION_FLAGS
},
369 {"set-start", required_argument
, 0, OPTION_SET_START
},
370 {"srec-len", required_argument
, 0, OPTION_SREC_LEN
},
371 {"srec-forceS3", no_argument
, 0, OPTION_SREC_FORCES3
},
372 {"strip-all", no_argument
, 0, 'S'},
373 {"strip-debug", no_argument
, 0, 'g'},
374 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
375 {"strip-unneeded-symbol", required_argument
, 0, OPTION_STRIP_UNNEEDED_SYMBOL
},
376 {"strip-unneeded-symbols", required_argument
, 0, OPTION_STRIP_UNNEEDED_SYMBOLS
},
377 {"strip-symbol", required_argument
, 0, 'N'},
378 {"strip-symbols", required_argument
, 0, OPTION_STRIP_SYMBOLS
},
379 {"target", required_argument
, 0, 'F'},
380 {"verbose", no_argument
, 0, 'v'},
381 {"version", no_argument
, 0, 'V'},
382 {"weaken", no_argument
, 0, OPTION_WEAKEN
},
383 {"weaken-symbol", required_argument
, 0, 'W'},
384 {"weaken-symbols", required_argument
, 0, OPTION_WEAKEN_SYMBOLS
},
385 {"wildcard", no_argument
, 0, 'w'},
386 {"writable-text", no_argument
, 0, OPTION_WRITABLE_TEXT
},
387 {0, no_argument
, 0, 0}
391 extern char *program_name
;
393 /* This flag distinguishes between strip and objcopy:
394 1 means this is 'strip'; 0 means this is 'objcopy'.
395 -1 means if we should use argv[0] to decide. */
398 /* The maximum length of an S record. This variable is declared in srec.c
399 and can be modified by the --srec-len parameter. */
400 extern unsigned int Chunk
;
402 /* Restrict the generation of Srecords to type S3 only.
403 This variable is declare in bfd/srec.c and can be toggled
404 on by the --srec-forceS3 command line switch. */
405 extern bfd_boolean S3Forced
;
407 /* Defined in bfd/binary.c. Used to set architecture and machine of input
409 extern enum bfd_architecture bfd_external_binary_architecture
;
410 extern unsigned long bfd_external_machine
;
412 /* Forward declarations. */
413 static void setup_section (bfd
*, asection
*, void *);
414 static void setup_bfd_headers (bfd
*, bfd
*);
415 static void copy_section (bfd
*, asection
*, void *);
416 static void get_sections (bfd
*, asection
*, void *);
417 static int compare_section_lma (const void *, const void *);
418 static void mark_symbols_used_in_relocations (bfd
*, asection
*, void *);
419 static bfd_boolean
write_debugging_info (bfd
*, void *, long *, asymbol
***);
420 static const char *lookup_sym_redefinition (const char *);
423 copy_usage (FILE *stream
, int exit_status
)
425 fprintf (stream
, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name
);
426 fprintf (stream
, _(" Copies a binary file, possibly transforming it in the process\n"));
427 fprintf (stream
, _(" The options are:\n"));
428 fprintf (stream
, _("\
429 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
430 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
431 -B --binary-architecture <arch> Set arch of output file, when input is binary\n\
432 -F --target <bfdname> Set both input and output format to <bfdname>\n\
433 --debugging Convert debugging information, if possible\n\
434 -p --preserve-dates Copy modified/access timestamps to the output\n\
435 -j --only-section <name> Only copy section <name> into the output\n\
436 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
437 -R --remove-section <name> Remove section <name> from the output\n\
438 -S --strip-all Remove all symbol and relocation information\n\
439 -g --strip-debug Remove all debugging symbols & sections\n\
440 --strip-unneeded Remove all symbols not needed by relocations\n\
441 -N --strip-symbol <name> Do not copy symbol <name>\n\
442 --strip-unneeded-symbol <name>\n\
443 Do not copy symbol <name> unless needed by\n\
445 --only-keep-debug Strip everything but the debug information\n\
446 --extract-symbol Remove section contents but keep symbols\n\
447 -K --keep-symbol <name> Do not strip symbol <name>\n\
448 --keep-file-symbols Do not strip file symbol(s)\n\
449 --localize-hidden Turn all ELF hidden symbols into locals\n\
450 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
451 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
452 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
453 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
454 --weaken Force all global symbols to be marked as weak\n\
455 -w --wildcard Permit wildcard in symbol comparison\n\
456 -x --discard-all Remove all non-global symbols\n\
457 -X --discard-locals Remove any compiler-generated symbols\n\
458 -i --interleave <number> Only copy one out of every <number> bytes\n\
459 -b --byte <num> Select byte <num> in every interleaved block\n\
460 --gap-fill <val> Fill gaps between sections with <val>\n\
461 --pad-to <addr> Pad the last section up to address <addr>\n\
462 --set-start <addr> Set the start address to <addr>\n\
463 {--change-start|--adjust-start} <incr>\n\
464 Add <incr> to the start address\n\
465 {--change-addresses|--adjust-vma} <incr>\n\
466 Add <incr> to LMA, VMA and start addresses\n\
467 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
468 Change LMA and VMA of section <name> by <val>\n\
469 --change-section-lma <name>{=|+|-}<val>\n\
470 Change the LMA of section <name> by <val>\n\
471 --change-section-vma <name>{=|+|-}<val>\n\
472 Change the VMA of section <name> by <val>\n\
473 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
474 Warn if a named section does not exist\n\
475 --set-section-flags <name>=<flags>\n\
476 Set section <name>'s properties to <flags>\n\
477 --add-section <name>=<file> Add section <name> found in <file> to output\n\
478 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
479 --change-leading-char Force output format's leading character style\n\
480 --remove-leading-char Remove leading character from global symbols\n\
481 --reverse-bytes=<num> Reverse <num> bytes at a time, in output sections with content\n\
482 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
483 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
485 --srec-len <number> Restrict the length of generated Srecords\n\
486 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
487 --strip-symbols <file> -N for all symbols listed in <file>\n\
488 --strip-unneeded-symbols <file>\n\
489 --strip-unneeded-symbol for all symbols listed\n\
491 --keep-symbols <file> -K for all symbols listed in <file>\n\
492 --localize-symbols <file> -L for all symbols listed in <file>\n\
493 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
494 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
495 --weaken-symbols <file> -W for all symbols listed in <file>\n\
496 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
497 --writable-text Mark the output text as writable\n\
498 --readonly-text Make the output text write protected\n\
499 --pure Mark the output file as demand paged\n\
500 --impure Mark the output file as impure\n\
501 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
502 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
503 --prefix-alloc-sections <prefix>\n\
504 Add <prefix> to start of every allocatable\n\
506 -v --verbose List all object files modified\n\
507 @<file> Read options from <file>\n\
508 -V --version Display this program's version number\n\
509 -h --help Display this output\n\
510 --info List object formats & architectures supported\n\
512 list_supported_targets (program_name
, stream
);
513 if (REPORT_BUGS_TO
[0] && exit_status
== 0)
514 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
519 strip_usage (FILE *stream
, int exit_status
)
521 fprintf (stream
, _("Usage: %s <option(s)> in-file(s)\n"), program_name
);
522 fprintf (stream
, _(" Removes symbols and sections from files\n"));
523 fprintf (stream
, _(" The options are:\n"));
524 fprintf (stream
, _("\
525 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
526 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
527 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
528 -p --preserve-dates Copy modified/access timestamps to the output\n\
529 -R --remove-section=<name> Remove section <name> from the output\n\
530 -s --strip-all Remove all symbol and relocation information\n\
531 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
532 --strip-unneeded Remove all symbols not needed by relocations\n\
533 --only-keep-debug Strip everything but the debug information\n\
534 -N --strip-symbol=<name> Do not copy symbol <name>\n\
535 -K --keep-symbol=<name> Do not strip symbol <name>\n\
536 --keep-file-symbols Do not strip file symbol(s)\n\
537 -w --wildcard Permit wildcard in symbol comparison\n\
538 -x --discard-all Remove all non-global symbols\n\
539 -X --discard-locals Remove any compiler-generated symbols\n\
540 -v --verbose List all object files modified\n\
541 -V --version Display this program's version number\n\
542 -h --help Display this output\n\
543 --info List object formats & architectures supported\n\
544 -o <file> Place stripped output into <file>\n\
547 list_supported_targets (program_name
, stream
);
548 if (REPORT_BUGS_TO
[0] && exit_status
== 0)
549 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
553 /* Parse section flags into a flagword, with a fatal error if the
554 string can't be parsed. */
557 parse_flags (const char *s
)
567 snext
= strchr (s
, ',');
577 #define PARSE_FLAG(fname,fval) \
578 else if (strncasecmp (fname, s, len) == 0) ret |= fval
579 PARSE_FLAG ("alloc", SEC_ALLOC
);
580 PARSE_FLAG ("load", SEC_LOAD
);
581 PARSE_FLAG ("noload", SEC_NEVER_LOAD
);
582 PARSE_FLAG ("readonly", SEC_READONLY
);
583 PARSE_FLAG ("debug", SEC_DEBUGGING
);
584 PARSE_FLAG ("code", SEC_CODE
);
585 PARSE_FLAG ("data", SEC_DATA
);
586 PARSE_FLAG ("rom", SEC_ROM
);
587 PARSE_FLAG ("share", SEC_COFF_SHARED
);
588 PARSE_FLAG ("contents", SEC_HAS_CONTENTS
);
594 copy
= xmalloc (len
+ 1);
595 strncpy (copy
, s
, len
);
597 non_fatal (_("unrecognized section flag `%s'"), copy
);
598 fatal (_("supported flags: %s"),
599 "alloc, load, noload, readonly, debug, code, data, rom, share, contents");
609 /* Find and optionally add an entry in the change_sections list. */
611 static struct section_list
*
612 find_section_list (const char *name
, bfd_boolean add
)
614 struct section_list
*p
;
616 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
617 if (strcmp (p
->name
, name
) == 0)
623 p
= xmalloc (sizeof (struct section_list
));
628 p
->change_vma
= CHANGE_IGNORE
;
629 p
->change_lma
= CHANGE_IGNORE
;
632 p
->set_flags
= FALSE
;
635 p
->next
= change_sections
;
641 /* Add a symbol to strip_specific_list. */
644 add_specific_symbol (const char *name
, struct symlist
**list
)
646 struct symlist
*tmp_list
;
648 tmp_list
= xmalloc (sizeof (struct symlist
));
649 tmp_list
->name
= name
;
650 tmp_list
->next
= *list
;
654 /* Add symbols listed in `filename' to strip_specific_list. */
656 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
657 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
660 add_specific_symbols (const char *filename
, struct symlist
**list
)
666 unsigned int line_count
;
668 size
= get_file_size (filename
);
675 buffer
= xmalloc (size
+ 2);
676 f
= fopen (filename
, FOPEN_RT
);
678 fatal (_("cannot open '%s': %s"), filename
, strerror (errno
));
680 if (fread (buffer
, 1, size
, f
) == 0 || ferror (f
))
681 fatal (_("%s: fread failed"), filename
);
684 buffer
[size
] = '\n';
685 buffer
[size
+ 1] = '\0';
689 for (line
= buffer
; * line
!= '\0'; line
++)
694 int finished
= FALSE
;
696 for (eol
= line
;; eol
++)
702 /* Cope with \n\r. */
710 /* Cope with \r\n. */
721 /* Line comment, Terminate the line here, in case a
722 name is present and then allow the rest of the
723 loop to find the real end of the line. */
735 /* A name may now exist somewhere between 'line' and 'eol'.
736 Strip off leading whitespace and trailing whitespace,
737 then add it to the list. */
738 for (name
= line
; IS_WHITESPACE (* name
); name
++)
740 for (name_end
= name
;
741 (! IS_WHITESPACE (* name_end
))
742 && (! IS_LINE_TERMINATOR (* name_end
));
746 if (! IS_LINE_TERMINATOR (* name_end
))
750 for (extra
= name_end
+ 1; IS_WHITESPACE (* extra
); extra
++)
753 if (! IS_LINE_TERMINATOR (* extra
))
754 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
755 filename
, line_count
);
761 add_specific_symbol (name
, list
);
763 /* Advance line pointer to end of line. The 'eol ++' in the for
764 loop above will then advance us to the start of the next line. */
770 /* See whether a symbol should be stripped or kept based on
771 strip_specific_list and keep_symbols. */
774 is_specified_symbol (const char *name
, struct symlist
*list
)
776 struct symlist
*tmp_list
;
780 for (tmp_list
= list
; tmp_list
; tmp_list
= tmp_list
->next
)
781 if (*(tmp_list
->name
) != '!')
783 if (!fnmatch (tmp_list
->name
, name
, 0))
788 if (fnmatch (tmp_list
->name
+ 1, name
, 0))
794 for (tmp_list
= list
; tmp_list
; tmp_list
= tmp_list
->next
)
795 if (strcmp (name
, tmp_list
->name
) == 0)
802 /* Return a pointer to the symbol used as a signature for GROUP. */
805 group_signature (asection
*group
)
807 bfd
*abfd
= group
->owner
;
808 Elf_Internal_Shdr
*ghdr
;
810 if (bfd_get_flavour (abfd
) != bfd_target_elf_flavour
)
813 ghdr
= &elf_section_data (group
)->this_hdr
;
814 if (ghdr
->sh_link
< elf_numsections (abfd
))
816 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
817 Elf_Internal_Shdr
*symhdr
= elf_elfsections (abfd
) [ghdr
->sh_link
];
819 if (symhdr
->sh_type
== SHT_SYMTAB
820 && ghdr
->sh_info
< symhdr
->sh_size
/ bed
->s
->sizeof_sym
)
821 return isympp
[ghdr
->sh_info
- 1];
826 /* See if a section is being removed. */
829 is_strip_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
)
831 if (sections_removed
|| sections_copied
)
833 struct section_list
*p
;
835 p
= find_section_list (bfd_get_section_name (abfd
, sec
), FALSE
);
837 if (sections_removed
&& p
!= NULL
&& p
->remove
)
839 if (sections_copied
&& (p
== NULL
|| ! p
->copy
))
843 if ((bfd_get_section_flags (abfd
, sec
) & SEC_DEBUGGING
) != 0)
845 if (strip_symbols
== STRIP_DEBUG
846 || strip_symbols
== STRIP_UNNEEDED
847 || strip_symbols
== STRIP_ALL
848 || discard_locals
== LOCALS_ALL
849 || convert_debugging
)
852 if (strip_symbols
== STRIP_NONDEBUG
)
856 if ((bfd_get_section_flags (abfd
, sec
) & SEC_GROUP
) != 0)
862 Group sections look like debugging sections but they are not.
863 (They have a non-zero size but they are not ALLOCated). */
864 if (strip_symbols
== STRIP_NONDEBUG
)
868 If we are going to strip the group signature symbol, then
869 strip the group section too. */
870 gsym
= group_signature (sec
);
875 if ((strip_symbols
== STRIP_ALL
876 && !is_specified_symbol (gname
, keep_specific_list
))
877 || is_specified_symbol (gname
, strip_specific_list
))
884 /* Return true if SYM is a hidden symbol. */
887 is_hidden_symbol (asymbol
*sym
)
889 elf_symbol_type
*elf_sym
;
891 elf_sym
= elf_symbol_from (sym
->the_bfd
, sym
);
893 switch (ELF_ST_VISIBILITY (elf_sym
->internal_elf_sym
.st_other
))
902 /* Choose which symbol entries to copy; put the result in OSYMS.
903 We don't copy in place, because that confuses the relocs.
904 Return the number of symbols to print. */
907 filter_symbols (bfd
*abfd
, bfd
*obfd
, asymbol
**osyms
,
908 asymbol
**isyms
, long symcount
)
910 asymbol
**from
= isyms
, **to
= osyms
;
911 long src_count
= 0, dst_count
= 0;
912 int relocatable
= (abfd
->flags
& (HAS_RELOC
| EXEC_P
| DYNAMIC
))
915 for (; src_count
< symcount
; src_count
++)
917 asymbol
*sym
= from
[src_count
];
918 flagword flags
= sym
->flags
;
919 char *name
= (char *) bfd_asymbol_name (sym
);
921 bfd_boolean undefined
;
922 bfd_boolean rem_leading_char
;
923 bfd_boolean add_leading_char
;
925 undefined
= bfd_is_und_section (bfd_get_section (sym
));
927 if (redefine_sym_list
)
929 char *old_name
, *new_name
;
931 old_name
= (char *) bfd_asymbol_name (sym
);
932 new_name
= (char *) lookup_sym_redefinition (old_name
);
933 bfd_asymbol_name (sym
) = new_name
;
937 /* Check if we will remove the current leading character. */
939 (name
[0] == bfd_get_symbol_leading_char (abfd
))
940 && (change_leading_char
941 || (remove_leading_char
942 && ((flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0
944 || bfd_is_com_section (bfd_get_section (sym
)))));
946 /* Check if we will add a new leading character. */
949 && (bfd_get_symbol_leading_char (obfd
) != '\0')
950 && (bfd_get_symbol_leading_char (abfd
) == '\0'
951 || (name
[0] == bfd_get_symbol_leading_char (abfd
)));
953 /* Short circuit for change_leading_char if we can do it in-place. */
954 if (rem_leading_char
&& add_leading_char
&& !prefix_symbols_string
)
956 name
[0] = bfd_get_symbol_leading_char (obfd
);
957 bfd_asymbol_name (sym
) = name
;
958 rem_leading_char
= FALSE
;
959 add_leading_char
= FALSE
;
962 /* Remove leading char. */
963 if (rem_leading_char
)
964 bfd_asymbol_name (sym
) = ++name
;
966 /* Add new leading char and/or prefix. */
967 if (add_leading_char
|| prefix_symbols_string
)
971 ptr
= n
= xmalloc (1 + strlen (prefix_symbols_string
)
972 + strlen (name
) + 1);
973 if (add_leading_char
)
974 *ptr
++ = bfd_get_symbol_leading_char (obfd
);
976 if (prefix_symbols_string
)
978 strcpy (ptr
, prefix_symbols_string
);
979 ptr
+= strlen (prefix_symbols_string
);
983 bfd_asymbol_name (sym
) = n
;
987 if (strip_symbols
== STRIP_ALL
)
989 else if ((flags
& BSF_KEEP
) != 0 /* Used in relocation. */
990 || ((flags
& BSF_SECTION_SYM
) != 0
991 && ((*bfd_get_section (sym
)->symbol_ptr_ptr
)->flags
994 else if (relocatable
/* Relocatable file. */
995 && (flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0)
997 else if (bfd_decode_symclass (sym
) == 'I')
998 /* Global symbols in $idata sections need to be retained
999 even if relocatable is FALSE. External users of the
1000 library containing the $idata section may reference these
1003 else if ((flags
& BSF_GLOBAL
) != 0 /* Global symbol. */
1004 || (flags
& BSF_WEAK
) != 0
1006 || bfd_is_com_section (bfd_get_section (sym
)))
1007 keep
= strip_symbols
!= STRIP_UNNEEDED
;
1008 else if ((flags
& BSF_DEBUGGING
) != 0) /* Debugging symbol. */
1009 keep
= (strip_symbols
!= STRIP_DEBUG
1010 && strip_symbols
!= STRIP_UNNEEDED
1011 && ! convert_debugging
);
1012 else if (bfd_coff_get_comdat_section (abfd
, bfd_get_section (sym
)))
1013 /* COMDAT sections store special information in local
1014 symbols, so we cannot risk stripping any of them. */
1016 else /* Local symbol. */
1017 keep
= (strip_symbols
!= STRIP_UNNEEDED
1018 && (discard_locals
!= LOCALS_ALL
1019 && (discard_locals
!= LOCALS_START_L
1020 || ! bfd_is_local_label (abfd
, sym
))));
1022 if (keep
&& is_specified_symbol (name
, strip_specific_list
))
1025 && !(flags
& BSF_KEEP
)
1026 && is_specified_symbol (name
, strip_unneeded_list
))
1029 && ((keep_file_symbols
&& (flags
& BSF_FILE
))
1030 || is_specified_symbol (name
, keep_specific_list
)))
1032 if (keep
&& is_strip_section (abfd
, bfd_get_section (sym
)))
1037 if ((flags
& BSF_GLOBAL
) != 0
1038 && (weaken
|| is_specified_symbol (name
, weaken_specific_list
)))
1040 sym
->flags
&= ~ BSF_GLOBAL
;
1041 sym
->flags
|= BSF_WEAK
;
1045 && (flags
& (BSF_GLOBAL
| BSF_WEAK
))
1046 && (is_specified_symbol (name
, localize_specific_list
)
1047 || (keepglobal_specific_list
!= NULL
1048 && ! is_specified_symbol (name
, keepglobal_specific_list
))
1049 || (localize_hidden
&& is_hidden_symbol (sym
))))
1051 sym
->flags
&= ~ (BSF_GLOBAL
| BSF_WEAK
);
1052 sym
->flags
|= BSF_LOCAL
;
1056 && (flags
& BSF_LOCAL
)
1057 && is_specified_symbol (name
, globalize_specific_list
))
1059 sym
->flags
&= ~ BSF_LOCAL
;
1060 sym
->flags
|= BSF_GLOBAL
;
1063 to
[dst_count
++] = sym
;
1067 to
[dst_count
] = NULL
;
1072 /* Find the redefined name of symbol SOURCE. */
1075 lookup_sym_redefinition (const char *source
)
1077 struct redefine_node
*list
;
1079 for (list
= redefine_sym_list
; list
!= NULL
; list
= list
->next
)
1080 if (strcmp (source
, list
->source
) == 0)
1081 return list
->target
;
1086 /* Add a node to a symbol redefine list. */
1089 redefine_list_append (const char *cause
, const char *source
, const char *target
)
1091 struct redefine_node
**p
;
1092 struct redefine_node
*list
;
1093 struct redefine_node
*new_node
;
1095 for (p
= &redefine_sym_list
; (list
= *p
) != NULL
; p
= &list
->next
)
1097 if (strcmp (source
, list
->source
) == 0)
1098 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1101 if (strcmp (target
, list
->target
) == 0)
1102 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1106 new_node
= xmalloc (sizeof (struct redefine_node
));
1108 new_node
->source
= strdup (source
);
1109 new_node
->target
= strdup (target
);
1110 new_node
->next
= NULL
;
1115 /* Handle the --redefine-syms option. Read lines containing "old new"
1116 from the file, and add them to the symbol redefine list. */
1119 add_redefine_syms_file (const char *filename
)
1128 file
= fopen (filename
, "r");
1130 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1131 filename
, strerror (errno
));
1134 buf
= xmalloc (bufsize
);
1142 /* Collect the input symbol name. */
1143 while (! IS_WHITESPACE (c
) && ! IS_LINE_TERMINATOR (c
) && c
!= EOF
)
1151 buf
= xrealloc (buf
, bufsize
);
1159 /* Eat white space between the symbol names. */
1160 while (IS_WHITESPACE (c
))
1162 if (c
== '#' || IS_LINE_TERMINATOR (c
))
1167 /* Collect the output symbol name. */
1169 while (! IS_WHITESPACE (c
) && ! IS_LINE_TERMINATOR (c
) && c
!= EOF
)
1177 buf
= xrealloc (buf
, bufsize
);
1185 /* Eat white space at end of line. */
1186 while (! IS_LINE_TERMINATOR(c
) && c
!= EOF
&& IS_WHITESPACE (c
))
1191 if ((c
== '\r' && (c
= getc (file
)) == '\n')
1192 || c
== '\n' || c
== EOF
)
1195 /* Append the redefinition to the list. */
1197 redefine_list_append (filename
, &buf
[0], &buf
[outsym_off
]);
1208 fatal (_("%s:%d: garbage found at end of line"), filename
, lineno
);
1210 if (len
!= 0 && (outsym_off
== 0 || outsym_off
== len
))
1211 fatal (_("%s:%d: missing new symbol name"), filename
, lineno
);
1214 /* Eat the rest of the line and finish it. */
1215 while (c
!= '\n' && c
!= EOF
)
1221 fatal (_("%s:%d: premature end of file"), filename
, lineno
);
1226 /* Copy unkown object file IBFD onto OBFD.
1227 Returns TRUE upon success, FALSE otherwise. */
1230 copy_unknown_object (bfd
*ibfd
, bfd
*obfd
)
1238 if (bfd_stat_arch_elt (ibfd
, &buf
) != 0)
1240 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1247 non_fatal (_("stat returns negative size for `%s'"),
1248 bfd_get_archive_filename (ibfd
));
1252 if (bfd_seek (ibfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1254 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1259 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1260 bfd_get_archive_filename (ibfd
), bfd_get_filename (obfd
));
1262 cbuf
= xmalloc (BUFSIZE
);
1264 while (ncopied
< size
)
1266 tocopy
= size
- ncopied
;
1267 if (tocopy
> BUFSIZE
)
1270 if (bfd_bread (cbuf
, (bfd_size_type
) tocopy
, ibfd
)
1271 != (bfd_size_type
) tocopy
)
1273 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1278 if (bfd_bwrite (cbuf
, (bfd_size_type
) tocopy
, obfd
)
1279 != (bfd_size_type
) tocopy
)
1281 bfd_nonfatal (bfd_get_filename (obfd
));
1289 chmod (bfd_get_filename (obfd
), buf
.st_mode
);
1294 /* Copy object file IBFD onto OBFD.
1295 Returns TRUE upon success, FALSE otherwise. */
1298 copy_object (bfd
*ibfd
, bfd
*obfd
)
1302 asection
**osections
= NULL
;
1303 asection
*gnu_debuglink_section
= NULL
;
1304 bfd_size_type
*gaps
= NULL
;
1305 bfd_size_type max_gap
= 0;
1308 enum bfd_architecture iarch
;
1311 if (ibfd
->xvec
->byteorder
!= obfd
->xvec
->byteorder
1312 && ibfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
1313 && obfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
)
1314 fatal (_("Unable to change endianness of input file(s)"));
1316 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1318 bfd_nonfatal (bfd_get_filename (obfd
));
1323 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
1324 bfd_get_archive_filename (ibfd
), bfd_get_target (ibfd
),
1325 bfd_get_filename (obfd
), bfd_get_target (obfd
));
1334 start
= bfd_get_start_address (ibfd
);
1335 start
+= change_start
;
1338 /* Neither the start address nor the flags
1339 need to be set for a core file. */
1340 if (bfd_get_format (obfd
) != bfd_core
)
1344 flags
= bfd_get_file_flags (ibfd
);
1345 flags
|= bfd_flags_to_set
;
1346 flags
&= ~bfd_flags_to_clear
;
1347 flags
&= bfd_applicable_file_flags (obfd
);
1349 if (!bfd_set_start_address (obfd
, start
)
1350 || !bfd_set_file_flags (obfd
, flags
))
1352 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1357 /* Copy architecture of input file to output file. */
1358 iarch
= bfd_get_arch (ibfd
);
1359 imach
= bfd_get_mach (ibfd
);
1360 if (!bfd_set_arch_mach (obfd
, iarch
, imach
)
1361 && (ibfd
->target_defaulted
1362 || bfd_get_arch (ibfd
) != bfd_get_arch (obfd
)))
1364 if (bfd_get_arch (ibfd
) == bfd_arch_unknown
)
1365 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1366 bfd_get_archive_filename (ibfd
));
1368 non_fatal (_("Warning: Output file cannot represent architecture `%s'"),
1369 bfd_printable_arch_mach (bfd_get_arch (ibfd
),
1370 bfd_get_mach (ibfd
)));
1374 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1376 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1383 if (osympp
!= isympp
)
1389 symsize
= bfd_get_symtab_upper_bound (ibfd
);
1392 bfd_nonfatal (bfd_get_archive_filename (ibfd
));
1396 osympp
= isympp
= xmalloc (symsize
);
1397 symcount
= bfd_canonicalize_symtab (ibfd
, isympp
);
1400 bfd_nonfatal (bfd_get_filename (ibfd
));
1404 /* BFD mandates that all output sections be created and sizes set before
1405 any output is done. Thus, we traverse all sections multiple times. */
1406 bfd_map_over_sections (ibfd
, setup_section
, obfd
);
1408 setup_bfd_headers (ibfd
, obfd
);
1410 if (add_sections
!= NULL
)
1412 struct section_add
*padd
;
1413 struct section_list
*pset
;
1415 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
1419 pset
= find_section_list (padd
->name
, FALSE
);
1423 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DATA
;
1424 if (pset
!= NULL
&& pset
->set_flags
)
1425 flags
= pset
->flags
| SEC_HAS_CONTENTS
;
1427 /* bfd_make_section_with_flags() does not return very helpful
1428 error codes, so check for the most likely user error first. */
1429 if (bfd_get_section_by_name (obfd
, padd
->name
))
1431 non_fatal (_("can't add section '%s' - it already exists!"), padd
->name
);
1436 padd
->section
= bfd_make_section_with_flags (obfd
, padd
->name
, flags
);
1437 if (padd
->section
== NULL
)
1439 non_fatal (_("can't create section `%s': %s"),
1440 padd
->name
, bfd_errmsg (bfd_get_error ()));
1445 if (! bfd_set_section_size (obfd
, padd
->section
, padd
->size
))
1447 bfd_nonfatal (bfd_get_filename (obfd
));
1453 if (pset
->change_vma
!= CHANGE_IGNORE
)
1454 if (! bfd_set_section_vma (obfd
, padd
->section
,
1457 bfd_nonfatal (bfd_get_filename (obfd
));
1461 if (pset
->change_lma
!= CHANGE_IGNORE
)
1463 padd
->section
->lma
= pset
->lma_val
;
1465 if (! bfd_set_section_alignment
1466 (obfd
, padd
->section
,
1467 bfd_section_alignment (obfd
, padd
->section
)))
1469 bfd_nonfatal (bfd_get_filename (obfd
));
1477 if (gnu_debuglink_filename
!= NULL
)
1479 gnu_debuglink_section
= bfd_create_gnu_debuglink_section
1480 (obfd
, gnu_debuglink_filename
);
1482 if (gnu_debuglink_section
== NULL
)
1484 bfd_nonfatal (gnu_debuglink_filename
);
1488 /* Special processing for PE format files. We
1489 have no way to distinguish PE from COFF here. */
1490 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
)
1492 bfd_vma debuglink_vma
;
1493 asection
* highest_section
;
1496 /* The PE spec requires that all sections be adjacent and sorted
1497 in ascending order of VMA. It also specifies that debug
1498 sections should be last. This is despite the fact that debug
1499 sections are not loaded into memory and so in theory have no
1502 This means that the debuglink section must be given a non-zero
1503 VMA which makes it contiguous with other debug sections. So
1504 walk the current section list, find the section with the
1505 highest VMA and start the debuglink section after that one. */
1506 for (sec
= obfd
->sections
, highest_section
= NULL
;
1510 && (highest_section
== NULL
1511 || sec
->vma
> highest_section
->vma
))
1512 highest_section
= sec
;
1514 if (highest_section
)
1515 debuglink_vma
= BFD_ALIGN (highest_section
->vma
1516 + highest_section
->size
,
1517 /* FIXME: We ought to be using
1518 COFF_PAGE_SIZE here or maybe
1519 bfd_get_section_alignment() (if it
1520 was set) but since this is for PE
1521 and we know the required alignment
1522 it is easier just to hard code it. */
1525 /* Umm, not sure what to do in this case. */
1526 debuglink_vma
= 0x1000;
1528 bfd_set_section_vma (obfd
, gnu_debuglink_section
, debuglink_vma
);
1532 if (bfd_count_sections (obfd
) != 0
1533 && (gap_fill_set
|| pad_to_set
))
1538 /* We must fill in gaps between the sections and/or we must pad
1539 the last section to a specified address. We do this by
1540 grabbing a list of the sections, sorting them by VMA, and
1541 increasing the section sizes as required to fill the gaps.
1542 We write out the gap contents below. */
1544 c
= bfd_count_sections (obfd
);
1545 osections
= xmalloc (c
* sizeof (asection
*));
1547 bfd_map_over_sections (obfd
, get_sections
, &set
);
1549 qsort (osections
, c
, sizeof (asection
*), compare_section_lma
);
1551 gaps
= xmalloc (c
* sizeof (bfd_size_type
));
1552 memset (gaps
, 0, c
* sizeof (bfd_size_type
));
1556 for (i
= 0; i
< c
- 1; i
++)
1560 bfd_vma gap_start
, gap_stop
;
1562 flags
= bfd_get_section_flags (obfd
, osections
[i
]);
1563 if ((flags
& SEC_HAS_CONTENTS
) == 0
1564 || (flags
& SEC_LOAD
) == 0)
1567 size
= bfd_section_size (obfd
, osections
[i
]);
1568 gap_start
= bfd_section_lma (obfd
, osections
[i
]) + size
;
1569 gap_stop
= bfd_section_lma (obfd
, osections
[i
+ 1]);
1570 if (gap_start
< gap_stop
)
1572 if (! bfd_set_section_size (obfd
, osections
[i
],
1573 size
+ (gap_stop
- gap_start
)))
1575 non_fatal (_("Can't fill gap after %s: %s"),
1576 bfd_get_section_name (obfd
, osections
[i
]),
1577 bfd_errmsg (bfd_get_error ()));
1581 gaps
[i
] = gap_stop
- gap_start
;
1582 if (max_gap
< gap_stop
- gap_start
)
1583 max_gap
= gap_stop
- gap_start
;
1593 lma
= bfd_section_lma (obfd
, osections
[c
- 1]);
1594 size
= bfd_section_size (obfd
, osections
[c
- 1]);
1595 if (lma
+ size
< pad_to
)
1597 if (! bfd_set_section_size (obfd
, osections
[c
- 1],
1600 non_fatal (_("Can't add padding to %s: %s"),
1601 bfd_get_section_name (obfd
, osections
[c
- 1]),
1602 bfd_errmsg (bfd_get_error ()));
1607 gaps
[c
- 1] = pad_to
- (lma
+ size
);
1608 if (max_gap
< pad_to
- (lma
+ size
))
1609 max_gap
= pad_to
- (lma
+ size
);
1615 /* Symbol filtering must happen after the output sections
1616 have been created, but before their contents are set. */
1618 if (convert_debugging
)
1619 dhandle
= read_debugging_info (ibfd
, isympp
, symcount
);
1621 if (strip_symbols
== STRIP_DEBUG
1622 || strip_symbols
== STRIP_ALL
1623 || strip_symbols
== STRIP_UNNEEDED
1624 || strip_symbols
== STRIP_NONDEBUG
1625 || discard_locals
!= LOCALS_UNDEF
1627 || strip_specific_list
!= NULL
1628 || keep_specific_list
!= NULL
1629 || localize_specific_list
!= NULL
1630 || globalize_specific_list
!= NULL
1631 || keepglobal_specific_list
!= NULL
1632 || weaken_specific_list
!= NULL
1633 || prefix_symbols_string
1636 || convert_debugging
1637 || change_leading_char
1638 || remove_leading_char
1639 || redefine_sym_list
1642 /* Mark symbols used in output relocations so that they
1643 are kept, even if they are local labels or static symbols.
1645 Note we iterate over the input sections examining their
1646 relocations since the relocations for the output sections
1647 haven't been set yet. mark_symbols_used_in_relocations will
1648 ignore input sections which have no corresponding output
1650 if (strip_symbols
!= STRIP_ALL
)
1651 bfd_map_over_sections (ibfd
,
1652 mark_symbols_used_in_relocations
,
1654 osympp
= xmalloc ((symcount
+ 1) * sizeof (asymbol
*));
1655 symcount
= filter_symbols (ibfd
, obfd
, osympp
, isympp
, symcount
);
1658 if (convert_debugging
&& dhandle
!= NULL
)
1660 if (! write_debugging_info (obfd
, dhandle
, &symcount
, &osympp
))
1667 bfd_set_symtab (obfd
, osympp
, symcount
);
1669 /* This has to happen after the symbol table has been set. */
1670 bfd_map_over_sections (ibfd
, copy_section
, obfd
);
1672 if (add_sections
!= NULL
)
1674 struct section_add
*padd
;
1676 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
1678 if (! bfd_set_section_contents (obfd
, padd
->section
, padd
->contents
,
1681 bfd_nonfatal (bfd_get_filename (obfd
));
1687 if (gnu_debuglink_filename
!= NULL
)
1689 if (! bfd_fill_in_gnu_debuglink_section
1690 (obfd
, gnu_debuglink_section
, gnu_debuglink_filename
))
1692 bfd_nonfatal (gnu_debuglink_filename
);
1697 if (gap_fill_set
|| pad_to_set
)
1702 /* Fill in the gaps. */
1705 buf
= xmalloc (max_gap
);
1706 memset (buf
, gap_fill
, max_gap
);
1708 c
= bfd_count_sections (obfd
);
1709 for (i
= 0; i
< c
; i
++)
1717 off
= bfd_section_size (obfd
, osections
[i
]) - left
;
1728 if (! bfd_set_section_contents (obfd
, osections
[i
], buf
,
1731 bfd_nonfatal (bfd_get_filename (obfd
));
1742 /* Do not copy backend data if --extract-symbol is passed; anything
1743 that needs to look at the section contents will fail. */
1747 /* Allow the BFD backend to copy any private data it understands
1748 from the input BFD to the output BFD. This is done last to
1749 permit the routine to look at the filtered symbol table, which is
1750 important for the ECOFF code at least. */
1751 if (bfd_get_flavour (ibfd
) == bfd_target_elf_flavour
1752 && strip_symbols
== STRIP_NONDEBUG
)
1753 /* Do not copy the private data when creating an ELF format
1754 debug info file. We do not want the program headers. */
1756 else if (! bfd_copy_private_bfd_data (ibfd
, obfd
))
1758 non_fatal (_("%s: error copying private BFD data: %s"),
1759 bfd_get_filename (obfd
),
1760 bfd_errmsg (bfd_get_error ()));
1764 /* Switch to the alternate machine code. We have to do this at the
1765 very end, because we only initialize the header when we create
1766 the first section. */
1767 if (use_alt_mach_code
!= 0)
1769 if (! bfd_alt_mach_code (obfd
, use_alt_mach_code
))
1771 non_fatal (_("this target does not support %lu alternative machine codes"),
1773 if (bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
1775 non_fatal (_("treating that number as an absolute e_machine value instead"));
1776 elf_elfheader (obfd
)->e_machine
= use_alt_mach_code
;
1779 non_fatal (_("ignoring the alternative value"));
1786 /* Read each archive element in turn from IBFD, copy the
1787 contents to temp file, and keep the temp file handle.
1788 If 'force_output_target' is TRUE then make sure that
1789 all elements in the new archive are of the type
1793 copy_archive (bfd
*ibfd
, bfd
*obfd
, const char *output_target
,
1794 bfd_boolean force_output_target
)
1798 struct name_list
*next
;
1802 bfd
**ptr
= &obfd
->archive_head
;
1806 /* Make a temp directory to hold the contents. */
1807 dir
= make_tempdir (bfd_get_filename (obfd
));
1809 fatal (_("cannot create tempdir for archive copying (error: %s)"),
1812 obfd
->has_armap
= ibfd
->has_armap
;
1816 this_element
= bfd_openr_next_archived_file (ibfd
, NULL
);
1818 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1819 RETURN_NONFATAL (bfd_get_filename (obfd
));
1821 while (!status
&& this_element
!= NULL
)
1827 int stat_status
= 0;
1828 bfd_boolean
delete = TRUE
;
1830 /* Create an output file for this member. */
1831 output_name
= concat (dir
, "/",
1832 bfd_get_filename (this_element
), (char *) 0);
1834 /* If the file already exists, make another temp dir. */
1835 if (stat (output_name
, &buf
) >= 0)
1837 output_name
= make_tempdir (output_name
);
1838 if (output_name
== NULL
)
1839 fatal (_("cannot create tempdir for archive copying (error: %s)"),
1842 l
= xmalloc (sizeof (struct name_list
));
1843 l
->name
= output_name
;
1847 output_name
= concat (output_name
, "/",
1848 bfd_get_filename (this_element
), (char *) 0);
1853 stat_status
= bfd_stat_arch_elt (this_element
, &buf
);
1855 if (stat_status
!= 0)
1856 non_fatal (_("internal stat error on %s"),
1857 bfd_get_filename (this_element
));
1860 l
= xmalloc (sizeof (struct name_list
));
1861 l
->name
= output_name
;
1866 if (bfd_check_format (this_element
, bfd_object
))
1868 /* PR binutils/3110: Cope with archives
1869 containing multiple target types. */
1870 if (force_output_target
)
1871 output_bfd
= bfd_openw (output_name
, output_target
);
1873 output_bfd
= bfd_openw (output_name
, bfd_get_target (this_element
));
1875 if (output_bfd
== NULL
)
1876 RETURN_NONFATAL (output_name
);
1878 delete = ! copy_object (this_element
, output_bfd
);
1881 || bfd_get_arch (this_element
) != bfd_arch_unknown
)
1883 if (!bfd_close (output_bfd
))
1885 bfd_nonfatal (bfd_get_filename (output_bfd
));
1886 /* Error in new object file. Don't change archive. */
1891 goto copy_unknown_element
;
1895 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1896 bfd_get_archive_filename (this_element
));
1898 output_bfd
= bfd_openw (output_name
, output_target
);
1899 copy_unknown_element
:
1900 delete = !copy_unknown_object (this_element
, output_bfd
);
1901 if (!bfd_close_all_done (output_bfd
))
1903 bfd_nonfatal (bfd_get_filename (output_bfd
));
1904 /* Error in new object file. Don't change archive. */
1911 unlink (output_name
);
1916 if (preserve_dates
&& stat_status
== 0)
1917 set_times (output_name
, &buf
);
1919 /* Open the newly output file and attach to our list. */
1920 output_bfd
= bfd_openr (output_name
, output_target
);
1922 l
->obfd
= output_bfd
;
1925 ptr
= &output_bfd
->next
;
1927 last_element
= this_element
;
1929 this_element
= bfd_openr_next_archived_file (ibfd
, last_element
);
1931 bfd_close (last_element
);
1936 if (!bfd_close (obfd
))
1937 RETURN_NONFATAL (bfd_get_filename (obfd
));
1939 if (!bfd_close (ibfd
))
1940 RETURN_NONFATAL (bfd_get_filename (ibfd
));
1942 /* Delete all the files that we opened. */
1943 for (l
= list
; l
!= NULL
; l
= l
->next
)
1945 if (l
->obfd
== NULL
)
1949 bfd_close (l
->obfd
);
1956 /* The top-level control. */
1959 copy_file (const char *input_filename
, const char *output_filename
,
1960 const char *input_target
, const char *output_target
)
1963 char **obj_matching
;
1964 char **core_matching
;
1966 if (get_file_size (input_filename
) < 1)
1972 /* To allow us to do "strip *" without dying on the first
1973 non-object file, failures are nonfatal. */
1974 ibfd
= bfd_openr (input_filename
, input_target
);
1976 RETURN_NONFATAL (input_filename
);
1978 if (bfd_check_format (ibfd
, bfd_archive
))
1980 bfd_boolean force_output_target
;
1983 /* bfd_get_target does not return the correct value until
1984 bfd_check_format succeeds. */
1985 if (output_target
== NULL
)
1987 output_target
= bfd_get_target (ibfd
);
1988 force_output_target
= FALSE
;
1991 force_output_target
= TRUE
;
1993 obfd
= bfd_openw (output_filename
, output_target
);
1995 RETURN_NONFATAL (output_filename
);
1997 copy_archive (ibfd
, obfd
, output_target
, force_output_target
);
1999 else if (bfd_check_format_matches (ibfd
, bfd_object
, &obj_matching
))
2004 /* bfd_get_target does not return the correct value until
2005 bfd_check_format succeeds. */
2006 if (output_target
== NULL
)
2007 output_target
= bfd_get_target (ibfd
);
2009 obfd
= bfd_openw (output_filename
, output_target
);
2011 RETURN_NONFATAL (output_filename
);
2013 if (! copy_object (ibfd
, obfd
))
2016 if (!bfd_close (obfd
))
2017 RETURN_NONFATAL (output_filename
);
2019 if (!bfd_close (ibfd
))
2020 RETURN_NONFATAL (input_filename
);
2025 bfd_error_type obj_error
= bfd_get_error ();
2026 bfd_error_type core_error
;
2028 if (bfd_check_format_matches (ibfd
, bfd_core
, &core_matching
))
2030 /* This probably can't happen.. */
2031 if (obj_error
== bfd_error_file_ambiguously_recognized
)
2032 free (obj_matching
);
2036 core_error
= bfd_get_error ();
2037 /* Report the object error in preference to the core error. */
2038 if (obj_error
!= core_error
)
2039 bfd_set_error (obj_error
);
2041 bfd_nonfatal (input_filename
);
2043 if (obj_error
== bfd_error_file_ambiguously_recognized
)
2045 list_matching_formats (obj_matching
);
2046 free (obj_matching
);
2048 if (core_error
== bfd_error_file_ambiguously_recognized
)
2050 list_matching_formats (core_matching
);
2051 free (core_matching
);
2058 /* Add a name to the section renaming list. */
2061 add_section_rename (const char * old_name
, const char * new_name
,
2064 section_rename
* rename
;
2066 /* Check for conflicts first. */
2067 for (rename
= section_rename_list
; rename
!= NULL
; rename
= rename
->next
)
2068 if (strcmp (rename
->old_name
, old_name
) == 0)
2070 /* Silently ignore duplicate definitions. */
2071 if (strcmp (rename
->new_name
, new_name
) == 0
2072 && rename
->flags
== flags
)
2075 fatal (_("Multiple renames of section %s"), old_name
);
2078 rename
= xmalloc (sizeof (* rename
));
2080 rename
->old_name
= old_name
;
2081 rename
->new_name
= new_name
;
2082 rename
->flags
= flags
;
2083 rename
->next
= section_rename_list
;
2085 section_rename_list
= rename
;
2088 /* Check the section rename list for a new name of the input section
2089 ISECTION. Return the new name if one is found.
2090 Also set RETURNED_FLAGS to the flags to be used for this section. */
2093 find_section_rename (bfd
* ibfd ATTRIBUTE_UNUSED
, sec_ptr isection
,
2094 flagword
* returned_flags
)
2096 const char * old_name
= bfd_section_name (ibfd
, isection
);
2097 section_rename
* rename
;
2099 /* Default to using the flags of the input section. */
2100 * returned_flags
= bfd_get_section_flags (ibfd
, isection
);
2102 for (rename
= section_rename_list
; rename
!= NULL
; rename
= rename
->next
)
2103 if (strcmp (rename
->old_name
, old_name
) == 0)
2105 if (rename
->flags
!= (flagword
) -1)
2106 * returned_flags
= rename
->flags
;
2108 return rename
->new_name
;
2114 /* Once each of the sections is copied, we may still need to do some
2115 finalization work for private section headers. Do that here. */
2118 setup_bfd_headers (bfd
*ibfd
, bfd
*obfd
)
2122 /* Allow the BFD backend to copy any private data it understands
2123 from the input section to the output section. */
2124 if (! bfd_copy_private_header_data (ibfd
, obfd
))
2126 err
= _("private header data");
2130 /* All went well. */
2134 non_fatal (_("%s: error in %s: %s"),
2135 bfd_get_filename (ibfd
),
2136 err
, bfd_errmsg (bfd_get_error ()));
2140 /* Create a section in OBFD with the same
2141 name and attributes as ISECTION in IBFD. */
2144 setup_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
2146 bfd
*obfd
= obfdarg
;
2147 struct section_list
*p
;
2155 char *prefix
= NULL
;
2157 if (is_strip_section (ibfd
, isection
))
2160 p
= find_section_list (bfd_section_name (ibfd
, isection
), FALSE
);
2164 /* Get the, possibly new, name of the output section. */
2165 name
= find_section_rename (ibfd
, isection
, & flags
);
2167 /* Prefix sections. */
2168 if ((prefix_alloc_sections_string
)
2169 && (bfd_get_section_flags (ibfd
, isection
) & SEC_ALLOC
))
2170 prefix
= prefix_alloc_sections_string
;
2171 else if (prefix_sections_string
)
2172 prefix
= prefix_sections_string
;
2178 n
= xmalloc (strlen (prefix
) + strlen (name
) + 1);
2184 if (p
!= NULL
&& p
->set_flags
)
2185 flags
= p
->flags
| (flags
& (SEC_HAS_CONTENTS
| SEC_RELOC
));
2186 else if (strip_symbols
== STRIP_NONDEBUG
&& (flags
& SEC_ALLOC
) != 0)
2187 flags
&= ~(SEC_HAS_CONTENTS
| SEC_LOAD
);
2189 osection
= bfd_make_section_anyway_with_flags (obfd
, name
, flags
);
2191 if (osection
== NULL
)
2197 if (strip_symbols
== STRIP_NONDEBUG
2198 && obfd
->xvec
->flavour
== bfd_target_elf_flavour
2199 && (flags
& SEC_ALLOC
) != 0
2200 && (p
== NULL
|| !p
->set_flags
))
2201 elf_section_type (osection
) = SHT_NOBITS
;
2203 size
= bfd_section_size (ibfd
, isection
);
2205 size
= (size
+ interleave
- 1) / interleave
;
2206 else if (extract_symbol
)
2208 if (! bfd_set_section_size (obfd
, osection
, size
))
2214 vma
= bfd_section_vma (ibfd
, isection
);
2215 if (p
!= NULL
&& p
->change_vma
== CHANGE_MODIFY
)
2217 else if (p
!= NULL
&& p
->change_vma
== CHANGE_SET
)
2220 vma
+= change_section_address
;
2222 if (! bfd_set_section_vma (obfd
, osection
, extract_symbol
? 0 : vma
))
2228 lma
= isection
->lma
;
2229 if ((p
!= NULL
) && p
->change_lma
!= CHANGE_IGNORE
)
2231 if (p
->change_lma
== CHANGE_MODIFY
)
2233 else if (p
->change_lma
== CHANGE_SET
)
2239 lma
+= change_section_address
;
2241 osection
->lma
= extract_symbol
? 0 : lma
;
2243 /* FIXME: This is probably not enough. If we change the LMA we
2244 may have to recompute the header for the file as well. */
2245 if (!bfd_set_section_alignment (obfd
,
2247 bfd_section_alignment (ibfd
, isection
)))
2249 err
= _("alignment");
2253 /* Copy merge entity size. */
2254 osection
->entsize
= isection
->entsize
;
2256 /* This used to be mangle_section; we do here to avoid using
2257 bfd_get_section_by_name since some formats allow multiple
2258 sections with the same name. */
2259 isection
->output_section
= osection
;
2260 isection
->output_offset
= extract_symbol
? vma
: 0;
2262 /* Do not copy backend data if --extract-symbol is passed; anything
2263 that needs to look at the section contents will fail. */
2267 /* Allow the BFD backend to copy any private data it understands
2268 from the input section to the output section. */
2269 if (bfd_get_flavour (ibfd
) == bfd_target_elf_flavour
2270 && strip_symbols
== STRIP_NONDEBUG
)
2271 /* Do not copy the private data when creating an ELF format
2272 debug info file. We do not want the program headers. */
2274 else if (!bfd_copy_private_section_data (ibfd
, isection
, obfd
, osection
))
2276 err
= _("private data");
2279 else if ((isection
->flags
& SEC_GROUP
) != 0)
2281 asymbol
*gsym
= group_signature (isection
);
2284 gsym
->flags
|= BSF_KEEP
;
2287 /* All went well. */
2291 non_fatal (_("%s: section `%s': error in %s: %s"),
2292 bfd_get_filename (ibfd
),
2293 bfd_section_name (ibfd
, isection
),
2294 err
, bfd_errmsg (bfd_get_error ()));
2298 /* Copy the data of input section ISECTION of IBFD
2299 to an output section with the same name in OBFD.
2300 If stripping then don't copy any relocation info. */
2303 copy_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
2305 bfd
*obfd
= obfdarg
;
2306 struct section_list
*p
;
2314 /* If we have already failed earlier on,
2315 do not keep on generating complaints now. */
2319 if (is_strip_section (ibfd
, isection
))
2322 flags
= bfd_get_section_flags (ibfd
, isection
);
2323 if ((flags
& SEC_GROUP
) != 0)
2326 osection
= isection
->output_section
;
2327 size
= bfd_get_section_size (isection
);
2329 if (size
== 0 || osection
== 0)
2332 p
= find_section_list (bfd_get_section_name (ibfd
, isection
), FALSE
);
2334 /* Core files do not need to be relocated. */
2335 if (bfd_get_format (obfd
) == bfd_core
)
2339 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
2343 /* Do not complain if the target does not support relocations. */
2344 if (relsize
== -1 && bfd_get_error () == bfd_error_invalid_operation
)
2347 RETURN_NONFATAL (bfd_get_filename (ibfd
));
2352 bfd_set_reloc (obfd
, osection
, NULL
, 0);
2355 relpp
= xmalloc (relsize
);
2356 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, isympp
);
2358 RETURN_NONFATAL (bfd_get_filename (ibfd
));
2360 if (strip_symbols
== STRIP_ALL
)
2362 /* Remove relocations which are not in
2363 keep_strip_specific_list. */
2364 arelent
**temp_relpp
;
2365 long temp_relcount
= 0;
2368 temp_relpp
= xmalloc (relsize
);
2369 for (i
= 0; i
< relcount
; i
++)
2370 if (is_specified_symbol (bfd_asymbol_name (*relpp
[i
]->sym_ptr_ptr
),
2371 keep_specific_list
))
2372 temp_relpp
[temp_relcount
++] = relpp
[i
];
2373 relcount
= temp_relcount
;
2378 bfd_set_reloc (obfd
, osection
, relcount
== 0 ? NULL
: relpp
, relcount
);
2386 if (bfd_get_section_flags (ibfd
, isection
) & SEC_HAS_CONTENTS
2387 && bfd_get_section_flags (obfd
, osection
) & SEC_HAS_CONTENTS
)
2389 void *memhunk
= xmalloc (size
);
2391 if (!bfd_get_section_contents (ibfd
, isection
, memhunk
, 0, size
))
2392 RETURN_NONFATAL (bfd_get_filename (ibfd
));
2396 /* We don't handle leftover bytes (too many possible behaviors,
2397 and we don't know what the user wants). The section length
2398 must be a multiple of the number of bytes to swap. */
2399 if ((size
% reverse_bytes
) == 0)
2404 for (i
= 0; i
< size
; i
+= reverse_bytes
)
2405 for (j
= 0; j
< (unsigned long)(reverse_bytes
/ 2); j
++)
2407 bfd_byte
*m
= (bfd_byte
*) memhunk
;
2410 m
[i
+ j
] = m
[(i
+ reverse_bytes
) - (j
+ 1)];
2411 m
[(i
+ reverse_bytes
) - (j
+ 1)] = b
;
2415 /* User must pad the section up in order to do this. */
2416 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
2417 bfd_section_name (ibfd
, isection
), reverse_bytes
);
2422 /* Keep only every `copy_byte'th byte in MEMHUNK. */
2423 char *from
= (char *) memhunk
+ copy_byte
;
2425 char *end
= (char *) memhunk
+ size
;
2427 for (; from
< end
; from
+= interleave
)
2430 size
= (size
+ interleave
- 1 - copy_byte
) / interleave
;
2431 osection
->lma
/= interleave
;
2434 if (!bfd_set_section_contents (obfd
, osection
, memhunk
, 0, size
))
2435 RETURN_NONFATAL (bfd_get_filename (obfd
));
2439 else if (p
!= NULL
&& p
->set_flags
&& (p
->flags
& SEC_HAS_CONTENTS
) != 0)
2441 void *memhunk
= xmalloc (size
);
2443 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
2444 flag--they can just remove the section entirely and add it
2445 back again. However, we do permit them to turn on the
2446 SEC_HAS_CONTENTS flag, and take it to mean that the section
2447 contents should be zeroed out. */
2449 memset (memhunk
, 0, size
);
2450 if (! bfd_set_section_contents (obfd
, osection
, memhunk
, 0, size
))
2451 RETURN_NONFATAL (bfd_get_filename (obfd
));
2456 /* Get all the sections. This is used when --gap-fill or --pad-to is
2460 get_sections (bfd
*obfd ATTRIBUTE_UNUSED
, asection
*osection
, void *secppparg
)
2462 asection
***secppp
= secppparg
;
2464 **secppp
= osection
;
2468 /* Sort sections by VMA. This is called via qsort, and is used when
2469 --gap-fill or --pad-to is used. We force non loadable or empty
2470 sections to the front, where they are easier to ignore. */
2473 compare_section_lma (const void *arg1
, const void *arg2
)
2475 const asection
*const *sec1
= arg1
;
2476 const asection
*const *sec2
= arg2
;
2477 flagword flags1
, flags2
;
2479 /* Sort non loadable sections to the front. */
2480 flags1
= (*sec1
)->flags
;
2481 flags2
= (*sec2
)->flags
;
2482 if ((flags1
& SEC_HAS_CONTENTS
) == 0
2483 || (flags1
& SEC_LOAD
) == 0)
2485 if ((flags2
& SEC_HAS_CONTENTS
) != 0
2486 && (flags2
& SEC_LOAD
) != 0)
2491 if ((flags2
& SEC_HAS_CONTENTS
) == 0
2492 || (flags2
& SEC_LOAD
) == 0)
2496 /* Sort sections by LMA. */
2497 if ((*sec1
)->lma
> (*sec2
)->lma
)
2499 else if ((*sec1
)->lma
< (*sec2
)->lma
)
2502 /* Sort sections with the same LMA by size. */
2503 if (bfd_get_section_size (*sec1
) > bfd_get_section_size (*sec2
))
2505 else if (bfd_get_section_size (*sec1
) < bfd_get_section_size (*sec2
))
2511 /* Mark all the symbols which will be used in output relocations with
2512 the BSF_KEEP flag so that those symbols will not be stripped.
2514 Ignore relocations which will not appear in the output file. */
2517 mark_symbols_used_in_relocations (bfd
*ibfd
, sec_ptr isection
, void *symbolsarg
)
2519 asymbol
**symbols
= symbolsarg
;
2524 /* Ignore an input section with no corresponding output section. */
2525 if (isection
->output_section
== NULL
)
2528 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
2531 /* Do not complain if the target does not support relocations. */
2532 if (relsize
== -1 && bfd_get_error () == bfd_error_invalid_operation
)
2534 bfd_fatal (bfd_get_filename (ibfd
));
2540 relpp
= xmalloc (relsize
);
2541 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, symbols
);
2543 bfd_fatal (bfd_get_filename (ibfd
));
2545 /* Examine each symbol used in a relocation. If it's not one of the
2546 special bfd section symbols, then mark it with BSF_KEEP. */
2547 for (i
= 0; i
< relcount
; i
++)
2549 if (*relpp
[i
]->sym_ptr_ptr
!= bfd_com_section_ptr
->symbol
2550 && *relpp
[i
]->sym_ptr_ptr
!= bfd_abs_section_ptr
->symbol
2551 && *relpp
[i
]->sym_ptr_ptr
!= bfd_und_section_ptr
->symbol
)
2552 (*relpp
[i
]->sym_ptr_ptr
)->flags
|= BSF_KEEP
;
2559 /* Write out debugging information. */
2562 write_debugging_info (bfd
*obfd
, void *dhandle
,
2563 long *symcountp ATTRIBUTE_UNUSED
,
2564 asymbol
***symppp ATTRIBUTE_UNUSED
)
2566 if (bfd_get_flavour (obfd
) == bfd_target_ieee_flavour
)
2567 return write_ieee_debugging_info (obfd
, dhandle
);
2569 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
2570 || bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
2572 bfd_byte
*syms
, *strings
;
2573 bfd_size_type symsize
, stringsize
;
2574 asection
*stabsec
, *stabstrsec
;
2577 if (! write_stabs_in_sections_debugging_info (obfd
, dhandle
, &syms
,
2582 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DEBUGGING
;
2583 stabsec
= bfd_make_section_with_flags (obfd
, ".stab", flags
);
2584 stabstrsec
= bfd_make_section_with_flags (obfd
, ".stabstr", flags
);
2586 || stabstrsec
== NULL
2587 || ! bfd_set_section_size (obfd
, stabsec
, symsize
)
2588 || ! bfd_set_section_size (obfd
, stabstrsec
, stringsize
)
2589 || ! bfd_set_section_alignment (obfd
, stabsec
, 2)
2590 || ! bfd_set_section_alignment (obfd
, stabstrsec
, 0))
2592 non_fatal (_("%s: can't create debugging section: %s"),
2593 bfd_get_filename (obfd
),
2594 bfd_errmsg (bfd_get_error ()));
2598 /* We can get away with setting the section contents now because
2599 the next thing the caller is going to do is copy over the
2600 real sections. We may someday have to split the contents
2601 setting out of this function. */
2602 if (! bfd_set_section_contents (obfd
, stabsec
, syms
, 0, symsize
)
2603 || ! bfd_set_section_contents (obfd
, stabstrsec
, strings
, 0,
2606 non_fatal (_("%s: can't set debugging section contents: %s"),
2607 bfd_get_filename (obfd
),
2608 bfd_errmsg (bfd_get_error ()));
2615 non_fatal (_("%s: don't know how to write debugging information for %s"),
2616 bfd_get_filename (obfd
), bfd_get_target (obfd
));
2621 strip_main (int argc
, char *argv
[])
2623 char *input_target
= NULL
;
2624 char *output_target
= NULL
;
2625 bfd_boolean show_version
= FALSE
;
2626 bfd_boolean formats_info
= FALSE
;
2629 struct section_list
*p
;
2630 char *output_file
= NULL
;
2632 while ((c
= getopt_long (argc
, argv
, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
2633 strip_options
, (int *) 0)) != EOF
)
2638 input_target
= optarg
;
2641 output_target
= optarg
;
2644 input_target
= output_target
= optarg
;
2647 p
= find_section_list (optarg
, TRUE
);
2649 sections_removed
= TRUE
;
2652 strip_symbols
= STRIP_ALL
;
2656 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
2657 strip_symbols
= STRIP_DEBUG
;
2659 case OPTION_STRIP_UNNEEDED
:
2660 strip_symbols
= STRIP_UNNEEDED
;
2663 add_specific_symbol (optarg
, &keep_specific_list
);
2666 add_specific_symbol (optarg
, &strip_specific_list
);
2669 output_file
= optarg
;
2672 preserve_dates
= TRUE
;
2675 discard_locals
= LOCALS_ALL
;
2678 discard_locals
= LOCALS_START_L
;
2684 show_version
= TRUE
;
2686 case OPTION_FORMATS_INFO
:
2687 formats_info
= TRUE
;
2689 case OPTION_ONLY_KEEP_DEBUG
:
2690 strip_symbols
= STRIP_NONDEBUG
;
2692 case OPTION_KEEP_FILE_SYMBOLS
:
2693 keep_file_symbols
= 1;
2696 /* We've been given a long option. */
2703 strip_usage (stdout
, 0);
2705 strip_usage (stderr
, 1);
2716 print_version ("strip");
2718 /* Default is to strip all symbols. */
2719 if (strip_symbols
== STRIP_UNDEF
2720 && discard_locals
== LOCALS_UNDEF
2721 && strip_specific_list
== NULL
)
2722 strip_symbols
= STRIP_ALL
;
2724 if (output_target
== NULL
)
2725 output_target
= input_target
;
2729 || (output_file
!= NULL
&& (i
+ 1) < argc
))
2730 strip_usage (stderr
, 1);
2732 for (; i
< argc
; i
++)
2734 int hold_status
= status
;
2735 struct stat statbuf
;
2738 if (get_file_size (argv
[i
]) < 1)
2745 /* No need to check the return value of stat().
2746 It has already been checked in get_file_size(). */
2747 stat (argv
[i
], &statbuf
);
2749 if (output_file
!= NULL
)
2750 tmpname
= output_file
;
2752 tmpname
= make_tempname (argv
[i
]);
2754 if (tmpname
== NULL
)
2756 non_fatal (_("could not create temporary file to hold stripped copy of '%s'"),
2763 copy_file (argv
[i
], tmpname
, input_target
, output_target
);
2767 set_times (tmpname
, &statbuf
);
2768 if (output_file
== NULL
)
2769 smart_rename (tmpname
, argv
[i
], preserve_dates
);
2770 status
= hold_status
;
2773 unlink_if_ordinary (tmpname
);
2774 if (output_file
== NULL
)
2782 copy_main (int argc
, char *argv
[])
2784 char * binary_architecture
= NULL
;
2785 char *input_filename
= NULL
;
2786 char *output_filename
= NULL
;
2787 char *input_target
= NULL
;
2788 char *output_target
= NULL
;
2789 bfd_boolean show_version
= FALSE
;
2790 bfd_boolean change_warn
= TRUE
;
2791 bfd_boolean formats_info
= FALSE
;
2793 struct section_list
*p
;
2794 struct stat statbuf
;
2796 while ((c
= getopt_long (argc
, argv
, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
2797 copy_options
, (int *) 0)) != EOF
)
2802 copy_byte
= atoi (optarg
);
2804 fatal (_("byte number must be non-negative"));
2808 binary_architecture
= optarg
;
2812 interleave
= atoi (optarg
);
2814 fatal (_("interleave must be positive"));
2818 case 's': /* "source" - 'I' is preferred */
2819 input_target
= optarg
;
2823 case 'd': /* "destination" - 'O' is preferred */
2824 output_target
= optarg
;
2828 input_target
= output_target
= optarg
;
2832 p
= find_section_list (optarg
, TRUE
);
2834 fatal (_("%s both copied and removed"), optarg
);
2836 sections_copied
= TRUE
;
2840 p
= find_section_list (optarg
, TRUE
);
2842 fatal (_("%s both copied and removed"), optarg
);
2844 sections_removed
= TRUE
;
2848 strip_symbols
= STRIP_ALL
;
2852 strip_symbols
= STRIP_DEBUG
;
2855 case OPTION_STRIP_UNNEEDED
:
2856 strip_symbols
= STRIP_UNNEEDED
;
2859 case OPTION_ONLY_KEEP_DEBUG
:
2860 strip_symbols
= STRIP_NONDEBUG
;
2863 case OPTION_KEEP_FILE_SYMBOLS
:
2864 keep_file_symbols
= 1;
2867 case OPTION_ADD_GNU_DEBUGLINK
:
2868 gnu_debuglink_filename
= optarg
;
2872 add_specific_symbol (optarg
, &keep_specific_list
);
2876 add_specific_symbol (optarg
, &strip_specific_list
);
2879 case OPTION_STRIP_UNNEEDED_SYMBOL
:
2880 add_specific_symbol (optarg
, &strip_unneeded_list
);
2884 add_specific_symbol (optarg
, &localize_specific_list
);
2887 case OPTION_GLOBALIZE_SYMBOL
:
2888 add_specific_symbol (optarg
, &globalize_specific_list
);
2892 add_specific_symbol (optarg
, &keepglobal_specific_list
);
2896 add_specific_symbol (optarg
, &weaken_specific_list
);
2900 preserve_dates
= TRUE
;
2908 discard_locals
= LOCALS_ALL
;
2912 discard_locals
= LOCALS_START_L
;
2920 show_version
= TRUE
;
2923 case OPTION_FORMATS_INFO
:
2924 formats_info
= TRUE
;
2931 case OPTION_ADD_SECTION
:
2935 struct section_add
*pa
;
2940 s
= strchr (optarg
, '=');
2943 fatal (_("bad format for %s"), "--add-section");
2945 size
= get_file_size (s
+ 1);
2952 pa
= xmalloc (sizeof (struct section_add
));
2955 name
= xmalloc (len
+ 1);
2956 strncpy (name
, optarg
, len
);
2960 pa
->filename
= s
+ 1;
2962 pa
->contents
= xmalloc (size
);
2964 f
= fopen (pa
->filename
, FOPEN_RB
);
2967 fatal (_("cannot open: %s: %s"),
2968 pa
->filename
, strerror (errno
));
2970 if (fread (pa
->contents
, 1, pa
->size
, f
) == 0
2972 fatal (_("%s: fread failed"), pa
->filename
);
2976 pa
->next
= add_sections
;
2981 case OPTION_CHANGE_START
:
2982 change_start
= parse_vma (optarg
, "--change-start");
2985 case OPTION_CHANGE_SECTION_ADDRESS
:
2986 case OPTION_CHANGE_SECTION_LMA
:
2987 case OPTION_CHANGE_SECTION_VMA
:
2992 char *option
= NULL
;
2994 enum change_action what
= CHANGE_IGNORE
;
2998 case OPTION_CHANGE_SECTION_ADDRESS
:
2999 option
= "--change-section-address";
3001 case OPTION_CHANGE_SECTION_LMA
:
3002 option
= "--change-section-lma";
3004 case OPTION_CHANGE_SECTION_VMA
:
3005 option
= "--change-section-vma";
3009 s
= strchr (optarg
, '=');
3012 s
= strchr (optarg
, '+');
3015 s
= strchr (optarg
, '-');
3017 fatal (_("bad format for %s"), option
);
3022 name
= xmalloc (len
+ 1);
3023 strncpy (name
, optarg
, len
);
3026 p
= find_section_list (name
, TRUE
);
3028 val
= parse_vma (s
+ 1, option
);
3032 case '=': what
= CHANGE_SET
; break;
3033 case '-': val
= - val
; /* Drop through. */
3034 case '+': what
= CHANGE_MODIFY
; break;
3039 case OPTION_CHANGE_SECTION_ADDRESS
:
3040 p
->change_vma
= what
;
3044 case OPTION_CHANGE_SECTION_LMA
:
3045 p
->change_lma
= what
;
3049 case OPTION_CHANGE_SECTION_VMA
:
3050 p
->change_vma
= what
;
3057 case OPTION_CHANGE_ADDRESSES
:
3058 change_section_address
= parse_vma (optarg
, "--change-addresses");
3059 change_start
= change_section_address
;
3062 case OPTION_CHANGE_WARNINGS
:
3066 case OPTION_CHANGE_LEADING_CHAR
:
3067 change_leading_char
= TRUE
;
3070 case OPTION_DEBUGGING
:
3071 convert_debugging
= TRUE
;
3074 case OPTION_GAP_FILL
:
3076 bfd_vma gap_fill_vma
;
3078 gap_fill_vma
= parse_vma (optarg
, "--gap-fill");
3079 gap_fill
= (bfd_byte
) gap_fill_vma
;
3080 if ((bfd_vma
) gap_fill
!= gap_fill_vma
)
3084 sprintf_vma (buff
, gap_fill_vma
);
3086 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
3089 gap_fill_set
= TRUE
;
3093 case OPTION_NO_CHANGE_WARNINGS
:
3094 change_warn
= FALSE
;
3098 pad_to
= parse_vma (optarg
, "--pad-to");
3102 case OPTION_REMOVE_LEADING_CHAR
:
3103 remove_leading_char
= TRUE
;
3106 case OPTION_REDEFINE_SYM
:
3108 /* Push this redefinition onto redefine_symbol_list. */
3112 const char *nextarg
;
3113 char *source
, *target
;
3115 s
= strchr (optarg
, '=');
3117 fatal (_("bad format for %s"), "--redefine-sym");
3120 source
= xmalloc (len
+ 1);
3121 strncpy (source
, optarg
, len
);
3125 len
= strlen (nextarg
);
3126 target
= xmalloc (len
+ 1);
3127 strcpy (target
, nextarg
);
3129 redefine_list_append ("--redefine-sym", source
, target
);
3136 case OPTION_REDEFINE_SYMS
:
3137 add_redefine_syms_file (optarg
);
3140 case OPTION_SET_SECTION_FLAGS
:
3146 s
= strchr (optarg
, '=');
3148 fatal (_("bad format for %s"), "--set-section-flags");
3151 name
= xmalloc (len
+ 1);
3152 strncpy (name
, optarg
, len
);
3155 p
= find_section_list (name
, TRUE
);
3157 p
->set_flags
= TRUE
;
3158 p
->flags
= parse_flags (s
+ 1);
3162 case OPTION_RENAME_SECTION
:
3165 const char *eq
, *fl
;
3170 eq
= strchr (optarg
, '=');
3172 fatal (_("bad format for %s"), "--rename-section");
3176 fatal (_("bad format for %s"), "--rename-section");
3178 old_name
= xmalloc (len
+ 1);
3179 strncpy (old_name
, optarg
, len
);
3183 fl
= strchr (eq
, ',');
3186 flags
= parse_flags (fl
+ 1);
3196 fatal (_("bad format for %s"), "--rename-section");
3198 new_name
= xmalloc (len
+ 1);
3199 strncpy (new_name
, eq
, len
);
3202 add_section_rename (old_name
, new_name
, flags
);
3206 case OPTION_SET_START
:
3207 set_start
= parse_vma (optarg
, "--set-start");
3208 set_start_set
= TRUE
;
3211 case OPTION_SREC_LEN
:
3212 Chunk
= parse_vma (optarg
, "--srec-len");
3215 case OPTION_SREC_FORCES3
:
3219 case OPTION_STRIP_SYMBOLS
:
3220 add_specific_symbols (optarg
, &strip_specific_list
);
3223 case OPTION_STRIP_UNNEEDED_SYMBOLS
:
3224 add_specific_symbols (optarg
, &strip_unneeded_list
);
3227 case OPTION_KEEP_SYMBOLS
:
3228 add_specific_symbols (optarg
, &keep_specific_list
);
3231 case OPTION_LOCALIZE_HIDDEN
:
3232 localize_hidden
= TRUE
;
3235 case OPTION_LOCALIZE_SYMBOLS
:
3236 add_specific_symbols (optarg
, &localize_specific_list
);
3239 case OPTION_GLOBALIZE_SYMBOLS
:
3240 add_specific_symbols (optarg
, &globalize_specific_list
);
3243 case OPTION_KEEPGLOBAL_SYMBOLS
:
3244 add_specific_symbols (optarg
, &keepglobal_specific_list
);
3247 case OPTION_WEAKEN_SYMBOLS
:
3248 add_specific_symbols (optarg
, &weaken_specific_list
);
3251 case OPTION_ALT_MACH_CODE
:
3252 use_alt_mach_code
= strtoul (optarg
, NULL
, 0);
3253 if (use_alt_mach_code
== 0)
3254 fatal (_("unable to parse alternative machine code"));
3257 case OPTION_PREFIX_SYMBOLS
:
3258 prefix_symbols_string
= optarg
;
3261 case OPTION_PREFIX_SECTIONS
:
3262 prefix_sections_string
= optarg
;
3265 case OPTION_PREFIX_ALLOC_SECTIONS
:
3266 prefix_alloc_sections_string
= optarg
;
3269 case OPTION_READONLY_TEXT
:
3270 bfd_flags_to_set
|= WP_TEXT
;
3271 bfd_flags_to_clear
&= ~WP_TEXT
;
3274 case OPTION_WRITABLE_TEXT
:
3275 bfd_flags_to_clear
|= WP_TEXT
;
3276 bfd_flags_to_set
&= ~WP_TEXT
;
3280 bfd_flags_to_set
|= D_PAGED
;
3281 bfd_flags_to_clear
&= ~D_PAGED
;
3285 bfd_flags_to_clear
|= D_PAGED
;
3286 bfd_flags_to_set
&= ~D_PAGED
;
3289 case OPTION_EXTRACT_SYMBOL
:
3290 extract_symbol
= TRUE
;
3293 case OPTION_REVERSE_BYTES
:
3295 int prev
= reverse_bytes
;
3297 reverse_bytes
= atoi (optarg
);
3298 if ((reverse_bytes
<= 0) || ((reverse_bytes
% 2) != 0))
3299 fatal (_("number of bytes to reverse must be positive and even"));
3301 if (prev
&& prev
!= reverse_bytes
)
3302 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
3308 /* We've been given a long option. */
3313 copy_usage (stdout
, 0);
3316 copy_usage (stderr
, 1);
3327 print_version ("objcopy");
3329 if (copy_byte
>= interleave
)
3330 fatal (_("byte number must be less than interleave"));
3332 if (optind
== argc
|| optind
+ 2 < argc
)
3333 copy_usage (stderr
, 1);
3335 input_filename
= argv
[optind
];
3336 if (optind
+ 1 < argc
)
3337 output_filename
= argv
[optind
+ 1];
3339 /* Default is to strip no symbols. */
3340 if (strip_symbols
== STRIP_UNDEF
&& discard_locals
== LOCALS_UNDEF
)
3341 strip_symbols
= STRIP_NONE
;
3343 if (output_target
== NULL
)
3344 output_target
= input_target
;
3346 if (binary_architecture
!= NULL
)
3348 if (input_target
&& strcmp (input_target
, "binary") == 0)
3350 const bfd_arch_info_type
* temp_arch_info
;
3352 temp_arch_info
= bfd_scan_arch (binary_architecture
);
3354 if (temp_arch_info
!= NULL
)
3356 bfd_external_binary_architecture
= temp_arch_info
->arch
;
3357 bfd_external_machine
= temp_arch_info
->mach
;
3360 fatal (_("architecture %s unknown"), binary_architecture
);
3364 non_fatal (_("Warning: input target 'binary' required for binary architecture parameter."));
3365 non_fatal (_(" Argument %s ignored"), binary_architecture
);
3370 if (stat (input_filename
, & statbuf
) < 0)
3371 fatal (_("warning: could not locate '%s'. System error message: %s"),
3372 input_filename
, strerror (errno
));
3374 /* If there is no destination file, or the source and destination files
3375 are the same, then create a temp and rename the result into the input. */
3376 if (output_filename
== NULL
|| strcmp (input_filename
, output_filename
) == 0)
3378 char *tmpname
= make_tempname (input_filename
);
3380 if (tmpname
== NULL
)
3381 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
3382 input_filename
, strerror (errno
));
3384 copy_file (input_filename
, tmpname
, input_target
, output_target
);
3388 set_times (tmpname
, &statbuf
);
3389 smart_rename (tmpname
, input_filename
, preserve_dates
);
3396 copy_file (input_filename
, output_filename
, input_target
, output_target
);
3398 if (status
== 0 && preserve_dates
)
3399 set_times (output_filename
, &statbuf
);
3400 else if (status
!= 0)
3401 unlink_if_ordinary (output_filename
);
3406 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
3410 if (p
->change_vma
!= CHANGE_IGNORE
)
3414 sprintf_vma (buff
, p
->vma_val
);
3416 /* xgettext:c-format */
3417 non_fatal (_("%s %s%c0x%s never used"),
3418 "--change-section-vma",
3420 p
->change_vma
== CHANGE_SET
? '=' : '+',
3424 if (p
->change_lma
!= CHANGE_IGNORE
)
3428 sprintf_vma (buff
, p
->lma_val
);
3430 /* xgettext:c-format */
3431 non_fatal (_("%s %s%c0x%s never used"),
3432 "--change-section-lma",
3434 p
->change_lma
== CHANGE_SET
? '=' : '+',
3445 main (int argc
, char *argv
[])
3447 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
3448 setlocale (LC_MESSAGES
, "");
3450 #if defined (HAVE_SETLOCALE)
3451 setlocale (LC_CTYPE
, "");
3453 bindtextdomain (PACKAGE
, LOCALEDIR
);
3454 textdomain (PACKAGE
);
3456 program_name
= argv
[0];
3457 xmalloc_set_program_name (program_name
);
3459 START_PROGRESS (program_name
, 0);
3461 expandargv (&argc
, &argv
);
3463 strip_symbols
= STRIP_UNDEF
;
3464 discard_locals
= LOCALS_UNDEF
;
3467 set_default_bfd_target ();
3471 int i
= strlen (program_name
);
3472 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3473 /* Drop the .exe suffix, if any. */
3474 if (i
> 4 && FILENAME_CMP (program_name
+ i
- 4, ".exe") == 0)
3477 program_name
[i
] = '\0';
3480 is_strip
= (i
>= 5 && FILENAME_CMP (program_name
+ i
- 5, "strip") == 0);
3484 strip_main (argc
, argv
);
3486 copy_main (argc
, argv
);
3488 END_PROGRESS (program_name
);