binutils/
[deliverable/binutils-gdb.git] / binutils / objcopy.c
1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
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 "libbfd.h"
34 #include "coff/internal.h"
35 #include "libcoff.h"
36
37 /* FIXME: See bfd/peXXigen.c for why we include an architecture specific
38 header in generic PE code. */
39 #include "coff/i386.h"
40 #include "coff/pe.h"
41
42 static bfd_vma pe_file_alignment = (bfd_vma) -1;
43 static bfd_vma pe_heap_commit = (bfd_vma) -1;
44 static bfd_vma pe_heap_reserve = (bfd_vma) -1;
45 static bfd_vma pe_image_base = (bfd_vma) -1;
46 static bfd_vma pe_section_alignment = (bfd_vma) -1;
47 static bfd_vma pe_stack_commit = (bfd_vma) -1;
48 static bfd_vma pe_stack_reserve = (bfd_vma) -1;
49 static short pe_subsystem = -1;
50 static short pe_major_subsystem_version = -1;
51 static short pe_minor_subsystem_version = -1;
52
53 struct is_specified_symbol_predicate_data
54 {
55 const char *name;
56 bfd_boolean found;
57 };
58
59 /* A list to support redefine_sym. */
60 struct redefine_node
61 {
62 char *source;
63 char *target;
64 struct redefine_node *next;
65 };
66
67 typedef struct section_rename
68 {
69 const char * old_name;
70 const char * new_name;
71 flagword flags;
72 struct section_rename * next;
73 }
74 section_rename;
75
76 /* List of sections to be renamed. */
77 static section_rename *section_rename_list;
78
79 static asymbol **isympp = NULL; /* Input symbols. */
80 static asymbol **osympp = NULL; /* Output symbols that survive stripping. */
81
82 /* If `copy_byte' >= 0, copy 'copy_width' byte(s) of every `interleave' bytes. */
83 static int copy_byte = -1;
84 static int interleave = 0; /* Initialised to 4 in copy_main(). */
85 static int copy_width = 1;
86
87 static bfd_boolean verbose; /* Print file and target names. */
88 static bfd_boolean preserve_dates; /* Preserve input file timestamp. */
89 static bfd_boolean deterministic; /* Enable deterministic archives. */
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_DWO, /* Strip all DWO info. */
100 STRIP_NONDWO, /* Strip everything but DWO info. */
101 STRIP_ALL /* Strip all symbols. */
102 };
103
104 /* Which symbols to remove. */
105 static enum strip_action strip_symbols;
106
107 enum locals_action
108 {
109 LOCALS_UNDEF,
110 LOCALS_START_L, /* Discard locals starting with L. */
111 LOCALS_ALL /* Discard all locals. */
112 };
113
114 /* Which local symbols to remove. Overrides STRIP_ALL. */
115 static enum locals_action discard_locals;
116
117 /* What kind of change to perform. */
118 enum change_action
119 {
120 CHANGE_IGNORE,
121 CHANGE_MODIFY,
122 CHANGE_SET
123 };
124
125 /* Structure used to hold lists of sections and actions to take. */
126 struct section_list
127 {
128 struct section_list * next; /* Next section to change. */
129 const char * name; /* Section name. */
130 bfd_boolean used; /* Whether this entry was used. */
131 bfd_boolean remove; /* Whether to remove this section. */
132 bfd_boolean copy; /* Whether to copy this section. */
133 enum change_action change_vma;/* Whether to change or set VMA. */
134 bfd_vma vma_val; /* Amount to change by or set to. */
135 enum change_action change_lma;/* Whether to change or set LMA. */
136 bfd_vma lma_val; /* Amount to change by or set to. */
137 bfd_boolean set_flags; /* Whether to set the section flags. */
138 flagword flags; /* What to set the section flags to. */
139 };
140
141 static struct section_list *change_sections;
142
143 /* TRUE if some sections are to be removed. */
144 static bfd_boolean sections_removed;
145
146 /* TRUE if only some sections are to be copied. */
147 static bfd_boolean sections_copied;
148
149 /* Changes to the start address. */
150 static bfd_vma change_start = 0;
151 static bfd_boolean set_start_set = FALSE;
152 static bfd_vma set_start;
153
154 /* Changes to section addresses. */
155 static bfd_vma change_section_address = 0;
156
157 /* Filling gaps between sections. */
158 static bfd_boolean gap_fill_set = FALSE;
159 static bfd_byte gap_fill = 0;
160
161 /* Pad to a given address. */
162 static bfd_boolean pad_to_set = FALSE;
163 static bfd_vma pad_to;
164
165 /* Use alternative machine code? */
166 static unsigned long use_alt_mach_code = 0;
167
168 /* Output BFD flags user wants to set or clear */
169 static flagword bfd_flags_to_set;
170 static flagword bfd_flags_to_clear;
171
172 /* List of sections to add. */
173 struct section_add
174 {
175 /* Next section to add. */
176 struct section_add *next;
177 /* Name of section to add. */
178 const char *name;
179 /* Name of file holding section contents. */
180 const char *filename;
181 /* Size of file. */
182 size_t size;
183 /* Contents of file. */
184 bfd_byte *contents;
185 /* BFD section, after it has been added. */
186 asection *section;
187 };
188
189 /* List of sections to add to the output BFD. */
190 static struct section_add *add_sections;
191
192 /* If non-NULL the argument to --add-gnu-debuglink.
193 This should be the filename to store in the .gnu_debuglink section. */
194 static const char * gnu_debuglink_filename = NULL;
195
196 /* Whether to convert debugging information. */
197 static bfd_boolean convert_debugging = FALSE;
198
199 /* Whether to compress/decompress DWARF debug sections. */
200 static enum
201 {
202 nothing,
203 compress,
204 decompress
205 } do_debug_sections = nothing;
206
207 /* Whether to change the leading character in symbol names. */
208 static bfd_boolean change_leading_char = FALSE;
209
210 /* Whether to remove the leading character from global symbol names. */
211 static bfd_boolean remove_leading_char = FALSE;
212
213 /* Whether to permit wildcard in symbol comparison. */
214 static bfd_boolean wildcard = FALSE;
215
216 /* True if --localize-hidden is in effect. */
217 static bfd_boolean localize_hidden = FALSE;
218
219 /* List of symbols to strip, keep, localize, keep-global, weaken,
220 or redefine. */
221 static htab_t strip_specific_htab = NULL;
222 static htab_t strip_unneeded_htab = NULL;
223 static htab_t keep_specific_htab = NULL;
224 static htab_t localize_specific_htab = NULL;
225 static htab_t globalize_specific_htab = NULL;
226 static htab_t keepglobal_specific_htab = NULL;
227 static htab_t weaken_specific_htab = NULL;
228 static struct redefine_node *redefine_sym_list = NULL;
229
230 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
231 static bfd_boolean weaken = FALSE;
232
233 /* If this is TRUE, we retain BSF_FILE symbols. */
234 static bfd_boolean keep_file_symbols = FALSE;
235
236 /* Prefix symbols/sections. */
237 static char *prefix_symbols_string = 0;
238 static char *prefix_sections_string = 0;
239 static char *prefix_alloc_sections_string = 0;
240
241 /* True if --extract-symbol was passed on the command line. */
242 static bfd_boolean extract_symbol = FALSE;
243
244 /* If `reverse_bytes' is nonzero, then reverse the order of every chunk
245 of <reverse_bytes> bytes within each output section. */
246 static int reverse_bytes = 0;
247
248 /* For Coff objects, we may want to allow or disallow long section names,
249 or preserve them where found in the inputs. Debug info relies on them. */
250 enum long_section_name_handling
251 {
252 DISABLE,
253 ENABLE,
254 KEEP
255 };
256
257 /* The default long section handling mode is to preserve them.
258 This is also the only behaviour for 'strip'. */
259 static enum long_section_name_handling long_section_names = KEEP;
260
261 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
262 enum command_line_switch
263 {
264 OPTION_ADD_SECTION=150,
265 OPTION_CHANGE_ADDRESSES,
266 OPTION_CHANGE_LEADING_CHAR,
267 OPTION_CHANGE_START,
268 OPTION_CHANGE_SECTION_ADDRESS,
269 OPTION_CHANGE_SECTION_LMA,
270 OPTION_CHANGE_SECTION_VMA,
271 OPTION_CHANGE_WARNINGS,
272 OPTION_COMPRESS_DEBUG_SECTIONS,
273 OPTION_DEBUGGING,
274 OPTION_DECOMPRESS_DEBUG_SECTIONS,
275 OPTION_GAP_FILL,
276 OPTION_NO_CHANGE_WARNINGS,
277 OPTION_PAD_TO,
278 OPTION_REMOVE_LEADING_CHAR,
279 OPTION_SET_SECTION_FLAGS,
280 OPTION_SET_START,
281 OPTION_STRIP_UNNEEDED,
282 OPTION_WEAKEN,
283 OPTION_REDEFINE_SYM,
284 OPTION_REDEFINE_SYMS,
285 OPTION_SREC_LEN,
286 OPTION_SREC_FORCES3,
287 OPTION_STRIP_SYMBOLS,
288 OPTION_STRIP_UNNEEDED_SYMBOL,
289 OPTION_STRIP_UNNEEDED_SYMBOLS,
290 OPTION_KEEP_SYMBOLS,
291 OPTION_LOCALIZE_HIDDEN,
292 OPTION_LOCALIZE_SYMBOLS,
293 OPTION_LONG_SECTION_NAMES,
294 OPTION_GLOBALIZE_SYMBOL,
295 OPTION_GLOBALIZE_SYMBOLS,
296 OPTION_KEEPGLOBAL_SYMBOLS,
297 OPTION_WEAKEN_SYMBOLS,
298 OPTION_RENAME_SECTION,
299 OPTION_ALT_MACH_CODE,
300 OPTION_PREFIX_SYMBOLS,
301 OPTION_PREFIX_SECTIONS,
302 OPTION_PREFIX_ALLOC_SECTIONS,
303 OPTION_FORMATS_INFO,
304 OPTION_ADD_GNU_DEBUGLINK,
305 OPTION_ONLY_KEEP_DEBUG,
306 OPTION_KEEP_FILE_SYMBOLS,
307 OPTION_READONLY_TEXT,
308 OPTION_WRITABLE_TEXT,
309 OPTION_PURE,
310 OPTION_IMPURE,
311 OPTION_EXTRACT_SYMBOL,
312 OPTION_REVERSE_BYTES,
313 OPTION_FILE_ALIGNMENT,
314 OPTION_HEAP,
315 OPTION_IMAGE_BASE,
316 OPTION_SECTION_ALIGNMENT,
317 OPTION_STACK,
318 OPTION_INTERLEAVE_WIDTH,
319 OPTION_SUBSYSTEM,
320 OPTION_EXTRACT_DWO,
321 OPTION_STRIP_DWO
322 };
323
324 /* Options to handle if running as "strip". */
325
326 static struct option strip_options[] =
327 {
328 {"discard-all", no_argument, 0, 'x'},
329 {"discard-locals", no_argument, 0, 'X'},
330 {"enable-deterministic-archives", no_argument, 0, 'D'},
331 {"format", required_argument, 0, 'F'}, /* Obsolete */
332 {"help", no_argument, 0, 'h'},
333 {"info", no_argument, 0, OPTION_FORMATS_INFO},
334 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
335 {"input-target", required_argument, 0, 'I'},
336 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
337 {"keep-symbol", required_argument, 0, 'K'},
338 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
339 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
340 {"output-target", required_argument, 0, 'O'},
341 {"output-file", required_argument, 0, 'o'},
342 {"preserve-dates", no_argument, 0, 'p'},
343 {"remove-section", required_argument, 0, 'R'},
344 {"strip-all", no_argument, 0, 's'},
345 {"strip-debug", no_argument, 0, 'S'},
346 {"strip-dwo", no_argument, 0, OPTION_STRIP_DWO},
347 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
348 {"strip-symbol", required_argument, 0, 'N'},
349 {"target", required_argument, 0, 'F'},
350 {"verbose", no_argument, 0, 'v'},
351 {"version", no_argument, 0, 'V'},
352 {"wildcard", no_argument, 0, 'w'},
353 {0, no_argument, 0, 0}
354 };
355
356 /* Options to handle if running as "objcopy". */
357
358 static struct option copy_options[] =
359 {
360 {"add-gnu-debuglink", required_argument, 0, OPTION_ADD_GNU_DEBUGLINK},
361 {"add-section", required_argument, 0, OPTION_ADD_SECTION},
362 {"adjust-start", required_argument, 0, OPTION_CHANGE_START},
363 {"adjust-vma", required_argument, 0, OPTION_CHANGE_ADDRESSES},
364 {"adjust-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
365 {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
366 {"alt-machine-code", required_argument, 0, OPTION_ALT_MACH_CODE},
367 {"binary-architecture", required_argument, 0, 'B'},
368 {"byte", required_argument, 0, 'b'},
369 {"change-addresses", required_argument, 0, OPTION_CHANGE_ADDRESSES},
370 {"change-leading-char", no_argument, 0, OPTION_CHANGE_LEADING_CHAR},
371 {"change-section-address", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
372 {"change-section-lma", required_argument, 0, OPTION_CHANGE_SECTION_LMA},
373 {"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA},
374 {"change-start", required_argument, 0, OPTION_CHANGE_START},
375 {"change-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
376 {"compress-debug-sections", no_argument, 0, OPTION_COMPRESS_DEBUG_SECTIONS},
377 {"debugging", no_argument, 0, OPTION_DEBUGGING},
378 {"decompress-debug-sections", no_argument, 0, OPTION_DECOMPRESS_DEBUG_SECTIONS},
379 {"discard-all", no_argument, 0, 'x'},
380 {"discard-locals", no_argument, 0, 'X'},
381 {"enable-deterministic-archives", no_argument, 0, 'D'},
382 {"extract-dwo", no_argument, 0, OPTION_EXTRACT_DWO},
383 {"extract-symbol", no_argument, 0, OPTION_EXTRACT_SYMBOL},
384 {"format", required_argument, 0, 'F'}, /* Obsolete */
385 {"gap-fill", required_argument, 0, OPTION_GAP_FILL},
386 {"globalize-symbol", required_argument, 0, OPTION_GLOBALIZE_SYMBOL},
387 {"globalize-symbols", required_argument, 0, OPTION_GLOBALIZE_SYMBOLS},
388 {"help", no_argument, 0, 'h'},
389 {"impure", no_argument, 0, OPTION_IMPURE},
390 {"info", no_argument, 0, OPTION_FORMATS_INFO},
391 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
392 {"input-target", required_argument, 0, 'I'},
393 {"interleave", optional_argument, 0, 'i'},
394 {"interleave-width", required_argument, 0, OPTION_INTERLEAVE_WIDTH},
395 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
396 {"keep-global-symbol", required_argument, 0, 'G'},
397 {"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS},
398 {"keep-symbol", required_argument, 0, 'K'},
399 {"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS},
400 {"localize-hidden", no_argument, 0, OPTION_LOCALIZE_HIDDEN},
401 {"localize-symbol", required_argument, 0, 'L'},
402 {"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
403 {"long-section-names", required_argument, 0, OPTION_LONG_SECTION_NAMES},
404 {"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
405 {"no-change-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
406 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
407 {"only-section", required_argument, 0, 'j'},
408 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
409 {"output-target", required_argument, 0, 'O'},
410 {"pad-to", required_argument, 0, OPTION_PAD_TO},
411 {"prefix-symbols", required_argument, 0, OPTION_PREFIX_SYMBOLS},
412 {"prefix-sections", required_argument, 0, OPTION_PREFIX_SECTIONS},
413 {"prefix-alloc-sections", required_argument, 0, OPTION_PREFIX_ALLOC_SECTIONS},
414 {"preserve-dates", no_argument, 0, 'p'},
415 {"pure", no_argument, 0, OPTION_PURE},
416 {"readonly-text", no_argument, 0, OPTION_READONLY_TEXT},
417 {"redefine-sym", required_argument, 0, OPTION_REDEFINE_SYM},
418 {"redefine-syms", required_argument, 0, OPTION_REDEFINE_SYMS},
419 {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR},
420 {"remove-section", required_argument, 0, 'R'},
421 {"rename-section", required_argument, 0, OPTION_RENAME_SECTION},
422 {"reverse-bytes", required_argument, 0, OPTION_REVERSE_BYTES},
423 {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS},
424 {"set-start", required_argument, 0, OPTION_SET_START},
425 {"srec-len", required_argument, 0, OPTION_SREC_LEN},
426 {"srec-forceS3", no_argument, 0, OPTION_SREC_FORCES3},
427 {"strip-all", no_argument, 0, 'S'},
428 {"strip-debug", no_argument, 0, 'g'},
429 {"strip-dwo", no_argument, 0, OPTION_STRIP_DWO},
430 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
431 {"strip-unneeded-symbol", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOL},
432 {"strip-unneeded-symbols", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOLS},
433 {"strip-symbol", required_argument, 0, 'N'},
434 {"strip-symbols", required_argument, 0, OPTION_STRIP_SYMBOLS},
435 {"target", required_argument, 0, 'F'},
436 {"verbose", no_argument, 0, 'v'},
437 {"version", no_argument, 0, 'V'},
438 {"weaken", no_argument, 0, OPTION_WEAKEN},
439 {"weaken-symbol", required_argument, 0, 'W'},
440 {"weaken-symbols", required_argument, 0, OPTION_WEAKEN_SYMBOLS},
441 {"wildcard", no_argument, 0, 'w'},
442 {"writable-text", no_argument, 0, OPTION_WRITABLE_TEXT},
443 {"file-alignment", required_argument, 0, OPTION_FILE_ALIGNMENT},
444 {"heap", required_argument, 0, OPTION_HEAP},
445 {"image-base", required_argument, 0 , OPTION_IMAGE_BASE},
446 {"section-alignment", required_argument, 0, OPTION_SECTION_ALIGNMENT},
447 {"stack", required_argument, 0, OPTION_STACK},
448 {"subsystem", required_argument, 0, OPTION_SUBSYSTEM},
449 {0, no_argument, 0, 0}
450 };
451
452 /* IMPORTS */
453 extern char *program_name;
454
455 /* This flag distinguishes between strip and objcopy:
456 1 means this is 'strip'; 0 means this is 'objcopy'.
457 -1 means if we should use argv[0] to decide. */
458 extern int is_strip;
459
460 /* The maximum length of an S record. This variable is declared in srec.c
461 and can be modified by the --srec-len parameter. */
462 extern unsigned int Chunk;
463
464 /* Restrict the generation of Srecords to type S3 only.
465 This variable is declare in bfd/srec.c and can be toggled
466 on by the --srec-forceS3 command line switch. */
467 extern bfd_boolean S3Forced;
468
469 /* Forward declarations. */
470 static void setup_section (bfd *, asection *, void *);
471 static void setup_bfd_headers (bfd *, bfd *);
472 static void copy_relocations_in_section (bfd *, asection *, void *);
473 static void copy_section (bfd *, asection *, void *);
474 static void get_sections (bfd *, asection *, void *);
475 static int compare_section_lma (const void *, const void *);
476 static void mark_symbols_used_in_relocations (bfd *, asection *, void *);
477 static bfd_boolean write_debugging_info (bfd *, void *, long *, asymbol ***);
478 static const char *lookup_sym_redefinition (const char *);
479 \f
480 static void
481 copy_usage (FILE *stream, int exit_status)
482 {
483 fprintf (stream, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name);
484 fprintf (stream, _(" Copies a binary file, possibly transforming it in the process\n"));
485 fprintf (stream, _(" The options are:\n"));
486 fprintf (stream, _("\
487 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
488 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
489 -B --binary-architecture <arch> Set output arch, when input is arch-less\n\
490 -F --target <bfdname> Set both input and output format to <bfdname>\n\
491 --debugging Convert debugging information, if possible\n\
492 -p --preserve-dates Copy modified/access timestamps to the output\n\
493 -D --enable-deterministic-archives\n\
494 Produce deterministic output when stripping archives\n\
495 -j --only-section <name> Only copy section <name> into the output\n\
496 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
497 -R --remove-section <name> Remove section <name> from the output\n\
498 -S --strip-all Remove all symbol and relocation information\n\
499 -g --strip-debug Remove all debugging symbols & sections\n\
500 --strip-dwo Remove all DWO sections\n\
501 --strip-unneeded Remove all symbols not needed by relocations\n\
502 -N --strip-symbol <name> Do not copy symbol <name>\n\
503 --strip-unneeded-symbol <name>\n\
504 Do not copy symbol <name> unless needed by\n\
505 relocations\n\
506 --only-keep-debug Strip everything but the debug information\n\
507 --extract-dwo Copy only DWO sections\n\
508 --extract-symbol Remove section contents but keep symbols\n\
509 -K --keep-symbol <name> Do not strip symbol <name>\n\
510 --keep-file-symbols Do not strip file symbol(s)\n\
511 --localize-hidden Turn all ELF hidden symbols into locals\n\
512 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
513 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
514 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
515 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
516 --weaken Force all global symbols to be marked as weak\n\
517 -w --wildcard Permit wildcard in symbol comparison\n\
518 -x --discard-all Remove all non-global symbols\n\
519 -X --discard-locals Remove any compiler-generated symbols\n\
520 -i --interleave [<number>] Only copy N out of every <number> bytes\n\
521 --interleave-width <number> Set N for --interleave\n\
522 -b --byte <num> Select byte <num> in every interleaved block\n\
523 --gap-fill <val> Fill gaps between sections with <val>\n\
524 --pad-to <addr> Pad the last section up to address <addr>\n\
525 --set-start <addr> Set the start address to <addr>\n\
526 {--change-start|--adjust-start} <incr>\n\
527 Add <incr> to the start address\n\
528 {--change-addresses|--adjust-vma} <incr>\n\
529 Add <incr> to LMA, VMA and start addresses\n\
530 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
531 Change LMA and VMA of section <name> by <val>\n\
532 --change-section-lma <name>{=|+|-}<val>\n\
533 Change the LMA of section <name> by <val>\n\
534 --change-section-vma <name>{=|+|-}<val>\n\
535 Change the VMA of section <name> by <val>\n\
536 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
537 Warn if a named section does not exist\n\
538 --set-section-flags <name>=<flags>\n\
539 Set section <name>'s properties to <flags>\n\
540 --add-section <name>=<file> Add section <name> found in <file> to output\n\
541 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
542 --long-section-names {enable|disable|keep}\n\
543 Handle long section names in Coff objects.\n\
544 --change-leading-char Force output format's leading character style\n\
545 --remove-leading-char Remove leading character from global symbols\n\
546 --reverse-bytes=<num> Reverse <num> bytes at a time, in output sections with content\n\
547 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
548 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
549 listed in <file>\n\
550 --srec-len <number> Restrict the length of generated Srecords\n\
551 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
552 --strip-symbols <file> -N for all symbols listed in <file>\n\
553 --strip-unneeded-symbols <file>\n\
554 --strip-unneeded-symbol for all symbols listed\n\
555 in <file>\n\
556 --keep-symbols <file> -K for all symbols listed in <file>\n\
557 --localize-symbols <file> -L for all symbols listed in <file>\n\
558 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
559 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
560 --weaken-symbols <file> -W for all symbols listed in <file>\n\
561 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
562 --writable-text Mark the output text as writable\n\
563 --readonly-text Make the output text write protected\n\
564 --pure Mark the output file as demand paged\n\
565 --impure Mark the output file as impure\n\
566 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
567 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
568 --prefix-alloc-sections <prefix>\n\
569 Add <prefix> to start of every allocatable\n\
570 section name\n\
571 --file-alignment <num> Set PE file alignment to <num>\n\
572 --heap <reserve>[,<commit>] Set PE reserve/commit heap to <reserve>/\n\
573 <commit>\n\
574 --image-base <address> Set PE image base to <address>\n\
575 --section-alignment <num> Set PE section alignment to <num>\n\
576 --stack <reserve>[,<commit>] Set PE reserve/commit stack to <reserve>/\n\
577 <commit>\n\
578 --subsystem <name>[:<version>]\n\
579 Set PE subsystem to <name> [& <version>]\n\
580 --compress-debug-sections Compress DWARF debug sections using zlib\n\
581 --decompress-debug-sections Decompress DWARF debug sections using zlib\n\
582 -v --verbose List all object files modified\n\
583 @<file> Read options from <file>\n\
584 -V --version Display this program's version number\n\
585 -h --help Display this output\n\
586 --info List object formats & architectures supported\n\
587 "));
588 list_supported_targets (program_name, stream);
589 if (REPORT_BUGS_TO[0] && exit_status == 0)
590 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
591 exit (exit_status);
592 }
593
594 static void
595 strip_usage (FILE *stream, int exit_status)
596 {
597 fprintf (stream, _("Usage: %s <option(s)> in-file(s)\n"), program_name);
598 fprintf (stream, _(" Removes symbols and sections from files\n"));
599 fprintf (stream, _(" The options are:\n"));
600 fprintf (stream, _("\
601 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
602 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
603 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
604 -p --preserve-dates Copy modified/access timestamps to the output\n\
605 -D --enable-deterministic-archives\n\
606 Produce deterministic output when stripping archives\n\
607 -R --remove-section=<name> Remove section <name> from the output\n\
608 -s --strip-all Remove all symbol and relocation information\n\
609 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
610 --strip-dwo Remove all DWO sections\n\
611 --strip-unneeded Remove all symbols not needed by relocations\n\
612 --only-keep-debug Strip everything but the debug information\n\
613 -N --strip-symbol=<name> Do not copy symbol <name>\n\
614 -K --keep-symbol=<name> Do not strip symbol <name>\n\
615 --keep-file-symbols Do not strip file symbol(s)\n\
616 -w --wildcard Permit wildcard in symbol comparison\n\
617 -x --discard-all Remove all non-global symbols\n\
618 -X --discard-locals Remove any compiler-generated symbols\n\
619 -v --verbose List all object files modified\n\
620 -V --version Display this program's version number\n\
621 -h --help Display this output\n\
622 --info List object formats & architectures supported\n\
623 -o <file> Place stripped output into <file>\n\
624 "));
625
626 list_supported_targets (program_name, stream);
627 if (REPORT_BUGS_TO[0] && exit_status == 0)
628 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
629 exit (exit_status);
630 }
631
632 /* Parse section flags into a flagword, with a fatal error if the
633 string can't be parsed. */
634
635 static flagword
636 parse_flags (const char *s)
637 {
638 flagword ret;
639 const char *snext;
640 int len;
641
642 ret = SEC_NO_FLAGS;
643
644 do
645 {
646 snext = strchr (s, ',');
647 if (snext == NULL)
648 len = strlen (s);
649 else
650 {
651 len = snext - s;
652 ++snext;
653 }
654
655 if (0) ;
656 #define PARSE_FLAG(fname,fval) \
657 else if (strncasecmp (fname, s, len) == 0) ret |= fval
658 PARSE_FLAG ("alloc", SEC_ALLOC);
659 PARSE_FLAG ("load", SEC_LOAD);
660 PARSE_FLAG ("noload", SEC_NEVER_LOAD);
661 PARSE_FLAG ("readonly", SEC_READONLY);
662 PARSE_FLAG ("debug", SEC_DEBUGGING);
663 PARSE_FLAG ("code", SEC_CODE);
664 PARSE_FLAG ("data", SEC_DATA);
665 PARSE_FLAG ("rom", SEC_ROM);
666 PARSE_FLAG ("share", SEC_COFF_SHARED);
667 PARSE_FLAG ("contents", SEC_HAS_CONTENTS);
668 #undef PARSE_FLAG
669 else
670 {
671 char *copy;
672
673 copy = (char *) xmalloc (len + 1);
674 strncpy (copy, s, len);
675 copy[len] = '\0';
676 non_fatal (_("unrecognized section flag `%s'"), copy);
677 fatal (_("supported flags: %s"),
678 "alloc, load, noload, readonly, debug, code, data, rom, share, contents");
679 }
680
681 s = snext;
682 }
683 while (s != NULL);
684
685 return ret;
686 }
687
688 /* Find and optionally add an entry in the change_sections list. */
689
690 static struct section_list *
691 find_section_list (const char *name, bfd_boolean add)
692 {
693 struct section_list *p;
694
695 for (p = change_sections; p != NULL; p = p->next)
696 if (strcmp (p->name, name) == 0)
697 return p;
698
699 if (! add)
700 return NULL;
701
702 p = (struct section_list *) xmalloc (sizeof (struct section_list));
703 p->name = name;
704 p->used = FALSE;
705 p->remove = FALSE;
706 p->copy = FALSE;
707 p->change_vma = CHANGE_IGNORE;
708 p->change_lma = CHANGE_IGNORE;
709 p->vma_val = 0;
710 p->lma_val = 0;
711 p->set_flags = FALSE;
712 p->flags = 0;
713
714 p->next = change_sections;
715 change_sections = p;
716
717 return p;
718 }
719
720 /* There is htab_hash_string but no htab_eq_string. Makes sense. */
721
722 static int
723 eq_string (const void *s1, const void *s2)
724 {
725 return strcmp ((const char *) s1, (const char *) s2) == 0;
726 }
727
728 static htab_t
729 create_symbol_htab (void)
730 {
731 return htab_create_alloc (16, htab_hash_string, eq_string, NULL, xcalloc, free);
732 }
733
734 static void
735 create_symbol_htabs (void)
736 {
737 strip_specific_htab = create_symbol_htab ();
738 strip_unneeded_htab = create_symbol_htab ();
739 keep_specific_htab = create_symbol_htab ();
740 localize_specific_htab = create_symbol_htab ();
741 globalize_specific_htab = create_symbol_htab ();
742 keepglobal_specific_htab = create_symbol_htab ();
743 weaken_specific_htab = create_symbol_htab ();
744 }
745
746 /* Add a symbol to strip_specific_list. */
747
748 static void
749 add_specific_symbol (const char *name, htab_t htab)
750 {
751 *htab_find_slot (htab, name, INSERT) = (char *) name;
752 }
753
754 /* Add symbols listed in `filename' to strip_specific_list. */
755
756 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
757 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
758
759 static void
760 add_specific_symbols (const char *filename, htab_t htab)
761 {
762 off_t size;
763 FILE * f;
764 char * line;
765 char * buffer;
766 unsigned int line_count;
767
768 size = get_file_size (filename);
769 if (size == 0)
770 {
771 status = 1;
772 return;
773 }
774
775 buffer = (char *) xmalloc (size + 2);
776 f = fopen (filename, FOPEN_RT);
777 if (f == NULL)
778 fatal (_("cannot open '%s': %s"), filename, strerror (errno));
779
780 if (fread (buffer, 1, size, f) == 0 || ferror (f))
781 fatal (_("%s: fread failed"), filename);
782
783 fclose (f);
784 buffer [size] = '\n';
785 buffer [size + 1] = '\0';
786
787 line_count = 1;
788
789 for (line = buffer; * line != '\0'; line ++)
790 {
791 char * eol;
792 char * name;
793 char * name_end;
794 int finished = FALSE;
795
796 for (eol = line;; eol ++)
797 {
798 switch (* eol)
799 {
800 case '\n':
801 * eol = '\0';
802 /* Cope with \n\r. */
803 if (eol[1] == '\r')
804 ++ eol;
805 finished = TRUE;
806 break;
807
808 case '\r':
809 * eol = '\0';
810 /* Cope with \r\n. */
811 if (eol[1] == '\n')
812 ++ eol;
813 finished = TRUE;
814 break;
815
816 case 0:
817 finished = TRUE;
818 break;
819
820 case '#':
821 /* Line comment, Terminate the line here, in case a
822 name is present and then allow the rest of the
823 loop to find the real end of the line. */
824 * eol = '\0';
825 break;
826
827 default:
828 break;
829 }
830
831 if (finished)
832 break;
833 }
834
835 /* A name may now exist somewhere between 'line' and 'eol'.
836 Strip off leading whitespace and trailing whitespace,
837 then add it to the list. */
838 for (name = line; IS_WHITESPACE (* name); name ++)
839 ;
840 for (name_end = name;
841 (! IS_WHITESPACE (* name_end))
842 && (! IS_LINE_TERMINATOR (* name_end));
843 name_end ++)
844 ;
845
846 if (! IS_LINE_TERMINATOR (* name_end))
847 {
848 char * extra;
849
850 for (extra = name_end + 1; IS_WHITESPACE (* extra); extra ++)
851 ;
852
853 if (! IS_LINE_TERMINATOR (* extra))
854 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
855 filename, line_count);
856 }
857
858 * name_end = '\0';
859
860 if (name_end > name)
861 add_specific_symbol (name, htab);
862
863 /* Advance line pointer to end of line. The 'eol ++' in the for
864 loop above will then advance us to the start of the next line. */
865 line = eol;
866 line_count ++;
867 }
868 }
869
870 /* See whether a symbol should be stripped or kept
871 based on strip_specific_list and keep_symbols. */
872
873 static int
874 is_specified_symbol_predicate (void **slot, void *data)
875 {
876 struct is_specified_symbol_predicate_data *d =
877 (struct is_specified_symbol_predicate_data *) data;
878 const char *slot_name = (char *) *slot;
879
880 if (*slot_name != '!')
881 {
882 if (! fnmatch (slot_name, d->name, 0))
883 {
884 d->found = TRUE;
885 /* Stop traversal. */
886 return 0;
887 }
888 }
889 else
890 {
891 if (fnmatch (slot_name + 1, d->name, 0))
892 {
893 d->found = TRUE;
894 /* Stop traversal. */
895 return 0;
896 }
897 }
898
899 /* Continue traversal. */
900 return 1;
901 }
902
903 static bfd_boolean
904 is_specified_symbol (const char *name, htab_t htab)
905 {
906 if (wildcard)
907 {
908 struct is_specified_symbol_predicate_data data;
909
910 data.name = name;
911 data.found = FALSE;
912
913 htab_traverse (htab, is_specified_symbol_predicate, &data);
914
915 return data.found;
916 }
917
918 return htab_find (htab, name) != NULL;
919 }
920
921 /* Return a pointer to the symbol used as a signature for GROUP. */
922
923 static asymbol *
924 group_signature (asection *group)
925 {
926 bfd *abfd = group->owner;
927 Elf_Internal_Shdr *ghdr;
928
929 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
930 return NULL;
931
932 ghdr = &elf_section_data (group)->this_hdr;
933 if (ghdr->sh_link < elf_numsections (abfd))
934 {
935 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
936 Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link];
937
938 if (symhdr->sh_type == SHT_SYMTAB
939 && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym)
940 return isympp[ghdr->sh_info - 1];
941 }
942 return NULL;
943 }
944
945 /* Return TRUE if the section is a DWO section. */
946
947 static bfd_boolean
948 is_dwo_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
949 {
950 const char *name = bfd_get_section_name (abfd, sec);
951 int len = strlen (name);
952
953 return strncmp (name + len - 4, ".dwo", 4) == 0;
954 }
955
956 /* See if a non-group section is being removed. */
957
958 static bfd_boolean
959 is_strip_section_1 (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
960 {
961 if (sections_removed || sections_copied)
962 {
963 struct section_list *p;
964
965 p = find_section_list (bfd_get_section_name (abfd, sec), FALSE);
966
967 if (sections_removed && p != NULL && p->remove)
968 return TRUE;
969 if (sections_copied && (p == NULL || ! p->copy))
970 return TRUE;
971 }
972
973 if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
974 {
975 if (strip_symbols == STRIP_DEBUG
976 || strip_symbols == STRIP_UNNEEDED
977 || strip_symbols == STRIP_ALL
978 || discard_locals == LOCALS_ALL
979 || convert_debugging)
980 return TRUE;
981
982 if (strip_symbols == STRIP_DWO)
983 return is_dwo_section (abfd, sec);
984
985 if (strip_symbols == STRIP_NONDEBUG)
986 return FALSE;
987 }
988
989 if (strip_symbols == STRIP_NONDWO)
990 return !is_dwo_section (abfd, sec);
991
992 return FALSE;
993 }
994
995 /* See if a section is being removed. */
996
997 static bfd_boolean
998 is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
999 {
1000 if (is_strip_section_1 (abfd, sec))
1001 return TRUE;
1002
1003 if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0)
1004 {
1005 asymbol *gsym;
1006 const char *gname;
1007 asection *elt, *first;
1008
1009 /* PR binutils/3181
1010 If we are going to strip the group signature symbol, then
1011 strip the group section too. */
1012 gsym = group_signature (sec);
1013 if (gsym != NULL)
1014 gname = gsym->name;
1015 else
1016 gname = sec->name;
1017 if ((strip_symbols == STRIP_ALL
1018 && !is_specified_symbol (gname, keep_specific_htab))
1019 || is_specified_symbol (gname, strip_specific_htab))
1020 return TRUE;
1021
1022 /* Remove the group section if all members are removed. */
1023 first = elt = elf_next_in_group (sec);
1024 while (elt != NULL)
1025 {
1026 if (!is_strip_section_1 (abfd, elt))
1027 return FALSE;
1028 elt = elf_next_in_group (elt);
1029 if (elt == first)
1030 break;
1031 }
1032
1033 return TRUE;
1034 }
1035
1036 return FALSE;
1037 }
1038
1039 /* Return true if SYM is a hidden symbol. */
1040
1041 static bfd_boolean
1042 is_hidden_symbol (asymbol *sym)
1043 {
1044 elf_symbol_type *elf_sym;
1045
1046 elf_sym = elf_symbol_from (sym->the_bfd, sym);
1047 if (elf_sym != NULL)
1048 switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
1049 {
1050 case STV_HIDDEN:
1051 case STV_INTERNAL:
1052 return TRUE;
1053 }
1054 return FALSE;
1055 }
1056
1057 /* Choose which symbol entries to copy; put the result in OSYMS.
1058 We don't copy in place, because that confuses the relocs.
1059 Return the number of symbols to print. */
1060
1061 static unsigned int
1062 filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
1063 asymbol **isyms, long symcount)
1064 {
1065 asymbol **from = isyms, **to = osyms;
1066 long src_count = 0, dst_count = 0;
1067 int relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
1068
1069 for (; src_count < symcount; src_count++)
1070 {
1071 asymbol *sym = from[src_count];
1072 flagword flags = sym->flags;
1073 char *name = (char *) bfd_asymbol_name (sym);
1074 bfd_boolean keep;
1075 bfd_boolean used_in_reloc = FALSE;
1076 bfd_boolean undefined;
1077 bfd_boolean rem_leading_char;
1078 bfd_boolean add_leading_char;
1079
1080 undefined = bfd_is_und_section (bfd_get_section (sym));
1081
1082 if (redefine_sym_list)
1083 {
1084 char *old_name, *new_name;
1085
1086 old_name = (char *) bfd_asymbol_name (sym);
1087 new_name = (char *) lookup_sym_redefinition (old_name);
1088 bfd_asymbol_name (sym) = new_name;
1089 name = new_name;
1090 }
1091
1092 /* Check if we will remove the current leading character. */
1093 rem_leading_char =
1094 (name[0] == bfd_get_symbol_leading_char (abfd))
1095 && (change_leading_char
1096 || (remove_leading_char
1097 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1098 || undefined
1099 || bfd_is_com_section (bfd_get_section (sym)))));
1100
1101 /* Check if we will add a new leading character. */
1102 add_leading_char =
1103 change_leading_char
1104 && (bfd_get_symbol_leading_char (obfd) != '\0')
1105 && (bfd_get_symbol_leading_char (abfd) == '\0'
1106 || (name[0] == bfd_get_symbol_leading_char (abfd)));
1107
1108 /* Short circuit for change_leading_char if we can do it in-place. */
1109 if (rem_leading_char && add_leading_char && !prefix_symbols_string)
1110 {
1111 name[0] = bfd_get_symbol_leading_char (obfd);
1112 bfd_asymbol_name (sym) = name;
1113 rem_leading_char = FALSE;
1114 add_leading_char = FALSE;
1115 }
1116
1117 /* Remove leading char. */
1118 if (rem_leading_char)
1119 bfd_asymbol_name (sym) = ++name;
1120
1121 /* Add new leading char and/or prefix. */
1122 if (add_leading_char || prefix_symbols_string)
1123 {
1124 char *n, *ptr;
1125
1126 ptr = n = (char *) xmalloc (1 + strlen (prefix_symbols_string)
1127 + strlen (name) + 1);
1128 if (add_leading_char)
1129 *ptr++ = bfd_get_symbol_leading_char (obfd);
1130
1131 if (prefix_symbols_string)
1132 {
1133 strcpy (ptr, prefix_symbols_string);
1134 ptr += strlen (prefix_symbols_string);
1135 }
1136
1137 strcpy (ptr, name);
1138 bfd_asymbol_name (sym) = n;
1139 name = n;
1140 }
1141
1142 if (strip_symbols == STRIP_ALL)
1143 keep = FALSE;
1144 else if ((flags & BSF_KEEP) != 0 /* Used in relocation. */
1145 || ((flags & BSF_SECTION_SYM) != 0
1146 && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
1147 & BSF_KEEP) != 0))
1148 {
1149 keep = TRUE;
1150 used_in_reloc = TRUE;
1151 }
1152 else if (relocatable /* Relocatable file. */
1153 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1154 || bfd_is_com_section (bfd_get_section (sym))))
1155 keep = TRUE;
1156 else if (bfd_decode_symclass (sym) == 'I')
1157 /* Global symbols in $idata sections need to be retained
1158 even if relocatable is FALSE. External users of the
1159 library containing the $idata section may reference these
1160 symbols. */
1161 keep = TRUE;
1162 else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */
1163 || (flags & BSF_WEAK) != 0
1164 || undefined
1165 || bfd_is_com_section (bfd_get_section (sym)))
1166 keep = strip_symbols != STRIP_UNNEEDED;
1167 else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */
1168 keep = (strip_symbols != STRIP_DEBUG
1169 && strip_symbols != STRIP_UNNEEDED
1170 && ! convert_debugging);
1171 else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym)))
1172 /* COMDAT sections store special information in local
1173 symbols, so we cannot risk stripping any of them. */
1174 keep = TRUE;
1175 else /* Local symbol. */
1176 keep = (strip_symbols != STRIP_UNNEEDED
1177 && (discard_locals != LOCALS_ALL
1178 && (discard_locals != LOCALS_START_L
1179 || ! bfd_is_local_label (abfd, sym))));
1180
1181 if (keep && is_specified_symbol (name, strip_specific_htab))
1182 {
1183 /* There are multiple ways to set 'keep' above, but if it
1184 was the relocatable symbol case, then that's an error. */
1185 if (used_in_reloc)
1186 {
1187 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name);
1188 status = 1;
1189 }
1190 else
1191 keep = FALSE;
1192 }
1193
1194 if (keep
1195 && !(flags & BSF_KEEP)
1196 && is_specified_symbol (name, strip_unneeded_htab))
1197 keep = FALSE;
1198
1199 if (!keep
1200 && ((keep_file_symbols && (flags & BSF_FILE))
1201 || is_specified_symbol (name, keep_specific_htab)))
1202 keep = TRUE;
1203
1204 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
1205 keep = FALSE;
1206
1207 if (keep)
1208 {
1209 if ((flags & BSF_GLOBAL) != 0
1210 && (weaken || is_specified_symbol (name, weaken_specific_htab)))
1211 {
1212 sym->flags &= ~ BSF_GLOBAL;
1213 sym->flags |= BSF_WEAK;
1214 }
1215
1216 if (!undefined
1217 && (flags & (BSF_GLOBAL | BSF_WEAK))
1218 && (is_specified_symbol (name, localize_specific_htab)
1219 || (htab_elements (keepglobal_specific_htab) != 0
1220 && ! is_specified_symbol (name, keepglobal_specific_htab))
1221 || (localize_hidden && is_hidden_symbol (sym))))
1222 {
1223 sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
1224 sym->flags |= BSF_LOCAL;
1225 }
1226
1227 if (!undefined
1228 && (flags & BSF_LOCAL)
1229 && is_specified_symbol (name, globalize_specific_htab))
1230 {
1231 sym->flags &= ~ BSF_LOCAL;
1232 sym->flags |= BSF_GLOBAL;
1233 }
1234
1235 to[dst_count++] = sym;
1236 }
1237 }
1238
1239 to[dst_count] = NULL;
1240
1241 return dst_count;
1242 }
1243
1244 /* Find the redefined name of symbol SOURCE. */
1245
1246 static const char *
1247 lookup_sym_redefinition (const char *source)
1248 {
1249 struct redefine_node *list;
1250
1251 for (list = redefine_sym_list; list != NULL; list = list->next)
1252 if (strcmp (source, list->source) == 0)
1253 return list->target;
1254
1255 return source;
1256 }
1257
1258 /* Add a node to a symbol redefine list. */
1259
1260 static void
1261 redefine_list_append (const char *cause, const char *source, const char *target)
1262 {
1263 struct redefine_node **p;
1264 struct redefine_node *list;
1265 struct redefine_node *new_node;
1266
1267 for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next)
1268 {
1269 if (strcmp (source, list->source) == 0)
1270 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1271 cause, source);
1272
1273 if (strcmp (target, list->target) == 0)
1274 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1275 cause, target);
1276 }
1277
1278 new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node));
1279
1280 new_node->source = strdup (source);
1281 new_node->target = strdup (target);
1282 new_node->next = NULL;
1283
1284 *p = new_node;
1285 }
1286
1287 /* Handle the --redefine-syms option. Read lines containing "old new"
1288 from the file, and add them to the symbol redefine list. */
1289
1290 static void
1291 add_redefine_syms_file (const char *filename)
1292 {
1293 FILE *file;
1294 char *buf;
1295 size_t bufsize;
1296 size_t len;
1297 size_t outsym_off;
1298 int c, lineno;
1299
1300 file = fopen (filename, "r");
1301 if (file == NULL)
1302 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1303 filename, strerror (errno));
1304
1305 bufsize = 100;
1306 buf = (char *) xmalloc (bufsize + 1 /* For the terminating NUL. */);
1307
1308 lineno = 1;
1309 c = getc (file);
1310 len = 0;
1311 outsym_off = 0;
1312 while (c != EOF)
1313 {
1314 /* Collect the input symbol name. */
1315 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1316 {
1317 if (c == '#')
1318 goto comment;
1319 buf[len++] = c;
1320 if (len >= bufsize)
1321 {
1322 bufsize *= 2;
1323 buf = (char *) xrealloc (buf, bufsize + 1);
1324 }
1325 c = getc (file);
1326 }
1327 buf[len++] = '\0';
1328 if (c == EOF)
1329 break;
1330
1331 /* Eat white space between the symbol names. */
1332 while (IS_WHITESPACE (c))
1333 c = getc (file);
1334 if (c == '#' || IS_LINE_TERMINATOR (c))
1335 goto comment;
1336 if (c == EOF)
1337 break;
1338
1339 /* Collect the output symbol name. */
1340 outsym_off = len;
1341 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1342 {
1343 if (c == '#')
1344 goto comment;
1345 buf[len++] = c;
1346 if (len >= bufsize)
1347 {
1348 bufsize *= 2;
1349 buf = (char *) xrealloc (buf, bufsize + 1);
1350 }
1351 c = getc (file);
1352 }
1353 buf[len++] = '\0';
1354 if (c == EOF)
1355 break;
1356
1357 /* Eat white space at end of line. */
1358 while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c))
1359 c = getc (file);
1360 if (c == '#')
1361 goto comment;
1362 /* Handle \r\n. */
1363 if ((c == '\r' && (c = getc (file)) == '\n')
1364 || c == '\n' || c == EOF)
1365 {
1366 end_of_line:
1367 /* Append the redefinition to the list. */
1368 if (buf[0] != '\0')
1369 redefine_list_append (filename, &buf[0], &buf[outsym_off]);
1370
1371 lineno++;
1372 len = 0;
1373 outsym_off = 0;
1374 if (c == EOF)
1375 break;
1376 c = getc (file);
1377 continue;
1378 }
1379 else
1380 fatal (_("%s:%d: garbage found at end of line"), filename, lineno);
1381 comment:
1382 if (len != 0 && (outsym_off == 0 || outsym_off == len))
1383 fatal (_("%s:%d: missing new symbol name"), filename, lineno);
1384 buf[len++] = '\0';
1385
1386 /* Eat the rest of the line and finish it. */
1387 while (c != '\n' && c != EOF)
1388 c = getc (file);
1389 goto end_of_line;
1390 }
1391
1392 if (len != 0)
1393 fatal (_("%s:%d: premature end of file"), filename, lineno);
1394
1395 free (buf);
1396 }
1397
1398 /* Copy unkown object file IBFD onto OBFD.
1399 Returns TRUE upon success, FALSE otherwise. */
1400
1401 static bfd_boolean
1402 copy_unknown_object (bfd *ibfd, bfd *obfd)
1403 {
1404 char *cbuf;
1405 int tocopy;
1406 long ncopied;
1407 long size;
1408 struct stat buf;
1409
1410 if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1411 {
1412 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1413 return FALSE;
1414 }
1415
1416 size = buf.st_size;
1417 if (size < 0)
1418 {
1419 non_fatal (_("stat returns negative size for `%s'"),
1420 bfd_get_archive_filename (ibfd));
1421 return FALSE;
1422 }
1423
1424 if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1425 {
1426 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1427 return FALSE;
1428 }
1429
1430 if (verbose)
1431 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1432 bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1433
1434 cbuf = (char *) xmalloc (BUFSIZE);
1435 ncopied = 0;
1436 while (ncopied < size)
1437 {
1438 tocopy = size - ncopied;
1439 if (tocopy > BUFSIZE)
1440 tocopy = BUFSIZE;
1441
1442 if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1443 != (bfd_size_type) tocopy)
1444 {
1445 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1446 free (cbuf);
1447 return FALSE;
1448 }
1449
1450 if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1451 != (bfd_size_type) tocopy)
1452 {
1453 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1454 free (cbuf);
1455 return FALSE;
1456 }
1457
1458 ncopied += tocopy;
1459 }
1460
1461 /* We should at least to be able to read it back when copying an
1462 unknown object in an archive. */
1463 chmod (bfd_get_filename (obfd), buf.st_mode | S_IRUSR);
1464 free (cbuf);
1465 return TRUE;
1466 }
1467
1468 /* Copy object file IBFD onto OBFD.
1469 Returns TRUE upon success, FALSE otherwise. */
1470
1471 static bfd_boolean
1472 copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
1473 {
1474 bfd_vma start;
1475 long symcount;
1476 asection **osections = NULL;
1477 asection *gnu_debuglink_section = NULL;
1478 bfd_size_type *gaps = NULL;
1479 bfd_size_type max_gap = 0;
1480 long symsize;
1481 void *dhandle;
1482 enum bfd_architecture iarch;
1483 unsigned int imach;
1484
1485 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1486 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
1487 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
1488 fatal (_("Unable to change endianness of input file(s)"));
1489
1490 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1491 {
1492 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1493 return FALSE;
1494 }
1495
1496 if (verbose)
1497 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
1498 bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
1499 bfd_get_filename (obfd), bfd_get_target (obfd));
1500
1501 if (extract_symbol)
1502 start = 0;
1503 else
1504 {
1505 if (set_start_set)
1506 start = set_start;
1507 else
1508 start = bfd_get_start_address (ibfd);
1509 start += change_start;
1510 }
1511
1512 /* Neither the start address nor the flags
1513 need to be set for a core file. */
1514 if (bfd_get_format (obfd) != bfd_core)
1515 {
1516 flagword flags;
1517
1518 flags = bfd_get_file_flags (ibfd);
1519 flags |= bfd_flags_to_set;
1520 flags &= ~bfd_flags_to_clear;
1521 flags &= bfd_applicable_file_flags (obfd);
1522
1523 if (strip_symbols == STRIP_ALL)
1524 flags &= ~HAS_RELOC;
1525
1526 if (!bfd_set_start_address (obfd, start)
1527 || !bfd_set_file_flags (obfd, flags))
1528 {
1529 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1530 return FALSE;
1531 }
1532 }
1533
1534 /* Copy architecture of input file to output file. */
1535 iarch = bfd_get_arch (ibfd);
1536 imach = bfd_get_mach (ibfd);
1537 if (input_arch)
1538 {
1539 if (bfd_get_arch_info (ibfd) == NULL
1540 || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown)
1541 {
1542 iarch = input_arch->arch;
1543 imach = input_arch->mach;
1544 }
1545 else
1546 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
1547 bfd_get_archive_filename (ibfd));
1548 }
1549 if (!bfd_set_arch_mach (obfd, iarch, imach)
1550 && (ibfd->target_defaulted
1551 || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
1552 {
1553 if (bfd_get_arch (ibfd) == bfd_arch_unknown)
1554 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1555 bfd_get_archive_filename (ibfd));
1556 else
1557 non_fatal (_("Output file cannot represent architecture `%s'"),
1558 bfd_printable_arch_mach (bfd_get_arch (ibfd),
1559 bfd_get_mach (ibfd)));
1560 return FALSE;
1561 }
1562
1563 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
1564 {
1565 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1566 return FALSE;
1567 }
1568
1569 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
1570 && bfd_pei_p (obfd))
1571 {
1572 /* Set up PE parameters. */
1573 pe_data_type *pe = pe_data (obfd);
1574
1575 /* Copy PE parameters before changing them. */
1576 if (ibfd->xvec->flavour == bfd_target_coff_flavour
1577 && bfd_pei_p (ibfd))
1578 pe->pe_opthdr = pe_data (ibfd)->pe_opthdr;
1579
1580 if (pe_file_alignment != (bfd_vma) -1)
1581 pe->pe_opthdr.FileAlignment = pe_file_alignment;
1582 else
1583 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
1584
1585 if (pe_heap_commit != (bfd_vma) -1)
1586 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_commit;
1587
1588 if (pe_heap_reserve != (bfd_vma) -1)
1589 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_reserve;
1590
1591 if (pe_image_base != (bfd_vma) -1)
1592 pe->pe_opthdr.ImageBase = pe_image_base;
1593
1594 if (pe_section_alignment != (bfd_vma) -1)
1595 pe->pe_opthdr.SectionAlignment = pe_section_alignment;
1596 else
1597 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
1598
1599 if (pe_stack_commit != (bfd_vma) -1)
1600 pe->pe_opthdr.SizeOfStackCommit = pe_stack_commit;
1601
1602 if (pe_stack_reserve != (bfd_vma) -1)
1603 pe->pe_opthdr.SizeOfStackCommit = pe_stack_reserve;
1604
1605 if (pe_subsystem != -1)
1606 pe->pe_opthdr.Subsystem = pe_subsystem;
1607
1608 if (pe_major_subsystem_version != -1)
1609 pe->pe_opthdr.MajorSubsystemVersion = pe_major_subsystem_version;
1610
1611 if (pe_minor_subsystem_version != -1)
1612 pe->pe_opthdr.MinorSubsystemVersion = pe_minor_subsystem_version;
1613
1614 if (pe_file_alignment > pe_section_alignment)
1615 {
1616 char file_alignment[20], section_alignment[20];
1617
1618 sprintf_vma (file_alignment, pe_file_alignment);
1619 sprintf_vma (section_alignment, pe_section_alignment);
1620 non_fatal (_("warning: file alignment (0x%s) > section alignment (0x%s)"),
1621
1622 file_alignment, section_alignment);
1623 }
1624 }
1625
1626 if (isympp)
1627 free (isympp);
1628
1629 if (osympp != isympp)
1630 free (osympp);
1631
1632 isympp = NULL;
1633 osympp = NULL;
1634
1635 symsize = bfd_get_symtab_upper_bound (ibfd);
1636 if (symsize < 0)
1637 {
1638 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1639 return FALSE;
1640 }
1641
1642 osympp = isympp = (asymbol **) xmalloc (symsize);
1643 symcount = bfd_canonicalize_symtab (ibfd, isympp);
1644 if (symcount < 0)
1645 {
1646 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1647 return FALSE;
1648 }
1649
1650 /* BFD mandates that all output sections be created and sizes set before
1651 any output is done. Thus, we traverse all sections multiple times. */
1652 bfd_map_over_sections (ibfd, setup_section, obfd);
1653
1654 if (!extract_symbol)
1655 setup_bfd_headers (ibfd, obfd);
1656
1657 if (add_sections != NULL)
1658 {
1659 struct section_add *padd;
1660 struct section_list *pset;
1661
1662 for (padd = add_sections; padd != NULL; padd = padd->next)
1663 {
1664 flagword flags;
1665
1666 pset = find_section_list (padd->name, FALSE);
1667 if (pset != NULL)
1668 pset->used = TRUE;
1669
1670 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
1671 if (pset != NULL && pset->set_flags)
1672 flags = pset->flags | SEC_HAS_CONTENTS;
1673
1674 /* bfd_make_section_with_flags() does not return very helpful
1675 error codes, so check for the most likely user error first. */
1676 if (bfd_get_section_by_name (obfd, padd->name))
1677 {
1678 bfd_nonfatal_message (NULL, obfd, NULL,
1679 _("can't add section '%s'"), padd->name);
1680 return FALSE;
1681 }
1682 else
1683 {
1684 /* We use LINKER_CREATED here so that the backend hooks
1685 will create any special section type information,
1686 instead of presuming we know what we're doing merely
1687 because we set the flags. */
1688 padd->section = bfd_make_section_with_flags
1689 (obfd, padd->name, flags | SEC_LINKER_CREATED);
1690 if (padd->section == NULL)
1691 {
1692 bfd_nonfatal_message (NULL, obfd, NULL,
1693 _("can't create section `%s'"),
1694 padd->name);
1695 return FALSE;
1696 }
1697 }
1698
1699 if (! bfd_set_section_size (obfd, padd->section, padd->size))
1700 {
1701 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1702 return FALSE;
1703 }
1704
1705 if (pset != NULL)
1706 {
1707 if (pset->change_vma != CHANGE_IGNORE)
1708 if (! bfd_set_section_vma (obfd, padd->section,
1709 pset->vma_val))
1710 {
1711 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1712 return FALSE;
1713 }
1714
1715 if (pset->change_lma != CHANGE_IGNORE)
1716 {
1717 padd->section->lma = pset->lma_val;
1718
1719 if (! bfd_set_section_alignment
1720 (obfd, padd->section,
1721 bfd_section_alignment (obfd, padd->section)))
1722 {
1723 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1724 return FALSE;
1725 }
1726 }
1727 }
1728 }
1729 }
1730
1731 if (gnu_debuglink_filename != NULL)
1732 {
1733 gnu_debuglink_section = bfd_create_gnu_debuglink_section
1734 (obfd, gnu_debuglink_filename);
1735
1736 if (gnu_debuglink_section == NULL)
1737 {
1738 bfd_nonfatal_message (NULL, obfd, NULL,
1739 _("cannot create debug link section `%s'"),
1740 gnu_debuglink_filename);
1741 return FALSE;
1742 }
1743
1744 /* Special processing for PE format files. We
1745 have no way to distinguish PE from COFF here. */
1746 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour)
1747 {
1748 bfd_vma debuglink_vma;
1749 asection * highest_section;
1750 asection * sec;
1751
1752 /* The PE spec requires that all sections be adjacent and sorted
1753 in ascending order of VMA. It also specifies that debug
1754 sections should be last. This is despite the fact that debug
1755 sections are not loaded into memory and so in theory have no
1756 use for a VMA.
1757
1758 This means that the debuglink section must be given a non-zero
1759 VMA which makes it contiguous with other debug sections. So
1760 walk the current section list, find the section with the
1761 highest VMA and start the debuglink section after that one. */
1762 for (sec = obfd->sections, highest_section = NULL;
1763 sec != NULL;
1764 sec = sec->next)
1765 if (sec->vma > 0
1766 && (highest_section == NULL
1767 || sec->vma > highest_section->vma))
1768 highest_section = sec;
1769
1770 if (highest_section)
1771 debuglink_vma = BFD_ALIGN (highest_section->vma
1772 + highest_section->size,
1773 /* FIXME: We ought to be using
1774 COFF_PAGE_SIZE here or maybe
1775 bfd_get_section_alignment() (if it
1776 was set) but since this is for PE
1777 and we know the required alignment
1778 it is easier just to hard code it. */
1779 0x1000);
1780 else
1781 /* Umm, not sure what to do in this case. */
1782 debuglink_vma = 0x1000;
1783
1784 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
1785 }
1786 }
1787
1788 if (bfd_count_sections (obfd) != 0
1789 && (gap_fill_set || pad_to_set))
1790 {
1791 asection **set;
1792 unsigned int c, i;
1793
1794 /* We must fill in gaps between the sections and/or we must pad
1795 the last section to a specified address. We do this by
1796 grabbing a list of the sections, sorting them by VMA, and
1797 increasing the section sizes as required to fill the gaps.
1798 We write out the gap contents below. */
1799
1800 c = bfd_count_sections (obfd);
1801 osections = (asection **) xmalloc (c * sizeof (asection *));
1802 set = osections;
1803 bfd_map_over_sections (obfd, get_sections, &set);
1804
1805 qsort (osections, c, sizeof (asection *), compare_section_lma);
1806
1807 gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type));
1808 memset (gaps, 0, c * sizeof (bfd_size_type));
1809
1810 if (gap_fill_set)
1811 {
1812 for (i = 0; i < c - 1; i++)
1813 {
1814 flagword flags;
1815 bfd_size_type size;
1816 bfd_vma gap_start, gap_stop;
1817
1818 flags = bfd_get_section_flags (obfd, osections[i]);
1819 if ((flags & SEC_HAS_CONTENTS) == 0
1820 || (flags & SEC_LOAD) == 0)
1821 continue;
1822
1823 size = bfd_section_size (obfd, osections[i]);
1824 gap_start = bfd_section_lma (obfd, osections[i]) + size;
1825 gap_stop = bfd_section_lma (obfd, osections[i + 1]);
1826 if (gap_start < gap_stop)
1827 {
1828 if (! bfd_set_section_size (obfd, osections[i],
1829 size + (gap_stop - gap_start)))
1830 {
1831 bfd_nonfatal_message (NULL, obfd, osections[i],
1832 _("Can't fill gap after section"));
1833 status = 1;
1834 break;
1835 }
1836 gaps[i] = gap_stop - gap_start;
1837 if (max_gap < gap_stop - gap_start)
1838 max_gap = gap_stop - gap_start;
1839 }
1840 }
1841 }
1842
1843 if (pad_to_set)
1844 {
1845 bfd_vma lma;
1846 bfd_size_type size;
1847
1848 lma = bfd_section_lma (obfd, osections[c - 1]);
1849 size = bfd_section_size (obfd, osections[c - 1]);
1850 if (lma + size < pad_to)
1851 {
1852 if (! bfd_set_section_size (obfd, osections[c - 1],
1853 pad_to - lma))
1854 {
1855 bfd_nonfatal_message (NULL, obfd, osections[c - 1],
1856 _("can't add padding"));
1857 status = 1;
1858 }
1859 else
1860 {
1861 gaps[c - 1] = pad_to - (lma + size);
1862 if (max_gap < pad_to - (lma + size))
1863 max_gap = pad_to - (lma + size);
1864 }
1865 }
1866 }
1867 }
1868
1869 /* Symbol filtering must happen after the output sections
1870 have been created, but before their contents are set. */
1871 dhandle = NULL;
1872 if (convert_debugging)
1873 dhandle = read_debugging_info (ibfd, isympp, symcount, FALSE);
1874
1875 if (strip_symbols == STRIP_DEBUG
1876 || strip_symbols == STRIP_ALL
1877 || strip_symbols == STRIP_UNNEEDED
1878 || strip_symbols == STRIP_NONDEBUG
1879 || strip_symbols == STRIP_DWO
1880 || strip_symbols == STRIP_NONDWO
1881 || discard_locals != LOCALS_UNDEF
1882 || localize_hidden
1883 || htab_elements (strip_specific_htab) != 0
1884 || htab_elements (keep_specific_htab) != 0
1885 || htab_elements (localize_specific_htab) != 0
1886 || htab_elements (globalize_specific_htab) != 0
1887 || htab_elements (keepglobal_specific_htab) != 0
1888 || htab_elements (weaken_specific_htab) != 0
1889 || prefix_symbols_string
1890 || sections_removed
1891 || sections_copied
1892 || convert_debugging
1893 || change_leading_char
1894 || remove_leading_char
1895 || redefine_sym_list
1896 || weaken)
1897 {
1898 /* Mark symbols used in output relocations so that they
1899 are kept, even if they are local labels or static symbols.
1900
1901 Note we iterate over the input sections examining their
1902 relocations since the relocations for the output sections
1903 haven't been set yet. mark_symbols_used_in_relocations will
1904 ignore input sections which have no corresponding output
1905 section. */
1906 if (strip_symbols != STRIP_ALL)
1907 bfd_map_over_sections (ibfd,
1908 mark_symbols_used_in_relocations,
1909 isympp);
1910 osympp = (asymbol **) xmalloc ((symcount + 1) * sizeof (asymbol *));
1911 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
1912 }
1913
1914 if (convert_debugging && dhandle != NULL)
1915 {
1916 if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
1917 {
1918 status = 1;
1919 return FALSE;
1920 }
1921 }
1922
1923 bfd_set_symtab (obfd, osympp, symcount);
1924
1925 /* This has to happen before section positions are set. */
1926 bfd_map_over_sections (ibfd, copy_relocations_in_section, obfd);
1927
1928 /* This has to happen after the symbol table has been set. */
1929 bfd_map_over_sections (ibfd, copy_section, obfd);
1930
1931 if (add_sections != NULL)
1932 {
1933 struct section_add *padd;
1934
1935 for (padd = add_sections; padd != NULL; padd = padd->next)
1936 {
1937 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
1938 0, padd->size))
1939 {
1940 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
1941 return FALSE;
1942 }
1943 }
1944 }
1945
1946 if (gnu_debuglink_filename != NULL)
1947 {
1948 if (! bfd_fill_in_gnu_debuglink_section
1949 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
1950 {
1951 bfd_nonfatal_message (NULL, obfd, NULL,
1952 _("cannot fill debug link section `%s'"),
1953 gnu_debuglink_filename);
1954 return FALSE;
1955 }
1956 }
1957
1958 if (gap_fill_set || pad_to_set)
1959 {
1960 bfd_byte *buf;
1961 int c, i;
1962
1963 /* Fill in the gaps. */
1964 if (max_gap > 8192)
1965 max_gap = 8192;
1966 buf = (bfd_byte *) xmalloc (max_gap);
1967 memset (buf, gap_fill, max_gap);
1968
1969 c = bfd_count_sections (obfd);
1970 for (i = 0; i < c; i++)
1971 {
1972 if (gaps[i] != 0)
1973 {
1974 bfd_size_type left;
1975 file_ptr off;
1976
1977 left = gaps[i];
1978 off = bfd_section_size (obfd, osections[i]) - left;
1979
1980 while (left > 0)
1981 {
1982 bfd_size_type now;
1983
1984 if (left > 8192)
1985 now = 8192;
1986 else
1987 now = left;
1988
1989 if (! bfd_set_section_contents (obfd, osections[i], buf,
1990 off, now))
1991 {
1992 bfd_nonfatal_message (NULL, obfd, osections[i], NULL);
1993 return FALSE;
1994 }
1995
1996 left -= now;
1997 off += now;
1998 }
1999 }
2000 }
2001 }
2002
2003 /* Do not copy backend data if --extract-symbol is passed; anything
2004 that needs to look at the section contents will fail. */
2005 if (extract_symbol)
2006 return TRUE;
2007
2008 /* Allow the BFD backend to copy any private data it understands
2009 from the input BFD to the output BFD. This is done last to
2010 permit the routine to look at the filtered symbol table, which is
2011 important for the ECOFF code at least. */
2012 if (! bfd_copy_private_bfd_data (ibfd, obfd))
2013 {
2014 bfd_nonfatal_message (NULL, obfd, NULL,
2015 _("error copying private BFD data"));
2016 return FALSE;
2017 }
2018
2019 /* Switch to the alternate machine code. We have to do this at the
2020 very end, because we only initialize the header when we create
2021 the first section. */
2022 if (use_alt_mach_code != 0)
2023 {
2024 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
2025 {
2026 non_fatal (_("this target does not support %lu alternative machine codes"),
2027 use_alt_mach_code);
2028 if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
2029 {
2030 non_fatal (_("treating that number as an absolute e_machine value instead"));
2031 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
2032 }
2033 else
2034 non_fatal (_("ignoring the alternative value"));
2035 }
2036 }
2037
2038 return TRUE;
2039 }
2040
2041 /* Read each archive element in turn from IBFD, copy the
2042 contents to temp file, and keep the temp file handle.
2043 If 'force_output_target' is TRUE then make sure that
2044 all elements in the new archive are of the type
2045 'output_target'. */
2046
2047 static void
2048 copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
2049 bfd_boolean force_output_target,
2050 const bfd_arch_info_type *input_arch)
2051 {
2052 struct name_list
2053 {
2054 struct name_list *next;
2055 const char *name;
2056 bfd *obfd;
2057 } *list, *l;
2058 bfd **ptr = &obfd->archive_head;
2059 bfd *this_element;
2060 char *dir;
2061 const char *filename;
2062
2063 /* Make a temp directory to hold the contents. */
2064 dir = make_tempdir (bfd_get_filename (obfd));
2065 if (dir == NULL)
2066 fatal (_("cannot create tempdir for archive copying (error: %s)"),
2067 strerror (errno));
2068
2069 if (strip_symbols == STRIP_ALL)
2070 obfd->has_armap = FALSE;
2071 else
2072 obfd->has_armap = ibfd->has_armap;
2073 obfd->is_thin_archive = ibfd->is_thin_archive;
2074
2075 if (deterministic)
2076 obfd->flags |= BFD_DETERMINISTIC_OUTPUT;
2077
2078 list = NULL;
2079
2080 this_element = bfd_openr_next_archived_file (ibfd, NULL);
2081
2082 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2083 {
2084 status = 1;
2085 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
2086 return;
2087 }
2088
2089 while (!status && this_element != NULL)
2090 {
2091 char *output_name;
2092 bfd *output_bfd;
2093 bfd *last_element;
2094 struct stat buf;
2095 int stat_status = 0;
2096 bfd_boolean del = TRUE;
2097 bfd_boolean ok_object;
2098
2099 /* Create an output file for this member. */
2100 output_name = concat (dir, "/",
2101 bfd_get_filename (this_element), (char *) 0);
2102
2103 /* If the file already exists, make another temp dir. */
2104 if (stat (output_name, &buf) >= 0)
2105 {
2106 output_name = make_tempdir (output_name);
2107 if (output_name == NULL)
2108 fatal (_("cannot create tempdir for archive copying (error: %s)"),
2109 strerror (errno));
2110
2111 l = (struct name_list *) xmalloc (sizeof (struct name_list));
2112 l->name = output_name;
2113 l->next = list;
2114 l->obfd = NULL;
2115 list = l;
2116 output_name = concat (output_name, "/",
2117 bfd_get_filename (this_element), (char *) 0);
2118 }
2119
2120 if (preserve_dates)
2121 {
2122 stat_status = bfd_stat_arch_elt (this_element, &buf);
2123
2124 if (stat_status != 0)
2125 non_fatal (_("internal stat error on %s"),
2126 bfd_get_filename (this_element));
2127 }
2128
2129 l = (struct name_list *) xmalloc (sizeof (struct name_list));
2130 l->name = output_name;
2131 l->next = list;
2132 l->obfd = NULL;
2133 list = l;
2134
2135 ok_object = bfd_check_format (this_element, bfd_object);
2136 if (!ok_object)
2137 bfd_nonfatal_message (NULL, this_element, NULL,
2138 _("Unable to recognise the format of file"));
2139
2140 /* PR binutils/3110: Cope with archives
2141 containing multiple target types. */
2142 if (force_output_target || !ok_object)
2143 output_bfd = bfd_openw (output_name, output_target);
2144 else
2145 output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
2146
2147 if (output_bfd == NULL)
2148 {
2149 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2150 status = 1;
2151 return;
2152 }
2153
2154 if (ok_object)
2155 {
2156 del = !copy_object (this_element, output_bfd, input_arch);
2157
2158 if (del && bfd_get_arch (this_element) == bfd_arch_unknown)
2159 /* Try again as an unknown object file. */
2160 ok_object = FALSE;
2161 else if (!bfd_close (output_bfd))
2162 {
2163 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2164 /* Error in new object file. Don't change archive. */
2165 status = 1;
2166 }
2167 }
2168
2169 if (!ok_object)
2170 {
2171 del = !copy_unknown_object (this_element, output_bfd);
2172 if (!bfd_close_all_done (output_bfd))
2173 {
2174 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2175 /* Error in new object file. Don't change archive. */
2176 status = 1;
2177 }
2178 }
2179
2180 if (del)
2181 {
2182 unlink (output_name);
2183 status = 1;
2184 }
2185 else
2186 {
2187 if (preserve_dates && stat_status == 0)
2188 set_times (output_name, &buf);
2189
2190 /* Open the newly output file and attach to our list. */
2191 output_bfd = bfd_openr (output_name, output_target);
2192
2193 l->obfd = output_bfd;
2194
2195 *ptr = output_bfd;
2196 ptr = &output_bfd->archive_next;
2197
2198 last_element = this_element;
2199
2200 this_element = bfd_openr_next_archived_file (ibfd, last_element);
2201
2202 bfd_close (last_element);
2203 }
2204 }
2205 *ptr = NULL;
2206
2207 filename = bfd_get_filename (obfd);
2208 if (!bfd_close (obfd))
2209 {
2210 status = 1;
2211 bfd_nonfatal_message (filename, NULL, NULL, NULL);
2212 return;
2213 }
2214
2215 filename = bfd_get_filename (ibfd);
2216 if (!bfd_close (ibfd))
2217 {
2218 status = 1;
2219 bfd_nonfatal_message (filename, NULL, NULL, NULL);
2220 return;
2221 }
2222
2223 /* Delete all the files that we opened. */
2224 for (l = list; l != NULL; l = l->next)
2225 {
2226 if (l->obfd == NULL)
2227 rmdir (l->name);
2228 else
2229 {
2230 bfd_close (l->obfd);
2231 unlink (l->name);
2232 }
2233 }
2234 rmdir (dir);
2235 }
2236
2237 static void
2238 set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_handling style)
2239 {
2240 /* This is only relevant to Coff targets. */
2241 if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
2242 {
2243 if (style == KEEP
2244 && bfd_get_flavour (input_bfd) == bfd_target_coff_flavour)
2245 style = bfd_coff_long_section_names (input_bfd) ? ENABLE : DISABLE;
2246 bfd_coff_set_long_section_names (output_bfd, style != DISABLE);
2247 }
2248 }
2249
2250 /* The top-level control. */
2251
2252 static void
2253 copy_file (const char *input_filename, const char *output_filename,
2254 const char *input_target, const char *output_target,
2255 const bfd_arch_info_type *input_arch)
2256 {
2257 bfd *ibfd;
2258 char **obj_matching;
2259 char **core_matching;
2260 off_t size = get_file_size (input_filename);
2261
2262 if (size < 1)
2263 {
2264 if (size == 0)
2265 non_fatal (_("error: the input file '%s' is empty"),
2266 input_filename);
2267 status = 1;
2268 return;
2269 }
2270
2271 /* To allow us to do "strip *" without dying on the first
2272 non-object file, failures are nonfatal. */
2273 ibfd = bfd_openr (input_filename, input_target);
2274 if (ibfd == NULL)
2275 {
2276 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2277 status = 1;
2278 return;
2279 }
2280
2281 switch (do_debug_sections)
2282 {
2283 case compress:
2284 ibfd->flags |= BFD_COMPRESS;
2285 break;
2286 case decompress:
2287 ibfd->flags |= BFD_DECOMPRESS;
2288 break;
2289 default:
2290 break;
2291 }
2292
2293 if (bfd_check_format (ibfd, bfd_archive))
2294 {
2295 bfd_boolean force_output_target;
2296 bfd *obfd;
2297
2298 /* bfd_get_target does not return the correct value until
2299 bfd_check_format succeeds. */
2300 if (output_target == NULL)
2301 {
2302 output_target = bfd_get_target (ibfd);
2303 force_output_target = FALSE;
2304 }
2305 else
2306 force_output_target = TRUE;
2307
2308 obfd = bfd_openw (output_filename, output_target);
2309 if (obfd == NULL)
2310 {
2311 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2312 status = 1;
2313 return;
2314 }
2315 /* This is a no-op on non-Coff targets. */
2316 set_long_section_mode (obfd, ibfd, long_section_names);
2317
2318 copy_archive (ibfd, obfd, output_target, force_output_target, input_arch);
2319 }
2320 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
2321 {
2322 bfd *obfd;
2323 do_copy:
2324
2325 /* bfd_get_target does not return the correct value until
2326 bfd_check_format succeeds. */
2327 if (output_target == NULL)
2328 output_target = bfd_get_target (ibfd);
2329
2330 obfd = bfd_openw (output_filename, output_target);
2331 if (obfd == NULL)
2332 {
2333 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2334 status = 1;
2335 return;
2336 }
2337 /* This is a no-op on non-Coff targets. */
2338 set_long_section_mode (obfd, ibfd, long_section_names);
2339
2340 if (! copy_object (ibfd, obfd, input_arch))
2341 status = 1;
2342
2343 if (!bfd_close (obfd))
2344 {
2345 status = 1;
2346 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2347 return;
2348 }
2349
2350 if (!bfd_close (ibfd))
2351 {
2352 status = 1;
2353 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2354 return;
2355 }
2356 }
2357 else
2358 {
2359 bfd_error_type obj_error = bfd_get_error ();
2360 bfd_error_type core_error;
2361
2362 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
2363 {
2364 /* This probably can't happen.. */
2365 if (obj_error == bfd_error_file_ambiguously_recognized)
2366 free (obj_matching);
2367 goto do_copy;
2368 }
2369
2370 core_error = bfd_get_error ();
2371 /* Report the object error in preference to the core error. */
2372 if (obj_error != core_error)
2373 bfd_set_error (obj_error);
2374
2375 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2376
2377 if (obj_error == bfd_error_file_ambiguously_recognized)
2378 {
2379 list_matching_formats (obj_matching);
2380 free (obj_matching);
2381 }
2382 if (core_error == bfd_error_file_ambiguously_recognized)
2383 {
2384 list_matching_formats (core_matching);
2385 free (core_matching);
2386 }
2387
2388 status = 1;
2389 }
2390 }
2391
2392 /* Add a name to the section renaming list. */
2393
2394 static void
2395 add_section_rename (const char * old_name, const char * new_name,
2396 flagword flags)
2397 {
2398 section_rename * srename;
2399
2400 /* Check for conflicts first. */
2401 for (srename = section_rename_list; srename != NULL; srename = srename->next)
2402 if (strcmp (srename->old_name, old_name) == 0)
2403 {
2404 /* Silently ignore duplicate definitions. */
2405 if (strcmp (srename->new_name, new_name) == 0
2406 && srename->flags == flags)
2407 return;
2408
2409 fatal (_("Multiple renames of section %s"), old_name);
2410 }
2411
2412 srename = (section_rename *) xmalloc (sizeof (* srename));
2413
2414 srename->old_name = old_name;
2415 srename->new_name = new_name;
2416 srename->flags = flags;
2417 srename->next = section_rename_list;
2418
2419 section_rename_list = srename;
2420 }
2421
2422 /* Check the section rename list for a new name of the input section
2423 ISECTION. Return the new name if one is found.
2424 Also set RETURNED_FLAGS to the flags to be used for this section. */
2425
2426 static const char *
2427 find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection,
2428 flagword * returned_flags)
2429 {
2430 const char * old_name = bfd_section_name (ibfd, isection);
2431 section_rename * srename;
2432
2433 /* Default to using the flags of the input section. */
2434 * returned_flags = bfd_get_section_flags (ibfd, isection);
2435
2436 for (srename = section_rename_list; srename != NULL; srename = srename->next)
2437 if (strcmp (srename->old_name, old_name) == 0)
2438 {
2439 if (srename->flags != (flagword) -1)
2440 * returned_flags = srename->flags;
2441
2442 return srename->new_name;
2443 }
2444
2445 return old_name;
2446 }
2447
2448 /* Once each of the sections is copied, we may still need to do some
2449 finalization work for private section headers. Do that here. */
2450
2451 static void
2452 setup_bfd_headers (bfd *ibfd, bfd *obfd)
2453 {
2454 /* Allow the BFD backend to copy any private data it understands
2455 from the input section to the output section. */
2456 if (! bfd_copy_private_header_data (ibfd, obfd))
2457 {
2458 status = 1;
2459 bfd_nonfatal_message (NULL, ibfd, NULL,
2460 _("error in private header data"));
2461 return;
2462 }
2463
2464 /* All went well. */
2465 return;
2466 }
2467
2468 /* Create a section in OBFD with the same
2469 name and attributes as ISECTION in IBFD. */
2470
2471 static void
2472 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2473 {
2474 bfd *obfd = (bfd *) obfdarg;
2475 struct section_list *p;
2476 sec_ptr osection;
2477 bfd_size_type size;
2478 bfd_vma vma;
2479 bfd_vma lma;
2480 flagword flags;
2481 const char *err;
2482 const char * name;
2483 char *prefix = NULL;
2484 bfd_boolean make_nobits;
2485
2486 if (is_strip_section (ibfd, isection))
2487 return;
2488
2489 p = find_section_list (bfd_section_name (ibfd, isection), FALSE);
2490 if (p != NULL)
2491 p->used = TRUE;
2492
2493 /* Get the, possibly new, name of the output section. */
2494 name = find_section_rename (ibfd, isection, & flags);
2495
2496 /* Prefix sections. */
2497 if ((prefix_alloc_sections_string)
2498 && (bfd_get_section_flags (ibfd, isection) & SEC_ALLOC))
2499 prefix = prefix_alloc_sections_string;
2500 else if (prefix_sections_string)
2501 prefix = prefix_sections_string;
2502
2503 if (prefix)
2504 {
2505 char *n;
2506
2507 n = (char *) xmalloc (strlen (prefix) + strlen (name) + 1);
2508 strcpy (n, prefix);
2509 strcat (n, name);
2510 name = n;
2511 }
2512
2513 make_nobits = FALSE;
2514 if (p != NULL && p->set_flags)
2515 flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
2516 else if (strip_symbols == STRIP_NONDEBUG
2517 && (flags & (SEC_ALLOC | SEC_GROUP)) != 0
2518 && !(ibfd->xvec->flavour == bfd_target_elf_flavour
2519 && elf_section_type (isection) == SHT_NOTE))
2520 {
2521 flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
2522 if (obfd->xvec->flavour == bfd_target_elf_flavour)
2523 {
2524 make_nobits = TRUE;
2525
2526 /* Twiddle the input section flags so that it seems to
2527 elf.c:copy_private_bfd_data that section flags have not
2528 changed between input and output sections. This hack
2529 prevents wholesale rewriting of the program headers. */
2530 isection->flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
2531 }
2532 }
2533
2534 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
2535
2536 if (osection == NULL)
2537 {
2538 err = _("failed to create output section");
2539 goto loser;
2540 }
2541
2542 if (make_nobits)
2543 elf_section_type (osection) = SHT_NOBITS;
2544
2545 size = bfd_section_size (ibfd, isection);
2546 if (copy_byte >= 0)
2547 size = (size + interleave - 1) / interleave * copy_width;
2548 else if (extract_symbol)
2549 size = 0;
2550 if (! bfd_set_section_size (obfd, osection, size))
2551 {
2552 err = _("failed to set size");
2553 goto loser;
2554 }
2555
2556 vma = bfd_section_vma (ibfd, isection);
2557 if (p != NULL && p->change_vma == CHANGE_MODIFY)
2558 vma += p->vma_val;
2559 else if (p != NULL && p->change_vma == CHANGE_SET)
2560 vma = p->vma_val;
2561 else
2562 vma += change_section_address;
2563
2564 if (! bfd_set_section_vma (obfd, osection, vma))
2565 {
2566 err = _("failed to set vma");
2567 goto loser;
2568 }
2569
2570 lma = isection->lma;
2571 if ((p != NULL) && p->change_lma != CHANGE_IGNORE)
2572 {
2573 if (p->change_lma == CHANGE_MODIFY)
2574 lma += p->lma_val;
2575 else if (p->change_lma == CHANGE_SET)
2576 lma = p->lma_val;
2577 else
2578 abort ();
2579 }
2580 else
2581 lma += change_section_address;
2582
2583 osection->lma = lma;
2584
2585 /* FIXME: This is probably not enough. If we change the LMA we
2586 may have to recompute the header for the file as well. */
2587 if (!bfd_set_section_alignment (obfd,
2588 osection,
2589 bfd_section_alignment (ibfd, isection)))
2590 {
2591 err = _("failed to set alignment");
2592 goto loser;
2593 }
2594
2595 /* Copy merge entity size. */
2596 osection->entsize = isection->entsize;
2597
2598 /* This used to be mangle_section; we do here to avoid using
2599 bfd_get_section_by_name since some formats allow multiple
2600 sections with the same name. */
2601 isection->output_section = osection;
2602 isection->output_offset = 0;
2603
2604 /* Do not copy backend data if --extract-symbol is passed; anything
2605 that needs to look at the section contents will fail. */
2606 if (extract_symbol)
2607 return;
2608
2609 if ((isection->flags & SEC_GROUP) != 0)
2610 {
2611 asymbol *gsym = group_signature (isection);
2612
2613 if (gsym != NULL)
2614 {
2615 gsym->flags |= BSF_KEEP;
2616 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
2617 elf_group_id (isection) = gsym;
2618 }
2619 }
2620
2621 /* Allow the BFD backend to copy any private data it understands
2622 from the input section to the output section. */
2623 if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
2624 {
2625 err = _("failed to copy private data");
2626 goto loser;
2627 }
2628
2629 /* All went well. */
2630 return;
2631
2632 loser:
2633 status = 1;
2634 bfd_nonfatal_message (NULL, obfd, osection, err);
2635 }
2636
2637 /* Return TRUE if input section ISECTION should be skipped. */
2638
2639 static bfd_boolean
2640 skip_section (bfd *ibfd, sec_ptr isection)
2641 {
2642 sec_ptr osection;
2643 bfd_size_type size;
2644 flagword flags;
2645
2646 /* If we have already failed earlier on,
2647 do not keep on generating complaints now. */
2648 if (status != 0)
2649 return TRUE;
2650
2651 if (extract_symbol)
2652 return TRUE;
2653
2654 if (is_strip_section (ibfd, isection))
2655 return TRUE;
2656
2657 flags = bfd_get_section_flags (ibfd, isection);
2658 if ((flags & SEC_GROUP) != 0)
2659 return TRUE;
2660
2661 osection = isection->output_section;
2662 size = bfd_get_section_size (isection);
2663
2664 if (size == 0 || osection == 0)
2665 return TRUE;
2666
2667 return FALSE;
2668 }
2669
2670 /* Copy relocations in input section ISECTION of IBFD to an output
2671 section with the same name in OBFDARG. If stripping then don't
2672 copy any relocation info. */
2673
2674 static void
2675 copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2676 {
2677 bfd *obfd = (bfd *) obfdarg;
2678 long relsize;
2679 arelent **relpp;
2680 long relcount;
2681 sec_ptr osection;
2682
2683 if (skip_section (ibfd, isection))
2684 return;
2685
2686 osection = isection->output_section;
2687
2688 /* Core files and DWO files do not need to be relocated. */
2689 if (bfd_get_format (obfd) == bfd_core || strip_symbols == STRIP_NONDWO)
2690 relsize = 0;
2691 else
2692 {
2693 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2694
2695 if (relsize < 0)
2696 {
2697 /* Do not complain if the target does not support relocations. */
2698 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2699 relsize = 0;
2700 else
2701 {
2702 status = 1;
2703 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
2704 return;
2705 }
2706 }
2707 }
2708
2709 if (relsize == 0)
2710 {
2711 bfd_set_reloc (obfd, osection, NULL, 0);
2712 osection->flags &= ~SEC_RELOC;
2713 }
2714 else
2715 {
2716 relpp = (arelent **) xmalloc (relsize);
2717 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
2718 if (relcount < 0)
2719 {
2720 status = 1;
2721 bfd_nonfatal_message (NULL, ibfd, isection,
2722 _("relocation count is negative"));
2723 return;
2724 }
2725
2726 if (strip_symbols == STRIP_ALL)
2727 {
2728 /* Remove relocations which are not in
2729 keep_strip_specific_list. */
2730 arelent **temp_relpp;
2731 long temp_relcount = 0;
2732 long i;
2733
2734 temp_relpp = (arelent **) xmalloc (relsize);
2735 for (i = 0; i < relcount; i++)
2736 if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
2737 keep_specific_htab))
2738 temp_relpp [temp_relcount++] = relpp [i];
2739 relcount = temp_relcount;
2740 free (relpp);
2741 relpp = temp_relpp;
2742 }
2743
2744 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
2745 if (relcount == 0)
2746 {
2747 osection->flags &= ~SEC_RELOC;
2748 free (relpp);
2749 }
2750 }
2751 }
2752
2753 /* Copy the data of input section ISECTION of IBFD
2754 to an output section with the same name in OBFD. */
2755
2756 static void
2757 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
2758 {
2759 bfd *obfd = (bfd *) obfdarg;
2760 struct section_list *p;
2761 sec_ptr osection;
2762 bfd_size_type size;
2763
2764 if (skip_section (ibfd, isection))
2765 return;
2766
2767 osection = isection->output_section;
2768 size = bfd_get_section_size (isection);
2769
2770 p = find_section_list (bfd_get_section_name (ibfd, isection), FALSE);
2771
2772 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
2773 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
2774 {
2775 bfd_byte *memhunk = NULL;
2776
2777 if (!bfd_get_full_section_contents (ibfd, isection, &memhunk))
2778 {
2779 status = 1;
2780 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
2781 return;
2782 }
2783
2784 if (reverse_bytes)
2785 {
2786 /* We don't handle leftover bytes (too many possible behaviors,
2787 and we don't know what the user wants). The section length
2788 must be a multiple of the number of bytes to swap. */
2789 if ((size % reverse_bytes) == 0)
2790 {
2791 unsigned long i, j;
2792 bfd_byte b;
2793
2794 for (i = 0; i < size; i += reverse_bytes)
2795 for (j = 0; j < (unsigned long)(reverse_bytes / 2); j++)
2796 {
2797 bfd_byte *m = (bfd_byte *) memhunk;
2798
2799 b = m[i + j];
2800 m[i + j] = m[(i + reverse_bytes) - (j + 1)];
2801 m[(i + reverse_bytes) - (j + 1)] = b;
2802 }
2803 }
2804 else
2805 /* User must pad the section up in order to do this. */
2806 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
2807 bfd_section_name (ibfd, isection), reverse_bytes);
2808 }
2809
2810 if (copy_byte >= 0)
2811 {
2812 /* Keep only every `copy_byte'th byte in MEMHUNK. */
2813 char *from = (char *) memhunk + copy_byte;
2814 char *to = (char *) memhunk;
2815 char *end = (char *) memhunk + size;
2816 int i;
2817
2818 for (; from < end; from += interleave)
2819 for (i = 0; i < copy_width; i++)
2820 *to++ = from[i];
2821
2822 size = (size + interleave - 1 - copy_byte) / interleave * copy_width;
2823 osection->lma /= interleave;
2824 }
2825
2826 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2827 {
2828 status = 1;
2829 bfd_nonfatal_message (NULL, obfd, osection, NULL);
2830 return;
2831 }
2832 free (memhunk);
2833 }
2834 else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0)
2835 {
2836 void *memhunk = xmalloc (size);
2837
2838 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
2839 flag--they can just remove the section entirely and add it
2840 back again. However, we do permit them to turn on the
2841 SEC_HAS_CONTENTS flag, and take it to mean that the section
2842 contents should be zeroed out. */
2843
2844 memset (memhunk, 0, size);
2845 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2846 {
2847 status = 1;
2848 bfd_nonfatal_message (NULL, obfd, osection, NULL);
2849 return;
2850 }
2851 free (memhunk);
2852 }
2853 }
2854
2855 /* Get all the sections. This is used when --gap-fill or --pad-to is
2856 used. */
2857
2858 static void
2859 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
2860 {
2861 asection ***secppp = (asection ***) secppparg;
2862
2863 **secppp = osection;
2864 ++(*secppp);
2865 }
2866
2867 /* Sort sections by VMA. This is called via qsort, and is used when
2868 --gap-fill or --pad-to is used. We force non loadable or empty
2869 sections to the front, where they are easier to ignore. */
2870
2871 static int
2872 compare_section_lma (const void *arg1, const void *arg2)
2873 {
2874 const asection *const *sec1 = (const asection * const *) arg1;
2875 const asection *const *sec2 = (const asection * const *) arg2;
2876 flagword flags1, flags2;
2877
2878 /* Sort non loadable sections to the front. */
2879 flags1 = (*sec1)->flags;
2880 flags2 = (*sec2)->flags;
2881 if ((flags1 & SEC_HAS_CONTENTS) == 0
2882 || (flags1 & SEC_LOAD) == 0)
2883 {
2884 if ((flags2 & SEC_HAS_CONTENTS) != 0
2885 && (flags2 & SEC_LOAD) != 0)
2886 return -1;
2887 }
2888 else
2889 {
2890 if ((flags2 & SEC_HAS_CONTENTS) == 0
2891 || (flags2 & SEC_LOAD) == 0)
2892 return 1;
2893 }
2894
2895 /* Sort sections by LMA. */
2896 if ((*sec1)->lma > (*sec2)->lma)
2897 return 1;
2898 else if ((*sec1)->lma < (*sec2)->lma)
2899 return -1;
2900
2901 /* Sort sections with the same LMA by size. */
2902 if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
2903 return 1;
2904 else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
2905 return -1;
2906
2907 return 0;
2908 }
2909
2910 /* Mark all the symbols which will be used in output relocations with
2911 the BSF_KEEP flag so that those symbols will not be stripped.
2912
2913 Ignore relocations which will not appear in the output file. */
2914
2915 static void
2916 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
2917 {
2918 asymbol **symbols = (asymbol **) symbolsarg;
2919 long relsize;
2920 arelent **relpp;
2921 long relcount, i;
2922
2923 /* Ignore an input section with no corresponding output section. */
2924 if (isection->output_section == NULL)
2925 return;
2926
2927 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2928 if (relsize < 0)
2929 {
2930 /* Do not complain if the target does not support relocations. */
2931 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2932 return;
2933 bfd_fatal (bfd_get_filename (ibfd));
2934 }
2935
2936 if (relsize == 0)
2937 return;
2938
2939 relpp = (arelent **) xmalloc (relsize);
2940 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
2941 if (relcount < 0)
2942 bfd_fatal (bfd_get_filename (ibfd));
2943
2944 /* Examine each symbol used in a relocation. If it's not one of the
2945 special bfd section symbols, then mark it with BSF_KEEP. */
2946 for (i = 0; i < relcount; i++)
2947 {
2948 if (*relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
2949 && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
2950 && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
2951 (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
2952 }
2953
2954 if (relpp != NULL)
2955 free (relpp);
2956 }
2957
2958 /* Write out debugging information. */
2959
2960 static bfd_boolean
2961 write_debugging_info (bfd *obfd, void *dhandle,
2962 long *symcountp ATTRIBUTE_UNUSED,
2963 asymbol ***symppp ATTRIBUTE_UNUSED)
2964 {
2965 if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour)
2966 return write_ieee_debugging_info (obfd, dhandle);
2967
2968 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2969 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
2970 {
2971 bfd_byte *syms, *strings;
2972 bfd_size_type symsize, stringsize;
2973 asection *stabsec, *stabstrsec;
2974 flagword flags;
2975
2976 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
2977 &symsize, &strings,
2978 &stringsize))
2979 return FALSE;
2980
2981 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
2982 stabsec = bfd_make_section_with_flags (obfd, ".stab", flags);
2983 stabstrsec = bfd_make_section_with_flags (obfd, ".stabstr", flags);
2984 if (stabsec == NULL
2985 || stabstrsec == NULL
2986 || ! bfd_set_section_size (obfd, stabsec, symsize)
2987 || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
2988 || ! bfd_set_section_alignment (obfd, stabsec, 2)
2989 || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
2990 {
2991 bfd_nonfatal_message (NULL, obfd, NULL,
2992 _("can't create debugging section"));
2993 return FALSE;
2994 }
2995
2996 /* We can get away with setting the section contents now because
2997 the next thing the caller is going to do is copy over the
2998 real sections. We may someday have to split the contents
2999 setting out of this function. */
3000 if (! bfd_set_section_contents (obfd, stabsec, syms, 0, symsize)
3001 || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
3002 stringsize))
3003 {
3004 bfd_nonfatal_message (NULL, obfd, NULL,
3005 _("can't set debugging section contents"));
3006 return FALSE;
3007 }
3008
3009 return TRUE;
3010 }
3011
3012 bfd_nonfatal_message (NULL, obfd, NULL,
3013 _("don't know how to write debugging information for %s"),
3014 bfd_get_target (obfd));
3015 return FALSE;
3016 }
3017
3018 static int
3019 strip_main (int argc, char *argv[])
3020 {
3021 char *input_target = NULL;
3022 char *output_target = NULL;
3023 bfd_boolean show_version = FALSE;
3024 bfd_boolean formats_info = FALSE;
3025 int c;
3026 int i;
3027 struct section_list *p;
3028 char *output_file = NULL;
3029
3030 while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
3031 strip_options, (int *) 0)) != EOF)
3032 {
3033 switch (c)
3034 {
3035 case 'I':
3036 input_target = optarg;
3037 break;
3038 case 'O':
3039 output_target = optarg;
3040 break;
3041 case 'F':
3042 input_target = output_target = optarg;
3043 break;
3044 case 'R':
3045 p = find_section_list (optarg, TRUE);
3046 p->remove = TRUE;
3047 sections_removed = TRUE;
3048 break;
3049 case 's':
3050 strip_symbols = STRIP_ALL;
3051 break;
3052 case 'S':
3053 case 'g':
3054 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
3055 strip_symbols = STRIP_DEBUG;
3056 break;
3057 case OPTION_STRIP_DWO:
3058 strip_symbols = STRIP_DWO;
3059 break;
3060 case OPTION_STRIP_UNNEEDED:
3061 strip_symbols = STRIP_UNNEEDED;
3062 break;
3063 case 'K':
3064 add_specific_symbol (optarg, keep_specific_htab);
3065 break;
3066 case 'N':
3067 add_specific_symbol (optarg, strip_specific_htab);
3068 break;
3069 case 'o':
3070 output_file = optarg;
3071 break;
3072 case 'p':
3073 preserve_dates = TRUE;
3074 break;
3075 case 'D':
3076 deterministic = TRUE;
3077 break;
3078 case 'x':
3079 discard_locals = LOCALS_ALL;
3080 break;
3081 case 'X':
3082 discard_locals = LOCALS_START_L;
3083 break;
3084 case 'v':
3085 verbose = TRUE;
3086 break;
3087 case 'V':
3088 show_version = TRUE;
3089 break;
3090 case OPTION_FORMATS_INFO:
3091 formats_info = TRUE;
3092 break;
3093 case OPTION_ONLY_KEEP_DEBUG:
3094 strip_symbols = STRIP_NONDEBUG;
3095 break;
3096 case OPTION_KEEP_FILE_SYMBOLS:
3097 keep_file_symbols = 1;
3098 break;
3099 case 0:
3100 /* We've been given a long option. */
3101 break;
3102 case 'w':
3103 wildcard = TRUE;
3104 break;
3105 case 'H':
3106 case 'h':
3107 strip_usage (stdout, 0);
3108 default:
3109 strip_usage (stderr, 1);
3110 }
3111 }
3112
3113 if (formats_info)
3114 {
3115 display_info ();
3116 return 0;
3117 }
3118
3119 if (show_version)
3120 print_version ("strip");
3121
3122 /* Default is to strip all symbols. */
3123 if (strip_symbols == STRIP_UNDEF
3124 && discard_locals == LOCALS_UNDEF
3125 && htab_elements (strip_specific_htab) == 0)
3126 strip_symbols = STRIP_ALL;
3127
3128 if (output_target == NULL)
3129 output_target = input_target;
3130
3131 i = optind;
3132 if (i == argc
3133 || (output_file != NULL && (i + 1) < argc))
3134 strip_usage (stderr, 1);
3135
3136 for (; i < argc; i++)
3137 {
3138 int hold_status = status;
3139 struct stat statbuf;
3140 char *tmpname;
3141
3142 if (get_file_size (argv[i]) < 1)
3143 {
3144 status = 1;
3145 continue;
3146 }
3147
3148 if (preserve_dates)
3149 /* No need to check the return value of stat().
3150 It has already been checked in get_file_size(). */
3151 stat (argv[i], &statbuf);
3152
3153 if (output_file == NULL
3154 || filename_cmp (argv[i], output_file) == 0)
3155 tmpname = make_tempname (argv[i]);
3156 else
3157 tmpname = output_file;
3158
3159 if (tmpname == NULL)
3160 {
3161 bfd_nonfatal_message (argv[i], NULL, NULL,
3162 _("could not create temporary file to hold stripped copy"));
3163 status = 1;
3164 continue;
3165 }
3166
3167 status = 0;
3168 copy_file (argv[i], tmpname, input_target, output_target, NULL);
3169 if (status == 0)
3170 {
3171 if (preserve_dates)
3172 set_times (tmpname, &statbuf);
3173 if (output_file != tmpname)
3174 status = (smart_rename (tmpname,
3175 output_file ? output_file : argv[i],
3176 preserve_dates) != 0);
3177 if (status == 0)
3178 status = hold_status;
3179 }
3180 else
3181 unlink_if_ordinary (tmpname);
3182 if (output_file != tmpname)
3183 free (tmpname);
3184 }
3185
3186 return status;
3187 }
3188
3189 /* Set up PE subsystem. */
3190
3191 static void
3192 set_pe_subsystem (const char *s)
3193 {
3194 const char *version, *subsystem;
3195 size_t i;
3196 static const struct
3197 {
3198 const char *name;
3199 const char set_def;
3200 const short value;
3201 }
3202 v[] =
3203 {
3204 { "native", 0, IMAGE_SUBSYSTEM_NATIVE },
3205 { "windows", 0, IMAGE_SUBSYSTEM_WINDOWS_GUI },
3206 { "console", 0, IMAGE_SUBSYSTEM_WINDOWS_CUI },
3207 { "posix", 0, IMAGE_SUBSYSTEM_POSIX_CUI },
3208 { "wince", 0, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI },
3209 { "efi-app", 1, IMAGE_SUBSYSTEM_EFI_APPLICATION },
3210 { "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER },
3211 { "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER },
3212 { "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER },
3213 { "xbox", 0, IMAGE_SUBSYSTEM_XBOX }
3214 };
3215 short value;
3216 char *copy;
3217 int set_def = -1;
3218
3219 /* Check for the presence of a version number. */
3220 version = strchr (s, ':');
3221 if (version == NULL)
3222 subsystem = s;
3223 else
3224 {
3225 int len = version - s;
3226 copy = xstrdup (s);
3227 subsystem = copy;
3228 copy[len] = '\0';
3229 version = copy + 1 + len;
3230 pe_major_subsystem_version = strtoul (version, &copy, 0);
3231 if (*copy == '.')
3232 pe_minor_subsystem_version = strtoul (copy + 1, &copy, 0);
3233 if (*copy != '\0')
3234 non_fatal (_("%s: bad version in PE subsystem"), s);
3235 }
3236
3237 /* Check for numeric subsystem. */
3238 value = (short) strtol (subsystem, &copy, 0);
3239 if (*copy == '\0')
3240 {
3241 for (i = 0; i < ARRAY_SIZE (v); i++)
3242 if (v[i].value == value)
3243 {
3244 pe_subsystem = value;
3245 set_def = v[i].set_def;
3246 break;
3247 }
3248 }
3249 else
3250 {
3251 /* Search for subsystem by name. */
3252 for (i = 0; i < ARRAY_SIZE (v); i++)
3253 if (strcmp (subsystem, v[i].name) == 0)
3254 {
3255 pe_subsystem = v[i].value;
3256 set_def = v[i].set_def;
3257 break;
3258 }
3259 }
3260
3261 switch (set_def)
3262 {
3263 case -1:
3264 fatal (_("unknown PE subsystem: %s"), s);
3265 break;
3266 case 0:
3267 break;
3268 default:
3269 if (pe_file_alignment == (bfd_vma) -1)
3270 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
3271 if (pe_section_alignment == (bfd_vma) -1)
3272 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
3273 break;
3274 }
3275 if (s != subsystem)
3276 free ((char *) subsystem);
3277 }
3278
3279 /* Convert EFI target to PEI target. */
3280
3281 static void
3282 convert_efi_target (char *efi)
3283 {
3284 efi[0] = 'p';
3285 efi[1] = 'e';
3286 efi[2] = 'i';
3287
3288 if (strcmp (efi + 4, "ia32") == 0)
3289 {
3290 /* Change ia32 to i386. */
3291 efi[5]= '3';
3292 efi[6]= '8';
3293 efi[7]= '6';
3294 }
3295 else if (strcmp (efi + 4, "x86_64") == 0)
3296 {
3297 /* Change x86_64 to x86-64. */
3298 efi[7] = '-';
3299 }
3300 }
3301
3302 static int
3303 copy_main (int argc, char *argv[])
3304 {
3305 char *input_filename = NULL;
3306 char *output_filename = NULL;
3307 char *tmpname;
3308 char *input_target = NULL;
3309 char *output_target = NULL;
3310 bfd_boolean show_version = FALSE;
3311 bfd_boolean change_warn = TRUE;
3312 bfd_boolean formats_info = FALSE;
3313 int c;
3314 struct section_list *p;
3315 struct stat statbuf;
3316 const bfd_arch_info_type *input_arch = NULL;
3317
3318 while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
3319 copy_options, (int *) 0)) != EOF)
3320 {
3321 switch (c)
3322 {
3323 case 'b':
3324 copy_byte = atoi (optarg);
3325 if (copy_byte < 0)
3326 fatal (_("byte number must be non-negative"));
3327 break;
3328
3329 case 'B':
3330 input_arch = bfd_scan_arch (optarg);
3331 if (input_arch == NULL)
3332 fatal (_("architecture %s unknown"), optarg);
3333 break;
3334
3335 case 'i':
3336 if (optarg)
3337 {
3338 interleave = atoi (optarg);
3339 if (interleave < 1)
3340 fatal (_("interleave must be positive"));
3341 }
3342 else
3343 interleave = 4;
3344 break;
3345
3346 case OPTION_INTERLEAVE_WIDTH:
3347 copy_width = atoi (optarg);
3348 if (copy_width < 1)
3349 fatal(_("interleave width must be positive"));
3350 break;
3351
3352 case 'I':
3353 case 's': /* "source" - 'I' is preferred */
3354 input_target = optarg;
3355 break;
3356
3357 case 'O':
3358 case 'd': /* "destination" - 'O' is preferred */
3359 output_target = optarg;
3360 break;
3361
3362 case 'F':
3363 input_target = output_target = optarg;
3364 break;
3365
3366 case 'j':
3367 p = find_section_list (optarg, TRUE);
3368 if (p->remove)
3369 fatal (_("%s both copied and removed"), optarg);
3370 p->copy = TRUE;
3371 sections_copied = TRUE;
3372 break;
3373
3374 case 'R':
3375 p = find_section_list (optarg, TRUE);
3376 if (p->copy)
3377 fatal (_("%s both copied and removed"), optarg);
3378 p->remove = TRUE;
3379 sections_removed = TRUE;
3380 break;
3381
3382 case 'S':
3383 strip_symbols = STRIP_ALL;
3384 break;
3385
3386 case 'g':
3387 strip_symbols = STRIP_DEBUG;
3388 break;
3389
3390 case OPTION_STRIP_DWO:
3391 strip_symbols = STRIP_DWO;
3392 break;
3393
3394 case OPTION_STRIP_UNNEEDED:
3395 strip_symbols = STRIP_UNNEEDED;
3396 break;
3397
3398 case OPTION_ONLY_KEEP_DEBUG:
3399 strip_symbols = STRIP_NONDEBUG;
3400 break;
3401
3402 case OPTION_KEEP_FILE_SYMBOLS:
3403 keep_file_symbols = 1;
3404 break;
3405
3406 case OPTION_ADD_GNU_DEBUGLINK:
3407 gnu_debuglink_filename = optarg;
3408 break;
3409
3410 case 'K':
3411 add_specific_symbol (optarg, keep_specific_htab);
3412 break;
3413
3414 case 'N':
3415 add_specific_symbol (optarg, strip_specific_htab);
3416 break;
3417
3418 case OPTION_STRIP_UNNEEDED_SYMBOL:
3419 add_specific_symbol (optarg, strip_unneeded_htab);
3420 break;
3421
3422 case 'L':
3423 add_specific_symbol (optarg, localize_specific_htab);
3424 break;
3425
3426 case OPTION_GLOBALIZE_SYMBOL:
3427 add_specific_symbol (optarg, globalize_specific_htab);
3428 break;
3429
3430 case 'G':
3431 add_specific_symbol (optarg, keepglobal_specific_htab);
3432 break;
3433
3434 case 'W':
3435 add_specific_symbol (optarg, weaken_specific_htab);
3436 break;
3437
3438 case 'p':
3439 preserve_dates = TRUE;
3440 break;
3441
3442 case 'D':
3443 deterministic = TRUE;
3444 break;
3445
3446 case 'w':
3447 wildcard = TRUE;
3448 break;
3449
3450 case 'x':
3451 discard_locals = LOCALS_ALL;
3452 break;
3453
3454 case 'X':
3455 discard_locals = LOCALS_START_L;
3456 break;
3457
3458 case 'v':
3459 verbose = TRUE;
3460 break;
3461
3462 case 'V':
3463 show_version = TRUE;
3464 break;
3465
3466 case OPTION_FORMATS_INFO:
3467 formats_info = TRUE;
3468 break;
3469
3470 case OPTION_WEAKEN:
3471 weaken = TRUE;
3472 break;
3473
3474 case OPTION_ADD_SECTION:
3475 {
3476 const char *s;
3477 size_t off, alloc;
3478 struct section_add *pa;
3479 FILE *f;
3480
3481 s = strchr (optarg, '=');
3482
3483 if (s == NULL)
3484 fatal (_("bad format for %s"), "--add-section");
3485
3486 pa = (struct section_add *) xmalloc (sizeof (struct section_add));
3487 pa->name = xstrndup (optarg, s - optarg);
3488 pa->filename = s + 1;
3489
3490 /* We don't use get_file_size so that we can do
3491 --add-section .note.GNU_stack=/dev/null
3492 get_file_size doesn't work on /dev/null. */
3493
3494 f = fopen (pa->filename, FOPEN_RB);
3495 if (f == NULL)
3496 fatal (_("cannot open: %s: %s"),
3497 pa->filename, strerror (errno));
3498
3499 off = 0;
3500 alloc = 4096;
3501 pa->contents = (bfd_byte *) xmalloc (alloc);
3502 while (!feof (f))
3503 {
3504 off_t got;
3505
3506 if (off == alloc)
3507 {
3508 alloc <<= 1;
3509 pa->contents = (bfd_byte *) xrealloc (pa->contents, alloc);
3510 }
3511
3512 got = fread (pa->contents + off, 1, alloc - off, f);
3513 if (ferror (f))
3514 fatal (_("%s: fread failed"), pa->filename);
3515
3516 off += got;
3517 }
3518
3519 pa->size = off;
3520
3521 fclose (f);
3522
3523 pa->next = add_sections;
3524 add_sections = pa;
3525 }
3526 break;
3527
3528 case OPTION_CHANGE_START:
3529 change_start = parse_vma (optarg, "--change-start");
3530 break;
3531
3532 case OPTION_CHANGE_SECTION_ADDRESS:
3533 case OPTION_CHANGE_SECTION_LMA:
3534 case OPTION_CHANGE_SECTION_VMA:
3535 {
3536 const char *s;
3537 int len;
3538 char *name;
3539 char *option = NULL;
3540 bfd_vma val;
3541 enum change_action what = CHANGE_IGNORE;
3542
3543 switch (c)
3544 {
3545 case OPTION_CHANGE_SECTION_ADDRESS:
3546 option = "--change-section-address";
3547 break;
3548 case OPTION_CHANGE_SECTION_LMA:
3549 option = "--change-section-lma";
3550 break;
3551 case OPTION_CHANGE_SECTION_VMA:
3552 option = "--change-section-vma";
3553 break;
3554 }
3555
3556 s = strchr (optarg, '=');
3557 if (s == NULL)
3558 {
3559 s = strchr (optarg, '+');
3560 if (s == NULL)
3561 {
3562 s = strchr (optarg, '-');
3563 if (s == NULL)
3564 fatal (_("bad format for %s"), option);
3565 }
3566 }
3567
3568 len = s - optarg;
3569 name = (char *) xmalloc (len + 1);
3570 strncpy (name, optarg, len);
3571 name[len] = '\0';
3572
3573 p = find_section_list (name, TRUE);
3574
3575 val = parse_vma (s + 1, option);
3576
3577 switch (*s)
3578 {
3579 case '=': what = CHANGE_SET; break;
3580 case '-': val = - val; /* Drop through. */
3581 case '+': what = CHANGE_MODIFY; break;
3582 }
3583
3584 switch (c)
3585 {
3586 case OPTION_CHANGE_SECTION_ADDRESS:
3587 p->change_vma = what;
3588 p->vma_val = val;
3589 /* Drop through. */
3590
3591 case OPTION_CHANGE_SECTION_LMA:
3592 p->change_lma = what;
3593 p->lma_val = val;
3594 break;
3595
3596 case OPTION_CHANGE_SECTION_VMA:
3597 p->change_vma = what;
3598 p->vma_val = val;
3599 break;
3600 }
3601 }
3602 break;
3603
3604 case OPTION_CHANGE_ADDRESSES:
3605 change_section_address = parse_vma (optarg, "--change-addresses");
3606 change_start = change_section_address;
3607 break;
3608
3609 case OPTION_CHANGE_WARNINGS:
3610 change_warn = TRUE;
3611 break;
3612
3613 case OPTION_CHANGE_LEADING_CHAR:
3614 change_leading_char = TRUE;
3615 break;
3616
3617 case OPTION_COMPRESS_DEBUG_SECTIONS:
3618 do_debug_sections = compress;
3619 break;
3620
3621 case OPTION_DEBUGGING:
3622 convert_debugging = TRUE;
3623 break;
3624
3625 case OPTION_DECOMPRESS_DEBUG_SECTIONS:
3626 do_debug_sections = decompress;
3627 break;
3628
3629 case OPTION_GAP_FILL:
3630 {
3631 bfd_vma gap_fill_vma;
3632
3633 gap_fill_vma = parse_vma (optarg, "--gap-fill");
3634 gap_fill = (bfd_byte) gap_fill_vma;
3635 if ((bfd_vma) gap_fill != gap_fill_vma)
3636 {
3637 char buff[20];
3638
3639 sprintf_vma (buff, gap_fill_vma);
3640
3641 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
3642 buff, gap_fill);
3643 }
3644 gap_fill_set = TRUE;
3645 }
3646 break;
3647
3648 case OPTION_NO_CHANGE_WARNINGS:
3649 change_warn = FALSE;
3650 break;
3651
3652 case OPTION_PAD_TO:
3653 pad_to = parse_vma (optarg, "--pad-to");
3654 pad_to_set = TRUE;
3655 break;
3656
3657 case OPTION_REMOVE_LEADING_CHAR:
3658 remove_leading_char = TRUE;
3659 break;
3660
3661 case OPTION_REDEFINE_SYM:
3662 {
3663 /* Push this redefinition onto redefine_symbol_list. */
3664
3665 int len;
3666 const char *s;
3667 const char *nextarg;
3668 char *source, *target;
3669
3670 s = strchr (optarg, '=');
3671 if (s == NULL)
3672 fatal (_("bad format for %s"), "--redefine-sym");
3673
3674 len = s - optarg;
3675 source = (char *) xmalloc (len + 1);
3676 strncpy (source, optarg, len);
3677 source[len] = '\0';
3678
3679 nextarg = s + 1;
3680 len = strlen (nextarg);
3681 target = (char *) xmalloc (len + 1);
3682 strcpy (target, nextarg);
3683
3684 redefine_list_append ("--redefine-sym", source, target);
3685
3686 free (source);
3687 free (target);
3688 }
3689 break;
3690
3691 case OPTION_REDEFINE_SYMS:
3692 add_redefine_syms_file (optarg);
3693 break;
3694
3695 case OPTION_SET_SECTION_FLAGS:
3696 {
3697 const char *s;
3698 int len;
3699 char *name;
3700
3701 s = strchr (optarg, '=');
3702 if (s == NULL)
3703 fatal (_("bad format for %s"), "--set-section-flags");
3704
3705 len = s - optarg;
3706 name = (char *) xmalloc (len + 1);
3707 strncpy (name, optarg, len);
3708 name[len] = '\0';
3709
3710 p = find_section_list (name, TRUE);
3711
3712 p->set_flags = TRUE;
3713 p->flags = parse_flags (s + 1);
3714 }
3715 break;
3716
3717 case OPTION_RENAME_SECTION:
3718 {
3719 flagword flags;
3720 const char *eq, *fl;
3721 char *old_name;
3722 char *new_name;
3723 unsigned int len;
3724
3725 eq = strchr (optarg, '=');
3726 if (eq == NULL)
3727 fatal (_("bad format for %s"), "--rename-section");
3728
3729 len = eq - optarg;
3730 if (len == 0)
3731 fatal (_("bad format for %s"), "--rename-section");
3732
3733 old_name = (char *) xmalloc (len + 1);
3734 strncpy (old_name, optarg, len);
3735 old_name[len] = 0;
3736
3737 eq++;
3738 fl = strchr (eq, ',');
3739 if (fl)
3740 {
3741 flags = parse_flags (fl + 1);
3742 len = fl - eq;
3743 }
3744 else
3745 {
3746 flags = -1;
3747 len = strlen (eq);
3748 }
3749
3750 if (len == 0)
3751 fatal (_("bad format for %s"), "--rename-section");
3752
3753 new_name = (char *) xmalloc (len + 1);
3754 strncpy (new_name, eq, len);
3755 new_name[len] = 0;
3756
3757 add_section_rename (old_name, new_name, flags);
3758 }
3759 break;
3760
3761 case OPTION_SET_START:
3762 set_start = parse_vma (optarg, "--set-start");
3763 set_start_set = TRUE;
3764 break;
3765
3766 case OPTION_SREC_LEN:
3767 Chunk = parse_vma (optarg, "--srec-len");
3768 break;
3769
3770 case OPTION_SREC_FORCES3:
3771 S3Forced = TRUE;
3772 break;
3773
3774 case OPTION_STRIP_SYMBOLS:
3775 add_specific_symbols (optarg, strip_specific_htab);
3776 break;
3777
3778 case OPTION_STRIP_UNNEEDED_SYMBOLS:
3779 add_specific_symbols (optarg, strip_unneeded_htab);
3780 break;
3781
3782 case OPTION_KEEP_SYMBOLS:
3783 add_specific_symbols (optarg, keep_specific_htab);
3784 break;
3785
3786 case OPTION_LOCALIZE_HIDDEN:
3787 localize_hidden = TRUE;
3788 break;
3789
3790 case OPTION_LOCALIZE_SYMBOLS:
3791 add_specific_symbols (optarg, localize_specific_htab);
3792 break;
3793
3794 case OPTION_LONG_SECTION_NAMES:
3795 if (!strcmp ("enable", optarg))
3796 long_section_names = ENABLE;
3797 else if (!strcmp ("disable", optarg))
3798 long_section_names = DISABLE;
3799 else if (!strcmp ("keep", optarg))
3800 long_section_names = KEEP;
3801 else
3802 fatal (_("unknown long section names option '%s'"), optarg);
3803 break;
3804
3805 case OPTION_GLOBALIZE_SYMBOLS:
3806 add_specific_symbols (optarg, globalize_specific_htab);
3807 break;
3808
3809 case OPTION_KEEPGLOBAL_SYMBOLS:
3810 add_specific_symbols (optarg, keepglobal_specific_htab);
3811 break;
3812
3813 case OPTION_WEAKEN_SYMBOLS:
3814 add_specific_symbols (optarg, weaken_specific_htab);
3815 break;
3816
3817 case OPTION_ALT_MACH_CODE:
3818 use_alt_mach_code = strtoul (optarg, NULL, 0);
3819 if (use_alt_mach_code == 0)
3820 fatal (_("unable to parse alternative machine code"));
3821 break;
3822
3823 case OPTION_PREFIX_SYMBOLS:
3824 prefix_symbols_string = optarg;
3825 break;
3826
3827 case OPTION_PREFIX_SECTIONS:
3828 prefix_sections_string = optarg;
3829 break;
3830
3831 case OPTION_PREFIX_ALLOC_SECTIONS:
3832 prefix_alloc_sections_string = optarg;
3833 break;
3834
3835 case OPTION_READONLY_TEXT:
3836 bfd_flags_to_set |= WP_TEXT;
3837 bfd_flags_to_clear &= ~WP_TEXT;
3838 break;
3839
3840 case OPTION_WRITABLE_TEXT:
3841 bfd_flags_to_clear |= WP_TEXT;
3842 bfd_flags_to_set &= ~WP_TEXT;
3843 break;
3844
3845 case OPTION_PURE:
3846 bfd_flags_to_set |= D_PAGED;
3847 bfd_flags_to_clear &= ~D_PAGED;
3848 break;
3849
3850 case OPTION_IMPURE:
3851 bfd_flags_to_clear |= D_PAGED;
3852 bfd_flags_to_set &= ~D_PAGED;
3853 break;
3854
3855 case OPTION_EXTRACT_DWO:
3856 strip_symbols = STRIP_NONDWO;
3857 break;
3858
3859 case OPTION_EXTRACT_SYMBOL:
3860 extract_symbol = TRUE;
3861 break;
3862
3863 case OPTION_REVERSE_BYTES:
3864 {
3865 int prev = reverse_bytes;
3866
3867 reverse_bytes = atoi (optarg);
3868 if ((reverse_bytes <= 0) || ((reverse_bytes % 2) != 0))
3869 fatal (_("number of bytes to reverse must be positive and even"));
3870
3871 if (prev && prev != reverse_bytes)
3872 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
3873 prev);
3874 break;
3875 }
3876
3877 case OPTION_FILE_ALIGNMENT:
3878 pe_file_alignment = parse_vma (optarg, "--file-alignment");
3879 break;
3880
3881 case OPTION_HEAP:
3882 {
3883 char *end;
3884 pe_heap_reserve = strtoul (optarg, &end, 0);
3885 if (end == optarg
3886 || (*end != '.' && *end != '\0'))
3887 non_fatal (_("%s: invalid reserve value for --heap"),
3888 optarg);
3889 else if (*end != '\0')
3890 {
3891 pe_heap_commit = strtoul (end + 1, &end, 0);
3892 if (*end != '\0')
3893 non_fatal (_("%s: invalid commit value for --heap"),
3894 optarg);
3895 }
3896 }
3897 break;
3898
3899 case OPTION_IMAGE_BASE:
3900 pe_image_base = parse_vma (optarg, "--image-base");
3901 break;
3902
3903 case OPTION_SECTION_ALIGNMENT:
3904 pe_section_alignment = parse_vma (optarg,
3905 "--section-alignment");
3906 break;
3907
3908 case OPTION_SUBSYSTEM:
3909 set_pe_subsystem (optarg);
3910 break;
3911
3912 case OPTION_STACK:
3913 {
3914 char *end;
3915 pe_stack_reserve = strtoul (optarg, &end, 0);
3916 if (end == optarg
3917 || (*end != '.' && *end != '\0'))
3918 non_fatal (_("%s: invalid reserve value for --stack"),
3919 optarg);
3920 else if (*end != '\0')
3921 {
3922 pe_stack_commit = strtoul (end + 1, &end, 0);
3923 if (*end != '\0')
3924 non_fatal (_("%s: invalid commit value for --stack"),
3925 optarg);
3926 }
3927 }
3928 break;
3929
3930 case 0:
3931 /* We've been given a long option. */
3932 break;
3933
3934 case 'H':
3935 case 'h':
3936 copy_usage (stdout, 0);
3937
3938 default:
3939 copy_usage (stderr, 1);
3940 }
3941 }
3942
3943 if (formats_info)
3944 {
3945 display_info ();
3946 return 0;
3947 }
3948
3949 if (show_version)
3950 print_version ("objcopy");
3951
3952 if (interleave && copy_byte == -1)
3953 fatal (_("interleave start byte must be set with --byte"));
3954
3955 if (copy_byte >= interleave)
3956 fatal (_("byte number must be less than interleave"));
3957
3958 if (copy_width > interleave - copy_byte)
3959 fatal (_("interleave width must be less than or equal to interleave - byte`"));
3960
3961 if (optind == argc || optind + 2 < argc)
3962 copy_usage (stderr, 1);
3963
3964 input_filename = argv[optind];
3965 if (optind + 1 < argc)
3966 output_filename = argv[optind + 1];
3967
3968 /* Default is to strip no symbols. */
3969 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
3970 strip_symbols = STRIP_NONE;
3971
3972 if (output_target == NULL)
3973 output_target = input_target;
3974
3975 /* Convert input EFI target to PEI target. */
3976 if (input_target != NULL
3977 && strncmp (input_target, "efi-", 4) == 0)
3978 {
3979 char *efi;
3980
3981 efi = xstrdup (output_target + 4);
3982 if (strncmp (efi, "bsdrv-", 6) == 0
3983 || strncmp (efi, "rtdrv-", 6) == 0)
3984 efi += 2;
3985 else if (strncmp (efi, "app-", 4) != 0)
3986 fatal (_("unknown input EFI target: %s"), input_target);
3987
3988 input_target = efi;
3989 convert_efi_target (efi);
3990 }
3991
3992 /* Convert output EFI target to PEI target. */
3993 if (output_target != NULL
3994 && strncmp (output_target, "efi-", 4) == 0)
3995 {
3996 char *efi;
3997
3998 efi = xstrdup (output_target + 4);
3999 if (strncmp (efi, "app-", 4) == 0)
4000 {
4001 if (pe_subsystem == -1)
4002 pe_subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
4003 }
4004 else if (strncmp (efi, "bsdrv-", 6) == 0)
4005 {
4006 if (pe_subsystem == -1)
4007 pe_subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;
4008 efi += 2;
4009 }
4010 else if (strncmp (efi, "rtdrv-", 6) == 0)
4011 {
4012 if (pe_subsystem == -1)
4013 pe_subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;
4014 efi += 2;
4015 }
4016 else
4017 fatal (_("unknown output EFI target: %s"), output_target);
4018
4019 if (pe_file_alignment == (bfd_vma) -1)
4020 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
4021 if (pe_section_alignment == (bfd_vma) -1)
4022 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
4023
4024 output_target = efi;
4025 convert_efi_target (efi);
4026 }
4027
4028 if (preserve_dates)
4029 if (stat (input_filename, & statbuf) < 0)
4030 fatal (_("warning: could not locate '%s'. System error message: %s"),
4031 input_filename, strerror (errno));
4032
4033 /* If there is no destination file, or the source and destination files
4034 are the same, then create a temp and rename the result into the input. */
4035 if (output_filename == NULL
4036 || filename_cmp (input_filename, output_filename) == 0)
4037 tmpname = make_tempname (input_filename);
4038 else
4039 tmpname = output_filename;
4040
4041 if (tmpname == NULL)
4042 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
4043 input_filename, strerror (errno));
4044
4045 copy_file (input_filename, tmpname, input_target, output_target, input_arch);
4046 if (status == 0)
4047 {
4048 if (preserve_dates)
4049 set_times (tmpname, &statbuf);
4050 if (tmpname != output_filename)
4051 status = (smart_rename (tmpname, input_filename,
4052 preserve_dates) != 0);
4053 }
4054 else
4055 unlink_if_ordinary (tmpname);
4056
4057 if (change_warn)
4058 {
4059 for (p = change_sections; p != NULL; p = p->next)
4060 {
4061 if (! p->used)
4062 {
4063 if (p->change_vma != CHANGE_IGNORE)
4064 {
4065 char buff [20];
4066
4067 sprintf_vma (buff, p->vma_val);
4068
4069 /* xgettext:c-format */
4070 non_fatal (_("%s %s%c0x%s never used"),
4071 "--change-section-vma",
4072 p->name,
4073 p->change_vma == CHANGE_SET ? '=' : '+',
4074 buff);
4075 }
4076
4077 if (p->change_lma != CHANGE_IGNORE)
4078 {
4079 char buff [20];
4080
4081 sprintf_vma (buff, p->lma_val);
4082
4083 /* xgettext:c-format */
4084 non_fatal (_("%s %s%c0x%s never used"),
4085 "--change-section-lma",
4086 p->name,
4087 p->change_lma == CHANGE_SET ? '=' : '+',
4088 buff);
4089 }
4090 }
4091 }
4092 }
4093
4094 return 0;
4095 }
4096
4097 int
4098 main (int argc, char *argv[])
4099 {
4100 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
4101 setlocale (LC_MESSAGES, "");
4102 #endif
4103 #if defined (HAVE_SETLOCALE)
4104 setlocale (LC_CTYPE, "");
4105 #endif
4106 bindtextdomain (PACKAGE, LOCALEDIR);
4107 textdomain (PACKAGE);
4108
4109 program_name = argv[0];
4110 xmalloc_set_program_name (program_name);
4111
4112 START_PROGRESS (program_name, 0);
4113
4114 expandargv (&argc, &argv);
4115
4116 strip_symbols = STRIP_UNDEF;
4117 discard_locals = LOCALS_UNDEF;
4118
4119 bfd_init ();
4120 set_default_bfd_target ();
4121
4122 if (is_strip < 0)
4123 {
4124 int i = strlen (program_name);
4125 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4126 /* Drop the .exe suffix, if any. */
4127 if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
4128 {
4129 i -= 4;
4130 program_name[i] = '\0';
4131 }
4132 #endif
4133 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
4134 }
4135
4136 create_symbol_htabs ();
4137
4138 if (is_strip)
4139 strip_main (argc, argv);
4140 else
4141 copy_main (argc, argv);
4142
4143 END_PROGRESS (program_name);
4144
4145 return status;
4146 }
This page took 0.116832 seconds and 5 git commands to generate.