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