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