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