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