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