Change the output of readelf's note display so that the "Data size" column header...
[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 relsize = bfd_get_reloc_upper_bound (abfd, sec);
2000 if (relsize > 0)
2001 {
2002 arelent ** relpp;
2003 long relcount;
2004
2005 /* If there are relocs associated with this section then we
2006 cannot safely merge it. */
2007 relpp = (arelent **) xmalloc (relsize);
2008 relcount = bfd_canonicalize_reloc (abfd, sec, relpp, isympp);
2009 free (relpp);
2010 if (relcount != 0)
2011 goto done;
2012 }
2013
2014 /* Make a copy of the notes and convert to our internal format.
2015 Minimum size of a note is 12 bytes. Also locate the version
2016 notes and check them. */
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 /* We used to require that the first note be a version note,
2186 but this is no longer enforced. Due to the problems with
2187 linking sections with the same name (eg .gnu.build.note.hot)
2188 we cannot guarantee that the first note will be a version note. */
2189
2190 /* Now merge the notes. The rules are:
2191 1. Preserve the ordering of the notes.
2192 2. Preserve any NT_GNU_BUILD_ATTRIBUTE_FUNC notes.
2193 3. Eliminate any NT_GNU_BUILD_ATTRIBUTE_OPEN notes that have the same
2194 full name field as the immediately preceeding note with the same type
2195 of name and whose address ranges coincide.
2196 IE - if there are gaps in the coverage of the notes, then these gaps
2197 must be preserved.
2198 4. Combine the numeric value of any NT_GNU_BUILD_ATTRIBUTE_OPEN notes
2199 of type GNU_BUILD_ATTRIBUTE_STACK_SIZE.
2200 5. If an NT_GNU_BUILD_ATTRIBUTE_OPEN note is going to be preserved and
2201 its description field is empty then the nearest preceeding OPEN note
2202 with a non-empty description field must also be preserved *OR* the
2203 description field of the note must be changed to contain the starting
2204 address to which it refers.
2205 6. Notes with the same start and end address can be deleted.
2206 7. FIXME: Elminate duplicate version notes - even function specific ones ? */
2207 for (pnote = pnotes; pnote < pnotes_end; pnote ++)
2208 {
2209 int note_type;
2210 objcopy_internal_note * back;
2211 objcopy_internal_note * prev_open_with_range = NULL;
2212
2213 /* Rule 6 - delete 0-range notes. */
2214 if (pnote->start == pnote->end)
2215 {
2216 duplicate_found = TRUE;
2217 pnote->note.type = 0;
2218 continue;
2219 }
2220
2221 /* Rule 2 - preserve function notes. */
2222 if (! is_open_note (pnote))
2223 {
2224 int iter;
2225
2226 /* Check to see if there is an identical previous function note.
2227 This can happen with overlays for example. */
2228 for (iter = 0, back = pnote -1; back >= pnotes; back --)
2229 {
2230 if (back->start == pnote->start
2231 && back->end == pnote->end
2232 && back->note.namesz == pnote->note.namesz
2233 && memcmp (back->note.namedata, pnote->note.namedata, pnote->note.namesz) == 0)
2234 {
2235 duplicate_found = TRUE;
2236 pnote->note.type = 0;
2237 break;
2238 }
2239
2240 /* Don't scan too far back however. */
2241 if (iter ++ > 16)
2242 break;
2243 }
2244 continue;
2245 }
2246
2247 note_type = pnote->note.namedata[attribute_type_byte];
2248
2249 /* Scan backwards from pnote, looking for duplicates.
2250 Clear the type field of any found - but do not delete them just yet. */
2251 for (back = pnote - 1; back >= pnotes; back --)
2252 {
2253 int back_type = back->note.namedata[attribute_type_byte];
2254
2255 /* If this is the first open note with an address
2256 range that we have encountered then record it. */
2257 if (prev_open_with_range == NULL
2258 && back->note.descsz > 0
2259 && ! is_func_note (back))
2260 prev_open_with_range = back;
2261
2262 if (! is_open_note (back))
2263 continue;
2264
2265 /* If the two notes are different then keep on searching. */
2266 if (back_type != note_type)
2267 continue;
2268
2269 /* Rule 4 - combine stack size notes. */
2270 if (back_type == GNU_BUILD_ATTRIBUTE_STACK_SIZE)
2271 {
2272 unsigned char * name;
2273 unsigned long note_val;
2274 unsigned long back_val;
2275 unsigned int shift;
2276 unsigned int bytes;
2277 unsigned long byte;
2278
2279 for (shift = 0, note_val = 0,
2280 bytes = pnote->note.namesz - val_start,
2281 name = (unsigned char *) pnote->note.namedata + val_start;
2282 bytes--;)
2283 {
2284 byte = (* name ++) & 0xff;
2285 note_val |= byte << shift;
2286 shift += 8;
2287 }
2288
2289 for (shift = 0, back_val = 0,
2290 bytes = back->note.namesz - val_start,
2291 name = (unsigned char *) back->note.namedata + val_start;
2292 bytes--;)
2293 {
2294 byte = (* name ++) & 0xff;
2295 back_val |= byte << shift;
2296 shift += 8;
2297 }
2298
2299 back_val += note_val;
2300 if (num_bytes (back_val) >= back->note.namesz - val_start)
2301 {
2302 /* We have a problem - the new value requires more bytes of
2303 storage in the name field than are available. Currently
2304 we have no way of fixing this, so we just preserve both
2305 notes. */
2306 continue;
2307 }
2308
2309 /* Write the new val into back. */
2310 name = (unsigned char *) back->note.namedata + val_start;
2311 while (name < (unsigned char *) back->note.namedata
2312 + back->note.namesz)
2313 {
2314 byte = back_val & 0xff;
2315 * name ++ = byte;
2316 if (back_val == 0)
2317 break;
2318 back_val >>= 8;
2319 }
2320
2321 duplicate_found = TRUE;
2322 pnote->note.type = 0;
2323 break;
2324 }
2325
2326 /* Rule 3 - combine identical open notes. */
2327 if (back->note.namesz == pnote->note.namesz
2328 && memcmp (back->note.namedata,
2329 pnote->note.namedata, back->note.namesz) == 0
2330 && ! gap_exists (back, pnote))
2331 {
2332 duplicate_found = TRUE;
2333 pnote->note.type = 0;
2334
2335 if (pnote->end > back->end)
2336 back->end = pnote->end;
2337
2338 if (version_3_seen)
2339 back->modified = TRUE;
2340 break;
2341 }
2342
2343 /* Rule 5 - Since we are keeping this note we must check to see
2344 if its description refers back to an earlier OPEN version
2345 note that has been scheduled for deletion. If so then we
2346 must make sure that version note is also preserved. */
2347 if (version_3_seen)
2348 {
2349 /* As of version 3 we can just
2350 move the range into the note. */
2351 pnote->modified = TRUE;
2352 pnote->note.type = NT_GNU_BUILD_ATTRIBUTE_FUNC;
2353 back->modified = TRUE;
2354 back->note.type = NT_GNU_BUILD_ATTRIBUTE_FUNC;
2355 }
2356 else
2357 {
2358 if (pnote->note.descsz == 0
2359 && prev_open_with_range != NULL
2360 && prev_open_with_range->note.type == 0)
2361 prev_open_with_range->note.type = NT_GNU_BUILD_ATTRIBUTE_OPEN;
2362 }
2363
2364 /* We have found a similar attribute but the details do not match.
2365 Stop searching backwards. */
2366 break;
2367 }
2368 }
2369
2370 if (duplicate_found)
2371 {
2372 bfd_byte * new_contents;
2373 bfd_byte * old;
2374 bfd_byte * new;
2375 bfd_size_type new_size;
2376 bfd_vma prev_start = 0;
2377 bfd_vma prev_end = 0;
2378
2379 /* Eliminate the duplicates. */
2380 new = new_contents = xmalloc (size);
2381 for (pnote = pnotes, old = contents;
2382 pnote < pnotes_end;
2383 pnote ++)
2384 {
2385 bfd_size_type note_size = 12 + pnote->note.namesz + pnote->note.descsz;
2386
2387 if (pnote->note.type != 0)
2388 {
2389 if (pnote->modified)
2390 {
2391 /* If the note has been modified then we must copy it by
2392 hand, potentially adding in a new description field. */
2393 if (pnote->start == prev_start && pnote->end == prev_end)
2394 {
2395 bfd_put_32 (abfd, pnote->note.namesz, new);
2396 bfd_put_32 (abfd, 0, new + 4);
2397 bfd_put_32 (abfd, pnote->note.type, new + 8);
2398 new += 12;
2399 memcpy (new, pnote->note.namedata, pnote->note.namesz);
2400 new += pnote->note.namesz;
2401 }
2402 else
2403 {
2404 bfd_put_32 (abfd, pnote->note.namesz, new);
2405 bfd_put_32 (abfd, is_64bit (abfd) ? 16 : 8, new + 4);
2406 bfd_put_32 (abfd, pnote->note.type, new + 8);
2407 new += 12;
2408 memcpy (new, pnote->note.namedata, pnote->note.namesz);
2409 new += pnote->note.namesz;
2410 if (is_64bit (abfd))
2411 {
2412 bfd_put_64 (abfd, pnote->start, new);
2413 bfd_put_64 (abfd, pnote->end, new + 8);
2414 new += 16;
2415 }
2416 else
2417 {
2418 bfd_put_32 (abfd, pnote->start, new);
2419 bfd_put_32 (abfd, pnote->end, new + 4);
2420 new += 8;
2421 }
2422 }
2423 }
2424 else
2425 {
2426 memcpy (new, old, note_size);
2427 new += note_size;
2428 }
2429 prev_start = pnote->start;
2430 prev_end = pnote->end;
2431 }
2432
2433 old += note_size;
2434 }
2435
2436 new_size = new - new_contents;
2437 memcpy (contents, new_contents, new_size);
2438 size = new_size;
2439 free (new_contents);
2440 }
2441
2442 done:
2443 if (err)
2444 {
2445 bfd_set_error (bfd_error_bad_value);
2446 bfd_nonfatal_message (NULL, abfd, sec, err);
2447 status = 1;
2448 }
2449
2450 free (pnotes);
2451 return size;
2452 }
2453
2454 /* Copy object file IBFD onto OBFD.
2455 Returns TRUE upon success, FALSE otherwise. */
2456
2457 static bfd_boolean
2458 copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
2459 {
2460 bfd_vma start;
2461 long symcount;
2462 asection **osections = NULL;
2463 asection *osec;
2464 asection *gnu_debuglink_section = NULL;
2465 bfd_size_type *gaps = NULL;
2466 bfd_size_type max_gap = 0;
2467 long symsize;
2468 void *dhandle;
2469 enum bfd_architecture iarch;
2470 unsigned int imach;
2471 unsigned int c, i;
2472
2473 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
2474 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
2475 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2476 {
2477 /* PR 17636: Call non-fatal so that we return to our parent who
2478 may need to tidy temporary files. */
2479 non_fatal (_("Unable to change endianness of input file(s)"));
2480 return FALSE;
2481 }
2482
2483 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2484 {
2485 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
2486 return FALSE;
2487 }
2488
2489 if (ibfd->sections == NULL)
2490 {
2491 non_fatal (_("error: the input file '%s' has no sections"),
2492 bfd_get_archive_filename (ibfd));
2493 return FALSE;
2494 }
2495
2496 if (ibfd->xvec->flavour != bfd_target_elf_flavour)
2497 {
2498 if ((do_debug_sections & compress) != 0
2499 && do_debug_sections != compress)
2500 {
2501 non_fatal (_("--compress-debug-sections=[zlib|zlib-gnu|zlib-gabi] is unsupported on `%s'"),
2502 bfd_get_archive_filename (ibfd));
2503 return FALSE;
2504 }
2505
2506 if (do_elf_stt_common)
2507 {
2508 non_fatal (_("--elf-stt-common=[yes|no] is unsupported on `%s'"),
2509 bfd_get_archive_filename (ibfd));
2510 return FALSE;
2511 }
2512 }
2513
2514 if (verbose)
2515 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
2516 bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
2517 bfd_get_filename (obfd), bfd_get_target (obfd));
2518
2519 if (extract_symbol)
2520 start = 0;
2521 else
2522 {
2523 if (set_start_set)
2524 start = set_start;
2525 else
2526 start = bfd_get_start_address (ibfd);
2527 start += change_start;
2528 }
2529
2530 /* Neither the start address nor the flags
2531 need to be set for a core file. */
2532 if (bfd_get_format (obfd) != bfd_core)
2533 {
2534 flagword flags;
2535
2536 flags = bfd_get_file_flags (ibfd);
2537 flags |= bfd_flags_to_set;
2538 flags &= ~bfd_flags_to_clear;
2539 flags &= bfd_applicable_file_flags (obfd);
2540
2541 if (strip_symbols == STRIP_ALL)
2542 flags &= ~HAS_RELOC;
2543
2544 if (!bfd_set_start_address (obfd, start)
2545 || !bfd_set_file_flags (obfd, flags))
2546 {
2547 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2548 return FALSE;
2549 }
2550 }
2551
2552 /* Copy architecture of input file to output file. */
2553 iarch = bfd_get_arch (ibfd);
2554 imach = bfd_get_mach (ibfd);
2555 if (input_arch)
2556 {
2557 if (bfd_get_arch_info (ibfd) == NULL
2558 || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown)
2559 {
2560 iarch = input_arch->arch;
2561 imach = input_arch->mach;
2562 }
2563 else
2564 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
2565 bfd_get_archive_filename (ibfd));
2566 }
2567 if (!bfd_set_arch_mach (obfd, iarch, imach)
2568 && (ibfd->target_defaulted
2569 || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
2570 {
2571 if (bfd_get_arch (ibfd) == bfd_arch_unknown)
2572 non_fatal (_("Unable to recognise the format of the input file `%s'"),
2573 bfd_get_archive_filename (ibfd));
2574 else
2575 non_fatal (_("Output file cannot represent architecture `%s'"),
2576 bfd_printable_arch_mach (bfd_get_arch (ibfd),
2577 bfd_get_mach (ibfd)));
2578 return FALSE;
2579 }
2580
2581 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
2582 {
2583 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2584 return FALSE;
2585 }
2586
2587 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2588 && bfd_pei_p (obfd))
2589 {
2590 /* Set up PE parameters. */
2591 pe_data_type *pe = pe_data (obfd);
2592
2593 /* Copy PE parameters before changing them. */
2594 if (ibfd->xvec->flavour == bfd_target_coff_flavour
2595 && bfd_pei_p (ibfd))
2596 pe->pe_opthdr = pe_data (ibfd)->pe_opthdr;
2597
2598 if (pe_file_alignment != (bfd_vma) -1)
2599 pe->pe_opthdr.FileAlignment = pe_file_alignment;
2600 else
2601 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
2602
2603 if (pe_heap_commit != (bfd_vma) -1)
2604 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_commit;
2605
2606 if (pe_heap_reserve != (bfd_vma) -1)
2607 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_reserve;
2608
2609 if (pe_image_base != (bfd_vma) -1)
2610 pe->pe_opthdr.ImageBase = pe_image_base;
2611
2612 if (pe_section_alignment != (bfd_vma) -1)
2613 pe->pe_opthdr.SectionAlignment = pe_section_alignment;
2614 else
2615 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
2616
2617 if (pe_stack_commit != (bfd_vma) -1)
2618 pe->pe_opthdr.SizeOfStackCommit = pe_stack_commit;
2619
2620 if (pe_stack_reserve != (bfd_vma) -1)
2621 pe->pe_opthdr.SizeOfStackCommit = pe_stack_reserve;
2622
2623 if (pe_subsystem != -1)
2624 pe->pe_opthdr.Subsystem = pe_subsystem;
2625
2626 if (pe_major_subsystem_version != -1)
2627 pe->pe_opthdr.MajorSubsystemVersion = pe_major_subsystem_version;
2628
2629 if (pe_minor_subsystem_version != -1)
2630 pe->pe_opthdr.MinorSubsystemVersion = pe_minor_subsystem_version;
2631
2632 if (pe_file_alignment > pe_section_alignment)
2633 {
2634 char file_alignment[20], section_alignment[20];
2635
2636 sprintf_vma (file_alignment, pe_file_alignment);
2637 sprintf_vma (section_alignment, pe_section_alignment);
2638 non_fatal (_("warning: file alignment (0x%s) > section alignment (0x%s)"),
2639
2640 file_alignment, section_alignment);
2641 }
2642 }
2643
2644 if (isympp)
2645 free (isympp);
2646
2647 if (osympp != isympp)
2648 free (osympp);
2649
2650 isympp = NULL;
2651 osympp = NULL;
2652
2653 symsize = bfd_get_symtab_upper_bound (ibfd);
2654 if (symsize < 0)
2655 {
2656 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2657 return FALSE;
2658 }
2659
2660 osympp = isympp = (asymbol **) xmalloc (symsize);
2661 symcount = bfd_canonicalize_symtab (ibfd, isympp);
2662 if (symcount < 0)
2663 {
2664 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
2665 return FALSE;
2666 }
2667 /* PR 17512: file: d6323821
2668 If the symbol table could not be loaded do not pretend that we have
2669 any symbols. This trips us up later on when we load the relocs. */
2670 if (symcount == 0)
2671 {
2672 free (isympp);
2673 osympp = isympp = NULL;
2674 }
2675
2676 /* BFD mandates that all output sections be created and sizes set before
2677 any output is done. Thus, we traverse all sections multiple times. */
2678 bfd_map_over_sections (ibfd, setup_section, obfd);
2679
2680 if (!extract_symbol)
2681 setup_bfd_headers (ibfd, obfd);
2682
2683 if (add_sections != NULL)
2684 {
2685 struct section_add *padd;
2686 struct section_list *pset;
2687
2688 for (padd = add_sections; padd != NULL; padd = padd->next)
2689 {
2690 flagword flags;
2691
2692 pset = find_section_list (padd->name, FALSE,
2693 SECTION_CONTEXT_SET_FLAGS);
2694 if (pset != NULL)
2695 flags = pset->flags | SEC_HAS_CONTENTS;
2696 else
2697 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
2698
2699 /* bfd_make_section_with_flags() does not return very helpful
2700 error codes, so check for the most likely user error first. */
2701 if (bfd_get_section_by_name (obfd, padd->name))
2702 {
2703 bfd_nonfatal_message (NULL, obfd, NULL,
2704 _("can't add section '%s'"), padd->name);
2705 return FALSE;
2706 }
2707 else
2708 {
2709 /* We use LINKER_CREATED here so that the backend hooks
2710 will create any special section type information,
2711 instead of presuming we know what we're doing merely
2712 because we set the flags. */
2713 padd->section = bfd_make_section_with_flags
2714 (obfd, padd->name, flags | SEC_LINKER_CREATED);
2715 if (padd->section == NULL)
2716 {
2717 bfd_nonfatal_message (NULL, obfd, NULL,
2718 _("can't create section `%s'"),
2719 padd->name);
2720 return FALSE;
2721 }
2722 }
2723
2724 if (! bfd_set_section_size (obfd, padd->section, padd->size))
2725 {
2726 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2727 return FALSE;
2728 }
2729
2730 pset = find_section_list (padd->name, FALSE,
2731 SECTION_CONTEXT_SET_VMA | SECTION_CONTEXT_ALTER_VMA);
2732 if (pset != NULL
2733 && ! bfd_set_section_vma (obfd, padd->section, pset->vma_val))
2734 {
2735 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2736 return FALSE;
2737 }
2738
2739 pset = find_section_list (padd->name, FALSE,
2740 SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_ALTER_LMA);
2741 if (pset != NULL)
2742 {
2743 padd->section->lma = pset->lma_val;
2744
2745 if (! bfd_set_section_alignment
2746 (obfd, padd->section,
2747 bfd_section_alignment (obfd, padd->section)))
2748 {
2749 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
2750 return FALSE;
2751 }
2752 }
2753 }
2754 }
2755
2756 if (update_sections != NULL)
2757 {
2758 struct section_add *pupdate;
2759
2760 for (pupdate = update_sections;
2761 pupdate != NULL;
2762 pupdate = pupdate->next)
2763 {
2764 pupdate->section = bfd_get_section_by_name (ibfd, pupdate->name);
2765 if (pupdate->section == NULL)
2766 {
2767 non_fatal (_("error: %s not found, can't be updated"), pupdate->name);
2768 return FALSE;
2769 }
2770
2771 osec = pupdate->section->output_section;
2772 if (! bfd_set_section_size (obfd, osec, pupdate->size))
2773 {
2774 bfd_nonfatal_message (NULL, obfd, osec, NULL);
2775 return FALSE;
2776 }
2777 }
2778 }
2779
2780 if (merge_notes)
2781 {
2782 /* This palaver is necessary because we must set the output
2783 section size first, before its contents are ready. */
2784 osec = bfd_get_section_by_name (ibfd, GNU_BUILD_ATTRS_SECTION_NAME);
2785 if (osec && is_merged_note_section (ibfd, osec))
2786 {
2787 bfd_size_type size;
2788
2789 size = bfd_get_section_size (osec);
2790 if (size == 0)
2791 {
2792 bfd_nonfatal_message (NULL, ibfd, osec, _("warning: note section is empty"));
2793 merge_notes = FALSE;
2794 }
2795 else if (! bfd_get_full_section_contents (ibfd, osec, & merged_notes))
2796 {
2797 bfd_nonfatal_message (NULL, ibfd, osec, _("warning: could not load note section"));
2798 free (merged_notes);
2799 merged_notes = NULL;
2800 merge_notes = FALSE;
2801 }
2802 else
2803 {
2804 merged_size = merge_gnu_build_notes (ibfd, osec, size, merged_notes);
2805 if (merged_size == size)
2806 {
2807 /* Merging achieves nothing. */
2808 free (merged_notes);
2809 merged_notes = NULL;
2810 merge_notes = FALSE;
2811 merged_size = 0;
2812 }
2813 else
2814 {
2815 if (osec->output_section == NULL
2816 || ! bfd_set_section_size (obfd, osec->output_section, merged_size))
2817 {
2818 bfd_nonfatal_message (NULL, obfd, osec, _("warning: failed to set merged notes size"));
2819 free (merged_notes);
2820 merged_notes = NULL;
2821 merge_notes = FALSE;
2822 merged_size = 0;
2823 }
2824 }
2825 }
2826 }
2827 }
2828
2829 if (dump_sections != NULL)
2830 {
2831 struct section_add * pdump;
2832
2833 for (pdump = dump_sections; pdump != NULL; pdump = pdump->next)
2834 {
2835 osec = bfd_get_section_by_name (ibfd, pdump->name);
2836 if (osec == NULL)
2837 {
2838 bfd_nonfatal_message (NULL, ibfd, NULL,
2839 _("can't dump section '%s' - it does not exist"),
2840 pdump->name);
2841 continue;
2842 }
2843
2844 if ((bfd_get_section_flags (ibfd, osec) & SEC_HAS_CONTENTS) == 0)
2845 {
2846 bfd_nonfatal_message (NULL, ibfd, osec,
2847 _("can't dump section - it has no contents"));
2848 continue;
2849 }
2850
2851 bfd_size_type size = bfd_get_section_size (osec);
2852 if (size == 0)
2853 {
2854 bfd_nonfatal_message (NULL, ibfd, osec,
2855 _("can't dump section - it is empty"));
2856 continue;
2857 }
2858
2859 FILE * f;
2860 f = fopen (pdump->filename, FOPEN_WB);
2861 if (f == NULL)
2862 {
2863 bfd_nonfatal_message (pdump->filename, NULL, NULL,
2864 _("could not open section dump file"));
2865 continue;
2866 }
2867
2868 bfd_byte *contents;
2869 if (bfd_malloc_and_get_section (ibfd, osec, &contents))
2870 {
2871 if (fwrite (contents, 1, size, f) != size)
2872 {
2873 non_fatal (_("error writing section contents to %s (error: %s)"),
2874 pdump->filename,
2875 strerror (errno));
2876 free (contents);
2877 fclose (f);
2878 return FALSE;
2879 }
2880 }
2881 else
2882 bfd_nonfatal_message (NULL, ibfd, osec,
2883 _("could not retrieve section contents"));
2884
2885 fclose (f);
2886 free (contents);
2887 }
2888 }
2889
2890 if (gnu_debuglink_filename != NULL)
2891 {
2892 /* PR 15125: Give a helpful warning message if
2893 the debuglink section already exists, and
2894 allow the rest of the copy to complete. */
2895 if (bfd_get_section_by_name (obfd, ".gnu_debuglink"))
2896 {
2897 non_fatal (_("%s: debuglink section already exists"),
2898 bfd_get_filename (obfd));
2899 gnu_debuglink_filename = NULL;
2900 }
2901 else
2902 {
2903 gnu_debuglink_section = bfd_create_gnu_debuglink_section
2904 (obfd, gnu_debuglink_filename);
2905
2906 if (gnu_debuglink_section == NULL)
2907 {
2908 bfd_nonfatal_message (NULL, obfd, NULL,
2909 _("cannot create debug link section `%s'"),
2910 gnu_debuglink_filename);
2911 return FALSE;
2912 }
2913
2914 /* Special processing for PE format files. We
2915 have no way to distinguish PE from COFF here. */
2916 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour)
2917 {
2918 bfd_vma debuglink_vma;
2919 asection * highest_section;
2920
2921 /* The PE spec requires that all sections be adjacent and sorted
2922 in ascending order of VMA. It also specifies that debug
2923 sections should be last. This is despite the fact that debug
2924 sections are not loaded into memory and so in theory have no
2925 use for a VMA.
2926
2927 This means that the debuglink section must be given a non-zero
2928 VMA which makes it contiguous with other debug sections. So
2929 walk the current section list, find the section with the
2930 highest VMA and start the debuglink section after that one. */
2931 for (osec = obfd->sections, highest_section = NULL;
2932 osec != NULL;
2933 osec = osec->next)
2934 if (osec->vma > 0
2935 && (highest_section == NULL
2936 || osec->vma > highest_section->vma))
2937 highest_section = osec;
2938
2939 if (highest_section)
2940 debuglink_vma = BFD_ALIGN (highest_section->vma
2941 + highest_section->size,
2942 /* FIXME: We ought to be using
2943 COFF_PAGE_SIZE here or maybe
2944 bfd_get_section_alignment() (if it
2945 was set) but since this is for PE
2946 and we know the required alignment
2947 it is easier just to hard code it. */
2948 0x1000);
2949 else
2950 /* Umm, not sure what to do in this case. */
2951 debuglink_vma = 0x1000;
2952
2953 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
2954 }
2955 }
2956 }
2957
2958 c = bfd_count_sections (obfd);
2959 if (c != 0
2960 && (gap_fill_set || pad_to_set))
2961 {
2962 asection **set;
2963
2964 /* We must fill in gaps between the sections and/or we must pad
2965 the last section to a specified address. We do this by
2966 grabbing a list of the sections, sorting them by VMA, and
2967 increasing the section sizes as required to fill the gaps.
2968 We write out the gap contents below. */
2969
2970 osections = (asection **) xmalloc (c * sizeof (asection *));
2971 set = osections;
2972 bfd_map_over_sections (obfd, get_sections, &set);
2973
2974 qsort (osections, c, sizeof (asection *), compare_section_lma);
2975
2976 gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type));
2977 memset (gaps, 0, c * sizeof (bfd_size_type));
2978
2979 if (gap_fill_set)
2980 {
2981 for (i = 0; i < c - 1; i++)
2982 {
2983 flagword flags;
2984 bfd_size_type size;
2985 bfd_vma gap_start, gap_stop;
2986
2987 flags = bfd_get_section_flags (obfd, osections[i]);
2988 if ((flags & SEC_HAS_CONTENTS) == 0
2989 || (flags & SEC_LOAD) == 0)
2990 continue;
2991
2992 size = bfd_section_size (obfd, osections[i]);
2993 gap_start = bfd_section_lma (obfd, osections[i]) + size;
2994 gap_stop = bfd_section_lma (obfd, osections[i + 1]);
2995 if (gap_start < gap_stop)
2996 {
2997 if (! bfd_set_section_size (obfd, osections[i],
2998 size + (gap_stop - gap_start)))
2999 {
3000 bfd_nonfatal_message (NULL, obfd, osections[i],
3001 _("Can't fill gap after section"));
3002 status = 1;
3003 break;
3004 }
3005 gaps[i] = gap_stop - gap_start;
3006 if (max_gap < gap_stop - gap_start)
3007 max_gap = gap_stop - gap_start;
3008 }
3009 }
3010 }
3011
3012 if (pad_to_set)
3013 {
3014 bfd_vma lma;
3015 bfd_size_type size;
3016
3017 lma = bfd_section_lma (obfd, osections[c - 1]);
3018 size = bfd_section_size (obfd, osections[c - 1]);
3019 if (lma + size < pad_to)
3020 {
3021 if (! bfd_set_section_size (obfd, osections[c - 1],
3022 pad_to - lma))
3023 {
3024 bfd_nonfatal_message (NULL, obfd, osections[c - 1],
3025 _("can't add padding"));
3026 status = 1;
3027 }
3028 else
3029 {
3030 gaps[c - 1] = pad_to - (lma + size);
3031 if (max_gap < pad_to - (lma + size))
3032 max_gap = pad_to - (lma + size);
3033 }
3034 }
3035 }
3036 }
3037
3038 /* Symbol filtering must happen after the output sections
3039 have been created, but before their contents are set. */
3040 dhandle = NULL;
3041 if (convert_debugging)
3042 dhandle = read_debugging_info (ibfd, isympp, symcount, FALSE);
3043
3044 if (strip_symbols == STRIP_DEBUG
3045 || strip_symbols == STRIP_ALL
3046 || strip_symbols == STRIP_UNNEEDED
3047 || strip_symbols == STRIP_NONDEBUG
3048 || strip_symbols == STRIP_DWO
3049 || strip_symbols == STRIP_NONDWO
3050 || discard_locals != LOCALS_UNDEF
3051 || localize_hidden
3052 || htab_elements (strip_specific_htab) != 0
3053 || htab_elements (keep_specific_htab) != 0
3054 || htab_elements (localize_specific_htab) != 0
3055 || htab_elements (globalize_specific_htab) != 0
3056 || htab_elements (keepglobal_specific_htab) != 0
3057 || htab_elements (weaken_specific_htab) != 0
3058 || htab_elements (redefine_specific_htab) != 0
3059 || prefix_symbols_string
3060 || sections_removed
3061 || sections_copied
3062 || convert_debugging
3063 || change_leading_char
3064 || remove_leading_char
3065 || section_rename_list
3066 || weaken
3067 || add_symbols)
3068 {
3069 /* Mark symbols used in output relocations so that they
3070 are kept, even if they are local labels or static symbols.
3071
3072 Note we iterate over the input sections examining their
3073 relocations since the relocations for the output sections
3074 haven't been set yet. mark_symbols_used_in_relocations will
3075 ignore input sections which have no corresponding output
3076 section. */
3077 if (strip_symbols != STRIP_ALL)
3078 {
3079 bfd_set_error (bfd_error_no_error);
3080 bfd_map_over_sections (ibfd,
3081 mark_symbols_used_in_relocations,
3082 isympp);
3083 if (bfd_get_error () != bfd_error_no_error)
3084 {
3085 status = 1;
3086 return FALSE;
3087 }
3088 }
3089
3090 osympp = (asymbol **) xmalloc ((symcount + add_symbols + 1) * sizeof (asymbol *));
3091 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
3092 }
3093
3094 if (convert_debugging && dhandle != NULL)
3095 {
3096 bfd_boolean res;
3097
3098 res = write_debugging_info (obfd, dhandle, &symcount, &osympp);
3099
3100 free (dhandle);
3101 dhandle = NULL; /* Paranoia... */
3102
3103 if (! res)
3104 {
3105 status = 1;
3106 return FALSE;
3107 }
3108 }
3109
3110 bfd_set_symtab (obfd, osympp, symcount);
3111
3112 /* This has to happen before section positions are set. */
3113 bfd_map_over_sections (ibfd, copy_relocations_in_section, obfd);
3114
3115 /* This has to happen after the symbol table has been set. */
3116 bfd_map_over_sections (ibfd, copy_section, obfd);
3117
3118 if (add_sections != NULL)
3119 {
3120 struct section_add *padd;
3121
3122 for (padd = add_sections; padd != NULL; padd = padd->next)
3123 {
3124 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
3125 0, padd->size))
3126 {
3127 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
3128 return FALSE;
3129 }
3130 }
3131 }
3132
3133 if (update_sections != NULL)
3134 {
3135 struct section_add *pupdate;
3136
3137 for (pupdate = update_sections;
3138 pupdate != NULL;
3139 pupdate = pupdate->next)
3140 {
3141 osec = pupdate->section->output_section;
3142 if (! bfd_set_section_contents (obfd, osec, pupdate->contents,
3143 0, pupdate->size))
3144 {
3145 bfd_nonfatal_message (NULL, obfd, osec, NULL);
3146 return FALSE;
3147 }
3148 }
3149 }
3150
3151 if (merge_notes)
3152 {
3153 osec = bfd_get_section_by_name (obfd, GNU_BUILD_ATTRS_SECTION_NAME);
3154 if (osec && is_merged_note_section (obfd, osec))
3155 {
3156 if (! bfd_set_section_contents (obfd, osec, merged_notes, 0, merged_size))
3157 {
3158 bfd_nonfatal_message (NULL, obfd, osec, _("error: failed to copy merged notes into output"));
3159 return FALSE;
3160 }
3161 }
3162 else if (! is_strip)
3163 bfd_nonfatal_message (NULL, obfd, osec, _("could not find any mergeable note sections"));
3164 free (merged_notes);
3165 merged_notes = NULL;
3166 merge_notes = FALSE;
3167 }
3168
3169 if (gnu_debuglink_filename != NULL)
3170 {
3171 if (! bfd_fill_in_gnu_debuglink_section
3172 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
3173 {
3174 bfd_nonfatal_message (NULL, obfd, NULL,
3175 _("cannot fill debug link section `%s'"),
3176 gnu_debuglink_filename);
3177 return FALSE;
3178 }
3179 }
3180
3181 if (gap_fill_set || pad_to_set)
3182 {
3183 bfd_byte *buf;
3184
3185 /* Fill in the gaps. */
3186 if (max_gap > 8192)
3187 max_gap = 8192;
3188 buf = (bfd_byte *) xmalloc (max_gap);
3189 memset (buf, gap_fill, max_gap);
3190
3191 c = bfd_count_sections (obfd);
3192 for (i = 0; i < c; i++)
3193 {
3194 if (gaps[i] != 0)
3195 {
3196 bfd_size_type left;
3197 file_ptr off;
3198
3199 left = gaps[i];
3200 off = bfd_section_size (obfd, osections[i]) - left;
3201
3202 while (left > 0)
3203 {
3204 bfd_size_type now;
3205
3206 if (left > 8192)
3207 now = 8192;
3208 else
3209 now = left;
3210
3211 if (! bfd_set_section_contents (obfd, osections[i], buf,
3212 off, now))
3213 {
3214 bfd_nonfatal_message (NULL, obfd, osections[i], NULL);
3215 free (buf);
3216 return FALSE;
3217 }
3218
3219 left -= now;
3220 off += now;
3221 }
3222 }
3223 }
3224
3225 free (buf);
3226 free (gaps);
3227 gaps = NULL;
3228 }
3229
3230 /* Allow the BFD backend to copy any private data it understands
3231 from the input BFD to the output BFD. This is done last to
3232 permit the routine to look at the filtered symbol table, which is
3233 important for the ECOFF code at least. */
3234 if (! bfd_copy_private_bfd_data (ibfd, obfd))
3235 {
3236 bfd_nonfatal_message (NULL, obfd, NULL,
3237 _("error copying private BFD data"));
3238 return FALSE;
3239 }
3240
3241 /* Switch to the alternate machine code. We have to do this at the
3242 very end, because we only initialize the header when we create
3243 the first section. */
3244 if (use_alt_mach_code != 0)
3245 {
3246 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
3247 {
3248 non_fatal (_("this target does not support %lu alternative machine codes"),
3249 use_alt_mach_code);
3250 if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
3251 {
3252 non_fatal (_("treating that number as an absolute e_machine value instead"));
3253 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
3254 }
3255 else
3256 non_fatal (_("ignoring the alternative value"));
3257 }
3258 }
3259
3260 return TRUE;
3261 }
3262
3263 /* Read each archive element in turn from IBFD, copy the
3264 contents to temp file, and keep the temp file handle.
3265 If 'force_output_target' is TRUE then make sure that
3266 all elements in the new archive are of the type
3267 'output_target'. */
3268
3269 static void
3270 copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
3271 bfd_boolean force_output_target,
3272 const bfd_arch_info_type *input_arch)
3273 {
3274 struct name_list
3275 {
3276 struct name_list *next;
3277 const char *name;
3278 bfd *obfd;
3279 } *list, *l;
3280 bfd **ptr = &obfd->archive_head;
3281 bfd *this_element;
3282 char *dir;
3283 const char *filename;
3284
3285 /* PR 24281: It is not clear what should happen when copying a thin archive.
3286 One part is straight forward - if the output archive is in a different
3287 directory from the input archive then any relative paths in the library
3288 should be adjusted to the new location. But if any transformation
3289 options are active (eg strip, rename, add, etc) then the implication is
3290 that these should be applied to the files pointed to by the archive.
3291 But since objcopy is not destructive, this means that new files must be
3292 created, and there is no guidance for the names of the new files. (Plus
3293 this conflicts with one of the goals of thin libraries - only taking up
3294 a minimal amount of space in the file system).
3295
3296 So for now we fail if an attempt is made to copy such libraries. */
3297 if (ibfd->is_thin_archive)
3298 {
3299 status = 1;
3300 bfd_set_error (bfd_error_invalid_operation);
3301 bfd_nonfatal_message (NULL, ibfd, NULL,
3302 _("sorry: copying thin archives is not currently supported"));
3303 return;
3304 }
3305
3306 /* Make a temp directory to hold the contents. */
3307 dir = make_tempdir (bfd_get_filename (obfd));
3308 if (dir == NULL)
3309 fatal (_("cannot create tempdir for archive copying (error: %s)"),
3310 strerror (errno));
3311
3312 if (strip_symbols == STRIP_ALL)
3313 obfd->has_armap = FALSE;
3314 else
3315 obfd->has_armap = ibfd->has_armap;
3316 obfd->is_thin_archive = ibfd->is_thin_archive;
3317
3318 if (deterministic)
3319 obfd->flags |= BFD_DETERMINISTIC_OUTPUT;
3320
3321 list = NULL;
3322
3323 this_element = bfd_openr_next_archived_file (ibfd, NULL);
3324
3325 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
3326 {
3327 status = 1;
3328 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
3329 goto cleanup_and_exit;
3330 }
3331
3332 while (!status && this_element != NULL)
3333 {
3334 char *output_name;
3335 bfd *output_bfd;
3336 bfd *last_element;
3337 struct stat buf;
3338 int stat_status = 0;
3339 bfd_boolean del = TRUE;
3340 bfd_boolean ok_object;
3341
3342 /* PR binutils/17533: Do not allow directory traversal
3343 outside of the current directory tree by archive members. */
3344 if (! is_valid_archive_path (bfd_get_filename (this_element)))
3345 {
3346 non_fatal (_("illegal pathname found in archive member: %s"),
3347 bfd_get_filename (this_element));
3348 status = 1;
3349 goto cleanup_and_exit;
3350 }
3351
3352 /* Create an output file for this member. */
3353 output_name = concat (dir, "/",
3354 bfd_get_filename (this_element), (char *) 0);
3355
3356 /* If the file already exists, make another temp dir. */
3357 if (stat (output_name, &buf) >= 0)
3358 {
3359 char * tmpdir = make_tempdir (output_name);
3360
3361 free (output_name);
3362 if (tmpdir == NULL)
3363 {
3364 non_fatal (_("cannot create tempdir for archive copying (error: %s)"),
3365 strerror (errno));
3366 status = 1;
3367 goto cleanup_and_exit;
3368 }
3369
3370 l = (struct name_list *) xmalloc (sizeof (struct name_list));
3371 l->name = tmpdir;
3372 l->next = list;
3373 l->obfd = NULL;
3374 list = l;
3375 output_name = concat (tmpdir, "/",
3376 bfd_get_filename (this_element), (char *) 0);
3377 }
3378
3379 if (preserve_dates)
3380 {
3381 stat_status = bfd_stat_arch_elt (this_element, &buf);
3382
3383 if (stat_status != 0)
3384 non_fatal (_("internal stat error on %s"),
3385 bfd_get_filename (this_element));
3386 }
3387
3388 l = (struct name_list *) xmalloc (sizeof (struct name_list));
3389 l->name = output_name;
3390 l->next = list;
3391 l->obfd = NULL;
3392 list = l;
3393
3394 ok_object = bfd_check_format (this_element, bfd_object);
3395 if (!ok_object)
3396 bfd_nonfatal_message (NULL, this_element, NULL,
3397 _("Unable to recognise the format of file"));
3398
3399 /* PR binutils/3110: Cope with archives
3400 containing multiple target types. */
3401 if (force_output_target || !ok_object)
3402 output_bfd = bfd_openw (output_name, output_target);
3403 else
3404 output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
3405
3406 if (output_bfd == NULL)
3407 {
3408 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3409 status = 1;
3410 goto cleanup_and_exit;
3411 }
3412
3413 if (ok_object)
3414 {
3415 del = !copy_object (this_element, output_bfd, input_arch);
3416
3417 if (del && bfd_get_arch (this_element) == bfd_arch_unknown)
3418 /* Try again as an unknown object file. */
3419 ok_object = FALSE;
3420 else if (!bfd_close (output_bfd))
3421 {
3422 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3423 /* Error in new object file. Don't change archive. */
3424 status = 1;
3425 }
3426 }
3427
3428 if (!ok_object)
3429 {
3430 del = !copy_unknown_object (this_element, output_bfd);
3431 if (!bfd_close_all_done (output_bfd))
3432 {
3433 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
3434 /* Error in new object file. Don't change archive. */
3435 status = 1;
3436 }
3437 }
3438
3439 if (del)
3440 {
3441 unlink (output_name);
3442 status = 1;
3443 }
3444 else
3445 {
3446 if (preserve_dates && stat_status == 0)
3447 set_times (output_name, &buf);
3448
3449 /* Open the newly output file and attach to our list. */
3450 output_bfd = bfd_openr (output_name, output_target);
3451
3452 l->obfd = output_bfd;
3453
3454 *ptr = output_bfd;
3455 ptr = &output_bfd->archive_next;
3456
3457 last_element = this_element;
3458
3459 this_element = bfd_openr_next_archived_file (ibfd, last_element);
3460
3461 bfd_close (last_element);
3462 }
3463 }
3464 *ptr = NULL;
3465
3466 filename = bfd_get_filename (obfd);
3467 if (!bfd_close (obfd))
3468 {
3469 status = 1;
3470 bfd_nonfatal_message (filename, NULL, NULL, NULL);
3471 }
3472
3473 filename = bfd_get_filename (ibfd);
3474 if (!bfd_close (ibfd))
3475 {
3476 status = 1;
3477 bfd_nonfatal_message (filename, NULL, NULL, NULL);
3478 }
3479
3480 cleanup_and_exit:
3481 /* Delete all the files that we opened. */
3482 {
3483 struct name_list * next;
3484
3485 for (l = list; l != NULL; l = next)
3486 {
3487 if (l->obfd == NULL)
3488 rmdir (l->name);
3489 else
3490 {
3491 bfd_close (l->obfd);
3492 unlink (l->name);
3493 }
3494 next = l->next;
3495 free (l);
3496 }
3497 }
3498
3499 rmdir (dir);
3500 }
3501
3502 static void
3503 set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_handling style)
3504 {
3505 /* This is only relevant to Coff targets. */
3506 if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
3507 {
3508 if (style == KEEP
3509 && bfd_get_flavour (input_bfd) == bfd_target_coff_flavour)
3510 style = bfd_coff_long_section_names (input_bfd) ? ENABLE : DISABLE;
3511 bfd_coff_set_long_section_names (output_bfd, style != DISABLE);
3512 }
3513 }
3514
3515 /* The top-level control. */
3516
3517 static void
3518 copy_file (const char *input_filename, const char *output_filename,
3519 const char *input_target, const char *output_target,
3520 const bfd_arch_info_type *input_arch)
3521 {
3522 bfd *ibfd;
3523 char **obj_matching;
3524 char **core_matching;
3525 off_t size = get_file_size (input_filename);
3526
3527 if (size < 1)
3528 {
3529 if (size == 0)
3530 non_fatal (_("error: the input file '%s' is empty"),
3531 input_filename);
3532 status = 1;
3533 return;
3534 }
3535
3536 /* To allow us to do "strip *" without dying on the first
3537 non-object file, failures are nonfatal. */
3538 ibfd = bfd_openr (input_filename, input_target);
3539 if (ibfd == NULL)
3540 {
3541 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3542 status = 1;
3543 return;
3544 }
3545
3546 switch (do_debug_sections)
3547 {
3548 case compress:
3549 case compress_zlib:
3550 case compress_gnu_zlib:
3551 case compress_gabi_zlib:
3552 ibfd->flags |= BFD_COMPRESS;
3553 /* Don't check if input is ELF here since this information is
3554 only available after bfd_check_format_matches is called. */
3555 if (do_debug_sections != compress_gnu_zlib)
3556 ibfd->flags |= BFD_COMPRESS_GABI;
3557 break;
3558 case decompress:
3559 ibfd->flags |= BFD_DECOMPRESS;
3560 break;
3561 default:
3562 break;
3563 }
3564
3565 switch (do_elf_stt_common)
3566 {
3567 case elf_stt_common:
3568 ibfd->flags |= BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON;
3569 break;
3570 break;
3571 case no_elf_stt_common:
3572 ibfd->flags |= BFD_CONVERT_ELF_COMMON;
3573 break;
3574 default:
3575 break;
3576 }
3577
3578 if (bfd_check_format (ibfd, bfd_archive))
3579 {
3580 bfd_boolean force_output_target;
3581 bfd *obfd;
3582
3583 /* bfd_get_target does not return the correct value until
3584 bfd_check_format succeeds. */
3585 if (output_target == NULL)
3586 {
3587 output_target = bfd_get_target (ibfd);
3588 force_output_target = FALSE;
3589 }
3590 else
3591 force_output_target = TRUE;
3592
3593 obfd = bfd_openw (output_filename, output_target);
3594 if (obfd == NULL)
3595 {
3596 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3597 status = 1;
3598 return;
3599 }
3600 /* This is a no-op on non-Coff targets. */
3601 set_long_section_mode (obfd, ibfd, long_section_names);
3602
3603 copy_archive (ibfd, obfd, output_target, force_output_target, input_arch);
3604 }
3605 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
3606 {
3607 bfd *obfd;
3608 do_copy:
3609
3610 /* bfd_get_target does not return the correct value until
3611 bfd_check_format succeeds. */
3612 if (output_target == NULL)
3613 output_target = bfd_get_target (ibfd);
3614
3615 obfd = bfd_openw (output_filename, output_target);
3616 if (obfd == NULL)
3617 {
3618 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3619 status = 1;
3620 return;
3621 }
3622 /* This is a no-op on non-Coff targets. */
3623 set_long_section_mode (obfd, ibfd, long_section_names);
3624
3625 if (! copy_object (ibfd, obfd, input_arch))
3626 status = 1;
3627
3628 /* PR 17512: file: 0f15796a.
3629 If the file could not be copied it may not be in a writeable
3630 state. So use bfd_close_all_done to avoid the possibility of
3631 writing uninitialised data into the file. */
3632 if (! (status ? bfd_close_all_done (obfd) : bfd_close (obfd)))
3633 {
3634 status = 1;
3635 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
3636 return;
3637 }
3638
3639 if (!bfd_close (ibfd))
3640 {
3641 status = 1;
3642 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3643 return;
3644 }
3645 }
3646 else
3647 {
3648 bfd_error_type obj_error = bfd_get_error ();
3649 bfd_error_type core_error;
3650
3651 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
3652 {
3653 /* This probably can't happen.. */
3654 if (obj_error == bfd_error_file_ambiguously_recognized)
3655 free (obj_matching);
3656 goto do_copy;
3657 }
3658
3659 core_error = bfd_get_error ();
3660 /* Report the object error in preference to the core error. */
3661 if (obj_error != core_error)
3662 bfd_set_error (obj_error);
3663
3664 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
3665
3666 if (obj_error == bfd_error_file_ambiguously_recognized)
3667 {
3668 list_matching_formats (obj_matching);
3669 free (obj_matching);
3670 }
3671 if (core_error == bfd_error_file_ambiguously_recognized)
3672 {
3673 list_matching_formats (core_matching);
3674 free (core_matching);
3675 }
3676
3677 status = 1;
3678 }
3679 }
3680
3681 /* Add a name to the section renaming list. */
3682
3683 static void
3684 add_section_rename (const char * old_name, const char * new_name,
3685 flagword flags)
3686 {
3687 section_rename * srename;
3688
3689 /* Check for conflicts first. */
3690 for (srename = section_rename_list; srename != NULL; srename = srename->next)
3691 if (strcmp (srename->old_name, old_name) == 0)
3692 {
3693 /* Silently ignore duplicate definitions. */
3694 if (strcmp (srename->new_name, new_name) == 0
3695 && srename->flags == flags)
3696 return;
3697
3698 fatal (_("Multiple renames of section %s"), old_name);
3699 }
3700
3701 srename = (section_rename *) xmalloc (sizeof (* srename));
3702
3703 srename->old_name = old_name;
3704 srename->new_name = new_name;
3705 srename->flags = flags;
3706 srename->next = section_rename_list;
3707
3708 section_rename_list = srename;
3709 }
3710
3711 /* Check the section rename list for a new name of the input section
3712 called OLD_NAME. Returns the new name if one is found and sets
3713 RETURNED_FLAGS if non-NULL to the flags to be used for this section. */
3714
3715 static const char *
3716 find_section_rename (const char *old_name, flagword *returned_flags)
3717 {
3718 const section_rename *srename;
3719
3720 for (srename = section_rename_list; srename != NULL; srename = srename->next)
3721 if (strcmp (srename->old_name, old_name) == 0)
3722 {
3723 if (returned_flags != NULL && srename->flags != (flagword) -1)
3724 *returned_flags = srename->flags;
3725
3726 return srename->new_name;
3727 }
3728
3729 return old_name;
3730 }
3731
3732 /* Once each of the sections is copied, we may still need to do some
3733 finalization work for private section headers. Do that here. */
3734
3735 static void
3736 setup_bfd_headers (bfd *ibfd, bfd *obfd)
3737 {
3738 /* Allow the BFD backend to copy any private data it understands
3739 from the input section to the output section. */
3740 if (! bfd_copy_private_header_data (ibfd, obfd))
3741 {
3742 status = 1;
3743 bfd_nonfatal_message (NULL, ibfd, NULL,
3744 _("error in private header data"));
3745 return;
3746 }
3747
3748 /* All went well. */
3749 return;
3750 }
3751
3752 /* Create a section in OBFD with the same
3753 name and attributes as ISECTION in IBFD. */
3754
3755 static void
3756 setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
3757 {
3758 bfd *obfd = (bfd *) obfdarg;
3759 struct section_list *p;
3760 sec_ptr osection;
3761 bfd_size_type size;
3762 bfd_vma vma;
3763 bfd_vma lma;
3764 flagword flags;
3765 const char *err;
3766 const char * name;
3767 char *prefix = NULL;
3768 bfd_boolean make_nobits;
3769
3770 if (is_strip_section (ibfd, isection))
3771 return;
3772
3773 /* Get the, possibly new, name of the output section. */
3774 name = bfd_section_name (ibfd, isection);
3775 flags = bfd_get_section_flags (ibfd, isection);
3776 name = find_section_rename (name, &flags);
3777
3778 /* Prefix sections. */
3779 if ((prefix_alloc_sections_string)
3780 && (bfd_get_section_flags (ibfd, isection) & SEC_ALLOC))
3781 prefix = prefix_alloc_sections_string;
3782 else if (prefix_sections_string)
3783 prefix = prefix_sections_string;
3784
3785 if (prefix)
3786 {
3787 char *n;
3788
3789 n = (char *) xmalloc (strlen (prefix) + strlen (name) + 1);
3790 strcpy (n, prefix);
3791 strcat (n, name);
3792 name = n;
3793 }
3794
3795 make_nobits = FALSE;
3796
3797 p = find_section_list (bfd_section_name (ibfd, isection), FALSE,
3798 SECTION_CONTEXT_SET_FLAGS);
3799 if (p != NULL)
3800 flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
3801 else if (strip_symbols == STRIP_NONDEBUG
3802 && (flags & (SEC_ALLOC | SEC_GROUP)) != 0
3803 && !is_nondebug_keep_contents_section (ibfd, isection))
3804 {
3805 flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
3806 if (obfd->xvec->flavour == bfd_target_elf_flavour)
3807 {
3808 make_nobits = TRUE;
3809
3810 /* Twiddle the input section flags so that it seems to
3811 elf.c:copy_private_bfd_data that section flags have not
3812 changed between input and output sections. This hack
3813 prevents wholesale rewriting of the program headers. */
3814 isection->flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
3815 }
3816 }
3817
3818 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
3819
3820 if (osection == NULL)
3821 {
3822 err = _("failed to create output section");
3823 goto loser;
3824 }
3825
3826 if (make_nobits)
3827 elf_section_type (osection) = SHT_NOBITS;
3828
3829 size = bfd_section_size (ibfd, isection);
3830 size = bfd_convert_section_size (ibfd, isection, obfd, size);
3831 if (copy_byte >= 0)
3832 size = (size + interleave - 1) / interleave * copy_width;
3833 else if (extract_symbol)
3834 size = 0;
3835 if (! bfd_set_section_size (obfd, osection, size))
3836 {
3837 err = _("failed to set size");
3838 goto loser;
3839 }
3840
3841 vma = bfd_section_vma (ibfd, isection);
3842 p = find_section_list (bfd_section_name (ibfd, isection), FALSE,
3843 SECTION_CONTEXT_ALTER_VMA | SECTION_CONTEXT_SET_VMA);
3844 if (p != NULL)
3845 {
3846 if (p->context & SECTION_CONTEXT_SET_VMA)
3847 vma = p->vma_val;
3848 else
3849 vma += p->vma_val;
3850 }
3851 else
3852 vma += change_section_address;
3853
3854 if (! bfd_set_section_vma (obfd, osection, vma))
3855 {
3856 err = _("failed to set vma");
3857 goto loser;
3858 }
3859
3860 lma = isection->lma;
3861 p = find_section_list (bfd_section_name (ibfd, isection), FALSE,
3862 SECTION_CONTEXT_ALTER_LMA | SECTION_CONTEXT_SET_LMA);
3863 if (p != NULL)
3864 {
3865 if (p->context & SECTION_CONTEXT_ALTER_LMA)
3866 lma += p->lma_val;
3867 else
3868 lma = p->lma_val;
3869 }
3870 else
3871 lma += change_section_address;
3872
3873 osection->lma = lma;
3874
3875 /* FIXME: This is probably not enough. If we change the LMA we
3876 may have to recompute the header for the file as well. */
3877 if (!bfd_set_section_alignment (obfd,
3878 osection,
3879 bfd_section_alignment (ibfd, isection)))
3880 {
3881 err = _("failed to set alignment");
3882 goto loser;
3883 }
3884
3885 /* Copy merge entity size. */
3886 osection->entsize = isection->entsize;
3887
3888 /* Copy compress status. */
3889 osection->compress_status = isection->compress_status;
3890
3891 /* This used to be mangle_section; we do here to avoid using
3892 bfd_get_section_by_name since some formats allow multiple
3893 sections with the same name. */
3894 isection->output_section = osection;
3895 isection->output_offset = 0;
3896
3897 if ((isection->flags & SEC_GROUP) != 0)
3898 {
3899 asymbol *gsym = group_signature (isection);
3900
3901 if (gsym != NULL)
3902 {
3903 gsym->flags |= BSF_KEEP;
3904 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
3905 elf_group_id (isection) = gsym;
3906 }
3907 }
3908
3909 /* Allow the BFD backend to copy any private data it understands
3910 from the input section to the output section. */
3911 if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
3912 {
3913 err = _("failed to copy private data");
3914 goto loser;
3915 }
3916
3917 /* All went well. */
3918 return;
3919
3920 loser:
3921 status = 1;
3922 bfd_nonfatal_message (NULL, obfd, osection, err);
3923 }
3924
3925 /* Return TRUE if input section ISECTION should be skipped. */
3926
3927 static bfd_boolean
3928 skip_section (bfd *ibfd, sec_ptr isection, bfd_boolean skip_copy)
3929 {
3930 sec_ptr osection;
3931 bfd_size_type size;
3932 flagword flags;
3933
3934 /* If we have already failed earlier on,
3935 do not keep on generating complaints now. */
3936 if (status != 0)
3937 return TRUE;
3938
3939 if (extract_symbol)
3940 return TRUE;
3941
3942 if (is_strip_section (ibfd, isection))
3943 return TRUE;
3944
3945 if (is_update_section (ibfd, isection))
3946 return TRUE;
3947
3948 /* When merging a note section we skip the copying of the contents,
3949 but not the copying of the relocs associated with the contents. */
3950 if (skip_copy && is_merged_note_section (ibfd, isection))
3951 return TRUE;
3952
3953 flags = bfd_get_section_flags (ibfd, isection);
3954 if ((flags & SEC_GROUP) != 0)
3955 return TRUE;
3956
3957 osection = isection->output_section;
3958 size = bfd_get_section_size (isection);
3959
3960 if (size == 0 || osection == 0)
3961 return TRUE;
3962
3963 return FALSE;
3964 }
3965
3966 /* Add section SECTION_PATTERN to the list of sections that will have their
3967 relocations removed. */
3968
3969 static void
3970 handle_remove_relocations_option (const char *section_pattern)
3971 {
3972 find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE_RELOCS);
3973 }
3974
3975 /* Return TRUE if ISECTION from IBFD should have its relocations removed,
3976 otherwise return FALSE. If the user has requested that relocations be
3977 removed from a section that does not have relocations then this
3978 function will still return TRUE. */
3979
3980 static bfd_boolean
3981 discard_relocations (bfd *ibfd ATTRIBUTE_UNUSED, asection *isection)
3982 {
3983 return (find_section_list (bfd_section_name (ibfd, isection), FALSE,
3984 SECTION_CONTEXT_REMOVE_RELOCS) != NULL);
3985 }
3986
3987 /* Wrapper for dealing with --remove-section (-R) command line arguments.
3988 A special case is detected here, if the user asks to remove a relocation
3989 section (one starting with ".rela" or ".rel") then this removal must
3990 be done using a different technique in a relocatable object. */
3991
3992 static void
3993 handle_remove_section_option (const char *section_pattern)
3994 {
3995 find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE);
3996 if (strncmp (section_pattern, ".rel", 4) == 0)
3997 {
3998 section_pattern += 4;
3999 if (*section_pattern == 'a')
4000 section_pattern++;
4001 if (*section_pattern)
4002 handle_remove_relocations_option (section_pattern);
4003 }
4004 sections_removed = TRUE;
4005 }
4006
4007 /* Copy relocations in input section ISECTION of IBFD to an output
4008 section with the same name in OBFDARG. If stripping then don't
4009 copy any relocation info. */
4010
4011 static void
4012 copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
4013 {
4014 bfd *obfd = (bfd *) obfdarg;
4015 long relsize;
4016 arelent **relpp;
4017 long relcount;
4018 sec_ptr osection;
4019
4020 if (skip_section (ibfd, isection, FALSE))
4021 return;
4022
4023 osection = isection->output_section;
4024
4025 /* Core files and DWO files do not need to be relocated. */
4026 if (bfd_get_format (obfd) == bfd_core
4027 || strip_symbols == STRIP_NONDWO
4028 || discard_relocations (ibfd, isection))
4029 relsize = 0;
4030 else
4031 {
4032 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
4033
4034 if (relsize < 0)
4035 {
4036 /* Do not complain if the target does not support relocations. */
4037 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
4038 relsize = 0;
4039 else
4040 {
4041 status = 1;
4042 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
4043 return;
4044 }
4045 }
4046 }
4047
4048 if (relsize == 0)
4049 {
4050 bfd_set_reloc (obfd, osection, NULL, 0);
4051 osection->flags &= ~SEC_RELOC;
4052 }
4053 else
4054 {
4055 if (isection->orelocation != NULL)
4056 {
4057 /* Some other function has already set up the output relocs
4058 for us, so scan those instead of the default relocs. */
4059 relcount = isection->reloc_count;
4060 relpp = isection->orelocation;
4061 }
4062 else
4063 {
4064 relpp = (arelent **) xmalloc (relsize);
4065 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
4066 if (relcount < 0)
4067 {
4068 status = 1;
4069 bfd_nonfatal_message (NULL, ibfd, isection,
4070 _("relocation count is negative"));
4071 return;
4072 }
4073 }
4074
4075 if (strip_symbols == STRIP_ALL)
4076 {
4077 /* Remove relocations which are not in
4078 keep_strip_specific_list. */
4079 arelent **temp_relpp;
4080 long temp_relcount = 0;
4081 long i;
4082
4083 temp_relpp = (arelent **) xmalloc (relsize);
4084 for (i = 0; i < relcount; i++)
4085 {
4086 /* PR 17512: file: 9e907e0c. */
4087 if (relpp[i]->sym_ptr_ptr
4088 /* PR 20096 */
4089 && * relpp[i]->sym_ptr_ptr)
4090 if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
4091 keep_specific_htab))
4092 temp_relpp [temp_relcount++] = relpp [i];
4093 }
4094 relcount = temp_relcount;
4095 if (isection->orelocation == NULL)
4096 free (relpp);
4097 relpp = temp_relpp;
4098 }
4099
4100 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
4101 if (relcount == 0)
4102 {
4103 osection->flags &= ~SEC_RELOC;
4104 free (relpp);
4105 }
4106 }
4107 }
4108
4109 /* Copy the data of input section ISECTION of IBFD
4110 to an output section with the same name in OBFD. */
4111
4112 static void
4113 copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
4114 {
4115 bfd *obfd = (bfd *) obfdarg;
4116 struct section_list *p;
4117 sec_ptr osection;
4118 bfd_size_type size;
4119
4120 if (skip_section (ibfd, isection, TRUE))
4121 return;
4122
4123 osection = isection->output_section;
4124 /* The output SHF_COMPRESSED section size is different from input if
4125 ELF classes of input and output aren't the same. We can't use
4126 the output section size since --interleave will shrink the output
4127 section. Size will be updated if the section is converted. */
4128 size = bfd_get_section_size (isection);
4129
4130 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
4131 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
4132 {
4133 bfd_byte *memhunk = NULL;
4134
4135 if (!bfd_get_full_section_contents (ibfd, isection, &memhunk)
4136 || !bfd_convert_section_contents (ibfd, isection, obfd,
4137 &memhunk, &size))
4138 {
4139 status = 1;
4140 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
4141 free (memhunk);
4142 return;
4143 }
4144
4145 if (reverse_bytes)
4146 {
4147 /* We don't handle leftover bytes (too many possible behaviors,
4148 and we don't know what the user wants). The section length
4149 must be a multiple of the number of bytes to swap. */
4150 if ((size % reverse_bytes) == 0)
4151 {
4152 unsigned long i, j;
4153 bfd_byte b;
4154
4155 for (i = 0; i < size; i += reverse_bytes)
4156 for (j = 0; j < (unsigned long)(reverse_bytes / 2); j++)
4157 {
4158 bfd_byte *m = (bfd_byte *) memhunk;
4159
4160 b = m[i + j];
4161 m[i + j] = m[(i + reverse_bytes) - (j + 1)];
4162 m[(i + reverse_bytes) - (j + 1)] = b;
4163 }
4164 }
4165 else
4166 /* User must pad the section up in order to do this. */
4167 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
4168 bfd_section_name (ibfd, isection), reverse_bytes);
4169 }
4170
4171 if (copy_byte >= 0)
4172 {
4173 /* Keep only every `copy_byte'th byte in MEMHUNK. */
4174 char *from = (char *) memhunk + copy_byte;
4175 char *to = (char *) memhunk;
4176 char *end = (char *) memhunk + size;
4177 int i;
4178
4179 /* If the section address is not exactly divisible by the interleave,
4180 then we must bias the from address. If the copy_byte is less than
4181 the bias, then we must skip forward one interleave, and increment
4182 the final lma. */
4183 int extra = isection->lma % interleave;
4184 from -= extra;
4185 if (copy_byte < extra)
4186 from += interleave;
4187
4188 for (; from < end; from += interleave)
4189 for (i = 0; i < copy_width; i++)
4190 {
4191 if (&from[i] >= end)
4192 break;
4193 *to++ = from[i];
4194 }
4195
4196 size = (size + interleave - 1 - copy_byte) / interleave * copy_width;
4197 osection->lma /= interleave;
4198 if (copy_byte < extra)
4199 osection->lma++;
4200 }
4201
4202 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
4203 {
4204 status = 1;
4205 bfd_nonfatal_message (NULL, obfd, osection, NULL);
4206 free (memhunk);
4207 return;
4208 }
4209 free (memhunk);
4210 }
4211 else if ((p = find_section_list (bfd_get_section_name (ibfd, isection),
4212 FALSE, SECTION_CONTEXT_SET_FLAGS)) != NULL
4213 && (p->flags & SEC_HAS_CONTENTS) != 0)
4214 {
4215 void *memhunk = xmalloc (size);
4216
4217 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
4218 flag--they can just remove the section entirely and add it
4219 back again. However, we do permit them to turn on the
4220 SEC_HAS_CONTENTS flag, and take it to mean that the section
4221 contents should be zeroed out. */
4222
4223 memset (memhunk, 0, size);
4224 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
4225 {
4226 status = 1;
4227 bfd_nonfatal_message (NULL, obfd, osection, NULL);
4228 free (memhunk);
4229 return;
4230 }
4231 free (memhunk);
4232 }
4233 }
4234
4235 /* Get all the sections. This is used when --gap-fill or --pad-to is
4236 used. */
4237
4238 static void
4239 get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
4240 {
4241 asection ***secppp = (asection ***) secppparg;
4242
4243 **secppp = osection;
4244 ++(*secppp);
4245 }
4246
4247 /* Sort sections by VMA. This is called via qsort, and is used when
4248 --gap-fill or --pad-to is used. We force non loadable or empty
4249 sections to the front, where they are easier to ignore. */
4250
4251 static int
4252 compare_section_lma (const void *arg1, const void *arg2)
4253 {
4254 const asection *const *sec1 = (const asection * const *) arg1;
4255 const asection *const *sec2 = (const asection * const *) arg2;
4256 flagword flags1, flags2;
4257
4258 /* Sort non loadable sections to the front. */
4259 flags1 = (*sec1)->flags;
4260 flags2 = (*sec2)->flags;
4261 if ((flags1 & SEC_HAS_CONTENTS) == 0
4262 || (flags1 & SEC_LOAD) == 0)
4263 {
4264 if ((flags2 & SEC_HAS_CONTENTS) != 0
4265 && (flags2 & SEC_LOAD) != 0)
4266 return -1;
4267 }
4268 else
4269 {
4270 if ((flags2 & SEC_HAS_CONTENTS) == 0
4271 || (flags2 & SEC_LOAD) == 0)
4272 return 1;
4273 }
4274
4275 /* Sort sections by LMA. */
4276 if ((*sec1)->lma > (*sec2)->lma)
4277 return 1;
4278 else if ((*sec1)->lma < (*sec2)->lma)
4279 return -1;
4280
4281 /* Sort sections with the same LMA by size. */
4282 if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
4283 return 1;
4284 else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
4285 return -1;
4286
4287 return 0;
4288 }
4289
4290 /* Mark all the symbols which will be used in output relocations with
4291 the BSF_KEEP flag so that those symbols will not be stripped.
4292
4293 Ignore relocations which will not appear in the output file. */
4294
4295 static void
4296 mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
4297 {
4298 asymbol **symbols = (asymbol **) symbolsarg;
4299 long relsize;
4300 arelent **relpp;
4301 long relcount, i;
4302
4303 /* Ignore an input section with no corresponding output section. */
4304 if (isection->output_section == NULL)
4305 return;
4306
4307 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
4308 if (relsize < 0)
4309 {
4310 /* Do not complain if the target does not support relocations. */
4311 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
4312 return;
4313 bfd_fatal (bfd_get_filename (ibfd));
4314 }
4315
4316 if (relsize == 0)
4317 return;
4318
4319 relpp = (arelent **) xmalloc (relsize);
4320 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
4321 if (relcount < 0)
4322 bfd_fatal (bfd_get_filename (ibfd));
4323
4324 /* Examine each symbol used in a relocation. If it's not one of the
4325 special bfd section symbols, then mark it with BSF_KEEP. */
4326 for (i = 0; i < relcount; i++)
4327 {
4328 /* See PRs 20923 and 20930 for reproducers for the NULL tests. */
4329 if (relpp[i]->sym_ptr_ptr != NULL
4330 && * relpp[i]->sym_ptr_ptr != NULL
4331 && *relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
4332 && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
4333 && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
4334 (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
4335 }
4336
4337 if (relpp != NULL)
4338 free (relpp);
4339 }
4340
4341 /* Write out debugging information. */
4342
4343 static bfd_boolean
4344 write_debugging_info (bfd *obfd, void *dhandle,
4345 long *symcountp ATTRIBUTE_UNUSED,
4346 asymbol ***symppp ATTRIBUTE_UNUSED)
4347 {
4348 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
4349 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
4350 {
4351 bfd_byte *syms, *strings = NULL;
4352 bfd_size_type symsize, stringsize;
4353 asection *stabsec, *stabstrsec;
4354 flagword flags;
4355
4356 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
4357 &symsize, &strings,
4358 &stringsize))
4359 return FALSE;
4360
4361 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
4362 stabsec = bfd_make_section_with_flags (obfd, ".stab", flags);
4363 stabstrsec = bfd_make_section_with_flags (obfd, ".stabstr", flags);
4364 if (stabsec == NULL
4365 || stabstrsec == NULL
4366 || ! bfd_set_section_size (obfd, stabsec, symsize)
4367 || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
4368 || ! bfd_set_section_alignment (obfd, stabsec, 2)
4369 || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
4370 {
4371 bfd_nonfatal_message (NULL, obfd, NULL,
4372 _("can't create debugging section"));
4373 free (strings);
4374 return FALSE;
4375 }
4376
4377 /* We can get away with setting the section contents now because
4378 the next thing the caller is going to do is copy over the
4379 real sections. We may someday have to split the contents
4380 setting out of this function. */
4381 if (! bfd_set_section_contents (obfd, stabsec, syms, 0, symsize)
4382 || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
4383 stringsize))
4384 {
4385 bfd_nonfatal_message (NULL, obfd, NULL,
4386 _("can't set debugging section contents"));
4387 free (strings);
4388 return FALSE;
4389 }
4390
4391 return TRUE;
4392 }
4393
4394 bfd_nonfatal_message (NULL, obfd, NULL,
4395 _("don't know how to write debugging information for %s"),
4396 bfd_get_target (obfd));
4397 return FALSE;
4398 }
4399
4400 /* If neither -D nor -U was specified explicitly,
4401 then use the configured default. */
4402 static void
4403 default_deterministic (void)
4404 {
4405 if (deterministic < 0)
4406 deterministic = DEFAULT_AR_DETERMINISTIC;
4407 }
4408
4409 static int
4410 strip_main (int argc, char *argv[])
4411 {
4412 char *input_target = NULL;
4413 char *output_target = NULL;
4414 bfd_boolean show_version = FALSE;
4415 bfd_boolean formats_info = FALSE;
4416 int c;
4417 int i;
4418 char *output_file = NULL;
4419 bfd_boolean merge_notes_set = FALSE;
4420
4421 while ((c = getopt_long (argc, argv, "I:O:F:K:MN:R:o:sSpdgxXHhVvwDU",
4422 strip_options, (int *) 0)) != EOF)
4423 {
4424 switch (c)
4425 {
4426 case 'I':
4427 input_target = optarg;
4428 break;
4429 case 'O':
4430 output_target = optarg;
4431 break;
4432 case 'F':
4433 input_target = output_target = optarg;
4434 break;
4435 case 'R':
4436 handle_remove_section_option (optarg);
4437 break;
4438 case OPTION_REMOVE_RELOCS:
4439 handle_remove_relocations_option (optarg);
4440 break;
4441 case 's':
4442 strip_symbols = STRIP_ALL;
4443 break;
4444 case 'S':
4445 case 'g':
4446 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
4447 strip_symbols = STRIP_DEBUG;
4448 break;
4449 case OPTION_STRIP_DWO:
4450 strip_symbols = STRIP_DWO;
4451 break;
4452 case OPTION_STRIP_UNNEEDED:
4453 strip_symbols = STRIP_UNNEEDED;
4454 break;
4455 case 'K':
4456 add_specific_symbol (optarg, keep_specific_htab);
4457 break;
4458 case 'M':
4459 merge_notes = TRUE;
4460 merge_notes_set = TRUE;
4461 break;
4462 case OPTION_NO_MERGE_NOTES:
4463 merge_notes = FALSE;
4464 merge_notes_set = TRUE;
4465 break;
4466 case 'N':
4467 add_specific_symbol (optarg, strip_specific_htab);
4468 break;
4469 case 'o':
4470 output_file = optarg;
4471 break;
4472 case 'p':
4473 preserve_dates = TRUE;
4474 break;
4475 case 'D':
4476 deterministic = TRUE;
4477 break;
4478 case 'U':
4479 deterministic = FALSE;
4480 break;
4481 case 'x':
4482 discard_locals = LOCALS_ALL;
4483 break;
4484 case 'X':
4485 discard_locals = LOCALS_START_L;
4486 break;
4487 case 'v':
4488 verbose = TRUE;
4489 break;
4490 case 'V':
4491 show_version = TRUE;
4492 break;
4493 case OPTION_FORMATS_INFO:
4494 formats_info = TRUE;
4495 break;
4496 case OPTION_ONLY_KEEP_DEBUG:
4497 strip_symbols = STRIP_NONDEBUG;
4498 break;
4499 case OPTION_KEEP_FILE_SYMBOLS:
4500 keep_file_symbols = 1;
4501 break;
4502 case 0:
4503 /* We've been given a long option. */
4504 break;
4505 case 'w':
4506 wildcard = TRUE;
4507 break;
4508 case 'H':
4509 case 'h':
4510 strip_usage (stdout, 0);
4511 default:
4512 strip_usage (stderr, 1);
4513 }
4514 }
4515
4516 /* If the user has not expressly chosen to merge/not-merge ELF notes
4517 then enable the merging unless we are stripping debug or dwo info. */
4518 if (! merge_notes_set
4519 && (strip_symbols == STRIP_UNDEF
4520 || strip_symbols == STRIP_ALL
4521 || strip_symbols == STRIP_UNNEEDED
4522 || strip_symbols == STRIP_NONDEBUG
4523 || strip_symbols == STRIP_NONDWO))
4524 merge_notes = TRUE;
4525
4526 if (formats_info)
4527 {
4528 display_info ();
4529 return 0;
4530 }
4531
4532 if (show_version)
4533 print_version ("strip");
4534
4535 default_deterministic ();
4536
4537 /* Default is to strip all symbols. */
4538 if (strip_symbols == STRIP_UNDEF
4539 && discard_locals == LOCALS_UNDEF
4540 && htab_elements (strip_specific_htab) == 0)
4541 strip_symbols = STRIP_ALL;
4542
4543 if (output_target == NULL)
4544 output_target = input_target;
4545
4546 i = optind;
4547 if (i == argc
4548 || (output_file != NULL && (i + 1) < argc))
4549 strip_usage (stderr, 1);
4550
4551 for (; i < argc; i++)
4552 {
4553 int hold_status = status;
4554 struct stat statbuf;
4555 char *tmpname;
4556
4557 if (get_file_size (argv[i]) < 1)
4558 {
4559 status = 1;
4560 continue;
4561 }
4562
4563 if (preserve_dates)
4564 /* No need to check the return value of stat().
4565 It has already been checked in get_file_size(). */
4566 stat (argv[i], &statbuf);
4567
4568 if (output_file == NULL
4569 || filename_cmp (argv[i], output_file) == 0)
4570 tmpname = make_tempname (argv[i]);
4571 else
4572 tmpname = output_file;
4573
4574 if (tmpname == NULL)
4575 {
4576 bfd_nonfatal_message (argv[i], NULL, NULL,
4577 _("could not create temporary file to hold stripped copy"));
4578 status = 1;
4579 continue;
4580 }
4581
4582 status = 0;
4583 copy_file (argv[i], tmpname, input_target, output_target, NULL);
4584 if (status == 0)
4585 {
4586 if (preserve_dates)
4587 set_times (tmpname, &statbuf);
4588 if (output_file != tmpname)
4589 status = (smart_rename (tmpname,
4590 output_file ? output_file : argv[i],
4591 preserve_dates) != 0);
4592 if (status == 0)
4593 status = hold_status;
4594 }
4595 else
4596 unlink_if_ordinary (tmpname);
4597 if (output_file != tmpname)
4598 free (tmpname);
4599 }
4600
4601 return status;
4602 }
4603
4604 /* Set up PE subsystem. */
4605
4606 static void
4607 set_pe_subsystem (const char *s)
4608 {
4609 const char *version, *subsystem;
4610 size_t i;
4611 static const struct
4612 {
4613 const char *name;
4614 const char set_def;
4615 const short value;
4616 }
4617 v[] =
4618 {
4619 { "native", 0, IMAGE_SUBSYSTEM_NATIVE },
4620 { "windows", 0, IMAGE_SUBSYSTEM_WINDOWS_GUI },
4621 { "console", 0, IMAGE_SUBSYSTEM_WINDOWS_CUI },
4622 { "posix", 0, IMAGE_SUBSYSTEM_POSIX_CUI },
4623 { "wince", 0, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI },
4624 { "efi-app", 1, IMAGE_SUBSYSTEM_EFI_APPLICATION },
4625 { "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER },
4626 { "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER },
4627 { "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER },
4628 { "xbox", 0, IMAGE_SUBSYSTEM_XBOX }
4629 };
4630 short value;
4631 char *copy;
4632 int set_def = -1;
4633
4634 /* Check for the presence of a version number. */
4635 version = strchr (s, ':');
4636 if (version == NULL)
4637 subsystem = s;
4638 else
4639 {
4640 int len = version - s;
4641 copy = xstrdup (s);
4642 subsystem = copy;
4643 copy[len] = '\0';
4644 version = copy + 1 + len;
4645 pe_major_subsystem_version = strtoul (version, &copy, 0);
4646 if (*copy == '.')
4647 pe_minor_subsystem_version = strtoul (copy + 1, &copy, 0);
4648 if (*copy != '\0')
4649 non_fatal (_("%s: bad version in PE subsystem"), s);
4650 }
4651
4652 /* Check for numeric subsystem. */
4653 value = (short) strtol (subsystem, &copy, 0);
4654 if (*copy == '\0')
4655 {
4656 for (i = 0; i < ARRAY_SIZE (v); i++)
4657 if (v[i].value == value)
4658 {
4659 pe_subsystem = value;
4660 set_def = v[i].set_def;
4661 break;
4662 }
4663 }
4664 else
4665 {
4666 /* Search for subsystem by name. */
4667 for (i = 0; i < ARRAY_SIZE (v); i++)
4668 if (strcmp (subsystem, v[i].name) == 0)
4669 {
4670 pe_subsystem = v[i].value;
4671 set_def = v[i].set_def;
4672 break;
4673 }
4674 }
4675
4676 switch (set_def)
4677 {
4678 case -1:
4679 fatal (_("unknown PE subsystem: %s"), s);
4680 break;
4681 case 0:
4682 break;
4683 default:
4684 if (pe_file_alignment == (bfd_vma) -1)
4685 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
4686 if (pe_section_alignment == (bfd_vma) -1)
4687 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
4688 break;
4689 }
4690 if (s != subsystem)
4691 free ((char *) subsystem);
4692 }
4693
4694 /* Convert EFI target to PEI target. */
4695
4696 static void
4697 convert_efi_target (char *efi)
4698 {
4699 efi[0] = 'p';
4700 efi[1] = 'e';
4701 efi[2] = 'i';
4702
4703 if (strcmp (efi + 4, "ia32") == 0)
4704 {
4705 /* Change ia32 to i386. */
4706 efi[5]= '3';
4707 efi[6]= '8';
4708 efi[7]= '6';
4709 }
4710 else if (strcmp (efi + 4, "x86_64") == 0)
4711 {
4712 /* Change x86_64 to x86-64. */
4713 efi[7] = '-';
4714 }
4715 }
4716
4717 /* Allocate and return a pointer to a struct section_add, initializing the
4718 structure using ARG, a string in the format "sectionname=filename".
4719 The returned structure will have its next pointer set to NEXT. The
4720 OPTION field is the name of the command line option currently being
4721 parsed, and is only used if an error needs to be reported. */
4722
4723 static struct section_add *
4724 init_section_add (const char *arg,
4725 struct section_add *next,
4726 const char *option)
4727 {
4728 struct section_add *pa;
4729 const char *s;
4730
4731 s = strchr (arg, '=');
4732 if (s == NULL)
4733 fatal (_("bad format for %s"), option);
4734
4735 pa = (struct section_add *) xmalloc (sizeof (struct section_add));
4736 pa->name = xstrndup (arg, s - arg);
4737 pa->filename = s + 1;
4738 pa->next = next;
4739 pa->contents = NULL;
4740 pa->size = 0;
4741
4742 return pa;
4743 }
4744
4745 /* Load the file specified in PA, allocating memory to hold the file
4746 contents, and store a pointer to the allocated memory in the contents
4747 field of PA. The size field of PA is also updated. All errors call
4748 FATAL. */
4749
4750 static void
4751 section_add_load_file (struct section_add *pa)
4752 {
4753 size_t off, alloc;
4754 FILE *f;
4755
4756 /* We don't use get_file_size so that we can do
4757 --add-section .note.GNU_stack=/dev/null
4758 get_file_size doesn't work on /dev/null. */
4759
4760 f = fopen (pa->filename, FOPEN_RB);
4761 if (f == NULL)
4762 fatal (_("cannot open: %s: %s"),
4763 pa->filename, strerror (errno));
4764
4765 off = 0;
4766 alloc = 4096;
4767 pa->contents = (bfd_byte *) xmalloc (alloc);
4768 while (!feof (f))
4769 {
4770 off_t got;
4771
4772 if (off == alloc)
4773 {
4774 alloc <<= 1;
4775 pa->contents = (bfd_byte *) xrealloc (pa->contents, alloc);
4776 }
4777
4778 got = fread (pa->contents + off, 1, alloc - off, f);
4779 if (ferror (f))
4780 fatal (_("%s: fread failed"), pa->filename);
4781
4782 off += got;
4783 }
4784
4785 pa->size = off;
4786
4787 fclose (f);
4788 }
4789
4790 static int
4791 copy_main (int argc, char *argv[])
4792 {
4793 char *input_filename = NULL;
4794 char *output_filename = NULL;
4795 char *tmpname;
4796 char *input_target = NULL;
4797 char *output_target = NULL;
4798 bfd_boolean show_version = FALSE;
4799 bfd_boolean change_warn = TRUE;
4800 bfd_boolean formats_info = FALSE;
4801 bfd_boolean use_globalize = FALSE;
4802 bfd_boolean use_keep_global = FALSE;
4803 int c;
4804 struct stat statbuf;
4805 const bfd_arch_info_type *input_arch = NULL;
4806
4807 while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:MN:s:O:d:F:L:G:R:SpgxXHhVvW:wDU",
4808 copy_options, (int *) 0)) != EOF)
4809 {
4810 switch (c)
4811 {
4812 case 'b':
4813 copy_byte = atoi (optarg);
4814 if (copy_byte < 0)
4815 fatal (_("byte number must be non-negative"));
4816 break;
4817
4818 case 'B':
4819 input_arch = bfd_scan_arch (optarg);
4820 if (input_arch == NULL)
4821 fatal (_("architecture %s unknown"), optarg);
4822 break;
4823
4824 case 'i':
4825 if (optarg)
4826 {
4827 interleave = atoi (optarg);
4828 if (interleave < 1)
4829 fatal (_("interleave must be positive"));
4830 }
4831 else
4832 interleave = 4;
4833 break;
4834
4835 case OPTION_INTERLEAVE_WIDTH:
4836 copy_width = atoi (optarg);
4837 if (copy_width < 1)
4838 fatal(_("interleave width must be positive"));
4839 break;
4840
4841 case 'I':
4842 case 's': /* "source" - 'I' is preferred */
4843 input_target = optarg;
4844 break;
4845
4846 case 'O':
4847 case 'd': /* "destination" - 'O' is preferred */
4848 output_target = optarg;
4849 break;
4850
4851 case 'F':
4852 input_target = output_target = optarg;
4853 break;
4854
4855 case 'j':
4856 find_section_list (optarg, TRUE, SECTION_CONTEXT_COPY);
4857 sections_copied = TRUE;
4858 break;
4859
4860 case 'R':
4861 handle_remove_section_option (optarg);
4862 break;
4863
4864 case OPTION_REMOVE_RELOCS:
4865 handle_remove_relocations_option (optarg);
4866 break;
4867
4868 case 'S':
4869 strip_symbols = STRIP_ALL;
4870 break;
4871
4872 case 'g':
4873 strip_symbols = STRIP_DEBUG;
4874 break;
4875
4876 case OPTION_STRIP_DWO:
4877 strip_symbols = STRIP_DWO;
4878 break;
4879
4880 case OPTION_STRIP_UNNEEDED:
4881 strip_symbols = STRIP_UNNEEDED;
4882 break;
4883
4884 case OPTION_ONLY_KEEP_DEBUG:
4885 strip_symbols = STRIP_NONDEBUG;
4886 break;
4887
4888 case OPTION_KEEP_FILE_SYMBOLS:
4889 keep_file_symbols = 1;
4890 break;
4891
4892 case OPTION_ADD_GNU_DEBUGLINK:
4893 long_section_names = ENABLE ;
4894 gnu_debuglink_filename = optarg;
4895 break;
4896
4897 case 'K':
4898 add_specific_symbol (optarg, keep_specific_htab);
4899 break;
4900
4901 case 'M':
4902 merge_notes = TRUE;
4903 break;
4904 case OPTION_NO_MERGE_NOTES:
4905 merge_notes = FALSE;
4906 break;
4907
4908 case 'N':
4909 add_specific_symbol (optarg, strip_specific_htab);
4910 break;
4911
4912 case OPTION_STRIP_UNNEEDED_SYMBOL:
4913 add_specific_symbol (optarg, strip_unneeded_htab);
4914 break;
4915
4916 case 'L':
4917 add_specific_symbol (optarg, localize_specific_htab);
4918 break;
4919
4920 case OPTION_GLOBALIZE_SYMBOL:
4921 use_globalize = TRUE;
4922 add_specific_symbol (optarg, globalize_specific_htab);
4923 break;
4924
4925 case 'G':
4926 use_keep_global = TRUE;
4927 add_specific_symbol (optarg, keepglobal_specific_htab);
4928 break;
4929
4930 case 'W':
4931 add_specific_symbol (optarg, weaken_specific_htab);
4932 break;
4933
4934 case 'p':
4935 preserve_dates = TRUE;
4936 break;
4937
4938 case 'D':
4939 deterministic = TRUE;
4940 break;
4941
4942 case 'U':
4943 deterministic = FALSE;
4944 break;
4945
4946 case 'w':
4947 wildcard = TRUE;
4948 break;
4949
4950 case 'x':
4951 discard_locals = LOCALS_ALL;
4952 break;
4953
4954 case 'X':
4955 discard_locals = LOCALS_START_L;
4956 break;
4957
4958 case 'v':
4959 verbose = TRUE;
4960 break;
4961
4962 case 'V':
4963 show_version = TRUE;
4964 break;
4965
4966 case OPTION_FORMATS_INFO:
4967 formats_info = TRUE;
4968 break;
4969
4970 case OPTION_WEAKEN:
4971 weaken = TRUE;
4972 break;
4973
4974 case OPTION_ADD_SECTION:
4975 add_sections = init_section_add (optarg, add_sections,
4976 "--add-section");
4977 section_add_load_file (add_sections);
4978 break;
4979
4980 case OPTION_UPDATE_SECTION:
4981 update_sections = init_section_add (optarg, update_sections,
4982 "--update-section");
4983 section_add_load_file (update_sections);
4984 break;
4985
4986 case OPTION_DUMP_SECTION:
4987 dump_sections = init_section_add (optarg, dump_sections,
4988 "--dump-section");
4989 break;
4990
4991 case OPTION_ADD_SYMBOL:
4992 {
4993 char *s, *t;
4994 struct addsym_node *newsym = xmalloc (sizeof *newsym);
4995
4996 newsym->next = NULL;
4997 s = strchr (optarg, '=');
4998 if (s == NULL)
4999 fatal (_("bad format for %s"), "--add-symbol");
5000 t = strchr (s + 1, ':');
5001
5002 newsym->symdef = xstrndup (optarg, s - optarg);
5003 if (t)
5004 {
5005 newsym->section = xstrndup (s + 1, t - (s + 1));
5006 newsym->symval = strtol (t + 1, NULL, 0);
5007 }
5008 else
5009 {
5010 newsym->section = NULL;
5011 newsym->symval = strtol (s + 1, NULL, 0);
5012 t = s;
5013 }
5014
5015 t = strchr (t + 1, ',');
5016 newsym->othersym = NULL;
5017 if (t)
5018 newsym->flags = parse_symflags (t+1, &newsym->othersym);
5019 else
5020 newsym->flags = BSF_GLOBAL;
5021
5022 /* Keep 'othersym' symbols at the front of the list. */
5023 if (newsym->othersym)
5024 {
5025 newsym->next = add_sym_list;
5026 if (!add_sym_list)
5027 add_sym_tail = &newsym->next;
5028 add_sym_list = newsym;
5029 }
5030 else
5031 {
5032 *add_sym_tail = newsym;
5033 add_sym_tail = &newsym->next;
5034 }
5035 add_symbols++;
5036 }
5037 break;
5038
5039 case OPTION_CHANGE_START:
5040 change_start = parse_vma (optarg, "--change-start");
5041 break;
5042
5043 case OPTION_CHANGE_SECTION_ADDRESS:
5044 case OPTION_CHANGE_SECTION_LMA:
5045 case OPTION_CHANGE_SECTION_VMA:
5046 {
5047 struct section_list * p;
5048 unsigned int context = 0;
5049 const char *s;
5050 int len;
5051 char *name;
5052 char *option = NULL;
5053 bfd_vma val;
5054
5055 switch (c)
5056 {
5057 case OPTION_CHANGE_SECTION_ADDRESS:
5058 option = "--change-section-address";
5059 context = SECTION_CONTEXT_ALTER_LMA | SECTION_CONTEXT_ALTER_VMA;
5060 break;
5061 case OPTION_CHANGE_SECTION_LMA:
5062 option = "--change-section-lma";
5063 context = SECTION_CONTEXT_ALTER_LMA;
5064 break;
5065 case OPTION_CHANGE_SECTION_VMA:
5066 option = "--change-section-vma";
5067 context = SECTION_CONTEXT_ALTER_VMA;
5068 break;
5069 }
5070
5071 s = strchr (optarg, '=');
5072 if (s == NULL)
5073 {
5074 s = strchr (optarg, '+');
5075 if (s == NULL)
5076 {
5077 s = strchr (optarg, '-');
5078 if (s == NULL)
5079 fatal (_("bad format for %s"), option);
5080 }
5081 }
5082 else
5083 {
5084 /* Correct the context. */
5085 switch (c)
5086 {
5087 case OPTION_CHANGE_SECTION_ADDRESS:
5088 context = SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_SET_VMA;
5089 break;
5090 case OPTION_CHANGE_SECTION_LMA:
5091 context = SECTION_CONTEXT_SET_LMA;
5092 break;
5093 case OPTION_CHANGE_SECTION_VMA:
5094 context = SECTION_CONTEXT_SET_VMA;
5095 break;
5096 }
5097 }
5098
5099 len = s - optarg;
5100 name = (char *) xmalloc (len + 1);
5101 strncpy (name, optarg, len);
5102 name[len] = '\0';
5103
5104 p = find_section_list (name, TRUE, context);
5105
5106 val = parse_vma (s + 1, option);
5107 if (*s == '-')
5108 val = - val;
5109
5110 switch (c)
5111 {
5112 case OPTION_CHANGE_SECTION_ADDRESS:
5113 p->vma_val = val;
5114 /* Fall through. */
5115
5116 case OPTION_CHANGE_SECTION_LMA:
5117 p->lma_val = val;
5118 break;
5119
5120 case OPTION_CHANGE_SECTION_VMA:
5121 p->vma_val = val;
5122 break;
5123 }
5124 }
5125 break;
5126
5127 case OPTION_CHANGE_ADDRESSES:
5128 change_section_address = parse_vma (optarg, "--change-addresses");
5129 change_start = change_section_address;
5130 break;
5131
5132 case OPTION_CHANGE_WARNINGS:
5133 change_warn = TRUE;
5134 break;
5135
5136 case OPTION_CHANGE_LEADING_CHAR:
5137 change_leading_char = TRUE;
5138 break;
5139
5140 case OPTION_COMPRESS_DEBUG_SECTIONS:
5141 if (optarg)
5142 {
5143 if (strcasecmp (optarg, "none") == 0)
5144 do_debug_sections = decompress;
5145 else if (strcasecmp (optarg, "zlib") == 0)
5146 do_debug_sections = compress_zlib;
5147 else if (strcasecmp (optarg, "zlib-gnu") == 0)
5148 do_debug_sections = compress_gnu_zlib;
5149 else if (strcasecmp (optarg, "zlib-gabi") == 0)
5150 do_debug_sections = compress_gabi_zlib;
5151 else
5152 fatal (_("unrecognized --compress-debug-sections type `%s'"),
5153 optarg);
5154 }
5155 else
5156 do_debug_sections = compress;
5157 break;
5158
5159 case OPTION_DEBUGGING:
5160 convert_debugging = TRUE;
5161 break;
5162
5163 case OPTION_DECOMPRESS_DEBUG_SECTIONS:
5164 do_debug_sections = decompress;
5165 break;
5166
5167 case OPTION_ELF_STT_COMMON:
5168 if (strcasecmp (optarg, "yes") == 0)
5169 do_elf_stt_common = elf_stt_common;
5170 else if (strcasecmp (optarg, "no") == 0)
5171 do_elf_stt_common = no_elf_stt_common;
5172 else
5173 fatal (_("unrecognized --elf-stt-common= option `%s'"),
5174 optarg);
5175 break;
5176
5177 case OPTION_GAP_FILL:
5178 {
5179 bfd_vma gap_fill_vma;
5180
5181 gap_fill_vma = parse_vma (optarg, "--gap-fill");
5182 gap_fill = (bfd_byte) gap_fill_vma;
5183 if ((bfd_vma) gap_fill != gap_fill_vma)
5184 {
5185 char buff[20];
5186
5187 sprintf_vma (buff, gap_fill_vma);
5188
5189 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
5190 buff, gap_fill);
5191 }
5192 gap_fill_set = TRUE;
5193 }
5194 break;
5195
5196 case OPTION_NO_CHANGE_WARNINGS:
5197 change_warn = FALSE;
5198 break;
5199
5200 case OPTION_PAD_TO:
5201 pad_to = parse_vma (optarg, "--pad-to");
5202 pad_to_set = TRUE;
5203 break;
5204
5205 case OPTION_REMOVE_LEADING_CHAR:
5206 remove_leading_char = TRUE;
5207 break;
5208
5209 case OPTION_REDEFINE_SYM:
5210 {
5211 /* Insert this redefinition onto redefine_specific_htab. */
5212
5213 int len;
5214 const char *s;
5215 const char *nextarg;
5216 char *source, *target;
5217
5218 s = strchr (optarg, '=');
5219 if (s == NULL)
5220 fatal (_("bad format for %s"), "--redefine-sym");
5221
5222 len = s - optarg;
5223 source = (char *) xmalloc (len + 1);
5224 strncpy (source, optarg, len);
5225 source[len] = '\0';
5226
5227 nextarg = s + 1;
5228 len = strlen (nextarg);
5229 target = (char *) xmalloc (len + 1);
5230 strcpy (target, nextarg);
5231
5232 add_redefine_and_check ("--redefine-sym", source, target);
5233
5234 free (source);
5235 free (target);
5236 }
5237 break;
5238
5239 case OPTION_REDEFINE_SYMS:
5240 add_redefine_syms_file (optarg);
5241 break;
5242
5243 case OPTION_SET_SECTION_FLAGS:
5244 {
5245 struct section_list *p;
5246 const char *s;
5247 int len;
5248 char *name;
5249
5250 s = strchr (optarg, '=');
5251 if (s == NULL)
5252 fatal (_("bad format for %s"), "--set-section-flags");
5253
5254 len = s - optarg;
5255 name = (char *) xmalloc (len + 1);
5256 strncpy (name, optarg, len);
5257 name[len] = '\0';
5258
5259 p = find_section_list (name, TRUE, SECTION_CONTEXT_SET_FLAGS);
5260
5261 p->flags = parse_flags (s + 1);
5262 }
5263 break;
5264
5265 case OPTION_RENAME_SECTION:
5266 {
5267 flagword flags;
5268 const char *eq, *fl;
5269 char *old_name;
5270 char *new_name;
5271 unsigned int len;
5272
5273 eq = strchr (optarg, '=');
5274 if (eq == NULL)
5275 fatal (_("bad format for %s"), "--rename-section");
5276
5277 len = eq - optarg;
5278 if (len == 0)
5279 fatal (_("bad format for %s"), "--rename-section");
5280
5281 old_name = (char *) xmalloc (len + 1);
5282 strncpy (old_name, optarg, len);
5283 old_name[len] = 0;
5284
5285 eq++;
5286 fl = strchr (eq, ',');
5287 if (fl)
5288 {
5289 flags = parse_flags (fl + 1);
5290 len = fl - eq;
5291 }
5292 else
5293 {
5294 flags = -1;
5295 len = strlen (eq);
5296 }
5297
5298 if (len == 0)
5299 fatal (_("bad format for %s"), "--rename-section");
5300
5301 new_name = (char *) xmalloc (len + 1);
5302 strncpy (new_name, eq, len);
5303 new_name[len] = 0;
5304
5305 add_section_rename (old_name, new_name, flags);
5306 }
5307 break;
5308
5309 case OPTION_SET_START:
5310 set_start = parse_vma (optarg, "--set-start");
5311 set_start_set = TRUE;
5312 break;
5313
5314 case OPTION_SREC_LEN:
5315 _bfd_srec_len = parse_vma (optarg, "--srec-len");
5316 break;
5317
5318 case OPTION_SREC_FORCES3:
5319 _bfd_srec_forceS3 = TRUE;
5320 break;
5321
5322 case OPTION_STRIP_SYMBOLS:
5323 add_specific_symbols (optarg, strip_specific_htab,
5324 &strip_specific_buffer);
5325 break;
5326
5327 case OPTION_STRIP_UNNEEDED_SYMBOLS:
5328 add_specific_symbols (optarg, strip_unneeded_htab,
5329 &strip_unneeded_buffer);
5330 break;
5331
5332 case OPTION_KEEP_SYMBOLS:
5333 add_specific_symbols (optarg, keep_specific_htab,
5334 &keep_specific_buffer);
5335 break;
5336
5337 case OPTION_LOCALIZE_HIDDEN:
5338 localize_hidden = TRUE;
5339 break;
5340
5341 case OPTION_LOCALIZE_SYMBOLS:
5342 add_specific_symbols (optarg, localize_specific_htab,
5343 &localize_specific_buffer);
5344 break;
5345
5346 case OPTION_LONG_SECTION_NAMES:
5347 if (!strcmp ("enable", optarg))
5348 long_section_names = ENABLE;
5349 else if (!strcmp ("disable", optarg))
5350 long_section_names = DISABLE;
5351 else if (!strcmp ("keep", optarg))
5352 long_section_names = KEEP;
5353 else
5354 fatal (_("unknown long section names option '%s'"), optarg);
5355 break;
5356
5357 case OPTION_GLOBALIZE_SYMBOLS:
5358 use_globalize = TRUE;
5359 add_specific_symbols (optarg, globalize_specific_htab,
5360 &globalize_specific_buffer);
5361 break;
5362
5363 case OPTION_KEEPGLOBAL_SYMBOLS:
5364 use_keep_global = TRUE;
5365 add_specific_symbols (optarg, keepglobal_specific_htab,
5366 &keepglobal_specific_buffer);
5367 break;
5368
5369 case OPTION_WEAKEN_SYMBOLS:
5370 add_specific_symbols (optarg, weaken_specific_htab,
5371 &weaken_specific_buffer);
5372 break;
5373
5374 case OPTION_ALT_MACH_CODE:
5375 use_alt_mach_code = strtoul (optarg, NULL, 0);
5376 if (use_alt_mach_code == 0)
5377 fatal (_("unable to parse alternative machine code"));
5378 break;
5379
5380 case OPTION_PREFIX_SYMBOLS:
5381 prefix_symbols_string = optarg;
5382 break;
5383
5384 case OPTION_PREFIX_SECTIONS:
5385 prefix_sections_string = optarg;
5386 break;
5387
5388 case OPTION_PREFIX_ALLOC_SECTIONS:
5389 prefix_alloc_sections_string = optarg;
5390 break;
5391
5392 case OPTION_READONLY_TEXT:
5393 bfd_flags_to_set |= WP_TEXT;
5394 bfd_flags_to_clear &= ~WP_TEXT;
5395 break;
5396
5397 case OPTION_WRITABLE_TEXT:
5398 bfd_flags_to_clear |= WP_TEXT;
5399 bfd_flags_to_set &= ~WP_TEXT;
5400 break;
5401
5402 case OPTION_PURE:
5403 bfd_flags_to_set |= D_PAGED;
5404 bfd_flags_to_clear &= ~D_PAGED;
5405 break;
5406
5407 case OPTION_IMPURE:
5408 bfd_flags_to_clear |= D_PAGED;
5409 bfd_flags_to_set &= ~D_PAGED;
5410 break;
5411
5412 case OPTION_EXTRACT_DWO:
5413 strip_symbols = STRIP_NONDWO;
5414 break;
5415
5416 case OPTION_EXTRACT_SYMBOL:
5417 extract_symbol = TRUE;
5418 break;
5419
5420 case OPTION_REVERSE_BYTES:
5421 {
5422 int prev = reverse_bytes;
5423
5424 reverse_bytes = atoi (optarg);
5425 if ((reverse_bytes <= 0) || ((reverse_bytes % 2) != 0))
5426 fatal (_("number of bytes to reverse must be positive and even"));
5427
5428 if (prev && prev != reverse_bytes)
5429 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
5430 prev);
5431 break;
5432 }
5433
5434 case OPTION_FILE_ALIGNMENT:
5435 pe_file_alignment = parse_vma (optarg, "--file-alignment");
5436 break;
5437
5438 case OPTION_HEAP:
5439 {
5440 char *end;
5441 pe_heap_reserve = strtoul (optarg, &end, 0);
5442 if (end == optarg
5443 || (*end != '.' && *end != '\0'))
5444 non_fatal (_("%s: invalid reserve value for --heap"),
5445 optarg);
5446 else if (*end != '\0')
5447 {
5448 pe_heap_commit = strtoul (end + 1, &end, 0);
5449 if (*end != '\0')
5450 non_fatal (_("%s: invalid commit value for --heap"),
5451 optarg);
5452 }
5453 }
5454 break;
5455
5456 case OPTION_IMAGE_BASE:
5457 pe_image_base = parse_vma (optarg, "--image-base");
5458 break;
5459
5460 case OPTION_SECTION_ALIGNMENT:
5461 pe_section_alignment = parse_vma (optarg,
5462 "--section-alignment");
5463 break;
5464
5465 case OPTION_SUBSYSTEM:
5466 set_pe_subsystem (optarg);
5467 break;
5468
5469 case OPTION_STACK:
5470 {
5471 char *end;
5472 pe_stack_reserve = strtoul (optarg, &end, 0);
5473 if (end == optarg
5474 || (*end != '.' && *end != '\0'))
5475 non_fatal (_("%s: invalid reserve value for --stack"),
5476 optarg);
5477 else if (*end != '\0')
5478 {
5479 pe_stack_commit = strtoul (end + 1, &end, 0);
5480 if (*end != '\0')
5481 non_fatal (_("%s: invalid commit value for --stack"),
5482 optarg);
5483 }
5484 }
5485 break;
5486
5487 case OPTION_VERILOG_DATA_WIDTH:
5488 VerilogDataWidth = parse_vma (optarg, "--verilog-data-width");
5489 if (VerilogDataWidth < 1)
5490 fatal (_("verilog data width must be at least 1 byte"));
5491 break;
5492
5493 case 0:
5494 /* We've been given a long option. */
5495 break;
5496
5497 case 'H':
5498 case 'h':
5499 copy_usage (stdout, 0);
5500
5501 default:
5502 copy_usage (stderr, 1);
5503 }
5504 }
5505
5506 if (use_globalize && use_keep_global)
5507 fatal(_("--globalize-symbol(s) is incompatible with -G/--keep-global-symbol(s)"));
5508
5509 if (formats_info)
5510 {
5511 display_info ();
5512 return 0;
5513 }
5514
5515 if (show_version)
5516 print_version ("objcopy");
5517
5518 if (interleave && copy_byte == -1)
5519 fatal (_("interleave start byte must be set with --byte"));
5520
5521 if (copy_byte >= interleave)
5522 fatal (_("byte number must be less than interleave"));
5523
5524 if (copy_width > interleave - copy_byte)
5525 fatal (_("interleave width must be less than or equal to interleave - byte`"));
5526
5527 if (optind == argc || optind + 2 < argc)
5528 copy_usage (stderr, 1);
5529
5530 input_filename = argv[optind];
5531 if (optind + 1 < argc)
5532 output_filename = argv[optind + 1];
5533
5534 default_deterministic ();
5535
5536 /* Default is to strip no symbols. */
5537 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
5538 strip_symbols = STRIP_NONE;
5539
5540 if (output_target == NULL)
5541 output_target = input_target;
5542
5543 /* Convert input EFI target to PEI target. */
5544 if (input_target != NULL
5545 && strncmp (input_target, "efi-", 4) == 0)
5546 {
5547 char *efi;
5548
5549 efi = xstrdup (output_target + 4);
5550 if (strncmp (efi, "bsdrv-", 6) == 0
5551 || strncmp (efi, "rtdrv-", 6) == 0)
5552 efi += 2;
5553 else if (strncmp (efi, "app-", 4) != 0)
5554 fatal (_("unknown input EFI target: %s"), input_target);
5555
5556 input_target = efi;
5557 convert_efi_target (efi);
5558 }
5559
5560 /* Convert output EFI target to PEI target. */
5561 if (output_target != NULL
5562 && strncmp (output_target, "efi-", 4) == 0)
5563 {
5564 char *efi;
5565
5566 efi = xstrdup (output_target + 4);
5567 if (strncmp (efi, "app-", 4) == 0)
5568 {
5569 if (pe_subsystem == -1)
5570 pe_subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
5571 }
5572 else if (strncmp (efi, "bsdrv-", 6) == 0)
5573 {
5574 if (pe_subsystem == -1)
5575 pe_subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;
5576 efi += 2;
5577 }
5578 else if (strncmp (efi, "rtdrv-", 6) == 0)
5579 {
5580 if (pe_subsystem == -1)
5581 pe_subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;
5582 efi += 2;
5583 }
5584 else
5585 fatal (_("unknown output EFI target: %s"), output_target);
5586
5587 if (pe_file_alignment == (bfd_vma) -1)
5588 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
5589 if (pe_section_alignment == (bfd_vma) -1)
5590 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
5591
5592 output_target = efi;
5593 convert_efi_target (efi);
5594 }
5595
5596 if (preserve_dates)
5597 if (stat (input_filename, & statbuf) < 0)
5598 fatal (_("warning: could not locate '%s'. System error message: %s"),
5599 input_filename, strerror (errno));
5600
5601 /* If there is no destination file, or the source and destination files
5602 are the same, then create a temp and rename the result into the input. */
5603 if (output_filename == NULL
5604 || filename_cmp (input_filename, output_filename) == 0)
5605 tmpname = make_tempname (input_filename);
5606 else
5607 tmpname = output_filename;
5608
5609 if (tmpname == NULL)
5610 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
5611 input_filename, strerror (errno));
5612
5613 copy_file (input_filename, tmpname, input_target, output_target, input_arch);
5614 if (status == 0)
5615 {
5616 if (preserve_dates)
5617 set_times (tmpname, &statbuf);
5618 if (tmpname != output_filename)
5619 status = (smart_rename (tmpname, input_filename,
5620 preserve_dates) != 0);
5621 }
5622 else
5623 unlink_if_ordinary (tmpname);
5624
5625 if (tmpname != output_filename)
5626 free (tmpname);
5627
5628 if (change_warn)
5629 {
5630 struct section_list *p;
5631
5632 for (p = change_sections; p != NULL; p = p->next)
5633 {
5634 if (! p->used)
5635 {
5636 if (p->context & (SECTION_CONTEXT_SET_VMA | SECTION_CONTEXT_ALTER_VMA))
5637 {
5638 char buff [20];
5639
5640 sprintf_vma (buff, p->vma_val);
5641
5642 /* xgettext:c-format */
5643 non_fatal (_("%s %s%c0x%s never used"),
5644 "--change-section-vma",
5645 p->pattern,
5646 p->context & SECTION_CONTEXT_SET_VMA ? '=' : '+',
5647 buff);
5648 }
5649
5650 if (p->context & (SECTION_CONTEXT_SET_LMA | SECTION_CONTEXT_ALTER_LMA))
5651 {
5652 char buff [20];
5653
5654 sprintf_vma (buff, p->lma_val);
5655
5656 /* xgettext:c-format */
5657 non_fatal (_("%s %s%c0x%s never used"),
5658 "--change-section-lma",
5659 p->pattern,
5660 p->context & SECTION_CONTEXT_SET_LMA ? '=' : '+',
5661 buff);
5662 }
5663 }
5664 }
5665 }
5666
5667 if (strip_specific_buffer)
5668 free (strip_specific_buffer);
5669
5670 if (strip_unneeded_buffer)
5671 free (strip_unneeded_buffer);
5672
5673 if (keep_specific_buffer)
5674 free (keep_specific_buffer);
5675
5676 if (localize_specific_buffer)
5677 free (globalize_specific_buffer);
5678
5679 if (globalize_specific_buffer)
5680 free (globalize_specific_buffer);
5681
5682 if (keepglobal_specific_buffer)
5683 free (keepglobal_specific_buffer);
5684
5685 if (weaken_specific_buffer)
5686 free (weaken_specific_buffer);
5687
5688 return 0;
5689 }
5690
5691 int
5692 main (int argc, char *argv[])
5693 {
5694 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
5695 setlocale (LC_MESSAGES, "");
5696 #endif
5697 #if defined (HAVE_SETLOCALE)
5698 setlocale (LC_CTYPE, "");
5699 #endif
5700 bindtextdomain (PACKAGE, LOCALEDIR);
5701 textdomain (PACKAGE);
5702
5703 program_name = argv[0];
5704 xmalloc_set_program_name (program_name);
5705
5706 START_PROGRESS (program_name, 0);
5707
5708 expandargv (&argc, &argv);
5709
5710 strip_symbols = STRIP_UNDEF;
5711 discard_locals = LOCALS_UNDEF;
5712
5713 if (bfd_init () != BFD_INIT_MAGIC)
5714 fatal (_("fatal error: libbfd ABI mismatch"));
5715 set_default_bfd_target ();
5716
5717 if (is_strip < 0)
5718 {
5719 int i = strlen (program_name);
5720 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5721 /* Drop the .exe suffix, if any. */
5722 if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
5723 {
5724 i -= 4;
5725 program_name[i] = '\0';
5726 }
5727 #endif
5728 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
5729 }
5730
5731 create_symbol_htabs ();
5732
5733 if (argv != NULL)
5734 bfd_set_error_program_name (argv[0]);
5735
5736 if (is_strip)
5737 strip_main (argc, argv);
5738 else
5739 copy_main (argc, argv);
5740
5741 END_PROGRESS (program_name);
5742
5743 return status;
5744 }
This page took 0.185838 seconds and 4 git commands to generate.