* elf.c (elf_find_function): Don't use internal_elf_sym.
[binutils.git] / binutils / objcopy.c
blob31ac0a2bb3ee09dce92a53475adbda704eced7d0
1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "progress.h"
26 #include "getopt.h"
27 #include "libiberty.h"
28 #include "bucomm.h"
29 #include "budbg.h"
30 #include "filenames.h"
31 #include "fnmatch.h"
32 #include "elf-bfd.h"
33 #include <sys/stat.h>
34 #include "libbfd.h"
35 #include "coff/internal.h"
36 #include "libcoff.h"
38 /* FIXME: See bfd/peXXigen.c for why we include an architecture specific
39 header in generic PE code. */
40 #include "coff/i386.h"
41 #include "coff/pe.h"
43 static bfd_vma pe_file_alignment = (bfd_vma) -1;
44 static bfd_vma pe_heap_commit = (bfd_vma) -1;
45 static bfd_vma pe_heap_reserve = (bfd_vma) -1;
46 static bfd_vma pe_image_base = (bfd_vma) -1;
47 static bfd_vma pe_section_alignment = (bfd_vma) -1;
48 static bfd_vma pe_stack_commit = (bfd_vma) -1;
49 static bfd_vma pe_stack_reserve = (bfd_vma) -1;
50 static short pe_subsystem = -1;
51 static short pe_major_subsystem_version = -1;
52 static short pe_minor_subsystem_version = -1;
54 struct is_specified_symbol_predicate_data
56 const char *name;
57 bfd_boolean found;
60 /* A list to support redefine_sym. */
61 struct redefine_node
63 char *source;
64 char *target;
65 struct redefine_node *next;
68 typedef struct section_rename
70 const char * old_name;
71 const char * new_name;
72 flagword flags;
73 struct section_rename * next;
75 section_rename;
77 /* List of sections to be renamed. */
78 static section_rename *section_rename_list;
80 static asymbol **isympp = NULL; /* Input symbols. */
81 static asymbol **osympp = NULL; /* Output symbols that survive stripping. */
83 /* If `copy_byte' >= 0, copy 'copy_width' byte(s) of every `interleave' bytes. */
84 static int copy_byte = -1;
85 static int interleave = 0; /* Initialised to 4 in copy_main(). */
86 static int copy_width = 1;
88 static bfd_boolean verbose; /* Print file and target names. */
89 static bfd_boolean preserve_dates; /* Preserve input file timestamp. */
90 static int status = 0; /* Exit status. */
92 enum strip_action
94 STRIP_UNDEF,
95 STRIP_NONE, /* Don't strip. */
96 STRIP_DEBUG, /* Strip all debugger symbols. */
97 STRIP_UNNEEDED, /* Strip unnecessary symbols. */
98 STRIP_NONDEBUG, /* Strip everything but debug info. */
99 STRIP_ALL /* Strip all symbols. */
102 /* Which symbols to remove. */
103 static enum strip_action strip_symbols;
105 enum locals_action
107 LOCALS_UNDEF,
108 LOCALS_START_L, /* Discard locals starting with L. */
109 LOCALS_ALL /* Discard all locals. */
112 /* Which local symbols to remove. Overrides STRIP_ALL. */
113 static enum locals_action discard_locals;
115 /* What kind of change to perform. */
116 enum change_action
118 CHANGE_IGNORE,
119 CHANGE_MODIFY,
120 CHANGE_SET
123 /* Structure used to hold lists of sections and actions to take. */
124 struct section_list
126 struct section_list * next; /* Next section to change. */
127 const char * name; /* Section name. */
128 bfd_boolean used; /* Whether this entry was used. */
129 bfd_boolean remove; /* Whether to remove this section. */
130 bfd_boolean copy; /* Whether to copy this section. */
131 enum change_action change_vma;/* Whether to change or set VMA. */
132 bfd_vma vma_val; /* Amount to change by or set to. */
133 enum change_action change_lma;/* Whether to change or set LMA. */
134 bfd_vma lma_val; /* Amount to change by or set to. */
135 bfd_boolean set_flags; /* Whether to set the section flags. */
136 flagword flags; /* What to set the section flags to. */
139 static struct section_list *change_sections;
141 /* TRUE if some sections are to be removed. */
142 static bfd_boolean sections_removed;
144 /* TRUE if only some sections are to be copied. */
145 static bfd_boolean sections_copied;
147 /* Changes to the start address. */
148 static bfd_vma change_start = 0;
149 static bfd_boolean set_start_set = FALSE;
150 static bfd_vma set_start;
152 /* Changes to section addresses. */
153 static bfd_vma change_section_address = 0;
155 /* Filling gaps between sections. */
156 static bfd_boolean gap_fill_set = FALSE;
157 static bfd_byte gap_fill = 0;
159 /* Pad to a given address. */
160 static bfd_boolean pad_to_set = FALSE;
161 static bfd_vma pad_to;
163 /* Use alternative machine code? */
164 static unsigned long use_alt_mach_code = 0;
166 /* Output BFD flags user wants to set or clear */
167 static flagword bfd_flags_to_set;
168 static flagword bfd_flags_to_clear;
170 /* List of sections to add. */
171 struct section_add
173 /* Next section to add. */
174 struct section_add *next;
175 /* Name of section to add. */
176 const char *name;
177 /* Name of file holding section contents. */
178 const char *filename;
179 /* Size of file. */
180 size_t size;
181 /* Contents of file. */
182 bfd_byte *contents;
183 /* BFD section, after it has been added. */
184 asection *section;
187 /* List of sections to add to the output BFD. */
188 static struct section_add *add_sections;
190 /* If non-NULL the argument to --add-gnu-debuglink.
191 This should be the filename to store in the .gnu_debuglink section. */
192 static const char * gnu_debuglink_filename = NULL;
194 /* Whether to convert debugging information. */
195 static bfd_boolean convert_debugging = FALSE;
197 /* Whether to compress/decompress DWARF debug sections. */
198 static enum
200 nothing,
201 compress,
202 decompress
203 } do_debug_sections = nothing;
205 /* Whether to change the leading character in symbol names. */
206 static bfd_boolean change_leading_char = FALSE;
208 /* Whether to remove the leading character from global symbol names. */
209 static bfd_boolean remove_leading_char = FALSE;
211 /* Whether to permit wildcard in symbol comparison. */
212 static bfd_boolean wildcard = FALSE;
214 /* True if --localize-hidden is in effect. */
215 static bfd_boolean localize_hidden = FALSE;
217 /* List of symbols to strip, keep, localize, keep-global, weaken,
218 or redefine. */
219 static htab_t strip_specific_htab = NULL;
220 static htab_t strip_unneeded_htab = NULL;
221 static htab_t keep_specific_htab = NULL;
222 static htab_t localize_specific_htab = NULL;
223 static htab_t globalize_specific_htab = NULL;
224 static htab_t keepglobal_specific_htab = NULL;
225 static htab_t weaken_specific_htab = NULL;
226 static struct redefine_node *redefine_sym_list = NULL;
228 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
229 static bfd_boolean weaken = FALSE;
231 /* If this is TRUE, we retain BSF_FILE symbols. */
232 static bfd_boolean keep_file_symbols = FALSE;
234 /* Prefix symbols/sections. */
235 static char *prefix_symbols_string = 0;
236 static char *prefix_sections_string = 0;
237 static char *prefix_alloc_sections_string = 0;
239 /* True if --extract-symbol was passed on the command line. */
240 static bfd_boolean extract_symbol = FALSE;
242 /* If `reverse_bytes' is nonzero, then reverse the order of every chunk
243 of <reverse_bytes> bytes within each output section. */
244 static int reverse_bytes = 0;
246 /* For Coff objects, we may want to allow or disallow long section names,
247 or preserve them where found in the inputs. Debug info relies on them. */
248 enum long_section_name_handling
250 DISABLE,
251 ENABLE,
252 KEEP
255 /* The default long section handling mode is to preserve them.
256 This is also the only behaviour for 'strip'. */
257 static enum long_section_name_handling long_section_names = KEEP;
259 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
260 enum command_line_switch
262 OPTION_ADD_SECTION=150,
263 OPTION_CHANGE_ADDRESSES,
264 OPTION_CHANGE_LEADING_CHAR,
265 OPTION_CHANGE_START,
266 OPTION_CHANGE_SECTION_ADDRESS,
267 OPTION_CHANGE_SECTION_LMA,
268 OPTION_CHANGE_SECTION_VMA,
269 OPTION_CHANGE_WARNINGS,
270 OPTION_COMPRESS_DEBUG_SECTIONS,
271 OPTION_DEBUGGING,
272 OPTION_DECOMPRESS_DEBUG_SECTIONS,
273 OPTION_GAP_FILL,
274 OPTION_NO_CHANGE_WARNINGS,
275 OPTION_PAD_TO,
276 OPTION_REMOVE_LEADING_CHAR,
277 OPTION_SET_SECTION_FLAGS,
278 OPTION_SET_START,
279 OPTION_STRIP_UNNEEDED,
280 OPTION_WEAKEN,
281 OPTION_REDEFINE_SYM,
282 OPTION_REDEFINE_SYMS,
283 OPTION_SREC_LEN,
284 OPTION_SREC_FORCES3,
285 OPTION_STRIP_SYMBOLS,
286 OPTION_STRIP_UNNEEDED_SYMBOL,
287 OPTION_STRIP_UNNEEDED_SYMBOLS,
288 OPTION_KEEP_SYMBOLS,
289 OPTION_LOCALIZE_HIDDEN,
290 OPTION_LOCALIZE_SYMBOLS,
291 OPTION_LONG_SECTION_NAMES,
292 OPTION_GLOBALIZE_SYMBOL,
293 OPTION_GLOBALIZE_SYMBOLS,
294 OPTION_KEEPGLOBAL_SYMBOLS,
295 OPTION_WEAKEN_SYMBOLS,
296 OPTION_RENAME_SECTION,
297 OPTION_ALT_MACH_CODE,
298 OPTION_PREFIX_SYMBOLS,
299 OPTION_PREFIX_SECTIONS,
300 OPTION_PREFIX_ALLOC_SECTIONS,
301 OPTION_FORMATS_INFO,
302 OPTION_ADD_GNU_DEBUGLINK,
303 OPTION_ONLY_KEEP_DEBUG,
304 OPTION_KEEP_FILE_SYMBOLS,
305 OPTION_READONLY_TEXT,
306 OPTION_WRITABLE_TEXT,
307 OPTION_PURE,
308 OPTION_IMPURE,
309 OPTION_EXTRACT_SYMBOL,
310 OPTION_REVERSE_BYTES,
311 OPTION_FILE_ALIGNMENT,
312 OPTION_HEAP,
313 OPTION_IMAGE_BASE,
314 OPTION_SECTION_ALIGNMENT,
315 OPTION_STACK,
316 OPTION_INTERLEAVE_WIDTH,
317 OPTION_SUBSYSTEM
320 /* Options to handle if running as "strip". */
322 static struct option strip_options[] =
324 {"discard-all", no_argument, 0, 'x'},
325 {"discard-locals", no_argument, 0, 'X'},
326 {"format", required_argument, 0, 'F'}, /* Obsolete */
327 {"help", no_argument, 0, 'h'},
328 {"info", no_argument, 0, OPTION_FORMATS_INFO},
329 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
330 {"input-target", required_argument, 0, 'I'},
331 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
332 {"keep-symbol", required_argument, 0, 'K'},
333 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
334 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
335 {"output-target", required_argument, 0, 'O'},
336 {"output-file", required_argument, 0, 'o'},
337 {"preserve-dates", no_argument, 0, 'p'},
338 {"remove-section", required_argument, 0, 'R'},
339 {"strip-all", no_argument, 0, 's'},
340 {"strip-debug", no_argument, 0, 'S'},
341 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
342 {"strip-symbol", required_argument, 0, 'N'},
343 {"target", required_argument, 0, 'F'},
344 {"verbose", no_argument, 0, 'v'},
345 {"version", no_argument, 0, 'V'},
346 {"wildcard", no_argument, 0, 'w'},
347 {0, no_argument, 0, 0}
350 /* Options to handle if running as "objcopy". */
352 static struct option copy_options[] =
354 {"add-gnu-debuglink", required_argument, 0, OPTION_ADD_GNU_DEBUGLINK},
355 {"add-section", required_argument, 0, OPTION_ADD_SECTION},
356 {"adjust-start", required_argument, 0, OPTION_CHANGE_START},
357 {"adjust-vma", required_argument, 0, OPTION_CHANGE_ADDRESSES},
358 {"adjust-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
359 {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
360 {"alt-machine-code", required_argument, 0, OPTION_ALT_MACH_CODE},
361 {"binary-architecture", required_argument, 0, 'B'},
362 {"byte", required_argument, 0, 'b'},
363 {"change-addresses", required_argument, 0, OPTION_CHANGE_ADDRESSES},
364 {"change-leading-char", no_argument, 0, OPTION_CHANGE_LEADING_CHAR},
365 {"change-section-address", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
366 {"change-section-lma", required_argument, 0, OPTION_CHANGE_SECTION_LMA},
367 {"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA},
368 {"change-start", required_argument, 0, OPTION_CHANGE_START},
369 {"change-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
370 {"compress-debug-sections", no_argument, 0, OPTION_COMPRESS_DEBUG_SECTIONS},
371 {"debugging", no_argument, 0, OPTION_DEBUGGING},
372 {"decompress-debug-sections", no_argument, 0, OPTION_DECOMPRESS_DEBUG_SECTIONS},
373 {"discard-all", no_argument, 0, 'x'},
374 {"discard-locals", no_argument, 0, 'X'},
375 {"extract-symbol", no_argument, 0, OPTION_EXTRACT_SYMBOL},
376 {"format", required_argument, 0, 'F'}, /* Obsolete */
377 {"gap-fill", required_argument, 0, OPTION_GAP_FILL},
378 {"globalize-symbol", required_argument, 0, OPTION_GLOBALIZE_SYMBOL},
379 {"globalize-symbols", required_argument, 0, OPTION_GLOBALIZE_SYMBOLS},
380 {"help", no_argument, 0, 'h'},
381 {"impure", no_argument, 0, OPTION_IMPURE},
382 {"info", no_argument, 0, OPTION_FORMATS_INFO},
383 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
384 {"input-target", required_argument, 0, 'I'},
385 {"interleave", optional_argument, 0, 'i'},
386 {"interleave-width", required_argument, 0, OPTION_INTERLEAVE_WIDTH},
387 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
388 {"keep-global-symbol", required_argument, 0, 'G'},
389 {"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS},
390 {"keep-symbol", required_argument, 0, 'K'},
391 {"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS},
392 {"localize-hidden", no_argument, 0, OPTION_LOCALIZE_HIDDEN},
393 {"localize-symbol", required_argument, 0, 'L'},
394 {"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
395 {"long-section-names", required_argument, 0, OPTION_LONG_SECTION_NAMES},
396 {"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
397 {"no-change-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
398 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
399 {"only-section", required_argument, 0, 'j'},
400 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
401 {"output-target", required_argument, 0, 'O'},
402 {"pad-to", required_argument, 0, OPTION_PAD_TO},
403 {"prefix-symbols", required_argument, 0, OPTION_PREFIX_SYMBOLS},
404 {"prefix-sections", required_argument, 0, OPTION_PREFIX_SECTIONS},
405 {"prefix-alloc-sections", required_argument, 0, OPTION_PREFIX_ALLOC_SECTIONS},
406 {"preserve-dates", no_argument, 0, 'p'},
407 {"pure", no_argument, 0, OPTION_PURE},
408 {"readonly-text", no_argument, 0, OPTION_READONLY_TEXT},
409 {"redefine-sym", required_argument, 0, OPTION_REDEFINE_SYM},
410 {"redefine-syms", required_argument, 0, OPTION_REDEFINE_SYMS},
411 {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR},
412 {"remove-section", required_argument, 0, 'R'},
413 {"rename-section", required_argument, 0, OPTION_RENAME_SECTION},
414 {"reverse-bytes", required_argument, 0, OPTION_REVERSE_BYTES},
415 {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS},
416 {"set-start", required_argument, 0, OPTION_SET_START},
417 {"srec-len", required_argument, 0, OPTION_SREC_LEN},
418 {"srec-forceS3", no_argument, 0, OPTION_SREC_FORCES3},
419 {"strip-all", no_argument, 0, 'S'},
420 {"strip-debug", no_argument, 0, 'g'},
421 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
422 {"strip-unneeded-symbol", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOL},
423 {"strip-unneeded-symbols", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOLS},
424 {"strip-symbol", required_argument, 0, 'N'},
425 {"strip-symbols", required_argument, 0, OPTION_STRIP_SYMBOLS},
426 {"target", required_argument, 0, 'F'},
427 {"verbose", no_argument, 0, 'v'},
428 {"version", no_argument, 0, 'V'},
429 {"weaken", no_argument, 0, OPTION_WEAKEN},
430 {"weaken-symbol", required_argument, 0, 'W'},
431 {"weaken-symbols", required_argument, 0, OPTION_WEAKEN_SYMBOLS},
432 {"wildcard", no_argument, 0, 'w'},
433 {"writable-text", no_argument, 0, OPTION_WRITABLE_TEXT},
434 {"file-alignment", required_argument, 0, OPTION_FILE_ALIGNMENT},
435 {"heap", required_argument, 0, OPTION_HEAP},
436 {"image-base", required_argument, 0 , OPTION_IMAGE_BASE},
437 {"section-alignment", required_argument, 0, OPTION_SECTION_ALIGNMENT},
438 {"stack", required_argument, 0, OPTION_STACK},
439 {"subsystem", required_argument, 0, OPTION_SUBSYSTEM},
440 {0, no_argument, 0, 0}
443 /* IMPORTS */
444 extern char *program_name;
446 /* This flag distinguishes between strip and objcopy:
447 1 means this is 'strip'; 0 means this is 'objcopy'.
448 -1 means if we should use argv[0] to decide. */
449 extern int is_strip;
451 /* The maximum length of an S record. This variable is declared in srec.c
452 and can be modified by the --srec-len parameter. */
453 extern unsigned int Chunk;
455 /* Restrict the generation of Srecords to type S3 only.
456 This variable is declare in bfd/srec.c and can be toggled
457 on by the --srec-forceS3 command line switch. */
458 extern bfd_boolean S3Forced;
460 /* Forward declarations. */
461 static void setup_section (bfd *, asection *, void *);
462 static void setup_bfd_headers (bfd *, bfd *);
463 static void copy_section (bfd *, asection *, void *);
464 static void get_sections (bfd *, asection *, void *);
465 static int compare_section_lma (const void *, const void *);
466 static void mark_symbols_used_in_relocations (bfd *, asection *, void *);
467 static bfd_boolean write_debugging_info (bfd *, void *, long *, asymbol ***);
468 static const char *lookup_sym_redefinition (const char *);
470 static void
471 copy_usage (FILE *stream, int exit_status)
473 fprintf (stream, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name);
474 fprintf (stream, _(" Copies a binary file, possibly transforming it in the process\n"));
475 fprintf (stream, _(" The options are:\n"));
476 fprintf (stream, _("\
477 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
478 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
479 -B --binary-architecture <arch> Set output arch, when input is arch-less\n\
480 -F --target <bfdname> Set both input and output format to <bfdname>\n\
481 --debugging Convert debugging information, if possible\n\
482 -p --preserve-dates Copy modified/access timestamps to the output\n\
483 -j --only-section <name> Only copy section <name> into the output\n\
484 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
485 -R --remove-section <name> Remove section <name> from the output\n\
486 -S --strip-all Remove all symbol and relocation information\n\
487 -g --strip-debug Remove all debugging symbols & sections\n\
488 --strip-unneeded Remove all symbols not needed by relocations\n\
489 -N --strip-symbol <name> Do not copy symbol <name>\n\
490 --strip-unneeded-symbol <name>\n\
491 Do not copy symbol <name> unless needed by\n\
492 relocations\n\
493 --only-keep-debug Strip everything but the debug information\n\
494 --extract-symbol Remove section contents but keep symbols\n\
495 -K --keep-symbol <name> Do not strip symbol <name>\n\
496 --keep-file-symbols Do not strip file symbol(s)\n\
497 --localize-hidden Turn all ELF hidden symbols into locals\n\
498 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
499 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
500 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
501 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
502 --weaken Force all global symbols to be marked as weak\n\
503 -w --wildcard Permit wildcard in symbol comparison\n\
504 -x --discard-all Remove all non-global symbols\n\
505 -X --discard-locals Remove any compiler-generated symbols\n\
506 -i --interleave [<number>] Only copy N out of every <number> bytes\n\
507 --interleave-width <number> Set N for --interleave\n\
508 -b --byte <num> Select byte <num> in every interleaved block\n\
509 --gap-fill <val> Fill gaps between sections with <val>\n\
510 --pad-to <addr> Pad the last section up to address <addr>\n\
511 --set-start <addr> Set the start address to <addr>\n\
512 {--change-start|--adjust-start} <incr>\n\
513 Add <incr> to the start address\n\
514 {--change-addresses|--adjust-vma} <incr>\n\
515 Add <incr> to LMA, VMA and start addresses\n\
516 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
517 Change LMA and VMA of section <name> by <val>\n\
518 --change-section-lma <name>{=|+|-}<val>\n\
519 Change the LMA of section <name> by <val>\n\
520 --change-section-vma <name>{=|+|-}<val>\n\
521 Change the VMA of section <name> by <val>\n\
522 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
523 Warn if a named section does not exist\n\
524 --set-section-flags <name>=<flags>\n\
525 Set section <name>'s properties to <flags>\n\
526 --add-section <name>=<file> Add section <name> found in <file> to output\n\
527 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
528 --long-section-names {enable|disable|keep}\n\
529 Handle long section names in Coff objects.\n\
530 --change-leading-char Force output format's leading character style\n\
531 --remove-leading-char Remove leading character from global symbols\n\
532 --reverse-bytes=<num> Reverse <num> bytes at a time, in output sections with content\n\
533 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
534 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
535 listed in <file>\n\
536 --srec-len <number> Restrict the length of generated Srecords\n\
537 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
538 --strip-symbols <file> -N for all symbols listed in <file>\n\
539 --strip-unneeded-symbols <file>\n\
540 --strip-unneeded-symbol for all symbols listed\n\
541 in <file>\n\
542 --keep-symbols <file> -K for all symbols listed in <file>\n\
543 --localize-symbols <file> -L for all symbols listed in <file>\n\
544 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
545 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
546 --weaken-symbols <file> -W for all symbols listed in <file>\n\
547 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
548 --writable-text Mark the output text as writable\n\
549 --readonly-text Make the output text write protected\n\
550 --pure Mark the output file as demand paged\n\
551 --impure Mark the output file as impure\n\
552 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
553 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
554 --prefix-alloc-sections <prefix>\n\
555 Add <prefix> to start of every allocatable\n\
556 section name\n\
557 --file-alignment <num> Set PE file alignment to <num>\n\
558 --heap <reserve>[,<commit>] Set PE reserve/commit heap to <reserve>/\n\
559 <commit>\n\
560 --image-base <address> Set PE image base to <address>\n\
561 --section-alignment <num> Set PE section alignment to <num>\n\
562 --stack <reserve>[,<commit>] Set PE reserve/commit stack to <reserve>/\n\
563 <commit>\n\
564 --subsystem <name>[:<version>]\n\
565 Set PE subsystem to <name> [& <version>]\n\
566 --compress-debug-sections Compress DWARF debug sections using zlib\n\
567 --decompress-debug-sections Decompress DWARF debug sections using zlib\n\
568 -v --verbose List all object files modified\n\
569 @<file> Read options from <file>\n\
570 -V --version Display this program's version number\n\
571 -h --help Display this output\n\
572 --info List object formats & architectures supported\n\
573 "));
574 list_supported_targets (program_name, stream);
575 if (REPORT_BUGS_TO[0] && exit_status == 0)
576 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
577 exit (exit_status);
580 static void
581 strip_usage (FILE *stream, int exit_status)
583 fprintf (stream, _("Usage: %s <option(s)> in-file(s)\n"), program_name);
584 fprintf (stream, _(" Removes symbols and sections from files\n"));
585 fprintf (stream, _(" The options are:\n"));
586 fprintf (stream, _("\
587 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
588 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
589 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
590 -p --preserve-dates Copy modified/access timestamps to the output\n\
591 -R --remove-section=<name> Remove section <name> from the output\n\
592 -s --strip-all Remove all symbol and relocation information\n\
593 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
594 --strip-unneeded Remove all symbols not needed by relocations\n\
595 --only-keep-debug Strip everything but the debug information\n\
596 -N --strip-symbol=<name> Do not copy symbol <name>\n\
597 -K --keep-symbol=<name> Do not strip symbol <name>\n\
598 --keep-file-symbols Do not strip file symbol(s)\n\
599 -w --wildcard Permit wildcard in symbol comparison\n\
600 -x --discard-all Remove all non-global symbols\n\
601 -X --discard-locals Remove any compiler-generated symbols\n\
602 -v --verbose List all object files modified\n\
603 -V --version Display this program's version number\n\
604 -h --help Display this output\n\
605 --info List object formats & architectures supported\n\
606 -o <file> Place stripped output into <file>\n\
607 "));
609 list_supported_targets (program_name, stream);
610 if (REPORT_BUGS_TO[0] && exit_status == 0)
611 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
612 exit (exit_status);
615 /* Parse section flags into a flagword, with a fatal error if the
616 string can't be parsed. */
618 static flagword
619 parse_flags (const char *s)
621 flagword ret;
622 const char *snext;
623 int len;
625 ret = SEC_NO_FLAGS;
629 snext = strchr (s, ',');
630 if (snext == NULL)
631 len = strlen (s);
632 else
634 len = snext - s;
635 ++snext;
638 if (0) ;
639 #define PARSE_FLAG(fname,fval) \
640 else if (strncasecmp (fname, s, len) == 0) ret |= fval
641 PARSE_FLAG ("alloc", SEC_ALLOC);
642 PARSE_FLAG ("load", SEC_LOAD);
643 PARSE_FLAG ("noload", SEC_NEVER_LOAD);
644 PARSE_FLAG ("readonly", SEC_READONLY);
645 PARSE_FLAG ("debug", SEC_DEBUGGING);
646 PARSE_FLAG ("code", SEC_CODE);
647 PARSE_FLAG ("data", SEC_DATA);
648 PARSE_FLAG ("rom", SEC_ROM);
649 PARSE_FLAG ("share", SEC_COFF_SHARED);
650 PARSE_FLAG ("contents", SEC_HAS_CONTENTS);
651 #undef PARSE_FLAG
652 else
654 char *copy;
656 copy = (char *) xmalloc (len + 1);
657 strncpy (copy, s, len);
658 copy[len] = '\0';
659 non_fatal (_("unrecognized section flag `%s'"), copy);
660 fatal (_("supported flags: %s"),
661 "alloc, load, noload, readonly, debug, code, data, rom, share, contents");
664 s = snext;
666 while (s != NULL);
668 return ret;
671 /* Find and optionally add an entry in the change_sections list. */
673 static struct section_list *
674 find_section_list (const char *name, bfd_boolean add)
676 struct section_list *p;
678 for (p = change_sections; p != NULL; p = p->next)
679 if (strcmp (p->name, name) == 0)
680 return p;
682 if (! add)
683 return NULL;
685 p = (struct section_list *) xmalloc (sizeof (struct section_list));
686 p->name = name;
687 p->used = FALSE;
688 p->remove = FALSE;
689 p->copy = FALSE;
690 p->change_vma = CHANGE_IGNORE;
691 p->change_lma = CHANGE_IGNORE;
692 p->vma_val = 0;
693 p->lma_val = 0;
694 p->set_flags = FALSE;
695 p->flags = 0;
697 p->next = change_sections;
698 change_sections = p;
700 return p;
703 /* There is htab_hash_string but no htab_eq_string. Makes sense. */
705 static int
706 eq_string (const void *s1, const void *s2)
708 return strcmp ((const char *) s1, (const char *) s2) == 0;
711 static htab_t
712 create_symbol_htab (void)
714 return htab_create_alloc (16, htab_hash_string, eq_string, NULL, xcalloc, free);
717 static void
718 create_symbol_htabs (void)
720 strip_specific_htab = create_symbol_htab ();
721 strip_unneeded_htab = create_symbol_htab ();
722 keep_specific_htab = create_symbol_htab ();
723 localize_specific_htab = create_symbol_htab ();
724 globalize_specific_htab = create_symbol_htab ();
725 keepglobal_specific_htab = create_symbol_htab ();
726 weaken_specific_htab = create_symbol_htab ();
729 /* Add a symbol to strip_specific_list. */
731 static void
732 add_specific_symbol (const char *name, htab_t htab)
734 *htab_find_slot (htab, name, INSERT) = (char *) name;
737 /* Add symbols listed in `filename' to strip_specific_list. */
739 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
740 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
742 static void
743 add_specific_symbols (const char *filename, htab_t htab)
745 off_t size;
746 FILE * f;
747 char * line;
748 char * buffer;
749 unsigned int line_count;
751 size = get_file_size (filename);
752 if (size == 0)
754 status = 1;
755 return;
758 buffer = (char *) xmalloc (size + 2);
759 f = fopen (filename, FOPEN_RT);
760 if (f == NULL)
761 fatal (_("cannot open '%s': %s"), filename, strerror (errno));
763 if (fread (buffer, 1, size, f) == 0 || ferror (f))
764 fatal (_("%s: fread failed"), filename);
766 fclose (f);
767 buffer [size] = '\n';
768 buffer [size + 1] = '\0';
770 line_count = 1;
772 for (line = buffer; * line != '\0'; line ++)
774 char * eol;
775 char * name;
776 char * name_end;
777 int finished = FALSE;
779 for (eol = line;; eol ++)
781 switch (* eol)
783 case '\n':
784 * eol = '\0';
785 /* Cope with \n\r. */
786 if (eol[1] == '\r')
787 ++ eol;
788 finished = TRUE;
789 break;
791 case '\r':
792 * eol = '\0';
793 /* Cope with \r\n. */
794 if (eol[1] == '\n')
795 ++ eol;
796 finished = TRUE;
797 break;
799 case 0:
800 finished = TRUE;
801 break;
803 case '#':
804 /* Line comment, Terminate the line here, in case a
805 name is present and then allow the rest of the
806 loop to find the real end of the line. */
807 * eol = '\0';
808 break;
810 default:
811 break;
814 if (finished)
815 break;
818 /* A name may now exist somewhere between 'line' and 'eol'.
819 Strip off leading whitespace and trailing whitespace,
820 then add it to the list. */
821 for (name = line; IS_WHITESPACE (* name); name ++)
823 for (name_end = name;
824 (! IS_WHITESPACE (* name_end))
825 && (! IS_LINE_TERMINATOR (* name_end));
826 name_end ++)
829 if (! IS_LINE_TERMINATOR (* name_end))
831 char * extra;
833 for (extra = name_end + 1; IS_WHITESPACE (* extra); extra ++)
836 if (! IS_LINE_TERMINATOR (* extra))
837 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
838 filename, line_count);
841 * name_end = '\0';
843 if (name_end > name)
844 add_specific_symbol (name, htab);
846 /* Advance line pointer to end of line. The 'eol ++' in the for
847 loop above will then advance us to the start of the next line. */
848 line = eol;
849 line_count ++;
853 /* See whether a symbol should be stripped or kept
854 based on strip_specific_list and keep_symbols. */
856 static int
857 is_specified_symbol_predicate (void **slot, void *data)
859 struct is_specified_symbol_predicate_data *d =
860 (struct is_specified_symbol_predicate_data *) data;
861 const char *slot_name = (char *) *slot;
863 if (*slot_name != '!')
865 if (! fnmatch (slot_name, d->name, 0))
867 d->found = TRUE;
868 /* Stop traversal. */
869 return 0;
872 else
874 if (fnmatch (slot_name + 1, d->name, 0))
876 d->found = TRUE;
877 /* Stop traversal. */
878 return 0;
882 /* Continue traversal. */
883 return 1;
886 static bfd_boolean
887 is_specified_symbol (const char *name, htab_t htab)
889 if (wildcard)
891 struct is_specified_symbol_predicate_data data;
893 data.name = name;
894 data.found = FALSE;
896 htab_traverse (htab, is_specified_symbol_predicate, &data);
898 return data.found;
901 return htab_find (htab, name) != NULL;
904 /* Return a pointer to the symbol used as a signature for GROUP. */
906 static asymbol *
907 group_signature (asection *group)
909 bfd *abfd = group->owner;
910 Elf_Internal_Shdr *ghdr;
912 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
913 return NULL;
915 ghdr = &elf_section_data (group)->this_hdr;
916 if (ghdr->sh_link < elf_numsections (abfd))
918 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
919 Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link];
921 if (symhdr->sh_type == SHT_SYMTAB
922 && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym)
923 return isympp[ghdr->sh_info - 1];
925 return NULL;
928 /* See if a non-group section is being removed. */
930 static bfd_boolean
931 is_strip_section_1 (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
933 if (sections_removed || sections_copied)
935 struct section_list *p;
937 p = find_section_list (bfd_get_section_name (abfd, sec), FALSE);
939 if (sections_removed && p != NULL && p->remove)
940 return TRUE;
941 if (sections_copied && (p == NULL || ! p->copy))
942 return TRUE;
945 if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
947 if (strip_symbols == STRIP_DEBUG
948 || strip_symbols == STRIP_UNNEEDED
949 || strip_symbols == STRIP_ALL
950 || discard_locals == LOCALS_ALL
951 || convert_debugging)
952 return TRUE;
954 if (strip_symbols == STRIP_NONDEBUG)
955 return FALSE;
958 return FALSE;
961 /* See if a section is being removed. */
963 static bfd_boolean
964 is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
966 if (is_strip_section_1 (abfd, sec))
967 return TRUE;
969 if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0)
971 asymbol *gsym;
972 const char *gname;
973 asection *elt, *first;
975 /* PR binutils/3181
976 If we are going to strip the group signature symbol, then
977 strip the group section too. */
978 gsym = group_signature (sec);
979 if (gsym != NULL)
980 gname = gsym->name;
981 else
982 gname = sec->name;
983 if ((strip_symbols == STRIP_ALL
984 && !is_specified_symbol (gname, keep_specific_htab))
985 || is_specified_symbol (gname, strip_specific_htab))
986 return TRUE;
988 /* Remove the group section if all members are removed. */
989 first = elt = elf_next_in_group (sec);
990 while (elt != NULL)
992 if (!is_strip_section_1 (abfd, elt))
993 return FALSE;
994 elt = elf_next_in_group (elt);
995 if (elt == first)
996 break;
999 return TRUE;
1002 return FALSE;
1005 /* Return true if SYM is a hidden symbol. */
1007 static bfd_boolean
1008 is_hidden_symbol (asymbol *sym)
1010 elf_symbol_type *elf_sym;
1012 elf_sym = elf_symbol_from (sym->the_bfd, sym);
1013 if (elf_sym != NULL)
1014 switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
1016 case STV_HIDDEN:
1017 case STV_INTERNAL:
1018 return TRUE;
1020 return FALSE;
1023 /* Choose which symbol entries to copy; put the result in OSYMS.
1024 We don't copy in place, because that confuses the relocs.
1025 Return the number of symbols to print. */
1027 static unsigned int
1028 filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
1029 asymbol **isyms, long symcount)
1031 asymbol **from = isyms, **to = osyms;
1032 long src_count = 0, dst_count = 0;
1033 int relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
1035 for (; src_count < symcount; src_count++)
1037 asymbol *sym = from[src_count];
1038 flagword flags = sym->flags;
1039 char *name = (char *) bfd_asymbol_name (sym);
1040 bfd_boolean keep;
1041 bfd_boolean used_in_reloc = FALSE;
1042 bfd_boolean undefined;
1043 bfd_boolean rem_leading_char;
1044 bfd_boolean add_leading_char;
1046 undefined = bfd_is_und_section (bfd_get_section (sym));
1048 if (redefine_sym_list)
1050 char *old_name, *new_name;
1052 old_name = (char *) bfd_asymbol_name (sym);
1053 new_name = (char *) lookup_sym_redefinition (old_name);
1054 bfd_asymbol_name (sym) = new_name;
1055 name = new_name;
1058 /* Check if we will remove the current leading character. */
1059 rem_leading_char =
1060 (name[0] == bfd_get_symbol_leading_char (abfd))
1061 && (change_leading_char
1062 || (remove_leading_char
1063 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1064 || undefined
1065 || bfd_is_com_section (bfd_get_section (sym)))));
1067 /* Check if we will add a new leading character. */
1068 add_leading_char =
1069 change_leading_char
1070 && (bfd_get_symbol_leading_char (obfd) != '\0')
1071 && (bfd_get_symbol_leading_char (abfd) == '\0'
1072 || (name[0] == bfd_get_symbol_leading_char (abfd)));
1074 /* Short circuit for change_leading_char if we can do it in-place. */
1075 if (rem_leading_char && add_leading_char && !prefix_symbols_string)
1077 name[0] = bfd_get_symbol_leading_char (obfd);
1078 bfd_asymbol_name (sym) = name;
1079 rem_leading_char = FALSE;
1080 add_leading_char = FALSE;
1083 /* Remove leading char. */
1084 if (rem_leading_char)
1085 bfd_asymbol_name (sym) = ++name;
1087 /* Add new leading char and/or prefix. */
1088 if (add_leading_char || prefix_symbols_string)
1090 char *n, *ptr;
1092 ptr = n = (char *) xmalloc (1 + strlen (prefix_symbols_string)
1093 + strlen (name) + 1);
1094 if (add_leading_char)
1095 *ptr++ = bfd_get_symbol_leading_char (obfd);
1097 if (prefix_symbols_string)
1099 strcpy (ptr, prefix_symbols_string);
1100 ptr += strlen (prefix_symbols_string);
1103 strcpy (ptr, name);
1104 bfd_asymbol_name (sym) = n;
1105 name = n;
1108 if (strip_symbols == STRIP_ALL)
1109 keep = FALSE;
1110 else if ((flags & BSF_KEEP) != 0 /* Used in relocation. */
1111 || ((flags & BSF_SECTION_SYM) != 0
1112 && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
1113 & BSF_KEEP) != 0))
1115 keep = TRUE;
1116 used_in_reloc = TRUE;
1118 else if (relocatable /* Relocatable file. */
1119 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1120 || bfd_is_com_section (bfd_get_section (sym))))
1121 keep = TRUE;
1122 else if (bfd_decode_symclass (sym) == 'I')
1123 /* Global symbols in $idata sections need to be retained
1124 even if relocatable is FALSE. External users of the
1125 library containing the $idata section may reference these
1126 symbols. */
1127 keep = TRUE;
1128 else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */
1129 || (flags & BSF_WEAK) != 0
1130 || undefined
1131 || bfd_is_com_section (bfd_get_section (sym)))
1132 keep = strip_symbols != STRIP_UNNEEDED;
1133 else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */
1134 keep = (strip_symbols != STRIP_DEBUG
1135 && strip_symbols != STRIP_UNNEEDED
1136 && ! convert_debugging);
1137 else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym)))
1138 /* COMDAT sections store special information in local
1139 symbols, so we cannot risk stripping any of them. */
1140 keep = TRUE;
1141 else /* Local symbol. */
1142 keep = (strip_symbols != STRIP_UNNEEDED
1143 && (discard_locals != LOCALS_ALL
1144 && (discard_locals != LOCALS_START_L
1145 || ! bfd_is_local_label (abfd, sym))));
1147 if (keep && is_specified_symbol (name, strip_specific_htab))
1149 /* There are multiple ways to set 'keep' above, but if it
1150 was the relocatable symbol case, then that's an error. */
1151 if (used_in_reloc)
1153 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name);
1154 status = 1;
1156 else
1157 keep = FALSE;
1160 if (keep
1161 && !(flags & BSF_KEEP)
1162 && is_specified_symbol (name, strip_unneeded_htab))
1163 keep = FALSE;
1165 if (!keep
1166 && ((keep_file_symbols && (flags & BSF_FILE))
1167 || is_specified_symbol (name, keep_specific_htab)))
1168 keep = TRUE;
1170 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
1171 keep = FALSE;
1173 if (keep)
1175 if ((flags & BSF_GLOBAL) != 0
1176 && (weaken || is_specified_symbol (name, weaken_specific_htab)))
1178 sym->flags &= ~ BSF_GLOBAL;
1179 sym->flags |= BSF_WEAK;
1182 if (!undefined
1183 && (flags & (BSF_GLOBAL | BSF_WEAK))
1184 && (is_specified_symbol (name, localize_specific_htab)
1185 || (htab_elements (keepglobal_specific_htab) != 0
1186 && ! is_specified_symbol (name, keepglobal_specific_htab))
1187 || (localize_hidden && is_hidden_symbol (sym))))
1189 sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
1190 sym->flags |= BSF_LOCAL;
1193 if (!undefined
1194 && (flags & BSF_LOCAL)
1195 && is_specified_symbol (name, globalize_specific_htab))
1197 sym->flags &= ~ BSF_LOCAL;
1198 sym->flags |= BSF_GLOBAL;
1201 to[dst_count++] = sym;
1205 to[dst_count] = NULL;
1207 return dst_count;
1210 /* Find the redefined name of symbol SOURCE. */
1212 static const char *
1213 lookup_sym_redefinition (const char *source)
1215 struct redefine_node *list;
1217 for (list = redefine_sym_list; list != NULL; list = list->next)
1218 if (strcmp (source, list->source) == 0)
1219 return list->target;
1221 return source;
1224 /* Add a node to a symbol redefine list. */
1226 static void
1227 redefine_list_append (const char *cause, const char *source, const char *target)
1229 struct redefine_node **p;
1230 struct redefine_node *list;
1231 struct redefine_node *new_node;
1233 for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next)
1235 if (strcmp (source, list->source) == 0)
1236 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1237 cause, source);
1239 if (strcmp (target, list->target) == 0)
1240 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1241 cause, target);
1244 new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node));
1246 new_node->source = strdup (source);
1247 new_node->target = strdup (target);
1248 new_node->next = NULL;
1250 *p = new_node;
1253 /* Handle the --redefine-syms option. Read lines containing "old new"
1254 from the file, and add them to the symbol redefine list. */
1256 static void
1257 add_redefine_syms_file (const char *filename)
1259 FILE *file;
1260 char *buf;
1261 size_t bufsize;
1262 size_t len;
1263 size_t outsym_off;
1264 int c, lineno;
1266 file = fopen (filename, "r");
1267 if (file == NULL)
1268 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1269 filename, strerror (errno));
1271 bufsize = 100;
1272 buf = (char *) xmalloc (bufsize + 1 /* For the terminating NUL. */);
1274 lineno = 1;
1275 c = getc (file);
1276 len = 0;
1277 outsym_off = 0;
1278 while (c != EOF)
1280 /* Collect the input symbol name. */
1281 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1283 if (c == '#')
1284 goto comment;
1285 buf[len++] = c;
1286 if (len >= bufsize)
1288 bufsize *= 2;
1289 buf = (char *) xrealloc (buf, bufsize + 1);
1291 c = getc (file);
1293 buf[len++] = '\0';
1294 if (c == EOF)
1295 break;
1297 /* Eat white space between the symbol names. */
1298 while (IS_WHITESPACE (c))
1299 c = getc (file);
1300 if (c == '#' || IS_LINE_TERMINATOR (c))
1301 goto comment;
1302 if (c == EOF)
1303 break;
1305 /* Collect the output symbol name. */
1306 outsym_off = len;
1307 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1309 if (c == '#')
1310 goto comment;
1311 buf[len++] = c;
1312 if (len >= bufsize)
1314 bufsize *= 2;
1315 buf = (char *) xrealloc (buf, bufsize + 1);
1317 c = getc (file);
1319 buf[len++] = '\0';
1320 if (c == EOF)
1321 break;
1323 /* Eat white space at end of line. */
1324 while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c))
1325 c = getc (file);
1326 if (c == '#')
1327 goto comment;
1328 /* Handle \r\n. */
1329 if ((c == '\r' && (c = getc (file)) == '\n')
1330 || c == '\n' || c == EOF)
1332 end_of_line:
1333 /* Append the redefinition to the list. */
1334 if (buf[0] != '\0')
1335 redefine_list_append (filename, &buf[0], &buf[outsym_off]);
1337 lineno++;
1338 len = 0;
1339 outsym_off = 0;
1340 if (c == EOF)
1341 break;
1342 c = getc (file);
1343 continue;
1345 else
1346 fatal (_("%s:%d: garbage found at end of line"), filename, lineno);
1347 comment:
1348 if (len != 0 && (outsym_off == 0 || outsym_off == len))
1349 fatal (_("%s:%d: missing new symbol name"), filename, lineno);
1350 buf[len++] = '\0';
1352 /* Eat the rest of the line and finish it. */
1353 while (c != '\n' && c != EOF)
1354 c = getc (file);
1355 goto end_of_line;
1358 if (len != 0)
1359 fatal (_("%s:%d: premature end of file"), filename, lineno);
1361 free (buf);
1364 /* Copy unkown object file IBFD onto OBFD.
1365 Returns TRUE upon success, FALSE otherwise. */
1367 static bfd_boolean
1368 copy_unknown_object (bfd *ibfd, bfd *obfd)
1370 char *cbuf;
1371 int tocopy;
1372 long ncopied;
1373 long size;
1374 struct stat buf;
1376 if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1378 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1379 return FALSE;
1382 size = buf.st_size;
1383 if (size < 0)
1385 non_fatal (_("stat returns negative size for `%s'"),
1386 bfd_get_archive_filename (ibfd));
1387 return FALSE;
1390 if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1392 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1393 return FALSE;
1396 if (verbose)
1397 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1398 bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1400 cbuf = (char *) xmalloc (BUFSIZE);
1401 ncopied = 0;
1402 while (ncopied < size)
1404 tocopy = size - ncopied;
1405 if (tocopy > BUFSIZE)
1406 tocopy = BUFSIZE;
1408 if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1409 != (bfd_size_type) tocopy)
1411 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1412 free (cbuf);
1413 return FALSE;
1416 if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1417 != (bfd_size_type) tocopy)
1419 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1420 free (cbuf);
1421 return FALSE;
1424 ncopied += tocopy;
1427 /* We should at least to be able to read it back when copying an
1428 unknown object in an archive. */
1429 chmod (bfd_get_filename (obfd), buf.st_mode | S_IRUSR);
1430 free (cbuf);
1431 return TRUE;
1434 /* Copy object file IBFD onto OBFD.
1435 Returns TRUE upon success, FALSE otherwise. */
1437 static bfd_boolean
1438 copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
1440 bfd_vma start;
1441 long symcount;
1442 asection **osections = NULL;
1443 asection *gnu_debuglink_section = NULL;
1444 bfd_size_type *gaps = NULL;
1445 bfd_size_type max_gap = 0;
1446 long symsize;
1447 void *dhandle;
1448 enum bfd_architecture iarch;
1449 unsigned int imach;
1451 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1452 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
1453 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
1454 fatal (_("Unable to change endianness of input file(s)"));
1456 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1458 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1459 return FALSE;
1462 if (verbose)
1463 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
1464 bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
1465 bfd_get_filename (obfd), bfd_get_target (obfd));
1467 if (extract_symbol)
1468 start = 0;
1469 else
1471 if (set_start_set)
1472 start = set_start;
1473 else
1474 start = bfd_get_start_address (ibfd);
1475 start += change_start;
1478 /* Neither the start address nor the flags
1479 need to be set for a core file. */
1480 if (bfd_get_format (obfd) != bfd_core)
1482 flagword flags;
1484 flags = bfd_get_file_flags (ibfd);
1485 flags |= bfd_flags_to_set;
1486 flags &= ~bfd_flags_to_clear;
1487 flags &= bfd_applicable_file_flags (obfd);
1489 if (strip_symbols == STRIP_ALL)
1490 flags &= ~HAS_RELOC;
1492 if (!bfd_set_start_address (obfd, start)
1493 || !bfd_set_file_flags (obfd, flags))
1495 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1496 return FALSE;
1500 /* Copy architecture of input file to output file. */
1501 iarch = bfd_get_arch (ibfd);
1502 imach = bfd_get_mach (ibfd);
1503 if (input_arch)
1505 if (bfd_get_arch_info (ibfd) == NULL
1506 || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown)
1508 iarch = input_arch->arch;
1509 imach = input_arch->mach;
1511 else
1512 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
1513 bfd_get_archive_filename (ibfd));
1515 if (!bfd_set_arch_mach (obfd, iarch, imach)
1516 && (ibfd->target_defaulted
1517 || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
1519 if (bfd_get_arch (ibfd) == bfd_arch_unknown)
1520 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1521 bfd_get_archive_filename (ibfd));
1522 else
1523 non_fatal (_("Output file cannot represent architecture `%s'"),
1524 bfd_printable_arch_mach (bfd_get_arch (ibfd),
1525 bfd_get_mach (ibfd)));
1526 return FALSE;
1529 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1531 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1532 return FALSE;
1535 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
1536 && bfd_pei_p (obfd))
1538 /* Set up PE parameters. */
1539 pe_data_type *pe = pe_data (obfd);
1541 /* Copy PE parameters before changing them. */
1542 if (ibfd->xvec->flavour == bfd_target_coff_flavour
1543 && bfd_pei_p (ibfd))
1544 pe->pe_opthdr = pe_data (ibfd)->pe_opthdr;
1546 if (pe_file_alignment != (bfd_vma) -1)
1547 pe->pe_opthdr.FileAlignment = pe_file_alignment;
1548 else
1549 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
1551 if (pe_heap_commit != (bfd_vma) -1)
1552 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_commit;
1554 if (pe_heap_reserve != (bfd_vma) -1)
1555 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_reserve;
1557 if (pe_image_base != (bfd_vma) -1)
1558 pe->pe_opthdr.ImageBase = pe_image_base;
1560 if (pe_section_alignment != (bfd_vma) -1)
1561 pe->pe_opthdr.SectionAlignment = pe_section_alignment;
1562 else
1563 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
1565 if (pe_stack_commit != (bfd_vma) -1)
1566 pe->pe_opthdr.SizeOfStackCommit = pe_stack_commit;
1568 if (pe_stack_reserve != (bfd_vma) -1)
1569 pe->pe_opthdr.SizeOfStackCommit = pe_stack_reserve;
1571 if (pe_subsystem != -1)
1572 pe->pe_opthdr.Subsystem = pe_subsystem;
1574 if (pe_major_subsystem_version != -1)
1575 pe->pe_opthdr.MajorSubsystemVersion = pe_major_subsystem_version;
1577 if (pe_minor_subsystem_version != -1)
1578 pe->pe_opthdr.MinorSubsystemVersion = pe_minor_subsystem_version;
1580 if (pe_file_alignment > pe_section_alignment)
1582 char file_alignment[20], section_alignment[20];
1584 sprintf_vma (file_alignment, pe_file_alignment);
1585 sprintf_vma (section_alignment, pe_section_alignment);
1586 non_fatal (_("warning: file alignment (0x%s) > section alignment (0x%s)"),
1588 file_alignment, section_alignment);
1592 if (isympp)
1593 free (isympp);
1595 if (osympp != isympp)
1596 free (osympp);
1598 isympp = NULL;
1599 osympp = NULL;
1601 symsize = bfd_get_symtab_upper_bound (ibfd);
1602 if (symsize < 0)
1604 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1605 return FALSE;
1608 osympp = isympp = (asymbol **) xmalloc (symsize);
1609 symcount = bfd_canonicalize_symtab (ibfd, isympp);
1610 if (symcount < 0)
1612 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1613 return FALSE;
1616 /* BFD mandates that all output sections be created and sizes set before
1617 any output is done. Thus, we traverse all sections multiple times. */
1618 bfd_map_over_sections (ibfd, setup_section, obfd);
1620 if (!extract_symbol)
1621 setup_bfd_headers (ibfd, obfd);
1623 if (add_sections != NULL)
1625 struct section_add *padd;
1626 struct section_list *pset;
1628 for (padd = add_sections; padd != NULL; padd = padd->next)
1630 flagword flags;
1632 pset = find_section_list (padd->name, FALSE);
1633 if (pset != NULL)
1634 pset->used = TRUE;
1636 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
1637 if (pset != NULL && pset->set_flags)
1638 flags = pset->flags | SEC_HAS_CONTENTS;
1640 /* bfd_make_section_with_flags() does not return very helpful
1641 error codes, so check for the most likely user error first. */
1642 if (bfd_get_section_by_name (obfd, padd->name))
1644 bfd_nonfatal_message (NULL, obfd, NULL,
1645 _("can't add section '%s'"), padd->name);
1646 return FALSE;
1648 else
1650 /* We use LINKER_CREATED here so that the backend hooks
1651 will create any special section type information,
1652 instead of presuming we know what we're doing merely
1653 because we set the flags. */
1654 padd->section = bfd_make_section_with_flags
1655 (obfd, padd->name, flags | SEC_LINKER_CREATED);
1656 if (padd->section == NULL)
1658 bfd_nonfatal_message (NULL, obfd, NULL,
1659 _("can't create section `%s'"),
1660 padd->name);
1661 return FALSE;
1665 if (! bfd_set_section_size (obfd, padd->section, padd->size))
1667 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1668 return FALSE;
1671 if (pset != NULL)
1673 if (pset->change_vma != CHANGE_IGNORE)
1674 if (! bfd_set_section_vma (obfd, padd->section,
1675 pset->vma_val))
1677 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1678 return FALSE;
1681 if (pset->change_lma != CHANGE_IGNORE)
1683 padd->section->lma = pset->lma_val;
1685 if (! bfd_set_section_alignment
1686 (obfd, padd->section,
1687 bfd_section_alignment (obfd, padd->section)))
1689 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1690 return FALSE;
1697 if (gnu_debuglink_filename != NULL)
1699 gnu_debuglink_section = bfd_create_gnu_debuglink_section
1700 (obfd, gnu_debuglink_filename);
1702 if (gnu_debuglink_section == NULL)
1704 bfd_nonfatal_message (NULL, obfd, NULL,
1705 _("cannot create debug link section `%s'"),
1706 gnu_debuglink_filename);
1707 return FALSE;
1710 /* Special processing for PE format files. We
1711 have no way to distinguish PE from COFF here. */
1712 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour)
1714 bfd_vma debuglink_vma;
1715 asection * highest_section;
1716 asection * sec;
1718 /* The PE spec requires that all sections be adjacent and sorted
1719 in ascending order of VMA. It also specifies that debug
1720 sections should be last. This is despite the fact that debug
1721 sections are not loaded into memory and so in theory have no
1722 use for a VMA.
1724 This means that the debuglink section must be given a non-zero
1725 VMA which makes it contiguous with other debug sections. So
1726 walk the current section list, find the section with the
1727 highest VMA and start the debuglink section after that one. */
1728 for (sec = obfd->sections, highest_section = NULL;
1729 sec != NULL;
1730 sec = sec->next)
1731 if (sec->vma > 0
1732 && (highest_section == NULL
1733 || sec->vma > highest_section->vma))
1734 highest_section = sec;
1736 if (highest_section)
1737 debuglink_vma = BFD_ALIGN (highest_section->vma
1738 + highest_section->size,
1739 /* FIXME: We ought to be using
1740 COFF_PAGE_SIZE here or maybe
1741 bfd_get_section_alignment() (if it
1742 was set) but since this is for PE
1743 and we know the required alignment
1744 it is easier just to hard code it. */
1745 0x1000);
1746 else
1747 /* Umm, not sure what to do in this case. */
1748 debuglink_vma = 0x1000;
1750 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
1754 if (bfd_count_sections (obfd) != 0
1755 && (gap_fill_set || pad_to_set))
1757 asection **set;
1758 unsigned int c, i;
1760 /* We must fill in gaps between the sections and/or we must pad
1761 the last section to a specified address. We do this by
1762 grabbing a list of the sections, sorting them by VMA, and
1763 increasing the section sizes as required to fill the gaps.
1764 We write out the gap contents below. */
1766 c = bfd_count_sections (obfd);
1767 osections = (asection **) xmalloc (c * sizeof (asection *));
1768 set = osections;
1769 bfd_map_over_sections (obfd, get_sections, &set);
1771 qsort (osections, c, sizeof (asection *), compare_section_lma);
1773 gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type));
1774 memset (gaps, 0, c * sizeof (bfd_size_type));
1776 if (gap_fill_set)
1778 for (i = 0; i < c - 1; i++)
1780 flagword flags;
1781 bfd_size_type size;
1782 bfd_vma gap_start, gap_stop;
1784 flags = bfd_get_section_flags (obfd, osections[i]);
1785 if ((flags & SEC_HAS_CONTENTS) == 0
1786 || (flags & SEC_LOAD) == 0)
1787 continue;
1789 size = bfd_section_size (obfd, osections[i]);
1790 gap_start = bfd_section_lma (obfd, osections[i]) + size;
1791 gap_stop = bfd_section_lma (obfd, osections[i + 1]);
1792 if (gap_start < gap_stop)
1794 if (! bfd_set_section_size (obfd, osections[i],
1795 size + (gap_stop - gap_start)))
1797 bfd_nonfatal_message (NULL, obfd, osections[i],
1798 _("Can't fill gap after section"));
1799 status = 1;
1800 break;
1802 gaps[i] = gap_stop - gap_start;
1803 if (max_gap < gap_stop - gap_start)
1804 max_gap = gap_stop - gap_start;
1809 if (pad_to_set)
1811 bfd_vma lma;
1812 bfd_size_type size;
1814 lma = bfd_section_lma (obfd, osections[c - 1]);
1815 size = bfd_section_size (obfd, osections[c - 1]);
1816 if (lma + size < pad_to)
1818 if (! bfd_set_section_size (obfd, osections[c - 1],
1819 pad_to - lma))
1821 bfd_nonfatal_message (NULL, obfd, osections[c - 1],
1822 _("can't add padding"));
1823 status = 1;
1825 else
1827 gaps[c - 1] = pad_to - (lma + size);
1828 if (max_gap < pad_to - (lma + size))
1829 max_gap = pad_to - (lma + size);
1835 /* Symbol filtering must happen after the output sections
1836 have been created, but before their contents are set. */
1837 dhandle = NULL;
1838 if (convert_debugging)
1839 dhandle = read_debugging_info (ibfd, isympp, symcount, FALSE);
1841 if (strip_symbols == STRIP_DEBUG
1842 || strip_symbols == STRIP_ALL
1843 || strip_symbols == STRIP_UNNEEDED
1844 || strip_symbols == STRIP_NONDEBUG
1845 || discard_locals != LOCALS_UNDEF
1846 || localize_hidden
1847 || htab_elements (strip_specific_htab) != 0
1848 || htab_elements (keep_specific_htab) != 0
1849 || htab_elements (localize_specific_htab) != 0
1850 || htab_elements (globalize_specific_htab) != 0
1851 || htab_elements (keepglobal_specific_htab) != 0
1852 || htab_elements (weaken_specific_htab) != 0
1853 || prefix_symbols_string
1854 || sections_removed
1855 || sections_copied
1856 || convert_debugging
1857 || change_leading_char
1858 || remove_leading_char
1859 || redefine_sym_list
1860 || weaken)
1862 /* Mark symbols used in output relocations so that they
1863 are kept, even if they are local labels or static symbols.
1865 Note we iterate over the input sections examining their
1866 relocations since the relocations for the output sections
1867 haven't been set yet. mark_symbols_used_in_relocations will
1868 ignore input sections which have no corresponding output
1869 section. */
1870 if (strip_symbols != STRIP_ALL)
1871 bfd_map_over_sections (ibfd,
1872 mark_symbols_used_in_relocations,
1873 isympp);
1874 osympp = (asymbol **) xmalloc ((symcount + 1) * sizeof (asymbol *));
1875 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
1878 if (convert_debugging && dhandle != NULL)
1880 if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
1882 status = 1;
1883 return FALSE;
1887 bfd_set_symtab (obfd, osympp, symcount);
1889 /* This has to happen after the symbol table has been set. */
1890 bfd_map_over_sections (ibfd, copy_section, obfd);
1892 if (add_sections != NULL)
1894 struct section_add *padd;
1896 for (padd = add_sections; padd != NULL; padd = padd->next)
1898 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
1899 0, padd->size))
1901 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1902 return FALSE;
1907 if (gnu_debuglink_filename != NULL)
1909 if (! bfd_fill_in_gnu_debuglink_section
1910 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
1912 bfd_nonfatal_message (NULL, obfd, NULL,
1913 _("cannot fill debug link section `%s'"),
1914 gnu_debuglink_filename);
1915 return FALSE;
1919 if (gap_fill_set || pad_to_set)
1921 bfd_byte *buf;
1922 int c, i;
1924 /* Fill in the gaps. */
1925 if (max_gap > 8192)
1926 max_gap = 8192;
1927 buf = (bfd_byte *) xmalloc (max_gap);
1928 memset (buf, gap_fill, max_gap);
1930 c = bfd_count_sections (obfd);
1931 for (i = 0; i < c; i++)
1933 if (gaps[i] != 0)
1935 bfd_size_type left;
1936 file_ptr off;
1938 left = gaps[i];
1939 off = bfd_section_size (obfd, osections[i]) - left;
1941 while (left > 0)
1943 bfd_size_type now;
1945 if (left > 8192)
1946 now = 8192;
1947 else
1948 now = left;
1950 if (! bfd_set_section_contents (obfd, osections[i], buf,
1951 off, now))
1953 bfd_nonfatal_message (NULL, obfd, osections[i], NULL);
1954 return FALSE;
1957 left -= now;
1958 off += now;
1964 /* Do not copy backend data if --extract-symbol is passed; anything
1965 that needs to look at the section contents will fail. */
1966 if (extract_symbol)
1967 return TRUE;
1969 /* Allow the BFD backend to copy any private data it understands
1970 from the input BFD to the output BFD. This is done last to
1971 permit the routine to look at the filtered symbol table, which is
1972 important for the ECOFF code at least. */
1973 if (! bfd_copy_private_bfd_data (ibfd, obfd))
1975 bfd_nonfatal_message (NULL, obfd, NULL,
1976 _("error copying private BFD data"));
1977 return FALSE;
1980 /* Switch to the alternate machine code. We have to do this at the
1981 very end, because we only initialize the header when we create
1982 the first section. */
1983 if (use_alt_mach_code != 0)
1985 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
1987 non_fatal (_("this target does not support %lu alternative machine codes"),
1988 use_alt_mach_code);
1989 if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
1991 non_fatal (_("treating that number as an absolute e_machine value instead"));
1992 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
1994 else
1995 non_fatal (_("ignoring the alternative value"));
1999 return TRUE;
2002 /* Read each archive element in turn from IBFD, copy the
2003 contents to temp file, and keep the temp file handle.
2004 If 'force_output_target' is TRUE then make sure that
2005 all elements in the new archive are of the type
2006 'output_target'. */
2008 static void
2009 copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
2010 bfd_boolean force_output_target,
2011 const bfd_arch_info_type *input_arch)
2013 struct name_list
2015 struct name_list *next;
2016 const char *name;
2017 bfd *obfd;
2018 } *list, *l;
2019 bfd **ptr = &obfd->archive_head;
2020 bfd *this_element;
2021 char *dir;
2022 const char *filename;
2024 /* Make a temp directory to hold the contents. */
2025 dir = make_tempdir (bfd_get_filename (obfd));
2026 if (dir == NULL)
2027 fatal (_("cannot create tempdir for archive copying (error: %s)"),
2028 strerror (errno));
2030 obfd->has_armap = ibfd->has_armap;
2031 obfd->is_thin_archive = ibfd->is_thin_archive;
2033 list = NULL;
2035 this_element = bfd_openr_next_archived_file (ibfd, NULL);
2037 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2039 status = 1;
2040 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
2041 return;
2044 while (!status && this_element != NULL)
2046 char *output_name;
2047 bfd *output_bfd;
2048 bfd *last_element;
2049 struct stat buf;
2050 int stat_status = 0;
2051 bfd_boolean del = TRUE;
2052 bfd_boolean ok_object;
2054 /* Create an output file for this member. */
2055 output_name = concat (dir, "/",
2056 bfd_get_filename (this_element), (char *) 0);
2058 /* If the file already exists, make another temp dir. */
2059 if (stat (output_name, &buf) >= 0)
2061 output_name = make_tempdir (output_name);
2062 if (output_name == NULL)
2063 fatal (_("cannot create tempdir for archive copying (error: %s)"),
2064 strerror (errno));
2066 l = (struct name_list *) xmalloc (sizeof (struct name_list));
2067 l->name = output_name;
2068 l->next = list;
2069 l->obfd = NULL;
2070 list = l;
2071 output_name = concat (output_name, "/",
2072 bfd_get_filename (this_element), (char *) 0);
2075 if (preserve_dates)
2077 stat_status = bfd_stat_arch_elt (this_element, &buf);
2079 if (stat_status != 0)
2080 non_fatal (_("internal stat error on %s"),
2081 bfd_get_filename (this_element));
2084 l = (struct name_list *) xmalloc (sizeof (struct name_list));
2085 l->name = output_name;
2086 l->next = list;
2087 l->obfd = NULL;
2088 list = l;
2090 ok_object = bfd_check_format (this_element, bfd_object);
2091 if (!ok_object)
2092 bfd_nonfatal_message (NULL, this_element, NULL,
2093 _("Unable to recognise the format of file"));
2095 /* PR binutils/3110: Cope with archives
2096 containing multiple target types. */
2097 if (force_output_target || !ok_object)
2098 output_bfd = bfd_openw (output_name, output_target);
2099 else
2100 output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
2102 if (output_bfd == NULL)
2104 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2105 status = 1;
2106 return;
2109 if (ok_object)
2111 del = !copy_object (this_element, output_bfd, input_arch);
2113 if (del && bfd_get_arch (this_element) == bfd_arch_unknown)
2114 /* Try again as an unknown object file. */
2115 ok_object = FALSE;
2116 else if (!bfd_close (output_bfd))
2118 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2119 /* Error in new object file. Don't change archive. */
2120 status = 1;
2124 if (!ok_object)
2126 del = !copy_unknown_object (this_element, output_bfd);
2127 if (!bfd_close_all_done (output_bfd))
2129 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2130 /* Error in new object file. Don't change archive. */
2131 status = 1;
2135 if (del)
2137 unlink (output_name);
2138 status = 1;
2140 else
2142 if (preserve_dates && stat_status == 0)
2143 set_times (output_name, &buf);
2145 /* Open the newly output file and attach to our list. */
2146 output_bfd = bfd_openr (output_name, output_target);
2148 l->obfd = output_bfd;
2150 *ptr = output_bfd;
2151 ptr = &output_bfd->archive_next;
2153 last_element = this_element;
2155 this_element = bfd_openr_next_archived_file (ibfd, last_element);
2157 bfd_close (last_element);
2160 *ptr = NULL;
2162 filename = bfd_get_filename (obfd);
2163 if (!bfd_close (obfd))
2165 status = 1;
2166 bfd_nonfatal_message (filename, NULL, NULL, NULL);
2167 return;
2170 filename = bfd_get_filename (ibfd);
2171 if (!bfd_close (ibfd))
2173 status = 1;
2174 bfd_nonfatal_message (filename, NULL, NULL, NULL);
2175 return;
2178 /* Delete all the files that we opened. */
2179 for (l = list; l != NULL; l = l->next)
2181 if (l->obfd == NULL)
2182 rmdir (l->name);
2183 else
2185 bfd_close (l->obfd);
2186 unlink (l->name);
2189 rmdir (dir);
2192 static void
2193 set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_handling style)
2195 /* This is only relevant to Coff targets. */
2196 if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
2198 if (style == KEEP
2199 && bfd_get_flavour (input_bfd) == bfd_target_coff_flavour)
2200 style = bfd_coff_long_section_names (input_bfd) ? ENABLE : DISABLE;
2201 bfd_coff_set_long_section_names (output_bfd, style != DISABLE);
2205 /* The top-level control. */
2207 static void
2208 copy_file (const char *input_filename, const char *output_filename,
2209 const char *input_target, const char *output_target,
2210 const bfd_arch_info_type *input_arch)
2212 bfd *ibfd;
2213 char **obj_matching;
2214 char **core_matching;
2215 off_t size = get_file_size (input_filename);
2217 if (size < 1)
2219 if (size == 0)
2220 non_fatal (_("error: the input file '%s' is empty"),
2221 input_filename);
2222 status = 1;
2223 return;
2226 /* To allow us to do "strip *" without dying on the first
2227 non-object file, failures are nonfatal. */
2228 ibfd = bfd_openr (input_filename, input_target);
2229 if (ibfd == NULL)
2231 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2232 status = 1;
2233 return;
2236 switch (do_debug_sections)
2238 case compress:
2239 ibfd->flags |= BFD_COMPRESS;
2240 break;
2241 case decompress:
2242 ibfd->flags |= BFD_DECOMPRESS;
2243 break;
2244 default:
2245 break;
2248 if (bfd_check_format (ibfd, bfd_archive))
2250 bfd_boolean force_output_target;
2251 bfd *obfd;
2253 /* bfd_get_target does not return the correct value until
2254 bfd_check_format succeeds. */
2255 if (output_target == NULL)
2257 output_target = bfd_get_target (ibfd);
2258 force_output_target = FALSE;
2260 else
2261 force_output_target = TRUE;
2263 obfd = bfd_openw (output_filename, output_target);
2264 if (obfd == NULL)
2266 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2267 status = 1;
2268 return;
2270 /* This is a no-op on non-Coff targets. */
2271 set_long_section_mode (obfd, ibfd, long_section_names);
2273 copy_archive (ibfd, obfd, output_target, force_output_target, input_arch);
2275 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
2277 bfd *obfd;
2278 do_copy:
2280 /* bfd_get_target does not return the correct value until
2281 bfd_check_format succeeds. */
2282 if (output_target == NULL)
2283 output_target = bfd_get_target (ibfd);
2285 obfd = bfd_openw (output_filename, output_target);
2286 if (obfd == NULL)
2288 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2289 status = 1;
2290 return;
2292 /* This is a no-op on non-Coff targets. */
2293 set_long_section_mode (obfd, ibfd, long_section_names);
2295 if (! copy_object (ibfd, obfd, input_arch))
2296 status = 1;
2298 if (!bfd_close (obfd))
2300 status = 1;
2301 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2302 return;
2305 if (!bfd_close (ibfd))
2307 status = 1;
2308 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2309 return;
2312 else
2314 bfd_error_type obj_error = bfd_get_error ();
2315 bfd_error_type core_error;
2317 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
2319 /* This probably can't happen.. */
2320 if (obj_error == bfd_error_file_ambiguously_recognized)
2321 free (obj_matching);
2322 goto do_copy;
2325 core_error = bfd_get_error ();
2326 /* Report the object error in preference to the core error. */
2327 if (obj_error != core_error)
2328 bfd_set_error (obj_error);
2330 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2332 if (obj_error == bfd_error_file_ambiguously_recognized)
2334 list_matching_formats (obj_matching);
2335 free (obj_matching);
2337 if (core_error == bfd_error_file_ambiguously_recognized)
2339 list_matching_formats (core_matching);
2340 free (core_matching);
2343 status = 1;
2347 /* Add a name to the section renaming list. */
2349 static void
2350 add_section_rename (const char * old_name, const char * new_name,
2351 flagword flags)
2353 section_rename * srename;
2355 /* Check for conflicts first. */
2356 for (srename = section_rename_list; srename != NULL; srename = srename->next)
2357 if (strcmp (srename->old_name, old_name) == 0)
2359 /* Silently ignore duplicate definitions. */
2360 if (strcmp (srename->new_name, new_name) == 0
2361 && srename->flags == flags)
2362 return;
2364 fatal (_("Multiple renames of section %s"), old_name);
2367 srename = (section_rename *) xmalloc (sizeof (* srename));
2369 srename->old_name = old_name;
2370 srename->new_name = new_name;
2371 srename->flags = flags;
2372 srename->next = section_rename_list;
2374 section_rename_list = srename;
2377 /* Check the section rename list for a new name of the input section
2378 ISECTION. Return the new name if one is found.
2379 Also set RETURNED_FLAGS to the flags to be used for this section. */
2381 static const char *
2382 find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection,
2383 flagword * returned_flags)
2385 const char * old_name = bfd_section_name (ibfd, isection);
2386 section_rename * srename;
2388 /* Default to using the flags of the input section. */
2389 * returned_flags = bfd_get_section_flags (ibfd, isection);
2391 for (srename = section_rename_list; srename != NULL; srename = srename->next)
2392 if (strcmp (srename->old_name, old_name) == 0)
2394 if (srename->flags != (flagword) -1)
2395 * returned_flags = srename->flags;
2397 return srename->new_name;
2400 return old_name;
2403 /* Once each of the sections is copied, we may still need to do some
2404 finalization work for private section headers. Do that here. */
2406 static void
2407 setup_bfd_headers (bfd *ibfd, bfd *obfd)
2409 /* Allow the BFD backend to copy any private data it understands
2410 from the input section to the output section. */
2411 if (! bfd_copy_private_header_data (ibfd, obfd))
2413 status = 1;
2414 bfd_nonfatal_message (NULL, ibfd, NULL,
2415 _("error in private header data"));
2416 return;
2419 /* All went well. */
2420 return;
2423 /* Create a section in OBFD with the same
2424 name and attributes as ISECTION in IBFD. */
2426 static void
2427 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2429 bfd *obfd = (bfd *) obfdarg;
2430 struct section_list *p;
2431 sec_ptr osection;
2432 bfd_size_type size;
2433 bfd_vma vma;
2434 bfd_vma lma;
2435 flagword flags;
2436 const char *err;
2437 const char * name;
2438 char *prefix = NULL;
2439 bfd_boolean make_nobits;
2441 if (is_strip_section (ibfd, isection))
2442 return;
2444 p = find_section_list (bfd_section_name (ibfd, isection), FALSE);
2445 if (p != NULL)
2446 p->used = TRUE;
2448 /* Get the, possibly new, name of the output section. */
2449 name = find_section_rename (ibfd, isection, & flags);
2451 /* Prefix sections. */
2452 if ((prefix_alloc_sections_string)
2453 && (bfd_get_section_flags (ibfd, isection) & SEC_ALLOC))
2454 prefix = prefix_alloc_sections_string;
2455 else if (prefix_sections_string)
2456 prefix = prefix_sections_string;
2458 if (prefix)
2460 char *n;
2462 n = (char *) xmalloc (strlen (prefix) + strlen (name) + 1);
2463 strcpy (n, prefix);
2464 strcat (n, name);
2465 name = n;
2468 make_nobits = FALSE;
2469 if (p != NULL && p->set_flags)
2470 flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
2471 else if (strip_symbols == STRIP_NONDEBUG
2472 && (flags & (SEC_ALLOC | SEC_GROUP)) != 0
2473 && !(ibfd->xvec->flavour == bfd_target_elf_flavour
2474 && elf_section_type (isection) == SHT_NOTE))
2476 flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
2477 if (obfd->xvec->flavour == bfd_target_elf_flavour)
2479 make_nobits = TRUE;
2481 /* Twiddle the input section flags so that it seems to
2482 elf.c:copy_private_bfd_data that section flags have not
2483 changed between input and output sections. This hack
2484 prevents wholesale rewriting of the program headers. */
2485 isection->flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
2489 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
2491 if (osection == NULL)
2493 err = _("failed to create output section");
2494 goto loser;
2497 if (make_nobits)
2498 elf_section_type (osection) = SHT_NOBITS;
2500 size = bfd_section_size (ibfd, isection);
2501 if (copy_byte >= 0)
2502 size = (size + interleave - 1) / interleave * copy_width;
2503 else if (extract_symbol)
2504 size = 0;
2505 if (! bfd_set_section_size (obfd, osection, size))
2507 err = _("failed to set size");
2508 goto loser;
2511 vma = bfd_section_vma (ibfd, isection);
2512 if (p != NULL && p->change_vma == CHANGE_MODIFY)
2513 vma += p->vma_val;
2514 else if (p != NULL && p->change_vma == CHANGE_SET)
2515 vma = p->vma_val;
2516 else
2517 vma += change_section_address;
2519 if (! bfd_set_section_vma (obfd, osection, vma))
2521 err = _("failed to set vma");
2522 goto loser;
2525 lma = isection->lma;
2526 if ((p != NULL) && p->change_lma != CHANGE_IGNORE)
2528 if (p->change_lma == CHANGE_MODIFY)
2529 lma += p->lma_val;
2530 else if (p->change_lma == CHANGE_SET)
2531 lma = p->lma_val;
2532 else
2533 abort ();
2535 else
2536 lma += change_section_address;
2538 osection->lma = lma;
2540 /* FIXME: This is probably not enough. If we change the LMA we
2541 may have to recompute the header for the file as well. */
2542 if (!bfd_set_section_alignment (obfd,
2543 osection,
2544 bfd_section_alignment (ibfd, isection)))
2546 err = _("failed to set alignment");
2547 goto loser;
2550 /* Copy merge entity size. */
2551 osection->entsize = isection->entsize;
2553 /* This used to be mangle_section; we do here to avoid using
2554 bfd_get_section_by_name since some formats allow multiple
2555 sections with the same name. */
2556 isection->output_section = osection;
2557 isection->output_offset = 0;
2559 /* Do not copy backend data if --extract-symbol is passed; anything
2560 that needs to look at the section contents will fail. */
2561 if (extract_symbol)
2562 return;
2564 if ((isection->flags & SEC_GROUP) != 0)
2566 asymbol *gsym = group_signature (isection);
2568 if (gsym != NULL)
2570 gsym->flags |= BSF_KEEP;
2571 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
2572 elf_group_id (isection) = gsym;
2576 /* Allow the BFD backend to copy any private data it understands
2577 from the input section to the output section. */
2578 if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
2580 err = _("failed to copy private data");
2581 goto loser;
2584 /* All went well. */
2585 return;
2587 loser:
2588 status = 1;
2589 bfd_nonfatal_message (NULL, obfd, osection, err);
2592 /* Copy the data of input section ISECTION of IBFD
2593 to an output section with the same name in OBFD.
2594 If stripping then don't copy any relocation info. */
2596 static void
2597 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2599 bfd *obfd = (bfd *) obfdarg;
2600 struct section_list *p;
2601 arelent **relpp;
2602 long relcount;
2603 sec_ptr osection;
2604 bfd_size_type size;
2605 long relsize;
2606 flagword flags;
2608 /* If we have already failed earlier on,
2609 do not keep on generating complaints now. */
2610 if (status != 0)
2611 return;
2613 if (is_strip_section (ibfd, isection))
2614 return;
2616 flags = bfd_get_section_flags (ibfd, isection);
2617 if ((flags & SEC_GROUP) != 0)
2618 return;
2620 osection = isection->output_section;
2621 size = bfd_get_section_size (isection);
2623 if (size == 0 || osection == 0)
2624 return;
2626 if (extract_symbol)
2627 return;
2629 p = find_section_list (bfd_get_section_name (ibfd, isection), FALSE);
2631 /* Core files do not need to be relocated. */
2632 if (bfd_get_format (obfd) == bfd_core)
2633 relsize = 0;
2634 else
2636 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2638 if (relsize < 0)
2640 /* Do not complain if the target does not support relocations. */
2641 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2642 relsize = 0;
2643 else
2645 status = 1;
2646 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
2647 return;
2652 if (relsize == 0)
2653 bfd_set_reloc (obfd, osection, NULL, 0);
2654 else
2656 relpp = (arelent **) xmalloc (relsize);
2657 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
2658 if (relcount < 0)
2660 status = 1;
2661 bfd_nonfatal_message (NULL, ibfd, isection,
2662 _("relocation count is negative"));
2663 return;
2666 if (strip_symbols == STRIP_ALL)
2668 /* Remove relocations which are not in
2669 keep_strip_specific_list. */
2670 arelent **temp_relpp;
2671 long temp_relcount = 0;
2672 long i;
2674 temp_relpp = (arelent **) xmalloc (relsize);
2675 for (i = 0; i < relcount; i++)
2676 if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
2677 keep_specific_htab))
2678 temp_relpp [temp_relcount++] = relpp [i];
2679 relcount = temp_relcount;
2680 free (relpp);
2681 relpp = temp_relpp;
2684 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
2685 if (relcount == 0)
2686 free (relpp);
2689 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
2690 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
2692 bfd_byte *memhunk = NULL;
2694 if (!bfd_get_full_section_contents (ibfd, isection, &memhunk))
2696 status = 1;
2697 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
2698 return;
2701 if (reverse_bytes)
2703 /* We don't handle leftover bytes (too many possible behaviors,
2704 and we don't know what the user wants). The section length
2705 must be a multiple of the number of bytes to swap. */
2706 if ((size % reverse_bytes) == 0)
2708 unsigned long i, j;
2709 bfd_byte b;
2711 for (i = 0; i < size; i += reverse_bytes)
2712 for (j = 0; j < (unsigned long)(reverse_bytes / 2); j++)
2714 bfd_byte *m = (bfd_byte *) memhunk;
2716 b = m[i + j];
2717 m[i + j] = m[(i + reverse_bytes) - (j + 1)];
2718 m[(i + reverse_bytes) - (j + 1)] = b;
2721 else
2722 /* User must pad the section up in order to do this. */
2723 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
2724 bfd_section_name (ibfd, isection), reverse_bytes);
2727 if (copy_byte >= 0)
2729 /* Keep only every `copy_byte'th byte in MEMHUNK. */
2730 char *from = (char *) memhunk + copy_byte;
2731 char *to = (char *) memhunk;
2732 char *end = (char *) memhunk + size;
2733 int i;
2735 for (; from < end; from += interleave)
2736 for (i = 0; i < copy_width; i++)
2737 *to++ = from[i];
2739 size = (size + interleave - 1 - copy_byte) / interleave * copy_width;
2740 osection->lma /= interleave;
2743 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2745 status = 1;
2746 bfd_nonfatal_message (NULL, obfd, osection, NULL);
2747 return;
2749 free (memhunk);
2751 else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0)
2753 void *memhunk = xmalloc (size);
2755 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
2756 flag--they can just remove the section entirely and add it
2757 back again. However, we do permit them to turn on the
2758 SEC_HAS_CONTENTS flag, and take it to mean that the section
2759 contents should be zeroed out. */
2761 memset (memhunk, 0, size);
2762 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2764 status = 1;
2765 bfd_nonfatal_message (NULL, obfd, osection, NULL);
2766 return;
2768 free (memhunk);
2772 /* Get all the sections. This is used when --gap-fill or --pad-to is
2773 used. */
2775 static void
2776 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
2778 asection ***secppp = (asection ***) secppparg;
2780 **secppp = osection;
2781 ++(*secppp);
2784 /* Sort sections by VMA. This is called via qsort, and is used when
2785 --gap-fill or --pad-to is used. We force non loadable or empty
2786 sections to the front, where they are easier to ignore. */
2788 static int
2789 compare_section_lma (const void *arg1, const void *arg2)
2791 const asection *const *sec1 = (const asection * const *) arg1;
2792 const asection *const *sec2 = (const asection * const *) arg2;
2793 flagword flags1, flags2;
2795 /* Sort non loadable sections to the front. */
2796 flags1 = (*sec1)->flags;
2797 flags2 = (*sec2)->flags;
2798 if ((flags1 & SEC_HAS_CONTENTS) == 0
2799 || (flags1 & SEC_LOAD) == 0)
2801 if ((flags2 & SEC_HAS_CONTENTS) != 0
2802 && (flags2 & SEC_LOAD) != 0)
2803 return -1;
2805 else
2807 if ((flags2 & SEC_HAS_CONTENTS) == 0
2808 || (flags2 & SEC_LOAD) == 0)
2809 return 1;
2812 /* Sort sections by LMA. */
2813 if ((*sec1)->lma > (*sec2)->lma)
2814 return 1;
2815 else if ((*sec1)->lma < (*sec2)->lma)
2816 return -1;
2818 /* Sort sections with the same LMA by size. */
2819 if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
2820 return 1;
2821 else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
2822 return -1;
2824 return 0;
2827 /* Mark all the symbols which will be used in output relocations with
2828 the BSF_KEEP flag so that those symbols will not be stripped.
2830 Ignore relocations which will not appear in the output file. */
2832 static void
2833 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
2835 asymbol **symbols = (asymbol **) symbolsarg;
2836 long relsize;
2837 arelent **relpp;
2838 long relcount, i;
2840 /* Ignore an input section with no corresponding output section. */
2841 if (isection->output_section == NULL)
2842 return;
2844 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2845 if (relsize < 0)
2847 /* Do not complain if the target does not support relocations. */
2848 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2849 return;
2850 bfd_fatal (bfd_get_filename (ibfd));
2853 if (relsize == 0)
2854 return;
2856 relpp = (arelent **) xmalloc (relsize);
2857 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
2858 if (relcount < 0)
2859 bfd_fatal (bfd_get_filename (ibfd));
2861 /* Examine each symbol used in a relocation. If it's not one of the
2862 special bfd section symbols, then mark it with BSF_KEEP. */
2863 for (i = 0; i < relcount; i++)
2865 if (*relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
2866 && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
2867 && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
2868 (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
2871 if (relpp != NULL)
2872 free (relpp);
2875 /* Write out debugging information. */
2877 static bfd_boolean
2878 write_debugging_info (bfd *obfd, void *dhandle,
2879 long *symcountp ATTRIBUTE_UNUSED,
2880 asymbol ***symppp ATTRIBUTE_UNUSED)
2882 if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour)
2883 return write_ieee_debugging_info (obfd, dhandle);
2885 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2886 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
2888 bfd_byte *syms, *strings;
2889 bfd_size_type symsize, stringsize;
2890 asection *stabsec, *stabstrsec;
2891 flagword flags;
2893 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
2894 &symsize, &strings,
2895 &stringsize))
2896 return FALSE;
2898 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
2899 stabsec = bfd_make_section_with_flags (obfd, ".stab", flags);
2900 stabstrsec = bfd_make_section_with_flags (obfd, ".stabstr", flags);
2901 if (stabsec == NULL
2902 || stabstrsec == NULL
2903 || ! bfd_set_section_size (obfd, stabsec, symsize)
2904 || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
2905 || ! bfd_set_section_alignment (obfd, stabsec, 2)
2906 || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
2908 bfd_nonfatal_message (NULL, obfd, NULL,
2909 _("can't create debugging section"));
2910 return FALSE;
2913 /* We can get away with setting the section contents now because
2914 the next thing the caller is going to do is copy over the
2915 real sections. We may someday have to split the contents
2916 setting out of this function. */
2917 if (! bfd_set_section_contents (obfd, stabsec, syms, 0, symsize)
2918 || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
2919 stringsize))
2921 bfd_nonfatal_message (NULL, obfd, NULL,
2922 _("can't set debugging section contents"));
2923 return FALSE;
2926 return TRUE;
2929 bfd_nonfatal_message (NULL, obfd, NULL,
2930 _("don't know how to write debugging information for %s"),
2931 bfd_get_target (obfd));
2932 return FALSE;
2935 static int
2936 strip_main (int argc, char *argv[])
2938 char *input_target = NULL;
2939 char *output_target = NULL;
2940 bfd_boolean show_version = FALSE;
2941 bfd_boolean formats_info = FALSE;
2942 int c;
2943 int i;
2944 struct section_list *p;
2945 char *output_file = NULL;
2947 while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
2948 strip_options, (int *) 0)) != EOF)
2950 switch (c)
2952 case 'I':
2953 input_target = optarg;
2954 break;
2955 case 'O':
2956 output_target = optarg;
2957 break;
2958 case 'F':
2959 input_target = output_target = optarg;
2960 break;
2961 case 'R':
2962 p = find_section_list (optarg, TRUE);
2963 p->remove = TRUE;
2964 sections_removed = TRUE;
2965 break;
2966 case 's':
2967 strip_symbols = STRIP_ALL;
2968 break;
2969 case 'S':
2970 case 'g':
2971 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
2972 strip_symbols = STRIP_DEBUG;
2973 break;
2974 case OPTION_STRIP_UNNEEDED:
2975 strip_symbols = STRIP_UNNEEDED;
2976 break;
2977 case 'K':
2978 add_specific_symbol (optarg, keep_specific_htab);
2979 break;
2980 case 'N':
2981 add_specific_symbol (optarg, strip_specific_htab);
2982 break;
2983 case 'o':
2984 output_file = optarg;
2985 break;
2986 case 'p':
2987 preserve_dates = TRUE;
2988 break;
2989 case 'x':
2990 discard_locals = LOCALS_ALL;
2991 break;
2992 case 'X':
2993 discard_locals = LOCALS_START_L;
2994 break;
2995 case 'v':
2996 verbose = TRUE;
2997 break;
2998 case 'V':
2999 show_version = TRUE;
3000 break;
3001 case OPTION_FORMATS_INFO:
3002 formats_info = TRUE;
3003 break;
3004 case OPTION_ONLY_KEEP_DEBUG:
3005 strip_symbols = STRIP_NONDEBUG;
3006 break;
3007 case OPTION_KEEP_FILE_SYMBOLS:
3008 keep_file_symbols = 1;
3009 break;
3010 case 0:
3011 /* We've been given a long option. */
3012 break;
3013 case 'w':
3014 wildcard = TRUE;
3015 break;
3016 case 'H':
3017 case 'h':
3018 strip_usage (stdout, 0);
3019 default:
3020 strip_usage (stderr, 1);
3024 if (formats_info)
3026 display_info ();
3027 return 0;
3030 if (show_version)
3031 print_version ("strip");
3033 /* Default is to strip all symbols. */
3034 if (strip_symbols == STRIP_UNDEF
3035 && discard_locals == LOCALS_UNDEF
3036 && htab_elements (strip_specific_htab) == 0)
3037 strip_symbols = STRIP_ALL;
3039 if (output_target == NULL)
3040 output_target = input_target;
3042 i = optind;
3043 if (i == argc
3044 || (output_file != NULL && (i + 1) < argc))
3045 strip_usage (stderr, 1);
3047 for (; i < argc; i++)
3049 int hold_status = status;
3050 struct stat statbuf;
3051 char *tmpname;
3053 if (get_file_size (argv[i]) < 1)
3055 status = 1;
3056 continue;
3059 if (preserve_dates)
3060 /* No need to check the return value of stat().
3061 It has already been checked in get_file_size(). */
3062 stat (argv[i], &statbuf);
3064 if (output_file == NULL
3065 || filename_cmp (argv[i], output_file) == 0)
3066 tmpname = make_tempname (argv[i]);
3067 else
3068 tmpname = output_file;
3070 if (tmpname == NULL)
3072 bfd_nonfatal_message (argv[i], NULL, NULL,
3073 _("could not create temporary file to hold stripped copy"));
3074 status = 1;
3075 continue;
3078 status = 0;
3079 copy_file (argv[i], tmpname, input_target, output_target, NULL);
3080 if (status == 0)
3082 if (preserve_dates)
3083 set_times (tmpname, &statbuf);
3084 if (output_file != tmpname)
3085 status = (smart_rename (tmpname,
3086 output_file ? output_file : argv[i],
3087 preserve_dates) != 0);
3088 if (status == 0)
3089 status = hold_status;
3091 else
3092 unlink_if_ordinary (tmpname);
3093 if (output_file != tmpname)
3094 free (tmpname);
3097 return status;
3100 /* Set up PE subsystem. */
3102 static void
3103 set_pe_subsystem (const char *s)
3105 const char *version, *subsystem;
3106 size_t i;
3107 static const struct
3109 const char *name;
3110 const char set_def;
3111 const short value;
3113 v[] =
3115 { "native", 0, IMAGE_SUBSYSTEM_NATIVE },
3116 { "windows", 0, IMAGE_SUBSYSTEM_WINDOWS_GUI },
3117 { "console", 0, IMAGE_SUBSYSTEM_WINDOWS_CUI },
3118 { "posix", 0, IMAGE_SUBSYSTEM_POSIX_CUI },
3119 { "wince", 0, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI },
3120 { "efi-app", 1, IMAGE_SUBSYSTEM_EFI_APPLICATION },
3121 { "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER },
3122 { "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER },
3123 { "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER },
3124 { "xbox", 0, IMAGE_SUBSYSTEM_XBOX }
3126 short value;
3127 char *copy;
3128 int set_def = -1;
3130 /* Check for the presence of a version number. */
3131 version = strchr (s, ':');
3132 if (version == NULL)
3133 subsystem = s;
3134 else
3136 int len = version - s;
3137 copy = xstrdup (s);
3138 subsystem = copy;
3139 copy[len] = '\0';
3140 version = copy + 1 + len;
3141 pe_major_subsystem_version = strtoul (version, &copy, 0);
3142 if (*copy == '.')
3143 pe_minor_subsystem_version = strtoul (copy + 1, &copy, 0);
3144 if (*copy != '\0')
3145 non_fatal (_("%s: bad version in PE subsystem"), s);
3148 /* Check for numeric subsystem. */
3149 value = (short) strtol (subsystem, &copy, 0);
3150 if (*copy == '\0')
3152 for (i = 0; i < ARRAY_SIZE (v); i++)
3153 if (v[i].value == value)
3155 pe_subsystem = value;
3156 set_def = v[i].set_def;
3157 break;
3160 else
3162 /* Search for subsystem by name. */
3163 for (i = 0; i < ARRAY_SIZE (v); i++)
3164 if (strcmp (subsystem, v[i].name) == 0)
3166 pe_subsystem = v[i].value;
3167 set_def = v[i].set_def;
3168 break;
3172 switch (set_def)
3174 case -1:
3175 fatal (_("unknown PE subsystem: %s"), s);
3176 break;
3177 case 0:
3178 break;
3179 default:
3180 if (pe_file_alignment == (bfd_vma) -1)
3181 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
3182 if (pe_section_alignment == (bfd_vma) -1)
3183 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
3184 break;
3186 if (s != subsystem)
3187 free ((char *) subsystem);
3190 /* Convert EFI target to PEI target. */
3192 static void
3193 convert_efi_target (char *efi)
3195 efi[0] = 'p';
3196 efi[1] = 'e';
3197 efi[2] = 'i';
3199 if (strcmp (efi + 4, "ia32") == 0)
3201 /* Change ia32 to i386. */
3202 efi[5]= '3';
3203 efi[6]= '8';
3204 efi[7]= '6';
3206 else if (strcmp (efi + 4, "x86_64") == 0)
3208 /* Change x86_64 to x86-64. */
3209 efi[7] = '-';
3213 static int
3214 copy_main (int argc, char *argv[])
3216 char *input_filename = NULL;
3217 char *output_filename = NULL;
3218 char *tmpname;
3219 char *input_target = NULL;
3220 char *output_target = NULL;
3221 bfd_boolean show_version = FALSE;
3222 bfd_boolean change_warn = TRUE;
3223 bfd_boolean formats_info = FALSE;
3224 int c;
3225 struct section_list *p;
3226 struct stat statbuf;
3227 const bfd_arch_info_type *input_arch = NULL;
3229 while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
3230 copy_options, (int *) 0)) != EOF)
3232 switch (c)
3234 case 'b':
3235 copy_byte = atoi (optarg);
3236 if (copy_byte < 0)
3237 fatal (_("byte number must be non-negative"));
3238 break;
3240 case 'B':
3241 input_arch = bfd_scan_arch (optarg);
3242 if (input_arch == NULL)
3243 fatal (_("architecture %s unknown"), optarg);
3244 break;
3246 case 'i':
3247 if (optarg)
3249 interleave = atoi (optarg);
3250 if (interleave < 1)
3251 fatal (_("interleave must be positive"));
3253 else
3254 interleave = 4;
3255 break;
3257 case OPTION_INTERLEAVE_WIDTH:
3258 copy_width = atoi (optarg);
3259 if (copy_width < 1)
3260 fatal(_("interleave width must be positive"));
3261 break;
3263 case 'I':
3264 case 's': /* "source" - 'I' is preferred */
3265 input_target = optarg;
3266 break;
3268 case 'O':
3269 case 'd': /* "destination" - 'O' is preferred */
3270 output_target = optarg;
3271 break;
3273 case 'F':
3274 input_target = output_target = optarg;
3275 break;
3277 case 'j':
3278 p = find_section_list (optarg, TRUE);
3279 if (p->remove)
3280 fatal (_("%s both copied and removed"), optarg);
3281 p->copy = TRUE;
3282 sections_copied = TRUE;
3283 break;
3285 case 'R':
3286 p = find_section_list (optarg, TRUE);
3287 if (p->copy)
3288 fatal (_("%s both copied and removed"), optarg);
3289 p->remove = TRUE;
3290 sections_removed = TRUE;
3291 break;
3293 case 'S':
3294 strip_symbols = STRIP_ALL;
3295 break;
3297 case 'g':
3298 strip_symbols = STRIP_DEBUG;
3299 break;
3301 case OPTION_STRIP_UNNEEDED:
3302 strip_symbols = STRIP_UNNEEDED;
3303 break;
3305 case OPTION_ONLY_KEEP_DEBUG:
3306 strip_symbols = STRIP_NONDEBUG;
3307 break;
3309 case OPTION_KEEP_FILE_SYMBOLS:
3310 keep_file_symbols = 1;
3311 break;
3313 case OPTION_ADD_GNU_DEBUGLINK:
3314 gnu_debuglink_filename = optarg;
3315 break;
3317 case 'K':
3318 add_specific_symbol (optarg, keep_specific_htab);
3319 break;
3321 case 'N':
3322 add_specific_symbol (optarg, strip_specific_htab);
3323 break;
3325 case OPTION_STRIP_UNNEEDED_SYMBOL:
3326 add_specific_symbol (optarg, strip_unneeded_htab);
3327 break;
3329 case 'L':
3330 add_specific_symbol (optarg, localize_specific_htab);
3331 break;
3333 case OPTION_GLOBALIZE_SYMBOL:
3334 add_specific_symbol (optarg, globalize_specific_htab);
3335 break;
3337 case 'G':
3338 add_specific_symbol (optarg, keepglobal_specific_htab);
3339 break;
3341 case 'W':
3342 add_specific_symbol (optarg, weaken_specific_htab);
3343 break;
3345 case 'p':
3346 preserve_dates = TRUE;
3347 break;
3349 case 'w':
3350 wildcard = TRUE;
3351 break;
3353 case 'x':
3354 discard_locals = LOCALS_ALL;
3355 break;
3357 case 'X':
3358 discard_locals = LOCALS_START_L;
3359 break;
3361 case 'v':
3362 verbose = TRUE;
3363 break;
3365 case 'V':
3366 show_version = TRUE;
3367 break;
3369 case OPTION_FORMATS_INFO:
3370 formats_info = TRUE;
3371 break;
3373 case OPTION_WEAKEN:
3374 weaken = TRUE;
3375 break;
3377 case OPTION_ADD_SECTION:
3379 const char *s;
3380 size_t off, alloc;
3381 struct section_add *pa;
3382 FILE *f;
3384 s = strchr (optarg, '=');
3386 if (s == NULL)
3387 fatal (_("bad format for %s"), "--add-section");
3389 pa = (struct section_add *) xmalloc (sizeof (struct section_add));
3390 pa->name = xstrndup (optarg, s - optarg);
3391 pa->filename = s + 1;
3393 /* We don't use get_file_size so that we can do
3394 --add-section .note.GNU_stack=/dev/null
3395 get_file_size doesn't work on /dev/null. */
3397 f = fopen (pa->filename, FOPEN_RB);
3398 if (f == NULL)
3399 fatal (_("cannot open: %s: %s"),
3400 pa->filename, strerror (errno));
3402 off = 0;
3403 alloc = 4096;
3404 pa->contents = (bfd_byte *) xmalloc (alloc);
3405 while (!feof (f))
3407 off_t got;
3409 if (off == alloc)
3411 alloc <<= 1;
3412 pa->contents = (bfd_byte *) xrealloc (pa->contents, alloc);
3415 got = fread (pa->contents + off, 1, alloc - off, f);
3416 if (ferror (f))
3417 fatal (_("%s: fread failed"), pa->filename);
3419 off += got;
3422 pa->size = off;
3424 fclose (f);
3426 pa->next = add_sections;
3427 add_sections = pa;
3429 break;
3431 case OPTION_CHANGE_START:
3432 change_start = parse_vma (optarg, "--change-start");
3433 break;
3435 case OPTION_CHANGE_SECTION_ADDRESS:
3436 case OPTION_CHANGE_SECTION_LMA:
3437 case OPTION_CHANGE_SECTION_VMA:
3439 const char *s;
3440 int len;
3441 char *name;
3442 char *option = NULL;
3443 bfd_vma val;
3444 enum change_action what = CHANGE_IGNORE;
3446 switch (c)
3448 case OPTION_CHANGE_SECTION_ADDRESS:
3449 option = "--change-section-address";
3450 break;
3451 case OPTION_CHANGE_SECTION_LMA:
3452 option = "--change-section-lma";
3453 break;
3454 case OPTION_CHANGE_SECTION_VMA:
3455 option = "--change-section-vma";
3456 break;
3459 s = strchr (optarg, '=');
3460 if (s == NULL)
3462 s = strchr (optarg, '+');
3463 if (s == NULL)
3465 s = strchr (optarg, '-');
3466 if (s == NULL)
3467 fatal (_("bad format for %s"), option);
3471 len = s - optarg;
3472 name = (char *) xmalloc (len + 1);
3473 strncpy (name, optarg, len);
3474 name[len] = '\0';
3476 p = find_section_list (name, TRUE);
3478 val = parse_vma (s + 1, option);
3480 switch (*s)
3482 case '=': what = CHANGE_SET; break;
3483 case '-': val = - val; /* Drop through. */
3484 case '+': what = CHANGE_MODIFY; break;
3487 switch (c)
3489 case OPTION_CHANGE_SECTION_ADDRESS:
3490 p->change_vma = what;
3491 p->vma_val = val;
3492 /* Drop through. */
3494 case OPTION_CHANGE_SECTION_LMA:
3495 p->change_lma = what;
3496 p->lma_val = val;
3497 break;
3499 case OPTION_CHANGE_SECTION_VMA:
3500 p->change_vma = what;
3501 p->vma_val = val;
3502 break;
3505 break;
3507 case OPTION_CHANGE_ADDRESSES:
3508 change_section_address = parse_vma (optarg, "--change-addresses");
3509 change_start = change_section_address;
3510 break;
3512 case OPTION_CHANGE_WARNINGS:
3513 change_warn = TRUE;
3514 break;
3516 case OPTION_CHANGE_LEADING_CHAR:
3517 change_leading_char = TRUE;
3518 break;
3520 case OPTION_COMPRESS_DEBUG_SECTIONS:
3521 do_debug_sections = compress;
3522 break;
3524 case OPTION_DEBUGGING:
3525 convert_debugging = TRUE;
3526 break;
3528 case OPTION_DECOMPRESS_DEBUG_SECTIONS:
3529 do_debug_sections = decompress;
3530 break;
3532 case OPTION_GAP_FILL:
3534 bfd_vma gap_fill_vma;
3536 gap_fill_vma = parse_vma (optarg, "--gap-fill");
3537 gap_fill = (bfd_byte) gap_fill_vma;
3538 if ((bfd_vma) gap_fill != gap_fill_vma)
3540 char buff[20];
3542 sprintf_vma (buff, gap_fill_vma);
3544 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
3545 buff, gap_fill);
3547 gap_fill_set = TRUE;
3549 break;
3551 case OPTION_NO_CHANGE_WARNINGS:
3552 change_warn = FALSE;
3553 break;
3555 case OPTION_PAD_TO:
3556 pad_to = parse_vma (optarg, "--pad-to");
3557 pad_to_set = TRUE;
3558 break;
3560 case OPTION_REMOVE_LEADING_CHAR:
3561 remove_leading_char = TRUE;
3562 break;
3564 case OPTION_REDEFINE_SYM:
3566 /* Push this redefinition onto redefine_symbol_list. */
3568 int len;
3569 const char *s;
3570 const char *nextarg;
3571 char *source, *target;
3573 s = strchr (optarg, '=');
3574 if (s == NULL)
3575 fatal (_("bad format for %s"), "--redefine-sym");
3577 len = s - optarg;
3578 source = (char *) xmalloc (len + 1);
3579 strncpy (source, optarg, len);
3580 source[len] = '\0';
3582 nextarg = s + 1;
3583 len = strlen (nextarg);
3584 target = (char *) xmalloc (len + 1);
3585 strcpy (target, nextarg);
3587 redefine_list_append ("--redefine-sym", source, target);
3589 free (source);
3590 free (target);
3592 break;
3594 case OPTION_REDEFINE_SYMS:
3595 add_redefine_syms_file (optarg);
3596 break;
3598 case OPTION_SET_SECTION_FLAGS:
3600 const char *s;
3601 int len;
3602 char *name;
3604 s = strchr (optarg, '=');
3605 if (s == NULL)
3606 fatal (_("bad format for %s"), "--set-section-flags");
3608 len = s - optarg;
3609 name = (char *) xmalloc (len + 1);
3610 strncpy (name, optarg, len);
3611 name[len] = '\0';
3613 p = find_section_list (name, TRUE);
3615 p->set_flags = TRUE;
3616 p->flags = parse_flags (s + 1);
3618 break;
3620 case OPTION_RENAME_SECTION:
3622 flagword flags;
3623 const char *eq, *fl;
3624 char *old_name;
3625 char *new_name;
3626 unsigned int len;
3628 eq = strchr (optarg, '=');
3629 if (eq == NULL)
3630 fatal (_("bad format for %s"), "--rename-section");
3632 len = eq - optarg;
3633 if (len == 0)
3634 fatal (_("bad format for %s"), "--rename-section");
3636 old_name = (char *) xmalloc (len + 1);
3637 strncpy (old_name, optarg, len);
3638 old_name[len] = 0;
3640 eq++;
3641 fl = strchr (eq, ',');
3642 if (fl)
3644 flags = parse_flags (fl + 1);
3645 len = fl - eq;
3647 else
3649 flags = -1;
3650 len = strlen (eq);
3653 if (len == 0)
3654 fatal (_("bad format for %s"), "--rename-section");
3656 new_name = (char *) xmalloc (len + 1);
3657 strncpy (new_name, eq, len);
3658 new_name[len] = 0;
3660 add_section_rename (old_name, new_name, flags);
3662 break;
3664 case OPTION_SET_START:
3665 set_start = parse_vma (optarg, "--set-start");
3666 set_start_set = TRUE;
3667 break;
3669 case OPTION_SREC_LEN:
3670 Chunk = parse_vma (optarg, "--srec-len");
3671 break;
3673 case OPTION_SREC_FORCES3:
3674 S3Forced = TRUE;
3675 break;
3677 case OPTION_STRIP_SYMBOLS:
3678 add_specific_symbols (optarg, strip_specific_htab);
3679 break;
3681 case OPTION_STRIP_UNNEEDED_SYMBOLS:
3682 add_specific_symbols (optarg, strip_unneeded_htab);
3683 break;
3685 case OPTION_KEEP_SYMBOLS:
3686 add_specific_symbols (optarg, keep_specific_htab);
3687 break;
3689 case OPTION_LOCALIZE_HIDDEN:
3690 localize_hidden = TRUE;
3691 break;
3693 case OPTION_LOCALIZE_SYMBOLS:
3694 add_specific_symbols (optarg, localize_specific_htab);
3695 break;
3697 case OPTION_LONG_SECTION_NAMES:
3698 if (!strcmp ("enable", optarg))
3699 long_section_names = ENABLE;
3700 else if (!strcmp ("disable", optarg))
3701 long_section_names = DISABLE;
3702 else if (!strcmp ("keep", optarg))
3703 long_section_names = KEEP;
3704 else
3705 fatal (_("unknown long section names option '%s'"), optarg);
3706 break;
3708 case OPTION_GLOBALIZE_SYMBOLS:
3709 add_specific_symbols (optarg, globalize_specific_htab);
3710 break;
3712 case OPTION_KEEPGLOBAL_SYMBOLS:
3713 add_specific_symbols (optarg, keepglobal_specific_htab);
3714 break;
3716 case OPTION_WEAKEN_SYMBOLS:
3717 add_specific_symbols (optarg, weaken_specific_htab);
3718 break;
3720 case OPTION_ALT_MACH_CODE:
3721 use_alt_mach_code = strtoul (optarg, NULL, 0);
3722 if (use_alt_mach_code == 0)
3723 fatal (_("unable to parse alternative machine code"));
3724 break;
3726 case OPTION_PREFIX_SYMBOLS:
3727 prefix_symbols_string = optarg;
3728 break;
3730 case OPTION_PREFIX_SECTIONS:
3731 prefix_sections_string = optarg;
3732 break;
3734 case OPTION_PREFIX_ALLOC_SECTIONS:
3735 prefix_alloc_sections_string = optarg;
3736 break;
3738 case OPTION_READONLY_TEXT:
3739 bfd_flags_to_set |= WP_TEXT;
3740 bfd_flags_to_clear &= ~WP_TEXT;
3741 break;
3743 case OPTION_WRITABLE_TEXT:
3744 bfd_flags_to_clear |= WP_TEXT;
3745 bfd_flags_to_set &= ~WP_TEXT;
3746 break;
3748 case OPTION_PURE:
3749 bfd_flags_to_set |= D_PAGED;
3750 bfd_flags_to_clear &= ~D_PAGED;
3751 break;
3753 case OPTION_IMPURE:
3754 bfd_flags_to_clear |= D_PAGED;
3755 bfd_flags_to_set &= ~D_PAGED;
3756 break;
3758 case OPTION_EXTRACT_SYMBOL:
3759 extract_symbol = TRUE;
3760 break;
3762 case OPTION_REVERSE_BYTES:
3764 int prev = reverse_bytes;
3766 reverse_bytes = atoi (optarg);
3767 if ((reverse_bytes <= 0) || ((reverse_bytes % 2) != 0))
3768 fatal (_("number of bytes to reverse must be positive and even"));
3770 if (prev && prev != reverse_bytes)
3771 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
3772 prev);
3773 break;
3776 case OPTION_FILE_ALIGNMENT:
3777 pe_file_alignment = parse_vma (optarg, "--file-alignment");
3778 break;
3780 case OPTION_HEAP:
3782 char *end;
3783 pe_heap_reserve = strtoul (optarg, &end, 0);
3784 if (end == optarg
3785 || (*end != '.' && *end != '\0'))
3786 non_fatal (_("%s: invalid reserve value for --heap"),
3787 optarg);
3788 else if (*end != '\0')
3790 pe_heap_commit = strtoul (end + 1, &end, 0);
3791 if (*end != '\0')
3792 non_fatal (_("%s: invalid commit value for --heap"),
3793 optarg);
3796 break;
3798 case OPTION_IMAGE_BASE:
3799 pe_image_base = parse_vma (optarg, "--image-base");
3800 break;
3802 case OPTION_SECTION_ALIGNMENT:
3803 pe_section_alignment = parse_vma (optarg,
3804 "--section-alignment");
3805 break;
3807 case OPTION_SUBSYSTEM:
3808 set_pe_subsystem (optarg);
3809 break;
3811 case OPTION_STACK:
3813 char *end;
3814 pe_stack_reserve = strtoul (optarg, &end, 0);
3815 if (end == optarg
3816 || (*end != '.' && *end != '\0'))
3817 non_fatal (_("%s: invalid reserve value for --stack"),
3818 optarg);
3819 else if (*end != '\0')
3821 pe_stack_commit = strtoul (end + 1, &end, 0);
3822 if (*end != '\0')
3823 non_fatal (_("%s: invalid commit value for --stack"),
3824 optarg);
3827 break;
3829 case 0:
3830 /* We've been given a long option. */
3831 break;
3833 case 'H':
3834 case 'h':
3835 copy_usage (stdout, 0);
3837 default:
3838 copy_usage (stderr, 1);
3842 if (formats_info)
3844 display_info ();
3845 return 0;
3848 if (show_version)
3849 print_version ("objcopy");
3851 if (interleave && copy_byte == -1)
3852 fatal (_("interleave start byte must be set with --byte"));
3854 if (copy_byte >= interleave)
3855 fatal (_("byte number must be less than interleave"));
3857 if (copy_width > interleave - copy_byte)
3858 fatal (_("interleave width must be less than or equal to interleave - byte`"));
3860 if (optind == argc || optind + 2 < argc)
3861 copy_usage (stderr, 1);
3863 input_filename = argv[optind];
3864 if (optind + 1 < argc)
3865 output_filename = argv[optind + 1];
3867 /* Default is to strip no symbols. */
3868 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
3869 strip_symbols = STRIP_NONE;
3871 if (output_target == NULL)
3872 output_target = input_target;
3874 /* Convert input EFI target to PEI target. */
3875 if (input_target != NULL
3876 && strncmp (input_target, "efi-", 4) == 0)
3878 char *efi;
3880 efi = xstrdup (output_target + 4);
3881 if (strncmp (efi, "bsdrv-", 6) == 0
3882 || strncmp (efi, "rtdrv-", 6) == 0)
3883 efi += 2;
3884 else if (strncmp (efi, "app-", 4) != 0)
3885 fatal (_("unknown input EFI target: %s"), input_target);
3887 input_target = efi;
3888 convert_efi_target (efi);
3891 /* Convert output EFI target to PEI target. */
3892 if (output_target != NULL
3893 && strncmp (output_target, "efi-", 4) == 0)
3895 char *efi;
3897 efi = xstrdup (output_target + 4);
3898 if (strncmp (efi, "app-", 4) == 0)
3900 if (pe_subsystem == -1)
3901 pe_subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
3903 else if (strncmp (efi, "bsdrv-", 6) == 0)
3905 if (pe_subsystem == -1)
3906 pe_subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;
3907 efi += 2;
3909 else if (strncmp (efi, "rtdrv-", 6) == 0)
3911 if (pe_subsystem == -1)
3912 pe_subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;
3913 efi += 2;
3915 else
3916 fatal (_("unknown output EFI target: %s"), output_target);
3918 if (pe_file_alignment == (bfd_vma) -1)
3919 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
3920 if (pe_section_alignment == (bfd_vma) -1)
3921 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
3923 output_target = efi;
3924 convert_efi_target (efi);
3927 if (preserve_dates)
3928 if (stat (input_filename, & statbuf) < 0)
3929 fatal (_("warning: could not locate '%s'. System error message: %s"),
3930 input_filename, strerror (errno));
3932 /* If there is no destination file, or the source and destination files
3933 are the same, then create a temp and rename the result into the input. */
3934 if (output_filename == NULL
3935 || filename_cmp (input_filename, output_filename) == 0)
3936 tmpname = make_tempname (input_filename);
3937 else
3938 tmpname = output_filename;
3940 if (tmpname == NULL)
3941 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
3942 input_filename, strerror (errno));
3944 copy_file (input_filename, tmpname, input_target, output_target, input_arch);
3945 if (status == 0)
3947 if (preserve_dates)
3948 set_times (tmpname, &statbuf);
3949 if (tmpname != output_filename)
3950 status = (smart_rename (tmpname, input_filename,
3951 preserve_dates) != 0);
3953 else
3954 unlink_if_ordinary (tmpname);
3956 if (change_warn)
3958 for (p = change_sections; p != NULL; p = p->next)
3960 if (! p->used)
3962 if (p->change_vma != CHANGE_IGNORE)
3964 char buff [20];
3966 sprintf_vma (buff, p->vma_val);
3968 /* xgettext:c-format */
3969 non_fatal (_("%s %s%c0x%s never used"),
3970 "--change-section-vma",
3971 p->name,
3972 p->change_vma == CHANGE_SET ? '=' : '+',
3973 buff);
3976 if (p->change_lma != CHANGE_IGNORE)
3978 char buff [20];
3980 sprintf_vma (buff, p->lma_val);
3982 /* xgettext:c-format */
3983 non_fatal (_("%s %s%c0x%s never used"),
3984 "--change-section-lma",
3985 p->name,
3986 p->change_lma == CHANGE_SET ? '=' : '+',
3987 buff);
3993 return 0;
3997 main (int argc, char *argv[])
3999 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
4000 setlocale (LC_MESSAGES, "");
4001 #endif
4002 #if defined (HAVE_SETLOCALE)
4003 setlocale (LC_CTYPE, "");
4004 #endif
4005 bindtextdomain (PACKAGE, LOCALEDIR);
4006 textdomain (PACKAGE);
4008 program_name = argv[0];
4009 xmalloc_set_program_name (program_name);
4011 START_PROGRESS (program_name, 0);
4013 expandargv (&argc, &argv);
4015 strip_symbols = STRIP_UNDEF;
4016 discard_locals = LOCALS_UNDEF;
4018 bfd_init ();
4019 set_default_bfd_target ();
4021 if (is_strip < 0)
4023 int i = strlen (program_name);
4024 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4025 /* Drop the .exe suffix, if any. */
4026 if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
4028 i -= 4;
4029 program_name[i] = '\0';
4031 #endif
4032 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
4035 create_symbol_htabs ();
4037 if (is_strip)
4038 strip_main (argc, argv);
4039 else
4040 copy_main (argc, argv);
4042 END_PROGRESS (program_name);
4044 return status;