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,
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., 59 Temple Place - Suite 330, Boston, MA
27 #include "libiberty.h"
29 #include "filenames.h"
34 /* A list of symbols to explicitly strip out, or to keep. A linked
35 list is good enough for a small number from the command line, but
36 this will slow things down a lot if many symbols are being
45 /* A list to support redefine_sym. */
50 struct redefine_node
*next
;
53 typedef struct section_rename
55 const char * old_name
;
56 const char * new_name
;
58 struct section_rename
* next
;
62 /* List of sections to be renamed. */
63 static section_rename
*section_rename_list
;
65 #define RETURN_NONFATAL(s) {bfd_nonfatal (s); status = 1; return;}
67 static asymbol
**isympp
= NULL
; /* Input symbols. */
68 static asymbol
**osympp
= NULL
; /* Output symbols that survive stripping. */
70 /* If `copy_byte' >= 0, copy only that byte of every `interleave' bytes. */
71 static int copy_byte
= -1;
72 static int interleave
= 4;
74 static bfd_boolean verbose
; /* Print file and target names. */
75 static bfd_boolean preserve_dates
; /* Preserve input file timestamp. */
76 static int status
= 0; /* Exit status. */
81 STRIP_NONE
, /* Don't strip. */
82 STRIP_DEBUG
, /* Strip all debugger symbols. */
83 STRIP_UNNEEDED
, /* Strip unnecessary symbols. */
84 STRIP_NONDEBUG
, /* Strip everything but debug info. */
85 STRIP_ALL
/* Strip all symbols. */
88 /* Which symbols to remove. */
89 static enum strip_action strip_symbols
;
94 LOCALS_START_L
, /* Discard locals starting with L. */
95 LOCALS_ALL
/* Discard all locals. */
98 /* Which local symbols to remove. Overrides STRIP_ALL. */
99 static enum locals_action discard_locals
;
101 /* What kind of change to perform. */
109 /* Structure used to hold lists of sections and actions to take. */
112 struct section_list
* next
; /* Next section to change. */
113 const char * name
; /* Section name. */
114 bfd_boolean used
; /* Whether this entry was used. */
115 bfd_boolean remove
; /* Whether to remove this section. */
116 bfd_boolean copy
; /* Whether to copy this section. */
117 enum change_action change_vma
;/* Whether to change or set VMA. */
118 bfd_vma vma_val
; /* Amount to change by or set to. */
119 enum change_action change_lma
;/* Whether to change or set LMA. */
120 bfd_vma lma_val
; /* Amount to change by or set to. */
121 bfd_boolean set_flags
; /* Whether to set the section flags. */
122 flagword flags
; /* What to set the section flags to. */
125 static struct section_list
*change_sections
;
127 /* TRUE if some sections are to be removed. */
128 static bfd_boolean sections_removed
;
130 /* TRUE if only some sections are to be copied. */
131 static bfd_boolean sections_copied
;
133 /* Changes to the start address. */
134 static bfd_vma change_start
= 0;
135 static bfd_boolean set_start_set
= FALSE
;
136 static bfd_vma set_start
;
138 /* Changes to section addresses. */
139 static bfd_vma change_section_address
= 0;
141 /* Filling gaps between sections. */
142 static bfd_boolean gap_fill_set
= FALSE
;
143 static bfd_byte gap_fill
= 0;
145 /* Pad to a given address. */
146 static bfd_boolean pad_to_set
= FALSE
;
147 static bfd_vma pad_to
;
149 /* Use alternate machine code? */
150 static int use_alt_mach_code
= 0;
152 /* Output BFD flags user wants to set or clear */
153 static flagword bfd_flags_to_set
;
154 static flagword bfd_flags_to_clear
;
156 /* List of sections to add. */
159 /* Next section to add. */
160 struct section_add
*next
;
161 /* Name of section to add. */
163 /* Name of file holding section contents. */
164 const char *filename
;
167 /* Contents of file. */
169 /* BFD section, after it has been added. */
173 /* List of sections to add to the output BFD. */
174 static struct section_add
*add_sections
;
176 /* If non-NULL the argument to --add-gnu-debuglink.
177 This should be the filename to store in the .gnu_debuglink section. */
178 static const char * gnu_debuglink_filename
= NULL
;
180 /* Whether to convert debugging information. */
181 static bfd_boolean convert_debugging
= FALSE
;
183 /* Whether to change the leading character in symbol names. */
184 static bfd_boolean change_leading_char
= FALSE
;
186 /* Whether to remove the leading character from global symbol names. */
187 static bfd_boolean remove_leading_char
= FALSE
;
189 /* Whether to permit wildcard in symbol comparison. */
190 static bfd_boolean wildcard
= FALSE
;
192 /* List of symbols to strip, keep, localize, keep-global, weaken,
194 static struct symlist
*strip_specific_list
= NULL
;
195 static struct symlist
*keep_specific_list
= NULL
;
196 static struct symlist
*localize_specific_list
= NULL
;
197 static struct symlist
*keepglobal_specific_list
= NULL
;
198 static struct symlist
*weaken_specific_list
= NULL
;
199 static struct redefine_node
*redefine_sym_list
= NULL
;
201 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
202 static bfd_boolean weaken
= FALSE
;
204 /* Prefix symbols/sections. */
205 static char *prefix_symbols_string
= 0;
206 static char *prefix_sections_string
= 0;
207 static char *prefix_alloc_sections_string
= 0;
209 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
210 enum command_line_switch
212 OPTION_ADD_SECTION
=150,
213 OPTION_CHANGE_ADDRESSES
,
214 OPTION_CHANGE_LEADING_CHAR
,
216 OPTION_CHANGE_SECTION_ADDRESS
,
217 OPTION_CHANGE_SECTION_LMA
,
218 OPTION_CHANGE_SECTION_VMA
,
219 OPTION_CHANGE_WARNINGS
,
222 OPTION_NO_CHANGE_WARNINGS
,
224 OPTION_REMOVE_LEADING_CHAR
,
225 OPTION_SET_SECTION_FLAGS
,
227 OPTION_STRIP_UNNEEDED
,
230 OPTION_REDEFINE_SYMS
,
233 OPTION_STRIP_SYMBOLS
,
235 OPTION_LOCALIZE_SYMBOLS
,
236 OPTION_KEEPGLOBAL_SYMBOLS
,
237 OPTION_WEAKEN_SYMBOLS
,
238 OPTION_RENAME_SECTION
,
239 OPTION_ALT_MACH_CODE
,
240 OPTION_PREFIX_SYMBOLS
,
241 OPTION_PREFIX_SECTIONS
,
242 OPTION_PREFIX_ALLOC_SECTIONS
,
244 OPTION_ADD_GNU_DEBUGLINK
,
245 OPTION_ONLY_KEEP_DEBUG
,
246 OPTION_READONLY_TEXT
,
247 OPTION_WRITABLE_TEXT
,
252 /* Options to handle if running as "strip". */
254 static struct option strip_options
[] =
256 {"discard-all", no_argument
, 0, 'x'},
257 {"discard-locals", no_argument
, 0, 'X'},
258 {"format", required_argument
, 0, 'F'}, /* Obsolete */
259 {"help", no_argument
, 0, 'h'},
260 {"info", no_argument
, 0, OPTION_FORMATS_INFO
},
261 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
262 {"input-target", required_argument
, 0, 'I'},
263 {"keep-symbol", required_argument
, 0, 'K'},
264 {"only-keep-debug", no_argument
, 0, OPTION_ONLY_KEEP_DEBUG
},
265 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
266 {"output-target", required_argument
, 0, 'O'},
267 {"output-file", required_argument
, 0, 'o'},
268 {"preserve-dates", no_argument
, 0, 'p'},
269 {"remove-section", required_argument
, 0, 'R'},
270 {"strip-all", no_argument
, 0, 's'},
271 {"strip-debug", no_argument
, 0, 'S'},
272 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
273 {"strip-symbol", required_argument
, 0, 'N'},
274 {"target", required_argument
, 0, 'F'},
275 {"verbose", no_argument
, 0, 'v'},
276 {"version", no_argument
, 0, 'V'},
277 {"wildcard", no_argument
, 0, 'w'},
278 {0, no_argument
, 0, 0}
281 /* Options to handle if running as "objcopy". */
283 static struct option copy_options
[] =
285 {"add-gnu-debuglink", required_argument
, 0, OPTION_ADD_GNU_DEBUGLINK
},
286 {"add-section", required_argument
, 0, OPTION_ADD_SECTION
},
287 {"adjust-start", required_argument
, 0, OPTION_CHANGE_START
},
288 {"adjust-vma", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
289 {"adjust-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
290 {"adjust-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
291 {"alt-machine-code", required_argument
, 0, OPTION_ALT_MACH_CODE
},
292 {"binary-architecture", required_argument
, 0, 'B'},
293 {"byte", required_argument
, 0, 'b'},
294 {"change-addresses", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
295 {"change-leading-char", no_argument
, 0, OPTION_CHANGE_LEADING_CHAR
},
296 {"change-section-address", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
297 {"change-section-lma", required_argument
, 0, OPTION_CHANGE_SECTION_LMA
},
298 {"change-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_VMA
},
299 {"change-start", required_argument
, 0, OPTION_CHANGE_START
},
300 {"change-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
301 {"debugging", no_argument
, 0, OPTION_DEBUGGING
},
302 {"discard-all", no_argument
, 0, 'x'},
303 {"discard-locals", no_argument
, 0, 'X'},
304 {"format", required_argument
, 0, 'F'}, /* Obsolete */
305 {"gap-fill", required_argument
, 0, OPTION_GAP_FILL
},
306 {"help", no_argument
, 0, 'h'},
307 {"impure", no_argument
, 0, OPTION_IMPURE
},
308 {"info", no_argument
, 0, OPTION_FORMATS_INFO
},
309 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
310 {"input-target", required_argument
, 0, 'I'},
311 {"interleave", required_argument
, 0, 'i'},
312 {"keep-global-symbol", required_argument
, 0, 'G'},
313 {"keep-global-symbols", required_argument
, 0, OPTION_KEEPGLOBAL_SYMBOLS
},
314 {"keep-symbol", required_argument
, 0, 'K'},
315 {"keep-symbols", required_argument
, 0, OPTION_KEEP_SYMBOLS
},
316 {"localize-symbol", required_argument
, 0, 'L'},
317 {"localize-symbols", required_argument
, 0, OPTION_LOCALIZE_SYMBOLS
},
318 {"no-adjust-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
319 {"no-change-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
320 {"only-keep-debug", no_argument
, 0, OPTION_ONLY_KEEP_DEBUG
},
321 {"only-section", required_argument
, 0, 'j'},
322 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
323 {"output-target", required_argument
, 0, 'O'},
324 {"pad-to", required_argument
, 0, OPTION_PAD_TO
},
325 {"prefix-symbols", required_argument
, 0, OPTION_PREFIX_SYMBOLS
},
326 {"prefix-sections", required_argument
, 0, OPTION_PREFIX_SECTIONS
},
327 {"prefix-alloc-sections", required_argument
, 0, OPTION_PREFIX_ALLOC_SECTIONS
},
328 {"preserve-dates", no_argument
, 0, 'p'},
329 {"pure", no_argument
, 0, OPTION_PURE
},
330 {"readonly-text", no_argument
, 0, OPTION_READONLY_TEXT
},
331 {"redefine-sym", required_argument
, 0, OPTION_REDEFINE_SYM
},
332 {"redefine-syms", required_argument
, 0, OPTION_REDEFINE_SYMS
},
333 {"remove-leading-char", no_argument
, 0, OPTION_REMOVE_LEADING_CHAR
},
334 {"remove-section", required_argument
, 0, 'R'},
335 {"rename-section", required_argument
, 0, OPTION_RENAME_SECTION
},
336 {"set-section-flags", required_argument
, 0, OPTION_SET_SECTION_FLAGS
},
337 {"set-start", required_argument
, 0, OPTION_SET_START
},
338 {"srec-len", required_argument
, 0, OPTION_SREC_LEN
},
339 {"srec-forceS3", no_argument
, 0, OPTION_SREC_FORCES3
},
340 {"strip-all", no_argument
, 0, 'S'},
341 {"strip-debug", no_argument
, 0, 'g'},
342 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
343 {"strip-symbol", required_argument
, 0, 'N'},
344 {"strip-symbols", required_argument
, 0, OPTION_STRIP_SYMBOLS
},
345 {"target", required_argument
, 0, 'F'},
346 {"verbose", no_argument
, 0, 'v'},
347 {"version", no_argument
, 0, 'V'},
348 {"weaken", no_argument
, 0, OPTION_WEAKEN
},
349 {"weaken-symbol", required_argument
, 0, 'W'},
350 {"weaken-symbols", required_argument
, 0, OPTION_WEAKEN_SYMBOLS
},
351 {"wildcard", no_argument
, 0, 'w'},
352 {"writable-text", no_argument
, 0, OPTION_WRITABLE_TEXT
},
353 {0, no_argument
, 0, 0}
357 extern char *program_name
;
359 /* This flag distinguishes between strip and objcopy:
360 1 means this is 'strip'; 0 means this is 'objcopy'.
361 -1 means if we should use argv[0] to decide. */
364 /* The maximum length of an S record. This variable is declared in srec.c
365 and can be modified by the --srec-len parameter. */
366 extern unsigned int Chunk
;
368 /* Restrict the generation of Srecords to type S3 only.
369 This variable is declare in bfd/srec.c and can be toggled
370 on by the --srec-forceS3 command line switch. */
371 extern bfd_boolean S3Forced
;
373 /* Defined in bfd/binary.c. Used to set architecture and machine of input
375 extern enum bfd_architecture bfd_external_binary_architecture
;
376 extern unsigned long bfd_external_machine
;
378 /* Forward declarations. */
379 static void setup_section (bfd
*, asection
*, void *);
380 static void setup_bfd_headers (bfd
*, bfd
*);
381 static void copy_section (bfd
*, asection
*, void *);
382 static void get_sections (bfd
*, asection
*, void *);
383 static int compare_section_lma (const void *, const void *);
384 static void mark_symbols_used_in_relocations (bfd
*, asection
*, void *);
385 static bfd_boolean
write_debugging_info (bfd
*, void *, long *, asymbol
***);
386 static const char *lookup_sym_redefinition (const char *);
389 copy_usage (FILE *stream
, int exit_status
)
391 fprintf (stream
, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name
);
392 fprintf (stream
, _(" Copies a binary file, possibly transforming it in the process\n"));
393 fprintf (stream
, _(" The options are:\n"));
394 fprintf (stream
, _("\
395 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
396 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
397 -B --binary-architecture <arch> Set arch of output file, when input is binary\n\
398 -F --target <bfdname> Set both input and output format to <bfdname>\n\
399 --debugging Convert debugging information, if possible\n\
400 -p --preserve-dates Copy modified/access timestamps to the output\n\
401 -j --only-section <name> Only copy section <name> into the output\n\
402 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
403 -R --remove-section <name> Remove section <name> from the output\n\
404 -S --strip-all Remove all symbol and relocation information\n\
405 -g --strip-debug Remove all debugging symbols & sections\n\
406 --strip-unneeded Remove all symbols not needed by relocations\n\
407 -N --strip-symbol <name> Do not copy symbol <name>\n\
408 --only-keep-debug Strip everything but the debug information\n\
409 -K --keep-symbol <name> Only copy symbol <name>\n\
410 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
411 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
412 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
413 --weaken Force all global symbols to be marked as weak\n\
414 -w --wildcard Permit wildcard in symbol comparison\n\
415 -x --discard-all Remove all non-global symbols\n\
416 -X --discard-locals Remove any compiler-generated symbols\n\
417 -i --interleave <number> Only copy one out of every <number> bytes\n\
418 -b --byte <num> Select byte <num> in every interleaved block\n\
419 --gap-fill <val> Fill gaps between sections with <val>\n\
420 --pad-to <addr> Pad the last section up to address <addr>\n\
421 --set-start <addr> Set the start address to <addr>\n\
422 {--change-start|--adjust-start} <incr>\n\
423 Add <incr> to the start address\n\
424 {--change-addresses|--adjust-vma} <incr>\n\
425 Add <incr> to LMA, VMA and start addresses\n\
426 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
427 Change LMA and VMA of section <name> by <val>\n\
428 --change-section-lma <name>{=|+|-}<val>\n\
429 Change the LMA of section <name> by <val>\n\
430 --change-section-vma <name>{=|+|-}<val>\n\
431 Change the VMA of section <name> by <val>\n\
432 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
433 Warn if a named section does not exist\n\
434 --set-section-flags <name>=<flags>\n\
435 Set section <name>'s properties to <flags>\n\
436 --add-section <name>=<file> Add section <name> found in <file> to output\n\
437 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
438 --change-leading-char Force output format's leading character style\n\
439 --remove-leading-char Remove leading character from global symbols\n\
440 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
441 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
443 --srec-len <number> Restrict the length of generated Srecords\n\
444 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
445 --strip-symbols <file> -N for all symbols listed in <file>\n\
446 --keep-symbols <file> -K for all symbols listed in <file>\n\
447 --localize-symbols <file> -L for all symbols listed in <file>\n\
448 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
449 --weaken-symbols <file> -W for all symbols listed in <file>\n\
450 --alt-machine-code <index> Use alternate machine code for output\n\
451 --writable-text Mark the output text as writable\n\
452 --readonly-text Make the output text write protected\n\
453 --pure Mark the output file as demand paged\n\
454 --impure Mark the output file as impure\n\
455 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
456 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
457 --prefix-alloc-sections <prefix>\n\
458 Add <prefix> to start of every allocatable\n\
460 -v --verbose List all object files modified\n\
461 -V --version Display this program's version number\n\
462 -h --help Display this output\n\
463 --info List object formats & architectures supported\n\
465 list_supported_targets (program_name
, stream
);
466 if (exit_status
== 0)
467 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
472 strip_usage (FILE *stream
, int exit_status
)
474 fprintf (stream
, _("Usage: %s <option(s)> in-file(s)\n"), program_name
);
475 fprintf (stream
, _(" Removes symbols and sections from files\n"));
476 fprintf (stream
, _(" The options are:\n"));
477 fprintf (stream
, _("\
478 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
479 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
480 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
481 -p --preserve-dates Copy modified/access timestamps to the output\n\
482 -R --remove-section=<name> Remove section <name> from the output\n\
483 -s --strip-all Remove all symbol and relocation information\n\
484 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
485 --strip-unneeded Remove all symbols not needed by relocations\n\
486 --only-keep-debug Strip everything but the debug information\n\
487 -N --strip-symbol=<name> Do not copy symbol <name>\n\
488 -K --keep-symbol=<name> Only copy symbol <name>\n\
489 -w --wildcard Permit wildcard in symbol comparison\n\
490 -x --discard-all Remove all non-global symbols\n\
491 -X --discard-locals Remove any compiler-generated symbols\n\
492 -v --verbose List all object files modified\n\
493 -V --version Display this program's version number\n\
494 -h --help Display this output\n\
495 --info List object formats & architectures supported\n\
496 -o <file> Place stripped output into <file>\n\
499 list_supported_targets (program_name
, stream
);
500 if (exit_status
== 0)
501 fprintf (stream
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
505 /* Parse section flags into a flagword, with a fatal error if the
506 string can't be parsed. */
509 parse_flags (const char *s
)
519 snext
= strchr (s
, ',');
529 #define PARSE_FLAG(fname,fval) \
530 else if (strncasecmp (fname, s, len) == 0) ret |= fval
531 PARSE_FLAG ("alloc", SEC_ALLOC
);
532 PARSE_FLAG ("load", SEC_LOAD
);
533 PARSE_FLAG ("noload", SEC_NEVER_LOAD
);
534 PARSE_FLAG ("readonly", SEC_READONLY
);
535 PARSE_FLAG ("debug", SEC_DEBUGGING
);
536 PARSE_FLAG ("code", SEC_CODE
);
537 PARSE_FLAG ("data", SEC_DATA
);
538 PARSE_FLAG ("rom", SEC_ROM
);
539 PARSE_FLAG ("share", SEC_SHARED
);
540 PARSE_FLAG ("contents", SEC_HAS_CONTENTS
);
546 copy
= xmalloc (len
+ 1);
547 strncpy (copy
, s
, len
);
549 non_fatal (_("unrecognized section flag `%s'"), copy
);
550 fatal (_("supported flags: %s"),
551 "alloc, load, noload, readonly, debug, code, data, rom, share, contents");
561 /* Find and optionally add an entry in the change_sections list. */
563 static struct section_list
*
564 find_section_list (const char *name
, bfd_boolean add
)
566 struct section_list
*p
;
568 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
569 if (strcmp (p
->name
, name
) == 0)
575 p
= xmalloc (sizeof (struct section_list
));
580 p
->change_vma
= CHANGE_IGNORE
;
581 p
->change_lma
= CHANGE_IGNORE
;
584 p
->set_flags
= FALSE
;
587 p
->next
= change_sections
;
593 /* Add a symbol to strip_specific_list. */
596 add_specific_symbol (const char *name
, struct symlist
**list
)
598 struct symlist
*tmp_list
;
600 tmp_list
= xmalloc (sizeof (struct symlist
));
601 tmp_list
->name
= name
;
602 tmp_list
->next
= *list
;
606 /* Add symbols listed in `filename' to strip_specific_list. */
608 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
609 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
612 add_specific_symbols (const char *filename
, struct symlist
**list
)
618 unsigned int line_count
;
620 size
= get_file_size (filename
);
624 buffer
= xmalloc (size
+ 2);
625 f
= fopen (filename
, FOPEN_RT
);
627 fatal (_("cannot open '%s': %s"), filename
, strerror (errno
));
629 if (fread (buffer
, 1, size
, f
) == 0 || ferror (f
))
630 fatal (_("%s: fread failed"), filename
);
633 buffer
[size
] = '\n';
634 buffer
[size
+ 1] = '\0';
638 for (line
= buffer
; * line
!= '\0'; line
++)
643 int finished
= FALSE
;
645 for (eol
= line
;; eol
++)
651 /* Cope with \n\r. */
659 /* Cope with \r\n. */
670 /* Line comment, Terminate the line here, in case a
671 name is present and then allow the rest of the
672 loop to find the real end of the line. */
684 /* A name may now exist somewhere between 'line' and 'eol'.
685 Strip off leading whitespace and trailing whitespace,
686 then add it to the list. */
687 for (name
= line
; IS_WHITESPACE (* name
); name
++)
689 for (name_end
= name
;
690 (! IS_WHITESPACE (* name_end
))
691 && (! IS_LINE_TERMINATOR (* name_end
));
695 if (! IS_LINE_TERMINATOR (* name_end
))
699 for (extra
= name_end
+ 1; IS_WHITESPACE (* extra
); extra
++)
702 if (! IS_LINE_TERMINATOR (* extra
))
703 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
704 filename
, line_count
);
710 add_specific_symbol (name
, list
);
712 /* Advance line pointer to end of line. The 'eol ++' in the for
713 loop above will then advance us to the start of the next line. */
719 /* See whether a symbol should be stripped or kept based on
720 strip_specific_list and keep_symbols. */
723 is_specified_symbol (const char *name
, struct symlist
*list
)
725 struct symlist
*tmp_list
;
729 for (tmp_list
= list
; tmp_list
; tmp_list
= tmp_list
->next
)
730 if (*(tmp_list
->name
) != '!')
732 if (!fnmatch (tmp_list
->name
, name
, 0))
737 if (fnmatch (tmp_list
->name
+ 1, name
, 0))
743 for (tmp_list
= list
; tmp_list
; tmp_list
= tmp_list
->next
)
744 if (strcmp (name
, tmp_list
->name
) == 0)
751 /* See if a section is being removed. */
754 is_strip_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
)
756 if (sections_removed
|| sections_copied
)
758 struct section_list
*p
;
760 p
= find_section_list (bfd_get_section_name (abfd
, sec
), FALSE
);
762 if (sections_removed
&& p
!= NULL
&& p
->remove
)
764 if (sections_copied
&& (p
== NULL
|| ! p
->copy
))
768 if ((bfd_get_section_flags (abfd
, sec
) & SEC_DEBUGGING
) != 0)
770 if (strip_symbols
== STRIP_DEBUG
771 || strip_symbols
== STRIP_UNNEEDED
772 || strip_symbols
== STRIP_ALL
773 || discard_locals
== LOCALS_ALL
774 || convert_debugging
)
777 if (strip_symbols
== STRIP_NONDEBUG
)
784 /* Choose which symbol entries to copy; put the result in OSYMS.
785 We don't copy in place, because that confuses the relocs.
786 Return the number of symbols to print. */
789 filter_symbols (bfd
*abfd
, bfd
*obfd
, asymbol
**osyms
,
790 asymbol
**isyms
, long symcount
)
792 asymbol
**from
= isyms
, **to
= osyms
;
793 long src_count
= 0, dst_count
= 0;
794 int relocatable
= (abfd
->flags
& (HAS_RELOC
| EXEC_P
| DYNAMIC
))
797 for (; src_count
< symcount
; src_count
++)
799 asymbol
*sym
= from
[src_count
];
800 flagword flags
= sym
->flags
;
801 char *name
= (char *) bfd_asymbol_name (sym
);
803 bfd_boolean undefined
;
804 bfd_boolean rem_leading_char
;
805 bfd_boolean add_leading_char
;
807 undefined
= bfd_is_und_section (bfd_get_section (sym
));
809 if (redefine_sym_list
)
811 char *old_name
, *new_name
;
813 old_name
= (char *) bfd_asymbol_name (sym
);
814 new_name
= (char *) lookup_sym_redefinition (old_name
);
815 bfd_asymbol_name (sym
) = new_name
;
819 /* Check if we will remove the current leading character. */
821 (name
[0] == bfd_get_symbol_leading_char (abfd
))
822 && (change_leading_char
823 || (remove_leading_char
824 && ((flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0
826 || bfd_is_com_section (bfd_get_section (sym
)))));
828 /* Check if we will add a new leading character. */
831 && (bfd_get_symbol_leading_char (obfd
) != '\0')
832 && (bfd_get_symbol_leading_char (abfd
) == '\0'
833 || (name
[0] == bfd_get_symbol_leading_char (abfd
)));
835 /* Short circuit for change_leading_char if we can do it in-place. */
836 if (rem_leading_char
&& add_leading_char
&& !prefix_symbols_string
)
838 name
[0] = bfd_get_symbol_leading_char (obfd
);
839 bfd_asymbol_name (sym
) = name
;
840 rem_leading_char
= FALSE
;
841 add_leading_char
= FALSE
;
844 /* Remove leading char. */
845 if (rem_leading_char
)
846 bfd_asymbol_name (sym
) = ++name
;
848 /* Add new leading char and/or prefix. */
849 if (add_leading_char
|| prefix_symbols_string
)
853 ptr
= n
= xmalloc (1 + strlen (prefix_symbols_string
)
854 + strlen (name
) + 1);
855 if (add_leading_char
)
856 *ptr
++ = bfd_get_symbol_leading_char (obfd
);
858 if (prefix_symbols_string
)
860 strcpy (ptr
, prefix_symbols_string
);
861 ptr
+= strlen (prefix_symbols_string
);
865 bfd_asymbol_name (sym
) = n
;
869 if (strip_symbols
== STRIP_ALL
)
871 else if ((flags
& BSF_KEEP
) != 0 /* Used in relocation. */
872 || ((flags
& BSF_SECTION_SYM
) != 0
873 && ((*bfd_get_section (sym
)->symbol_ptr_ptr
)->flags
876 else if (relocatable
/* Relocatable file. */
877 && (flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0)
879 else if (bfd_decode_symclass (sym
) == 'I')
880 /* Global symbols in $idata sections need to be retained
881 even if relocatable is FALSE. External users of the
882 library containing the $idata section may reference these
885 else if ((flags
& BSF_GLOBAL
) != 0 /* Global symbol. */
886 || (flags
& BSF_WEAK
) != 0
888 || bfd_is_com_section (bfd_get_section (sym
)))
889 keep
= strip_symbols
!= STRIP_UNNEEDED
;
890 else if ((flags
& BSF_DEBUGGING
) != 0) /* Debugging symbol. */
891 keep
= (strip_symbols
!= STRIP_DEBUG
892 && strip_symbols
!= STRIP_UNNEEDED
893 && ! convert_debugging
);
894 else if (bfd_coff_get_comdat_section (abfd
, bfd_get_section (sym
)))
895 /* COMDAT sections store special information in local
896 symbols, so we cannot risk stripping any of them. */
898 else /* Local symbol. */
899 keep
= (strip_symbols
!= STRIP_UNNEEDED
900 && (discard_locals
!= LOCALS_ALL
901 && (discard_locals
!= LOCALS_START_L
902 || ! bfd_is_local_label (abfd
, sym
))));
904 if (keep
&& is_specified_symbol (name
, strip_specific_list
))
906 if (!keep
&& is_specified_symbol (name
, keep_specific_list
))
908 if (keep
&& is_strip_section (abfd
, bfd_get_section (sym
)))
911 if (keep
&& (flags
& BSF_GLOBAL
) != 0
912 && (weaken
|| is_specified_symbol (name
, weaken_specific_list
)))
914 sym
->flags
&=~ BSF_GLOBAL
;
915 sym
->flags
|= BSF_WEAK
;
917 if (keep
&& !undefined
&& (flags
& (BSF_GLOBAL
| BSF_WEAK
))
918 && (is_specified_symbol (name
, localize_specific_list
)
919 || (keepglobal_specific_list
!= NULL
920 && ! is_specified_symbol (name
, keepglobal_specific_list
))))
922 sym
->flags
&= ~(BSF_GLOBAL
| BSF_WEAK
);
923 sym
->flags
|= BSF_LOCAL
;
927 to
[dst_count
++] = sym
;
930 to
[dst_count
] = NULL
;
935 /* Find the redefined name of symbol SOURCE. */
938 lookup_sym_redefinition (const char *source
)
940 struct redefine_node
*list
;
942 for (list
= redefine_sym_list
; list
!= NULL
; list
= list
->next
)
943 if (strcmp (source
, list
->source
) == 0)
949 /* Add a node to a symbol redefine list. */
952 redefine_list_append (const char *cause
, const char *source
, const char *target
)
954 struct redefine_node
**p
;
955 struct redefine_node
*list
;
956 struct redefine_node
*new_node
;
958 for (p
= &redefine_sym_list
; (list
= *p
) != NULL
; p
= &list
->next
)
960 if (strcmp (source
, list
->source
) == 0)
961 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
964 if (strcmp (target
, list
->target
) == 0)
965 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
969 new_node
= xmalloc (sizeof (struct redefine_node
));
971 new_node
->source
= strdup (source
);
972 new_node
->target
= strdup (target
);
973 new_node
->next
= NULL
;
978 /* Handle the --redefine-syms option. Read lines containing "old new"
979 from the file, and add them to the symbol redefine list. */
982 add_redefine_syms_file (const char *filename
)
991 file
= fopen (filename
, "r");
993 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
994 filename
, strerror (errno
));
997 buf
= xmalloc (bufsize
);
1005 /* Collect the input symbol name. */
1006 while (! IS_WHITESPACE (c
) && ! IS_LINE_TERMINATOR (c
) && c
!= EOF
)
1014 buf
= xrealloc (buf
, bufsize
);
1022 /* Eat white space between the symbol names. */
1023 while (IS_WHITESPACE (c
))
1025 if (c
== '#' || IS_LINE_TERMINATOR (c
))
1030 /* Collect the output symbol name. */
1032 while (! IS_WHITESPACE (c
) && ! IS_LINE_TERMINATOR (c
) && c
!= EOF
)
1040 buf
= xrealloc (buf
, bufsize
);
1048 /* Eat white space at end of line. */
1049 while (! IS_LINE_TERMINATOR(c
) && c
!= EOF
&& IS_WHITESPACE (c
))
1054 if ((c
== '\r' && (c
= getc (file
)) == '\n')
1055 || c
== '\n' || c
== EOF
)
1058 /* Append the redefinition to the list. */
1060 redefine_list_append (filename
, &buf
[0], &buf
[outsym_off
]);
1071 fatal (_("%s:%d: garbage found at end of line"), filename
, lineno
);
1073 if (len
!= 0 && (outsym_off
== 0 || outsym_off
== len
))
1074 fatal (_("%s:%d: missing new symbol name"), filename
, lineno
);
1077 /* Eat the rest of the line and finish it. */
1078 while (c
!= '\n' && c
!= EOF
)
1084 fatal (_("%s:%d: premature end of file"), filename
, lineno
);
1089 /* Copy object file IBFD onto OBFD.
1090 Returns TRUE upon success, FALSE otherwise. */
1093 copy_object (bfd
*ibfd
, bfd
*obfd
)
1097 asection
**osections
= NULL
;
1098 asection
*gnu_debuglink_section
= NULL
;
1099 bfd_size_type
*gaps
= NULL
;
1100 bfd_size_type max_gap
= 0;
1103 enum bfd_architecture iarch
;
1106 if (ibfd
->xvec
->byteorder
!= obfd
->xvec
->byteorder
1107 && ibfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
1108 && obfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
)
1109 fatal (_("Unable to change endianness of input file(s)"));
1111 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1113 bfd_nonfatal (bfd_get_filename (obfd
));
1118 printf (_("copy from %s(%s) to %s(%s)\n"),
1119 bfd_get_filename (ibfd
), bfd_get_target (ibfd
),
1120 bfd_get_filename (obfd
), bfd_get_target (obfd
));
1125 start
= bfd_get_start_address (ibfd
);
1126 start
+= change_start
;
1128 /* Neither the start address nor the flags
1129 need to be set for a core file. */
1130 if (bfd_get_format (obfd
) != bfd_core
)
1134 flags
= bfd_get_file_flags (ibfd
);
1135 flags
|= bfd_flags_to_set
;
1136 flags
&= ~bfd_flags_to_clear
;
1137 flags
&= bfd_applicable_file_flags (obfd
);
1139 if (!bfd_set_start_address (obfd
, start
)
1140 || !bfd_set_file_flags (obfd
, flags
))
1142 bfd_nonfatal (bfd_get_filename (ibfd
));
1147 /* Copy architecture of input file to output file. */
1148 iarch
= bfd_get_arch (ibfd
);
1149 imach
= bfd_get_mach (ibfd
);
1150 if (!bfd_set_arch_mach (obfd
, iarch
, imach
)
1151 && (ibfd
->target_defaulted
1152 || bfd_get_arch (ibfd
) != bfd_get_arch (obfd
)))
1154 if (bfd_get_arch (ibfd
) == bfd_arch_unknown
)
1155 fatal (_("Unable to recognise the format of the input file %s"),
1156 bfd_get_filename (ibfd
));
1159 non_fatal (_("Warning: Output file cannot represent architecture %s"),
1160 bfd_printable_arch_mach (bfd_get_arch (ibfd
),
1161 bfd_get_mach (ibfd
)));
1166 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1168 bfd_nonfatal (bfd_get_filename (ibfd
));
1175 if (osympp
!= isympp
)
1178 /* BFD mandates that all output sections be created and sizes set before
1179 any output is done. Thus, we traverse all sections multiple times. */
1180 bfd_map_over_sections (ibfd
, setup_section
, obfd
);
1182 setup_bfd_headers (ibfd
, obfd
);
1184 if (add_sections
!= NULL
)
1186 struct section_add
*padd
;
1187 struct section_list
*pset
;
1189 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
1193 padd
->section
= bfd_make_section (obfd
, padd
->name
);
1194 if (padd
->section
== NULL
)
1196 non_fatal (_("can't create section `%s': %s"),
1197 padd
->name
, bfd_errmsg (bfd_get_error ()));
1201 if (! bfd_set_section_size (obfd
, padd
->section
, padd
->size
))
1203 bfd_nonfatal (bfd_get_filename (obfd
));
1207 pset
= find_section_list (padd
->name
, FALSE
);
1211 if (pset
!= NULL
&& pset
->set_flags
)
1212 flags
= pset
->flags
| SEC_HAS_CONTENTS
;
1214 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DATA
;
1216 if (! bfd_set_section_flags (obfd
, padd
->section
, flags
))
1218 bfd_nonfatal (bfd_get_filename (obfd
));
1224 if (pset
->change_vma
!= CHANGE_IGNORE
)
1225 if (! bfd_set_section_vma (obfd
, padd
->section
,
1228 bfd_nonfatal (bfd_get_filename (obfd
));
1232 if (pset
->change_lma
!= CHANGE_IGNORE
)
1234 padd
->section
->lma
= pset
->lma_val
;
1236 if (! bfd_set_section_alignment
1237 (obfd
, padd
->section
,
1238 bfd_section_alignment (obfd
, padd
->section
)))
1240 bfd_nonfatal (bfd_get_filename (obfd
));
1248 if (gnu_debuglink_filename
!= NULL
)
1250 gnu_debuglink_section
= bfd_create_gnu_debuglink_section
1251 (obfd
, gnu_debuglink_filename
);
1253 if (gnu_debuglink_section
== NULL
)
1255 bfd_nonfatal (gnu_debuglink_filename
);
1260 if (bfd_count_sections (obfd
) == 0)
1262 non_fatal (_("there are no sections to be copied!"));
1266 if (gap_fill_set
|| pad_to_set
)
1271 /* We must fill in gaps between the sections and/or we must pad
1272 the last section to a specified address. We do this by
1273 grabbing a list of the sections, sorting them by VMA, and
1274 increasing the section sizes as required to fill the gaps.
1275 We write out the gap contents below. */
1277 c
= bfd_count_sections (obfd
);
1278 osections
= xmalloc (c
* sizeof (asection
*));
1280 bfd_map_over_sections (obfd
, get_sections
, &set
);
1282 qsort (osections
, c
, sizeof (asection
*), compare_section_lma
);
1284 gaps
= xmalloc (c
* sizeof (bfd_size_type
));
1285 memset (gaps
, 0, c
* sizeof (bfd_size_type
));
1289 for (i
= 0; i
< c
- 1; i
++)
1293 bfd_vma gap_start
, gap_stop
;
1295 flags
= bfd_get_section_flags (obfd
, osections
[i
]);
1296 if ((flags
& SEC_HAS_CONTENTS
) == 0
1297 || (flags
& SEC_LOAD
) == 0)
1300 size
= bfd_section_size (obfd
, osections
[i
]);
1301 gap_start
= bfd_section_lma (obfd
, osections
[i
]) + size
;
1302 gap_stop
= bfd_section_lma (obfd
, osections
[i
+ 1]);
1303 if (gap_start
< gap_stop
)
1305 if (! bfd_set_section_size (obfd
, osections
[i
],
1306 size
+ (gap_stop
- gap_start
)))
1308 non_fatal (_("Can't fill gap after %s: %s"),
1309 bfd_get_section_name (obfd
, osections
[i
]),
1310 bfd_errmsg (bfd_get_error ()));
1314 gaps
[i
] = gap_stop
- gap_start
;
1315 if (max_gap
< gap_stop
- gap_start
)
1316 max_gap
= gap_stop
- gap_start
;
1326 lma
= bfd_section_lma (obfd
, osections
[c
- 1]);
1327 size
= bfd_section_size (obfd
, osections
[c
- 1]);
1328 if (lma
+ size
< pad_to
)
1330 if (! bfd_set_section_size (obfd
, osections
[c
- 1],
1333 non_fatal (_("Can't add padding to %s: %s"),
1334 bfd_get_section_name (obfd
, osections
[c
- 1]),
1335 bfd_errmsg (bfd_get_error ()));
1340 gaps
[c
- 1] = pad_to
- (lma
+ size
);
1341 if (max_gap
< pad_to
- (lma
+ size
))
1342 max_gap
= pad_to
- (lma
+ size
);
1348 /* Symbol filtering must happen after the output sections
1349 have been created, but before their contents are set. */
1351 symsize
= bfd_get_symtab_upper_bound (ibfd
);
1354 bfd_nonfatal (bfd_get_filename (ibfd
));
1358 osympp
= isympp
= xmalloc (symsize
);
1359 symcount
= bfd_canonicalize_symtab (ibfd
, isympp
);
1362 bfd_nonfatal (bfd_get_filename (ibfd
));
1366 if (convert_debugging
)
1367 dhandle
= read_debugging_info (ibfd
, isympp
, symcount
);
1369 if (strip_symbols
== STRIP_DEBUG
1370 || strip_symbols
== STRIP_ALL
1371 || strip_symbols
== STRIP_UNNEEDED
1372 || strip_symbols
== STRIP_NONDEBUG
1373 || discard_locals
!= LOCALS_UNDEF
1374 || strip_specific_list
!= NULL
1375 || keep_specific_list
!= NULL
1376 || localize_specific_list
!= NULL
1377 || keepglobal_specific_list
!= NULL
1378 || weaken_specific_list
!= NULL
1379 || prefix_symbols_string
1382 || convert_debugging
1383 || change_leading_char
1384 || remove_leading_char
1385 || redefine_sym_list
1388 /* Mark symbols used in output relocations so that they
1389 are kept, even if they are local labels or static symbols.
1391 Note we iterate over the input sections examining their
1392 relocations since the relocations for the output sections
1393 haven't been set yet. mark_symbols_used_in_relocations will
1394 ignore input sections which have no corresponding output
1396 if (strip_symbols
!= STRIP_ALL
)
1397 bfd_map_over_sections (ibfd
,
1398 mark_symbols_used_in_relocations
,
1400 osympp
= xmalloc ((symcount
+ 1) * sizeof (asymbol
*));
1401 symcount
= filter_symbols (ibfd
, obfd
, osympp
, isympp
, symcount
);
1404 if (convert_debugging
&& dhandle
!= NULL
)
1406 if (! write_debugging_info (obfd
, dhandle
, &symcount
, &osympp
))
1413 bfd_set_symtab (obfd
, osympp
, symcount
);
1415 /* This has to happen after the symbol table has been set. */
1416 bfd_map_over_sections (ibfd
, copy_section
, obfd
);
1418 if (add_sections
!= NULL
)
1420 struct section_add
*padd
;
1422 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
1424 if (! bfd_set_section_contents (obfd
, padd
->section
, padd
->contents
,
1427 bfd_nonfatal (bfd_get_filename (obfd
));
1433 if (gnu_debuglink_filename
!= NULL
)
1435 if (! bfd_fill_in_gnu_debuglink_section
1436 (obfd
, gnu_debuglink_section
, gnu_debuglink_filename
))
1438 bfd_nonfatal (gnu_debuglink_filename
);
1443 if (gap_fill_set
|| pad_to_set
)
1448 /* Fill in the gaps. */
1451 buf
= xmalloc (max_gap
);
1452 memset (buf
, gap_fill
, max_gap
);
1454 c
= bfd_count_sections (obfd
);
1455 for (i
= 0; i
< c
; i
++)
1463 off
= bfd_section_size (obfd
, osections
[i
]) - left
;
1474 if (! bfd_set_section_contents (obfd
, osections
[i
], buf
,
1477 bfd_nonfatal (bfd_get_filename (obfd
));
1488 /* Allow the BFD backend to copy any private data it understands
1489 from the input BFD to the output BFD. This is done last to
1490 permit the routine to look at the filtered symbol table, which is
1491 important for the ECOFF code at least. */
1492 if (bfd_get_flavour (ibfd
) == bfd_target_elf_flavour
1493 && strip_symbols
== STRIP_NONDEBUG
)
1494 /* Do not copy the private data when creating an ELF format
1495 debug info file. We do not want the program headers. */
1497 else if (! bfd_copy_private_bfd_data (ibfd
, obfd
))
1499 non_fatal (_("%s: error copying private BFD data: %s"),
1500 bfd_get_filename (obfd
),
1501 bfd_errmsg (bfd_get_error ()));
1505 /* Switch to the alternate machine code. We have to do this at the
1506 very end, because we only initialize the header when we create
1507 the first section. */
1508 if (use_alt_mach_code
!= 0
1509 && ! bfd_alt_mach_code (obfd
, use_alt_mach_code
))
1510 non_fatal (_("unknown alternate machine code, ignored"));
1516 #if defined (_WIN32) && !defined (__CYGWIN32__)
1517 #define MKDIR(DIR, MODE) mkdir (DIR)
1519 #define MKDIR(DIR, MODE) mkdir (DIR, MODE)
1522 /* Read each archive element in turn from IBFD, copy the
1523 contents to temp file, and keep the temp file handle. */
1526 copy_archive (bfd
*ibfd
, bfd
*obfd
, const char *output_target
)
1530 struct name_list
*next
;
1534 bfd
**ptr
= &obfd
->archive_head
;
1536 char *dir
= make_tempname (bfd_get_filename (obfd
));
1538 /* Make a temp directory to hold the contents. */
1539 if (MKDIR (dir
, 0700) != 0)
1540 fatal (_("cannot mkdir %s for archive copying (error: %s)"),
1541 dir
, strerror (errno
));
1543 obfd
->has_armap
= ibfd
->has_armap
;
1547 this_element
= bfd_openr_next_archived_file (ibfd
, NULL
);
1549 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1550 RETURN_NONFATAL (bfd_get_filename (obfd
));
1552 while (!status
&& this_element
!= NULL
)
1558 int stat_status
= 0;
1559 bfd_boolean
delete = TRUE
;
1561 /* Create an output file for this member. */
1562 output_name
= concat (dir
, "/",
1563 bfd_get_filename (this_element
), (char *) 0);
1565 /* If the file already exists, make another temp dir. */
1566 if (stat (output_name
, &buf
) >= 0)
1568 output_name
= make_tempname (output_name
);
1569 if (MKDIR (output_name
, 0700) != 0)
1570 fatal (_("cannot mkdir %s for archive copying (error: %s)"),
1571 output_name
, strerror (errno
));
1573 l
= xmalloc (sizeof (struct name_list
));
1574 l
->name
= output_name
;
1578 output_name
= concat (output_name
, "/",
1579 bfd_get_filename (this_element
), (char *) 0);
1582 output_bfd
= bfd_openw (output_name
, output_target
);
1585 stat_status
= bfd_stat_arch_elt (this_element
, &buf
);
1587 if (stat_status
!= 0)
1588 non_fatal (_("internal stat error on %s"),
1589 bfd_get_filename (this_element
));
1592 l
= xmalloc (sizeof (struct name_list
));
1593 l
->name
= output_name
;
1597 if (output_bfd
== NULL
)
1598 RETURN_NONFATAL (output_name
);
1600 if (bfd_check_format (this_element
, bfd_object
))
1601 delete = ! copy_object (this_element
, output_bfd
);
1603 if (!bfd_close (output_bfd
))
1605 bfd_nonfatal (bfd_get_filename (output_bfd
));
1606 /* Error in new object file. Don't change archive. */
1612 unlink (output_name
);
1617 if (preserve_dates
&& stat_status
== 0)
1618 set_times (output_name
, &buf
);
1620 /* Open the newly output file and attach to our list. */
1621 output_bfd
= bfd_openr (output_name
, output_target
);
1623 l
->obfd
= output_bfd
;
1626 ptr
= &output_bfd
->next
;
1628 last_element
= this_element
;
1630 this_element
= bfd_openr_next_archived_file (ibfd
, last_element
);
1632 bfd_close (last_element
);
1637 if (!bfd_close (obfd
))
1638 RETURN_NONFATAL (bfd_get_filename (obfd
));
1640 if (!bfd_close (ibfd
))
1641 RETURN_NONFATAL (bfd_get_filename (ibfd
));
1643 /* Delete all the files that we opened. */
1644 for (l
= list
; l
!= NULL
; l
= l
->next
)
1646 if (l
->obfd
== NULL
)
1650 bfd_close (l
->obfd
);
1657 /* The top-level control. */
1660 copy_file (const char *input_filename
, const char *output_filename
,
1661 const char *input_target
, const char *output_target
)
1664 char **obj_matching
;
1665 char **core_matching
;
1667 if (get_file_size (input_filename
) < 1)
1673 /* To allow us to do "strip *" without dying on the first
1674 non-object file, failures are nonfatal. */
1675 ibfd
= bfd_openr (input_filename
, input_target
);
1677 RETURN_NONFATAL (input_filename
);
1679 if (bfd_check_format (ibfd
, bfd_archive
))
1683 /* bfd_get_target does not return the correct value until
1684 bfd_check_format succeeds. */
1685 if (output_target
== NULL
)
1686 output_target
= bfd_get_target (ibfd
);
1688 obfd
= bfd_openw (output_filename
, output_target
);
1690 RETURN_NONFATAL (output_filename
);
1692 copy_archive (ibfd
, obfd
, output_target
);
1694 else if (bfd_check_format_matches (ibfd
, bfd_object
, &obj_matching
))
1700 /* bfd_get_target does not return the correct value until
1701 bfd_check_format succeeds. */
1702 if (output_target
== NULL
)
1703 output_target
= bfd_get_target (ibfd
);
1705 obfd
= bfd_openw (output_filename
, output_target
);
1707 RETURN_NONFATAL (output_filename
);
1709 delete = ! copy_object (ibfd
, obfd
);
1711 if (!bfd_close (obfd
))
1712 RETURN_NONFATAL (output_filename
);
1714 if (!bfd_close (ibfd
))
1715 RETURN_NONFATAL (input_filename
);
1719 unlink (output_filename
);
1725 bfd_error_type obj_error
= bfd_get_error ();
1726 bfd_error_type core_error
;
1728 if (bfd_check_format_matches (ibfd
, bfd_core
, &core_matching
))
1730 /* This probably can't happen.. */
1731 if (obj_error
== bfd_error_file_ambiguously_recognized
)
1732 free (obj_matching
);
1736 core_error
= bfd_get_error ();
1737 /* Report the object error in preference to the core error. */
1738 if (obj_error
!= core_error
)
1739 bfd_set_error (obj_error
);
1741 bfd_nonfatal (input_filename
);
1743 if (obj_error
== bfd_error_file_ambiguously_recognized
)
1745 list_matching_formats (obj_matching
);
1746 free (obj_matching
);
1748 if (core_error
== bfd_error_file_ambiguously_recognized
)
1750 list_matching_formats (core_matching
);
1751 free (core_matching
);
1758 /* Add a name to the section renaming list. */
1761 add_section_rename (const char * old_name
, const char * new_name
,
1764 section_rename
* rename
;
1766 /* Check for conflicts first. */
1767 for (rename
= section_rename_list
; rename
!= NULL
; rename
= rename
->next
)
1768 if (strcmp (rename
->old_name
, old_name
) == 0)
1770 /* Silently ignore duplicate definitions. */
1771 if (strcmp (rename
->new_name
, new_name
) == 0
1772 && rename
->flags
== flags
)
1775 fatal (_("Multiple renames of section %s"), old_name
);
1778 rename
= xmalloc (sizeof (* rename
));
1780 rename
->old_name
= old_name
;
1781 rename
->new_name
= new_name
;
1782 rename
->flags
= flags
;
1783 rename
->next
= section_rename_list
;
1785 section_rename_list
= rename
;
1788 /* Check the section rename list for a new name of the input section
1789 ISECTION. Return the new name if one is found.
1790 Also set RETURNED_FLAGS to the flags to be used for this section. */
1793 find_section_rename (bfd
* ibfd ATTRIBUTE_UNUSED
, sec_ptr isection
,
1794 flagword
* returned_flags
)
1796 const char * old_name
= bfd_section_name (ibfd
, isection
);
1797 section_rename
* rename
;
1799 /* Default to using the flags of the input section. */
1800 * returned_flags
= bfd_get_section_flags (ibfd
, isection
);
1802 for (rename
= section_rename_list
; rename
!= NULL
; rename
= rename
->next
)
1803 if (strcmp (rename
->old_name
, old_name
) == 0)
1805 if (rename
->flags
!= (flagword
) -1)
1806 * returned_flags
= rename
->flags
;
1808 return rename
->new_name
;
1814 /* Once each of the sections is copied, we may still need to do some
1815 finalization work for private section headers. Do that here. */
1818 setup_bfd_headers (bfd
*ibfd
, bfd
*obfd
)
1822 /* Allow the BFD backend to copy any private data it understands
1823 from the input section to the output section. */
1824 if (! bfd_copy_private_header_data (ibfd
, obfd
))
1826 err
= _("private header data");
1830 /* All went well. */
1834 non_fatal (_("%s: error in %s: %s"),
1835 bfd_get_filename (ibfd
),
1836 err
, bfd_errmsg (bfd_get_error ()));
1840 /* Create a section in OBFD with the same
1841 name and attributes as ISECTION in IBFD. */
1844 setup_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
1846 bfd
*obfd
= obfdarg
;
1847 struct section_list
*p
;
1855 char *prefix
= NULL
;
1857 if (is_strip_section (ibfd
, isection
))
1860 p
= find_section_list (bfd_section_name (ibfd
, isection
), FALSE
);
1864 /* Get the, possibly new, name of the output section. */
1865 name
= find_section_rename (ibfd
, isection
, & flags
);
1867 /* Prefix sections. */
1868 if ((prefix_alloc_sections_string
)
1869 && (bfd_get_section_flags (ibfd
, isection
) & SEC_ALLOC
))
1870 prefix
= prefix_alloc_sections_string
;
1871 else if (prefix_sections_string
)
1872 prefix
= prefix_sections_string
;
1878 n
= xmalloc (strlen (prefix
) + strlen (name
) + 1);
1884 osection
= bfd_make_section_anyway (obfd
, name
);
1886 if (osection
== NULL
)
1892 size
= bfd_section_size (ibfd
, isection
);
1894 size
= (size
+ interleave
- 1) / interleave
;
1895 if (! bfd_set_section_size (obfd
, osection
, size
))
1901 vma
= bfd_section_vma (ibfd
, isection
);
1902 if (p
!= NULL
&& p
->change_vma
== CHANGE_MODIFY
)
1904 else if (p
!= NULL
&& p
->change_vma
== CHANGE_SET
)
1907 vma
+= change_section_address
;
1909 if (! bfd_set_section_vma (obfd
, osection
, vma
))
1915 lma
= isection
->lma
;
1916 if ((p
!= NULL
) && p
->change_lma
!= CHANGE_IGNORE
)
1918 if (p
->change_lma
== CHANGE_MODIFY
)
1920 else if (p
->change_lma
== CHANGE_SET
)
1926 lma
+= change_section_address
;
1928 osection
->lma
= lma
;
1930 /* FIXME: This is probably not enough. If we change the LMA we
1931 may have to recompute the header for the file as well. */
1932 if (!bfd_set_section_alignment (obfd
,
1934 bfd_section_alignment (ibfd
, isection
)))
1936 err
= _("alignment");
1940 if (p
!= NULL
&& p
->set_flags
)
1941 flags
= p
->flags
| (flags
& (SEC_HAS_CONTENTS
| SEC_RELOC
));
1942 else if (strip_symbols
== STRIP_NONDEBUG
&& (flags
& SEC_ALLOC
) != 0)
1944 flags
&= ~(SEC_HAS_CONTENTS
| SEC_LOAD
);
1945 if (obfd
->xvec
->flavour
== bfd_target_elf_flavour
)
1946 elf_section_type (osection
) = SHT_NOBITS
;
1949 if (!bfd_set_section_flags (obfd
, osection
, flags
))
1955 /* Copy merge entity size. */
1956 osection
->entsize
= isection
->entsize
;
1958 /* This used to be mangle_section; we do here to avoid using
1959 bfd_get_section_by_name since some formats allow multiple
1960 sections with the same name. */
1961 isection
->output_section
= osection
;
1962 isection
->output_offset
= 0;
1964 /* Allow the BFD backend to copy any private data it understands
1965 from the input section to the output section. */
1966 if (bfd_get_flavour (ibfd
) == bfd_target_elf_flavour
1967 && strip_symbols
== STRIP_NONDEBUG
)
1968 /* Do not copy the private data when creating an ELF format
1969 debug info file. We do not want the program headers. */
1971 else if (!bfd_copy_private_section_data (ibfd
, isection
, obfd
, osection
))
1973 err
= _("private data");
1977 /* All went well. */
1981 non_fatal (_("%s: section `%s': error in %s: %s"),
1982 bfd_get_filename (ibfd
),
1983 bfd_section_name (ibfd
, isection
),
1984 err
, bfd_errmsg (bfd_get_error ()));
1988 /* Copy the data of input section ISECTION of IBFD
1989 to an output section with the same name in OBFD.
1990 If stripping then don't copy any relocation info. */
1993 copy_section (bfd
*ibfd
, sec_ptr isection
, void *obfdarg
)
1995 bfd
*obfd
= obfdarg
;
1996 struct section_list
*p
;
2004 /* If we have already failed earlier on,
2005 do not keep on generating complaints now. */
2009 if (is_strip_section (ibfd
, isection
))
2012 flags
= bfd_get_section_flags (ibfd
, isection
);
2013 if ((flags
& SEC_GROUP
) != 0)
2016 osection
= isection
->output_section
;
2017 size
= bfd_get_section_size (isection
);
2019 if (size
== 0 || osection
== 0)
2022 p
= find_section_list (bfd_get_section_name (ibfd
, isection
), FALSE
);
2024 /* Core files do not need to be relocated. */
2025 if (bfd_get_format (obfd
) == bfd_core
)
2029 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
2033 /* Do not complain if the target does not support relocations. */
2034 if (relsize
== -1 && bfd_get_error () == bfd_error_invalid_operation
)
2037 RETURN_NONFATAL (bfd_get_filename (ibfd
));
2042 bfd_set_reloc (obfd
, osection
, NULL
, 0);
2045 relpp
= xmalloc (relsize
);
2046 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, isympp
);
2048 RETURN_NONFATAL (bfd_get_filename (ibfd
));
2050 if (strip_symbols
== STRIP_ALL
)
2052 /* Remove relocations which are not in
2053 keep_strip_specific_list. */
2054 arelent
**temp_relpp
;
2055 long temp_relcount
= 0;
2058 temp_relpp
= xmalloc (relsize
);
2059 for (i
= 0; i
< relcount
; i
++)
2060 if (is_specified_symbol (bfd_asymbol_name (*relpp
[i
]->sym_ptr_ptr
),
2061 keep_specific_list
))
2062 temp_relpp
[temp_relcount
++] = relpp
[i
];
2063 relcount
= temp_relcount
;
2068 bfd_set_reloc (obfd
, osection
, relcount
== 0 ? NULL
: relpp
, relcount
);
2073 if (bfd_get_section_flags (ibfd
, isection
) & SEC_HAS_CONTENTS
2074 && bfd_get_section_flags (obfd
, osection
) & SEC_HAS_CONTENTS
)
2076 void *memhunk
= xmalloc (size
);
2078 if (!bfd_get_section_contents (ibfd
, isection
, memhunk
, 0, size
))
2079 RETURN_NONFATAL (bfd_get_filename (ibfd
));
2083 /* Keep only every `copy_byte'th byte in MEMHUNK. */
2084 char *from
= (char *) memhunk
+ copy_byte
;
2086 char *end
= (char *) memhunk
+ size
;
2088 for (; from
< end
; from
+= interleave
)
2091 size
= (size
+ interleave
- 1 - copy_byte
) / interleave
;
2092 osection
->lma
/= interleave
;
2095 if (!bfd_set_section_contents (obfd
, osection
, memhunk
, 0, size
))
2096 RETURN_NONFATAL (bfd_get_filename (obfd
));
2100 else if (p
!= NULL
&& p
->set_flags
&& (p
->flags
& SEC_HAS_CONTENTS
) != 0)
2102 void *memhunk
= xmalloc (size
);
2104 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
2105 flag--they can just remove the section entirely and add it
2106 back again. However, we do permit them to turn on the
2107 SEC_HAS_CONTENTS flag, and take it to mean that the section
2108 contents should be zeroed out. */
2110 memset (memhunk
, 0, size
);
2111 if (! bfd_set_section_contents (obfd
, osection
, memhunk
, 0, size
))
2112 RETURN_NONFATAL (bfd_get_filename (obfd
));
2117 /* Get all the sections. This is used when --gap-fill or --pad-to is
2121 get_sections (bfd
*obfd ATTRIBUTE_UNUSED
, asection
*osection
, void *secppparg
)
2123 asection
***secppp
= secppparg
;
2125 **secppp
= osection
;
2129 /* Sort sections by VMA. This is called via qsort, and is used when
2130 --gap-fill or --pad-to is used. We force non loadable or empty
2131 sections to the front, where they are easier to ignore. */
2134 compare_section_lma (const void *arg1
, const void *arg2
)
2136 const asection
*const *sec1
= arg1
;
2137 const asection
*const *sec2
= arg2
;
2138 flagword flags1
, flags2
;
2140 /* Sort non loadable sections to the front. */
2141 flags1
= (*sec1
)->flags
;
2142 flags2
= (*sec2
)->flags
;
2143 if ((flags1
& SEC_HAS_CONTENTS
) == 0
2144 || (flags1
& SEC_LOAD
) == 0)
2146 if ((flags2
& SEC_HAS_CONTENTS
) != 0
2147 && (flags2
& SEC_LOAD
) != 0)
2152 if ((flags2
& SEC_HAS_CONTENTS
) == 0
2153 || (flags2
& SEC_LOAD
) == 0)
2157 /* Sort sections by LMA. */
2158 if ((*sec1
)->lma
> (*sec2
)->lma
)
2160 else if ((*sec1
)->lma
< (*sec2
)->lma
)
2163 /* Sort sections with the same LMA by size. */
2164 if (bfd_get_section_size (*sec1
) > bfd_get_section_size (*sec2
))
2166 else if (bfd_get_section_size (*sec1
) < bfd_get_section_size (*sec2
))
2172 /* Mark all the symbols which will be used in output relocations with
2173 the BSF_KEEP flag so that those symbols will not be stripped.
2175 Ignore relocations which will not appear in the output file. */
2178 mark_symbols_used_in_relocations (bfd
*ibfd
, sec_ptr isection
, void *symbolsarg
)
2180 asymbol
**symbols
= symbolsarg
;
2185 /* Ignore an input section with no corresponding output section. */
2186 if (isection
->output_section
== NULL
)
2189 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
2192 /* Do not complain if the target does not support relocations. */
2193 if (relsize
== -1 && bfd_get_error () == bfd_error_invalid_operation
)
2195 bfd_fatal (bfd_get_filename (ibfd
));
2201 relpp
= xmalloc (relsize
);
2202 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, symbols
);
2204 bfd_fatal (bfd_get_filename (ibfd
));
2206 /* Examine each symbol used in a relocation. If it's not one of the
2207 special bfd section symbols, then mark it with BSF_KEEP. */
2208 for (i
= 0; i
< relcount
; i
++)
2210 if (*relpp
[i
]->sym_ptr_ptr
!= bfd_com_section_ptr
->symbol
2211 && *relpp
[i
]->sym_ptr_ptr
!= bfd_abs_section_ptr
->symbol
2212 && *relpp
[i
]->sym_ptr_ptr
!= bfd_und_section_ptr
->symbol
)
2213 (*relpp
[i
]->sym_ptr_ptr
)->flags
|= BSF_KEEP
;
2220 /* Write out debugging information. */
2223 write_debugging_info (bfd
*obfd
, void *dhandle
,
2224 long *symcountp ATTRIBUTE_UNUSED
,
2225 asymbol
***symppp ATTRIBUTE_UNUSED
)
2227 if (bfd_get_flavour (obfd
) == bfd_target_ieee_flavour
)
2228 return write_ieee_debugging_info (obfd
, dhandle
);
2230 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
2231 || bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
2233 bfd_byte
*syms
, *strings
;
2234 bfd_size_type symsize
, stringsize
;
2235 asection
*stabsec
, *stabstrsec
;
2237 if (! write_stabs_in_sections_debugging_info (obfd
, dhandle
, &syms
,
2242 stabsec
= bfd_make_section (obfd
, ".stab");
2243 stabstrsec
= bfd_make_section (obfd
, ".stabstr");
2245 || stabstrsec
== NULL
2246 || ! bfd_set_section_size (obfd
, stabsec
, symsize
)
2247 || ! bfd_set_section_size (obfd
, stabstrsec
, stringsize
)
2248 || ! bfd_set_section_alignment (obfd
, stabsec
, 2)
2249 || ! bfd_set_section_alignment (obfd
, stabstrsec
, 0)
2250 || ! bfd_set_section_flags (obfd
, stabsec
,
2254 || ! bfd_set_section_flags (obfd
, stabstrsec
,
2259 non_fatal (_("%s: can't create debugging section: %s"),
2260 bfd_get_filename (obfd
),
2261 bfd_errmsg (bfd_get_error ()));
2265 /* We can get away with setting the section contents now because
2266 the next thing the caller is going to do is copy over the
2267 real sections. We may someday have to split the contents
2268 setting out of this function. */
2269 if (! bfd_set_section_contents (obfd
, stabsec
, syms
, 0, symsize
)
2270 || ! bfd_set_section_contents (obfd
, stabstrsec
, strings
, 0,
2273 non_fatal (_("%s: can't set debugging section contents: %s"),
2274 bfd_get_filename (obfd
),
2275 bfd_errmsg (bfd_get_error ()));
2282 non_fatal (_("%s: don't know how to write debugging information for %s"),
2283 bfd_get_filename (obfd
), bfd_get_target (obfd
));
2288 strip_main (int argc
, char *argv
[])
2290 char *input_target
= NULL
;
2291 char *output_target
= NULL
;
2292 bfd_boolean show_version
= FALSE
;
2293 bfd_boolean formats_info
= FALSE
;
2296 struct section_list
*p
;
2297 char *output_file
= NULL
;
2299 while ((c
= getopt_long (argc
, argv
, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
2300 strip_options
, (int *) 0)) != EOF
)
2305 input_target
= optarg
;
2308 output_target
= optarg
;
2311 input_target
= output_target
= optarg
;
2314 p
= find_section_list (optarg
, TRUE
);
2316 sections_removed
= TRUE
;
2319 strip_symbols
= STRIP_ALL
;
2323 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
2324 strip_symbols
= STRIP_DEBUG
;
2326 case OPTION_STRIP_UNNEEDED
:
2327 strip_symbols
= STRIP_UNNEEDED
;
2330 add_specific_symbol (optarg
, &keep_specific_list
);
2333 add_specific_symbol (optarg
, &strip_specific_list
);
2336 output_file
= optarg
;
2339 preserve_dates
= TRUE
;
2342 discard_locals
= LOCALS_ALL
;
2345 discard_locals
= LOCALS_START_L
;
2351 show_version
= TRUE
;
2353 case OPTION_FORMATS_INFO
:
2354 formats_info
= TRUE
;
2356 case OPTION_ONLY_KEEP_DEBUG
:
2357 strip_symbols
= STRIP_NONDEBUG
;
2360 /* We've been given a long option. */
2367 strip_usage (stdout
, 0);
2369 strip_usage (stderr
, 1);
2380 print_version ("strip");
2382 /* Default is to strip all symbols. */
2383 if (strip_symbols
== STRIP_UNDEF
2384 && discard_locals
== LOCALS_UNDEF
2385 && strip_specific_list
== NULL
)
2386 strip_symbols
= STRIP_ALL
;
2388 if (output_target
== NULL
)
2389 output_target
= input_target
;
2393 || (output_file
!= NULL
&& (i
+ 1) < argc
))
2394 strip_usage (stderr
, 1);
2396 for (; i
< argc
; i
++)
2398 int hold_status
= status
;
2399 struct stat statbuf
;
2402 if (get_file_size (argv
[i
]) < 1)
2406 /* No need to check the return value of stat().
2407 It has already been checked in get_file_size(). */
2408 stat (argv
[i
], &statbuf
);
2410 if (output_file
!= NULL
)
2411 tmpname
= output_file
;
2413 tmpname
= make_tempname (argv
[i
]);
2416 copy_file (argv
[i
], tmpname
, input_target
, output_target
);
2420 set_times (tmpname
, &statbuf
);
2421 if (output_file
== NULL
)
2422 smart_rename (tmpname
, argv
[i
], preserve_dates
);
2423 status
= hold_status
;
2427 if (output_file
== NULL
)
2435 copy_main (int argc
, char *argv
[])
2437 char * binary_architecture
= NULL
;
2438 char *input_filename
= NULL
;
2439 char *output_filename
= NULL
;
2440 char *input_target
= NULL
;
2441 char *output_target
= NULL
;
2442 bfd_boolean show_version
= FALSE
;
2443 bfd_boolean change_warn
= TRUE
;
2444 bfd_boolean formats_info
= FALSE
;
2446 struct section_list
*p
;
2447 struct stat statbuf
;
2449 while ((c
= getopt_long (argc
, argv
, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
2450 copy_options
, (int *) 0)) != EOF
)
2455 copy_byte
= atoi (optarg
);
2457 fatal (_("byte number must be non-negative"));
2461 binary_architecture
= optarg
;
2465 interleave
= atoi (optarg
);
2467 fatal (_("interleave must be positive"));
2471 case 's': /* "source" - 'I' is preferred */
2472 input_target
= optarg
;
2476 case 'd': /* "destination" - 'O' is preferred */
2477 output_target
= optarg
;
2481 input_target
= output_target
= optarg
;
2485 p
= find_section_list (optarg
, TRUE
);
2487 fatal (_("%s both copied and removed"), optarg
);
2489 sections_copied
= TRUE
;
2493 p
= find_section_list (optarg
, TRUE
);
2495 fatal (_("%s both copied and removed"), optarg
);
2497 sections_removed
= TRUE
;
2501 strip_symbols
= STRIP_ALL
;
2505 strip_symbols
= STRIP_DEBUG
;
2508 case OPTION_STRIP_UNNEEDED
:
2509 strip_symbols
= STRIP_UNNEEDED
;
2512 case OPTION_ONLY_KEEP_DEBUG
:
2513 strip_symbols
= STRIP_NONDEBUG
;
2516 case OPTION_ADD_GNU_DEBUGLINK
:
2517 gnu_debuglink_filename
= optarg
;
2521 add_specific_symbol (optarg
, &keep_specific_list
);
2525 add_specific_symbol (optarg
, &strip_specific_list
);
2529 add_specific_symbol (optarg
, &localize_specific_list
);
2533 add_specific_symbol (optarg
, &keepglobal_specific_list
);
2537 add_specific_symbol (optarg
, &weaken_specific_list
);
2541 preserve_dates
= TRUE
;
2549 discard_locals
= LOCALS_ALL
;
2553 discard_locals
= LOCALS_START_L
;
2561 show_version
= TRUE
;
2564 case OPTION_FORMATS_INFO
:
2565 formats_info
= TRUE
;
2572 case OPTION_ADD_SECTION
:
2576 struct section_add
*pa
;
2581 s
= strchr (optarg
, '=');
2584 fatal (_("bad format for %s"), "--add-section");
2586 size
= get_file_size (s
+ 1);
2590 pa
= xmalloc (sizeof (struct section_add
));
2593 name
= xmalloc (len
+ 1);
2594 strncpy (name
, optarg
, len
);
2598 pa
->filename
= s
+ 1;
2600 pa
->contents
= xmalloc (size
);
2602 f
= fopen (pa
->filename
, FOPEN_RB
);
2605 fatal (_("cannot open: %s: %s"),
2606 pa
->filename
, strerror (errno
));
2608 if (fread (pa
->contents
, 1, pa
->size
, f
) == 0
2610 fatal (_("%s: fread failed"), pa
->filename
);
2614 pa
->next
= add_sections
;
2619 case OPTION_CHANGE_START
:
2620 change_start
= parse_vma (optarg
, "--change-start");
2623 case OPTION_CHANGE_SECTION_ADDRESS
:
2624 case OPTION_CHANGE_SECTION_LMA
:
2625 case OPTION_CHANGE_SECTION_VMA
:
2630 char *option
= NULL
;
2632 enum change_action what
= CHANGE_IGNORE
;
2636 case OPTION_CHANGE_SECTION_ADDRESS
:
2637 option
= "--change-section-address";
2639 case OPTION_CHANGE_SECTION_LMA
:
2640 option
= "--change-section-lma";
2642 case OPTION_CHANGE_SECTION_VMA
:
2643 option
= "--change-section-vma";
2647 s
= strchr (optarg
, '=');
2650 s
= strchr (optarg
, '+');
2653 s
= strchr (optarg
, '-');
2655 fatal (_("bad format for %s"), option
);
2660 name
= xmalloc (len
+ 1);
2661 strncpy (name
, optarg
, len
);
2664 p
= find_section_list (name
, TRUE
);
2666 val
= parse_vma (s
+ 1, option
);
2670 case '=': what
= CHANGE_SET
; break;
2671 case '-': val
= - val
; /* Drop through. */
2672 case '+': what
= CHANGE_MODIFY
; break;
2677 case OPTION_CHANGE_SECTION_ADDRESS
:
2678 p
->change_vma
= what
;
2682 case OPTION_CHANGE_SECTION_LMA
:
2683 p
->change_lma
= what
;
2687 case OPTION_CHANGE_SECTION_VMA
:
2688 p
->change_vma
= what
;
2695 case OPTION_CHANGE_ADDRESSES
:
2696 change_section_address
= parse_vma (optarg
, "--change-addresses");
2697 change_start
= change_section_address
;
2700 case OPTION_CHANGE_WARNINGS
:
2704 case OPTION_CHANGE_LEADING_CHAR
:
2705 change_leading_char
= TRUE
;
2708 case OPTION_DEBUGGING
:
2709 convert_debugging
= TRUE
;
2712 case OPTION_GAP_FILL
:
2714 bfd_vma gap_fill_vma
;
2716 gap_fill_vma
= parse_vma (optarg
, "--gap-fill");
2717 gap_fill
= (bfd_byte
) gap_fill_vma
;
2718 if ((bfd_vma
) gap_fill
!= gap_fill_vma
)
2722 sprintf_vma (buff
, gap_fill_vma
);
2724 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
2727 gap_fill_set
= TRUE
;
2731 case OPTION_NO_CHANGE_WARNINGS
:
2732 change_warn
= FALSE
;
2736 pad_to
= parse_vma (optarg
, "--pad-to");
2740 case OPTION_REMOVE_LEADING_CHAR
:
2741 remove_leading_char
= TRUE
;
2744 case OPTION_REDEFINE_SYM
:
2746 /* Push this redefinition onto redefine_symbol_list. */
2750 const char *nextarg
;
2751 char *source
, *target
;
2753 s
= strchr (optarg
, '=');
2755 fatal (_("bad format for %s"), "--redefine-sym");
2758 source
= xmalloc (len
+ 1);
2759 strncpy (source
, optarg
, len
);
2763 len
= strlen (nextarg
);
2764 target
= xmalloc (len
+ 1);
2765 strcpy (target
, nextarg
);
2767 redefine_list_append ("--redefine-sym", source
, target
);
2774 case OPTION_REDEFINE_SYMS
:
2775 add_redefine_syms_file (optarg
);
2778 case OPTION_SET_SECTION_FLAGS
:
2784 s
= strchr (optarg
, '=');
2786 fatal (_("bad format for %s"), "--set-section-flags");
2789 name
= xmalloc (len
+ 1);
2790 strncpy (name
, optarg
, len
);
2793 p
= find_section_list (name
, TRUE
);
2795 p
->set_flags
= TRUE
;
2796 p
->flags
= parse_flags (s
+ 1);
2800 case OPTION_RENAME_SECTION
:
2803 const char *eq
, *fl
;
2808 eq
= strchr (optarg
, '=');
2810 fatal (_("bad format for %s"), "--rename-section");
2814 fatal (_("bad format for %s"), "--rename-section");
2816 old_name
= xmalloc (len
+ 1);
2817 strncpy (old_name
, optarg
, len
);
2821 fl
= strchr (eq
, ',');
2824 flags
= parse_flags (fl
+ 1);
2834 fatal (_("bad format for %s"), "--rename-section");
2836 new_name
= xmalloc (len
+ 1);
2837 strncpy (new_name
, eq
, len
);
2840 add_section_rename (old_name
, new_name
, flags
);
2844 case OPTION_SET_START
:
2845 set_start
= parse_vma (optarg
, "--set-start");
2846 set_start_set
= TRUE
;
2849 case OPTION_SREC_LEN
:
2850 Chunk
= parse_vma (optarg
, "--srec-len");
2853 case OPTION_SREC_FORCES3
:
2857 case OPTION_STRIP_SYMBOLS
:
2858 add_specific_symbols (optarg
, &strip_specific_list
);
2861 case OPTION_KEEP_SYMBOLS
:
2862 add_specific_symbols (optarg
, &keep_specific_list
);
2865 case OPTION_LOCALIZE_SYMBOLS
:
2866 add_specific_symbols (optarg
, &localize_specific_list
);
2869 case OPTION_KEEPGLOBAL_SYMBOLS
:
2870 add_specific_symbols (optarg
, &keepglobal_specific_list
);
2873 case OPTION_WEAKEN_SYMBOLS
:
2874 add_specific_symbols (optarg
, &weaken_specific_list
);
2877 case OPTION_ALT_MACH_CODE
:
2878 use_alt_mach_code
= atoi (optarg
);
2879 if (use_alt_mach_code
<= 0)
2880 fatal (_("alternate machine code index must be positive"));
2883 case OPTION_PREFIX_SYMBOLS
:
2884 prefix_symbols_string
= optarg
;
2887 case OPTION_PREFIX_SECTIONS
:
2888 prefix_sections_string
= optarg
;
2891 case OPTION_PREFIX_ALLOC_SECTIONS
:
2892 prefix_alloc_sections_string
= optarg
;
2895 case OPTION_READONLY_TEXT
:
2896 bfd_flags_to_set
|= WP_TEXT
;
2897 bfd_flags_to_clear
&= ~WP_TEXT
;
2900 case OPTION_WRITABLE_TEXT
:
2901 bfd_flags_to_clear
|= WP_TEXT
;
2902 bfd_flags_to_set
&= ~WP_TEXT
;
2906 bfd_flags_to_set
|= D_PAGED
;
2907 bfd_flags_to_clear
&= ~D_PAGED
;
2911 bfd_flags_to_clear
|= D_PAGED
;
2912 bfd_flags_to_set
&= ~D_PAGED
;
2916 /* We've been given a long option. */
2921 copy_usage (stdout
, 0);
2924 copy_usage (stderr
, 1);
2935 print_version ("objcopy");
2937 if (copy_byte
>= interleave
)
2938 fatal (_("byte number must be less than interleave"));
2940 if (optind
== argc
|| optind
+ 2 < argc
)
2941 copy_usage (stderr
, 1);
2943 input_filename
= argv
[optind
];
2944 if (optind
+ 1 < argc
)
2945 output_filename
= argv
[optind
+ 1];
2947 /* Default is to strip no symbols. */
2948 if (strip_symbols
== STRIP_UNDEF
&& discard_locals
== LOCALS_UNDEF
)
2949 strip_symbols
= STRIP_NONE
;
2951 if (output_target
== NULL
)
2952 output_target
= input_target
;
2954 if (binary_architecture
!= NULL
)
2956 if (input_target
&& strcmp (input_target
, "binary") == 0)
2958 const bfd_arch_info_type
* temp_arch_info
;
2960 temp_arch_info
= bfd_scan_arch (binary_architecture
);
2962 if (temp_arch_info
!= NULL
)
2964 bfd_external_binary_architecture
= temp_arch_info
->arch
;
2965 bfd_external_machine
= temp_arch_info
->mach
;
2968 fatal (_("architecture %s unknown"), binary_architecture
);
2972 non_fatal (_("Warning: input target 'binary' required for binary architecture parameter."));
2973 non_fatal (_(" Argument %s ignored"), binary_architecture
);
2978 if (stat (input_filename
, & statbuf
) < 0)
2979 fatal (_("warning: could not locate '%s'. System error message: %s"),
2980 input_filename
, strerror (errno
));
2982 /* If there is no destination file, or the source and destination files
2983 are the same, then create a temp and rename the result into the input. */
2984 if (output_filename
== NULL
|| strcmp (input_filename
, output_filename
) == 0)
2986 char *tmpname
= make_tempname (input_filename
);
2988 copy_file (input_filename
, tmpname
, input_target
, output_target
);
2992 set_times (tmpname
, &statbuf
);
2993 smart_rename (tmpname
, input_filename
, preserve_dates
);
3000 copy_file (input_filename
, output_filename
, input_target
, output_target
);
3002 if (status
== 0 && preserve_dates
)
3003 set_times (output_filename
, &statbuf
);
3008 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
3012 if (p
->change_vma
!= CHANGE_IGNORE
)
3016 sprintf_vma (buff
, p
->vma_val
);
3018 /* xgettext:c-format */
3019 non_fatal (_("%s %s%c0x%s never used"),
3020 "--change-section-vma",
3022 p
->change_vma
== CHANGE_SET
? '=' : '+',
3026 if (p
->change_lma
!= CHANGE_IGNORE
)
3030 sprintf_vma (buff
, p
->lma_val
);
3032 /* xgettext:c-format */
3033 non_fatal (_("%s %s%c0x%s never used"),
3034 "--change-section-lma",
3036 p
->change_lma
== CHANGE_SET
? '=' : '+',
3047 main (int argc
, char *argv
[])
3049 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
3050 setlocale (LC_MESSAGES
, "");
3052 #if defined (HAVE_SETLOCALE)
3053 setlocale (LC_CTYPE
, "");
3055 bindtextdomain (PACKAGE
, LOCALEDIR
);
3056 textdomain (PACKAGE
);
3058 program_name
= argv
[0];
3059 xmalloc_set_program_name (program_name
);
3061 START_PROGRESS (program_name
, 0);
3063 strip_symbols
= STRIP_UNDEF
;
3064 discard_locals
= LOCALS_UNDEF
;
3067 set_default_bfd_target ();
3071 int i
= strlen (program_name
);
3072 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3073 /* Drop the .exe suffix, if any. */
3074 if (i
> 4 && FILENAME_CMP (program_name
+ i
- 4, ".exe") == 0)
3077 program_name
[i
] = '\0';
3080 is_strip
= (i
>= 5 && FILENAME_CMP (program_name
+ i
- 5, "strip") == 0);
3084 strip_main (argc
, argv
);
3086 copy_main (argc
, argv
);
3088 END_PROGRESS (program_name
);