Remove the group section if all members are removed.
[deliverable/binutils-gdb.git] / binutils / objcopy.c
1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4 Free Software Foundation, Inc.
5
6 This file is part of GNU Binutils.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
22 \f
23 #include "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"
37
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"
42
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;
53
54 struct is_specified_symbol_predicate_data
55 {
56 const char *name;
57 bfd_boolean found;
58 };
59
60 /* A list to support redefine_sym. */
61 struct redefine_node
62 {
63 char *source;
64 char *target;
65 struct redefine_node *next;
66 };
67
68 typedef struct section_rename
69 {
70 const char * old_name;
71 const char * new_name;
72 flagword flags;
73 struct section_rename * next;
74 }
75 section_rename;
76
77 /* List of sections to be renamed. */
78 static section_rename *section_rename_list;
79
80 static asymbol **isympp = NULL; /* Input symbols. */
81 static asymbol **osympp = NULL; /* Output symbols that survive stripping. */
82
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;
87
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. */
91
92 enum strip_action
93 {
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. */
100 };
101
102 /* Which symbols to remove. */
103 static enum strip_action strip_symbols;
104
105 enum locals_action
106 {
107 LOCALS_UNDEF,
108 LOCALS_START_L, /* Discard locals starting with L. */
109 LOCALS_ALL /* Discard all locals. */
110 };
111
112 /* Which local symbols to remove. Overrides STRIP_ALL. */
113 static enum locals_action discard_locals;
114
115 /* What kind of change to perform. */
116 enum change_action
117 {
118 CHANGE_IGNORE,
119 CHANGE_MODIFY,
120 CHANGE_SET
121 };
122
123 /* Structure used to hold lists of sections and actions to take. */
124 struct section_list
125 {
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. */
137 };
138
139 static struct section_list *change_sections;
140
141 /* TRUE if some sections are to be removed. */
142 static bfd_boolean sections_removed;
143
144 /* TRUE if only some sections are to be copied. */
145 static bfd_boolean sections_copied;
146
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;
151
152 /* Changes to section addresses. */
153 static bfd_vma change_section_address = 0;
154
155 /* Filling gaps between sections. */
156 static bfd_boolean gap_fill_set = FALSE;
157 static bfd_byte gap_fill = 0;
158
159 /* Pad to a given address. */
160 static bfd_boolean pad_to_set = FALSE;
161 static bfd_vma pad_to;
162
163 /* Use alternative machine code? */
164 static unsigned long use_alt_mach_code = 0;
165
166 /* Output BFD flags user wants to set or clear */
167 static flagword bfd_flags_to_set;
168 static flagword bfd_flags_to_clear;
169
170 /* List of sections to add. */
171 struct section_add
172 {
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;
185 };
186
187 /* List of sections to add to the output BFD. */
188 static struct section_add *add_sections;
189
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;
193
194 /* Whether to convert debugging information. */
195 static bfd_boolean convert_debugging = FALSE;
196
197 /* Whether to compress/decompress DWARF debug sections. */
198 static enum
199 {
200 nothing,
201 compress,
202 decompress
203 } do_debug_sections = nothing;
204
205 /* Whether to change the leading character in symbol names. */
206 static bfd_boolean change_leading_char = FALSE;
207
208 /* Whether to remove the leading character from global symbol names. */
209 static bfd_boolean remove_leading_char = FALSE;
210
211 /* Whether to permit wildcard in symbol comparison. */
212 static bfd_boolean wildcard = FALSE;
213
214 /* True if --localize-hidden is in effect. */
215 static bfd_boolean localize_hidden = FALSE;
216
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;
227
228 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
229 static bfd_boolean weaken = FALSE;
230
231 /* If this is TRUE, we retain BSF_FILE symbols. */
232 static bfd_boolean keep_file_symbols = FALSE;
233
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;
238
239 /* True if --extract-symbol was passed on the command line. */
240 static bfd_boolean extract_symbol = FALSE;
241
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;
245
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
249 {
250 DISABLE,
251 ENABLE,
252 KEEP
253 };
254
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;
258
259 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
260 enum command_line_switch
261 {
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
318 };
319
320 /* Options to handle if running as "strip". */
321
322 static struct option strip_options[] =
323 {
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}
348 };
349
350 /* Options to handle if running as "objcopy". */
351
352 static struct option copy_options[] =
353 {
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}
441 };
442
443 /* IMPORTS */
444 extern char *program_name;
445
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;
450
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;
454
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;
459
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 *);
469 \f
470 static void
471 copy_usage (FILE *stream, int exit_status)
472 {
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);
578 }
579
580 static void
581 strip_usage (FILE *stream, int exit_status)
582 {
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 "));
608
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);
613 }
614
615 /* Parse section flags into a flagword, with a fatal error if the
616 string can't be parsed. */
617
618 static flagword
619 parse_flags (const char *s)
620 {
621 flagword ret;
622 const char *snext;
623 int len;
624
625 ret = SEC_NO_FLAGS;
626
627 do
628 {
629 snext = strchr (s, ',');
630 if (snext == NULL)
631 len = strlen (s);
632 else
633 {
634 len = snext - s;
635 ++snext;
636 }
637
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
653 {
654 char *copy;
655
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");
662 }
663
664 s = snext;
665 }
666 while (s != NULL);
667
668 return ret;
669 }
670
671 /* Find and optionally add an entry in the change_sections list. */
672
673 static struct section_list *
674 find_section_list (const char *name, bfd_boolean add)
675 {
676 struct section_list *p;
677
678 for (p = change_sections; p != NULL; p = p->next)
679 if (strcmp (p->name, name) == 0)
680 return p;
681
682 if (! add)
683 return NULL;
684
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;
696
697 p->next = change_sections;
698 change_sections = p;
699
700 return p;
701 }
702
703 /* There is htab_hash_string but no htab_eq_string. Makes sense. */
704
705 static int
706 eq_string (const void *s1, const void *s2)
707 {
708 return strcmp ((const char *) s1, (const char *) s2) == 0;
709 }
710
711 static htab_t
712 create_symbol_htab (void)
713 {
714 return htab_create_alloc (16, htab_hash_string, eq_string, NULL, xcalloc, free);
715 }
716
717 static void
718 create_symbol_htabs (void)
719 {
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 ();
727 }
728
729 /* Add a symbol to strip_specific_list. */
730
731 static void
732 add_specific_symbol (const char *name, htab_t htab)
733 {
734 *htab_find_slot (htab, name, INSERT) = (char *) name;
735 }
736
737 /* Add symbols listed in `filename' to strip_specific_list. */
738
739 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
740 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
741
742 static void
743 add_specific_symbols (const char *filename, htab_t htab)
744 {
745 off_t size;
746 FILE * f;
747 char * line;
748 char * buffer;
749 unsigned int line_count;
750
751 size = get_file_size (filename);
752 if (size == 0)
753 {
754 status = 1;
755 return;
756 }
757
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));
762
763 if (fread (buffer, 1, size, f) == 0 || ferror (f))
764 fatal (_("%s: fread failed"), filename);
765
766 fclose (f);
767 buffer [size] = '\n';
768 buffer [size + 1] = '\0';
769
770 line_count = 1;
771
772 for (line = buffer; * line != '\0'; line ++)
773 {
774 char * eol;
775 char * name;
776 char * name_end;
777 int finished = FALSE;
778
779 for (eol = line;; eol ++)
780 {
781 switch (* eol)
782 {
783 case '\n':
784 * eol = '\0';
785 /* Cope with \n\r. */
786 if (eol[1] == '\r')
787 ++ eol;
788 finished = TRUE;
789 break;
790
791 case '\r':
792 * eol = '\0';
793 /* Cope with \r\n. */
794 if (eol[1] == '\n')
795 ++ eol;
796 finished = TRUE;
797 break;
798
799 case 0:
800 finished = TRUE;
801 break;
802
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;
809
810 default:
811 break;
812 }
813
814 if (finished)
815 break;
816 }
817
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 ++)
822 ;
823 for (name_end = name;
824 (! IS_WHITESPACE (* name_end))
825 && (! IS_LINE_TERMINATOR (* name_end));
826 name_end ++)
827 ;
828
829 if (! IS_LINE_TERMINATOR (* name_end))
830 {
831 char * extra;
832
833 for (extra = name_end + 1; IS_WHITESPACE (* extra); extra ++)
834 ;
835
836 if (! IS_LINE_TERMINATOR (* extra))
837 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
838 filename, line_count);
839 }
840
841 * name_end = '\0';
842
843 if (name_end > name)
844 add_specific_symbol (name, htab);
845
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 ++;
850 }
851 }
852
853 /* See whether a symbol should be stripped or kept
854 based on strip_specific_list and keep_symbols. */
855
856 static int
857 is_specified_symbol_predicate (void **slot, void *data)
858 {
859 struct is_specified_symbol_predicate_data *d =
860 (struct is_specified_symbol_predicate_data *) data;
861 const char *slot_name = (char *) *slot;
862
863 if (*slot_name != '!')
864 {
865 if (! fnmatch (slot_name, d->name, 0))
866 {
867 d->found = TRUE;
868 /* Stop traversal. */
869 return 0;
870 }
871 }
872 else
873 {
874 if (fnmatch (slot_name + 1, d->name, 0))
875 {
876 d->found = TRUE;
877 /* Stop traversal. */
878 return 0;
879 }
880 }
881
882 /* Continue traversal. */
883 return 1;
884 }
885
886 static bfd_boolean
887 is_specified_symbol (const char *name, htab_t htab)
888 {
889 if (wildcard)
890 {
891 struct is_specified_symbol_predicate_data data;
892
893 data.name = name;
894 data.found = FALSE;
895
896 htab_traverse (htab, is_specified_symbol_predicate, &data);
897
898 return data.found;
899 }
900
901 return htab_find (htab, name) != NULL;
902 }
903
904 /* Return a pointer to the symbol used as a signature for GROUP. */
905
906 static asymbol *
907 group_signature (asection *group)
908 {
909 bfd *abfd = group->owner;
910 Elf_Internal_Shdr *ghdr;
911
912 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
913 return NULL;
914
915 ghdr = &elf_section_data (group)->this_hdr;
916 if (ghdr->sh_link < elf_numsections (abfd))
917 {
918 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
919 Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link];
920
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];
924 }
925 return NULL;
926 }
927
928 /* See if a non-group section is being removed. */
929
930 static bfd_boolean
931 is_strip_section_1 (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
932 {
933 if (sections_removed || sections_copied)
934 {
935 struct section_list *p;
936
937 p = find_section_list (bfd_get_section_name (abfd, sec), FALSE);
938
939 if (sections_removed && p != NULL && p->remove)
940 return TRUE;
941 if (sections_copied && (p == NULL || ! p->copy))
942 return TRUE;
943 }
944
945 if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
946 {
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;
953
954 if (strip_symbols == STRIP_NONDEBUG)
955 return FALSE;
956 }
957
958 return FALSE;
959 }
960
961 /* See if a section is being removed. */
962
963 static bfd_boolean
964 is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
965 {
966 if (is_strip_section_1 (abfd, sec))
967 return TRUE;
968
969 if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0)
970 {
971 asymbol *gsym;
972 const char *gname;
973 asection *elt, *first;
974
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;
987
988 /* Remove the group section if all members are removed. */
989 first = elt = elf_next_in_group (sec);
990 while (elt != NULL)
991 {
992 if (!is_strip_section_1 (abfd, elt))
993 return FALSE;
994 elt = elf_next_in_group (elt);
995 if (elt == first)
996 break;
997 }
998
999 return TRUE;
1000 }
1001
1002 return FALSE;
1003 }
1004
1005 /* Return true if SYM is a hidden symbol. */
1006
1007 static bfd_boolean
1008 is_hidden_symbol (asymbol *sym)
1009 {
1010 elf_symbol_type *elf_sym;
1011
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))
1015 {
1016 case STV_HIDDEN:
1017 case STV_INTERNAL:
1018 return TRUE;
1019 }
1020 return FALSE;
1021 }
1022
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. */
1026
1027 static unsigned int
1028 filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
1029 asymbol **isyms, long symcount)
1030 {
1031 asymbol **from = isyms, **to = osyms;
1032 long src_count = 0, dst_count = 0;
1033 int relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
1034
1035 for (; src_count < symcount; src_count++)
1036 {
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;
1045
1046 undefined = bfd_is_und_section (bfd_get_section (sym));
1047
1048 if (redefine_sym_list)
1049 {
1050 char *old_name, *new_name;
1051
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;
1056 }
1057
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)))));
1066
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)));
1073
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)
1076 {
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;
1081 }
1082
1083 /* Remove leading char. */
1084 if (rem_leading_char)
1085 bfd_asymbol_name (sym) = ++name;
1086
1087 /* Add new leading char and/or prefix. */
1088 if (add_leading_char || prefix_symbols_string)
1089 {
1090 char *n, *ptr;
1091
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);
1096
1097 if (prefix_symbols_string)
1098 {
1099 strcpy (ptr, prefix_symbols_string);
1100 ptr += strlen (prefix_symbols_string);
1101 }
1102
1103 strcpy (ptr, name);
1104 bfd_asymbol_name (sym) = n;
1105 name = n;
1106 }
1107
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))
1114 {
1115 keep = TRUE;
1116 used_in_reloc = TRUE;
1117 }
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))));
1146
1147 if (keep && is_specified_symbol (name, strip_specific_htab))
1148 {
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)
1152 {
1153 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name);
1154 status = 1;
1155 }
1156 else
1157 keep = FALSE;
1158 }
1159
1160 if (keep
1161 && !(flags & BSF_KEEP)
1162 && is_specified_symbol (name, strip_unneeded_htab))
1163 keep = FALSE;
1164
1165 if (!keep
1166 && ((keep_file_symbols && (flags & BSF_FILE))
1167 || is_specified_symbol (name, keep_specific_htab)))
1168 keep = TRUE;
1169
1170 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
1171 keep = FALSE;
1172
1173 if (keep)
1174 {
1175 if ((flags & BSF_GLOBAL) != 0
1176 && (weaken || is_specified_symbol (name, weaken_specific_htab)))
1177 {
1178 sym->flags &= ~ BSF_GLOBAL;
1179 sym->flags |= BSF_WEAK;
1180 }
1181
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))))
1188 {
1189 sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
1190 sym->flags |= BSF_LOCAL;
1191 }
1192
1193 if (!undefined
1194 && (flags & BSF_LOCAL)
1195 && is_specified_symbol (name, globalize_specific_htab))
1196 {
1197 sym->flags &= ~ BSF_LOCAL;
1198 sym->flags |= BSF_GLOBAL;
1199 }
1200
1201 to[dst_count++] = sym;
1202 }
1203 }
1204
1205 to[dst_count] = NULL;
1206
1207 return dst_count;
1208 }
1209
1210 /* Find the redefined name of symbol SOURCE. */
1211
1212 static const char *
1213 lookup_sym_redefinition (const char *source)
1214 {
1215 struct redefine_node *list;
1216
1217 for (list = redefine_sym_list; list != NULL; list = list->next)
1218 if (strcmp (source, list->source) == 0)
1219 return list->target;
1220
1221 return source;
1222 }
1223
1224 /* Add a node to a symbol redefine list. */
1225
1226 static void
1227 redefine_list_append (const char *cause, const char *source, const char *target)
1228 {
1229 struct redefine_node **p;
1230 struct redefine_node *list;
1231 struct redefine_node *new_node;
1232
1233 for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next)
1234 {
1235 if (strcmp (source, list->source) == 0)
1236 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1237 cause, source);
1238
1239 if (strcmp (target, list->target) == 0)
1240 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1241 cause, target);
1242 }
1243
1244 new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node));
1245
1246 new_node->source = strdup (source);
1247 new_node->target = strdup (target);
1248 new_node->next = NULL;
1249
1250 *p = new_node;
1251 }
1252
1253 /* Handle the --redefine-syms option. Read lines containing "old new"
1254 from the file, and add them to the symbol redefine list. */
1255
1256 static void
1257 add_redefine_syms_file (const char *filename)
1258 {
1259 FILE *file;
1260 char *buf;
1261 size_t bufsize;
1262 size_t len;
1263 size_t outsym_off;
1264 int c, lineno;
1265
1266 file = fopen (filename, "r");
1267 if (file == NULL)
1268 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1269 filename, strerror (errno));
1270
1271 bufsize = 100;
1272 buf = (char *) xmalloc (bufsize + 1 /* For the terminating NUL. */);
1273
1274 lineno = 1;
1275 c = getc (file);
1276 len = 0;
1277 outsym_off = 0;
1278 while (c != EOF)
1279 {
1280 /* Collect the input symbol name. */
1281 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1282 {
1283 if (c == '#')
1284 goto comment;
1285 buf[len++] = c;
1286 if (len >= bufsize)
1287 {
1288 bufsize *= 2;
1289 buf = (char *) xrealloc (buf, bufsize + 1);
1290 }
1291 c = getc (file);
1292 }
1293 buf[len++] = '\0';
1294 if (c == EOF)
1295 break;
1296
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;
1304
1305 /* Collect the output symbol name. */
1306 outsym_off = len;
1307 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1308 {
1309 if (c == '#')
1310 goto comment;
1311 buf[len++] = c;
1312 if (len >= bufsize)
1313 {
1314 bufsize *= 2;
1315 buf = (char *) xrealloc (buf, bufsize + 1);
1316 }
1317 c = getc (file);
1318 }
1319 buf[len++] = '\0';
1320 if (c == EOF)
1321 break;
1322
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)
1331 {
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]);
1336
1337 lineno++;
1338 len = 0;
1339 outsym_off = 0;
1340 if (c == EOF)
1341 break;
1342 c = getc (file);
1343 continue;
1344 }
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';
1351
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;
1356 }
1357
1358 if (len != 0)
1359 fatal (_("%s:%d: premature end of file"), filename, lineno);
1360
1361 free (buf);
1362 }
1363
1364 /* Copy unkown object file IBFD onto OBFD.
1365 Returns TRUE upon success, FALSE otherwise. */
1366
1367 static bfd_boolean
1368 copy_unknown_object (bfd *ibfd, bfd *obfd)
1369 {
1370 char *cbuf;
1371 int tocopy;
1372 long ncopied;
1373 long size;
1374 struct stat buf;
1375
1376 if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1377 {
1378 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1379 return FALSE;
1380 }
1381
1382 size = buf.st_size;
1383 if (size < 0)
1384 {
1385 non_fatal (_("stat returns negative size for `%s'"),
1386 bfd_get_archive_filename (ibfd));
1387 return FALSE;
1388 }
1389
1390 if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1391 {
1392 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1393 return FALSE;
1394 }
1395
1396 if (verbose)
1397 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1398 bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1399
1400 cbuf = (char *) xmalloc (BUFSIZE);
1401 ncopied = 0;
1402 while (ncopied < size)
1403 {
1404 tocopy = size - ncopied;
1405 if (tocopy > BUFSIZE)
1406 tocopy = BUFSIZE;
1407
1408 if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1409 != (bfd_size_type) tocopy)
1410 {
1411 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1412 free (cbuf);
1413 return FALSE;
1414 }
1415
1416 if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1417 != (bfd_size_type) tocopy)
1418 {
1419 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1420 free (cbuf);
1421 return FALSE;
1422 }
1423
1424 ncopied += tocopy;
1425 }
1426
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;
1432 }
1433
1434 /* Copy object file IBFD onto OBFD.
1435 Returns TRUE upon success, FALSE otherwise. */
1436
1437 static bfd_boolean
1438 copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
1439 {
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;
1450
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)"));
1455
1456 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1457 {
1458 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1459 return FALSE;
1460 }
1461
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));
1466
1467 if (extract_symbol)
1468 start = 0;
1469 else
1470 {
1471 if (set_start_set)
1472 start = set_start;
1473 else
1474 start = bfd_get_start_address (ibfd);
1475 start += change_start;
1476 }
1477
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)
1481 {
1482 flagword flags;
1483
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);
1488
1489 if (strip_symbols == STRIP_ALL)
1490 flags &= ~HAS_RELOC;
1491
1492 if (!bfd_set_start_address (obfd, start)
1493 || !bfd_set_file_flags (obfd, flags))
1494 {
1495 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1496 return FALSE;
1497 }
1498 }
1499
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)
1504 {
1505 if (bfd_get_arch_info (ibfd) == NULL
1506 || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown)
1507 {
1508 iarch = input_arch->arch;
1509 imach = input_arch->mach;
1510 }
1511 else
1512 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
1513 bfd_get_archive_filename (ibfd));
1514 }
1515 if (!bfd_set_arch_mach (obfd, iarch, imach)
1516 && (ibfd->target_defaulted
1517 || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
1518 {
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;
1527 }
1528
1529 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1530 {
1531 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1532 return FALSE;
1533 }
1534
1535 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
1536 && bfd_pei_p (obfd))
1537 {
1538 /* Set up PE parameters. */
1539 pe_data_type *pe = pe_data (obfd);
1540
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;
1545
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;
1550
1551 if (pe_heap_commit != (bfd_vma) -1)
1552 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_commit;
1553
1554 if (pe_heap_reserve != (bfd_vma) -1)
1555 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_reserve;
1556
1557 if (pe_image_base != (bfd_vma) -1)
1558 pe->pe_opthdr.ImageBase = pe_image_base;
1559
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;
1564
1565 if (pe_stack_commit != (bfd_vma) -1)
1566 pe->pe_opthdr.SizeOfStackCommit = pe_stack_commit;
1567
1568 if (pe_stack_reserve != (bfd_vma) -1)
1569 pe->pe_opthdr.SizeOfStackCommit = pe_stack_reserve;
1570
1571 if (pe_subsystem != -1)
1572 pe->pe_opthdr.Subsystem = pe_subsystem;
1573
1574 if (pe_major_subsystem_version != -1)
1575 pe->pe_opthdr.MajorSubsystemVersion = pe_major_subsystem_version;
1576
1577 if (pe_minor_subsystem_version != -1)
1578 pe->pe_opthdr.MinorSubsystemVersion = pe_minor_subsystem_version;
1579
1580 if (pe_file_alignment > pe_section_alignment)
1581 {
1582 char file_alignment[20], section_alignment[20];
1583
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)"),
1587
1588 file_alignment, section_alignment);
1589 }
1590 }
1591
1592 if (isympp)
1593 free (isympp);
1594
1595 if (osympp != isympp)
1596 free (osympp);
1597
1598 isympp = NULL;
1599 osympp = NULL;
1600
1601 symsize = bfd_get_symtab_upper_bound (ibfd);
1602 if (symsize < 0)
1603 {
1604 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1605 return FALSE;
1606 }
1607
1608 osympp = isympp = (asymbol **) xmalloc (symsize);
1609 symcount = bfd_canonicalize_symtab (ibfd, isympp);
1610 if (symcount < 0)
1611 {
1612 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1613 return FALSE;
1614 }
1615
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);
1619
1620 if (!extract_symbol)
1621 setup_bfd_headers (ibfd, obfd);
1622
1623 if (add_sections != NULL)
1624 {
1625 struct section_add *padd;
1626 struct section_list *pset;
1627
1628 for (padd = add_sections; padd != NULL; padd = padd->next)
1629 {
1630 flagword flags;
1631
1632 pset = find_section_list (padd->name, FALSE);
1633 if (pset != NULL)
1634 pset->used = TRUE;
1635
1636 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
1637 if (pset != NULL && pset->set_flags)
1638 flags = pset->flags | SEC_HAS_CONTENTS;
1639
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))
1643 {
1644 bfd_nonfatal_message (NULL, obfd, NULL,
1645 _("can't add section '%s'"), padd->name);
1646 return FALSE;
1647 }
1648 else
1649 {
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)
1657 {
1658 bfd_nonfatal_message (NULL, obfd, NULL,
1659 _("can't create section `%s'"),
1660 padd->name);
1661 return FALSE;
1662 }
1663 }
1664
1665 if (! bfd_set_section_size (obfd, padd->section, padd->size))
1666 {
1667 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1668 return FALSE;
1669 }
1670
1671 if (pset != NULL)
1672 {
1673 if (pset->change_vma != CHANGE_IGNORE)
1674 if (! bfd_set_section_vma (obfd, padd->section,
1675 pset->vma_val))
1676 {
1677 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1678 return FALSE;
1679 }
1680
1681 if (pset->change_lma != CHANGE_IGNORE)
1682 {
1683 padd->section->lma = pset->lma_val;
1684
1685 if (! bfd_set_section_alignment
1686 (obfd, padd->section,
1687 bfd_section_alignment (obfd, padd->section)))
1688 {
1689 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1690 return FALSE;
1691 }
1692 }
1693 }
1694 }
1695 }
1696
1697 if (gnu_debuglink_filename != NULL)
1698 {
1699 gnu_debuglink_section = bfd_create_gnu_debuglink_section
1700 (obfd, gnu_debuglink_filename);
1701
1702 if (gnu_debuglink_section == NULL)
1703 {
1704 bfd_nonfatal_message (NULL, obfd, NULL,
1705 _("cannot create debug link section `%s'"),
1706 gnu_debuglink_filename);
1707 return FALSE;
1708 }
1709
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)
1713 {
1714 bfd_vma debuglink_vma;
1715 asection * highest_section;
1716 asection * sec;
1717
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.
1723
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;
1735
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;
1749
1750 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
1751 }
1752 }
1753
1754 if (bfd_count_sections (obfd) != 0
1755 && (gap_fill_set || pad_to_set))
1756 {
1757 asection **set;
1758 unsigned int c, i;
1759
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. */
1765
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);
1770
1771 qsort (osections, c, sizeof (asection *), compare_section_lma);
1772
1773 gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type));
1774 memset (gaps, 0, c * sizeof (bfd_size_type));
1775
1776 if (gap_fill_set)
1777 {
1778 for (i = 0; i < c - 1; i++)
1779 {
1780 flagword flags;
1781 bfd_size_type size;
1782 bfd_vma gap_start, gap_stop;
1783
1784 flags = bfd_get_section_flags (obfd, osections[i]);
1785 if ((flags & SEC_HAS_CONTENTS) == 0
1786 || (flags & SEC_LOAD) == 0)
1787 continue;
1788
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)
1793 {
1794 if (! bfd_set_section_size (obfd, osections[i],
1795 size + (gap_stop - gap_start)))
1796 {
1797 bfd_nonfatal_message (NULL, obfd, osections[i],
1798 _("Can't fill gap after section"));
1799 status = 1;
1800 break;
1801 }
1802 gaps[i] = gap_stop - gap_start;
1803 if (max_gap < gap_stop - gap_start)
1804 max_gap = gap_stop - gap_start;
1805 }
1806 }
1807 }
1808
1809 if (pad_to_set)
1810 {
1811 bfd_vma lma;
1812 bfd_size_type size;
1813
1814 lma = bfd_section_lma (obfd, osections[c - 1]);
1815 size = bfd_section_size (obfd, osections[c - 1]);
1816 if (lma + size < pad_to)
1817 {
1818 if (! bfd_set_section_size (obfd, osections[c - 1],
1819 pad_to - lma))
1820 {
1821 bfd_nonfatal_message (NULL, obfd, osections[c - 1],
1822 _("can't add padding"));
1823 status = 1;
1824 }
1825 else
1826 {
1827 gaps[c - 1] = pad_to - (lma + size);
1828 if (max_gap < pad_to - (lma + size))
1829 max_gap = pad_to - (lma + size);
1830 }
1831 }
1832 }
1833 }
1834
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);
1840
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)
1861 {
1862 /* Mark symbols used in output relocations so that they
1863 are kept, even if they are local labels or static symbols.
1864
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);
1876 }
1877
1878 if (convert_debugging && dhandle != NULL)
1879 {
1880 if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
1881 {
1882 status = 1;
1883 return FALSE;
1884 }
1885 }
1886
1887 bfd_set_symtab (obfd, osympp, symcount);
1888
1889 /* This has to happen after the symbol table has been set. */
1890 bfd_map_over_sections (ibfd, copy_section, obfd);
1891
1892 if (add_sections != NULL)
1893 {
1894 struct section_add *padd;
1895
1896 for (padd = add_sections; padd != NULL; padd = padd->next)
1897 {
1898 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
1899 0, padd->size))
1900 {
1901 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1902 return FALSE;
1903 }
1904 }
1905 }
1906
1907 if (gnu_debuglink_filename != NULL)
1908 {
1909 if (! bfd_fill_in_gnu_debuglink_section
1910 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
1911 {
1912 bfd_nonfatal_message (NULL, obfd, NULL,
1913 _("cannot fill debug link section `%s'"),
1914 gnu_debuglink_filename);
1915 return FALSE;
1916 }
1917 }
1918
1919 if (gap_fill_set || pad_to_set)
1920 {
1921 bfd_byte *buf;
1922 int c, i;
1923
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);
1929
1930 c = bfd_count_sections (obfd);
1931 for (i = 0; i < c; i++)
1932 {
1933 if (gaps[i] != 0)
1934 {
1935 bfd_size_type left;
1936 file_ptr off;
1937
1938 left = gaps[i];
1939 off = bfd_section_size (obfd, osections[i]) - left;
1940
1941 while (left > 0)
1942 {
1943 bfd_size_type now;
1944
1945 if (left > 8192)
1946 now = 8192;
1947 else
1948 now = left;
1949
1950 if (! bfd_set_section_contents (obfd, osections[i], buf,
1951 off, now))
1952 {
1953 bfd_nonfatal_message (NULL, obfd, osections[i], NULL);
1954 return FALSE;
1955 }
1956
1957 left -= now;
1958 off += now;
1959 }
1960 }
1961 }
1962 }
1963
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;
1968
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))
1974 {
1975 bfd_nonfatal_message (NULL, obfd, NULL,
1976 _("error copying private BFD data"));
1977 return FALSE;
1978 }
1979
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)
1984 {
1985 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
1986 {
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)
1990 {
1991 non_fatal (_("treating that number as an absolute e_machine value instead"));
1992 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
1993 }
1994 else
1995 non_fatal (_("ignoring the alternative value"));
1996 }
1997 }
1998
1999 return TRUE;
2000 }
2001
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'. */
2007
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)
2012 {
2013 struct name_list
2014 {
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;
2023
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));
2029
2030 obfd->has_armap = ibfd->has_armap;
2031 obfd->is_thin_archive = ibfd->is_thin_archive;
2032
2033 list = NULL;
2034
2035 this_element = bfd_openr_next_archived_file (ibfd, NULL);
2036
2037 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2038 {
2039 status = 1;
2040 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
2041 return;
2042 }
2043
2044 while (!status && this_element != NULL)
2045 {
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;
2053
2054 /* Create an output file for this member. */
2055 output_name = concat (dir, "/",
2056 bfd_get_filename (this_element), (char *) 0);
2057
2058 /* If the file already exists, make another temp dir. */
2059 if (stat (output_name, &buf) >= 0)
2060 {
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));
2065
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);
2073 }
2074
2075 if (preserve_dates)
2076 {
2077 stat_status = bfd_stat_arch_elt (this_element, &buf);
2078
2079 if (stat_status != 0)
2080 non_fatal (_("internal stat error on %s"),
2081 bfd_get_filename (this_element));
2082 }
2083
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;
2089
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"));
2094
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));
2101
2102 if (output_bfd == NULL)
2103 {
2104 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2105 status = 1;
2106 return;
2107 }
2108
2109 if (ok_object)
2110 {
2111 del = !copy_object (this_element, output_bfd, input_arch);
2112
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))
2117 {
2118 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2119 /* Error in new object file. Don't change archive. */
2120 status = 1;
2121 }
2122 }
2123
2124 if (!ok_object)
2125 {
2126 del = !copy_unknown_object (this_element, output_bfd);
2127 if (!bfd_close_all_done (output_bfd))
2128 {
2129 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2130 /* Error in new object file. Don't change archive. */
2131 status = 1;
2132 }
2133 }
2134
2135 if (del)
2136 {
2137 unlink (output_name);
2138 status = 1;
2139 }
2140 else
2141 {
2142 if (preserve_dates && stat_status == 0)
2143 set_times (output_name, &buf);
2144
2145 /* Open the newly output file and attach to our list. */
2146 output_bfd = bfd_openr (output_name, output_target);
2147
2148 l->obfd = output_bfd;
2149
2150 *ptr = output_bfd;
2151 ptr = &output_bfd->archive_next;
2152
2153 last_element = this_element;
2154
2155 this_element = bfd_openr_next_archived_file (ibfd, last_element);
2156
2157 bfd_close (last_element);
2158 }
2159 }
2160 *ptr = NULL;
2161
2162 filename = bfd_get_filename (obfd);
2163 if (!bfd_close (obfd))
2164 {
2165 status = 1;
2166 bfd_nonfatal_message (filename, NULL, NULL, NULL);
2167 return;
2168 }
2169
2170 filename = bfd_get_filename (ibfd);
2171 if (!bfd_close (ibfd))
2172 {
2173 status = 1;
2174 bfd_nonfatal_message (filename, NULL, NULL, NULL);
2175 return;
2176 }
2177
2178 /* Delete all the files that we opened. */
2179 for (l = list; l != NULL; l = l->next)
2180 {
2181 if (l->obfd == NULL)
2182 rmdir (l->name);
2183 else
2184 {
2185 bfd_close (l->obfd);
2186 unlink (l->name);
2187 }
2188 }
2189 rmdir (dir);
2190 }
2191
2192 static void
2193 set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_handling style)
2194 {
2195 /* This is only relevant to Coff targets. */
2196 if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
2197 {
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);
2202 }
2203 }
2204
2205 /* The top-level control. */
2206
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)
2211 {
2212 bfd *ibfd;
2213 char **obj_matching;
2214 char **core_matching;
2215 off_t size = get_file_size (input_filename);
2216
2217 if (size < 1)
2218 {
2219 if (size == 0)
2220 non_fatal (_("error: the input file '%s' is empty"),
2221 input_filename);
2222 status = 1;
2223 return;
2224 }
2225
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)
2230 {
2231 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2232 status = 1;
2233 return;
2234 }
2235
2236 switch (do_debug_sections)
2237 {
2238 case compress:
2239 ibfd->flags |= BFD_COMPRESS;
2240 break;
2241 case decompress:
2242 ibfd->flags |= BFD_DECOMPRESS;
2243 break;
2244 default:
2245 break;
2246 }
2247
2248 if (bfd_check_format (ibfd, bfd_archive))
2249 {
2250 bfd_boolean force_output_target;
2251 bfd *obfd;
2252
2253 /* bfd_get_target does not return the correct value until
2254 bfd_check_format succeeds. */
2255 if (output_target == NULL)
2256 {
2257 output_target = bfd_get_target (ibfd);
2258 force_output_target = FALSE;
2259 }
2260 else
2261 force_output_target = TRUE;
2262
2263 obfd = bfd_openw (output_filename, output_target);
2264 if (obfd == NULL)
2265 {
2266 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2267 status = 1;
2268 return;
2269 }
2270 /* This is a no-op on non-Coff targets. */
2271 set_long_section_mode (obfd, ibfd, long_section_names);
2272
2273 copy_archive (ibfd, obfd, output_target, force_output_target, input_arch);
2274 }
2275 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
2276 {
2277 bfd *obfd;
2278 do_copy:
2279
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);
2284
2285 obfd = bfd_openw (output_filename, output_target);
2286 if (obfd == NULL)
2287 {
2288 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2289 status = 1;
2290 return;
2291 }
2292 /* This is a no-op on non-Coff targets. */
2293 set_long_section_mode (obfd, ibfd, long_section_names);
2294
2295 if (! copy_object (ibfd, obfd, input_arch))
2296 status = 1;
2297
2298 if (!bfd_close (obfd))
2299 {
2300 status = 1;
2301 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2302 return;
2303 }
2304
2305 if (!bfd_close (ibfd))
2306 {
2307 status = 1;
2308 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2309 return;
2310 }
2311 }
2312 else
2313 {
2314 bfd_error_type obj_error = bfd_get_error ();
2315 bfd_error_type core_error;
2316
2317 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
2318 {
2319 /* This probably can't happen.. */
2320 if (obj_error == bfd_error_file_ambiguously_recognized)
2321 free (obj_matching);
2322 goto do_copy;
2323 }
2324
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);
2329
2330 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2331
2332 if (obj_error == bfd_error_file_ambiguously_recognized)
2333 {
2334 list_matching_formats (obj_matching);
2335 free (obj_matching);
2336 }
2337 if (core_error == bfd_error_file_ambiguously_recognized)
2338 {
2339 list_matching_formats (core_matching);
2340 free (core_matching);
2341 }
2342
2343 status = 1;
2344 }
2345 }
2346
2347 /* Add a name to the section renaming list. */
2348
2349 static void
2350 add_section_rename (const char * old_name, const char * new_name,
2351 flagword flags)
2352 {
2353 section_rename * srename;
2354
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)
2358 {
2359 /* Silently ignore duplicate definitions. */
2360 if (strcmp (srename->new_name, new_name) == 0
2361 && srename->flags == flags)
2362 return;
2363
2364 fatal (_("Multiple renames of section %s"), old_name);
2365 }
2366
2367 srename = (section_rename *) xmalloc (sizeof (* srename));
2368
2369 srename->old_name = old_name;
2370 srename->new_name = new_name;
2371 srename->flags = flags;
2372 srename->next = section_rename_list;
2373
2374 section_rename_list = srename;
2375 }
2376
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. */
2380
2381 static const char *
2382 find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection,
2383 flagword * returned_flags)
2384 {
2385 const char * old_name = bfd_section_name (ibfd, isection);
2386 section_rename * srename;
2387
2388 /* Default to using the flags of the input section. */
2389 * returned_flags = bfd_get_section_flags (ibfd, isection);
2390
2391 for (srename = section_rename_list; srename != NULL; srename = srename->next)
2392 if (strcmp (srename->old_name, old_name) == 0)
2393 {
2394 if (srename->flags != (flagword) -1)
2395 * returned_flags = srename->flags;
2396
2397 return srename->new_name;
2398 }
2399
2400 return old_name;
2401 }
2402
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. */
2405
2406 static void
2407 setup_bfd_headers (bfd *ibfd, bfd *obfd)
2408 {
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))
2412 {
2413 status = 1;
2414 bfd_nonfatal_message (NULL, ibfd, NULL,
2415 _("error in private header data"));
2416 return;
2417 }
2418
2419 /* All went well. */
2420 return;
2421 }
2422
2423 /* Create a section in OBFD with the same
2424 name and attributes as ISECTION in IBFD. */
2425
2426 static void
2427 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2428 {
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;
2440
2441 if (is_strip_section (ibfd, isection))
2442 return;
2443
2444 p = find_section_list (bfd_section_name (ibfd, isection), FALSE);
2445 if (p != NULL)
2446 p->used = TRUE;
2447
2448 /* Get the, possibly new, name of the output section. */
2449 name = find_section_rename (ibfd, isection, & flags);
2450
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;
2457
2458 if (prefix)
2459 {
2460 char *n;
2461
2462 n = (char *) xmalloc (strlen (prefix) + strlen (name) + 1);
2463 strcpy (n, prefix);
2464 strcat (n, name);
2465 name = n;
2466 }
2467
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))
2475 {
2476 flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
2477 if (obfd->xvec->flavour == bfd_target_elf_flavour)
2478 {
2479 make_nobits = TRUE;
2480
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);
2486 }
2487 }
2488
2489 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
2490
2491 if (osection == NULL)
2492 {
2493 err = _("failed to create output section");
2494 goto loser;
2495 }
2496
2497 if (make_nobits)
2498 elf_section_type (osection) = SHT_NOBITS;
2499
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))
2506 {
2507 err = _("failed to set size");
2508 goto loser;
2509 }
2510
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;
2518
2519 if (! bfd_set_section_vma (obfd, osection, vma))
2520 {
2521 err = _("failed to set vma");
2522 goto loser;
2523 }
2524
2525 lma = isection->lma;
2526 if ((p != NULL) && p->change_lma != CHANGE_IGNORE)
2527 {
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 ();
2534 }
2535 else
2536 lma += change_section_address;
2537
2538 osection->lma = lma;
2539
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)))
2545 {
2546 err = _("failed to set alignment");
2547 goto loser;
2548 }
2549
2550 /* Copy merge entity size. */
2551 osection->entsize = isection->entsize;
2552
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;
2558
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;
2563
2564 if ((isection->flags & SEC_GROUP) != 0)
2565 {
2566 asymbol *gsym = group_signature (isection);
2567
2568 if (gsym != NULL)
2569 {
2570 gsym->flags |= BSF_KEEP;
2571 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
2572 elf_group_id (isection) = gsym;
2573 }
2574 }
2575
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))
2579 {
2580 err = _("failed to copy private data");
2581 goto loser;
2582 }
2583
2584 /* All went well. */
2585 return;
2586
2587 loser:
2588 status = 1;
2589 bfd_nonfatal_message (NULL, obfd, osection, err);
2590 }
2591
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. */
2595
2596 static void
2597 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2598 {
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;
2607
2608 /* If we have already failed earlier on,
2609 do not keep on generating complaints now. */
2610 if (status != 0)
2611 return;
2612
2613 if (is_strip_section (ibfd, isection))
2614 return;
2615
2616 flags = bfd_get_section_flags (ibfd, isection);
2617 if ((flags & SEC_GROUP) != 0)
2618 return;
2619
2620 osection = isection->output_section;
2621 size = bfd_get_section_size (isection);
2622
2623 if (size == 0 || osection == 0)
2624 return;
2625
2626 if (extract_symbol)
2627 return;
2628
2629 p = find_section_list (bfd_get_section_name (ibfd, isection), FALSE);
2630
2631 /* Core files do not need to be relocated. */
2632 if (bfd_get_format (obfd) == bfd_core)
2633 relsize = 0;
2634 else
2635 {
2636 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2637
2638 if (relsize < 0)
2639 {
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
2644 {
2645 status = 1;
2646 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
2647 return;
2648 }
2649 }
2650 }
2651
2652 if (relsize == 0)
2653 bfd_set_reloc (obfd, osection, NULL, 0);
2654 else
2655 {
2656 relpp = (arelent **) xmalloc (relsize);
2657 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
2658 if (relcount < 0)
2659 {
2660 status = 1;
2661 bfd_nonfatal_message (NULL, ibfd, isection,
2662 _("relocation count is negative"));
2663 return;
2664 }
2665
2666 if (strip_symbols == STRIP_ALL)
2667 {
2668 /* Remove relocations which are not in
2669 keep_strip_specific_list. */
2670 arelent **temp_relpp;
2671 long temp_relcount = 0;
2672 long i;
2673
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;
2682 }
2683
2684 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
2685 if (relcount == 0)
2686 free (relpp);
2687 }
2688
2689 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
2690 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
2691 {
2692 bfd_byte *memhunk = NULL;
2693
2694 if (!bfd_get_full_section_contents (ibfd, isection, &memhunk))
2695 {
2696 status = 1;
2697 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
2698 return;
2699 }
2700
2701 if (reverse_bytes)
2702 {
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)
2707 {
2708 unsigned long i, j;
2709 bfd_byte b;
2710
2711 for (i = 0; i < size; i += reverse_bytes)
2712 for (j = 0; j < (unsigned long)(reverse_bytes / 2); j++)
2713 {
2714 bfd_byte *m = (bfd_byte *) memhunk;
2715
2716 b = m[i + j];
2717 m[i + j] = m[(i + reverse_bytes) - (j + 1)];
2718 m[(i + reverse_bytes) - (j + 1)] = b;
2719 }
2720 }
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);
2725 }
2726
2727 if (copy_byte >= 0)
2728 {
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;
2734
2735 for (; from < end; from += interleave)
2736 for (i = 0; i < copy_width; i++)
2737 *to++ = from[i];
2738
2739 size = (size + interleave - 1 - copy_byte) / interleave * copy_width;
2740 osection->lma /= interleave;
2741 }
2742
2743 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2744 {
2745 status = 1;
2746 bfd_nonfatal_message (NULL, obfd, osection, NULL);
2747 return;
2748 }
2749 free (memhunk);
2750 }
2751 else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0)
2752 {
2753 void *memhunk = xmalloc (size);
2754
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. */
2760
2761 memset (memhunk, 0, size);
2762 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2763 {
2764 status = 1;
2765 bfd_nonfatal_message (NULL, obfd, osection, NULL);
2766 return;
2767 }
2768 free (memhunk);
2769 }
2770 }
2771
2772 /* Get all the sections. This is used when --gap-fill or --pad-to is
2773 used. */
2774
2775 static void
2776 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
2777 {
2778 asection ***secppp = (asection ***) secppparg;
2779
2780 **secppp = osection;
2781 ++(*secppp);
2782 }
2783
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. */
2787
2788 static int
2789 compare_section_lma (const void *arg1, const void *arg2)
2790 {
2791 const asection *const *sec1 = (const asection * const *) arg1;
2792 const asection *const *sec2 = (const asection * const *) arg2;
2793 flagword flags1, flags2;
2794
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)
2800 {
2801 if ((flags2 & SEC_HAS_CONTENTS) != 0
2802 && (flags2 & SEC_LOAD) != 0)
2803 return -1;
2804 }
2805 else
2806 {
2807 if ((flags2 & SEC_HAS_CONTENTS) == 0
2808 || (flags2 & SEC_LOAD) == 0)
2809 return 1;
2810 }
2811
2812 /* Sort sections by LMA. */
2813 if ((*sec1)->lma > (*sec2)->lma)
2814 return 1;
2815 else if ((*sec1)->lma < (*sec2)->lma)
2816 return -1;
2817
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;
2823
2824 return 0;
2825 }
2826
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.
2829
2830 Ignore relocations which will not appear in the output file. */
2831
2832 static void
2833 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
2834 {
2835 asymbol **symbols = (asymbol **) symbolsarg;
2836 long relsize;
2837 arelent **relpp;
2838 long relcount, i;
2839
2840 /* Ignore an input section with no corresponding output section. */
2841 if (isection->output_section == NULL)
2842 return;
2843
2844 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2845 if (relsize < 0)
2846 {
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));
2851 }
2852
2853 if (relsize == 0)
2854 return;
2855
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));
2860
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++)
2864 {
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;
2869 }
2870
2871 if (relpp != NULL)
2872 free (relpp);
2873 }
2874
2875 /* Write out debugging information. */
2876
2877 static bfd_boolean
2878 write_debugging_info (bfd *obfd, void *dhandle,
2879 long *symcountp ATTRIBUTE_UNUSED,
2880 asymbol ***symppp ATTRIBUTE_UNUSED)
2881 {
2882 if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour)
2883 return write_ieee_debugging_info (obfd, dhandle);
2884
2885 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2886 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
2887 {
2888 bfd_byte *syms, *strings;
2889 bfd_size_type symsize, stringsize;
2890 asection *stabsec, *stabstrsec;
2891 flagword flags;
2892
2893 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
2894 &symsize, &strings,
2895 &stringsize))
2896 return FALSE;
2897
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))
2907 {
2908 bfd_nonfatal_message (NULL, obfd, NULL,
2909 _("can't create debugging section"));
2910 return FALSE;
2911 }
2912
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))
2920 {
2921 bfd_nonfatal_message (NULL, obfd, NULL,
2922 _("can't set debugging section contents"));
2923 return FALSE;
2924 }
2925
2926 return TRUE;
2927 }
2928
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;
2933 }
2934
2935 static int
2936 strip_main (int argc, char *argv[])
2937 {
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;
2946
2947 while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
2948 strip_options, (int *) 0)) != EOF)
2949 {
2950 switch (c)
2951 {
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);
3021 }
3022 }
3023
3024 if (formats_info)
3025 {
3026 display_info ();
3027 return 0;
3028 }
3029
3030 if (show_version)
3031 print_version ("strip");
3032
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;
3038
3039 if (output_target == NULL)
3040 output_target = input_target;
3041
3042 i = optind;
3043 if (i == argc
3044 || (output_file != NULL && (i + 1) < argc))
3045 strip_usage (stderr, 1);
3046
3047 for (; i < argc; i++)
3048 {
3049 int hold_status = status;
3050 struct stat statbuf;
3051 char *tmpname;
3052
3053 if (get_file_size (argv[i]) < 1)
3054 {
3055 status = 1;
3056 continue;
3057 }
3058
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);
3063
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;
3069
3070 if (tmpname == NULL)
3071 {
3072 bfd_nonfatal_message (argv[i], NULL, NULL,
3073 _("could not create temporary file to hold stripped copy"));
3074 status = 1;
3075 continue;
3076 }
3077
3078 status = 0;
3079 copy_file (argv[i], tmpname, input_target, output_target, NULL);
3080 if (status == 0)
3081 {
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;
3090 }
3091 else
3092 unlink_if_ordinary (tmpname);
3093 if (output_file != tmpname)
3094 free (tmpname);
3095 }
3096
3097 return status;
3098 }
3099
3100 /* Set up PE subsystem. */
3101
3102 static void
3103 set_pe_subsystem (const char *s)
3104 {
3105 const char *version, *subsystem;
3106 size_t i;
3107 static const struct
3108 {
3109 const char *name;
3110 const char set_def;
3111 const short value;
3112 }
3113 v[] =
3114 {
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 }
3125 };
3126 short value;
3127 char *copy;
3128 int set_def = -1;
3129
3130 /* Check for the presence of a version number. */
3131 version = strchr (s, ':');
3132 if (version == NULL)
3133 subsystem = s;
3134 else
3135 {
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);
3146 }
3147
3148 /* Check for numeric subsystem. */
3149 value = (short) strtol (subsystem, &copy, 0);
3150 if (*copy == '\0')
3151 {
3152 for (i = 0; i < ARRAY_SIZE (v); i++)
3153 if (v[i].value == value)
3154 {
3155 pe_subsystem = value;
3156 set_def = v[i].set_def;
3157 break;
3158 }
3159 }
3160 else
3161 {
3162 /* Search for subsystem by name. */
3163 for (i = 0; i < ARRAY_SIZE (v); i++)
3164 if (strcmp (subsystem, v[i].name) == 0)
3165 {
3166 pe_subsystem = v[i].value;
3167 set_def = v[i].set_def;
3168 break;
3169 }
3170 }
3171
3172 switch (set_def)
3173 {
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;
3185 }
3186 if (s != subsystem)
3187 free ((char *) subsystem);
3188 }
3189
3190 /* Convert EFI target to PEI target. */
3191
3192 static void
3193 convert_efi_target (char *efi)
3194 {
3195 efi[0] = 'p';
3196 efi[1] = 'e';
3197 efi[2] = 'i';
3198
3199 if (strcmp (efi + 4, "ia32") == 0)
3200 {
3201 /* Change ia32 to i386. */
3202 efi[5]= '3';
3203 efi[6]= '8';
3204 efi[7]= '6';
3205 }
3206 else if (strcmp (efi + 4, "x86_64") == 0)
3207 {
3208 /* Change x86_64 to x86-64. */
3209 efi[7] = '-';
3210 }
3211 }
3212
3213 static int
3214 copy_main (int argc, char *argv[])
3215 {
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;
3228
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)
3231 {
3232 switch (c)
3233 {
3234 case 'b':
3235 copy_byte = atoi (optarg);
3236 if (copy_byte < 0)
3237 fatal (_("byte number must be non-negative"));
3238 break;
3239
3240 case 'B':
3241 input_arch = bfd_scan_arch (optarg);
3242 if (input_arch == NULL)
3243 fatal (_("architecture %s unknown"), optarg);
3244 break;
3245
3246 case 'i':
3247 if (optarg)
3248 {
3249 interleave = atoi (optarg);
3250 if (interleave < 1)
3251 fatal (_("interleave must be positive"));
3252 }
3253 else
3254 interleave = 4;
3255 break;
3256
3257 case OPTION_INTERLEAVE_WIDTH:
3258 copy_width = atoi (optarg);
3259 if (copy_width < 1)
3260 fatal(_("interleave width must be positive"));
3261 break;
3262
3263 case 'I':
3264 case 's': /* "source" - 'I' is preferred */
3265 input_target = optarg;
3266 break;
3267
3268 case 'O':
3269 case 'd': /* "destination" - 'O' is preferred */
3270 output_target = optarg;
3271 break;
3272
3273 case 'F':
3274 input_target = output_target = optarg;
3275 break;
3276
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;
3284
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;
3292
3293 case 'S':
3294 strip_symbols = STRIP_ALL;
3295 break;
3296
3297 case 'g':
3298 strip_symbols = STRIP_DEBUG;
3299 break;
3300
3301 case OPTION_STRIP_UNNEEDED:
3302 strip_symbols = STRIP_UNNEEDED;
3303 break;
3304
3305 case OPTION_ONLY_KEEP_DEBUG:
3306 strip_symbols = STRIP_NONDEBUG;
3307 break;
3308
3309 case OPTION_KEEP_FILE_SYMBOLS:
3310 keep_file_symbols = 1;
3311 break;
3312
3313 case OPTION_ADD_GNU_DEBUGLINK:
3314 gnu_debuglink_filename = optarg;
3315 break;
3316
3317 case 'K':
3318 add_specific_symbol (optarg, keep_specific_htab);
3319 break;
3320
3321 case 'N':
3322 add_specific_symbol (optarg, strip_specific_htab);
3323 break;
3324
3325 case OPTION_STRIP_UNNEEDED_SYMBOL:
3326 add_specific_symbol (optarg, strip_unneeded_htab);
3327 break;
3328
3329 case 'L':
3330 add_specific_symbol (optarg, localize_specific_htab);
3331 break;
3332
3333 case OPTION_GLOBALIZE_SYMBOL:
3334 add_specific_symbol (optarg, globalize_specific_htab);
3335 break;
3336
3337 case 'G':
3338 add_specific_symbol (optarg, keepglobal_specific_htab);
3339 break;
3340
3341 case 'W':
3342 add_specific_symbol (optarg, weaken_specific_htab);
3343 break;
3344
3345 case 'p':
3346 preserve_dates = TRUE;
3347 break;
3348
3349 case 'w':
3350 wildcard = TRUE;
3351 break;
3352
3353 case 'x':
3354 discard_locals = LOCALS_ALL;
3355 break;
3356
3357 case 'X':
3358 discard_locals = LOCALS_START_L;
3359 break;
3360
3361 case 'v':
3362 verbose = TRUE;
3363 break;
3364
3365 case 'V':
3366 show_version = TRUE;
3367 break;
3368
3369 case OPTION_FORMATS_INFO:
3370 formats_info = TRUE;
3371 break;
3372
3373 case OPTION_WEAKEN:
3374 weaken = TRUE;
3375 break;
3376
3377 case OPTION_ADD_SECTION:
3378 {
3379 const char *s;
3380 size_t off, alloc;
3381 struct section_add *pa;
3382 FILE *f;
3383
3384 s = strchr (optarg, '=');
3385
3386 if (s == NULL)
3387 fatal (_("bad format for %s"), "--add-section");
3388
3389 pa = (struct section_add *) xmalloc (sizeof (struct section_add));
3390 pa->name = xstrndup (optarg, s - optarg);
3391 pa->filename = s + 1;
3392
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. */
3396
3397 f = fopen (pa->filename, FOPEN_RB);
3398 if (f == NULL)
3399 fatal (_("cannot open: %s: %s"),
3400 pa->filename, strerror (errno));
3401
3402 off = 0;
3403 alloc = 4096;
3404 pa->contents = (bfd_byte *) xmalloc (alloc);
3405 while (!feof (f))
3406 {
3407 off_t got;
3408
3409 if (off == alloc)
3410 {
3411 alloc <<= 1;
3412 pa->contents = (bfd_byte *) xrealloc (pa->contents, alloc);
3413 }
3414
3415 got = fread (pa->contents + off, 1, alloc - off, f);
3416 if (ferror (f))
3417 fatal (_("%s: fread failed"), pa->filename);
3418
3419 off += got;
3420 }
3421
3422 pa->size = off;
3423
3424 fclose (f);
3425
3426 pa->next = add_sections;
3427 add_sections = pa;
3428 }
3429 break;
3430
3431 case OPTION_CHANGE_START:
3432 change_start = parse_vma (optarg, "--change-start");
3433 break;
3434
3435 case OPTION_CHANGE_SECTION_ADDRESS:
3436 case OPTION_CHANGE_SECTION_LMA:
3437 case OPTION_CHANGE_SECTION_VMA:
3438 {
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;
3445
3446 switch (c)
3447 {
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;
3457 }
3458
3459 s = strchr (optarg, '=');
3460 if (s == NULL)
3461 {
3462 s = strchr (optarg, '+');
3463 if (s == NULL)
3464 {
3465 s = strchr (optarg, '-');
3466 if (s == NULL)
3467 fatal (_("bad format for %s"), option);
3468 }
3469 }
3470
3471 len = s - optarg;
3472 name = (char *) xmalloc (len + 1);
3473 strncpy (name, optarg, len);
3474 name[len] = '\0';
3475
3476 p = find_section_list (name, TRUE);
3477
3478 val = parse_vma (s + 1, option);
3479
3480 switch (*s)
3481 {
3482 case '=': what = CHANGE_SET; break;
3483 case '-': val = - val; /* Drop through. */
3484 case '+': what = CHANGE_MODIFY; break;
3485 }
3486
3487 switch (c)
3488 {
3489 case OPTION_CHANGE_SECTION_ADDRESS:
3490 p->change_vma = what;
3491 p->vma_val = val;
3492 /* Drop through. */
3493
3494 case OPTION_CHANGE_SECTION_LMA:
3495 p->change_lma = what;
3496 p->lma_val = val;
3497 break;
3498
3499 case OPTION_CHANGE_SECTION_VMA:
3500 p->change_vma = what;
3501 p->vma_val = val;
3502 break;
3503 }
3504 }
3505 break;
3506
3507 case OPTION_CHANGE_ADDRESSES:
3508 change_section_address = parse_vma (optarg, "--change-addresses");
3509 change_start = change_section_address;
3510 break;
3511
3512 case OPTION_CHANGE_WARNINGS:
3513 change_warn = TRUE;
3514 break;
3515
3516 case OPTION_CHANGE_LEADING_CHAR:
3517 change_leading_char = TRUE;
3518 break;
3519
3520 case OPTION_COMPRESS_DEBUG_SECTIONS:
3521 do_debug_sections = compress;
3522 break;
3523
3524 case OPTION_DEBUGGING:
3525 convert_debugging = TRUE;
3526 break;
3527
3528 case OPTION_DECOMPRESS_DEBUG_SECTIONS:
3529 do_debug_sections = decompress;
3530 break;
3531
3532 case OPTION_GAP_FILL:
3533 {
3534 bfd_vma gap_fill_vma;
3535
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)
3539 {
3540 char buff[20];
3541
3542 sprintf_vma (buff, gap_fill_vma);
3543
3544 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
3545 buff, gap_fill);
3546 }
3547 gap_fill_set = TRUE;
3548 }
3549 break;
3550
3551 case OPTION_NO_CHANGE_WARNINGS:
3552 change_warn = FALSE;
3553 break;
3554
3555 case OPTION_PAD_TO:
3556 pad_to = parse_vma (optarg, "--pad-to");
3557 pad_to_set = TRUE;
3558 break;
3559
3560 case OPTION_REMOVE_LEADING_CHAR:
3561 remove_leading_char = TRUE;
3562 break;
3563
3564 case OPTION_REDEFINE_SYM:
3565 {
3566 /* Push this redefinition onto redefine_symbol_list. */
3567
3568 int len;
3569 const char *s;
3570 const char *nextarg;
3571 char *source, *target;
3572
3573 s = strchr (optarg, '=');
3574 if (s == NULL)
3575 fatal (_("bad format for %s"), "--redefine-sym");
3576
3577 len = s - optarg;
3578 source = (char *) xmalloc (len + 1);
3579 strncpy (source, optarg, len);
3580 source[len] = '\0';
3581
3582 nextarg = s + 1;
3583 len = strlen (nextarg);
3584 target = (char *) xmalloc (len + 1);
3585 strcpy (target, nextarg);
3586
3587 redefine_list_append ("--redefine-sym", source, target);
3588
3589 free (source);
3590 free (target);
3591 }
3592 break;
3593
3594 case OPTION_REDEFINE_SYMS:
3595 add_redefine_syms_file (optarg);
3596 break;
3597
3598 case OPTION_SET_SECTION_FLAGS:
3599 {
3600 const char *s;
3601 int len;
3602 char *name;
3603
3604 s = strchr (optarg, '=');
3605 if (s == NULL)
3606 fatal (_("bad format for %s"), "--set-section-flags");
3607
3608 len = s - optarg;
3609 name = (char *) xmalloc (len + 1);
3610 strncpy (name, optarg, len);
3611 name[len] = '\0';
3612
3613 p = find_section_list (name, TRUE);
3614
3615 p->set_flags = TRUE;
3616 p->flags = parse_flags (s + 1);
3617 }
3618 break;
3619
3620 case OPTION_RENAME_SECTION:
3621 {
3622 flagword flags;
3623 const char *eq, *fl;
3624 char *old_name;
3625 char *new_name;
3626 unsigned int len;
3627
3628 eq = strchr (optarg, '=');
3629 if (eq == NULL)
3630 fatal (_("bad format for %s"), "--rename-section");
3631
3632 len = eq - optarg;
3633 if (len == 0)
3634 fatal (_("bad format for %s"), "--rename-section");
3635
3636 old_name = (char *) xmalloc (len + 1);
3637 strncpy (old_name, optarg, len);
3638 old_name[len] = 0;
3639
3640 eq++;
3641 fl = strchr (eq, ',');
3642 if (fl)
3643 {
3644 flags = parse_flags (fl + 1);
3645 len = fl - eq;
3646 }
3647 else
3648 {
3649 flags = -1;
3650 len = strlen (eq);
3651 }
3652
3653 if (len == 0)
3654 fatal (_("bad format for %s"), "--rename-section");
3655
3656 new_name = (char *) xmalloc (len + 1);
3657 strncpy (new_name, eq, len);
3658 new_name[len] = 0;
3659
3660 add_section_rename (old_name, new_name, flags);
3661 }
3662 break;
3663
3664 case OPTION_SET_START:
3665 set_start = parse_vma (optarg, "--set-start");
3666 set_start_set = TRUE;
3667 break;
3668
3669 case OPTION_SREC_LEN:
3670 Chunk = parse_vma (optarg, "--srec-len");
3671 break;
3672
3673 case OPTION_SREC_FORCES3:
3674 S3Forced = TRUE;
3675 break;
3676
3677 case OPTION_STRIP_SYMBOLS:
3678 add_specific_symbols (optarg, strip_specific_htab);
3679 break;
3680
3681 case OPTION_STRIP_UNNEEDED_SYMBOLS:
3682 add_specific_symbols (optarg, strip_unneeded_htab);
3683 break;
3684
3685 case OPTION_KEEP_SYMBOLS:
3686 add_specific_symbols (optarg, keep_specific_htab);
3687 break;
3688
3689 case OPTION_LOCALIZE_HIDDEN:
3690 localize_hidden = TRUE;
3691 break;
3692
3693 case OPTION_LOCALIZE_SYMBOLS:
3694 add_specific_symbols (optarg, localize_specific_htab);
3695 break;
3696
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;
3707
3708 case OPTION_GLOBALIZE_SYMBOLS:
3709 add_specific_symbols (optarg, globalize_specific_htab);
3710 break;
3711
3712 case OPTION_KEEPGLOBAL_SYMBOLS:
3713 add_specific_symbols (optarg, keepglobal_specific_htab);
3714 break;
3715
3716 case OPTION_WEAKEN_SYMBOLS:
3717 add_specific_symbols (optarg, weaken_specific_htab);
3718 break;
3719
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;
3725
3726 case OPTION_PREFIX_SYMBOLS:
3727 prefix_symbols_string = optarg;
3728 break;
3729
3730 case OPTION_PREFIX_SECTIONS:
3731 prefix_sections_string = optarg;
3732 break;
3733
3734 case OPTION_PREFIX_ALLOC_SECTIONS:
3735 prefix_alloc_sections_string = optarg;
3736 break;
3737
3738 case OPTION_READONLY_TEXT:
3739 bfd_flags_to_set |= WP_TEXT;
3740 bfd_flags_to_clear &= ~WP_TEXT;
3741 break;
3742
3743 case OPTION_WRITABLE_TEXT:
3744 bfd_flags_to_clear |= WP_TEXT;
3745 bfd_flags_to_set &= ~WP_TEXT;
3746 break;
3747
3748 case OPTION_PURE:
3749 bfd_flags_to_set |= D_PAGED;
3750 bfd_flags_to_clear &= ~D_PAGED;
3751 break;
3752
3753 case OPTION_IMPURE:
3754 bfd_flags_to_clear |= D_PAGED;
3755 bfd_flags_to_set &= ~D_PAGED;
3756 break;
3757
3758 case OPTION_EXTRACT_SYMBOL:
3759 extract_symbol = TRUE;
3760 break;
3761
3762 case OPTION_REVERSE_BYTES:
3763 {
3764 int prev = reverse_bytes;
3765
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"));
3769
3770 if (prev && prev != reverse_bytes)
3771 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
3772 prev);
3773 break;
3774 }
3775
3776 case OPTION_FILE_ALIGNMENT:
3777 pe_file_alignment = parse_vma (optarg, "--file-alignment");
3778 break;
3779
3780 case OPTION_HEAP:
3781 {
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')
3789 {
3790 pe_heap_commit = strtoul (end + 1, &end, 0);
3791 if (*end != '\0')
3792 non_fatal (_("%s: invalid commit value for --heap"),
3793 optarg);
3794 }
3795 }
3796 break;
3797
3798 case OPTION_IMAGE_BASE:
3799 pe_image_base = parse_vma (optarg, "--image-base");
3800 break;
3801
3802 case OPTION_SECTION_ALIGNMENT:
3803 pe_section_alignment = parse_vma (optarg,
3804 "--section-alignment");
3805 break;
3806
3807 case OPTION_SUBSYSTEM:
3808 set_pe_subsystem (optarg);
3809 break;
3810
3811 case OPTION_STACK:
3812 {
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')
3820 {
3821 pe_stack_commit = strtoul (end + 1, &end, 0);
3822 if (*end != '\0')
3823 non_fatal (_("%s: invalid commit value for --stack"),
3824 optarg);
3825 }
3826 }
3827 break;
3828
3829 case 0:
3830 /* We've been given a long option. */
3831 break;
3832
3833 case 'H':
3834 case 'h':
3835 copy_usage (stdout, 0);
3836
3837 default:
3838 copy_usage (stderr, 1);
3839 }
3840 }
3841
3842 if (formats_info)
3843 {
3844 display_info ();
3845 return 0;
3846 }
3847
3848 if (show_version)
3849 print_version ("objcopy");
3850
3851 if (interleave && copy_byte == -1)
3852 fatal (_("interleave start byte must be set with --byte"));
3853
3854 if (copy_byte >= interleave)
3855 fatal (_("byte number must be less than interleave"));
3856
3857 if (copy_width > interleave - copy_byte)
3858 fatal (_("interleave width must be less than or equal to interleave - byte`"));
3859
3860 if (optind == argc || optind + 2 < argc)
3861 copy_usage (stderr, 1);
3862
3863 input_filename = argv[optind];
3864 if (optind + 1 < argc)
3865 output_filename = argv[optind + 1];
3866
3867 /* Default is to strip no symbols. */
3868 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
3869 strip_symbols = STRIP_NONE;
3870
3871 if (output_target == NULL)
3872 output_target = input_target;
3873
3874 /* Convert input EFI target to PEI target. */
3875 if (input_target != NULL
3876 && strncmp (input_target, "efi-", 4) == 0)
3877 {
3878 char *efi;
3879
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);
3886
3887 input_target = efi;
3888 convert_efi_target (efi);
3889 }
3890
3891 /* Convert output EFI target to PEI target. */
3892 if (output_target != NULL
3893 && strncmp (output_target, "efi-", 4) == 0)
3894 {
3895 char *efi;
3896
3897 efi = xstrdup (output_target + 4);
3898 if (strncmp (efi, "app-", 4) == 0)
3899 {
3900 if (pe_subsystem == -1)
3901 pe_subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
3902 }
3903 else if (strncmp (efi, "bsdrv-", 6) == 0)
3904 {
3905 if (pe_subsystem == -1)
3906 pe_subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;
3907 efi += 2;
3908 }
3909 else if (strncmp (efi, "rtdrv-", 6) == 0)
3910 {
3911 if (pe_subsystem == -1)
3912 pe_subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;
3913 efi += 2;
3914 }
3915 else
3916 fatal (_("unknown output EFI target: %s"), output_target);
3917
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;
3922
3923 output_target = efi;
3924 convert_efi_target (efi);
3925 }
3926
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));
3931
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;
3939
3940 if (tmpname == NULL)
3941 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
3942 input_filename, strerror (errno));
3943
3944 copy_file (input_filename, tmpname, input_target, output_target, input_arch);
3945 if (status == 0)
3946 {
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);
3952 }
3953 else
3954 unlink_if_ordinary (tmpname);
3955
3956 if (change_warn)
3957 {
3958 for (p = change_sections; p != NULL; p = p->next)
3959 {
3960 if (! p->used)
3961 {
3962 if (p->change_vma != CHANGE_IGNORE)
3963 {
3964 char buff [20];
3965
3966 sprintf_vma (buff, p->vma_val);
3967
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);
3974 }
3975
3976 if (p->change_lma != CHANGE_IGNORE)
3977 {
3978 char buff [20];
3979
3980 sprintf_vma (buff, p->lma_val);
3981
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);
3988 }
3989 }
3990 }
3991 }
3992
3993 return 0;
3994 }
3995
3996 int
3997 main (int argc, char *argv[])
3998 {
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);
4007
4008 program_name = argv[0];
4009 xmalloc_set_program_name (program_name);
4010
4011 START_PROGRESS (program_name, 0);
4012
4013 expandargv (&argc, &argv);
4014
4015 strip_symbols = STRIP_UNDEF;
4016 discard_locals = LOCALS_UNDEF;
4017
4018 bfd_init ();
4019 set_default_bfd_target ();
4020
4021 if (is_strip < 0)
4022 {
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)
4027 {
4028 i -= 4;
4029 program_name[i] = '\0';
4030 }
4031 #endif
4032 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
4033 }
4034
4035 create_symbol_htabs ();
4036
4037 if (is_strip)
4038 strip_main (argc, argv);
4039 else
4040 copy_main (argc, argv);
4041
4042 END_PROGRESS (program_name);
4043
4044 return status;
4045 }
This page took 0.159565 seconds and 5 git commands to generate.