[PATCH 22/57][Arm][GAS] Add support for MVE instructions: vmlaldav, vmlalv, vmlsldav...
[binutils-gdb.git] / binutils / objcopy.c
blob28b9d3bf9291518bffe93e98aa9b9b50a8fff3e2
1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright (C) 1991-2019 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
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.
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.
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. */
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 "coff/internal.h"
32 #include "libcoff.h"
33 #include "safe-ctype.h"
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"
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;
51 struct is_specified_symbol_predicate_data
53 const char * name;
54 bfd_boolean found;
57 /* A node includes symbol name mapping to support redefine_sym. */
58 struct redefine_node
60 char *source;
61 char *target;
64 struct addsym_node
66 struct addsym_node *next;
67 char * symdef;
68 long symval;
69 flagword flags;
70 char * section;
71 char * othersym;
74 typedef struct section_rename
76 const char * old_name;
77 const char * new_name;
78 flagword flags;
79 struct section_rename * next;
81 section_rename;
83 /* List of sections to be renamed. */
84 static section_rename *section_rename_list;
86 static asymbol **isympp = NULL; /* Input symbols. */
87 static asymbol **osympp = NULL; /* Output symbols that survive stripping. */
89 /* If `copy_byte' >= 0, copy 'copy_width' byte(s) of every `interleave' bytes. */
90 static int copy_byte = -1;
91 static int interleave = 0; /* Initialised to 4 in copy_main(). */
92 static int copy_width = 1;
94 static bfd_boolean verbose; /* Print file and target names. */
95 static bfd_boolean preserve_dates; /* Preserve input file timestamp. */
96 static int deterministic = -1; /* Enable deterministic archives. */
97 static int status = 0; /* Exit status. */
99 static bfd_boolean merge_notes = FALSE; /* Merge note sections. */
100 static bfd_byte * merged_notes = NULL; /* Contents on note section undergoing a merge. */
101 static bfd_size_type merged_size = 0; /* New, smaller size of the merged note section. */
103 enum strip_action
105 STRIP_UNDEF,
106 STRIP_NONE, /* Don't strip. */
107 STRIP_DEBUG, /* Strip all debugger symbols. */
108 STRIP_UNNEEDED, /* Strip unnecessary symbols. */
109 STRIP_NONDEBUG, /* Strip everything but debug info. */
110 STRIP_DWO, /* Strip all DWO info. */
111 STRIP_NONDWO, /* Strip everything but DWO info. */
112 STRIP_ALL /* Strip all symbols. */
115 /* Which symbols to remove. */
116 static enum strip_action strip_symbols = STRIP_UNDEF;
118 enum locals_action
120 LOCALS_UNDEF,
121 LOCALS_START_L, /* Discard locals starting with L. */
122 LOCALS_ALL /* Discard all locals. */
125 /* Which local symbols to remove. Overrides STRIP_ALL. */
126 static enum locals_action discard_locals;
128 /* Structure used to hold lists of sections and actions to take. */
129 struct section_list
131 struct section_list * next; /* Next section to change. */
132 const char * pattern; /* Section name pattern. */
133 bfd_boolean used; /* Whether this entry was used. */
135 unsigned int context; /* What to do with matching sections. */
136 /* Flag bits used in the context field.
137 COPY and REMOVE are mutually exlusive. SET and ALTER are mutually exclusive. */
138 #define SECTION_CONTEXT_REMOVE (1 << 0) /* Remove this section. */
139 #define SECTION_CONTEXT_COPY (1 << 1) /* Copy this section, delete all non-copied section. */
140 #define SECTION_CONTEXT_SET_VMA (1 << 2) /* Set the sections' VMA address. */
141 #define SECTION_CONTEXT_ALTER_VMA (1 << 3) /* Increment or decrement the section's VMA address. */
142 #define SECTION_CONTEXT_SET_LMA (1 << 4) /* Set the sections' LMA address. */
143 #define SECTION_CONTEXT_ALTER_LMA (1 << 5) /* Increment or decrement the section's LMA address. */
144 #define SECTION_CONTEXT_SET_FLAGS (1 << 6) /* Set the section's flags. */
145 #define SECTION_CONTEXT_REMOVE_RELOCS (1 << 7) /* Remove relocations for this section. */
147 bfd_vma vma_val; /* Amount to change by or set to. */
148 bfd_vma lma_val; /* Amount to change by or set to. */
149 flagword flags; /* What to set the section flags to. */
152 static struct section_list *change_sections;
154 /* TRUE if some sections are to be removed. */
155 static bfd_boolean sections_removed;
157 /* TRUE if only some sections are to be copied. */
158 static bfd_boolean sections_copied;
160 /* Changes to the start address. */
161 static bfd_vma change_start = 0;
162 static bfd_boolean set_start_set = FALSE;
163 static bfd_vma set_start;
165 /* Changes to section addresses. */
166 static bfd_vma change_section_address = 0;
168 /* Filling gaps between sections. */
169 static bfd_boolean gap_fill_set = FALSE;
170 static bfd_byte gap_fill = 0;
172 /* Pad to a given address. */
173 static bfd_boolean pad_to_set = FALSE;
174 static bfd_vma pad_to;
176 /* Use alternative machine code? */
177 static unsigned long use_alt_mach_code = 0;
179 /* Output BFD flags user wants to set or clear */
180 static flagword bfd_flags_to_set;
181 static flagword bfd_flags_to_clear;
183 /* List of sections to add. */
184 struct section_add
186 /* Next section to add. */
187 struct section_add *next;
188 /* Name of section to add. */
189 const char *name;
190 /* Name of file holding section contents. */
191 const char *filename;
192 /* Size of file. */
193 size_t size;
194 /* Contents of file. */
195 bfd_byte *contents;
196 /* BFD section, after it has been added. */
197 asection *section;
200 /* List of sections to add to the output BFD. */
201 static struct section_add *add_sections;
203 /* List of sections to update in the output BFD. */
204 static struct section_add *update_sections;
206 /* List of sections to dump from the output BFD. */
207 static struct section_add *dump_sections;
209 /* If non-NULL the argument to --add-gnu-debuglink.
210 This should be the filename to store in the .gnu_debuglink section. */
211 static const char * gnu_debuglink_filename = NULL;
213 /* Whether to convert debugging information. */
214 static bfd_boolean convert_debugging = FALSE;
216 /* Whether to compress/decompress DWARF debug sections. */
217 static enum
219 nothing = 0,
220 compress = 1 << 0,
221 compress_zlib = compress | 1 << 1,
222 compress_gnu_zlib = compress | 1 << 2,
223 compress_gabi_zlib = compress | 1 << 3,
224 decompress = 1 << 4
225 } do_debug_sections = nothing;
227 /* Whether to generate ELF common symbols with the STT_COMMON type. */
228 static enum bfd_link_elf_stt_common do_elf_stt_common = unchanged;
230 /* Whether to change the leading character in symbol names. */
231 static bfd_boolean change_leading_char = FALSE;
233 /* Whether to remove the leading character from global symbol names. */
234 static bfd_boolean remove_leading_char = FALSE;
236 /* Whether to permit wildcard in symbol comparison. */
237 static bfd_boolean wildcard = FALSE;
239 /* True if --localize-hidden is in effect. */
240 static bfd_boolean localize_hidden = FALSE;
242 /* List of symbols to strip, keep, localize, keep-global, weaken,
243 or redefine. */
244 static htab_t strip_specific_htab = NULL;
245 static htab_t strip_unneeded_htab = NULL;
246 static htab_t keep_specific_htab = NULL;
247 static htab_t localize_specific_htab = NULL;
248 static htab_t globalize_specific_htab = NULL;
249 static htab_t keepglobal_specific_htab = NULL;
250 static htab_t weaken_specific_htab = NULL;
251 static htab_t redefine_specific_htab = NULL;
252 static htab_t redefine_specific_reverse_htab = NULL;
253 static struct addsym_node *add_sym_list = NULL, **add_sym_tail = &add_sym_list;
254 static int add_symbols = 0;
256 static char *strip_specific_buffer = NULL;
257 static char *strip_unneeded_buffer = NULL;
258 static char *keep_specific_buffer = NULL;
259 static char *localize_specific_buffer = NULL;
260 static char *globalize_specific_buffer = NULL;
261 static char *keepglobal_specific_buffer = NULL;
262 static char *weaken_specific_buffer = NULL;
264 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
265 static bfd_boolean weaken = FALSE;
267 /* If this is TRUE, we retain BSF_FILE symbols. */
268 static bfd_boolean keep_file_symbols = FALSE;
270 /* Prefix symbols/sections. */
271 static char *prefix_symbols_string = 0;
272 static char *prefix_sections_string = 0;
273 static char *prefix_alloc_sections_string = 0;
275 /* True if --extract-symbol was passed on the command line. */
276 static bfd_boolean extract_symbol = FALSE;
278 /* If `reverse_bytes' is nonzero, then reverse the order of every chunk
279 of <reverse_bytes> bytes within each output section. */
280 static int reverse_bytes = 0;
282 /* For Coff objects, we may want to allow or disallow long section names,
283 or preserve them where found in the inputs. Debug info relies on them. */
284 enum long_section_name_handling
286 DISABLE,
287 ENABLE,
288 KEEP
291 /* The default long section handling mode is to preserve them.
292 This is also the only behaviour for 'strip'. */
293 static enum long_section_name_handling long_section_names = KEEP;
295 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
296 enum command_line_switch
298 OPTION_ADD_SECTION=150,
299 OPTION_ADD_GNU_DEBUGLINK,
300 OPTION_ADD_SYMBOL,
301 OPTION_ALT_MACH_CODE,
302 OPTION_CHANGE_ADDRESSES,
303 OPTION_CHANGE_LEADING_CHAR,
304 OPTION_CHANGE_SECTION_ADDRESS,
305 OPTION_CHANGE_SECTION_LMA,
306 OPTION_CHANGE_SECTION_VMA,
307 OPTION_CHANGE_START,
308 OPTION_CHANGE_WARNINGS,
309 OPTION_COMPRESS_DEBUG_SECTIONS,
310 OPTION_DEBUGGING,
311 OPTION_DECOMPRESS_DEBUG_SECTIONS,
312 OPTION_DUMP_SECTION,
313 OPTION_ELF_STT_COMMON,
314 OPTION_EXTRACT_DWO,
315 OPTION_EXTRACT_SYMBOL,
316 OPTION_FILE_ALIGNMENT,
317 OPTION_FORMATS_INFO,
318 OPTION_GAP_FILL,
319 OPTION_GLOBALIZE_SYMBOL,
320 OPTION_GLOBALIZE_SYMBOLS,
321 OPTION_HEAP,
322 OPTION_IMAGE_BASE,
323 OPTION_IMPURE,
324 OPTION_INTERLEAVE_WIDTH,
325 OPTION_KEEPGLOBAL_SYMBOLS,
326 OPTION_KEEP_FILE_SYMBOLS,
327 OPTION_KEEP_SYMBOLS,
328 OPTION_LOCALIZE_HIDDEN,
329 OPTION_LOCALIZE_SYMBOLS,
330 OPTION_LONG_SECTION_NAMES,
331 OPTION_MERGE_NOTES,
332 OPTION_NO_MERGE_NOTES,
333 OPTION_NO_CHANGE_WARNINGS,
334 OPTION_ONLY_KEEP_DEBUG,
335 OPTION_PAD_TO,
336 OPTION_PREFIX_ALLOC_SECTIONS,
337 OPTION_PREFIX_SECTIONS,
338 OPTION_PREFIX_SYMBOLS,
339 OPTION_PURE,
340 OPTION_READONLY_TEXT,
341 OPTION_REDEFINE_SYM,
342 OPTION_REDEFINE_SYMS,
343 OPTION_REMOVE_LEADING_CHAR,
344 OPTION_REMOVE_RELOCS,
345 OPTION_RENAME_SECTION,
346 OPTION_REVERSE_BYTES,
347 OPTION_SECTION_ALIGNMENT,
348 OPTION_SET_SECTION_FLAGS,
349 OPTION_SET_START,
350 OPTION_SREC_FORCES3,
351 OPTION_SREC_LEN,
352 OPTION_STACK,
353 OPTION_STRIP_DWO,
354 OPTION_STRIP_SYMBOLS,
355 OPTION_STRIP_UNNEEDED,
356 OPTION_STRIP_UNNEEDED_SYMBOL,
357 OPTION_STRIP_UNNEEDED_SYMBOLS,
358 OPTION_SUBSYSTEM,
359 OPTION_UPDATE_SECTION,
360 OPTION_VERILOG_DATA_WIDTH,
361 OPTION_WEAKEN,
362 OPTION_WEAKEN_SYMBOLS,
363 OPTION_WRITABLE_TEXT
366 /* Options to handle if running as "strip". */
368 static struct option strip_options[] =
370 {"disable-deterministic-archives", no_argument, 0, 'U'},
371 {"discard-all", no_argument, 0, 'x'},
372 {"discard-locals", no_argument, 0, 'X'},
373 {"enable-deterministic-archives", no_argument, 0, 'D'},
374 {"format", required_argument, 0, 'F'}, /* Obsolete */
375 {"help", no_argument, 0, 'h'},
376 {"info", no_argument, 0, OPTION_FORMATS_INFO},
377 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
378 {"input-target", required_argument, 0, 'I'},
379 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
380 {"keep-symbol", required_argument, 0, 'K'},
381 {"merge-notes", no_argument, 0, 'M'},
382 {"no-merge-notes", no_argument, 0, OPTION_NO_MERGE_NOTES},
383 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
384 {"output-file", required_argument, 0, 'o'},
385 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
386 {"output-target", required_argument, 0, 'O'},
387 {"preserve-dates", no_argument, 0, 'p'},
388 {"remove-section", required_argument, 0, 'R'},
389 {"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS},
390 {"strip-all", no_argument, 0, 's'},
391 {"strip-debug", no_argument, 0, 'S'},
392 {"strip-dwo", no_argument, 0, OPTION_STRIP_DWO},
393 {"strip-symbol", required_argument, 0, 'N'},
394 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
395 {"target", required_argument, 0, 'F'},
396 {"verbose", no_argument, 0, 'v'},
397 {"version", no_argument, 0, 'V'},
398 {"wildcard", no_argument, 0, 'w'},
399 {0, no_argument, 0, 0}
402 /* Options to handle if running as "objcopy". */
404 static struct option copy_options[] =
406 {"add-gnu-debuglink", required_argument, 0, OPTION_ADD_GNU_DEBUGLINK},
407 {"add-section", required_argument, 0, OPTION_ADD_SECTION},
408 {"add-symbol", required_argument, 0, OPTION_ADD_SYMBOL},
409 {"adjust-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
410 {"adjust-start", required_argument, 0, OPTION_CHANGE_START},
411 {"adjust-vma", required_argument, 0, OPTION_CHANGE_ADDRESSES},
412 {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
413 {"alt-machine-code", required_argument, 0, OPTION_ALT_MACH_CODE},
414 {"binary-architecture", required_argument, 0, 'B'},
415 {"byte", required_argument, 0, 'b'},
416 {"change-addresses", required_argument, 0, OPTION_CHANGE_ADDRESSES},
417 {"change-leading-char", no_argument, 0, OPTION_CHANGE_LEADING_CHAR},
418 {"change-section-address", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
419 {"change-section-lma", required_argument, 0, OPTION_CHANGE_SECTION_LMA},
420 {"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA},
421 {"change-start", required_argument, 0, OPTION_CHANGE_START},
422 {"change-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
423 {"compress-debug-sections", optional_argument, 0, OPTION_COMPRESS_DEBUG_SECTIONS},
424 {"debugging", no_argument, 0, OPTION_DEBUGGING},
425 {"decompress-debug-sections", no_argument, 0, OPTION_DECOMPRESS_DEBUG_SECTIONS},
426 {"disable-deterministic-archives", no_argument, 0, 'U'},
427 {"discard-all", no_argument, 0, 'x'},
428 {"discard-locals", no_argument, 0, 'X'},
429 {"dump-section", required_argument, 0, OPTION_DUMP_SECTION},
430 {"elf-stt-common", required_argument, 0, OPTION_ELF_STT_COMMON},
431 {"enable-deterministic-archives", no_argument, 0, 'D'},
432 {"extract-dwo", no_argument, 0, OPTION_EXTRACT_DWO},
433 {"extract-symbol", no_argument, 0, OPTION_EXTRACT_SYMBOL},
434 {"file-alignment", required_argument, 0, OPTION_FILE_ALIGNMENT},
435 {"format", required_argument, 0, 'F'}, /* Obsolete */
436 {"gap-fill", required_argument, 0, OPTION_GAP_FILL},
437 {"globalize-symbol", required_argument, 0, OPTION_GLOBALIZE_SYMBOL},
438 {"globalize-symbols", required_argument, 0, OPTION_GLOBALIZE_SYMBOLS},
439 {"heap", required_argument, 0, OPTION_HEAP},
440 {"help", no_argument, 0, 'h'},
441 {"image-base", required_argument, 0 , OPTION_IMAGE_BASE},
442 {"impure", no_argument, 0, OPTION_IMPURE},
443 {"info", no_argument, 0, OPTION_FORMATS_INFO},
444 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
445 {"input-target", required_argument, 0, 'I'},
446 {"interleave", optional_argument, 0, 'i'},
447 {"interleave-width", required_argument, 0, OPTION_INTERLEAVE_WIDTH},
448 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
449 {"keep-global-symbol", required_argument, 0, 'G'},
450 {"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS},
451 {"keep-symbol", required_argument, 0, 'K'},
452 {"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS},
453 {"localize-hidden", no_argument, 0, OPTION_LOCALIZE_HIDDEN},
454 {"localize-symbol", required_argument, 0, 'L'},
455 {"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
456 {"long-section-names", required_argument, 0, OPTION_LONG_SECTION_NAMES},
457 {"merge-notes", no_argument, 0, 'M'},
458 {"no-merge-notes", no_argument, 0, OPTION_NO_MERGE_NOTES},
459 {"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
460 {"no-change-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
461 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
462 {"only-section", required_argument, 0, 'j'},
463 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
464 {"output-target", required_argument, 0, 'O'},
465 {"pad-to", required_argument, 0, OPTION_PAD_TO},
466 {"prefix-alloc-sections", required_argument, 0, OPTION_PREFIX_ALLOC_SECTIONS},
467 {"prefix-sections", required_argument, 0, OPTION_PREFIX_SECTIONS},
468 {"prefix-symbols", required_argument, 0, OPTION_PREFIX_SYMBOLS},
469 {"preserve-dates", no_argument, 0, 'p'},
470 {"pure", no_argument, 0, OPTION_PURE},
471 {"readonly-text", no_argument, 0, OPTION_READONLY_TEXT},
472 {"redefine-sym", required_argument, 0, OPTION_REDEFINE_SYM},
473 {"redefine-syms", required_argument, 0, OPTION_REDEFINE_SYMS},
474 {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR},
475 {"remove-section", required_argument, 0, 'R'},
476 {"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS},
477 {"rename-section", required_argument, 0, OPTION_RENAME_SECTION},
478 {"reverse-bytes", required_argument, 0, OPTION_REVERSE_BYTES},
479 {"section-alignment", required_argument, 0, OPTION_SECTION_ALIGNMENT},
480 {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS},
481 {"set-start", required_argument, 0, OPTION_SET_START},
482 {"srec-forceS3", no_argument, 0, OPTION_SREC_FORCES3},
483 {"srec-len", required_argument, 0, OPTION_SREC_LEN},
484 {"stack", required_argument, 0, OPTION_STACK},
485 {"strip-all", no_argument, 0, 'S'},
486 {"strip-debug", no_argument, 0, 'g'},
487 {"strip-dwo", no_argument, 0, OPTION_STRIP_DWO},
488 {"strip-symbol", required_argument, 0, 'N'},
489 {"strip-symbols", required_argument, 0, OPTION_STRIP_SYMBOLS},
490 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
491 {"strip-unneeded-symbol", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOL},
492 {"strip-unneeded-symbols", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOLS},
493 {"subsystem", required_argument, 0, OPTION_SUBSYSTEM},
494 {"target", required_argument, 0, 'F'},
495 {"update-section", required_argument, 0, OPTION_UPDATE_SECTION},
496 {"verbose", no_argument, 0, 'v'},
497 {"verilog-data-width", required_argument, 0, OPTION_VERILOG_DATA_WIDTH},
498 {"version", no_argument, 0, 'V'},
499 {"weaken", no_argument, 0, OPTION_WEAKEN},
500 {"weaken-symbol", required_argument, 0, 'W'},
501 {"weaken-symbols", required_argument, 0, OPTION_WEAKEN_SYMBOLS},
502 {"wildcard", no_argument, 0, 'w'},
503 {"writable-text", no_argument, 0, OPTION_WRITABLE_TEXT},
504 {0, no_argument, 0, 0}
507 /* IMPORTS */
508 extern char *program_name;
510 /* This flag distinguishes between strip and objcopy:
511 1 means this is 'strip'; 0 means this is 'objcopy'.
512 -1 means if we should use argv[0] to decide. */
513 extern int is_strip;
515 /* The maximum length of an S record. This variable is defined in srec.c
516 and can be modified by the --srec-len parameter. */
517 extern unsigned int _bfd_srec_len;
519 /* Restrict the generation of Srecords to type S3 only.
520 This variable is defined in bfd/srec.c and can be toggled
521 on by the --srec-forceS3 command line switch. */
522 extern bfd_boolean _bfd_srec_forceS3;
524 /* Width of data in bytes for verilog output.
525 This variable is declared in bfd/verilog.c and can be modified by
526 the --verilog-data-width parameter. */
527 extern unsigned int VerilogDataWidth;
529 /* Forward declarations. */
530 static void setup_section (bfd *, asection *, void *);
531 static void setup_bfd_headers (bfd *, bfd *);
532 static void copy_relocations_in_section (bfd *, asection *, void *);
533 static void copy_section (bfd *, asection *, void *);
534 static void get_sections (bfd *, asection *, void *);
535 static int compare_section_lma (const void *, const void *);
536 static void mark_symbols_used_in_relocations (bfd *, asection *, void *);
537 static bfd_boolean write_debugging_info (bfd *, void *, long *, asymbol ***);
538 static const char *lookup_sym_redefinition (const char *);
539 static const char *find_section_rename (const char *, flagword *);
541 ATTRIBUTE_NORETURN static void
542 copy_usage (FILE *stream, int exit_status)
544 fprintf (stream, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name);
545 fprintf (stream, _(" Copies a binary file, possibly transforming it in the process\n"));
546 fprintf (stream, _(" The options are:\n"));
547 fprintf (stream, _("\
548 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
549 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
550 -B --binary-architecture <arch> Set output arch, when input is arch-less\n\
551 -F --target <bfdname> Set both input and output format to <bfdname>\n\
552 --debugging Convert debugging information, if possible\n\
553 -p --preserve-dates Copy modified/access timestamps to the output\n"));
554 if (DEFAULT_AR_DETERMINISTIC)
555 fprintf (stream, _("\
556 -D --enable-deterministic-archives\n\
557 Produce deterministic output when stripping archives (default)\n\
558 -U --disable-deterministic-archives\n\
559 Disable -D behavior\n"));
560 else
561 fprintf (stream, _("\
562 -D --enable-deterministic-archives\n\
563 Produce deterministic output when stripping archives\n\
564 -U --disable-deterministic-archives\n\
565 Disable -D behavior (default)\n"));
566 fprintf (stream, _("\
567 -j --only-section <name> Only copy section <name> into the output\n\
568 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
569 -R --remove-section <name> Remove section <name> from the output\n\
570 --remove-relocations <name> Remove relocations from section <name>\n\
571 -S --strip-all Remove all symbol and relocation information\n\
572 -g --strip-debug Remove all debugging symbols & sections\n\
573 --strip-dwo Remove all DWO sections\n\
574 --strip-unneeded Remove all symbols not needed by relocations\n\
575 -N --strip-symbol <name> Do not copy symbol <name>\n\
576 --strip-unneeded-symbol <name>\n\
577 Do not copy symbol <name> unless needed by\n\
578 relocations\n\
579 --only-keep-debug Strip everything but the debug information\n\
580 --extract-dwo Copy only DWO sections\n\
581 --extract-symbol Remove section contents but keep symbols\n\
582 -K --keep-symbol <name> Do not strip symbol <name>\n\
583 --keep-file-symbols Do not strip file symbol(s)\n\
584 --localize-hidden Turn all ELF hidden symbols into locals\n\
585 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
586 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
587 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
588 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
589 --weaken Force all global symbols to be marked as weak\n\
590 -w --wildcard Permit wildcard in symbol comparison\n\
591 -x --discard-all Remove all non-global symbols\n\
592 -X --discard-locals Remove any compiler-generated symbols\n\
593 -i --interleave[=<number>] Only copy N out of every <number> bytes\n\
594 --interleave-width <number> Set N for --interleave\n\
595 -b --byte <num> Select byte <num> in every interleaved block\n\
596 --gap-fill <val> Fill gaps between sections with <val>\n\
597 --pad-to <addr> Pad the last section up to address <addr>\n\
598 --set-start <addr> Set the start address to <addr>\n\
599 {--change-start|--adjust-start} <incr>\n\
600 Add <incr> to the start address\n\
601 {--change-addresses|--adjust-vma} <incr>\n\
602 Add <incr> to LMA, VMA and start addresses\n\
603 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
604 Change LMA and VMA of section <name> by <val>\n\
605 --change-section-lma <name>{=|+|-}<val>\n\
606 Change the LMA of section <name> by <val>\n\
607 --change-section-vma <name>{=|+|-}<val>\n\
608 Change the VMA of section <name> by <val>\n\
609 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
610 Warn if a named section does not exist\n\
611 --set-section-flags <name>=<flags>\n\
612 Set section <name>'s properties to <flags>\n\
613 --add-section <name>=<file> Add section <name> found in <file> to output\n\
614 --update-section <name>=<file>\n\
615 Update contents of section <name> with\n\
616 contents found in <file>\n\
617 --dump-section <name>=<file> Dump the contents of section <name> into <file>\n\
618 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
619 --long-section-names {enable|disable|keep}\n\
620 Handle long section names in Coff objects.\n\
621 --change-leading-char Force output format's leading character style\n\
622 --remove-leading-char Remove leading character from global symbols\n\
623 --reverse-bytes=<num> Reverse <num> bytes at a time, in output sections with content\n\
624 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
625 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
626 listed in <file>\n\
627 --srec-len <number> Restrict the length of generated Srecords\n\
628 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
629 --strip-symbols <file> -N for all symbols listed in <file>\n\
630 --strip-unneeded-symbols <file>\n\
631 --strip-unneeded-symbol for all symbols listed\n\
632 in <file>\n\
633 --keep-symbols <file> -K for all symbols listed in <file>\n\
634 --localize-symbols <file> -L for all symbols listed in <file>\n\
635 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
636 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
637 --weaken-symbols <file> -W for all symbols listed in <file>\n\
638 --add-symbol <name>=[<section>:]<value>[,<flags>] Add a symbol\n\
639 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
640 --writable-text Mark the output text as writable\n\
641 --readonly-text Make the output text write protected\n\
642 --pure Mark the output file as demand paged\n\
643 --impure Mark the output file as impure\n\
644 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
645 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
646 --prefix-alloc-sections <prefix>\n\
647 Add <prefix> to start of every allocatable\n\
648 section name\n\
649 --file-alignment <num> Set PE file alignment to <num>\n\
650 --heap <reserve>[,<commit>] Set PE reserve/commit heap to <reserve>/\n\
651 <commit>\n\
652 --image-base <address> Set PE image base to <address>\n\
653 --section-alignment <num> Set PE section alignment to <num>\n\
654 --stack <reserve>[,<commit>] Set PE reserve/commit stack to <reserve>/\n\
655 <commit>\n\
656 --subsystem <name>[:<version>]\n\
657 Set PE subsystem to <name> [& <version>]\n\
658 --compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi}]\n\
659 Compress DWARF debug sections using zlib\n\
660 --decompress-debug-sections Decompress DWARF debug sections using zlib\n\
661 --elf-stt-common=[yes|no] Generate ELF common symbols with STT_COMMON\n\
662 type\n\
663 --verilog-data-width <number> Specifies data width, in bytes, for verilog output\n\
664 -M --merge-notes Remove redundant entries in note sections\n\
665 --no-merge-notes Do not attempt to remove redundant notes (default)\n\
666 -v --verbose List all object files modified\n\
667 @<file> Read options from <file>\n\
668 -V --version Display this program's version number\n\
669 -h --help Display this output\n\
670 --info List object formats & architectures supported\n\
671 "));
672 list_supported_targets (program_name, stream);
673 if (REPORT_BUGS_TO[0] && exit_status == 0)
674 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
675 exit (exit_status);
678 ATTRIBUTE_NORETURN static void
679 strip_usage (FILE *stream, int exit_status)
681 fprintf (stream, _("Usage: %s <option(s)> in-file(s)\n"), program_name);
682 fprintf (stream, _(" Removes symbols and sections from files\n"));
683 fprintf (stream, _(" The options are:\n"));
684 fprintf (stream, _("\
685 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
686 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
687 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
688 -p --preserve-dates Copy modified/access timestamps to the output\n\
689 "));
690 if (DEFAULT_AR_DETERMINISTIC)
691 fprintf (stream, _("\
692 -D --enable-deterministic-archives\n\
693 Produce deterministic output when stripping archives (default)\n\
694 -U --disable-deterministic-archives\n\
695 Disable -D behavior\n"));
696 else
697 fprintf (stream, _("\
698 -D --enable-deterministic-archives\n\
699 Produce deterministic output when stripping archives\n\
700 -U --disable-deterministic-archives\n\
701 Disable -D behavior (default)\n"));
702 fprintf (stream, _("\
703 -R --remove-section=<name> Also remove section <name> from the output\n\
704 --remove-relocations <name> Remove relocations from section <name>\n\
705 -s --strip-all Remove all symbol and relocation information\n\
706 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
707 --strip-dwo Remove all DWO sections\n\
708 --strip-unneeded Remove all symbols not needed by relocations\n\
709 --only-keep-debug Strip everything but the debug information\n\
710 -M --merge-notes Remove redundant entries in note sections (default)\n\
711 --no-merge-notes Do not attempt to remove redundant notes\n\
712 -N --strip-symbol=<name> Do not copy symbol <name>\n\
713 -K --keep-symbol=<name> Do not strip symbol <name>\n\
714 --keep-file-symbols Do not strip file symbol(s)\n\
715 -w --wildcard Permit wildcard in symbol comparison\n\
716 -x --discard-all Remove all non-global symbols\n\
717 -X --discard-locals Remove any compiler-generated symbols\n\
718 -v --verbose List all object files modified\n\
719 -V --version Display this program's version number\n\
720 -h --help Display this output\n\
721 --info List object formats & architectures supported\n\
722 -o <file> Place stripped output into <file>\n\
723 "));
725 list_supported_targets (program_name, stream);
726 if (REPORT_BUGS_TO[0] && exit_status == 0)
727 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
728 exit (exit_status);
731 /* Parse section flags into a flagword, with a fatal error if the
732 string can't be parsed. */
734 static flagword
735 parse_flags (const char *s)
737 flagword ret;
738 const char *snext;
739 int len;
741 ret = SEC_NO_FLAGS;
745 snext = strchr (s, ',');
746 if (snext == NULL)
747 len = strlen (s);
748 else
750 len = snext - s;
751 ++snext;
754 if (0) ;
755 #define PARSE_FLAG(fname,fval) \
756 else if (strncasecmp (fname, s, len) == 0) ret |= fval
757 PARSE_FLAG ("alloc", SEC_ALLOC);
758 PARSE_FLAG ("load", SEC_LOAD);
759 PARSE_FLAG ("noload", SEC_NEVER_LOAD);
760 PARSE_FLAG ("readonly", SEC_READONLY);
761 PARSE_FLAG ("debug", SEC_DEBUGGING);
762 PARSE_FLAG ("code", SEC_CODE);
763 PARSE_FLAG ("data", SEC_DATA);
764 PARSE_FLAG ("rom", SEC_ROM);
765 PARSE_FLAG ("share", SEC_COFF_SHARED);
766 PARSE_FLAG ("contents", SEC_HAS_CONTENTS);
767 PARSE_FLAG ("merge", SEC_MERGE);
768 PARSE_FLAG ("strings", SEC_STRINGS);
769 #undef PARSE_FLAG
770 else
772 char *copy;
774 copy = (char *) xmalloc (len + 1);
775 strncpy (copy, s, len);
776 copy[len] = '\0';
777 non_fatal (_("unrecognized section flag `%s'"), copy);
778 fatal (_("supported flags: %s"),
779 "alloc, load, noload, readonly, debug, code, data, rom, share, contents, merge, strings");
782 s = snext;
784 while (s != NULL);
786 return ret;
789 /* Parse symbol flags into a flagword, with a fatal error if the
790 string can't be parsed. */
792 static flagword
793 parse_symflags (const char *s, char **other)
795 flagword ret;
796 const char *snext;
797 size_t len;
799 ret = BSF_NO_FLAGS;
803 snext = strchr (s, ',');
804 if (snext == NULL)
805 len = strlen (s);
806 else
808 len = snext - s;
809 ++snext;
812 #define PARSE_FLAG(fname, fval) \
813 else if (len == sizeof fname - 1 \
814 && strncasecmp (fname, s, len) == 0) \
815 ret |= fval
817 #define PARSE_OTHER(fname, fval) \
818 else if (len >= sizeof fname \
819 && strncasecmp (fname, s, sizeof fname - 1) == 0) \
820 fval = xstrndup (s + sizeof fname - 1, len - sizeof fname + 1)
822 if (0) ;
823 PARSE_FLAG ("local", BSF_LOCAL);
824 PARSE_FLAG ("global", BSF_GLOBAL);
825 PARSE_FLAG ("export", BSF_EXPORT);
826 PARSE_FLAG ("debug", BSF_DEBUGGING);
827 PARSE_FLAG ("function", BSF_FUNCTION);
828 PARSE_FLAG ("weak", BSF_WEAK);
829 PARSE_FLAG ("section", BSF_SECTION_SYM);
830 PARSE_FLAG ("constructor", BSF_CONSTRUCTOR);
831 PARSE_FLAG ("warning", BSF_WARNING);
832 PARSE_FLAG ("indirect", BSF_INDIRECT);
833 PARSE_FLAG ("file", BSF_FILE);
834 PARSE_FLAG ("object", BSF_OBJECT);
835 PARSE_FLAG ("synthetic", BSF_SYNTHETIC);
836 PARSE_FLAG ("indirect-function", BSF_GNU_INDIRECT_FUNCTION | BSF_FUNCTION);
837 PARSE_FLAG ("unique-object", BSF_GNU_UNIQUE | BSF_OBJECT);
838 PARSE_OTHER ("before=", *other);
840 #undef PARSE_FLAG
841 #undef PARSE_OTHER
842 else
844 char *copy;
846 copy = (char *) xmalloc (len + 1);
847 strncpy (copy, s, len);
848 copy[len] = '\0';
849 non_fatal (_("unrecognized symbol flag `%s'"), copy);
850 fatal (_("supported flags: %s"),
851 "local, global, export, debug, function, weak, section, "
852 "constructor, warning, indirect, file, object, synthetic, "
853 "indirect-function, unique-object, before=<othersym>");
856 s = snext;
858 while (s != NULL);
860 return ret;
863 /* Find and optionally add an entry in the change_sections list.
865 We need to be careful in how we match section names because of the support
866 for wildcard characters. For example suppose that the user has invoked
867 objcopy like this:
869 --set-section-flags .debug_*=debug
870 --set-section-flags .debug_str=readonly,debug
871 --change-section-address .debug_*ranges=0x1000
873 With the idea that all debug sections will receive the DEBUG flag, the
874 .debug_str section will also receive the READONLY flag and the
875 .debug_ranges and .debug_aranges sections will have their address set to
876 0x1000. (This may not make much sense, but it is just an example).
878 When adding the section name patterns to the section list we need to make
879 sure that previous entries do not match with the new entry, unless the
880 match is exact. (In which case we assume that the user is overriding
881 the previous entry with the new context).
883 When matching real section names to the section list we make use of the
884 wildcard characters, but we must do so in context. Eg if we are setting
885 section addresses then we match for .debug_ranges but not for .debug_info.
887 Finally, if ADD is false and we do find a match, we mark the section list
888 entry as used. */
890 static struct section_list *
891 find_section_list (const char *name, bfd_boolean add, unsigned int context)
893 struct section_list *p, *match = NULL;
895 /* assert ((context & ((1 << 7) - 1)) != 0); */
897 for (p = change_sections; p != NULL; p = p->next)
899 if (add)
901 if (strcmp (p->pattern, name) == 0)
903 /* Check for context conflicts. */
904 if (((p->context & SECTION_CONTEXT_REMOVE)
905 && (context & SECTION_CONTEXT_COPY))
906 || ((context & SECTION_CONTEXT_REMOVE)
907 && (p->context & SECTION_CONTEXT_COPY)))
908 fatal (_("error: %s both copied and removed"), name);
910 if (((p->context & SECTION_CONTEXT_SET_VMA)
911 && (context & SECTION_CONTEXT_ALTER_VMA))
912 || ((context & SECTION_CONTEXT_SET_VMA)
913 && (context & SECTION_CONTEXT_ALTER_VMA)))
914 fatal (_("error: %s both sets and alters VMA"), name);
916 if (((p->context & SECTION_CONTEXT_SET_LMA)
917 && (context & SECTION_CONTEXT_ALTER_LMA))
918 || ((context & SECTION_CONTEXT_SET_LMA)
919 && (context & SECTION_CONTEXT_ALTER_LMA)))
920 fatal (_("error: %s both sets and alters LMA"), name);
922 /* Extend the context. */
923 p->context |= context;
924 return p;
927 /* If we are not adding a new name/pattern then
928 only check for a match if the context applies. */
929 else if (p->context & context)
931 /* We could check for the presence of wildchar characters
932 first and choose between calling strcmp and fnmatch,
933 but is that really worth it ? */
934 if (p->pattern [0] == '!')
936 if (fnmatch (p->pattern + 1, name, 0) == 0)
938 p->used = TRUE;
939 return NULL;
942 else
944 if (fnmatch (p->pattern, name, 0) == 0)
946 if (match == NULL)
947 match = p;
953 if (! add)
955 if (match != NULL)
956 match->used = TRUE;
957 return match;
960 p = (struct section_list *) xmalloc (sizeof (struct section_list));
961 p->pattern = name;
962 p->used = FALSE;
963 p->context = context;
964 p->vma_val = 0;
965 p->lma_val = 0;
966 p->flags = 0;
967 p->next = change_sections;
968 change_sections = p;
970 return p;
973 /* S1 is the entry node already in the table, S2 is the key node. */
975 static int
976 eq_string_redefnode (const void *s1, const void *s2)
978 struct redefine_node *node1 = (struct redefine_node *) s1;
979 struct redefine_node *node2 = (struct redefine_node *) s2;
980 return !strcmp ((const char *) node1->source, (const char *) node2->source);
983 /* P is redefine node. Hash value is generated from its "source" filed. */
985 static hashval_t
986 htab_hash_redefnode (const void *p)
988 struct redefine_node *redefnode = (struct redefine_node *) p;
989 return htab_hash_string (redefnode->source);
992 /* Create hashtab used for redefine node. */
994 static htab_t
995 create_symbol2redef_htab (void)
997 return htab_create_alloc (16, htab_hash_redefnode, eq_string_redefnode, NULL,
998 xcalloc, free);
1001 /* There is htab_hash_string but no htab_eq_string. Makes sense. */
1003 static int
1004 eq_string (const void *s1, const void *s2)
1006 return strcmp ((const char *) s1, (const char *) s2) == 0;
1009 static htab_t
1010 create_symbol_htab (void)
1012 return htab_create_alloc (16, htab_hash_string, eq_string, NULL, xcalloc, free);
1015 static void
1016 create_symbol_htabs (void)
1018 strip_specific_htab = create_symbol_htab ();
1019 strip_unneeded_htab = create_symbol_htab ();
1020 keep_specific_htab = create_symbol_htab ();
1021 localize_specific_htab = create_symbol_htab ();
1022 globalize_specific_htab = create_symbol_htab ();
1023 keepglobal_specific_htab = create_symbol_htab ();
1024 weaken_specific_htab = create_symbol_htab ();
1025 redefine_specific_htab = create_symbol2redef_htab ();
1026 /* As there is no bidirectional hash table in libiberty, need a reverse table
1027 to check duplicated target string. */
1028 redefine_specific_reverse_htab = create_symbol_htab ();
1031 /* Add a symbol to strip_specific_list. */
1033 static void
1034 add_specific_symbol (const char *name, htab_t htab)
1036 *htab_find_slot (htab, name, INSERT) = (char *) name;
1039 /* Like add_specific_symbol, but the element type is void *. */
1041 static void
1042 add_specific_symbol_node (const void *node, htab_t htab)
1044 *htab_find_slot (htab, node, INSERT) = (void *) node;
1047 /* Add symbols listed in `filename' to strip_specific_list. */
1049 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
1050 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
1052 static void
1053 add_specific_symbols (const char *filename, htab_t htab, char **buffer_p)
1055 off_t size;
1056 FILE * f;
1057 char * line;
1058 char * buffer;
1059 unsigned int line_count;
1061 size = get_file_size (filename);
1062 if (size == 0)
1064 status = 1;
1065 return;
1068 buffer = (char *) xmalloc (size + 2);
1069 f = fopen (filename, FOPEN_RT);
1070 if (f == NULL)
1071 fatal (_("cannot open '%s': %s"), filename, strerror (errno));
1073 if (fread (buffer, 1, size, f) == 0 || ferror (f))
1074 fatal (_("%s: fread failed"), filename);
1076 fclose (f);
1077 buffer [size] = '\n';
1078 buffer [size + 1] = '\0';
1080 line_count = 1;
1082 for (line = buffer; * line != '\0'; line ++)
1084 char * eol;
1085 char * name;
1086 char * name_end;
1087 int finished = FALSE;
1089 for (eol = line;; eol ++)
1091 switch (* eol)
1093 case '\n':
1094 * eol = '\0';
1095 /* Cope with \n\r. */
1096 if (eol[1] == '\r')
1097 ++ eol;
1098 finished = TRUE;
1099 break;
1101 case '\r':
1102 * eol = '\0';
1103 /* Cope with \r\n. */
1104 if (eol[1] == '\n')
1105 ++ eol;
1106 finished = TRUE;
1107 break;
1109 case 0:
1110 finished = TRUE;
1111 break;
1113 case '#':
1114 /* Line comment, Terminate the line here, in case a
1115 name is present and then allow the rest of the
1116 loop to find the real end of the line. */
1117 * eol = '\0';
1118 break;
1120 default:
1121 break;
1124 if (finished)
1125 break;
1128 /* A name may now exist somewhere between 'line' and 'eol'.
1129 Strip off leading whitespace and trailing whitespace,
1130 then add it to the list. */
1131 for (name = line; IS_WHITESPACE (* name); name ++)
1133 for (name_end = name;
1134 (! IS_WHITESPACE (* name_end))
1135 && (! IS_LINE_TERMINATOR (* name_end));
1136 name_end ++)
1139 if (! IS_LINE_TERMINATOR (* name_end))
1141 char * extra;
1143 for (extra = name_end + 1; IS_WHITESPACE (* extra); extra ++)
1146 if (! IS_LINE_TERMINATOR (* extra))
1147 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
1148 filename, line_count);
1151 * name_end = '\0';
1153 if (name_end > name)
1154 add_specific_symbol (name, htab);
1156 /* Advance line pointer to end of line. The 'eol ++' in the for
1157 loop above will then advance us to the start of the next line. */
1158 line = eol;
1159 line_count ++;
1162 /* Do not free the buffer. Parts of it will have been referenced
1163 in the calls to add_specific_symbol. */
1164 *buffer_p = buffer;
1167 /* See whether a symbol should be stripped or kept
1168 based on strip_specific_list and keep_symbols. */
1170 static int
1171 is_specified_symbol_predicate (void **slot, void *data)
1173 struct is_specified_symbol_predicate_data *d =
1174 (struct is_specified_symbol_predicate_data *) data;
1175 const char *slot_name = (char *) *slot;
1177 if (*slot_name != '!')
1179 if (! fnmatch (slot_name, d->name, 0))
1181 d->found = TRUE;
1182 /* Continue traversal, there might be a non-match rule. */
1183 return 1;
1186 else
1188 if (! fnmatch (slot_name + 1, d->name, 0))
1190 d->found = FALSE;
1191 /* Stop traversal. */
1192 return 0;
1196 /* Continue traversal. */
1197 return 1;
1200 static bfd_boolean
1201 is_specified_symbol (const char *name, htab_t htab)
1203 if (wildcard)
1205 struct is_specified_symbol_predicate_data data;
1207 data.name = name;
1208 data.found = FALSE;
1210 htab_traverse (htab, is_specified_symbol_predicate, &data);
1212 return data.found;
1215 return htab_find (htab, name) != NULL;
1218 /* Return a pointer to the symbol used as a signature for GROUP. */
1220 static asymbol *
1221 group_signature (asection *group)
1223 bfd *abfd = group->owner;
1224 Elf_Internal_Shdr *ghdr;
1226 /* PR 20089: An earlier error may have prevented us from loading the symbol table. */
1227 if (isympp == NULL)
1228 return NULL;
1230 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
1231 return NULL;
1233 ghdr = &elf_section_data (group)->this_hdr;
1234 if (ghdr->sh_link == elf_onesymtab (abfd))
1236 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1237 Elf_Internal_Shdr *symhdr = &elf_symtab_hdr (abfd);
1239 if (ghdr->sh_info > 0
1240 && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym)
1241 return isympp[ghdr->sh_info - 1];
1243 return NULL;
1246 /* Return TRUE if the section is a DWO section. */
1248 static bfd_boolean
1249 is_dwo_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1251 const char *name = bfd_get_section_name (abfd, sec);
1252 int len = strlen (name);
1254 return strncmp (name + len - 4, ".dwo", 4) == 0;
1257 /* Return TRUE if section SEC is in the update list. */
1259 static bfd_boolean
1260 is_update_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1262 if (update_sections != NULL)
1264 struct section_add *pupdate;
1266 for (pupdate = update_sections;
1267 pupdate != NULL;
1268 pupdate = pupdate->next)
1270 if (strcmp (sec->name, pupdate->name) == 0)
1271 return TRUE;
1275 return FALSE;
1278 static bfd_boolean
1279 is_merged_note_section (bfd * abfd, asection * sec)
1281 if (merge_notes
1282 && bfd_get_flavour (abfd) == bfd_target_elf_flavour
1283 && elf_section_data (sec)->this_hdr.sh_type == SHT_NOTE
1284 /* FIXME: We currently only support merging GNU_BUILD_NOTEs.
1285 We should add support for more note types. */
1286 && ((elf_section_data (sec)->this_hdr.sh_flags & SHF_GNU_BUILD_NOTE) != 0
1287 /* Old versions of GAS (prior to 2.27) could not set the section
1288 flags to OS-specific values, so we also accept sections with the
1289 expected name. */
1290 || (strcmp (sec->name, GNU_BUILD_ATTRS_SECTION_NAME) == 0)))
1291 return TRUE;
1293 return FALSE;
1296 /* See if a non-group section is being removed. */
1298 static bfd_boolean
1299 is_strip_section_1 (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1301 if (sections_removed || sections_copied)
1303 struct section_list *p;
1304 struct section_list *q;
1306 p = find_section_list (bfd_get_section_name (abfd, sec), FALSE,
1307 SECTION_CONTEXT_REMOVE);
1308 q = find_section_list (bfd_get_section_name (abfd, sec), FALSE,
1309 SECTION_CONTEXT_COPY);
1311 if (p && q)
1312 fatal (_("error: section %s matches both remove and copy options"),
1313 bfd_get_section_name (abfd, sec));
1314 if (p && is_update_section (abfd, sec))
1315 fatal (_("error: section %s matches both update and remove options"),
1316 bfd_get_section_name (abfd, sec));
1318 if (p != NULL)
1319 return TRUE;
1320 if (sections_copied && q == NULL)
1321 return TRUE;
1324 if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
1326 if (strip_symbols == STRIP_DEBUG
1327 || strip_symbols == STRIP_UNNEEDED
1328 || strip_symbols == STRIP_ALL
1329 || discard_locals == LOCALS_ALL
1330 || convert_debugging)
1332 /* By default we don't want to strip .reloc section.
1333 This section has for pe-coff special meaning. See
1334 pe-dll.c file in ld, and peXXigen.c in bfd for details. */
1335 if (strcmp (bfd_get_section_name (abfd, sec), ".reloc") != 0)
1336 return TRUE;
1339 if (strip_symbols == STRIP_DWO)
1340 return is_dwo_section (abfd, sec);
1342 if (strip_symbols == STRIP_NONDEBUG)
1343 return FALSE;
1346 if (strip_symbols == STRIP_NONDWO)
1347 return !is_dwo_section (abfd, sec);
1349 return FALSE;
1352 /* See if a section is being removed. */
1354 static bfd_boolean
1355 is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1357 if (is_strip_section_1 (abfd, sec))
1358 return TRUE;
1360 if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0)
1362 asymbol *gsym;
1363 const char *gname;
1364 asection *elt, *first;
1366 gsym = group_signature (sec);
1367 /* Strip groups without a valid signature. */
1368 if (gsym == NULL)
1369 return TRUE;
1371 /* PR binutils/3181
1372 If we are going to strip the group signature symbol, then
1373 strip the group section too. */
1374 gname = gsym->name;
1375 if ((strip_symbols == STRIP_ALL
1376 && !is_specified_symbol (gname, keep_specific_htab))
1377 || is_specified_symbol (gname, strip_specific_htab))
1378 return TRUE;
1380 /* Remove the group section if all members are removed. */
1381 first = elt = elf_next_in_group (sec);
1382 while (elt != NULL)
1384 if (!is_strip_section_1 (abfd, elt))
1385 return FALSE;
1386 elt = elf_next_in_group (elt);
1387 if (elt == first)
1388 break;
1391 return TRUE;
1394 return FALSE;
1397 static bfd_boolean
1398 is_nondebug_keep_contents_section (bfd *ibfd, asection *isection)
1400 /* Always keep ELF note sections. */
1401 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
1402 return (elf_section_type (isection) == SHT_NOTE);
1404 /* Always keep the .buildid section for PE/COFF.
1406 Strictly, this should be written "always keep the section storing the debug
1407 directory", but that may be the .text section for objects produced by some
1408 tools, which it is not sensible to keep. */
1409 if (ibfd->xvec->flavour == bfd_target_coff_flavour)
1410 return (strcmp (bfd_get_section_name (ibfd, isection), ".buildid") == 0);
1412 return FALSE;
1415 /* Return true if SYM is a hidden symbol. */
1417 static bfd_boolean
1418 is_hidden_symbol (asymbol *sym)
1420 elf_symbol_type *elf_sym;
1422 elf_sym = elf_symbol_from (sym->the_bfd, sym);
1423 if (elf_sym != NULL)
1424 switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
1426 case STV_HIDDEN:
1427 case STV_INTERNAL:
1428 return TRUE;
1430 return FALSE;
1433 static bfd_boolean
1434 need_sym_before (struct addsym_node **node, const char *sym)
1436 int count;
1437 struct addsym_node *ptr = add_sym_list;
1439 /* 'othersym' symbols are at the front of the list. */
1440 for (count = 0; count < add_symbols; count++)
1442 if (!ptr->othersym)
1443 break;
1444 else if (strcmp (ptr->othersym, sym) == 0)
1446 free (ptr->othersym);
1447 ptr->othersym = ""; /* Empty name is hopefully never a valid symbol name. */
1448 *node = ptr;
1449 return TRUE;
1451 ptr = ptr->next;
1453 return FALSE;
1456 static asymbol *
1457 create_new_symbol (struct addsym_node *ptr, bfd *obfd)
1459 asymbol *sym = bfd_make_empty_symbol (obfd);
1461 bfd_asymbol_name (sym) = ptr->symdef;
1462 sym->value = ptr->symval;
1463 sym->flags = ptr->flags;
1464 if (ptr->section)
1466 asection *sec = bfd_get_section_by_name (obfd, ptr->section);
1467 if (!sec)
1468 fatal (_("Section %s not found"), ptr->section);
1469 sym->section = sec;
1471 else
1472 sym->section = bfd_abs_section_ptr;
1473 return sym;
1476 /* Choose which symbol entries to copy; put the result in OSYMS.
1477 We don't copy in place, because that confuses the relocs.
1478 Return the number of symbols to print. */
1480 static unsigned int
1481 filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
1482 asymbol **isyms, long symcount)
1484 asymbol **from = isyms, **to = osyms;
1485 long src_count = 0, dst_count = 0;
1486 int relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
1488 for (; src_count < symcount; src_count++)
1490 asymbol *sym = from[src_count];
1491 flagword flags = sym->flags;
1492 char *name = (char *) bfd_asymbol_name (sym);
1493 bfd_boolean keep;
1494 bfd_boolean used_in_reloc = FALSE;
1495 bfd_boolean undefined;
1496 bfd_boolean rem_leading_char;
1497 bfd_boolean add_leading_char;
1499 undefined = bfd_is_und_section (bfd_get_section (sym));
1501 if (add_sym_list)
1503 struct addsym_node *ptr;
1505 if (need_sym_before (&ptr, name))
1506 to[dst_count++] = create_new_symbol (ptr, obfd);
1509 if (htab_elements (redefine_specific_htab) || section_rename_list)
1511 char *new_name;
1513 new_name = (char *) lookup_sym_redefinition (name);
1514 if (new_name == name
1515 && (flags & BSF_SECTION_SYM) != 0)
1516 new_name = (char *) find_section_rename (name, NULL);
1517 bfd_asymbol_name (sym) = new_name;
1518 name = new_name;
1521 /* Check if we will remove the current leading character. */
1522 rem_leading_char =
1523 (name[0] == bfd_get_symbol_leading_char (abfd))
1524 && (change_leading_char
1525 || (remove_leading_char
1526 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1527 || undefined
1528 || bfd_is_com_section (bfd_get_section (sym)))));
1530 /* Check if we will add a new leading character. */
1531 add_leading_char =
1532 change_leading_char
1533 && (bfd_get_symbol_leading_char (obfd) != '\0')
1534 && (bfd_get_symbol_leading_char (abfd) == '\0'
1535 || (name[0] == bfd_get_symbol_leading_char (abfd)));
1537 /* Short circuit for change_leading_char if we can do it in-place. */
1538 if (rem_leading_char && add_leading_char && !prefix_symbols_string)
1540 name[0] = bfd_get_symbol_leading_char (obfd);
1541 bfd_asymbol_name (sym) = name;
1542 rem_leading_char = FALSE;
1543 add_leading_char = FALSE;
1546 /* Remove leading char. */
1547 if (rem_leading_char)
1548 bfd_asymbol_name (sym) = ++name;
1550 /* Add new leading char and/or prefix. */
1551 if (add_leading_char || prefix_symbols_string)
1553 char *n, *ptr;
1555 ptr = n = (char *) xmalloc (1 + strlen (prefix_symbols_string)
1556 + strlen (name) + 1);
1557 if (add_leading_char)
1558 *ptr++ = bfd_get_symbol_leading_char (obfd);
1560 if (prefix_symbols_string)
1562 strcpy (ptr, prefix_symbols_string);
1563 ptr += strlen (prefix_symbols_string);
1566 strcpy (ptr, name);
1567 bfd_asymbol_name (sym) = n;
1568 name = n;
1571 if (strip_symbols == STRIP_ALL)
1572 keep = FALSE;
1573 else if ((flags & BSF_KEEP) != 0 /* Used in relocation. */
1574 || ((flags & BSF_SECTION_SYM) != 0
1575 && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
1576 & BSF_KEEP) != 0))
1578 keep = TRUE;
1579 used_in_reloc = TRUE;
1581 else if (relocatable /* Relocatable file. */
1582 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1583 || bfd_is_com_section (bfd_get_section (sym))))
1584 keep = TRUE;
1585 else if (bfd_decode_symclass (sym) == 'I')
1586 /* Global symbols in $idata sections need to be retained
1587 even if relocatable is FALSE. External users of the
1588 library containing the $idata section may reference these
1589 symbols. */
1590 keep = TRUE;
1591 else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */
1592 || (flags & BSF_WEAK) != 0
1593 || undefined
1594 || bfd_is_com_section (bfd_get_section (sym)))
1595 keep = strip_symbols != STRIP_UNNEEDED;
1596 else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */
1597 keep = (strip_symbols != STRIP_DEBUG
1598 && strip_symbols != STRIP_UNNEEDED
1599 && ! convert_debugging);
1600 else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym)))
1601 /* COMDAT sections store special information in local
1602 symbols, so we cannot risk stripping any of them. */
1603 keep = TRUE;
1604 else /* Local symbol. */
1605 keep = (strip_symbols != STRIP_UNNEEDED
1606 && (discard_locals != LOCALS_ALL
1607 && (discard_locals != LOCALS_START_L
1608 || ! bfd_is_local_label (abfd, sym))));
1610 if (keep && is_specified_symbol (name, strip_specific_htab))
1612 /* There are multiple ways to set 'keep' above, but if it
1613 was the relocatable symbol case, then that's an error. */
1614 if (used_in_reloc)
1616 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name);
1617 status = 1;
1619 else
1620 keep = FALSE;
1623 if (keep
1624 && !(flags & BSF_KEEP)
1625 && is_specified_symbol (name, strip_unneeded_htab))
1626 keep = FALSE;
1628 if (!keep
1629 && ((keep_file_symbols && (flags & BSF_FILE))
1630 || is_specified_symbol (name, keep_specific_htab)))
1631 keep = TRUE;
1633 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
1634 keep = FALSE;
1636 if (keep)
1638 if ((flags & BSF_GLOBAL) != 0
1639 && (weaken || is_specified_symbol (name, weaken_specific_htab)))
1641 sym->flags &= ~ BSF_GLOBAL;
1642 sym->flags |= BSF_WEAK;
1645 if (!undefined
1646 && (flags & (BSF_GLOBAL | BSF_WEAK))
1647 && (is_specified_symbol (name, localize_specific_htab)
1648 || (htab_elements (keepglobal_specific_htab) != 0
1649 && ! is_specified_symbol (name, keepglobal_specific_htab))
1650 || (localize_hidden && is_hidden_symbol (sym))))
1652 sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
1653 sym->flags |= BSF_LOCAL;
1656 if (!undefined
1657 && (flags & BSF_LOCAL)
1658 && is_specified_symbol (name, globalize_specific_htab))
1660 sym->flags &= ~ BSF_LOCAL;
1661 sym->flags |= BSF_GLOBAL;
1664 to[dst_count++] = sym;
1667 if (add_sym_list)
1669 struct addsym_node *ptr = add_sym_list;
1671 for (src_count = 0; src_count < add_symbols; src_count++)
1673 if (ptr->othersym)
1675 if (strcmp (ptr->othersym, ""))
1676 fatal (_("'before=%s' not found"), ptr->othersym);
1678 else
1679 to[dst_count++] = create_new_symbol (ptr, obfd);
1681 ptr = ptr->next;
1685 to[dst_count] = NULL;
1687 return dst_count;
1690 /* Find the redefined name of symbol SOURCE. */
1692 static const char *
1693 lookup_sym_redefinition (const char *source)
1695 struct redefine_node key_node = {(char *) source, NULL};
1696 struct redefine_node *redef_node
1697 = (struct redefine_node *) htab_find (redefine_specific_htab, &key_node);
1699 return redef_node == NULL ? source : redef_node->target;
1702 /* Insert a node into symbol redefine hash tabel. */
1704 static void
1705 add_redefine_and_check (const char *cause, const char *source,
1706 const char *target)
1708 struct redefine_node *new_node
1709 = (struct redefine_node *) xmalloc (sizeof (struct redefine_node));
1711 new_node->source = strdup (source);
1712 new_node->target = strdup (target);
1714 if (htab_find (redefine_specific_htab, new_node) != HTAB_EMPTY_ENTRY)
1715 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1716 cause, source);
1718 if (htab_find (redefine_specific_reverse_htab, target) != HTAB_EMPTY_ENTRY)
1719 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
1720 cause, target);
1722 /* Insert the NEW_NODE into hash table for quick search. */
1723 add_specific_symbol_node (new_node, redefine_specific_htab);
1725 /* Insert the target string into the reverse hash table, this is needed for
1726 duplicated target string check. */
1727 add_specific_symbol (new_node->target, redefine_specific_reverse_htab);
1731 /* Handle the --redefine-syms option. Read lines containing "old new"
1732 from the file, and add them to the symbol redefine list. */
1734 static void
1735 add_redefine_syms_file (const char *filename)
1737 FILE *file;
1738 char *buf;
1739 size_t bufsize;
1740 size_t len;
1741 size_t outsym_off;
1742 int c, lineno;
1744 file = fopen (filename, "r");
1745 if (file == NULL)
1746 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1747 filename, strerror (errno));
1749 bufsize = 100;
1750 buf = (char *) xmalloc (bufsize + 1 /* For the terminating NUL. */);
1752 lineno = 1;
1753 c = getc (file);
1754 len = 0;
1755 outsym_off = 0;
1756 while (c != EOF)
1758 /* Collect the input symbol name. */
1759 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1761 if (c == '#')
1762 goto comment;
1763 buf[len++] = c;
1764 if (len >= bufsize)
1766 bufsize *= 2;
1767 buf = (char *) xrealloc (buf, bufsize + 1);
1769 c = getc (file);
1771 buf[len++] = '\0';
1772 if (c == EOF)
1773 break;
1775 /* Eat white space between the symbol names. */
1776 while (IS_WHITESPACE (c))
1777 c = getc (file);
1778 if (c == '#' || IS_LINE_TERMINATOR (c))
1779 goto comment;
1780 if (c == EOF)
1781 break;
1783 /* Collect the output symbol name. */
1784 outsym_off = len;
1785 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1787 if (c == '#')
1788 goto comment;
1789 buf[len++] = c;
1790 if (len >= bufsize)
1792 bufsize *= 2;
1793 buf = (char *) xrealloc (buf, bufsize + 1);
1795 c = getc (file);
1797 buf[len++] = '\0';
1798 if (c == EOF)
1799 break;
1801 /* Eat white space at end of line. */
1802 while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c))
1803 c = getc (file);
1804 if (c == '#')
1805 goto comment;
1806 /* Handle \r\n. */
1807 if ((c == '\r' && (c = getc (file)) == '\n')
1808 || c == '\n' || c == EOF)
1810 end_of_line:
1811 /* Append the redefinition to the list. */
1812 if (buf[0] != '\0')
1813 add_redefine_and_check (filename, &buf[0], &buf[outsym_off]);
1815 lineno++;
1816 len = 0;
1817 outsym_off = 0;
1818 if (c == EOF)
1819 break;
1820 c = getc (file);
1821 continue;
1823 else
1824 fatal (_("%s:%d: garbage found at end of line"), filename, lineno);
1825 comment:
1826 if (len != 0 && (outsym_off == 0 || outsym_off == len))
1827 fatal (_("%s:%d: missing new symbol name"), filename, lineno);
1828 buf[len++] = '\0';
1830 /* Eat the rest of the line and finish it. */
1831 while (c != '\n' && c != EOF)
1832 c = getc (file);
1833 goto end_of_line;
1836 if (len != 0)
1837 fatal (_("%s:%d: premature end of file"), filename, lineno);
1839 free (buf);
1840 fclose (file);
1843 /* Copy unknown object file IBFD onto OBFD.
1844 Returns TRUE upon success, FALSE otherwise. */
1846 static bfd_boolean
1847 copy_unknown_object (bfd *ibfd, bfd *obfd)
1849 char *cbuf;
1850 int tocopy;
1851 long ncopied;
1852 long size;
1853 struct stat buf;
1855 if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1857 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1858 return FALSE;
1861 size = buf.st_size;
1862 if (size < 0)
1864 non_fatal (_("stat returns negative size for `%s'"),
1865 bfd_get_archive_filename (ibfd));
1866 return FALSE;
1869 if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1871 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1872 return FALSE;
1875 if (verbose)
1876 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1877 bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1879 cbuf = (char *) xmalloc (BUFSIZE);
1880 ncopied = 0;
1881 while (ncopied < size)
1883 tocopy = size - ncopied;
1884 if (tocopy > BUFSIZE)
1885 tocopy = BUFSIZE;
1887 if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1888 != (bfd_size_type) tocopy)
1890 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1891 free (cbuf);
1892 return FALSE;
1895 if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1896 != (bfd_size_type) tocopy)
1898 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1899 free (cbuf);
1900 return FALSE;
1903 ncopied += tocopy;
1906 /* We should at least to be able to read it back when copying an
1907 unknown object in an archive. */
1908 chmod (bfd_get_filename (obfd), buf.st_mode | S_IRUSR);
1909 free (cbuf);
1910 return TRUE;
1913 /* Returns the number of bytes needed to store VAL. */
1915 static inline unsigned int
1916 num_bytes (unsigned long val)
1918 unsigned int count = 0;
1920 /* FIXME: There must be a faster way to do this. */
1921 while (val)
1923 count ++;
1924 val >>= 8;
1926 return count;
1929 typedef struct objcopy_internal_note
1931 Elf_Internal_Note note;
1932 bfd_vma start;
1933 bfd_vma end;
1934 bfd_boolean modified;
1935 } objcopy_internal_note;
1937 /* Returns TRUE if a gap does, or could, exist between the address range
1938 covered by PNOTE1 and PNOTE2. */
1940 static bfd_boolean
1941 gap_exists (objcopy_internal_note * pnote1,
1942 objcopy_internal_note * pnote2)
1944 /* Without range end notes, we assume that a gap might exist. */
1945 if (pnote1->end == 0 || pnote2->end == 0)
1946 return TRUE;
1948 /* FIXME: Alignment of 16 bytes taken from x86_64 binaries.
1949 Really we should extract the alignment of the section covered by the notes. */
1950 return BFD_ALIGN (pnote1->end, 16) < pnote2->start;
1953 static bfd_boolean
1954 is_open_note (objcopy_internal_note * pnote)
1956 return (pnote->note.type == NT_GNU_BUILD_ATTRIBUTE_OPEN);
1959 static bfd_boolean
1960 is_func_note (objcopy_internal_note * pnote)
1962 return (pnote->note.type == NT_GNU_BUILD_ATTRIBUTE_FUNC);
1965 static bfd_boolean
1966 is_64bit (bfd * abfd)
1968 /* Should never happen, but let's be paranoid. */
1969 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
1970 return FALSE;
1972 return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64;
1975 /* Merge the notes on SEC, removing redundant entries.
1976 Returns the new, smaller size of the section upon success. */
1978 static bfd_size_type
1979 merge_gnu_build_notes (bfd * abfd, asection * sec, bfd_size_type size, bfd_byte * contents)
1981 objcopy_internal_note * pnotes_end;
1982 objcopy_internal_note * pnotes = NULL;
1983 objcopy_internal_note * pnote;
1984 bfd_size_type remain = size;
1985 unsigned version_1_seen = 0;
1986 unsigned version_2_seen = 0;
1987 unsigned version_3_seen = 0;
1988 bfd_boolean duplicate_found = FALSE;
1989 const char * err = NULL;
1990 bfd_byte * in = contents;
1991 int attribute_type_byte;
1992 int val_start;
1993 unsigned long previous_func_start = 0;
1994 unsigned long previous_open_start = 0;
1995 unsigned long previous_func_end = 0;
1996 unsigned long previous_open_end = 0;
1997 long relsize;
2000 relsize = bfd_get_reloc_upper_bound (abfd, sec);
2001 if (relsize > 0)
2003 arelent ** relpp;
2004 long relcount;
2006 /* If there are relocs associated with this section then we
2007 cannot safely merge it. */
2008 relpp = (arelent **) xmalloc (relsize);
2009 relcount = bfd_canonicalize_reloc (abfd, sec, relpp, isympp);
2010 free (relpp);
2011 if (relcount != 0)
2012 goto done;
2015 /* Make a copy of the notes and convert to our internal format.
2016 Minimum size of a note is 12 bytes. */
2017 pnote = pnotes = (objcopy_internal_note *) xcalloc ((size / 12), sizeof (* pnote));
2018 while (remain >= 12)
2020 bfd_vma start, end;
2022 pnote->note.namesz = (bfd_get_32 (abfd, in ) + 3) & ~3;
2023 pnote->note.descsz = (bfd_get_32 (abfd, in + 4) + 3) & ~3;
2024 pnote->note.type = bfd_get_32 (abfd, in + 8);
2026 if (pnote->note.type != NT_GNU_BUILD_ATTRIBUTE_OPEN
2027 && pnote->note.type != NT_GNU_BUILD_ATTRIBUTE_FUNC)
2029 err = _("corrupt GNU build attribute note: wrong note type");
2030 goto done;
2033 if (pnote->note.namesz + pnote->note.descsz + 12 > remain)
2035 err = _("corrupt GNU build attribute note: note too big");
2036 goto done;
2039 if (pnote->note.namesz < 2)
2041 err = _("corrupt GNU build attribute note: name too small");
2042 goto done;
2045 pnote->note.namedata = (char *)(in + 12);
2046 pnote->note.descdata = (char *)(in + 12 + pnote->note.namesz);
2048 remain -= 12 + pnote->note.namesz + pnote->note.descsz;
2049 in += 12 + pnote->note.namesz + pnote->note.descsz;
2051 if (pnote->note.namesz > 2
2052 && pnote->note.namedata[0] == '$'
2053 && pnote->note.namedata[1] == GNU_BUILD_ATTRIBUTE_VERSION
2054 && pnote->note.namedata[2] == '1')
2055 ++ version_1_seen;
2056 else if (pnote->note.namesz > 4
2057 && pnote->note.namedata[0] == 'G'
2058 && pnote->note.namedata[1] == 'A'
2059 && pnote->note.namedata[2] == '$'
2060 && pnote->note.namedata[3] == GNU_BUILD_ATTRIBUTE_VERSION)
2062 if (pnote->note.namedata[4] == '2')
2063 ++ version_2_seen;
2064 else if (pnote->note.namedata[4] == '3')
2065 ++ version_3_seen;
2066 else
2068 err = _("corrupt GNU build attribute note: unsupported version");
2069 goto done;
2073 switch (pnote->note.descsz)
2075 case 0:
2076 start = end = 0;
2077 break;
2079 case 4:
2080 start = bfd_get_32 (abfd, pnote->note.descdata);
2081 /* FIXME: For version 1 and 2 notes we should try to
2082 calculate the end address by finding a symbol whose
2083 value is START, and then adding in its size.
2085 For now though, since v1 and v2 was not intended to
2086 handle gaps, we chose an artificially large end
2087 address. */
2088 end = (bfd_vma) -1;
2089 break;
2091 case 8:
2092 if (! is_64bit (abfd))
2094 start = bfd_get_32 (abfd, pnote->note.descdata);
2095 end = bfd_get_32 (abfd, pnote->note.descdata + 4);
2097 else
2099 start = bfd_get_64 (abfd, pnote->note.descdata);
2100 /* FIXME: For version 1 and 2 notes we should try to
2101 calculate the end address by finding a symbol whose
2102 value is START, and then adding in its size.
2104 For now though, since v1 and v2 was not intended to
2105 handle gaps, we chose an artificially large end
2106 address. */
2107 end = (bfd_vma) -1;
2109 break;
2111 case 16:
2112 start = bfd_get_64 (abfd, pnote->note.descdata);
2113 end = bfd_get_64 (abfd, pnote->note.descdata + 8);
2114 break;
2116 default:
2117 err = _("corrupt GNU build attribute note: bad description size");
2118 goto done;
2121 if (is_open_note (pnote))
2123 if (start)
2124 previous_open_start = start;
2126 pnote->start = previous_open_start;
2128 if (end)
2129 previous_open_end = end;
2131 pnote->end = previous_open_end;
2133 else
2135 if (start)
2136 previous_func_start = start;
2138 pnote->start = previous_func_start;
2140 if (end)
2141 previous_func_end = end;
2143 pnote->end = previous_func_end;
2146 if (pnote->note.namedata[pnote->note.namesz - 1] != 0)
2148 err = _("corrupt GNU build attribute note: name not NUL terminated");
2149 goto done;
2152 pnote ++;
2155 pnotes_end = pnote;
2157 /* Check that the notes are valid. */
2158 if (remain != 0)
2160 err = _("corrupt GNU build attribute notes: excess data at end");
2161 goto done;
2164 if (version_1_seen == 0 && version_2_seen == 0 && version_3_seen == 0)
2166 err = _("bad GNU build attribute notes: no known versions detected");
2167 goto done;
2170 if ((version_1_seen > 0 && version_2_seen > 0)
2171 || (version_1_seen > 0 && version_3_seen > 0)
2172 || (version_2_seen > 0 && version_3_seen > 0))
2174 err = _("bad GNU build attribute notes: multiple different versions");
2175 goto done;
2178 /* Merging is only needed if there is more than one version note... */
2179 if (version_1_seen == 1 || version_2_seen == 1 || version_3_seen == 1)
2180 goto done;
2182 attribute_type_byte = version_1_seen ? 1 : 3;
2183 val_start = attribute_type_byte + 1;
2185 /* The first note should be the first version note. */
2186 if (pnotes[0].note.namedata[attribute_type_byte] != GNU_BUILD_ATTRIBUTE_VERSION)
2188 err = _("bad GNU build attribute notes: first note not version note");
2189 goto done;
2192 /* Now merge the notes. The rules are:
2193 1. Preserve the ordering of the notes.
2194 2. Preserve any NT_GNU_BUILD_ATTRIBUTE_FUNC notes.
2195 3. Eliminate any NT_GNU_BUILD_ATTRIBUTE_OPEN notes that have the same
2196 full name field as the immediately preceeding note with the same type
2197 of name and whose address ranges coincide.
2198 IE - if there are gaps in the coverage of the notes, then these gaps
2199 must be preserved.
2200 4. Combine the numeric value of any NT_GNU_BUILD_ATTRIBUTE_OPEN notes
2201 of type GNU_BUILD_ATTRIBUTE_STACK_SIZE.
2202 5. If an NT_GNU_BUILD_ATTRIBUTE_OPEN note is going to be preserved and
2203 its description field is empty then the nearest preceeding OPEN note
2204 with a non-empty description field must also be preserved *OR* the
2205 description field of the note must be changed to contain the starting
2206 address to which it refers.
2207 6. Notes with the same start and end address can be deleted. */
2208 for (pnote = pnotes + 1; pnote < pnotes_end; pnote ++)
2210 int note_type;
2211 objcopy_internal_note * back;
2212 objcopy_internal_note * prev_open_with_range = NULL;
2214 /* Rule 6 - delete 0-range notes. */
2215 if (pnote->start == pnote->end)
2217 duplicate_found = TRUE;
2218 pnote->note.type = 0;
2219 continue;
2222 /* Rule 2 - preserve function notes. */
2223 if (! is_open_note (pnote))
2225 int iter;
2227 /* Check to see if there is an identical previous function note.
2228 This can happen with overlays for example. */
2229 for (iter = 0, back = pnote -1; back >= pnotes; back --)
2231 if (back->start == pnote->start
2232 && back->end == pnote->end
2233 && back->note.namesz == pnote->note.namesz
2234 && memcmp (back->note.namedata, pnote->note.namedata, pnote->note.namesz) == 0)
2236 fprintf (stderr, "DUP FUNXC\n");
2237 duplicate_found = TRUE;
2238 pnote->note.type = 0;
2239 break;
2242 /* Don't scan too far back however. */
2243 if (iter ++ > 16)
2244 break;
2246 continue;
2249 note_type = pnote->note.namedata[attribute_type_byte];
2251 /* Scan backwards from pnote, looking for duplicates.
2252 Clear the type field of any found - but do not delete them just yet. */
2253 for (back = pnote - 1; back >= pnotes; back --)
2255 int back_type = back->note.namedata[attribute_type_byte];
2257 /* If this is the first open note with an address
2258 range that we have encountered then record it. */
2259 if (prev_open_with_range == NULL
2260 && back->note.descsz > 0
2261 && ! is_func_note (back))
2262 prev_open_with_range = back;
2264 if (! is_open_note (back))
2265 continue;
2267 /* If the two notes are different then keep on searching. */
2268 if (back_type != note_type)
2269 continue;
2271 /* Rule 4 - combine stack size notes. */
2272 if (back_type == GNU_BUILD_ATTRIBUTE_STACK_SIZE)
2274 unsigned char * name;
2275 unsigned long note_val;
2276 unsigned long back_val;
2277 unsigned int shift;
2278 unsigned int bytes;
2279 unsigned long byte;
2281 for (shift = 0, note_val = 0,
2282 bytes = pnote->note.namesz - val_start,
2283 name = (unsigned char *) pnote->note.namedata + val_start;
2284 bytes--;)
2286 byte = (* name ++) & 0xff;
2287 note_val |= byte << shift;
2288 shift += 8;
2291 for (shift = 0, back_val = 0,
2292 bytes = back->note.namesz - val_start,
2293 name = (unsigned char *) back->note.namedata + val_start;
2294 bytes--;)
2296 byte = (* name ++) & 0xff;
2297 back_val |= byte << shift;
2298 shift += 8;
2301 back_val += note_val;
2302 if (num_bytes (back_val) >= back->note.namesz - val_start)
2304 /* We have a problem - the new value requires more bytes of
2305 storage in the name field than are available. Currently
2306 we have no way of fixing this, so we just preserve both
2307 notes. */
2308 continue;
2311 /* Write the new val into back. */
2312 name = (unsigned char *) back->note.namedata + val_start;
2313 while (name < (unsigned char *) back->note.namedata
2314 + back->note.namesz)
2316 byte = back_val & 0xff;
2317 * name ++ = byte;
2318 if (back_val == 0)
2319 break;
2320 back_val >>= 8;
2323 duplicate_found = TRUE;
2324 pnote->note.type = 0;
2325 break;
2328 /* Rule 3 - combine identical open notes. */
2329 if (back->note.namesz == pnote->note.namesz
2330 && memcmp (back->note.namedata,
2331 pnote->note.namedata, back->note.namesz) == 0
2332 && ! gap_exists (back, pnote))
2334 duplicate_found = TRUE;
2335 pnote->note.type = 0;
2337 if (pnote->end > back->end)
2338 back->end = pnote->end;
2340 if (version_3_seen)
2341 back->modified = TRUE;
2342 break;
2345 /* Rule 5 - Since we are keeping this note we must check to see
2346 if its description refers back to an earlier OPEN version
2347 note that has been scheduled for deletion. If so then we
2348 must make sure that version note is also preserved. */
2349 if (version_3_seen)
2351 /* As of version 3 we can just
2352 move the range into the note. */
2353 pnote->modified = TRUE;
2354 pnote->note.type = NT_GNU_BUILD_ATTRIBUTE_FUNC;
2355 back->modified = TRUE;
2356 back->note.type = NT_GNU_BUILD_ATTRIBUTE_FUNC;
2358 else
2360 if (pnote->note.descsz == 0
2361 && prev_open_with_range != NULL
2362 && prev_open_with_range->note.type == 0)
2363 prev_open_with_range->note.type = NT_GNU_BUILD_ATTRIBUTE_OPEN;
2366 /* We have found a similar attribute but the details do not match.
2367 Stop searching backwards. */
2368 break;
2372 if (duplicate_found)
2374 bfd_byte * new_contents;
2375 bfd_byte * old;
2376 bfd_byte * new;
2377 bfd_size_type new_size;
2378 bfd_vma prev_start = 0;
2379 bfd_vma prev_end = 0;
2381 /* Eliminate the duplicates. */
2382 new = new_contents = xmalloc (size);
2383 for (pnote = pnotes, old = contents;
2384 pnote < pnotes_end;
2385 pnote ++)
2387 bfd_size_type note_size = 12 + pnote->note.namesz + pnote->note.descsz;
2389 if (pnote->note.type != 0)
2391 if (pnote->modified)
2393 /* If the note has been modified then we must copy it by
2394 hand, potentially adding in a new description field. */
2395 if (pnote->start == prev_start && pnote->end == prev_end)
2397 bfd_put_32 (abfd, pnote->note.namesz, new);
2398 bfd_put_32 (abfd, 0, new + 4);
2399 bfd_put_32 (abfd, pnote->note.type, new + 8);
2400 new += 12;
2401 memcpy (new, pnote->note.namedata, pnote->note.namesz);
2402 new += pnote->note.namesz;
2404 else
2406 bfd_put_32 (abfd, pnote->note.namesz, new);
2407 bfd_put_32 (abfd, is_64bit (abfd) ? 16 : 8, new + 4);
2408 bfd_put_32 (abfd, pnote->note.type, new + 8);
2409 new += 12;
2410 memcpy (new, pnote->note.namedata, pnote->note.namesz);
2411 new += pnote->note.namesz;
2412 if (is_64bit (abfd))
2414 bfd_put_64 (abfd, pnote->start, new);
2415 bfd_put_64 (abfd, pnote->end, new + 8);
2416 new += 16;
2418 else
2420 bfd_put_32 (abfd, pnote->start, new);
2421 bfd_put_32 (abfd, pnote->end, new + 4);
2422 new += 8;
2426 else
2428 memcpy (new, old, note_size);
2429 new += note_size;
2431 prev_start = pnote->start;
2432 prev_end = pnote->end;
2435 old += note_size;
2438 new_size = new - new_contents;
2439 memcpy (contents, new_contents, new_size);
2440 size = new_size;
2441 free (new_contents);
2444 done:
2445 if (err)
2447 bfd_set_error (bfd_error_bad_value);
2448 bfd_nonfatal_message (NULL, abfd, sec, err);
2449 status = 1;
2452 free (pnotes);
2453 return size;
2456 /* Copy object file IBFD onto OBFD.
2457 Returns TRUE upon success, FALSE otherwise. */
2459 static bfd_boolean
2460 copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
2462 bfd_vma start;
2463 long symcount;
2464 asection **osections = NULL;
2465 asection *osec;
2466 asection *gnu_debuglink_section = NULL;
2467 bfd_size_type *gaps = NULL;
2468 bfd_size_type max_gap = 0;
2469 long symsize;
2470 void *dhandle;
2471 enum bfd_architecture iarch;
2472 unsigned int imach;
2473 unsigned int c, i;
2475 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
2476 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
2477 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2479 /* PR 17636: Call non-fatal so that we return to our parent who
2480 may need to tidy temporary files. */
2481 non_fatal (_("Unable to change endianness of input file(s)"));
2482 return FALSE;
2485 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2487 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
2488 return FALSE;
2491 if (ibfd->sections == NULL)
2493 non_fatal (_("error: the input file '%s' has no sections"),
2494 bfd_get_archive_filename (ibfd));
2495 return FALSE;
2498 if (ibfd->xvec->flavour != bfd_target_elf_flavour)
2500 if ((do_debug_sections & compress) != 0
2501 && do_debug_sections != compress)
2503 non_fatal (_("--compress-debug-sections=[zlib|zlib-gnu|zlib-gabi] is unsupported on `%s'"),
2504 bfd_get_archive_filename (ibfd));
2505 return FALSE;
2508 if (do_elf_stt_common)
2510 non_fatal (_("--elf-stt-common=[yes|no] is unsupported on `%s'"),
2511 bfd_get_archive_filename (ibfd));
2512 return FALSE;
2516 if (verbose)
2517 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
2518 bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
2519 bfd_get_filename (obfd), bfd_get_target (obfd));
2521 if (extract_symbol)
2522 start = 0;
2523 else
2525 if (set_start_set)
2526 start = set_start;
2527 else
2528 start = bfd_get_start_address (ibfd);
2529 start += change_start;
2532 /* Neither the start address nor the flags
2533 need to be set for a core file. */
2534 if (bfd_get_format (obfd) != bfd_core)
2536 flagword flags;
2538 flags = bfd_get_file_flags (ibfd);
2539 flags |= bfd_flags_to_set;
2540 flags &= ~bfd_flags_to_clear;
2541 flags &= bfd_applicable_file_flags (obfd);
2543 if (strip_symbols == STRIP_ALL)
2544 flags &= ~HAS_RELOC;
2546 if (!bfd_set_start_address (obfd, start)
2547 || !bfd_set_file_flags (obfd, flags))
2549 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2550 return FALSE;
2554 /* Copy architecture of input file to output file. */
2555 iarch = bfd_get_arch (ibfd);
2556 imach = bfd_get_mach (ibfd);
2557 if (input_arch)
2559 if (bfd_get_arch_info (ibfd) == NULL
2560 || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown)
2562 iarch = input_arch->arch;
2563 imach = input_arch->mach;
2565 else
2566 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
2567 bfd_get_archive_filename (ibfd));
2569 if (!bfd_set_arch_mach (obfd, iarch, imach)
2570 && (ibfd->target_defaulted
2571 || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
2573 if (bfd_get_arch (ibfd) == bfd_arch_unknown)
2574 non_fatal (_("Unable to recognise the format of the input file `%s'"),
2575 bfd_get_archive_filename (ibfd));
2576 else
2577 non_fatal (_("Output file cannot represent architecture `%s'"),
2578 bfd_printable_arch_mach (bfd_get_arch (ibfd),
2579 bfd_get_mach (ibfd)));
2580 return FALSE;
2583 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2585 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2586 return FALSE;
2589 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2590 && bfd_pei_p (obfd))
2592 /* Set up PE parameters. */
2593 pe_data_type *pe = pe_data (obfd);
2595 /* Copy PE parameters before changing them. */
2596 if (ibfd->xvec->flavour == bfd_target_coff_flavour
2597 && bfd_pei_p (ibfd))
2598 pe->pe_opthdr = pe_data (ibfd)->pe_opthdr;
2600 if (pe_file_alignment != (bfd_vma) -1)
2601 pe->pe_opthdr.FileAlignment = pe_file_alignment;
2602 else
2603 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
2605 if (pe_heap_commit != (bfd_vma) -1)
2606 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_commit;
2608 if (pe_heap_reserve != (bfd_vma) -1)
2609 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_reserve;
2611 if (pe_image_base != (bfd_vma) -1)
2612 pe->pe_opthdr.ImageBase = pe_image_base;
2614 if (pe_section_alignment != (bfd_vma) -1)
2615 pe->pe_opthdr.SectionAlignment = pe_section_alignment;
2616 else
2617 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
2619 if (pe_stack_commit != (bfd_vma) -1)
2620 pe->pe_opthdr.SizeOfStackCommit = pe_stack_commit;
2622 if (pe_stack_reserve != (bfd_vma) -1)
2623 pe->pe_opthdr.SizeOfStackCommit = pe_stack_reserve;
2625 if (pe_subsystem != -1)
2626 pe->pe_opthdr.Subsystem = pe_subsystem;
2628 if (pe_major_subsystem_version != -1)
2629 pe->pe_opthdr.MajorSubsystemVersion = pe_major_subsystem_version;
2631 if (pe_minor_subsystem_version != -1)
2632 pe->pe_opthdr.MinorSubsystemVersion = pe_minor_subsystem_version;
2634 if (pe_file_alignment > pe_section_alignment)
2636 char file_alignment[20], section_alignment[20];
2638 sprintf_vma (file_alignment, pe_file_alignment);
2639 sprintf_vma (section_alignment, pe_section_alignment);
2640 non_fatal (_("warning: file alignment (0x%s) > section alignment (0x%s)"),
2642 file_alignment, section_alignment);
2646 if (isympp)
2647 free (isympp);
2649 if (osympp != isympp)
2650 free (osympp);
2652 isympp = NULL;
2653 osympp = NULL;
2655 symsize = bfd_get_symtab_upper_bound (ibfd);
2656 if (symsize < 0)
2658 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2659 return FALSE;
2662 osympp = isympp = (asymbol **) xmalloc (symsize);
2663 symcount = bfd_canonicalize_symtab (ibfd, isympp);
2664 if (symcount < 0)
2666 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2667 return FALSE;
2669 /* PR 17512: file: d6323821
2670 If the symbol table could not be loaded do not pretend that we have
2671 any symbols. This trips us up later on when we load the relocs. */
2672 if (symcount == 0)
2674 free (isympp);
2675 osympp = isympp = NULL;
2678 /* BFD mandates that all output sections be created and sizes set before
2679 any output is done. Thus, we traverse all sections multiple times. */
2680 bfd_map_over_sections (ibfd, setup_section, obfd);
2682 if (!extract_symbol)
2683 setup_bfd_headers (ibfd, obfd);
2685 if (add_sections != NULL)
2687 struct section_add *padd;
2688 struct section_list *pset;
2690 for (padd = add_sections; padd != NULL; padd = padd->next)
2692 flagword flags;
2694 pset = find_section_list (padd->name, FALSE,
2695 SECTION_CONTEXT_SET_FLAGS);
2696 if (pset != NULL)
2697 flags = pset->flags | SEC_HAS_CONTENTS;
2698 else
2699 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
2701 /* bfd_make_section_with_flags() does not return very helpful
2702 error codes, so check for the most likely user error first. */
2703 if (bfd_get_section_by_name (obfd, padd->name))
2705 bfd_nonfatal_message (NULL, obfd, NULL,
2706 _("can't add section '%s'"), padd->name);
2707 return FALSE;
2709 else
2711 /* We use LINKER_CREATED here so that the backend hooks
2712 will create any special section type information,
2713 instead of presuming we know what we're doing merely
2714 because we set the flags. */
2715 padd->section = bfd_make_section_with_flags
2716 (obfd, padd->name, flags | SEC_LINKER_CREATED);
2717 if (padd->section == NULL)
2719 bfd_nonfatal_message (NULL, obfd, NULL,
2720 _("can't create section `%s'"),
2721 padd->name);
2722 return FALSE;
2726 if (! bfd_set_section_size (obfd, padd->section, padd->size))
2728 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2729 return FALSE;
2732 pset = find_section_list (padd->name, FALSE,
2733 SECTION_CONTEXT_SET_VMA | SECTION_CONTEXT_ALTER_VMA);
2734 if (pset != NULL
2735 && ! bfd_set_section_vma (obfd, padd->section, pset->vma_val))
2737 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2738 return FALSE;
2741 pset = find_section_list (padd->name, FALSE,
2742 SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_ALTER_LMA);
2743 if (pset != NULL)
2745 padd->section->lma = pset->lma_val;
2747 if (! bfd_set_section_alignment
2748 (obfd, padd->section,
2749 bfd_section_alignment (obfd, padd->section)))
2751 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2752 return FALSE;
2758 if (update_sections != NULL)
2760 struct section_add *pupdate;
2762 for (pupdate = update_sections;
2763 pupdate != NULL;
2764 pupdate = pupdate->next)
2766 pupdate->section = bfd_get_section_by_name (ibfd, pupdate->name);
2767 if (pupdate->section == NULL)
2769 non_fatal (_("error: %s not found, can't be updated"), pupdate->name);
2770 return FALSE;
2773 osec = pupdate->section->output_section;
2774 if (! bfd_set_section_size (obfd, osec, pupdate->size))
2776 bfd_nonfatal_message (NULL, obfd, osec, NULL);
2777 return FALSE;
2782 if (merge_notes)
2784 /* This palaver is necessary because we must set the output
2785 section size first, before its contents are ready. */
2786 osec = bfd_get_section_by_name (ibfd, GNU_BUILD_ATTRS_SECTION_NAME);
2787 if (osec && is_merged_note_section (ibfd, osec))
2789 bfd_size_type size;
2791 size = bfd_get_section_size (osec);
2792 if (size == 0)
2794 bfd_nonfatal_message (NULL, ibfd, osec, _("warning: note section is empty"));
2795 merge_notes = FALSE;
2797 else if (! bfd_get_full_section_contents (ibfd, osec, & merged_notes))
2799 bfd_nonfatal_message (NULL, ibfd, osec, _("warning: could not load note section"));
2800 free (merged_notes);
2801 merged_notes = NULL;
2802 merge_notes = FALSE;
2804 else
2806 merged_size = merge_gnu_build_notes (ibfd, osec, size, merged_notes);
2807 if (merged_size == size)
2809 /* Merging achieves nothing. */
2810 free (merged_notes);
2811 merged_notes = NULL;
2812 merge_notes = FALSE;
2813 merged_size = 0;
2815 else
2817 if (osec->output_section == NULL
2818 || ! bfd_set_section_size (obfd, osec->output_section, merged_size))
2820 bfd_nonfatal_message (NULL, obfd, osec, _("warning: failed to set merged notes size"));
2821 free (merged_notes);
2822 merged_notes = NULL;
2823 merge_notes = FALSE;
2824 merged_size = 0;
2831 if (dump_sections != NULL)
2833 struct section_add * pdump;
2835 for (pdump = dump_sections; pdump != NULL; pdump = pdump->next)
2837 osec = bfd_get_section_by_name (ibfd, pdump->name);
2838 if (osec == NULL)
2840 bfd_nonfatal_message (NULL, ibfd, NULL,
2841 _("can't dump section '%s' - it does not exist"),
2842 pdump->name);
2843 continue;
2846 if ((bfd_get_section_flags (ibfd, osec) & SEC_HAS_CONTENTS) == 0)
2848 bfd_nonfatal_message (NULL, ibfd, osec,
2849 _("can't dump section - it has no contents"));
2850 continue;
2853 bfd_size_type size = bfd_get_section_size (osec);
2854 if (size == 0)
2856 bfd_nonfatal_message (NULL, ibfd, osec,
2857 _("can't dump section - it is empty"));
2858 continue;
2861 FILE * f;
2862 f = fopen (pdump->filename, FOPEN_WB);
2863 if (f == NULL)
2865 bfd_nonfatal_message (pdump->filename, NULL, NULL,
2866 _("could not open section dump file"));
2867 continue;
2870 bfd_byte *contents;
2871 if (bfd_malloc_and_get_section (ibfd, osec, &contents))
2873 if (fwrite (contents, 1, size, f) != size)
2875 non_fatal (_("error writing section contents to %s (error: %s)"),
2876 pdump->filename,
2877 strerror (errno));
2878 free (contents);
2879 fclose (f);
2880 return FALSE;
2883 else
2884 bfd_nonfatal_message (NULL, ibfd, osec,
2885 _("could not retrieve section contents"));
2887 fclose (f);
2888 free (contents);
2892 if (gnu_debuglink_filename != NULL)
2894 /* PR 15125: Give a helpful warning message if
2895 the debuglink section already exists, and
2896 allow the rest of the copy to complete. */
2897 if (bfd_get_section_by_name (obfd, ".gnu_debuglink"))
2899 non_fatal (_("%s: debuglink section already exists"),
2900 bfd_get_filename (obfd));
2901 gnu_debuglink_filename = NULL;
2903 else
2905 gnu_debuglink_section = bfd_create_gnu_debuglink_section
2906 (obfd, gnu_debuglink_filename);
2908 if (gnu_debuglink_section == NULL)
2910 bfd_nonfatal_message (NULL, obfd, NULL,
2911 _("cannot create debug link section `%s'"),
2912 gnu_debuglink_filename);
2913 return FALSE;
2916 /* Special processing for PE format files. We
2917 have no way to distinguish PE from COFF here. */
2918 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour)
2920 bfd_vma debuglink_vma;
2921 asection * highest_section;
2923 /* The PE spec requires that all sections be adjacent and sorted
2924 in ascending order of VMA. It also specifies that debug
2925 sections should be last. This is despite the fact that debug
2926 sections are not loaded into memory and so in theory have no
2927 use for a VMA.
2929 This means that the debuglink section must be given a non-zero
2930 VMA which makes it contiguous with other debug sections. So
2931 walk the current section list, find the section with the
2932 highest VMA and start the debuglink section after that one. */
2933 for (osec = obfd->sections, highest_section = NULL;
2934 osec != NULL;
2935 osec = osec->next)
2936 if (osec->vma > 0
2937 && (highest_section == NULL
2938 || osec->vma > highest_section->vma))
2939 highest_section = osec;
2941 if (highest_section)
2942 debuglink_vma = BFD_ALIGN (highest_section->vma
2943 + highest_section->size,
2944 /* FIXME: We ought to be using
2945 COFF_PAGE_SIZE here or maybe
2946 bfd_get_section_alignment() (if it
2947 was set) but since this is for PE
2948 and we know the required alignment
2949 it is easier just to hard code it. */
2950 0x1000);
2951 else
2952 /* Umm, not sure what to do in this case. */
2953 debuglink_vma = 0x1000;
2955 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
2960 c = bfd_count_sections (obfd);
2961 if (c != 0
2962 && (gap_fill_set || pad_to_set))
2964 asection **set;
2966 /* We must fill in gaps between the sections and/or we must pad
2967 the last section to a specified address. We do this by
2968 grabbing a list of the sections, sorting them by VMA, and
2969 increasing the section sizes as required to fill the gaps.
2970 We write out the gap contents below. */
2972 osections = (asection **) xmalloc (c * sizeof (asection *));
2973 set = osections;
2974 bfd_map_over_sections (obfd, get_sections, &set);
2976 qsort (osections, c, sizeof (asection *), compare_section_lma);
2978 gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type));
2979 memset (gaps, 0, c * sizeof (bfd_size_type));
2981 if (gap_fill_set)
2983 for (i = 0; i < c - 1; i++)
2985 flagword flags;
2986 bfd_size_type size;
2987 bfd_vma gap_start, gap_stop;
2989 flags = bfd_get_section_flags (obfd, osections[i]);
2990 if ((flags & SEC_HAS_CONTENTS) == 0
2991 || (flags & SEC_LOAD) == 0)
2992 continue;
2994 size = bfd_section_size (obfd, osections[i]);
2995 gap_start = bfd_section_lma (obfd, osections[i]) + size;
2996 gap_stop = bfd_section_lma (obfd, osections[i + 1]);
2997 if (gap_start < gap_stop)
2999 if (! bfd_set_section_size (obfd, osections[i],
3000 size + (gap_stop - gap_start)))
3002 bfd_nonfatal_message (NULL, obfd, osections[i],
3003 _("Can't fill gap after section"));
3004 status = 1;
3005 break;
3007 gaps[i] = gap_stop - gap_start;
3008 if (max_gap < gap_stop - gap_start)
3009 max_gap = gap_stop - gap_start;
3014 if (pad_to_set)
3016 bfd_vma lma;
3017 bfd_size_type size;
3019 lma = bfd_section_lma (obfd, osections[c - 1]);
3020 size = bfd_section_size (obfd, osections[c - 1]);
3021 if (lma + size < pad_to)
3023 if (! bfd_set_section_size (obfd, osections[c - 1],
3024 pad_to - lma))
3026 bfd_nonfatal_message (NULL, obfd, osections[c - 1],
3027 _("can't add padding"));
3028 status = 1;
3030 else
3032 gaps[c - 1] = pad_to - (lma + size);
3033 if (max_gap < pad_to - (lma + size))
3034 max_gap = pad_to - (lma + size);
3040 /* Symbol filtering must happen after the output sections
3041 have been created, but before their contents are set. */
3042 dhandle = NULL;
3043 if (convert_debugging)
3044 dhandle = read_debugging_info (ibfd, isympp, symcount, FALSE);
3046 if (strip_symbols == STRIP_DEBUG
3047 || strip_symbols == STRIP_ALL
3048 || strip_symbols == STRIP_UNNEEDED
3049 || strip_symbols == STRIP_NONDEBUG
3050 || strip_symbols == STRIP_DWO
3051 || strip_symbols == STRIP_NONDWO
3052 || discard_locals != LOCALS_UNDEF
3053 || localize_hidden
3054 || htab_elements (strip_specific_htab) != 0
3055 || htab_elements (keep_specific_htab) != 0
3056 || htab_elements (localize_specific_htab) != 0
3057 || htab_elements (globalize_specific_htab) != 0
3058 || htab_elements (keepglobal_specific_htab) != 0
3059 || htab_elements (weaken_specific_htab) != 0
3060 || htab_elements (redefine_specific_htab) != 0
3061 || prefix_symbols_string
3062 || sections_removed
3063 || sections_copied
3064 || convert_debugging
3065 || change_leading_char
3066 || remove_leading_char
3067 || section_rename_list
3068 || weaken
3069 || add_symbols)
3071 /* Mark symbols used in output relocations so that they
3072 are kept, even if they are local labels or static symbols.
3074 Note we iterate over the input sections examining their
3075 relocations since the relocations for the output sections
3076 haven't been set yet. mark_symbols_used_in_relocations will
3077 ignore input sections which have no corresponding output
3078 section. */
3079 if (strip_symbols != STRIP_ALL)
3081 bfd_set_error (bfd_error_no_error);
3082 bfd_map_over_sections (ibfd,
3083 mark_symbols_used_in_relocations,
3084 isympp);
3085 if (bfd_get_error () != bfd_error_no_error)
3087 status = 1;
3088 return FALSE;
3092 osympp = (asymbol **) xmalloc ((symcount + add_symbols + 1) * sizeof (asymbol *));
3093 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
3096 if (convert_debugging && dhandle != NULL)
3098 bfd_boolean res;
3100 res = write_debugging_info (obfd, dhandle, &symcount, &osympp);
3102 free (dhandle);
3103 dhandle = NULL; /* Paranoia... */
3105 if (! res)
3107 status = 1;
3108 return FALSE;
3112 bfd_set_symtab (obfd, osympp, symcount);
3114 /* This has to happen before section positions are set. */
3115 bfd_map_over_sections (ibfd, copy_relocations_in_section, obfd);
3117 /* This has to happen after the symbol table has been set. */
3118 bfd_map_over_sections (ibfd, copy_section, obfd);
3120 if (add_sections != NULL)
3122 struct section_add *padd;
3124 for (padd = add_sections; padd != NULL; padd = padd->next)
3126 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
3127 0, padd->size))
3129 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
3130 return FALSE;
3135 if (update_sections != NULL)
3137 struct section_add *pupdate;
3139 for (pupdate = update_sections;
3140 pupdate != NULL;
3141 pupdate = pupdate->next)
3143 osec = pupdate->section->output_section;
3144 if (! bfd_set_section_contents (obfd, osec, pupdate->contents,
3145 0, pupdate->size))
3147 bfd_nonfatal_message (NULL, obfd, osec, NULL);
3148 return FALSE;
3153 if (merge_notes)
3155 osec = bfd_get_section_by_name (obfd, GNU_BUILD_ATTRS_SECTION_NAME);
3156 if (osec && is_merged_note_section (obfd, osec))
3158 if (! bfd_set_section_contents (obfd, osec, merged_notes, 0, merged_size))
3160 bfd_nonfatal_message (NULL, obfd, osec, _("error: failed to copy merged notes into output"));
3161 return FALSE;
3164 else if (! is_strip)
3165 bfd_nonfatal_message (NULL, obfd, osec, _("could not find any mergeable note sections"));
3166 free (merged_notes);
3167 merged_notes = NULL;
3168 merge_notes = FALSE;
3171 if (gnu_debuglink_filename != NULL)
3173 if (! bfd_fill_in_gnu_debuglink_section
3174 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
3176 bfd_nonfatal_message (NULL, obfd, NULL,
3177 _("cannot fill debug link section `%s'"),
3178 gnu_debuglink_filename);
3179 return FALSE;
3183 if (gap_fill_set || pad_to_set)
3185 bfd_byte *buf;
3187 /* Fill in the gaps. */
3188 if (max_gap > 8192)
3189 max_gap = 8192;
3190 buf = (bfd_byte *) xmalloc (max_gap);
3191 memset (buf, gap_fill, max_gap);
3193 c = bfd_count_sections (obfd);
3194 for (i = 0; i < c; i++)
3196 if (gaps[i] != 0)
3198 bfd_size_type left;
3199 file_ptr off;
3201 left = gaps[i];
3202 off = bfd_section_size (obfd, osections[i]) - left;
3204 while (left > 0)
3206 bfd_size_type now;
3208 if (left > 8192)
3209 now = 8192;
3210 else
3211 now = left;
3213 if (! bfd_set_section_contents (obfd, osections[i], buf,
3214 off, now))
3216 bfd_nonfatal_message (NULL, obfd, osections[i], NULL);
3217 free (buf);
3218 return FALSE;
3221 left -= now;
3222 off += now;
3227 free (buf);
3228 free (gaps);
3229 gaps = NULL;
3232 /* Allow the BFD backend to copy any private data it understands
3233 from the input BFD to the output BFD. This is done last to
3234 permit the routine to look at the filtered symbol table, which is
3235 important for the ECOFF code at least. */
3236 if (! bfd_copy_private_bfd_data (ibfd, obfd))
3238 bfd_nonfatal_message (NULL, obfd, NULL,
3239 _("error copying private BFD data"));
3240 return FALSE;
3243 /* Switch to the alternate machine code. We have to do this at the
3244 very end, because we only initialize the header when we create
3245 the first section. */
3246 if (use_alt_mach_code != 0)
3248 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
3250 non_fatal (_("this target does not support %lu alternative machine codes"),
3251 use_alt_mach_code);
3252 if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
3254 non_fatal (_("treating that number as an absolute e_machine value instead"));
3255 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
3257 else
3258 non_fatal (_("ignoring the alternative value"));
3262 return TRUE;
3265 /* Read each archive element in turn from IBFD, copy the
3266 contents to temp file, and keep the temp file handle.
3267 If 'force_output_target' is TRUE then make sure that
3268 all elements in the new archive are of the type
3269 'output_target'. */
3271 static void
3272 copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
3273 bfd_boolean force_output_target,
3274 const bfd_arch_info_type *input_arch)
3276 struct name_list
3278 struct name_list *next;
3279 const char *name;
3280 bfd *obfd;
3281 } *list, *l;
3282 bfd **ptr = &obfd->archive_head;
3283 bfd *this_element;
3284 char *dir;
3285 const char *filename;
3287 /* PR 24281: It is not clear what should happen when copying a thin archive.
3288 One part is straight forward - if the output archive is in a different
3289 directory from the input archive then any relative paths in the library
3290 should be adjusted to the new location. But if any transformation
3291 options are active (eg strip, rename, add, etc) then the implication is
3292 that these should be applied to the files pointed to by the archive.
3293 But since objcopy is not destructive, this means that new files must be
3294 created, and there is no guidance for the names of the new files. (Plus
3295 this conflicts with one of the goals of thin libraries - only taking up
3296 a minimal amount of space in the file system).
3298 So for now we fail if an attempt is made to copy such libraries. */
3299 if (ibfd->is_thin_archive)
3301 status = 1;
3302 bfd_set_error (bfd_error_invalid_operation);
3303 bfd_nonfatal_message (NULL, ibfd, NULL,
3304 _("sorry: copying thin archives is not currently supported"));
3305 return;
3308 /* Make a temp directory to hold the contents. */
3309 dir = make_tempdir (bfd_get_filename (obfd));
3310 if (dir == NULL)
3311 fatal (_("cannot create tempdir for archive copying (error: %s)"),
3312 strerror (errno));
3314 if (strip_symbols == STRIP_ALL)
3315 obfd->has_armap = FALSE;
3316 else
3317 obfd->has_armap = ibfd->has_armap;
3318 obfd->is_thin_archive = ibfd->is_thin_archive;
3320 if (deterministic)
3321 obfd->flags |= BFD_DETERMINISTIC_OUTPUT;
3323 list = NULL;
3325 this_element = bfd_openr_next_archived_file (ibfd, NULL);
3327 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
3329 status = 1;
3330 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
3331 goto cleanup_and_exit;
3334 while (!status && this_element != NULL)
3336 char *output_name;
3337 bfd *output_bfd;
3338 bfd *last_element;
3339 struct stat buf;
3340 int stat_status = 0;
3341 bfd_boolean del = TRUE;
3342 bfd_boolean ok_object;
3344 /* PR binutils/17533: Do not allow directory traversal
3345 outside of the current directory tree by archive members. */
3346 if (! is_valid_archive_path (bfd_get_filename (this_element)))
3348 non_fatal (_("illegal pathname found in archive member: %s"),
3349 bfd_get_filename (this_element));
3350 status = 1;
3351 goto cleanup_and_exit;
3354 /* Create an output file for this member. */
3355 output_name = concat (dir, "/",
3356 bfd_get_filename (this_element), (char *) 0);
3358 /* If the file already exists, make another temp dir. */
3359 if (stat (output_name, &buf) >= 0)
3361 char * tmpdir = make_tempdir (output_name);
3363 free (output_name);
3364 if (tmpdir == NULL)
3366 non_fatal (_("cannot create tempdir for archive copying (error: %s)"),
3367 strerror (errno));
3368 status = 1;
3369 goto cleanup_and_exit;
3372 l = (struct name_list *) xmalloc (sizeof (struct name_list));
3373 l->name = tmpdir;
3374 l->next = list;
3375 l->obfd = NULL;
3376 list = l;
3377 output_name = concat (tmpdir, "/",
3378 bfd_get_filename (this_element), (char *) 0);
3381 if (preserve_dates)
3383 stat_status = bfd_stat_arch_elt (this_element, &buf);
3385 if (stat_status != 0)
3386 non_fatal (_("internal stat error on %s"),
3387 bfd_get_filename (this_element));
3390 l = (struct name_list *) xmalloc (sizeof (struct name_list));
3391 l->name = output_name;
3392 l->next = list;
3393 l->obfd = NULL;
3394 list = l;
3396 ok_object = bfd_check_format (this_element, bfd_object);
3397 if (!ok_object)
3398 bfd_nonfatal_message (NULL, this_element, NULL,
3399 _("Unable to recognise the format of file"));
3401 /* PR binutils/3110: Cope with archives
3402 containing multiple target types. */
3403 if (force_output_target || !ok_object)
3404 output_bfd = bfd_openw (output_name, output_target);
3405 else
3406 output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
3408 if (output_bfd == NULL)
3410 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3411 status = 1;
3412 goto cleanup_and_exit;
3415 if (ok_object)
3417 del = !copy_object (this_element, output_bfd, input_arch);
3419 if (del && bfd_get_arch (this_element) == bfd_arch_unknown)
3420 /* Try again as an unknown object file. */
3421 ok_object = FALSE;
3422 else if (!bfd_close (output_bfd))
3424 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3425 /* Error in new object file. Don't change archive. */
3426 status = 1;
3430 if (!ok_object)
3432 del = !copy_unknown_object (this_element, output_bfd);
3433 if (!bfd_close_all_done (output_bfd))
3435 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3436 /* Error in new object file. Don't change archive. */
3437 status = 1;
3441 if (del)
3443 unlink (output_name);
3444 status = 1;
3446 else
3448 if (preserve_dates && stat_status == 0)
3449 set_times (output_name, &buf);
3451 /* Open the newly output file and attach to our list. */
3452 output_bfd = bfd_openr (output_name, output_target);
3454 l->obfd = output_bfd;
3456 *ptr = output_bfd;
3457 ptr = &output_bfd->archive_next;
3459 last_element = this_element;
3461 this_element = bfd_openr_next_archived_file (ibfd, last_element);
3463 bfd_close (last_element);
3466 *ptr = NULL;
3468 filename = bfd_get_filename (obfd);
3469 if (!bfd_close (obfd))
3471 status = 1;
3472 bfd_nonfatal_message (filename, NULL, NULL, NULL);
3475 filename = bfd_get_filename (ibfd);
3476 if (!bfd_close (ibfd))
3478 status = 1;
3479 bfd_nonfatal_message (filename, NULL, NULL, NULL);
3482 cleanup_and_exit:
3483 /* Delete all the files that we opened. */
3485 struct name_list * next;
3487 for (l = list; l != NULL; l = next)
3489 if (l->obfd == NULL)
3490 rmdir (l->name);
3491 else
3493 bfd_close (l->obfd);
3494 unlink (l->name);
3496 next = l->next;
3497 free (l);
3501 rmdir (dir);
3504 static void
3505 set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_handling style)
3507 /* This is only relevant to Coff targets. */
3508 if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
3510 if (style == KEEP
3511 && bfd_get_flavour (input_bfd) == bfd_target_coff_flavour)
3512 style = bfd_coff_long_section_names (input_bfd) ? ENABLE : DISABLE;
3513 bfd_coff_set_long_section_names (output_bfd, style != DISABLE);
3517 /* The top-level control. */
3519 static void
3520 copy_file (const char *input_filename, const char *output_filename,
3521 const char *input_target, const char *output_target,
3522 const bfd_arch_info_type *input_arch)
3524 bfd *ibfd;
3525 char **obj_matching;
3526 char **core_matching;
3527 off_t size = get_file_size (input_filename);
3529 if (size < 1)
3531 if (size == 0)
3532 non_fatal (_("error: the input file '%s' is empty"),
3533 input_filename);
3534 status = 1;
3535 return;
3538 /* To allow us to do "strip *" without dying on the first
3539 non-object file, failures are nonfatal. */
3540 ibfd = bfd_openr (input_filename, input_target);
3541 if (ibfd == NULL)
3543 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3544 status = 1;
3545 return;
3548 switch (do_debug_sections)
3550 case compress:
3551 case compress_zlib:
3552 case compress_gnu_zlib:
3553 case compress_gabi_zlib:
3554 ibfd->flags |= BFD_COMPRESS;
3555 /* Don't check if input is ELF here since this information is
3556 only available after bfd_check_format_matches is called. */
3557 if (do_debug_sections != compress_gnu_zlib)
3558 ibfd->flags |= BFD_COMPRESS_GABI;
3559 break;
3560 case decompress:
3561 ibfd->flags |= BFD_DECOMPRESS;
3562 break;
3563 default:
3564 break;
3567 switch (do_elf_stt_common)
3569 case elf_stt_common:
3570 ibfd->flags |= BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON;
3571 break;
3572 break;
3573 case no_elf_stt_common:
3574 ibfd->flags |= BFD_CONVERT_ELF_COMMON;
3575 break;
3576 default:
3577 break;
3580 if (bfd_check_format (ibfd, bfd_archive))
3582 bfd_boolean force_output_target;
3583 bfd *obfd;
3585 /* bfd_get_target does not return the correct value until
3586 bfd_check_format succeeds. */
3587 if (output_target == NULL)
3589 output_target = bfd_get_target (ibfd);
3590 force_output_target = FALSE;
3592 else
3593 force_output_target = TRUE;
3595 obfd = bfd_openw (output_filename, output_target);
3596 if (obfd == NULL)
3598 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3599 status = 1;
3600 return;
3602 /* This is a no-op on non-Coff targets. */
3603 set_long_section_mode (obfd, ibfd, long_section_names);
3605 copy_archive (ibfd, obfd, output_target, force_output_target, input_arch);
3607 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
3609 bfd *obfd;
3610 do_copy:
3612 /* bfd_get_target does not return the correct value until
3613 bfd_check_format succeeds. */
3614 if (output_target == NULL)
3615 output_target = bfd_get_target (ibfd);
3617 obfd = bfd_openw (output_filename, output_target);
3618 if (obfd == NULL)
3620 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3621 status = 1;
3622 return;
3624 /* This is a no-op on non-Coff targets. */
3625 set_long_section_mode (obfd, ibfd, long_section_names);
3627 if (! copy_object (ibfd, obfd, input_arch))
3628 status = 1;
3630 /* PR 17512: file: 0f15796a.
3631 If the file could not be copied it may not be in a writeable
3632 state. So use bfd_close_all_done to avoid the possibility of
3633 writing uninitialised data into the file. */
3634 if (! (status ? bfd_close_all_done (obfd) : bfd_close (obfd)))
3636 status = 1;
3637 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3638 return;
3641 if (!bfd_close (ibfd))
3643 status = 1;
3644 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3645 return;
3648 else
3650 bfd_error_type obj_error = bfd_get_error ();
3651 bfd_error_type core_error;
3653 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
3655 /* This probably can't happen.. */
3656 if (obj_error == bfd_error_file_ambiguously_recognized)
3657 free (obj_matching);
3658 goto do_copy;
3661 core_error = bfd_get_error ();
3662 /* Report the object error in preference to the core error. */
3663 if (obj_error != core_error)
3664 bfd_set_error (obj_error);
3666 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3668 if (obj_error == bfd_error_file_ambiguously_recognized)
3670 list_matching_formats (obj_matching);
3671 free (obj_matching);
3673 if (core_error == bfd_error_file_ambiguously_recognized)
3675 list_matching_formats (core_matching);
3676 free (core_matching);
3679 status = 1;
3683 /* Add a name to the section renaming list. */
3685 static void
3686 add_section_rename (const char * old_name, const char * new_name,
3687 flagword flags)
3689 section_rename * srename;
3691 /* Check for conflicts first. */
3692 for (srename = section_rename_list; srename != NULL; srename = srename->next)
3693 if (strcmp (srename->old_name, old_name) == 0)
3695 /* Silently ignore duplicate definitions. */
3696 if (strcmp (srename->new_name, new_name) == 0
3697 && srename->flags == flags)
3698 return;
3700 fatal (_("Multiple renames of section %s"), old_name);
3703 srename = (section_rename *) xmalloc (sizeof (* srename));
3705 srename->old_name = old_name;
3706 srename->new_name = new_name;
3707 srename->flags = flags;
3708 srename->next = section_rename_list;
3710 section_rename_list = srename;
3713 /* Check the section rename list for a new name of the input section
3714 called OLD_NAME. Returns the new name if one is found and sets
3715 RETURNED_FLAGS if non-NULL to the flags to be used for this section. */
3717 static const char *
3718 find_section_rename (const char *old_name, flagword *returned_flags)
3720 const section_rename *srename;
3722 for (srename = section_rename_list; srename != NULL; srename = srename->next)
3723 if (strcmp (srename->old_name, old_name) == 0)
3725 if (returned_flags != NULL && srename->flags != (flagword) -1)
3726 *returned_flags = srename->flags;
3728 return srename->new_name;
3731 return old_name;
3734 /* Once each of the sections is copied, we may still need to do some
3735 finalization work for private section headers. Do that here. */
3737 static void
3738 setup_bfd_headers (bfd *ibfd, bfd *obfd)
3740 /* Allow the BFD backend to copy any private data it understands
3741 from the input section to the output section. */
3742 if (! bfd_copy_private_header_data (ibfd, obfd))
3744 status = 1;
3745 bfd_nonfatal_message (NULL, ibfd, NULL,
3746 _("error in private header data"));
3747 return;
3750 /* All went well. */
3751 return;
3754 /* Create a section in OBFD with the same
3755 name and attributes as ISECTION in IBFD. */
3757 static void
3758 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
3760 bfd *obfd = (bfd *) obfdarg;
3761 struct section_list *p;
3762 sec_ptr osection;
3763 bfd_size_type size;
3764 bfd_vma vma;
3765 bfd_vma lma;
3766 flagword flags;
3767 const char *err;
3768 const char * name;
3769 char *prefix = NULL;
3770 bfd_boolean make_nobits;
3772 if (is_strip_section (ibfd, isection))
3773 return;
3775 /* Get the, possibly new, name of the output section. */
3776 name = bfd_section_name (ibfd, isection);
3777 flags = bfd_get_section_flags (ibfd, isection);
3778 name = find_section_rename (name, &flags);
3780 /* Prefix sections. */
3781 if ((prefix_alloc_sections_string)
3782 && (bfd_get_section_flags (ibfd, isection) & SEC_ALLOC))
3783 prefix = prefix_alloc_sections_string;
3784 else if (prefix_sections_string)
3785 prefix = prefix_sections_string;
3787 if (prefix)
3789 char *n;
3791 n = (char *) xmalloc (strlen (prefix) + strlen (name) + 1);
3792 strcpy (n, prefix);
3793 strcat (n, name);
3794 name = n;
3797 make_nobits = FALSE;
3799 p = find_section_list (bfd_section_name (ibfd, isection), FALSE,
3800 SECTION_CONTEXT_SET_FLAGS);
3801 if (p != NULL)
3802 flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
3803 else if (strip_symbols == STRIP_NONDEBUG
3804 && (flags & (SEC_ALLOC | SEC_GROUP)) != 0
3805 && !is_nondebug_keep_contents_section (ibfd, isection))
3807 flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
3808 if (obfd->xvec->flavour == bfd_target_elf_flavour)
3810 make_nobits = TRUE;
3812 /* Twiddle the input section flags so that it seems to
3813 elf.c:copy_private_bfd_data that section flags have not
3814 changed between input and output sections. This hack
3815 prevents wholesale rewriting of the program headers. */
3816 isection->flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
3820 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
3822 if (osection == NULL)
3824 err = _("failed to create output section");
3825 goto loser;
3828 if (make_nobits)
3829 elf_section_type (osection) = SHT_NOBITS;
3831 size = bfd_section_size (ibfd, isection);
3832 size = bfd_convert_section_size (ibfd, isection, obfd, size);
3833 if (copy_byte >= 0)
3834 size = (size + interleave - 1) / interleave * copy_width;
3835 else if (extract_symbol)
3836 size = 0;
3837 if (! bfd_set_section_size (obfd, osection, size))
3839 err = _("failed to set size");
3840 goto loser;
3843 vma = bfd_section_vma (ibfd, isection);
3844 p = find_section_list (bfd_section_name (ibfd, isection), FALSE,
3845 SECTION_CONTEXT_ALTER_VMA | SECTION_CONTEXT_SET_VMA);
3846 if (p != NULL)
3848 if (p->context & SECTION_CONTEXT_SET_VMA)
3849 vma = p->vma_val;
3850 else
3851 vma += p->vma_val;
3853 else
3854 vma += change_section_address;
3856 if (! bfd_set_section_vma (obfd, osection, vma))
3858 err = _("failed to set vma");
3859 goto loser;
3862 lma = isection->lma;
3863 p = find_section_list (bfd_section_name (ibfd, isection), FALSE,
3864 SECTION_CONTEXT_ALTER_LMA | SECTION_CONTEXT_SET_LMA);
3865 if (p != NULL)
3867 if (p->context & SECTION_CONTEXT_ALTER_LMA)
3868 lma += p->lma_val;
3869 else
3870 lma = p->lma_val;
3872 else
3873 lma += change_section_address;
3875 osection->lma = lma;
3877 /* FIXME: This is probably not enough. If we change the LMA we
3878 may have to recompute the header for the file as well. */
3879 if (!bfd_set_section_alignment (obfd,
3880 osection,
3881 bfd_section_alignment (ibfd, isection)))
3883 err = _("failed to set alignment");
3884 goto loser;
3887 /* Copy merge entity size. */
3888 osection->entsize = isection->entsize;
3890 /* Copy compress status. */
3891 osection->compress_status = isection->compress_status;
3893 /* This used to be mangle_section; we do here to avoid using
3894 bfd_get_section_by_name since some formats allow multiple
3895 sections with the same name. */
3896 isection->output_section = osection;
3897 isection->output_offset = 0;
3899 if ((isection->flags & SEC_GROUP) != 0)
3901 asymbol *gsym = group_signature (isection);
3903 if (gsym != NULL)
3905 gsym->flags |= BSF_KEEP;
3906 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
3907 elf_group_id (isection) = gsym;
3911 /* Allow the BFD backend to copy any private data it understands
3912 from the input section to the output section. */
3913 if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
3915 err = _("failed to copy private data");
3916 goto loser;
3919 /* All went well. */
3920 return;
3922 loser:
3923 status = 1;
3924 bfd_nonfatal_message (NULL, obfd, osection, err);
3927 /* Return TRUE if input section ISECTION should be skipped. */
3929 static bfd_boolean
3930 skip_section (bfd *ibfd, sec_ptr isection, bfd_boolean skip_copy)
3932 sec_ptr osection;
3933 bfd_size_type size;
3934 flagword flags;
3936 /* If we have already failed earlier on,
3937 do not keep on generating complaints now. */
3938 if (status != 0)
3939 return TRUE;
3941 if (extract_symbol)
3942 return TRUE;
3944 if (is_strip_section (ibfd, isection))
3945 return TRUE;
3947 if (is_update_section (ibfd, isection))
3948 return TRUE;
3950 /* When merging a note section we skip the copying of the contents,
3951 but not the copying of the relocs associated with the contents. */
3952 if (skip_copy && is_merged_note_section (ibfd, isection))
3953 return TRUE;
3955 flags = bfd_get_section_flags (ibfd, isection);
3956 if ((flags & SEC_GROUP) != 0)
3957 return TRUE;
3959 osection = isection->output_section;
3960 size = bfd_get_section_size (isection);
3962 if (size == 0 || osection == 0)
3963 return TRUE;
3965 return FALSE;
3968 /* Add section SECTION_PATTERN to the list of sections that will have their
3969 relocations removed. */
3971 static void
3972 handle_remove_relocations_option (const char *section_pattern)
3974 find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE_RELOCS);
3977 /* Return TRUE if ISECTION from IBFD should have its relocations removed,
3978 otherwise return FALSE. If the user has requested that relocations be
3979 removed from a section that does not have relocations then this
3980 function will still return TRUE. */
3982 static bfd_boolean
3983 discard_relocations (bfd *ibfd ATTRIBUTE_UNUSED, asection *isection)
3985 return (find_section_list (bfd_section_name (ibfd, isection), FALSE,
3986 SECTION_CONTEXT_REMOVE_RELOCS) != NULL);
3989 /* Wrapper for dealing with --remove-section (-R) command line arguments.
3990 A special case is detected here, if the user asks to remove a relocation
3991 section (one starting with ".rela" or ".rel") then this removal must
3992 be done using a different technique in a relocatable object. */
3994 static void
3995 handle_remove_section_option (const char *section_pattern)
3997 find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE);
3998 if (strncmp (section_pattern, ".rel", 4) == 0)
4000 section_pattern += 4;
4001 if (*section_pattern == 'a')
4002 section_pattern++;
4003 if (*section_pattern)
4004 handle_remove_relocations_option (section_pattern);
4006 sections_removed = TRUE;
4009 /* Copy relocations in input section ISECTION of IBFD to an output
4010 section with the same name in OBFDARG. If stripping then don't
4011 copy any relocation info. */
4013 static void
4014 copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
4016 bfd *obfd = (bfd *) obfdarg;
4017 long relsize;
4018 arelent **relpp;
4019 long relcount;
4020 sec_ptr osection;
4022 if (skip_section (ibfd, isection, FALSE))
4023 return;
4025 osection = isection->output_section;
4027 /* Core files and DWO files do not need to be relocated. */
4028 if (bfd_get_format (obfd) == bfd_core
4029 || strip_symbols == STRIP_NONDWO
4030 || discard_relocations (ibfd, isection))
4031 relsize = 0;
4032 else
4034 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
4036 if (relsize < 0)
4038 /* Do not complain if the target does not support relocations. */
4039 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
4040 relsize = 0;
4041 else
4043 status = 1;
4044 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
4045 return;
4050 if (relsize == 0)
4052 bfd_set_reloc (obfd, osection, NULL, 0);
4053 osection->flags &= ~SEC_RELOC;
4055 else
4057 if (isection->orelocation != NULL)
4059 /* Some other function has already set up the output relocs
4060 for us, so scan those instead of the default relocs. */
4061 relcount = isection->reloc_count;
4062 relpp = isection->orelocation;
4064 else
4066 relpp = (arelent **) xmalloc (relsize);
4067 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
4068 if (relcount < 0)
4070 status = 1;
4071 bfd_nonfatal_message (NULL, ibfd, isection,
4072 _("relocation count is negative"));
4073 return;
4077 if (strip_symbols == STRIP_ALL)
4079 /* Remove relocations which are not in
4080 keep_strip_specific_list. */
4081 arelent **temp_relpp;
4082 long temp_relcount = 0;
4083 long i;
4085 temp_relpp = (arelent **) xmalloc (relsize);
4086 for (i = 0; i < relcount; i++)
4088 /* PR 17512: file: 9e907e0c. */
4089 if (relpp[i]->sym_ptr_ptr
4090 /* PR 20096 */
4091 && * relpp[i]->sym_ptr_ptr)
4092 if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
4093 keep_specific_htab))
4094 temp_relpp [temp_relcount++] = relpp [i];
4096 relcount = temp_relcount;
4097 if (isection->orelocation == NULL)
4098 free (relpp);
4099 relpp = temp_relpp;
4102 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
4103 if (relcount == 0)
4105 osection->flags &= ~SEC_RELOC;
4106 free (relpp);
4111 /* Copy the data of input section ISECTION of IBFD
4112 to an output section with the same name in OBFD. */
4114 static void
4115 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
4117 bfd *obfd = (bfd *) obfdarg;
4118 struct section_list *p;
4119 sec_ptr osection;
4120 bfd_size_type size;
4122 if (skip_section (ibfd, isection, TRUE))
4123 return;
4125 osection = isection->output_section;
4126 /* The output SHF_COMPRESSED section size is different from input if
4127 ELF classes of input and output aren't the same. We can't use
4128 the output section size since --interleave will shrink the output
4129 section. Size will be updated if the section is converted. */
4130 size = bfd_get_section_size (isection);
4132 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
4133 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
4135 bfd_byte *memhunk = NULL;
4137 if (!bfd_get_full_section_contents (ibfd, isection, &memhunk)
4138 || !bfd_convert_section_contents (ibfd, isection, obfd,
4139 &memhunk, &size))
4141 status = 1;
4142 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
4143 free (memhunk);
4144 return;
4147 if (reverse_bytes)
4149 /* We don't handle leftover bytes (too many possible behaviors,
4150 and we don't know what the user wants). The section length
4151 must be a multiple of the number of bytes to swap. */
4152 if ((size % reverse_bytes) == 0)
4154 unsigned long i, j;
4155 bfd_byte b;
4157 for (i = 0; i < size; i += reverse_bytes)
4158 for (j = 0; j < (unsigned long)(reverse_bytes / 2); j++)
4160 bfd_byte *m = (bfd_byte *) memhunk;
4162 b = m[i + j];
4163 m[i + j] = m[(i + reverse_bytes) - (j + 1)];
4164 m[(i + reverse_bytes) - (j + 1)] = b;
4167 else
4168 /* User must pad the section up in order to do this. */
4169 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
4170 bfd_section_name (ibfd, isection), reverse_bytes);
4173 if (copy_byte >= 0)
4175 /* Keep only every `copy_byte'th byte in MEMHUNK. */
4176 char *from = (char *) memhunk + copy_byte;
4177 char *to = (char *) memhunk;
4178 char *end = (char *) memhunk + size;
4179 int i;
4181 /* If the section address is not exactly divisible by the interleave,
4182 then we must bias the from address. If the copy_byte is less than
4183 the bias, then we must skip forward one interleave, and increment
4184 the final lma. */
4185 int extra = isection->lma % interleave;
4186 from -= extra;
4187 if (copy_byte < extra)
4188 from += interleave;
4190 for (; from < end; from += interleave)
4191 for (i = 0; i < copy_width; i++)
4193 if (&from[i] >= end)
4194 break;
4195 *to++ = from[i];
4198 size = (size + interleave - 1 - copy_byte) / interleave * copy_width;
4199 osection->lma /= interleave;
4200 if (copy_byte < extra)
4201 osection->lma++;
4204 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
4206 status = 1;
4207 bfd_nonfatal_message (NULL, obfd, osection, NULL);
4208 free (memhunk);
4209 return;
4211 free (memhunk);
4213 else if ((p = find_section_list (bfd_get_section_name (ibfd, isection),
4214 FALSE, SECTION_CONTEXT_SET_FLAGS)) != NULL
4215 && (p->flags & SEC_HAS_CONTENTS) != 0)
4217 void *memhunk = xmalloc (size);
4219 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
4220 flag--they can just remove the section entirely and add it
4221 back again. However, we do permit them to turn on the
4222 SEC_HAS_CONTENTS flag, and take it to mean that the section
4223 contents should be zeroed out. */
4225 memset (memhunk, 0, size);
4226 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
4228 status = 1;
4229 bfd_nonfatal_message (NULL, obfd, osection, NULL);
4230 free (memhunk);
4231 return;
4233 free (memhunk);
4237 /* Get all the sections. This is used when --gap-fill or --pad-to is
4238 used. */
4240 static void
4241 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
4243 asection ***secppp = (asection ***) secppparg;
4245 **secppp = osection;
4246 ++(*secppp);
4249 /* Sort sections by VMA. This is called via qsort, and is used when
4250 --gap-fill or --pad-to is used. We force non loadable or empty
4251 sections to the front, where they are easier to ignore. */
4253 static int
4254 compare_section_lma (const void *arg1, const void *arg2)
4256 const asection *const *sec1 = (const asection * const *) arg1;
4257 const asection *const *sec2 = (const asection * const *) arg2;
4258 flagword flags1, flags2;
4260 /* Sort non loadable sections to the front. */
4261 flags1 = (*sec1)->flags;
4262 flags2 = (*sec2)->flags;
4263 if ((flags1 & SEC_HAS_CONTENTS) == 0
4264 || (flags1 & SEC_LOAD) == 0)
4266 if ((flags2 & SEC_HAS_CONTENTS) != 0
4267 && (flags2 & SEC_LOAD) != 0)
4268 return -1;
4270 else
4272 if ((flags2 & SEC_HAS_CONTENTS) == 0
4273 || (flags2 & SEC_LOAD) == 0)
4274 return 1;
4277 /* Sort sections by LMA. */
4278 if ((*sec1)->lma > (*sec2)->lma)
4279 return 1;
4280 else if ((*sec1)->lma < (*sec2)->lma)
4281 return -1;
4283 /* Sort sections with the same LMA by size. */
4284 if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
4285 return 1;
4286 else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
4287 return -1;
4289 return 0;
4292 /* Mark all the symbols which will be used in output relocations with
4293 the BSF_KEEP flag so that those symbols will not be stripped.
4295 Ignore relocations which will not appear in the output file. */
4297 static void
4298 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
4300 asymbol **symbols = (asymbol **) symbolsarg;
4301 long relsize;
4302 arelent **relpp;
4303 long relcount, i;
4305 /* Ignore an input section with no corresponding output section. */
4306 if (isection->output_section == NULL)
4307 return;
4309 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
4310 if (relsize < 0)
4312 /* Do not complain if the target does not support relocations. */
4313 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
4314 return;
4315 bfd_fatal (bfd_get_filename (ibfd));
4318 if (relsize == 0)
4319 return;
4321 relpp = (arelent **) xmalloc (relsize);
4322 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
4323 if (relcount < 0)
4324 bfd_fatal (bfd_get_filename (ibfd));
4326 /* Examine each symbol used in a relocation. If it's not one of the
4327 special bfd section symbols, then mark it with BSF_KEEP. */
4328 for (i = 0; i < relcount; i++)
4330 /* See PRs 20923 and 20930 for reproducers for the NULL tests. */
4331 if (relpp[i]->sym_ptr_ptr != NULL
4332 && * relpp[i]->sym_ptr_ptr != NULL
4333 && *relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
4334 && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
4335 && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
4336 (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
4339 if (relpp != NULL)
4340 free (relpp);
4343 /* Write out debugging information. */
4345 static bfd_boolean
4346 write_debugging_info (bfd *obfd, void *dhandle,
4347 long *symcountp ATTRIBUTE_UNUSED,
4348 asymbol ***symppp ATTRIBUTE_UNUSED)
4350 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
4351 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
4353 bfd_byte *syms, *strings = NULL;
4354 bfd_size_type symsize, stringsize;
4355 asection *stabsec, *stabstrsec;
4356 flagword flags;
4358 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
4359 &symsize, &strings,
4360 &stringsize))
4361 return FALSE;
4363 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
4364 stabsec = bfd_make_section_with_flags (obfd, ".stab", flags);
4365 stabstrsec = bfd_make_section_with_flags (obfd, ".stabstr", flags);
4366 if (stabsec == NULL
4367 || stabstrsec == NULL
4368 || ! bfd_set_section_size (obfd, stabsec, symsize)
4369 || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
4370 || ! bfd_set_section_alignment (obfd, stabsec, 2)
4371 || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
4373 bfd_nonfatal_message (NULL, obfd, NULL,
4374 _("can't create debugging section"));
4375 free (strings);
4376 return FALSE;
4379 /* We can get away with setting the section contents now because
4380 the next thing the caller is going to do is copy over the
4381 real sections. We may someday have to split the contents
4382 setting out of this function. */
4383 if (! bfd_set_section_contents (obfd, stabsec, syms, 0, symsize)
4384 || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
4385 stringsize))
4387 bfd_nonfatal_message (NULL, obfd, NULL,
4388 _("can't set debugging section contents"));
4389 free (strings);
4390 return FALSE;
4393 return TRUE;
4396 bfd_nonfatal_message (NULL, obfd, NULL,
4397 _("don't know how to write debugging information for %s"),
4398 bfd_get_target (obfd));
4399 return FALSE;
4402 /* If neither -D nor -U was specified explicitly,
4403 then use the configured default. */
4404 static void
4405 default_deterministic (void)
4407 if (deterministic < 0)
4408 deterministic = DEFAULT_AR_DETERMINISTIC;
4411 static int
4412 strip_main (int argc, char *argv[])
4414 char *input_target = NULL;
4415 char *output_target = NULL;
4416 bfd_boolean show_version = FALSE;
4417 bfd_boolean formats_info = FALSE;
4418 int c;
4419 int i;
4420 char *output_file = NULL;
4421 bfd_boolean merge_notes_set = FALSE;
4423 while ((c = getopt_long (argc, argv, "I:O:F:K:MN:R:o:sSpdgxXHhVvwDU",
4424 strip_options, (int *) 0)) != EOF)
4426 switch (c)
4428 case 'I':
4429 input_target = optarg;
4430 break;
4431 case 'O':
4432 output_target = optarg;
4433 break;
4434 case 'F':
4435 input_target = output_target = optarg;
4436 break;
4437 case 'R':
4438 handle_remove_section_option (optarg);
4439 break;
4440 case OPTION_REMOVE_RELOCS:
4441 handle_remove_relocations_option (optarg);
4442 break;
4443 case 's':
4444 strip_symbols = STRIP_ALL;
4445 break;
4446 case 'S':
4447 case 'g':
4448 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
4449 strip_symbols = STRIP_DEBUG;
4450 break;
4451 case OPTION_STRIP_DWO:
4452 strip_symbols = STRIP_DWO;
4453 break;
4454 case OPTION_STRIP_UNNEEDED:
4455 strip_symbols = STRIP_UNNEEDED;
4456 break;
4457 case 'K':
4458 add_specific_symbol (optarg, keep_specific_htab);
4459 break;
4460 case 'M':
4461 merge_notes = TRUE;
4462 merge_notes_set = TRUE;
4463 break;
4464 case OPTION_NO_MERGE_NOTES:
4465 merge_notes = FALSE;
4466 merge_notes_set = TRUE;
4467 break;
4468 case 'N':
4469 add_specific_symbol (optarg, strip_specific_htab);
4470 break;
4471 case 'o':
4472 output_file = optarg;
4473 break;
4474 case 'p':
4475 preserve_dates = TRUE;
4476 break;
4477 case 'D':
4478 deterministic = TRUE;
4479 break;
4480 case 'U':
4481 deterministic = FALSE;
4482 break;
4483 case 'x':
4484 discard_locals = LOCALS_ALL;
4485 break;
4486 case 'X':
4487 discard_locals = LOCALS_START_L;
4488 break;
4489 case 'v':
4490 verbose = TRUE;
4491 break;
4492 case 'V':
4493 show_version = TRUE;
4494 break;
4495 case OPTION_FORMATS_INFO:
4496 formats_info = TRUE;
4497 break;
4498 case OPTION_ONLY_KEEP_DEBUG:
4499 strip_symbols = STRIP_NONDEBUG;
4500 break;
4501 case OPTION_KEEP_FILE_SYMBOLS:
4502 keep_file_symbols = 1;
4503 break;
4504 case 0:
4505 /* We've been given a long option. */
4506 break;
4507 case 'w':
4508 wildcard = TRUE;
4509 break;
4510 case 'H':
4511 case 'h':
4512 strip_usage (stdout, 0);
4513 default:
4514 strip_usage (stderr, 1);
4518 /* If the user has not expressly chosen to merge/not-merge ELF notes
4519 then enable the merging unless we are stripping debug or dwo info. */
4520 if (! merge_notes_set
4521 && (strip_symbols == STRIP_UNDEF
4522 || strip_symbols == STRIP_ALL
4523 || strip_symbols == STRIP_UNNEEDED
4524 || strip_symbols == STRIP_NONDEBUG
4525 || strip_symbols == STRIP_NONDWO))
4526 merge_notes = TRUE;
4528 if (formats_info)
4530 display_info ();
4531 return 0;
4534 if (show_version)
4535 print_version ("strip");
4537 default_deterministic ();
4539 /* Default is to strip all symbols. */
4540 if (strip_symbols == STRIP_UNDEF
4541 && discard_locals == LOCALS_UNDEF
4542 && htab_elements (strip_specific_htab) == 0)
4543 strip_symbols = STRIP_ALL;
4545 if (output_target == NULL)
4546 output_target = input_target;
4548 i = optind;
4549 if (i == argc
4550 || (output_file != NULL && (i + 1) < argc))
4551 strip_usage (stderr, 1);
4553 for (; i < argc; i++)
4555 int hold_status = status;
4556 struct stat statbuf;
4557 char *tmpname;
4559 if (get_file_size (argv[i]) < 1)
4561 status = 1;
4562 continue;
4565 if (preserve_dates)
4566 /* No need to check the return value of stat().
4567 It has already been checked in get_file_size(). */
4568 stat (argv[i], &statbuf);
4570 if (output_file == NULL
4571 || filename_cmp (argv[i], output_file) == 0)
4572 tmpname = make_tempname (argv[i]);
4573 else
4574 tmpname = output_file;
4576 if (tmpname == NULL)
4578 bfd_nonfatal_message (argv[i], NULL, NULL,
4579 _("could not create temporary file to hold stripped copy"));
4580 status = 1;
4581 continue;
4584 status = 0;
4585 copy_file (argv[i], tmpname, input_target, output_target, NULL);
4586 if (status == 0)
4588 if (preserve_dates)
4589 set_times (tmpname, &statbuf);
4590 if (output_file != tmpname)
4591 status = (smart_rename (tmpname,
4592 output_file ? output_file : argv[i],
4593 preserve_dates) != 0);
4594 if (status == 0)
4595 status = hold_status;
4597 else
4598 unlink_if_ordinary (tmpname);
4599 if (output_file != tmpname)
4600 free (tmpname);
4603 return status;
4606 /* Set up PE subsystem. */
4608 static void
4609 set_pe_subsystem (const char *s)
4611 const char *version, *subsystem;
4612 size_t i;
4613 static const struct
4615 const char *name;
4616 const char set_def;
4617 const short value;
4619 v[] =
4621 { "native", 0, IMAGE_SUBSYSTEM_NATIVE },
4622 { "windows", 0, IMAGE_SUBSYSTEM_WINDOWS_GUI },
4623 { "console", 0, IMAGE_SUBSYSTEM_WINDOWS_CUI },
4624 { "posix", 0, IMAGE_SUBSYSTEM_POSIX_CUI },
4625 { "wince", 0, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI },
4626 { "efi-app", 1, IMAGE_SUBSYSTEM_EFI_APPLICATION },
4627 { "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER },
4628 { "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER },
4629 { "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER },
4630 { "xbox", 0, IMAGE_SUBSYSTEM_XBOX }
4632 short value;
4633 char *copy;
4634 int set_def = -1;
4636 /* Check for the presence of a version number. */
4637 version = strchr (s, ':');
4638 if (version == NULL)
4639 subsystem = s;
4640 else
4642 int len = version - s;
4643 copy = xstrdup (s);
4644 subsystem = copy;
4645 copy[len] = '\0';
4646 version = copy + 1 + len;
4647 pe_major_subsystem_version = strtoul (version, &copy, 0);
4648 if (*copy == '.')
4649 pe_minor_subsystem_version = strtoul (copy + 1, &copy, 0);
4650 if (*copy != '\0')
4651 non_fatal (_("%s: bad version in PE subsystem"), s);
4654 /* Check for numeric subsystem. */
4655 value = (short) strtol (subsystem, &copy, 0);
4656 if (*copy == '\0')
4658 for (i = 0; i < ARRAY_SIZE (v); i++)
4659 if (v[i].value == value)
4661 pe_subsystem = value;
4662 set_def = v[i].set_def;
4663 break;
4666 else
4668 /* Search for subsystem by name. */
4669 for (i = 0; i < ARRAY_SIZE (v); i++)
4670 if (strcmp (subsystem, v[i].name) == 0)
4672 pe_subsystem = v[i].value;
4673 set_def = v[i].set_def;
4674 break;
4678 switch (set_def)
4680 case -1:
4681 fatal (_("unknown PE subsystem: %s"), s);
4682 break;
4683 case 0:
4684 break;
4685 default:
4686 if (pe_file_alignment == (bfd_vma) -1)
4687 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
4688 if (pe_section_alignment == (bfd_vma) -1)
4689 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
4690 break;
4692 if (s != subsystem)
4693 free ((char *) subsystem);
4696 /* Convert EFI target to PEI target. */
4698 static void
4699 convert_efi_target (char *efi)
4701 efi[0] = 'p';
4702 efi[1] = 'e';
4703 efi[2] = 'i';
4705 if (strcmp (efi + 4, "ia32") == 0)
4707 /* Change ia32 to i386. */
4708 efi[5]= '3';
4709 efi[6]= '8';
4710 efi[7]= '6';
4712 else if (strcmp (efi + 4, "x86_64") == 0)
4714 /* Change x86_64 to x86-64. */
4715 efi[7] = '-';
4719 /* Allocate and return a pointer to a struct section_add, initializing the
4720 structure using ARG, a string in the format "sectionname=filename".
4721 The returned structure will have its next pointer set to NEXT. The
4722 OPTION field is the name of the command line option currently being
4723 parsed, and is only used if an error needs to be reported. */
4725 static struct section_add *
4726 init_section_add (const char *arg,
4727 struct section_add *next,
4728 const char *option)
4730 struct section_add *pa;
4731 const char *s;
4733 s = strchr (arg, '=');
4734 if (s == NULL)
4735 fatal (_("bad format for %s"), option);
4737 pa = (struct section_add *) xmalloc (sizeof (struct section_add));
4738 pa->name = xstrndup (arg, s - arg);
4739 pa->filename = s + 1;
4740 pa->next = next;
4741 pa->contents = NULL;
4742 pa->size = 0;
4744 return pa;
4747 /* Load the file specified in PA, allocating memory to hold the file
4748 contents, and store a pointer to the allocated memory in the contents
4749 field of PA. The size field of PA is also updated. All errors call
4750 FATAL. */
4752 static void
4753 section_add_load_file (struct section_add *pa)
4755 size_t off, alloc;
4756 FILE *f;
4758 /* We don't use get_file_size so that we can do
4759 --add-section .note.GNU_stack=/dev/null
4760 get_file_size doesn't work on /dev/null. */
4762 f = fopen (pa->filename, FOPEN_RB);
4763 if (f == NULL)
4764 fatal (_("cannot open: %s: %s"),
4765 pa->filename, strerror (errno));
4767 off = 0;
4768 alloc = 4096;
4769 pa->contents = (bfd_byte *) xmalloc (alloc);
4770 while (!feof (f))
4772 off_t got;
4774 if (off == alloc)
4776 alloc <<= 1;
4777 pa->contents = (bfd_byte *) xrealloc (pa->contents, alloc);
4780 got = fread (pa->contents + off, 1, alloc - off, f);
4781 if (ferror (f))
4782 fatal (_("%s: fread failed"), pa->filename);
4784 off += got;
4787 pa->size = off;
4789 fclose (f);
4792 static int
4793 copy_main (int argc, char *argv[])
4795 char *input_filename = NULL;
4796 char *output_filename = NULL;
4797 char *tmpname;
4798 char *input_target = NULL;
4799 char *output_target = NULL;
4800 bfd_boolean show_version = FALSE;
4801 bfd_boolean change_warn = TRUE;
4802 bfd_boolean formats_info = FALSE;
4803 bfd_boolean use_globalize = FALSE;
4804 bfd_boolean use_keep_global = FALSE;
4805 int c;
4806 struct stat statbuf;
4807 const bfd_arch_info_type *input_arch = NULL;
4809 while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:MN:s:O:d:F:L:G:R:SpgxXHhVvW:wDU",
4810 copy_options, (int *) 0)) != EOF)
4812 switch (c)
4814 case 'b':
4815 copy_byte = atoi (optarg);
4816 if (copy_byte < 0)
4817 fatal (_("byte number must be non-negative"));
4818 break;
4820 case 'B':
4821 input_arch = bfd_scan_arch (optarg);
4822 if (input_arch == NULL)
4823 fatal (_("architecture %s unknown"), optarg);
4824 break;
4826 case 'i':
4827 if (optarg)
4829 interleave = atoi (optarg);
4830 if (interleave < 1)
4831 fatal (_("interleave must be positive"));
4833 else
4834 interleave = 4;
4835 break;
4837 case OPTION_INTERLEAVE_WIDTH:
4838 copy_width = atoi (optarg);
4839 if (copy_width < 1)
4840 fatal(_("interleave width must be positive"));
4841 break;
4843 case 'I':
4844 case 's': /* "source" - 'I' is preferred */
4845 input_target = optarg;
4846 break;
4848 case 'O':
4849 case 'd': /* "destination" - 'O' is preferred */
4850 output_target = optarg;
4851 break;
4853 case 'F':
4854 input_target = output_target = optarg;
4855 break;
4857 case 'j':
4858 find_section_list (optarg, TRUE, SECTION_CONTEXT_COPY);
4859 sections_copied = TRUE;
4860 break;
4862 case 'R':
4863 handle_remove_section_option (optarg);
4864 break;
4866 case OPTION_REMOVE_RELOCS:
4867 handle_remove_relocations_option (optarg);
4868 break;
4870 case 'S':
4871 strip_symbols = STRIP_ALL;
4872 break;
4874 case 'g':
4875 strip_symbols = STRIP_DEBUG;
4876 break;
4878 case OPTION_STRIP_DWO:
4879 strip_symbols = STRIP_DWO;
4880 break;
4882 case OPTION_STRIP_UNNEEDED:
4883 strip_symbols = STRIP_UNNEEDED;
4884 break;
4886 case OPTION_ONLY_KEEP_DEBUG:
4887 strip_symbols = STRIP_NONDEBUG;
4888 break;
4890 case OPTION_KEEP_FILE_SYMBOLS:
4891 keep_file_symbols = 1;
4892 break;
4894 case OPTION_ADD_GNU_DEBUGLINK:
4895 long_section_names = ENABLE ;
4896 gnu_debuglink_filename = optarg;
4897 break;
4899 case 'K':
4900 add_specific_symbol (optarg, keep_specific_htab);
4901 break;
4903 case 'M':
4904 merge_notes = TRUE;
4905 break;
4906 case OPTION_NO_MERGE_NOTES:
4907 merge_notes = FALSE;
4908 break;
4910 case 'N':
4911 add_specific_symbol (optarg, strip_specific_htab);
4912 break;
4914 case OPTION_STRIP_UNNEEDED_SYMBOL:
4915 add_specific_symbol (optarg, strip_unneeded_htab);
4916 break;
4918 case 'L':
4919 add_specific_symbol (optarg, localize_specific_htab);
4920 break;
4922 case OPTION_GLOBALIZE_SYMBOL:
4923 use_globalize = TRUE;
4924 add_specific_symbol (optarg, globalize_specific_htab);
4925 break;
4927 case 'G':
4928 use_keep_global = TRUE;
4929 add_specific_symbol (optarg, keepglobal_specific_htab);
4930 break;
4932 case 'W':
4933 add_specific_symbol (optarg, weaken_specific_htab);
4934 break;
4936 case 'p':
4937 preserve_dates = TRUE;
4938 break;
4940 case 'D':
4941 deterministic = TRUE;
4942 break;
4944 case 'U':
4945 deterministic = FALSE;
4946 break;
4948 case 'w':
4949 wildcard = TRUE;
4950 break;
4952 case 'x':
4953 discard_locals = LOCALS_ALL;
4954 break;
4956 case 'X':
4957 discard_locals = LOCALS_START_L;
4958 break;
4960 case 'v':
4961 verbose = TRUE;
4962 break;
4964 case 'V':
4965 show_version = TRUE;
4966 break;
4968 case OPTION_FORMATS_INFO:
4969 formats_info = TRUE;
4970 break;
4972 case OPTION_WEAKEN:
4973 weaken = TRUE;
4974 break;
4976 case OPTION_ADD_SECTION:
4977 add_sections = init_section_add (optarg, add_sections,
4978 "--add-section");
4979 section_add_load_file (add_sections);
4980 break;
4982 case OPTION_UPDATE_SECTION:
4983 update_sections = init_section_add (optarg, update_sections,
4984 "--update-section");
4985 section_add_load_file (update_sections);
4986 break;
4988 case OPTION_DUMP_SECTION:
4989 dump_sections = init_section_add (optarg, dump_sections,
4990 "--dump-section");
4991 break;
4993 case OPTION_ADD_SYMBOL:
4995 char *s, *t;
4996 struct addsym_node *newsym = xmalloc (sizeof *newsym);
4998 newsym->next = NULL;
4999 s = strchr (optarg, '=');
5000 if (s == NULL)
5001 fatal (_("bad format for %s"), "--add-symbol");
5002 t = strchr (s + 1, ':');
5004 newsym->symdef = xstrndup (optarg, s - optarg);
5005 if (t)
5007 newsym->section = xstrndup (s + 1, t - (s + 1));
5008 newsym->symval = strtol (t + 1, NULL, 0);
5010 else
5012 newsym->section = NULL;
5013 newsym->symval = strtol (s + 1, NULL, 0);
5014 t = s;
5017 t = strchr (t + 1, ',');
5018 newsym->othersym = NULL;
5019 if (t)
5020 newsym->flags = parse_symflags (t+1, &newsym->othersym);
5021 else
5022 newsym->flags = BSF_GLOBAL;
5024 /* Keep 'othersym' symbols at the front of the list. */
5025 if (newsym->othersym)
5027 newsym->next = add_sym_list;
5028 if (!add_sym_list)
5029 add_sym_tail = &newsym->next;
5030 add_sym_list = newsym;
5032 else
5034 *add_sym_tail = newsym;
5035 add_sym_tail = &newsym->next;
5037 add_symbols++;
5039 break;
5041 case OPTION_CHANGE_START:
5042 change_start = parse_vma (optarg, "--change-start");
5043 break;
5045 case OPTION_CHANGE_SECTION_ADDRESS:
5046 case OPTION_CHANGE_SECTION_LMA:
5047 case OPTION_CHANGE_SECTION_VMA:
5049 struct section_list * p;
5050 unsigned int context = 0;
5051 const char *s;
5052 int len;
5053 char *name;
5054 char *option = NULL;
5055 bfd_vma val;
5057 switch (c)
5059 case OPTION_CHANGE_SECTION_ADDRESS:
5060 option = "--change-section-address";
5061 context = SECTION_CONTEXT_ALTER_LMA | SECTION_CONTEXT_ALTER_VMA;
5062 break;
5063 case OPTION_CHANGE_SECTION_LMA:
5064 option = "--change-section-lma";
5065 context = SECTION_CONTEXT_ALTER_LMA;
5066 break;
5067 case OPTION_CHANGE_SECTION_VMA:
5068 option = "--change-section-vma";
5069 context = SECTION_CONTEXT_ALTER_VMA;
5070 break;
5073 s = strchr (optarg, '=');
5074 if (s == NULL)
5076 s = strchr (optarg, '+');
5077 if (s == NULL)
5079 s = strchr (optarg, '-');
5080 if (s == NULL)
5081 fatal (_("bad format for %s"), option);
5084 else
5086 /* Correct the context. */
5087 switch (c)
5089 case OPTION_CHANGE_SECTION_ADDRESS:
5090 context = SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_SET_VMA;
5091 break;
5092 case OPTION_CHANGE_SECTION_LMA:
5093 context = SECTION_CONTEXT_SET_LMA;
5094 break;
5095 case OPTION_CHANGE_SECTION_VMA:
5096 context = SECTION_CONTEXT_SET_VMA;
5097 break;
5101 len = s - optarg;
5102 name = (char *) xmalloc (len + 1);
5103 strncpy (name, optarg, len);
5104 name[len] = '\0';
5106 p = find_section_list (name, TRUE, context);
5108 val = parse_vma (s + 1, option);
5109 if (*s == '-')
5110 val = - val;
5112 switch (c)
5114 case OPTION_CHANGE_SECTION_ADDRESS:
5115 p->vma_val = val;
5116 /* Fall through. */
5118 case OPTION_CHANGE_SECTION_LMA:
5119 p->lma_val = val;
5120 break;
5122 case OPTION_CHANGE_SECTION_VMA:
5123 p->vma_val = val;
5124 break;
5127 break;
5129 case OPTION_CHANGE_ADDRESSES:
5130 change_section_address = parse_vma (optarg, "--change-addresses");
5131 change_start = change_section_address;
5132 break;
5134 case OPTION_CHANGE_WARNINGS:
5135 change_warn = TRUE;
5136 break;
5138 case OPTION_CHANGE_LEADING_CHAR:
5139 change_leading_char = TRUE;
5140 break;
5142 case OPTION_COMPRESS_DEBUG_SECTIONS:
5143 if (optarg)
5145 if (strcasecmp (optarg, "none") == 0)
5146 do_debug_sections = decompress;
5147 else if (strcasecmp (optarg, "zlib") == 0)
5148 do_debug_sections = compress_zlib;
5149 else if (strcasecmp (optarg, "zlib-gnu") == 0)
5150 do_debug_sections = compress_gnu_zlib;
5151 else if (strcasecmp (optarg, "zlib-gabi") == 0)
5152 do_debug_sections = compress_gabi_zlib;
5153 else
5154 fatal (_("unrecognized --compress-debug-sections type `%s'"),
5155 optarg);
5157 else
5158 do_debug_sections = compress;
5159 break;
5161 case OPTION_DEBUGGING:
5162 convert_debugging = TRUE;
5163 break;
5165 case OPTION_DECOMPRESS_DEBUG_SECTIONS:
5166 do_debug_sections = decompress;
5167 break;
5169 case OPTION_ELF_STT_COMMON:
5170 if (strcasecmp (optarg, "yes") == 0)
5171 do_elf_stt_common = elf_stt_common;
5172 else if (strcasecmp (optarg, "no") == 0)
5173 do_elf_stt_common = no_elf_stt_common;
5174 else
5175 fatal (_("unrecognized --elf-stt-common= option `%s'"),
5176 optarg);
5177 break;
5179 case OPTION_GAP_FILL:
5181 bfd_vma gap_fill_vma;
5183 gap_fill_vma = parse_vma (optarg, "--gap-fill");
5184 gap_fill = (bfd_byte) gap_fill_vma;
5185 if ((bfd_vma) gap_fill != gap_fill_vma)
5187 char buff[20];
5189 sprintf_vma (buff, gap_fill_vma);
5191 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
5192 buff, gap_fill);
5194 gap_fill_set = TRUE;
5196 break;
5198 case OPTION_NO_CHANGE_WARNINGS:
5199 change_warn = FALSE;
5200 break;
5202 case OPTION_PAD_TO:
5203 pad_to = parse_vma (optarg, "--pad-to");
5204 pad_to_set = TRUE;
5205 break;
5207 case OPTION_REMOVE_LEADING_CHAR:
5208 remove_leading_char = TRUE;
5209 break;
5211 case OPTION_REDEFINE_SYM:
5213 /* Insert this redefinition onto redefine_specific_htab. */
5215 int len;
5216 const char *s;
5217 const char *nextarg;
5218 char *source, *target;
5220 s = strchr (optarg, '=');
5221 if (s == NULL)
5222 fatal (_("bad format for %s"), "--redefine-sym");
5224 len = s - optarg;
5225 source = (char *) xmalloc (len + 1);
5226 strncpy (source, optarg, len);
5227 source[len] = '\0';
5229 nextarg = s + 1;
5230 len = strlen (nextarg);
5231 target = (char *) xmalloc (len + 1);
5232 strcpy (target, nextarg);
5234 add_redefine_and_check ("--redefine-sym", source, target);
5236 free (source);
5237 free (target);
5239 break;
5241 case OPTION_REDEFINE_SYMS:
5242 add_redefine_syms_file (optarg);
5243 break;
5245 case OPTION_SET_SECTION_FLAGS:
5247 struct section_list *p;
5248 const char *s;
5249 int len;
5250 char *name;
5252 s = strchr (optarg, '=');
5253 if (s == NULL)
5254 fatal (_("bad format for %s"), "--set-section-flags");
5256 len = s - optarg;
5257 name = (char *) xmalloc (len + 1);
5258 strncpy (name, optarg, len);
5259 name[len] = '\0';
5261 p = find_section_list (name, TRUE, SECTION_CONTEXT_SET_FLAGS);
5263 p->flags = parse_flags (s + 1);
5265 break;
5267 case OPTION_RENAME_SECTION:
5269 flagword flags;
5270 const char *eq, *fl;
5271 char *old_name;
5272 char *new_name;
5273 unsigned int len;
5275 eq = strchr (optarg, '=');
5276 if (eq == NULL)
5277 fatal (_("bad format for %s"), "--rename-section");
5279 len = eq - optarg;
5280 if (len == 0)
5281 fatal (_("bad format for %s"), "--rename-section");
5283 old_name = (char *) xmalloc (len + 1);
5284 strncpy (old_name, optarg, len);
5285 old_name[len] = 0;
5287 eq++;
5288 fl = strchr (eq, ',');
5289 if (fl)
5291 flags = parse_flags (fl + 1);
5292 len = fl - eq;
5294 else
5296 flags = -1;
5297 len = strlen (eq);
5300 if (len == 0)
5301 fatal (_("bad format for %s"), "--rename-section");
5303 new_name = (char *) xmalloc (len + 1);
5304 strncpy (new_name, eq, len);
5305 new_name[len] = 0;
5307 add_section_rename (old_name, new_name, flags);
5309 break;
5311 case OPTION_SET_START:
5312 set_start = parse_vma (optarg, "--set-start");
5313 set_start_set = TRUE;
5314 break;
5316 case OPTION_SREC_LEN:
5317 _bfd_srec_len = parse_vma (optarg, "--srec-len");
5318 break;
5320 case OPTION_SREC_FORCES3:
5321 _bfd_srec_forceS3 = TRUE;
5322 break;
5324 case OPTION_STRIP_SYMBOLS:
5325 add_specific_symbols (optarg, strip_specific_htab,
5326 &strip_specific_buffer);
5327 break;
5329 case OPTION_STRIP_UNNEEDED_SYMBOLS:
5330 add_specific_symbols (optarg, strip_unneeded_htab,
5331 &strip_unneeded_buffer);
5332 break;
5334 case OPTION_KEEP_SYMBOLS:
5335 add_specific_symbols (optarg, keep_specific_htab,
5336 &keep_specific_buffer);
5337 break;
5339 case OPTION_LOCALIZE_HIDDEN:
5340 localize_hidden = TRUE;
5341 break;
5343 case OPTION_LOCALIZE_SYMBOLS:
5344 add_specific_symbols (optarg, localize_specific_htab,
5345 &localize_specific_buffer);
5346 break;
5348 case OPTION_LONG_SECTION_NAMES:
5349 if (!strcmp ("enable", optarg))
5350 long_section_names = ENABLE;
5351 else if (!strcmp ("disable", optarg))
5352 long_section_names = DISABLE;
5353 else if (!strcmp ("keep", optarg))
5354 long_section_names = KEEP;
5355 else
5356 fatal (_("unknown long section names option '%s'"), optarg);
5357 break;
5359 case OPTION_GLOBALIZE_SYMBOLS:
5360 use_globalize = TRUE;
5361 add_specific_symbols (optarg, globalize_specific_htab,
5362 &globalize_specific_buffer);
5363 break;
5365 case OPTION_KEEPGLOBAL_SYMBOLS:
5366 use_keep_global = TRUE;
5367 add_specific_symbols (optarg, keepglobal_specific_htab,
5368 &keepglobal_specific_buffer);
5369 break;
5371 case OPTION_WEAKEN_SYMBOLS:
5372 add_specific_symbols (optarg, weaken_specific_htab,
5373 &weaken_specific_buffer);
5374 break;
5376 case OPTION_ALT_MACH_CODE:
5377 use_alt_mach_code = strtoul (optarg, NULL, 0);
5378 if (use_alt_mach_code == 0)
5379 fatal (_("unable to parse alternative machine code"));
5380 break;
5382 case OPTION_PREFIX_SYMBOLS:
5383 prefix_symbols_string = optarg;
5384 break;
5386 case OPTION_PREFIX_SECTIONS:
5387 prefix_sections_string = optarg;
5388 break;
5390 case OPTION_PREFIX_ALLOC_SECTIONS:
5391 prefix_alloc_sections_string = optarg;
5392 break;
5394 case OPTION_READONLY_TEXT:
5395 bfd_flags_to_set |= WP_TEXT;
5396 bfd_flags_to_clear &= ~WP_TEXT;
5397 break;
5399 case OPTION_WRITABLE_TEXT:
5400 bfd_flags_to_clear |= WP_TEXT;
5401 bfd_flags_to_set &= ~WP_TEXT;
5402 break;
5404 case OPTION_PURE:
5405 bfd_flags_to_set |= D_PAGED;
5406 bfd_flags_to_clear &= ~D_PAGED;
5407 break;
5409 case OPTION_IMPURE:
5410 bfd_flags_to_clear |= D_PAGED;
5411 bfd_flags_to_set &= ~D_PAGED;
5412 break;
5414 case OPTION_EXTRACT_DWO:
5415 strip_symbols = STRIP_NONDWO;
5416 break;
5418 case OPTION_EXTRACT_SYMBOL:
5419 extract_symbol = TRUE;
5420 break;
5422 case OPTION_REVERSE_BYTES:
5424 int prev = reverse_bytes;
5426 reverse_bytes = atoi (optarg);
5427 if ((reverse_bytes <= 0) || ((reverse_bytes % 2) != 0))
5428 fatal (_("number of bytes to reverse must be positive and even"));
5430 if (prev && prev != reverse_bytes)
5431 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
5432 prev);
5433 break;
5436 case OPTION_FILE_ALIGNMENT:
5437 pe_file_alignment = parse_vma (optarg, "--file-alignment");
5438 break;
5440 case OPTION_HEAP:
5442 char *end;
5443 pe_heap_reserve = strtoul (optarg, &end, 0);
5444 if (end == optarg
5445 || (*end != '.' && *end != '\0'))
5446 non_fatal (_("%s: invalid reserve value for --heap"),
5447 optarg);
5448 else if (*end != '\0')
5450 pe_heap_commit = strtoul (end + 1, &end, 0);
5451 if (*end != '\0')
5452 non_fatal (_("%s: invalid commit value for --heap"),
5453 optarg);
5456 break;
5458 case OPTION_IMAGE_BASE:
5459 pe_image_base = parse_vma (optarg, "--image-base");
5460 break;
5462 case OPTION_SECTION_ALIGNMENT:
5463 pe_section_alignment = parse_vma (optarg,
5464 "--section-alignment");
5465 break;
5467 case OPTION_SUBSYSTEM:
5468 set_pe_subsystem (optarg);
5469 break;
5471 case OPTION_STACK:
5473 char *end;
5474 pe_stack_reserve = strtoul (optarg, &end, 0);
5475 if (end == optarg
5476 || (*end != '.' && *end != '\0'))
5477 non_fatal (_("%s: invalid reserve value for --stack"),
5478 optarg);
5479 else if (*end != '\0')
5481 pe_stack_commit = strtoul (end + 1, &end, 0);
5482 if (*end != '\0')
5483 non_fatal (_("%s: invalid commit value for --stack"),
5484 optarg);
5487 break;
5489 case OPTION_VERILOG_DATA_WIDTH:
5490 VerilogDataWidth = parse_vma (optarg, "--verilog-data-width");
5491 if (VerilogDataWidth < 1)
5492 fatal (_("verilog data width must be at least 1 byte"));
5493 break;
5495 case 0:
5496 /* We've been given a long option. */
5497 break;
5499 case 'H':
5500 case 'h':
5501 copy_usage (stdout, 0);
5503 default:
5504 copy_usage (stderr, 1);
5508 if (use_globalize && use_keep_global)
5509 fatal(_("--globalize-symbol(s) is incompatible with -G/--keep-global-symbol(s)"));
5511 if (formats_info)
5513 display_info ();
5514 return 0;
5517 if (show_version)
5518 print_version ("objcopy");
5520 if (interleave && copy_byte == -1)
5521 fatal (_("interleave start byte must be set with --byte"));
5523 if (copy_byte >= interleave)
5524 fatal (_("byte number must be less than interleave"));
5526 if (copy_width > interleave - copy_byte)
5527 fatal (_("interleave width must be less than or equal to interleave - byte`"));
5529 if (optind == argc || optind + 2 < argc)
5530 copy_usage (stderr, 1);
5532 input_filename = argv[optind];
5533 if (optind + 1 < argc)
5534 output_filename = argv[optind + 1];
5536 default_deterministic ();
5538 /* Default is to strip no symbols. */
5539 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
5540 strip_symbols = STRIP_NONE;
5542 if (output_target == NULL)
5543 output_target = input_target;
5545 /* Convert input EFI target to PEI target. */
5546 if (input_target != NULL
5547 && strncmp (input_target, "efi-", 4) == 0)
5549 char *efi;
5551 efi = xstrdup (output_target + 4);
5552 if (strncmp (efi, "bsdrv-", 6) == 0
5553 || strncmp (efi, "rtdrv-", 6) == 0)
5554 efi += 2;
5555 else if (strncmp (efi, "app-", 4) != 0)
5556 fatal (_("unknown input EFI target: %s"), input_target);
5558 input_target = efi;
5559 convert_efi_target (efi);
5562 /* Convert output EFI target to PEI target. */
5563 if (output_target != NULL
5564 && strncmp (output_target, "efi-", 4) == 0)
5566 char *efi;
5568 efi = xstrdup (output_target + 4);
5569 if (strncmp (efi, "app-", 4) == 0)
5571 if (pe_subsystem == -1)
5572 pe_subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
5574 else if (strncmp (efi, "bsdrv-", 6) == 0)
5576 if (pe_subsystem == -1)
5577 pe_subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;
5578 efi += 2;
5580 else if (strncmp (efi, "rtdrv-", 6) == 0)
5582 if (pe_subsystem == -1)
5583 pe_subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;
5584 efi += 2;
5586 else
5587 fatal (_("unknown output EFI target: %s"), output_target);
5589 if (pe_file_alignment == (bfd_vma) -1)
5590 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
5591 if (pe_section_alignment == (bfd_vma) -1)
5592 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
5594 output_target = efi;
5595 convert_efi_target (efi);
5598 if (preserve_dates)
5599 if (stat (input_filename, & statbuf) < 0)
5600 fatal (_("warning: could not locate '%s'. System error message: %s"),
5601 input_filename, strerror (errno));
5603 /* If there is no destination file, or the source and destination files
5604 are the same, then create a temp and rename the result into the input. */
5605 if (output_filename == NULL
5606 || filename_cmp (input_filename, output_filename) == 0)
5607 tmpname = make_tempname (input_filename);
5608 else
5609 tmpname = output_filename;
5611 if (tmpname == NULL)
5612 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
5613 input_filename, strerror (errno));
5615 copy_file (input_filename, tmpname, input_target, output_target, input_arch);
5616 if (status == 0)
5618 if (preserve_dates)
5619 set_times (tmpname, &statbuf);
5620 if (tmpname != output_filename)
5621 status = (smart_rename (tmpname, input_filename,
5622 preserve_dates) != 0);
5624 else
5625 unlink_if_ordinary (tmpname);
5627 if (tmpname != output_filename)
5628 free (tmpname);
5630 if (change_warn)
5632 struct section_list *p;
5634 for (p = change_sections; p != NULL; p = p->next)
5636 if (! p->used)
5638 if (p->context & (SECTION_CONTEXT_SET_VMA | SECTION_CONTEXT_ALTER_VMA))
5640 char buff [20];
5642 sprintf_vma (buff, p->vma_val);
5644 /* xgettext:c-format */
5645 non_fatal (_("%s %s%c0x%s never used"),
5646 "--change-section-vma",
5647 p->pattern,
5648 p->context & SECTION_CONTEXT_SET_VMA ? '=' : '+',
5649 buff);
5652 if (p->context & (SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_ALTER_LMA))
5654 char buff [20];
5656 sprintf_vma (buff, p->lma_val);
5658 /* xgettext:c-format */
5659 non_fatal (_("%s %s%c0x%s never used"),
5660 "--change-section-lma",
5661 p->pattern,
5662 p->context & SECTION_CONTEXT_SET_LMA ? '=' : '+',
5663 buff);
5669 if (strip_specific_buffer)
5670 free (strip_specific_buffer);
5672 if (strip_unneeded_buffer)
5673 free (strip_unneeded_buffer);
5675 if (keep_specific_buffer)
5676 free (keep_specific_buffer);
5678 if (localize_specific_buffer)
5679 free (globalize_specific_buffer);
5681 if (globalize_specific_buffer)
5682 free (globalize_specific_buffer);
5684 if (keepglobal_specific_buffer)
5685 free (keepglobal_specific_buffer);
5687 if (weaken_specific_buffer)
5688 free (weaken_specific_buffer);
5690 return 0;
5694 main (int argc, char *argv[])
5696 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
5697 setlocale (LC_MESSAGES, "");
5698 #endif
5699 #if defined (HAVE_SETLOCALE)
5700 setlocale (LC_CTYPE, "");
5701 #endif
5702 bindtextdomain (PACKAGE, LOCALEDIR);
5703 textdomain (PACKAGE);
5705 program_name = argv[0];
5706 xmalloc_set_program_name (program_name);
5708 START_PROGRESS (program_name, 0);
5710 expandargv (&argc, &argv);
5712 strip_symbols = STRIP_UNDEF;
5713 discard_locals = LOCALS_UNDEF;
5715 if (bfd_init () != BFD_INIT_MAGIC)
5716 fatal (_("fatal error: libbfd ABI mismatch"));
5717 set_default_bfd_target ();
5719 if (is_strip < 0)
5721 int i = strlen (program_name);
5722 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5723 /* Drop the .exe suffix, if any. */
5724 if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
5726 i -= 4;
5727 program_name[i] = '\0';
5729 #endif
5730 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
5733 create_symbol_htabs ();
5735 if (argv != NULL)
5736 bfd_set_error_program_name (argv[0]);
5738 if (is_strip)
5739 strip_main (argc, argv);
5740 else
5741 copy_main (argc, argv);
5743 END_PROGRESS (program_name);
5745 return status;