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