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