binutils/
[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
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 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
219 enum command_line_switch
220 {
221 OPTION_ADD_SECTION=150,
222 OPTION_CHANGE_ADDRESSES,
223 OPTION_CHANGE_LEADING_CHAR,
224 OPTION_CHANGE_START,
225 OPTION_CHANGE_SECTION_ADDRESS,
226 OPTION_CHANGE_SECTION_LMA,
227 OPTION_CHANGE_SECTION_VMA,
228 OPTION_CHANGE_WARNINGS,
229 OPTION_DEBUGGING,
230 OPTION_GAP_FILL,
231 OPTION_NO_CHANGE_WARNINGS,
232 OPTION_PAD_TO,
233 OPTION_REMOVE_LEADING_CHAR,
234 OPTION_SET_SECTION_FLAGS,
235 OPTION_SET_START,
236 OPTION_STRIP_UNNEEDED,
237 OPTION_WEAKEN,
238 OPTION_REDEFINE_SYM,
239 OPTION_REDEFINE_SYMS,
240 OPTION_SREC_LEN,
241 OPTION_SREC_FORCES3,
242 OPTION_STRIP_SYMBOLS,
243 OPTION_STRIP_UNNEEDED_SYMBOL,
244 OPTION_STRIP_UNNEEDED_SYMBOLS,
245 OPTION_KEEP_SYMBOLS,
246 OPTION_LOCALIZE_HIDDEN,
247 OPTION_LOCALIZE_SYMBOLS,
248 OPTION_GLOBALIZE_SYMBOL,
249 OPTION_GLOBALIZE_SYMBOLS,
250 OPTION_KEEPGLOBAL_SYMBOLS,
251 OPTION_WEAKEN_SYMBOLS,
252 OPTION_RENAME_SECTION,
253 OPTION_ALT_MACH_CODE,
254 OPTION_PREFIX_SYMBOLS,
255 OPTION_PREFIX_SECTIONS,
256 OPTION_PREFIX_ALLOC_SECTIONS,
257 OPTION_FORMATS_INFO,
258 OPTION_ADD_GNU_DEBUGLINK,
259 OPTION_ONLY_KEEP_DEBUG,
260 OPTION_KEEP_FILE_SYMBOLS,
261 OPTION_READONLY_TEXT,
262 OPTION_WRITABLE_TEXT,
263 OPTION_PURE,
264 OPTION_IMPURE
265 };
266
267 /* Options to handle if running as "strip". */
268
269 static struct option strip_options[] =
270 {
271 {"discard-all", no_argument, 0, 'x'},
272 {"discard-locals", no_argument, 0, 'X'},
273 {"format", required_argument, 0, 'F'}, /* Obsolete */
274 {"help", no_argument, 0, 'h'},
275 {"info", no_argument, 0, OPTION_FORMATS_INFO},
276 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
277 {"input-target", required_argument, 0, 'I'},
278 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
279 {"keep-symbol", required_argument, 0, 'K'},
280 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
281 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
282 {"output-target", required_argument, 0, 'O'},
283 {"output-file", required_argument, 0, 'o'},
284 {"preserve-dates", no_argument, 0, 'p'},
285 {"remove-section", required_argument, 0, 'R'},
286 {"strip-all", no_argument, 0, 's'},
287 {"strip-debug", no_argument, 0, 'S'},
288 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
289 {"strip-symbol", required_argument, 0, 'N'},
290 {"target", required_argument, 0, 'F'},
291 {"verbose", no_argument, 0, 'v'},
292 {"version", no_argument, 0, 'V'},
293 {"wildcard", no_argument, 0, 'w'},
294 {0, no_argument, 0, 0}
295 };
296
297 /* Options to handle if running as "objcopy". */
298
299 static struct option copy_options[] =
300 {
301 {"add-gnu-debuglink", required_argument, 0, OPTION_ADD_GNU_DEBUGLINK},
302 {"add-section", required_argument, 0, OPTION_ADD_SECTION},
303 {"adjust-start", required_argument, 0, OPTION_CHANGE_START},
304 {"adjust-vma", required_argument, 0, OPTION_CHANGE_ADDRESSES},
305 {"adjust-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
306 {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
307 {"alt-machine-code", required_argument, 0, OPTION_ALT_MACH_CODE},
308 {"binary-architecture", required_argument, 0, 'B'},
309 {"byte", required_argument, 0, 'b'},
310 {"change-addresses", required_argument, 0, OPTION_CHANGE_ADDRESSES},
311 {"change-leading-char", no_argument, 0, OPTION_CHANGE_LEADING_CHAR},
312 {"change-section-address", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
313 {"change-section-lma", required_argument, 0, OPTION_CHANGE_SECTION_LMA},
314 {"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA},
315 {"change-start", required_argument, 0, OPTION_CHANGE_START},
316 {"change-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
317 {"debugging", no_argument, 0, OPTION_DEBUGGING},
318 {"discard-all", no_argument, 0, 'x'},
319 {"discard-locals", no_argument, 0, 'X'},
320 {"format", required_argument, 0, 'F'}, /* Obsolete */
321 {"gap-fill", required_argument, 0, OPTION_GAP_FILL},
322 {"globalize-symbol", required_argument, 0, OPTION_GLOBALIZE_SYMBOL},
323 {"globalize-symbols", required_argument, 0, OPTION_GLOBALIZE_SYMBOLS},
324 {"help", no_argument, 0, 'h'},
325 {"impure", no_argument, 0, OPTION_IMPURE},
326 {"info", no_argument, 0, OPTION_FORMATS_INFO},
327 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
328 {"input-target", required_argument, 0, 'I'},
329 {"interleave", required_argument, 0, 'i'},
330 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
331 {"keep-global-symbol", required_argument, 0, 'G'},
332 {"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS},
333 {"keep-symbol", required_argument, 0, 'K'},
334 {"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS},
335 {"localize-hidden", no_argument, 0, OPTION_LOCALIZE_HIDDEN},
336 {"localize-symbol", required_argument, 0, 'L'},
337 {"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
338 {"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
339 {"no-change-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
340 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
341 {"only-section", required_argument, 0, 'j'},
342 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
343 {"output-target", required_argument, 0, 'O'},
344 {"pad-to", required_argument, 0, OPTION_PAD_TO},
345 {"prefix-symbols", required_argument, 0, OPTION_PREFIX_SYMBOLS},
346 {"prefix-sections", required_argument, 0, OPTION_PREFIX_SECTIONS},
347 {"prefix-alloc-sections", required_argument, 0, OPTION_PREFIX_ALLOC_SECTIONS},
348 {"preserve-dates", no_argument, 0, 'p'},
349 {"pure", no_argument, 0, OPTION_PURE},
350 {"readonly-text", no_argument, 0, OPTION_READONLY_TEXT},
351 {"redefine-sym", required_argument, 0, OPTION_REDEFINE_SYM},
352 {"redefine-syms", required_argument, 0, OPTION_REDEFINE_SYMS},
353 {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR},
354 {"remove-section", required_argument, 0, 'R'},
355 {"rename-section", required_argument, 0, OPTION_RENAME_SECTION},
356 {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS},
357 {"set-start", required_argument, 0, OPTION_SET_START},
358 {"srec-len", required_argument, 0, OPTION_SREC_LEN},
359 {"srec-forceS3", no_argument, 0, OPTION_SREC_FORCES3},
360 {"strip-all", no_argument, 0, 'S'},
361 {"strip-debug", no_argument, 0, 'g'},
362 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
363 {"strip-unneeded-symbol", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOL},
364 {"strip-unneeded-symbols", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOLS},
365 {"strip-symbol", required_argument, 0, 'N'},
366 {"strip-symbols", required_argument, 0, OPTION_STRIP_SYMBOLS},
367 {"target", required_argument, 0, 'F'},
368 {"verbose", no_argument, 0, 'v'},
369 {"version", no_argument, 0, 'V'},
370 {"weaken", no_argument, 0, OPTION_WEAKEN},
371 {"weaken-symbol", required_argument, 0, 'W'},
372 {"weaken-symbols", required_argument, 0, OPTION_WEAKEN_SYMBOLS},
373 {"wildcard", no_argument, 0, 'w'},
374 {"writable-text", no_argument, 0, OPTION_WRITABLE_TEXT},
375 {0, no_argument, 0, 0}
376 };
377
378 /* IMPORTS */
379 extern char *program_name;
380
381 /* This flag distinguishes between strip and objcopy:
382 1 means this is 'strip'; 0 means this is 'objcopy'.
383 -1 means if we should use argv[0] to decide. */
384 extern int is_strip;
385
386 /* The maximum length of an S record. This variable is declared in srec.c
387 and can be modified by the --srec-len parameter. */
388 extern unsigned int Chunk;
389
390 /* Restrict the generation of Srecords to type S3 only.
391 This variable is declare in bfd/srec.c and can be toggled
392 on by the --srec-forceS3 command line switch. */
393 extern bfd_boolean S3Forced;
394
395 /* Defined in bfd/binary.c. Used to set architecture and machine of input
396 binary files. */
397 extern enum bfd_architecture bfd_external_binary_architecture;
398 extern unsigned long bfd_external_machine;
399
400 /* Forward declarations. */
401 static void setup_section (bfd *, asection *, void *);
402 static void setup_bfd_headers (bfd *, bfd *);
403 static void copy_section (bfd *, asection *, void *);
404 static void get_sections (bfd *, asection *, void *);
405 static int compare_section_lma (const void *, const void *);
406 static void mark_symbols_used_in_relocations (bfd *, asection *, void *);
407 static bfd_boolean write_debugging_info (bfd *, void *, long *, asymbol ***);
408 static const char *lookup_sym_redefinition (const char *);
409 \f
410 static void
411 copy_usage (FILE *stream, int exit_status)
412 {
413 fprintf (stream, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name);
414 fprintf (stream, _(" Copies a binary file, possibly transforming it in the process\n"));
415 fprintf (stream, _(" The options are:\n"));
416 fprintf (stream, _("\
417 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
418 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
419 -B --binary-architecture <arch> Set arch of output file, when input is binary\n\
420 -F --target <bfdname> Set both input and output format to <bfdname>\n\
421 --debugging Convert debugging information, if possible\n\
422 -p --preserve-dates Copy modified/access timestamps to the output\n\
423 -j --only-section <name> Only copy section <name> into the output\n\
424 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
425 -R --remove-section <name> Remove section <name> from the output\n\
426 -S --strip-all Remove all symbol and relocation information\n\
427 -g --strip-debug Remove all debugging symbols & sections\n\
428 --strip-unneeded Remove all symbols not needed by relocations\n\
429 -N --strip-symbol <name> Do not copy symbol <name>\n\
430 --strip-unneeded-symbol <name>\n\
431 Do not copy symbol <name> unless needed by\n\
432 relocations\n\
433 --only-keep-debug Strip everything but the debug information\n\
434 -K --keep-symbol <name> Do not strip symbol <name>\n\
435 --keep-file-symbols Do not strip file symbol(s)\n\
436 --localize-hidden Turn all ELF hidden symbols into locals\n\
437 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
438 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
439 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
440 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
441 --weaken Force all global symbols to be marked as weak\n\
442 -w --wildcard Permit wildcard in symbol comparison\n\
443 -x --discard-all Remove all non-global symbols\n\
444 -X --discard-locals Remove any compiler-generated symbols\n\
445 -i --interleave <number> Only copy one out of every <number> bytes\n\
446 -b --byte <num> Select byte <num> in every interleaved block\n\
447 --gap-fill <val> Fill gaps between sections with <val>\n\
448 --pad-to <addr> Pad the last section up to address <addr>\n\
449 --set-start <addr> Set the start address to <addr>\n\
450 {--change-start|--adjust-start} <incr>\n\
451 Add <incr> to the start address\n\
452 {--change-addresses|--adjust-vma} <incr>\n\
453 Add <incr> to LMA, VMA and start addresses\n\
454 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
455 Change LMA and VMA of section <name> by <val>\n\
456 --change-section-lma <name>{=|+|-}<val>\n\
457 Change the LMA of section <name> by <val>\n\
458 --change-section-vma <name>{=|+|-}<val>\n\
459 Change the VMA of section <name> by <val>\n\
460 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
461 Warn if a named section does not exist\n\
462 --set-section-flags <name>=<flags>\n\
463 Set section <name>'s properties to <flags>\n\
464 --add-section <name>=<file> Add section <name> found in <file> to output\n\
465 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
466 --change-leading-char Force output format's leading character style\n\
467 --remove-leading-char Remove leading character from global symbols\n\
468 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
469 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
470 listed in <file>\n\
471 --srec-len <number> Restrict the length of generated Srecords\n\
472 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
473 --strip-symbols <file> -N for all symbols listed in <file>\n\
474 --strip-unneeded-symbols <file>\n\
475 --strip-unneeded-symbol for all symbols listed\n\
476 in <file>\n\
477 --keep-symbols <file> -K for all symbols listed in <file>\n\
478 --localize-symbols <file> -L for all symbols listed in <file>\n\
479 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
480 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
481 --weaken-symbols <file> -W for all symbols listed in <file>\n\
482 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
483 --writable-text Mark the output text as writable\n\
484 --readonly-text Make the output text write protected\n\
485 --pure Mark the output file as demand paged\n\
486 --impure Mark the output file as impure\n\
487 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
488 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
489 --prefix-alloc-sections <prefix>\n\
490 Add <prefix> to start of every allocatable\n\
491 section name\n\
492 -v --verbose List all object files modified\n\
493 @<file> Read options from <file>\n\
494 -V --version Display this program's version number\n\
495 -h --help Display this output\n\
496 --info List object formats & architectures supported\n\
497 "));
498 list_supported_targets (program_name, stream);
499 if (exit_status == 0)
500 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
501 exit (exit_status);
502 }
503
504 static void
505 strip_usage (FILE *stream, int exit_status)
506 {
507 fprintf (stream, _("Usage: %s <option(s)> in-file(s)\n"), program_name);
508 fprintf (stream, _(" Removes symbols and sections from files\n"));
509 fprintf (stream, _(" The options are:\n"));
510 fprintf (stream, _("\
511 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
512 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
513 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
514 -p --preserve-dates Copy modified/access timestamps to the output\n\
515 -R --remove-section=<name> Remove section <name> from the output\n\
516 -s --strip-all Remove all symbol and relocation information\n\
517 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
518 --strip-unneeded Remove all symbols not needed by relocations\n\
519 --only-keep-debug Strip everything but the debug information\n\
520 -N --strip-symbol=<name> Do not copy symbol <name>\n\
521 -K --keep-symbol=<name> Do not strip symbol <name>\n\
522 --keep-file-symbols Do not strip file symbol(s)\n\
523 -w --wildcard Permit wildcard in symbol comparison\n\
524 -x --discard-all Remove all non-global symbols\n\
525 -X --discard-locals Remove any compiler-generated symbols\n\
526 -v --verbose List all object files modified\n\
527 -V --version Display this program's version number\n\
528 -h --help Display this output\n\
529 --info List object formats & architectures supported\n\
530 -o <file> Place stripped output into <file>\n\
531 "));
532
533 list_supported_targets (program_name, stream);
534 if (exit_status == 0)
535 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
536 exit (exit_status);
537 }
538
539 /* Parse section flags into a flagword, with a fatal error if the
540 string can't be parsed. */
541
542 static flagword
543 parse_flags (const char *s)
544 {
545 flagword ret;
546 const char *snext;
547 int len;
548
549 ret = SEC_NO_FLAGS;
550
551 do
552 {
553 snext = strchr (s, ',');
554 if (snext == NULL)
555 len = strlen (s);
556 else
557 {
558 len = snext - s;
559 ++snext;
560 }
561
562 if (0) ;
563 #define PARSE_FLAG(fname,fval) \
564 else if (strncasecmp (fname, s, len) == 0) ret |= fval
565 PARSE_FLAG ("alloc", SEC_ALLOC);
566 PARSE_FLAG ("load", SEC_LOAD);
567 PARSE_FLAG ("noload", SEC_NEVER_LOAD);
568 PARSE_FLAG ("readonly", SEC_READONLY);
569 PARSE_FLAG ("debug", SEC_DEBUGGING);
570 PARSE_FLAG ("code", SEC_CODE);
571 PARSE_FLAG ("data", SEC_DATA);
572 PARSE_FLAG ("rom", SEC_ROM);
573 PARSE_FLAG ("share", SEC_COFF_SHARED);
574 PARSE_FLAG ("contents", SEC_HAS_CONTENTS);
575 #undef PARSE_FLAG
576 else
577 {
578 char *copy;
579
580 copy = xmalloc (len + 1);
581 strncpy (copy, s, len);
582 copy[len] = '\0';
583 non_fatal (_("unrecognized section flag `%s'"), copy);
584 fatal (_("supported flags: %s"),
585 "alloc, load, noload, readonly, debug, code, data, rom, share, contents");
586 }
587
588 s = snext;
589 }
590 while (s != NULL);
591
592 return ret;
593 }
594
595 /* Find and optionally add an entry in the change_sections list. */
596
597 static struct section_list *
598 find_section_list (const char *name, bfd_boolean add)
599 {
600 struct section_list *p;
601
602 for (p = change_sections; p != NULL; p = p->next)
603 if (strcmp (p->name, name) == 0)
604 return p;
605
606 if (! add)
607 return NULL;
608
609 p = xmalloc (sizeof (struct section_list));
610 p->name = name;
611 p->used = FALSE;
612 p->remove = FALSE;
613 p->copy = FALSE;
614 p->change_vma = CHANGE_IGNORE;
615 p->change_lma = CHANGE_IGNORE;
616 p->vma_val = 0;
617 p->lma_val = 0;
618 p->set_flags = FALSE;
619 p->flags = 0;
620
621 p->next = change_sections;
622 change_sections = p;
623
624 return p;
625 }
626
627 /* Add a symbol to strip_specific_list. */
628
629 static void
630 add_specific_symbol (const char *name, struct symlist **list)
631 {
632 struct symlist *tmp_list;
633
634 tmp_list = xmalloc (sizeof (struct symlist));
635 tmp_list->name = name;
636 tmp_list->next = *list;
637 *list = tmp_list;
638 }
639
640 /* Add symbols listed in `filename' to strip_specific_list. */
641
642 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
643 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
644
645 static void
646 add_specific_symbols (const char *filename, struct symlist **list)
647 {
648 off_t size;
649 FILE * f;
650 char * line;
651 char * buffer;
652 unsigned int line_count;
653
654 size = get_file_size (filename);
655 if (size == 0)
656 return;
657
658 buffer = xmalloc (size + 2);
659 f = fopen (filename, FOPEN_RT);
660 if (f == NULL)
661 fatal (_("cannot open '%s': %s"), filename, strerror (errno));
662
663 if (fread (buffer, 1, size, f) == 0 || ferror (f))
664 fatal (_("%s: fread failed"), filename);
665
666 fclose (f);
667 buffer [size] = '\n';
668 buffer [size + 1] = '\0';
669
670 line_count = 1;
671
672 for (line = buffer; * line != '\0'; line ++)
673 {
674 char * eol;
675 char * name;
676 char * name_end;
677 int finished = FALSE;
678
679 for (eol = line;; eol ++)
680 {
681 switch (* eol)
682 {
683 case '\n':
684 * eol = '\0';
685 /* Cope with \n\r. */
686 if (eol[1] == '\r')
687 ++ eol;
688 finished = TRUE;
689 break;
690
691 case '\r':
692 * eol = '\0';
693 /* Cope with \r\n. */
694 if (eol[1] == '\n')
695 ++ eol;
696 finished = TRUE;
697 break;
698
699 case 0:
700 finished = TRUE;
701 break;
702
703 case '#':
704 /* Line comment, Terminate the line here, in case a
705 name is present and then allow the rest of the
706 loop to find the real end of the line. */
707 * eol = '\0';
708 break;
709
710 default:
711 break;
712 }
713
714 if (finished)
715 break;
716 }
717
718 /* A name may now exist somewhere between 'line' and 'eol'.
719 Strip off leading whitespace and trailing whitespace,
720 then add it to the list. */
721 for (name = line; IS_WHITESPACE (* name); name ++)
722 ;
723 for (name_end = name;
724 (! IS_WHITESPACE (* name_end))
725 && (! IS_LINE_TERMINATOR (* name_end));
726 name_end ++)
727 ;
728
729 if (! IS_LINE_TERMINATOR (* name_end))
730 {
731 char * extra;
732
733 for (extra = name_end + 1; IS_WHITESPACE (* extra); extra ++)
734 ;
735
736 if (! IS_LINE_TERMINATOR (* extra))
737 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
738 filename, line_count);
739 }
740
741 * name_end = '\0';
742
743 if (name_end > name)
744 add_specific_symbol (name, list);
745
746 /* Advance line pointer to end of line. The 'eol ++' in the for
747 loop above will then advance us to the start of the next line. */
748 line = eol;
749 line_count ++;
750 }
751 }
752
753 /* See whether a symbol should be stripped or kept based on
754 strip_specific_list and keep_symbols. */
755
756 static bfd_boolean
757 is_specified_symbol (const char *name, struct symlist *list)
758 {
759 struct symlist *tmp_list;
760
761 if (wildcard)
762 {
763 for (tmp_list = list; tmp_list; tmp_list = tmp_list->next)
764 if (*(tmp_list->name) != '!')
765 {
766 if (!fnmatch (tmp_list->name, name, 0))
767 return TRUE;
768 }
769 else
770 {
771 if (fnmatch (tmp_list->name + 1, name, 0))
772 return TRUE;
773 }
774 }
775 else
776 {
777 for (tmp_list = list; tmp_list; tmp_list = tmp_list->next)
778 if (strcmp (name, tmp_list->name) == 0)
779 return TRUE;
780 }
781
782 return FALSE;
783 }
784
785 /* See if a section is being removed. */
786
787 static bfd_boolean
788 is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
789 {
790 if (sections_removed || sections_copied)
791 {
792 struct section_list *p;
793
794 p = find_section_list (bfd_get_section_name (abfd, sec), FALSE);
795
796 if (sections_removed && p != NULL && p->remove)
797 return TRUE;
798 if (sections_copied && (p == NULL || ! p->copy))
799 return TRUE;
800 }
801
802 if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
803 {
804 if (strip_symbols == STRIP_DEBUG
805 || strip_symbols == STRIP_UNNEEDED
806 || strip_symbols == STRIP_ALL
807 || discard_locals == LOCALS_ALL
808 || convert_debugging)
809 return TRUE;
810
811 if (strip_symbols == STRIP_NONDEBUG)
812 return FALSE;
813 }
814
815 return FALSE;
816 }
817
818 /* Return true if SYM is a hidden symbol. */
819
820 static bfd_boolean
821 is_hidden_symbol (asymbol *sym)
822 {
823 elf_symbol_type *elf_sym;
824
825 elf_sym = elf_symbol_from (sym->the_bfd, sym);
826 if (elf_sym != NULL)
827 switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
828 {
829 case STV_HIDDEN:
830 case STV_INTERNAL:
831 return TRUE;
832 }
833 return FALSE;
834 }
835
836 /* Choose which symbol entries to copy; put the result in OSYMS.
837 We don't copy in place, because that confuses the relocs.
838 Return the number of symbols to print. */
839
840 static unsigned int
841 filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
842 asymbol **isyms, long symcount)
843 {
844 asymbol **from = isyms, **to = osyms;
845 long src_count = 0, dst_count = 0;
846 int relocatable = (abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC))
847 == HAS_RELOC;
848
849 for (; src_count < symcount; src_count++)
850 {
851 asymbol *sym = from[src_count];
852 flagword flags = sym->flags;
853 char *name = (char *) bfd_asymbol_name (sym);
854 int keep;
855 bfd_boolean undefined;
856 bfd_boolean rem_leading_char;
857 bfd_boolean add_leading_char;
858
859 undefined = bfd_is_und_section (bfd_get_section (sym));
860
861 if (redefine_sym_list)
862 {
863 char *old_name, *new_name;
864
865 old_name = (char *) bfd_asymbol_name (sym);
866 new_name = (char *) lookup_sym_redefinition (old_name);
867 bfd_asymbol_name (sym) = new_name;
868 name = new_name;
869 }
870
871 /* Check if we will remove the current leading character. */
872 rem_leading_char =
873 (name[0] == bfd_get_symbol_leading_char (abfd))
874 && (change_leading_char
875 || (remove_leading_char
876 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
877 || undefined
878 || bfd_is_com_section (bfd_get_section (sym)))));
879
880 /* Check if we will add a new leading character. */
881 add_leading_char =
882 change_leading_char
883 && (bfd_get_symbol_leading_char (obfd) != '\0')
884 && (bfd_get_symbol_leading_char (abfd) == '\0'
885 || (name[0] == bfd_get_symbol_leading_char (abfd)));
886
887 /* Short circuit for change_leading_char if we can do it in-place. */
888 if (rem_leading_char && add_leading_char && !prefix_symbols_string)
889 {
890 name[0] = bfd_get_symbol_leading_char (obfd);
891 bfd_asymbol_name (sym) = name;
892 rem_leading_char = FALSE;
893 add_leading_char = FALSE;
894 }
895
896 /* Remove leading char. */
897 if (rem_leading_char)
898 bfd_asymbol_name (sym) = ++name;
899
900 /* Add new leading char and/or prefix. */
901 if (add_leading_char || prefix_symbols_string)
902 {
903 char *n, *ptr;
904
905 ptr = n = xmalloc (1 + strlen (prefix_symbols_string)
906 + strlen (name) + 1);
907 if (add_leading_char)
908 *ptr++ = bfd_get_symbol_leading_char (obfd);
909
910 if (prefix_symbols_string)
911 {
912 strcpy (ptr, prefix_symbols_string);
913 ptr += strlen (prefix_symbols_string);
914 }
915
916 strcpy (ptr, name);
917 bfd_asymbol_name (sym) = n;
918 name = n;
919 }
920
921 if (strip_symbols == STRIP_ALL)
922 keep = 0;
923 else if ((flags & BSF_KEEP) != 0 /* Used in relocation. */
924 || ((flags & BSF_SECTION_SYM) != 0
925 && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
926 & BSF_KEEP) != 0))
927 keep = 1;
928 else if (relocatable /* Relocatable file. */
929 && (flags & (BSF_GLOBAL | BSF_WEAK)) != 0)
930 keep = 1;
931 else if (bfd_decode_symclass (sym) == 'I')
932 /* Global symbols in $idata sections need to be retained
933 even if relocatable is FALSE. External users of the
934 library containing the $idata section may reference these
935 symbols. */
936 keep = 1;
937 else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */
938 || (flags & BSF_WEAK) != 0
939 || undefined
940 || bfd_is_com_section (bfd_get_section (sym)))
941 keep = strip_symbols != STRIP_UNNEEDED;
942 else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */
943 keep = (strip_symbols != STRIP_DEBUG
944 && strip_symbols != STRIP_UNNEEDED
945 && ! convert_debugging);
946 else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym)))
947 /* COMDAT sections store special information in local
948 symbols, so we cannot risk stripping any of them. */
949 keep = 1;
950 else /* Local symbol. */
951 keep = (strip_symbols != STRIP_UNNEEDED
952 && (discard_locals != LOCALS_ALL
953 && (discard_locals != LOCALS_START_L
954 || ! bfd_is_local_label (abfd, sym))));
955
956 if (keep && is_specified_symbol (name, strip_specific_list))
957 keep = 0;
958 if (keep
959 && !(flags & BSF_KEEP)
960 && is_specified_symbol (name, strip_unneeded_list))
961 keep = 0;
962 if (!keep
963 && ((keep_file_symbols && (flags & BSF_FILE))
964 || is_specified_symbol (name, keep_specific_list)))
965 keep = 1;
966 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
967 keep = 0;
968
969 if (keep)
970 {
971 if ((flags & BSF_GLOBAL) != 0
972 && (weaken || is_specified_symbol (name, weaken_specific_list)))
973 {
974 sym->flags &= ~ BSF_GLOBAL;
975 sym->flags |= BSF_WEAK;
976 }
977
978 if (!undefined
979 && (flags & (BSF_GLOBAL | BSF_WEAK))
980 && (is_specified_symbol (name, localize_specific_list)
981 || (keepglobal_specific_list != NULL
982 && ! is_specified_symbol (name, keepglobal_specific_list))
983 || (localize_hidden && is_hidden_symbol (sym))))
984 {
985 sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
986 sym->flags |= BSF_LOCAL;
987 }
988
989 if (!undefined
990 && (flags & BSF_LOCAL)
991 && is_specified_symbol (name, globalize_specific_list))
992 {
993 sym->flags &= ~ BSF_LOCAL;
994 sym->flags |= BSF_GLOBAL;
995 }
996
997 to[dst_count++] = sym;
998 }
999 }
1000
1001 to[dst_count] = NULL;
1002
1003 return dst_count;
1004 }
1005
1006 /* Find the redefined name of symbol SOURCE. */
1007
1008 static const char *
1009 lookup_sym_redefinition (const char *source)
1010 {
1011 struct redefine_node *list;
1012
1013 for (list = redefine_sym_list; list != NULL; list = list->next)
1014 if (strcmp (source, list->source) == 0)
1015 return list->target;
1016
1017 return source;
1018 }
1019
1020 /* Add a node to a symbol redefine list. */
1021
1022 static void
1023 redefine_list_append (const char *cause, const char *source, const char *target)
1024 {
1025 struct redefine_node **p;
1026 struct redefine_node *list;
1027 struct redefine_node *new_node;
1028
1029 for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next)
1030 {
1031 if (strcmp (source, list->source) == 0)
1032 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1033 cause, source);
1034
1035 if (strcmp (target, list->target) == 0)
1036 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1037 cause, target);
1038 }
1039
1040 new_node = xmalloc (sizeof (struct redefine_node));
1041
1042 new_node->source = strdup (source);
1043 new_node->target = strdup (target);
1044 new_node->next = NULL;
1045
1046 *p = new_node;
1047 }
1048
1049 /* Handle the --redefine-syms option. Read lines containing "old new"
1050 from the file, and add them to the symbol redefine list. */
1051
1052 static void
1053 add_redefine_syms_file (const char *filename)
1054 {
1055 FILE *file;
1056 char *buf;
1057 size_t bufsize;
1058 size_t len;
1059 size_t outsym_off;
1060 int c, lineno;
1061
1062 file = fopen (filename, "r");
1063 if (file == NULL)
1064 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1065 filename, strerror (errno));
1066
1067 bufsize = 100;
1068 buf = xmalloc (bufsize);
1069
1070 lineno = 1;
1071 c = getc (file);
1072 len = 0;
1073 outsym_off = 0;
1074 while (c != EOF)
1075 {
1076 /* Collect the input symbol name. */
1077 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1078 {
1079 if (c == '#')
1080 goto comment;
1081 buf[len++] = c;
1082 if (len >= bufsize)
1083 {
1084 bufsize *= 2;
1085 buf = xrealloc (buf, bufsize);
1086 }
1087 c = getc (file);
1088 }
1089 buf[len++] = '\0';
1090 if (c == EOF)
1091 break;
1092
1093 /* Eat white space between the symbol names. */
1094 while (IS_WHITESPACE (c))
1095 c = getc (file);
1096 if (c == '#' || IS_LINE_TERMINATOR (c))
1097 goto comment;
1098 if (c == EOF)
1099 break;
1100
1101 /* Collect the output symbol name. */
1102 outsym_off = len;
1103 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1104 {
1105 if (c == '#')
1106 goto comment;
1107 buf[len++] = c;
1108 if (len >= bufsize)
1109 {
1110 bufsize *= 2;
1111 buf = xrealloc (buf, bufsize);
1112 }
1113 c = getc (file);
1114 }
1115 buf[len++] = '\0';
1116 if (c == EOF)
1117 break;
1118
1119 /* Eat white space at end of line. */
1120 while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c))
1121 c = getc (file);
1122 if (c == '#')
1123 goto comment;
1124 /* Handle \r\n. */
1125 if ((c == '\r' && (c = getc (file)) == '\n')
1126 || c == '\n' || c == EOF)
1127 {
1128 end_of_line:
1129 /* Append the redefinition to the list. */
1130 if (buf[0] != '\0')
1131 redefine_list_append (filename, &buf[0], &buf[outsym_off]);
1132
1133 lineno++;
1134 len = 0;
1135 outsym_off = 0;
1136 if (c == EOF)
1137 break;
1138 c = getc (file);
1139 continue;
1140 }
1141 else
1142 fatal (_("%s:%d: garbage found at end of line"), filename, lineno);
1143 comment:
1144 if (len != 0 && (outsym_off == 0 || outsym_off == len))
1145 fatal (_("%s:%d: missing new symbol name"), filename, lineno);
1146 buf[len++] = '\0';
1147
1148 /* Eat the rest of the line and finish it. */
1149 while (c != '\n' && c != EOF)
1150 c = getc (file);
1151 goto end_of_line;
1152 }
1153
1154 if (len != 0)
1155 fatal (_("%s:%d: premature end of file"), filename, lineno);
1156
1157 free (buf);
1158 }
1159
1160 /* Copy unkown object file IBFD onto OBFD.
1161 Returns TRUE upon success, FALSE otherwise. */
1162
1163 static bfd_boolean
1164 copy_unknown_object (bfd *ibfd, bfd *obfd)
1165 {
1166 char *cbuf;
1167 int tocopy;
1168 long ncopied;
1169 long size;
1170 struct stat buf;
1171
1172 if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1173 {
1174 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1175 return FALSE;
1176 }
1177
1178 size = buf.st_size;
1179 if (size < 0)
1180 {
1181 non_fatal (_("stat returns negative size for `%s'"),
1182 bfd_get_archive_filename (ibfd));
1183 return FALSE;
1184 }
1185
1186 if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1187 {
1188 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1189 return FALSE;
1190 }
1191
1192 if (verbose)
1193 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1194 bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1195
1196 cbuf = xmalloc (BUFSIZE);
1197 ncopied = 0;
1198 while (ncopied < size)
1199 {
1200 tocopy = size - ncopied;
1201 if (tocopy > BUFSIZE)
1202 tocopy = BUFSIZE;
1203
1204 if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1205 != (bfd_size_type) tocopy)
1206 {
1207 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1208 free (cbuf);
1209 return FALSE;
1210 }
1211
1212 if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1213 != (bfd_size_type) tocopy)
1214 {
1215 bfd_nonfatal (bfd_get_filename (obfd));
1216 free (cbuf);
1217 return FALSE;
1218 }
1219
1220 ncopied += tocopy;
1221 }
1222
1223 chmod (bfd_get_filename (obfd), buf.st_mode);
1224 free (cbuf);
1225 return TRUE;
1226 }
1227
1228 /* Copy object file IBFD onto OBFD.
1229 Returns TRUE upon success, FALSE otherwise. */
1230
1231 static bfd_boolean
1232 copy_object (bfd *ibfd, bfd *obfd)
1233 {
1234 bfd_vma start;
1235 long symcount;
1236 asection **osections = NULL;
1237 asection *gnu_debuglink_section = NULL;
1238 bfd_size_type *gaps = NULL;
1239 bfd_size_type max_gap = 0;
1240 long symsize;
1241 void *dhandle;
1242 enum bfd_architecture iarch;
1243 unsigned int imach;
1244
1245 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1246 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
1247 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
1248 fatal (_("Unable to change endianness of input file(s)"));
1249
1250 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1251 {
1252 bfd_nonfatal (bfd_get_filename (obfd));
1253 return FALSE;
1254 }
1255
1256 if (verbose)
1257 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
1258 bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
1259 bfd_get_filename (obfd), bfd_get_target (obfd));
1260
1261 if (set_start_set)
1262 start = set_start;
1263 else
1264 start = bfd_get_start_address (ibfd);
1265 start += change_start;
1266
1267 /* Neither the start address nor the flags
1268 need to be set for a core file. */
1269 if (bfd_get_format (obfd) != bfd_core)
1270 {
1271 flagword flags;
1272
1273 flags = bfd_get_file_flags (ibfd);
1274 flags |= bfd_flags_to_set;
1275 flags &= ~bfd_flags_to_clear;
1276 flags &= bfd_applicable_file_flags (obfd);
1277
1278 if (!bfd_set_start_address (obfd, start)
1279 || !bfd_set_file_flags (obfd, flags))
1280 {
1281 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1282 return FALSE;
1283 }
1284 }
1285
1286 /* Copy architecture of input file to output file. */
1287 iarch = bfd_get_arch (ibfd);
1288 imach = bfd_get_mach (ibfd);
1289 if (!bfd_set_arch_mach (obfd, iarch, imach)
1290 && (ibfd->target_defaulted
1291 || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
1292 {
1293 if (bfd_get_arch (ibfd) == bfd_arch_unknown)
1294 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1295 bfd_get_archive_filename (ibfd));
1296 else
1297 non_fatal (_("Warning: Output file cannot represent architecture `%s'"),
1298 bfd_printable_arch_mach (bfd_get_arch (ibfd),
1299 bfd_get_mach (ibfd)));
1300 return FALSE;
1301 }
1302
1303 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1304 {
1305 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1306 return FALSE;
1307 }
1308
1309 if (isympp)
1310 free (isympp);
1311
1312 if (osympp != isympp)
1313 free (osympp);
1314
1315 isympp = NULL;
1316 osympp = NULL;
1317
1318 /* BFD mandates that all output sections be created and sizes set before
1319 any output is done. Thus, we traverse all sections multiple times. */
1320 bfd_map_over_sections (ibfd, setup_section, obfd);
1321
1322 setup_bfd_headers (ibfd, obfd);
1323
1324 if (add_sections != NULL)
1325 {
1326 struct section_add *padd;
1327 struct section_list *pset;
1328
1329 for (padd = add_sections; padd != NULL; padd = padd->next)
1330 {
1331 flagword flags;
1332
1333 pset = find_section_list (padd->name, FALSE);
1334 if (pset != NULL)
1335 pset->used = TRUE;
1336
1337 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
1338 if (pset != NULL && pset->set_flags)
1339 flags = pset->flags | SEC_HAS_CONTENTS;
1340
1341 /* bfd_make_section_with_flags() does not return very helpful
1342 error codes, so check for the most likely user error first. */
1343 if (bfd_get_section_by_name (obfd, padd->name))
1344 {
1345 non_fatal (_("can't add section '%s' - it already exists!"), padd->name);
1346 return FALSE;
1347 }
1348 else
1349 {
1350 padd->section = bfd_make_section_with_flags (obfd, padd->name, flags);
1351 if (padd->section == NULL)
1352 {
1353 non_fatal (_("can't create section `%s': %s"),
1354 padd->name, bfd_errmsg (bfd_get_error ()));
1355 return FALSE;
1356 }
1357 }
1358
1359 if (! bfd_set_section_size (obfd, padd->section, padd->size))
1360 {
1361 bfd_nonfatal (bfd_get_filename (obfd));
1362 return FALSE;
1363 }
1364
1365 if (pset != NULL)
1366 {
1367 if (pset->change_vma != CHANGE_IGNORE)
1368 if (! bfd_set_section_vma (obfd, padd->section,
1369 pset->vma_val))
1370 {
1371 bfd_nonfatal (bfd_get_filename (obfd));
1372 return FALSE;
1373 }
1374
1375 if (pset->change_lma != CHANGE_IGNORE)
1376 {
1377 padd->section->lma = pset->lma_val;
1378
1379 if (! bfd_set_section_alignment
1380 (obfd, padd->section,
1381 bfd_section_alignment (obfd, padd->section)))
1382 {
1383 bfd_nonfatal (bfd_get_filename (obfd));
1384 return FALSE;
1385 }
1386 }
1387 }
1388 }
1389 }
1390
1391 if (gnu_debuglink_filename != NULL)
1392 {
1393 gnu_debuglink_section = bfd_create_gnu_debuglink_section
1394 (obfd, gnu_debuglink_filename);
1395
1396 if (gnu_debuglink_section == NULL)
1397 {
1398 bfd_nonfatal (gnu_debuglink_filename);
1399 return FALSE;
1400 }
1401
1402 /* Special processing for PE format files. We
1403 have no way to distinguish PE from COFF here. */
1404 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour)
1405 {
1406 bfd_vma debuglink_vma;
1407 asection * highest_section;
1408 asection * sec;
1409
1410 /* The PE spec requires that all sections be adjacent and sorted
1411 in ascending order of VMA. It also specifies that debug
1412 sections should be last. This is despite the fact that debug
1413 sections are not loaded into memory and so in theory have no
1414 use for a VMA.
1415
1416 This means that the debuglink section must be given a non-zero
1417 VMA which makes it contiguous with other debug sections. So
1418 walk the current section list, find the section with the
1419 highest VMA and start the debuglink section after that one. */
1420 for (sec = obfd->sections, highest_section = NULL;
1421 sec != NULL;
1422 sec = sec->next)
1423 if (sec->vma > 0
1424 && (highest_section == NULL
1425 || sec->vma > highest_section->vma))
1426 highest_section = sec;
1427
1428 if (highest_section)
1429 debuglink_vma = BFD_ALIGN (highest_section->vma
1430 + highest_section->size,
1431 /* FIXME: We ought to be using
1432 COFF_PAGE_SIZE here or maybe
1433 bfd_get_section_alignment() (if it
1434 was set) but since this is for PE
1435 and we know the required alignment
1436 it is easier just to hard code it. */
1437 0x1000);
1438 else
1439 /* Umm, not sure what to do in this case. */
1440 debuglink_vma = 0x1000;
1441
1442 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
1443 }
1444 }
1445
1446 if (bfd_count_sections (obfd) == 0)
1447 {
1448 non_fatal (_("there are no sections to be copied!"));
1449 return FALSE;
1450 }
1451
1452 if (gap_fill_set || pad_to_set)
1453 {
1454 asection **set;
1455 unsigned int c, i;
1456
1457 /* We must fill in gaps between the sections and/or we must pad
1458 the last section to a specified address. We do this by
1459 grabbing a list of the sections, sorting them by VMA, and
1460 increasing the section sizes as required to fill the gaps.
1461 We write out the gap contents below. */
1462
1463 c = bfd_count_sections (obfd);
1464 osections = xmalloc (c * sizeof (asection *));
1465 set = osections;
1466 bfd_map_over_sections (obfd, get_sections, &set);
1467
1468 qsort (osections, c, sizeof (asection *), compare_section_lma);
1469
1470 gaps = xmalloc (c * sizeof (bfd_size_type));
1471 memset (gaps, 0, c * sizeof (bfd_size_type));
1472
1473 if (gap_fill_set)
1474 {
1475 for (i = 0; i < c - 1; i++)
1476 {
1477 flagword flags;
1478 bfd_size_type size;
1479 bfd_vma gap_start, gap_stop;
1480
1481 flags = bfd_get_section_flags (obfd, osections[i]);
1482 if ((flags & SEC_HAS_CONTENTS) == 0
1483 || (flags & SEC_LOAD) == 0)
1484 continue;
1485
1486 size = bfd_section_size (obfd, osections[i]);
1487 gap_start = bfd_section_lma (obfd, osections[i]) + size;
1488 gap_stop = bfd_section_lma (obfd, osections[i + 1]);
1489 if (gap_start < gap_stop)
1490 {
1491 if (! bfd_set_section_size (obfd, osections[i],
1492 size + (gap_stop - gap_start)))
1493 {
1494 non_fatal (_("Can't fill gap after %s: %s"),
1495 bfd_get_section_name (obfd, osections[i]),
1496 bfd_errmsg (bfd_get_error ()));
1497 status = 1;
1498 break;
1499 }
1500 gaps[i] = gap_stop - gap_start;
1501 if (max_gap < gap_stop - gap_start)
1502 max_gap = gap_stop - gap_start;
1503 }
1504 }
1505 }
1506
1507 if (pad_to_set)
1508 {
1509 bfd_vma lma;
1510 bfd_size_type size;
1511
1512 lma = bfd_section_lma (obfd, osections[c - 1]);
1513 size = bfd_section_size (obfd, osections[c - 1]);
1514 if (lma + size < pad_to)
1515 {
1516 if (! bfd_set_section_size (obfd, osections[c - 1],
1517 pad_to - lma))
1518 {
1519 non_fatal (_("Can't add padding to %s: %s"),
1520 bfd_get_section_name (obfd, osections[c - 1]),
1521 bfd_errmsg (bfd_get_error ()));
1522 status = 1;
1523 }
1524 else
1525 {
1526 gaps[c - 1] = pad_to - (lma + size);
1527 if (max_gap < pad_to - (lma + size))
1528 max_gap = pad_to - (lma + size);
1529 }
1530 }
1531 }
1532 }
1533
1534 /* Symbol filtering must happen after the output sections
1535 have been created, but before their contents are set. */
1536 dhandle = NULL;
1537 symsize = bfd_get_symtab_upper_bound (ibfd);
1538 if (symsize < 0)
1539 {
1540 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1541 return FALSE;
1542 }
1543
1544 osympp = isympp = xmalloc (symsize);
1545 symcount = bfd_canonicalize_symtab (ibfd, isympp);
1546 if (symcount < 0)
1547 {
1548 bfd_nonfatal (bfd_get_filename (ibfd));
1549 return FALSE;
1550 }
1551
1552 if (convert_debugging)
1553 dhandle = read_debugging_info (ibfd, isympp, symcount);
1554
1555 if (strip_symbols == STRIP_DEBUG
1556 || strip_symbols == STRIP_ALL
1557 || strip_symbols == STRIP_UNNEEDED
1558 || strip_symbols == STRIP_NONDEBUG
1559 || discard_locals != LOCALS_UNDEF
1560 || localize_hidden
1561 || strip_specific_list != NULL
1562 || keep_specific_list != NULL
1563 || localize_specific_list != NULL
1564 || globalize_specific_list != NULL
1565 || keepglobal_specific_list != NULL
1566 || weaken_specific_list != NULL
1567 || prefix_symbols_string
1568 || sections_removed
1569 || sections_copied
1570 || convert_debugging
1571 || change_leading_char
1572 || remove_leading_char
1573 || redefine_sym_list
1574 || weaken)
1575 {
1576 /* Mark symbols used in output relocations so that they
1577 are kept, even if they are local labels or static symbols.
1578
1579 Note we iterate over the input sections examining their
1580 relocations since the relocations for the output sections
1581 haven't been set yet. mark_symbols_used_in_relocations will
1582 ignore input sections which have no corresponding output
1583 section. */
1584 if (strip_symbols != STRIP_ALL)
1585 bfd_map_over_sections (ibfd,
1586 mark_symbols_used_in_relocations,
1587 isympp);
1588 osympp = xmalloc ((symcount + 1) * sizeof (asymbol *));
1589 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
1590 }
1591
1592 if (convert_debugging && dhandle != NULL)
1593 {
1594 if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
1595 {
1596 status = 1;
1597 return FALSE;
1598 }
1599 }
1600
1601 bfd_set_symtab (obfd, osympp, symcount);
1602
1603 /* This has to happen after the symbol table has been set. */
1604 bfd_map_over_sections (ibfd, copy_section, obfd);
1605
1606 if (add_sections != NULL)
1607 {
1608 struct section_add *padd;
1609
1610 for (padd = add_sections; padd != NULL; padd = padd->next)
1611 {
1612 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
1613 0, padd->size))
1614 {
1615 bfd_nonfatal (bfd_get_filename (obfd));
1616 return FALSE;
1617 }
1618 }
1619 }
1620
1621 if (gnu_debuglink_filename != NULL)
1622 {
1623 if (! bfd_fill_in_gnu_debuglink_section
1624 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
1625 {
1626 bfd_nonfatal (gnu_debuglink_filename);
1627 return FALSE;
1628 }
1629 }
1630
1631 if (gap_fill_set || pad_to_set)
1632 {
1633 bfd_byte *buf;
1634 int c, i;
1635
1636 /* Fill in the gaps. */
1637 if (max_gap > 8192)
1638 max_gap = 8192;
1639 buf = xmalloc (max_gap);
1640 memset (buf, gap_fill, max_gap);
1641
1642 c = bfd_count_sections (obfd);
1643 for (i = 0; i < c; i++)
1644 {
1645 if (gaps[i] != 0)
1646 {
1647 bfd_size_type left;
1648 file_ptr off;
1649
1650 left = gaps[i];
1651 off = bfd_section_size (obfd, osections[i]) - left;
1652
1653 while (left > 0)
1654 {
1655 bfd_size_type now;
1656
1657 if (left > 8192)
1658 now = 8192;
1659 else
1660 now = left;
1661
1662 if (! bfd_set_section_contents (obfd, osections[i], buf,
1663 off, now))
1664 {
1665 bfd_nonfatal (bfd_get_filename (obfd));
1666 return FALSE;
1667 }
1668
1669 left -= now;
1670 off += now;
1671 }
1672 }
1673 }
1674 }
1675
1676 /* Allow the BFD backend to copy any private data it understands
1677 from the input BFD to the output BFD. This is done last to
1678 permit the routine to look at the filtered symbol table, which is
1679 important for the ECOFF code at least. */
1680 if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour
1681 && strip_symbols == STRIP_NONDEBUG)
1682 /* Do not copy the private data when creating an ELF format
1683 debug info file. We do not want the program headers. */
1684 ;
1685 else if (! bfd_copy_private_bfd_data (ibfd, obfd))
1686 {
1687 non_fatal (_("%s: error copying private BFD data: %s"),
1688 bfd_get_filename (obfd),
1689 bfd_errmsg (bfd_get_error ()));
1690 return FALSE;
1691 }
1692
1693 /* Switch to the alternate machine code. We have to do this at the
1694 very end, because we only initialize the header when we create
1695 the first section. */
1696 if (use_alt_mach_code != 0)
1697 {
1698 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
1699 {
1700 non_fatal (_("this target does not support %lu alternative machine codes"),
1701 use_alt_mach_code);
1702 if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
1703 {
1704 non_fatal (_("treating that number as an absolute e_machine value instead"));
1705 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
1706 }
1707 else
1708 non_fatal (_("ignoring the alternative value"));
1709 }
1710 }
1711
1712 return TRUE;
1713 }
1714
1715 #undef MKDIR
1716 #if defined (_WIN32) && !defined (__CYGWIN32__)
1717 #define MKDIR(DIR, MODE) mkdir (DIR)
1718 #else
1719 #define MKDIR(DIR, MODE) mkdir (DIR, MODE)
1720 #endif
1721
1722 /* Read each archive element in turn from IBFD, copy the
1723 contents to temp file, and keep the temp file handle. */
1724
1725 static void
1726 copy_archive (bfd *ibfd, bfd *obfd, const char *output_target)
1727 {
1728 struct name_list
1729 {
1730 struct name_list *next;
1731 const char *name;
1732 bfd *obfd;
1733 } *list, *l;
1734 bfd **ptr = &obfd->archive_head;
1735 bfd *this_element;
1736 char *dir = make_tempname (bfd_get_filename (obfd));
1737
1738 /* Make a temp directory to hold the contents. */
1739 if (MKDIR (dir, 0700) != 0)
1740 fatal (_("cannot mkdir %s for archive copying (error: %s)"),
1741 dir, strerror (errno));
1742
1743 obfd->has_armap = ibfd->has_armap;
1744
1745 list = NULL;
1746
1747 this_element = bfd_openr_next_archived_file (ibfd, NULL);
1748
1749 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1750 RETURN_NONFATAL (bfd_get_filename (obfd));
1751
1752 while (!status && this_element != NULL)
1753 {
1754 char *output_name;
1755 bfd *output_bfd;
1756 bfd *last_element;
1757 struct stat buf;
1758 int stat_status = 0;
1759 bfd_boolean delete = TRUE;
1760
1761 /* Create an output file for this member. */
1762 output_name = concat (dir, "/",
1763 bfd_get_filename (this_element), (char *) 0);
1764
1765 /* If the file already exists, make another temp dir. */
1766 if (stat (output_name, &buf) >= 0)
1767 {
1768 output_name = make_tempname (output_name);
1769 if (MKDIR (output_name, 0700) != 0)
1770 fatal (_("cannot mkdir %s for archive copying (error: %s)"),
1771 output_name, strerror (errno));
1772
1773 l = xmalloc (sizeof (struct name_list));
1774 l->name = output_name;
1775 l->next = list;
1776 l->obfd = NULL;
1777 list = l;
1778 output_name = concat (output_name, "/",
1779 bfd_get_filename (this_element), (char *) 0);
1780 }
1781
1782 output_bfd = bfd_openw (output_name, output_target);
1783 if (preserve_dates)
1784 {
1785 stat_status = bfd_stat_arch_elt (this_element, &buf);
1786
1787 if (stat_status != 0)
1788 non_fatal (_("internal stat error on %s"),
1789 bfd_get_filename (this_element));
1790 }
1791
1792 l = xmalloc (sizeof (struct name_list));
1793 l->name = output_name;
1794 l->next = list;
1795 l->obfd = NULL;
1796 list = l;
1797
1798 if (output_bfd == NULL)
1799 RETURN_NONFATAL (output_name);
1800
1801 if (bfd_check_format (this_element, bfd_object))
1802 {
1803 delete = ! copy_object (this_element, output_bfd);
1804
1805 if (! delete
1806 || bfd_get_arch (this_element) != bfd_arch_unknown)
1807 {
1808 if (!bfd_close (output_bfd))
1809 {
1810 bfd_nonfatal (bfd_get_filename (output_bfd));
1811 /* Error in new object file. Don't change archive. */
1812 status = 1;
1813 }
1814 }
1815 else
1816 goto copy_unknown_element;
1817 }
1818 else
1819 {
1820 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1821 bfd_get_archive_filename (this_element));
1822
1823 copy_unknown_element:
1824 delete = !copy_unknown_object (this_element, output_bfd);
1825 if (!bfd_close_all_done (output_bfd))
1826 {
1827 bfd_nonfatal (bfd_get_filename (output_bfd));
1828 /* Error in new object file. Don't change archive. */
1829 status = 1;
1830 }
1831 }
1832
1833 if (delete)
1834 {
1835 unlink (output_name);
1836 status = 1;
1837 }
1838 else
1839 {
1840 if (preserve_dates && stat_status == 0)
1841 set_times (output_name, &buf);
1842
1843 /* Open the newly output file and attach to our list. */
1844 output_bfd = bfd_openr (output_name, output_target);
1845
1846 l->obfd = output_bfd;
1847
1848 *ptr = output_bfd;
1849 ptr = &output_bfd->next;
1850
1851 last_element = this_element;
1852
1853 this_element = bfd_openr_next_archived_file (ibfd, last_element);
1854
1855 bfd_close (last_element);
1856 }
1857 }
1858 *ptr = NULL;
1859
1860 if (!bfd_close (obfd))
1861 RETURN_NONFATAL (bfd_get_filename (obfd));
1862
1863 if (!bfd_close (ibfd))
1864 RETURN_NONFATAL (bfd_get_filename (ibfd));
1865
1866 /* Delete all the files that we opened. */
1867 for (l = list; l != NULL; l = l->next)
1868 {
1869 if (l->obfd == NULL)
1870 rmdir (l->name);
1871 else
1872 {
1873 bfd_close (l->obfd);
1874 unlink (l->name);
1875 }
1876 }
1877 rmdir (dir);
1878 }
1879
1880 /* The top-level control. */
1881
1882 static void
1883 copy_file (const char *input_filename, const char *output_filename,
1884 const char *input_target, const char *output_target)
1885 {
1886 bfd *ibfd;
1887 char **obj_matching;
1888 char **core_matching;
1889
1890 if (get_file_size (input_filename) < 1)
1891 {
1892 non_fatal (_("error: the input file '%s' is empty"), input_filename);
1893 status = 1;
1894 return;
1895 }
1896
1897 /* To allow us to do "strip *" without dying on the first
1898 non-object file, failures are nonfatal. */
1899 ibfd = bfd_openr (input_filename, input_target);
1900 if (ibfd == NULL)
1901 RETURN_NONFATAL (input_filename);
1902
1903 if (bfd_check_format (ibfd, bfd_archive))
1904 {
1905 bfd *obfd;
1906
1907 /* bfd_get_target does not return the correct value until
1908 bfd_check_format succeeds. */
1909 if (output_target == NULL)
1910 output_target = bfd_get_target (ibfd);
1911
1912 obfd = bfd_openw (output_filename, output_target);
1913 if (obfd == NULL)
1914 RETURN_NONFATAL (output_filename);
1915
1916 copy_archive (ibfd, obfd, output_target);
1917 }
1918 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
1919 {
1920 bfd *obfd;
1921 do_copy:
1922
1923 /* bfd_get_target does not return the correct value until
1924 bfd_check_format succeeds. */
1925 if (output_target == NULL)
1926 output_target = bfd_get_target (ibfd);
1927
1928 obfd = bfd_openw (output_filename, output_target);
1929 if (obfd == NULL)
1930 RETURN_NONFATAL (output_filename);
1931
1932 if (! copy_object (ibfd, obfd))
1933 status = 1;
1934
1935 if (!bfd_close (obfd))
1936 RETURN_NONFATAL (output_filename);
1937
1938 if (!bfd_close (ibfd))
1939 RETURN_NONFATAL (input_filename);
1940
1941 }
1942 else
1943 {
1944 bfd_error_type obj_error = bfd_get_error ();
1945 bfd_error_type core_error;
1946
1947 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
1948 {
1949 /* This probably can't happen.. */
1950 if (obj_error == bfd_error_file_ambiguously_recognized)
1951 free (obj_matching);
1952 goto do_copy;
1953 }
1954
1955 core_error = bfd_get_error ();
1956 /* Report the object error in preference to the core error. */
1957 if (obj_error != core_error)
1958 bfd_set_error (obj_error);
1959
1960 bfd_nonfatal (input_filename);
1961
1962 if (obj_error == bfd_error_file_ambiguously_recognized)
1963 {
1964 list_matching_formats (obj_matching);
1965 free (obj_matching);
1966 }
1967 if (core_error == bfd_error_file_ambiguously_recognized)
1968 {
1969 list_matching_formats (core_matching);
1970 free (core_matching);
1971 }
1972
1973 status = 1;
1974 }
1975 }
1976
1977 /* Add a name to the section renaming list. */
1978
1979 static void
1980 add_section_rename (const char * old_name, const char * new_name,
1981 flagword flags)
1982 {
1983 section_rename * rename;
1984
1985 /* Check for conflicts first. */
1986 for (rename = section_rename_list; rename != NULL; rename = rename->next)
1987 if (strcmp (rename->old_name, old_name) == 0)
1988 {
1989 /* Silently ignore duplicate definitions. */
1990 if (strcmp (rename->new_name, new_name) == 0
1991 && rename->flags == flags)
1992 return;
1993
1994 fatal (_("Multiple renames of section %s"), old_name);
1995 }
1996
1997 rename = xmalloc (sizeof (* rename));
1998
1999 rename->old_name = old_name;
2000 rename->new_name = new_name;
2001 rename->flags = flags;
2002 rename->next = section_rename_list;
2003
2004 section_rename_list = rename;
2005 }
2006
2007 /* Check the section rename list for a new name of the input section
2008 ISECTION. Return the new name if one is found.
2009 Also set RETURNED_FLAGS to the flags to be used for this section. */
2010
2011 static const char *
2012 find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection,
2013 flagword * returned_flags)
2014 {
2015 const char * old_name = bfd_section_name (ibfd, isection);
2016 section_rename * rename;
2017
2018 /* Default to using the flags of the input section. */
2019 * returned_flags = bfd_get_section_flags (ibfd, isection);
2020
2021 for (rename = section_rename_list; rename != NULL; rename = rename->next)
2022 if (strcmp (rename->old_name, old_name) == 0)
2023 {
2024 if (rename->flags != (flagword) -1)
2025 * returned_flags = rename->flags;
2026
2027 return rename->new_name;
2028 }
2029
2030 return old_name;
2031 }
2032
2033 /* Once each of the sections is copied, we may still need to do some
2034 finalization work for private section headers. Do that here. */
2035
2036 static void
2037 setup_bfd_headers (bfd *ibfd, bfd *obfd)
2038 {
2039 const char *err;
2040
2041 /* Allow the BFD backend to copy any private data it understands
2042 from the input section to the output section. */
2043 if (! bfd_copy_private_header_data (ibfd, obfd))
2044 {
2045 err = _("private header data");
2046 goto loser;
2047 }
2048
2049 /* All went well. */
2050 return;
2051
2052 loser:
2053 non_fatal (_("%s: error in %s: %s"),
2054 bfd_get_filename (ibfd),
2055 err, bfd_errmsg (bfd_get_error ()));
2056 status = 1;
2057 }
2058
2059 /* Create a section in OBFD with the same
2060 name and attributes as ISECTION in IBFD. */
2061
2062 static void
2063 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2064 {
2065 bfd *obfd = obfdarg;
2066 struct section_list *p;
2067 sec_ptr osection;
2068 bfd_size_type size;
2069 bfd_vma vma;
2070 bfd_vma lma;
2071 flagword flags;
2072 const char *err;
2073 const char * name;
2074 char *prefix = NULL;
2075
2076 if (is_strip_section (ibfd, isection))
2077 return;
2078
2079 p = find_section_list (bfd_section_name (ibfd, isection), FALSE);
2080 if (p != NULL)
2081 p->used = TRUE;
2082
2083 /* Get the, possibly new, name of the output section. */
2084 name = find_section_rename (ibfd, isection, & flags);
2085
2086 /* Prefix sections. */
2087 if ((prefix_alloc_sections_string)
2088 && (bfd_get_section_flags (ibfd, isection) & SEC_ALLOC))
2089 prefix = prefix_alloc_sections_string;
2090 else if (prefix_sections_string)
2091 prefix = prefix_sections_string;
2092
2093 if (prefix)
2094 {
2095 char *n;
2096
2097 n = xmalloc (strlen (prefix) + strlen (name) + 1);
2098 strcpy (n, prefix);
2099 strcat (n, name);
2100 name = n;
2101 }
2102
2103 if (p != NULL && p->set_flags)
2104 flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
2105 else if (strip_symbols == STRIP_NONDEBUG && (flags & SEC_ALLOC) != 0)
2106 flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD);
2107
2108 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
2109
2110 if (osection == NULL)
2111 {
2112 err = _("making");
2113 goto loser;
2114 }
2115
2116 if (strip_symbols == STRIP_NONDEBUG
2117 && obfd->xvec->flavour == bfd_target_elf_flavour
2118 && (flags & SEC_ALLOC) != 0
2119 && (p == NULL || !p->set_flags))
2120 elf_section_type (osection) = SHT_NOBITS;
2121
2122 size = bfd_section_size (ibfd, isection);
2123 if (copy_byte >= 0)
2124 size = (size + interleave - 1) / interleave;
2125 if (! bfd_set_section_size (obfd, osection, size))
2126 {
2127 err = _("size");
2128 goto loser;
2129 }
2130
2131 vma = bfd_section_vma (ibfd, isection);
2132 if (p != NULL && p->change_vma == CHANGE_MODIFY)
2133 vma += p->vma_val;
2134 else if (p != NULL && p->change_vma == CHANGE_SET)
2135 vma = p->vma_val;
2136 else
2137 vma += change_section_address;
2138
2139 if (! bfd_set_section_vma (obfd, osection, vma))
2140 {
2141 err = _("vma");
2142 goto loser;
2143 }
2144
2145 lma = isection->lma;
2146 if ((p != NULL) && p->change_lma != CHANGE_IGNORE)
2147 {
2148 if (p->change_lma == CHANGE_MODIFY)
2149 lma += p->lma_val;
2150 else if (p->change_lma == CHANGE_SET)
2151 lma = p->lma_val;
2152 else
2153 abort ();
2154 }
2155 else
2156 lma += change_section_address;
2157
2158 osection->lma = lma;
2159
2160 /* FIXME: This is probably not enough. If we change the LMA we
2161 may have to recompute the header for the file as well. */
2162 if (!bfd_set_section_alignment (obfd,
2163 osection,
2164 bfd_section_alignment (ibfd, isection)))
2165 {
2166 err = _("alignment");
2167 goto loser;
2168 }
2169
2170 /* Copy merge entity size. */
2171 osection->entsize = isection->entsize;
2172
2173 /* This used to be mangle_section; we do here to avoid using
2174 bfd_get_section_by_name since some formats allow multiple
2175 sections with the same name. */
2176 isection->output_section = osection;
2177 isection->output_offset = 0;
2178
2179 /* Allow the BFD backend to copy any private data it understands
2180 from the input section to the output section. */
2181 if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour
2182 && strip_symbols == STRIP_NONDEBUG)
2183 /* Do not copy the private data when creating an ELF format
2184 debug info file. We do not want the program headers. */
2185 ;
2186 else if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
2187 {
2188 err = _("private data");
2189 goto loser;
2190 }
2191
2192 /* All went well. */
2193 return;
2194
2195 loser:
2196 non_fatal (_("%s: section `%s': error in %s: %s"),
2197 bfd_get_filename (ibfd),
2198 bfd_section_name (ibfd, isection),
2199 err, bfd_errmsg (bfd_get_error ()));
2200 status = 1;
2201 }
2202
2203 /* Copy the data of input section ISECTION of IBFD
2204 to an output section with the same name in OBFD.
2205 If stripping then don't copy any relocation info. */
2206
2207 static void
2208 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2209 {
2210 bfd *obfd = obfdarg;
2211 struct section_list *p;
2212 arelent **relpp;
2213 long relcount;
2214 sec_ptr osection;
2215 bfd_size_type size;
2216 long relsize;
2217 flagword flags;
2218
2219 /* If we have already failed earlier on,
2220 do not keep on generating complaints now. */
2221 if (status != 0)
2222 return;
2223
2224 if (is_strip_section (ibfd, isection))
2225 return;
2226
2227 flags = bfd_get_section_flags (ibfd, isection);
2228 if ((flags & SEC_GROUP) != 0)
2229 return;
2230
2231 osection = isection->output_section;
2232 size = bfd_get_section_size (isection);
2233
2234 if (size == 0 || osection == 0)
2235 return;
2236
2237 p = find_section_list (bfd_get_section_name (ibfd, isection), FALSE);
2238
2239 /* Core files do not need to be relocated. */
2240 if (bfd_get_format (obfd) == bfd_core)
2241 relsize = 0;
2242 else
2243 {
2244 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2245
2246 if (relsize < 0)
2247 {
2248 /* Do not complain if the target does not support relocations. */
2249 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2250 relsize = 0;
2251 else
2252 RETURN_NONFATAL (bfd_get_filename (ibfd));
2253 }
2254 }
2255
2256 if (relsize == 0)
2257 bfd_set_reloc (obfd, osection, NULL, 0);
2258 else
2259 {
2260 relpp = xmalloc (relsize);
2261 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
2262 if (relcount < 0)
2263 RETURN_NONFATAL (bfd_get_filename (ibfd));
2264
2265 if (strip_symbols == STRIP_ALL)
2266 {
2267 /* Remove relocations which are not in
2268 keep_strip_specific_list. */
2269 arelent **temp_relpp;
2270 long temp_relcount = 0;
2271 long i;
2272
2273 temp_relpp = xmalloc (relsize);
2274 for (i = 0; i < relcount; i++)
2275 if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
2276 keep_specific_list))
2277 temp_relpp [temp_relcount++] = relpp [i];
2278 relcount = temp_relcount;
2279 free (relpp);
2280 relpp = temp_relpp;
2281 }
2282
2283 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
2284 if (relcount == 0)
2285 free (relpp);
2286 }
2287
2288 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
2289 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
2290 {
2291 void *memhunk = xmalloc (size);
2292
2293 if (!bfd_get_section_contents (ibfd, isection, memhunk, 0, size))
2294 RETURN_NONFATAL (bfd_get_filename (ibfd));
2295
2296 if (copy_byte >= 0)
2297 {
2298 /* Keep only every `copy_byte'th byte in MEMHUNK. */
2299 char *from = (char *) memhunk + copy_byte;
2300 char *to = memhunk;
2301 char *end = (char *) memhunk + size;
2302
2303 for (; from < end; from += interleave)
2304 *to++ = *from;
2305
2306 size = (size + interleave - 1 - copy_byte) / interleave;
2307 osection->lma /= interleave;
2308 }
2309
2310 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2311 RETURN_NONFATAL (bfd_get_filename (obfd));
2312
2313 free (memhunk);
2314 }
2315 else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0)
2316 {
2317 void *memhunk = xmalloc (size);
2318
2319 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
2320 flag--they can just remove the section entirely and add it
2321 back again. However, we do permit them to turn on the
2322 SEC_HAS_CONTENTS flag, and take it to mean that the section
2323 contents should be zeroed out. */
2324
2325 memset (memhunk, 0, size);
2326 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2327 RETURN_NONFATAL (bfd_get_filename (obfd));
2328 free (memhunk);
2329 }
2330 }
2331
2332 /* Get all the sections. This is used when --gap-fill or --pad-to is
2333 used. */
2334
2335 static void
2336 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
2337 {
2338 asection ***secppp = secppparg;
2339
2340 **secppp = osection;
2341 ++(*secppp);
2342 }
2343
2344 /* Sort sections by VMA. This is called via qsort, and is used when
2345 --gap-fill or --pad-to is used. We force non loadable or empty
2346 sections to the front, where they are easier to ignore. */
2347
2348 static int
2349 compare_section_lma (const void *arg1, const void *arg2)
2350 {
2351 const asection *const *sec1 = arg1;
2352 const asection *const *sec2 = arg2;
2353 flagword flags1, flags2;
2354
2355 /* Sort non loadable sections to the front. */
2356 flags1 = (*sec1)->flags;
2357 flags2 = (*sec2)->flags;
2358 if ((flags1 & SEC_HAS_CONTENTS) == 0
2359 || (flags1 & SEC_LOAD) == 0)
2360 {
2361 if ((flags2 & SEC_HAS_CONTENTS) != 0
2362 && (flags2 & SEC_LOAD) != 0)
2363 return -1;
2364 }
2365 else
2366 {
2367 if ((flags2 & SEC_HAS_CONTENTS) == 0
2368 || (flags2 & SEC_LOAD) == 0)
2369 return 1;
2370 }
2371
2372 /* Sort sections by LMA. */
2373 if ((*sec1)->lma > (*sec2)->lma)
2374 return 1;
2375 else if ((*sec1)->lma < (*sec2)->lma)
2376 return -1;
2377
2378 /* Sort sections with the same LMA by size. */
2379 if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
2380 return 1;
2381 else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
2382 return -1;
2383
2384 return 0;
2385 }
2386
2387 /* Mark all the symbols which will be used in output relocations with
2388 the BSF_KEEP flag so that those symbols will not be stripped.
2389
2390 Ignore relocations which will not appear in the output file. */
2391
2392 static void
2393 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
2394 {
2395 asymbol **symbols = symbolsarg;
2396 long relsize;
2397 arelent **relpp;
2398 long relcount, i;
2399
2400 /* Ignore an input section with no corresponding output section. */
2401 if (isection->output_section == NULL)
2402 return;
2403
2404 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2405 if (relsize < 0)
2406 {
2407 /* Do not complain if the target does not support relocations. */
2408 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2409 return;
2410 bfd_fatal (bfd_get_filename (ibfd));
2411 }
2412
2413 if (relsize == 0)
2414 return;
2415
2416 relpp = xmalloc (relsize);
2417 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
2418 if (relcount < 0)
2419 bfd_fatal (bfd_get_filename (ibfd));
2420
2421 /* Examine each symbol used in a relocation. If it's not one of the
2422 special bfd section symbols, then mark it with BSF_KEEP. */
2423 for (i = 0; i < relcount; i++)
2424 {
2425 if (*relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
2426 && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
2427 && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
2428 (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
2429 }
2430
2431 if (relpp != NULL)
2432 free (relpp);
2433 }
2434
2435 /* Write out debugging information. */
2436
2437 static bfd_boolean
2438 write_debugging_info (bfd *obfd, void *dhandle,
2439 long *symcountp ATTRIBUTE_UNUSED,
2440 asymbol ***symppp ATTRIBUTE_UNUSED)
2441 {
2442 if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour)
2443 return write_ieee_debugging_info (obfd, dhandle);
2444
2445 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2446 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
2447 {
2448 bfd_byte *syms, *strings;
2449 bfd_size_type symsize, stringsize;
2450 asection *stabsec, *stabstrsec;
2451 flagword flags;
2452
2453 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
2454 &symsize, &strings,
2455 &stringsize))
2456 return FALSE;
2457
2458 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
2459 stabsec = bfd_make_section_with_flags (obfd, ".stab", flags);
2460 stabstrsec = bfd_make_section_with_flags (obfd, ".stabstr", flags);
2461 if (stabsec == NULL
2462 || stabstrsec == NULL
2463 || ! bfd_set_section_size (obfd, stabsec, symsize)
2464 || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
2465 || ! bfd_set_section_alignment (obfd, stabsec, 2)
2466 || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
2467 {
2468 non_fatal (_("%s: can't create debugging section: %s"),
2469 bfd_get_filename (obfd),
2470 bfd_errmsg (bfd_get_error ()));
2471 return FALSE;
2472 }
2473
2474 /* We can get away with setting the section contents now because
2475 the next thing the caller is going to do is copy over the
2476 real sections. We may someday have to split the contents
2477 setting out of this function. */
2478 if (! bfd_set_section_contents (obfd, stabsec, syms, 0, symsize)
2479 || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
2480 stringsize))
2481 {
2482 non_fatal (_("%s: can't set debugging section contents: %s"),
2483 bfd_get_filename (obfd),
2484 bfd_errmsg (bfd_get_error ()));
2485 return FALSE;
2486 }
2487
2488 return TRUE;
2489 }
2490
2491 non_fatal (_("%s: don't know how to write debugging information for %s"),
2492 bfd_get_filename (obfd), bfd_get_target (obfd));
2493 return FALSE;
2494 }
2495
2496 static int
2497 strip_main (int argc, char *argv[])
2498 {
2499 char *input_target = NULL;
2500 char *output_target = NULL;
2501 bfd_boolean show_version = FALSE;
2502 bfd_boolean formats_info = FALSE;
2503 int c;
2504 int i;
2505 struct section_list *p;
2506 char *output_file = NULL;
2507
2508 while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
2509 strip_options, (int *) 0)) != EOF)
2510 {
2511 switch (c)
2512 {
2513 case 'I':
2514 input_target = optarg;
2515 break;
2516 case 'O':
2517 output_target = optarg;
2518 break;
2519 case 'F':
2520 input_target = output_target = optarg;
2521 break;
2522 case 'R':
2523 p = find_section_list (optarg, TRUE);
2524 p->remove = TRUE;
2525 sections_removed = TRUE;
2526 break;
2527 case 's':
2528 strip_symbols = STRIP_ALL;
2529 break;
2530 case 'S':
2531 case 'g':
2532 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
2533 strip_symbols = STRIP_DEBUG;
2534 break;
2535 case OPTION_STRIP_UNNEEDED:
2536 strip_symbols = STRIP_UNNEEDED;
2537 break;
2538 case 'K':
2539 add_specific_symbol (optarg, &keep_specific_list);
2540 break;
2541 case 'N':
2542 add_specific_symbol (optarg, &strip_specific_list);
2543 break;
2544 case 'o':
2545 output_file = optarg;
2546 break;
2547 case 'p':
2548 preserve_dates = TRUE;
2549 break;
2550 case 'x':
2551 discard_locals = LOCALS_ALL;
2552 break;
2553 case 'X':
2554 discard_locals = LOCALS_START_L;
2555 break;
2556 case 'v':
2557 verbose = TRUE;
2558 break;
2559 case 'V':
2560 show_version = TRUE;
2561 break;
2562 case OPTION_FORMATS_INFO:
2563 formats_info = TRUE;
2564 break;
2565 case OPTION_ONLY_KEEP_DEBUG:
2566 strip_symbols = STRIP_NONDEBUG;
2567 break;
2568 case OPTION_KEEP_FILE_SYMBOLS:
2569 keep_file_symbols = 1;
2570 break;
2571 case 0:
2572 /* We've been given a long option. */
2573 break;
2574 case 'w':
2575 wildcard = TRUE;
2576 break;
2577 case 'H':
2578 case 'h':
2579 strip_usage (stdout, 0);
2580 default:
2581 strip_usage (stderr, 1);
2582 }
2583 }
2584
2585 if (formats_info)
2586 {
2587 display_info ();
2588 return 0;
2589 }
2590
2591 if (show_version)
2592 print_version ("strip");
2593
2594 /* Default is to strip all symbols. */
2595 if (strip_symbols == STRIP_UNDEF
2596 && discard_locals == LOCALS_UNDEF
2597 && strip_specific_list == NULL)
2598 strip_symbols = STRIP_ALL;
2599
2600 if (output_target == NULL)
2601 output_target = input_target;
2602
2603 i = optind;
2604 if (i == argc
2605 || (output_file != NULL && (i + 1) < argc))
2606 strip_usage (stderr, 1);
2607
2608 for (; i < argc; i++)
2609 {
2610 int hold_status = status;
2611 struct stat statbuf;
2612 char *tmpname;
2613
2614 if (get_file_size (argv[i]) < 1)
2615 continue;
2616
2617 if (preserve_dates)
2618 /* No need to check the return value of stat().
2619 It has already been checked in get_file_size(). */
2620 stat (argv[i], &statbuf);
2621
2622 if (output_file != NULL)
2623 tmpname = output_file;
2624 else
2625 tmpname = make_tempname (argv[i]);
2626 status = 0;
2627
2628 copy_file (argv[i], tmpname, input_target, output_target);
2629 if (status == 0)
2630 {
2631 if (preserve_dates)
2632 set_times (tmpname, &statbuf);
2633 if (output_file == NULL)
2634 smart_rename (tmpname, argv[i], preserve_dates);
2635 status = hold_status;
2636 }
2637 else
2638 unlink_if_ordinary (tmpname);
2639 if (output_file == NULL)
2640 free (tmpname);
2641 }
2642
2643 return 0;
2644 }
2645
2646 static int
2647 copy_main (int argc, char *argv[])
2648 {
2649 char * binary_architecture = NULL;
2650 char *input_filename = NULL;
2651 char *output_filename = NULL;
2652 char *input_target = NULL;
2653 char *output_target = NULL;
2654 bfd_boolean show_version = FALSE;
2655 bfd_boolean change_warn = TRUE;
2656 bfd_boolean formats_info = FALSE;
2657 int c;
2658 struct section_list *p;
2659 struct stat statbuf;
2660
2661 while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
2662 copy_options, (int *) 0)) != EOF)
2663 {
2664 switch (c)
2665 {
2666 case 'b':
2667 copy_byte = atoi (optarg);
2668 if (copy_byte < 0)
2669 fatal (_("byte number must be non-negative"));
2670 break;
2671
2672 case 'B':
2673 binary_architecture = optarg;
2674 break;
2675
2676 case 'i':
2677 interleave = atoi (optarg);
2678 if (interleave < 1)
2679 fatal (_("interleave must be positive"));
2680 break;
2681
2682 case 'I':
2683 case 's': /* "source" - 'I' is preferred */
2684 input_target = optarg;
2685 break;
2686
2687 case 'O':
2688 case 'd': /* "destination" - 'O' is preferred */
2689 output_target = optarg;
2690 break;
2691
2692 case 'F':
2693 input_target = output_target = optarg;
2694 break;
2695
2696 case 'j':
2697 p = find_section_list (optarg, TRUE);
2698 if (p->remove)
2699 fatal (_("%s both copied and removed"), optarg);
2700 p->copy = TRUE;
2701 sections_copied = TRUE;
2702 break;
2703
2704 case 'R':
2705 p = find_section_list (optarg, TRUE);
2706 if (p->copy)
2707 fatal (_("%s both copied and removed"), optarg);
2708 p->remove = TRUE;
2709 sections_removed = TRUE;
2710 break;
2711
2712 case 'S':
2713 strip_symbols = STRIP_ALL;
2714 break;
2715
2716 case 'g':
2717 strip_symbols = STRIP_DEBUG;
2718 break;
2719
2720 case OPTION_STRIP_UNNEEDED:
2721 strip_symbols = STRIP_UNNEEDED;
2722 break;
2723
2724 case OPTION_ONLY_KEEP_DEBUG:
2725 strip_symbols = STRIP_NONDEBUG;
2726 break;
2727
2728 case OPTION_KEEP_FILE_SYMBOLS:
2729 keep_file_symbols = 1;
2730 break;
2731
2732 case OPTION_ADD_GNU_DEBUGLINK:
2733 gnu_debuglink_filename = optarg;
2734 break;
2735
2736 case 'K':
2737 add_specific_symbol (optarg, &keep_specific_list);
2738 break;
2739
2740 case 'N':
2741 add_specific_symbol (optarg, &strip_specific_list);
2742 break;
2743
2744 case OPTION_STRIP_UNNEEDED_SYMBOL:
2745 add_specific_symbol (optarg, &strip_unneeded_list);
2746 break;
2747
2748 case 'L':
2749 add_specific_symbol (optarg, &localize_specific_list);
2750 break;
2751
2752 case OPTION_GLOBALIZE_SYMBOL:
2753 add_specific_symbol (optarg, &globalize_specific_list);
2754 break;
2755
2756 case 'G':
2757 add_specific_symbol (optarg, &keepglobal_specific_list);
2758 break;
2759
2760 case 'W':
2761 add_specific_symbol (optarg, &weaken_specific_list);
2762 break;
2763
2764 case 'p':
2765 preserve_dates = TRUE;
2766 break;
2767
2768 case 'w':
2769 wildcard = TRUE;
2770 break;
2771
2772 case 'x':
2773 discard_locals = LOCALS_ALL;
2774 break;
2775
2776 case 'X':
2777 discard_locals = LOCALS_START_L;
2778 break;
2779
2780 case 'v':
2781 verbose = TRUE;
2782 break;
2783
2784 case 'V':
2785 show_version = TRUE;
2786 break;
2787
2788 case OPTION_FORMATS_INFO:
2789 formats_info = TRUE;
2790 break;
2791
2792 case OPTION_WEAKEN:
2793 weaken = TRUE;
2794 break;
2795
2796 case OPTION_ADD_SECTION:
2797 {
2798 const char *s;
2799 off_t size;
2800 struct section_add *pa;
2801 int len;
2802 char *name;
2803 FILE *f;
2804
2805 s = strchr (optarg, '=');
2806
2807 if (s == NULL)
2808 fatal (_("bad format for %s"), "--add-section");
2809
2810 size = get_file_size (s + 1);
2811 if (size < 1)
2812 break;
2813
2814 pa = xmalloc (sizeof (struct section_add));
2815
2816 len = s - optarg;
2817 name = xmalloc (len + 1);
2818 strncpy (name, optarg, len);
2819 name[len] = '\0';
2820 pa->name = name;
2821
2822 pa->filename = s + 1;
2823 pa->size = size;
2824 pa->contents = xmalloc (size);
2825
2826 f = fopen (pa->filename, FOPEN_RB);
2827
2828 if (f == NULL)
2829 fatal (_("cannot open: %s: %s"),
2830 pa->filename, strerror (errno));
2831
2832 if (fread (pa->contents, 1, pa->size, f) == 0
2833 || ferror (f))
2834 fatal (_("%s: fread failed"), pa->filename);
2835
2836 fclose (f);
2837
2838 pa->next = add_sections;
2839 add_sections = pa;
2840 }
2841 break;
2842
2843 case OPTION_CHANGE_START:
2844 change_start = parse_vma (optarg, "--change-start");
2845 break;
2846
2847 case OPTION_CHANGE_SECTION_ADDRESS:
2848 case OPTION_CHANGE_SECTION_LMA:
2849 case OPTION_CHANGE_SECTION_VMA:
2850 {
2851 const char *s;
2852 int len;
2853 char *name;
2854 char *option = NULL;
2855 bfd_vma val;
2856 enum change_action what = CHANGE_IGNORE;
2857
2858 switch (c)
2859 {
2860 case OPTION_CHANGE_SECTION_ADDRESS:
2861 option = "--change-section-address";
2862 break;
2863 case OPTION_CHANGE_SECTION_LMA:
2864 option = "--change-section-lma";
2865 break;
2866 case OPTION_CHANGE_SECTION_VMA:
2867 option = "--change-section-vma";
2868 break;
2869 }
2870
2871 s = strchr (optarg, '=');
2872 if (s == NULL)
2873 {
2874 s = strchr (optarg, '+');
2875 if (s == NULL)
2876 {
2877 s = strchr (optarg, '-');
2878 if (s == NULL)
2879 fatal (_("bad format for %s"), option);
2880 }
2881 }
2882
2883 len = s - optarg;
2884 name = xmalloc (len + 1);
2885 strncpy (name, optarg, len);
2886 name[len] = '\0';
2887
2888 p = find_section_list (name, TRUE);
2889
2890 val = parse_vma (s + 1, option);
2891
2892 switch (*s)
2893 {
2894 case '=': what = CHANGE_SET; break;
2895 case '-': val = - val; /* Drop through. */
2896 case '+': what = CHANGE_MODIFY; break;
2897 }
2898
2899 switch (c)
2900 {
2901 case OPTION_CHANGE_SECTION_ADDRESS:
2902 p->change_vma = what;
2903 p->vma_val = val;
2904 /* Drop through. */
2905
2906 case OPTION_CHANGE_SECTION_LMA:
2907 p->change_lma = what;
2908 p->lma_val = val;
2909 break;
2910
2911 case OPTION_CHANGE_SECTION_VMA:
2912 p->change_vma = what;
2913 p->vma_val = val;
2914 break;
2915 }
2916 }
2917 break;
2918
2919 case OPTION_CHANGE_ADDRESSES:
2920 change_section_address = parse_vma (optarg, "--change-addresses");
2921 change_start = change_section_address;
2922 break;
2923
2924 case OPTION_CHANGE_WARNINGS:
2925 change_warn = TRUE;
2926 break;
2927
2928 case OPTION_CHANGE_LEADING_CHAR:
2929 change_leading_char = TRUE;
2930 break;
2931
2932 case OPTION_DEBUGGING:
2933 convert_debugging = TRUE;
2934 break;
2935
2936 case OPTION_GAP_FILL:
2937 {
2938 bfd_vma gap_fill_vma;
2939
2940 gap_fill_vma = parse_vma (optarg, "--gap-fill");
2941 gap_fill = (bfd_byte) gap_fill_vma;
2942 if ((bfd_vma) gap_fill != gap_fill_vma)
2943 {
2944 char buff[20];
2945
2946 sprintf_vma (buff, gap_fill_vma);
2947
2948 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
2949 buff, gap_fill);
2950 }
2951 gap_fill_set = TRUE;
2952 }
2953 break;
2954
2955 case OPTION_NO_CHANGE_WARNINGS:
2956 change_warn = FALSE;
2957 break;
2958
2959 case OPTION_PAD_TO:
2960 pad_to = parse_vma (optarg, "--pad-to");
2961 pad_to_set = TRUE;
2962 break;
2963
2964 case OPTION_REMOVE_LEADING_CHAR:
2965 remove_leading_char = TRUE;
2966 break;
2967
2968 case OPTION_REDEFINE_SYM:
2969 {
2970 /* Push this redefinition onto redefine_symbol_list. */
2971
2972 int len;
2973 const char *s;
2974 const char *nextarg;
2975 char *source, *target;
2976
2977 s = strchr (optarg, '=');
2978 if (s == NULL)
2979 fatal (_("bad format for %s"), "--redefine-sym");
2980
2981 len = s - optarg;
2982 source = xmalloc (len + 1);
2983 strncpy (source, optarg, len);
2984 source[len] = '\0';
2985
2986 nextarg = s + 1;
2987 len = strlen (nextarg);
2988 target = xmalloc (len + 1);
2989 strcpy (target, nextarg);
2990
2991 redefine_list_append ("--redefine-sym", source, target);
2992
2993 free (source);
2994 free (target);
2995 }
2996 break;
2997
2998 case OPTION_REDEFINE_SYMS:
2999 add_redefine_syms_file (optarg);
3000 break;
3001
3002 case OPTION_SET_SECTION_FLAGS:
3003 {
3004 const char *s;
3005 int len;
3006 char *name;
3007
3008 s = strchr (optarg, '=');
3009 if (s == NULL)
3010 fatal (_("bad format for %s"), "--set-section-flags");
3011
3012 len = s - optarg;
3013 name = xmalloc (len + 1);
3014 strncpy (name, optarg, len);
3015 name[len] = '\0';
3016
3017 p = find_section_list (name, TRUE);
3018
3019 p->set_flags = TRUE;
3020 p->flags = parse_flags (s + 1);
3021 }
3022 break;
3023
3024 case OPTION_RENAME_SECTION:
3025 {
3026 flagword flags;
3027 const char *eq, *fl;
3028 char *old_name;
3029 char *new_name;
3030 unsigned int len;
3031
3032 eq = strchr (optarg, '=');
3033 if (eq == NULL)
3034 fatal (_("bad format for %s"), "--rename-section");
3035
3036 len = eq - optarg;
3037 if (len == 0)
3038 fatal (_("bad format for %s"), "--rename-section");
3039
3040 old_name = xmalloc (len + 1);
3041 strncpy (old_name, optarg, len);
3042 old_name[len] = 0;
3043
3044 eq++;
3045 fl = strchr (eq, ',');
3046 if (fl)
3047 {
3048 flags = parse_flags (fl + 1);
3049 len = fl - eq;
3050 }
3051 else
3052 {
3053 flags = -1;
3054 len = strlen (eq);
3055 }
3056
3057 if (len == 0)
3058 fatal (_("bad format for %s"), "--rename-section");
3059
3060 new_name = xmalloc (len + 1);
3061 strncpy (new_name, eq, len);
3062 new_name[len] = 0;
3063
3064 add_section_rename (old_name, new_name, flags);
3065 }
3066 break;
3067
3068 case OPTION_SET_START:
3069 set_start = parse_vma (optarg, "--set-start");
3070 set_start_set = TRUE;
3071 break;
3072
3073 case OPTION_SREC_LEN:
3074 Chunk = parse_vma (optarg, "--srec-len");
3075 break;
3076
3077 case OPTION_SREC_FORCES3:
3078 S3Forced = TRUE;
3079 break;
3080
3081 case OPTION_STRIP_SYMBOLS:
3082 add_specific_symbols (optarg, &strip_specific_list);
3083 break;
3084
3085 case OPTION_STRIP_UNNEEDED_SYMBOLS:
3086 add_specific_symbols (optarg, &strip_unneeded_list);
3087 break;
3088
3089 case OPTION_KEEP_SYMBOLS:
3090 add_specific_symbols (optarg, &keep_specific_list);
3091 break;
3092
3093 case OPTION_LOCALIZE_HIDDEN:
3094 localize_hidden = TRUE;
3095 break;
3096
3097 case OPTION_LOCALIZE_SYMBOLS:
3098 add_specific_symbols (optarg, &localize_specific_list);
3099 break;
3100
3101 case OPTION_GLOBALIZE_SYMBOLS:
3102 add_specific_symbols (optarg, &globalize_specific_list);
3103 break;
3104
3105 case OPTION_KEEPGLOBAL_SYMBOLS:
3106 add_specific_symbols (optarg, &keepglobal_specific_list);
3107 break;
3108
3109 case OPTION_WEAKEN_SYMBOLS:
3110 add_specific_symbols (optarg, &weaken_specific_list);
3111 break;
3112
3113 case OPTION_ALT_MACH_CODE:
3114 use_alt_mach_code = strtoul (optarg, NULL, 0);
3115 if (use_alt_mach_code == 0)
3116 fatal (_("unable to parse alternative machine code"));
3117 break;
3118
3119 case OPTION_PREFIX_SYMBOLS:
3120 prefix_symbols_string = optarg;
3121 break;
3122
3123 case OPTION_PREFIX_SECTIONS:
3124 prefix_sections_string = optarg;
3125 break;
3126
3127 case OPTION_PREFIX_ALLOC_SECTIONS:
3128 prefix_alloc_sections_string = optarg;
3129 break;
3130
3131 case OPTION_READONLY_TEXT:
3132 bfd_flags_to_set |= WP_TEXT;
3133 bfd_flags_to_clear &= ~WP_TEXT;
3134 break;
3135
3136 case OPTION_WRITABLE_TEXT:
3137 bfd_flags_to_clear |= WP_TEXT;
3138 bfd_flags_to_set &= ~WP_TEXT;
3139 break;
3140
3141 case OPTION_PURE:
3142 bfd_flags_to_set |= D_PAGED;
3143 bfd_flags_to_clear &= ~D_PAGED;
3144 break;
3145
3146 case OPTION_IMPURE:
3147 bfd_flags_to_clear |= D_PAGED;
3148 bfd_flags_to_set &= ~D_PAGED;
3149 break;
3150
3151 case 0:
3152 /* We've been given a long option. */
3153 break;
3154
3155 case 'H':
3156 case 'h':
3157 copy_usage (stdout, 0);
3158
3159 default:
3160 copy_usage (stderr, 1);
3161 }
3162 }
3163
3164 if (formats_info)
3165 {
3166 display_info ();
3167 return 0;
3168 }
3169
3170 if (show_version)
3171 print_version ("objcopy");
3172
3173 if (copy_byte >= interleave)
3174 fatal (_("byte number must be less than interleave"));
3175
3176 if (optind == argc || optind + 2 < argc)
3177 copy_usage (stderr, 1);
3178
3179 input_filename = argv[optind];
3180 if (optind + 1 < argc)
3181 output_filename = argv[optind + 1];
3182
3183 /* Default is to strip no symbols. */
3184 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
3185 strip_symbols = STRIP_NONE;
3186
3187 if (output_target == NULL)
3188 output_target = input_target;
3189
3190 if (binary_architecture != NULL)
3191 {
3192 if (input_target && strcmp (input_target, "binary") == 0)
3193 {
3194 const bfd_arch_info_type * temp_arch_info;
3195
3196 temp_arch_info = bfd_scan_arch (binary_architecture);
3197
3198 if (temp_arch_info != NULL)
3199 {
3200 bfd_external_binary_architecture = temp_arch_info->arch;
3201 bfd_external_machine = temp_arch_info->mach;
3202 }
3203 else
3204 fatal (_("architecture %s unknown"), binary_architecture);
3205 }
3206 else
3207 {
3208 non_fatal (_("Warning: input target 'binary' required for binary architecture parameter."));
3209 non_fatal (_(" Argument %s ignored"), binary_architecture);
3210 }
3211 }
3212
3213 if (preserve_dates)
3214 if (stat (input_filename, & statbuf) < 0)
3215 fatal (_("warning: could not locate '%s'. System error message: %s"),
3216 input_filename, strerror (errno));
3217
3218 /* If there is no destination file, or the source and destination files
3219 are the same, then create a temp and rename the result into the input. */
3220 if (output_filename == NULL || strcmp (input_filename, output_filename) == 0)
3221 {
3222 char *tmpname = make_tempname (input_filename);
3223
3224 copy_file (input_filename, tmpname, input_target, output_target);
3225 if (status == 0)
3226 {
3227 if (preserve_dates)
3228 set_times (tmpname, &statbuf);
3229 smart_rename (tmpname, input_filename, preserve_dates);
3230 }
3231 else
3232 unlink (tmpname);
3233 }
3234 else
3235 {
3236 copy_file (input_filename, output_filename, input_target, output_target);
3237
3238 if (status == 0 && preserve_dates)
3239 set_times (output_filename, &statbuf);
3240 else if (status != 0)
3241 unlink_if_ordinary (output_filename);
3242 }
3243
3244 if (change_warn)
3245 {
3246 for (p = change_sections; p != NULL; p = p->next)
3247 {
3248 if (! p->used)
3249 {
3250 if (p->change_vma != CHANGE_IGNORE)
3251 {
3252 char buff [20];
3253
3254 sprintf_vma (buff, p->vma_val);
3255
3256 /* xgettext:c-format */
3257 non_fatal (_("%s %s%c0x%s never used"),
3258 "--change-section-vma",
3259 p->name,
3260 p->change_vma == CHANGE_SET ? '=' : '+',
3261 buff);
3262 }
3263
3264 if (p->change_lma != CHANGE_IGNORE)
3265 {
3266 char buff [20];
3267
3268 sprintf_vma (buff, p->lma_val);
3269
3270 /* xgettext:c-format */
3271 non_fatal (_("%s %s%c0x%s never used"),
3272 "--change-section-lma",
3273 p->name,
3274 p->change_lma == CHANGE_SET ? '=' : '+',
3275 buff);
3276 }
3277 }
3278 }
3279 }
3280
3281 return 0;
3282 }
3283
3284 int
3285 main (int argc, char *argv[])
3286 {
3287 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
3288 setlocale (LC_MESSAGES, "");
3289 #endif
3290 #if defined (HAVE_SETLOCALE)
3291 setlocale (LC_CTYPE, "");
3292 #endif
3293 bindtextdomain (PACKAGE, LOCALEDIR);
3294 textdomain (PACKAGE);
3295
3296 program_name = argv[0];
3297 xmalloc_set_program_name (program_name);
3298
3299 START_PROGRESS (program_name, 0);
3300
3301 expandargv (&argc, &argv);
3302
3303 strip_symbols = STRIP_UNDEF;
3304 discard_locals = LOCALS_UNDEF;
3305
3306 bfd_init ();
3307 set_default_bfd_target ();
3308
3309 if (is_strip < 0)
3310 {
3311 int i = strlen (program_name);
3312 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3313 /* Drop the .exe suffix, if any. */
3314 if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
3315 {
3316 i -= 4;
3317 program_name[i] = '\0';
3318 }
3319 #endif
3320 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
3321 }
3322
3323 if (is_strip)
3324 strip_main (argc, argv);
3325 else
3326 copy_main (argc, argv);
3327
3328 END_PROGRESS (program_name);
3329
3330 return status;
3331 }
This page took 0.103347 seconds and 5 git commands to generate.