* objcopy.c (reverse_bytes): New variable.
[deliverable/binutils-gdb.git] / binutils / objcopy.c
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.
5
6 This file is part of GNU Binutils.
7
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.
12
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.
17
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
21 02110-1301, USA. */
22 \f
23 #include "bfd.h"
24 #include "progress.h"
25 #include "bucomm.h"
26 #include "getopt.h"
27 #include "libiberty.h"
28 #include "budbg.h"
29 #include "filenames.h"
30 #include "fnmatch.h"
31 #include "elf-bfd.h"
32 #include <sys/stat.h>
33 #include "libbfd.h"
34
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
38 deleted. */
39
40 struct symlist
41 {
42 const char *name;
43 struct symlist *next;
44 };
45
46 /* A list to support redefine_sym. */
47 struct redefine_node
48 {
49 char *source;
50 char *target;
51 struct redefine_node *next;
52 };
53
54 typedef struct section_rename
55 {
56 const char * old_name;
57 const char * new_name;
58 flagword flags;
59 struct section_rename * next;
60 }
61 section_rename;
62
63 /* List of sections to be renamed. */
64 static section_rename *section_rename_list;
65
66 #define RETURN_NONFATAL(s) {bfd_nonfatal (s); status = 1; return;}
67
68 static asymbol **isympp = NULL; /* Input symbols. */
69 static asymbol **osympp = NULL; /* Output symbols that survive stripping. */
70
71 /* If `copy_byte' >= 0, copy only that byte of every `interleave' bytes. */
72 static int copy_byte = -1;
73 static int interleave = 4;
74
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. */
78
79 enum strip_action
80 {
81 STRIP_UNDEF,
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. */
87 };
88
89 /* Which symbols to remove. */
90 static enum strip_action strip_symbols;
91
92 enum locals_action
93 {
94 LOCALS_UNDEF,
95 LOCALS_START_L, /* Discard locals starting with L. */
96 LOCALS_ALL /* Discard all locals. */
97 };
98
99 /* Which local symbols to remove. Overrides STRIP_ALL. */
100 static enum locals_action discard_locals;
101
102 /* What kind of change to perform. */
103 enum change_action
104 {
105 CHANGE_IGNORE,
106 CHANGE_MODIFY,
107 CHANGE_SET
108 };
109
110 /* Structure used to hold lists of sections and actions to take. */
111 struct section_list
112 {
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. */
124 };
125
126 static struct section_list *change_sections;
127
128 /* TRUE if some sections are to be removed. */
129 static bfd_boolean sections_removed;
130
131 /* TRUE if only some sections are to be copied. */
132 static bfd_boolean sections_copied;
133
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;
138
139 /* Changes to section addresses. */
140 static bfd_vma change_section_address = 0;
141
142 /* Filling gaps between sections. */
143 static bfd_boolean gap_fill_set = FALSE;
144 static bfd_byte gap_fill = 0;
145
146 /* Pad to a given address. */
147 static bfd_boolean pad_to_set = FALSE;
148 static bfd_vma pad_to;
149
150 /* Use alternative machine code? */
151 static unsigned long use_alt_mach_code = 0;
152
153 /* Output BFD flags user wants to set or clear */
154 static flagword bfd_flags_to_set;
155 static flagword bfd_flags_to_clear;
156
157 /* List of sections to add. */
158 struct section_add
159 {
160 /* Next section to add. */
161 struct section_add *next;
162 /* Name of section to add. */
163 const char *name;
164 /* Name of file holding section contents. */
165 const char *filename;
166 /* Size of file. */
167 size_t size;
168 /* Contents of file. */
169 bfd_byte *contents;
170 /* BFD section, after it has been added. */
171 asection *section;
172 };
173
174 /* List of sections to add to the output BFD. */
175 static struct section_add *add_sections;
176
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;
180
181 /* Whether to convert debugging information. */
182 static bfd_boolean convert_debugging = FALSE;
183
184 /* Whether to change the leading character in symbol names. */
185 static bfd_boolean change_leading_char = FALSE;
186
187 /* Whether to remove the leading character from global symbol names. */
188 static bfd_boolean remove_leading_char = FALSE;
189
190 /* Whether to permit wildcard in symbol comparison. */
191 static bfd_boolean wildcard = FALSE;
192
193 /* True if --localize-hidden is in effect. */
194 static bfd_boolean localize_hidden = FALSE;
195
196 /* List of symbols to strip, keep, localize, keep-global, weaken,
197 or redefine. */
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;
206
207 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
208 static bfd_boolean weaken = FALSE;
209
210 /* If this is TRUE, we retain BSF_FILE symbols. */
211 static bfd_boolean keep_file_symbols = FALSE;
212
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;
217
218 /* True if --extract-symbol was passed on the command line. */
219 static bfd_boolean extract_symbol = FALSE;
220
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;
224
225
226 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
227 enum command_line_switch
228 {
229 OPTION_ADD_SECTION=150,
230 OPTION_CHANGE_ADDRESSES,
231 OPTION_CHANGE_LEADING_CHAR,
232 OPTION_CHANGE_START,
233 OPTION_CHANGE_SECTION_ADDRESS,
234 OPTION_CHANGE_SECTION_LMA,
235 OPTION_CHANGE_SECTION_VMA,
236 OPTION_CHANGE_WARNINGS,
237 OPTION_DEBUGGING,
238 OPTION_GAP_FILL,
239 OPTION_NO_CHANGE_WARNINGS,
240 OPTION_PAD_TO,
241 OPTION_REMOVE_LEADING_CHAR,
242 OPTION_SET_SECTION_FLAGS,
243 OPTION_SET_START,
244 OPTION_STRIP_UNNEEDED,
245 OPTION_WEAKEN,
246 OPTION_REDEFINE_SYM,
247 OPTION_REDEFINE_SYMS,
248 OPTION_SREC_LEN,
249 OPTION_SREC_FORCES3,
250 OPTION_STRIP_SYMBOLS,
251 OPTION_STRIP_UNNEEDED_SYMBOL,
252 OPTION_STRIP_UNNEEDED_SYMBOLS,
253 OPTION_KEEP_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,
265 OPTION_FORMATS_INFO,
266 OPTION_ADD_GNU_DEBUGLINK,
267 OPTION_ONLY_KEEP_DEBUG,
268 OPTION_KEEP_FILE_SYMBOLS,
269 OPTION_READONLY_TEXT,
270 OPTION_WRITABLE_TEXT,
271 OPTION_PURE,
272 OPTION_IMPURE,
273 OPTION_EXTRACT_SYMBOL,
274 OPTION_REVERSE_BYTES
275 };
276
277 /* Options to handle if running as "strip". */
278
279 static struct option strip_options[] =
280 {
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}
305 };
306
307 /* Options to handle if running as "objcopy". */
308
309 static struct option copy_options[] =
310 {
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}
388 };
389
390 /* IMPORTS */
391 extern char *program_name;
392
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. */
396 extern int is_strip;
397
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;
401
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;
406
407 /* Defined in bfd/binary.c. Used to set architecture and machine of input
408 binary files. */
409 extern enum bfd_architecture bfd_external_binary_architecture;
410 extern unsigned long bfd_external_machine;
411
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 *);
421 \f
422 static void
423 copy_usage (FILE *stream, int exit_status)
424 {
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\
444 relocations\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\
484 listed in <file>\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\
490 in <file>\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\
505 section name\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\
511 "));
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);
515 exit (exit_status);
516 }
517
518 static void
519 strip_usage (FILE *stream, int exit_status)
520 {
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\
545 "));
546
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);
550 exit (exit_status);
551 }
552
553 /* Parse section flags into a flagword, with a fatal error if the
554 string can't be parsed. */
555
556 static flagword
557 parse_flags (const char *s)
558 {
559 flagword ret;
560 const char *snext;
561 int len;
562
563 ret = SEC_NO_FLAGS;
564
565 do
566 {
567 snext = strchr (s, ',');
568 if (snext == NULL)
569 len = strlen (s);
570 else
571 {
572 len = snext - s;
573 ++snext;
574 }
575
576 if (0) ;
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);
589 #undef PARSE_FLAG
590 else
591 {
592 char *copy;
593
594 copy = xmalloc (len + 1);
595 strncpy (copy, s, len);
596 copy[len] = '\0';
597 non_fatal (_("unrecognized section flag `%s'"), copy);
598 fatal (_("supported flags: %s"),
599 "alloc, load, noload, readonly, debug, code, data, rom, share, contents");
600 }
601
602 s = snext;
603 }
604 while (s != NULL);
605
606 return ret;
607 }
608
609 /* Find and optionally add an entry in the change_sections list. */
610
611 static struct section_list *
612 find_section_list (const char *name, bfd_boolean add)
613 {
614 struct section_list *p;
615
616 for (p = change_sections; p != NULL; p = p->next)
617 if (strcmp (p->name, name) == 0)
618 return p;
619
620 if (! add)
621 return NULL;
622
623 p = xmalloc (sizeof (struct section_list));
624 p->name = name;
625 p->used = FALSE;
626 p->remove = FALSE;
627 p->copy = FALSE;
628 p->change_vma = CHANGE_IGNORE;
629 p->change_lma = CHANGE_IGNORE;
630 p->vma_val = 0;
631 p->lma_val = 0;
632 p->set_flags = FALSE;
633 p->flags = 0;
634
635 p->next = change_sections;
636 change_sections = p;
637
638 return p;
639 }
640
641 /* Add a symbol to strip_specific_list. */
642
643 static void
644 add_specific_symbol (const char *name, struct symlist **list)
645 {
646 struct symlist *tmp_list;
647
648 tmp_list = xmalloc (sizeof (struct symlist));
649 tmp_list->name = name;
650 tmp_list->next = *list;
651 *list = tmp_list;
652 }
653
654 /* Add symbols listed in `filename' to strip_specific_list. */
655
656 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
657 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
658
659 static void
660 add_specific_symbols (const char *filename, struct symlist **list)
661 {
662 off_t size;
663 FILE * f;
664 char * line;
665 char * buffer;
666 unsigned int line_count;
667
668 size = get_file_size (filename);
669 if (size == 0)
670 {
671 status = 1;
672 return;
673 }
674
675 buffer = xmalloc (size + 2);
676 f = fopen (filename, FOPEN_RT);
677 if (f == NULL)
678 fatal (_("cannot open '%s': %s"), filename, strerror (errno));
679
680 if (fread (buffer, 1, size, f) == 0 || ferror (f))
681 fatal (_("%s: fread failed"), filename);
682
683 fclose (f);
684 buffer [size] = '\n';
685 buffer [size + 1] = '\0';
686
687 line_count = 1;
688
689 for (line = buffer; * line != '\0'; line ++)
690 {
691 char * eol;
692 char * name;
693 char * name_end;
694 int finished = FALSE;
695
696 for (eol = line;; eol ++)
697 {
698 switch (* eol)
699 {
700 case '\n':
701 * eol = '\0';
702 /* Cope with \n\r. */
703 if (eol[1] == '\r')
704 ++ eol;
705 finished = TRUE;
706 break;
707
708 case '\r':
709 * eol = '\0';
710 /* Cope with \r\n. */
711 if (eol[1] == '\n')
712 ++ eol;
713 finished = TRUE;
714 break;
715
716 case 0:
717 finished = TRUE;
718 break;
719
720 case '#':
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. */
724 * eol = '\0';
725 break;
726
727 default:
728 break;
729 }
730
731 if (finished)
732 break;
733 }
734
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 ++)
739 ;
740 for (name_end = name;
741 (! IS_WHITESPACE (* name_end))
742 && (! IS_LINE_TERMINATOR (* name_end));
743 name_end ++)
744 ;
745
746 if (! IS_LINE_TERMINATOR (* name_end))
747 {
748 char * extra;
749
750 for (extra = name_end + 1; IS_WHITESPACE (* extra); extra ++)
751 ;
752
753 if (! IS_LINE_TERMINATOR (* extra))
754 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
755 filename, line_count);
756 }
757
758 * name_end = '\0';
759
760 if (name_end > name)
761 add_specific_symbol (name, list);
762
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. */
765 line = eol;
766 line_count ++;
767 }
768 }
769
770 /* See whether a symbol should be stripped or kept based on
771 strip_specific_list and keep_symbols. */
772
773 static bfd_boolean
774 is_specified_symbol (const char *name, struct symlist *list)
775 {
776 struct symlist *tmp_list;
777
778 if (wildcard)
779 {
780 for (tmp_list = list; tmp_list; tmp_list = tmp_list->next)
781 if (*(tmp_list->name) != '!')
782 {
783 if (!fnmatch (tmp_list->name, name, 0))
784 return TRUE;
785 }
786 else
787 {
788 if (fnmatch (tmp_list->name + 1, name, 0))
789 return TRUE;
790 }
791 }
792 else
793 {
794 for (tmp_list = list; tmp_list; tmp_list = tmp_list->next)
795 if (strcmp (name, tmp_list->name) == 0)
796 return TRUE;
797 }
798
799 return FALSE;
800 }
801
802 /* Return a pointer to the symbol used as a signature for GROUP. */
803
804 static asymbol *
805 group_signature (asection *group)
806 {
807 bfd *abfd = group->owner;
808 Elf_Internal_Shdr *ghdr;
809
810 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
811 return NULL;
812
813 ghdr = &elf_section_data (group)->this_hdr;
814 if (ghdr->sh_link < elf_numsections (abfd))
815 {
816 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
817 Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link];
818
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];
822 }
823 return NULL;
824 }
825
826 /* See if a section is being removed. */
827
828 static bfd_boolean
829 is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
830 {
831 if (sections_removed || sections_copied)
832 {
833 struct section_list *p;
834
835 p = find_section_list (bfd_get_section_name (abfd, sec), FALSE);
836
837 if (sections_removed && p != NULL && p->remove)
838 return TRUE;
839 if (sections_copied && (p == NULL || ! p->copy))
840 return TRUE;
841 }
842
843 if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
844 {
845 if (strip_symbols == STRIP_DEBUG
846 || strip_symbols == STRIP_UNNEEDED
847 || strip_symbols == STRIP_ALL
848 || discard_locals == LOCALS_ALL
849 || convert_debugging)
850 return TRUE;
851
852 if (strip_symbols == STRIP_NONDEBUG)
853 return FALSE;
854 }
855
856 if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0)
857 {
858 asymbol *gsym;
859 const char *gname;
860
861 /* PR binutils/3166
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)
865 return TRUE;
866
867 /* PR binutils/3181
868 If we are going to strip the group signature symbol, then
869 strip the group section too. */
870 gsym = group_signature (sec);
871 if (gsym != NULL)
872 gname = gsym->name;
873 else
874 gname = sec->name;
875 if ((strip_symbols == STRIP_ALL
876 && !is_specified_symbol (gname, keep_specific_list))
877 || is_specified_symbol (gname, strip_specific_list))
878 return TRUE;
879 }
880
881 return FALSE;
882 }
883
884 /* Return true if SYM is a hidden symbol. */
885
886 static bfd_boolean
887 is_hidden_symbol (asymbol *sym)
888 {
889 elf_symbol_type *elf_sym;
890
891 elf_sym = elf_symbol_from (sym->the_bfd, sym);
892 if (elf_sym != NULL)
893 switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
894 {
895 case STV_HIDDEN:
896 case STV_INTERNAL:
897 return TRUE;
898 }
899 return FALSE;
900 }
901
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. */
905
906 static unsigned int
907 filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
908 asymbol **isyms, long symcount)
909 {
910 asymbol **from = isyms, **to = osyms;
911 long src_count = 0, dst_count = 0;
912 int relocatable = (abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC))
913 == HAS_RELOC;
914
915 for (; src_count < symcount; src_count++)
916 {
917 asymbol *sym = from[src_count];
918 flagword flags = sym->flags;
919 char *name = (char *) bfd_asymbol_name (sym);
920 int keep;
921 bfd_boolean undefined;
922 bfd_boolean rem_leading_char;
923 bfd_boolean add_leading_char;
924
925 undefined = bfd_is_und_section (bfd_get_section (sym));
926
927 if (redefine_sym_list)
928 {
929 char *old_name, *new_name;
930
931 old_name = (char *) bfd_asymbol_name (sym);
932 new_name = (char *) lookup_sym_redefinition (old_name);
933 bfd_asymbol_name (sym) = new_name;
934 name = new_name;
935 }
936
937 /* Check if we will remove the current leading character. */
938 rem_leading_char =
939 (name[0] == bfd_get_symbol_leading_char (abfd))
940 && (change_leading_char
941 || (remove_leading_char
942 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
943 || undefined
944 || bfd_is_com_section (bfd_get_section (sym)))));
945
946 /* Check if we will add a new leading character. */
947 add_leading_char =
948 change_leading_char
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)));
952
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)
955 {
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;
960 }
961
962 /* Remove leading char. */
963 if (rem_leading_char)
964 bfd_asymbol_name (sym) = ++name;
965
966 /* Add new leading char and/or prefix. */
967 if (add_leading_char || prefix_symbols_string)
968 {
969 char *n, *ptr;
970
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);
975
976 if (prefix_symbols_string)
977 {
978 strcpy (ptr, prefix_symbols_string);
979 ptr += strlen (prefix_symbols_string);
980 }
981
982 strcpy (ptr, name);
983 bfd_asymbol_name (sym) = n;
984 name = n;
985 }
986
987 if (strip_symbols == STRIP_ALL)
988 keep = 0;
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
992 & BSF_KEEP) != 0))
993 keep = 1;
994 else if (relocatable /* Relocatable file. */
995 && (flags & (BSF_GLOBAL | BSF_WEAK)) != 0)
996 keep = 1;
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
1001 symbols. */
1002 keep = 1;
1003 else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */
1004 || (flags & BSF_WEAK) != 0
1005 || undefined
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. */
1015 keep = 1;
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))));
1021
1022 if (keep && is_specified_symbol (name, strip_specific_list))
1023 keep = 0;
1024 if (keep
1025 && !(flags & BSF_KEEP)
1026 && is_specified_symbol (name, strip_unneeded_list))
1027 keep = 0;
1028 if (!keep
1029 && ((keep_file_symbols && (flags & BSF_FILE))
1030 || is_specified_symbol (name, keep_specific_list)))
1031 keep = 1;
1032 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
1033 keep = 0;
1034
1035 if (keep)
1036 {
1037 if ((flags & BSF_GLOBAL) != 0
1038 && (weaken || is_specified_symbol (name, weaken_specific_list)))
1039 {
1040 sym->flags &= ~ BSF_GLOBAL;
1041 sym->flags |= BSF_WEAK;
1042 }
1043
1044 if (!undefined
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))))
1050 {
1051 sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
1052 sym->flags |= BSF_LOCAL;
1053 }
1054
1055 if (!undefined
1056 && (flags & BSF_LOCAL)
1057 && is_specified_symbol (name, globalize_specific_list))
1058 {
1059 sym->flags &= ~ BSF_LOCAL;
1060 sym->flags |= BSF_GLOBAL;
1061 }
1062
1063 to[dst_count++] = sym;
1064 }
1065 }
1066
1067 to[dst_count] = NULL;
1068
1069 return dst_count;
1070 }
1071
1072 /* Find the redefined name of symbol SOURCE. */
1073
1074 static const char *
1075 lookup_sym_redefinition (const char *source)
1076 {
1077 struct redefine_node *list;
1078
1079 for (list = redefine_sym_list; list != NULL; list = list->next)
1080 if (strcmp (source, list->source) == 0)
1081 return list->target;
1082
1083 return source;
1084 }
1085
1086 /* Add a node to a symbol redefine list. */
1087
1088 static void
1089 redefine_list_append (const char *cause, const char *source, const char *target)
1090 {
1091 struct redefine_node **p;
1092 struct redefine_node *list;
1093 struct redefine_node *new_node;
1094
1095 for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next)
1096 {
1097 if (strcmp (source, list->source) == 0)
1098 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1099 cause, source);
1100
1101 if (strcmp (target, list->target) == 0)
1102 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1103 cause, target);
1104 }
1105
1106 new_node = xmalloc (sizeof (struct redefine_node));
1107
1108 new_node->source = strdup (source);
1109 new_node->target = strdup (target);
1110 new_node->next = NULL;
1111
1112 *p = new_node;
1113 }
1114
1115 /* Handle the --redefine-syms option. Read lines containing "old new"
1116 from the file, and add them to the symbol redefine list. */
1117
1118 static void
1119 add_redefine_syms_file (const char *filename)
1120 {
1121 FILE *file;
1122 char *buf;
1123 size_t bufsize;
1124 size_t len;
1125 size_t outsym_off;
1126 int c, lineno;
1127
1128 file = fopen (filename, "r");
1129 if (file == NULL)
1130 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1131 filename, strerror (errno));
1132
1133 bufsize = 100;
1134 buf = xmalloc (bufsize);
1135
1136 lineno = 1;
1137 c = getc (file);
1138 len = 0;
1139 outsym_off = 0;
1140 while (c != EOF)
1141 {
1142 /* Collect the input symbol name. */
1143 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1144 {
1145 if (c == '#')
1146 goto comment;
1147 buf[len++] = c;
1148 if (len >= bufsize)
1149 {
1150 bufsize *= 2;
1151 buf = xrealloc (buf, bufsize);
1152 }
1153 c = getc (file);
1154 }
1155 buf[len++] = '\0';
1156 if (c == EOF)
1157 break;
1158
1159 /* Eat white space between the symbol names. */
1160 while (IS_WHITESPACE (c))
1161 c = getc (file);
1162 if (c == '#' || IS_LINE_TERMINATOR (c))
1163 goto comment;
1164 if (c == EOF)
1165 break;
1166
1167 /* Collect the output symbol name. */
1168 outsym_off = len;
1169 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1170 {
1171 if (c == '#')
1172 goto comment;
1173 buf[len++] = c;
1174 if (len >= bufsize)
1175 {
1176 bufsize *= 2;
1177 buf = xrealloc (buf, bufsize);
1178 }
1179 c = getc (file);
1180 }
1181 buf[len++] = '\0';
1182 if (c == EOF)
1183 break;
1184
1185 /* Eat white space at end of line. */
1186 while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c))
1187 c = getc (file);
1188 if (c == '#')
1189 goto comment;
1190 /* Handle \r\n. */
1191 if ((c == '\r' && (c = getc (file)) == '\n')
1192 || c == '\n' || c == EOF)
1193 {
1194 end_of_line:
1195 /* Append the redefinition to the list. */
1196 if (buf[0] != '\0')
1197 redefine_list_append (filename, &buf[0], &buf[outsym_off]);
1198
1199 lineno++;
1200 len = 0;
1201 outsym_off = 0;
1202 if (c == EOF)
1203 break;
1204 c = getc (file);
1205 continue;
1206 }
1207 else
1208 fatal (_("%s:%d: garbage found at end of line"), filename, lineno);
1209 comment:
1210 if (len != 0 && (outsym_off == 0 || outsym_off == len))
1211 fatal (_("%s:%d: missing new symbol name"), filename, lineno);
1212 buf[len++] = '\0';
1213
1214 /* Eat the rest of the line and finish it. */
1215 while (c != '\n' && c != EOF)
1216 c = getc (file);
1217 goto end_of_line;
1218 }
1219
1220 if (len != 0)
1221 fatal (_("%s:%d: premature end of file"), filename, lineno);
1222
1223 free (buf);
1224 }
1225
1226 /* Copy unkown object file IBFD onto OBFD.
1227 Returns TRUE upon success, FALSE otherwise. */
1228
1229 static bfd_boolean
1230 copy_unknown_object (bfd *ibfd, bfd *obfd)
1231 {
1232 char *cbuf;
1233 int tocopy;
1234 long ncopied;
1235 long size;
1236 struct stat buf;
1237
1238 if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1239 {
1240 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1241 return FALSE;
1242 }
1243
1244 size = buf.st_size;
1245 if (size < 0)
1246 {
1247 non_fatal (_("stat returns negative size for `%s'"),
1248 bfd_get_archive_filename (ibfd));
1249 return FALSE;
1250 }
1251
1252 if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1253 {
1254 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1255 return FALSE;
1256 }
1257
1258 if (verbose)
1259 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1260 bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1261
1262 cbuf = xmalloc (BUFSIZE);
1263 ncopied = 0;
1264 while (ncopied < size)
1265 {
1266 tocopy = size - ncopied;
1267 if (tocopy > BUFSIZE)
1268 tocopy = BUFSIZE;
1269
1270 if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1271 != (bfd_size_type) tocopy)
1272 {
1273 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1274 free (cbuf);
1275 return FALSE;
1276 }
1277
1278 if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1279 != (bfd_size_type) tocopy)
1280 {
1281 bfd_nonfatal (bfd_get_filename (obfd));
1282 free (cbuf);
1283 return FALSE;
1284 }
1285
1286 ncopied += tocopy;
1287 }
1288
1289 chmod (bfd_get_filename (obfd), buf.st_mode);
1290 free (cbuf);
1291 return TRUE;
1292 }
1293
1294 /* Copy object file IBFD onto OBFD.
1295 Returns TRUE upon success, FALSE otherwise. */
1296
1297 static bfd_boolean
1298 copy_object (bfd *ibfd, bfd *obfd)
1299 {
1300 bfd_vma start;
1301 long symcount;
1302 asection **osections = NULL;
1303 asection *gnu_debuglink_section = NULL;
1304 bfd_size_type *gaps = NULL;
1305 bfd_size_type max_gap = 0;
1306 long symsize;
1307 void *dhandle;
1308 enum bfd_architecture iarch;
1309 unsigned int imach;
1310
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)"));
1315
1316 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1317 {
1318 bfd_nonfatal (bfd_get_filename (obfd));
1319 return FALSE;
1320 }
1321
1322 if (verbose)
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));
1326
1327 if (extract_symbol)
1328 start = 0;
1329 else
1330 {
1331 if (set_start_set)
1332 start = set_start;
1333 else
1334 start = bfd_get_start_address (ibfd);
1335 start += change_start;
1336 }
1337
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)
1341 {
1342 flagword flags;
1343
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);
1348
1349 if (!bfd_set_start_address (obfd, start)
1350 || !bfd_set_file_flags (obfd, flags))
1351 {
1352 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1353 return FALSE;
1354 }
1355 }
1356
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)))
1363 {
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));
1367 else
1368 non_fatal (_("Warning: Output file cannot represent architecture `%s'"),
1369 bfd_printable_arch_mach (bfd_get_arch (ibfd),
1370 bfd_get_mach (ibfd)));
1371 return FALSE;
1372 }
1373
1374 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1375 {
1376 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1377 return FALSE;
1378 }
1379
1380 if (isympp)
1381 free (isympp);
1382
1383 if (osympp != isympp)
1384 free (osympp);
1385
1386 isympp = NULL;
1387 osympp = NULL;
1388
1389 symsize = bfd_get_symtab_upper_bound (ibfd);
1390 if (symsize < 0)
1391 {
1392 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1393 return FALSE;
1394 }
1395
1396 osympp = isympp = xmalloc (symsize);
1397 symcount = bfd_canonicalize_symtab (ibfd, isympp);
1398 if (symcount < 0)
1399 {
1400 bfd_nonfatal (bfd_get_filename (ibfd));
1401 return FALSE;
1402 }
1403
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);
1407
1408 setup_bfd_headers (ibfd, obfd);
1409
1410 if (add_sections != NULL)
1411 {
1412 struct section_add *padd;
1413 struct section_list *pset;
1414
1415 for (padd = add_sections; padd != NULL; padd = padd->next)
1416 {
1417 flagword flags;
1418
1419 pset = find_section_list (padd->name, FALSE);
1420 if (pset != NULL)
1421 pset->used = TRUE;
1422
1423 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
1424 if (pset != NULL && pset->set_flags)
1425 flags = pset->flags | SEC_HAS_CONTENTS;
1426
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))
1430 {
1431 non_fatal (_("can't add section '%s' - it already exists!"), padd->name);
1432 return FALSE;
1433 }
1434 else
1435 {
1436 padd->section = bfd_make_section_with_flags (obfd, padd->name, flags);
1437 if (padd->section == NULL)
1438 {
1439 non_fatal (_("can't create section `%s': %s"),
1440 padd->name, bfd_errmsg (bfd_get_error ()));
1441 return FALSE;
1442 }
1443 }
1444
1445 if (! bfd_set_section_size (obfd, padd->section, padd->size))
1446 {
1447 bfd_nonfatal (bfd_get_filename (obfd));
1448 return FALSE;
1449 }
1450
1451 if (pset != NULL)
1452 {
1453 if (pset->change_vma != CHANGE_IGNORE)
1454 if (! bfd_set_section_vma (obfd, padd->section,
1455 pset->vma_val))
1456 {
1457 bfd_nonfatal (bfd_get_filename (obfd));
1458 return FALSE;
1459 }
1460
1461 if (pset->change_lma != CHANGE_IGNORE)
1462 {
1463 padd->section->lma = pset->lma_val;
1464
1465 if (! bfd_set_section_alignment
1466 (obfd, padd->section,
1467 bfd_section_alignment (obfd, padd->section)))
1468 {
1469 bfd_nonfatal (bfd_get_filename (obfd));
1470 return FALSE;
1471 }
1472 }
1473 }
1474 }
1475 }
1476
1477 if (gnu_debuglink_filename != NULL)
1478 {
1479 gnu_debuglink_section = bfd_create_gnu_debuglink_section
1480 (obfd, gnu_debuglink_filename);
1481
1482 if (gnu_debuglink_section == NULL)
1483 {
1484 bfd_nonfatal (gnu_debuglink_filename);
1485 return FALSE;
1486 }
1487
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)
1491 {
1492 bfd_vma debuglink_vma;
1493 asection * highest_section;
1494 asection * sec;
1495
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
1500 use for a VMA.
1501
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;
1507 sec != NULL;
1508 sec = sec->next)
1509 if (sec->vma > 0
1510 && (highest_section == NULL
1511 || sec->vma > highest_section->vma))
1512 highest_section = sec;
1513
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. */
1523 0x1000);
1524 else
1525 /* Umm, not sure what to do in this case. */
1526 debuglink_vma = 0x1000;
1527
1528 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
1529 }
1530 }
1531
1532 if (bfd_count_sections (obfd) != 0
1533 && (gap_fill_set || pad_to_set))
1534 {
1535 asection **set;
1536 unsigned int c, i;
1537
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. */
1543
1544 c = bfd_count_sections (obfd);
1545 osections = xmalloc (c * sizeof (asection *));
1546 set = osections;
1547 bfd_map_over_sections (obfd, get_sections, &set);
1548
1549 qsort (osections, c, sizeof (asection *), compare_section_lma);
1550
1551 gaps = xmalloc (c * sizeof (bfd_size_type));
1552 memset (gaps, 0, c * sizeof (bfd_size_type));
1553
1554 if (gap_fill_set)
1555 {
1556 for (i = 0; i < c - 1; i++)
1557 {
1558 flagword flags;
1559 bfd_size_type size;
1560 bfd_vma gap_start, gap_stop;
1561
1562 flags = bfd_get_section_flags (obfd, osections[i]);
1563 if ((flags & SEC_HAS_CONTENTS) == 0
1564 || (flags & SEC_LOAD) == 0)
1565 continue;
1566
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)
1571 {
1572 if (! bfd_set_section_size (obfd, osections[i],
1573 size + (gap_stop - gap_start)))
1574 {
1575 non_fatal (_("Can't fill gap after %s: %s"),
1576 bfd_get_section_name (obfd, osections[i]),
1577 bfd_errmsg (bfd_get_error ()));
1578 status = 1;
1579 break;
1580 }
1581 gaps[i] = gap_stop - gap_start;
1582 if (max_gap < gap_stop - gap_start)
1583 max_gap = gap_stop - gap_start;
1584 }
1585 }
1586 }
1587
1588 if (pad_to_set)
1589 {
1590 bfd_vma lma;
1591 bfd_size_type size;
1592
1593 lma = bfd_section_lma (obfd, osections[c - 1]);
1594 size = bfd_section_size (obfd, osections[c - 1]);
1595 if (lma + size < pad_to)
1596 {
1597 if (! bfd_set_section_size (obfd, osections[c - 1],
1598 pad_to - lma))
1599 {
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 ()));
1603 status = 1;
1604 }
1605 else
1606 {
1607 gaps[c - 1] = pad_to - (lma + size);
1608 if (max_gap < pad_to - (lma + size))
1609 max_gap = pad_to - (lma + size);
1610 }
1611 }
1612 }
1613 }
1614
1615 /* Symbol filtering must happen after the output sections
1616 have been created, but before their contents are set. */
1617 dhandle = NULL;
1618 if (convert_debugging)
1619 dhandle = read_debugging_info (ibfd, isympp, symcount);
1620
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
1626 || localize_hidden
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
1634 || sections_removed
1635 || sections_copied
1636 || convert_debugging
1637 || change_leading_char
1638 || remove_leading_char
1639 || redefine_sym_list
1640 || weaken)
1641 {
1642 /* Mark symbols used in output relocations so that they
1643 are kept, even if they are local labels or static symbols.
1644
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
1649 section. */
1650 if (strip_symbols != STRIP_ALL)
1651 bfd_map_over_sections (ibfd,
1652 mark_symbols_used_in_relocations,
1653 isympp);
1654 osympp = xmalloc ((symcount + 1) * sizeof (asymbol *));
1655 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
1656 }
1657
1658 if (convert_debugging && dhandle != NULL)
1659 {
1660 if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
1661 {
1662 status = 1;
1663 return FALSE;
1664 }
1665 }
1666
1667 bfd_set_symtab (obfd, osympp, symcount);
1668
1669 /* This has to happen after the symbol table has been set. */
1670 bfd_map_over_sections (ibfd, copy_section, obfd);
1671
1672 if (add_sections != NULL)
1673 {
1674 struct section_add *padd;
1675
1676 for (padd = add_sections; padd != NULL; padd = padd->next)
1677 {
1678 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
1679 0, padd->size))
1680 {
1681 bfd_nonfatal (bfd_get_filename (obfd));
1682 return FALSE;
1683 }
1684 }
1685 }
1686
1687 if (gnu_debuglink_filename != NULL)
1688 {
1689 if (! bfd_fill_in_gnu_debuglink_section
1690 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
1691 {
1692 bfd_nonfatal (gnu_debuglink_filename);
1693 return FALSE;
1694 }
1695 }
1696
1697 if (gap_fill_set || pad_to_set)
1698 {
1699 bfd_byte *buf;
1700 int c, i;
1701
1702 /* Fill in the gaps. */
1703 if (max_gap > 8192)
1704 max_gap = 8192;
1705 buf = xmalloc (max_gap);
1706 memset (buf, gap_fill, max_gap);
1707
1708 c = bfd_count_sections (obfd);
1709 for (i = 0; i < c; i++)
1710 {
1711 if (gaps[i] != 0)
1712 {
1713 bfd_size_type left;
1714 file_ptr off;
1715
1716 left = gaps[i];
1717 off = bfd_section_size (obfd, osections[i]) - left;
1718
1719 while (left > 0)
1720 {
1721 bfd_size_type now;
1722
1723 if (left > 8192)
1724 now = 8192;
1725 else
1726 now = left;
1727
1728 if (! bfd_set_section_contents (obfd, osections[i], buf,
1729 off, now))
1730 {
1731 bfd_nonfatal (bfd_get_filename (obfd));
1732 return FALSE;
1733 }
1734
1735 left -= now;
1736 off += now;
1737 }
1738 }
1739 }
1740 }
1741
1742 /* Do not copy backend data if --extract-symbol is passed; anything
1743 that needs to look at the section contents will fail. */
1744 if (extract_symbol)
1745 return TRUE;
1746
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. */
1755 ;
1756 else if (! bfd_copy_private_bfd_data (ibfd, obfd))
1757 {
1758 non_fatal (_("%s: error copying private BFD data: %s"),
1759 bfd_get_filename (obfd),
1760 bfd_errmsg (bfd_get_error ()));
1761 return FALSE;
1762 }
1763
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)
1768 {
1769 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
1770 {
1771 non_fatal (_("this target does not support %lu alternative machine codes"),
1772 use_alt_mach_code);
1773 if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
1774 {
1775 non_fatal (_("treating that number as an absolute e_machine value instead"));
1776 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
1777 }
1778 else
1779 non_fatal (_("ignoring the alternative value"));
1780 }
1781 }
1782
1783 return TRUE;
1784 }
1785
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
1790 'output_target'. */
1791
1792 static void
1793 copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
1794 bfd_boolean force_output_target)
1795 {
1796 struct name_list
1797 {
1798 struct name_list *next;
1799 const char *name;
1800 bfd *obfd;
1801 } *list, *l;
1802 bfd **ptr = &obfd->archive_head;
1803 bfd *this_element;
1804 char * dir;
1805
1806 /* Make a temp directory to hold the contents. */
1807 dir = make_tempdir (bfd_get_filename (obfd));
1808 if (dir == NULL)
1809 fatal (_("cannot create tempdir for archive copying (error: %s)"),
1810 strerror (errno));
1811
1812 obfd->has_armap = ibfd->has_armap;
1813
1814 list = NULL;
1815
1816 this_element = bfd_openr_next_archived_file (ibfd, NULL);
1817
1818 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1819 RETURN_NONFATAL (bfd_get_filename (obfd));
1820
1821 while (!status && this_element != NULL)
1822 {
1823 char *output_name;
1824 bfd *output_bfd;
1825 bfd *last_element;
1826 struct stat buf;
1827 int stat_status = 0;
1828 bfd_boolean delete = TRUE;
1829
1830 /* Create an output file for this member. */
1831 output_name = concat (dir, "/",
1832 bfd_get_filename (this_element), (char *) 0);
1833
1834 /* If the file already exists, make another temp dir. */
1835 if (stat (output_name, &buf) >= 0)
1836 {
1837 output_name = make_tempdir (output_name);
1838 if (output_name == NULL)
1839 fatal (_("cannot create tempdir for archive copying (error: %s)"),
1840 strerror (errno));
1841
1842 l = xmalloc (sizeof (struct name_list));
1843 l->name = output_name;
1844 l->next = list;
1845 l->obfd = NULL;
1846 list = l;
1847 output_name = concat (output_name, "/",
1848 bfd_get_filename (this_element), (char *) 0);
1849 }
1850
1851 if (preserve_dates)
1852 {
1853 stat_status = bfd_stat_arch_elt (this_element, &buf);
1854
1855 if (stat_status != 0)
1856 non_fatal (_("internal stat error on %s"),
1857 bfd_get_filename (this_element));
1858 }
1859
1860 l = xmalloc (sizeof (struct name_list));
1861 l->name = output_name;
1862 l->next = list;
1863 l->obfd = NULL;
1864 list = l;
1865
1866 if (bfd_check_format (this_element, bfd_object))
1867 {
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);
1872 else
1873 output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
1874
1875 if (output_bfd == NULL)
1876 RETURN_NONFATAL (output_name);
1877
1878 delete = ! copy_object (this_element, output_bfd);
1879
1880 if (! delete
1881 || bfd_get_arch (this_element) != bfd_arch_unknown)
1882 {
1883 if (!bfd_close (output_bfd))
1884 {
1885 bfd_nonfatal (bfd_get_filename (output_bfd));
1886 /* Error in new object file. Don't change archive. */
1887 status = 1;
1888 }
1889 }
1890 else
1891 goto copy_unknown_element;
1892 }
1893 else
1894 {
1895 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1896 bfd_get_archive_filename (this_element));
1897
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))
1902 {
1903 bfd_nonfatal (bfd_get_filename (output_bfd));
1904 /* Error in new object file. Don't change archive. */
1905 status = 1;
1906 }
1907 }
1908
1909 if (delete)
1910 {
1911 unlink (output_name);
1912 status = 1;
1913 }
1914 else
1915 {
1916 if (preserve_dates && stat_status == 0)
1917 set_times (output_name, &buf);
1918
1919 /* Open the newly output file and attach to our list. */
1920 output_bfd = bfd_openr (output_name, output_target);
1921
1922 l->obfd = output_bfd;
1923
1924 *ptr = output_bfd;
1925 ptr = &output_bfd->next;
1926
1927 last_element = this_element;
1928
1929 this_element = bfd_openr_next_archived_file (ibfd, last_element);
1930
1931 bfd_close (last_element);
1932 }
1933 }
1934 *ptr = NULL;
1935
1936 if (!bfd_close (obfd))
1937 RETURN_NONFATAL (bfd_get_filename (obfd));
1938
1939 if (!bfd_close (ibfd))
1940 RETURN_NONFATAL (bfd_get_filename (ibfd));
1941
1942 /* Delete all the files that we opened. */
1943 for (l = list; l != NULL; l = l->next)
1944 {
1945 if (l->obfd == NULL)
1946 rmdir (l->name);
1947 else
1948 {
1949 bfd_close (l->obfd);
1950 unlink (l->name);
1951 }
1952 }
1953 rmdir (dir);
1954 }
1955
1956 /* The top-level control. */
1957
1958 static void
1959 copy_file (const char *input_filename, const char *output_filename,
1960 const char *input_target, const char *output_target)
1961 {
1962 bfd *ibfd;
1963 char **obj_matching;
1964 char **core_matching;
1965
1966 if (get_file_size (input_filename) < 1)
1967 {
1968 status = 1;
1969 return;
1970 }
1971
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);
1975 if (ibfd == NULL)
1976 RETURN_NONFATAL (input_filename);
1977
1978 if (bfd_check_format (ibfd, bfd_archive))
1979 {
1980 bfd_boolean force_output_target;
1981 bfd *obfd;
1982
1983 /* bfd_get_target does not return the correct value until
1984 bfd_check_format succeeds. */
1985 if (output_target == NULL)
1986 {
1987 output_target = bfd_get_target (ibfd);
1988 force_output_target = FALSE;
1989 }
1990 else
1991 force_output_target = TRUE;
1992
1993 obfd = bfd_openw (output_filename, output_target);
1994 if (obfd == NULL)
1995 RETURN_NONFATAL (output_filename);
1996
1997 copy_archive (ibfd, obfd, output_target, force_output_target);
1998 }
1999 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
2000 {
2001 bfd *obfd;
2002 do_copy:
2003
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);
2008
2009 obfd = bfd_openw (output_filename, output_target);
2010 if (obfd == NULL)
2011 RETURN_NONFATAL (output_filename);
2012
2013 if (! copy_object (ibfd, obfd))
2014 status = 1;
2015
2016 if (!bfd_close (obfd))
2017 RETURN_NONFATAL (output_filename);
2018
2019 if (!bfd_close (ibfd))
2020 RETURN_NONFATAL (input_filename);
2021
2022 }
2023 else
2024 {
2025 bfd_error_type obj_error = bfd_get_error ();
2026 bfd_error_type core_error;
2027
2028 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
2029 {
2030 /* This probably can't happen.. */
2031 if (obj_error == bfd_error_file_ambiguously_recognized)
2032 free (obj_matching);
2033 goto do_copy;
2034 }
2035
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);
2040
2041 bfd_nonfatal (input_filename);
2042
2043 if (obj_error == bfd_error_file_ambiguously_recognized)
2044 {
2045 list_matching_formats (obj_matching);
2046 free (obj_matching);
2047 }
2048 if (core_error == bfd_error_file_ambiguously_recognized)
2049 {
2050 list_matching_formats (core_matching);
2051 free (core_matching);
2052 }
2053
2054 status = 1;
2055 }
2056 }
2057
2058 /* Add a name to the section renaming list. */
2059
2060 static void
2061 add_section_rename (const char * old_name, const char * new_name,
2062 flagword flags)
2063 {
2064 section_rename * rename;
2065
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)
2069 {
2070 /* Silently ignore duplicate definitions. */
2071 if (strcmp (rename->new_name, new_name) == 0
2072 && rename->flags == flags)
2073 return;
2074
2075 fatal (_("Multiple renames of section %s"), old_name);
2076 }
2077
2078 rename = xmalloc (sizeof (* rename));
2079
2080 rename->old_name = old_name;
2081 rename->new_name = new_name;
2082 rename->flags = flags;
2083 rename->next = section_rename_list;
2084
2085 section_rename_list = rename;
2086 }
2087
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. */
2091
2092 static const char *
2093 find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection,
2094 flagword * returned_flags)
2095 {
2096 const char * old_name = bfd_section_name (ibfd, isection);
2097 section_rename * rename;
2098
2099 /* Default to using the flags of the input section. */
2100 * returned_flags = bfd_get_section_flags (ibfd, isection);
2101
2102 for (rename = section_rename_list; rename != NULL; rename = rename->next)
2103 if (strcmp (rename->old_name, old_name) == 0)
2104 {
2105 if (rename->flags != (flagword) -1)
2106 * returned_flags = rename->flags;
2107
2108 return rename->new_name;
2109 }
2110
2111 return old_name;
2112 }
2113
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. */
2116
2117 static void
2118 setup_bfd_headers (bfd *ibfd, bfd *obfd)
2119 {
2120 const char *err;
2121
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))
2125 {
2126 err = _("private header data");
2127 goto loser;
2128 }
2129
2130 /* All went well. */
2131 return;
2132
2133 loser:
2134 non_fatal (_("%s: error in %s: %s"),
2135 bfd_get_filename (ibfd),
2136 err, bfd_errmsg (bfd_get_error ()));
2137 status = 1;
2138 }
2139
2140 /* Create a section in OBFD with the same
2141 name and attributes as ISECTION in IBFD. */
2142
2143 static void
2144 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2145 {
2146 bfd *obfd = obfdarg;
2147 struct section_list *p;
2148 sec_ptr osection;
2149 bfd_size_type size;
2150 bfd_vma vma;
2151 bfd_vma lma;
2152 flagword flags;
2153 const char *err;
2154 const char * name;
2155 char *prefix = NULL;
2156
2157 if (is_strip_section (ibfd, isection))
2158 return;
2159
2160 p = find_section_list (bfd_section_name (ibfd, isection), FALSE);
2161 if (p != NULL)
2162 p->used = TRUE;
2163
2164 /* Get the, possibly new, name of the output section. */
2165 name = find_section_rename (ibfd, isection, & flags);
2166
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;
2173
2174 if (prefix)
2175 {
2176 char *n;
2177
2178 n = xmalloc (strlen (prefix) + strlen (name) + 1);
2179 strcpy (n, prefix);
2180 strcat (n, name);
2181 name = n;
2182 }
2183
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);
2188
2189 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
2190
2191 if (osection == NULL)
2192 {
2193 err = _("making");
2194 goto loser;
2195 }
2196
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;
2202
2203 size = bfd_section_size (ibfd, isection);
2204 if (copy_byte >= 0)
2205 size = (size + interleave - 1) / interleave;
2206 else if (extract_symbol)
2207 size = 0;
2208 if (! bfd_set_section_size (obfd, osection, size))
2209 {
2210 err = _("size");
2211 goto loser;
2212 }
2213
2214 vma = bfd_section_vma (ibfd, isection);
2215 if (p != NULL && p->change_vma == CHANGE_MODIFY)
2216 vma += p->vma_val;
2217 else if (p != NULL && p->change_vma == CHANGE_SET)
2218 vma = p->vma_val;
2219 else
2220 vma += change_section_address;
2221
2222 if (! bfd_set_section_vma (obfd, osection, extract_symbol ? 0 : vma))
2223 {
2224 err = _("vma");
2225 goto loser;
2226 }
2227
2228 lma = isection->lma;
2229 if ((p != NULL) && p->change_lma != CHANGE_IGNORE)
2230 {
2231 if (p->change_lma == CHANGE_MODIFY)
2232 lma += p->lma_val;
2233 else if (p->change_lma == CHANGE_SET)
2234 lma = p->lma_val;
2235 else
2236 abort ();
2237 }
2238 else
2239 lma += change_section_address;
2240
2241 osection->lma = extract_symbol ? 0 : lma;
2242
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,
2246 osection,
2247 bfd_section_alignment (ibfd, isection)))
2248 {
2249 err = _("alignment");
2250 goto loser;
2251 }
2252
2253 /* Copy merge entity size. */
2254 osection->entsize = isection->entsize;
2255
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;
2261
2262 /* Do not copy backend data if --extract-symbol is passed; anything
2263 that needs to look at the section contents will fail. */
2264 if (extract_symbol)
2265 return;
2266
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. */
2273 ;
2274 else if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
2275 {
2276 err = _("private data");
2277 goto loser;
2278 }
2279 else if ((isection->flags & SEC_GROUP) != 0)
2280 {
2281 asymbol *gsym = group_signature (isection);
2282
2283 if (gsym != NULL)
2284 gsym->flags |= BSF_KEEP;
2285 }
2286
2287 /* All went well. */
2288 return;
2289
2290 loser:
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 ()));
2295 status = 1;
2296 }
2297
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. */
2301
2302 static void
2303 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2304 {
2305 bfd *obfd = obfdarg;
2306 struct section_list *p;
2307 arelent **relpp;
2308 long relcount;
2309 sec_ptr osection;
2310 bfd_size_type size;
2311 long relsize;
2312 flagword flags;
2313
2314 /* If we have already failed earlier on,
2315 do not keep on generating complaints now. */
2316 if (status != 0)
2317 return;
2318
2319 if (is_strip_section (ibfd, isection))
2320 return;
2321
2322 flags = bfd_get_section_flags (ibfd, isection);
2323 if ((flags & SEC_GROUP) != 0)
2324 return;
2325
2326 osection = isection->output_section;
2327 size = bfd_get_section_size (isection);
2328
2329 if (size == 0 || osection == 0)
2330 return;
2331
2332 p = find_section_list (bfd_get_section_name (ibfd, isection), FALSE);
2333
2334 /* Core files do not need to be relocated. */
2335 if (bfd_get_format (obfd) == bfd_core)
2336 relsize = 0;
2337 else
2338 {
2339 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2340
2341 if (relsize < 0)
2342 {
2343 /* Do not complain if the target does not support relocations. */
2344 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2345 relsize = 0;
2346 else
2347 RETURN_NONFATAL (bfd_get_filename (ibfd));
2348 }
2349 }
2350
2351 if (relsize == 0)
2352 bfd_set_reloc (obfd, osection, NULL, 0);
2353 else
2354 {
2355 relpp = xmalloc (relsize);
2356 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
2357 if (relcount < 0)
2358 RETURN_NONFATAL (bfd_get_filename (ibfd));
2359
2360 if (strip_symbols == STRIP_ALL)
2361 {
2362 /* Remove relocations which are not in
2363 keep_strip_specific_list. */
2364 arelent **temp_relpp;
2365 long temp_relcount = 0;
2366 long i;
2367
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;
2374 free (relpp);
2375 relpp = temp_relpp;
2376 }
2377
2378 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
2379 if (relcount == 0)
2380 free (relpp);
2381 }
2382
2383 if (extract_symbol)
2384 return;
2385
2386 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
2387 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
2388 {
2389 void *memhunk = xmalloc (size);
2390
2391 if (!bfd_get_section_contents (ibfd, isection, memhunk, 0, size))
2392 RETURN_NONFATAL (bfd_get_filename (ibfd));
2393
2394 if (reverse_bytes)
2395 {
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)
2400 {
2401 unsigned long i, j;
2402 bfd_byte b;
2403
2404 for (i = 0; i < size; i += reverse_bytes)
2405 for (j = 0; j < (unsigned long)(reverse_bytes / 2); j++)
2406 {
2407 bfd_byte *m = (bfd_byte *) memhunk;
2408
2409 b = m[i + j];
2410 m[i + j] = m[(i + reverse_bytes) - (j + 1)];
2411 m[(i + reverse_bytes) - (j + 1)] = b;
2412 }
2413 }
2414 else
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);
2418 }
2419
2420 if (copy_byte >= 0)
2421 {
2422 /* Keep only every `copy_byte'th byte in MEMHUNK. */
2423 char *from = (char *) memhunk + copy_byte;
2424 char *to = memhunk;
2425 char *end = (char *) memhunk + size;
2426
2427 for (; from < end; from += interleave)
2428 *to++ = *from;
2429
2430 size = (size + interleave - 1 - copy_byte) / interleave;
2431 osection->lma /= interleave;
2432 }
2433
2434 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2435 RETURN_NONFATAL (bfd_get_filename (obfd));
2436
2437 free (memhunk);
2438 }
2439 else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0)
2440 {
2441 void *memhunk = xmalloc (size);
2442
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. */
2448
2449 memset (memhunk, 0, size);
2450 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2451 RETURN_NONFATAL (bfd_get_filename (obfd));
2452 free (memhunk);
2453 }
2454 }
2455
2456 /* Get all the sections. This is used when --gap-fill or --pad-to is
2457 used. */
2458
2459 static void
2460 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
2461 {
2462 asection ***secppp = secppparg;
2463
2464 **secppp = osection;
2465 ++(*secppp);
2466 }
2467
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. */
2471
2472 static int
2473 compare_section_lma (const void *arg1, const void *arg2)
2474 {
2475 const asection *const *sec1 = arg1;
2476 const asection *const *sec2 = arg2;
2477 flagword flags1, flags2;
2478
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)
2484 {
2485 if ((flags2 & SEC_HAS_CONTENTS) != 0
2486 && (flags2 & SEC_LOAD) != 0)
2487 return -1;
2488 }
2489 else
2490 {
2491 if ((flags2 & SEC_HAS_CONTENTS) == 0
2492 || (flags2 & SEC_LOAD) == 0)
2493 return 1;
2494 }
2495
2496 /* Sort sections by LMA. */
2497 if ((*sec1)->lma > (*sec2)->lma)
2498 return 1;
2499 else if ((*sec1)->lma < (*sec2)->lma)
2500 return -1;
2501
2502 /* Sort sections with the same LMA by size. */
2503 if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
2504 return 1;
2505 else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
2506 return -1;
2507
2508 return 0;
2509 }
2510
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.
2513
2514 Ignore relocations which will not appear in the output file. */
2515
2516 static void
2517 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
2518 {
2519 asymbol **symbols = symbolsarg;
2520 long relsize;
2521 arelent **relpp;
2522 long relcount, i;
2523
2524 /* Ignore an input section with no corresponding output section. */
2525 if (isection->output_section == NULL)
2526 return;
2527
2528 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2529 if (relsize < 0)
2530 {
2531 /* Do not complain if the target does not support relocations. */
2532 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2533 return;
2534 bfd_fatal (bfd_get_filename (ibfd));
2535 }
2536
2537 if (relsize == 0)
2538 return;
2539
2540 relpp = xmalloc (relsize);
2541 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
2542 if (relcount < 0)
2543 bfd_fatal (bfd_get_filename (ibfd));
2544
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++)
2548 {
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;
2553 }
2554
2555 if (relpp != NULL)
2556 free (relpp);
2557 }
2558
2559 /* Write out debugging information. */
2560
2561 static bfd_boolean
2562 write_debugging_info (bfd *obfd, void *dhandle,
2563 long *symcountp ATTRIBUTE_UNUSED,
2564 asymbol ***symppp ATTRIBUTE_UNUSED)
2565 {
2566 if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour)
2567 return write_ieee_debugging_info (obfd, dhandle);
2568
2569 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2570 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
2571 {
2572 bfd_byte *syms, *strings;
2573 bfd_size_type symsize, stringsize;
2574 asection *stabsec, *stabstrsec;
2575 flagword flags;
2576
2577 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
2578 &symsize, &strings,
2579 &stringsize))
2580 return FALSE;
2581
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);
2585 if (stabsec == NULL
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))
2591 {
2592 non_fatal (_("%s: can't create debugging section: %s"),
2593 bfd_get_filename (obfd),
2594 bfd_errmsg (bfd_get_error ()));
2595 return FALSE;
2596 }
2597
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,
2604 stringsize))
2605 {
2606 non_fatal (_("%s: can't set debugging section contents: %s"),
2607 bfd_get_filename (obfd),
2608 bfd_errmsg (bfd_get_error ()));
2609 return FALSE;
2610 }
2611
2612 return TRUE;
2613 }
2614
2615 non_fatal (_("%s: don't know how to write debugging information for %s"),
2616 bfd_get_filename (obfd), bfd_get_target (obfd));
2617 return FALSE;
2618 }
2619
2620 static int
2621 strip_main (int argc, char *argv[])
2622 {
2623 char *input_target = NULL;
2624 char *output_target = NULL;
2625 bfd_boolean show_version = FALSE;
2626 bfd_boolean formats_info = FALSE;
2627 int c;
2628 int i;
2629 struct section_list *p;
2630 char *output_file = NULL;
2631
2632 while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
2633 strip_options, (int *) 0)) != EOF)
2634 {
2635 switch (c)
2636 {
2637 case 'I':
2638 input_target = optarg;
2639 break;
2640 case 'O':
2641 output_target = optarg;
2642 break;
2643 case 'F':
2644 input_target = output_target = optarg;
2645 break;
2646 case 'R':
2647 p = find_section_list (optarg, TRUE);
2648 p->remove = TRUE;
2649 sections_removed = TRUE;
2650 break;
2651 case 's':
2652 strip_symbols = STRIP_ALL;
2653 break;
2654 case 'S':
2655 case 'g':
2656 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
2657 strip_symbols = STRIP_DEBUG;
2658 break;
2659 case OPTION_STRIP_UNNEEDED:
2660 strip_symbols = STRIP_UNNEEDED;
2661 break;
2662 case 'K':
2663 add_specific_symbol (optarg, &keep_specific_list);
2664 break;
2665 case 'N':
2666 add_specific_symbol (optarg, &strip_specific_list);
2667 break;
2668 case 'o':
2669 output_file = optarg;
2670 break;
2671 case 'p':
2672 preserve_dates = TRUE;
2673 break;
2674 case 'x':
2675 discard_locals = LOCALS_ALL;
2676 break;
2677 case 'X':
2678 discard_locals = LOCALS_START_L;
2679 break;
2680 case 'v':
2681 verbose = TRUE;
2682 break;
2683 case 'V':
2684 show_version = TRUE;
2685 break;
2686 case OPTION_FORMATS_INFO:
2687 formats_info = TRUE;
2688 break;
2689 case OPTION_ONLY_KEEP_DEBUG:
2690 strip_symbols = STRIP_NONDEBUG;
2691 break;
2692 case OPTION_KEEP_FILE_SYMBOLS:
2693 keep_file_symbols = 1;
2694 break;
2695 case 0:
2696 /* We've been given a long option. */
2697 break;
2698 case 'w':
2699 wildcard = TRUE;
2700 break;
2701 case 'H':
2702 case 'h':
2703 strip_usage (stdout, 0);
2704 default:
2705 strip_usage (stderr, 1);
2706 }
2707 }
2708
2709 if (formats_info)
2710 {
2711 display_info ();
2712 return 0;
2713 }
2714
2715 if (show_version)
2716 print_version ("strip");
2717
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;
2723
2724 if (output_target == NULL)
2725 output_target = input_target;
2726
2727 i = optind;
2728 if (i == argc
2729 || (output_file != NULL && (i + 1) < argc))
2730 strip_usage (stderr, 1);
2731
2732 for (; i < argc; i++)
2733 {
2734 int hold_status = status;
2735 struct stat statbuf;
2736 char *tmpname;
2737
2738 if (get_file_size (argv[i]) < 1)
2739 {
2740 status = 1;
2741 continue;
2742 }
2743
2744 if (preserve_dates)
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);
2748
2749 if (output_file != NULL)
2750 tmpname = output_file;
2751 else
2752 tmpname = make_tempname (argv[i]);
2753
2754 if (tmpname == NULL)
2755 {
2756 non_fatal (_("could not create temporary file to hold stripped copy of '%s'"),
2757 argv[i]);
2758 status = 1;
2759 continue;
2760 }
2761
2762 status = 0;
2763 copy_file (argv[i], tmpname, input_target, output_target);
2764 if (status == 0)
2765 {
2766 if (preserve_dates)
2767 set_times (tmpname, &statbuf);
2768 if (output_file == NULL)
2769 smart_rename (tmpname, argv[i], preserve_dates);
2770 status = hold_status;
2771 }
2772 else
2773 unlink_if_ordinary (tmpname);
2774 if (output_file == NULL)
2775 free (tmpname);
2776 }
2777
2778 return status;
2779 }
2780
2781 static int
2782 copy_main (int argc, char *argv[])
2783 {
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;
2792 int c;
2793 struct section_list *p;
2794 struct stat statbuf;
2795
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)
2798 {
2799 switch (c)
2800 {
2801 case 'b':
2802 copy_byte = atoi (optarg);
2803 if (copy_byte < 0)
2804 fatal (_("byte number must be non-negative"));
2805 break;
2806
2807 case 'B':
2808 binary_architecture = optarg;
2809 break;
2810
2811 case 'i':
2812 interleave = atoi (optarg);
2813 if (interleave < 1)
2814 fatal (_("interleave must be positive"));
2815 break;
2816
2817 case 'I':
2818 case 's': /* "source" - 'I' is preferred */
2819 input_target = optarg;
2820 break;
2821
2822 case 'O':
2823 case 'd': /* "destination" - 'O' is preferred */
2824 output_target = optarg;
2825 break;
2826
2827 case 'F':
2828 input_target = output_target = optarg;
2829 break;
2830
2831 case 'j':
2832 p = find_section_list (optarg, TRUE);
2833 if (p->remove)
2834 fatal (_("%s both copied and removed"), optarg);
2835 p->copy = TRUE;
2836 sections_copied = TRUE;
2837 break;
2838
2839 case 'R':
2840 p = find_section_list (optarg, TRUE);
2841 if (p->copy)
2842 fatal (_("%s both copied and removed"), optarg);
2843 p->remove = TRUE;
2844 sections_removed = TRUE;
2845 break;
2846
2847 case 'S':
2848 strip_symbols = STRIP_ALL;
2849 break;
2850
2851 case 'g':
2852 strip_symbols = STRIP_DEBUG;
2853 break;
2854
2855 case OPTION_STRIP_UNNEEDED:
2856 strip_symbols = STRIP_UNNEEDED;
2857 break;
2858
2859 case OPTION_ONLY_KEEP_DEBUG:
2860 strip_symbols = STRIP_NONDEBUG;
2861 break;
2862
2863 case OPTION_KEEP_FILE_SYMBOLS:
2864 keep_file_symbols = 1;
2865 break;
2866
2867 case OPTION_ADD_GNU_DEBUGLINK:
2868 gnu_debuglink_filename = optarg;
2869 break;
2870
2871 case 'K':
2872 add_specific_symbol (optarg, &keep_specific_list);
2873 break;
2874
2875 case 'N':
2876 add_specific_symbol (optarg, &strip_specific_list);
2877 break;
2878
2879 case OPTION_STRIP_UNNEEDED_SYMBOL:
2880 add_specific_symbol (optarg, &strip_unneeded_list);
2881 break;
2882
2883 case 'L':
2884 add_specific_symbol (optarg, &localize_specific_list);
2885 break;
2886
2887 case OPTION_GLOBALIZE_SYMBOL:
2888 add_specific_symbol (optarg, &globalize_specific_list);
2889 break;
2890
2891 case 'G':
2892 add_specific_symbol (optarg, &keepglobal_specific_list);
2893 break;
2894
2895 case 'W':
2896 add_specific_symbol (optarg, &weaken_specific_list);
2897 break;
2898
2899 case 'p':
2900 preserve_dates = TRUE;
2901 break;
2902
2903 case 'w':
2904 wildcard = TRUE;
2905 break;
2906
2907 case 'x':
2908 discard_locals = LOCALS_ALL;
2909 break;
2910
2911 case 'X':
2912 discard_locals = LOCALS_START_L;
2913 break;
2914
2915 case 'v':
2916 verbose = TRUE;
2917 break;
2918
2919 case 'V':
2920 show_version = TRUE;
2921 break;
2922
2923 case OPTION_FORMATS_INFO:
2924 formats_info = TRUE;
2925 break;
2926
2927 case OPTION_WEAKEN:
2928 weaken = TRUE;
2929 break;
2930
2931 case OPTION_ADD_SECTION:
2932 {
2933 const char *s;
2934 off_t size;
2935 struct section_add *pa;
2936 int len;
2937 char *name;
2938 FILE *f;
2939
2940 s = strchr (optarg, '=');
2941
2942 if (s == NULL)
2943 fatal (_("bad format for %s"), "--add-section");
2944
2945 size = get_file_size (s + 1);
2946 if (size < 1)
2947 {
2948 status = 1;
2949 break;
2950 }
2951
2952 pa = xmalloc (sizeof (struct section_add));
2953
2954 len = s - optarg;
2955 name = xmalloc (len + 1);
2956 strncpy (name, optarg, len);
2957 name[len] = '\0';
2958 pa->name = name;
2959
2960 pa->filename = s + 1;
2961 pa->size = size;
2962 pa->contents = xmalloc (size);
2963
2964 f = fopen (pa->filename, FOPEN_RB);
2965
2966 if (f == NULL)
2967 fatal (_("cannot open: %s: %s"),
2968 pa->filename, strerror (errno));
2969
2970 if (fread (pa->contents, 1, pa->size, f) == 0
2971 || ferror (f))
2972 fatal (_("%s: fread failed"), pa->filename);
2973
2974 fclose (f);
2975
2976 pa->next = add_sections;
2977 add_sections = pa;
2978 }
2979 break;
2980
2981 case OPTION_CHANGE_START:
2982 change_start = parse_vma (optarg, "--change-start");
2983 break;
2984
2985 case OPTION_CHANGE_SECTION_ADDRESS:
2986 case OPTION_CHANGE_SECTION_LMA:
2987 case OPTION_CHANGE_SECTION_VMA:
2988 {
2989 const char *s;
2990 int len;
2991 char *name;
2992 char *option = NULL;
2993 bfd_vma val;
2994 enum change_action what = CHANGE_IGNORE;
2995
2996 switch (c)
2997 {
2998 case OPTION_CHANGE_SECTION_ADDRESS:
2999 option = "--change-section-address";
3000 break;
3001 case OPTION_CHANGE_SECTION_LMA:
3002 option = "--change-section-lma";
3003 break;
3004 case OPTION_CHANGE_SECTION_VMA:
3005 option = "--change-section-vma";
3006 break;
3007 }
3008
3009 s = strchr (optarg, '=');
3010 if (s == NULL)
3011 {
3012 s = strchr (optarg, '+');
3013 if (s == NULL)
3014 {
3015 s = strchr (optarg, '-');
3016 if (s == NULL)
3017 fatal (_("bad format for %s"), option);
3018 }
3019 }
3020
3021 len = s - optarg;
3022 name = xmalloc (len + 1);
3023 strncpy (name, optarg, len);
3024 name[len] = '\0';
3025
3026 p = find_section_list (name, TRUE);
3027
3028 val = parse_vma (s + 1, option);
3029
3030 switch (*s)
3031 {
3032 case '=': what = CHANGE_SET; break;
3033 case '-': val = - val; /* Drop through. */
3034 case '+': what = CHANGE_MODIFY; break;
3035 }
3036
3037 switch (c)
3038 {
3039 case OPTION_CHANGE_SECTION_ADDRESS:
3040 p->change_vma = what;
3041 p->vma_val = val;
3042 /* Drop through. */
3043
3044 case OPTION_CHANGE_SECTION_LMA:
3045 p->change_lma = what;
3046 p->lma_val = val;
3047 break;
3048
3049 case OPTION_CHANGE_SECTION_VMA:
3050 p->change_vma = what;
3051 p->vma_val = val;
3052 break;
3053 }
3054 }
3055 break;
3056
3057 case OPTION_CHANGE_ADDRESSES:
3058 change_section_address = parse_vma (optarg, "--change-addresses");
3059 change_start = change_section_address;
3060 break;
3061
3062 case OPTION_CHANGE_WARNINGS:
3063 change_warn = TRUE;
3064 break;
3065
3066 case OPTION_CHANGE_LEADING_CHAR:
3067 change_leading_char = TRUE;
3068 break;
3069
3070 case OPTION_DEBUGGING:
3071 convert_debugging = TRUE;
3072 break;
3073
3074 case OPTION_GAP_FILL:
3075 {
3076 bfd_vma gap_fill_vma;
3077
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)
3081 {
3082 char buff[20];
3083
3084 sprintf_vma (buff, gap_fill_vma);
3085
3086 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
3087 buff, gap_fill);
3088 }
3089 gap_fill_set = TRUE;
3090 }
3091 break;
3092
3093 case OPTION_NO_CHANGE_WARNINGS:
3094 change_warn = FALSE;
3095 break;
3096
3097 case OPTION_PAD_TO:
3098 pad_to = parse_vma (optarg, "--pad-to");
3099 pad_to_set = TRUE;
3100 break;
3101
3102 case OPTION_REMOVE_LEADING_CHAR:
3103 remove_leading_char = TRUE;
3104 break;
3105
3106 case OPTION_REDEFINE_SYM:
3107 {
3108 /* Push this redefinition onto redefine_symbol_list. */
3109
3110 int len;
3111 const char *s;
3112 const char *nextarg;
3113 char *source, *target;
3114
3115 s = strchr (optarg, '=');
3116 if (s == NULL)
3117 fatal (_("bad format for %s"), "--redefine-sym");
3118
3119 len = s - optarg;
3120 source = xmalloc (len + 1);
3121 strncpy (source, optarg, len);
3122 source[len] = '\0';
3123
3124 nextarg = s + 1;
3125 len = strlen (nextarg);
3126 target = xmalloc (len + 1);
3127 strcpy (target, nextarg);
3128
3129 redefine_list_append ("--redefine-sym", source, target);
3130
3131 free (source);
3132 free (target);
3133 }
3134 break;
3135
3136 case OPTION_REDEFINE_SYMS:
3137 add_redefine_syms_file (optarg);
3138 break;
3139
3140 case OPTION_SET_SECTION_FLAGS:
3141 {
3142 const char *s;
3143 int len;
3144 char *name;
3145
3146 s = strchr (optarg, '=');
3147 if (s == NULL)
3148 fatal (_("bad format for %s"), "--set-section-flags");
3149
3150 len = s - optarg;
3151 name = xmalloc (len + 1);
3152 strncpy (name, optarg, len);
3153 name[len] = '\0';
3154
3155 p = find_section_list (name, TRUE);
3156
3157 p->set_flags = TRUE;
3158 p->flags = parse_flags (s + 1);
3159 }
3160 break;
3161
3162 case OPTION_RENAME_SECTION:
3163 {
3164 flagword flags;
3165 const char *eq, *fl;
3166 char *old_name;
3167 char *new_name;
3168 unsigned int len;
3169
3170 eq = strchr (optarg, '=');
3171 if (eq == NULL)
3172 fatal (_("bad format for %s"), "--rename-section");
3173
3174 len = eq - optarg;
3175 if (len == 0)
3176 fatal (_("bad format for %s"), "--rename-section");
3177
3178 old_name = xmalloc (len + 1);
3179 strncpy (old_name, optarg, len);
3180 old_name[len] = 0;
3181
3182 eq++;
3183 fl = strchr (eq, ',');
3184 if (fl)
3185 {
3186 flags = parse_flags (fl + 1);
3187 len = fl - eq;
3188 }
3189 else
3190 {
3191 flags = -1;
3192 len = strlen (eq);
3193 }
3194
3195 if (len == 0)
3196 fatal (_("bad format for %s"), "--rename-section");
3197
3198 new_name = xmalloc (len + 1);
3199 strncpy (new_name, eq, len);
3200 new_name[len] = 0;
3201
3202 add_section_rename (old_name, new_name, flags);
3203 }
3204 break;
3205
3206 case OPTION_SET_START:
3207 set_start = parse_vma (optarg, "--set-start");
3208 set_start_set = TRUE;
3209 break;
3210
3211 case OPTION_SREC_LEN:
3212 Chunk = parse_vma (optarg, "--srec-len");
3213 break;
3214
3215 case OPTION_SREC_FORCES3:
3216 S3Forced = TRUE;
3217 break;
3218
3219 case OPTION_STRIP_SYMBOLS:
3220 add_specific_symbols (optarg, &strip_specific_list);
3221 break;
3222
3223 case OPTION_STRIP_UNNEEDED_SYMBOLS:
3224 add_specific_symbols (optarg, &strip_unneeded_list);
3225 break;
3226
3227 case OPTION_KEEP_SYMBOLS:
3228 add_specific_symbols (optarg, &keep_specific_list);
3229 break;
3230
3231 case OPTION_LOCALIZE_HIDDEN:
3232 localize_hidden = TRUE;
3233 break;
3234
3235 case OPTION_LOCALIZE_SYMBOLS:
3236 add_specific_symbols (optarg, &localize_specific_list);
3237 break;
3238
3239 case OPTION_GLOBALIZE_SYMBOLS:
3240 add_specific_symbols (optarg, &globalize_specific_list);
3241 break;
3242
3243 case OPTION_KEEPGLOBAL_SYMBOLS:
3244 add_specific_symbols (optarg, &keepglobal_specific_list);
3245 break;
3246
3247 case OPTION_WEAKEN_SYMBOLS:
3248 add_specific_symbols (optarg, &weaken_specific_list);
3249 break;
3250
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"));
3255 break;
3256
3257 case OPTION_PREFIX_SYMBOLS:
3258 prefix_symbols_string = optarg;
3259 break;
3260
3261 case OPTION_PREFIX_SECTIONS:
3262 prefix_sections_string = optarg;
3263 break;
3264
3265 case OPTION_PREFIX_ALLOC_SECTIONS:
3266 prefix_alloc_sections_string = optarg;
3267 break;
3268
3269 case OPTION_READONLY_TEXT:
3270 bfd_flags_to_set |= WP_TEXT;
3271 bfd_flags_to_clear &= ~WP_TEXT;
3272 break;
3273
3274 case OPTION_WRITABLE_TEXT:
3275 bfd_flags_to_clear |= WP_TEXT;
3276 bfd_flags_to_set &= ~WP_TEXT;
3277 break;
3278
3279 case OPTION_PURE:
3280 bfd_flags_to_set |= D_PAGED;
3281 bfd_flags_to_clear &= ~D_PAGED;
3282 break;
3283
3284 case OPTION_IMPURE:
3285 bfd_flags_to_clear |= D_PAGED;
3286 bfd_flags_to_set &= ~D_PAGED;
3287 break;
3288
3289 case OPTION_EXTRACT_SYMBOL:
3290 extract_symbol = TRUE;
3291 break;
3292
3293 case OPTION_REVERSE_BYTES:
3294 {
3295 int prev = reverse_bytes;
3296
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"));
3300
3301 if (prev && prev != reverse_bytes)
3302 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
3303 prev);
3304 break;
3305 }
3306
3307 case 0:
3308 /* We've been given a long option. */
3309 break;
3310
3311 case 'H':
3312 case 'h':
3313 copy_usage (stdout, 0);
3314
3315 default:
3316 copy_usage (stderr, 1);
3317 }
3318 }
3319
3320 if (formats_info)
3321 {
3322 display_info ();
3323 return 0;
3324 }
3325
3326 if (show_version)
3327 print_version ("objcopy");
3328
3329 if (copy_byte >= interleave)
3330 fatal (_("byte number must be less than interleave"));
3331
3332 if (optind == argc || optind + 2 < argc)
3333 copy_usage (stderr, 1);
3334
3335 input_filename = argv[optind];
3336 if (optind + 1 < argc)
3337 output_filename = argv[optind + 1];
3338
3339 /* Default is to strip no symbols. */
3340 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
3341 strip_symbols = STRIP_NONE;
3342
3343 if (output_target == NULL)
3344 output_target = input_target;
3345
3346 if (binary_architecture != NULL)
3347 {
3348 if (input_target && strcmp (input_target, "binary") == 0)
3349 {
3350 const bfd_arch_info_type * temp_arch_info;
3351
3352 temp_arch_info = bfd_scan_arch (binary_architecture);
3353
3354 if (temp_arch_info != NULL)
3355 {
3356 bfd_external_binary_architecture = temp_arch_info->arch;
3357 bfd_external_machine = temp_arch_info->mach;
3358 }
3359 else
3360 fatal (_("architecture %s unknown"), binary_architecture);
3361 }
3362 else
3363 {
3364 non_fatal (_("Warning: input target 'binary' required for binary architecture parameter."));
3365 non_fatal (_(" Argument %s ignored"), binary_architecture);
3366 }
3367 }
3368
3369 if (preserve_dates)
3370 if (stat (input_filename, & statbuf) < 0)
3371 fatal (_("warning: could not locate '%s'. System error message: %s"),
3372 input_filename, strerror (errno));
3373
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)
3377 {
3378 char *tmpname = make_tempname (input_filename);
3379
3380 if (tmpname == NULL)
3381 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
3382 input_filename, strerror (errno));
3383
3384 copy_file (input_filename, tmpname, input_target, output_target);
3385 if (status == 0)
3386 {
3387 if (preserve_dates)
3388 set_times (tmpname, &statbuf);
3389 smart_rename (tmpname, input_filename, preserve_dates);
3390 }
3391 else
3392 unlink (tmpname);
3393 }
3394 else
3395 {
3396 copy_file (input_filename, output_filename, input_target, output_target);
3397
3398 if (status == 0 && preserve_dates)
3399 set_times (output_filename, &statbuf);
3400 else if (status != 0)
3401 unlink_if_ordinary (output_filename);
3402 }
3403
3404 if (change_warn)
3405 {
3406 for (p = change_sections; p != NULL; p = p->next)
3407 {
3408 if (! p->used)
3409 {
3410 if (p->change_vma != CHANGE_IGNORE)
3411 {
3412 char buff [20];
3413
3414 sprintf_vma (buff, p->vma_val);
3415
3416 /* xgettext:c-format */
3417 non_fatal (_("%s %s%c0x%s never used"),
3418 "--change-section-vma",
3419 p->name,
3420 p->change_vma == CHANGE_SET ? '=' : '+',
3421 buff);
3422 }
3423
3424 if (p->change_lma != CHANGE_IGNORE)
3425 {
3426 char buff [20];
3427
3428 sprintf_vma (buff, p->lma_val);
3429
3430 /* xgettext:c-format */
3431 non_fatal (_("%s %s%c0x%s never used"),
3432 "--change-section-lma",
3433 p->name,
3434 p->change_lma == CHANGE_SET ? '=' : '+',
3435 buff);
3436 }
3437 }
3438 }
3439 }
3440
3441 return 0;
3442 }
3443
3444 int
3445 main (int argc, char *argv[])
3446 {
3447 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
3448 setlocale (LC_MESSAGES, "");
3449 #endif
3450 #if defined (HAVE_SETLOCALE)
3451 setlocale (LC_CTYPE, "");
3452 #endif
3453 bindtextdomain (PACKAGE, LOCALEDIR);
3454 textdomain (PACKAGE);
3455
3456 program_name = argv[0];
3457 xmalloc_set_program_name (program_name);
3458
3459 START_PROGRESS (program_name, 0);
3460
3461 expandargv (&argc, &argv);
3462
3463 strip_symbols = STRIP_UNDEF;
3464 discard_locals = LOCALS_UNDEF;
3465
3466 bfd_init ();
3467 set_default_bfd_target ();
3468
3469 if (is_strip < 0)
3470 {
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)
3475 {
3476 i -= 4;
3477 program_name[i] = '\0';
3478 }
3479 #endif
3480 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
3481 }
3482
3483 if (is_strip)
3484 strip_main (argc, argv);
3485 else
3486 copy_main (argc, argv);
3487
3488 END_PROGRESS (program_name);
3489
3490 return status;
3491 }
This page took 0.102337 seconds and 5 git commands to generate.