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