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