28b9d3bf9291518bffe93e98aa9b9b50a8fff3e2
[deliverable/binutils-gdb.git] / binutils / objcopy.c
1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright (C) 1991-2019 Free Software Foundation, Inc.
3
4 This file is part of GNU Binutils.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
20 \f
21 #include "sysdep.h"
22 #include "bfd.h"
23 #include "progress.h"
24 #include "getopt.h"
25 #include "libiberty.h"
26 #include "bucomm.h"
27 #include "budbg.h"
28 #include "filenames.h"
29 #include "fnmatch.h"
30 #include "elf-bfd.h"
31 #include "coff/internal.h"
32 #include "libcoff.h"
33 #include "safe-ctype.h"
34
35 /* FIXME: See bfd/peXXigen.c for why we include an architecture specific
36 header in generic PE code. */
37 #include "coff/i386.h"
38 #include "coff/pe.h"
39
40 static bfd_vma pe_file_alignment = (bfd_vma) -1;
41 static bfd_vma pe_heap_commit = (bfd_vma) -1;
42 static bfd_vma pe_heap_reserve = (bfd_vma) -1;
43 static bfd_vma pe_image_base = (bfd_vma) -1;
44 static bfd_vma pe_section_alignment = (bfd_vma) -1;
45 static bfd_vma pe_stack_commit = (bfd_vma) -1;
46 static bfd_vma pe_stack_reserve = (bfd_vma) -1;
47 static short pe_subsystem = -1;
48 static short pe_major_subsystem_version = -1;
49 static short pe_minor_subsystem_version = -1;
50
51 struct is_specified_symbol_predicate_data
52 {
53 const char * name;
54 bfd_boolean found;
55 };
56
57 /* A node includes symbol name mapping to support redefine_sym. */
58 struct redefine_node
59 {
60 char *source;
61 char *target;
62 };
63
64 struct addsym_node
65 {
66 struct addsym_node *next;
67 char * symdef;
68 long symval;
69 flagword flags;
70 char * section;
71 char * othersym;
72 };
73
74 typedef struct section_rename
75 {
76 const char * old_name;
77 const char * new_name;
78 flagword flags;
79 struct section_rename * next;
80 }
81 section_rename;
82
83 /* List of sections to be renamed. */
84 static section_rename *section_rename_list;
85
86 static asymbol **isympp = NULL; /* Input symbols. */
87 static asymbol **osympp = NULL; /* Output symbols that survive stripping. */
88
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;
93
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. */
98
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. */
102
103 enum strip_action
104 {
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. */
113 };
114
115 /* Which symbols to remove. */
116 static enum strip_action strip_symbols = STRIP_UNDEF;
117
118 enum locals_action
119 {
120 LOCALS_UNDEF,
121 LOCALS_START_L, /* Discard locals starting with L. */
122 LOCALS_ALL /* Discard all locals. */
123 };
124
125 /* Which local symbols to remove. Overrides STRIP_ALL. */
126 static enum locals_action discard_locals;
127
128 /* Structure used to hold lists of sections and actions to take. */
129 struct section_list
130 {
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. */
134
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. */
146
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. */
150 };
151
152 static struct section_list *change_sections;
153
154 /* TRUE if some sections are to be removed. */
155 static bfd_boolean sections_removed;
156
157 /* TRUE if only some sections are to be copied. */
158 static bfd_boolean sections_copied;
159
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;
164
165 /* Changes to section addresses. */
166 static bfd_vma change_section_address = 0;
167
168 /* Filling gaps between sections. */
169 static bfd_boolean gap_fill_set = FALSE;
170 static bfd_byte gap_fill = 0;
171
172 /* Pad to a given address. */
173 static bfd_boolean pad_to_set = FALSE;
174 static bfd_vma pad_to;
175
176 /* Use alternative machine code? */
177 static unsigned long use_alt_mach_code = 0;
178
179 /* Output BFD flags user wants to set or clear */
180 static flagword bfd_flags_to_set;
181 static flagword bfd_flags_to_clear;
182
183 /* List of sections to add. */
184 struct section_add
185 {
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;
198 };
199
200 /* List of sections to add to the output BFD. */
201 static struct section_add *add_sections;
202
203 /* List of sections to update in the output BFD. */
204 static struct section_add *update_sections;
205
206 /* List of sections to dump from the output BFD. */
207 static struct section_add *dump_sections;
208
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;
212
213 /* Whether to convert debugging information. */
214 static bfd_boolean convert_debugging = FALSE;
215
216 /* Whether to compress/decompress DWARF debug sections. */
217 static enum
218 {
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;
226
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;
229
230 /* Whether to change the leading character in symbol names. */
231 static bfd_boolean change_leading_char = FALSE;
232
233 /* Whether to remove the leading character from global symbol names. */
234 static bfd_boolean remove_leading_char = FALSE;
235
236 /* Whether to permit wildcard in symbol comparison. */
237 static bfd_boolean wildcard = FALSE;
238
239 /* True if --localize-hidden is in effect. */
240 static bfd_boolean localize_hidden = FALSE;
241
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;
255
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;
263
264 /* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
265 static bfd_boolean weaken = FALSE;
266
267 /* If this is TRUE, we retain BSF_FILE symbols. */
268 static bfd_boolean keep_file_symbols = FALSE;
269
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;
274
275 /* True if --extract-symbol was passed on the command line. */
276 static bfd_boolean extract_symbol = FALSE;
277
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;
281
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
285 {
286 DISABLE,
287 ENABLE,
288 KEEP
289 };
290
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;
294
295 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
296 enum command_line_switch
297 {
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
364 };
365
366 /* Options to handle if running as "strip". */
367
368 static struct option strip_options[] =
369 {
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}
400 };
401
402 /* Options to handle if running as "objcopy". */
403
404 static struct option copy_options[] =
405 {
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}
505 };
506
507 /* IMPORTS */
508 extern char *program_name;
509
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;
514
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;
518
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;
523
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;
528
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 *);
540 \f
541 ATTRIBUTE_NORETURN static void
542 copy_usage (FILE *stream, int exit_status)
543 {
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);
676 }
677
678 ATTRIBUTE_NORETURN static void
679 strip_usage (FILE *stream, int exit_status)
680 {
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 "));
724
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);
729 }
730
731 /* Parse section flags into a flagword, with a fatal error if the
732 string can't be parsed. */
733
734 static flagword
735 parse_flags (const char *s)
736 {
737 flagword ret;
738 const char *snext;
739 int len;
740
741 ret = SEC_NO_FLAGS;
742
743 do
744 {
745 snext = strchr (s, ',');
746 if (snext == NULL)
747 len = strlen (s);
748 else
749 {
750 len = snext - s;
751 ++snext;
752 }
753
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
771 {
772 char *copy;
773
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");
780 }
781
782 s = snext;
783 }
784 while (s != NULL);
785
786 return ret;
787 }
788
789 /* Parse symbol flags into a flagword, with a fatal error if the
790 string can't be parsed. */
791
792 static flagword
793 parse_symflags (const char *s, char **other)
794 {
795 flagword ret;
796 const char *snext;
797 size_t len;
798
799 ret = BSF_NO_FLAGS;
800
801 do
802 {
803 snext = strchr (s, ',');
804 if (snext == NULL)
805 len = strlen (s);
806 else
807 {
808 len = snext - s;
809 ++snext;
810 }
811
812 #define PARSE_FLAG(fname, fval) \
813 else if (len == sizeof fname - 1 \
814 && strncasecmp (fname, s, len) == 0) \
815 ret |= fval
816
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)
821
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);
839
840 #undef PARSE_FLAG
841 #undef PARSE_OTHER
842 else
843 {
844 char *copy;
845
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>");
854 }
855
856 s = snext;
857 }
858 while (s != NULL);
859
860 return ret;
861 }
862
863 /* Find and optionally add an entry in the change_sections list.
864
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:
868
869 --set-section-flags .debug_*=debug
870 --set-section-flags .debug_str=readonly,debug
871 --change-section-address .debug_*ranges=0x1000
872
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).
877
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).
882
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.
886
887 Finally, if ADD is false and we do find a match, we mark the section list
888 entry as used. */
889
890 static struct section_list *
891 find_section_list (const char *name, bfd_boolean add, unsigned int context)
892 {
893 struct section_list *p, *match = NULL;
894
895 /* assert ((context & ((1 << 7) - 1)) != 0); */
896
897 for (p = change_sections; p != NULL; p = p->next)
898 {
899 if (add)
900 {
901 if (strcmp (p->pattern, name) == 0)
902 {
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);
909
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);
915
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);
921
922 /* Extend the context. */
923 p->context |= context;
924 return p;
925 }
926 }
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)
930 {
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] == '!')
935 {
936 if (fnmatch (p->pattern + 1, name, 0) == 0)
937 {
938 p->used = TRUE;
939 return NULL;
940 }
941 }
942 else
943 {
944 if (fnmatch (p->pattern, name, 0) == 0)
945 {
946 if (match == NULL)
947 match = p;
948 }
949 }
950 }
951 }
952
953 if (! add)
954 {
955 if (match != NULL)
956 match->used = TRUE;
957 return match;
958 }
959
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;
969
970 return p;
971 }
972
973 /* S1 is the entry node already in the table, S2 is the key node. */
974
975 static int
976 eq_string_redefnode (const void *s1, const void *s2)
977 {
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);
981 }
982
983 /* P is redefine node. Hash value is generated from its "source" filed. */
984
985 static hashval_t
986 htab_hash_redefnode (const void *p)
987 {
988 struct redefine_node *redefnode = (struct redefine_node *) p;
989 return htab_hash_string (redefnode->source);
990 }
991
992 /* Create hashtab used for redefine node. */
993
994 static htab_t
995 create_symbol2redef_htab (void)
996 {
997 return htab_create_alloc (16, htab_hash_redefnode, eq_string_redefnode, NULL,
998 xcalloc, free);
999 }
1000
1001 /* There is htab_hash_string but no htab_eq_string. Makes sense. */
1002
1003 static int
1004 eq_string (const void *s1, const void *s2)
1005 {
1006 return strcmp ((const char *) s1, (const char *) s2) == 0;
1007 }
1008
1009 static htab_t
1010 create_symbol_htab (void)
1011 {
1012 return htab_create_alloc (16, htab_hash_string, eq_string, NULL, xcalloc, free);
1013 }
1014
1015 static void
1016 create_symbol_htabs (void)
1017 {
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 ();
1029 }
1030
1031 /* Add a symbol to strip_specific_list. */
1032
1033 static void
1034 add_specific_symbol (const char *name, htab_t htab)
1035 {
1036 *htab_find_slot (htab, name, INSERT) = (char *) name;
1037 }
1038
1039 /* Like add_specific_symbol, but the element type is void *. */
1040
1041 static void
1042 add_specific_symbol_node (const void *node, htab_t htab)
1043 {
1044 *htab_find_slot (htab, node, INSERT) = (void *) node;
1045 }
1046
1047 /* Add symbols listed in `filename' to strip_specific_list. */
1048
1049 #define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
1050 #define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
1051
1052 static void
1053 add_specific_symbols (const char *filename, htab_t htab, char **buffer_p)
1054 {
1055 off_t size;
1056 FILE * f;
1057 char * line;
1058 char * buffer;
1059 unsigned int line_count;
1060
1061 size = get_file_size (filename);
1062 if (size == 0)
1063 {
1064 status = 1;
1065 return;
1066 }
1067
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));
1072
1073 if (fread (buffer, 1, size, f) == 0 || ferror (f))
1074 fatal (_("%s: fread failed"), filename);
1075
1076 fclose (f);
1077 buffer [size] = '\n';
1078 buffer [size + 1] = '\0';
1079
1080 line_count = 1;
1081
1082 for (line = buffer; * line != '\0'; line ++)
1083 {
1084 char * eol;
1085 char * name;
1086 char * name_end;
1087 int finished = FALSE;
1088
1089 for (eol = line;; eol ++)
1090 {
1091 switch (* eol)
1092 {
1093 case '\n':
1094 * eol = '\0';
1095 /* Cope with \n\r. */
1096 if (eol[1] == '\r')
1097 ++ eol;
1098 finished = TRUE;
1099 break;
1100
1101 case '\r':
1102 * eol = '\0';
1103 /* Cope with \r\n. */
1104 if (eol[1] == '\n')
1105 ++ eol;
1106 finished = TRUE;
1107 break;
1108
1109 case 0:
1110 finished = TRUE;
1111 break;
1112
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;
1119
1120 default:
1121 break;
1122 }
1123
1124 if (finished)
1125 break;
1126 }
1127
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 ++)
1132 ;
1133 for (name_end = name;
1134 (! IS_WHITESPACE (* name_end))
1135 && (! IS_LINE_TERMINATOR (* name_end));
1136 name_end ++)
1137 ;
1138
1139 if (! IS_LINE_TERMINATOR (* name_end))
1140 {
1141 char * extra;
1142
1143 for (extra = name_end + 1; IS_WHITESPACE (* extra); extra ++)
1144 ;
1145
1146 if (! IS_LINE_TERMINATOR (* extra))
1147 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
1148 filename, line_count);
1149 }
1150
1151 * name_end = '\0';
1152
1153 if (name_end > name)
1154 add_specific_symbol (name, htab);
1155
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 ++;
1160 }
1161
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;
1165 }
1166
1167 /* See whether a symbol should be stripped or kept
1168 based on strip_specific_list and keep_symbols. */
1169
1170 static int
1171 is_specified_symbol_predicate (void **slot, void *data)
1172 {
1173 struct is_specified_symbol_predicate_data *d =
1174 (struct is_specified_symbol_predicate_data *) data;
1175 const char *slot_name = (char *) *slot;
1176
1177 if (*slot_name != '!')
1178 {
1179 if (! fnmatch (slot_name, d->name, 0))
1180 {
1181 d->found = TRUE;
1182 /* Continue traversal, there might be a non-match rule. */
1183 return 1;
1184 }
1185 }
1186 else
1187 {
1188 if (! fnmatch (slot_name + 1, d->name, 0))
1189 {
1190 d->found = FALSE;
1191 /* Stop traversal. */
1192 return 0;
1193 }
1194 }
1195
1196 /* Continue traversal. */
1197 return 1;
1198 }
1199
1200 static bfd_boolean
1201 is_specified_symbol (const char *name, htab_t htab)
1202 {
1203 if (wildcard)
1204 {
1205 struct is_specified_symbol_predicate_data data;
1206
1207 data.name = name;
1208 data.found = FALSE;
1209
1210 htab_traverse (htab, is_specified_symbol_predicate, &data);
1211
1212 return data.found;
1213 }
1214
1215 return htab_find (htab, name) != NULL;
1216 }
1217
1218 /* Return a pointer to the symbol used as a signature for GROUP. */
1219
1220 static asymbol *
1221 group_signature (asection *group)
1222 {
1223 bfd *abfd = group->owner;
1224 Elf_Internal_Shdr *ghdr;
1225
1226 /* PR 20089: An earlier error may have prevented us from loading the symbol table. */
1227 if (isympp == NULL)
1228 return NULL;
1229
1230 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
1231 return NULL;
1232
1233 ghdr = &elf_section_data (group)->this_hdr;
1234 if (ghdr->sh_link == elf_onesymtab (abfd))
1235 {
1236 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1237 Elf_Internal_Shdr *symhdr = &elf_symtab_hdr (abfd);
1238
1239 if (ghdr->sh_info > 0
1240 && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym)
1241 return isympp[ghdr->sh_info - 1];
1242 }
1243 return NULL;
1244 }
1245
1246 /* Return TRUE if the section is a DWO section. */
1247
1248 static bfd_boolean
1249 is_dwo_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1250 {
1251 const char *name = bfd_get_section_name (abfd, sec);
1252 int len = strlen (name);
1253
1254 return strncmp (name + len - 4, ".dwo", 4) == 0;
1255 }
1256
1257 /* Return TRUE if section SEC is in the update list. */
1258
1259 static bfd_boolean
1260 is_update_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1261 {
1262 if (update_sections != NULL)
1263 {
1264 struct section_add *pupdate;
1265
1266 for (pupdate = update_sections;
1267 pupdate != NULL;
1268 pupdate = pupdate->next)
1269 {
1270 if (strcmp (sec->name, pupdate->name) == 0)
1271 return TRUE;
1272 }
1273 }
1274
1275 return FALSE;
1276 }
1277
1278 static bfd_boolean
1279 is_merged_note_section (bfd * abfd, asection * sec)
1280 {
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;
1292
1293 return FALSE;
1294 }
1295
1296 /* See if a non-group section is being removed. */
1297
1298 static bfd_boolean
1299 is_strip_section_1 (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1300 {
1301 if (sections_removed || sections_copied)
1302 {
1303 struct section_list *p;
1304 struct section_list *q;
1305
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);
1310
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));
1317
1318 if (p != NULL)
1319 return TRUE;
1320 if (sections_copied && q == NULL)
1321 return TRUE;
1322 }
1323
1324 if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
1325 {
1326 if (strip_symbols == STRIP_DEBUG
1327 || strip_symbols == STRIP_UNNEEDED
1328 || strip_symbols == STRIP_ALL
1329 || discard_locals == LOCALS_ALL
1330 || convert_debugging)
1331 {
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;
1337 }
1338
1339 if (strip_symbols == STRIP_DWO)
1340 return is_dwo_section (abfd, sec);
1341
1342 if (strip_symbols == STRIP_NONDEBUG)
1343 return FALSE;
1344 }
1345
1346 if (strip_symbols == STRIP_NONDWO)
1347 return !is_dwo_section (abfd, sec);
1348
1349 return FALSE;
1350 }
1351
1352 /* See if a section is being removed. */
1353
1354 static bfd_boolean
1355 is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1356 {
1357 if (is_strip_section_1 (abfd, sec))
1358 return TRUE;
1359
1360 if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0)
1361 {
1362 asymbol *gsym;
1363 const char *gname;
1364 asection *elt, *first;
1365
1366 gsym = group_signature (sec);
1367 /* Strip groups without a valid signature. */
1368 if (gsym == NULL)
1369 return TRUE;
1370
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;
1379
1380 /* Remove the group section if all members are removed. */
1381 first = elt = elf_next_in_group (sec);
1382 while (elt != NULL)
1383 {
1384 if (!is_strip_section_1 (abfd, elt))
1385 return FALSE;
1386 elt = elf_next_in_group (elt);
1387 if (elt == first)
1388 break;
1389 }
1390
1391 return TRUE;
1392 }
1393
1394 return FALSE;
1395 }
1396
1397 static bfd_boolean
1398 is_nondebug_keep_contents_section (bfd *ibfd, asection *isection)
1399 {
1400 /* Always keep ELF note sections. */
1401 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
1402 return (elf_section_type (isection) == SHT_NOTE);
1403
1404 /* Always keep the .buildid section for PE/COFF.
1405
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);
1411
1412 return FALSE;
1413 }
1414
1415 /* Return true if SYM is a hidden symbol. */
1416
1417 static bfd_boolean
1418 is_hidden_symbol (asymbol *sym)
1419 {
1420 elf_symbol_type *elf_sym;
1421
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))
1425 {
1426 case STV_HIDDEN:
1427 case STV_INTERNAL:
1428 return TRUE;
1429 }
1430 return FALSE;
1431 }
1432
1433 static bfd_boolean
1434 need_sym_before (struct addsym_node **node, const char *sym)
1435 {
1436 int count;
1437 struct addsym_node *ptr = add_sym_list;
1438
1439 /* 'othersym' symbols are at the front of the list. */
1440 for (count = 0; count < add_symbols; count++)
1441 {
1442 if (!ptr->othersym)
1443 break;
1444 else if (strcmp (ptr->othersym, sym) == 0)
1445 {
1446 free (ptr->othersym);
1447 ptr->othersym = ""; /* Empty name is hopefully never a valid symbol name. */
1448 *node = ptr;
1449 return TRUE;
1450 }
1451 ptr = ptr->next;
1452 }
1453 return FALSE;
1454 }
1455
1456 static asymbol *
1457 create_new_symbol (struct addsym_node *ptr, bfd *obfd)
1458 {
1459 asymbol *sym = bfd_make_empty_symbol (obfd);
1460
1461 bfd_asymbol_name (sym) = ptr->symdef;
1462 sym->value = ptr->symval;
1463 sym->flags = ptr->flags;
1464 if (ptr->section)
1465 {
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;
1470 }
1471 else
1472 sym->section = bfd_abs_section_ptr;
1473 return sym;
1474 }
1475
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. */
1479
1480 static unsigned int
1481 filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
1482 asymbol **isyms, long symcount)
1483 {
1484 asymbol **from = isyms, **to = osyms;
1485 long src_count = 0, dst_count = 0;
1486 int relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
1487
1488 for (; src_count < symcount; src_count++)
1489 {
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;
1498
1499 undefined = bfd_is_und_section (bfd_get_section (sym));
1500
1501 if (add_sym_list)
1502 {
1503 struct addsym_node *ptr;
1504
1505 if (need_sym_before (&ptr, name))
1506 to[dst_count++] = create_new_symbol (ptr, obfd);
1507 }
1508
1509 if (htab_elements (redefine_specific_htab) || section_rename_list)
1510 {
1511 char *new_name;
1512
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;
1519 }
1520
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)))));
1529
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)));
1536
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)
1539 {
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;
1544 }
1545
1546 /* Remove leading char. */
1547 if (rem_leading_char)
1548 bfd_asymbol_name (sym) = ++name;
1549
1550 /* Add new leading char and/or prefix. */
1551 if (add_leading_char || prefix_symbols_string)
1552 {
1553 char *n, *ptr;
1554
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);
1559
1560 if (prefix_symbols_string)
1561 {
1562 strcpy (ptr, prefix_symbols_string);
1563 ptr += strlen (prefix_symbols_string);
1564 }
1565
1566 strcpy (ptr, name);
1567 bfd_asymbol_name (sym) = n;
1568 name = n;
1569 }
1570
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))
1577 {
1578 keep = TRUE;
1579 used_in_reloc = TRUE;
1580 }
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))));
1609
1610 if (keep && is_specified_symbol (name, strip_specific_htab))
1611 {
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)
1615 {
1616 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name);
1617 status = 1;
1618 }
1619 else
1620 keep = FALSE;
1621 }
1622
1623 if (keep
1624 && !(flags & BSF_KEEP)
1625 && is_specified_symbol (name, strip_unneeded_htab))
1626 keep = FALSE;
1627
1628 if (!keep
1629 && ((keep_file_symbols && (flags & BSF_FILE))
1630 || is_specified_symbol (name, keep_specific_htab)))
1631 keep = TRUE;
1632
1633 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
1634 keep = FALSE;
1635
1636 if (keep)
1637 {
1638 if ((flags & BSF_GLOBAL) != 0
1639 && (weaken || is_specified_symbol (name, weaken_specific_htab)))
1640 {
1641 sym->flags &= ~ BSF_GLOBAL;
1642 sym->flags |= BSF_WEAK;
1643 }
1644
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))))
1651 {
1652 sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
1653 sym->flags |= BSF_LOCAL;
1654 }
1655
1656 if (!undefined
1657 && (flags & BSF_LOCAL)
1658 && is_specified_symbol (name, globalize_specific_htab))
1659 {
1660 sym->flags &= ~ BSF_LOCAL;
1661 sym->flags |= BSF_GLOBAL;
1662 }
1663
1664 to[dst_count++] = sym;
1665 }
1666 }
1667 if (add_sym_list)
1668 {
1669 struct addsym_node *ptr = add_sym_list;
1670
1671 for (src_count = 0; src_count < add_symbols; src_count++)
1672 {
1673 if (ptr->othersym)
1674 {
1675 if (strcmp (ptr->othersym, ""))
1676 fatal (_("'before=%s' not found"), ptr->othersym);
1677 }
1678 else
1679 to[dst_count++] = create_new_symbol (ptr, obfd);
1680
1681 ptr = ptr->next;
1682 }
1683 }
1684
1685 to[dst_count] = NULL;
1686
1687 return dst_count;
1688 }
1689
1690 /* Find the redefined name of symbol SOURCE. */
1691
1692 static const char *
1693 lookup_sym_redefinition (const char *source)
1694 {
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);
1698
1699 return redef_node == NULL ? source : redef_node->target;
1700 }
1701
1702 /* Insert a node into symbol redefine hash tabel. */
1703
1704 static void
1705 add_redefine_and_check (const char *cause, const char *source,
1706 const char *target)
1707 {
1708 struct redefine_node *new_node
1709 = (struct redefine_node *) xmalloc (sizeof (struct redefine_node));
1710
1711 new_node->source = strdup (source);
1712 new_node->target = strdup (target);
1713
1714 if (htab_find (redefine_specific_htab, new_node) != HTAB_EMPTY_ENTRY)
1715 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
1716 cause, source);
1717
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);
1721
1722 /* Insert the NEW_NODE into hash table for quick search. */
1723 add_specific_symbol_node (new_node, redefine_specific_htab);
1724
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);
1728
1729 }
1730
1731 /* Handle the --redefine-syms option. Read lines containing "old new"
1732 from the file, and add them to the symbol redefine list. */
1733
1734 static void
1735 add_redefine_syms_file (const char *filename)
1736 {
1737 FILE *file;
1738 char *buf;
1739 size_t bufsize;
1740 size_t len;
1741 size_t outsym_off;
1742 int c, lineno;
1743
1744 file = fopen (filename, "r");
1745 if (file == NULL)
1746 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1747 filename, strerror (errno));
1748
1749 bufsize = 100;
1750 buf = (char *) xmalloc (bufsize + 1 /* For the terminating NUL. */);
1751
1752 lineno = 1;
1753 c = getc (file);
1754 len = 0;
1755 outsym_off = 0;
1756 while (c != EOF)
1757 {
1758 /* Collect the input symbol name. */
1759 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1760 {
1761 if (c == '#')
1762 goto comment;
1763 buf[len++] = c;
1764 if (len >= bufsize)
1765 {
1766 bufsize *= 2;
1767 buf = (char *) xrealloc (buf, bufsize + 1);
1768 }
1769 c = getc (file);
1770 }
1771 buf[len++] = '\0';
1772 if (c == EOF)
1773 break;
1774
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;
1782
1783 /* Collect the output symbol name. */
1784 outsym_off = len;
1785 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1786 {
1787 if (c == '#')
1788 goto comment;
1789 buf[len++] = c;
1790 if (len >= bufsize)
1791 {
1792 bufsize *= 2;
1793 buf = (char *) xrealloc (buf, bufsize + 1);
1794 }
1795 c = getc (file);
1796 }
1797 buf[len++] = '\0';
1798 if (c == EOF)
1799 break;
1800
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)
1809 {
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]);
1814
1815 lineno++;
1816 len = 0;
1817 outsym_off = 0;
1818 if (c == EOF)
1819 break;
1820 c = getc (file);
1821 continue;
1822 }
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';
1829
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;
1834 }
1835
1836 if (len != 0)
1837 fatal (_("%s:%d: premature end of file"), filename, lineno);
1838
1839 free (buf);
1840 fclose (file);
1841 }
1842
1843 /* Copy unknown object file IBFD onto OBFD.
1844 Returns TRUE upon success, FALSE otherwise. */
1845
1846 static bfd_boolean
1847 copy_unknown_object (bfd *ibfd, bfd *obfd)
1848 {
1849 char *cbuf;
1850 int tocopy;
1851 long ncopied;
1852 long size;
1853 struct stat buf;
1854
1855 if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1856 {
1857 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1858 return FALSE;
1859 }
1860
1861 size = buf.st_size;
1862 if (size < 0)
1863 {
1864 non_fatal (_("stat returns negative size for `%s'"),
1865 bfd_get_archive_filename (ibfd));
1866 return FALSE;
1867 }
1868
1869 if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1870 {
1871 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1872 return FALSE;
1873 }
1874
1875 if (verbose)
1876 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1877 bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1878
1879 cbuf = (char *) xmalloc (BUFSIZE);
1880 ncopied = 0;
1881 while (ncopied < size)
1882 {
1883 tocopy = size - ncopied;
1884 if (tocopy > BUFSIZE)
1885 tocopy = BUFSIZE;
1886
1887 if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1888 != (bfd_size_type) tocopy)
1889 {
1890 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
1891 free (cbuf);
1892 return FALSE;
1893 }
1894
1895 if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1896 != (bfd_size_type) tocopy)
1897 {
1898 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1899 free (cbuf);
1900 return FALSE;
1901 }
1902
1903 ncopied += tocopy;
1904 }
1905
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;
1911 }
1912
1913 /* Returns the number of bytes needed to store VAL. */
1914
1915 static inline unsigned int
1916 num_bytes (unsigned long val)
1917 {
1918 unsigned int count = 0;
1919
1920 /* FIXME: There must be a faster way to do this. */
1921 while (val)
1922 {
1923 count ++;
1924 val >>= 8;
1925 }
1926 return count;
1927 }
1928
1929 typedef struct objcopy_internal_note
1930 {
1931 Elf_Internal_Note note;
1932 bfd_vma start;
1933 bfd_vma end;
1934 bfd_boolean modified;
1935 } objcopy_internal_note;
1936
1937 /* Returns TRUE if a gap does, or could, exist between the address range
1938 covered by PNOTE1 and PNOTE2. */
1939
1940 static bfd_boolean
1941 gap_exists (objcopy_internal_note * pnote1,
1942 objcopy_internal_note * pnote2)
1943 {
1944 /* Without range end notes, we assume that a gap might exist. */
1945 if (pnote1->end == 0 || pnote2->end == 0)
1946 return TRUE;
1947
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;
1951 }
1952
1953 static bfd_boolean
1954 is_open_note (objcopy_internal_note * pnote)
1955 {
1956 return (pnote->note.type == NT_GNU_BUILD_ATTRIBUTE_OPEN);
1957 }
1958
1959 static bfd_boolean
1960 is_func_note (objcopy_internal_note * pnote)
1961 {
1962 return (pnote->note.type == NT_GNU_BUILD_ATTRIBUTE_FUNC);
1963 }
1964
1965 static bfd_boolean
1966 is_64bit (bfd * abfd)
1967 {
1968 /* Should never happen, but let's be paranoid. */
1969 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
1970 return FALSE;
1971
1972 return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64;
1973 }
1974
1975 /* Merge the notes on SEC, removing redundant entries.
1976 Returns the new, smaller size of the section upon success. */
1977
1978 static bfd_size_type
1979 merge_gnu_build_notes (bfd * abfd, asection * sec, bfd_size_type size, bfd_byte * contents)
1980 {
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;
1998
1999
2000 relsize = bfd_get_reloc_upper_bound (abfd, sec);
2001 if (relsize > 0)
2002 {
2003 arelent ** relpp;
2004 long relcount;
2005
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;
2013 }
2014
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)
2019 {
2020 bfd_vma start, end;
2021
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);
2025
2026 if (pnote->note.type != NT_GNU_BUILD_ATTRIBUTE_OPEN
2027 && pnote->note.type != NT_GNU_BUILD_ATTRIBUTE_FUNC)
2028 {
2029 err = _("corrupt GNU build attribute note: wrong note type");
2030 goto done;
2031 }
2032
2033 if (pnote->note.namesz + pnote->note.descsz + 12 > remain)
2034 {
2035 err = _("corrupt GNU build attribute note: note too big");
2036 goto done;
2037 }
2038
2039 if (pnote->note.namesz < 2)
2040 {
2041 err = _("corrupt GNU build attribute note: name too small");
2042 goto done;
2043 }
2044
2045 pnote->note.namedata = (char *)(in + 12);
2046 pnote->note.descdata = (char *)(in + 12 + pnote->note.namesz);
2047
2048 remain -= 12 + pnote->note.namesz + pnote->note.descsz;
2049 in += 12 + pnote->note.namesz + pnote->note.descsz;
2050
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)
2061 {
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
2067 {
2068 err = _("corrupt GNU build attribute note: unsupported version");
2069 goto done;
2070 }
2071 }
2072
2073 switch (pnote->note.descsz)
2074 {
2075 case 0:
2076 start = end = 0;
2077 break;
2078
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.
2084
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;
2090
2091 case 8:
2092 if (! is_64bit (abfd))
2093 {
2094 start = bfd_get_32 (abfd, pnote->note.descdata);
2095 end = bfd_get_32 (abfd, pnote->note.descdata + 4);
2096 }
2097 else
2098 {
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.
2103
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;
2108 }
2109 break;
2110
2111 case 16:
2112 start = bfd_get_64 (abfd, pnote->note.descdata);
2113 end = bfd_get_64 (abfd, pnote->note.descdata + 8);
2114 break;
2115
2116 default:
2117 err = _("corrupt GNU build attribute note: bad description size");
2118 goto done;
2119 }
2120
2121 if (is_open_note (pnote))
2122 {
2123 if (start)
2124 previous_open_start = start;
2125
2126 pnote->start = previous_open_start;
2127
2128 if (end)
2129 previous_open_end = end;
2130
2131 pnote->end = previous_open_end;
2132 }
2133 else
2134 {
2135 if (start)
2136 previous_func_start = start;
2137
2138 pnote->start = previous_func_start;
2139
2140 if (end)
2141 previous_func_end = end;
2142
2143 pnote->end = previous_func_end;
2144 }
2145
2146 if (pnote->note.namedata[pnote->note.namesz - 1] != 0)
2147 {
2148 err = _("corrupt GNU build attribute note: name not NUL terminated");
2149 goto done;
2150 }
2151
2152 pnote ++;
2153 }
2154
2155 pnotes_end = pnote;
2156
2157 /* Check that the notes are valid. */
2158 if (remain != 0)
2159 {
2160 err = _("corrupt GNU build attribute notes: excess data at end");
2161 goto done;
2162 }
2163
2164 if (version_1_seen == 0 && version_2_seen == 0 && version_3_seen == 0)
2165 {
2166 err = _("bad GNU build attribute notes: no known versions detected");
2167 goto done;
2168 }
2169
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))
2173 {
2174 err = _("bad GNU build attribute notes: multiple different versions");
2175 goto done;
2176 }
2177
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;
2181
2182 attribute_type_byte = version_1_seen ? 1 : 3;
2183 val_start = attribute_type_byte + 1;
2184
2185 /* The first note should be the first version note. */
2186 if (pnotes[0].note.namedata[attribute_type_byte] != GNU_BUILD_ATTRIBUTE_VERSION)
2187 {
2188 err = _("bad GNU build attribute notes: first note not version note");
2189 goto done;
2190 }
2191
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 ++)
2209 {
2210 int note_type;
2211 objcopy_internal_note * back;
2212 objcopy_internal_note * prev_open_with_range = NULL;
2213
2214 /* Rule 6 - delete 0-range notes. */
2215 if (pnote->start == pnote->end)
2216 {
2217 duplicate_found = TRUE;
2218 pnote->note.type = 0;
2219 continue;
2220 }
2221
2222 /* Rule 2 - preserve function notes. */
2223 if (! is_open_note (pnote))
2224 {
2225 int iter;
2226
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 --)
2230 {
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)
2235 {
2236 fprintf (stderr, "DUP FUNXC\n");
2237 duplicate_found = TRUE;
2238 pnote->note.type = 0;
2239 break;
2240 }
2241
2242 /* Don't scan too far back however. */
2243 if (iter ++ > 16)
2244 break;
2245 }
2246 continue;
2247 }
2248
2249 note_type = pnote->note.namedata[attribute_type_byte];
2250
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 --)
2254 {
2255 int back_type = back->note.namedata[attribute_type_byte];
2256
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;
2263
2264 if (! is_open_note (back))
2265 continue;
2266
2267 /* If the two notes are different then keep on searching. */
2268 if (back_type != note_type)
2269 continue;
2270
2271 /* Rule 4 - combine stack size notes. */
2272 if (back_type == GNU_BUILD_ATTRIBUTE_STACK_SIZE)
2273 {
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;
2280
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--;)
2285 {
2286 byte = (* name ++) & 0xff;
2287 note_val |= byte << shift;
2288 shift += 8;
2289 }
2290
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--;)
2295 {
2296 byte = (* name ++) & 0xff;
2297 back_val |= byte << shift;
2298 shift += 8;
2299 }
2300
2301 back_val += note_val;
2302 if (num_bytes (back_val) >= back->note.namesz - val_start)
2303 {
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;
2309 }
2310
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)
2315 {
2316 byte = back_val & 0xff;
2317 * name ++ = byte;
2318 if (back_val == 0)
2319 break;
2320 back_val >>= 8;
2321 }
2322
2323 duplicate_found = TRUE;
2324 pnote->note.type = 0;
2325 break;
2326 }
2327
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))
2333 {
2334 duplicate_found = TRUE;
2335 pnote->note.type = 0;
2336
2337 if (pnote->end > back->end)
2338 back->end = pnote->end;
2339
2340 if (version_3_seen)
2341 back->modified = TRUE;
2342 break;
2343 }
2344
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)
2350 {
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;
2357 }
2358 else
2359 {
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;
2364 }
2365
2366 /* We have found a similar attribute but the details do not match.
2367 Stop searching backwards. */
2368 break;
2369 }
2370 }
2371
2372 if (duplicate_found)
2373 {
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;
2380
2381 /* Eliminate the duplicates. */
2382 new = new_contents = xmalloc (size);
2383 for (pnote = pnotes, old = contents;
2384 pnote < pnotes_end;
2385 pnote ++)
2386 {
2387 bfd_size_type note_size = 12 + pnote->note.namesz + pnote->note.descsz;
2388
2389 if (pnote->note.type != 0)
2390 {
2391 if (pnote->modified)
2392 {
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)
2396 {
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;
2403 }
2404 else
2405 {
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))
2413 {
2414 bfd_put_64 (abfd, pnote->start, new);
2415 bfd_put_64 (abfd, pnote->end, new + 8);
2416 new += 16;
2417 }
2418 else
2419 {
2420 bfd_put_32 (abfd, pnote->start, new);
2421 bfd_put_32 (abfd, pnote->end, new + 4);
2422 new += 8;
2423 }
2424 }
2425 }
2426 else
2427 {
2428 memcpy (new, old, note_size);
2429 new += note_size;
2430 }
2431 prev_start = pnote->start;
2432 prev_end = pnote->end;
2433 }
2434
2435 old += note_size;
2436 }
2437
2438 new_size = new - new_contents;
2439 memcpy (contents, new_contents, new_size);
2440 size = new_size;
2441 free (new_contents);
2442 }
2443
2444 done:
2445 if (err)
2446 {
2447 bfd_set_error (bfd_error_bad_value);
2448 bfd_nonfatal_message (NULL, abfd, sec, err);
2449 status = 1;
2450 }
2451
2452 free (pnotes);
2453 return size;
2454 }
2455
2456 /* Copy object file IBFD onto OBFD.
2457 Returns TRUE upon success, FALSE otherwise. */
2458
2459 static bfd_boolean
2460 copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
2461 {
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;
2474
2475 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
2476 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
2477 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2478 {
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;
2483 }
2484
2485 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2486 {
2487 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
2488 return FALSE;
2489 }
2490
2491 if (ibfd->sections == NULL)
2492 {
2493 non_fatal (_("error: the input file '%s' has no sections"),
2494 bfd_get_archive_filename (ibfd));
2495 return FALSE;
2496 }
2497
2498 if (ibfd->xvec->flavour != bfd_target_elf_flavour)
2499 {
2500 if ((do_debug_sections & compress) != 0
2501 && do_debug_sections != compress)
2502 {
2503 non_fatal (_("--compress-debug-sections=[zlib|zlib-gnu|zlib-gabi] is unsupported on `%s'"),
2504 bfd_get_archive_filename (ibfd));
2505 return FALSE;
2506 }
2507
2508 if (do_elf_stt_common)
2509 {
2510 non_fatal (_("--elf-stt-common=[yes|no] is unsupported on `%s'"),
2511 bfd_get_archive_filename (ibfd));
2512 return FALSE;
2513 }
2514 }
2515
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));
2520
2521 if (extract_symbol)
2522 start = 0;
2523 else
2524 {
2525 if (set_start_set)
2526 start = set_start;
2527 else
2528 start = bfd_get_start_address (ibfd);
2529 start += change_start;
2530 }
2531
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)
2535 {
2536 flagword flags;
2537
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);
2542
2543 if (strip_symbols == STRIP_ALL)
2544 flags &= ~HAS_RELOC;
2545
2546 if (!bfd_set_start_address (obfd, start)
2547 || !bfd_set_file_flags (obfd, flags))
2548 {
2549 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2550 return FALSE;
2551 }
2552 }
2553
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)
2558 {
2559 if (bfd_get_arch_info (ibfd) == NULL
2560 || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown)
2561 {
2562 iarch = input_arch->arch;
2563 imach = input_arch->mach;
2564 }
2565 else
2566 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
2567 bfd_get_archive_filename (ibfd));
2568 }
2569 if (!bfd_set_arch_mach (obfd, iarch, imach)
2570 && (ibfd->target_defaulted
2571 || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
2572 {
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;
2581 }
2582
2583 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2584 {
2585 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2586 return FALSE;
2587 }
2588
2589 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2590 && bfd_pei_p (obfd))
2591 {
2592 /* Set up PE parameters. */
2593 pe_data_type *pe = pe_data (obfd);
2594
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;
2599
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;
2604
2605 if (pe_heap_commit != (bfd_vma) -1)
2606 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_commit;
2607
2608 if (pe_heap_reserve != (bfd_vma) -1)
2609 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_reserve;
2610
2611 if (pe_image_base != (bfd_vma) -1)
2612 pe->pe_opthdr.ImageBase = pe_image_base;
2613
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;
2618
2619 if (pe_stack_commit != (bfd_vma) -1)
2620 pe->pe_opthdr.SizeOfStackCommit = pe_stack_commit;
2621
2622 if (pe_stack_reserve != (bfd_vma) -1)
2623 pe->pe_opthdr.SizeOfStackCommit = pe_stack_reserve;
2624
2625 if (pe_subsystem != -1)
2626 pe->pe_opthdr.Subsystem = pe_subsystem;
2627
2628 if (pe_major_subsystem_version != -1)
2629 pe->pe_opthdr.MajorSubsystemVersion = pe_major_subsystem_version;
2630
2631 if (pe_minor_subsystem_version != -1)
2632 pe->pe_opthdr.MinorSubsystemVersion = pe_minor_subsystem_version;
2633
2634 if (pe_file_alignment > pe_section_alignment)
2635 {
2636 char file_alignment[20], section_alignment[20];
2637
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)"),
2641
2642 file_alignment, section_alignment);
2643 }
2644 }
2645
2646 if (isympp)
2647 free (isympp);
2648
2649 if (osympp != isympp)
2650 free (osympp);
2651
2652 isympp = NULL;
2653 osympp = NULL;
2654
2655 symsize = bfd_get_symtab_upper_bound (ibfd);
2656 if (symsize < 0)
2657 {
2658 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2659 return FALSE;
2660 }
2661
2662 osympp = isympp = (asymbol **) xmalloc (symsize);
2663 symcount = bfd_canonicalize_symtab (ibfd, isympp);
2664 if (symcount < 0)
2665 {
2666 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2667 return FALSE;
2668 }
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)
2673 {
2674 free (isympp);
2675 osympp = isympp = NULL;
2676 }
2677
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);
2681
2682 if (!extract_symbol)
2683 setup_bfd_headers (ibfd, obfd);
2684
2685 if (add_sections != NULL)
2686 {
2687 struct section_add *padd;
2688 struct section_list *pset;
2689
2690 for (padd = add_sections; padd != NULL; padd = padd->next)
2691 {
2692 flagword flags;
2693
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;
2700
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))
2704 {
2705 bfd_nonfatal_message (NULL, obfd, NULL,
2706 _("can't add section '%s'"), padd->name);
2707 return FALSE;
2708 }
2709 else
2710 {
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)
2718 {
2719 bfd_nonfatal_message (NULL, obfd, NULL,
2720 _("can't create section `%s'"),
2721 padd->name);
2722 return FALSE;
2723 }
2724 }
2725
2726 if (! bfd_set_section_size (obfd, padd->section, padd->size))
2727 {
2728 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2729 return FALSE;
2730 }
2731
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))
2736 {
2737 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2738 return FALSE;
2739 }
2740
2741 pset = find_section_list (padd->name, FALSE,
2742 SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_ALTER_LMA);
2743 if (pset != NULL)
2744 {
2745 padd->section->lma = pset->lma_val;
2746
2747 if (! bfd_set_section_alignment
2748 (obfd, padd->section,
2749 bfd_section_alignment (obfd, padd->section)))
2750 {
2751 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2752 return FALSE;
2753 }
2754 }
2755 }
2756 }
2757
2758 if (update_sections != NULL)
2759 {
2760 struct section_add *pupdate;
2761
2762 for (pupdate = update_sections;
2763 pupdate != NULL;
2764 pupdate = pupdate->next)
2765 {
2766 pupdate->section = bfd_get_section_by_name (ibfd, pupdate->name);
2767 if (pupdate->section == NULL)
2768 {
2769 non_fatal (_("error: %s not found, can't be updated"), pupdate->name);
2770 return FALSE;
2771 }
2772
2773 osec = pupdate->section->output_section;
2774 if (! bfd_set_section_size (obfd, osec, pupdate->size))
2775 {
2776 bfd_nonfatal_message (NULL, obfd, osec, NULL);
2777 return FALSE;
2778 }
2779 }
2780 }
2781
2782 if (merge_notes)
2783 {
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))
2788 {
2789 bfd_size_type size;
2790
2791 size = bfd_get_section_size (osec);
2792 if (size == 0)
2793 {
2794 bfd_nonfatal_message (NULL, ibfd, osec, _("warning: note section is empty"));
2795 merge_notes = FALSE;
2796 }
2797 else if (! bfd_get_full_section_contents (ibfd, osec, & merged_notes))
2798 {
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;
2803 }
2804 else
2805 {
2806 merged_size = merge_gnu_build_notes (ibfd, osec, size, merged_notes);
2807 if (merged_size == size)
2808 {
2809 /* Merging achieves nothing. */
2810 free (merged_notes);
2811 merged_notes = NULL;
2812 merge_notes = FALSE;
2813 merged_size = 0;
2814 }
2815 else
2816 {
2817 if (osec->output_section == NULL
2818 || ! bfd_set_section_size (obfd, osec->output_section, merged_size))
2819 {
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;
2825 }
2826 }
2827 }
2828 }
2829 }
2830
2831 if (dump_sections != NULL)
2832 {
2833 struct section_add * pdump;
2834
2835 for (pdump = dump_sections; pdump != NULL; pdump = pdump->next)
2836 {
2837 osec = bfd_get_section_by_name (ibfd, pdump->name);
2838 if (osec == NULL)
2839 {
2840 bfd_nonfatal_message (NULL, ibfd, NULL,
2841 _("can't dump section '%s' - it does not exist"),
2842 pdump->name);
2843 continue;
2844 }
2845
2846 if ((bfd_get_section_flags (ibfd, osec) & SEC_HAS_CONTENTS) == 0)
2847 {
2848 bfd_nonfatal_message (NULL, ibfd, osec,
2849 _("can't dump section - it has no contents"));
2850 continue;
2851 }
2852
2853 bfd_size_type size = bfd_get_section_size (osec);
2854 if (size == 0)
2855 {
2856 bfd_nonfatal_message (NULL, ibfd, osec,
2857 _("can't dump section - it is empty"));
2858 continue;
2859 }
2860
2861 FILE * f;
2862 f = fopen (pdump->filename, FOPEN_WB);
2863 if (f == NULL)
2864 {
2865 bfd_nonfatal_message (pdump->filename, NULL, NULL,
2866 _("could not open section dump file"));
2867 continue;
2868 }
2869
2870 bfd_byte *contents;
2871 if (bfd_malloc_and_get_section (ibfd, osec, &contents))
2872 {
2873 if (fwrite (contents, 1, size, f) != size)
2874 {
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;
2881 }
2882 }
2883 else
2884 bfd_nonfatal_message (NULL, ibfd, osec,
2885 _("could not retrieve section contents"));
2886
2887 fclose (f);
2888 free (contents);
2889 }
2890 }
2891
2892 if (gnu_debuglink_filename != NULL)
2893 {
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"))
2898 {
2899 non_fatal (_("%s: debuglink section already exists"),
2900 bfd_get_filename (obfd));
2901 gnu_debuglink_filename = NULL;
2902 }
2903 else
2904 {
2905 gnu_debuglink_section = bfd_create_gnu_debuglink_section
2906 (obfd, gnu_debuglink_filename);
2907
2908 if (gnu_debuglink_section == NULL)
2909 {
2910 bfd_nonfatal_message (NULL, obfd, NULL,
2911 _("cannot create debug link section `%s'"),
2912 gnu_debuglink_filename);
2913 return FALSE;
2914 }
2915
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)
2919 {
2920 bfd_vma debuglink_vma;
2921 asection * highest_section;
2922
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.
2928
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;
2940
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;
2954
2955 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
2956 }
2957 }
2958 }
2959
2960 c = bfd_count_sections (obfd);
2961 if (c != 0
2962 && (gap_fill_set || pad_to_set))
2963 {
2964 asection **set;
2965
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. */
2971
2972 osections = (asection **) xmalloc (c * sizeof (asection *));
2973 set = osections;
2974 bfd_map_over_sections (obfd, get_sections, &set);
2975
2976 qsort (osections, c, sizeof (asection *), compare_section_lma);
2977
2978 gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type));
2979 memset (gaps, 0, c * sizeof (bfd_size_type));
2980
2981 if (gap_fill_set)
2982 {
2983 for (i = 0; i < c - 1; i++)
2984 {
2985 flagword flags;
2986 bfd_size_type size;
2987 bfd_vma gap_start, gap_stop;
2988
2989 flags = bfd_get_section_flags (obfd, osections[i]);
2990 if ((flags & SEC_HAS_CONTENTS) == 0
2991 || (flags & SEC_LOAD) == 0)
2992 continue;
2993
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)
2998 {
2999 if (! bfd_set_section_size (obfd, osections[i],
3000 size + (gap_stop - gap_start)))
3001 {
3002 bfd_nonfatal_message (NULL, obfd, osections[i],
3003 _("Can't fill gap after section"));
3004 status = 1;
3005 break;
3006 }
3007 gaps[i] = gap_stop - gap_start;
3008 if (max_gap < gap_stop - gap_start)
3009 max_gap = gap_stop - gap_start;
3010 }
3011 }
3012 }
3013
3014 if (pad_to_set)
3015 {
3016 bfd_vma lma;
3017 bfd_size_type size;
3018
3019 lma = bfd_section_lma (obfd, osections[c - 1]);
3020 size = bfd_section_size (obfd, osections[c - 1]);
3021 if (lma + size < pad_to)
3022 {
3023 if (! bfd_set_section_size (obfd, osections[c - 1],
3024 pad_to - lma))
3025 {
3026 bfd_nonfatal_message (NULL, obfd, osections[c - 1],
3027 _("can't add padding"));
3028 status = 1;
3029 }
3030 else
3031 {
3032 gaps[c - 1] = pad_to - (lma + size);
3033 if (max_gap < pad_to - (lma + size))
3034 max_gap = pad_to - (lma + size);
3035 }
3036 }
3037 }
3038 }
3039
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);
3045
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)
3070 {
3071 /* Mark symbols used in output relocations so that they
3072 are kept, even if they are local labels or static symbols.
3073
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)
3080 {
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)
3086 {
3087 status = 1;
3088 return FALSE;
3089 }
3090 }
3091
3092 osympp = (asymbol **) xmalloc ((symcount + add_symbols + 1) * sizeof (asymbol *));
3093 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
3094 }
3095
3096 if (convert_debugging && dhandle != NULL)
3097 {
3098 bfd_boolean res;
3099
3100 res = write_debugging_info (obfd, dhandle, &symcount, &osympp);
3101
3102 free (dhandle);
3103 dhandle = NULL; /* Paranoia... */
3104
3105 if (! res)
3106 {
3107 status = 1;
3108 return FALSE;
3109 }
3110 }
3111
3112 bfd_set_symtab (obfd, osympp, symcount);
3113
3114 /* This has to happen before section positions are set. */
3115 bfd_map_over_sections (ibfd, copy_relocations_in_section, obfd);
3116
3117 /* This has to happen after the symbol table has been set. */
3118 bfd_map_over_sections (ibfd, copy_section, obfd);
3119
3120 if (add_sections != NULL)
3121 {
3122 struct section_add *padd;
3123
3124 for (padd = add_sections; padd != NULL; padd = padd->next)
3125 {
3126 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
3127 0, padd->size))
3128 {
3129 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
3130 return FALSE;
3131 }
3132 }
3133 }
3134
3135 if (update_sections != NULL)
3136 {
3137 struct section_add *pupdate;
3138
3139 for (pupdate = update_sections;
3140 pupdate != NULL;
3141 pupdate = pupdate->next)
3142 {
3143 osec = pupdate->section->output_section;
3144 if (! bfd_set_section_contents (obfd, osec, pupdate->contents,
3145 0, pupdate->size))
3146 {
3147 bfd_nonfatal_message (NULL, obfd, osec, NULL);
3148 return FALSE;
3149 }
3150 }
3151 }
3152
3153 if (merge_notes)
3154 {
3155 osec = bfd_get_section_by_name (obfd, GNU_BUILD_ATTRS_SECTION_NAME);
3156 if (osec && is_merged_note_section (obfd, osec))
3157 {
3158 if (! bfd_set_section_contents (obfd, osec, merged_notes, 0, merged_size))
3159 {
3160 bfd_nonfatal_message (NULL, obfd, osec, _("error: failed to copy merged notes into output"));
3161 return FALSE;
3162 }
3163 }
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;
3169 }
3170
3171 if (gnu_debuglink_filename != NULL)
3172 {
3173 if (! bfd_fill_in_gnu_debuglink_section
3174 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
3175 {
3176 bfd_nonfatal_message (NULL, obfd, NULL,
3177 _("cannot fill debug link section `%s'"),
3178 gnu_debuglink_filename);
3179 return FALSE;
3180 }
3181 }
3182
3183 if (gap_fill_set || pad_to_set)
3184 {
3185 bfd_byte *buf;
3186
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);
3192
3193 c = bfd_count_sections (obfd);
3194 for (i = 0; i < c; i++)
3195 {
3196 if (gaps[i] != 0)
3197 {
3198 bfd_size_type left;
3199 file_ptr off;
3200
3201 left = gaps[i];
3202 off = bfd_section_size (obfd, osections[i]) - left;
3203
3204 while (left > 0)
3205 {
3206 bfd_size_type now;
3207
3208 if (left > 8192)
3209 now = 8192;
3210 else
3211 now = left;
3212
3213 if (! bfd_set_section_contents (obfd, osections[i], buf,
3214 off, now))
3215 {
3216 bfd_nonfatal_message (NULL, obfd, osections[i], NULL);
3217 free (buf);
3218 return FALSE;
3219 }
3220
3221 left -= now;
3222 off += now;
3223 }
3224 }
3225 }
3226
3227 free (buf);
3228 free (gaps);
3229 gaps = NULL;
3230 }
3231
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))
3237 {
3238 bfd_nonfatal_message (NULL, obfd, NULL,
3239 _("error copying private BFD data"));
3240 return FALSE;
3241 }
3242
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)
3247 {
3248 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
3249 {
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)
3253 {
3254 non_fatal (_("treating that number as an absolute e_machine value instead"));
3255 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
3256 }
3257 else
3258 non_fatal (_("ignoring the alternative value"));
3259 }
3260 }
3261
3262 return TRUE;
3263 }
3264
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'. */
3270
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)
3275 {
3276 struct name_list
3277 {
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;
3286
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).
3297
3298 So for now we fail if an attempt is made to copy such libraries. */
3299 if (ibfd->is_thin_archive)
3300 {
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;
3306 }
3307
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));
3313
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;
3319
3320 if (deterministic)
3321 obfd->flags |= BFD_DETERMINISTIC_OUTPUT;
3322
3323 list = NULL;
3324
3325 this_element = bfd_openr_next_archived_file (ibfd, NULL);
3326
3327 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
3328 {
3329 status = 1;
3330 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
3331 goto cleanup_and_exit;
3332 }
3333
3334 while (!status && this_element != NULL)
3335 {
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;
3343
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)))
3347 {
3348 non_fatal (_("illegal pathname found in archive member: %s"),
3349 bfd_get_filename (this_element));
3350 status = 1;
3351 goto cleanup_and_exit;
3352 }
3353
3354 /* Create an output file for this member. */
3355 output_name = concat (dir, "/",
3356 bfd_get_filename (this_element), (char *) 0);
3357
3358 /* If the file already exists, make another temp dir. */
3359 if (stat (output_name, &buf) >= 0)
3360 {
3361 char * tmpdir = make_tempdir (output_name);
3362
3363 free (output_name);
3364 if (tmpdir == NULL)
3365 {
3366 non_fatal (_("cannot create tempdir for archive copying (error: %s)"),
3367 strerror (errno));
3368 status = 1;
3369 goto cleanup_and_exit;
3370 }
3371
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);
3379 }
3380
3381 if (preserve_dates)
3382 {
3383 stat_status = bfd_stat_arch_elt (this_element, &buf);
3384
3385 if (stat_status != 0)
3386 non_fatal (_("internal stat error on %s"),
3387 bfd_get_filename (this_element));
3388 }
3389
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;
3395
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"));
3400
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));
3407
3408 if (output_bfd == NULL)
3409 {
3410 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3411 status = 1;
3412 goto cleanup_and_exit;
3413 }
3414
3415 if (ok_object)
3416 {
3417 del = !copy_object (this_element, output_bfd, input_arch);
3418
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))
3423 {
3424 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3425 /* Error in new object file. Don't change archive. */
3426 status = 1;
3427 }
3428 }
3429
3430 if (!ok_object)
3431 {
3432 del = !copy_unknown_object (this_element, output_bfd);
3433 if (!bfd_close_all_done (output_bfd))
3434 {
3435 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3436 /* Error in new object file. Don't change archive. */
3437 status = 1;
3438 }
3439 }
3440
3441 if (del)
3442 {
3443 unlink (output_name);
3444 status = 1;
3445 }
3446 else
3447 {
3448 if (preserve_dates && stat_status == 0)
3449 set_times (output_name, &buf);
3450
3451 /* Open the newly output file and attach to our list. */
3452 output_bfd = bfd_openr (output_name, output_target);
3453
3454 l->obfd = output_bfd;
3455
3456 *ptr = output_bfd;
3457 ptr = &output_bfd->archive_next;
3458
3459 last_element = this_element;
3460
3461 this_element = bfd_openr_next_archived_file (ibfd, last_element);
3462
3463 bfd_close (last_element);
3464 }
3465 }
3466 *ptr = NULL;
3467
3468 filename = bfd_get_filename (obfd);
3469 if (!bfd_close (obfd))
3470 {
3471 status = 1;
3472 bfd_nonfatal_message (filename, NULL, NULL, NULL);
3473 }
3474
3475 filename = bfd_get_filename (ibfd);
3476 if (!bfd_close (ibfd))
3477 {
3478 status = 1;
3479 bfd_nonfatal_message (filename, NULL, NULL, NULL);
3480 }
3481
3482 cleanup_and_exit:
3483 /* Delete all the files that we opened. */
3484 {
3485 struct name_list * next;
3486
3487 for (l = list; l != NULL; l = next)
3488 {
3489 if (l->obfd == NULL)
3490 rmdir (l->name);
3491 else
3492 {
3493 bfd_close (l->obfd);
3494 unlink (l->name);
3495 }
3496 next = l->next;
3497 free (l);
3498 }
3499 }
3500
3501 rmdir (dir);
3502 }
3503
3504 static void
3505 set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_handling style)
3506 {
3507 /* This is only relevant to Coff targets. */
3508 if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
3509 {
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);
3514 }
3515 }
3516
3517 /* The top-level control. */
3518
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)
3523 {
3524 bfd *ibfd;
3525 char **obj_matching;
3526 char **core_matching;
3527 off_t size = get_file_size (input_filename);
3528
3529 if (size < 1)
3530 {
3531 if (size == 0)
3532 non_fatal (_("error: the input file '%s' is empty"),
3533 input_filename);
3534 status = 1;
3535 return;
3536 }
3537
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)
3542 {
3543 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3544 status = 1;
3545 return;
3546 }
3547
3548 switch (do_debug_sections)
3549 {
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;
3565 }
3566
3567 switch (do_elf_stt_common)
3568 {
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;
3578 }
3579
3580 if (bfd_check_format (ibfd, bfd_archive))
3581 {
3582 bfd_boolean force_output_target;
3583 bfd *obfd;
3584
3585 /* bfd_get_target does not return the correct value until
3586 bfd_check_format succeeds. */
3587 if (output_target == NULL)
3588 {
3589 output_target = bfd_get_target (ibfd);
3590 force_output_target = FALSE;
3591 }
3592 else
3593 force_output_target = TRUE;
3594
3595 obfd = bfd_openw (output_filename, output_target);
3596 if (obfd == NULL)
3597 {
3598 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3599 status = 1;
3600 return;
3601 }
3602 /* This is a no-op on non-Coff targets. */
3603 set_long_section_mode (obfd, ibfd, long_section_names);
3604
3605 copy_archive (ibfd, obfd, output_target, force_output_target, input_arch);
3606 }
3607 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
3608 {
3609 bfd *obfd;
3610 do_copy:
3611
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);
3616
3617 obfd = bfd_openw (output_filename, output_target);
3618 if (obfd == NULL)
3619 {
3620 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3621 status = 1;
3622 return;
3623 }
3624 /* This is a no-op on non-Coff targets. */
3625 set_long_section_mode (obfd, ibfd, long_section_names);
3626
3627 if (! copy_object (ibfd, obfd, input_arch))
3628 status = 1;
3629
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)))
3635 {
3636 status = 1;
3637 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3638 return;
3639 }
3640
3641 if (!bfd_close (ibfd))
3642 {
3643 status = 1;
3644 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3645 return;
3646 }
3647 }
3648 else
3649 {
3650 bfd_error_type obj_error = bfd_get_error ();
3651 bfd_error_type core_error;
3652
3653 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
3654 {
3655 /* This probably can't happen.. */
3656 if (obj_error == bfd_error_file_ambiguously_recognized)
3657 free (obj_matching);
3658 goto do_copy;
3659 }
3660
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);
3665
3666 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3667
3668 if (obj_error == bfd_error_file_ambiguously_recognized)
3669 {
3670 list_matching_formats (obj_matching);
3671 free (obj_matching);
3672 }
3673 if (core_error == bfd_error_file_ambiguously_recognized)
3674 {
3675 list_matching_formats (core_matching);
3676 free (core_matching);
3677 }
3678
3679 status = 1;
3680 }
3681 }
3682
3683 /* Add a name to the section renaming list. */
3684
3685 static void
3686 add_section_rename (const char * old_name, const char * new_name,
3687 flagword flags)
3688 {
3689 section_rename * srename;
3690
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)
3694 {
3695 /* Silently ignore duplicate definitions. */
3696 if (strcmp (srename->new_name, new_name) == 0
3697 && srename->flags == flags)
3698 return;
3699
3700 fatal (_("Multiple renames of section %s"), old_name);
3701 }
3702
3703 srename = (section_rename *) xmalloc (sizeof (* srename));
3704
3705 srename->old_name = old_name;
3706 srename->new_name = new_name;
3707 srename->flags = flags;
3708 srename->next = section_rename_list;
3709
3710 section_rename_list = srename;
3711 }
3712
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. */
3716
3717 static const char *
3718 find_section_rename (const char *old_name, flagword *returned_flags)
3719 {
3720 const section_rename *srename;
3721
3722 for (srename = section_rename_list; srename != NULL; srename = srename->next)
3723 if (strcmp (srename->old_name, old_name) == 0)
3724 {
3725 if (returned_flags != NULL && srename->flags != (flagword) -1)
3726 *returned_flags = srename->flags;
3727
3728 return srename->new_name;
3729 }
3730
3731 return old_name;
3732 }
3733
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. */
3736
3737 static void
3738 setup_bfd_headers (bfd *ibfd, bfd *obfd)
3739 {
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))
3743 {
3744 status = 1;
3745 bfd_nonfatal_message (NULL, ibfd, NULL,
3746 _("error in private header data"));
3747 return;
3748 }
3749
3750 /* All went well. */
3751 return;
3752 }
3753
3754 /* Create a section in OBFD with the same
3755 name and attributes as ISECTION in IBFD. */
3756
3757 static void
3758 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
3759 {
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;
3771
3772 if (is_strip_section (ibfd, isection))
3773 return;
3774
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);
3779
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;
3786
3787 if (prefix)
3788 {
3789 char *n;
3790
3791 n = (char *) xmalloc (strlen (prefix) + strlen (name) + 1);
3792 strcpy (n, prefix);
3793 strcat (n, name);
3794 name = n;
3795 }
3796
3797 make_nobits = FALSE;
3798
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))
3806 {
3807 flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
3808 if (obfd->xvec->flavour == bfd_target_elf_flavour)
3809 {
3810 make_nobits = TRUE;
3811
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);
3817 }
3818 }
3819
3820 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
3821
3822 if (osection == NULL)
3823 {
3824 err = _("failed to create output section");
3825 goto loser;
3826 }
3827
3828 if (make_nobits)
3829 elf_section_type (osection) = SHT_NOBITS;
3830
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))
3838 {
3839 err = _("failed to set size");
3840 goto loser;
3841 }
3842
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)
3847 {
3848 if (p->context & SECTION_CONTEXT_SET_VMA)
3849 vma = p->vma_val;
3850 else
3851 vma += p->vma_val;
3852 }
3853 else
3854 vma += change_section_address;
3855
3856 if (! bfd_set_section_vma (obfd, osection, vma))
3857 {
3858 err = _("failed to set vma");
3859 goto loser;
3860 }
3861
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)
3866 {
3867 if (p->context & SECTION_CONTEXT_ALTER_LMA)
3868 lma += p->lma_val;
3869 else
3870 lma = p->lma_val;
3871 }
3872 else
3873 lma += change_section_address;
3874
3875 osection->lma = lma;
3876
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)))
3882 {
3883 err = _("failed to set alignment");
3884 goto loser;
3885 }
3886
3887 /* Copy merge entity size. */
3888 osection->entsize = isection->entsize;
3889
3890 /* Copy compress status. */
3891 osection->compress_status = isection->compress_status;
3892
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;
3898
3899 if ((isection->flags & SEC_GROUP) != 0)
3900 {
3901 asymbol *gsym = group_signature (isection);
3902
3903 if (gsym != NULL)
3904 {
3905 gsym->flags |= BSF_KEEP;
3906 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
3907 elf_group_id (isection) = gsym;
3908 }
3909 }
3910
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))
3914 {
3915 err = _("failed to copy private data");
3916 goto loser;
3917 }
3918
3919 /* All went well. */
3920 return;
3921
3922 loser:
3923 status = 1;
3924 bfd_nonfatal_message (NULL, obfd, osection, err);
3925 }
3926
3927 /* Return TRUE if input section ISECTION should be skipped. */
3928
3929 static bfd_boolean
3930 skip_section (bfd *ibfd, sec_ptr isection, bfd_boolean skip_copy)
3931 {
3932 sec_ptr osection;
3933 bfd_size_type size;
3934 flagword flags;
3935
3936 /* If we have already failed earlier on,
3937 do not keep on generating complaints now. */
3938 if (status != 0)
3939 return TRUE;
3940
3941 if (extract_symbol)
3942 return TRUE;
3943
3944 if (is_strip_section (ibfd, isection))
3945 return TRUE;
3946
3947 if (is_update_section (ibfd, isection))
3948 return TRUE;
3949
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;
3954
3955 flags = bfd_get_section_flags (ibfd, isection);
3956 if ((flags & SEC_GROUP) != 0)
3957 return TRUE;
3958
3959 osection = isection->output_section;
3960 size = bfd_get_section_size (isection);
3961
3962 if (size == 0 || osection == 0)
3963 return TRUE;
3964
3965 return FALSE;
3966 }
3967
3968 /* Add section SECTION_PATTERN to the list of sections that will have their
3969 relocations removed. */
3970
3971 static void
3972 handle_remove_relocations_option (const char *section_pattern)
3973 {
3974 find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE_RELOCS);
3975 }
3976
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. */
3981
3982 static bfd_boolean
3983 discard_relocations (bfd *ibfd ATTRIBUTE_UNUSED, asection *isection)
3984 {
3985 return (find_section_list (bfd_section_name (ibfd, isection), FALSE,
3986 SECTION_CONTEXT_REMOVE_RELOCS) != NULL);
3987 }
3988
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. */
3993
3994 static void
3995 handle_remove_section_option (const char *section_pattern)
3996 {
3997 find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE);
3998 if (strncmp (section_pattern, ".rel", 4) == 0)
3999 {
4000 section_pattern += 4;
4001 if (*section_pattern == 'a')
4002 section_pattern++;
4003 if (*section_pattern)
4004 handle_remove_relocations_option (section_pattern);
4005 }
4006 sections_removed = TRUE;
4007 }
4008
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. */
4012
4013 static void
4014 copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
4015 {
4016 bfd *obfd = (bfd *) obfdarg;
4017 long relsize;
4018 arelent **relpp;
4019 long relcount;
4020 sec_ptr osection;
4021
4022 if (skip_section (ibfd, isection, FALSE))
4023 return;
4024
4025 osection = isection->output_section;
4026
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
4033 {
4034 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
4035
4036 if (relsize < 0)
4037 {
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
4042 {
4043 status = 1;
4044 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
4045 return;
4046 }
4047 }
4048 }
4049
4050 if (relsize == 0)
4051 {
4052 bfd_set_reloc (obfd, osection, NULL, 0);
4053 osection->flags &= ~SEC_RELOC;
4054 }
4055 else
4056 {
4057 if (isection->orelocation != NULL)
4058 {
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;
4063 }
4064 else
4065 {
4066 relpp = (arelent **) xmalloc (relsize);
4067 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
4068 if (relcount < 0)
4069 {
4070 status = 1;
4071 bfd_nonfatal_message (NULL, ibfd, isection,
4072 _("relocation count is negative"));
4073 return;
4074 }
4075 }
4076
4077 if (strip_symbols == STRIP_ALL)
4078 {
4079 /* Remove relocations which are not in
4080 keep_strip_specific_list. */
4081 arelent **temp_relpp;
4082 long temp_relcount = 0;
4083 long i;
4084
4085 temp_relpp = (arelent **) xmalloc (relsize);
4086 for (i = 0; i < relcount; i++)
4087 {
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];
4095 }
4096 relcount = temp_relcount;
4097 if (isection->orelocation == NULL)
4098 free (relpp);
4099 relpp = temp_relpp;
4100 }
4101
4102 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
4103 if (relcount == 0)
4104 {
4105 osection->flags &= ~SEC_RELOC;
4106 free (relpp);
4107 }
4108 }
4109 }
4110
4111 /* Copy the data of input section ISECTION of IBFD
4112 to an output section with the same name in OBFD. */
4113
4114 static void
4115 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
4116 {
4117 bfd *obfd = (bfd *) obfdarg;
4118 struct section_list *p;
4119 sec_ptr osection;
4120 bfd_size_type size;
4121
4122 if (skip_section (ibfd, isection, TRUE))
4123 return;
4124
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);
4131
4132 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
4133 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
4134 {
4135 bfd_byte *memhunk = NULL;
4136
4137 if (!bfd_get_full_section_contents (ibfd, isection, &memhunk)
4138 || !bfd_convert_section_contents (ibfd, isection, obfd,
4139 &memhunk, &size))
4140 {
4141 status = 1;
4142 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
4143 free (memhunk);
4144 return;
4145 }
4146
4147 if (reverse_bytes)
4148 {
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)
4153 {
4154 unsigned long i, j;
4155 bfd_byte b;
4156
4157 for (i = 0; i < size; i += reverse_bytes)
4158 for (j = 0; j < (unsigned long)(reverse_bytes / 2); j++)
4159 {
4160 bfd_byte *m = (bfd_byte *) memhunk;
4161
4162 b = m[i + j];
4163 m[i + j] = m[(i + reverse_bytes) - (j + 1)];
4164 m[(i + reverse_bytes) - (j + 1)] = b;
4165 }
4166 }
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);
4171 }
4172
4173 if (copy_byte >= 0)
4174 {
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;
4180
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;
4189
4190 for (; from < end; from += interleave)
4191 for (i = 0; i < copy_width; i++)
4192 {
4193 if (&from[i] >= end)
4194 break;
4195 *to++ = from[i];
4196 }
4197
4198 size = (size + interleave - 1 - copy_byte) / interleave * copy_width;
4199 osection->lma /= interleave;
4200 if (copy_byte < extra)
4201 osection->lma++;
4202 }
4203
4204 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
4205 {
4206 status = 1;
4207 bfd_nonfatal_message (NULL, obfd, osection, NULL);
4208 free (memhunk);
4209 return;
4210 }
4211 free (memhunk);
4212 }
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)
4216 {
4217 void *memhunk = xmalloc (size);
4218
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. */
4224
4225 memset (memhunk, 0, size);
4226 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
4227 {
4228 status = 1;
4229 bfd_nonfatal_message (NULL, obfd, osection, NULL);
4230 free (memhunk);
4231 return;
4232 }
4233 free (memhunk);
4234 }
4235 }
4236
4237 /* Get all the sections. This is used when --gap-fill or --pad-to is
4238 used. */
4239
4240 static void
4241 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
4242 {
4243 asection ***secppp = (asection ***) secppparg;
4244
4245 **secppp = osection;
4246 ++(*secppp);
4247 }
4248
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. */
4252
4253 static int
4254 compare_section_lma (const void *arg1, const void *arg2)
4255 {
4256 const asection *const *sec1 = (const asection * const *) arg1;
4257 const asection *const *sec2 = (const asection * const *) arg2;
4258 flagword flags1, flags2;
4259
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)
4265 {
4266 if ((flags2 & SEC_HAS_CONTENTS) != 0
4267 && (flags2 & SEC_LOAD) != 0)
4268 return -1;
4269 }
4270 else
4271 {
4272 if ((flags2 & SEC_HAS_CONTENTS) == 0
4273 || (flags2 & SEC_LOAD) == 0)
4274 return 1;
4275 }
4276
4277 /* Sort sections by LMA. */
4278 if ((*sec1)->lma > (*sec2)->lma)
4279 return 1;
4280 else if ((*sec1)->lma < (*sec2)->lma)
4281 return -1;
4282
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;
4288
4289 return 0;
4290 }
4291
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.
4294
4295 Ignore relocations which will not appear in the output file. */
4296
4297 static void
4298 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
4299 {
4300 asymbol **symbols = (asymbol **) symbolsarg;
4301 long relsize;
4302 arelent **relpp;
4303 long relcount, i;
4304
4305 /* Ignore an input section with no corresponding output section. */
4306 if (isection->output_section == NULL)
4307 return;
4308
4309 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
4310 if (relsize < 0)
4311 {
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));
4316 }
4317
4318 if (relsize == 0)
4319 return;
4320
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));
4325
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++)
4329 {
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;
4337 }
4338
4339 if (relpp != NULL)
4340 free (relpp);
4341 }
4342
4343 /* Write out debugging information. */
4344
4345 static bfd_boolean
4346 write_debugging_info (bfd *obfd, void *dhandle,
4347 long *symcountp ATTRIBUTE_UNUSED,
4348 asymbol ***symppp ATTRIBUTE_UNUSED)
4349 {
4350 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
4351 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
4352 {
4353 bfd_byte *syms, *strings = NULL;
4354 bfd_size_type symsize, stringsize;
4355 asection *stabsec, *stabstrsec;
4356 flagword flags;
4357
4358 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
4359 &symsize, &strings,
4360 &stringsize))
4361 return FALSE;
4362
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))
4372 {
4373 bfd_nonfatal_message (NULL, obfd, NULL,
4374 _("can't create debugging section"));
4375 free (strings);
4376 return FALSE;
4377 }
4378
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))
4386 {
4387 bfd_nonfatal_message (NULL, obfd, NULL,
4388 _("can't set debugging section contents"));
4389 free (strings);
4390 return FALSE;
4391 }
4392
4393 return TRUE;
4394 }
4395
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;
4400 }
4401
4402 /* If neither -D nor -U was specified explicitly,
4403 then use the configured default. */
4404 static void
4405 default_deterministic (void)
4406 {
4407 if (deterministic < 0)
4408 deterministic = DEFAULT_AR_DETERMINISTIC;
4409 }
4410
4411 static int
4412 strip_main (int argc, char *argv[])
4413 {
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;
4422
4423 while ((c = getopt_long (argc, argv, "I:O:F:K:MN:R:o:sSpdgxXHhVvwDU",
4424 strip_options, (int *) 0)) != EOF)
4425 {
4426 switch (c)
4427 {
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);
4515 }
4516 }
4517
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;
4527
4528 if (formats_info)
4529 {
4530 display_info ();
4531 return 0;
4532 }
4533
4534 if (show_version)
4535 print_version ("strip");
4536
4537 default_deterministic ();
4538
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;
4544
4545 if (output_target == NULL)
4546 output_target = input_target;
4547
4548 i = optind;
4549 if (i == argc
4550 || (output_file != NULL && (i + 1) < argc))
4551 strip_usage (stderr, 1);
4552
4553 for (; i < argc; i++)
4554 {
4555 int hold_status = status;
4556 struct stat statbuf;
4557 char *tmpname;
4558
4559 if (get_file_size (argv[i]) < 1)
4560 {
4561 status = 1;
4562 continue;
4563 }
4564
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);
4569
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;
4575
4576 if (tmpname == NULL)
4577 {
4578 bfd_nonfatal_message (argv[i], NULL, NULL,
4579 _("could not create temporary file to hold stripped copy"));
4580 status = 1;
4581 continue;
4582 }
4583
4584 status = 0;
4585 copy_file (argv[i], tmpname, input_target, output_target, NULL);
4586 if (status == 0)
4587 {
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;
4596 }
4597 else
4598 unlink_if_ordinary (tmpname);
4599 if (output_file != tmpname)
4600 free (tmpname);
4601 }
4602
4603 return status;
4604 }
4605
4606 /* Set up PE subsystem. */
4607
4608 static void
4609 set_pe_subsystem (const char *s)
4610 {
4611 const char *version, *subsystem;
4612 size_t i;
4613 static const struct
4614 {
4615 const char *name;
4616 const char set_def;
4617 const short value;
4618 }
4619 v[] =
4620 {
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 }
4631 };
4632 short value;
4633 char *copy;
4634 int set_def = -1;
4635
4636 /* Check for the presence of a version number. */
4637 version = strchr (s, ':');
4638 if (version == NULL)
4639 subsystem = s;
4640 else
4641 {
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);
4652 }
4653
4654 /* Check for numeric subsystem. */
4655 value = (short) strtol (subsystem, &copy, 0);
4656 if (*copy == '\0')
4657 {
4658 for (i = 0; i < ARRAY_SIZE (v); i++)
4659 if (v[i].value == value)
4660 {
4661 pe_subsystem = value;
4662 set_def = v[i].set_def;
4663 break;
4664 }
4665 }
4666 else
4667 {
4668 /* Search for subsystem by name. */
4669 for (i = 0; i < ARRAY_SIZE (v); i++)
4670 if (strcmp (subsystem, v[i].name) == 0)
4671 {
4672 pe_subsystem = v[i].value;
4673 set_def = v[i].set_def;
4674 break;
4675 }
4676 }
4677
4678 switch (set_def)
4679 {
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;
4691 }
4692 if (s != subsystem)
4693 free ((char *) subsystem);
4694 }
4695
4696 /* Convert EFI target to PEI target. */
4697
4698 static void
4699 convert_efi_target (char *efi)
4700 {
4701 efi[0] = 'p';
4702 efi[1] = 'e';
4703 efi[2] = 'i';
4704
4705 if (strcmp (efi + 4, "ia32") == 0)
4706 {
4707 /* Change ia32 to i386. */
4708 efi[5]= '3';
4709 efi[6]= '8';
4710 efi[7]= '6';
4711 }
4712 else if (strcmp (efi + 4, "x86_64") == 0)
4713 {
4714 /* Change x86_64 to x86-64. */
4715 efi[7] = '-';
4716 }
4717 }
4718
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. */
4724
4725 static struct section_add *
4726 init_section_add (const char *arg,
4727 struct section_add *next,
4728 const char *option)
4729 {
4730 struct section_add *pa;
4731 const char *s;
4732
4733 s = strchr (arg, '=');
4734 if (s == NULL)
4735 fatal (_("bad format for %s"), option);
4736
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;
4743
4744 return pa;
4745 }
4746
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. */
4751
4752 static void
4753 section_add_load_file (struct section_add *pa)
4754 {
4755 size_t off, alloc;
4756 FILE *f;
4757
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. */
4761
4762 f = fopen (pa->filename, FOPEN_RB);
4763 if (f == NULL)
4764 fatal (_("cannot open: %s: %s"),
4765 pa->filename, strerror (errno));
4766
4767 off = 0;
4768 alloc = 4096;
4769 pa->contents = (bfd_byte *) xmalloc (alloc);
4770 while (!feof (f))
4771 {
4772 off_t got;
4773
4774 if (off == alloc)
4775 {
4776 alloc <<= 1;
4777 pa->contents = (bfd_byte *) xrealloc (pa->contents, alloc);
4778 }
4779
4780 got = fread (pa->contents + off, 1, alloc - off, f);
4781 if (ferror (f))
4782 fatal (_("%s: fread failed"), pa->filename);
4783
4784 off += got;
4785 }
4786
4787 pa->size = off;
4788
4789 fclose (f);
4790 }
4791
4792 static int
4793 copy_main (int argc, char *argv[])
4794 {
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;
4808
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)
4811 {
4812 switch (c)
4813 {
4814 case 'b':
4815 copy_byte = atoi (optarg);
4816 if (copy_byte < 0)
4817 fatal (_("byte number must be non-negative"));
4818 break;
4819
4820 case 'B':
4821 input_arch = bfd_scan_arch (optarg);
4822 if (input_arch == NULL)
4823 fatal (_("architecture %s unknown"), optarg);
4824 break;
4825
4826 case 'i':
4827 if (optarg)
4828 {
4829 interleave = atoi (optarg);
4830 if (interleave < 1)
4831 fatal (_("interleave must be positive"));
4832 }
4833 else
4834 interleave = 4;
4835 break;
4836
4837 case OPTION_INTERLEAVE_WIDTH:
4838 copy_width = atoi (optarg);
4839 if (copy_width < 1)
4840 fatal(_("interleave width must be positive"));
4841 break;
4842
4843 case 'I':
4844 case 's': /* "source" - 'I' is preferred */
4845 input_target = optarg;
4846 break;
4847
4848 case 'O':
4849 case 'd': /* "destination" - 'O' is preferred */
4850 output_target = optarg;
4851 break;
4852
4853 case 'F':
4854 input_target = output_target = optarg;
4855 break;
4856
4857 case 'j':
4858 find_section_list (optarg, TRUE, SECTION_CONTEXT_COPY);
4859 sections_copied = TRUE;
4860 break;
4861
4862 case 'R':
4863 handle_remove_section_option (optarg);
4864 break;
4865
4866 case OPTION_REMOVE_RELOCS:
4867 handle_remove_relocations_option (optarg);
4868 break;
4869
4870 case 'S':
4871 strip_symbols = STRIP_ALL;
4872 break;
4873
4874 case 'g':
4875 strip_symbols = STRIP_DEBUG;
4876 break;
4877
4878 case OPTION_STRIP_DWO:
4879 strip_symbols = STRIP_DWO;
4880 break;
4881
4882 case OPTION_STRIP_UNNEEDED:
4883 strip_symbols = STRIP_UNNEEDED;
4884 break;
4885
4886 case OPTION_ONLY_KEEP_DEBUG:
4887 strip_symbols = STRIP_NONDEBUG;
4888 break;
4889
4890 case OPTION_KEEP_FILE_SYMBOLS:
4891 keep_file_symbols = 1;
4892 break;
4893
4894 case OPTION_ADD_GNU_DEBUGLINK:
4895 long_section_names = ENABLE ;
4896 gnu_debuglink_filename = optarg;
4897 break;
4898
4899 case 'K':
4900 add_specific_symbol (optarg, keep_specific_htab);
4901 break;
4902
4903 case 'M':
4904 merge_notes = TRUE;
4905 break;
4906 case OPTION_NO_MERGE_NOTES:
4907 merge_notes = FALSE;
4908 break;
4909
4910 case 'N':
4911 add_specific_symbol (optarg, strip_specific_htab);
4912 break;
4913
4914 case OPTION_STRIP_UNNEEDED_SYMBOL:
4915 add_specific_symbol (optarg, strip_unneeded_htab);
4916 break;
4917
4918 case 'L':
4919 add_specific_symbol (optarg, localize_specific_htab);
4920 break;
4921
4922 case OPTION_GLOBALIZE_SYMBOL:
4923 use_globalize = TRUE;
4924 add_specific_symbol (optarg, globalize_specific_htab);
4925 break;
4926
4927 case 'G':
4928 use_keep_global = TRUE;
4929 add_specific_symbol (optarg, keepglobal_specific_htab);
4930 break;
4931
4932 case 'W':
4933 add_specific_symbol (optarg, weaken_specific_htab);
4934 break;
4935
4936 case 'p':
4937 preserve_dates = TRUE;
4938 break;
4939
4940 case 'D':
4941 deterministic = TRUE;
4942 break;
4943
4944 case 'U':
4945 deterministic = FALSE;
4946 break;
4947
4948 case 'w':
4949 wildcard = TRUE;
4950 break;
4951
4952 case 'x':
4953 discard_locals = LOCALS_ALL;
4954 break;
4955
4956 case 'X':
4957 discard_locals = LOCALS_START_L;
4958 break;
4959
4960 case 'v':
4961 verbose = TRUE;
4962 break;
4963
4964 case 'V':
4965 show_version = TRUE;
4966 break;
4967
4968 case OPTION_FORMATS_INFO:
4969 formats_info = TRUE;
4970 break;
4971
4972 case OPTION_WEAKEN:
4973 weaken = TRUE;
4974 break;
4975
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;
4981
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;
4987
4988 case OPTION_DUMP_SECTION:
4989 dump_sections = init_section_add (optarg, dump_sections,
4990 "--dump-section");
4991 break;
4992
4993 case OPTION_ADD_SYMBOL:
4994 {
4995 char *s, *t;
4996 struct addsym_node *newsym = xmalloc (sizeof *newsym);
4997
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, ':');
5003
5004 newsym->symdef = xstrndup (optarg, s - optarg);
5005 if (t)
5006 {
5007 newsym->section = xstrndup (s + 1, t - (s + 1));
5008 newsym->symval = strtol (t + 1, NULL, 0);
5009 }
5010 else
5011 {
5012 newsym->section = NULL;
5013 newsym->symval = strtol (s + 1, NULL, 0);
5014 t = s;
5015 }
5016
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;
5023
5024 /* Keep 'othersym' symbols at the front of the list. */
5025 if (newsym->othersym)
5026 {
5027 newsym->next = add_sym_list;
5028 if (!add_sym_list)
5029 add_sym_tail = &newsym->next;
5030 add_sym_list = newsym;
5031 }
5032 else
5033 {
5034 *add_sym_tail = newsym;
5035 add_sym_tail = &newsym->next;
5036 }
5037 add_symbols++;
5038 }
5039 break;
5040
5041 case OPTION_CHANGE_START:
5042 change_start = parse_vma (optarg, "--change-start");
5043 break;
5044
5045 case OPTION_CHANGE_SECTION_ADDRESS:
5046 case OPTION_CHANGE_SECTION_LMA:
5047 case OPTION_CHANGE_SECTION_VMA:
5048 {
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;
5056
5057 switch (c)
5058 {
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;
5071 }
5072
5073 s = strchr (optarg, '=');
5074 if (s == NULL)
5075 {
5076 s = strchr (optarg, '+');
5077 if (s == NULL)
5078 {
5079 s = strchr (optarg, '-');
5080 if (s == NULL)
5081 fatal (_("bad format for %s"), option);
5082 }
5083 }
5084 else
5085 {
5086 /* Correct the context. */
5087 switch (c)
5088 {
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;
5098 }
5099 }
5100
5101 len = s - optarg;
5102 name = (char *) xmalloc (len + 1);
5103 strncpy (name, optarg, len);
5104 name[len] = '\0';
5105
5106 p = find_section_list (name, TRUE, context);
5107
5108 val = parse_vma (s + 1, option);
5109 if (*s == '-')
5110 val = - val;
5111
5112 switch (c)
5113 {
5114 case OPTION_CHANGE_SECTION_ADDRESS:
5115 p->vma_val = val;
5116 /* Fall through. */
5117
5118 case OPTION_CHANGE_SECTION_LMA:
5119 p->lma_val = val;
5120 break;
5121
5122 case OPTION_CHANGE_SECTION_VMA:
5123 p->vma_val = val;
5124 break;
5125 }
5126 }
5127 break;
5128
5129 case OPTION_CHANGE_ADDRESSES:
5130 change_section_address = parse_vma (optarg, "--change-addresses");
5131 change_start = change_section_address;
5132 break;
5133
5134 case OPTION_CHANGE_WARNINGS:
5135 change_warn = TRUE;
5136 break;
5137
5138 case OPTION_CHANGE_LEADING_CHAR:
5139 change_leading_char = TRUE;
5140 break;
5141
5142 case OPTION_COMPRESS_DEBUG_SECTIONS:
5143 if (optarg)
5144 {
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);
5156 }
5157 else
5158 do_debug_sections = compress;
5159 break;
5160
5161 case OPTION_DEBUGGING:
5162 convert_debugging = TRUE;
5163 break;
5164
5165 case OPTION_DECOMPRESS_DEBUG_SECTIONS:
5166 do_debug_sections = decompress;
5167 break;
5168
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;
5178
5179 case OPTION_GAP_FILL:
5180 {
5181 bfd_vma gap_fill_vma;
5182
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)
5186 {
5187 char buff[20];
5188
5189 sprintf_vma (buff, gap_fill_vma);
5190
5191 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
5192 buff, gap_fill);
5193 }
5194 gap_fill_set = TRUE;
5195 }
5196 break;
5197
5198 case OPTION_NO_CHANGE_WARNINGS:
5199 change_warn = FALSE;
5200 break;
5201
5202 case OPTION_PAD_TO:
5203 pad_to = parse_vma (optarg, "--pad-to");
5204 pad_to_set = TRUE;
5205 break;
5206
5207 case OPTION_REMOVE_LEADING_CHAR:
5208 remove_leading_char = TRUE;
5209 break;
5210
5211 case OPTION_REDEFINE_SYM:
5212 {
5213 /* Insert this redefinition onto redefine_specific_htab. */
5214
5215 int len;
5216 const char *s;
5217 const char *nextarg;
5218 char *source, *target;
5219
5220 s = strchr (optarg, '=');
5221 if (s == NULL)
5222 fatal (_("bad format for %s"), "--redefine-sym");
5223
5224 len = s - optarg;
5225 source = (char *) xmalloc (len + 1);
5226 strncpy (source, optarg, len);
5227 source[len] = '\0';
5228
5229 nextarg = s + 1;
5230 len = strlen (nextarg);
5231 target = (char *) xmalloc (len + 1);
5232 strcpy (target, nextarg);
5233
5234 add_redefine_and_check ("--redefine-sym", source, target);
5235
5236 free (source);
5237 free (target);
5238 }
5239 break;
5240
5241 case OPTION_REDEFINE_SYMS:
5242 add_redefine_syms_file (optarg);
5243 break;
5244
5245 case OPTION_SET_SECTION_FLAGS:
5246 {
5247 struct section_list *p;
5248 const char *s;
5249 int len;
5250 char *name;
5251
5252 s = strchr (optarg, '=');
5253 if (s == NULL)
5254 fatal (_("bad format for %s"), "--set-section-flags");
5255
5256 len = s - optarg;
5257 name = (char *) xmalloc (len + 1);
5258 strncpy (name, optarg, len);
5259 name[len] = '\0';
5260
5261 p = find_section_list (name, TRUE, SECTION_CONTEXT_SET_FLAGS);
5262
5263 p->flags = parse_flags (s + 1);
5264 }
5265 break;
5266
5267 case OPTION_RENAME_SECTION:
5268 {
5269 flagword flags;
5270 const char *eq, *fl;
5271 char *old_name;
5272 char *new_name;
5273 unsigned int len;
5274
5275 eq = strchr (optarg, '=');
5276 if (eq == NULL)
5277 fatal (_("bad format for %s"), "--rename-section");
5278
5279 len = eq - optarg;
5280 if (len == 0)
5281 fatal (_("bad format for %s"), "--rename-section");
5282
5283 old_name = (char *) xmalloc (len + 1);
5284 strncpy (old_name, optarg, len);
5285 old_name[len] = 0;
5286
5287 eq++;
5288 fl = strchr (eq, ',');
5289 if (fl)
5290 {
5291 flags = parse_flags (fl + 1);
5292 len = fl - eq;
5293 }
5294 else
5295 {
5296 flags = -1;
5297 len = strlen (eq);
5298 }
5299
5300 if (len == 0)
5301 fatal (_("bad format for %s"), "--rename-section");
5302
5303 new_name = (char *) xmalloc (len + 1);
5304 strncpy (new_name, eq, len);
5305 new_name[len] = 0;
5306
5307 add_section_rename (old_name, new_name, flags);
5308 }
5309 break;
5310
5311 case OPTION_SET_START:
5312 set_start = parse_vma (optarg, "--set-start");
5313 set_start_set = TRUE;
5314 break;
5315
5316 case OPTION_SREC_LEN:
5317 _bfd_srec_len = parse_vma (optarg, "--srec-len");
5318 break;
5319
5320 case OPTION_SREC_FORCES3:
5321 _bfd_srec_forceS3 = TRUE;
5322 break;
5323
5324 case OPTION_STRIP_SYMBOLS:
5325 add_specific_symbols (optarg, strip_specific_htab,
5326 &strip_specific_buffer);
5327 break;
5328
5329 case OPTION_STRIP_UNNEEDED_SYMBOLS:
5330 add_specific_symbols (optarg, strip_unneeded_htab,
5331 &strip_unneeded_buffer);
5332 break;
5333
5334 case OPTION_KEEP_SYMBOLS:
5335 add_specific_symbols (optarg, keep_specific_htab,
5336 &keep_specific_buffer);
5337 break;
5338
5339 case OPTION_LOCALIZE_HIDDEN:
5340 localize_hidden = TRUE;
5341 break;
5342
5343 case OPTION_LOCALIZE_SYMBOLS:
5344 add_specific_symbols (optarg, localize_specific_htab,
5345 &localize_specific_buffer);
5346 break;
5347
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;
5358
5359 case OPTION_GLOBALIZE_SYMBOLS:
5360 use_globalize = TRUE;
5361 add_specific_symbols (optarg, globalize_specific_htab,
5362 &globalize_specific_buffer);
5363 break;
5364
5365 case OPTION_KEEPGLOBAL_SYMBOLS:
5366 use_keep_global = TRUE;
5367 add_specific_symbols (optarg, keepglobal_specific_htab,
5368 &keepglobal_specific_buffer);
5369 break;
5370
5371 case OPTION_WEAKEN_SYMBOLS:
5372 add_specific_symbols (optarg, weaken_specific_htab,
5373 &weaken_specific_buffer);
5374 break;
5375
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;
5381
5382 case OPTION_PREFIX_SYMBOLS:
5383 prefix_symbols_string = optarg;
5384 break;
5385
5386 case OPTION_PREFIX_SECTIONS:
5387 prefix_sections_string = optarg;
5388 break;
5389
5390 case OPTION_PREFIX_ALLOC_SECTIONS:
5391 prefix_alloc_sections_string = optarg;
5392 break;
5393
5394 case OPTION_READONLY_TEXT:
5395 bfd_flags_to_set |= WP_TEXT;
5396 bfd_flags_to_clear &= ~WP_TEXT;
5397 break;
5398
5399 case OPTION_WRITABLE_TEXT:
5400 bfd_flags_to_clear |= WP_TEXT;
5401 bfd_flags_to_set &= ~WP_TEXT;
5402 break;
5403
5404 case OPTION_PURE:
5405 bfd_flags_to_set |= D_PAGED;
5406 bfd_flags_to_clear &= ~D_PAGED;
5407 break;
5408
5409 case OPTION_IMPURE:
5410 bfd_flags_to_clear |= D_PAGED;
5411 bfd_flags_to_set &= ~D_PAGED;
5412 break;
5413
5414 case OPTION_EXTRACT_DWO:
5415 strip_symbols = STRIP_NONDWO;
5416 break;
5417
5418 case OPTION_EXTRACT_SYMBOL:
5419 extract_symbol = TRUE;
5420 break;
5421
5422 case OPTION_REVERSE_BYTES:
5423 {
5424 int prev = reverse_bytes;
5425
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"));
5429
5430 if (prev && prev != reverse_bytes)
5431 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
5432 prev);
5433 break;
5434 }
5435
5436 case OPTION_FILE_ALIGNMENT:
5437 pe_file_alignment = parse_vma (optarg, "--file-alignment");
5438 break;
5439
5440 case OPTION_HEAP:
5441 {
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')
5449 {
5450 pe_heap_commit = strtoul (end + 1, &end, 0);
5451 if (*end != '\0')
5452 non_fatal (_("%s: invalid commit value for --heap"),
5453 optarg);
5454 }
5455 }
5456 break;
5457
5458 case OPTION_IMAGE_BASE:
5459 pe_image_base = parse_vma (optarg, "--image-base");
5460 break;
5461
5462 case OPTION_SECTION_ALIGNMENT:
5463 pe_section_alignment = parse_vma (optarg,
5464 "--section-alignment");
5465 break;
5466
5467 case OPTION_SUBSYSTEM:
5468 set_pe_subsystem (optarg);
5469 break;
5470
5471 case OPTION_STACK:
5472 {
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')
5480 {
5481 pe_stack_commit = strtoul (end + 1, &end, 0);
5482 if (*end != '\0')
5483 non_fatal (_("%s: invalid commit value for --stack"),
5484 optarg);
5485 }
5486 }
5487 break;
5488
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;
5494
5495 case 0:
5496 /* We've been given a long option. */
5497 break;
5498
5499 case 'H':
5500 case 'h':
5501 copy_usage (stdout, 0);
5502
5503 default:
5504 copy_usage (stderr, 1);
5505 }
5506 }
5507
5508 if (use_globalize && use_keep_global)
5509 fatal(_("--globalize-symbol(s) is incompatible with -G/--keep-global-symbol(s)"));
5510
5511 if (formats_info)
5512 {
5513 display_info ();
5514 return 0;
5515 }
5516
5517 if (show_version)
5518 print_version ("objcopy");
5519
5520 if (interleave && copy_byte == -1)
5521 fatal (_("interleave start byte must be set with --byte"));
5522
5523 if (copy_byte >= interleave)
5524 fatal (_("byte number must be less than interleave"));
5525
5526 if (copy_width > interleave - copy_byte)
5527 fatal (_("interleave width must be less than or equal to interleave - byte`"));
5528
5529 if (optind == argc || optind + 2 < argc)
5530 copy_usage (stderr, 1);
5531
5532 input_filename = argv[optind];
5533 if (optind + 1 < argc)
5534 output_filename = argv[optind + 1];
5535
5536 default_deterministic ();
5537
5538 /* Default is to strip no symbols. */
5539 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
5540 strip_symbols = STRIP_NONE;
5541
5542 if (output_target == NULL)
5543 output_target = input_target;
5544
5545 /* Convert input EFI target to PEI target. */
5546 if (input_target != NULL
5547 && strncmp (input_target, "efi-", 4) == 0)
5548 {
5549 char *efi;
5550
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);
5557
5558 input_target = efi;
5559 convert_efi_target (efi);
5560 }
5561
5562 /* Convert output EFI target to PEI target. */
5563 if (output_target != NULL
5564 && strncmp (output_target, "efi-", 4) == 0)
5565 {
5566 char *efi;
5567
5568 efi = xstrdup (output_target + 4);
5569 if (strncmp (efi, "app-", 4) == 0)
5570 {
5571 if (pe_subsystem == -1)
5572 pe_subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
5573 }
5574 else if (strncmp (efi, "bsdrv-", 6) == 0)
5575 {
5576 if (pe_subsystem == -1)
5577 pe_subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;
5578 efi += 2;
5579 }
5580 else if (strncmp (efi, "rtdrv-", 6) == 0)
5581 {
5582 if (pe_subsystem == -1)
5583 pe_subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;
5584 efi += 2;
5585 }
5586 else
5587 fatal (_("unknown output EFI target: %s"), output_target);
5588
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;
5593
5594 output_target = efi;
5595 convert_efi_target (efi);
5596 }
5597
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));
5602
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;
5610
5611 if (tmpname == NULL)
5612 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
5613 input_filename, strerror (errno));
5614
5615 copy_file (input_filename, tmpname, input_target, output_target, input_arch);
5616 if (status == 0)
5617 {
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);
5623 }
5624 else
5625 unlink_if_ordinary (tmpname);
5626
5627 if (tmpname != output_filename)
5628 free (tmpname);
5629
5630 if (change_warn)
5631 {
5632 struct section_list *p;
5633
5634 for (p = change_sections; p != NULL; p = p->next)
5635 {
5636 if (! p->used)
5637 {
5638 if (p->context & (SECTION_CONTEXT_SET_VMA | SECTION_CONTEXT_ALTER_VMA))
5639 {
5640 char buff [20];
5641
5642 sprintf_vma (buff, p->vma_val);
5643
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);
5650 }
5651
5652 if (p->context & (SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_ALTER_LMA))
5653 {
5654 char buff [20];
5655
5656 sprintf_vma (buff, p->lma_val);
5657
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);
5664 }
5665 }
5666 }
5667 }
5668
5669 if (strip_specific_buffer)
5670 free (strip_specific_buffer);
5671
5672 if (strip_unneeded_buffer)
5673 free (strip_unneeded_buffer);
5674
5675 if (keep_specific_buffer)
5676 free (keep_specific_buffer);
5677
5678 if (localize_specific_buffer)
5679 free (globalize_specific_buffer);
5680
5681 if (globalize_specific_buffer)
5682 free (globalize_specific_buffer);
5683
5684 if (keepglobal_specific_buffer)
5685 free (keepglobal_specific_buffer);
5686
5687 if (weaken_specific_buffer)
5688 free (weaken_specific_buffer);
5689
5690 return 0;
5691 }
5692
5693 int
5694 main (int argc, char *argv[])
5695 {
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);
5704
5705 program_name = argv[0];
5706 xmalloc_set_program_name (program_name);
5707
5708 START_PROGRESS (program_name, 0);
5709
5710 expandargv (&argc, &argv);
5711
5712 strip_symbols = STRIP_UNDEF;
5713 discard_locals = LOCALS_UNDEF;
5714
5715 if (bfd_init () != BFD_INIT_MAGIC)
5716 fatal (_("fatal error: libbfd ABI mismatch"));
5717 set_default_bfd_target ();
5718
5719 if (is_strip < 0)
5720 {
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)
5725 {
5726 i -= 4;
5727 program_name[i] = '\0';
5728 }
5729 #endif
5730 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
5731 }
5732
5733 create_symbol_htabs ();
5734
5735 if (argv != NULL)
5736 bfd_set_error_program_name (argv[0]);
5737
5738 if (is_strip)
5739 strip_main (argc, argv);
5740 else
5741 copy_main (argc, argv);
5742
5743 END_PROGRESS (program_name);
5744
5745 return status;
5746 }
This page took 0.17826 seconds and 4 git commands to generate.